Programación en Swift y SwiftUI para iOS Developers

Cómo localizar texto en SwiftUI

Cualquier iOS Developer que busque llevar su aplicación al siguiente nivel se enfrenta, tarde o temprano, a un desafío crucial: la globalización. En el competitivo ecosistema de la App Store, limitar tu aplicación a un solo idioma significa cerrar la puerta a millones de usuarios potenciales. Aquí es donde entra en juego la internacionalización y la localización.

En este artículo, aprenderás a fondo cómo localizar texto en SwiftUI y en la programación Swift en general. Exploraremos desde la configuración inicial en Xcode hasta las técnicas más modernas de pluralización, garantizando que tu aplicación esté lista para conquistar los mercados de iOS, macOS y watchOS.


1. Internacionalización vs. Localización: ¿Cuál es la diferencia?

Antes de escribir una sola línea en Swift, es fundamental entender la diferencia entre estos dos conceptos, que a menudo se confunden:

  • Internacionalización (i18n): Es el proceso de diseñar y preparar la arquitectura de tu aplicación (código y UI) para que pueda adaptarse a diferentes idiomas y regiones sin requerir cambios de ingeniería.
  • Localización (l10n): Es el proceso de traducir y adaptar activamente ese contenido internacionalizado a una cultura, región o idioma específico (por ejemplo, traducir textos del inglés al español, o cambiar el formato de las fechas).

Gracias a la evolución de SwiftUI y las herramientas integradas en Xcode, Apple ha simplificado enormemente ambos procesos.


2. Preparando tu Proyecto en Xcode

Para empezar a localizar texto en SwiftUI, primero debemos decirle a Xcode qué idiomas vamos a soportar.

Paso 2.1: Añadir idiomas al proyecto

  1. Abre tu proyecto en Xcode.
  2. En el navegador de la izquierda (Project Navigator), selecciona el archivo raíz de tu proyecto (el icono azul).
  3. En el panel principal, selecciona tu Project (no el Target).
  4. Ve a la pestaña Info.
  5. Busca la sección Localizations. Verás que el inglés (English) suele ser el idioma de desarrollo por defecto (Base).
  6. Haz clic en el botón + y selecciona el idioma que deseas añadir (por ejemplo, Spanish – es).

Al hacer esto, Xcode preparará tu proyecto para soportar múltiples idiomas.


3. La Revolución de los String Catalogs (.xcstrings)

Durante años, la programación Swift dependía de archivos .strings y .stringsdict para manejar traducciones y plurales. Eran propensos a errores, difíciles de mantener y requerían mucho trabajo manual.

A partir de Xcode 15, Apple introdujo los String Catalogs (Catálogos de Cadenas), un cambio de paradigma total que todo iOS Developer debe adoptar.

¿Por qué usar String Catalogs?

  • Gestión visual: Todo se maneja desde una interfaz limpia dentro de Xcode.
  • Extracción automática: Xcode escanea tu código Swift y SwiftUI, y extrae automáticamente las cadenas que necesitan traducción.
  • Soporte nativo para plurales y variaciones de dispositivo: Manejar traducciones diferentes si estás en iOS, macOS o watchOS ahora requiere solo un par de clics.
  • Control de estado: Te indica visualmente qué cadenas son nuevas (NEW), cuáles necesitan revisión (STALE) y cuáles están listas traducidas con un check verde.

Paso 3.1: Crear un String Catalog

  1. Presiona Cmd + N para crear un nuevo archivo.
  2. Busca “String Catalog” en la barra de búsqueda.
  3. Nómbralo Localizable (es el nombre por defecto que buscará Swift).
  4. Asegúrate de que esté asignado a los Targets correctos (iOS, macOS, watchOS).

4. Cómo Localizar Texto en SwiftUI

SwiftUI fue diseñado pensando en la localización desde el día uno. Muchas de sus vistas integradas detectan automáticamente si un texto debe ser localizado.

Textos Estáticos

La vista Text en SwiftUI acepta un LocalizedStringKey por defecto cuando le pasas una cadena literal. Esto significa que la localización ocurre “mágicamente”.

import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack {
            // SwiftUI buscará "Hello, World!" en tu archivo Localizable.xcstrings
            Text("Hello, World!")
                .font(.largeTitle)
            
            // También funciona en botones y otros componentes estándar
            Button("Settings") {
                openSettings()
            }
        }
    }
}

