]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/blobdiff - IkiWiki/Plugin/po.pm
html
[git.ikiwiki.info.git] / IkiWiki / Plugin / po.pm
index 7d5dfee03f480fc039b66c54a34d5e1a1a7b111b..2244126761a8323a7269786724558ffe56c350b4 100644 (file)
@@ -28,7 +28,6 @@ use UNIVERSAL;
 my %translations;
 my @origneedsbuild;
 my %origsubs;
 my %translations;
 my @origneedsbuild;
 my %origsubs;
-my @slavelanguages; # orderer as in config po_slave_languages
 
 memoize("istranslatable");
 memoize("_istranslation");
 
 memoize("istranslatable");
 memoize("_istranslation");
@@ -105,11 +104,11 @@ sub getsetup () {
                },
                po_slave_languages => {
                        type => "string",
                },
                po_slave_languages => {
                        type => "string",
-                       example => [
+                       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,
                        description => "slave languages (PO files)",
                        safe => 1,
                        rebuild => 1,
@@ -138,21 +137,6 @@ sub checkconfig () {
                                      $field, 'po'));
                }
        }
                                      $field, 'po'));
                }
        }
-
-       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];
-                }
-               $config{po_slave_languages} = \%slaves;
-        }
-       elsif (ref $config{po_slave_languages} eq 'HASH') {
-               @slavelanguages = sort {
-                       $config{po_slave_languages}->{$a} cmp $config{po_slave_languages}->{$b};
-               } keys %{$config{po_slave_languages}};
-        }
-
        delete $config{po_slave_languages}{$config{po_master_language}{code}};;
 
        map {
        delete $config{po_slave_languages}{$config{po_master_language}{code}};;
 
        map {
@@ -213,7 +197,7 @@ sub needsbuild () {
 
        # make existing translations depend on the corresponding master page
        foreach my $master (keys %translations) {
 
        # make existing translations depend on the corresponding master page
        foreach my $master (keys %translations) {
-               map add_depends($_, $master), values %{otherlanguages_pages($master)};
+               map add_depends($_, $master), values %{otherlanguages($master)};
        }
 }
 
        }
 }
 
@@ -245,7 +229,7 @@ sub scan (@) {
                                # make sure any destpage's translations has
                                # $page in its backlinks
                                push @{$links{$page}},
                                # make sure any destpage's translations has
                                # $page in its backlinks
                                push @{$links{$page}},
-                                       values %{otherlanguages_pages($destpage)};
+                                       values %{otherlanguages($destpage)};
                        }
                }
        }
                        }
                }
        }
