View in English

  • Global Nav Open Menu Global Nav Close Menu
  • Apple Developer
Search
Cancel
  • Apple Developer
  • News
  • Discover
  • Design
  • Develop
  • Distribute
  • Support
  • Account
Only search within “”

Quick Links

5 Quick Links

Videos

Abrir menú Cerrar menú
  • Colecciones
  • Temas
  • Todos los videos
  • Información

Volver a WWDC25

  • Información
  • Resumen
  • Transcripción
  • Código
  • Codificación conjunta: Explora la localización con Xcode

    Aprende a localizar tu app a más idiomas con Xcode. Veremos paso a paso el proceso de creación de un catálogo de cadenas, traducción de texto e intercambio de archivos con traductores externos. Aprenderás las prácticas recomendadas que proporcionarán el contexto necesario a los traductores y cómo Xcode puede ayudar a brindar esta información automáticamente. Para proyectos más grandes, también profundizaremos en técnicas para gestionar la complejidad y optimizar la gestión de cadenas mediante código Swift con seguridad de tipos.

    Capítulos

    • 0:00 - Introducción
    • 0:38 - Primeros pasos
    • 5:33 - Contexto de traducción
    • 9:33 - Gestionar la complejidad
    • 20:49 - Próximos pasos

    Recursos

    • Expanding Your App to New Markets
    • Localizing Landmarks
      • Video HD
      • Video SD

    Videos relacionados

    WWDC23

    • Discover String Catalogs
  • Buscar este video…

    Hola. Soy Andreas del equipo de localización. En esta sesión, exploraremos la localización con Xcode.

    No se requieren conocimientos previos. Exploraremos juntos cómo configurar una app para la localización. Luego, veremos cómo brindar el contexto adecuado a quienes trabajan en la traducción de tu app y analizaremos las complejidades que podrían surgir conforme tu proyecto crezca y nuevas funcionalidades para administrarlo. Comencemos.

    La sesión tiene un caso práctico. Puedes aplicar los pasos presentados en el video al proyecto de muestra vinculado en la descripción. Descarga el proyecto Landmarks y localízalo conmigo. Tengo el proyecto abierto en Xcode. Esta versión de Landmarks funciona muy bien en inglés, pero aún no tiene traducciones. Empecemos agregando un catálogo de cadenas con el menú File.

    Podemos usar el nombre predeterminado Localizable, pero quiero que vaya al grupo Resources. Ahí también está el catálogo de activos. Ahora que se agregó el catálogo de cadenas, armemos el proyecto. Cuando hay un catálogo de cadenas, Xcode toma cadenas localizables después de cada compilación y las agrega automáticamente al catálogo. No hay que hacer nada más para mantener las cadenas en el catálogo sincronizadas con el código. Pero ¿cómo sabe Xcode qué cadenas queremos localizar? La mayoría de las API de SwiftUI hacen las cadenas localizables por defecto. Esto incluye vistas como Text y Button. En el resto de nuestro código, String(localized: ) también hace que las cadenas sean localizables.

    Usaré el asistente para comprender de dónde se extrajeron las cadenas en el catálogo de cadenas.

    Esta viene de un diálogo de confirmación.

    Esta cadena se usa como título de un LabeledContent. Esta se usa como título de navegación. Y esta viene de Text y usa una variable interpolada. La mayoría de las API de SwiftUI están listas para localizarse. Quizás ya hayas notado que esta cadena representa cierta cantidad de elementos. El marcador de posición %lld se reemplazará con el número de puntos de referencia en la ejecución. Y queremos que esta cadena sea diferente, según ese número. Por ejemplo, queremos que diga 1 elemento y 2 elementos.

    Para ello, abramos el menú contextual y seleccionemos Vary by Plural.

    Ahora podemos escribir frases para uno y varios elementos.

    En la ejecución, el sistema seleccionará la cadena que coincida con el número. Eso fue fácil.

    Hoy en día, la localización es para otros idiomas. Hablo alemán, así que puedo escribir algunas de las traducciones yo mismo en el catálogo de cadenas. Cerremos el asistente. Para agregar un idioma, hago clic en el botón + en la barra inferior y selecciono alemán. Eso es todo, comenzaré a agregar algunas traducciones.

    Mira cómo el estado cambia de NUEVO a TRADUCIDO a medida que avanzo con la marca de verificación verde a la derecha.

    A la vez, el porcentaje general de traducción en la barra lateral aumentó al 8%.

    Pero soy mejor desarrollador que traductor, así que me asocié con expertos en idiomas. Prefiero que ellos terminen las traducciones que faltan.

    Para enviarles lo que tengo hasta ahora, voy al menú Product en Xcode y selecciono Export Localizations. Como estoy traduciendo mi app al alemán, me gustaría exportarla solo en alemán.

    Esto producirá un archivo de catálogo de localización con las traducciones al alemán que tengo y las cadenas en inglés que aún no se tradujeron. Este paquete contiene un archivo XLIFF estándar, con el que los servicios de traducción pueden trabajar fácilmente. Una vez que hayan terminado, enviarán el catálogo de localización traducido.

    Para importarlo de nuevo al proyecto, voy al menú Product y selecciono Import Localizations. Xcode tarda un momento en compilar el proyecto, pero luego las cadenas se marcan como traducidas al alemán al 100%. Tú también puedes hacerlo. El proyecto de muestra contiene el archivo de.xcloc traducido que puedes importar a Xcode como lo hice yo. Es momento de probarlo, y me gustaría ejecutar la app en alemán. Abriré el editor de esquemas, editaré el esquema, tocaré Run e iré a Options.

    Aquí podemos cambiar el idioma de la app a alemán para la ejecución de depuración.

    Ahora compilaré y ejecutaré la app en mi Mac.

    Está localizada al alemán y me encanta el nuevo aspecto.

    Así de fácil es configurar una nueva app para la localización. Veamos en detalle cómo brindar contexto adicional a nuestros traductores para garantizar traducciones de gran calidad. El editor asistente de Xcode es fantástico para ver el código al lado del catálogo de cadenas. Pero los traductores no ven nuestro código ni la app en ejecución cuando traducen cadenas. Debemos brindarles contexto adicional para que puedan ofrecer la mejor traducción.

    Este contexto se agrega en forma de comentario. Puede ser en el código o en la columna de comentarios del catálogo de cadenas. Sin un comentario, puede resultar difícil comprender cómo se usa una cadena. Por ejemplo, “Landmarks” es una sola palabra. ¿Nos referimos al nombre de la app o a los puntos de referencia en un mapa? Esta clave de cadena dice “%@ is contained in %@”. ¿Cómo pueden saber los traductores qué representan los marcadores de posición %@? Esto afectará la forma en que se traduce la cadena. Un buen comentario explica en qué elemento de interfaz se usa una cadena, como la barra de pestañas, un botón o un subtítulo.

    También es útil describir los elementos de interfaz circundantes. Por ejemplo, indicar que la primera cadena es una entrada en la barra lateral ayuda mucho. La segunda cadena es el subtítulo de un punto de referencia en una lista, agreguémoslo también. Por último, en el comentario se debe explicar el contenido de cada marcador de posición. Aquí, el primer marcador es el nombre de un punto de referencia y el segundo, el de la colección de la que forma parte. Sin un comentario sería imposible traducirlos correctamente. Por esto es tan importante ofrecer buenos comentarios.

    Desde el año pasado, los catálogos pueden rastrear de qué parte del código se extrae una cadena. Este año, usamos esa información para ayudarte. Presentamos la generación automática de comentarios en Xcode 26.

    Xcode usa un modelo en el dispositivo para analizar tu código y ahora puede escribir comentarios por ti. Veámoslo en acción. Hasta ahora, solo brindamos comentarios para algunas de las cadenas. Dado lo importantes que son los comentarios, mejoremos el contexto que ofrecemos a los traductores. Aquí tenemos una cadena sin un comentario. Parece que se usa en un botón. Abriré el menú contextual y seleccionaré Generate Comment. Después de analizar el uso de la cadena, Xcode generó “Etiqueta de texto en un botón para cancelar la eliminación de una colección”. ¡Muy preciso!

    Esta cadena tampoco tiene ningún comentario, dejaré que Xcode genere uno.

    Se creó “Etiqueta que se muestra sobre la ubicación de un punto de referencia”. Funciona bien. También podemos realizar ediciones aquí. Tus entradas se anteponen a los comentarios generados. Me gusta trabajar con el modelo para brindar más contexto, así que agregaré que esta cadena se muestra en el Inspector.

    Creo que esta es una funcionalidad muy útil y quiero que Xcode genere comentarios para todas las cadenas nuevas. Para habilitar esto, abro Settings y voy a Editing.

    Aquí, habilito la configuración Automatically generate string catalog comments. Ahora, cuando Xcode detecte que se agregaron nuevas cadenas localizables en el código, generará un comentario automáticamente. Esto facilita brindar a los traductores el contexto que necesitan.

    Para ayudar a los desarrolladores de herramientas de traducción a indicar que Xcode generó un comentario, el XLIFF los marca como auto-generated.

    Para más información sobre la interoperabilidad con otras herramientas y todo lo que puede hacer un catálogo de cadenas, consulta el video Discover String Catalogs.

    Conforme crece tu proyecto y se vuelve más complejo, hay otras funcionalidades de Xcode y API de localización que te ayudan a organizarte. Por ejemplo, cuando un proyecto se agranda y varios desarrolladores comienzan a trabajar en él, dividimos nuestra base de código en extensiones, estructuras y paquetes de Swift. Cada uno de ellos puede contener uno o más catálogos de cadenas. En estos casos, tenemos que usar otro parámetro en la API de localización: bundle. Esto le dirá al sistema dónde se puede encontrar la cadena en la ejecución. Ahora, bundle: .main siempre hace referencia a la app principal. Si no incluimos el parámetro bundle, se usa .main de forma predeterminada.

    Una novedad de este año es la macro #bundle. Puedes usarla para hacer referencia al paquete que contiene recursos para el idioma actual. Esa es la app principal si el código se ejecuta en ella, de lo contrario, busca automáticamente recursos de tu estructura o paquete de Swift. También funciona bien en versiones anteriores del sistema operativo.

    Otra forma de organizar las cadenas es agruparlas, por ejemplo, agrupar las cadenas relacionadas con una pantalla, una funcionalidad o un flujo específicos. Llamamos a los grupos de cadenas una Tabla y cada catálogo de cadenas representa una tabla.

    De forma predeterminada, todas las cadenas se extraen en una tabla llamada Localizable. Coincide con el nombre de archivo predeterminado cuando creas un catálogo de cadenas. Pero podemos cambiar el nombre. El parámetro tableName nos permite colocar cadenas en el catálogo que elijamos. Por ejemplo, al usar el nombre Discover, se pasa automáticamente a Discover.xcstrings. Si bien la app Landmarks funciona muy bien para crear colecciones privadas de puntos de referencias, quiero desarrollar una funcionalidad para descubrir más contenido. Este contenido proviene de amigos que sigo o de un feed seleccionado. Desarrollemos esa funcionalidad en una nueva estructura.

    Para comenzar, abriré el menú File, y agregaré un nuevo Target. Buscaré Framework.

    Como esta estructura busca descubrir nuevos puntos de referencia, la llamaré DiscoverKit.

    Iniciaré una nueva pantalla desde cero y quiero colocar todas su cadenas en una tabla aparte. Agreguemos un nuevo archivo a DiscoverKit. Selecciono String Catalog y lo llamo Discover.

    Abriré el código en el editor a la derecha, manteniendo presionadas las teclas Mayúsculas y Opción mientras hago clic en el nuevo archivo de Swift.

    Luego cerraré el navegador para tener más espacio.

    Desarrollaré esta funcionalidad en la capa del modelo con una enumeración. La nueva enumeración define si el contenido proviene de un amigo o si es seleccionado. Tiene una propiedad para exponer un título localizado. Implementémoslo. Comienzo usando String(localized: ) para exponer la cadena para localizarla. Luego, usaré el argumento table para una mejor organización. Como estamos en una estructura, también debo usar el argumento bundle. Hagamos lo mismo para el otro caso.

    La enumeración está lista. Ahora, importaré SwiftUI y agregaré una vista para obtener contenido en la pantalla.

    No tengo ninguna lógica establecida, así que mostraré un marcador de posición que indica que habrá 42 publicaciones nuevas.

    Basta de escribir, es hora de dejar que Xcode haga el trabajo. Cambiaré el esquema a la nueva estructura y lo compilaré.

    Cuando la compilación finaliza, las nuevas cadenas aparecen en el catálogo.

    Y ya tienen un comentario. ¡Excelente!

    Para el trabajo de interfaz restante, te presentaré un nuevo flujo de trabajo en Xcode 26. Desde la introducción de los catálogos de cadenas, se admite la extracción de cadenas del código. Este año, te ayudan a escribir tu código generando símbolos para cadenas agregadas manualmente. Sigamos creando nuestra vista con este nuevo flujo de trabajo. Mi objetivo es agregar un título y un subtítulo de navegación. En este momento, la vista está en pleno desarrollo. Al separar las claves de las cadenas de sus valores, puedo iterar sobre la redacción exacta sin actualizar mi código.

    Para empezar, hago clic en el botón + en String Catalog para agregar una nueva cadena. En muchos proyectos se prefiere la configuración de mayúsculas para señalar el significado semántico de las cadenas. Lo haré aquí también. La clave debe ser TITLE y el valor Discover Landmarks. Como agregué esta cadena manualmente, yo escribiré el comentario.

    El inspector de atributos me indica cómo usar la cadena en el código. Es muy útil. Eso mismo haré.

    Para mostrar un título en la barra de navegación, usaré el modificador de vista .navigationTitle.

    Para su valor, escribiré un punto inicial y luego el nombre de la tabla. Xcode puede autocompletar el nombre de la tabla y sugerir todas las cadenas manuales que contiene.

    Eso fue fácil. Esta vez no tuve que escribir manualmente un paquete ni un nombre de tabla.

    Hagámoslo de nuevo para el subtítulo de navegación. Agregaré una nueva cadena al catálogo y la llamaré SUBTITLE.

    Quiero resumir cuántas publicaciones son de amigos y cuántas son seleccionadas. Necesito un marcador de posición, y los especificadores de formato se ocupan de esto. Comenzaré escribiendo % y Xcode me sugiere algunos que puedo usar. Aquí quiero un número, así que elijo un marcador de posición para un entero.

    Este marcador representa el número de publicaciones de amigos, por lo que lo llamaré friendsPosts.

    Agregaré otro marcador para las publicaciones seleccionadas.

    Es el momento de hacer un comentario.

    La cadena está lista para usarse en el código. Esta vez usaré el modificador navigationSubtitle.

    De nuevo, escribo .Discover para buscar la tabla correcta y el autocompletado se encarga del resto.

    Escribí mucho menos. Xcode me sugirió los tipos correctos. Esta nueva funcionalidad facilita el trabajo con cadenas manuales y ahora puedo confiar en el autocompletado y el compilador para cargar estos recursos localizados. Cuando quiera cambiar los valores de mis cadenas más adelante, puedo actualizarlos en el catálogo sin tener que modificar mi código. ¿De cuántas formas diferentes has escrito OK en el pasado y has querido corregirlas todas con una simple acción?

    Para generar un nombre de símbolo que funcione bien en Swift, Xcode usa la clave y el valor de la cadena. Se puede acceder a las cadenas sin marcadores de posición como a cualquier otra propiedad estática. Si una cadena contiene un marcador de posición, Xcode genera una función en su lugar y usa su nombre como etiqueta del argumento. Los símbolos generados son variables estáticas o funciones del tipo LocalizedStringResource. Eso es muy útil porque puedes usarlos en cualquier lugar donde se use un LocalizedStringResource. Esto incluye vistas de SwiftUI como Text o Button, o modificadores de vista como .navigationSubtitle(). Si no usas SwiftUI, String(localized: ) también funciona con el tipo LocalizedStringResource.

    Las vistas personalizadas y otras declaraciones que usan LocalizedStringResource ahora se pueden invocar con un símbolo generado.

    Los símbolos son directamente accesibles en LocalizedStringResource si usas el nombre de tabla predeterminado Localizable. Cuando usas un nombre de tabla no predeterminado, los símbolos se anidan en el espacio de nombres de esa tabla. Esto significa que puedes acceder a ellos comenzando con el nombre de la tabla. Los nuevos proyectos creados por Xcode 26 tienen la generación de símbolos habilitada. Para usarla en un proyecto existente, activa la configuración de compilación Generate String Catalog Symbols.

    Como vimos, Xcode ahora admite dos flujos de trabajo diferentes para administrar tus cadenas: extrayéndolas del código y haciendo referencia a ellas con una API segura. Esto nos lleva a la pregunta: ¿qué flujo de trabajo debo usar? Te recomendamos que comiences con la extracción. Escribes las cadenas donde desarrollas la interfaz, lo que te permite leer y comprender el código más rápidamente. Con este flujo de trabajo, puedes usar la generación de comentarios de Xcode, que ahorra tiempo de escritura y proporciona un contexto significativo a los traductores. Conforme tu proyecto crece, es posible que desees tener más control sobre la organización de tus cadenas. En este caso, te recomendamos usar símbolos generados. Esto te permite separar las claves de sus valores, de modo que puedes iterar sobre el texto sin cambiar el código. Además, el autocompletado de Xcode facilita hacer referencia a cadenas en todas las tablas. Por último, los símbolos generados ayudan a evitar el código repetitivo en estructuras y paquetes.

    Ambos enfoques tienen sus puntos fuertes y creemos que debes tener la libertad de decidir qué funciona mejor para tu proyecto. Por eso agregamos una funcionalidad de refactorización para que puedas alternar fácilmente entre ambos. Probémosla en la estructura DiscoverKit. El texto del marcador dentro de la pila de navegación es un gran candidato para ser referenciado por un símbolo. Abro el menú contextual y selecciono Refactor > Convert Strings to Symbols.

    Se abre una interfaz de vista previa que muestra las ubicaciones donde se usará el símbolo en lugar de la cadena. Al hacer clic en la sección resaltada, puedo comparar el símbolo con el código original.

    Cambiemos el nombre de la clave a feedTitle para que sea más descriptiva. También puedo agregar un buen nombre para Argument 1. Lo llamaré newPosts. Se ve bien. Confirmaré la refactorización.

    Después de considerar ambos enfoques, decidí usar símbolos generados para todas las cadenas en esta tabla. Seleccionemos las dos restantes. Selecciona Refactor > Convert Strings to Symbols.

    Como estoy satisfecho con los nombres de los símbolos, haré clic en Convert.

    Así de fácil es refactorizar una tabla entera en un paso. Te invito a que explores estas funcionalidades de localización en Xcode por tu cuenta. Comienza con la extracción de cadenas para localizar tu proyecto. Brinda comentarios significativos a tus traductores: escríbelos manualmente o con la generación de comentarios de Xcode. Conforme crece la complejidad de tu proyecto, considera usar símbolos generados para mantener un control preciso sobre tus cadenas.

    Por último, para más detalles sobre los catálogos de cadenas, consulta el video Discover String Catalogs. Gracias. Espero que estas nuevas funcionalidades te ayuden a optimizar tu flujo de trabajo de localización.

    • 1:34 - Localizable strings

      // import SwiftUI
      Text("Featured Landmark", comment: "Big headline in the hero image of featured landmarks.")
      
      Button("Keep") { }
      
      // import Foundation
      String(localized: "New Collection", comment: "Default name for a new user-created collection.")
    • 6:00 - Adding a comment

      Text("Delete",
      comment: "Delete button shown in an alert asking for confirmation to delete the collection.")
      
      String(localized: "Shared by Friends", comment: "Subtitle of post that was shared by friends.")
    • 9:13 - XLIFF file

      // Field for automatically generated comments in the XLIFF
      
      <trans-unit id="Grand Canyon" xml:space="preserve">
      <source>Grand Canyon</source>
      <target state="new">Grand Canyon</target>
      <note from="auto-generated">Suggestion for searching landmarks</note>
      </trans-unit>
    • 9:58 - Localized String in the main app and a Swift Package or Framework

      // Localized String in the main app:
      Text("My Collections", 
      comment: "Section title above user-created collections.")
      
      // Localized String in a Swift Package or Framework
      Text("My Collections", 
      bundle: #bundle, 
      comment: "Section title above user-created collections.")
    • 10:56 - Localized String with a tableName parameter

      // Localized String in the main app:
      Text("My Collections",
      tableName: "Discover",
      comment: "Section title above user-created collections.")
      
      // Localized String in a Swift Package or Framework
      Text("My Collections",
      tableName: "Discover",
      bundle: #bundle, 
      comment: "Section title above user-created collections.")
    • 17:31 - Symbol usage

      // Symbol usage in SwiftUI
      Text(.introductionTitle)
      
      .navigationSubtitle(.subtitle(friendsPosts: 42))
      
      
      // Symbol usage in Foundation
      String(localized: .curatedCollection)
      
      
      // Working with generated symbols in your own types
      struct CollectionDetailEditingView: View {
          let title: LocalizedStringResource
          
          init(title: LocalizedStringResource) {
              self.title = title
          }
      }
      CollectionDetailEditingView(title: .editingTitle)
    • 0:00 - Introducción
    • Con este caso práctico de código incluido, apto para todos los niveles de habilidad, aprenderás cómo configurar tu app para la localización, cómo trabajar con traductores y cómo gestionar las complejidades a medida que tu proyecto crece.

    • 0:38 - Primeros pasos
    • Te mostramos cómo localizar una app SwiftUI llamada “Landmarks” usando Xcode. El primer paso del proceso consiste en agregar un catálogo de cadenas, el cual descubre automáticamente cadenas localizables después de cada compilación. Puedes localizar el catálogo de cadenas por tu cuenta o colaborar con un traductor profesional a través de archivos XLIFF.

    • 5:33 - Contexto de traducción
    • Cuando proporcionas los archivos a los traductores, brindar contexto es fundamental para obtener traducciones precisas. Puedes agregar comentarios directamente en el código o en el catálogo de cadenas. Xcode 26 presenta la generación automática de comentarios, que usa un modelo integrado en el dispositivo para analizar tu código y sugerir comentarios.

    • 9:33 - Gestionar la complejidad
    • A medida que tu proyecto crezca, tal vez te resulte conveniente organizarlo en paquetes o estructuras. Puedes especificar parámetros bundle y table al usar API de localización para identificar cadenas. Xcode 26 también presenta un nuevo flujo de trabajo que genera automáticamente símbolos para cadenas, lo que permite separar las claves de cadena de los valores. Puedes elegir y cambiar fácilmente entre dos flujos de trabajo: la extracción de cadenas del código o el uso de símbolos generados.

    • 20:49 - Próximos pasos
    • Para localizar tu app, puedes comenzar con la extracción de cadenas y, a medida que tu proyecto se vuelva más complejo, realizar la transición a símbolos generados para lograr una mejor gestión de las cadenas.

