För att ta bort oanvända lokaliseringsnycklar i Xcode, behandla Stale-poster som granskingskandidater. Kontrollera körningsnyckelkonstruktion innan radering, bevara nödvändiga dynamiska meddelanden som manuellt hanterade poster, och testa de berörda Mac-appsskärmarna efter rensning.

Den här guiden riktar sig till en utvecklare som underhåller en SwiftUI Mac-app med strängkataloger. Uppgiften är en katalogrensning: identifiera meddelanden som kan tas bort samtidigt som etiketter och räknemeddelanden som appen fortfarande visar bevaras. Beslutsstödet nedan skiljer extraktionsbevis från körningsbeteende.

Vad betyder en föråldrad lokaliseringsnyckel egentligen?

Xcode upptäcker lokaliserbara strängar vid byggprocesser. Apple förklarar att extraktion täcker det aktuella schemat och plattformen. När en tidigare extraherad sträng försvinner, kan Xcode ta bort en översatt post automatiskt; en post med översättningar kvarstår och får Stale-status. Den statusen betyder att Xcode inte längre hittar strängen i koden. Apple gör raderingen explicit villkorlig genom att kräva bekräftelse på att strängen inte längre behövs. Discover String Catalogs

Den praktiska konsekvensen är att en saknad källreferens inleder en undersökning. En exakt sökning efter panel.compact kan hitta en litterär referens, men den kan inte fastställa om koden konstruerar nyckeln genom att sammanfoga panel. med ett valt läge. Granska både kandidatnyckeln och koden som producerar söknycklar.

Använd den föreslagna granskningstabellen för varje kandidat. Det är ett beslutsstöd härlett från den dokumenterade extraktionsgränsen, inte en ytterligare Xcode-funktion.

Bevis funnen vid granskning Beslut Nästa åtgärd
En borttagen skärm var dess enda konsument; ingen körningsnyckelproducerare kvarstår Radera kandidat Ta bort posten, bygg sedan om och kontrollera ändringen
Körningskod kan fortfarande producera denna exakta nyckel Behåll Bevara den genom manuell hantering eller ersätt sökningen med explicita lokaliserbara referenser
Nyckeln refereras fortfarande i ett annat mål eller byggvillkor Behåll Bygg och inspektera relevant konfiguration
En liknande nyckel finns i en annan tabell Undersök separat Bekräfta tabell och resursbunt som används av varje sökning
Ingen konsument hittas, men nyckelproducerande kod är otydlig Skjut upp Spåra produceraren innan raderingsbeslut fattas

Hur etablerar du en användbar baslinje i Xcode?

Först, spara en återställbar kopia av katalogen eller commita dess nuvarande tillstånd. Öppna sedan app-projektet och välj det Mac-schema du avser att granska. Anteckna vilka mål och villkorsbaserade konfigurationer som kan leverera meddelanden till det berörda gränssnittet; detta håller granskningen knuten till ett explicit omfång.

Välj katalogen i Projektnavigatorn och välj Product > Build. Apple dokumenterar att byggprocesser fyller och uppdaterar strängkataloger från lokaliserbar källtext. Med katalogen vald, välj Editor > Assistent, välj sedan en nyckel för att inspektera dess källplats. Katalogen ger även navigation tillbaka till källan. Localizing and varying text with a string catalog

Om förväntade Swift-strängar saknas, kontrollera att målets Use Compiler to Extract Swift Strings-bygginställning är aktiverad. Apple dokumenterar detta krav för kompilerarextraktion. En katalog fylld med ofullständig extraktion är en dålig baslinje för att bestämma vad som ska tas bort. Localize your SwiftUI app

För varje kandidat, registrera nyckel, katalog, misstänkt konsument och beslut. Sök först efter exakta nyckeln, sedan dess stabila prefix och relevanta lokaliseringsomslag. Inspektera modellvärden och bundlade sökdata som matar dessa omslag. Upprepa relevanta byggprocesser när ett annat mål eller kompilationsvillkor ändrar vilken källkod som ingår.

Slå inte ihop beslut enbart för att två poster visar samma text. Apples lokaliserings-API:er accepterar tabellnamn, och resurser utanför huvudappen kan kräva en annan bunt. Spåra sökningens tabell och bunt innan du behandlar en annan post som ersättning. Preparing your app’s text for translation

Hur bevarar du dynamiskt refererade meddelanden?

Apple dokumenterar manuell hantering specifikt för strängar vars nycklar konstrueras dynamiskt. Välj den nödvändiga posten och använd dess inspektör för att göra den manuellt hanterad. Sådana poster uppdateras inte och tas inte bort av Xcodes efterbyggnadssynkronisering för lokalisering. För en saknad dynamisk post visar Apple även hur man lägger till en manuell sträng med katalogens plusknapp. Discover String Catalogs

Manuell hantering kräver en explicit underhållsregel. Registrera de giltiga nycklarna bredvid koden eller data som väljer dem, och förklara deras användning i katalogkommentarer. När ett stödt läge tas bort senare, granska även dess manuella post; automatisk extraktion kommer inte att utföra den rensningen åt dig.

Kontrollera om SwiftUI faktiskt utför en sökning

En String-variabel som skickas till Text visas utan lokalisering. För att använda en variabel som söknyckel, dokumenterar Apple att man konstruerar en LocalizedStringKey från den. En litteral som skickas direkt till Text tar den lokaliserbara vägen automatiskt. Dessa överladdningar kan ge identisk källspråksutdata medan de beter sig annorlunda. LocalizedStringKey

