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