Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 翻译在Qt中不起作用_C++_Qt_Translation - Fatal编程技术网

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
宏中使用编译时字符串。@Saz
QT_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]));
}