# NAME
I18N::Handle - A common i18n handler for web frameworks and applications.
# DESCRIPTION
__***THIS MODULE IS STILL IN DEVELOPMENT***__
[I18N::Handle](
http://search.cpan.org/perldoc?I18N::Handle) is a common handler for web frameworks and applications.
I18N::Handle also provides exporting a global loc function to make localization,
the default loc function name is `"_"`. To change the exporting loc function name
, please use `loc` option.
The difference between I18N::Handle and [Locale::Maketext](
http://search.cpan.org/perldoc?Locale::Maketext) is that
I18N::Handle automatically does most things for you, and it provides simple API
like `speak`, `can_speak` instead of `get_handle`, `languages`.
To generate po/mo files, [App::I18N](
http://search.cpan.org/perldoc?App::I18N) is an utility for this, App::I18N is a
command-line tool for parsing, exporting, managing, editing, translating i18n
messages. See also [App::I18N](
http://search.cpan.org/perldoc?App::I18N).
# SYNOPSIS
Ideas are welcome. just drop me a line.
option `import` takes the same arguments as [Locale::Maketext::Lexicon](
http://search.cpan.org/perldoc?Locale::Maketext::Lexicon) takes.
it's _language_ => [ _format_ => _source_ ].
use I18N::Handle;
my $hl = I18N::Handle->new(
import => {
en => [ Gettext => 'po/en.po' ],
fr => [ Gettext => 'po/fr.po' ],
jp => [ Gettext => 'po/jp.po' ],
})->accept( qw(en fr) )->speak( 'en' );
Or a simple way to import gettext po files:
This will transform the args to the args that `import` option takes:
use I18N::Handle;
my $hl = I18N::Handle->new(
Gettext => {
en => 'po/en.po',
fr => 'po/fr.po',
jp => [ 'po/jp.po' , 'po2/jp.po' ],
})->accept( qw(en fr) )->speak( 'en' );
print _('Hello world');
$hl->speak( 'fr' );
$hl->speak( 'jp' );
$hl->speaking; # return 'jp'
my @langs = $hl->can_speak(); # return 'en', 'fr', 'jp'
# OPTIONS
- _format_ => { _language_ => _source_ , ... }
Format could be _Gettext | Msgcat | Slurp | Tie_.
use I18N::Handle;
my $hl = I18N::Handle->new(
Gettext => {
en => 'po/en.po',
fr => 'po/fr.po',
jp => [ 'po/jp.po' , 'po2/jp.po' ],
});
$hl->speak( 'en' );
- `po` => '_path_' | [ _path1_ , _path2_ ]
Suppose you have these files:
po/en.po
po/zh_TW.po
When using:
I18N::Handle->new( po => 'po' );
will be found. can you can get these langauges:
[ en , zh-tw ]
- `locale` => 'path' | [ path1 , path2 ]
- `import` => Arguments to [Locale::Maketext::Lexicon](
http://search.cpan.org/perldoc?Locale::Maketext::Lexicon)
# OPTIONAL OPTIONS
- `style` => _style_ ... (Optional)
The style could be `gettext`.
- `loc` => _global loc function name_ (Optional)
The default global loc function name is `_`.
loc => 'loc'
- `loc_func` => _CodeRef_ (Optional)
Use a custom global localization function instead of default localization
function.
loc_func => sub {
my ($self,$lang_handle) = @_;
...
return $text;
}
# USE CASES
## Handling po files
$hl = I18N::Handle->new(
po => 'path/to/po',
style => 'gettext' # use gettext style format (default)
)->speak( 'en' );
print _('Hello world');
## Handling locale
If you need to bind the locale directory structure like this:
path/to/locale/en/LC_MESSAGES/app.po
path/to/locale/en/LC_MESSAGES/app.mo
path/to/locale/zh_tw/LC_MESSAGES/app.po
path/to/locale/zh_tw/LC_MESSAGES/app.mo
You can just pass the `locale` option:
$hl = I18N::Handle->new(
locale => 'path/to/locale'
)->speak( 'en_US' );
or just use `import`:
$hl = I18N::Handle->new(
import => { '*' => 'locale/*/LC_MESSAGES/hello.mo' } );
## Handling json files
__not implemented yet__
Ensure you have json files:
json/en.json
json/fr.json
json/ja.json
Then specify the `json` option:
$hl = I18N::Handle->new( json => 'json' );
## Singleton
If you need a singleton [I18N::Handle](
http://search.cpan.org/perldoc?I18N::Handle), this is a helper function to return
the singleton object:
$hl = I18N::Handle->singleton( locale => 'path/to/locale' );
In your applications, might be like this:
sub get_i18n {
my $class = shift;
return I18N::Handle->singleton( ... options ... )
}
## Connect to a remote i18n server
__not implemented yet__
Connect to a translation server:
$handle = I18N::Handle->new(
server => 'translate.me' )->speak( 'en_US' );
## Binding with database
__not implemented yet__
Connect to a database:
$handle = I18N::Handle->new(
dsn => 'DBI:mysql:database=$database;host=$hostname;port=$port;'
);
## Binding with Google translation service
__not implemented yet__
Connect to google translation:
$handle = I18N::Handle->new( google => "" );
## Exporting loc function to Text::Xslate
my $tx = Text::Xslate->new(
path => ['templates'],
cache_dir => ".xslate_cache",
cache => 1,
function => { "_" => \&_ } );
Then you can use `_` function inside your [Text::Xslate](
http://search.cpan.org/perldoc?Text::Xslate) templates:
<: _('Hello') :>
# PUBLIC METHODS
## new
## singleton( I<options> )
If you need a singleton [I18N::Handle](
http://search.cpan.org/perldoc?I18N::Handle), this is a helper function to return
the singleton object.
## speak( I<language> )
setup current language. _language_, can be `en`, `fr` and so on..
## speaking()
get current speaking language name.
## can_speak()
return a list that currently supported.
## accept( I<language name list> )
setup accept languages.
$hl->accpet( qw(en fr) );
## fallback( I<language> )
setup fallback language. when speak() fails , fallback to this language.
$hl->fallback( 'en' );
# PRIVATE METHODS
## _unify_langtag
## _scan_po_files
## _scan_locale_files
# AUTHOR
Yoan Lin <cornelius.howl {at} gmail.com>
# SEE ALSO
[App::I18N](
http://search.cpan.org/perldoc?App::I18N)
# LICENSE
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.