@hug/ngx-g11n
Version:
Angular helpers for internationalizing and localizing your application
1 lines • 12.1 kB
Source Map (JSON)
{"version":3,"file":"hug-ngx-g11n-internal.mjs","sources":["../../../projects/lib/internal/models/g11n-debug.enum.ts","../../../projects/lib/internal/main.ts","../../../projects/lib/internal/index.ts","../../../projects/lib/internal/hug-ngx-g11n-internal.ts"],"sourcesContent":["export enum G11nDebug {\n SHOW_KEYS,\n DUMMY_TRANSLATIONS,\n NO_DEBUG\n}\n","/* eslint-disable @typescript-eslint/naming-convention */\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 translationsPath: '/translations',\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 loadTranslationFile = async (filePath: string, debug: G11nDebug = G11nDebug.NO_DEBUG): Promise<void> => {\n const debugMode = (FORCE_DEBUG !== G11nDebug.NO_DEBUG) ? FORCE_DEBUG : debug;\n const response = await fetch(filePath);\n const { translations } = await response.json() as G11nFile;\n if (translations) {\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 => translations[key] = '-');\n }\n loadTranslations(translations);\n } else {\n throw new Error(`[@hug/ngx-g11n] No translations found in file: ${filePath}`);\n }\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 (localeId: string, locales: Record<string, G11nLocale>, options: G11nOptions): 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 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 await loadTranslationFile(`${options.translationsPath}/${localeId}.json`, options.debug);\n }\n};\n\nconst getLocaleToUse = (locales: Record<string, G11nLocale>, options: G11nOptions): string => {\n const localeIsSupported = (id: string): boolean => id in locales;\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 if (localeIsSupported(localeIdFromUrl)) {\n return localeIdFromUrl;\n } else {\n console.warn(`[@hug/ngx-g11n] Locale ${localeIdFromUrl} from url was not found in given locales (will use storage if found)`);\n }\n }\n\n // Priority 2 : storage\n const localeIdFromStorage = options.storage?.getItem(STORAGE_KEY);\n if (localeIdFromStorage) {\n if (localeIsSupported(localeIdFromStorage)) {\n return localeIdFromStorage;\n } else {\n console.warn(`[@hug/ngx-g11n] Locale ${localeIdFromStorage} from storage was not found in given locales (will use navigator if enabled)`);\n }\n }\n\n // Priority 3 : browser\n if (options.useNavigatorLanguage) {\n if (localeIsSupported(navigator.language)) {\n return navigator.language;\n } else {\n console.warn(`[@hug/ngx-g11n] Locale ${navigator.language} from browser was not found in given locales (will use default setting)`);\n }\n }\n\n // Priority 4 : default setting\n if (options.defaultLanguage && localeIsSupported(options.defaultLanguage)) {\n return options.defaultLanguage;\n }\n\n throw new Error(`[@hug/ngx-g11n] Locale ${options.defaultLanguage} was not found in given locales`);\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 * @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 * @internal\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 provide: APP_INITIALIZER,\n useFactory: (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","/* eslint-disable @typescript-eslint/naming-convention */\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 {\n type DefaultModuleImport,\n type G11nLocale,\n type G11nOptions,\n type G11nFeature,\n G11nDebug\n} from './models';\n\nexport { currentLanguage, setLanguage, init, DEFAULT_OPTIONS } from './main';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}