さて、Rails 2.2も 無事にリリース されたわけだが、今回の目玉はなんといっても “I18n” 対応だろう。

つまり、今回の大規模なI18n対応で、やっとこれが

# Rails 2.1.2 より抜粋
          options[:object_name] ||= params.first
          options[:header_message] = "#{pluralize(count, 'error')} prohibited this #{options[:object_name].to_s.gsub('_', ' ')} from being saved" unless options.include?(:header_message)
          options[:message] ||= 'There were problems with the following fields:' unless options.include?(:message)      
          error_messages = objects.sum {|object| object.errors.full_messages.map {|msg| content_tag(:li, msg) } }.join

こうなった、と。

# Rails 2.2.2 より抜粋
          I18n.with_options :locale => options[:locale], :scope => [:activerecord, :errors, :template] do |locale|
    (中略)
              locale.t :header, :count => count, :model => object_name
            end
    (後略)

参考 : 優しいRailsの育て方

そんなわけで、Rails 2.2からは従来のようにRailsのソースをごっそり置き換えたりするモンキーパッチのようなプラグインに頼らなくても、Rails自体の仕組みだけで日本語化(多言語化)が行えるようになった。

◆i18n_generators を使ってみる

さて、それではさっそく日本語化されたアプリを作ってみよう。
このあたり、まだ日本語の情報が全然少ないからよっぽど難しいのかと思われるかもしれないが、実はめちゃめちゃ簡単で、いくつかのコマンドを叩くだけであっさり実現できる。

まずは、何も考えずに、 Rails I18n公式Wikiに載っているi18n_generators という名前の魔法のgemをインストールしておく(名前の最後に “s” がつくのでご注意)。

# http://gems.github.comがgemのSOURCESに入ってない場合は以下を実行してから
% sudo gem so -a http://gems.github.com
# インストール
% sudo gem i amatsuda-i18n_generators
Successfully installed amatsuda-i18n_generators-0.2.0
1 gem installed

それから、Rails 2.2がインストールされている環境で、

% rails -v
Rails 2.2.2

アプリケーションを作成してcd。

% rails i18n_test
      create  
      create  app/controllers
      create  app/helpers
      create  app/models
(略)
% cd i18n_test/

config/environment.rbを編集してsqlite3を有効に(※ 2.2からデフォルトOFFに変わった?ハマる人続出だと思うんだけど・・・)

じゃあまずはなんかscaffoldでもしてみよう。
以下のようにi18n_scaffoldジェネレーターを使うと、scaffoldがいい感じに他言語化されていたりする。 (081129 updated)

% ./script/generate i18n_scaffold user name:string

% rake db:migrate

日本語のリソースファイルを生成してくれる魔法のコマンドを叩いて(ロケール指定は “ja” で)、

% ./script/generate i18n ja
      exists  config/locales
      create  config/locales/ja.yml
      create  config/locales/models_ja.yml

あ、なんかUserモデルにバリデーションでも仕掛けとくか。
app/models/user.rb

class User < ActiveRecord::Base
  validates_presence_of :name
end

以上!!

サーバーを起動して確認してみると、

% ./script/server

おおおー、ばっちり日本語化されてるー!!!

ということで、詳しくはあとで書く。

とりあえず、このgem/pluginに関する質問、感想、フィードバックその他は大歓迎です。
あと、 『楽天テクノロジーカンファレンス2008』 というやつで、こいつについて何か話をすることになってるような気がします。

