index.ts raw
1 import dayjs from 'dayjs'
2 import i18n, { Resource } from 'i18next'
3 import LanguageDetector from 'i18next-browser-languagedetector'
4 import { initReactI18next } from 'react-i18next'
5 import ar from './locales/ar'
6 import bg from './locales/bg'
7 import de from './locales/de'
8 import en from './locales/en'
9 import es from './locales/es'
10 import fa from './locales/fa'
11 import fr from './locales/fr'
12 import hi from './locales/hi'
13 import hr from './locales/hr'
14 import hu from './locales/hu'
15 import it from './locales/it'
16 import ja from './locales/ja'
17 import ko from './locales/ko'
18 import pl from './locales/pl'
19 import pt_BR from './locales/pt-BR'
20 import pt_PT from './locales/pt-PT'
21 import ru from './locales/ru'
22 import sr from './locales/sr'
23 import th from './locales/th'
24 import zh from './locales/zh'
25 import zh_TW from './locales/zh-TW'
26
27 const languages = {
28 ar: { resource: ar, name: 'العربية' },
29 bg: { resource: bg, name: 'Български' },
30 de: { resource: de, name: 'Deutsch' },
31 en: { resource: en, name: 'English' },
32 es: { resource: es, name: 'Español' },
33 fa: { resource: fa, name: 'فارسی' },
34 fr: { resource: fr, name: 'Français' },
35 hi: { resource: hi, name: 'हिन्दी' },
36 hr: { resource: hr, name: 'Hrvatski' },
37 hu: { resource: hu, name: 'Magyar' },
38 it: { resource: it, name: 'Italiano' },
39 ja: { resource: ja, name: '日本語' },
40 ko: { resource: ko, name: '한국어' },
41 pl: { resource: pl, name: 'Polski' },
42 'pt-BR': { resource: pt_BR, name: 'Português (Brasil)' },
43 'pt-PT': { resource: pt_PT, name: 'Português (Portugal)' },
44 ru: { resource: ru, name: 'Русский' },
45 sr: { resource: sr, name: 'Српски' },
46 th: { resource: th, name: 'ไทย' },
47 zh: { resource: zh, name: '简体中文' },
48 'zh-TW': { resource: zh_TW, name: '繁體中文' }
49 } as const
50
51 export type TLanguage = keyof typeof languages
52 export const LocalizedLanguageNames: { [key in TLanguage]?: string } = {}
53 const resources: { [key in TLanguage]?: Resource } = {}
54 const supportedLanguages: TLanguage[] = []
55 for (const [key, value] of Object.entries(languages)) {
56 const lang = key as TLanguage
57 LocalizedLanguageNames[lang] = value.name
58 resources[lang] = value.resource
59 supportedLanguages.push(lang)
60 }
61
62 i18n
63 .use(LanguageDetector)
64 .use(initReactI18next)
65 .init({
66 fallbackLng: 'en',
67 resources,
68 interpolation: {
69 escapeValue: false // react already safes from xss
70 },
71 detection: {
72 convertDetectedLanguage: (lng) => {
73 console.log('Detected language:', lng)
74 if (lng.startsWith('zh')) {
75 return ['zh', 'zh-CN', 'zh-SG'].includes(lng) ? 'zh' : 'zh-TW'
76 }
77 const supported = supportedLanguages.find((supported) => lng.startsWith(supported))
78 return supported || 'en'
79 }
80 }
81 })
82
83 i18n.services.formatter?.add('date', (timestamp, lng) => {
84 switch (lng) {
85 case 'zh':
86 case 'zh-TW':
87 case 'ja':
88 return dayjs(timestamp).format('YYYY年MM月DD日')
89 case 'bg':
90 case 'hr':
91 case 'pl':
92 case 'de':
93 case 'ru':
94 case 'sr':
95 return dayjs(timestamp).format('DD.MM.YYYY')
96 case 'fa':
97 case 'hu':
98 return dayjs(timestamp).format('YYYY/MM/DD')
99 case 'it':
100 case 'es':
101 case 'fr':
102 case 'pt-BR':
103 case 'pt-PT':
104 case 'ar':
105 case 'hi':
106 case 'th':
107 return dayjs(timestamp).format('DD/MM/YYYY')
108 case 'ko':
109 return dayjs(timestamp).format('YYYY년 MM월 DD일')
110 default:
111 return dayjs(timestamp).format('MMM D, YYYY')
112 }
113 })
114
115 export default i18n
116