I18n.locale 的难以理解的行为



Rails 6.0.1, Zeitwerk 2.2.2


我正在尝试在 Rails 应用程序中进行语言之间的切换。我将语言代码保存在饼干中。然后,在根控制器中,我检查是否存在此代码,如果有语言代码,则应用它:

class Public::BaseController < ApplicationController
layout 'public/main'
before_action :prepare_locale
private
def prepare_locale
cookie_locale = cookies[:locale].presence
return if cookie_locale.blank?
return unless I18n.available_locales.include?(cookie_locale.to_sym)
I18n.locale = cookie_locale
end
end

我特别避免使用locale这个词.这个词被 I18n 采用,他们最好不要在任何地方命名任何东西。

我也有这个帮助程序,我正在使用:

module LocaleHelper
def current_locale?(locale_code)
I18n.locale == locale_code.to_sym
end
end

在布局中,我挂了 lang 属性:

html lang="#{locale}"

现在我将逐步描述问题:

  1. 我正在运行该应用程序。
  2. 在Chrome浏览器中,我打开了该网站。我切换语言。一切都很好。区域设置在 cookie 中,在应用程序中应用。
  3. 同时,我在Safari中打开网站。
  4. 我不选择语言。我只是在刷新页面。几乎每个页面更新都是 EN 或 RU。

我试图注释掉上面显示的代码。毕竟,此代码是唯一适用于I18n.locale的代码。

首先,我注释掉了帮助程序的代码。我停止了应用程序并再次运行它。Safari很好(目前(。接下来,我只是刷新Chrome中的页面。然后在Safari中,I18n.locale再次开始具有不同的含义。我不明白为什么会这样。

接下来,我对根控制器中的代码进行注释。从本质上讲,我现在没有什么可以改变I18n.locale.对一个项目的全球搜索证实了这一点。

野生动物园又好了。在Chrome中重新加载页面并没有破坏任何东西。

也就是说,问题出在根控制器中。

更准确地说,在这一行中:

I18n.locale = cookie_locale

但问题到底出在哪里呢?而且我不明白为什么 Rails 需要重新启动才能重置(某些东西(。

此代码不执行:

I18n.locale = cookie_locale

它被上面的检查阻止。也就是说,这是正常的。但是,为什么在 Safari 的页面上我看到区域设置代码不断变化?

多亏了@max我制作了以下代码:

around_action :prepare_locale
private
def prepare_locale(&action)
cookie_locale = cookies[:locale].presence || I18n.default_locale
if I18n.available_locales.include?(cookie_locale.to_sym)
I18n.with_locale(cookie_locale, &action)
else
I18n.with_locale(I18n.default_locale, &action)
end
end

这是基于官方文档中的示例:https://guides.rubyonrails.org/i18n.html#internationalization-and-localization

相关内容

  • 没有找到相关文章

最新更新