我试图让用户在整个页面中看到相同的语言环境,除非用户再次更改。
我以为我通过使用全局变量$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;"} %>
应用程序.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
#
正如您所发现的,$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
。根据@locale
的使用方式,您可能实际上并不需要它,只需在任何地方使用session[:locale]
即可。