Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Смена языка интерфейса, Во время работы 
V
    Опции темы
Lindemann66
  Дата 7.10.2011, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinking...
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 2.8.2011
Где: Ульяновск

Репутация: нет
Всего: нет



Ещё раз привет всем!

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

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

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);
}


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

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

буду благодарен за любые ответы!
--------------------
stay true
PM MAIL WWW ICQ   Вверх
Amp
Дата 7.10.2011, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 7
Всего: 17



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

Это сообщение отредактировал(а) Amp - 7.10.2011, 16:57
PM MAIL   Вверх
math64
Дата 7.10.2011, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



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

Это сообщение отредактировал(а) math64 - 7.10.2011, 17:44
PM   Вверх
Amp
Дата 7.10.2011, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 7
Всего: 17



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

Я про случай, если нет.
PM MAIL   Вверх
math64
Дата 7.10.2011, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



В случае, когда виджет создаётся вручную, обычно создаются функции
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()


Это сообщение отредактировал(а) math64 - 7.10.2011, 21:28
PM   Вверх
Lindemann66
Дата 8.10.2011, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinking...
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 2.8.2011
Где: Ульяновск

Репутация: нет
Всего: нет



Спасибо всем больше за советы, в понедельник буду пробовать! smile
--------------------
stay true
PM MAIL WWW ICQ   Вверх
Lindemann66
Дата 10.10.2011, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinking...
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 2.8.2011
Где: Ульяновск

Репутация: нет
Всего: нет



Вобщем, код основных процедур теперь выглядит следующим образом:
Всё работает 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
--------------------
stay true
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0436 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.