エラーメッセージの国際化(4)
2009/01/24
前回に引き続きエラーメッセージの国際化がテーマです。
今回は「1個の入力エラーがあります」のような、数字を埋め込むタイプのエラーメッセージを英語と日本語で表示する方法について説明します。
asagao アプリケーションの app/views/accounts/_errors.rhtml
に次のような記述があります(5行目)。
<div id="errorExplanationHeader"><%= member.errors.length %>個の入力エラーがあります。</div>
これを次のように修正します。
<div id="errorExplanationHeader"><%= t('activerecord.errors.template.header', :count => member.errors.length) %></div>
続いて、config/locale/activerecord_ja.yml
を次のように修正します。
ja: activerecord: (省略) errors: (省略) models: member: taken: が他の方と重なっています。 attributes: password: confirmation: が確認用パスワードと一致しません。 uploaded_image: too_large: "のサイズが大き過ぎます(最大64KB)。" template: header: "{{count}}個の入力エラーがあります。"
そして、config/locale/activerecord_en.yml
を次のように修正します。
en: activerecord: (省略) errors: (省略) models: member: attributes: uploaded_image: too_large: "is too large (maximum is 64KB)" template: header: one: "There is an error" other: "There are {{count}} errors"
_errors.rhtml
の中で t
メソッドに与えた :count
オプションの値が、メッセージの中の {{count}}
の部分に埋め込まれます。
『基礎 Ruby on Rails』では利用しませんでしたが、もともと Rails には error_messages_for
というヘルパーメソッドがあります。
Rails 2.2 では、このメソッドも国際化されています。
実は、翻訳ファイルの activerecord.errors.template.header
というキーワードは、この error_messages_for
で使用されるエラーメッセージに対応しています。
なお、英語の場合は、エラーの個数が 1 個であるか 2 個以上であるかによって形が変わるので、header
の下に、one
と other
というサブキーワードを設けて、二つのメッセージを用意する必要があります。
count
の個数によってメッセージを変化させる必要がある場合、以下のサブキーワードを指定できます。
- zero
- one (単数)
- two (双数)
- few (Paucal)
- many
- other
詳しくは unicode.org の Language Plural Rules を参照してください。
ところで、今回のテーマとは離れますが、アカウントの編集フォームを表示するとパスワード欄がブラウザによってオートコンプリート(自動補完)されてしまうことに気付きました。
つまり、ログイン時にブラウザにパスワードを記憶させると、編集フォームのパスワード欄にも自動的に値が入ってしまうのです。
これはちょっと都合がよくありません。
app/views/accounts/edit.rhtml
の 65 行目は次のようになっています。
<div><%= form.password_field :password, :size => 30 %></div>
これを次のように修正すると、オートコンプリートが off になります。
<div><%= form.password_field :password, :size => 30, :autocomplete => 'off' %></div>