How to Translate the Game

The game is in English, but it supports community translations. If you want to play in your own language — or share a translation with others — this page explains everything you need to know. No programming knowledge required.

Getting Started

Translations are managed directly through the game server. Do not manually create files in your lang/ folder, as the server will overwrite them. To contribute a translation, follow these steps in-game:

  1. Open the Game Menu and select Language.
  2. Choose Create Language and enter the name of your language (e.g., french). Use only letters, numbers, the minus sign and the underscore, for example pt-br or arabic_2: no spaces, brackets, colons or slashes. A name with square brackets used to break the menus, so the language could not be opened; such names are now refused, and older languages with brackets in their name open normally again.
  3. Once created, go to Manage Languages, select your language, and choose Update Data (Paste).
  4. Prepare your translation in a text editor (like Notepad++), copy the entire text, and paste it into the game's input box.

The server will automatically save your work and send the .lng file to any player who switches to your language.

Preparing your translation in a local text editor is recommended so you don't lose work. When you are ready, simply use the "Update Data" feature to sync it with the server.

Basic Format

Each line in the file is one translation entry. The format is:

English text [=] Your translation

The left side is the original English text, exactly as it appears in the game. The right side is your translation. The [=] separator must have a space on each side.

Here are some simple examples:

You are hungry. [=] Acıktınız.
Connected to server. [=] Sunucuya bağlandı.
Game over. [=] Oyun bitti.
Inventory [=] Envanter
Settings [=] Ayarlar

The lookup is case-insensitive, so "hello", "Hello" and "HELLO" all match the same entry. You only need to write it once.

Parameters (%1, %2 ...)

Many game messages contain values that change at runtime — a player's name, a number, an item name. These are marked with %1, %2, up to %9.

When you translate a line that has parameters, keep the same %1, %2 markers in your translation. You can change their order if your language needs it — that is perfectly fine.

English (original)Turkish translation
You have %1 health.%1 canınız var.
You found %1 coins.%1 altın buldunuz.
%1 has joined the game.%1 oyuna katıldı.
Round %1 of %2.%2 turdan %1. tur.
You dealt %1 damage to %2.%2 adlı düşmana %1 hasar verdiniz.

Notice how in "Round %1 of %2" the Turkish translation swapped the order to "%2 turdan %1. tur" — that is completely allowed.

In the file it looks like this:

You have %1 health. [=] %1 canınız var.
Round %1 of %2. [=] %2 turdan %1. tur.
You dealt %1 damage to %2. [=] %2 adlı düşmana %1 hasar verdiniz.
Never remove a %1 or %2 from your translation. The game will insert the real value in its place at runtime. If you drop it, the player will not see that value.

Translated Parameters (%t1, %t2 ...)

Some entries use %t1, %t2 instead of plain %1. The "t" stands for translate.

It works exactly like a regular parameter, with one difference: the game will also look up that value in your translation file before inserting it. So if the value is a word you already translated (like a direction or a status), it gets translated automatically — you do not have to handle it separately.

The %t marker only goes on the left (English) side. On the right (translated) side, always write plain %1, %2, etc.

Example — the game has these entries:

; Single word entries
north [=] kuzey
south [=] güney
open  [=] açık
locked [=] kilitli

; Template entries that use those words
You are moving %t1. [=] %1 yönüne ilerliyorsunuz.
The door is %t1. [=] Kapı %1.
%t1 Button [=] %1 Düğmesi

At runtime:

Game sendsPlayer hears
You are moving north.kuzey yönüne ilerliyorsunuz.
The door is locked.Kapı kilitli.
Settings ButtonAyarlar Düğmesi (if "Settings [=] Ayarlar" exists)
If the %t value is not in your translation file, it stays in English. No error is thrown — the untranslated word just passes through as-is.

Comments

Lines starting with ; are comments. They are ignored by the game. Use them to organize your file into sections so it is easier to maintain.

; -----------------------------------------------
; COMBAT MESSAGES
; -----------------------------------------------
You hit the enemy. [=] Düşmana vurdunuz.
The enemy missed. [=] Düşman ıskaladı.

; -----------------------------------------------
; STATUS MESSAGES
; -----------------------------------------------
You are hungry. [=] Acıktınız.
You are thirsty. [=] Susadınız.

