OILS / opy / _regtest / src / locale.py View on Github | oilshell.org

2065 lines, 1641 significant
1from __future__ import print_function # for OPy compiler
2"""Locale support module.
3
4The module provides low-level access to the C lib's locale APIs and adds high
5level number formatting APIs as well as a locale aliasing engine to complement
6these.
7
8The aliasing engine includes support for many commonly used locale names and
9maps them to values suitable for passing to the C lib's setlocale() function. It
10also includes default encodings for all supported locale names.
11"""
12
13import sys
14import encodings
15import encodings.aliases
16import re
17import operator
18import functools
19
20# keep a copy of the builtin str type, because 'str' name is overridden
21# in globals by a function below
22_str = str
23
24try:
25 _unicode = unicode
26except NameError:
27 # If Python is built without Unicode support, the unicode type
28 # will not exist. Fake one.
29 class _unicode(object):
30 pass
31
32# Try importing the _locale module.
33#
34# If this fails, fall back on a basic 'C' locale emulation.
35
36# Yuck: LC_MESSAGES is non-standard: can't tell whether it exists before
37# trying the import. So __all__ is also fiddled at the end of the file.
38__all__ = ["getlocale", "getdefaultlocale", "getpreferredencoding", "Error",
39 "setlocale", "resetlocale", "localeconv", "strcoll", "strxfrm",
40 "str", "atof", "atoi", "format", "format_string", "currency",
41 "normalize", "LC_CTYPE", "LC_COLLATE", "LC_TIME", "LC_MONETARY",
42 "LC_NUMERIC", "LC_ALL", "CHAR_MAX"]
43
44try:
45
46 from _locale import *
47
48except ImportError:
49
50 # Locale emulation
51
52 CHAR_MAX = 127
53 LC_ALL = 6
54 LC_COLLATE = 3
55 LC_CTYPE = 0
56 LC_MESSAGES = 5
57 LC_MONETARY = 4
58 LC_NUMERIC = 1
59 LC_TIME = 2
60 Error = ValueError
61
62 def localeconv():
63 """ localeconv() -> dict.
64 Returns numeric and monetary locale-specific parameters.
65 """
66 # 'C' locale default values
67 return {'grouping': [127],
68 'currency_symbol': '',
69 'n_sign_posn': 127,
70 'p_cs_precedes': 127,
71 'n_cs_precedes': 127,
72 'mon_grouping': [],
73 'n_sep_by_space': 127,
74 'decimal_point': '.',
75 'negative_sign': '',
76 'positive_sign': '',
77 'p_sep_by_space': 127,
78 'int_curr_symbol': '',
79 'p_sign_posn': 127,
80 'thousands_sep': '',
81 'mon_thousands_sep': '',
82 'frac_digits': 127,
83 'mon_decimal_point': '',
84 'int_frac_digits': 127}
85
86 def setlocale(category, value=None):
87 """ setlocale(integer,string=None) -> string.
88 Activates/queries locale processing.
89 """
90 if value not in (None, '', 'C'):
91 raise Error, '_locale emulation only supports "C" locale'
92 return 'C'
93
94 def strcoll(a,b):
95 """ strcoll(string,string) -> int.
96 Compares two strings according to the locale.
97 """
98 return cmp(a,b)
99
100 def strxfrm(s):
101 """ strxfrm(string) -> string.
102 Returns a string that behaves for cmp locale-aware.
103 """
104 return s
105
106
107_localeconv = localeconv
108
109# With this dict, you can override some items of localeconv's return value.
110# This is useful for testing purposes.
111_override_localeconv = {}
112
113@functools.wraps(_localeconv)
114def localeconv():
115 d = _localeconv()
116 if _override_localeconv:
117 d.update(_override_localeconv)
118 return d
119
120
121### Number formatting APIs
122
123# Author: Martin von Loewis
124# improved by Georg Brandl
125
126# Iterate over grouping intervals
127def _grouping_intervals(grouping):
128 last_interval = None
129 for interval in grouping:
130 # if grouping is -1, we are done
131 if interval == CHAR_MAX:
132 return
133 # 0: re-use last group ad infinitum
134 if interval == 0:
135 if last_interval is None:
136 raise ValueError("invalid grouping")
137 while True:
138 yield last_interval
139 yield interval
140 last_interval = interval
141
142#perform the grouping from right to left
143def _group(s, monetary=False):
144 conv = localeconv()
145 thousands_sep = conv[monetary and 'mon_thousands_sep' or 'thousands_sep']
146 grouping = conv[monetary and 'mon_grouping' or 'grouping']
147 if not grouping:
148 return (s, 0)
149 if s[-1] == ' ':
150 stripped = s.rstrip()
151 right_spaces = s[len(stripped):]
152 s = stripped
153 else:
154 right_spaces = ''
155 left_spaces = ''
156 groups = []
157 for interval in _grouping_intervals(grouping):
158 if not s or s[-1] not in "0123456789":
159 # only non-digit characters remain (sign, spaces)
160 left_spaces = s
161 s = ''
162 break
163 groups.append(s[-interval:])
164 s = s[:-interval]
165 if s:
166 groups.append(s)
167 groups.reverse()
168 return (
169 left_spaces + thousands_sep.join(groups) + right_spaces,
170 len(thousands_sep) * (len(groups) - 1)
171 )
172
173# Strip a given amount of excess padding from the given string
174def _strip_padding(s, amount):
175 lpos = 0
176 while amount and s[lpos] == ' ':
177 lpos += 1
178 amount -= 1
179 rpos = len(s) - 1
180 while amount and s[rpos] == ' ':
181 rpos -= 1
182 amount -= 1
183 return s[lpos:rpos+1]
184
185_percent_re = re.compile(r'%(?:\((?P<key>.*?)\))?'
186 r'(?P<modifiers>[-#0-9 +*.hlL]*?)[eEfFgGdiouxXcrs%]')
187
188def format(percent, value, grouping=False, monetary=False, *additional):
189 """Returns the locale-aware substitution of a %? specifier
190 (percent).
191
192 additional is for format strings which contain one or more
193 '*' modifiers."""
194 # this is only for one-percent-specifier strings and this should be checked
195 match = _percent_re.match(percent)
196 if not match or len(match.group())!= len(percent):
197 raise ValueError(("format() must be given exactly one %%char "
198 "format specifier, %s not valid") % repr(percent))
199 return _format(percent, value, grouping, monetary, *additional)
200
201def _format(percent, value, grouping=False, monetary=False, *additional):
202 if additional:
203 formatted = percent % ((value,) + additional)
204 else:
205 formatted = percent % value
206 # floats and decimal ints need special action!
207 if percent[-1] in 'eEfFgG':
208 seps = 0
209 parts = formatted.split('.')
210 if grouping:
211 parts[0], seps = _group(parts[0], monetary=monetary)
212 decimal_point = localeconv()[monetary and 'mon_decimal_point'
213 or 'decimal_point']
214 formatted = decimal_point.join(parts)
215 if seps:
216 formatted = _strip_padding(formatted, seps)
217 elif percent[-1] in 'diu':
218 seps = 0
219 if grouping:
220 formatted, seps = _group(formatted, monetary=monetary)
221 if seps:
222 formatted = _strip_padding(formatted, seps)
223 return formatted
224
225def format_string(f, val, grouping=False):
226 """Formats a string in the same way that the % formatting would use,
227 but takes the current locale into account.
228 Grouping is applied if the third parameter is true."""
229 percents = list(_percent_re.finditer(f))
230 new_f = _percent_re.sub('%s', f)
231
232 if operator.isMappingType(val):
233 new_val = []
234 for perc in percents:
235 if perc.group()[-1]=='%':
236 new_val.append('%')
237 else:
238 new_val.append(format(perc.group(), val, grouping))
239 else:
240 if not isinstance(val, tuple):
241 val = (val,)
242 new_val = []
243 i = 0
244 for perc in percents:
245 if perc.group()[-1]=='%':
246 new_val.append('%')
247 else:
248 starcount = perc.group('modifiers').count('*')
249 new_val.append(_format(perc.group(),
250 val[i],
251 grouping,
252 False,
253 *val[i+1:i+1+starcount]))
254 i += (1 + starcount)
255 val = tuple(new_val)
256
257 return new_f % val
258
259def currency(val, symbol=True, grouping=False, international=False):
260 """Formats val according to the currency settings
261 in the current locale."""
262 conv = localeconv()
263
264 # check for illegal values
265 digits = conv[international and 'int_frac_digits' or 'frac_digits']
266 if digits == 127:
267 raise ValueError("Currency formatting is not possible using "
268 "the 'C' locale.")
269
270 s = format('%%.%if' % digits, abs(val), grouping, monetary=True)
271 # '<' and '>' are markers if the sign must be inserted between symbol and value
272 s = '<' + s + '>'
273
274 if symbol:
275 smb = conv[international and 'int_curr_symbol' or 'currency_symbol']
276 precedes = conv[val<0 and 'n_cs_precedes' or 'p_cs_precedes']
277 separated = conv[val<0 and 'n_sep_by_space' or 'p_sep_by_space']
278
279 if precedes:
280 s = smb + (separated and ' ' or '') + s
281 else:
282 s = s + (separated and ' ' or '') + smb
283
284 sign_pos = conv[val<0 and 'n_sign_posn' or 'p_sign_posn']
285 sign = conv[val<0 and 'negative_sign' or 'positive_sign']
286
287 if sign_pos == 0:
288 s = '(' + s + ')'
289 elif sign_pos == 1:
290 s = sign + s
291 elif sign_pos == 2:
292 s = s + sign
293 elif sign_pos == 3:
294 s = s.replace('<', sign)
295 elif sign_pos == 4:
296 s = s.replace('>', sign)
297 else:
298 # the default if nothing specified;
299 # this should be the most fitting sign position
300 s = sign + s
301
302 return s.replace('<', '').replace('>', '')
303
304def str(val):
305 """Convert float to string, taking the locale into account."""
306 return format("%.12g", val)
307
308def atof(string, func=float):
309 "Parses a string as a float according to the locale settings."
310 #First, get rid of the grouping
311 ts = localeconv()['thousands_sep']
312 if ts:
313 string = string.replace(ts, '')
314 #next, replace the decimal point with a dot
315 dd = localeconv()['decimal_point']
316 if dd:
317 string = string.replace(dd, '.')
318 #finally, parse the string
319 return func(string)
320
321def atoi(str):
322 "Converts a string to an integer according to the locale settings."
323 return atof(str, int)
324
325def _test():
326 setlocale(LC_ALL, "")
327 #do grouping
328 s1 = format("%d", 123456789,1)
329 print(s1, "is", atoi(s1))
330 #standard formatting
331 s1 = str(3.14)
332 print(s1, "is", atof(s1))
333
334### Locale name aliasing engine
335
336# Author: Marc-Andre Lemburg, mal@lemburg.com
337# Various tweaks by Fredrik Lundh <fredrik@pythonware.com>
338
339# store away the low-level version of setlocale (it's
340# overridden below)
341_setlocale = setlocale
342
343# Avoid relying on the locale-dependent .lower() method
344# (see issue #1813).
345_ascii_lower_map = ''.join(
346 chr(x + 32 if x >= ord('A') and x <= ord('Z') else x)
347 for x in range(256)
348)
349
350def _replace_encoding(code, encoding):
351 if '.' in code:
352 langname = code[:code.index('.')]
353 else:
354 langname = code
355 # Convert the encoding to a C lib compatible encoding string
356 norm_encoding = encodings.normalize_encoding(encoding)
357 #print('norm encoding: %r' % norm_encoding)
358 norm_encoding = encodings.aliases.aliases.get(norm_encoding,
359 norm_encoding)
360 #print('aliased encoding: %r' % norm_encoding)
361 encoding = locale_encoding_alias.get(norm_encoding,
362 norm_encoding)
363 #print('found encoding %r' % encoding)
364 return langname + '.' + encoding
365
366def normalize(localename):
367
368 """ Returns a normalized locale code for the given locale
369 name.
370
371 The returned locale code is formatted for use with
372 setlocale().
373
374 If normalization fails, the original name is returned
375 unchanged.
376
377 If the given encoding is not known, the function defaults to
378 the default encoding for the locale code just like setlocale()
379 does.
380
381 """
382 # Normalize the locale name and extract the encoding and modifier
383 if isinstance(localename, _unicode):
384 localename = localename.encode('ascii')
385 code = localename.translate(_ascii_lower_map)
386 if ':' in code:
387 # ':' is sometimes used as encoding delimiter.
388 code = code.replace(':', '.')
389 if '@' in code:
390 code, modifier = code.split('@', 1)
391 else:
392 modifier = ''
393 if '.' in code:
394 langname, encoding = code.split('.')[:2]
395 else:
396 langname = code
397 encoding = ''
398
399 # First lookup: fullname (possibly with encoding and modifier)
400 lang_enc = langname
401 if encoding:
402 norm_encoding = encoding.replace('-', '')
403 norm_encoding = norm_encoding.replace('_', '')
404 lang_enc += '.' + norm_encoding
405 lookup_name = lang_enc
406 if modifier:
407 lookup_name += '@' + modifier
408 code = locale_alias.get(lookup_name, None)
409 if code is not None:
410 return code
411 #print('first lookup failed')
412
413 if modifier:
414 # Second try: fullname without modifier (possibly with encoding)
415 code = locale_alias.get(lang_enc, None)
416 if code is not None:
417 #print('lookup without modifier succeeded')
418 if '@' not in code:
419 return code + '@' + modifier
420 if code.split('@', 1)[1].translate(_ascii_lower_map) == modifier:
421 return code
422 #print('second lookup failed')
423
424 if encoding:
425 # Third try: langname (without encoding, possibly with modifier)
426 lookup_name = langname
427 if modifier:
428 lookup_name += '@' + modifier
429 code = locale_alias.get(lookup_name, None)
430 if code is not None:
431 #print('lookup without encoding succeeded')
432 if '@' not in code:
433 return _replace_encoding(code, encoding)
434 code, modifier = code.split('@', 1)
435 return _replace_encoding(code, encoding) + '@' + modifier
436
437 if modifier:
438 # Fourth try: langname (without encoding and modifier)
439 code = locale_alias.get(langname, None)
440 if code is not None:
441 #print('lookup without modifier and encoding succeeded')
442 if '@' not in code:
443 return _replace_encoding(code, encoding) + '@' + modifier
444 code, defmod = code.split('@', 1)
445 if defmod.translate(_ascii_lower_map) == modifier:
446 return _replace_encoding(code, encoding) + '@' + defmod
447
448 return localename
449
450def _parse_localename(localename):
451
452 """ Parses the locale code for localename and returns the
453 result as tuple (language code, encoding).
454
455 The localename is normalized and passed through the locale
456 alias engine. A ValueError is raised in case the locale name
457 cannot be parsed.
458
459 The language code corresponds to RFC 1766. code and encoding
460 can be None in case the values cannot be determined or are
461 unknown to this implementation.
462
463 """
464 code = normalize(localename)
465 if '@' in code:
466 # Deal with locale modifiers
467 code, modifier = code.split('@', 1)
468 if modifier == 'euro' and '.' not in code:
469 # Assume Latin-9 for @euro locales. This is bogus,
470 # since some systems may use other encodings for these
471 # locales. Also, we ignore other modifiers.
472 return code, 'iso-8859-15'
473
474 if '.' in code:
475 return tuple(code.split('.')[:2])
476 elif code == 'C':
477 return None, None
478 raise ValueError, 'unknown locale: %s' % localename
479
480def _build_localename(localetuple):
481
482 """ Builds a locale code from the given tuple (language code,
483 encoding).
484
485 No aliasing or normalizing takes place.
486
487 """
488 language, encoding = localetuple
489 if language is None:
490 language = 'C'
491 if encoding is None:
492 return language
493 else:
494 return language + '.' + encoding
495
496def getdefaultlocale(envvars=('LC_ALL', 'LC_CTYPE', 'LANG', 'LANGUAGE')):
497
498 """ Tries to determine the default locale settings and returns
499 them as tuple (language code, encoding).
500
501 According to POSIX, a program which has not called
502 setlocale(LC_ALL, "") runs using the portable 'C' locale.
503 Calling setlocale(LC_ALL, "") lets it use the default locale as
504 defined by the LANG variable. Since we don't want to interfere
505 with the current locale setting we thus emulate the behavior
506 in the way described above.
507
508 To maintain compatibility with other platforms, not only the
509 LANG variable is tested, but a list of variables given as
510 envvars parameter. The first found to be defined will be
511 used. envvars defaults to the search path used in GNU gettext;
512 it must always contain the variable name 'LANG'.
513
514 Except for the code 'C', the language code corresponds to RFC
515 1766. code and encoding can be None in case the values cannot
516 be determined.
517
518 """
519
520 try:
521 # check if it's supported by the _locale module
522 import _locale
523 code, encoding = _locale._getdefaultlocale()
524 except (ImportError, AttributeError):
525 pass
526 else:
527 # make sure the code/encoding values are valid
528 if sys.platform == "win32" and code and code[:2] == "0x":
529 # map windows language identifier to language name
530 code = windows_locale.get(int(code, 0))
531 # ...add other platform-specific processing here, if
532 # necessary...
533 return code, encoding
534
535 # fall back on POSIX behaviour
536 import os
537 lookup = os.environ.get
538 for variable in envvars:
539 localename = lookup(variable,None)
540 if localename:
541 if variable == 'LANGUAGE':
542 localename = localename.split(':')[0]
543 break
544 else:
545 localename = 'C'
546 return _parse_localename(localename)
547
548
549def getlocale(category=LC_CTYPE):
550
551 """ Returns the current setting for the given locale category as
552 tuple (language code, encoding).
553
554 category may be one of the LC_* value except LC_ALL. It
555 defaults to LC_CTYPE.
556
557 Except for the code 'C', the language code corresponds to RFC
558 1766. code and encoding can be None in case the values cannot
559 be determined.
560
561 """
562 localename = _setlocale(category)
563 if category == LC_ALL and ';' in localename:
564 raise TypeError, 'category LC_ALL is not supported'
565 return _parse_localename(localename)
566
567def setlocale(category, locale=None):
568
569 """ Set the locale for the given category. The locale can be
570 a string, an iterable of two strings (language code and encoding),
571 or None.
572
573 Iterables are converted to strings using the locale aliasing
574 engine. Locale strings are passed directly to the C lib.
575
576 category may be given as one of the LC_* values.
577
578 """
579 if locale and not isinstance(locale, (_str, _unicode)):
580 # convert to string
581 locale = normalize(_build_localename(locale))
582 return _setlocale(category, locale)
583
584def resetlocale(category=LC_ALL):
585
586 """ Sets the locale for category to the default setting.
587
588 The default setting is determined by calling
589 getdefaultlocale(). category defaults to LC_ALL.
590
591 """
592 _setlocale(category, _build_localename(getdefaultlocale()))
593
594if sys.platform.startswith("win"):
595 # On Win32, this will return the ANSI code page
596 def getpreferredencoding(do_setlocale = True):
597 """Return the charset that the user is likely using."""
598 import _locale
599 return _locale._getdefaultlocale()[1]
600else:
601 # On Unix, if CODESET is available, use that.
602 try:
603 CODESET
604 except NameError:
605 # Fall back to parsing environment variables :-(
606 def getpreferredencoding(do_setlocale = True):
607 """Return the charset that the user is likely using,
608 by looking at environment variables."""
609 return getdefaultlocale()[1]
610 else:
611 def getpreferredencoding(do_setlocale = True):
612 """Return the charset that the user is likely using,
613 according to the system configuration."""
614 if do_setlocale:
615 oldloc = setlocale(LC_CTYPE)
616 try:
617 setlocale(LC_CTYPE, "")
618 except Error:
619 pass
620 result = nl_langinfo(CODESET)
621 setlocale(LC_CTYPE, oldloc)
622 return result
623 else:
624 return nl_langinfo(CODESET)
625
626
627### Database
628#
629# The following data was extracted from the locale.alias file which
630# comes with X11 and then hand edited removing the explicit encoding
631# definitions and adding some more aliases. The file is usually
632# available as /usr/lib/X11/locale/locale.alias.
633#
634
635#
636# The local_encoding_alias table maps lowercase encoding alias names
637# to C locale encoding names (case-sensitive). Note that normalize()
638# first looks up the encoding in the encodings.aliases dictionary and
639# then applies this mapping to find the correct C lib name for the
640# encoding.
641#
642locale_encoding_alias = {
643
644 # Mappings for non-standard encoding names used in locale names
645 '437': 'C',
646 'c': 'C',
647 'en': 'ISO8859-1',
648 'jis': 'JIS7',
649 'jis7': 'JIS7',
650 'ajec': 'eucJP',
651
652 # Mappings from Python codec names to C lib encoding names
653 'ascii': 'ISO8859-1',
654 'latin_1': 'ISO8859-1',
655 'iso8859_1': 'ISO8859-1',
656 'iso8859_10': 'ISO8859-10',
657 'iso8859_11': 'ISO8859-11',
658 'iso8859_13': 'ISO8859-13',
659 'iso8859_14': 'ISO8859-14',
660 'iso8859_15': 'ISO8859-15',
661 'iso8859_16': 'ISO8859-16',
662 'iso8859_2': 'ISO8859-2',
663 'iso8859_3': 'ISO8859-3',
664 'iso8859_4': 'ISO8859-4',
665 'iso8859_5': 'ISO8859-5',
666 'iso8859_6': 'ISO8859-6',
667 'iso8859_7': 'ISO8859-7',
668 'iso8859_8': 'ISO8859-8',
669 'iso8859_9': 'ISO8859-9',
670 'iso2022_jp': 'JIS7',
671 'shift_jis': 'SJIS',
672 'tactis': 'TACTIS',
673 'euc_jp': 'eucJP',
674 'euc_kr': 'eucKR',
675 'utf_8': 'UTF-8',
676 'koi8_r': 'KOI8-R',
677 'koi8_u': 'KOI8-U',
678 # XXX This list is still incomplete. If you know more
679 # mappings, please file a bug report. Thanks.
680}
681
682#
683# The locale_alias table maps lowercase alias names to C locale names
684# (case-sensitive). Encodings are always separated from the locale
685# name using a dot ('.'); they should only be given in case the
686# language name is needed to interpret the given encoding alias
687# correctly (CJK codes often have this need).
688#
689# Note that the normalize() function which uses this tables
690# removes '_' and '-' characters from the encoding part of the
691# locale name before doing the lookup. This saves a lot of
692# space in the table.
693#
694# MAL 2004-12-10:
695# Updated alias mapping to most recent locale.alias file
696# from X.org distribution using makelocalealias.py.
697#
698# These are the differences compared to the old mapping (Python 2.4
699# and older):
700#
701# updated 'bg' -> 'bg_BG.ISO8859-5' to 'bg_BG.CP1251'
702# updated 'bg_bg' -> 'bg_BG.ISO8859-5' to 'bg_BG.CP1251'
703# updated 'bulgarian' -> 'bg_BG.ISO8859-5' to 'bg_BG.CP1251'
704# updated 'cz' -> 'cz_CZ.ISO8859-2' to 'cs_CZ.ISO8859-2'
705# updated 'cz_cz' -> 'cz_CZ.ISO8859-2' to 'cs_CZ.ISO8859-2'
706# updated 'czech' -> 'cs_CS.ISO8859-2' to 'cs_CZ.ISO8859-2'
707# updated 'dutch' -> 'nl_BE.ISO8859-1' to 'nl_NL.ISO8859-1'
708# updated 'et' -> 'et_EE.ISO8859-4' to 'et_EE.ISO8859-15'
709# updated 'et_ee' -> 'et_EE.ISO8859-4' to 'et_EE.ISO8859-15'
710# updated 'fi' -> 'fi_FI.ISO8859-1' to 'fi_FI.ISO8859-15'
711# updated 'fi_fi' -> 'fi_FI.ISO8859-1' to 'fi_FI.ISO8859-15'
712# updated 'iw' -> 'iw_IL.ISO8859-8' to 'he_IL.ISO8859-8'
713# updated 'iw_il' -> 'iw_IL.ISO8859-8' to 'he_IL.ISO8859-8'
714# updated 'japanese' -> 'ja_JP.SJIS' to 'ja_JP.eucJP'
715# updated 'lt' -> 'lt_LT.ISO8859-4' to 'lt_LT.ISO8859-13'
716# updated 'lv' -> 'lv_LV.ISO8859-4' to 'lv_LV.ISO8859-13'
717# updated 'sl' -> 'sl_CS.ISO8859-2' to 'sl_SI.ISO8859-2'
718# updated 'slovene' -> 'sl_CS.ISO8859-2' to 'sl_SI.ISO8859-2'
719# updated 'th_th' -> 'th_TH.TACTIS' to 'th_TH.ISO8859-11'
720# updated 'zh_cn' -> 'zh_CN.eucCN' to 'zh_CN.gb2312'
721# updated 'zh_cn.big5' -> 'zh_TW.eucTW' to 'zh_TW.big5'
722# updated 'zh_tw' -> 'zh_TW.eucTW' to 'zh_TW.big5'
723#
724# MAL 2008-05-30:
725# Updated alias mapping to most recent locale.alias file
726# from X.org distribution using makelocalealias.py.
727#
728# These are the differences compared to the old mapping (Python 2.5
729# and older):
730#
731# updated 'cs_cs.iso88592' -> 'cs_CZ.ISO8859-2' to 'cs_CS.ISO8859-2'
732# updated 'serbocroatian' -> 'sh_YU.ISO8859-2' to 'sr_CS.ISO8859-2'
733# updated 'sh' -> 'sh_YU.ISO8859-2' to 'sr_CS.ISO8859-2'
734# updated 'sh_hr.iso88592' -> 'sh_HR.ISO8859-2' to 'hr_HR.ISO8859-2'
735# updated 'sh_sp' -> 'sh_YU.ISO8859-2' to 'sr_CS.ISO8859-2'
736# updated 'sh_yu' -> 'sh_YU.ISO8859-2' to 'sr_CS.ISO8859-2'
737# updated 'sp' -> 'sp_YU.ISO8859-5' to 'sr_CS.ISO8859-5'
738# updated 'sp_yu' -> 'sp_YU.ISO8859-5' to 'sr_CS.ISO8859-5'
739# updated 'sr' -> 'sr_YU.ISO8859-5' to 'sr_CS.ISO8859-5'
740# updated 'sr@cyrillic' -> 'sr_YU.ISO8859-5' to 'sr_CS.ISO8859-5'
741# updated 'sr_sp' -> 'sr_SP.ISO8859-2' to 'sr_CS.ISO8859-2'
742# updated 'sr_yu' -> 'sr_YU.ISO8859-5' to 'sr_CS.ISO8859-5'
743# updated 'sr_yu.cp1251@cyrillic' -> 'sr_YU.CP1251' to 'sr_CS.CP1251'
744# updated 'sr_yu.iso88592' -> 'sr_YU.ISO8859-2' to 'sr_CS.ISO8859-2'
745# updated 'sr_yu.iso88595' -> 'sr_YU.ISO8859-5' to 'sr_CS.ISO8859-5'
746# updated 'sr_yu.iso88595@cyrillic' -> 'sr_YU.ISO8859-5' to 'sr_CS.ISO8859-5'
747# updated 'sr_yu.microsoftcp1251@cyrillic' -> 'sr_YU.CP1251' to 'sr_CS.CP1251'
748# updated 'sr_yu.utf8@cyrillic' -> 'sr_YU.UTF-8' to 'sr_CS.UTF-8'
749# updated 'sr_yu@cyrillic' -> 'sr_YU.ISO8859-5' to 'sr_CS.ISO8859-5'
750#
751# AP 2010-04-12:
752# Updated alias mapping to most recent locale.alias file
753# from X.org distribution using makelocalealias.py.
754#
755# These are the differences compared to the old mapping (Python 2.6.5
756# and older):
757#
758# updated 'ru' -> 'ru_RU.ISO8859-5' to 'ru_RU.UTF-8'
759# updated 'ru_ru' -> 'ru_RU.ISO8859-5' to 'ru_RU.UTF-8'
760# updated 'serbocroatian' -> 'sr_CS.ISO8859-2' to 'sr_RS.UTF-8@latin'
761# updated 'sh' -> 'sr_CS.ISO8859-2' to 'sr_RS.UTF-8@latin'
762# updated 'sh_yu' -> 'sr_CS.ISO8859-2' to 'sr_RS.UTF-8@latin'
763# updated 'sr' -> 'sr_CS.ISO8859-5' to 'sr_RS.UTF-8'
764# updated 'sr@cyrillic' -> 'sr_CS.ISO8859-5' to 'sr_RS.UTF-8'
765# updated 'sr@latn' -> 'sr_CS.ISO8859-2' to 'sr_RS.UTF-8@latin'
766# updated 'sr_cs.utf8@latn' -> 'sr_CS.UTF-8' to 'sr_RS.UTF-8@latin'
767# updated 'sr_cs@latn' -> 'sr_CS.ISO8859-2' to 'sr_RS.UTF-8@latin'
768# updated 'sr_yu' -> 'sr_CS.ISO8859-5' to 'sr_RS.UTF-8@latin'
769# updated 'sr_yu.utf8@cyrillic' -> 'sr_CS.UTF-8' to 'sr_RS.UTF-8'
770# updated 'sr_yu@cyrillic' -> 'sr_CS.ISO8859-5' to 'sr_RS.UTF-8'
771#
772# SS 2013-12-20:
773# Updated alias mapping to most recent locale.alias file
774# from X.org distribution using makelocalealias.py.
775#
776# These are the differences compared to the old mapping (Python 2.7.6
777# and older):
778#
779# updated 'a3' -> 'a3_AZ.KOI8-C' to 'az_AZ.KOI8-C'
780# updated 'a3_az' -> 'a3_AZ.KOI8-C' to 'az_AZ.KOI8-C'
781# updated 'a3_az.koi8c' -> 'a3_AZ.KOI8-C' to 'az_AZ.KOI8-C'
782# updated 'cs_cs.iso88592' -> 'cs_CS.ISO8859-2' to 'cs_CZ.ISO8859-2'
783# updated 'hebrew' -> 'iw_IL.ISO8859-8' to 'he_IL.ISO8859-8'
784# updated 'hebrew.iso88598' -> 'iw_IL.ISO8859-8' to 'he_IL.ISO8859-8'
785# updated 'sd' -> 'sd_IN@devanagari.UTF-8' to 'sd_IN.UTF-8'
786# updated 'sr@latn' -> 'sr_RS.UTF-8@latin' to 'sr_CS.UTF-8@latin'
787# updated 'sr_cs' -> 'sr_RS.UTF-8' to 'sr_CS.UTF-8'
788# updated 'sr_cs.utf8@latn' -> 'sr_RS.UTF-8@latin' to 'sr_CS.UTF-8@latin'
789# updated 'sr_cs@latn' -> 'sr_RS.UTF-8@latin' to 'sr_CS.UTF-8@latin'
790#
791# SS 2014-10-01:
792# Updated alias mapping with glibc 2.19 supported locales.
793
794locale_alias = {
795 'a3': 'az_AZ.KOI8-C',
796 'a3_az': 'az_AZ.KOI8-C',
797 'a3_az.koi8c': 'az_AZ.KOI8-C',
798 'a3_az.koic': 'az_AZ.KOI8-C',
799 'aa_dj': 'aa_DJ.ISO8859-1',
800 'aa_er': 'aa_ER.UTF-8',
801 'aa_et': 'aa_ET.UTF-8',
802 'af': 'af_ZA.ISO8859-1',
803 'af_za': 'af_ZA.ISO8859-1',
804 'af_za.iso88591': 'af_ZA.ISO8859-1',
805 'am': 'am_ET.UTF-8',
806 'am_et': 'am_ET.UTF-8',
807 'american': 'en_US.ISO8859-1',
808 'american.iso88591': 'en_US.ISO8859-1',
809 'an_es': 'an_ES.ISO8859-15',
810 'ar': 'ar_AA.ISO8859-6',
811 'ar_aa': 'ar_AA.ISO8859-6',
812 'ar_aa.iso88596': 'ar_AA.ISO8859-6',
813 'ar_ae': 'ar_AE.ISO8859-6',
814 'ar_ae.iso88596': 'ar_AE.ISO8859-6',
815 'ar_bh': 'ar_BH.ISO8859-6',
816 'ar_bh.iso88596': 'ar_BH.ISO8859-6',
817 'ar_dz': 'ar_DZ.ISO8859-6',
818 'ar_dz.iso88596': 'ar_DZ.ISO8859-6',
819 'ar_eg': 'ar_EG.ISO8859-6',
820 'ar_eg.iso88596': 'ar_EG.ISO8859-6',
821 'ar_in': 'ar_IN.UTF-8',
822 'ar_iq': 'ar_IQ.ISO8859-6',
823 'ar_iq.iso88596': 'ar_IQ.ISO8859-6',
824 'ar_jo': 'ar_JO.ISO8859-6',
825 'ar_jo.iso88596': 'ar_JO.ISO8859-6',
826 'ar_kw': 'ar_KW.ISO8859-6',
827 'ar_kw.iso88596': 'ar_KW.ISO8859-6',
828 'ar_lb': 'ar_LB.ISO8859-6',
829 'ar_lb.iso88596': 'ar_LB.ISO8859-6',
830 'ar_ly': 'ar_LY.ISO8859-6',
831 'ar_ly.iso88596': 'ar_LY.ISO8859-6',
832 'ar_ma': 'ar_MA.ISO8859-6',
833 'ar_ma.iso88596': 'ar_MA.ISO8859-6',
834 'ar_om': 'ar_OM.ISO8859-6',
835 'ar_om.iso88596': 'ar_OM.ISO8859-6',
836 'ar_qa': 'ar_QA.ISO8859-6',
837 'ar_qa.iso88596': 'ar_QA.ISO8859-6',
838 'ar_sa': 'ar_SA.ISO8859-6',
839 'ar_sa.iso88596': 'ar_SA.ISO8859-6',
840 'ar_sd': 'ar_SD.ISO8859-6',
841 'ar_sd.iso88596': 'ar_SD.ISO8859-6',
842 'ar_sy': 'ar_SY.ISO8859-6',
843 'ar_sy.iso88596': 'ar_SY.ISO8859-6',
844 'ar_tn': 'ar_TN.ISO8859-6',
845 'ar_tn.iso88596': 'ar_TN.ISO8859-6',
846 'ar_ye': 'ar_YE.ISO8859-6',
847 'ar_ye.iso88596': 'ar_YE.ISO8859-6',
848 'arabic': 'ar_AA.ISO8859-6',
849 'arabic.iso88596': 'ar_AA.ISO8859-6',
850 'as': 'as_IN.UTF-8',
851 'as_in': 'as_IN.UTF-8',
852 'ast_es': 'ast_ES.ISO8859-15',
853 'ayc_pe': 'ayc_PE.UTF-8',
854 'az': 'az_AZ.ISO8859-9E',
855 'az_az': 'az_AZ.ISO8859-9E',
856 'az_az.iso88599e': 'az_AZ.ISO8859-9E',
857 'be': 'be_BY.CP1251',
858 'be@latin': 'be_BY.UTF-8@latin',
859 'be_bg.utf8': 'bg_BG.UTF-8',
860 'be_by': 'be_BY.CP1251',
861 'be_by.cp1251': 'be_BY.CP1251',
862 'be_by.microsoftcp1251': 'be_BY.CP1251',
863 'be_by.utf8@latin': 'be_BY.UTF-8@latin',
864 'be_by@latin': 'be_BY.UTF-8@latin',
865 'bem_zm': 'bem_ZM.UTF-8',
866 'ber_dz': 'ber_DZ.UTF-8',
867 'ber_ma': 'ber_MA.UTF-8',
868 'bg': 'bg_BG.CP1251',
869 'bg_bg': 'bg_BG.CP1251',
870 'bg_bg.cp1251': 'bg_BG.CP1251',
871 'bg_bg.iso88595': 'bg_BG.ISO8859-5',
872 'bg_bg.koi8r': 'bg_BG.KOI8-R',
873 'bg_bg.microsoftcp1251': 'bg_BG.CP1251',
874 'bho_in': 'bho_IN.UTF-8',
875 'bn_bd': 'bn_BD.UTF-8',
876 'bn_in': 'bn_IN.UTF-8',
877 'bo_cn': 'bo_CN.UTF-8',
878 'bo_in': 'bo_IN.UTF-8',
879 'bokmal': 'nb_NO.ISO8859-1',
880 'bokm\xe5l': 'nb_NO.ISO8859-1',
881 'br': 'br_FR.ISO8859-1',
882 'br_fr': 'br_FR.ISO8859-1',
883 'br_fr.iso88591': 'br_FR.ISO8859-1',
884 'br_fr.iso885914': 'br_FR.ISO8859-14',
885 'br_fr.iso885915': 'br_FR.ISO8859-15',
886 'br_fr.iso885915@euro': 'br_FR.ISO8859-15',
887 'br_fr.utf8@euro': 'br_FR.UTF-8',
888 'br_fr@euro': 'br_FR.ISO8859-15',
889 'brx_in': 'brx_IN.UTF-8',
890 'bs': 'bs_BA.ISO8859-2',
891 'bs_ba': 'bs_BA.ISO8859-2',
892 'bs_ba.iso88592': 'bs_BA.ISO8859-2',
893 'bulgarian': 'bg_BG.CP1251',
894 'byn_er': 'byn_ER.UTF-8',
895 'c': 'C',
896 'c-french': 'fr_CA.ISO8859-1',
897 'c-french.iso88591': 'fr_CA.ISO8859-1',
898 'c.ascii': 'C',
899 'c.en': 'C',
900 'c.iso88591': 'en_US.ISO8859-1',
901 'c.utf8': 'en_US.UTF-8',
902 'c_c': 'C',
903 'c_c.c': 'C',
904 'ca': 'ca_ES.ISO8859-1',
905 'ca_ad': 'ca_AD.ISO8859-1',
906 'ca_ad.iso88591': 'ca_AD.ISO8859-1',
907 'ca_ad.iso885915': 'ca_AD.ISO8859-15',
908 'ca_ad.iso885915@euro': 'ca_AD.ISO8859-15',
909 'ca_ad.utf8@euro': 'ca_AD.UTF-8',
910 'ca_ad@euro': 'ca_AD.ISO8859-15',
911 'ca_es': 'ca_ES.ISO8859-1',
912 'ca_es.iso88591': 'ca_ES.ISO8859-1',
913 'ca_es.iso885915': 'ca_ES.ISO8859-15',
914 'ca_es.iso885915@euro': 'ca_ES.ISO8859-15',
915 'ca_es.utf8@euro': 'ca_ES.UTF-8',
916 'ca_es@valencia': 'ca_ES.ISO8859-15@valencia',
917 'ca_es@euro': 'ca_ES.ISO8859-15',
918 'ca_fr': 'ca_FR.ISO8859-1',
919 'ca_fr.iso88591': 'ca_FR.ISO8859-1',
920 'ca_fr.iso885915': 'ca_FR.ISO8859-15',
921 'ca_fr.iso885915@euro': 'ca_FR.ISO8859-15',
922 'ca_fr.utf8@euro': 'ca_FR.UTF-8',
923 'ca_fr@euro': 'ca_FR.ISO8859-15',
924 'ca_it': 'ca_IT.ISO8859-1',
925 'ca_it.iso88591': 'ca_IT.ISO8859-1',
926 'ca_it.iso885915': 'ca_IT.ISO8859-15',
927 'ca_it.iso885915@euro': 'ca_IT.ISO8859-15',
928 'ca_it.utf8@euro': 'ca_IT.UTF-8',
929 'ca_it@euro': 'ca_IT.ISO8859-15',
930 'catalan': 'ca_ES.ISO8859-1',
931 'cextend': 'en_US.ISO8859-1',
932 'cextend.en': 'en_US.ISO8859-1',
933 'chinese-s': 'zh_CN.eucCN',
934 'chinese-t': 'zh_TW.eucTW',
935 'crh_ua': 'crh_UA.UTF-8',
936 'croatian': 'hr_HR.ISO8859-2',
937 'cs': 'cs_CZ.ISO8859-2',
938 'cs_cs': 'cs_CZ.ISO8859-2',
939 'cs_cs.iso88592': 'cs_CZ.ISO8859-2',
940 'cs_cz': 'cs_CZ.ISO8859-2',
941 'cs_cz.iso88592': 'cs_CZ.ISO8859-2',
942 'csb_pl': 'csb_PL.UTF-8',
943 'cv_ru': 'cv_RU.UTF-8',
944 'cy': 'cy_GB.ISO8859-1',
945 'cy_gb': 'cy_GB.ISO8859-1',
946 'cy_gb.iso88591': 'cy_GB.ISO8859-1',
947 'cy_gb.iso885914': 'cy_GB.ISO8859-14',
948 'cy_gb.iso885915': 'cy_GB.ISO8859-15',
949 'cy_gb@euro': 'cy_GB.ISO8859-15',
950 'cz': 'cs_CZ.ISO8859-2',
951 'cz_cz': 'cs_CZ.ISO8859-2',
952 'czech': 'cs_CZ.ISO8859-2',
953 'da': 'da_DK.ISO8859-1',
954 'da.iso885915': 'da_DK.ISO8859-15',
955 'da_dk': 'da_DK.ISO8859-1',
956 'da_dk.88591': 'da_DK.ISO8859-1',
957 'da_dk.885915': 'da_DK.ISO8859-15',
958 'da_dk.iso88591': 'da_DK.ISO8859-1',
959 'da_dk.iso885915': 'da_DK.ISO8859-15',
960 'da_dk@euro': 'da_DK.ISO8859-15',
961 'danish': 'da_DK.ISO8859-1',
962 'danish.iso88591': 'da_DK.ISO8859-1',
963 'dansk': 'da_DK.ISO8859-1',
964 'de': 'de_DE.ISO8859-1',
965 'de.iso885915': 'de_DE.ISO8859-15',
966 'de_at': 'de_AT.ISO8859-1',
967 'de_at.iso88591': 'de_AT.ISO8859-1',
968 'de_at.iso885915': 'de_AT.ISO8859-15',
969 'de_at.iso885915@euro': 'de_AT.ISO8859-15',
970 'de_at.utf8@euro': 'de_AT.UTF-8',
971 'de_at@euro': 'de_AT.ISO8859-15',
972 'de_be': 'de_BE.ISO8859-1',
973 'de_be.iso88591': 'de_BE.ISO8859-1',
974 'de_be.iso885915': 'de_BE.ISO8859-15',
975 'de_be.iso885915@euro': 'de_BE.ISO8859-15',
976 'de_be.utf8@euro': 'de_BE.UTF-8',
977 'de_be@euro': 'de_BE.ISO8859-15',
978 'de_ch': 'de_CH.ISO8859-1',
979 'de_ch.iso88591': 'de_CH.ISO8859-1',
980 'de_ch.iso885915': 'de_CH.ISO8859-15',
981 'de_ch@euro': 'de_CH.ISO8859-15',
982 'de_de': 'de_DE.ISO8859-1',
983 'de_de.88591': 'de_DE.ISO8859-1',
984 'de_de.885915': 'de_DE.ISO8859-15',
985 'de_de.885915@euro': 'de_DE.ISO8859-15',
986 'de_de.iso88591': 'de_DE.ISO8859-1',
987 'de_de.iso885915': 'de_DE.ISO8859-15',
988 'de_de.iso885915@euro': 'de_DE.ISO8859-15',
989 'de_de.utf8@euro': 'de_DE.UTF-8',
990 'de_de@euro': 'de_DE.ISO8859-15',
991 'de_li.utf8': 'de_LI.UTF-8',
992 'de_lu': 'de_LU.ISO8859-1',
993 'de_lu.iso88591': 'de_LU.ISO8859-1',
994 'de_lu.iso885915': 'de_LU.ISO8859-15',
995 'de_lu.iso885915@euro': 'de_LU.ISO8859-15',
996 'de_lu.utf8@euro': 'de_LU.UTF-8',
997 'de_lu@euro': 'de_LU.ISO8859-15',
998 'deutsch': 'de_DE.ISO8859-1',
999 'doi_in': 'doi_IN.UTF-8',
1000 'dutch': 'nl_NL.ISO8859-1',
1001 'dutch.iso88591': 'nl_BE.ISO8859-1',
1002 'dv_mv': 'dv_MV.UTF-8',
1003 'dz_bt': 'dz_BT.UTF-8',
1004 'ee': 'ee_EE.ISO8859-4',
1005 'ee_ee': 'ee_EE.ISO8859-4',
1006 'ee_ee.iso88594': 'ee_EE.ISO8859-4',
1007 'eesti': 'et_EE.ISO8859-1',
1008 'el': 'el_GR.ISO8859-7',
1009 'el_cy': 'el_CY.ISO8859-7',
1010 'el_gr': 'el_GR.ISO8859-7',
1011 'el_gr.iso88597': 'el_GR.ISO8859-7',
1012 'el_gr@euro': 'el_GR.ISO8859-15',
1013 'en': 'en_US.ISO8859-1',
1014 'en.iso88591': 'en_US.ISO8859-1',
1015 'en_ag': 'en_AG.UTF-8',
1016 'en_au': 'en_AU.ISO8859-1',
1017 'en_au.iso88591': 'en_AU.ISO8859-1',
1018 'en_be': 'en_BE.ISO8859-1',
1019 'en_be@euro': 'en_BE.ISO8859-15',
1020 'en_bw': 'en_BW.ISO8859-1',
1021 'en_bw.iso88591': 'en_BW.ISO8859-1',
1022 'en_ca': 'en_CA.ISO8859-1',
1023 'en_ca.iso88591': 'en_CA.ISO8859-1',
1024 'en_dk': 'en_DK.ISO8859-1',
1025 'en_dl.utf8': 'en_DL.UTF-8',
1026 'en_gb': 'en_GB.ISO8859-1',
1027 'en_gb.88591': 'en_GB.ISO8859-1',
1028 'en_gb.iso88591': 'en_GB.ISO8859-1',
1029 'en_gb.iso885915': 'en_GB.ISO8859-15',
1030 'en_gb@euro': 'en_GB.ISO8859-15',
1031 'en_hk': 'en_HK.ISO8859-1',
1032 'en_hk.iso88591': 'en_HK.ISO8859-1',
1033 'en_ie': 'en_IE.ISO8859-1',
1034 'en_ie.iso88591': 'en_IE.ISO8859-1',
1035 'en_ie.iso885915': 'en_IE.ISO8859-15',
1036 'en_ie.iso885915@euro': 'en_IE.ISO8859-15',
1037 'en_ie.utf8@euro': 'en_IE.UTF-8',
1038 'en_ie@euro': 'en_IE.ISO8859-15',
1039 'en_in': 'en_IN.ISO8859-1',
1040 'en_ng': 'en_NG.UTF-8',
1041 'en_nz': 'en_NZ.ISO8859-1',
1042 'en_nz.iso88591': 'en_NZ.ISO8859-1',
1043 'en_ph': 'en_PH.ISO8859-1',
1044 'en_ph.iso88591': 'en_PH.ISO8859-1',
1045 'en_sg': 'en_SG.ISO8859-1',
1046 'en_sg.iso88591': 'en_SG.ISO8859-1',
1047 'en_uk': 'en_GB.ISO8859-1',
1048 'en_us': 'en_US.ISO8859-1',
1049 'en_us.88591': 'en_US.ISO8859-1',
1050 'en_us.885915': 'en_US.ISO8859-15',
1051 'en_us.iso88591': 'en_US.ISO8859-1',
1052 'en_us.iso885915': 'en_US.ISO8859-15',
1053 'en_us.iso885915@euro': 'en_US.ISO8859-15',
1054 'en_us@euro': 'en_US.ISO8859-15',
1055 'en_us@euro@euro': 'en_US.ISO8859-15',
1056 'en_za': 'en_ZA.ISO8859-1',
1057 'en_za.88591': 'en_ZA.ISO8859-1',
1058 'en_za.iso88591': 'en_ZA.ISO8859-1',
1059 'en_za.iso885915': 'en_ZA.ISO8859-15',
1060 'en_za@euro': 'en_ZA.ISO8859-15',
1061 'en_zm': 'en_ZM.UTF-8',
1062 'en_zw': 'en_ZW.ISO8859-1',
1063 'en_zw.iso88591': 'en_ZW.ISO8859-1',
1064 'en_zw.utf8': 'en_ZS.UTF-8',
1065 'eng_gb': 'en_GB.ISO8859-1',
1066 'eng_gb.8859': 'en_GB.ISO8859-1',
1067 'english': 'en_EN.ISO8859-1',
1068 'english.iso88591': 'en_EN.ISO8859-1',
1069 'english_uk': 'en_GB.ISO8859-1',
1070 'english_uk.8859': 'en_GB.ISO8859-1',
1071 'english_united-states': 'en_US.ISO8859-1',
1072 'english_united-states.437': 'C',
1073 'english_us': 'en_US.ISO8859-1',
1074 'english_us.8859': 'en_US.ISO8859-1',
1075 'english_us.ascii': 'en_US.ISO8859-1',
1076 'eo': 'eo_XX.ISO8859-3',
1077 'eo.utf8': 'eo.UTF-8',
1078 'eo_eo': 'eo_EO.ISO8859-3',
1079 'eo_eo.iso88593': 'eo_EO.ISO8859-3',
1080 'eo_us.utf8': 'eo_US.UTF-8',
1081 'eo_xx': 'eo_XX.ISO8859-3',
1082 'eo_xx.iso88593': 'eo_XX.ISO8859-3',
1083 'es': 'es_ES.ISO8859-1',
1084 'es_ar': 'es_AR.ISO8859-1',
1085 'es_ar.iso88591': 'es_AR.ISO8859-1',
1086 'es_bo': 'es_BO.ISO8859-1',
1087 'es_bo.iso88591': 'es_BO.ISO8859-1',
1088 'es_cl': 'es_CL.ISO8859-1',
1089 'es_cl.iso88591': 'es_CL.ISO8859-1',
1090 'es_co': 'es_CO.ISO8859-1',
1091 'es_co.iso88591': 'es_CO.ISO8859-1',
1092 'es_cr': 'es_CR.ISO8859-1',
1093 'es_cr.iso88591': 'es_CR.ISO8859-1',
1094 'es_cu': 'es_CU.UTF-8',
1095 'es_do': 'es_DO.ISO8859-1',
1096 'es_do.iso88591': 'es_DO.ISO8859-1',
1097 'es_ec': 'es_EC.ISO8859-1',
1098 'es_ec.iso88591': 'es_EC.ISO8859-1',
1099 'es_es': 'es_ES.ISO8859-1',
1100 'es_es.88591': 'es_ES.ISO8859-1',
1101 'es_es.iso88591': 'es_ES.ISO8859-1',
1102 'es_es.iso885915': 'es_ES.ISO8859-15',
1103 'es_es.iso885915@euro': 'es_ES.ISO8859-15',
1104 'es_es.utf8@euro': 'es_ES.UTF-8',
1105 'es_es@euro': 'es_ES.ISO8859-15',
1106 'es_gt': 'es_GT.ISO8859-1',
1107 'es_gt.iso88591': 'es_GT.ISO8859-1',
1108 'es_hn': 'es_HN.ISO8859-1',
1109 'es_hn.iso88591': 'es_HN.ISO8859-1',
1110 'es_mx': 'es_MX.ISO8859-1',
1111 'es_mx.iso88591': 'es_MX.ISO8859-1',
1112 'es_ni': 'es_NI.ISO8859-1',
1113 'es_ni.iso88591': 'es_NI.ISO8859-1',
1114 'es_pa': 'es_PA.ISO8859-1',
1115 'es_pa.iso88591': 'es_PA.ISO8859-1',
1116 'es_pa.iso885915': 'es_PA.ISO8859-15',
1117 'es_pa@euro': 'es_PA.ISO8859-15',
1118 'es_pe': 'es_PE.ISO8859-1',
1119 'es_pe.iso88591': 'es_PE.ISO8859-1',
1120 'es_pe.iso885915': 'es_PE.ISO8859-15',
1121 'es_pe@euro': 'es_PE.ISO8859-15',
1122 'es_pr': 'es_PR.ISO8859-1',
1123 'es_pr.iso88591': 'es_PR.ISO8859-1',
1124 'es_py': 'es_PY.ISO8859-1',
1125 'es_py.iso88591': 'es_PY.ISO8859-1',
1126 'es_py.iso885915': 'es_PY.ISO8859-15',
1127 'es_py@euro': 'es_PY.ISO8859-15',
1128 'es_sv': 'es_SV.ISO8859-1',
1129 'es_sv.iso88591': 'es_SV.ISO8859-1',
1130 'es_sv.iso885915': 'es_SV.ISO8859-15',
1131 'es_sv@euro': 'es_SV.ISO8859-15',
1132 'es_us': 'es_US.ISO8859-1',
1133 'es_us.iso88591': 'es_US.ISO8859-1',
1134 'es_uy': 'es_UY.ISO8859-1',
1135 'es_uy.iso88591': 'es_UY.ISO8859-1',
1136 'es_uy.iso885915': 'es_UY.ISO8859-15',
1137 'es_uy@euro': 'es_UY.ISO8859-15',
1138 'es_ve': 'es_VE.ISO8859-1',
1139 'es_ve.iso88591': 'es_VE.ISO8859-1',
1140 'es_ve.iso885915': 'es_VE.ISO8859-15',
1141 'es_ve@euro': 'es_VE.ISO8859-15',
1142 'estonian': 'et_EE.ISO8859-1',
1143 'et': 'et_EE.ISO8859-15',
1144 'et_ee': 'et_EE.ISO8859-15',
1145 'et_ee.iso88591': 'et_EE.ISO8859-1',
1146 'et_ee.iso885913': 'et_EE.ISO8859-13',
1147 'et_ee.iso885915': 'et_EE.ISO8859-15',
1148 'et_ee.iso88594': 'et_EE.ISO8859-4',
1149 'et_ee@euro': 'et_EE.ISO8859-15',
1150 'eu': 'eu_ES.ISO8859-1',
1151 'eu_es': 'eu_ES.ISO8859-1',
1152 'eu_es.iso88591': 'eu_ES.ISO8859-1',
1153 'eu_es.iso885915': 'eu_ES.ISO8859-15',
1154 'eu_es.iso885915@euro': 'eu_ES.ISO8859-15',
1155 'eu_es.utf8@euro': 'eu_ES.UTF-8',
1156 'eu_es@euro': 'eu_ES.ISO8859-15',
1157 'eu_fr': 'eu_FR.ISO8859-1',
1158 'fa': 'fa_IR.UTF-8',
1159 'fa_ir': 'fa_IR.UTF-8',
1160 'fa_ir.isiri3342': 'fa_IR.ISIRI-3342',
1161 'ff_sn': 'ff_SN.UTF-8',
1162 'fi': 'fi_FI.ISO8859-15',
1163 'fi.iso885915': 'fi_FI.ISO8859-15',
1164 'fi_fi': 'fi_FI.ISO8859-15',
1165 'fi_fi.88591': 'fi_FI.ISO8859-1',
1166 'fi_fi.iso88591': 'fi_FI.ISO8859-1',
1167 'fi_fi.iso885915': 'fi_FI.ISO8859-15',
1168 'fi_fi.iso885915@euro': 'fi_FI.ISO8859-15',
1169 'fi_fi.utf8@euro': 'fi_FI.UTF-8',
1170 'fi_fi@euro': 'fi_FI.ISO8859-15',
1171 'fil_ph': 'fil_PH.UTF-8',
1172 'finnish': 'fi_FI.ISO8859-1',
1173 'finnish.iso88591': 'fi_FI.ISO8859-1',
1174 'fo': 'fo_FO.ISO8859-1',
1175 'fo_fo': 'fo_FO.ISO8859-1',
1176 'fo_fo.iso88591': 'fo_FO.ISO8859-1',
1177 'fo_fo.iso885915': 'fo_FO.ISO8859-15',
1178 'fo_fo@euro': 'fo_FO.ISO8859-15',
1179 'fr': 'fr_FR.ISO8859-1',
1180 'fr.iso885915': 'fr_FR.ISO8859-15',
1181 'fr_be': 'fr_BE.ISO8859-1',
1182 'fr_be.88591': 'fr_BE.ISO8859-1',
1183 'fr_be.iso88591': 'fr_BE.ISO8859-1',
1184 'fr_be.iso885915': 'fr_BE.ISO8859-15',
1185 'fr_be.iso885915@euro': 'fr_BE.ISO8859-15',
1186 'fr_be.utf8@euro': 'fr_BE.UTF-8',
1187 'fr_be@euro': 'fr_BE.ISO8859-15',
1188 'fr_ca': 'fr_CA.ISO8859-1',
1189 'fr_ca.88591': 'fr_CA.ISO8859-1',
1190 'fr_ca.iso88591': 'fr_CA.ISO8859-1',
1191 'fr_ca.iso885915': 'fr_CA.ISO8859-15',
1192 'fr_ca@euro': 'fr_CA.ISO8859-15',
1193 'fr_ch': 'fr_CH.ISO8859-1',
1194 'fr_ch.88591': 'fr_CH.ISO8859-1',
1195 'fr_ch.iso88591': 'fr_CH.ISO8859-1',
1196 'fr_ch.iso885915': 'fr_CH.ISO8859-15',
1197 'fr_ch@euro': 'fr_CH.ISO8859-15',
1198 'fr_fr': 'fr_FR.ISO8859-1',
1199 'fr_fr.88591': 'fr_FR.ISO8859-1',
1200 'fr_fr.iso88591': 'fr_FR.ISO8859-1',
1201 'fr_fr.iso885915': 'fr_FR.ISO8859-15',
1202 'fr_fr.iso885915@euro': 'fr_FR.ISO8859-15',
1203 'fr_fr.utf8@euro': 'fr_FR.UTF-8',
1204 'fr_fr@euro': 'fr_FR.ISO8859-15',
1205 'fr_lu': 'fr_LU.ISO8859-1',
1206 'fr_lu.88591': 'fr_LU.ISO8859-1',
1207 'fr_lu.iso88591': 'fr_LU.ISO8859-1',
1208 'fr_lu.iso885915': 'fr_LU.ISO8859-15',
1209 'fr_lu.iso885915@euro': 'fr_LU.ISO8859-15',
1210 'fr_lu.utf8@euro': 'fr_LU.UTF-8',
1211 'fr_lu@euro': 'fr_LU.ISO8859-15',
1212 'fran\xe7ais': 'fr_FR.ISO8859-1',
1213 'fre_fr': 'fr_FR.ISO8859-1',
1214 'fre_fr.8859': 'fr_FR.ISO8859-1',
1215 'french': 'fr_FR.ISO8859-1',
1216 'french.iso88591': 'fr_CH.ISO8859-1',
1217 'french_france': 'fr_FR.ISO8859-1',
1218 'french_france.8859': 'fr_FR.ISO8859-1',
1219 'fur_it': 'fur_IT.UTF-8',
1220 'fy_de': 'fy_DE.UTF-8',
1221 'fy_nl': 'fy_NL.UTF-8',
1222 'ga': 'ga_IE.ISO8859-1',
1223 'ga_ie': 'ga_IE.ISO8859-1',
1224 'ga_ie.iso88591': 'ga_IE.ISO8859-1',
1225 'ga_ie.iso885914': 'ga_IE.ISO8859-14',
1226 'ga_ie.iso885915': 'ga_IE.ISO8859-15',
1227 'ga_ie.iso885915@euro': 'ga_IE.ISO8859-15',
1228 'ga_ie.utf8@euro': 'ga_IE.UTF-8',
1229 'ga_ie@euro': 'ga_IE.ISO8859-15',
1230 'galego': 'gl_ES.ISO8859-1',
1231 'galician': 'gl_ES.ISO8859-1',
1232 'gd': 'gd_GB.ISO8859-1',
1233 'gd_gb': 'gd_GB.ISO8859-1',
1234 'gd_gb.iso88591': 'gd_GB.ISO8859-1',
1235 'gd_gb.iso885914': 'gd_GB.ISO8859-14',
1236 'gd_gb.iso885915': 'gd_GB.ISO8859-15',
1237 'gd_gb@euro': 'gd_GB.ISO8859-15',
1238 'ger_de': 'de_DE.ISO8859-1',
1239 'ger_de.8859': 'de_DE.ISO8859-1',
1240 'german': 'de_DE.ISO8859-1',
1241 'german.iso88591': 'de_CH.ISO8859-1',
1242 'german_germany': 'de_DE.ISO8859-1',
1243 'german_germany.8859': 'de_DE.ISO8859-1',
1244 'gez_er': 'gez_ER.UTF-8',
1245 'gez_et': 'gez_ET.UTF-8',
1246 'gl': 'gl_ES.ISO8859-1',
1247 'gl_es': 'gl_ES.ISO8859-1',
1248 'gl_es.iso88591': 'gl_ES.ISO8859-1',
1249 'gl_es.iso885915': 'gl_ES.ISO8859-15',
1250 'gl_es.iso885915@euro': 'gl_ES.ISO8859-15',
1251 'gl_es.utf8@euro': 'gl_ES.UTF-8',
1252 'gl_es@euro': 'gl_ES.ISO8859-15',
1253 'greek': 'el_GR.ISO8859-7',
1254 'greek.iso88597': 'el_GR.ISO8859-7',
1255 'gu_in': 'gu_IN.UTF-8',
1256 'gv': 'gv_GB.ISO8859-1',
1257 'gv_gb': 'gv_GB.ISO8859-1',
1258 'gv_gb.iso88591': 'gv_GB.ISO8859-1',
1259 'gv_gb.iso885914': 'gv_GB.ISO8859-14',
1260 'gv_gb.iso885915': 'gv_GB.ISO8859-15',
1261 'gv_gb@euro': 'gv_GB.ISO8859-15',
1262 'ha_ng': 'ha_NG.UTF-8',
1263 'he': 'he_IL.ISO8859-8',
1264 'he_il': 'he_IL.ISO8859-8',
1265 'he_il.cp1255': 'he_IL.CP1255',
1266 'he_il.iso88598': 'he_IL.ISO8859-8',
1267 'he_il.microsoftcp1255': 'he_IL.CP1255',
1268 'hebrew': 'he_IL.ISO8859-8',
1269 'hebrew.iso88598': 'he_IL.ISO8859-8',
1270 'hi': 'hi_IN.ISCII-DEV',
1271 'hi_in': 'hi_IN.ISCII-DEV',
1272 'hi_in.isciidev': 'hi_IN.ISCII-DEV',
1273 'hne': 'hne_IN.UTF-8',
1274 'hne_in': 'hne_IN.UTF-8',
1275 'hr': 'hr_HR.ISO8859-2',
1276 'hr_hr': 'hr_HR.ISO8859-2',
1277 'hr_hr.iso88592': 'hr_HR.ISO8859-2',
1278 'hrvatski': 'hr_HR.ISO8859-2',
1279 'hsb_de': 'hsb_DE.ISO8859-2',
1280 'ht_ht': 'ht_HT.UTF-8',
1281 'hu': 'hu_HU.ISO8859-2',
1282 'hu_hu': 'hu_HU.ISO8859-2',
1283 'hu_hu.iso88592': 'hu_HU.ISO8859-2',
1284 'hungarian': 'hu_HU.ISO8859-2',
1285 'hy_am': 'hy_AM.UTF-8',
1286 'hy_am.armscii8': 'hy_AM.ARMSCII_8',
1287 'ia': 'ia.UTF-8',
1288 'ia_fr': 'ia_FR.UTF-8',
1289 'icelandic': 'is_IS.ISO8859-1',
1290 'icelandic.iso88591': 'is_IS.ISO8859-1',
1291 'id': 'id_ID.ISO8859-1',
1292 'id_id': 'id_ID.ISO8859-1',
1293 'ig_ng': 'ig_NG.UTF-8',
1294 'ik_ca': 'ik_CA.UTF-8',
1295 'in': 'id_ID.ISO8859-1',
1296 'in_id': 'id_ID.ISO8859-1',
1297 'is': 'is_IS.ISO8859-1',
1298 'is_is': 'is_IS.ISO8859-1',
1299 'is_is.iso88591': 'is_IS.ISO8859-1',
1300 'is_is.iso885915': 'is_IS.ISO8859-15',
1301 'is_is@euro': 'is_IS.ISO8859-15',
1302 'iso-8859-1': 'en_US.ISO8859-1',
1303 'iso-8859-15': 'en_US.ISO8859-15',
1304 'iso8859-1': 'en_US.ISO8859-1',
1305 'iso8859-15': 'en_US.ISO8859-15',
1306 'iso_8859_1': 'en_US.ISO8859-1',
1307 'iso_8859_15': 'en_US.ISO8859-15',
1308 'it': 'it_IT.ISO8859-1',
1309 'it.iso885915': 'it_IT.ISO8859-15',
1310 'it_ch': 'it_CH.ISO8859-1',
1311 'it_ch.iso88591': 'it_CH.ISO8859-1',
1312 'it_ch.iso885915': 'it_CH.ISO8859-15',
1313 'it_ch@euro': 'it_CH.ISO8859-15',
1314 'it_it': 'it_IT.ISO8859-1',
1315 'it_it.88591': 'it_IT.ISO8859-1',
1316 'it_it.iso88591': 'it_IT.ISO8859-1',
1317 'it_it.iso885915': 'it_IT.ISO8859-15',
1318 'it_it.iso885915@euro': 'it_IT.ISO8859-15',
1319 'it_it.utf8@euro': 'it_IT.UTF-8',
1320 'it_it@euro': 'it_IT.ISO8859-15',
1321 'italian': 'it_IT.ISO8859-1',
1322 'italian.iso88591': 'it_IT.ISO8859-1',
1323 'iu': 'iu_CA.NUNACOM-8',
1324 'iu_ca': 'iu_CA.NUNACOM-8',
1325 'iu_ca.nunacom8': 'iu_CA.NUNACOM-8',
1326 'iw': 'he_IL.ISO8859-8',
1327 'iw_il': 'he_IL.ISO8859-8',
1328 'iw_il.iso88598': 'he_IL.ISO8859-8',
1329 'iw_il.utf8': 'iw_IL.UTF-8',
1330 'ja': 'ja_JP.eucJP',
1331 'ja.jis': 'ja_JP.JIS7',
1332 'ja.sjis': 'ja_JP.SJIS',
1333 'ja_jp': 'ja_JP.eucJP',
1334 'ja_jp.ajec': 'ja_JP.eucJP',
1335 'ja_jp.euc': 'ja_JP.eucJP',
1336 'ja_jp.eucjp': 'ja_JP.eucJP',
1337 'ja_jp.iso-2022-jp': 'ja_JP.JIS7',
1338 'ja_jp.iso2022jp': 'ja_JP.JIS7',
1339 'ja_jp.jis': 'ja_JP.JIS7',
1340 'ja_jp.jis7': 'ja_JP.JIS7',
1341 'ja_jp.mscode': 'ja_JP.SJIS',
1342 'ja_jp.pck': 'ja_JP.SJIS',
1343 'ja_jp.sjis': 'ja_JP.SJIS',
1344 'ja_jp.ujis': 'ja_JP.eucJP',
1345 'japan': 'ja_JP.eucJP',
1346 'japanese': 'ja_JP.eucJP',
1347 'japanese-euc': 'ja_JP.eucJP',
1348 'japanese.euc': 'ja_JP.eucJP',
1349 'japanese.sjis': 'ja_JP.SJIS',
1350 'jp_jp': 'ja_JP.eucJP',
1351 'ka': 'ka_GE.GEORGIAN-ACADEMY',
1352 'ka_ge': 'ka_GE.GEORGIAN-ACADEMY',
1353 'ka_ge.georgianacademy': 'ka_GE.GEORGIAN-ACADEMY',
1354 'ka_ge.georgianps': 'ka_GE.GEORGIAN-PS',
1355 'ka_ge.georgianrs': 'ka_GE.GEORGIAN-ACADEMY',
1356 'kk_kz': 'kk_KZ.RK1048',
1357 'kl': 'kl_GL.ISO8859-1',
1358 'kl_gl': 'kl_GL.ISO8859-1',
1359 'kl_gl.iso88591': 'kl_GL.ISO8859-1',
1360 'kl_gl.iso885915': 'kl_GL.ISO8859-15',
1361 'kl_gl@euro': 'kl_GL.ISO8859-15',
1362 'km_kh': 'km_KH.UTF-8',
1363 'kn': 'kn_IN.UTF-8',
1364 'kn_in': 'kn_IN.UTF-8',
1365 'ko': 'ko_KR.eucKR',
1366 'ko_kr': 'ko_KR.eucKR',
1367 'ko_kr.euc': 'ko_KR.eucKR',
1368 'ko_kr.euckr': 'ko_KR.eucKR',
1369 'kok_in': 'kok_IN.UTF-8',
1370 'korean': 'ko_KR.eucKR',
1371 'korean.euc': 'ko_KR.eucKR',
1372 'ks': 'ks_IN.UTF-8',
1373 'ks_in': 'ks_IN.UTF-8',
1374 'ks_in@devanagari': 'ks_IN.UTF-8@devanagari',
1375 'ks_in@devanagari.utf8': 'ks_IN.UTF-8@devanagari',
1376 'ku_tr': 'ku_TR.ISO8859-9',
1377 'kw': 'kw_GB.ISO8859-1',
1378 'kw_gb': 'kw_GB.ISO8859-1',
1379 'kw_gb.iso88591': 'kw_GB.ISO8859-1',
1380 'kw_gb.iso885914': 'kw_GB.ISO8859-14',
1381 'kw_gb.iso885915': 'kw_GB.ISO8859-15',
1382 'kw_gb@euro': 'kw_GB.ISO8859-15',
1383 'ky': 'ky_KG.UTF-8',
1384 'ky_kg': 'ky_KG.UTF-8',
1385 'lb_lu': 'lb_LU.UTF-8',
1386 'lg_ug': 'lg_UG.ISO8859-10',
1387 'li_be': 'li_BE.UTF-8',
1388 'li_nl': 'li_NL.UTF-8',
1389 'lij_it': 'lij_IT.UTF-8',
1390 'lithuanian': 'lt_LT.ISO8859-13',
1391 'lo': 'lo_LA.MULELAO-1',
1392 'lo_la': 'lo_LA.MULELAO-1',
1393 'lo_la.cp1133': 'lo_LA.IBM-CP1133',
1394 'lo_la.ibmcp1133': 'lo_LA.IBM-CP1133',
1395 'lo_la.mulelao1': 'lo_LA.MULELAO-1',
1396 'lt': 'lt_LT.ISO8859-13',
1397 'lt_lt': 'lt_LT.ISO8859-13',
1398 'lt_lt.iso885913': 'lt_LT.ISO8859-13',
1399 'lt_lt.iso88594': 'lt_LT.ISO8859-4',
1400 'lv': 'lv_LV.ISO8859-13',
1401 'lv_lv': 'lv_LV.ISO8859-13',
1402 'lv_lv.iso885913': 'lv_LV.ISO8859-13',
1403 'lv_lv.iso88594': 'lv_LV.ISO8859-4',
1404 'mag_in': 'mag_IN.UTF-8',
1405 'mai': 'mai_IN.UTF-8',
1406 'mai_in': 'mai_IN.UTF-8',
1407 'mg_mg': 'mg_MG.ISO8859-15',
1408 'mhr_ru': 'mhr_RU.UTF-8',
1409 'mi': 'mi_NZ.ISO8859-1',
1410 'mi_nz': 'mi_NZ.ISO8859-1',
1411 'mi_nz.iso88591': 'mi_NZ.ISO8859-1',
1412 'mk': 'mk_MK.ISO8859-5',
1413 'mk_mk': 'mk_MK.ISO8859-5',
1414 'mk_mk.cp1251': 'mk_MK.CP1251',
1415 'mk_mk.iso88595': 'mk_MK.ISO8859-5',
1416 'mk_mk.microsoftcp1251': 'mk_MK.CP1251',
1417 'ml': 'ml_IN.UTF-8',
1418 'ml_in': 'ml_IN.UTF-8',
1419 'mn_mn': 'mn_MN.UTF-8',
1420 'mni_in': 'mni_IN.UTF-8',
1421 'mr': 'mr_IN.UTF-8',
1422 'mr_in': 'mr_IN.UTF-8',
1423 'ms': 'ms_MY.ISO8859-1',
1424 'ms_my': 'ms_MY.ISO8859-1',
1425 'ms_my.iso88591': 'ms_MY.ISO8859-1',
1426 'mt': 'mt_MT.ISO8859-3',
1427 'mt_mt': 'mt_MT.ISO8859-3',
1428 'mt_mt.iso88593': 'mt_MT.ISO8859-3',
1429 'my_mm': 'my_MM.UTF-8',
1430 'nan_tw@latin': 'nan_TW.UTF-8@latin',
1431 'nb': 'nb_NO.ISO8859-1',
1432 'nb_no': 'nb_NO.ISO8859-1',
1433 'nb_no.88591': 'nb_NO.ISO8859-1',
1434 'nb_no.iso88591': 'nb_NO.ISO8859-1',
1435 'nb_no.iso885915': 'nb_NO.ISO8859-15',
1436 'nb_no@euro': 'nb_NO.ISO8859-15',
1437 'nds_de': 'nds_DE.UTF-8',
1438 'nds_nl': 'nds_NL.UTF-8',
1439 'ne_np': 'ne_NP.UTF-8',
1440 'nhn_mx': 'nhn_MX.UTF-8',
1441 'niu_nu': 'niu_NU.UTF-8',
1442 'niu_nz': 'niu_NZ.UTF-8',
1443 'nl': 'nl_NL.ISO8859-1',
1444 'nl.iso885915': 'nl_NL.ISO8859-15',
1445 'nl_aw': 'nl_AW.UTF-8',
1446 'nl_be': 'nl_BE.ISO8859-1',
1447 'nl_be.88591': 'nl_BE.ISO8859-1',
1448 'nl_be.iso88591': 'nl_BE.ISO8859-1',
1449 'nl_be.iso885915': 'nl_BE.ISO8859-15',
1450 'nl_be.iso885915@euro': 'nl_BE.ISO8859-15',
1451 'nl_be.utf8@euro': 'nl_BE.UTF-8',
1452 'nl_be@euro': 'nl_BE.ISO8859-15',
1453 'nl_nl': 'nl_NL.ISO8859-1',
1454 'nl_nl.88591': 'nl_NL.ISO8859-1',
1455 'nl_nl.iso88591': 'nl_NL.ISO8859-1',
1456 'nl_nl.iso885915': 'nl_NL.ISO8859-15',
1457 'nl_nl.iso885915@euro': 'nl_NL.ISO8859-15',
1458 'nl_nl.utf8@euro': 'nl_NL.UTF-8',
1459 'nl_nl@euro': 'nl_NL.ISO8859-15',
1460 'nn': 'nn_NO.ISO8859-1',
1461 'nn_no': 'nn_NO.ISO8859-1',
1462 'nn_no.88591': 'nn_NO.ISO8859-1',
1463 'nn_no.iso88591': 'nn_NO.ISO8859-1',
1464 'nn_no.iso885915': 'nn_NO.ISO8859-15',
1465 'nn_no@euro': 'nn_NO.ISO8859-15',
1466 'no': 'no_NO.ISO8859-1',
1467 'no@nynorsk': 'ny_NO.ISO8859-1',
1468 'no_no': 'no_NO.ISO8859-1',
1469 'no_no.88591': 'no_NO.ISO8859-1',
1470 'no_no.iso88591': 'no_NO.ISO8859-1',
1471 'no_no.iso885915': 'no_NO.ISO8859-15',
1472 'no_no.iso88591@bokmal': 'no_NO.ISO8859-1',
1473 'no_no.iso88591@nynorsk': 'no_NO.ISO8859-1',
1474 'no_no@euro': 'no_NO.ISO8859-15',
1475 'norwegian': 'no_NO.ISO8859-1',
1476 'norwegian.iso88591': 'no_NO.ISO8859-1',
1477 'nr': 'nr_ZA.ISO8859-1',
1478 'nr_za': 'nr_ZA.ISO8859-1',
1479 'nr_za.iso88591': 'nr_ZA.ISO8859-1',
1480 'nso': 'nso_ZA.ISO8859-15',
1481 'nso_za': 'nso_ZA.ISO8859-15',
1482 'nso_za.iso885915': 'nso_ZA.ISO8859-15',
1483 'ny': 'ny_NO.ISO8859-1',
1484 'ny_no': 'ny_NO.ISO8859-1',
1485 'ny_no.88591': 'ny_NO.ISO8859-1',
1486 'ny_no.iso88591': 'ny_NO.ISO8859-1',
1487 'ny_no.iso885915': 'ny_NO.ISO8859-15',
1488 'ny_no@euro': 'ny_NO.ISO8859-15',
1489 'nynorsk': 'nn_NO.ISO8859-1',
1490 'oc': 'oc_FR.ISO8859-1',
1491 'oc_fr': 'oc_FR.ISO8859-1',
1492 'oc_fr.iso88591': 'oc_FR.ISO8859-1',
1493 'oc_fr.iso885915': 'oc_FR.ISO8859-15',
1494 'oc_fr@euro': 'oc_FR.ISO8859-15',
1495 'om_et': 'om_ET.UTF-8',
1496 'om_ke': 'om_KE.ISO8859-1',
1497 'or': 'or_IN.UTF-8',
1498 'or_in': 'or_IN.UTF-8',
1499 'os_ru': 'os_RU.UTF-8',
1500 'pa': 'pa_IN.UTF-8',
1501 'pa_in': 'pa_IN.UTF-8',
1502 'pa_pk': 'pa_PK.UTF-8',
1503 'pap_an': 'pap_AN.UTF-8',
1504 'pd': 'pd_US.ISO8859-1',
1505 'pd_de': 'pd_DE.ISO8859-1',
1506 'pd_de.iso88591': 'pd_DE.ISO8859-1',
1507 'pd_de.iso885915': 'pd_DE.ISO8859-15',
1508 'pd_de@euro': 'pd_DE.ISO8859-15',
1509 'pd_us': 'pd_US.ISO8859-1',
1510 'pd_us.iso88591': 'pd_US.ISO8859-1',
1511 'pd_us.iso885915': 'pd_US.ISO8859-15',
1512 'pd_us@euro': 'pd_US.ISO8859-15',
1513 'ph': 'ph_PH.ISO8859-1',
1514 'ph_ph': 'ph_PH.ISO8859-1',
1515 'ph_ph.iso88591': 'ph_PH.ISO8859-1',
1516 'pl': 'pl_PL.ISO8859-2',
1517 'pl_pl': 'pl_PL.ISO8859-2',
1518 'pl_pl.iso88592': 'pl_PL.ISO8859-2',
1519 'polish': 'pl_PL.ISO8859-2',
1520 'portuguese': 'pt_PT.ISO8859-1',
1521 'portuguese.iso88591': 'pt_PT.ISO8859-1',
1522 'portuguese_brazil': 'pt_BR.ISO8859-1',
1523 'portuguese_brazil.8859': 'pt_BR.ISO8859-1',
1524 'posix': 'C',
1525 'posix-utf2': 'C',
1526 'pp': 'pp_AN.ISO8859-1',
1527 'pp_an': 'pp_AN.ISO8859-1',
1528 'pp_an.iso88591': 'pp_AN.ISO8859-1',
1529 'ps_af': 'ps_AF.UTF-8',
1530 'pt': 'pt_PT.ISO8859-1',
1531 'pt.iso885915': 'pt_PT.ISO8859-15',
1532 'pt_br': 'pt_BR.ISO8859-1',
1533 'pt_br.88591': 'pt_BR.ISO8859-1',
1534 'pt_br.iso88591': 'pt_BR.ISO8859-1',
1535 'pt_br.iso885915': 'pt_BR.ISO8859-15',
1536 'pt_br@euro': 'pt_BR.ISO8859-15',
1537 'pt_pt': 'pt_PT.ISO8859-1',
1538 'pt_pt.88591': 'pt_PT.ISO8859-1',
1539 'pt_pt.iso88591': 'pt_PT.ISO8859-1',
1540 'pt_pt.iso885915': 'pt_PT.ISO8859-15',
1541 'pt_pt.iso885915@euro': 'pt_PT.ISO8859-15',
1542 'pt_pt.utf8@euro': 'pt_PT.UTF-8',
1543 'pt_pt@euro': 'pt_PT.ISO8859-15',
1544 'ro': 'ro_RO.ISO8859-2',
1545 'ro_ro': 'ro_RO.ISO8859-2',
1546 'ro_ro.iso88592': 'ro_RO.ISO8859-2',
1547 'romanian': 'ro_RO.ISO8859-2',
1548 'ru': 'ru_RU.UTF-8',
1549 'ru.koi8r': 'ru_RU.KOI8-R',
1550 'ru_ru': 'ru_RU.UTF-8',
1551 'ru_ru.cp1251': 'ru_RU.CP1251',
1552 'ru_ru.iso88595': 'ru_RU.ISO8859-5',
1553 'ru_ru.koi8r': 'ru_RU.KOI8-R',
1554 'ru_ru.microsoftcp1251': 'ru_RU.CP1251',
1555 'ru_ua': 'ru_UA.KOI8-U',
1556 'ru_ua.cp1251': 'ru_UA.CP1251',
1557 'ru_ua.koi8u': 'ru_UA.KOI8-U',
1558 'ru_ua.microsoftcp1251': 'ru_UA.CP1251',
1559 'rumanian': 'ro_RO.ISO8859-2',
1560 'russian': 'ru_RU.ISO8859-5',
1561 'rw': 'rw_RW.ISO8859-1',
1562 'rw_rw': 'rw_RW.ISO8859-1',
1563 'rw_rw.iso88591': 'rw_RW.ISO8859-1',
1564 'sa_in': 'sa_IN.UTF-8',
1565 'sat_in': 'sat_IN.UTF-8',
1566 'sc_it': 'sc_IT.UTF-8',
1567 'sd': 'sd_IN.UTF-8',
1568 'sd@devanagari': 'sd_IN.UTF-8@devanagari',
1569 'sd_in': 'sd_IN.UTF-8',
1570 'sd_in@devanagari': 'sd_IN.UTF-8@devanagari',
1571 'sd_in@devanagari.utf8': 'sd_IN.UTF-8@devanagari',
1572 'sd_pk': 'sd_PK.UTF-8',
1573 'se_no': 'se_NO.UTF-8',
1574 'serbocroatian': 'sr_RS.UTF-8@latin',
1575 'sh': 'sr_RS.UTF-8@latin',
1576 'sh_ba.iso88592@bosnia': 'sr_CS.ISO8859-2',
1577 'sh_hr': 'sh_HR.ISO8859-2',
1578 'sh_hr.iso88592': 'hr_HR.ISO8859-2',
1579 'sh_sp': 'sr_CS.ISO8859-2',
1580 'sh_yu': 'sr_RS.UTF-8@latin',
1581 'shs_ca': 'shs_CA.UTF-8',
1582 'si': 'si_LK.UTF-8',
1583 'si_lk': 'si_LK.UTF-8',
1584 'sid_et': 'sid_ET.UTF-8',
1585 'sinhala': 'si_LK.UTF-8',
1586 'sk': 'sk_SK.ISO8859-2',
1587 'sk_sk': 'sk_SK.ISO8859-2',
1588 'sk_sk.iso88592': 'sk_SK.ISO8859-2',
1589 'sl': 'sl_SI.ISO8859-2',
1590 'sl_cs': 'sl_CS.ISO8859-2',
1591 'sl_si': 'sl_SI.ISO8859-2',
1592 'sl_si.iso88592': 'sl_SI.ISO8859-2',
1593 'slovak': 'sk_SK.ISO8859-2',
1594 'slovene': 'sl_SI.ISO8859-2',
1595 'slovenian': 'sl_SI.ISO8859-2',
1596 'so_dj': 'so_DJ.ISO8859-1',
1597 'so_et': 'so_ET.UTF-8',
1598 'so_ke': 'so_KE.ISO8859-1',
1599 'so_so': 'so_SO.ISO8859-1',
1600 'sp': 'sr_CS.ISO8859-5',
1601 'sp_yu': 'sr_CS.ISO8859-5',
1602 'spanish': 'es_ES.ISO8859-1',
1603 'spanish.iso88591': 'es_ES.ISO8859-1',
1604 'spanish_spain': 'es_ES.ISO8859-1',
1605 'spanish_spain.8859': 'es_ES.ISO8859-1',
1606 'sq': 'sq_AL.ISO8859-2',
1607 'sq_al': 'sq_AL.ISO8859-2',
1608 'sq_al.iso88592': 'sq_AL.ISO8859-2',
1609 'sq_mk': 'sq_MK.UTF-8',
1610 'sr': 'sr_RS.UTF-8',
1611 'sr@cyrillic': 'sr_RS.UTF-8',
1612 'sr@latin': 'sr_RS.UTF-8@latin',
1613 'sr@latn': 'sr_CS.UTF-8@latin',
1614 'sr_cs': 'sr_CS.UTF-8',
1615 'sr_cs.iso88592': 'sr_CS.ISO8859-2',
1616 'sr_cs.iso88592@latn': 'sr_CS.ISO8859-2',
1617 'sr_cs.iso88595': 'sr_CS.ISO8859-5',
1618 'sr_cs.utf8@latn': 'sr_CS.UTF-8@latin',
1619 'sr_cs@latn': 'sr_CS.UTF-8@latin',
1620 'sr_me': 'sr_ME.UTF-8',
1621 'sr_rs': 'sr_RS.UTF-8',
1622 'sr_rs@latin': 'sr_RS.UTF-8@latin',
1623 'sr_rs@latn': 'sr_RS.UTF-8@latin',
1624 'sr_sp': 'sr_CS.ISO8859-2',
1625 'sr_yu': 'sr_RS.UTF-8@latin',
1626 'sr_yu.cp1251@cyrillic': 'sr_CS.CP1251',
1627 'sr_yu.iso88592': 'sr_CS.ISO8859-2',
1628 'sr_yu.iso88595': 'sr_CS.ISO8859-5',
1629 'sr_yu.iso88595@cyrillic': 'sr_CS.ISO8859-5',
1630 'sr_yu.microsoftcp1251@cyrillic': 'sr_CS.CP1251',
1631 'sr_yu.utf8': 'sr_RS.UTF-8',
1632 'sr_yu.utf8@cyrillic': 'sr_RS.UTF-8',
1633 'sr_yu@cyrillic': 'sr_RS.UTF-8',
1634 'ss': 'ss_ZA.ISO8859-1',
1635 'ss_za': 'ss_ZA.ISO8859-1',
1636 'ss_za.iso88591': 'ss_ZA.ISO8859-1',
1637 'st': 'st_ZA.ISO8859-1',
1638 'st_za': 'st_ZA.ISO8859-1',
1639 'st_za.iso88591': 'st_ZA.ISO8859-1',
1640 'sv': 'sv_SE.ISO8859-1',
1641 'sv.iso885915': 'sv_SE.ISO8859-15',
1642 'sv_fi': 'sv_FI.ISO8859-1',
1643 'sv_fi.iso88591': 'sv_FI.ISO8859-1',
1644 'sv_fi.iso885915': 'sv_FI.ISO8859-15',
1645 'sv_fi.iso885915@euro': 'sv_FI.ISO8859-15',
1646 'sv_fi.utf8@euro': 'sv_FI.UTF-8',
1647 'sv_fi@euro': 'sv_FI.ISO8859-15',
1648 'sv_se': 'sv_SE.ISO8859-1',
1649 'sv_se.88591': 'sv_SE.ISO8859-1',
1650 'sv_se.iso88591': 'sv_SE.ISO8859-1',
1651 'sv_se.iso885915': 'sv_SE.ISO8859-15',
1652 'sv_se@euro': 'sv_SE.ISO8859-15',
1653 'sw_ke': 'sw_KE.UTF-8',
1654 'sw_tz': 'sw_TZ.UTF-8',
1655 'swedish': 'sv_SE.ISO8859-1',
1656 'swedish.iso88591': 'sv_SE.ISO8859-1',
1657 'szl_pl': 'szl_PL.UTF-8',
1658 'ta': 'ta_IN.TSCII-0',
1659 'ta_in': 'ta_IN.TSCII-0',
1660 'ta_in.tscii': 'ta_IN.TSCII-0',
1661 'ta_in.tscii0': 'ta_IN.TSCII-0',
1662 'ta_lk': 'ta_LK.UTF-8',
1663 'te': 'te_IN.UTF-8',
1664 'te_in': 'te_IN.UTF-8',
1665 'tg': 'tg_TJ.KOI8-C',
1666 'tg_tj': 'tg_TJ.KOI8-C',
1667 'tg_tj.koi8c': 'tg_TJ.KOI8-C',
1668 'th': 'th_TH.ISO8859-11',
1669 'th_th': 'th_TH.ISO8859-11',
1670 'th_th.iso885911': 'th_TH.ISO8859-11',
1671 'th_th.tactis': 'th_TH.TIS620',
1672 'th_th.tis620': 'th_TH.TIS620',
1673 'thai': 'th_TH.ISO8859-11',
1674 'ti_er': 'ti_ER.UTF-8',
1675 'ti_et': 'ti_ET.UTF-8',
1676 'tig_er': 'tig_ER.UTF-8',
1677 'tk_tm': 'tk_TM.UTF-8',
1678 'tl': 'tl_PH.ISO8859-1',
1679 'tl_ph': 'tl_PH.ISO8859-1',
1680 'tl_ph.iso88591': 'tl_PH.ISO8859-1',
1681 'tn': 'tn_ZA.ISO8859-15',
1682 'tn_za': 'tn_ZA.ISO8859-15',
1683 'tn_za.iso885915': 'tn_ZA.ISO8859-15',
1684 'tr': 'tr_TR.ISO8859-9',
1685 'tr_cy': 'tr_CY.ISO8859-9',
1686 'tr_tr': 'tr_TR.ISO8859-9',
1687 'tr_tr.iso88599': 'tr_TR.ISO8859-9',
1688 'ts': 'ts_ZA.ISO8859-1',
1689 'ts_za': 'ts_ZA.ISO8859-1',
1690 'ts_za.iso88591': 'ts_ZA.ISO8859-1',
1691 'tt': 'tt_RU.TATAR-CYR',
1692 'tt_ru': 'tt_RU.TATAR-CYR',
1693 'tt_ru.koi8c': 'tt_RU.KOI8-C',
1694 'tt_ru.tatarcyr': 'tt_RU.TATAR-CYR',
1695 'tt_ru@iqtelif': 'tt_RU.UTF-8@iqtelif',
1696 'turkish': 'tr_TR.ISO8859-9',
1697 'turkish.iso88599': 'tr_TR.ISO8859-9',
1698 'ug_cn': 'ug_CN.UTF-8',
1699 'uk': 'uk_UA.KOI8-U',
1700 'uk_ua': 'uk_UA.KOI8-U',
1701 'uk_ua.cp1251': 'uk_UA.CP1251',
1702 'uk_ua.iso88595': 'uk_UA.ISO8859-5',
1703 'uk_ua.koi8u': 'uk_UA.KOI8-U',
1704 'uk_ua.microsoftcp1251': 'uk_UA.CP1251',
1705 'univ': 'en_US.utf',
1706 'universal': 'en_US.utf',
1707 'universal.utf8@ucs4': 'en_US.UTF-8',
1708 'unm_us': 'unm_US.UTF-8',
1709 'ur': 'ur_PK.CP1256',
1710 'ur_in': 'ur_IN.UTF-8',
1711 'ur_pk': 'ur_PK.CP1256',
1712 'ur_pk.cp1256': 'ur_PK.CP1256',
1713 'ur_pk.microsoftcp1256': 'ur_PK.CP1256',
1714 'uz': 'uz_UZ.UTF-8',
1715 'uz_uz': 'uz_UZ.UTF-8',
1716 'uz_uz.iso88591': 'uz_UZ.ISO8859-1',
1717 'uz_uz.utf8@cyrillic': 'uz_UZ.UTF-8',
1718 'uz_uz@cyrillic': 'uz_UZ.UTF-8',
1719 've': 've_ZA.UTF-8',
1720 've_za': 've_ZA.UTF-8',
1721 'vi': 'vi_VN.TCVN',
1722 'vi_vn': 'vi_VN.TCVN',
1723 'vi_vn.tcvn': 'vi_VN.TCVN',
1724 'vi_vn.tcvn5712': 'vi_VN.TCVN',
1725 'vi_vn.viscii': 'vi_VN.VISCII',
1726 'vi_vn.viscii111': 'vi_VN.VISCII',
1727 'wa': 'wa_BE.ISO8859-1',
1728 'wa_be': 'wa_BE.ISO8859-1',
1729 'wa_be.iso88591': 'wa_BE.ISO8859-1',
1730 'wa_be.iso885915': 'wa_BE.ISO8859-15',
1731 'wa_be.iso885915@euro': 'wa_BE.ISO8859-15',
1732 'wa_be@euro': 'wa_BE.ISO8859-15',
1733 'wae_ch': 'wae_CH.UTF-8',
1734 'wal_et': 'wal_ET.UTF-8',
1735 'wo_sn': 'wo_SN.UTF-8',
1736 'xh': 'xh_ZA.ISO8859-1',
1737 'xh_za': 'xh_ZA.ISO8859-1',
1738 'xh_za.iso88591': 'xh_ZA.ISO8859-1',
1739 'yi': 'yi_US.CP1255',
1740 'yi_us': 'yi_US.CP1255',
1741 'yi_us.cp1255': 'yi_US.CP1255',
1742 'yi_us.microsoftcp1255': 'yi_US.CP1255',
1743 'yo_ng': 'yo_NG.UTF-8',
1744 'yue_hk': 'yue_HK.UTF-8',
1745 'zh': 'zh_CN.eucCN',
1746 'zh_cn': 'zh_CN.gb2312',
1747 'zh_cn.big5': 'zh_TW.big5',
1748 'zh_cn.euc': 'zh_CN.eucCN',
1749 'zh_cn.gb18030': 'zh_CN.gb18030',
1750 'zh_cn.gb2312': 'zh_CN.gb2312',
1751 'zh_cn.gbk': 'zh_CN.gbk',
1752 'zh_hk': 'zh_HK.big5hkscs',
1753 'zh_hk.big5': 'zh_HK.big5',
1754 'zh_hk.big5hk': 'zh_HK.big5hkscs',
1755 'zh_hk.big5hkscs': 'zh_HK.big5hkscs',
1756 'zh_sg': 'zh_SG.GB2312',
1757 'zh_sg.gbk': 'zh_SG.GBK',
1758 'zh_tw': 'zh_TW.big5',
1759 'zh_tw.big5': 'zh_TW.big5',
1760 'zh_tw.euc': 'zh_TW.eucTW',
1761 'zh_tw.euctw': 'zh_TW.eucTW',
1762 'zu': 'zu_ZA.ISO8859-1',
1763 'zu_za': 'zu_ZA.ISO8859-1',
1764 'zu_za.iso88591': 'zu_ZA.ISO8859-1',
1765}
1766
1767#
1768# This maps Windows language identifiers to locale strings.
1769#
1770# This list has been updated from
1771# http://msdn.microsoft.com/library/default.asp?url=/library/en-us/intl/nls_238z.asp
1772# to include every locale up to Windows Vista.
1773#
1774# NOTE: this mapping is incomplete. If your language is missing, please
1775# submit a bug report to the Python bug tracker at http://bugs.python.org/
1776# Make sure you include the missing language identifier and the suggested
1777# locale code.
1778#
1779
1780windows_locale = {
1781 0x0436: "af_ZA", # Afrikaans
1782 0x041c: "sq_AL", # Albanian
1783 0x0484: "gsw_FR",# Alsatian - France
1784 0x045e: "am_ET", # Amharic - Ethiopia
1785 0x0401: "ar_SA", # Arabic - Saudi Arabia
1786 0x0801: "ar_IQ", # Arabic - Iraq
1787 0x0c01: "ar_EG", # Arabic - Egypt
1788 0x1001: "ar_LY", # Arabic - Libya
1789 0x1401: "ar_DZ", # Arabic - Algeria
1790 0x1801: "ar_MA", # Arabic - Morocco
1791 0x1c01: "ar_TN", # Arabic - Tunisia
1792 0x2001: "ar_OM", # Arabic - Oman
1793 0x2401: "ar_YE", # Arabic - Yemen
1794 0x2801: "ar_SY", # Arabic - Syria
1795 0x2c01: "ar_JO", # Arabic - Jordan
1796 0x3001: "ar_LB", # Arabic - Lebanon
1797 0x3401: "ar_KW", # Arabic - Kuwait
1798 0x3801: "ar_AE", # Arabic - United Arab Emirates
1799 0x3c01: "ar_BH", # Arabic - Bahrain
1800 0x4001: "ar_QA", # Arabic - Qatar
1801 0x042b: "hy_AM", # Armenian
1802 0x044d: "as_IN", # Assamese - India
1803 0x042c: "az_AZ", # Azeri - Latin
1804 0x082c: "az_AZ", # Azeri - Cyrillic
1805 0x046d: "ba_RU", # Bashkir
1806 0x042d: "eu_ES", # Basque - Russia
1807 0x0423: "be_BY", # Belarusian
1808 0x0445: "bn_IN", # Begali
1809 0x201a: "bs_BA", # Bosnian - Cyrillic
1810 0x141a: "bs_BA", # Bosnian - Latin
1811 0x047e: "br_FR", # Breton - France
1812 0x0402: "bg_BG", # Bulgarian
1813# 0x0455: "my_MM", # Burmese - Not supported
1814 0x0403: "ca_ES", # Catalan
1815 0x0004: "zh_CHS",# Chinese - Simplified
1816 0x0404: "zh_TW", # Chinese - Taiwan
1817 0x0804: "zh_CN", # Chinese - PRC
1818 0x0c04: "zh_HK", # Chinese - Hong Kong S.A.R.
1819 0x1004: "zh_SG", # Chinese - Singapore
1820 0x1404: "zh_MO", # Chinese - Macao S.A.R.
1821 0x7c04: "zh_CHT",# Chinese - Traditional
1822 0x0483: "co_FR", # Corsican - France
1823 0x041a: "hr_HR", # Croatian
1824 0x101a: "hr_BA", # Croatian - Bosnia
1825 0x0405: "cs_CZ", # Czech
1826 0x0406: "da_DK", # Danish
1827 0x048c: "gbz_AF",# Dari - Afghanistan
1828 0x0465: "div_MV",# Divehi - Maldives
1829 0x0413: "nl_NL", # Dutch - The Netherlands
1830 0x0813: "nl_BE", # Dutch - Belgium
1831 0x0409: "en_US", # English - United States
1832 0x0809: "en_GB", # English - United Kingdom
1833 0x0c09: "en_AU", # English - Australia
1834 0x1009: "en_CA", # English - Canada
1835 0x1409: "en_NZ", # English - New Zealand
1836 0x1809: "en_IE", # English - Ireland
1837 0x1c09: "en_ZA", # English - South Africa
1838 0x2009: "en_JA", # English - Jamaica
1839 0x2409: "en_CB", # English - Caribbean
1840 0x2809: "en_BZ", # English - Belize
1841 0x2c09: "en_TT", # English - Trinidad
1842 0x3009: "en_ZW", # English - Zimbabwe
1843 0x3409: "en_PH", # English - Philippines
1844 0x4009: "en_IN", # English - India
1845 0x4409: "en_MY", # English - Malaysia
1846 0x4809: "en_IN", # English - Singapore
1847 0x0425: "et_EE", # Estonian
1848 0x0438: "fo_FO", # Faroese
1849 0x0464: "fil_PH",# Filipino
1850 0x040b: "fi_FI", # Finnish
1851 0x040c: "fr_FR", # French - France
1852 0x080c: "fr_BE", # French - Belgium
1853 0x0c0c: "fr_CA", # French - Canada
1854 0x100c: "fr_CH", # French - Switzerland
1855 0x140c: "fr_LU", # French - Luxembourg
1856 0x180c: "fr_MC", # French - Monaco
1857 0x0462: "fy_NL", # Frisian - Netherlands
1858 0x0456: "gl_ES", # Galician
1859 0x0437: "ka_GE", # Georgian
1860 0x0407: "de_DE", # German - Germany
1861 0x0807: "de_CH", # German - Switzerland
1862 0x0c07: "de_AT", # German - Austria
1863 0x1007: "de_LU", # German - Luxembourg
1864 0x1407: "de_LI", # German - Liechtenstein
1865 0x0408: "el_GR", # Greek
1866 0x046f: "kl_GL", # Greenlandic - Greenland
1867 0x0447: "gu_IN", # Gujarati
1868 0x0468: "ha_NG", # Hausa - Latin
1869 0x040d: "he_IL", # Hebrew
1870 0x0439: "hi_IN", # Hindi
1871 0x040e: "hu_HU", # Hungarian
1872 0x040f: "is_IS", # Icelandic
1873 0x0421: "id_ID", # Indonesian
1874 0x045d: "iu_CA", # Inuktitut - Syllabics
1875 0x085d: "iu_CA", # Inuktitut - Latin
1876 0x083c: "ga_IE", # Irish - Ireland
1877 0x0410: "it_IT", # Italian - Italy
1878 0x0810: "it_CH", # Italian - Switzerland
1879 0x0411: "ja_JP", # Japanese
1880 0x044b: "kn_IN", # Kannada - India
1881 0x043f: "kk_KZ", # Kazakh
1882 0x0453: "kh_KH", # Khmer - Cambodia
1883 0x0486: "qut_GT",# K'iche - Guatemala
1884 0x0487: "rw_RW", # Kinyarwanda - Rwanda
1885 0x0457: "kok_IN",# Konkani
1886 0x0412: "ko_KR", # Korean
1887 0x0440: "ky_KG", # Kyrgyz
1888 0x0454: "lo_LA", # Lao - Lao PDR
1889 0x0426: "lv_LV", # Latvian
1890 0x0427: "lt_LT", # Lithuanian
1891 0x082e: "dsb_DE",# Lower Sorbian - Germany
1892 0x046e: "lb_LU", # Luxembourgish
1893 0x042f: "mk_MK", # FYROM Macedonian
1894 0x043e: "ms_MY", # Malay - Malaysia
1895 0x083e: "ms_BN", # Malay - Brunei Darussalam
1896 0x044c: "ml_IN", # Malayalam - India
1897 0x043a: "mt_MT", # Maltese
1898 0x0481: "mi_NZ", # Maori
1899 0x047a: "arn_CL",# Mapudungun
1900 0x044e: "mr_IN", # Marathi
1901 0x047c: "moh_CA",# Mohawk - Canada
1902 0x0450: "mn_MN", # Mongolian - Cyrillic
1903 0x0850: "mn_CN", # Mongolian - PRC
1904 0x0461: "ne_NP", # Nepali
1905 0x0414: "nb_NO", # Norwegian - Bokmal
1906 0x0814: "nn_NO", # Norwegian - Nynorsk
1907 0x0482: "oc_FR", # Occitan - France
1908 0x0448: "or_IN", # Oriya - India
1909 0x0463: "ps_AF", # Pashto - Afghanistan
1910 0x0429: "fa_IR", # Persian
1911 0x0415: "pl_PL", # Polish
1912 0x0416: "pt_BR", # Portuguese - Brazil
1913 0x0816: "pt_PT", # Portuguese - Portugal
1914 0x0446: "pa_IN", # Punjabi
1915 0x046b: "quz_BO",# Quechua (Bolivia)
1916 0x086b: "quz_EC",# Quechua (Ecuador)
1917 0x0c6b: "quz_PE",# Quechua (Peru)
1918 0x0418: "ro_RO", # Romanian - Romania
1919 0x0417: "rm_CH", # Romansh
1920 0x0419: "ru_RU", # Russian
1921 0x243b: "smn_FI",# Sami Finland
1922 0x103b: "smj_NO",# Sami Norway
1923 0x143b: "smj_SE",# Sami Sweden
1924 0x043b: "se_NO", # Sami Northern Norway
1925 0x083b: "se_SE", # Sami Northern Sweden
1926 0x0c3b: "se_FI", # Sami Northern Finland
1927 0x203b: "sms_FI",# Sami Skolt
1928 0x183b: "sma_NO",# Sami Southern Norway
1929 0x1c3b: "sma_SE",# Sami Southern Sweden
1930 0x044f: "sa_IN", # Sanskrit
1931 0x0c1a: "sr_SP", # Serbian - Cyrillic
1932 0x1c1a: "sr_BA", # Serbian - Bosnia Cyrillic
1933 0x081a: "sr_SP", # Serbian - Latin
1934 0x181a: "sr_BA", # Serbian - Bosnia Latin
1935 0x045b: "si_LK", # Sinhala - Sri Lanka
1936 0x046c: "ns_ZA", # Northern Sotho
1937 0x0432: "tn_ZA", # Setswana - Southern Africa
1938 0x041b: "sk_SK", # Slovak
1939 0x0424: "sl_SI", # Slovenian
1940 0x040a: "es_ES", # Spanish - Spain
1941 0x080a: "es_MX", # Spanish - Mexico
1942 0x0c0a: "es_ES", # Spanish - Spain (Modern)
1943 0x100a: "es_GT", # Spanish - Guatemala
1944 0x140a: "es_CR", # Spanish - Costa Rica
1945 0x180a: "es_PA", # Spanish - Panama
1946 0x1c0a: "es_DO", # Spanish - Dominican Republic
1947 0x200a: "es_VE", # Spanish - Venezuela
1948 0x240a: "es_CO", # Spanish - Colombia
1949 0x280a: "es_PE", # Spanish - Peru
1950 0x2c0a: "es_AR", # Spanish - Argentina
1951 0x300a: "es_EC", # Spanish - Ecuador
1952 0x340a: "es_CL", # Spanish - Chile
1953 0x380a: "es_UR", # Spanish - Uruguay
1954 0x3c0a: "es_PY", # Spanish - Paraguay
1955 0x400a: "es_BO", # Spanish - Bolivia
1956 0x440a: "es_SV", # Spanish - El Salvador
1957 0x480a: "es_HN", # Spanish - Honduras
1958 0x4c0a: "es_NI", # Spanish - Nicaragua
1959 0x500a: "es_PR", # Spanish - Puerto Rico
1960 0x540a: "es_US", # Spanish - United States
1961# 0x0430: "", # Sutu - Not supported
1962 0x0441: "sw_KE", # Swahili
1963 0x041d: "sv_SE", # Swedish - Sweden
1964 0x081d: "sv_FI", # Swedish - Finland
1965 0x045a: "syr_SY",# Syriac
1966 0x0428: "tg_TJ", # Tajik - Cyrillic
1967 0x085f: "tmz_DZ",# Tamazight - Latin
1968 0x0449: "ta_IN", # Tamil
1969 0x0444: "tt_RU", # Tatar
1970 0x044a: "te_IN", # Telugu
1971 0x041e: "th_TH", # Thai
1972 0x0851: "bo_BT", # Tibetan - Bhutan
1973 0x0451: "bo_CN", # Tibetan - PRC
1974 0x041f: "tr_TR", # Turkish
1975 0x0442: "tk_TM", # Turkmen - Cyrillic
1976 0x0480: "ug_CN", # Uighur - Arabic
1977 0x0422: "uk_UA", # Ukrainian
1978 0x042e: "wen_DE",# Upper Sorbian - Germany
1979 0x0420: "ur_PK", # Urdu
1980 0x0820: "ur_IN", # Urdu - India
1981 0x0443: "uz_UZ", # Uzbek - Latin
1982 0x0843: "uz_UZ", # Uzbek - Cyrillic
1983 0x042a: "vi_VN", # Vietnamese
1984 0x0452: "cy_GB", # Welsh
1985 0x0488: "wo_SN", # Wolof - Senegal
1986 0x0434: "xh_ZA", # Xhosa - South Africa
1987 0x0485: "sah_RU",# Yakut - Cyrillic
1988 0x0478: "ii_CN", # Yi - PRC
1989 0x046a: "yo_NG", # Yoruba - Nigeria
1990 0x0435: "zu_ZA", # Zulu
1991}
1992
1993def _print_locale():
1994
1995 """ Test function.
1996 """
1997 categories = {}
1998 def _init_categories(categories=categories):
1999 for k,v in globals().items():
2000 if k[:3] == 'LC_':
2001 categories[k] = v
2002 _init_categories()
2003 del categories['LC_ALL']
2004
2005 print('Locale defaults as determined by getdefaultlocale():')
2006 print('-'*72)
2007 lang, enc = getdefaultlocale()
2008 print('Language: ', lang or '(undefined)')
2009 print('Encoding: ', enc or '(undefined)')
2010 print()
2011
2012 print('Locale settings on startup:')
2013 print('-'*72)
2014 for name,category in categories.items():
2015 print(name, '...')
2016 lang, enc = getlocale(category)
2017 print(' Language: ', lang or '(undefined)')
2018 print(' Encoding: ', enc or '(undefined)')
2019 print()
2020
2021 print()
2022 print('Locale settings after calling resetlocale():')
2023 print('-'*72)
2024 resetlocale()
2025 for name,category in categories.items():
2026 print(name, '...')
2027 lang, enc = getlocale(category)
2028 print(' Language: ', lang or '(undefined)')
2029 print(' Encoding: ', enc or '(undefined)')
2030 print()
2031
2032 try:
2033 setlocale(LC_ALL, "")
2034 except:
2035 print('NOTE:')
2036 print('setlocale(LC_ALL, "") does not support the default locale')
2037 print('given in the OS environment variables.')
2038 else:
2039 print()
2040 print('Locale settings after calling setlocale(LC_ALL, ""):')
2041 print('-'*72)
2042 for name,category in categories.items():
2043 print(name, '...')
2044 lang, enc = getlocale(category)
2045 print(' Language: ', lang or '(undefined)')
2046 print(' Encoding: ', enc or '(undefined)')
2047 print()
2048
2049###
2050
2051try:
2052 LC_MESSAGES
2053except NameError:
2054 pass
2055else:
2056 __all__.append("LC_MESSAGES")
2057
2058if __name__=='__main__':
2059 print('Locale aliasing:')
2060 print()
2061 _print_locale()
2062 print()
2063 print('Number formatting:')
2064 print()
2065 _test()