i18n.js 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /* eslint-disable */
  2. import i18n from 'i18next';
  3. import LanguageDetector from 'i18next-browser-languagedetector';
  4. import { initReactI18next } from 'react-i18next';
  5. import locales from '^/public/static/locales';
  6. const aliasesMapping = {};
  7. Object.values(locales).forEach((locale) => {
  8. if (locale.meta.aliases == null) {
  9. return;
  10. }
  11. locale.meta.aliases.forEach((alias) => {
  12. aliasesMapping[alias] = locale.meta.id;
  13. });
  14. });
  15. /*
  16. * Note: This file will be deleted. use "^/config/next-i18next.config" instead
  17. */
  18. // extract metadata list from 'public/static/locales/${locale}/meta.json'
  19. export const localeMetadatas = Object.values(locales).map(locale => locale.meta);
  20. export const i18nFactory = (userLocaleId) => {
  21. // setup LanguageDetector
  22. const langDetector = new LanguageDetector();
  23. langDetector.addDetector({
  24. name: 'userSettingDetector',
  25. lookup(options) {
  26. return userLocaleId;
  27. },
  28. });
  29. // Wrapper to convert lang after detected from browser
  30. langDetector.addDetector({
  31. name: 'navigatorWrapperToConvertByAlias',
  32. lookup(options) {
  33. const results = langDetector.detectors.navigator.lookup(options);
  34. const lang = results[0];
  35. if (lang == null) {
  36. return;
  37. }
  38. return aliasesMapping[lang] || lang;
  39. },
  40. });
  41. i18n
  42. .use(langDetector)
  43. .use(initReactI18next) // if not using I18nextProvider
  44. .init({
  45. debug: (process.env.NODE_ENV !== 'production'),
  46. resources: locales,
  47. load: 'currentOnly',
  48. fallbackLng: 'en_US',
  49. detection: {
  50. order: ['userSettingDetector', 'navigatorWrapperToConvertByAlias', 'querystring'],
  51. },
  52. interpolation: {
  53. escapeValue: false, // not needed for react!!
  54. },
  55. // react i18next special options (optional)
  56. react: {
  57. wait: false,
  58. withRef: true,
  59. bindI18n: 'languageChanged loaded',
  60. bindStore: 'added removed',
  61. nsMode: 'default',
  62. },
  63. });
  64. return i18n;
  65. };