Перевод QML - PullRequest
       40

Перевод QML

5 голосов
/ 14 ноября 2011

Я стараюсь использовать перевод в QML. Я открыл новый проект QtQuick, я выбрал 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 неправильно выполняет перевод. Какие-нибудь квесты ?????

Спасибо

UPDATE

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

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

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

lupdate mainpage.qml -ts myapp_sk.ts is wrong

lupdate MainPage.qml -ts myapp_sk.ts is correct

Ответы [ 2 ]

0 голосов
/ 13 июля 2016

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

0 голосов
/ 02 января 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-way-to-use-linguist-in-global-context

...