我有一个Python脚本,可以加载可以翻译的Glade-GUI。在Linux下一切正常,但我在理解Windows上的必要步骤时遇到了很多麻烦。
import locale
[...]
locale.setlocale(locale.LC_ALL, locale.getlocale())
locale.bindtextdomain(APP_NAME, LOCALE_DIR)
[...]
class SomeClass():
self.builder = Gtk.Builder()
self.builder.set_translation_domain(APP_NAME)
locale.getlocale()
返回示例('de_DE', 'UTF-8')
,LOCALE_DIR
只指向包含已编译mo文件的文件夹。
locale.getlocale()
返回(None, None)
,locale.getdefaultlocale()
返回("de_DE", "cp1252")
。此外,当一个人试图设置locale.setlocale(locale.LC_ALL, "de_DE")
时会吐出这个错误:
locale.setlocale(locale.LC_ALL, "de_DE")
File "C:\Python34\lib\locale.py", line 592, in setlocale
return _setlocale(category, locale)
locale.Error: unsupported locale setting
我留给读者来推测为什么Windows不接受最常见的语言代码。因此,人们不得不使用下面的一行:
locale.setlocale(locale.LC_ALL, "deu_deu")
locale.setlocale(locale.LC_ALL, "german_germany")
此外,Windows上的locale
模块没有bintextdomain
功能。要使用它,需要导入ctypes
:
import ctypes
libintl = ctypes.cdll.LoadLibrary("intl.dll")
libintl.bindtextdomain(APP_NAME, LOCALE_DIR)
libintl.bind_textdomain_codeset(APP_NAME, "UTF-8")
所以我的问题,除了这是如何工作的,是:
intl.dll
? (我尝试了此来源的gnome/libintl-8.dll
:http://sourceforge.net/projects/pygobjectwin32/,(pygi-aio-3.14.0_rev19-setup.exe))deu_deu
获取正确的/mo/de/LC_MESSAGES/appname.mo/
?我的文件夹结构(是否有de
文件夹?我尝试使用deu_deu
文件夹,但没有帮助):
├── gnome_preamble.py
├── installer.cfg
├── pygibank
│ ├── __init__.py
│ ├── __main__.py
│ ├── mo
│ │ └── de
│ │ └── LC_MESSAGES
│ │ └── pygibank.mo
│ ├── po
│ │ ├── de.po
│ │ └── pygibank.pot
│ ├── pygibank.py
│ └── ui.glade
└── README.md
mo
- 文件应该以这种方式进入gnome-packages:
├── gnome
│ └── share
│ └── locale
│ └── de
| └── LC_MESSAGES
| └── pygibank.mo
答案 0 :(得分:2)
你很亲密。这是一个非常复杂的主题。
我在Question 10094335和Question 3678174写道:
要将区域设置设置为用户当前区域设置,请不要调用:
locale.setlocale(locale.LC_ALL, locale.getlocale())
只需致电:
locale.setlocale(locale.LC_ALL, '')
如Python setlocale
reference documentation中所述。
这会将所有类别的区域设置设置为用户的默认设置(通常在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
特别是您收到的错误:
locale.Error:不支持的区域设置
在此表达:
https://github.com/python/cpython/blob/master/Modules/_localemodule.c#L112
这只是C调用setlocale
因给定参数而失败的一般错误消息。
在setlocale
标题中定义了C调用locale.h
。在Linux中,这是:
在Windows中,使用的是:
在Windows locale.h
文档中,您可以阅读:
setlocale支持的语言和国家/地区字符串集列在语言字符串和国家/地区字符串中。
这指向:
正如您所看到的,对于2010版本,setlocale
函数需要您找到的格式的区域设置:deu_deu
,它与Linux版本de_DE
的预期格式不同。您唯一的选择是使用依赖于os的语言环境列表来设置语言环境。非常非常伤心。
这里还有另一个问题。如果您更改工具链的版本,您可以看到setlocale
函数的更新版本现在更适合Linux / POSIX所做的事情:
美国英语en-US
Visual Studio 2010是支持旧格式的最后一个版本,从2012版开始,需要新的语言环境格式。
您可以想象,您需要使用的那个取决于您正在使用的CPython解释器所构建的工具链的版本。我不知道您使用的是哪个版本,但根据官方Python Developer's Guide:
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
模块或locale
模块中的gettext related functions,这是另一个名为libintl
的C库。
libintl
是所谓的C库,它是所有这些翻译魔法的gettext的一部分:
本文档的一个相关部分说:
请注意,在GNU系统上,您不需要与libintl链接,因为gettext库函数已包含在GNU libc中。
但在Windows中,由于Question 10094335中解释的问题,您需要加载PyGObject正在使用的libintl
库,即与构建期间链接的库相同。这样就完成了你已经写过的步骤。
我需要包含哪个intl.dll? (我从这个来源尝试了gnome / libintl-8.dll: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
是文件。
检查我的第一个答案,了解如何从Glade文件创建翻译.po
文件。