@@ -259,14 +243,6 @@ sub filter (@) {
        my $page = $params{page};
        my $destpage = $params{destpage};
        my $content = $params{content};
        my $page = $params{page};
        my $destpage = $params{destpage};
        my $content = $params{content};
-
-       my @caller = caller(4);
-       # FIXME: need to whitelist inline as well?
-        unless ($caller[3] eq "IkiWiki::render" ||
-                $caller[3] eq 'IkiWiki::Plugin::sidebar::sidebar_content') {
-               return $content;
-       }
-
        if (istranslation($page) && ! alreadyfiltered($page, $destpage)) {
                $content = po_to_markup($page, $content);
                setalreadyfiltered($page, $destpage);
        if (istranslation($page) && ! alreadyfiltered($page, $destpage)) {
                $content = po_to_markup($page, $content);
                setalreadyfiltered($page, $destpage);
@@ -311,7 +287,7 @@ sub pagetemplate (@) {
        }
        if ($template->query(name => "otherlanguages")) {
                $template->param(otherlanguages => [otherlanguagesloop($page)]);
        }
        if ($template->query(name => "otherlanguages")) {
                $template->param(otherlanguages => [otherlanguagesloop($page)]);
-               map add_depends($page, $_), (values %{otherlanguages_pages($page)});
+               map add_depends($page, $_), (values %{otherlanguages($page)});
        }
        if ($config{discussion} && istranslation($page)) {
                if ($page !~ /.*\/\Q$config{discussionpage}\E$/i &&
        }
        if ($config{discussion} && istranslation($page)) {
                if ($page !~ /.*\/\Q$config{discussionpage}\E$/i &&
@@ -364,12 +340,12 @@ sub renamepages (@) {
        return () unless istranslatable($torename{src});
 
        my @ret;
        return () unless istranslatable($torename{src});
 
        my @ret;
-       my %otherpages=%{otherlanguages_pages($torename{src})};
+       my %otherpages=%{otherlanguages($torename{src})};
        while (my ($lang, $otherpage) = each %otherpages) {
                push @ret, {
                        src => $otherpage,
                        srcfile => $pagesources{$otherpage},
        while (my ($lang, $otherpage) = each %otherpages) {
                push @ret, {
                        src => $otherpage,
                        srcfile => $pagesources{$otherpage},
-                       dest => otherlanguage_page($torename{dest}, $lang),
+                       dest => otherlanguage($torename{dest}, $lang),
                        destfile => $torename{dest}.".".$lang.".po",
                        required => 0,
                };
                        destfile => $torename{dest}.".".$lang.".po",
                        required => 0,
                };
@@ -836,7 +812,7 @@ sub islanguagecode ($) {
        return $code =~ /^[a-z]{2}$/;
 }
 
        return $code =~ /^[a-z]{2}$/;
 }
 
-sub otherlanguage_page ($$) {
+sub otherlanguage ($$) {
        my $page=shift;
        my $code=shift;
 
        my $page=shift;
        my $code=shift;
 
@@ -844,31 +820,17 @@ sub otherlanguage_page ($$) {
        return masterpage($page) . '.' . $code;
 }
 
        return masterpage($page) . '.' . $code;
 }
 
-# Returns the list of other languages codes: the master language comes first,
-# then the codes are ordered the same way as in po_slave_languages, if it is
-# an array, or in the language name lexical order, if it is a hash.
-sub otherlanguages_codes ($) {
+sub otherlanguages ($) {
        my $page=shift;
 
        my $page=shift;
 
-       my @ret;
-       return \@ret unless istranslation($page) || istranslatable($page);
+       my %ret;
+       return \%ret unless istranslation($page) || istranslatable($page);
        my $curlang=lang($page);
        foreach my $lang
        my $curlang=lang($page);
        foreach my $lang
-               ($config{po_master_language}{code}, @slavelanguages) {
+               ($config{po_master_language}{code}, keys %{$config{po_slave_languages}}) {
                next if $lang eq $curlang;
                next if $lang eq $curlang;
-               push @ret, $lang;
+               $ret{$lang}=otherlanguage($page, $lang);
        }
        }
-       return \@ret;
-}
-
-sub otherlanguages_pages ($) {
-       my $page=shift;
-
-        my %ret;
-       map {
-               $ret{$_} = otherlanguage_page($page, $_)
-       } otherlanguages_codes($page);
-
        return \%ret;
 }
 
        return \%ret;
 }
 
@@ -902,15 +864,15 @@ sub refreshpot ($) {
        my $doc=Locale::Po4a::Chooser::new(po4a_type($masterfile),
                                           po4a_options($masterfile));
        $doc->{TT}{utf_mode} = 1;
        my $doc=Locale::Po4a::Chooser::new(po4a_type($masterfile),
                                           po4a_options($masterfile));
        $doc->{TT}{utf_mode} = 1;
-       $doc->{TT}{file_in_charset} = 'utf-8';
-       $doc->{TT}{file_out_charset} = 'utf-8';
+       $doc->{TT}{file_in_charset} = 'UTF-8';
+       $doc->{TT}{file_out_charset} = 'UTF-8';
        $doc->read($masterfile);
        # let's cheat a bit to force porefs option to be passed to
        # Locale::Po4a::Po; this is undocument use of internal
        # Locale::Po4a::TransTractor's data, compulsory since this module
        # prevents us from using the porefs option.
        $doc->{TT}{po_out}=Locale::Po4a::Po->new({ 'porefs' => 'none' });
        $doc->read($masterfile);
        # let's cheat a bit to force porefs option to be passed to
        # Locale::Po4a::Po; this is undocument use of internal
        # Locale::Po4a::TransTractor's data, compulsory since this module
        # prevents us from using the porefs option.
        $doc->{TT}{po_out}=Locale::Po4a::Po->new({ 'porefs' => 'none' });
-       $doc->{TT}{po_out}->set_charset('utf-8');
+       $doc->{TT}{po_out}->set_charset('UTF-8');
        # do the actual work
        $doc->parse;
        IkiWiki::prep_writefile(basename($potfile),dirname($potfile));
        # do the actual work
        $doc->parse;
        IkiWiki::prep_writefile(basename($potfile),dirname($potfile));
@@ -996,8 +958,8 @@ sub percenttranslated ($) {
        $doc->process(
                'po_in_name'    => [ $file ],
                'file_in_name'  => [ $masterfile ],
        $doc->process(
                'po_in_name'    => [ $file ],
                'file_in_name'  => [ $masterfile ],
-               'file_in_charset'  => 'utf-8',
-               'file_out_charset' => 'utf-8',
+               'file_in_charset'  => 'UTF-8',
+               'file_out_charset' => 'UTF-8',
        ) or error("po(percenttranslated) ".
                   sprintf(gettext("failed to translate %s"), $page));
        my ($percent,$hit,$queries) = $doc->stats();
        ) or error("po(percenttranslated) ".
                   sprintf(gettext("failed to translate %s"), $page));
        my ($percent,$hit,$queries) = $doc->stats();
@@ -1019,25 +981,30 @@ sub otherlanguagesloop ($) {
        my $page=shift;
 
        my @ret;
        my $page=shift;
 
        my @ret;
-       if (istranslation($page)) {
-               push @ret, {
-                       url => urlto_with_orig_beautiful_urlpath(masterpage($page), $page),
-                       code => $config{po_master_language}{code},
-                       language => $config{po_master_language}{name},
-                       master => 1,
-               };
-       }
-       foreach my $lang (@{otherlanguages_codes($page)}) {
-               next if $lang eq $config{po_master_language}{code};
-               my $otherpage = otherlanguage_page($page, $lang);
-               push @ret, {
-                       url => urlto_with_orig_beautiful_urlpath($otherpage, $page),
-                       code => $lang,
-                       language => languagename($lang),
-                       percent => percenttranslated($otherpage),
+       my %otherpages=%{otherlanguages($page)};
+       while (my ($lang, $otherpage) = each %otherpages) {
+               if (istranslation($page) && masterpage($page) eq $otherpage) {
+                       push @ret, {
+                               url => urlto_with_orig_beautiful_urlpath($otherpage, $page),
+                               code => $lang,
+                               language => languagename($lang),
+                               master => 1,
+                       };
+               }
+               elsif (istranslation($otherpage)) {
+                       push @ret, {
+                               url => urlto_with_orig_beautiful_urlpath($otherpage, $page),
+                               code => $lang,
+                               language => languagename($lang),
+                               percent => percenttranslated($otherpage),
+                       }
                }
        }
                }
        }
-       return @ret;
+       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;
 }
 
 sub homepageurl (;$) {
 }
 
 sub homepageurl (;$) {
@@ -1143,8 +1110,8 @@ sub po_to_markup ($$) {
        $doc->process(
                'po_in_name'    => [ $infile ],
                'file_in_name'  => [ $masterfile ],
        $doc->process(
                'po_in_name'    => [ $infile ],
                'file_in_name'  => [ $masterfile ],
-               'file_in_charset'  => 'utf-8',
-               'file_out_charset' => 'utf-8',
+               'file_in_charset'  => 'UTF-8',
+               'file_out_charset' => 'UTF-8',
        ) or return $fail->(gettext("failed to translate"));
        $doc->write($outfile)
                or return $fail->(sprintf(gettext("failed to write %s"), $outfile));
        ) or return $fail->(gettext("failed to translate"));
        $doc->write($outfile)
                or return $fail->(sprintf(gettext("failed to write %s"), $outfile));
@@ -1293,4 +1260,32 @@ 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 translatable page");
+       }
+       elsif ($percenttranslated < $wanted) {
+               return IkiWiki::SuccessReason->new("file has $percenttranslated translated");
+        }
+       else {
+               return IkiWiki::FailReason->new("file is translated enough");
+       }
+}
+
 1
 1