Test script. Add NAME to backends. Some smarter system locale handling.
[python-collate.git] / collate / __init__.py
index 1d48178..6ce1114 100644 (file)
@@ -1,5 +1,8 @@
 import locale
 
+if locale.getlocale()[0] is None:
+    locale.setlocale(locale.LC_COLLATE, '')
+
 import collate.errors
 
 try:
@@ -10,30 +13,43 @@ except ImportError:
     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)
@@ -41,4 +57,11 @@ def 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])