Swift Academy · Oppitunti

Monikkomuodot ja Stringsdict

Käsittele eri kielten monikkosääntöjä.

Oppitunti 2/413 vaihetta

Monikkomuodot ja Stringsdict on ilmainen Swift Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Swift Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Swift Academy-kurssilla on yhteensä 4 oppituntia.

Monikkomuotojen ongelma

Englannissa on kaksi muotoa — 1 kohde, 2 kohdetta — joten kehittäjät kirjoittavat usein "\(n) item" + (n == 1 ? "" : "s"). Tämä rikkoutuu pahasti: arabiassa on kuusi monikkokategoriaa, venäjässä kolme ja japanissa yksi. Monikkologiikan kovakoodaus on lokalisointivirhe, joka vain odottaa syntymistään.

// FRAGILE — only works for English
let n = 5
let bad = "\(n) item" + (n == 1 ? "" : "s")
print(bad)

Monikkokategoriat

Unicode määrittelee monikkokategoriat: zero, one, two, few, many, other. Kukin kieli käyttää niistä osajoukkoa. Järjestelmä valitsee luvulle oikean kategorian kielialueen sääntöjen perusteella — teidän ei tarvitse kirjoittaa sääntöjä itse.

// English uses: one, other
// Russian uses: one, few, many, other
// Japanese uses: other (only)
// You provide a variant string per category needed.

Monikkomuotovariaatiot String Catalogissa

String Catalogissa merkitsette merkkijonon sisältävän monikkomuotovariaatioita. Sen jälkeen Xcodessa voitte antaa tekstin kutakin kategoriaa varten. Ajon aikana oikea muoto valitaan automaattisesti interpoloidun määrän ja käyttäjän kielialueen perusteella.

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

Perinteinen .stringsdict

Ennen String Catalogeja monikkomuodot tallennettiin .stringsdict-tiedostoon — ominaisuusluetteloon, joka yhdistää avaimen muotoilumerkkijonoon ja kategoriakohtaisiin muotoihin. Näitä näkee edelleen vanhemmissa projekteissa, ja niitä tuetaan yhä täysin.

// Localizable.stringsdict (plist) structure:
// key: "items_count"
//   NSStringLocalizedFormatKey: "%#@items@"
//   items: NSStringPluralRuleType
//     one:   "%lld item"
//     other: "%lld items"

stringsdict-merkinnän rakenne

Jokaisessa merkinnässä on muotoiluavain, joka viittaa yhteen tai useampaan nimettyyn muuttujaan muodossa %#@name@. Jokainen muuttuja ilmoittaa sääntötyypin (NSStringPluralRuleType), arvotyypin määritteen (%lld) ja kunkin monikkokategorian merkkijonon.

// 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"))

Monikkomuotoisen merkkijonon hakeminen

Kutsukohta näyttää koodissa samalta kuin minkä tahansa lokalisoidun merkkijonon tapauksessa — sijoitatte vain lukumäärän merkkijonoon. Monikkomuodon valinta tapahtuu kehyksen sisällä, joten sama Swift-rivi toimii kaikilla kielillä.

func messagesLabel(_ count: Int) -> String {
    return String(localized: "You have \(count) messages")
}
print(messagesLabel(0))
print(messagesLabel(1))
print(messagesLabel(7))

Miksi 'one' ei tarkoita vain lukua 1

Yleinen virhe on olettaa, että one-luokka tarkoittaa täsmälleen lukua 1. Joissakin kielissä se kattaa kaikki luvut, jotka päättyvät numeroon 1, kuten 21 ja 31, ja zero voi olla erillinen luokka tai olla olematta. Jokaiselle luokalle on aina annettava oma teksti, ja sääntöjen on annettava ratkaista valinta.

// Russian: 1, 21, 31 -> 'one'
//          2, 3, 4    -> 'few'
//          5..20, 0   -> 'many'
// Never assume one == 1.

Monikkomuotojen yhdistäminen muihin arvoihin

Muotoilussa voi olla useita muuttujia, esimerkiksi lukumäärä ja nimi. Kumpikin voi muodostaa monikkomuodon itsenäisesti. String Catalogissa merkitään, mikä interpolointi vaihtelee; muu osa pysyy samana eri muunnelmissa.

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)

Leveys- ja laitemuunnelmat

Sama luettelomekanismi tukee myös device- ja width-muunnelmia. Näin kellossa voidaan näyttää lyhyt selite ja iPadissa pidempi tai tekstiä voidaan lyhentää tilan ollessa vähissä. Nämä toimivat yhdessä monikkomuotojen kanssa.

// Catalog can vary by:
//   plural: one / other
//   device: iPhone / iPad / watch
//   width:  short / medium / long
let label = String(localized: "Notifications")
print(label)

Monikkomuotojen testaaminen

Muunnelmien tarkistamiseksi sovellus voidaan suorittaa jokaisella kohdekielellä Xcoden skeeman lokalisoinnin ohituksella tai käyttämällä pseudokieltä ja kielikohtaisia esikatseluja. Tarkistakaa erityisesti rajatapaukset: 0, 1, 2, 5, 11, 21 ja 100.

let samples = [0, 1, 2, 5, 11, 21, 100]
for n in samples {
    print(String(localized: "\(n) items"))
}

Parhaat käytännöt

Oikeiden monikkomuotojen varmistamiseksi:

  • s-päätteitä ei saa koskaan liittää merkkijonoihin tai kirjoittaa niihin suoraan.
  • Kohdekielten tarvitsemat luokat on annettava kaikki.
  • Monikkomuoto on määritettävä interpoloidun kokonaisluvun, ei valmiiksi muodostetun merkkijonon, perusteella.
  • Uudessa koodissa kannattaa suosia String Catalogeja; .stringsdict-tiedostot kannattaa säilyttää vain vanhoja kohteita varten.
func cartSummary(_ items: Int) -> String {
    String(localized: "Your cart has \(items) items",
           comment: "Cart count; pluralized")
}
print(cartSummary(1))

Pikatarkistus

Palauttakaa mieleenne, miten monikkomuodon valinta pitäisi käsitellä.

Kertaus

Opitte kielialueen mukaisen monikkomuotojen käsittelyn:

  • Unicoden monikkoluokat ovat zero, one, two, few, many, other; kukin kieli käyttää niistä osajoukkoa.
  • String Catalogeihin voidaan lisätä avainkohtaisia monikkomuunnelmia; vanhat .stringsdict-tiedostot tekevät saman plist-tiedoston avulla.
  • Kutsukohdat pysyvät yksinkertaisina — interpoloikaa lukumäärä, niin kehys valitsee muunnelman.
  • Monikkomuotojen logiikkaa ei saa kirjoittaa suoraan koodiin; one-luokka ei tarkoita vain lukua 1.
Aloita maksutta

Opi Swift tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
122
Oppitunnit
409

Usein kysytyt kysymykset

Onko oppitunti ”Monikkomuodot ja Stringsdict” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Swift Academy-oppimispolun 3 oppituntia, myös oppitunnin “Monikkomuodot ja Stringsdict”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Swift Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Monikkomuodot ja Stringsdict”?

Käsittele eri kielten monikkosääntöjä. Harjoittelet Swift Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Swift Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Swift Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”Monikkomuodot ja Stringsdict”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Swift Academy-oppitunnilla?

Kyllä. Jokainen Swift Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. String Catalogit ja lokalisoidut merkkijonot
  2. Monikkomuodot ja Stringsdict
  3. Lokaalitietoinen muotoilu
  4. Oikealta vasemmalle ja asettelusuunta
← Takaisin: Swift Academy