---
name: "Stringtable.xml"
type: topic
source: https://community.bistudio.com/wiki/Stringtable.xml
revid: 378639
updated: 2026-05-15T15:31:37Z
---

# Stringtable.xml

> [!NOTE]
> [Stringtable.xml](../topics/Stringtable.xml.md) was introduced with Armed Assault. For Operation Flashpoint, see [Stringtable.csv](../topics/Stringtable.csv.md).

String tables are used to make internationalization easier for the game. They are used in addons, missions, and scripts, and are located in the root of the mission or addon folders.

Any strings that are used in the game can be kept separate from the code, and can therefore easily be edited and expanded into different languages. Instead of using strings directly in the code, you are using a variable. This variable will then contain the actual string, read from stringtable.xml, with the language that is being read depending on the game settings.

### Stringtable Editors

It is strongly recommended to use a tool to edit the XML file;
a selection of Stringtable Community Tools can be found in the Community Tools - Localisation Tools page section.

### Example

```xml
<?xml version="1.0" encoding="utf-8" ?>
<Project name="Any Name">
    <Package name="Mission One">
        <Container name="Some Words">
            <Key ID="STR_TAG_Yes">
                <Original>yes</Original>
                <English>yes</English>
                <Czech>ano</Czech>
                <French>oui</French>
                <German>ja</German>
                <Italian>sì</Italian>
                <Polish>tak</Polish>
                <Portuguese>sim</Portuguese>
                <Russian>да</Russian>
                <Spanish>sí</Spanish>
                <Korean>네</Korean>
                <Japanese>はい</Japanese>
                <Chinesesimp>是</Chinesesimp>
                <Chinese>是（繁體）</Chinese>
            </Key>
            <Key ID="STR_TAG_No">
                <Original>no</Original>
            </Key>
        </Container>
        <Container name="Another Container">
            <Key ID="STR_TAG_formatted">
                <Original>Hello, %1.</Original>
            </Key>
            <Key ID="STR_TAG_structuredText">
                <Original>Some text &lt;t color='%1'&gt;%2&lt;/t&gt;</Original>
            </Key>
        </Container>
    </Package>
</Project>
```

> [!NOTE]
> `Package` and `Container` "groups" are only helpful for organisation and have no impact on the translations; use them for your own sanity.

> [!IMPORTANT]
> [Stringtable.xml](../topics/Stringtable.xml.md) must be saved with **UTF-8 Encoding** for international characters to display and save correctly.

### Supported Languages

|  |  |
|---|---|
| **Arma 2 & Arma 2: Operation Arrowhead**<br>\| className \| In-game name \| Note \|<br>\|---\|---\|---\|<br>\| English \| **English** \|  \|<br>\| Czech \| **Čeština** \|  \|<br>\| French \| **Français** \|  \|<br>\| Spanish \| **Español** \|  \|<br>\| Italian \| **Italiano** \|  \|<br>\| Polish \| **Polski** \|  \|<br>\| Russian \| **Русский** \|  \|<br>\| German \| **Deutsch** \|  \|<br>\| Hungarian \| **Magyar** \| Partially supported \|<br>\| Portuguese \| **Portuguese** \| Not available in-game \| | **Arma 3**<br>\| className \| In-game name \| Note \|<br>\|---\|---\|---\|<br>\| English \| **English** \|  \|<br>\| Czech \| **Čeština** \|  \|<br>\| French \| **Français** \|  \|<br>\| Spanish \| **Español** \|  \|<br>\| Italian \| **Italiano** \|  \|<br>\| Polish \| **Polski** \|  \|<br>\| Portuguese \| **Português do Brasil** \|  \|<br>\| Russian \| **Русский** \|  \|<br>\| German \| **Deutsch** \|  \|<br>\| Korean \| **한국어** \|  \|<br>\| Japanese \| **日本語** \|  \|<br>\| Chinese \| **繁體中文** \| Chinese Traditional \|<br>\| Chinesesimp \| **简体中文** \| Chinese Simplified \|<br>\| Turkish \| **Türkçe** \|  \|<br>\| Slovak \| **Slovinčina** \| Translated by AI \|<br>\| Arma 3 v2.18 Ukrainian \| **українська** \| Translated by AI \|<br>\| Arma 3 v2.22 Latin \| **Latina** \| Translated by AI \|<br>\| Arma 3 v2.22 Bulgarian \| **български** \| Translated by AI \|<br>\| Hungarian \| **Magyar** \| Translated by AI \|<br>\| Swedish \| Cannot be set in-game.<br>Edit **arma3.cfg** to use that language. \|  \|<br>\| SerboCroatian \| Cannot be set in-game.<br>Edit **arma3.cfg** to use that language. \| N/A \|<br>\| Norwegian \| Cannot be set in-game.<br>Edit **arma3.cfg** to use that language. \| N/A \|<br>\| Icelandic \| Cannot be set in-game.<br>Edit **arma3.cfg** to use that language. \| N/A \|<br>\| Greek \| Cannot be set in-game.<br>Edit **arma3.cfg** to use that language. \| N/A \|<br>\| Finnish \| Cannot be set in-game.<br>Edit **arma3.cfg** to use that language. \| N/A \|<br>\| Dutch \| Cannot be set in-game.<br>Edit **arma3.cfg** to use that language. \| N/A \| |

