bool TsHandler::endElement( const QString& /* namespaceURI */, const QString& /* localName */, const QString& qName ) { if ( qName == QString("codec") || qName == QString("defaultcodec") ) { // "codec" is a pre-3.0 syntax tor->setCodec( accum.toLatin1() ); } else if ( qName == QString("name") ) { context = accum; } else if ( qName == QString("source") ) { source = accum; } else if ( qName == QString("comment") ) { if ( inMessage ) { comment = accum; } else { if ( contextIsUtf8 ) tor->insert( MetaTranslatorMessage(context.toUtf8(), ContextComment, accum.toUtf8(), QString(), 0, QStringList(), true, MetaTranslatorMessage::Unfinished) ); else tor->insert( MetaTranslatorMessage(context.toUtf8(), ContextComment, accum.toUtf8(), QString(), 0, QStringList(), false, MetaTranslatorMessage::Unfinished) ); } } else if ( qName == QString("numerusform") ) { translations.append(accum); m_isPlural = true; } else if ( qName == QString("translation") ) { if (translations.isEmpty()) translations.append(accum); } else if ( qName == QString("message") ) { if ( messageIsUtf8 ) tor->insert( MetaTranslatorMessage(context.toUtf8(), source.toUtf8(), comment.toUtf8(), m_fileName, m_lineNumber, translations, true, type, m_isPlural) ); else tor->insert( MetaTranslatorMessage(context.toUtf8(), source.toUtf8(), comment.toUtf8(), m_fileName, m_lineNumber, translations, false, type, m_isPlural) ); inMessage = false; } return true; }
static void updateTsFiles( const MetaTranslator& fetchedTor, const QStringList& tsFileNames, const QString& codecForTr, bool noObsolete, bool verbose ) { QStringList::ConstIterator t = tsFileNames.begin(); QDir dir; while ( t != tsFileNames.end() ) { QString fn = dir.relativeFilePath(*t); MetaTranslator tor; MetaTranslator out; tor.load( *t ); if ( !codecForTr.isEmpty() ) tor.setCodec( codecForTr.toLatin1() ); if ( verbose ) fprintf( stderr, "Updating '%s'...\n", fn.toLatin1().constData() ); merge( &tor, &fetchedTor, &out, verbose, noObsolete ); if ( noObsolete ) out.stripObsoleteMessages(); out.stripEmptyContexts(); if ( !out.save(*t) ) { #if defined(_MSC_VER) && _MSC_VER >= 1400 char buf[100]; strerror_s(buf, sizeof(buf), errno); fprintf( stderr, "pylupdate4 error: Cannot save '%s': %s\n", fn.toLatin1().constData(), buf ); #else fprintf( stderr, "pylupdate4 error: Cannot save '%s': %s\n", fn.toLatin1().constData(), strerror(errno) ); #endif } ++t; } }
void UiHandler::flush() { if ( !context.isEmpty() && !source.isEmpty() ) tor->insert( MetaTranslatorMessage(context.utf8(), source.utf8(), comment.utf8(), QString::null, TRUE) ); source.truncate( 0 ); comment.truncate( 0 ); }
void UiHandler::flush() { if ( !context.isEmpty() && !source.isEmpty() ) tor->insert( MetaTranslatorMessage(context.toUtf8(), source.toUtf8(), comment.toUtf8(), QString(fname), m_lineNumber, QStringList(), true) ); source.truncate( 0 ); comment.truncate( 0 ); }
bool TsHandler::endElement( const QString& /* namespaceURI */, const QString& /* localName */, const QString& qName ) { if ( qName == QString( "codec" ) || qName == QString( "defaultcodec" ) ) { // "codec" is a pre-3.0 syntax tor->setCodec( accum ); } else if ( qName == QString( "name" ) ) { context = accum; } else if ( qName == QString( "source" ) ) { source = accum; } else if ( qName == QString( "comment" ) ) { if ( inMessage ) { comment = accum; } else { if ( contextIsUtf8 ) tor->insert( MetaTranslatorMessage( context.utf8(), ContextComment, accum.utf8(), QString::null, TRUE, MetaTranslatorMessage::Unfinished ) ); else tor->insert( MetaTranslatorMessage( context.ascii(), ContextComment, accum.ascii(), QString::null, FALSE, MetaTranslatorMessage::Unfinished ) ); } } else if ( qName == QString( "translation" ) ) { translation = accum; } else if ( qName == QString( "message" ) ) { if ( messageIsUtf8 ) tor->insert( MetaTranslatorMessage( context.utf8(), source.utf8(), comment.utf8(), translation, TRUE, type ) ); else tor->insert( MetaTranslatorMessage( context.ascii(), source.ascii(), comment.ascii(), translation, FALSE, type ) ); inMessage = FALSE; } return TRUE; }
void LupdateApplication::updateTsFiles( const MetaTranslator& fetchedTor, const QStringList& tsFileNames, const QString& codecForTr, bool noObsolete, bool onlyPlural, bool verbose ) { QStringList::ConstIterator t = tsFileNames.begin(); QDir dir; while ( t != tsFileNames.end() ) { QString fn = dir.relativeFilePath(*t); MetaTranslator tor; MetaTranslator out; tor.load( *t ); tor.makeFileNamesAbsolute(); if ( !codecForTr.isEmpty() ) { out.setCodec( codecForTr.toLatin1() ); tor.setCodec( codecForTr.toLatin1() ); } if ( verbose ) Console::out(tr("Updating '%1'...\n").arg(fn)); merge( &tor, &fetchedTor, &out, verbose, noObsolete ); if ( onlyPlural) { if ( verbose ) Console::out(tr("Stripping non plural forms in '%1'...\n").arg(fn)); out.stripNonPluralForms(); } if ( noObsolete ) out.stripObsoleteMessages(); out.stripEmptyContexts(); if ( !out.save(*t) ) { #if defined(_MSC_VER) && _MSC_VER >= 1400 char buf[100]; strerror_s(buf, sizeof(buf), errno); qWarning("lupdate error: Cannot save '%s': %s\n", qPrintable(fn), buf ); #else qWarning("lupdate error: Cannot save '%s': %s\n", qPrintable(fn), strerror(errno) ); #endif } ++t; } }
static void releaseMetaTranslator( const MetaTranslator& tor, const QString& qmFileName, bool verbose, bool stripped ) { if ( verbose ) fprintf( stderr, "Updating '%s'...\n", qmFileName.latin1() ); if ( !tor.release(qmFileName, verbose, stripped ? QTranslator::Stripped : QTranslator::Everything) ) fprintf( stderr, "lrelease warning: For some reason, I cannot save '%s'\n", qmFileName.latin1() ); }
static bool loadTsFile( MetaTranslator& tor, const QString& tsFileName, bool /* verbose */ ) { QString qmFileName = tsFileName; qmFileName.replace( QRegExp("\\.ts$"), "" ); qmFileName += ".qm"; bool ok = tor.load( tsFileName ); if ( !ok ) fprintf( stderr, "lrelease warning: For some reason, I cannot load '%s'\n", tsFileName.latin1() ); return ok; }
static void updateTsFiles( const MetaTranslator& fetchedTor, const QStringList& tsFileNames, const QString& codec, bool noObsolete, bool verbose ) { QStringList::ConstIterator t = tsFileNames.begin(); while ( t != tsFileNames.end() ) { MetaTranslator tor; tor.load( *t ); if ( !codec.isEmpty() ) tor.setCodec( codec ); if ( verbose ) fprintf( stderr, "Updating '%s'...\n", ( *t ).latin1() ); merge( &tor, &fetchedTor, verbose ); if ( noObsolete ) tor.stripObsoleteMessages(); tor.stripEmptyContexts(); if ( !tor.save( *t ) ) fprintf( stderr, "lupdate error: Cannot save '%s': %s\n", ( *t ).latin1(), strerror( errno ) ); ++t; } }
int main( int argc, char **argv ) { QString defaultContext = "@default"; MetaTranslator fetchedTor; QByteArray codecForTr; QByteArray codecForSource; QStringList tsFileNames; QStringList uiFileNames; bool verbose = false; bool noObsolete = false; bool metSomething = false; int numFiles = 0; bool standardSyntax = true; bool metTsFlag = false; int i; for ( i = 1; i < argc; i++ ) { if ( qstrcmp(argv[i], "-ts") == 0 ) standardSyntax = false; } for ( i = 1; i < argc; i++ ) { if ( qstrcmp(argv[i], "-help") == 0 ) { printUsage(); return 0; } else if ( qstrcmp(argv[i], "-noobsolete") == 0 ) { noObsolete = true; continue; } else if ( qstrcmp(argv[i], "-verbose") == 0 ) { verbose = true; continue; } else if ( qstrcmp(argv[i], "-version") == 0 ) { fprintf( stderr, "pylupdate4 version %s\n", QT_VERSION_STR ); return 0; } else if ( qstrcmp(argv[i], "-ts") == 0 ) { metTsFlag = true; continue; } numFiles++; QString fullText; if ( !metTsFlag ) { QFile f( argv[i] ); if ( !f.open(QIODevice::ReadOnly) ) { #if defined(_MSC_VER) && _MSC_VER >= 1400 char buf[100]; strerror_s(buf, sizeof(buf), errno); fprintf( stderr, "pylupdate4 error: Cannot open file '%s': %s\n", argv[i], buf ); #else fprintf( stderr, "pylupdate4 error: Cannot open file '%s': %s\n", argv[i], strerror(errno) ); #endif return 1; } QTextStream t( &f ); fullText = t.readAll(); f.close(); } QString oldDir = QDir::currentPath(); QDir::setCurrent( QFileInfo(argv[i]).path() ); if ( standardSyntax ) { fetchedTor = MetaTranslator(); codecForTr.clear(); codecForSource.clear(); tsFileNames.clear(); uiFileNames.clear(); QMap<QString, QString> tagMap = proFileTagMap( fullText ); QMap<QString, QString>::Iterator it; for ( it = tagMap.begin(); it != tagMap.end(); ++it ) { QStringList toks = it.value().split(' '); QStringList::Iterator t; for ( t = toks.begin(); t != toks.end(); ++t ) { if ( it.key() == "SOURCES" ) { fetchtr_py( (*t).toAscii(), &fetchedTor, defaultContext.toAscii(), true, codecForSource ); metSomething = true; } else if ( it.key() == "TRANSLATIONS" ) { tsFileNames.append( *t ); metSomething = true; } else if ( it.key() == "CODEC" || it.key() == "DEFAULTCODEC" || it.key() == "CODECFORTR" ) { codecForTr = (*t).toLatin1(); fetchedTor.setCodecForTr(codecForTr); } else if ( it.key() == "CODECFORSRC" ) { codecForSource = (*t).toLatin1(); } else if ( it.key() == "FORMS" ) { fetchtr_ui( (*t).toAscii(), &fetchedTor, defaultContext.toAscii(), true); } } } updateTsFiles( fetchedTor, tsFileNames, codecForTr, noObsolete, verbose ); if ( !metSomething ) { fprintf( stderr, "pylupdate4 warning: File '%s' does not look like a" " project file\n", argv[i] ); } else if ( tsFileNames.isEmpty() ) { fprintf( stderr, "pylupdate4 warning: Met no 'TRANSLATIONS' entry in" " project file '%s'\n", argv[i] ); } } else { if ( metTsFlag ) { if ( QString(argv[i]).toLower().endsWith(".ts") ) { QFileInfo fi( argv[i] ); if ( !fi.exists() || fi.isWritable() ) { tsFileNames.append( argv[i] ); } else { fprintf( stderr, "pylupdate4 warning: For some reason, I cannot" " save '%s'\n", argv[i] ); } } else { fprintf( stderr, "pylupdate4 error: File '%s' lacks .ts extension\n", argv[i] ); } } else { QFileInfo fi(argv[i]); if ( fi.suffix() == "py" || fi.suffix() == "pyw" ) { fetchtr_py( fi.fileName().toAscii(), &fetchedTor, defaultContext.toAscii(), true, codecForSource ); } else { fetchtr_ui( fi.fileName().toAscii(), &fetchedTor, defaultContext.toAscii(), true); } } } QDir::setCurrent( oldDir ); } if ( !standardSyntax ) updateTsFiles( fetchedTor, tsFileNames, codecForTr, noObsolete, verbose ); if ( numFiles == 0 ) { printUsage(); return 1; } return 0; }
bool TsHandler::endElement( const QString& /* namespaceURI */, const QString& /* localName */, const QString& qName ) { if ( qName == QString("codec") || qName == QString("defaultcodec") ) { // "codec" is a pre-3.0 syntax tor->setCodec( accum.toLatin1() ); } else if ( qName == QString("name") ) { context = accum; } else if ( qName == QString("source") ) { source = accum; } else if ( qName == QString("comment") ) { if ( inMessage ) { comment = accum; } else { if ( contextIsUtf8 ) tor->insert( MetaTranslatorMessage(context.toUtf8(), ContextComment, 0, accum.toUtf8(), QString(), 0, QStringList(), true, MetaTranslatorMessage::Unfinished) ); else tor->insert( MetaTranslatorMessage(context.toAscii(), ContextComment, 0, accum.toAscii(), QString(), 0, QStringList(), false, MetaTranslatorMessage::Unfinished) ); } } else if ( qName == QString("translatorcomment") ) { m_translatorComment = accum; } else if ( qName == QString("numerusform") ) { translations.append(accum); m_isPlural = true; } else if ( qName == QString("translation") ) { if (translations.isEmpty()) translations.append(accum); } else if ( qName == QString("lengthvariant") ) { // The DTD comments state that lengthvariant may appear within // numerusform, but not the other way around. if (translations.isEmpty()) translations.append( accum ); else { translations.last().append( VARIANT_DELIMITER ); translations.last().append( accum ); } } else if ( qName == QString("message") ) { if ( messageIsUtf8 ) tor->insert( MetaTranslatorMessage(context.toUtf8(), source.toUtf8(), comment.toUtf8(), m_translatorComment.toUtf8(), m_fileName, m_lineNumber, translations, true, type, m_isPlural) ); else tor->insert( MetaTranslatorMessage(context.toAscii(), source.toAscii(), comment.toAscii(), m_translatorComment.toAscii(), m_fileName, m_lineNumber, translations, false, type, m_isPlural) ); inMessage = false; } return true; }
bool MessageModel::load(const QString &fileName) { MetaTranslator tor; bool ok = tor.load(fileName); if (ok) { if(tor.codecForTr()) m_codecForTr = tor.codecForTr()->name(); int messageCount = 0; clearContextList(); m_numFinished = 0; m_numNonobsolete = 0; TML all = tor.messages(); QHash<QString, ContextItem*> contexts; m_srcWords = 0; m_srcChars = 0; m_srcCharsSpc = 0; foreach(MetaTranslatorMessage mtm, all) { QCoreApplication::processEvents(); ContextItem *c; if (contexts.contains(QLatin1String(mtm.context()))) { c = contexts.value( QLatin1String(mtm.context())); } else { c = createContextItem(tor.toUnicode(mtm.context(), mtm.utf8()));; appendContextItem(c); contexts.insert(QLatin1String(mtm.context()), c); } if (QByteArray(mtm.sourceText()) == ContextComment) { c->appendToComment(tor.toUnicode(mtm.comment(), mtm.utf8())); } else { MessageItem *tmp = new MessageItem(mtm, tor.toUnicode(mtm.sourceText(), mtm.utf8()), tor.toUnicode(mtm.comment(), mtm.utf8()), c); if (mtm.type() != MetaTranslatorMessage::Obsolete) { m_numNonobsolete++; //if (mtm.type() == MetaTranslatorMessage::Finished) //tmp->setFinished(true); //++m_numFinished; doCharCounting(tmp->sourceText(), m_srcWords, m_srcChars, m_srcCharsSpc); } else { c->incrementObsoleteCount(); } c->appendMessageItem(tmp); ++messageCount; } } // Try to detect the correct language in the following order // 1. Look for the language attribute in the ts // if that fails // 2. Guestimate the language from the filename (expecting the qt_{en,de}.ts convention) // if that fails // 3. Retrieve the locale from the system. QString lang = tor.languageCode(); if (lang.isEmpty()) { int pos_sep = fileName.indexOf(QLatin1Char('_')); if (pos_sep != -1 && pos_sep + 3 <= fileName.length()) { lang = fileName.mid(pos_sep + 1, 2); } } QLocale::Language l; QLocale::Country c; MetaTranslator::languageAndCountry(lang, &l, &c); if (l == QLocale::C) { QLocale sys; l = sys.language(); c = sys.country(); } setLanguage(l); setCountry(c); m_numMessages = messageCount; updateAll(); setModified(false); }
int LupdateApplication::start() { QStringList argv = arguments(); int argc = argv.count(); QString defaultContext; // This was QLatin1String("@default") before. MetaTranslator fetchedTor; QByteArray codecForTr; QByteArray codecForSource; QStringList tsFileNames; QStringList proFiles; QStringList sourceFiles; bool verbose = true; // verbose is on by default starting with Qt 4.2 bool noObsolete = false; bool onlyPlural = false; int numFiles = 0; bool standardSyntax = true; bool metTsFlag = false; QString extensions = m_defaultExtensions; QStringList extensionsNameFilters; int i; for ( i = 1; i < argc; i++ ) { if ( argv.at(i) == QLatin1String("-ts") ) standardSyntax = false; } for ( i = 1; i < argc; i++ ) { QString arg = argv.at(i); if ( arg == QLatin1String("-help") || arg == QLatin1String("--help") || arg == QLatin1String("-h")) { printUsage(); return 0; } else if ( arg == QLatin1String("-pluralonly") ) { onlyPlural = true; continue; } else if ( arg == QLatin1String("-noobsolete") ) { noObsolete = true; continue; } else if ( arg == QLatin1String("-silent") ) { verbose = false; continue; } else if ( arg == QLatin1String("-verbose") ) { verbose = true; continue; } else if ( arg == QLatin1String("-version") ) { Console::out(tr("lupdate version %1\n").arg(QLatin1String(QT_VERSION_STR)) ); return 0; } else if ( arg == QLatin1String("-ts") ) { metTsFlag = true; continue; } else if ( arg == QLatin1String("-extensions") ) { ++i; if (i == argc) { qWarning("The -extensions option should be followed by an extension list."); return 1; } extensions = argv.at(i); continue; } numFiles++; QString fullText; if ( standardSyntax && !metTsFlag ) { QFile f( arg ); if ( !f.open(QIODevice::ReadOnly) ) { #if defined(_MSC_VER) && _MSC_VER >= 1400 char buf[100]; strerror_s(buf, sizeof(buf), errno); qWarning("lupdate error: Cannot open file '%s': %s\n", qPrintable(arg), buf ); #else qWarning("lupdate error: Cannot open file '%s': %s\n", qPrintable(arg), strerror(errno) ); #endif return 1; } f.close(); } codecForTr.clear(); codecForSource.clear(); if (metTsFlag) { if ( arg.endsWith(QLatin1String(".ts"), Qt::CaseInsensitive) || arg.endsWith(QLatin1String(".xlf"), Qt::CaseInsensitive)) { QFileInfo fi( arg ); if ( !fi.exists() || fi.isWritable() ) { tsFileNames.append( QFileInfo(arg).absoluteFilePath() ); } else { qWarning("lupdate warning: For some reason, I cannot save '%s'\n", qPrintable(arg) ); } } else { qWarning("lupdate error: File '%s' lacks .ts or .xlf extension\n", qPrintable(arg) ); } } else if (arg.endsWith(QLatin1String(".pro"), Qt::CaseInsensitive)) { proFiles << arg; } else { QFileInfo fi(arg); if (fi.isDir()) { if ( verbose ) Console::out(tr("Scanning directory '%1'...\n").arg(arg)); QDir dir = QDir(fi.filePath()); if (extensionsNameFilters.isEmpty()) { extensions = extensions.trimmed(); // Remove the potential dot in front of each extension if (extensions.startsWith(QLatin1Char('.'))) extensions.remove(0,1); extensions.replace(QLatin1String(",."), QLatin1String(",")); extensions.insert(0, QLatin1String("*.")); extensions.replace(QLatin1Char(','), QLatin1String(",*.")); extensionsNameFilters = extensions.split(QLatin1Char(',')); } QDir::Filters filters = QDir::Files | QDir::NoSymLinks; QFileInfoList fileinfolist; recursiveFileInfoList(dir, extensionsNameFilters, filters, true, &fileinfolist); QFileInfoList::iterator ii; QString fn; for (ii = fileinfolist.begin(); ii != fileinfolist.end(); ++ii) { // Make sure the path separator is stored with '/' in the ts file fn = ii->canonicalFilePath().replace(QLatin1Char('\\'),QLatin1Char('/')); #ifdef LINGUIST_DEBUG qDebug() << fn; #endif sourceFiles << fn; } }else{ sourceFiles << fi.canonicalFilePath().replace(QLatin1Char('\\'),QLatin1Char('/')); } } } //for if ( proFiles.count() > 0 ) { proFiles = getListOfProfiles(proFiles, verbose); } bool firstPass = true; for (int pi = 0; firstPass || pi < proFiles.count(); ++pi) { QStringList tsFiles = tsFileNames; if (proFiles.count() > 0) { QString pf = proFiles.at(pi); QMap<QByteArray, QStringList> variables; if(!evaluateProFile(pf, verbose, &variables)) return 2; sourceFiles = variables.value("SOURCES"); QStringList tmp = variables.value("CODECFORTR"); if (!tmp.isEmpty()) { codecForTr = tmp.first().toAscii(); fetchedTor.setCodecForTr(codecForTr.constData()); } tmp = variables.value("CODECFORSRC"); if (!tmp.isEmpty()) { codecForSource = tmp.first().toAscii(); } tsFiles += variables.value("TRANSLATIONS"); } for (QStringList::iterator it = sourceFiles.begin(); it != sourceFiles.end(); ++it) { #ifdef LINGUIST_DEBUG qDebug() << " " << (*it); #endif if ( (*it).endsWith(QLatin1String(".java"), Qt::CaseInsensitive) ) { fetchtr_java( *it, &fetchedTor, defaultContext, true, codecForSource ); } else if ( (*it).endsWith(QLatin1String(".ui"), Qt::CaseInsensitive) ) { #ifdef LINGUIST_DEBUG qDebug() << " " << (*it) + ".h"; #endif fetchtr_ui( *it, &fetchedTor, defaultContext, true ); fetchtr_cpp( *it + QLatin1String(".h"), &fetchedTor, defaultContext, false, codecForSource ); } else { fetchtr_cpp( *it, &fetchedTor, defaultContext, true, codecForSource ); } } removeDuplicates(&tsFiles, false); if ( tsFiles.count() > 0) { updateTsFiles( fetchedTor, tsFiles, QString::fromLatin1(codecForTr.constData()), noObsolete, onlyPlural, verbose ); } firstPass = false; } if ( numFiles == 0 ) { printUsage(); return 1; } return 0; }