带有dinamic语言的QT应用程序(QTranslator)不起作用

时间:2016-05-25 08:49:37

标签: c++ qt runtime

我有一个QT应用程序,我需要在运行时更改语言。我正在使用QTranslator和.qm文件。语言已正确加载,但我的小部件未显示文本。

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

在'resources.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”)并调用“retranslate”,但标签不显示“UserEn”,而是“User”......

我在一段时间后调用'selectLanguage(“es”)',但同样......

1 个答案:

答案 0 :(得分: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";
}