X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/e04692e059c41e5616ead2f198ed498ec3a2f290..a29507ec26746b59641a41cd4cc97041ba53ecfa:/IkiWiki/Plugin/po.pm?ds=inline

diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm
index 5d2d42d3b..0ae4adcfc 100644
--- a/IkiWiki/Plugin/po.pm
+++ b/IkiWiki/Plugin/po.pm
@@ -103,7 +103,7 @@ sub getsetup () {
 		},
 		po_translatable_pages => {
 			type => "pagespec",
-			example => "!*/Discussion",
+			example => "* and !*/Discussion",
 			description => "PageSpec controlling which pages are translatable",
 			link => "ikiwiki/PageSpec",
 			safe => 1,
@@ -151,11 +151,22 @@ sub checkconfig () {
 
 	push @{$config{wiki_file_prune_regexps}}, qr/\.pot$/;
 
-	if ($config{po_master_language}{code} ne 'en') {
-		# use translated underlay directories in preference
-		# to the untranslated ones
-		foreach my $underlay ('basewiki', reverse @{$config{underlaydirs}}) {
-			add_underlay("locale/".$config{po_master_language}{code}."/".$underlay);
+	# Translated versions of the underlays are added if available.
+	foreach my $underlay ("basewiki",
+	                      map { m/^\Q$config{underlaydirbase}\E\/*(.*)/ }
+	                          reverse @{$config{underlaydirs}}) {
+		next if $underlay=~/^locale\//;
+
+		# Underlays containing the po files for slave languages.
+		foreach my $ll (keys %{$config{po_slave_languages}}) {
+			add_underlay("po/$ll/$underlay")
+				if -d "$config{underlaydirbase}/po/$ll/$underlay";
+		}
+	
+		if ($config{po_master_language}{code} ne 'en') {
+			# Add underlay containing translated source files
+			# for the master language.
+			add_underlay("locale/$config{po_master_language}{code}/$underlay");
 		}
 	}
 }
@@ -365,11 +376,11 @@ sub change (@) {
 	    && exists $config{meta_overrides_page_title}
 	    && defined $config{meta_overrides_page_title}
 	    && $config{meta_overrides_page_title}) {
-		debug(sprintf(gettext("re-rendering all pages to fix meta titles")));
+		debug(sprintf(gettext("rebuilding all pages to fix meta titles")));
 		resetalreadyfiltered();
 		require IkiWiki::Render;
 		foreach my $file (@rendered) {
-			debug(sprintf(gettext("rendering %s"), $file));
+			debug(sprintf(gettext("building %s"), $file));
 			IkiWiki::render($file);
 		}
 	}
@@ -377,22 +388,26 @@ sub change (@) {
 	my $updated_po_files=0;
 
 	# Refresh/create POT and PO files as needed.
+	# (But avoid doing so if they are in an underlay directory.)
 	foreach my $file (grep {istranslatablefile($_)} @rendered) {
-		my $page=pagename($file);
 		my $masterfile=srcfile($file);
+		my $page=pagename($file);
 		my $updated_pot_file=0;
-		# Only refresh Pot file if it does not exist, or if
+		# Only refresh POT file if it does not exist, or if
 		# $pagesources{$page} was changed: don't if only the HTML was
 		# refreshed, e.g. because of a dependency.
-		if ((grep { $_ eq $pagesources{$page} } @origneedsbuild)
-		    || ! -e potfile($masterfile)) {
+		if ($masterfile eq "$config{srcdir}/$file" &&
+		   ((grep { $_ eq $pagesources{$page} } @origneedsbuild)
+		    || ! -e potfile($masterfile))) {
 			refreshpot($masterfile);
 			$updated_pot_file=1;
 		}
 		my @pofiles;
-		map {
-			push @pofiles, $_ if ($updated_pot_file || ! -e $_);
-		} (pofiles($masterfile));
+		foreach my $po (pofiles($masterfile)) {
+			next if ! $updated_pot_file && ! -e $po;
+			next if grep { $po=~/\Q$_\E/ } @{$config{underlaydirs}};
+			push @pofiles, $po;
+		}
 		if (@pofiles) {
 			refreshpofiles($masterfile, @pofiles);
 			map { IkiWiki::rcs_add($_) } @pofiles if $config{rcs};
@@ -426,8 +441,8 @@ sub canremove (@) {
 	my %params = @_;
 
 	if (istranslation($params{page})) {
-		return gettext("Can not remove a translation. Removing the master page, ".
-			       "though, removes its translations as well.");
+		return gettext("Can not remove a translation. If the master page is removed, ".
+			       "however, its translations will be removed as well.");
 	}
 	return undef;
 }
@@ -446,8 +461,8 @@ sub canrename (@) {
 		# saved early in the renaming process.
 		my $orig_torename = $session->param("po_orig_torename");
 		unless (grep { $_ eq $masterpage } @{$orig_torename}) {
-			return gettext("Can not rename a translation. Renaming the master page, ".
-				       "though, renames its translations as well.");
+			return gettext("Can not rename a translation. If the master page is renamed, ".
+				       "however, its translations will be renamed as well.");
 		}
 	}
 	return undef;
@@ -666,7 +681,6 @@ sub istranslatablefile ($) {
 	my $type=pagetype($file);
 	return 0 if ! defined $type || $type eq 'po';
 	return 0 if $file =~ /\.pot$/;
-	return 0 unless -e "$config{srcdir}/$file"; # underlay dirs may be read-only
 	return 1 if pagespec_match(pagename($file), $config{po_translatable_pages});
 	return;
 }
@@ -814,7 +828,7 @@ sub refreshpofiles ($@) {
 	foreach my $pofile (@pofiles) {
 		IkiWiki::prep_writefile(basename($pofile),dirname($pofile));
 		if (-e $pofile) {
-			system("msgmerge", "-q", "-U", "--backup=none", $pofile, $potfile) == 0
+			system("msgmerge", "--previous", "-q", "-U", "--backup=none", $pofile, $potfile) == 0
 				or error("po(refreshpofiles) ".
 					 sprintf(gettext("failed to update %s"),
 						 $pofile));
@@ -1076,8 +1090,8 @@ sub isvalidpo ($) {
 	if ($res) {
 	    return IkiWiki::SuccessReason->new("valid gettext data");
 	}
-	return IkiWiki::FailReason->new("invalid gettext data, go back ".
-					"to previous page to go on with edit");
+	return IkiWiki::FailReason->new(gettext("invalid gettext data, go back ".
+					"to previous page to continue edit"));
 }
 
 # ,----