i18n.js 1.8 KB

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