P.E.L.E is a language expansion layer for Risk of Rain 2. It was created because the base game was never designed around community-made languages like Ukrainian, Esperanto, Latin, or any future custom language a translation team may want to add.
Risk of Rain 2 can load many official languages, and many mods already use
R2API.Language for normal .language files. The problem starts when a
language is not part of the game's original language list, needs extra glyphs,
needs a menu entry, or needs translations from many different mods to behave as
one coherent language pack. Ukrainian exposed that problem first: Cyrillic text
can work, but the game still needs help registering the language, showing it in
the UI, loading the right tokens, and refreshing everything without restarting.
P.E.L.E solves that by replacing the language module with a customized
R2API.Language fork that still supports existing mods, while adding a P.E.L.E
translation pipeline on top.
uk - Ukrainianeo - Esperantola - LatinBepInEx/plugins/PELE/Language/<language>/*.json.Language button with keyboard, mouse, and controller hints..language files.AnotherOneCyrillicFont.Main menu language selector:

Pause-menu language dialog:

Character select in Esperanto:

Character select in Ukrainian:

Ukrainian is the main practical target: it proves that P.E.L.E can support a language the base game does not handle cleanly by itself.
Esperanto and Latin are the first experimental custom languages shipped with P.E.L.E. They are useful test languages because they are not base-game languages, they force the language menu and loader to behave like a real extension system, and they give translators a repeatable way to test mod support beyond the official language list.
In this release, P.E.L.E ships the first three-language custom test set:
Ukrainian + Esperanto + Latin
The package includes every P.E.L.E translation file currently shipped in this repository, even for mods you do not have installed. Risk of Rain 2 only uses tokens when the matching game content or mod asks for them, so keeping all packs together is intentional: you can install a supported mod later and its P.E.L.E translations are already there.
P.E.L.E is designed to work alongside my existing Risk of Rain 2 translation packs. Those packs remain fully supported and are still recommended for the other languages they already cover.
You can find them here:
Jaosnake packages on Thunderstore
This P.E.L.E package does not replace, modify, or invalidate that work. Existing Jaosnake language packs can continue to receive their own updates independently, and future updates to those packages are not tied to this P.E.L.E release.
P.E.L.E is not a second language plugin to install next to the normal
R2API.Language.dll.
This package is meant to replace the DLL from:
RiskofThunder-R2API_Language
P.E.L.E intentionally keeps the original BepInEx plugin GUID:
com.bepis.r2api.language
That is required so mods that depend on R2API.Language keep working normally.
To BepInEx and to other mods, P.E.L.E is still the language API they expect; it
just has extra language support built in.
The Thunderstore package version follows normal Thunderstore releases, while the
internal BepInEx plugin version is 2.0.0. That is intentional: it ensures
P.E.L.E wins over the upstream RiskofThunder-R2API_Language 1.1.0 if both DLLs
are present during a manual r2modman test install.
Only one R2API.Language.dll must be loaded. The intended path is:
BepInEx/plugins/RiskofThunder-R2API_Language/R2API.Language/R2API.Language.dll
Do not install another copy in paths like:
BepInEx/plugins/R2API.Language.dll
BepInEx/plugins/PELE/R2API.Language.dll
BepInEx/plugins/SomeOtherFolder/R2API.Language.dll
If two DLLs with the same GUID are loaded, BepInEx may choose the wrong one, run duplicate hooks, or initialize language systems in the wrong order.
The PELE folder included with this package is data only:
BepInEx/plugins/PELE/
├─ Fonts/
└─ Language/
It must not contain an old PELE.dll, PELE.deps.json, or PELE.pdb.
Thunderstore installs these dependencies automatically:
bbepis-BepInExPack-5.4.2121
RiskofThunder-HookGenPatcher-1.2.9
RiskofThunder-R2API_Core-5.3.0
RiskofThunder-R2API_Language is not listed as a separate dependency because
P.E.L.E provides the replacement R2API.Language.dll itself. Installing another
copy of R2API.Language.dll side-by-side can cause duplicate plugin loading.
The mods below have P.E.L.E translation packs for all three custom languages in this release: Ukrainian, Esperanto, and Latin.
"Complete P.E.L.E support" here means this package includes matching P.E.L.E JSON
files for uk, eo, and la for that mod. It does not mean the original mod
author officially ships those languages.
This list was checked against the P.E.L.E language files in this GitHub repository, not against the mods currently installed in a local r2modman profile.
All mods listed below include P.E.L.E JSON support for:
Ukrainian (uk) | Esperanto (eo) | Latin (la)
When Risk of Rain 2 asks for a token, P.E.L.E resolves it in this order:
That means P.E.L.E wins when it has the same token. Existing mod translation packs remain useful as fallback data when P.E.L.E does not provide a token.
If you install manually, place files like this:
BepInEx/plugins/
├─ RiskofThunder-R2API_Language/
│ └─ R2API.Language/
│ └─ R2API.Language.dll
└─ PELE/
├─ Fonts/
└─ Language/
Then start the game and check BepInEx/LogOutput.log.
Expected log markers:
Loading [R2API.Language (Jaosnake fork) 2.0.0]
R2API.Language (Jaosnake fork) inicializado!
PELE/Language encontrado: ...
Tokens PELE por idioma: la=..., eo=..., uk=...
PELE/Fonts/cyrillicfont encontrado.
DLL R2API.Language unica detectada.
PELE JSONs carregados no startup (... tokens)
Hot-Reload habilitado! Pressione F5 para recarregar manualmente.
BepInEx generates the config file for this plugin. The release defaults are:
[PELE]
EnableHotReload = true
EnableDebugMenu = false
EnableVerboseLogging = false
EnableHotReload: enables F5 reload and file watcher reload.EnableDebugMenu: enables the F6 P.E.L.E debug window.EnableVerboseLogging: enables extra hook and layout diagnostic logs.P.E.L.E translations live outside the DLL:
BepInEx/plugins/PELE/Language/<language>/*.json
Supported JSON format:
{
"strings": {
"TOKEN_NAME": "Translated text"
}
}
Flat JSON token objects are also supported. Metadata keys such as language,
strings, and keys starting with _ are ignored as translation tokens.
Local build command:
dotnet build C:\Users\Jaosnake\Desktop\PELE_Project\github_repo_latest\R2API.Language-Source\R2API.Language.csproj -c Release
The project deploy target copies the generated DLL to the active r2modman
profile's RiskofThunder-R2API_Language folder. This is intentional and keeps
the runtime profile from loading duplicate R2API.Language.dll files.
Before changing hooks or UI behavior, read:
docs/HOOKS.md
docs/MANUAL_TESTS.md
docs/STABILIZATION_PLAN.md
These files document hook contracts, manual regression testing, and the stabilization rules for future P.E.L.E changes.
For questions, suggestions, bug reports, or translation feedback, please open an issue on GitHub:
Jaosnake/ror2-multi-language-pack