2008-10-05 04:11:02 +02:00
|
|
|
#!/usr/bin/perl
|
|
|
|
# .po as a wiki page type
|
2008-11-06 13:01:33 +01:00
|
|
|
# Licensed under GPL v2 or greater
|
2009-01-02 16:54:03 +01:00
|
|
|
# Copyright (C) 2008-2009 intrigeri <intrigeri@boum.org>
|
2008-10-05 19:42:43 +02:00
|
|
|
# inspired by the GPL'd po4a-translate,
|
|
|
|
# which is Copyright 2002, 2003, 2004 by Martin Quinson (mquinson#debian.org)
|
2008-10-05 04:11:02 +02:00
|
|
|
package IkiWiki::Plugin::po;
|
|
|
|
|
|
|
|
use warnings;
|
|
|
|
use strict;
|
2009-01-02 11:22:54 +01:00
|
|
|
use IkiWiki 3.00;
|
2008-10-05 04:11:02 +02:00
|
|
|
use Encode;
|
2009-08-12 18:26:07 +02:00
|
|
|
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 $@;
|
|
|
|
}
|
2008-10-05 19:42:43 +02:00
|
|
|
use Locale::Po4a::Chooser;
|
2008-10-18 21:47:49 +02:00
|
|
|
use Locale::Po4a::Po;
|
2008-10-14 16:36:01 +02:00
|
|
|
use File::Basename;
|
2008-10-14 17:17:24 +02:00
|
|
|
use File::Copy;
|
2008-10-14 16:36:01 +02:00
|
|
|
use File::Spec;
|
2008-10-05 19:42:43 +02:00
|
|
|
use File::Temp;
|
2008-10-11 03:41:12 +02:00
|
|
|
use Memoize;
|
2008-11-07 21:27:00 +01:00
|
|
|
use UNIVERSAL;
|
2008-10-11 03:41:12 +02:00
|
|
|
|
2010-09-10 19:13:00 +02:00
|
|
|
my ($master_language_code, $master_language_name);
|
2008-10-11 03:41:12 +02:00
|
|
|
my %translations;
|
2008-11-06 15:54:55 +01:00
|
|
|
my @origneedsbuild;
|
2008-11-11 04:05:39 +01:00
|
|
|
my %origsubs;
|
2010-07-23 20:26:57 +02:00
|
|
|
my @slavelanguages; # language codes ordered as in config po_slave_languages
|
2010-09-10 20:04:43 +02:00
|
|
|
my %slavelanguages; # language code to name lookup
|
2011-05-25 18:01:40 +02:00
|
|
|
my $language_code_pattern = '[a-zA-Z]+(?:_[a-zA-Z]+)?';
|
2008-11-02 18:29:23 +01:00
|
|
|
|
2008-11-12 22:32:47 +01:00
|
|
|
memoize("istranslatable");
|
2008-10-11 03:41:12 +02:00
|
|
|
memoize("_istranslation");
|
2008-10-15 02:25:34 +02:00
|
|
|
memoize("percenttranslated");
|
2008-11-02 18:29:23 +01:00
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub import {
|
2008-10-05 04:11:02 +02:00
|
|
|
hook(type => "getsetup", id => "po", call => \&getsetup);
|
2011-01-25 20:39:58 +01:00
|
|
|
hook(type => "checkconfig", id => "po", call => \&checkconfig,
|
|
|
|
last => 1);
|
2008-10-14 15:24:58 +02:00
|
|
|
hook(type => "needsbuild", id => "po", call => \&needsbuild);
|
2009-03-29 20:31:32 +02:00
|
|
|
hook(type => "scan", id => "po", call => \&scan, last => 1);
|
2008-10-05 04:11:02 +02:00
|
|
|
hook(type => "filter", id => "po", call => \&filter);
|
|
|
|
hook(type => "htmlize", id => "po", call => \&htmlize);
|
2008-11-04 20:05:21 +01:00
|
|
|
hook(type => "pagetemplate", id => "po", call => \&pagetemplate, last => 1);
|
2009-01-01 17:49:10 +01:00
|
|
|
hook(type => "rename", id => "po", call => \&renamepages, first => 1);
|
2008-11-13 01:38:22 +01:00
|
|
|
hook(type => "delete", id => "po", call => \&mydelete);
|
2008-11-06 15:54:55 +01:00
|
|
|
hook(type => "change", id => "po", call => \&change);
|
2009-01-19 19:53:32 +01:00
|
|
|
hook(type => "checkcontent", id => "po", call => \&checkcontent);
|
2009-01-01 16:38:16 +01:00
|
|
|
hook(type => "canremove", id => "po", call => \&canremove);
|
2009-01-01 16:50:24 +01:00
|
|
|
hook(type => "canrename", id => "po", call => \&canrename);
|
2008-11-04 17:56:42 +01:00
|
|
|
hook(type => "editcontent", id => "po", call => \&editcontent);
|
2009-01-02 15:50:47 +01:00
|
|
|
hook(type => "formbuilder_setup", id => "po", call => \&formbuilder_setup, last => 1);
|
2009-01-02 13:43:40 +01:00
|
|
|
hook(type => "formbuilder", id => "po", call => \&formbuilder);
|
2008-11-05 21:09:54 +01:00
|
|
|
|
2010-05-13 22:28:09 +02:00
|
|
|
if (! %origsubs) {
|
|
|
|
$origsubs{'bestlink'}=\&IkiWiki::bestlink;
|
|
|
|
inject(name => "IkiWiki::bestlink", call => \&mybestlink);
|
|
|
|
$origsubs{'beautify_urlpath'}=\&IkiWiki::beautify_urlpath;
|
|
|
|
inject(name => "IkiWiki::beautify_urlpath", call => \&mybeautify_urlpath);
|
|
|
|
$origsubs{'targetpage'}=\&IkiWiki::targetpage;
|
|
|
|
inject(name => "IkiWiki::targetpage", call => \&mytargetpage);
|
|
|
|
$origsubs{'urlto'}=\&IkiWiki::urlto;
|
|
|
|
inject(name => "IkiWiki::urlto", call => \&myurlto);
|
|
|
|
$origsubs{'cgiurl'}=\&IkiWiki::cgiurl;
|
|
|
|
inject(name => "IkiWiki::cgiurl", call => \&mycgiurl);
|
2011-03-24 22:55:03 +01:00
|
|
|
if (IkiWiki->can('rootpage')) {
|
|
|
|
$origsubs{'rootpage'}=\&IkiWiki::rootpage;
|
|
|
|
inject(name => "IkiWiki::rootpage", call => \&myrootpage)
|
|
|
|
if defined $origsubs{'rootpage'};
|
|
|
|
}
|
2010-06-25 14:38:37 +02:00
|
|
|
$origsubs{'isselflink'}=\&IkiWiki::isselflink;
|
|
|
|
inject(name => "IkiWiki::isselflink", call => \&myisselflink);
|
2010-05-13 22:28:09 +02:00
|
|
|
}
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-10-05 04:11:02 +02:00
|
|
|
|
2008-11-11 04:05:39 +01:00
|
|
|
|
|
|
|
# ,----
|
|
|
|
# | Table of contents
|
|
|
|
# `----
|
|
|
|
|
|
|
|
# 1. Hooks
|
|
|
|
# 2. Injected functions
|
|
|
|
# 3. Blackboxes for private data
|
|
|
|
# 4. Helper functions
|
2009-01-26 19:33:02 +01:00
|
|
|
# 5. PageSpecs
|
2008-11-11 04:05:39 +01:00
|
|
|
|
|
|
|
|
|
|
|
# ,----
|
|
|
|
# | Hooks
|
|
|
|
# `----
|
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub getsetup () {
|
2008-10-05 04:11:02 +02:00
|
|
|
return
|
|
|
|
plugin => {
|
2010-09-10 17:45:59 +02:00
|
|
|
safe => 1,
|
2010-02-12 07:10:36 +01:00
|
|
|
rebuild => 1, # format plugin
|
|
|
|
section => "format",
|
2008-10-05 04:11:02 +02:00
|
|
|
},
|
2008-10-05 21:34:43 +02:00
|
|
|
po_master_language => {
|
2008-10-05 04:11:02 +02:00
|
|
|
type => "string",
|
2010-09-10 19:13:00 +02:00
|
|
|
example => "en|English",
|
2008-10-05 21:34:43 +02:00
|
|
|
description => "master language (non-PO files)",
|
2008-11-06 13:26:45 +01:00
|
|
|
safe => 1,
|
2008-10-05 21:34:43 +02:00
|
|
|
rebuild => 1,
|
|
|
|
},
|
|
|
|
po_slave_languages => {
|
|
|
|
type => "string",
|
2010-07-20 02:25:17 +02:00
|
|
|
example => [
|
|
|
|
'fr|Français',
|
|
|
|
'es|Español',
|
|
|
|
'de|Deutsch'
|
2010-07-23 20:26:57 +02:00
|
|
|
],
|
2010-09-10 17:45:59 +02:00
|
|
|
description => "slave languages (translated via PO files) format: ll|Langname",
|
2008-11-06 13:26:45 +01:00
|
|
|
safe => 1,
|
2008-10-05 04:11:02 +02:00
|
|
|
rebuild => 1,
|
|
|
|
},
|
2008-10-10 21:47:20 +02:00
|
|
|
po_translatable_pages => {
|
|
|
|
type => "pagespec",
|
2009-07-21 09:56:34 +02:00
|
|
|
example => "* and !*/Discussion",
|
2008-10-10 21:47:20 +02:00
|
|
|
description => "PageSpec controlling which pages are translatable",
|
|
|
|
link => "ikiwiki/PageSpec",
|
2008-11-06 13:29:48 +01:00
|
|
|
safe => 1,
|
2008-10-10 21:47:20 +02:00
|
|
|
rebuild => 1,
|
|
|
|
},
|
2008-10-10 15:48:35 +02:00
|
|
|
po_link_to => {
|
|
|
|
type => "string",
|
|
|
|
example => "current",
|
|
|
|
description => "internal linking behavior (default/current/negotiated)",
|
2008-11-06 13:47:09 +01:00
|
|
|
safe => 1,
|
2008-10-10 13:57:48 +02:00
|
|
|
rebuild => 1,
|
|
|
|
},
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-10-10 13:57:48 +02:00
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub checkconfig () {
|
2010-09-10 19:13:00 +02:00
|
|
|
if (exists $config{po_master_language}) {
|
|
|
|
if (! ref $config{po_master_language}) {
|
|
|
|
($master_language_code, $master_language_name)=
|
|
|
|
splitlangpair($config{po_master_language});
|
2008-10-10 13:57:48 +02:00
|
|
|
}
|
2010-09-10 19:13:00 +02:00
|
|
|
else {
|
|
|
|
$master_language_code=$config{po_master_language}{code};
|
|
|
|
$master_language_name=$config{po_master_language}{name};
|
2010-09-10 20:04:43 +02:00
|
|
|
$config{po_master_language}=joinlangpair($master_language_code, $master_language_name);
|
2010-09-10 19:13:00 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
if (! defined $master_language_code) {
|
|
|
|
$master_language_code='en';
|
|
|
|
}
|
|
|
|
if (! defined $master_language_name) {
|
|
|
|
$master_language_name='English';
|
2008-10-10 13:57:48 +02:00
|
|
|
}
|
2010-07-20 02:25:17 +02:00
|
|
|
|
|
|
|
if (ref $config{po_slave_languages} eq 'ARRAY') {
|
|
|
|
foreach my $pair (@{$config{po_slave_languages}}) {
|
2010-09-10 19:13:00 +02:00
|
|
|
my ($code, $name)=splitlangpair($pair);
|
2010-09-10 20:12:59 +02:00
|
|
|
if (defined $code && ! exists $slavelanguages{$code}) {
|
2010-09-10 19:13:00 +02:00
|
|
|
push @slavelanguages, $code;
|
2010-09-10 20:04:43 +02:00
|
|
|
$slavelanguages{$code} = $name;
|
2010-07-23 20:26:57 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2010-07-20 02:25:17 +02:00
|
|
|
elsif (ref $config{po_slave_languages} eq 'HASH') {
|
2010-09-10 20:04:43 +02:00
|
|
|
%slavelanguages=%{$config{po_slave_languages}};
|
2010-07-20 02:25:17 +02:00
|
|
|
@slavelanguages = sort {
|
|
|
|
$config{po_slave_languages}->{$a} cmp $config{po_slave_languages}->{$b};
|
2010-09-10 20:04:43 +02:00
|
|
|
} keys %slavelanguages;
|
|
|
|
$config{po_slave_languages}=[
|
|
|
|
map { joinlangpair($_, $slavelanguages{$_}) } @slavelanguages
|
|
|
|
]
|
2010-07-23 20:26:57 +02:00
|
|
|
}
|
2010-07-20 02:25:17 +02:00
|
|
|
|
2010-09-10 20:04:43 +02:00
|
|
|
delete $slavelanguages{$master_language_code};
|
2009-07-20 07:19:05 +02:00
|
|
|
|
2008-11-06 13:26:45 +01:00
|
|
|
map {
|
|
|
|
islanguagecode($_)
|
2008-11-06 13:55:03 +01:00
|
|
|
or error(sprintf(gettext("%s is not a valid language code"), $_));
|
2010-09-10 19:13:00 +02:00
|
|
|
} ($master_language_code, @slavelanguages);
|
2009-07-20 07:19:05 +02:00
|
|
|
|
2008-10-10 21:47:20 +02:00
|
|
|
if (! exists $config{po_translatable_pages} ||
|
|
|
|
! defined $config{po_translatable_pages}) {
|
2008-11-05 21:18:07 +01:00
|
|
|
$config{po_translatable_pages}="";
|
2008-10-10 21:47:20 +02:00
|
|
|
}
|
2008-11-06 13:47:09 +01:00
|
|
|
if (! exists $config{po_link_to} ||
|
|
|
|
! defined $config{po_link_to}) {
|
|
|
|
$config{po_link_to}='default';
|
|
|
|
}
|
2009-03-29 20:31:32 +02:00
|
|
|
elsif ($config{po_link_to} !~ /^(default|current|negotiated)$/) {
|
2009-01-02 17:24:54 +01:00
|
|
|
warn(sprintf(gettext('%s is not a valid value for po_link_to, falling back to po_link_to=default'),
|
|
|
|
$config{po_link_to}));
|
2008-11-06 13:47:09 +01:00
|
|
|
$config{po_link_to}='default';
|
|
|
|
}
|
|
|
|
elsif ($config{po_link_to} eq "negotiated" && ! $config{usedirs}) {
|
|
|
|
warn(gettext('po_link_to=negotiated requires usedirs to be enabled, falling back to po_link_to=default'));
|
|
|
|
$config{po_link_to}='default';
|
2008-10-10 13:57:48 +02:00
|
|
|
}
|
2009-07-20 07:19:05 +02:00
|
|
|
|
2008-10-10 21:56:40 +02:00
|
|
|
push @{$config{wiki_file_prune_regexps}}, qr/\.pot$/;
|
2009-07-20 07:19:05 +02:00
|
|
|
|
po: Add support for mo files in underlays
In order to support translated basewiki and other underlays, we need
support for mo files in underlays.
The code did not allow this before, because if a mo file was in an
underlay, then it might try to update it, and its pot, and write to the
underlay, which is guaranteed to either fail due to permissions, or be
undesirable.
To fix, my approach is to just detect if a mo or pot file that is about to
be updated is in an underlay, and skip updating it. This seems to work
well:
- If the mo is out of date in the underlay, it won't get updated, but this
would probably be due to a problem in the underlay, or more likely,
the wiki is being rebuilt and so it *thinks* the mo is out of date,
but it's really not (and it would be a waste of time to rebuild it
anyway).
- If a page from the basewiki is edited, it is saved to the srcdir,
which causes generation of an updated mo and pot also in the srcdir;
the underlay stops being used for that page, and everything seems
to work.
Note that I am not including an underlay search directory for pot files.
They *seem* to be unnecessary for the underlay, since the mo files
in there never need to be updated.
2009-07-21 11:31:51 +02:00
|
|
|
# Translated versions of the underlays are added if available.
|
2009-07-21 12:38:40 +02:00
|
|
|
foreach my $underlay ("basewiki",
|
|
|
|
map { m/^\Q$config{underlaydirbase}\E\/*(.*)/ }
|
|
|
|
reverse @{$config{underlaydirs}}) {
|
po: Add support for mo files in underlays
In order to support translated basewiki and other underlays, we need
support for mo files in underlays.
The code did not allow this before, because if a mo file was in an
underlay, then it might try to update it, and its pot, and write to the
underlay, which is guaranteed to either fail due to permissions, or be
undesirable.
To fix, my approach is to just detect if a mo or pot file that is about to
be updated is in an underlay, and skip updating it. This seems to work
well:
- If the mo is out of date in the underlay, it won't get updated, but this
would probably be due to a problem in the underlay, or more likely,
the wiki is being rebuilt and so it *thinks* the mo is out of date,
but it's really not (and it would be a waste of time to rebuild it
anyway).
- If a page from the basewiki is edited, it is saved to the srcdir,
which causes generation of an updated mo and pot also in the srcdir;
the underlay stops being used for that page, and everything seems
to work.
Note that I am not including an underlay search directory for pot files.
They *seem* to be unnecessary for the underlay, since the mo files
in there never need to be updated.
2009-07-21 11:31:51 +02:00
|
|
|
next if $underlay=~/^locale\//;
|
|
|
|
|
2009-07-21 12:38:40 +02:00
|
|
|
# Underlays containing the po files for slave languages.
|
2010-07-20 02:26:23 +02:00
|
|
|
foreach my $ll (@slavelanguages) {
|
2009-07-21 13:16:26 +02:00
|
|
|
add_underlay("po/$ll/$underlay")
|
|
|
|
if -d "$config{underlaydirbase}/po/$ll/$underlay";
|
po: Add support for mo files in underlays
In order to support translated basewiki and other underlays, we need
support for mo files in underlays.
The code did not allow this before, because if a mo file was in an
underlay, then it might try to update it, and its pot, and write to the
underlay, which is guaranteed to either fail due to permissions, or be
undesirable.
To fix, my approach is to just detect if a mo or pot file that is about to
be updated is in an underlay, and skip updating it. This seems to work
well:
- If the mo is out of date in the underlay, it won't get updated, but this
would probably be due to a problem in the underlay, or more likely,
the wiki is being rebuilt and so it *thinks* the mo is out of date,
but it's really not (and it would be a waste of time to rebuild it
anyway).
- If a page from the basewiki is edited, it is saved to the srcdir,
which causes generation of an updated mo and pot also in the srcdir;
the underlay stops being used for that page, and everything seems
to work.
Note that I am not including an underlay search directory for pot files.
They *seem* to be unnecessary for the underlay, since the mo files
in there never need to be updated.
2009-07-21 11:31:51 +02:00
|
|
|
}
|
|
|
|
|
2010-09-10 19:13:00 +02:00
|
|
|
if ($master_language_code ne 'en') {
|
po: Add support for mo files in underlays
In order to support translated basewiki and other underlays, we need
support for mo files in underlays.
The code did not allow this before, because if a mo file was in an
underlay, then it might try to update it, and its pot, and write to the
underlay, which is guaranteed to either fail due to permissions, or be
undesirable.
To fix, my approach is to just detect if a mo or pot file that is about to
be updated is in an underlay, and skip updating it. This seems to work
well:
- If the mo is out of date in the underlay, it won't get updated, but this
would probably be due to a problem in the underlay, or more likely,
the wiki is being rebuilt and so it *thinks* the mo is out of date,
but it's really not (and it would be a waste of time to rebuild it
anyway).
- If a page from the basewiki is edited, it is saved to the srcdir,
which causes generation of an updated mo and pot also in the srcdir;
the underlay stops being used for that page, and everything seems
to work.
Note that I am not including an underlay search directory for pot files.
They *seem* to be unnecessary for the underlay, since the mo files
in there never need to be updated.
2009-07-21 11:31:51 +02:00
|
|
|
# Add underlay containing translated source files
|
|
|
|
# for the master language.
|
2010-09-10 19:13:00 +02:00
|
|
|
add_underlay("locale/$master_language_code/$underlay")
|
|
|
|
if -d "$config{underlaydirbase}/locale/$master_language_code/$underlay";
|
2009-07-20 07:19:05 +02:00
|
|
|
}
|
|
|
|
}
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-10-05 04:11:02 +02:00
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub needsbuild () {
|
2008-10-14 15:24:58 +02:00
|
|
|
my $needsbuild=shift;
|
|
|
|
|
2008-11-06 15:54:55 +01:00
|
|
|
# backup @needsbuild content so that change() can know whether
|
|
|
|
# a given master page was rendered because its source file was changed
|
|
|
|
@origneedsbuild=(@$needsbuild);
|
2008-10-15 06:47:06 +02:00
|
|
|
|
2008-11-12 23:22:26 +01:00
|
|
|
flushmemoizecache();
|
2008-11-10 13:56:46 +01:00
|
|
|
buildtranslationscache();
|
2008-10-15 00:05:52 +02:00
|
|
|
|
|
|
|
# make existing translations depend on the corresponding master page
|
|
|
|
foreach my $master (keys %translations) {
|
2010-07-20 02:25:17 +02:00
|
|
|
map add_depends($_, $master), values %{otherlanguages_pages($master)};
|
2008-10-15 00:05:52 +02:00
|
|
|
}
|
2010-09-07 18:08:59 +02:00
|
|
|
|
|
|
|
return $needsbuild;
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-10-13 17:19:56 +02:00
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub scan (@) {
|
2008-11-07 21:27:00 +01:00
|
|
|
my %params=@_;
|
|
|
|
my $page=$params{page};
|
|
|
|
my $content=$params{content};
|
2010-08-02 13:39:41 +02:00
|
|
|
my $run_by_po=$params{run_by_po};
|
2008-11-07 21:27:00 +01:00
|
|
|
|
2010-08-02 13:39:41 +02:00
|
|
|
# Massage the recorded state of internal links so that:
|
|
|
|
# - it matches the actually generated links, rather than the links as
|
|
|
|
# written in the pages' source
|
|
|
|
# - backlinks are consistent in all cases
|
|
|
|
|
|
|
|
# A second scan pass is made over translation pages, so as an
|
|
|
|
# optimization, we only do so on the second pass in this case,
|
|
|
|
# i.e. when this hook is called by itself.
|
|
|
|
if ($run_by_po && istranslation($page)) {
|
2010-08-02 12:50:40 +02:00
|
|
|
# replace the occurence of $destpage in $links{$page}
|
|
|
|
my @orig_links = @{$links{$page}};
|
|
|
|
$links{$page} = [];
|
|
|
|
foreach my $destpage (@orig_links) {
|
|
|
|
if (istranslatedto($destpage, lang($page))) {
|
|
|
|
add_link($page, $destpage . '.' . lang($page));
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
add_link($page, $destpage);
|
2008-11-07 21:27:00 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2010-08-02 13:39:41 +02:00
|
|
|
# No second scan pass is done for a non-translation page, so
|
|
|
|
# links massaging must happen on first pass in this case.
|
|
|
|
elsif (! $run_by_po && ! istranslatable($page) && ! istranslation($page)) {
|
2008-11-07 21:27:00 +01:00
|
|
|
foreach my $destpage (@{$links{$page}}) {
|
|
|
|
if (istranslatable($destpage)) {
|
2008-11-11 04:32:20 +01:00
|
|
|
# make sure any destpage's translations has
|
|
|
|
# $page in its backlinks
|
2010-08-02 12:50:40 +02:00
|
|
|
foreach my $link (values %{otherlanguages_pages($destpage)}) {
|
|
|
|
add_link($page, $link);
|
2010-08-02 13:39:41 +02:00
|
|
|
}
|
2008-11-07 21:27:00 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2010-08-02 13:39:41 +02:00
|
|
|
|
|
|
|
# Re-run the preprocess hooks in scan mode, then the scan hooks,
|
|
|
|
# over the po-to-markup converted content
|
|
|
|
return if $run_by_po; # avoid looping endlessly
|
|
|
|
return unless istranslation($page);
|
|
|
|
$content = po_to_markup($page, $content);
|
|
|
|
require IkiWiki;
|
|
|
|
IkiWiki::preprocess($page, $page, $content, 1);
|
|
|
|
IkiWiki::run_hooks(scan => sub {
|
|
|
|
shift->(
|
|
|
|
page => $page,
|
|
|
|
content => $content,
|
|
|
|
run_by_po => 1,
|
|
|
|
);
|
|
|
|
});
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-11-07 21:27:00 +01:00
|
|
|
|
2008-11-04 17:56:42 +01:00
|
|
|
# We use filter to convert PO to the master page's format,
|
|
|
|
# since the rest of ikiwiki should not work on PO files.
|
2008-12-31 23:54:21 +01:00
|
|
|
sub filter (@) {
|
2008-10-05 04:11:02 +02:00
|
|
|
my %params = @_;
|
2008-11-05 21:18:07 +01:00
|
|
|
|
2008-10-05 19:42:43 +02:00
|
|
|
my $page = $params{page};
|
2008-10-11 03:02:43 +02:00
|
|
|
my $destpage = $params{destpage};
|
2009-01-01 21:56:36 +01:00
|
|
|
my $content = $params{content};
|
|
|
|
if (istranslation($page) && ! alreadyfiltered($page, $destpage)) {
|
|
|
|
$content = po_to_markup($page, $content);
|
|
|
|
setalreadyfiltered($page, $destpage);
|
|
|
|
}
|
2008-10-05 04:11:02 +02:00
|
|
|
return $content;
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-10-05 04:11:02 +02:00
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub htmlize (@) {
|
2008-10-05 04:11:02 +02:00
|
|
|
my %params=@_;
|
2008-11-05 21:18:07 +01:00
|
|
|
|
2008-10-05 19:56:53 +02:00
|
|
|
my $page = $params{page};
|
2008-10-05 19:42:43 +02:00
|
|
|
my $content = $params{content};
|
2008-11-12 18:03:14 +01:00
|
|
|
|
|
|
|
# ignore PO files this plugin did not create
|
|
|
|
return $content unless istranslation($page);
|
2008-10-05 19:56:53 +02:00
|
|
|
|
|
|
|
# force content to be htmlize'd as if it was the same type as the master page
|
2008-11-12 18:03:14 +01:00
|
|
|
return IkiWiki::htmlize($page, $page,
|
2009-01-26 19:33:02 +01:00
|
|
|
pagetype(srcfile($pagesources{masterpage($page)})),
|
|
|
|
$content);
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-10-05 04:11:02 +02:00
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub pagetemplate (@) {
|
2008-11-11 04:05:39 +01:00
|
|
|
my %params=@_;
|
|
|
|
my $page=$params{page};
|
|
|
|
my $destpage=$params{destpage};
|
|
|
|
my $template=$params{template};
|
2008-11-10 21:19:21 +01:00
|
|
|
|
2008-11-11 04:05:39 +01:00
|
|
|
my ($masterpage, $lang) = istranslation($page);
|
2008-10-13 22:07:21 +02:00
|
|
|
|
2008-10-15 02:25:34 +02:00
|
|
|
if (istranslation($page) && $template->query(name => "percenttranslated")) {
|
|
|
|
$template->param(percenttranslated => percenttranslated($page));
|
|
|
|
}
|
2008-10-19 00:05:13 +02:00
|
|
|
if ($template->query(name => "istranslation")) {
|
2009-01-26 23:21:14 +01:00
|
|
|
$template->param(istranslation => scalar istranslation($page));
|
2008-10-19 00:05:13 +02:00
|
|
|
}
|
|
|
|
if ($template->query(name => "istranslatable")) {
|
|
|
|
$template->param(istranslatable => istranslatable($page));
|
|
|
|
}
|
2011-07-18 16:34:54 +02:00
|
|
|
my $lang_code = istranslation($page) ? lang($page) : $master_language_code;
|
|
|
|
if ($template->query(name => "lang_code")) {
|
|
|
|
$template->param(lang_code => $lang_code);
|
|
|
|
}
|
|
|
|
if ($template->query(name => "lang_name")) {
|
|
|
|
$template->param(lang_name => languagename($lang_code));
|
|
|
|
}
|
2008-11-11 15:27:39 +01:00
|
|
|
if ($template->query(name => "HOMEPAGEURL")) {
|
|
|
|
$template->param(homepageurl => homepageurl($page));
|
|
|
|
}
|
2008-10-13 22:07:21 +02:00
|
|
|
if ($template->query(name => "otherlanguages")) {
|
2008-11-10 14:49:58 +01:00
|
|
|
$template->param(otherlanguages => [otherlanguagesloop($page)]);
|
2010-07-20 02:25:17 +02:00
|
|
|
map add_depends($page, $_), (values %{otherlanguages_pages($page)});
|
2008-10-13 22:07:21 +02:00
|
|
|
}
|
2009-06-03 18:30:00 +02:00
|
|
|
if ($config{discussion} && istranslation($page)) {
|
2009-08-14 03:41:48 +02:00
|
|
|
if ($page !~ /.*\/\Q$config{discussionpage}\E$/i &&
|
2009-06-03 18:30:00 +02:00
|
|
|
(length $config{cgiurl} ||
|
2009-08-14 03:41:48 +02:00
|
|
|
exists $links{$masterpage."/".lc($config{discussionpage})})) {
|
2009-06-03 18:30:00 +02:00
|
|
|
$template->param('discussionlink' => htmllink(
|
|
|
|
$page,
|
|
|
|
$destpage,
|
2009-08-14 03:41:48 +02:00
|
|
|
$masterpage . '/' . $config{discussionpage},
|
2009-06-03 18:30:00 +02:00
|
|
|
noimageinline => 1,
|
|
|
|
forcesubpage => 0,
|
2009-08-14 03:41:48 +02:00
|
|
|
linktext => $config{discussionpage},
|
2009-01-26 19:33:02 +01:00
|
|
|
));
|
2009-06-03 18:30:00 +02:00
|
|
|
}
|
2008-11-03 00:52:27 +01:00
|
|
|
}
|
2008-11-10 13:00:05 +01:00
|
|
|
# Remove broken parentlink to ./index.html on home page's translations.
|
|
|
|
# It works because this hook has the "last" parameter set, to ensure it
|
|
|
|
# runs after parentlinks' own pagetemplate hook.
|
2008-11-04 20:05:21 +01:00
|
|
|
if ($template->param('parentlinks')
|
|
|
|
&& istranslation($page)
|
|
|
|
&& $masterpage eq "index") {
|
|
|
|
$template->param('parentlinks' => []);
|
|
|
|
}
|
2010-12-22 12:55:33 +01:00
|
|
|
if (ishomepage($page) && $template->query(name => "title")
|
|
|
|
&& !$template->param("title_overridden")) {
|
2009-08-27 20:19:17 +02:00
|
|
|
$template->param(title => $config{wikiname});
|
|
|
|
}
|
2010-03-25 19:23:16 +01:00
|
|
|
}
|
2008-10-13 22:07:21 +02:00
|
|
|
|
2008-12-30 22:55:04 +01:00
|
|
|
# Add the renamed page translations to the list of to-be-renamed pages.
|
2009-03-29 20:52:29 +02:00
|
|
|
sub renamepages (@) {
|
2009-01-27 16:57:52 +01:00
|
|
|
my %params = @_;
|
2009-01-01 17:49:10 +01:00
|
|
|
|
2009-03-08 11:44:00 +01:00
|
|
|
my %torename = %{$params{torename}};
|
2009-01-27 16:57:52 +01:00
|
|
|
my $session = $params{session};
|
2008-12-30 22:55:04 +01:00
|
|
|
|
2009-01-01 17:49:10 +01:00
|
|
|
# Save the page(s) the user asked to rename, so that our
|
|
|
|
# canrename hook can tell the difference between:
|
|
|
|
# - a translation being renamed as a consequence of its master page
|
|
|
|
# being renamed
|
|
|
|
# - a user trying to directly rename a translation
|
2009-01-27 16:57:52 +01:00
|
|
|
# This is why this hook has to be run first, before the list of pages
|
|
|
|
# to rename is modified by other plugins.
|
2009-03-08 11:44:00 +01:00
|
|
|
my @orig_torename;
|
|
|
|
@orig_torename=@{$session->param("po_orig_torename")}
|
|
|
|
if defined $session->param("po_orig_torename");
|
|
|
|
push @orig_torename, $torename{src};
|
|
|
|
$session->param(po_orig_torename => \@orig_torename);
|
2009-01-01 17:49:10 +01:00
|
|
|
IkiWiki::cgi_savesession($session);
|
|
|
|
|
2009-03-08 11:44:00 +01:00
|
|
|
return () unless istranslatable($torename{src});
|
|
|
|
|
|
|
|
my @ret;
|
2010-07-20 02:25:17 +02:00
|
|
|
my %otherpages=%{otherlanguages_pages($torename{src})};
|
2009-03-08 11:44:00 +01:00
|
|
|
while (my ($lang, $otherpage) = each %otherpages) {
|
|
|
|
push @ret, {
|
|
|
|
src => $otherpage,
|
|
|
|
srcfile => $pagesources{$otherpage},
|
2010-07-20 02:25:17 +02:00
|
|
|
dest => otherlanguage_page($torename{dest}, $lang),
|
2009-03-08 11:44:00 +01:00
|
|
|
destfile => $torename{dest}.".".$lang.".po",
|
|
|
|
required => 0,
|
|
|
|
};
|
2008-12-30 22:55:04 +01:00
|
|
|
}
|
2009-01-27 16:57:52 +01:00
|
|
|
return @ret;
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-11-13 03:55:55 +01:00
|
|
|
|
2009-03-29 20:52:29 +02:00
|
|
|
sub mydelete (@) {
|
2008-11-13 01:38:22 +01:00
|
|
|
my @deleted=@_;
|
|
|
|
|
2009-01-01 00:58:06 +01:00
|
|
|
map { deletetranslations($_) } grep istranslatablefile($_), @deleted;
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-11-13 01:38:22 +01:00
|
|
|
|
2009-03-29 20:52:29 +02:00
|
|
|
sub change (@) {
|
2008-11-06 15:54:55 +01:00
|
|
|
my @rendered=@_;
|
|
|
|
|
|
|
|
my $updated_po_files=0;
|
|
|
|
|
|
|
|
# Refresh/create POT and PO files as needed.
|
2009-01-01 00:58:06 +01:00
|
|
|
foreach my $file (grep {istranslatablefile($_)} @rendered) {
|
2008-11-13 01:07:52 +01:00
|
|
|
my $masterfile=srcfile($file);
|
po: Add support for mo files in underlays
In order to support translated basewiki and other underlays, we need
support for mo files in underlays.
The code did not allow this before, because if a mo file was in an
underlay, then it might try to update it, and its pot, and write to the
underlay, which is guaranteed to either fail due to permissions, or be
undesirable.
To fix, my approach is to just detect if a mo or pot file that is about to
be updated is in an underlay, and skip updating it. This seems to work
well:
- If the mo is out of date in the underlay, it won't get updated, but this
would probably be due to a problem in the underlay, or more likely,
the wiki is being rebuilt and so it *thinks* the mo is out of date,
but it's really not (and it would be a waste of time to rebuild it
anyway).
- If a page from the basewiki is edited, it is saved to the srcdir,
which causes generation of an updated mo and pot also in the srcdir;
the underlay stops being used for that page, and everything seems
to work.
Note that I am not including an underlay search directory for pot files.
They *seem* to be unnecessary for the underlay, since the mo files
in there never need to be updated.
2009-07-21 11:31:51 +02:00
|
|
|
my $page=pagename($file);
|
2008-11-06 15:54:55 +01:00
|
|
|
my $updated_pot_file=0;
|
2009-10-18 02:21:42 +02:00
|
|
|
|
|
|
|
# Avoid touching underlay files.
|
|
|
|
next if $masterfile ne "$config{srcdir}/$file";
|
|
|
|
|
po: Add support for mo files in underlays
In order to support translated basewiki and other underlays, we need
support for mo files in underlays.
The code did not allow this before, because if a mo file was in an
underlay, then it might try to update it, and its pot, and write to the
underlay, which is guaranteed to either fail due to permissions, or be
undesirable.
To fix, my approach is to just detect if a mo or pot file that is about to
be updated is in an underlay, and skip updating it. This seems to work
well:
- If the mo is out of date in the underlay, it won't get updated, but this
would probably be due to a problem in the underlay, or more likely,
the wiki is being rebuilt and so it *thinks* the mo is out of date,
but it's really not (and it would be a waste of time to rebuild it
anyway).
- If a page from the basewiki is edited, it is saved to the srcdir,
which causes generation of an updated mo and pot also in the srcdir;
the underlay stops being used for that page, and everything seems
to work.
Note that I am not including an underlay search directory for pot files.
They *seem* to be unnecessary for the underlay, since the mo files
in there never need to be updated.
2009-07-21 11:31:51 +02:00
|
|
|
# Only refresh POT file if it does not exist, or if
|
2009-10-18 02:21:42 +02:00
|
|
|
# the source was changed: don't if only the HTML was
|
2008-11-10 13:00:05 +01:00
|
|
|
# refreshed, e.g. because of a dependency.
|
2009-10-18 02:21:42 +02:00
|
|
|
if ((grep { $_ eq $pagesources{$page} } @origneedsbuild) ||
|
|
|
|
! -e potfile($masterfile)) {
|
2008-11-13 01:07:52 +01:00
|
|
|
refreshpot($masterfile);
|
2008-11-06 15:54:55 +01:00
|
|
|
$updated_pot_file=1;
|
|
|
|
}
|
|
|
|
my @pofiles;
|
po: Add support for mo files in underlays
In order to support translated basewiki and other underlays, we need
support for mo files in underlays.
The code did not allow this before, because if a mo file was in an
underlay, then it might try to update it, and its pot, and write to the
underlay, which is guaranteed to either fail due to permissions, or be
undesirable.
To fix, my approach is to just detect if a mo or pot file that is about to
be updated is in an underlay, and skip updating it. This seems to work
well:
- If the mo is out of date in the underlay, it won't get updated, but this
would probably be due to a problem in the underlay, or more likely,
the wiki is being rebuilt and so it *thinks* the mo is out of date,
but it's really not (and it would be a waste of time to rebuild it
anyway).
- If a page from the basewiki is edited, it is saved to the srcdir,
which causes generation of an updated mo and pot also in the srcdir;
the underlay stops being used for that page, and everything seems
to work.
Note that I am not including an underlay search directory for pot files.
They *seem* to be unnecessary for the underlay, since the mo files
in there never need to be updated.
2009-07-21 11:31:51 +02:00
|
|
|
foreach my $po (pofiles($masterfile)) {
|
2009-10-18 02:21:42 +02:00
|
|
|
next if ! $updated_pot_file && -e $po;
|
po: Add support for mo files in underlays
In order to support translated basewiki and other underlays, we need
support for mo files in underlays.
The code did not allow this before, because if a mo file was in an
underlay, then it might try to update it, and its pot, and write to the
underlay, which is guaranteed to either fail due to permissions, or be
undesirable.
To fix, my approach is to just detect if a mo or pot file that is about to
be updated is in an underlay, and skip updating it. This seems to work
well:
- If the mo is out of date in the underlay, it won't get updated, but this
would probably be due to a problem in the underlay, or more likely,
the wiki is being rebuilt and so it *thinks* the mo is out of date,
but it's really not (and it would be a waste of time to rebuild it
anyway).
- If a page from the basewiki is edited, it is saved to the srcdir,
which causes generation of an updated mo and pot also in the srcdir;
the underlay stops being used for that page, and everything seems
to work.
Note that I am not including an underlay search directory for pot files.
They *seem* to be unnecessary for the underlay, since the mo files
in there never need to be updated.
2009-07-21 11:31:51 +02:00
|
|
|
next if grep { $po=~/\Q$_\E/ } @{$config{underlaydirs}};
|
|
|
|
push @pofiles, $po;
|
|
|
|
}
|
2008-11-06 15:54:55 +01:00
|
|
|
if (@pofiles) {
|
2008-11-13 01:07:52 +01:00
|
|
|
refreshpofiles($masterfile, @pofiles);
|
2009-08-19 20:05:59 +02:00
|
|
|
map { s/^\Q$config{srcdir}\E\/*//; IkiWiki::rcs_add($_) } @pofiles if $config{rcs};
|
2008-11-06 15:54:55 +01:00
|
|
|
$updated_po_files=1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($updated_po_files) {
|
2008-12-31 00:38:47 +01:00
|
|
|
commit_and_refresh(
|
2010-06-23 22:56:50 +02:00
|
|
|
gettext("updated PO files"));
|
2008-11-06 15:54:55 +01:00
|
|
|
}
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-11-06 15:54:55 +01:00
|
|
|
|
2009-01-19 19:53:32 +01:00
|
|
|
sub checkcontent (@) {
|
|
|
|
my %params=@_;
|
2009-01-01 19:48:48 +01:00
|
|
|
|
2009-01-19 19:53:32 +01:00
|
|
|
if (istranslation($params{page})) {
|
|
|
|
my $res = isvalidpo($params{content});
|
2009-01-01 23:10:16 +01:00
|
|
|
if ($res) {
|
2009-01-01 22:16:43 +01:00
|
|
|
return undef;
|
|
|
|
}
|
|
|
|
else {
|
2009-01-01 23:10:16 +01:00
|
|
|
return "$res";
|
2009-01-01 22:16:43 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return undef;
|
2009-01-01 19:48:48 +01:00
|
|
|
}
|
|
|
|
|
2009-01-26 23:07:19 +01:00
|
|
|
sub canremove (@) {
|
|
|
|
my %params = @_;
|
2009-01-01 16:38:16 +01:00
|
|
|
|
2009-01-26 23:07:19 +01:00
|
|
|
if (istranslation($params{page})) {
|
2009-07-23 00:50:42 +02:00
|
|
|
return gettext("Can not remove a translation. If the master page is removed, ".
|
|
|
|
"however, its translations will be removed as well.");
|
2009-01-01 16:38:16 +01:00
|
|
|
}
|
|
|
|
return undef;
|
|
|
|
}
|
|
|
|
|
2009-01-26 23:02:31 +01:00
|
|
|
sub canrename (@) {
|
2009-01-01 18:04:37 +01:00
|
|
|
my %params = @_;
|
2009-01-26 23:02:31 +01:00
|
|
|
my $session = $params{session};
|
2009-01-01 16:50:24 +01:00
|
|
|
|
2009-01-01 18:04:37 +01:00
|
|
|
if (istranslation($params{src})) {
|
|
|
|
my $masterpage = masterpage($params{src});
|
2009-01-01 17:49:10 +01:00
|
|
|
# Tell the difference between:
|
|
|
|
# - a translation being renamed as a consequence of its master page
|
|
|
|
# being renamed, which is allowed
|
|
|
|
# - a user trying to directly rename a translation, which is forbidden
|
|
|
|
# by looking for the master page in the list of to-be-renamed pages we
|
|
|
|
# saved early in the renaming process.
|
|
|
|
my $orig_torename = $session->param("po_orig_torename");
|
2009-03-08 11:44:00 +01:00
|
|
|
unless (grep { $_ eq $masterpage } @{$orig_torename}) {
|
2009-07-23 00:50:42 +02:00
|
|
|
return gettext("Can not rename a translation. If the master page is renamed, ".
|
|
|
|
"however, its translations will be renamed as well.");
|
2009-01-01 17:49:10 +01:00
|
|
|
}
|
2009-01-01 16:50:24 +01:00
|
|
|
}
|
|
|
|
return undef;
|
|
|
|
}
|
|
|
|
|
2008-11-11 14:11:34 +01:00
|
|
|
# As we're previewing or saving a page, the content may have
|
|
|
|
# changed, so tell the next filter() invocation it must not be lazy.
|
2008-12-31 23:54:21 +01:00
|
|
|
sub editcontent () {
|
2008-11-04 17:56:42 +01:00
|
|
|
my %params=@_;
|
2008-11-11 14:11:34 +01:00
|
|
|
|
2008-11-10 13:49:14 +01:00
|
|
|
unsetalreadyfiltered($params{page}, $params{page});
|
2008-11-04 17:56:42 +01:00
|
|
|
return $params{content};
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-11-04 17:56:42 +01:00
|
|
|
|
2009-01-02 12:15:21 +01:00
|
|
|
sub formbuilder_setup (@) {
|
|
|
|
my %params=@_;
|
|
|
|
my $form=$params{form};
|
|
|
|
my $q=$params{cgi};
|
|
|
|
|
2009-01-02 15:50:47 +01:00
|
|
|
return unless defined $form->field("do");
|
2009-01-02 12:15:21 +01:00
|
|
|
|
2009-01-02 15:50:47 +01:00
|
|
|
if ($form->field("do") eq "create") {
|
|
|
|
# Warn the user: new pages must be written in master language.
|
|
|
|
my $template=template("pocreatepage.tmpl");
|
2010-09-10 19:13:00 +02:00
|
|
|
$template->param(LANG => $master_language_name);
|
2009-01-02 15:50:47 +01:00
|
|
|
$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);
|
|
|
|
}
|
|
|
|
}
|
2009-01-02 12:15:21 +01:00
|
|
|
}
|
|
|
|
|
2009-01-02 13:43:40 +01:00
|
|
|
sub formbuilder (@) {
|
|
|
|
my %params=@_;
|
|
|
|
my $form=$params{form};
|
|
|
|
my $q=$params{cgi};
|
|
|
|
|
2009-01-02 17:51:17 +01:00
|
|
|
return unless defined $form->field("do");
|
2009-01-02 13:43:40 +01:00
|
|
|
|
2009-01-02 17:51:17 +01:00
|
|
|
# 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") {
|
2010-07-23 20:26:57 +02:00
|
|
|
foreach my $field ($form->field) {
|
2009-01-02 17:51:17 +01:00
|
|
|
next unless "$field" eq "type";
|
2009-08-28 13:12:58 +02:00
|
|
|
next unless $field->type eq 'select';
|
|
|
|
my $orig_value = $field->value;
|
|
|
|
# remove po from the list of types
|
|
|
|
my @types = grep { $_->[0] ne 'po' } $field->options;
|
|
|
|
$field->options(\@types) if @types;
|
|
|
|
# favor the type of linking page's masterpage
|
|
|
|
if ($orig_value eq 'po') {
|
|
|
|
my ($from, $type);
|
|
|
|
if (defined $form->field('from')) {
|
|
|
|
($from)=$form->field('from')=~/$config{wiki_file_regexp}/;
|
|
|
|
$from = masterpage($from);
|
|
|
|
}
|
|
|
|
if (defined $from && exists $pagesources{$from}) {
|
|
|
|
$type=pagetype($pagesources{$from});
|
|
|
|
}
|
|
|
|
$type=$config{default_pageext} unless defined $type;
|
|
|
|
$field->value($type) ;
|
2009-01-02 17:51:17 +01:00
|
|
|
}
|
2009-01-02 13:43:40 +01:00
|
|
|
}
|
2009-01-02 17:51:17 +01:00
|
|
|
}
|
2009-01-02 13:43:40 +01:00
|
|
|
}
|
2008-11-11 04:05:39 +01:00
|
|
|
|
|
|
|
# ,----
|
|
|
|
# | Injected functions
|
|
|
|
# `----
|
|
|
|
|
2008-11-11 22:26:01 +01:00
|
|
|
# Implement po_link_to 'current' and 'negotiated' settings.
|
2008-12-31 23:54:21 +01:00
|
|
|
sub mybestlink ($$) {
|
2008-11-11 04:05:39 +01:00
|
|
|
my $page=shift;
|
|
|
|
my $link=shift;
|
|
|
|
|
2009-08-30 20:49:53 +02:00
|
|
|
return $origsubs{'bestlink'}->($page, $link)
|
2010-04-24 22:44:45 +02:00
|
|
|
if defined $config{po_link_to} && $config{po_link_to} eq "default";
|
2009-08-30 20:49:53 +02:00
|
|
|
|
2008-11-12 15:04:50 +01:00
|
|
|
my $res=$origsubs{'bestlink'}->(masterpage($page), $link);
|
2009-08-28 16:34:58 +02:00
|
|
|
my @caller = caller(1);
|
2008-11-11 14:11:34 +01:00
|
|
|
if (length $res
|
2010-08-02 12:09:15 +02:00
|
|
|
&& istranslatedto($res, lang($page))
|
2009-08-28 16:34:58 +02:00
|
|
|
&& istranslation($page)
|
|
|
|
&& !(exists $caller[3] && defined $caller[3]
|
|
|
|
&& ($caller[3] eq "IkiWiki::PageSpec::match_link"))) {
|
2008-11-11 14:11:34 +01:00
|
|
|
return $res . "." . lang($page);
|
2008-11-11 04:05:39 +01:00
|
|
|
}
|
2008-11-11 14:11:34 +01:00
|
|
|
return $res;
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-11-11 04:05:39 +01:00
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub mybeautify_urlpath ($) {
|
2008-11-11 04:05:39 +01:00
|
|
|
my $url=shift;
|
|
|
|
|
|
|
|
my $res=$origsubs{'beautify_urlpath'}->($url);
|
2010-04-24 22:44:45 +02:00
|
|
|
if (defined $config{po_link_to} && $config{po_link_to} eq "negotiated") {
|
2010-09-10 19:13:00 +02:00
|
|
|
$res =~ s!/\Qindex.$master_language_code.$config{htmlext}\E$!/!;
|
2008-11-11 18:42:14 +01:00
|
|
|
$res =~ s!/\Qindex.$config{htmlext}\E$!/!;
|
2008-11-11 22:26:01 +01:00
|
|
|
map {
|
|
|
|
$res =~ s!/\Qindex.$_.$config{htmlext}\E$!/!;
|
2010-07-20 02:26:23 +02:00
|
|
|
} @slavelanguages;
|
2008-11-11 04:05:39 +01:00
|
|
|
}
|
|
|
|
return $res;
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-11-11 04:05:39 +01:00
|
|
|
|
2011-03-25 00:44:32 +01:00
|
|
|
sub mytargetpage ($$;$) {
|
2008-11-11 04:05:39 +01:00
|
|
|
my $page=shift;
|
|
|
|
my $ext=shift;
|
2011-03-25 00:44:32 +01:00
|
|
|
my $filename=shift;
|
2008-11-11 04:05:39 +01:00
|
|
|
|
2008-11-11 14:11:34 +01:00
|
|
|
if (istranslation($page) || istranslatable($page)) {
|
2008-11-11 04:05:39 +01:00
|
|
|
my ($masterpage, $lang) = (masterpage($page), lang($page));
|
2011-03-25 00:44:32 +01:00
|
|
|
if (defined $filename) {
|
|
|
|
return $masterpage . "/" . $filename . "." . $lang . "." . $ext;
|
|
|
|
}
|
|
|
|
elsif (! $config{usedirs} || $masterpage eq 'index') {
|
2008-11-11 04:05:39 +01:00
|
|
|
return $masterpage . "." . $lang . "." . $ext;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return $masterpage . "/index." . $lang . "." . $ext;
|
|
|
|
}
|
|
|
|
}
|
2011-03-25 00:44:32 +01:00
|
|
|
return $origsubs{'targetpage'}->($page, $ext, $filename);
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-11-11 04:05:39 +01:00
|
|
|
|
2010-12-20 14:36:21 +01:00
|
|
|
sub myurlto ($;$$) {
|
2008-11-11 04:05:39 +01:00
|
|
|
my $to=shift;
|
|
|
|
my $from=shift;
|
|
|
|
my $absolute=shift;
|
|
|
|
|
|
|
|
# workaround hard-coded /index.$config{htmlext} in IkiWiki::urlto()
|
|
|
|
if (! length $to
|
|
|
|
&& $config{po_link_to} eq "current"
|
|
|
|
&& istranslatable('index')) {
|
2010-12-20 14:36:21 +01:00
|
|
|
if (defined $from) {
|
|
|
|
return IkiWiki::beautify_urlpath(IkiWiki::baseurl($from) . "index." . lang($from) . ".$config{htmlext}");
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return $origsubs{'urlto'}->($to,$from,$absolute);
|
|
|
|
}
|
2008-11-11 04:05:39 +01:00
|
|
|
}
|
2008-12-31 13:02:48 +01:00
|
|
|
# avoid using our injected beautify_urlpath if run by cgi_editpage,
|
|
|
|
# so that one is redirected to the just-edited page rather than to the
|
|
|
|
# negociated translation; to prevent unnecessary fiddling with caller/inject,
|
|
|
|
# we only do so when our beautify_urlpath would actually do what we want to
|
2009-08-26 07:56:33 +02:00
|
|
|
# avoid, i.e. when po_link_to = negotiated.
|
|
|
|
# also avoid doing so when run by cgi_goto, so that the links on recentchanges
|
|
|
|
# page actually lead to the exact page they pretend to.
|
2008-12-31 13:02:48 +01:00
|
|
|
if ($config{po_link_to} eq "negotiated") {
|
|
|
|
my @caller = caller(1);
|
2009-08-26 07:56:33 +02:00
|
|
|
my $use_orig = 0;
|
|
|
|
$use_orig = 1 if (exists $caller[3] && defined $caller[3]
|
|
|
|
&& ($caller[3] eq "IkiWiki::cgi_editpage" ||
|
|
|
|
$caller[3] eq "IkiWiki::Plugin::goto::cgi_goto")
|
|
|
|
);
|
2008-12-31 13:02:48 +01:00
|
|
|
inject(name => "IkiWiki::beautify_urlpath", call => $origsubs{'beautify_urlpath'})
|
2009-08-26 07:56:33 +02:00
|
|
|
if $use_orig;
|
2008-12-31 13:02:48 +01:00
|
|
|
my $res = $origsubs{'urlto'}->($to,$from,$absolute);
|
|
|
|
inject(name => "IkiWiki::beautify_urlpath", call => \&mybeautify_urlpath)
|
2009-08-26 07:56:33 +02:00
|
|
|
if $use_orig;
|
2008-12-31 13:02:48 +01:00
|
|
|
return $res;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return $origsubs{'urlto'}->($to,$from,$absolute)
|
|
|
|
}
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-11-11 04:05:39 +01:00
|
|
|
|
2009-01-15 21:49:32 +01:00
|
|
|
sub mycgiurl (@) {
|
|
|
|
my %params=@_;
|
|
|
|
|
|
|
|
# slave pages have no subpages
|
|
|
|
if (istranslation($params{'from'})) {
|
|
|
|
$params{'from'} = masterpage($params{'from'});
|
|
|
|
}
|
|
|
|
return $origsubs{'cgiurl'}->(%params);
|
|
|
|
}
|
|
|
|
|
2009-08-28 15:00:16 +02:00
|
|
|
sub myrootpage (@) {
|
|
|
|
my %params=@_;
|
|
|
|
|
|
|
|
my $rootpage;
|
|
|
|
if (exists $params{rootpage}) {
|
|
|
|
$rootpage=$origsubs{'bestlink'}->($params{page}, $params{rootpage});
|
|
|
|
if (!length $rootpage) {
|
|
|
|
$rootpage=$params{rootpage};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
$rootpage=masterpage($params{page});
|
|
|
|
}
|
|
|
|
return $rootpage;
|
|
|
|
}
|
|
|
|
|
2010-01-09 22:54:34 +01:00
|
|
|
sub myisselflink ($$) {
|
|
|
|
my $page=shift;
|
|
|
|
my $link=shift;
|
|
|
|
|
|
|
|
return 1 if $origsubs{'isselflink'}->($page, $link);
|
|
|
|
if (istranslation($page)) {
|
|
|
|
return $origsubs{'isselflink'}->(masterpage($page), $link);
|
2010-07-23 20:26:57 +02:00
|
|
|
}
|
2010-01-09 22:54:34 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2008-11-11 04:05:39 +01:00
|
|
|
# ,----
|
|
|
|
# | Blackboxes for private data
|
|
|
|
# `----
|
|
|
|
|
|
|
|
{
|
|
|
|
my %filtered;
|
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub alreadyfiltered($$) {
|
2008-11-11 04:05:39 +01:00
|
|
|
my $page=shift;
|
|
|
|
my $destpage=shift;
|
|
|
|
|
2009-01-26 19:28:57 +01:00
|
|
|
return exists $filtered{$page}{$destpage}
|
|
|
|
&& $filtered{$page}{$destpage} eq 1;
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-11-11 04:05:39 +01:00
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub setalreadyfiltered($$) {
|
2008-11-11 04:05:39 +01:00
|
|
|
my $page=shift;
|
|
|
|
my $destpage=shift;
|
|
|
|
|
|
|
|
$filtered{$page}{$destpage}=1;
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-11-11 04:05:39 +01:00
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub unsetalreadyfiltered($$) {
|
2008-11-11 04:05:39 +01:00
|
|
|
my $page=shift;
|
|
|
|
my $destpage=shift;
|
|
|
|
|
|
|
|
if (exists $filtered{$page}{$destpage}) {
|
|
|
|
delete $filtered{$page}{$destpage};
|
|
|
|
}
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-11-11 04:05:39 +01:00
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub resetalreadyfiltered() {
|
2008-11-11 04:05:39 +01:00
|
|
|
undef %filtered;
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-11-11 04:05:39 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
# ,----
|
|
|
|
# | Helper functions
|
|
|
|
# `----
|
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub maybe_add_leading_slash ($;$) {
|
2008-11-12 17:27:53 +01:00
|
|
|
my $str=shift;
|
|
|
|
my $add=shift;
|
|
|
|
$add=1 unless defined $add;
|
|
|
|
return '/' . $str if $add;
|
|
|
|
return $str;
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-11-12 17:27:53 +01:00
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub istranslatablefile ($) {
|
2008-11-13 00:56:23 +01:00
|
|
|
my $file=shift;
|
2008-10-05 17:14:30 +02:00
|
|
|
|
2008-11-11 14:11:34 +01:00
|
|
|
return 0 unless defined $file;
|
2009-07-19 13:46:10 +02:00
|
|
|
my $type=pagetype($file);
|
|
|
|
return 0 if ! defined $type || $type eq 'po';
|
2008-11-11 14:11:34 +01:00
|
|
|
return 0 if $file =~ /\.pot$/;
|
2010-04-24 22:44:45 +02:00
|
|
|
return 0 if ! defined $config{po_translatable_pages};
|
2008-11-13 00:56:23 +01:00
|
|
|
return 1 if pagespec_match(pagename($file), $config{po_translatable_pages});
|
|
|
|
return;
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-11-13 00:56:23 +01:00
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub istranslatable ($) {
|
2008-11-13 00:56:23 +01:00
|
|
|
my $page=shift;
|
|
|
|
|
|
|
|
$page=~s#^/##;
|
|
|
|
return 1 if istranslatablefile($pagesources{$page});
|
2008-11-12 22:32:47 +01:00
|
|
|
return;
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-10-10 21:47:20 +02:00
|
|
|
|
2010-08-02 12:09:15 +02:00
|
|
|
sub istranslatedto ($$) {
|
|
|
|
my $page=shift;
|
|
|
|
my $destlang = shift;
|
|
|
|
|
|
|
|
$page=~s#^/##;
|
|
|
|
return 0 unless istranslatable($page);
|
|
|
|
exists $pagesources{otherlanguage_page($page, $destlang)};
|
|
|
|
}
|
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub _istranslation ($) {
|
2008-10-10 21:47:20 +02:00
|
|
|
my $page=shift;
|
2008-11-05 21:18:07 +01:00
|
|
|
|
2009-01-26 19:24:33 +01:00
|
|
|
$page='' unless defined $page && length $page;
|
2008-11-12 17:27:53 +01:00
|
|
|
my $hasleadingslash = ($page=~s#^/##);
|
2008-10-10 21:47:20 +02:00
|
|
|
my $file=$pagesources{$page};
|
2009-01-26 19:24:33 +01:00
|
|
|
return 0 unless defined $file
|
2008-11-11 14:11:34 +01:00
|
|
|
&& defined pagetype($file)
|
2009-01-26 19:24:33 +01:00
|
|
|
&& pagetype($file) eq 'po';
|
2008-11-11 14:11:34 +01:00
|
|
|
return 0 if $file =~ /\.pot$/;
|
2008-10-05 17:14:30 +02:00
|
|
|
|
2011-05-25 18:01:40 +02:00
|
|
|
my ($masterpage, $lang) = ($page =~ /(.*)[.]($language_code_pattern)$/);
|
2009-01-26 19:24:33 +01:00
|
|
|
return 0 unless defined $masterpage && defined $lang
|
2008-11-11 14:11:34 +01:00
|
|
|
&& length $masterpage && length $lang
|
|
|
|
&& defined $pagesources{$masterpage}
|
2010-09-10 20:04:43 +02:00
|
|
|
&& defined $slavelanguages{$lang};
|
2008-10-05 17:14:30 +02:00
|
|
|
|
2008-11-12 17:52:00 +01:00
|
|
|
return (maybe_add_leading_slash($masterpage, $hasleadingslash), $lang)
|
|
|
|
if istranslatable($masterpage);
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-10-10 17:10:40 +02:00
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub istranslation ($) {
|
2008-10-11 03:41:12 +02:00
|
|
|
my $page=shift;
|
2008-11-05 21:18:07 +01:00
|
|
|
|
2008-11-10 20:35:53 +01:00
|
|
|
if (1 < (my ($masterpage, $lang) = _istranslation($page))) {
|
2008-11-12 17:27:53 +01:00
|
|
|
my $hasleadingslash = ($masterpage=~s#^/##);
|
2008-10-11 03:41:12 +02:00
|
|
|
$translations{$masterpage}{$lang}=$page unless exists $translations{$masterpage}{$lang};
|
2008-11-12 22:32:47 +01:00
|
|
|
return (maybe_add_leading_slash($masterpage, $hasleadingslash), $lang);
|
2008-11-10 20:35:53 +01:00
|
|
|
}
|
2009-01-26 19:21:33 +01:00
|
|
|
return "";
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-11-10 20:35:53 +01:00
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub masterpage ($) {
|
2008-11-10 20:35:53 +01:00
|
|
|
my $page=shift;
|
|
|
|
|
|
|
|
if ( 1 < (my ($masterpage, $lang) = _istranslation($page))) {
|
|
|
|
return $masterpage;
|
|
|
|
}
|
|
|
|
return $page;
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-11-10 20:35:53 +01:00
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub lang ($) {
|
2008-11-10 20:35:53 +01:00
|
|
|
my $page=shift;
|
|
|
|
|
|
|
|
if (1 < (my ($masterpage, $lang) = _istranslation($page))) {
|
|
|
|
return $lang;
|
2008-10-11 03:41:12 +02:00
|
|
|
}
|
2010-09-10 19:13:00 +02:00
|
|
|
return $master_language_code;
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-10-11 03:41:12 +02:00
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub islanguagecode ($) {
|
2008-11-11 04:05:39 +01:00
|
|
|
my $code=shift;
|
2008-11-11 14:11:34 +01:00
|
|
|
|
2011-05-25 18:01:40 +02:00
|
|
|
return $code =~ /^$language_code_pattern$/;
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-11-11 04:05:39 +01:00
|
|
|
|
2010-07-20 02:25:17 +02:00
|
|
|
sub otherlanguage_page ($$) {
|
2008-11-12 23:22:26 +01:00
|
|
|
my $page=shift;
|
|
|
|
my $code=shift;
|
|
|
|
|
2010-09-10 19:13:00 +02:00
|
|
|
return masterpage($page) if $code eq $master_language_code;
|
2008-11-12 23:22:26 +01:00
|
|
|
return masterpage($page) . '.' . $code;
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-11-12 23:22:26 +01:00
|
|
|
|
2010-07-20 02:25:17 +02:00
|
|
|
# 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 ($) {
|
2008-11-11 04:05:39 +01:00
|
|
|
my $page=shift;
|
|
|
|
|
2010-07-20 02:25:17 +02:00
|
|
|
my @ret;
|
|
|
|
return \@ret unless istranslation($page) || istranslatable($page);
|
2008-11-12 23:22:26 +01:00
|
|
|
my $curlang=lang($page);
|
|
|
|
foreach my $lang
|
2010-09-10 19:13:00 +02:00
|
|
|
($master_language_code, @slavelanguages) {
|
2008-11-12 23:22:26 +01:00
|
|
|
next if $lang eq $curlang;
|
2010-09-10 19:13:00 +02:00
|
|
|
if ($lang eq $master_language_code ||
|
2010-08-02 13:10:28 +02:00
|
|
|
istranslatedto(masterpage($page), $lang)) {
|
|
|
|
push @ret, $lang;
|
|
|
|
}
|
2008-11-11 04:05:39 +01:00
|
|
|
}
|
2010-07-20 02:25:17 +02:00
|
|
|
return \@ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
sub otherlanguages_pages ($) {
|
|
|
|
my $page=shift;
|
|
|
|
|
2010-07-23 20:26:57 +02:00
|
|
|
my %ret;
|
2010-07-20 02:25:17 +02:00
|
|
|
map {
|
|
|
|
$ret{$_} = otherlanguage_page($page, $_)
|
|
|
|
} @{otherlanguages_codes($page)};
|
|
|
|
|
2008-11-11 04:05:39 +01:00
|
|
|
return \%ret;
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-11-11 04:05:39 +01:00
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub potfile ($) {
|
2008-11-11 04:05:39 +01:00
|
|
|
my $masterfile=shift;
|
|
|
|
|
|
|
|
(my $name, my $dir, my $suffix) = fileparse($masterfile, qr/\.[^.]*/);
|
|
|
|
$dir='' if $dir eq './';
|
|
|
|
return File::Spec->catpath('', $dir, $name . ".pot");
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-11-11 04:05:39 +01:00
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub pofile ($$) {
|
2008-11-11 04:05:39 +01:00
|
|
|
my $masterfile=shift;
|
|
|
|
my $lang=shift;
|
|
|
|
|
|
|
|
(my $name, my $dir, my $suffix) = fileparse($masterfile, qr/\.[^.]*/);
|
|
|
|
$dir='' if $dir eq './';
|
|
|
|
return File::Spec->catpath('', $dir, $name . "." . $lang . ".po");
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-11-11 04:05:39 +01:00
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub pofiles ($) {
|
2008-11-11 04:05:39 +01:00
|
|
|
my $masterfile=shift;
|
2008-11-11 14:11:34 +01:00
|
|
|
|
2010-07-20 02:26:23 +02:00
|
|
|
return map pofile($masterfile, $_), @slavelanguages;
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-11-11 04:05:39 +01:00
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub refreshpot ($) {
|
2008-11-11 04:05:39 +01:00
|
|
|
my $masterfile=shift;
|
|
|
|
|
|
|
|
my $potfile=potfile($masterfile);
|
2010-06-25 23:18:34 +02:00
|
|
|
my $doc=Locale::Po4a::Chooser::new(po4a_type($masterfile),
|
|
|
|
po4a_options($masterfile));
|
2008-11-11 04:05:39 +01:00
|
|
|
$doc->{TT}{utf_mode} = 1;
|
2010-06-26 01:16:56 +02:00
|
|
|
$doc->{TT}{file_in_charset} = 'UTF-8';
|
|
|
|
$doc->{TT}{file_out_charset} = 'UTF-8';
|
2008-11-11 04:05:39 +01:00
|
|
|
$doc->read($masterfile);
|
2009-03-29 21:48:26 +02:00
|
|
|
# let's cheat a bit to force porefs option to be passed to
|
|
|
|
# Locale::Po4a::Po; this is undocument use of internal
|
|
|
|
# Locale::Po4a::TransTractor's data, compulsory since this module
|
|
|
|
# prevents us from using the porefs option.
|
2009-01-01 00:58:06 +01:00
|
|
|
$doc->{TT}{po_out}=Locale::Po4a::Po->new({ 'porefs' => 'none' });
|
2010-06-26 01:16:56 +02:00
|
|
|
$doc->{TT}{po_out}->set_charset('UTF-8');
|
2008-11-11 04:05:39 +01:00
|
|
|
# do the actual work
|
|
|
|
$doc->parse;
|
|
|
|
IkiWiki::prep_writefile(basename($potfile),dirname($potfile));
|
|
|
|
$doc->writepo($potfile);
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-11-11 04:05:39 +01:00
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub refreshpofiles ($@) {
|
2008-11-11 04:05:39 +01:00
|
|
|
my $masterfile=shift;
|
|
|
|
my @pofiles=@_;
|
|
|
|
|
|
|
|
my $potfile=potfile($masterfile);
|
2009-01-26 19:10:37 +01:00
|
|
|
if (! -e $potfile) {
|
|
|
|
error("po(refreshpofiles) ".sprintf(gettext("POT file (%s) does not exist"), $potfile));
|
|
|
|
}
|
2008-11-11 04:05:39 +01:00
|
|
|
|
|
|
|
foreach my $pofile (@pofiles) {
|
|
|
|
IkiWiki::prep_writefile(basename($pofile),dirname($pofile));
|
2009-08-10 21:59:32 +02:00
|
|
|
|
|
|
|
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));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-11-11 04:05:39 +01:00
|
|
|
if (-e $pofile) {
|
2009-07-22 17:48:49 +02:00
|
|
|
system("msgmerge", "--previous", "-q", "-U", "--backup=none", $pofile, $potfile) == 0
|
2009-01-02 17:24:54 +01:00
|
|
|
or error("po(refreshpofiles) ".
|
|
|
|
sprintf(gettext("failed to update %s"),
|
2009-01-02 15:00:34 +01:00
|
|
|
$pofile));
|
2008-11-11 04:05:39 +01:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
File::Copy::syscopy($potfile,$pofile)
|
2009-01-02 17:24:54 +01:00
|
|
|
or error("po(refreshpofiles) ".
|
|
|
|
sprintf(gettext("failed to copy the POT file to %s"),
|
2009-01-02 15:00:34 +01:00
|
|
|
$pofile));
|
2008-11-11 04:05:39 +01:00
|
|
|
}
|
|
|
|
}
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-11-11 04:05:39 +01:00
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub buildtranslationscache() {
|
2008-11-11 04:05:39 +01:00
|
|
|
# use istranslation's side-effect
|
|
|
|
map istranslation($_), (keys %pagesources);
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-11-11 04:05:39 +01:00
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub resettranslationscache() {
|
2008-11-11 04:05:39 +01:00
|
|
|
undef %translations;
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-11-11 04:05:39 +01:00
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub flushmemoizecache() {
|
2008-11-12 22:32:47 +01:00
|
|
|
Memoize::flush_cache("istranslatable");
|
2008-11-12 21:15:33 +01:00
|
|
|
Memoize::flush_cache("_istranslation");
|
|
|
|
Memoize::flush_cache("percenttranslated");
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-11-12 21:15:33 +01:00
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub urlto_with_orig_beautiful_urlpath($$) {
|
2008-11-11 04:05:39 +01:00
|
|
|
my $to=shift;
|
|
|
|
my $from=shift;
|
|
|
|
|
|
|
|
inject(name => "IkiWiki::beautify_urlpath", call => $origsubs{'beautify_urlpath'});
|
|
|
|
my $res=urlto($to, $from);
|
|
|
|
inject(name => "IkiWiki::beautify_urlpath", call => \&mybeautify_urlpath);
|
|
|
|
|
|
|
|
return $res;
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-11-11 04:05:39 +01:00
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub percenttranslated ($) {
|
2008-11-11 04:05:39 +01:00
|
|
|
my $page=shift;
|
|
|
|
|
2008-12-31 16:31:18 +01:00
|
|
|
$page=~s/^\///;
|
2009-08-16 04:18:05 +02:00
|
|
|
return gettext("N/A") unless istranslation($page);
|
2008-11-11 04:05:39 +01:00
|
|
|
my $file=srcfile($pagesources{$page});
|
|
|
|
my $masterfile = srcfile($pagesources{masterpage($page)});
|
2010-06-25 23:18:34 +02:00
|
|
|
my $doc=Locale::Po4a::Chooser::new(po4a_type($masterfile),
|
|
|
|
po4a_options($masterfile));
|
2008-11-11 04:05:39 +01:00
|
|
|
$doc->process(
|
2009-01-01 00:58:06 +01:00
|
|
|
'po_in_name' => [ $file ],
|
|
|
|
'file_in_name' => [ $masterfile ],
|
2010-06-26 01:16:56 +02:00
|
|
|
'file_in_charset' => 'UTF-8',
|
|
|
|
'file_out_charset' => 'UTF-8',
|
2009-01-02 17:24:54 +01:00
|
|
|
) or error("po(percenttranslated) ".
|
|
|
|
sprintf(gettext("failed to translate %s"), $page));
|
2008-11-11 04:05:39 +01:00
|
|
|
my ($percent,$hit,$queries) = $doc->stats();
|
2009-01-02 12:35:46 +01:00
|
|
|
$percent =~ s/\.[0-9]+$//;
|
2008-11-11 04:05:39 +01:00
|
|
|
return $percent;
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-11-11 04:05:39 +01:00
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub languagename ($) {
|
2008-11-11 04:05:39 +01:00
|
|
|
my $code=shift;
|
|
|
|
|
2010-09-10 19:13:00 +02:00
|
|
|
return $master_language_name
|
|
|
|
if $code eq $master_language_code;
|
2010-09-10 20:04:43 +02:00
|
|
|
return $slavelanguages{$code}
|
|
|
|
if defined $slavelanguages{$code};
|
2008-11-11 04:05:39 +01:00
|
|
|
return;
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-11-11 04:05:39 +01:00
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub otherlanguagesloop ($) {
|
2008-11-11 04:05:39 +01:00
|
|
|
my $page=shift;
|
|
|
|
|
|
|
|
my @ret;
|
2010-07-20 02:25:17 +02:00
|
|
|
if (istranslation($page)) {
|
|
|
|
push @ret, {
|
|
|
|
url => urlto_with_orig_beautiful_urlpath(masterpage($page), $page),
|
2010-09-10 19:13:00 +02:00
|
|
|
code => $master_language_code,
|
|
|
|
language => $master_language_name,
|
2010-07-20 02:25:17 +02:00
|
|
|
master => 1,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
foreach my $lang (@{otherlanguages_codes($page)}) {
|
2010-09-10 19:13:00 +02:00
|
|
|
next if $lang eq $master_language_code;
|
2010-07-20 02:25:17 +02:00
|
|
|
my $otherpage = otherlanguage_page($page, $lang);
|
|
|
|
push @ret, {
|
|
|
|
url => urlto_with_orig_beautiful_urlpath($otherpage, $page),
|
|
|
|
code => $lang,
|
|
|
|
language => languagename($lang),
|
|
|
|
percent => percenttranslated($otherpage),
|
2008-11-11 04:05:39 +01:00
|
|
|
}
|
|
|
|
}
|
2010-07-20 02:25:17 +02:00
|
|
|
return @ret;
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-11-11 04:05:39 +01:00
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub homepageurl (;$) {
|
2008-11-11 15:27:39 +01:00
|
|
|
my $page=shift;
|
|
|
|
|
|
|
|
return urlto('', $page);
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-11-11 04:05:39 +01:00
|
|
|
|
2009-08-27 20:19:17 +02:00
|
|
|
sub ishomepage ($) {
|
|
|
|
my $page = shift;
|
|
|
|
|
|
|
|
return 1 if $page eq 'index';
|
2010-07-20 02:26:23 +02:00
|
|
|
map { return 1 if $page eq 'index.'.$_ } @slavelanguages;
|
2009-08-27 20:19:17 +02:00
|
|
|
return undef;
|
|
|
|
}
|
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub deletetranslations ($) {
|
2008-11-13 03:55:55 +01:00
|
|
|
my $deletedmasterfile=shift;
|
|
|
|
|
2008-12-31 00:38:47 +01:00
|
|
|
my $deletedmasterpage=pagename($deletedmasterfile);
|
|
|
|
my @todelete;
|
|
|
|
map {
|
|
|
|
my $file = newpagefile($deletedmasterpage.'.'.$_, 'po');
|
|
|
|
my $absfile = "$config{srcdir}/$file";
|
|
|
|
if (-e $absfile && ! -l $absfile && ! -d $absfile) {
|
|
|
|
push @todelete, $file;
|
|
|
|
}
|
2010-07-20 02:26:23 +02:00
|
|
|
} @slavelanguages;
|
2008-12-31 00:38:47 +01:00
|
|
|
|
|
|
|
map {
|
|
|
|
if ($config{rcs}) {
|
|
|
|
IkiWiki::rcs_remove($_);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
IkiWiki::prune("$config{srcdir}/$_");
|
|
|
|
}
|
|
|
|
} @todelete;
|
|
|
|
|
2009-01-26 19:17:14 +01:00
|
|
|
if (@todelete) {
|
2008-12-31 00:38:47 +01:00
|
|
|
commit_and_refresh(
|
2010-06-23 22:56:50 +02:00
|
|
|
gettext("removed obsolete PO files"));
|
2008-12-31 00:38:47 +01:00
|
|
|
}
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-12-31 00:38:47 +01:00
|
|
|
|
2010-06-23 22:56:50 +02:00
|
|
|
sub commit_and_refresh ($) {
|
|
|
|
my $msg = shift;
|
2008-12-31 00:38:47 +01:00
|
|
|
|
|
|
|
if ($config{rcs}) {
|
|
|
|
IkiWiki::disable_commit_hook();
|
2010-06-23 22:56:50 +02:00
|
|
|
IkiWiki::rcs_commit_staged(
|
|
|
|
message => $msg,
|
|
|
|
);
|
2008-12-31 00:38:47 +01:00
|
|
|
IkiWiki::enable_commit_hook();
|
|
|
|
IkiWiki::rcs_update();
|
|
|
|
}
|
|
|
|
# Reinitialize module's private variables.
|
|
|
|
resetalreadyfiltered();
|
|
|
|
resettranslationscache();
|
|
|
|
flushmemoizecache();
|
|
|
|
# Trigger a wiki refresh.
|
|
|
|
require IkiWiki::Render;
|
|
|
|
# without preliminary saveindex/loadindex, refresh()
|
|
|
|
# complains about a lot of uninitialized variables
|
|
|
|
IkiWiki::saveindex();
|
|
|
|
IkiWiki::loadindex();
|
|
|
|
IkiWiki::refresh();
|
|
|
|
IkiWiki::saveindex();
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-11-13 03:55:55 +01:00
|
|
|
|
2010-01-21 21:23:25 +01:00
|
|
|
sub po_to_markup ($$) {
|
2009-01-01 21:56:36 +01:00
|
|
|
my ($page, $content) = (shift, shift);
|
|
|
|
|
|
|
|
$content = '' unless defined $content;
|
|
|
|
$content = decode_utf8(encode_utf8($content));
|
|
|
|
# CRLF line terminators make poor Locale::Po4a feel bad
|
|
|
|
$content=~s/\r\n/\n/g;
|
|
|
|
|
|
|
|
# There are incompatibilities between some File::Temp versions
|
|
|
|
# (including 0.18, bundled with Lenny's perl-modules package)
|
|
|
|
# and others (e.g. 0.20, previously present in the archive as
|
|
|
|
# a standalone package): under certain circumstances, some
|
|
|
|
# return a relative filename, whereas others return an absolute one;
|
|
|
|
# we here use this module in a way that is at least compatible
|
|
|
|
# with 0.18 and 0.20. Beware, hit'n'run refactorers!
|
|
|
|
my $infile = new File::Temp(TEMPLATE => "ikiwiki-po-filter-in.XXXXXXXXXX",
|
|
|
|
DIR => File::Spec->tmpdir,
|
|
|
|
UNLINK => 1)->filename;
|
|
|
|
my $outfile = new File::Temp(TEMPLATE => "ikiwiki-po-filter-out.XXXXXXXXXX",
|
|
|
|
DIR => File::Spec->tmpdir,
|
|
|
|
UNLINK => 1)->filename;
|
|
|
|
|
2009-01-02 15:14:58 +01:00
|
|
|
my $fail = sub ($) {
|
2009-01-02 15:00:34 +01:00
|
|
|
my $msg = "po(po_to_markup) - $page : " . shift;
|
2009-01-01 21:56:36 +01:00
|
|
|
error($msg, sub { unlink $infile, $outfile});
|
2009-01-02 15:14:58 +01:00
|
|
|
};
|
2009-01-01 21:56:36 +01:00
|
|
|
|
|
|
|
writefile(basename($infile), File::Spec->tmpdir, $content)
|
2009-01-02 15:14:58 +01:00
|
|
|
or return $fail->(sprintf(gettext("failed to write %s"), $infile));
|
2009-01-01 21:56:36 +01:00
|
|
|
|
|
|
|
my $masterfile = srcfile($pagesources{masterpage($page)});
|
2010-06-25 23:18:34 +02:00
|
|
|
my $doc=Locale::Po4a::Chooser::new(po4a_type($masterfile),
|
|
|
|
po4a_options($masterfile));
|
2009-01-01 21:56:36 +01:00
|
|
|
$doc->process(
|
|
|
|
'po_in_name' => [ $infile ],
|
|
|
|
'file_in_name' => [ $masterfile ],
|
2010-06-26 01:16:56 +02:00
|
|
|
'file_in_charset' => 'UTF-8',
|
|
|
|
'file_out_charset' => 'UTF-8',
|
2009-01-02 15:14:58 +01:00
|
|
|
) or return $fail->(gettext("failed to translate"));
|
2009-01-02 15:00:34 +01:00
|
|
|
$doc->write($outfile)
|
2009-01-02 15:14:58 +01:00
|
|
|
or return $fail->(sprintf(gettext("failed to write %s"), $outfile));
|
2009-01-01 21:56:36 +01:00
|
|
|
|
2010-01-21 21:23:25 +01:00
|
|
|
$content = readfile($outfile);
|
2009-01-01 21:56:36 +01:00
|
|
|
|
|
|
|
# Unlinking should happen automatically, thanks to File::Temp,
|
|
|
|
# but it does not work here, probably because of the way writefile()
|
|
|
|
# and Locale::Po4a::write() work.
|
|
|
|
unlink $infile, $outfile;
|
|
|
|
|
|
|
|
return $content;
|
|
|
|
}
|
|
|
|
|
2009-01-01 23:10:16 +01:00
|
|
|
# returns a SuccessReason or FailReason object
|
|
|
|
sub isvalidpo ($) {
|
|
|
|
my $content = shift;
|
|
|
|
|
|
|
|
# NB: we don't use po_to_markup here, since Po4a parser does
|
|
|
|
# not mind invalid PO content
|
|
|
|
$content = '' unless defined $content;
|
|
|
|
$content = decode_utf8(encode_utf8($content));
|
|
|
|
|
|
|
|
# There are incompatibilities between some File::Temp versions
|
|
|
|
# (including 0.18, bundled with Lenny's perl-modules package)
|
|
|
|
# and others (e.g. 0.20, previously present in the archive as
|
|
|
|
# a standalone package): under certain circumstances, some
|
|
|
|
# return a relative filename, whereas others return an absolute one;
|
|
|
|
# we here use this module in a way that is at least compatible
|
|
|
|
# with 0.18 and 0.20. Beware, hit'n'run refactorers!
|
|
|
|
my $infile = new File::Temp(TEMPLATE => "ikiwiki-po-isvalidpo.XXXXXXXXXX",
|
|
|
|
DIR => File::Spec->tmpdir,
|
|
|
|
UNLINK => 1)->filename;
|
|
|
|
|
2009-01-02 15:14:58 +01:00
|
|
|
my $fail = sub ($) {
|
2009-01-01 23:32:52 +01:00
|
|
|
my $msg = '[po/isvalidpo] ' . shift;
|
2009-01-01 23:10:16 +01:00
|
|
|
unlink $infile;
|
|
|
|
return IkiWiki::FailReason->new("$msg");
|
2009-01-02 15:14:58 +01:00
|
|
|
};
|
2009-01-01 23:10:16 +01:00
|
|
|
|
|
|
|
writefile(basename($infile), File::Spec->tmpdir, $content)
|
2009-01-02 15:14:58 +01:00
|
|
|
or return $fail->(sprintf(gettext("failed to write %s"), $infile));
|
2009-01-01 23:10:16 +01:00
|
|
|
|
2009-01-01 23:33:16 +01:00
|
|
|
my $res = (system("msgfmt", "--check", $infile, "-o", "/dev/null") == 0);
|
2009-01-01 23:10:16 +01:00
|
|
|
|
|
|
|
# Unlinking should happen automatically, thanks to File::Temp,
|
|
|
|
# but it does not work here, probably because of the way writefile()
|
|
|
|
# and Locale::Po4a::write() work.
|
|
|
|
unlink $infile;
|
|
|
|
|
|
|
|
if ($res) {
|
2010-07-23 20:26:57 +02:00
|
|
|
return IkiWiki::SuccessReason->new("valid gettext data");
|
2009-01-01 23:10:16 +01:00
|
|
|
}
|
2009-07-21 12:39:21 +02:00
|
|
|
return IkiWiki::FailReason->new(gettext("invalid gettext data, go back ".
|
|
|
|
"to previous page to continue edit"));
|
2009-01-01 23:10:16 +01:00
|
|
|
}
|
|
|
|
|
2010-06-25 23:18:34 +02:00
|
|
|
sub po4a_type ($) {
|
|
|
|
my $file = shift;
|
|
|
|
|
|
|
|
my $pagetype = pagetype($file);
|
|
|
|
if ($pagetype eq 'html') {
|
|
|
|
return 'xhtml';
|
2010-07-23 20:26:57 +02:00
|
|
|
}
|
2010-06-25 23:18:34 +02:00
|
|
|
return 'text';
|
|
|
|
}
|
|
|
|
|
|
|
|
sub po4a_options($) {
|
|
|
|
my $file = shift;
|
|
|
|
|
|
|
|
my %options;
|
|
|
|
my $pagetype = pagetype($file);
|
|
|
|
|
|
|
|
if ($pagetype eq 'html') {
|
|
|
|
# how to disable options is not consistent across po4a modules
|
|
|
|
$options{includessi} = '';
|
|
|
|
$options{includeexternal} = 0;
|
2011-05-26 16:54:29 +02:00
|
|
|
$options{ontagerror} = 'warn';
|
2010-07-23 20:26:57 +02:00
|
|
|
}
|
2010-06-25 23:18:34 +02:00
|
|
|
elsif ($pagetype eq 'mdwn') {
|
|
|
|
$options{markdown} = 1;
|
2010-07-23 20:26:57 +02:00
|
|
|
}
|
|
|
|
else {
|
2010-06-25 23:18:34 +02:00
|
|
|
$options{markdown} = 0;
|
2010-07-23 20:26:57 +02:00
|
|
|
}
|
2010-06-25 23:18:34 +02:00
|
|
|
|
|
|
|
return %options;
|
|
|
|
}
|
|
|
|
|
2010-09-10 19:13:00 +02:00
|
|
|
sub splitlangpair ($) {
|
|
|
|
my $pair=shift;
|
|
|
|
|
2011-05-25 18:01:40 +02:00
|
|
|
my ($code, $name) = ( $pair =~ /^($language_code_pattern)\|(.+)$/ );
|
2010-09-10 19:13:00 +02:00
|
|
|
if (! defined $code || ! defined $name ||
|
|
|
|
! length $code || ! length $name) {
|
|
|
|
# not a fatal error to avoid breaking if used with web setup
|
2010-09-10 20:20:53 +02:00
|
|
|
warn sprintf(gettext("%s has invalid syntax: must use CODE|NAME"),
|
|
|
|
$pair);
|
2010-09-10 19:13:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return $code, $name;
|
|
|
|
}
|
|
|
|
|
2010-09-10 20:04:43 +02:00
|
|
|
sub joinlangpair ($$) {
|
|
|
|
my $code=shift;
|
|
|
|
my $name=shift;
|
|
|
|
|
|
|
|
return "$code|$name";
|
|
|
|
}
|
|
|
|
|
2008-11-11 04:05:39 +01:00
|
|
|
# ,----
|
2009-01-26 19:33:02 +01:00
|
|
|
# | PageSpecs
|
2008-11-11 04:05:39 +01:00
|
|
|
# `----
|
|
|
|
|
2008-10-10 21:47:20 +02:00
|
|
|
package IkiWiki::PageSpec;
|
2008-10-10 17:10:40 +02:00
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub match_istranslation ($;@) {
|
2008-10-10 21:47:20 +02:00
|
|
|
my $page=shift;
|
2008-11-05 21:18:07 +01:00
|
|
|
|
2008-10-11 03:01:59 +02:00
|
|
|
if (IkiWiki::Plugin::po::istranslation($page)) {
|
2008-10-10 21:47:20 +02:00
|
|
|
return IkiWiki::SuccessReason->new("is a translation page");
|
2008-10-10 17:10:40 +02:00
|
|
|
}
|
2008-10-10 21:47:20 +02:00
|
|
|
else {
|
|
|
|
return IkiWiki::FailReason->new("is not a translation page");
|
2008-10-10 17:10:40 +02:00
|
|
|
}
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-10-10 17:10:40 +02:00
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub match_istranslatable ($;@) {
|
2008-10-10 21:47:20 +02:00
|
|
|
my $page=shift;
|
2008-11-05 21:18:07 +01:00
|
|
|
|
2008-10-11 03:01:59 +02:00
|
|
|
if (IkiWiki::Plugin::po::istranslatable($page)) {
|
2008-10-10 21:47:20 +02:00
|
|
|
return IkiWiki::SuccessReason->new("is set as translatable in po_translatable_pages");
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return IkiWiki::FailReason->new("is not set as translatable in po_translatable_pages");
|
2008-10-10 17:10:40 +02:00
|
|
|
}
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-10-05 17:14:30 +02:00
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub match_lang ($$;@) {
|
2008-10-15 00:35:17 +02:00
|
|
|
my $page=shift;
|
|
|
|
my $wanted=shift;
|
2008-11-05 21:18:07 +01:00
|
|
|
|
2008-10-15 00:35:17 +02:00
|
|
|
my $regexp=IkiWiki::glob2re($wanted);
|
2008-11-10 21:30:06 +01:00
|
|
|
my $lang=IkiWiki::Plugin::po::lang($page);
|
2010-11-20 01:02:49 +01:00
|
|
|
if ($lang !~ $regexp) {
|
2008-10-15 00:35:17 +02:00
|
|
|
return IkiWiki::FailReason->new("file language is $lang, not $wanted");
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return IkiWiki::SuccessReason->new("file language is $wanted");
|
|
|
|
}
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-10-15 00:35:17 +02:00
|
|
|
|
2008-12-31 23:54:21 +01:00
|
|
|
sub match_currentlang ($$;@) {
|
2008-10-15 01:23:19 +02:00
|
|
|
my $page=shift;
|
|
|
|
shift;
|
|
|
|
my %params=@_;
|
|
|
|
|
|
|
|
return IkiWiki::FailReason->new("no location provided") unless exists $params{location};
|
|
|
|
|
2008-11-10 21:30:06 +01:00
|
|
|
my $currentlang=IkiWiki::Plugin::po::lang($params{location});
|
|
|
|
my $lang=IkiWiki::Plugin::po::lang($page);
|
2008-10-15 01:23:19 +02:00
|
|
|
|
|
|
|
if ($lang eq $currentlang) {
|
|
|
|
return IkiWiki::SuccessReason->new("file language is the same as current one, i.e. $currentlang");
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return IkiWiki::FailReason->new("file language is $lang, whereas current language is $currentlang");
|
|
|
|
}
|
2008-12-31 23:54:21 +01:00
|
|
|
}
|
2008-10-15 01:23:19 +02:00
|
|
|
|
2010-06-29 15:45:34 +02:00
|
|
|
sub match_needstranslation ($$;@) {
|
|
|
|
my $page=shift;
|
2010-07-11 11:58:09 +02:00
|
|
|
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");
|
2010-07-23 20:26:57 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
2010-07-11 11:58:09 +02:00
|
|
|
$wanted=100;
|
2010-07-23 20:26:57 +02:00
|
|
|
}
|
2010-06-29 15:45:34 +02:00
|
|
|
|
|
|
|
my $percenttranslated=IkiWiki::Plugin::po::percenttranslated($page);
|
|
|
|
if ($percenttranslated eq 'N/A') {
|
2010-07-04 20:22:19 +02:00
|
|
|
return IkiWiki::FailReason->new("file is not a translatable page");
|
2010-06-29 15:45:34 +02:00
|
|
|
}
|
2010-07-11 11:58:09 +02:00
|
|
|
elsif ($percenttranslated < $wanted) {
|
2010-06-29 15:45:34 +02:00
|
|
|
return IkiWiki::SuccessReason->new("file has $percenttranslated translated");
|
2010-07-23 20:26:57 +02:00
|
|
|
}
|
2010-06-29 15:45:34 +02:00
|
|
|
else {
|
2010-07-11 11:58:09 +02:00
|
|
|
return IkiWiki::FailReason->new("file is translated enough");
|
2010-06-29 15:45:34 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-10-05 04:11:02 +02:00
|
|
|
1
|