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 Т.Ж.

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

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
Г

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

  • Нәтиже:66ұпай,
  • Бағалау ұпайлары-1
t

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

  • Нәтиже:33ұпай,
  • Бағалау ұпайлары-10
t

Qt - Тест 001. Сигналы и слоты

  • Нәтиже:52ұпай,
  • Бағалау ұпайлары-4
Соңғы пікірлер
G
GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
d
dblas5Шілде 5, 2024, 11:02 Т.Ж.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssrАқп. 8, 2024, 6:43 Т.Қ.
Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Енді форумда талқылаңыз
Evgenii Legotckoi
Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
F
FynjyШілде 22, 2024, 4:15 Т.Ж.
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
BlinCT
BlinCTМаусым 25, 2024, 1 Т.Ж.
Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
BlinCT
BlinCTМамыр 5, 2024, 5:46 Т.Ж.
Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
Evgenii Legotckoi
Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

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