Följande kompletta demonstrationsapp håller en körningsvald nyckel separat från en interpolerad räknare. I ett tillfälligt SwiftUI Mac-appprojekt med Xcode 15 eller senare och macOS 13 som distributionsmål, ersätt den genererade appdeklarationen med denna kod. Behåll endast en @main-deklaration. Den granskades mot de dokumenterade API:erna; den kompilerades inte här eftersom en Swift-verktygskedja inte var tillgänglig.

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)
    }
}

Lägg till Localizable.xcstrings till app-målet. Lägg till manuellt hanterade poster för panel.compact och panel.expanded, med källvärden Compact panel och Expanded panel. Bygg projektet för att extrahera de litterära meddelandena. Den explicita LocalizedStringKey-konverteringen begär en körningssökning; den levererar inte en litterär deklaration av varje möjlig konstruerad nyckel till extraheraren.

För en liten, ändrad uppsättning val, överväg att ersätta nyckelkonstruktion med explicita lokaliserbara litteraler i varje gren. För anpassade gränssnitt som skickar meddelanden mellan komponenter, rekommenderar Apple LocalizedStringResource, som bär lokaliseringsinformation som tabell, kommentar och standardvärde. Välj den representation som gör den fullständiga uppsättningen stödda meddelanden enklast att inspektera. Preparing your app’s text for translation

Varför är ändrade räknare olika från ändrade nycklar?

I demonstrationen ändrar valet av layout vilken meddelandenyckel appen söker upp. Att ändra itemCount levererar ett annat argument till ett lokaliserbart meddelande. SwiftUI-interpolering konverterar inbäddade värden till formatplatshållare för lokalisering; körningsrendering levererar deras värden. Localize your SwiftUI app

Du behöver därför inte separata nycklar för de renderade etiketterna 2 items, 3 items och 4 items. Bygg exemplet, hitta det extraherade räknemeddelandet, Control-klicka på dess nyckel och välj Vary by Plural. För en engelskkäll lokalisering, ange %lld item för One och %lld items för Other, med hjälp av heltalsplatshållaren som Xcode visar. Apple dokumenterar detta räknemeddelande-arbetsflöde och tillägg av lämpliga pluralvarianter för andra stödda lokaliseringar. Localizing and varying text with a string catalog

Under rensning, inspektera ett räknemeddelande som en komplett resurs, inklusive dess variationer. Frånvaron av en renderad fras som 4 items från källkoden säger inget om om den underliggande interpolerade meddelandet används. Likaså bevarar inte en räkneskabelon en orelaterad dynamisk nyckel bara för att båda meddelanden visas i samma panel.

Vilka poster bör en rensning faktiskt ta bort?

Överväg en illustrativ granskning av 24 kandidater. Dessa antal beskriver ett syntetiskt exempel, inte ett mätprojektresultat.

Granskningresultat Poster Åtgärd
Enda konsumenter hörde till en borttagen panel 9 Radera efter bekräftelse att panelen och dess sökdata är borta
Nycklar förblir tillgängliga genom körningsval 8 Behåll och dokumentera manuell hantering
Referenser tillhör ett annat mål eller villkorlig bygg 5 Behåll och verifiera byggomfattningen
Nyckelursprung förblir olöst 2 Bevara i väntan på undersökning
Totalt granskade 24 9 raderingskandidater

Denna beräkning gör rensningsbeslutet reviderbart: 24 granskade poster innebär inte 24 raderingar. För var och en av de nio raderingskandidaterna, behåll en kort anledning som identifierar den borttagna konsumenten och de kontrollerade körningssökvägarna. För de åtta dynamiska posterna, registrera den tillåtna nyckeluppsättningen så att nästa granskning kan upprepa beslutet.

Ta bort endast de bekräftade kandidaterna, inspektera sedan katalogen diff. Kontrollera att ändringen innehåller de avsedda nycklarna och deras tillhörande översättningar, utan att orelaterade plural- eller enhetsvarianter försvinner. Bygg om relevanta konfigurationer. Om en raderad nyckel återkommer genom extraktion, granska dess konsument innan du raderar den igen.

Hur verifierar du de behållna meddelanden på din Mac?

Använd Product > Scheme > Edit Scheme, välj Run, och öppna Options. Välj en befintlig stödd lokalisering från App Language, stäng redigeraren, och kör Mac-målet. Apple dokumenterar dessa schemakontroller för test av lokaliserade byggar. Upprepa för de lokaliseringar din app stöder. Testing localizations when running your app

Testa alla tillåtna dynamiska val, inklusive båda layouterna i demonstrationen. Bekräfta att appen visar de förväntade katalogvärdena snarare än identifierarna. För räknemeddelanden, kontrollera syntetiska värden som 0, 1, 2 och 12, och verifiera ytterligare pluralkategorier där dina stödda lokaliseringar kräver dem. Att ändra provets initiala räknare räcker för att nå dessa testvärden.

När ett behållet meddelande visar fel, inspektera den exakta nyckeln, tabellen, bunt och Text-initialiseringen innan du ändrar katalogen. Apples nyare genererad-symbol-arbetsflöde kan också göra manuella resurser enklare att referera: Xcode 26 introducerade strängkatalogsymbolgenerering, aktiverad för befintliga projekt genom Generate String Catalog Symbols. Detta är en valfri refaktoreringsväg, inte bevis för att en orefererad manuell resurs är oanvänd. Code-along: Explore localization with Xcode

Avsluta med en liten, förklarlig raderingsuppsättning och en dokumenterad lista över behållna dynamiska meddelanden. Det användbara resultatet är en katalog vars återstående poster har identifierbara konsumenter, med körningsvalda nycklar och formaterade räknemeddelanden som fortfarande fungerar i Mac-gränssnittet.

Källor