En el momento en que compiles tu proyecto (o refresques la Preview), Xcode añadirá “Hello, World!” y “Settings” a tu String Catalog. Solo tienes que ir a tu archivo Localizable.xcstrings y rellenar la columna de español con “¡Hola, Mundo!” y “Ajustes”.

Textos Dinámicos (Variables)

¿Qué pasa si el texto no es un literal, sino que viene de una variable? Aquí es donde muchos cometen errores.

// ❌ ESTO NO SE LOCALIZARÁ AUTOMÁTICAMENTE
let myGreeting = "Good morning"
Text(myGreeting)

Cuando pasas una variable de tipo String, Text() asume que es texto puro que no debe traducirse (por ejemplo, el nombre de un usuario o datos de una API). Para obligar a SwiftUI a localizar una variable, debes convertirla explícitamente a LocalizedStringKey:

// ✅ ESTO SÍ SE LOCALIZARÁ
let myGreeting = "Good morning"
Text(LocalizedStringKey(myGreeting))

5. Localización en Programación Swift (Fuera de las Vistas)

Como iOS Developer, sabes que no todo el texto vive en la interfaz de usuario. A menudo necesitas generar mensajes de error en tus ViewModels, alertas desde tus Managers o notificaciones locales usando Swift puro, independientemente de SwiftUI.

Anteriormente, usábamos la pesada macro NSLocalizedString. Hoy en día, la programación Swift moderna utiliza el inicializador String(localized:).

Ejemplo en un ViewModel:

import Foundation

@Observable
class NetworkManager {
    var errorMessage: String = ""
    
    func fetchData() {
        // Simulación de error de red
        let didFail = true
        
        if didFail {
            // Extrae la clave al String Catalog de manera elegante
            errorMessage = String(localized: "Network connection lost. Please try again.")
        }
    }
}

Este método no solo es mucho más limpio que su predecesor en Objective-C, sino que también es completamente compatible con los String Catalogs de Xcode. Al compilar, esa cadena aparecerá lista para ser traducida.


6. Dominando los Plurales y Variables Dinámicas

Uno de los mayores dolores de cabeza en la localización es el manejo de variables dentro del texto, especialmente cuando afectan a la gramática (pluralización).

Interpolación de Cadenas en SwiftUI

Puedes inyectar variables directamente en tus textos de SwiftUI, y el sistema de localización lo entenderá perfectamente.

struct MessageView: View {
    let unreadCount: Int
    let userName: String
    
    var body: some View {
        // La clave generada será: "Hello %@, you have %lld unread messages"
        Text("Hello \(userName), you have \(unreadCount) unread messages")
    }
}

Configurando Plurales en el String Catalog

En el ejemplo anterior, si unreadCount es 1, el texto “you have 1 unread messages” es gramaticalmente incorrecto. Aquí brilla la potencia de Xcode.

  1. Ve a tu Localizable.xcstrings.
  2. Busca la clave Hello %@, you have %lld unread messages.
  3. Haz clic derecho sobre la fila correspondiente al idioma inglés.
  4. Selecciona Vary by Plural.
  5. Xcode te creará automáticamente los casos One (Singular) y Other (Plural).

Ahora puedes definir:

  • One: Hello %@, you have %lld unread message
  • Other: Hello %@, you have %lld unread messages

Al traducir al español, puedes hacer lo mismo, adaptando la sintaxis perfecta (“Hola %@, tienes %lld mensaje no leído” vs “Hola %@, tienes %lld mensajes no leídos”). Todo esto sin escribir código adicional en SwiftUI.


7. Contexto y Comentarios para Traductores

A menudo, la misma palabra en inglés significa cosas diferentes dependiendo del contexto. Por ejemplo, “Book” puede ser un sustantivo (Libro) o un verbo (Reservar).

Como iOS Developer, es tu responsabilidad dar contexto a los traductores (o a tu equipo de localización).

Dando contexto en SwiftUI:

Puedes usar el parámetro comment para dejar una nota a los traductores, que aparecerá directamente en el String Catalog.

Text("Book", comment: "This is a verb, used on the booking button")

