如何在 GTK3 下将文本域绑定到本地文件夹以用于 gettext

2024-06-28

With gettext您可以使用默认的系统范围区域设置目录,也可以使用以下命令自己指定一个bindtextdomain。当编译的 .mo 翻译文件在系统的默认位置不可用时,直接从源代码运行程序时,这非常有用。

在 Python 中你可以这样做:

import gettext
from gettext import gettext as _
gettext.bindtextdomain('nautilus-image-manipulator', '/path/to/mo/folder')
gettext.textdomain('nautilus-image-manipulator')

where /path/to/mo/folder包含着熟悉的fr/LC_MESSAGES/nautilus-image-manipulator.mo结构。像这样调用:

print _("Delete this profile")

返回正确翻译的字符串来自本地 .mo 文件, 非常感谢。

在 GTK+2/pygtk 中,存在gtk.glade.bindtextdomain http://www.pygtk.org/pygtk2reference/class-gladexml.html#function-glade--bindtextdomain,但我想知道 GTK+3/PyGObject 中是否有等效项。

给你一个具体的例子,这是这样的Nautilus 图像操纵器的 UI http://bazaar.launchpad.net/~emilien-klein/nautilus-image-manipulator/trunk/view/head:/nautilus_image_manipulator/helpers.py是从其 Glade 文件创建的:

from gi.repository import Gtk
builder = Gtk.Builder()
builder.set_translation_domain('nautilus-image-manipulator')
builder.add_from_file(ui_filename)
return builder

不是从 Glade 文件构建的 UI 部分(即从代码设置)显示正确翻译,但 Glade 文件中的字符串仍然以英语显示。

在我看来,我错过了某种电话builder.bind_text_domain('nautilus-image-manipulator', '/path/to/mo/folder')在致电之前builder.set_translation_domain...知道如何执行此操作吗?


在 PyGtk 中你也可以使用 Gtk.Builder。根据 PyGtk Gtk.Builder 文档:

http://developer.gnome.org/pygtk/stable/class-gtkbuilder.html#properties-gtkbuilder http://developer.gnome.org/pygtk/stable/class-gtkbuilder.html#properties-gtkbuilder

翻译具有以下属性值时使用的翻译域 在界面描述中被标记为可翻译。如果 翻译域为 None,GtkBuilder 使用 gettext(),否则 dgettext()。默认值:无

也就是说,Gtk.Builder 使用“C 库”中的 dgettext()。问题在于Python的gettext模块、函数绑定文本域(),出于某种我不知道的原因,不要设置“C 库”。该选项是使用locale也公开该接口的模块。来自 Python 语言环境模块文档:

http://docs.python.org/library/locale#access-to-message-catalogs http://docs.python.org/library/locale#access-to-message-catalogs

locale 模块在系统上公开 C 库的 gettext 接口 提供这个接口。它由函数 gettext() 组成, dgettext()、dcgettext()、textdomain()、bindtextdomain() 和 bind_textdomain_codeset()。这些与中的相同功能类似 gettext 模块,但使用 C 库的二进制格式作为消息 目录,以及用于定位消息的 C 库搜索算法 目录。

Python 应用程序通常不需要调用这些 函数,并且应该使用 gettext 代替。一个已知的例外 规则是与附加 C 库链接的应用程序 内部调用 gettext() 或 dcgettext()。对于这些应用,它 可能需要绑定文本域,以便库可以 正确找到他们的消息目录。

这是目前的情况。真是个黑客:S

这样就可以了,文件test.py:

from gi.repository import Gtk
from os.path import abspath, dirname, join, realpath
import gettext
import locale

APP = 'myapp'
WHERE_AM_I = abspath(dirname(realpath(__file__)))
LOCALE_DIR = join(WHERE_AM_I, 'mo')

locale.setlocale(locale.LC_ALL, '')
locale.bindtextdomain(APP, LOCALE_DIR)
gettext.bindtextdomain(APP, LOCALE_DIR)
gettext.textdomain(APP)
_ = gettext.gettext

print('Using locale directory: {}'.format(LOCALE_DIR))

class MyApp(object):

    def __init__(self):
        # Build GUI
        self.builder = Gtk.Builder()
        self.glade_file = join(WHERE_AM_I, 'test.glade')
        self.builder.set_translation_domain(APP)
        self.builder.add_from_file(self.glade_file)

        print(_('File'))
        print(_('Edit'))
        print(_('Find'))
        print(_('View'))
        print(_('Document'))

        # Get objects
        go = self.builder.get_object
        self.window = go('window')

        # Connect signals
        self.builder.connect_signals(self)

        # Everything is ready
        self.window.show()

    def main_quit(self, widget):
        Gtk.main_quit()

