【问题标题】:Pros and cons of using gettext instead of QObject.tr() for localization of PyQt4 application?使用 gettext 而不是 QObject.tr() 来本地化 PyQt4 应用程序的利弊?
【发布时间】:2011-01-02 13:20:00
【问题描述】:

我有几个用 PyQt4 编写的应用程序,我使用标准 Python gettext 库来实现 GUI 的国际化和本地化。它对我有用。但我选择 gettext 只是因为我已经拥有 gettext 使用方面的知识和经验,并且对 Qt4 tr() 方法的经验为零。

现在我想更好地比较这两种方法,并通过使用 gettext 而不是 QObject.tr 来了解我所缺少的东西,是否有任何严重的理由不应该将 gettext 用于 Qt4/PyQt4 应用程序?

据我了解,使用 gettext 的优点是:

  • GNU gettext 已经成熟,它似乎是 GNU/Linux 世界中事实上的标准。
  • PO 文件有足够的特殊编辑器来简化翻译人员的工作,尽管 PO 模板的文本性质使其不是绝对必要的。
  • 甚至还有可用于协作翻译的网络服务。
  • gettext 是标准的 Python 库,所以我不需要安装任何特殊的东西就可以在运行时使用它。
  • 它对通过 ngettext() 选择单/复数形式有很好的支持。

我认为 QObject.tr() 的优点:

  • 这是 Qt4/PyQt4 的本机技术,所以它可能会更好/更快地工作(尽管我没有数据可以证明)。
  • 要翻译的消息可能包含额外的上下文信息,这将帮助翻译人员为同音词选择最佳变体,例如英文单词“Letter”可以根据实际情况翻译为“Character”、“Mail”甚至是“Paper size”。

我认为 QObject.tr() 与 gettext 的缺点:

  • 我没有在 Qt 文档中找到如何支持单数/复数选择。
  • Qt4 TS 翻译模板是 XML 格式,因此在没有特殊编辑器 (QT Linguist) 的情况下编辑起来更加复杂,而且似乎没有其他第三方解决方案或 Web 服务。因此,翻译人员需要学习新工具(如果他们已经熟悉 PO 工具)。

但以上所有项目都不足以明确说明任何工具优于其他工具。而且我不想就什么是更好的事情展开激烈的战争,因为它非常主观。我只想知道我缺少 QObject.tr() 与 gettext 的优缺点。

【问题讨论】:

    标签: internationalization pyqt4 gettext localization


    【解决方案1】:

    目前,当您使用 QT_TRANSLATE_NOOP 时,Qt 不处理复数形式

    【讨论】:

    • 我要补充一点,tr( "You have selected %n item(s)", , item.count() ) 看起来好像可以工作,但它在 Qt 系统中的记录非常差,如果说你真的想要两个(或更多),真的没有解释如何放置东西不同的字符串,而不仅仅是一个后缀:tr( "%n item{ is|s are} now in selection.", , item.count() )
    【解决方案2】:

    各有优缺点,但要更清楚地定义它们,您必须首先定义是针对移动环境还是桌面环境。

    在我们公司内部,我们使用不同的方法仅仅是因为尚不存在理想的解决方案。 对于桌面开发,我们使用 PO 文件只是因为按钮没有缩放,因此文本适合。 对于移动开发,字符串的翻译取决于按钮大小,在横向和纵向设备上可能会有所不同。 所以这有点复杂,因为 PO 文件只能有某个单词的 1 个翻译。 所以我们为此选择了 XLIFF,这样我们就可以为字符串分配唯一的 ID。 这也不是一件容易的事,因为没有好的解决方案可以将 .RC 文件转换为 XLIFF 文件。 (因为当前的工具会在 "" 之间转换所有字符串,这当然是不受欢迎的行为)。 所以我为这个任务写了一个转换器。

    但是,在考虑本地化时,复数形式非常重要,因此没有这不是一个好的本地化解决方案。 因此,我会说去 PO gettext。

    您好, 弗洛里斯。

    【讨论】:

      【解决方案3】:

      使用QObject.tr() 的一个简单原因是:

      它省去了在 Windows 上安装 gettext 的需要,使跨平台工作更容易一些。 我尝试在 Windows 上尽可能少地使用二进制依赖项。

      【讨论】:

        【解决方案4】:

        您可以添加 args 的管理方式不同...

        有了Gettext,我们可以做到

        _("Hello %(name)s from %(city)s") % {person.__dict__}

        而在 PyQt 中,我们这样做

        self.tr("Hello %1 from %2").arg(person.name).arg(person.city)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-10-21
          • 2015-09-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多