Zum Inhalt springen

Sprachen & Übersetzungen

Die Spiel-UI kann in 9 Sprachen laufen: en, pt, de, pl, tr, es, fr, it, ru. Nicht jeder String ist schon übersetzt, was fehlt, fällt auf Englisch zurück.

  • Die Wahl jedes Spielers wird pro Account gespeichert (bs_users.language, hinzugefügt durch Migration 030_user_language.sql) und im Spieler-State-Bag bs_lang veröffentlicht.
  • Eine leere Wahl heißt “dem Server-Standard folgen”. Der Standard kommt aus F1 Global.defaultLanguage, sonst aus der Convar bs_defaultLanguage, sonst en. Er steht in GlobalState.bs_defaultLang.
  • Spieler ändern ihn im Settings-Tab des Inventars. Das löst bs_core:setLanguage aus, und jede Resource aktualisiert sich live, ohne Reconnect.
  • exports.bs_core:GetLanguage(src) liefert dir die Sprache eines Spielers auf dem Server.

Resources mit einem locales/-Ordner bisher: 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.

Die Lua- und NUI-Funktionen stehen in der Locales-API.

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

Jede Datei gibt eine flache Tabelle zurück. {name} ist ein Platzhalter.

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

Kopiere en.lua nach pt.lua (und so weiter) und übersetze die Werte. Übersetze niemals die Schlüssel. Ein fehlender Schlüssel fällt auf Englisch zurück, dann auf den Schlüssel selbst, eine halb fertige Datei ist also in Ordnung.

-- 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) läuft auf dem Client, wenn sich die Sprache ändert, für Text, den du selbst gebaut hast.

Hat die Resource eine ui_page, schickt das Locale-Skript die zusammengeführte Tabelle an die Seite. Lade den gemeinsamen Helper vor dem Skript deiner Seite:

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

Dann markiere das HTML. Der englische Text im Markup ist der 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 nutze t('key', { name: 'x' }) und BSI18n.onChange(fn), um dynamischen Text neu zu rendern.

  • Halte Schlüssel stabil und gruppiert (ui., msg., err.). Wer einen Schlüssel ändert, macht alle Übersetzungen davon kaputt.
  • Schreib keinen Balance-Text mit festen Zahlen, nutze Platzhalter, damit die Zahl der Config folgt.