在rails验证消息上更改区域设置的方法



Ruby 3.1.3, rails 7.0.4

我有一个简单的唯一性验证模型:

app/模型/user.rb

validates :email, uniqueness: true

app/controllers/user_controller.rb

user = User.new
user.email = 'existed_email@example.com'
user.save

配置/地区/en-US.yml

en-US:
activerecord:
attributes:
user:
email: email
errors:
format: "%{attribute} %{message}"
messages:
taken: has already been taken

配置/地区/ja-JP.yml

ja-JP:
activerecord:
attributes:
user:
email: メールアドレス
errors:
format: "%{attribute} %{message}"
messages:
taken: はすでに存在します。

当我尝试创建一个用户并使用已存在的电子邮件来获取错误消息时,它会自动给我错误消息的英文版本,这是

email has already been taken

尽管默认语言是日语(i18 .default_locale =:ja-JP)。如何在控制器中创建用户时动态更改区域设置?就像

user.save(lang: 'ja-JP')
return user.errors.full_messages => this should output ["メールアドレス はすでに存在します"]
user.save(lang: 'en-US')
return user.errors.full_messages => this should output ["email has already been taken"]

rails如何决定使用什么语言?我没有在控制器的任何地方设置区域设置。

Try below

ja-JP:
activerecord:
errors:
models:
user:
attributes:
email:
blank: メールアドレス
invalid: メールアドレス

下面是动态消息文本的示例。

控制器或助手代码:

err_message = t('coupons.redeemed_html', count: 2, limit: 1)

locale文件:

jp:
coupons:
redeemed_html:
one: '%{count}/<span class="limit">%{limit}</span>'

如果您想更改保存操作的区域设置

I18n.with_locale(:ja) {user.save}

以上代码不会改变用户的默认语言环境。

从用户首选项设置区域设置:具有经过身份验证的用户的应用程序可能允许用户通过应用程序的界面设置区域首选项。使用这种方法,用户选择的语言环境首选项将保存在数据库中,并用于为该用户的身份验证请求设置语言环境。Doc Doc Here https://guides.rubyonrails.org/i18n.html

around_action :switch_locale
def switch_locale(&action)
locale = current_user.try(:locale) || I18n.default_locale
I18n.with_locale(locale, &action)
end

with_locale应该可以解决这个问题。

# app/controllers/user_controller.rb
I18n.with_locale(:en) do
...
user.save
end

请注意,您的I18n.default_locale设置为jp,但您收到的错误仍然是英文,这表明您还在代码的某个地方设置了I18n.locale = ...

相关内容

  • 没有找到相关文章