C++ 翻译在Qt中不起作用
我一整天都在谷歌上寻找解决方案并修改代码,但运气不好 基本上,我已经将翻译添加到我的应用程序中。它工作正常,除了这里:C++ 翻译在Qt中不起作用,c++,qt,translation,C++,Qt,Translation,我一整天都在谷歌上寻找解决方案并修改代码,但运气不好 基本上,我已经将翻译添加到我的应用程序中。它工作正常,除了这里: QString MainWindow::getMessage(Messages msg) { static const char* const messages[] = { QT_TR_NOOP("Setting power on"), QT_TR_NOOP("Reading ID..."), QT_TR_NOOP("Pr
QString MainWindow::getMessage(Messages msg) {
static const char* const messages[] = {
QT_TR_NOOP("Setting power on"),
QT_TR_NOOP("Reading ID..."),
QT_TR_NOOP("Programming..."),
QT_TR_NOOP("Setting write-protect"),
QT_TR_NOOP("Finished ok"),
QT_TR_NOOP("PROGRAMMED OK"),
QT_TR_NOOP("ERROR!"),
QT_TR_NOOP("OK"),
QT_TR_NOOP("The programmer is not connected.\nPlease check the connection."),
QT_TR_NOOP("Disconnect the board, it is in short!!"),
QT_TR_NOOP("ERROR: Supply voltage too low (1 Volt is required, Measured: 0.0 Volt)."),
QT_TR_NOOP("Board is already programmed and write protected."),
QT_TR_NOOP("Check device connection or there is short."),
QT_TR_NOOP("Unknown error.")
};
return tr(messages[msg]);
}
然而,我没有得到翻译。用于翻译的文件似乎没有问题,UI翻译应用得很好。
我也试过:
static const char* const messages[] = {
QT_TRANSLATE_NOOP("test", "Setting power on"),
QT_TRANSLATE_NOOP("test", "Reading ID..."),
QT_TRANSLATE_NOOP("test", "Programming..."),
QT_TRANSLATE_NOOP("test", "Setting write-protect"),
QT_TRANSLATE_NOOP("test", "Finished ok"),
QT_TRANSLATE_NOOP("test", "PROGRAMMED OK"),
QT_TRANSLATE_NOOP("test", "ERROR!"),
QT_TRANSLATE_NOOP("test", "OK"),
QT_TRANSLATE_NOOP("test", "The programmer is not connected.\nPlease check the connection."),
QT_TRANSLATE_NOOP("test", "Disconnect the board, it is in short!!"),
QT_TRANSLATE_NOOP("test", "ERROR: Supply voltage too low (1 Volt is required, Measured: 0.0 Volt)."),
QT_TRANSLATE_NOOP("test", "Board is already programmed and write protected."),
QT_TRANSLATE_NOOP("test", "Check device connection or there is short."),
QT_TRANSLATE_NOOP("test", "Unknown error.")
};
然后,我有一个方法来获取消息:
QString MainWindow::getMessage(Messages msg) {
return qApp->translate("test", messages[msg]);
}
但它也不起作用
有什么提示或建议吗?我准备了一个更简单的源文件上传到这里,但现在它运行良好!我昨天重启了我的电脑,你知道,有时候重启会修复一切(?)。 无论如何,这里有一些来源,因为它被要求。顺便说一句,我正在进行动态翻译,让用户选择语言(而不是检测区域设置): 这是main.cpp(我没有添加任何内容):
#包括“mainwindow.h”
#包括
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
主窗口w;
w、 show();
返回a.exec();
}
这是mainwindow.cpp:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDir>
#include <QTranslator>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QDir d(":/translations/");
QStringList files = d.entryList(QStringList("*.qm"));
qDebug("There are %d files for translation", files.count());
// Now let's fill the combobox
this->ui->comboBox->clear();
for (int i = 0; i < files.count(); ++i) {
QTranslator translator;
translator.load(files[i], ":/translations/");
QString language = translator.translate("MainWindow",
"English");
this->ui->comboBox->addItem(language);
}
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_comboBox_currentIndexChanged(int index)
{
// Now, based on the new itemindex, let's change the translator
QString selectedLang = this->ui->comboBox->itemText(index);
QString language;
QDir d(":/translations/");
QStringList files = d.entryList(QStringList("*.qm"));
for (int i = 0; i < files.count(); ++i) {
QTranslator translator;
translator.load(files[i], ":/translations/");
language = translator.translate("MainWindow",
"English");
if (language == selectedLang) {
if (!qApp->installTranslator(&translator)) {
qDebug("ERROR INSTALLING TRANSLATOR !!!");
}
this->uiTranslate();
break;
}
}
}
/// This function translates all the UI texts:
void MainWindow::uiTranslate(void) {
this->setWindowTitle(tr("MainWindow"));
// Just for testing, also show all the messages
for (int i = 0; i < MSG_LAST; ++i) {
this->ui->textBrowser->append(this->getMessage((Messages)i));
}
}
QString MainWindow::getMessage(Messages idx) {
static const char* const messagesText[MSG_LAST] = {
QT_TR_NOOP("Hello!"),
QT_TR_NOOP("Bye bye"),
QT_TR_NOOP("Nice to meet you")
};
return (tr(messagesText[idx]));
}
#包括“mainwindow.h”
#包括“ui_main window.h”
#包括
#包括
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
QDir d(“:/translations/”);
QStringList files=d.entryList(QStringList(“*.qm”);
qDebug(“有%d个文件需要翻译”,files.count());
//现在让我们填充组合框
此->用户界面->组合框->清除();
对于(int i=0;i用户界面->组合框->附加项(语言);
}
}
MainWindow::~MainWindow()
{
删除用户界面;
}
void主窗口::在组合框上\u currentIndexChanged(int索引)
{
//现在,基于新的itemindex,让我们更改转换器
QString selectedLang=this->ui->comboBox->itemText(索引);
QString语言;
QDir d(“:/translations/”);
QStringList files=d.entryList(QStringList(“*.qm”);
对于(int i=0;iinstallTranslator(&translator)){
qDebug(“安装转换器时出错!!!”;
}
这->uTranslate();
打破
}
}
}
///此函数转换所有UI文本:
void主窗口::uiTranslate(void){
此->设置窗口标题(tr(“主窗口”);
//仅用于测试,还显示所有消息
对于(int i=0;i用户界面->文本浏览器->附加(这个->获取消息((消息)i));
}
}
QString主窗口::getMessage(Messages idx){
静态常量字符*常量消息文本[MSG_LAST]={
QT_TR_NOOP(“你好!”),
QT_TR_NOOP(“再见”),
QT_TR_NOOP(“很高兴认识你”)
};
返回(tr(messagesText[idx]);
}
在这个测试应用程序中,UI只有一个组合框和一个文本浏览器。
组合框中填充了资源文件中包含的语言。
当我更改组合框时,主窗口标题将更改,消息将以正确的语言打印
无论如何谢谢你!
致以最诚挚的问候,我在这里找到了真正的问题。 通常转换器安装在main.cpp,因此转换器对象保留在内存中。 但是,在我的例子中,在用户更改“设置”对话框中的语言后,我使用一个局部变量切换转换器,但是
void QCoreApplication::installTranslator(QTranslator*translationFile)[static]
需要一个指针。该局部变量将在函数退出后立即删除。
因此,我在我的类上声明了一个
QTranslator
对象,因此它保留在内存中。可能不适用于这种情况,但人们经常忘记在类声明中放置Q\u对象
宏。导致(除其他外)tr()
不起作用。您正在做两次翻译。为什么?建议:只在tr
宏中使用编译时字符串。@SazQT_tr_NOOP
不翻译任何内容。宏除了向lupdate
工具提示在何处查找可翻译文本外,什么也不做。查看您是否将.ts
文件编译为.qm
文件?您能在设置QTranslator
的main.cpp
中添加代码吗?谢谢您的回答-您节省了我的时间!
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDir>
#include <QTranslator>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QDir d(":/translations/");
QStringList files = d.entryList(QStringList("*.qm"));
qDebug("There are %d files for translation", files.count());
// Now let's fill the combobox
this->ui->comboBox->clear();
for (int i = 0; i < files.count(); ++i) {
QTranslator translator;
translator.load(files[i], ":/translations/");
QString language = translator.translate("MainWindow",
"English");
this->ui->comboBox->addItem(language);
}
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_comboBox_currentIndexChanged(int index)
{
// Now, based on the new itemindex, let's change the translator
QString selectedLang = this->ui->comboBox->itemText(index);
QString language;
QDir d(":/translations/");
QStringList files = d.entryList(QStringList("*.qm"));
for (int i = 0; i < files.count(); ++i) {
QTranslator translator;
translator.load(files[i], ":/translations/");
language = translator.translate("MainWindow",
"English");
if (language == selectedLang) {
if (!qApp->installTranslator(&translator)) {
qDebug("ERROR INSTALLING TRANSLATOR !!!");
}
this->uiTranslate();
break;
}
}
}
/// This function translates all the UI texts:
void MainWindow::uiTranslate(void) {
this->setWindowTitle(tr("MainWindow"));
// Just for testing, also show all the messages
for (int i = 0; i < MSG_LAST; ++i) {
this->ui->textBrowser->append(this->getMessage((Messages)i));
}
}
QString MainWindow::getMessage(Messages idx) {
static const char* const messagesText[MSG_LAST] = {
QT_TR_NOOP("Hello!"),
QT_TR_NOOP("Bye bye"),
QT_TR_NOOP("Nice to meet you")
};
return (tr(messagesText[idx]));
}