Data::Localize

 →http://mt.endeworks.jp/d-6/2009/02/culmination-of-i18n.html
 ちょうど今作成中のアプリケーションでC::P::I18Nを使ってたので、試してみました。嘘つきました。テストしかしてないです><
 (id:lestrratさん、ありがとうございます!)

[taiyoh@taiyoh-laptop] $ make test
PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'inc', 'blib/lib', 'blib/arch')" t/*.t
t/01_basic...........1/2 
#   Failed test at t/01_basic.t line 18.
Wide character in print at /media/data/perl/lib/Test/Builder.pm line 1351.
#          got: 'John Doeさん、こんにちは!'
#     expected: 'Hello, John Doe!'
# Looks like you failed 1 test of 2.
t/01_basic........... Dubious, test returned 1 (wstat 256, 0x100)
 Failed 1/2 subtests 
t/02_namespace.......ok   
t/03_gettext.........1/5 Wide character in print at t/03_gettext.t line 37.
t/03_gettext.........ok   
t/04_auto............ok   
t/99_pod-coverage....skipped: Enable TEST_POD environment variable to test POD
t/99_pod.............skipped: Enable TEST_POD environment variable to test POD

Test Summary Report
-------------------
t/01_basic       (Wstat: 256 Tests: 2 Failed: 1)
  Failed test:  2
  Non-zero exit status: 1
Files=6, Tests=17,  2 wallclock secs ( 0.02 usr  0.03 sys +  1.46 cusr  0.12 csys =  1.63 CPU)
Result: FAIL
Failed 1/6 test programs. 1/17 subtests failed.
make: *** [test_dynamic] エラー 255

 デバッグオプションをつけて、t/01_basic.tだけ走らせてみると…

[taiyoh@taiyoh-laptop] $ DATA_LOCALIZE_DEBUG=1 perl -Ilib t/01_basic.t
1..2
ok 1 - use Data::Localize;
[Data::Localize]: add_localizer_map ja -> Data::Localize::Namespace=HASH(0x2338148)
[Data::Localize]: add_localizer_map en -> Data::Localize::Namespace=HASH(0x2338148)
[Data::Localize]: add_localizer_map * -> Data::Localize::Namespace=HASH(0x2338148)
[Data::Localize]: detect_languages auto-detected 'ja'
[Data::Localize]: localize - looking up ja
[Data::Localize::Namespace]: lexicon_get - Trying Test::Data::Localize::Namespace::ja
[Data::Localize::Namespace]: lexicon_get - class already loaded
[Data::Localize::Namespace]: lexicon_get - setting Test::Data::Localize::Namespace::ja to already loaded
[Data::Localize::Namespace]: returning lexicon from Test::Data::Localize::Namespace::ja
$VAR1 = {
          'Hello, stranger!' => "[_1]\x{3055}\x{3093}\x{3001}\x{3053}\x{3093}\x{306b}\x{3061}\x{306f}!"
        };
[Data::Localize::Localizer]: localize_for - Hello, stranger! -> Wide character in print at lib/Data/Localize/Localizer.pm line 26.
[_1]さん、こんにちは!
Wide character in print at lib/Data/Localize/Localizer.pm line 37.
Data::Localize::Namespace=HASH(0x2338148) -> localizing '[_1]さん、こんにちは!' with (John Doe), style is maketext
not ok 2
#   Failed test at t/01_basic.t line 16.
Wide character in print at /media/data/perl/lib/Test/Builder.pm line 1351.
#          got: 'John Doeさん、こんにちは!'
#     expected: 'Hello, John Doe!'
# Looks like you failed 1 test of 2.

 ああ…、

[taiyoh@taiyoh-laptop] $ echo $LANG
ja_JP.UTF-8

 これのことか…orz
 なので、I18N::LangTags::Detectのambient_langprefs関数内のLANG関連で一番最初にみる変数を変えてみると…

[taiyoh@taiyoh-laptop] $ LANGUAGE=en make test
PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'inc', 'blib/lib', 'blib/arch')" t/*.t
t/01_basic...........ok   
t/02_namespace.......ok   
t/03_gettext.........1/5 Wide character in print at t/03_gettext.t line 37.
t/03_gettext.........ok   
t/04_auto............ok   
t/99_pod-coverage....skipped: Enable TEST_POD environment variable to test POD
t/99_pod.............skipped: Enable TEST_POD environment variable to test POD
All tests successful.
Files=6, Tests=17,  2 wallclock secs ( 0.04 usr  0.00 sys +  1.52 cusr  0.08 csys =  1.64 CPU)
Result: PASS

 この辺は、どうするのが正しいのかは分かりません。ぱっと見でパッチなんか書けない><
 まあ、僕が日本語locale使ってる軟弱者だからかもしれませんが…。一番手っ取り早いのは、テストスクリプトの冒頭に

$ENV{LANGUAGE} = 'en';

 を入れてしまえば解決なのか。

(追記)
もちろん

モダンPerl入門 (CodeZine BOOKS)
モダンPerl入門 (CodeZine BOOKS)牧 大輔


Amazonで詳しく見る
by G-Tools
 買いました!

(追記:2009-02-27)
 →http://mt.endeworks.jp/d-6/2009/02/data-localize-fixes.html
 ありがとうございます><ばっちりでした!