Приложение QT с динамическим языком (QTranslator) не работает

У меня есть приложение 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>

Язык загружается (появляется "ОК") и вызывается "retranslate", но в метке отображается НЕ "UserEn", а "User"...

Я вызываю 'selectLanguage("es")' через некоторое время, но то же самое...


person Diego    schedule 25.05.2016    source источник
comment
Поскольку этикетка создается динамически, а не из файла .ui, она не переводится автоматически. Вы можете поймать событие QEvent::LanguageChange и снова установить текст метки, где tr() затем переведет его.   -  person Karsten Koop    schedule 25.05.2016


Ответы (1)


Возможно, ошибка в том, что вы создаете translator в стеке. Вы должны создать translator в куче. Что-то такое. МойКласс.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";
}
person Kirill Chernikov    schedule 25.05.2016