if __name__ == '__main__':
    gui = MyApp()
    Gtk.main()

我的林间空地文件测试空地:

<?xml version="1.0" encoding="UTF-8"?>
<interface>
  <!-- interface-requires gtk+ 3.0 -->
  <object class="GtkWindow" id="window">
    <property name="can_focus">False</property>
    <property name="window_position">center-always</property>
    <property name="default_width">400</property>
    <signal name="destroy" handler="main_quit" swapped="no"/>
    <child>
      <object class="GtkBox" id="box1">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="orientation">vertical</property>
        <child>
          <object class="GtkLabel" id="label1">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="label" translatable="yes">File</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <object class="GtkLabel" id="label2">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="label" translatable="yes">Edit</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkLabel" id="label3">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="label" translatable="yes">Find</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">2</property>
          </packing>
        </child>
        <child>
          <object class="GtkLabel" id="label4">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="label" translatable="yes">View</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">3</property>
          </packing>
        </child>
        <child>
          <object class="GtkLabel" id="label5">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="label" translatable="yes">Document</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">4</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>

记得创建 mo inmo/LANG/LC_MESSAGES/myapp.mo基于 .po 提取:

xgettext --keyword=translatable --sort-output -o en.po test.glade

它看起来像什么:

亲切的问候

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

如何在 GTK3 下将文本域绑定到本地文件夹以用于 gettext 的相关文章

  • ResultSet 对象没有属性“find_all”

    当我抓取一个网页时 我总是遇到一个问题 AttributeError ResultSet 对象没有属性 find 您可能将项目列表视为单个项目 当您打算调用 find 时 您是否调用了 find all 谁能告诉我如何解决这个问题 我的代码
  • 如何显示 pymongo.errors.OperationFailure 详细信息?

    写入 MongoDB 时 我在 python 中遇到 pymongo OperationsFailure 除了回溯之外 还有没有办法打印出详细信息或代码属性 另请参阅 http api mongodb org python current
  • url 查询中的字符 %7D 意味着什么?

    如果我使用 url 访问我的 web 应用程序 vi 5907399890173952 html 然后它就可以工作了 但是当我查看日志文件时 googlebot 会尝试访问一个类似的网址 该网址会生成异常 vi 59073998901739
  • Python + Selenium:驱动程序路径

    是否有可能在不输入路径的情况下运行 Python Selenium 脚本exePython 行中每个脚本中的文件 driver webdriver Chrome 同样的问题也适用于 IE 驱动程序 Edge 驱动程序 和 Gecko 驱动程
  • 尝试将行附加到按对象分组中的每个组时出现奇怪的行为

    这个问题是关于一个函数在应用于两个不同的数据帧时以意想不到的方式表现的 更准确地说 是 groupby 对象 要么是我遗漏了一些明显错误的东西 要么是 pandas 中存在错误 我编写了以下函数 将一行附加到 groupby 对象中的每个组
  • 在ubuntu中安装pyinterval

    我正在尝试安装 python 库 pyinterval 它需要 crlibm C 标头 我已安装该标头 没有错误 但似乎是问题的根源 当我跑步时 sudo easy install pyinterval 我得到以下信息 Searching
  • 从两个列表中查找总和等于 x 的 2 个数字的最快方法

    我的代码 n 3 a1 0 b1 10 a2 2 b2 2 if b1 gt n b1 n if b2 gt n b2 n diap1 x for x in range a1 b1 1 diap2 x for x in range a2 b
  • ibapi nextValidId 并不总是被调用

    我构建了一个小型 ibapi python 应用程序来运行一些策略 同时注意保持与 tws 的连接 如果 tws 处于非活动状态 python 应用程序将启动并等待 并在 tws 启动时连接到 tws 但这是我的问题 nextValidId
  • AMLS 实验运行停留在“正在运行”状态

    我运行了 Azure 机器学习服务实验 并使用 Jupyter Notebook 记录了神经网络损失 日志记录工作正常 神经网络训练也按预期完成 但实验一直停留在运行状态 关闭计算资源不会关闭实验运行 我无法从实验面板取消它 此外 运行没有
  • 如何实例化具有已知系数的 Scikit-Learn 线性模型而不进行拟合

    背景 作为实验的一部分 我正在测试各种保存的模型 但其中一个模型来自我编写的算法 而不是来自 sklearn 模型拟合 但是 我的自定义模型仍然是线性模型 所以我想实例化一个LinearModel实例并设置coef and intercep
  • 如何有效地找到两个轮廓集之间的所有交点

    我想知道找到两组轮廓线之间所有交点 舍入误差 的最佳方法 哪种方法最好 这是示例 import matplotlib pyplot as plt import numpy as np x np linspace 1 1 500 X Y np
  • matplotlib 示例代码不适用于 python 虚拟环境

    我正在尝试在 matplotlib 中显示图像的 x y z 坐标 示例代码 http matplotlib org examples api image zcoord html在全局 python 安装上工作得很好 当我移动光标时 x y
  • 缓存 pandas 数据框的最佳方法?

    昨天 我经历了惨痛的教训 将 pandas 数据帧保存到 csv 以供以后使用是一个坏主意 我有一个包含 130k 条推文的数据框 其中数据框的一行是list的推文 当我将数据保存到 CSV 然后重新加载数据帧时 数据帧的行现在是字符串类型
  • Pygame - 两个圆圈的碰撞检测

    我正在制作一个碰撞检测程序 其中我的光标是一个半径为 20 的圆 当它碰到另一个圆时应该将值更改为 TRUE 出于测试目的 我在屏幕中心有一个半径为 50 的固定圆 我可以测试光标圆是否击中固定圆 但它不能正常工作 因为它实际上是在测试它是
  • python中matlab find函数的替换

    我正在尝试寻找合适的python函数来替代matlabfind在我的脚本和一些谷歌搜索中我看到np where 大多数时候都能解决目的 但在双重条件的情况下 我有不同的输出 有人可以告诉我这种方法有什么问题以及如何继续吗 示例代码和差异如下
  • Python条件运算符“if else”不等于“and or”[重复]

    这个问题在这里已经有答案了 我认为下面两个函数的结果会相同 但事实并非如此 def fib2 n return n and n lt 2 or fib2 n 1 fib2 n 2 def fib3 m return m if m lt 2
  • 如何使用 Python 从 URL 中删除查询字符串

    Example http example com a text q2 text2 q3 text3 q2 text4 删除后 q2 它将返回 http example com q text q3 text3 在这种情况下 出现了多个 q2
  • 相比之下,超出了最大递归深度

    我写了这段代码来计算组合的数量 def fact n return 1 if n 1 else n fact n 1 def combinations n k return fact n fact n k fact k while True
  • 在 ubuntu 12.04 上安装 ReviewBoard

    我正在尝试使用 easy install 在 ubuntu 12 04 上安装 ReviewBoard http www reviewboard org docs manual 1 7 admin installation linux ht
  • Python Blowfish 加密

    由于我对 Java 的了解不完整 我正在努力将此加密代码转换为 Python 代码 两者应该得到完全相同的结果 帮助将不胜感激 Java函数 import javax crypto Cipher import javax crypto sp

