4

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

1 に答える 1

11

あなたが与えたリンクは次のように述べています:

ただし、基本的な原則は、動的言語の変更を認識する必要があるすべてのウィジェットで 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 でキャッチされます。

于 2012-04-19T08:46:00.103 に答える