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