Documentation menu

Multilingual UI

Ten-Language Telegram UI, 1:1 Parity

English, Persian, Russian, Chinese, Portuguese, Uzbek, Indonesian, Spanish, French and Italian share one catalog with enforced 1:1 parity.

Verified against the checkout built for v2.2.4 · updated 20 Oct 2026

On this page

LocalizationNew in v2.0

Parity is enforced by audit, not by intention: a missing key fails the gate before it can ship.

The ten languages

Shipped locales
CodeLanguageScript
enEnglishLTR
faPersianRTL
ruRussianLTR (Cyrillic)
zhChineseLTR (Han)
ptPortugueseLTR
uzUzbekLTR (Latin)
idIndonesianLTR
esSpanishLTR
frFrenchLTR
itItalianLTR

The three rules the codebase enforces

  • One catalog, ten columns. A key exists in every language or the parity audit fails — there is no partial translation state in a release.
  • No hardcoded language branching in UI code. Labels resolve through the translation helper with an explicit language, and English is the only fallback. Persian is never used as a default.
  • RTL correctness is checked, not assumed: the audit verifies that English values contain no RTL script, so a copy-paste slip cannot leak Persian into the English interface.

Audits you can run yourself

Verify parity locally
atf i18n                  # catalog parity, placeholders, RTL leakage
atf validate              # includes the catalog checks in the standard gate
atf validate --deep       # adds the repository's own cross-language audits

Adding a language

Add the column to the catalog, and the audits will tell you exactly which keys are missing and which placeholders do not match. Placeholder parity matters as much as key parity: a translation that drops {count} breaks the message it renders.

Frequently asked

Is the interface fully translated or partly translated?

Fully. Every shipped locale carries the complete catalog, and the parity audit fails the build if a key is missing in any language.

What language do I see if my language is not supported?

English, always. Fallback is explicit and one-directional — Persian is never used as a fallback for another language.

Does the RTL layout work on the mobile app too?

Yes. RTL/LTR layout handling is implemented in the web dashboard, the Flutter app and the bot keyboard layouts.

Keep reading