PyQt5应用程序的国际化

   PyQt5应用程序的国际化

PyQt5和Qt包含一整套用于将应用程序翻译成本地语言的工具。有关完整说明,请参阅Qt文档中的Qt语言学手册。

使应用程序国际化的过程包括以下步骤。

  • 程序员使用pylupdate5.ts 应用程序要翻译成的每种语言创建或更新翻译文件。一个.ts文件是包含要翻译的字符串,并已作出相应的翻译的XML文件。 pylopdate5可以在开发过程中运行任意次,以.ts使用最新的字符串更新文件进行翻译。
  • 翻译使用Qt Linguist来更新.ts具有字符串翻译的文件。
  • 然后,发布管理器使用Qt的lrelease实用程序将.ts文件转换为 文件,这些.qm文件是应用程序使用的紧凑二进制等效项。如果应用程序找不到合适的.qm文件,或者某个特定字符串尚未翻译,则使用原始源代码中使用的字符串。
  • 发布管理可以选择使用pyrcc5.qm 文件以及其他应用程序资源(如图标)嵌入到Python模块中。这可以使应用程序的打包和分发更容易。

   

   pylupdate5 

pylupdate5是PyQt5的等同于Qt的lupdate工具和以完全相同的方式使用。.pro读取Qt 项目文件,该文件指定Python源文件和Qt Designer接口文件,从中提取需要翻译的文本。该.pro文件还指定了pylupdate5更新(或必要时创建)的.ts翻译文件,随后由Qt Linguist使用。

 

   PyQt5和Qt之间的差异

Qt通过QTranslator类以及 translate和 tr方法实现国际化支持 。通常 tr用于获取消息的正确翻译。翻译过程使用消息上下文来允许以不同方式翻译相同的消息。在Qt中,tr 实际上是由moc硬编码的类名作为上下文生成的。另一方面,translate允许明确指定上下文。

不幸的是,由于Qt实现tr的方式 ,PyQt5不可能精确地再现它的行为。tr的PyQt5实现 使用实例的类名作为上下文。关键差异和潜在问题的根源是,上下文是在PyQt5中动态确定的,但在Qt中是硬编码的。换句话说,翻译的上下文可能会根据实例的类层次结构而改变。例如:

class A(QObject):
    def hello(self):
        return self.tr("Hello")

class B(A):
    pass

a = A()
a.hello()

b = B()
b.hello()

在上文中,通过a.hello()使用上下文 Ab.hello()使用上下文来翻译消息B。在等效的C ++版本中,上下文将A在两种情况下都有。

PyQt5的行为不令人满意,将来可能会改变。建议使用translate优先于tr。这保证可以与PyQt5的当前和未来版本一起使用,并且可以更容易地在Python和C ++代码之间共享消息文件。以下是A使用 translate的替代实现:

class A(QObject):
    def hello(self):
        return QCoreApplication.translate('A', "Hello")
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值