1"""
2the locale utils used by salt
3"""
4
5
6import sys
7
8from salt.utils.decorators import memoize as real_memoize
9
10
11@real_memoize
12def get_encodings():
13    """
14    return a list of string encodings to try
15    """
16    encodings = [__salt_system_encoding__]
17
18    try:
19        sys_enc = sys.getdefaultencoding()
20    except ValueError:  # system encoding is nonstandard or malformed
21        sys_enc = None
22    if sys_enc and sys_enc not in encodings:
23        encodings.append(sys_enc)
24
25    for enc in ["utf-8", "latin-1"]:
26        if enc not in encodings:
27            encodings.append(enc)
28
29    return encodings
30
31
32def split_locale(loc):
33    """
34    Split a locale specifier.  The general format is
35
36    language[_territory][.codeset][@modifier] [charmap]
37
38    For example:
39
40    ca_ES.UTF-8@valencia UTF-8
41    """
42
43    def split(st, char):
44        """
45        Split a string `st` once by `char`; always return a two-element list
46        even if the second element is empty.
47        """
48        split_st = st.split(char, 1)
49        if len(split_st) == 1:
50            split_st.append("")
51        return split_st
52
53    comps = {}
54    work_st, comps["charmap"] = split(loc, " ")
55    work_st, comps["modifier"] = split(work_st, "@")
56    work_st, comps["codeset"] = split(work_st, ".")
57    comps["language"], comps["territory"] = split(work_st, "_")
58    return comps
59
60
61def join_locale(comps):
62    """
63    Join a locale specifier split in the format returned by split_locale.
64    """
65    loc = comps["language"]
66    if comps.get("territory"):
67        loc += "_" + comps["territory"]
68    if comps.get("codeset"):
69        loc += "." + comps["codeset"]
70    if comps.get("modifier"):
71        loc += "@" + comps["modifier"]
72    if comps.get("charmap"):
73        loc += " " + comps["charmap"]
74    return loc
75
76
77def normalize_locale(loc):
78    """
79    Format a locale specifier according to the format returned by `locale -a`.
80    """
81    comps = split_locale(loc)
82    comps["territory"] = comps["territory"].upper()
83    comps["codeset"] = comps["codeset"].lower().replace("-", "")
84    comps["charmap"] = ""
85    return join_locale(comps)
86