Как перевести язык в 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();
}
645   1  

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

    Ничего не найдено.