@hkxdv/astro-shade-dx-template
Version:
Astro template with React, shadcn/ui, Bun, Biome & ESLint. Pre-configured TypeScript, Tailwind CSS, dark/light themes, and optimized DX. Run directly with 'bunx @hkxdv/astro-shade-dx-template' without installation.
125 lines (113 loc) • 3.48 kB
text/typescript
/**
* Utilidades para manejar la internacionalización de manera dinámica
* @module i18n-utils
*/
// Importaciones estáticas para resolver advertencias de Vite
import commonES from "@/locales/es/common.json";
import featuresES from "@/locales/es/features.json";
import commonEN from "@/locales/en/common.json";
import featuresEN from "@/locales/en/features.json";
/**
* Tipo para traducciones anidadas que permite múltiples niveles
*/
export type NestedTranslations = Record<
string,
string | Record<string, unknown>
>;
// Tipo para el diccionario de traducciones
type TranslationDict = {
[key in "es" | "en"]: {
common: NestedTranslations;
features: NestedTranslations;
};
};
// Diccionario estático de traducciones
const TRANSLATIONS: TranslationDict = {
es: {
common: commonES as NestedTranslations,
features: featuresES as NestedTranslations,
},
en: {
common: commonEN as NestedTranslations,
features: featuresEN as NestedTranslations,
},
};
/**
* Obtener los idiomas soportados desde la configuración de Astro
* @returns Array de códigos de idioma soportados
*/
export function getSupportedLocales(): string[] {
try {
// Intentar obtener los locales desde Astro.locals o config
if (import.meta && import.meta.env && import.meta.env.SUPPORTED_LOCALES) {
return JSON.parse(import.meta.env.SUPPORTED_LOCALES);
}
// Fallback a los idiomas soportados originalmente
return ["es", "en"];
} catch (error) {
console.error("Error al obtener locales soportados:", error);
return ["es", "en"];
}
}
/**
* Obtener el idioma por defecto
* @returns Código del idioma por defecto
*/
export function getDefaultLocale(): string {
try {
if (import.meta && import.meta.env && import.meta.env.DEFAULT_LOCALE) {
return import.meta.env.DEFAULT_LOCALE;
}
return "es";
} catch (error) {
console.error("Error al obtener locale por defecto:", error);
return "es";
}
}
/**
* Verifica si un idioma está soportado
* @param locale Código de idioma a verificar
* @returns boolean - true si el idioma está soportado
*/
export function isLocaleSupported(locale: string): boolean {
return getSupportedLocales().includes(locale);
}
/**
* Genera rutas estáticas para páginas con parámetro [lang]
* @returns Array de objetos con params.lang para cada idioma soportado
*/
export function generateLocalePaths() {
return getSupportedLocales().map((lang) => ({
params: { lang },
}));
}
/**
* Tipo para módulos de traducción importados dinámicamente
*/
interface TranslationModule {
default: NestedTranslations;
}
/**
* Obtener todas las traducciones disponibles para un idioma
* @param locale Código de idioma
* @returns Objeto con todas las traducciones o un objeto vacío si hay error
*/
export async function getLocaleTranslations(
locale: string
): Promise<NestedTranslations> {
try {
// Usar las traducciones pre-importadas
if (locale === "es" || locale === "en") {
const result: NestedTranslations = {
...TRANSLATIONS[locale].common,
...TRANSLATIONS[locale].features,
};
return result;
}
// Fallback para idiomas no pre-importados
return {};
} catch (error) {
console.error(`Error cargando traducciones para ${locale}:`, error);
return {};
}
}