]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/blobdiff - IkiWiki/Plugin/po.pm
po/todo: update
[git.ikiwiki.info.git] / IkiWiki / Plugin / po.pm
index 75344b4b625d4b14e53d9f7ca0e50362f9b51071..a307e5d6b4171308702b8030cc43b7865bcdd120 100644 (file)
@@ -1,7 +1,7 @@
 #!/usr/bin/perl
 # .po as a wiki page type
 # Licensed under GPL v2 or greater
 #!/usr/bin/perl
 # .po as a wiki page type
 # Licensed under GPL v2 or greater
-# Copyright (C) 2008 intrigeri <intrigeri@boum.org>
+# Copyright (C) 2008-2009 intrigeri <intrigeri@boum.org>
 # inspired by the GPL'd po4a-translate,
 # which is Copyright 2002, 2003, 2004 by Martin Quinson (mquinson#debian.org)
 package IkiWiki::Plugin::po;
 # inspired by the GPL'd po4a-translate,
 # which is Copyright 2002, 2003, 2004 by Martin Quinson (mquinson#debian.org)
 package IkiWiki::Plugin::po;
@@ -43,7 +43,7 @@ sub import {
        hook(type => "canremove", id => "po", call => \&canremove);
        hook(type => "canrename", id => "po", call => \&canrename);
        hook(type => "editcontent", id => "po", call => \&editcontent);
        hook(type => "canremove", id => "po", call => \&canremove);
        hook(type => "canrename", id => "po", call => \&canrename);
        hook(type => "editcontent", id => "po", call => \&editcontent);
-       hook(type => "formbuilder_setup", id => "po", call => \&formbuilder_setup);
+       hook(type => "formbuilder_setup", id => "po", call => \&formbuilder_setup, last => 1);
        hook(type => "formbuilder", id => "po", call => \&formbuilder);
 
        $origsubs{'bestlink'}=\&IkiWiki::bestlink;
        hook(type => "formbuilder", id => "po", call => \&formbuilder);
 
        $origsubs{'bestlink'}=\&IkiWiki::bestlink;
@@ -128,7 +128,8 @@ sub getsetup () {
 sub checkconfig () {
        foreach my $field (qw{po_master_language po_slave_languages}) {
                if (! exists $config{$field} || ! defined $config{$field}) {
 sub checkconfig () {
        foreach my $field (qw{po_master_language po_slave_languages}) {
                if (! exists $config{$field} || ! defined $config{$field}) {
-                       error(sprintf(gettext("Must specify %s when using the %s plugin"), $field, 'po'));
+                       error(sprintf(gettext("Must specify %s when using the %s plugin"),
+                                     $field, 'po'));
                }
        }
        if (! (keys %{$config{po_slave_languages}})) {
                }
        }
        if (! (keys %{$config{po_slave_languages}})) {
@@ -150,8 +151,8 @@ sub checkconfig () {
        elsif (! grep {
                        $config{po_link_to} eq $_
                } ('default', 'current', 'negotiated')) {
        elsif (! grep {
                        $config{po_link_to} eq $_
                } ('default', 'current', 'negotiated')) {
-               warn(sprintf(gettext('po_link_to=%s is not a valid setting, falling back to po_link_to=default'),
-                               $config{po_link_to}));
+               warn(sprintf(gettext('%s is not a valid value for po_link_to, falling back to po_link_to=default'),
+                            $config{po_link_to}));
                $config{po_link_to}='default';
        }
        elsif ($config{po_link_to} eq "negotiated" && ! $config{usedirs}) {
                $config{po_link_to}='default';
        }
        elsif ($config{po_link_to} eq "negotiated" && ! $config{usedirs}) {
@@ -447,35 +448,59 @@ sub formbuilder_setup (@) {
        my $form=$params{form};
        my $q=$params{cgi};
 
        my $form=$params{form};
        my $q=$params{cgi};
 
-       return unless (defined $form->field("do") && $form->field("do") eq "create");
+       return unless defined $form->field("do");
 
 
-       my $template=template("pocreatepage.tmpl");
-       $template->param(LANG => $config{po_master_language}{name});
-       $form->tmpl_param(message => $template->output);
+       if ($form->field("do") eq "create") {
+               # Warn the user: new pages must be written in master language.
+               my $template=template("pocreatepage.tmpl");
+               $template->param(LANG => $config{po_master_language}{name});
+               $form->tmpl_param(message => $template->output);
+       }
+       elsif ($form->field("do") eq "edit") {
+               # Remove the rename/remove buttons on slave pages.
+               # This has to be done after the rename/remove plugins have added
+               # their buttons, which is why this hook must be run last.
+               # The canrename/canremove hooks already ensure this is forbidden
+               # at the backend level, so this is only UI sugar.
+               if (istranslation($form->field("page"))) {
+                       map {
+                               for (my $i = 0; $i < @{$params{buttons}}; $i++) {
+                                       if (@{$params{buttons}}[$i] eq $_) {
+                                               delete  @{$params{buttons}}[$i];
+                                               last;
+                                       }
+                               }
+                       } qw(Rename Remove);
+               }
+       }
 }
 
 }
 
-# Do not allow to create pages of type po: they are automatically created.
-# The main reason to do so is to bypass the "favor the type of linking page
-# on page creation" logic, which is unsuitable when a broken link is clicked
-# on a slave (PO) page.
 sub formbuilder (@) {
        my %params=@_;
        my $form=$params{form};
        my $q=$params{cgi};
 
 sub formbuilder (@) {
        my %params=@_;
        my $form=$params{form};
        my $q=$params{cgi};
 
-       return unless (defined $form->field("do") && $form->field("do") eq "create");
-
-        for my $field ($form->field) {
-               next unless "$field" eq "type";
-               if ($field->type eq 'select') {
-                       # remove po from the types list
-                       my @types = grep { $_ ne 'po' } $field->options;
-                       $field->options(\@types) if scalar @types;
-               }
-               else {
-                       # make sure the default value is not po;
-                       # does this case actually happen?
-                       debug sprintf("po(formbuilder) type field is not select - not implemented yet");
+       return unless defined $form->field("do");
+
+       # Do not allow to create pages of type po: they are automatically created.
+       # The main reason to do so is to bypass the "favor the type of linking page
+       # on page creation" logic, which is unsuitable when a broken link is clicked
+       # on a slave (PO) page.
+       # This cannot be done in the formbuilder_setup hook as the list of types is
+       # computed later.
+       if ($form->field("do") eq "create") {
+               for my $field ($form->field) {
+                       next unless "$field" eq "type";
+                       if ($field->type eq 'select') {
+                               # remove po from the list of types
+                               my @types = grep { $_ ne 'po' } $field->options;
+                               $field->options(\@types) if scalar @types;
+                       }
+                       else {
+                               # make sure the default value is not po;
+                               # does this case actually happen?
+                               debug "po(formbuilder) ".gettext("type field is not select - not implemented yet");
+                       }
                }
        }
 }
                }
        }
 }
@@ -764,19 +789,21 @@ sub refreshpofiles ($@) {
 
        my $potfile=potfile($masterfile);
        (-e $potfile)
 
        my $potfile=potfile($masterfile);
        (-e $potfile)
-               or error(sprintf(gettext("po(refreshpofiles) POT file (%s) does not exist"),
-                                $potfile));
+               or error("po(refreshpofiles) ".sprintf(gettext("POT file (%s) does not exist"),
+                                                      $potfile));
 
        foreach my $pofile (@pofiles) {
                IkiWiki::prep_writefile(basename($pofile),dirname($pofile));
                if (-e $pofile) {
                        system("msgmerge", "-U", "--backup=none", $pofile, $potfile) == 0
 
        foreach my $pofile (@pofiles) {
                IkiWiki::prep_writefile(basename($pofile),dirname($pofile));
                if (-e $pofile) {
                        system("msgmerge", "-U", "--backup=none", $pofile, $potfile) == 0
-                               or error(sprintf(gettext("po(refreshpofiles) failed to update %s"),
+                               or error("po(refreshpofiles) ".
+                                        sprintf(gettext("failed to update %s"),
                                                 $pofile));
                }
                else {
                        File::Copy::syscopy($potfile,$pofile)
                                                 $pofile));
                }
                else {
                        File::Copy::syscopy($potfile,$pofile)
-                               or error(sprintf(gettext("po(refreshpofiles) failed to copy the POT file to %s"),
+                               or error("po(refreshpofiles) ".
+                                        sprintf(gettext("failed to copy the POT file to %s"),
                                                 $pofile));
                }
        }
                                                 $pofile));
                }
        }
@@ -824,8 +851,8 @@ sub percenttranslated ($) {
                'file_in_name'  => [ $masterfile ],
                'file_in_charset'  => 'utf-8',
                'file_out_charset' => 'utf-8',
                'file_in_name'  => [ $masterfile ],
                'file_in_charset'  => 'utf-8',
                'file_out_charset' => 'utf-8',
-       ) or error(sprintf(gettext("po(percenttranslated) failed to translate %s"),
-                          $page));
+       ) or error("po(percenttranslated) ".
+                  sprintf(gettext("failed to translate %s"), $page));
        my ($percent,$hit,$queries) = $doc->stats();
        $percent =~ s/\.[0-9]+$//;
        return $percent;
        my ($percent,$hit,$queries) = $doc->stats();
        $percent =~ s/\.[0-9]+$//;
        return $percent;
@@ -954,17 +981,17 @@ sub po_to_markup ($$;$) {
                                     DIR => File::Spec->tmpdir,
                                     UNLINK => 1)->filename;
 
                                     DIR => File::Spec->tmpdir,
                                     UNLINK => 1)->filename;
 
-       sub failure ($) {
+       my $fail = sub ($) {
                my $msg = "po(po_to_markup) - $page : " . shift;
                if ($nonfatal) {
                        warn $msg;
                        return undef;
                }
                error($msg, sub { unlink $infile, $outfile});
                my $msg = "po(po_to_markup) - $page : " . shift;
                if ($nonfatal) {
                        warn $msg;
                        return undef;
                }
                error($msg, sub { unlink $infile, $outfile});
-       }
+       };
 
        writefile(basename($infile), File::Spec->tmpdir, $content)
 
        writefile(basename($infile), File::Spec->tmpdir, $content)
-               or return failure(sprintf(gettext("failed to write %s"), $infile));
+               or return $fail->(sprintf(gettext("failed to write %s"), $infile));
 
        my $masterfile = srcfile($pagesources{masterpage($page)});
        my %options = (
 
        my $masterfile = srcfile($pagesources{masterpage($page)});
        my %options = (
@@ -976,12 +1003,12 @@ sub po_to_markup ($$;$) {
                'file_in_name'  => [ $masterfile ],
                'file_in_charset'  => 'utf-8',
                'file_out_charset' => 'utf-8',
                'file_in_name'  => [ $masterfile ],
                'file_in_charset'  => 'utf-8',
                'file_out_charset' => 'utf-8',
-       ) or return failure(gettext("failed to translate"));
+       ) or return $fail->(gettext("failed to translate"));
        $doc->write($outfile)
        $doc->write($outfile)
-               or return failure(sprintf(gettext("failed to write %s"), $outfile));
+               or return $fail->(sprintf(gettext("failed to write %s"), $outfile));
 
        $content = readfile($outfile)
 
        $content = readfile($outfile)
-               or return failure(sprintf(gettext("failed to read %s"), $outfile));
+               or return $fail->(sprintf(gettext("failed to read %s"), $outfile));
 
        # Unlinking should happen automatically, thanks to File::Temp,
        # but it does not work here, probably because of the way writefile()
 
        # Unlinking should happen automatically, thanks to File::Temp,
        # but it does not work here, probably because of the way writefile()
@@ -1011,14 +1038,14 @@ sub isvalidpo ($) {
                                    DIR => File::Spec->tmpdir,
                                    UNLINK => 1)->filename;
 
                                    DIR => File::Spec->tmpdir,
                                    UNLINK => 1)->filename;
 
-       sub failure ($) {
+       my $fail = sub ($) {
                my $msg = '[po/isvalidpo] ' . shift;
                unlink $infile;
                return IkiWiki::FailReason->new("$msg");
                my $msg = '[po/isvalidpo] ' . shift;
                unlink $infile;
                return IkiWiki::FailReason->new("$msg");
-       }
+       };
 
        writefile(basename($infile), File::Spec->tmpdir, $content)
 
        writefile(basename($infile), File::Spec->tmpdir, $content)
-               or return failure(sprintf(gettext("failed to write %s"), $infile));
+               or return $fail->(sprintf(gettext("failed to write %s"), $infile));
 
        my $res = (system("msgfmt", "--check", $infile, "-o", "/dev/null") == 0);
 
 
        my $res = (system("msgfmt", "--check", $infile, "-o", "/dev/null") == 0);
 
@@ -1030,7 +1057,8 @@ sub isvalidpo ($) {
        if ($res) {
            return IkiWiki::SuccessReason->new("valid gettext data");
        }
        if ($res) {
            return IkiWiki::SuccessReason->new("valid gettext data");
        }
-       return IkiWiki::FailReason->new("invalid gettext data");
+       return IkiWiki::FailReason->new("invalid gettext data, go back ".
+                                       "to previous page to go on with edit");
 }
 
 # ,----
 }
 
 # ,----