Evgenii Legotckoi
Evgenii LegotckoiМаусым 5, 2016, 12:43 Т.Қ.

QML - Сабақ 025. Көптілді қолданбаны QML-ге динамикалық аудару

Қолданба интерфейсінің Qt/C++ аудармаларымен танысқаннан кейін интерфейсі жазылған қолданбаның динамикалық аудармасының мүмкіндіктерін зерттеудің уақыты келді. * QML. *

QML жүйесінде әзірлеу кезінде QWidgets жүйесіндегі стандартты қолданбадан айырмашылығы, бірнеше нәрсені ескеру қажет, атап айтқанда:

  1. .pro жоба файлының қосымша конфигурациясы қажет;
  2. Қажетті тілге аудармаларды жүктеу процесі C++ деңгейінде жүзеге асырылады;
  3. Интерфейсті аудару QML деңгейінде qsTr(); функциясы арқылы қайта іске қосылады.
  4. Аударманы жүктегеннен кейін қолданба интерфейсін қайта аудару үшін C++ деңгейінен QML деңгейіне сигнал жіберу керек, ол C++ қолданбасы үшін ұқсас, бірақ C++ тілінің өзара әрекеттесуін орнатуды талап етеді. QML қабаты бар қабат.

Жоба құрылымы

Келесі файлдарды қамтитын жоба жасаңыз:

  • QmlLanguage.pro - жоба профилі;
  • deployment.pri - әдепкі бойынша жасалған орналастыру параметрлері файлы;
  • main.cpp - негізгі функциясы бар бастапқы код файлы;
  • qmltranslator.h - аударманы жүктеу класының тақырып файлы;
  • qmltranslator.cpp - аударманы жүктеу класының бастапқы код файлы;
  • main.qml - қабаттың негізгі QML файлы.

QmlLanguage.pro

Аударма файлын жасау Qt/C++ қолданбасы үшін аудармаларды жасауға ұқсас болады. Яғни, Qt Linguist жұмыс істейтін аударма файлын қосу керек:

# Добавляем файл переводов,
# который является по сути файлом "исходных кодов" для нашего перевода
TRANSLATIONS += QmlLanguage_ru.ts

Содан кейін біз осы аударма файлын жасау үшін lupdate утилитасын іске қосамыз, оны Qt Linguist ішінде өңдейміз және қолданбаға қосылатын екілік аударма файлын жасау үшін lrelease утилитасын іске қосамыз.

Бұл туралы толығырақ QTranslator пайдалану туралы алдыңғы мақаладан оқи аласыз.

QML тіліндегі аудармалармен жұмыс істеудің ең маңызды сәті қарапайым C++ файлдары сияқты барлық QML файлдарын дереккөз ретінде қосу қажет. Бірақ тек lupdate_only пайдалануға арналған белгісі бар.

lupdate_only {
    SOURCES += main.qml
}

Төменде жобаның .pro файлының толық тізімі берілген.

TEMPLATE = app

QT += qml quick widgets

CONFIG += c++11

SOURCES += main.cpp \
    qmltranslator.cpp

# Для того, чтобы создать файл переводов со строками из ресурсов qml
# понадобится включить файл qml в качестве обычных исходников в pro файле
# но только для использования утилиты lupdate, чтобы она могла узнать,
# какие строки нуждаются в переводе
lupdate_only {
    SOURCES += main.qml
}

RESOURCES += qml.qrc \
    translations.qrc

# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =

# Default rules for deployment.
include(deployment.pri)

# Добавляем файл переводов,
# который является по сути файлом "исходных кодов" для нашего перевода
TRANSLATIONS += QmlLanguage_ru.ts

HEADERS += \
    qmltranslator.h

main.cpp

Аударма файлдары C++ деңгейіне енгізілгендіктен, QML контекстінде аударма сыныбының нысанын тіркеу қажет. Бұл жағдайда біз QTranslator үстіне орауыш болатын QmlTranslator класын жазамыз. , бұл сыныпта QML арқылы жұмыс істей алатын әдістер жоқ болғандықтан.

#include <QApplication>
#include <QQmlApplicationEngine>
#include <QtQml>
#include "qmltranslator.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    // Создаём объект для работы с переводами ...
    QmlTranslator qmlTranslator;

    QQmlApplicationEngine engine;
    // и регистрируем его в качестве контекста в Qml слое
    engine.rootContext()->setContextProperty("qmlTranslator", &qmlTranslator);
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
}

qmltranslator.h

Сыныпта аударманы орнату әдісі бар, ол аударылатын тілдің префиксі беріледі. Және бұл әдіс арқылы барлық интерфейсті жаңа аудармамен қайта аударуға болатындай етіп аударманы өзгерту туралы сигнал шығарылады.

Аударманы орнату әдісі QML қабатында қолданылуы үшін Q_INVOKABLE макросымен белгіленуі керек.

#ifndef QMLTRANSLATOR_H
#define QMLTRANSLATOR_H

#include <QObject>
#include <QTranslator>

class QmlTranslator : public QObject
{
    Q_OBJECT

public:
    explicit QmlTranslator(QObject *parent = 0);

signals:
    // Сигнал об изменении текущего языка для изменения перевода интерфейса
    void languageChanged();

public:
    // Метод установки перевода, который будет доступен в QML
    Q_INVOKABLE void setTranslation(QString translation);

private:
    QTranslator m_translator;
};

