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),
29 m_idBasedTranslations(
false)
36 QStringView qName,
const QXmlStreamAttributes &atts)
override;
37 bool endElement(QStringView namespaceURI, QStringView localName,
38 QStringView qName)
override;
40 bool fatalError(qint64 line, qint64 column,
const QString &message)
override;
43 void readTranslationAttributes(
const QXmlStreamAttributes &atts);
50 QString m_extracomment;
56 bool m_insideStringList;
57 bool m_idBasedTranslations;
61 QStringView qName,
const QXmlStreamAttributes &atts)
63 Q_UNUSED(namespaceURI);
66 if (qName == QLatin1String(
"string")) {
68 if (!m_insideStringList)
69 readTranslationAttributes(atts);
70 }
else if (qName == QLatin1String(
"stringlist")) {
72 m_insideStringList =
true;
73 readTranslationAttributes(atts);
74 }
else if (qName == QLatin1String(
"ui")) {
75 const auto attr = QStringLiteral(
"idbasedtr");
76 m_idBasedTranslations =
77 atts.hasAttribute(attr) && atts.value(attr) == QLatin1String(
"true");
86 Q_UNUSED(namespaceURI);
89 m_accum.replace(QLatin1String(
"\r\n"), QLatin1String(
"\n"));
91 if (qName == QLatin1String(
"class")) {
92 if (m_context.isEmpty())
94 }
else if (qName == QLatin1String(
"string") && m_isTrString) {
96 }
else if (qName == QLatin1String(
"comment")) {
99 }
else if (qName == QLatin1String(
"stringlist")) {
100 m_insideStringList =
false;
109 m_accum += ch.toString();
115 QString msg = QStringLiteral(
"XML error: Parse error at line %1, column %2 (%3).")
119 m_cd.appendError(msg);
125 if (!m_context.isEmpty() && !m_source.isEmpty()) {
127 m_comment, QString(), m_cd.m_sourceFileName,
128 m_lineNumber, QStringList());
129 msg.setExtraComment(m_extracomment);
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 if (m_idBasedTranslations)
149 m_id = atts.value(QStringLiteral(
"id")).toString();
150 if (!m_cd.m_noUiLines)
151 m_lineNumber =
static_cast<
int>(reader.lineNumber());
153 m_isTrString =
false;
159 cd.m_sourceFileName = filename;
160 QFile file(filename);
161 if (!file.open(QIODevice::ReadOnly)) {
162 cd.appendError(QStringLiteral(
"Cannot open %1: %2").arg(filename, file.errorString()));
166 QXmlStreamReader reader(&file);
167 reader.setNamespaceProcessing(
false);
169 UiReader uiReader(translator, cd, reader);
170 bool result = uiReader
.parse();
172 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)
Combined button and popup list for selecting options.