你很接近。这是一个非常复杂的话题。
正如我在问题 10094335 https://stackoverflow.com/a/10540744/439494 and in 问题 3678174 https://stackoverflow.com/a/8377533/439494:
要将区域设置设置为用户当前区域设置,请勿调用:
locale.setlocale(locale.LC_ALL, locale.getlocale())
只需致电:
locale.setlocale(locale.LC_ALL, '')
正如中所解释的Python setlocale参考文档 https://docs.python.org/3/library/locale.html#locale.setlocale.
这会将所有类别的区域设置设置为用户的默认设置(通常在 LANG 环境变量中指定)。
请注意,Windows 没有LANG
设置环境变量,因此,您需要在该行之前执行此操作:
import sys
import os
import locale
if sys.platform.startswith('win'):
if os.getenv('LANG') is None:
lang, enc = locale.getdefaultlocale()
os.environ['LANG'] = lang
这也将使 gettext 适用于 Python 内的翻译。
这是如何工作的,您可以在此处的源代码中查看它:
https://github.com/python/cpython/blob/master/Modules/_localemodule.c#L90 https://github.com/python/cpython/blob/master/Modules/_localemodule.c#L90
特别是,您收到的错误:
locale.Error:不支持的区域设置
这里表达的是:
https://github.com/python/cpython/blob/master/Modules/_localemodule.c#L112 https://github.com/python/cpython/blob/master/Modules/_localemodule.c#L112
这只是 C 调用的通用错误消息setlocale
使用给定参数失败。
C 调用setlocale
定义在locale.h
标头。在 Linux 中,这是:
- Linux 语言环境.h http://man7.org/linux/man-pages/man7/locale.7.html
在 Windows 中,使用的是:
- Windows 语言环境.h https://msdn.microsoft.com/en-us/library/x99tb11d(v=vs.140).aspx
在 Windows 中locale.h
您可以阅读的文档:
setlocale 支持的语言和国家/地区字符串集在语言字符串和国家/地区字符串中列出。
这表明:
- Visual Studio 2010 语言字符串 https://msdn.microsoft.com/en-us/library/39cwe7zf(v=vs.100).aspx
- Visual Studio 2010 国家/地区字符串 https://msdn.microsoft.com/en-us/library/cdax410z(v=vs.100).aspx
如您所见,对于 2010 版本setlocale
函数需要您找到的格式的区域设置:deu_deu
,与 Linux 版本所期望的不同de_DE
。您唯一的选择是使用依赖于操作系统的区域设置列表来设置区域设置。确实非常非常悲伤。
这里还有另一个问题。如果您更改工具链的版本,您可以看到较新版本的工具链setlocale
函数现在与 Linux/POSIX 的功能更加接近:
- Visual Studio 2015 语言字符串 https://msdn.microsoft.com/en-us/library/39cwe7zf(v=vs.140).aspx
美式英语 en-US
Visual Studio 2010 是支持旧格式的最后一个版本,从 2012 版本开始,预计将采用新的区域设置格式。
正如您可以想象的那样,您需要使用的工具链取决于您正在使用的 CPython 解释器所构建的工具链版本。不知道你用的是哪个版本,不过官方说的Python 开发者指南 https://docs.python.org/devguide/setup.html#windows:
Python 3.5 及更高版本使用 Microsoft Visual Studio 2015。 [...]
Python 3.3 和 3.4 使用 Microsoft Visual Studio 2010。 [...]
3.3 之前的大多数 Python 版本都使用 Microsoft Visual Studio 2008。 [...]
这一切都与Python有关locale
模块。现在,对于gettext
模块或gettext相关函数 https://docs.python.org/3/library/locale.html#access-to-message-catalogs in the locale
模块,这是另一个 C 库,名为libintl
.
libintl
就是所谓的 C 库,它是所有这些翻译魔法的 gettext 的一部分:
- libintl参考文档 http://www.gnu.org/software/gettext/manual/index.html
本文档的一个相关部分说:
请注意,在 GNU 系统上,您不需要链接 libintl,因为 gettext 库函数已包含在 GNU libc 中。
但在 Windows 中,由于中解释的问题问题 10094335 https://stackoverflow.com/a/10540744/439494你需要加载libintl
PyGObject 正在使用的库,即与构建期间链接的库完全相同。执行您已经编写的步骤即可完成。
我需要包含哪个 intl.dll? (我尝试了来自此来源的 gnome/libintl-8.dll:http://sourceforge.net/projects/pygobjectwin32/ http://sourceforge.net/projects/pygobjectwin32/,(pygi-aio-3.14.0_rev19-setup.exe))
所以,是的。构建 pygobject AIO 时用于链接的那个。
我如何检查例如locale deu_deu 获取正确的 /mo/de/LC_MESSAGES/appname.mo/
配置一些消息并注意它们是否显示已翻译。只是注释,不是文件夹"/mo/de/LC_MESSAGES/appname.mo/"
, appname.mo
是一个文件。
查看我关于如何创建翻译的第一个答案.po
来自 Glade 文件的文件。