hook(type => "formbuilder_setup", id => "po", call => \&formbuilder_setup, last => 1);
hook(type => "formbuilder", id => "po", call => \&formbuilder);
hook(type => "formbuilder_setup", id => "po", call => \&formbuilder_setup, last => 1);
hook(type => "formbuilder", id => "po", call => \&formbuilder);
- $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);
- $origsubs{'rootpage'}=\&IkiWiki::rootpage;
- inject(name => "IkiWiki::rootpage", call => \&myrootpage);
- $origsubs{'isselflink'}=\&IkiWiki::isselflink;
- inject(name => "IkiWiki::isselflink", call => \&myisselflink);
+ 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);
+ $origsubs{'rootpage'}=\&IkiWiki::rootpage;
+ inject(name => "IkiWiki::rootpage", call => \&myrootpage);
+ $origsubs{'isselflink'}=\&IkiWiki::isselflink;
+ inject(name => "IkiWiki::isselflink", call => \&myisselflink);
+ }
+ if (ref $config{po_slave_languages} eq 'ARRAY') {
+ my %slaves;
+ foreach my $pair (@{$config{po_slave_languages}}) {
+ my ($code, $name) = ( $pair =~ /^([a-z]{2})\|(.+)$/ );
+ if (!defined $code || !defined $name) {
+ error(sprintf(gettext("%s has invalid syntax: must use CODE|NAME"),
+ $pair));
+ }
+ $slaves{$code} = $name;
+ push @slavelanguages, $code;
+
+ }
+ $config{po_slave_languages} = \%slaves;
+ }
+ elsif (ref $config{po_slave_languages} eq 'HASH') {
+ @slavelanguages = sort {
+ $config{po_slave_languages}->{$a} cmp $config{po_slave_languages}->{$b};
+ } keys %{$config{po_slave_languages}};
+ }
+
+ delete $config{po_slave_languages}{$config{po_master_language}{code}};;
+
if ($config{po_master_language}{code} ne 'en') {
# Add underlay containing translated source files
# for the master language.
if ($config{po_master_language}{code} ne 'en') {
# Add underlay containing translated source files
# for the master language.
# make existing translations depend on the corresponding master page
foreach my $master (keys %translations) {
# make existing translations depend on the corresponding master page
foreach my $master (keys %translations) {
}
if ($template->query(name => "otherlanguages")) {
$template->param(otherlanguages => [otherlanguagesloop($page)]);
}
if ($template->query(name => "otherlanguages")) {
$template->param(otherlanguages => [otherlanguagesloop($page)]);
}
if ($config{discussion} && istranslation($page)) {
if ($page !~ /.*\/\Q$config{discussionpage}\E$/i &&
}
if ($config{discussion} && istranslation($page)) {
if ($page !~ /.*\/\Q$config{discussionpage}\E$/i &&
if (ishomepage($page) && $template->query(name => "title")) {
$template->param(title => $config{wikiname});
}
if (ishomepage($page) && $template->query(name => "title")) {
$template->param(title => $config{wikiname});
}
while (my ($lang, $otherpage) = each %otherpages) {
push @ret, {
src => $otherpage,
srcfile => $pagesources{$otherpage},
while (my ($lang, $otherpage) = each %otherpages) {
push @ret, {
src => $otherpage,
srcfile => $pagesources{$otherpage},
# This cannot be done in the formbuilder_setup hook as the list of types is
# computed later.
if ($form->field("do") eq "create") {
# This cannot be done in the formbuilder_setup hook as the list of types is
# computed later.
if ($form->field("do") eq "create") {
next unless "$field" eq "type";
next unless $field->type eq 'select';
my $orig_value = $field->value;
next unless "$field" eq "type";
next unless $field->type eq 'select';
my $orig_value = $field->value;
$res =~ s!/\Qindex.$config{po_master_language}{code}.$config{htmlext}\E$!/!;
$res =~ s!/\Qindex.$config{htmlext}\E$!/!;
map {
$res =~ s!/\Qindex.$_.$config{htmlext}\E$!/!;
$res =~ s!/\Qindex.$config{po_master_language}{code}.$config{htmlext}\E$!/!;
$res =~ s!/\Qindex.$config{htmlext}\E$!/!;
map {
$res =~ s!/\Qindex.$_.$config{htmlext}\E$!/!;
return 1 if $origsubs{'isselflink'}->($page, $link);
if (istranslation($page)) {
return $origsubs{'isselflink'}->(masterpage($page), $link);
return 1 if $origsubs{'isselflink'}->($page, $link);
if (istranslation($page)) {
return $origsubs{'isselflink'}->(masterpage($page), $link);
my $type=pagetype($file);
return 0 if ! defined $type || $type eq 'po';
return 0 if $file =~ /\.pot$/;
my $type=pagetype($file);
return 0 if ! defined $type || $type eq 'po';
return 0 if $file =~ /\.pot$/;
-sub otherlanguages ($) {
+# 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 ($) {
- my %options = ("markdown" => (pagetype($masterfile) eq 'mdwn') ? 1 : 0);
- my $doc=Locale::Po4a::Chooser::new('text',%options);
+ my $doc=Locale::Po4a::Chooser::new(po4a_type($masterfile),
+ po4a_options($masterfile));
$doc->read($masterfile);
# 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.
$doc->{TT}{po_out}=Locale::Po4a::Po->new({ 'porefs' => 'none' });
$doc->read($masterfile);
# 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.
$doc->{TT}{po_out}=Locale::Po4a::Po->new({ 'porefs' => 'none' });
return gettext("N/A") unless istranslation($page);
my $file=srcfile($pagesources{$page});
my $masterfile = srcfile($pagesources{masterpage($page)});
return gettext("N/A") unless istranslation($page);
my $file=srcfile($pagesources{$page});
my $masterfile = srcfile($pagesources{masterpage($page)});
- my %options = (
- "markdown" => (pagetype($masterfile) eq 'mdwn') ? 1 : 0,
- );
- my $doc=Locale::Po4a::Chooser::new('text',%options);
+ my $doc=Locale::Po4a::Chooser::new(po4a_type($masterfile),
+ po4a_options($masterfile));
$doc->process(
'po_in_name' => [ $file ],
'file_in_name' => [ $masterfile ],
$doc->process(
'po_in_name' => [ $file ],
'file_in_name' => [ $masterfile ],
- 'file_in_charset' => 'utf-8',
- 'file_out_charset' => 'utf-8',
+ 'file_in_charset' => 'UTF-8',
+ 'file_out_charset' => 'UTF-8',
) or error("po(percenttranslated) ".
sprintf(gettext("failed to translate %s"), $page));
my ($percent,$hit,$queries) = $doc->stats();
) or error("po(percenttranslated) ".
sprintf(gettext("failed to translate %s"), $page));
my ($percent,$hit,$queries) = $doc->stats();
- my %otherpages=%{otherlanguages($page)};
- while (my ($lang, $otherpage) = each %otherpages) {
- if (istranslation($page) && masterpage($page) eq $otherpage) {
- push @ret, {
- url => urlto_with_orig_beautiful_urlpath($otherpage, $page),
- code => $lang,
- language => languagename($lang),
- master => 1,
- };
- }
- elsif (istranslation($otherpage)) {
- push @ret, {
- url => urlto_with_orig_beautiful_urlpath($otherpage, $page),
- code => $lang,
- language => languagename($lang),
- percent => percenttranslated($otherpage),
- }
+ if (istranslation($page)) {
+ push @ret, {
+ url => urlto_with_orig_beautiful_urlpath(masterpage($page), $page),
+ code => $config{po_master_language}{code},
+ language => $config{po_master_language}{name},
+ master => 1,
+ };
+ }
+ foreach my $lang (@{otherlanguages_codes($page)}) {
+ next if $lang eq $config{po_master_language}{code};
+ my $otherpage = otherlanguage_page($page, $lang);
+ push @ret, {
+ url => urlto_with_orig_beautiful_urlpath($otherpage, $page),
+ code => $lang,
+ language => languagename($lang),
+ percent => percenttranslated($otherpage),
-# on success, returns the filtered content.
-# on error, if $nonfatal, warn and return undef; else, error out.
-sub po_to_markup ($$;$) {
or return $fail->(sprintf(gettext("failed to write %s"), $infile));
my $masterfile = srcfile($pagesources{masterpage($page)});
or return $fail->(sprintf(gettext("failed to write %s"), $infile));
my $masterfile = srcfile($pagesources{masterpage($page)});
- my %options = (
- "markdown" => (pagetype($masterfile) eq 'mdwn') ? 1 : 0,
- );
- my $doc=Locale::Po4a::Chooser::new('text',%options);
+ my $doc=Locale::Po4a::Chooser::new(po4a_type($masterfile),
+ po4a_options($masterfile));
$doc->process(
'po_in_name' => [ $infile ],
'file_in_name' => [ $masterfile ],
$doc->process(
'po_in_name' => [ $infile ],
'file_in_name' => [ $masterfile ],
- 'file_in_charset' => 'utf-8',
- 'file_out_charset' => 'utf-8',
+ 'file_in_charset' => 'UTF-8',
+ 'file_out_charset' => 'UTF-8',
) or return $fail->(gettext("failed to translate"));
$doc->write($outfile)
or return $fail->(sprintf(gettext("failed to write %s"), $outfile));
) or return $fail->(gettext("failed to translate"));
$doc->write($outfile)
or return $fail->(sprintf(gettext("failed to write %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()
}
return IkiWiki::FailReason->new(gettext("invalid gettext data, go back ".
"to previous page to continue edit"));
}
}
return IkiWiki::FailReason->new(gettext("invalid gettext data, go back ".
"to previous page to continue edit"));
}
+sub po4a_type ($) {
+ my $file = shift;
+
+ my $pagetype = pagetype($file);
+ if ($pagetype eq 'html') {
+ return 'xhtml';
+ }
+ 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;
+ }
+ elsif ($pagetype eq 'mdwn') {
+ $options{markdown} = 1;
+ }
+ else {
+ $options{markdown} = 0;
+ }
+
+ return %options;
+}
+
+sub match_needstranslation ($$;@) {
+ my $page=shift;
+ 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");
+ }
+ }
+ else {
+ $wanted=100;
+ }
+
+ my $percenttranslated=IkiWiki::Plugin::po::percenttranslated($page);
+ if ($percenttranslated eq 'N/A') {
+ return IkiWiki::FailReason->new("file is not a translatable page");
+ }
+ elsif ($percenttranslated < $wanted) {
+ return IkiWiki::SuccessReason->new("file has $percenttranslated translated");
+ }
+ else {
+ return IkiWiki::FailReason->new("file is translated enough");
+ }
+}
+