如何为Qt UI文件使用Qt语言学家?

如何为Qt UI文件使用Qt语言学家?,qt,user-interface,translation,linguistics,Qt,User Interface,Translation,Linguistics,我正在使用Qt语言学家翻译一个ui文件。我使用lupdate获得了它的ts文件,并翻译了这些单词和短语。现在我想将它添加到我的代码中,但从它的教程中我发现,似乎我必须将tr添加到代码中的每个单词和短语中。我理解对了吗?我可以只加载一次翻译后的qm文件来进行翻译吗?如果是这样,我如何在这个ui文件中执行它 提前谢谢 更新 在更改Jens提到的属性后,在我的ui头文件中,我可以看到如下句子: buttonSetupData->setText(QApplication::translate("M

我正在使用Qt语言学家翻译一个ui文件。我使用lupdate获得了它的ts文件,并翻译了这些单词和短语。现在我想将它添加到我的代码中,但从它的教程中我发现,似乎我必须将tr添加到代码中的每个单词和短语中。我理解对了吗?我可以只加载一次翻译后的qm文件来进行翻译吗?如果是这样,我如何在这个ui文件中执行它

提前谢谢

更新

在更改Jens提到的属性后,在我的ui头文件中,我可以看到如下句子:

buttonSetupData->setText(QApplication::translate("MainWindow", "Set Data", 0, QApplication::UnicodeUTF8));
在Ajith回答之后,我更改了代码,现在ui_main.h文件中的重传函数如下所示:

void retranslateUi ( QMainWindow *MainWindow )
{
    QTranslator translator;
    translator.load ( " ...\Test.ts " );
    QApplication::installTranslator ( &translator );

    MainWindow->setWindowTitle ( QApplication::translate ("MainWindow",  "The Sentioscope - Beta v2.0 for Soccer", 0, QApplication::UnicodeUTF8));

    ...
}
void MainWindow::translate()
{
     QTranslator translator;
     translator.load ( "Test.qm", "D:\\" );
     qApp->installTranslator ( &translator );
     retranslateUi ( this );
 }
MainWindow::MainWindow ( QWidget *parent ) : QMainWindow ( parent )
{
    setupUi(this);
    translate();
}
但它仍然不起作用

最新更新

我当前用于读取.qm文件的函数如下:

void retranslateUi ( QMainWindow *MainWindow )
{
    QTranslator translator;
    translator.load ( " ...\Test.ts " );
    QApplication::installTranslator ( &translator );

    MainWindow->setWindowTitle ( QApplication::translate ("MainWindow",  "The Sentioscope - Beta v2.0 for Soccer", 0, QApplication::UnicodeUTF8));

    ...
}
void MainWindow::translate()
{
     QTranslator translator;
     translator.load ( "Test.qm", "D:\\" );
     qApp->installTranslator ( &translator );
     retranslateUi ( this );
 }
MainWindow::MainWindow ( QWidget *parent ) : QMainWindow ( parent )
{
    setupUi(this);
    translate();
}
然后我这样调用这个函数:

void retranslateUi ( QMainWindow *MainWindow )
{
    QTranslator translator;
    translator.load ( " ...\Test.ts " );
    QApplication::installTranslator ( &translator );

    MainWindow->setWindowTitle ( QApplication::translate ("MainWindow",  "The Sentioscope - Beta v2.0 for Soccer", 0, QApplication::UnicodeUTF8));

    ...
}
void MainWindow::translate()
{
     QTranslator translator;
     translator.load ( "Test.qm", "D:\\" );
     qApp->installTranslator ( &translator );
     retranslateUi ( this );
 }
MainWindow::MainWindow ( QWidget *parent ) : QMainWindow ( parent )
{
    setupUi(this);
    translate();
}
在Ajith的最新回答之后,我更改了此表单中警告/消息框的每个字符串,例如:

QMessageBox::warning( this, QMessageBox::tr("ERROR"), QMessageBox::tr("Invalid IP adress") );

通过lupdate,我可以读取所有这些字符串,进行翻译,并将它们保存在qm文件中。现在的问题是,它可以将这些字符串转换为ui,但不能在执行后转换为警告/消息框

你所描述的非常正确。
QtDesigner/QtCreator允许每个ui元素选择是否翻译其文本,以查看每个ui元素的属性。如果选择了translation,则tr将被放入生成的ui_xxx.h文件中,并从该文件中与任何其他可翻译单词一样呈现。

我不完全确定您想从该问题中实现什么。我认为您正在寻找一种方法,可以在运行时从C++代码中加载QM文件。如果是这样,你需要做的就是使用这个类

更新

这对我很有用

mainwindow.cpp

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    isChinese(false)
{
    ui->setupUi(this);
    msgbox = new QMessageBox(QMessageBox::NoIcon, "", "", QMessageBox::NoButton, this);
    pbtn = msgbox->addButton("Ok", QMessageBox::AcceptRole);

    doRetranslate();

    QObject::connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(doTranslate()));
    QObject::connect(ui->pushButton, SIGNAL(clicked()), msgbox, SLOT(show()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::doTranslate()
{
    QTranslator translator;
    if (!isChinese) {
        translator.load("test_zh_TW.qm", "../TestTranslator");
        qApp->installTranslator(&translator);
        isChinese = true;
    } else {
        translator.load("", ""); // Default is english
        qApp->installTranslator(&translator);
        isChinese = false;
    }
    ui->retranslateUi(this);
    doRetranslate();
}

void MainWindow::doRetranslate()
{
    msgbox->setWindowTitle(QObject::tr("ERROR"));
    msgbox->setText(QObject::tr("Invalid IP adress"));
    pbtn->setText(QObject::tr("Ok"));
}
主窗口

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMessageBox>
#include <QPushButton>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    void doRetranslate();
public slots:
    void doTranslate();

private:
    Ui::MainWindow *ui;
    bool isChinese;
    QMessageBox *msgbox;
    QPushButton *pbtn;
};

#endif // MAINWINDOW_H
mainwindow.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>300</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralWidget">
   <widget class="QLabel" name="label">
    <property name="geometry">
     <rect>
      <x>100</x>
      <y>70</y>
      <width>181</width>
      <height>17</height>
     </rect>
    </property>
    <property name="text">
     <string>Hello World!</string>
    </property>
    <property name="alignment">
     <set>Qt::AlignCenter</set>
    </property>
   </widget>
   <widget class="QPushButton" name="pushButton">
    <property name="geometry">
     <rect>
      <x>140</x>
      <y>120</y>
      <width>93</width>
      <height>27</height>
     </rect>
    </property>
    <property name="text">
     <string>translate</string>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menuBar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>400</width>
     <height>23</height>
    </rect>
   </property>
  </widget>
  <widget class="QToolBar" name="mainToolBar">
   <attribute name="toolBarArea">
    <enum>TopToolBarArea</enum>
   </attribute>
   <attribute name="toolBarBreak">
    <bool>false</bool>
   </attribute>
  </widget>
  <widget class="QStatusBar" name="statusBar"/>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections>
  <connection>
   <sender>pushButton</sender>
   <signal>clicked()</signal>
   <receiver>label</receiver>
   <slot>update()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>199</x>
     <y>165</y>
    </hint>
    <hint type="destinationlabel">
     <x>206</x>
     <y>114</y>
    </hint>
   </hints>
  </connection>
 </connections>
</ui>

谢谢你的回答。你能告诉我如何在我的ui文件中使用它吗?如果我有一个cpp文件,我可以像教程中那样加载ts文件,但这里我的文件是一个.ui文件。我看到它添加了::tranlate。。。现在在它的头文件中。我想在ui或它的头文件中加载它,而不是在cpp中,因为我完全按照您提到的那样尝试了它,但失败了。不应该是lupdate问题。lupdate只扫描文本文件和字符串,并使用translate函数标记字符串,然后填充.ts文件。检查源文件,确保您想要的字符串被tr或translate函数标记。不需要两个qm文件。lupdate的结果应该在一个ts文件中,在不同的上下文中。作为测试,我认为您应该尝试从命令行运行lupdate。我现在无法测试它,但请尝试“lupdate*{cpp,h}-ts test.ts”。QApplication::translate的第一个参数是上下文,请手动将其设置为不同的上下文。您可以指定不同的上下文,它们都应该指向同一个ts文件。另外,让我看看你的.pro文件。如果使用-扩展名,语法应该是…'lupdate-扩展cpp,h,ui-ts test.ts'。我试图使用bash扩展,但由于当时没有环境检查我的命令,我忘记了第二个参数,它应该是本例中的路径“.”或当前目录。不管怎样,默认情况下包括这些扩展,应该不需要指定它们。我可以重现这个问题。我不知道为什么会这样。如果我在重新翻译之前调用警告窗口,它将显示翻译文本。也许你可以提出另一个问题,其他人可能会有更好的想法。另一种方法是使用创建自己的警告窗口。。。msgbox=newqmessageboxqmessagebox::NoIcon,,QMessageBox::NoButton,this;pbtn=msgbox->addButtonOk,QMessageBox::AcceptRole;然后,您可以为警告窗口中的文本使用自己的重传功能。我可以使用此功能获得翻译后的警告窗口。