--EeQfGwPcQSOJBaQU Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On 30.06.06 13:52:58, Andreas Pakulat wrote: > On 27.06.06 15:42:25, Andreas Pakulat wrote: > > Hi, > > > > a pylupdate4 ui/somewidget.ui -ts de.ts doesn't produce any output into > > the .ts file. > > I created a patch to make this work, it is attached. > > Notes to make: > > The code is copied from lupdate of Qt/X11 open source edition but should > work on the other versions too. It uses a SAX2 handler that extracts the > strings. > > I needed to remove the support for inlined functions in the .ui-file, > but I think that't not supported by pyuic4 anyway. > > I also hardcoded the Ui_-prefix that will be generated by pyuic4 so the > context is correct (else it would use the classname only as context). > > Hope this makes it into the next PyQt4 along with the fix for pyuic4 to > generate proper self.tr functions. Forgot to actually attach the patch. Andreas -- You have a deep interest in all that is artistic. --EeQfGwPcQSOJBaQU Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=patch_pylupdate4_ui diff -ur PyQt-x11-gpl-4.0/pylupdate/fetchtr.cpp PyQt-x11-gpl-4.0.pylup/pylupdate/fetchtr.cpp --- PyQt-x11-gpl-4.0/pylupdate/fetchtr.cpp 2006-06-10 14:43:21.000000000 +0200 +++ PyQt-x11-gpl-4.0.pylup/pylupdate/fetchtr.cpp 2006-06-30 13:45:52.000000000 +0200 @@ -46,6 +46,7 @@ #include #include +#include static const char MagicComment[] = "TRANSLATOR "; @@ -555,3 +556,137 @@ parse( tor, 0, defaultContext ); fclose( yyInFile ); } + +class UiHandler : public QXmlDefaultHandler +{ +public: + UiHandler( MetaTranslator *translator, const char *fileName ) + : tor( translator ), fname( fileName ), comment( "" ) { } + + 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: + void flush(); + + MetaTranslator *tor; + QByteArray fname; + QString context; + QString source; + QString comment; + + QString accum; + + bool trString; +}; + +bool UiHandler::startElement( const QString& /* namespaceURI */, + const QString& /* localName */, + const QString& qName, + const QXmlAttributes& atts ) +{ + if ( qName == QString("item") ) { + flush(); + if ( !atts.value(QString("text")).isEmpty() ) + source = atts.value( QString("text") ); + } else if ( qName == QString("string") ) { + flush(); + if (atts.value(QString("notr")).isEmpty() || + atts.value(QString("notr")) != QString("true")) { + trString = true; + comment = atts.value(QString("comment")); + } else { + trString = false; + } + } + accum.truncate( 0 ); + return true; +} + +bool UiHandler::endElement( const QString& /* namespaceURI */, + const QString& /* localName */, + const QString& qName ) +{ + accum.replace( QRegExp(QString("\r\n")), "\n" ); + + if ( qName == QString("class") ) { + if ( context.isEmpty() ) + context = QString("Ui_"+accum); + } else if ( qName == QString("string") && trString ) { + source = accum; + } else if ( qName == QString("comment") ) { + comment = accum; + flush(); + } else { + flush(); + } + return true; +} + +bool UiHandler::characters( const QString& ch ) +{ + accum += ch; + return true; +} + +bool UiHandler::fatalError( const QXmlParseException& exception ) +{ + QString msg; + msg.sprintf( "Parse error at line %d, column %d (%s).", + exception.lineNumber(), exception.columnNumber(), + exception.message().toLatin1().data() ); + fprintf( stderr, "XML error: %s\n", msg.toLatin1().data() ); + return false; +} + +void UiHandler::flush() +{ + if ( !context.isEmpty() && !source.isEmpty() ) + tor->insert( MetaTranslatorMessage(context.toUtf8(), source.toUtf8(), + comment.toUtf8(), QString(), + true) ); + source.truncate( 0 ); + comment.truncate( 0 ); +} + +void fetchtr_ui( const char *fileName, MetaTranslator *tor, + const char * /* defaultContext */, bool mustExist ) +{ + QFile f( fileName ); + if ( !f.open(QIODevice::ReadOnly) ) { + if ( mustExist ) { +#if defined(_MSC_VER) && _MSC_VER >= 1400 + char buf[100]; + strerror_s(buf, sizeof(buf), errno); + fprintf( stderr, "lupdate error: cannot open UI file '%s': %s\n", + fileName, buf ); +#else + fprintf( stderr, "lupdate error: cannot open UI file '%s': %s\n", + fileName, strerror(errno) ); +#endif + } + return; + } + + QXmlInputSource in( &f ); + QXmlSimpleReader reader; + 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 UiHandler( tor, fileName ); + reader.setContentHandler( hand ); + reader.setErrorHandler( hand ); + + if ( !reader.parse(in) ) + fprintf( stderr, "%s: Parse error in UI file\n", fileName ); + reader.setContentHandler( 0 ); + reader.setErrorHandler( 0 ); + delete hand; + f.close(); +} diff -ur PyQt-x11-gpl-4.0/pylupdate/main.cpp PyQt-x11-gpl-4.0.pylup/pylupdate/main.cpp --- PyQt-x11-gpl-4.0/pylupdate/main.cpp 2006-06-10 14:43:21.000000000 +0200 +++ PyQt-x11-gpl-4.0.pylup/pylupdate/main.cpp 2006-06-30 13:43:15.000000000 +0200 @@ -48,6 +48,9 @@ // defined in fetchtr.cpp extern void fetchtr_py( const char *fileName, MetaTranslator *tor, const char *defaultContext, bool mustExist, const QByteArray &codecForSource ); +extern void fetchtr_ui( const char *fileName, MetaTranslator *tor, + const char *defaultContext, bool mustExist ); + // defined in merge.cpp @@ -109,6 +112,7 @@ QByteArray codecForTr; QByteArray codecForSource; QStringList tsFileNames; + QStringList uiFileNames; bool verbose = false; bool noObsolete = false; @@ -174,6 +178,7 @@ codecForTr.clear(); codecForSource.clear(); tsFileNames.clear(); + uiFileNames.clear(); QMap tagMap = proFileTagMap( fullText ); QMap::Iterator it; @@ -195,7 +200,9 @@ codecForTr = (*t).toLatin1(); } else if ( it.key() == "CODECFORSRC" ) { codecForSource = (*t).toLatin1(); - } + } else if ( it.key() == "FORMS" ) { + fetchtr_ui( (*t).toAscii(), &fetchedTor, defaultContext.toAscii(), true); + } } } @@ -224,14 +231,18 @@ " save '%s'\n", argv[i] ); } - } else { + } else { fprintf( stderr, "pylupdate4 error: File '%s' lacks .ts extension\n", argv[i] ); } } else { QFileInfo fi(argv[i]); - fetchtr_py( fi.fileName().toAscii(), &fetchedTor, defaultContext.toAscii(), true, codecForSource ); + if ( fi.suffix() == "py" ) { + fetchtr_py( fi.fileName().toAscii(), &fetchedTor, defaultContext.toAscii(), true, codecForSource ); + } else { + fetchtr_ui( fi.fileName().toAscii(), &fetchedTor, defaultContext.toAscii(), true); + } } } QDir::setCurrent( oldDir ); --EeQfGwPcQSOJBaQU Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ PyKDE mailing list PyKDE@mats.imk.fraunhofer.de http://mats.imk.fraunhofer.de/mailman/listinfo/pykde --EeQfGwPcQSOJBaQU--