Use gettext algorithm to determine locale for activity.linfo

When activity bundles are loaded, the activity name and summary are
pulled from an activity.linfo file that is associated with
locale. However, sometimes locale, which uses $LANG has been
superceded by $LANGUAGE as set in
extensions/cpsection/languages/model.py. This patch uses the same
algorithm as gettext.py to find activity.linfo

This problem is seen on the .AU systems which use en_AU for locale and
en_GB for LANGUAGE.
This commit is contained in:
Walter Bender 2013-04-15 08:42:42 -04:00
parent 9ef961cc94
commit b4c0b2258f

View File

@ -21,7 +21,7 @@ UNSTABLE.
""" """
from ConfigParser import ConfigParser from ConfigParser import ConfigParser
import locale from locale import normalize
import os import os
import shutil import shutil
import tempfile import tempfile
@ -34,6 +34,52 @@ from sugar3.bundle.bundleversion import NormalizedVersion
from sugar3.bundle.bundleversion import InvalidVersionError 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): class ActivityBundle(Bundle):
"""A Sugar activity bundle """A Sugar activity bundle
@ -133,20 +179,27 @@ class ActivityBundle(Bundle):
self._summary = cp.get(section, 'summary') self._summary = cp.get(section, 'summary')
def _get_linfo_file(self): def _get_linfo_file(self):
lang = locale.getdefaultlocale()[0] # Using method from gettext.py, first find languages from environ
if not lang: languages = []
return None for envar in ('LANGUAGE', 'LC_ALL', 'LC_MESSAGES', 'LANG'):
val = os.environ.get(envar)
if val:
languages = val.split(':')
break
linfo_path = os.path.join('locale', lang, 'activity.linfo') # Next, normalize and expand the languages
linfo_file = self.get_file(linfo_path) nelangs = []
if linfo_file is not None: for lang in languages:
return linfo_file for nelang in _expand_lang(lang):
if nelang not in nelangs:
linfo_path = os.path.join('locale', lang[:2], 'activity.linfo') nelangs.append(nelang)
linfo_file = self.get_file(linfo_path)
if linfo_file is not None:
return linfo_file
# 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 return None
def _parse_linfo(self, linfo_file): def _parse_linfo(self, linfo_file):