RedM Guidebook Languages
-- local/overrides.lua
RmGuidebook.Local = { language = 'de' }'en', 'de', 'es' and 'fr' ship. Default 'en'.
One setting covers both halves
What the server says in chat and what the overlay draws come out of the same file. Translating one file translates everything — there is no second interface locale to keep in sync.
Adding a language
Copy
locales/en.luato your language code —locales/pt.lua.Translate the right-hand side. Leave the keys alone.
Set
languageto match:luaRmGuidebook.Local = { language = 'pt' }
The manifest loads locales/*.lua as a glob, so a new file is picked up with no manifest edit. locales/ stays editable on both editions.
A missing key falls back to English rather than showing a raw key, so a half-finished translation is usable rather than broken.
A shipped language is complete by construction
tools/audit.py fails the build if any key is missing from any locale, so the four that ship have no gaps. That check is Open Source edition tooling — your own fifth language is on you.
What is not translated
Your pages. Chapters, entries and signposts are content you wrote, stored in the database. The resource has no idea what language they are in and does not touch them.
If you need a bilingual almanac, the usual approach is a chapter per language — rules-en, rules-de — rather than anything the resource does for you.
Server-side log lines and the Discord webhook embeds are English regardless of language. They are for you, not for players.
Encoding
The three tables are utf8mb4 with utf8mb4_unicode_ci collation, so accented characters and anything else store correctly.
If page text comes back as mojibake after a manual import, the file was read as latin-1. Re-import with the connection charset set explicitly:
mysql --default-character-set=utf8mb4 DBNAME -u DBUSER -p < yourfile.sqlFonts and non-Latin scripts
Four typefaces ship and are served from the resource: Crimson Pro, IM Fell English, Rye and Special Elite. They are period faces chosen to suit the setting, and their coverage is Latin.
A script they do not cover will fall back
Cyrillic, Greek, Arabic or CJK text will render in whatever the browser substitutes, which will not match the rest of the page.
overlay.fonts may name any font installed on the player's machine, so you can offer one with the coverage you need — but only the four shipped faces are certain to draw, because nothing is fetched from the internet at runtime.
Checking what took effect
RmGuidebook.Local = { debug = { enabled = true } }With traces on, the console prints every value your overrides changed at start-up — including the language — and complains by name about any key that is not a setting. That is the fastest way to find a typo.
If the text is still in the wrong language after that, the locale file is probably not named for the code you set. language = 'pt' looks for RmGuidebook.Phrases.pt, which locales/pt.lua has to declare.