po: optimization
[ikiwiki.git] / IkiWiki / Plugin / po.pm
index 29945da335a3cfc653591347ec8ca9bea869ba10..0af47aad5be0fda0b5463f33a181a2510ac6abe2 100644 (file)
@@ -28,7 +28,7 @@ use UNIVERSAL;
 my %translations;
 my @origneedsbuild;
 my %origsubs;
-my @slavelanguages; # orderer as in config po_slave_languages
+my @slavelanguages; # languages codes ordered as in config po_slave_languages
 
 memoize("istranslatable");
 memoize("_istranslation");
@@ -106,10 +106,10 @@ sub getsetup () {
                po_slave_languages => {
                        type => "string",
                        example => [
-                               'fr' => 'Français',
-                               'es' => 'Español',
-                               'de' => 'Deutsch'
-                       ],
+                               'fr|Français',
+                               'es|Español',
+                               'de|Deutsch'
+                            ],
                        description => "slave languages (PO files)",
                        safe => 1,
                        rebuild => 1,
@@ -141,9 +141,15 @@ sub checkconfig () {
 
        if (ref $config{po_slave_languages} eq 'ARRAY') {
                my %slaves;
-               for (my $i=0; $i<@{$config{po_slave_languages}}; $i = $i + 2) {
-                       $slaves{$config{po_slave_languages}->[$i]} = $config{po_slave_languages}->[$i + 1];
-                       push @slavelanguages, $config{po_slave_languages}->[$i];
+               foreach my $pair (@{$config{po_slave_languages}}) {
+                       my ($code, $name) = ( $pair =~ /^([a-z]{2})\|(.+)$/ );
+                       if (!defined $code || !defined $name) {
+                               error(sprintf(gettext("%s has invalid syntax: must use CODE|NAME"),
+                                             $pair));
+                        }
+                       $slaves{$code} = $name;
+                       push @slavelanguages, $code;
+
                 }
                $config{po_slave_languages} = \%slaves;
         }
@@ -158,7 +164,7 @@ sub checkconfig () {
        map {
                islanguagecode($_)
                        or error(sprintf(gettext("%s is not a valid language code"), $_));
-       } ($config{po_master_language}{code}, keys %{$config{po_slave_languages}});
+       } ($config{po_master_language}{code}, @slavelanguages);
 
        if (! exists $config{po_translatable_pages} ||
            ! defined $config{po_translatable_pages}) {
@@ -187,7 +193,7 @@ sub checkconfig () {
                next if $underlay=~/^locale\//;
 
                # Underlays containing the po files for slave languages.
-               foreach my $ll (keys %{$config{po_slave_languages}}) {
+               foreach my $ll (@slavelanguages) {
                        add_underlay("po/$ll/$underlay")
                                if -d "$config{underlaydirbase}/po/$ll/$underlay";
                }
@@ -259,12 +265,6 @@ sub filter (@) {
        my $page = $params{page};
        my $destpage = $params{destpage};
        my $content = $params{content};
-       my $fullpage = $params{fullpage};
-
-       unless ($fullpage) {
-               return $content;
-       }
-
        if (istranslation($page) && ! alreadyfiltered($page, $destpage)) {
                $content = po_to_markup($page, $content);
                setalreadyfiltered($page, $destpage);
@@ -615,7 +615,7 @@ sub mybeautify_urlpath ($) {
                $res =~ s!/\Qindex.$config{htmlext}\E$!/!;
                map {
                        $res =~ s!/\Qindex.$_.$config{htmlext}\E$!/!;
-               } (keys %{$config{po_slave_languages}});
+               } @slavelanguages;
        }
        return $res;
 }
@@ -890,7 +890,7 @@ sub pofile ($$) {
 sub pofiles ($) {
        my $masterfile=shift;
 
-       return map pofile($masterfile, $_), (keys %{$config{po_slave_languages}});
+       return map pofile($masterfile, $_), @slavelanguages;
 }
 
 sub refreshpot ($) {
@@ -1048,7 +1048,7 @@ sub ishomepage ($) {
        my $page = shift;
 
        return 1 if $page eq 'index';
-       map { return 1 if $page eq 'index.'.$_ } keys %{$config{po_slave_languages}};
+       map { return 1 if $page eq 'index.'.$_ } @slavelanguages;
        return undef;
 }
 
@@ -1063,7 +1063,7 @@ sub deletetranslations ($) {
                if (-e $absfile && ! -l $absfile && ! -d $absfile) {
                        push @todelete, $file;
                }
-       } keys %{$config{po_slave_languages}};
+       } @slavelanguages;
 
        map {
                if ($config{rcs}) {
@@ -1293,16 +1293,29 @@ sub match_currentlang ($$;@) {
 
 sub match_needstranslation ($$;@) {
        my $page=shift;
+       my $wanted=shift;
+
+       if (defined $wanted && $wanted ne "") {
+               if ($wanted !~ /^\d+$/) {
+                       return IkiWiki::FailReason->new("parameter is not an integer");
+               }
+               elsif ($wanted > 100) {
+                       return IkiWiki::FailReason->new("parameter is greater than 100");
+                }
+        }
+        else {
+               $wanted=100;
+        }
 
        my $percenttranslated=IkiWiki::Plugin::po::percenttranslated($page);
        if ($percenttranslated eq 'N/A') {
-               return IkiWiki::FailReason->new("file is not a translation page");
+               return IkiWiki::FailReason->new("file is not a translatable page");
        }
-       elsif ($percenttranslated < 100) {
+       elsif ($percenttranslated < $wanted) {
                return IkiWiki::SuccessReason->new("file has $percenttranslated translated");
         }
        else {
-               return IkiWiki::FailReason->new("file is fully translated");
+               return IkiWiki::FailReason->new("file is translated enough");
        }
 }