在config / locales中自动重新加载rails yml文件

时间:2013-12-12 22:57:56

标签: ruby-on-rails ruby-on-rails-3

在rails中,config / locales中的yml文件允许您提供特定于语言环境的文本和格式设置指令。例如,您可以指定日期格式:

# config/locales/en.yml
  date: 
    formats:
      month: "%B, %Y"

然后在您的视图中,您可以使用帮助程序,如下所示:

<%= l(Date.today, format: :month) %> => "December, 2013"

令人讨厌的是,rails只在您启动服务器时加载语言环境文件,因此如果要进行更改,则必须重新启动开发服务器。是否可以在文件更改时自动重新加载?

3 个答案:

答案 0 :(得分:12)

我认为Rails错过了新的翻译文件,但是将翻译添加到现有文件应该有效。

尝试使用I18n.backend.reload!

强制重新加载

我希望这会有所帮助;)

答案 1 :(得分:9)

有人试图在rails 3.2中支持这个:

https://github.com/rails/rails/blob/v3.2.16/activesupport/lib/active_support/i18n_railtie.rb

但是,它附带此免责声明:

# Add <tt>I18n::Railtie.reloader</tt> to ActionDispatch callbacks. Since, at this
# point, no path was added to the reloader, I18n.reload! is not triggered
# on to_prepare callbacks. This will only happen on the config.after_initialize
# callback below.

在rails 4中有一些更好看的代码,所以这个问题可能会在那里解决(我还没有使用rails 4)。

我添加了以下初始化程序,它检查已更改的文件是config / locales并重新加载I18n:

# config/initializers/reload_locale.rb
if Rails.env == 'development'
  locale_reloader = ActiveSupport::FileUpdateChecker.new(Dir["config/locales/*yml"]) do
     I18n.backend.reload!
  end

  ActionDispatch::Callbacks.to_prepare do
    locale_reloader.execute_if_updated
  end
end

答案 2 :(得分:2)

I18n 在其加载路径中检测对现有文件所做的更改,但如果您想检测 locales 下的新文件并在运行时将它们添加到加载路径中,请尝试此操作。< /p>

# config/initializers/i18n_load_path.rb
if Rails.env.development? || Rails.env.test?
  locales_path = Rails.root.join("config/locales").to_s
  i18n_reloader = ActiveSupport::FileUpdateChecker.new([], locales_path => "yml") do
    Dir["#{locales_path}/*.yml"].each do |locale_path|
      I18n.load_path << locale_path unless I18n.load_path.include? path
    end
  end

  ActiveSupport::Reloader.to_prepare do
    i18n_reloader.execute_if_updated
  end
end

这将监视 locales 目录(或您想要存储 locales 的任何其他目录)并在添加时将缺失的添加到加载路径中。 I18n 接收这些添加的文件,因此无需调用 reload!