diff options
author | Daniel Narvaez <dwnarvaez@gmail.com> | 2013-04-15 12:47:15 (GMT) |
---|---|---|
committer | Daniel Narvaez <dwnarvaez@gmail.com> | 2013-04-15 12:47:15 (GMT) |
commit | c78ebfd4d3a2dc07131f595966b3d0e57a8a82be (patch) | |
tree | 40a8c437326a5b59dcdf401a8343eeb0205988c7 | |
parent | 9ef961cc94edb912aea58300f3ad8c387bf04132 (diff) | |
parent | b4c0b2258f79685f301d5998d57c103b01db6fe9 (diff) |
Merge pull request #9 from walterbender/fix-locale-4
Use gettext algorithm to determine locale for activity.linfo
-rw-r--r-- | src/sugar3/bundle/activitybundle.py | 83 |
1 files changed, 68 insertions, 15 deletions
diff --git a/src/sugar3/bundle/activitybundle.py b/src/sugar3/bundle/activitybundle.py index 3e14ea0..8126074 100644 --- a/src/sugar3/bundle/activitybundle.py +++ b/src/sugar3/bundle/activitybundle.py @@ -21,7 +21,7 @@ UNSTABLE. """ from ConfigParser import ConfigParser -import locale +from locale import normalize import os import shutil import tempfile @@ -34,6 +34,52 @@ from sugar3.bundle.bundleversion import NormalizedVersion from sugar3.bundle.bundleversion import InvalidVersionError +def _expand_lang(locale): + # Private method from gettext.py + locale = normalize(locale) + COMPONENT_CODESET = 1 << 0 + COMPONENT_TERRITORY = 1 << 1 + COMPONENT_MODIFIER = 1 << 2 + + # split up the locale into its base components + mask = 0 + pos = locale.find('@') + if pos >= 0: + modifier = locale[pos:] + locale = locale[:pos] + mask |= COMPONENT_MODIFIER + else: + modifier = '' + + pos = locale.find('.') + if pos >= 0: + codeset = locale[pos:] + locale = locale[:pos] + mask |= COMPONENT_CODESET + else: + codeset = '' + + pos = locale.find('_') + if pos >= 0: + territory = locale[pos:] + locale = locale[:pos] + mask |= COMPONENT_TERRITORY + else: + territory = '' + + language = locale + ret = [] + for i in range(mask + 1): + if not (i & ~mask): # if all components for this combo exist ... + val = language + if i & COMPONENT_TERRITORY: val += territory + if i & COMPONENT_CODESET: val += codeset + if i & COMPONENT_MODIFIER: val += modifier + ret.append(val) + ret.reverse() + return ret + + class ActivityBundle(Bundle): """A Sugar activity bundle @@ -133,20 +179,27 @@ class ActivityBundle(Bundle): self._summary = cp.get(section, 'summary') def _get_linfo_file(self): - lang = locale.getdefaultlocale()[0] - if not lang: - return None - - linfo_path = os.path.join('locale', lang, 'activity.linfo') - linfo_file = self.get_file(linfo_path) - if linfo_file is not None: - return linfo_file - - linfo_path = os.path.join('locale', lang[:2], 'activity.linfo') - linfo_file = self.get_file(linfo_path) - if linfo_file is not None: - return linfo_file - + # Using method from gettext.py, first find languages from environ + languages = [] + for envar in ('LANGUAGE', 'LC_ALL', 'LC_MESSAGES', 'LANG'): + val = os.environ.get(envar) + if val: + languages = val.split(':') + break + + # Next, normalize and expand the languages + nelangs = [] + for lang in languages: + for nelang in _expand_lang(lang): + if nelang not in nelangs: + nelangs.append(nelang) + + # Finally, select a language + for lang in nelangs: + linfo_path = os.path.join('locale', lang, 'activity.linfo') + linfo_file = self.get_file(linfo_path) + if linfo_file is not None: + return linfo_file return None def _parse_linfo(self, linfo_file): |