✨ What's new in v1.1
Built-in i18n
Folio is now
bilingual out of the box — every demo message, nav button label, search title and empty-result fallback ships in English
and German. Language is picked per player from their MC client locale.
Code (Java):
// Programmatic override:
Messages.
setForcedLanguage
(
"de"
)
;
// force German for everyone
Messages.
setForcedLanguage
(
"auto"
)
;
// restore per-player behaviour
Drop-in language files
Add a new language without recompiling — just drop a YAML in
plugins/Folio/lang/:
- Copy lang/en.yml to lang/<code>.yml (e.g. lang/fr.yml for French)
- Translate the values (keep %s and %d placeholders intact)
- Restart the server
The console confirms:
Code (Text):
[Folio] Loaded language 'fr' (45 keys) from fr.yml
The bundled
en.yml and
de.yml are auto-extracted on first run — edit them to retext without ever touching the jar.
Region-aware lookup
Folio resolves a player's language as:
forced (config) → <lang>_<country> → <lang> → en
| de_DE |
de_de → de → en |
de.yml |
| de_AT "Deitsch (Österreich)" |
de_at → de → en |
de_at.yml if present, else de.yml |
| pt_BR |
pt_br → pt → en |
pt_br.yml if present, else en.yml |
| fr_CA |
fr_ca → fr → en |
fr.yml if present |
So a region-specific file (e.g. Bavarian/Austrian variant) always wins over the generic language file when the player's client matches that region. Missing keys fall through the chain — never crashes.
⚙️ config.yml
First start now writes
plugins/Folio/config.yml:
Code (YAML):
language
: auto
demo:
enabled
: true
disabled-subs
:
[
]
| language: auto |
Per-player from client locale (default) |
| language: en / de / <code> |
Force one language for everyone |
| demo.enabled: false |
Disable /foliodemo entirely — Folio still loads as a library |
| demo.disabled-subs: [persist, shared] |
Hide individual sub-demos |
Demo improvements
- /foliodemo shared now shows a live click counter on the Nether Star — stack size + name + lore update for all viewers in real time (binding-driven, 100 ms tick)
- Reset button (Barrier) added to the shared demo
- All demo strings flow through the i18n system — change them by editing the lang files
Fixes
- Fixed ArithmeticException: / by zero in SlotMap when a layout had 0 item-slots (e.g. 3-row bordered grid with reserved tail row)
- Search prompt now uses the proper Paper 1.21 MenuType.ANVIL API (the old openAnvil(loc, true) was opening a generic chest in 1.21.11 instead of an actual anvil)
- Repair-cost set to 0 on the search anvil so players don't need XP to confirm
- Demo anim/shared layouts now use GridLayout(true, 0) so they actually have item slots
Updating
Drop the new jar over the old one and restart — config + lang files are written automatically. Existing PDC-persisted page state is preserved. No API breaking changes; existing builder calls continue to work as-is.