#! /usr/bin/perl # This file is a modified version of extractrc, with the only addition that it Title|Description in the textstring regexp. # # 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. $filename = ""; @filenames = (); sub writeoutstring($) { print STDOUT "i18n(\"@_[0]\"); // $filename \n"; } while (defined ($ARGV[0])) { $_ = shift; $filename = $_; # maybe check for 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]|[tT]itle|[dD]escription|string|whatsthis|tooltip)>'; # The 'database' property contains strings that shouldn't be translated if ($inskippedprop == 0 && ($string =~ /<property name=\"database\"/)) { $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/\"/\\\"/g; writeoutstring($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; } }