PTC

Cómo localizar su aplicación de iOS: guía de internacionalización de SwiftUI

Prepare su aplicación de Xcode, traduzca .xcstrings con IA y, a continuación, suba capturas de pantalla para que PTC (Private Translation Cloud) revise la aplicación de iOS renderizada en cada idioma. Esta guía recorre el flujo de trabajo completo utilizando SwiftUI y los String Catalogs de Xcode 15+, la ruta moderna recomendada por Apple. Para ver la descripción general del servicio multiplataforma que cubre tanto iOS como Android, consulte traducir aplicaciones de iOS y Android con IA.

Parte 1: Cómo funciona la localización en iOS

La localización en iOS es el proceso de adaptar el texto, el formato y los recursos de su aplicación para admitir múltiples idiomas y regiones. Con los String Catalogs introducidos en Xcode 15, el flujo de trabajo es drásticamente más sencillo que el enfoque heredado de .strings / .stringsdict.

Internacionalización frente a localización

Estas son dos etapas separadas, y deben ocurrir en ese orden:

  • La internacionalización (i18n) es el trabajo preliminar técnico. Usted estructura su código para que el texto, las imágenes y el formato puedan variar según el locale sin cambios en el código. Se hace una vez, idealmente antes de su primer lanzamiento.
  • La localización (l10n) es el trabajo continuo que sigue. Escribir traducciones, ajustar los diseños y proporcionar recursos específicos del locale para cada nuevo idioma.

El error más común es tratar la localización como una tarea posterior al lanzamiento, solo para descubrir que el código base no está listo. Volver atrás para arreglar cadenas hardcoded, diseños de dirección fija y formateadores que no tienen en cuenta el locale en toda una aplicación existente lleva mucho más tiempo que compilar con la localización en mente desde el principio.

Cómo Xcode 15+ utiliza Localizable.xcstrings como fuente de verdad única

El modelo de localización de Apple en Xcode 15+ se centra en un único archivo por target: Localizable.xcstrings. Este archivo es un String Catalog en formato JSON que contiene su idioma de origen más cada traducción, incluyendo las variaciones de plural, las variaciones específicas del dispositivo y las sustituciones de variables.

Xcode extrae automáticamente las cadenas localizables de su código SwiftUI (cualquier Text("..."), Label("...", systemImage:), Button("...") y cualquier interpolación de cadenas que utilice LocalizedStringKey). La ejecución de la compilación de su aplicación rellena Localizable.xcstrings con cada cadena de origen extraída.

Apple admite varios formatos. .strings (clave-valor heredado), .stringsdict (plurales heredados) y .xcstrings (moderno). Los proyectos nuevos deben comenzar con .xcstrings. Los proyectos existentes basados en .strings pueden migrar a través de File > New > File > String Catalog y la opción de importación de Xcode. La documentación oficial de localización de Apple cubre todos los antecedentes.

Parte 2: Configure su proyecto de Xcode para la localización

Paso 1: Active la localización. Abra su proyecto en Xcode y seleccione el archivo del proyecto en el Navigator. En la pestaña Info, desplácese hasta Localizations. El inglés ya aparece como el idioma base. Haga clic en + para añadir cada idioma de destino (español, francés, árabe, etc.).

Paso 2: Cree un String Catalog. Haga clic derecho en su proyecto y seleccione New File from Template. Busque String Catalog y añádalo. Mantenga el nombre predeterminado Localizable.xcstrings. Compile el proyecto una vez con Cmd+B. Xcode escanea su código, encuentra cada cadena localizable y rellena el catálogo automáticamente.

Paso 3: Marque las cadenas para su localización. En SwiftUI, cualquier cadena literal pasada a Text(_:), Label, etiquetas de acción de Button, títulos de navegación, etc. es automáticamente LocalizedStringKey:

import SwiftUI

struct WelcomeView: View {
    let userName: String
    let unreadCount: Int

    var body: some View {
        VStack {
            Text("Welcome, \(userName)!")
            Text("You have \(unreadCount) unread messages")
            Button("Get Started") {
                // action
            }
        }
    }
}

Hay dos patrones en los que Xcode no puede extraer cadenas automáticamente. Ambos fallan de forma silenciosa:

