如何在Python中检测操作系统的默认语言?

38

有没有一种通用的方法可以检测操作系统的默认语言?(不考虑运行代码的操作系统是什么)

import os
os.getenv('LANG')

以上代码在Linux下有效,它能在其他操作系统下工作吗?

3个回答

51

请注意,不能依赖locale模块来检测操作系统语言!!!

如果在没有经过验证的情况下使用此信息,将导致程序在那些操作系统语言与区域语言不同的用户处于全球范围内失败。

它们是不同的,(1)操作系统语言和(2)本地化信息。

MSDN指出:“区域设置 ID 反映了特定地理区域的本地惯例和语言。”,http://msdn.microsoft.com/en-us/library/8w60z792.aspx

而Python文档中则写道:

“POSIX 区域设置机制允许程序员处理应用程序中的某些文化问题,而无需求助于软件执行的每个国家的所有细节。” https://docs.python.org/zh-cn/3/library/locale.html

我的Windows7是英文版的。但我住在西班牙,所以我的本地化信息是'es_ES',而不是'en_EN'

我不知道跨平台的方法,对于Linux,你已经有了。,对于Windows,我会给你一个:

另一篇文章谈到了使用win32的GetSystemDefaultUILanguage查找安装的Windows语言

但如果你想获取Windows语言标识符,我建议使用GetUserDefaultUILanguage(),因为正如MSDN所述,它会递归地搜索,直到找到相应的语言:

"返回当前用户的用户界面语言的语言标识符。如果当前用户没有设置语言,则 GetUserDefaultUILanguage 返回系统设置的首选语言。如果系统中没有设置首选语言,则返回系统默认的用户界面语言(也称为“安装语言”)。有关用户界面语言的详细信息,请参阅用户界面语言管理。"

代码:

>>> import locale
>>> locale.getdefaultlocale()
('es_ES', 'cp1252')            # <------------- Bad! I'm on english OS.

>>> import ctypes
>>> windll = ctypes.windll.kernel32
>>> windll.GetUserDefaultUILanguage()
1033
>>> locale.windows_locale[ windll.GetUserDefaultUILanguage() ]
'en_US'          # <----------- Good work

1
总之,正如OP所提到的,os.environ['LANG']在Linux和Mac上运行良好。虽然这个解决方案只适用于Windows(在Unix中,模块“ctypes”没有属性“windll”),但需要一个if os.name != 'posix'语句。 - Matteo Ferla
在我的Win10上,这两种方法得到的结果相同。 - kakyo
Windows至少有两个东西,一个是操作系统的显示语言,另一个是国家或地区,用于格式化日期、时间和数字。因此,我可以拥有一个单一语言许可证,其中Windows显示语言为en_US,但区域格式为en_IN。在我的情况下,上面的locale模块示例给出了locale(en_IN),而ctypes示例则给出了操作系统的显示语言(en_US)。所以我觉得这不是关于它是否可靠,而更多的是关于你需要用这些信息做什么。如果你想格式化日期,那么使用locale会更好。 - gouravkr

32
你可以使用locale模块中的getdefaultlocale函数。它会返回系统默认语言环境的语言代码和编码,以元组的形式返回:
>>> import locale
>>> locale.getdefaultlocale()
('en_GB', 'cp1252')

1
谢谢!它是独立于操作系统的吗? - banx
2
@bank - 是的,我相信是可以的。它适用于 Windows 平台,并且文档描述了在 POSIX 环境中的使用方式,所以你应该不会有问题。 - David Webb
3
很奇怪,它对我不起作用。即使在德语版的Windows上,它仍然返回en_US。 - Grisha S
1
此函数反映了您当前位置的区域设置。 - Kotauskas
2
我从未碰过我的区域环境变量(例如LC_ALL)。它设置为空字符串,因此当运行locale.getdefaultlocale()时,我会得到一个平庸的元组:(None,'UTF-8')。请注意。 - gaatjeniksaan
显示剩余4条评论

-4

1
仅适用于Windows,不像OSX那样是跨平台的解决方案。 - e-info128

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接