Просмотр исходного кода

Better support of system unsupported locales

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@52597 15284696-431f-4ddb-bdfa-cd5b030d7da7
Maris Nartiss 12 лет назад
Родитель
Сommit
a8282f152a
1 измененных файлов с 21 добавлено и 6 удалено
  1. 21 6
      lib/init/grass.py

+ 21 - 6
lib/init/grass.py

@@ -653,25 +653,40 @@ def set_env_from_gisrc():
     language = kv.get('LANG')
     if language:
         language = language.split('.')[0] # Split off ignored .encoding part if present
+        orig_language = language
         try:
-            locale.setlocale(locale.LC_MESSAGES, language)
+            locale.setlocale(locale.LC_ALL, language)
         except:
             try:
                 # Locale lang.encoding might be missing. Let's try UTF-8 encoding before giving up
                 # as on Linux systems lang.UTF-8 locales are more common than legacy ISO-8859 ones.
                 language = locale.normalize('%s.UTF-8' % language)
-                locale.setlocale(locale.LC_MESSAGES, language)
+                locale.setlocale(locale.LC_ALL, language)
             except:
                 # If we got so far, provided locale is not supported on this system
-                print "Failed to set LC_MESSAGES to %s as defined by g.gisenv LANG parameter" % language
+                print "Failed to set LC_ALL to %s" % language
                 default_locale = locale.getdefaultlocale()
                 if default_locale[0]:
                     language = default_locale[0]
                 else:
                     language = 'C'
-        os.environ['LANGUAGE'] = language
-        os.environ['LANG'] = language
-        os.environ['LC_MESSAGES'] = language
+        
+        # Set up environment for subprocesses
+        for lc in ('LC_CTYPE', 'LC_MESSAGES', 'LC_TIME', 'LC_COLLATE', 'LC_MONETARY', 'LC_PAPER', 'LC_NAME', 'LC_ADDRESS', 'LC_TELEPHONE', 'LC_MEASUREMENT', 'LC_IDENTIFICATION'):
+            os.environ[lc] = language
+        
+        # Some code in GRASS might not like other decimal separators than .
+        # Other potential sources for problems are: LC_TIME LC_CTYPE
+        locale.setlocale(locale.LC_NUMERIC, 'C')
+        os.environ['LC_NUMERIC'] = 'C'
+        if os.getenv('LC_ALL'):
+            del os.environ['LC_ALL'] # Remove LC_ALL to not override LC_NUMERIC
+        
+        # Even if setting locale has failed, let's set LANG in a hope, that UI will use it
+        # GRASS texts will be in selected language, system messages (i.e. OK, Cancel etc.) - in system default language
+        os.environ['LANGUAGE'] = orig_language
+        os.environ['LANG'] = orig_language
+        
         # Calling gettext.install twice seems to allow to see also localized startup messages
         # Black magic ;)
         gettext.install('grasslibs', os.path.join(gisbase, 'locale'), unicode = True)