blob: 33b2a788a596da449a89e78a4895eeffcf469bc1 [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(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800346 'jp', 'xkb:jp::jpn', 'Asia/Tokyo', 'ja', KML.JIS,
347 '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(
467 'jp.us', 'xkb:us::eng', 'Asia/Tokyo', 'ja', KML.ANSI,
468 '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'),
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800472 ]
Hung-Te Lin37fbbbf2016-06-28 17:19:38 +0800473
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800474"""A list of :py:class:`regions.Region` objects for
475all **confirmed** regions. A confirmed region is a region whose
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800476properties are known to be correct and valid: all contents (locale / timezone /
477keyboards) are supported by Chrome."""
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800478
479
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800480UNCONFIRMED_REGIONS_LIST = [
481 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800482 'bd', 'xkb:bd::ben', 'Asia/Dhaka', ['bn-BD', 'en'], KML.ANSI,
483 'Bangladesh'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800484 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800485 'bf', 'xkb:bf::fra', 'Africa/Ouagadougou', 'fr-BF', KML.ANSI,
486 'Burkina Faso'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800487 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800488 'ba', 'xkb:ba::bos', 'Europe/Sarajevo', 'bs', KML.ANSI,
489 'Bosnia and Herzegovina'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800490 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800491 'bb', 'xkb:bb::eng', 'America/Barbados', 'en-BB', KML.ANSI,
492 'Barbados'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800493 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800494 'wf', 'xkb:us::eng', 'Pacific/Wallis', ['wls', 'fud'], KML.ANSI,
495 'Wallis and Futuna'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800496 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800497 'bl', 'xkb:bl::fra', 'America/St_Barthelemy', 'fr', KML.ANSI,
498 'Saint Barthelemy'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800499 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800500 'bm', 'xkb:bm::eng', 'Atlantic/Bermuda', ['en-BM', 'pt'], KML.ANSI,
501 'Bermuda'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800502 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800503 'bn', 'xkb:bn::msa', 'Asia/Brunei', ['ms-BN', 'en-BN'], KML.ANSI,
504 'Brunei'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800505 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800506 'bo', 'xkb:latam::spa', 'America/La_Paz', ['es-419', 'qu'], KML.ANSI,
507 'Bolivia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800508 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800509 'bh', 'xkb:bh::ara', 'Asia/Bahrain', ['ar', 'en', 'fa', 'ru'], KML.ANSI,
510 'Bahrain'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800511 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800512 'bi', 'xkb:bi::fra', 'Africa/Bujumbura', ['fr-BI', 'rn'], KML.ANSI,
513 'Burundi'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800514 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800515 'bj', 'xkb:bj::fra', 'Africa/Porto-Novo', 'fr-BJ', KML.ANSI,
516 'Benin'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800517 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800518 'bt', 'xkb:bt::dzo', 'Asia/Thimphu', 'dz', KML.ANSI,
519 'Bhutan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800520 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800521 'jm', 'xkb:jm::eng', 'America/Jamaica', 'en-JM', KML.ANSI,
522 'Jamaica'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800523 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800524 'bw', 'xkb:bw::eng', 'Africa/Gaborone', ['en-BW', 'tn-BW'], KML.ANSI,
525 'Botswana'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800526 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800527 'ws', 'xkb:ws::smo', 'Pacific/Apia', ['sm', 'en-WS'], KML.ANSI,
528 'Samoa'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800529 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800530 'bq', 'xkb:bq::nld', 'America/Kralendijk', ['nl', 'en'], KML.ANSI,
531 'Bonaire, Saint Eustatius and Saba '),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800532 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800533 'bs', 'xkb:bs::eng', 'America/Nassau', 'en-BS', KML.ANSI,
534 'Bahamas'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800535 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800536 'je', 'xkb:je::eng', 'Europe/Jersey', ['en', 'pt'], KML.ANSI,
537 'Jersey'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800538 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800539 'by', 'xkb:by::bel', 'Europe/Minsk', ['be', 'ru'], KML.ANSI,
540 'Belarus'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800541 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800542 'bz', 'xkb:bz::eng', 'America/Belize', ['en-BZ', 'es'], KML.ANSI,
543 'Belize'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800544 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800545 'rw', 'xkb:rw::kin', 'Africa/Kigali', ['rw', 'en-RW'], KML.ANSI,
546 'Rwanda'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800547 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800548 'rs', 'xkb:rs::srp', 'Europe/Belgrade', ['sr', 'hu', 'bs'], KML.ANSI,
549 'Serbia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800550 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800551 'tl', 'xkb:us::eng', 'Asia/Dili', ['tet', 'pt-TL', 'en'], KML.ANSI,
552 'East Timor'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800553 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800554 're', 'xkb:re::fra', 'Indian/Reunion', 'fr-RE', KML.ANSI,
555 'Reunion'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800556 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800557 'tm', 'xkb:tm::tuk', 'Asia/Ashgabat', ['tk', 'ru', 'uz'], KML.ANSI,
558 'Turkmenistan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800559 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800560 'tj', 'xkb:tj::tgk', 'Asia/Dushanbe', ['tg', 'ru'], KML.ANSI,
561 'Tajikistan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800562 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800563 'tk', 'xkb:us::eng', 'Pacific/Fakaofo', ['tkl', 'en-TK'], KML.ANSI,
564 'Tokelau'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800565 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800566 'gw', 'xkb:gw::por', 'Africa/Bissau', ['pt-GW', 'pov'], KML.ANSI,
567 'Guinea-Bissau'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800568 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800569 'gu', 'xkb:gu::eng', 'Pacific/Guam', ['en-GU', 'ch-GU'], KML.ANSI,
570 'Guam'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800571 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800572 'gt', 'xkb:latam::spa', 'America/Guatemala', 'es-419', KML.ANSI,
573 'Guatemala'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800574 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800575 'gs', 'xkb:gs::eng', 'Atlantic/South_Georgia', 'en', KML.ANSI,
576 'South Georgia and the South Sandwich Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800577 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800578 'gq', 'xkb:gq::spa', 'Africa/Malabo', ['es-419', 'fr'], KML.ANSI,
579 'Equatorial Guinea'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800580 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800581 'gp', 'xkb:gp::fra', 'America/Guadeloupe', 'fr-GP', KML.ANSI,
582 'Guadeloupe'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800583 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800584 'gy', 'xkb:gy::eng', 'America/Guyana', 'en-GY', KML.ANSI,
585 'Guyana'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800586 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800587 'gg', 'xkb:gg::eng', 'Europe/Guernsey', ['en', 'fr'], KML.ANSI,
588 'Guernsey'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800589 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800590 'gf', 'xkb:gf::fra', 'America/Cayenne', 'fr-GF', KML.ANSI,
591 'French Guiana'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800592 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800593 'ge', 'xkb:ge::geo', 'Asia/Tbilisi', 'ka', KML.ANSI,
594 'Georgia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800595 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800596 'gd', 'xkb:gd::eng', 'America/Grenada', 'en-GD', KML.ANSI,
597 'Grenada'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800598 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800599 'ga', 'xkb:ga::fra', 'Africa/Libreville', 'fr-GA', KML.ANSI,
600 'Gabon'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800601 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800602 'sv', 'xkb:latam::spa', 'America/El_Salvador', 'es-419', KML.ANSI,
603 'El Salvador'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800604 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800605 'gn', 'xkb:gn::fra', 'Africa/Conakry', 'fr-GN', KML.ANSI,
606 'Guinea'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800607 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800608 'gm', 'xkb:gm::eng', 'Africa/Banjul', ['en-GM', 'mnk', 'wof'], KML.ANSI,
609 'Gambia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800610 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800611 'gl', 'xkb:gl::kal', ['America/Godthab', 'America/Danmarkshavn',
612 'America/Scoresbysund', 'America/Thule'], [
613 'kl', 'da-GL', 'en'], KML.ANSI,
614 'Greenland'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800615 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800616 'gi', 'xkb:gi::eng', 'Europe/Gibraltar', ['en-GI', 'es'], KML.ANSI,
617 'Gibraltar'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800618 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800619 'gh', 'xkb:gh::eng', 'Africa/Accra', ['en-GH', 'ak', 'ee'], KML.ANSI,
620 'Ghana'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800621 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800622 'om', 'xkb:om::ara', 'Asia/Muscat', ['ar', 'en', 'bal'], KML.ANSI,
623 'Oman'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800624 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800625 'tn', 'xkb:tn::ara', 'Africa/Tunis', ['ar', 'fr'], KML.ANSI,
626 'Tunisia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800627 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800628 'jo', 'xkb:jo::ara', 'Asia/Amman', ['ar', 'en'], KML.ANSI,
629 'Jordan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800630 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800631 'hn', 'xkb:latam::spa', 'America/Tegucigalpa', 'es-HN', KML.ANSI,
632 'Honduras'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800633 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800634 'hr', 'xkb:hr::scr', 'Europe/Zagreb', ['hr', 'en-GB'], KML.ISO,
635 'Croatia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800636 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800637 'ht', 'xkb:ht::hat', 'America/Port-au-Prince', ['ht'], KML.ANSI,
638 'Haiti'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800639 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800640 'hu', ['xkb:us::eng', 'xkb:hu::hun'], 'Europe/Budapest', [
641 'hu', 'en-GB'], KML.ISO,
642 'Hungary'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800643 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800644 've', 'xkb:latam::spa', 'America/Caracas', 'es-419', KML.ANSI,
645 'Venezuela'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800646 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800647 'pr', 'xkb:pr::eng', 'America/Puerto_Rico', ['en-PR'], KML.ANSI,
648 'Puerto Rico'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800649 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800650 'ps', 'xkb:ps::ara', ['Asia/Gaza', 'Asia/Hebron'], 'ar', KML.ANSI,
651 'Palestinian Territory'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800652 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800653 'pw', 'xkb:us::eng', 'Pacific/Palau', ['pau', 'sov', 'en-PW', 'tox',
654 'ja', 'fil', 'zh'], KML.ANSI,
655 'Palau'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800656 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800657 'sj', 'xkb:sj::nor', 'Arctic/Longyearbyen', ['no', 'ru'], KML.ANSI,
658 'Svalbard and Jan Mayen'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800659 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800660 'py', 'xkb:latam::spa', 'America/Asuncion', ['es-419', 'gn'], KML.ANSI,
661 'Paraguay'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800662 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800663 'iq', 'xkb:iq::ara', 'Asia/Baghdad', ['ar', 'ku', 'hy'], KML.ANSI,
664 'Iraq'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800665 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800666 'pa', 'xkb:latam::spa', 'America/Panama', ['es-419', 'en'], KML.ANSI,
667 'Panama'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800668 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800669 'pf', 'xkb:pf::fra', ['Pacific/Tahiti', 'Pacific/Marquesas',
670 'Pacific/Gambier'], ['fr-PF', 'ty'], KML.ANSI,
671 'French Polynesia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800672 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800673 'pg', 'xkb:pg::eng', ['Pacific/Port_Moresby',
674 'Pacific/Bougainville'], ['en-PG', 'ho', 'meu',
675 'tpi'], KML.ANSI,
676 'Papua New Guinea'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800677 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800678 'pk', 'xkb:pk::urd', 'Asia/Karachi', ['ur-PK', 'en-PK', 'pa', 'sd',
679 'ps', 'brh'], KML.ANSI,
680 'Pakistan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800681 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800682 'pn', 'xkb:pn::eng', 'Pacific/Pitcairn', 'en-PN', KML.ANSI,
683 'Pitcairn'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800684 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800685 'pm', 'xkb:pm::fra', 'America/Miquelon', 'fr-PM', KML.ANSI,
686 'Saint Pierre and Miquelon'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800687 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800688 'zm', 'xkb:zm::eng', 'Africa/Lusaka', ['en-ZM', 'bem', 'loz', 'lun',
689 'lue', 'ny', 'toi'], KML.ANSI,
690 'Zambia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800691 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800692 'eh', 'xkb:eh::ara', 'Africa/El_Aaiun', ['ar', 'mey'], KML.ANSI,
693 'Western Sahara'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800694 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800695 'ee', 'xkb:ee::est', 'Europe/Tallinn', ['et', 'ru', 'en-GB'], KML.ISO,
696 'Estonia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800697 Region(
Hung-Te Lin47da9092017-03-20 15:01:56 +0800698 'eg', 'xkb:eg::ara', 'Africa/Cairo', ['ar', 'en', 'fr'],
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800699 KML.ANSI, 'Egypt'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800700 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800701 'ec', 'xkb:latam::spa', ['America/Guayaquil'], 'es-419', KML.ANSI,
702 'Ecuador'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800703 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800704 'sb', 'xkb:sb::eng', 'Pacific/Guadalcanal', ['en-SB', 'tpi'], KML.ANSI,
705 'Solomon Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800706 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800707 'et', 'xkb:et::amh', 'Africa/Addis_Ababa', ['am', 'en-ET', 'om-ET',
708 'ti-ET'], KML.ANSI,
709 'Ethiopia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800710 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800711 'so', 'xkb:so::som', 'Africa/Mogadishu', ['so-SO', 'ar'], KML.ANSI,
712 'Somalia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800713 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800714 'zw', 'xkb:zw::eng', 'Africa/Harare', ['en-ZW', 'sn', 'nr'], KML.ANSI,
715 'Zimbabwe'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800716 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800717 'er', 'xkb:er::aar', 'Africa/Asmara', ['aa-ER', 'ar', 'tig', 'kun',
718 'ti-ER'], KML.ANSI,
719 'Eritrea'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800720 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800721 'me', 'xkb:me::srp', 'Europe/Podgorica', ['sr', 'hu', 'bs', 'sq', 'hr',
722 'rom'], KML.ANSI,
723 'Montenegro'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800724 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800725 'md', 'xkb:md::ron', 'Europe/Chisinau', ['ro', 'ru', 'gag'], KML.ANSI,
726 'Moldova'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800727 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800728 'mg', 'xkb:mg::fra', 'Indian/Antananarivo', ['fr-MG', 'mg'], KML.ANSI,
729 'Madagascar'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800730 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800731 'mf', 'xkb:mf::fra', 'America/Marigot', 'fr', KML.ANSI, 'Saint Martin'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800732 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800733 'ma', 'xkb:ma::ara', 'Africa/Casablanca', ['ar', 'fr'], KML.ANSI,
734 'Morocco'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800735 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800736 'mc', 'xkb:mc::fra', 'Europe/Monaco', ['fr-MC', 'en', 'it'], KML.ANSI,
737 'Monaco'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800738 Region(
739 'uz', 'xkb:uz::uzb', ['Asia/Samarkand', 'Asia/Tashkent'],
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800740 ['uz', 'ru', 'tg'], KML.ANSI, 'Uzbekistan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800741 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800742 'mm', 'xkb:mm::mya', 'Asia/Rangoon', 'my', KML.ANSI, 'Myanmar',
743 None),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800744 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800745 'ml', 'xkb:ml::fra', 'Africa/Bamako', ['fr-ML', 'bm'], KML.ANSI,
746 'Mali'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800747 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800748 'mo', 'xkb:mo::zho', 'Asia/Macau', ['zh', 'zh-MO', 'pt'], KML.ANSI,
749 'Macao'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800750 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800751 'mn', 'xkb:mn::mon', ['Asia/Ulaanbaatar', 'Asia/Hovd',
752 'Asia/Choibalsan'], ['mn', 'ru'], KML.ANSI,
753 'Mongolia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800754 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800755 'mh', 'xkb:mh::mah', ['Pacific/Majuro'], ['mh' 'en-MH'], KML.ANSI,
756 'Marshall Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800757 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800758 'mk', 'xkb:mk::mkd', 'Europe/Skopje', ['mk', 'sq', 'tr'], KML.ANSI,
759 'Macedonia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800760 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800761 'mu', 'xkb:mu::eng', 'Indian/Mauritius', ['en-MU', 'bho'], KML.ANSI,
762 'Mauritius'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800763 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800764 'mt', ['xkb:us::eng'], 'Europe/Malta', ['mt', 'en-GB'], KML.ISO,
765 'Malta'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800766 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800767 'mw', 'xkb:mw::nya', 'Africa/Blantyre', ['ny', 'yao', 'tum'], KML.ANSI,
768 'Malawi'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800769 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800770 'mv', 'xkb:mv::div', 'Indian/Maldives', ['dv', 'en'], KML.ANSI,
771 'Maldives'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800772 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800773 'mq', 'xkb:mq::fra', 'America/Martinique', 'fr-MQ', KML.ANSI,
774 'Martinique'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800775 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800776 'mp', 'xkb:us::eng', 'Pacific/Saipan', ['fil', 'tl', 'zh', 'ch-MP',
777 'en-MP'], KML.ANSI,
778 'Northern Mariana Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800779 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800780 'ms', 'xkb:ms::eng', 'America/Montserrat', 'en-MS', KML.ANSI,
781 'Montserrat'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800782 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800783 'mr', 'xkb:mr::ara', 'Africa/Nouakchott', ['ar', 'fuc', 'snk', 'fr',
784 'mey', 'wo'], KML.ANSI,
785 'Mauritania'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800786 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800787 'im', 'xkb:im::eng', 'Europe/Isle_of_Man', ['en', 'gv'], KML.ANSI,
788 'Isle of Man'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800789 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800790 'ug', 'xkb:ug::eng', 'Africa/Kampala', ['en-UG', 'lg', 'ar'], KML.ANSI,
791 'Uganda'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800792 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800793 'tz', 'xkb:tz::swa', 'Africa/Dar_es_Salaam', ['sw-TZ', 'en'], KML.ANSI,
794 'Tanzania'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800795 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800796 'io', 'xkb:io::eng', 'Indian/Chagos', 'en-IO', KML.ANSI,
797 'British Indian Ocean Territory'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800798 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800799 'sh', 'xkb:sh::eng', 'Atlantic/St_Helena', 'en-SH', KML.ANSI,
800 'Saint Helena'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800801 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800802 'fj', 'xkb:fj::eng', 'Pacific/Fiji', ['en-FJ', 'fj'], KML.ANSI,
803 'Fiji'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800804 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800805 'fk', 'xkb:fk::eng', 'Atlantic/Stanley', 'en-FK', KML.ANSI,
806 'Falkland Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800807 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800808 'fm', 'xkb:fm::eng', [
809 'Pacific/Chuuk', 'Pacific/Pohnpei', 'Pacific/Kosrae'], [
810 'en-FM', 'chk', 'pon', 'yap', 'kos', 'uli', 'woe', 'nkr',
811 'kpg'], KML.ANSI,
812 'Micronesia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800813 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800814 'fo', 'xkb:fo::fao', 'Atlantic/Faroe', ['fo', 'da-FO'], KML.ANSI,
815 'Faroe Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800816 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800817 'ni', 'xkb:latam::spa', 'America/Managua', ['es-419', 'en'], KML.ANSI,
818 'Nicaragua'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800819 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800820 'no', 'xkb:no::nor', 'Europe/Oslo', ['no', 'nb', 'nn', 'se'], KML.ISO,
821 'Norway'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800822 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800823 'na', 'xkb:na::eng', 'Africa/Windhoek', ['en-NA', 'af', 'de', 'hz',
824 'naq'], KML.ANSI,
825 'Namibia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800826 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800827 'vu', 'xkb:vu::bis', 'Pacific/Efate', ['bi', 'en-VU'], KML.ANSI,
828 'Vanuatu'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800829 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800830 'nc', 'xkb:nc::fra', 'Pacific/Noumea', 'fr-NC', KML.ANSI,
831 'New Caledonia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800832 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800833 'ne', 'xkb:ne::fra', 'Africa/Niamey', ['fr-NE', 'ha', 'kr'], KML.ANSI,
834 'Niger'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800835 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800836 'nf', 'xkb:nf::eng', 'Pacific/Norfolk', 'en-NF', KML.ANSI,
837 'Norfolk Island'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800838 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800839 'np', 'xkb:np::nep', 'Asia/Kathmandu', ['ne', 'en'], KML.ANSI,
840 'Nepal'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800841 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800842 'nr', 'xkb:nr::nau', 'Pacific/Nauru', ['na', 'en-NR'], KML.ANSI,
843 'Nauru'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800844 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800845 'nu', 'xkb:us::eng', 'Pacific/Niue', ['niu', 'en-NU'], KML.ANSI,
846 'Niue'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800847 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800848 'ck', 'xkb:ck::eng', 'Pacific/Rarotonga', ['en-CK', 'mi'], KML.ANSI,
849 'Cook Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800850 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800851 'ci', 'xkb:ci::fra', 'Africa/Abidjan', 'fr-CI', KML.ANSI,
852 'Ivory Coast'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800853 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800854 'co', 'xkb:latam::spa', 'America/Bogota', 'es-419', KML.ANSI,
855 'Colombia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800856 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800857 'cn', 'xkb:us::eng', 'Asia/Shanghai', 'zh-CN', KML.ANSI,
858 'China'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800859 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800860 'cm', 'xkb:cm::eng', 'Africa/Douala', ['en-CM', 'fr-CM'], KML.ANSI,
861 'Cameroon'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800862 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800863 'cc', 'xkb:cc::msa', 'Indian/Cocos', ['ms-CC', 'en'], KML.ANSI,
864 'Cocos Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800865 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800866 'cg', 'xkb:cg::fra', 'Africa/Brazzaville', ['fr-CG', 'kg'], KML.ANSI,
867 'Republic of the Congo'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800868 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800869 'cf', 'xkb:cf::fra', 'Africa/Bangui', ['fr-CF', 'sg', 'ln'], KML.ANSI,
870 'Central African Republic'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800871 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800872 'cd', 'xkb:cd::fra', ['Africa/Kinshasa', 'Africa/Lubumbashi'], [
873 'fr-CD', 'ln', 'kg'], KML.ANSI,
874 'Democratic Republic of the Congo'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800875 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800876 'cy', 'xkb:cy::ell', 'Asia/Nicosia', ['el-CY', 'tr-CY'], KML.ANSI,
877 'Cyprus'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800878 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800879 'cx', 'xkb:cx::eng', 'Indian/Christmas', ['en', 'zh'], KML.ANSI,
880 'Christmas Island'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800881 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800882 'cr', 'xkb:latam::spa', 'America/Costa_Rica', ['es-419'], KML.ANSI,
883 'Costa Rica'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800884 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800885 'cw', 'xkb:cw::nld', 'America/Curacao', ['nl'], KML.ANSI, 'Curacao'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800886 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800887 'cv', 'xkb:cv::por', 'Atlantic/Cape_Verde', 'pt-CV', KML.ANSI,
888 'Cape Verde'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800889 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800890 'cu', 'xkb:latam::spa', 'America/Havana', 'es-419', KML.ANSI,
891 'Cuba'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800892 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800893 'sz', 'xkb:sz::eng', 'Africa/Mbabane', ['en-SZ', 'ss-SZ'], KML.ANSI,
894 'Swaziland'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800895 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800896 'sy', 'xkb:sy::ara', 'Asia/Damascus', ['ar', 'ku', 'hy', 'arc', 'fr',
897 'en'], KML.ANSI,
898 'Syria'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800899 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800900 'sx', 'xkb:sx::nld', 'America/Lower_Princes', ['nl', 'en'], KML.ANSI,
901 'Sint Maarten'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800902 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800903 'kg', 'xkb:kg::kir', 'Asia/Bishkek', ['ky', 'uz', 'ru'], KML.ANSI,
904 'Kyrgyzstan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800905 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800906 'ke', 'xkb:ke::eng', 'Africa/Nairobi', ['en-KE', 'sw-KE'], KML.ANSI,
907 'Kenya'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800908 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800909 'ss', 'xkb:ss::eng', 'Africa/Juba', 'en', KML.ANSI,
910 'South Sudan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800911 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800912 'sr', 'xkb:sr::nld', 'America/Paramaribo', ['nl-SR', 'en', 'srn', 'hns',
913 'jv'], KML.ANSI,
914 'Suriname'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800915 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800916 'ki', 'xkb:ki::eng', ['Pacific/Tarawa', 'Pacific/Enderbury',
917 'Pacific/Kiritimati'], ['en-KI', 'gil'], KML.ANSI,
918 'Kiribati'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800919 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800920 'kh', 'xkb:kh::khm', 'Asia/Phnom_Penh', ['km', 'fr', 'en'], KML.ANSI,
921 'Cambodia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800922 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800923 'kn', 'xkb:kn::eng', 'America/St_Kitts', 'en-KN', KML.ANSI,
924 'Saint Kitts and Nevis'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800925 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800926 'km', 'xkb:km::ara', 'Indian/Comoro', ['ar', 'fr-KM'], KML.ANSI,
927 'Comoros'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800928 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800929 'st', 'xkb:st::por', 'Africa/Sao_Tome', 'pt-ST', KML.ANSI,
930 'Sao Tome and Principe'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800931 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800932 'si', 'xkb:si::slv', 'Europe/Ljubljana', ['sl', 'hu', 'it', 'sr', 'de',
933 'hr', 'en-GB'], KML.ISO,
934 'Slovenia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800935 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800936 'kp', 'xkb:kp::kor', 'Asia/Pyongyang', 'ko-KP', KML.ANSI,
937 'North Korea'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800938 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800939 'sn', 'xkb:sn::fra', 'Africa/Dakar', ['fr-SN', 'wo', 'fuc'], KML.ANSI,
940 'Senegal'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800941 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800942 'sm', 'xkb:sm::ita', 'Europe/San_Marino', 'it-SM', KML.ANSI,
943 'San Marino'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800944 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800945 'sl', 'xkb:sl::eng', 'Africa/Freetown', ['en-SL', 'men'], KML.ANSI,
946 'Sierra Leone'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800947 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800948 'sc', 'xkb:sc::eng', 'Indian/Mahe', ['en-SC', 'fr-SC'], KML.ANSI,
949 'Seychelles'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800950 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800951 'kz', 'xkb:kz::kaz', ['Asia/Almaty', 'Asia/Qyzylorda', 'Asia/Aqtobe',
952 'Asia/Aqtau'], ['kk', 'ru'], KML.ANSI,
953 'Kazakhstan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800954 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800955 'ky', 'xkb:ky::eng', 'America/Cayman', 'en-KY', KML.ANSI,
956 'Cayman Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800957 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800958 'sd', 'xkb:sd::ara', 'Africa/Khartoum', ['ar', 'en', 'fia'], KML.ANSI,
959 'Sudan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800960 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800961 'do', 'xkb:latam::spa', 'America/Santo_Domingo', 'es-419', KML.ANSI,
962 'Dominican Republic'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800963 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800964 'dm', 'xkb:dm::eng', 'America/Dominica', 'en-DM', KML.ANSI,
965 'Dominica'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800966 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800967 'dj', 'xkb:dj::fra', 'Africa/Djibouti', ['fr-DJ', 'ar'], KML.ANSI,
968 'Djibouti'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800969 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800970 'dk', 'xkb:dk::dan', 'Europe/Copenhagen', ['da-DK', 'en', 'fo',
971 'de-DK'], KML.ISO,
972 'Denmark'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800973 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800974 'vg', 'xkb:vg::eng', 'America/Tortola', 'en-VG', KML.ANSI,
975 'British Virgin Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800976 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800977 'ye', 'xkb:ye::ara', 'Asia/Aden', 'ar', KML.ANSI,
978 'Yemen'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800979 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800980 'dz', 'xkb:dz::ara', 'Africa/Algiers', 'ar', KML.ANSI,
981 'Algeria'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800982 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800983 'yt', 'xkb:yt::fra', 'Indian/Mayotte', 'fr-YT', KML.ANSI,
984 'Mayotte'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800985 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800986 'um', 'xkb:um::eng', ['Pacific/Johnston', 'Pacific/Midway',
987 'Pacific/Wake'], 'en-UM', KML.ANSI,
988 'United States Minor Outlying Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800989 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800990 'lb', 'xkb:lb::ara', 'Asia/Beirut', ['ar', 'fr-LB', 'en'], KML.ANSI,
991 'Lebanon'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800992 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800993 'lc', 'xkb:lc::eng', 'America/St_Lucia', 'en-LC', KML.ANSI,
994 'Saint Lucia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800995 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800996 'la', 'xkb:la::lao', 'Asia/Vientiane', ['lo', 'fr', 'en'], KML.ANSI,
997 'Laos'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800998 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +0800999 'tv', 'xkb:us::eng', 'Pacific/Funafuti', ['tvl', 'en', 'sm'], KML.ANSI,
1000 'Tuvalu'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001001 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001002 'tt', 'xkb:tt::eng', 'America/Port_of_Spain', ['en-TT', 'hns', 'fr',
1003 'es', 'zh'], KML.ANSI,
1004 'Trinidad and Tobago'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001005 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001006 'lk', 'xkb:lk::sin', 'Asia/Colombo', ['si', 'ta', 'en'], KML.ANSI,
1007 'Sri Lanka'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001008 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001009 'li', 'xkb:ch::ger', 'Europe/Vaduz', ['de', 'en-GB'], KML.ISO,
1010 'Liechtenstein'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001011 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001012 'lv', 'xkb:lv:apostrophe:lav', 'Europe/Riga', ['lv', 'lt', 'ru',
1013 'en-GB'], KML.ISO,
1014 'Latvia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001015 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001016 'to', 'xkb:to::ton', 'Pacific/Tongatapu', ['to', 'en-TO'], KML.ANSI,
1017 'Tonga'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001018 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001019 'lt', 'xkb:lt::lit', 'Europe/Vilnius', ['lt', 'ru', 'pl'], KML.ISO,
1020 'Lithuania'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001021 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001022 'lu', 'xkb:lu::ltz', 'Europe/Luxembourg', ['lb', 'de-LU'], KML.ANSI,
1023 'Luxembourg'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001024 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001025 'lr', 'xkb:lr::eng', 'Africa/Monrovia', 'en-LR', KML.ANSI,
1026 'Liberia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001027 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001028 'ls', 'xkb:ls::eng', 'Africa/Maseru', ['en-LS', 'st', 'zu'], KML.ANSI,
1029 'Lesotho'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001030 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001031 'tf', 'xkb:tf::fra', 'Indian/Kerguelen', 'fr', KML.ANSI,
1032 'French Southern Territories'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001033 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001034 'tg', 'xkb:tg::fra', 'Africa/Lome', ['fr-TG', 'ee', 'hna'], KML.ANSI,
1035 'Togo'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001036 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001037 'td', 'xkb:td::fra', 'Africa/Ndjamena', ['fr-TD', 'ar'], KML.ANSI,
1038 'Chad'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001039 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001040 'tc', 'xkb:tc::eng', 'America/Grand_Turk', 'en-TC', KML.ANSI,
1041 'Turks and Caicos Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001042 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001043 'ly', 'xkb:ly::ara', 'Africa/Tripoli', ['ar', 'it', 'en'], KML.ANSI,
1044 'Libya'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001045 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001046 'va', 'xkb:va::lat', 'Europe/Vatican', ['la', 'it', 'fr'], KML.ANSI,
1047 'Vatican'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001048 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001049 'vc', 'xkb:vc::eng', 'America/St_Vincent', ['en-VC', 'fr'], KML.ANSI,
1050 'Saint Vincent and the Grenadines'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001051 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001052 'ad', 'xkb:ad::cat', 'Europe/Andorra', 'ca', KML.ANSI,
1053 'Andorra'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001054 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001055 'ag', 'xkb:ag::eng', 'America/Antigua', 'en-AG', KML.ANSI,
1056 'Antigua and Barbuda'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001057 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001058 'af', 'xkb:af::fas', 'Asia/Kabul', ['fa-AF', 'ps'], KML.ANSI,
1059 'Afghanistan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001060 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001061 'ai', 'xkb:ai::eng', 'America/Anguilla', 'en-AI', KML.ANSI,
1062 'Anguilla'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001063 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001064 'vi', 'xkb:vi::eng', 'America/St_Thomas', 'en-VI', KML.ANSI,
1065 'U.S. Virgin Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001066 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001067 'ir', 'xkb:ir::fas', 'Asia/Tehran', ['fa-IR', 'ku'], KML.ANSI,
1068 'Iran'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001069 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001070 'am', 'xkb:am::hye', 'Asia/Yerevan', 'hy', KML.ANSI,
1071 'Armenia'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001072 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001073 'al', 'xkb:al::sqi', 'Europe/Tirane', ['sq', 'el'], KML.ANSI,
1074 'Albania'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001075 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001076 'ao', 'xkb:ao::por', 'Africa/Luanda', 'pt-AO', KML.ANSI,
1077 'Angola'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001078 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001079 'as', 'xkb:as::eng', 'Pacific/Pago_Pago', ['en-AS', 'sm'], KML.ANSI,
1080 'American Samoa'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001081 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001082 'aw', 'xkb:aw::nld', 'America/Aruba', ['nl-AW', 'es', 'en'], KML.ANSI,
1083 'Aruba'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001084 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001085 'ax', 'xkb:ax::swe', 'Europe/Mariehamn', 'sv-AX', KML.ANSI,
1086 'Aland Islands'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001087 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001088 'az', 'xkb:az::aze', 'Asia/Baku', ['az', 'ru', 'hy'], KML.ANSI,
1089 'Azerbaijan'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001090 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001091 'ua', 'xkb:ua::ukr', [
1092 'Europe/Kiev', 'Europe/Uzhgorod', 'Europe/Zaporozhye'], [
1093 'uk', 'ru-UA', 'rom', 'pl', 'hu'], KML.ANSI,
1094 'Ukraine'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001095 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001096 'qa', 'xkb:qa::ara', 'Asia/Bahrain', ['ar', 'en'], KML.ANSI,
1097 'Qatar'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001098 Region(
Hung-Te Lin98501ae2017-06-02 15:53:33 +08001099 'mz', 'xkb:mz::por', 'Africa/Maputo', ['pt-MZ', 'vmw'], KML.ANSI,
1100 'Mozambique'),
1101 ]
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001102"""A list of :py:class:`regions.Region` objects for
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001103**unconfirmed** regions. These may contain incorrect information (or not
1104supported by Chrome browser yet), and all fields must be reviewed before launch.
1105See http://goto/vpdsettings.
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001106
1107Currently, non-Latin keyboards must use an underlying Latin keyboard
1108for VPD. (This assumption should be revisited when moving items to
1109:py:data:`regions.Region.REGIONS_LIST`.) This is
1110currently being discussed on <http://crbug.com/325389>.
1111
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001112Some timezones or locales may be missing from ``timezone_settings.cc`` (see
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001113http://crosbug.com/p/23902). This must be rectified before moving
1114items to :py:data:`regions.Region.REGIONS_LIST`.
1115"""
1116
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001117
1118def ConsolidateRegions(regions):
1119 """Consolidates a list of regions into a dict.
1120
1121 Args:
1122 regions: A list of Region objects. All objects for any given
1123 region code must be identical or we will throw an exception.
1124 (We allow duplicates in case identical region objects are
1125 defined in both regions.py and the overlay, e.g., when moving
1126 items to the public overlay.)
1127
1128 Returns:
1129 A dict from region code to Region.
1130
1131 Raises:
1132 RegionException: If there are multiple regions defined for a given
1133 region, and the values for those regions differ.
1134 """
1135 # Build a dict from region_code to the first Region with that code.
1136 region_dict = {}
1137 for r in regions:
1138 existing_region = region_dict.get(r.region_code)
1139 if existing_region:
1140 if existing_region.GetFieldsDict() != r.GetFieldsDict():
1141 raise RegionException(
1142 'Conflicting definitions for region %r: %r, %r' %
1143 (r.region_code, existing_region.GetFieldsDict(),
1144 r.GetFieldsDict()))
1145 else:
1146 region_dict[r.region_code] = r
1147
1148 return region_dict
1149
1150
1151def BuildRegionsDict(include_all=False):
1152 """Builds a dictionary mapping from code to :py:class:`regions.Region` object.
1153
1154 The regions include:
1155
1156 * :py:data:`regions.REGIONS_LIST`
1157 * :py:data:`regions_overlay.REGIONS_LIST`
1158 * Only if ``include_all`` is true:
1159
1160 * :py:data:`regions.UNCONFIRMED_REGIONS_LIST`
1161 * :py:data:`regions.INCOMPLETE_REGIONS_LIST`
1162
1163 A region may only appear in one of the above lists, or this function
1164 will (deliberately) fail.
1165 """
1166 regions = list(REGIONS_LIST)
1167 if include_all:
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001168 known_codes = [r.region_code for r in regions]
1169 regions += [r for r in UNCONFIRMED_REGIONS_LIST if r.region_code not in
1170 known_codes]
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001171
1172 # Build dictionary of region code to list of regions with that
1173 # region code. Check manually for duplicates, since the region may
1174 # be present both in the overlay and the public repo.
1175 return ConsolidateRegions(regions)
1176
1177
1178REGIONS = BuildRegionsDict()
1179
1180
1181def main(args=sys.argv[1:], out=None):
1182 parser = argparse.ArgumentParser(description=(
1183 'Display all known regions and their parameters. '))
1184 parser.add_argument('--format',
1185 choices=('human-readable', 'csv', 'json', 'yaml'),
1186 default='human-readable',
1187 help='Output format (default=%(default)s)')
1188 parser.add_argument('--all', action='store_true',
1189 help='Include unconfirmed and incomplete regions')
Hung-Te Linfe67ea42017-07-21 18:59:55 +08001190 parser.add_argument('--notes', action='store_true',
1191 help='Include notes in output')
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001192 parser.add_argument('--output', default=None,
1193 help='Specify output file')
Hung-Te Lin34f3d382015-04-10 18:18:23 +08001194 parser.add_argument('--overlay', default=None,
1195 help='Specify a Python file to overlay extra data')
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001196 args = parser.parse_args(args)
1197
Hung-Te Lin34f3d382015-04-10 18:18:23 +08001198 if args.overlay is not None:
1199 execfile(args.overlay)
1200
Hung-Te Lin1a14cc42015-04-14 01:23:34 +08001201 if args.all:
1202 # Add an additional 'confirmed' property to help identifying region status,
1203 # for autotests, unit tests and factory module.
1204 Region.FIELDS.insert(1, 'confirmed')
1205 for r in REGIONS_LIST:
1206 r.confirmed = True
1207 for r in UNCONFIRMED_REGIONS_LIST:
1208 r.confirmed = False
1209
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001210 regions_dict = BuildRegionsDict(args.all)
Hung-Te Lin34f3d382015-04-10 18:18:23 +08001211
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001212 if out is None:
1213 if args.output is None:
1214 out = sys.stdout
1215 else:
1216 out = open(args.output, 'w')
1217
Hung-Te Linfe67ea42017-07-21 18:59:55 +08001218 if args.notes or args.format == 'csv':
1219 Region.FIELDS += ['notes']
1220
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001221 # Handle YAML and JSON output.
1222 if args.format == 'yaml' or args.format == 'json':
1223 data = {}
1224 for region in regions_dict.values():
1225 item = {}
1226 for field in Region.FIELDS:
1227 item[field] = getattr(region, field)
1228 data[region.region_code] = item
1229 if args.format == 'yaml':
1230 yaml.dump(data, out)
1231 else:
1232 json.dump(data, out)
1233 return
1234
1235 # Handle CSV or plain-text output: build a list of lines to print.
1236 lines = [Region.FIELDS]
1237
1238 def CoerceToString(value):
1239 """Returns the arguments in simple string type.
1240
1241 If value is a list, concatenate its values with commas. Otherwise, just
1242 return value.
1243 """
1244 if isinstance(value, list):
1245 return ','.join(value)
1246 else:
1247 return str(value)
Hung-Te Lin1a14cc42015-04-14 01:23:34 +08001248
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001249 for region in sorted(regions_dict.values(), key=lambda v: v.region_code):
1250 lines.append([CoerceToString(getattr(region, field))
1251 for field in Region.FIELDS])
1252
1253 if args.format == 'csv':
Hung-Te Lin1a14cc42015-04-14 01:23:34 +08001254 # Just print the lines in CSV format. Note the values may include ',' so the
1255 # separator must be tab.
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001256 for l in lines:
Hung-Te Lin1a14cc42015-04-14 01:23:34 +08001257 print('\t'.join(l))
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001258 elif args.format == 'human-readable':
1259 num_columns = len(lines[0])
1260
1261 # Calculate maximum length of each column.
1262 max_lengths = []
1263 for column_no in xrange(num_columns):
1264 max_lengths.append(max(len(line[column_no]) for line in lines))
1265
1266 # Print each line, padding as necessary to the max column length.
1267 for line in lines:
1268 for column_no in xrange(num_columns):
1269 out.write(line[column_no].ljust(max_lengths[column_no] + 2))
1270 out.write('\n')
1271 else:
Wei-Han Chen763e6722018-11-16 12:23:19 +08001272 sys.exit('Sorry, unknown format specified: %s' % args.format)
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001273
1274
1275if __name__ == '__main__':
1276 main()