fix: 🐛 fix crash when moment locale and language code differ

This commit is contained in:
Kajetan Kazimierczak 2021-11-18 00:54:57 +01:00
parent d1582956d1
commit 623bf483b5
3 changed files with 28 additions and 8 deletions

View File

@ -104,7 +104,7 @@ export const Day = ({ weekDay, lunch, lessons }: DayProps) => {
} }
export const Week = ({ child }: WeekProps) => { export const Week = ({ child }: WeekProps) => {
moment.locale(LanguageService.getLanguageCode()) moment.locale(LanguageService.getLocale())
const days = moment.weekdaysShort().slice(1, 6) const days = moment.weekdaysShort().slice(1, 6)
const currentDayIndex = Math.min(moment().isoWeekday() - 1, 5) const currentDayIndex = Math.min(moment().isoWeekday() - 1, 5)
const [selectedIndex, setSelectedIndex] = useState(currentDayIndex) const [selectedIndex, setSelectedIndex] = useState(currentDayIndex)

View File

@ -16,6 +16,7 @@ import 'moment/locale/ru'
import 'moment/locale/sv' import 'moment/locale/sv'
import 'moment/locale/zh-cn' import 'moment/locale/zh-cn'
import { I18nManager } from 'react-native' import { I18nManager } from 'react-native'
import { languages } from '../utils/translation'
const changeListeners: Record<string, any> = {} const changeListeners: Record<string, any> = {}
@ -23,6 +24,7 @@ let allString: Record<string, any> = {}
let Strings: Record<string, any> = {} let Strings: Record<string, any> = {}
let languageCode: string let languageCode: string
let momentLocale: string
const rtlList: { [key: string]: boolean } = { const rtlList: { [key: string]: boolean } = {
en: false, en: false,
@ -40,17 +42,15 @@ export const isRTL = (langCode: string) => {
return rtlList[langCode] return rtlList[langCode]
} }
const getCorrespondingMomentLocale = (langCode?: string): string => { const getCorrespondingMomentLocale = (languageCode?: string): string => {
if (langCode === 'la') return 'sv' const lang = languages.find(({ langCode }) => langCode === languageCode)
if (langCode === 'so') return 'sv' return lang?.locale || 'sv'
if (langCode === 'nb_NO') return 'nb'
if (langCode === 'zh_Hant' || langCode === 'zh_Hans') return 'zh-cn'
return langCode!
} }
export const LanguageService = { export const LanguageService = {
get: () => Strings, get: () => Strings,
getLanguageCode: () => languageCode, getLanguageCode: () => languageCode,
getLocale: () => momentLocale,
setAllData: ({ data }: { data: Record<string, any> }) => { setAllData: ({ data }: { data: Record<string, any> }) => {
allString = data allString = data
}, },
@ -61,11 +61,12 @@ export const LanguageService = {
i18n.locale = langCode i18n.locale = langCode
I18nManager.forceRTL(isRTL(langCode)) I18nManager.forceRTL(isRTL(langCode))
} }
moment.locale(getCorrespondingMomentLocale(langCode)) moment.locale(momentLocale)
}, },
setLanguageCode: ({ langCode }: { langCode?: string }) => { setLanguageCode: ({ langCode }: { langCode?: string }) => {
if (langCode && allString[langCode]) { if (langCode && allString[langCode]) {
languageCode = langCode languageCode = langCode
momentLocale = getCorrespondingMomentLocale(langCode)
Strings = merge(allString.sv, allString[langCode]) Strings = merge(allString.sv, allString[langCode])
} else { } else {
const dataKeys = Object.keys(allString) const dataKeys = Object.keys(allString)

View File

@ -4,6 +4,7 @@ interface Language {
langCode: string langCode: string
languageName: string languageName: string
languageLocalName: string languageLocalName: string
locale: string
active: boolean active: boolean
} }
@ -12,36 +13,42 @@ export const languages: Language[] = [
langCode: 'sv', langCode: 'sv',
languageName: 'Swedish', languageName: 'Swedish',
languageLocalName: 'Svenska', languageLocalName: 'Svenska',
locale: 'sv',
active: true, active: true,
}, },
{ {
langCode: 'ar', langCode: 'ar',
languageName: 'Arabic', languageName: 'Arabic',
languageLocalName: 'اَلْعَرَبِيَّةُ', languageLocalName: 'اَلْعَرَبِيَّةُ',
locale: 'ar',
active: true, active: true,
}, },
{ {
langCode: 'zh_Hant', langCode: 'zh_Hant',
languageName: 'Chinese (traditional)', languageName: 'Chinese (traditional)',
languageLocalName: '中國傳統的', languageLocalName: '中國傳統的',
locale: 'zh-cn',
active: true, active: true,
}, },
{ {
langCode: 'zh_Hans', langCode: 'zh_Hans',
languageName: 'Chinese (simplified)', languageName: 'Chinese (simplified)',
languageLocalName: '简体中文', languageLocalName: '简体中文',
locale: 'zh-cn',
active: true, active: true,
}, },
{ {
langCode: 'nl', langCode: 'nl',
languageName: 'Dutch', languageName: 'Dutch',
languageLocalName: 'Nederlands', languageLocalName: 'Nederlands',
locale: 'nl',
active: true, active: true,
}, },
{ {
langCode: 'en', langCode: 'en',
languageName: 'English', languageName: 'English',
languageLocalName: 'English', languageLocalName: 'English',
locale: 'en',
active: true, active: true,
}, },
@ -49,6 +56,7 @@ export const languages: Language[] = [
langCode: 'de', langCode: 'de',
languageName: 'German', languageName: 'German',
languageLocalName: 'Deutsch', languageLocalName: 'Deutsch',
locale: 'de',
active: true, active: true,
}, },
@ -56,66 +64,77 @@ export const languages: Language[] = [
langCode: 'fi', langCode: 'fi',
languageName: 'Finnish', languageName: 'Finnish',
languageLocalName: 'Suomi', languageLocalName: 'Suomi',
locale: 'fi',
active: true, active: true,
}, },
{ {
langCode: 'fr', langCode: 'fr',
languageName: 'French', languageName: 'French',
languageLocalName: 'Français', languageLocalName: 'Français',
locale: 'fr',
active: true, active: true,
}, },
{ {
langCode: 'it', langCode: 'it',
languageName: 'Italian', languageName: 'Italian',
languageLocalName: 'Italiano', languageLocalName: 'Italiano',
locale: 'it',
active: true, active: true,
}, },
{ {
langCode: 'ja', langCode: 'ja',
languageName: 'Japanese', languageName: 'Japanese',
languageLocalName: '日本語', languageLocalName: '日本語',
locale: 'ja',
active: true, active: true,
}, },
{ {
langCode: 'la', langCode: 'la',
languageName: 'Latin', languageName: 'Latin',
languageLocalName: 'Latina', languageLocalName: 'Latina',
locale: 'sv',
active: true, active: true,
}, },
{ {
langCode: 'nb_NO', langCode: 'nb_NO',
languageName: 'Norwegian Bokmål', languageName: 'Norwegian Bokmål',
languageLocalName: 'Norsk bokmål', languageLocalName: 'Norsk bokmål',
locale: 'nb',
active: true, active: true,
}, },
{ {
langCode: 'pl', langCode: 'pl',
languageName: 'Polish', languageName: 'Polish',
languageLocalName: 'Polski', languageLocalName: 'Polski',
locale: 'pl',
active: true, active: true,
}, },
{ {
langCode: 'pt', langCode: 'pt',
languageName: 'Portuguese', languageName: 'Portuguese',
languageLocalName: 'Português', languageLocalName: 'Português',
locale: 'pt',
active: true, active: true,
}, },
{ {
langCode: 'ru', langCode: 'ru',
languageName: 'Russian', languageName: 'Russian',
languageLocalName: 'русский', languageLocalName: 'русский',
locale: 'ru',
active: false, active: false,
}, },
{ {
langCode: 'so', langCode: 'so',
languageName: 'Somali', languageName: 'Somali',
languageLocalName: 'af-Soomaali', languageLocalName: 'af-Soomaali',
locale: 'sv',
active: true, active: true,
}, },
{ {
langCode: 'es', langCode: 'es',
languageName: 'Spanish', languageName: 'Spanish',
languageLocalName: 'Español', languageLocalName: 'Español',
locale: 'es',
active: true, active: true,
}, },
] ]