Para eliminar claves de localización sin usar en Xcode, trata las entradas Stale como candidatas a revisión. Comprueba cómo se construyen las claves en tiempo de ejecución antes de eliminarlas, conserva los mensajes dinámicos necesarios como entradas administradas manualmente y prueba las pantallas afectadas de la app para Mac después de la limpieza.

Esta guía está dirigida a quienes mantienen una app para Mac con SwiftUI y catálogos de cadenas. La tarea consiste en limpiar un catálogo: identificar los mensajes que se pueden eliminar y conservar las etiquetas y los mensajes de recuento que la app aún muestra. La guía de decisiones que aparece a continuación distingue las pruebas de extracción del comportamiento en tiempo de ejecución.

¿Qué significa realmente que una clave de localización esté obsoleta?

Xcode detecta las cadenas localizables durante las compilaciones. Apple explica que la extracción abarca el esquema y la plataforma actuales. Cuando una cadena extraída anteriormente desaparece, Xcode puede eliminar automáticamente una entrada sin traducir; una entrada que tiene traducciones permanece y recibe el estado Stale. Ese estado significa que Xcode ya no encuentra la cadena en el código. Apple indica explícitamente que la eliminación depende de confirmar que la cadena ya no es necesaria. Descubrir los catálogos de cadenas

La consecuencia práctica es que la falta de una referencia en el código inicia una investigación. Una búsqueda exacta de panel.compact puede encontrar una referencia literal, pero no permite determinar si el código construye esa clave combinando panel. con un modo seleccionado. Revisa tanto la clave candidata como el código que genera las claves de búsqueda.

Usa esta tabla de revisión propuesta para cada candidata. Es una guía de decisiones derivada de los límites de extracción documentados, no una función adicional de Xcode.

Prueba encontrada durante la revisión Decisión Próximo paso
Una pantalla eliminada era su único consumidor; no queda ningún generador de claves en tiempo de ejecución Eliminar la candidata Elimina la entrada, vuelve a compilar y revisa el cambio
El código en tiempo de ejecución aún puede generar esta clave exacta Conservar Consérvala mediante administración manual o sustituye la búsqueda por referencias localizables explícitas
La clave todavía aparece en otro destino o en una condición de compilación Conservar Compila e inspecciona la configuración pertinente
Existe una clave con un nombre similar en otra tabla Investigar por separado Confirma la tabla y el paquete de recursos que usa cada búsqueda
No se encuentra ningún consumidor, pero no está claro qué código genera la clave Posponer Rastrea el generador antes de decidir si la eliminas

¿Cómo se establece una referencia útil en Xcode?

Primero, guarda una copia recuperable del catálogo o confirma su estado actual en el sistema de control de versiones. Luego, abre el proyecto de la app y selecciona el esquema para Mac que quieras revisar. Anota qué destinos y configuraciones condicionales pueden proporcionar mensajes a la interfaz afectada; así, la revisión se mantiene dentro de un alcance explícito.

Selecciona el catálogo en el navegador del proyecto y elige Product > Build. Apple documenta que las compilaciones rellenan y actualizan los catálogos de cadenas a partir del texto localizable del código fuente. Con el catálogo seleccionado, elige Editor > Assistant y selecciona una clave para inspeccionar su ubicación en el código fuente. El catálogo también permite volver al código fuente. Localizar y variar texto con un catálogo de cadenas

Si faltan cadenas de Swift que esperabas encontrar, comprueba que esté habilitado el ajuste de compilación Use Compiler to Extract Swift Strings del destino. Apple documenta este requisito previo para la extracción del compilador. Un catálogo con una extracción incompleta es una referencia poco fiable para decidir qué eliminar. Localizar tu app de SwiftUI

Para cada candidata, anota la clave, el catálogo, el consumidor probable y la decisión. Primero busca la clave exacta; luego, su prefijo estable y los envoltorios de localización pertinentes. Inspecciona los valores del modelo y los datos de búsqueda incluidos en el paquete que alimentan esos envoltorios. Repite las compilaciones pertinentes cuando otro destino o condición de compilación cambie el código fuente incluido.

