İçeriğe geç

Diller ve çeviriler

Oyun arayüzü 9 dilde çalışabilir: en, pt, de, pl, tr, es, fr, it, ru. Her metin henüz çevrilmedi, eksik olanlar İngilizceye düşer.

  • Her oyuncunun seçimi hesap başına kaydedilir (bs_users.language, 030_user_language.sql migrasyonuyla eklendi) ve oyuncunun bs_lang state bag’inde yayınlanır.
  • Boş seçim “sunucu varsayılanını izle” demektir. Varsayılan F1 Global.defaultLanguage’den, yoksa bs_defaultLanguage convar’ından, yoksa en’den gelir. GlobalState.bs_defaultLang üzerindedir.
  • Oyuncular bunu envanterin Settings sekmesinden değiştirir. Bu bs_core:setLanguagei tetikler ve her resource yeniden bağlanmadan canlı güncellenir.
  • exports.bs_core:GetLanguage(src) sunucuda bir oyuncunun dilini verir.

Şimdiye kadar locales/ klasörü olan resource’lar: 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.

Lua ve NUI fonksiyonları Locale API sayfasında.

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

Her dosya düz bir tablo döndürür. {name} bir placeholder’dır.

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

en.luayı pt.luaya (ve diğerlerine) kopyala ve değerleri çevir. Anahtarları asla çevirme. Eksik bir anahtar İngilizceye, sonra anahtarın kendisine düşer, bu yüzden yarım kalmış bir dosya sorun değildir.

-- 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) dil değiştiğinde client’ta çalışır, kendi oluşturduğun metinler için.

Resource’un bir ui_pagei varsa locale betiği birleştirilmiş tabloyu sayfaya gönderir. Ortak helper’ı sayfa betiğinden önce yükle:

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

Sonra HTML’i işaretle. İşaretlemedeki İngilizce metin yedektir:

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

JS’te dinamik metni yeniden çizmek için t('key', { name: 'x' }) ve BSI18n.onChange(fn) kullan.

  • Anahtarları sabit ve gruplu tut (ui., msg., err.). Bir anahtarı değiştirmek onun tüm çevirilerini bozar.
  • Sayıları sabit gömülü denge metinleri yazma, placeholder kullan ki sayı config’i takip etsin.