Internacionalización (i18n) en Swift: Guía completa para iOS y macOS
La internacionalización (abreviada i18n) es el proceso de diseñar una aplicación para que pueda adaptarse a diferentes idiomas y regiones sin modificar el código fuente. Para los desarrolladores de las plataformas Apple (iOS, macOS, watchOS, tvOS), Swift ofrece un conjunto de herramientas potente y elegante. En este artículo, analizaremos en detalle cómo configurar i18n en tu proyecto Swift utilizando los mecanismos integrados de Apple.
¿Por qué i18n es críticamente importante?
Incluso si tu aplicación se crea inicialmente en un solo idioma, la internacionalización debe considerarse desde la fase de arquitectura. Esto permite:
- Ampliar la audiencia: Los usuarios de diferentes países prefieren aplicaciones en su idioma nativo.
- Simplificar la localización: Una i18n adecuada convierte la adición de un nuevo idioma en una operación simple con archivos.
- Evitar el código duro: Todas las cadenas se trasladan a recursos separados, mejorando la legibilidad y el mantenimiento del código.
Herramienta principal: NSLocalizedString
El corazón de la internacionalización en Swift es la macro NSLocalizedString. Busca una cadena en los archivos de localización (.strings) y devuelve la versión traducida. Si no se encuentra la traducción, se utiliza la clave (generalmente la cadena en inglés).
// Ejemplo de uso en Swiftlet welcomeMessage = NSLocalizedString("welcome_message", comment: "Saludo en la pantalla principal")label.text = welcomeMessageSe recomienda especificar siempre el comment — ayuda a los traductores a entender el contexto.
Estructura de los archivos de localización
En Xcode, los idiomas se agregan a través de Project Settings > Info > Localizations. Después de esto, se crean las carpetas xx.lproj (por ejemplo, en.lproj, ru.lproj). Dentro de ellas se almacenan:
- Localizable.strings — el archivo principal con pares "clave" = "valor";
- InfoPlist.strings — para localizar el nombre de la aplicación y cadenas del sistema;
- Storyboard.strings — archivo generado automáticamente para interfaces creadas en storyboards.
Formato de Localizable.strings
El archivo tiene una sintaxis simple:
// English (en.lproj/Localizable.strings)"welcome_message" = "Welcome to our app!";"login_button" = "Log In";
// Русский (ru.lproj/Localizable.strings)"welcome_message" = "Добро пожаловать в наше приложение!";"login_button" = "Войти";Importante: Las cadenas terminan con punto y coma. La codificación del archivo debe ser UTF-8 o UTF-16.
Formateo de cadenas con parámetros
A menudo es necesario insertar datos dinámicos en una cadena (nombre de usuario, cantidad de elementos). Para esto se utiliza String(format:):
// En Localizable.strings:"items_count" = "You have %d items.";"user_greeting" = "Hello, %@!";
// En código Swift:let count = 5let itemsText = String(format: NSLocalizedString("items_count", comment: "Cantidad de objetos"), count)
let userName = "Алексей"let greeting = String(format: NSLocalizedString("user_greeting", comment: "Saludo al usuario"), userName)Para soportar formas plurales (1 manzana, 2 manzanas, 5 manzanas) utiliza StringDict (archivos .stringsdict).
Trabajo con XLIFF para traductores
Apple soporta el formato XLIFF (XML Localisation Interchange File). Es un estándar industrial para el intercambio de traducciones. En Xcode, puedes exportar todas las cadenas a un archivo XLIFF, entregarlo al traductor y luego importarlo de vuelta.
// Comando en terminal para exportar:xcodebuild -exportLocalizations -localizationPath ./translations -project YourProject.xcodeproj
// Importar traducciones listas: También en la biblioteca
Programación Reactiva en JavaScript (Node.js): RxJS y Observables
Frameworks CLI para PHP: creación de aplicaciones de consola con Symfony Console y Laravel Zero
Generación Swagger/OpenAPI para TypeScript: bibliotecas y herramientas
Trabajo con Markdown en Go: librerías blackfriday, goldmark y chroma
Configuración de aplicaciones Rust: bibliotecas config, envy y dotenvy