You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
30 lines
1.1 KiB
30 lines
1.1 KiB
import { Semaphore } from 'async-mutex'; |
|
|
|
import type { LocaleData } from './global_locale'; |
|
import { isLocaleLoaded, setLocale } from './global_locale'; |
|
|
|
const localeLoadingSemaphore = new Semaphore(1); |
|
|
|
export async function loadLocale() { |
|
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- we want to match empty strings |
|
const locale = document.querySelector<HTMLElement>('html')?.lang || 'en'; |
|
|
|
// We use a Semaphore here so only one thing can try to load the locales at |
|
// the same time. If one tries to do it while its in progress, it will wait |
|
// for the initial load to finish before it is resumed (and will see that locale |
|
// data is already loaded) |
|
await localeLoadingSemaphore.runExclusive(async () => { |
|
// if the locale is already set, then do nothing |
|
if (isLocaleLoaded()) return; |
|
|
|
const localeData = (await import( |
|
/* webpackMode: "lazy" */ |
|
/* webpackChunkName: "locale/[request]" */ |
|
/* webpackInclude: /\.json$/ */ |
|
/* webpackPreload: true */ |
|
`mastodon/locales/${locale}.json` |
|
)) as LocaleData['messages']; |
|
|
|
setLocale({ messages: localeData, locale }); |
|
}); |
|
}
|
|
|