8

我有几个用 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 的优缺点。

4

4 回答 4

2

所有这些都有其优点和缺点,但要更清楚地定义它们,您必须首先定义您的目标是移动环境还是桌面环境。

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

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

问候,弗洛里斯。

于 2013-05-15T10:41:33.410 回答
2

一个简单的使用理由QObject.tr()是:

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

于 2012-12-15T03:45:19.487 回答
2

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

于 2015-10-01T13:15:09.560 回答
-1

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

使用 Gettext,我们可以做到

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

而在 PyQt 中,我们做

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

于 2010-03-22T15:45:51.620 回答