Qt语言家(Qt Linguist)忽略QML文件的更新(lupdate)。

5
运行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

在 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()
            }
        }
    }
}
3个回答

12
你可以通过在 QML 文件上运行 lupdate 命令生成翻译文件:
lupdate main.qml -ts main.ts

要通过在项目 .pro 文件上运行 lupdate 来获得 .ts 文件,您可以使用一个变通方法。据 Qt 文档: lupdate 工具从应用程序中提取用户界面字符串。lupdate 读取您的应用程序的 .pro 文件以确定哪些源文件包含要翻译的文本。这意味着您的源文件必须在 .pro 文件中的 SOURCES 或 HEADERS 条目中列出。如果未列出文件,则其中的文本将无法找到。
但是,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
}

3

从Qt 5.8.0开始,.pro文件中不再需要任何技巧。

将QML文件列在.qrc资源容器中一次,编译器、运行时应用程序和lupdate翻译工具都能正确识别:

  1. 编译器
  2. 运行时应用程序
  3. 用于翻译的lupdate

.pro文件:

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日,lupdate添加了对.qrc的支持: http://code.qt.io/cgit/qt/qttools.git/commit/?id=f2ebd51d96ad49eb826a4e37e67d506fffcbd40c 它没有在Qt 5.7.1版本中发布,但将在5.7.2版本中提供(如果有的话)。


0

使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接