Change locale detection to run once per session (#8657)

Fix #6462
This commit is contained in:
Eugen Rochko 2019-07-21 18:08:02 +02:00
parent dead24a773
commit 9bb23b8d19
4 changed files with 17 additions and 21 deletions

View file

@ -130,11 +130,7 @@ class ApplicationController < ActionController::Base
def respond_with_error(code) def respond_with_error(code)
respond_to do |format| respond_to do |format|
format.any { head code } format.any { head code }
format.html { render "errors/#{code}", layout: 'error', status: code }
format.html do
set_locale
render "errors/#{code}", layout: 'error', status: code
end
end end
end end

View file

@ -4,16 +4,19 @@ module Localized
extend ActiveSupport::Concern extend ActiveSupport::Concern
included do included do
before_action :set_locale around_action :set_locale
end end
private private
def set_locale def set_locale
I18n.locale = default_locale locale = current_user.locale if respond_to?(:user_signed_in?) && user_signed_in?
I18n.locale = current_user.locale if user_signed_in? locale ||= session[:locale] ||= default_locale
rescue I18n::InvalidLocale locale = default_locale unless I18n.available_locales.include?(locale.to_sym)
I18n.locale = default_locale
I18n.with_locale(locale) do
yield
end
end end
def default_locale def default_locale

View file

@ -114,6 +114,9 @@ module Mastodon
Doorkeeper::AuthorizationsController.layout 'modal' Doorkeeper::AuthorizationsController.layout 'modal'
Doorkeeper::AuthorizedApplicationsController.layout 'admin' Doorkeeper::AuthorizedApplicationsController.layout 'admin'
Doorkeeper::Application.send :include, ApplicationExtension Doorkeeper::Application.send :include, ApplicationExtension
Devise::FailureApp.send :include, AbstractController::Callbacks
Devise::FailureApp.send :include, HttpAcceptLanguage::EasyAccess
Devise::FailureApp.send :include, Localized
end end
end end
end end

View file

@ -7,16 +7,10 @@ describe ApplicationController, type: :controller do
include Localized include Localized
def success def success
head 200 render plain: I18n.locale, status: 200
end end
end end
around do |example|
current_locale = I18n.locale
example.run
I18n.locale = current_locale
end
before do before do
routes.draw { get 'success' => 'anonymous#success' } routes.draw { get 'success' => 'anonymous#success' }
end end
@ -25,19 +19,19 @@ describe ApplicationController, type: :controller do
it 'sets available and preferred language' do it 'sets available and preferred language' do
request.headers['Accept-Language'] = 'ca-ES, fa' request.headers['Accept-Language'] = 'ca-ES, fa'
get 'success' get 'success'
expect(I18n.locale).to eq :fa expect(response.body).to eq 'fa'
end end
it 'sets available and compatible language if none of available languages are preferred' do it 'sets available and compatible language if none of available languages are preferred' do
request.headers['Accept-Language'] = 'fa-IR' request.headers['Accept-Language'] = 'fa-IR'
get 'success' get 'success'
expect(I18n.locale).to eq :fa expect(response.body).to eq 'fa'
end end
it 'sets default locale if none of available languages are compatible' do it 'sets default locale if none of available languages are compatible' do
request.headers['Accept-Language'] = '' request.headers['Accept-Language'] = ''
get 'success' get 'success'
expect(I18n.locale).to eq :en expect(response.body).to eq 'en'
end end
end end
@ -48,7 +42,7 @@ describe ApplicationController, type: :controller do
sign_in(user) sign_in(user)
get 'success' get 'success'
expect(I18n.locale).to eq :ca expect(response.body).to eq 'ca'
end end
end end