wesnoth/utils/wmlxgettext

120 lines
2.8 KiB
Perl
Executable File

#!/usr/bin/perl -w
# FIXME:
# - maybe restrict "ability" matching to unit defs (not yet necessary)
# - maybe handle some xgettext flags and behaviours to be more
# predictable to the command-line user
use strict;
use File::Basename;
use POSIX qw(strftime);
use Getopt::Long;
our $toplevel = '.';
GetOptions ('directory=s' => \$toplevel);
our $module = dirname ($0) . "/wmltrans.pm";
eval "require \"$module\";";
our ($str,$translatable,$line,%messages);
chdir $toplevel;
foreach my $file (@ARGV) {
open (FILE, "<$file") or die "cannot read from $file";
my $readingattack = 0;
LINE: while (<FILE>) {
# skip comments
next LINE if m/^\s*\#/ and !defined $str;
if (m/^(?:[^\"]*?)((?:_\s*)?)\"([^\"]*)\"(.*)$/) {
# single-line quoted string
die "nested string in $file" if defined $str;
push @{$messages{raw2postring($2)}}, "$file:$."
if ($1 ne ''); # ie. translatable
# process remaining of the line
$_ = $3;
redo LINE;
} elsif (!defined $str and m/^(?:[^\"]*?)((?:_\s*)?)\s*\"([^\"]*)/) {
# start of multi-line
$translatable = ($1 ne '');
$_ = $2;
if (m/(.*)\r/) { $_ = $1; }
$str = $_;
$line = $.;
} elsif (m/(.*?)\"(.*)$/) {
# end of multi-line
die "end of string without a start in $file" if !defined $str;
$str .= $1;
push @{$messages{"\"\"\n" . raw2postring($str)}}, "$file:$."
if $translatable;
$str = undef;
# process remaining of the line
$_ = $2;
redo LINE;
} elsif (defined $str) {
# part of multi-line
if (m/(.*)\r/) { $_ = $1; }
$str .= $_;
} elsif (m/(\S+)\s*=\s*(.*?)\s*$/) {
# single-line non-quoted string
die "nested string in $file" if defined $str;
# magic handling of weapon descriptions
push @{$messages{raw2postring($2)}}, "$file:$."
if $readingattack and
($1 eq 'name' or $1 eq 'type' or $1 eq 'special');
# magic handling of unit abilities
push @{$messages{raw2postring($2)}}, "$file:$."
if $1 eq 'ability';
} elsif (m,\[attack\],) {
$readingattack = 1;
} elsif (m,\[/attack\],) {
$readingattack = 0;
}
}
close FILE;
}
## output
my $date = strftime "%F %R%z", localtime();
print <<EOH
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\\n"
"Report-Msgid-Bugs-To: http://bugs.wesnoth.org/\\n"
"POT-Creation-Date: $date\\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\\n"
"Last-Translator: FULL NAME <EMAIL\@ADDRESS>\\n"
"Language-Team: LANGUAGE <LL\@li.org>\\n"
"MIME-Version: 1.0\\n"
"Content-Type: text/plain; charset=UTF-8\\n"
"Content-Transfer-Encoding: 8bit\\n"
EOH
;
foreach my $key (keys %messages) {
print "#:";
foreach my $line (@{$messages{$key}}) {
print " $line";
}
print "\nmsgid $key",
"msgstr \"\"\n\n";
}