翻译在 Qt 中不起作用

Leo*_*ano 5 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("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]);
}
Run Code Online (Sandbox Code Playgroud)

但是,我没有得到翻译。翻译文件似乎没问题,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.")
};
Run Code Online (Sandbox Code Playgroud)

然后,我有一个方法来获取消息:

QString MainWindow::getMessage(Messages msg) {
    return qApp->translate("test", messages[msg]); 
}
Run Code Online (Sandbox Code Playgroud)

但它也不起作用。

任何提示或建议?

Leo*_*ano 0

我正在准备一个更简单的源代码上传到这里,但现在它工作正常!我昨天重新启动了我的电脑,你知道,有时重新启动可以解决所有问题(?)。无论如何,这里有一些所要求的来源。顺便说一句,我正在即时进行翻译,并让用户选择语言(而不是通过检测语言环境):

这是main.cpp(我没有添加任何内容):

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}
Run Code Online (Sandbox Code Playgroud)

这是主窗口.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]));
}
Run Code Online (Sandbox Code Playgroud)

在此测试应用程序中,UI 只有一个组合框和一个文本浏览器。组合框填充了资源文件中包含的语言。当我更改组合框时,主窗口标题会更改,并且消息会以正确的语言打印。

不管怎么说,还是要谢谢你!此致,