summaryrefslogtreecommitdiffstats
path: root/bin/findtr
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@nokia.com>2009-03-23 09:34:13 (GMT)
committerSimon Hausmann <simon.hausmann@nokia.com>2009-03-23 09:34:13 (GMT)
commit67ad0519fd165acee4a4d2a94fa502e9e4847bd0 (patch)
tree1dbf50b3dff8d5ca7e9344733968c72704eb15ff /bin/findtr
downloadQt-67ad0519fd165acee4a4d2a94fa502e9e4847bd0.zip
Qt-67ad0519fd165acee4a4d2a94fa502e9e4847bd0.tar.gz
Qt-67ad0519fd165acee4a4d2a94fa502e9e4847bd0.tar.bz2
Long live Qt!
Diffstat (limited to 'bin/findtr')
-rwxr-xr-xbin/findtr189
1 files changed, 189 insertions, 0 deletions
diff --git a/bin/findtr b/bin/findtr
new file mode 100755
index 0000000..7df3325
--- /dev/null
+++ b/bin/findtr
@@ -0,0 +1,189 @@
+#!/usr/bin/perl -w
+# vi:wrap:
+
+# See Qt I18N documentation for usage information.
+
+use POSIX qw(strftime);
+
+$projectid='PROJECT VERSION';
+$datetime = strftime "%Y-%m-%d %X %Z", localtime;
+$charset='iso-8859-1';
+$translator='FULLNAME <EMAIL@ADDRESS>';
+$revision_date='YYYY-MM-DD';
+
+$real_mark = "tr";
+$noop_mark = "QT_TR_NOOP";
+$scoped_mark = "qApp->translate";
+$noop_scoped_mark = "QT_TRANSLATE_NOOP";
+
+$header=
+'# This is a Qt message file in .po format. Each msgid starts with
+# a scope. This scope should *NOT* be translated - eg. translating
+# from French to English, "Foo::Bar" would be translated to "Pub",
+# not "Foo::Pub".
+msgid ""
+msgstr ""
+"Project-Id-Version: '.$projectid.'\n"
+"POT-Creation-Date: '.$datetime.'\n"
+"PO-Revision-Date: '.$revision_date.'\n"
+"Last-Translator: '.$translator.'\n"
+"Content-Type: text/plain; charset='.$charset.'\n"
+
+';
+
+
+
+
+$scope = "";
+
+if ( $#ARGV < 0 ) {
+ print STDERR "Usage: findtr sourcefile ... >project.po\n";
+ exit 1;
+}
+
+
+sub outmsg {
+ my ($file, $line, $scope, $msgid) = @_;
+ # unesc
+ $msgid =~ s/$esc:$esc:$esc/::/gs;
+ $msgid =~ s|$esc/$esc/$esc|//|gs;
+
+ # Remove blank lines
+ $msgid =~ s/\n\n+/\n/gs;
+ $msgid = "\"\"\n$msgid" if $msgid =~ /\n/s;
+ print "#: $file:$line\n";
+ $msgid =~ s/^"//; #"emacs bug
+ print "msgid \"${scope}::$msgid\n";
+ #print "msgstr \"$msgid\n";
+ print "msgstr \"\"\n";
+ print "\n";
+}
+
+sub justlines {
+ my $l = @_;
+ $l =~ tr|\n||dc;
+ return $l;
+}
+
+print $header;
+
+
+foreach $file ( @ARGV ) {
+ next unless open( I, "< $file" );
+
+ $source = join( "", <I> );
+
+ # Find esc. Avoid bad case 1/// -> 1/1/1/1 -> ///1
+ $esc = 1;
+ while ( $source =~ m!(?:$esc/$esc/$esc)|(?:$esc///)
+ |(?:$esc:$esc:$esc)|(?:$esc:\:\:)! ) {
+ $esc++;
+ }
+
+ # Hide quoted :: in practically all strings
+ $source =~ s/\"([^"\n]*)::([^"\n]*)\"/\"$1$esc:$esc:$esc$2\"/g;
+
+ # Hide quoted // in practically all strings
+ $source =~ s|\"([^"\n]*)//([^"\n]*)\"|\"$1$esc/$esc/$esc$2\"|g;
+
+
+ # strip comments -- does not handle "/*" in strings
+ while( $source =~ s|/\*(.*?)\*/|justlines($1)|ges ) { }
+ while( $source =~ s|//(.*?)\n|\n|g ) { }
+
+ while( $source =~ /
+ (?:
+ # Some doublequotes are "escaped" to help vim syntax highlight
+
+ # $1 = scope; $2 = parameters etc.
+ (?:
+ # Scoped function name ($1 is scope).
+ (\w+)::(?:\w+)
+ \s*
+ # Parameters etc up to open-curly - no semicolons
+ \(([^();]*)\)
+ \s*
+ (?:\{|:)
+ )
+ |
+ # $3 - one-argument msgid
+ (?:\b
+ # One of the marks
+ (?:$real_mark|$noop_mark)
+ \s*
+ # The parameter
+ \(\s*((?:"(?:[^"]|[^\\]\\")*"\s*)+)\)
+ )
+ |
+ # $4,$5 - two-argument msgid
+ (?:\b
+ # One of the scoped marks
+ (?:$scoped_mark|$noop_scoped_mark)
+ \s*
+ # The parameters
+ \(
+ # The scope parameter
+ \s*"([^\"]*)"
+ \s*,\s*
+ # The msgid parameter
+ \s*((?:\"(?:[^"]|[^\\]\\")*"\s*)+) #"emacs
+ \)
+ )
+ |
+ # $6,$7 - scoped one-argument msgid
+ (?:\b
+ # The scope
+ (\w+)::
+ # One of the marks
+ (?:$real_mark)
+ \s*
+ # The parameter
+ \(\s*((?:"(?:[^"]|[^\\]\\")*"\s*)+)\)
+ )
+ )/gsx )
+ {
+ @lines = split /^/m, "$`";
+ $line = @lines;
+ if ( defined( $1 ) ) {
+ if ( $scope ne $1 ) {
+ $sc=$1;
+ $etc=$2;
+ # remove strings
+ $etc =~ s/"(?:[^"]|[^\\]\\")"//g;
+ # count ( and )
+ @open = split /\(/m, $etc;
+ @close = split /\)/m, $etc;
+ if ( $#open == $#close ) {
+ $scope = $sc;
+ }
+ }
+ next;
+ }
+
+ if ( defined( $3 ) ) {
+ $this_scope = $scope;
+ $msgid = $3;
+ } elsif ( defined( $4 ) ) {
+ $this_scope = $4;
+ $msgid = $5;
+ } elsif ( defined( $6 ) ) {
+ $this_scope = $6;
+ $msgid = $7;
+ } else {
+ next;
+ }
+
+ $msgid =~ s/^\s*//;
+ $msgid =~ s/\s*$//;
+
+ # Might still be non-unique eg. tr("A" "B") vs. tr("A" "B").
+
+ $location{"${this_scope}::${msgid}"} = "$file:$line";
+ }
+}
+
+for $scoped_msgid ( sort keys %location ) {
+ ($scope,$msgid) = $scoped_msgid =~ m/([^:]*)::(.*)/s;
+ ($file,$line) = $location{$scoped_msgid} =~ m/([^:]*):(.*)/s;
+ outmsg($file,$line,$scope,$msgid);
+}