För att färdigställa en pluraliserad etikett i en Mac-app lägger du till pluralvarianter i Xcode, anger alla kategorier som behövs för varje språkversion som stöds och testar de återgivna resultaten. Den här genomgången använder ett syntetiskt meddelande om objektval.
Uppgiften är att färdigställa en enda antalsberoende etikett i en SwiftUI-app för Mac. Meddelandet anger hur många objekt som är markerade, tar emot ett icke-negativt heltal och bevarar betydelsen i översättningarna. Arbetsflödet kombinerar kategoritäckning, platshållarkontroller och körtidstester så att en ifylld katalogpost får en tydlig godkännandestandard.
Vad krävs för fullständig täckning av pluralformer?
Apple rekommenderar strängkataloger för pluralöversättning i Xcode 15 och senare. Dokumentationen om pluralformer skiljer mellan en obligatorisk reservform och grammatisk fullständighet: other är obligatorisk i en strängordlista, men om ytterligare språkspecifika kategorier utelämnas kan grammatiken bli felaktig. Engelska kräver one och other; kategorin zero är valfri. Lokalisera strängar som innehåller pluralformer.
De möjliga kategorinamnen är zero, one, two, few, many och other. De beskriver språkberoende grammatiska grupperingar, inte sex numeriska intervall som är gemensamma för alla språk. En kategori med namnet one bör inte bli en universell programregel som bara kontrollerar om antalet är ett. Unicode definierar kategorier utifrån de förändringar som tal kräver i en fras, däribland förändringar som påverkar mer än bara substantivet. Pluralregler.
Använd följande meddelandekontrakt för den här uppgiften. Det här är exempel på applikationskrav, inte krav från Apple.
| Kontraktsfält | Krav för det här exemplet |
|---|---|
| Meddelandenyckel | selection.count |
| Engelskt standardvärde | \(count) items selected |
| Indata | Ett icke-negativt Swift-Int med namnet count |
| Betydelse | Antal objekt som är markerade just nu |
| Utdata | En fullständig lokaliserad etikett som innehåller antalet |
| Täckning | Varje språkversion som stöds, inklusive källspråket |
| Godkännande | Obligatoriska kategorier ifyllda, numerisk substitution bevarad, representativa utdata kontrollerade |
Att kräva att talet visas är ett medvetet val för den här etiketten. Apple tillåter pluralvarianter som skriver ut talet med bokstäver eller utelämnar den numeriska formatangivelsen. Ett annat meddelandekontrakt skulle kunna tillåta det. Här gör det synliga antalet det enklare att jämföra etiketten med urvalet den beskriver. Lokalisera strängar som innehåller pluralformer.
Koppla Swift-meddelandet till katalogen
Swifts String.LocalizationValue stöder lokaliserbar text med interpolation vid körning. När en stabil identifierare ska skilja sig från den engelska källtexten hänvisar Apple utvecklare till en String-initializer med ett separat defaultValue. Det passar selection.count: identifieraren namnger meddelandet, medan standardvärdet anger den engelska formuleringen. String.LocalizationValue.
För en liten testapp skapar du ett macOS-approjekt med SwiftUI i Xcode 15 eller senare och ett distributionsmål för macOS 12 eller senare. Ersätt den genererade appens startfil med hela programmet nedan; ha bara en @main-deklaration i målet. Lägg till Localizable.xcstrings i appmålet innan du följer stegen för katalogen. Programmet kräver Xcode och macOS SDK; det kompilerades inte i den här forskningsmiljön.
import Foundation
import SwiftUI
@main
struct PluralSampleApp: App {
var body: some Scene {
WindowGroup {
PluralSampleView()
}
}
}
struct PluralSampleView: View {
@State private var count: Int = 1
private let samples: [Int] = [
0, 1, 2, 3, 4, 5, 10, 11, 12,
20, 21, 22, 100, 101, 102, 1_000_000
]
private var selectionLabel: String {
String(
localized: "selection.count",
defaultValue: "\(count) items selected",
comment: "Selection summary. The integer is the number of selected items. Keep the count visible in every plural variant."
)
}
var body: some View {
VStack(alignment: .leading, spacing: 16) {
Picker("Sample count", selection: $count) {
ForEach(samples, id: \.self) { value in
Text(verbatim: String(value)).tag(value)
}
}
Text(verbatim: selectionLabel)
}
.padding(24)
.frame(minWidth: 360)
}
}
Posterna i den numeriska väljaren är testindata. Den lokaliserade sammanfattningen slås upp med String(localized:defaultValue:comment:) och visas sedan som den resulterande strängen. Apple dokumenterar att det första argumentet till initializern anger uppslagsnyckeln, standardvärdet anger källtexten och kommentarer ger översättningskontext. Xcode extraherar strängar som skickas genom lokaliserbara API:er vid en bygge. Förbered appens text för översättning.
Behåll heltalet i den lokaliserbara interpoleringen. För det här kontraktet ska du inte bygga separata engelska meningar för singular och plural i programgrenar. Med ett enda meddelande får katalogen ett tydligt ansvar: att välja lämplig lokaliserad formulering för det angivna antalet.
Ange kategorierna för varje språkversion som stöds
Använd Xcodes redigerare för att skapa variationsstrukturen:
- Välj
Product > Buildför att fylla katalogen. - Öppna
Localizable.xcstringsoch välj källspråket. - Kontrollklicka på
selection.countoch väljVary by Plural. - Fyll i varje variant för källspråket.
- Lägg till språkversioner som stöds med knappen
Addi sidofältet och fyll sedan i deras varianter.
Xcode lägger till språkspecifika pluralformer och avgör interpoleringens formatangivelse. Om pluralvariation tillämpas på källspråket synkroniseras variationsstrukturen mellan språken; om den bara tillämpas på en annan språkversion påverkas endast den språkversionen. Lokalisera och variera text med en strängkatalog.
För den här heltalsinterpoleringen kan de engelska posterna vara:
| Engelsk kategori | Katalogvärde |
|---|---|
one |
%lld item selected |
other |
%lld items selected |
Använd den formatangivelse som Xcode genererar för den faktiska interpoleringstypen. Apples dokumenterade heltalsexempel använder %lld; om du kopierar en annan platshållare till en översättning kan argumentkontraktet brytas. Xcode fyller inledningsvis variationsfälten med nyckelns värde, så kontrollera formuleringen i varje fält. Lokalisera och variera text med en strängkatalog.
Skapa ett täckningsblad med en rad för varje faktisk språkversionsidentifierare. Anteckna vilka kategorier Xcode genererar för det här meddelandet, om texten i varje kategori är färdig och vilka indata du ska testa. Med projektets faktiska identifierare undviker du att en bred språkbenämning döljer en språkversion som inte granskats.
Kopiera inte den engelska uppsättningen kategorier till varje rad. Kräv inte heller alla sex kategorier överallt. Låt katalogen ge dig den fungerande strukturen och rådfråga sedan språkets kardinalregler för plural när du väljer testindata. Kardinalregler gäller antal; ordinalregler gäller positioner och besvarar en annan fråga. Unicode dokumenterar dessa som skilda regeltyper. Unicode Technical Standard #35: Numbers.
Validera struktur, platshållare och återgiven text separat
Använd tre kontroller eftersom de besvarar olika frågor. En kategori som saknas är ett täckningsproblem; en felaktig platshållare är ett formateringsproblem; en onaturlig mening är ett formuleringsproblem. Om du dokumenterar dem separat blir nästa korrigering tydlig.
Kontrollera kategoritäckningen
Jämför de förväntade kategorierna med de ifyllda katalogposterna för varje rad i täckningsbladet. Bekräfta att other finns och att ingen förväntad kategori innehåller ett tomt värde eller en ofärdig kopia av källtexten.
För en enkel fullständighetskontroll definierar du den förväntade mängden som de kategorier som genererats för språkversionen plus eventuella avsiktliga åsidosättningar. Mängden saknade kategorier är de förväntade kategorierna minus de kategorier som innehåller färdig text. Om någon kategori saknas är meddelandet ofärdigt enligt den här artikelns godkännandestandard. Det här är en praktisk granskningsmetod som utgår från det dokumenterade variationsarbetsflödet, inte ett påstående om att Xcode tillämpar just den här checklistan.
Om två kategorier med rätta har identisk formulering låter du formuleringen stå kvar där den behövs och granskar båda posterna. Målet är att bevara meddelandets betydelse i de kategorier som krävs; strängarna behöver inte skilja sig synligt åt parvis.
Kontrollera den numeriska substitutionen
Bygg projektet och granska katalogens diagnostik. Apple dokumenterar validering av strängkataloger för vanliga problem, till exempel formatangivelser som inte stämmer överens. Åtgärda diagnostiken och kontrollera sedan att varje variant fortfarande uppfyller kravet i meddelandet på att visa antalet. Bygg appar redo för flera språk.
För det här exemplet med ett enda argument ska du kontrollera att den numeriska platshållaren finns, fortfarande är numerisk och infogas en gång på avsedd plats. Ett lyckat bygge är användbart belägg, men beslutet om godkännande kräver också kategoritäckning och faktisk återgiven text.
Testa representativa antal i Mac-appen
Välj Product > Scheme > Edit Scheme, välj Run och öppna Options. Ange App Language och tillämplig App Region, stäng dialogrutan och kör Mac-appen. Upprepa för varje språkversion som stöds. Apple dokumenterar detta schemabaserade förfarande för att testa lokaliserade utdata. Testa lokaliseringar när du kör appen.
Väljaren i exemplet ger en startuppsättning antal, inte universell täckning av kategorier. Lägg till värden som passar varje språkversion innan du markerar dess testrad som färdig.
| Testval | Vad det kontrollerar |
|---|---|
0, 1 och 2 |
Tomt urval, enstaka objekt och ett litet urval med flera objekt |
| Minst ett representativt indata per obligatorisk kategori | Täckning av språkversionens grammatiska skillnader |
| Värden på vardera sidan om relevanta regelgränser | Kategoriförändringar utöver de minsta antalen |
| Ett stort giltigt antal | Numerisk substitution och tillgängligt utrymme för etiketten |
| Varje testat indata | Betydelse, fullständig formulering och synligt antal |
Unicodes regler kopplar kategorier till villkor och exempelvärden; numeriska detaljer, däribland decimaler, kan spela roll. Det här kontraktet godtar endast heltal. Om appen senare godtar decimala mängder ska du uppdatera interpoleringen, källformuleringen och testerna tillsammans i stället för att utgå från att heltalsresultaten fortfarande ger full täckning. Unicode Technical Standard #35: Numbers.
Felsök ett oväntat resultat
Använd det observerade symtomet för att välja vad du ska granska härnäst:
| Symtom | Nästa åtgärd |
|---|---|
selection.count saknas i katalogen |
Bygg igen och granska det lokaliserbara anropet och den valda tabellen |
| Endast en språkversion har pluralvarianter | Kontrollera var Vary by Plural tillämpades |
| En variant har fortfarande engelsk pluralformulering | Granska det förifyllda fältet och ange den färdiga översättningen |
| Det visade talet saknas eller är felaktigt formaterat | Jämför variantens platshållare med Xcodes genererade formatangivelse och meddelandekontraktet |
| Ett större antal ger oväntad formulering | Kontrollera språkversionens kategoriregel och lägg till ett representativt test |
| Korrekt formulering får inte plats | Justera vyn och testa hela etiketten igen |
För ett äldre projekt med en Xcode-version före 15 använder Apples rekommenderade väg resurserna .strings och .stringsdict. Pluralordlistan tillhandahåller språkspecifika varianter och kräver other; den undanröjer inte behovet av att ange de övriga kategorier som krävs för korrekt grammatik. Lokalisera strängar som innehåller pluralformer.
Färdigställ meddelandet när varje språkversion som stöds har en ifylld täckningsrad, dess platshållare uppfyller kontraktet och representativa antal ger den avsedda etiketten i appen när den körs. Gå igenom raderna igen när de språkversioner som stöds, typen av numerisk indata eller meddelandets betydelse ändras.
Källor
- Lokalisera och variera text med en strängkatalog — Apple
- Lokalisera strängar som innehåller pluralformer — Apple
- String.LocalizationValue — Apple
- Förbered appens text för översättning — Apple
- Testa lokaliseringar när du kör appen — Apple
- Bygg appar redo för flera språk — Apple
- Pluralregler — Unicode-konsortiet
- Unicode Technical Standard #35: Unicode Common Locale Data & Rules (CLDR), del 3: Numbers — Unicode-konsortiet