void translate( const QString& filename, const QString& qmfile ) { QFile f(filename); if ( !f.open( IO_ReadOnly) ) return; QTranslator* translator = new QTranslator(0); QTextCodec *codec = 0; for (int pass = 0; pass < 2; pass++) { f.at(0); QTextStream t( &f ); QString line; QString msgid; QString msgstr; if ( codec != 0 ) { t.setCodec( codec ); } while ( !t.atEnd() || !line.isEmpty() ) { if (line.isEmpty()) { t.skipWhiteSpace(); line = t.readLine(); } if ( hasHandle( line, "msgid") ) { msgstr = QString::null; msgid = extractContents( line ); if (!t.atEnd()) { t.skipWhiteSpace(); line = t.readLine(); } else line = QString::null; while ( hasHandle( line, "\"") ) { msgid += extractContents( line ); if (!t.atEnd()) { t.skipWhiteSpace(); line = t.readLine(); } else line = QString::null; } } else if ( hasHandle( line, "msgstr") ) { msgstr = extractContents( line ); if (!t.atEnd()) { t.skipWhiteSpace(); line = t.readLine(); } else line = QString::null; while ( hasHandle( line, "\"") ) { msgstr += extractContents( line ); if (!t.atEnd()) { t.skipWhiteSpace(); line = t.readLine(); } else line = QString::null; } if ( pass == 1 ) addTranslation( translator, msgid, msgstr); if ( pass == 0 && msgid.isEmpty() ) { // Check for the encoding. int cpos = msgstr.find( "charset=" ); if ( cpos >= 0 ) { cpos = cpos + 8; //skip "charset=" int i = cpos; int len = msgstr.length(); while ( i < len && !msgstr[i].isSpace() ) i++; QString charset = msgstr.mid( cpos, i-cpos ); codec = QTextCodec::codecForName( charset.ascii() ); if ( codec ) { debug( "PO file character set: %s. Codec: %s", charset.ascii(), codec->name() ); } else { debug( "No codec for %s", charset.ascii() ); } } break; } } else line = QString::null; } } f.close(); translator->save( qmfile ); }