diff options
Diffstat (limited to 'kommander/working/extractkmdr')
-rwxr-xr-x | kommander/working/extractkmdr | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/kommander/working/extractkmdr b/kommander/working/extractkmdr new file mode 100755 index 00000000..ea1da6ff --- /dev/null +++ b/kommander/working/extractkmdr @@ -0,0 +1,112 @@ +#! /usr/bin/perl +# +# This script extracts messages from designer (.ui) and XMLGIU (.rc) files +# and writes on standard output (usually redirected to rc.cpp) +# the equivalent i18n() calls so that xgettext can parse them. + +# known flags: +# --tag=name : extract also the tag name +# --contect=name : give all i18n calls a context name: i18n( "name",...) + +$filename = ""; +@filenames = (); + +sub writeoutstring +{ + print STDOUT "i18n(\""; + if (@_[0]) + { + # We have a I18N context + print STDOUT @_[0]; + print STDOUT "\",\""; + } + print STDOUT @_[1]; + print STDOUT "\"); // $filename \n"; +} + +$extratags = ""; +$context = ""; # I18N context + +ARGUMENTS: while (defined ($ARGV[0])) +{ + $_ = shift; + + if (/^--tag=(\w+)/) # --tag=name + { + $extratags .= "|" . $1; + next ARGUMENTS; + } + elsif (/^--context=(\w+)/) # --context=name + { + $context = $1; + next ARGUMENTS; + } + + $filename = $_; # maybe check for more options + +if (! $filename) { + print STDERR "no file to open\n"; + exit 1; +} + +$string = ""; +$intext = 0; +$linenr = 0; +$inskippedprop = 0; + +open(FILE, $filename); + +READING: while ( <FILE> ) { + $linenr++; + if ($linenr == 1 && ($_ !~ /^<!DOCTYPE/) && ($_ !~ /^<\?xml/)) { + last READING; + } + + $string .= "\\n" . $_; + chomp($string); + + $textstring = '([tT][eE][xX][tT]|title|string|whatsthis|tooltip|label' . $extratags .')>'; + + # The 'database' property contains strings that shouldn't be translated + if ($inskippedprop == 0 && ($string =~ /<property name=\"database\"/ || $string =~ /<property name=\"populationText\"/ || $string=~ /<property name=\"associations\"/)) { + $inskippedprop = 1; + } elsif ($inskippedprop == 1 && ($string =~ /<\/property/)) { + $inskippedprop = 0; + $string = ""; + } + + if ($inskippedprop == 0 && $intext == 0) { + if ($string =~ /<$textstring/) { + $string =~ s/^.*<$textstring//; + $intext = 1; + $starting_linenr = $linenr; + } else { + $string = ""; + } + } + + if (($intext == 1) && ($string =~ /<\/$textstring/)) { + my $text = $string; + $text =~ s/<\/$textstring.*$//; + $text =~ s/</</g; + $text =~ s/>/>/g; + $text =~ s/&/&/g; + $text =~ s/\\([^n])/\\\\$1/g; + $text =~ s/\"/\\\"/g; + writeoutstring($context, $text); + $string =~ s/^.*<\/$textstring//; + $intext = 0; + # Text can be multiline in .ui files (possibly), but we warn about it in XMLGUI .rc files. + if ($linenr != $starting_linenr && $filename =~ m/\.rc$/) { + print STDERR "there is <text> floating $filename\n"; + } + } + +} + +if ($intext == 1) { + print STDERR "parsing error in $filename $linenr\n"; + exit 1; +} + +} |