Merge commit 'upstream/po' into prv/po
Conflicts: IkiWiki/Plugin/po.pm doc/plugins/po.mdwn Signed-off-by: intrigeri <intrigeri@boum.org>master
commit
1f54c13ec2
|
@ -201,7 +201,7 @@ sub preprocess_inline (@) { #{{{
|
|||
@list=sort { $pagectime{$b} <=> $pagectime{$a} } @list;
|
||||
}
|
||||
else {
|
||||
return sprintf(gettext("unknown sort type %s"), $params{sort});
|
||||
error sprintf(gettext("unknown sort type %s"), $params{sort});
|
||||
}
|
||||
|
||||
if (yesno($params{reverse})) {
|
||||
|
@ -298,7 +298,7 @@ sub preprocess_inline (@) { #{{{
|
|||
require HTML::Template;
|
||||
my @params=IkiWiki::template_params($params{template}.".tmpl", blind_cache => 1);
|
||||
if (! @params) {
|
||||
return sprintf(gettext("nonexistant template %s"), $params{template});
|
||||
error sprintf(gettext("nonexistant template %s"), $params{template});
|
||||
}
|
||||
my $template=HTML::Template->new(@params) unless $raw;
|
||||
|
||||
|
|
|
@ -28,11 +28,8 @@ memoize("percenttranslated");
|
|||
|
||||
# backup references to subs that will be overriden
|
||||
my %origsubs;
|
||||
$origsubs{'bestlink'}=\&IkiWiki::bestlink;
|
||||
$origsubs{'beautify_urlpath'}=\&IkiWiki::beautify_urlpath;
|
||||
$origsubs{'targetpage'}=\&IkiWiki::targetpage;
|
||||
|
||||
sub import {
|
||||
sub import { #{{{
|
||||
hook(type => "getsetup", id => "po", call => \&getsetup);
|
||||
hook(type => "checkconfig", id => "po", call => \&checkconfig);
|
||||
hook(type => "needsbuild", id => "po", call => \&needsbuild);
|
||||
|
@ -40,16 +37,20 @@ sub import {
|
|||
hook(type => "htmlize", id => "po", call => \&htmlize);
|
||||
hook(type => "pagetemplate", id => "po", call => \&pagetemplate, last => 1);
|
||||
hook(type => "editcontent", id => "po", call => \&editcontent);
|
||||
|
||||
$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);
|
||||
}
|
||||
} #}}}
|
||||
|
||||
sub getsetup () { #{{{
|
||||
return
|
||||
plugin => {
|
||||
safe => 0,
|
||||
rebuild => 1, # format plugin
|
||||
rebuild => 1, # format plugin & changes html filenames
|
||||
},
|
||||
po_master_language => {
|
||||
type => "string",
|
||||
|
@ -97,11 +98,11 @@ sub checkconfig () { #{{{
|
|||
}
|
||||
if (! exists $config{po_link_to} ||
|
||||
! defined $config{po_link_to}) {
|
||||
$config{po_link_to}="default";
|
||||
$config{po_link_to}="default";
|
||||
}
|
||||
if (! exists $config{po_translatable_pages} ||
|
||||
! defined $config{po_translatable_pages}) {
|
||||
$config{po_translatable_pages}="";
|
||||
$config{po_translatable_pages}="";
|
||||
}
|
||||
if ($config{po_link_to} eq "negotiated" && ! $config{usedirs}) {
|
||||
error(gettext("po_link_to=negotiated requires usedirs to be set"));
|
||||
|
@ -111,6 +112,7 @@ sub checkconfig () { #{{{
|
|||
|
||||
sub potfile ($) { #{{{
|
||||
my $masterfile=shift;
|
||||
|
||||
(my $name, my $dir, my $suffix) = fileparse($masterfile, qr/\.[^.]*/);
|
||||
$dir='' if $dir eq './';
|
||||
return File::Spec->catpath('', $dir, $name . ".pot");
|
||||
|
@ -119,6 +121,7 @@ sub potfile ($) { #{{{
|
|||
sub pofile ($$) { #{{{
|
||||
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");
|
||||
|
@ -126,6 +129,7 @@ sub pofile ($$) { #{{{
|
|||
|
||||
sub refreshpot ($) { #{{{
|
||||
my $masterfile=shift;
|
||||
|
||||
my $potfile=potfile($masterfile);
|
||||
my %options = ("markdown" => (pagetype($masterfile) eq 'mdwn') ? 1 : 0);
|
||||
my $doc=Locale::Po4a::Chooser::new('text',%options);
|
||||
|
@ -153,8 +157,7 @@ sub refreshpofiles ($@) { #{{{
|
|||
|
||||
foreach my $pofile (@pofiles) {
|
||||
if (-e $pofile) {
|
||||
my $cmd = "msgmerge -U --backup=none $pofile $potfile";
|
||||
system ($cmd) == 0
|
||||
system("msgmerge", "-U", "--backup=none", $pofile, $potfile) == 0
|
||||
or error("[po/refreshpofiles:$pofile] failed to update");
|
||||
}
|
||||
else {
|
||||
|
@ -252,9 +255,10 @@ sub mytargetpage ($$) { #{{{
|
|||
|
||||
sub mybeautify_urlpath ($) { #{{{
|
||||
my $url=shift;
|
||||
|
||||
my $res=$origsubs{'beautify_urlpath'}->($url);
|
||||
if ($config{po_link_to} eq "negotiated") {
|
||||
$res =~ s!/index.$config{po_master_language}{code}.$config{htmlext}$!/!;
|
||||
$res =~ s!/\Qindex.$config{po_master_language}{code}.$config{htmlext}\E$!/!;
|
||||
}
|
||||
return $res;
|
||||
} #}}}
|
||||
|
@ -273,6 +277,7 @@ sub urlto_with_orig_beautiful_urlpath($$) { #{{{
|
|||
sub mybestlink ($$) { #{{{
|
||||
my $page=shift;
|
||||
my $link=shift;
|
||||
|
||||
my $res=$origsubs{'bestlink'}->($page, $link);
|
||||
if (length $res) {
|
||||
if ($config{po_link_to} eq "current"
|
||||
|
@ -292,6 +297,7 @@ sub mybestlink ($$) { #{{{
|
|||
# since the rest of ikiwiki should not work on PO files.
|
||||
sub filter (@) { #{{{
|
||||
my %params = @_;
|
||||
|
||||
my $page = $params{page};
|
||||
my $destpage = $params{destpage};
|
||||
my $content = decode_utf8(encode_utf8($params{content}));
|
||||
|
@ -329,8 +335,8 @@ sub filter (@) { #{{{
|
|||
push @pos,$infile;
|
||||
push @masters,$masterfile;
|
||||
my %options = (
|
||||
"markdown" => (pagetype($masterfile) eq 'mdwn') ? 1 : 0,
|
||||
);
|
||||
"markdown" => (pagetype($masterfile) eq 'mdwn') ? 1 : 0,
|
||||
);
|
||||
my $doc=Locale::Po4a::Chooser::new('text',%options);
|
||||
$doc->process(
|
||||
'po_in_name' => \@pos,
|
||||
|
@ -352,6 +358,7 @@ sub filter (@) { #{{{
|
|||
|
||||
sub htmlize (@) { #{{{
|
||||
my %params=@_;
|
||||
|
||||
my $page = $params{page};
|
||||
my $content = $params{content};
|
||||
my ($masterpage, $lang) = ($page =~ /(.*)[.]([a-z]{2})$/);
|
||||
|
@ -363,7 +370,8 @@ sub htmlize (@) { #{{{
|
|||
|
||||
sub percenttranslated ($) { #{{{
|
||||
my $page=shift;
|
||||
return "N/A" unless (istranslation($page));
|
||||
|
||||
return gettext("N/A") unless (istranslation($page));
|
||||
my ($masterpage, $lang) = ($page =~ /(.*)[.]([a-z]{2})$/);
|
||||
my $file=srcfile($pagesources{$page});
|
||||
my $masterfile = srcfile($pagesources{$masterpage});
|
||||
|
@ -371,8 +379,8 @@ sub percenttranslated ($) { #{{{
|
|||
push @pos,$file;
|
||||
push @masters,$masterfile;
|
||||
my %options = (
|
||||
"markdown" => (pagetype($masterfile) eq 'mdwn') ? 1 : 0,
|
||||
);
|
||||
"markdown" => (pagetype($masterfile) eq 'mdwn') ? 1 : 0,
|
||||
);
|
||||
my $doc=Locale::Po4a::Chooser::new('text',%options);
|
||||
$doc->process(
|
||||
'po_in_name' => \@pos,
|
||||
|
@ -386,6 +394,7 @@ sub percenttranslated ($) { #{{{
|
|||
|
||||
sub otherlanguages ($) { #{{{
|
||||
my $page=shift;
|
||||
|
||||
my @ret;
|
||||
if (istranslatable($page)) {
|
||||
foreach my $lang (sort keys %{$translations{$page}}) {
|
||||
|
@ -423,6 +432,7 @@ sub pagetemplate (@) { #{{{
|
|||
my $page=$params{page};
|
||||
my $destpage=$params{destpage};
|
||||
my $template=$params{template};
|
||||
|
||||
my ($masterpage, $lang) = ($page =~ /(.*)[.]([a-z]{2})$/) if istranslation($page);
|
||||
|
||||
if (istranslation($page) && $template->query(name => "percenttranslated")) {
|
||||
|
@ -485,6 +495,7 @@ sub editcontent () { #{{{
|
|||
|
||||
sub istranslatable ($) { #{{{
|
||||
my $page=shift;
|
||||
|
||||
my $file=$pagesources{$page};
|
||||
|
||||
if (! defined $file
|
||||
|
@ -497,6 +508,7 @@ sub istranslatable ($) { #{{{
|
|||
|
||||
sub _istranslation ($) { #{{{
|
||||
my $page=shift;
|
||||
|
||||
my $file=$pagesources{$page};
|
||||
if (! defined $file) {
|
||||
return IkiWiki::FailReason->new("no file specified");
|
||||
|
@ -522,6 +534,7 @@ sub _istranslation ($) { #{{{
|
|||
|
||||
sub istranslation ($) { #{{{
|
||||
my $page=shift;
|
||||
|
||||
if (_istranslation($page)) {
|
||||
my ($masterpage, $lang) = ($page =~ /(.*)[.]([a-z]{2})$/);
|
||||
$translations{$masterpage}{$lang}=$page unless exists $translations{$masterpage}{$lang};
|
||||
|
@ -537,6 +550,7 @@ use IkiWiki 2.00;
|
|||
|
||||
sub match_istranslation ($;@) { #{{{
|
||||
my $page=shift;
|
||||
|
||||
if (IkiWiki::Plugin::po::istranslation($page)) {
|
||||
return IkiWiki::SuccessReason->new("is a translation page");
|
||||
}
|
||||
|
@ -547,6 +561,7 @@ sub match_istranslation ($;@) { #{{{
|
|||
|
||||
sub match_istranslatable ($;@) { #{{{
|
||||
my $page=shift;
|
||||
|
||||
if (IkiWiki::Plugin::po::istranslatable($page)) {
|
||||
return IkiWiki::SuccessReason->new("is set as translatable in po_translatable_pages");
|
||||
}
|
||||
|
@ -558,6 +573,7 @@ sub match_istranslatable ($;@) { #{{{
|
|||
sub match_lang ($$;@) { #{{{
|
||||
my $page=shift;
|
||||
my $wanted=shift;
|
||||
|
||||
my $regexp=IkiWiki::glob2re($wanted);
|
||||
my $lang;
|
||||
my $masterpage;
|
||||
|
@ -579,6 +595,7 @@ sub match_lang ($$;@) { #{{{
|
|||
|
||||
sub match_currentlang ($$;@) { #{{{
|
||||
my $page=shift;
|
||||
|
||||
shift;
|
||||
my %params=@_;
|
||||
my ($currentmasterpage, $currentlang, $masterpage, $lang);
|
||||
|
|
|
@ -14,7 +14,7 @@ Package: ikiwiki
|
|||
Architecture: all
|
||||
Depends: ${perl:Depends}, markdown | libtext-markdown-perl, libhtml-scrubber-perl, libhtml-template-perl, libhtml-parser-perl, liburi-perl
|
||||
Recommends: gcc | c-compiler, libc6-dev | libc-dev, subversion | git-core (>= 1:1.5.0) | tla | bzr (>= 0.91) | mercurial | monotone (>= 0.38), libxml-simple-perl, libnet-openid-consumer-perl, liblwpx-paranoidagent-perl, libtimedate-perl, libcgi-formbuilder-perl (>= 3.05), libcgi-session-perl (>= 4.14-1), libmail-sendmail-perl, libauthen-passphrase-perl
|
||||
Suggests: viewvc | gitweb | viewcvs, libsearch-xapian-perl, xapian-omega (>= 1.0.5), librpc-xml-perl, libtext-wikiformat-perl, python, python-docutils, polygen, tidy, libxml-feed-perl, libmailtools-perl, perlmagick, libfile-mimeinfo-perl, libcrypt-ssleay-perl, liblocale-gettext-perl (>= 1.05-1), libtext-typography-perl, libtext-csv-perl, libdigest-sha1-perl, graphviz, libnet-amazon-s3-perl, sparkline-php, texlive, dvipng
|
||||
Suggests: viewvc | gitweb | viewcvs, libsearch-xapian-perl, xapian-omega (>= 1.0.5), librpc-xml-perl, libtext-wikiformat-perl, python, python-docutils, polygen, tidy, libxml-feed-perl, libmailtools-perl, perlmagick, libfile-mimeinfo-perl, libcrypt-ssleay-perl, liblocale-gettext-perl (>= 1.05-1), libtext-typography-perl, libtext-csv-perl, libdigest-sha1-perl, graphviz, libnet-amazon-s3-perl, sparkline-php, texlive, dvipng, po4a
|
||||
Conflicts: ikiwiki-plugin-table
|
||||
Replaces: ikiwiki-plugin-table
|
||||
Provides: ikiwiki-plugin-table
|
||||
|
|
|
@ -47,6 +47,8 @@ Some more elaborate limits can be added to what matches using these functions:
|
|||
wiki admins.
|
||||
* "`ip(address)`" - tests whether a modification is being made from the
|
||||
specified IP address.
|
||||
* Some additional special-purpose limits may be enabled, for matching
|
||||
[[attachments|attachment]] and [[translations|po]].
|
||||
|
||||
For example, to match all pages in a blog that link to the page about music
|
||||
and were written in 2005:
|
||||
|
|
|
@ -12,5 +12,5 @@ wiki:
|
|||
* "`currentlang()`" - Tests whether a page is written in the same
|
||||
language as the current page.
|
||||
|
||||
Note: every non-PO page is considered to be written in
|
||||
Note: every non-po page is considered to be written in
|
||||
`po_master_language`, as specified in `ikiwiki.setup`.
|
||||
|
|
|
@ -7,3 +7,6 @@ instead of linking to the PNG image file. --[[tschwinge]]
|
|||
> Done, use link=somepage --[[Joey]]
|
||||
|
||||
It would be handy if the `class` and `id` tags were passed through to the surrounding `table` in the case of `caption` being present. Would this break anything? --[[neale]]
|
||||
|
||||
> Seems unlikely to break *too* much. I can imagine css that styles the img
|
||||
> unexpectedly applying the table. --[[Joey]]
|
||||
|
|
|
@ -13,7 +13,7 @@ A language is chosen as the "master" one, and any other supported
|
|||
language is a "slave" one.
|
||||
|
||||
A page written in the "master" language is a "master" page. It can be
|
||||
of any page type supported by ikiwiki, but PO. It does not have to be
|
||||
of any page type supported by ikiwiki, except `po`. It does not have to be
|
||||
named a special way: migration to this plugin does not imply any page
|
||||
renaming work.
|
||||
|
||||
|
@ -22,7 +22,7 @@ English; if `usedirs` is enabled, it is rendered as
|
|||
`bla/page/index.en.html`, else as `bla/page.en.html`.
|
||||
|
||||
Any translation of a "master" page into a "slave" language is called
|
||||
a "slave" page; it is written in the gettext PO format. PO is now
|
||||
a "slave" page; it is written in the gettext PO format. `po` is now
|
||||
a page type supported by ikiwiki.
|
||||
|
||||
Example: `bla/page.fr.po` is the PO "message catalog" used to
|
||||
|
@ -56,9 +56,8 @@ The `po_translatable_pages` setting configures what pages are
|
|||
translatable. It is a [[ikiwiki/PageSpec]], so you have lots of
|
||||
control over what kind of pages are translatable.
|
||||
|
||||
The PO translations files are anyway not considered as being
|
||||
translatable, so you don't need to worry about excluding them
|
||||
explicitly from this [[ikiwiki/PageSpec]].
|
||||
The `.po` files are not considered as being translatable, so you don't need to
|
||||
worry about excluding them explicitly from this [[ikiwiki/PageSpec]].
|
||||
|
||||
Internal links
|
||||
--------------
|
||||
|
@ -180,17 +179,14 @@ Additional PageSpec tests
|
|||
This plugin enhances the regular [[ikiwiki/PageSpec]] syntax with some
|
||||
additional tests that are documented [[here|ikiwiki/pagespec/po]].
|
||||
|
||||
Automatic PO files update
|
||||
-------------------------
|
||||
Automatic PO file update
|
||||
------------------------
|
||||
|
||||
Committing changes to a "master" page:
|
||||
|
||||
1. updates the POT file, as well as the PO files for the "slave"
|
||||
languages (this is done in the `needsbuild` hook); the updated PO
|
||||
files are then put under version control;
|
||||
2. triggers a refresh of the corresponding HTML slave pages (this is
|
||||
achieved by making any "slave" page dependent on the corresponding
|
||||
"master" page, in the `needsbuild` hook).
|
||||
1. updates the POT file and the PO files for the "slave" languages;
|
||||
the updated PO files are then put under version control;
|
||||
2. triggers a refresh of the corresponding HTML slave pages.
|
||||
|
||||
Also, when the plugin has just been enabled, or when a page has just
|
||||
been declared as being translatable, the needed POT and PO files are
|
||||
|
@ -210,8 +206,8 @@ Translating
|
|||
One can edit the PO files using ikiwiki's CGI (a message-by-message
|
||||
interface could also be implemented at some point).
|
||||
|
||||
If [[tips/untrusted_git_push]] is setup, one can edit the PO files in
|
||||
her preferred `$EDITOR`, without needing to be online.
|
||||
If [[tips/untrusted_git_push]] is setup, one can edit the PO files in one's
|
||||
preferred `$EDITOR`, without needing to be online.
|
||||
|
||||
TODO
|
||||
====
|
||||
|
@ -221,8 +217,18 @@ Security checks
|
|||
|
||||
- `refreshpofiles` uses `system()`, whose args have to be checked more
|
||||
thoroughly to prevent any security issue (command injection, etc.).
|
||||
> Always pass `system()` a list of parameters to avoid the shell.
|
||||
> I've checked in a change fixing that. --[[Joey]]
|
||||
- `refreshpofiles` and `refreshpot` create new files; this may need
|
||||
some checks, e.g. using `IkiWiki::prep_writefile()`
|
||||
> Yes, it would be ideal to call `prep_writefile` on each file
|
||||
> that they write, beforehand. This way you'd avoid symlink attacks etc to the
|
||||
> generated po/pot files. I haven't done it, but it seems pretty trivial.
|
||||
> --[[Joey]]
|
||||
- Can any sort of directives be put in po files that will
|
||||
cause mischief (ie, include other files, run commands, crash gettext,
|
||||
whatever).
|
||||
- Any security issues on running po4a on untrusted content?
|
||||
|
||||
gettext/po4a rough corners
|
||||
--------------------------
|
||||
|
@ -253,6 +259,14 @@ be fixed by something like [[todo/using_meta_titles_for_parentlinks]].
|
|||
|
||||
Which configuration settings are safe enough for websetup?
|
||||
|
||||
> I see no problems with `po_master_language` and `po_slave_languages`
|
||||
> (assuming websetup handles the hashes correctly). Would not hurt to check
|
||||
> that the values of these are legal language codes, in `checkconfig`.
|
||||
> `po_translatable_pages` seems entirely safe. `po_link_to` w/o usedirs
|
||||
> causes ikiwiki to error out. If it were changed to fall back to a safe
|
||||
> setting in this case rather than error, it would be safe.
|
||||
> --[[Joey]]
|
||||
|
||||
### backlinks
|
||||
|
||||
`po_link_to = negotiated`: if a given translatable `sourcepage.mdwn`
|
||||
|
@ -262,6 +276,11 @@ in the backlinks.
|
|||
|
||||
`po_link_to = current`: seems to work nicely
|
||||
|
||||
### license
|
||||
|
||||
> Could you please put a copyright and license on po.pm? I assume it's
|
||||
> GPLed as it's based on po4a-translate. --[[Joey]]
|
||||
|
||||
Translation quality assurance
|
||||
-----------------------------
|
||||
|
||||
|
|
|
@ -13,4 +13,4 @@ If this plugin is enabled, you may also add relative dates to pages in the
|
|||
wiki, by using html elements in the "relativedate" class. For example, this
|
||||
will display as a relative date:
|
||||
|
||||
<span class="relativedate">Fri Oct 17 18:36:13 EDT 2008</span>
|
||||
<span class="relativedate">Tue Jan 20 12:00:00 EDT 2009</span>
|
||||
|
|
Loading…
Reference in New Issue