feishin/src/i18n/i18n.ts

213 lines
5.2 KiB
TypeScript
Raw Normal View History

import { PostProcessorModule, StringMap, TOptions } from 'i18next';
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import cs from './locales/cs.json';
import de from './locales/de.json';
import en from './locales/en.json';
import es from './locales/es.json';
import fa from './locales/fa.json';
import fi from './locales/fi.json';
import fr from './locales/fr.json';
import hu from './locales/hu.json';
import id from './locales/id.json';
import it from './locales/it.json';
import ja from './locales/ja.json';
import ko from './locales/ko.json';
import nbNO from './locales/nb-NO.json';
import nl from './locales/nl.json';
import pl from './locales/pl.json';
import ptBr from './locales/pt-BR.json';
import ru from './locales/ru.json';
2025-07-08 00:11:20 -07:00
import sl from './locales/sl.json';
2023-11-18 01:32:59 -08:00
import sr from './locales/sr.json';
import sv from './locales/sv.json';
2025-01-24 16:47:49 -08:00
import ta from './locales/ta.json';
import zhHans from './locales/zh-Hans.json';
import zhHant from './locales/zh-Hant.json';
const resources = {
cs: { translation: cs },
de: { translation: de },
en: { translation: en },
es: { translation: es },
2024-05-06 19:54:54 -07:00
fa: { translation: fa },
fi: { translation: fi },
fr: { translation: fr },
hu: { translation: hu },
id: { translation: id },
it: { translation: it },
ja: { translation: ja },
2024-07-03 15:56:48 -07:00
ko: { translation: ko },
'nb-NO': { translation: nbNO },
nl: { translation: nl },
pl: { translation: pl },
'pt-BR': { translation: ptBr },
ru: { translation: ru },
2025-07-08 00:11:20 -07:00
sl: { translation: sl },
2023-11-18 01:32:59 -08:00
sr: { translation: sr },
sv: { translation: sv },
2025-01-24 16:47:49 -08:00
ta: { translation: ta },
'zh-Hans': { translation: zhHans },
'zh-Hant': { translation: zhHant },
};
export const languages = [
{
label: 'English',
value: 'en',
},
2023-11-18 01:32:59 -08:00
{
label: 'Čeština',
value: 'cs',
},
{
label: 'Español',
value: 'es',
},
{
label: 'Deutsch',
value: 'de',
},
{
label: 'Français',
value: 'fr',
},
2025-01-24 16:47:49 -08:00
{
label: 'Bahasa Indonesia',
value: 'id',
},
{
label: 'Suomeksi',
value: 'fi',
},
{
label: 'Magyar',
value: 'hu',
},
{
label: 'Italiano',
value: 'it',
},
{
label: '日本語',
value: 'ja',
},
2024-07-03 15:56:48 -07:00
{
label: '한국어',
value: 'ko',
},
{
2023-12-13 18:19:24 -08:00
label: 'Nederlands',
value: 'nl',
},
2023-12-13 18:19:24 -08:00
{
label: 'Norsk (Bokmål)',
value: 'nb-NO',
},
2024-05-06 19:54:54 -07:00
{
label: 'فارسی',
value: 'fa',
},
{
label: 'Português (Brasil)',
value: 'pt-BR',
},
{
label: 'Polski',
value: 'pl',
},
2023-11-18 01:32:59 -08:00
{
2023-12-13 18:19:24 -08:00
label: 'Русский',
value: 'ru',
},
2025-07-08 00:11:20 -07:00
{
label: 'Slovenščina',
value: 'sl',
},
2023-12-13 18:19:24 -08:00
{
2023-11-18 01:32:59 -08:00
label: 'Srpski',
value: 'sr',
},
{
label: 'Svenska',
value: 'sv',
},
2025-01-24 16:47:49 -08:00
{
label: 'Tamil',
value: 'ta',
},
{
label: '简体中文',
value: 'zh-Hans',
},
2024-05-06 19:54:54 -07:00
{
label: '繁體中文',
value: 'zh-Hant',
},
];
const lowerCasePostProcessor: PostProcessorModule = {
name: 'lowerCase',
process: (value: string) => {
return value.toLocaleLowerCase();
},
type: 'postProcessor',
};
const upperCasePostProcessor: PostProcessorModule = {
name: 'upperCase',
process: (value: string) => {
return value.toLocaleUpperCase();
},
type: 'postProcessor',
};
const titleCasePostProcessor: PostProcessorModule = {
name: 'titleCase',
process: (value: string) => {
2023-11-17 02:03:01 -08:00
return value.replace(/\S\S*/g, (txt) => {
return txt.charAt(0).toLocaleUpperCase() + txt.slice(1).toLowerCase();
});
},
type: 'postProcessor',
};
2024-05-06 19:54:54 -07:00
const ignoreSentenceCaseLanguages = ['de'];
const sentenceCasePostProcessor: PostProcessorModule = {
name: 'sentenceCase',
process: (value: string, _key: string, _options: TOptions<StringMap>, translator: any) => {
const sentences = value.split('. ');
return sentences
.map((sentence) => {
return (
2024-05-06 19:54:54 -07:00
sentence.charAt(0).toLocaleUpperCase() +
(!ignoreSentenceCaseLanguages.includes(translator.language)
? sentence.slice(1).toLocaleLowerCase()
: sentence.slice(1))
);
})
.join('. ');
},
type: 'postProcessor',
};
i18n.use(lowerCasePostProcessor)
.use(upperCasePostProcessor)
.use(titleCasePostProcessor)
.use(sentenceCasePostProcessor)
.use(initReactI18next) // passes i18n down to react-i18next
.init({
fallbackLng: 'en',
// language to use, more information here: https://www.i18next.com/overview/configuration-options#languages-namespaces-resources
// you can use the i18n.changeLanguage function to change the language manually: https://www.i18next.com/overview/api#changelanguage
// if you're using a language detector, do not define the lng option
interpolation: {
escapeValue: false, // react already safes from xss
},
resources,
});
export default i18n;