Šķîþ ţö ḿàîñ çöñţéñţ

Ḿ-01: Ƃîļîñĝüàļ ƒöŕḿàţ îñţéŕöþ

Šüḿḿàŕý​

kapi extract éḿîţš à ƃîļîñĝüàļ ƒîļé ƒöŕ à ţŕàñšļàţöŕ öŕ ŕéṽîéŵéŕ; kapi merge àþþļîéš ţĥé ŕéţüŕñéđ ţàŕĝéţš ţö ţĥé ţŕàñšļàţîöñš öƒ ţĥé þŕöĵéçţ'š šöüŕçéš, ţĥŕöüĝĥ ţĥé çĥàñĝé šéŕṽîçé (É-09). Ţĥé þŕöĵéçţ'š çöñţéñţ ḿéḿöŕý þàŕţîçîþàţéš öñ ƃöţĥ šîđéš öƒ ţĥàţ ļööþ, þŕé-ƒîļļîñĝ öñ éẋţŕàçţ àñđ àƃšöŕƃîñĝ öñ ḿéŕĝé, šö éàçĥ þàšš çöšţš ļéšš ţĥàñ ţĥé ļàšţ.

Îñţéŕçĥàñĝé ĥàš ţŵö ţîéŕš, çĥöšéñ ƃý ŵĥö ŕéçéîṽéš ţĥé ƒîļé. Ţĥé ƃîļîñĝüàļ .kpz îš ţĥé ñàţîṽé çàŕŕîéŕ: ļöššļéšš, đéţéŕḿîñîšţîç, çöñţéñţ-àđđŕéššéđ, ŕéàđ ƃý à ñéöķàþî ţööļ àţ ţĥé ƒàŕ éñđ (Ḿ-06). ẊĻÎƑƑ 2.ẋ àñđ ÞÖ àŕé ţĥé îñđüšţŕý-îñţéŕöþ ţîéŕ, ƒöŕ à ŕéçîþîéñţ ŵöŕķîñĝ îñ à ţĥîŕđ-þàŕţý ţŕàñšļàţîöñ ţööļ.

Ƃöţĥ ţîéŕš ƒļöŵ ţĥŕöüĝĥ ţĥé šàḿé ţŵö ṽéŕƃš. Éṽéŕý üñîţ çàŕŕîéš ţĥé ŕéṽîšîöñš îţ ŵàš éẋţŕàçţéđ àĝàîñšţ, àñđ šéĝḿéñţàţîöñ îš à šţàñđ-öƒƒ öṽéŕļàý öṽéŕ ţĥé ŕüñš (Ḿ-02), šö à þŕöĵéçţ çàñ ţüŕñ šéĝḿéñţàţîöñ öñ öŕ öƒƒ ƃéţŵééñ éẋţŕàçţîöñš ŵîţĥöüţ ƃŕéàķîñĝ à ḿéŕĝé.

pre-fillabsorbsourcesproject contentextractkapi extractbilingual file.kpz · XLIFF · POreturned filetargets filled inmergekapi mergesourcesper-locale outputcontent memoryproject store

Öñé ļööþ, ţŵö çàŕŕîéŕš: ţĥé ñàţîṽé ƃîļîñĝüàļ .ķþž àñđ ţĥé ẊĻÎƑƑ/ÞÖ îñţéŕöþ ţîéŕ ţŕàṽéļ ţĥé šàḿé ṽéŕƃš.

Ţĥé ţŵö ṽéŕƃš​

extract àñđ merge àŕé ţöþ-ļéṽéļ çöḿḿàñđš ŕàţĥéŕ ţĥàñ ñàḿéđ ƒļöŵš. Àñ éñĝîñééŕ ŕéàđîñĝ kapi --help šééš ţĥéḿ ƃéšîđé run, àñđ ţĥéîŕ ƒļàĝ šĥàþéš (à ŕéþéàţàƃļé -i, à çöļļéçţîöñ ƒîļţéŕ, à çöñƒļîçţ þöļîçý) đö ñöţ ƒîţ à ƒļöŵ šţéþ'š çöñƒîĝ.

kapi extract # every target locale in the recipe
kapi extract --target-lang fr
kapi extract --target-lang fr,de,es
kapi extract --only mobile # one content collection
kapi extract --pattern 'src/**/*.json'
kapi extract --format kpz # the native bilingual carrier
kapi extract --xliff-version 2.0
kapi extract --no-memory
kapi extract --redact # placeholders out, originals stay local

kapi merge -i out/app-en-to-fr.xliff
kapi merge -i file1.xliff -i file2.xliff -i file3.po
kapi merge -i 'vendor-return/*.xliff'
kapi merge -i vendor-return/
kapi merge -i vendor-return/ --no-memory-update

Ƃöţĥ ĥàñđļé éṽéŕý ţàŕĝéţ ļöçàļé îñ öñé þàšš. Öḿîţţîñĝ --target-lang üšéš ţĥé ŕéçîþé'š target_languages; ñàḿîñĝ à çöḿḿà-šéþàŕàţéđ šüƃšéţ ŕéšţŕîçţš îţ. Öñé öüţþüţ ƒîļé þéŕ šöüŕçé→ţàŕĝéţ þàîŕ, àļļ šĥàŕîñĝ à šîñĝļé éẋţŕàçţîöñ ƃàţçĥ îđ. Öñ ḿéŕĝé, -i îš ŕéþéàţàƃļé àñđ ţàķéš à þàţĥ, à ĝļöƃ, öŕ à đîŕéçţöŕý, šö à ṽéñđöŕ'š ŵĥöļé ḿüļţî-ļàñĝüàĝé ŕéţüŕñ îš öñé îñṽöçàţîöñ; ţĥé çàŕŕîéŕ îš đéţéçţéđ þéŕ îñþüţ, àñđ ḿîẋîñĝ ẊĻÎƑƑ àñđ ÞÖ îñ öñé ƃàţçĥ îš ƒîñé. À ƒàîļüŕé öñ öñé þàîŕ öŕ îñþüţ îš ŕéþöŕţéđ þéŕ îţéḿ àñđ ţĥé ŕéšţ šţîļļ àþþļý, ŵîţĥ ţĥé éẋîţ çöđé ŕéƒļéçţîñĝ àñý ƒàîļüŕé.

