【问题标题】:QML translationQML 翻译
【发布时间】:2011-12-28 06:05:21
【问题描述】:

我尝试在 QML 中使用翻译。我打开了一个新项目 QtQuick 项目,我选择了 QtQuick Componenets for Symbian 作为 QtQuick Application Type。 Qt Creator 创建了一个包含所有标准文件(main.cpp、main.qml、mainpage.qml...)的应用程序源代码树

MainPage.qml 很简单:

import QtQuick 1.1
import com.nokia.symbian 1.1

Page {
    id: mainPage
    Text {
        anchors.centerIn: parent
        text: qsTr('Hello world!')
        color: platformStyle.colorNormalLight
        font.pixelSize: 20
    }
}

我的 main.cpp 文件会像这样处理 QTranslator 的实现:

#include "qmlapplicationviewer.h"
#include <QTranslator>
#include <QPushButton>
#include <QDebug>

Q_DECL_EXPORT int main(int argc, char *argv[])
{
    QScopedPointer<QApplication> app(createApplication(argc, argv));

    QTranslator* translator = new QTranslator;

    qDebug()<<"Translating: "<<translator->load(QString("qml/International/inter_en"));

    app->installTranslator(translator);

    //QPushButton hello(QPushButton::tr("Hello world!"));
    //   hello.resize(100, 30);

    //   hello.show();

    QScopedPointer<QmlApplicationViewer> viewer(QmlApplicationViewer::create());

    viewer->setMainQmlFile(QLatin1String("qml/International/main.qml"));
    viewer->showExpanded();

    return app->exec();
}

然后我运行 lupdate mainpage.qml -ts inter_en.ts ,我使用 linguist 翻译了 POSIX 表达式“Hello world!”其他东西只是测试它正在翻译。然后我用语言学家创建了 inter_en.qm 文件。

但是当我在模拟器上运行应用程序时,我没有收到“Hello world!”已翻译,尽管翻译器已成功加载(我在 qDebug 中得到“Translating: true”)。

我确信翻译器工作正常,因为当我使用 QPushButton 取消部分代码时,(为此我再次重复 lupdate 和语言学家的事情),然后是“Hello world!” QPushButton 中的表达式翻译正确。

只有 QmlApplicationViewer 和 QML 文件没有正确执行翻译。 有什么问题吗??????

谢谢

更新

我发现以下内容:MainPage.qml 作为可重用组件导入 main.qml。如果我在 main.qml 中使用 qsTr(),则文本在 main.qml 中被正确翻译。但是 MainPage.qml 中的文本翻译不正确。我猜是因为将其作为可重用组件导入。有cmets吗?经验?

更新 2 - 解决方案

翻译文件需要区分大小写:

lupdate mainpage.qml -ts myapp_sk.ts is wrong

lupdate MainPage.qml -ts myapp_sk.ts is correct

【问题讨论】:

  • 既然您自己找到了解决方案,您应该将其粘贴为答案并接受它。
  • 很高兴您找到了解决方案,但无论如何我必须提及一些事情。我认为您没有使用最佳翻译方法。基本上通过做你正在做的事情,你需要为 N 个不同的 qml 生成 N 个文件并分别翻译它们(也许不是坏主意),然后将它们一一加载到翻译器中。为什么不在同一个文件中处理它们?对不起,如果你已经这样做了,只是我总是 lupdate myproject.pro 然后忘记了:D
  • 如果您找到了问题的答案,请考虑发布并接受。

标签: c++ qml translation symbian qt-quick


【解决方案1】:

我也使用 QML 文件作为可重用的组件,我对翻译完全没有问题。所以我想以下内容也可以帮助你。

我也猜你不想为每个文件手动调用 lupdate。因此,您应该在 .pro 文件中使用以下行,使其自动查找 QML 和 JS 文件中的所有可翻译短语(更正您的路径)...

lupdate_hack{
    SOURCES += qml/*.qml \
        qml/*.js
}
TRANSLATIONS = \
    langs/WakeOnLAN_cs.ts \
    langs/WakeOnLAN_pl.ts \
    langs/WakeOnLAN_es.ts \
    langs/WakeOnLAN_fr.ts \
    langs/WakeOnLAN_it.ts \
    langs/WakeOnLAN_hu.ts \
    langs/WakeOnLAN_fa.ts \
    langs/WakeOnLAN_de.ts \
    langs/WakeOnLAN_pt.ts
CODECFORTR = UTF-8

这不是我的想法,所以这里是出处(还有关于动态翻译的说明):https://forum.qt.io/topic/30076/is-there-a-way-to-use-linguist-in-global-context

【讨论】:

    【解决方案2】:

    如果问题不是翻译本身,而是在运行时更改语言,这可能会对您有所帮助。 如果您使用 app->installTranslator(translator); 加载新的 QTranslator; 它(QApplication)将触发一个更改事件。在您的 Qt 课程中,您必须抓住它

     /*!
        on the fly translation 
     */
     void MyQmlView::changeEvent(QEvent *event)
     {
        if (event->type() == QEvent::LanguageChange) 
        {
            // triggers qml function/slots 
            emit  retranslate();
         }
         else 
         {
             QWidget::changeEvent(event);
          }
      } 
    

    加载“main.qml”后的某个地方:

        m_pQmlView->rootContext()->setContextProperty( "_view", this );
    

    QML 方面:

    Component.onCompleted: {
    
      /**********************  Connections  ***************************/
    
    // connect Qt signal MyView::retranslate() with QML function (slot) retranslate        
     _view.retranslate.connect(retranslate)
    }
    
    // slot! 
    function retranslate () {
         lblHelloWord.text  = qsTr("Hello Word")
    }
    

    这对 MS Windows 平台非常有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-24
      • 2018-05-01
      • 1970-01-01
      • 2012-10-26
      • 1970-01-01
      相关资源
      最近更新 更多