NAME
Amon2::Plugin::L10N - L10N support for Amon2
DESCRIPTION
Amon2::Plugin::L10N is L10N support plugin for Amon2.
Implementation L10N for your App
in YourProj.pm
__PACKAGE__->load_plugins('L10N' => {
default_lang => 'en', # default is en
accept_langs => [qw/ en ja zh-tw zh-cn fr /], # default is ['en']
po_dir => 'po', # default is po
});
in your YourProj::Web::ViewFunction
use Text::Xslate ();
sub l {
my $string = shift;
my @args = map { Text::Xslate::html_escape($_) } @_; # escape arguments
Text::Xslate::mark_raw( YourProj->context->loc($string, @args) );
}
in your tmpl/foo.tt
[% l('Hello! %1', 'username') %]
in your some class
package YourProj::M::Foo;
sub bar {
YourProj->context->loc('hello! %1', $username);
}
hook of before language detection
__PACKAGE__->load_plugins('L10N' => {
accept_langs => [qw/ en ja zh-tw zh-cn fr /],
before_detection_hook => sub {
my $c = shift;
return unless ref($c);
my $accept_re = qr/\A(?:en|ja|zh-tw)\z/;
my $lang = $c->req->param('lang');
if ($lang && $lang =~ $accept_re) {
$c->session->set( lang => $lang );
return $lang;
} elsif (! defined $lang) {
$lang = $c->session->get('lang');
if ($lang && $lang =~ $accept_re) {
return $lang;
}
}
$c->session->set( lang => '' );
return; # through
},
});
hook of after language detection
__PACKAGE__->load_plugins('L10N' => {
accept_langs => [qw/ en ja zh zh-tw zh-cn fr /],
after_detection_hook => sub {
my($c, $lang) = shift;
return 'zh' if $lang =~ /\Azh(?:-.+)\z/;
return $lang;
},
});
you can customize the po files name
__PACKAGE__->load_plugins('L10N' => {
accept_langs => [qw/ zh-tw zh-cn zh /],
po_file_langs => [qw/ zh-tw zh-cn /], # zh.po is not exists file
after_detection_hook => sub {
my($c, $lang) = shift;
return 'zh-cn' if $lang eq 'zh'; # use zh-cn.po file
return $lang;
},
});
for your CLI
__PACKAGE__->load_plugins('L10N' => {
default_lang => 'ja',
accept_langs => [qw/ en ja /],
before_detection_hook => sub {
my $c = shift;
return unless $NEV{CLI_MODE}; # CLI_MODE is example key
return 'ja' if $ENV{LANG} =~ /ja/i;
return 'en' if $ENV{LANG} =~ /en/i;
return; # use default lang
},
});
you can set Locale::Maketext::Lexicon options
# in your MyApp.pm
__PACKAGE__->load_plugins('L10N' => {
accept_langs => [qw/ ja /],
lexicon_options => {
_auto => 0,
},
});
you can implement L10N class yourself
package L10N;
use strict;
use warnings;
use parent 'Locale::Maketext';
use File::Spec;
use Locale::Maketext::Lexicon +{
'ja' => [ Gettext => File::Spec->catfile('t', 'po', 'ja.po') ],
_preload => 1,
_style => 'gettext',
_decode => 1,
};
# in your MyApp.pm
__PACKAGE__->load_plugins('L10N' => {
accept_langs => [qw/ ja /],
l10n_class => 'L10N',
});
Translation Step
installing dependent module of amon2-xgettext.pl
$ cpanm --with-suggests Amon2::Plugin::L10N
dependnt module list in the cpanfile file.
write your application
run amon2-xgettext.pl
$ cd your_amon2_proj_base_dir
$ perl amon2-xgettext.pl en ja fr zh-tw
edit .po files
$ vim po/ja.po
$ vim po/zh-tw.po
Add Amon2 Context Method
$c->l10n_language_detection
Language that is detected will return.
$c->loc($message), $c->loc('foo %1 .. %2 ...', @args);
It will return the text in the appropriate language.
AUTHOR
Kazuhiro Osawa <yappo {at} shibuya {dot} pl>
COPYRIGHT
Copyright 2013- Kazuhiro Osawa
LICENSE
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
SEE ALSO
Amon2, Locale::Maketext::Lexicon, HTTP::AcceptLanguage, amon2-xgettext.pl