在rails中,config / locales中的yml文件允许您提供特定于语言环境的文本和格式设置指令。例如,您可以指定日期格式:
# config/locales/en.yml
date:
formats:
month: "%B, %Y"
然后在您的视图中,您可以使用帮助程序,如下所示:
<%= l(Date.today, format: :month) %> => "December, 2013"
令人讨厌的是,rails只在您启动服务器时加载语言环境文件,因此如果要进行更改,则必须重新启动开发服务器。是否可以在文件更改时自动重新加载?
答案 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!
。