Optimise use of gettext, and avoid ugly warnings if Locale::gettext is not available.
authorJoey Hess <joey@gnu.kitenet.net>
Mon, 8 Jun 2009 22:27:40 +0000 (18:27 -0400)
committerJoey Hess <joey@gnu.kitenet.net>
Mon, 8 Jun 2009 22:33:54 +0000 (18:33 -0400)
The test suite was emitting a lot of ugly gettext warnings;
setting LC_ALL didn't solve the problem for all locale setups
(since ikiwiki remaps it to LANG, and ikiwiki didn't know about
the C locale).

People also seem generally annoyed by the messages when
Locale::Gettext is not installed, and I suspect will be
generally happier if it just silently doesn't localize.

The optimisation came about when I noticed that the gettext
sub was doing rather a lot of work each call just to see
if localisation is needed. We can avoid that work by caching,
and the best thing to cache is a version of the gettext sub
that does exactly the right thing.

This was slightly complicated by the locale setting,
which might need to override the original locale (or lack
thereof) after gettext has been called. So it needs to invalidate
the cache in that case. It used to do it via a global variable,
which I am happy to have also gotten rid of.

IkiWiki.pm
debian/changelog
t/basewiki_brokenlinks.t
t/permalink.t

index d7c827c89b240d8d1b178be76934ce3c868ba4f8..a0a61ac642424e477d26aca7977036ce1355a692 100644 (file)
@@ -14,7 +14,7 @@ use open qw{:utf8 :std};
 use vars qw{%config %links %oldlinks %pagemtime %pagectime %pagecase
            %pagestate %wikistate %renderedfiles %oldrenderedfiles
            %pagesources %destsources %depends %hooks %forcerebuild
-           $gettext_obj %loaded_plugins};
+           %loaded_plugins};
 
 use Exporter q{import};
 our @EXPORT = qw(hook debug error template htmlpage add_depends pagespec_match
@@ -459,7 +459,7 @@ sub checkconfig () {
        if (defined $config{locale}) {
                if (POSIX::setlocale(&POSIX::LC_ALL, $config{locale})) {
                        $ENV{LANG}=$config{locale};
-                       $gettext_obj=undef;
+                       define_gettext();
                }
        }
                
@@ -1704,29 +1704,37 @@ sub file_pruned ($$) {
        return $file =~ m/$regexp/ && $file ne $base;
 }
 
-sub gettext {
-       # Only use gettext in the rare cases it's needed.
+sub define_gettext () {
+       # If translation is needed, redefine the gettext function to do it.
+       # Otherwise, it becomes a quick no-op.
+       no warnings 'redefine';
        if ((exists $ENV{LANG} && length $ENV{LANG}) ||
            (exists $ENV{LC_ALL} && length $ENV{LC_ALL}) ||
            (exists $ENV{LC_MESSAGES} && length $ENV{LC_MESSAGES})) {
-               if (! $gettext_obj) {
-                       $gettext_obj=eval q{
+               *gettext=sub {
+                       my $gettext_obj=eval q{
                                use Locale::gettext q{textdomain};
                                Locale::gettext->domain('ikiwiki')
                        };
-                       if ($@) {
-                               print STDERR "$@";
-                               $gettext_obj=undef;
+
+                       if ($gettext_obj) {
+                               $gettext_obj->get(shift);
+                       }
+                       else {
                                return shift;
                        }
-               }
-               return $gettext_obj->get(shift);
+               };
        }
        else {
-               return shift;
+               *gettext=sub { return shift };
        }
 }
 
+sub gettext {
+       define_gettext();
+       gettext(@_);
+}
+
 sub yesno ($) {
        my $val=shift;
 
index 7f82578130ff93b632f4a2a4ca3b6f94097f6ff8..126c1826ba60943d9b5f9c5e9add845cb4be63b3 100644 (file)
@@ -18,6 +18,8 @@ ikiwiki (3.15) UNRELEASED; urgency=low
     name, to support several cases including mercurial's long user
     names on the RecentChanges page, and urls with spaces being handled
     by the 404 plugin.
+  * Optimise use of gettext, and avoid ugly warnings if Locale::gettext
+    is not available. Closes: #532285
 
  -- Joey Hess <joeyh@debian.org>  Tue, 02 Jun 2009 17:03:41 -0400
 
index 2871b1dd20524836df0451b3e335a022d25f1724..fd003749291c73023ddf05d5ba11c15b90329a58 100755 (executable)
@@ -8,7 +8,7 @@ ok(! system("make -s ikiwiki.out"));
 ok(! system("make extra_install DESTDIR=`pwd`/t/tmp/install PREFIX=/usr >/dev/null"));
 
 foreach my $plugin ("", "listdirectives") {
-       ok(! system("LC_ALL=C perl -I. ./ikiwiki.out -rebuild -plugin brokenlinks ".
+       ok(! system("perl -I. ./ikiwiki.out -rebuild -plugin brokenlinks ".
                        # always enabled because pages link to it conditionally,
                        # which brokenlinks cannot handle properly
                        "-plugin smiley ".
index c326e8d278e4f025a8623512ab06d57a6ad5565c..b49b9833813468597e269ab0b9af38ae9920dc0b 100755 (executable)
@@ -5,7 +5,7 @@ use Test::More 'no_plan';
 
 ok(! system("mkdir t/tmp"));
 ok(! system("make -s ikiwiki.out"));
-ok(! system("LC_ALL=C perl -I. ./ikiwiki.out -plugin inline -url=http://example.com -cgiurl=http://example.com/ikiwiki.cgi -rss -atom -underlaydir=underlays/basewiki -templatedir=templates t/tinyblog t/tmp/out"));
+ok(! system("perl -I. ./ikiwiki.out -plugin inline -url=http://example.com -cgiurl=http://example.com/ikiwiki.cgi -rss -atom -underlaydir=underlays/basewiki -templatedir=templates t/tinyblog t/tmp/out"));
 # This guid should never, ever change, for any reason whatsoever!
 my $guid="http://example.com/post/";
 ok(length `grep '<guid>$guid</guid>' t/tmp/out/index.rss`);