Maskinoversættelse, ikke gennemgået af en modersmålstalende. Engelsk er referencen.

Kom i gangEndnu ikke på GitHubKilde: docs/i18n.md

Lokalisering af motoren

Motorens tekst til mennesker findes på 17 sprog ved siden af 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, der sætter accenter, parenteser og polstring på hver meddelelse, så en test kan se, om tekst er flyttet til kataloget. Rammen er Project Fluent (fluent-bundle, unic-langid); koden er src/i18n/.

Hvad der lokaliseres, og hvad der aldrig gør#

Lokaliseret (et menneske læser det) Aldrig lokaliseret (et program læser det)
meddelelser og fejl på kommandolinjen JSON-nøgler og -værdier i result.json og report.json
oversigtslinjen for hver kørsel CSV-overskrifter og -rækker
teksten i SVG-diagrammer (titler, akser, signaturer, billedtekster) filnavne
report.html: overskrifter, tabeller, noter, billedtekster fejlkoder (E-CLOCK-VERSION)
dommeord (VALIDATED, MODELLED, PARTIAL) verifikationsmatricen, definitioner af enheder, proveniens
beskrivelserne af scenarietyperne (list_kinds(lang))
vejledende erklæringer, ansvarsfraskrivelser og meddelelser (engine-legal-*) de samme tekster i JSON, som forbliver engelske
report.html for iq-kampagnen, undersøgelsens sammenligningsside, bench-ranglisten, resiliensrapporten summary.html for en bevispakke og observatoriets PNG: begge hashes ind i et manifest (pakkens er også signeret), så de bygges på engelsk, uanset sproget

Tal i tekst til mennesker bruger sprogets decimaltegn (et komma i 15 af de 18 sprog; et punktum i en, ja, zh-Hans og en-XA). Tal i maskinfiler bruger altid punktum. Et antal (en variabel med navnet n, count, n_*, num_* eller *_count) når Fluent som et tal, så en oversættelse kan skrive { $n -> [one] ... [few] ... *[other] ... }.

Valg af sprog#

  • Kommandolinje: --lang <tag>, derefter KSHANA_LANG, LC_ALL, LC_MESSAGES, LANG og så engelsk. pt er pt-BR; kun pt-PT er Portugals. zh er forenklet; traditionel afvises med listen over understø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=None på run, run_full, run_typed, validate_toml, error_kind, list_kinds, scenario_kinds; run_human(toml, lang); error_info(toml, lang).
  • WebAssembly: en valgfri afsluttende lang på 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 på run_scenario og list_scenario_kinds.

Fejl og deres koder#

Hver fejlmeddelelse har en stabil kode, meddelelsens id med store bogstaver (e-clock-version er E-CLOCK-VERSION), den samme på alle sprog. Engelsk kommandolinjetekst er uændret. På et andet sprog er linjen text [E-CODE]; med --verbose følger en anden linje code: E-CODE på alle sprog. API'et giver KshanaError::code() og error_info ({kind, code, message}); MCP-fejl bærer {kind, code, message} som fejldata. Match på koden, aldrig på teksten.

Hvordan en kørsel fungerer på et andet sprog (reglen om at køre to gange)#

En maskinfil må ikke afhænge af sproget. En kørsel på et andet sprog udfører derfor scenariet to gange: én gang på engelsk, hvis result.json, report.json og CSV er maskinfilerne, og én gang på brugerens sprog, til oversigten, diagrammet og report.html. Engelsk er én kørsel, byte for byte som før.

Målt, native, release-build, engelsk derefter --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 andet medfølgende scenarie er under 4 s; de 173 scenarier, der var medfølgende, da dette blev målt, tog tilsammen 64 s på engelsk. Omkostningen er nøjagtigt det dobbelte for et andet sprog. WebAssembly blev ikke målt (ingen wasm-bindgen her); ved browserfaktoren på omkring 4 er det et minut for den langsomste type.

En side undgår ventetiden ved at vise det engelske resultat med det samme og kalde run_human(toml, lang) bagefter: det er den anden kørsel alene, den returnerer {summary, svg}, og Studio kan sige "oversætter..." indtil den kommer.

Punkt for 0,41: én kørsel. Gengiv begge ud fra en optagelse af (message id, arguments). Det blev vurderet og ikke bygget: resultater af t! inspiceres, måles og hashes, efter de er lavet (diagramtekstens bredder, proveniens-hashes over outputtekst), og num() formaterer ved kaldestedet, så en optagelse ville lægge pladsholdertokens ind i maskinfiler og gøre deres bytes afhængige af genafspilningen. Det kræver t!/num, der returnerer tokens, en færdiggører ved hver skriver og et bevis for byte-identitet pr. skriver.

WebAssembly#

Wasm-buildet indlejrer kun det engelske katalog. De øvrige seksten ville tilføje omkring 150 kB gzip hver. En side henter i18n/<lang>/engine.ftl ved et sprogvalg og kalder register_catalogue(tag, text); hvis hentningen eller registreringen fejler, forbliver siden på engelsk. Native, kommandolinjen og Python-wheel indlejrer alle 18.

Størrelse, uoptimeret .wasm fra cargo build --release --target wasm32-unknown-unknown --features wasm --lib (før wasm-bindgen og wasm-opt), base bc04e98f mod denne gren: 18,71 MB -> 19,88 MB rå, 5,43 MB -> 5,79 MB gzip, +357 kB gzip. Det engelske katalog er 521 kB rå, 153 kB gzip heraf; resten er fluent-bundle og dets afhængigheder. Dette accepteres som målt.

Kataloget#

i18n/<tag>/engine.ftl rummer meddelelserne, id'er med præfikset engine-. i18n/en/engine.ftl er kilden; de andre filer er oversætternes og kan mangle meddelelser (hver falder tilbage til engelsk pr. meddelelse). Ledsagelister i i18n/en/: engine-counts.txt (meddelelser med antalsvariabler, til flertalsformer), engine-numbers.txt (tal sendt som pladsholdere), engine-fragments.txt (meddelelser, der er stykker af en sætning, som samles under kørsel: skal slås sammen til hele sætninger og må aldrig vokse).

Tests#

tests/i18n_catalogue.rs beviser engelsk: hver meddelelse har en optaget original skabelon og gengives til nøjagtig den tekst; hvert id bruges; variabler stemmer; pseudolokaliteten gengiver hver meddelelse. i18n_api.rs, i18n_kinds.rs, i18n_legal.rs dækker indgangspunkterne, beskrivelserne af typerne og de juridiske tekster. i18n_ratchet.rs fejler, hvis en ny strengkonstant, som et menneske ville læse, går uden om kataloget: tilladelse pr. fil i tests/fixtures/i18n/allow.json, som kan falde og aldrig stige. scripts/i18n_compare.py kører hele scenarier med en baseline-binær og den aktuelle og sammenligner hver outputfil.

Hvordan man flytter en streng ind i kataloget: docs/design/i18n-migration.md.

Afhængigheder og licenser#

Rammen tilføjer 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: alternativet Apache-2.0 er det, der bruges, hvilket deny.toml tillader), tinystr og zerovec (Unicode-3.0), rustc-hash, smallvec, thiserror, displaydoc (MIT OR Apache-2.0). Hver eneste er tilladende under listen allow i deny.toml; thiserror optræder i to versioner (1 og 2), som multiple-versions = "warn" kun rapporterer. Licenslisten blev læst fra cargo metadata; cargo deny check er ikke installeret i udviklingsmiljøet og kører i integrations-CI.