All player-facing text lives in JSON locale files under /locales. The script ships with en.json.
Set the locale in cfg.lua:
cfg.locale = 'en' -- loads /locales/en.jsonThe value must match a file name in /locales (without the .json).
Copy locales/en.json to a new file, e.g. locales/fr.json.
Translate the values only — never change the keys.
Set cfg.locale = 'fr' and restart the resource.
{
"prompt": {
"open_laptop": "Ouvrir l'ordinateur",
"knock_door": "Frapper"
},
"notify": {
"no_permission": "Vous n'avez pas la permission pour cette action."
}
}Only edit the text on the right of each :. Changing or removing a key (the left side) will break the string and may error in-game.
Some strings contain placeholders that the script fills in at runtime. Keep them exactly as they are, in a spot that still reads naturally:
%s — a string (a name, an amount, an item label).
%d — a whole number.
%s%% — a number followed by a literal percent sign.
The same rule applies wherever a string lives — for example notify.van_seized and ui.orders.order_placed:
The locale file is organized by area so you can find strings quickly:
prompt
Interaction prompts ("Open Laptop", "Knock"…)
notify
Server notifications
progress
Progress-bar labels
command
Command help text
blip / dispatch
Map blips and police dispatch messages
activity
Vault/sales activity descriptions
editor
Placement-tool hints (drop / NPC vendor / warehouse editors)
ui.*
Every NUI panel: laptop tabs, orders, stock, pricing, vault, analytics, members, inbox, settings, van, sale, customer, phone app, door, admin, editor
The ui section is by far the largest — it holds all the in-panel text. Translate it last, once the gameplay strings (prompt, notify) are done, so you can test in-game as you go.
"van_seized": "Van seized. %d items destroyed.",
"order_placed": "Order placed — arriving in ~%s min."