Developers

Translating

How translations of the launcher, the TRS Client, the website and these docs are organized, and how to improve a language or add one.

The launcher and the TRS Client speak eight languages. English is the source and the fallback: when a text is missing, the English one is shown.

LanguageLauncher and TRS ClientWebsite and docs
Englishcomplete (source)yes
Germancompleteyes
Spanishcompleteyes
French, Polish, Portuguese (Brazil), Turkish, Dutchbeta (machine-translated, not fully checked)no

The quickest help: check a beta language and fix what sounds wrong.

Launcher

Files: app/locales/<code>.json, for example app/locales/fr.json. The structure is nested, the source is en.json:

app/locales/en.json
{
  "logViewer": {
    "title": "Game log",
    "newLines": "{n} new line | {n} new lines",
    "empty": {
      "openLatest": "Open {name}"
    }
  }
}

Rules:

  • Keys stay exactly as in en.json. Don't add keys that English doesn't have.
  • Placeholders like {name} or {n} stay unchanged – translate the words around them.
  • Plural forms are separated by | in the order of your language: "one | other", Polish "one | few | many".
  • The characters {, }, @ and | have a meaning in vue-i18n. To show one as text, write it as {'@'}.
  • Error messages of the launcher core are under errors – each key is the code the core sends.

Check your work with the frontend tests:

pnpm test

tests/i18n.test.ts checks that every language has the right placeholders and plural forms, that no key is outdated and that the files parse. It fails if German or Spanish miss a key and prints how complete every beta language is.

TRS Client

Files: client-mod/common/src/main/resources/assets/trsclient/i18n/<code>.json. They are flat, one key per line, and are bundled into every jar:

en.json
{
  "bugreport.title": "Report a bug",
  "bugreport.attach.modsCount": "{0} mods"
}
  • Placeholders are numbered: {0}, {1} …
  • A missing key falls back to English, then to the key itself.
  • The names of the key bindings in Minecraft's own controls screen come from separate lang files. After changing a key.trsclient.* text, generate them again:
node client-mod/scripts/gen-lang.mjs

The tests run with the Gradle build of client-mod/ (./gradlew :common:test or ./gradlew build): I18nTest checks keys and placeholders, TextFitTest checks that names fit into the menu tiles and buttons in the default window size. For beta languages, too-long texts are only reported.

Website

The website is on the website branch and has English, German and Spanish. The texts are TypeScript files in api/:

  • app/utils/messages.ts – general texts of the website
  • app/utils/*-i18n.ts – texts of single areas (issues, blog, circuits, team, sign-in, admin)
  • shared/landing-en.ts, landing-de.ts, landing-es.ts – the landing pages
  • app/content/launcher-privacy.<code>.md – the privacy policy of the launcher

Docs

These docs are Markdown files in docs-site/content/en/, de/ and es/ on the website branch. Every page has the same file name in every language. English is the source.

Style

  • Short and clear. Say what the player gets, not how it works inside.
  • German uses "du", Spanish uses "tú".
  • Keep product names: TRS Launcher, TRS Client, TRS services.
  • For Minecraft terms, use the words of the official Minecraft translation in your language.

Add a new language

A new language touches several places, so please open an issue first. New languages start as beta. In short:

  • Launcher: a new file in app/locales/, plus the entries in app/utils/i18n.ts (supportedLocales, languageList with a flag in public/flags/, pluralForms and the zod locale) and in the Language list in src-tauri/crates/core/src/settings.rs.
  • TRS Client: a new file in the i18n folder, the lists LANGUAGES and BETA in core/i18n/I18n.java, and the Minecraft language codes in client-mod/scripts/gen-lang.mjs.
TRS Launcher – The Redstone Launcher by TheRedstonee

Not an official Minecraft product. Not approved by or associated with Mojang or Microsoft.

© 2026 TheRedstonee · GPL-3.0