Dado que hoy en día el mundo es un mercado global, la capacidad de sus aplicaciones móviles para estar en diferentes idiomas y culturas no es solo una opción sino una necesidad. La localización mejora la experiencia del usuario, amplía su alcance y puede tener un gran impacto en el éxito del software a nivel internacional.
Para los desarrolladores de iOS, Swift ofrece potentes herramientas para incorporar fácilmente la localización a las aplicaciones. Esta guía explica la transición en la localización en Swift, desde las primeras técnicas hasta la herramienta más reciente, para ayudar a los desarrolladores a aprovechar al máximo estas capacidades.
Inicialmente, cuando se introdujo Swift por primera vez, heredó la infraestructura de localización de Objective-C, que se construyó alrededor del archivo Localizable.strings
y la función NSLocalizedString
. De esta manera, los desarrolladores tuvieron que lidiar con la edición manual de las cadenas localizadas y sincronizarlas en archivos de diferentes idiomas, un proceso que es propenso a errores y requiere mucho tiempo.
Localizable.strings
El archivo localizable es un archivo de par clave-valor simple donde las cadenas se almacenan en un formato "clave" = "valor" , donde "clave" es el identificador del código y "valor" es la cadena localizada que verá el usuario. Este archivo debe duplicarse y traducirse a cada idioma admitido y colocarse en los directorios '.lproj' correspondientes, como 'en.lproj' para el idioma inglés y 'de.lproj' para el idioma alemán.
Localizable.strings
: "hello_world_key" = "Hello, World!";
En el código Swift, esta cadena podría recuperarse como:
let greeting = NSLocalizedString("hello_world_key", comment: "The default greeting")
La función NSLocalizedString facilita el acceso al contenido localizado mediante el uso de claves de Localizable.strings
.
Esta función toma una clave, proporciona un valor alternativo y coloca un comentario para los traductores. Ofrecer un comentario es fundamental ya que proporciona a los traductores el subtexto para mejorar la precisión y la idoneidad de las traducciones.
Ejemplo: saludar a un usuario según la hora del día:
func greetingBasedOnTime() -> String { let hour = Calendar.current.component(.hour, from: Date()) let key = hour < 12 ? "good_morning_key" : "good_evening_key" return NSLocalizedString(key, comment: "Greeting based on time of day") }
Con las correspondientes Localizable.strings
, las entradas se ven así:
"good_morning_key" = "Good morning!"; "good_evening_key" = "Good evening!";
Aquí hay algunos desafíos con Localizable. Cuerdas que podrías enfrentar:
1) Problemas de escalabilidad.
A medida que crece el número de hilos, resulta difícil manejarlos. Administrar múltiples archivos .strings con el tiempo se vuelve engorroso.
2) Duplicación.
Cada idioma requería un archivo separado, lo que generaba posibles inconsistencias y esfuerzos duplicados en la gestión de cadenas. Con un solo idioma que admitir, puede que no sea un problema, pero cuando necesitas administrar varios idiomas, a veces se vuelve demasiado problemático.
3) Falta de contexto.
Sin embargo, los comentarios podrían agregarse en NSLocalizedString; incluso si no siempre ayudan al traductor a comprender completamente el contexto, eso podría resultar en imprecisiones en la traducción. Los desarrolladores suelen ser demasiado vagos para llenarlos adecuadamente.
stringsdict
para pluralización La introducción de archivos stringsdict
supuso una mejora significativa para la localización Swift, que abordó principalmente los problemas de pluralización. La causa principal es que los plurales de los idiomas se forman de manera diferente, y lo que podría ser efectivo para el inglés podría no serlo para otros idiomas como el ruso o el árabe.
Antes de la introducción stringsdict
, era muy difícil gestionarlos. stringsdict
permite a los programadores determinar reglas para categorías como "uno", "pocos", "muchos" y "otros", que garantizan el mismo nivel de corrección en la traducción en todos los idiomas.
Comprender los archivos stringsdict
El archivo Stringsdict
es una lista de propiedades XML, que se utiliza para crear cadenas localizadas según valores numéricos. Esta funcionalidad está destinada a procesar correctamente las formas plurales porque los diferentes idiomas tienen sus propias reglas diferentes para procesar las formas plurales.
Estructura de un archivo stringsdict
:
Un ejemplo de archivo stringsdict
incluye entradas de todas las cadenas que deben pluralizarse. Cada entrada consta de una clave y un diccionario en el que el usuario define una o más subclaves que representan diferentes categorías plurales.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>numberOfSongs</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@songs@</string> <key>songs</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>one</key> <string>One song</string> <key>other</key> <string>%d songs</string> </dict> </dict> </dict> </plist>
Ejemplo de uso de stringsdict
para pluralización
Supongamos que tenemos una aplicación que muestra la cantidad de artículos que ha leído un usuario. En la pantalla, debería mostrar un mensaje que presente la forma plural correcta del número de artículos leídos.
Localizable.stringsdict
para inglés y polaco:
<!-- English --> <key>article_count</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@articles@</string> <key>articles</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>one</key> <string>One article</string> <key>other</key> <string>%d articles</string> </dict> </dict> <!-- Polish --> <key>article_count</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@articles@</string> <key>articles</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>one</key> <string>Jeden artykuł</string> <key>few</key> <string>%d artykuły</string> <key>many</key> <string>%d artykułów</string> <key>other</key> <string>%d artykułu</string> </dict> </dict>
Aquí, la localización polaca demuestra claramente la complejidad de las formas plurales en algunos idiomas, donde se necesitan múltiples categorías plurales (uno, pocos, muchos, otros) para representar correctamente diferentes contextos numéricos.
Implementación rápida:
Las entradas stringsdict
se pueden utilizar en el código simplemente haciendo referencia a las claves definidas en el archivo al llamar a NSLocalizedString
.
let count = getArticleCount() let formatString = NSLocalizedString("article_count", comment: "Count of articles read by a user") let message = String(format: formatString, count)
Este enfoque le permite modificar de forma adaptativa la cadena de salida para que coincida con la gramática de los idiomas admitidos; todo esto solo en una línea de código.
Beneficios de stringsdict
Una de las nuevas características que se introdujeron con Xcode 15 son los catálogos de cadenas, que se supone que ayudarán a los desarrolladores a hacer que la localización de aplicaciones iOS y macOS sea aún más fácil que antes. Si bien Localizable.strings
y stringsdict
han sido recursos útiles para almacenar y organizar cadenas, los catálogos de cadenas son mucho más cohesivos y la interfaz de usuario es más amigable para administrar cadenas localizadas.
Estos son los principales aspectos que conviene destacar en los catálogos de cordajes:
stringsdict
al ofrecer un control más preciso de las formas plurales y del texto con variaciones según los elementos de la interfaz de usuario y los tipos de dispositivos.
Implementación rápida:
Supongamos que en una aplicación de mensajería tienes que informar a los usuarios sobre la cantidad de mensajes que no han leído. La notificación debe ser dinámica mostrando la cantidad de mensajes recibidos y debe ajustarse de acuerdo al tipo de contenido.
Configuración paso a paso:
Cree un catálogo de cadenas: agregue un nuevo catálogo de cadenas a su proyecto. Esto generará un archivo .stringcatalog
.
Agregar entradas: utilice el editor para agregar entradas para cada cadena que deba localizarse. Luego especifique claves, valores predeterminados y cualquier regla plural o parámetro adaptativo para cada entrada.
Localizar contenido: proporcione traducciones para cada idioma admitido, especificando diferentes formas para plurales, adaptaciones para tipos de dispositivos, etc.
Implementar en el código: haga referencia a estas cadenas utilizando identificadores localizados en su código Swift.
<!-- String Catalog Entry --> <key>unread_messages_count</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@messages@</string> <key>messages</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>one</key> <string>You have one unread message.</string> <key>other</key> <string>You have %d unread messages.</string> </dict> </dict>
Podrías acceder a esta cadena así:
let unreadCount = fetchUnreadMessagesCount() let message = NSLocalizedString("unread_messages_count", value: "You have \(unreadCount) unread messages.", comment: "Notify about unread messages") print(message)
Si bien los catálogos de cadenas ofrecen mejoras significativas, también presentan desafíos. Primero, es una curva de aprendizaje; Se necesita tiempo para acostumbrarse a un nuevo sistema o forma de crear algo. Otro desafío potencial que los desarrolladores podrían enfrentar está relacionado con el tiempo y los ajustes necesarios para integrar los catálogos de cadenas en proyectos existentes donde los archivos de localización tradicionales ya estaban creados y en uso.
Los catálogos de cadenas en Swift son la mejora adicional más reciente de la tecnología de localización y brindan herramientas que no solo son poderosas sino también flexibles y fáciles de usar. Al agregar la tecnología como parte del ciclo de vida de desarrollo, los equipos habrán mejorado drásticamente la eficiencia y la calidad en el proceso de localización; por lo tanto, se crearán mejores productos globales.
Actualizaré constantemente este artículo con los últimos desarrollos en herramientas de localización Swift. Si crees que omití algo o tienes alguna idea sobre lo que dije, puedes compartirla en el cuadro de comentarios a continuación. ¡Asegúrate de seguirme para obtener más información interesante y las últimas noticias!