简体   繁体   English

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

[英]QT application with dinamic language (QTranslator) does not work

I have a QT application and I need to change language at runtime. 我有一个QT应用程序,需要在运行时更改语言。 I am using QTranslator and .qm files. 我正在使用QTranslator和.qm文件。 The language is loaded properly but my widgets don't show the text. 语言已正确加载,但我的窗口小部件未显示文本。


Y have 'MyClass..cpp' (inherits QMainWindow): 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"));
 }

In 'myProject.pro': 在“ 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

In 'resources.qrc': 在“ resources.qrc”中:

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

In 'texts_en.ts': 在“ 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>

Language is loaded ("Ok" appears) and "retranslate" is called, but the label does NOT show "UserEn", but "User"... 语言已加载(出现“ Ok”)并调用了“ retranslate”,但标签未显示“ UserEn”,但显示了“ User”。

I call 'selectLanguage("es")' after a while, but the same... 过一会儿我叫“ selectLanguage(“ es”)',但是一样。

Maybe error is that you create translator on the stack. 也许错误是您在堆栈上创建了转换器 You must create translator on the heap. 您必须在堆上创建翻译器 Something like that. 这样的事情。 MyClass.h: MyClass.h:

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

MyClass.cpp: 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";
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM