9#include <QtCore/QCoreApplication>
10#include <QtCore/QDebug>
11#include <QtCore/QFile>
12#include <QtCore/QString>
13#include <QtCore/QXmlStreamReader>
17using namespace Qt::StringLiterals;
24 m_translator(translator),
28 m_insideStringList(
false)
35 QStringView qName,
const QXmlStreamAttributes &atts)
override;
36 bool endElement(QStringView namespaceURI, QStringView localName,
37 QStringView qName)
override;
39 bool fatalError(qint64 line, qint64 column,
const QString &message)
override;
42 void readTranslationAttributes(
const QXmlStreamAttributes &atts);
49 QString m_extracomment;
56 bool m_insideStringList;
60 QStringView qName,
const QXmlStreamAttributes &atts)
62 Q_UNUSED(namespaceURI);
65 if (qName ==
"string"_L1) {
67 if (!m_insideStringList)
68 readTranslationAttributes(atts);
69 }
else if (qName ==
"stringlist"_L1) {
71 m_insideStringList =
true;
72 readTranslationAttributes(atts);
73 }
else if (qName ==
"ui"_L1) {
74 m_label = QString(atts.value(
"label"));
83 Q_UNUSED(namespaceURI);
86 m_accum.replace(
"\r\n"_L1,
"\n"_L1);
88 if (qName ==
"class"_L1) {
89 if (m_context.isEmpty())
91 }
else if (qName ==
"string"_L1 && m_isTrString) {
93 }
else if (qName ==
"comment"_L1) {
96 }
else if (qName ==
"stringlist"_L1) {
97 m_insideStringList =
false;
106 m_accum += ch.toString();
112 QString msg = QStringLiteral(
"XML error: Parse error at line %1, column %2 (%3).")
116 m_cd.appendError(msg);
122 if ((!m_context.isEmpty() || !m_id.isEmpty()) && !m_source.isEmpty()) {
124 m_comment, QString(), m_cd.m_sourceFileName,
125 m_lineNumber, QStringList());
126 msg.setExtraComment(m_extracomment);
127 msg.setLabel(m_label);
134 if (!m_insideStringList) {
136 m_extracomment.clear();
141void UiReader::readTranslationAttributes(
const QXmlStreamAttributes &atts)
143 const auto notr = atts.value(QStringLiteral(
"notr"));
144 if (notr.isEmpty() || notr != QStringLiteral(
"true")) {
146 m_comment = atts.value(QStringLiteral(
"comment")).toString();
147 m_extracomment = atts.value(QStringLiteral(
"extracomment")).toString();
148 m_id = atts.value(QStringLiteral(
"id")).toString();
151 if (!m_cd.m_noUiLines)
152 m_lineNumber =
static_cast<
int>(reader.lineNumber());
154 m_isTrString =
false;
160 cd.m_sourceFileName = filename;
161 QFile file(filename);
162 if (!file.open(QIODevice::ReadOnly)) {
163 cd.appendError(
"Cannot open %1: %2"_L1.arg(filename, file.errorString()));
167 QXmlStreamReader reader(&file);
168 reader.setNamespaceProcessing(
false);
170 UiReader uiReader(translator, cd, reader);
171 bool result = uiReader
.parse();
173 cd.appendError(u"Parse error in UI file"_s);
void extend(const TranslatorMessage &msg, ConversionData &cd)
UiReader(Translator &translator, ConversionData &cd, QXmlStreamReader &reader)
bool fatalError(qint64 line, qint64 column, const QString &message) override
bool startElement(QStringView namespaceURI, QStringView localName, QStringView qName, const QXmlStreamAttributes &atts) override
bool endElement(QStringView namespaceURI, QStringView localName, QStringView qName) override
bool characters(QStringView ch) override
~UiReader() override=default
bool loadUI(Translator &translator, const QString &filename, ConversionData &cd)