57 lines
No EOL
2.1 KiB
TypeScript
57 lines
No EOL
2.1 KiB
TypeScript
import {DropDown} from "./Input/DropDown";
|
|
import Locale from "./i18n/Locale";
|
|
import BaseUIElement from "./BaseUIElement";
|
|
import * as native from "../assets/language_native.json"
|
|
import * as language_translations from "../assets/language_translations.json"
|
|
import {Translation} from "./i18n/Translation";
|
|
import * as used_languages from "../assets/generated/used_languages.json"
|
|
import Lazy from "./Base/Lazy";
|
|
import Toggle from "./Input/Toggle";
|
|
|
|
export default class LanguagePicker {
|
|
|
|
|
|
public static CreateLanguagePicker(
|
|
languages: string[],
|
|
label: string | BaseUIElement = "") : BaseUIElement{
|
|
|
|
if (languages === undefined || languages.length <= 1) {
|
|
return undefined;
|
|
}
|
|
|
|
const allLanguages : string[] = used_languages.languages;
|
|
|
|
const normalPicker = LanguagePicker.dropdownFor(languages, label);
|
|
const fullPicker = new Lazy(() => LanguagePicker.dropdownFor(allLanguages, label))
|
|
return new Toggle(fullPicker, normalPicker, Locale.showLinkToWeblate)
|
|
}
|
|
|
|
private static dropdownFor(languages: string[], label: string | BaseUIElement): BaseUIElement {
|
|
return new DropDown(label, languages.map(lang => {
|
|
return {value: lang, shown: LanguagePicker.hybrid(lang) }
|
|
}
|
|
), Locale.language)
|
|
}
|
|
|
|
private static hybrid(lang: string): Translation {
|
|
const nativeText = native[lang] ?? lang
|
|
const allTranslations = (language_translations["default"] ?? language_translations)
|
|
const translation = {}
|
|
const trans = allTranslations[lang]
|
|
if(trans === undefined){
|
|
return new Translation({"*": nativeText})
|
|
}
|
|
for (const key in trans) {
|
|
const translationInKey = allTranslations[lang][key]
|
|
if(nativeText.toLowerCase() === translationInKey.toLowerCase()){
|
|
translation[key] = nativeText
|
|
}else{
|
|
translation[key] = nativeText + " ("+translationInKey+")"
|
|
}
|
|
|
|
}
|
|
return new Translation(translation)
|
|
}
|
|
|
|
|
|
} |