⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 metatranslator.cpp

📁 Linux下的基于X11的图形开发环境。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/************************************************************************ Copyright (C) 2000-2002 Trolltech AS.  All rights reserved.**** This file is part of Qt Linguist.**** This file may be distributed and/or modified under the terms of the** GNU General Public License version 2 as published by the Free Software** Foundation and appearing in the file LICENSE.GPL included in the** packaging of this file.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.**** See http://www.trolltech.com/gpl/ for GPL licensing information.**** Contact info@trolltech.com if any conditions of this licensing are** not clear to you.************************************************************************/#include "metatranslator.h"#include <qapplication.h>#include <qcstring.h>#include <qfile.h>#include <qmessagebox.h>#include <qtextcodec.h>#include <qtextstream.h>#include <qxml.h>static bool encodingIsUtf8( const QXmlAttributes& atts ){    for ( int i = 0; i < atts.length(); i++ ) {	// utf8="true" is a pre-3.0 syntax	if ( atts.qName(i) == QString("utf8") ) {	    return ( atts.value(i) == QString("true") );	} else if ( atts.qName(i) == QString("encoding") ) {	    return ( atts.value(i) == QString("UTF-8") );	}    }    return FALSE;}class TsHandler : public QXmlDefaultHandler{public:    TsHandler( MetaTranslator *translator )	: tor( translator ), type( MetaTranslatorMessage::Finished ),	  inMessage( FALSE ), ferrorCount( 0 ), contextIsUtf8( FALSE ),	  messageIsUtf8( FALSE ) { }    virtual bool startElement( const QString& namespaceURI,			       const QString& localName, const QString& qName,			       const QXmlAttributes& atts );    virtual bool endElement( const QString& namespaceURI,			     const QString& localName, const QString& qName );    virtual bool characters( const QString& ch );    virtual bool fatalError( const QXmlParseException& exception );private:    MetaTranslator *tor;    MetaTranslatorMessage::Type type;    bool inMessage;    QString context;    QString source;    QString comment;    QString translation;    QString accum;    int ferrorCount;    bool contextIsUtf8;    bool messageIsUtf8;};bool TsHandler::startElement( const QString& /* namespaceURI */,			      const QString& /* localName */,			      const QString& qName,			      const QXmlAttributes& atts ){    if ( qName == QString("byte") ) {	for ( int i = 0; i < atts.length(); i++ ) {	    if ( atts.qName(i) == QString("value") ) {		QString value = atts.value( i );		int base = 10;		if ( value.startsWith("x") ) {		    base = 16;		    value = value.mid( 1 );		}		int n = value.toUInt( 0, base );		if ( n != 0 )		    accum += QChar( n );	    }	}	    } else {	if ( qName == QString("context") ) {	    context.truncate( 0 );	    source.truncate( 0 );	    comment.truncate( 0 );	    translation.truncate( 0 );	    contextIsUtf8 = encodingIsUtf8( atts );	} else if ( qName == QString("message") ) {	    inMessage = TRUE;	    type = MetaTranslatorMessage::Finished;	    source.truncate( 0 );	    comment.truncate( 0 );	    translation.truncate( 0 );	    messageIsUtf8 = encodingIsUtf8( atts );	} else if ( qName == QString("translation") ) {	    for ( int i = 0; i < atts.length(); i++ ) {		if ( atts.qName(i) == QString("type") ) {		    if ( atts.value(i) == QString("unfinished") )			type = MetaTranslatorMessage::Unfinished;		    else if ( atts.value(i) == QString("obsolete") )			type = MetaTranslatorMessage::Obsolete;		    else			type = MetaTranslatorMessage::Finished;		}	    }	}	accum.truncate( 0 );    }    return TRUE;}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(), "",			     accum.utf8(), QString::null, TRUE,			     MetaTranslatorMessage::Unfinished) );	    else		tor->insert( MetaTranslatorMessage(context.ascii(), "",			     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;}bool TsHandler::characters( const QString& ch ){    QString t = ch;    t.replace( "\r", "" );    accum += t;    return TRUE;}bool TsHandler::fatalError( const QXmlParseException& exception ){    if ( ferrorCount++ == 0 ) {	QString msg;	msg.sprintf( "Parse error at line %d, column %d (%s).",		     exception.lineNumber(), exception.columnNumber(),		     exception.message().latin1() );	if ( qApp == 0 )	    fprintf( stderr, "XML error: %s\n", msg.latin1() );	else	    QMessageBox::information( qApp->mainWidget(),				      QObject::tr("Qt Linguist"), msg );    }    return FALSE;}static QString numericEntity( int ch ){    return QString( ch <= 0x20 ? "<byte value=\"x%1\"/>" : "&#x%1;" )	   .arg( ch, 0, 16 );}static QString protect( const QCString& str ){    QString result;    int len = (int) str.length();    for ( int k = 0; k < len; k++ ) {	switch( str[k] ) {	case '\"':	    result += QString( "&quot;" );	    break;	case '&':	    result += QString( "&amp;" );	    break;	case '>':	    result += QString( "&gt;" );	    break;	case '<':	    result += QString( "&lt;" );	    break;	case '\'':	    result += QString( "&apos;" );	    break;	default:	    if ( (uchar) str[k] < 0x20 && str[k] != '\n' )		result += numericEntity( (uchar) str[k] );	    else		result += str[k];	}    }    return result;}static QString evilBytes( const QCString& str, bool utf8 ){    if ( utf8 ) {	return protect( str );    } else {	QString result;	QCString t = protect( str ).latin1();	int len = (int) t.length();	for ( int k = 0; k < len; k++ ) {	    if ( (uchar) t[k] >= 0x7f )		result += numericEntity( (uchar) t[k] );	    else		result += QChar( t[k] );	}	return result;    }}MetaTranslatorMessage::MetaTranslatorMessage()    : utfeight( FALSE ), ty( Unfinished ){}MetaTranslatorMessage::MetaTranslatorMessage( const char *context,					      const char *sourceText,					      const char *comment,					      const QString& translation,					      bool utf8, Type type )    : QTranslatorMessage( context, sourceText, comment, translation ),      utfeight( FALSE ), ty( type ){    /*      Don't use UTF-8 if it makes no difference. UTF-8 should be      reserved for the real problematic case: non-ASCII (possibly      non-Latin-1) characters in .ui files.    */    if ( utf8 ) {	if ( sourceText != 0 ) {	    int i = 0;	    while ( sourceText[i] != '\0' ) {		if ( (uchar) sourceText[i] >= 0x80 ) {		    utfeight = TRUE;		    break;		}		i++;	    }	}	if ( !utfeight && comment != 0 ) {	    int i = 0;	    while ( comment[i] != '\0' ) {		if ( (uchar) comment[i] >= 0x80 ) {		    utfeight = TRUE;		    break;		}		i++;	    }	}    }}MetaTranslatorMessage::MetaTranslatorMessage( const MetaTranslatorMessage& m )    : QTranslatorMessage( m ), utfeight( m.utfeight ), ty( m.ty ){}MetaTranslatorMessage& MetaTranslatorMessage::operator=(	const MetaTranslatorMessage& m ){    QTranslatorMessage::operator=( m );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -