如何为Qt UI文件使用Qt语言学家?
我正在使用Qt语言学家翻译一个ui文件。我使用lupdate获得了它的ts文件,并翻译了这些单词和短语。现在我想将它添加到我的代码中,但从它的教程中我发现,似乎我必须将tr添加到代码中的每个单词和短语中。我理解对了吗?我可以只加载一次翻译后的qm文件来进行翻译吗?如果是这样,我如何在这个ui文件中执行它 提前谢谢 更新 在更改Jens提到的属性后,在我的ui头文件中,我可以看到如下句子:如何为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
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;然后,您可以为警告窗口中的文本使用自己的重传功能。我可以使用此功能获得翻译后的警告窗口。