Saltearse al contenido

Idiomas y traducciones

La UI del juego puede funcionar en 9 idiomas: en, pt, de, pl, tr, es, fr, it, ru. No todas las cadenas están traducidas todavía, lo que falte recurre al inglés.

  • La elección de cada jugador se guarda por cuenta (bs_users.language, añadido por la migración 030_user_language.sql) y se publica en el state bag del jugador bs_lang.
  • Una elección vacía significa “seguir el valor por defecto del servidor”. El valor por defecto sale de F1 Global.defaultLanguage, si no de la convar bs_defaultLanguage, si no en. Está en GlobalState.bs_defaultLang.
  • Los jugadores lo cambian en la pestaña Settings del inventario. Eso dispara bs_core:setLanguage y todos los resources se actualizan en vivo, sin reconectar.
  • exports.bs_core:GetLanguage(src) te da el idioma de un jugador en el servidor.

Resources con carpeta locales/ hasta ahora: 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.

Las funciones de Lua y NUI están en la API de locales.

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

Cada archivo devuelve una tabla plana. {name} es un placeholder.

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

Copia en.lua a pt.lua (y así sucesivamente) y traduce los valores. Nunca traduzcas las claves. Una clave que falta recurre al inglés y luego a la propia clave, así que un archivo a medias está bien.

-- 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) se ejecuta en el client cuando cambia el idioma, para el texto que hayas construido tú.

Si el resource tiene un ui_page, el script de locales envía la tabla combinada a la página. Carga el helper compartido antes del script de tu página:

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

Luego marca el HTML. El texto en inglés del markup es el 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">

En JS usa t('key', { name: 'x' }) y BSI18n.onChange(fn) para volver a dibujar el texto dinámico.

  • Mantén las claves estables y agrupadas (ui., msg., err.). Cambiar una clave rompe todas sus traducciones.
  • No pongas texto de balance con números fijos, usa placeholders para que el número siga a la config.