NAME

I18N::Handle - A common i18n handler for web frameworks and applications.

DESCRIPTION

***THIS MODULE IS STILL IN DEVELOPMENT***

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 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 is an utility for this, App::I18N is a command-line tool for parsing, exporting, managing, editing, translating i18n messages. See also App::I18N.

SYNOPSIS

Ideas are welcome. just drop me a line.

option import takes the same arguments as 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' ],
                    ja => [ Gettext => 'po/ja.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',
                    ja => [ 'po/ja.po' , 'po2/ja.po' ],
            })->accept( qw(en fr) )->speak( 'en' );


print _('Hello world');

$hl->speak( 'fr' );
$hl->speak( 'ja' );
$hl->speaking;  # return 'ja'

my @langs = $hl->can_speak();  # return 'en', 'fr', 'ja'

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',
                    ja => [ 'po/ja.po' , 'po2/ja.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

OPTIONAL OPTIONS

no_global_loc => bool

Do not install global locale method "_".

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, 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 templates:

<: _('Hello') :>

PUBLIC METHODS

new

singleton( options )

If you need a singleton I18N::Handle, this is a helper function to return the singleton object.

speak( 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( language name list )

setup accept languages.

$hl->accpet( qw(en fr) );

fallback( 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

LICENSE

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.