@asafarim/shared-i18n 0.5.2 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/README.md +170 -168
  2. package/demo/index.html +13 -0
  3. package/demo/node_modules/.bin/tsc +21 -0
  4. package/demo/node_modules/.bin/tsserver +21 -0
  5. package/demo/node_modules/.bin/vite +21 -0
  6. package/demo/package.json +24 -0
  7. package/demo/public/favicon.svg +4 -0
  8. package/demo/public/logo.svg +24 -0
  9. package/demo/src/App.tsx +112 -0
  10. package/demo/src/components/GetStartedSection.tsx +56 -0
  11. package/demo/src/components/KeyTable.tsx +29 -0
  12. package/demo/src/components/LanguageBar.tsx +19 -0
  13. package/demo/src/components/LanguageSwitcherDemo.module.css +113 -0
  14. package/demo/src/components/LanguageSwitcherDemo.tsx +184 -0
  15. package/demo/src/components/OverviewSection.tsx +43 -0
  16. package/demo/src/components/Panel.tsx +15 -0
  17. package/demo/src/components/StatusCard.tsx +109 -0
  18. package/demo/src/index.css +569 -0
  19. package/demo/src/locales/en/demo.json +85 -0
  20. package/demo/src/locales/fr/demo.json +85 -0
  21. package/demo/src/locales/nl/demo.json +85 -0
  22. package/demo/src/main.tsx +24 -0
  23. package/demo/tsconfig.json +18 -0
  24. package/demo/tsconfig.node.json +10 -0
  25. package/demo/vite-env.d.ts +7 -0
  26. package/demo/vite.config.ts +11 -0
  27. package/dist/components/LanguageSwitcher.d.ts +20 -0
  28. package/dist/components/LanguageSwitcher.d.ts.map +1 -0
  29. package/dist/components/LanguageSwitcher.js +72 -0
  30. package/dist/components/LanguageSwitcher.module.css +205 -0
  31. package/dist/config/i18n.d.ts +46 -0
  32. package/dist/config/i18n.d.ts.map +1 -0
  33. package/dist/config/i18n.js +66 -0
  34. package/dist/hooks/useLanguage.d.ts +12 -0
  35. package/dist/hooks/useLanguage.d.ts.map +1 -0
  36. package/dist/hooks/useLanguage.js +61 -0
  37. package/dist/index.d.ts +9 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +10 -0
  40. package/dist/locales/en/common.json +68 -0
  41. package/{locales → dist/locales}/en/identity-portal.json +69 -69
  42. package/dist/locales/nl/common.json +68 -0
  43. package/{locales → dist/locales}/nl/identity-portal.json +69 -69
  44. package/dist/tsconfig.tsbuildinfo +1 -0
  45. package/dist/utils/languageIcons.d.ts +4 -0
  46. package/dist/utils/languageIcons.d.ts.map +1 -0
  47. package/dist/utils/languageIcons.js +12 -0
  48. package/dist/utils/languageUtils.d.ts +45 -0
  49. package/dist/utils/languageUtils.d.ts.map +1 -0
  50. package/dist/utils/languageUtils.js +144 -0
  51. package/package.json +34 -22
  52. package/LICENSE +0 -23
  53. package/config/i18n.ts +0 -89
  54. package/hooks/useLanguage.ts +0 -80
  55. package/index.ts +0 -21
  56. package/locales/en/common.json +0 -66
  57. package/locales/en/web.json +0 -343
  58. package/locales/nl/common.json +0 -66
  59. package/locales/nl/web.json +0 -343
  60. package/tsconfig.json +0 -32
  61. package/utils/languageUtils.ts +0 -141
