🖥
Rails + I18n - バリデーションエラーの言語を強制指定する例
翻訳設定
てきように用意しておく
以下は英語翻訳で、
- 属性に対しての翻訳
- ひとつのモデルに対してのエラーの種類の翻訳
を指定した例
api/config/locales/activerecord.en.yml
---
en:
activerecord:
attributes:
example:
foo: localed foo
errors:
models:
example:
blank: IS BLANK!
Rails Console で試す
英語指定の場合
I18n.locale = :en
example = Examole.new # 何か不正なデータ状態
example.validate
puts example.errors.full_messages
エラーメッセージの例
["localed foo IS BLANK!"]
Controller で試す
英語指定の場合
class ExampleController <ApplicationController
around_action :switch_locale
def switch_locale(&)
locale = :en
I18n.with_locale(locale, &)
end
def index
example = Examole.new # 何か不正なデータ状態
example.validate
puts example.errors.full_messages # ここでエラーメッセージが得られる。Railsサーバーのログなどで確認する
end
end
公式
I18n.locale=やI18n.with_localeを使わない場合、すべての訳文でデフォルトのロケールが使われます。
I18n.localeの設定がすべてのコントローラで一貫していないと、同じスレッドやプロセスによって処理される今後のリクエストにI18n.localeが漏出する可能性があります。たとえば、あるPOSTリクエストでI18n.locale = :esを実行すると、ロケールを設定していないコントローラで以後のすべてのリクエストに効いてしまいます。
こうした理由から、I18n.locale =の代わりに、漏出が発生しないI18n.with_localeを利用することもできます。ロケールはApplicationControllerのaround_actionで設定できます。
around_action :switch_locale
def switch_locale(&action)
locale = params[:locale] || I18n.default_locale
I18n.with_locale(locale, &action)
end
チャットメンバー募集
何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。
プロフィール・経歴
公開日時
2024-07-10
Discussion