[英]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();
}
筆記:
void QLocale::setDefault(const QLocale & locale)
。 例子 。 qt_*.qm
qtbase_*.qm
和qtbase_*.qm
因為從Qt 5.3開始,翻譯被分割成不同的文件。 實際上,對於QMessageBox
,翻譯的字符串在qtbase_*.qm
。 加載兩者都是一種很好的做法。 更多信息 有更多的qm
文件,如qtquickcontrols_*.qm
或qtmultimedia_*qm
。 根據您的要求加載所需的。 這是這樣做的方法:
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.