PyQt:在运行时翻译模块字符串

2024-01-21

字符串在QObjects 在运行时翻译。如果翻译器发生变化,所有这些字符串都会刷新。但是,在模块级别声明的字符串甚至静态类属性都会在导入时进行翻译。

我可以看到 3 种允许翻译模块字符串的方法,但其中没有一种让我完全满意:

  • 安装翻译器后导入模块(请参阅here https://plashless.wordpress.com/2014/02/01/internationalizing-python-pyqt-apps/(段落尽早安装翻译器))。这可能不太方便,但是是可行的,只要不需要在运行时更改语言即可。

  • 制作字符串类实例属性。嗯...是的,显然。但这破坏了设计。

  • 将字符串保留在模块级别。使用QtCore.QCoreApplication.translate()让 pylupdate 获取它们。然后在运行时通过调用(再次)翻译它们self.tr() or QtCore.QCoreApplication.translate()在他们。例子 :

    translate = QtCore.QCoreApplication.translate
    strings = [translate('foo'), translate('bar')]
    
    class my_class(QObject):
    
        def __init__(self):
            for s in strings:
                print(self.tr(s))
    

    执行此操作时,必须确保在模块导入之前不会安装翻译器,否则,模块字符串会在导入时(声明中的 translate())进行翻译,并在运行时(类实例中的 self.tr())重新翻译。在一般情况下,这不会被看到: self.tr() 将尝试翻译一个已经翻译的字符串,该字符串不可能存在于原始语言字符串集中,并且它将默默地返回字符串本身。

    但是,如果英语字符串碰巧翻译成法语字符串,并且该法语字符串与同一类中出现的另一个英语字符串相同,则将显示该字符串的法语翻译。

有没有一种干净的方法可以做到这一点?


我想你正在寻找的是QT_TR_NOOP http://doc.qt.io/qt-4.8/qtglobal.html#QT_TR_NOOP (or QT_TRANSLATE_NOOP http://doc.qt.io/qt-4.8/qtglobal.html#QT_TRANSLATE_NOOP如果您需要提供上下文)。

这会将字符串文字标记为需要翻译(即,以便由pylupdate),但它不会在运行时(也不导入时)进行任何翻译。

Thus:

from PyQt4.QtCore import QT_TR_NOOP

some_string = QT_TR_NOOP('Hello World')

class SomeClass(QObject):
    def do_something(self):
        print(self.tr(some_string))

The tr()这里会翻译some_string在运行时动态地运行,但它本身会被忽略pylupdate因为它不包含字符串文字。

注意QT_TR_NOOP可以是该名称的别名tr在 python 中(或者你可以定义你自己的虚拟tr函数),因为pyludate只进行静态分析:

from PyQt4.QtCore import QT_TR_NOOP as tr

some_string = tr('Hello World')

您还可以使用真正的别名(即除tr, translate, __tr等),通过使用相应的pylupdate option:

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

PyQt:在运行时翻译模块字符串 的相关文章

  • 如何使用 QWebElement 设置 input(type="file") 的值?

    我正在尝试将照片上传到vk com https vk com using QtWebKit https qt project org doc qt 4 8 qtwebkit html模块 我面临的问题是无法正确填写input type fi
  • Magento,翻译验证错误消息

    我已经成功创建了原型验证的新规则 现在我需要翻译错误消息 位置 Javascript 中的字符串 但是 我只能翻译所有消息 我的新自定义消息似乎无法翻译 我该如何改变这个 也许你需要一个jstranslator xml里面的文件etc fo
  • 如何在点击 Qtablewidget 单元格时获取放置在该单元格中的小部件的行号?

    我正在尝试的是当用户选择项目时获取 QcomboBox 的行号 虽然使用它很容易获得单元格的列和行 cellClicked int int 信号 但仅当单元格上没有小部件时才有效 那么如果单元格中放置了小部件 如何获取行号 Note 所有组
  • QGroupBox边框

    经过一段时间的搜索后 我发现在组框上设置可见边框的方法是使用 StyleSheet 属性 我补充道 border 2px solid gray 但有几个问题 1 组框内的所有内容也继承此设置 2 边框在标题附近有一个小洞 碎片缺失 Here
  • 为 Qt 应用程序创建 Linux 安装

    我刚刚用 Qt Creator 制作了一个很棒的程序 我对自己很满意 如何将其从台式机移至笔记本电脑 那么 最好的方法是安装程序 对吗 对于 Ubuntu 这是一个 Debian 软件包 对吗 我怎么做 有人这样做过吗 他们可以分享 QT
  • 重定向 python 交互式帮助()

    我正在为使用 Qt 的应用程序开发交互式 python shell 但是我似乎无法获得重定向的交互式帮助 我的 python 代码中有这个 class OutputCatcher def init self self data def wr
  • 使用 Pyinstaller 打包:PyQt4.QtGui.setStyle 被忽略?

    问题 如何在 Ubuntu 14 04 上使用 Pyinstaller 为我的应用程序设置 PyQt 样式 Details 我在 Windows 上使用 pyinstaller 打包了一个 PyQt4 Python 应用程序 它似乎工作正常
  • 在Qt中,如何正确实现委托?

    我遵循模型 视图 控制器范例 我很确定模型和视图是正确的 但我认为我的代表做错了一些事情 一切都 有效 除了第一次单击控件只是 点亮控件 而第二次单击与之交互之外 这是代表通常的实施方式吗 我的实现需要大量的构造和销毁 由scoped pt
  • Qmake 不支持源目录下的构建目录

    我创建了一个可以在 OS X 上编译和运行的应用程序 我现在想开始让它在 Windows 上运行 首先 我将项目复制到 Windows 机器上并尝试编译 但收到此错误 警告 Qmake不支持源目录下的构建目录 有任何想法吗 将影子构建目录设
  • django 根据 UserProfile.language() 字段数据发送本地化电子邮件

    在我的优惠网站中 如果优惠满足某些要求 模型中指定的过滤器 用户可以设置电子邮件警报 因此 当用户 A 添加报价时 post save 信号将发送到 celery 并检查是否应用了用户警报过滤器 如果有 则发送电子邮件 问题是我不知道如何安
  • 取消选中单选按钮 - PyQt4

    在此代码示例中 from PyQt4 QtGui import QDialog QPushButton QRadioButton QHBoxLayout QApplication QButtonGroup import sys class
  • 如何为 qDebug 重载运算符 <<

    我正在尝试为存储数据的类创建更有用的调试消息 我的代码看起来像这样 include
  • QTableView 选择已更改

    我有一个QTableView我需要从中获取选择更改事件 我似乎无法让连接工作 我有 MyWidget h protected slots void slotLoadTransaction const QItemSelection selec
  • mouseDoubleClickEvent 与 QLineEdit

    我怎样才能拥有一个QLineEdit默认情况下无法 但当收到mouseDoubleClickEvent 我该如何实施mouseDoubleClickEvent 当我尝试以下操作时 我总是收到错误 参数不足 if self MyQLineEd
  • Django:如何为应用程序添加中文支持

    我正在尝试将中文添加到我用 Django 编写的应用程序中 但我确实遇到了困难 我花了半天时间尝试了不同的方法 但没有成功 我的应用程序支持几种语言 这是设置 py file TIME ZONE Europe Dublin LANGUAGE
  • 仅在发布模式下使用 glGenBuffer 时出现未处理的异常 - QT

    我在 Windows 7 上使用 Qt 4 8 发布模式编译项目时遇到了一些问题 调试时一切正常 但在发布时我收到未处理的异常 0xC0000005 访问冲突 我将范围缩小到发生这种情况的行 即生成像素缓冲区的时间 我的第一个猜测是 DLL
  • 清除pyqt中布局中的所有小部件

    有没有办法清除 删除 布局中的所有小部件 self plot layout QtGui QGridLayout self plot layout setGeometry QtCore QRect 200 200 200 200 self r
  • 在 Qt 中使用多个不同的流读取同一文件

    使用 Qt 是否可以使用多个流读取文件以同时访问其中的不同数据部分 请注意 Qt 中的流 QTextStream QDataStream 不处理底层设备中的位置 流类只是一个包装器 用于更轻松地解析设备 QFile 实例 内的二进制数据 因
  • 如何从 C++ 程序中重新启动 Linux?

    我有一个 Qt 4 GUI 我需要在下拉菜单中提供一个选项 允许用户选择重新启动计算机 我意识到这对于以其他方式重新启动计算机的能力来说似乎是多余的 但选择需要保留在那里 我尝试使用 system 来调用以下内容 suid root she
  • 在 Django 中翻译文件时的 Git 命令

    我在 Django 中有一个现有的应用程序 我想在页面上添加翻译 在页面上我有 trans Projects 在 po 文件中我添加了 templates staff site html 200 msgid Projects msgid P

随机推荐