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