Test script. Add NAME to backends. Some smarter system locale handling.
[python-collate.git] / collate / syslocale / __init__.py
1 import locale
2
3 import collate.errors
4 import collate._abcollator
5
6 class Collator(collate._abcollator.Collator):
7 def __init__(self, locale_code):
8 default = locale.getdefaultlocale()[0]
9 for locale in [locale_code, default]:
10 try:
11 locale.setlocale(locale.LC_COLLATE, locale_code)
12 except locale.Error as err:
13 pass
14 else:
15 break
16 else:
17 raise collate.errors.InvalidLocaleError("no locale found")
18 self.locale = locale.getlocale()[0]
19 try:
20 self.__encoding = locale_code.split(".")[1]
21 except IndexError:
22 self.__encoding = locale_code.split(locale.getpreferredencoding())
23
24 def key(self, string):
25 try:
26 return locale.strxfrm(string)
27 except UnicodeEncodeError:
28 return locale.strxfrm(string.encode(self.__encoding, "replace"))
29
30 def cmp(self, string1, string2):
31 if isinstance(string1, str):
32 string1 = string1.decode(self.__encoding, "replace")
33 if isinstance(string2, str):
34 string2 = string2.decode(self.__encoding, "replace")
35 return locale.strcoll(string1, string2)
36