diff options
author | Kai Koehne <kai.koehne@qt.io> | 2020-01-24 17:09:50 +0100 |
---|---|---|
committer | Kai Koehne <kai.koehne@qt.io> | 2020-02-03 08:49:34 +0100 |
commit | 4dd7c301fff2821bac6c03ea56ee27bc3eeaeaed (patch) | |
tree | 6f6b6df652f2e389d78c42c07804b776cf4c99f3 | |
parent | b3b244669a16b49f037bd4b8b1faa9d677c2b900 (diff) |
lrelease: Embed target language in .qm file
.ts, XLIFF ... contain the target language as part of the content.
By embedding this information in the .qm file we can extend
QTranslator so that it exposes the language a translation is
actually for.
Change-Id: I9a98cdf7366ab05477a0b4c1e5a2538181e06977
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de>
-rw-r--r-- | src/linguist/shared/qm.cpp | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/src/linguist/shared/qm.cpp b/src/linguist/shared/qm.cpp index 6963ad6cb..288607824 100644 --- a/src/linguist/shared/qm.cpp +++ b/src/linguist/shared/qm.cpp @@ -151,9 +151,9 @@ public: uint o; }; - enum { Contexts = 0x2f, Hashes = 0x42, Messages = 0x69, NumerusRules = 0x88, Dependencies = 0x96 }; + enum { Contexts = 0x2f, Hashes = 0x42, Messages = 0x69, NumerusRules = 0x88, Dependencies = 0x96, Language = 0xa7 }; - Releaser() {} + Releaser(const QString &language) : m_language(language) {} bool save(QIODevice *iod); @@ -179,6 +179,7 @@ private: void writeMessage(const ByteTranslatorMessage & msg, QDataStream & stream, TranslatorSaveMode strip, Prefix prefix) const; + QString m_language; // for squeezed but non-file data, this is what needs to be deleted QByteArray m_messageArray; QByteArray m_offsetArray; @@ -249,6 +250,12 @@ bool Releaser::save(QIODevice *iod) QDataStream s(iod); s.writeRawData((const char *)magic, MagicLength); + if (!m_language.isEmpty()) { + QByteArray lang = originalBytes(m_language); + quint32 las = quint32(lang.size()); + s << quint8(Language) << las; + s.writeRawData(lang, las); + } if (!m_dependencyArray.isEmpty()) { quint32 das = quint32(m_dependencyArray.size()); s << quint8(Dependencies) << das; @@ -465,7 +472,7 @@ bool loadQM(Translator &translator, QIODevice &dev, ConversionData &cd) return false; } - enum { Contexts = 0x2f, Hashes = 0x42, Messages = 0x69, NumerusRules = 0x88, Dependencies = 0x96 }; + enum { Contexts = 0x2f, Hashes = 0x42, Messages = 0x69, NumerusRules = 0x88, Dependencies = 0x96, Language = 0xa7 }; // for squeezed but non-file data, this is what needs to be deleted const uchar *messageArray = 0; @@ -473,6 +480,7 @@ bool loadQM(Translator &translator, QIODevice &dev, ConversionData &cd) uint offsetLength = 0; bool ok = true; + bool utf8Fail = false; const uchar *end = data + len; data += MagicLength; @@ -505,6 +513,10 @@ bool loadQM(Translator &translator, QIODevice &dev, ConversionData &cd) dependencies.append(dep); } translator.setDependencies(dependencies); + } else if (tag == Language) { + QString language; + fromBytes((const char *)data, blockLen, &language, &utf8Fail); + translator.setLanguageCode(language); } data += blockLen; @@ -524,7 +536,6 @@ bool loadQM(Translator &translator, QIODevice &dev, ConversionData &cd) guessPlurals = (numerusForms.count() == 1); QString context, sourcetext, comment; - bool utf8Fail = false; QStringList translations; for (const uchar *start = offsetArray; start != offsetArray + (numItems << 3); start += 8) { @@ -632,7 +643,7 @@ static bool containsStripped(const Translator &translator, const TranslatorMessa bool saveQM(const Translator &translator, QIODevice &dev, ConversionData &cd) { - Releaser releaser; + Releaser releaser(translator.languageCode()); QLocale::Language l; QLocale::Country c; Translator::languageAndCountry(translator.languageCode(), &l, &c); |