- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 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
最佳答案
你很接近。这是一个非常复杂的主题。
正如我在 Question 10094335 中所写在Question 3678174 :
要将语言环境设置为用户当前语言环境,请不要调用:
locale.setlocale(locale.LC_ALL, locale.getlocale())
只需调用:
locale.setlocale(locale.LC_ALL, '')
如 Python setlocale
reference documentation 中所述.
This sets the locale for all categories to the user’s default setting (typically specified in the LANG environment variable).
请注意,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: unsupported locale setting
在这里表示:
https://github.com/python/cpython/blob/master/Modules/_localemodule.c#L112
这只是 C 调用 setlocale
使用给定参数失败的一般错误消息。
C 调用 setlocale
在 locale.h
header 中定义。在 Linux 中,这是:
在 Windows 中,这是使用的:
在 Windows locale.h
文档中,您可以阅读:
The set of language and country/region strings supported by setlocale are listed in Language Strings and Country/Region Strings.
这指向:
如您所见,对于 2010 版本,setlocale
函数需要您发现的格式中的语言环境:deu_deu
,这与 Linux 所期望的格式不同版本 de_DE
。您唯一的选择是使用依赖操作系统的语言环境列表来设置语言环境。真的非常非常难过。
这里还有一个问题。如果您更改工具链的版本,您会发现较新版本的 setlocale
函数现在更接近于 Linux/POSIX 所做的工作:
american english en-US
Visual Studio 2010 是最后一个支持旧格式的版本,从版本 2012 开始,预计会使用新的区域设置格式。
您可以想象,您需要使用的工具链版本取决于您正在使用的 CPython 解释器的构建工具链版本。不知道你用的是哪个版本,根据官方Python Developer's Guide :
Python 3.5 and later use Microsoft Visual Studio 2015. [...] Python 3.3 and 3.4 use Microsoft Visual Studio 2010. [...] Most Python versions prior to 3.3 use Microsoft Visual Studio 2008. [...]
这都与 Python locale
模块有关。现在,对于 gettext
模块或 gettext related functions在 locale
模块中,这是另一个名为 libintl
的 C 库。
libintl
是所谓的 C 库,它是所有这些翻译魔法的 gettext 的一部分:
本文档的一个相关部分说:
Note that on GNU systems, you don’t need to link with libintl because the gettext library functions are already contained in GNU libc.
但在 Windows 中,由于 Question 10094335 中解释的问题您需要加载 PyGObject 使用的 libintl
库,也就是说,它与构建期间链接的库完全相同。完成您已经编写的步骤。
Which intl.dll do I need to include? (I tried the gnome/libintl-8.dll from this source: http://sourceforge.net/projects/pygobjectwin32/, (pygi-aio-3.14.0_rev19-setup.exe))
所以,是的。在构建 pygobject AIO 时用于链接的那个。
How can I check if the e.g. locale deu_deu gets the correct /mo/de/LC_MESSAGES/appname.mo/
配置一些消息并注意它们是否显示已翻译。请注意,"/mo/de/LC_MESSAGES/appname.mo/"
不是文件夹,appname.mo
是文件。
查看我关于如何从 Glade 文件创建翻译 .po
文件的第一个答案。
关于localization - 使用 Python/PyGObject 在 Windows 中加载 GTK-Glade 翻译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32037573/
我正在尝试使用 Glade、PyGTK 和 Python 设置一个小的下载应用程序。我已经计划好了我想如何编写这个进度条和所有的脚本,尽管我觉得我正在以错误的方式去做,因为......好吧......
我正在尝试在 mac OSX el capan 上安装 Glade。我在 https://glade.gnome.org/sources.html 上下载了源代码 我按照源代码中带有“安装”文本的说明
我试图用glade 3.20做一个GtkHeaderBar应用程序,但每次创建我的python应用程序时,我的老学校栏都在顶部。 在glade 3.19 中,检查客户端装饰属性在顶部创建了一条线,我可
我是 gtk+ 编程领域的新手。我仍在探索许多使用选项。我将使用 C 语言进行编码。我有以下问题: 哪个更好?编写代码还是使用 glade 生成的 .glade 文件? 哪个更好用? libglade
我在 Internet 上进行了一项研究,寻找教程/文档来解释我如何在 Java Gnome 项目中使用在 Glade 中设计的 UI,但没有成功。我已经知道如何使用 Java Gnome/GTK 从
我已经阅读了一些 Glade 手册并创建了一个 GUI,其中有一个我想通过代码填充的 TreeView。空地文件是: False 3 Tree Viewe
我正在使用带有 gtk2hs 绑定(bind)的编辑器 Glade 在 Haskell 中编写 GUI。目前,我在对单选按钮进行分组时失败了。它不会让我选择组名。有人可以帮忙吗? 最佳答案 对于组中的
Glade:如何将多个参数传递给信号处理程序? 最佳答案 你在林间空地能做的事情非常有限。您可以将零个或一个对象作为用户数据传递给信号处理程序。该对象必须是一个小部件(或其他对象),也存在于 glad
我正在尝试使用 Glade/gtk/vala 制作一个简单的应用程序。到目前为止,我有这个: using Gtk; class HelloWorldApp : GLib.Object { co
我正在使用代码块和空地编写一个 C 程序。起初我以为问题出在我的代码上。我尝试了在网上找到的不使用glade(仅GTK)的示例代码,并且它有效。然后我尝试了一个只有一个窗口和一个 TextView 的
如果我在 FreeBSD 8 下静态链接 GTK+ 程序,gtk_builder_add_from_file() 突然返回错误: Invalid object type `GtkWindow' 如何解
Glade 3.14.2 似乎打开了我的 .glade 文件,但没有显示任何内容。我可以在文本编辑器中查看所有 xml 详细信息。我的 .glade 文件中的 header 是:
我正在尝试将 Glade 3 用于我在 Windows 7 上的 Ada 程序。我找到了 3.6 版的方法,但 gtk-builder-convert 未被识别为脚本。我已经尝试通过 Google 找
如何将对话窗口的按钮(例如 GtkDialog)与响应 Gtk::ResponseType 链接起来值(value)与格莱德?。 我知道如何以编程方式执行此操作,但我不知道如何使用 Glade 执行此
我正在 Glade (GTK# 3.20 + C#) 中制作应用程序界面原型(prototype),并通过 CssProvider 使用我的 CSS 样式。我有这个: 问题是我使用 GTKLayout
您好,我正在使用 gtk3 和 Glade 3.14...我想向 Glade 添加一个自定义小部件,以便我可以轻松地将其添加到我的用户界面中。 我发现空地中缺少旋钮小部件,我在其中找到了旋钮小部件 h
我想多次显示在 Glade 文件中定义的 Gtk.Dialog。 目前,我可以使用自定义按钮来调用对话框的 hide() 方法,但是,如果用户使用 Alt+F4 关闭对话框,它重新打开为空: 在控制台
首先,我是编程语言世界的新手,当然对 Python 也很陌生。 在我的工作中,我们使用 Linux 系统。我有时需要检查终端上的一些命令和脚本输出。因此,我想使用非常基本的 GUI 编写一个小型应用程
我想处理菜单单击事件,但是,正在发生此丢失处理程序警告,我哪里错了?我将信号 ab 与处理程序 abcd 连接在 menuitem6 上,在激活事件上,处理点击事件是否正确? 这是错误: abc.py
我使用glade构建了一个数据库操作GUI,对于我的添加按钮层次结构是添加->确认对话框->(如果是)添加数据。如何访问主窗体中的每个小部件值?我是 gtk 和glade 的新手,我设法消除了大部分错
我是一名优秀的程序员,十分优秀!