我试图让用户在整个页面中看到相同的区域设置,除非用户再次更改。
我认为我通过使用全局变量$ 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;"} %>
$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
答案 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
。