No combines decisiones solo porque dos entradas muestran el mismo texto. Las API de localización de Apple aceptan nombres de tabla, y los recursos que no están en la app principal pueden requerir otro paquete. Rastrea la tabla y el paquete de la búsqueda antes de considerar otra entrada como sustituta. Preparar el texto de tu app para la traducción

¿Cómo se conservan los mensajes a los que se hace referencia de forma dinámica?

Apple documenta la administración manual específicamente para las cadenas cuyas claves se construyen dinámicamente. Selecciona la entrada necesaria y, en el inspector, configúrala como administrada manualmente. Xcode no actualiza ni elimina estas entradas durante la sincronización de localización posterior a la compilación. Para una entrada dinámica que falte, Apple también muestra cómo añadir una cadena manual con el botón más del catálogo. Descubrir los catálogos de cadenas

La administración manual requiere una regla de mantenimiento explícita. Anota las claves válidas junto al código o los datos que las seleccionan y explica su uso en los comentarios del catálogo. Si más adelante eliminas un modo compatible, revisa también su entrada manual: la extracción automática no hará esa limpieza por ti.

Comprueba si SwiftUI realmente realiza una búsqueda

Una variable String pasada a Text se muestra sin localización. Para usar una variable como clave de búsqueda, Apple documenta que se construya un LocalizedStringKey a partir de ella. Un literal que se pasa directamente a Text sigue automáticamente la ruta localizable. Estas variantes pueden producir el mismo texto en el idioma de origen y comportarse de forma distinta. LocalizedStringKey

La siguiente app de demostración completa mantiene separadas una clave seleccionada en tiempo de ejecución y un recuento interpolado. En un proyecto desechable de app para Mac con SwiftUI, Xcode 15 o posterior y un destino de implementación macOS 13, sustituye la declaración de app generada por este código. Deja una sola declaración @main. Se revisó el código con las API documentadas; no se compiló aquí porque no había disponible una cadena de herramientas de Swift.

import SwiftUI

@main
struct CatalogReviewDemoApp: App {
    var body: some Scene {
        WindowGroup {
            CatalogReviewView()
        }
    }
}

struct CatalogReviewView: View {
    @State private var compact = true
    @State private var itemCount = 2

    private var selectedKey: String {
        "panel." + (compact ? "compact" : "expanded")
    }

    var body: some View {
        VStack(alignment: .leading, spacing: 12) {
            Toggle("Compact layout", isOn: $compact)

            Text(LocalizedStringKey(selectedKey))

            Text("\(itemCount) items",
                 comment: "Number of items in the sample panel.")

            Button("Add item") {
                itemCount += 1
            }
        }
        .padding()
        .frame(minWidth: 320)
    }
}

Añade Localizable.xcstrings al destino de la app. Añade las entradas administradas manualmente panel.compact y panel.expanded, con los valores de origen Compact panel y Expanded panel. Compila el proyecto para extraer los mensajes literales. La conversión explícita a LocalizedStringKey solicita una búsqueda en tiempo de ejecución; no proporciona al extractor una declaración literal de todas las claves posibles que se pueden construir.

Para un conjunto pequeño y finito de opciones, considera sustituir la construcción de claves por literales localizables explícitos en cada rama. Para interfaces personalizadas que pasan mensajes entre componentes, Apple recomienda LocalizedStringResource, que contiene información de localización como una tabla, un comentario y un valor predeterminado. Elige la representación que facilite inspeccionar todo el conjunto de mensajes compatibles. Preparar el texto de tu app para la traducción

¿Por qué los recuentos cambiantes son distintos de las claves cambiantes?

En la demostración, seleccionar un diseño cambia la clave del mensaje que busca la app. Cambiar itemCount proporciona un argumento distinto para un mismo mensaje localizable. La interpolación de SwiftUI convierte los valores insertados en marcadores de formato para la localización; la representación en tiempo de ejecución les asigna sus valores. Localizar tu app de SwiftUI

