blob: 2a0583f10ac2307fa6eb0cd5f110184e05b5742f [file] [log] [blame]
Yilin Yang8e1b24c2020-02-03 15:02:25 +08001#!/usr/bin/env python3
Hung-Te Lin34f3d382015-04-10 18:18:23 +08002# -*- coding: utf-8 -*-
Hung-Te Lin76c55b22015-03-31 14:47:14 +08003# Copyright 2015 The Chromium OS Authors. All rights reserved.
4# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
6
7"""Authoritative source for Chromium OS region/locale configuration.
8
9Run this module to display all known regions (use --help to see options).
10"""
11
12from __future__ import print_function
13
14import argparse
Clark Chung39230202020-05-26 13:24:33 +080015import collections.abc
Hung-Te Lin76c55b22015-03-31 14:47:14 +080016import json
17import re
18import sys
19
Bao-Duy Trane43d5de2020-05-29 18:02:36 +100020import yaml # pylint: disable=import-error
Hung-Te Lin76c55b22015-03-31 14:47:14 +080021
22
23# The regular expression to check values in Region.keyboards and Region.locales.
24# Keyboards should come with xkb: protocol, or the input methods (ime:, m17n:).
Hung-Te Lincf2f02b2017-03-20 14:58:20 +080025# Examples: xkb:us:intl:eng, ime:ime:zh-t:cangjie, xkb:us:altgr-intl:eng
26KEYBOARD_PATTERN = re.compile(r'^xkb:\w+:[\w-]*:\w+$|'
Hung-Te Lin76c55b22015-03-31 14:47:14 +080027 r'^(ime|m17n|t13n):[\w:-]+$')
28# Locale should be a combination of language and location.
29# Examples: en-US, ja.
30LOCALE_PATTERN = re.compile(r'^(\w+)(-[A-Z0-9]+)?$')
31
32
33class Enum(frozenset):
34 """An enumeration type.
35
Bao-Duy Trane43d5de2020-05-29 18:02:36 +100036 Examples:
Hung-Te Lin76c55b22015-03-31 14:47:14 +080037 To create a enum object:
38 dummy_enum = Enum(['A', 'B', 'C'])
39
40 To access a enum object, use:
41 dummy_enum.A
42 dummy_enum.B
43 """
44
45 def __getattr__(self, name):
46 if name in self:
47 return name
48 raise AttributeError
49
50
51class RegionException(Exception):
52 """Exception in Region handling."""
Hung-Te Lin76c55b22015-03-31 14:47:14 +080053
54
55def MakeList(value):
56 """Converts the given value to a list.
57
58 Returns:
59 A list of elements from "value" if it is iterable (except string);
60 otherwise, a list contains only one element.
61 """
Clark Chung39230202020-05-26 13:24:33 +080062 if (isinstance(value, collections.abc.Iterable) and
Yilin Yang74cf2102020-02-03 15:04:19 +080063 not isinstance(value, str)):
Hung-Te Lin76c55b22015-03-31 14:47:14 +080064 return list(value)
65 return [value]
66
67
68class Region(object):
69 """Comprehensive, standard locale configuration per country/region.
70
71 See :ref:`regions-values` for detailed information on how to set these values.
72 """
73 # pylint gets confused by some of the docstrings.
Hung-Te Lin76c55b22015-03-31 14:47:14 +080074
75 # ANSI = US-like
76 # ISO = UK-like
77 # JIS = Japanese
Hung-Te Lin4eb4f922016-03-04 11:51:04 +080078 # KS = Korean (see http://crosbug.com/p/50753 for why this is not used yet)
Hung-Te Lin76c55b22015-03-31 14:47:14 +080079 # ABNT2 = Brazilian (like ISO but with an extra key to the left of the
80 # right shift key)
81 KeyboardMechanicalLayout = Enum(['ANSI', 'ISO', 'JIS', 'KS', 'ABNT2'])
82
83 region_code = None
84 """A unique identifier for the region. This may be a lower-case
85 `ISO 3166-1 alpha-2 code
86 <http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2>`_ (e.g., ``us``),
87 a variant within an alpha-2 entity (e.g., ``ca.fr``), or an
88 identifier for a collection of countries or entities (e.g.,
89 ``latam-es-419`` or ``nordic``). See :ref:`region-codes`.
90
91 Note that ``uk`` is not a valid identifier; ``gb`` is used as it is
92 the real alpha-2 code for the UK."""
93
94 keyboards = None
95 """A list of keyboard layout identifiers (e.g., ``xkb:us:intl:eng``
96 or ``m17n:ar``). This field was designed to be the physical keyboard layout
97 in the beginning, and then becomes a list of OOBE keyboard selection, which
98 then includes non-physical layout elements like input methods (``ime:``).
99 To avoid confusion, physical layout is now defined by
100 :py:attr:`keyboard_mechanical_layout`, and this is reserved for logical
101 layouts.
102
103 This is identical to the legacy VPD ``keyboard_layout`` value."""
104
105 time_zones = None
106 """A list of default `tz database time zone
107 <http://en.wikipedia.org/wiki/List_of_tz_database_time_zones>`_
108 identifiers (e.g., ``America/Los_Angeles``). See
109 `timezone_settings.cc <http://goo.gl/WSVUeE>`_ for supported time
110 zones.
111
112 This is identical to the legacy VPD ``initial_timezone`` value."""
113
114 locales = None
115 """A list of default locale codes (e.g., ``en-US``); see
116 `l10n_util.cc <http://goo.gl/kVkht>`_ for supported locales.
117
118 This is identital to the legacy VPD ``initial_locale`` field."""
119
120 keyboard_mechanical_layout = None
121 """The keyboard's mechanical layout (``ANSI`` [US-like], ``ISO``
122 [UK-like], ``JIS`` [Japanese], ``ABNT2`` [Brazilian] or ``KS`` [Korean])."""
123
124 description = None
125 """A human-readable description of the region.
126 This defaults to :py:attr:`region_code` if not set."""
127
128 notes = None
129 """Implementation notes about the region. This may be None."""
130
Hung-Te Lin436b6cc2015-04-03 12:15:47 +0800131 regulatory_domain = None
132 """An ISO 3166-1 alpha 2 upper-cased two-letter region code for setting
133 Wireless regulatory. See crosbug.com/p/38745 for more details.
134
135 When omitted, this will derive from region_code."""
136
Hung-Te Lin1a14cc42015-04-14 01:23:34 +0800137 confirmed = None
138 """An optional boolean flag to indicate if the region data is confirmed."""
139
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800140 FIELDS = ['region_code', 'description', 'keyboards',
Hung-Te Lin1a14cc42015-04-14 01:23:34 +0800141 'time_zones', 'locales', 'keyboard_mechanical_layout',
142 'regulatory_domain']
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800143 """Names of fields that define the region."""
144
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800145 def __init__(self, region_code, keyboards, time_zones, locales,
146 keyboard_mechanical_layout, description=None, notes=None,
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800147 regdomain=None):
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800148 """Constructor.
149
150 Args:
151 region_code: See :py:attr:`region_code`.
152 keyboards: See :py:attr:`keyboards`. A single string is accepted for
153 backward compatibility.
154 time_zones: See :py:attr:`time_zones`.
155 locales: See :py:attr:`locales`. A single string is accepted
156 for backward compatibility.
157 keyboard_mechanical_layout: See :py:attr:`keyboard_mechanical_layout`.
158 description: See :py:attr:`description`.
159 notes: See :py:attr:`notes`.
Hung-Te Lin436b6cc2015-04-03 12:15:47 +0800160 regdomain: See :py:attr:`regulatory_domain`.
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800161 """
Hung-Te Lin436b6cc2015-04-03 12:15:47 +0800162
163 def regdomain_from_region(region):
164 if region.find('.') >= 0:
165 region = region[:region.index('.')]
166 if len(region) == 2:
167 return region.upper()
168 return None
169
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800170 # Quick check: should be 'gb', not 'uk'
171 if region_code == 'uk':
172 raise RegionException("'uk' is not a valid region code (use 'gb')")
173
174 self.region_code = region_code
175 self.keyboards = MakeList(keyboards)
176 self.time_zones = MakeList(time_zones)
177 self.locales = MakeList(locales)
178 self.keyboard_mechanical_layout = keyboard_mechanical_layout
179 self.description = description or region_code
180 self.notes = notes
Hung-Te Lin436b6cc2015-04-03 12:15:47 +0800181 self.regulatory_domain = (regdomain or regdomain_from_region(region_code))
Hung-Te Lin1a14cc42015-04-14 01:23:34 +0800182 self.confirmed = None
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800183
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800184 for f in (self.keyboards, self.locales):
185 assert all(isinstance(x, str) for x in f), (
186 'Expected a list of strings, not %r' % f)
187 for f in self.keyboards:
188 assert KEYBOARD_PATTERN.match(f), (
189 'Keyboard pattern %r does not match %r' % (
190 f, KEYBOARD_PATTERN.pattern))
191 for f in self.locales:
192 assert LOCALE_PATTERN.match(f), (
193 'Locale %r does not match %r' % (
194 f, LOCALE_PATTERN.pattern))
Hung-Te Lin436b6cc2015-04-03 12:15:47 +0800195 assert (self.regulatory_domain and
196 len(self.regulatory_domain) == 2 and
197 self.regulatory_domain.upper() == self.regulatory_domain), (
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800198 'Regulatory domain settings error for region %s' % region_code)
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800199
200 def __repr__(self):
201 return 'Region(%s)' % (', '.join([getattr(self, x) for x in self.FIELDS]))
202
203 def GetFieldsDict(self):
204 """Returns a dict of all substantive fields.
205
206 notes and description are excluded.
207 """
208 return dict((k, getattr(self, k)) for k in self.FIELDS)
209
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800210KML = Region.KeyboardMechanicalLayout
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800211REGIONS_LIST = [
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800212 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800213 'au', 'xkb:us::eng', 'Australia/Sydney', 'en-AU', KML.ANSI,
214 'Australia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800215 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800216 'be', 'xkb:be::nld', 'Europe/Brussels', 'en-GB', KML.ISO,
217 'Belgium', (
218 'Flemish (Belgian Dutch) keyboard; British English language for '
219 'neutrality')),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800220 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800221 'br', 'xkb:br::por', 'America/Sao_Paulo', 'pt-BR', KML.ABNT2,
222 'Brazil (ABNT2)', (
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800223 'ABNT2 = ABNT NBR 10346 variant 2. This is the preferred layout '
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800224 'for Brazil. ABNT2 is mostly an ISO layout, but it 12 keys between '
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800225 'the shift keys; see http://goo.gl/twA5tq')),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800226 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800227 'br.abnt', 'xkb:br::por', 'America/Sao_Paulo', 'pt-BR', KML.ISO,
228 'Brazil (ABNT)', (
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800229 'Like ABNT2, but lacking the extra key to the left of the right '
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800230 'shift key found in that layout. ABNT2 (the "br" region) is '
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800231 'preferred to this layout')),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800232 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800233 'br.usintl', 'xkb:us:intl:eng', 'America/Sao_Paulo', 'pt-BR', KML.ANSI,
234 'Brazil (US Intl)', (
235 'Brazil with US International keyboard layout. ABNT2 ("br") and '
236 'ABNT1 ("br.abnt1 ") are both preferred to this.')),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800237 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800238 'ca.ansi', 'xkb:us::eng', 'America/Toronto', 'en-CA', KML.ANSI,
239 'Canada (US keyboard)', (
240 'Canada with US (ANSI) keyboard. Only allowed if there are '
241 'separate US English, Canadian English, and French SKUs. '
242 'Not for en/fr hybrid ANSI keyboards; for that you would want '
243 'ca.hybridansi. See http://goto/cros-canada')),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800244 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800245 'ca.fr', 'xkb:ca::fra', 'America/Toronto', 'fr-CA', KML.ISO,
246 'Canada (French keyboard)', (
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800247 'Canadian French (ISO) keyboard. The most common configuration for '
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800248 'Canadian French SKUs. See http://goto/cros-canada')),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800249 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800250 'ca.hybrid', 'xkb:ca:eng:eng', 'America/Toronto', 'en-CA', KML.ISO,
251 'Canada (hybrid ISO)', (
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800252 'Canada with hybrid (ISO) xkb:ca:eng:eng + xkb:ca::fra keyboard, '
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800253 'defaulting to English language and keyboard. Used only if there '
254 'needs to be a single SKU for all of Canada. See '
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800255 'http://goto/cros-canada')),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800256 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800257 'ca.hybridansi', 'xkb:ca:eng:eng', 'America/Toronto', 'en-CA', KML.ANSI,
258 'Canada (hybrid ANSI)', (
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800259 'Canada with hybrid (ANSI) xkb:ca:eng:eng + xkb:ca::fra keyboard, '
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800260 'defaulting to English language and keyboard. Used only if there '
261 'needs to be a single SKU for all of Canada. See '
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800262 'http://goto/cros-canada')),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800263 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800264 'ca.multix', 'xkb:ca:multix:fra', 'America/Toronto', 'fr-CA', KML.ISO,
265 'Canada (multilingual)', (
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800266 "Canadian Multilingual keyboard; you probably don't want this. See "
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800267 'http://goto/cros-canada')),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800268 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800269 'ch', 'xkb:ch::ger', 'Europe/Zurich', 'de-CH', KML.ISO,
270 'Switzerland', (
271 'German keyboard')),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800272 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800273 'de', 'xkb:de::ger', 'Europe/Berlin', 'de', KML.ISO,
274 'Germany'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800275 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800276 'es', 'xkb:es::spa', 'Europe/Madrid', 'es', KML.ISO,
277 'Spain'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800278 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800279 'fi', 'xkb:fi::fin', 'Europe/Helsinki', 'fi', KML.ISO,
280 'Finland'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800281 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800282 'fr', 'xkb:fr::fra', 'Europe/Paris', 'fr', KML.ISO,
283 'France'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800284 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800285 'gb', 'xkb:gb:extd:eng', 'Europe/London', 'en-GB', KML.ISO,
286 'UK'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800287 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800288 'ie', 'xkb:gb:extd:eng', 'Europe/Dublin', 'en-GB', KML.ISO,
289 'Ireland'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800290 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800291 'in', 'xkb:us::eng', 'Asia/Calcutta', 'en-US', KML.ANSI,
292 'India'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800293 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800294 'it', 'xkb:it::ita', 'Europe/Rome', 'it', KML.ISO,
295 'Italy'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800296 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800297 'latam-es-419', 'xkb:es::spa', 'America/Mexico_City', 'es-419', KML.ISO,
298 'Hispanophone Latin America', (
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800299 'Spanish-speaking countries in Latin America, using the Iberian '
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800300 '(Spain) Spanish keyboard, which is increasingly dominant in '
301 'Latin America. Known to be correct for '
302 'Chile, Colombia, Mexico, Peru; '
303 'still unconfirmed for other es-419 countries. The old Latin '
304 'American layout (xkb:latam::spa) has not been approved; before '
305 'using that you must seek review through http://goto/vpdsettings. '
306 'See also http://goo.gl/Iffuqh. Note that 419 is the UN M.49 '
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800307 'region code for Latin America'), 'MX'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800308 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800309 'my', 'xkb:us::eng', 'Asia/Kuala_Lumpur', 'ms', KML.ANSI,
310 'Malaysia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800311 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800312 'nl', 'xkb:us:intl:eng', 'Europe/Amsterdam', 'nl', KML.ANSI,
313 'Netherlands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800314 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800315 'nordic', 'xkb:se::swe', 'Europe/Stockholm', 'en-US', KML.ISO,
316 'Nordics', (
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800317 'Unified SKU for Sweden, Norway, and Denmark. This defaults '
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800318 'to Swedish keyboard layout, but starts with US English language '
319 'for neutrality. Use if there is a single combined SKU for Nordic '
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800320 'countries.'), 'SE'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800321 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800322 'nz', 'xkb:us::eng', 'Pacific/Auckland', 'en-NZ', KML.ANSI,
323 'New Zealand'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800324 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800325 'ph', 'xkb:us::eng', 'Asia/Manila', 'en-US', KML.ANSI,
326 'Philippines'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800327 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800328 'ru', ['xkb:us::eng', 'xkb:ru::rus'], 'Europe/Moscow', 'ru', KML.ANSI,
329 'Russia', (
330 'For R31+ only; R30 and earlier must use US keyboard for login')),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800331 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800332 'se', 'xkb:se::swe', 'Europe/Stockholm', 'sv', KML.ISO,
333 'Sweden', (
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800334 'Use this if there separate SKUs for Nordic countries (Sweden, '
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800335 'Norway, and Denmark), or the device is only shipping to Sweden. '
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800336 "If there is a single unified SKU, use 'nordic' instead.")),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800337 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800338 'sg', 'xkb:us::eng', 'Asia/Singapore', 'en-GB', KML.ANSI,
339 'Singapore'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800340 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800341 'us', 'xkb:us::eng', 'America/Los_Angeles', 'en-US', KML.ANSI,
342 'United States'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800343 Region(
Bao-Duy Tranf79b8f92019-07-04 17:12:01 +1000344 'jp', ['xkb:jp::jpn', 'ime:jp:mozc_jp'], 'Asia/Tokyo', 'ja', KML.JIS,
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800345 'Japan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800346 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800347 'za', 'xkb:gb:extd:eng', 'Africa/Johannesburg', 'en-ZA', KML.ISO,
348 'South Africa'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800349 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800350 'ng', 'xkb:us:intl:eng', 'Africa/Lagos', 'en-GB', KML.ANSI,
351 'Nigeria'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800352 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800353 'hk', ['xkb:us::eng', 'ime:zh-t:cangjie', 'ime:zh-t:quick',
354 'ime:zh-t:array', 'ime:zh-t:dayi', 'ime:zh-t:zhuyin',
355 'ime:zh-t:pinyin'], 'Asia/Hong_Kong', ['zh-TW', 'en-GB',
356 'zh-CN'], KML.ANSI,
357 'Hong Kong'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800358 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800359 'gcc', ['xkb:us::eng', 'm17n:ar', 't13n:ar'], 'Asia/Riyadh', [
360 'ar', 'en-GB'],
361 KML.ANSI,
362 'Gulf Cooperation Council (GCC)', (
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800363 'GCC is a regional intergovernmental political and economic '
364 'union consisting of all Arab states of the Persian Gulf except '
365 'for Iraq. Its member states are the Islamic monarchies of '
366 'Bahrain, Kuwait, Oman, Qatar, Saudi Arabia, and the United Arab '
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800367 'Emirates.'), 'SA'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800368 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800369 'cz', ['xkb:cz::cze', 'xkb:cz:qwerty:cze'], 'Europe/Prague', [
370 'cs', 'en-GB'], KML.ISO,
371 'Czech Republic'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800372 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800373 'th', ['xkb:us::eng', 'm17n:th', 'm17n:th_pattajoti',
374 'm17n:th_tis'], 'Asia/Bangkok', ['th', 'en-GB'], KML.ANSI,
375 'Thailand'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800376 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800377 'id', 'xkb:us::ind', 'Asia/Jakarta', ['id', 'en-GB'], KML.ANSI,
378 'Indonesia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800379 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800380 'tw', ['xkb:us::eng', 'ime:zh-t:zhuyin', 'ime:zh-t:array',
381 'ime:zh-t:dayi', 'ime:zh-t:cangjie', 'ime:zh-t:quick',
382 'ime:zh-t:pinyin'], 'Asia/Taipei', ['zh-TW', 'en-US'], KML.ANSI,
383 'Taiwan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800384 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800385 'pl', 'xkb:pl::pol', 'Europe/Warsaw', ['pl', 'en-GB'], KML.ANSI,
386 'Poland'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800387 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800388 'gr', ['xkb:us::eng', 'xkb:gr::gre', 't13n:el'], 'Europe/Athens', [
389 'el', 'en-GB'], KML.ANSI,
390 'Greece'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800391 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800392 'il', ['xkb:us::eng', 'xkb:il::heb', 't13n:he'], 'Asia/Jerusalem', [
393 'he', 'en-US', 'ar'], KML.ANSI,
394 'Israel'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800395 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800396 'pt', 'xkb:pt::por', 'Europe/Lisbon', ['pt-PT', 'en-GB'], KML.ISO,
397 'Portugal'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800398 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800399 'ro', ['xkb:us::eng', 'xkb:ro::rum'], 'Europe/Bucharest', [
400 'ro', 'hu', 'de', 'en-GB'], KML.ISO,
401 'Romania'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800402 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800403 'kr', ['xkb:us::eng', 'ime:ko:hangul'], 'Asia/Seoul', [
404 'ko', 'en-US'], KML.ANSI,
405 'South Korea'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800406 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800407 'ae', 'xkb:us::eng', 'Asia/Dubai', 'ar', KML.ANSI,
408 'UAE'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800409 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800410 'za.us', 'xkb:us::eng', 'Africa/Johannesburg', 'en-ZA', KML.ANSI,
411 'South Africa'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800412 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800413 'vn', ['xkb:us::eng', 'm17n:vi_telex', 'm17n:vi_vni', 'm17n:vi_viqr',
414 'm17n:vi_tcvn'], 'Asia/Ho_Chi_Minh', ['vi', 'en-GB', 'en-US',
415 'fr', 'zh-TW'], KML.ANSI,
416 'Vietnam'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800417 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800418 'at', ['xkb:de::ger', 'xkb:de:neo:ger'], 'Europe/Vienna', [
419 'de', 'en-GB'], KML.ISO,
420 'Austria'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800421 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800422 'sk', ['xkb:us::eng', 'xkb:sk::slo'], 'Europe/Bratislava', [
423 'sk', 'hu', 'cs', 'en-GB'], KML.ISO,
424 'Slovakia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800425 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800426 'ch.usintl', 'xkb:us:intl:eng', 'Europe/Zurich', 'en-US', KML.ANSI,
427 'Switzerland (US Intl)', (
428 'Switzerland with US International keyboard layout.')),
Hung-Te Lindf179fd2016-05-12 19:22:13 +0800429 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800430 'pe', 'xkb:latam::spa', 'America/Lima', 'es-419', KML.ANSI,
431 'Peru'),
Hung-Te Lindf179fd2016-05-12 19:22:13 +0800432 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800433 'sa', 'xkb:us::eng', 'Asia/Riyadh', ['ar', 'en'], KML.ANSI,
434 'Saudi Arabia'),
Hung-Te Lindf179fd2016-05-12 19:22:13 +0800435 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800436 'mx', 'xkb:latam::spa', 'America/Mexico_City', 'es-MX', KML.ANSI,
437 'Mexico'),
Hung-Te Lindf179fd2016-05-12 19:22:13 +0800438 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800439 'cl', 'xkb:latam::spa', 'America/Santiago', 'es-419', KML.ANSI,
440 'Chile'),
Hung-Te Lindf179fd2016-05-12 19:22:13 +0800441 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800442 'kw', ['xkb:us::eng', 'm17n:ar', 't13n:ar'], 'Asia/Kuwait', [
443 'ar', 'en'], KML.ANSI,
444 'Kuwait'),
Hung-Te Lindf179fd2016-05-12 19:22:13 +0800445 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800446 'uy', 'xkb:latam::spa', 'America/Montevideo', 'es-419', KML.ANSI,
447 'Uruguay'),
Hung-Te Lin37fbbbf2016-06-28 17:19:38 +0800448 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800449 'tr', ['xkb:tr::tur', 'xkb:tr:f:tur'], 'Europe/Istanbul', [
450 'tr', 'en-GB'], KML.ISO,
451 'Turkey'),
Hung-Te Lin639a05b2016-12-02 12:39:19 +0800452 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800453 'ar', 'xkb:latam::spa', 'America/Argentina/Buenos_Aires', [
paris_yeh8652e752017-06-06 14:38:23 +0800454 'es-AR', ], KML.ISO,
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800455 'Argentina'),
Hung-Te Lincf2f02b2017-03-20 14:58:20 +0800456 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800457 'gb.usext', 'xkb:us:altgr-intl:eng', 'Europe/London', 'en-GB', KML.ISO,
458 'UK (US extended keyboard)', (
459 'GB with US extended keyboard')),
Hung-Te Linfe0165d2018-05-02 19:15:03 +0800460 Region(
461 'bg', ['xkb:bg::bul', 'xkb:bg:phonetic:bul'], 'Europe/Sofia', [
462 'bg', 'tr', 'en-US'], KML.ANSI,
463 'Bulgaria'),
Wei-Han Chen763e6722018-11-16 12:23:19 +0800464 Region(
Bao-Duy Tranf79b8f92019-07-04 17:12:01 +1000465 'jp.us', ['xkb:us::eng', 'ime:jp:mozc_us'], 'Asia/Tokyo', 'ja',
466 KML.ANSI, 'Japan with US keyboard'),
Marco Chen233ea672018-09-19 21:46:49 +0800467 Region(
468 'is', 'xkb:is::ice', 'Atlantic/Reykjavik', ['is', 'en-GB'], KML.ISO,
469 'Iceland'),
Marco Chen2b3a91c2019-05-13 23:22:59 +0800470 Region(
471 'us.intl', 'xkb:us:intl:eng', 'America/Los_Angeles', 'en-US', KML.ANSI,
472 'US (English Intl)'),
Marco Chen773fe7f2019-05-13 23:08:18 +0800473 Region(
474 'co', 'xkb:latam::spa', 'America/Bogota', 'es-CO', KML.ANSI,
475 'Colombia'),
Stimim Chen053650c2020-04-30 11:49:10 +0800476 Region(
477 'hr', 'xkb:hr::scr', 'Europe/Zagreb', ['hr', 'en-GB'], KML.ISO,
478 'Croatia'),
Bao-Duy Trana828da62020-05-29 19:03:04 +1000479 Region(
Alexander Alekseev0725bd92021-04-10 00:03:31 -0700480 'kz', ['xkb:us::eng', 'xkb:kz::kaz', 'xkb:ru::rus'],
Bao-Duy Trana828da62020-05-29 19:03:04 +1000481 ['Asia/Almaty', 'Asia/Aqtobe'], ['kk', 'ru'], KML.ANSI, 'Kazakhstan'),
Stimim Chen67b5f822021-02-01 16:23:42 +0800482 Region(
483 'ee', 'xkb:ee::est', 'Europe/Tallinn', ['et', 'ru', 'en-GB'], KML.ISO,
484 'Estonia'),
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800485 ]
Hung-Te Lin37fbbbf2016-06-28 17:19:38 +0800486
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800487"""A list of :py:class:`regions.Region` objects for
488all **confirmed** regions. A confirmed region is a region whose
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800489properties are known to be correct and valid: all contents (locale / timezone /
Bao-Duy Tranfd69c2f2020-06-16 17:28:07 +1000490keyboards) are supported by Chrome.
491
492NOTE: This list is NOT alpha-sorted. New entries MUST be appended to the end of
493the list to retain relative order of existing entries. For backward
494compatibility, legacy entries need to stay in the same order because they used
495to have numeric mappings.
496"""
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800497
498
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800499UNCONFIRMED_REGIONS_LIST = [
500 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800501 'bd', 'xkb:bd::ben', 'Asia/Dhaka', ['bn-BD', 'en'], KML.ANSI,
502 'Bangladesh'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800503 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800504 'bf', 'xkb:bf::fra', 'Africa/Ouagadougou', 'fr-BF', KML.ANSI,
505 'Burkina Faso'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800506 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800507 'ba', 'xkb:ba::bos', 'Europe/Sarajevo', 'bs', KML.ANSI,
508 'Bosnia and Herzegovina'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800509 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800510 'bb', 'xkb:bb::eng', 'America/Barbados', 'en-BB', KML.ANSI,
511 'Barbados'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800512 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800513 'wf', 'xkb:us::eng', 'Pacific/Wallis', ['wls', 'fud'], KML.ANSI,
514 'Wallis and Futuna'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800515 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800516 'bl', 'xkb:bl::fra', 'America/St_Barthelemy', 'fr', KML.ANSI,
517 'Saint Barthelemy'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800518 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800519 'bm', 'xkb:bm::eng', 'Atlantic/Bermuda', ['en-BM', 'pt'], KML.ANSI,
520 'Bermuda'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800521 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800522 'bn', 'xkb:bn::msa', 'Asia/Brunei', ['ms-BN', 'en-BN'], KML.ANSI,
523 'Brunei'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800524 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800525 'bo', 'xkb:latam::spa', 'America/La_Paz', ['es-419', 'qu'], KML.ANSI,
526 'Bolivia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800527 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800528 'bh', 'xkb:bh::ara', 'Asia/Bahrain', ['ar', 'en', 'fa', 'ru'], KML.ANSI,
529 'Bahrain'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800530 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800531 'bi', 'xkb:bi::fra', 'Africa/Bujumbura', ['fr-BI', 'rn'], KML.ANSI,
532 'Burundi'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800533 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800534 'bj', 'xkb:bj::fra', 'Africa/Porto-Novo', 'fr-BJ', KML.ANSI,
535 'Benin'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800536 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800537 'bt', 'xkb:bt::dzo', 'Asia/Thimphu', 'dz', KML.ANSI,
538 'Bhutan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800539 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800540 'jm', 'xkb:jm::eng', 'America/Jamaica', 'en-JM', KML.ANSI,
541 'Jamaica'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800542 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800543 'bw', 'xkb:bw::eng', 'Africa/Gaborone', ['en-BW', 'tn-BW'], KML.ANSI,
544 'Botswana'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800545 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800546 'ws', 'xkb:ws::smo', 'Pacific/Apia', ['sm', 'en-WS'], KML.ANSI,
547 'Samoa'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800548 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800549 'bq', 'xkb:bq::nld', 'America/Kralendijk', ['nl', 'en'], KML.ANSI,
550 'Bonaire, Saint Eustatius and Saba '),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800551 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800552 'bs', 'xkb:bs::eng', 'America/Nassau', 'en-BS', KML.ANSI,
553 'Bahamas'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800554 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800555 'je', 'xkb:je::eng', 'Europe/Jersey', ['en', 'pt'], KML.ANSI,
556 'Jersey'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800557 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800558 'by', 'xkb:by::bel', 'Europe/Minsk', ['be', 'ru'], KML.ANSI,
559 'Belarus'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800560 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800561 'bz', 'xkb:bz::eng', 'America/Belize', ['en-BZ', 'es'], KML.ANSI,
562 'Belize'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800563 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800564 'rw', 'xkb:rw::kin', 'Africa/Kigali', ['rw', 'en-RW'], KML.ANSI,
565 'Rwanda'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800566 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800567 'rs', 'xkb:rs::srp', 'Europe/Belgrade', ['sr', 'hu', 'bs'], KML.ANSI,
568 'Serbia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800569 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800570 'tl', 'xkb:us::eng', 'Asia/Dili', ['tet', 'pt-TL', 'en'], KML.ANSI,
571 'East Timor'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800572 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800573 're', 'xkb:re::fra', 'Indian/Reunion', 'fr-RE', KML.ANSI,
574 'Reunion'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800575 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800576 'tm', 'xkb:tm::tuk', 'Asia/Ashgabat', ['tk', 'ru', 'uz'], KML.ANSI,
577 'Turkmenistan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800578 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800579 'tj', 'xkb:tj::tgk', 'Asia/Dushanbe', ['tg', 'ru'], KML.ANSI,
580 'Tajikistan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800581 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800582 'tk', 'xkb:us::eng', 'Pacific/Fakaofo', ['tkl', 'en-TK'], KML.ANSI,
583 'Tokelau'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800584 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800585 'gw', 'xkb:gw::por', 'Africa/Bissau', ['pt-GW', 'pov'], KML.ANSI,
586 'Guinea-Bissau'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800587 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800588 'gu', 'xkb:gu::eng', 'Pacific/Guam', ['en-GU', 'ch-GU'], KML.ANSI,
589 'Guam'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800590 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800591 'gt', 'xkb:latam::spa', 'America/Guatemala', 'es-419', KML.ANSI,
592 'Guatemala'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800593 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800594 'gs', 'xkb:gs::eng', 'Atlantic/South_Georgia', 'en', KML.ANSI,
595 'South Georgia and the South Sandwich Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800596 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800597 'gq', 'xkb:gq::spa', 'Africa/Malabo', ['es-419', 'fr'], KML.ANSI,
598 'Equatorial Guinea'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800599 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800600 'gp', 'xkb:gp::fra', 'America/Guadeloupe', 'fr-GP', KML.ANSI,
601 'Guadeloupe'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800602 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800603 'gy', 'xkb:gy::eng', 'America/Guyana', 'en-GY', KML.ANSI,
604 'Guyana'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800605 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800606 'gg', 'xkb:gg::eng', 'Europe/Guernsey', ['en', 'fr'], KML.ANSI,
607 'Guernsey'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800608 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800609 'gf', 'xkb:gf::fra', 'America/Cayenne', 'fr-GF', KML.ANSI,
610 'French Guiana'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800611 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800612 'ge', 'xkb:ge::geo', 'Asia/Tbilisi', 'ka', KML.ANSI,
613 'Georgia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800614 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800615 'gd', 'xkb:gd::eng', 'America/Grenada', 'en-GD', KML.ANSI,
616 'Grenada'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800617 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800618 'ga', 'xkb:ga::fra', 'Africa/Libreville', 'fr-GA', KML.ANSI,
619 'Gabon'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800620 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800621 'sv', 'xkb:latam::spa', 'America/El_Salvador', 'es-419', KML.ANSI,
622 'El Salvador'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800623 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800624 'gn', 'xkb:gn::fra', 'Africa/Conakry', 'fr-GN', KML.ANSI,
625 'Guinea'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800626 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800627 'gm', 'xkb:gm::eng', 'Africa/Banjul', ['en-GM', 'mnk', 'wof'], KML.ANSI,
628 'Gambia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800629 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800630 'gl', 'xkb:gl::kal', ['America/Godthab', 'America/Danmarkshavn',
631 'America/Scoresbysund', 'America/Thule'], [
632 'kl', 'da-GL', 'en'], KML.ANSI,
633 'Greenland'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800634 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800635 'gi', 'xkb:gi::eng', 'Europe/Gibraltar', ['en-GI', 'es'], KML.ANSI,
636 'Gibraltar'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800637 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800638 'gh', 'xkb:gh::eng', 'Africa/Accra', ['en-GH', 'ak', 'ee'], KML.ANSI,
639 'Ghana'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800640 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800641 'om', 'xkb:om::ara', 'Asia/Muscat', ['ar', 'en', 'bal'], KML.ANSI,
642 'Oman'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800643 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800644 'tn', 'xkb:tn::ara', 'Africa/Tunis', ['ar', 'fr'], KML.ANSI,
645 'Tunisia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800646 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800647 'jo', 'xkb:jo::ara', 'Asia/Amman', ['ar', 'en'], KML.ANSI,
648 'Jordan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800649 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800650 'hn', 'xkb:latam::spa', 'America/Tegucigalpa', 'es-HN', KML.ANSI,
651 'Honduras'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800652 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800653 'ht', 'xkb:ht::hat', 'America/Port-au-Prince', ['ht'], KML.ANSI,
654 'Haiti'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800655 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800656 'hu', ['xkb:us::eng', 'xkb:hu::hun'], 'Europe/Budapest', [
657 'hu', 'en-GB'], KML.ISO,
658 'Hungary'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800659 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800660 've', 'xkb:latam::spa', 'America/Caracas', 'es-419', KML.ANSI,
661 'Venezuela'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800662 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800663 'pr', 'xkb:pr::eng', 'America/Puerto_Rico', ['en-PR'], KML.ANSI,
664 'Puerto Rico'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800665 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800666 'ps', 'xkb:ps::ara', ['Asia/Gaza', 'Asia/Hebron'], 'ar', KML.ANSI,
667 'Palestinian Territory'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800668 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800669 'pw', 'xkb:us::eng', 'Pacific/Palau', ['pau', 'sov', 'en-PW', 'tox',
670 'ja', 'fil', 'zh'], KML.ANSI,
671 'Palau'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800672 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800673 'sj', 'xkb:sj::nor', 'Arctic/Longyearbyen', ['no', 'ru'], KML.ANSI,
674 'Svalbard and Jan Mayen'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800675 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800676 'py', 'xkb:latam::spa', 'America/Asuncion', ['es-419', 'gn'], KML.ANSI,
677 'Paraguay'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800678 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800679 'iq', 'xkb:iq::ara', 'Asia/Baghdad', ['ar', 'ku', 'hy'], KML.ANSI,
680 'Iraq'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800681 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800682 'pa', 'xkb:latam::spa', 'America/Panama', ['es-419', 'en'], KML.ANSI,
683 'Panama'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800684 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800685 'pf', 'xkb:pf::fra', ['Pacific/Tahiti', 'Pacific/Marquesas',
686 'Pacific/Gambier'], ['fr-PF', 'ty'], KML.ANSI,
687 'French Polynesia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800688 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800689 'pg', 'xkb:pg::eng', ['Pacific/Port_Moresby',
690 'Pacific/Bougainville'], ['en-PG', 'ho', 'meu',
691 'tpi'], KML.ANSI,
692 'Papua New Guinea'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800693 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800694 'pk', 'xkb:pk::urd', 'Asia/Karachi', ['ur-PK', 'en-PK', 'pa', 'sd',
695 'ps', 'brh'], KML.ANSI,
696 'Pakistan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800697 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800698 'pn', 'xkb:pn::eng', 'Pacific/Pitcairn', 'en-PN', KML.ANSI,
699 'Pitcairn'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800700 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800701 'pm', 'xkb:pm::fra', 'America/Miquelon', 'fr-PM', KML.ANSI,
702 'Saint Pierre and Miquelon'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800703 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800704 'zm', 'xkb:zm::eng', 'Africa/Lusaka', ['en-ZM', 'bem', 'loz', 'lun',
705 'lue', 'ny', 'toi'], KML.ANSI,
706 'Zambia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800707 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800708 'eh', 'xkb:eh::ara', 'Africa/El_Aaiun', ['ar', 'mey'], KML.ANSI,
709 'Western Sahara'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800710 Region(
Hung-Te Lin47da9092017-03-20 15:01:56 +0800711 'eg', 'xkb:eg::ara', 'Africa/Cairo', ['ar', 'en', 'fr'],
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800712 KML.ANSI, 'Egypt'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800713 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800714 'ec', 'xkb:latam::spa', ['America/Guayaquil'], 'es-419', KML.ANSI,
715 'Ecuador'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800716 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800717 'sb', 'xkb:sb::eng', 'Pacific/Guadalcanal', ['en-SB', 'tpi'], KML.ANSI,
718 'Solomon Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800719 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800720 'et', 'xkb:et::amh', 'Africa/Addis_Ababa', ['am', 'en-ET', 'om-ET',
721 'ti-ET'], KML.ANSI,
722 'Ethiopia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800723 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800724 'so', 'xkb:so::som', 'Africa/Mogadishu', ['so-SO', 'ar'], KML.ANSI,
725 'Somalia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800726 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800727 'zw', 'xkb:zw::eng', 'Africa/Harare', ['en-ZW', 'sn', 'nr'], KML.ANSI,
728 'Zimbabwe'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800729 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800730 'er', 'xkb:er::aar', 'Africa/Asmara', ['aa-ER', 'ar', 'tig', 'kun',
731 'ti-ER'], KML.ANSI,
732 'Eritrea'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800733 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800734 'me', 'xkb:me::srp', 'Europe/Podgorica', ['sr', 'hu', 'bs', 'sq', 'hr',
735 'rom'], KML.ANSI,
736 'Montenegro'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800737 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800738 'md', 'xkb:md::ron', 'Europe/Chisinau', ['ro', 'ru', 'gag'], KML.ANSI,
739 'Moldova'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800740 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800741 'mg', 'xkb:mg::fra', 'Indian/Antananarivo', ['fr-MG', 'mg'], KML.ANSI,
742 'Madagascar'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800743 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800744 'mf', 'xkb:mf::fra', 'America/Marigot', 'fr', KML.ANSI, 'Saint Martin'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800745 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800746 'ma', 'xkb:ma::ara', 'Africa/Casablanca', ['ar', 'fr'], KML.ANSI,
747 'Morocco'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800748 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800749 'mc', 'xkb:mc::fra', 'Europe/Monaco', ['fr-MC', 'en', 'it'], KML.ANSI,
750 'Monaco'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800751 Region(
752 'uz', 'xkb:uz::uzb', ['Asia/Samarkand', 'Asia/Tashkent'],
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800753 ['uz', 'ru', 'tg'], KML.ANSI, 'Uzbekistan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800754 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800755 'mm', 'xkb:mm::mya', 'Asia/Rangoon', 'my', KML.ANSI, 'Myanmar',
756 None),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800757 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800758 'ml', 'xkb:ml::fra', 'Africa/Bamako', ['fr-ML', 'bm'], KML.ANSI,
759 'Mali'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800760 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800761 'mo', 'xkb:mo::zho', 'Asia/Macau', ['zh', 'zh-MO', 'pt'], KML.ANSI,
762 'Macao'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800763 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800764 'mn', 'xkb:mn::mon', ['Asia/Ulaanbaatar', 'Asia/Hovd',
765 'Asia/Choibalsan'], ['mn', 'ru'], KML.ANSI,
766 'Mongolia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800767 Region(
Clark Chung0005a702020-05-26 16:34:52 +0800768 'mh', 'xkb:mh::mah', ['Pacific/Majuro'], ['mh', 'en-MH'], KML.ANSI,
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800769 'Marshall Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800770 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800771 'mk', 'xkb:mk::mkd', 'Europe/Skopje', ['mk', 'sq', 'tr'], KML.ANSI,
772 'Macedonia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800773 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800774 'mu', 'xkb:mu::eng', 'Indian/Mauritius', ['en-MU', 'bho'], KML.ANSI,
775 'Mauritius'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800776 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800777 'mt', ['xkb:us::eng'], 'Europe/Malta', ['mt', 'en-GB'], KML.ISO,
778 'Malta'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800779 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800780 'mw', 'xkb:mw::nya', 'Africa/Blantyre', ['ny', 'yao', 'tum'], KML.ANSI,
781 'Malawi'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800782 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800783 'mv', 'xkb:mv::div', 'Indian/Maldives', ['dv', 'en'], KML.ANSI,
784 'Maldives'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800785 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800786 'mq', 'xkb:mq::fra', 'America/Martinique', 'fr-MQ', KML.ANSI,
787 'Martinique'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800788 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800789 'mp', 'xkb:us::eng', 'Pacific/Saipan', ['fil', 'tl', 'zh', 'ch-MP',
790 'en-MP'], KML.ANSI,
791 'Northern Mariana Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800792 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800793 'ms', 'xkb:ms::eng', 'America/Montserrat', 'en-MS', KML.ANSI,
794 'Montserrat'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800795 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800796 'mr', 'xkb:mr::ara', 'Africa/Nouakchott', ['ar', 'fuc', 'snk', 'fr',
797 'mey', 'wo'], KML.ANSI,
798 'Mauritania'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800799 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800800 'im', 'xkb:im::eng', 'Europe/Isle_of_Man', ['en', 'gv'], KML.ANSI,
801 'Isle of Man'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800802 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800803 'ug', 'xkb:ug::eng', 'Africa/Kampala', ['en-UG', 'lg', 'ar'], KML.ANSI,
804 'Uganda'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800805 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800806 'tz', 'xkb:tz::swa', 'Africa/Dar_es_Salaam', ['sw-TZ', 'en'], KML.ANSI,
807 'Tanzania'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800808 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800809 'io', 'xkb:io::eng', 'Indian/Chagos', 'en-IO', KML.ANSI,
810 'British Indian Ocean Territory'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800811 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800812 'sh', 'xkb:sh::eng', 'Atlantic/St_Helena', 'en-SH', KML.ANSI,
813 'Saint Helena'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800814 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800815 'fj', 'xkb:fj::eng', 'Pacific/Fiji', ['en-FJ', 'fj'], KML.ANSI,
816 'Fiji'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800817 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800818 'fk', 'xkb:fk::eng', 'Atlantic/Stanley', 'en-FK', KML.ANSI,
819 'Falkland Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800820 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800821 'fm', 'xkb:fm::eng', [
822 'Pacific/Chuuk', 'Pacific/Pohnpei', 'Pacific/Kosrae'], [
823 'en-FM', 'chk', 'pon', 'yap', 'kos', 'uli', 'woe', 'nkr',
824 'kpg'], KML.ANSI,
825 'Micronesia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800826 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800827 'fo', 'xkb:fo::fao', 'Atlantic/Faroe', ['fo', 'da-FO'], KML.ANSI,
828 'Faroe Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800829 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800830 'ni', 'xkb:latam::spa', 'America/Managua', ['es-419', 'en'], KML.ANSI,
831 'Nicaragua'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800832 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800833 'no', 'xkb:no::nor', 'Europe/Oslo', ['no', 'nb', 'nn', 'se'], KML.ISO,
834 'Norway'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800835 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800836 'na', 'xkb:na::eng', 'Africa/Windhoek', ['en-NA', 'af', 'de', 'hz',
837 'naq'], KML.ANSI,
838 'Namibia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800839 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800840 'vu', 'xkb:vu::bis', 'Pacific/Efate', ['bi', 'en-VU'], KML.ANSI,
841 'Vanuatu'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800842 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800843 'nc', 'xkb:nc::fra', 'Pacific/Noumea', 'fr-NC', KML.ANSI,
844 'New Caledonia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800845 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800846 'ne', 'xkb:ne::fra', 'Africa/Niamey', ['fr-NE', 'ha', 'kr'], KML.ANSI,
847 'Niger'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800848 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800849 'nf', 'xkb:nf::eng', 'Pacific/Norfolk', 'en-NF', KML.ANSI,
850 'Norfolk Island'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800851 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800852 'np', 'xkb:np::nep', 'Asia/Kathmandu', ['ne', 'en'], KML.ANSI,
853 'Nepal'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800854 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800855 'nr', 'xkb:nr::nau', 'Pacific/Nauru', ['na', 'en-NR'], KML.ANSI,
856 'Nauru'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800857 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800858 'nu', 'xkb:us::eng', 'Pacific/Niue', ['niu', 'en-NU'], KML.ANSI,
859 'Niue'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800860 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800861 'ck', 'xkb:ck::eng', 'Pacific/Rarotonga', ['en-CK', 'mi'], KML.ANSI,
862 'Cook Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800863 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800864 'ci', 'xkb:ci::fra', 'Africa/Abidjan', 'fr-CI', KML.ANSI,
865 'Ivory Coast'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800866 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800867 'cn', 'xkb:us::eng', 'Asia/Shanghai', 'zh-CN', KML.ANSI,
868 'China'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800869 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800870 'cm', 'xkb:cm::eng', 'Africa/Douala', ['en-CM', 'fr-CM'], KML.ANSI,
871 'Cameroon'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800872 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800873 'cc', 'xkb:cc::msa', 'Indian/Cocos', ['ms-CC', 'en'], KML.ANSI,
874 'Cocos Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800875 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800876 'cg', 'xkb:cg::fra', 'Africa/Brazzaville', ['fr-CG', 'kg'], KML.ANSI,
877 'Republic of the Congo'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800878 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800879 'cf', 'xkb:cf::fra', 'Africa/Bangui', ['fr-CF', 'sg', 'ln'], KML.ANSI,
880 'Central African Republic'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800881 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800882 'cd', 'xkb:cd::fra', ['Africa/Kinshasa', 'Africa/Lubumbashi'], [
883 'fr-CD', 'ln', 'kg'], KML.ANSI,
884 'Democratic Republic of the Congo'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800885 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800886 'cy', 'xkb:cy::ell', 'Asia/Nicosia', ['el-CY', 'tr-CY'], KML.ANSI,
887 'Cyprus'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800888 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800889 'cx', 'xkb:cx::eng', 'Indian/Christmas', ['en', 'zh'], KML.ANSI,
890 'Christmas Island'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800891 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800892 'cr', 'xkb:latam::spa', 'America/Costa_Rica', ['es-419'], KML.ANSI,
893 'Costa Rica'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800894 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800895 'cw', 'xkb:cw::nld', 'America/Curacao', ['nl'], KML.ANSI, 'Curacao'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800896 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800897 'cv', 'xkb:cv::por', 'Atlantic/Cape_Verde', 'pt-CV', KML.ANSI,
898 'Cape Verde'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800899 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800900 'cu', 'xkb:latam::spa', 'America/Havana', 'es-419', KML.ANSI,
901 'Cuba'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800902 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800903 'sz', 'xkb:sz::eng', 'Africa/Mbabane', ['en-SZ', 'ss-SZ'], KML.ANSI,
904 'Swaziland'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800905 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800906 'sy', 'xkb:sy::ara', 'Asia/Damascus', ['ar', 'ku', 'hy', 'arc', 'fr',
907 'en'], KML.ANSI,
908 'Syria'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800909 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800910 'sx', 'xkb:sx::nld', 'America/Lower_Princes', ['nl', 'en'], KML.ANSI,
911 'Sint Maarten'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800912 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800913 'kg', 'xkb:kg::kir', 'Asia/Bishkek', ['ky', 'uz', 'ru'], KML.ANSI,
914 'Kyrgyzstan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800915 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800916 'ke', 'xkb:ke::eng', 'Africa/Nairobi', ['en-KE', 'sw-KE'], KML.ANSI,
917 'Kenya'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800918 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800919 'ss', 'xkb:ss::eng', 'Africa/Juba', 'en', KML.ANSI,
920 'South Sudan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800921 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800922 'sr', 'xkb:sr::nld', 'America/Paramaribo', ['nl-SR', 'en', 'srn', 'hns',
923 'jv'], KML.ANSI,
924 'Suriname'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800925 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800926 'ki', 'xkb:ki::eng', ['Pacific/Tarawa', 'Pacific/Enderbury',
927 'Pacific/Kiritimati'], ['en-KI', 'gil'], KML.ANSI,
928 'Kiribati'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800929 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800930 'kh', 'xkb:kh::khm', 'Asia/Phnom_Penh', ['km', 'fr', 'en'], KML.ANSI,
931 'Cambodia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800932 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800933 'kn', 'xkb:kn::eng', 'America/St_Kitts', 'en-KN', KML.ANSI,
934 'Saint Kitts and Nevis'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800935 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800936 'km', 'xkb:km::ara', 'Indian/Comoro', ['ar', 'fr-KM'], KML.ANSI,
937 'Comoros'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800938 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800939 'st', 'xkb:st::por', 'Africa/Sao_Tome', 'pt-ST', KML.ANSI,
940 'Sao Tome and Principe'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800941 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800942 'si', 'xkb:si::slv', 'Europe/Ljubljana', ['sl', 'hu', 'it', 'sr', 'de',
943 'hr', 'en-GB'], KML.ISO,
944 'Slovenia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800945 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800946 'kp', 'xkb:kp::kor', 'Asia/Pyongyang', 'ko-KP', KML.ANSI,
947 'North Korea'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800948 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800949 'sn', 'xkb:sn::fra', 'Africa/Dakar', ['fr-SN', 'wo', 'fuc'], KML.ANSI,
950 'Senegal'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800951 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800952 'sm', 'xkb:sm::ita', 'Europe/San_Marino', 'it-SM', KML.ANSI,
953 'San Marino'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800954 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800955 'sl', 'xkb:sl::eng', 'Africa/Freetown', ['en-SL', 'men'], KML.ANSI,
956 'Sierra Leone'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800957 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800958 'sc', 'xkb:sc::eng', 'Indian/Mahe', ['en-SC', 'fr-SC'], KML.ANSI,
959 'Seychelles'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800960 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800961 'ky', 'xkb:ky::eng', 'America/Cayman', 'en-KY', KML.ANSI,
962 'Cayman Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800963 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800964 'sd', 'xkb:sd::ara', 'Africa/Khartoum', ['ar', 'en', 'fia'], KML.ANSI,
965 'Sudan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800966 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800967 'do', 'xkb:latam::spa', 'America/Santo_Domingo', 'es-419', KML.ANSI,
968 'Dominican Republic'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800969 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800970 'dm', 'xkb:dm::eng', 'America/Dominica', 'en-DM', KML.ANSI,
971 'Dominica'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800972 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800973 'dj', 'xkb:dj::fra', 'Africa/Djibouti', ['fr-DJ', 'ar'], KML.ANSI,
974 'Djibouti'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800975 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800976 'dk', 'xkb:dk::dan', 'Europe/Copenhagen', ['da-DK', 'en', 'fo',
977 'de-DK'], KML.ISO,
978 'Denmark'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800979 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800980 'vg', 'xkb:vg::eng', 'America/Tortola', 'en-VG', KML.ANSI,
981 'British Virgin Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800982 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800983 'ye', 'xkb:ye::ara', 'Asia/Aden', 'ar', KML.ANSI,
984 'Yemen'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800985 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800986 'dz', 'xkb:dz::ara', 'Africa/Algiers', 'ar', KML.ANSI,
987 'Algeria'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800988 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800989 'yt', 'xkb:yt::fra', 'Indian/Mayotte', 'fr-YT', KML.ANSI,
990 'Mayotte'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800991 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800992 'um', 'xkb:um::eng', ['Pacific/Johnston', 'Pacific/Midway',
993 'Pacific/Wake'], 'en-UM', KML.ANSI,
994 'United States Minor Outlying Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800995 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800996 'lb', 'xkb:lb::ara', 'Asia/Beirut', ['ar', 'fr-LB', 'en'], KML.ANSI,
997 'Lebanon'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800998 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800999 'lc', 'xkb:lc::eng', 'America/St_Lucia', 'en-LC', KML.ANSI,
1000 'Saint Lucia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001001 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001002 'la', 'xkb:la::lao', 'Asia/Vientiane', ['lo', 'fr', 'en'], KML.ANSI,
1003 'Laos'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001004 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001005 'tv', 'xkb:us::eng', 'Pacific/Funafuti', ['tvl', 'en', 'sm'], KML.ANSI,
1006 'Tuvalu'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001007 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001008 'tt', 'xkb:tt::eng', 'America/Port_of_Spain', ['en-TT', 'hns', 'fr',
1009 'es', 'zh'], KML.ANSI,
1010 'Trinidad and Tobago'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001011 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001012 'lk', 'xkb:lk::sin', 'Asia/Colombo', ['si', 'ta', 'en'], KML.ANSI,
1013 'Sri Lanka'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001014 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001015 'li', 'xkb:ch::ger', 'Europe/Vaduz', ['de', 'en-GB'], KML.ISO,
1016 'Liechtenstein'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001017 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001018 'lv', 'xkb:lv:apostrophe:lav', 'Europe/Riga', ['lv', 'lt', 'ru',
1019 'en-GB'], KML.ISO,
1020 'Latvia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001021 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001022 'to', 'xkb:to::ton', 'Pacific/Tongatapu', ['to', 'en-TO'], KML.ANSI,
1023 'Tonga'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001024 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001025 'lt', 'xkb:lt::lit', 'Europe/Vilnius', ['lt', 'ru', 'pl'], KML.ISO,
1026 'Lithuania'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001027 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001028 'lu', 'xkb:lu::ltz', 'Europe/Luxembourg', ['lb', 'de-LU'], KML.ANSI,
1029 'Luxembourg'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001030 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001031 'lr', 'xkb:lr::eng', 'Africa/Monrovia', 'en-LR', KML.ANSI,
1032 'Liberia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001033 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001034 'ls', 'xkb:ls::eng', 'Africa/Maseru', ['en-LS', 'st', 'zu'], KML.ANSI,
1035 'Lesotho'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001036 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001037 'tf', 'xkb:tf::fra', 'Indian/Kerguelen', 'fr', KML.ANSI,
1038 'French Southern Territories'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001039 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001040 'tg', 'xkb:tg::fra', 'Africa/Lome', ['fr-TG', 'ee', 'hna'], KML.ANSI,
1041 'Togo'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001042 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001043 'td', 'xkb:td::fra', 'Africa/Ndjamena', ['fr-TD', 'ar'], KML.ANSI,
1044 'Chad'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001045 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001046 'tc', 'xkb:tc::eng', 'America/Grand_Turk', 'en-TC', KML.ANSI,
1047 'Turks and Caicos Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001048 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001049 'ly', 'xkb:ly::ara', 'Africa/Tripoli', ['ar', 'it', 'en'], KML.ANSI,
1050 'Libya'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001051 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001052 'va', 'xkb:va::lat', 'Europe/Vatican', ['la', 'it', 'fr'], KML.ANSI,
1053 'Vatican'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001054 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001055 'vc', 'xkb:vc::eng', 'America/St_Vincent', ['en-VC', 'fr'], KML.ANSI,
1056 'Saint Vincent and the Grenadines'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001057 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001058 'ad', 'xkb:ad::cat', 'Europe/Andorra', 'ca', KML.ANSI,
1059 'Andorra'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001060 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001061 'ag', 'xkb:ag::eng', 'America/Antigua', 'en-AG', KML.ANSI,
1062 'Antigua and Barbuda'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001063 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001064 'af', 'xkb:af::fas', 'Asia/Kabul', ['fa-AF', 'ps'], KML.ANSI,
1065 'Afghanistan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001066 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001067 'ai', 'xkb:ai::eng', 'America/Anguilla', 'en-AI', KML.ANSI,
1068 'Anguilla'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001069 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001070 'vi', 'xkb:vi::eng', 'America/St_Thomas', 'en-VI', KML.ANSI,
1071 'U.S. Virgin Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001072 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001073 'ir', 'xkb:ir::fas', 'Asia/Tehran', ['fa-IR', 'ku'], KML.ANSI,
1074 'Iran'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001075 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001076 'am', 'xkb:am::hye', 'Asia/Yerevan', 'hy', KML.ANSI,
1077 'Armenia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001078 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001079 'al', 'xkb:al::sqi', 'Europe/Tirane', ['sq', 'el'], KML.ANSI,
1080 'Albania'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001081 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001082 'ao', 'xkb:ao::por', 'Africa/Luanda', 'pt-AO', KML.ANSI,
1083 'Angola'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001084 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001085 'as', 'xkb:as::eng', 'Pacific/Pago_Pago', ['en-AS', 'sm'], KML.ANSI,
1086 'American Samoa'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001087 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001088 'aw', 'xkb:aw::nld', 'America/Aruba', ['nl-AW', 'es', 'en'], KML.ANSI,
1089 'Aruba'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001090 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001091 'ax', 'xkb:ax::swe', 'Europe/Mariehamn', 'sv-AX', KML.ANSI,
1092 'Aland Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001093 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001094 'az', 'xkb:az::aze', 'Asia/Baku', ['az', 'ru', 'hy'], KML.ANSI,
1095 'Azerbaijan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001096 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001097 'ua', 'xkb:ua::ukr', [
1098 'Europe/Kiev', 'Europe/Uzhgorod', 'Europe/Zaporozhye'], [
1099 'uk', 'ru-UA', 'rom', 'pl', 'hu'], KML.ANSI,
1100 'Ukraine'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001101 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001102 'qa', 'xkb:qa::ara', 'Asia/Bahrain', ['ar', 'en'], KML.ANSI,
1103 'Qatar'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001104 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001105 'mz', 'xkb:mz::por', 'Africa/Maputo', ['pt-MZ', 'vmw'], KML.ANSI,
1106 'Mozambique'),
1107 ]
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001108"""A list of :py:class:`regions.Region` objects for
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001109**unconfirmed** regions. These may contain incorrect information (or not
1110supported by Chrome browser yet), and all fields must be reviewed before launch.
1111See http://goto/vpdsettings.
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001112
1113Currently, non-Latin keyboards must use an underlying Latin keyboard
1114for VPD. (This assumption should be revisited when moving items to
1115:py:data:`regions.Region.REGIONS_LIST`.) This is
1116currently being discussed on <http://crbug.com/325389>.
1117
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001118Some timezones or locales may be missing from ``timezone_settings.cc`` (see
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001119http://crosbug.com/p/23902). This must be rectified before moving
1120items to :py:data:`regions.Region.REGIONS_LIST`.
1121"""
1122
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001123
1124def ConsolidateRegions(regions):
1125 """Consolidates a list of regions into a dict.
1126
1127 Args:
1128 regions: A list of Region objects. All objects for any given
1129 region code must be identical or we will throw an exception.
1130 (We allow duplicates in case identical region objects are
1131 defined in both regions.py and the overlay, e.g., when moving
1132 items to the public overlay.)
1133
1134 Returns:
1135 A dict from region code to Region.
1136
1137 Raises:
1138 RegionException: If there are multiple regions defined for a given
1139 region, and the values for those regions differ.
1140 """
1141 # Build a dict from region_code to the first Region with that code.
1142 region_dict = {}
1143 for r in regions:
1144 existing_region = region_dict.get(r.region_code)
1145 if existing_region:
1146 if existing_region.GetFieldsDict() != r.GetFieldsDict():
1147 raise RegionException(
1148 'Conflicting definitions for region %r: %r, %r' %
1149 (r.region_code, existing_region.GetFieldsDict(),
1150 r.GetFieldsDict()))
1151 else:
1152 region_dict[r.region_code] = r
1153
1154 return region_dict
1155
1156
1157def BuildRegionsDict(include_all=False):
1158 """Builds a dictionary mapping from code to :py:class:`regions.Region` object.
1159
1160 The regions include:
1161
1162 * :py:data:`regions.REGIONS_LIST`
1163 * :py:data:`regions_overlay.REGIONS_LIST`
1164 * Only if ``include_all`` is true:
1165
1166 * :py:data:`regions.UNCONFIRMED_REGIONS_LIST`
1167 * :py:data:`regions.INCOMPLETE_REGIONS_LIST`
1168
1169 A region may only appear in one of the above lists, or this function
1170 will (deliberately) fail.
1171 """
1172 regions = list(REGIONS_LIST)
1173 if include_all:
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001174 known_codes = [r.region_code for r in regions]
1175 regions += [r for r in UNCONFIRMED_REGIONS_LIST if r.region_code not in
1176 known_codes]
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001177
1178 # Build dictionary of region code to list of regions with that
1179 # region code. Check manually for duplicates, since the region may
1180 # be present both in the overlay and the public repo.
1181 return ConsolidateRegions(regions)
1182
1183
1184REGIONS = BuildRegionsDict()
1185
1186
Bao-Duy Trane43d5de2020-05-29 18:02:36 +10001187def main(args=None, out=None):
1188 if args is None:
1189 args = sys.argv[1:]
1190
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001191 parser = argparse.ArgumentParser(description=(
1192 'Display all known regions and their parameters. '))
1193 parser.add_argument('--format',
1194 choices=('human-readable', 'csv', 'json', 'yaml'),
1195 default='human-readable',
1196 help='Output format (default=%(default)s)')
1197 parser.add_argument('--all', action='store_true',
1198 help='Include unconfirmed and incomplete regions')
Hung-Te Linfe67ea42017-07-21 18:59:55 +08001199 parser.add_argument('--notes', action='store_true',
1200 help='Include notes in output')
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001201 parser.add_argument('--output', default=None,
1202 help='Specify output file')
Hung-Te Lin34f3d382015-04-10 18:18:23 +08001203 parser.add_argument('--overlay', default=None,
1204 help='Specify a Python file to overlay extra data')
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001205 args = parser.parse_args(args)
1206
Hung-Te Lin34f3d382015-04-10 18:18:23 +08001207 if args.overlay is not None:
Yilin Yang350aca02020-02-03 15:08:23 +08001208 with open(args.overlay) as f:
Bao-Duy Trane43d5de2020-05-29 18:02:36 +10001209 exec(f.read()) # pylint: disable=exec-used
Hung-Te Lin34f3d382015-04-10 18:18:23 +08001210
Hung-Te Lin1a14cc42015-04-14 01:23:34 +08001211 if args.all:
1212 # Add an additional 'confirmed' property to help identifying region status,
1213 # for autotests, unit tests and factory module.
1214 Region.FIELDS.insert(1, 'confirmed')
1215 for r in REGIONS_LIST:
1216 r.confirmed = True
1217 for r in UNCONFIRMED_REGIONS_LIST:
1218 r.confirmed = False
1219
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001220 regions_dict = BuildRegionsDict(args.all)
Hung-Te Lin34f3d382015-04-10 18:18:23 +08001221
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001222 if out is None:
1223 if args.output is None:
1224 out = sys.stdout
1225 else:
1226 out = open(args.output, 'w')
1227
Hung-Te Linfe67ea42017-07-21 18:59:55 +08001228 if args.notes or args.format == 'csv':
1229 Region.FIELDS += ['notes']
1230
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001231 # Handle YAML and JSON output.
1232 if args.format == 'yaml' or args.format == 'json':
1233 data = {}
1234 for region in regions_dict.values():
1235 item = {}
1236 for field in Region.FIELDS:
1237 item[field] = getattr(region, field)
1238 data[region.region_code] = item
1239 if args.format == 'yaml':
1240 yaml.dump(data, out)
1241 else:
1242 json.dump(data, out)
1243 return
1244
1245 # Handle CSV or plain-text output: build a list of lines to print.
1246 lines = [Region.FIELDS]
1247
1248 def CoerceToString(value):
1249 """Returns the arguments in simple string type.
1250
1251 If value is a list, concatenate its values with commas. Otherwise, just
1252 return value.
1253 """
1254 if isinstance(value, list):
1255 return ','.join(value)
1256 else:
1257 return str(value)
Hung-Te Lin1a14cc42015-04-14 01:23:34 +08001258
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001259 for region in sorted(regions_dict.values(), key=lambda v: v.region_code):
1260 lines.append([CoerceToString(getattr(region, field))
1261 for field in Region.FIELDS])
1262
1263 if args.format == 'csv':
Hung-Te Lin1a14cc42015-04-14 01:23:34 +08001264 # Just print the lines in CSV format. Note the values may include ',' so the
1265 # separator must be tab.
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001266 for l in lines:
Hung-Te Lin1a14cc42015-04-14 01:23:34 +08001267 print('\t'.join(l))
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001268 elif args.format == 'human-readable':
1269 num_columns = len(lines[0])
1270
1271 # Calculate maximum length of each column.
1272 max_lengths = []
Yilin Yang1550f3c2020-02-03 15:09:31 +08001273 for column_no in range(num_columns):
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001274 max_lengths.append(max(len(line[column_no]) for line in lines))
1275
1276 # Print each line, padding as necessary to the max column length.
1277 for line in lines:
Yilin Yang1550f3c2020-02-03 15:09:31 +08001278 for column_no in range(num_columns):
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001279 out.write(line[column_no].ljust(max_lengths[column_no] + 2))
1280 out.write('\n')
1281 else:
Wei-Han Chen763e6722018-11-16 12:23:19 +08001282 sys.exit('Sorry, unknown format specified: %s' % args.format)
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001283
1284
1285if __name__ == '__main__':
1286 main()