From 1185386dfe9727ed591da442e97084907f0a6735 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 17 Jul 2009 19:41:23 +0200 Subject: don't rely on system codec when handling PO files - make -input-codec affect PO files, default to UTF-8 - add -output-codec for PO files, same default --- tests/auto/linguist/lconvert/data/test-broken-utf8.po.out | 2 +- tools/linguist/lconvert/main.cpp | 12 +++++++++--- tools/linguist/shared/po.cpp | 5 +++-- tools/linguist/shared/qm.cpp | 3 ++- tools/linguist/shared/translator.h | 3 ++- 5 files changed, 17 insertions(+), 8 deletions(-) diff --git a/tests/auto/linguist/lconvert/data/test-broken-utf8.po.out b/tests/auto/linguist/lconvert/data/test-broken-utf8.po.out index c00fd19..0a9f4c8 100644 --- a/tests/auto/linguist/lconvert/data/test-broken-utf8.po.out +++ b/tests/auto/linguist/lconvert/data/test-broken-utf8.po.out @@ -6,4 +6,4 @@ msgid "this works" msgstr "das geht: ä" msgid "this is broken" -msgstr "das ist kaputt: i" +msgstr "das ist kaputt: �i" diff --git a/tools/linguist/lconvert/main.cpp b/tools/linguist/lconvert/main.cpp index 553ce6e..fe8d529 100644 --- a/tools/linguist/lconvert/main.cpp +++ b/tools/linguist/lconvert/main.cpp @@ -86,8 +86,11 @@ static int usage(const QStringList &args) " --output-format \n" " Specify output format. See -if.\n\n" " --input-codec \n" - " Specify encoding for .qm input files. Default is 'Latin1'.\n" - " UTF-8 is always tried as well, corresponding to the trUtf8() function.\n\n" + " Specify encoding for .qm and .po input files. Default is 'Latin1'\n" + " for .qm and 'UTF-8' for .po files. UTF-8 is always tried as well for\n" + " .qm, corresponding to the possible use of the trUtf8() function.\n\n" + " --output-codec \n" + " Specify encoding for .po output files. Default is 'UTF-8'.\n\n" " --drop-tags \n" " Drop named extra tags when writing 'ts' or 'xlf' files.\n" " May be specified repeatedly.\n\n" @@ -139,7 +142,6 @@ int main(int argc, char *argv[]) bool verbose = false; ConversionData cd; - cd.m_codecForSource = "Latin1"; Translator tr; for (int i = 1; i < args.size(); ++i) { @@ -172,6 +174,10 @@ int main(int argc, char *argv[]) if (++i >= args.size()) return usage(args); cd.m_codecForSource = args[i].toLatin1(); + } else if (args[i] == QLatin1String("-output-codec")) { + if (++i >= args.size()) + return usage(args); + cd.m_outputCodec = args[i].toLatin1(); } else if (args[i] == QLatin1String("-drop-tag")) { if (++i >= args.size()) return usage(args); diff --git a/tools/linguist/shared/po.cpp b/tools/linguist/shared/po.cpp index a197b25..4850cfd 100644 --- a/tools/linguist/shared/po.cpp +++ b/tools/linguist/shared/po.cpp @@ -359,6 +359,7 @@ bool loadPO(Translator &translator, QIODevice &dev, ConversionData &cd) const QChar quote = QLatin1Char('"'); const QChar newline = QLatin1Char('\n'); QTextStream in(&dev); + in.setCodec(cd.m_codecForSource.isEmpty() ? "UTF-8" : cd.m_codecForSource); bool error = false; // format of a .po file entry: @@ -547,11 +548,11 @@ bool loadPO(Translator &translator, QIODevice &dev, ConversionData &cd) return !error && cd.errors().isEmpty(); } -bool savePO(const Translator &translator, QIODevice &dev, ConversionData &) +bool savePO(const Translator &translator, QIODevice &dev, ConversionData &cd) { bool ok = true; QTextStream out(&dev); - //qDebug() << "OUT CODEC: " << out.codec()->name(); + out.setCodec(cd.m_outputCodec.isEmpty() ? "UTF-8" : cd.m_outputCodec); bool first = true; if (translator.messages().isEmpty() || !translator.messages().first().sourceText().isEmpty()) { diff --git a/tools/linguist/shared/qm.cpp b/tools/linguist/shared/qm.cpp index 323bd29..381f5c5 100644 --- a/tools/linguist/shared/qm.cpp +++ b/tools/linguist/shared/qm.cpp @@ -545,7 +545,8 @@ bool loadQM(Translator &translator, QIODevice &dev, ConversionData &cd) size_t numItems = offsetLength / (2 * sizeof(quint32)); //qDebug() << "NUMITEMS: " << numItems; - QTextCodec *codec = QTextCodec::codecForName(cd.m_codecForSource); + QTextCodec *codec = QTextCodec::codecForName( + cd.m_codecForSource.isEmpty() ? "Latin1" : cd.m_codecForSource); QTextCodec *utf8Codec = 0; if (codec->name() != "UTF-8") utf8Codec = QTextCodec::codecForName("UTF-8"); diff --git a/tools/linguist/shared/translator.h b/tools/linguist/shared/translator.h index 01778d7..762a77ba 100644 --- a/tools/linguist/shared/translator.h +++ b/tools/linguist/shared/translator.h @@ -81,7 +81,8 @@ public: public: QString m_defaultContext; - QByteArray m_codecForSource; // CPP specific + QByteArray m_codecForSource; // CPP, PO & QM specific + QByteArray m_outputCodec; // PO specific QString m_sourceFileName; QString m_targetFileName; QDir m_sourceDir; -- cgit v0.12