¿Por qué tu aplicación necesita internacionalización?
Imagina: has creado una aplicación iOS increíble. Funciona perfectamente, la interfaz es una maravilla y los usuarios de Rusia le dan cinco estrellas. Pero, ¿y si tu código hablara inglés? ¿O chino? ¿O árabe, donde el texto se lee de derecha a izquierda?
La internacionalización en Swift no es solo traducir botones. Es un enfoque arquitectónico que permite que tu aplicación hable el idioma del usuario, respete sus particularidades culturales (formatos de fecha, moneda, unidades de medida) y no se rompa al cambiar de configuración regional.
En este artículo, analizaremos cómo implementar correctamente i18n (internationalization) en un proyecto Swift, utilizando las herramientas modernas de Xcode y las mejores prácticas. ¿Listo para hacer que tu código sea ciudadano del mundo? ¡Allá vamos!
Fundamentos de la localización en Swift: de NSLocalizedString a String Catalog
Enfoque clásico: NSLocalizedString
La herramienta más básica es la macro NSLocalizedString. Busca la traducción en archivos .strings y, si no la encuentra, muestra la clave (o el valor predeterminado).
let hello = NSLocalizedString("hello_world", comment: "Saludo en la pantalla principal")
print(hello) // Muestra la traducción según el idioma del dispositivo
El comentario no es solo una formalidad. Ayuda a los traductores a entender el contexto: "hello_world" puede ser tanto un saludo como el nombre de una sección. Siempre escribe un comment con sentido.
String Catalog — el nuevo estándar (Xcode 15+)
Olvídate de los decenas de archivos Localizable.strings. En Xcode 15 aparecieron los String Catalogs (.xcstrings). Es un archivo único con soporte para múltiples idiomas, pluralización y notas contextuales.
Para crear un catálogo: File → New → File → String Catalog. Añades una clave y listo:
// ¡El código sigue siendo el mismo!
let welcome = NSLocalizedString("welcome_message", comment: "Saludo para un nuevo usuario")
// En String Catalog simplemente añades las traducciones para en, ru, ar, etc.
Ventajas: no es necesario sincronizar archivos, menos posibilidades de error con la codificación, soporte integrado para pluralización.
Formateo de números y fechas: código cultural
Error: establecer rígidamente el formato de fecha como "dd.MM.yyyy". En EE. UU. escriben "MM/dd/yyyy", en Japón — "yyyy年MM月dd日". Swift nos salva con DateFormatter y NumberFormatter.
Fechas que no dan vergüenza mostrar
let date = Date()
let formatter = DateFormatter()
formatter.dateStyle = .long
formatter.timeStyle = .none
formatter.locale = Locale.current // Se adapta automáticamente al idioma del dispositivo
let localizedDate = formatter.string(from: date)
// Para en: "January 15, 2025"
// Para ru: "15 января 2025 г."
// Para de: "15. Januar 2025"
print(localizedDate)
¡Nada de cadenas dateFormat! Usa .short, .medium, .long — ya tienen en cuenta las reglas culturales.
Números y monedas: respeta las comas y los puntos
En Rusia, el número 1234.56 se escribe como "1 234,56", mientras que en EE. UU. es "1,234.56". NumberFormatter lo sabe:
let price = 1234.56
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .currency
numberFormatter.locale = Locale.current
let localizedPrice = numberFormatter.string(from: NSNumber(value: price))!
// Para en_US: "$1,234.56"
// Para ru_RU: "1 234,56 ₽"
// Para de_DE: "1.234,56 €"
print(localizedPrice)
Pluralización: uno, dos, muchos — no adivines
La regla "uno — muchos" solo funciona en inglés. En ruso hay "1 минута", "2 минуты", "5 минут". En árabe, ¡seis formas! String Catalog y NSStringPluralRule lo resuelven de manera elegante.
En String Catalog añades una clave, indicas el tipo "Plural" y completas las formas:
// En el código