u/Alternative-Let-3858

▲ 3 r/IntelliJIDEA+1 crossposts

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 acc offers menu.home when 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 (ru needs few and many, not just one/other)
  • t('greeting') called without the name variable 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.ts so tsc rejects 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.

Happy to answer questions, and roasting is welcome.

reddit.com
u/Alternative-Let-3858 — 6 days ago