使用 Python/PyGObject 在 Windows 中加载 GTK-Glade 翻译

2024-05-04

我有一个 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'), the LOCALE_DIR只需指向包含已编译 mo 文件的文件夹。

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

locale.getlocale()在Python控制台中返回(None, None) and 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")

此外localeWindows 上的模块没有bintextdomain功能。为了使用它,需要导入ctypes:

import ctypes
libintl = ctypes.cdll.LoadLibrary("intl.dll")
libintl.bindtextdomain(APP_NAME, LOCALE_DIR)
libintl.bind_textdomain_codeset(APP_NAME, "UTF-8")

所以,除了它是如何工作的之外,我的问题是:

  • Which intl.dll我需要包括吗? (我尝试了gnome/libintl-8.dll从这个来源:http://sourceforge.net/projects/pygobjectwin32/ http://sourceforge.net/projects/pygobjectwin32/,(pygi-aio-3.14.0_rev19-setup.exe))
  • 我如何检查例如语言环境deu_deu得到正确的/mo/de/LC_MESSAGES/appname.mo/?

Edit

我的文件夹结构(是否足够有一个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
  • 我把存储库放在这里:https://github.com/tobias47n9e/pygobject-locale https://github.com/tobias47n9e/pygobject-locale
  • 编译后的 Windows 安装程序(64 位)在这里:https://www.dropbox.com/s/qdd5q57ntaymfr4/pygibank_1.0.exe?dl=0 https://www.dropbox.com/s/qdd5q57ntaymfr4/pygibank_1.0.exe?dl=0

答案的简短摘要

The mo-文件应该以这种方式进入 gnome-packages:

├── gnome
│   └── share
│       └── locale
│           └── de
|               └── LC_MESSAGES
|                    └── pygibank.mo

你很接近。这是一个非常复杂的话题。

正如我在问题 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你需要加载libintlPyGObject 正在使用的库,即与构建期间链接的库完全相同。执行您已经编写的步骤即可完成。

我需要包含哪个 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 文件的文件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Python/PyGObject 在 Windows 中加载 GTK-Glade 翻译 的相关文章

随机推荐

  • Django ORM 是否具有与 SQLAlchemy 的混合属性等效的功能?

    In SQL炼金术 http docs sqlalchemy org en rel 0 7 index html a 混合属性 http docs sqlalchemy org en rel 0 7 orm extensions hybri
  • 使用 UIWebview 导航 Pdf 在 IOS 5 中不起作用

    我最近升级到 Xcode 4 我发现一个运行良好一年多的应用程序现在无法在 Ios 5 下运行 该应用程序在 UIWebview 中导航 Pdf 并使用以下代码移动到其中的任何页面pdf self pdfNavigateController
  • 为什么在尝试导入随机模块时会收到 TypeError: 'module' object is not callable ?

    我正在使用 Python 2 6 并尝试运行一个简单的随机数生成器程序 random py import random for i in range 5 random float 0 0 lt number lt 1 0 print ran
  • 如何在节标题和段落之间添加额外的空格

    我希望标题和段落之间以及段落之间有更多的空间 我不希望这是一个全局设置 但我想在需要的地方和时间使用它 感谢任何建议 您可以在行首使用竖线在输出中生成空行 像这样 Heading Paragraph with text
  • 无法将项目追加到多处理共享列表

    我正在使用多重处理来为我的应用程序创建子流程 我还在进程和子进程之间共享一个字典 我的代码示例 主要流程 from multiprocessing import Process Manager manager Manager shared
  • 制作 C# 项目 DLL 和 EXE

    我正在开发一个项目 需要有一个可执行文件以便用户可以运行配置界面和一个可以嵌入其他项目以使用其他一些功能的 DLL 有没有办法让 Visual Studio 同时生成可执行文件和 DLL 而不是每次都手动切换 我同意 TJMonk15 的观
  • 即使使用前向声明也会出现未定义的类型错误

    我正在阅读循环引用和前向声明 我确实知道在头文件中实现并不是一个好的设计实践 然而我正在尝试并且无法理解这种行为 使用以下代码 包含前向声明 我期望它能够构建 但是我收到此错误 Error 1 error C2027 use of unde
  • 如何避免JQuery和Prototype之间的冲突

    如果一个页面同时具有 JQuery 和 Prototype 那么我就会遇到冲突 有一个选项可以禁用 JQuery 的 符号 因此不会发生冲突 但是我必须使用关键字 JQuery 而不是 我想知道Prototype是否有任何选项可以解决这个冲
  • React-Router v4 渲染错误的组件但匹配正确

    我有一个带有两个按钮的侧边栏 测试 和 关于 Test 火箭图标 呈现在 test 处 About 主页图标 呈现在 处 它们都位于应用程序的根目录并嵌套在组件内 当我从 开始并单击 链接到 test 时 它总是加载 关于 组件 当我检查
  • 使用 iText 某些 pdf 文件水印不显示

    我们公司使用 iText 在一些 pdf 表格上标记一些水印文本 不是图像 我注意到 95 的表格可以正确显示水印 大约 5 则不能 我测试了一下 复制了2个原始pdf文件 一个被标记为ok 另一个不ok 然后通过一个小程序进行测试 结果相
  • 在透明背景的 flutter 上播放视频

    我在 Blender 上做了一些复杂的 3D 动画 我想在 flutter 上播放它们 问题是 当我将动画导出到视频并将其放在我的 flutter 应用程序上时 透明背景消失了 我使用 video player 在 flutter 上播放视
  • 在电子邮件中使用协议相对 URL 安全吗?

    关于在 HTML 中使用协议相对 URL 已有讨论 1 但是电子邮件呢 电子邮件客户端或 Gmail 等服务提供商在 HTML 电子邮件中使用时是否会删除或修改协议相对 URL 1 我可以将所有 http 链接更改为 吗 https sta
  • 如何在 R 中验证日期

    我有一个格式为的日期dd mm yyyy HH mm ss验证该日期的最佳和最简单的方法是什么 I tried d lt format Date date format d m Y H M S 但是当非法日期过去时如何捕获错误呢 简单的方法
  • 如何在 O(n) 时间内遍历二叉树而不需要额外的内存

    给定一棵带有整数 左指针和右指针的二叉树 如何在 O n 时间和 O 1 额外内存 无堆栈 队列 递归 内遍历该树 This guy http nandacumar blogspot com 2006 06 traversing tree
  • 为什么以下带有循环泛型的代码无法编译?

    以下是我的代码 class A
  • MVC 4 RC - Aspnet_regsql.exe

    我正在尝试使用 MVC 4 RC 默认模板启用登录 我以与 MVC 3 中相同的方式进行操作 Aspnet regsql exe gt SQL 服务器 然后我让连接字符串指向 SQL 服务器 当我尝试注册新用户时 我得到以下信息 Serve
  • Matlab 的快速 JSON 解析器

    您知道 Matlab 中有一个非常快速的 JSON 解析器吗 目前我正在使用JSONlab http www mathworks com matlabcentral fileexchange 33381 jsonlab a toolbox
  • 安装轮子后安装后脚本

    Using from setuptools command install import install 如果我运行 我可以轻松运行自定义安装后脚本python setup py install 这是相当微不足道 https stackov
  • 学习 WPF 会提高我的 ASP.NET 技能吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我已经在 Windows 窗体领域工作了很多年 而且仍然如此 我完全不熟悉 ASP NET 技术 也不熟悉其他 Web 相关技术 我曾合作过 O
  • 使用 Python/PyGObject 在 Windows 中加载 GTK-Glade 翻译

    我有一个 Python 脚本 可以加载可翻译的 Glade GUI 在 Linux 下一切工作正常 但我在理解 Windows 上的必要步骤时遇到了很多困难 Linux 下似乎需要的只是 import locale locale setlo