13#include <QXmlStreamReader>
17using namespace Qt::Literals::StringLiterals;
22 p.replace(u'&',
"&"_L1);
23 p.replace(u'\"',
"""_L1);
24 p.replace(u'>',
">"_L1);
25 p.replace(u'<',
"<"_L1);
26 p.replace(QLatin1Char(
'\''),
"'"_L1);
31 : shrtc(-1), m_phraseBook(0)
35Phrase::
Phrase(
const QString &source,
const QString &target,
const QString &definition,
42 const QString &definition,
PhraseBook *phraseBook)
44 m_phraseBook(phraseBook)
54 m_phraseBook->phraseChanged(
this);
63 m_phraseBook->phraseChanged(
this);
72 m_phraseBook->phraseChanged(
this);
77 return p.source() == q.source() && p.target() == q.target() &&
85 :
XmlParser(reader), pb(phraseBook), ferrorCount(0)
95 QStringView qName,
const QXmlStreamAttributes &atts)
override;
96 bool endElement(QStringView namespaceURI, QStringView localName,
97 QStringView qName)
override;
99 bool fatalError(qint64 line, qint64 column,
const QString &message)
override;
106 QString m_sourceLanguage;
113 QStringView qName,
const QXmlStreamAttributes &atts)
115 Q_UNUSED(namespaceURI);
118 if (qName ==
"QPH"_L1) {
119 m_language = atts.value(
"language"_L1).toString();
120 m_sourceLanguage = atts.value(
"sourcelanguage"_L1).toString();
121 }
else if (qName ==
"phrase"_L1) {
124 definition.truncate(0);
133 Q_UNUSED(namespaceURI);
136 if (qName ==
"source"_L1)
138 else if (qName ==
"target"_L1)
140 else if (qName ==
"definition"_L1)
142 else if (qName ==
"phrase"_L1)
143 pb->m_phrases.append(
new Phrase(source, target, definition, pb));
155 if (ferrorCount++ == 0) {
156 QString msg = PhraseBook::tr(
"Parse error at line %1, column %2 (%3).")
160 QMessageBox::information(
nullptr, QObject::tr(
"Qt Linguist"), msg);
167 m_language(QLocale::C),
168 m_sourceLanguage(QLocale::C),
169 m_territory(QLocale::AnyTerritory),
170 m_sourceTerritory(QLocale::AnyTerritory)
176 qDeleteAll(m_phrases);
179void PhraseBook::setLanguageAndTerritory(QLocale::Language lang, QLocale::Territory territory)
181 if (m_language == lang && m_territory == territory)
184 m_territory = territory;
188void PhraseBook::setSourceLanguageAndTerritory(QLocale::Language lang, QLocale::Territory territory)
190 if (m_sourceLanguage == lang && m_sourceTerritory == territory)
192 m_sourceLanguage = lang;
193 m_sourceTerritory = territory;
200 if (!f.open(QIODevice::ReadOnly))
203 m_fileName = fileName;
205 QXmlStreamReader reader(&f);
207 reader.setNamespaceProcessing(
false);
210 Translator::languageAndTerritory(hand->language(), &m_language, &m_territory);
211 *langGuessed =
false;
212 if (m_language == QLocale::C) {
214 m_language = sys.language();
215 m_territory = sys.territory();
219 QString lang = hand->sourceLanguage();
220 if (lang.isEmpty()) {
221 m_sourceLanguage = QLocale::C;
222 m_sourceTerritory = QLocale::AnyTerritory;
224 Translator::languageAndTerritory(lang, &m_sourceLanguage, &m_sourceTerritory);
230 qDeleteAll(m_phrases);
242 if (!f.open(QIODevice::WriteOnly))
245 m_fileName = fileName;
249 t <<
"<!DOCTYPE QPH>\n<QPH";
250 if (sourceLanguage() != QLocale::C)
251 t <<
" sourcelanguage=\""
252 << Translator::makeLanguageCode(sourceLanguage(), sourceTerritory()) <<
'"';
253 if (language() != QLocale::C)
254 t <<
" language=\"" << Translator::makeLanguageCode(language(), territory()) <<
'"';
256 for (Phrase *p : std::as_const(m_phrases)) {
258 t <<
" <source>" << xmlProtect( p->source() ) <<
"</source>\n";
259 t <<
" <target>" << xmlProtect( p->target() ) <<
"</target>\n";
260 if (!p->definition().isEmpty())
261 t <<
" <definition>" << xmlProtect( p->definition() )
262 <<
"</definition>\n";
273 m_phrases.append(phrase);
281 m_phrases.removeOne(phrase);
289 if (m_changed != modified) {
290 emit modifiedChanged(modified);
291 m_changed = modified;
304 if (!m_fileName.isEmpty())
305 return QFileInfo(m_fileName).fileName();
void append(Phrase *phrase)
QString friendlyPhraseBookName() const
bool load(const QString &fileName, bool *langGuessed)
bool save(const QString &fileName)
void remove(Phrase *phrase)
void setPhraseBook(PhraseBook *book)
PhraseBook * phraseBook() const
void setDefinition(const QString &nd)
void setSource(const QString &ns)
Phrase(const QString &source, const QString &target, const QString &definition, PhraseBook *phraseBook)
Phrase(const QString &source, const QString &target, const QString &definition, const Candidate &candidate, int sc=-1)
void setTarget(const QString &nt)
bool fatalError(qint64 line, qint64 column, const QString &message) override
QphHandler(PhraseBook *phraseBook, QXmlStreamReader &reader)
QString sourceLanguage() const
bool endElement(QStringView namespaceURI, QStringView localName, QStringView qName) override
~QphHandler() override=default
bool startElement(QStringView namespaceURI, QStringView localName, QStringView qName, const QXmlStreamAttributes &atts) override
bool characters(QStringView ch) override
static QString xmlProtect(const QString &str)
bool operator==(const Phrase &p, const Phrase &q)