🖥

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

2024/09/07に公開

翻訳設定

てきように用意しておく

以下は英語翻訳で、

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

を指定した例

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

https://railsguides.jp/i18n.html

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ

プロフィール・経歴

https://github.com/YumaInaura/YumaInaura

公開日時

2024-07-10

https://qiita.com/YumaInaura/items/37f58045c76ddd8b7082

Discussion