Full Example — Turkish

; -----------------------------------------------
; SINGLE WORDS
; -----------------------------------------------
yes [=] evet
no [=] hayır
ok [=] tamam
cancel [=] iptal
north [=] kuzey
south [=] güney
east [=] doğu
west [=] batı
open [=] açık
closed [=] kapalı
locked [=] kilitli

; -----------------------------------------------
; MENU AND UI
; -----------------------------------------------
Settings [=] Ayarlar
Inventory [=] Envanter
Save [=] Kaydet
Load [=] Yükle
Quit [=] Çıkış

; -----------------------------------------------
; FIXED SENTENCES
; -----------------------------------------------
You are hungry. [=] Acıktınız.
You are thirsty. [=] Susadınız.
Connection lost. [=] Bağlantı kesildi.
Game saved. [=] Oyun kaydedildi.

; -----------------------------------------------
; MESSAGES WITH VALUES (%1, %2)
; -----------------------------------------------
You have %1 health. [=] %1 canınız var.
You found %1 coins. [=] %1 altın buldunuz.
%1 has joined the game. [=] %1 oyuna katıldı.
%1 has left the game. [=] %1 oyundan ayrıldı.
Round %1 of %2. [=] %2 turdan %1. tur.
You dealt %1 damage to %2. [=] %2 adlı düşmana %1 hasar verdiniz.
%1 says: %2 [=] %1 şunu söylüyor: %2

; -----------------------------------------------
; MESSAGES WITH TRANSLATED VALUES (%t1, %t2)
; -----------------------------------------------
You are moving %t1. [=] %1 yönüne ilerliyorsunuz.
The door is %t1. [=] Kapı %1.
The door to the %t1 is %t2. [=] %1 kapısı %2.
%t1 Button [=] %1 Düğmesi
Pick up %t1? [=] %1 alınsın mı?

Full Example — Spanish

; -----------------------------------------------
; SINGLE WORDS
; -----------------------------------------------
yes [=] sí
no [=] no
ok [=] aceptar
cancel [=] cancelar
north [=] norte
south [=] sur
east [=] este
west [=] oeste
open [=] abierta
closed [=] cerrada
locked [=] bloqueada

; -----------------------------------------------
; MENU AND UI
; -----------------------------------------------
Settings [=] Configuración
Inventory [=] Inventario
Save [=] Guardar
Load [=] Cargar
Quit [=] Salir

; -----------------------------------------------
; FIXED SENTENCES
; -----------------------------------------------
You are hungry. [=] Tienes hambre.
You are thirsty. [=] Tienes sed.
Connection lost. [=] Conexión perdida.
Game saved. [=] Partida guardada.

; -----------------------------------------------
; MESSAGES WITH VALUES (%1, %2)
; -----------------------------------------------
You have %1 health. [=] Tienes %1 puntos de vida.
You found %1 coins. [=] Encontraste %1 monedas.
%1 has joined the game. [=] %1 se unió al juego.
%1 has left the game. [=] %1 abandonó el juego.
Round %1 of %2. [=] Ronda %1 de %2.
You dealt %1 damage to %2. [=] Causaste %1 de daño a %2.
%1 says: %2 [=] %1 dice: %2

; -----------------------------------------------
; MESSAGES WITH TRANSLATED VALUES (%t1, %t2)
; -----------------------------------------------
You are moving %t1. [=] Te estás moviendo hacia el %1.
The door is %t1. [=] La puerta está %1.
The door to the %t1 is %t2. [=] La puerta del %1 está %2.
%t1 Button [=] Botón %1
Pick up %t1? [=] ¿Recoger %1?

Tips and Common Mistakes

Always keep %1, %2 in your translation

If the English line has %1, your translation must have it too. The game replaces it with a real value at runtime. Dropping it means the player will not see that number or name.

%t on the left side only

In the key (left side) you write %t1. In your translation (right side) you always write plain %1. Writing %t1 on the right side does nothing extra.

WrongCorrect
You are moving %t1. [=] %t1 yönüne ilerliyorsunuz.You are moving %t1. [=] %1 yönüne ilerliyorsunuz.

