@shelchin/svelte-i18n
Version:
The last Svelte i18n library you'll ever need. Type-safe, AI-powered, zero-config.
96 lines (95 loc) β’ 3.25 kB
JavaScript
/**
* Default language metadata for common locales
* Provides fallback information when _meta is not available in translation files
*/
import { commonLanguages } from './language-search.js';
/**
* Default metadata for common languages
* These are derived from the single source of truth in language-search.ts
*/
export const DEFAULT_LANGUAGE_META_PARTIAL = Object.fromEntries(commonLanguages.map((lang) => [
lang.code,
{
name: lang.name,
flag: lang.flag,
direction: lang.direction,
englishName: lang.englishName
}
]));
/**
* Get metadata for a language with fallback to defaults
* @param locale The locale code
* @param customMeta Optional custom metadata to use
* @returns Language metadata
*/
export function getLanguageMeta(locale, customMeta) {
// Use custom metadata if provided and complete
if (customMeta &&
customMeta.code &&
customMeta.name &&
customMeta.englishName &&
customMeta.direction) {
return customMeta;
}
// Build complete metadata from partial data
const partial = DEFAULT_LANGUAGE_META_PARTIAL[locale] || DEFAULT_LANGUAGE_META_PARTIAL[locale.split('-')[0]];
if (partial) {
const meta = {
code: locale,
name: partial.name,
englishName: partial.englishName || partial.name, // Use name as fallback for englishName
direction: partial.direction,
flag: partial.flag
};
// Adjust flag for regional variants that might not be in the main list
if (locale === 'en-US' && !DEFAULT_LANGUAGE_META_PARTIAL[locale])
meta.flag = 'πΊπΈ';
else if (locale === 'en-GB' && !DEFAULT_LANGUAGE_META_PARTIAL[locale])
meta.flag = 'π¬π§';
else if (locale === 'en-AU' && !DEFAULT_LANGUAGE_META_PARTIAL[locale])
meta.flag = 'π¦πΊ';
else if (locale === 'en-CA' && !DEFAULT_LANGUAGE_META_PARTIAL[locale])
meta.flag = 'π¨π¦';
else if (locale === 'fr-CA' && !DEFAULT_LANGUAGE_META_PARTIAL[locale])
meta.flag = 'π¨π¦';
else if (locale === 'es-MX' && !DEFAULT_LANGUAGE_META_PARTIAL[locale])
meta.flag = 'π²π½';
else if (locale === 'es-AR' && !DEFAULT_LANGUAGE_META_PARTIAL[locale])
meta.flag = 'π¦π·';
return meta;
}
// Fallback to generic metadata
return {
code: locale,
name: locale.toUpperCase(),
englishName: locale.toUpperCase(),
direction: 'ltr',
flag: 'π'
};
}
/**
* Merge multiple language metadata sources
* Priority: custom > translation file > defaults
*/
export function mergeLanguageMeta(locale, sources) {
// Custom metadata has highest priority
if (sources.custom) {
return sources.custom;
}
// Translation file metadata has second priority
if (sources.fromFile) {
return sources.fromFile;
}
// Use defaults if requested
if (sources.defaults) {
return getLanguageMeta(locale);
}
// Final fallback
return {
code: locale,
name: locale,
englishName: locale,
flag: 'π',
direction: 'ltr'
};
}