import type { ReactNode } from 'react'; /** * Representa un idioma disponible en el sistema. * Esta interfaz define la estructura que el backend debe retornar para listar idiomas. * Soporta múltiples nomenclaturas (español/inglés) para mayor flexibilidad. */ export type Language = { /** Código único del idioma (ISO 639-1). Ej: 'es', 'en', 'pt' */ codigo?: string; /** Nombre legible para el usuario en español. Ej: 'Español' */ nombre?: string; /** Código único del idioma (ISO 639-1) - Variante en inglés */ code?: string; /** Nombre legible para el usuario - Variante en inglés */ name?: string; /** Nombre nativo del idioma */ nativeName?: string; /** URL opcional de un icono o bandera para mostrar en el selector */ icon?: string; }; /** * Diccionario de traducciones (Llave: Valor). * Soporta estructuras planas. Ejemplo: { "saludo.bienvenida": "¡Hola!" } */ export type TranslationResources = { [key: string]: string; }; /** * Adaptador de API (Inyección de Dependencias). * Permite que el sistema de idiomas utilice TU propio servicio de red. */ export type LanguageApiAdapter = { /** * Debe retornar la lista completa de idiomas configurados en el sistema. * Se recomienda llamar al endpoint: GET /api/v1/langs */ getLanguages: () => Promise; /** * Debe retornar el diccionario de traducciones para un idioma específico. * Se recomienda llamar al endpoint: GET /api/v1/langs/{codigo} * @param codigo El código del idioma a descargar */ getTranslations: (codigo: string) => Promise; }; /** * Resultado de una resolución con procedencia. * `lang` indica en qué idioma se encontró realmente el valor, que no tiene por * qué ser el idioma activo: puede venir de un fallback. */ export type TranslationLookup = { /** Valor encontrado */ value: string; /** Código del idioma en cuyo catálogo se encontró */ lang: string; }; /** * Valores con los que se sustituyen los marcadores `{{nombre}}` de una traducción. * * `null` y `undefined` NO sustituyen: el marcador se deja visible, que es lo único que * distingue «no me pasaron el dato» de «el dato es cero». */ export type TranslationParams = Record; /** * Segundo argumento de `t` / `translate`. * * Un OBJETO son los valores de los marcadores. Una CADENA es el valor por omisión cuando la * llave no está en el catálogo, que es la convención que el kit ya usaba —`t('goToPage', 'Pág.')`— * y que `MasterCrudProps.t` declara como `(key: string, defaultValue?: string) => string`. * * Las dos formas conviven en el mismo parámetro a propósito. Tipar sólo el objeto rompió a los * consumidores que PASAN `t` como valor a un componente del kit: con `strictFunctionTypes` el * segundo parámetro se comprueba, `string` no encaja en `TranslationParams`, y la función deja de * ser asignable a la prop. No era un cambio de comportamiento —ninguna llamada se ejecutaba * distinto— sino de asignabilidad, y por eso no se vio hasta compilar el consumidor. */ export type TranslationArg = TranslationParams | string; /** * Motor de Traducción (Lógica de Negocio). * Encargado de buscar llaves y manejar fallbacks entre idiomas. */ export type TranslationEngine = { /** * Función principal para traducir. * Si la llave no existe, debe devolver la misma llave para no romper la UI. */ translate: (key: string) => string; /** * Resuelve una llave informando **en qué idioma** se encontró, o `null` si no * existe en ningún catálogo registrado. * * `translate()` no permite distinguir una traducción del idioma activo de un * fallback al idioma base: ambos devuelven una cadena distinta de la llave. Un * consumidor con diccionarios propios por idioma —el patrón del kit— necesita * esa distinción para preferir su traducción del idioma activo antes que un * fallback del motor en otro idioma; sin ella, un host que solo registre el * catálogo español deja inalcanzables los diccionarios ingleses del kit. * * Opcional a propósito: las implementaciones de terceros que no lo declaren * siguen funcionando, y el consumidor cae al comportamiento basado en * `translate()`. */ resolve?: (key: string) => TranslationLookup | null; /** Carga un conjunto de traducciones en la memoria del motor */ loadResources: (lang: string, resources: TranslationResources) => void; /** Cambia el idioma activo en el motor de forma instantánea */ changeLanguage: (lang: string) => void; /** Retorna el código del idioma que el motor está usando actualmente */ getCurrentLanguage: () => string; }; /** * Modo de operación del sistema de traducciones en arquitecturas. * - `standalone`: Aplicación monolítica estándar (por defecto, retrocompatible). * - `shell`: Aplicación anfitriona en Microfrontends (orquesta y emite eventos). * - `mfe`: Microfrontend hijo (escucha eventos y prioriza caché). */ export type TranslationMode = 'standalone' | 'shell' | 'mfe'; /** * Propiedades del componente TranslationProvider. * Este es el componente raíz que habilita la internacionalización. */ export type TranslationProviderProps = { /** La aplicación que será envuelta por el contexto de traducción */ children: ReactNode; /** * Modo de arquitectura del sistema. * @default 'standalone' */ mode?: TranslationMode; /** * Nombre del CustomEvent global usado para sincronizar Shell y MFEs. * * El Shell difunde el idioma nuevo en `detail`. La forma canónica es el código plano * (`detail: 'en-US'`), y por compatibilidad con los shells que lo envuelven también se aceptan * `{ language }`, `{ lang }`, `{ codigo }` y `{ code }`. Cualquier otra forma se ignora con un * `console.warn` en vez de entrar al estado: un `detail` no-string se propagaba antes a * `currentLanguage` y rompía a todo consumidor que lo tratara como el `string` que promete el tipo. * * @default 'siesa:language-changed' */ broadcastEventName?: string; /** * Nombre del CustomEvent global que indica un cambio de sesión (login / logout). * * Cuando el provider recibe este evento limpia la caché de traducciones de * `localStorage` y revalida el catálogo contra el backend: el catálogo cacheado * pertenece al usuario/tenant anterior y puede no coincidir con los permisos o * las personalizaciones del nuevo. Es el mismo patrón usado para refrescar * asignaciones tras autenticarse. * * La aplicación anfitriona debe emitirlo tras completar login y logout: * ```ts * window.dispatchEvent(new CustomEvent('siesa:session-changed')); * ``` * * Pasar `null` o `''` desactiva la suscripción. * * @default 'siesa:session-changed' */ sessionChangeEventName?: string | null; /** * Adaptador para conectar con el backend. * Si no se provee, el sistema operará exclusivamente con recursos estáticos. */ apiAdapter?: LanguageApiAdapter; /** * Lista de idiomas cargados localmente (Modo Desconectado). * Útil para prototipos o apps sin backend de idiomas. */ staticLanguages?: Language[]; /** * Diccionarios de traducción locales (Modo Desconectado). * Ejemplo: { es: { ... }, en: { ... } } */ staticResources?: { [lang: string]: TranslationResources; }; /** * Idioma inicial si no hay ninguno guardado en el navegador. * @default 'es' */ defaultLanguage?: string; /** * Si es true, el sistema intentará inyectar el header Accept-Language en Axios automáticamente. * Requiere que se pase la 'axiosInstance'. * @default false */ autoSetAxiosHeader?: boolean; /** * Instancia de Axios (o similar) donde se inyectará el header de idioma. */ axiosInstance?: any; }; //# sourceMappingURL=index.d.ts.map