簡體   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