Changeset 59163


Ignore:
Timestamp:
Mar 2, 2014, 6:00:52 AM (10 years ago)
Author:
marisn
Message:

A different and more correct language overriding approach

File:
1 edited

Legend:

Unmodified
Added
Removed
  • grass/trunk/lib/init/grass.py

    r59106 r59163  
    494494
    495495def grass_intro():
    496     intro = r"""
     496    intro = _(r"""
    497497WELCOME TO GRASS %s
    498498
     
    506506   3) heck the GRASS GIS web pages for supporting mailing lists and more:
    507507      http://grass.osgeo.org
    508 """ % grass_version
     508""") % grass_version
    509509    sys.stderr.write(intro)
    510510
     
    754754
    755755def set_language():
     756    # This function is used to override system default language and locale
     757    # Such override can be requested only from wxGUI
     758    # An override if user has provided correct environmental variables as
     759    # LC_MESSAGES or LANG is not necessary.
     760    # Unfortunately currently a working solution for Windows is lacking
     761    # thus it always on Vista and XP will print an error.
     762    # See discussion for Windows not following its own documentation and
     763    # not accepting ISO codes as valid locale identifiers http://bugs.python.org/issue10466
    756764    import locale
    757 
    758     language = os.getenv('LANG')
    759     if not language:
     765   
     766    # Override value is stored in wxGUI preferences file.
     767    # As it's the only thing required, we'll just grep it out.
     768    try:
     769        fd = open(os.path.join(grass_config_dir, 'wx'), 'r')
     770    except:
     771        # Language override has not been defined or is inaccessible
    760772        return
    761 
    762     language = language.split('.')[0] # Split off ignored .encoding part if present
    763     orig_language = language
     773    for line in fd:
     774        if re.search('^language', line):
     775            line = line.rstrip('%s' % os.linesep)
     776            language = ''.join(line.split(';')[-1:])
     777            break
     778    if language == 'None':
     779        # Language override is disabled (system language specified)
     780        return
     781   
     782    warning("A language override has been requested. Trying to switch GRASS into '%s'..." % language)
     783   
     784    # Even if setting locale will fail, let's set LANG in a hope,
     785    # that UI will use it GRASS texts will be in selected language,
     786    # system messages (i.e. OK, Cancel etc.) - in system default
     787    # language
     788    os.environ['LANGUAGE'] = language
     789    os.environ['LANG'] = language
     790   
    764791    try:
    765792        locale.setlocale(locale.LC_ALL, language)
    766793    except locale.Error, e:
    767         if sys.platform != 'win32': # Don't try on Windows, it will probably not work
    768             # sys.stderr.write("Failed to set LC_ALL to %s (%s)\n" % (language, e))
     794        try:
     795            # Locale lang.encoding might be missing. Let's try
     796            # UTF-8 encoding before giving up as on Linux systems
     797            # lang.UTF-8 locales are more common than legacy
     798            # ISO-8859 ones.
     799            language = locale.normalize('%s.UTF-8' % (language))
     800            locale.setlocale(locale.LC_ALL, language)
     801        except locale.Error, e:
     802            # The last attempt...
    769803            try:
    770                 # Locale lang.encoding might be missing. Let's try
    771                 # UTF-8 encoding before giving up as on Linux systems
    772                 # lang.UTF-8 locales are more common than legacy
    773                 # ISO-8859 ones.
    774                 language = locale.normalize('%s.UTF-8' % (language))
     804                language = locale.normalize('%s.%s' % (language, locale.getpreferredencoding()))
    775805                locale.setlocale(locale.LC_ALL, language)
    776806            except locale.Error, e:
    777                 # If we got so far, provided locale is not supported
     807                # If we got so far, attempts to set up language and locale have failed
    778808                # on this system
    779                 sys.stderr.write("Failed to set LC_ALL to %s (%s)\n" % (language, e))
    780                 ### locale.getdefaultlocale() is probably related to gettext?
    781                 # try:
    782                 #     default_locale = locale.getdefaultlocale()
    783                 # except:
    784                 #     default_locale = None
    785                 # if default_locale and default_locale[0]:
    786                 #     language = default_locale[0]
    787                 # else:
    788                 language = 'C'
     809                sys.stderr.write("Failed to enforce user specified language '%s' with error: '%s'\n" % (language, e))
     810                sys.stderr.write("A LANGUAGE environmental variable has been set.\nPart of messages will be displayed in the requested language.\n")
     811                return
    789812
    790813    # Set up environment for subprocesses
     
    801824        del os.environ['LC_ALL']  # Remove LC_ALL to not override LC_NUMERIC
    802825
    803     # Even if setting locale has failed, let's set LANG in a hope,
    804     # that UI will use it GRASS texts will be in selected language,
    805     # system messages (i.e. OK, Cancel etc.) - in system default
    806     # language
    807     os.environ['LANGUAGE'] = orig_language
    808     os.environ['LANG'] = orig_language
    809 
    810     # Calling gettext.install twice seems to allow to see also
    811     # localized startup messages Black magic ;)
     826    # From now on enforce the new language
    812827    gettext.install('grasslibs', os.path.join(gisbase, 'locale'), unicode=True)
    813828
     
    12581273parse_cmdline()
    12591274
     1275# Set language
     1276# This has to be called before any _() function call!
     1277# Subsequent functions are using _() calls and
     1278# thus must be called only after Language has been set.
     1279set_language()
     1280
    12601281# Create the temporary directory and session grassrc file
    12611282create_tmp()
     
    13201341    else:
    13211342        non_interactive(args[0])
    1322 
    1323 # Set language
    1324 set_language()
    13251343
    13261344# User selects LOCATION and MAPSET if not set
Note: See TracChangeset for help on using the changeset viewer.