Catalyst::Plugin::I18N::Manual.3pm

Langue: en

Version: 2009-07-30 (fedora - 01/12/10)

Section: 3 (Bibliothèques de fonctions)

NAME

Catalyst::Plugin::I18N::Manual - (Draft) I18N and L10N with Catalyst and Template Toolkit.

OUTLINE

     Prerequisites:
      - perl >= 5.8.0
      - Catalyst >= 5.33
      - Catalyst::Plugin::I18N >= 0.04
      - Catalyst::Plugin::Unicode >= 0.2
      - Catlayst::View::TT && Template-Toolkit >= 2.14
      - GNU gettext utilities
      - An editor that understands UTF-8 and Byte Order Mark (BOM)
 
     $ catalyst.pl MyApp
     created "MyApp"
     created "MyApp/script"
     created "MyApp/lib"
     created "MyApp/root"
     created "MyApp/root/static"
     created "MyApp/root/static/images"
     created "MyApp/t"
     created "MyApp/lib/MyApp"
     created "MyApp/lib/MyApp/Model"
     created "MyApp/lib/MyApp/View"
     created "MyApp/lib/MyApp/Controller"
     created "MyApp/lib/MyApp.pm"
     created "MyApp/Makefile.PL"
     created "MyApp/README"
     created "MyApp/Changes"
     created "MyApp/t/01app.t"
     created "MyApp/t/02pod.t"
     created "MyApp/t/03podcoverage.t"
     created "MyApp/root/static/images/catalyst_logo.png"
     created "MyApp/root/static/images/btn_120x50_built.png"
     created "MyApp/root/static/images/btn_120x50_built_shadow.png"
     created "MyApp/root/static/images/btn_120x50_powered.png"
     created "MyApp/root/static/images/btn_120x50_powered_shadow.png"
     created "MyApp/root/static/images/btn_88x31_built.png"
     created "MyApp/root/static/images/btn_88x31_built_shadow.png"
     created "MyApp/root/static/images/btn_88x31_powered.png"
     created "MyApp/root/static/images/btn_88x31_powered_shadow.png"
     created "MyApp/root/favicon.ico"
     created "MyApp/script/myapp_cgi.pl"
     created "MyApp/script/myapp_fastcgi.pl"
     created "MyApp/script/myapp_server.pl"
     created "MyApp/script/myapp_test.pl"
     created "MyApp/script/myapp_create.pl"
 
     $ cd MyApp
     $ vim lib/MyApp.pm
 
     use Catalyst qw/-Debug I18N Unicode/;
     
     sub begin : Private {
         my ( $self, $c ) = @_;
         
         my $locale = $c->request->param('locale');
         
         $c->response->headers->push_header( 'Vary' => 'Accept-Language' );  # hmm vary and param?
         $c->languages( $locale ? [ $locale ] : undef );
     }
 
     sub default : Private {
         my ( $self, $c ) = @_;
 
         my $name = $c->request->param('name') || $c->loc('Guest');
 
         $c->response->content_type('text/plain; charset=utf-8');
         $c->response->body( $c->loc( 'Welcome [_1]!', $name ) );
     }
 
     $ mkdir lib/MyApp/I18N
     $ xgettext.pl --output=lib/MyApp/I18N/messages.pot --directory=lib/
     $ ls lib/MyApp/I18N/
     messages.pot
 
     $ msginit --input=lib/MyApp/I18N/messages.pot --output=lib/MyApp/I18N/sv.po --locale=sv
     Created lib/MyApp/I18N/sv.po.
 
     $ vim lib/MyApp/I18N/sv.po
 
     "Content-Type: text/plain; charset=utf-8\n"
 
     #: lib/MyApp.pm:50
     msgid "Guest"
     msgstr "Ga.st"
 
     #. ($name)
     #: lib/MyApp.pm:54
     msgid "Welcome %1!"
     msgstr "Va.lkommen %1!"
 
     $ perl script/myapp_server.pl
     [Fri Dec  2 03:52:45 2005] [catalyst] [debug] Debug messages enabled
     [Fri Dec  2 03:52:47 2005] [catalyst] [debug] Loaded plugins:
     .------------------------------------------------------------------------------.
     | Catalyst::Plugin::I18N                                                       |
     | Catalyst::Plugin::Unicode                                                    |
     '------------------------------------------------------------------------------'
 
     [Fri Dec  2 03:52:47 2005] [catalyst] [debug] Loaded dispatcher "Catalyst::Dispatcher"
     [Fri Dec  2 03:52:47 2005] [catalyst] [debug] Loaded engine "Catalyst::Engine::HTTP"
     [Fri Dec  2 03:52:47 2005] [catalyst] [debug] Found home "/Users/chansen/MyApp"
     [Fri Dec  2 03:52:48 2005] [catalyst] [debug] Initialized i18n "MyApp::I18N"
     [Fri Dec  2 03:52:48 2005] [catalyst] [debug] Loaded Private actions:
     .----------------------+----------------------------------------+--------------.
     | Private              | Class                                  | Method       |
     +----------------------+----------------------------------------+--------------+
     | /default             | MyApp                                  | default      |
     '----------------------+----------------------------------------+--------------'
 
     [Fri Dec  2 03:52:48 2005] [catalyst] [info] MyApp powered by Catalyst 5.57
     You can connect to your server at http://localhost:3000
 
     # point your browser to http://localhost:3000/?name=Joe
     # output should render:
 
     Va.lkommen Joe!
 
     $ vim lib/MyApp.pm
 
     sub default : Private {
 
         # ...
 
         $c->response->body( $c->loc( 'Welcome to my homepage [_1]!', $name ) );
     }
     
     $ xgettext.pl --output=lib/MyApp/I18N/messages.pot --directory=lib/
     $ msgmerge --update lib/MyApp/I18N/sv.po lib/MyApp/I18N/messages.pot
     . done.
 
     $ vim lib/MyApp/I18N/sv.po
 
     #. ($name)
     #: lib/MyApp.pm:54
     msgid "Welcome to my homepage %1!"
     msgstr "Va.lkommen till min hemsida %1!"
 
     $ perl script/myapp_server.pl
 
     # point your browser to http://localhost:3000/?name=Joe
     # output should render:
 
     Va.lkommen till min hemsida Joe!
 
     $ perl script/myapp_create.pl view TT TT
      exists "/Users/chansen/MyApp/script/../lib/MyApp/View"
      exists "/Users/chansen/MyApp/script/../t"
     created "/Users/chansen/MyApp/script/../lib/MyApp/View/TT.pm"
     created "/Users/chansen/MyApp/script/../t/view_TT.t"
     
     $ vim lib/MyApp.pm
 
     sub default : Private {
         my ( $self, $c ) = @_;
 
         my $name = $c->request->param('name') || $c->loc('Guest');
 
         $c->response->content_type('text/plain; charset=utf-8');
         $c->stash(
             name     => $name,
             template => 'test.tt' 
         );
         
         $c->forward('MyApp::View::TT');
     }
 
     $ vim root/test.tt # Save file in UTF-8 with BOM
     
     [% c.loc( 'Welcome to my place [_1]!', c.stash.name ) %]
     
     $ xgettext.pl --output=lib/MyApp/I18N/messages.pot --directory=lib/ --directory=root/
     $ msgmerge --update lib/MyApp/I18N/sv.po lib/MyApp/I18N/messages.pot
     . done.    
     
     $ vim lib/MyApp/I18N/sv.po
 
     #. (c.stash.name)
     #: root/test.tt:1
     msgid "Welcome to my place %1!"
     msgstr "Va.lkommen till mitt sta.lle %1!"
     
     $ perl script/myapp_server.pl 
     [Fri Dec  2 05:12:58 2005] [catalyst] [debug] Debug messages enabled
     [Fri Dec  2 05:12:58 2005] [catalyst] [debug] Loaded plugins:
     .------------------------------------------------------------------------------.
     | Catalyst::Plugin::I18N                                                       |
     | Catalyst::Plugin::Unicode                                                    |
     '------------------------------------------------------------------------------'
 
     [Fri Dec  2 05:12:58 2005] [catalyst] [debug] Loaded dispatcher "Catalyst::Dispatcher"
     [Fri Dec  2 05:12:58 2005] [catalyst] [debug] Loaded engine "Catalyst::Engine::HTTP"
     [Fri Dec  2 05:12:58 2005] [catalyst] [debug] Found home "/Users/chansen/MyApp"
     [Fri Dec  2 05:12:58 2005] [catalyst] [debug] Initialized i18n "MyApp::I18N"
     [Fri Dec  2 05:12:59 2005] [catalyst] [debug] Loaded components:
     .-------------------------------------------------------------------+----------.
     | Class                                                             | Type     |
     +-------------------------------------------------------------------+----------+
     | MyApp::View::TT                                                   | instance |
     '-------------------------------------------------------------------+----------'
 
     [Fri Dec  2 05:12:59 2005] [catalyst] [debug] Loaded Private actions:
     .----------------------+----------------------------------------+--------------.
     | Private              | Class                                  | Method       |
     +----------------------+----------------------------------------+--------------+
     | /default             | MyApp                                  | default      |
     '----------------------+----------------------------------------+--------------'
 
     [Fri Dec  2 05:12:59 2005] [catalyst] [info] MyApp powered by Catalyst 5.57
     You can connect to your server at http://localhost:3000
     
     # point your browser to http://localhost:3000/?name=Joe
     # output should render:
 
     Va.lkommen till mitt sta.lle Joe!
 
 

