我有QMessageBox
这样:
QMessageBox::question(this, tr("Sure want to quit?"),
tr("Sure to quit?"), QMessageBox::Yes | QMessageBox::No);
我怎么能翻译是/否单词?因为没有地方放置tr()
?
答案 0 :(得分:14)
抱歉,我迟到了,但有一种解决问题的最佳方法。
正确的方法不是手动翻译这些字符串。 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)
进行设置。 Example。qt_*.qm
和qtbase_*.qm
,因为自Qt 5.3起,翻译被拆分为不同的文件。实际上,对于QMessageBox
,已翻译的字符串位于qtbase_*.qm
中。加载两者都是一种很好的做法。 More info。还有更多qm
个文件,例如qtquickcontrols_*.qm
或qtmultimedia_*qm
。根据您的要求加载所需的文件。答案 1 :(得分:9)
这是做到这一点的方法:
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();
答案 2 :(得分:2)
<强>更新强>: 我发现在 D:\ Qt \ Qt5.7.0 \ 5.7 \ Src \ qttranslations \ translations \ qtbase _ **。ts 已经有了QPlatformTheme的翻译srouce文件(不幸的是,没有 qtbase_zh_CN。 ts ),您也可以复制qtbase _ **。ts并立即修改它。 如果你是像我一样的中国人,感谢 wisaly(github) ,他已经将qtbase翻译成中文,这里是github上的 my fork 。
阅读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的新的可爱翻译源文件。 < / p>
使用Linguist打开 qui_zh.ts 并翻译 QPlatformTheme 项。这里只翻译了“&amp; 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添加翻译来解决QTextEdit等一些QWidgets的正确上下文转换问题\ widgets.pro
答案 3 :(得分:1)
没有理由这样做。这些文本 本地化在Qt自己的本地化文件中。您需要在应用程序中提供,也许还要加载Qt的本地化。
答案 4 :(得分:1)
我为这个问题编写了一个特殊的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
答案 5 :(得分:0)
您可以通过点击以下可翻译复选框将“保存”文本翻译成其他语言。
哪种语言取决于加载应用程序时加载的语言环境。您可以按照以下步骤进行操作
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