X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/502a3433c410369eca4eb36b8fb8be5bc4a34a2d..9b16e7f148c36c61e511bcc787d3192b7bb1c3c5:/IkiWiki/Plugin/po.pm?ds=sidebyside diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm index fa250f3a4..4bac37656 100644 --- a/IkiWiki/Plugin/po.pm +++ b/IkiWiki/Plugin/po.pm @@ -18,30 +18,36 @@ use Memoize; my %translations; our %filtered; -my $origbestlink=\&bestlink; + ## FIXME: makes some test cases cry once every two tries; this may be ## related to the artificial way the testsuite is run, or not. # memoize("istranslatable"); memoize("_istranslation"); memoize("percenttranslated"); -sub import { +# backup references to subs that will be overriden +my %origsubs; +$origsubs{'bestlink'}=\&IkiWiki::bestlink; +$origsubs{'beautify_urlpath'}=\&IkiWiki::beautify_urlpath; +$origsubs{'targetpage'}=\&IkiWiki::targetpage; + +sub import { #{{{ hook(type => "getsetup", id => "po", call => \&getsetup); hook(type => "checkconfig", id => "po", call => \&checkconfig); hook(type => "needsbuild", id => "po", call => \&needsbuild); - hook(type => "targetpage", id => "po", call => \&targetpage); - hook(type => "tweakurlpath", id => "po", call => \&tweakurlpath); hook(type => "filter", id => "po", call => \&filter); hook(type => "htmlize", id => "po", call => \&htmlize); hook(type => "pagetemplate", id => "po", call => \&pagetemplate); inject(name => "IkiWiki::bestlink", call => \&mybestlink); -} + inject(name => "IkiWiki::beautify_urlpath", call => \&mybeautify_urlpath); + inject(name => "IkiWiki::targetpage", call => \&mytargetpage); +} #}}} sub getsetup () { #{{{ return plugin => { safe => 0, - rebuild => 1, # format plugin + rebuild => 1, # format plugin & changes html filenames }, po_master_language => { type => "string", @@ -128,6 +134,7 @@ sub refreshpot ($) { #{{{ # compulsory since this module prevents us from using the porefs option. my %po_options = ('porefs' => 'none'); $doc->{TT}{po_out}=Locale::Po4a::Po->new(\%po_options); + $doc->{TT}{po_out}->set_charset('utf-8'); # do the actual work $doc->parse; $doc->writepo($potfile); @@ -142,8 +149,7 @@ sub refreshpofiles ($@) { #{{{ foreach my $pofile (@pofiles) { if (-e $pofile) { - my $cmd = "msgmerge -U --backup=none $pofile $potfile"; - system ($cmd) == 0 + system("msgmerge", "-U", "--backup=none", $pofile, $potfile) == 0 or error("[po/refreshpofiles:$pofile] failed to update"); } else { @@ -197,8 +203,8 @@ sub needsbuild () { #{{{ IkiWiki::refresh(); IkiWiki::saveindex(); # refresh module's private variables - %filtered=undef; - %translations=undef; + undef %filtered; + undef %translations; foreach my $page (keys %pagesources) { istranslation($page); } @@ -213,14 +219,13 @@ sub needsbuild () { #{{{ } } #}}} -sub targetpage (@) { #{{{ - my %params = @_; - my $page=$params{page}; - my $ext=$params{ext}; +sub mytargetpage ($$) { #{{{ + my $page=shift; + my $ext=shift; if (istranslation($page)) { my ($masterpage, $lang) = ($page =~ /(.*)[.]([a-z]{2})$/); - if (! $config{usedirs} || $page eq 'index') { + if (! $config{usedirs} || $masterpage eq 'index') { return $masterpage . "." . $lang . "." . $ext; } else { @@ -235,22 +240,33 @@ sub targetpage (@) { #{{{ return $page . "/index." . $config{po_master_language}{code} . "." . $ext; } } - return; + return $origsubs{'targetpage'}->($page, $ext); } #}}} -sub tweakurlpath ($) { #{{{ - my %params = @_; - my $url=$params{url}; +sub mybeautify_urlpath ($) { #{{{ + my $url=shift; + my $res=$origsubs{'beautify_urlpath'}->($url); if ($config{po_link_to} eq "negotiated") { - $url =~ s!/index.$config{po_master_language}{code}.$config{htmlext}$!/!; + $res =~ s!/index.$config{po_master_language}{code}.$config{htmlext}$!/!; } - return $url; + return $res; +} #}}} + +sub urlto_with_orig_beautiful_urlpath($$) { #{{{ + my $to=shift; + my $from=shift; + + inject(name => "IkiWiki::beautify_urlpath", call => $origsubs{'beautify_urlpath'}); + my $res=urlto($to, $from); + inject(name => "IkiWiki::beautify_urlpath", call => \&mybeautify_urlpath); + + return $res; } #}}} sub mybestlink ($$) { #{{{ my $page=shift; my $link=shift; - my $res=$origbestlink->($page, $link); + my $res=$origsubs{'bestlink'}->($page, $link); if (length $res) { if ($config{po_link_to} eq "current" && istranslatable($res) @@ -273,8 +289,8 @@ sub filter (@) { #{{{ my $destpage = $params{destpage}; my $content = decode_utf8(encode_utf8($params{content})); - # decide if this is a PO file that should be converted into a translated document, - # and perform various sanity checks + # decide if this is a PO file that should be converted into a + # translated document, and perform various sanity checks if (! istranslation($page) || $filtered{$page}{$destpage}) { return $content; } @@ -354,7 +370,7 @@ sub otherlanguages ($) { #{{{ elsif (istranslation($page)) { my ($masterpage, $curlang) = ($page =~ /(.*)[.]([a-z]{2})$/); push @ret, { - url => urlto($masterpage, $page), + url => urlto_with_orig_beautiful_urlpath($masterpage, $page), code => $config{po_master_language}{code}, language => $config{po_master_language}{name}, master => 1, @@ -374,6 +390,7 @@ sub otherlanguages ($) { #{{{ sub pagetemplate (@) { #{{{ my %params=@_; my $page=$params{page}; + my $destpage=$params{destpage}; my $template=$params{template}; if (istranslation($page) && $template->query(name => "percenttranslated")) { @@ -400,6 +417,24 @@ sub pagetemplate (@) { #{{{ } } } + # Rely on IkiWiki::Render's genpage() to decide wether + # a discussion link should appear on $page; this is not + # totally accurate, though: some broken links may be generated + # when cgiurl is disabled. + # This compromise avoids some code duplication, and will probably + # prevent future breakage when ikiwiki internals change. + # Known limitations are preferred to future random bugs. + if ($template->param('discussionlink') && istranslation($page)) { + my ($masterpage, $lang) = ($page =~ /(.*)[.]([a-z]{2})$/); + $template->param('discussionlink' => htmllink( + $page, + $destpage, + $masterpage . '/' . gettext("Discussion"), + noimageinline => 1, + forcesubpage => 0, + linktext => gettext("Discussion"), + )); + } } # }}} sub istranslatable ($) { #{{{