我试图了解如何设置区域设置。
现在,我的应用程序控制器已经:
def set_locale
I18n.locale = user_signed_in? ? current_user.local.to_sym : :en
end
这很有效,但如果我想在登录页面上添加一个快速切换按钮(由于没有current_user
而没有会话信息...我怎么能这样做?
答案 0 :(得分:1)
您无需current_user
进行会话。每次点击您应用的请求都会有一个session
对象,您可以在其中保存数据。
如果用户当前未登录,您的set_locale
可以使用session
中存储的区域设置作为默认值(回退到:en
):
def set_locale
I18n.locale = user_signed_in? ? current_user.local.to_sym : (session[:locale] || :en)
end
您只需要一种根据用户提交的区域设置设置区域设置的方法。
答案 1 :(得分:0)
您可以创建一个链,从优先级的多个来源中找出当前的区域设置。来源是(按顺序):
GET
变量lang
。当用户想要只查看另一个语言环境中的当前页面时,我喜欢使用它。它既不会更改其首选项区域设置,也不会更改会话区域设置。lang
中应用于整个会话的session
变量。因此,用户可能希望在不同于其首选项的区域设置中浏览网站中的多个页面,但无需在每个请求上设置GET lang
变量,也无需更改其首选项中的区域设置,并且是session
进来的地方。它仅适用于当前的......会话:)I18n.defaul_locale
),如果您未手动设置,则默认为:en
。我的代码如下:
before_filter :set_locale
def set_locale
if user_signed_in?
I18n.locale = params[:lang] || session[:lang] || current_user.locale || I18n.default_locale
else
I18n.locale = params[:lang] || session[:lang] || I18n.default_locale
end
end