使用Python / PyGObject在Windows中加载GTK-Glade转换

时间:2015-08-16 16:48:35

标签: localization gtk pygtk glade pygobject

我有一个Python脚本,可以加载可以翻译的Glade-GUI。在Linux下一切正常,但我在理解Windows上的必要步骤时遇到了很多麻烦。

在Linux下看起来很有必要:

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文件的文件夹。

在Windows下,这会让事情变得更加困难:

Python控制台中的

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.dllhttp://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

1 个答案:

答案 0 :(得分:2)

你很亲密。这是一个非常复杂的主题。

我在Question 10094335Question 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文件。