我有一个QMessageBox:
QMessageBox
QMessageBox::question(this, tr("Sure want to quit?"), tr("Sure to quit?"), QMessageBox::Yes | QMessageBox::No);
如何翻译是/否这个词?因为没有地方放置tr()?
tr()
rjjhvcjd1#
我这样做,不需要创建一个子类:
int Feedback = QMessageBox::information(this, "Info title", "Message to user.", "MyLocal_OK_text", "MyLocal_Cancel_text"); if(Feedback == 1){ //MyLocal_Cancel_text chosen actions }
am46iovg2#
对不起,我迟到了,但有一个最好的方法来解决你的问题。正确的方法是不要手动翻译这些字符串。Qt已经在translation文件夹中包含了翻译。这个想法是加载Qt中包含的翻译(qm文件)。我想给你看一段代码,让消息根据你的语言环境进行翻译:
translation
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
qtquickcontrols_*.qm
qtmultimedia_*qm
iqxoj9l93#
这是一个很好的例子。
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();
r7s23pms4#
update:在 D:\Qt\Qt5.7.0\5.7\Src\qttranslations\translations\qtbase_**.ts 中发现已经有了QPlatformTheme的翻译源文件(可惜没有 qtbase_zh_CN.ts),也可以复制一个qtbase_.ts立即修改。如果你和我一样是中国人,感谢wisaly(github),他已经把qtbase翻译成中文了,这里是github上的my fork**。
在阅读了Qt源代码后,我解决了这个问题。(我的Qt版本是Qt 5.7.0,用Src安装在 C:\Qt\Qt5.7.0 中)打开 C:\Qt\Qt5.7.0\5.7\Src\qtbase\src\gui\gui.pro,插入如下行,生成中文翻译文件:
TRANSLATIONS += gui_zh.ts
使用Qt Creator打开 * gui.pro * 项目,使用lupdate生成一个新的cute的翻译源文件,名为 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 );
顺便说一下,你也可以使用这个方法来解决一些QWidget的右contextmenu的翻译问题,比如QTextEdit,通过添加翻译到 C:\Qt\Qt5.7.0\5.7\Src\qtbase\src\widgets\widgets.pro。
9wbgstp75#
我为这个问题编写了一个特殊的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) { }
Gist:https://gist.github.com/kleuter/81a75a50e60a75aa0370a66ededc0c31
velaa5lx6#
没理由这么做这些文本 * 是 * 本地化在Qt自己的本地化文件。您需要在应用程序中提供并加载Qt的本地化。
d7v8vwbk7#
您可以通过单击下面的可翻译复选框将这种情况下的文本“保存”翻译为不同的语言。
哪种语言取决于加载应用程序时加载的区域设置。您可以按如下方式执行此操作QApplication app(argc, argv);//loading my_translation_pt fileQString file= app.applicationDirPath() +"/my_translation_pt";QTranslator translator;translator.load(file);//Setting the translator to the QAppapp.installTranslator(&translator);示例my_translation_pt文件附在下面
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);
您可以使用以下命令对翻译进行编码c:\Qt\4.7.1\bin>lrelease.exe:\temp\my_translation_pt
7条答案
按热度按时间rjjhvcjd1#
我这样做,不需要创建一个子类:
am46iovg2#
对不起,我迟到了,但有一个最好的方法来解决你的问题。
正确的方法是不要手动翻译这些字符串。Qt已经在
translation
文件夹中包含了翻译。这个想法是加载Qt中包含的翻译(
qm
文件)。我想给你看一段代码,让消息根据你的语言环境进行翻译:
注意事项:
void QLocale::setDefault(const QLocale & locale)
对其进行设置。Example。qt_*.qm
和qtbase_*.qm
,因为从Qt 5.3开始,翻译被拆分到不同的文件中。实际上,对于QMessageBox
,转换后的字符串在qtbase_*.qm
中。加载两者是一个很好的做法。More info。还有更多的qm
文件,如qtquickcontrols_*.qm
或qtmultimedia_*qm
。根据您的要求加载所需的。iqxoj9l93#
这是一个很好的例子。
并显示消息:
r7s23pms4#
update:在 D:\Qt\Qt5.7.0\5.7\Src\qttranslations\translations\qtbase_**.ts 中发现已经有了QPlatformTheme的翻译源文件(可惜没有 qtbase_zh_CN.ts),也可以复制一个qtbase_.ts立即修改。如果你和我一样是中国人,感谢wisaly(github),他已经把qtbase翻译成中文了,这里是github上的my fork**。
在阅读了Qt源代码后,我解决了这个问题。(我的Qt版本是Qt 5.7.0,用Src安装在 C:\Qt\Qt5.7.0 中)
打开 C:\Qt\Qt5.7.0\5.7\Src\qtbase\src\gui\gui.pro,插入如下行,生成中文翻译文件:
使用Qt Creator打开 * gui.pro * 项目,使用lupdate生成一个新的cute的翻译源文件,名为 gui_zh.ts。
使用Linguist打开 qui_zh.ts,翻译QPlatformTheme项。这里只翻译“&Yes”作为例子:
翻译完成后,使用lrelease生成二进制翻译文件(gui_zh.qm)。
最后,将翻译文件(gui_zh.qm)加载到您的QApplication中,QMessageBox的按钮文本将正常。
我的结果是:
顺便说一下,你也可以使用这个方法来解决一些QWidget的右contextmenu的翻译问题,比如QTextEdit,通过添加翻译到 C:\Qt\Qt5.7.0\5.7\Src\qtbase\src\widgets\widgets.pro。
9wbgstp75#
我为这个问题编写了一个特殊的QMessageBoxEx类。
Gist:https://gist.github.com/kleuter/81a75a50e60a75aa0370a66ededc0c31
velaa5lx6#
没理由这么做这些文本 * 是 * 本地化在Qt自己的本地化文件。您需要在应用程序中提供并加载Qt的本地化。
d7v8vwbk7#
您可以通过单击下面的可翻译复选框将这种情况下的文本“保存”翻译为不同的语言。
哪种语言取决于加载应用程序时加载的区域设置。您可以按如下方式执行此操作
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