X-Git-Url: https://sipb.mit.edu/gitweb.cgi/ikiwiki.git/blobdiff_plain/e04692e059c41e5616ead2f198ed498ec3a2f290..0c032b0ccb3766c422980a0e956dacbe44cfa021:/IkiWiki/Plugin/po.pm diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm index 5d2d42d3b..88d021388 100644 --- a/IkiWiki/Plugin/po.pm +++ b/IkiWiki/Plugin/po.pm @@ -10,7 +10,12 @@ use warnings; use strict; use IkiWiki 3.00; use Encode; -use Locale::Po4a::Common qw(nowrapi18n !/.*/); +eval q{use Locale::Po4a::Common qw(nowrapi18n !/.*/)}; +if ($@) { + print STDERR gettext("warning: Old po4a detected! Recommend upgrade to 0.35.")."\n"; + eval q{use Locale::Po4a::Common qw(!/.*/)}; + die $@ if $@; +} use Locale::Po4a::Chooser; use Locale::Po4a::Po; use File::Basename; @@ -94,7 +99,7 @@ sub getsetup () { type => "string", example => { 'fr' => 'Français', - 'es' => 'Castellano', + 'es' => 'Español', 'de' => 'Deutsch' }, description => "slave languages (PO files)", @@ -103,7 +108,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, @@ -151,11 +156,22 @@ sub checkconfig () { push @{$config{wiki_file_prune_regexps}}, qr/\.pot$/; - if ($config{po_master_language}{code} ne 'en') { - # use translated underlay directories in preference - # to the untranslated ones - foreach my $underlay ('basewiki', reverse @{$config{underlaydirs}}) { - add_underlay("locale/".$config{po_master_language}{code}."/".$underlay); + # 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\//; + + # Underlays containing the po files for slave languages. + foreach my $ll (keys %{$config{po_slave_languages}}) { + add_underlay("po/$ll/$underlay") + if -d "$config{underlaydirbase}/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"); } } } @@ -268,17 +284,16 @@ sub pagetemplate (@) { map add_depends($page, $_), (values %{otherlanguages($page)}); } if ($config{discussion} && istranslation($page)) { - my $discussionlink=gettext("discussion"); - if ($page !~ /.*\/\Q$discussionlink\E$/i && + if ($page !~ /.*\/\Q$config{discussionpage}\E$/i && (length $config{cgiurl} || - exists $links{$masterpage."/".$discussionlink})) { + exists $links{$masterpage."/".lc($config{discussionpage})})) { $template->param('discussionlink' => htmllink( $page, $destpage, - $masterpage . '/' . gettext("Discussion"), + $masterpage . '/' . $config{discussionpage}, noimageinline => 1, forcesubpage => 0, - linktext => gettext("Discussion"), + linktext => $config{discussionpage}, )); } } @@ -365,11 +380,11 @@ sub change (@) { && exists $config{meta_overrides_page_title} && defined $config{meta_overrides_page_title} && $config{meta_overrides_page_title}) { - debug(sprintf(gettext("re-rendering all pages to fix meta titles"))); + debug(sprintf(gettext("rebuilding all pages to fix meta titles"))); resetalreadyfiltered(); require IkiWiki::Render; foreach my $file (@rendered) { - debug(sprintf(gettext("rendering %s"), $file)); + debug(sprintf(gettext("building %s"), $file)); IkiWiki::render($file); } } @@ -377,25 +392,29 @@ 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}; + map { s/^\Q$config{srcdir}\E\/*//; IkiWiki::rcs_add($_) } @pofiles if $config{rcs}; $updated_po_files=1; } } @@ -426,8 +445,8 @@ sub canremove (@) { my %params = @_; if (istranslation($params{page})) { - return gettext("Can not remove a translation. Removing the master page, ". - "though, removes its translations as well."); + return gettext("Can not remove a translation. If the master page is removed, ". + "however, its translations will be removed as well."); } return undef; } @@ -446,8 +465,8 @@ sub canrename (@) { # saved early in the renaming process. my $orig_torename = $session->param("po_orig_torename"); unless (grep { $_ eq $masterpage } @{$orig_torename}) { - return gettext("Can not rename a translation. Renaming the master page, ". - "though, renames its translations as well."); + return gettext("Can not rename a translation. If the master page is renamed, ". + "however, its translations will be renamed as well."); } } return undef; @@ -528,6 +547,9 @@ sub mybestlink ($$) { my $page=shift; my $link=shift; + return $origsubs{'bestlink'}->($page, $link) + if $config{po_link_to} eq "default"; + my $res=$origsubs{'bestlink'}->(masterpage($page), $link); if (length $res && ($config{po_link_to} eq "current" || $config{po_link_to} eq "negotiated") @@ -583,17 +605,21 @@ sub myurlto ($$;$) { # so that one is redirected to the just-edited page rather than to the # negociated translation; to prevent unnecessary fiddling with caller/inject, # we only do so when our beautify_urlpath would actually do what we want to - # avoid, i.e. when po_link_to = negotiated + # avoid, i.e. when po_link_to = negotiated. + # also avoid doing so when run by cgi_goto, so that the links on recentchanges + # page actually lead to the exact page they pretend to. if ($config{po_link_to} eq "negotiated") { my @caller = caller(1); - my $run_by_editpage = 0; - $run_by_editpage = 1 if (exists $caller[3] && defined $caller[3] - && $caller[3] eq "IkiWiki::cgi_editpage"); + my $use_orig = 0; + $use_orig = 1 if (exists $caller[3] && defined $caller[3] + && ($caller[3] eq "IkiWiki::cgi_editpage" || + $caller[3] eq "IkiWiki::Plugin::goto::cgi_goto") + ); inject(name => "IkiWiki::beautify_urlpath", call => $origsubs{'beautify_urlpath'}) - if $run_by_editpage; + if $use_orig; my $res = $origsubs{'urlto'}->($to,$from,$absolute); inject(name => "IkiWiki::beautify_urlpath", call => \&mybeautify_urlpath) - if $run_by_editpage; + if $use_orig; return $res; } else { @@ -666,7 +692,6 @@ sub istranslatablefile ($) { 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; } @@ -813,8 +838,23 @@ sub refreshpofiles ($@) { foreach my $pofile (@pofiles) { IkiWiki::prep_writefile(basename($pofile),dirname($pofile)); + + if (! -e $pofile) { + # If the po file exists in an underlay, copy it + # from there. + my ($pobase)=$pofile=~/^\Q$config{srcdir}\E\/?(.*)$/; + foreach my $dir (@{$config{underlaydirs}}) { + if (-e "$dir/$pobase") { + File::Copy::syscopy("$dir/$pobase",$pofile) + or error("po(refreshpofiles) ". + sprintf(gettext("failed to copy underlay PO file to %s"), + $pofile)); + } + } + } + if (-e $pofile) { - system("msgmerge", "-q", "-U", "--backup=none", $pofile, $potfile) == 0 + system("msgmerge", "--previous", "-q", "-U", "--backup=none", $pofile, $potfile) == 0 or error("po(refreshpofiles) ". sprintf(gettext("failed to update %s"), $pofile)); @@ -901,7 +941,7 @@ sub otherlanguagesloop ($) { master => 1, }; } - else { + elsif (istranslation($otherpage)) { push @ret, { url => urlto_with_orig_beautiful_urlpath($otherpage, $page), code => $lang, @@ -1076,8 +1116,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")); } # ,----