2010-01-07 56 views
8

我有几个应用程序用PyQt4编写,我已经使用标准Python gettext库进行GUI的国际化和本地化。它适合我。但是我选择gettext仅仅是因为我已经有了gettext使用的知识和经验,并且没有使用Qt4 tr()方法的经验。使用gettext代替QObject.tr()进行PyQt4应用本地化的优缺点?

现在我想更好地比较这两种方法,并通过使用gettext而不是QObject.tr来了解我所缺少的东西,以及为什么我不应该使用gettext来处理Qt4/PyQt4应用程序吗?

在使用的gettext的我的理解优点是:

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

我看到了什么是QObject.tr()的优点:

  • 这是本土技术的Qt4/PyQt4的,所以也许它会工作得更好/更快(虽然我没有数据证明)。
  • 要翻译的消息可以具有附加的上下文信息,这将有助于翻译者为同音词词汇选择最佳变体,例如,根据实际情况,英文单词“Letter”可以翻译为“字符”,“邮件”或甚至“纸张大小”类型。

我看到了什么是QObject.tr的缺点()VS的gettext:

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

但是,上述所有项目都不够清楚地说任何工具都比其他工具更好。我不想开始火焰战争,因为这很主观。我只想知道我缺少的QObject.tr()与gettext的利弊。

回答

-1

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

随着Gettext的,我们能做到

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

而在PyQt的,我们做

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

2

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

这样可以节省你的需要在Windows上安装gettext,使跨平台的工作更容易一些。 我尝试在Windows上尽可能少地使用二进制依赖关系。

2

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

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

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

Greetings, Floris。

2

在当前的时间,当你利用QT_TRANSLATE_NOOP的

+1

我想补充Qt不处理复数形式的'TR(“您选择了%N项目(S)”,item.count ())'看起来好像它可能工作,但它在Qt的系统中记录很差,如果说你真的想要两个(或更多)不同的字符串,而不仅仅是一个后缀,真的没有解释如何放置:'tr(“ %n item {is | s are}现在处于选择状态。“,,item.count())' – SlySven 2016-01-19 07:38:36