Перевод QML

Я стараюсь использовать перевод в QML. Я открыл новый проект QtQuick project, я выбрал QtQuick Componenets для 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, я использовал linguist для перевода выражения POSIX "Hello world!" к чему-то другому, просто проверьте, что он переводится. Затем я вместе с лингвистом создал файл inter_en.qm.

Но когда я запускаю приложение на симуляторе, я не получаю "Hello world!" переведено, хотя переводчик загружен успешно (я получаю "Translating: true" в qDebug).

Я уверен, что переводчик работает правильно, потому что, когда я помечаю часть кода с помощью QPushButton (опять же, для этой цели я повторяю lupdate и linguist), затем появляется "Hello world!" выражение в QPushButton переведено правильно.

Только QmlApplicationViewer и файл QML не выполняют перевод правильно. Любые вопросы ?????

Спасибо

ОБНОВЛЕНИЕ

Я обнаружил следующее: MainPage.qml импортируется как многоразовый компонент в main.qml. Если я использую qsTr () в main.qml, тогда текст в main.qml переводится правильно. Однако текст в MainPage.qml не переведен правильно. Я думаю, из-за импорта его как многоразового компонента. Любые комментарии? Опыт?

ОБНОВЛЕНИЕ 2 - РЕШЕНИЕ

Файлы перевода должны создаваться с учетом регистра:

lupdate mainpage.qml -ts myapp_sk.ts is wrong

lupdate MainPage.qml -ts myapp_sk.ts is correct

person webaloman    schedule 13.11.2011    source источник
comment
Поскольку вы сами нашли решение, вам следует вставить его в качестве ответа и принять.   -  person Ahmad Mushtaq    schedule 28.03.2012
comment
Рад, что вы нашли решение, но в любом случае я должен кое-что упомянуть. Я думаю, что вы используете не лучший подход к переводам. В основном, делая то, что вы делаете, вам нужно будет сгенерировать N файлов для N разных qml и перевести их по отдельности (возможно, неплохая идея), но затем загрузить их в переводчик один за другим. Почему бы вам не обработать их все в одном файле? Извините, если вы уже делаете это , просто я всегда обновляю myproject.pro и забываю: D   -  person David Sánchez    schedule 05.05.2015
comment
Если вы нашли ответ на свой вопрос, подумайте о том, чтобы опубликовать его и принять.   -  person Filip Hazubski    schedule 12.11.2015


Ответы (2)


Если проблема не в переводе как таковом, а в изменении языка во время выполнения, это может вам помочь. Если вы загружаете новый QTranslator с помощью app-> installTranslator (translator); it (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.

person Kombinator    schedule 13.07.2016

Я также использую файлы 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-способиспользования-лингвист-в-глобальном-контексте

person Pěna    schedule 02.01.2016