From: intrigeri Date: Thu, 6 Nov 2008 11:28:31 +0000 (+0100) Subject: Merge commit 'upstream/po' into prv/po X-Git-Url: https://sipb.mit.edu/gitweb.cgi/ikiwiki.git/commitdiff_plain/1f54c13ec24977988a303f004f3fc08ee2e01abc Merge commit 'upstream/po' into prv/po Conflicts: IkiWiki/Plugin/po.pm doc/plugins/po.mdwn Signed-off-by: intrigeri --- 1f54c13ec24977988a303f004f3fc08ee2e01abc diff --cc IkiWiki/Plugin/po.pm index 38fc7527b,ac56041cf..7861523da --- a/IkiWiki/Plugin/po.pm +++ b/IkiWiki/Plugin/po.pm @@@ -38,12 -34,15 +35,16 @@@ sub import { #{{ hook(type => "needsbuild", id => "po", call => \&needsbuild); hook(type => "filter", id => "po", call => \&filter); hook(type => "htmlize", id => "po", call => \&htmlize); - hook(type => "pagetemplate", id => "po", call => \&pagetemplate); + 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 @@@ -111,17 -110,17 +112,19 @@@ sub checkconfig () { #{{ sub potfile ($) { #{{{ my $masterfile=shift; + (my $name, my $dir, my $suffix) = fileparse($masterfile, qr/\.[^.]*/); - return File::Spec->catfile($dir, $name . ".pot"); + $dir='' if $dir eq './'; + return File::Spec->catpath('', $dir, $name . ".pot"); } #}}} sub pofile ($$) { #{{{ my $masterfile=shift; my $lang=shift; + (my $name, my $dir, my $suffix) = fileparse($masterfile, qr/\.[^.]*/); - return File::Spec->catfile($dir, $name . "." . $lang . ".po"); + $dir='' if $dir eq './'; + return File::Spec->catpath('', $dir, $name . "." . $lang . ".po"); } #}}} sub refreshpot ($) { #{{{ @@@ -288,49 -286,30 +293,50 @@@ sub mybestlink ($$) { #{{ return ""; } #}}} -# We use filter to convert PO to the master page's type, -# since other plugins should not work on PO files +# We use filter to convert PO to the master page's format, +# 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})); - # decide if this is a PO file that should be converted into a - # translated document, and perform various sanity checks - if (! istranslation($page) || $filtered{$page}{$destpage}) { - return $content; - } + return $content if ( ! istranslation($page) + || ( exists $filtered{$page}{$destpage} + && $filtered{$page}{$destpage} eq 1 )); + + # CRLF line terminators make poor Locale::Po4a feel bad + $content=~s/\r\n/\n/g; + + # Implementation notes + # + # 1. Locale::Po4a reads/writes from/to files, and I'm too lazy + # to learn how to disguise a variable as a file. + # 2. 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; + + writefile(basename($infile), File::Spec->tmpdir, $content); my ($masterpage, $lang) = ($page =~ /(.*)[.]([a-z]{2})$/); - my $file=srcfile(exists $params{file} ? $params{file} : $IkiWiki::pagesources{$page}); my $masterfile = srcfile($pagesources{$masterpage}); my (@pos,@masters); - push @pos,$file; + 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, @@@ -420,10 -399,10 +429,11 @@@ sub otherlanguages ($) { #{{ sub pagetemplate (@) { #{{{ my %params=@_; - my $page=$params{page}; + my $page=$params{page}; + my $destpage=$params{destpage}; + my $template=$params{template}; + - 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")) { $template->param(percenttranslated => percenttranslated($page)); @@@ -465,26 -446,11 +475,27 @@@ linktext => gettext("Discussion"), )); } + # remove broken parentlink to ./index.html on home page's translations + if ($template->param('parentlinks') + && istranslation($page) + && $masterpage eq "index") { + $template->param('parentlinks' => []); + } } # }}} +sub editcontent () { #{{{ + my %params=@_; + # as we're previewing or saving a page, the content may have + # changed, so tell the next filter() invocation it must not be lazy + if (exists $filtered{$params{page}}{$params{page}}) { + delete $filtered{$params{page}}{$params{page}}; + } + return $params{content}; +} #}}} + sub istranslatable ($) { #{{{ my $page=shift; + my $file=$pagesources{$page}; if (! defined $file diff --cc doc/plugins/po.mdwn index f9cd0ff03,a2e7b18e3..0a8a77a3c --- a/doc/plugins/po.mdwn +++ b/doc/plugins/po.mdwn @@@ -185,12 -184,9 +184,9 @@@ Automatic PO file updat 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 supported languages; - the updated PO files are then put under version control -2. triggers a refresh of the corresponding HTML slave pages ++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 @@@ -207,11 -202,11 +203,11 @@@ discussion page Translating ----------- -One can edit the PO files using ikiwiki's CGI (a message-by-message interface -could also be implemented at some point). +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 ==== @@@ -253,15 -277,32 +259,28 @@@ be fixed by something like [[todo/using 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]] + -### parentlinks - -When the wiki home page is translatable, the parentlinks plugin sets -`./index.html` as its translations' single parent link. Ideally, the home page's -translations should get no parent link at all, just like the version written in -the master language. - ### backlinks -If a given translatable `sourcepage.mdwn` links to \[[destpage]], -`sourcepage.LL.po` also link to \[[destpage]], and the latter has the master -page *and* all its translations listed in the backlinks. +`po_link_to = negotiated`: if a given translatable `sourcepage.mdwn` +links to \[[destpage]], `sourcepage.LL.po` also link to \[[destpage]], +and the latter has the master page *and* all its translations listed +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 -----------------------------