further thoughts
[ikiwiki] / doc / todo / language_definition_for_the_meta_plugin.mdwn
1 Here is a patch for the [[plugins/meta]] plugin. It adds the possibility to define the language 
2 used for a page, with \[[!meta lang="ja"]]
3
4 It doesn't insert the langage information in the xhtml meta elements, but defines a LANG
5 variable to use in the templates, for example with
6
7     <html xmlns="http://www.w3.org/1999/xhtml"
8           lang="<TMPL_IF NAME="LANG"><TMPL_VAR LANG><TMPL_ELSE>fr</TMPL_IF>"
9           xml:lang="<TMPL_IF NAME="LANG"><TMPL_VAR LANG><TMPL_ELSE>fr</TMPL_IF>">
10
11 This way also allows to define a language for a subset of the final page, with custom
12 templates and inclusion. 
13
14 This may be useful for sites with a few pages in different languages, but no full i18n.
15
16 > Looks good, but the need to modify the template and include a default
17 > language in it is a bit problimatic, I think. --[[Joey]]
18
19 >> --lang=XX could be a setup option, with a default value, then the template would be 
20
21                 <html xmlns="http://www.w3.org/1999/xhtml" lang="<TMPL_VAR LANG>" xml:lang="<TMPL_VAR LANG>">
22
23 >>> Yes, that seems reasonable. I guess there's no problem with defaulting
24 >>> to en if it can be overridden in the setup. --[[Joey]]
25
26 >>>> Yes, english default makes sense. I guess we should use the `$config{lang}`, 
27 >>>> defined from the setup file or command-line options to define the default language
28 >>>> (`$config{lang}` defaults to `en` which is fine) if the html pages, and override
29 >>>> it from the `meta` directive.
30 >>>> — [[NicolasLimare]]
31
32 >>>>> ikiwiki already has a $config{locale}, which is a full locale (ie,
33 >>>>> "en_US.UTF-8". This just needs to be parsed for the lang. --[[Joey]]
34
35 >>>>>> My mistake, I meant $config{locale} --[[NicolasLimare]]
36
37 > So the patch below could be changed to parse `$config{locale}` for the
38 > language, and pass it if no specific lang was set for the page. The only
39 > problem with that would be that this is all done inside the meta plugin,
40 > so if that plugin were disabled, the lang would be empty. To avoid that,
41 > I guess that the template needs to look like:
42
43     <html xmlns="http://www.w3.org/1999/xhtml"
44           <TMPL_IF NAME="LANG">lang="<TMPL_VAR LANG>" xml:lang="<TMPL_VAR LANG>"</TMPL_IF>>
45
46 > Now it just needs to be finished up.. --[[Joey]]
47
48 <pre>
49 --- meta.orig.pm  2007-07-27 00:19:51.000000000 +0200
50 +++ meta.pm       2007-08-05 22:37:40.000000000 +0200
51 @@ -11,6 +11,7 @@
52  my %permalink;
53  my %author;
54  my %authorurl;
55 +my %lang;
56  
57  sub import {
58         hook(type => "preprocess", id => "meta", call => \&preprocess, scan => 1);
59 @@ -100,6 +101,11 @@
60                 $meta{$page}.='<link href="'.encode_entities($value).
61                         "\" rel=\"openid.delegate\" />\n";
62         }
63 +       elsif ($key eq 'lang') {
64 +           if ($value =~ /^[A-Za-z]{2}$/) {
65 +               $lang{$page}=$value;
66 +           }
67 +       }
68         else {
69                 $meta{$page}.=scrub("<meta name=\"".encode_entities($key).
70                         "\" content=\"".encode_entities($value)."\" />\n");
71 @@ -131,6 +137,8 @@
72                 if exists $author{$page} && $template->query(name => "author");
73         $template->param(authorurl => $authorurl{$page})
74                 if exists $authorurl{$page} && $template->query(name => "authorurl");
75 +       $template->param(lang => $lang{$page})
76 +               if exists $lang{$page} && $template->query(name => "lang");
77  
78  }
79 </pre>
80
81 > Please resolve lang somewhere reusable rather than within meta plugin: It is certainly usable outside
82 > the scope of the meta plugin as well. --[[JonasSmedegaard]]
83
84 >> I don't see any problem with having this in meta? meta is on by default, and
85 >> other plugins are free to use it or even depend on it (e.g. inline does).
86 >>
87 >> My only comments on this patch beyond what Joey said are that the page
88 >> language could usefully go into `$pagestate{$page}{meta}{lang}` for other
89 >> plugins to be able to see it (is that what you meant?), and that
90 >> restricting to 2 characters is too restrictive (HTML 4.01 mentions
91 >> `en`, `en-US` and `i-navajo` as possible language codes).
92 >> This slightly complicates parsing the locale to get the default language:
93 >> it'll need `tr/_/-/` after the optional `.encoding` is removed.
94 >> --[[smcv]]
95
96 >>> Now that po has been merged, this patch should probably also be adapted
97 >>> so that the po plugin forces the meta::lang of every page to what po
98 >>> thinks it should be. --[[smcv]]
99
100 >>>> Agreed, users of the po plugin would greatly benefit from it.
101 >>>> Seems doable. --[[intrigeri]]
102
103 >>> Perhaps [[the_special_po_pagespecs|ikiwiki/pagespec/po]] should
104 >>> also work with meta-assigned languages? --[[smcv]]
105
106 >>>> Yes. But then, these special pagespecs should be moved outside of
107 >>>> [[plugins/po]], as they could be useful to anyone using the
108 >>>> currently discussed patch even when not using the po plugin.
109 >>>> 
110 >>>> We could add these pagespecs to the core and make them use
111 >>>> a simple language-guessing system based on a new hook. Any plugin
112 >>>> that implements such a hook could decide whether it should
113 >>>> overrides the language guessed by another one, and optionally use
114 >>>> the `first`/`last` options (e.g. the po plugin will want to be
115 >>>> authoritative on the pages of type po, and will then use
116 >>>> `last`). --[[intrigeri]]
117
118 [[!tag wishlist patch plugins/meta translation]]