Developer Footer

  • Videos
  • WWDC25
  • Codificación conjunta: Explora la localización con Xcode
  • Open Menu Close Menu
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    Open Menu Close Menu
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • Icon Composer
    • SF Symbols
    Open Menu Close Menu
    • Accessibility
    • Accessories
    • App Store
    • Audio & Video
    • Augmented Reality
    • Business
    • Design
    • Distribution
    • Education
    • Fonts
    • Games
    • Health & Fitness
    • In-App Purchase
    • Localization
    • Maps & Location
    • Machine Learning & AI
    • Open Source
    • Security
    • Safari & Web
    Open Menu Close Menu
    • Documentation
    • Sample Code
    • Tutorials
    • Downloads
    • Forums
    • Videos
    Open Menu Close Menu
    • Support Articles
    • Contact Us
    • Bug Reporting
    • System Status
    Open Menu Close Menu
    • Apple Developer
    • App Store Connect
    • Certificates, IDs, & Profiles
    • Feedback Assistant
    Open Menu Close Menu
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program
    • News Partner Program
    • Video Partner Program
    • Security Bounty Program
    • Security Research Device Program
    Open Menu Close Menu
    • Meet with Apple
    • Apple Developer Centers
    • App Store Awards
    • Apple Design Awards
    • Apple Developer Academies
    • WWDC
    Get the Apple Developer app.
    Copyright © 2025 Apple Inc. All rights reserved.
    Terms of Use Privacy Policy Agreements and Guidelines