2015-07-21 6 views
10

Ho un QMessageBox come questo:Titolo: Qt: come tradurre i pulsanti in qmessagebox?

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

Come potrei tradurre il Sì/No parola? dal momento che non c'è posto dove posizionare un tr()?

+1

Possibile duplicato http://stackoverflow.com/questions/18979062/qt-dynamic-translation-of-dialog-windows – Tarod

risposta

9

questo è il modo per farlo:

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

E per mostrare il messaggio:

messageBox.exec(); 
+0

Grazie, funziona. Ma il mio problema è che nella mia applicazione ci sono molte finestre di messaggi. C'è un modo per far tradurre il pulsante in batch invece di fare questo setButtonText per ogni messageBox? –

+0

Dovrai modificare QMessageBox :: question per QMessageBox messageBox nel codice ovunque. Nelle traduzioni è necessario impostare Sì e No solo dove sarà necessario, solo alcuni posti. – demonplus

+1

Il problema con QMessageBox :: question è che è unlocalizable quindi devi sostituirlo – demonplus

1

Non c'è alcun motivo per farlo. Questi testi sono localizzati nei file di localizzazione di Qt. È necessario fornire, e forse anche caricare, le localizzazioni di Qt all'interno dell'applicazione.

+0

Purtroppo questo non funziona con molte lingue. Ho avuto problemi con il francese anche se ho caricato tutte le localizzazioni e ho controllato i loro file, traduzioni perse – demonplus

+0

Anche la localizzazione Qt è per un numero limitato di lingue, credo – demonplus

+0

@demonplus Nulla impedisce a voi o a chiunque altro di aggiustare questi file di traduzione.Sembra banale rispetto al dolore di fare confusione con ogni istanza di messagebox. –

10

Siamo spiacenti, sono in ritardo, ma c'è un modo migliore per risolvere il problema.

Il modo corretto non è quello di tradurre manualmente quelle stringhe. Qt include già traduzioni nella cartella translation.

L'idea è di caricare le traduzioni (file qm) incluse in Qt.

vorrei mostrarvi un codice per ottenere il messaggio tradotto in base al vostro 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(); 
} 

Note:

  • è possibile caricare un differente individuare la creazione di un nuovo oggetto QLOCALE e impostandolo usando void QLocale::setDefault(const QLocale & locale). Example.
  • Sto caricando qt_*.qm e qtbase_*.qm perché da Qt 5.3 le traduzioni sono suddivise in file diversi. In effetti, per QMessageBox le stringhe tradotte sono in qtbase_*.qm. Caricare entrambi è una buona pratica. More info. Ci sono più file qm come qtquickcontrols_*.qm o qtmultimedia_*qm. Carica quelli richiesti in base alle tue esigenze.
  • Forse puoi trovare il testo che stai cercando di tradurre non ancora tradotto da Qt. In questo caso, ti consiglio di aggiornare la versione Qt per verificare se la traduzione esiste nella versione più recente o codificarti da sola. Alcuni link utili: here e here.
+0

Hai provato che le traduzioni funzionano nella versione finale? I file di traduzione Qt sono inclusi? Perché ho lo stesso problema. Funziona in debug e release ma non nella build finale. 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 In generale, la configurazione di rilascio ha i file di installazione finali. Qual è la differenza tra il rilascio e la finale nel tuo caso? – Tarod

+0

La mia versione finale non conteneva i file qt qm a cui ho fatto riferimento nel codice utilizzando qtTranslator-> load ("qt_" + lingua, QLibraryInfo :: location (QLibraryInfo :: TranslationsPath)); che dà un percorso dal framework qt. Non li ho aggiunti nel mio progetto. – Mihai

1

Ho scritto una classe speciale QMessageBoxEx per questo problema.

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

aggiornamento: ho trovato in D:. \ Qt \ Qt5.7.0 \ 5.7 \ Src \ qttranslations \ traduzioni \ qtbase _ ** ts già ha il QPlatformTheme del translation srouce file (Purtroppo, non c'è qtbase_zh_CN.ts), è anche possibile copiare qtbase _ **. ts e modificarlo immediatamente. Se sei cinese come me, grazie a wisaly(github), ha già tradotto qtbase in cinese, ed ecco my fork su github.


Dopo aver letto il codice sorgente Qt, ho risolto questo problema. (la versione di mio Qt è Qt 5.7.0, e installato in C: \ Qt \ Qt5.7.0 con Src)

Aprire il C: \ Qt \ Qt5.7.0 \ 5.7 \ Src \ qtbase \ src \ gui \ gui.pro e inserire una riga come qui di seguito per generare un file di traduzione cinese:

TRANSLATIONS += gui_zh.ts 

Aprire il gui.pro progetto con Qt Creator e utilizzare LUPDATE per generare fonte traduzione di un nuovo simpatico file denominato gui_zh.ts.

Aprire le qui_zh.ts utilizzando Linguista e tradurre la voceQPlatformTheme. Qui tradotta solo “& Sì” come un esempio: enter image description here

Dopo tradotto, utilizzare lrelease per generare un file di traduzione binaria (gui_zh.qm).

Infine, caricare i file di traduzione (gui_zh.qm) in QApplicazione, il testo del pulsante di QMessageBox sarà ok.

I miei risultati sono i seguenti:

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

enter image description here

Tra l'altro, è anche possibile utilizzare questo metodo per sovle TRANSIZIONI problemi del ContextMenu destra di alcune QWidgets come QTextEdit da traduzioni metti in C: \ Qt \ Qt5.7.0 \ 5.7 \ Src \ qtbase \ src \ widgets \ widgets.pro.