@@ -0,0 +1 @@
1
+ {"fileNames":["../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es5.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2016.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.dom.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.disposable.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.float16.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.decorators.d.ts","../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../node_modules/.pnpm/@types+react@19.2.7/node_modules/@types/react/global.d.ts","../node_modules/.pnpm/csstype@3.2.3/node_modules/csstype/index.d.ts","../node_modules/.pnpm/@types+react@19.2.7/node_modules/@types/react/index.d.ts","../node_modules/.pnpm/@types+react@19.2.7/node_modules/@types/react/jsx-runtime.d.ts","../node_modules/.pnpm/i18next@23.16.8/node_modules/i18next/typescript/helpers.d.ts","../node_modules/.pnpm/i18next@23.16.8/node_modules/i18next/typescript/options.d.ts","../node_modules/.pnpm/i18next@23.16.8/node_modules/i18next/typescript/t.d.ts","../node_modules/.pnpm/i18next@23.16.8/node_modules/i18next/index.d.ts","../node_modules/.pnpm/i18next@23.16.8/node_modules/i18next/index.d.mts","../node_modules/.pnpm/react-i18next@13.5.0_i18next@23.16.8_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/react-i18next/helpers.d.ts","../node_modules/.pnpm/react-i18next@13.5.0_i18next@23.16.8_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/react-i18next/TransWithoutContext.d.ts","../node_modules/.pnpm/react-i18next@13.5.0_i18next@23.16.8_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/react-i18next/initReactI18next.d.ts","../node_modules/.pnpm/react-i18next@13.5.0_i18next@23.16.8_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/react-i18next/index.d.ts","../node_modules/.pnpm/react-i18next@13.5.0_i18next@23.16.8_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/react-i18next/index.d.mts","../node_modules/.pnpm/i18next-browser-languagedetector@7.2.2/node_modules/i18next-browser-languagedetector/index.d.ts","../node_modules/.pnpm/i18next-browser-languagedetector@7.2.2/node_modules/i18next-browser-languagedetector/index.d.mts","../locales/en/common.json","../locales/nl/common.json","../locales/en/identity-portal.json","../locales/nl/identity-portal.json","../config/i18n.ts","../utils/languageUtils.ts","../hooks/useLanguage.ts","../utils/languageIcons.ts","../components/LanguageSwitcher.tsx","../index.ts","../src/types/css.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/compatibility/iterators.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/globals.typedarray.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/buffer.buffer.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/globals.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/web-globals/abortcontroller.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/web-globals/crypto.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/web-globals/domexception.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/web-globals/events.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/utility.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/header.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/readable.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/fetch.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/formdata.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/connector.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/client-stats.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/client.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/errors.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/dispatcher.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/global-dispatcher.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/global-origin.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/pool-stats.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/pool.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/handlers.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/balanced-pool.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/h2c-client.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/agent.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/mock-interceptor.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/mock-call-history.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/mock-agent.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/mock-client.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/mock-pool.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/snapshot-agent.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/mock-errors.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/proxy-agent.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/env-http-proxy-agent.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/retry-handler.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/retry-agent.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/api.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/cache-interceptor.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/interceptors.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/util.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/cookies.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/patch.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/websocket.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/eventsource.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/diagnostics-channel.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/content-type.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/cache.d.ts","../node_modules/.pnpm/undici-types@7.16.0/node_modules/undici-types/index.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/web-globals/fetch.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/web-globals/navigator.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/web-globals/storage.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/web-globals/streams.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/assert.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/assert/strict.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/async_hooks.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/buffer.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/child_process.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/cluster.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/console.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/constants.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/crypto.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/dgram.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/diagnostics_channel.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/dns.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/dns/promises.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/domain.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/events.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/fs.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/fs/promises.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/http.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/http2.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/https.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/inspector.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/inspector.generated.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/module.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/net.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/os.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/path.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/perf_hooks.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/process.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/punycode.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/querystring.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/readline.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/readline/promises.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/repl.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/sea.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/sqlite.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/stream.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/stream/promises.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/stream/consumers.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/stream/web.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/string_decoder.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/test.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/timers.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/timers/promises.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/tls.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/trace_events.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/tty.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/url.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/util.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/v8.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/vm.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/wasi.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/worker_threads.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/zlib.d.ts","../node_modules/.pnpm/@types+node@24.10.4/node_modules/@types/node/index.d.ts","../node_modules/.pnpm/@types+react-dom@19.2.3_@types+react@19.2.7/node_modules/@types/react-dom/index.d.ts"],"fileIdsList":[[52,53,70,72,73,76,79,133,150,151],[53,58,62,63,64,65,66,67,68,69,79,133,150,151],[52,53,63,70,71,79,133,150,151],[53,63,70,71,72,74,79,133,150,151],[53,79,133,150,151],[79,130,131,133,150,151],[79,132,133,150,151],[133,150,151],[79,133,138,150,151,168],[79,133,134,139,144,150,151,153,165,176],[79,133,134,135,144,150,151,153],[79,133,150,151],[79,133,136,150,151,177],[79,133,137,138,145,150,151,154],[79,133,138,150,151,165,173],[79,133,139,141,144,150,151,153],[79,132,133,140,150,151],[79,133,141,142,150,151],[79,133,143,144,150,151],[79,132,133,144,150,151],[79,133,144,145,146,150,151,165,176],[79,133,144,145,146,150,151,160,165,168],[79,125,133,141,144,147,150,151,153,165,176],[79,133,144,145,147,148,150,151,153,165,173,176],[79,133,147,149,150,151,165,173,176],[77,78,79,80,81,82,83,84,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182],[79,133,144,150,151],[79,133,150,151,152,176],[79,133,141,144,150,151,153,165],[79,133,150,151,154],[79,133,150,151,155],[79,132,133,150,151,156],[79,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182],[79,133,150,151,158],[79,133,150,151,159],[79,133,144,150,151,160,161],[79,133,150,151,160,162,177,179],[79,133,145,150,151],[79,133,144,150,151,165,166,168],[79,133,150,151,167,168],[79,133,150,151,165,166],[79,133,150,151,168],[79,133,150,151,169],[79,130,133,150,151,165,170],[79,133,144,150,151,171,172],[79,133,150,151,171,172],[79,133,138,150,151,153,165,173],[79,133,150,151,174],[79,133,150,151,153,175],[79,133,147,150,151,159,176],[79,133,138,150,151,177],[79,133,150,151,165,178],[79,133,150,151,152,179],[79,133,150,151,180],[79,133,138,150,151],[79,125,133,150,151],[79,133,150,151,181],[79,125,133,144,146,150,151,156,165,168,176,178,179,181],[79,133,150,151,165,182],[52,62,79,133,150,151],[50,51,79,133,150,151],[52,79,133,150,151],[64,79,133,150,151],[58,62,64,79,133,150,151],[54,55,56,57,79,133,150,151],[54,55,56,79,133,150,151],[54,79,133,150,151],[54,55,79,133,150,151],[52,58,62,64,79,133,150,151],[62,79,133,150,151],[52,58,59,60,61,62,64,79,133,150,151,184],[79,91,94,97,98,133,150,151,176],[79,94,133,150,151,165,176],[79,94,98,133,150,151,176],[79,133,150,151,165],[79,88,133,150,151],[79,92,133,150,151],[79,90,91,94,133,150,151,176],[79,133,150,151,153,173],[79,133,150,151,183],[79,88,133,150,151,183],[79,90,94,133,150,151,153,176],[79,85,86,87,89,93,133,144,150,151,165,176],[79,94,102,110,133,150,151],[79,86,92,133,150,151],[79,94,119,120,133,150,151],[79,86,89,94,133,150,151,168,176,183],[79,94,133,150,151],[79,90,94,133,150,151,176],[79,85,133,150,151],[79,88,89,90,92,93,94,95,96,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,120,121,122,123,124,133,150,151],[79,94,112,115,133,141,150,151],[79,94,102,103,104,133,150,151],[79,92,94,103,105,133,150,151],[79,93,133,150,151],[79,86,88,94,133,150,151],[79,94,98,103,105,133,150,151],[79,98,133,150,151],[79,92,94,97,133,150,151,176],[79,86,90,94,102,133,150,151],[79,94,112,133,150,151],[79,105,133,150,151],[79,88,94,119,133,150,151,168,181,183],[53,70,79,133,150,151]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"07f073f19d67f74d732b1adea08e1dc66b1b58d77cb5b43931dee3d798a2fd53","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"4245fee526a7d1754529d19227ecbf3be066ff79ebb6a380d78e41648f2f224d","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"170d4db14678c68178ee8a3d5a990d5afb759ecb6ec44dbd885c50f6da6204f6","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"5e76305d58bcdc924ff2bf14f6a9dc2aa5441ed06464b7e7bd039e611d66a89b","impliedFormat":1},{"version":"42c169fb8c2d42f4f668c624a9a11e719d5d07dacbebb63cbcf7ef365b0a75b3","impliedFormat":1},{"version":"e30accdbef6f904f20354b6f598d7f2f7ff29094fc5410c33f63b29b4832172a","impliedFormat":1},{"version":"5fd2267cea69c19286f0e90a9ba78c0e19c3782ab2580bfc2f5678c5326fb78a","impliedFormat":1},{"version":"2a628d887712c299dd78731d2e18e5d456ac03fb258b8e39f61b2478b02481ee","impliedFormat":1},{"version":"b1e5f3a55aa219247976db1b0c6af31d07673e8085197aef925f25ca08fe12c4","impliedFormat":1},{"version":"e9f80c5934982b97886eadab6684c073344a588d1758b12fba2d0184e6f450a2","impliedFormat":99},{"version":"890bdcec61a6fe8e39e35a1a9e4e0cad8c99b371646077bed13724862c4ab711","impliedFormat":1},{"version":"050b7f98587a05615f63589c36a4957093817477bc14140a977b76e0ba12417a","impliedFormat":1},{"version":"b3e571e9f098c30db463d30d16d395ad8dd2457ee6e8d1561e2e1527bc2b6ce0","impliedFormat":1},{"version":"e156f435d68d70a07b92a0c26c05cfd1e9472073b73a0269a33ffb92f83722b0","affectsGlobalScope":true,"impliedFormat":1},{"version":"a7661d2413b60a722b7d7ff8e52dd3efad86600553eba1c88c990a0b2c11870b","impliedFormat":99},{"version":"055d2177aa4ec7e23415119ed27410bd2f7458b75886ed222835d6cb5264061c","impliedFormat":1},{"version":"bc9a11927ced39797acd3fa50bee8163685417d846800abbdbdec42824986108","impliedFormat":99},"07f12f31bee1d3ae67b92b54e173fdc7d993ca32f789d8d2b51d5c1683e05021","4f1110bbbc2be02e3baa4984f1c07fde585b06126950816ef13d9684429ae0c3","8711a44607e941eb27e381380e73de3c02acfb83a31df6fedacd065e92acc07b","a5567dbc00050a1634859c239871ae0a980b8425151e7d26db73242a62c8c6b6",{"version":"93db0c5cec1bacccba889f3b5afe5f8a4d1fcf3ae1cc06237a08081f5a914305","signature":"168308f94ae0f9196f7688aeea325da52e7a072004c21e81f5f0dac85199287e"},{"version":"60a3e51ba9e8176bbca845de40a2797ceef92d54f547a5e93ad915fc2ed899c1","signature":"f5639510968d03034aa0d731ebf6774dc15c3f3bc8a24b9d872bed9f14a6692f"},{"version":"419a6bd1ec109df5e89ac7efc58c311668f94e3a0a65fb1a0e95f35a465827e7","signature":"9eead6e50958b206718b63397bb3df4491cfbac4891b2b7df9b35b2aa0e766e3"},{"version":"e2b84ff544830f6a288eb29b6eb0a329f46d69838597721d2812f7397e3647d2","signature":"9d61f768697b8c8e32699942778fac71a4137b2370a3c5f1c94ea6bc8074c9f1"},{"version":"29be1703f4d445cc9c8ce338a7fbcdfb088fb78e5173205aacb3d4f7069f9d99","signature":"5ac9500f6281067fd0478cb6247b4716a2de1380f7b89c4a6c7910f95fc42ee8"},{"version":"cc9d06d11107b8c8643073087601cea46adf43ff82c0a9396b44fbe095c07274","signature":"4fee688d89cf2375919c769c95a397aa73cbf9c9cfc4f85bbc1154f1a5891453"},"1d9faf540cc286f2ddf8e62708c78d968500acc12be31048184bed5d56be3da0",{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"378281aa35786c27d5811af7e6bcaa492eebd0c7013d48137c35bbc69a2b9751","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"1b2dd1cbeb0cc6ae20795958ba5950395ebb2849b7c8326853dd15530c77ab0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"387a023d363f755eb63450a66c28b14cdd7bc30a104565e2dbf0a8988bb4a56c","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"487b694c3de27ddf4ad107d4007ad304d29effccf9800c8ae23c2093638d906a","impliedFormat":1},{"version":"3a80bc85f38526ca3b08007ee80712e7bb0601df178b23fbf0bf87036fce40ce","impliedFormat":1},{"version":"ccf4552357ce3c159ef75f0f0114e80401702228f1898bdc9402214c9499e8c0","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"2931540c47ee0ff8a62860e61782eb17b155615db61e36986e54645ec67f67c2","impliedFormat":1},{"version":"ccab02f3920fc75c01174c47fcf67882a11daf16baf9e81701d0a94636e94556","impliedFormat":1},{"version":"f6faf5f74e4c4cc309a6c6a6c4da02dbb840be5d3e92905a23dcd7b2b0bd1986","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"33e981bf6376e939f99bd7f89abec757c64897d33c005036b9a10d9587d80187","impliedFormat":1},{"version":"7fd1b31fd35876b0aa650811c25ec2c97a3c6387e5473eb18004bed86cdd76b6","impliedFormat":1},{"version":"b41767d372275c154c7ea6c9d5449d9a741b8ce080f640155cc88ba1763e35b3","impliedFormat":1},{"version":"3bacf516d686d08682751a3bd2519ea3b8041a164bfb4f1d35728993e70a2426","impliedFormat":1},{"version":"7fb266686238369442bd1719bc0d7edd0199da4fb8540354e1ff7f16669b4323","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"5b03a034c72146b61573aab280f295b015b9168470f2df05f6080a2122f9b4df","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"54c3e2371e3d016469ad959697fd257e5621e16296fa67082c2575d0bf8eced0","impliedFormat":1},{"version":"beb8233b2c220cfa0feea31fbe9218d89fa02faa81ef744be8dce5acb89bb1fd","impliedFormat":1},{"version":"c183b931b68ad184bc8e8372bf663f3d33304772fb482f29fb91b3c391031f3e","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"48cc3ec153b50985fb95153258a710782b25975b10dd4ac8a4f3920632d10790","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"e1528ca65ac90f6fa0e4a247eb656b4263c470bb22d9033e466463e13395e599","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"866078923a56d026e39243b4392e282c1c63159723996fa89243140e1388a98d","impliedFormat":1},{"version":"830171b27c5fdf9bcbe4cf7d428fcf3ae2c67780fb7fbdccdf70d1623d938bc4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d97fb21da858fb18b8ae72c314e9743fd52f73ebe2764e12af1db32fc03f853f","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ea15fd99b2e34cb25fe8346c955000bb70c8b423ae4377a972ef46bfb37f595","impliedFormat":1},{"version":"7cf69dd5502c41644c9e5106210b5da7144800670cbe861f66726fa209e231c4","impliedFormat":1},{"version":"72c1f5e0a28e473026074817561d1bc9647909cf253c8d56c41d1df8d95b85f7","impliedFormat":1},{"version":"f9b4137a0d285bd77dba2e6e895530112264310ae47e07bf311feae428fb8b61","affectsGlobalScope":true,"impliedFormat":1},{"version":"8b21e13ed07d0df176ae31d6b7f01f7b17d66dbeb489c0d31d00de2ca14883da","impliedFormat":1},{"version":"51aecd2df90a3cffea1eb4696b33b2d78594ea2aa2138e6b9471ec4841c6c2ee","impliedFormat":1},{"version":"9d8f9e63e29a3396285620908e7f14d874d066caea747dc4b2c378f0599166b4","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f929f0b6b3421a2d34344b0f421f45aeb2c84ad365ebf29d04312023b3accc58","impliedFormat":1},{"version":"db9ada976f9e52e13f7ae8b9a320f4b67b87685938c5879187d8864b2fbe97f3","impliedFormat":1},{"version":"9f39e70a354d0fba29ac3cdf6eca00b7f9e96f64b2b2780c432e8ea27f133743","impliedFormat":1},{"version":"0dace96cc0f7bc6d0ee2044921bdf19fe42d16284dbcc8ae200800d1c9579335","impliedFormat":1},{"version":"a2e2bbde231b65c53c764c12313897ffdfb6c49183dd31823ee2405f2f7b5378","impliedFormat":1},{"version":"ad1cc0ed328f3f708771272021be61ab146b32ecf2b78f3224959ff1e2cd2a5c","impliedFormat":1},{"version":"c64e1888baaa3253ca4405b455e4bf44f76357868a1bd0a52998ade9a092ad78","affectsGlobalScope":true,"impliedFormat":1},{"version":"d8cf132379078d0974a59df26069689a2d33c7dc826b5be56231841cb2f32e58","impliedFormat":1},{"version":"fbf413fc617837453c878a9174a1f1b383616857a3f8366bc41cf30df4aea7d5","impliedFormat":1},{"version":"148c73ec11318850f571172ceae3e55ce479d850fe18ec8eae0abd99d9f6c319","impliedFormat":1},{"version":"230bdc111d7578276e4a3bb9d075d85c78c6b68f428c3a9935e2eaa10f4ae1f5","impliedFormat":1},{"version":"e8aabbee5e7b9101b03bb4222607d57f38859b8115a8050a4eb91b4ee43a3a73","impliedFormat":1},{"version":"bbf42f98a5819f4f06e18c8b669a994afe9a17fe520ae3454a195e6eabf7700d","impliedFormat":1},{"version":"c0bb1b65757c72bbf8ddf7eaa532223bacf58041ff16c883e76f45506596e925","impliedFormat":1},{"version":"c8b85f7aed29f8f52b813f800611406b0bfe5cf3224d20a4bdda7c7f73ce368e","affectsGlobalScope":true,"impliedFormat":1},{"version":"145dcf25fd4967c610c53d93d7bc4dce8fbb1b6dd7935362472d4ae49363c7ba","impliedFormat":1},{"version":"ff65b8a8bd380c6d129becc35de02f7c29ad7ce03300331ca91311fb4044d1a9","impliedFormat":1},{"version":"04bf1aa481d1adfb16d93d76e44ce71c51c8ef68039d849926551199489637f6","impliedFormat":1},{"version":"9043daec15206650fa119bad6b8d70136021ea7d52673a71f79a87a42ee38d44","affectsGlobalScope":true,"impliedFormat":1},{"version":"0b055dae40c0e27154f109c4ff771ae748db161c503a1687e3d4b9c91ba20de3","affectsGlobalScope":true,"impliedFormat":1},{"version":"a58a15da4c5ba3df60c910a043281256fa52d36a0fcdef9b9100c646282e88dd","impliedFormat":1},{"version":"b36beffbf8acdc3ebc58c8bb4b75574b31a2169869c70fc03f82895b93950a12","impliedFormat":1},{"version":"de263f0089aefbfd73c89562fb7254a7468b1f33b61839aafc3f035d60766cb4","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"8c81fd4a110490c43d7c578e8c6f69b3af01717189196899a6a44f93daa57a3a","impliedFormat":1},{"version":"5fb39858b2459864b139950a09adae4f38dad87c25bf572ce414f10e4bd7baab","impliedFormat":1},{"version":"65faec1b4bd63564aeec33eab9cacfaefd84ce2400f03903a71a1841fbce195f","impliedFormat":1},{"version":"b33b74b97952d9bf4fbd2951dcfbb5136656ddb310ce1c84518aaa77dbca9992","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"6b306cd4282bbb54d4a6bb23cfb7a271160983dfc38c67b5a132504cfcc34896","affectsGlobalScope":true,"impliedFormat":1},{"version":"c119835edf36415081dfd9ed15fc0cd37aaa28d232be029ad073f15f3d88c323","impliedFormat":1},{"version":"450172a56b944c2d83f45cc11c9a388ea967cd301a21202aa0a23c34c7506a18","impliedFormat":1},{"version":"9705cd157ffbb91c5cab48bdd2de5a437a372e63f870f8a8472e72ff634d47c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae86f30d5d10e4f75ce8dcb6e1bd3a12ecec3d071a21e8f462c5c85c678efb41","impliedFormat":1},{"version":"72f8936aebf0c4a1adab767b97d34ba7d3a308afcf76de4417b9c16fb92ed548","impliedFormat":1},{"version":"e03460fe72b259f6d25ad029f085e4bedc3f90477da4401d8fbc1efa9793230e","impliedFormat":1},{"version":"4286a3a6619514fca656089aee160bb6f2e77f4dd53dc5a96b26a0b4fc778055","impliedFormat":1},{"version":"69e0a41d620fb678a899c65e073413b452f4db321b858fe422ad93fd686cd49a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3585d6891e9ea18e07d0755a6d90d71331558ba5dc5561933553209f886db106","affectsGlobalScope":true,"impliedFormat":1},{"version":"86be71cbb0593468644932a6eb96d527cfa600cecfc0b698af5f52e51804451d","impliedFormat":1},{"version":"84dd6b0fd2505135692935599d6606f50a421389e8d4535194bcded307ee5cf2","impliedFormat":1},{"version":"0d5b085f36e6dc55bc6332ecb9c733be3a534958c238fb8d8d18d4a2b6f2a15a","impliedFormat":1},{"version":"db19ea066fdc5f97df3f769e582ae3000380ab7942e266654bdb1a4650d19eaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"2a034894bf28c220a331c7a0229d33564803abe2ac1b9a5feee91b6b9b6e88ea","impliedFormat":1},{"version":"d7e9ab1b0996639047c61c1e62f85c620e4382206b3abb430d9a21fb7bc23c77","impliedFormat":1},{"version":"be1cc4d94ea60cbe567bc29ed479d42587bf1e6cba490f123d329976b0fe4ee5","impliedFormat":1}],"root":[[66,76]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"declarationMap":true,"esModuleInterop":true,"jsx":4,"module":99,"outDir":"./","rootDir":"..","skipLibCheck":true,"strict":true,"target":7},"referencedMap":[[74,1],[70,2],[72,3],[75,4],[66,5],[68,5],[67,5],[69,5],[130,6],[131,6],[132,7],[79,8],[133,9],[134,10],[135,11],[77,12],[136,13],[137,14],[138,15],[139,16],[140,17],[141,18],[142,18],[143,19],[144,20],[145,21],[146,22],[80,12],[78,12],[147,23],[148,24],[149,25],[183,26],[150,27],[151,12],[152,28],[153,29],[154,30],[155,31],[156,32],[157,33],[158,34],[159,35],[160,36],[161,36],[162,37],[163,12],[164,38],[165,39],[167,40],[166,41],[168,42],[169,43],[170,44],[171,45],[172,46],[173,47],[174,48],[175,49],[176,50],[177,51],[178,52],[179,53],[180,54],[81,12],[82,55],[83,12],[84,12],[126,56],[127,57],[128,12],[129,42],[181,58],[182,59],[184,60],[50,12],[52,61],[53,62],[51,12],[65,63],[64,64],[58,65],[57,66],[54,12],[55,67],[56,68],[60,69],[59,12],[63,70],[62,71],[61,64],[48,12],[49,12],[8,12],[9,12],[11,12],[10,12],[2,12],[12,12],[13,12],[14,12],[15,12],[16,12],[17,12],[18,12],[19,12],[3,12],[20,12],[21,12],[4,12],[22,12],[26,12],[23,12],[24,12],[25,12],[27,12],[28,12],[29,12],[5,12],[30,12],[31,12],[32,12],[33,12],[6,12],[37,12],[34,12],[35,12],[36,12],[38,12],[7,12],[39,12],[44,12],[45,12],[40,12],[41,12],[42,12],[43,12],[1,12],[46,12],[47,12],[102,72],[114,73],[100,74],[115,75],[124,76],[91,77],[92,78],[90,79],[123,80],[118,81],[122,82],[94,83],[111,84],[93,85],[121,86],[88,87],[89,81],[95,88],[96,12],[101,89],[99,88],[86,90],[125,91],[116,92],[105,93],[104,88],[106,94],[109,95],[103,96],[107,97],[119,80],[97,98],[98,99],[110,100],[87,75],[113,101],[112,88],[108,102],[117,12],[85,12],[120,103],[76,12],[73,104],[71,104]],"latestChangedDtsFile":"./index.d.ts","version":"5.8.3"}
@@ -0,0 +1,4 @@
1
+ import type { SupportedLanguage } from '../config/i18n.js';
2
+ export declare const LANGUAGE_FLAGS: Record<SupportedLanguage, string>;
3
+ export declare const getLanguageFlag: (lang: SupportedLanguage) => string;
4
+ //# sourceMappingURL=languageIcons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"languageIcons.d.ts","sourceRoot":"","sources":["../../utils/languageIcons.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAQ5D,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,MAAM,iBAAiB,KAAG,MAEzD,CAAC"}
@@ -0,0 +1,12 @@
1
+ export const LANGUAGE_FLAGS = {
2
+ en: '🇬🇧',
3
+ nl: '🇳🇱',
4
+ fr: '🇫🇷',
5
+ de: '🇩🇪',
6
+ es: '🇪🇸',
7
+ it: '🇮🇹',
8
+ pt: '🇵🇹',
9
+ };
10
+ export const getLanguageFlag = (lang) => {
11
+ return LANGUAGE_FLAGS[lang] || '🌐';
12
+ };
@@ -0,0 +1,45 @@
1
+ import { type SupportedLanguage } from '../config/i18n.js';
2
+ /**
3
+ * Set a custom API URL resolver function
4
+ * Allows users to provide their own logic for resolving API URLs
5
+ */
6
+ export declare const setApiUrlResolver: (resolver: () => string) => void;
7
+ /**
8
+ * Get the configured API URL resolver or use default
9
+ * @param envVarName - Environment variable name to check (e.g., 'VITE_API_URL')
10
+ * @param defaultUrl - Default URL if no env var or custom resolver is set
11
+ */
12
+ export declare const getApiUrl: (envVarName?: string, defaultUrl?: string) => string;
13
+ /**
14
+ * Get language from cookie
15
+ */
16
+ export declare const getLanguageFromCookie: () => string | null;
17
+ /**
18
+ * Set language cookie for .asafarim.be domain
19
+ */
20
+ export declare const setLanguageCookie: (language: string) => void;
21
+ /**
22
+ * Validate if language is supported
23
+ */
24
+ export declare const isSupportedLanguage: (lang: string) => lang is SupportedLanguage;
25
+ /**
26
+ * Get browser language with fallback
27
+ */
28
+ export declare const getBrowserLanguage: () => SupportedLanguage;
29
+ /**
30
+ * Get initial language from cookie, browser, or default
31
+ */
32
+ export declare const getInitialLanguage: () => SupportedLanguage;
33
+ /**
34
+ * Update user language preference on backend
35
+ * Note: Language preference is stored in cookies across all apps
36
+ * No backend sync needed - cookies are shared across .asafarim.local domain
37
+ */
38
+ export declare const updateUserLanguagePreference: (language: SupportedLanguage) => Promise<boolean>;
39
+ /**
40
+ * Fetch user language preference from backend
41
+ * Note: Language preference is stored in cookies across all apps
42
+ * No backend sync needed - cookies are shared across .asafarim.local domain
43
+ */
44
+ export declare const fetchUserLanguagePreference: () => Promise<SupportedLanguage | null>;
45
+ //# sourceMappingURL=languageUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"languageUtils.d.ts","sourceRoot":"","sources":["../../utils/languageUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+D,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAIxH;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,UAAU,MAAM,MAAM,KAAG,IAE1D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,SAAS,GAAI,aAAY,MAAuB,EAAE,aAAY,MAA2B,KAAG,MA0BxG,CAAC;AAUF;;GAEG;AACH,eAAO,MAAM,qBAAqB,QAAO,MAAM,GAAG,IAcjD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAI,UAAU,MAAM,KAAG,IAYpD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,MAAM,MAAM,KAAG,IAAI,IAAI,iBAE1D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,QAAO,iBAKrC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,QAAO,iBAOrC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,GAAU,UAAU,iBAAiB,KAAG,OAAO,CAAC,OAAO,CAqB/F,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,QAAa,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAapF,CAAC"}
@@ -0,0 +1,144 @@
1
+ import { LANGUAGE_COOKIE_NAME, DEFAULT_LANGUAGE, SUPPORTED_LANGUAGES } from '../config/i18n.js';
2
+ let customApiUrlResolver = null;
3
+ /**
4
+ * Set a custom API URL resolver function
5
+ * Allows users to provide their own logic for resolving API URLs
6
+ */
7
+ export const setApiUrlResolver = (resolver) => {
8
+ customApiUrlResolver = resolver;
9
+ };
10
+ /**
11
+ * Get the configured API URL resolver or use default
12
+ * @param envVarName - Environment variable name to check (e.g., 'VITE_API_URL')
13
+ * @param defaultUrl - Default URL if no env var or custom resolver is set
14
+ */
15
+ export const getApiUrl = (envVarName = 'VITE_API_URL', defaultUrl = 'http://localhost') => {
16
+ if (customApiUrlResolver) {
17
+ return customApiUrlResolver();
18
+ }
19
+ let resolved = defaultUrl;
20
+ try {
21
+ // Prefer Vite env vars when available
22
+ // Guard access to import.meta for non-Vite environments
23
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
24
+ const viteEnv = (typeof import.meta !== 'undefined') ? (import.meta.env) : undefined;
25
+ if (viteEnv && viteEnv[envVarName]) {
26
+ resolved = viteEnv[envVarName];
27
+ }
28
+ else if (typeof window !== 'undefined' && window.location) {
29
+ // Fallback based on hostname for runtime environments
30
+ const hostname = window.location.hostname;
31
+ const protocol = window.location.protocol;
32
+ resolved = `${protocol}//${hostname}`;
33
+ }
34
+ }
35
+ catch {
36
+ // Keep default if any detection fails
37
+ }
38
+ return resolved;
39
+ };
40
+ /**
41
+ * Resolve Identity API base URL from environment or hostname
42
+ * @deprecated Use getApiUrl() instead for more flexibility
43
+ */
44
+ const getIdentityApiUrl = () => {
45
+ return getApiUrl('VITE_IDENTITY_API_URL', 'http://identity.asafarim.local:5101');
46
+ };
47
+ /**
48
+ * Get language from cookie
49
+ */
50
+ export const getLanguageFromCookie = () => {
51
+ if (typeof document === 'undefined')
52
+ return null;
53
+ const cookies = document.cookie.split(';');
54
+ const languageCookie = cookies.find(cookie => cookie.trim().startsWith(`${LANGUAGE_COOKIE_NAME}=`));
55
+ if (languageCookie) {
56
+ const value = languageCookie.split('=')[1];
57
+ return value || null;
58
+ }
59
+ return null;
60
+ };
61
+ /**
62
+ * Set language cookie for .asafarim.be domain
63
+ */
64
+ export const setLanguageCookie = (language) => {
65
+ if (typeof document === 'undefined')
66
+ return;
67
+ const domain = window.location.hostname.includes('asafarim.be')
68
+ ? '.asafarim.be'
69
+ : window.location.hostname;
70
+ // Set cookie with 1 year expiration
71
+ const expirationDate = new Date();
72
+ expirationDate.setFullYear(expirationDate.getFullYear() + 1);
73
+ document.cookie = `${LANGUAGE_COOKIE_NAME}=${language}; domain=${domain}; path=/; expires=${expirationDate.toUTCString()}; SameSite=Lax`;
74
+ };
75
+ /**
76
+ * Validate if language is supported
77
+ */
78
+ export const isSupportedLanguage = (lang) => {
79
+ return SUPPORTED_LANGUAGES.includes(lang);
80
+ };
81
+ /**
82
+ * Get browser language with fallback
83
+ */
84
+ export const getBrowserLanguage = () => {
85
+ if (typeof navigator === 'undefined')
86
+ return DEFAULT_LANGUAGE;
87
+ const browserLang = navigator.language.split('-')[0];
88
+ return isSupportedLanguage(browserLang) ? browserLang : DEFAULT_LANGUAGE;
89
+ };
90
+ /**
91
+ * Get initial language from cookie, browser, or default
92
+ */
93
+ export const getInitialLanguage = () => {
94
+ const cookieLang = getLanguageFromCookie();
95
+ if (cookieLang && isSupportedLanguage(cookieLang)) {
96
+ return cookieLang;
97
+ }
98
+ return getBrowserLanguage();
99
+ };
100
+ /**
101
+ * Update user language preference on backend
102
+ * Note: Language preference is stored in cookies across all apps
103
+ * No backend sync needed - cookies are shared across .asafarim.local domain
104
+ */
105
+ export const updateUserLanguagePreference = async (language) => {
106
+ try {
107
+ const baseUrl = getIdentityApiUrl();
108
+ const response = await fetch(`${baseUrl}/api/me/preferences`, {
109
+ method: 'POST',
110
+ headers: { 'Content-Type': 'application/json' },
111
+ credentials: 'include',
112
+ body: JSON.stringify({ preferredLanguage: language }),
113
+ });
114
+ if (!response.ok) {
115
+ const text = await response.text().catch(() => '');
116
+ console.warn('Failed to sync language preference with backend:', response.status, text);
117
+ return false;
118
+ }
119
+ return true;
120
+ }
121
+ catch (error) {
122
+ console.error('Failed to update language preference: ' + language, error);
123
+ return false;
124
+ }
125
+ };
126
+ /**
127
+ * Fetch user language preference from backend
128
+ * Note: Language preference is stored in cookies across all apps
129
+ * No backend sync needed - cookies are shared across .asafarim.local domain
130
+ */
131
+ export const fetchUserLanguagePreference = async () => {
132
+ try {
133
+ // Language is already available in cookie
134
+ // No backend call needed - cookies are the source of truth
135
+ const cookieLang = getLanguageFromCookie();
136
+ if (cookieLang && isSupportedLanguage(cookieLang)) {
137
+ return cookieLang;
138
+ }
139
+ }
140
+ catch (error) {
141
+ console.error('Failed to fetch language preference:', error);
142
+ }
143
+ return null;
144
+ };
package/package.json CHANGED
@@ -1,23 +1,35 @@
1
1
  {
2
2
  "name": "@asafarim/shared-i18n",
3
- "version": "0.5.2",
3
+ "description": "A shared i18n package for React applications",
4
+ "version": "0.6.0",
4
5
  "type": "module",
5
6
  "files": [
6
- "locales",
7
- "config",
8
- "hooks",
9
- "utils",
10
- "index.ts",
11
- "package.json",
12
- "tsconfig.json"
7
+ "dist",
8
+ "demo"
13
9
  ],
14
- "main": "index.ts",
15
- "types": "index.ts",
10
+ "main": "dist/index.js",
11
+ "types": "dist/index.d.ts",
16
12
  "exports": {
17
- ".": "./index.ts",
18
- "./config": "./config/i18n.ts",
19
- "./hooks": "./hooks/useLanguage.ts",
20
- "./utils": "./utils/languageUtils.ts",
13
+ ".": {
14
+ "types": "./dist/index.d.ts",
15
+ "default": "./dist/index.js"
16
+ },
17
+ "./config": {
18
+ "types": "./dist/config/i18n.d.ts",
19
+ "default": "./dist/config/i18n.js"
20
+ },
21
+ "./hooks": {
22
+ "types": "./dist/hooks/useLanguage.d.ts",
23
+ "default": "./dist/hooks/useLanguage.js"
24
+ },
25
+ "./utils": {
26
+ "types": "./dist/utils/languageUtils.d.ts",
27
+ "default": "./dist/utils/languageUtils.js"
28
+ },
29
+ "./components": {
30
+ "types": "./dist/components/LanguageSwitcher.d.ts",
31
+ "default": "./dist/components/LanguageSwitcher.js"
32
+ },
21
33
  "./locales/*": "./locales/*"
22
34
  },
23
35
  "peerDependencies": {
@@ -25,9 +37,10 @@
25
37
  "react-dom": "^18.2.0 || ^19.0.0"
26
38
  },
27
39
  "dependencies": {
28
- "i18next": "^25.6.0",
29
- "react-i18next": "^16.0.1",
30
- "i18next-browser-languagedetector": "^8.2.0"
40
+ "i18next": "^23.15.1",
41
+ "react-i18next": "^13.5.0",
42
+ "@asafarim/design-tokens": "^0.5.0",
43
+ "i18next-browser-languagedetector": "^7.2.0"
31
44
  },
32
45
  "devDependencies": {
33
46
  "@types/node": "^24.3.1",
@@ -59,16 +72,15 @@
59
72
  "bugs": {
60
73
  "url": "https://github.com/AliSafari-IT/shared-i18n/issues"
61
74
  },
62
- "homepage": "https://github.com/AliSafari-IT/shared-i18n#readme",
75
+ "homepage": "https://alisafari-it.github.io/shared-i18n",
63
76
  "publishConfig": {
64
77
  "access": "public"
65
78
  },
66
79
  "scripts": {
67
- "build": "tsc -b",
68
- "dev": "tsc -w",
69
- "start": "pnpm run build",
80
+ "build": "tsc -b && node ./scripts/copy-css.js",
70
81
  "demo": "pnpm run build && cd demo && pnpm run dev",
71
82
  "predeploy": "pnpm run build && cd demo && pnpm run build && cd ..",
72
- "deploy": "gh-pages -d demo/dist"
83
+ "deploy": "gh-pages -d demo/dist",
84
+ "release": "node ./scripts/release.js"
73
85
  }
74
86
  }
package/LICENSE DELETED
@@ -1,23 +0,0 @@
1
- # License
2
-
3
- This project is licensed under the **Creative Commons Attribution 4.0 International (CC BY 4.0)** license.
4
-
5
- You are free to:
6
-
7
- - **Share** — copy and redistribute the material in any medium or format
8
- - **Adapt** — remix, transform, and build upon the material for any purpose, even commercially
9
-
10
- Under the following terms:
11
-
12
- - **Attribution** — You must give appropriate credit, provide a link to the license, and indicate if changes were made.
13
- You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
14
-
15
- ## 📌 Attribution Requirement
16
-
17
- If you use or modify this project, please include the following attribution:
18
-
19
- > Based on work by [Ali Safari](https://github.com/AliSafari-IT/asafarim-dot-be)
20
-
21
- ## 🔗 Full License Text
22
-
23
- For full details, see the [Creative Commons Attribution 4.0 License](https://creativecommons.org/licenses/by/4.0/).
package/config/i18n.ts DELETED
@@ -1,89 +0,0 @@
1
- import i18n from 'i18next';
2
- import { initReactI18next } from 'react-i18next';
3
- import LanguageDetector from 'i18next-browser-languagedetector';
4
-
5
- // Import common translations
6
- import enCommon from '../locales/en/common.json';
7
- import nlCommon from '../locales/nl/common.json';
8
-
9
- // Import web app translations
10
- import enWeb from '../locales/en/web.json';
11
- import nlWeb from '../locales/nl/web.json';
12
-
13
- // Import identity-portal translations
14
- import enIdentityPortal from '../locales/en/identity-portal.json';
15
- import nlIdentityPortal from '../locales/nl/identity-portal.json';
16
-
17
- export const SUPPORTED_LANGUAGES = ['en', 'nl'] as const;
18
- export type SupportedLanguage = typeof SUPPORTED_LANGUAGES[number];
19
-
20
- export const LANGUAGE_NAMES: Record<SupportedLanguage, string> = {
21
- en: 'English',
22
- nl: 'Nederlands'
23
- };
24
-
25
- export const DEFAULT_LANGUAGE: SupportedLanguage = 'en';
26
- export const LANGUAGE_COOKIE_NAME = 'preferredLanguage';
27
-
28
- export interface I18nConfig {
29
- defaultNS?: string;
30
- ns?: string[];
31
- resources?: Record<string, Record<string, any>>;
32
- supportedLngs?: string[];
33
- defaultLanguage?: string;
34
- }
35
-
36
- export const initI18n = (config?: I18nConfig) => {
37
- const {
38
- defaultNS = 'common',
39
- ns = ['common', 'web', 'identityPortal'],
40
- resources = {},
41
- supportedLngs,
42
- defaultLanguage,
43
- } = config || {};
44
-
45
- // Merge common translations with app-specific resources
46
- const mergedResources: Record<string, Record<string, any>> = { ...resources };
47
-
48
- mergedResources.en = {
49
- common: enCommon,
50
- web: enWeb,
51
- identityPortal: enIdentityPortal,
52
- ...(resources.en || {}),
53
- };
54
- mergedResources.nl = {
55
- common: nlCommon,
56
- web: nlWeb,
57
- identityPortal: nlIdentityPortal,
58
- ...(resources.nl || {}),
59
- };
60
-
61
- const finalSupportedLngs = supportedLngs ?? Object.keys(mergedResources);
62
- const fallbackLng = defaultLanguage ?? DEFAULT_LANGUAGE;
63
-
64
- i18n
65
- .use(initReactI18next)
66
- .use(LanguageDetector)
67
- .init({
68
- resources: mergedResources,
69
- fallbackLng,
70
- defaultNS,
71
- ns,
72
- supportedLngs: finalSupportedLngs,
73
- detection: {
74
- order: ['cookie', 'navigator'],
75
- caches: ['cookie'],
76
- lookupCookie: LANGUAGE_COOKIE_NAME
77
- },
78
- interpolation: {
79
- escapeValue: false // React already escapes
80
- },
81
- react: {
82
- useSuspense: false
83
- }
84
- });
85
-
86
- return i18n;
87
- };
88
-
89
- export default i18n;
@@ -1,80 +0,0 @@
1
- import { useCallback, useEffect, useState } from 'react';
2
- import { useTranslation } from 'react-i18next';
3
- import {
4
- setLanguageCookie,
5
- updateUserLanguagePreference,
6
- fetchUserLanguagePreference,
7
- isSupportedLanguage
8
- } from '../utils/languageUtils';
9
- import type { SupportedLanguage } from '../config/i18n';
10
-
11
- export interface UseLanguageReturn {
12
- language: SupportedLanguage;
13
- changeLanguage: (lang: SupportedLanguage) => Promise<void>;
14
- isChanging: boolean;
15
- }
16
-
17
- /**
18
- * Hook for managing language preferences
19
- * Handles both frontend (cookie) and backend (API) synchronization
20
- */
21
- export const useLanguage = (): UseLanguageReturn => {
22
- const { i18n } = useTranslation();
23
- const [isChanging, setIsChanging] = useState(false);
24
-
25
- // Safely get current language with fallback
26
- const currentLanguage = (i18n?.language && isSupportedLanguage(i18n.language)
27
- ? i18n.language
28
- : 'en') as SupportedLanguage;
29
-
30
- // Sync with backend on mount (for authenticated users)
31
- useEffect(() => {
32
- const syncLanguageWithBackend = async () => {
33
- if (!i18n?.changeLanguage) return;
34
-
35
- const backendLang = await fetchUserLanguagePreference();
36
- if (backendLang && backendLang !== currentLanguage) {
37
- await i18n.changeLanguage(backendLang);
38
- setLanguageCookie(backendLang);
39
- }
40
- };
41
-
42
- syncLanguageWithBackend();
43
- }, []); // Only run once on mount
44
-
45
- const changeLanguage = useCallback(async (lang: SupportedLanguage) => {
46
- if (lang === currentLanguage) return;
47
-
48
- setIsChanging(true);
49
- try {
50
- // Check if i18n is properly initialized
51
- if (!i18n || typeof i18n.changeLanguage !== 'function') {
52
- console.error('i18n is not properly initialized');
53
- // Still update cookie even if i18n fails
54
- setLanguageCookie(lang);
55
- return;
56
- }
57
-
58
- // Update i18next
59
- await i18n.changeLanguage(lang);
60
-
61
- // Update cookie immediately
62
- setLanguageCookie(lang);
63
-
64
- // Update backend (fire and forget for better UX)
65
- updateUserLanguagePreference(lang).catch(err => {
66
- console.warn('Failed to sync language preference with backend:', err);
67
- });
68
- } catch (error) {
69
- console.error('Failed to change language:', error);
70
- } finally {
71
- setIsChanging(false);
72
- }
73
- }, [currentLanguage]);
74
-
75
- return {
76
- language: currentLanguage,
77
- changeLanguage,
78
- isChanging
79
- };
80
- };
package/index.ts DELETED
@@ -1,21 +0,0 @@
1
- // Main exports
2
- export { initI18n, SUPPORTED_LANGUAGES, LANGUAGE_NAMES, DEFAULT_LANGUAGE, LANGUAGE_COOKIE_NAME } from './config/i18n';
3
- export type { SupportedLanguage, I18nConfig } from './config/i18n';
4
-
5
- // Hooks
6
- export { useLanguage } from './hooks/useLanguage';
7
- export type { UseLanguageReturn } from './hooks/useLanguage';
8
-
9
- // Utils
10
- export {
11
- getLanguageFromCookie,
12
- setLanguageCookie,
13
- isSupportedLanguage,
14
- getBrowserLanguage,
15
- getInitialLanguage,
16
- updateUserLanguagePreference,
17
- fetchUserLanguagePreference
18
- } from './utils/languageUtils';
19
-
20
- // Re-export react-i18next for convenience
21
- export { useTranslation, Trans, Translation } from 'react-i18next';