export const LANGUAGE_DEFAULTS = Object.freeze({ pt: "PT", en: "GB", fr: "FR", }); /** * AI thought me this. * * Explanation: * * Each letter in a 2-letter country code is converted to a Regional * Indicator Symbol, which together form the emoji flag. * * 'A'.charCodeAt(0) is 65, and '🇦' starts at 0x1F1E6 → offset of 127397 * (0x1F1A5). * * So 'A' → '🇦', 'B' → '🇧', etc. * * The flags are the combination of those emojis making the country code like * Portugal -> PT. */ export function getFlagEmojiFromLocale(locale: string): string { let countryCode: string | undefined; const parts = locale.split("-"); const lang = parts[0].toLowerCase(); if (parts.length === 2) { countryCode = parts[1].toUpperCase(); } else if (lang in LANGUAGE_DEFAULTS) { countryCode = LANGUAGE_DEFAULTS[lang as keyof typeof LANGUAGE_DEFAULTS]; } if (!countryCode) return ""; return [...countryCode] .map((c) => String.fromCodePoint(c.charCodeAt(0) + 127397)) .join(""); } export function getLanguageNameFromLocale(locale: string): string { try { return new Intl.DisplayNames([locale], { type: "language", fallback: "code", }).of(locale) ?? ""; } catch { return ""; } } export function isValidLocale(locale: string): boolean { try { Intl.getCanonicalLocales(locale); return true; } catch { return false; } }