我需要让系统区域设置做很多事情,最终我想用gettext翻译我的应用程序。我将在Linux和OSX上分发它,但我在OSX Snow Leopard上遇到了问题:

$ 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上的python( LANG =" sv_SE.UTF-8" python ),则可以很好地检测到locale。但是 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=
有帮助吗?

解决方案

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邮件列表

基本上它取决于你的环境在运行时设置的内容(LANG,LANGUAGE,LC_ALL之一)我在shell环境中有LANG = en_GB.UTF-8

其他提示

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

我的计划的早期阶段。之后,我可以在与我相关的所有操作系统上使用未修改的shell环境运行我的程序(我的程序计算出以后在其处理中使用的语言)。

看起来您可以通过更改环境变量 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')

此处:尝试添加或编辑〜/ .profile 〜/ .bash_profile 文件,以便在启动新会话时正确导出语言环境设置。

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

老问题,但这可能有助于其他人:这是一个Python错误,截至2016年3月在Python 2或3中仍未解决: https://bugs.python.org/issue18378

总结是Python假定类似GNU的语言环境和balks(POSIX正确)差异,就像BSD环境中那样(就像OS X一样)。 UTF8语言环境存在于BSD中,而不是Linux中,因此存在问题。

至于解决方案或调试:本地环境变量可以通过Terminal.app设置(参见首选项 - 配置文件 - 高级 - 国际;类似于iTerm等等)。因此,可以在终端窗口中找到设置的语言环境变量,但在运行打包的应用程序时找到未设置的变量。

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

但是这可能会导致其他程序出现问题:如果未设置区域设置变量,则bash 4.3(来自MacPorts)会在每次提示时都抱怨“警告:setlocale:LC_CTYPE:无法更改区域设置():没有此类文件或目录" ...

因此,鉴于错误是在Python中,解决方法应该可以在python程序中完成(如在@Jacob Oscarson的回答中)或python调用(通过将语言环境变量设置为足够的值)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top