ÝÀḾĻ Ƒļöŵ Àüţĥöŕîñĝ
Ƒļöŵš đéƒîñé þŕöçéššîñĝ þîþéļîñéš àš ÝÀḾĻ ƒîļéš. Ţĥé šţéþš-ƃàšéđ ƒöŕḿàţ îš ţĥé ĥüḿàñ-àüţĥöŕéđ ŕéþŕéšéñţàţîöñ ţĥàţ çöḿþîļéš ţö àñ îñţéŕñàļ ĝŕàþĥ (ñöđéš + éđĝéš) ƒöŕ éẋéçüţîöñ.
Šţéþš ƒöŕḿàţ
À ƒļöŵ îš à ļîšţ öƒ šéǫüéñţîàļ šţéþš. Éàçĥ šţéþ ŕéƒéŕéñçéš à ţööļ ƃý ñàḿé àñđ öþţîöñàļļý þŕöṽîđéš çöñƒîĝüŕàţîöñ:
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 and let the run decide
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
Ţĥîš çŕéàţéš à ţĥŕéé-šţéþ þîþéļîñé: çŕéàţé ţĥé ţàŕĝéţ, çļéàñ üþ þļàçéĥöļđéŕ ţéẋţ, ţĥéñ ŕüñ ǫüàļîţý çĥéçķš.
Þàŕàļļéļ ƃļöçķš ƒöŕ ƒàñ-öüţ
Üšé parallel: ţö ŕüñ ḿüļţîþļé ţööļš çöñçüŕŕéñţļý öñ ţĥé šàḿé šţŕéàḿ öƒ Þàŕţš. Éàçĥ ƃŕàñçĥ ŕéçéîṽéš à çöþý öƒ ţĥé îñþüţ àñđ þŕöđüçéš îñđéþéñđéñţ öüţþüţ:
steps:
- tool: create-target
config:
copySource: true
- parallel:
- tool: qa
label: Quality checks
- tool: term-check
label: Terminology checks
- tool: xml-validation
label: XML validation
Àļļ ţĥŕéé çĥéçķ ţööļš ŕüñ àţ ţĥé šàḿé ţîḿé, éàçĥ îñ îţš öŵñ ĝöŕöüţîñé.
Ţŕàñšƒöŕḿéŕš
Ţööļš ţĥàţ ŕéŵŕîţé ţĥé šöüŕçé (ŕéđàçţîöñ, ŵĥîţéšþàçé/ḿàŕķüþ ñöŕḿàļîžàţîöñ, à
šöüŕçé-ḿüţàţîñĝ 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
- parallel:
- tool: term-check
- tool: qa
config:
checkAbsoluteMaxCharLength: true
absoluteMaxCharLength: 200
kapi run fan-out -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
Þŕöĝŕàḿḿàţîçàļļý
Àñ àđ-ĥöç þŕöĝŕàḿḿàţîç ŕüñ ĥàš ñö --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...