RSS Git Download  Clone
Raw Blame History 2kB 54 lines
/**
 * Auto-detect the best matching UI language from the browser/system locale.
 * Used by both Angular and React i18n services.
 */

export const AVAILABLE_LANGUAGES = [
    'ar', 'az', 'be', 'bg', 'bn', 'bs', 'cs', 'da', 'de', 'el',
    'en', 'es', 'et', 'fi', 'fil', 'fr', 'he', 'hr', 'hu', 'hy',
    'id', 'it', 'ja', 'ka', 'kk', 'km', 'ko', 'ky', 'lt', 'mk',
    'ms', 'ne', 'nl', 'no', 'pl', 'pt-BR', 'pt-PT', 'ro', 'ru',
    'si', 'sk', 'sl', 'sr', 'sv', 'sw', 'ta', 'tg', 'th', 'tr',
    'uk', 'vi', 'zh-HK', 'zh-TW', 'zn',
];

export function detectLanguageFromLocale(locale: string): string {
    if (!locale) return 'en';
    const raw = locale.trim();
    const lower = raw.toLowerCase();

    // Chinese special cases (must come before generic matching)
    if (lower.startsWith('zh')) {
        if (lower === 'zh-hk') return 'zh-HK';
        if (lower === 'zh-tw' || lower.startsWith('zh-hant')) return 'zh-TW';
        // zh, zh-CN, zh-Hans, zh-SG → simplified Chinese
        return 'zn';
    }

    // Try exact match (case-insensitive against available)
    const exactMatch = AVAILABLE_LANGUAGES.find(l => l.toLowerCase() === lower);
    if (exactMatch) return exactMatch;

    // Try with region (e.g., pt-BR → pt-BR)
    const withRegion = AVAILABLE_LANGUAGES.find(l => l.toLowerCase() === lower.replace('_', '-'));
    if (withRegion) return withRegion;

    // Extract base language (e.g., fr-FR → fr, de-DE → de)
    const base = lower.split('-')[0].split('_')[0];

    // Portuguese without region → pt-PT
    if (base === 'pt') return 'pt-PT';

    // Filipino/Tagalog
    if (base === 'tl') return 'fil';

    // Norwegian variants
    if (base === 'nb' || base === 'nn') return 'no';

    // Try base language match
    const baseMatch = AVAILABLE_LANGUAGES.find(l => l.toLowerCase() === base);
    if (baseMatch) return baseMatch;

    return 'en';
}