Skip to content

Commit

Permalink
port tootsuite#8657: Change locale detection to run once per session
Browse files Browse the repository at this point in the history
  • Loading branch information
Gargron authored and multiple creatures committed Feb 21, 2020
1 parent c600f16 commit 755d96d
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 21 deletions.
7 changes: 2 additions & 5 deletions app/controllers/application_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -224,11 +224,8 @@ def current_skin

def respond_with_error(code)
respond_to do |format|
format.any do
use_pack 'error'
render "errors/#{code}", layout: 'error', status: code, formats: [:html]
end
format.json { render json: { error: Rack::Utils::HTTP_STATUS_CODES[code] }, status: code }
format.any { head code }
format.html { render "errors/#{code}", layout: 'error', status: code }
end
end

Expand Down
13 changes: 8 additions & 5 deletions app/controllers/concerns/localized.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,19 @@ module Localized
extend ActiveSupport::Concern

included do
before_action :set_locale
around_action :set_locale
end

private

def set_locale
I18n.locale = default_locale
I18n.locale = current_user.locale if user_signed_in?
rescue I18n::InvalidLocale
I18n.locale = default_locale
locale = current_user.locale if respond_to?(:user_signed_in?) && user_signed_in?
locale ||= session[:locale] ||= default_locale
locale = default_locale unless I18n.available_locales.include?(locale.to_sym)

I18n.with_locale(locale) do
yield
end
end

def default_locale
Expand Down
3 changes: 3 additions & 0 deletions config/application.rb
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,9 @@ class Application < Rails::Application
Doorkeeper::AuthorizationsController.layout 'modal'
Doorkeeper::AuthorizedApplicationsController.layout 'admin'
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
16 changes: 5 additions & 11 deletions spec/controllers/concerns/localized_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,10 @@
include Localized

def success
head 200
render plain: I18n.locale, status: 200
end
end

around do |example|
current_locale = I18n.locale
example.run
I18n.locale = current_locale
end

before do
routes.draw { get 'success' => 'anonymous#success' }
end
Expand All @@ -25,19 +19,19 @@ def success
it 'sets available and preferred language' do
request.headers['Accept-Language'] = 'ca-ES, fa'
get 'success'
expect(I18n.locale).to eq :fa
expect(response.body).to eq 'fa'
end

it 'sets available and compatible language if none of available languages are preferred' do
request.headers['Accept-Language'] = 'fa-IR'
get 'success'
expect(I18n.locale).to eq :fa
expect(response.body).to eq 'fa'
end

it 'sets default locale if none of available languages are compatible' do
request.headers['Accept-Language'] = ''
get 'success'
expect(I18n.locale).to eq :en
expect(response.body).to eq 'en'
end
end

Expand All @@ -48,7 +42,7 @@ def success
sign_in(user)
get 'success'

expect(I18n.locale).to eq :ca
expect(response.body).to eq 'ca'
end
end

Expand Down

0 comments on commit 755d96d

Please sign in to comment.