Consejo 1: Evite pasar variables a Text. Cuando pasa una variable a una vista Text en lugar de una cadena literal, SwiftUI la trata como una cadena normal y omite por completo la búsqueda en el catálogo:

// NOT localized - SwiftUI treats the variable as a plain String
let title = "welcome_title"
Text(title)

// Localized correctly
Text(LocalizedStringKey(title))

Consejo 2: Utilice String(localized:) fuera de las vistas. Para las cadenas que necesite localizar en un view model, una función auxiliar o en cualquier lugar fuera de una vista de SwiftUI, utilice String(localized:) en lugar de una cadena normal:

let errorMessage = String(localized: "error_generic")

Paso 4: Añada variantes de plural y de dispositivo. Las cadenas a menudo necesitan diferentes formas dependiendo del contexto.

Para la pluralización, comience con la cadena en su vista de SwiftUI:

Text("\(bookCount) books on your shelf")

Abra el String Catalog, haga clic derecho en la clave y elija Vary by Plural. Xcode genera las categorías de plural automáticamente y las rellena previamente con la cadena de origen. Para el inglés verá One y Other. Corrija el campo One a "%lld book on your shelf". Marque ambos como revisados.

Cuando envíe más tarde el catálogo a PTC, la estructura plural viaja con el archivo. Para el árabe, PTC genera traducciones para las seis categorías de plural (zero, one, two, few, many, other) porque la gramática árabe requiere las seis. El español necesita dos, igual que el inglés.

Para las variaciones de dispositivo (por ejemplo, “Tap to continue” en iPhone frente a “Click to continue” en Mac), haga clic derecho en la clave y elija Vary by Device. Añada los dispositivos que desea personalizar e introduzca la cadena adecuada para cada uno. iOS sirve la versión que coincida con el dispositivo actual en tiempo de ejecución.

Parte 3: Traduzca sus archivos .xcstrings con PTC

Para proyectos pequeños, usted podría abrir cada columna de idioma en el catálogo y escribir las traducciones directamente. A medida que su aplicación crece, eso es inmanejable a través de cientos de claves y docenas de idiomas. PTC se encarga de la subida, la traducción y la sincronización.

Paso 1: Exporte su String Catalog desde Xcode. Vaya a Product > Export Localizations. Xcode empaqueta su String Catalog en un archivo .xcloc por idioma de destino. Para PTC, solo necesita el archivo .xcstrings dentro del paquete .xcloc. Haga clic derecho en el .xcloc exportado en Finder y seleccione Show Package Contents para encontrar Localizable.xcstrings.

Si ve una notificación “Unable to build project for localization string extraction”, su proyecto utiliza API exclusivas de iOS que Xcode no puede compilar contra su SDK de macOS interno durante la extracción de cadenas. Solución: seleccione el target del proyecto en TARGETS, vaya a Build Settings, busque “Use Compiler to Extract Swift Strings” y establézcalo en No. A continuación, exporte de nuevo.

Paso 2: Regístrese en PTC. La prueba cubre 20.000 palabras en 2 idiomas, lo que es suficiente para localizar la mayoría de las aplicaciones. Después de la prueba, PTC funciona con pago al consumo. Sin suscripción, las primeras 500 palabras cada mes son gratuitas.

Paso 3: Configure su proyecto y traduzca. Arrastre Localizable.xcstrings a PTC. Deje el nombre de archivo de salida como Localizable.xcstrings. Xcode espera ese nombre exacto al resolver las cadenas localizadas. Seleccione sus idiomas de destino.

PTC genera automáticamente una descripción de su aplicación a partir del archivo subido. Revísela y edítela si es necesario. Si tiene archivos de traducción preexistentes, súbalos para que PTC pueda igualar su estilo. De lo contrario, traduzca desde cero. Añada términos al glosario. PTC añade el nombre de su aplicación automáticamente. Añada cualquier terminología específica de la marca que deba traducirse de una manera específica o que no deba traducirse en absoluto. Haga clic en Start Translation.

Paso 4: Revise y descargue. Una vez que se completa la traducción, la pestaña Translations muestra cada cadena de origen junto a su traducción. Cualquier persona que añada al proyecto puede editar las traducciones directamente. Si algo no parece correcto, informe de un problema con una traducción específica y solicite una retraducción con IA gratuita. PTC aprende de los comentarios y los aplica a las cadenas futuras en el mismo proyecto.

