Lokalisering av motoren
Motorens tekst som mennesker leser finnes på 17 språk ved siden av engelsk: nl, pl, pt-BR, pt-PT, fi, sv, da, nb, cs, uk, ru, de, fr, es, et, ja, zh-Hans. Engelsk er kilden; en-XA er en pseudolokalitet som aksentuerer, setter i klammer og polstrer hver melding, slik at en test kan se om tekst har flyttet til katalogen. Rammeverket er Project Fluent (fluent-bundle, unic-langid); koden er src/i18n/.
Hva som lokaliseres og hva som aldri gjør det#
| Lokalisert (et menneske leser det) | Aldri lokalisert (et program leser det) |
|---|---|
| meldinger og feil på kommandolinjen | JSON-nøkler og -verdier i result.json og report.json |
| sammendragslinjen for hver kjøring | CSV-topptekster og -rader |
| teksten i SVG-diagrammer (titler, akser, tegnforklaringer, bildetekster) | filnavn |
report.html: overskrifter, tabeller, merknader, bildetekster |
feilkoder (E-CLOCK-VERSION) |
| verdiord (VALIDATED, MODELLED, PARTIAL) | verifikasjonsmatrisen, enhetsdefinisjoner, proveniens |
beskrivelsene av scenariotypene (list_kinds(lang)) |
|
veiledende erklæringer, ansvarsfraskrivelser og merknader (engine-legal-*) |
de samme tekstene inne i JSON, som forblir engelske |
report.html for IQ-kampanjen, studiesammenligningssiden, bench-ledertavlen, robusthetsrapporten |
summary.html for en bevispakke og observatoriets PNG: begge hashes inn i et manifest (pakkens er også signert), så de bygges på engelsk uansett språk |
Tall i tekst som mennesker leser bruker språkets desimaltegn (komma i 15 av de 18 språkene; punktum i en, ja, zh-Hans og en-XA). Tall i maskinfiler bruker alltid punktum. Et antall (en variabel som heter n, count, n_*, num_* eller *_count) når Fluent som et tall, så en oversettelse kan skrive { $n -> [one] ... [few] ... *[other] ... }.
Velge språk#
- Kommandolinje:
--lang <tag>, deretterKSHANA_LANG,LC_ALL,LC_MESSAGES,LANG, deretter engelsk.pter pt-BR; barept-PTer Portugals.zher forenklet; tradisjonell avvises med listen over støttede koder. - Bibliotek:
api::run_toml_lang(toml, lang),run_toml_bilingual,run_toml_human,run_scenario_lang,list_scenario_kinds_json_lang(lang). - Python:
lang=Nonepårun,run_full,run_typed,validate_toml,error_kind,list_kinds,scenario_kinds;run_human(toml, lang);error_info(toml, lang). - WebAssembly: en valgfri avsluttende
langpå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:
langpårun_scenariooglist_scenario_kinds.
Feil og kodene deres#
Hver feilmelding har en stabil kode, meldings-id-en med store bokstaver (e-clock-version er E-CLOCK-VERSION), den samme på alle språk. Engelsk kommandolinjetekst er uendret. På et annet språk er linjen text [E-CODE]; med --verbose følger en ekstra linje code: E-CODE på alle språk. API-et gir KshanaError::code() og error_info ({kind, code, message}); MCP-feil bærer {kind, code, message} som feildata. Match på koden, aldri på teksten.
Hvordan en kjøring fungerer på et annet språk (regelen om dobbel kjøring)#
En maskinfil må ikke avhenge av språket. En kjøring på et annet språk kjører derfor scenarioet to ganger: én gang på engelsk, hvis result.json, report.json og CSV er maskinfilene, og én gang på brukerens språk, for oppsummeringen, diagrammet og report.html. Engelsk er én kjøring, byte for byte som den var før.
Målt, nativt, release-bygg, engelsk deretter --lang de (sekunder): 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; hvert annet medfølgende scenario er under 4 s; de 173 scenarioene som var medfølgende da dette ble målt, tok 64 s på engelsk til sammen. Kostnaden er nøyaktig det dobbelte for et annet språk. WebAssembly ble ikke målt (ingen wasm-bindgen her); med nettleserfaktoren på omtrent 4 er det ett minutt for den tregeste typen.
En side unngår ventetiden ved å vise det engelske resultatet med en gang og kalle run_human(toml, lang) etterpå: det er den andre kjøringen alene, den returnerer {summary, svg}, og Studio kan si «oversetter...» til den kommer.
Punkt for 0,41: én kjøring. Gjengi begge fra en post av (message id, arguments). Det ble vurdert og ikke bygget: resultater fra t! inspiseres, måles og hashes etter at de er laget (tegnbredder i diagramtekst, proveniens-hasher over utdatatekst), og num() formaterer ved kallstedet, så en post ville satt plassholder-tokens inn i maskinfiler og latt bytene deres avhenge av avspillingen. Den trenger t!/num som returnerer tokens, en ferdigstiller ved hver skriver og et bevis på byte-identitet per skriver.
WebAssembly#
Wasm-bygget bygger inn bare den engelske katalogen. De andre seksten ville lagt til omtrent 150 kB gzip hver. En side henter i18n/<lang>/engine.ftl ved et språkvalg og kaller register_catalogue(tag, text); hvis hentingen eller registreringen feiler, forblir siden på engelsk. Nativt bygger kommandolinjen og Python-wheelen inn alle 18.
Størrelse, uoptimalisert .wasm fra cargo build --release --target wasm32-unknown-unknown --features wasm --lib (før wasm-bindgen og wasm-opt), base bc04e98f mot denne grenen: 18,71 MB -> 19,88 MB rå, 5,43 MB -> 5,79 MB gzip, +357 kB gzip. Den engelske katalogen er 521 kB rå, 153 kB gzip av det; resten er fluent-bundle og avhengighetene. Dette er godtatt slik det ble målt.
Katalogen#
i18n/<tag>/engine.ftl holder meldingene, id-er med prefikset engine-. i18n/en/engine.ftl er kilden; de andre filene tilhører oversetterne og kan mangle meldinger (hver faller tilbake til engelsk per melding). Følgelister i i18n/en/: engine-counts.txt (meldinger med telleregenskaper, for flertallsformer), engine-numbers.txt (tall sendt som plassholdere), engine-fragments.txt (meldinger som er deler av en setning satt sammen ved kjøring: skal slås sammen til hele setningsmeldinger, aldri vokse).
Tester#
tests/i18n_catalogue.rs beviser engelsk: hver melding har en registrert opprinnelig mal og gjengis til nøyaktig den teksten; hver id er brukt; variabler stemmer; pseudolokaliteten gjengir hver melding. i18n_api.rs, i18n_kinds.rs, i18n_legal.rs dekker inngangspunktene, typebeskrivelsene og de juridiske tekstene. i18n_ratchet.rs feiler hvis en ny strenglitteral som et menneske ville lese omgår katalogen: kvote per fil i tests/fixtures/i18n/allow.json, som kan synke og aldri stige. scripts/i18n_compare.py kjører hele scenarioer med en grunnlinjebinær og den nåværende og sammenligner hver utdatafil.
Hvordan flytte en streng inn i katalogen: docs/design/i18n-migration.md.
Avhengigheter og lisenser#
Rammeverket legger til fluent-bundle 0,16 (Apache-2.0 OR MIT) og unic-langid 0,9 (MIT OR Apache-2.0), med deres transitive crates: fluent-syntax og 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: Apache-2.0-alternativet er det som brukes, som deny.toml tillater), tinystr og zerovec (Unicode-3.0), rustc-hash, smallvec, thiserror, displaydoc (MIT OR Apache-2.0). Hver av dem er permissiv under listen allow i deny.toml; thiserror forekommer i to versjoner (1 og 2), som multiple-versions = "warn" bare rapporterer. Lisenslisten ble lest fra cargo metadata; cargo deny check er ikke installert i utviklingsmiljøet der dette ble skrevet og kjører i integrasjons-CI-en.