如何在整个页面中保持相同的语言环境,直到用户在Ruby中放入另一个命令?

时间:2016-04-23 00:59:25

标签: ruby locale

我试图让用户在整个页面中看到相同的区域设置,除非用户再次更改。

我认为我通过使用全局变量$ language暂时保存用户命令解决了这个问题。用户请求区域设置更改使用url_for(:locale =>'kr')

如果除了我之外没有其他用户,它会起作用。但是一旦用户进来并且他们更改了配置,我的配置也会更新,因为$ language是共享的。我怎么能防止这件事发生? (:

请给我任何预感Ruby!

视图

<%= link_to 'Korean', url_for( :locale => 'kr') ,{:style=>"padding-top:0px;"} %>
<%= link_to 'English', url_for( :locale => 'en') ,{:style=>"padding-top:0px;"} %>

application.rb中

$language = "kr"

def default_url_options(options = {})
    { locale: I18n.locale }.merge options
  end

  def set_locale

    if params[:locale] 
      locale_save = params[:locale]
    else
      locale_save = $language 
    end

    I18n.locale = locale_save || params[:locale] || "kr"
    if params[:locale]
      $language = params[:locale]
    end
    @locale = $language

  end

1 个答案:

答案 0 :(得分:1)

正如您所发现的,$language对于Ruby进程来说是完全全局的,因此设置它会影响每个访问服务器的用户。如果你有多个服务器,你会遇到一个不同的问题,你在其中一个设置$language,但其他人没有听到,所以根据你点击的服务器,你会得到任何一个地方最后设定它。

由于这是每用户设置,因此您希望将其放在session上。 (如果您的数据库中有一些User模型,并希望跨登录/清除cookie保存设置,您也可以将其放在那里)。您应该或多或少能够使用$language替代session[:locale]的使用:

session[:locale] = params[:locale] || session[:locale] || 'kr'
I18n.locale = @locale = session[:locale]

第一行按优先顺序设置语言环境:

  • 如果有locale参数,请使用并保存
  • 否则,请使用session
  • 中已有的内容
  • 最后,默认为kr

做出决定后,第二行会为您的其余计划设置I18n@locale。根据{{​​1}}的使用方式,您可能实际上并不需要这样做,而只能在任何地方使用@locale