INTRODUCTION

INTERNATIONALIZATION

CONTENT NEGOTIATION

Server-driven

Agent-driven

LOCALIZATION

STAYING IN SYNC

TEMPLATE TOOLKIT

RESOURCES

Documentation

Definitions
Internationalization and localization
<http://en.wikipedia.org/wiki/Internationalization_and_localization>
Locale
<http://en.wikipedia.org/wiki/Locale>
Byte Order Mark (BOM)
<http://en.wikipedia.org/wiki/Byte_Order_Mark>
Character encoding
<http://en.wikipedia.org/wiki/Character_encoding>
Collation
<http://en.wikipedia.org/wiki/Collation>
Content Negotiation
<http://en.wikipedia.org/wiki/Content_Negotiation>
Unicode
<http://en.wikipedia.org/wiki/Unicode>

Guides

Guidelines, Checklists, and Resources
<http://www.i18nguy.com/guidelines.html>
Localisation Guide
<http://translate.sourceforge.net/wiki/guide/start>

Perl

Perl Locale handling
<http://search.cpan.org/dist/perl/pod/perllocale.pod>
Perl Unicode introduction
<http://search.cpan.org/dist/perl/pod/perluniintro.pod>
Perl Unicode support
<http://search.cpan.org/dist/perl/pod/perlunicode.pod>
Unicode-processing issues in Perl and how to cope with it
http://www.ahinea.com/en/tech/perl-unicode-struggle.html <http://www.ahinea.com/en/tech/perl-unicode-struggle.html>
Web Localization in Perl
http://search.cpan.org/dist/Locale-Maketext-Lexicon/docs/webl10n.html <http://search.cpan.org/dist/Locale-Maketext-Lexicon/docs/webl10n.html>
Localization and Perl: gettext breaks, Maketext fixes
http://search.cpan.org/dist/Locale-Maketext/lib/Locale/Maketext/TPJ13.pod <http://search.cpan.org/dist/Locale-Maketext/lib/Locale/Maketext/TPJ13.pod>
Lessons Learned with Perl and UTF-8
<http://www.justatheory.com/computers/programming/perl/utf8_trials.html>
UTF-8 and Perl (In Five Minutes)
Slides from a talk given by Mark Fowler.

