blob: c2e6316821699688b0d36ccf14e253aabf735d9b [file] [log] [blame]
Hung-Te Linc973d242016-12-02 12:42:41 +08001#!/usr/bin/env python2
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
15import collections
16import json
17import re
18import sys
19
20import yaml
21
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
36 Usage:
37 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."""
53 pass
54
55
56def MakeList(value):
57 """Converts the given value to a list.
58
59 Returns:
60 A list of elements from "value" if it is iterable (except string);
61 otherwise, a list contains only one element.
62 """
63 if (isinstance(value, collections.Iterable) and
64 not isinstance(value, basestring)):
65 return list(value)
66 return [value]
67
68
69class Region(object):
70 """Comprehensive, standard locale configuration per country/region.
71
72 See :ref:`regions-values` for detailed information on how to set these values.
73 """
74 # pylint gets confused by some of the docstrings.
75 # pylint: disable=C0322
76
77 # ANSI = US-like
78 # ISO = UK-like
79 # JIS = Japanese
Hung-Te Lin4eb4f922016-03-04 11:51:04 +080080 # KS = Korean (see http://crosbug.com/p/50753 for why this is not used yet)
Hung-Te Lin76c55b22015-03-31 14:47:14 +080081 # ABNT2 = Brazilian (like ISO but with an extra key to the left of the
82 # right shift key)
83 KeyboardMechanicalLayout = Enum(['ANSI', 'ISO', 'JIS', 'KS', 'ABNT2'])
84
85 region_code = None
86 """A unique identifier for the region. This may be a lower-case
87 `ISO 3166-1 alpha-2 code
88 <http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2>`_ (e.g., ``us``),
89 a variant within an alpha-2 entity (e.g., ``ca.fr``), or an
90 identifier for a collection of countries or entities (e.g.,
91 ``latam-es-419`` or ``nordic``). See :ref:`region-codes`.
92
93 Note that ``uk`` is not a valid identifier; ``gb`` is used as it is
94 the real alpha-2 code for the UK."""
95
96 keyboards = None
97 """A list of keyboard layout identifiers (e.g., ``xkb:us:intl:eng``
98 or ``m17n:ar``). This field was designed to be the physical keyboard layout
99 in the beginning, and then becomes a list of OOBE keyboard selection, which
100 then includes non-physical layout elements like input methods (``ime:``).
101 To avoid confusion, physical layout is now defined by
102 :py:attr:`keyboard_mechanical_layout`, and this is reserved for logical
103 layouts.
104
105 This is identical to the legacy VPD ``keyboard_layout`` value."""
106
107 time_zones = None
108 """A list of default `tz database time zone
109 <http://en.wikipedia.org/wiki/List_of_tz_database_time_zones>`_
110 identifiers (e.g., ``America/Los_Angeles``). See
111 `timezone_settings.cc <http://goo.gl/WSVUeE>`_ for supported time
112 zones.
113
114 This is identical to the legacy VPD ``initial_timezone`` value."""
115
116 locales = None
117 """A list of default locale codes (e.g., ``en-US``); see
118 `l10n_util.cc <http://goo.gl/kVkht>`_ for supported locales.
119
120 This is identital to the legacy VPD ``initial_locale`` field."""
121
122 keyboard_mechanical_layout = None
123 """The keyboard's mechanical layout (``ANSI`` [US-like], ``ISO``
124 [UK-like], ``JIS`` [Japanese], ``ABNT2`` [Brazilian] or ``KS`` [Korean])."""
125
126 description = None
127 """A human-readable description of the region.
128 This defaults to :py:attr:`region_code` if not set."""
129
130 notes = None
131 """Implementation notes about the region. This may be None."""
132
Hung-Te Lin436b6cc2015-04-03 12:15:47 +0800133 regulatory_domain = None
134 """An ISO 3166-1 alpha 2 upper-cased two-letter region code for setting
135 Wireless regulatory. See crosbug.com/p/38745 for more details.
136
137 When omitted, this will derive from region_code."""
138
Hung-Te Lin1a14cc42015-04-14 01:23:34 +0800139 confirmed = None
140 """An optional boolean flag to indicate if the region data is confirmed."""
141
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800142 FIELDS = ['region_code', 'description', 'keyboards',
Hung-Te Lin1a14cc42015-04-14 01:23:34 +0800143 'time_zones', 'locales', 'keyboard_mechanical_layout',
144 'regulatory_domain']
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800145 """Names of fields that define the region."""
146
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800147 def __init__(self, region_code, keyboards, time_zones, locales,
148 keyboard_mechanical_layout, description=None, notes=None,
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800149 regdomain=None):
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800150 """Constructor.
151
152 Args:
153 region_code: See :py:attr:`region_code`.
154 keyboards: See :py:attr:`keyboards`. A single string is accepted for
155 backward compatibility.
156 time_zones: See :py:attr:`time_zones`.
157 locales: See :py:attr:`locales`. A single string is accepted
158 for backward compatibility.
159 keyboard_mechanical_layout: See :py:attr:`keyboard_mechanical_layout`.
160 description: See :py:attr:`description`.
161 notes: See :py:attr:`notes`.
Hung-Te Lin436b6cc2015-04-03 12:15:47 +0800162 regdomain: See :py:attr:`regulatory_domain`.
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800163 """
Hung-Te Lin436b6cc2015-04-03 12:15:47 +0800164
165 def regdomain_from_region(region):
166 if region.find('.') >= 0:
167 region = region[:region.index('.')]
168 if len(region) == 2:
169 return region.upper()
170 return None
171
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800172 # Quick check: should be 'gb', not 'uk'
173 if region_code == 'uk':
174 raise RegionException("'uk' is not a valid region code (use 'gb')")
175
176 self.region_code = region_code
177 self.keyboards = MakeList(keyboards)
178 self.time_zones = MakeList(time_zones)
179 self.locales = MakeList(locales)
180 self.keyboard_mechanical_layout = keyboard_mechanical_layout
181 self.description = description or region_code
182 self.notes = notes
Hung-Te Lin436b6cc2015-04-03 12:15:47 +0800183 self.regulatory_domain = (regdomain or regdomain_from_region(region_code))
Hung-Te Lin1a14cc42015-04-14 01:23:34 +0800184 self.confirmed = None
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800185
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800186 for f in (self.keyboards, self.locales):
187 assert all(isinstance(x, str) for x in f), (
188 'Expected a list of strings, not %r' % f)
189 for f in self.keyboards:
190 assert KEYBOARD_PATTERN.match(f), (
191 'Keyboard pattern %r does not match %r' % (
192 f, KEYBOARD_PATTERN.pattern))
193 for f in self.locales:
194 assert LOCALE_PATTERN.match(f), (
195 'Locale %r does not match %r' % (
196 f, LOCALE_PATTERN.pattern))
Hung-Te Lin436b6cc2015-04-03 12:15:47 +0800197 assert (self.regulatory_domain and
198 len(self.regulatory_domain) == 2 and
199 self.regulatory_domain.upper() == self.regulatory_domain), (
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800200 'Regulatory domain settings error for region %s' % region_code)
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800201
202 def __repr__(self):
203 return 'Region(%s)' % (', '.join([getattr(self, x) for x in self.FIELDS]))
204
205 def GetFieldsDict(self):
206 """Returns a dict of all substantive fields.
207
208 notes and description are excluded.
209 """
210 return dict((k, getattr(self, k)) for k in self.FIELDS)
211
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800212KML = Region.KeyboardMechanicalLayout
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800213REGIONS_LIST = [
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800214 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800215 'au', 'xkb:us::eng', 'Australia/Sydney', 'en-AU', KML.ANSI,
216 'Australia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800217 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800218 'be', 'xkb:be::nld', 'Europe/Brussels', 'en-GB', KML.ISO,
219 'Belgium', (
220 'Flemish (Belgian Dutch) keyboard; British English language for '
221 'neutrality')),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800222 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800223 'br', 'xkb:br::por', 'America/Sao_Paulo', 'pt-BR', KML.ABNT2,
224 'Brazil (ABNT2)', (
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800225 'ABNT2 = ABNT NBR 10346 variant 2. This is the preferred layout '
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800226 'for Brazil. ABNT2 is mostly an ISO layout, but it 12 keys between '
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800227 'the shift keys; see http://goo.gl/twA5tq')),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800228 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800229 'br.abnt', 'xkb:br::por', 'America/Sao_Paulo', 'pt-BR', KML.ISO,
230 'Brazil (ABNT)', (
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800231 'Like ABNT2, but lacking the extra key to the left of the right '
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800232 'shift key found in that layout. ABNT2 (the "br" region) is '
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800233 'preferred to this layout')),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800234 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800235 'br.usintl', 'xkb:us:intl:eng', 'America/Sao_Paulo', 'pt-BR', KML.ANSI,
236 'Brazil (US Intl)', (
237 'Brazil with US International keyboard layout. ABNT2 ("br") and '
238 'ABNT1 ("br.abnt1 ") are both preferred to this.')),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800239 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800240 'ca.ansi', 'xkb:us::eng', 'America/Toronto', 'en-CA', KML.ANSI,
241 'Canada (US keyboard)', (
242 'Canada with US (ANSI) keyboard. Only allowed if there are '
243 'separate US English, Canadian English, and French SKUs. '
244 'Not for en/fr hybrid ANSI keyboards; for that you would want '
245 'ca.hybridansi. See http://goto/cros-canada')),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800246 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800247 'ca.fr', 'xkb:ca::fra', 'America/Toronto', 'fr-CA', KML.ISO,
248 'Canada (French keyboard)', (
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800249 'Canadian French (ISO) keyboard. The most common configuration for '
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800250 'Canadian French SKUs. See http://goto/cros-canada')),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800251 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800252 'ca.hybrid', 'xkb:ca:eng:eng', 'America/Toronto', 'en-CA', KML.ISO,
253 'Canada (hybrid ISO)', (
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800254 'Canada with hybrid (ISO) xkb:ca:eng:eng + xkb:ca::fra keyboard, '
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800255 'defaulting to English language and keyboard. Used only if there '
256 'needs to be a single SKU for all of Canada. See '
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800257 'http://goto/cros-canada')),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800258 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800259 'ca.hybridansi', 'xkb:ca:eng:eng', 'America/Toronto', 'en-CA', KML.ANSI,
260 'Canada (hybrid ANSI)', (
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800261 'Canada with hybrid (ANSI) xkb:ca:eng:eng + xkb:ca::fra keyboard, '
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800262 'defaulting to English language and keyboard. Used only if there '
263 'needs to be a single SKU for all of Canada. See '
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800264 'http://goto/cros-canada')),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800265 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800266 'ca.multix', 'xkb:ca:multix:fra', 'America/Toronto', 'fr-CA', KML.ISO,
267 'Canada (multilingual)', (
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800268 "Canadian Multilingual keyboard; you probably don't want this. See "
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800269 'http://goto/cros-canada')),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800270 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800271 'ch', 'xkb:ch::ger', 'Europe/Zurich', 'de-CH', KML.ISO,
272 'Switzerland', (
273 'German keyboard')),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800274 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800275 'de', 'xkb:de::ger', 'Europe/Berlin', 'de', KML.ISO,
276 'Germany'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800277 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800278 'es', 'xkb:es::spa', 'Europe/Madrid', 'es', KML.ISO,
279 'Spain'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800280 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800281 'fi', 'xkb:fi::fin', 'Europe/Helsinki', 'fi', KML.ISO,
282 'Finland'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800283 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800284 'fr', 'xkb:fr::fra', 'Europe/Paris', 'fr', KML.ISO,
285 'France'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800286 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800287 'gb', 'xkb:gb:extd:eng', 'Europe/London', 'en-GB', KML.ISO,
288 'UK'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800289 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800290 'ie', 'xkb:gb:extd:eng', 'Europe/Dublin', 'en-GB', KML.ISO,
291 'Ireland'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800292 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800293 'in', 'xkb:us::eng', 'Asia/Calcutta', 'en-US', KML.ANSI,
294 'India'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800295 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800296 'it', 'xkb:it::ita', 'Europe/Rome', 'it', KML.ISO,
297 'Italy'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800298 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800299 'latam-es-419', 'xkb:es::spa', 'America/Mexico_City', 'es-419', KML.ISO,
300 'Hispanophone Latin America', (
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800301 'Spanish-speaking countries in Latin America, using the Iberian '
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800302 '(Spain) Spanish keyboard, which is increasingly dominant in '
303 'Latin America. Known to be correct for '
304 'Chile, Colombia, Mexico, Peru; '
305 'still unconfirmed for other es-419 countries. The old Latin '
306 'American layout (xkb:latam::spa) has not been approved; before '
307 'using that you must seek review through http://goto/vpdsettings. '
308 'See also http://goo.gl/Iffuqh. Note that 419 is the UN M.49 '
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800309 'region code for Latin America'), 'MX'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800310 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800311 'my', 'xkb:us::eng', 'Asia/Kuala_Lumpur', 'ms', KML.ANSI,
312 'Malaysia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800313 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800314 'nl', 'xkb:us:intl:eng', 'Europe/Amsterdam', 'nl', KML.ANSI,
315 'Netherlands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800316 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800317 'nordic', 'xkb:se::swe', 'Europe/Stockholm', 'en-US', KML.ISO,
318 'Nordics', (
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800319 'Unified SKU for Sweden, Norway, and Denmark. This defaults '
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800320 'to Swedish keyboard layout, but starts with US English language '
321 'for neutrality. Use if there is a single combined SKU for Nordic '
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800322 'countries.'), 'SE'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800323 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800324 'nz', 'xkb:us::eng', 'Pacific/Auckland', 'en-NZ', KML.ANSI,
325 'New Zealand'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800326 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800327 'ph', 'xkb:us::eng', 'Asia/Manila', 'en-US', KML.ANSI,
328 'Philippines'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800329 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800330 'ru', ['xkb:us::eng', 'xkb:ru::rus'], 'Europe/Moscow', 'ru', KML.ANSI,
331 'Russia', (
332 'For R31+ only; R30 and earlier must use US keyboard for login')),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800333 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800334 'se', 'xkb:se::swe', 'Europe/Stockholm', 'sv', KML.ISO,
335 'Sweden', (
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800336 'Use this if there separate SKUs for Nordic countries (Sweden, '
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800337 'Norway, and Denmark), or the device is only shipping to Sweden. '
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800338 "If there is a single unified SKU, use 'nordic' instead.")),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800339 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800340 'sg', 'xkb:us::eng', 'Asia/Singapore', 'en-GB', KML.ANSI,
341 'Singapore'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800342 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800343 'us', 'xkb:us::eng', 'America/Los_Angeles', 'en-US', KML.ANSI,
344 'United States'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800345 Region(
Bao-Duy Tranf79b8f92019-07-04 17:12:01 +1000346 'jp', ['xkb:jp::jpn', 'ime:jp:mozc_jp'], 'Asia/Tokyo', 'ja', KML.JIS,
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800347 'Japan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800348 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800349 'za', 'xkb:gb:extd:eng', 'Africa/Johannesburg', 'en-ZA', KML.ISO,
350 'South Africa'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800351 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800352 'ng', 'xkb:us:intl:eng', 'Africa/Lagos', 'en-GB', KML.ANSI,
353 'Nigeria'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800354 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800355 'hk', ['xkb:us::eng', 'ime:zh-t:cangjie', 'ime:zh-t:quick',
356 'ime:zh-t:array', 'ime:zh-t:dayi', 'ime:zh-t:zhuyin',
357 'ime:zh-t:pinyin'], 'Asia/Hong_Kong', ['zh-TW', 'en-GB',
358 'zh-CN'], KML.ANSI,
359 'Hong Kong'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800360 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800361 'gcc', ['xkb:us::eng', 'm17n:ar', 't13n:ar'], 'Asia/Riyadh', [
362 'ar', 'en-GB'],
363 KML.ANSI,
364 'Gulf Cooperation Council (GCC)', (
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800365 'GCC is a regional intergovernmental political and economic '
366 'union consisting of all Arab states of the Persian Gulf except '
367 'for Iraq. Its member states are the Islamic monarchies of '
368 'Bahrain, Kuwait, Oman, Qatar, Saudi Arabia, and the United Arab '
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800369 'Emirates.'), 'SA'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800370 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800371 'cz', ['xkb:cz::cze', 'xkb:cz:qwerty:cze'], 'Europe/Prague', [
372 'cs', 'en-GB'], KML.ISO,
373 'Czech Republic'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800374 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800375 'th', ['xkb:us::eng', 'm17n:th', 'm17n:th_pattajoti',
376 'm17n:th_tis'], 'Asia/Bangkok', ['th', 'en-GB'], KML.ANSI,
377 'Thailand'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800378 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800379 'id', 'xkb:us::ind', 'Asia/Jakarta', ['id', 'en-GB'], KML.ANSI,
380 'Indonesia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800381 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800382 'tw', ['xkb:us::eng', 'ime:zh-t:zhuyin', 'ime:zh-t:array',
383 'ime:zh-t:dayi', 'ime:zh-t:cangjie', 'ime:zh-t:quick',
384 'ime:zh-t:pinyin'], 'Asia/Taipei', ['zh-TW', 'en-US'], KML.ANSI,
385 'Taiwan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800386 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800387 'pl', 'xkb:pl::pol', 'Europe/Warsaw', ['pl', 'en-GB'], KML.ANSI,
388 'Poland'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800389 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800390 'gr', ['xkb:us::eng', 'xkb:gr::gre', 't13n:el'], 'Europe/Athens', [
391 'el', 'en-GB'], KML.ANSI,
392 'Greece'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800393 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800394 'il', ['xkb:us::eng', 'xkb:il::heb', 't13n:he'], 'Asia/Jerusalem', [
395 'he', 'en-US', 'ar'], KML.ANSI,
396 'Israel'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800397 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800398 'pt', 'xkb:pt::por', 'Europe/Lisbon', ['pt-PT', 'en-GB'], KML.ISO,
399 'Portugal'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800400 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800401 'ro', ['xkb:us::eng', 'xkb:ro::rum'], 'Europe/Bucharest', [
402 'ro', 'hu', 'de', 'en-GB'], KML.ISO,
403 'Romania'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800404 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800405 'kr', ['xkb:us::eng', 'ime:ko:hangul'], 'Asia/Seoul', [
406 'ko', 'en-US'], KML.ANSI,
407 'South Korea'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800408 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800409 'ae', 'xkb:us::eng', 'Asia/Dubai', 'ar', KML.ANSI,
410 'UAE'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800411 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800412 'za.us', 'xkb:us::eng', 'Africa/Johannesburg', 'en-ZA', KML.ANSI,
413 'South Africa'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800414 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800415 'vn', ['xkb:us::eng', 'm17n:vi_telex', 'm17n:vi_vni', 'm17n:vi_viqr',
416 'm17n:vi_tcvn'], 'Asia/Ho_Chi_Minh', ['vi', 'en-GB', 'en-US',
417 'fr', 'zh-TW'], KML.ANSI,
418 'Vietnam'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800419 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800420 'at', ['xkb:de::ger', 'xkb:de:neo:ger'], 'Europe/Vienna', [
421 'de', 'en-GB'], KML.ISO,
422 'Austria'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800423 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800424 'sk', ['xkb:us::eng', 'xkb:sk::slo'], 'Europe/Bratislava', [
425 'sk', 'hu', 'cs', 'en-GB'], KML.ISO,
426 'Slovakia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800427 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800428 'ch.usintl', 'xkb:us:intl:eng', 'Europe/Zurich', 'en-US', KML.ANSI,
429 'Switzerland (US Intl)', (
430 'Switzerland with US International keyboard layout.')),
Hung-Te Lindf179fd2016-05-12 19:22:13 +0800431 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800432 'pe', 'xkb:latam::spa', 'America/Lima', 'es-419', KML.ANSI,
433 'Peru'),
Hung-Te Lindf179fd2016-05-12 19:22:13 +0800434 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800435 'sa', 'xkb:us::eng', 'Asia/Riyadh', ['ar', 'en'], KML.ANSI,
436 'Saudi Arabia'),
Hung-Te Lindf179fd2016-05-12 19:22:13 +0800437 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800438 'mx', 'xkb:latam::spa', 'America/Mexico_City', 'es-MX', KML.ANSI,
439 'Mexico'),
Hung-Te Lindf179fd2016-05-12 19:22:13 +0800440 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800441 'cl', 'xkb:latam::spa', 'America/Santiago', 'es-419', KML.ANSI,
442 'Chile'),
Hung-Te Lindf179fd2016-05-12 19:22:13 +0800443 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800444 'kw', ['xkb:us::eng', 'm17n:ar', 't13n:ar'], 'Asia/Kuwait', [
445 'ar', 'en'], KML.ANSI,
446 'Kuwait'),
Hung-Te Lindf179fd2016-05-12 19:22:13 +0800447 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800448 'uy', 'xkb:latam::spa', 'America/Montevideo', 'es-419', KML.ANSI,
449 'Uruguay'),
Hung-Te Lin37fbbbf2016-06-28 17:19:38 +0800450 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800451 'tr', ['xkb:tr::tur', 'xkb:tr:f:tur'], 'Europe/Istanbul', [
452 'tr', 'en-GB'], KML.ISO,
453 'Turkey'),
Hung-Te Lin639a05b2016-12-02 12:39:19 +0800454 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800455 'ar', 'xkb:latam::spa', 'America/Argentina/Buenos_Aires', [
paris_yeh8652e752017-06-06 14:38:23 +0800456 'es-AR', ], KML.ISO,
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800457 'Argentina'),
Hung-Te Lincf2f02b2017-03-20 14:58:20 +0800458 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800459 'gb.usext', 'xkb:us:altgr-intl:eng', 'Europe/London', 'en-GB', KML.ISO,
460 'UK (US extended keyboard)', (
461 'GB with US extended keyboard')),
Hung-Te Linfe0165d2018-05-02 19:15:03 +0800462 Region(
463 'bg', ['xkb:bg::bul', 'xkb:bg:phonetic:bul'], 'Europe/Sofia', [
464 'bg', 'tr', 'en-US'], KML.ANSI,
465 'Bulgaria'),
Wei-Han Chen763e6722018-11-16 12:23:19 +0800466 Region(
Bao-Duy Tranf79b8f92019-07-04 17:12:01 +1000467 'jp.us', ['xkb:us::eng', 'ime:jp:mozc_us'], 'Asia/Tokyo', 'ja',
468 KML.ANSI, 'Japan with US keyboard'),
Marco Chen233ea672018-09-19 21:46:49 +0800469 Region(
470 'is', 'xkb:is::ice', 'Atlantic/Reykjavik', ['is', 'en-GB'], KML.ISO,
471 'Iceland'),
Marco Chen2b3a91c2019-05-13 23:22:59 +0800472 Region(
473 'us.intl', 'xkb:us:intl:eng', 'America/Los_Angeles', 'en-US', KML.ANSI,
474 'US (English Intl)'),
Marco Chen773fe7f2019-05-13 23:08:18 +0800475 Region(
476 'co', 'xkb:latam::spa', 'America/Bogota', 'es-CO', KML.ANSI,
477 'Colombia'),
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800478 ]
Hung-Te Lin37fbbbf2016-06-28 17:19:38 +0800479
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800480"""A list of :py:class:`regions.Region` objects for
481all **confirmed** regions. A confirmed region is a region whose
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800482properties are known to be correct and valid: all contents (locale / timezone /
483keyboards) are supported by Chrome."""
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800484
485
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800486UNCONFIRMED_REGIONS_LIST = [
487 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800488 'bd', 'xkb:bd::ben', 'Asia/Dhaka', ['bn-BD', 'en'], KML.ANSI,
489 'Bangladesh'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800490 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800491 'bf', 'xkb:bf::fra', 'Africa/Ouagadougou', 'fr-BF', KML.ANSI,
492 'Burkina Faso'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800493 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800494 'ba', 'xkb:ba::bos', 'Europe/Sarajevo', 'bs', KML.ANSI,
495 'Bosnia and Herzegovina'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800496 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800497 'bb', 'xkb:bb::eng', 'America/Barbados', 'en-BB', KML.ANSI,
498 'Barbados'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800499 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800500 'wf', 'xkb:us::eng', 'Pacific/Wallis', ['wls', 'fud'], KML.ANSI,
501 'Wallis and Futuna'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800502 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800503 'bl', 'xkb:bl::fra', 'America/St_Barthelemy', 'fr', KML.ANSI,
504 'Saint Barthelemy'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800505 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800506 'bm', 'xkb:bm::eng', 'Atlantic/Bermuda', ['en-BM', 'pt'], KML.ANSI,
507 'Bermuda'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800508 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800509 'bn', 'xkb:bn::msa', 'Asia/Brunei', ['ms-BN', 'en-BN'], KML.ANSI,
510 'Brunei'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800511 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800512 'bo', 'xkb:latam::spa', 'America/La_Paz', ['es-419', 'qu'], KML.ANSI,
513 'Bolivia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800514 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800515 'bh', 'xkb:bh::ara', 'Asia/Bahrain', ['ar', 'en', 'fa', 'ru'], KML.ANSI,
516 'Bahrain'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800517 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800518 'bi', 'xkb:bi::fra', 'Africa/Bujumbura', ['fr-BI', 'rn'], KML.ANSI,
519 'Burundi'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800520 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800521 'bj', 'xkb:bj::fra', 'Africa/Porto-Novo', 'fr-BJ', KML.ANSI,
522 'Benin'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800523 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800524 'bt', 'xkb:bt::dzo', 'Asia/Thimphu', 'dz', KML.ANSI,
525 'Bhutan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800526 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800527 'jm', 'xkb:jm::eng', 'America/Jamaica', 'en-JM', KML.ANSI,
528 'Jamaica'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800529 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800530 'bw', 'xkb:bw::eng', 'Africa/Gaborone', ['en-BW', 'tn-BW'], KML.ANSI,
531 'Botswana'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800532 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800533 'ws', 'xkb:ws::smo', 'Pacific/Apia', ['sm', 'en-WS'], KML.ANSI,
534 'Samoa'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800535 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800536 'bq', 'xkb:bq::nld', 'America/Kralendijk', ['nl', 'en'], KML.ANSI,
537 'Bonaire, Saint Eustatius and Saba '),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800538 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800539 'bs', 'xkb:bs::eng', 'America/Nassau', 'en-BS', KML.ANSI,
540 'Bahamas'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800541 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800542 'je', 'xkb:je::eng', 'Europe/Jersey', ['en', 'pt'], KML.ANSI,
543 'Jersey'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800544 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800545 'by', 'xkb:by::bel', 'Europe/Minsk', ['be', 'ru'], KML.ANSI,
546 'Belarus'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800547 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800548 'bz', 'xkb:bz::eng', 'America/Belize', ['en-BZ', 'es'], KML.ANSI,
549 'Belize'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800550 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800551 'rw', 'xkb:rw::kin', 'Africa/Kigali', ['rw', 'en-RW'], KML.ANSI,
552 'Rwanda'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800553 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800554 'rs', 'xkb:rs::srp', 'Europe/Belgrade', ['sr', 'hu', 'bs'], KML.ANSI,
555 'Serbia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800556 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800557 'tl', 'xkb:us::eng', 'Asia/Dili', ['tet', 'pt-TL', 'en'], KML.ANSI,
558 'East Timor'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800559 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800560 're', 'xkb:re::fra', 'Indian/Reunion', 'fr-RE', KML.ANSI,
561 'Reunion'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800562 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800563 'tm', 'xkb:tm::tuk', 'Asia/Ashgabat', ['tk', 'ru', 'uz'], KML.ANSI,
564 'Turkmenistan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800565 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800566 'tj', 'xkb:tj::tgk', 'Asia/Dushanbe', ['tg', 'ru'], KML.ANSI,
567 'Tajikistan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800568 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800569 'tk', 'xkb:us::eng', 'Pacific/Fakaofo', ['tkl', 'en-TK'], KML.ANSI,
570 'Tokelau'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800571 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800572 'gw', 'xkb:gw::por', 'Africa/Bissau', ['pt-GW', 'pov'], KML.ANSI,
573 'Guinea-Bissau'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800574 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800575 'gu', 'xkb:gu::eng', 'Pacific/Guam', ['en-GU', 'ch-GU'], KML.ANSI,
576 'Guam'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800577 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800578 'gt', 'xkb:latam::spa', 'America/Guatemala', 'es-419', KML.ANSI,
579 'Guatemala'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800580 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800581 'gs', 'xkb:gs::eng', 'Atlantic/South_Georgia', 'en', KML.ANSI,
582 'South Georgia and the South Sandwich Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800583 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800584 'gq', 'xkb:gq::spa', 'Africa/Malabo', ['es-419', 'fr'], KML.ANSI,
585 'Equatorial Guinea'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800586 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800587 'gp', 'xkb:gp::fra', 'America/Guadeloupe', 'fr-GP', KML.ANSI,
588 'Guadeloupe'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800589 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800590 'gy', 'xkb:gy::eng', 'America/Guyana', 'en-GY', KML.ANSI,
591 'Guyana'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800592 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800593 'gg', 'xkb:gg::eng', 'Europe/Guernsey', ['en', 'fr'], KML.ANSI,
594 'Guernsey'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800595 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800596 'gf', 'xkb:gf::fra', 'America/Cayenne', 'fr-GF', KML.ANSI,
597 'French Guiana'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800598 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800599 'ge', 'xkb:ge::geo', 'Asia/Tbilisi', 'ka', KML.ANSI,
600 'Georgia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800601 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800602 'gd', 'xkb:gd::eng', 'America/Grenada', 'en-GD', KML.ANSI,
603 'Grenada'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800604 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800605 'ga', 'xkb:ga::fra', 'Africa/Libreville', 'fr-GA', KML.ANSI,
606 'Gabon'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800607 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800608 'sv', 'xkb:latam::spa', 'America/El_Salvador', 'es-419', KML.ANSI,
609 'El Salvador'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800610 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800611 'gn', 'xkb:gn::fra', 'Africa/Conakry', 'fr-GN', KML.ANSI,
612 'Guinea'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800613 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800614 'gm', 'xkb:gm::eng', 'Africa/Banjul', ['en-GM', 'mnk', 'wof'], KML.ANSI,
615 'Gambia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800616 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800617 'gl', 'xkb:gl::kal', ['America/Godthab', 'America/Danmarkshavn',
618 'America/Scoresbysund', 'America/Thule'], [
619 'kl', 'da-GL', 'en'], KML.ANSI,
620 'Greenland'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800621 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800622 'gi', 'xkb:gi::eng', 'Europe/Gibraltar', ['en-GI', 'es'], KML.ANSI,
623 'Gibraltar'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800624 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800625 'gh', 'xkb:gh::eng', 'Africa/Accra', ['en-GH', 'ak', 'ee'], KML.ANSI,
626 'Ghana'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800627 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800628 'om', 'xkb:om::ara', 'Asia/Muscat', ['ar', 'en', 'bal'], KML.ANSI,
629 'Oman'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800630 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800631 'tn', 'xkb:tn::ara', 'Africa/Tunis', ['ar', 'fr'], KML.ANSI,
632 'Tunisia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800633 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800634 'jo', 'xkb:jo::ara', 'Asia/Amman', ['ar', 'en'], KML.ANSI,
635 'Jordan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800636 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800637 'hn', 'xkb:latam::spa', 'America/Tegucigalpa', 'es-HN', KML.ANSI,
638 'Honduras'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800639 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800640 'hr', 'xkb:hr::scr', 'Europe/Zagreb', ['hr', 'en-GB'], KML.ISO,
641 'Croatia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800642 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800643 'ht', 'xkb:ht::hat', 'America/Port-au-Prince', ['ht'], KML.ANSI,
644 'Haiti'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800645 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800646 'hu', ['xkb:us::eng', 'xkb:hu::hun'], 'Europe/Budapest', [
647 'hu', 'en-GB'], KML.ISO,
648 'Hungary'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800649 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800650 've', 'xkb:latam::spa', 'America/Caracas', 'es-419', KML.ANSI,
651 'Venezuela'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800652 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800653 'pr', 'xkb:pr::eng', 'America/Puerto_Rico', ['en-PR'], KML.ANSI,
654 'Puerto Rico'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800655 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800656 'ps', 'xkb:ps::ara', ['Asia/Gaza', 'Asia/Hebron'], 'ar', KML.ANSI,
657 'Palestinian Territory'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800658 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800659 'pw', 'xkb:us::eng', 'Pacific/Palau', ['pau', 'sov', 'en-PW', 'tox',
660 'ja', 'fil', 'zh'], KML.ANSI,
661 'Palau'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800662 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800663 'sj', 'xkb:sj::nor', 'Arctic/Longyearbyen', ['no', 'ru'], KML.ANSI,
664 'Svalbard and Jan Mayen'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800665 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800666 'py', 'xkb:latam::spa', 'America/Asuncion', ['es-419', 'gn'], KML.ANSI,
667 'Paraguay'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800668 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800669 'iq', 'xkb:iq::ara', 'Asia/Baghdad', ['ar', 'ku', 'hy'], KML.ANSI,
670 'Iraq'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800671 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800672 'pa', 'xkb:latam::spa', 'America/Panama', ['es-419', 'en'], KML.ANSI,
673 'Panama'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800674 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800675 'pf', 'xkb:pf::fra', ['Pacific/Tahiti', 'Pacific/Marquesas',
676 'Pacific/Gambier'], ['fr-PF', 'ty'], KML.ANSI,
677 'French Polynesia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800678 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800679 'pg', 'xkb:pg::eng', ['Pacific/Port_Moresby',
680 'Pacific/Bougainville'], ['en-PG', 'ho', 'meu',
681 'tpi'], KML.ANSI,
682 'Papua New Guinea'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800683 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800684 'pk', 'xkb:pk::urd', 'Asia/Karachi', ['ur-PK', 'en-PK', 'pa', 'sd',
685 'ps', 'brh'], KML.ANSI,
686 'Pakistan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800687 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800688 'pn', 'xkb:pn::eng', 'Pacific/Pitcairn', 'en-PN', KML.ANSI,
689 'Pitcairn'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800690 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800691 'pm', 'xkb:pm::fra', 'America/Miquelon', 'fr-PM', KML.ANSI,
692 'Saint Pierre and Miquelon'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800693 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800694 'zm', 'xkb:zm::eng', 'Africa/Lusaka', ['en-ZM', 'bem', 'loz', 'lun',
695 'lue', 'ny', 'toi'], KML.ANSI,
696 'Zambia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800697 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800698 'eh', 'xkb:eh::ara', 'Africa/El_Aaiun', ['ar', 'mey'], KML.ANSI,
699 'Western Sahara'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800700 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800701 'ee', 'xkb:ee::est', 'Europe/Tallinn', ['et', 'ru', 'en-GB'], KML.ISO,
702 'Estonia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800703 Region(
Hung-Te Lin47da9092017-03-20 15:01:56 +0800704 'eg', 'xkb:eg::ara', 'Africa/Cairo', ['ar', 'en', 'fr'],
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800705 KML.ANSI, 'Egypt'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800706 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800707 'ec', 'xkb:latam::spa', ['America/Guayaquil'], 'es-419', KML.ANSI,
708 'Ecuador'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800709 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800710 'sb', 'xkb:sb::eng', 'Pacific/Guadalcanal', ['en-SB', 'tpi'], KML.ANSI,
711 'Solomon Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800712 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800713 'et', 'xkb:et::amh', 'Africa/Addis_Ababa', ['am', 'en-ET', 'om-ET',
714 'ti-ET'], KML.ANSI,
715 'Ethiopia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800716 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800717 'so', 'xkb:so::som', 'Africa/Mogadishu', ['so-SO', 'ar'], KML.ANSI,
718 'Somalia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800719 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800720 'zw', 'xkb:zw::eng', 'Africa/Harare', ['en-ZW', 'sn', 'nr'], KML.ANSI,
721 'Zimbabwe'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800722 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800723 'er', 'xkb:er::aar', 'Africa/Asmara', ['aa-ER', 'ar', 'tig', 'kun',
724 'ti-ER'], KML.ANSI,
725 'Eritrea'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800726 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800727 'me', 'xkb:me::srp', 'Europe/Podgorica', ['sr', 'hu', 'bs', 'sq', 'hr',
728 'rom'], KML.ANSI,
729 'Montenegro'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800730 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800731 'md', 'xkb:md::ron', 'Europe/Chisinau', ['ro', 'ru', 'gag'], KML.ANSI,
732 'Moldova'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800733 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800734 'mg', 'xkb:mg::fra', 'Indian/Antananarivo', ['fr-MG', 'mg'], KML.ANSI,
735 'Madagascar'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800736 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800737 'mf', 'xkb:mf::fra', 'America/Marigot', 'fr', KML.ANSI, 'Saint Martin'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800738 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800739 'ma', 'xkb:ma::ara', 'Africa/Casablanca', ['ar', 'fr'], KML.ANSI,
740 'Morocco'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800741 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800742 'mc', 'xkb:mc::fra', 'Europe/Monaco', ['fr-MC', 'en', 'it'], KML.ANSI,
743 'Monaco'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800744 Region(
745 'uz', 'xkb:uz::uzb', ['Asia/Samarkand', 'Asia/Tashkent'],
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800746 ['uz', 'ru', 'tg'], KML.ANSI, 'Uzbekistan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800747 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800748 'mm', 'xkb:mm::mya', 'Asia/Rangoon', 'my', KML.ANSI, 'Myanmar',
749 None),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800750 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800751 'ml', 'xkb:ml::fra', 'Africa/Bamako', ['fr-ML', 'bm'], KML.ANSI,
752 'Mali'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800753 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800754 'mo', 'xkb:mo::zho', 'Asia/Macau', ['zh', 'zh-MO', 'pt'], KML.ANSI,
755 'Macao'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800756 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800757 'mn', 'xkb:mn::mon', ['Asia/Ulaanbaatar', 'Asia/Hovd',
758 'Asia/Choibalsan'], ['mn', 'ru'], KML.ANSI,
759 'Mongolia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800760 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800761 'mh', 'xkb:mh::mah', ['Pacific/Majuro'], ['mh' 'en-MH'], KML.ANSI,
762 'Marshall Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800763 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800764 'mk', 'xkb:mk::mkd', 'Europe/Skopje', ['mk', 'sq', 'tr'], KML.ANSI,
765 'Macedonia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800766 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800767 'mu', 'xkb:mu::eng', 'Indian/Mauritius', ['en-MU', 'bho'], KML.ANSI,
768 'Mauritius'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800769 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800770 'mt', ['xkb:us::eng'], 'Europe/Malta', ['mt', 'en-GB'], KML.ISO,
771 'Malta'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800772 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800773 'mw', 'xkb:mw::nya', 'Africa/Blantyre', ['ny', 'yao', 'tum'], KML.ANSI,
774 'Malawi'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800775 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800776 'mv', 'xkb:mv::div', 'Indian/Maldives', ['dv', 'en'], KML.ANSI,
777 'Maldives'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800778 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800779 'mq', 'xkb:mq::fra', 'America/Martinique', 'fr-MQ', KML.ANSI,
780 'Martinique'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800781 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800782 'mp', 'xkb:us::eng', 'Pacific/Saipan', ['fil', 'tl', 'zh', 'ch-MP',
783 'en-MP'], KML.ANSI,
784 'Northern Mariana Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800785 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800786 'ms', 'xkb:ms::eng', 'America/Montserrat', 'en-MS', KML.ANSI,
787 'Montserrat'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800788 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800789 'mr', 'xkb:mr::ara', 'Africa/Nouakchott', ['ar', 'fuc', 'snk', 'fr',
790 'mey', 'wo'], KML.ANSI,
791 'Mauritania'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800792 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800793 'im', 'xkb:im::eng', 'Europe/Isle_of_Man', ['en', 'gv'], KML.ANSI,
794 'Isle of Man'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800795 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800796 'ug', 'xkb:ug::eng', 'Africa/Kampala', ['en-UG', 'lg', 'ar'], KML.ANSI,
797 'Uganda'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800798 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800799 'tz', 'xkb:tz::swa', 'Africa/Dar_es_Salaam', ['sw-TZ', 'en'], KML.ANSI,
800 'Tanzania'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800801 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800802 'io', 'xkb:io::eng', 'Indian/Chagos', 'en-IO', KML.ANSI,
803 'British Indian Ocean Territory'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800804 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800805 'sh', 'xkb:sh::eng', 'Atlantic/St_Helena', 'en-SH', KML.ANSI,
806 'Saint Helena'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800807 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800808 'fj', 'xkb:fj::eng', 'Pacific/Fiji', ['en-FJ', 'fj'], KML.ANSI,
809 'Fiji'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800810 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800811 'fk', 'xkb:fk::eng', 'Atlantic/Stanley', 'en-FK', KML.ANSI,
812 'Falkland Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800813 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800814 'fm', 'xkb:fm::eng', [
815 'Pacific/Chuuk', 'Pacific/Pohnpei', 'Pacific/Kosrae'], [
816 'en-FM', 'chk', 'pon', 'yap', 'kos', 'uli', 'woe', 'nkr',
817 'kpg'], KML.ANSI,
818 'Micronesia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800819 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800820 'fo', 'xkb:fo::fao', 'Atlantic/Faroe', ['fo', 'da-FO'], KML.ANSI,
821 'Faroe Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800822 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800823 'ni', 'xkb:latam::spa', 'America/Managua', ['es-419', 'en'], KML.ANSI,
824 'Nicaragua'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800825 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800826 'no', 'xkb:no::nor', 'Europe/Oslo', ['no', 'nb', 'nn', 'se'], KML.ISO,
827 'Norway'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800828 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800829 'na', 'xkb:na::eng', 'Africa/Windhoek', ['en-NA', 'af', 'de', 'hz',
830 'naq'], KML.ANSI,
831 'Namibia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800832 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800833 'vu', 'xkb:vu::bis', 'Pacific/Efate', ['bi', 'en-VU'], KML.ANSI,
834 'Vanuatu'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800835 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800836 'nc', 'xkb:nc::fra', 'Pacific/Noumea', 'fr-NC', KML.ANSI,
837 'New Caledonia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800838 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800839 'ne', 'xkb:ne::fra', 'Africa/Niamey', ['fr-NE', 'ha', 'kr'], KML.ANSI,
840 'Niger'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800841 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800842 'nf', 'xkb:nf::eng', 'Pacific/Norfolk', 'en-NF', KML.ANSI,
843 'Norfolk Island'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800844 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800845 'np', 'xkb:np::nep', 'Asia/Kathmandu', ['ne', 'en'], KML.ANSI,
846 'Nepal'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800847 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800848 'nr', 'xkb:nr::nau', 'Pacific/Nauru', ['na', 'en-NR'], KML.ANSI,
849 'Nauru'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800850 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800851 'nu', 'xkb:us::eng', 'Pacific/Niue', ['niu', 'en-NU'], KML.ANSI,
852 'Niue'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800853 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800854 'ck', 'xkb:ck::eng', 'Pacific/Rarotonga', ['en-CK', 'mi'], KML.ANSI,
855 'Cook Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800856 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800857 'ci', 'xkb:ci::fra', 'Africa/Abidjan', 'fr-CI', KML.ANSI,
858 'Ivory Coast'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800859 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800860 'cn', 'xkb:us::eng', 'Asia/Shanghai', 'zh-CN', KML.ANSI,
861 'China'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800862 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800863 'cm', 'xkb:cm::eng', 'Africa/Douala', ['en-CM', 'fr-CM'], KML.ANSI,
864 'Cameroon'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800865 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800866 'cc', 'xkb:cc::msa', 'Indian/Cocos', ['ms-CC', 'en'], KML.ANSI,
867 'Cocos Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800868 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800869 'cg', 'xkb:cg::fra', 'Africa/Brazzaville', ['fr-CG', 'kg'], KML.ANSI,
870 'Republic of the Congo'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800871 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800872 'cf', 'xkb:cf::fra', 'Africa/Bangui', ['fr-CF', 'sg', 'ln'], KML.ANSI,
873 'Central African Republic'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800874 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800875 'cd', 'xkb:cd::fra', ['Africa/Kinshasa', 'Africa/Lubumbashi'], [
876 'fr-CD', 'ln', 'kg'], KML.ANSI,
877 'Democratic Republic of the Congo'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800878 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800879 'cy', 'xkb:cy::ell', 'Asia/Nicosia', ['el-CY', 'tr-CY'], KML.ANSI,
880 'Cyprus'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800881 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800882 'cx', 'xkb:cx::eng', 'Indian/Christmas', ['en', 'zh'], KML.ANSI,
883 'Christmas Island'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800884 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800885 'cr', 'xkb:latam::spa', 'America/Costa_Rica', ['es-419'], KML.ANSI,
886 'Costa Rica'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800887 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800888 'cw', 'xkb:cw::nld', 'America/Curacao', ['nl'], KML.ANSI, 'Curacao'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800889 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800890 'cv', 'xkb:cv::por', 'Atlantic/Cape_Verde', 'pt-CV', KML.ANSI,
891 'Cape Verde'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800892 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800893 'cu', 'xkb:latam::spa', 'America/Havana', 'es-419', KML.ANSI,
894 'Cuba'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800895 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800896 'sz', 'xkb:sz::eng', 'Africa/Mbabane', ['en-SZ', 'ss-SZ'], KML.ANSI,
897 'Swaziland'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800898 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800899 'sy', 'xkb:sy::ara', 'Asia/Damascus', ['ar', 'ku', 'hy', 'arc', 'fr',
900 'en'], KML.ANSI,
901 'Syria'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800902 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800903 'sx', 'xkb:sx::nld', 'America/Lower_Princes', ['nl', 'en'], KML.ANSI,
904 'Sint Maarten'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800905 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800906 'kg', 'xkb:kg::kir', 'Asia/Bishkek', ['ky', 'uz', 'ru'], KML.ANSI,
907 'Kyrgyzstan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800908 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800909 'ke', 'xkb:ke::eng', 'Africa/Nairobi', ['en-KE', 'sw-KE'], KML.ANSI,
910 'Kenya'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800911 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800912 'ss', 'xkb:ss::eng', 'Africa/Juba', 'en', KML.ANSI,
913 'South Sudan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800914 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800915 'sr', 'xkb:sr::nld', 'America/Paramaribo', ['nl-SR', 'en', 'srn', 'hns',
916 'jv'], KML.ANSI,
917 'Suriname'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800918 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800919 'ki', 'xkb:ki::eng', ['Pacific/Tarawa', 'Pacific/Enderbury',
920 'Pacific/Kiritimati'], ['en-KI', 'gil'], KML.ANSI,
921 'Kiribati'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800922 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800923 'kh', 'xkb:kh::khm', 'Asia/Phnom_Penh', ['km', 'fr', 'en'], KML.ANSI,
924 'Cambodia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800925 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800926 'kn', 'xkb:kn::eng', 'America/St_Kitts', 'en-KN', KML.ANSI,
927 'Saint Kitts and Nevis'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800928 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800929 'km', 'xkb:km::ara', 'Indian/Comoro', ['ar', 'fr-KM'], KML.ANSI,
930 'Comoros'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800931 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800932 'st', 'xkb:st::por', 'Africa/Sao_Tome', 'pt-ST', KML.ANSI,
933 'Sao Tome and Principe'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800934 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800935 'si', 'xkb:si::slv', 'Europe/Ljubljana', ['sl', 'hu', 'it', 'sr', 'de',
936 'hr', 'en-GB'], KML.ISO,
937 'Slovenia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800938 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800939 'kp', 'xkb:kp::kor', 'Asia/Pyongyang', 'ko-KP', KML.ANSI,
940 'North Korea'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800941 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800942 'sn', 'xkb:sn::fra', 'Africa/Dakar', ['fr-SN', 'wo', 'fuc'], KML.ANSI,
943 'Senegal'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800944 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800945 'sm', 'xkb:sm::ita', 'Europe/San_Marino', 'it-SM', KML.ANSI,
946 'San Marino'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800947 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800948 'sl', 'xkb:sl::eng', 'Africa/Freetown', ['en-SL', 'men'], KML.ANSI,
949 'Sierra Leone'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800950 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800951 'sc', 'xkb:sc::eng', 'Indian/Mahe', ['en-SC', 'fr-SC'], KML.ANSI,
952 'Seychelles'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800953 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800954 'kz', 'xkb:kz::kaz', ['Asia/Almaty', 'Asia/Qyzylorda', 'Asia/Aqtobe',
955 'Asia/Aqtau'], ['kk', 'ru'], KML.ANSI,
956 'Kazakhstan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800957 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800958 'ky', 'xkb:ky::eng', 'America/Cayman', 'en-KY', KML.ANSI,
959 'Cayman Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800960 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800961 'sd', 'xkb:sd::ara', 'Africa/Khartoum', ['ar', 'en', 'fia'], KML.ANSI,
962 'Sudan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800963 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800964 'do', 'xkb:latam::spa', 'America/Santo_Domingo', 'es-419', KML.ANSI,
965 'Dominican Republic'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800966 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800967 'dm', 'xkb:dm::eng', 'America/Dominica', 'en-DM', KML.ANSI,
968 'Dominica'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800969 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800970 'dj', 'xkb:dj::fra', 'Africa/Djibouti', ['fr-DJ', 'ar'], KML.ANSI,
971 'Djibouti'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800972 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800973 'dk', 'xkb:dk::dan', 'Europe/Copenhagen', ['da-DK', 'en', 'fo',
974 'de-DK'], KML.ISO,
975 'Denmark'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800976 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800977 'vg', 'xkb:vg::eng', 'America/Tortola', 'en-VG', KML.ANSI,
978 'British Virgin Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800979 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800980 'ye', 'xkb:ye::ara', 'Asia/Aden', 'ar', KML.ANSI,
981 'Yemen'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800982 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800983 'dz', 'xkb:dz::ara', 'Africa/Algiers', 'ar', KML.ANSI,
984 'Algeria'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800985 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800986 'yt', 'xkb:yt::fra', 'Indian/Mayotte', 'fr-YT', KML.ANSI,
987 'Mayotte'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800988 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800989 'um', 'xkb:um::eng', ['Pacific/Johnston', 'Pacific/Midway',
990 'Pacific/Wake'], 'en-UM', KML.ANSI,
991 'United States Minor Outlying Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800992 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800993 'lb', 'xkb:lb::ara', 'Asia/Beirut', ['ar', 'fr-LB', 'en'], KML.ANSI,
994 'Lebanon'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800995 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800996 'lc', 'xkb:lc::eng', 'America/St_Lucia', 'en-LC', KML.ANSI,
997 'Saint Lucia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800998 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800999 'la', 'xkb:la::lao', 'Asia/Vientiane', ['lo', 'fr', 'en'], KML.ANSI,
1000 'Laos'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001001 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001002 'tv', 'xkb:us::eng', 'Pacific/Funafuti', ['tvl', 'en', 'sm'], KML.ANSI,
1003 'Tuvalu'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001004 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001005 'tt', 'xkb:tt::eng', 'America/Port_of_Spain', ['en-TT', 'hns', 'fr',
1006 'es', 'zh'], KML.ANSI,
1007 'Trinidad and Tobago'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001008 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001009 'lk', 'xkb:lk::sin', 'Asia/Colombo', ['si', 'ta', 'en'], KML.ANSI,
1010 'Sri Lanka'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001011 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001012 'li', 'xkb:ch::ger', 'Europe/Vaduz', ['de', 'en-GB'], KML.ISO,
1013 'Liechtenstein'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001014 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001015 'lv', 'xkb:lv:apostrophe:lav', 'Europe/Riga', ['lv', 'lt', 'ru',
1016 'en-GB'], KML.ISO,
1017 'Latvia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001018 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001019 'to', 'xkb:to::ton', 'Pacific/Tongatapu', ['to', 'en-TO'], KML.ANSI,
1020 'Tonga'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001021 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001022 'lt', 'xkb:lt::lit', 'Europe/Vilnius', ['lt', 'ru', 'pl'], KML.ISO,
1023 'Lithuania'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001024 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001025 'lu', 'xkb:lu::ltz', 'Europe/Luxembourg', ['lb', 'de-LU'], KML.ANSI,
1026 'Luxembourg'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001027 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001028 'lr', 'xkb:lr::eng', 'Africa/Monrovia', 'en-LR', KML.ANSI,
1029 'Liberia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001030 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001031 'ls', 'xkb:ls::eng', 'Africa/Maseru', ['en-LS', 'st', 'zu'], KML.ANSI,
1032 'Lesotho'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001033 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001034 'tf', 'xkb:tf::fra', 'Indian/Kerguelen', 'fr', KML.ANSI,
1035 'French Southern Territories'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001036 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001037 'tg', 'xkb:tg::fra', 'Africa/Lome', ['fr-TG', 'ee', 'hna'], KML.ANSI,
1038 'Togo'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001039 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001040 'td', 'xkb:td::fra', 'Africa/Ndjamena', ['fr-TD', 'ar'], KML.ANSI,
1041 'Chad'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001042 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001043 'tc', 'xkb:tc::eng', 'America/Grand_Turk', 'en-TC', KML.ANSI,
1044 'Turks and Caicos Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001045 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001046 'ly', 'xkb:ly::ara', 'Africa/Tripoli', ['ar', 'it', 'en'], KML.ANSI,
1047 'Libya'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001048 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001049 'va', 'xkb:va::lat', 'Europe/Vatican', ['la', 'it', 'fr'], KML.ANSI,
1050 'Vatican'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001051 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001052 'vc', 'xkb:vc::eng', 'America/St_Vincent', ['en-VC', 'fr'], KML.ANSI,
1053 'Saint Vincent and the Grenadines'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001054 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001055 'ad', 'xkb:ad::cat', 'Europe/Andorra', 'ca', KML.ANSI,
1056 'Andorra'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001057 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001058 'ag', 'xkb:ag::eng', 'America/Antigua', 'en-AG', KML.ANSI,
1059 'Antigua and Barbuda'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001060 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001061 'af', 'xkb:af::fas', 'Asia/Kabul', ['fa-AF', 'ps'], KML.ANSI,
1062 'Afghanistan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001063 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001064 'ai', 'xkb:ai::eng', 'America/Anguilla', 'en-AI', KML.ANSI,
1065 'Anguilla'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001066 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001067 'vi', 'xkb:vi::eng', 'America/St_Thomas', 'en-VI', KML.ANSI,
1068 'U.S. Virgin Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001069 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001070 'ir', 'xkb:ir::fas', 'Asia/Tehran', ['fa-IR', 'ku'], KML.ANSI,
1071 'Iran'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001072 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001073 'am', 'xkb:am::hye', 'Asia/Yerevan', 'hy', KML.ANSI,
1074 'Armenia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001075 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001076 'al', 'xkb:al::sqi', 'Europe/Tirane', ['sq', 'el'], KML.ANSI,
1077 'Albania'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001078 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001079 'ao', 'xkb:ao::por', 'Africa/Luanda', 'pt-AO', KML.ANSI,
1080 'Angola'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001081 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001082 'as', 'xkb:as::eng', 'Pacific/Pago_Pago', ['en-AS', 'sm'], KML.ANSI,
1083 'American Samoa'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001084 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001085 'aw', 'xkb:aw::nld', 'America/Aruba', ['nl-AW', 'es', 'en'], KML.ANSI,
1086 'Aruba'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001087 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001088 'ax', 'xkb:ax::swe', 'Europe/Mariehamn', 'sv-AX', KML.ANSI,
1089 'Aland Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001090 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001091 'az', 'xkb:az::aze', 'Asia/Baku', ['az', 'ru', 'hy'], KML.ANSI,
1092 'Azerbaijan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001093 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001094 'ua', 'xkb:ua::ukr', [
1095 'Europe/Kiev', 'Europe/Uzhgorod', 'Europe/Zaporozhye'], [
1096 'uk', 'ru-UA', 'rom', 'pl', 'hu'], KML.ANSI,
1097 'Ukraine'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001098 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001099 'qa', 'xkb:qa::ara', 'Asia/Bahrain', ['ar', 'en'], KML.ANSI,
1100 'Qatar'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001101 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001102 'mz', 'xkb:mz::por', 'Africa/Maputo', ['pt-MZ', 'vmw'], KML.ANSI,
1103 'Mozambique'),
1104 ]
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001105"""A list of :py:class:`regions.Region` objects for
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001106**unconfirmed** regions. These may contain incorrect information (or not
1107supported by Chrome browser yet), and all fields must be reviewed before launch.
1108See http://goto/vpdsettings.
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001109
1110Currently, non-Latin keyboards must use an underlying Latin keyboard
1111for VPD. (This assumption should be revisited when moving items to
1112:py:data:`regions.Region.REGIONS_LIST`.) This is
1113currently being discussed on <http://crbug.com/325389>.
1114
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001115Some timezones or locales may be missing from ``timezone_settings.cc`` (see
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001116http://crosbug.com/p/23902). This must be rectified before moving
1117items to :py:data:`regions.Region.REGIONS_LIST`.
1118"""
1119
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001120
1121def ConsolidateRegions(regions):
1122 """Consolidates a list of regions into a dict.
1123
1124 Args:
1125 regions: A list of Region objects. All objects for any given
1126 region code must be identical or we will throw an exception.
1127 (We allow duplicates in case identical region objects are
1128 defined in both regions.py and the overlay, e.g., when moving
1129 items to the public overlay.)
1130
1131 Returns:
1132 A dict from region code to Region.
1133
1134 Raises:
1135 RegionException: If there are multiple regions defined for a given
1136 region, and the values for those regions differ.
1137 """
1138 # Build a dict from region_code to the first Region with that code.
1139 region_dict = {}
1140 for r in regions:
1141 existing_region = region_dict.get(r.region_code)
1142 if existing_region:
1143 if existing_region.GetFieldsDict() != r.GetFieldsDict():
1144 raise RegionException(
1145 'Conflicting definitions for region %r: %r, %r' %
1146 (r.region_code, existing_region.GetFieldsDict(),
1147 r.GetFieldsDict()))
1148 else:
1149 region_dict[r.region_code] = r
1150
1151 return region_dict
1152
1153
1154def BuildRegionsDict(include_all=False):
1155 """Builds a dictionary mapping from code to :py:class:`regions.Region` object.
1156
1157 The regions include:
1158
1159 * :py:data:`regions.REGIONS_LIST`
1160 * :py:data:`regions_overlay.REGIONS_LIST`
1161 * Only if ``include_all`` is true:
1162
1163 * :py:data:`regions.UNCONFIRMED_REGIONS_LIST`
1164 * :py:data:`regions.INCOMPLETE_REGIONS_LIST`
1165
1166 A region may only appear in one of the above lists, or this function
1167 will (deliberately) fail.
1168 """
1169 regions = list(REGIONS_LIST)
1170 if include_all:
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001171 known_codes = [r.region_code for r in regions]
1172 regions += [r for r in UNCONFIRMED_REGIONS_LIST if r.region_code not in
1173 known_codes]
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001174
1175 # Build dictionary of region code to list of regions with that
1176 # region code. Check manually for duplicates, since the region may
1177 # be present both in the overlay and the public repo.
1178 return ConsolidateRegions(regions)
1179
1180
1181REGIONS = BuildRegionsDict()
1182
1183
1184def main(args=sys.argv[1:], out=None):
1185 parser = argparse.ArgumentParser(description=(
1186 'Display all known regions and their parameters. '))
1187 parser.add_argument('--format',
1188 choices=('human-readable', 'csv', 'json', 'yaml'),
1189 default='human-readable',
1190 help='Output format (default=%(default)s)')
1191 parser.add_argument('--all', action='store_true',
1192 help='Include unconfirmed and incomplete regions')
Hung-Te Linfe67ea42017-07-21 18:59:55 +08001193 parser.add_argument('--notes', action='store_true',
1194 help='Include notes in output')
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001195 parser.add_argument('--output', default=None,
1196 help='Specify output file')
Hung-Te Lin34f3d382015-04-10 18:18:23 +08001197 parser.add_argument('--overlay', default=None,
1198 help='Specify a Python file to overlay extra data')
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001199 args = parser.parse_args(args)
1200
Hung-Te Lin34f3d382015-04-10 18:18:23 +08001201 if args.overlay is not None:
1202 execfile(args.overlay)
1203
Hung-Te Lin1a14cc42015-04-14 01:23:34 +08001204 if args.all:
1205 # Add an additional 'confirmed' property to help identifying region status,
1206 # for autotests, unit tests and factory module.
1207 Region.FIELDS.insert(1, 'confirmed')
1208 for r in REGIONS_LIST:
1209 r.confirmed = True
1210 for r in UNCONFIRMED_REGIONS_LIST:
1211 r.confirmed = False
1212
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001213 regions_dict = BuildRegionsDict(args.all)
Hung-Te Lin34f3d382015-04-10 18:18:23 +08001214
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001215 if out is None:
1216 if args.output is None:
1217 out = sys.stdout
1218 else:
1219 out = open(args.output, 'w')
1220
Hung-Te Linfe67ea42017-07-21 18:59:55 +08001221 if args.notes or args.format == 'csv':
1222 Region.FIELDS += ['notes']
1223
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001224 # Handle YAML and JSON output.
1225 if args.format == 'yaml' or args.format == 'json':
1226 data = {}
1227 for region in regions_dict.values():
1228 item = {}
1229 for field in Region.FIELDS:
1230 item[field] = getattr(region, field)
1231 data[region.region_code] = item
1232 if args.format == 'yaml':
1233 yaml.dump(data, out)
1234 else:
1235 json.dump(data, out)
1236 return
1237
1238 # Handle CSV or plain-text output: build a list of lines to print.
1239 lines = [Region.FIELDS]
1240
1241 def CoerceToString(value):
1242 """Returns the arguments in simple string type.
1243
1244 If value is a list, concatenate its values with commas. Otherwise, just
1245 return value.
1246 """
1247 if isinstance(value, list):
1248 return ','.join(value)
1249 else:
1250 return str(value)
Hung-Te Lin1a14cc42015-04-14 01:23:34 +08001251
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001252 for region in sorted(regions_dict.values(), key=lambda v: v.region_code):
1253 lines.append([CoerceToString(getattr(region, field))
1254 for field in Region.FIELDS])
1255
1256 if args.format == 'csv':
Hung-Te Lin1a14cc42015-04-14 01:23:34 +08001257 # Just print the lines in CSV format. Note the values may include ',' so the
1258 # separator must be tab.
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001259 for l in lines:
Hung-Te Lin1a14cc42015-04-14 01:23:34 +08001260 print('\t'.join(l))
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001261 elif args.format == 'human-readable':
1262 num_columns = len(lines[0])
1263
1264 # Calculate maximum length of each column.
1265 max_lengths = []
1266 for column_no in xrange(num_columns):
1267 max_lengths.append(max(len(line[column_no]) for line in lines))
1268
1269 # Print each line, padding as necessary to the max column length.
1270 for line in lines:
1271 for column_no in xrange(num_columns):
1272 out.write(line[column_no].ljust(max_lengths[column_no] + 2))
1273 out.write('\n')
1274 else:
Wei-Han Chen763e6722018-11-16 12:23:19 +08001275 sys.exit('Sorry, unknown format specified: %s' % args.format)
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001276
1277
1278if __name__ == '__main__':
1279 main()