web-dev-qa-db-ja.com

qmessageboxのボタンを翻訳する方法は?

私はこのようなQMessageBoxを持っています:

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

はい/いいえの単語をどのように翻訳できますか? tr()を配置する場所がないので?

17
Nicholas Yu

申し訳ありませんが、遅れていますが、問題を解決する最善の方法があります。

正しい方法は、これらの文字列を手動で翻訳しないことです。 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();
}
_

ノート:

  • 別のロケートをロードして、新しいQLocaleオブジェクトを作成し、void QLocale::setDefault(const QLocale & locale)を使用して設定できます。
  • Qt 5.3以降、翻訳が異なるファイルに分割されているため、_qt_*.qm_と_qtbase_*.qm_を読み込んでいます。実際、QMessageBoxの場合、翻訳された文字列は_qtbase_*.qm_にあります。両方をロードすることをお勧めします。 詳細 。 _qtquickcontrols_*.qm_や_qtmultimedia_*qm_のようなqmファイルは他にもあります。要件に応じて必要なものをロードします。
  • たぶん、あなたが翻訳しようとしているテキストがまだQtによって翻訳されていないのを見つけることができます。この場合、Qtバージョンをアップグレードして、翻訳が最新バージョンに存在するかどうかを確認するか、変更を自分でコーディングすることをお勧めします。いくつかの便利なリンク: ここ および ここ
15
Tarod

これはそれを行う方法です:

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();
10
demonplus

updateD:\ Qt\Qt5.7.0\5.7\Src\qttranslations\translations\qtbase _ **で見つかりました.tsにはすでに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\gui.proを開き、次のような行を挿入して中国語の翻訳ファイルを生成します。

TRANSLATIONS    +=  gui_zh.ts

Qt Creatorでgui.proプロジェクトを開き、lupdateを使用して新しいかわいいの翻訳ソースファイルを生成します名前付きgui_zh.ts。

Linguistを使用してqui_zh.tsを開き、QPlatformThemeアイテムを翻訳します。ここでは、例として「&Yes」のみを翻訳しました: enter image description here

翻訳後、lreleaseを使用してバイナリ翻訳ファイル(gui_zh.qm)を生成します。

最後に、翻訳ファイル(gui_zh.qm)をQApplicationにロードします。ボタンのQMessageBoxのテキストは問題ありません。

私の結果は:

QMessageBox::information(this,
    QString("警告"),
    QString("测试文本"),
    QMessageBox::Yes | QMessageBox::No
);

enter image description here

ちなみに、このメソッドを使用して、C:\ Qt\Qt5.7.0\5.7\Src\qtbase\src \に翻訳を追加することで、QTextEditなどの一部のQWidgetの正しいコンテキストメニューのトランジションの問題を解決することもできます。 widgets\widgets.pro

3
doufu

この問題のために特別な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
GeekUser

これを行う理由はありません。これらのテキストare Qt独自のローカリゼーションファイルにローカライズされています。アプリケーション内でQtのローカリゼーションを提供し、場合によってはロードする必要があります。

1

この場合、以下のように翻訳可能なチェックボックスをクリックすると、テキスト「保存」を別の言語に翻訳できます。

enter image description here

どの言語は、アプリケーションをロードするときにロードするロケールによって異なります。あなたは次のようにこれを行うことができます

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ファイルを以下に添付します

enter image description here

を使用して翻訳をエンコードできます
c:\ Qt\4.7.1\bin> lrelease.exe:\ temp\my_translation_pt

0
Saman