具有动态语言的 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";
}
我有一个 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";
}