1
0
Fork 0
mirror of https://github.com/plankanban/planka.git synced 2025-07-27 09:09:46 +02:00
planka/client/src/i18n.js

96 lines
2.4 KiB
JavaScript
Raw Normal View History

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',
});
i18n.loadCoreLocale = (language) =>
import(`./locales/${language}/core`).then((module) => {
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) => {
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;