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