Si alguna cadena traducida excede su límite de longitud, se resalta. Tiene tres opciones. Acepte la traducción más larga si su interfaz puede acomodarla. Solicite una retraducción que encaje en el límite actual. Ajuste el límite en Configuración > Longitudes de traducción.

Parte 4: Integre los archivos .xcstrings traducidos en su proyecto de Xcode

Tiene tres opciones.

Opción 1: Descargue manualmente los archivos desde PTC. Vaya a la pestaña Resource Files y descargue el ZIP. Contiene un único Localizable.xcstrings con sus cadenas de origen en inglés y todas las traducciones. Cierre Xcode, reemplace el Localizable.xcstrings existente en la carpeta de su proyecto por el de PTC y, a continuación, reinicie Xcode. Sus traducciones aparecen en el String Catalog con una marca de verificación junto a cada idioma completamente traducido.

Opción 2: Integre con Git. Si su proyecto se aloja en GitHub, GitLab o Bitbucket, conecte PTC directamente. La integración con Git es una función Pro. Active el pago al consumo para acceder a ella. En su panel de control de PTC, vaya a Configuración > Merge Requests y haga clic en Add Git Integration. Proporcione la URL de su repositorio, conceda acceso a PTC y elija su rama y archivos de origen. PTC envía un merge request con las traducciones.

Opción 3: Utilice la API. La API de PTC le ofrece un control total sobre cuándo y cómo se incorporan las traducciones a su pipeline de CI/CD. Con el pago al consumo activado, vaya a Configuración > Gestionar tokens de API, haga clic en Add access token y, a continuación, consulte la referencia de la API de PTC para ver los endpoints.

Un selector de idioma dentro de la aplicación (algunas aplicaciones lo necesitan) puede anular el locale del sistema por vista a través del entorno de SwiftUI:

import SwiftUI

@MainActor
class LocaleManager: ObservableObject {
    @Published var currentLocale: Locale = .current

    func setLocale(_ identifier: String) {
        currentLocale = Locale(identifier: identifier)
        UserDefaults.standard.set([identifier], forKey: "AppleLanguages")
    }
}

struct LanguageSettingsView: View {
    @EnvironmentObject var localeManager: LocaleManager

    var body: some View {
        List {
            Button("English") { localeManager.setLocale("en") }
            Button("Español") { localeManager.setLocale("es") }
            Button("Français") { localeManager.setLocale("fr") }
        }
        .environment(\.locale, localeManager.currentLocale)
    }
}

Cambiar AppleLanguages en tiempo de ejecución requiere reiniciar la aplicación para algunas cadenas del sistema. La anulación del entorno de SwiftUI surte efecto inmediatamente para las vistas dentro de ese alcance.

Parte 5: Pruebe su aplicación de iOS localizada

Pruebe con la configuración de idioma del scheme. La forma más rápida de probar un idioma específico es a través de su scheme de Xcode. Vaya a Product > Scheme > Edit Scheme, haga clic en la pestaña Options, cambie App Language y App Region al locale que desee, y ejecute con Cmd+R. Funciona bien para la mayoría de los idiomas. Debería ver el mismo diseño que en inglés con todo el texto cambiado.

Pruebe el árabe y otros idiomas RTL. La configuración de idioma del scheme puede ser poco fiable en el Simulator para RTL. Utilice la propia configuración de idioma del Simulator:

  1. Ejecute la aplicación con Cmd+R para abrir el Simulator.
  2. Pulse Cmd+Inicio para ir a la pantalla de inicio.
  3. Abra Settings > General > Language & Region.
  4. Toque Add Language, seleccione árabe y establézcalo como el idioma principal.
  5. El Simulator se reinicia. Abra su aplicación desde la pantalla de inicio.

Compruebe que el texto aparece en árabe y que el diseño se refleja correctamente, con el título de navegación y el contenido alineados a la derecha. Para realizar pruebas de vista previa sin comprometerse con un idioma, Edit Scheme > Options > Application Language > Right-to-Left Pseudolanguage es una comprobación más rápida. Para las pruebas de expansión de texto, utilice Double-Length Pseudolanguage para ver cómo los diseños manejan cadenas un 30-40 % más largas antes de comprometerse con un idioma de destino.

