我正在开发一个Qt项目,该项目包含QMainWindow
和多个Qt和非Qt类。他们中的许多人使用QS字符串与Qt语言学家翻译tr()
。应用程序菜单中的QActions会触发语言更改(QTranslator
加载和安装/ QTranslator
加载和删除)。
我已阅读the official Qt documentation concerning dynamic translation,它基本上建议以下重载:
void MainWindow::changeEvent(QEvent *event)
{
if (event->type() == QEvent::LanguageChange) {
titleLabel->setText(tr("Document Title"));
... // all my tr() QStrings here
okPushButton->setText(tr("&OK"));
} else
QWidget::changeEvent(event);
}
我面临的问题是要翻译的QStrings很多(仅QMainWindow
中有58个),还有几个在运行时通过用户交互填充;即G。下面的myFunction(a,b)
是通过QPushButton
:
void MainWindow::myFunction(MyClassA a, MyClassB b)
{
...
if(b.myCondition() == 0)
{
...
// below is the problem
myLabel->setText(myLabel->text() + QString("\n" + a->getName() + tr(" gagne ") + exp + tr(" points d'expérience")));
}
else
{
myLabel->setText(QString(tr("something else")));
}
...
}
所以我几乎看不出如何在上面的QString
方法中包含这种类型的changeEvent()
。那些MainWindow
之外的类还有QStrings可以翻译但不是QWidget
(所以没有changeEvent
可能过载)?
我已经读过使用此方法的另一种方法,使用UI格式:
void MainWindow::changeEvent(QEvent* event)
{
if (event->type() == QEvent::LanguageChange)
{
ui.retranslateUi(this);
}
...
}
但这涉及我在我的项目中使用UI表单,我没有这样做(所有小部件都是在代码中创建的)。 我试图以UI形式导出我的MainWindow,但是当我尝试将生成的标题包含到项目中时,我收到以下错误:
ui_fenetreprincipale.h:32: error: qmainwindowlayout.h: No such file or directory
提前感谢您选择翻译我的应用程序的最佳方式的任何建议。
答案 0 :(得分:2)
整理您的代码,以便在每个类中使用一种方法完成可翻译字符串的所有设置。
例如,为每个具有可翻译字符串的类提供实际设置字符串的setTrs()方法。
class A
{
void setTrs()
{
okPushButton->setText(tr("&OK"));
}
}
//--------------
class B
{
int _trCond;
void myFunction(MyClassA a, MyClassB b)
{
_trCond = b.myCondition();
setTrs();
}
void setTrs()
{
if(_trCond == 0)
myLabel->setText(myLabel->text() + QString("\n" + a->getName() + tr(" gagne ") + exp + tr(" points d'expérience")));
else
myLabel->setText(QString(tr("something else")));
}
然后,只要应用程序的语言发生变化(例如连接到菜单项选择,或者MainWindow :: event(),或者所需的语言可以更改),您必须手动调用每个语言的setTrs
方法这些对象
例如
void MainWindow::changeEvent(QEvent *event)
{
if (event->type() == QEvent::LanguageChange)
{
setTrs();
objA.setTrs();
objB.setTrs();
}
}
更优雅的是将对象存储在QList中,然后遍历它,依次调用每个元素上的setTrs
方法
答案 1 :(得分:0)
我遇到了同样的问题,菜单无法翻译,通过创建和安装QTranslator来完全解决...
QScopedPointer<QApplication> app(new QApplication(argc, argv));
QTranslator myappTranslator;
myappTranslator.load(QString("Languages/de"))
app->installTranslator(&myappTranslator);
...在创建并显示主窗口之前...
MainWindow *mainWin;
mainWin = new MainWindow(&splash);
mainWin->show();