You are viewing a potentially older version of this package. View all versions.
Jaosnake-PELE-1.0.1 icon

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-5.4.2121 icon
bbepis-BepInExPack

Unified BepInEx all-in-one modding pack - plugin framework, detour library

Preferred version: 5.4.2121
RiskofThunder-HookGenPatcher-1.2.9 icon
RiskofThunder-HookGenPatcher

MMHOOK generation at runtime.

Preferred version: 1.2.9
RiskofThunder-R2API_Core-5.3.0 icon
RiskofThunder-R2API_Core

Core R2API module

Preferred version: 5.3.0

README

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 - Ukrainian
    • eo - Esperanto
    • la - 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 Language button with keyboard, mouse, and controller hints.
  • F5 hot reload for P.E.L.E JSON files and normal .language files.
  • 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:

P.E.L.E main menu language selector

Pause-menu language dialog:

P.E.L.E pause language dialog

Character select in Esperanto:

P.E.L.E character select in Esperanto

Character select in Ukrainian:

P.E.L.E 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)
Mod Thunderstore package
Alloyed Armorer TatertotticusSquad / Alloyed_Armorer
Arsonist PopcornFactory / Arsonist_Mod
Assassin HasteReapr / AssassinMod
Banshee tsuyoikenko / Banshee
Bastian TeamSillyGuy / Bastian
Belmont rob / Belmont
Chaos Angeloid DragonycksModdingComms / Chaos
Cloudburst TeamCloudburst / Cloudburst
Dancer nayDPz / Dancer
Dante rob / Dante
Deputy Bog / Deputy
Driver public_ParticleSystem / Driver
Enforcer EnforcerGang / Enforcer
HAND OVERCLOCKED EnforcerGang / HAND_OVERCLOCKED
HEL P rob / HEL_P
Henry TheTimesweeper / HenryMod
Heretic Moffein / Heretic
HUNK rob / HUNK
Interrogator tsuyoikenko / Interrogator
Lee Hyperreal PopcornFactory / Lee_Hyperreal
Miner Unearthed EnforcerGang / MinerUnearthed
Mortician Bog / Mortician
Myst JavAngle / Myst
Paladin Paladin_Alliance / PaladinMod
Pathfinder Bog / Pathfinder
Pilot EnforcerGang / Pilot
Ravager public_ParticleSystem / Ravager
Red Alert TheTimesweeper / Red_Alert
Rifter toastyTeam / Rifter
RiskyTweaks Risky_Lives / RiskyTweaks
Rocket EnforcerGang / Rocket
Sandswept SandsweptTeam / Sandswept
Seamstress tsuyoikenko / Seamstress
Sniper Classic EnforcerGang / SniperClassic
Sorceress Frosthex / SorceressMod
Spearman SaucySquash / Spearman
Starstorm 2 TeamMoonstorm / Starstorm2
Wanderer tsuyoikenko / Wanderer

How Translation Priority Works

When Risk of Rain 2 asks for a token, P.E.L.E resolves it in this order:

  1. Temporary overlay tokens.
  2. P.E.L.E custom-language tokens.
  3. 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

ko-fi

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.0 so P.E.L.E continues replacing RiskofThunder-R2API_Language safely.

1.0.0 - P.E.L.E initial release

  • Ships as a replacement for RiskofThunder-R2API_Language's R2API.Language.dll, not as a second side-by-side plugin.
  • Uses internal BepInEx plugin version 2.0.0 so the fork wins over upstream R2API.Language 1.1.0 during 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 Language button with controller/keyboard hints.
  • Adds F5 hot reload for .language and 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=false by default for release builds.
  • Keeps verbose hook/layout logs behind EnableVerboseLogging=false by default.