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