PyQt:在运行时转换模块字符串

杰罗姆

QObjects中的字符串在运行时转换。如果更改了翻译器,则将刷新所有这些字符串。但是,在导入时会翻译在模块级别甚至静态类属性中声明的字符串。

我可以看到三种允许模块字符串被翻译的方法,但我似乎都不满意:

  • 在安装翻译器之后导入模块(请参阅此处请参见“早期安装翻译器”一节))。只要可能不需要在运行时更改语言,这可能并不方便,但却是可行的。

  • 设置字符串类实例属性。好吧,是的,显然。但这破坏了设计。

  • 将字符串保持在模块级别。使用QtCore.QCoreApplication.translate()让他们通过pylupdate被拾起。然后在运行时通过调用self.tr()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()会尝试翻译一个已经翻译的字符串,该字符串在原始语言字符串集中不太可能存在,并且会默默地返回字符串本身。

    但是,例如,如果某个英语字符串碰巧翻译成一个法语字符串,而该法语字符串等于出现在同一类中的另一个英语字符串,那么将改为显示该字符串的法语翻译。

有一种干净的方法吗?

ekhumoro

我想你要找的是什么QT_TR_NOOP(或QT_TRANSLATE_NOOP如果您需要提供上下文)。

这会将字符串文字标记为需要翻译(即,使之被拾取pylupdate),但在运行时(也不导入时间)不进行任何翻译。

因此:

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))

tr()这里将转换some_string在运行时动态的,但它本身被忽略pylupdate,因为它不包含一个字符串。

请注意,QT_TR_NOOP可以将其别名为trpython中的名称(或者您可以只定义自己的伪tr函数),因为pyludate只有静态分析才能使用:

from PyQt4.QtCore import QT_TR_NOOP as tr

some_string = tr('Hello World')

你也可以使用一个真正的别名(即比其他东西trtranslate__tr,等),通过使用相应的pylupdate选项:

pylupdate -tr-function FOO file.pro

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在运行时通过字符串从 python 访问模块和模块变量

来自分类Dev

如何在运行时将字符串转换为代码

来自分类Dev

在运行时使用连接字符串

来自分类Dev

尝试在运行时编辑字符串

来自分类Dev

Dapper 在运行时更改连接字符串

来自分类Dev

运行时错误。整数转换为字符串

来自分类Dev

如何在运行时将字符串转换为其自身的带引号的版本?

来自分类Dev

在运行时将字符添加到字符串末尾

来自分类Dev

Groovy字符串插值,其值仅在运行时已知

来自分类Dev

如何在运行时更改NLog目标的连接字符串?

来自分类Dev

为什么必须在运行时构造字符串?

来自分类Dev

我可以在运行时通过评估字符串来创建函数吗?

来自分类Dev

如何构造函数注入仅在运行时已知的字符串?(温莎城堡)

来自分类Dev

字符串替换在运行时在Powershell脚本中不起作用

来自分类Dev

SQLite EF6在运行时以编程方式设置连接字符串

来自分类Dev

Azure Web服务-在运行时更改数据库连接字符串

来自分类Dev

在运行时确定字符串中Java表达式的返回类型

来自分类Dev

在运行时评估groovy字符串表达式

来自分类Dev

如何在运行时在Objective-C中查找字符串常量?

来自分类Dev

对于每个调用,在运行时将连接字符串传递给Entity Framework

来自分类Dev

实体框架-在运行时更改连接字符串(需要解释)

来自分类Dev

Castle和NLog在运行时更改连接字符串

来自分类Dev

如何在运行时将java中的字符串参数作为参数传递

来自分类Dev

在运行时更改连接字符串–这是正确的方法吗?

来自分类Dev

快速结束字符串修剪,在运行时出现错误

来自分类Dev

在Swift中可以在运行时从字符串执行代码吗?

来自分类Dev

在运行时从类的字符串名称访问值

来自分类Dev

在运行时将JSON对象的JSON字符串覆盖到JSON对象

来自分类Dev

在EF 6中在运行时更改连接字符串

Related 相关文章

  1. 1

    在运行时通过字符串从 python 访问模块和模块变量

  2. 2

    如何在运行时将字符串转换为代码

  3. 3

    在运行时使用连接字符串

  4. 4

    尝试在运行时编辑字符串

  5. 5

    Dapper 在运行时更改连接字符串

  6. 6

    运行时错误。整数转换为字符串

  7. 7

    如何在运行时将字符串转换为其自身的带引号的版本?

  8. 8

    在运行时将字符添加到字符串末尾

  9. 9

    Groovy字符串插值,其值仅在运行时已知

  10. 10

    如何在运行时更改NLog目标的连接字符串?

  11. 11

    为什么必须在运行时构造字符串?

  12. 12

    我可以在运行时通过评估字符串来创建函数吗?

  13. 13

    如何构造函数注入仅在运行时已知的字符串?(温莎城堡)

  14. 14

    字符串替换在运行时在Powershell脚本中不起作用

  15. 15

    SQLite EF6在运行时以编程方式设置连接字符串

  16. 16

    Azure Web服务-在运行时更改数据库连接字符串

  17. 17

    在运行时确定字符串中Java表达式的返回类型

  18. 18

    在运行时评估groovy字符串表达式

  19. 19

    如何在运行时在Objective-C中查找字符串常量?

  20. 20

    对于每个调用,在运行时将连接字符串传递给Entity Framework

  21. 21

    实体框架-在运行时更改连接字符串(需要解释)

  22. 22

    Castle和NLog在运行时更改连接字符串

  23. 23

    如何在运行时将java中的字符串参数作为参数传递

  24. 24

    在运行时更改连接字符串–这是正确的方法吗?

  25. 25

    快速结束字符串修剪,在运行时出现错误

  26. 26

    在Swift中可以在运行时从字符串执行代码吗?

  27. 27

    在运行时从类的字符串名称访问值

  28. 28

    在运行时将JSON对象的JSON字符串覆盖到JSON对象

  29. 29

    在EF 6中在运行时更改连接字符串

热门标签

归档