2015-07-21 11 views
10

Ich habe eine QMessageBox wie folgt aus:Titel: Qt: Wie übersetzt man die Tasten in qmessagebox?

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

Wie konnte ich das Ja/Nein-Wort übersetzen? Da gibt es keinen Platz, um eine tr() zu platzieren?

+1

Mögliche doppelte http://StackOverflow.com/Questions/18979062/qt-Dynamic-Translation-of-Dialog-Windows – Tarod

Antwort

9

Dies ist die Art und Weise, das zu tun:

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")); 

Und die Nachricht zeigen:

messageBox.exec(); 
+0

Danke, es funktioniert. Aber mein Problem ist, dass es in meiner Anwendung viele Nachrichten gibt. Gibt es eine Möglichkeit, wie ich den Button im Stapel übersetzen lassen kann, anstatt diesen setButtonText für jede messageBox zu machen? –

+0

Sie müssen QMessageBox :: question in QMessageBox messageBox im Code überall ändern. In Übersetzungen müssen Sie Ja und Nein nur dort einstellen, wo es notwendig sein sollte, es sollten nur ein paar Stellen vorhanden sein. – demonplus

+1

Das Problem mit QMessageBox :: question ist, dass es nicht lokalisierbar ist, also müssen Sie es ersetzen – demonplus

1

Es gibt keinen Grund, dies zu tun. Diese Texte sind lokalisiert in Qt eigenen Lokalisierungsdateien. Sie müssen die Lokalisierungen von Qt innerhalb Ihrer Anwendung bereitstellen und möglicherweise auch laden.

+0

Leider funktioniert das nicht mit vielen Sprachen. Ich hatte die Probleme mit Französisch, obwohl ich alle Lokalisierungen geladen und ich überprüfte ihre Dateien, Übersetzungen verpasst – demonplus

+0

Auch Qt Lokalisierung ist für eine begrenzte Anzahl von Sprachen Ich glaube – demonplus

+0

@demonplus Nichts verhindert, dass Sie oder jemand anderes diese Übersetzungsdateien reparieren.Klingt trivial im Vergleich zu dem Schmerz, mit jeder MessageBox-Instanz herumzuspielen. –

10

Entschuldigung, ich bin spät, aber es gibt eine beste Möglichkeit, Ihr Problem zu lösen.

Der richtige Weg besteht nicht darin, diese Zeichenfolgen manuell zu übersetzen. Qt enthält bereits Übersetzungen in den Ordner translation.

Die Idee ist, die Übersetzungen (qm Dateien) zu laden, die in Qt enthalten sind.

Ich möchte Ihnen einen Code, um zu zeigen, um die Nachricht zu erhalten übersetzt entsprechend Ihrer locale:

#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(); 
} 

Hinweise:

  • Sie können eine andere laden suchen ein neues QLocale Objekt erstellen und Einstellung mit void QLocale::setDefault(const QLocale & locale). Example.
  • Ich lade qt_*.qm und qtbase_*.qm weil seit Qt 5.3 die Übersetzungen in verschiedenen Dateien aufgeteilt sind. In der Tat, für QMessageBox sind die übersetzten Zeichenfolgen in qtbase_*.qm. Das Laden beider ist eine gute Übung. More info. Es gibt mehr qm Dateien wie qtquickcontrols_*.qm oder qtmultimedia_*qm. Laden Sie die benötigten nach Ihren Anforderungen.
  • Vielleicht finden Sie den Text, den Sie übersetzen möchten, ist noch nicht von Qt übersetzt. In diesem Fall empfehle ich Ihnen, die Qt-Version zu aktualisieren, um zu prüfen, ob die Übersetzung in der neuesten Version vorhanden ist, oder die Änderung selbst zu codieren. Einige nützliche Links: here und here.
+0

Haben Sie getestet, dass die Übersetzungen im endgültigen Build funktionieren? Die Qt-Übersetzungsdateien sind enthalten? Weil ich das gleiche Problem habe. Es funktioniert in Debug und Release, aber nicht im endgültigen Build. https://stackoverflow.com/questions/46074603/how-can-i-include-c-qt-5-9-1-msvc2015-translations-qm-files-qt-framework-qm-f – Mihai

+0

@Mihai allgemein, Die Release-Konfiguration enthält die endgültigen Installationsdateien. Was ist der Unterschied zwischen Release und Final in deinem Fall? – Tarod

+0

Meine endgültige Version enthielt nicht die qt qm-Dateien, auf die ich im Code mit qtTranslator-> load ("qt_" + Sprache, QLibraryInfo :: location (QLibraryInfo :: TranslationsPath)) verwiesen habe; Das gibt einen Pfad von QT-Framework. Ich habe sie in meinem Projekt nicht hinzugefügt. – Mihai

1

Ich schrieb eine spezielle QMessageBoxEx-Klasse für dieses Problem.

// 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

0

Update: I in D gefunden. \ Qt \ Qt5.7.0 \ 5.7 \ Src \ qttranslations \ Übersetzungen \ qtbase _ ** ts bereits die QPlatformTheme des Übersetzung srouce-Datei (Leider gibt es keine qtbase_zh_CN.ts), Sie können auch eine qtbase _ **. ts kopieren und sofort ändern. Wenn Sie ein Chinese wie ich sind, dank wisaly(github), hat er bereits übersetzt die qtbase auf Chinesisch, und hier ist my fork auf github.


Nach dem Lesen des Qt-Quellcodes habe ich dieses Problem gelöst. (My Qt-Version ist Qt 5.7.0 und in C: \ Qt \ Qt5.7.0 mit Src)

öffnen C: \ Qt \ Qt5.7.0 \ 5.7 \ Src \ qtbase \ src \ gui \ gui.pro und eine Linie einfügen wie unten eine chinesische Übersetzungsdatei zu generieren:

TRANSLATIONS += gui_zh.ts 

öffnen gui.pro Projekt mit Qt Creator und lupdate verwenden, um eine neue nette Übersetzung Quelle zu erzeugen, Datei mit dem Namen gui_zh.ts.

Öffnen Sie die qui_zh.ts Linguist mit und übersetzen die QPlatformTheme Artikel. Hier nur übersetzt „& Ja“ als Beispiel: enter image description here

Nach übersetzt, verwenden lrelease eine binäre Übersetzungsdatei (gui_zh.qm) zu erzeugen.

Laden Sie zuletzt die Übersetzungsdateien (gui_zh.qm) in Ihre QApplication, der Text der Schaltfläche von QMessageBox ist in Ordnung.

Meine Ergebnisse sind:

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

enter image description here

By the way, Sie auch diese Methode verwenden, können das Recht contextmenu der transtions Probleme einiger QWidgets wie QTextEdit von Add Übersetzungen C sovle: \ Qt \ Qt5.7.0 \ 5.7 \ Src \ qtbase \ src \ widgets \ widgets.pro.

Verwandte Themen