繁体   English   中英

如何翻译qmessagebox中的按钮?

[英]How to translate the buttons in qmessagebox?

我有一个像这样的QMessageBox

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

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

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

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

想法是加载Qt中包含的翻译( qm文件)。

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

#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();
}

笔记:

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

这是这样做的方法:

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"));

并显示消息:

messageBox.exec();

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


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

打开C:\\ Qt \\ Qt5.7.0 \\ 5.7 \\ Src \\ qtbase \\ src \\ gui \\ gui.pro并插入如下所示的行以生成中文翻译文件:

TRANSLATIONS    +=  gui_zh.ts

打开使用Qt Creator中的gui.pro项目并使用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
);

在此输入图像描述

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

没有理由这样做。 这些文本定位于Qt的自己的本地化文件。 您需要在应用程序中提供,也许还要加载Qt的本地化。

我为这个问题写了一个特殊的QMessageBoxEx类。

// init once your button texts
QMessageBoxEx::setCustomTextForButton(QMessageBox::Yes, "Да");
QMessageBoxEx::setCustomTextForButton(QMessageBox::No, "Нет");

// example usage
if (QMessageBoxEx::question(this, "Внимание", "Ошибка", QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes)
{
   // OK
}

// header

class QMessageBoxEx : public QMessageBox
{
private:

    static QMap<QMessageBox::StandardButton, QString> m_customButtonNames;

protected:

    static void setCustomTextForButtons(QMessageBoxEx &msgBox);

public:

    QMessageBoxEx(QWidget *parent);

    static void setCustomTextForButton(QMessageBox::StandardButton button, const QString &text);

    static QMessageBox::StandardButton critical(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = QMessageBox::Ok, QMessageBox::StandardButton defaultButton = NoButton);
    static QMessageBox::StandardButton information(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = QMessageBox::Ok, QMessageBox::StandardButton defaultButton = NoButton);
    static QMessageBox::StandardButton question(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = QMessageBox::StandardButtons(QMessageBox::Yes | QMessageBox::No), QMessageBox::StandardButton defaultButton = QMessageBox::NoButton);
    static QMessageBox::StandardButton warning(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = QMessageBox::Ok, QMessageBox::StandardButton defaultButton = NoButton);

};

// implementation

QMap<QMessageBox::StandardButton, QString> QMessageBoxEx::m_customButtonNames;

void QMessageBoxEx::setCustomTextForButton(QMessageBox::StandardButton button, const QString &text)
{
    if (m_customButtonNames.contains(button))
        m_customButtonNames.erase(m_customButtonNames.find(button));

    m_customButtonNames[button] = text;
}

void QMessageBoxEx::setCustomTextForButtons(QMessageBoxEx &msgBox)
{
    if (m_customButtonNames.size())
    {
        QMessageBox::StandardButtons buttons = msgBox.standardButtons();

        for (auto button : m_customButtonNames.keys())
        {
            if (buttons & button)
            {
                msgBox.setButtonText(button, m_customButtonNames[button]);
            }
        }
    }
}

QMessageBox::StandardButton QMessageBoxEx::critical(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton)
{
    QMessageBoxEx msgBox(parent);

    msgBox.setIcon(QMessageBox::Critical);
    msgBox.setWindowTitle(title);
    msgBox.setText(text);
    msgBox.setStandardButtons(buttons);
    msgBox.setDefaultButton(defaultButton);

    setCustomTextForButtons(msgBox);

    return (QMessageBox::StandardButton)msgBox.exec();
}

QMessageBox::StandardButton QMessageBoxEx::information(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton)
{
    QMessageBoxEx msgBox(parent);

    msgBox.setIcon(QMessageBox::Information);
    msgBox.setWindowTitle(title);
    msgBox.setText(text);
    msgBox.setStandardButtons(buttons);
    msgBox.setDefaultButton(defaultButton);

    setCustomTextForButtons(msgBox);

    return (QMessageBox::StandardButton)msgBox.exec();
}

QMessageBox::StandardButton QMessageBoxEx::question(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton)
{
    QMessageBoxEx msgBox(parent);

    msgBox.setIcon(QMessageBox::Question);
    msgBox.setWindowTitle(title);
    msgBox.setText(text);
    msgBox.setStandardButtons(buttons);
    msgBox.setDefaultButton(defaultButton);

    setCustomTextForButtons(msgBox);

    return (QMessageBox::StandardButton)msgBox.exec();
}

QMessageBox::StandardButton QMessageBoxEx::warning(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton)
{
    QMessageBoxEx msgBox(parent);

    msgBox.setIcon(QMessageBox::Warning);
    msgBox.setWindowTitle(title);
    msgBox.setText(text);
    msgBox.setStandardButtons(buttons);
    msgBox.setDefaultButton(defaultButton);

    setCustomTextForButtons(msgBox);

    return (QMessageBox::StandardButton)msgBox.exec();
}

QMessageBoxEx::QMessageBoxEx(QWidget *parent) : QMessageBox(parent)
{

}

要点: https//gist.github.com/kleuter/81a75a50e60a75aa0370a66ededc0c31

您可以通过单击如下所示的可翻译复选框将本案例中的文本“保存”翻译为不同的语言。

在此输入图像描述

哪种语言取决于加载应用程序时加载的语言环境。 您可以按如下方式执行此操作

QApplication app(argc, argv);
//loading my_translation_pt file
QString file= app.applicationDirPath() +"/my_translation_pt";
QTranslator translator;
translator.load(file);
//Setting the translator to the QApp
app.installTranslator(&translator);

示例my_translation_pt文件附在下面

在此输入图像描述

你可以使用编码转换
c:\\ Qt \\ 4.7.1 \\ bin> lrelease.exe:\\ temp \\ my_translation_pt

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM