Dictionary::Ptr Dictionary::import( const QString& fileName ) { QFile file( fileName ); if ( !file.open( QIODevice::ReadOnly | QIODevice::Text ) ) { qDebug() << "Can't open " << fileName << ", err: " << file.errorString(); return Dictionary::Ptr(); } qint64 total = file.size(); int numWords = 0; int numTranslations = 0; Lang src = QLocale::C; Lang trg = QLocale::C; QString source; QStringList targets; int ops = 0; Database* db = Database::instance(); db->begin(); Dictionary::Ptr dict; bool ok = true; QTextStream in( &file ); while ( !in.atEnd() ) { QString line = in.readLine(); if ( line.startsWith('#') ) { if ( line.startsWith( "#INDEX_LANGUAGE" ) ) { src = QLocale::Finnish; // getLang( line ); } else if ( line.startsWith( "#CONTENTS_LANGUAGE" ) ) { trg = QLocale::Russian; // getLang( line ); } if ( src != QLocale::C && trg != QLocale::C ) { dict = Dictionary::Ptr( new Dictionary( LangPair( src, trg ) ) ); ok = dict->open(); if ( !ok ) break; } } else if ( !line.isEmpty() && !line[0].isSpace() ) { source = line; } else if ( line.contains("[trn]") ) { int start = line.indexOf("[trn]") + QString("[trn]").length(); int end = line.indexOf("[/trn]"); if ( end > start ) { targets.append( line.mid( start, end - start ) ); } } else if ( line.trimmed().isEmpty() && dict ) { int res = dict->addWord( source, targets ); if ( res < 0 ) { db->rollback(); ok = false; break; } numWords++; numTranslations += res - 1; ops++; if ( ops % 100 == 0 ) { if ( !db->commit() && !db->begin() ) { ok = false; break; } double prog = in.pos() * 100.0 / total; emit dict->progress( prog ); QCoreApplication::processEvents(); } source.clear(); targets.clear(); } } db->commit(); qDebug() << "Added" << numWords << "new words and" << numTranslations << "new translations"; return dict; }