diff options
-rw-r--r-- | IkiWiki/Plugin/po.pm | 44 | ||||
-rw-r--r-- | doc/plugins/po.mdwn | 38 |
2 files changed, 76 insertions, 6 deletions
diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm index 0c95f6c14..88985cd12 100644 --- a/IkiWiki/Plugin/po.pm +++ b/IkiWiki/Plugin/po.pm @@ -25,6 +25,7 @@ sub import { hook(type => "tweakbestlink", id => "po", call => \&tweakbestlink); hook(type => "filter", id => "po", call => \&filter); hook(type => "htmlize", id => "po", call => \&htmlize); + hook(type => "pagetemplate", id => "po", call => \&pagetemplate); } sub getsetup () { #{{{ @@ -198,6 +199,49 @@ sub htmlize (@) { #{{{ return IkiWiki::htmlize($page, $page, pagetype($masterfile), $content); } #}}} +sub otherlanguages ($) { #{{{ + my $page=shift; + my @ret; + if (istranslatable($page)) { + foreach my $lang (sort keys %{$translations{$page}}) { + push @ret, { + url => urlto($translations{$page}{$lang}, $page), + code => $lang, + language => $config{po_slave_languages}{$lang}, + master => 0, + }; + } + } + elsif (istranslation($page)) { + my ($masterpage, $curlang) = ($page =~ /(.*)[.]([a-z]{2})$/); + push @ret, { + url => urlto($masterpage, $page), + code => $config{po_master_language}{code}, + language => $config{po_master_language}{name}, + master => 1, + }; + foreach my $lang (sort keys %{$translations{$masterpage}}) { + push @ret, { + url => urlto($translations{$masterpage}{$lang}, $page), + code => $lang, + language => $config{po_slave_languages}{$lang}, + master => 0, + } unless ($lang eq $curlang); + } + } + return @ret; +} #}}} + +sub pagetemplate (@) { #{{{ + my %params=@_; + my $page=$params{page}; + my $template=$params{template}; + + if ($template->query(name => "otherlanguages")) { + $template->param(otherlanguages => [otherlanguages($page)]); + } +} # }}} + sub istranslatable ($) { #{{{ my $page=shift; my $file=$pagesources{$page}; diff --git a/doc/plugins/po.mdwn b/doc/plugins/po.mdwn index 28b69e04b..d8cde9cb8 100644 --- a/doc/plugins/po.mdwn +++ b/doc/plugins/po.mdwn @@ -93,6 +93,29 @@ page's language, *i.e.*: - `foo/page.LL.html` if `usedirs` is disabled +Templates +--------- + +The `OTHERLANGUAGES` loop provides ways to display the existing +translations and/or master page. One typically adds the following code +to `templates/page.tmpl`: + + <TMPL_IF NAME="OTHERLANGUAGES"> + <div id="otherlanguages"> + <ul> + <TMPL_LOOP NAME="OTHERLANGUAGES"> + <li> + <a href="<TMPL_VAR NAME="URL">" + class="is_master_<TMPL_VAR NAME="MASTER">"> + <TMPL_VAR NAME="LANGUAGE"> + </a> + </li> + </TMPL_LOOP> + </ul> + </div> + </TMPL_IF> + + Server support ============== @@ -123,12 +146,11 @@ lighttpd unfortunately does not support content negotiation. TODO ==== -Display available translations ------------------------------- +Link relationships +------------------ -The [[linguas|plugins/contrib/linguas]] plugin has some code that can -be used as a basis to display the existing translations, and allow to -navigate between them. +Should pages using the `OTHERLANGUAGES` template loop be declared as +linking to the same page in other versions? View translation status ----------------------- @@ -138,10 +160,14 @@ completeness, either for a given page or for the whole wiki. This should not be too hard using gettext tools. If this is implemented as a -[[HTML::Template|http://search.cpan.org/search?mode=dist&query=HTML%3A%3ATemplate]] +[HTML::Template](http://search.cpan.org/search?mode=dist&query=HTML%3A%3ATemplate) loop, a page using it should depend on any "master" and "slave" pages whose status is being displayed. +If it's not too heavy to compute, this status data may be made +available in the `OTHERLANGUAGES` template loop; else, a dedicated +loop would be needed. + Automatic PO files update ------------------------- |