在OSX locale.getlocale()问题(locale.getlocale() probl

2019-09-01 11:42发布

我需要得到系统区域做了一些事情,最后我想用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)

这两种系统都使用瑞典语言。 在Linux上,将环境变量LANG已设置为“sv_SE.UTF-8”。 如果我通过该变量在OSX蟒蛇( LANG="sv_SE.UTF-8" python代替),语言环境很好地检测到。 但不应locale.getlocale()能够获取操作系统有什么语言? 我不希望强制用户设置LANGLC_ALL或任何环境变量的。

的输出locale命令:

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

Answer 1:

奇在OSX(SMOW豹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')

编辑:

我刚刚发现这个在上苹果蟒蛇邮件列表

基本上,它取决于什么是您的环境中运行时(LANG,语言之一,LC_ALL)设置我有LANG = en_GB.UTF-8在我的shell环境



Answer 2:

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

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')

在方案的早期点矿 。 从那以后,我可以在我有关的所有OS'es使用未经修改的shell环境中运行我的程序(我的程序计算出在它的处理反正稍后使用的语言)。



Answer 3:

看起来你可以通过改变环境变量的语言环境改变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')


Answer 4:

从这里 :尝试添加或编辑~/.profile~/.bash_profile的文件才能正常启动后新的会话导出区域设置。

export LC_ALL=en_US.UTF-8  
export LANG=en_US.UTF-8


Answer 5:

老问题,但是这可能帮助别人:这是一个Python错误,如2016年3月仍是在任的Python 2或3悬而未决: https://bugs.python.org/issue18378 。

该概述了Python当做像那些在BSD环境(POSIXly正确)分歧GNU状区域设置和梁木(如OS X)。 而UTF8语言环境存在于BSD,无法在Linux中,因此这个问题。

至于解决方案或调试:局部环境变量可以通过Terminal.app设置(见首选项 - 概况 - 高级 - 国际;同样所以的iTerm或其他)。 因此,人们可以找到在终端窗口时所设置的语言环境变量,但发现这些变量在运行打包应用程序时未设置。

对于某些情况下(在Python 2.7和3.5像狮身人面像,因为OS X垂死“ValueError异常:未知区域:UTF-8”),禁止优先选项框来设置语言环境变量是解决方案。

但是,这可能会导致其他程序的问题:如果语言环境瓦尔未设置,bash的4.3(从MacPorts的)将在每一个提示抱怨与“警告:的setlocale:LC_CTYPE:不能改变区域设置():没有这样的文件或目录” .. 。

因此,考虑到错误是在Python,解决办法应在Python程序中可能完成(如@Jacob Oscarson的答案)或Python调用(通过设置区域瓦尔一些适当的值)。



文章来源: locale.getlocale() problems on OSX