# A player's language

> Each player picks the language Keystone speaks to them; a server writes its translation and the colours of every line in the editor.

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

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.

With [chat channels](/docs/keystone/chat-channels) per language (0.2.1), the language question is followed by a second line — *Chat: only your language / all languages* — and the language a player chose decides which channel they write in.

## The colours of every line (the theme, from 0.2.5)

Nothing the server says is plain white any more. Every reply, notice and broadcast is drawn in a **theme**: eight lines in the language file — `theme.text` (the body), `theme.dim`, `theme.accent`, `theme.value` (names and numbers), `theme.ok`, `theme.warn`, `theme.bad` and `theme.lead` (the arrow in front) — as `&` or `&#rrggbb` codes. Change them in the file or on the **Languages** screen and the voice of the whole server changes. The defaults are plain Minecraft colours.

A line with no colour of its own picks out its names, numbers and `/commands` by itself. A line you dress yourself uses the same colours through `{@accent}`, `{@value}`, `{@ok}` … and `{@base}` steps back to the line's own colour. The macros work in your own texts too (announcements, kick screens).

Lengths of time are written in the reader's language (`1 h 52 min`, the `time.*` lines), and a number with its noun comes from `.one` / `.few` / `.many` lines (`1 visit`, `3 návštěvy`, `5 návštěv`) — the rules of Czech, Slovak, Polish and Russian are built in. Numbers are written the reader's way (5,691 / 5 691).

> [!IMPORTANT]
> Lines arrive with new versions (0.2.5: 116 new and 14 restyled — `progress.*`, `votes.*`, `crates.*`, `tickets.*`, `kits.*`, `time.*`, `theme.*`, `ultimine.*`). Where you keep your own translation, add them; a missing line reads in English. An older jar does not know the `{@…}` macros and prints them as written — put a new language file in place together with the new jar.

## 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, theme macros 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 macro, no line break, no `[xx]`. Nothing in text can make a clickable component; only code builds those.
