diff --git a/IkiWiki.pm b/IkiWiki.pm index 4964f97..19b70d0 100644 --- a/IkiWiki.pm +++ b/IkiWiki.pm @@ -42,6 +42,7 @@ sub defaultconfig () { #{{{ srcdir => undef, destdir => undef, pingurl => [], + lang => undef, templatedir => "/usr/share/ikiwiki/templates", underlaydir => "/usr/share/ikiwiki/basewiki", setup => undef, @@ -50,7 +51,40 @@ sub defaultconfig () { #{{{ plugin => [qw{mdwn inline htmlscrubber}], timeformat => '%c', } #}}} - + +sub _getlocalelist (;$) { + my $locale=shift; + if (! defined $locale || ! length $locale) { + return qw(en en_US C); + } + $locale=~s/(@[^.]+)//; + my ($lang, $territory, $charset)=($locale=~m/^ + ([^_@.]+) # Language + (_[^_@.]+)? # Territory + (\..+)? # Charset + /x); + return defined $territory ? ("${lang}${territory}", $lang) : ($lang); +} +sub getlangs ($) { + my $lang=shift; + if (defined $lang && $lang eq 'auto') { + require POSIX; + $lang=POSIX::setlocale(5); # LC_MESSAGES + } + return _getlocalelist($lang); +} + +sub langdir ($@) { + my $rootdir=shift; + my @langs=shift; + foreach my $try (@langs) { + my $maybe="${rootdir}/${try}"; + return $maybe if -d $maybe; + } + debug("No matching language dir for '@langs'; falling back to '$rootdir'"); + return $rootdir; +} + sub checkconfig () { #{{{ if ($config{w3mmode}) { eval q{use Cwd q{abs_path}}; @@ -70,7 +104,15 @@ sub checkconfig () { #{{{ $config{wikistatedir}="$config{srcdir}/.ikiwiki" unless exists $config{wikistatedir}; - + + # Sanitize lang. + my @langs=getlangs($config{lang}); + $config{lang}=$langs[0] unless exists $config{lang}; + + # Honor multilang directory structures. + $config{templatedir}=langdir($config{templatedir}, @langs); + $config{underlaydir}=langdir($config{underlaydir}, @langs); + if ($config{rcs}) { eval qq{require IkiWiki::Rcs::$config{rcs}}; if ($@) { diff --git a/IkiWiki/CGI.pm b/IkiWiki/CGI.pm index 53e151d..292fa54 100644 --- a/IkiWiki/CGI.pm +++ b/IkiWiki/CGI.pm @@ -75,6 +75,7 @@ sub cgi_signin ($$) { #{{{ fields => [qw(do title page subpage from name password confirm_password email)], header => 1, charset => "utf-8", + messages => ":$config{lang}", method => 'POST', validate => { confirm_password => { @@ -241,6 +242,7 @@ sub cgi_prefs ($$) { #{{{ subscriptions locked_pages)], header => 0, charset => "utf-8", + messages => ":$config{lang}", method => 'POST', validate => { confirm_password => { @@ -313,6 +315,7 @@ sub cgi_editpage ($$) { #{{{ fields => [qw(do rcsinfo subpage from page editcontent comments)], header => 1, charset => "utf-8", + messages => ":$config{lang}", method => 'POST', validate => { editcontent => '/.+/',