use strict;
use IkiWiki 3.00;
use Encode;
-use Locale::Po4a::Common qw(nowrapi18n !/.*/);
+eval q{use Locale::Po4a::Common qw(nowrapi18n !/.*/)};
+if ($@) {
+ print STDERR gettext("warning: Old po4a detected! Recommend upgrade to 0.35.")."\n";
+ eval q{use Locale::Po4a::Common qw(!/.*/)};
+ die $@ if $@;
+}
use Locale::Po4a::Chooser;
use Locale::Po4a::Po;
use File::Basename;
type => "string",
example => {
'fr' => 'Français',
- 'es' => 'Castellano',
+ 'es' => 'Español',
'de' => 'Deutsch'
},
description => "slave languages (PO files)",
},
po_translatable_pages => {
type => "pagespec",
- example => "!*/Discussion",
+ example => "* and !*/Discussion",
description => "PageSpec controlling which pages are translatable",
link => "ikiwiki/PageSpec",
safe => 1,
}
sub checkconfig () {
- foreach my $field (qw{po_master_language po_slave_languages}) {
+ foreach my $field (qw{po_master_language}) {
if (! exists $config{$field} || ! defined $config{$field}) {
error(sprintf(gettext("Must specify %s when using the %s plugin"),
$field, 'po'));
}
}
- if (! (keys %{$config{po_slave_languages}})) {
- error(gettext("At least one slave language must be defined ".
- "in po_slave_languages when using the po plugin"));
- }
+
map {
islanguagecode($_)
or error(sprintf(gettext("%s is not a valid language code"), $_));
} ($config{po_master_language}{code}, keys %{$config{po_slave_languages}});
+
if (! exists $config{po_translatable_pages} ||
! defined $config{po_translatable_pages}) {
$config{po_translatable_pages}="";
warn(gettext('po_link_to=negotiated requires usedirs to be enabled, falling back to po_link_to=default'));
$config{po_link_to}='default';
}
+
push @{$config{wiki_file_prune_regexps}}, qr/\.pot$/;
+
+ # 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");
+ }
+ }
}
sub needsbuild () {
map add_depends($page, $_), (values %{otherlanguages($page)});
}
if ($config{discussion} && istranslation($page)) {
- my $discussionlink=gettext("discussion");
- if ($page !~ /.*\/\Q$discussionlink\E$/i &&
+ if ($page !~ /.*\/\Q$config{discussionpage}\E$/i &&
(length $config{cgiurl} ||
- exists $links{$masterpage."/".$discussionlink})) {
+ exists $links{$masterpage."/".lc($config{discussionpage})})) {
$template->param('discussionlink' => htmllink(
$page,
$destpage,
- $masterpage . '/' . gettext("Discussion"),
+ $masterpage . '/' . $config{discussionpage},
noimageinline => 1,
forcesubpage => 0,
- linktext => gettext("Discussion"),
+ linktext => $config{discussionpage},
));
}
}
&& 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);
}
}
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};
+ map { s/^\Q$config{srcdir}\E\/*//; IkiWiki::rcs_add($_) } @pofiles if $config{rcs};
$updated_po_files=1;
}
}
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;
}
# 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;
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;
}
foreach my $pofile (@pofiles) {
IkiWiki::prep_writefile(basename($pofile),dirname($pofile));
+
+ if (! -e $pofile) {
+ # If the po file exists in an underlay, copy it
+ # from there.
+ my ($pobase)=$pofile=~/^\Q$config{srcdir}\E\/?(.*)$/;
+ foreach my $dir (@{$config{underlaydirs}}) {
+ if (-e "$dir/$pobase") {
+ File::Copy::syscopy("$dir/$pobase",$pofile)
+ or error("po(refreshpofiles) ".
+ sprintf(gettext("failed to copy underlay PO file to %s"),
+ $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));
master => 1,
};
}
- else {
+ elsif (istranslation($otherpage)) {
push @ret, {
url => urlto_with_orig_beautiful_urlpath($otherpage, $page),
code => $lang,
}
}
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 -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;
}
sub homepageurl (;$) {
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"));
}
# ,----