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

spi*_*ike 13 ruby-on-rails ruby-on-rails-3

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

# config/locales/en.yml
  date: 
    formats:
      month: "%B, %Y"
Run Code Online (Sandbox Code Playgroud)

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

<%= l(Date.today, format: :month) %> => "December, 2013"
Run Code Online (Sandbox Code Playgroud)

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

dan*_*per 14

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

尝试强制重新加载它 I18n.backend.reload!

我希望这有帮助 ;)


spi*_*ike 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.
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

  • FYI for Rails 5现在是ActionDispatch :: Callbacks.before (2认同)