如何使用gettext使QML文件可翻译

我想基于Python(PySide)和QML编写一个QtQuick应用程序。
我知道Qt应用程序有自己的翻译技术,但是我想在这个应用程序中坚持使用gettext。我想知道是否有可能:
- 在QML文件中标记需要翻译的字符串,以便gettext工具可以将它们提取到.pot文件中 - 在运行时让gettext翻译QML文件
我知道这在Unity 2D代码中是用C++实现的,所以我想知道如何在Python中实现。
注意:我指的是在运行时完全使用gettext,而不是在gettext和Qt Linguist格式之间进行转换。
2个回答

一般来说,在QT中无法使用gettext翻译,因为该库使用了内部的翻译机制(Qtranslate和.ts文件),如QTBUG-2404所述。
然而,有一个可行的替代方案。
QT附带了一个名为lconvert的工具包,可以用于将.ts文件转换为.po文件,反之亦然。
因此,您可以使用以下命令提取所有的翻译内容: lupdate 然后使用lconvert生成一个po文件: lconvert -of po -o file.po file.ts
翻译完成后,您可以将po文件转换回ts文件: lconvert -of ts -o file.ts file.po
然后您就可以在软件中使用它了。 lupdate既适用于QT也适用于QtQuick。

1谢谢你的回答!我知道有转换工具,但它们无法在运行时加载翻译。我知道在C++中可以通过覆盖Qt的翻译调用来实现技术上的可能性,就像Unity 2D团队所做的那样,我只是想弄清楚如何在Python中实现这一点。 - David Planella

你可以通过修改lupdate的源代码,用你喜欢的东西替代qsTr(容易),然后使用你修改过的lupdate + lconvert + 你的自定义libintl来实现使用gettext目标。

1请解释如何操作。 - Kaz Wolfe
打开qdeclarative.cpp(在lupdte源代码中),找到"qsTr"并替换为任何你想要的内容,假设使用"dsTr"。 然后在qml中使用dsTr("你的字符串")。使用lconvert生成一个pot文件,然后使用修改后的lupdate生成一个ts文件。 最后,你需要实现并导出dsTr到全局上下文中。 - snyh
请继续将其放入答案中。作为一个一般规则,始终说明如何操作,然后提供来源。 - Kaz Wolfe