Las cadenas de interfaz se mantienen en JSON, con un fichero por idioma y módulo. Los componentes utilizan las claves existentes mediante i18next; no incorporan diccionarios de textos en TypeScript.
Compañías conserva sus dos espacios existentes. Cada JSON contiene las propiedades raíz `companies` y `access`: la segunda reúne cuentas, accesos y ayuda contextual. Esta organización evita cambiar las claves utilizadas por las pantallas. Los demás módulos conservan su estructura de claves directa, igual que Core.
Los archivos `web/i18n.ts` solo exportan el contenido JSON. El adaptador de accesos también comprueba que la ayuda cubra todos los tipos previstos. `apps/web/src/i18n.ts` registra los módulos y mantiene castellano como idioma de reserva.
La biblioteca visual conserva sus textos en su propio paquete, sin depender de módulos de negocio ni de i18next. `entityListLabels(locale)` selecciona los textos y construye el rango de resultados. Los diálogos aceptan `closeLabel` para recibir el texto traducido del consumidor; el valor predeterminado procede del JSON inglés. Los formularios de Metis Desk utilizan sus acciones y etiquetas ya traducidas.
## Añadir o modificar textos
1. Elegir el módulo propietario del texto y una clave en inglés que describa su finalidad.
2. Añadir la misma clave en `es.json` y `en.json`, dentro de la sección correspondiente.
3. Utilizar `t("clave")` en el espacio del módulo. Conservar los parámetros `{{nombre}}` idénticos en ambos idiomas.
4. Ejecutar las pruebas y la comprobación de tipos. Las pruebas de la aplicación comprueban todas las claves cargadas, textos no vacíos y equivalencia de parámetros entre idiomas.
No duplicar textos de componentes genéricos en los módulos. Los textos específicos de una entidad pertenecen al módulo consumidor.
**Desactivar** (`Deactivate` en inglés) indica una baja lógica: el registro se conserva y queda inactivo. **Eliminar** (`Delete` en inglés) indica el borrado definitivo, sujeto a las restricciones de cada entidad. Las etiquetas, confirmaciones y errores utilizan estos términos de forma coherente; no se utiliza «Dar de baja» como etiqueta de desactivación.
Crear un JSON junto a los existentes en cada módulo y en la biblioteca visual, conservando las claves y parámetros. Exportar las traducciones desde los adaptadores del módulo, registrarlas en `apps/web/src/i18n.ts` y ampliar `supportedLngs`, el selector de `apps/web/src/app.tsx` y los nombres de idioma de Core. Ampliar también la selección de idioma de `entityListLabels` y las pruebas de paridad. La carga sigue siendo explícita, sin nuevas dependencias.
## Alcance de la auditoría
Se consolidaron 1.350 claves por idioma que estaban distribuidas en Identidad, Compañías, Accesos, Activos y Recursos, incluyendo formularios, estados, errores de interfaz y ayuda contextual. Core ya utilizaba JSON; ahora también contiene los nombres del selector de idioma. Se extrajeron los textos comunes de tablas y el cierre de diálogos de la biblioteca visual.
Se revisaron los textos JSX, etiquetas, placeholders y diccionarios de los módulos y la aplicación. Se mantienen como datos o elementos técnicos los nombres propios, las siglas y protocolos, los símbolos de interfaz, las claves de traducción, los identificadores, las rutas y los datos iniciales de catálogos editables. Los mensajes internos de diagnóstico y los datos de pruebas no son traducciones de interfaz y conservan su ubicación. No se modifican datos persistidos ni valores de negocio.