106 lines
3.2 KiB
TypeScript
106 lines
3.2 KiB
TypeScript
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 hi from './locales/hi'
|
|
import hu from './locales/hu'
|
|
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'
|
|
import zh_TW from './locales/zh-TW'
|
|
|
|
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' },
|
|
hi: { resource: hi, name: 'हिन्दी' },
|
|
hu: { resource: hu, name: 'Magyar' },
|
|
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: '简体中文' },
|
|
'zh-TW': { resource: zh_TW, 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) => {
|
|
console.log('Detected language:', lng)
|
|
if (lng.startsWith('zh')) {
|
|
return ['zh', 'zh-CN', 'zh-SG'].includes(lng) ? 'zh' : 'zh-TW'
|
|
}
|
|
const supported = supportedLanguages.find((supported) => lng.startsWith(supported))
|
|
return supported || 'en'
|
|
}
|
|
}
|
|
})
|
|
|
|
i18n.services.formatter?.add('date', (timestamp, lng) => {
|
|
switch (lng) {
|
|
case 'zh':
|
|
case 'zh-TW':
|
|
case 'ja':
|
|
return dayjs(timestamp).format('YYYY年MM月DD日')
|
|
case 'pl':
|
|
case 'de':
|
|
case 'ru':
|
|
return dayjs(timestamp).format('DD.MM.YYYY')
|
|
case 'fa':
|
|
case 'hu':
|
|
return dayjs(timestamp).format('YYYY/MM/DD')
|
|
case 'it':
|
|
case 'es':
|
|
case 'fr':
|
|
case 'pt-BR':
|
|
case 'pt-PT':
|
|
case 'ar':
|
|
case 'hi':
|
|
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
|