X-Git-Url: https://sipb.mit.edu/gitweb.cgi/ikiwiki.git/blobdiff_plain/ec965fc92cd41f597c6e8e88584b9a688407c8c6..cebffa917fa39f45b3a7cff51b93a4e548343db8:/IkiWiki/Plugin/po.pm diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm index cdb9271e4..d65b4288d 100644 --- a/IkiWiki/Plugin/po.pm +++ b/IkiWiki/Plugin/po.pm @@ -10,7 +10,7 @@ use warnings; use strict; use IkiWiki 3.00; use Encode; -use Locale::Po4a::Common qw(nowrapi18n); +use Locale::Po4a::Common qw(nowrapi18n !/.*/); use Locale::Po4a::Chooser; use Locale::Po4a::Po; use File::Basename; @@ -103,7 +103,7 @@ sub getsetup () { }, po_translatable_pages => { type => "pagespec", - example => "!*/Discussion", + example => "* and !*/Discussion", description => "PageSpec controlling which pages are translatable", link => "ikiwiki/PageSpec", safe => 1, @@ -119,20 +119,18 @@ sub getsetup () { } sub checkconfig () { - foreach my $field (qw{po_master_language po_slave_languages}) { + foreach my $field (qw{po_master_language}) { if (! exists $config{$field} || ! defined $config{$field}) { error(sprintf(gettext("Must specify %s when using the %s plugin"), $field, 'po')); } } - if (! (keys %{$config{po_slave_languages}})) { - error(gettext("At least one slave language must be defined ". - "in po_slave_languages when using the po plugin")); - } + map { islanguagecode($_) or error(sprintf(gettext("%s is not a valid language code"), $_)); } ($config{po_master_language}{code}, keys %{$config{po_slave_languages}}); + if (! exists $config{po_translatable_pages} || ! defined $config{po_translatable_pages}) { $config{po_translatable_pages}=""; @@ -150,7 +148,31 @@ sub checkconfig () { warn(gettext('po_link_to=negotiated requires usedirs to be enabled, falling back to po_link_to=default')); $config{po_link_to}='default'; } + push @{$config{wiki_file_prune_regexps}}, qr/\.pot$/; + + # Translated versions of the underlays are added if available. + foreach my $underlay ("basewiki", + map { m/^\Q$config{underlaydirbase}\E\/*(.*)/ } + reverse @{$config{underlaydirs}}) { + next if $underlay=~/^locale\//; + + # Underlay containing pot files. + add_underlay("locale/pot/$underlay") + if -d "$config{underlaydirbase}/locale/pot/$underlay"; + + # Underlays containing the po files for slave languages. + foreach my $ll (keys %{$config{po_slave_languages}}) { + add_underlay("locale/po/$ll/$underlay") + if -d "$config{underlaydirbase}/locale/po/$ll/$underlay"; + } + + if ($config{po_master_language}{code} ne 'en') { + # Add underlay containing translated source files + # for the master language. + add_underlay("locale/$config{po_master_language}{code}/$underlay"); + } + } } sub needsbuild () { @@ -370,22 +392,26 @@ sub change (@) { my $updated_po_files=0; # Refresh/create POT and PO files as needed. + # (But avoid doing so if they are in an underlay directory.) foreach my $file (grep {istranslatablefile($_)} @rendered) { - my $page=pagename($file); my $masterfile=srcfile($file); + my $page=pagename($file); my $updated_pot_file=0; - # Only refresh Pot file if it does not exist, or if + # Only refresh POT file if it does not exist, or if # $pagesources{$page} was changed: don't if only the HTML was # refreshed, e.g. because of a dependency. - if ((grep { $_ eq $pagesources{$page} } @origneedsbuild) - || ! -e potfile($masterfile)) { + if ($masterfile eq "$config{srcdir}/$file" && + ((grep { $_ eq $pagesources{$page} } @origneedsbuild) + || ! -e potfile($masterfile))) { refreshpot($masterfile); $updated_pot_file=1; } my @pofiles; - map { - push @pofiles, $_ if ($updated_pot_file || ! -e $_); - } (pofiles($masterfile)); + foreach my $po (pofiles($masterfile)) { + next if ! $updated_pot_file && ! -e $po; + next if grep { $po=~/\Q$_\E/ } @{$config{underlaydirs}}; + push @pofiles, $po; + } if (@pofiles) { refreshpofiles($masterfile, @pofiles); map { IkiWiki::rcs_add($_) } @pofiles if $config{rcs}; @@ -656,9 +682,9 @@ sub istranslatablefile ($) { my $file=shift; return 0 unless defined $file; - return 0 if defined pagetype($file) && pagetype($file) eq 'po'; + my $type=pagetype($file); + return 0 if ! defined $type || $type eq 'po'; return 0 if $file =~ /\.pot$/; - return 0 unless -e "$config{srcdir}/$file"; # underlay dirs may be read-only return 1 if pagespec_match(pagename($file), $config{po_translatable_pages}); return; } @@ -806,7 +832,7 @@ sub refreshpofiles ($@) { foreach my $pofile (@pofiles) { IkiWiki::prep_writefile(basename($pofile),dirname($pofile)); if (-e $pofile) { - system("msgmerge", "-U", "--backup=none", $pofile, $potfile) == 0 + system("msgmerge", "-q", "-U", "--backup=none", $pofile, $potfile) == 0 or error("po(refreshpofiles) ". sprintf(gettext("failed to update %s"), $pofile)); @@ -903,10 +929,10 @@ sub otherlanguagesloop ($) { } } return sort { - return -1 if $a->{code} eq $config{po_master_language}{code}; - return 1 if $b->{code} eq $config{po_master_language}{code}; - return $a->{language} cmp $b->{language}; - } @ret; + return -1 if $a->{code} eq $config{po_master_language}{code}; + return 1 if $b->{code} eq $config{po_master_language}{code}; + return $a->{language} cmp $b->{language}; + } @ret; } sub homepageurl (;$) { @@ -1068,8 +1094,8 @@ sub isvalidpo ($) { if ($res) { return IkiWiki::SuccessReason->new("valid gettext data"); } - return IkiWiki::FailReason->new("invalid gettext data, go back ". - "to previous page to go on with edit"); + return IkiWiki::FailReason->new(gettext("invalid gettext data, go back ". + "to previous page to continue edit")); } # ,----