i18n is disabled by default, preventing bundled translations from loading for all locales
What version of the Codex App are you using (From “About Codex” dialog)?
26.519.81530 (3178)
What subscription do you have?
Plus
What platform is your computer?
Darwin 24.6.0 arm64 arm
What issue are you seeing?
Codex Desktop ships bundled translations and locale files for multiple locales, but the UI stays in English because i18n is gated behind the enable_i18n Statsig flag and its local fallback defaults to false.
This affects all bundled non-English locales, not only zh-CN. Even when the system locale is a supported locale, or localeOverride is set, the translated UI does not load unless the remote Statsig config explicitly enables enable_i18n.
I verified this locally by inspecting the packaged app. The i18n provider in the webview bundle reads the flag with a false fallback:
get(`enable_i18n`, false)
Changing only that fallback to true allows bundled translations to load.
What steps can reproduce the bug?
1. Install Codex Desktop version 26.519.81530 (3178).
2. Use a supported bundled non-English locale, for example:
- Set macOS system language/region to zh-CN, ja-JP, fr-FR, de-DE, etc.
- Or set Codex `localeOverride` to a supported locale such as `zh-CN`.
- Or launch with `ELECTRON_LOCALE_OVERRIDE=zh-CN`.
3. Restart Codex Desktop.
4. Observe that the UI remains English.
This is not tied to a specific conversation/session. It happens before any Codex session is needed.
What is the expected behavior?
When the system locale or localeOverride is set to a supported bundled locale, Codex Desktop should load that locale's translated UI by default.
Since the locale files are already bundled with the desktop app, users should not need a remote Statsig flag to be enabled before translations can appear.
Additional information
This bug has existed for a long time. I noticed that no one has attempted to fix this vulnerability yet, and this vulnerability has occurred multiple times in the issue section. I would like to submit a pull request to fix this issue.
I wrote a Python script to patch the local app.asar file, and then I was able to switch languages correctly.
https://gist.github.com/Saber-CC/9c990d06f6a4c485de10851586cad818
3 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
I can still reproduce this on the latest Codex Desktop release.
Environment:
What I observed:
Additional diagnosis:
The selected locale appears to be saved and propagated correctly. The problem looks consistent with the i18n provider not loading translated messages unless the remote Statsig gate/dynamic config enables enable_i18n. This also explains why another user on the same Codex version and also using API key auth can see Chinese UI, while this machine/account cannot.
Expected behavior:
If a supported locale is selected in Settings and localeOverride is set, Codex Desktop should load the bundled locale messages without requiring a per-account/per-device remote rollout flag.
Update / re-scoping after further investigation
After looking through existing issues, it turns out Codex Desktop already ships with a fairly complete
zh-CNtranslation bundle (~6,000+ strings inwebview/assets/zh-CN-*.jsplusnative-menu-locales/zh-CN.json). The original framing of this issue ("introduce an i18n layer") is therefore inaccurate — the i18n layer exists and the translations exist; they just don't load.The actual root cause, already documented by other reporters, is that the i18n system is gated behind the Statsig flag
enable_i18n, whose local fallback defaults tofalse. So even with:zh-CNlocaleOverride = "zh-CN"inconfig.toml--lang=zh-CNELECTRON_LOCALE_OVERRIDE=zh-CN…the renderer still falls back to English because the i18n init code never activates.
Concrete asks (revised)
enable_i18ntotrue, or remove the gate entirely now that the translations are shipped.localeOverride/app.getLocale()/navigator.languageinstead of hard-codingen-US.localeOverrideconfig key in user-facing docs.Related / likely-duplicate issues
Happy for maintainers to close this as a duplicate of whichever of the above they consider canonical (likely #24741). Leaving it open meanwhile in case the consolidated framing helps triage.