よたらぼ
自分の興味の赴くままにIT技術系のネタを取りとめもなくメモっています。
Ruby言語やLinuxのネタが多いです。

April 26, 2008 [おもひで]

[Ruby] Ruby-GetText-Package:TextDomainのスコープ

バグレポートでbindtextdomainがうまく働かない場合があるというレポートをもらった。

TextDomainのスコープは実は曖昧な部分があったので、本来の仕様としてRuby-GetText-Packageでbindtextdomainを宣言したときにそれがどの範囲で適用されるべきかを図に整理してみた。

TextDomainのスコープ

基本的には、クラス・モジュールの中から外に向かってテキストドメインを探していき、その中で最初にヒットした翻訳文字列が使われる。

Rubyのメソッド呼び出しとクラス・スーパークラスの関係にちょっと似てるけど、もうちょっと緩い感じ。たとえば、クラスであればスーパークラスを探す他にクラスの所属しているモジュールも検索対象となる。

あと、GetText.bindtextdomainと記述すると、実はグローバルな宣言になり、どこからも参照されることになる。今のところAnonymousなクラス・モジュールもその性質上グローバルなTextDomainを使うという実装になっている(Anonymousなクラスはたくさん生成される場合があり、それぞれクラス名が異なるとその分bindされるターゲットが異なってしまう。実際Railsがそのような実装をしていてメモリリークをおこしてしまっていた、って、メモリリークには他にも原因があるんだけど(苦笑))。

あとちょっと本題からはずれるけど、1つのクラス・モジュール内で複数のTextDomainにbindすることもできる。これは同じクラス名で別の開発者が別のTextDomainを使って機能を追加する場合に使用されることを想定している。

とまぁ、こんな感じで複数のモジュールを検索していくと時間がかかってしょうがないので、一度検索した翻訳文字列はキャッシュするようになっている。

で、バグレポートの内容なんだけど、トップレベルのbindtextdomain(3行目)が有効にならない、というもの。上記のスコープにしたがって直すこととしよう。


編集