mapcomplete/UI/LanguagePicker.ts

59 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 extends Toggle {
constructor(languages: string[],
label: string | 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))
super(fullPicker, normalPicker, Locale.showLinkToWeblate);
}
private static dropdownFor(languages: string[], label: string | BaseUIElement): BaseUIElement {
return new DropDown(label, languages
.filter(lang => lang !== "_context")
.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)
}
}