2012-04-19 5 views
4

Я использую переводчика и лингвиста для перевода языка в мое приложение в Qt symbain, но я хочу сделать это на лету (во время выполнения), я пробовал решение, данное сеть разработчиков, но она не работает для меняКак перевести язык в Qt на лету

#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

Должен ли я назвать недействительным MainWindow :: ChangeEvent (QEvent * событие) при установке нового языка

это метод мой 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

Не вызывайте setLanguage() изнутри changeEvent()! Вы должны вызвать setLanguage() из любого места, где вы можете изменить язык. setLanguage() вызывает LanguageTranslator :: loadTranslation(), который вызывает QApplication :: installTranslator(), который создает событие LanguageChange, которое затем попадает в MainWindow :: changeEvent –

ответ

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

[Edit - Добавлен комментарий, как это было фактический ответ на вопрос]

Не вызывайте setLanguage() изнутри changeEvent()! Вы должны вызвать setLanguage() из любого места, где вы можете изменить язык. setLanguage() вызывает LanguageTranslator :: loadTranslation(), который вызывает QApplication :: installTranslator(), который создает событие LanguageChange, которое затем попадает в MainWindow :: changeEvent

+0

, поэтому, если у меня есть 3 виджета, мне нужно изменить changeEvent() в каждом класс, а также я использую stackWidget так, как реализовать changeEvent() на каждой странице. – abhishek

+0

Вы должны реализовать changeEvent() в каждом из трех виджетов. Если вы добавите эти три виджета в один и тот же QStackWidget, вам не придется менять QStackWidget. Я почти уверен, что QStackWidget перенаправит changeEvent() на дочерние виджеты. –

+0

Есть ли способ перезагрузить mainWindow каждый раз, когда я меняю язык. – abhishek

Смежные вопросы