Ƃöţĥ ṽéŕƃš ŕéšöļṽé ţĥé þŕöĵéçţ ţĥé šàḿé ŵàý éṽéŕý þŕöĵéçţ-àŵàŕé çöḿḿàñđ đöéš: àñ éẋþļîçîţ -p, ţĥéñ KAPI_PROJECT, ţĥéñ ţĥé ĝîţ-šţýļé üþŵàŕđ ŵàļķ ƒöŕ à kapi.yaml ŕéçîþé (Ç-01). merge ñééđš à þŕöĵéçţ öŕ à .kpz ŵöŕķšþàçé: kapi merge work.kpz -o out/ éḿîţš ţĥé ţàŕĝéţ-ļàñĝüàĝé ƒîļéš öƒ àñ àđ-ĥöç ŵöŕķšþàçé ŵîţĥ ñö þŕöĵéçţ îñ šçöþé (Ḿ-06), àñđ îñšîđé à þŕöĵéçţ kapi merge ŵîţĥ ñö -i ḿàţéŕîàļîžéš ţĥé ţàŕĝéţ-ļàñĝüàĝé ƒîļéš ƒŕöḿ ţĥé þŕöĵéçţ'š ƃļöçķ šţöŕé, ţĥé šîñķ ƒöŕ à þŕöçéšš-öñļý ŕüñ: ţĥé ţàŕĝéţš ţĥé šţöŕé ĥöļđš ƒöŕ à šöüŕçé ƃéçöḿé öñé çĥàñĝé šéţ öñ îţš ţŕàñšļàţîöñ, ŵĥîçĥ ţĥé çĥàñĝé šéŕṽîçé ŵŕîţéš ƒŕöḿ ţĥé šöüŕçé'š šķéļéţöñ. À ţŕàñšļàţîöñ ţĥàţ àļŕéàđý ĥöļđš éṽéŕý šţöŕéđ ţàŕĝéţ àñđ éṽéŕý ƃļöçķ öƒ îţš šöüŕçé îš ļéƒţ àš îţ îš àñđ ñöţ çöüñţéđ. À ţŕàñšļàţéđ đöçüḿéñţ ŵĥöšé šöüŕçé ĝàîñéđ öŕ ļöšţ à ƃļöçķ îš ŵŕîţţéñ àĝàîñ, ţĥé ñéŵ ƃļöçķ îñ ţĥé šöüŕçé'š ļàñĝüàĝé. À çöļļéçţîöñ ţĥàţ ñàḿéš ñö target îš šöüŕçé-öñļý àñđ ĝéţš ñö ƒîļé. Ŵîţĥ ñéîţĥéŕ à þŕöĵéçţ ñöŕ à ŵöŕķšþàçé îţ šàýš šö ŕàţĥéŕ ţĥàñ ĝüéššîñĝ.

Ţĥé ḿöñöļîñĝüàļ šîƃļîñĝ​

extract/merge àŕé ţĥé ƃîļîñĝüàļ ŕöüñđ ţŕîþ: šöüŕçé öüţ, ţàŕĝéţ ƃàçķ. Ţĥéŕé îš à þàŕàļļéļ ḿöñöļîñĝüàļ ŕöüñđ ţŕîþ öñ ţĥé šàḿé çöñţéñţ ḿöđéļ ƒöŕ šöüŕçé-ļàñĝüàĝé ŵöŕķ: kapi inspect ŕéàđš à ƒîļé îñţö ƃļöçķš, éàçĥ ŵîţĥ îţš ŕéƒéŕéñçé àñđ ŕéṽîšîöñ, àñđ kapi apply ŵŕîţéš à çĥàñĝé šéţ öƒ ŕéṽîéŵéđ éđîţš ƃàçķ ţĥŕöüĝĥ ţĥé ƃýţé-ƒàîţĥƒüļ ŕöüñđ ţŕîþ (É-09, Š-03).

Ţĥé þàîŕš šĥàŕé ţĥé éñĝîñé (à ƒöŕḿàţ ŕéàđéŕ àñđ ŵŕîţéŕ (É-02), ţĥé šķéļéţöñ šţöŕé ƒöŕ ƒàîţĥƒüļ ŕéçöñšţŕüçţîöñ) ƃüţ ţĥéý àñšŵéŕ đéŕéñţ ǫüéšţîöñš àñđ šţàý šéþàŕàţé ṽéŕƃš:

  • kapi apply ļàñđš à ŕéṽîéŵéđ çĥàñĝé šéţ (à çöñţéñţ ƒîẋ, à đéçîšîöñ, öŕ àñ éđîţ ţö à ţéŕḿ, à ḿéḿöŕý þàîŕ, à ŕéçîþé ƒîéļđ) ŵĥöļé öŕ ñöţ àţ àļļ, éàçĥ éđîţ ĝüàŕđéđ ƃý ţĥé ŕéṽîšîöñ îţ ŕéàđ àñđ ƃý ţĥé îñļîñé-çöđé ƒîđéļîţý ĝüàŕđ, éẋîţîñĝ öñ ţĥé ĝàţé çöđé ŵĥéñ àñ éđîţ îš šţàļé šö à ƒîẋ ļööþ ŕéàđš àĝàîñ. Îţ ñéṽéŕ àƃšöŕƃš îñţö ţĥé ḿéḿöŕý àš à šîđé 郃éçţ.
  • kapi merge àþþļîéš à ţŕàñšļàţöŕ'š ŕéţüŕñéđ ţàŕĝéţš àñđ, ƃý đéƒàüļţ, àƃšöŕƃš éṽéŕý àççéþţéđ ţàŕĝéţ îñţö ţĥé çöñţéñţ ḿéḿöŕý. Ţĥàţ àççŕéţîöñ îš ŵĥàţ ḿéŕĝé îš ƒöŕ. Îţ šéñđš ţĥé ţàŕĝéţš àš à çĥàñĝé šéţ ţöö, ĝüàŕđéđ ƃý ţĥé ŕéṽîšîöñš ţĥé ŕéţüŕñéđ ƒîļé çàŕŕîéš, àñđ ţĥé çöñƒļîçţ þöļîçý šéţţļéš à ţŕàñšļàţîöñ ţĥàţ ḿöṽéđ ḿéàñŵĥîļé.

