i18n.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import i18n from 'i18next';
  2. import LanguageDetector from 'i18next-browser-languagedetector';
  3. import { initReactI18next } from 'react-i18next';
  4. import locales from '@root/resource/locales';
  5. import LanguageDetectorWrapper from './LanguageDetectorWrapper';
  6. // extract metadata list from 'resource/locales/${locale}/meta.json'
  7. export const localeMetadatas = Object.values(locales).map(locale => locale.meta);
  8. export const i18nFactory = (userLocaleId) => {
  9. // setup LanguageDetector
  10. const langDetector = new LanguageDetector();
  11. langDetector.addDetector({
  12. name: 'userSettingDetector',
  13. lookup(options) {
  14. return userLocaleId;
  15. },
  16. });
  17. // Wrapper to convert lang after detected
  18. const languageDetectorWrapper = new LanguageDetectorWrapper(langDetector);
  19. i18n
  20. .use(languageDetectorWrapper)
  21. .use(initReactI18next) // if not using I18nextProvider
  22. .init({
  23. debug: (process.env.NODE_ENV !== 'production'),
  24. resources: locales,
  25. load: 'currentOnly',
  26. fallbackLng: 'en_US',
  27. detection: 'languageDetectorWrapper',
  28. interpolation: {
  29. escapeValue: false, // not needed for react!!
  30. },
  31. // react i18next special options (optional)
  32. react: {
  33. wait: false,
  34. withRef: true,
  35. bindI18n: 'languageChanged loaded',
  36. bindStore: 'added removed',
  37. nsMode: 'default',
  38. },
  39. });
  40. return i18n;
  41. };