diff options
-rw-r--r-- | IkiWiki/Plugin/po.pm | 98 | ||||
-rw-r--r-- | doc/plugins/po.mdwn | 4 |
2 files changed, 37 insertions, 65 deletions
diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm index dc73c73c3..224412676 100644 --- a/IkiWiki/Plugin/po.pm +++ b/IkiWiki/Plugin/po.pm @@ -28,7 +28,6 @@ use UNIVERSAL; my %translations; my @origneedsbuild; my %origsubs; -my @slavelanguages; # ordered as in config po_slave_languages memoize("istranslatable"); memoize("_istranslation"); @@ -105,11 +104,11 @@ sub getsetup () { }, po_slave_languages => { type => "string", - example => [ + example => { 'fr' => 'Français', 'es' => 'Español', 'de' => 'Deutsch' - ], + }, description => "slave languages (PO files)", safe => 1, rebuild => 1, @@ -138,24 +137,6 @@ sub checkconfig () { $field, 'po')); } } - - if (ref $config{po_slave_languages} eq 'ARRAY') { - my %slaves; - if (@{$config{po_slave_languages}} % 2 != 0) { - error(sprintf(gettext("The %s field is invalid."), 'po_slave_languages')); - } - 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 { @@ -216,7 +197,7 @@ sub needsbuild () { # 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)}; } } @@ -248,7 +229,7 @@ sub scan (@) { # make sure any destpage's translations has # $page in its backlinks push @{$links{$page}}, - values %{otherlanguages_pages($destpage)}; + values %{otherlanguages($destpage)}; } } } @@ -306,7 +287,7 @@ sub pagetemplate (@) { } 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 && @@ -359,12 +340,12 @@ sub renamepages (@) { 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}, - dest => otherlanguage_page($torename{dest}, $lang), + dest => otherlanguage($torename{dest}, $lang), destfile => $torename{dest}.".".$lang.".po", required => 0, }; @@ -831,7 +812,7 @@ sub islanguagecode ($) { return $code =~ /^[a-z]{2}$/; } -sub otherlanguage_page ($$) { +sub otherlanguage ($$) { my $page=shift; my $code=shift; @@ -839,31 +820,17 @@ sub otherlanguage_page ($$) { 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 @ret; - return \@ret unless istranslation($page) || istranslatable($page); + my %ret; + return \%ret unless istranslation($page) || istranslatable($page); 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; - 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; } @@ -1014,25 +981,30 @@ sub otherlanguagesloop ($) { 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 (;$) { diff --git a/doc/plugins/po.mdwn b/doc/plugins/po.mdwn index d6f82912c..53327c1da 100644 --- a/doc/plugins/po.mdwn +++ b/doc/plugins/po.mdwn @@ -54,10 +54,10 @@ Supported languages `po_slave_languages` is used to set the list of supported "slave" languages, such as: - po_slave_languages => [ 'fr' => 'Français', + po_slave_languages => { 'fr' => 'Français', 'es' => 'Español', 'de' => 'Deutsch', - ] + } Decide which pages are translatable ----------------------------------- |