2019-08-31 04:07:25 +05:00
|
|
|
import i18n from 'i18next';
|
|
|
|
import languageDetector from 'i18next-browser-languagedetector';
|
|
|
|
import { initReactI18next } from 'react-i18next';
|
|
|
|
import formatDate from 'date-fns/format';
|
|
|
|
import parseDate from 'date-fns/parse';
|
|
|
|
import { registerLocale, setDefaultLocale } from 'react-datepicker';
|
|
|
|
|
|
|
|
import { embedLocales, languages } from './locales';
|
|
|
|
|
|
|
|
i18n.dateFns = {
|
|
|
|
locales: {},
|
|
|
|
addLocale(language, locale) {
|
|
|
|
this.locales[language] = locale;
|
|
|
|
|
|
|
|
registerLocale(language, locale);
|
|
|
|
},
|
2022-03-31 02:23:44 +05:00
|
|
|
getLocale(language = i18n.resolvedLanguage) {
|
2019-08-31 04:07:25 +05:00
|
|
|
return this.locales[language];
|
|
|
|
},
|
|
|
|
format(date, format, { language, ...options } = {}) {
|
|
|
|
return formatDate(date, format, {
|
|
|
|
locale: this.getLocale(language),
|
|
|
|
...options,
|
|
|
|
});
|
|
|
|
},
|
|
|
|
parse(dateString, format, backupDate, { language, ...options } = {}) {
|
|
|
|
return parseDate(dateString, format, backupDate, {
|
|
|
|
locale: this.getLocale(language),
|
|
|
|
...options,
|
|
|
|
});
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
2022-03-31 02:23:44 +05:00
|
|
|
i18n.on('languageChanged', () => {
|
|
|
|
setDefaultLocale(i18n.resolvedLanguage);
|
2020-05-26 14:10:06 +05:00
|
|
|
});
|
|
|
|
|
2019-08-31 04:07:25 +05:00
|
|
|
const formatDatePostProcessor = {
|
|
|
|
type: 'postProcessor',
|
|
|
|
name: 'formatDate',
|
|
|
|
process(value, _, options) {
|
|
|
|
return i18n.dateFns.format(options.value, value);
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
const parseDatePostProcessor = {
|
|
|
|
type: 'postProcessor',
|
|
|
|
name: 'parseDate',
|
|
|
|
process(value, _, options) {
|
|
|
|
return i18n.dateFns.parse(options.value, value, new Date());
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
i18n
|
|
|
|
.use(languageDetector)
|
|
|
|
.use(formatDatePostProcessor)
|
|
|
|
.use(parseDatePostProcessor)
|
|
|
|
.use(initReactI18next)
|
|
|
|
.init({
|
|
|
|
resources: embedLocales,
|
|
|
|
fallbackLng: false,
|
2022-03-31 02:23:44 +05:00
|
|
|
supportedLngs: languages,
|
|
|
|
load: 'languageOnly',
|
2019-08-31 04:07:25 +05:00
|
|
|
interpolation: {
|
|
|
|
escapeValue: false,
|
|
|
|
format(value, format, language) {
|
|
|
|
if (value instanceof Date) {
|
|
|
|
return i18n.dateFns.format(value, format, {
|
|
|
|
language,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
return value;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
react: {
|
|
|
|
useSuspense: false,
|
|
|
|
},
|
|
|
|
debug: process.env.NODE_ENV !== 'production',
|
|
|
|
});
|
|
|
|
|
2020-05-29 19:31:19 +05:00
|
|
|
i18n.loadCoreLocale = (language) =>
|
|
|
|
import(`./locales/${language}/core`).then((module) => {
|
2020-02-03 18:42:31 +05:00
|
|
|
const locale = module.default;
|
2019-08-31 04:07:25 +05:00
|
|
|
|
2020-03-25 00:15:47 +05:00
|
|
|
Object.keys(locale).forEach((namespace) => {
|
2020-02-03 18:42:31 +05:00
|
|
|
if (namespace === 'dateFns') {
|
|
|
|
i18n.dateFns.addLocale(language, locale[namespace]);
|
|
|
|
} else {
|
|
|
|
i18n.addResourceBundle(language, namespace, locale[namespace], true, true);
|
|
|
|
}
|
|
|
|
});
|
2019-08-31 04:07:25 +05:00
|
|
|
});
|
|
|
|
|
|
|
|
export default i18n;
|