# Providing Translations
Translating IDE and plugin texts used in UI, inspections, file templates, and other elements
Translations for IntelliJ Platform products and plugins can be provided in two ways:
- [](#language-packs)
- [](#bundled-translations)
_This talk covers how to implement localization in JetBrains plugins.
While JetBrains IDEs are available in Simplified Chinese, Japanese, and Korean, most plugins remain English-only.
Joachim demonstrates how to easily localize different plugin elements like messages, settings, inspections, and file templates.
The session also provides tips on localizing plugin descriptions for Marketplace, websites, or handbooks._
## Language Packs
Localizing IDEs is achieved by providing language packs (see [language packs](https://plugins.jetbrains.com/search?tags=Language%20Pack) provided by JetBrains).
Language packs are IntelliJ Platform plugins containing translations of UI texts.
Official language packs contain translations of all the UI texts used in the IDE and in plugins developed by JetBrains.
Note that language packs aim for full IDE localization.
If it is required to translate a plugin, see the [](#bundled-translations) section.
Language packs must define their language.
The language definition is provided in the [`plugin.xml`](plugin_configuration_file.md) file with , for example:
```xml
```
The `locale` attribute defines the translation language on two possible levels:
- region level, for example: `zh-CN` – Chinese (Simplified), `zh-TW` – Chinese (Taiwan)
- language level, for example, `ja` – Japanese
> Note that is internal and must be used by JetBrains only.
>
{style="warning"}
### Language Selection
In versions 2024.2 and newer language packs are bundled in IDE distributions.
To select the IDE language, follow the instruction from the [IntelliJ IDEA Web Help](https://www.jetbrains.com/help/idea/language-and-region.html#language).
In versions 2024.1 and older, there is no language selector in the IDE, and language packs serve as the IDE "language switcher."
Installing a language pack changes the IDE language to the one defined by the .
Only a single language pack can be installed at the same time, and restart is required for the translations to take effect.
### Getting the Current Locale Programmatically
To get a current UI language set in the IDE, use [`DynamicBundle.getLocale()`](%gh-ic%/platform/core-api/src/com/intellij/DynamicBundle.java).
### Language Pack Translations Structure
See the [translated elements](#translated-elements) list for the elements possible to translate.
All the elements should be located in exactly the same paths as in original locations in their JAR files.
For example, if the original location of a message bundle is \$PLUGIN_JAR\$/messages/AbcBundle.properties, it must be located in \$LANGUAGE_PACK_JAR\$/messages/AbcBundle.properties.
In case of doubts, it is recommended to inspect the contents of existing language packs.
## Bundled Translations
> Note that bundled translations are in the experimental state.
>
{style="warning"}
The IntelliJ Platform partially supports providing translations directly bundled in the IDE or plugins.
See the [translated elements](#translated-elements) list for the elements possible to translate.
An IDE module or a plugin can provide multiple language translations in a single distribution, for example, `zh-CN` and `ja`.
Proper localization files will be used at runtime depending on the [IDE language](#language-selection).
### Bundled Translations Structure
Translations for a specific language can be organized in two ways as shown below.
The proper directory layout/filename suffixes is the only thing needed for the translations to work.
No additional actions like registering EPs are needed.
#### Language Directory
Translated resources are stored in a dedicated directory structure.
/localization/\$LANGUAGE_CODE\$/\$REGION_CODE\$ (`$REGION_CODE$` level is optional).
Example:
- Original template description:
/fileTemplates/code/JavaDoc Class.java.html
- Translated template description:
/localization/zh/CN/fileTemplates/code/JavaDoc Class.java.html
#### Localization Suffix in Filename
Translated resources are stored in files with dedicated filename.
/intentionDescriptions/QuickEditAction/description_\$LANGUAGE_CODE\$_\$REGION_CODE\$.html
Example:
- Original template description:
/intentionDescriptions/QuickEditAction/description.html
- Translated template description:
/intentionDescriptions/QuickEditAction/description_zh_CN.html
## Translated Elements
The following table contains the possible translated elements and information about their support in language packs and IDE/plugins.
| Element | Language Pack | Bundled Translations |
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------|------------------------------------------------------------------------------------------|
| [Message bundles](internationalization.md#message-bundles)
(*.properties files)
| Yes | Since 2024.1_Use [`DynamicBundle`](internationalization.md#message-bundle-class)_
|
| [Inspection descriptions](code_inspections.md#inspection-description)(*.html files in /inspectionDescriptions directory)
| Yes | Since 2024.1 |
| [Intention descriptions](code_intentions.md#about-intention-actions)(*.html files in /intentionDescriptions directory)
| Yes | Since 2024.1 |
| [File template descriptions](providing_file_templates.md#creating-file-template-description)(*.html files in the /fileTemplates directory)
| Yes | Since 2024.2 |
| [Postfix template descriptions](postfix_templates.md#postfix-template-description)(*.xml file in /postfixTemplates directory)
| Yes | Since 2024.2 |
| Tips of the day(*.html files in tips directory)
| Yes | Since 2024.2 |
See the [IntelliJ Platform UI Guidelines | Text](capitalization.md) sections for good practices about writing UI texts.
## Translation Lookup Order
Translations can be provided on three different levels:
- region-specific translation
- language-specific translation
- default translation (English)
In addition, translations can be [organized in directories or with file suffixes](#bundled-translations-structure), and the same translation can be provided by a [language pack](#language-packs) or [IDE/plugin](#bundled-translations).
All these conditions determine how a single translation is resolved at runtime.
The lookup order is as follows:
1. Translation file from the language pack.
2. Region level (for example, `zh_CN`, `zh_TW`) localization file:
1. located within the localization directory of the IDE or plugin
2. via suffix within the IDE or plugin
{type="alpha-lower"}
3. Language level (for example, `zh`) localization file:
1. located within the localization directory of the IDE or plugin
2. via suffix within the IDE or plugin
{type="alpha-lower"}
4. Default file (no suffix) within the IDE or plugin (original English message).
{type="alpha-lower"}
### Example
Assume that the current IDE language is set to Simplified Chinese (`zh_CN`).
To find an example messages/MyBundle.properties message bundle for this language, the locations will be searched in the following order:
1. messages/MyBundle.properties (in the selected language pack plugin)
2. localization/zh/CN/messages/MyBundle.properties (region level)
3. messages/MyBundle_zh_CN.properties (region level)
4. localization/zh/messages/MyBundle.properties (language level)
5. messages/MyBundle_zh.properties (language level)
6. messages/MyBundle.properties (default)