使用 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 翻译 的相关文章

  • JavaScript - 获取浏览器支持的区域设置的完整列表

    我发现了支持的语言环境 https developer mozilla org en US docs Web JavaScript Reference Global Objects DateTimeFormat supportedLocal
  • 在 Xcode 4 中本地化 iPhone 应用程序名称

    当我选择 Info plist 文件以便本地化应用程序名称并尝试构建项目时 构建失败并显示错误 提示找不到 Info plist 文件 如果我将 Info plist 文件路径更改为PROJECTNAME en lproj Info pli
  • Apple Watch 应用程序无法本地化

    我已经为德语 法语 西班牙语和简体中文设置了 interface storyboard 字符串 我下载了 iOS 应用程序并将其加载到手表上 例如 我然后将手表语言设置为德语 但用户界面仍然是英文 以下是 interface storybo
  • Localized.strings 在 iOS 中不起作用

    我遇到了这个真正令人心碎的问题 我在 XCode 中创建了一个 Localized strings 文件 然后在其中创建了 2 种语言 我用语言翻译填充了这些文件 进行了构建 清理 然后进行了全新构建 但本地化字符串无法显示在我的项目中 如
  • 如何获取图标名称的完整文件路径?

    如何从 GNOME 中的图标名称获取完整文件路径 import gtk icon theme gtk icon theme get default icon info icon theme lookup icon my icon name
  • 翻译数据库内文本的最佳方法是什么

    我们这里有问题 我们需要将网站翻译成多种语言 我们已经使用 gettext 来翻译静态内容 但我们必须将一些文本内容翻译成多种语言 ui不是问题 我们找到了两种翻译文本的方法 1 在我们的文本输入中使用 JSON 为什么这个解决方案不好 每
  • 如何获得 GTK 中的默认颜色?

    Context 在 GTK 3 中 人们可以设置自己的主题 甚至默认主题 Adwaita 也提供两种变体 浅色和深色 当我编写自己的小部件 用Python 时 我需要获取这些颜色以避免在黑色上绘制黑色或在白色上绘制白色 Question 如
  • Xcode 6 本地化无法读取字符串文件

    Xcode 无法生成 xliff 本地化文件并出现错误本地化无法读取字符串文件 请检查系统日志以获取更多详细信息 有谁知道我在哪里可以找到这些日志 它是 Xcode 6 3 2 GM 但我也尝试过 6 3 1 版本 同 6 3 1 错误发生
  • 在 Windows 上安装 MonoDevelop:满足 Gtk# 要求的解决方法?

    我已经安装了Mono 版本2 11 4 在我的Windows 7系统上 现在我打算安装单一开发 版本 3 0 4 7 然而 当我开始单一开发安装程序我收到以下错误消息 并且安装终止 好的 这可以通过获取轻松解决Gtk 安装程序来自here
  • asp和iis 6.0从哪里获取其日期格式

    我发现了一个带有新网络服务器的小泡菜 我们有一个新的网络服务器 它显示的日期与我们旧的网络服务器不同 我们在 Windows Server 2003 的 IIS 6 0 上运行 asp 经典网页 我们以管理员身份登录并设置适当的区域设置 然
  • 在 Ubuntu 上用 C 项目编译和链接 GTK 3

    我相信这不是重复的问题 在发布此问题之前我已经看过所有问题 答案 我想我这里的情况有所不同 我使用Ubuntu 12 04并下载GTK 2 和 3 我从 GNOME 网站复制了一个简单的 GTK 源代码 但是当我在终端中使用这个命令时 gc
  • 如何以编程方式获取 Android 项目(非设备)中支持的语言列表

    在一些项目中我们可能会出现这种情况 如何以编程方式获取此应用程序 项目支持的语言列表 结果我需要这样的字符串数组 en bg bs da de hr it nl pl pt sk sr tr 当然 我可以通过键入它来对其进行硬编码 但我认为
  • GTK 滚动窗口 - 将滚动条保持在底部

    我有一个使用 ScrolledWindow 的 GTK C 程序 我不断将数据添加到滚动窗口内的列表中 并且我想将注意力集中在最新的项目上 但我还想允许用户滚动数据以选择旧项目 有没有办法做到这一点 我到处都找过了 但什么也没找到 我不太清
  • 如何将正文中的数字替换为波斯数字?

    我想将 html 内容中的每个数字转换为波斯数字 而不会对页面元素产生其他影响 例如 div style color c2c2c2 text number 1 span text number 2 span div text number
  • WinForms 本地化。该语言不反映默认的 resx 文件

    我正在尝试在 winform 应用程序中使用本地化 但有几个问题 我本想问最复杂的问题 但现在我遇到了一个基本问题 我已经构建了一个带有表单 标签和菜单条的基本 winform 我已将表单本地化设置为 true 并将标签文本设置为三种不同的
  • 在 xcode 中,有没有办法验证所有 NSLocalizedStrings 的密钥?

    除了运行其中包含 NSLocalizedString 的每个代码路径之外 是否有一种方法可以验证所有 NSLocalizedString 是否都具有实际存在于所有捆绑包的所有 Localized strings 文件中的密钥 例如 一个键中
  • 是否有一个包可以维护所有带有符号的货币列表?

    是否有一个 python 包提供所有 或相当完整 货币的列表与符号 如美元的 有优秀的pycountry 贪财的 https github com limist py moneyed and ccy http code google com
  • 更改应用程序语言运行时而不重新创建活动

    我需要的 我想提供在应用程序中更改语言的选项 仅更改应用程序的语言 而不是整个手机语言 我做了什么 我尝试在运行时更改区域设置 它正在更改语言 问题是什么 我想要的是 我不想在更改语言时重新创建活动或片段 我尝试过的如下所示 测试活动 ja
  • 如何在 pygtk 中创建新信号

    我创建了一个 python 对象 但我想在它上面发送信号 我让它继承自 gobject GObject 但似乎没有任何方法可以在我的对象上创建新信号 您还可以在类定义中定义信号 class MyGObjectClass gobject GO
  • 如何让Gtk+窗口背景透明?

    我想让 Gtk 窗口的背景透明 以便只有窗口中的小部件可见 我找到了一些教程 http mikehearn wordpress com 2006 03 26 gtk windows with alpha channels https web

随机推荐

  • 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