khu*_*hka 19 localization ruby-on-rails internationalization ruby-on-rails-3
我刚刚意识到推荐的Rails方法可以在控制器中设置区域设置
before_filter :set_locale
def set_locale
I18n.locale = params[:locale] || I18n.default_locale
end
Run Code Online (Sandbox Code Playgroud)
全局设置区域设置.上面的代码有效,但我想知道default_locale如果你必须明确键入它是真的默认?
我期望的是每个请求都有一个区域设置(就像我们有每个请求的会话一样)并做类似的事情:
def set_locale
locale = params[:locale] if params[:locale]
end
Run Code Online (Sandbox Code Playgroud)
并且I18n.default_locale默认使用了.这将理想地匹配路径中的可选区域设置:
# config/routes.rb
scope "(:locale)", :locale => /en|nl/ do
resources :books
end
Run Code Online (Sandbox Code Playgroud)
目前,如果出于某种原因我在某些操作中跳过了语言环境设置,它会使用上一个请求中设置的语言环境,该语言环境可能来自其他用户!
并且没有潜在的竞争条件,因为一个请求可以改变全局,I18n.locale而另一个请求(在设置之前设置了另一个语言环境)处于渲染的中间?
更新:我现在发现的一些细节,来自I18n文件:
将当前语言环境设置为伪全局,即在Thread.current散列中def locale =(locale)
现在我想了解每个请求是否是一个单独的线程.
更新2:请参阅我的答案以获得解释.
khu*_*hka 13
所以现在最后的答案.TL; DR设置区域设置仅在使用线程Web服务器(如Thin和Puma)时才充当全局.
如我所说, I18n.locale=
将当前语言环境设置为伪全局,即在Thread.current哈希中
因此它应该是按请求,并且它在Webrick和Unicorn中以这种方式工作.
但是如果你使用像Thin或Puma这样的线程Web服务器,那么线程看起来会更长,并且为将来的请求保留该值,直到它被明确更改为止.我从中学到的是来自新的Steve Klabnik的gem request_store:
如果你需要全局状态,你可能已经达到了Thread.current.
<...>
所以人们正在使用那些花哨的线程Web服务器,比如Thin或Puma.但是如果您使用Thread.current,并且您使用其中一个服务器,请注意!值可能会比您预期的更长时间,这可能会导致错误.
| 归档时间: |
|
| 查看次数: |
3743 次 |
| 最近记录: |