For %tN to work, translate the word too

If the key says %t1 Button, the game will try to translate the word that ends up in %t1. If you have not added that word to your file, it stays in English. So for "Settings Button" to become "Ayarlar Düğmesi", you need both entries:

Settings [=] Ayarlar
%t1 Button [=] %1 Düğmesi

You do not have to translate everything

Any line that is not in your file simply stays in English. You can start with the most important messages and add more over time.

Use ; to leave notes for yourself

The ; character at the start of a line makes it a comment. Great for labeling sections or leaving notes about tricky translations.

Watch your encoding

When preparing your text in an external editor, ensure it is saved as UTF-8. This ensures that special characters (ş, ğ, ñ, etc.) are correctly preserved when you paste them into the game's "Update Data" server box.

Note: The old substr-based translation system is deprecated and the new system is advised to be used. The other system can cause partly translations if you do not update your olde translations to align with the new system.

Find the sentences that use variables (new, 13.09.2026)

Open Language, Manage Languages, pick your language and choose Translate a sentence with variables. The game lists the sentences that contain a changing part and that your language has not translated yet, a hundred at a time. Choose one, type only your translation and keep the %1, %2 markers in it; the server writes the whole line for you. How variables work in the same menu reads out a short guide.

Two safer markers: %n1 and %w1

On the English side only you may write %n1 to say that this part is always a number, or %w1 to say that it is always a single word, such as a player name or an item id. They keep a short line from swallowing a whole long sentence by mistake. On your own side always write the plain form, %1.

The server now checks your line

A line is refused, with the reason spoken to you, when it could never work: a line whose English side is only variables with no fixed words (it would match every sentence in the game and silently stop the rest of your file from working), the same %1 used twice on the English side, %t1 written on the translation side, or a %2 in your translation that does not exist on the English side. If your translation simply leaves out a variable that the English line has, the line is saved and you are told which one is missing, because that part of the sentence will not be spoken.

The ready made template (new, 13.09.2026)

Language, Manage Languages, your language, Get a ready made template to fill in. This is every English sentence the game can say, about nine and a half thousand lines: the text in the client and server code, plus the text that lives in data, which is map zone names, travel messages, item names and descriptions, crafting messages and bag categories.

The copy is taken raw, so nothing is translated on the way to your clipboard. On an older game version the copy is still passed through your own language; the game warns you, and if you paste back an English side that does not exist in the game, the merge tells you how many lines that was.

How a line with variables is matched, and how players are protected (new, 22.09.2026)

This part answers a report from an Arabic translator: broad lines such as %1 on %2, %3%4, you are a %1 or %1 star%2 were turning unrelated sentences into half Arabic, half English.

The rules the game uses

These rules are in the next version of the game. The protection below already works for everybody.

Protection for players

When your language file is sent to players, the server checks every line with variables against the game's own list of sentences. If a game sentence has no line of its own in your file and the only line that fits it would translate it only half, the server adds, for players only, a line that keeps that sentence in plain English. Your own file is never changed. Check my language file tells you how many sentences are protected and names a few of them: give such a sentence its own line and it is translated from then on.

Notes in the ready made template

Above each line with variables, the template now has notes starting with a semicolon, for example:

; %1 is a direction, write %t1 on the English side
; %2 is an optional extra part of the sentence, often empty
; %3 is a number, write %n3 on the English side
; Example: The needle points north.  is 5 squares away.
; Used in server/includes/voyage_tokens.nvgt line 809
The needle points %1. %2 is %3 squares away. [=]

The game ignores lines that start with a semicolon, and PASTE a filled in template skips them. Follow the hint: a direction, an item, an animal or a place is written %t1 on the English side so that it is translated too (otherwise you hear "north" in English); a number is %n1; a player name is %w1. Internal ids of the game (for example d_xp or f|%1|w) are no longer in the template or in the list of sentences with variables.

Update Data (Paste) now asks before it deletes

Update Data still replaces your whole file. But if what you paste would remove more than a tenth of your translations, or more than 200 of them, nothing is saved yet: you hear how many translations would be lost and choose Merge (recommended: everything you pasted is taken and the lines you did not paste are kept), Replace anyway, or Cancel. A backup is taken before every change, as before.