Python OSX上的locale.getlocale()问题
我需要让系统语言环境做很多事情,最终我想用gettext翻译我的应用程序。我打算在Linux和OSX上发布它,但在OSX雪豹上遇到了问题:Python OSX上的locale.getlocale()问题,python,macos,localization,osx-snow-leopard,locale,Python,Macos,Localization,Osx Snow Leopard,Locale,我需要让系统语言环境做很多事情,最终我想用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 &
$ 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.getlocale()
不应该能够获取操作系统拥有的任何语言吗?我不想强迫用户设置LANG
、LC\u 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)上的奇数
编辑:
我刚在墙上找到这个
基本上,这取决于在运行时您的环境中设置了什么(LANG、LANGUAGE、LC_ALL中的一个),我在shell环境中设置了LANG=en_GB.UTF-8
编辑:
我刚在墙上找到这个
基本上,这取决于运行时在您的环境中设置了什么(LANG、LANGUAGE、LC_ALL中的一个)。我在shell环境中设置了LANG=en_GB.UTF-8看起来您可以通过更改环境变量
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')
看起来您可以通过更改环境变量
LC\u 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')
一个可怕的黑客,但我插入了这个:
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环境运行我的程序(我的程序确定了以后在处理过程中使用的语言)。这无疑是一个可怕的黑客攻击,但我插入了以下内容:
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环境运行我的程序(我的程序确定了以后在处理过程中使用的语言).发件人:尝试添加或编辑~/.profile
或~/.bash\u profile
文件,以便在启动新会话时正确导出您的区域设置
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
From:尝试添加或编辑~/.profile
或~/.bash\u profile
文件,以便在启动新会话时正确导出您的区域设置
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
老问题,但这可能会帮助其他人:这是一个截至2016年3月在Python2或Python3中仍未解决的Python错误: 总结一下,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环境变量是解决方案 但这可能会在其他程序中引起问题:如果没有设置区域设置变量,Bash4.3(来自MacPorts)会在每次提示时抱怨“警告:setlocale:LC_CTYPE:cannotchange locale():没有这样的文件或目录”
因此,考虑到该漏洞是在Python中出现的,解决方法可能应该是在Python程序(如@Jacob Oscarson的回答)或Python调用(通过将区域设置变量设置为适当的值)中完成。旧问题,但这可能会帮助其他人:这是一个截至2016年3月在Python 2或3中仍未解决的Python漏洞: 总结一下,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环境变量是解决方案 但这可能会在其他程序中引起问题:如果没有设置区域设置变量,Bash4.3(来自MacPorts)会在每次提示时抱怨“警告:setlocale:LC_CTYPE:cannotchange locale():没有这样的文件或目录”
因此,考虑到该bug是在Python中出现的,解决方法可能应该在Python程序(如@Jacob Oscarson的回答)或Python调用(通过将区域设置变量设置为适当的值)中完成。奇怪。在最初的帖子中,我使用的是iTerm,但是如果我使用Terminal.app,我会得到一个错误(ValueError:unknown locale:UTF-8)。区域设置看起来很奇怪:“C/UTF-8/C/C/C”。也许我的系统有点混乱,但它是雪豹的一个相当新鲜的安装。请参阅我的编辑,了解为什么会出现更改-您的系统没有被弄乱(好了,不再是所有OSX python)-抱歉,当我编辑看到您的链接,并且从我可以收集到的,它不能完成,因为OSX没有使用朗或LC所有。我对uuu CF_USER_TEXT_编码变量很感兴趣,但解析它似乎有点愚蠢。IMO getlocale()应该调用适当的API:s并为您解析它,而不是依赖于某些环境变量。@pojo,您说得很对:这是一个python错误,看起来他们可能最终使用本机语言环境API而不是环境变量。唉,还没有修好。奇怪的在最初的帖子中,我使用了iTerm,但是如果我使用term