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
parent
6fc25c8df7
commit
f1183cbf0c
44
IkiWiki.pm
44
IkiWiki.pm
|
@ -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;
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue