import locale
+if locale.getlocale()[0] is None:
+ locale.setlocale(locale.LC_COLLATE, '')
+
import collate.errors
try:
pass
collator = None
+preferred_locale = None
+
+def _get_collator(backend, locale_code):
+ for code in [locale_code,
+ locale_code.split("_")[0],
+ locale.getlocale(locale.LC_COLLATE)[0],
+ locale.getlocale(locale.LC_COLLATE)[0].split("_")[0],
+ locale.getdefaultlocale()[0],
+ locale.getdefaultlocale()[0].split("_")[0],
+ None]:
+ try:
+ return default.Collator(code)
+ except collate.errors.InvalidLocaleError:
+ pass
def set_locale(locale_code):
global collator
+ global preferred_locale
+ preferred_locale = locale_code
if collator is None or collator.locale != locale_code:
- for code in [locale_code,
- locale_code.split("_")[0],
- locale.getdefaultlocale()[0],
- locale.getdefaultlocale()[0].split("_")[0],
- None]:
- try:
- collator = default.Collator(code)
- except collate.errors.InvalidLocaleError:
- pass
- else:
- break
+ c = _get_collator(default, locale_code)
+ if c is not None:
+ collator = c
else:
raise collate.errors.InvalidLocaleError(locale_code)
-def get_locale():
- return collator.locale
-
def set_backend(backend):
- pass
+ global collator
+ global default
+
+ c = _get_collator(backend, preferred_locale)
+ if c is not None:
+ collator = c
+ default = backend
+ else:
+ raise collate.errors.InvalidLocaleError(locale_code)
def key(string):
return collator.key(string)
def cmp(string1, string2):
return collator.cmp(string1, string2)
-set_locale(locale.getdefaultlocale()[0])
+try:
+ set_locale(locale.getlocale()[0])
+except collate.errors.InvalidLocaleError:
+ # There's no way this should fail unless the C locale system is
+ # fucked or missing all data.
+ import collator.syslocale
+ set_backend(collator.syslocale)
+ set_locale(locale.getlocale(locale.LC_COLLATE)[0])