summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoey Hess <joey@gnu.kitenet.net>2010-02-14 17:25:30 -0500
committerJoey Hess <joey@gnu.kitenet.net>2010-02-14 18:09:12 -0500
commitf1183cbf0c9c09725192dcc8384381f9112ae222 (patch)
tree7a7839af53f3076245b0c8fd898b105f3bb1fdb6
parent6fc25c8df79c4ce9afde256be5d377ee82562c31 (diff)
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.
-rw-r--r--IkiWiki.pm44
-rw-r--r--doc/plugins/write.mdwn4
2 files changed, 34 insertions, 14 deletions
diff --git a/IkiWiki.pm b/IkiWiki.pm
index a96ff1236..b9a419d1d 100644
--- a/IkiWiki.pm
+++ b/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;
diff --git a/doc/plugins/write.mdwn b/doc/plugins/write.mdwn
index a8c9de2d3..96a2aa16d 100644
--- a/doc/plugins/write.mdwn
+++ b/doc/plugins/write.mdwn
@@ -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