Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

I18n support for plugins

Rails will now automatically add locale files found in any engine's locale
directory to the I18n.load_path (i.e. files that match the glob pattern
"config/locales/**/*.{rb,yml}" relative to engine directories).

[#2325 state:committed]

Signed-off-by: Jeremy Kemper <jeremy@bitsweat.net>
  • Loading branch information...
commit cf4846c6ae991143afaef987a63c3ad9a3a2546b 1 parent 0efedf2
@atd atd authored jeremy committed
View
2  railties/CHANGELOG
@@ -1,5 +1,7 @@
*Edge*
+* I18n support for plugins. #2325 [Antonio Tapiador, Sven Fuchs]
+
* Ruby 1.9: use UTF-8 for default internal and external encodings. [Jeremy Kemper]
* Added db/seeds.rb as a default file for storing seed data for the database. Can be loaded with rake db:seed (or created alongside the db with db:setup). (This is also known as the "Stop Putting Gawd Damn Seed Data In Your Migrations" feature) [DHH]
View
12 railties/lib/rails/plugin.rb
@@ -71,6 +71,10 @@ def routed?
File.exist?(routing_file)
end
+ # Returns true if there is any localization file in locale_path
+ def localized?
+ locale_files.any?
+ end
def view_path
File.join(directory, 'app', 'views')
@@ -87,6 +91,14 @@ def metal_path
def routing_file
File.join(directory, 'config', 'routes.rb')
end
+
+ def locale_path
+ File.join(directory, 'config', 'locales')
+ end
+
+ def locale_files
+ Dir[ File.join(locale_path, '*.{rb,yml}') ]
@karmi
karmi added a note

Hi, this means only locale files directly in /config are loaded, and does not allow for nested locales like /my_plugin/app/config/locales/models/en.yml, /my_plugin/app/config/locales/defaults/en.yml, etc. Something like:

Dir[ File.join(locale_path, '**', '*.{rb,yml}') ]

would be better?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
+ end
private
View
7 railties/lib/rails/plugin/loader.rb
@@ -73,6 +73,7 @@ def engine_metal_paths
def configure_engines
if engines.any?
add_engine_routing_configurations
+ add_engine_locales
add_engine_controller_paths
add_engine_view_paths
end
@@ -84,6 +85,12 @@ def add_engine_routing_configurations
end
end
+ def add_engine_locales
+ # reverse it such that the last engine can overwrite translations from the first, like with routes
+ locale_files = engines.select(&:localized?).collect(&:locale_files).reverse.flatten
+ I18n.load_path += locale_files - I18n.load_path
+ end
+
def add_engine_controller_paths
ActionController::Routing.controller_paths += engines.collect {|engine| engine.controller_path }
end
View
2  railties/test/fixtures/plugins/engines/engine/config/locales/en.yml
@@ -0,0 +1,2 @@
+en:
+ hello: "Hello from Engine"
View
1  railties/test/initializer_test.rb
@@ -406,6 +406,7 @@ def test_config_defaults_and_settings_should_be_added_to_i18n_defaults
File.expand_path(File.dirname(__FILE__) + "/../../actionpack/lib/action_view/locale/en.yml"),
File.expand_path(File.dirname(__FILE__) + "/../../activemodel/lib/active_model/locale/en.yml"),
File.expand_path(File.dirname(__FILE__) + "/../../activerecord/lib/active_record/locale/en.yml"),
+ File.expand_path(File.dirname(__FILE__) + "/../../railties/test/fixtures/plugins/engines/engine/config/locales/en.yml"),
"my/test/locale.yml",
"my/other/locale.yml" ], I18n.load_path.collect { |path| path =~ /\.\./ ? File.expand_path(path) : path }
end
View
8 railties/test/plugin_loader_test.rb
@@ -156,6 +156,14 @@ def test_should_add_all_load_paths_from_a_plugin_to_LOAD_PATH_array
plugin_load_paths.each { |path| assert $LOAD_PATH.include?(path) }
end
+ def test_should_add_locale_files_to_I18n_load_path
+ only_load_the_following_plugins! [:engine]
+
+ @loader.send :add_engine_locales
+
+ assert I18n.load_path.include?(File.join(plugin_fixture_path('engines/engine'), 'config', 'locales', 'en.yml'))
+ end
+
private
def reset_load_path!

1 comment on commit cf4846c

@KieranP

Awesome. Now start on migrations/seed data.

Please sign in to comment.
Something went wrong with that request. Please try again.