blob: 4cbfdf6a724c41b7f98a4ccdfc727781abf7a0c3 [file] [log] [blame]
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001#!/usr/bin/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:).
25# Examples: xkb:us:intl:eng, ime:ime:zh-t:cangjie
26KEYBOARD_PATTERN = re.compile(r'^xkb:\w+:\w*:\w+$|'
27 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
133 numeric_id = None
134 """An integer for mapping into Chrome OS HWID.
135 Please never change this once it is assigned."""
136
Hung-Te Lin436b6cc2015-04-03 12:15:47 +0800137 regulatory_domain = None
138 """An ISO 3166-1 alpha 2 upper-cased two-letter region code for setting
139 Wireless regulatory. See crosbug.com/p/38745 for more details.
140
141 When omitted, this will derive from region_code."""
142
Hung-Te Lin1a14cc42015-04-14 01:23:34 +0800143 confirmed = None
144 """An optional boolean flag to indicate if the region data is confirmed."""
145
146 FIELDS = ['numeric_id', 'region_code', 'description', 'keyboards',
147 'time_zones', 'locales', 'keyboard_mechanical_layout',
148 'regulatory_domain']
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800149 """Names of fields that define the region."""
150
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800151 def __init__(self, region_code, keyboards, time_zones, locales,
152 keyboard_mechanical_layout, description=None, notes=None,
Hung-Te Lin436b6cc2015-04-03 12:15:47 +0800153 numeric_id=None, regdomain=None):
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800154 """Constructor.
155
156 Args:
157 region_code: See :py:attr:`region_code`.
158 keyboards: See :py:attr:`keyboards`. A single string is accepted for
159 backward compatibility.
160 time_zones: See :py:attr:`time_zones`.
161 locales: See :py:attr:`locales`. A single string is accepted
162 for backward compatibility.
163 keyboard_mechanical_layout: See :py:attr:`keyboard_mechanical_layout`.
164 description: See :py:attr:`description`.
165 notes: See :py:attr:`notes`.
166 numeric_id: See :py:attr:`numeric_id`. This must be None or a
167 non-negative integer.
Hung-Te Lin436b6cc2015-04-03 12:15:47 +0800168 regdomain: See :py:attr:`regulatory_domain`.
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800169 """
Hung-Te Lin436b6cc2015-04-03 12:15:47 +0800170
171 def regdomain_from_region(region):
172 if region.find('.') >= 0:
173 region = region[:region.index('.')]
174 if len(region) == 2:
175 return region.upper()
176 return None
177
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800178 # Quick check: should be 'gb', not 'uk'
179 if region_code == 'uk':
180 raise RegionException("'uk' is not a valid region code (use 'gb')")
181
182 self.region_code = region_code
183 self.keyboards = MakeList(keyboards)
184 self.time_zones = MakeList(time_zones)
185 self.locales = MakeList(locales)
186 self.keyboard_mechanical_layout = keyboard_mechanical_layout
187 self.description = description or region_code
188 self.notes = notes
189 self.numeric_id = numeric_id
Hung-Te Lin436b6cc2015-04-03 12:15:47 +0800190 self.regulatory_domain = (regdomain or regdomain_from_region(region_code))
Hung-Te Lin1a14cc42015-04-14 01:23:34 +0800191 self.confirmed = None
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800192
193 if self.numeric_id is not None:
194 if not isinstance(self.numeric_id, int):
195 raise TypeError('Numeric ID is %r but should be an integer' %
196 (self.numeric_id,))
197 if self.numeric_id < 0:
198 raise ValueError('Numeric ID is %r but should be non-negative' %
199 self.numeric_id)
200
201 for f in (self.keyboards, self.locales):
202 assert all(isinstance(x, str) for x in f), (
203 'Expected a list of strings, not %r' % f)
204 for f in self.keyboards:
205 assert KEYBOARD_PATTERN.match(f), (
206 'Keyboard pattern %r does not match %r' % (
207 f, KEYBOARD_PATTERN.pattern))
208 for f in self.locales:
209 assert LOCALE_PATTERN.match(f), (
210 'Locale %r does not match %r' % (
211 f, LOCALE_PATTERN.pattern))
Hung-Te Lin436b6cc2015-04-03 12:15:47 +0800212 assert (self.regulatory_domain and
213 len(self.regulatory_domain) == 2 and
214 self.regulatory_domain.upper() == self.regulatory_domain), (
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800215 'Regulatory domain settings error for region %s' % region_code)
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800216
217 def __repr__(self):
218 return 'Region(%s)' % (', '.join([getattr(self, x) for x in self.FIELDS]))
219
220 def GetFieldsDict(self):
221 """Returns a dict of all substantive fields.
222
223 notes and description are excluded.
224 """
225 return dict((k, getattr(self, k)) for k in self.FIELDS)
226
227_KML = Region.KeyboardMechanicalLayout
228REGIONS_LIST = [
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800229 Region(
230 'au', 'xkb:us::eng', 'Australia/Sydney', 'en-AU', _KML.ANSI,
231 'Australia', None, 1),
232 Region(
233 'be', 'xkb:be::nld', 'Europe/Brussels', 'en-GB', _KML.ISO,
234 'Belgium',
235 'Flemish (Belgian Dutch) keyboard; British English language for '
236 'neutrality', 2),
237 Region(
238 'br', 'xkb:br::por', 'America/Sao_Paulo', 'pt-BR', _KML.ABNT2,
239 'Brazil (ABNT2)',
240 (
241 'ABNT2 = ABNT NBR 10346 variant 2. This is the preferred layout '
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800242 'for Brazil. ABNT2 is mostly an ISO layout, but it 12 keys between '
243 'the shift keys; see http://goo.gl/twA5tq'), 3),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800244 Region(
245 'br.abnt', 'xkb:br::por', 'America/Sao_Paulo', 'pt-BR',
246 _KML.ISO, 'Brazil (ABNT)',
247 (
248 'Like ABNT2, but lacking the extra key to the left of the right '
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800249 'shift key found in that layout. ABNT2 (the "br" region) is '
250 'preferred to this layout'), 4),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800251 Region(
252 'br.usintl', 'xkb:us:intl:eng', 'America/Sao_Paulo', 'pt-BR',
253 _KML.ANSI, 'Brazil (US Intl)',
254 'Brazil with US International keyboard layout. ABNT2 ("br") and '
255 'ABNT1 ("br.abnt1 ") are both preferred to this.', 5),
256 Region(
257 'ca.ansi', 'xkb:us::eng', 'America/Toronto', 'en-CA', _KML.ANSI,
258 'Canada (US keyboard)',
Hung-Te Lin55bbea42016-06-08 11:38:45 +0800259 'Canada with US (ANSI) keyboard. Only allowed if there are separate US '
260 'English, Canadian English, and French SKUs. Not for en/fr hybrid ANSI '
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800261 'keyboards; for that you would want ca.hybridansi. See '
262 'http://goto/cros-canada', 6),
263 Region(
264 'ca.fr', 'xkb:ca::fra', 'America/Toronto', 'fr-CA', _KML.ISO,
265 'Canada (French keyboard)',
266 (
267 'Canadian French (ISO) keyboard. The most common configuration for '
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800268 'Canadian French SKUs. See http://goto/cros-canada'), 7),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800269 Region(
270 'ca.hybrid', 'xkb:ca:eng:eng', 'America/Toronto', 'en-CA',
271 _KML.ISO, 'Canada (hybrid ISO)',
272 (
273 'Canada with hybrid (ISO) xkb:ca:eng:eng + xkb:ca::fra keyboard, '
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800274 'defaulting to English language and keyboard. Used only if there '
275 'needs to be a single SKU for all of Canada. See '
276 'http://goto/cros-canada'), 8),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800277 Region(
278 'ca.hybridansi', 'xkb:ca:eng:eng', 'America/Toronto', 'en-CA',
279 _KML.ANSI, 'Canada (hybrid ANSI)',
280 (
281 'Canada with hybrid (ANSI) xkb:ca:eng:eng + xkb:ca::fra keyboard, '
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800282 'defaulting to English language and keyboard. Used only if there '
283 'needs to be a single SKU for all of Canada. See '
284 'http://goto/cros-canada'), 9),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800285 Region(
286 'ca.multix', 'xkb:ca:multix:fra', 'America/Toronto', 'fr-CA',
287 _KML.ISO, 'Canada (multilingual)',
288 (
289 "Canadian Multilingual keyboard; you probably don't want this. See "
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800290 'http://goto/cros-canada'), 10),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800291 Region(
cncmidac586332015-10-24 16:13:22 +0800292 'ch', 'xkb:ch::ger', 'Europe/Zurich', 'de-CH', _KML.ISO,
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800293 'Switzerland',
cncmidac586332015-10-24 16:13:22 +0800294 'German keyboard', 11),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800295 Region(
296 'de', 'xkb:de::ger', 'Europe/Berlin', 'de', _KML.ISO, 'Germany',
297 None, 12),
298 Region(
299 'es', 'xkb:es::spa', 'Europe/Madrid', 'es', _KML.ISO, 'Spain',
300 None, 13),
301 Region(
302 'fi', 'xkb:fi::fin', 'Europe/Helsinki', 'fi', _KML.ISO, 'Finland',
303 None, 14),
304 Region(
305 'fr', 'xkb:fr::fra', 'Europe/Paris', 'fr', _KML.ISO, 'France',
306 None, 15),
307 Region(
308 'gb', 'xkb:gb:extd:eng', 'Europe/London', 'en-GB', _KML.ISO, 'UK',
309 None, 16),
310 Region(
311 'ie', 'xkb:gb:extd:eng', 'Europe/Dublin', 'en-GB', _KML.ISO,
312 'Ireland', None, 17),
313 Region(
314 'in', 'xkb:us::eng', 'Asia/Calcutta', 'en-US', _KML.ANSI, 'India',
315 None, 18),
316 Region(
317 'it', 'xkb:it::ita', 'Europe/Rome', 'it', _KML.ISO, 'Italy', None,
318 19),
319 Region(
320 'latam-es-419', 'xkb:es::spa', 'America/Mexico_City', 'es-419',
321 _KML.ISO, 'Hispanophone Latin America',
322 (
323 'Spanish-speaking countries in Latin America, using the Iberian '
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800324 '(Spain) Spanish keyboard, which is increasingly dominant in '
325 'Latin America. Known to be correct for '
326 'Chile, Colombia, Mexico, Peru; '
327 'still unconfirmed for other es-419 countries. The old Latin '
328 'American layout (xkb:latam::spa) has not been approved; before '
329 'using that you must seek review through http://goto/vpdsettings. '
330 'See also http://goo.gl/Iffuqh. Note that 419 is the UN M.49 '
Hung-Te Lin436b6cc2015-04-03 12:15:47 +0800331 'region code for Latin America'), 20, 'MX'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800332 Region(
333 'my', 'xkb:us::eng', 'Asia/Kuala_Lumpur', 'ms', _KML.ANSI,
334 'Malaysia', None, 21),
335 Region(
336 'nl', 'xkb:us:intl:eng', 'Europe/Amsterdam', 'nl', _KML.ANSI,
337 'Netherlands', None, 22),
338 Region(
339 'nordic', 'xkb:se::swe', 'Europe/Stockholm', 'en-US', _KML.ISO,
340 'Nordics',
341 (
342 'Unified SKU for Sweden, Norway, and Denmark. This defaults '
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800343 'to Swedish keyboard layout, but starts with US English language '
344 'for neutrality. Use if there is a single combined SKU for Nordic '
Hung-Te Lin436b6cc2015-04-03 12:15:47 +0800345 'countries.'), 23, 'SE'),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800346 Region(
347 'nz', 'xkb:us::eng', 'Pacific/Auckland', 'en-NZ', _KML.ANSI,
348 'New Zealand', None, 24),
349 Region(
350 'ph', 'xkb:us::eng', 'Asia/Manila', 'en-US', _KML.ANSI,
351 'Philippines', None, 25),
352 Region(
353 'ru', 'xkb:ru::rus', 'Europe/Moscow', 'ru', _KML.ANSI, 'Russia',
354 'For R31+ only; R30 and earlier must use US keyboard for login',
355 26),
356 Region(
357 'se', 'xkb:se::swe', 'Europe/Stockholm', 'sv', _KML.ISO, 'Sweden',
358 (
359 'Use this if there separate SKUs for Nordic countries (Sweden, '
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800360 'Norway, and Denmark), or the device is only shipping to Sweden. '
361 "If there is a single unified SKU, use 'nordic' instead."), 27),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800362 Region(
363 'sg', 'xkb:us::eng', 'Asia/Singapore', 'en-GB', _KML.ANSI,
364 'Singapore', None, 28),
365 Region(
366 'us', 'xkb:us::eng', 'America/Los_Angeles', 'en-US', _KML.ANSI,
367 'United States', None, 29),
368 Region(
369 'jp', 'xkb:jp::jpn', 'Asia/Tokyo', 'ja', _KML.JIS, 'Japan', None,
370 30),
371 Region(
Bernie Thompson5d3b89e2016-01-28 15:55:38 -0800372 'za', 'xkb:gb:extd:eng', 'Africa/Johannesburg', 'en-ZA',
373 _KML.ISO, 'South Africa', None, 31),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800374 Region(
375 'ng', 'xkb:us:intl:eng', 'Africa/Lagos', 'en-GB', _KML.ANSI,
376 'Nigeria', None, 32),
377 Region(
378 'hk',
379 ['xkb:us::eng', 'ime:zh-t:cangjie', 'ime:zh-t:quick',
380 'ime:zh-t:array', 'ime:zh-t:dayi', 'ime:zh-t:zhuyin',
381 'ime:zh-t:pinyin'], 'Asia/Hong_Kong',
382 ['zh-TW', 'en-GB', 'zh-CN'], _KML.ANSI, 'Hong Kong', None, 33),
383 Region(
384 'gcc', ['xkb:us::eng', 'm17n:ar', 't13n:ar'], 'Asia/Riyadh',
385 ['ar', 'en-GB'], _KML.ANSI, 'Gulf Cooperation Council (GCC)',
386 (
387 'GCC is a regional intergovernmental political and economic '
388 'union consisting of all Arab states of the Persian Gulf except '
389 'for Iraq. Its member states are the Islamic monarchies of '
390 'Bahrain, Kuwait, Oman, Qatar, Saudi Arabia, and the United Arab '
391 'Emirates.'), 34, 'SA'),
392 Region(
393 'cz', ['xkb:cz::cze', 'xkb:cz:qwerty:cze'], 'Europe/Prague',
394 ['cs', 'en-GB'], _KML.ISO, 'Czech Republic', None, 35),
395 Region(
396 'th',
397 ['xkb:us::eng', 'm17n:th', 'm17n:th_pattajoti', 'm17n:th_tis'],
398 'Asia/Bangkok', ['th', 'en-GB'], _KML.ANSI, 'Thailand', None, 36),
399 Region(
400 'id', 'xkb:us::ind', 'Asia/Jakarta', ['id', 'en-GB'], _KML.ANSI,
401 'Indonesia', None, 37),
402 Region(
403 'tw',
404 ['xkb:us::eng', 'ime:zh-t:zhuyin', 'ime:zh-t:array',
405 'ime:zh-t:dayi', 'ime:zh-t:cangjie', 'ime:zh-t:quick',
406 'ime:zh-t:pinyin'], 'Asia/Taipei', ['zh-TW', 'en-US'],
407 _KML.ANSI, 'Taiwan', None, 38),
408 Region(
409 'pl', 'xkb:pl::pol', 'Europe/Warsaw', ['pl', 'en-GB'],
410 _KML.ANSI, 'Poland', None, 39),
411 Region(
412 'gr', ['xkb:us::eng', 'xkb:gr::gre', 't13n:el'], 'Europe/Athens',
413 ['el', 'en-GB'], _KML.ANSI, 'Greece', None, 40),
414 Region(
415 'il', ['xkb:us::eng', 'xkb:il::heb', 't13n:he'], 'Asia/Jerusalem',
416 ['he', 'en-US', 'ar'], _KML.ANSI, 'Israel', None, 41),
417 Region(
418 'pt', 'xkb:pt::por', 'Europe/Lisbon', ['pt-PT', 'en-GB'],
419 _KML.ISO, 'Portugal', None, 42),
420 Region(
421 'ro', ['xkb:us::eng', 'xkb:ro::rum'], 'Europe/Bucharest',
422 ['ro', 'hu', 'de', 'en-GB'], _KML.ISO, 'Romania', None, 43),
423 Region(
424 'kr', ['xkb:us::eng', 'ime:ko:hangul'], 'Asia/Seoul',
Hung-Te Lin4eb4f922016-03-04 11:51:04 +0800425 ['ko', 'en-US'], _KML.ANSI, 'South Korea', None, 44),
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800426 Region(
427 'ae', 'xkb:us::eng', 'Asia/Dubai', 'ar', _KML.ANSI, 'UAE', None,
428 45),
429 Region(
430 'za.us', 'xkb:us::eng', 'Africa/Johannesburg', 'en-ZA',
431 _KML.ANSI, 'South Africa', None, 46),
432 Region(
433 'vn',
434 ['xkb:us::eng', 'm17n:vi_telex', 'm17n:vi_vni', 'm17n:vi_viqr',
435 'm17n:vi_tcvn'], 'Asia/Ho_Chi_Minh',
436 ['vi', 'en-GB', 'en-US', 'fr', 'zh-TW'], _KML.ANSI, 'Vietnam',
437 None, 47),
438 Region(
439 'at', ['xkb:de::ger', 'xkb:de:neo:ger'], 'Europe/Vienna',
440 ['de', 'en-GB'], _KML.ISO, 'Austria', None, 48),
441 Region(
442 'sk', ['xkb:us::eng', 'xkb:sk::slo'], 'Europe/Bratislava',
443 ['sk', 'hu', 'cs', 'en-GB'], _KML.ISO, 'Slovakia', None, 49),
444 Region(
445 'ch.usintl', 'xkb:us:intl:eng', 'Europe/Zurich', 'en-US',
446 _KML.ANSI, 'Switzerland (US Intl)',
Hung-Te Lindf179fd2016-05-12 19:22:13 +0800447 'Switzerland with US International keyboard layout.', 50),
448 Region(
449 'pe', 'xkb:pe::spa', 'America/Lima', 'es-PE',
450 _KML.ANSI, 'Peru', None, 115),
451 Region(
452 'sa', 'xkb:us::eng', 'Asia/Riyadh', ['ar-SA', 'en'], _KML.ANSI,
453 'Saudi Arabia', None, 128),
454 Region(
455 'mx', 'xkb:mx::spa', 'America/Mexico_City', 'es-MX', _KML.ANSI,
456 'Mexico', None, 154),
457 Region(
458 'cl', 'xkb:cl::spa', 'America/Santiago', 'es-CL', _KML.ANSI, 'Chile',
459 None, 176),
460 Region(
461 'kw', 'xkb:kw::ara', 'Asia/Kuwait', ['ar-KW', 'en'], _KML.ANSI,
462 'Kuwait', None, 201),
463 Region(
464 'uy', 'xkb:uy::spa', 'America/Montevideo', 'es-UY', _KML.ANSI,
465 'Uruguay', None, 216)]
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800466"""A list of :py:class:`regions.Region` objects for
467all **confirmed** regions. A confirmed region is a region whose
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800468properties are known to be correct and valid: all contents (locale / timezone /
469keyboards) are supported by Chrome."""
Hung-Te Lin76c55b22015-03-31 14:47:14 +0800470
471
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800472UNCONFIRMED_REGIONS_LIST = [
473 Region(
474 'bd', 'xkb:bd::ben', 'Asia/Dhaka', ['bn-BD', 'en'], _KML.ANSI,
475 'Bangladesh', None, 51),
476 Region(
477 'bf', 'xkb:bf::fra', 'Africa/Ouagadougou', 'fr-BF', _KML.ANSI,
478 'Burkina Faso', None, 52),
479 Region(
480 'bg', ['xkb:bg::bul', 'xkb:bg:phonetic:bul'], 'Europe/Sofia',
481 ['bg', 'tr', 'en-GB'], _KML.ANSI, 'Bulgaria', None, 53),
482 Region(
483 'ba', 'xkb:ba::bos', 'Europe/Sarajevo', ['bs', 'hr-BA', 'sr-BA'],
484 _KML.ANSI, 'Bosnia and Herzegovina', None, 54),
485 Region(
486 'bb', 'xkb:bb::eng', 'America/Barbados', 'en-BB', _KML.ANSI,
487 'Barbados', None, 55),
488 Region(
489 'wf', 'xkb:us::eng', 'Pacific/Wallis', ['wls', 'fud', 'fr-WF'],
490 _KML.ANSI, 'Wallis and Futuna', None, 56),
491 Region(
492 'bl', 'xkb:bl::fra', 'America/St_Barthelemy', 'fr', _KML.ANSI,
493 'Saint Barthelemy', None, 57),
494 Region(
495 'bm', 'xkb:bm::eng', 'Atlantic/Bermuda', ['en-BM', 'pt'],
496 _KML.ANSI, 'Bermuda', None, 58),
497 Region(
498 'bn', 'xkb:bn::msa', 'Asia/Brunei', ['ms-BN', 'en-BN'],
499 _KML.ANSI, 'Brunei', None, 59),
500 Region(
501 'bo', 'xkb:bo::spa', 'America/La_Paz', ['es-BO', 'qu', 'ay'],
502 _KML.ANSI, 'Bolivia', None, 60),
503 Region(
504 'bh', 'xkb:bh::ara', 'Asia/Bahrain', ['ar-BH', 'en', 'fa', 'ur'],
505 _KML.ANSI, 'Bahrain', None, 61),
506 Region(
507 'bi', 'xkb:bi::fra', 'Africa/Bujumbura', ['fr-BI', 'rn'],
508 _KML.ANSI, 'Burundi', None, 62),
509 Region(
510 'bj', 'xkb:bj::fra', 'Africa/Porto-Novo', 'fr-BJ', _KML.ANSI,
511 'Benin', None, 63),
512 Region(
513 'bt', 'xkb:bt::dzo', 'Asia/Thimphu', 'dz', _KML.ANSI, 'Bhutan',
514 None, 64),
515 Region(
516 'jm', 'xkb:jm::eng', 'America/Jamaica', 'en-JM', _KML.ANSI,
517 'Jamaica', None, 65),
518 Region(
519 'bw', 'xkb:bw::eng', 'Africa/Gaborone', ['en-BW', 'tn-BW'],
520 _KML.ANSI, 'Botswana', None, 66),
521 Region(
522 'ws', 'xkb:ws::smo', 'Pacific/Apia', ['sm', 'en-WS'], _KML.ANSI,
523 'Samoa', None, 67),
524 Region(
525 'bq', 'xkb:bq::nld', 'America/Kralendijk', ['nl', 'pap', 'en'],
526 _KML.ANSI, 'Bonaire, Saint Eustatius and Saba ', None, 68),
527 Region(
528 'bs', 'xkb:bs::eng', 'America/Nassau', 'en-BS', _KML.ANSI,
529 'Bahamas', None, 69),
530 Region(
531 'je', 'xkb:je::eng', 'Europe/Jersey', ['en', 'pt'], _KML.ANSI,
532 'Jersey', None, 70),
533 Region(
534 'by', 'xkb:by::bel', 'Europe/Minsk', ['be', 'ru'], _KML.ANSI,
535 'Belarus', None, 71),
536 Region(
537 'bz', 'xkb:bz::eng', 'America/Belize', ['en-BZ', 'es'],
538 _KML.ANSI, 'Belize', None, 72),
539 Region(
540 'rw', 'xkb:rw::kin', 'Africa/Kigali',
541 ['rw', 'en-RW', 'fr-RW', 'sw'], _KML.ANSI, 'Rwanda', None, 73),
542 Region(
543 'rs', 'xkb:rs::srp', 'Europe/Belgrade', ['sr', 'hu', 'bs', 'rom'],
544 _KML.ANSI, 'Serbia', None, 74),
545 Region(
546 'tl', 'xkb:us::eng', 'Asia/Dili', ['tet', 'pt-TL', 'id', 'en'],
547 _KML.ANSI, 'East Timor', None, 75),
548 Region(
549 're', 'xkb:re::fra', 'Indian/Reunion', 'fr-RE', _KML.ANSI,
550 'Reunion', None, 76),
551 Region(
552 'tm', 'xkb:tm::tuk', 'Asia/Ashgabat', ['tk', 'ru', 'uz'],
553 _KML.ANSI, 'Turkmenistan', None, 77),
554 Region(
555 'tj', 'xkb:tj::tgk', 'Asia/Dushanbe', ['tg', 'ru'], _KML.ANSI,
556 'Tajikistan', None, 78),
557 Region(
558 'tk', 'xkb:us::eng', 'Pacific/Fakaofo', ['tkl', 'en-TK'],
559 _KML.ANSI, 'Tokelau', None, 79),
560 Region(
561 'gw', 'xkb:gw::por', 'Africa/Bissau', ['pt-GW', 'pov'],
562 _KML.ANSI, 'Guinea-Bissau', None, 80),
563 Region(
564 'gu', 'xkb:gu::eng', 'Pacific/Guam', ['en-GU', 'ch-GU'],
565 _KML.ANSI, 'Guam', None, 81),
566 Region(
567 'gt', 'xkb:gt::spa', 'America/Guatemala', 'es-GT', _KML.ANSI,
568 'Guatemala', None, 82),
569 Region(
570 'gs', 'xkb:gs::eng', 'Atlantic/South_Georgia', 'en', _KML.ANSI,
571 'South Georgia and the South Sandwich Islands', None, 83),
572 Region(
573 'gq', 'xkb:gq::spa', 'Africa/Malabo', ['es-GQ', 'fr'],
574 _KML.ANSI, 'Equatorial Guinea', None, 84),
575 Region(
576 'gp', 'xkb:gp::fra', 'America/Guadeloupe', 'fr-GP', _KML.ANSI,
577 'Guadeloupe', None, 85),
578 Region(
579 'gy', 'xkb:gy::eng', 'America/Guyana', 'en-GY', _KML.ANSI,
580 'Guyana', None, 86),
581 Region(
582 'gg', 'xkb:gg::eng', 'Europe/Guernsey', ['en', 'fr'], _KML.ANSI,
583 'Guernsey', None, 87),
584 Region(
585 'gf', 'xkb:gf::fra', 'America/Cayenne', 'fr-GF', _KML.ANSI,
586 'French Guiana', None, 88),
587 Region(
588 'ge', 'xkb:ge::geo', 'Asia/Tbilisi', 'ka', _KML.ANSI, 'Georgia', None,
589 89),
590 Region(
591 'gd', 'xkb:gd::eng', 'America/Grenada', 'en-GD', _KML.ANSI,
592 'Grenada', None, 90),
593 Region(
594 'ga', 'xkb:ga::fra', 'Africa/Libreville', 'fr-GA', _KML.ANSI,
595 'Gabon', None, 91),
596 Region(
597 'sv', 'xkb:sv::spa', 'America/El_Salvador', 'es-SV', _KML.ANSI,
598 'El Salvador', None, 92),
599 Region(
600 'gn', 'xkb:gn::fra', 'Africa/Conakry', 'fr-GN', _KML.ANSI,
601 'Guinea', None, 93),
602 Region(
603 'gm', 'xkb:gm::eng', 'Africa/Banjul',
604 ['en-GM', 'mnk', 'wof', 'wo', 'ff'], _KML.ANSI, 'Gambia', None, 94),
605 Region(
606 'gl', 'xkb:gl::kal',
607 ['America/Godthab', 'America/Danmarkshavn',
608 'America/Scoresbysund', 'America/Thule'], ['kl', 'da-GL', 'en'],
609 _KML.ANSI, 'Greenland', None, 95),
610 Region(
611 'gi', 'xkb:gi::eng', 'Europe/Gibraltar',
612 ['en-GI', 'es', 'it', 'pt'], _KML.ANSI, 'Gibraltar', None, 96),
613 Region(
614 'gh', 'xkb:gh::eng', 'Africa/Accra', ['en-GH', 'ak', 'ee', 'tw'],
615 _KML.ANSI, 'Ghana', None, 97),
616 Region(
617 'om', 'xkb:om::ara', 'Asia/Muscat', ['ar-OM', 'en', 'bal', 'ur'],
618 _KML.ANSI, 'Oman', None, 98),
619 Region(
620 'tn', 'xkb:tn::ara', 'Africa/Tunis', ['ar-TN', 'fr'], _KML.ANSI,
621 'Tunisia', None, 99),
622 Region(
623 'jo', 'xkb:jo::ara', 'Asia/Amman', ['ar-JO', 'en'], _KML.ANSI,
624 'Jordan', None, 100),
625 Region(
626 'hr', 'xkb:hr::scr', 'Europe/Zagreb', ['hr', 'en-GB'],
627 _KML.ISO, 'Croatia', None, 101),
628 Region(
629 'ht', 'xkb:ht::hat', 'America/Port-au-Prince', ['ht', 'fr-HT'],
630 _KML.ANSI, 'Haiti', None, 102),
631 Region(
632 'hu', ['xkb:us::eng', 'xkb:hu::hun'], 'Europe/Budapest',
633 ['hu', 'en-GB'], _KML.ISO, 'Hungary', None, 103),
634 Region(
635 'hn', 'xkb:hn::spa', 'America/Tegucigalpa', 'es-HN', _KML.ANSI,
636 'Honduras', None, 104),
637 Region(
638 've', 'xkb:ve::spa', 'America/Caracas', 'es-VE', _KML.ANSI,
639 'Venezuela', None, 105),
640 Region(
641 'pr', 'xkb:pr::eng', 'America/Puerto_Rico', ['en-PR', 'es-PR'],
642 _KML.ANSI, 'Puerto Rico', None, 106),
643 Region(
644 'ps', 'xkb:ps::ara', ['Asia/Gaza', 'Asia/Hebron'], 'ar-PS',
645 _KML.ANSI, 'Palestinian Territory', None, 107),
646 Region(
647 'pw', 'xkb:us::eng', 'Pacific/Palau',
648 ['pau', 'sov', 'en-PW', 'tox', 'ja', 'fil', 'zh'], _KML.ANSI,
649 'Palau', None, 108),
650 Region(
651 'sj', 'xkb:sj::nor', 'Arctic/Longyearbyen', ['no', 'ru'],
652 _KML.ANSI, 'Svalbard and Jan Mayen', None, 109),
653 Region(
654 'py', 'xkb:py::spa', 'America/Asuncion', ['es-PY', 'gn'],
655 _KML.ANSI, 'Paraguay', None, 110),
656 Region(
657 'iq', 'xkb:iq::ara', 'Asia/Baghdad', ['ar-IQ', 'ku', 'hy'],
658 _KML.ANSI, 'Iraq', None, 111),
659 Region(
660 'pa', 'xkb:pa::spa', 'America/Panama', ['es-PA', 'en'],
661 _KML.ANSI, 'Panama', None, 112),
662 Region(
663 'pf', 'xkb:pf::fra',
664 ['Pacific/Tahiti', 'Pacific/Marquesas', 'Pacific/Gambier'],
665 ['fr-PF', 'ty'], _KML.ANSI, 'French Polynesia', None, 113),
666 Region(
667 'pg', 'xkb:pg::eng',
668 ['Pacific/Port_Moresby', 'Pacific/Bougainville'],
669 ['en-PG', 'ho', 'meu', 'tpi'], _KML.ANSI, 'Papua New Guinea', None,
670 114),
671 Region(
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800672 'pk', 'xkb:pk::urd', 'Asia/Karachi',
673 ['ur-PK', 'en-PK', 'pa', 'sd', 'ps', 'brh'], _KML.ANSI,
674 'Pakistan', None, 116),
675 Region(
676 'pn', 'xkb:pn::eng', 'Pacific/Pitcairn', 'en-PN', _KML.ANSI,
677 'Pitcairn', None, 117),
678 Region(
679 'pm', 'xkb:pm::fra', 'America/Miquelon', 'fr-PM', _KML.ANSI,
680 'Saint Pierre and Miquelon', None, 118),
681 Region(
682 'zm', 'xkb:zm::eng', 'Africa/Lusaka',
683 ['en-ZM', 'bem', 'loz', 'lun', 'lue', 'ny', 'toi'], _KML.ANSI,
684 'Zambia', None, 119),
685 Region(
686 'eh', 'xkb:eh::ara', 'Africa/El_Aaiun', ['ar', 'mey'],
687 _KML.ANSI, 'Western Sahara', None, 120),
688 Region(
689 'ee', 'xkb:ee::est', 'Europe/Tallinn', ['et', 'ru', 'en-GB'], _KML.ISO,
690 'Estonia', None, 121),
691 Region(
692 'eg', 'xkb:eg::ara', 'Africa/Cairo', ['ar-EG', 'en', 'fr'],
693 _KML.ANSI, 'Egypt', None, 122),
694 Region(
695 'ec', 'xkb:ec::spa', ['America/Guayaquil', 'Pacific/Galapagos'],
696 'es-EC', _KML.ANSI, 'Ecuador', None, 123),
697 Region(
698 'sb', 'xkb:sb::eng', 'Pacific/Guadalcanal', ['en-SB', 'tpi'],
699 _KML.ANSI, 'Solomon Islands', None, 124),
700 Region(
701 'et', 'xkb:et::amh', 'Africa/Addis_Ababa',
702 ['am', 'en-ET', 'om-ET', 'ti-ET', 'so-ET', 'sid'], _KML.ANSI,
703 'Ethiopia', None, 125),
704 Region(
705 'so', 'xkb:so::som', 'Africa/Mogadishu',
706 ['so-SO', 'ar-SO', 'it', 'en-SO'], _KML.ANSI, 'Somalia', None, 126),
707 Region(
708 'zw', 'xkb:zw::eng', 'Africa/Harare', ['en-ZW', 'sn', 'nr', 'nd'],
709 _KML.ANSI, 'Zimbabwe', None, 127),
710 Region(
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800711 'er', 'xkb:er::aar', 'Africa/Asmara',
712 ['aa-ER', 'ar', 'tig', 'kun', 'ti-ER'], _KML.ANSI, 'Eritrea', None,
713 129),
714 Region(
715 'me', 'xkb:me::srp', 'Europe/Podgorica',
716 ['sr', 'hu', 'bs', 'sq', 'hr', 'rom'], _KML.ANSI, 'Montenegro',
717 None, 130),
718 Region(
719 'md', 'xkb:md::ron', 'Europe/Chisinau', ['ro', 'ru', 'gag', 'tr'],
720 _KML.ANSI, 'Moldova', None, 131),
721 Region(
722 'mg', 'xkb:mg::fra', 'Indian/Antananarivo', ['fr-MG', 'mg'],
723 _KML.ANSI, 'Madagascar', None, 132),
724 Region(
725 'mf', 'xkb:mf::fra', 'America/Marigot', 'fr', _KML.ANSI,
726 'Saint Martin', None, 133),
727 Region(
728 'ma', 'xkb:ma::ara', 'Africa/Casablanca', ['ar-MA', 'fr'],
729 _KML.ANSI, 'Morocco', None, 134),
730 Region(
731 'mc', 'xkb:mc::fra', 'Europe/Monaco', ['fr-MC', 'en', 'it'],
732 _KML.ANSI, 'Monaco', None, 135),
733 Region(
734 'uz', 'xkb:uz::uzb', ['Asia/Samarkand', 'Asia/Tashkent'],
735 ['uz', 'ru', 'tg'], _KML.ANSI, 'Uzbekistan', None, 136),
736 Region(
737 'mm', 'xkb:mm::mya', 'Asia/Rangoon', 'my', _KML.ANSI, 'Myanmar',
738 None, 137),
739 Region(
740 'ml', 'xkb:ml::fra', 'Africa/Bamako', ['fr-ML', 'bm'],
741 _KML.ANSI, 'Mali', None, 138),
742 Region(
743 'mo', 'xkb:mo::zho', 'Asia/Macau', ['zh', 'zh-MO', 'pt'],
744 _KML.ANSI, 'Macao', None, 139),
745 Region(
746 'mn', 'xkb:mn::mon',
747 ['Asia/Ulaanbaatar', 'Asia/Hovd', 'Asia/Choibalsan'],
748 ['mn', 'ru'], _KML.ANSI, 'Mongolia', None, 140),
749 Region(
750 'mh', 'xkb:mh::mah', ['Pacific/Majuro', 'Pacific/Kwajalein'],
751 ['mh', 'en-MH'], _KML.ANSI, 'Marshall Islands', None, 141),
752 Region(
753 'mk', 'xkb:mk::mkd', 'Europe/Skopje',
754 ['mk', 'sq', 'tr', 'rmm', 'sr'], _KML.ANSI, 'Macedonia', None, 142),
755 Region(
756 'mu', 'xkb:mu::eng', 'Indian/Mauritius', ['en-MU', 'bho', 'fr'],
757 _KML.ANSI, 'Mauritius', None, 143),
758 Region(
759 'mt', ['xkb:us::eng', 'xkb:mt::mlt'], 'Europe/Malta', ['mt', 'en-GB'],
760 _KML.ISO, 'Malta', None, 144),
761 Region(
762 'mw', 'xkb:mw::nya', 'Africa/Blantyre',
763 ['ny', 'yao', 'tum', 'swk'], _KML.ANSI, 'Malawi', None, 145),
764 Region(
765 'mv', 'xkb:mv::div', 'Indian/Maldives', ['dv', 'en'], _KML.ANSI,
766 'Maldives', None, 146),
767 Region(
768 'mq', 'xkb:mq::fra', 'America/Martinique', 'fr-MQ', _KML.ANSI,
769 'Martinique', None, 147),
770 Region(
771 'mp', 'xkb:us::eng', 'Pacific/Saipan',
772 ['fil', 'tl', 'zh', 'ch-MP', 'en-MP'], _KML.ANSI,
773 'Northern Mariana Islands', None, 148),
774 Region(
775 'ms', 'xkb:ms::eng', 'America/Montserrat', 'en-MS', _KML.ANSI,
776 'Montserrat', None, 149),
777 Region(
778 'mr', 'xkb:mr::ara', 'Africa/Nouakchott',
779 ['ar-MR', 'fuc', 'snk', 'fr', 'mey', 'wo'], _KML.ANSI,
780 'Mauritania', None, 150),
781 Region(
782 'im', 'xkb:im::eng', 'Europe/Isle_of_Man', ['en', 'gv'],
783 _KML.ANSI, 'Isle of Man', None, 151),
784 Region(
785 'ug', 'xkb:ug::eng', 'Africa/Kampala',
786 ['en-UG', 'lg', 'sw', 'ar'], _KML.ANSI, 'Uganda', None, 152),
787 Region(
788 'tz', 'xkb:tz::swa', 'Africa/Dar_es_Salaam',
789 ['sw-TZ', 'en', 'ar'], _KML.ANSI, 'Tanzania', None, 153),
790 Region(
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800791 'io', 'xkb:io::eng', 'Indian/Chagos', 'en-IO', _KML.ANSI,
792 'British Indian Ocean Territory', None, 155),
793 Region(
794 'sh', 'xkb:sh::eng', 'Atlantic/St_Helena', 'en-SH', _KML.ANSI,
795 'Saint Helena', None, 156),
796 Region(
797 'fj', 'xkb:fj::eng', 'Pacific/Fiji', ['en-FJ', 'fj'], _KML.ANSI,
798 'Fiji', None, 157),
799 Region(
800 'fk', 'xkb:fk::eng', 'Atlantic/Stanley', 'en-FK', _KML.ANSI,
801 'Falkland Islands', None, 158),
802 Region(
803 'fm', 'xkb:fm::eng',
804 ['Pacific/Chuuk', 'Pacific/Pohnpei', 'Pacific/Kosrae'],
805 ['en-FM', 'chk', 'pon', 'yap', 'kos', 'uli', 'woe', 'nkr', 'kpg'],
806 _KML.ANSI, 'Micronesia', None, 159),
807 Region(
808 'fo', 'xkb:fo::fao', 'Atlantic/Faroe', ['fo', 'da-FO'],
809 _KML.ANSI, 'Faroe Islands', None, 160),
810 Region(
811 'ni', 'xkb:ni::spa', 'America/Managua', ['es-NI', 'en'],
812 _KML.ANSI, 'Nicaragua', None, 161),
813 Region(
814 'no', 'xkb:no::nor', 'Europe/Oslo',
815 ['no', 'nb', 'nn', 'se', 'fi'], _KML.ISO, 'Norway', None, 162),
816 Region(
817 'na', 'xkb:na::eng', 'Africa/Windhoek',
818 ['en-NA', 'af', 'de', 'hz', 'naq'], _KML.ANSI, 'Namibia', None, 163),
819 Region(
820 'vu', 'xkb:vu::bis', 'Pacific/Efate', ['bi', 'en-VU', 'fr-VU'],
821 _KML.ANSI, 'Vanuatu', None, 164),
822 Region(
823 'nc', 'xkb:nc::fra', 'Pacific/Noumea', 'fr-NC', _KML.ANSI,
824 'New Caledonia', None, 165),
825 Region(
826 'ne', 'xkb:ne::fra', 'Africa/Niamey',
827 ['fr-NE', 'ha', 'kr', 'dje'], _KML.ANSI, 'Niger', None, 166),
828 Region(
829 'nf', 'xkb:nf::eng', 'Pacific/Norfolk', 'en-NF', _KML.ANSI,
830 'Norfolk Island', None, 167),
831 Region(
832 'np', 'xkb:np::nep', 'Asia/Kathmandu', ['ne', 'en'], _KML.ANSI,
833 'Nepal', None, 168),
834 Region(
835 'nr', 'xkb:nr::nau', 'Pacific/Nauru', ['na', 'en-NR'],
836 _KML.ANSI, 'Nauru', None, 169),
837 Region(
838 'nu', 'xkb:us::eng', 'Pacific/Niue', ['niu', 'en-NU'],
839 _KML.ANSI, 'Niue', None, 170),
840 Region(
841 'ck', 'xkb:ck::eng', 'Pacific/Rarotonga', ['en-CK', 'mi'],
842 _KML.ANSI, 'Cook Islands', None, 171),
843 Region(
844 'ci', 'xkb:ci::fra', 'Africa/Abidjan', 'fr-CI', _KML.ANSI,
845 'Ivory Coast', None, 172),
846 Region(
847 'co', 'xkb:co::spa', 'America/Bogota', 'es-CO', _KML.ANSI,
848 'Colombia', None, 173),
849 Region(
850 'cn', 'xkb:us::eng', 'Asia/Shanghai', 'zh-CN', _KML.ANSI, 'China',
851 None, 174),
852 Region(
853 'cm', 'xkb:cm::eng', 'Africa/Douala', ['en-CM', 'fr-CM'],
854 _KML.ANSI, 'Cameroon', None, 175),
855 Region(
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800856 'cc', 'xkb:cc::msa', 'Indian/Cocos', ['ms-CC', 'en'], _KML.ANSI,
857 'Cocos Islands', None, 177),
858 Region(
859 'cg', 'xkb:cg::fra', 'Africa/Brazzaville',
860 ['fr-CG', 'kg', 'ln-CG'], _KML.ANSI, 'Republic of the Congo', None,
861 178),
862 Region(
863 'cf', 'xkb:cf::fra', 'Africa/Bangui', ['fr-CF', 'sg', 'ln', 'kg'],
864 _KML.ANSI, 'Central African Republic', None, 179),
865 Region(
866 'cd', 'xkb:cd::fra', ['Africa/Kinshasa', 'Africa/Lubumbashi'],
867 ['fr-CD', 'ln', 'kg'], _KML.ANSI,
868 'Democratic Republic of the Congo', None, 180),
869 Region(
870 'cy', 'xkb:cy::ell', 'Asia/Nicosia', ['el-CY', 'tr-CY', 'en'],
871 _KML.ANSI, 'Cyprus', None, 181),
872 Region(
873 'cx', 'xkb:cx::eng', 'Indian/Christmas', ['en', 'zh', 'ms-CC'],
874 _KML.ANSI, 'Christmas Island', None, 182),
875 Region(
876 'cr', 'xkb:cr::spa', 'America/Costa_Rica', ['es-CR', 'en'],
877 _KML.ANSI, 'Costa Rica', None, 183),
878 Region(
879 'cw', 'xkb:cw::nld', 'America/Curacao', ['nl', 'pap'],
880 _KML.ANSI, 'Curacao', None, 184),
881 Region(
882 'cv', 'xkb:cv::por', 'Atlantic/Cape_Verde', 'pt-CV', _KML.ANSI,
883 'Cape Verde', None, 185),
884 Region(
885 'cu', 'xkb:cu::spa', 'America/Havana', 'es-CU', _KML.ANSI, 'Cuba',
886 None, 186),
887 Region(
888 'sz', 'xkb:sz::eng', 'Africa/Mbabane', ['en-SZ', 'ss-SZ'],
889 _KML.ANSI, 'Swaziland', None, 187),
890 Region(
891 'sy', 'xkb:sy::ara', 'Asia/Damascus',
892 ['ar-SY', 'ku', 'hy', 'arc', 'fr', 'en'], _KML.ANSI, 'Syria', None,
893 188),
894 Region(
895 'sx', 'xkb:sx::nld', 'America/Lower_Princes', ['nl', 'en'],
896 _KML.ANSI, 'Sint Maarten', None, 189),
897 Region(
898 'kg', 'xkb:kg::kir', 'Asia/Bishkek', ['ky', 'uz', 'ru'],
899 _KML.ANSI, 'Kyrgyzstan', None, 190),
900 Region(
901 'ke', 'xkb:ke::eng', 'Africa/Nairobi', ['en-KE', 'sw-KE'],
902 _KML.ANSI, 'Kenya', None, 191),
903 Region(
904 'ss', 'xkb:ss::eng', 'Africa/Juba', 'en', _KML.ANSI,
905 'South Sudan', None, 192),
906 Region(
907 'sr', 'xkb:sr::nld', 'America/Paramaribo',
908 ['nl-SR', 'en', 'srn', 'hns', 'jv'], _KML.ANSI, 'Suriname', None, 193),
909 Region(
910 'ki', 'xkb:ki::eng',
911 ['Pacific/Tarawa', 'Pacific/Enderbury', 'Pacific/Kiritimati'],
912 ['en-KI', 'gil'], _KML.ANSI, 'Kiribati', None, 194),
913 Region(
914 'kh', 'xkb:kh::khm', 'Asia/Phnom_Penh', ['km', 'fr', 'en'],
915 _KML.ANSI, 'Cambodia', None, 195),
916 Region(
917 'kn', 'xkb:kn::eng', 'America/St_Kitts', 'en-KN', _KML.ANSI,
918 'Saint Kitts and Nevis', None, 196),
919 Region(
920 'km', 'xkb:km::ara', 'Indian/Comoro', ['ar', 'fr-KM'],
921 _KML.ANSI, 'Comoros', None, 197),
922 Region(
923 'st', 'xkb:st::por', 'Africa/Sao_Tome', 'pt-ST', _KML.ANSI,
924 'Sao Tome and Principe', None, 198),
925 Region(
926 'si', 'xkb:si::slv', 'Europe/Ljubljana',
927 ['sl', 'hu', 'it', 'sr', 'de', 'hr', 'en-GB'], _KML.ISO,
928 'Slovenia', None, 199),
929 Region(
930 'kp', 'xkb:kp::kor', 'Asia/Pyongyang', 'ko-KP', _KML.ANSI,
931 'North Korea', None, 200),
932 Region(
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800933 'sn', 'xkb:sn::fra', 'Africa/Dakar',
934 ['fr-SN', 'wo', 'fuc', 'mnk'], _KML.ANSI, 'Senegal', None, 202),
935 Region(
936 'sm', 'xkb:sm::ita', 'Europe/San_Marino', 'it-SM', _KML.ANSI,
937 'San Marino', None, 203),
938 Region(
939 'sl', 'xkb:sl::eng', 'Africa/Freetown', ['en-SL', 'men', 'tem'],
940 _KML.ANSI, 'Sierra Leone', None, 204),
941 Region(
942 'sc', 'xkb:sc::eng', 'Indian/Mahe', ['en-SC', 'fr-SC'],
943 _KML.ANSI, 'Seychelles', None, 205),
944 Region(
945 'kz', 'xkb:kz::kaz',
946 ['Asia/Almaty', 'Asia/Qyzylorda', 'Asia/Aqtobe', 'Asia/Aqtau',
947 'Asia/Oral'], ['kk', 'ru'], _KML.ANSI, 'Kazakhstan', None, 206),
948 Region(
949 'ky', 'xkb:ky::eng', 'America/Cayman', 'en-KY', _KML.ANSI,
950 'Cayman Islands', None, 207),
951 Region(
952 'sd', 'xkb:sd::ara', 'Africa/Khartoum', ['ar-SD', 'en', 'fia'],
953 _KML.ANSI, 'Sudan', None, 208),
954 Region(
955 'do', 'xkb:do::spa', 'America/Santo_Domingo', 'es-DO',
956 _KML.ANSI, 'Dominican Republic', None, 209),
957 Region(
958 'dm', 'xkb:dm::eng', 'America/Dominica', 'en-DM', _KML.ANSI,
959 'Dominica', None, 210),
960 Region(
961 'dj', 'xkb:dj::fra', 'Africa/Djibouti',
962 ['fr-DJ', 'ar', 'so-DJ', 'aa'], _KML.ANSI, 'Djibouti', None, 211),
963 Region(
964 'dk', 'xkb:dk::dan', 'Europe/Copenhagen',
965 ['da-DK', 'en', 'fo', 'de-DK'], _KML.ISO, 'Denmark', None, 212),
966 Region(
967 'vg', 'xkb:vg::eng', 'America/Tortola', 'en-VG', _KML.ANSI,
968 'British Virgin Islands', None, 213),
969 Region(
970 'ye', 'xkb:ye::ara', 'Asia/Aden', 'ar-YE', _KML.ANSI, 'Yemen',
971 None, 214),
972 Region(
973 'dz', 'xkb:dz::ara', 'Africa/Algiers', 'ar-DZ', _KML.ANSI,
974 'Algeria', None, 215),
975 Region(
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +0800976 'yt', 'xkb:yt::fra', 'Indian/Mayotte', 'fr-YT', _KML.ANSI,
977 'Mayotte', None, 217),
978 Region(
979 'um', 'xkb:um::eng',
980 ['Pacific/Johnston', 'Pacific/Midway', 'Pacific/Wake'], 'en-UM',
981 _KML.ANSI, 'United States Minor Outlying Islands', None, 218),
982 Region(
983 'lb', 'xkb:lb::ara', 'Asia/Beirut',
984 ['ar-LB', 'fr-LB', 'en', 'hy'], _KML.ANSI, 'Lebanon', None, 219),
985 Region(
986 'lc', 'xkb:lc::eng', 'America/St_Lucia', 'en-LC', _KML.ANSI,
987 'Saint Lucia', None, 220),
988 Region(
989 'la', 'xkb:la::lao', 'Asia/Vientiane', ['lo', 'fr', 'en'],
990 _KML.ANSI, 'Laos', None, 221),
991 Region(
992 'tv', 'xkb:us::eng', 'Pacific/Funafuti',
993 ['tvl', 'en', 'sm', 'gil'], _KML.ANSI, 'Tuvalu', None, 222),
994 Region(
995 'tt', 'xkb:tt::eng', 'America/Port_of_Spain',
996 ['en-TT', 'hns', 'fr', 'es', 'zh'], _KML.ANSI,
997 'Trinidad and Tobago', None, 223),
998 Region(
999 'tr', 'xkb:tr::tur', 'Europe/Istanbul',
1000 ['tr', 'ku', 'diq', 'az', 'av'], _KML.ISO, 'Turkey', None, 224),
1001 Region(
1002 'lk', 'xkb:lk::sin', 'Asia/Colombo', ['si', 'ta', 'en'],
1003 _KML.ANSI, 'Sri Lanka', None, 225),
1004 Region(
1005 'li', 'xkb:ch::ger', 'Europe/Vaduz', ['de', 'en-GB'], _KML.ISO,
1006 'Liechtenstein', None, 226),
1007 Region(
1008 'lv', 'xkb:lv:apostrophe:lav', 'Europe/Riga',
1009 ['lv', 'lt', 'ru', 'en-GB'], _KML.ISO, 'Latvia', None, 227),
1010 Region(
1011 'to', 'xkb:to::ton', 'Pacific/Tongatapu', ['to', 'en-TO'],
1012 _KML.ANSI, 'Tonga', None, 228),
1013 Region(
1014 'lt', 'xkb:lt::lit', 'Europe/Vilnius', ['lt', 'ru', 'pl', 'en-GB'],
1015 _KML.ISO, 'Lithuania', None, 229),
1016 Region(
1017 'lu', 'xkb:lu::ltz', 'Europe/Luxembourg',
1018 ['lb', 'de-LU', 'fr-LU'], _KML.ANSI, 'Luxembourg', None, 230),
1019 Region(
1020 'lr', 'xkb:lr::eng', 'Africa/Monrovia', 'en-LR', _KML.ANSI,
1021 'Liberia', None, 231),
1022 Region(
1023 'ls', 'xkb:ls::eng', 'Africa/Maseru', ['en-LS', 'st', 'zu', 'xh'],
1024 _KML.ANSI, 'Lesotho', None, 232),
1025 Region(
1026 'tf', 'xkb:tf::fra', 'Indian/Kerguelen', 'fr', _KML.ANSI,
1027 'French Southern Territories', None, 233),
1028 Region(
1029 'tg', 'xkb:tg::fra', 'Africa/Lome',
1030 ['fr-TG', 'ee', 'hna', 'kbp', 'dag', 'ha'], _KML.ANSI, 'Togo',
1031 None, 234),
1032 Region(
1033 'td', 'xkb:td::fra', 'Africa/Ndjamena', ['fr-TD', 'ar-TD', 'sre'],
1034 _KML.ANSI, 'Chad', None, 235),
1035 Region(
1036 'tc', 'xkb:tc::eng', 'America/Grand_Turk', 'en-TC', _KML.ANSI,
1037 'Turks and Caicos Islands', None, 236),
1038 Region(
1039 'ly', 'xkb:ly::ara', 'Africa/Tripoli', ['ar-LY', 'it', 'en'],
1040 _KML.ANSI, 'Libya', None, 237),
1041 Region(
1042 'va', 'xkb:va::lat', 'Europe/Vatican', ['la', 'it', 'fr'],
1043 _KML.ANSI, 'Vatican', None, 238),
1044 Region(
1045 'vc', 'xkb:vc::eng', 'America/St_Vincent', ['en-VC', 'fr'],
1046 _KML.ANSI, 'Saint Vincent and the Grenadines', None, 239),
1047 Region(
1048 'ad', 'xkb:ad::cat', 'Europe/Andorra', 'ca', _KML.ANSI, 'Andorra',
1049 None, 240),
1050 Region(
1051 'ag', 'xkb:ag::eng', 'America/Antigua', 'en-AG', _KML.ANSI,
1052 'Antigua and Barbuda', None, 241),
1053 Region(
1054 'af', 'xkb:af::fas', 'Asia/Kabul', ['fa-AF', 'ps', 'uz-AF', 'tk'],
1055 _KML.ANSI, 'Afghanistan', None, 242),
1056 Region(
1057 'ai', 'xkb:ai::eng', 'America/Anguilla', 'en-AI', _KML.ANSI,
1058 'Anguilla', None, 243),
1059 Region(
1060 'vi', 'xkb:vi::eng', 'America/St_Thomas', 'en-VI', _KML.ANSI,
1061 'U.S. Virgin Islands', None, 244),
1062 Region(
1063 'is', 'xkb:is::ice', 'Atlantic/Reykjavik',
1064 ['is', 'en-GB', 'da', 'de'], _KML.ISO, 'Iceland', None, 245),
1065 Region(
1066 'ir', 'xkb:ir::fas', 'Asia/Tehran', ['fa-IR', 'ku'], _KML.ANSI,
1067 'Iran', None, 246),
1068 Region(
1069 'am', 'xkb:am::hye', 'Asia/Yerevan', 'hy', _KML.ANSI, 'Armenia',
1070 None, 247),
1071 Region(
1072 'al', 'xkb:al::sqi', 'Europe/Tirane', ['sq', 'el'], _KML.ANSI,
1073 'Albania', None, 248),
1074 Region(
1075 'ao', 'xkb:ao::por', 'Africa/Luanda', 'pt-AO', _KML.ANSI,
1076 'Angola', None, 249),
1077 Region(
1078 'as', 'xkb:as::eng', 'Pacific/Pago_Pago', ['en-AS', 'sm', 'to'],
1079 _KML.ANSI, 'American Samoa', None, 250),
1080 Region(
1081 'ar', 'xkb:ar::spa',
1082 ['America/Argentina/Buenos_Aires', 'America/Argentina/Cordoba',
1083 'America/Argentina/Salta', 'America/Argentina/Jujuy',
1084 'America/Argentina/Tucuman', 'America/Argentina/Catamarca',
1085 'America/Argentina/La_Rioja', 'America/Argentina/San_Juan',
1086 'America/Argentina/Mendoza', 'America/Argentina/San_Luis',
1087 'America/Argentina/Rio_Gallegos', 'America/Argentina/Ushuaia'],
1088 ['es-AR', 'en', 'it', 'de', 'fr', 'gn'], _KML.ANSI, 'Argentina',
1089 None, 251),
1090 Region(
1091 'aw', 'xkb:aw::nld', 'America/Aruba', ['nl-AW', 'es', 'en'],
1092 _KML.ANSI, 'Aruba', None, 252),
1093 Region(
1094 'ax', 'xkb:ax::swe', 'Europe/Mariehamn', 'sv-AX', _KML.ANSI,
1095 'Aland Islands', None, 253),
1096 Region(
1097 'az', 'xkb:az::aze', 'Asia/Baku', ['az', 'ru', 'hy'], _KML.ANSI,
1098 'Azerbaijan', None, 254),
1099 Region(
1100 'ua', 'xkb:ua::ukr',
1101 ['Europe/Kiev', 'Europe/Uzhgorod', 'Europe/Zaporozhye'],
1102 ['uk', 'ru-UA', 'rom', 'pl', 'hu'], _KML.ANSI, 'Ukraine', None, 255),
1103 Region(
Hung-Te Lindf179fd2016-05-12 19:22:13 +08001104 'qa', 'xkb:qa::ara', 'Asia/Bahrain', ['ar-QA', 'en'], _KML.ANSI,
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001105 'Qatar', None, 256),
1106 Region(
1107 'mz', 'xkb:mz::por', 'Africa/Maputo', ['pt-MZ', 'vmw'],
1108 _KML.ANSI, 'Mozambique', None, 257)]
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001109"""A list of :py:class:`regions.Region` objects for
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001110**unconfirmed** regions. These may contain incorrect information (or not
1111supported by Chrome browser yet), and all fields must be reviewed before launch.
1112See http://goto/vpdsettings.
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001113
1114Currently, non-Latin keyboards must use an underlying Latin keyboard
1115for VPD. (This assumption should be revisited when moving items to
1116:py:data:`regions.Region.REGIONS_LIST`.) This is
1117currently being discussed on <http://crbug.com/325389>.
1118
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001119Some timezones or locales may be missing from ``timezone_settings.cc`` (see
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001120http://crosbug.com/p/23902). This must be rectified before moving
1121items to :py:data:`regions.Region.REGIONS_LIST`.
1122"""
1123
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001124
1125def ConsolidateRegions(regions):
1126 """Consolidates a list of regions into a dict.
1127
1128 Args:
1129 regions: A list of Region objects. All objects for any given
1130 region code must be identical or we will throw an exception.
1131 (We allow duplicates in case identical region objects are
1132 defined in both regions.py and the overlay, e.g., when moving
1133 items to the public overlay.)
1134
1135 Returns:
1136 A dict from region code to Region.
1137
1138 Raises:
1139 RegionException: If there are multiple regions defined for a given
1140 region, and the values for those regions differ.
1141 """
1142 # Build a dict from region_code to the first Region with that code.
1143 region_dict = {}
1144 for r in regions:
1145 existing_region = region_dict.get(r.region_code)
1146 if existing_region:
1147 if existing_region.GetFieldsDict() != r.GetFieldsDict():
1148 raise RegionException(
1149 'Conflicting definitions for region %r: %r, %r' %
1150 (r.region_code, existing_region.GetFieldsDict(),
1151 r.GetFieldsDict()))
1152 else:
1153 region_dict[r.region_code] = r
1154
1155 return region_dict
1156
1157
1158def BuildRegionsDict(include_all=False):
1159 """Builds a dictionary mapping from code to :py:class:`regions.Region` object.
1160
1161 The regions include:
1162
1163 * :py:data:`regions.REGIONS_LIST`
1164 * :py:data:`regions_overlay.REGIONS_LIST`
1165 * Only if ``include_all`` is true:
1166
1167 * :py:data:`regions.UNCONFIRMED_REGIONS_LIST`
1168 * :py:data:`regions.INCOMPLETE_REGIONS_LIST`
1169
1170 A region may only appear in one of the above lists, or this function
1171 will (deliberately) fail.
1172 """
1173 regions = list(REGIONS_LIST)
1174 if include_all:
Hung-Te Lin8f8e0c42015-04-13 11:42:42 +08001175 known_codes = [r.region_code for r in regions]
1176 regions += [r for r in UNCONFIRMED_REGIONS_LIST if r.region_code not in
1177 known_codes]
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001178
1179 # Build dictionary of region code to list of regions with that
1180 # region code. Check manually for duplicates, since the region may
1181 # be present both in the overlay and the public repo.
1182 return ConsolidateRegions(regions)
1183
1184
1185REGIONS = BuildRegionsDict()
1186
1187
1188def main(args=sys.argv[1:], out=None):
1189 parser = argparse.ArgumentParser(description=(
1190 'Display all known regions and their parameters. '))
1191 parser.add_argument('--format',
1192 choices=('human-readable', 'csv', 'json', 'yaml'),
1193 default='human-readable',
1194 help='Output format (default=%(default)s)')
1195 parser.add_argument('--all', action='store_true',
1196 help='Include unconfirmed and incomplete regions')
1197 parser.add_argument('--output', default=None,
1198 help='Specify output file')
Hung-Te Lin34f3d382015-04-10 18:18:23 +08001199 parser.add_argument('--overlay', default=None,
1200 help='Specify a Python file to overlay extra data')
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001201 args = parser.parse_args(args)
1202
Hung-Te Lin34f3d382015-04-10 18:18:23 +08001203 if args.overlay is not None:
1204 execfile(args.overlay)
1205
Hung-Te Lin1a14cc42015-04-14 01:23:34 +08001206 if args.all:
1207 # Add an additional 'confirmed' property to help identifying region status,
1208 # for autotests, unit tests and factory module.
1209 Region.FIELDS.insert(1, 'confirmed')
1210 for r in REGIONS_LIST:
1211 r.confirmed = True
1212 for r in UNCONFIRMED_REGIONS_LIST:
1213 r.confirmed = False
1214
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001215 regions_dict = BuildRegionsDict(args.all)
Hung-Te Lin34f3d382015-04-10 18:18:23 +08001216
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001217 if out is None:
1218 if args.output is None:
1219 out = sys.stdout
1220 else:
1221 out = open(args.output, 'w')
1222
1223 # Handle YAML and JSON output.
1224 if args.format == 'yaml' or args.format == 'json':
1225 data = {}
1226 for region in regions_dict.values():
1227 item = {}
1228 for field in Region.FIELDS:
1229 item[field] = getattr(region, field)
1230 data[region.region_code] = item
1231 if args.format == 'yaml':
1232 yaml.dump(data, out)
1233 else:
1234 json.dump(data, out)
1235 return
1236
1237 # Handle CSV or plain-text output: build a list of lines to print.
Hung-Te Lin1a14cc42015-04-14 01:23:34 +08001238 # The CSV format is for publishing discussion spreadsheet so 'notes' should be
1239 # added.
1240 if args.format == 'csv':
1241 Region.FIELDS += ['notes']
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001242 lines = [Region.FIELDS]
1243
1244 def CoerceToString(value):
1245 """Returns the arguments in simple string type.
1246
1247 If value is a list, concatenate its values with commas. Otherwise, just
1248 return value.
1249 """
1250 if isinstance(value, list):
1251 return ','.join(value)
1252 else:
1253 return str(value)
Hung-Te Lin1a14cc42015-04-14 01:23:34 +08001254
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001255 for region in sorted(regions_dict.values(), key=lambda v: v.region_code):
1256 lines.append([CoerceToString(getattr(region, field))
1257 for field in Region.FIELDS])
1258
1259 if args.format == 'csv':
Hung-Te Lin1a14cc42015-04-14 01:23:34 +08001260 # Just print the lines in CSV format. Note the values may include ',' so the
1261 # separator must be tab.
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001262 for l in lines:
Hung-Te Lin1a14cc42015-04-14 01:23:34 +08001263 print('\t'.join(l))
Hung-Te Lin76c55b22015-03-31 14:47:14 +08001264 elif args.format == 'human-readable':
1265 num_columns = len(lines[0])
1266
1267 # Calculate maximum length of each column.
1268 max_lengths = []
1269 for column_no in xrange(num_columns):
1270 max_lengths.append(max(len(line[column_no]) for line in lines))
1271
1272 # Print each line, padding as necessary to the max column length.
1273 for line in lines:
1274 for column_no in xrange(num_columns):
1275 out.write(line[column_no].ljust(max_lengths[column_no] + 2))
1276 out.write('\n')
1277 else:
1278 exit('Sorry, unknown format specified: %s' % args.format)
1279
1280
1281if __name__ == '__main__':
1282 main()