forked from mosip/inji-wallet
-
Notifications
You must be signed in to change notification settings - Fork 0
/
i18n.ts
97 lines (84 loc) · 2.92 KB
/
i18n.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import i18next from 'i18next';
import { locale } from 'expo-localization';
import { initReactI18next } from 'react-i18next';
import en from './locales/en.json';
import fil from './locales/fil.json';
import ar from './locales/ara.json';
import hi from './locales/hin.json';
import kn from './locales/kan.json';
import ta from './locales/tam.json';
import Storage from './shared/storage';
const resources = { en, fil, ar, hi, kn, ta };
import { iso6393To1 } from 'iso-639-3';
import { LocalizedField } from './types/vc';
const languageCodeMap = {};
export const SUPPORTED_LANGUAGES = {
en: 'English',
fil: 'Filipino',
ar: 'عربى',
hi: 'हिंदी',
kn: 'ಕನ್ನಡ',
ta: 'தமிழ்',
};
i18next
.use(initReactI18next)
.init({
compatibilityJSON: 'v3',
resources,
lng: getLanguageCode(locale),
fallbackLng: getLanguageCode,
supportedLngs: Object.keys(SUPPORTED_LANGUAGES),
})
.then(async () => {
const language = await Storage.getItem('language');
if (language !== i18next.language) {
i18next.changeLanguage(language);
populateLanguageCodeMap();
}
});
export default i18next;
function getLanguageCode(code: string) {
const [language] = code.split('-');
return language;
}
export function getVCDetailsForCurrentLanguage(locales) {
const currentLanguage = i18next.language;
const vcDetailsForCurrentLanguage = locales.filter(
(obj) => obj.language === languageCodeMap[currentLanguage]
);
return vcDetailsForCurrentLanguage[0]?.value
? vcDetailsForCurrentLanguage[0].value
: locales[0]?.value;
}
// This method gets the value from iso-639-3 package, which contains key value pairs of three letter language codes[key] and two letter langugae code[value]. These values are according to iso standards.
// The response received from the server is three letter language code and the value in the inji code base is two letter language code. Hence the conversion is done.
function getThreeLetterLanguageCode(twoLetterLanguageCode) {
return Object.keys(iso6393To1).find(
(key) => iso6393To1[key] === twoLetterLanguageCode
);
}
function populateLanguageCodeMap() {
const supportedLanguages = Object.keys(SUPPORTED_LANGUAGES);
supportedLanguages.forEach((languageCode) => {
let threeLetterLanguageCode = languageCode;
if (isTwoLetterLanguageCode(languageCode)) {
threeLetterLanguageCode = getThreeLetterLanguageCode(languageCode);
}
languageCodeMap[languageCode] = threeLetterLanguageCode;
});
}
export function getLocalizedField(rawField: string | LocalizedField[]) {
if (typeof rawField === 'string') {
return rawField;
}
try {
const locales: LocalizedField[] = JSON.parse(JSON.stringify(rawField));
if (locales.length == 1) return locales[0]?.value;
return getVCDetailsForCurrentLanguage(locales);
} catch (e) {
return '';
}
}
function isTwoLetterLanguageCode(languageCode) {
return languageCode.length == 2;
}