Translate your game's content strings into multiple locales.
Localization
The Localization editor turns your game into a multi-language product. It's a full pipeline: define locales, author translated strings in the editor, serve locale bundles from the game server, and translate at runtime in the client.
How It Works#
- Locales — define the languages your game supports (e.g.
en,es,fr), with a base/fallback locale. - Strings — content-facing text (UI labels, item/quest/NPC names and descriptions, and system messages) is collected as translatable keys.
- Authoring — the Localization page lets you fill in translations per locale, key by key, and see what's missing.
- Serving — the game server exposes locale bundles over HTTP; the client fetches the player's locale and swaps text at runtime.
What you can translate#
Everything below appears on the Localization page automatically — you never add these keys by hand. Filter the grid by the namespace column to work through one kind at a time.
| Namespace | What it covers | Key looks like |
|---|---|---|
| Items, Abilities, Status Effects | Name and description | <id>, <id>.desc |
| Quests | Name, description, each objective, and the accept / progress / complete lines | <id>, <id>.obj.<objective>, <id>.accept |
| NPCs | The NPC's name (its display name when set) | <id> |
| Dialogue | NPC greeting, every conversation page, every choice label and its locked reason, and a trainer's locked message | <npc>.greeting, <npc>.<node>.<page>, <npc>.<node>.choice.<choice>, <npc>.trainer.locked |
| Event Text | Show Text (text and speaker name), Show Choices, Scrolling Text, System Message and Notification commands — in map events and common events | <map>.<event>.<command>, common.<common event>.<command> |
| Mobs, Recipes, Skills, Achievements, Factions | Name and description | <id>, <id>.desc |
| Maps | Map name | <id> |
| Server Messages | Every message the engine sends ("Inventory full!", "You are too far away") | <system>.<message> |
| UI | Words the client draws itself: floating combat text (IMMUNE, WEAK!, MISS, …), reward popups, the boss bar, party and raid frames, trackers, ability tooltips, the map legend, the arena scoreboard and results, and labels drawn on the map | float.miss, boss.phase |
| Vocabulary | Your renamed game terms | <term> |
Where each one shows in game#
- Event text, NPC conversations and server messages are translated by the server for each player, so two players in different languages standing side by side each read their own.
- Achievement, skill, faction and recipe names are translated in the messages about them (unlocks, level-ups, bounties) and in their panels.
- Mob and NPC names above heads, and item, ability, recipe, skill and status names in lists and tooltips, switch as soon as the player picks a language.
HUD text#
Everything the game client draws for itself is in the UI namespace: panels and windows (inventory,
shop, market, social, guild, quests, crafting, settings), dialogs and confirmations, right-click menus,
hover tooltips, the connection and loading screens, chat notices ("Harvested …", "Entered …"),
invites, floating combat text and reward popups. Every row has an English default, so a row with no
translation still reads correctly. Rows are grouped by the screen they belong to — the part after
ui. names it (shop.buy, social.remove_friend, connection.lost, msg.entered_zone).
Some rows contain placeholders in braces — keep them in your translation, in whatever order your language needs:
| Key | English | Placeholders |
|---|---|---|
float.guard | Guard {amount} | {amount} — damage blocked |
boss.phase | Phase {index} / {count} | the current phase and the total |
boss.enraged | ENRAGED ×{stacks} | enrage stacks |
arena.placed | You placed #{place} of {total} | the player's place and the field size |
world.coin_pile | {amount} silver | the coins in a dropped pile |
graphics.restoring | Graphics reset, restoring… | — |
invite.party | {name} invited you to join their party. | the player who invited you |
msg.entered_zone | Entered {zone} | the map's name |
loading.map | Loading map… ({have}/{needed}) | map pieces loaded / needed |
settings.playing_as | Playing as {name} | the character's name |
- Open Database → Localization and filter the namespace column to UI.
- Pick your language and type the translation next to each English line.
- Press Save, then Publish.
- Floating combat text changes the next time it is drawn. Numbers already on screen keep their
old words; the next hit uses the new language.
- A missing placeholder drops the number.
Phase {index}translated asPhaseshows "Phase"with no number.
- Words you named yourself are not in the UI namespace. Item, ability, NPC and zone names, shop
greetings, quest text and anything else you authored are translated in their own namespaces — the UI rows only cover the words around them (a UI row like
{name} sent you a friend request.keeps the name as the player typed it). - Control and setting names come from the engine's built-in lists. The names of key bindings
(Movement, Combat …) and of each setting in the Settings panel are not in the UI namespace yet; section headings and every message around them are.
Localization translates your game's text for players. To change the language of the editor itself, see Editor Language.
Changing the source language#
Your records (items, quests, dialogue) are written in one language, the Default (source) locale. To make another language the source — say you wrote everything in Spanish and now want English to be the main text — pick it in Default (source) locale. The page asks what you mean:
| Choice | What it does |
|---|---|
| Swap | Your records' current text is saved as the old language's translation, and your translations in the new language become the main text. Nothing any player reads changes. The Source column then shows the new language and you can edit it there. A row with no translation in the new language still shows the original text until you translate it. |
| Only rename | Changes the label and nothing else. Use it when your records are already written in the new language and the setting was simply wrong. |
| Cancel | Leaves everything as it was. |
The swap tells you how many texts it will copy before you confirm. Publish afterwards, as with any translation.
Setting up event text#
- Author the event as usual (Map Editor → Events, or Database → Common Events).
- Save the map. Open Database → Localization and filter to Event Text.
- A Show Text box is one row: translate all its lines together, one per line. You can use more or fewer lines than the original.
- Keep RPG Maker codes such as
\V[3]and\N[1]in the translation — they are filled in after translating.
Gotchas#
- Keys follow ids. Deleting and re-adding a command, a conversation node, or a choice gives it a new id, so its old translation no longer matches. Editing the text keeps the key. The import report lists translations whose key no longer exists.
- Copying an event to another map gives its text new keys (the map is part of the key).
- Blank pages are skipped. A conversation page's number counts only pages with text.
- Publish or Playtest to send new translations to a game server, as with any content change.
- A translation does not follow the original. Once a text is saved here for an item's name or description, players reading in that language see the saved text — editing the item afterwards changes only the original. The item editor tells you: open the item and a note under Description quotes what players see instead and which languages see it. Update the text under Translations, at the top of the item window.
- Text saved for the default language is shown to everyone. Every language falls back to the default language, so a text saved under it replaces the original for all players. This is what a Swap relies on, and it also happens when you import a file with rows for the default language. The grid shows such a row's saved text in the Source column, where you can edit it. In the item editor the note has a Remove the saved text button; publish afterwards and the item's own name and description show again.
Translating in a spreadsheet#
For more than a handful of strings, it's faster to translate a whole language in Excel, Google Sheets, or a translator's tool and bring it back in one go.
- Open Database → Localization and add the language under Locales if it isn't there yet.
- In the Translations grid, pick that language in the target-language dropdown (top right).
- Under Import / Export, click Export … template (CSV). You get one row for every string in your game, for that language.
- Fill in the value column. Use the source column to see what each string says. Leave rows you haven't translated yet blank.
- Save the file as CSV. Any spreadsheet's CSV works, including one that saves with semicolons.
- Back in Localization, click Open file…, choose the file, then click Import. You can also paste the text into the box.
- Read the import report under the box. The translations show in the grid right away.
The file's columns#
| Column | What it is |
|---|---|
| locale | The language code, e.g. pt-BR. It must be a language you've added, or the grid won't show those rows. |
| namespace | What kind of content the string belongs to (item, quest, npc, dialogue, zone, …). Don't change it. |
| key | Which exact string this is. Don't change it: it's how the import finds the string. |
| source | Your original text, for reference. The import ignores it. |
| value | Your translation. This is the only column you fill in. |
Gotchas#
- A blank cell never erases a translation. Importing a half-finished file, or the same template twice, only adds what's filled in. To remove a translation, clear its cell in the grid.
- Keys must stay exactly as exported. If a translation tool or a find-and-replace changes a key, that row can't match any string. The import report lists every key that matched nothing, so you can fix the file and import it again.
- A quote that never closes stops the import. If one cell opens a
"and never closes it, the import tells you which row it's on instead of reading the rest of the file as one cell. Fix that row and import again. - Accents look wrong in Excel? Open the file with Data → From Text/CSV and choose UTF-8. Exported files are already marked as UTF-8, and Open file… reads both UTF-8 and older Windows encodings.
- Export all (CSV / JSON) is a backup of every translation in every language, not a template. It only contains strings that already have a translation.
- Finding what's left. Tick Untranslated only above the grid to hide every string that already has a translation in the target language. The grid shows 500 rows at a time; click Show … more at the bottom for the rest.
Getting translations into the game#
Your languages, translations and Vocabulary terms travel to your game server the same way the rest of your content does:
- When you save, if the game server is running, the change is sent to it straight away. Players who are already in the game see it after they reload.
- When you Publish, every translation, language setting and Vocabulary term is sent, so a server that was stopped while you worked catches up. Translations you deleted are removed from the server too.
This works whether your game server shares the editor's database or has its own. That covers the desktop app's playtest server and a managed server.
If a publish warns that translations, language settings or vocabulary can't be received yet, your game server is on an older version. Nothing is lost: they arrive with the first publish after the server updates.
Vocabulary vs. Localization#
These are two different tools that pair well:
- Vocabulary customizes the engine's own terminology for your game — renaming "silver" to "credits", or "guild" to "clan" — within a single language.
- Localization translates your authored content into other languages.
Use Vocabulary to set your game's voice, then Localization to ship that voice in every language.
When an update rewords a built-in phrase#
Each Vocabulary entry shows the engine's default wording and, beside it, your override. The default is always the engine's current wording: when an update corrects or improves a built-in phrase, your game picks the new wording up on the next server start, with nothing to do on your side. Anything you typed as an override is yours and is never touched — an entry with an override keeps saying exactly what you wrote. Phrases you added yourself keep the default you gave them.