有没有一种通用的方法可以检测操作系统的默认语言?(不考虑运行代码的操作系统是什么)
import os
os.getenv('LANG')
以上代码在Linux下有效,它能在其他操作系统下工作吗?
有没有一种通用的方法可以检测操作系统的默认语言?(不考虑运行代码的操作系统是什么)
import os
os.getenv('LANG')
以上代码在Linux下有效,它能在其他操作系统下工作吗?
请注意,不能依赖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
locale
模块中的getdefaultlocale
函数。它会返回系统默认语言环境的语言代码和编码,以元组的形式返回:>>> import locale
>>> locale.getdefaultlocale()
('en_GB', 'cp1252')
LC_ALL
)。它设置为空字符串,因此当运行locale.getdefaultlocale()
时,我会得到一个平庸的元组:(None,'UTF-8')
。请注意。 - gaatjeniksaan最好使用Windows命令行...
import os
current_locale = os.popen('systeminfo | findstr /B /C:"System Locale"').read()
see https://www.tenforums.com/tutorials/132175-see-current-system-locale-windows-10-a.html
os.environ['LANG']
在Linux和Mac上运行良好。虽然这个解决方案只适用于Windows(在Unix中,模块“ctypes”没有属性“windll”),但需要一个if os.name != 'posix'
语句。 - Matteo Ferla