具有动态语言的 QT 应用程序(翻译器)不起作用

QT application with dinamic language (QTranslator) does not work

我有一个 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")',但是一样...

可能错误是您在堆栈上创建了 translator。您必须在堆上创建 translator。像那样的东西。 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";
}