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を生成するようにもできるね。
というわけで誰かまともな実装してくれる人いません?(ホント、最近、こればっかりだな、オレ(苦笑))

どもども。<br>> GetText.locale の値が HTTP_ACCEPT_LANGUAGE のが適用されなくなる?<br>の件なのですが、ブラウザを二つ立ち上げて、片方のブラウザの言語を ja で、片方を en で、というので交互に何度かアクセスすると、en なのに ja が表示されたり反対もしかり、みたいな状況になってしまいます。バージョンはリリース版です。<br>rails + mongrel/fastcgi 両方の環境で再現しました。なにかしらの定数が保持されたままになってしまってるのかもしれませんです。
なるほど。<br>ブラウザを2つというのは違うインスタンス(2種類のWWWブラウザ)を起動して、ということですよね?<br>#例えば、IEとFirefox等。<br><br>時間を見つけて調べてみます。
> ブラウザを2つというのは違うインスタンス(2種類のWWWブラウザ)を起動して、ということですよね? <br>> #例えば、IEとFirefox等。 <br>はい、その通りです。<br>お時間があるときにでも調べていただければ幸いです。
りょうかいです。