]> sipb.mit.edu Git - ikiwiki.git/blobdiff - IkiWiki/Plugin/po.pm
add --previous at bubulle's suggestion
[ikiwiki.git] / IkiWiki / Plugin / po.pm
index 5d2d42d3bdf00b3b2b54c68e99318b6ec83499ca..8f169fda59dff443e1189f49af52453d5fd7c641 100644 (file)
@@ -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");
                }
        }
 }
@@ -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};
@@ -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"));
 }
 
 # ,----