Ƒöļđîñĝ apply îñţö merge ŵöüļđ çöñţàḿîñàţé ţĥé ḿéḿöŕý ŵîţĥ ḿöñöļîñĝüàļ šöüŕçé éđîţš; ƒöļđîñĝ merge îñţö apply ŵöüļđ ļöšé ţĥé çöñƒļîçţ þöļîçý àñđ ţĥé ƃîļîñĝüàļ šþàñ ḿàþþîñĝ.

Çàŕŕîéŕš​

Ñàţîṽé: ţĥé ƃîļîñĝüàļ .kpz. À ţàšķ-šçöþéđ þŕöƒîļé öƒ ţĥé .kpz çöñţàîñéŕ (Ḿ-06): öñé šöüŕçé→ţàŕĝéţ þàîŕ, ţĥé ƃļöçķš ŵîţĥ ƒàîţĥƒüļ îñļîñé çöđéš, ţĥé šéĝḿéñţàţîöñ àñđ àļîĝñḿéñţ öṽéŕļàýš, ţĥé þéŕ-šöüŕçé šķéļéţöñ ƒöŕ ŕöüñđ-ţŕîþ, àñđ ţĥé ŕéļéṽàñţ ḿéḿöŕý-ḿàţçĥ àñđ ţéŕḿ çöñţéẋţ, îñ öñé ļöššļéšš, đéţéŕḿîñîšţîç, çöñţéñţ-àđđŕéššéđ ƒîļé. Šéļéçţéđ ŵîţĥ --format kpz. Îţ îš ļöššļéšš ŵĥéŕé ẊĻÎƑƑ îš ļöššý, çàŕŕîéš ḿéḿöŕý àñđ ţéŕḿ çöñţéẋţ îñļîñé ŕàţĥéŕ ţĥàñ àš šéþàŕàţé ŢḾẊ/ŢƂẊ àţţàçĥḿéñţš, àñđ, ƃéîñĝ Ḿéŕķļé-ĥàšĥàƃļé, ĝîṽéš îñţéĝŕîţý-ṽéŕîƒîéđ, đàƃļé ŕéṽîéŵ. Îţ îš éçöšýšţéḿ îñţéŕçĥàñĝé: ƃöţĥ éñđš ñééđ à ñéöķàþî ŕéàđéŕ. Ḿàķîñĝ îţ à çŕöšš-ṽéñđöŕ šţàñđàŕđ ŵöüļđ ƃé àñ öþéñ-šþéç àñđ šéçöñđ-îḿþļéḿéñţàţîöñ 郃öŕţ, ñöţ à þŕöþéŕţý öƒ ţĥé ƃýţéš.

Îñđüšţŕý îñţéŕöþ: ẊĻÎƑƑ 2.ẋ àñđ ÞÖ. Ƒöŕ àñý ŕéçîþîéñţ öñ à ţĥîŕđ-þàŕţý ţööļ. extract éḿîţš ẊĻÎƑƑ 2.2 ƃý đéƒàüļţ šö àñ üñķñöŵñ ŕéçîþîéñţ ĝéţš šöḿéţĥîñĝ šàƒé. Ţĥé ŕéàđéŕ àççéþţš ţĥé ŵĥöļé 2.ẋ ñàḿéšþàçé ƒàḿîļý (urn:oasis:names:tc:xliff:document:2.0, …2.1, …2.2) àñđ þŕéšéŕṽéš üñķñöŵñ 2.ẋ àţţŕîƃüţéš ŕöüñđ-ţŕîþ; ţĥé ŵŕîţéŕ ţàķéš --xliff-version 2.0|2.1|2.2 ƒöŕ çöñšüḿéŕš þîññéđ ţö öļđéŕ ţööļîñĝ. ÞÖ (ĝéţţéẋţ) îš šéļéçţéđ ŵîţĥ --format po àñđ éḿîţš öñé éñţŕý þéŕ šéĝḿéñţ šþàñ (ţĥé ŵĥöļé ƃļöçķ ŵĥéñ ţĥéŕé îš ñö šéĝḿéñţàţîöñ öṽéŕļàý) ŵîţĥ ķàþî'š ƃööķķééþîñĝ îñ đéṽéļöþéŕ çöḿḿéñţš (#. kapi-block: <id>).

À <unit> ţĥàţ àŕŕîṽéš ŵîţĥ à <source> àñđ ñö <target> îš ţĥé ñöŕḿàļ šĥàþé öƒ àñ éẋţŕàçţîöñ ĥàñđéđ ţö à ţŕàñšļàţîöñ šţéþ. Ţĥé ŕéàđéŕ ŕéçöŕđš à žéŕö-ŵîđţĥ ţàŕĝéţ þöšîţîöñ àƒţéŕ </source>, àñđ ţĥé ŵŕîţéŕ éḿîţš ţĥé <target> éļéḿéñţ ţĥéŕé ŵĥéñ à ţŕàñšļàţîöñ éẋîšţš, šö à ƒîļé ţĥàţ àŕŕîṽéš ŵîţĥöüţ öñé ļéàṽéš ŵîţĥ öñé àñđ à ŕüñ ţĥàţ ţŕàñšļàţéš ñöţĥîñĝ ŕéþļàýš ţĥé ƃýţéš îţ ŕéàđ.

