Konekäännös, jota äidinkielinen puhuja ei ole tarkistanut. Viitteenä on englanninkielinen versio.

AloitaEi vielä GitHubissaLähde: docs/i18n.md

Moottorin lokalisointi

Moottorin ihmiselle tarkoitettu teksti on 17 kielellä englannin rinnalla: nl, pl, pt-BR, pt-PT, fi, sv, da, nb, cs, uk, ru, de, fr, es, et, ja, zh-Hans. Englanti on lähde; en-XA on pseudolokaali, joka lisää aksentit, sulkeet ja täytteen jokaiseen viestiin, jotta testi näkee, siirtyikö teksti katalogiin. Kehys on Project Fluent (fluent-bundle, unic-langid); koodi on src/i18n/.

Mikä lokalisoidaan ja mitä ei koskaan#

Lokalisoidaan (ihminen lukee sen) Ei koskaan lokalisoida (ohjelma lukee sen)
komentorivin viestit ja virheet tiedostojen result.json ja report.json JSON-avaimet ja -arvot
jokaisen ajon yhteenvetorivi CSV-otsikot ja -rivit
SVG-kaavioiden teksti (otsikot, akselit, selitteet, kuvatekstit) tiedostonimet
report.html: otsikot, taulukot, huomautukset, kuvatekstit virhekoodit (E-CLOCK-VERSION)
tuomiosanat (VALIDATED, MODELLED, PARTIAL) varmennusmatriisi, yksikkömääritelmät, alkuperä
skenaariotyyppien kuvaukset (list_kinds(lang))
ohjeelliset ilmoitukset, vastuuvapauslausekkeet ja huomautukset (engine-legal-*) samat tekstit JSONin sisällä, jotka pysyvät englanniksi
iq-kampanjan report.html, tutkimusvertailusivu, bench-tulostaulukko, kestävyysraportti todistepaketin summary.html ja observatorion PNG: molemmat tiivistetään manifestiin (paketin manifesti allekirjoitetaan myös), joten ne rakennetaan englanniksi kielestä riippumatta

Ihmiselle tarkoitetussa tekstissä luvuissa käytetään kielen desimaalimerkkiä (pilkku 15 kielessä, kun kieliä on yhteensä 18; piste kielikoodeilla en, ja, zh-Hans ja en-XA). Konetiedostoissa luvuissa käytetään aina pistettä. Lukumäärä (muuttuja nimeltä n, count, n_*, num_* tai *_count) saapuu Fluentille lukuna, joten käännös voi kirjoittaa { $n -> [one] ... [few] ... *[other] ... }.

Kielen valinta#

  • Komentorivi: --lang <tag>, sitten KSHANA_LANG, LC_ALL, LC_MESSAGES, LANG, sitten englanti. pt on pt-BR; vain pt-PT on Portugalin. zh on yksinkertaistettu; perinteinen hylätään ja palautetaan tuettujen tunnisteiden luettelo.
  • Kirjasto: api::run_toml_lang(toml, lang), run_toml_bilingual, run_toml_human, run_scenario_lang, list_scenario_kinds_json_lang(lang).
  • Python: lang=None kohteissa run, run_full, run_typed, validate_toml, error_kind, list_kinds, scenario_kinds; run_human(toml, lang); error_info(toml, lang).
  • WebAssembly: valinnainen lopussa oleva lang kohteissa run_typed, run, chart_svg, summary, table_csv, run_all, error_kind, list_kinds, scenario_kinds; run_human(toml, lang); error_info(toml, lang); register_catalogue(tag, ftl_text).
  • MCP: lang kohteissa run_scenario ja list_scenario_kinds.

Virheet ja niiden koodit#

Jokaisella virheviestillä on vakaa koodi, viestin tunniste isoin kirjaimin (e-clock-version on E-CLOCK-VERSION), sama jokaisella kielellä. Englanninkielinen komentoriviteksti on ennallaan. Toisella kielellä rivi on text [E-CODE]; valinnalla --verbose perässä tulee toinen rivi code: E-CODE jokaisella kielellä. API antaa KshanaError::code() ja error_info ({kind, code, message}); MCP-virheet kantavat {kind, code, message} virhedatana. Tee täsmäys koodiin, ei koskaan tekstiin.

Miten ajo toimii toisella kielellä (kahdesti ajamisen sääntö)#

Konetiedosto ei saa riippua kielestä. Muunkielinen ajo siksi suorittaa skenaarion kahdesti: kerran englanniksi, jonka result.json, report.json ja CSV ovat konetiedostot, ja kerran käyttäjän kielellä yhteenvetoa, kaaviota ja tiedostoa report.html varten. Englanti on yksi ajo, tavu tavulta sama kuin ennen.

Mitattu, natiivi, release-käännös, englanti ja sitten --lang de (sekuntia): leo-navmsg-fit-interval-trade 9,2 -> 17,9, cislunar-arc-recovery 7,8 -> 14,1, lunar-station-coverage 7,8 -> 15,0, clock-ensemble 5,8 -> 11,6, leo-navmsg-model-comparison 5,1 -> 10,5, leo-ppp-convergence 2,8 -> 6,2; kaikki muut mukana toimitetut skenaariot alle 4 s; kun tämä mitattiin, 173 mukana toimitettua skenaariota veivät englanniksi yhteensä 64 s. Hinta on täsmälleen kaksinkertainen toiselle kielelle. WebAssemblya ei mitattu (wasm-bindgenia ei ole täällä); selaimen kertoimella noin 4 se on minuutti hitaimmalle tyypille.

