X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/cd03bd0b804cf4919a5d195c53bcea1f9730a51f..d98296d1db02febfa7cc4fbe7f304ca2a9858fef:/IkiWiki/Plugin/po.pm?ds=sidebyside

diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm
index 4e6eff94f..0af47aad5 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");
@@ -64,6 +65,8 @@ sub import {
 		inject(name => "IkiWiki::cgiurl", call => \&mycgiurl);
 		$origsubs{'rootpage'}=\&IkiWiki::rootpage;
 		inject(name => "IkiWiki::rootpage", call => \&myrootpage);
+		$origsubs{'isselflink'}=\&IkiWiki::isselflink;
+		inject(name => "IkiWiki::isselflink", call => \&myisselflink);
 	}
 }
 
@@ -102,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,
@@ -135,12 +138,33 @@ 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 {
 		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}) {
@@ -169,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";
 		}
@@ -195,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)};
 	}
 }
 
@@ -227,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)};
 			}
 		}
 	}
@@ -285,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 &&
@@ -338,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,
 		};
@@ -591,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;
 }
@@ -675,6 +699,17 @@ sub myrootpage (@) {
 	return $rootpage;
 }
 
+sub myisselflink ($$) {
+	my $page=shift;
+	my $link=shift;
+
+	return 1 if $origsubs{'isselflink'}->($page, $link);
+	if (istranslation($page)) {
+		return $origsubs{'isselflink'}->(masterpage($page), $link);
+        }
+	return;
+}
+
 # ,----
 # | Blackboxes for private data
 # `----
@@ -799,7 +834,7 @@ sub islanguagecode ($) {
 	return $code =~ /^[a-z]{2}$/;
 }
 
-sub otherlanguage ($$) {
+sub otherlanguage_page ($$) {
 	my $page=shift;
 	my $code=shift;
 
@@ -807,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}}) {
+		($config{po_master_language}{code}, @slavelanguages) {
 		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;
 }
 
@@ -841,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 ($) {
@@ -968,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 (;$) {
@@ -1004,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;
 }
 
@@ -1019,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}) {
@@ -1249,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 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");
 	}
 }