Por tanto, no necesitas claves independientes para las etiquetas representadas 2 items, 3 items y 4 items. Compila el ejemplo, busca el mensaje de recuento extraído, haz Control-clic en su clave y elige Vary by Plural. Para una localización de origen en inglés, introduce %lld item para One y %lld items para Other, usando el marcador entero que muestra Xcode. Apple documenta este flujo de trabajo para mensajes de recuento y la incorporación de las variantes plurales adecuadas para otras localizaciones compatibles. Localizar y variar texto con un catálogo de cadenas

Al limpiar el catálogo, inspecciona el mensaje de recuento como un recurso completo, incluidas sus variantes. Que una frase representada como 4 items no aparezca en el código fuente no indica si se usa el mensaje interpolado subyacente. Del mismo modo, conservar una plantilla de recuento no mantiene una clave dinámica que no esté relacionada solo porque ambos mensajes aparezcan en el mismo panel.

¿Qué entradas debería eliminar realmente una limpieza?

Considera una revisión ilustrativa de 24 candidatas. Estas cantidades describen un ejemplo sintético, no el resultado medido de un proyecto.

Resultado de la revisión Entradas Acción
Los únicos consumidores pertenecían a un panel eliminado 9 Eliminar después de confirmar que el panel y sus datos de búsqueda ya no existen
Las claves siguen siendo accesibles mediante selección en tiempo de ejecución 8 Conservar y documentar la administración manual
Las referencias pertenecen a otro destino o a una compilación condicional 5 Conservar y verificar el alcance de esa compilación
No se ha resuelto el origen de la clave 2 Conservar mientras se investiga
Total revisado 24 9 candidatas a eliminación

Este cálculo hace que la decisión de limpieza sea auditable: revisar 24 entradas no implica eliminar 24. Para cada una de las nueve candidatas a eliminación, conserva una breve justificación que identifique el consumidor eliminado y las rutas de búsqueda en tiempo de ejecución que se comprobaron. Para las ocho entradas dinámicas, anota el conjunto de claves permitido para que la próxima revisión pueda repetir la decisión.

Elimina solo las candidatas confirmadas y luego inspecciona las diferencias del catálogo. Comprueba que el cambio incluya las claves previstas y sus traducciones asociadas, sin que desaparezcan variantes plurales o de dispositivo que no estén relacionadas. Vuelve a compilar las configuraciones pertinentes. Si una clave eliminada reaparece durante la extracción, vuelve a revisar su consumidor antes de eliminarla otra vez.

¿Cómo verificas los mensajes conservados en tu Mac?

Usa Product > Scheme > Edit Scheme, selecciona Run y abre Options. Elige una localización compatible existente en App Language, cierra el editor y ejecuta el destino para Mac. Apple documenta estos controles del esquema para probar compilaciones localizadas. Repite el proceso para las localizaciones compatibles con tu app. Probar las localizaciones al ejecutar tu app

Prueba todas las opciones dinámicas permitidas, incluidos ambos diseños de la demostración. Confirma que la app muestre los valores esperados del catálogo en lugar de los identificadores. Para los mensajes de recuento, comprueba valores de prueba como 0, 1, 2 y 12, y verifica las categorías plurales adicionales que requieran las localizaciones compatibles con tu app. Basta con cambiar el recuento inicial del ejemplo para probar esos valores.

Si un mensaje conservado se muestra incorrectamente, inspecciona la clave exacta, la tabla, el paquete y el inicializador de Text antes de cambiar el catálogo. El nuevo flujo de generación de símbolos de Apple también puede facilitar la referencia a recursos manuales: Xcode 26 introdujo la generación de símbolos para catálogos de cadenas, que se habilita en proyectos existentes mediante Generate String Catalog Symbols. Es una opción de refactorización, no una prueba de que un recurso manual sin referencias esté sin usar. Ejercicio guiado: Explorar la localización con Xcode

Termina con un conjunto pequeño y justificable de eliminaciones y una lista documentada de los mensajes dinámicos conservados. El resultado útil es un catálogo cuyas entradas restantes tengan consumidores identificables y cuyos mensajes con claves seleccionadas en tiempo de ejecución y recuentos formateados sigan funcionando en la interfaz de Mac.

Fuentes