summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--IkiWiki/Plugin/po.pm105
-rw-r--r--doc/plugins/po.mdwn8
2 files changed, 72 insertions, 41 deletions
diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm
index 224412676..1f3ff252e 100644
--- a/IkiWiki/Plugin/po.pm
+++ b/IkiWiki/Plugin/po.pm
@@ -28,6 +28,7 @@ use UNIVERSAL;
my %translations;
my @origneedsbuild;
my %origsubs;
+my @slavelanguages; # languages codes ordered as in config po_slave_languages
memoize("istranslatable");
memoize("_istranslation");
@@ -104,11 +105,11 @@ sub getsetup () {
},
po_slave_languages => {
type => "string",
- example => {
- 'fr' => 'Français',
- 'es' => 'Español',
- 'de' => 'Deutsch'
- },
+ example => [
+ 'fr|Français',
+ 'es|Español',
+ 'de|Deutsch'
+ ],
description => "slave languages (PO files)",
safe => 1,
rebuild => 1,
@@ -137,6 +138,27 @@ sub checkconfig () {
$field, 'po'));
}
}
+
+ if (ref $config{po_slave_languages} eq 'ARRAY') {
+ my %slaves;
+ 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;
+ }
+ 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 {
@@ -197,7 +219,7 @@ sub needsbuild () {
# make existing translations depend on the corresponding master page
foreach my $master (keys %translations) {
- map add_depends($_, $master), values %{otherlanguages($master)};
+ map add_depends($_, $master), values %{otherlanguages_pages($master)};
}
}
@@ -229,7 +251,7 @@ sub scan (@) {
# make sure any destpage's translations has
# $page in its backlinks
push @{$links{$page}},
- values %{otherlanguages($destpage)};
+ values %{otherlanguages_pages($destpage)};
}
}
}
@@ -287,7 +309,7 @@ sub pagetemplate (@) {
}
if ($template->query(name => "otherlanguages")) {
$template->param(otherlanguages => [otherlanguagesloop($page)]);
- map add_depends($page, $_), (values %{otherlanguages($page)});
+ map add_depends($page, $_), (values %{otherlanguages_pages($page)});
}
if ($config{discussion} && istranslation($page)) {
if ($page !~ /.*\/\Q$config{discussionpage}\E$/i &&
@@ -340,12 +362,12 @@ sub renamepages (@) {
return () unless istranslatable($torename{src});
my @ret;
- my %otherpages=%{otherlanguages($torename{src})};
+ my %otherpages=%{otherlanguages_pages($torename{src})};
while (my ($lang, $otherpage) = each %otherpages) {
push @ret, {
src => $otherpage,
srcfile => $pagesources{$otherpage},
- dest => otherlanguage($torename{dest}, $lang),
+ dest => otherlanguage_page($torename{dest}, $lang),
destfile => $torename{dest}.".".$lang.".po",
required => 0,
};
@@ -812,7 +834,7 @@ sub islanguagecode ($) {
return $code =~ /^[a-z]{2}$/;
}
-sub otherlanguage ($$) {
+sub otherlanguage_page ($$) {
my $page=shift;
my $code=shift;
@@ -820,17 +842,31 @@ sub otherlanguage ($$) {
return masterpage($page) . '.' . $code;
}
-sub otherlanguages ($) {
+# 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 ($) {
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}, keys %{$config{po_slave_languages}}) {
next if $lang eq $curlang;
- $ret{$lang}=otherlanguage($page, $lang);
+ push @ret, $lang;
}
+ return \@ret;
+}
+
+sub otherlanguages_pages ($) {
+ my $page=shift;
+
+ my %ret;
+ map {
+ $ret{$_} = otherlanguage_page($page, $_)
+ } @{otherlanguages_codes($page)};
+
return \%ret;
}
@@ -981,30 +1017,25 @@ sub otherlanguagesloop ($) {
my $page=shift;
my @ret;
- 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),
- }
+ 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),
}
}
- 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;
+ return @ret;
}
sub homepageurl (;$) {
diff --git a/doc/plugins/po.mdwn b/doc/plugins/po.mdwn
index fc7d1d502..ddaba86f0 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',
- 'es' => 'Español',
- 'de' => 'Deutsch',
- }
+ po_slave_languages => [ 'fr|Français',
+ 'es|Español',
+ 'de|Deutsch',
+ ]
Decide which pages are translatable
-----------------------------------