🎮 UnityDocs

Localización: tu juego en varios idiomas

Cómo traducir un juego con el paquete Localization de Unity: locales, String Tables, textos enlazados sin código, sustitución de assets por idioma (voces, imágenes) y variables dentro de las frases. La forma correcta de no tener strings sueltos por el código.

📄 ArtículoIntermedio✅ RevisadoUnity 6.0 LTSActualizado 2026-07-17
DificultadConceptual Código Matemáticas
Tiempo📖 Lectura 8 min · ⌨️ Práctica 20 min

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.

Paquete Localization

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:

KeyEspañolEnglish
menu.jugarJugarPlay
menu.opcionesOpcionesOptions
hud.vidaVidaHealth

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):

C#
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:

texto
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.

Localiza desde el día 1

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#

📝 Pon a prueba lo aprendido

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.

Fuentes y para profundizar