You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
2.8 KiB
93 lines
2.8 KiB
import dayjs from 'dayjs' |
|
import i18n, { Resource } from 'i18next' |
|
import LanguageDetector from 'i18next-browser-languagedetector' |
|
import { initReactI18next } from 'react-i18next' |
|
import ar from './locales/ar' |
|
import de from './locales/de' |
|
import en from './locales/en' |
|
import es from './locales/es' |
|
import fa from './locales/fa' |
|
import fr from './locales/fr' |
|
import it from './locales/it' |
|
import ja from './locales/ja' |
|
import ko from './locales/ko' |
|
import pl from './locales/pl' |
|
import pt_BR from './locales/pt-BR' |
|
import pt_PT from './locales/pt-PT' |
|
import ru from './locales/ru' |
|
import th from './locales/th' |
|
import zh from './locales/zh' |
|
|
|
const languages = { |
|
ar: { resource: ar, name: 'العربية' }, |
|
de: { resource: de, name: 'Deutsch' }, |
|
en: { resource: en, name: 'English' }, |
|
es: { resource: es, name: 'Español' }, |
|
fa: { resource: fa, name: 'فارسی' }, |
|
fr: { resource: fr, name: 'Français' }, |
|
it: { resource: it, name: 'Italiano' }, |
|
ja: { resource: ja, name: '日本語' }, |
|
ko: { resource: ko, name: '한국어' }, |
|
pl: { resource: pl, name: 'Polski' }, |
|
'pt-BR': { resource: pt_BR, name: 'Português (Brasil)' }, |
|
'pt-PT': { resource: pt_PT, name: 'Português (Portugal)' }, |
|
ru: { resource: ru, name: 'Русский' }, |
|
th: { resource: th, name: 'ไทย' }, |
|
zh: { resource: zh, name: '简体中文' } |
|
} as const |
|
|
|
export type TLanguage = keyof typeof languages |
|
export const LocalizedLanguageNames: { [key in TLanguage]?: string } = {} |
|
const resources: { [key in TLanguage]?: Resource } = {} |
|
const supportedLanguages: TLanguage[] = [] |
|
for (const [key, value] of Object.entries(languages)) { |
|
const lang = key as TLanguage |
|
LocalizedLanguageNames[lang] = value.name |
|
resources[lang] = value.resource |
|
supportedLanguages.push(lang) |
|
} |
|
|
|
i18n |
|
.use(LanguageDetector) |
|
.use(initReactI18next) |
|
.init({ |
|
fallbackLng: 'en', |
|
resources, |
|
interpolation: { |
|
escapeValue: false // react already safes from xss |
|
}, |
|
detection: { |
|
convertDetectedLanguage: (lng) => { |
|
const supported = supportedLanguages.find((supported) => lng.startsWith(supported)) |
|
return supported || 'en' |
|
} |
|
} |
|
}) |
|
|
|
i18n.services.formatter?.add('date', (timestamp, lng) => { |
|
switch (lng) { |
|
case 'zh': |
|
case 'ja': |
|
return dayjs(timestamp).format('YYYY年MM月DD日') |
|
case 'pl': |
|
case 'de': |
|
case 'ru': |
|
return dayjs(timestamp).format('DD.MM.YYYY') |
|
case 'fa': |
|
return dayjs(timestamp).format('YYYY/MM/DD') |
|
case 'it': |
|
case 'es': |
|
case 'fr': |
|
case 'pt-BR': |
|
case 'pt-PT': |
|
case 'ar': |
|
case 'th': |
|
return dayjs(timestamp).format('DD/MM/YYYY') |
|
case 'ko': |
|
return dayjs(timestamp).format('YYYY년 MM월 DD일') |
|
default: |
|
return dayjs(timestamp).format('MMM D, YYYY') |
|
} |
|
}) |
|
|
|
export default i18n
|
|
|