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