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