Öţĥéŕ ƃîļîñĝüàļ ƒöŕḿàţš (ẊĻÎƑƑ 1.2, Ǫţ ŢŠ, ţĥé ţîḿéđ-ţéẋţ ƒöŕḿàţš) ŕéḿàîñ àṽàîļàƃļé àš öŕđîñàŕý ƒöŕḿàţ šüþþöŕţ ŵîţĥ ţĥéîŕ öŵñ ŕéàđéŕš àñđ ŵŕîţéŕš (/ƒöŕḿàţš). Ţĥéý àŕé ñöţ šéļéçţàƃļé àš àñ éẋţŕàçţ çàŕŕîéŕ: à þŕöĵéçţ ŵĥöšé šöüŕçéš àŕé îñ öñé öƒ ţĥéḿ éẋţŕàçţš ƒŕöḿ îţ îñţö à çàŕŕîéŕ àƃöṽé.

Àññöţàţîöñš çŕöšš ţĥé çàŕŕîéŕ​

À ƃļöçķ'š ŕüñš çàŕŕý ŵĥàţ ţĥé šöüŕçé đöçüḿéñţ šţŕüçţüŕàļļý çöñţàîñéđ; ŵĥàţ à ĝöṽéŕñàñçé þàšš çöñçļüđéđ àƃöüţ ţĥàţ çöñţéñţ ŕîđéš šţàñđ-öƒƒ öñ àñ àñçĥöŕ (Ƒ-02). ẊĻÎƑƑ 2 ĥàš šöḿéŵĥéŕé ţö þüţ šüçĥ à çöñçļüšîöñ, àñđ ţĥé çàŕŕîéŕ ķééþš îţ îñ ƃöţĥ đîŕéçţîöñš.

Ŕéàđîñĝ. Àñ <mrk type="term"> ļàñđš àš à ţéŕḿ öṽéŕļàý šþàñ; éṽéŕý öţĥéŕ <mrk> ţýþé ļàñđš àš àñ xliff2:mrk šþàñ ķééþîñĝ îţš đéçļàŕéđ ţýþé, ƃéçàüšé à ḿàŕķéŕ ţĥîš éñĝîñé đöéš ñöţ üñđéŕšţàñđ îš šţîļļ à đéçîšîöñ šöḿéöñé ŕéçöŕđéđ. <sm>/<em> þàîŕš àŕé çöļļéçţéđ ţĥé šàḿé ŵàý, ƃéîñĝ ŵĥàţ ẊĻÎƑƑ 2 öƒƒéŕš ƒöŕ à šþàñ ţĥàţ ñééđ ñöţ ñéšţ; àñ <sm> ŵîţĥ ñö <em> ḿàŕķš ñöţĥîñĝ àñđ îš đŕöþþéđ. Ţĥé ḿàŕķéŕ þöšîţîöñš àŕé ŕéƃàšéđ öñţö ţĥé ƃļöçķ ƃý ţĥé šàḿé çüŕšöŕ ŵàļķ ţĥàţ ƃüîļđš ţĥé šéĝḿéñţ šþàñš.

Ŵŕîţîñĝ. Đŕàŵîñĝ àñ àññöţàţîöñ îš à đéçļàŕéđ ŵŕîţéŕ çàþàƃîļîţý, ƃéšîđé ĝéñéŕàţîṽé àñđ îñţéŕçĥàñĝé: àñ InlineAnnotationWriter ñàḿéš ţĥé àññöţàţîöñ ţýþéš îţ ķñöŵš ĥöŵ ţö đŕàŵ, àñđ ţĥé ŕéĝîšţŕý ŕéçöŕđš ţĥéḿ îñ FormatInfo ŵîţĥöüţ ļöàđîñĝ à þļüĝîñ (É-02). Ţĥé đéçļàŕàţîöñ îš à çéîļîñĝ. defaults.annotations.write îñ ţĥé ŕéçîþé ñàŕŕöŵš îţ àñđ çàññöţ ŵîđéñ îţ, šö ñàḿîñĝ à ţýþé à ƒöŕḿàţ çàññöţ çàŕŕý àšķš ƒöŕ ñöţĥîñĝ ŕàţĥéŕ ţĥàñ ƒàîļîñĝ, ƃéçàüšé öñé ŕéçîþé đéšçŕîƃéš ḿàñý öüţþüţš. Ţĥé ẊĻÎƑƑ 2 ŵŕîţéŕ đŕàŵš à ļöçàţéđ ţéŕḿ àš àñ <sm>/<em> þàîŕ šþļîçéđ îñţö ţĥé îñļîñé ÎŔ àţ éḿîţ ţîḿé, ñéṽéŕ àš àñ <mrk>: öñļý ţĥé þàîŕ çàŕŕîéš à šþàñ ţĥàţ đöéš ñöţ ñéšţ îñšîđé öñé éļéḿéñţ, ŵĥîçĥ îš éẋàçţļý ŵĥàţ àñ àñçĥöŕ éẋîšţš ţö éẋþŕéšš. À šþàñ šţŕàđđļîñĝ ţŵö <segment> éļéḿéñţš îš ţĥé öñé îţ çàññöţ đŕàŵ, àñđ ţĥàţ îš ŕéçöŕđéđ ŕàţĥéŕ ţĥàñ ĥàļƒ-đŕàŵñ.

Ŵĥàţ à ŕéţüŕñéđ üñîţ ñàḿéš​

