Russian Qt Forum
Май 02, 2024, 20:16 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Динамический перевод QML интерфейса  (Прочитано 6834 раз)
SektorCT
Частый гость
***
Offline Offline

Сообщений: 216


Просмотр профиля
« : Июнь 05, 2016, 15:22 »

Всем привет.
Есть маленькая демонстрационаня тестовая прога, динамически переводит текст.
В ней текстовые поля с тегами где нужно переводить вынесены в отдельный каталог.
Можно ли без выноса а именно в каждом обьекте создавать поле и его перезагружать когда требуется?
Для примера вот так пытаюсь сделать
Код:
Label 
{
    id: helloLabel
    text = qsTr("Hello World") 
    height: 50
    anchors
   {
       top: parent.top
       left: parent.left
       right: parent.horizontalCenter
       margins: 10
   }
}
http://www.evileg.ru/wp-content/uploads/2016/06/QmlLanguage-1.zip

Буду очень признателен если кто подскажет как без выноса в отдельную функцию всех текстовых полей можно обнавлять перевод.
Так же прикрепляю сам архив с программой. Она малькая и простая.
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #1 : Июнь 05, 2016, 17:25 »

https://wiki.qt.io/How_to_do_dynamic_translation_in_QML
Вот тут есть еще вариант.

Код:
text: qsTr("Hello") + rootItem.emptyString
Смысл такой, что свойству emptyString устанавливают сигнал изменения языка
Код:
Q_PROPERTY(QString emptyString READ getEmptyString NOTIFY languageChanged)

Т.е. после установки нужного языка
Код:
qApp->installTranslator
высылается данный сигнал и происходит обновление свойства text, таким образом, происходит смена языка.

В общем, вариант тоже с костылем, но хотя бы выносить в отдельную функцию не нужно. Похоже, без костылей вариантов нет Улыбающийся
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
SektorCT
Частый гость
***
Offline Offline

Сообщений: 216


Просмотр профиля
« Ответ #2 : Июнь 05, 2016, 18:26 »

https://wiki.qt.io/How_to_do_dynamic_translation_in_QML
Вот тут есть еще вариант.

Код:
text: qsTr("Hello") + rootItem.emptyString
Смысл такой, что свойству emptyString устанавливают сигнал изменения языка
Код:
Q_PROPERTY(QString emptyString READ getEmptyString NOTIFY languageChanged)

Т.е. после установки нужного языка
Код:
qApp->installTranslator
высылается данный сигнал и происходит обновление свойства text, таким образом, происходит смена языка.

В общем, вариант тоже с костылем, но хотя бы выносить в отдельную функцию не нужно. Похоже, без костылей вариантов нет Улыбающийся

Спасибо большое за помощь. Сейчас попробую сделать, надеюсь заработает.

И кстати такой вопрос, а вот если файлы локализации находятся в другмо каталоге, где должны быть изменения? То есть например если в файле ресурсов я залью эти файлы перевода то тогда ничего не надо менять? Если не трудно могли бы на этом примере показать где нужно зменения внести чтоыб перевод подцеплялся?
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #3 : Июнь 06, 2016, 15:22 »

Не совсем понял вопрос. Все, что нужно в вашем случае - это:
1) добавить свойство в QmlTranslator
Код:
Q_PROPERTY(QString emptyString READ getEmptyString NOTIFY languageChanged)
2) добавить метод getEmptyString, который возвращает QString()
3) в QML части поменять все на:
Код:
text: qsTr("Hello") + qmlTranslator.emptyString

По поводу файлов перевода:
при распространении программы нужны только .qm файлы, их можно хранить в ресурсах или в каталоге рядом с исполняемым файлов (в принципе, можно держать их в любом месте, главное, чтобы программа знала где искать).
При добавлении новых строк в QML или их изменении, надо обновлять .ts файлы(они не нужны при распространии программы) перевода, из которых в итоге собирать .qm файлы.
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
SektorCT
Частый гость
***
Offline Offline

Сообщений: 216


Просмотр профиля
« Ответ #4 : Июль 09, 2016, 11:14 »

Не совсем понял вопрос. Все, что нужно в вашем случае - это:
1) добавить свойство в QmlTranslator
Код:
Q_PROPERTY(QString emptyString READ getEmptyString NOTIFY languageChanged)
2) добавить метод getEmptyString, который возвращает QString()

