Sistema de localización para Unity

Cambio de idioma en tiempo de ejecución, pistas separadas para idioma de juego y de voz, y menús y modales localizados desde el primer momento.

Para qué sirve este sistema

La localización en Unity parece sencilla y acaba tocando cada sistema. Los menús sacan etiquetas de algún sitio, los modales necesitan traducciones, los clips de audio tienen variantes de voz por idioma y los textos del juego aparecen en pantallas que no se diseñaron para ser localizadas. Cambiar el idioma en tiempo de ejecución implica empujar actualizaciones hacia vistas que quizás no estaban escuchando.

Serenity envuelve las tablas de Unity Localization tras un servicio pequeño con casos de uso explícitos. Expone un contrato limpio para obtener y establecer el idioma de juego activo y el idioma de voz activo, y permite que el resto de la foundation acceda a cadenas localizadas sin depender directamente de Unity Localization.

El problema en Unity

Casi todos los proyectos hacen una de dos cosas con la localización. O bien cuecen textos en inglés dentro de los prefabs e intentan retroalimentar traducciones más tarde, o cablean tablas de Unity Localization pieza a pieza sobre cada componente TextMeshPro. Las dos opciones envejecen mal. La primera deja el proyecto intraducible. La segunda acopla la UI a Unity Localization de un modo difícil de testear, reemplazar o ampliar con lógica propia.

Los idiomas de voz añaden otra capa. El jugador puede preferir texto en inglés con voz en japonés, o español de texto con voz inglesa. La localización casera rara vez modela esa distinción, así que el audio cae al que venga por defecto.

Cómo lo aborda Serenity

Serenity expone la localización a través de ILocalizationService, con los casos de uso LocalizationGetGameLanguage, LocalizationSetGameLanguage, LocalizationGetVoiceLanguage y LocalizationSetVoiceLanguage. Las tablas se describen mediante ILocalizationTable e ILocalizationSettings en la capa de Dominio. La implementación Unity, UnityLocalizationService, conecta el servicio con el paquete oficial de Unity Localization a través de UnityLocalizationStringTable y UnityLocalizationAssetTable.

El idioma de juego y el de voz son pistas independientes. Puedes cambiar uno sin tocar el otro, y el código de juego observa ambos a través del mismo servicio. El Sistema de Menús y el de Modales resuelven sus etiquetas a través de este servicio, así que cambiar el idioma actualiza el texto de la UI sin recargar la escena.

Cómo encaja en Serenity

El Sistema de Localización pertenece al namespace Serenity.Localization y sigue la misma división por capas que el resto de la foundation. Las entidades de Dominio describen las tablas y los ajustes. La capa de Aplicación expone los casos de uso y el contrato ILocalizationService. La capa de Infraestructura aporta UnityLocalizationService y las tablas con backing de assets. Un UnityLocalizationInstaller registra el servicio para que el resto de sistemas lo resuelvan a través de interfaces.

La localización la consume casi toda la foundation. El Sistema de Menús y el de Modales buscan etiquetas a través del servicio. Los Temas de UI pueden llevar datos visuales o sonoros localizados cuando hace falta. Game Settings puede persistir los idiomas elegidos para que el jugador conserve su elección entre sesiones. Tratar la localización como un servicio en vez de como componentes sueltos mantiene cada sistema poco acoplado a Unity Localization.

Flujo de trabajo práctico

  1. Configura tus tablas y locales de Unity Localization como de costumbre en el proyecto.
  2. Mapealos a definiciones UnityLocalizationStringTable y UnityLocalizationAssetTable para que Serenity pueda leerlas.
  3. Deja que el instalador de Unity Localization registre el servicio en la pipeline de inicialización.
  4. Lee el idioma activo desde ILocalizationService dentro de vistas o presenters cuando necesiten una etiqueta.
  5. Llama a LocalizationSetGameLanguage o LocalizationSetVoiceLanguage para cambiar el idioma en tiempo de ejecución.
  6. Persiste la elección del jugador con Game Settings para restaurar el mismo idioma en la siguiente sesión.

Qué incluye

  • ILocalizationService con casos de uso explícitos para idioma de juego y de voz
  • Pistas independientes de idioma de juego y de voz
  • Interfaces de Dominio ILocalizationTable e ILocalizationSettings
  • Implementación Unity respaldada por las tablas y assets de Unity Localization
  • Envoltorios UnityLocalizationStringTable y UnityLocalizationAssetTable
  • Cambio de idioma en tiempo de ejecución que se propaga por el servicio
  • Integración con menús, modales y otros sistemas de Serenity
  • Instalador que registra el servicio de localización una sola vez en el proyecto

Cuándo usarlo

  • Proyectos que salen en más de un idioma o esperan hacerlo en el futuro.
  • Juegos que diferencian entre idioma de pantalla e idioma de voz.
  • Equipos que quieren mantener el código de juego desacoplado de Unity Localization usando aún sus tablas.
  • Bases de código que necesitan cambiar de idioma en tiempo de ejecución sin recargas de escena.

Sistemas relacionados

Usa Serenity cuando quieras una capa de localización que ya coopera con menús, modales y ajustes, pero que sigue dejándote mantener las tablas de Unity Localization como única fuente de verdad.

Volver a la página principal