如何翻译qmessagebox中的按钮?

Nic*_* Yu 15 c++ qt messagebox language-translation

QMessageBox喜欢这样的:

QMessageBox::question(this, tr("Sure want to quit?"), 
    tr("Sure to quit?"), QMessageBox::Yes | QMessageBox::No);
Run Code Online (Sandbox Code Playgroud)

我怎么能翻译是/否单词?既然没有地方可以放置tr()

Tar*_*rod 14

对不起,我迟到了,但有一种解决问题的最佳方法.

正确的方法不是手动翻译这些字符串.Qt已经包含该translation文件夹中的翻译.

想法是加载qmQt中包含的翻译(文件).

我想向您展示一个代码,以根据您的语言环境翻译邮件:

#include <QDebug>
#include <QtWidgets/QApplication>
#include <QMessageBox>
#include <QTranslator>
#include <QLibraryInfo>

int main(int argc, char *argv[])
{

    QApplication app(argc, argv);

    QTranslator qtTranslator;
    if (qtTranslator.load(QLocale::system(),
                "qt", "_",
                QLibraryInfo::location(QLibraryInfo::TranslationsPath)))
    {
        qDebug() << "qtTranslator ok";
        app.installTranslator(&qtTranslator);
    }

    QTranslator qtBaseTranslator;
    if (qtBaseTranslator.load("qtbase_" + QLocale::system().name(),
                QLibraryInfo::location(QLibraryInfo::TranslationsPath)))
    {
        qDebug() << "qtBaseTranslator ok";
        app.installTranslator(&qtBaseTranslator);
    }

    QMessageBox::question(0, QObject::tr("Sure want to quit?"), QObject::tr("Sure to quit?"), QMessageBox::Yes | QMessageBox::No);

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

笔记:

  • 您可以加载另一个创建新QLocale对象并使用它设置的定位void QLocale::setDefault(const QLocale & locale).例子.
  • 我正在加载qt_*.qm,qtbase_*.qm因为从Qt 5.3开始,翻译被分割成不同的文件.事实上,对于QMessageBox翻译的字符串是在qtbase_*.qm.加载两者都是一种很好的做法.更多信息.有更多的qm文件,如qtquickcontrols_*.qmqtmultimedia_*qm.根据您的要求加载所需的.
  • 也许你可以找到你试图翻译的文本尚未被Qt翻译.在这种情况下,我建议您升级Qt版本以检查翻译是否存在于最新版本中,或者自行编码更改.一些有用的链接:这里这里.


dem*_*lus 10

这是这样做的方法:

QMessageBox messageBox(QMessageBox::Question,
            tr("Sure want to quit?"),
            tr("Sure to quit?"),
            QMessageBox::Yes | QMessageBox::No,
            this);
    messageBox.setButtonText(QMessageBox::Yes, tr("Yes"));
    messageBox.setButtonText(QMessageBox::No, tr("No"));
Run Code Online (Sandbox Code Playgroud)

并显示消息:

messageBox.exec();
Run Code Online (Sandbox Code Playgroud)

  • 这完全没必要.Qt已经完全本地化. (2认同)

dou*_*ufu 5

更新:我发现在D:\Qt\Qt5.7.0\5.7\Src\qttranslations\translations\qtbase_**.ts已经有 QPlatformTheme 的翻译源文件(可惜没有qtbase_zh_CN.ts),你也可以复制一个qtbase_**.ts 并立即修改它。如果你和我一样是中国人,感谢wisaly(github),他已经把qtbase翻译成中文了,这里是在github上的fork


阅读Qt源代码后,我解决了这个问题。(我的Qt版本是Qt 5.7.0,安装在C:\Qt\Qt5.7.0 with Src)

打开C:\Qt\Qt5.7.0\5.7\Src\qtbase\src\gui\gui.pro,插入如下一行,生成中文翻译文件:

TRANSLATIONS    +=  gui_zh.ts
Run Code Online (Sandbox Code Playgroud)

打开gui.pro与Qt Creator的项目并使用lupdate生成一个新的可爱的命名翻译源文件gui_zh.ts。

使用 Linguist打开qui_zh.ts并翻译QPlatformTheme项。这里仅以翻译“&Yes”为例: 在此处输入图片说明

翻译后,使用lrelease生成二进制翻译文件(gui_zh.qm)。

最后,将翻译文件(gui_zh.qm)加载到您的 QApplication 中,QMessageBox 的按钮文本就可以了。

我的结果是?

QMessageBox::information(this,
    QString("??"),
    QString("????"),
    QMessageBox::Yes | QMessageBox::No
);
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

顺便说一句,您还可以使用此方法通过将翻译添加到C:\Qt\Qt5.7.0\5.7\Src\qtbase\src\widgets\widgets.pro来解决某些 QWidget 的正确上下文菜单的转换问题,例如 QTextEdit 。