Localized block messages
The human-readable reason Control Zero shows when a rule denies, warns on, or
observes a tool call is plain UTF-8 text. You can write it in any language, and
you can serve more than one language from a single policy.
This is designed for self-hosted and air-gapped deployments: the translations are pure in-binary maps with no runtime internationalization library and no network calls.
Per-rule overrides with reason_localized
Add a reason_localized map to any rule. It is keyed by locale; the value is
the message shown when that locale is active. Keep reason as the English (or
default-language) text:
version: '1'
rules:
- deny: 'delete_*'
reason: 'Deletes need human approval'
reason_localized:
ko: '삭제는 사람의 승인이 필요합니다'
- allow: '*'
Select the active locale with the CONTROLZERO_LOCALE environment variable,
read by every SDK and the hook-check CLI:
export CONTROLZERO_LOCALE=ko
Region subtags are tolerated: ko-KR and ko_KR both resolve to the ko
entry.
Behavior and guarantees
- When
CONTROLZERO_LOCALEis unset, or the active locale has no entry in a rule'sreason_localized, the plainreasonis used. Existing policies are unaffected and the English text is byte-identical to before. - Control Zero's own built-in messages (no-rule-match, DLP block,
empty/observe bundle, tamper) ship an English default plus a Korean
translation, selected by the same
CONTROLZERO_LOCALEvariable. - Localization is display-only. It never changes which rule matches, the
decided effect, or the machine-readable
reason_codethat automation should branch on. - Hosted (signed-bundle) policies carry
reason_localizedend-to-end: the backend serializes it and every SDK preserves it through bundle translation. - The localized message is emitted verbatim as UTF-8 in the hook output (for
example the Claude Code
permissionDecisionReason), not escaped.
Supported locales
| Locale | Status |
|---|---|
en | Default. Always present for every built-in message. |
ko | Korean. Built-in message pack shipped; review with your localizers. |
Any locale you author in reason_localized works immediately. The built-in
system-message pack currently ships English and Korean; additional languages
can be added to the pack.
The bundled Korean translations are a professional draft. Have your own reviewers confirm the wording before relying on it in production.