随机推荐

  • 关闭时发送到托盘

    单击关闭按钮时如何将最小化的窗口发送到托盘 另外 如何在应用程序启动时在托盘中显示图标 WinForm 一种方法是在窗口的 F ormClosing 事件中设置 FormClosingEventArgs 的 Cancel 属性 然后最小化到
  • HAML:form_tag 困境(缩进?)

    我正在制作 用户设置表单 并坚持使用 HAML form tag 1 2 3 each do i check box tag accept i submit tag 这会导致 语法错误 意外的 kENSURE 期望 end 工作变体是 fo
  • React JS Web 代码可以用于使用 React Native 构建移动应用程序吗?

    我正在开发一个宠物项目 Web应用程序 我想知道我是否应该使用React 因为从这段代码创建本机应用程序很容易 将来如果我需要的话 如果答案是肯定的 那么应遵循的最佳实践是什么 最重用 如果答案是否定的 您能推荐一个替代方案吗 有关我的情况
  • 如何在cypress中逐页浏览?

    我的网站中有 ajax 表 并且该表有很多页面 我的目标是遍历所有行和列 转到下一页并执行以下过程 直到页面末尾 我有以下代码 for let i 0 i lt 10 i cy get tr has td each tr rowIndex
  • 资源分叉、Finder 信息或类似的碎片不允许 Xcode 8 错误? [复制]

    这个问题在这里已经有答案了 我在 Xcode 8 中运行旧项目时收到错误 在 Xcode 7 中运行的同一项目完全流量较少 我还应用以下链接中提到的解决方案 macOS Sierra Xcode 8 中的代码签名错误 不允许资源分叉 Fin
  • 在 ASP.NET 回发时保持水平和垂直滚动位置

    编码采用 ASP NET C 我有一个 gridview 有 1000 条记录 我正在内联编辑其中一行 单击 更新 时 我希望我的网格位于回发发生之前的确切 x y 位置 如果您正在考虑使用 Page 指令 MaintainScrollPo
  • Angular 为多个根路径重用相同的延迟加载模块

    我将我的应用程序分成两个模块 一个具有主要的基本功能 另一个具有较少使用的功能 例如帐户设置 常见问题解答页面等 我想要完成的是延迟加载某些根路由路径的第二个模块 例如 account or settings无需创建许多不同的模块 据我所知
  • apache2如何允许跨域请求

    这是我的配置文件
  • 使用 Gradle 将 Lint 结果发布到 Sonar

    我正在尝试使用 Gradle 将 Lint 结果发布到声纳服务器 其他分析结果已发布 但 Lint 结果未发布 有谁有让这个工作的经验吗 我找不到任何附加信息 声纳的版本是3 5 1 Gradle的版本是1 10 顶层构建文件如下所示 有
  • 在 matplotlib 中在图像上绘制网格线

    如何在 tiff 图像上绘制规则网格线 我想在图像上的每个间隔 例如 100 x 100 像素 绘制规则的方形网格 并将其与绘图一起保存 我还需要将每个网格 ID 覆盖为 1 2 在每个网格框的中间 您需要安装 python 成像库 PIL
  • 通过 JavaScript 选择 CascadingDropDown 中的项目并调用更新

    在代码隐藏中 我可以这样做来选择某些内容 Select item in first DropDownList myCascadingDropDown 1 SelectedValue itemValue 1 itemText 1 Select
  • 构造稀疏矩阵后,从稀疏到密集再到稀疏的转换会再次降低密度

    我使用 scipy 生成稀疏有限差分矩阵 最初从块矩阵构建它 然后编辑对角线以考虑边界条件 得到的稀疏矩阵是BSR类型的 我发现如果我将矩阵转换为稠密矩阵 然后使用以下命令返回稀疏矩阵scipy sparse BSR matrix函数 我留
  • 登录 WordPress 后重定向

    我正在根据现有网站创建自定义 WordPress 主题 我想使用我创建的备用仪表板 我怎样才能将用户定向到 news php 登录后而不是 wp admin EDIT 为此有一个可用的插件 但任何可以通过functions php找到手动方
  • 如何测试工厂类?

    给定这个类 class MyBuilder public function build param1 param2 build dependencies return new MyClass dep1 dep2 dep3 我如何对这个类进行
  • C 中的指针运算和运算符优先级

    背景 今天刚和一个 C 人聊天 我们在以下问题上存在分歧 int intgA 2 1 2 int intgB 2 3 5 int intAPtr intgA int intBPtr intgB 所以当我们这样做时 intAPtr intBP
  • 如何在某个 virtualenv 中列出已安装的软件包列表?

    You can cd to YOUR ENV lib pythonxx site packages 看看 但是有什么方便的方法吗 pip freeze列出所有已安装的软件包 包括系统环境的软件包 您只能列出包virtualenv by pi
  • 如何仅将背景颜色设置为选择的一部分? CSS

    我有这个样本 link https jsfiddle net 852aseb0 3 代码 HTML div class select style div
  • 在我的重写和规则 .htaccess 文件上强制使用 HTTPS

    我想在我的网站上强制使用 https 但它与我的 htaccess 的当前规则兼容 这是我现在的 htaccess 文件 RewriteEngine on RewriteCond REQUEST FILENAME f RewriteRule
  • 如何在两个 PyQt5 MainWindow 小部件之间切换

    我正在编写一个程序 它有两个不同的部分 让我们称它们为 sub1 和 sub2 当我最初运行程序时 会显示 sub1 并且我在后台加载 sub2 但不显示它 我在 sub1 中有一个菜单操作 允许您切换到 sub2 在 sub2 中有一个菜
  • 如何在 GTK3 下将文本域绑定到本地文件夹以用于 gettext

    With gettext您可以使用默认的系统范围区域设置目录 也可以使用以下命令自己指定一个bindtextdomain 当编译的 mo 翻译文件在系统的默认位置不可用时 直接从源代码运行程序时 这非常有用 在 Python 中你可以这样做