Internacionalización (i18n) en Swift: NSLocalizedString y String Catalog

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Internacionalización (i18n) en Swift: guía completa para iOS y macOS

\n\n

La internacionalización (i18n) es el proceso de diseñar una aplicación para que pueda adaptarse a diferentes idiomas y regiones sin cambios de ingeniería. En el ecosistema de Apple (iOS, macOS, watchOS, tvOS), las herramientas de localización están integradas directamente en Swift y Xcode. En este artículo, analizaremos en detalle cómo usar NSLocalizedString y el moderno String Catalog para crear aplicaciones multilingües.

\n\n

Fundamentos: NSLocalizedString

\n\n

El mecanismo básico de internacionalización en Swift es la función NSLocalizedString. Esta busca la traducción de una cadena en archivos .strings o .xcstrings (String Catalog).

\n\n
let greeting = NSLocalizedString("hello_world", comment: "Saludo en la pantalla principal")\nprint(greeting) // Muestra la traducción según el idioma del dispositivo
\n\n

El parámetro comment sirve como ayuda para el traductor. La clave "hello_world" debe ser única en todo el proyecto.

\n\n

Creación de archivos de localización

\n\n

En Xcode, puedes agregar idiomas compatibles a través de Project Info > Localizations. Después de esto, se crearán subarchivos de localización para cada archivo .strings o Storyboard.

\n\n

Ejemplo del contenido de Localizable.strings (inglés):

\n
"hello_world" = "Hello, World!";\n"welcome_message" = "Welcome to our app %@";
\n\n

Versión en español (Localizable.strings (Spanish)):

\n
"hello_world" = "¡Hola, mundo!";\n"welcome_message" = "Bienvenido a nuestra aplicación %@";
\n\n

Formato de cadenas con parámetros

\n\n

Para cadenas que contienen datos dinámicos, usa especificadores de formato. En Swift, esto se puede hacer de dos maneras:

\n\n

Método 1: String(format:)

\n
let userName = "Juan"\nlet points = 150\nlet message = String(format: NSLocalizedString("user_score", comment: "Puntos del usuario"), userName, points)\nprint(message) // "Juan obtuvo 150 puntos"
\n\n

En el archivo de localización:

\n
"user_score" = "%@ obtuvo %d puntos";
\n\n

Método 2: Swift String Interpolation (iOS 15+)

\n
let message = "\\(userName) obtuvo \\(points) puntos"
\n

Sin embargo, este método no es adecuado para localización, ya que el orden de las palabras puede variar en diferentes idiomas. Usa solo String(format:) o AttributedString con inflexión.

\n\n

Pluralización (formas plurales)

\n\n

En español hay reglas complejas de declinación: "1 archivo", "2 archivos", "5 archivos". Para esto, Apple proporciona stringsdict (XML) o String Catalog con reglas de pluralización.

\n\n

Ejemplo de stringsdict

\n
<?xml version="1.0" encoding="UTF-8"?>\n<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"\n  "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\n<plist version="1.0">\n<dict>\n    <key>files_count</key>\n    <dict>\n        <key>NSStringLocalizedFormatKey</key>\n        <string>%#@files@</string>\n        <key>files</key>\n        <dict>\n            <key>NSStringFormatSpecTypeKey</key>\n            <string>NSStringPluralRuleType</string>\n            <key>NSStringFormatValueTypeKey</key>\n            <string>d</string>\n            <key>one</key>\n            <string>%d archivo</string>\n            <key>other</key>\n            <string>%d archivos</string>\n        </dict>                    

Recommendations