17

我刚刚意识到,推荐Rails的方式来设置的地点在控制器为什么Rails中的语言环境设置充当全局(使用Thin时)?

before_filter :set_locale 

def set_locale 
    I18n.locale = params[:locale] || I18n.default_locale 
end 

将全球的语言环境。上面的代码工作,但我不知道是否default_locale真的默认,如果你必须明确键入它?

我期望的是让每个请求的区域(就像我们每个请求会话),并做类似:

def set_locale 
    locale = params[:locale] if params[:locale] 
end 

,并具有以其它方式使用默认I18n.default_locale。这将在路径非常匹配的可选区域:

# config/routes.rb 
scope "(:locale)", :locale => /en|nl/ do 
    resources :books 
end 

现在如果由于某种原因,我在一些行动跳过区域设置是使用区域设置在之前的请求可能是从其他用户设定!

而不是潜在的竞争条件,因为一个请求可以改变全局I18n.locale而另一个请求(已设置另一个区域设置beforehande)正处于渲染的中间?


UPDATE:一些细节,我发现,现在,从的I18n documentstion:

设置伪全球当前的语言环境,即在Thread.current哈希 高清区域设置=(区域)

现在我想明白,如果每个请求是一个单独的线程。


更新2:看我的解释回答。

回答

12

所以,现在的最终答案。 TL; DR只有在使用线程化Web服务器(如Thin和Puma)时,设置语言环境才能成为全局语言。

正如我所提到的,I18n.locale=

设置当前区域设置伪全球范围内,即,在线程。目前的散列

所以它应该是每个请求,并且它在Webrick和Unicorn中以这种方式工作。

但是,如果使用像Thin或Puma这样的线程化Web服务器,似乎线程寿命更长,并且值将被保留用于将来的请求,直到它被明确更改。在那里我学到这是从新史蒂夫Klabnik的宝石request_store

如果需要全局状态,你可能已经达到Thread.current。

<...>

所以人们使用那些花哨线程web服务器,如薄或彪马。但是如果你使用Thread.current,并且你使用其中一台服务器,那就小心!价值观可能会比预期的更长,这可能会导致错误。

+0

我有完全相同的问题,但我使用独角兽!任何想法如何解决这个问题?谢谢 – 2014-07-24 06:12:41

+0

我想当你说“I18n.set_locale”时,你的意思是“I18n.locale =”对吗? http://www.rubydoc.info/github/svenfuchs/i18n/I18n/Config:locale= – lulalala 2014-11-11 02:16:11

+0

你是对的,谢谢你的纠正。 – khustochka 2014-11-11 14:27:48

2

上面的推荐代码没有在全局范围内设置区域设置,而是通过请求来设置它。

before_filter :set_locale 

def set_locale 
    I18n.locale = params[:locale] || I18n.default_locale 
end 

代码通常放置在BaseController中,所以在每个页面呈现之前它都会被触发并设置。没有竞争条件,因为每个页面都会触发此代码,并且会在那里计算I18n语言环境。比起使用英语,你可以扩大这个范围,让我们看看用户的语言环境,而不是请求参数。

def set_locale 
    I18n.locale = @user.locale || session[:locale] || params[:locale] || :en 
end 

换句话说,如果你设置一个页面上的地方,让我们在家里控制器德说,并得到了仪表盘控制器,你会看到默认语言(英语)。由于变化不是全球性的。这就是代码被放置在基本控制器中的原因。希望它是有道理的。

+1

'I18n'是一个全局模块,'I18n.locale ='改变了它的状态。 我同意通过'before_filter'为每个请求显式设置区域设置的推荐方式一般按预期工作。 我还想知道Rails请求是否可以在不同的线程中同时运行 - 如果是的话,我看到可能请求1设置了'I18n.locale',然后请求2设置了不同的'I18n.locale',然后请求1开始使用新的(不正确的)语言环境。 对不起,如果我让你的答案错了。 – khustochka 2012-02-14 08:50:23

相关问题