Maak een label in een Mac-app met meervoudsvormen compleet door meervoudsvarianten toe te voegen in Xcode, alle categorieën in te vullen die nodig zijn voor elke ondersteunde lokalisatie en de weergegeven resultaten te testen. Deze handleiding gebruikt een synthetisch bericht over itemselectie.
De taak is om één aantalafhankelijk label in een SwiftUI-Mac-app af te maken. Het bericht geeft aan hoeveel items zijn geselecteerd, accepteert een niet-negatief geheel getal en behoudt die betekenis in alle vertalingen. De workflow combineert categoriedekking, controles van plaatsaanduidingen en runtime-tests, zodat een ingevulde catalogusvermelding een duidelijke acceptatienorm heeft.
Wat is er nodig voor volledige dekking van meervoudsvormen?
Apple raadt String Catalogs aan voor lokalisatie van meervoudsvormen in Xcode 15 en hoger. De documentatie over meervouden maakt onderscheid tussen een verplichte terugvalvorm en grammaticale volledigheid: other is verplicht in een strings dictionary, maar het weglaten van aanvullende taalspecifieke categorieën kan tot onjuiste grammatica leiden. Engels vereist one en other; de categorie zero is optioneel. Strings met meervoudsvormen lokaliseren.
De mogelijke categorienamen zijn zero, one, two, few, many en other. Ze beschrijven taalspecifieke grammaticale groepen, niet zes numerieke bereiken die voor elke taal gelden. Een categorie met de naam one moet geen universele toepassingsregel worden die alleen controleert of het aantal gelijk is aan één. Unicode definieert categorieën op basis van veranderingen die getallen in een zin vereisen, waaronder veranderingen buiten het zelfstandig naamwoord zelf. Meervoudsregels.
Gebruik voor deze taak het volgende berichtcontract. Dit zijn illustratieve toepassingsvereisten, geen door Apple opgelegde vereisten.
| Contractveld | Vereiste voor dit voorbeeld |
|---|---|
| Berichtsleutel | selection.count |
| Engelse standaardwaarde | \(count) items selected |
| Invoer | Eén niet-negatieve Swift-Int met de naam count |
| Betekenis | Aantal momenteel geselecteerde items |
| Uitvoer | Eén volledig gelokaliseerd label met het aantal |
| Dekking | Elke ondersteunde lokalisatie, inclusief de bronnlokalisatie |
| Acceptatie | Vereiste categorieën ingevuld, numerieke substitutie behouden, representatieve uitvoer gecontroleerd |
Dat het getal in dit label moet voorkomen, is een bewuste keuze. Apple staat meervoudsvarianten toe die een getal uitschrijven of de numerieke opmaakspecificatie weglaten. Een ander berichtcontract kan dat toestaan. Hier maakt het zichtbaar houden van het aantal het eenvoudiger om het label te vergelijken met de selectie waarnaar het verwijst. Strings met meervoudsvormen lokaliseren.
Koppel het Swift-bericht aan de catalogus
Swift’s String.LocalizationValue ondersteunt lokaliseerbare tekst met interpolatie tijdens runtime. Wanneer een stabiele identificatie moet verschillen van de Engelse brontekst, verwijst Apple ontwikkelaars naar een String-initializer met een afzonderlijke defaultValue. Dat past bij selection.count: de identificatie geeft het bericht een naam en de standaardwaarde levert de Engelse formulering. String.LocalizationValue.
Maak voor een kleine testapp in Xcode 15 of hoger een macOS-appproject met SwiftUI en een macOS-implementatiedoel van 12 of hoger. Vervang het gegenereerde app-invoerbestand door het volledige programma hieronder; houd in het doel slechts één @main-declaratie over. Voeg Localizable.xcstrings toe aan het appdoel voordat je de catalogusstappen volgt. Voor het programma zijn Xcode en de macOS SDK vereist; het is niet gecompileerd in deze onderzoeksomgeving.
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)
}
}
De items in de numerieke keuzelijst zijn testinvoer. De gelokaliseerde samenvatting wordt opgehaald met String(localized:defaultValue:comment:) en vervolgens als resulterende tekenreeks weergegeven. Apple documenteert dat het eerste argument van de initializer de opzoeksleutel levert, de standaardwaarde de brontekst levert en opmerkingen vertaalcontext bieden. Xcode haalt tijdens een build tekenreeksen uit lokaliseerbare API’s. De tekst van je app voorbereiden op vertaling.
Houd het gehele getal binnen de lokaliseerbare interpolatie. Bouw voor dit contract geen afzonderlijke Engelse zinnen voor enkelvoud en meervoud op in vertakkingen van de app. Met één bericht heeft de catalogus één duidelijke taak: de passende gelokaliseerde formulering kiezen voor het opgegeven aantal.
Vul de categorieën in voor elke ondersteunde lokalisatie
Gebruik de editor van Xcode om de variatiestructuur te maken:
- Kies
Product > Buildom de catalogus te vullen. - Open
Localizable.xcstringsen selecteer de bronnlokalisatie. - Control-klik op
selection.counten kiesVary by Plural. - Vul elke variant voor de brontaal in.
- Voeg ondersteunde lokalisaties toe met de knop
Addin de zijbalk en vul vervolgens hun varianten in.
Xcode voegt taalspecifieke meervoudsvormen toe en bepaalt de opmaakspecificatie voor de interpolatie. Door de meervoudsvariatie toe te passen op de bronnlokalisatie blijft de variatiestructuur tussen talen gesynchroniseerd; als je die alleen op een andere lokalisatie toepast, heeft dat alleen effect op die lokalisatie. Tekst lokaliseren en variëren met een stringcatalogus.
Voor deze integerinterpolatie kunnen de Engelse vermeldingen er als volgt uitzien:
| Engelse categorie | Cataloguswaarde |
|---|---|
one |
%lld item geselecteerd |
other |
%lld items geselecteerd |
Gebruik voor het daadwerkelijke interpolatietype de specificatie die Xcode genereert. In het gedocumenteerde gehele-getalvoorbeeld van Apple wordt %lld gebruikt; een andere plaatsaanduiding naar een vertaling kopiëren kan het argumentcontract verbreken. Xcode vult variatievelden aanvankelijk met de waarde van de sleutel, dus controleer de formulering in elk veld. Tekst lokaliseren en variëren met een stringcatalogus.
Maak een dekkingswerkblad met één rij per daadwerkelijke lokalisatie-identificatie. Noteer welke categorieën Xcode voor dit bericht genereert, of elke categorie definitieve tekst heeft en welke invoer je gaat testen. Met de echte identificaties van het project voorkom je dat een algemene taalaanduiding een niet-beoordeelde lokalisatie verhult.
Kopieer de Engelse categorieset niet naar elke rij. Eis evenmin overal alle zes categorieën. Laat de catalogus de werkstructuur leveren en raadpleeg vervolgens de hoofdmeervoudsregels van de taal om testinvoer te kiezen. Hoofdmeervoudsregels gaan over hoeveelheden; rangtelwoordregels gaan over posities en beantwoorden een andere vraag. Unicode beschrijft deze als afzonderlijke regeltypen. Unicode Technical Standard #35: Numbers.
Valideer structuur, plaatsaanduidingen en weergegeven tekst afzonderlijk
Voer drie controles uit, omdat elke controle een andere vraag beantwoordt. Een ontbrekende categorie is een dekkingsprobleem; een onjuiste plaatsaanduiding is een opmaakprobleem; een onnatuurlijke zin is een formuleringprobleem. Door ze apart vast te leggen, is duidelijk wat de volgende correctie moet zijn.
Controleer de categoriedekking
Vergelijk voor elke rij op het werkblad de verwachte categorieën met de ingevulde catalogusvermeldingen. Bevestig dat other bestaat en dat geen enkele verwachte categorie een lege waarde of een onvoltooide kopie van de brontekst bevat.
Definieer voor een eenvoudige volledigheidscontrole de verwachte set als de categorieën die voor die lokalisatie zijn gegenereerd, plus eventuele bewuste ondersteunde overschrijving. De ontbrekende set bestaat uit de verwachte categorieën minus de categorieën met definitieve tekst. Elk ontbrekend lid betekent dat het bericht volgens de acceptatienorm van dit artikel onaf is. Dit is een praktische beoordelingsmethode op basis van de gedocumenteerde variatieworkflow, geen bewering dat Xcode deze exacte checklist afdwingt.
Als twee categorieën terecht dezelfde formulering hebben, behoud die formulering waar nodig en beoordeel beide vermeldingen. Het doel is de betekenis van het bericht in de vereiste categorieën te behouden; zichtbare verschillen tussen elk paar tekenreeksen zijn niet nodig.
Controleer de numerieke substitutie
Bouw het project en beoordeel de catalogusdiagnostiek. Apple documenteert validatie van String Catalogs voor veelvoorkomende problemen, zoals niet-overeenkomende opmaakspecificaties. Los die diagnostiek op en controleer vervolgens of elke variant nog steeds voldoet aan de eis van dit bericht om het aantal weer te geven. Meertalige apps bouwen.
Controleer voor dit voorbeeld met één argument of de numerieke plaatsaanduiding aanwezig is, nog steeds numeriek is en één keer op de bedoelde plek wordt ingevoegd. Een geslaagde build is nuttig bewijs, maar voor de acceptatiebeslissing zijn ook categoriedekking en daadwerkelijke weergegeven tekst nodig.
Test representatieve aantallen in de Mac-app
Kies Product > Scheme > Edit Scheme, selecteer Run en open Options. Stel App Language en de toepasselijke App Region in, sluit het dialoogvenster en start de Mac-app. Herhaal dit voor elke ondersteunde lokalisatie. Apple documenteert deze procedure met schema’s voor het testen van gelokaliseerde uitvoer. Lokalisaties testen tijdens het uitvoeren van je app.
De voorbeeldkeuzelijst biedt een startset aantallen, geen universele categoriedekking. Voeg voor elke lokalisatie passende waarden toe voordat je de bijbehorende testrij als voltooid beschouwt.
| Testkeuze | Wat wordt gecontroleerd |
|---|---|
0, 1 en 2 |
Lege selectie, selectie van één item en een kleine selectie van meerdere items |
| Ten minste één representatieve invoer per vereiste categorie | Dekking van de grammaticale onderscheidingen van de lokalisatie |
| Waarden aan weerszijden van relevante regelgrenzen | Categoriewijzigingen bij andere aantallen dan de kleinste |
| Een groot geldig aantal | Numerieke substitutie en beschikbare ruimte voor het label |
| Elke geteste invoer | Betekenis, volledige formulering en zichtbaarheid van het aantal |
De regels van Unicode koppelen categorieën aan voorwaarden en voorbeeldwaarden; numerieke details, waaronder decimale cijfers, kunnen van belang zijn. Dit contract accepteert alleen gehele getallen. Als de app later decimale hoeveelheden accepteert, pas dan de interpolatie, brontekst en tests gezamenlijk aan in plaats van ervan uit te gaan dat de resultaten voor gehele getallen nog steeds voldoende dekking bieden. Unicode Technical Standard #35: Numbers.
Een onverwacht resultaat diagnosticeren
Gebruik het waargenomen symptoom om te bepalen wat je vervolgens controleert:
| Symptoom | Volgende actie |
|---|---|
selection.count ontbreekt in de catalogus |
Bouw opnieuw en controleer de lokaliseerbare aanroep en de geselecteerde tabel |
| Slechts één lokalisatie heeft meervoudsvarianten | Controleer opnieuw waar Vary by Plural is toegepast |
| Een variant bevat nog Engelse meervoudsformulering | Controleer het vooraf ingevulde veld en lever de voltooide vertaling aan |
| Het weergegeven getal ontbreekt of is misvormd | Vergelijk de plaatsaanduiding van de variant met de door Xcode gegenereerde specificatie en het berichtcontract |
| Een groter aantal krijgt onverwachte formulering | Controleer de categorieverwantschap van die lokalisatie en voeg een representatieve test toe |
| De juiste formulering past niet | Pas de weergave aan en test het volledige label opnieuw |
Voor een ouder project met een Xcode-versie van vóór versie 15 is .strings en .stringsdict de door Apple ondersteunde route. Het woordenboek voor meervouden levert taalspecifieke varianten en vereist other; het neemt niet weg dat je de overige categorieën moet invullen die nodig zijn voor correcte grammatica. Strings met meervoudsvormen lokaliseren.
Rond het bericht af wanneer elke ondersteunde lokalisatie een ingevulde dekkingsrij heeft, de plaatsaanduidingen aan het contract voldoen en representatieve aantallen in de draaiende app het bedoelde label opleveren. Bekijk die rijen opnieuw wanneer de ondersteunde lokalisaties, het numerieke invoertype of de betekenis van het bericht verandert.
Bronnen
- Tekst lokaliseren en variëren met een stringcatalogus — Apple
- Strings met meervoudsvormen lokaliseren — Apple
- String.LocalizationValue — Apple
- De tekst van je app voorbereiden op vertaling — Apple
- Lokalisaties testen tijdens het uitvoeren van je app — Apple
- Meertalige apps bouwen — Apple
- Meervoudsregels — Unicode Consortium
- Unicode Technical Standard #35: Unicode Common Locale Data & Rules (CLDR), deel 3: Getallen — Unicode Consortium