Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Смена языка интерфейса


Автор: Lindemann66 7.10.2011, 15:40
Ещё раз привет всем!

Вопрос следующий

Необходимо сменить язык интерфейса во время работы с программой без её перезапуска
Слоты смены языка выглядят следующим образом:
Код

void SettingsForm::ChangeToRus() {
    //меняем язык на русский
    QTranslator translator;
    translator.load("main_ru.qm", ".");
    qApp->installTranslator(&translator);
}

void SettingsForm::ChangeToEng() {
    //меняем язык на английский
    QTranslator translator;
    translator.load("main_ru.qm", ".");
    qApp->removeTranslator(&translator);
}


Но, на интерфейсе это никаким образом не сказывается

Вопрос - динамическая смена языка интерфейса возможна и выполняется так, как я написал, и ошибка где-то у меня, либо нужны какие-то дополнительные действия?

буду благодарен за любые ответы!

Автор: Amp 7.10.2011, 16:56
Пробежаться по всем виджетам и заново установить текстовые значения. uic для этих целей вроде бы генерировал метод retranslateUi(). Хлопотное дело в общем.

Автор: math64 7.10.2011, 17:42
Не нужно самому бегать по виджетам.
Нужно создать своё Application : public QApplication, в нём создать слот changeLanguage, кроме вышеприведённого кода, посылающий сигнал languageChanged. В каждом окне создать слот onLanguageChanged и соединить его с languageChanged приложения. Если окно создано с помощью дизайнера, в этом слоте достаточно вызвать ui->retranslateUi(this);

Автор: Amp 7.10.2011, 18:46
Цитата(math64 @  7.10.2011,  17:42 Найти цитируемый пост)
Если окно создано с помощью дизайнера, в этом слоте достаточно вызвать ui->retranslateUi(this);

Я про случай, если нет.

Автор: math64 7.10.2011, 21:02
В случае, когда виджет создаётся вручную, обычно создаются функции
createActions()
createMenu()
createToolBar()
createWidgets()
смотрим: нужно перевести Actions -и меню и тулбар автоматически переведутся.
Для каждого действия создаётся при создании такой код:
Код

      action = new QAction(icon, tr(text), this);
      action->setShortcuts(tr(shortcut));
      action->setStatusTip(tr(tooltip));
      connect(action, SIGNAL(triggered()), this, slot);

Заводим в Application метод
 
Код

static void createOrTranslateAction(bool create, QAction*&action, const char* icon, const char*text, const char* shortcut, const char* tooltip, QWidget* w, const char* slot)
{
   if (create) {
      action = new QAction(QIcon(icon), w->tr(text), w);
      connect(action, SIGNAL(triggered()), w, slot);
   } else
      action->setText(tr(text));
   action->setShortcuts(w->tr(shortcut));
   action->setStatusTip(w->tr(tooltip));
}

И пользуемся этим методов для создания или перевода действий в методе
Код

void createOrTranslateActions(bool create) {
Application::createOrTranslateAction(create,actionNew, ":/images/new.png", QT_TR_NOOP("&New"),QT_TR_NOOP("Alt-N"),QT_TR_NOOP("Create New File"), this, SLOT(onNewFile())); 
...
}

Аналогично можно переделать createWidgets()

Автор: Lindemann66 8.10.2011, 14:47
Спасибо всем больше за советы, в понедельник буду пробовать! smile

Автор: Lindemann66 10.10.2011, 14:50
Вобщем, код основных процедур теперь выглядит следующим образом:
Всё работает smile
Код

void SettingsForm::SetDefaultLanguage() {
    Config config;

    //устанавливаем язык
    if (config.lang() == "Russian") {
        //меняем язык на русский
        if (!m_translator.load("main_ru.qm", ".")) {
            QMessageBox::warning(this, tr("Error"), tr("Error of change language to russian"));
            return;
        }
        qApp->installTranslator(&m_translator);
        ui->retranslateUi(this);
    }
}

void SettingsForm::ChangeToRus() {
    //меняем язык на русский
    if (!m_translator.load("main_ru.qm", ".")) {
        QMessageBox::warning(this, tr("Error"), tr("Error of change language to russian"));
        return;
    }
    qApp->installTranslator(&m_translator);
    ui->retranslateUi(this);
    retranslateUi();
    //перезагружаем данные о сайтах
    LoadSitesData();
}

void SettingsForm::ChangeToEng() {
    qApp->removeTranslator(&m_translator);
    ui->retranslateUi(this);
    retranslateUi();
    //перезагружаем данные о сайтах
    LoadSitesData();
}


Всем спасибо за ответы! smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)