¿Qué hace localización-ios?
Implementa, revisa o mejora la localización e internacionalización en aplicaciones iOS/macOS — Catálogos de cadenas (.xcstrings), símbolos localizables generados, nomenclatura estable de claves, LocalizedStringKey, LocalizedStringResource, pluralización, FormatStyle para números/fechas/medidas, diseño de derecha a izquierda, Dynamic Type, y formato sensible a la configuración regional. Úsalo al añadir soporte multilingüe, configurar Catálogos de Cadenas, habilitar símbolos generados para claves de localización seguras en tiempo de compilación, manejar formas plurales, formatear fechas/números/monedas para diferentes configuraciones regionales, probar localizaciones, o hacer que la interfaz funcione correctamente en idiomas RTL como árabe y hebreo.
Introducción
Esta habilidad te guía a través de las mejores prácticas de localización (l10n) e internacionalización (i18n) para aplicaciones de Apple. Cubre desde la configuración inicial hasta técnicas avanzadas como pluralización y formato sensible a la configuración regional.
Plataformas compatibles
- iOS 15+
- macOS 12+
- watchOS 8+
- tvOS 15+
Primeros pasos
1. Habilitar Catálogos de Cadenas
- En Xcode, selecciona tu proyecto.
- Ve a Info > Localizaciones y haz clic en +.
- Añade los idiomas deseados.
- Xcode generará archivos
.xcstringsautomáticamente.
También puedes crear un Catálogo de Cadenas manualmente:
# Crea un archivo Localizable.xcstrings en tu proyecto
2. Símbolos localizables generados
Habilita la generación de símbolos para seguridad en tiempo de compilación:
// En Build Settings de tu target
SWIFT_EMIT_LOC_STRINGS = YES
Esto permite usar:
Text("welcome_message") // Automáticamente resuelto a un símbolo generado
3. Claves estables
Usa claves significativas como identificadores — no uses texto visible como clave:
// ✅ Bien: Clave estable
Text("login_welcome")
// ❌ Mal: Usar texto traducido como clave (rompe si cambia)
Text("Bienvenido")
APIs de localización
LocalizedStringKey
Usa LocalizedStringKey para referencias de cadenas estáticas:
let key: LocalizedStringKey = "user_greeting"
Text(key)
LocalizedStringResource
Útil para recursos más complejos:
let resource = LocalizedStringResource("number_of_items", locale: Locale(identifier: "es"))
let text = String(localized: resource)
Pluralización
Define reglas de pluralización en el Catálogo de Cadenas:
{
"sourceLanguage": "en",
"strings": {
"%d item(s)": {
"localizations": {
"en": {
"variations": {
"plural": {
"one": "%d item",
"other": "%d items"
}
}
},
"ar": {
"variations": {
"plural": {
"one": "عنصر %d",
"two": "عنصران %d",
"few": "%d عناصر",
"many": "%d عنصرًا",
"other": "%d عنصر"
}
}
}
}
}
}
}
FormatStyle
Formatea según la configuración regional:
import Foundation
let number = 1234.56
let formattedNumber = number.formatted(.number.locale(Locale(identifier: "de_DE")))
// Resultado: "1.234,56"
let date = Date()
let formattedDate = date.formatted(.dateTime.day().month(.wide).locale(Locale(identifier: "es")))
// Resultado: "14 de marzo"
let currency = 99.99
let formattedCurrency = currency.formatted(.currency(code: "JPY").locale(Locale(identifier: "ja_JP")))
// Resultado: "¥100"
Soporte RTL
Layout de derecha a izquierda
Usa leading y trailing en lugar de left y right:
HStack {
Text("Nombre")
TextField("", text: $name)
.multilineTextAlignment(.leading)
}
Espejado de imágenes
Image(systemName: "arrow.right")
.flipsForRightToLeftLayoutDirection(true)
Dynamic Type
Asegura que el texto se redimensione correctamente:
Text("Título importante")
.font(.body)
.dynamicTypeSize(...DynamicTypeSize.accessibility3)
Pruebas de localización
Vista previa en Xcode
Usa el editor de vista previa y cambia de idioma:
#Preview {
ContentView()
.environment(\.locale, Locale(identifier: "ar"))
.environment(\.layoutDirection, .rightToLeft)
}
Esquemas de prueba
Añade argumentos de lanzamiento para probar diferentes configuraciones regionales:
-AppleLanguages (ar)
-AppleLocale ar_SA
Lista de verificación de buenas prácticas
- Usar Catálogos de Cadenas (
.xcstrings) en lugar de archivos.stringsantiguos. - Habilitar la generación de símbolos localizables.
- Usar claves estables, no texto visible.
- Manejar pluralización para todos los idiomas compatibles.
- Usar
FormatStylepara números, fechas y monedas. - Probar diseños RTL.
- Soporte para Dynamic Type.
- Evitar concatenación de cadenas (usar marcadores de posición
%d,%@). - Usar
LocalizedStringResourcepara referencias dinámicas.