<http://www.twoshortplanks.com/talks/utf8/perlandutf8.pdf>

Perl Loves UTF-8
Slides from a talk given by Tom Insam.

http://jerakeen.org/slush/talk-perl-loves-utf8 <http://jerakeen.org/slush/talk-perl-loves-utf8>

Perl I18N Mailing List
http://lists.cpan.org/showlist.cgi?name=perl-i18n <http://lists.cpan.org/showlist.cgi?name=perl-i18n>
Perl Unicode Mailing List
http://lists.cpan.org/showlist.cgi?name=perl-unicode <http://lists.cpan.org/showlist.cgi?name=perl-unicode>

Portals

Google Directory - Computers > Software > Globalization
<http://www.google.com/Top/Computers/Software/Globalization/>
Internationalization (I18N), Localization (L10N), Standards, and Amusements
<http://www.i18nguy.com/>

Standards

RFC 2616 Hypertext Transfer Protocol --- HTTP/1.1
<http://www.w3.org/Protocols/rfc2616/rfc2616.html>
Section 12: Content Negotiation
http://www.w3.org/Protocols/rfc2616/rfc2616-sec12.html#sec12 <http://www.w3.org/Protocols/rfc2616/rfc2616-sec12.html#sec12>
Section 13: Caching in HTTP
http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13 <http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13>
Section 13.6: Caching Negotiated Responses
http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.6 <http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.6>
RFC 3066 Tags for the Identification of Languages
<http://www.faqs.org/rfcs/rfc3066.html>

Web

W3C Internationalization (I18N) Activity
<http://www.w3.org/International/>
Authoring Techniques for XHTML & HTML Internationalization: Characters and Encodings 1.0
http://www.w3.org/TR/i18n-html-tech-char/ <http://www.w3.org/TR/i18n-html-tech-char/>
Authoring Techniques for XHTML & HTML Internationalization: Specifying the language of content 1.0
http://www.w3.org/TR/i18n-html-tech-lang/ <http://www.w3.org/TR/i18n-html-tech-lang/>

Locale Repositories

Common Locale Data Repository (CLDR)
<http://www.unicode.org/cldr/>
International Components for Unicode (ICU)
http://www-306.ibm.com/software/globalization/icu/index.jsp <http://www-306.ibm.com/software/globalization/icu/index.jsp>

