X-Git-Url: https://git.korewanetadesu.com/?p=python-collate.git;a=blobdiff_plain;f=collate%2F__init__.py;h=6ce11148d836cba02f0d652df60832fff0515af7;hp=6d1806a0f0d11cd69a9ee3e4e5c5063eda122463;hb=22570a3c13079d27cfb60110f631b164dbd8b831;hpb=29f1f7e12a4ca6100b00dc0d32e84f82f530bcb4 diff --git a/collate/__init__.py b/collate/__init__.py index 6d1806a..6ce1114 100644 --- a/collate/__init__.py +++ b/collate/__init__.py @@ -1,5 +1,8 @@ import locale +if locale.getlocale()[0] is None: + locale.setlocale(locale.LC_COLLATE, '') + import collate.errors try: @@ -10,31 +13,55 @@ 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, strict=False): +def set_locale(locale_code): global collator + global preferred_locale + preferred_locale = locale_code if collator is None or collator.locale != locale_code: - try: - collator = default.Collator(locale_code, strict) - except collate.errors.InvalidLocaleError: - if strict: - raise - else: - default_locale = locale.getdefaultlocale()[0] - try: - collator = default.Collator(default_locale, strict) - except collate.errors.InvalidLocaleError: - if not collator: - raise - -def get_locale(): - return collator.locale - -def set_backend(backend, strict=False): - pass + c = _get_collator(default, locale_code) + if c is not None: + collator = c + else: + raise collate.errors.InvalidLocaleError(locale_code) + +def set_backend(backend): + 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) -set_locale(locale.getdefaultlocale()[0]) +def cmp(string1, string2): + return collator.cmp(string1, string2) + +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])