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.
master
Walter Bender 11 years ago
parent 9ef961cc94
commit b4c0b2258f

@ -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)
linfo_path = os.path.join('locale', lang, 'activity.linfo') if val:
linfo_file = self.get_file(linfo_path) languages = val.split(':')
if linfo_file is not None: break
return linfo_file
# Next, normalize and expand the languages
linfo_path = os.path.join('locale', lang[:2], 'activity.linfo') nelangs = []
linfo_file = self.get_file(linfo_path) for lang in languages:
if linfo_file is not None: for nelang in _expand_lang(lang):
return linfo_file 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 return None
def _parse_linfo(self, linfo_file): def _parse_linfo(self, linfo_file):

Loading…
Cancel
Save