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



我试图让用户在整个页面中看到相同的语言环境,除非用户再次更改。

我以为我通过使用全局变量$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]即可。

相关内容

  • 没有找到相关文章

最新更新