首页
学习
活动
专区
圈层
工具
发布

QML翻译
EN

Stack Overflow用户
提问于 2011-11-13 22:30:55
回答 2查看 3.4K关注 0票数 6

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

MainPage.qml非常简单:

代码语言:javascript
复制
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的实现:

代码语言:javascript
复制
#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!“其他的东西,只是测试一下它在翻译。然后,我用语言学家创建了inter_en.qm文件。

但是当我在模拟器上运行这个应用程序时,我没有得到"Hello!“翻译,尽管翻译成功(我在qDebug中得到了“翻译:真”)。

我确信翻译器工作正常,因为当我用QPushButton读取代码的一部分时(再次重复lupdate和语言学家的内容),然后是"Hello!“QPushButton中的表达式被正确翻译。

只有QmlApplicationViewer和QML文件没有正确地执行转换。有什么疑问吗?

谢谢

更新

我发现: MainPage.qml作为可重用组件导入到main.qml中。如果我在qsTr()中使用main.qml,那么文本将在main.qml中正确翻译。然而,MainPage.qml中的文本并不是正确的。我想是因为将它作为可重用组件导入。有什么评论吗?经验?

UPDATE2 -解决方案

翻译文件需要敏感地创建案例:

代码语言:javascript
复制
lupdate mainpage.qml -ts myapp_sk.ts is wrong

lupdate MainPage.qml -ts myapp_sk.ts is correct
EN

回答 2

Stack Overflow用户

发布于 2016-07-13 14:03:54

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

代码语言:javascript
复制
 /*!
    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”之后:

代码语言:javascript
复制
    m_pQmlView->rootContext()->setContextProperty( "_view", this );

QML侧:

代码语言:javascript
复制
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平台来说是非常好的。

票数 1
EN

Stack Overflow用户

发布于 2016-01-02 20:42:16

我还使用QML文件作为可重用的组件,对翻译完全没有问题。所以我想以下几点也能帮到你。

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

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8115277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档