Fix language filter codes (#4841)
* Fix language filter codes CLD3 returns BCP-47 language identifier, filter settings expect identifiers in the ISO 639-1 format. Convert between formats, and exclude duplicate languages from filter choices (zh-CN->zh) * Fix zh name
This commit is contained in:
		
					parent
					
						
							
								95f018a3d4
							
						
					
				
			
			
				commit
				
					
						1caf11ddcc
					
				
			
		
					 6 changed files with 21 additions and 4 deletions
				
			
		
							
								
								
									
										1
									
								
								Gemfile
									
										
									
									
									
								
							
							
						
						
									
										1
									
								
								Gemfile
									
										
									
									
									
								
							|  | @ -24,6 +24,7 @@ gem 'addressable', '~> 2.5' | ||||||
| gem 'bootsnap' | gem 'bootsnap' | ||||||
| gem 'browser' | gem 'browser' | ||||||
| gem 'charlock_holmes', '~> 0.7.5' | gem 'charlock_holmes', '~> 0.7.5' | ||||||
|  | gem 'iso-639' | ||||||
| gem 'cld3', '~> 3.1' | gem 'cld3', '~> 3.1' | ||||||
| gem 'devise', '~> 4.2' | gem 'devise', '~> 4.2' | ||||||
| gem 'devise-two-factor', '~> 3.0' | gem 'devise-two-factor', '~> 3.0' | ||||||
|  |  | ||||||
|  | @ -225,6 +225,7 @@ GEM | ||||||
|       terminal-table (>= 1.5.1) |       terminal-table (>= 1.5.1) | ||||||
|     idn-ruby (0.1.0) |     idn-ruby (0.1.0) | ||||||
|     ipaddress (0.8.3) |     ipaddress (0.8.3) | ||||||
|  |     iso-639 (0.2.8) | ||||||
|     jmespath (1.3.1) |     jmespath (1.3.1) | ||||||
|     json (2.1.0) |     json (2.1.0) | ||||||
|     json-ld (2.1.5) |     json-ld (2.1.5) | ||||||
|  | @ -560,6 +561,7 @@ DEPENDENCIES | ||||||
|   httplog (~> 0.99) |   httplog (~> 0.99) | ||||||
|   i18n-tasks (~> 0.9) |   i18n-tasks (~> 0.9) | ||||||
|   idn-ruby |   idn-ruby | ||||||
|  |   iso-639 | ||||||
|   json-ld-preloaded (~> 2.2.1) |   json-ld-preloaded (~> 2.2.1) | ||||||
|   kaminari (~> 1.0) |   kaminari (~> 1.0) | ||||||
|   letter_opener (~> 1.4) |   letter_opener (~> 1.4) | ||||||
|  |  | ||||||
|  | @ -30,6 +30,7 @@ module SettingsHelper | ||||||
|     th: 'ภาษาไทย', |     th: 'ภาษาไทย', | ||||||
|     tr: 'Türkçe', |     tr: 'Türkçe', | ||||||
|     uk: 'Українська', |     uk: 'Українська', | ||||||
|  |     zh: '中文', | ||||||
|     'zh-CN': '简体中文', |     'zh-CN': '简体中文', | ||||||
|     'zh-HK': '繁體中文(香港)', |     'zh-HK': '繁體中文(香港)', | ||||||
|     'zh-TW': '繁體中文(臺灣)', |     'zh-TW': '繁體中文(臺灣)', | ||||||
|  | @ -39,6 +40,10 @@ module SettingsHelper | ||||||
|     HUMAN_LOCALES[locale] |     HUMAN_LOCALES[locale] | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|  |   def filterable_languages | ||||||
|  |     I18n.available_locales.map { |locale| locale.to_s.split('-').first.to_sym }.uniq | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|   def hash_to_object(hash) |   def hash_to_object(hash) | ||||||
|     HashObject.new(hash) |     HashObject.new(hash) | ||||||
|   end |   end | ||||||
|  |  | ||||||
|  | @ -20,7 +20,16 @@ class LanguageDetector | ||||||
|   private |   private | ||||||
| 
 | 
 | ||||||
|   def detected_language_code |   def detected_language_code | ||||||
|     result.language.to_sym if detected_language_reliable? |     iso6391(result.language).to_sym if detected_language_reliable? | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|  |   def iso6391(bcp47) | ||||||
|  |     iso639 = bcp47.split('-').first | ||||||
|  | 
 | ||||||
|  |     # CLD3 returns grandfathered language code for Hebrew | ||||||
|  |     return 'he' if iso639 == 'iw' | ||||||
|  | 
 | ||||||
|  |     ISO_639.find(iso639).alpha2 | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   def result |   def result | ||||||
|  |  | ||||||
|  | @ -13,7 +13,7 @@ | ||||||
|       selected: I18n.locale |       selected: I18n.locale | ||||||
| 
 | 
 | ||||||
|     = f.input :filtered_languages, |     = f.input :filtered_languages, | ||||||
|       collection: I18n.available_locales, |       collection: filterable_languages, | ||||||
|       wrapper: :with_block_label, |       wrapper: :with_block_label, | ||||||
|       include_blank: false, |       include_blank: false, | ||||||
|       label_method: lambda { |locale| human_locale(locale) }, |       label_method: lambda { |locale| human_locale(locale) }, | ||||||
|  |  | ||||||
|  | @ -4,10 +4,10 @@ require 'rails_helper' | ||||||
| 
 | 
 | ||||||
| describe SettingsHelper do | describe SettingsHelper do | ||||||
|   describe 'the HUMAN_LOCALES constant' do |   describe 'the HUMAN_LOCALES constant' do | ||||||
|     it 'has the same number of keys as I18n locales exist' do |     it 'includes all I18n locales' do | ||||||
|       options = I18n.available_locales |       options = I18n.available_locales | ||||||
| 
 | 
 | ||||||
|       expect(described_class::HUMAN_LOCALES.keys).to eq(options) |       expect(described_class::HUMAN_LOCALES.keys).to include(*options) | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue