使用gettext而不是QObject.tr()来优化PyQt4应用程序的本地化的优缺点?

bia*_*lix 8 localization gettext internationalization pyqt4

我有几个用PyQt4编写的应用程序,我使用标准的Python gettext库来实现GUI的国际化和本地化.它对我有用.但我之所以选择gettext只是因为我已经掌握了gettext的使用知识和经验,而且没有使用Qt4 tr()方法的经验.

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

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

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

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

  • 这是Qt4/PyQt4的原生技术,所以它可能会更好/更快(尽管我没有数据可以证明).
  • 要翻译的消息可能有其他上下文信息,这将有助于翻译人员选择谐音词的最佳变体,例如,英文单词"Letter"可以翻译为"Character","Mail"或甚至是"Paper size"的类型,具体取决于实际情况.

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

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

但是上面的所有项目都不够严谨,无法明确表示任何工具都比其他工具更好.而且我不想对更好的事情展开火焰战争,因为它非常主观.我只是想知道我错过了QObject.tr()vs gettext的优点和缺点.

lep*_*rem -1

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

有了 Gettext,我们可以做到

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

而在 PyQt 中,我们这样做

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