@shelchin/svelte-i18n
Version:
The last Svelte i18n library you'll ever need. Type-safe, AI-powered, zero-config.
106 lines (105 loc) • 3.83 kB
JavaScript
/**
* Built-in translations loader
* Loads translations that are bundled with the application
*/
// Global registry for built-in translations
let globalRegistry = {};
/**
* Clear all registered translations (for testing)
*/
export function clearRegisteredTranslations() {
globalRegistry = {};
}
/**
* Register built-in translations
* This should be called during app initialization
*/
export function registerBuiltInTranslations(translations) {
globalRegistry = { ...globalRegistry, ...translations };
}
/**
* Load built-in translations into the store synchronously
* Used during SSR to ensure translations are available immediately
*/
export function loadBuiltInTranslationsSync(store) {
const storeNamespace = store.getNamespace();
// Determine which translations to load based on namespace
if (storeNamespace === 'app') {
// App instance: load only app translations
if (globalRegistry.app) {
for (const [locale, translation] of Object.entries(globalRegistry.app)) {
store.loadLanguageSync(locale, translation);
}
}
}
else if (storeNamespace && globalRegistry[storeNamespace]) {
// Package instance: load only that package's translations
for (const [locale, translation] of Object.entries(globalRegistry[storeNamespace])) {
store.loadLanguageSync(locale, translation);
}
}
}
/**
* Load built-in translations into the store
*/
export async function loadBuiltInTranslations(store, options) {
const storeNamespace = store.getNamespace();
const loadedLocales = new Set();
// Determine which translations to load based on namespace
// Handle 'app' namespace consistently
if (storeNamespace === 'app') {
// App instance: load only app translations
if (globalRegistry.app) {
for (const locale of Object.keys(globalRegistry.app)) {
loadedLocales.add(locale);
}
}
}
else if (storeNamespace && globalRegistry[storeNamespace]) {
// Package instance: load only that package's translations
for (const locale of Object.keys(globalRegistry[storeNamespace])) {
loadedLocales.add(locale);
}
}
// Load translations for each locale
for (const locale of loadedLocales) {
try {
let translations = {};
if (!storeNamespace || storeNamespace === 'app') {
// App instance: load app translations
const appTranslation = globalRegistry.app?.[locale];
if (appTranslation) {
translations = appTranslation;
}
}
else {
// Package instance: load package-specific translations
const packageTranslation = globalRegistry[storeNamespace]?.[locale];
if (packageTranslation) {
translations = packageTranslation;
}
}
// Add to store if we have translations
if (Object.keys(translations).length > 0) {
await store.loadLanguage(locale, translations);
options?.onLoaded?.(locale);
}
}
catch (error) {
console.error(`Failed to load built-in translations for ${locale}:`, error);
options?.onError?.(locale, error);
}
}
}
/**
* Auto-discover and register package translations
* Packages can call this during their initialization
*/
export function registerPackageTranslations(packageName, translations) {
if (!globalRegistry[packageName]) {
globalRegistry[packageName] = {};
}
for (const [locale, translation] of Object.entries(translations)) {
globalRegistry[packageName][locale] = translation;
}
}