Merge pull request #9 from walterbender/fix-locale-4
Use gettext algorithm to determine locale for activity.linfo
This commit is contained in:
commit
c78ebfd4d3
@ -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):
|
||||||
|
Loading…
Reference in New Issue
Block a user