Aller au contenu

Langues et traductions

L’UI du jeu peut tourner en 9 langues : en, pt, de, pl, tr, es, fr, it, ru. Toutes les chaînes ne sont pas encore traduites, ce qui manque retombe sur l’anglais.

  • Le choix de chaque joueur est enregistré par compte (bs_users.language, ajouté par la migration 030_user_language.sql) et publié dans le state bag du joueur bs_lang.
  • Un choix vide veut dire « suivre le défaut du serveur ». Le défaut vient de F1 Global.defaultLanguage, sinon de la convar bs_defaultLanguage, sinon en. Il est dans GlobalState.bs_defaultLang.
  • Les joueurs le changent dans l’onglet Settings de l’inventaire. Ça déclenche bs_core:setLanguage, et chaque resource se met à jour en direct, sans reconnexion.
  • exports.bs_core:GetLanguage(src) te donne la langue d’un joueur côté serveur.

Resources avec un dossier locales/ jusqu’ici : bs_admin, bs_bodily, bs_boosters, bs_building, bs_chat, bs_cinecam, bs_core, bs_crafting, bs_drugs, bs_economy, bs_emotes, bs_events, bs_extraction, bs_faction_bases, bs_factions, bs_gadgets, bs_gates, bs_interactions, bs_inventory, bs_jobs, bs_medical, bs_menu, bs_mining, bs_multichar, bs_radial, bs_recycler, bs_scenes, bs_scoreboard, bs_skills, bs_stash, bs_tester, bs_traders, bs_ui, bs_vehicles, bs_vip, bs_weapons, bs_zombies.

Les fonctions Lua et NUI sont dans l’API des locales.

shared_script '@bs_core/shared/sh_locale.lua'
files { 'locales/*.lua' }

Chaque fichier renvoie une table plate. {name} est un placeholder.

-- locales/en.lua
return {
['ui.level'] = 'LEVEL',
['msg.picked_up'] = 'You picked up {item}.',
}

Copie en.lua vers pt.lua (et ainsi de suite) et traduis les valeurs. Ne traduis jamais les clés. Une clé manquante retombe sur l’anglais, puis sur la clé elle-même, donc un fichier à moitié fini convient.

-- client: the local player's language
local s = L('msg.picked_up', { item = 'Bandage' })
-- server: L(src, key, vars) or Lp(src, key, vars) uses that player's language
TriggerClientEvent('chat:addMessage', src, { args = { L(src, 'msg.picked_up', { item = 'Bandage' }) } })
-- server without a source: the server default
print(L('msg.picked_up', { item = 'Bandage' }))

BSLocale.OnChange(function(lang) ... end) s’exécute côté client quand la langue change, pour le texte que tu as construit toi-même.

Si la resource a une ui_page, le script de locales envoie la table fusionnée à la page. Charge le helper partagé avant le script de ta page :

<script src="nui://bs_ui/html/js/i18n.js"></script>

Ensuite balise le HTML. Le texte anglais dans le markup sert de repli :

<span data-i18n="ui.level">LEVEL</span>
<p data-i18n-html="ui.help_html">Press <b>E</b></p>
<input data-i18n-attr="placeholder:ui.search;title:ui.search_tip" placeholder="Search">

En JS, utilise t('key', { name: 'x' }) et BSI18n.onChange(fn) pour redessiner le texte dynamique.

  • Garde des clés stables et regroupées (ui., msg., err.). Changer une clé casse toutes ses traductions.
  • Ne mets pas de texte d’équilibrage avec des nombres en dur, utilise des placeholders pour que le nombre suive la config.