Как перевести кнопки в qmessagebox?

у меня есть QMessageBox как это:

QMessageBox::question(this, tr("Sure want to quit?"),
tr("Sure to quit?"), QMessageBox::Yes | QMessageBox::No);

Как я могу перевести слово Да / Нет? так как нет места для размещения tr()?

13

Решение

Извините, я опоздал, но есть лучший способ решить вашу проблему.

Правильный способ — не переводить эти строки вручную. 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();
}

Заметки:

  • Вы можете загрузить другое местоположение, создав новый объект QLocale и установив его, используя void QLocale::setDefault(const QLocale & locale), пример.
  • Я загружаю qt_*.qm а также qtbase_*.qm потому что начиная с Qt 5.3 переводы делятся на разные файлы. На самом деле, для QMessageBox переведенные строки находятся в qtbase_*.qm, Загрузка обоих — хорошая практика. Больше информации. Есть еще qm файлы как qtquickcontrols_*.qm или же qtmultimedia_*qm, Загрузите необходимые в соответствии с вашими требованиями.
  • Возможно, вы найдете текст, который вы пытаетесь перевести, еще не переведенный Qt. В этом случае я рекомендую вам обновить версию Qt, чтобы проверить, существует ли перевод в самой последней версии, или внести изменения самостоятельно. Несколько полезных ссылок: Вот а также Вот.
12

Другие решения

Это способ сделать это:

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();
9

Там нет причин, чтобы сделать это. Эти тексты являются локализован в собственных файлах локализации Qt. Вы должны предоставить и, возможно, также загрузить локализации Qt в вашем приложении.

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

1

Обновить:
Я нашел в 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.

1

В этом случае вы можете перевести текст «Сохранить» на другой язык, установив переводимый флажок, как показано ниже.

введите описание изображения здесь

Какой язык зависит от локали, которую вы загружаете при загрузке приложения. Вы можете сделать это следующим образом

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

0
По вопросам рекламы [email protected]