【发布时间】:2015-03-13 14:48:51
【问题描述】:
QObjects 中的字符串在运行时进行翻译。如果更改了翻译器,所有这些字符串都会被刷新。但是,在模块级别声明的字符串甚至是静态类属性,都会在导入时进行翻译。
我可以看到 3 种允许翻译模块字符串的方法,但没有一种方法让我完全满意:
安装翻译器后导入模块(见here(段落尽早安装翻译器))。这可能不方便,但可行,只要不需要在运行时更改语言。
使字符串类实例属性。嗯……是的,很明显。但这破坏了设计。
-
将字符串保留在模块级别。使用
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() 将尝试翻译一个已翻译的字符串,该字符串不太可能存在于原始语言字符串集中,它会默默地返回字符串本身。
但是,例如,如果一个英语字符串恰好翻译成一个法语字符串,该字符串等于另一个出现在同一类中的英语字符串,那么将显示该字符串的法语翻译。
有没有一种干净的方法?
【问题讨论】:
标签: qt4 pyqt4 translation