у меня есть QMessageBox
как это:
QMessageBox::question(this, tr("Sure want to quit?"),
tr("Sure to quit?"), QMessageBox::Yes | QMessageBox::No);
Как я могу перевести слово Да / Нет? так как нет места для размещения tr()
?
Извините, я опоздал, но есть лучший способ решить вашу проблему.
Правильный способ — не переводить эти строки вручную. Qt уже включает переводы в translation
папка.
Идея состоит в том, чтобы загрузить переводы (qm
файлы) включены в Qt.
Я хотел бы показать вам код для перевода сообщения в соответствии с вашей локалью:
#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
потому что начиная с 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();
Там нет причин, чтобы сделать это. Эти тексты являются локализован в собственных файлах локализации 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
Обновить:
Я нашел в D:. \ Qt \ Qt5.7.0 \ 5.7 \ Src \ qttranslations \ Переводы \ qtbase _ ** ц уже есть файл перевода QPlatformTheme (к сожалению, нет 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.pro и вставьте строку, как показано ниже, для создания файла перевода на китайский язык:
TRANSLATIONS += gui_zh.ts
Открой gui.pro проект с Qt Creator и использовать LUPDATE генерировать новый исходный файл перевода Cute с именем gui_zh.ts.
Открой qui_zh.ts используя Linguist и перевести QPlatformTheme вещь. Здесь только переводится&Да »в качестве примера:
После перевода используйте lrelease создать двоичный файл перевода (gui_zh.qm).
Наконец, загрузите файлы переводов (gui_zh.qm) к вашему QApplication, текст кнопки QMessageBox будет в порядке.
Мои результаты:
QMessageBox::information(this,
QString("警告"),
QString("测试文本"),
QMessageBox::Yes | QMessageBox::No
);
Кстати, вы также можете использовать этот метод для решения проблем с переходами из контекстного меню некоторых QWidget, таких как QTextEdit, добавив переводы в C: \ Qt \ Qt5.7.0 \ 5,7 \ Src \ qtbase \ SRC \ виджеты \ widgets.pro.
В этом случае вы можете перевести текст «Сохранить» на другой язык, установив переводимый флажок, как показано ниже.
Какой язык зависит от локали, которую вы загружаете при загрузке приложения. Вы можете сделать это следующим образом
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