Liczba mnoga i Stringsdict
Obsługa reguł liczby mnogiej w różnych językach.
Liczba mnoga i Stringsdict to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Swift Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Swift Academy zawiera 4 lekcji w sumie.
Problem form liczby mnogiej
Angielski ma dwie formy — 1 item, 2 items — dlatego programiści często piszą "\(n) item" + (n == 1 ? "" : "s"). To szybko przestaje działać: arabski ma sześć kategorii liczby mnogiej, rosyjski trzy, a japoński jedną. Umieszczanie logiki liczby mnogiej na stałe to błąd lokalizacyjny, który tylko czeka, by się ujawnić.
// FRAGILE — only works for English
let n = 5
let bad = "\(n) item" + (n == 1 ? "" : "s")
print(bad)Kategorie liczby mnogiej
Unicode definiuje kategorie liczby mnogiej: zero, one, two, few, many, other. Każdy język używa ich podzbioru. System wybiera właściwą kategorię dla danej liczby na podstawie reguł ustawień regionalnych — nie trzeba pisać tych reguł samodzielnie.
// English uses: one, other
// Russian uses: one, few, many, other
// Japanese uses: other (only)
// You provide a variant string per category needed.Warianty liczby mnogiej w katalogu String Catalog
W String Catalog można oznaczyć ciąg znaków jako zawierający warianty liczby mnogiej. Xcode pozwala wtedy dostarczyć tekst dla każdej kategorii. W czasie działania właściwy wariant jest wybierany automatycznie na podstawie interpolowanej liczby i ustawień regionalnych użytkownika.
// Catalog entry, key "message_count":
// one: "You have %lld message"
// other: "You have %lld messages"
let count = 1
let text = String(localized: "You have \(count) messages")
print(text)Starszy format .stringsdict
Przed katalogami String Catalog formy liczby mnogiej znajdowały się w pliku .stringsdict — liście właściwości mapującej klucz na ciąg formatu oraz warianty dla poszczególnych kategorii. Nadal można je spotkać w starszych projektach i są w pełni obsługiwane.
// Localizable.stringsdict (plist) structure:
// key: "items_count"
// NSStringLocalizedFormatKey: "%#@items@"
// items: NSStringPluralRuleType
// one: "%lld item"
// other: "%lld items"Budowa wpisu stringsdict
Każdy wpis zawiera klucz formatu odwołujący się do jednej lub większej liczby nazwanych zmiennych opakowanych w %#@name@. Każda zmienna określa typ reguły (NSStringPluralRuleType), specyfikator typu wartości (%lld) oraz ciąg znaków dla każdej kategorii liczby mnogiej.
// The %#@items@ token expands to the chosen
// plural variant. %lld is the integer placeholder
// substituted inside each variant string.
let n = 3
print(String(localized: "\(n) items selected"))Wyszukiwanie ciągu z odmianą liczebnikową
Z poziomu kodu miejsce wywołania wygląda identycznie jak w przypadku każdego zlokalizowanego ciągu — wystarczy interpolować liczbę. Wybór właściwej formy odbywa się wewnątrz frameworka, dlatego ta sama linia kodu Swift działa w każdym języku.
func messagesLabel(_ count: Int) -> String {
return String(localized: "You have \(count) messages")
}
print(messagesLabel(0))
print(messagesLabel(1))
print(messagesLabel(7))Dlaczego „one” to nie tylko 1
Częstym błędem jest założenie, że kategoria one oznacza dokładnie liczbę 1. W niektórych językach obejmuje ona każdą liczbę kończącą się na 1, na przykład 21 lub 31, a kategoria zero może, ale nie musi być odrębna. Zawsze należy dostarczyć tekst dla każdej kategorii i pozwolić regułom dokonać wyboru.
// Russian: 1, 21, 31 -> 'one'
// 2, 3, 4 -> 'few'
// 5..20, 0 -> 'many'
// Never assume one == 1.Łączenie odmiany liczebnikowej z innymi wartościami
Format może zawierać kilka zmiennych — na przykład liczbę i nazwę. Każda z nich może być odmieniana niezależnie. W String Catalog zaznacza się, która interpolacja podlega odmianie; pozostała część pozostaje stała we wszystkich wariantach.
let files = 2
let folder = "Photos"
let text = String(
localized: "\(files) files in \(folder)")
// 'files' drives the plural; 'folder' is substituted as-is
print(text)Warianty urządzeń i szerokości
Ten sam mechanizm katalogu obsługuje warianty urządzenia i szerokości, dzięki czemu można wyświetlić krótką etykietę na zegarku, a dłuższą na iPadzie, albo zastosować skrót, gdy brakuje miejsca. Warianty te działają razem z wariantami liczebnikowymi.
// Catalog can vary by:
// plural: one / other
// device: iPhone / iPad / watch
// width: short / medium / long
let label = String(localized: "Notifications")
print(label)Testowanie odmiany liczebnikowej
Aby zweryfikować warianty, uruchom aplikację w każdym docelowym języku, korzystając z nadpisania lokalizacji schematu w Xcode, albo użyj pseudojęzyka i podglądów dla poszczególnych lokalizacji. Sprawdź wyrywkowo wartości graniczne: 0, 1, 2, 5, 11, 21, 100.
let samples = [0, 1, 2, 5, 11, 21, 100]
for n in samples {
print(String(localized: "\(n) items"))
}Dobre praktyki
Aby odmiana liczebnikowa była poprawna:
- Nigdy nie łącz ani nie wpisuj na stałe przyrostków
s. - Zapewnij każdą kategorię wymaganą przez docelowe języki.
- Wyprowadzaj odmianę na podstawie interpolowanej liczby całkowitej, a nie wcześniej obliczonego ciągu.
- W nowym kodzie preferuj String Catalogs;
.stringsdictzachowuj tylko dla starszych celów wdrożeniowych.
func cartSummary(_ items: Int) -> String {
String(localized: "Your cart has \(items) items",
comment: "Cart count; pluralized")
}
print(cartSummary(1))Szybki test
Przypomnij sobie, jak powinien być obsługiwany wybór formy liczebnikowej.
Podsumowanie
Nauczyłeś się stosować odmianę liczebnikową poprawną dla lokalizacji:
- Unicode definiuje kategorie liczebnikowe zero, one, two, few, many, other; każdy język wykorzystuje ich podzbiór.
- String Catalogs pozwalają dodawać warianty liczebnikowe dla poszczególnych kluczy; starszy format
.stringsdictrobi to samo za pomocą pliku plist. - Miejsca wywołań pozostają proste — interpolujesz liczbę, a framework wybiera właściwy wariant.
- Nigdy nie wpisuj na stałe logiki odmiany; kategoria one nie oznacza wyłącznie liczby 1.
Często zadawane pytania
Czy lekcja „Liczba mnoga i Stringsdict” jest bezpłatna?
Tak — pełny tekst „Liczba mnoga i Stringsdict” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Swift Academy, przejdź na CoddyKit PRO. Kurs Swift Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Liczba mnoga i Stringsdict”?
Obsługa reguł liczby mnogiej w różnych językach. Ćwiczysz Swift Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Swift Academy?
Nie wymagamy żadnego doświadczenia. Swift Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Liczba mnoga i Stringsdict”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Swift Academy?
Tak. Każda lekcja Swift Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Katalogi String i zlokalizowane ciągi
- Liczba mnoga i Stringsdict
- Formatowanie zależne od ustawień regionalnych
- Kierunek od prawej do lewej i kierunek układu