OTP-R14Aとerlang_gettext

ここのところ #prfm やら #aira やらの記事ばかりだったので、ちょっとerlangの話題も。

erlang OTP-R14A

しばらく見ていない間にerlangでOTP-R14Aがリリースされていたのでアップグレードしてみた。なお、OTPでは末尾がAとなっているのはベータ扱いなので、普通の使い方をする人はBになるまで待った方がいいが、いまのところ、普通に使えてる。偏向箇所は大杉なのでREADMEを見るべし。なお、erlang-shellはついに5.8になった。

erlang_gettext

OTP-13Aでunicode対応したerlang OTPだが、i18nやl12nはしていなかった。あくまで、これまで文字がバイト扱い(8bitのリスト)が、文字のリストに変わっただけ。それでも十分嬉しいが、gettextしてくれると嬉しいなぁと思っていたら、そんなナイスなモジュールを、GitHub - noss/erlang-gettext: Deprecated mirror of erlang gettext lib, use http://github.com/etnt/gettextで発見。速攻でgit cloneしてインスコ
GNUのpoファイルをほぼそんな感じで使えるとってもナイスなモジュールなのだが、どうもおかしい。

japanese.poはこんな感じ。

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR , YEAR.
#
# NB: Consider using poEdit http://poedit.sourceforge.net
#
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2003-10-21 16:45+0200\n"
"PO-Revision-Date: 2010-06-23 22:07+0900\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: esmb_gettext.erl:13
msgid ""
"Hello World"
msgstr ""
"こにちわせかい"

で、サンプルのプログラムはこんな感じ。

-module(example2).
-export([run/0]).
-include("../include/gettext.hrl").
run() ->
    io:format("~ts~n", [?TXT("Hello World")]).

で、こんなセッション。

$ erl
Erlang R14A (erts-5.8) [source] [64-bit] [smp:4:4] [rq:4] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.8  (abort with ^G)
1> c(example2).
{ok,example2}
2> gettext_server:start().
{ok,<0.39.0>}
3> example2:run().
Hello World
ok
4> put(gettext_language, "ja").
undefined
5> example2:run().             
&#227;??&#227;?&#171;&#227;?&#161;&#227;?&#143;&#227;??&#227;??&#227;??
ok
6> 

gettext_serverがトランスレートしてくれるのだが、日本語文字列が化けるようにしか見えない。READMEのサンプルセッションではスウェーデン語でうまくいくでしょほらとかなっていて、スウェーデン語のアルファベットも知らんのにどうしろとww
うーむ。まだ調べないとよくわからにゃい。