Bluesky app fork with some witchin' additions 馃挮
at main 483 lines 21 kB view raw
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}