0Pricing
Swift Academy · Lekcja

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; .stringsdict zachowuj 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 .stringsdict robi 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

  1. Katalogi String i zlokalizowane ciągi
  2. Liczba mnoga i Stringsdict
  3. Formatowanie zależne od ustawień regionalnych
  4. Kierunek od prawej do lewej i kierunek układu
← Powrót do Swift Academy