QML翻译

时间:2011-11-13 22:30:55

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

我尝试在QML中使用翻译。我开了一个新项目QtQuick项目,我选择QtQuick Componenets for Symbian作为QtQuick应用程序类型。 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,我用语言学家来翻译POSIX表达式“Hello world!”别的东西只是测试它正在翻译。然后我用语言学家创建了inter_en.qm文件。

但是当我在模拟器上运行应用程序时,我不会得到“Hello world!”翻译,虽然翻译成功加载(我在qDebug中得到“翻译:真实”)。

译者工作正常我肯定,因为当我用QPushButton去除部分代码时,(我再次为此目的重复lupdate和语言学的东西),然后是“Hello world!” QPushButton中的表达式被正确翻译。

只有QmlApplicationViewer和QML文件无法正确执行翻译。 有问题?????

由于

更新

我发现了以下内容:MainPage.qml作为可重用组件导入main.qml。如果我在main.qml中使用qsTr(),则在main.qml中正确翻译文本。但是,MainPage.qml中的文本未正确转换。我想由于将其导入为可重用组件。任何意见?经历?

UPDATE2 - 解决方案

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

lupdate mainpage.qml -ts myapp_sk.ts is wrong

lupdate MainPage.qml -ts myapp_sk.ts is correct

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

如果问题不是翻译本身,而是在运行时更改语言,这可能会对您有所帮助。 如果您使用app-> installTranslator(翻译器)加载新的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);
      }
  } 

在加载&#34; main.qml&#34;:

之后
    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平台非常有用。