21 Responses to “Rails 2.2の I18nによる日本語化を最も簡単に行う方法”

  1. Yuumi3 - November 22nd, 2008 at 11:00 AM

    おお! i18n 素晴らしい!!

    >config/environment.rbを編集してsqlite3を有効に(※ 2.2からデフォルトOFFに変わった?ハマる人続出だと思うんだけど・・・)

    (-。-;)

  2. a_matsuda - November 27th, 2008 at 09:00 AM

    >config/environment.rbを編集してsqlite3を有効に(※ 2.2からデフォルトOFFに変わった?ハマる人続出だと思うんだけど・・・)

    すみませんすみません、ここの箇所は誤報でした。

    えーと、どうやら当時のMerbにバンドルされてインストールされてきたdo_sqlite3 0.9.7 というやつが悪さをしていたようで、こいつを消したら無事に動くようになりました。 http://twitter.com/a_matsuda/status/1022160443

    現行の最新版の do_sqlite3 (0.9.8) では、おそらくこの問題は修正されているようです。

  3. komagata - November 29th, 2008 at 05:11 PM

    使わせていただきました。
    唖然とするほど便利でした!
    ありがとうございます。

  4. satake7 - November 29th, 2008 at 07:14 PM

    この記事通りやっているつもりなんですが、うまくいきません。
    なにかアドバイスいただけないでしょうか?

    $script/generate i18n ja
    exists config/locales
    update config/environment.rb
    create config/locales/ja.yml
    create config/locales/models_ja.yml
    $
    「active_support_ja.yml」などを作ってほしいのですが、作ってくれません。どこかですごく大ぼけ、やってるんでしょうか?

  5. makoto - November 30th, 2008 at 04:06 AM

    モデルのクラス名がふたつの単語で構成されているとき(例:TestCase)、Test_caseにしないとダメだよ、というエラーが出ました。ソース追ってないのでパッチがなくて申し訳ない…

  6. satake7 - December 3rd, 2008 at 04:01 AM

    active_support_ja.ymlなんかはja.ymlに統合されたということなんですね。
    上の記事が何事もなかったかのように修正されているので、前の質問の意味がわからなくなってますが、ま、そういうことということで納得しました。

  7. a_matsuda - December 8th, 2008 at 07:51 AM

    > satake7さん
    遅レスすみません。
    ご指摘のとおり、仕様変更により、現在は「active_support_ja.yml」などは作られなくなりました
    (ちなみに仕様変更といっても、こちらの都合というより、DHHの以下のコミットによるRailsの仕様変更に追随しただけですが)。
    http://github.com/rails/rails/commit/d9b92ee11b33fed5c7a94a91415fa846705f7dd3

    そんなわけで、本文の方は書き直しておきました。ご指摘ありがとうございました。

  8. a_matsuda - December 8th, 2008 at 07:57 AM

    > makotoさん
    ありがとうございます。確かに以前そういう不具合はあったのですが、けっこう前に このあたり で直っているはずなので(つまりgemのバージョンで言うと0.1.0以降なら)、今一度最新バージョンで試してみていただけませんでしょうか?

  9. makoto - December 8th, 2008 at 04:48 PM

    $ gem outdated
    する前に、
    $ sudo gem so -a http://gems.github.com
    するのを忘れていたので、いつまでたってもupgradeできていませんでした…。

    最新(0.3.1)で試したところ、ばっちりでした。ありがとうございます!
    camelizeなんてメソッドがあるってはじめて知りました…。

  10. AYU - December 16th, 2008 at 11:34 AM

    コメント、ありがとうございました。作者さまから頂だいするなんて….恐縮です。

    > 是非アップデートしてみてください

    了解しました。
    ただ、gem outdated に 0.3.3 が引っ掛ってきません。
    更新情報が行き渡っていない、ということなんでしょうか?
    ソースには http://gems.github.com を追加済みなのですが….

    > この際1.8.7に乗り換えて

    gentoo ではなかなか unstable が外れないのと、テスト用にレンタルしているサーバもいまだ 1.8.6 だったものですから、二の足を踏んでおりました。
    良い機会でしたので移行させていただきました。ありがとうございました。

  11. tne - December 16th, 2008 at 11:46 PM

    script/generate i18n ja
    を実行したらerbの<%- -%>が引っかかってsyntax errorになってしまいました。

  12. a_matsuda - December 18th, 2008 at 03:23 PM

    > AYUさん

    ありがとうございます。
    どうも先日のGitHubのメンテナンス後しばらくgemが作られてなかったような気がするんですが、昨日の12/17に0.4.0がビルドされたようです。
    お手数ですが再度バージョンアップを試してみていただけますでしょうか?

    > tneさん
    ご報告ありがとうございます!
    その現象も現在は修正されているので、すみませんが、同じく最新版(081218現在0.4.0)で試してみていただけますでしょうか?

  13. tne - December 20th, 2008 at 02:32 AM

    /Library/Ruby/Gems/1.8/gems/amatsuda-i18n_generators-0.4.0/generators/i18n/../i18n_translation/lib/erb_executer.rb:8:in `exec_erb’: ****.html.erb:22:in `def_method’: compile error (SyntaxError)
    ****.html.erb:1: syntax error, unexpected ‘;’
    _erbout = ’’; – ****** -; _erbout.concat “\n”


    .html.erb
    1: <%- * -%>
    2:
    ・・・
    21: (最終行)

    こんな感じでエラーが出ました。

  14. a_matsuda - January 22nd, 2009 at 04:56 AM

    > tneさん
    大変遅くなってすみません。書き込み見落としておりました。
    そちらの問題ですが、バージョン0.4.1にて修正されています(thanks to babieさん)。
    ご確認いただければ幸いです。

  15. a_matsuda - January 22nd, 2009 at 05:27 AM

    あと、なんかあちこちのブログでja.ymlが壊れている的なご指摘をいただいていたようで、うまく動いていない場合があったようなので、以下にて修正しました。
    http://github.com/svenfuchs/rails-i18n/commit/e1f45b5e05ab847f2328dfc4d6557a2aefc7588c
    自分の手元では修正前のやつでもうまく読み込まれてたんですけどねぇ(謎

  16. kamei - February 20th, 2009 at 11:56 AM

    ver0.5使わせていただいております。

    ところでi18n_scaffoldを実行したところ show.html.erb の先頭にタイトル行を表示するコードが抜けていました。 また、edit.html.erbの一行目のやはりタイトル行を表示するためのコードのtranslateのメソッドの直前で=が抜けていました。

  17. kamei - February 22nd, 2009 at 02:52 PM

    書き込みしたはずなんですが、書き込まれていなかったようなのでもう一度投稿します。

    scaffoldで生成したedit.html.erbの1行目のtranslateの前に=がありませんでした。 同じくshow.html.erbの一行目にtranslateの行自身がありませんでした。 これらが理由でeditとshowの画面でタイトルが表示されません。

  18. GarykPatton - June 16th, 2009 at 07:33 PM

    How soon will you update your blog? I’m interested in reading some more information on this issue.

  19. babydaemons - August 25th, 2009 at 10:58 AM

    ありがたく利用させています。editとnewのラベルが日本語化できてなかったので、生成されたものに手を加えて使おうと思っています。

    http://d.hatena.ne.jp/babydaemons/20090824/1251103946

  20. Xpaнитeль - December 26th, 2009 at 07:28 AM

    Только недавно попал на Ваш сайт, теперь каждое утро захожу посмотреть, не написали ли чего новенького. :) К сожалению только Вы не каждый день свой сайт обновляете :(

  21. Acastarma - February 17th, 2010 at 04:21 AM

    私はあなたのブログが好きです。 あなたは良い仕事をしています。 そのまま続けてください。 ウォークマン s