Mejores prácticas de localización en iOS

  • Compruebe su interfaz para ver la longitud variable del texto. El alemán es aproximadamente un 30 % más largo que el inglés. El francés y el español, un 20 %. Utilice el sistema de diseño flexible de SwiftUI, deje que las etiquetas crezcan y se ajusten de forma natural, evite las restricciones de ancho fijo en los elementos de texto y pruebe en algunos idiomas diferentes durante el desarrollo.
  • No omita las variantes de pluralización. El ruso tiene tres categorías de plural, el árabe tiene seis, el japonés no tiene ninguna. Los String Catalogs procesan esto cuando añade el idioma. Asegúrese de que todos los campos generados estén completados antes de publicar.
  • Localice imágenes y recursos. Las imágenes con texto o elementos visuales culturalmente específicos necesitan variantes localizadas. En Assets.xcassets, seleccione la imagen y en el Attributes Inspector haga clic en Localize. Elija los idiomas para los que desea variantes y reemplace cada una con la versión adecuada. iOS sirve la imagen correcta según el locale del usuario.
  • Mantenga su idioma base completo. Su idioma base (generalmente el inglés) es la reserva para cualquier traducción ausente. Una base incompleta puede causar reservas inesperadas incluso en idiomas que por lo demás están completamente traducidos. Xcode señala las cadenas base ausentes o desactualizadas durante la compilación.
  • Localice su ficha de tienda de aplicaciones. Una aplicación localizada con una ficha solo en inglés pierde usuarios en el descubrimiento. En App Store Connect puede localizar el nombre de la aplicación, el subtítulo, la descripción y las palabras clave por territorio. Las palabras clave son particularmente valiosas. Apple indexa las palabras clave de múltiples locales por territorio, multiplicando efectivamente su presupuesto de caracteres de palabras clave más allá de los 100 caracteres estándar. Utilice la función Paste to Translate de PTC para el contenido de la App Store.
  • Utilice formateadores que tengan en cuenta el locale. Formateadores compatibles con Date.FormatStyle, Decimal.FormatStyle y Locale. Nunca introduzca como cadenas hardcoded "$" o "MM/DD/YYYY".
  • Utilice %lld para recuentos de enteros y String(localized: "You have ^[\(count) message](inflect: true)") donde se aplique la concordancia gramatical automática de Apple.

Revisión visual de la traducción de su aplicación de iOS traducida: publique sin control de calidad manual por idioma

Después de que PTC traduzca sus .xcstrings, todavía tiene que verificar la aplicación en ejecución en cada idioma. Tradicionalmente, una pasada de control de calidad manual de varios días por lanzamiento. Una etiqueta traducida puede desbordar una barra de navegación en alemán. “Send” puede traducirse como un sustantivo en francés cuando el botón necesitaba un verbo. Una cadena en inglés hardcoded fuera de Text(_:) quedará claramente sin traducir en la aplicación de iOS en ejecución.

El AI Visual QA de PTC reemplaza esa pasada. Para las aplicaciones nativas de iOS (el flujo de la extensión del navegador no se aplica), utilice la subida de capturas de pantalla. Capture las pantallas críticas de la aplicación en ejecución en cada idioma de destino (inicio de sesión, pestaña principal, configuración, casos límite) y súbalas a PTC. La IA de visión de PTC inspecciona cada pantalla y:

  • Corrige problemas en el .xcstrings cuando PTC los controla. Retraduce una categoría gramatical incorrecta, elige un sinónimo más corto que encaje en una barra de navegación, regenera una forma plural con la concordancia gramatical correcta.
  • Genera un prompt de Cursor / Claude Code cuando el problema reside en su código Swift. Un LocalizedStringKey ausente, un String hardcoded fuera del sistema de localización, una oración construida por concatenación en lugar de por sustitución de variables.

El entregable: una aplicación de iOS verificada por lanzamiento. No un .xcstrings traducido con el control de calidad manual aún por delante.

Traduzca su ficha de tienda de aplicaciones, notas de lanzamiento y notificaciones push

