1 package Locale::Maketext::Simple;
2 $Locale::Maketext::Simple::VERSION = '0.18';
9 Locale::Maketext::Simple - Simple interface to Locale::Maketext::Lexicon
13 This document describes version 0.18 of Locale::Maketext::Simple,
14 released Septermber 8, 2006.
18 Minimal setup (looks for F<auto/Foo/*.po> and F<auto/Foo/*.mo>):
21 use Locale::Maketext::Simple; # exports 'loc'
22 loc_lang('fr'); # set language to French
24 print loc("Hello, [_1]!", "World");
27 More sophisticated example:
30 use Locale::Maketext::Simple (
31 Class => 'Foo', # search in auto/Foo/
32 Style => 'gettext', # %1 instead of [_1]
33 Export => 'maketext', # maketext() instead of loc()
34 Subclass => 'L10N', # Foo::L10N instead of Foo::I18N
35 Decode => 1, # decode entries to unicode-strings
36 Encoding => 'locale', # but encode lexicons in current locale
37 # (needs Locale::Maketext::Lexicon 0.36)
40 print maketext("Just another %1 hacker", "Perl");
45 This module is a simple wrapper around B<Locale::Maketext::Lexicon>,
46 designed to alleviate the need of creating I<Language Classes> for
49 If B<Locale::Maketext::Lexicon> is not present, it implements a
50 minimal localization function by simply interpolating C<[_1]> with
51 the first argument, C<[_2]> with the second, etc. Interpolated
52 function like C<[quant,_1]> are treated as C<[_1]>, with the sole
53 exception of C<[tense,_1,X]>, which will append C<ing> to C<_1> when
54 X is C<present>, or appending C<ed> to <_1> otherwise.
58 All options are passed either via the C<use> statement, or via an
63 By default, B<Locale::Maketext::Simple> draws its source from the
64 calling package's F<auto/> directory; you can override this behaviour
65 by explicitly specifying another package as C<Class>.
69 If your PO and MO files are under a path elsewhere than C<auto/>,
70 you may specify it using the C<Path> option.
74 By default, this module uses the C<maketext> style of C<[_1]> and
75 C<[quant,_1]> for interpolation. Alternatively, you can specify the
76 C<gettext> style, which uses C<%1> and C<%quant(%1)> for interpolation.
78 This option is case-insensitive.
82 By default, this module exports a single function, C<loc>, into its
83 caller's namespace. You can set it to another name, or set it to
84 an empty string to disable exporting.
88 By default, this module creates an C<::I18N> subclass under the
89 caller's package (or the package specified by C<Class>), and stores
90 lexicon data in its subclasses. You can assign a name other than
91 C<I18N> via this option.
95 If set to a true value, source entries will be converted into
96 utf8-strings (available in Perl 5.6.1 or later). This feature
97 needs the B<Encode> or B<Encode::compat> module.
101 Specifies an encoding to store lexicon entries, instead of
102 utf8-strings. If set to C<locale>, the encoding from the current
103 locale setting is used. Implies a true value for C<Decode>.
108 my ($class, %args) = @_;
110 $args{Class} ||= caller;
111 $args{Style} ||= 'maketext';
112 $args{Export} ||= 'loc';
113 $args{Subclass} ||= 'I18N';
115 my ($loc, $loc_lang) = $class->load_loc(%args);
116 $loc ||= $class->default_loc(%args);
119 *{caller(0) . "::$args{Export}"} = $loc if $args{Export};
120 *{caller(0) . "::$args{Export}_lang"} = $loc_lang || sub { 1 };
125 sub reload_loc { %Loc = () }
128 my ($class, %args) = @_;
130 my $pkg = join('::', grep { defined and length } $args{Class}, $args{Subclass});
131 return $Loc{$pkg} if exists $Loc{$pkg};
133 eval { require Locale::Maketext::Lexicon; 1 } or return;
134 $Locale::Maketext::Lexicon::VERSION > 0.20 or return;
135 eval { require File::Spec; 1 } or return;
137 my $path = $args{Path} || $class->auto_path($args{Class}) or return;
138 my $pattern = File::Spec->catfile($path, '*.[pm]o');
139 my $decode = $args{Decode} || 0;
140 my $encoding = $args{Encoding} || undef;
142 $decode = 1 if $encoding;
144 $pattern =~ s{\\}{/}g; # to counter win32 paths
148 use base 'Locale::Maketext';
149 %${pkg}::Lexicon = ( '_AUTO' => 1 );
150 Locale::Maketext::Lexicon->import({
151 'i-default' => [ 'Auto' ],
152 '*' => [ Gettext => \$pattern ],
154 _encoding => \$encoding,
156 *tense = sub { \$_[1] . ((\$_[2] eq 'present') ? 'ing' : 'ed') }
157 unless defined &tense;
162 my $lh = eval { $pkg->get_handle } or return;
163 my $style = lc($args{Style});
164 if ($style eq 'maketext') {
169 elsif ($style eq 'gettext') {
172 $str =~ s{([\~\[\]])}{~$1}g;
174 ([%\\]%) # 1 - escaped sequence
177 ([A-Za-z#*]\w*) # 2 - function call
178 \(([^\)]*)\) # 3 - arguments
180 ([1-9]\d*|\*) # 4 - variable
184 : $2 ? "\[$2,"._unescape($3)."]"
187 return $lh->maketext($str, @_);
191 die "Unknown Style: $style";
194 return $Loc{$pkg}, sub {
195 $lh = $pkg->get_handle(@_);
196 $lh = $pkg->get_handle(@_);
201 my ($self, %args) = @_;
202 my $style = lc($args{Style});
203 if ($style eq 'maketext') {
206 $str =~ s{((?<!~)(?:~~)*)\[_([1-9]\d*|\*)\]}
208 $str =~ s{((?<!~)(?:~~)*)\[([A-Za-z#*]\w*),([^\]]+)\]}
209 {"$1%$2(" . _escape($3) . ')'}eg;
210 _default_gettext($str, @_);
213 elsif ($style eq 'gettext') {
214 return \&_default_gettext;
217 die "Unknown Style: $style";
221 sub _default_gettext {
226 \d+ # a digit, like %1
228 (\w+)\( # a function call -- 1
230 %\d+ # an interpolation
232 ([^,]*) # some string -- 2
236 ([^),]*) # and a param -- 3
240 ([^),]*) # and a param -- 4
242 [^)]* # and other ignorable params
243 \) # closing function call
244 ) # closing either one of
246 my $digit = $2 || shift;
249 ($1 eq 'tense') ? (($3 eq 'present') ? 'ing' : 'ed') :
250 ($1 eq 'quant') ? ' ' . (($digit > 1) ? ($4 || "$3s") : $3) :
260 $text =~ s/\b_([1-9]\d*)/%$1/g;
266 /\A(\s*)%([1-9]\d*|\*)(\s*)\z/ ? "$1_$2$3" : $_
267 } split(/,/, $_[0]));
271 my ($self, $calldir) = @_;
272 $calldir =~ s#::#/#g;
273 my $path = $INC{$calldir . '.pm'} or return;
275 # Try absolute path name.
276 if ($^O eq 'MacOS') {
277 (my $malldir = $calldir) =~ tr#/#:#;
278 $path =~ s#^(.*)$malldir\.pm\z#$1auto:$malldir:#s;
280 $path =~ s#^(.*)$calldir\.pm\z#$1auto/$calldir/#;
283 return $path if -d $path;
285 # If that failed, try relative path with normal @INC searching.
286 $path = "auto/$calldir/";
287 foreach my $inc (@INC) {
288 return "$inc/$path" if -d "$inc/$path";
296 =head1 ACKNOWLEDGMENTS
298 Thanks to Jos I. Boumans for suggesting this module to be written.
300 Thanks to Chia-Liang Kao for suggesting C<Path> and C<loc_lang>.
304 L<Locale::Maketext>, L<Locale::Maketext::Lexicon>
308 Audrey Tang E<lt>cpan@audreyt.orgE<gt>
312 Copyright 2003, 2004, 2005, 2006 by Audrey Tang E<lt>cpan@audreyt.orgE<gt>.
314 This software is released under the MIT license cited below. Additionally,
315 when this software is distributed with B<Perl Kit, Version 5>, you may also
316 redistribute it and/or modify it under the same terms as Perl itself.
318 =head2 The "MIT" License
320 Permission is hereby granted, free of charge, to any person obtaining a copy
321 of this software and associated documentation files (the "Software"), to deal
322 in the Software without restriction, including without limitation the rights
323 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
324 copies of the Software, and to permit persons to whom the Software is
325 furnished to do so, subject to the following conditions:
327 The above copyright notice and this permission notice shall be included in
328 all copies or substantial portions of the Software.
330 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
331 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
332 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
333 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
334 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
335 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
336 DEALINGS IN THE SOFTWARE.