6784a978c2b106cbedca95dcec4d4c37d7ad168e
[python-collate.git] / collate / syslocale / __init__.py
1 import sys
2 import locale
3 import collate.errors
4 import collate._abcollator
5
6 class Collator(collate._abcollator.Collator):
7 def __init__(self, locale_code, strict=False):
8 try:
9 self.__encoding = locale_code.split(".")[1]
10 except IndexError:
11 self.__encoding = locale_code.split(sys.getdefaultencoding())
12 try:
13 locale.setlocale(locale.LC_COLLATE, locale_code)
14 except locale.Error as err:
15 if strict:
16 raise collate.errors.InvalidLocaleError(str(err))
17 try:
18 locale.setlocale(
19 locale.LC_COLLATE, locale.getdefaultlocale()[0])
20 except locale.Error as err:
21 raise collate.errors.InvalidLocaleError(str(err))
22 self.locale = locale.getdefaultlocale()[0]
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