Skip to content

Commit 04b58b7

Browse files
committed
fix: load intl polyfill locale data
1 parent a195eb7 commit 04b58b7

File tree

3 files changed

+111
-6
lines changed

3 files changed

+111
-6
lines changed

shim.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,22 @@ require('./src/polyfills/textdecoder-polyfill');
99
// RN still doesn't support full spec of Intl API
1010
// Don't remove -force from these because detection is VERY slow on low-end Android.
1111
// https://github.com/formatjs/formatjs/issues/4463#issuecomment-2176070577
12+
// we only load english locale data by default, other locales should be loaded after i18next initialized
1213
if (!Intl.Locale) {
1314
require('@formatjs/intl-locale/polyfill-force');
1415
}
1516
if (!NumberFormat.formatToParts) {
1617
require('@formatjs/intl-numberformat/polyfill-force');
1718
require('@formatjs/intl-numberformat/locale-data/en');
18-
require('@formatjs/intl-numberformat/locale-data/ru');
19+
NumberFormat.polyfilled = true;
1920
}
2021
if (!Intl.PluralRules) {
2122
require('@formatjs/intl-pluralrules/polyfill-force');
2223
require('@formatjs/intl-pluralrules/locale-data/en');
23-
require('@formatjs/intl-pluralrules/locale-data/ru');
2424
}
2525
if (!Intl.RelativeTimeFormat) {
2626
require('@formatjs/intl-relativetimeformat/polyfill-force');
2727
require('@formatjs/intl-relativetimeformat/locale-data/en');
28-
require('@formatjs/intl-relativetimeformat/locale-data/ru');
2928
}
3029

3130
if (!Symbol.asyncIterator) {

src/utils/i18n/index.ts

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
import i18n from 'i18next';
2-
import { initReactI18next } from 'react-i18next';
32
import ICU from 'i18next-icu';
3+
import { initReactI18next } from 'react-i18next';
44
import * as RNLocalize from 'react-native-localize';
55

66
import { __ENABLE_I18NEXT_DEBUGGER__ } from '../../constants/env';
7-
import locales from './locales';
87
import { dispatch } from '../../store/helpers';
98
import { updateUi } from '../../store/slices/ui';
109
import convert from './convert';
10+
import locales, {
11+
numberFormatPolyfills,
12+
pluralRulesPolyfills,
13+
relativeTimeFormatPolyfills,
14+
} from './locales';
1115

1216
const getDeviceLanguage = (): string => {
1317
const lang =
@@ -58,7 +62,27 @@ i18nICU
5862
}
5963
}
6064

61-
dispatch(updateUi({ timeZone, language: i18n.language }));
65+
dispatch(updateUi({ timeZone, language: i18nICU.language }));
66+
})
67+
.then(async () => {
68+
// we need to load language related polyfill data
69+
const lang = i18nICU.language;
70+
try {
71+
// @ts-ignore
72+
if (NumberFormat.polyfilled) {
73+
await numberFormatPolyfills[lang]?.();
74+
}
75+
// @ts-ignore
76+
if (Intl.PluralRules.polyfilled) {
77+
await pluralRulesPolyfills[lang]?.();
78+
}
79+
// @ts-ignore
80+
if (Intl.RelativeTimeFormat.polyfilled) {
81+
await relativeTimeFormatPolyfills[lang]?.();
82+
}
83+
} catch (e) {
84+
console.warn('Error loading polyfill for language: ', lang);
85+
}
6286
});
6387

6488
export default i18nICU;

