El problema de los textos sueltos#
Si escribes boton.text = "Jugar"; por todo el código, traducir el juego significa buscar y reemplazar decenas de strings, uno a uno, y rezar. La localización centraliza todos los textos en tablas por idioma y los conecta con la UI sin código.
Instala Localization desde el Package Manager. En Edit → Project Settings → Localization creas los Locales (es, en, fr...) y la tabla de traducciones. Añade también una Locale Selector para elegir idioma inicial.
String Tables: los textos por idioma#
Una String Table es una hoja: cada fila es una clave (menu.jugar) y cada columna un idioma. Editas ahí todas las traducciones en un sitio:
| Key | Español | English |
|---|---|---|
menu.jugar | Jugar | Play |
menu.opciones | Opciones | Options |
hud.vida | Vida | Health |
Conectar sin código#
En un texto TextMeshPro, añade el componente Localize String Event: eliges la tabla y la clave, y Unity pone la traducción del idioma activo. Al cambiar de idioma, todos los textos enlazados se actualizan solos. Cero strings en el código.
Traducir por código (cuando toca)#
Para texto dinámico (un nombre de objeto, un mensaje generado):
using UnityEngine;
using UnityEngine.Localization;
using UnityEngine.Localization.Settings;
public class Mensajes : MonoBehaviour
{
// Referencia a una clave de una tabla, editable en el Inspector
[SerializeField] private LocalizedString mensajeBienvenida;
async void Start()
{
string texto = await mensajeBienvenida.GetLocalizedStringAsync().Task;
Debug.Log(texto);
}
public void CambiarAIngles()
{
LocalizationSettings.SelectedLocale =
LocalizationSettings.AvailableLocales.GetLocale("en");
}
}Smart Strings: variables dentro de la frase#
Las frases con datos ("Tienes {0} monedas") no se traducen bien troceadas: el orden de las palabras cambia por idioma. Los Smart Strings insertan variables y manejan plurales dentro de la propia entrada de la tabla:
Tienes {monedas:plural:una moneda|{} monedas}Así cada idioma controla su gramática completa, no tú concatenando.
Más allá del texto: Asset Tables#
Con Asset Tables sustituyes también assets por idioma: la locución de un diálogo, una textura con texto incrustado, una bandera. Mismo sistema de claves, pero apuntando a assets.
Meter localización al final es un infierno (hay que cazar cada string). Aunque solo tengas un idioma, usar claves y una String Table desde el principio cuesta poco y te deja el juego listo para traducir sin tocar código.
Errores frecuentes#
- Concatenar frases troceadas ("Tienes " + n + " monedas"): imposible de traducir bien; usa Smart Strings.
- Dejar strings incrustados en el código en vez de en la tabla.
- Olvidar una fuente/Font Asset con los caracteres del idioma (acentos, cirílico, CJK) → cuadros vacíos.
- No probar con textos largos: el alemán ocupa más y desborda botones pensados para español.
Ponte a prueba#
Resumen#
La localización centraliza los textos en String Tables (clave → idiomas) y los conecta a la UI sin código con Localize String Event, así cambiar de idioma actualiza todo solo. Para texto dinámico usas LocalizedString por código, y para frases con datos, Smart Strings (variables y plurales bien hechos). Con Asset Tables localizas también voces e imágenes. Empléalo desde el principio, aunque solo tengas un idioma: añadirlo al final es carísimo.