
Guía completa para localizar aplicaciones iOS
Desde Localizable.strings hasta los metadatos de App Store: localice su aplicación iOS con Xcode, SwiftUI, Fastlane y traducción automatizada mediante IA.
Activar la localización en Xcode
Abra los ajustes de su proyecto de Xcode, vaya a Info > Localizations y añada los idiomas que quiera admitir. Xcode crea automáticamente directorios .lproj para cada idioma.
// In Xcode:
// 1. Select your project in the navigator
// 2. Go to Info tab > Localizations
// 3. Click + to add languages (e.g., German, Japanese)
// 4. Select which files to localize
//
// Xcode creates .lproj directories automatically:
// en.lproj/Localizable.strings
// de.lproj/Localizable.strings
// ja.lproj/Localizable.stringsCrear Localizable.strings
El archivo estándar de localización de iOS utiliza pares de clave y valor separados por signos igual, y cada línea termina con punto y coma. Colóquelo en la carpeta Base.lproj del idioma de origen.
// Base.lproj/Localizable.strings
"welcome_title" = "Welcome to MyApp";
"login_button" = "Sign In";
"settings_label" = "Settings";
"greeting" = "Hello, %@!"; // %@ = string placeholder
"item_count" = "%d items"; // %d = integer placeholder// ❌ Common mistakes in .strings files:
// Missing semicolon — file loads but translations are empty
"welcome_title" = "Welcome"
// Unescaped quotes — causes parse error
"message" = "Click "here" to continue";
// ✅ Correct versions:
"welcome_title" = "Welcome";
"message" = "Click \"here\" to continue";Migrar a catálogos de cadenas (Xcode 15 o posterior)
Los catálogos de cadenas (.xcstrings) son el sustituto moderno de Apple para los archivos .strings. Ofrecen un editor visual en Xcode, extracción automática de cadenas desde sus vistas de SwiftUI y compatibilidad integrada con plurales.
// Xcode 15+ String Catalog (Localizable.xcstrings)
// Xcode automatically extracts strings from your code
// and manages translations in a visual editor.
// In SwiftUI, strings are automatically localizable:
Text("Welcome to MyApp")
Text("Hello, \(userName)!")
// Mark strings explicitly:
let title = String(localized: "welcome_title")Utilizar cadenas localizadas en SwiftUI y UIKit
La vista Text de SwiftUI localiza automáticamente los literales de cadena. UIKit utiliza NSLocalizedString. A partir de iOS 16, la moderna API String(localized:comment:) ofrece una sintaxis más clara con compatibilidad integrada en el compilador.
import SwiftUI
struct ContentView: View {
let userName: String
var body: some View {
VStack {
// ✅ SwiftUI auto-localizes string literals
Text("welcome_title")
// ⚠️ This does NOT localize (String interpolation)
// Text("Hello, \(userName)")
// ✅ Use String(localized:) for dynamic strings
Text(String(localized: "greeting \(userName)"))
// ✅ UIKit style (works everywhere)
let title = NSLocalizedString(
"settings_label",
comment: "Settings screen title"
)
// ✅ Modern API (iOS 16+)
let modern = String(
localized: "welcome_title",
comment: "Main screen title"
)
}
}
}Gestionar plurales
iOS utiliza archivos .stringsdict para las reglas de plural y admite todas las categorías CLDR: zero, one, two, few, many y other. Los catálogos de cadenas gestionan los plurales mediante un editor visual en Xcode, mucho más sencillo que escribir a mano XML de stringsdict.
<!-- Localizable.stringsdict -->
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
<key>items_count</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@count@</string>
<key>count</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>zero</key>
<string>No items</string>
<key>one</key>
<string>%d item</string>
<key>other</key>
<string>%d items</string>
</dict>
</dict>
</dict>
</plist>
// Usage in Swift:
String(format: NSLocalizedString("items_count", comment: ""),
itemCount)Localizar los metadatos de App Store con Fastlane
Utilice la herramienta deliver de Fastlane para conservar bajo control de versiones los metadatos de App Store —nombre, subtítulo, descripción, palabras clave y notas de la versión— como archivos de texto sin formato organizados por configuración regional.
# Install Fastlane
$ gem install fastlane
# Initialize deliver for App Store metadata
$ fastlane deliver init
# Directory structure created:
# fastlane/metadata/
# ├── en-US/
# │ ├── name.txt # App name (30 chars)
# │ ├── subtitle.txt # Subtitle (30 chars)
# │ ├── description.txt # Full description
# │ ├── keywords.txt # Search keywords (100 chars)
# │ ├── release_notes.txt # What's New
# │ └── promotional_text.txt
# ├── de-DE/
# │ └── ...
# └── ja/
# └── ...
# Push metadata to App Store Connect:
$ fastlane deliverProbar su localización
Pruebe el contenido localizado sin cambiar el idioma del dispositivo. Utilice las anulaciones de esquemas de Xcode para ejecutar la aplicación en cualquier idioma, vistas previas de SwiftUI con un entorno de configuración regional y XCUITest con argumentos de inicio para automatizar las pruebas.
// 1. Xcode Scheme Override:
// Edit Scheme > Run > Options > App Language > Choose language
// 2. SwiftUI Preview with locale:
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
.environment(\.locale, Locale(identifier: "de"))
ContentView()
.environment(\.locale, Locale(identifier: "ja"))
ContentView()
.environment(\.locale, Locale(identifier: "ar"))
}
}
// 3. XCUITest with language override:
let app = XCUIApplication()
app.launchArguments += ["-AppleLanguages", "(de)"]
app.launchArguments += ["-AppleLocale", "de_DE"]
app.launch()Automatizar la calidad de la traducción
Automatizar traducciones
Traduzca sus archivos .strings, .xcstrings y de metadatos de Fastlane con IA. Automatice tanto las cadenas de la aplicación como los metadatos de App Store para ofrecer una presencia completamente localizada.
# Translate .strings files
> Translate Base.lproj/Localizable.strings
to Japanese, German, and Spanish
# Translate App Store metadata too
> Translate fastlane/metadata/en-US/
to de-DE, ja, es-MX
✓ 6 files translated in 3.2sExtra: respaldo inteligente de configuraciones regionales con LocaleChain
De forma predeterminada, iOS recurre al idioma de desarrollo cuando no está disponible la configuración regional exacta del usuario. Un usuario pt-BR que solo dispone de traducciones pt-PT ve inglés en lugar de portugués. LocaleChain lo corrige con cadenas de respaldo configurables.
LocaleChain es un paquete Swift de código abierto. Ver en GitHub
// Swift Package Manager
// File > Add Package Dependencies >
// https://github.com/i18n-agent/ios-localechain.gitimport LocaleChain
// In your App init or AppDelegate:
LocaleChain.configure() // Activates all default chains
// pt-BR user with only pt-PT translations?
// → Shows Portuguese instead of falling back to English
// Custom overrides for your specific locales:
LocaleChain.configure(
overrides: ["es-MX": ["es-419", "es"]]
)Errores habituales
Errores de sintaxis en archivos .strings
La interpolación de Text en SwiftUI no se localiza
Los widgets y las extensiones muestran claves sin procesar
Las traducciones ausentes muestran claves en producción
Estructura de archivos recomendada
MyApp/
├── MyApp.xcodeproj
├── MyApp/
│ ├── Base.lproj/
│ │ ├── Localizable.strings # Source strings
│ │ └── Localizable.stringsdict # Plural rules
│ ├── en.lproj/
│ │ └── Localizable.strings
│ ├── de.lproj/
│ │ └── Localizable.strings
│ ├── ja.lproj/
│ │ └── Localizable.strings
│ ├── Localizable.xcstrings # OR String Catalog
│ └── Info.plist
├── MyAppTests/
├── fastlane/
│ ├── Fastfile
│ └── metadata/
│ ├── en-US/
│ │ ├── name.txt
│ │ ├── description.txt
│ │ └── keywords.txt
│ ├── de-DE/
│ └── ja/
└── Package.swiftTambién puede traducir:
Pruebe i18n Agent ahora
Arrastre y suelte aquí su archivo de traducción
JSON, YAML, PO, XML, CSV, Markdown, Properties
o haga clic para seleccionar
Idiomas de destino
Respaldo de configuraciones regionales con ios-localechain
Cuando falta una clave de traducción en una configuración regional como de-AT, iOS pasa directamente al idioma de desarrollo en vez de comprobar primero la configuración principal de.
// Swift Package Manager
// https://github.com/i18n-agent/ios-localechainimport LocaleChain
LocaleChain.configure(overrides: [
"de": ["en-GB", "en"],
"pt-BR": ["pt", "en"],
"zh-Hant-HK": ["zh-Hant", "zh", "en"],
])Consulte nuestra guía de respaldo de configuraciones regionales para ver todos los frameworks admitidos y las 75 cadenas integradas. Learn more →