#!/usr/bin/perl
-@ARGV >= 1 || die "Usage: $0 <po directory> [<file pattern>]\n";
+@ARGV <= 2 || die "Usage: $0 [<po directory>] [<file pattern>]\n";
my $source = shift @ARGV;
my $pattern = shift @ARGV || '*.po';
-sub fixup_header_order
+sub read_header
{
my $file = shift || return;
local $/;
my $data = readline P;
close P;
- $data =~ s/("Language-Team: .*?\\n"\n)(.+?)("Language: .*?\\n"\n)/$1$3$2/s;
+ $data =~ /
+ ^ (
+ msgid \s "" \n
+ msgstr \s "" \n
+ (?: " [^\n]+ " \n )+
+ \n )
+ /mx;
+
+ return $1;
+}
+
+sub write_header
+{
+ my $file = shift || return;
+ my $head = shift || return;
+ local $/;
+
+ open P, "< $file" || die "open(): $!";
+ my $data = readline P;
+ close P;
+
+ $data =~ s/
+ ^ (
+ msgid \s "" \n
+ msgstr \s "" \n
+ (?: " [^\n]+ " \n )+
+ \n )
+ /$head/mx;
open P, "> $file" || die "open(): $!";
print P $data;
close P;
}
-if( open F, "find $source -type f -name '$pattern' |" )
+my @dirs;
+
+if( ! $source )
{
- while( chomp( my $file = readline F ) )
+ @dirs = glob("./*/*/po/");
+}
+else
+{
+ @dirs = ( $source );
+}
+
+foreach my $dir (@dirs)
+{
+ if( open F, "find $dir -type f -name '$pattern' |" )
{
- my ( $basename ) = $file =~ m{.+/([^/]+)\.po$};
-
- if( -f "$source/templates/$basename.pot" )
+ while( chomp( my $file = readline F ) )
{
- printf "Updating %-40s", $file;
- system("msgmerge", "-U", "-N", $file, "$source/templates/$basename.pot");
- fixup_header_order($file);
+ my ( $basename ) = $file =~ m{.+/([^/]+)\.po$};
+
+ if( -f "$dir/templates/$basename.pot" )
+ {
+ my $head = read_header($file);
+
+ printf "Updating %-40s", $file;
+ system("msgmerge", "-U", "-N", $file, "$dir/templates/$basename.pot");
+
+ write_header($file, $head);
+ }
}
- }
- close F;
+ close F;
+ }
}