【问题标题】:proper replacement of QString().arg method in python3在 python3 中正确替换 QString().arg 方法
【发布时间】:2013-09-10 00:45:10
【问题描述】:

谈到国际化 - 使用 python2 和 PyQt4 - 格式化翻译字符串的“建议方法”是使用 QString.arg() 方法:

from PyQt4.QtGui import QDialog
#somewhere in a QDialog:
    self.tr("string %1 %2").arg(arg1).arg(arg2)

但是QString() 在 python3-PyQt4 中不存在。

所以我的问题是,在 python3 中格式化任何已翻译字符串的最佳方式是什么?我应该使用标准的python方法str.format()还是有更合适的方法?

【问题讨论】:

  • 首先,在 PyQt4 中,明确地使用QString 绝对不是推荐的做事方式;他们只是还没有完成原生字符串和 QStrings 的集成。请注意,在 2.x 和 3.x 中,PyQt5 几乎完全隐藏了 QString。 (当我们这样做的时候,你几乎肯定会想要一个 Unicode 文字,因为否则你会交叉手指并希望你的文字被解释为 Latin-1,更不用说做一个隐含的 Latin-1-to-每次都通过这个函数进行 Unicode 转换,没有任何理由。)
  • @abarnert 是的,我在这里使用“建议的方式”一词可能是错误的。我刚刚在他的 pyqt 书中看到 Mark Summerfield 以这种方式使用它,并认为这将是正确的技术。感谢您提及。
  • 书籍很快就会过时。 2 或 3 年前,这可能是一个好主意,当时保持与 pre-2.6 Python 和 pre-4.6 Qt 的兼容性非常重要,但我的记忆并没有那么远。 :)

标签: python python-3.x internationalization pyqt4 qstring


【解决方案1】:

QString::arg 方法确实是 C++ 有限的字符串格式化支持的一种解决方法,以确保您不会使用 sprintf 解决所有相关问题(不处理不同语言中不同顺序的占位符,缓冲区溢出等)。因为 Python 没有任何此类问题,所以没有充分的理由使用它。

事实上,很少有理由明确使用QString。在 PyQt4 中,它并没有完全淘汰,但在 PyQt5 中,它是。 (从技术上讲,PyQt4 在 Python 2.x 和 3.x 中都支持“字符串 API v2”,但仅在 3.x 中默认启用;PyQt4 在两者中都默认启用 v2,并隐藏了切换回 v1 的能力。 ) 请参阅文档中的Python Strings, Qt Strings and Unicode 以获取一些附加信息。


有一个不常见但主要影响你的例外情况:如果你正在编写一个部分使用 Qt/C++ 部分使用 PyQt 的应用程序,那么当其中一些 I18N 数据是"string %1 %2" 格式,其他格式为 "string {1} {2}" 格式。 (当您第一次将文件发送给外包翻译公司时,他们肯定会弄错的。)

【讨论】:

    【解决方案2】:

    是的,只需使用标准的 python 字符串格式。

    QString 消失了,因为它几乎可以与 python 的 unicode 字符串(python3 中的 str 和 python2 中的 unicode)互换,因此 PyQt 会根据需要将一个转换为另一个。

    QString 被禁用不仅限于 python3,它只是那里的默认设置。在从PyQt4 导入任何内容之前,您可以通过这样做在 python2 上获得相同的结果:

    import sip
    sip.setapi('QString', 2)
    

    【讨论】:

    • 对字符串 API v2 的覆盖率(或至少至关重要的补充覆盖率)要好得多;展示如何在 2.x 中以 v2 方式做事非常方便。
    • 谢谢。我接受了 abarnert 的回答,因为它更详细,但您的回答也很有建设性。
    猜你喜欢
    • 2018-09-15
    • 2019-12-18
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    相关资源
    最近更新 更多