L10n
| Version | No release yet, documented from main |
| Download | GitHub |
🛟 Need help or found a bug? Get support at support.doodesch.de/l10n.
One C# file that gives your MelonLoader mod proper translations - built-in language tables, player-editable JSON translation files, and automatic language detection. No DLL, no dependency, works on both the IL2CPP and Mono backends.
Schedule I itself has no language setting (it ships no localization system at all), so this fills the gap for mods: English by default, the OS language when a translation exists, and a single shared setting to force a language across every mod that uses it.
For players: translate a mod 🌍
Section titled “For players: translate a mod 🌍”You can translate any mod that uses ScheduleOne-L10n - or fix a translation you don’t like - without touching the mod itself:
- Start the game once with the mod installed.
- Open
UserData/DooDesch/Localization/<ModName>/in your game folder. You’ll find_template.en.jsonwith every text the mod can localize. - Copy it, rename the copy to your language code (
fr.json,es.json,pl.json, …) and translate the values - the keys are the mod’s original English lines and must stay unchanged. Keep placeholders like{0}in your translation. - Restart the game. Done.
Your file wins over the mod’s built-in translations, a few lines are enough (everything
else keeps its built-in text), and a file alone adds a whole new language. To force a
language regardless of your OS, set Language under [DooDesch] in
UserData/MelonPreferences.cfg (auto, en, de, fr, …).
Made a full translation? You can publish it as its own translation mod on
Thunderstore or Nexus - a code-less package shipping
Mods/Localization/<ModName>/<code>.json. Everyone who installs it gets your
translation automatically; their own files still win over yours if they edit lines.
The full step-by-step guides live in the wiki.
For modders: adopt it in three steps 🔧
Section titled “For modders: adopt it in three steps 🔧”ScheduleOne-L10n is a single-file library - copy L10n.cs into your project
(it compiles as internal, so it never collides with other mods doing the same).
-
Wrap your player-facing strings. The English literal is the key:
using DooDesch.Localization;entry.Title = L10n.T("Ask the motel manager about the RV");choice.Text = L10n.T("Pay ${0}", fee); // string.Format placeholders work -
Ship translations (optional - without any table your mod just stays English):
// in OnInitializeMelonL10n.Register("de", new Dictionary<string, string>{["Ask the motel manager about the RV"] = "Frag die Motel-Managerin nach dem Wohnmobil",["Pay ${0}"] = "{0} $ zahlen",}); -
That’s it. Missing keys and unknown languages fall back to the English literal, players get
_template.en.jsonexported automatically and can add their own languages, and the[DooDesch] Languagepreference is shared with every other L10n mod so players set it once.
Details, design notes and the adoption checklist are in the wiki.
How the language is picked
Section titled “How the language is picked”Languageunder[DooDesch]inMelonPreferences.cfg, unless it isauto.- Otherwise the OS language (
Application.systemLanguage), mapped to a two-letter code -de,fr,es,it,pt,pl,ru,tr,ja,ko,zh. - Everything else:
en.
The language is resolved once per session; changing it needs a game restart.
For the resolved language, translations merge per entry from three sources, later wins:
built-in tables < installed translation mods (Mods/Localization/...) < the player’s
own file (UserData/DooDesch/Localization/...).
Mods using it
Section titled “Mods using it”- RVRepairVan (English + German)
Using it in your own mod? Open an issue or ping me and I’ll add you to the list.
License
Section titled “License”MIT - use it, ship it, modify it. A link back is appreciated but not required.