代码之家  ›  专栏  ›  技术社区  ›  pojo

OSX上的locale.getlocale()问题

  •  1
  • pojo  · 技术社区  · 15 年前

    我需要让系统语言环境做很多事情,最终我想用gettext翻译我的应用程序。我打算在Linux和OSX上发布它,但在OSX雪豹上遇到了问题:

    $ python
    Python 2.5.2 (r252:60911, Jan  4 2009, 17:40:26) 
    [GCC 4.3.2] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import locale
    >>> locale.setlocale(locale.LC_ALL, '')
    'sv_SE.UTF-8'
    >>> locale.getlocale()
    ('sv_SE', 'UTF8')
    
    $ python
    Python 2.6.1 (r261:67515, Jul  7 2009, 23:51:51) 
    [GCC 4.2.1 (Apple Inc. build 5646)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import locale
    >>> locale.setlocale(locale.LC_ALL, '')
    'C'
    >>> locale.getlocale()
    (None, None)
    

    LANG="sv_SE.UTF-8" python 相反,可以很好地检测区域设置。但不应该 locale.getlocale() LANG , LC_ALL 或者任何环境变量。

    产量 locale 命令:

    $ locale
    LANG=
    LC_COLLATE="C"
    LC_CTYPE="C"
    LC_MESSAGES="C"
    LC_MONETARY="C"
    LC_NUMERIC="C"
    LC_TIME="C"
    LC_ALL=
    
    5 回复  |  直到 14 年前
        1
  •  3
  •   Anand Chitipothu    15 年前

    LC_ALL .

    $ export LC_ALL=C
    $ python
    Python 2.5.1 (r251:54863, Feb  6 2009, 19:02:12) 
    [GCC 4.0.1 (Apple Inc. build 5465)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import locale
    >>> locale.getlocale()
    (None, None)
    >>> locale.setlocale(locale.LC_ALL, "")
    'C'
    >>> locale.getlocale()
    (None, None)    
    
    $ export LC_ALL=en_GB.UTF-8
    $ python
    Python 2.5.1 (r251:54863, Feb  6 2009, 19:02:12) 
    [GCC 4.0.1 (Apple Inc. build 5465)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import locale
    >>> locale.getlocale()
    (None, None)
    >>> locale.setlocale(locale.LC_ALL, "")
    'en_GB.UTF-8'
    >>> locale.getlocale()
    ('en_GB', 'UTF8')
    
        2
  •  3
  •   Community Mike Causer    4 年前

    OSX(Smow Leopard 10.6.1)上的奇数

    $ python
    Python 2.6.1 (r261:67515, Jul  7 2009, 23:51:51) 
    [GCC 4.2.1 (Apple Inc. build 5646)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.  
    >>> import locale
    >>> locale.getlocale()
    (None, None)
    >>> locale.setlocale(locale.LC_ALL, '')
    'en_GB.UTF-8'
    >>> locale.getlocale()
    ('en_GB', 'UTF8')
    

    编辑:

    apple python mailing list

    基本上,这取决于在运行时在您的环境中设置了什么(LANG、LANGUAGE、LC_ALL中的一个),我在shell环境中设置了LANG=en_GB.UTF-8

        3
  •  3
  •   Jacob Oscarson    13 年前

    一个可怕的黑客,但我插入了这个:

    import platform
    
    # ...
    
    # XXX horrendous OS X invalid locale hack
    if platform.system() == 'Darwin':
        import locale
        if locale.getlocale()[0] is None:
            locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
    

    mine . 之后,我可以在与我相关的所有操作系统上使用未经修改的shell环境运行我的程序(我的程序确定了以后在处理过程中使用的语言)。

        4
  •  1
  •   Community Mike Causer    7 年前

    从…起 here ~/.profile ~/.bash_profile 文件,以便在启动新会话时正确导出区域设置。

    export LC_ALL=en_US.UTF-8  
    export LANG=en_US.UTF-8
    
        5
  •  1
  •   hmijail    8 年前

    https://bugs.python.org/issue18378 .

    总结一下,Python假设类似GNU的区域设置,并避免出现BSD环境中的差异(如OSX)。UTF8语言环境存在于BSD中,而不是Linux中,因此出现了问题。

    至于解决方案或调试:本地环境变量可以通过Terminal.app进行设置(请参阅Preferences-Profiles-Advanced-International;对于iTerm或其他类似的设置)。因此,可以在终端窗口中查找设置的区域设置环境变量,但在运行打包应用程序时查找未设置的变量。

    对于某些情况(如python 2.7中的Sphinx和OS X中的3.5因“ValueError:unknown locale:UTF-8”而消亡),禁用首选项复选框以设置locale环境变量是解决方案。

    因此,考虑到bug是在Python中出现的,解决方法可能应该在Python程序(如@Jacob Oscarson的回答)或Python调用(通过将区域设置变量设置为适当的值)中完成。

        6
  •  0
  •   kakyo    3 年前

    我的设置

    $ system_profiler SPSoftwareDataType
    Software:
    
        System Software Overview:
    
          System Version: macOS 11.4 (20F71)
          Kernel Version: Darwin 20.5.0
    

    当当前语言处于 System Preferences > Language & Reginon English

    Python 3.9.5 (v3.9.5:0a7dcbdb13, May  3 2021, 13:17:02) 
    [Clang 6.0 (clang-600.0.57)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import locale
    >>> locale.getdefaultlocale()
    (None, 'UTF-8')
    >>> 
    

    以及低级shell命令输出

    $ locale
    LANG=""
    LC_COLLATE="C"
    LC_CTYPE="UTF-8"
    LC_MESSAGES="C"
    LC_MONETARY="C"
    LC_NUMERIC="C"
    LC_TIME="C"
    LC_ALL=
    

    当当前语言为 Chinese, Simplified

    $ py3
    Python 3.9.5 (v3.9.5:0a7dcbdb13, May  3 2021, 13:17:02) 
    [Clang 6.0 (clang-600.0.57)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import locale
    >>> locale.getdefaultlocale()
    ('zh_CN', 'UTF-8')
    >>> 
    

    以及低级shell命令输出

    $ locale
    LANG="zh_CN.UTF-8"
    LC_COLLATE="zh_CN.UTF-8"
    LC_CTYPE="zh_CN.UTF-8"
    LC_MESSAGES="zh_CN.UTF-8"
    LC_MONETARY="zh_CN.UTF-8"
    LC_NUMERIC="zh_CN.UTF-8"
    LC_TIME="zh_CN.UTF-8"
    LC_ALL=
    

    请注意,无论何时在系统首选项中切换系统语言,都必须重新启动终端以查看差异。