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

February 28, 2006 [おもひで]

[Misc] リファラスパム

久しぶりにやられた。うきーっ!

[Rails] Ruby-GetText-Packageでエラー画面のメッセージを変更する

昨日の件で、Special Generator、jascaffoldをもうちょっと勉強しようと思っていたら、ちょうど、樂水開発日記さん経由で「jascaffold 勝手にまとめページ」を知りました。おっ、これは・・・って、またgettextが話題になってますね(苦笑)。

ちょっと回答部分で誤解もあるようなのでここでフォローをしたいと思います。

#守護霊の忠告に従って(笑)私自身は人様のWikiに何かを書くということはしません。どなたか気になった方がいましたらリンクでも張って頂ければ幸いです。

で、誤解かと思われる部分は「modelのクラスに直接かかれたvalidateなどの文字列は簡単には変更できません。」のところです。私自身が誤解してるとアレですが、ここでは「validateのメッセージを簡単に変更できない」ことを指していると受け取りました。が、そうだとするとそれは誤解です。そうでなければ私の誤解なのでこの後の文章は無駄に・・・(汗)。

Ruby-GetText-Packageでは、validation系メッセージがデフォルトでローカライズ(日本の場合は日本語化)されるだけでなく、オリジナルのRails同様、ユーザがvalidationメッセージを指定できますし、しかも、メッセージのタイトルも変更できます。

#この点では実はオリジナルのRailsより柔軟です。

そこで、Ruby-GetText-Packageに添付されるblogアプリケーションのapp/models/article.rbを例にしてその使用方法をご紹介します。

class Article < ActiveRecord::Base
  # With validation messages.
  validates_presence_of :title, :message => "%{fn}は空じゃダメだよ!"
  validates_length_of :description, :minimum => 10, :message => "が短すぎッス。%d文字以上でお願い。"
  # Title
  set_error_message_title("%{record}にエラーみっけ。", "%{record}に%{num}個エラーあるよ")
  set_error_message_explanation("次のフィールドにエラーあるよ:", "次のフィールドたちがエラーだよ:")
end

こんだけです。%{fn}がフィールド名、%{record}にはテーブル名、%dは数が入ります。%{fn}を省略するとローカライズされた文字の先頭にフィールド名が挿入されます(Rails本体との互換性を保つためにこういう仕様になっています)

結果は以下のようになります。まず、エラーが2つあるとき。

Railsのエラーメッセージを変更する(1)

次に、エラーが1つの時。

Railsのエラーメッセージを変更する(2)

日本語だとわざわざ単数形と複数形にわけるのが面倒くさいかもしれないけど、海外だとこういうときの複数形は大切なので複数形と単数形で異なる出力になってます。

ちなみに上記の例では必ず日本語が表示されますが(当然と言えば当然ですが)、_()で囲って英語を使うようにすればそのまま多言語化できます(これも当然と言えば当然?)。


編集