Lokalisatie van de engine
De menselijk leesbare tekst van de engine staat in 17 talen naast het Engels: nl, pl, pt-BR, pt-PT, fi, sv, da, nb, cs, uk, ru, de, fr, es, et, ja, zh-Hans. Engels is de bron; en-XA is een pseudo-locale die elk bericht van accenten, haakjes en opvulling voorziet, zodat een test kan zien of tekst naar de catalogus is verplaatst. Het framework is Project Fluent (fluent-bundle, unic-langid); de code is src/i18n/.
Wat wordt gelokaliseerd en wat nooit#
| Gelokaliseerd (een persoon leest het) | Nooit gelokaliseerd (een programma leest het) |
|---|---|
| berichten en fouten van de opdrachtregel | JSON-sleutels en -waarden van result.json en report.json |
| de samenvattingsregel van elke run | CSV-kopteksten en -rijen |
| de tekst van SVG-grafieken (titels, assen, legenda's, bijschriften) | bestandsnamen |
report.html: koppen, tabellen, noten, bijschriften |
foutcodes (E-CLOCK-VERSION) |
| oordeelwoorden (VALIDATED, MODELLED, PARTIAL) | de verificatiematrix, definities van eenheden, herkomst |
de beschrijvingen van de scenariosoorten (list_kinds(lang)) |
|
adviezen, disclaimers en meldingen (engine-legal-*) |
dezelfde teksten binnen JSON, die Engels blijven |
report.html van de iq-campagne, de vergelijkingspagina van studies, het klassement van de bench, het veerkrachtrapport |
summary.html van een bewijspakket en de PNG van het observatorium: beide worden in een manifest gehasht (dat van het pakket is ook ondertekend), dus ze worden in het Engels gebouwd, in welke taal dan ook |
Getallen in menselijke tekst gebruiken het decimaalteken van de taal (een komma in 15 van de 18 talen; een punt in en, ja, zh-Hans en en-XA). Getallen in machinebestanden gebruiken altijd de punt. Een aantal (een variabele met de naam n, count, n_*, num_* of *_count) bereikt Fluent als getal, dus een vertaling mag { $n -> [one] ... [few] ... *[other] ... } schrijven.
De taal kiezen#
- Opdrachtregel:
--lang <tag>, daarnaKSHANA_LANG,LC_ALL,LC_MESSAGES,LANG, daarna Engels.ptis pt-BR; alleenpt-PTis dat van Portugal.zhis vereenvoudigd; traditioneel wordt geweigerd met de lijst van ondersteunde tags. - Bibliotheek:
api::run_toml_lang(toml, lang),run_toml_bilingual,run_toml_human,run_scenario_lang,list_scenario_kinds_json_lang(lang). - Python:
lang=Nonebijrun,run_full,run_typed,validate_toml,error_kind,list_kinds,scenario_kinds;run_human(toml, lang);error_info(toml, lang). - WebAssembly: een optionele afsluitende
langbijrun_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:
langbijrun_scenarioenlist_scenario_kinds.
Fouten en hun codes#
Elke foutmelding heeft een stabiele code, de bericht-id in hoofdletters (e-clock-version is E-CLOCK-VERSION), in elke taal gelijk. De Engelse tekst van de opdrachtregel is ongewijzigd. In een andere taal is de regel text [E-CODE]; met --verbose volgt in elke taal een tweede regel code: E-CODE. De API geeft KshanaError::code() en error_info ({kind, code, message}); MCP-fouten dragen {kind, code, message} als foutgegevens. Vergelijk op de code, nooit op de tekst.
Hoe een run in een andere taal werkt (de regel van twee keer uitvoeren)#
Een machinebestand mag niet van de taal afhangen. Een run in een andere taal voert het scenario daarom twee keer uit: eenmaal in het Engels, waarvan result.json, report.json en de CSV de machinebestanden zijn, en eenmaal in de taal van de gebruiker, voor de samenvatting, de grafiek en report.html. Engels is één run, byte voor byte wat het eerder was.
Gemeten, native, releasebuild, Engels en daarna --lang de (seconden): 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; elk ander meegeleverd scenario duurt minder dan 4 s; de 173 scenario's die op het moment van meten waren meegeleverd duurden samen 64 s in het Engels. De kosten zijn voor een andere taal precies het dubbele. WebAssembly is niet gemeten (hier geen wasm-bindgen); bij de browserfactor van ongeveer 4 is het een minuut voor de langzaamste soort.
Een pagina vermijdt het wachten door het Engelse resultaat meteen te tonen en daarna run_human(toml, lang) aan te roepen: dat is alleen de tweede run, het geeft {summary, svg} terug, en Studio kan "bezig met vertalen..." zeggen tot het binnenkomt.
Punt voor 0,41: één run. Render beide uit een opname van (message id, arguments). Het is beoordeeld en niet gebouwd: de resultaten van t! worden na het maken geïnspecteerd, gemeten en gehasht (tekstbreedtes in grafieken, herkomsthashes over uitvoertekst), en num() formatteert op de plek van de aanroep, dus een opname zou plaatsaanduidingen in machinebestanden brengen en hun bytes van de herhaling laten afhangen. Het vraagt t!/num die tokens teruggeven, een afrondingsstap bij elke schrijver en een bewijs van byte-identiteit per schrijver.
WebAssembly#
De wasm-build bevat alleen de Engelse catalogus. De andere zestien zouden elk ongeveer 150 kB gzip toevoegen. Een pagina haalt i18n/<lang>/engine.ftl op bij een taalkeuze en roept register_catalogue(tag, text) aan; als het ophalen of de registratie mislukt, blijft de pagina in het Engels. Native bevatten de opdrachtregel en het Python-wheel alle 18.
Grootte, niet-geoptimaliseerde .wasm uit cargo build --release --target wasm32-unknown-unknown --features wasm --lib (vóór wasm-bindgen en wasm-opt), basis bc04e98f tegen deze tak: 18,71 MB -> 19,88 MB ruw, 5,43 MB -> 5,79 MB gzip, +357 kB gzip. De Engelse catalogus is 521 kB ruw, 153 kB gzip daarvan; de rest is fluent-bundle en zijn afhankelijkheden. Dit wordt zoals gemeten geaccepteerd.
De catalogus#
i18n/<tag>/engine.ftl bevat de berichten, met id's met het voorvoegsel engine-. i18n/en/engine.ftl is de bron; de andere bestanden zijn die van de vertalers en kunnen berichten missen (elk valt per bericht terug op het Engels). Aanvullende lijsten in i18n/en/: engine-counts.txt (berichten met telvariabelen, voor meervoudsvormen), engine-numbers.txt (getallen die als plaatsaanduiding worden doorgegeven), engine-fragments.txt (berichten die stukken van een tijdens de run samengestelde zin zijn: samen te voegen tot berichten met een hele zin, nooit om te groeien).
Tests#
tests/i18n_catalogue.rs bewijst het Engels: elk bericht heeft een vastgelegd origineel sjabloon en wordt precies tot die tekst weergegeven; elke id wordt gebruikt; variabelen komen overeen; de pseudo-locale geeft elk bericht weer. i18n_api.rs, i18n_kinds.rs, i18n_legal.rs dekken de ingangspunten, de beschrijvingen van de soorten en de juridische teksten. i18n_ratchet.rs faalt als een nieuwe stringliteral die een persoon zou lezen de catalogus omzeilt: een toelage per bestand in tests/fixtures/i18n/allow.json, die mag dalen en nooit stijgen. scripts/i18n_compare.py voert hele scenario's uit met een baselinebinary en de huidige en vergelijkt elk uitvoerbestand.
Hoe u een string naar de catalogus verplaatst: docs/design/i18n-migration.md.
Afhankelijkheden en licenties#
Het framework voegt fluent-bundle 0,16 (Apache-2.0 OR MIT) en unic-langid 0,9 (MIT OR Apache-2.0) toe, met hun transitieve crates: fluent-syntax en 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: het alternatief Apache-2.0 is degene die wordt gebruikt, wat deny.toml toestaat), tinystr en zerovec (Unicode-3.0), rustc-hash, smallvec, thiserror, displaydoc (MIT OR Apache-2.0). Elk is permissief volgens de lijst allow van deny.toml; thiserror komt voor in twee versies (1 en 2), wat multiple-versions = "warn" alleen meldt. De licentielijst is gelezen uit cargo metadata; cargo deny check is niet geïnstalleerd in de ontwikkelomgeving en draait in de integratie-CI.