forked from
jollywhoppers.com/witchsky.app
Bluesky app fork with some witchin' additions 馃挮
1// Don't remove -force from these because detection is VERY slow on low-end Android.
2// https://github.com/formatjs/formatjs/issues/4463#issuecomment-2176070577
3import '@formatjs/intl-locale/polyfill-force'
4import '@formatjs/intl-pluralrules/polyfill-force'
5import '@formatjs/intl-numberformat/polyfill-force'
6import '@formatjs/intl-displaynames/polyfill-force'
7import '@formatjs/intl-pluralrules/locale-data/en'
8import '@formatjs/intl-numberformat/locale-data/en'
9import '@formatjs/intl-displaynames/locale-data/en'
10
11import {useEffect, useState} from 'react'
12import {i18n} from '@lingui/core'
13import defaultLocale from 'date-fns/locale/en-US'
14
15import {sanitizeAppLanguageSetting} from '#/locale/helpers'
16import {AppLanguage} from '#/locale/languages'
17import {applyPostReplacements} from '#/locale/linguiHook'
18import {messages as messagesAn} from '#/locale/locales/an/messages'
19import {messages as messagesAst} from '#/locale/locales/ast/messages'
20import {messages as messagesCa} from '#/locale/locales/ca/messages'
21import {messages as messagesCy} from '#/locale/locales/cy/messages'
22import {messages as messagesDa} from '#/locale/locales/da/messages'
23import {messages as messagesDe} from '#/locale/locales/de/messages'
24import {messages as messagesEl} from '#/locale/locales/el/messages'
25import {messages as messagesEn} from '#/locale/locales/en/messages'
26import {messages as messagesEn_GB} from '#/locale/locales/en-GB/messages'
27import {messages as messagesEo} from '#/locale/locales/eo/messages'
28import {messages as messagesEs} from '#/locale/locales/es/messages'
29import {messages as messagesEu} from '#/locale/locales/eu/messages'
30import {messages as messagesFi} from '#/locale/locales/fi/messages'
31import {messages as messagesFr} from '#/locale/locales/fr/messages'
32import {messages as messagesFy} from '#/locale/locales/fy/messages'
33import {messages as messagesGa} from '#/locale/locales/ga/messages'
34import {messages as messagesGd} from '#/locale/locales/gd/messages'
35import {messages as messagesGl} from '#/locale/locales/gl/messages'
36import {messages as messagesHi} from '#/locale/locales/hi/messages'
37import {messages as messagesHu} from '#/locale/locales/hu/messages'
38import {messages as messagesIa} from '#/locale/locales/ia/messages'
39import {messages as messagesId} from '#/locale/locales/id/messages'
40import {messages as messagesIt} from '#/locale/locales/it/messages'
41import {messages as messagesJa} from '#/locale/locales/ja/messages'
42import {messages as messagesKm} from '#/locale/locales/km/messages'
43import {messages as messagesKo} from '#/locale/locales/ko/messages'
44import {messages as messagesNe} from '#/locale/locales/ne/messages'
45import {messages as messagesNl} from '#/locale/locales/nl/messages'
46import {messages as messagesPl} from '#/locale/locales/pl/messages'
47import {messages as messagesPt_BR} from '#/locale/locales/pt-BR/messages'
48import {messages as messagesPt_PT} from '#/locale/locales/pt-PT/messages'
49import {messages as messagesRo} from '#/locale/locales/ro/messages'
50import {messages as messagesRu} from '#/locale/locales/ru/messages'
51import {messages as messagesSv} from '#/locale/locales/sv/messages'
52import {messages as messagesTh} from '#/locale/locales/th/messages'
53import {messages as messagesTr} from '#/locale/locales/tr/messages'
54import {messages as messagesUk} from '#/locale/locales/uk/messages'
55import {messages as messagesVi} from '#/locale/locales/vi/messages'
56import {messages as messagesZh_CN} from '#/locale/locales/zh-CN/messages'
57import {messages as messagesZh_HK} from '#/locale/locales/zh-HK/messages'
58import {messages as messagesZh_TW} from '#/locale/locales/zh-TW/messages'
59import {useLanguagePrefs} from '#/state/preferences'
60
61/**
62 * We do a dynamic import of just the catalog that we need
63 */
64export async function dynamicActivate(locale: AppLanguage) {
65 switch (locale) {
66 case AppLanguage.an: {
67 i18n.loadAndActivate({locale, messages: messagesAn})
68 const [{default: dateLocale}] = await Promise.all([
69 import('date-fns/locale/es'),
70 import('@formatjs/intl-pluralrules/locale-data/an'),
71 import('@formatjs/intl-numberformat/locale-data/es'),
72 import('@formatjs/intl-displaynames/locale-data/es'),
73 ])
74 return dateLocale
75 }
76 case AppLanguage.ast: {
77 i18n.loadAndActivate({locale, messages: messagesAst})
78 const [{default: dateLocale}] = await Promise.all([
79 import('date-fns/locale/es'),
80 import('@formatjs/intl-pluralrules/locale-data/ast'),
81 import('@formatjs/intl-numberformat/locale-data/ast'),
82 import('@formatjs/intl-displaynames/locale-data/ast'),
83 ])
84 return dateLocale
85 }
86 case AppLanguage.ca: {
87 i18n.loadAndActivate({locale, messages: messagesCa})
88 const [{default: dateLocale}] = await Promise.all([
89 import('date-fns/locale/ca'),
90 import('@formatjs/intl-pluralrules/locale-data/ca'),
91 import('@formatjs/intl-numberformat/locale-data/ca'),
92 import('@formatjs/intl-displaynames/locale-data/ca'),
93 ])
94 return dateLocale
95 }
96 case AppLanguage.cy: {
97 i18n.loadAndActivate({locale, messages: messagesCy})
98 const [{default: dateLocale}] = await Promise.all([
99 import('date-fns/locale/cy'),
100 import('@formatjs/intl-pluralrules/locale-data/cy'),
101 import('@formatjs/intl-numberformat/locale-data/cy'),
102 import('@formatjs/intl-displaynames/locale-data/cy'),
103 ])
104 return dateLocale
105 }
106 case AppLanguage.da: {
107 i18n.loadAndActivate({locale, messages: messagesDa})
108 const [{default: dateLocale}] = await Promise.all([
109 import('date-fns/locale/da'),
110 import('@formatjs/intl-pluralrules/locale-data/da'),
111 import('@formatjs/intl-numberformat/locale-data/da'),
112 import('@formatjs/intl-displaynames/locale-data/da'),
113 ])
114 return dateLocale
115 }
116 case AppLanguage.de: {
117 i18n.loadAndActivate({locale, messages: messagesDe})
118 const [{default: dateLocale}] = await Promise.all([
119 import('date-fns/locale/de'),
120 import('@formatjs/intl-pluralrules/locale-data/de'),
121 import('@formatjs/intl-numberformat/locale-data/de'),
122 import('@formatjs/intl-displaynames/locale-data/de'),
123 ])
124 return dateLocale
125 }
126 case AppLanguage.el: {
127 i18n.loadAndActivate({locale, messages: messagesEl})
128 const [{default: dateLocale}] = await Promise.all([
129 import('date-fns/locale/el'),
130 import('@formatjs/intl-pluralrules/locale-data/el'),
131 import('@formatjs/intl-numberformat/locale-data/el'),
132 import('@formatjs/intl-displaynames/locale-data/el'),
133 ])
134 return dateLocale
135 }
136 case AppLanguage.en_GB: {
137 const transformedMsgs = applyPostReplacements(messagesEn_GB, locale)
138 i18n.loadAndActivate({locale, messages: transformedMsgs})
139 const [{default: dateLocale}] = await Promise.all([
140 import('date-fns/locale/en-GB'),
141 import('@formatjs/intl-pluralrules/locale-data/en'),
142 import('@formatjs/intl-numberformat/locale-data/en-GB'),
143 import('@formatjs/intl-displaynames/locale-data/en-GB'),
144 ])
145 return dateLocale
146 }
147 case AppLanguage.eo: {
148 i18n.loadAndActivate({locale, messages: messagesEo})
149 const [{default: dateLocale}] = await Promise.all([
150 import('date-fns/locale/eo'),
151 import('@formatjs/intl-pluralrules/locale-data/eo'),
152 import('@formatjs/intl-numberformat/locale-data/eo'),
153 // borked, see https://github.com/bluesky-social/social-app/pull/9574
154 // import('@formatjs/intl-displaynames/locale-data/eo'),
155 ])
156 return dateLocale
157 }
158 case AppLanguage.es: {
159 i18n.loadAndActivate({locale, messages: messagesEs})
160 const [{default: dateLocale}] = await Promise.all([
161 import('date-fns/locale/es'),
162 import('@formatjs/intl-pluralrules/locale-data/es'),
163 import('@formatjs/intl-numberformat/locale-data/es'),
164 import('@formatjs/intl-displaynames/locale-data/es'),
165 ])
166 return dateLocale
167 }
168 case AppLanguage.eu: {
169 i18n.loadAndActivate({locale, messages: messagesEu})
170 const [{default: dateLocale}] = await Promise.all([
171 import('date-fns/locale/eu'),
172 import('@formatjs/intl-pluralrules/locale-data/eu'),
173 import('@formatjs/intl-numberformat/locale-data/eu'),
174 import('@formatjs/intl-displaynames/locale-data/eu'),
175 ])
176 return dateLocale
177 }
178 case AppLanguage.fi: {
179 i18n.loadAndActivate({locale, messages: messagesFi})
180 const [{default: dateLocale}] = await Promise.all([
181 import('date-fns/locale/fi'),
182 import('@formatjs/intl-pluralrules/locale-data/fi'),
183 import('@formatjs/intl-numberformat/locale-data/fi'),
184 import('@formatjs/intl-displaynames/locale-data/fi'),
185 ])
186 return dateLocale
187 }
188 case AppLanguage.fr: {
189 i18n.loadAndActivate({locale, messages: messagesFr})
190 const [{default: dateLocale}] = await Promise.all([
191 import('date-fns/locale/fr'),
192 import('@formatjs/intl-pluralrules/locale-data/fr'),
193 import('@formatjs/intl-numberformat/locale-data/fr'),
194 import('@formatjs/intl-displaynames/locale-data/fr'),
195 ])
196 return dateLocale
197 }
198 case AppLanguage.fy: {
199 i18n.loadAndActivate({locale, messages: messagesFy})
200 const [{default: dateLocale}] = await Promise.all([
201 import('date-fns/locale/fy'),
202 import('@formatjs/intl-pluralrules/locale-data/fy'),
203 import('@formatjs/intl-numberformat/locale-data/fy'),
204 import('@formatjs/intl-displaynames/locale-data/fy'),
205 ])
206 return dateLocale
207 }
208 case AppLanguage.ga: {
209 i18n.loadAndActivate({locale, messages: messagesGa})
210 await Promise.all([
211 import('@formatjs/intl-pluralrules/locale-data/ga'),
212 import('@formatjs/intl-numberformat/locale-data/ga'),
213 import('@formatjs/intl-displaynames/locale-data/ga'),
214 ])
215 return undefined
216 }
217 case AppLanguage.gd: {
218 i18n.loadAndActivate({locale, messages: messagesGd})
219 const [{default: dateLocale}] = await Promise.all([
220 import('date-fns/locale/gd'),
221 import('@formatjs/intl-pluralrules/locale-data/gd'),
222 import('@formatjs/intl-numberformat/locale-data/gd'),
223 import('@formatjs/intl-displaynames/locale-data/gd'),
224 ])
225 return dateLocale
226 }
227 case AppLanguage.gl: {
228 i18n.loadAndActivate({locale, messages: messagesGl})
229 const [{default: dateLocale}] = await Promise.all([
230 import('date-fns/locale/gl'),
231 import('@formatjs/intl-pluralrules/locale-data/gl'),
232 import('@formatjs/intl-numberformat/locale-data/gl'),
233 import('@formatjs/intl-displaynames/locale-data/gl'),
234 ])
235 return dateLocale
236 }
237 case AppLanguage.hi: {
238 i18n.loadAndActivate({locale, messages: messagesHi})
239 const [{default: dateLocale}] = await Promise.all([
240 import('date-fns/locale/hi'),
241 import('@formatjs/intl-pluralrules/locale-data/hi'),
242 import('@formatjs/intl-numberformat/locale-data/hi'),
243 import('@formatjs/intl-displaynames/locale-data/hi'),
244 ])
245 return dateLocale
246 }
247 case AppLanguage.hu: {
248 i18n.loadAndActivate({locale, messages: messagesHu})
249 const [{default: dateLocale}] = await Promise.all([
250 import('date-fns/locale/hu'),
251 import('@formatjs/intl-pluralrules/locale-data/hu'),
252 import('@formatjs/intl-numberformat/locale-data/hu'),
253 import('@formatjs/intl-displaynames/locale-data/hu'),
254 ])
255 return dateLocale
256 }
257 case AppLanguage.ia: {
258 i18n.loadAndActivate({locale, messages: messagesIa})
259 await Promise.all([
260 import('@formatjs/intl-pluralrules/locale-data/ia'),
261 import('@formatjs/intl-numberformat/locale-data/ia'),
262 import('@formatjs/intl-displaynames/locale-data/ia'),
263 ])
264 return undefined
265 }
266 case AppLanguage.id: {
267 i18n.loadAndActivate({locale, messages: messagesId})
268 const [{default: dateLocale}] = await Promise.all([
269 import('date-fns/locale/id'),
270 import('@formatjs/intl-pluralrules/locale-data/id'),
271 import('@formatjs/intl-numberformat/locale-data/id'),
272 import('@formatjs/intl-displaynames/locale-data/id'),
273 ])
274 return dateLocale
275 }
276 case AppLanguage.it: {
277 i18n.loadAndActivate({locale, messages: messagesIt})
278 const [{default: dateLocale}] = await Promise.all([
279 import('date-fns/locale/it'),
280 import('@formatjs/intl-pluralrules/locale-data/it'),
281 import('@formatjs/intl-numberformat/locale-data/it'),
282 import('@formatjs/intl-displaynames/locale-data/it'),
283 ])
284 return dateLocale
285 }
286 case AppLanguage.ja: {
287 i18n.loadAndActivate({locale, messages: messagesJa})
288 const [{default: dateLocale}] = await Promise.all([
289 import('date-fns/locale/ja'),
290 import('@formatjs/intl-pluralrules/locale-data/ja'),
291 import('@formatjs/intl-numberformat/locale-data/ja'),
292 import('@formatjs/intl-displaynames/locale-data/ja'),
293 ])
294 return dateLocale
295 }
296 case AppLanguage.km: {
297 i18n.loadAndActivate({locale, messages: messagesKm})
298 const [{default: dateLocale}] = await Promise.all([
299 import('date-fns/locale/km'),
300 import('@formatjs/intl-pluralrules/locale-data/km'),
301 import('@formatjs/intl-numberformat/locale-data/km'),
302 import('@formatjs/intl-displaynames/locale-data/km'),
303 ])
304 return dateLocale
305 }
306 case AppLanguage.ko: {
307 i18n.loadAndActivate({locale, messages: messagesKo})
308 const [{default: dateLocale}] = await Promise.all([
309 import('date-fns/locale/ko'),
310 import('@formatjs/intl-pluralrules/locale-data/ko'),
311 import('@formatjs/intl-numberformat/locale-data/ko'),
312 import('@formatjs/intl-displaynames/locale-data/ko'),
313 ])
314 return dateLocale
315 }
316 case AppLanguage.ne: {
317 i18n.loadAndActivate({locale, messages: messagesNe})
318 await Promise.all([
319 import('@formatjs/intl-pluralrules/locale-data/ne'),
320 import('@formatjs/intl-numberformat/locale-data/ne'),
321 import('@formatjs/intl-displaynames/locale-data/ne'),
322 ])
323 return undefined
324 }
325 case AppLanguage.nl: {
326 i18n.loadAndActivate({locale, messages: messagesNl})
327 const [{default: dateLocale}] = await Promise.all([
328 import('date-fns/locale/nl'),
329 import('@formatjs/intl-pluralrules/locale-data/nl'),
330 import('@formatjs/intl-numberformat/locale-data/nl'),
331 import('@formatjs/intl-displaynames/locale-data/nl'),
332 ])
333 return dateLocale
334 }
335 case AppLanguage.pl: {
336 i18n.loadAndActivate({locale, messages: messagesPl})
337 const [{default: dateLocale}] = await Promise.all([
338 import('date-fns/locale/pl'),
339 import('@formatjs/intl-pluralrules/locale-data/pl'),
340 import('@formatjs/intl-numberformat/locale-data/pl'),
341 import('@formatjs/intl-displaynames/locale-data/pl'),
342 ])
343 return dateLocale
344 }
345 case AppLanguage.pt_BR: {
346 i18n.loadAndActivate({locale, messages: messagesPt_BR})
347 const [{default: dateLocale}] = await Promise.all([
348 import('date-fns/locale/pt-BR'),
349 import('@formatjs/intl-pluralrules/locale-data/pt'),
350 import('@formatjs/intl-numberformat/locale-data/pt'),
351 import('@formatjs/intl-displaynames/locale-data/pt'),
352 ])
353 return dateLocale
354 }
355 case AppLanguage.pt_PT: {
356 i18n.loadAndActivate({locale, messages: messagesPt_PT})
357 const [{default: dateLocale}] = await Promise.all([
358 import('date-fns/locale/pt'),
359 import('@formatjs/intl-pluralrules/locale-data/pt-PT'),
360 import('@formatjs/intl-numberformat/locale-data/pt-PT'),
361 import('@formatjs/intl-displaynames/locale-data/pt-PT'),
362 ])
363 return dateLocale
364 }
365 case AppLanguage.ro: {
366 i18n.loadAndActivate({locale, messages: messagesRo})
367 const [{default: dateLocale}] = await Promise.all([
368 import('date-fns/locale/ro'),
369 import('@formatjs/intl-pluralrules/locale-data/ro'),
370 import('@formatjs/intl-numberformat/locale-data/ro'),
371 import('@formatjs/intl-displaynames/locale-data/ro'),
372 ])
373 return dateLocale
374 }
375 case AppLanguage.ru: {
376 i18n.loadAndActivate({locale, messages: messagesRu})
377 const [{default: dateLocale}] = await Promise.all([
378 import('date-fns/locale/ru'),
379 import('@formatjs/intl-pluralrules/locale-data/ru'),
380 import('@formatjs/intl-numberformat/locale-data/ru'),
381 import('@formatjs/intl-displaynames/locale-data/ru'),
382 ])
383 return dateLocale
384 }
385 case AppLanguage.sv: {
386 i18n.loadAndActivate({locale, messages: messagesSv})
387 const [{default: dateLocale}] = await Promise.all([
388 import('date-fns/locale/sv'),
389 import('@formatjs/intl-pluralrules/locale-data/sv'),
390 import('@formatjs/intl-numberformat/locale-data/sv'),
391 import('@formatjs/intl-displaynames/locale-data/sv'),
392 ])
393 return dateLocale
394 }
395 case AppLanguage.th: {
396 i18n.loadAndActivate({locale, messages: messagesTh})
397 const [{default: dateLocale}] = await Promise.all([
398 import('date-fns/locale/th'),
399 import('@formatjs/intl-pluralrules/locale-data/th'),
400 import('@formatjs/intl-numberformat/locale-data/th'),
401 import('@formatjs/intl-displaynames/locale-data/th'),
402 ])
403 return dateLocale
404 }
405 case AppLanguage.tr: {
406 i18n.loadAndActivate({locale, messages: messagesTr})
407 const [{default: dateLocale}] = await Promise.all([
408 import('date-fns/locale/tr'),
409 import('@formatjs/intl-pluralrules/locale-data/tr'),
410 import('@formatjs/intl-numberformat/locale-data/tr'),
411 import('@formatjs/intl-displaynames/locale-data/tr'),
412 ])
413 return dateLocale
414 }
415 case AppLanguage.uk: {
416 i18n.loadAndActivate({locale, messages: messagesUk})
417 const [{default: dateLocale}] = await Promise.all([
418 import('date-fns/locale/uk'),
419 import('@formatjs/intl-pluralrules/locale-data/uk'),
420 import('@formatjs/intl-numberformat/locale-data/uk'),
421 import('@formatjs/intl-displaynames/locale-data/uk'),
422 ])
423 return dateLocale
424 }
425 case AppLanguage.vi: {
426 i18n.loadAndActivate({locale, messages: messagesVi})
427 const [{default: dateLocale}] = await Promise.all([
428 import('date-fns/locale/vi'),
429 import('@formatjs/intl-pluralrules/locale-data/vi'),
430 import('@formatjs/intl-numberformat/locale-data/vi'),
431 import('@formatjs/intl-displaynames/locale-data/vi'),
432 ])
433 return dateLocale
434 }
435 case AppLanguage.zh_CN: {
436 i18n.loadAndActivate({locale, messages: messagesZh_CN})
437 const [{default: dateLocale}] = await Promise.all([
438 import('date-fns/locale/zh-CN'),
439 import('@formatjs/intl-pluralrules/locale-data/zh'),
440 import('@formatjs/intl-numberformat/locale-data/zh'),
441 import('@formatjs/intl-displaynames/locale-data/zh'),
442 ])
443 return dateLocale
444 }
445 case AppLanguage.zh_HK: {
446 i18n.loadAndActivate({locale, messages: messagesZh_HK})
447 const [{default: dateLocale}] = await Promise.all([
448 import('date-fns/locale/zh-HK'),
449 import('@formatjs/intl-pluralrules/locale-data/zh'),
450 import('@formatjs/intl-numberformat/locale-data/zh'),
451 import('@formatjs/intl-displaynames/locale-data/zh'),
452 ])
453 return dateLocale
454 }
455 case AppLanguage.zh_TW: {
456 i18n.loadAndActivate({locale, messages: messagesZh_TW})
457 const [{default: dateLocale}] = await Promise.all([
458 import('date-fns/locale/zh-TW'),
459 import('@formatjs/intl-pluralrules/locale-data/zh'),
460 import('@formatjs/intl-numberformat/locale-data/zh'),
461 ])
462 return dateLocale
463 }
464 default: {
465 const transformedMsgs = applyPostReplacements(messagesEn, locale)
466 i18n.loadAndActivate({locale, messages: transformedMsgs})
467 return defaultLocale
468 }
469 }
470}
471
472export function useLocaleLanguage() {
473 const {appLanguage} = useLanguagePrefs()
474 const [dateLocale, setDateLocale] = useState(defaultLocale)
475
476 useEffect(() => {
477 dynamicActivate(sanitizeAppLanguageSetting(appLanguage)).then(locale => {
478 setDateLocale(locale ?? defaultLocale)
479 })
480 }, [appLanguage])
481
482 return dateLocale
483}