Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

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.

@karmi

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?

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