UNPKG

@hug/ngx-g11n

Version:

Angular helpers for internationalizing and localizing your application

1 lines 15 kB
{"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/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 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 if (response.status === 200) {\n const { translations } = (await response.json()) as G11nFile | Record<string, undefined>;\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 => {\n translations[key] = '-';\n });\n }\n loadTranslations(translations);\n } else {\n throw new Error(`[@hug/ngx-g11n] No translations found in file: ${filePath}`);\n }\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 (\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 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 ?? `${localeId}.json`;\n await loadTranslationFile(`${options.translationsPath!}/${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","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}