InfraGuard

Cambiar el idioma · Localización

Cómo cambiar el idioma de la consola de InfraGuard: 8 idiomas, el subconjunto habilitado que elige el administrador y la regla de resolución sesión→cookie→perfil→predeterminado del sitio.

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'] en config/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 = en en config/app.php). Por eso, elegir ja hoy 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

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:

Cómo se usa

1) Cambiar desde el selector de la cabecera

  1. Abra el desplegable de idioma de la cabecera.
  2. Elija un idioma → el navegador va a GET /lang/{locale}.
  3. 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)

  1. Vaya a Administración ▸ Localización.
  2. 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.
  3. Reordene arrastrando: el primer idioma habilitado pasa a ser el predeterminado.
  4. Guarde. El guardado se audita en infr_audit_log como localization.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

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

언어 · 지역화 화면
언어 · 지역화 화면