forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			62 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { DropDown } from "./Input/DropDown"
 | |
| import Locale from "./i18n/Locale"
 | |
| import BaseUIElement from "./BaseUIElement"
 | |
| import native from "../assets/language_native.json"
 | |
| import language_translations from "../assets/language_translations.json"
 | |
| import { Translation } from "./i18n/Translation"
 | |
| import Lazy from "./Base/Lazy"
 | |
| import Toggle from "./Input/Toggle"
 | |
| import LanguageUtils from "../Utils/LanguageUtils"
 | |
| import { UIEventSource } from "../Logic/UIEventSource"
 | |
| 
 | |
| export default class LanguagePicker extends Toggle {
 | |
|     constructor(languages: string[], assignTo: UIEventSource<string>) {
 | |
|         console.log("Constructing a language pîcker for languages", languages)
 | |
|         if (languages === undefined || languages.length <= 1) {
 | |
|             super(undefined, undefined, undefined)
 | |
|         } else {
 | |
|             const normalPicker = LanguagePicker.dropdownFor(languages, assignTo ?? Locale.language)
 | |
|             const fullPicker = new Lazy(() =>
 | |
|                 LanguagePicker.dropdownFor(allLanguages, assignTo ?? Locale.language)
 | |
|             )
 | |
|             super(fullPicker, normalPicker, Locale.showLinkToWeblate)
 | |
|             const allLanguages: string[] = LanguageUtils.usedLanguagesSorted
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private static dropdownFor(
 | |
|         languages: string[],
 | |
|         assignTo: UIEventSource<string>
 | |
|     ): BaseUIElement {
 | |
|         return new DropDown(
 | |
|             undefined,
 | |
|             languages
 | |
|                 .filter((lang) => lang !== "_context")
 | |
|                 .map((lang) => {
 | |
|                     return { value: lang, shown: LanguagePicker.hybrid(lang) }
 | |
|                 }),
 | |
|             assignTo
 | |
|         )
 | |
|     }
 | |
| 
 | |
|     private static hybrid(lang: string): Translation {
 | |
|         const nativeText = native[lang] ?? lang
 | |
|         const translation = {}
 | |
|         const trans = language_translations[lang]
 | |
|         if (trans === undefined) {
 | |
|             return new Translation({ "*": nativeText })
 | |
|         }
 | |
|         for (const key in trans) {
 | |
|             if (key.startsWith("_")) {
 | |
|                 continue
 | |
|             }
 | |
|             const translationInKey = language_translations[lang][key]
 | |
|             if (nativeText.toLowerCase() === translationInKey.toLowerCase()) {
 | |
|                 translation[key] = nativeText
 | |
|             } else {
 | |
|                 translation[key] = nativeText + " (" + translationInKey + ")"
 | |
|             }
 | |
|         }
 | |
|         return new Translation(translation)
 | |
|     }
 | |
| }
 |