如何在 Qt 中即时翻译语言
Posted
技术标签:
【中文标题】如何在 Qt 中即时翻译语言【英文标题】:How to translate language in Qt on the fly 【发布时间】:2012-04-19 08:14:11 【问题描述】:我正在使用 Translator 和 linguist 在我的 Qt symbain 应用程序中翻译语言,但我想即时执行此操作(在运行时),我尝试了开发人员网络提供的解决方案,但它不适用于我
#include "languagetranslator.h"
#include "constants.h"
#include <QSettings>
#include <HelperClasses/Strings.h>
#include <QTranslator>
#include <AppStatus/appstatus.h>
#include <QApplication>
QTranslator* LanguageTranslator::current = 0;
LanguageTranslator::LanguageTranslator(int& argc, char* argv[]) : QApplication(argc, argv)
LanguageTranslator::~LanguageTranslator()
void LanguageTranslator::loadTranslation()
QString language;
language = AppStatus::getCurrentLanguage();
loadTranslation(language);
qDebug("language from laodtranslation = %s",language.toLatin1().data());
//qDebug(language.toLatin1());
void LanguageTranslator::loadTranslation(QString language)
//QApplication app;
QTranslator* translator = new QTranslator(instance());
translator->load(language);
installTranslator(&translator);
//exec();
它仅在我在 main.cpp 中声明并重新启动应用程序时才有效,我也在选择新语言后调用此方法是否有任何我遗漏的东西。我正在关注以下链接http://www.qtcentre.org/wiki/index.php?title=Dynamic_translation_in_Qt4_applications
设置新语言时是否必须调用 void MainWindow::changeEvent(QEvent *event)
这是我在 mainWindow 中声明的 changeEvent() 方法,我从这里调用 setLanguage();
void MainWindow::changeEvent(QEvent *event)
if(event->type() == QEvent::LanguageChange)
ui->retranslateUi(this);
// retranslate();
setLanguage();
QMainWindow::changeEvent(event);
void MainWindow::setLanguage()
QString myLanguage;
int iIndex = AppStatus::getSettingsData().at(3);
switch(iIndex)
case ENGLISH:
myLanguage = "language_en";
break;
case SPANISH:
myLanguage = "language_es";
break;
AppStatus::saveCurrentLanguage(myLanguage);
LanguageTranslator::loadTranslation(myLanguage);
来自 setLangauge() 我正在调用 languageTranslator() 有什么我想念的吗? 这是我的主要课程
int main(int argc, char *argv[])
LanguageTranslator app(argc, argv);
QString lang = AppStatus::getCurrentLanguage();
app.installTranslator(&translator);
MainWindow mainWindow;
mainWindow.setOrientation(MainWindow::ScreenOrientationLockPortrait);
//About mainWindow;
#if defined(Q_OS_SYMBIAN)
mainWindow.showMaximized();
#else
mainWindow.show();
#endif
// mainWindow.showFullScreen();
app.connect(&app,SIGNAL(lastWindowClosed()),&app,SLOT(quit()));
return app.exec();
【问题讨论】:
不要从 changeEvent() 中调用 setLanguage()!您应该从可以更改语言的任何地方调用 setLanguage()。 setLanguage() 调用 LanguageTranslator::loadTranslation() 调用 QApplication::installTranslator() 创建一个 LanguageChange 事件,然后在 MainWindow::changeEvent 中捕获该事件 【参考方案1】:您提供的链接指出:
然而,基本原则是在每个必须知道动态语言变化的小部件中重写 QWidget::changeEvent()。
这是必需的,因为installTranslator()
将创建一个更改事件,该事件将发送到每个小部件。
这意味着,如果您希望重新翻译 MainWindow,您必须这样做:
void MainWindow::changeEvent(QEvent* event)
if (event->type() == QEvent::LanguageChange)
// retranslate designer form (single inheritance approach)
ui.retranslateUi(this);
// remember to call base class implementation
QMainWindow::changeEvent(event);
您必须为每个具有可翻译 GUI 的小部件执行此操作
[编辑 - 添加评论,因为它是问题的实际答案]
不要在 changeEvent() 中调用 setLanguage()!您应该从可以更改语言的任何地方调用 setLanguage()。 setLanguage() 调用 LanguageTranslator::loadTranslation() 调用 QApplication::installTranslator() 创建一个 LanguageChange 事件,然后在 MainWindow::changeEvent 中捕获该事件
【讨论】:
所以如果我有 3 个小部件,我必须在每个类中正确 changeEvent(),而且我正在使用 stackWidget,所以如何在每个页面上实现 changeEvent()。 您必须在三个小部件中的每一个中实现 changeEvent()。如果将这三个小部件添加到同一个 QStackWidget 中,则不必更改 QStackWidget。我几乎可以肯定 QStackWidget 会将 changeEvent() 转发给它的子小部件。 每次更改语言时有没有办法重新加载 mainWindow。 有:识别在构建过程中和语言变化时应该执行的代码。将该代码放入自己的函数中,并从构造函数和 changeEvent() 中调用该函数 感谢 tim 它现在可以工作了......我没有从我设置语言的地方调用 setLanguage()。以上是关于如何在 Qt 中即时翻译语言的主要内容,如果未能解决你的问题,请参考以下文章
无论操作系统语言如何,如何翻译使用预构建的 Qt 安装程序框架创建的安装程序