/** * Factory de hooks de traducción para MasterDocument y sus sub-paneles. * * Antes existían cinco copias literales de este helper (una por panel), todas * con el mismo defecto: el fallback resolvía siempre contra el diccionario ES, * ignorando el idioma activo. Eso dejaba muertos los diccionarios `_EN` del kit * — un host en inglés que no registrara las claves veía el panel en español. * * Orden de resolución (las «fuentes», de mayor a menor precedencia): * 1. Motor del kit **en el idioma activo** (catálogo servido por el backend / * registrado por el host). El host manda sobre el kit. * 2. Diccionario local del idioma activo. * 3. Motor del kit con su fallback al idioma base. * 4. Diccionario local ES como último respaldo, para no mostrar nunca la clave cruda. * * El paso 1 usa `resolve()` —que informa en qué idioma encontró la clave— y no * `t()`, que colapsa traducción y fallback en una misma cadena. Con `t()` a * secas, un host que registrara solo el catálogo español convertía cualquier * clave en un acierto aparente y el paso 2 no llegaba a ejecutarse nunca: los * diccionarios `_EN` del kit quedaban inalcanzables y el usuario en inglés veía * texto español con números y fechas inglesas. Mantener el paso 3 por delante * del 4 preserva el comportamiento previo para los hosts que sí registran el * catálogo completo. * * Si el motor no implementa `resolve` (implementación de terceros), no hay forma * de distinguir traducción de fallback: se usa el orden histórico —motor, * diccionario del idioma activo, diccionario ES— para no arrebatarle el control * del texto a un host con motor propio que sí tenga la clave en el idioma activo. * * Las claves siguen el formato plano (no anidado) que espera * `DefaultTranslationEngine`. * * ## Pluralización * * El motor del kit no pluraliza, así que el helper lo resuelve por convención de * sufijos: cuando se pasa `count` numérico, se busca primero `_one` o * `_other` y solo se cae a `` si no hay variantes declaradas. * * La variante se prueba **dentro de cada fuente** antes de pasar a la siguiente, * no en todas las fuentes antes que la clave base. Con el orden inverso —el que * tenía el helper— un host que registrara `master_document.list.recordCount` en su * backend quedaba silenciosamente ignorado: el kit declara las variantes en su * diccionario local y esas se resolvían antes de mirar la clave base del motor. * Un host que quiera personalizar un texto con plural debe registrar las claves * **sufijadas** (`…recordCount_one` / `…_other`); si solo registra la base, esa * base gana igualmente sobre el diccionario local, pero pierde la distinción de * número. * * ```ts * 'master_document.list.recordCount_one': '{count} registro', * 'master_document.list.recordCount_other': '{count} registros', * // en el componente: * t('master_document.list.recordCount', { count: total }) * ``` * * Esto reemplaza el patrón `'línea(s)'` que el kit usaba antes: una cadena con * `(s)` no es traducible a idiomas con otras reglas de plural, y en español * tampoco es aceptable en texto de producto. Las claves con plural NO se * referencian por su nombre sufijado en el código: siempre se llama a la clave * base con `count`. * * @see src/components/LanguageManagement/README.md - Arquitectura de traducción * * @example * ```ts * export const useWithholdingsTranslation = createTranslationHook(WITHHOLDINGS_TRANSLATIONS); * // en el componente: * const { t } = useWithholdingsTranslation(); * t('withholdings.panel.title'); * t('withholdings.origin.originalTooltip', { value: '1.000' }); * ``` */ /** Función de traducción con interpolación `{var}`. */ export type TranslateFn = (key: string, vars?: Record) => string; /** * Diccionarios locales indexados por código de idioma corto (`es`, `en`, …). * `es` es obligatorio: es el idioma base del kit y el último respaldo. */ export interface TranslationDictionaries { es: Record; [language: string]: Record; } /** * Crea el hook de traducción de un feature a partir de sus diccionarios locales. * * @param dictionaries Diccionarios de respaldo por idioma. Debe incluir `es`. * @returns Hook que expone `{ t }`, memoizado por `t` del motor y por idioma activo. */ export declare function createTranslationHook(dictionaries: TranslationDictionaries): () => { t: TranslateFn; }; //# sourceMappingURL=i18nFactory.d.ts.map