import { Check } from "@styled-icons/boxicons-regular"; import { observer } from "mobx-react-lite"; import styles from "./Panes.module.scss"; import { Text } from "preact-i18n"; import { useMemo } from "preact/hooks"; import { Checkbox } from "@revoltchat/ui"; import { useApplicationState } from "../../../mobx/State"; import britannyFlagSVG from "../assets/flags/brittany.svg"; import enchantingTableWEBP from "../assets/flags/enchanting_table.webp"; import esperantoFlagSVG from "../assets/flags/esperanto.svg"; import kurdistanFlagSVG from "../assets/flags/kurdistan.svg"; import tamilFlagPNG from "../assets/flags/tamil_nadu.png"; import tokiponaSVG from "../assets/flags/toki_pona.svg"; import venetoFlagSVG from "../assets/flags/veneto.svg"; import { Language, LanguageEntry, Languages as Langs, } from "../../../../external/lang/Languages"; import Emoji from "../../../components/common/Emoji"; import Tip from "../../../components/ui/Tip"; type Key = [Language, LanguageEntry]; interface Props { entry: Key; selected: boolean; onSelect: () => void; } /** * Component providing individual language entries. * @param param0 Entry data */ function Entry({ entry: [x, lang], selected, onSelect }: Props) { return (
{lang.i18n === "vec" ? ( ) : lang.i18n === "br" ? ( ) : lang.i18n === "ckb" ? ( ) : lang.i18n === "eo" ? ( ) : lang.i18n === "ta" ? ( ) : lang.emoji === "🙂" ? ( ) : lang.emoji === "🪄" ? ( ) : ( )}
{lang.display} {lang.verified && } } /> ); } /** * Component providing the language selection menu. */ export const Languages = observer(() => { const locale = useApplicationState().locale; const language = locale.getLanguage(); // Generate languages array. const languages = useMemo(() => { const languages = Object.keys(Langs).map((x) => [ x, Langs[x as keyof typeof Langs], ]) as Key[]; // Get the user's system language. Check for exact // matches first, otherwise check for partial matches const preferredLanguage = navigator.languages.filter((lang) => languages.find((l) => l[0].replace(/_/g, "-") == lang), )?.[0] || navigator.languages ?.map((x) => x.split("-")[0]) ?.filter((lang) => languages.find((l) => l[0] == lang))?.[0] ?.split("-")[0]; if (preferredLanguage) { // This moves the user's system language to the top of the language list const prefLangKey = languages.find( (lang) => lang[0].replace(/_/g, "-") == preferredLanguage, ); if (prefLangKey) { languages.splice( 0, 0, languages.splice(languages.indexOf(prefLangKey), 1)[0], ); } } return languages; }, []); // Creates entries with given key. const EntryFactory = ([x, lang]: Key) => ( locale.setLanguage(x)} /> ); return (

{languages.filter(([, lang]) => !lang.cat).map(EntryFactory)}

{languages .filter(([, lang]) => lang.cat === "const") .map(EntryFactory)}

{languages .filter(([, lang]) => lang.cat === "alt") .map(EntryFactory)}
{" "}
); });