运行lupdate
时,不识别qml文件中的qsTr
。生成的.ts文件不包含任何翻译上下文。
$ lupdate -verbose App.pro
Updating 'translations/en.ts'...
Found 0 source text(s) (0 new and 0 already existing)
项目应该正确设置:
OTHER_FILES +=
content/main.qml
TRANSLATIONS +=
translations/en.ts
In the main。QML等:
menuBar: MenuBar {
Menu {
title: qsTr("File")
MenuItem {
text: qsTr("Open")
onTriggered: Qt.quit();
}
}
Menu {
title: qsTr("...")
MenuItem {
text: qsTr("About")
onTriggered: {
aboutApplicationDialog.open()
}
}
}
}
您可以通过在QML文件上运行lupdate
来生成翻译文件:
lupdate main.qml -ts main.ts
要通过在项目.pro文件上运行lupdate
来获取.ts文件,您可以使用一种变通方法。来自Qt文档:
lupdate工具从您的应用程序。Lupdate读取应用程序的.pro文件来识别哪些源文件包含要翻译的文本。这意味着你的的SOURCES或HEADERS条目中必须列出源文件.pro文件。如果你的文件没有被列出,其中的文本也不会被列出发现。
然而,SOURCES变量用于c++源文件。如果你列出QML或JavaScript源文件在那里,编译器尝试构建就好像它们是c++文件一样。作为一种变通方法,您可以使用lupdate_only{…}条件语句,以便lupdate工具看到.qml文件,但c++编译器会忽略它们。
如果您在应用程序中指定。qml文件,如:
lupdate_only{
SOURCES = content/main.qml
}
当您在项目.pro上运行lupdate
时,生成的.ts文件将包含QML翻译上下文。
请注意,您必须坚持使用所示的大括号样式,使用替代样式,例如
# DON'T USE, FAILS!
lupdate_only
{
SOURCES = content/main.qml
}
失败(至少在OS X 10.12/Qt 5.7上),伴随着大量的编译器警告和错误,这些警告和错误远远没有给出任何实际问题的提示,例如
clang: warning: <qml source file>: 'linker' input unused
clang: warning: argument unused during compilation: '-g'
clang: warning: argument unused during compilation: '-isysroot /Applications/Xcode_7.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk'
...
clang: error: no such file or directory: 'Page1.o'
clang: error: no such file or directory: 'Page1Form.ui.o'
或者,您可以使用延续字符:
lupdate_only
{
SOURCES = content/main.qml
}
从Qt 5.8.0开始在.pro文件中不再需要任何技巧
QML文件可以在.qrc资源容器中列出一次,并且它们将通过以下命令正确地拾取:
- 编译器
- 应用程序在运行时
- 翻译更新
。支持文件:
RESOURCES += application.qrc
。qrc是一个XML文件,通常通过qtcreator进行管理,而无需查看其内容。更多关于qrc文件的信息可以在这里找到:http://doc.qt.io/qt-5/qtquick-deployment.html managing-resource-files-with-the-qt-resource-system
。在2016-10-25的更新中增加了QRC支持:http://code.qt.io/cgit/qt/qttools.git/commit/?id=f2ebd51d96ad49eb826a4e37e67d506fffcbd40c它没有在Qt 5.7.1版本中发布,但它将在5.7.2(如果有的话)中可用。
使用lupdate_only
似乎是可行的解决方案。但是请注意,QtCreator也会将qml文件作为源文件,所以现在当您导航项目时,列出的所有qml文件都是重复的。
为了避免这种情况,我使用了一种不同的方法,通过shell脚本更新翻译:
#!/bin/bash
../../5.5/gcc_64/bin/lupdate *.pro
for tr in *.ts
do
../../5.5/gvv_64/bin/lupdate *.qml -ts $ts
done