2

我需要获取系统语言环境来做很多事情,最终我想使用 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.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=
4

6 回答 6

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

编辑:

我刚刚在 苹果 python 邮件列表中找到了这个

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

于 2009-10-27T10:29:16.663 回答
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')
于 2009-10-27T13:59:08.423 回答
3

不可否认的是一个可怕的黑客,但我插入了这个:

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 环境运行我的程序(我的程序会计算出稍后在其处理中使用的语言)。

于 2012-01-11T12:27:27.347 回答
1

这里:尝试添加或编辑~/.profileor~/.bash_profile文件,以便在启动新会话时正确导出您的区域设置。

export LC_ALL=en_US.UTF-8  
export LANG=en_US.UTF-8
于 2013-07-31T09:38:18.213 回答
1

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

总结是,Python 假定类似于 GNU 的语言环境,并且拒绝(POSIXly 正确的)分歧,就像那些在 BSD 环境中的分歧(就像 OS X 一样)。并且 UTF8 语言环境存在于 BSD 中,而不是 Linux 中,因此存在问题。

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

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

但这可能会导致其他程序出现问题:如果未设置语言环境变量,bash 4.3(来自 MacPorts)将在每次提示时抱怨“警告:setlocale:LC_CTYPE:无法更改语言环境():没有这样的文件或目录”.. .

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

于 2016-03-01T12:29:34.780 回答
0

我的设置

$ system_profiler SPSoftwareDataType
Software:

    System Software Overview:

      System Version: macOS 11.4 (20F71)
      Kernel Version: Darwin 20.5.0

当当前语言System Preferences > Language & ReginonEnglish时,则

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=

请注意,每当我们在系统偏好设置中切换系统语言时,我们必须重新启动终端才能看到差异。

于 2021-07-04T09:31:59.363 回答