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