Rails 2.2の I18nによる日本語化を最も簡単に行う方法
November 22nd, 2008
さて、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』 というやつで、こいつについて何か話をすることになってるような気がします。



おお! i18n 素晴らしい!!
>config/environment.rbを編集してsqlite3を有効に(※ 2.2からデフォルトOFFに変わった?ハマる人続出だと思うんだけど・・・)
(-。-;)
>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) では、おそらくこの問題は修正されているようです。
使わせていただきました。
唖然とするほど便利でした!
ありがとうございます。
この記事通りやっているつもりなんですが、うまくいきません。
なにかアドバイスいただけないでしょうか?
$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」などを作ってほしいのですが、作ってくれません。どこかですごく大ぼけ、やってるんでしょうか?
モデルのクラス名がふたつの単語で構成されているとき(例:TestCase)、Test_caseにしないとダメだよ、というエラーが出ました。ソース追ってないのでパッチがなくて申し訳ない…
active_support_ja.ymlなんかはja.ymlに統合されたということなんですね。
上の記事が何事もなかったかのように修正されているので、前の質問の意味がわからなくなってますが、ま、そういうことということで納得しました。
> satake7さん
遅レスすみません。
ご指摘のとおり、仕様変更により、現在は「active_support_ja.yml」などは作られなくなりました
(ちなみに仕様変更といっても、こちらの都合というより、DHHの以下のコミットによるRailsの仕様変更に追随しただけですが)。
http://github.com/rails/rails/commit/d9b92ee11b33fed5c7a94a91415fa846705f7dd3
そんなわけで、本文の方は書き直しておきました。ご指摘ありがとうございました。
> makotoさん
ありがとうございます。確かに以前そういう不具合はあったのですが、けっこう前に このあたり で直っているはずなので(つまりgemのバージョンで言うと0.1.0以降なら)、今一度最新バージョンで試してみていただけませんでしょうか?
$ gem outdated
する前に、
$ sudo gem so -a http://gems.github.com
するのを忘れていたので、いつまでたってもupgradeできていませんでした…。
最新(0.3.1)で試したところ、ばっちりでした。ありがとうございます!
camelizeなんてメソッドがあるってはじめて知りました…。
コメント、ありがとうございました。作者さまから頂だいするなんて….恐縮です。
> 是非アップデートしてみてください
了解しました。
ただ、gem outdated に 0.3.3 が引っ掛ってきません。
更新情報が行き渡っていない、ということなんでしょうか?
ソースには http://gems.github.com を追加済みなのですが….
> この際1.8.7に乗り換えて
gentoo ではなかなか unstable が外れないのと、テスト用にレンタルしているサーバもいまだ 1.8.6 だったものですから、二の足を踏んでおりました。
良い機会でしたので移行させていただきました。ありがとうございました。
script/generate i18n ja
を実行したらerbの<%- -%>が引っかかってsyntax errorになってしまいました。
> AYUさん
ありがとうございます。
どうも先日のGitHubのメンテナンス後しばらくgemが作られてなかったような気がするんですが、昨日の12/17に0.4.0がビルドされたようです。
お手数ですが再度バージョンアップを試してみていただけますでしょうか?
> tneさん
ご報告ありがとうございます!
その現象も現在は修正されているので、すみませんが、同じく最新版(081218現在0.4.0)で試してみていただけますでしょうか?
/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: (最終行)
こんな感じでエラーが出ました。
> tneさん
大変遅くなってすみません。書き込み見落としておりました。
そちらの問題ですが、バージョン0.4.1にて修正されています(thanks to babieさん)。
ご確認いただければ幸いです。
あと、なんかあちこちのブログでja.ymlが壊れている的なご指摘をいただいていたようで、うまく動いていない場合があったようなので、以下にて修正しました。
http://github.com/svenfuchs/rails-i18n/commit/e1f45b5e05ab847f2328dfc4d6557a2aefc7588c
自分の手元では修正前のやつでもうまく読み込まれてたんですけどねぇ(謎
ver0.5使わせていただいております。
ところでi18n_scaffoldを実行したところ show.html.erb の先頭にタイトル行を表示するコードが抜けていました。 また、edit.html.erbの一行目のやはりタイトル行を表示するためのコードのtranslateのメソッドの直前で=が抜けていました。
書き込みしたはずなんですが、書き込まれていなかったようなのでもう一度投稿します。
scaffoldで生成したedit.html.erbの1行目のtranslateの前に=がありませんでした。 同じくshow.html.erbの一行目にtranslateの行自身がありませんでした。 これらが理由でeditとshowの画面でタイトルが表示されません。
How soon will you update your blog? I’m interested in reading some more information on this issue.
ありがたく利用させています。editとnewのラベルが日本語化できてなかったので、生成されたものに手を加えて使おうと思っています。
http://d.hatena.ne.jp/babydaemons/20090824/1251103946
Только недавно попал на Ваш сайт, теперь каждое утро захожу посмотреть, не написали ли чего новенького. :) К сожалению только Вы не каждый день свой сайт обновляете :(
私はあなたのブログが好きです。 あなたは良い仕事をしています。 そのまま続けてください。 ウォークマン s