{"version":3,"file":"hug-ngx-g11n-internal.mjs","names":[],"sources":["../../../projects/lib/internal/models/g11n-debug.enum.ts","../../../projects/lib/internal/main.ts","../../../projects/lib/internal/index.ts"],"sourcesContent":["export enum G11nDebug {\n    SHOW_KEYS,\n    DUMMY_TRANSLATIONS,\n    NO_DEBUG,\n}\n","/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { registerLocaleData } from '@angular/common';\nimport { APP_INITIALIZER, DEFAULT_CURRENCY_CODE, inject, LOCALE_ID, type Provider } from '@angular/core';\nimport { loadTranslations } from '@angular/localize';\n\nimport { G11N_OPTIONS, LOCALES } from '.';\nimport { G11nDebug, type G11nFile, type G11nLocale, type G11nOptions } from './models';\n\nconst STORAGE_KEY = 'hug-ngx-g11n:lang';\nlet QUERY_PARAM_NAME = 'lang';\nlet FORCE_DEBUG = G11nDebug.NO_DEBUG;\n\n/**\n * @internal\n */\nexport const DEFAULT_OPTIONS: G11nOptions = {\n    defaultLanguage: 'fr-CH',\n    defaultCurrency: 'CHF',\n    useNavigatorLanguage: true,\n    loadLocaleExtra: false,\n    useTranslations: true,\n    rootTranslationsPath: 'translations',\n    translationScopes: [],\n    queryParamName: QUERY_PARAM_NAME,\n    storage: localStorage,\n    debug: G11nDebug.NO_DEBUG,\n};\n\n// ---\n\nexport const currentLanguage = (): string => inject(LOCALE_ID);\n\nexport const setLanguage = (value: string): void => {\n    refreshUrl(value);\n    location.reload();\n};\n\n// --- HELPER(s) ---\n\nconst loadTranslationFiles = async (\n    rootTranslationsPath: string,\n    translationScopes: string[],\n    filename: string,\n    debug: G11nDebug = G11nDebug.NO_DEBUG,\n): Promise<void> => {\n    const debugMode = FORCE_DEBUG !== G11nDebug.NO_DEBUG ? FORCE_DEBUG : debug;\n    const translations: Record<string, string> = {};\n\n    // eslint-disable-next-line no-loops/no-loops\n    for (const scope of [...translationScopes, '']) {\n        const filePath = scope ? `${rootTranslationsPath}/${scope}/${filename}` : `${rootTranslationsPath}/${filename}`;\n        try {\n            const response = await fetch(filePath);\n            if (response.status === 200) {\n                const data = (await response.json()) as G11nFile | Record<string, undefined>;\n                if (data.translations) {\n                    Object.assign(translations, data.translations);\n                } else {\n                    console.warn(`[@hug/ngx-g11n] No translations found in file: ${filePath}`);\n                }\n            }\n        } catch (error) {\n            console.error(`[@hug/ngx-g11n] Could not load translation file: ${filePath}`);\n            console.error(error);\n        }\n    }\n\n    if (debugMode === G11nDebug.SHOW_KEYS) {\n        Object.entries(translations).forEach(([key, value]) => {\n            translations[key] = `${value} (@${key})`;\n        });\n    } else if (debugMode === G11nDebug.DUMMY_TRANSLATIONS) {\n        Object.keys(translations).forEach(key => {\n            translations[key] = '-';\n        });\n    }\n\n    loadTranslations(translations);\n};\n\nconst refreshUrl = (localeId: string): void => {\n    const newUrl = new URL(location.href);\n    newUrl.searchParams.set(QUERY_PARAM_NAME, localeId);\n    history.pushState({}, '', newUrl); // update URL without reload\n};\n\nconst loadLanguage = async (\n    localeId: string,\n    locales: Record<string, G11nLocale>,\n    options: G11nOptions,\n): Promise<void> => {\n    // Sync language\n    document.documentElement.lang = localeId;\n    options.storage?.setItem(STORAGE_KEY, localeId);\n    refreshUrl(localeId);\n\n    // Register locale data\n    const locale = locales[localeId];\n    const language = new Intl.Locale(localeId).language;\n    const localeBase = (await locale.base()).default;\n    const localeExtra = options.loadLocaleExtra && locale.extra ? (await locale.extra()).default : undefined;\n    registerLocaleData(localeBase, localeId, localeExtra);\n\n    // Load translations\n    if (options.useTranslations) {\n        const filename = locale.translationFilename ?? `${language}.json`;\n        await loadTranslationFiles(options.rootTranslationsPath!, options.translationScopes ?? [], filename, options.debug);\n    }\n};\n\nconst getLocaleToUse = (locales: Record<string, G11nLocale>, options: G11nOptions): string => {\n    const getSupportedLocaleId = (localeId: string): string | undefined => {\n        // Priority 1: exact match\n        if (localeId in locales) {\n            return localeId;\n        }\n        // Priority 2: match on base language only\n        const locale = new Intl.Locale(localeId);\n        if (locale.language in locales) {\n            console.warn(\n                `[@hug/ngx-g11n] Locale \"${localeId}\" was not found in given locales (will use \"${locale.language}\" instead)`,\n            );\n            return locale.language;\n        }\n        // Priority 3: match on base language with any region\n        const matchedLocale = Object.keys(locales).find(key => new Intl.Locale(key).language === locale.language);\n        if (matchedLocale) {\n            console.warn(\n                `[@hug/ngx-g11n] Locale \"${localeId}\" was not found in given locales (will use \"${matchedLocale}\" instead)`,\n            );\n            return matchedLocale;\n        }\n        return undefined;\n    };\n\n    /**\n     * Initialize query param name\n     * We do it here as getLocaleToUse is called first in the injection tree (cf. provide: LOCALE_ID)\n     */\n    initQueryParamName(options);\n\n    // Priority 1: query param\n    const localeIdFromUrl = new URL(location.href).searchParams.get(QUERY_PARAM_NAME);\n    if (localeIdFromUrl) {\n        if (localeIdFromUrl === 'keys') {\n            FORCE_DEBUG = G11nDebug.SHOW_KEYS;\n        } else if (localeIdFromUrl === 'dummy') {\n            FORCE_DEBUG = G11nDebug.DUMMY_TRANSLATIONS;\n        } else {\n            const supportedLocaleId = getSupportedLocaleId(localeIdFromUrl);\n            if (supportedLocaleId) {\n                return supportedLocaleId;\n            } else {\n                console.warn(\n                    `[@hug/ngx-g11n] Locale \"${localeIdFromUrl}\" from url was not found in given locales (will use storage if found)`,\n                );\n            }\n        }\n    }\n\n    // Priority 2: storage\n    const localeIdFromStorage = options.storage?.getItem(STORAGE_KEY);\n    if (localeIdFromStorage) {\n        const supportedLocaleId = getSupportedLocaleId(localeIdFromStorage);\n        if (supportedLocaleId) {\n            return supportedLocaleId;\n        } else {\n            console.warn(\n                `[@hug/ngx-g11n] Locale \"${localeIdFromStorage}\" from storage was not found in given locales (will use navigator if enabled)`,\n            );\n        }\n    }\n\n    // Priority 3: browser\n    if (options.useNavigatorLanguage) {\n        const supportedLocaleId = getSupportedLocaleId(navigator.language);\n        if (supportedLocaleId) {\n            return supportedLocaleId;\n        } else {\n            console.warn(\n                `[@hug/ngx-g11n] Locale \"${navigator.language}\" from browser was not found in given locales (will use default setting)`,\n            );\n        }\n    }\n\n    // Priority 4: user's setting\n    if (options.defaultLanguage) {\n        const supportedLocaleId = getSupportedLocaleId(options.defaultLanguage);\n        if (supportedLocaleId) {\n            return supportedLocaleId;\n        } else {\n            console.warn(\n                `[@hug/ngx-g11n] Locale \"${options.defaultLanguage}\" from user's setting was not found in given locales`,\n            );\n        }\n    }\n\n    throw new Error('[@hug/ngx-g11n] No provided locale was found');\n};\n\n/**\n * We have to determine the query param name and export it globally as it will be used by the refreshUrl function, which\n * do not have access to the option object. We also have to support case-insensitive cases (ex: lang, Lang, LANG, etc.).\n * @param options The G11N options.\n * @internal\n */\nconst initQueryParamName = (options: G11nOptions): void => {\n    let value = options.queryParamName ?? DEFAULT_OPTIONS.queryParamName!;\n    // eslint-disable-next-line no-loops/no-loops\n    for (const key of new URL(location.href).searchParams.keys()) {\n        if (key.toLowerCase() === value.toLowerCase()) {\n            value = key;\n        }\n    }\n    QUERY_PARAM_NAME = value;\n};\n\n/**\n * Initializes G11N providers.\n * @internal\n * @returns An array of Angular providers for G11N initialization.\n */\nexport const init = (): Provider[] => [\n    {\n        provide: G11N_OPTIONS,\n        useValue: DEFAULT_OPTIONS,\n    },\n    {\n        provide: LOCALE_ID,\n        useFactory: getLocaleToUse,\n        deps: [LOCALES, G11N_OPTIONS],\n    },\n    {\n        provide: DEFAULT_CURRENCY_CODE,\n        useFactory: (options: G11nOptions) => options.defaultCurrency ?? DEFAULT_OPTIONS.defaultCurrency,\n        deps: [G11N_OPTIONS],\n    },\n    {\n        // eslint-disable-next-line @typescript-eslint/no-deprecated\n        provide: APP_INITIALIZER,\n        useFactory:\n            (localeId: string, locales: Record<string, G11nLocale>, options: G11nOptions) =>\n                async (): Promise<void> => {\n                    await loadLanguage(localeId, locales, options);\n                },\n        deps: [LOCALE_ID, LOCALES, G11N_OPTIONS],\n        multi: true,\n    },\n];\n","\nimport { InjectionToken } from '@angular/core';\n\nimport type { G11nLocale, G11nOptions } from './models';\n\nexport const LOCALES = new InjectionToken<Record<string, G11nLocale>>('LOCALES');\nexport const G11N_OPTIONS = new InjectionToken<G11nOptions>('G11N_OPTIONS');\n\nexport { currentLanguage, DEFAULT_OPTIONS, init, setLanguage } from './main';\nexport {\n    type DefaultModuleImport,\n    G11nDebug,\n    type G11nFeature,\n    type G11nLocale,\n    type G11nOptions,\n} from './models';\n"],"mappings":"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"}