А скажите, зачем нужна пустая строка для каждой части перевода?
Просто не все понятно в этйо реализации.
Записан
SektorCT
Частый гость
***
Offline Offline

Сообщений: 216


Просмотр профиля
« Ответ #5 : Июль 09, 2016, 13:16 »

Попытался реализовать данным способом, но почему то мой пример не срабатывает. Подскажите если кто увидет где я ошибку допускаю?
//translationtest.hpp
Код:
#ifndef TRANSLATIONTEST_H
#define TRANSLATIONTEST_H

#include <QObject>
#include <QtGui>

class TranslationTest : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString emptyString READ getEmptyString NOTIFY languageChanged)
public:
    TranslationTest();

    Q_INVOKABLE void selectLanguage(QString language);

    QString getEmptyString() const;

signals:
    void languageChanged();

private:
    QTranslator *translator1_;
    QTranslator *translator2_;
};

#endif // TRANSLATIONTEST_H

//translation.cpp
Код:
#include "translationtest.h"

TranslationTest::TranslationTest()
{
    translator1_ = new QTranslator(this);
    translator2_ = new QTranslator(this);
}

void TranslationTest::selectLanguage(QString language)
{
    if(language == QString("fr"))
    {
       translator1_->load("t1_fr", ".");
       qApp->installTranslator(translator1_);
    }

    if(language == QString("ru"))
    {
    translator2_->load("t1_ru", ".");
    qApp->installTranslator(translator2_);
    }

    if(language == QString("en"))
    {
    qApp->removeTranslator(translator1_);
    qApp->removeTranslator(translator2_);
    }

    emit languageChanged();
}

QString TranslationTest::getEmptyString() const
{
    return "";
}

//main.qml

Код:
import QtQuick 2.7
import QtQuick.Controls 1.5

ApplicationWindow
{
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World") + rootItem.emptyString

    menuBar: MenuBar
    {
        Menu
        {
            title: qsTr("File") + rootItem.emptyString
            MenuItem
            {
                text: qsTr("&Open") + rootItem.emptyString
                onTriggered: console.log("Open action triggered");
            }
            MenuItem
            {
                text: qsTr("Exit") + rootItem.emptyString
                onTriggered: Qt.quit();
            }
        }
    }

    Rectangle
    {
        width: 340; height: 150

        Column
        {
            anchors.fill: parent; spacing: 20

            Text
            {
                text: qsTr("Hello") + rootItem.emptyString
                font.pointSize: 25; anchors.horizontalCenter: parent.horizontalCenter
            }
        }

        Row
        {
            anchors.verticalCenter: parent.verticalCenter
            Button { text: "English"; onClicked: rootItem.selectLanguage("en"); }
            Button { text: "Russian"; onClicked: rootItem.selectLanguage("ru"); }
            Button { text: "French"; onClicked: rootItem.selectLanguage("fr"); }
        }
    }

    Label
    {
        text: qsTr("Hello World") + rootItem.emptyString
        anchors.centerIn: parent
    }
}
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #6 : Июль 17, 2016, 15:10 »

Цитировать
А скажите, зачем нужна пустая строка для каждой части перевода?
Просто не все понятно в этйо реализации.
Нужна для того, чтобы сигнализировать QML части, что произошло изменение. Для этого используется сигнал languageChanged.
Здесь можно про это прочитать: http://doc.qt.io/qt-5/qtqml-syntax-propertybinding.html

Почему не работает, сразу не пойму. Можно проверить возвращаемый bool у вызовов:
Код:
translator1_->load("t1_fr", ".");
translator2_->load("t1_ru", ".");
Может вообще не загрузились файлы перевода.
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
SektorCT
Частый гость
***
Offline Offline

Сообщений: 216


Просмотр профиля
« Ответ #7 : Июль 19, 2016, 15:14 »

Цитировать
А скажите, зачем нужна пустая строка для каждой части перевода?
Просто не все понятно в этйо реализации.
Нужна для того, чтобы сигнализировать QML части, что произошло изменение. Для этого используется сигнал languageChanged.
Здесь можно про это прочитать: http://doc.qt.io/qt-5/qtqml-syntax-propertybinding.html

Почему не работает, сразу не пойму. Можно проверить возвращаемый bool у вызовов:
Код:
translator1_->load("t1_fr", ".");
translator2_->load("t1_ru", ".");
Может вообще не загрузились файлы перевода.

Спасибо, все заработало, ошибки нашол. Оказалось все не так страшно)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.061 секунд. Запросов: 23.