提交 a0fa45c0 编写于 作者: K Kasper Timm Hansen

Merge pull request #21124 from kirs/feature/reload-i18n

Reload I18n.load_path in development
......@@ -37,10 +37,12 @@ def self.initialize_i18n(app)
enforce_available_locales = I18n.enforce_available_locales if enforce_available_locales.nil?
I18n.enforce_available_locales = false
reloadable_paths = []
app.config.i18n.each do |setting, value|
case setting
when :railties_load_path
app.config.i18n.load_path.unshift(*value)
reloadable_paths = value
app.config.i18n.load_path.unshift(*value.map(&:existent).flatten)
when :load_path
I18n.load_path += value
else
......@@ -53,7 +55,14 @@ def self.initialize_i18n(app)
# Restore available locales check so it will take place from now on.
I18n.enforce_available_locales = enforce_available_locales
reloader = ActiveSupport::FileUpdateChecker.new(I18n.load_path.dup){ I18n.reload! }
directories = watched_dirs_with_extensions(reloadable_paths)
reloader = ActiveSupport::FileUpdateChecker.new(I18n.load_path.dup, directories) do
I18n.load_path.keep_if { |p| File.exist?(p) }
I18n.load_path |= reloadable_paths.map(&:existent).flatten
I18n.reload!
end
app.reloaders << reloader
ActionDispatch::Reloader.to_prepare do
reloader.execute_if_updated
......@@ -96,5 +105,11 @@ def self.validate_fallbacks(fallbacks)
raise "Unexpected fallback type #{fallbacks.inspect}"
end
end
def self.watched_dirs_with_extensions(paths)
paths.each_with_object({}) do |path, result|
result[path.absolute_current] = path.extensions
end
end
end
end
......@@ -587,7 +587,7 @@ def load_seed
# I18n load paths are a special case since the ones added
# later have higher priority.
initializer :add_locales do
config.i18n.railties_load_path.concat(paths["config/locales"].existent)
config.i18n.railties_load_path << paths["config/locales"]
end
initializer :add_view_paths do
......
......@@ -123,6 +123,11 @@ def initialize(root, current, paths, options = {})
options[:load_path] ? load_path! : skip_load_path!
end
# :nodoc:
def absolute_current
File.expand_path(@current, @root.path)
end
def children
keys = @root.keys.find_all { |k|
k.start_with?(@current) && k != @current
......@@ -175,6 +180,11 @@ def to_ary
@paths
end
# :nodoc:
def extensions
$1.split(',') if @glob =~ /\{([\S]+)\}/
end
# Expands all paths against the root and return all unique values.
def expanded
raise "You need to set a path root" unless @root.path
......
......@@ -132,6 +132,79 @@ class Foo < ActiveRecord::Base
assert_equal "2", last_response.body
end
test "new locale files are loaded" do
add_to_config <<-RUBY
config.cache_classes = false
RUBY
app_file "config/locales/en.yml", <<-YAML
en:
foo: "1"
YAML
app_file 'config/routes.rb', <<-RUBY
Rails.application.routes.draw do
get '/i18n', :to => lambda { |env| [200, {}, [I18n.t(:foo)]] }
end
RUBY
require 'rack/test'
extend Rack::Test::Methods
load_app
get "/i18n"
assert_equal "1", last_response.body
# Wait a full second so we have time for changes to propagate
sleep(1)
remove_file "config/locales/en.yml"
app_file "config/locales/custom.en.yml", <<-YAML
en:
foo: "2"
YAML
get "/i18n"
assert_equal "2", last_response.body
end
test "I18n.load_path is reloaded" do
add_to_config <<-RUBY
config.cache_classes = false
RUBY
app_file "config/locales/en.yml", <<-YAML
en:
foo: "1"
YAML
app_file 'config/routes.rb', <<-RUBY
Rails.application.routes.draw do
get '/i18n', :to => lambda { |env| [200, {}, [I18n.load_path.inspect]] }
end
RUBY
require 'rack/test'
extend Rack::Test::Methods
load_app
get "/i18n"
assert_match "en.yml", last_response.body
# Wait a full second so we have time for changes to propagate
sleep(1)
app_file "config/locales/fr.yml", <<-YAML
fr:
foo: "2"
YAML
get "/i18n"
assert_match "fr.yml", last_response.body
assert_match "en.yml", last_response.body
end
# Fallbacks
test "not using config.i18n.fallbacks does not initialize I18n.fallbacks" do
I18n.backend = Class.new(I18n::Backend::Simple).new
......
......@@ -62,6 +62,13 @@ def setup
assert_equal ["/foo/bar/baz"], @root["app/models"].to_a
end
test "absolute current path" do
@root.add "config"
@root.add "config/locales"
assert_equal "/foo/bar/config/locales", @root["config/locales"].absolute_current
end
test "adding multiple physical paths as an array" do
@root.add "app", with: ["/app", "/app2"]
assert_equal ["/app", "/app2"], @root["app"].to_a
......@@ -215,6 +222,12 @@ def setup
assert_equal "*.rb", @root["app"].glob
end
test "it should be possible to get extensions by glob" do
@root["app"] = "/app"
@root["app"].glob = "*.{rb,yml}"
assert_equal ["rb", "yml"], @root["app"].extensions
end
test "it should be possible to override a path's default glob without assignment" do
@root.add "app", with: "/app", glob: "*.rb"
assert_equal "*.rb", @root["app"].glob
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册