如何通过菜单动态重新翻译应用程序中的所有小部件?

时间:2016-08-13 08:11:01

标签: c++ qt qt5 translation

我正在开发一个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);
}

我面临的问题是要翻译的Q​​Strings很多(仅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

提前感谢您选择翻译我的应用程序的最佳方式的任何建议。

2 个答案:

答案 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();