LoginSignup
0
0

Rails + I18n - バリデーションエラーの言語を強制指定する例

Posted at

翻訳設定

てきように用意しておく

以下は英語翻訳で、

  • 属性に対しての翻訳
  • ひとつのモデルに対してのエラーの種類の翻訳

を指定した例

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オープンチャットもご利用ください。

プロフィール・経歴

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0