La descripción de la App Store, las notas de lanzamiento de novedades y el texto de las notificaciones push residen fuera de Localizable.xcstrings. La función Paste to Translate de PTC procesa ese texto en el mismo proyecto. Pegue el texto de origen en el panel de control de PTC, elija los idiomas de destino y reciba traducciones que utilizan el mismo glosario y voz de marca que sus cadenas dentro de la aplicación. Apple indexa las palabras clave de múltiples locales por territorio, por lo que las fichas localizadas son particularmente valiosas para el descubrimiento.

Traduzca el contenido de usuario dentro de la aplicación con la API de PTC

El chat dentro de la aplicación, las publicaciones sociales y las reseñas de los usuarios necesitan traducción a medida que llega el contenido. La API REST de PTC traduce este contenido bajo demanda con autenticación Bearer, utilizando el mismo glosario y voz de marca que sus traducciones de .xcstrings.

Arregle la localización de iOS que no funciona

La causa más común es que el archivo de localización no esté incluido en el target de la aplicación. Haga clic en Localizable.xcstrings en el Navigator, abra el File Inspector y compruebe que el target de su aplicación esté marcado en Target Membership. Confirme también que el idioma aparece en la sección Localizations de su proyecto en la pestaña Info. Si ambos parecen correctos, limpie la carpeta de compilación con Shift+Cmd+K y vuelva a compilar.

Formatos de archivo de localización de iOS: .xcstrings, .strings, .stringsdict, .xliff

.xcstrings (String Catalog) es el valor predeterminado actual desde Xcode 15. Un único archivo basado en JSON que consolida todas las cadenas, las reglas de plural y las variantes específicas del dispositivo. .strings es el formato de clave-valor heredado, que sigue siendo válido en bases de código más antiguas, emparejado con .stringsdict para los plurales. .xliff y .xcloc son formatos de exportación para su entrega a los traductores. No son formatos de almacenamiento.

Localice el nombre de su aplicación con InfoPlist.strings

Cree un archivo InfoPlist.strings y localícelo para cada idioma admitido. En cada versión de idioma, añada CFBundleDisplayName = "Your Translated App Name";. Seleccione el archivo en el Navigator, abra el File Inspector y haga clic en Localize para añadir variantes de idioma. iOS muestra el nombre de aplicación correcto según el idioma del dispositivo.

Cambie el idioma de la aplicación de iOS sin reiniciar

iOS no proporciona una API nativa para esto. El enfoque estándar es establecer AppleLanguages en UserDefaults y pedir al usuario que reinicie:

UserDefaults.standard.set(["es"], forKey: "AppleLanguages")
UserDefaults.standard.synchronize()

El cambio surte efecto la próxima vez que se inicia la aplicación. Si necesita un cambio en la sesión sin reiniciar, tiene que gestionar la localización manualmente cargando el paquete adecuado para el idioma seleccionado.

Por qué iOS recurre al inglés para los idiomas no admitidos

iOS utiliza su idioma base como reserva cuando una traducción no está disponible. Este es el comportamiento esperado. Para minimizar las reservas, asegúrese de que su String Catalog no muestre cadenas ausentes o desactualizadas antes de cada lanzamiento.

Qué tan precisa es la localización con IA para toda una aplicación de iOS

PTC utiliza la IA para traducir archivos .xcstrings, .strings y .stringsdict en minutos, conservando las reglas de plural y los marcadores de posición automáticamente. La mayoría de las cadenas traducidas se publican sin ediciones. Para obtener los mejores resultados, háblele a PTC sobre su aplicación durante la configuración para que las traducciones reflejen el tono y la terminología correctos.

En qué idiomas de iOS localizar primero

El español, el francés, el alemán, el japonés y el chino (simplificado) son puntos de partida comunes más allá del inglés. Si su aplicación ya tiene usuarios en una región específica, priorice su idioma primero. Para el menor costo de adaptación, comience con idiomas geográfica o culturalmente cercanos a su mercado base.

Localice su propia aplicación de iOS

Comience con la prueba de 30 días de PTC: 20.000 palabras por nuestra cuenta, sin tarjeta de crédito. Suba su Localizable.xcstrings, tradúzcalo en minutos y, a continuación, suba capturas de pantalla y deje que PTC verifique la aplicación renderizada.

Relacionado: