【问题标题】:Qt linguist lupdate ignores qml filesQt 语言学家 lupdate 忽略 qml 文件
【发布时间】:2014-05-31 16:00:01
【问题描述】:

当运行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()
            }
        }
    }
}

【问题讨论】:

    标签: qt internationalization qml qt5 qt-linguist


    【解决方案1】:

    您可以通过在 QML 文件上运行 lupdate 来生成翻译文件:

    lupdate main.qml -ts main.ts
    

    要通过在项目 .pro 文件上运行 lupdate 来获取 .ts 文件,您可以使用一种解决方法。来自 Qt 文档:

    lupdate 工具从您的 应用。 lupdate 读取应用程序的 .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
    }
    

    【讨论】:

      【解决方案2】:

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

      QML 文件可以在 .qrc 资源容器中列出一次,它们将被以下人员正确提取:

      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

      .qrc 支持于 2016 年 10 月 25 日添加到 lupdate: http://code.qt.io/cgit/qt/qttools.git/commit/?id=f2ebd51d96ad49eb826a4e37e67d506fffcbd40c 它没有进入 Qt 5.7.1 版本,但它将在 5.7.2 中可用(如果有的话)。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-21
          • 2014-12-26
          • 2012-02-10
          • 2018-11-12
          • 2012-12-18
          • 1970-01-01
          相关资源
          最近更新 更多