blob: 414194f65f68625ef4cc69c8b28b9b47b3d8735f [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.
74 # pylint: disable=C0322
75
76 # ANSI = US-like
77 # ISO = UK-like
78 # JIS = Japanese
Hung-Te Lin4eb4f922016-03-04 11:51:04 +080079 # KS = Korean (see http://crosbug.com/p/50753 for why this is not used yet)
Hung-Te Lin76c55b22015-03-31 14:47:14 +080080 # ABNT2 = Brazilian (like ISO but with an extra key to the left of the
81 # right shift key)
82 KeyboardMechanicalLayout = Enum(['ANSI', 'ISO', 'JIS', 'KS', 'ABNT2'])
83
84 region_code = None
85 """A unique identifier for the region. This may be a lower-case
86 `ISO 3166-1 alpha-2 code
87 <http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2>`_ (e.g., ``us``),
88 a variant within an alpha-2 entity (e.g., ``ca.fr``), or an
89 identifier for a collection of countries or entities (e.g.,
90 ``latam-es-419`` or ``nordic``). See :ref:`region-codes`.
91
92 Note that ``uk`` is not a valid identifier; ``gb`` is used as it is
93 the real alpha-2 code for the UK."""
94
95 keyboards = None
96 """A list of keyboard layout identifiers (e.g., ``xkb:us:intl:eng``
97 or ``m17n:ar``). This field was designed to be the physical keyboard layout
98 in the beginning, and then becomes a list of OOBE keyboard selection, which
99 then includes non-physical layout elements like input methods (``ime:``).
100 To avoid confusion, physical layout is now defined by
101 :py:attr:`keyboard_mechanical_layout`, and this is reserved for logical
102 layouts.
103
104 This is identical to the legacy VPD ``keyboard_layout`` value."""
105
106 time_zones = None
107 """A list of default `tz database time zone
108 <http://en.wikipedia.org/wiki/List_of_tz_database_time_zones>`_
109 identifiers (e.g., ``America/Los_Angeles``). See
110 `timezone_settings.cc <http://goo.gl/WSVUeE>`_ for supported time
111 zones.
112
113 This is identical to the legacy VPD ``initial_timezone`` value."""
114
115 locales = None
116 """A list of default locale codes (e.g., ``en-US``); see
117 `l10n_util.cc <http://goo.gl/kVkht>`_ for supported locales.
118
119 This is identital to the legacy VPD ``initial_locale`` field."""
120
121 keyboard_mechanical_layout = None
122 """The keyboard's mechanical layout (``ANSI`` [US-like], ``ISO``
123 [UK-like], ``JIS`` [Japanese], ``ABNT2`` [Brazilian] or ``KS`` [Korean])."""
124
125 description = None
126 """A human-readable description of the region.
127 This defaults to :py:attr:`region_code` if not set."""
128
129 notes = None
130 """Implementation notes about the region. This may be None."""
131
Hung-Te Lin436b6cc2015-04-03 12:15:47 +0800132 regulatory_domain = None
133 """An ISO 3166-1 alpha 2 upper-cased two-letter region code for setting
134 Wireless regulatory. See crosbug.com/p/38745 for more details.
135
136 When omitted, this will derive from region_code."""
137
Hung-Te Lin1a14cc42015-04-14 01:23:34 +0800138 confirmed = None
139 """An optional boolean flag to indicate if the region data is confirmed."""
140
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800141 FIELDS = ['region_code', 'description', 'keyboards',
Hung-Te Lin1a14cc42015-04-14 01:23:34 +0800142 'time_zones', 'locales', 'keyboard_mechanical_layout',
143 'regulatory_domain']
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800144 """Names of fields that define the region."""
145
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800146 def __init__(self, region_code, keyboards, time_zones, locales,
147 keyboard_mechanical_layout, description=None, notes=None,
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800148 regdomain=None):
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800149 """Constructor.
150
151 Args:
152 region_code: See :py:attr:`region_code`.
153 keyboards: See :py:attr:`keyboards`. A single string is accepted for
154 backward compatibility.
155 time_zones: See :py:attr:`time_zones`.
156 locales: See :py:attr:`locales`. A single string is accepted
157 for backward compatibility.
158 keyboard_mechanical_layout: See :py:attr:`keyboard_mechanical_layout`.
159 description: See :py:attr:`description`.
160 notes: See :py:attr:`notes`.
Hung-Te Lin436b6cc2015-04-03 12:15:47 +0800161 regdomain: See :py:attr:`regulatory_domain`.
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800162 """
Hung-Te Lin436b6cc2015-04-03 12:15:47 +0800163
164 def regdomain_from_region(region):
165 if region.find('.') >= 0:
166 region = region[:region.index('.')]
167 if len(region) == 2:
168 return region.upper()
169 return None
170
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800171 # Quick check: should be 'gb', not 'uk'
172 if region_code == 'uk':
173 raise RegionException("'uk' is not a valid region code (use 'gb')")
174
175 self.region_code = region_code
176 self.keyboards = MakeList(keyboards)
177 self.time_zones = MakeList(time_zones)
178 self.locales = MakeList(locales)
179 self.keyboard_mechanical_layout = keyboard_mechanical_layout
180 self.description = description or region_code
181 self.notes = notes
Hung-Te Lin436b6cc2015-04-03 12:15:47 +0800182 self.regulatory_domain = (regdomain or regdomain_from_region(region_code))
Hung-Te Lin1a14cc42015-04-14 01:23:34 +0800183 self.confirmed = None
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800184
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800185 for f in (self.keyboards, self.locales):
186 assert all(isinstance(x, str) for x in f), (
187 'Expected a list of strings, not %r' % f)
188 for f in self.keyboards:
189 assert KEYBOARD_PATTERN.match(f), (
190 'Keyboard pattern %r does not match %r' % (
191 f, KEYBOARD_PATTERN.pattern))
192 for f in self.locales:
193 assert LOCALE_PATTERN.match(f), (
194 'Locale %r does not match %r' % (
195 f, LOCALE_PATTERN.pattern))
Hung-Te Lin436b6cc2015-04-03 12:15:47 +0800196 assert (self.regulatory_domain and
197 len(self.regulatory_domain) == 2 and
198 self.regulatory_domain.upper() == self.regulatory_domain), (
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800199 'Regulatory domain settings error for region %s' % region_code)
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800200
201 def __repr__(self):
202 return 'Region(%s)' % (', '.join([getattr(self, x) for x in self.FIELDS]))
203
204 def GetFieldsDict(self):
205 """Returns a dict of all substantive fields.
206
207 notes and description are excluded.
208 """
209 return dict((k, getattr(self, k)) for k in self.FIELDS)
210
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800211KML = Region.KeyboardMechanicalLayout
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800212REGIONS_LIST = [
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800213 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800214 'au', 'xkb:us::eng', 'Australia/Sydney', 'en-AU', KML.ANSI,
215 'Australia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800216 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800217 'be', 'xkb:be::nld', 'Europe/Brussels', 'en-GB', KML.ISO,
218 'Belgium', (
219 'Flemish (Belgian Dutch) keyboard; British English language for '
220 'neutrality')),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800221 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800222 'br', 'xkb:br::por', 'America/Sao_Paulo', 'pt-BR', KML.ABNT2,
223 'Brazil (ABNT2)', (
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800224 'ABNT2 = ABNT NBR 10346 variant 2. This is the preferred layout '
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800225 'for Brazil. ABNT2 is mostly an ISO layout, but it 12 keys between '
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800226 'the shift keys; see http://goo.gl/twA5tq')),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800227 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800228 'br.abnt', 'xkb:br::por', 'America/Sao_Paulo', 'pt-BR', KML.ISO,
229 'Brazil (ABNT)', (
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800230 'Like ABNT2, but lacking the extra key to the left of the right '
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800231 'shift key found in that layout. ABNT2 (the "br" region) is '
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800232 'preferred to this layout')),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800233 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800234 'br.usintl', 'xkb:us:intl:eng', 'America/Sao_Paulo', 'pt-BR', KML.ANSI,
235 'Brazil (US Intl)', (
236 'Brazil with US International keyboard layout. ABNT2 ("br") and '
237 'ABNT1 ("br.abnt1 ") are both preferred to this.')),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800238 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800239 'ca.ansi', 'xkb:us::eng', 'America/Toronto', 'en-CA', KML.ANSI,
240 'Canada (US keyboard)', (
241 'Canada with US (ANSI) keyboard. Only allowed if there are '
242 'separate US English, Canadian English, and French SKUs. '
243 'Not for en/fr hybrid ANSI keyboards; for that you would want '
244 'ca.hybridansi. See http://goto/cros-canada')),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800245 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800246 'ca.fr', 'xkb:ca::fra', 'America/Toronto', 'fr-CA', KML.ISO,
247 'Canada (French keyboard)', (
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800248 'Canadian French (ISO) keyboard. The most common configuration for '
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800249 'Canadian French SKUs. See http://goto/cros-canada')),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800250 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800251 'ca.hybrid', 'xkb:ca:eng:eng', 'America/Toronto', 'en-CA', KML.ISO,
252 'Canada (hybrid ISO)', (
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800253 'Canada with hybrid (ISO) xkb:ca:eng:eng + xkb:ca::fra keyboard, '
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800254 'defaulting to English language and keyboard. Used only if there '
255 'needs to be a single SKU for all of Canada. See '
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800256 'http://goto/cros-canada')),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800257 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800258 'ca.hybridansi', 'xkb:ca:eng:eng', 'America/Toronto', 'en-CA', KML.ANSI,
259 'Canada (hybrid ANSI)', (
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800260 'Canada with hybrid (ANSI) xkb:ca:eng:eng + xkb:ca::fra keyboard, '
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800261 'defaulting to English language and keyboard. Used only if there '
262 'needs to be a single SKU for all of Canada. See '
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800263 'http://goto/cros-canada')),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800264 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800265 'ca.multix', 'xkb:ca:multix:fra', 'America/Toronto', 'fr-CA', KML.ISO,
266 'Canada (multilingual)', (
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800267 "Canadian Multilingual keyboard; you probably don't want this. See "
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800268 'http://goto/cros-canada')),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800269 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800270 'ch', 'xkb:ch::ger', 'Europe/Zurich', 'de-CH', KML.ISO,
271 'Switzerland', (
272 'German keyboard')),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800273 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800274 'de', 'xkb:de::ger', 'Europe/Berlin', 'de', KML.ISO,
275 'Germany'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800276 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800277 'es', 'xkb:es::spa', 'Europe/Madrid', 'es', KML.ISO,
278 'Spain'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800279 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800280 'fi', 'xkb:fi::fin', 'Europe/Helsinki', 'fi', KML.ISO,
281 'Finland'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800282 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800283 'fr', 'xkb:fr::fra', 'Europe/Paris', 'fr', KML.ISO,
284 'France'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800285 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800286 'gb', 'xkb:gb:extd:eng', 'Europe/London', 'en-GB', KML.ISO,
287 'UK'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800288 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800289 'ie', 'xkb:gb:extd:eng', 'Europe/Dublin', 'en-GB', KML.ISO,
290 'Ireland'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800291 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800292 'in', 'xkb:us::eng', 'Asia/Calcutta', 'en-US', KML.ANSI,
293 'India'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800294 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800295 'it', 'xkb:it::ita', 'Europe/Rome', 'it', KML.ISO,
296 'Italy'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800297 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800298 'latam-es-419', 'xkb:es::spa', 'America/Mexico_City', 'es-419', KML.ISO,
299 'Hispanophone Latin America', (
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800300 'Spanish-speaking countries in Latin America, using the Iberian '
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800301 '(Spain) Spanish keyboard, which is increasingly dominant in '
302 'Latin America. Known to be correct for '
303 'Chile, Colombia, Mexico, Peru; '
304 'still unconfirmed for other es-419 countries. The old Latin '
305 'American layout (xkb:latam::spa) has not been approved; before '
306 'using that you must seek review through http://goto/vpdsettings. '
307 'See also http://goo.gl/Iffuqh. Note that 419 is the UN M.49 '
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800308 'region code for Latin America'), 'MX'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800309 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800310 'my', 'xkb:us::eng', 'Asia/Kuala_Lumpur', 'ms', KML.ANSI,
311 'Malaysia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800312 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800313 'nl', 'xkb:us:intl:eng', 'Europe/Amsterdam', 'nl', KML.ANSI,
314 'Netherlands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800315 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800316 'nordic', 'xkb:se::swe', 'Europe/Stockholm', 'en-US', KML.ISO,
317 'Nordics', (
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800318 'Unified SKU for Sweden, Norway, and Denmark. This defaults '
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800319 'to Swedish keyboard layout, but starts with US English language '
320 'for neutrality. Use if there is a single combined SKU for Nordic '
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800321 'countries.'), 'SE'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800322 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800323 'nz', 'xkb:us::eng', 'Pacific/Auckland', 'en-NZ', KML.ANSI,
324 'New Zealand'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800325 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800326 'ph', 'xkb:us::eng', 'Asia/Manila', 'en-US', KML.ANSI,
327 'Philippines'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800328 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800329 'ru', ['xkb:us::eng', 'xkb:ru::rus'], 'Europe/Moscow', 'ru', KML.ANSI,
330 'Russia', (
331 'For R31+ only; R30 and earlier must use US keyboard for login')),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800332 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800333 'se', 'xkb:se::swe', 'Europe/Stockholm', 'sv', KML.ISO,
334 'Sweden', (
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800335 'Use this if there separate SKUs for Nordic countries (Sweden, '
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800336 'Norway, and Denmark), or the device is only shipping to Sweden. '
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800337 "If there is a single unified SKU, use 'nordic' instead.")),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800338 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800339 'sg', 'xkb:us::eng', 'Asia/Singapore', 'en-GB', KML.ANSI,
340 'Singapore'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800341 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800342 'us', 'xkb:us::eng', 'America/Los_Angeles', 'en-US', KML.ANSI,
343 'United States'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800344 Region(
Bao-Duy Tranf79b8f92019-07-04 17:12:01 +1000345 'jp', ['xkb:jp::jpn', 'ime:jp:mozc_jp'], 'Asia/Tokyo', 'ja', KML.JIS,
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800346 'Japan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800347 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800348 'za', 'xkb:gb:extd:eng', 'Africa/Johannesburg', 'en-ZA', KML.ISO,
349 'South Africa'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800350 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800351 'ng', 'xkb:us:intl:eng', 'Africa/Lagos', 'en-GB', KML.ANSI,
352 'Nigeria'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800353 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800354 'hk', ['xkb:us::eng', 'ime:zh-t:cangjie', 'ime:zh-t:quick',
355 'ime:zh-t:array', 'ime:zh-t:dayi', 'ime:zh-t:zhuyin',
356 'ime:zh-t:pinyin'], 'Asia/Hong_Kong', ['zh-TW', 'en-GB',
357 'zh-CN'], KML.ANSI,
358 'Hong Kong'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800359 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800360 'gcc', ['xkb:us::eng', 'm17n:ar', 't13n:ar'], 'Asia/Riyadh', [
361 'ar', 'en-GB'],
362 KML.ANSI,
363 'Gulf Cooperation Council (GCC)', (
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800364 'GCC is a regional intergovernmental political and economic '
365 'union consisting of all Arab states of the Persian Gulf except '
366 'for Iraq. Its member states are the Islamic monarchies of '
367 'Bahrain, Kuwait, Oman, Qatar, Saudi Arabia, and the United Arab '
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800368 'Emirates.'), 'SA'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800369 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800370 'cz', ['xkb:cz::cze', 'xkb:cz:qwerty:cze'], 'Europe/Prague', [
371 'cs', 'en-GB'], KML.ISO,
372 'Czech Republic'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800373 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800374 'th', ['xkb:us::eng', 'm17n:th', 'm17n:th_pattajoti',
375 'm17n:th_tis'], 'Asia/Bangkok', ['th', 'en-GB'], KML.ANSI,
376 'Thailand'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800377 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800378 'id', 'xkb:us::ind', 'Asia/Jakarta', ['id', 'en-GB'], KML.ANSI,
379 'Indonesia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800380 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800381 'tw', ['xkb:us::eng', 'ime:zh-t:zhuyin', 'ime:zh-t:array',
382 'ime:zh-t:dayi', 'ime:zh-t:cangjie', 'ime:zh-t:quick',
383 'ime:zh-t:pinyin'], 'Asia/Taipei', ['zh-TW', 'en-US'], KML.ANSI,
384 'Taiwan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800385 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800386 'pl', 'xkb:pl::pol', 'Europe/Warsaw', ['pl', 'en-GB'], KML.ANSI,
387 'Poland'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800388 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800389 'gr', ['xkb:us::eng', 'xkb:gr::gre', 't13n:el'], 'Europe/Athens', [
390 'el', 'en-GB'], KML.ANSI,
391 'Greece'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800392 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800393 'il', ['xkb:us::eng', 'xkb:il::heb', 't13n:he'], 'Asia/Jerusalem', [
394 'he', 'en-US', 'ar'], KML.ANSI,
395 'Israel'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800396 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800397 'pt', 'xkb:pt::por', 'Europe/Lisbon', ['pt-PT', 'en-GB'], KML.ISO,
398 'Portugal'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800399 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800400 'ro', ['xkb:us::eng', 'xkb:ro::rum'], 'Europe/Bucharest', [
401 'ro', 'hu', 'de', 'en-GB'], KML.ISO,
402 'Romania'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800403 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800404 'kr', ['xkb:us::eng', 'ime:ko:hangul'], 'Asia/Seoul', [
405 'ko', 'en-US'], KML.ANSI,
406 'South Korea'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800407 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800408 'ae', 'xkb:us::eng', 'Asia/Dubai', 'ar', KML.ANSI,
409 'UAE'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800410 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800411 'za.us', 'xkb:us::eng', 'Africa/Johannesburg', 'en-ZA', KML.ANSI,
412 'South Africa'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800413 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800414 'vn', ['xkb:us::eng', 'm17n:vi_telex', 'm17n:vi_vni', 'm17n:vi_viqr',
415 'm17n:vi_tcvn'], 'Asia/Ho_Chi_Minh', ['vi', 'en-GB', 'en-US',
416 'fr', 'zh-TW'], KML.ANSI,
417 'Vietnam'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800418 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800419 'at', ['xkb:de::ger', 'xkb:de:neo:ger'], 'Europe/Vienna', [
420 'de', 'en-GB'], KML.ISO,
421 'Austria'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800422 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800423 'sk', ['xkb:us::eng', 'xkb:sk::slo'], 'Europe/Bratislava', [
424 'sk', 'hu', 'cs', 'en-GB'], KML.ISO,
425 'Slovakia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800426 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800427 'ch.usintl', 'xkb:us:intl:eng', 'Europe/Zurich', 'en-US', KML.ANSI,
428 'Switzerland (US Intl)', (
429 'Switzerland with US International keyboard layout.')),
Hung-Te Lindf179fd2016-05-12 19:22:13 +0800430 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800431 'pe', 'xkb:latam::spa', 'America/Lima', 'es-419', KML.ANSI,
432 'Peru'),
Hung-Te Lindf179fd2016-05-12 19:22:13 +0800433 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800434 'sa', 'xkb:us::eng', 'Asia/Riyadh', ['ar', 'en'], KML.ANSI,
435 'Saudi Arabia'),
Hung-Te Lindf179fd2016-05-12 19:22:13 +0800436 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800437 'mx', 'xkb:latam::spa', 'America/Mexico_City', 'es-MX', KML.ANSI,
438 'Mexico'),
Hung-Te Lindf179fd2016-05-12 19:22:13 +0800439 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800440 'cl', 'xkb:latam::spa', 'America/Santiago', 'es-419', KML.ANSI,
441 'Chile'),
Hung-Te Lindf179fd2016-05-12 19:22:13 +0800442 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800443 'kw', ['xkb:us::eng', 'm17n:ar', 't13n:ar'], 'Asia/Kuwait', [
444 'ar', 'en'], KML.ANSI,
445 'Kuwait'),
Hung-Te Lindf179fd2016-05-12 19:22:13 +0800446 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800447 'uy', 'xkb:latam::spa', 'America/Montevideo', 'es-419', KML.ANSI,
448 'Uruguay'),
Hung-Te Lin37fbbbf2016-06-28 17:19:38 +0800449 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800450 'tr', ['xkb:tr::tur', 'xkb:tr:f:tur'], 'Europe/Istanbul', [
451 'tr', 'en-GB'], KML.ISO,
452 'Turkey'),
Hung-Te Lin639a05b2016-12-02 12:39:19 +0800453 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800454 'ar', 'xkb:latam::spa', 'America/Argentina/Buenos_Aires', [
paris_yeh8652e752017-06-06 14:38:23 +0800455 'es-AR', ], KML.ISO,
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800456 'Argentina'),
Hung-Te Lincf2f02b2017-03-20 14:58:20 +0800457 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800458 'gb.usext', 'xkb:us:altgr-intl:eng', 'Europe/London', 'en-GB', KML.ISO,
459 'UK (US extended keyboard)', (
460 'GB with US extended keyboard')),
Hung-Te Linfe0165d2018-05-02 19:15:03 +0800461 Region(
462 'bg', ['xkb:bg::bul', 'xkb:bg:phonetic:bul'], 'Europe/Sofia', [
463 'bg', 'tr', 'en-US'], KML.ANSI,
464 'Bulgaria'),
Wei-Han Chen763e6722018-11-16 12:23:19 +0800465 Region(
Bao-Duy Tranf79b8f92019-07-04 17:12:01 +1000466 'jp.us', ['xkb:us::eng', 'ime:jp:mozc_us'], 'Asia/Tokyo', 'ja',
467 KML.ANSI, 'Japan with US keyboard'),
Marco Chen233ea672018-09-19 21:46:49 +0800468 Region(
469 'is', 'xkb:is::ice', 'Atlantic/Reykjavik', ['is', 'en-GB'], KML.ISO,
470 'Iceland'),
Marco Chen2b3a91c2019-05-13 23:22:59 +0800471 Region(
472 'us.intl', 'xkb:us:intl:eng', 'America/Los_Angeles', 'en-US', KML.ANSI,
473 'US (English Intl)'),
Marco Chen773fe7f2019-05-13 23:08:18 +0800474 Region(
475 'co', 'xkb:latam::spa', 'America/Bogota', 'es-CO', KML.ANSI,
476 'Colombia'),
Stimim Chen053650c2020-04-30 11:49:10 +0800477 Region(
478 'hr', 'xkb:hr::scr', 'Europe/Zagreb', ['hr', 'en-GB'], KML.ISO,
479 'Croatia'),
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800480 ]
Hung-Te Lin37fbbbf2016-06-28 17:19:38 +0800481
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800482"""A list of :py:class:`regions.Region` objects for
483all **confirmed** regions. A confirmed region is a region whose
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800484properties are known to be correct and valid: all contents (locale / timezone /
485keyboards) are supported by Chrome."""
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800486
487
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800488UNCONFIRMED_REGIONS_LIST = [
489 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800490 'bd', 'xkb:bd::ben', 'Asia/Dhaka', ['bn-BD', 'en'], KML.ANSI,
491 'Bangladesh'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800492 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800493 'bf', 'xkb:bf::fra', 'Africa/Ouagadougou', 'fr-BF', KML.ANSI,
494 'Burkina Faso'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800495 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800496 'ba', 'xkb:ba::bos', 'Europe/Sarajevo', 'bs', KML.ANSI,
497 'Bosnia and Herzegovina'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800498 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800499 'bb', 'xkb:bb::eng', 'America/Barbados', 'en-BB', KML.ANSI,
500 'Barbados'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800501 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800502 'wf', 'xkb:us::eng', 'Pacific/Wallis', ['wls', 'fud'], KML.ANSI,
503 'Wallis and Futuna'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800504 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800505 'bl', 'xkb:bl::fra', 'America/St_Barthelemy', 'fr', KML.ANSI,
506 'Saint Barthelemy'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800507 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800508 'bm', 'xkb:bm::eng', 'Atlantic/Bermuda', ['en-BM', 'pt'], KML.ANSI,
509 'Bermuda'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800510 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800511 'bn', 'xkb:bn::msa', 'Asia/Brunei', ['ms-BN', 'en-BN'], KML.ANSI,
512 'Brunei'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800513 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800514 'bo', 'xkb:latam::spa', 'America/La_Paz', ['es-419', 'qu'], KML.ANSI,
515 'Bolivia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800516 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800517 'bh', 'xkb:bh::ara', 'Asia/Bahrain', ['ar', 'en', 'fa', 'ru'], KML.ANSI,
518 'Bahrain'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800519 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800520 'bi', 'xkb:bi::fra', 'Africa/Bujumbura', ['fr-BI', 'rn'], KML.ANSI,
521 'Burundi'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800522 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800523 'bj', 'xkb:bj::fra', 'Africa/Porto-Novo', 'fr-BJ', KML.ANSI,
524 'Benin'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800525 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800526 'bt', 'xkb:bt::dzo', 'Asia/Thimphu', 'dz', KML.ANSI,
527 'Bhutan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800528 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800529 'jm', 'xkb:jm::eng', 'America/Jamaica', 'en-JM', KML.ANSI,
530 'Jamaica'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800531 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800532 'bw', 'xkb:bw::eng', 'Africa/Gaborone', ['en-BW', 'tn-BW'], KML.ANSI,
533 'Botswana'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800534 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800535 'ws', 'xkb:ws::smo', 'Pacific/Apia', ['sm', 'en-WS'], KML.ANSI,
536 'Samoa'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800537 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800538 'bq', 'xkb:bq::nld', 'America/Kralendijk', ['nl', 'en'], KML.ANSI,
539 'Bonaire, Saint Eustatius and Saba '),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800540 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800541 'bs', 'xkb:bs::eng', 'America/Nassau', 'en-BS', KML.ANSI,
542 'Bahamas'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800543 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800544 'je', 'xkb:je::eng', 'Europe/Jersey', ['en', 'pt'], KML.ANSI,
545 'Jersey'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800546 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800547 'by', 'xkb:by::bel', 'Europe/Minsk', ['be', 'ru'], KML.ANSI,
548 'Belarus'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800549 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800550 'bz', 'xkb:bz::eng', 'America/Belize', ['en-BZ', 'es'], KML.ANSI,
551 'Belize'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800552 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800553 'rw', 'xkb:rw::kin', 'Africa/Kigali', ['rw', 'en-RW'], KML.ANSI,
554 'Rwanda'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800555 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800556 'rs', 'xkb:rs::srp', 'Europe/Belgrade', ['sr', 'hu', 'bs'], KML.ANSI,
557 'Serbia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800558 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800559 'tl', 'xkb:us::eng', 'Asia/Dili', ['tet', 'pt-TL', 'en'], KML.ANSI,
560 'East Timor'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800561 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800562 're', 'xkb:re::fra', 'Indian/Reunion', 'fr-RE', KML.ANSI,
563 'Reunion'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800564 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800565 'tm', 'xkb:tm::tuk', 'Asia/Ashgabat', ['tk', 'ru', 'uz'], KML.ANSI,
566 'Turkmenistan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800567 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800568 'tj', 'xkb:tj::tgk', 'Asia/Dushanbe', ['tg', 'ru'], KML.ANSI,
569 'Tajikistan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800570 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800571 'tk', 'xkb:us::eng', 'Pacific/Fakaofo', ['tkl', 'en-TK'], KML.ANSI,
572 'Tokelau'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800573 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800574 'gw', 'xkb:gw::por', 'Africa/Bissau', ['pt-GW', 'pov'], KML.ANSI,
575 'Guinea-Bissau'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800576 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800577 'gu', 'xkb:gu::eng', 'Pacific/Guam', ['en-GU', 'ch-GU'], KML.ANSI,
578 'Guam'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800579 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800580 'gt', 'xkb:latam::spa', 'America/Guatemala', 'es-419', KML.ANSI,
581 'Guatemala'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800582 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800583 'gs', 'xkb:gs::eng', 'Atlantic/South_Georgia', 'en', KML.ANSI,
584 'South Georgia and the South Sandwich Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800585 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800586 'gq', 'xkb:gq::spa', 'Africa/Malabo', ['es-419', 'fr'], KML.ANSI,
587 'Equatorial Guinea'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800588 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800589 'gp', 'xkb:gp::fra', 'America/Guadeloupe', 'fr-GP', KML.ANSI,
590 'Guadeloupe'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800591 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800592 'gy', 'xkb:gy::eng', 'America/Guyana', 'en-GY', KML.ANSI,
593 'Guyana'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800594 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800595 'gg', 'xkb:gg::eng', 'Europe/Guernsey', ['en', 'fr'], KML.ANSI,
596 'Guernsey'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800597 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800598 'gf', 'xkb:gf::fra', 'America/Cayenne', 'fr-GF', KML.ANSI,
599 'French Guiana'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800600 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800601 'ge', 'xkb:ge::geo', 'Asia/Tbilisi', 'ka', KML.ANSI,
602 'Georgia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800603 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800604 'gd', 'xkb:gd::eng', 'America/Grenada', 'en-GD', KML.ANSI,
605 'Grenada'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800606 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800607 'ga', 'xkb:ga::fra', 'Africa/Libreville', 'fr-GA', KML.ANSI,
608 'Gabon'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800609 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800610 'sv', 'xkb:latam::spa', 'America/El_Salvador', 'es-419', KML.ANSI,
611 'El Salvador'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800612 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800613 'gn', 'xkb:gn::fra', 'Africa/Conakry', 'fr-GN', KML.ANSI,
614 'Guinea'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800615 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800616 'gm', 'xkb:gm::eng', 'Africa/Banjul', ['en-GM', 'mnk', 'wof'], KML.ANSI,
617 'Gambia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800618 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800619 'gl', 'xkb:gl::kal', ['America/Godthab', 'America/Danmarkshavn',
620 'America/Scoresbysund', 'America/Thule'], [
621 'kl', 'da-GL', 'en'], KML.ANSI,
622 'Greenland'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800623 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800624 'gi', 'xkb:gi::eng', 'Europe/Gibraltar', ['en-GI', 'es'], KML.ANSI,
625 'Gibraltar'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800626 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800627 'gh', 'xkb:gh::eng', 'Africa/Accra', ['en-GH', 'ak', 'ee'], KML.ANSI,
628 'Ghana'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800629 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800630 'om', 'xkb:om::ara', 'Asia/Muscat', ['ar', 'en', 'bal'], KML.ANSI,
631 'Oman'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800632 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800633 'tn', 'xkb:tn::ara', 'Africa/Tunis', ['ar', 'fr'], KML.ANSI,
634 'Tunisia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800635 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800636 'jo', 'xkb:jo::ara', 'Asia/Amman', ['ar', 'en'], KML.ANSI,
637 'Jordan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800638 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800639 'hn', 'xkb:latam::spa', 'America/Tegucigalpa', 'es-HN', KML.ANSI,
640 'Honduras'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800641 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800642 'ht', 'xkb:ht::hat', 'America/Port-au-Prince', ['ht'], KML.ANSI,
643 'Haiti'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800644 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800645 'hu', ['xkb:us::eng', 'xkb:hu::hun'], 'Europe/Budapest', [
646 'hu', 'en-GB'], KML.ISO,
647 'Hungary'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800648 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800649 've', 'xkb:latam::spa', 'America/Caracas', 'es-419', KML.ANSI,
650 'Venezuela'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800651 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800652 'pr', 'xkb:pr::eng', 'America/Puerto_Rico', ['en-PR'], KML.ANSI,
653 'Puerto Rico'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800654 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800655 'ps', 'xkb:ps::ara', ['Asia/Gaza', 'Asia/Hebron'], 'ar', KML.ANSI,
656 'Palestinian Territory'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800657 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800658 'pw', 'xkb:us::eng', 'Pacific/Palau', ['pau', 'sov', 'en-PW', 'tox',
659 'ja', 'fil', 'zh'], KML.ANSI,
660 'Palau'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800661 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800662 'sj', 'xkb:sj::nor', 'Arctic/Longyearbyen', ['no', 'ru'], KML.ANSI,
663 'Svalbard and Jan Mayen'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800664 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800665 'py', 'xkb:latam::spa', 'America/Asuncion', ['es-419', 'gn'], KML.ANSI,
666 'Paraguay'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800667 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800668 'iq', 'xkb:iq::ara', 'Asia/Baghdad', ['ar', 'ku', 'hy'], KML.ANSI,
669 'Iraq'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800670 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800671 'pa', 'xkb:latam::spa', 'America/Panama', ['es-419', 'en'], KML.ANSI,
672 'Panama'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800673 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800674 'pf', 'xkb:pf::fra', ['Pacific/Tahiti', 'Pacific/Marquesas',
675 'Pacific/Gambier'], ['fr-PF', 'ty'], KML.ANSI,
676 'French Polynesia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800677 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800678 'pg', 'xkb:pg::eng', ['Pacific/Port_Moresby',
679 'Pacific/Bougainville'], ['en-PG', 'ho', 'meu',
680 'tpi'], KML.ANSI,
681 'Papua New Guinea'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800682 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800683 'pk', 'xkb:pk::urd', 'Asia/Karachi', ['ur-PK', 'en-PK', 'pa', 'sd',
684 'ps', 'brh'], KML.ANSI,
685 'Pakistan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800686 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800687 'pn', 'xkb:pn::eng', 'Pacific/Pitcairn', 'en-PN', KML.ANSI,
688 'Pitcairn'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800689 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800690 'pm', 'xkb:pm::fra', 'America/Miquelon', 'fr-PM', KML.ANSI,
691 'Saint Pierre and Miquelon'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800692 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800693 'zm', 'xkb:zm::eng', 'Africa/Lusaka', ['en-ZM', 'bem', 'loz', 'lun',
694 'lue', 'ny', 'toi'], KML.ANSI,
695 'Zambia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800696 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800697 'eh', 'xkb:eh::ara', 'Africa/El_Aaiun', ['ar', 'mey'], KML.ANSI,
698 'Western Sahara'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800699 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800700 'ee', 'xkb:ee::est', 'Europe/Tallinn', ['et', 'ru', 'en-GB'], KML.ISO,
701 'Estonia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800702 Region(
Hung-Te Lin47da9092017-03-20 15:01:56 +0800703 'eg', 'xkb:eg::ara', 'Africa/Cairo', ['ar', 'en', 'fr'],
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800704 KML.ANSI, 'Egypt'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800705 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800706 'ec', 'xkb:latam::spa', ['America/Guayaquil'], 'es-419', KML.ANSI,
707 'Ecuador'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800708 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800709 'sb', 'xkb:sb::eng', 'Pacific/Guadalcanal', ['en-SB', 'tpi'], KML.ANSI,
710 'Solomon Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800711 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800712 'et', 'xkb:et::amh', 'Africa/Addis_Ababa', ['am', 'en-ET', 'om-ET',
713 'ti-ET'], KML.ANSI,
714 'Ethiopia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800715 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800716 'so', 'xkb:so::som', 'Africa/Mogadishu', ['so-SO', 'ar'], KML.ANSI,
717 'Somalia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800718 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800719 'zw', 'xkb:zw::eng', 'Africa/Harare', ['en-ZW', 'sn', 'nr'], KML.ANSI,
720 'Zimbabwe'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800721 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800722 'er', 'xkb:er::aar', 'Africa/Asmara', ['aa-ER', 'ar', 'tig', 'kun',
723 'ti-ER'], KML.ANSI,
724 'Eritrea'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800725 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800726 'me', 'xkb:me::srp', 'Europe/Podgorica', ['sr', 'hu', 'bs', 'sq', 'hr',
727 'rom'], KML.ANSI,
728 'Montenegro'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800729 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800730 'md', 'xkb:md::ron', 'Europe/Chisinau', ['ro', 'ru', 'gag'], KML.ANSI,
731 'Moldova'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800732 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800733 'mg', 'xkb:mg::fra', 'Indian/Antananarivo', ['fr-MG', 'mg'], KML.ANSI,
734 'Madagascar'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800735 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800736 'mf', 'xkb:mf::fra', 'America/Marigot', 'fr', KML.ANSI, 'Saint Martin'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800737 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800738 'ma', 'xkb:ma::ara', 'Africa/Casablanca', ['ar', 'fr'], KML.ANSI,
739 'Morocco'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800740 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800741 'mc', 'xkb:mc::fra', 'Europe/Monaco', ['fr-MC', 'en', 'it'], KML.ANSI,
742 'Monaco'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800743 Region(
744 'uz', 'xkb:uz::uzb', ['Asia/Samarkand', 'Asia/Tashkent'],
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800745 ['uz', 'ru', 'tg'], KML.ANSI, 'Uzbekistan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800746 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800747 'mm', 'xkb:mm::mya', 'Asia/Rangoon', 'my', KML.ANSI, 'Myanmar',
748 None),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800749 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800750 'ml', 'xkb:ml::fra', 'Africa/Bamako', ['fr-ML', 'bm'], KML.ANSI,
751 'Mali'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800752 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800753 'mo', 'xkb:mo::zho', 'Asia/Macau', ['zh', 'zh-MO', 'pt'], KML.ANSI,
754 'Macao'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800755 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800756 'mn', 'xkb:mn::mon', ['Asia/Ulaanbaatar', 'Asia/Hovd',
757 'Asia/Choibalsan'], ['mn', 'ru'], KML.ANSI,
758 'Mongolia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800759 Region(
Clark Chung0005a702020-05-26 16:34:52 +0800760 'mh', 'xkb:mh::mah', ['Pacific/Majuro'], ['mh', 'en-MH'], KML.ANSI,
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800761 'Marshall Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800762 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800763 'mk', 'xkb:mk::mkd', 'Europe/Skopje', ['mk', 'sq', 'tr'], KML.ANSI,
764 'Macedonia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800765 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800766 'mu', 'xkb:mu::eng', 'Indian/Mauritius', ['en-MU', 'bho'], KML.ANSI,
767 'Mauritius'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800768 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800769 'mt', ['xkb:us::eng'], 'Europe/Malta', ['mt', 'en-GB'], KML.ISO,
770 'Malta'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800771 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800772 'mw', 'xkb:mw::nya', 'Africa/Blantyre', ['ny', 'yao', 'tum'], KML.ANSI,
773 'Malawi'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800774 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800775 'mv', 'xkb:mv::div', 'Indian/Maldives', ['dv', 'en'], KML.ANSI,
776 'Maldives'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800777 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800778 'mq', 'xkb:mq::fra', 'America/Martinique', 'fr-MQ', KML.ANSI,
779 'Martinique'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800780 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800781 'mp', 'xkb:us::eng', 'Pacific/Saipan', ['fil', 'tl', 'zh', 'ch-MP',
782 'en-MP'], KML.ANSI,
783 'Northern Mariana Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800784 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800785 'ms', 'xkb:ms::eng', 'America/Montserrat', 'en-MS', KML.ANSI,
786 'Montserrat'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800787 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800788 'mr', 'xkb:mr::ara', 'Africa/Nouakchott', ['ar', 'fuc', 'snk', 'fr',
789 'mey', 'wo'], KML.ANSI,
790 'Mauritania'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800791 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800792 'im', 'xkb:im::eng', 'Europe/Isle_of_Man', ['en', 'gv'], KML.ANSI,
793 'Isle of Man'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800794 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800795 'ug', 'xkb:ug::eng', 'Africa/Kampala', ['en-UG', 'lg', 'ar'], KML.ANSI,
796 'Uganda'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800797 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800798 'tz', 'xkb:tz::swa', 'Africa/Dar_es_Salaam', ['sw-TZ', 'en'], KML.ANSI,
799 'Tanzania'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800800 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800801 'io', 'xkb:io::eng', 'Indian/Chagos', 'en-IO', KML.ANSI,
802 'British Indian Ocean Territory'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800803 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800804 'sh', 'xkb:sh::eng', 'Atlantic/St_Helena', 'en-SH', KML.ANSI,
805 'Saint Helena'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800806 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800807 'fj', 'xkb:fj::eng', 'Pacific/Fiji', ['en-FJ', 'fj'], KML.ANSI,
808 'Fiji'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800809 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800810 'fk', 'xkb:fk::eng', 'Atlantic/Stanley', 'en-FK', KML.ANSI,
811 'Falkland Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800812 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800813 'fm', 'xkb:fm::eng', [
814 'Pacific/Chuuk', 'Pacific/Pohnpei', 'Pacific/Kosrae'], [
815 'en-FM', 'chk', 'pon', 'yap', 'kos', 'uli', 'woe', 'nkr',
816 'kpg'], KML.ANSI,
817 'Micronesia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800818 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800819 'fo', 'xkb:fo::fao', 'Atlantic/Faroe', ['fo', 'da-FO'], KML.ANSI,
820 'Faroe Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800821 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800822 'ni', 'xkb:latam::spa', 'America/Managua', ['es-419', 'en'], KML.ANSI,
823 'Nicaragua'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800824 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800825 'no', 'xkb:no::nor', 'Europe/Oslo', ['no', 'nb', 'nn', 'se'], KML.ISO,
826 'Norway'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800827 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800828 'na', 'xkb:na::eng', 'Africa/Windhoek', ['en-NA', 'af', 'de', 'hz',
829 'naq'], KML.ANSI,
830 'Namibia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800831 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800832 'vu', 'xkb:vu::bis', 'Pacific/Efate', ['bi', 'en-VU'], KML.ANSI,
833 'Vanuatu'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800834 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800835 'nc', 'xkb:nc::fra', 'Pacific/Noumea', 'fr-NC', KML.ANSI,
836 'New Caledonia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800837 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800838 'ne', 'xkb:ne::fra', 'Africa/Niamey', ['fr-NE', 'ha', 'kr'], KML.ANSI,
839 'Niger'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800840 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800841 'nf', 'xkb:nf::eng', 'Pacific/Norfolk', 'en-NF', KML.ANSI,
842 'Norfolk Island'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800843 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800844 'np', 'xkb:np::nep', 'Asia/Kathmandu', ['ne', 'en'], KML.ANSI,
845 'Nepal'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800846 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800847 'nr', 'xkb:nr::nau', 'Pacific/Nauru', ['na', 'en-NR'], KML.ANSI,
848 'Nauru'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800849 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800850 'nu', 'xkb:us::eng', 'Pacific/Niue', ['niu', 'en-NU'], KML.ANSI,
851 'Niue'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800852 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800853 'ck', 'xkb:ck::eng', 'Pacific/Rarotonga', ['en-CK', 'mi'], KML.ANSI,
854 'Cook Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800855 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800856 'ci', 'xkb:ci::fra', 'Africa/Abidjan', 'fr-CI', KML.ANSI,
857 'Ivory Coast'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800858 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800859 'cn', 'xkb:us::eng', 'Asia/Shanghai', 'zh-CN', KML.ANSI,
860 'China'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800861 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800862 'cm', 'xkb:cm::eng', 'Africa/Douala', ['en-CM', 'fr-CM'], KML.ANSI,
863 'Cameroon'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800864 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800865 'cc', 'xkb:cc::msa', 'Indian/Cocos', ['ms-CC', 'en'], KML.ANSI,
866 'Cocos Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800867 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800868 'cg', 'xkb:cg::fra', 'Africa/Brazzaville', ['fr-CG', 'kg'], KML.ANSI,
869 'Republic of the Congo'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800870 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800871 'cf', 'xkb:cf::fra', 'Africa/Bangui', ['fr-CF', 'sg', 'ln'], KML.ANSI,
872 'Central African Republic'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800873 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800874 'cd', 'xkb:cd::fra', ['Africa/Kinshasa', 'Africa/Lubumbashi'], [
875 'fr-CD', 'ln', 'kg'], KML.ANSI,
876 'Democratic Republic of the Congo'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800877 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800878 'cy', 'xkb:cy::ell', 'Asia/Nicosia', ['el-CY', 'tr-CY'], KML.ANSI,
879 'Cyprus'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800880 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800881 'cx', 'xkb:cx::eng', 'Indian/Christmas', ['en', 'zh'], KML.ANSI,
882 'Christmas Island'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800883 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800884 'cr', 'xkb:latam::spa', 'America/Costa_Rica', ['es-419'], KML.ANSI,
885 'Costa Rica'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800886 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800887 'cw', 'xkb:cw::nld', 'America/Curacao', ['nl'], KML.ANSI, 'Curacao'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800888 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800889 'cv', 'xkb:cv::por', 'Atlantic/Cape_Verde', 'pt-CV', KML.ANSI,
890 'Cape Verde'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800891 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800892 'cu', 'xkb:latam::spa', 'America/Havana', 'es-419', KML.ANSI,
893 'Cuba'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800894 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800895 'sz', 'xkb:sz::eng', 'Africa/Mbabane', ['en-SZ', 'ss-SZ'], KML.ANSI,
896 'Swaziland'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800897 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800898 'sy', 'xkb:sy::ara', 'Asia/Damascus', ['ar', 'ku', 'hy', 'arc', 'fr',
899 'en'], KML.ANSI,
900 'Syria'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800901 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800902 'sx', 'xkb:sx::nld', 'America/Lower_Princes', ['nl', 'en'], KML.ANSI,
903 'Sint Maarten'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800904 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800905 'kg', 'xkb:kg::kir', 'Asia/Bishkek', ['ky', 'uz', 'ru'], KML.ANSI,
906 'Kyrgyzstan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800907 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800908 'ke', 'xkb:ke::eng', 'Africa/Nairobi', ['en-KE', 'sw-KE'], KML.ANSI,
909 'Kenya'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800910 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800911 'ss', 'xkb:ss::eng', 'Africa/Juba', 'en', KML.ANSI,
912 'South Sudan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800913 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800914 'sr', 'xkb:sr::nld', 'America/Paramaribo', ['nl-SR', 'en', 'srn', 'hns',
915 'jv'], KML.ANSI,
916 'Suriname'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800917 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800918 'ki', 'xkb:ki::eng', ['Pacific/Tarawa', 'Pacific/Enderbury',
919 'Pacific/Kiritimati'], ['en-KI', 'gil'], KML.ANSI,
920 'Kiribati'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800921 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800922 'kh', 'xkb:kh::khm', 'Asia/Phnom_Penh', ['km', 'fr', 'en'], KML.ANSI,
923 'Cambodia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800924 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800925 'kn', 'xkb:kn::eng', 'America/St_Kitts', 'en-KN', KML.ANSI,
926 'Saint Kitts and Nevis'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800927 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800928 'km', 'xkb:km::ara', 'Indian/Comoro', ['ar', 'fr-KM'], KML.ANSI,
929 'Comoros'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800930 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800931 'st', 'xkb:st::por', 'Africa/Sao_Tome', 'pt-ST', KML.ANSI,
932 'Sao Tome and Principe'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800933 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800934 'si', 'xkb:si::slv', 'Europe/Ljubljana', ['sl', 'hu', 'it', 'sr', 'de',
935 'hr', 'en-GB'], KML.ISO,
936 'Slovenia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800937 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800938 'kp', 'xkb:kp::kor', 'Asia/Pyongyang', 'ko-KP', KML.ANSI,
939 'North Korea'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800940 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800941 'sn', 'xkb:sn::fra', 'Africa/Dakar', ['fr-SN', 'wo', 'fuc'], KML.ANSI,
942 'Senegal'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800943 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800944 'sm', 'xkb:sm::ita', 'Europe/San_Marino', 'it-SM', KML.ANSI,
945 'San Marino'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800946 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800947 'sl', 'xkb:sl::eng', 'Africa/Freetown', ['en-SL', 'men'], KML.ANSI,
948 'Sierra Leone'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800949 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800950 'sc', 'xkb:sc::eng', 'Indian/Mahe', ['en-SC', 'fr-SC'], KML.ANSI,
951 'Seychelles'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800952 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800953 'kz', 'xkb:kz::kaz', ['Asia/Almaty', 'Asia/Qyzylorda', 'Asia/Aqtobe',
954 'Asia/Aqtau'], ['kk', 'ru'], KML.ANSI,
955 'Kazakhstan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800956 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800957 'ky', 'xkb:ky::eng', 'America/Cayman', 'en-KY', KML.ANSI,
958 'Cayman Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800959 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800960 'sd', 'xkb:sd::ara', 'Africa/Khartoum', ['ar', 'en', 'fia'], KML.ANSI,
961 'Sudan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800962 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800963 'do', 'xkb:latam::spa', 'America/Santo_Domingo', 'es-419', KML.ANSI,
964 'Dominican Republic'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800965 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800966 'dm', 'xkb:dm::eng', 'America/Dominica', 'en-DM', KML.ANSI,
967 'Dominica'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800968 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800969 'dj', 'xkb:dj::fra', 'Africa/Djibouti', ['fr-DJ', 'ar'], KML.ANSI,
970 'Djibouti'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800971 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800972 'dk', 'xkb:dk::dan', 'Europe/Copenhagen', ['da-DK', 'en', 'fo',
973 'de-DK'], KML.ISO,
974 'Denmark'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800975 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800976 'vg', 'xkb:vg::eng', 'America/Tortola', 'en-VG', KML.ANSI,
977 'British Virgin Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800978 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800979 'ye', 'xkb:ye::ara', 'Asia/Aden', 'ar', KML.ANSI,
980 'Yemen'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800981 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800982 'dz', 'xkb:dz::ara', 'Africa/Algiers', 'ar', KML.ANSI,
983 'Algeria'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800984 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800985 'yt', 'xkb:yt::fra', 'Indian/Mayotte', 'fr-YT', KML.ANSI,
986 'Mayotte'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800987 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800988 'um', 'xkb:um::eng', ['Pacific/Johnston', 'Pacific/Midway',
989 'Pacific/Wake'], 'en-UM', KML.ANSI,
990 'United States Minor Outlying Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800991 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800992 'lb', 'xkb:lb::ara', 'Asia/Beirut', ['ar', 'fr-LB', 'en'], KML.ANSI,
993 'Lebanon'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800994 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800995 'lc', 'xkb:lc::eng', 'America/St_Lucia', 'en-LC', KML.ANSI,
996 'Saint Lucia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800997 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800998 'la', 'xkb:la::lao', 'Asia/Vientiane', ['lo', 'fr', 'en'], KML.ANSI,
999 'Laos'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001000 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001001 'tv', 'xkb:us::eng', 'Pacific/Funafuti', ['tvl', 'en', 'sm'], KML.ANSI,
1002 'Tuvalu'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001003 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001004 'tt', 'xkb:tt::eng', 'America/Port_of_Spain', ['en-TT', 'hns', 'fr',
1005 'es', 'zh'], KML.ANSI,
1006 'Trinidad and Tobago'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001007 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001008 'lk', 'xkb:lk::sin', 'Asia/Colombo', ['si', 'ta', 'en'], KML.ANSI,
1009 'Sri Lanka'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001010 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001011 'li', 'xkb:ch::ger', 'Europe/Vaduz', ['de', 'en-GB'], KML.ISO,
1012 'Liechtenstein'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001013 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001014 'lv', 'xkb:lv:apostrophe:lav', 'Europe/Riga', ['lv', 'lt', 'ru',
1015 'en-GB'], KML.ISO,
1016 'Latvia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001017 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001018 'to', 'xkb:to::ton', 'Pacific/Tongatapu', ['to', 'en-TO'], KML.ANSI,
1019 'Tonga'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001020 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001021 'lt', 'xkb:lt::lit', 'Europe/Vilnius', ['lt', 'ru', 'pl'], KML.ISO,
1022 'Lithuania'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001023 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001024 'lu', 'xkb:lu::ltz', 'Europe/Luxembourg', ['lb', 'de-LU'], KML.ANSI,
1025 'Luxembourg'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001026 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001027 'lr', 'xkb:lr::eng', 'Africa/Monrovia', 'en-LR', KML.ANSI,
1028 'Liberia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001029 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001030 'ls', 'xkb:ls::eng', 'Africa/Maseru', ['en-LS', 'st', 'zu'], KML.ANSI,
1031 'Lesotho'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001032 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001033 'tf', 'xkb:tf::fra', 'Indian/Kerguelen', 'fr', KML.ANSI,
1034 'French Southern Territories'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001035 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001036 'tg', 'xkb:tg::fra', 'Africa/Lome', ['fr-TG', 'ee', 'hna'], KML.ANSI,
1037 'Togo'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001038 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001039 'td', 'xkb:td::fra', 'Africa/Ndjamena', ['fr-TD', 'ar'], KML.ANSI,
1040 'Chad'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001041 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001042 'tc', 'xkb:tc::eng', 'America/Grand_Turk', 'en-TC', KML.ANSI,
1043 'Turks and Caicos Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001044 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001045 'ly', 'xkb:ly::ara', 'Africa/Tripoli', ['ar', 'it', 'en'], KML.ANSI,
1046 'Libya'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001047 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001048 'va', 'xkb:va::lat', 'Europe/Vatican', ['la', 'it', 'fr'], KML.ANSI,
1049 'Vatican'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001050 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001051 'vc', 'xkb:vc::eng', 'America/St_Vincent', ['en-VC', 'fr'], KML.ANSI,
1052 'Saint Vincent and the Grenadines'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001053 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001054 'ad', 'xkb:ad::cat', 'Europe/Andorra', 'ca', KML.ANSI,
1055 'Andorra'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001056 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001057 'ag', 'xkb:ag::eng', 'America/Antigua', 'en-AG', KML.ANSI,
1058 'Antigua and Barbuda'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001059 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001060 'af', 'xkb:af::fas', 'Asia/Kabul', ['fa-AF', 'ps'], KML.ANSI,
1061 'Afghanistan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001062 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001063 'ai', 'xkb:ai::eng', 'America/Anguilla', 'en-AI', KML.ANSI,
1064 'Anguilla'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001065 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001066 'vi', 'xkb:vi::eng', 'America/St_Thomas', 'en-VI', KML.ANSI,
1067 'U.S. Virgin Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001068 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001069 'ir', 'xkb:ir::fas', 'Asia/Tehran', ['fa-IR', 'ku'], KML.ANSI,
1070 'Iran'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001071 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001072 'am', 'xkb:am::hye', 'Asia/Yerevan', 'hy', KML.ANSI,
1073 'Armenia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001074 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001075 'al', 'xkb:al::sqi', 'Europe/Tirane', ['sq', 'el'], KML.ANSI,
1076 'Albania'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001077 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001078 'ao', 'xkb:ao::por', 'Africa/Luanda', 'pt-AO', KML.ANSI,
1079 'Angola'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001080 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001081 'as', 'xkb:as::eng', 'Pacific/Pago_Pago', ['en-AS', 'sm'], KML.ANSI,
1082 'American Samoa'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001083 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001084 'aw', 'xkb:aw::nld', 'America/Aruba', ['nl-AW', 'es', 'en'], KML.ANSI,
1085 'Aruba'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001086 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001087 'ax', 'xkb:ax::swe', 'Europe/Mariehamn', 'sv-AX', KML.ANSI,
1088 'Aland Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001089 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001090 'az', 'xkb:az::aze', 'Asia/Baku', ['az', 'ru', 'hy'], KML.ANSI,
1091 'Azerbaijan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001092 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001093 'ua', 'xkb:ua::ukr', [
1094 'Europe/Kiev', 'Europe/Uzhgorod', 'Europe/Zaporozhye'], [
1095 'uk', 'ru-UA', 'rom', 'pl', 'hu'], KML.ANSI,
1096 'Ukraine'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001097 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001098 'qa', 'xkb:qa::ara', 'Asia/Bahrain', ['ar', 'en'], KML.ANSI,
1099 'Qatar'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001100 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001101 'mz', 'xkb:mz::por', 'Africa/Maputo', ['pt-MZ', 'vmw'], KML.ANSI,
1102 'Mozambique'),
1103 ]
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001104"""A list of :py:class:`regions.Region` objects for
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001105**unconfirmed** regions. These may contain incorrect information (or not
1106supported by Chrome browser yet), and all fields must be reviewed before launch.
1107See http://goto/vpdsettings.
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001108
1109Currently, non-Latin keyboards must use an underlying Latin keyboard
1110for VPD. (This assumption should be revisited when moving items to
1111:py:data:`regions.Region.REGIONS_LIST`.) This is
1112currently being discussed on <http://crbug.com/325389>.
1113
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001114Some timezones or locales may be missing from ``timezone_settings.cc`` (see
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001115http://crosbug.com/p/23902). This must be rectified before moving
1116items to :py:data:`regions.Region.REGIONS_LIST`.
1117"""
1118
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001119
1120def ConsolidateRegions(regions):
1121 """Consolidates a list of regions into a dict.
1122
1123 Args:
1124 regions: A list of Region objects. All objects for any given
1125 region code must be identical or we will throw an exception.
1126 (We allow duplicates in case identical region objects are
1127 defined in both regions.py and the overlay, e.g., when moving
1128 items to the public overlay.)
1129
1130 Returns:
1131 A dict from region code to Region.
1132
1133 Raises:
1134 RegionException: If there are multiple regions defined for a given
1135 region, and the values for those regions differ.
1136 """
1137 # Build a dict from region_code to the first Region with that code.
1138 region_dict = {}
1139 for r in regions:
1140 existing_region = region_dict.get(r.region_code)
1141 if existing_region:
1142 if existing_region.GetFieldsDict() != r.GetFieldsDict():
1143 raise RegionException(
1144 'Conflicting definitions for region %r: %r, %r' %
1145 (r.region_code, existing_region.GetFieldsDict(),
1146 r.GetFieldsDict()))
1147 else:
1148 region_dict[r.region_code] = r
1149
1150 return region_dict
1151
1152
1153def BuildRegionsDict(include_all=False):
1154 """Builds a dictionary mapping from code to :py:class:`regions.Region` object.
1155
1156 The regions include:
1157
1158 * :py:data:`regions.REGIONS_LIST`
1159 * :py:data:`regions_overlay.REGIONS_LIST`
1160 * Only if ``include_all`` is true:
1161
1162 * :py:data:`regions.UNCONFIRMED_REGIONS_LIST`
1163 * :py:data:`regions.INCOMPLETE_REGIONS_LIST`
1164
1165 A region may only appear in one of the above lists, or this function
1166 will (deliberately) fail.
1167 """
1168 regions = list(REGIONS_LIST)
1169 if include_all:
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001170 known_codes = [r.region_code for r in regions]
1171 regions += [r for r in UNCONFIRMED_REGIONS_LIST if r.region_code not in
1172 known_codes]
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001173
1174 # Build dictionary of region code to list of regions with that
1175 # region code. Check manually for duplicates, since the region may
1176 # be present both in the overlay and the public repo.
1177 return ConsolidateRegions(regions)
1178
1179
1180REGIONS = BuildRegionsDict()
1181
1182
Bao-Duy Trane43d5de2020-05-29 18:02:36 +10001183def main(args=None, out=None):
1184 if args is None:
1185 args = sys.argv[1:]
1186
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001187 parser = argparse.ArgumentParser(description=(
1188 'Display all known regions and their parameters. '))
1189 parser.add_argument('--format',
1190 choices=('human-readable', 'csv', 'json', 'yaml'),
1191 default='human-readable',
1192 help='Output format (default=%(default)s)')
1193 parser.add_argument('--all', action='store_true',
1194 help='Include unconfirmed and incomplete regions')
Hung-Te Linfe67ea42017-07-21 18:59:55 +08001195 parser.add_argument('--notes', action='store_true',
1196 help='Include notes in output')
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001197 parser.add_argument('--output', default=None,
1198 help='Specify output file')
Hung-Te Lin34f3d382015-04-10 18:18:23 +08001199 parser.add_argument('--overlay', default=None,
1200 help='Specify a Python file to overlay extra data')
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001201 args = parser.parse_args(args)
1202
Hung-Te Lin34f3d382015-04-10 18:18:23 +08001203 if args.overlay is not None:
Yilin Yang350aca02020-02-03 15:08:23 +08001204 with open(args.overlay) as f:
Bao-Duy Trane43d5de2020-05-29 18:02:36 +10001205 exec(f.read()) # pylint: disable=exec-used
Hung-Te Lin34f3d382015-04-10 18:18:23 +08001206
Hung-Te Lin1a14cc42015-04-14 01:23:34 +08001207 if args.all:
1208 # Add an additional 'confirmed' property to help identifying region status,
1209 # for autotests, unit tests and factory module.
1210 Region.FIELDS.insert(1, 'confirmed')
1211 for r in REGIONS_LIST:
1212 r.confirmed = True
1213 for r in UNCONFIRMED_REGIONS_LIST:
1214 r.confirmed = False
1215
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001216 regions_dict = BuildRegionsDict(args.all)
Hung-Te Lin34f3d382015-04-10 18:18:23 +08001217
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001218 if out is None:
1219 if args.output is None:
1220 out = sys.stdout
1221 else:
1222 out = open(args.output, 'w')
1223
Hung-Te Linfe67ea42017-07-21 18:59:55 +08001224 if args.notes or args.format == 'csv':
1225 Region.FIELDS += ['notes']
1226
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001227 # Handle YAML and JSON output.
1228 if args.format == 'yaml' or args.format == 'json':
1229 data = {}
1230 for region in regions_dict.values():
1231 item = {}
1232 for field in Region.FIELDS:
1233 item[field] = getattr(region, field)
1234 data[region.region_code] = item
1235 if args.format == 'yaml':
1236 yaml.dump(data, out)
1237 else:
1238 json.dump(data, out)
1239 return
1240
1241 # Handle CSV or plain-text output: build a list of lines to print.
1242 lines = [Region.FIELDS]
1243
1244 def CoerceToString(value):
1245 """Returns the arguments in simple string type.
1246
1247 If value is a list, concatenate its values with commas. Otherwise, just
1248 return value.
1249 """
1250 if isinstance(value, list):
1251 return ','.join(value)
1252 else:
1253 return str(value)
Hung-Te Lin1a14cc42015-04-14 01:23:34 +08001254
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001255 for region in sorted(regions_dict.values(), key=lambda v: v.region_code):
1256 lines.append([CoerceToString(getattr(region, field))
1257 for field in Region.FIELDS])
1258
1259 if args.format == 'csv':
Hung-Te Lin1a14cc42015-04-14 01:23:34 +08001260 # Just print the lines in CSV format. Note the values may include ',' so the
1261 # separator must be tab.
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001262 for l in lines:
Hung-Te Lin1a14cc42015-04-14 01:23:34 +08001263 print('\t'.join(l))
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001264 elif args.format == 'human-readable':
1265 num_columns = len(lines[0])
1266
1267 # Calculate maximum length of each column.
1268 max_lengths = []
Yilin Yang1550f3c2020-02-03 15:09:31 +08001269 for column_no in range(num_columns):
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001270 max_lengths.append(max(len(line[column_no]) for line in lines))
1271
1272 # Print each line, padding as necessary to the max column length.
1273 for line in lines:
Yilin Yang1550f3c2020-02-03 15:09:31 +08001274 for column_no in range(num_columns):
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001275 out.write(line[column_no].ljust(max_lengths[column_no] + 2))
1276 out.write('\n')
1277 else:
Wei-Han Chen763e6722018-11-16 12:23:19 +08001278 sys.exit('Sorry, unknown format specified: %s' % args.format)
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001279
1280
1281if __name__ == '__main__':
1282 main()