Language on initial start now works. Also selected the best suited locale when not initially started

This commit is contained in:
Viktor Sarström 2021-04-16 21:46:18 +02:00
parent 31da188999
commit e14a52b0ab
5 changed files with 31 additions and 36 deletions

View File

@ -28,11 +28,7 @@ export default () => {
{...eva}
theme={{ ...eva.light, ...customization }}
>
<LanguageProvider
cache={true}
data={translations}
initalHasCheckedLanguage={false}
>
<LanguageProvider cache={true} data={translations}>
<AppNavigator />
</LanguageProvider>
{FullBlurView}

View File

@ -37,7 +37,8 @@ export const SetLanguage = () => {
}
const goBack = () => {
navigation.navigate('Login', { locale: LanguageService.getLanguageCode() })
// Need to reset the view so it updates the language
navigation.navigate('Login', { rand: Math.random() })
}
return (

View File

@ -3,6 +3,7 @@ import * as RNLocalize from 'react-native-localize'
import { LanguageService } from '../../services/languageService'
import { LanguageStorage } from '../../services/languageStorage'
import { translations } from '../../utils/translation'
export const LanguageContext = React.createContext({ Strings: {} })
@ -30,19 +31,19 @@ export const LanguageProvider: React.FC<Props> = ({
return data[initialLanguageCode]
}
let languageCode
let bestStrings
const localizes = RNLocalize.getLocales()
for (let i = 0; i < localizes.length; i++) {
const element = localizes[i]
if (data[element.languageCode]) {
bestStrings = data[element.languageCode]
languageCode = element.languageCode
break
}
}
const fallBack = { languageTag: 'sv' }
const { languageTag } =
RNLocalize.findBestAvailableLanguage(Object.keys(translations)) ||
fallBack
const bestStrings = data[languageTag]
console.log('LANGUAGE TAG', languageTag)
console.log('LANGUAGE BEST', bestStrings)
LanguageService.setLanguageCode({ langCode: languageTag })
LanguageService.seti18nConfig({ langCode: languageTag })
LanguageService.setLanguageCode({ langCode: languageCode })
return bestStrings
})
useEffect(() => {
@ -59,16 +60,14 @@ export const LanguageProvider: React.FC<Props> = ({
)
const checkLanguageLocal = async () => {
//setHasCheckedLanguage(false)
if (cache) {
const languageCode = await LanguageStorage.get()
if (languageCode) {
LanguageService.setLanguageCode({ langCode: languageCode })
LanguageService.seti18nConfig({ langCode: languageCode })
} else {
LanguageService.setLanguageCode({ langCode: initialLanguageCode })
LanguageService.seti18nConfig({ langCode: initialLanguageCode })
}
LanguageService.setLanguageCode({
langCode: languageCode || initialLanguageCode,
})
LanguageService.seti18nConfig({
langCode: languageCode || initialLanguageCode,
})
}
}
checkLanguageLocal()

View File

@ -7,6 +7,7 @@ export const useLanguage = () => {
const setLanguageCode = ({ languageCode }: { languageCode: string }) => {
LanguageService.setLanguageCode({ langCode: languageCode })
LanguageService.seti18nConfig({ langCode: languageCode })
}
return { Strings, setLanguageCode }

View File

@ -21,11 +21,13 @@ export const LanguageService = {
setAllData: ({ data }: { data: Record<string, any> }) => {
allString = data
},
seti18nConfig: ({ langCode }: { langCode: string }) => {
i18n.translations = { [langCode]: Strings }
i18n.locale = langCode
I18nManager.forceRTL(false)
seti18nConfig: ({ langCode }: { langCode?: string }) => {
if (langCode) {
i18n.translations = { [langCode]: Strings }
i18n.locale = langCode
}
I18nManager.forceRTL(false)
moment.locale(langCode)
},
setLanguageCode: ({ langCode }: { langCode?: string }) => {
@ -40,16 +42,12 @@ export const LanguageService = {
Object.keys(changeListeners).forEach((k) => {
changeListeners[k](langCode)
})
if (langCode) {
i18n.translations = { [langCode]: Strings }
i18n.locale = langCode
}
return Strings
},
// @ts-expect-error Fix later
// @ts-expect-error Fix later, Typecast callback
onChange: ({ key }: { key: string }, cb) => {
// @ts-expect-error Fix later
// @ts-expect-error Fix later, Typecast callback
changeListeners[`${key}`] = (langCode) => cb(langCode)
},
}