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

February 08, 2007 [おもひで]

[Rails] Rails のためのものぐさな Web アプリケーションの国際化手法 by Secondlifeさん

ローカライズの主言語に日本語を使うことで英語が苦手な人でも無理無くアプリを国際化(を前提とした開発が)できるよという話。「最初は日本語で開発、とりあえず、メッセージは_("")で囲い後で英語リソースを用意する」という開発スタイルは、思考が(英語に翻訳するという)余計なことで妨げられない分、ストレスが少なくて良いよね。個人(や企業)でサポートする全ての言語を自前で用意する場合、主言語が英語以外でも問題ないしこの方法はアリだと思う。

注意点としては、アプリケーション本体とmsgidの文字コードをあわせる必要がある、ということかな。msgidは文字コード変換を適用していないからね。

それから、はてなユーザ以外はコメントを残せないそうなのでここに書いちゃうけど、GetText.locale の値が HTTP_ACCEPT_LANGUAGE のが適用されなくなる?という件については、手元の環境では再現しなかった(after_init_gettextを使わなくてもブラウザの言語設定をenにしたらfoo_en.rhtmlが読み込まれた)。なぜだろう。あ、でも試したのはCVS版だからリリースバージョンでは再現するのかな。

[Rails] Rails のためのものぐさな Web アプリケーションの国際化手法 (2)

上でちょっと触れたけど、全ての言語を自前で用意する、というのが難しい場合(多くのOSSな開発はこっちなのではないかな)、msgidは英語で書いた方が良い。いや、書くべきだ。インターネットの世界では日本語を読み書きできる人に比べて英語を読み書きできる人の方が多く、その方がより協力者を得やすいからね。

しかし、Secondlifeさんの方法も捨てがたい。

そこで、ひとまずはSecondlifeさんの手順通り進め、日本語が主言語、英語のリソースを用意するというところまで作ってしまい、ある程度安定してきたら、一括して日本語部分を英語に変換してしまうというのはどうだろう?・・・と思ってそんなスクリプトを書いてみた。眠いので書きなぐり。うぅ、汚い。けど眠気には勝てないや(苦笑)。

$KCODE = "U"
require 'gettext/mo'
 
@mo = MOFile.open("locale/en/LC_MESSAGES/example.mo") #アプリ毎に変更する
def convert(path)
  return unless File.file? path
  puts "target = #{path}"
  data = IO.read(path)
  bak = data.dup
  @mo.each do |key, value|
    data.gsub!(Regexp.new(Regexp.quote(key)), value) if key.size > 0
  end
  unless bak == data
    open(path + ".bak", "w"){|f| f.write bak}
    open(path, "w"){|f| f.write data}
  end
end
 
Dir.glob("app/**/*") do |path|
  convert(path)
end
 
File.open("ja.po", "w") do |out|
  @mo.each do |key, value|
    if key.size > 0
      out.puts %Q[msgid "#{value}"]
      out.puts %Q[msgstr "#{key}"]
      out.puts
    end
  end
end

実行するとapp配下で該当する日本語文字列を英語に置換していく。んでもって最後にカレントディレクトリにja.poという名前の日本語poファイルの雛型を抽出してくれる、という感じ。
ちょっと特殊な文字とか改行とか含んでいるだけでダメだなこりゃ。コメント部分に該当する文字列があるだけでそちらも変換してしまう。まぁ、Proof of conceptということで。もうちょっとがんばれば、ja.poもただ雛型を生成するだけではなく、きちんとpo/ja/example.poを生成するようにもできるね。
というわけで誰かまともな実装してくれる人いません?(ホント、最近、こればっかりだな、オレ(苦笑))

本日のツッコミ(全4件) [ツッコミを入れる]
secondlife (February 09, 2007 11:33)

どもども。
> GetText.locale の値が HTTP_ACCEPT_LANGUAGE のが適用されなくなる?
の件なのですが、ブラウザを二つ立ち上げて、片方のブラウザの言語を ja で、片方を en で、というので交互に何度かアクセスすると、en なのに ja が表示されたり反対もしかり、みたいな状況になってしまいます。バージョンはリリース版です。
rails + mongrel/fastcgi 両方の環境で再現しました。なにかしらの定数が保持されたままになってしまってるのかもしれませんです。

むとう (February 09, 2007 22:27)

なるほど。
ブラウザを2つというのは違うインスタンス(2種類のWWWブラウザ)を起動して、ということですよね?
#例えば、IEとFirefox等。

時間を見つけて調べてみます。

secondlife (February 10, 2007 02:00)

> ブラウザを2つというのは違うインスタンス(2種類のWWWブラウザ)を起動して、ということですよね?
> #例えば、IEとFirefox等。
はい、その通りです。
お時間があるときにでも調べていただければ幸いです。

むとう (February 11, 2007 01:30)

りょうかいです。


編集