Your app's translations, handled from the code that uses them.
WebStorm, IntelliJ IDEA Ultimate and PhpStorm 2025.2 and later.

A hard-coded text becomes a key, written in every language at once.
Compare with i18n Ally and Easy I18n · Examples · Changelog · Report a bug · Request a feature
When an app is translated into several languages, every text in the code becomes a key, such as t('checkout.pay_now'), and its wording lives in one file per language. To the IDE that key is a plain string: nothing tells you what it says, whether French still lacks it, or where it is defined.
I18n Support Plus makes WebStorm, IntelliJ IDEA Ultimate and PhpStorm understand those keys the way they understand a function name:
- Read — hover a key to see its text and which languages still lack it; a gutter icon shows its status, and completion offers the keys that really exist
- Navigate — Ctrl+click opens the right line of the translation file; Shift+F6 renames the key, or a whole level, in every language and every call site
- Extract — select a hard-coded text, press Alt+Enter, and it becomes a key written in every language at once; one Ctrl+Z undoes the files and the code
- Keep in sync — a tool window lists what is missing, empty, duplicated or unused, and fills the gaps by machine translation (a local Ollama, DeepL, LibreTranslate, Google or any OpenAI-compatible API) or through Codex, Claude or any MCP client, after a preview and with placeholders and plural forms checked
It also catches what a translation can get wrong: missing plural forms per language, broken placeholders and ICU messages, stale values, hard-coded text. The same checks run in CI with i18n-check, as a GitHub Action that annotates the pull request, with the configuration shared in i18n-check.json.
Works with i18next / react-i18next, vue-i18n (Nuxt), next-intl, lingui, react-intl, ngx-translate, Transloco, Angular i18n ($localize), svelte-i18n, i18n-js, Paraglide JS, typesafe-i18n, Meteor universe:i18n, Laravel / Blade and Symfony / Twig, in JS, TS, JSX, TSX, Vue SFC, Svelte, Astro, Angular templates, PHP, Blade and Twig, with JSON, JSON5, YAML, PO/POT, XLIFF, Laravel PHP arrays, Flutter ARB, Java .properties and plain TS/JS catalogues: every framework, language and format. A setup wizard configures it on first launch, monorepo modules included, and rules teach it your own translate('key') wrapper.
Coming from I18n Support? This plugin is the maintained successor of the original, which no longer installs on IDEs after 2023.1: install it next to the old one, it reads your project settings as they are — see the migration notes.
Documentation · Compare with i18n Ally and Easy I18n · Examples · Changelog
- Installation · Why this plugin? · Features · Supported Frameworks
- Requirements · Build from Source · Contributing
New to the plugin? Getting started takes you from the installation to your first keys in ten minutes, and defines the words the pages below use.
The reference, one page per topic, in docs/:
- Frameworks, languages and file formats: every syntax read, per framework, and the file formats
- In the editor: key status, navigation, completion, extraction, hints, folding, renaming, quick fixes
- Tool window and bulk actions: tree and table, reviews, stats, keys synchronizer, export and import
- Machine translation and AI agents: engines, glossary, tone, MCP tools
- Checks: inspections, CI and the command line: inspections, Qodana,
i18n-check, GitHub Action, Docker - Setup and configuration: setup wizard, modules, every setting,
i18n-check.json
In the IDE, Settings › Plugins › Marketplace, search for I18n Support Plus (plugin ID com.ibrahimdans.i18n) and install it, or click Install on its Marketplace page. It installs in any IntelliJ-based IDE 2025.2 or later; the keys in your code need the JavaScript plugin, bundled with WebStorm, IntelliJ IDEA Ultimate and PhpStorm (Requirements).
On first launch, the setup wizard detects the framework and the translation files and configures the rest.
First steps, from the wizard to your first keys: Getting started.
On a real i18next/vue-i18n project, your keys and translations live in files your editor treats as dead text — so you keep opening JSON files just to check whether a key exists, in which namespace, and whether it's translated everywhere.
I18n Support Plus turns i18n keys into first-class code symbols.
- See & navigate — inline resolution status (gutter ✅/
⚠️ /❌), Ctrl+Click to the translation and back, value hints (inlay + folding + hover), autocomplete from your real keys (namespaces included), dynamic/wildcard keys supported. - Edit safely — extract hard-coded strings (
Alt+Enter), rename across all locales and code (Shift+F6), move a key to another namespace (Ctrl+Alt+Shift+M), sort keys in the order you choose. - Stay healthy — tool window with tree/table views grouped by namespace, coverage stats per namespace and locale, Keys Synchronizer (propagate missing keys in bulk), Count Key Usages (find keys no code refers to), CSV and XLIFF export/import, and inspections for missing, empty, duplicate or inconsistent values.
Every library, language and file format it reads: Supported Frameworks.
Coming from i18n Ally or Easy I18n? See the feature-by-feature comparison and how to carry your settings over.
A gutter icon tells whether a key exists in all, some or no locale. Its value shows as an inline hint, in a Ctrl+hover table of every locale, or folded in place of the key. Ctrl+click opens the translation, and completion offers the keys that really exist, namespaces included.
Details: In the editor.
Alt+Enter turns a hard-coded string into a key, written in every locale; Internationalize… does a whole file or folder after a preview. Shift+F6 renames a key, or a whole level, in every locale and call site, and Ctrl+Alt+Shift+M moves a key to another namespace. One Ctrl+Z undoes the files and the code.
Details: Key Extraction, Rename Refactoring, Actions on keys.
The tool window shows the keys as a tree or an editable table, filters the missing, empty, duplicate and unreferenced ones, and gives the coverage of each namespace and locale. It also holds the keys synchronizer, the reviews, CSV and XLIFF export and import, and the comparison with a Git branch.
Details: Tool window and bulk actions.
Machine translation is opt-in, through a local Ollama, DeepL, LibreTranslate, Google or any OpenAI-compatible API. Placeholders, tags and the target language's plural forms are kept, and nothing is written before a preview. Codex, Claude or any MCP client can do the same through the plugin's tools on the IDE's MCP server.
Details: Machine translation and AI agents.
Twenty-five inspections check the translations and the code: unknown keys in the code, missing, orphan, empty and duplicate keys, placeholders, markup, ICU messages, plural forms, stale translations and hard-coded text. i18n-check runs the same checks in CI, as a GitHub Action or from the command line, and annotates the pull request; a Docker image is published on request.
Details: Checks: inspections, CI and the command line.
On first launch, the setup wizard detects the framework and the translation files, and creates a module per application in a monorepo. The settings can be shared with the team in i18n-check.json.
Details: Setup and configuration.
| Framework | For example |
|---|---|
| i18next / react-i18next | t('ns:key'), useTranslation('ns'), <Trans i18nKey="key"> |
| vue-i18n (Nuxt) | $t('key'), <i18n-t keypath="key">, v-t="'key'" |
| next-intl | const t = useTranslations('Home'), then t('title') |
| Lingui | i18n._('key'), msg('key'), <Trans>Hello world!</Trans> |
| react-intl (FormatJS) | formatMessage({ id: 'key' }), <FormattedMessage id="key" /> |
| ngx-translate | translate.instant('key'), {{ 'key' | translate }} |
| Transloco | translocoService.translate('key'), {{ 'key' | transloco }} |
| Angular i18n | <h1 i18n="@@home.title">, $localize`:@@home.title:Welcome` |
| svelte-i18n | $_('key') |
| i18n-js | i18n.t('key') |
| Paraglide JS | m.hello() |
| typesafe-i18n | LL.home.title() |
| Meteor universe:i18n | const t = useTranslator('Home'), then t('title') |
| Laravel / Blade | __('key'), trans_choice('key', 2), @lang('key') |
| Symfony / Twig | $translator->trans('key', [], 'admin'), {{ 'key'|trans }}, {% trans %}key{% endtrans %} |
The keys are read in JS, TS, JSX, TSX, Vue SFC, Svelte, Astro, Angular templates, PHP, Blade and Twig, and the translations in JSON, JSON5, YAML, PO/POT, XLIFF, Laravel PHP arrays, Symfony catalogues, Flutter ARB, Java .properties and TS/JS catalogues. Every syntax, language and format: Frameworks, languages and file formats.
- Any IntelliJ-based IDE 2025.2+ (build 252–263.*), verified against 2025.2, 2025.3, 2026.1, 2026.2 and 2026.3
- Without the JavaScript plugin (IntelliJ IDEA Community, Android Studio, PyCharm, an unlicensed IntelliJ IDEA 2025.3+): the tool window, the inspections of the translation files, machine translation and the AI agent tools; no key in the code
- On 2025.1, the last compatible version is 1.11.1
- Java 21+ only for
i18n-checkon the command line and for building the plugin: in the IDE, the plugin runs on the IDE's own runtime - No usage statistics; what is sent, to whom and when: What leaves your machine
| Plugin | Required | Enables |
|---|---|---|
| JavaScript | No | Keys in JS, TS, JSX and TSX code: highlighting, completion, navigation, extraction, the frameworks' calls, TypeScript translation files (WebStorm, IntelliJ IDEA Ultimate, PhpStorm) |
| Vue.js | No | vue-i18n support ($t, $tc, $te, <i18n-t keypath>, v-t) |
| YAML | No | .yaml/.yml translation files |
| PHP | No | PHP language support |
| Localization | No | PO/POT gettext files |
| Angular | No | Translation pipes and Transloco directives in Angular templates (.html) |
| Blade | No | Keys in Blade views ({{ __('key') }}, @lang) |
| Twig | No | Keys in Twig templates of a Symfony project ({{ 'key'|trans }}, {% trans %}) |
| Svelte | No | Keys in .svelte components |
| Astro | No | Keys in .astro components |
| Git | No | Compare with Branch (translation changes of a branch) |
| MCP Server | No | The tools AI agents call (2025.2.6+) |
git clone https://github.com/IBRAHIMDANS/i18nSupportPlus.git
cd i18nSupportPlus
./gradlew buildPlugin
# Output: "build/distributions/i18n Support Plus-<version>.zip"Then install via Settings > Plugins > ⚙️ > Install Plugin from Disk.
See CONTRIBUTING.md for contributor setup, run/test commands, architecture notes, conventions, and troubleshooting tips.
Originally created by Evgeniy Nyavro.
Maintained by Ibrahim Dansoko. Licensed under MIT.



