自分の興味の赴くままに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件) [ツッコミを入れる]

Before...

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

secondlife [> ブラウザを2つというのは違うインスタンス(2種類のWWWブラウザ)を起動して、ということですよね? > #例え..]

むとう [りょうかいです。]


February 10, 2007 [長年日記]

[Rails] Ruby-GetText-Package-1.9.0がRails-1.1.6で動かない

というレポートをもらった。Ruby-GetText-1.9.0はalias_method_chainを使っているんだけど、これ、Rails-1.1.6に無いのね・・・。

一応、CVSバージョンでは1.1.6でも動作するように修正かけましたので、Rails-1.1.6を使っている人はそちらを使ってください。

あるいは、environment.rbを以下のように書けばRails-1.1.6+Ruby-GetText-1.9.0の組み合わせでも動作すると思います。

class Module
  unless defined? alias_method_chain
    def alias_method_chain(target, feature)
      # Strip out punctuation on predicates or bang methods since
      # e.g. target?_without_feature is not a valid method name.
      aliased_target, punctuation = target.to_s.sub(/([?!=])$/, ''), $1
      yield(aliased_target, punctuation) if block_given?
      alias_method "#{aliased_target}_without_#{feature}#{punctuation}", target
      alias_method target, "#{aliased_target}_with_#{feature}#{punctuation}"
    end
  end
end


February 12, 2007 [長年日記]

[Ruby-GNOME2] Ruby-GNOME2 Win32 GUI Installerリリース!

Ruby-GNOME2がWindows環境でもホントに簡単に使うことができるようになりました。RailsやJavascriptに疲れた貴方、気分転換にGUIアプリケーションにチャレンジしてみませんか。おもしろいですよー。

ちなみに、今回のインストーラに含まれるライブラリは、Ruby/GLib2, Ruby/ATK, Ruby/Pango, Ruby/GdkPixbuf2, Ruby/GTK2, Ruby/Libglade2, Ruby/GtkGLExt, Ruby/Libart2, Ruby/GnomeCanvas2, Ruby/GnomePrint2, Ruby/GnomePrintUI2, Ruby/GtkSourceView, Ruby/RSVG2です。

他に、rcairo, glade-2等も入っています。あ、msgmerge/msginit等のRuby-GetText向け開発ツール群も入っていますよん。

GUIアプリケーションに興味がなくても、画像処理、PDF/SVGの処理などでrcairo, RSVG2, GdkPixbuf2等を使ってみるのも楽しいかもしれません。

[Ruby-GNOME2] Ruby-GNOME2 Win32 GUI Installer開発ノート

今までもRuby-GNOME2 ProjectではWin32向けのバイナリを提供してきたのですが、GTK2本体を他から提供されるインストーラ(gladewin32.sf.netを推奨)を利用して別途インストールしなければいけなかったため以下のような問題がありました。

  1. 2回インストール作業しなければいけないのが面倒くさかった。チュートリアルに書いてある手順を読まないと何をどうインストールすれば良いのかわかりづらい、というのは今思えば大きなマイナスポイントだった
  2. Ruby-GNOME2が期待するGTK2バイナリとgladewin32のGTK2バイナリのバージョン違いが原因でRuby-GNOME2が動作しないことがあった
  3. 実はWin32版が提供されているライブラリであっても、gladewin32.sf.netがサポートしていないがためにRuby-GNOME2としても提供できないライブラリがあった
  4. 複数のWin32版GTK2がインストールされている環境では、PATH指定の影響で意図していないバージョンのバイナリを参照してしまい、Ruby-GNOME2が動作しない場合があった(2番目との合わせ技ですね)

そこで、年末から、上記問題を解決すべく作業を始めました。

まず、大前提としてGTK2本体を配布パッケージに含めることにしました。これで1, 2番目の問題を解決できます。

次にgladewin32.sf.netが提供するバイナリをベースにftp.gnome.orgで配布されているgtksourceview, libgnomeprint, libgnomeprintui, libgnomecanvasを追加しコンパイルできるところまで持っていきました。これを合わせて配布することで3番目を解決できます。私としてはgtksourceviewがサポートできたというのがポイント高いです。

次にGTK2本体を置く場所ですが、これはruby-install-dir\lib\GTKにしました。c:\GTK等に自由にインストールできるスタイルも考えたのですが、あえて固定し、Ruby-GNOME2ライブラリ側がPATH指定より優先してそのライブラリを読み込むようにしました。これで、4番目の問題を解決できます(ちなみにGTK2はインストールしないこともでき、その場合はPATHに指定されているGTK2を読み込むことになる)。実は、これを見越して、Ruby-GNOME2-0.16.0では上記修正がすでに入っていたりします。

それから、インストーラですが、今まではzip形式を展開し、install.rbを実行するとインストールがCUIベースで始まる、という形態だったのですが、WindowsではGUIインストーラの方が受けが良いと思ったのでNSISを使ってインストーラを作ることにしました。実はこれに時間がかかったのでした。でも、慣れると非常に便利なインストーラですね。オススメです。なお、インストール方法としてgem化も考えたのですがダウンロードしている時間が長くなりそう(配布ファイルが12MB弱ある)だったのでリモートからの直接インストールでgemは向いていないと判断しました。ローカルにダウンロードしてからインストールするのであれば、gemはインストール手順としてはinstall.rbと同じレベルですし(もちろんアンインストールできるところや複数のバージョン云々は違いますが)。また、GTK2が必要とするiconvとOne Click Ruby Installerが提供するiconv.dllの相性が悪いため、Ruby-GNOME2のインストーラではiconv.dllを上書きしているということもあり、gemにしづらいなと思ったのもひとつです。ただ、こちらはPATHの指定をうまくすることで回避できるかもしれません。

あ、そうそう。リリースするファイルを集めたりするための作業をRakefile化したのもポイントです。今までは繰り返し作業でやっていた部分も極力自動にすることで作業を楽にすることに注力しました。これは当たり前のことで頭の中では良く分かっていたことなんですが、今までは手作業でやってしまっていたんですよねぇ。

そんなこんなで今回のリリースにこぎつけたわけです。ぜひとも使ってみてくださいね。

[GTK+] Windowsで文字化け

上記の作業をしていて初めて知ったのですが(苦笑)WindowsでGTK+を使うと文字化け(主にトーフになる)する、画像が読み込めない、IM(日本語入力)がうまく動作しないとかいう場合、以下の3つを実行すると解決するかもしれません。

GTK\bin\pango-querymodules.exe > ..\etc\pango\pango.modules
GTK\bin\gdk-pixbuf-query-loaders.exe > ..\etc\gtk-2.0\gdk-pixbuf.loaders
GTK\bin\gtk-query-immodules-2.0.exe > ..\etc\gtk-2.0\gtk.immodules

実はgladewin32では上記をまとめてreconfig.batというバッチファイルが用意されていますのでそれを実行するだけでOKです。


February 25, 2007 [長年日記]

[Misc] マックのCM

他のパソコン(?)と比較してるやつ。なんだか鼻についてしょうがない。