À ŕéţüŕñéđ üñîţ ñàḿéš îţš ƃļöçķ ƃý ţĥé îđ ţĥé ŕéàđéŕ àššîĝñéđ îţ: ţĥé ẊĻÎƑƑ üñîţ'š id, ţĥé ÞÖ éñţŕý'š kapi-block çöḿḿéñţ, ţĥé ƃļöçķ öƒ à .kpz öṽéŕļàý. Îţ çàŕŕîéš ţŵö ŕéṽîšîöñš (É-09): ţĥé ŕéṽîšîöñ öƒ ţĥé ţŕàñšļàţîöñ àš ţĥé þŕöĵéçţ ĥéļđ îţ àţ ţĥé éẋţŕàçţîöñ (if-match, absent ŵĥéŕé ţĥéŕé ŵàš ñöñé), àñđ ţĥé ŕéṽîšîöñ öƒ ţĥé šöüŕçé ţĥé üñîţ ŵàš ŕéàđ ƒŕöḿ (basis). Ţĥé ƃàšîš îš ţĥé ŕéṽîšîöñ öƒ ţĥé šöüŕçé ţĥé üñîţ îţšéļƒ çàŕŕîéš, àñđ éẋţŕàçţ ŕéàđš éàçĥ šöüŕçé ţĥé ŵàý ţĥé çĥàñĝé šéŕṽîçé ŕéàđš îţ, šö ţĥé üñîţš öƒ éṽéŕý ţàŕĝéţ ļàñĝüàĝé çàŕŕý ţĥé îđš ţĥé šéŕṽîçé ĝîṽéš ţĥé ƃļöçķš. À ŕéṽîšîöñ çöṽéŕš àñ éđîţîöñ'š ŕüñš, îñļîñé çöđéš îñçļüđéđ, àñđ ñöţĥîñĝ éļšé. Šéĝḿéñţàţîöñ îš à šţàñđ-öƒƒ öṽéŕļàý öṽéŕ ţĥöšé ŕüñš (Ƒ-02), ñöţ à ŕéŵŕîţé öƒ ţĥéḿ, šö îţ ḿöṽéš ñéîţĥéŕ ţĥé ƃļöçķ'š çöñţéñţ ĥàšĥ (Ƒ-03) ñöŕ îţš ŕéṽîšîöñ: à ƃļöçķ'š îđéñţîţý îš šţàƃļé àçŕöšš à šéĝḿéñţàţîöñ ţöĝĝļé ƃéţŵééñ éẋţŕàçţîöñš.

Ţĥé ŕéàđéŕ-àššîĝñéđ îđ ƃéšîđé ţĥé ĥàšĥ îš ḿàđé üñîǫüé ŵĥéŕé îţ îš àššîĝñéđ. À çöñţàîñéŕ ǫüàļîƒîéš éàçĥ đéļéĝàţéđ ƃļöçķ ƃý ţĥé ḿéḿƃéŕ îţ çàḿé ƒŕöḿ (sf2_tu1, ţĥé šĥàþé üþšţŕéàḿ Öķàþî üšéš ƒöŕ à šüƃƒîļţéŕ), àñđ à đöçüḿéñţ ţĥàţ ŕéþéàţš à trans-unit/@id ĝéţš öñé šţöŕé îđéñţîţý þéŕ üñîţ ŵĥîļé ţĥé šþéļļîñĝ ţĥé đöçüḿéñţ üšéš îš ķéþţ öñ ţĥé ƃļöçķ ƒöŕ ţĥé ŵŕîţéŕ ţö éḿîţ (É-02).

Ŵîţĥ ñö šéĝḿéñţàţîöñ öṽéŕļàý à ƃļöçķ éḿîţš öñé ẊĻÎƑƑ <segment> öŕ öñé ÞÖ éñţŕý öṽéŕ îţš ŵĥöļé çöñţéñţ. Ŵîţĥ öñé, ţĥé ŵŕîţéŕ ḿàţéŕîàļîžéš à <segment>/<ignorable> (öŕ à ÞÖ éñţŕý) þéŕ šþàñ àñđ ĝàþ, àñđ ḿéŕĝé ḿàþš éàçĥ ŕéţüŕñéđ ţàŕĝéţ ƃàçķ ţö îţš šöüŕçé šþàñ ţĥŕöüĝĥ ţĥé àļîĝñḿéñţ öṽéŕļàý àñđ šþļîçéš ţĥé ţàŕĝéţ ŕüñš îñţö þļàçé. Šéĝḿéñţ îđš ŕîđé îñšîđé ţĥé öṽéŕļàý; ţĥé ƃļöçķ ĥàšĥ îš ţĥé ĵöîñ ķéý.

Þéŕ-šéĝḿéñţ ḿéḿöŕý ļööķüþ ƒöļļöŵš ţĥé šàḿé šþļîţ. Lookup ķéýš öñ ţĥé ŵĥöļé ƃļöçķ ŵĥéñ ţĥéŕé îš ñö öṽéŕļàý; ŵĥéñ öñé îš þŕéšéñţ, éẋţŕàçţ îţéŕàţéš îţš šþàñš àñđ çàļļš LookupSegment ƒöŕ šéñţéñçé-ļéṽéļ ļéṽéŕàĝé (Ç-09).

Éẋţŕàçţîöñ ƃööķķééþîñĝ​

Éàçĥ kapi extract ŕüñ ŵŕîţéš à ḿàñîƒéšţ üñđéŕ .kapi/work/cache/extractions/<batch-id>/, àļöñĝšîđé ţĥé þéŕ-šöüŕçé šķéļéţöñš, ƒöŕ ţĥé ñéẋţ éẋţŕàçţ ţö ŕéüšé:

schemaVersion: 1
kind: kapi-extraction
batchId: 6f2e8a1c-...
generator: { id: kapi, version: v1.x }
createdAt: 2026-04-24T10:00:00Z
inputsHash: sha256:...
sourceLocale: en
options: { format: xliff2, xliffVersion: "2.2" }
pairs:
- targetLocale: fr
output: out/northsea-en-to-fr.xliff
files:
- source: src/locales/en/app.json
sourceHash: sha256:...
blocks: 412
segments: 640
leverage: { exact: 108, fuzzy: 67, new: 237 }
skeleton: skel-<source-hash>.bin

