2016-05-25 85 views
0

我有一個QT應用程序,我需要在運行時更改語言。我正在使用QTranslator和.qm文件。語言加載正常,但我的小部件不顯示文本。帶有Dinamic語言的QT應用程序(QTranslator)不起作用


Y具有 'MyClass..cpp'(繼承的QMainWindow):

MyClass::MyClass() 
{ 
    ... 
    selectLanguage("en"); 

    m_pLabel = new QLabel(tr("User")); 
    m_pLabel->show(); 

    ... 
} 

void MyClass::selectLanguage(QString language) { 

    QString sTranslationFile = QString("texts_%1").arg(language); 

    QTranslator translator; 
    //translator.load(":/translations/" + sTranslationFile); 
    translator.load(sTranslationFile, ":/translations/"); 

    if (qApp->installTranslator(&translator)) 
     qDebug() << "Ok"; 
} 


void MyClass::changeEvent(QEvent *pEvent) 
{ 
    if(pEvent) 
    { 
     switch(pEvent->type()) 
     { 
       case QEvent::LanguageChange: 
        retranslate(); 
        break; 
     } 
    } 

    QMainWindow::changeEvent(pEvent); 
} 

void MyClass::retranslate() 
{ 
    qDebug() << "retranslate"; 

    if (m_pLabel) 
     m_pLabel->setText(tr("User")); 
} 

在 'myProject.pro':

... 
QMAKE_POST_LINK = lrelease.exe myProject.pro 
... 
RESOURCES += \ 
    resources/resources.qrc 

TRANSLATIONS += resources/translations/texts_en.ts \ 
       resources/translations/texts_es.ts 
... 
DISTFILES += \ 
     ... 
     resources/translations/texts_en.qm \ 
      resources/translations/texts_es.qm 

在「資源.qrc':

... 
translations/texts_en.qm 
translations/texts_es.qm 

在 'texts_en.ts':

<!DOCTYPE TS><TS> 
<context> 
    <name>MyClass</name> 
    <message> 
     <source>User</source> 
     <translation>UserEn</translation> 
    </message> 
    <message> 
     <source>Group</source> 
     <translation>GroupEn</translation> 
    </message> 
</context> 
</TS> 

語言裝載( 「OK」 出現)和 「重譯」 之稱,但標籤不顯示 「UserEn」但「用戶」 ......

我稱之爲「selectLanguage(‘ES’),」過了一段時間,但同樣的...

+0

由於標籤是動態創建的,而不是從文件的.ui,它不會自動翻譯。您可以捕獲QEvent :: LanguageChange事件並再次設置標籤文本,其中'tr()'然後將其轉換。 –

回答

0

也許錯誤是您創建翻譯器在堆棧上。您必須在堆上創建譯者。類似的東西。 MyClass.h:

class MyClass 
{ 
private: 
    QScopedPointer<QTranslator> mTranslator; 
... 
}; 

MyClass.cpp:

MyClass::MyClass() 
    : mTranslator(new QTranslator()) 
{ 
    ... 
    selectLanguage("en"); 

    m_pLabel = new QLabel(tr("User")); 
    m_pLabel->show(); 

    ... 
} 

void MyClass::selectLanguage(QString language) { 

    QString sTranslationFile = QString("texts_%1").arg(language); 
    mTranslator->load(sTranslationFile, ":/translations/"); 

    if (qApp->installTranslator(&translator)) 
     qDebug() << "Ok"; 
} 
+0

非常感謝。這是問題!它現在有效! – Diego