Skip to main content

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_LOCALE is unset, or the active locale has no entry in a rule's reason_localized, the plain reason is 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_LOCALE variable.
  • Localization is display-only. It never changes which rule matches, the decided effect, or the machine-readable reason_code that automation should branch on.
  • Hosted (signed-bundle) policies carry reason_localized end-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

LocaleStatus
enDefault. Always present for every built-in message.
koKorean. 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.

note

The bundled Korean translations are a professional draft. Have your own reviewers confirm the wording before relying on it in production.