我有一个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”)',但同样......
答案 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";
}