Russian Qt Forum

Qt => Интернационализация, локализация => Тема начата: Sergey от Май 28, 2013, 11:45



Название: Динамическое изменение перевода
Отправлено: Sergey от Май 28, 2013, 11:45
 Здравствуйте ! Сделал перевод как и описывалось в доке, все нормально. Проблема с динамическим переводом. Прочитал и Шлее и Бланшет по поводу перевода . По  форуму рыскал нашел варианты-попробовал все равно не получается . Не совсем понимаю в какой момент времени указывать функцию retranslateUI ? попробовал сделать в виде меню просто соединил сигналом и слотом , что когда нажимаю на кнопку загружается русский , но такой вариант не прокатил. Подскажите пожалуйста !

Заранее благодарен !


Название: Re: Динамическое изменение перевода
Отправлено: Serr500 от Май 28, 2013, 11:57
см. QCoreApplication::installTranslator. retranslateUi вызовется автоматически.


Название: Re: Динамическое изменение перевода
Отправлено: Sergey от Май 28, 2013, 13:10
Я его и использовал , ну давайте разберем напримере. Вот код одного из моих файлов , я хочу перевести ну например слово Language или Settings. В Qt Linguist все сохранил и скомпилил , в чем моя ошибка  ?
Код:
#include <QtGui>
#include<handle.h>
#include<klavishi.h>

Handle::Handle(QWidget*parent)
:QWidget(parent)
{
}
void Klavishi ::handle_channel()
{
    QWidget * handle_widget = new QWidget;
    handle_widget->setFixedSize(480,230);
    handle_widget->setWindowTitle(tr("Settings"));
    handle_widget->show();

    QVBoxLayout * settings_layout = new QVBoxLayout;
    settings_layout->setMargin(0);
    settings_layout->setSpacing(0);

    QHBoxLayout * menuLayout = new QHBoxLayout;


    QMenu * menu = new QMenu(tr("&Language"));
    menu->addAction("&English");
    QMenuBar * pmenu = new QMenuBar;
    pmenu->addMenu(menu);
    connect(menu,SIGNAL(clicked()),SLOT(changeLanguage()));

     menuLayout->addWidget(pmenu);
    settings_layout->addLayout(menuLayout);
    handle_widget->setLayout(settings_layout);
}
void Handle::changeLanguage(){
    QTranslator translator;
     translator.load("D:\\RDM-11\\project_rdm_11\\interface1-2\\klavishi_ru.qm");
     qApp->installTranslator(&translator);
}
void Handle::changeEvent(QEvent *event){
    if (event->type()==QEvent::LanguageChange){
        setWindowTitle(tr("Settings"));
    }else
        Handle::changeEvent(event);
}



Название: Re: Динамическое изменение перевода
Отправлено: Serr500 от Май 29, 2013, 12:11
Ошибка тривиальная для новичков. И если посмотреть на код повнимательнее, то она становится очевидной. Смотрите.

В методе Handle::changeLanguage создаётся объект translator. Затем в него грузится файл (кстати, надо проверять успешность, не зря же метод что-то возвращает). Далее транслятор инсталлируется. А что происходит в следующей строчке, где находится закрывающая фигурная скобка метода? Многие думают, что ничего. Но это не так! И если зайти в дизассемблированный код, то мы увидим, что там происходит очень много интересного! Например, разрушаются локальные переменные...

Опа! Вот где ошибка! При выходе из метода объект translator благополучно похеривается! И при этом (он же потомок QObject) шлёт в QCoreApplication сигнал destroyed. Что же делает QCoreApplication? Правильно, убирает ссылку на транслятор. То есть транслятора у нас снова нет!

Выход? "Элементарно, Ватсон!" (C) Шерлок Холмс.
Код:
static QTranslator translator;


Название: Re: Динамическое изменение перевода
Отправлено: vbv от Декабрь 24, 2013, 04:32
QTranslator *translator=new QTranslator;
translator->load()....

qApp->installTranslator(translator);


Название: Re: Динамическое изменение перевода
Отправлено: kambala от Декабрь 24, 2013, 12:52
так будет утечка памяти при повторных вызовах смены языка


Название: Re: Динамическое изменение перевода
Отправлено: kefir500 от Январь 24, 2014, 12:41
retranslateUi() работает только для виджетов созданных в Qt Designer.
В Вашем случае нужно создать отдельный метод, выставляющий текст у виджетов:
Код:
void Handle::retranslate()
{
    handle_widget->setWindowTitle(tr("Settings"));
    menu->setTItle(tr("&Language"));
}
И вызывать этот метод при запуске программы (после создания виджетов, разумеется), а также при смене языка.