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