私はこのようなQMessageBox
を持っています:
_QMessageBox::question(this, tr("Sure want to quit?"),
tr("Sure to quit?"), QMessageBox::Yes | QMessageBox::No);
_
はい/いいえの単語をどのように翻訳できますか? tr()
を配置する場所がないので?
申し訳ありませんが、遅れていますが、問題を解決する最善の方法があります。
正しい方法は、これらの文字列を手動で翻訳しないことです。 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)
を使用して設定できます。 例 。qt_*.qm
_と_qtbase_*.qm
_を読み込んでいます。実際、QMessageBox
の場合、翻訳された文字列は_qtbase_*.qm
_にあります。両方をロードすることをお勧めします。 詳細 。 _qtquickcontrols_*.qm
_や_qtmultimedia_*qm
_のような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();
update:D:\ 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」のみを翻訳しました:
翻訳後、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 \に翻訳を追加することで、QTextEditなどの一部のQWidgetの正しいコンテキストメニューのトランジションの問題を解決することもできます。 widgets\widgets.pro。
この問題のために特別な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
これを行う理由はありません。これらのテキストare Qt独自のローカリゼーションファイルにローカライズされています。アプリケーション内でQtのローカリゼーションを提供し、場合によってはロードする必要があります。
この場合、以下のように翻訳可能なチェックボックスをクリックすると、テキスト「保存」を別の言語に翻訳できます。
どの言語は、アプリケーションをロードするときにロードするロケールによって異なります。あなたは次のようにこれを行うことができます
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