2

我对赛璐珞很陌生,但我不明白为什么在我的 Rails 应用程序中,我的未来会失去当前的语言环境:

puts "locale OUTSIDE #{I18n.locale}"
data.map do |item|
  Celluloid::Future.new { puts "locale INSIDE #{I18n.locale}"; serialize_item(item) }
end.map(&:value)

基本上我得到了类似的东西

locale OUTSIDE en
locale INSIDE it
locale INSIDE it
locale INSIDE it
locale INSIDE it
locale INSIDE itlocale INSIDE it
locale INSIDE it

locale INSIDE it

locale INSIDE it

当我更改语言环境时,期货会继续考虑我的默认语言环境:它

我觉得我错过了一些基本的东西......

4

2 回答 2

2

赛璐珞期货在单独的线程池中执行(不是一些答案所暗示的不同进程),

I18n.locale值存储在范围为单个线程http://www.rubydoc.info/docs/rails/2.3.8/I18n%2FConfig%3Alocale的变量中:

唯一不是全局且范围为线程的配置值是 :locale。它默认为 default_locale。

这意味着您在工作线程之外设置的配置不适用于工作线程。

你需要:

  1. 如果您希望将I18n.default_locale配置传播到进程中的所有工作线程,请使用,或者
  2. 将语言环境作为参数发送到未来并设置它(确保在确保块中再次清除它,否则其他赛璐珞演员可能会发生有趣的事情)
于 2016-04-15T09:15:56.747 回答
0

如果要使用语言环境,请将其作为参数传递给构造函数:

Celluloid::Future.new(locale = I18n.locale) { puts "locale INSIDE #{locale}" }

我相信该块将在新进程中执行,因此您的语言环境信息会丢失。

于 2016-04-15T08:59:52.007 回答