Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
PELE
P.E.L.E adds native Ukrainian, Esperanto, and Latin support, JSON packs, hot reload, and full R2API.Language compatibility.
| Date uploaded | 4 days ago |
| Version | 1.0.1 |
| Download link | Jaosnake-PELE-1.0.1.zip |
| Downloads | 17 |
| Dependency string | Jaosnake-PELE-1.0.1 |
This mod requires the following mods to function
bbepis-BepInExPack
Unified BepInEx all-in-one modding pack - plugin framework, detour library
Preferred version: 5.4.2121README
P.E.L.E - Plugin for Enhanced Language Extension
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.
What P.E.L.E Adds
- Custom language registration for:
uk- Ukrainianeo- Esperantola- Latin
- P.E.L.E JSON translation packs loaded from
BepInEx/plugins/PELE/Language/<language>/*.json. - Translation priority for P.E.L.E tokens when the same token exists in another language pack.
- A main-menu language selector that can show custom languages.
- A pause-menu
Languagebutton with keyboard, mouse, and controller hints. - F5 hot reload for P.E.L.E JSON files and normal
.languagefiles. - Native Ukrainian/Cyrillic font support, without requiring
AnotherOneCyrillicFont. - Startup checks for missing folders, missing font data, and duplicate language DLLs.
Screenshots
Main menu language selector:

Pause-menu language dialog:

Character select in Esperanto:

Character select in Ukrainian:

Why Esperanto and Latin?
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.
Jaosnake Language Packs
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.
Important: This Replaces R2API.Language
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.
Dependencies
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.
Included Three-Language Mod Support
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)
How Translation Priority Works
When Risk of Rain 2 asks for a token, P.E.L.E resolves it in this order:
- Temporary overlay tokens.
- P.E.L.E custom-language tokens.
- The normal game or mod language system.
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.
Manual Installation
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.
Configuration
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.
Translation File Layout
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.
Building From Source
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.
Technical Documentation
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.
Questions and Support
For questions, suggestions, bug reports, or translation feedback, please open an issue on GitHub:
Jaosnake/ror2-multi-language-pack
☕ Support
CHANGELOG
Changelog
1.0.2 - README cleanup
- TOO MUCH STUFF IN README LOL GO TO WIKI.
1.0.1 - Package metadata update
- Updates the Thunderstore package description to clearly mention native Ukrainian, Esperanto, and Latin support.
- Keeps the internal BepInEx plugin version at
2.0.0so P.E.L.E continues replacingRiskofThunder-R2API_Languagesafely.
1.0.0 - P.E.L.E initial release
- Ships as a replacement for
RiskofThunder-R2API_Language'sR2API.Language.dll, not as a second side-by-side plugin. - Uses internal BepInEx plugin version
2.0.0so the fork wins over upstreamR2API.Language 1.1.0during manual side-by-side r2modman tests. - Adds P.E.L.E JSON language loading from
BepInEx/plugins/PELE/Language/<lang>/*.json. - Gives P.E.L.E translations priority over normal mod/game language fallbacks when a token exists in P.E.L.E.
- Adds custom language support for Latin (
la), Esperanto (eo), and Ukrainian (uk). - Adds native Cyrillic font support for Ukrainian without requiring
AnotherOneCyrillicFont. - Adds a pause-menu
Languagebutton with controller/keyboard hints. - Adds F5 hot reload for
.languageand P.E.L.E JSON files. - Adds startup sanity checks for P.E.L.E folders, icons, language manifests, font bundle, and duplicate DLLs.
- Keeps the F6 debug window available behind
EnableDebugMenu=falseby default for release builds. - Keeps verbose hook/layout logs behind
EnableVerboseLogging=falseby default.