【问题标题】:Whats the correct way to translate a "dynamic" string in PyQt在 PyQt 中翻译“动态”字符串的正确方法是什么
【发布时间】:2013-08-21 15:10:47
【问题描述】:

为了允许QGIS 的 Python 插件国际化,我使用 QCoreApplication.translate(),如下所示:

message = QCoreApplication.translate('Multipart split',"No multipart features selected.")

如何准备动态字符串,如下所示,

message = "Splited " + str(n_of_splitted_features) + " multipart feature(s)" 

翻译,不需要像这样打破每个子字符串

message = QCoreApplication.translate('Multipart split','Splited ') + str(n_of_splitted_features) + QCoreApplication.translate('Multipart split', 'multipart feature(s)')

这似乎不是最好的选择。

我发现在 C++ 中使用 tr().arg(),可以做到这一点:

statusBar()->showMessage(tr("Host %1 found").arg(hostName))

但我无法使用 Python 进行复制。

【问题讨论】:

    标签: python pyqt translation


    【解决方案1】:

    tr 方法的结果上尝试format 命令:

    statusBar().showMessage(tr("Host {0} found").format(hostName))
    

    ts 文件中的翻译也应该包含{0} 字符串。

    编辑:在 Python 2.7 中,您只需键入 {} 而无需 0

    【讨论】:

    • 感谢您的回答。不幸的是,tr 方法未被识别,这就是我使用 QCoreApplication.translate() 的原因。我将尝试使用 {} 并在其中格式化。
    • "...您可以简单地键入 {} 而不带 0。" 没有。永远不要这样做。 用于国际化的参数应始终明确编号(例如,{0} 而不是{})。为什么?因为非英语语言可能会以不同的顺序插入参数,在这种情况下,隐式编号的 {} 样式参数将可翻译。有关展示两个英语和挪威语句子之间这种差异的真实示例,请参阅"Using Numbered Arguments."
    【解决方案2】:

    我自己找到了解决方案,也许它对其他人有用。

    message = QCoreApplication.translate('Multipart split', "Splited %d multipart feature(s)") %(n_of_splitted_features)
    

    【讨论】:

    • 晚了几年——你的答案几乎是@Frodon 建议的,应该被接受。事实上,如果你关注coding style,你应该使用他的建议,比如:message = QCoreApplication.translate('Multipart split', 'Splited {0} multipart feature(s)'.format(n_of_splitted_features))
    • 确实如此。多年以后,我的python技术进步了一点,现在我能认出你说的话了。谢谢。正义已得到伸张。
    • 实际上,这个答案可以说是更可取的解决方案。为什么?因为QObject.tr() 被设计破坏,而QCoreApplication.translate() 不是。 Riverbank 自己 strongly recommend 后者的用法:“PyQt5 的行为不令人满意,将来可能会改变。建议优先使用translate(),而不是tr()这是有保证的与当前和未来版本的 PyQt5 一起工作,并使得在 Python 和 C++ 代码之间共享消息文件变得更加容易。”
    猜你喜欢
    • 2013-12-26
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 2014-08-26
    • 1970-01-01
    相关资源
    最近更新 更多