#### CfgLanguages

Languages defined in **CfgLanguages** will show up in the languages combo box in the game options menu. However, only languages that are supported by the engine, see [Supported Languages](../topics/Stringtable.xml.md#supported-languages) can be added. By default, vanilla Arma 3 has only added the languages that are actually used by the base game.

```cpp
// Languages defined in Arma 3 2.20
class CfgLanguages
{
    class Original        { name = "Original";                    };
    class English        { name = "$STR_LANG_ENGLISH";            };
    class French        { name = "$STR_LANG_FRENCH";            };
    class Spanish        { name = "$STR_LANG_SPANISH";            };
    class Italian        { name = "$STR_LANG_ITALIAN";            };
    class German        { name = "$STR_LANG_GERMAN";            };
    class Czech            { name = "$STR_LANG_CZECH";                };
    class Polish        { name = "$STR_LANG_POLISH";            };
    class Russian        { name = "$STR_LANG_RUSSIAN";            };
    class Portuguese    { name = "$STR_LANG_PORTUGUESE";        };
    class Korean        { name = "$STR_LANGUAGE_KOREAN";        };
    class Japanese        { name = "$STR_LANGUAGE_JAPANESE";        };
    class Chinese        { name = "$STR_LANGUAGE_CHINESETRAD";    };
    class Chinesesimp    { name = "$STR_LANGUAGE_CHINESESIMP";    };
    class Turkish        { name = "$STR_LANG_TURKISH";            };
};
```

##### Custom Language

A new language can be added by a *hack*. One can reuse a supported but not used language to add a custom language.

```cpp
class CfgLanguages
{
    class Dutch
    {
        name = "Arabic";
    };
};
```

The *Dutch* language will now show up in the game options menu as *Arabic*. Now one can fill that with an arabic translation via *stringtable.xml*

```xml
<Key ID="STR_ENH_MAIN_ZEUSADDONS_INVERT">
    <Dutch>My Arabic Translation</Dutch>
</Key>
```

> [!IMPORTANT]
> Be aware that this will break other mods if these actually implemented the language that is being overwritten!

#### Unsupported language English in stringtable

See [Common Errors and Warnings](../topics/Crash_Files.md#common-errors-and-warnings).

### Key Naming Convention

Same as [global variables](../topics/Identifier.md#recommendations), it is recommended to use a **TAG** to prevent translation collision between mods (e.g `STR_TAG_helloThere`).

### String Formats

Strings stored in the stringtable can be in the following formats:

- Normal text, such as `Hello there`
- [format](../commands/format.md) text, such as `Hello %1`
- [Structured Text](../topics/Structured_Text.md), such as `<t size='2'>Hello</t> there`, **but**:

  > [!IMPORTANT]
  > The HTML tag characters `<` and `>` must respectively be encoded as `&lt;` and `&gt;`.

  `<t size='2'>Hello</t> there` would then become `&lt;t size='2'&gt;Hello&lt;/t&gt; there`.

### Usage

#### Script

A translation can be retrieved and used in a script by using the [localize](../commands/localize.md) command:

```sqf
hint localize "STR_TAG_Yes"; // returns "Yes" in English, "Oui" in French, etc.
hint format [localize "STR_TAG_formatted", name player];
hint localize "str_TAG_structuredText"; // casing in scripting does not matter
```

#### Config

Whether it is in [Description.ext](../topics/Description.ext.md), [Campaign Description.ext](../topics/Campaign_Description.ext.md), Dialogs etc., a translated [Config](../topics/Config.md) entry **must** use the `$` prefix (to an **uppercase** `STR`) for the engine to look the translation key up:

```cpp
onLoadName = "$STR_TAG_missionName";
overviewText = "$str_TAG_overviewText";        // invalid, will display "$str_TAG_overviewText" (with the $ sign)
onLoadMission = $STR_TAG_loadMissionText;    // works without quotes but this is NOT recommended
```

The preprocessor will replace `$STR` entries with their corresponding Stringtable value.

##### Translated Sounds

The Stringtable can be used to use different voices depending on the user's language setting:

```cpp
class CfgRadio
{
    class TAG_V01
    {
        name = "$STR_TAG_V01_name";
        sound[] = { "$STR_TAG_V01_path", 1, 1 };
        title = "$STR_TAG_V01_subtitle";
    };
};
```

the Stringtable's entries looking like this:

```xml
<Key ID="STR_V01_name">
    <English>"Hello There" by OWK</English>
    <French>"Salut à tous" par OWK</French>
</Key>
<Key ID="STR_V01_path">
    <English>Sound\EN\v01.ogg</English>
    <French>Sound\FR\v01.ogg</French>
</Key>
<Key ID="STR_V01_subtitle">
    <English>Hello There!</English>
    <French>Salut à tous !</French>
</Key>
```

Then using it in-game:

```sqf
player sideRadio "TAG_V01";
```

#### Editor

In markers and other Eden Editor fields (e.g Mission Name), translation keys should be prefixed with `@`, without any quotes around - e.g `@STR_myMarkerName`. Casing does not matter here.

### Multiplayer

[Multiplayer Scripting](../topics/Multiplayer_Scripting.md) should consider that the translation implementation *should* ideally happen client-side; clients and server are likely to be configured in a different language, as a server-side call to [global effect](../topics/Multiplayer_Scripting.md#locality) text commands (such as [setMarkerText](../commands/setMarkerText.md)) would set the text in the server's language to everyone.

Example of client-side translation of a server message:

```sqf
// Server-side
if (isServer) then
{
    [nil, nil, rHINT, localize "STR_TAG_myMessage"] call RE;            // Arma 2 - server language
    [nil, nil, rSPAWN, { hint localize "STR_TAG_myMessage" }] call RE;    // Arma 2 - client language
    ["STR_TAG_myMessage"] remoteExecCall ["TAG_fnc_localHint"];            // Arma 3
};

// Client-side executed function
TAG_fnc_localHint = {
    if (hasInterface) then
    {
        // hintSilent parseText (localize _this);                // Arma 2
        hintSilent parseText (_this call BIS_fnc_localize);        // Arma 3
    };
};
```

### Commands & Functions

See also Command Group: Localization:

- Operation Flashpoint v1.00 [localize](../commands/localize.md)
- Arma 3 v0.50 [isLocalized](../commands/isLocalized.md)
- Arma 3 v1.00 [BIS_fnc_localize](../functions/BIS_fnc_localize.md)
- Arma 3 v2.02 [getTextRaw](../commands/getTextRaw.md)
- Arma 3 v2.04 [diag_localized](../commands/diag_localized.md)

<sub>Source: [BI Community Wiki — Stringtable.xml](https://community.bistudio.com/wiki/Stringtable.xml) (revision 378639).</sub>
