Translating
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.
| Language | Launcher and TRS Client | Website and docs |
|---|---|---|
| English | complete (source) | yes |
| German | complete | yes |
| Spanish | complete | yes |
| French, Polish, Portuguese (Brazil), Turkish, Dutch | beta (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:
{
"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:
{
"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 websiteapp/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 pagesapp/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 inapp/utils/i18n.ts(supportedLocales,languageListwith a flag inpublic/flags/,pluralFormsand the zod locale) and in theLanguagelist insrc-tauri/crates/core/src/settings.rs. - TRS Client: a new file in the
i18nfolder, the listsLANGUAGESandBETAincore/i18n/I18n.java, and the Minecraft language codes inclient-mod/scripts/gen-lang.mjs.