Skip to content

i18n Overview

Greentic provides comprehensive internationalization (i18n) support through the greentic-i18n library. It enables:

  • Deterministic string identifiers
  • Locale-based message retrieval
  • Adaptive Card translation
  • Runtime language switching

Deterministic IDs

I18nId v1 spec uses BLAKE3 hashing for consistent, collision-resistant identifiers.

Multi-Format

Support for JSON, YAML, PO, and XLIFF translation formats.

Cards Integration

Built-in support for translating Adaptive Cards.

Runtime Switching

Change languages per-session without restart.

Source String: "Hello, World!"
┌─────────────────────────────────┐
│ BLAKE3 Hash Function │
│ blake3(normalize(string)) │
└─────────────────────────────────┘
I18nId: "i18n:v1:abc123def456"
┌─────────────────────────────────┐
│ Translation Lookup │
│ locale_map[id] → "Halo!" │
└─────────────────────────────────┘

For Adaptive Cards:

Terminal window
greentic-cards2pack extract-i18n --input ./cards --output i18n/en.json

Using greentic-i18n-translator (powered by Codex CLI):

Terminal window
greentic-i18n-translator translate --langs fr,de,ja --en i18n/en.json

Or auto-translate during pack generation:

Terminal window
greentic-cards2pack generate \
--cards ./cards --out ./pack --name demo \
--auto-translate --langs fr,de,ja
i18n:
default_locale: "en"
locales:
en: "translations/en.json"
id: "translations/id.json"
ja: "translations/ja.json"
- id: greet
type: reply
config:
message_key: "i18n:v1:abc123" # Resolved based on session locale

The locale is resolved in this order:

  1. Session-level locale (set per user)
  2. Team-level default
  3. Tenant-level default
  4. Global default
# Set session locale
- id: set_language
type: state
config:
action: set
key: "locale"
value: "id" # Indonesian

Any language is supported. Common configurations:

LocaleLanguage
enEnglish
idIndonesian
jaJapanese
zhChinese
esSpanish
deGerman