published under license Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)copy! share!
posted in category Software Development & Programming / Rails i18n
posted at 20. May '20
last updated at 21. May '20
Ruby on Rails Internationalization (I18n) Notes
My Locale Changes Randomly In Tests
Only tests ran through puma won’t affect locale of next test in line. Reset it after tests.
RSpec.configure do |config|
config.after(:each) { I18n.locale = I18n.default_locale }
end
Run tests with the seed and debug where is fails:
RSpec.configure do |config|
config.before(:each) do |example|
puts "#{I18n.locale} #{example.metadata[:example_group][:file_path]} #{example.description}"
end
end
bin/rspec --seed 53982
Required Settings
# config/application.rb
config.i18n.default_locale = ENV['DEFAULT_LOCALE'] || :en
config.i18n.available_locales = [:en, :sk]
Fragment Caching
Add locale to be part of the key:
- cache [I18n.locale, @article] do
Last Help
Sometimes deploy is just fucked up. Redeploy or restart containers.
My Fucking I18n Locale Leaks Across Requests
The locale isn’t reset in the same process or thread. So specific puma thread or unicorn process return the previous locale instead of expected default one.
Always set locale in before_action like:
# ApplicationController
before_action :set_locale
def set_locale
if params[:locale]
I18n.locale = params[:locale]
else
I18n.locale = I18n.default_locale
end
end
Or use around_action
like in Rails guides https://guides.rubyonrails.org/i18n.html#configure-the-i18n-module
# ApplucationController
around_action :switch_locale
def switch_locale(&action)
locale = params[:locale] || I18n.default_locale
I18n.with_locale(locale, &action)
end
If locale is invalid, it sets default one, so no need to validate against available locales.
Add Comment