---
title: Language Support (UI & AI replies)
---

# Language Support (UI & AI replies)

## What it is

Omniscio's interface is available in **35 languages** — English plus 34 others — and every
one is **available by default**, no setup or toggle required. The language system has two
parts that work independently:

- **UI language** — the menus, labels, buttons, and chrome of the app itself, translated
  from the bundled catalogs.
- **AI reply language** — the Claude agent's spoken output (Voice Report Back, Voice L3
  briefings, L4 answers, Omni summaries) automatically detects the language of the
  conversation and speaks in that language. Nothing to set up; it is always on.

## Where to find it

### Where to switch the UI language

**Settings → Appearance → Language** (a dropdown). It's there by default — pick a language
and the UI switches **immediately, no restart**.

English is the default until you choose otherwise. A fresh install does **not** auto-switch
based on your operating-system language — starting in another language is always a deliberate
choice you make in the picker. Any string not yet translated in a language **falls back to
English automatically**, so you never see a missing key or a blank label.

## How it behaves

### Available languages

All 35 appear in the picker by default:

English · Español · Italiano (Italian) · Français · Deutsch · Português (Brasil) · Română · Magyar ·
Türkçe · Bahasa Indonesia · Tiếng Việt (Vietnamese) · ไทย (Thai) · Polski (Polish) · Kiswahili (Swahili) ·
Српски (Serbian) · हिन्दी (Hindi) · বাংলা (Bengali) · ਪੰਜਾਬੀ (Punjabi) · اردو (Urdu) · فارسی (Persian) ·
العربية (Arabic) · 日本語 (Japanese) · 한국어 (Korean) · 简体中文 (Simplified Chinese) ·
繁體中文 (Traditional Chinese) · Tagalog · Cebuano · Ilocano · Hiligaynon · Waray · Bikol · Kapampangan ·
Pangasinan · ქართული (Georgian) · Русский (Russian)

**Right-to-left:** Arabic (العربية), Urdu (اردو), and Persian (فارسی) render the whole UI
right-to-left when selected.

> The 34 non-English catalogs are held to full coverage by a build guard, so what ships is
> complete; if a brand-new English string lands before its translation, that one string shows in
> English until it is translated — never a broken screen. Translations are produced as part of the
> work rather than by an always-on translation service, so a new English string can stay in English
> for a while rather than clearing itself on a timer.

**Hungarian (Magyar) has had a dedicated quality pass** (September 2026). It was rewritten against a
Hungarian style guide and a word list approved by a native speaker: it talks to you informally ("te",
never the formal "Ön"), uses one Hungarian word for each Omniscio term — for example *munkamenet* for a
session and *Beérkező levelek* for the inbox — and keeps names such as Night Shift, Super Prompt and
Team Chat in English. Strings added later are translated with the same rules, so the voice stays
consistent.

### AI reply language (spoken output)

When Omniscio reads an agent's reply aloud via **Voice Report Back**, **Voice L3** (thread
briefings), or **Voice L4** (live agent answers), it detects the language of the content
and speaks in that language — not always English. The behavior is automatic. If a voice
matching that language is available it uses that voice; otherwise the configured voice
speaks the detected language (built-in TTS engines are multilingual). Today all preset
voices are English, so the voice itself does not change — but it already handles whatever
language the agent produces.

## For agents

### For developers

The i18n system is documented in `src/shared/i18n/config.ts` and the
[i18n foundation contract](../../.claude/memory/contracts/i18n-foundation-contract.md). Key
constants:

- `PILOT_LANGUAGES` — the ordered list of 34 shipped BCP-47 codes (all `status: 'shipped'` in
  `unreleased-features.ts`, so `visiblePilotLanguages()` returns every one by default; the
  per-language `*PilotEnabled` settings are now vestigial).
- `LANGUAGE_DISPLAY_NAMES` — the human-readable picker labels (first-class names; the former
  "(pilot)" suffix was dropped 2026-08-15).
- `selectableLanguages()` — the single choke-point. A **revealed / shipped** language is
  offered regardless of coverage drift (untranslated keys fall back to English); the coverage
  gate (`LANGUAGE_COVERAGE_THRESHOLD`, 100) still applies to anything NOT revealed. First-run
  OS detection and renderer boot call it with an empty reveal set, so a language is OFFERED,
  never AUTO-selected.
- Coverage is measured by `npm run i18n:coverage` and stored in
  `src/shared/i18n/language-coverage.generated.json`; the per-key drift guard
  (`tests/unit/lint/i18n-coverage-drift.test.ts`) fails the build on a stale map or an
  untranslated shipped catalog. A missing string is added by hand: its `en` plus every translation
  go into the branch's own patch file (below) — the API translator is retired, and nothing catalogues
  the `en` entry for you except `npm run i18n:extract`, which seeds it from the code default.
- Locale catalogs live in `resources/locales/<code>/` as 64 shard files (`common.00.json` … `common.63.json`);
  they are read and written only through `scripts/i18n/catalog-io.mjs`. A branch never edits those shards:
  its new keys and their translations go into ONE patch file of its own under `resources/locales/patches/`
  (every language inside), which every reader overlays on the shards; a scheduled job on master folds landed
  patches back into the shards once 50 have piled up (`npm run i18n:compact`), and a shard edit made by hand
  is refused at merge time — `npm run i18n:patch -- --from-shards` moves it onto the patch. During the
  2026-09-08 transition a
  language may also still carry its old single-file `common.json` (listed in `shard-snapshot.json`); it is
  read as a union and retired by the next translation write (`npm run i18n:shard -- --retire` does it by hand).
- A language can carry a **style guide** — `scripts/i18n/style-guides/<lang>.json` (register rules, a
  glossary, keep-English names). The translator adds it to that language's prompt only, and a report-only
  check lists what still breaks it (Hungarian today: `tests/unit/lint/i18n-hungarian-style.test.ts`). See the
  [translate-pipeline](../../.claude/memory/contracts/i18n-foundation-translate-pipeline-contract.md) and
  [catalog-guards](../../.claude/memory/contracts/i18n-foundation-catalog-guards-contract.md) contracts.

## Related

The spoken replies this page is about come from the voice features, described on the [Voice and TTS](voice-and-tts.md) page. Anything you have had translated into your own words — summaries and Plain Speak cards — is on [Plain Speak](plain-speak.md).
