add ngettext support & optimize gettext handling

As I was adding ngettext support, I realized I could optimize the gettext
functions by memoizing the creation of the gettext object. Note that
the object creation is still deferred until a gettext function is called,
to avoid unnecessary startup penalties on code paths that do not need
gettext.

A side benefit is that separate stub functions are no longer needed to
handle the C language case.
master
Joey Hess 2010-02-14 17:25:30 -05:00
parent 6fc25c8df7
commit f1183cbf0c
2 changed files with 34 additions and 14 deletions

View File

@ -20,7 +20,7 @@ use Exporter q{import};
our @EXPORT = qw(hook debug error template htmlpage deptype
add_depends pagespec_match pagespec_match_list bestlink
htmllink readfile writefile pagetype srcfile pagename
displaytime will_render gettext urlto targetpage
displaytime will_render gettext ngettext urlto targetpage
add_underlay pagetitle titlepage linkpage newpagefile
inject add_link
%config %links %pagestate %wikistate %renderedfiles
@ -1820,27 +1820,38 @@ sub file_pruned ($;$) {
sub define_gettext () {
# If translation is needed, redefine the gettext function to do it.
# Otherwise, it becomes a quick no-op.
no warnings 'redefine';
my $gettext_obj;
my $getobj;
if ((exists $ENV{LANG} && length $ENV{LANG}) ||
(exists $ENV{LC_ALL} && length $ENV{LC_ALL}) ||
(exists $ENV{LC_MESSAGES} && length $ENV{LC_MESSAGES})) {
*gettext=sub {
my $gettext_obj=eval q{
$getobj=sub {
$gettext_obj=eval q{
use Locale::gettext q{textdomain};
Locale::gettext->domain('ikiwiki')
};
if ($gettext_obj) {
$gettext_obj->get(shift);
}
else {
return shift;
}
};
}
else {
*gettext=sub { return shift };
}
no warnings 'redefine';
*gettext=sub {
$getobj->() if $getobj;
if ($gettext_obj) {
$gettext_obj->get(shift);
}
else {
return shift;
}
};
*ngettext=sub {
$getobj->() if $getobj;
if ($gettext_obj) {
$gettext_obj->nget(@_);
}
else {
return ($_[2] == 1 ? $_[0] : $_[1])
}
};
}
sub gettext {
@ -1848,6 +1859,11 @@ sub gettext {
gettext(@_);
}
sub ngettext {
define_gettext();
ngettext(@_);
}
sub yesno ($) {
my $val=shift;

View File

@ -911,6 +911,10 @@ time.
This is the standard gettext function, although slightly optimised.
### `ngettext`
This is the standard ngettext function, although slightly optimised.
### `urlto($$;$)`
Construct a relative url to the first parameter from the page named by the