Sivu välttää odotuksen näyttämällä englanninkielisen tuloksen heti ja kutsumalla sen jälkeen run_human(toml, lang): se on pelkkä toinen ajo, se palauttaa {summary, svg}, ja Studio voi sanoa ”käännetään...” kunnes se saapuu.

Kohta versiossa 0,41: yksi ajo. Renderöi molemmat tietueesta (message id, arguments). Asiaa harkittiin eikä sitä rakennettu: kohteen t! tuloksia tarkastetaan, mitataan ja tiivistetään sen jälkeen, kun ne on tehty (kaaviotekstin leveydet, alkuperätiivisteet tulostekstin yli), ja num() muotoilee kutsukohdassa, joten tietue toisi paikkamerkkitunnisteita konetiedostoihin ja tekisi niiden tavuista riippuvaisia toistosta. Se vaatisi tunnisteen palauttavat t! ja num, viimeistelijän jokaiseen kirjoittajaan ja tavuidentiteettitodistuksen kirjoittajaa kohti.

WebAssembly#

Wasm-käännös sisältää vain englanninkielisen katalogin. Muut kuusitoista lisäisivät noin 150 kB gzip kukin. Sivu noutaa i18n/<lang>/engine.ftl kielivalinnan yhteydessä ja kutsuu register_catalogue(tag, text); jos nouto tai rekisteröinti epäonnistuu, sivu pysyy englanniksi. Natiivisti komentorivi ja Python-wheel sisältävät kaikki 18.

Koko, optimoimaton .wasm komennosta cargo build --release --target wasm32-unknown-unknown --features wasm --lib (ennen wasm-bindgenia ja wasm-optia), pohja bc04e98f tätä haaraa vasten: 18,71 MB -> 19,88 MB raakana, 5,43 MB -> 5,79 MB gzip, +357 kB gzip. Englanninkielinen katalogi on 521 kB raakana, siitä 153 kB gzip; loput on fluent-bundle ja sen riippuvuudet. Tämä otetaan vastaan mitattuna.

Katalogi#

i18n/<tag>/engine.ftl sisältää viestit, tunnisteiden etuliite engine-. i18n/en/engine.ftl on lähde; muut tiedostot ovat kääntäjien ja niistä voi puuttua viestejä (kukin palaa englantiin viestikohtaisesti). Seuralaisluettelot hakemistossa i18n/en/: engine-counts.txt (viestit, joissa on lukumäärämuuttujia, monikkomuotoja varten), engine-numbers.txt (paikkamerkkeinä välitetyt luvut), engine-fragments.txt (viestit, jotka ovat ajon aikana koottavan lauseen osia: yhdistettävä kokonaisten lauseiden viesteiksi, ei koskaan kasvatettava).

Testit#

tests/i18n_catalogue.rs todistaa englannin: jokaisella viestillä on tallennettu alkuperäinen mallipohja ja se renderöityy täsmälleen siksi tekstiksi; jokaista tunnistetta käytetään; muuttujat täsmäävät; pseudolokaali renderöi jokaisen viestin. i18n_api.rs, i18n_kinds.rs, i18n_legal.rs kattavat sisäänkäyntipisteet, tyyppikuvaukset ja oikeudelliset tekstit. i18n_ratchet.rs epäonnistuu, jos uusi merkkijonoliteraali, jonka ihminen lukisi, ohittaa katalogin: tiedostokohtainen sallittu määrä tiedostossa tests/fixtures/i18n/allow.json, joka saa laskea mutta ei koskaan nousta. scripts/i18n_compare.py ajaa kokonaisia skenaarioita perustason binäärillä ja nykyisellä ja vertaa jokaista tulostiedostoa.

Miten merkkijono siirretään katalogiin: docs/design/i18n-migration.md.

Riippuvuudet ja lisenssit#

Kehys lisää fluent-bundle 0,16 (Apache-2.0 OR MIT) ja unic-langid 0,9 (MIT OR Apache-2.0) transitiivisine crate-paketteineen: fluent-syntax ja fluent-langneg (Apache-2.0 OR MIT), intl-memoizer (Apache-2.0 OR MIT), intl_pluralrules (Apache-2.0/MIT), type-map (MIT/Apache-2.0), self_cell (Apache-2.0 OR GPL-2.0-only: käytetään Apache-2.0-vaihtoehtoa, jonka deny.toml sallii), tinystr ja zerovec (Unicode-3.0), rustc-hash, smallvec, thiserror, displaydoc (MIT OR Apache-2.0). Jokainen on sallivasti lisensoitu tiedoston deny.toml luettelon allow mukaan; thiserror esiintyy kahtena versiona (1 ja 2), minkä multiple-versions = "warn" vain raportoi. Lisenssiluettelo luettiin komennosta cargo metadata; cargo deny check ei ole asennettu kirjoitusympäristöön ja ajetaan integraatio-CI:ssä.