diff --git a/Changes.md b/Changes.md index f324758f..9b973401 100644 --- a/Changes.md +++ b/Changes.md @@ -1,6 +1,9 @@ 2.8.0 ----------- +- I18n support! Sidekiq can optionally save and restore the Rails locale + so it will be properly set when your jobs execute. Just include + `require 'sidekiq/middleware/i18n'` in your sidekiq initializer. [#750] - Fix bug which could lose messages when using namespaces and the message needs to be requeued in Redis. [#744] - Refactor Redis namespace support [#747]. The redis namespace can no longer be diff --git a/lib/sidekiq/middleware/i18n.rb b/lib/sidekiq/middleware/i18n.rb new file mode 100644 index 00000000..c7cb0ac1 --- /dev/null +++ b/lib/sidekiq/middleware/i18n.rb @@ -0,0 +1,35 @@ +module Sidekiq::Middleware::I18n + # Get the current locale and store it in the message + # to be sent to Sidekiq. + class Client + def call(worker_class, msg, queue) + msg['locale'] = I18n.locale + yield + end + end + + # Pull the msg locale out and set the current thread to use it. + class Server + def call(worker, msg, queue) + I18n.locale = msg['locale'] || I18n.default_locale + yield + ensure + I18n.locale = nil + end + end +end + +Sidekiq.configure_client do |config| + config.client_middleware do |chain| + chain.add Sidekiq::Middleware::I18n::Client + end +end + +Sidekiq.configure_server do |config| + config.client_middleware do |chain| + chain.add Sidekiq::Middleware::I18n::Client + end + config.server_middleware do |chain| + chain.add Sidekiq::Middleware::I18n::Server + end +end diff --git a/test/test_middleware.rb b/test/test_middleware.rb index 33632dcf..0a9e45cb 100644 --- a/test/test_middleware.rb +++ b/test/test_middleware.rb @@ -99,4 +99,28 @@ class TestMiddleware < MiniTest::Unit::TestCase assert_equal [], recorder end end + + describe 'i18n' do + before do + require 'i18n' + require 'sidekiq/middleware/i18n' + end + + it 'saves and restores locale' do + I18n.locale = 'fr' + msg = {} + mw = Sidekiq::Middleware::I18n::Client.new + mw.call(nil, msg, nil) { } + assert_equal :fr, msg['locale'] + + msg['locale'] = 'jp' + I18n.locale = nil + assert_equal :en, I18n.locale + mw = Sidekiq::Middleware::I18n::Server.new + mw.call(nil, msg, nil) do + assert_equal :jp, I18n.locale + end + assert_equal :en, I18n.locale + end + end end