> For the complete documentation index, see [llms.txt](https://docs.openiam.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.openiam.com/administration-guide/reference/languages.md).

# Languages and localization reference

The languages OpenIAM ships, their codes, and how a missing translation falls back.

## What this is, and when you need it

A row in this table does not translate anything; it makes a language selectable and it gives you the numeric `LANGUAGE.ID` that every `LANGUAGE_MAPPING` row has to quote. Take the ID from the table rather than from the language code, because several codes appear on more than one row and only one row per language is active. Where no mapping exists for a user's language, the object falls back to its base name instead of rendering empty — which is why a partly translated console looks unfinished rather than broken.

Reach for this page when you are about to add `LANGUAGE_MAPPING` rows and need the right ID, or when a language you expected to be offered is not in the picker. For how the two translation surfaces behave in practice, see [Localization](/administration-guide/platform/localization.md).

## Shipped languages

**23** languages are seeded in the `LANGUAGE` table. The Webconsole "Is Active" checkbox is the `IS_USED` column.

| ID   | Language  | Code   | Active | Default |
| ---- | --------- | ------ | ------ | ------- |
| `10` | Chinese   | `zh`   | yes    | —       |
| `14` | Danish    | `dk`   | yes    | —       |
| `nl` | Dutch     | `None` | no     | —       |
| `6`  | Dutch     | `nl`   | no     | —       |
| `17` | Dutch     | `nl`   | yes    | —       |
| `en` | English   | `None` | no     | —       |
| `1`  | English   | `en`   | yes    | yes     |
| `fr` | French    | `None` | no     | —       |
| `3`  | French    | `fr`   | yes    | —       |
| `de` | German    | `None` | no     | —       |
| `2`  | German    | `de`   | yes    | —       |
| `it` | Italian   | `None` | no     | —       |
| `5`  | Italian   | `it`   | no     | —       |
| `9`  | Japanese  | `ja`   | yes    | —       |
| `15` | Malaysian | `ms`   | yes    | —       |
| `12` | Norwegian | `no`   | yes    | —       |
| `pt` | Portugese | `None` | no     | —       |
| `7`  | Portugese | `pt`   | no     | —       |
| `11` | Portugese | `pt`   | yes    | —       |
| `8`  | Russian   | `ru`   | yes    | —       |
| `es` | Spanish   | `None` | no     | —       |
| `4`  | Spanish   | `es`   | yes    | —       |
| `18` | Swedish   | `se`   | yes    | —       |

## Two different translation surfaces

Localization in OpenIAM is not one mechanism, and conflating them is the usual reason a translation "does not apply".

**Static UI text** — button labels, validation messages, screen titles — comes from a resource bundle named `messages_<locale>.properties` shipped inside each UI service. No screen in OpenIAM edits it. A deployment can override it on disk, which needs filesystem access and a restart of the UI services and therefore belongs to whoever owns the deployment — see the [Installation Guide](/installation/installation.md). You cannot confirm from the Webconsole which bundle a given label came from; the observable symptom is the one below.

**Object names** — menus, roles, resources, page-template labels — are translated by `LANGUAGE_MAPPING` rows against the object. These *are* editable at runtime. When no mapping row exists for the active language, the object falls back to its base name rather than showing an empty label.

So: if a menu shows English inside an otherwise-translated console, it needs a `LANGUAGE_MAPPING` row, not a bundle change — and you can fix that yourself. If a system message or a button shows English, it is a bundle key, and no amount of mapping rows will move it.

{% hint style="info" %}
Adding a language row does not translate anything. It makes the language selectable. Plan the mapping rows for every object a user of that language will see, and verify with an account whose preferred language is set — not by switching your own locale on one screen.
{% endhint %}

*Applies to OpenIAM 2026.8.1. Last reviewed 7 August 2026.*


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.openiam.com/administration-guide/reference/languages.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
