UNPKG

@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
/** * 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 {}; } }