I built a free JetBrains plugin that treats i18n keys like real code symbols (i18next, vue-i18n, react-intl, lingui…)
Hey everyone,
On every i18n project I worked on, the same thing kept happening: my editor treated translation keys as dead strings. I kept opening fr/common.json just to check whether a key existed, which namespace it lived in, or whether someone forgot to translate it in German.
So I built I18n Support Plus, an open-source (MIT) plugin for WebStorm, IntelliJ IDEA Ultimate and PhpStorm (2025.1+). It turns t('common:menu.home') into something the IDE actually understands.
In the editor
- Ctrl+Click from a key to its translation and back, with a gutter icon showing resolved / missing / missing file
- The translated value shown inline (inlay hints, folding, hover)
- Autocomplete from your real keys. Each suggestion shows its translation, and you can find a key by its text: typing
accoffersmenu.homewhen it reads "Accueil" - Alt+Enter on a hardcoded string to extract it. If the text already exists in your reference locale, it offers the existing key instead of creating a duplicate.
<p>Hello {user.name}</p>becomes one message with a{{name}}placeholder - Rename a key across all locales and code (Shift+F6), move it to another namespace, delete it everywhere with a single undo
Catching mistakes before your users do
- A key missing from a locale, or plural forms missing for a language (
runeedsfewandmany, not justone/other) t('greeting')called without thenamevariable its translation uses- A translation that lost a
<1>tag, which silently breaks<Trans> - A value just copied from the English one and never translated
Project-wide
- A tool window with tree and table views, coverage per namespace and locale, and a "show only what's left to translate" filter
- Find unused keys, sync missing keys in bulk, CSV and XLIFF export/import for translators
- Generate a typed
i18next.d.tssotscrejects a mistyped key in CI, even for teammates who don't use the plugin - Generate a pseudo-locale (
[Šéţţîñĝš ···]) to spot unextracted or truncated text
It works with i18next/react-i18next, vue-i18n, lingui, react-intl (FormatJS), ngx-translate, svelte-i18n and i18n-js. It supports JS/TS/JSX/TSX, Vue SFC and PHP, with JSON, YAML and PO/POT files. A setup wizard detects your framework on first launch.
I'd really like feedback from people who live with multi-language apps: what breaks on your setup, and what's missing? I've also opened a few good first issues if anyone wants to contribute, for example Nuxt / next-intl detection, a CONTRIBUTING guide, and GIFs for the README.
- Marketplace: https://plugins.jetbrains.com/plugin/30971-i18n-support-plus
- GitHub: https://github.com/IBRAHIMDANS/i18nSupportPlus
Happy to answer questions, and roasting is welcome.