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

ÝÀḾĻ Ƒļöŵ Àüţĥöŕîñĝ

Ƒļöŵš đéƒîñé þŕöçéššîñĝ þîþéļîñéš àš ÝÀḾĻ ƒîļéš. Ţĥé šţéþš-ƃàšéđ ƒöŕḿàţ îš ţĥé ĥüḿàñ-àüţĥöŕéđ ŕéþŕéšéñţàţîöñ ţĥàţ çöḿþîļéš ţö àñ îñţéŕñàļ ĝŕàþĥ (ñöđéš + éđĝéš) ƒöŕ éẋéçüţîöñ.

Šţéþš ƒöŕḿàţ

À ƒļöŵ îš à ļîšţ öƒ šéǫüéñţîàļ šţéþš. Éàçĥ šţéþ ŕéƒéŕéñçéš à ţööļ ƃý ñàḿé àñđ öþţîöñàļļý þŕöṽîđéš çöñƒîĝüŕàţîöñ:

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 šļîçéš:

  1. Éàçĥ šéǫüéñţîàļ šţéþ ƃéçöḿéš à ţööļ ñöđé, çĥàîñéđ ƃý éđĝéš
  2. À parallel: ƃļöçķ çŕéàţéš ḿüļţîþļé ţööļ ñöđéš, àļļ çöññéçţéđ ƒŕöḿ ţĥé þŕéṽîöüš ñöđé (ƒàñ-öüţ)
  3. Àƒţéŕ à þàŕàļļéļ ƃļöçķ, šüƃšéǫüéñţ šţéþš çöññéçţ ƒŕöḿ àļļ ƃŕàñçĥ éñđþöîñţš (ƒàñ-îñ)

Ţĥé ĝŕàþĥ îš ţööļ ñöđéš öñļý. Ţĥé ƒļöŵ'š šöüŕçé àñđ šîñķ àŕé ƃîñđîñĝš šüþþļîéđ àţ ŕüñ ţîḿé (É-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...