Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAjay Garg <ajay@activitycentral.com>2013-04-16 10:10:20 (GMT)
committer Ajay Garg <ajay@activitycentral.com>2013-04-16 10:10:20 (GMT)
commitc6b6adc5d99b17241e51f3200499482597934b27 (patch)
tree5d45a0c0d84d57f4cd943bb1ccfa477b3946ac62
parent42d774148713d9c57b0b59931065d8a50fe103db (diff)
Merging https://github.com/walterbender/sugar-toolkit-gtk3/commit/b4c0b2258f79685f301d5998d57c103b01db6fe9
-rw-r--r--src/sugar3/bundle/activitybundle.py85
1 files changed, 68 insertions, 17 deletions
diff --git a/src/sugar3/bundle/activitybundle.py b/src/sugar3/bundle/activitybundle.py
index 53c9da6..8126074 100644
--- a/src/sugar3/bundle/activitybundle.py
+++ b/src/sugar3/bundle/activitybundle.py
@@ -21,21 +21,65 @@ UNSTABLE.
"""
from ConfigParser import ConfigParser
-import locale
+from locale import normalize
import os
import shutil
import tempfile
import logging
-import warnings
from sugar3 import env
-from sugar3 import util
from sugar3.bundle.bundle import Bundle, \
MalformedBundleException, NotInstalledException
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
@@ -135,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):