Improve i18n chooser (#1804)
* Add locale spec with failing locale plus region check * Use a more accurate locale when supplied by browser headers Previously we were using a matching option which would use the first locale available which matched the locale portion, even if a region was specified. This changes to first try to find an exact match, and then fall back to the region, and then fall back to the default. * Clean up default_locale method
This commit is contained in:
		
							parent
							
								
									66ea015a01
								
							
						
					
					
						commit
						f5cd138323
					
				
					 2 changed files with 36 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -27,7 +27,11 @@ module Localized
 | 
			
		|||
 | 
			
		||||
  def default_locale
 | 
			
		||||
    ENV.fetch('DEFAULT_LOCALE') {
 | 
			
		||||
      http_accept_language.compatible_language_from(I18n.available_locales) || I18n.default_locale
 | 
			
		||||
      user_supplied_locale || I18n.default_locale
 | 
			
		||||
    }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def user_supplied_locale
 | 
			
		||||
    http_accept_language.language_region_compatible_from(I18n.available_locales)
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										31
									
								
								spec/requests/localization_spec.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								spec/requests/localization_spec.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,31 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require 'rails_helper'
 | 
			
		||||
 | 
			
		||||
describe 'Localization' do
 | 
			
		||||
  it 'uses a specific region when provided' do
 | 
			
		||||
    headers = { 'Accept-Language' => 'zh-HK' }
 | 
			
		||||
 | 
			
		||||
    get "/about", headers: headers
 | 
			
		||||
    expect(response.body).to include(
 | 
			
		||||
      I18n.t('about.about_mastodon', locale: 'zh-HK')
 | 
			
		||||
    )
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  it 'falls back to a locale when region missing' do
 | 
			
		||||
    headers = { 'Accept-Language' => 'es-FAKE' }
 | 
			
		||||
 | 
			
		||||
    get "/about", headers: headers
 | 
			
		||||
    expect(response.body).to include(
 | 
			
		||||
      I18n.t('about.about_mastodon', locale: 'es')
 | 
			
		||||
    )
 | 
			
		||||
  end
 | 
			
		||||
  it 'falls back to english when locale is missing' do
 | 
			
		||||
    headers = { 'Accept-Language' => '12-FAKE' }
 | 
			
		||||
 | 
			
		||||
    get "/about", headers: headers
 | 
			
		||||
    expect(response.body).to include(
 | 
			
		||||
      I18n.t('about.about_mastodon', locale: 'en')
 | 
			
		||||
    )
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
		Reference in a new issue