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