diff --git a/package.json b/package.json index aa32517..dfa7d97 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@pistonite/celera", - "version": "0.3.0", + "version": "0.3.1", "type": "module", "private": true, "description": "In-house UI framework", diff --git a/src/i18n/init.ts b/src/i18n/init.ts index 151497b..5b37f60 100644 --- a/src/i18n/init.ts +++ b/src/i18n/init.ts @@ -7,16 +7,12 @@ import type { LocaleOptions } from "./types.ts"; import { createBackend } from "./backend.ts"; import Strings from "./strings.yaml"; import { registerTranslationLoader } from "./loaders.ts"; +import { once } from "@pistonite/pure/sync"; export const CELERA_NAMESPACE = "celerans"; -/** - * Initialize locale system in Pure and connect it with I18next - * - * This function calls `initLocale` internally, so you don't need to do that yourself. - */ -export const initLocale = async (options: LocaleOptions) => { - registerTranslationLoader(CELERA_NAMESPACE, loadCeleraTranslations); +const initLocaleInternal = async (options: LocaleOptions) => { + await registerTranslationLoader(CELERA_NAMESPACE, loadCeleraTranslations); const defaultLocale = options.default; let instance = i18next; @@ -52,6 +48,11 @@ export const initLocale = async (options: LocaleOptions< ns: [CELERA_NAMESPACE], }); }; +/** + * Initialize locale system in Celera and connect it with I18next + * @function + */ +export const initLocale = once({ fn: initLocaleInternal }); const loadCeleraTranslations = async (language: string): Promise> => { const SupportedLocales = [ diff --git a/src/i18n/loaders.ts b/src/i18n/loaders.ts index f1f9906..2fae59c 100644 --- a/src/i18n/loaders.ts +++ b/src/i18n/loaders.ts @@ -7,19 +7,21 @@ const namedspacedLoaders: Map = new Map(); const namespacedAwaiters: Map void)[]> = new Map(); /** Register a translation loader for a namespace */ -export const registerTranslationLoader = (namespace: string, loader: LoadLanguageFn) => { +export const registerTranslationLoader = async ( + namespace: string, + loader: LoadLanguageFn, +): Promise => { if (namedspacedLoaders.has(namespace)) { log.error(`translation namespace '${namespace}' is already registered`); return; } namedspacedLoaders.set(namespace, loader); const awaiters = namespacedAwaiters.get(namespace); - if (!awaiters) { - return; + if (awaiters) { + namespacedAwaiters.delete(namespace); + awaiters.forEach((x) => x(loader)); } - namespacedAwaiters.delete(namespace); - awaiters.forEach((x) => x(loader)); - void i18next.loadNamespaces(namespace); + await i18next.loadNamespaces(namespace); }; export const getTranslationLoaderForNamespace = (namespace: string): Promise => {