src/utils/i18n/locales/index.ts

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,85 @@ export default {
4848
uk,
4949
yo,
5050
} as const;
51+
52+
export const numberFormatPolyfills = {
53+
arb: (): any => import('@formatjs/intl-numberformat/locale-data/ar'),
54+
ca: (): any => import('@formatjs/intl-numberformat/locale-data/ca'),
55+
cs: (): any => import('@formatjs/intl-numberformat/locale-data/cs'),
56+
de: (): any => import('@formatjs/intl-numberformat/locale-data/de'),
57+
el: (): any => import('@formatjs/intl-numberformat/locale-data/el'),
58+
es: (): any => import('@formatjs/intl-numberformat/locale-data/es'),
59+
'es-ES': (): any => import('@formatjs/intl-numberformat/locale-data/es'),
60+
'es-419': (): any => import('@formatjs/intl-numberformat/locale-data/es-419'),
61+
fa: (): any => import('@formatjs/intl-numberformat/locale-data/fa'),
62+
fr: (): any => import('@formatjs/intl-numberformat/locale-data/fr'),
63+
it: (): any => import('@formatjs/intl-numberformat/locale-data/it'),
64+
ja: (): any => import('@formatjs/intl-numberformat/locale-data/ja'),
65+
ko: (): any => import('@formatjs/intl-numberformat/locale-data/ko'),
66+
nl: (): any => import('@formatjs/intl-numberformat/locale-data/nl'),
67+
no: (): any => import('@formatjs/intl-numberformat/locale-data/no'),
68+
pl: (): any => import('@formatjs/intl-numberformat/locale-data/pl'),
69+
pt: (): any => import('@formatjs/intl-numberformat/locale-data/pt'),
70+
'pt-BR': (): any => import('@formatjs/intl-numberformat/locale-data/pt'),
71+
'pt-PT': (): any => import('@formatjs/intl-numberformat/locale-data/pt-PT'),
72+
ro: (): any => import('@formatjs/intl-numberformat/locale-data/ro'),
73+
ru: (): any => import('@formatjs/intl-numberformat/locale-data/ru'),
74+
uk: (): any => import('@formatjs/intl-numberformat/locale-data/uk'),
75+
yo: (): any => import('@formatjs/intl-numberformat/locale-data/yo'),
76+
};
77+
78+
export const pluralRulesPolyfills = {
79+
arb: (): any => import('@formatjs/intl-pluralrules/locale-data/ar'),
80+
ca: (): any => import('@formatjs/intl-pluralrules/locale-data/ca'),
81+
cs: (): any => import('@formatjs/intl-pluralrules/locale-data/cs'),
82+
de: (): any => import('@formatjs/intl-pluralrules/locale-data/de'),
83+
el: (): any => import('@formatjs/intl-pluralrules/locale-data/el'),
84+
es: (): any => import('@formatjs/intl-pluralrules/locale-data/es'),
85+
'es-ES': (): any => import('@formatjs/intl-pluralrules/locale-data/es'),
86+
'es-419': (): any => import('@formatjs/intl-pluralrules/locale-data/es'),
87+
fa: (): any => import('@formatjs/intl-pluralrules/locale-data/fa'),
88+
fr: (): any => import('@formatjs/intl-pluralrules/locale-data/fr'),
89+
it: (): any => import('@formatjs/intl-pluralrules/locale-data/it'),
90+
ja: (): any => import('@formatjs/intl-pluralrules/locale-data/ja'),
91+
ko: (): any => import('@formatjs/intl-pluralrules/locale-data/ko'),
92+
nl: (): any => import('@formatjs/intl-pluralrules/locale-data/nl'),
93+
no: (): any => import('@formatjs/intl-pluralrules/locale-data/no'),
94+
pl: (): any => import('@formatjs/intl-pluralrules/locale-data/pl'),
95+
pt: (): any => import('@formatjs/intl-pluralrules/locale-data/pt'),
96+
'pt-BR': (): any => import('@formatjs/intl-pluralrules/locale-data/pt'),
97+
'pt-PT': (): any => import('@formatjs/intl-pluralrules/locale-data/pt-PT'),
98+
ro: (): any => import('@formatjs/intl-pluralrules/locale-data/ro'),
99+
ru: (): any => import('@formatjs/intl-pluralrules/locale-data/ru'),
100+
uk: (): any => import('@formatjs/intl-pluralrules/locale-data/uk'),
101+
yo: (): any => import('@formatjs/intl-pluralrules/locale-data/yo'),
102+
};
103+
104+
export const relativeTimeFormatPolyfills = {
105+
arb: (): any => import('@formatjs/intl-relativetimeformat/locale-data/ar'),
106+
ca: (): any => import('@formatjs/intl-relativetimeformat/locale-data/ca'),
107+
cs: (): any => import('@formatjs/intl-relativetimeformat/locale-data/cs'),
108+
de: (): any => import('@formatjs/intl-relativetimeformat/locale-data/de'),
109+
el: (): any => import('@formatjs/intl-relativetimeformat/locale-data/el'),
110+
es: (): any => import('@formatjs/intl-relativetimeformat/locale-data/es'),
111+
'es-ES': (): any =>
112+
import('@formatjs/intl-relativetimeformat/locale-data/es'),
113+
'es-419': (): any =>
114+
import('@formatjs/intl-relativetimeformat/locale-data/es-419'),
115+
fa: (): any => import('@formatjs/intl-relativetimeformat/locale-data/fa'),
116+
fr: (): any => import('@formatjs/intl-relativetimeformat/locale-data/fr'),
117+
it: (): any => import('@formatjs/intl-relativetimeformat/locale-data/it'),
118+
ja: (): any => import('@formatjs/intl-relativetimeformat/locale-data/ja'),
119+
ko: (): any => import('@formatjs/intl-relativetimeformat/locale-data/ko'),
120+
nl: (): any => import('@formatjs/intl-relativetimeformat/locale-data/nl'),
121+
no: (): any => import('@formatjs/intl-relativetimeformat/locale-data/no'),
122+
pl: (): any => import('@formatjs/intl-relativetimeformat/locale-data/pl'),
123+
pt: (): any => import('@formatjs/intl-relativetimeformat/locale-data/pt'),
124+
'pt-BR': (): any =>
125+
import('@formatjs/intl-relativetimeformat/locale-data/pt'),
126+
'pt-PT': (): any =>
127+
import('@formatjs/intl-relativetimeformat/locale-data/pt-PT'),
128+
ro: (): any => import('@formatjs/intl-relativetimeformat/locale-data/ro'),
129+
ru: (): any => import('@formatjs/intl-relativetimeformat/locale-data/ru'),
130+
uk: (): any => import('@formatjs/intl-relativetimeformat/locale-data/uk'),
131+
yo: (): any => import('@formatjs/intl-relativetimeformat/locale-data/yo'),
132+
};

0 commit comments

Comments
 (0)