适合初学者的Rails和语言环境

时间:2014-08-21 17:57:25

标签: ruby-on-rails locale

我试图了解如何设置区域设置。

现在,我的应用程序控制器已经:

def set_locale
    I18n.locale = user_signed_in? ? current_user.local.to_sym : :en
end

这很有效,但如果我想在登录页面上添加一个快速切换按钮(由于没有current_user而没有会话信息...我怎么能这样做?

2 个答案:

答案 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)

您可以创建一个链,从优先级的多个来源中找出当前的区域设置。来源是(按顺序):

  1. 当前GET变量lang。当用户想要只查看另一个语言环境中的当前页面时,我喜欢使用它。它既不会更改其首选项区域设置,也不会更改会话区域设置。
  2. lang中应用于整个会话的session变量。因此,用户可能希望在不同于其首选项的区域设置中浏览网站中的多个页面,但无需在每个请求上设置GET lang变量,也无需更改其首选项中的区域设置,并且是session进来的地方。它仅适用于当前的......会话:)
  3. 他偏好的区域设置。
  4. 应用程序的默认区域设置(I18n.defaul_locale),如果您未手动设置,则默认为:en
  5. 我的代码如下:

    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