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