83 lines
2.0 KiB
TypeScript
83 lines
2.0 KiB
TypeScript
import merge from 'deepmerge'
|
|
import i18n from 'i18n-js'
|
|
import moment from 'moment'
|
|
import 'moment/locale/ar'
|
|
import 'moment/locale/de'
|
|
import 'moment/locale/es'
|
|
import 'moment/locale/fi'
|
|
import 'moment/locale/fr'
|
|
import 'moment/locale/it'
|
|
import 'moment/locale/ja'
|
|
import 'moment/locale/nb'
|
|
import 'moment/locale/nl'
|
|
import 'moment/locale/pl'
|
|
import 'moment/locale/ru'
|
|
import 'moment/locale/sv'
|
|
import 'moment/locale/uz-latn'
|
|
import { I18nManager } from 'react-native'
|
|
|
|
const changeListeners: Record<string, any> = {}
|
|
|
|
let allString: Record<string, any> = {}
|
|
|
|
let Strings: Record<string, any> = {}
|
|
let languageCode: string
|
|
|
|
const rtlList: { [key: string]: boolean } = {
|
|
en: false,
|
|
de: false,
|
|
pl: false,
|
|
sv: false,
|
|
so: false,
|
|
ar: true,
|
|
}
|
|
|
|
export const isRTL = (langCode: string) => {
|
|
if (!Object.prototype.hasOwnProperty.call(rtlList, langCode)) {
|
|
return false
|
|
}
|
|
return rtlList[langCode]
|
|
}
|
|
|
|
export const LanguageService = {
|
|
get: () => Strings,
|
|
getLanguageCode: () => languageCode,
|
|
setAllData: ({ data }: { data: Record<string, any> }) => {
|
|
allString = data
|
|
},
|
|
seti18nConfig: ({ langCode }: { langCode?: string }) => {
|
|
i18n.defaultLocale = 'sv'
|
|
if (langCode) {
|
|
i18n.translations = { [langCode]: Strings }
|
|
i18n.locale = langCode
|
|
I18nManager.forceRTL(isRTL(langCode))
|
|
}
|
|
moment.locale(langCode)
|
|
},
|
|
setLanguageCode: ({ langCode }: { langCode?: string }) => {
|
|
if (langCode && allString[langCode]) {
|
|
languageCode = langCode
|
|
Strings = merge(allString.sv, allString[langCode])
|
|
} else {
|
|
const dataKeys = Object.keys(allString)
|
|
languageCode = dataKeys[0]
|
|
Strings = allString[languageCode]
|
|
}
|
|
Object.keys(changeListeners).forEach((k) => {
|
|
changeListeners[k](langCode)
|
|
})
|
|
return Strings
|
|
},
|
|
|
|
onChange: ({ key }: { key: string }, cb: (langCode: string) => void) => {
|
|
const unsubscribe = () => {
|
|
delete changeListeners[key]
|
|
}
|
|
changeListeners[key] = (langCode: string) => cb(langCode)
|
|
|
|
return unsubscribe
|
|
},
|
|
}
|
|
|
|
export const i18nService = i18n
|