inputsHash ƒîñĝéŕþŕîñţš éṽéŕýţĥîñĝ ƃéšîđéš à šöüŕçé ƒîļé'š öŵñ ƃýţéš ţĥàţ šĥàþéš îţš öüţþüţ: ţĥé ŕéçîþé'š ƒöŕḿàţ çöñƒîĝ, ŕéđàçţîöñ àñđ šéĝḿéñţàţîöñ šéţţîñĝš, ţĥé ḿéḿöŕý ţĥé þŕé-ƒîļļ đŕéŵ ƒŕöḿ, ţĥé öüţþüţ öþţîöñš. Àñ îñçŕéḿéñţàļ ŕé-éẋţŕàçţ ŕéüšéš à þŕîöŕ ƃàţçĥ'š ŵöŕķ ƒöŕ à ƒîļé öñļý ŵĥéñ ƃöţĥ inputsHash àñđ ţĥé ƒîļé'š sourceHash ḿàţçĥ, šö à çĥàñĝéđ ŕéçîþé öŕ à çĥàñĝéđ ḿéḿöŕý ŕé-éẋţŕàçţš; --force šķîþš ţĥé ŕéüšé éñţîŕéļý.

Éṽéŕýţĥîñĝ à ḿéŕĝé ñééđš ƒŕöḿ ţĥé éẋţŕàçţîöñ ţŕàṽéļš îñ ţĥé ƃîļîñĝüàļ ƒîļé, šö ţĥé ḿàñîƒéšţ çàñ ƃé ļöšţ. ẊĻÎƑƑ 2.ẋ çàŕŕîéš ƒîļé-ļéṽéļ <note category="kapi"> ñöţéš ŵîţĥ ţĥé ƃàţçĥ îđ, ţĥé šöüŕçé þàţĥ àñđ ţĥé šöüŕçé ĥàšĥ àţ éẋţŕàçţ ţîḿé, ţĥé ţàŕĝéţ ļàñĝüàĝé îñ trgLang, àñđ öñ éàçĥ üñîţ àñ <mda:metadata> ŵĥöšé <mda:metaGroup category="kapi"> ĥöļđš ţĥé if-match àñđ basis ŕéṽîšîöñš. ÞÖ çàŕŕîéš ţĥé šàḿé àš éẋţŕàçţéđ çöḿḿéñţš (#. kapi-batch:, #. kapi-source-file:, #. kapi-source-hash: öñ ţĥé ĥéàđéŕ éñţŕý; #. kapi-block:, #. kapi-if-match: àñđ #. kapi-basis: öñ éàçĥ éñţŕý) àñđ ţĥé ļàñĝüàĝé îñ ţĥé ĥéàđéŕ'š Language ƒîéļđ. À ĥéàđéŕ ŵĥöšé ļàñĝüàĝé îš ñöñé öƒ ţĥé ŕéçîþé'š ţàŕĝéţ ļàñĝüàĝéš, ƃéçàüšé àñ éđîţöŕ ŕéŵŕöţé îţ, ĝîṽéš ŵàý ţö ţĥé éẋţŕàçţîöñ ţĥàţ ŵŕöţé ţĥé ƒîļé, ƒöüñđ îñ ţĥé ƃàţçĥ'š ḿàñîƒéšţ ƃý ţĥé ñàḿé éẋţŕàçţ ĝàṽé îţ; ŵîţĥ ñö šüçĥ éẋţŕàçţîöñ ţĥé ḿéŕĝé öƒ ţĥàţ ƒîļé îš ŕéƒüšéđ. À .kpz ŕéçöŕđš ţĥé ŕéṽîšîöñš ƃý ƃļöçķ îđ îñ îţš îñţéŕçĥàñĝé ţàšķ. Ţĥé ƃàţçĥ îđ ñàḿéš ţĥé ļöçàļ ŕéđàçţîöñ ṽàüļţ àñđ ţĥé ḿéḿöŕý þŕöṽéñàñçé; ţĥé šöüŕçé þàţĥ ñàḿéš ţĥé đöçüḿéñţ ţĥé üñîţš ţŕàñšļàţé.

Ḿéŕĝé ŵŕîţéš éàçĥ ţŕàñšļàţîöñ ƒŕöḿ ţĥé šöüŕçé àš ţĥé þŕöĵéçţ ĥöļđš îţ, šö îţ ñééđš ţĥé šàḿé þŕöĵéçţ ţĥé éẋţŕàçţîöñ çàḿé ƒŕöḿ. Ţĥàţ ķééþš ţĥé éḿîţţéđ ẊĻÎƑƑ öŕ ÞÖ šḿàļļ àñđ ƒŕîéñđļý ţö à ţĥîŕđ-þàŕţý ţööļ, àñđ ķééþš ţĥé ḿéḿöŕý àƃšöŕƃ çĥéàþ. Ţĥé þŕöĵéçţ đîŕéçţöŕý îš àļŕéàđý ţĥé üñîţ öƒ þöŕţàƃîļîţý: git push šĥîþš îţ.

Ţĥé ḿéḿöŕý ļööþ​

Öñ éẋţŕàçţ, ķàþî ǫüéŕîéš ţĥé þŕöĵéçţ'š çöñţéñţ ḿéḿöŕý ƒöŕ éṽéŕý šéĝḿéñţ îţ éḿîţš:

  • àñ éẋàçţ ḿàţçĥ þŕé-ƒîļļš <target> ŵîţĥ state="translated";
  • à ƒüžžý ḿàţçĥ àţ öŕ àƃöṽé ţĥé ŕéçîþé'š ţĥŕéšĥöļđ þŕé-ƒîļļš ŵîţĥ state="fuzzy" àñđ à ḿàţçĥ-ǫüàļîţý šüƃ-šţàţé;
  • àñ àḿƃîĝüöüš ḿàţçĥ (šéṽéŕàļ ƒüļļ-šçöŕé éẋàçţš ŵîţĥ đéŕîñĝ ţàŕĝéţš) îš ñéṽéŕ þŕé-ƒîļļéđ. Àñ üñàţţéñđéđ ḿéŕĝé ŵöüļđ ţüŕñ àñ àŕƃîţŕàŕý þîçķ îñţö þüƃļîšĥéđ çöñţéñţ; ļéƒţ éḿþţý, ţĥé šéĝḿéñţ šüŕƒàçéš àš üñţŕàñšļàţéđ ƒöŕ à ĥüḿàñ ţö šéţţļé.

--no-memory ţüŕñš ţĥé þŕé-ƒîļļ öƒƒ.

Öñ ḿéŕĝé, éṽéŕý àççéþţéđ ţàŕĝéţ šéĝḿéñţ îš ŵŕîţţéñ îñţö ţĥé þŕöĵéçţ'š çöñţéñţ ḿéḿöŕý ŵîţĥ þŕöṽéñàñçé: öŕîĝîñ šöüŕçé merge, ţĥé ƃàţçĥ îđ àš ţĥé ŕéƒéŕéñçé, ţĥé šöüŕçé ƒîļé þàţĥ àš ţĥé ķéý, àñđ ţĥé ƃļöçķ ĥàšĥ àñđ öŕîĝîñàţîñĝ ƒîļéñàḿé àš þŕöþéŕţîéš. --no-memory-update ţüŕñš ţĥé ŵŕîţé-ƃàçķ öƒƒ.

Ƃöţĥ ĥàļṽéš àŕé öñ ƃý đéƒàüļţ ƃéçàüšé ţĥé ļööþ îš ţĥé ḿéçĥàñîšḿ: ŵîţĥöüţ ţĥé ŵŕîţé-ƃàçķ, ļéṽéŕàĝé đéçàýš ţö žéŕö, àñđ ḿàķîñĝ îţ öþţ-îñ ŵöüļđ ļéàṽé ḿöšţ þŕöĵéçţš' ḿéḿöŕîéš éḿþţý. Ŕéàđ-öñļý ḿéḿöŕîéš îḿþöŕţéđ îñţö à þŕöĵéçţ àŕé ñéṽéŕ ŵŕîţţéñ ţö, šö îḿþöŕţéđ ŢḾẊ šţàýš ŕéþŕöđüçîƃļé ƒŕöḿ îţš šöüŕçé ƒîļé.

Çöñƒļîçţ þöļîçý àñđ šţàļé üñîţš​

Ḿéŕĝé çöḿþîļéš à ŕéţüŕñéđ ƒîļé îñţö öñé set_content þéŕ ţŕàñšļàţéđ üñîţ, öñ ţĥé éđîţîöñ öƒ ţĥé üñîţ'š ļàñĝüàĝé, ŵîţĥ ţĥé üñîţ'š if-match àš îţš if_match àñđ îţš basis àš îţš basis, àñđ àþþļîéš ţĥé çĥàñĝé šéţ üñđéŕ require_basis àñđ ţĥé éñƒöŕçé ĝàţé ţĥŕöüĝĥ ţĥé çĥàñĝé šéŕṽîçé. Ţĥé šéŕṽîçé ŕéàđš ţĥé šöüŕçé ŵîţĥ îţš ţŕàñšļàţîöñ ĵöîñéđ ƒŕöḿ ţĥé ƒîļé ţĥé ŕéçîþé'š ţàŕĝéţ ţéḿþļàţé ñàḿéš, àþþļîéš ţĥé öþéŕàţîöñš, àñđ ŵŕîţéš ţĥàţ ƒîļé (filehome.Options.Materialize). À ţŕàñšļàţîöñ îñ à đöçüḿéñţ ƒöŕḿàţ îš ŵŕîţţéñ ƒŕöḿ ţĥé šöüŕçé'š šķéļéţöñ, šö îţ ƒöļļöŵš îţš šöüŕçé'š šţŕüçţüŕé. À ţŕàñšļàţîöñ çàţàļöĝ îñ îţš öŵñ ŕîĝĥţ (à ÞÖ çàţàļöĝ ƃéšîđé à ÞÖ šöüŕçé) îš ŕéàđ àñđ ŵŕîţţéñ îñ îţš ļàñĝüàĝé: ŵĥîļé îţ ĥöļđš éṽéŕý ḿéššàĝé öƒ îţš šöüŕçé îţ îš ŵŕîţţéñ ţĥŕöüĝĥ îţš öŵñ šķéļéţöñ, šö îţš ĥéàđéŕ àñđ çöḿḿéñţš šţàý, àñđ öñçé ţĥé šöüŕçé ĝàîñéđ öŕ ļöšţ à ḿéššàĝé îţ îš ŵŕîţţéñ ƒŕöḿ ţĥé šöüŕçé'š šķéļéţöñ, ĥéàđéŕ îñçļüđéđ. Ŕéđàçţéđ öŕîĝîñàļš àŕé ŕéšţöŕéđ ƃéƒöŕé ţĥé üñîţš àŕé çöḿþîļéđ (Ç-10).

À üñîţ ŵĥöšé šöüŕçé çĥàñĝéđ šîñçé ţĥé éẋţŕàçţîöñ îš ŕéƒüšéđ stale ñàḿîñĝ basis. Îţ îš ŕéþöŕţéđ, ñöţ àþþļîéđ, àñđ ñöţ àƃšöŕƃéđ îñţö ţĥé ḿéḿöŕý. À üñîţ ţĥàţ çàŕŕîéš îţš šöüŕçé ţéẋţ îš ĥéļđ ţö îţ àš ŵéļļ, ŵĥàţéṽéŕ basis îţ ñàḿéš: îţ àþþļîéš öñļý ŵĥîļé ţĥé ƃļöçķ îţš îđ ñàḿéš ĥöļđš ţĥàţ šöüŕçé. À üñîţ ţĥàţ çàŕŕîéš ñö basis àþþļîéš ŵĥéñ ţĥé šöüŕçé îţ çàŕŕîéš îš ţĥé šöüŕçé àš îţ šţàñđš, öŕ, ƒöŕ à çàŕŕîéŕ ŵîţĥ ñö šöüŕçé ţéẋţ, ŵĥéñ ţĥé šöüŕçé ƒîļé'š ĥàšĥ îš ţĥé öñé ţĥé ƒîļé ŕéçöŕđš. À üñîţ ŵĥöšé ƃļöçķ îš ĝöñé îš šţàļé ţöö.

À üñîţ ŵĥöšé ţŕàñšļàţîöñ çĥàñĝéđ îñ ţĥé þŕöĵéçţ šîñçé ţĥé éẋţŕàçţîöñ îš ŕéƒüšéđ stale ñàḿîñĝ if_match, àñđ defaults.merge.conflict_policy šéţţļéš îţ:

  • translator-wins (đéƒàüļţ): ḿéŕĝé šéñđš ţĥé üñîţ àĝàîñ öṽéŕ ţĥé ŕéṽîšîöñ ţĥé þŕöĵéçţ ñöŵ ĥöļđš, àñđ ţĥé ŕéţüŕñéđ ţàŕĝéţ ŕéþļàçéš îţ.
  • existing-wins: ţĥé þŕöĵéçţ'š ţŕàñšļàţîöñ îš ķéþţ àñđ ţĥé ŕéţüŕñéđ öñé îš šķîþþéđ.
  • newest-wins: ţĥé ŕéţüŕñéđ ţàŕĝéţ ŕéþļàçéš îţ ŵĥéñ ţĥé ŕéţüŕñéđ ƒîļé îš ñéŵéŕ ţĥàñ ţĥé ţŕàñšļàţîöñ'š ƒîļé, àñđ îš šķîþþéđ öţĥéŕŵîšé.

Éàçĥ þàšš đŕöþš ţĥé üñîţš ŕéƒüšéđ ƒöŕ ĝööđ àñđ šéñđš ţĥé ŕéšţ àĝàîñ àš öñé çĥàñĝé šéţ, šö ţĥé üñîţš ţĥàţ ļàñđ àŕé ŵŕîţţéñ àţöḿîçàļļý. Ţĥéŕé îš ñö îñţéŕàçţîṽé þŕöḿþţ, šö ḿéŕĝé šţàýš šçŕîþţàƃļé îñ ÇÎ. Àñý öţĥéŕ ŕéƒüšàļ îš ŕéþöŕţéđ þéŕ üñîţ öñ šţđéŕŕ àñđ çöüñţéđ àš refused: à ŕéţüŕñéđ ţàŕĝéţ ţĥàţ đŕöþš àñ îñļîñé çöđé îţš šöüŕçé þŕöţéçţš, öŕ öñé ţĥàţ îñţŕöđüçéš à ƒàîļîñĝ ƒîñđîñĝ öƒ à ŕüļé ţĥàţ ĝöṽéŕñš îţ (gate_failed, É-09). À ƒîļé öƒ ŵĥîçĥ ñöţĥîñĝ ļàñđš ƒàîļš.

Þàŕţîàļ ŕéţüŕñš àŕé öŕđîñàŕý: ḿéŕĝé àþþļîéš ţĥé ţŕàñšļàţéđ üñîţš, àñđ à üñîţ ţĥé ŕéţüŕñ đöéš ñöţ çàŕŕý ķééþš ŵĥàţ ţĥé ţŕàñšļàţîöñ ƒîļé ĥéļđ. Ţĥàţ ĥöļđš àš ƒàŕ àš ţĥé ĵöîñ þàîŕš ţĥé ƒîļé'š ƃļöçķš ŵîţĥ ţĥé šöüŕçé'š: ƃý ķéý, ţĥéñ ƃý ţŕàñšļàţîöñ-îñṽàŕîàñţ àđđŕéšš, ţĥéñ ƃý þöšîţîöñ. À ƒöŕḿàţ ŵĥöšé üñîţš ĥàṽé à ķéý öƒ ţĥéîŕ öŵñ (à ĴŠÖÑ ķéý, à ÞÖ ḿéššàĝé) þàîŕš éṽéŕý üñîţ ŵĥàţéṽéŕ ŵàš îñšéŕţéđ. À üñîţ ñàḿéđ ƃý îţš þöšîţîöñ îñ à šéçţîöñ (à Ḿàŕķđöŵñ öŕ ĤŢḾĻ þàŕàĝŕàþĥ) þàîŕš ƃý ţĥàţ þöšîţîöñ, šö öñçé ţĥé šöüŕçé ĝàîñš öŕ ļöšéš à ƃļöçķ ţĥé ƃļöçķš àƒţéŕ îţ îñ ţĥàţ šéçţîöñ þàîŕ ŵîţĥ ţĥéîŕ ñéîĝĥƃöüŕš' ţŕàñšļàţîöñš; à ŕéţüŕñ ƒöŕ šüçĥ à ƒîļé çàŕŕîéš éṽéŕý üñîţ.

Ŕéçîþé šüŕƒàçé​

defaults:
source_language: en
target_languages: [fr, de, es]
merge:
conflict_policy: translator-wins # | existing-wins | newest-wins
memory:
fuzzy_threshold: 75 # 0..100
segmentation:
source: false # opt-in overlay on extract
srx: rules.srx # optional SRX ruleset override
annotations:
write: [term] # narrows what a writer draws inline

Üñķñöŵñ ƒîéļđš àŕé ŕéĵéçţéđ ŵîţĥ à çļéàŕ éŕŕöŕ àñđ éñüḿ ṽàļüéš àŕé ṽàļîđàţéđ àĝàîñšţ ţĥé àļļöŵéđ šéţ. Éàçĥ šéçţîöñ'š đéƒàüļţš àþþļý ŵĥéñ îţ îš àƃšéñţ.

Ŕéļàţéđ​