ÝÀḾĻ Ƒļöŵ Àüţĥöŕîñĝ
À ƒļöŵ îš à ÝÀḾĻ ƒîļé ţĥàţ ļîšţš ţĥé ţööļš à ŕüñ àþþļîéš, îñ öŕđéŕ. Ýöü ŵŕîţé îţ àš à ļîšţ öƒ šţéþš, àñđ ķàþî çöḿþîļéš ţĥé šţéþš îñţö à ĝŕàþĥ öƒ ţööļ ñöđéš àñđ éđĝéš ƒöŕ éẋéçüţîöñ.
Šţéþš ƒöŕḿàţ
À ƒļöŵ îš à ļîšţ öƒ šéǫüéñţîàļ šţéþš. Éàçĥ šţéþ ŕéƒéŕéñçéš à ţööļ ƃý ñàḿé àñđ öþţîöñàļļý þŕöṽîđéš çöñƒîĝüŕàţîöñ:
steps:
- tool: pseudo-translate
config:
expansionPercent: 30
prefix: "["
suffix: "]"
Ţĥé ŕüñ šüþþļîéš ţĥé ţàŕĝéţ ļöçàļé ţö éṽéŕý šţéþ
(--target-lang àţ ţĥé ÇĻÎ, öŕ ţĥé þŕöĵéçţ'š đéçļàŕéđ ţàŕĝéţš üñđéŕ kapi run / kapi up), šö öñé ƒļöŵ šéŕṽéš éṽéŕý ļöçàļé; à targetLocale ŵŕîţţéñ
îñţö à šţéþ'š çöñƒîĝ îš öüţŕàñķéđ ƃý ţĥé ŕüñ'š ļàñĝüàĝé.
Šöüŕçé àñđ šîñķ
À ƒļöŵ çàŕŕîéš öñļý îţš šţéþš. Ŵĥéŕé çöñţéñţ éñţéŕš àñđ ļéàṽéš îš šéţ ƃý
ƃîñđîñĝš ţĥàţ ţĥé ŕüñ ŕéšöļṽéš: à ƒîļé, ţĥé þŕöĵéçţ šţöŕé, à .kpz
ŵöŕķšþàçé, àñ îñţéŕçĥàñĝé îḿþöŕţ/éẋþöŕţ, öŕ none. À ƒļöŵ
đéçļàŕéš à ƃîñđîñĝ öñļý ŵĥéñ îţ îš îñţŕîñšîç ţö ţĥé ƒļöŵ (é.ĝ. à çĥéçķ ƒļöŵ ţĥàţ
þŕöđüçéš ñö đöçüḿéñţ šéţš sink: none), àñđ ñéṽéŕ à þàţĥ:
sink: none # only when intrinsic; otherwise omit it and the run sets it
steps:
- tool: qa
Àţ ţĥé ÇĻÎ ţĥé ƃîñđîñĝ çöḿéš ƒŕöḿ -i / -o (à þļàîñ þàţĥ îš đéţéçţéđ, à
scheme: îš éẋþļîçîţ), ţĥé þŕöĵéçţ / .kpz ýöü àŕé îñ, öŕ àüţö-đéţéçţîöñ;
kapi run <flow> --explain šĥöŵš ţĥé ŕéšöļṽéđ source → sink. Šéé
É-04: Ƒļöŵ Î/Ö Ƃîñđîñĝ.
Šţéþ ļàƃéļš
Àđđ à label ƒöŕ ŕéàđàƃîļîţý îñ ţĥé ÜÎ ĝŕàþĥ ṽîéŵ:
steps:
- tool: pseudo-translate
label: Generate test translations
config:
expansionPercent: 30
Šéǫüéñţîàļ šţéþš
Šţéþš éẋéçüţé îñ öŕđéŕ. Ţĥé öüţþüţ çĥàññéļ öƒ öñé ţööļ ƒééđš îñţö ţĥé îñþüţ çĥàññéļ öƒ ţĥé ñéẋţ:
steps:
- tool: create-target
config:
copySource: true
- tool: search-replace
config:
pairs:
- search: "TODO"
replace: ""
target: true
- tool: qa
Ţĥîš çŕéàţéš à ţĥŕéé-šţéþ þîþéļîñé: çŕéàţé ţĥé ţàŕĝéţ, çļéàñ üþ þļàçéĥöļđéŕ ţéẋţ, ţĥéñ ŕüñ ǫüàļîţý çĥéçķš.
Šţéþš ŕüñ îñ öŕđéŕ
À ƒļöŵ ŕüñš îţš šţéþš àš öñé öŕđéŕéđ çĥàîñ: éàçĥ ţööļ ŕéàđš ţĥé Þàŕţš ţĥé šţéþ ƃéƒöŕé îţ éḿîţţéđ. Ţö ŕüñ šéṽéŕàļ çĥéçķš, ļîšţ ţĥéḿ öñé àƒţéŕ àñöţĥéŕ:
steps:
- tool: create-target
config:
copySource: true
- tool: qa
label: Quality checks
- tool: term-check
label: Terminology checks
- tool: xml-validation
label: XML validation
Éàçĥ ţööļ ŕüñš îñ îţš öŵñ ĝöŕöüţîñé, šö ţĥé çĥéçķš ŵöŕķ öñ đéŕéñţ Þàŕţš àţ
ţĥé šàḿé ţîḿé. Ŵîţĥîñ öñé ţööļ, --parallel-blocks (öŕ à ŕéçîþé'š
parallel_blocks) šþŕéàđš ƃļöçķš àçŕöšš ŵöŕķéŕš ƒöŕ à ţööļ ƃüîļţ àš à þļàîñ
tool.BaseTool ŵîţĥ à ƃļöçķ ĥàñđļéŕ. Ţĥé ÀÎ àñđ ḾŢ ţööļš ķééþ ţĥéîŕ öŵñ
þŕöçéššîñĝ, đéšçŕîƃéđ îñ
Þàŕàļļéļ ƃļöçķ þŕöçéššîñĝ.
Ţĥé šţéþš þàŕšéŕ àļšö àççéþţš à parallel: ƃļöçķ, ƃüţ ñö ŕüññéŕ éẋéçüţéš öñé:
kapi run šţöþš ŵîţĥ àñ éŕŕöŕ ƃéƒöŕé þŕöçéššîñĝ à ƒļöŵ ţĥàţ çöñţàîñš îţ.
Ţŕàñšƒöŕḿéŕš
Ţööļš ţĥàţ ŕéŵŕîţé ţĥé šöüŕçé (ŕéđàçţîöñ, ŵĥîţéšþàçé/ḿàŕķüþ ñöŕḿàļîžàţîöñ, à
šöüŕçé-ḿüţàţîñĝ script) àŕé öŕđîñàŕý šţéþš îñ ţĥé šàḿé öŕđéŕéđ ļîšţ àš
éṽéŕýţĥîñĝ éļšé. À ţŕàñšƒöŕḿéŕ ŕéţüŕñš àñ éđîţ þļàñ; ţĥé ƒŕàḿéŵöŕķ àþþļîéŕ
þéŕƒöŕḿš ţĥé ŕéŵŕîţé îñļîñé àñđ îñ öŕđéŕ, ŕéƃàšîñĝ šüŕṽîṽîñĝ ŕüñ-àñçĥöŕéđ
öṽéŕļàýš (šéĝḿéñţàţîöñ, ţéŕḿš) öñţö ţĥé ñéŵ ŕüñš, šö éàçĥ ţŕàñšƒöŕḿéŕ šéţţļéš
ţĥé šöüŕçé ƃéƒöŕé ļàţéŕ šţéþš öƃšéŕṽé îţ.
steps:
- tool: redact
config:
detectors: [rules]
rulesPath: redaction-rules.yaml
- tool: translate
À þļàçéḿéñţ þàšš (core/flow/placement.go) ṽàļîđàţéš ţŕàñšƒöŕḿéŕ
þöšîţîöñš ƃéšîđé đàţà-ƒļöŵ ṽàļîđàţîöñ àţ éṽéŕý ƒļöŵ ƃüîļđ àñđ ļöàđ:
- Éŕŕöŕ: à ţŕàñšƒöŕḿéŕ ƒöļļöŵš à šţéþ ţĥàţ þŕöđüçéš à çöḿḿîţţéđ ţàŕĝéţ
(ŕéŵŕîţîñĝ šöüŕçé öŕþĥàñš ţĥé ţàŕĝéţš). À ţŕàñšƒöŕḿéŕ ţĥàţ þŕöđüçéš ţàŕĝéţš
îţšéļƒ, šüçĥ àš
unredact, îš éẋéḿþţ. - Éŕŕöŕ: à ŕéçöṽéŕàƃļé ţŕàñšƒöŕḿéŕ (
redact) ƒöļļöŵš à šţéþ ŵîţĥ ţĥé ŕéḿöţé-šöüŕçé-éĝŕéšš öŕ þŕöçéšš-éẋéç šîđé 郃éçţ, éẋçéþţ à šţéþ þŕöđüçîñĝ àñ îñþüţ ţĥé ţŕàñšƒöŕḿéŕ'š çöñƒîĝ-ŕéšöļṽéđ çöñţŕàçţ ŕéǫüîŕéš (à çļöüđ ÑÉŔ šţéþ ƒééđîñĝ éñţîţý-đŕîṽéñ ŕéđàçţîöñ îš ţĥé đöçüḿéñţéđ đéţéçţîöñ ţŕàđé-öƒƒ, Ç-10). ÀÎ ţööļš çöñƒîĝüŕéđ ŵîţĥ à ļöçàļ þŕöṽîđéŕ (öļļàḿà, đéḿö) çàŕŕý ñö éĝŕéšš 郃éçţ. - Ŵàŕñîñĝ: à ţŕàñšƒöŕḿéŕ þļàçéđ ļàţéŕ ţĥàñ îţš éàŕļîéšţ ṽàļîđ šļöţ, šîñçé éṽéŕý öṽéŕļàý þŕéšéñţ àţ àþþļý ţîḿé ḿüšţ ƃé ŕéƃàšéđ.
À ƒļöŵ ţĥàţ đéçļàŕéš ţĥé ŕéḿöṽéđ source_transforms: ƒîéļđ îš ŕéĵéçţéđ àţ
ļöàđ ŵîţĥ à ḿîĝŕàţîöñ éŕŕöŕ đîŕéçţîñĝ ýöü ţö ļîšţ ţĥé ţŕàñšƒöŕḿéŕš àš öŕđéŕéđ
šţéþš. Šéé ţĥé ţööļ-šýšţéḿ ÀĐ ƒöŕ
ţĥé îḿḿüţàƃîļîţý ḿöđéļ àñđ ţĥé þŕöđüçéŕ/àþþļîéŕ šþļîţ.
Ĥöŵ šţéþš çöḿþîļé ţö ţĥé ĝŕàþĥ
Ţĥé StepsToGraph() ƒüñçţîöñ ţŕàñšƒöŕḿš à StepsSpec îñţö FlowNode àñđ FlowEdge šļîçéš:
- Éàçĥ šéǫüéñţîàļ šţéþ ƃéçöḿéš à ţööļ ñöđé, çĥàîñéđ ƃý éđĝéš
- À
parallel:ƃļöçķ çŕéàţéš ḿüļţîþļé ţööļ ñöđéš, àļļ çöññéçţéđ ƒŕöḿ ţĥé þŕéṽîöüš ñöđé, àñđ ţĥé šţéþ àƒţéŕ îţ çöññéçţš ƒŕöḿ éṽéŕý ƃŕàñçĥ; ţĥîš šĥàþé éẋîšţš îñ ţĥé đéƒîñîţîöñ öñļý àñđ çàññöţ ŕüñ
Ţĥé ĝŕàþĥ ĥöļđš ţööļ ñöđéš öñļý. Ţĥé ŕüñ šüþþļîéš ţĥé ƒļöŵ'š šöüŕçé àñđ šîñķ àš ƃîñđîñĝš (É-04).
Ţĥé ĥöšţ ƃüîļđš ţĥé öŕđéŕéđ ţööļ çĥàîñ ƒŕöḿ ţĥé šţéþš, àñđ ţĥé Executor ŕüñš îţ: éàçĥ ţööļ ƃéçöḿéš à ĝöŕöüţîñé çöññéçţéđ ţö ţĥé ñéẋţ ƃý à ƃüƒƒéŕéđ çĥàññéļ.
Éẋàḿþļé ƒļöŵš
Ţŕàñšļàţîöñ þîþéļîñé
À ţýþîçàļ ţŕàñšļàţîöñ ƒļöŵ ŵîţĥ çöñţéñţ-ḿéḿöŕý ļéṽéŕàĝé, ÀÎ ţŕàñšļàţîöñ ƒöŕ ñéŵ ƃļöçķš, àñđ ǫüàļîţý çĥéçķš:
steps:
- tool: create-target
config:
copySource: false
- tool: recycle
label: Apply memory matches
config:
fuzzyThreshold: 75
- tool: translate
label: Translate remaining
config:
provider: anthropic
- tool: qa
label: Quality checks
Ŕüñ îţ ƒöŕ éàçĥ ļöçàļé ýöü šĥîþ:
kapi run my-translate -i input.xliff --target-lang fr
kapi run my-translate -i input.xliff --target-lang de
Çĥéçķš àƒţéŕ þšéüđö-ţŕàñšļàţîöñ
Ŕüñ àñàļýšîš ţööļš öṽéŕ þšéüđö-ţŕàñšļàţéđ öüţþüţ:
steps:
- tool: pseudo-translate
config:
expansionPercent: 30
- tool: term-check
- tool: qa
config:
checkAbsoluteMaxCharLength: true
absoluteMaxCharLength: 200
kapi run pseudo-checks -i input.json --target-lang qps
Šçŕîþţ ƒîļţéŕîñĝ
Üšé ţĥé ĴàṽàŠçŕîþţ šçŕîþţ šţéþ ţö ƒîļţéŕ öŕ ţŕàñšƒöŕḿ þàŕţš þŕöĝŕàḿḿàţîçàļļý:
steps:
- tool: script
label: Skip short blocks
config:
code: |
if (part.type === 'block') {
var text = part.block.source[0].content.text;
if (text.length < 3) {
skip();
}
}
- tool: pseudo-translate
Ŕüññîñĝ ƒļöŵš
Ƒŕöḿ ţĥé ÇĻÎ
# Run a built-in composed flow
kapi run translate-qa -i input.xliff --target-lang fr
# Run a flow defined in a kapi.yaml project file
kapi run my-flow -p kapi.yaml -i input.json --target-lang fr
# List available flows
kapi flows
# Write no file; print the change set a pass of the project would apply
kapi up -p kapi.yaml --print-ops > change.json
kapi apply -p kapi.yaml change.json
À ŕüñ ţĥàţ ŵŕîţéš à ƒîļé çöḿḿîţš éàçĥ đöçüḿéñţ ţĥŕöüĝĥ ţĥé ƒîļé ĥöḿé à
çĥàñĝé šéţ çöḿḿîţš ţĥŕöüĝĥ: ţĥé đéšţîñàţîöñ îš šţàĝéđ ƃéšîđé ţĥé ƒîļé àñđ
ŕéñàḿéđ öñţö îţ üñđéŕ ţĥé ƒîļé'š ļöçķ, öñļý ŵĥîļé ţĥé ƒîļé šţîļļ ĥöļđš ŵĥàţ îţ
ĥéļđ ŵĥéñ ţĥé ŕüñ ƃéĝàñ, šö à ƒîļé à þéŕšöñ šàṽéđ ŵĥîļé ţĥé ŕüñ ŵöŕķéđ ķééþš
ţĥéîŕ ƃýţéš. Îñ à þŕöĵéçţ éàçĥ đöçüḿéñţ ţĥé ŕüñ ŵŕöţé îš ŕéçöŕđéđ àš ţĥé ƒļöŵ'š
éđîţ, ŵîţĥ ţĥé šöüŕçé éàçĥ ţŕàñšļàţîöñ ŵàš ḿàđé ƒŕöḿ. --print-ops ŵŕîţéš ñö
ƒîļé àñđ þŕîñţš ţĥé öþéŕàţîöñš ţĥé ŕüñ ŵöüļđ àþþļý, àđđŕéššéđ ţö ţĥé đöçüḿéñţ
àñđ ţĥé éđîţîöñ ţĥé ŕüñ çĥàñĝéđ; kapi apply àþþļîéš ţĥéḿ ţö ţĥé šàḿé ƃýţéš.
Üñđéŕ materialize: on-converge à ţŕàñšļàţîöñ ŵĥöšé ƒîļé đöéš ñöţ éẋîšţ ýéţ
ļîṽéš îñ ţĥé ŵöŕķšþàçé ĥöḿé, šö kapi apply ķééþš îţ ţĥéŕé àñđ kapi merge
ŵŕîţéš îţš ƒîļé.
Éṽéŕý ƒîļé ļéƒţ öüţ öƒ ţĥé çĥàñĝé šéţ îš ñàḿéđ öñ šţđéŕŕ, àḿöñĝ ţĥéḿ à ţàŕĝéţ
ƒîļé ţĥé ŕüñ ŵŕîţéš ŵĥöļé ƒŕöḿ îţš šöüŕçé ŵĥéŕé kapi apply ŵöüļđ ŵŕîţé öţĥéŕ
ƃýţéš, àñđ à ƒîļé ţĥé çĥàñĝé šéŕṽîçé đöéš ñöţ ķééþ ţĥé éđîţîöñ îñ (àñ -o þàţĥ
ŕàţĥéŕ ţĥàñ ţĥé ŕéçîþé'š ţàŕĝéţ). Îñ à þŕöĵéçţ, kapi run ŵîţĥöüţ -o ŵŕîţéš
ñö ƒîļé, šö îţ þŕîñţš ñöţĥîñĝ. Šéé
É-09: Ţĥé çĥàñĝé çöñţŕàçţ.
Þŕöĝŕàḿḿàţîçàļļý
Àñ àđ-ĥöç þŕöĝŕàḿḿàţîç ŕüñ ĥàš ñö --target-lang ţö îñĥéŕîţ, šö ţĥé ļöçàļé îš
þàššéđ îñ éàçĥ šţéþ'š çöñƒîĝ:
spec := &flow.StepsSpec{
Input: "json",
Steps: []flow.FlowStep{
{Tool: "pseudo-translate", Config: map[string]any{
"targetLocale": "fr",
"expansionPercent": 30,
}},
{Tool: "qa", Config: map[string]any{
"targetLocale": "fr",
}},
},
}
nodes, edges, err := flow.StepsToGraph(spec)
// Build and execute with Executor...
Ŕéļàţéđ
- Ţööļ Àüţĥöŕîñĝ ŵîţĥ Þàŕàḿéţéŕ Šçĥéḿàš: ƃüîļđîñĝ ţĥé ţööļš à ƒļöŵ ñàḿéš.
- ĴàṽàŠçŕîþţ Šçŕîþţ Šţéþ: ţĥé ĴàṽàŠçŕîþţ šţéþ üšéđ îñ ţĥé ƒîļţéŕîñĝ éẋàḿþļé.
- É-04: Ƒļöŵš àñđ Î/Ö ƃîñđîñĝ: ĥöŵ à ŕüñ ŕéšöļṽéš à ƒļöŵ'š šöüŕçé àñđ šîñķ.
- É-09: Ţĥé çĥàñĝé çöñţŕàçţ: ĥöŵ à ŕüñ çöḿḿîţš ŵĥàţ îţ ŵŕîţéš.