Si necesitas usar la misma palabra pero con diferentes traducciones según el lugar de la app, no puedes usar la palabra en inglés como clave. En su lugar, usa un identificador único (una clave estricta) y define el texto predeterminado.

Text("Action_Book_Flight", tableName: "Localizable", bundle: .main, comment: "Button to reserve a flight")

8. Consideraciones Multiplataforma: iOS, macOS y watchOS

La belleza de usar SwiftUI y Swift es que el código que hemos visto hasta ahora es 100% reutilizable en todos los sistemas operativos de Apple.

Sin embargo, el espacio en pantalla varía drásticamente. Lo que cabe perfectamente en la pantalla de un Mac en alemán, podría desbordar por completo la pantalla de un Apple Watch.

Variaciones de Dispositivo en String Catalogs

Los String Catalogs permiten crear traducciones diferentes según la plataforma.

  1. En tu String Catalog, haz clic derecho sobre un idioma en una clave específica.
  2. Selecciona Vary by Device.
  3. Selecciona Apple Watch.

Ahora puedes poner “Configuración” para iOS/macOS, y un término más corto o abreviado para la diminuta pantalla de watchOS, directamente desde Xcode y sin usar bloques condicionales #if os(watchOS) en tu código.


9. Cómo Probar la Localización en Xcode

No necesitas cambiar el idioma de tu iPhone físico o Simulador constantemente para probar tus traducciones. Xcode ofrece múltiples formas de previsualizar la localización de manera eficiente.

Probando en SwiftUI Previews

La forma más rápida de ver tus cambios mientras diseñas es modificar el entorno de la Preview. Usa el modificador .environment para forzar un locale.

#Preview("English") {
    ContentView()
        .environment(\.locale, .init(identifier: "en"))
}

#Preview("Spanish") {
    ContentView()
        .environment(\.locale, .init(identifier: "es"))
}

Esto te permitirá ver tu interfaz de usuario en ambos idiomas lado a lado dentro del Canvas de Xcode.

Probando en el Simulador (Mediante Scheme)

Si quieres probar el flujo completo de la app:

  1. Ve a la barra superior de Xcode y haz clic en el nombre de tu Scheme (al lado de los simuladores).
  2. Selecciona Edit Scheme…
  3. En la pestaña Run, ve a la sección Options.
  4. Busca la opción App Language y cámbiala de System Language al idioma que desees testear (ej. Spanish).
  5. Ajusta también App Region si necesitas probar formatos de moneda o fecha locales.
  6. Corre la aplicación (Cmd + R).

10. Mejores Prácticas y Consejos Finales

Para consolidarte como un experto en este tema, ten en cuenta estas reglas de oro:

  1. Nunca concatenes cadenas para formar oraciones: Evita cosas como Text("Hola " + nombre + ", tienes " + count + " mensajes"). Esto rompe la estructura gramatical en idiomas que alteran el orden de las palabras (como el japonés o el alemán). Usa siempre la interpolación de cadenas \().
  2. Cuidado con el espacio UI: Idiomas como el alemán o el ruso pueden expandir tus textos hasta un 50%. Usa minimumScaleFactor() o permite que las vistas Text ocupen múltiples líneas usando lineLimit(nil).
  3. Migración de Proyectos Antiguos: Si trabajas en un código Legacy con viejos archivos .strings, Xcode 15+ te permite migrar automáticamente haciendo clic derecho sobre el archivo en el Project Navigator y seleccionando Migrate to String Catalog.

Conclusión

Saber cómo localizar texto en SwiftUI y estructurar la internacionalización en tus proyectos Swift no es solo un “extra” técnico; es una habilidad obligatoria para cualquier iOS Developer profesional. Con herramientas modernas como los String Catalogs de Xcode, adaptar tu app para iOS, macOS y watchOS al mundo entero nunca ha sido tan accesible, rápido y seguro.

Si tienes cualquier duda sobre este artículo, contacta conmigo y estaré encantado de ayudarte 🙂. Puedes contactar conmigo en mi perfil de X o en mi perfil de Instagram

Leave a Reply

Your email address will not be published. Required fields are marked *

Previous Article

Cómo cambiar la fuente del Picker en SwiftUI

Next Article

Flutter vs Swift

Related Posts