{"version":3,"sources":["common/appContext/i18n.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,YAAY,kDAAkD,CAAC;AAE5E,eAAO,MAAM,SAAS,2BAA2B,CAAC;AAElD;;;GAGG;AACH,wBAAgB,SAAS,WAOxB;AAoBD;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,OAAO,KAAA,EAAE,mBAAmB,GAAE,MAAM,EAAO,QAqEpE;AAED,wBAAgB,OAAO,iBAMtB","file":"../../../common/appContext/i18n.d.ts","sourcesContent":["import { Provider, singletonProvider } from '../provider.js';\nimport AppContext, { ConfigEntry, getTools } from './appContext.js';\nimport { aliasName as logKey, Logger } from './logging.js';\nimport { aliasName as loaderAlias, SimpleLoader } from './simpleLoader.js';\n\nexport const providerName = 'driver/littleware/little-elements/common/i18n';\n\nexport const configKey = 'config/littleware/i18n';\n\n/**\n * See https://stackoverflow.com/questions/25606730/get-current-locale-of-chrome,\n *   https://developer.mozilla.org/en-US/docs/Web/API/NavigatorLanguage/languages\n */\nexport function getLocale() {\n  if (typeof navigator !== 'undefined') {\n    return navigator.languages\n      ? navigator.languages[0]\n      : navigator.language;\n  }\n  return 'en';\n}\n\nconst toolKeys = {\n  config: configKey,\n  loader: loaderAlias,\n  logger: logKey,\n};\n\ninterface Config {\n  locale: string;\n  debug: boolean;\n  resourceFolders: string[];\n}\n\ninterface Tools {\n  loader: SimpleLoader;\n  config: ConfigEntry;\n  logger: Logger;\n}\n\n/**\n * Configure i18next provider -\n * i18next is imported differently depending on if\n * environment is server side or browser side\n *\n * @param i18next\n */\nexport function configure(i18next, baseResourceFolders: string[] = []) {\n  AppContext.get().then(\n    async (cx) => {\n      cx.putProvider(providerName, toolKeys,\n        (toolBox) => singletonProvider(\n          async () => {\n            const tools = await getTools(toolBox) as Tools;\n            const configEntry: ConfigEntry = tools.config;\n\n            const config = {\n              ...{\n                debug: false,\n                locale: getLocale(),\n                resourceFolders: baseResourceFolders,\n              },\n              ...configEntry.defaults,\n              ...configEntry.overrides,\n            } as Config;\n\n            const lang = (config.locale || 'en').replace(/-.+$/, '');\n\n            return i18next.init({ lng: config.locale }).then(\n              () => {\n                const loader = tools.loader as SimpleLoader;\n                tools.logger.trace(`Loading i18n resources: ${config.resourceFolders.join(', ')}`);\n                const loadPaths = config.resourceFolders.reduce(\n                  (acc, it) => {\n                    acc.push(`${it}/${lang}.json`);\n                    if (lang !== 'en') {\n                      // load en as a fallback\n                      acc.push(`${it}/${lang}.json`);\n                    }\n                    return acc;\n                  }, [],\n                );\n                return Promise.all(\n                  loadPaths.map(\n                    (path) => loader.loadConfig(path).catch(\n                      () => {\n                        tools.logger.trace(`failed to load i18n resources from ${path}`);\n                        return {};\n                      },\n                    ),\n                  ),\n                );\n              },\n            ).then(\n              (resourceList: any[]) => Promise.all(\n                resourceList.map(\n                  (bundle) => Promise.all(\n                    Object.keys(bundle).map(\n                      (namespace) =>\n                      // eslint-disable-next-line\n                        i18next.addResourceBundle(lang, namespace, bundle[namespace], true, true),\n                    ),\n                  ),\n                ),\n              ),\n            ).then(\n              () => i18next,\n            )\n              .catch(\n                () => i18next,\n              );\n          },\n        ), // end singletonprovider\n      ); // end putprovider\n    },\n  );\n}\n\nexport function getI18n() {\n  return AppContext.get().then(\n    (cx) => cx.getProvider(providerName),\n  ).then(\n    (provider: Provider<any>) => provider.get(),\n  );\n}\n"]}