6ce11148d836cba02f0d652df60832fff0515af7
[python-collate.git] / collate / __init__.py
1 import locale
2
3 if locale.getlocale()[0] is None:
4 locale.setlocale(locale.LC_COLLATE, '')
5
6 import collate.errors
7
8 try:
9 import collate.syslocale as default
10 import collate.uca as default
11 import collate.icu as default
12 except ImportError:
13 pass
14
15 collator = None
16 preferred_locale = None
17
18 def _get_collator(backend, locale_code):
19 for code in [locale_code,
20 locale_code.split("_")[0],
21 locale.getlocale(locale.LC_COLLATE)[0],
22 locale.getlocale(locale.LC_COLLATE)[0].split("_")[0],
23 locale.getdefaultlocale()[0],
24 locale.getdefaultlocale()[0].split("_")[0],
25 None]:
26 try:
27 return default.Collator(code)
28 except collate.errors.InvalidLocaleError:
29 pass
30
31 def set_locale(locale_code):
32 global collator
33 global preferred_locale
34
35 preferred_locale = locale_code
36 if collator is None or collator.locale != locale_code:
37 c = _get_collator(default, locale_code)
38 if c is not None:
39 collator = c
40 else:
41 raise collate.errors.InvalidLocaleError(locale_code)
42
43 def set_backend(backend):
44 global collator
45 global default
46
47 c = _get_collator(backend, preferred_locale)
48 if c is not None:
49 collator = c
50 default = backend
51 else:
52 raise collate.errors.InvalidLocaleError(locale_code)
53
54 def key(string):
55 return collator.key(string)
56
57 def cmp(string1, string2):
58 return collator.cmp(string1, string2)
59
60 try:
61 set_locale(locale.getlocale()[0])
62 except collate.errors.InvalidLocaleError:
63 # There's no way this should fail unless the C locale system is
64 # fucked or missing all data.
65 import collator.syslocale
66 set_backend(collator.syslocale)
67 set_locale(locale.getlocale(locale.LC_COLLATE)[0])