Modules

Character Encoding, Collation and Normalization
Encode
<http://search.cpan.org/dist/Encode/>
Unicode::Collate
http://search.cpan.org/dist/Unicode-Collate/ <http://search.cpan.org/dist/Unicode-Collate/>
Unicode::Normalize
http://search.cpan.org/dist/Unicode-Normalize/ <http://search.cpan.org/dist/Unicode-Normalize/>

Currency

Locale::Currency::Format
http://search.cpan.org/dist/Locale-Currency-Format/ <http://search.cpan.org/dist/Locale-Currency-Format/>
Math::Currency
http://search.cpan.org/dist/Math-Currency/ <http://search.cpan.org/dist/Math-Currency/>

Dates

DateTime
<http://search.cpan.org/dist/DateTime/>
DateTime::Locale
http://search.cpan.org/dist/DateTime-Locale/ <http://search.cpan.org/dist/DateTime-Locale/>
DateTime::TimeZone
http://search.cpan.org/dist/DateTime-TimeZone/ <http://search.cpan.org/dist/DateTime-TimeZone/>

Language Tags, Identification and Negotiation

HTTP::Negotiate
http://search.cpan.org/dist/libwww-perl/lib/HTTP/Negotiate.pm <http://search.cpan.org/dist/libwww-perl/lib/HTTP/Negotiate.pm>
I18N::AcceptLanguage
http://search.cpan.org/dist/I18N-AcceptLanguage/ <http://search.cpan.org/dist/I18N-AcceptLanguage/>
I18N::LangTags
http://search.cpan.org/dist/I18N-LangTags/ <http://search.cpan.org/dist/I18N-LangTags/>

http://search.cpan.org/dist/I18N-LangTags/lib/I18N/LangTags/Detect.pm <http://search.cpan.org/dist/I18N-LangTags/lib/I18N/LangTags/Detect.pm>

Message Catalogs

Locale::Maketext
http://search.cpan.org/dist/Locale-Maketext/ <http://search.cpan.org/dist/Locale-Maketext/>

http://search.cpan.org/dist/Locale-Maketext/lib/Locale/Maketext/TPJ13.pod <http://search.cpan.org/dist/Locale-Maketext/lib/Locale/Maketext/TPJ13.pod>

Locale::Maketext::Lexicon
http://search.cpan.org/dist/Locale-Maketext-Lexicon/ <http://search.cpan.org/dist/Locale-Maketext-Lexicon/>

http://search.cpan.org/dist/Locale-Maketext-Lexicon/docs/webl10n.html <http://search.cpan.org/dist/Locale-Maketext-Lexicon/docs/webl10n.html>

http://search.cpan.org/dist/Locale-Maketext-Lexicon/script/xgettext.pl <http://search.cpan.org/dist/Locale-Maketext-Lexicon/script/xgettext.pl>

Locale::Maketext::Simple
Provides a simple interface to Locale::Maketext::Lexicon.

http://search.cpan.org/dist/Locale-Maketext-Simple/ <http://search.cpan.org/dist/Locale-Maketext-Simple/>

libintl-perl
http://search.cpan.org/dist/libintl-perl/lib/Locale/Messages.pm <http://search.cpan.org/dist/libintl-perl/lib/Locale/Messages.pm>

http://search.cpan.org/dist/libintl-perl/lib/Locale/TextDomain.pm <http://search.cpan.org/dist/libintl-perl/lib/Locale/TextDomain.pm>

Numbers

Number::Format
http://search.cpan.org/dist/Number-Format/ <http://search.cpan.org/dist/Number-Format/>

Tools

GNU gettext utilities
<http://www.gnu.org/software/gettext/>

<http://www.gnu.org/software/gettext/manual/html_chapter/gettext.html>

<http://gnuwin32.sourceforge.net/packages/gettext.htm>

gtranslator
Translation tool for Gnome. Supports gettext catalogs.

<http://gtranslator.sourceforge.net/>

Ini Translator
Translation tool for Windows 98/Me/XP/2000. Supports several formats, including gettext catalogs.

<http://initranslator.sourceforge.net/>

KBabel
Translation tool for KDE. Supports gettext catalogs.

<http://i18n.kde.org/tools/kbabel/>

LocFactory Editor
Translation tool for Mac OS X. Supports sevral formats, including gettext catalogs.

<http://www.triplespin.com/en/products/locfactoryeditor.html>

poEdit
A cross-platform gettext catalogs editor.

<http://www.poedit.org/>

AUTHOR

Christian Hansen "ch@ngmedia.com" This program is free software, you can redistribute it and/or modify it under the same terms as Perl itself.