Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. German
  4. Fehlermeldungen von QDomDocument::setContent() übersetzen
Forum Updated to NodeBB v4.3 + New Features

Fehlermeldungen von QDomDocument::setContent() übersetzen

Scheduled Pinned Locked Moved Solved German
13 Posts 2 Posters 1.3k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • R Offline
    R Offline
    Robert Hairgrove
    wrote on last edited by
    #1

    Leider werden diese immer von Qt nur auf englisch ausgegeben. Ich könnte diese Strings natürlich selbst aus den Quellen heraus kopieren und mit linguist auf deutsch übersetzen; allerdings denke ich, dass dies wirklich ein Rad wäre, das man nicht selbst erfinden müsste...

    Gibt es im WWW irgendwo Links zu solchen fertigen Übersetzungen (auch ggf. in anderen Sprachen)?

    1 Reply Last reply
    0
    • Christian EhrlicherC Offline
      Christian EhrlicherC Offline
      Christian Ehrlicher
      Lifetime Qt Champion
      wrote on last edited by Christian Ehrlicher
      #2

      ~~Die Texte sind nicht in Qt übersetzt - ~~ siehe https://code.woboq.org/qt5/qtbase/src/xml/sax/qxml.cpp.html#63

      ~~-> Du musst sie selbst übersetzen.

      Falsch - wie Du siehst sind sie mit QT_TR_NOOP markiert. Also müssten sie in der Qt-Translation mit dabei sein. Muss diese natürlich laden.

      Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
      Visit the Qt Academy at https://academy.qt.io/catalog

      1 Reply Last reply
      0
      • R Offline
        R Offline
        Robert Hairgrove
        wrote on last edited by
        #3

        Danke, Christian. Allerdings habe ich gemeint, dass QT_TR_NOOP eben ein "no-op" ist, also ein Makro, das eben nichts macht...?

        In der Qt-Hilfe steht ebenfalls, dass man die Strings selbst übersetzen muss. Werde ich jetzt wohl machen müssen.

        Christian EhrlicherC 1 Reply Last reply
        0
        • R Robert Hairgrove

          Danke, Christian. Allerdings habe ich gemeint, dass QT_TR_NOOP eben ein "no-op" ist, also ein Makro, das eben nichts macht...?

          In der Qt-Hilfe steht ebenfalls, dass man die Strings selbst übersetzen muss. Werde ich jetzt wohl machen müssen.

          Christian EhrlicherC Offline
          Christian EhrlicherC Offline
          Christian Ehrlicher
          Lifetime Qt Champion
          wrote on last edited by
          #4

          @Robert-Hairgrove said in Fehlermeldungen von QDomDocument::setContent() übersetzen:

          In der Qt-Hilfe steht ebenfalls, dass man die Strings selbst übersetzen muss. Werde ich jetzt wohl machen müssen.

          Wo

          Allerdings habe ich gemeint, dass QT_TR_NOOP eben ein "no-op" ist, also ein Makro, das eben nichts macht...?

          Siehe https://doc.qt.io/qt-5/i18n-source-translation.html#using-qt-tr-noop-and-qt-translate-noop-in-c

          Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
          Visit the Qt Academy at https://academy.qt.io/catalog

          R 1 Reply Last reply
          0
          • Christian EhrlicherC Christian Ehrlicher

            @Robert-Hairgrove said in Fehlermeldungen von QDomDocument::setContent() übersetzen:

            In der Qt-Hilfe steht ebenfalls, dass man die Strings selbst übersetzen muss. Werde ich jetzt wohl machen müssen.

            Wo

            Allerdings habe ich gemeint, dass QT_TR_NOOP eben ein "no-op" ist, also ein Makro, das eben nichts macht...?

            Siehe https://doc.qt.io/qt-5/i18n-source-translation.html#using-qt-tr-noop-and-qt-translate-noop-in-c

            R Offline
            R Offline
            Robert Hairgrove
            wrote on last edited by
            #5

            @Christian-Ehrlicher said in Fehlermeldungen von QDomDocument::setContent() übersetzen:

            @Robert-Hairgrove said in Fehlermeldungen von QDomDocument::setContent() übersetzen:

            In der Qt-Hilfe steht ebenfalls, dass man die Strings selbst übersetzen muss. Werde ich jetzt wohl machen müssen.

            Wo

            Hier: https://doc.qt.io/qt-5/qdomdocument.html#setContent (im 3. Absatz, der mit dem Text beginnt: "If a parse error occurs..."; s. letzten Satz: "Note that, if you want to display these error messages to your application's users, they will be displayed in English unless they are explicitly translated."

            1 Reply Last reply
            0
            • Christian EhrlicherC Offline
              Christian EhrlicherC Offline
              Christian Ehrlicher
              Lifetime Qt Champion
              wrote on last edited by
              #6

              Sie sind aber in der Qt - ts - Datei mit dabei - siehe https://code.qt.io/cgit/qt/qttranslations.git/tree/translations/qtbase_de.ts?h=5.15.2#n7455

              Du musst sie nur selbst im Code übersetzen mit QCoreApplication::translate()

              Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
              Visit the Qt Academy at https://academy.qt.io/catalog

              Christian EhrlicherC 1 Reply Last reply
              0
              • R Offline
                R Offline
                Robert Hairgrove
                wrote on last edited by Robert Hairgrove
                #7

                Aha ... habe jetzt etwas gefunden. In der Datei qtbase_de.ts stehen sie unter dem <context>-Element mit Namen QXml.
                Ich hatte nach dem Kontext QtXml gesucht und nichts gefunden!

                Das muss ich jetzt testen, ob die Fehlermeldungen in meiner Anwendung tatsächlich auf deutsch erscheinen ... qtbase_de.qm wird natürlich vorher geladen.

                1 Reply Last reply
                0
                • R Offline
                  R Offline
                  Robert Hairgrove
                  wrote on last edited by Robert Hairgrove
                  #8

                  Ok -- es scheint, dass man noch irgendwas machen muss, um zur Laufzeit an die Übersetzungen heranzukommen. Hier ein Test-Konsolenprogrämmchen:

                  #test_xml.pro
                  QT -= gui
                  QT += xml
                  
                  CONFIG += c++11 console
                  CONFIG -= app_bundle
                  
                  SOURCES += \
                          main.cpp
                  
                  // main.cpp
                  #include <QCoreApplication>
                  #include <QDomDocument>
                  #include <QFile>
                  #include <QByteArray>
                  #include <QTranslator>
                  #include <iostream>
                  
                  const char * xmlfile = "<...Pfad zu einer XML-Datei...>";
                  
                  int main(int argc, char *argv[])
                  {
                    using namespace std;
                  
                    QCoreApplication a(argc, argv);
                    QTranslator translator;
                  
                    bool trans_loaded = translator.load("qtbase_de.qm"); // muss im aktuellen Anwendungsverzeichnis vorliegen...
                    if (trans_loaded) {
                      trans_loaded = QCoreApplication::installTranslator(&translator);
                    }
                  
                    QString msg;
                    int line = -1;
                    int column = -1;
                    QDomDocument d;
                    QFile f(xmlfile);
                  
                    if (f.open(QIODevice::ReadOnly)) {
                      QByteArray ba = f.readAll();
                      d.setContent(ba, &msg, &line, &column);
                    } else {
                      cout << "Fehler beim Oeffnen einer Datei: " << f.errorString().toUtf8().constData() << endl;
                      return 1;
                    }
                  
                    if (trans_loaded) {
                      cout << "Translator geladen!" << endl;
                    }
                    if (!msg.isEmpty()) {
                      cout << "XML-Fehler: " << msg.toUtf8().constData() << "\n"
                           << "Zeile: " << line << ", Spalte: " << column << endl;
                    } else {
                      cout << "XML ohne Fehler" << endl;
                    }
                    return a.exec();
                  }
                  

                  Wie kann ich nun die bestehenden Übersetzungen zur Laufzeit einbinden? Diese werden doch auf englisch ausgegeben.

                  1 Reply Last reply
                  0
                  • Christian EhrlicherC Christian Ehrlicher

                    Sie sind aber in der Qt - ts - Datei mit dabei - siehe https://code.qt.io/cgit/qt/qttranslations.git/tree/translations/qtbase_de.ts?h=5.15.2#n7455

                    Du musst sie nur selbst im Code übersetzen mit QCoreApplication::translate()

                    Christian EhrlicherC Offline
                    Christian EhrlicherC Offline
                    Christian Ehrlicher
                    Lifetime Qt Champion
                    wrote on last edited by
                    #9

                    @Christian-Ehrlicher said in Fehlermeldungen von QDomDocument::setContent() übersetzen:

                    Du musst sie nur selbst im Code übersetzen mit QCoreApplication::translate()

                    Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                    Visit the Qt Academy at https://academy.qt.io/catalog

                    1 Reply Last reply
                    0
                    • R Offline
                      R Offline
                      Robert Hairgrove
                      wrote on last edited by
                      #10

                      Inzwischen geht es; allerdings funktioniert es nicht mit QCoreApplication::translate() (das habe ich auch probiert -- evtl. aber nicht richtig?). Ich musste schon QTranslator::translate() einsetzen und den Kontext "QXml" mit übergeben.

                      Ein QMap oder std::map braucht es auch, weil man keinen Zugriff auf die Fehlermeldung hat, nachdem Qt das schon ausgegeben hat.

                      Hier die vollständige Lösung:

                      // main.cpp
                      #include <QCoreApplication>
                      #include <QDomDocument>
                      #include <QFile>
                      #include <QByteArray>
                      #include <QTranslator>
                      #include <QMap>
                      #include <QString>
                      #include <iostream>
                      
                      const char * xmlfile = "...<Pfad zur XML-Datei>...";
                      
                      int main(int argc, char *argv[])
                      {
                        using namespace std;
                      
                        QCoreApplication a(argc, argv);
                        QTranslator translator;
                      
                        bool trans_loaded = translator.load("qtbase_de.qm"); // muss im aktuellen Anwendungsverzeichnis vorliegen...
                        if (trans_loaded) {
                          trans_loaded = QCoreApplication::installTranslator(&translator);
                        }
                      
                        QMap<QString, QString> xml_error_map;
                        xml_error_map["no error occurred"] = translator.translate("QXml","no error occurred");
                        xml_error_map["error triggered by consumer"] = translator.translate("QXml","error triggered by consumer");
                        xml_error_map["unexpected end of file"] = translator.translate("QXml","unexpected end of file");
                        xml_error_map["more than one document type definition"] = translator.translate("QXml","more than one document type definition");
                        xml_error_map["error occurred while parsing element"] = translator.translate("QXml","error occurred while parsing element");
                        xml_error_map["tag mismatch"] = translator.translate("QXml","tag mismatch");
                        xml_error_map["error occurred while parsing content"] = translator.translate("QXml","error occurred while parsing content");
                        xml_error_map["unexpected character"] = translator.translate("QXml","unexpected character");
                        xml_error_map["invalid name for processing instruction"] = translator.translate("QXml","invalid name for processing instruction");
                        xml_error_map["version expected while reading the XML declaration"] = translator.translate("QXml","version expected while reading the XML declaration");
                        xml_error_map["wrong value for standalone declaration"] = translator.translate("QXml","wrong value for standalone declaration");
                        xml_error_map["encoding declaration or standalone declaration expected while reading the XML declaration"] = translator.translate("QXml","encoding declaration or standalone declaration expected while reading the XML declaration");
                        xml_error_map["standalone declaration expected while reading the XML declaration"] = translator.translate("QXml","standalone declaration expected while reading the XML declaration");
                        xml_error_map["error occurred while parsing document type definition"] = translator.translate("QXml","error occurred while parsing document type definition");
                        xml_error_map["letter is expected"] = translator.translate("QXml","letter is expected");
                        xml_error_map["error occurred while parsing comment"] = translator.translate("QXml","error occurred while parsing comment");
                        xml_error_map["error occurred while parsing reference"] = translator.translate("QXml","error occurred while parsing reference");
                        xml_error_map["internal general entity reference not allowed in DTD"] = translator.translate("QXml","internal general entity reference not allowed in DTD");
                        xml_error_map["external parsed general entity reference not allowed in attribute value"] = translator.translate("QXml","external parsed general entity reference not allowed in attribute value");
                        xml_error_map["external parsed general entity reference not allowed in DTD"] = translator.translate("QXml","external parsed general entity reference not allowed in DTD");
                        xml_error_map["unparsed entity reference in wrong context"] = translator.translate("QXml","unparsed entity reference in wrong context");
                        xml_error_map["recursive entities"] = translator.translate("QXml","recursive entities");
                        xml_error_map["error in the text declaration of an external entity"] = translator.translate("QXml","error in the text declaration of an external entity");
                      
                        QString msg, xmlmsg;
                        int line = -1;
                        int column = -1;
                        QDomDocument d;
                        QFile f(xmlfile);
                      
                        if (f.open(QIODevice::ReadOnly)) {
                          QByteArray ba = f.readAll();
                          d.setContent(ba, &xmlmsg, &line, &column);
                        } else {
                          cout << "Error opening file: " << f.errorString().toUtf8().constData() << endl;
                          return 1;
                        }
                      
                        if (trans_loaded) {
                          cout << "Translator loaded!" << endl;
                        }
                        if (!xmlmsg.isEmpty()) {
                          if (xml_error_map.contains(xmlmsg)) {
                            msg = xml_error_map[xmlmsg];
                          } else {
                            msg = xmlmsg;
                          }
                          cout << "Error message: " << msg.toUtf8().constData() << "\n"
                               << "Line: " << line << ", column: " << column << endl;
                        } else {
                          cout << "No error" << endl;
                        }
                        return a.exec();
                      }
                      

                      Hoffentlich hilft das auch anderen Entwickler/innen.

                      1 Reply Last reply
                      0
                      • R Offline
                        R Offline
                        Robert Hairgrove
                        wrote on last edited by Robert Hairgrove
                        #11

                        Nun habe ich das in mein aktuelles Projekt ungefähr so eingebracht ("m_" ist als QMap<int, QString> definiert):

                        QTranslator *current_qt_translator = nullptr;
                        // anderer Code...
                        bool translator_loaded 
                           = current_qt_translator 
                          || ((current_qt_translator = new QTranslator)
                           && (current_qt_translator->load("<path to qtbase_de.qm>"))
                           && (QCoreApplication::installTranslator(current_qt_translator));
                        // anderer Code...
                        if (translator_loaded) {
                            m_[E_XMLERR_OK] = current_qt_translator->translate("QXml","no error occurred");
                            m_[E_XMLERR_ERRORBYCONSUMER] = current_qt_translator->translate("QXml","error triggered by consumer");
                            m_[E_XMLERR_UNEXPECTEDEOF] = current_qt_translator->translate("QXml","unexpected end of file");
                            /* ... etc. ... */
                        } else {
                            //Constants on the right of the assignment are defined elsewhere as the above strings. 
                            // Unfortunately, tr() etc. do not work except with literal strings
                            // which is why they are written out in the "if()" branch:
                            m_[E_XMLERR_OK] = SBBL_XMLERR_OK ;
                            m_[E_XMLERR_ERRORBYCONSUMER] = SBBL_XMLERR_ERRORBYCONSUMER;
                            m_[E_XMLERR_UNEXPECTEDEOF] = SBBL_XMLERR_UNEXPECTEDEOF;
                            /* ... etc. ... */
                        }
                        

                        Das Problem verbleibt, dass lupdate nun in meiner eigenen .ts-Datei eine Kategorie QXml generiert, die die gleichen Texte zur Übersetzung anbietet. Ich könnte das zwar einfach ignorieren und unübersetzt lassen; viel schöner wäre es, wenn ich sie im Quelltext aber ausschliessen könnte (schliesslich gibt es ja schon die Übersetzungen in qtbase_de.qm...)

                        Gibt es ein Makro o.ä., das ich zu diesem Zweck einsetzen könnte?

                        Vielen Dank für Ratschläge!

                        1 Reply Last reply
                        0
                        • Christian EhrlicherC Offline
                          Christian EhrlicherC Offline
                          Christian Ehrlicher
                          Lifetime Qt Champion
                          wrote on last edited by
                          #12

                          Einfach nicht hier übersetzen sondern bei der späteren Nutzung.

                          Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                          Visit the Qt Academy at https://academy.qt.io/catalog

                          1 Reply Last reply
                          0
                          • R Offline
                            R Offline
                            Robert Hairgrove
                            wrote on last edited by
                            #13

                            Hmm ... ich habe es nochmals mit Konstanten bzw. Makros anstatt Literal-Strings für die englischen Fehlermeldungen versucht, und es scheint jetzt zu funktionieren! Mit der Indirektion über Makros generiert lupdate keine überflüssigen Übersetzungen mehr, und der Aufruf von QTranslator::translate() funktioniert immer noch.

                            Evtl. wurde lupdate zwischen Qt 5.12.9 und 5.15.5 geändert? Früher war das m.E. noch ein Problem, aber vielleicht hatte ich nicht genug getestet...

                            1 Reply Last reply
                            0

                            • Login

                            • Login or register to search.
                            • First post
                              Last post
                            0
                            • Categories
                            • Recent
                            • Tags
                            • Popular
                            • Users
                            • Groups
                            • Search
                            • Get Qt Extensions
                            • Unsolved