InfraGuard es una consola en 8 idiomas con el coreano como valor predeterminado de la central y el inglés como respaldo global. Este artículo cubre (1) cómo un usuario cambia de idioma desde el selector de la cabecera, (2) cómo se resuelve el idioma de visualización en cada petición y (3) cómo un administrador decide qué idiomas aparecen en el selector.
Visión general: qué hace
Cada etiqueta, elemento de menú y mensaje de la consola pasa por una clave de traducción (__('menu.security'), etc.) en lugar de llevar el inglés escrito en el código. Al cambiar de idioma, el servidor renderiza la interfaz a partir de los archivos de traducción de ese idioma (resources/lang/{locale}/*.php) desde la siguiente petición.
El catálogo de idiomas admitidos son las 8 entradas bajo admin en config/locales.php. Cada idioma se muestra siempre con su propio nombre nativo, sea cual sea el idioma activo en ese momento.
| Código | Nombre nativo | Etiqueta | Traducción real |
|---|---|---|---|
ko |
한국어 | KO | ✅ Traducido por completo (predeterminado de la central) |
en |
English | EN | ✅ Traducido por completo (respaldo global) |
ja |
日本語 | JA | ⏳ Recurre a en |
zh |
中文(简体) | ZH | ⏳ Recurre a en |
es |
Español | ES | ⏳ Recurre a en |
fr |
Français | FR | ⏳ Recurre a en |
de |
Deutsch | DE | ⏳ Recurre a en |
ru |
Русский | RU | ⏳ Recurre a en |
Inicialmente solo ko y en están realmente traducidos (
priority => ['ko','en']enconfig/locales.php). Los otros seis (ja·zh·es·fr·de·ru) todavía no tienen archivos de traducción y recurren automáticamente a en (fallback_locale = enenconfig/app.php). Por eso, elegirjahoy sigue mostrando en inglés las cadenas sin traducir: el selector lista los 8 idiomas y lo único que recurre al respaldo es el texto.
Cuándo usarlo
- Un visitante quiere ver la consola en un idioma que domina: use el selector de idioma de la cabecera.
- Quiere cambiar de idioma incluso en la pantalla de acceso (antes de que exista una sesión):
/lang/{locale}está permitido para invitados. - Quiere exponer solo ciertos idiomas en toda la organización y fijar el idioma predeterminado de las primeras visitas: un administrador edita el conjunto habilitado y su orden (véase «Gestionar los idiomas habilitados» más abajo).
Disposición
Selector de idioma de la cabecera (en todas las pantallas)
El desplegable de idioma de la cabecera (layouts.partials.locale-switch + ui/locale-dd.js) lista solo los idiomas que el administrador ha habilitado. Cada elemento muestra el nombre nativo más una etiqueta corta (por ejemplo KO, EN), y el idioma actual aparece marcado como activo.
Administración ▸ Localización (gestionar los idiomas habilitados)
En la pantalla Administración ▸ Localización (accesible desde el botón superior derecho), sobre el catálogo de 8 idiomas puede:
- Activar o desactivar cada idioma (si aparece o no en el selector).
- Reordenar arrastrando: el primer idioma habilitado pasa a ser el principal (predeterminado) del sitio.
- Guardar con un mínimo de un idioma obligatorio (guardar cero se rechaza).
Cómo se usa
1) Cambiar desde el selector de la cabecera
- Abra el desplegable de idioma de la cabecera.
- Elija un idioma → el navegador va a
GET /lang/{locale}. - El servidor guarda su elección y redirige de vuelta a la página anterior (
redirect()->back()). El nuevo idioma se aplica desde el siguiente renderizado.
El endpoint de cambio tiene este aspecto:
GET /lang/ko # cambiar a coreano
GET /lang/en # cambiar a inglés
GET /lang/ja # japonés (sin traducir → respaldo en en)
Lo que hace el servidor (LocaleController@switch) al cambiar:
| Almacén | Clave | Valor | Duración |
|---|---|---|---|
| Sesión | infr_locale |
código elegido | durante la sesión |
| Sesión | infr_lang |
código elegido | durante la sesión (sincroniza el idioma del perfil) |
| Cookie | infr_locale |
código elegido | 1 año (persiste entre visitas) |
| BD | users.lang |
código elegido | permanente (solo usuarios con sesión iniciada) |
Cuando cambia de idioma un usuario con sesión iniciada, la elección también se guarda en
users.lang(idioma del perfil), de modo que el idioma se mantiene en el siguiente inicio de sesión. Las elecciones de invitados (sin iniciar sesión) solo se conservan en la sesión y la cookie.
Llamar a
/lang/{locale}con un código no admitido (o deshabilitado por el administrador) se ignora en silencio y se mantiene el idioma actual: no se lanza ningún error.
2) Cómo se resuelve el idioma de visualización (SetLocale)
El middleware SetLocale determina el idioma en cada petición web (incluida la pantalla de acceso) con la prioridad siguiente. Cada candidato se acepta solo si es un idioma habilitado en ese momento.
1. session infr_locale (elegido explícitamente con el selector en esta sesión)
2. cookie infr_locale (elección persistente entre visitas · se aplica a la pantalla de acceso, antes de la sesión)
3. session infr_lang (perfil del usuario con sesión users.lang → cargado en la sesión al iniciar sesión)
4. predeterminado del sitio (Locales::primary() = primer idioma de la lista habilitada)
No se realiza detección automática por Accept-Language del navegador. Una primera visita sin sesión, cookie ni elección de perfil se sirve de forma determinista en el idioma predeterminado del sitio definido por el administrador, no en el del navegador (prevalece el ajuste global del sitio). Los visitantes siempre pueden cambiarlo con el selector de la cabecera.
3) Gestionar los idiomas habilitados (administrador)
- Vaya a
Administración ▸ Localización. - Active los idiomas que quiera exponer (el selector, el cambio de idioma, el idioma del perfil y la edición multilingüe del inventario pasan todos por este conjunto) y desactive el resto.
- Reordene arrastrando: el primer idioma habilitado pasa a ser el predeterminado.
- Guarde. El guardado se audita en
infr_audit_logcomolocalization.save.
Reducir los idiomas habilitados estrecha de inmediato la oferta del selector de la cabecera. Como salvaguarda, debe quedar habilitado al menos un idioma (guardar cero devuelve 422) y, si no queda ningún código válido, el sistema recurre al catálogo completo, de modo que siempre se garantiza al menos uno.
Fuentes de datos
| Elemento | Ubicación |
|---|---|
| Catálogo de idiomas (8 + nombres) | config/locales.php → admin |
| Prioridad de traducción real | config/locales.php → priority = ['ko','en'] |
| Idioma de respaldo | config/app.php → fallback_locale = en |
| Archivos de traducción | resources/lang/{locale}/{msg,menu,infra,security,...}.php (revinculados con useLangPath en bootstrap/app.php) |
| Subconjunto de idiomas habilitados | infr_setting (group=i18n, key=enabled), en CSV |
| Orden de visualización | infr_setting (group=i18n, key=order), en CSV |
| Idioma del perfil | users.lang |
| Elección de la sesión | sesión infr_locale / infr_lang |
| Elección persistente | cookie infr_locale (1 año) |
Los ajustes de idiomas habilitados y de orden los lee App\Support\Locales con una caché de 60 segundos. Ante un error de base de datos o si no hay ajuste, recurre de forma segura a un array vacío (→ catálogo completo). Tras guardar, Locales::flush() invalida la caché de inmediato.
-- Dónde se guardan el conjunto habilitado y el orden (ejemplo)
SELECT `group`, `key`, `value` FROM infr_setting WHERE `group` = 'i18n';
-- group | key | value
-- i18n | order | ko,en,ja,zh,es,fr,de,ru
-- i18n | enabled | ko,en
Entrega al frontend
El servidor pasa el idioma activo y el paquete de mensajes al bootstrap de la vista (por ejemplo window.__t = @json(__('msg')), window.__locale). Las páginas y los mixins de Vue los usan para renderizar las cadenas del lado del cliente y dar formato a las fechas según el idioma activo de la interfaz.
Acceso
| Acción | Nivel mínimo |
|---|---|
Cambiar de idioma GET /lang/{locale} |
Se permite a invitados: no requiere iniciar sesión (funciona también en la pantalla de acceso) |
Ver o guardar los idiomas habilitados Administración ▸ Localización |
admin = 10 |
- Cambiar de idioma está abierto a cualquiera (no es una acción sensible).
- La pantalla de administración que decide qué idiomas aparecen en el selector es solo para administradores: doble defensa con el grupo de rutas
infr.level:10más una comprobación propia del controlador (user_level >= 10). Los niveles son demo=1 · staff=5 · admin=10 (véase Niveles · RBAC).
Resolución de problemas y preguntas frecuentes
El idioma que quiero no está en el selector
Lo más probable es que un administrador lo haya deshabilitado. Active su interruptor en Administración ▸ Localización. El selector, el cambio de idioma y el idioma del perfil pasan todos por el conjunto habilitado.
Cambié de idioma pero parte del texto sigue en inglés
ja·zh·es·fr·de·ru todavía no tienen archivos de traducción reales y recurren a en (estrategia inicial). Es lo esperado ver en inglés solo las cadenas sin traducir. ko y en están traducidos por completo.
La primera visita no se abre en el idioma de mi navegador
Es intencionado. InfraGuard no lee Accept-Language: se abre en el idioma predeterminado del sitio definido por el administrador (el primero de la lista habilitada). En cuanto cambia de idioma, la elección se guarda en la sesión y la cookie y se conserva en visitas posteriores.
Al cerrar sesión y volver a entrar, mi idioma se reinicia
Si existe la cookie (infr_locale, 1 año), el idioma persiste. Para usuarios con sesión iniciada, la elección también se guarda en users.lang y se restaura como idioma del perfil en el siguiente inicio de sesión. Sin cookie ni perfil, se abre en el predeterminado del sitio.
¿Qué pasa con un código desconocido como /lang/xx?
Un código no admitido se ignora en silencio y se mantiene el idioma actual (sin error). Los únicos códigos válidos son los habilitados entre los 8.
¿Y si deshabilito todos los idiomas?
Está bloqueado. El guardado obliga a un mínimo de uno (guardar cero devuelve 422). Incluso si el ajuste se corrompiera, el sistema recurre al catálogo completo, así que el selector nunca queda vacío.
Relacionado
- Administración ▸ Localización (gestionar los idiomas habilitados)
- Mi perfil · idioma
- Navegación · estructura del menú
- Tema (claro · oscuro)
- Niveles · RBAC
- Cómo usar este manual
