むとうです。

In message "[ruby-ext:02025] Re: gettext modules"
        on Sat, 1 Dec 2001 12:30:04 +0900, MUTOH Masao <mutoh / highway.ne.jp> wrote:

> > 現実逃避のネタにもう一つ作ってみました。
> > http://www.ruby-lang.org/en/raa-list.rhtml?name=Yet+Another+GetText
> > 
> > -- さかい
> 
> 4つめッスね、うーん悩ましい(^^;)。
> 
> gettextが使われるような場面って速度的にはそれほど追求しなくても
> よさそうですので、pure ruby版って良いですよね。コンパイルもしないで良いし。

その後、さかいさんのをベースにいろいろと考えてみたのですが、
pure rubyでやるなら、gettextそのものでなくても良いような気がしてきました。

まず、gettextを使う状況をあげると以下のようになると思います。
-----
1. 前提
 ・lib1.rb, lib2.rb,  main.rb というgettextを扱う3つのファイルがあり、
  main.rbからlib1.rb, lib2.rbを呼び出す。
 ・全て作者(管理主体)が別

2. 期待される機能
 ・_(msgid)というメソッドでローカライズされたメッセージを取得できる
 ・lib1.rb, lib2.rb, main.rbそれぞれのmoファイルからメッセージを取得できる
 ・GNU gettextに含まれるツールを使うことができる(xgettext, msgfmt, msgmerge等)

3. 上記以外でGNU gettext(のライブラリ)が提供する機能
 ・categoryが動的に変更可能
 ・言語が動的に変更可能
 ・textdomainでドメインを変更可能
-----
ま、他にもあるかもしれませんがとりあえずこの辺まで。

で、よくよく考えると3. の機能って全部いらないんじゃないかと思うんです。
#ちょっと乱暴かな...。

理由は以下です。

 A. categoryは、現在、LC_MESSAGESしか使われていないのでそれ固定で問題ない
 B. 言語はアプリケーション内では一意に決まるはず
   たとえば、ドイツ語と日本語が同居するアプリケーションがあるとしても、
   gettextで扱う部分(たとえばGUIのメニューや各種メッセージなど)は
   どちらかの言語になるはず
   #ただし、呼び出し時にメソッドから言語を指定できるというのは意味があるかも。
   #たとえばMozillaはGUIから言語を指定して再起動するとその言語のメニューとか
   #になりますし(ってMozilla以外は無い気がしますが....)。
 C. RubyのModule自体がスコープを持つ元で実装すれば、スコープ内でtextdomainの
     ようなメソッドでドメインを変更する必要がない

----
結構、乱暴な案だとは思いますが、実際のところ、落としどころはどの辺でしょうか。
ご意見いただければと思います。

あ、ちなみに、gettextと同じ実装にすると何が問題なの?と言われると、
たぶん、特に問題ないと思います(^^;)。ちょっとオーバースペックかなという程度です。
#だったら議論せずにgettextと同じ実装にするさかいさん案のままで良いのかな...(^^;)

---
一応、今までの話は以下のような構成を想定しています。
少なくともlibrary側でグローバル(?)にinclude GetTextしないという前提です。
#実装したわけではないので、実装できない部分があるかも。

main.rb(main.mo)
---
include GetText
....
---

lib1.rb(lib1.mo)
---
module Lib1
  include GetText
  ....
end
---

lib2.rb(lib2.mo)
---
module Lib2
  class Test
    include GetText
    ....
  end
  ....
end
---


-- 
.:% MUTOH Masao <mutoh / highway.ne.jp>