📄 metatranslator.cpp
字号:
utfeight = m.utfeight; ty = m.ty; return *this;}bool MetaTranslatorMessage::operator==( const MetaTranslatorMessage& m ) const{ return qstrcmp( context(), m.context() ) == 0 && qstrcmp( sourceText(), m.sourceText() ) == 0 && qstrcmp( comment(), m.comment() ) == 0;}bool MetaTranslatorMessage::operator<( const MetaTranslatorMessage& m ) const{ int delta = qstrcmp( context(), m.context() ); if ( delta == 0 ) delta = qstrcmp( sourceText(), m.sourceText() ); if ( delta == 0 ) delta = qstrcmp( comment(), m.comment() ); return delta < 0;}MetaTranslator::MetaTranslator() : codecName( "ISO-8859-1" ), codec( 0 ){}MetaTranslator::MetaTranslator( const MetaTranslator& tor ) : mm( tor.mm ), codecName( tor.codecName ), codec( tor.codec ){}MetaTranslator& MetaTranslator::operator=( const MetaTranslator& tor ){ mm = tor.mm; codecName = tor.codecName; codec = tor.codec; return *this;}bool MetaTranslator::load( const QString& filename ){ mm.clear(); QFile f( filename ); if ( !f.open(IO_ReadOnly) ) return FALSE; QTextStream t( &f ); QXmlInputSource in( t ); QXmlSimpleReader reader; // don't click on these! reader.setFeature( "http://xml.org/sax/features/namespaces", FALSE ); reader.setFeature( "http://xml.org/sax/features/namespace-prefixes", TRUE ); reader.setFeature( "http://trolltech.com/xml/features/report-whitespace" "-only-CharData", FALSE ); QXmlDefaultHandler *hand = new TsHandler( this ); reader.setContentHandler( hand ); reader.setErrorHandler( hand ); bool ok = reader.parse( in ); reader.setContentHandler( 0 ); reader.setErrorHandler( 0 ); delete hand; f.close(); if ( !ok ) mm.clear(); return ok;}bool MetaTranslator::save( const QString& filename ) const{ QFile f( filename ); if ( !f.open(IO_WriteOnly) ) return FALSE; QTextStream t( &f ); t.setCodec( QTextCodec::codecForName("ISO-8859-1") ); t << "<!DOCTYPE TS><TS>\n"; if ( codecName != "ISO-8859-1" ) t << "<defaultcodec>" << codecName << "</defaultcodec>\n"; TMM::ConstIterator m = mm.begin(); while ( m != mm.end() ) { TMMInv inv; TMMInv::Iterator i; bool contextIsUtf8 = m.key().utf8(); QCString context = m.key().context(); QCString comment = ""; do { if ( QCString(m.key().sourceText()).isEmpty() ) { if ( m.key().type() != MetaTranslatorMessage::Obsolete ) { contextIsUtf8 = m.key().utf8(); comment = QCString( m.key().comment() ); } } else { inv.insert( *m, m.key() ); } } while ( ++m != mm.end() && QCString(m.key().context()) == context ); t << "<context"; if ( contextIsUtf8 ) t << " encoding=\"UTF-8\""; t << ">\n"; t << " <name>" << evilBytes( context, contextIsUtf8 ) << "</name>\n"; if ( !comment.isEmpty() ) t << " <comment>" << evilBytes( comment, contextIsUtf8 ) << "</comment>\n"; for ( i = inv.begin(); i != inv.end(); ++i ) { // no need for such noise if ( (*i).type() == MetaTranslatorMessage::Obsolete && (*i).translation().isEmpty() ) continue; t << " <message"; if ( (*i).utf8() ) t << " encoding=\"UTF-8\""; t << ">\n" << " <source>" << evilBytes( (*i).sourceText(), (*i).utf8() ) << "</source>\n"; if ( !QCString((*i).comment()).isEmpty() ) t << " <comment>" << evilBytes( (*i).comment(), (*i).utf8() ) << "</comment>\n"; t << " <translation"; if ( (*i).type() == MetaTranslatorMessage::Unfinished ) t << " type=\"unfinished\""; else if ( (*i).type() == MetaTranslatorMessage::Obsolete ) t << " type=\"obsolete\""; t << ">" << protect( (*i).translation().utf8() ) << "</translation>\n"; t << " </message>\n"; } t << "</context>\n"; } t << "</TS>\n"; f.close(); return TRUE;}bool MetaTranslator::release( const QString& filename, bool verbose ) const{ QTranslator tor( 0 ); int finished = 0; int unfinished = 0; int untranslated = 0; TMM::ConstIterator m; for ( m = mm.begin(); m != mm.end(); ++m ) { if ( m.key().type() != MetaTranslatorMessage::Obsolete ) { if ( m.key().translation().isEmpty() ) { untranslated++; } else { if ( m.key().type() == MetaTranslatorMessage::Unfinished ) unfinished++; else finished++; QCString context = m.key().context(); QCString sourceText = m.key().sourceText(); QCString comment = m.key().comment(); QString translation = m.key().translation(); /* Drop the comment in (context, sourceText, comment), unless (context, sourceText, "") already exists, or unless we already dropped the comment of (context, sourceText, comment0). */ if ( comment.isEmpty() || contains(context, sourceText, "") || !tor.findMessage(context, sourceText, "").translation() .isNull() ) { tor.insert( m.key() ); } else { tor.insert( QTranslatorMessage(context, sourceText, "", translation) ); } } } } bool saved = tor.save( filename, QTranslator::Stripped ); if ( saved && verbose ) fprintf( stderr, " %d finished, %d unfinished and %d untranslated messages\n", finished, unfinished, untranslated ); return saved;}bool MetaTranslator::contains( const char *context, const char *sourceText, const char *comment ) const{ return mm.find( MetaTranslatorMessage(context, sourceText, comment) ) != mm.end();}void MetaTranslator::insert( const MetaTranslatorMessage& m ){ int pos = mm.count(); TMM::Iterator n = mm.find( m ); if ( n != mm.end() ) pos = *n; mm.replace( m, pos );}void MetaTranslator::stripObsoleteMessages(){ TMM newmm; TMM::Iterator m = mm.begin(); while ( m != mm.end() ) { if ( m.key().type() != MetaTranslatorMessage::Obsolete ) newmm.insert( m.key(), *m ); ++m; } mm = newmm;}void MetaTranslator::stripEmptyContexts(){ TMM newmm; TMM::Iterator m = mm.begin(); while ( m != mm.end() ) { if ( QCString(m.key().sourceText()).isEmpty() ) { TMM::Iterator n = m; ++n; // the context comment is followed by other messages if ( n != newmm.end() && qstrcmp(m.key().context(), n.key().context()) == 0 ) newmm.insert( m.key(), *m ); } else { newmm.insert( m.key(), *m ); } ++m; } mm = newmm;}void MetaTranslator::setCodec( const char *name ){ const int latin1 = 4; codecName = name; codec = QTextCodec::codecForName( name ); if ( codec == 0 || codec->mibEnum() == latin1 ) codec = 0;}QString MetaTranslator::toUnicode( const char *str, bool utf8 ) const{ if ( utf8 ) return QString::fromUtf8( str ); else if ( codec == 0 ) return QString( str ); else return codec->toUnicode( str );}QValueList<MetaTranslatorMessage> MetaTranslator::messages() const{ int n = mm.count(); TMM::ConstIterator *t = new TMM::ConstIterator[n + 1]; TMM::ConstIterator m; for ( m = mm.begin(); m != mm.end(); ++m ) t[*m] = m; QValueList<MetaTranslatorMessage> val; for ( int i = 0; i < n; i++ ) val.append( t[i].key() ); delete[] t; return val;}QValueList<MetaTranslatorMessage> MetaTranslator::translatedMessages() const{ QValueList<MetaTranslatorMessage> val; TMM::ConstIterator m; for ( m = mm.begin(); m != mm.end(); ++m ) { if ( m.key().type() == MetaTranslatorMessage::Finished ) val.append( m.key() ); } return val;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -