OSX上locale.getlocale()的问题

3 投票
6 回答
11301 浏览
提问于 2025-04-15 15:24

我需要获取系统的语言设置,以便做一些事情,最终我想用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()不能自动获取操作系统的语言吗?我不想强迫用户去设置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=

6 个回答

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

之后,我就可以在所有对我来说相关的操作系统上,使用没有修改的命令行环境运行我的程序了(反正我的程序在后续处理时会自动判断使用哪种语言)。

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')
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其中之一)。我在我的终端环境中设置了LANG=en_GB.UTF-8。

撰写回答