# A player's language

> Each player picks the language Keystone speaks to them, and a server writes its translation in the editor.

Source: https://stygion.eu/docs/keystone/languages
Updated: 2026-10-09

The jar ships English only. Another language is a file, `config/keystone/lang/<code>.properties`, that names itself with `language.name=` — and Keystone then **asks every player once** (a line to click) which language it should speak to them. `/language` changes it later.

## What each player sees

The choice is kept per player. Until somebody has chosen, their game's language is used where the server offers it, and `language.default` where it does not. A line a translation lacks reads in English. `language.offered` narrows which languages players may choose — `["cs"]` makes a server Czech only, and nobody is asked; `keystone.language.ask-on-join` turns the question at joining off.

## An owner's own text in more than one language

Anything an owner writes in a setting that a player reads — announcements, the kick, ban, full and maintenance screens, the tab list — may carry a part per language: `[en]The server is full. [cs]Server je plný.` Each player reads their part, then the server's `language.default`, then English. Text with no marker reads as it always did.

## Translating in the editor

The **Languages** screen lists every language the server has, how much of it is translated and which are offered. An opened language has every line beside the English, a filter for what is still untranslated, colours drawn the way the game draws them, and a placeholder the English does not have marked (saving refuses it). A new language starts from a code and a name; the `.properties` file can be exported and imported. Saving writes the file and players read it at once.

Only the owner writes translations: a link from `/keystone panel` given to an operator or the console. A moderator who reaches the panel through a group gets a link without `languages.write`.

## A player's words never look like the server's

Colour codes and language parts are read only in text the owner wrote: settings, language files, rank prefixes. Everything else — a name, a ban reason, a Discord message, a ticket, an assistant's answer — is printed exactly as written: no colour, no line break, no `[xx]`. Nothing in text can make a clickable component; only code builds those.