#endif // QMLTRANSLATOR_H

qmltranslator.cpp

#include "qmltranslator.h"
#include <QApplication>

QmlTranslator::QmlTranslator(QObject *parent) : QObject(parent)
{

}

void QmlTranslator::setTranslation(QString translation)
{
    m_translator.load(":/QmlLanguage_" + translation, "."); // Загружаем перевод
    qApp->installTranslator(&m_translator);                 // Устанавливаем его в приложение
    emit languageChanged();                                 // Сигнализируем об изменении текущего перевода
}

main.qml

Қолданба интерфейсі келесідей болады:

Қолданба логикасы келесідей: құрама терезедегі тілді өзгерткен кезде қолданба тілі өзгереді.

Біз QML қабатының контекстінде qmlTranslator тіркегендіктен, құрама ұяшықтағы мәтінді өзгерту өңдегішінде qmlTranslator нысанындағы тілді өзгерту әдісін шақырамыз. Және тіл өзгерісін қадағалау үшін сигнал болса, осы сигналға қосылып, retranslateUi() функциясы шақырылатын өңдегішті жазуымыз керек. retranslateUi() функциясы аударылуы қажет барлық нысандардың барлық мәтіндік қасиеттерін қамтиды. . Бұл логиканы жеңілдету және артық кодты азайту үшін жасалды.

import QtQuick 2.6
import QtQuick.Controls 1.5

ApplicationWindow {
    id: applicationWindow
    visible: true
    width: 640
    height: 480

    Label {
        id: helloLabel
        height: 50
        anchors {
            top: parent.top
            left: parent.left
            right: parent.horizontalCenter
            margins: 10
        }
    }

    ComboBox {
        id: comboBox
        anchors {
            top: parent.top
            left: parent.horizontalCenter
            right: parent.right
            margins: 10
        }

        model: ["ru_RU", "en_US"]

        // При изменении текста, инициализируем установку перевода через С++ слой
        onCurrentTextChanged: {
            qmlTranslator.setTranslation(comboBox.currentText)
        }
    }

    Label {
        id: labelText
        wrapMode: Text.Wrap
        anchors {
            top: helloLabel.bottom
            left: parent.left
            right: parent.right
            margins: 10
        }
    }

    // Подключаемся к объекту переводчика
    Connections {
        target: qmlTranslator   // был зарегистрирован в main.cpp
        onLanguageChanged: {    // при получении сигнала изменения языка
            retranslateUi()     // инициализируем перевод интерфейса
        }
    }

    // Функция перевода интерфейса
    function retranslateUi() {
        applicationWindow.title = qsTr("Hello World")
        helloLabel.text = qsTr("Hello World")
        labelText.text = qsTr("The QTranslator class provides internationalization" +
                              "support for text output.An object of this class contains " +
                              "a set of translations from a source language to a target language. " +
                              "QTranslator provides functions to look up translations in a translation file. " +
                              "Translation files are created using Qt Linguist.")
    }

    // Запускаем перевод приложения, когда окно приложения было создано
    Component.onCompleted: {
        retranslateUi();
    }
}

Барлығы

Жалпы, қолданбаны Qt/QML-ге динамикалық түрде аудару тек Qt/C++ арқылы қолданбаны аударудан көп айырмашылығы жоқ. Ең бастысы - сигналдар мен ұяшықтарды дұрыс қосу және аударманы инициализациялау үшін әдістерді дұрыс шақыру.

Динамикалық аудармасы бар QML қолданбасын жүктеп алу

Бейне оқулық

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

ДЧ
  • Қаң. 31, 2019, 5:25 Т.Ж.
  • (өңделген)

Всё отлично :)
Только у меня вопрос: а как вместо ru_RU и en_US написать в ComboBox'e Russian и English чтобы сохранить функцию смены языка :)

UPD Разобрался
В comboBox model я пишу так:

model: ["English", "Russian"]

И перед отправкой кода ru_RU или en_US в С++ делаю проверку

onCurrentTextChanged: {
            if(comboBox.currentText === "Russian")
                qmlTranslator.setTranslation("ru_RU")
            if(comboBox.currentText === "English")
                qmlTranslator.setTranslation("en_US")
        }
zloi
  • Шілде 15, 2019, 5:32 Т.Ж.

В Qt 5.10 была добавлена новая функция по переводу qml файлов. Теперь не нужно писать класс оболочку, достаточно вызвать функцию engine.retranslate(); и все обновится само.

Evgenii Legotckoi
  • Шілде 15, 2019, 5:35 Т.Ж.

Это хорошая новость!!!!

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
OI
  • Ora Iro
  • Жел. 24, 2024, 6:38 Т.Ж.

C++ - Тест 001. Первая программа и типы данных

  • Нәтиже:40ұпай,
  • Бағалау ұпайлары-8
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:50ұпай,
  • Бағалау ұпайлары-4
m
  • molni99
  • Қаз. 26, 2024, 1:37 Т.Ж.

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:80ұпай,
  • Бағалау ұпайлары4
Соңғы пікірлер
ИМ
Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas5Шілде 5, 2024, 11:02 Т.Ж.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Енді форумда талқылаңыз
Evgenii Legotckoi
Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProjectМаусым 4, 2022, 3:49 Т.Ж.
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9AnonimҚаз. 25, 2024, 9:10 Т.Ж.
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Бізді әлеуметтік желілерде бақылаңыз