use Encode;
use Locale::Po4a::Chooser;
use File::Temp;
+use Memoize;
+
+my %translations;
+memoize("istranslatable");
+memoize("_istranslation");
sub import {
hook(type => "getsetup", id => "po", call => \&getsetup);
},
po_slave_languages => {
type => "string",
- example => {'fr' => { 'name' => 'Français' },
- 'es' => { 'name' => 'Castellano' },
- 'de' => { 'name' => 'Deutsch' },
+ example => {
+ 'fr' => 'Français',
+ 'es' => 'Castellano',
+ 'de' => 'Deutsch'
},
description => "slave languages (PO files)",
safe => 1,
if ($config{po_link_to} eq "negotiated" && ! $config{usedirs}) {
error(gettext("po_link_to=negotiated requires usedirs to be set"));
}
+ push @{$config{wiki_file_prune_regexps}}, qr/\.pot$/;
} #}}}
sub scan (@) { #{{{
my %params=@_;
my $page=$params{page};
-
- # FIXME: cache (or memoize) the list of translatable/translation pages,
- # and/or istranslation/istranslated results
+ # let's build %translations, using istranslation's
+ # side-effect, so that we can consider it is complete at
+ # preprocess time
+ istranslation($page);
} #}}}
sub targetpage (@) { #{{{
return $link;
} #}}}
+our %filtered;
# We use filter to convert PO to the master page's type,
# since other plugins should not work on PO files
sub filter (@) { #{{{
my %params = @_;
my $page = $params{page};
+ 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
- if (! istranslation($page)) {
+ if (! istranslation($page) || $filtered{$page}{$destpage}) {
return $content;
}
my $tmpout = $tmpfh->filename;
$doc->write($tmpout) or error("[po/filter:$file] could not write $tmpout");
$content = readfile($tmpout) or error("[po/filter:$file] could not read $tmpout");
+ $filtered{$page}{$destpage}=1;
return $content;
} #}}}
return pagespec_match($page, $config{po_translatable_pages});
} #}}}
-sub istranslation ($) { #{{{
+sub _istranslation ($) { #{{{
my $page=shift;
my $file=$pagesources{$page};
if (! defined $file) {
return istranslatable($masterpage);
} #}}}
+sub istranslation ($) { #{{{
+ my $page=shift;
+ if (_istranslation($page)) {
+ my ($masterpage, $lang) = ($page =~ /(.*)[.]([a-z]{2})$/);
+ $translations{$masterpage}{$lang}=$page unless exists $translations{$masterpage}{$lang};
+ return 1;
+ }
+ return 0;
+} #}}}
package IkiWiki::PageSpec;
use warnings;
sub match_istranslation ($;@) { #{{{
my $page=shift;
- if (IkiWiki::Plugins::po::istranslation($page)) {
+ if (IkiWiki::Plugin::po::istranslation($page)) {
return IkiWiki::SuccessReason->new("is a translation page");
}
else {
sub match_istranslatable ($;@) { #{{{
my $page=shift;
- if (IkiWiki::Plugins::po::istranslatable($page)) {
+ if (IkiWiki::Plugin::po::istranslatable($page)) {
return IkiWiki::SuccessReason->new("is set as translatable in po_translatable_pages");
}
else {