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