Как перевести язык в Qt на лету
Я использую переводчик и лингвист для перевода языка в моем приложении в Qt symbain, но я хочу сделать это на лету (во время выполнения), я пробовал решение, данное сетью разработчиков, но оно не работает для меня
#include "languagetranslator.h"
#include "constants.h"
#include <QSettings>
#include <HelperClasses/Strings.h>
#include <QTranslator>
#include <AppStatus/appstatus.h>
#include <QApplication>
QTranslator* LanguageTranslator::current = 0;
LanguageTranslator::LanguageTranslator(int& argc, char* argv[]) : QApplication(argc, argv)
{
}
LanguageTranslator::~LanguageTranslator()
{
}
void LanguageTranslator::loadTranslation()
{
QString language;
language = AppStatus::getCurrentLanguage();
loadTranslation(language);
qDebug("language from laodtranslation = %s",language.toLatin1().data());
//qDebug(language.toLatin1());
}
void LanguageTranslator::loadTranslation(QString language)
{
//QApplication app;
QTranslator* translator = new QTranslator(instance());
translator->load(language);
installTranslator(&translator);
//exec();
}
Он работает только тогда, когда я объявил его в main.cpp и перезапустить приложение, я также вызываю этот метод после выбора нового языка есть ли что-то, что я пропустил. Я следую по следующей ссылке http://www.qtcentre.org/wiki/index.php?title=Dynamic_translation_in_Qt4_applications
Должен ли я вызывать void MainWindow:: changeEvent (QEvent * event) при установке нового языка
Это мой метод changeEvent (), который я объявил в mainWindow, отсюда я вызываю setLanguage ();
void MainWindow::changeEvent(QEvent *event)
{
if(event->type() == QEvent::LanguageChange)
{
ui->retranslateUi(this);
// retranslate();
setLanguage();
}
QMainWindow::changeEvent(event);
}
void MainWindow::setLanguage()
{
QString myLanguage;
int iIndex = AppStatus::getSettingsData().at(3);
switch(iIndex)
{
case ENGLISH:
myLanguage = "language_en";
break;
case SPANISH:
myLanguage = "language_es";
break;
}
AppStatus::saveCurrentLanguage(myLanguage);
LanguageTranslator::loadTranslation(myLanguage);
}
Из setLangauge () я вызываю languageTranslator()
Есть ли что-нибудь, чего мне не хватает?;
Это мой основной класс
int main(int argc, char *argv[])
{
LanguageTranslator app(argc, argv);
QString lang = AppStatus::getCurrentLanguage();
app.installTranslator(&translator);
MainWindow mainWindow;
mainWindow.setOrientation(MainWindow::ScreenOrientationLockPortrait);
//About mainWindow;
#if defined(Q_OS_SYMBIAN)
mainWindow.showMaximized();
#else
mainWindow.show();
#endif
// mainWindow.showFullScreen();
app.connect(&app,SIGNAL(lastWindowClosed()),&app,SLOT(quit()));
return app.exec();
}
1 ответ:
Ссылка, которую вы дали, гласит:
Однако основной принцип заключается в переопределении функции QWidget:: changeEvent () в каждом виджете, который должен быть осведомлен о динамических изменениях языка.Это необходимо, так как
installTranslator()создаст событие изменения, которое будет отправлено каждому виджету. Это означает, что если вы хотите, чтобы ваше главное окно было переведено, вы должны сделать:void MainWindow::changeEvent(QEvent* event) { if (event->type() == QEvent::LanguageChange) { // retranslate designer form (single inheritance approach) ui.retranslateUi(this); } // remember to call base class implementation QMainWindow::changeEvent(event); }Вы должны сделать это для каждого виджета, который имеет переводимый графический интерфейс
[Edit-добавлен комментарий, как это был ли фактический ответ на вопрос]
Не вызывайте setLanguage () из changeEvent()! Вы должны вызвать setLanguage () из любого места, где вы можете изменить язык. setLanguage() вызывает LanguageTranslator:: loadTranslation (), который вызывает QApplication:: installTranslator (), который создает событие LanguageChange, которое затем перехватывается в MainWindow:: changeEvent
Comments