Salta ai contenuti

Lingue e traduzioni

L’UI del gioco può funzionare in 9 lingue: en, pt, de, pl, tr, es, fr, it, ru. Non tutte le stringhe sono ancora tradotte, ciò che manca ripiega sull’inglese.

  • La scelta di ogni giocatore è salvata per account (bs_users.language, aggiunto dalla migrazione 030_user_language.sql) e pubblicata nello state bag del giocatore bs_lang.
  • Una scelta vuota significa “segui il predefinito del server”. Il predefinito viene da F1 Global.defaultLanguage, altrimenti dalla convar bs_defaultLanguage, altrimenti en. Sta in GlobalState.bs_defaultLang.
  • I giocatori lo cambiano nella scheda Settings dell’inventario. Questo scatena bs_core:setLanguage e ogni resource si aggiorna in tempo reale, senza riconnettersi.
  • exports.bs_core:GetLanguage(src) ti dà la lingua di un giocatore sul server.

Resource con una cartella locales/ finora: 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.

Le funzioni Lua e NUI sono nell’API delle locale.

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

Ogni file restituisce una tabella piatta. {name} è un placeholder.

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

Copia en.lua in pt.lua (e così via) e traduci i valori. Non tradurre mai le chiavi. Una chiave mancante ripiega sull’inglese, poi sulla chiave stessa, quindi un file a metà va bene.

-- 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) gira sul client quando la lingua cambia, per il testo che hai costruito tu.

Se la resource ha una ui_page, lo script di locale manda la tabella unita alla pagina. Carica l’helper condiviso prima dello script della tua pagina:

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

Poi marca l’HTML. Il testo inglese nel markup è il fallback:

<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">

In JS usa t('key', { name: 'x' }) e BSI18n.onChange(fn) per ridisegnare il testo dinamico.

  • Tieni le chiavi stabili e raggruppate (ui., msg., err.). Cambiare una chiave rompe tutte le sue traduzioni.
  • Non mettere testo di bilanciamento con numeri fissi, usa i placeholder così il numero segue la config.