如何在Qt中动态翻译语言

时间:2012-04-19 08:14:12

标签: qt qt4 symbian

我正在使用译者和语言学家在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)

这是我在mainWindow中声明的changeEvent()方法,我在这里调用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 个答案:

答案 0 :(得分:10)

您提供的链接指出:

  

但是,基本原则是在每个必须知道动态语言变化的小部件中覆盖QWidget :: changeEvent()。

这是必需的,因为installTranslator()将创建一个更改事件,该事件将发送到每个小部件。 这意味着,如果您希望重新翻译MainWindow,则必须执行以下操作:

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

您必须为每个具有可翻译GUI的小部件执行此操作

[编辑 - 添加评论,因为它是问题的实际答案]

不要在changeEvent()中调用setLanguage()!您应该从可以更改语言的地方调用setLanguage()。 setLanguage()调用LanguageTranslator :: loadTranslation()调用QApplication :: installTranslator()创建一个LanguageChange事件,然后在MainWindow :: changeEvent

中捕获