为什么我的 C++ Qt UI 得到了翻译,但程序中的 QString 却没有?
Why my C++ Qt UI got translated but not my QStrings in my program?
我需要将英语 UI 翻译成法语,所以我使用 .ts 和 .qm 文件完成了所有必要的工作,将其加载到 QTranslator class 中,并将其安装到 QApplication :
//in the InterfaceWidget constructor:
QTranslator myappTranslator;
bool loaded = myappTranslator.load("myApp_" + QLocale::system().name());
qDebug() << "Is translation file loaded?" << loaded; // RETURNS TRUE
QApplication::installTranslator(&myappTranslator);
ui.setupUi(this);
ui.retranslateUi(this); //works, it translates the UI
稍后,我创建并附加到 InterfaceWidget 另一个名为 ConfigurationTabUI 的小部件(在选项卡中):
m_ConfigurationTabUI = new ConfigurationTabUI(ui.configTab);
相应的 UI 也正确地翻译成法语。
这是我的问题:在 ConfigurationTabUI 的方法中,当我尝试翻译一个简单的 QString 时它不起作用:
void ConfigurationTabUI::on_ValidButton_clicked(){
QString msg(ConfigurationTabUI::tr("message to translate"));
qDebug() << "translated string: " << msg; // NOT TRANSLATED
}
我真的不知道为什么...
感谢您的帮助。
注意:我使用 Qt5.2 并仔细检查了 .ts 文件是否包含正确的翻译字符串。
好的,我发现了问题,这只是一个愚蠢的疏忽:
QTranslator 是在堆栈上创建的,而不是动态创建的(在堆上),因此对象在方法结束时被销毁。
结果,它翻译了 UI,因为对象仍然存在,但稍后,当调用插槽时,没有任何内容被翻译。
这是我的代码:
//in the InterfaceWidget constructor:
QTranslator* myappTranslator = new QTranslator(QApplication::instance());
bool loaded = myappTranslator->load("myApp_" + QLocale::system().name());
qDebug() << "Is translation file loaded?" << loaded; // RETURNS TRUE
QApplication::installTranslator(myappTranslator);
ui.setupUi(this);
并在 ConfigurationTabUI(继承自 QWidget)中:
void ConfigurationTabUI::changeEvent(QEvent *e)
{
if (e->type() == QEvent::LanguageChange) {
ui.retranslateUi(this);
reset(); //my method to reload some data in UI
} else
QWidget::changeEvent(e);
}
我需要将英语 UI 翻译成法语,所以我使用 .ts 和 .qm 文件完成了所有必要的工作,将其加载到 QTranslator class 中,并将其安装到 QApplication :
//in the InterfaceWidget constructor:
QTranslator myappTranslator;
bool loaded = myappTranslator.load("myApp_" + QLocale::system().name());
qDebug() << "Is translation file loaded?" << loaded; // RETURNS TRUE
QApplication::installTranslator(&myappTranslator);
ui.setupUi(this);
ui.retranslateUi(this); //works, it translates the UI
稍后,我创建并附加到 InterfaceWidget 另一个名为 ConfigurationTabUI 的小部件(在选项卡中):
m_ConfigurationTabUI = new ConfigurationTabUI(ui.configTab);
相应的 UI 也正确地翻译成法语。
这是我的问题:在 ConfigurationTabUI 的方法中,当我尝试翻译一个简单的 QString 时它不起作用:
void ConfigurationTabUI::on_ValidButton_clicked(){
QString msg(ConfigurationTabUI::tr("message to translate"));
qDebug() << "translated string: " << msg; // NOT TRANSLATED
}
我真的不知道为什么... 感谢您的帮助。
注意:我使用 Qt5.2 并仔细检查了 .ts 文件是否包含正确的翻译字符串。
好的,我发现了问题,这只是一个愚蠢的疏忽:
QTranslator 是在堆栈上创建的,而不是动态创建的(在堆上),因此对象在方法结束时被销毁。 结果,它翻译了 UI,因为对象仍然存在,但稍后,当调用插槽时,没有任何内容被翻译。
这是我的代码:
//in the InterfaceWidget constructor:
QTranslator* myappTranslator = new QTranslator(QApplication::instance());
bool loaded = myappTranslator->load("myApp_" + QLocale::system().name());
qDebug() << "Is translation file loaded?" << loaded; // RETURNS TRUE
QApplication::installTranslator(myappTranslator);
ui.setupUi(this);
并在 ConfigurationTabUI(继承自 QWidget)中:
void ConfigurationTabUI::changeEvent(QEvent *e)
{
if (e->type() == QEvent::LanguageChange) {
ui.retranslateUi(this);
reset(); //my method to reload some data in UI
} else
QWidget::changeEvent(e);
}