From 1e3b2cb567e33024fc32b659ba94d9c78ae7cd13 Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Mon, 1 Apr 2024 19:16:53 +1100 Subject: [PATCH] feat(locale): locale hotloading --- imports/locale/shared.lua | 10 ++++++++-- resource/locale/client.lua | 34 ++++++++++++++++++++++++++-------- resource/locale/server.lua | 1 + resource/server.lua | 14 ++++++++++++++ 4 files changed, 49 insertions(+), 10 deletions(-) create mode 100644 resource/locale/server.lua create mode 100644 resource/server.lua diff --git a/imports/locale/shared.lua b/imports/locale/shared.lua index f051dc2..946e343 100644 --- a/imports/locale/shared.lua +++ b/imports/locale/shared.lua @@ -38,10 +38,12 @@ function lib.getLocales() end ---Loads the ox_lib locale module. Prefer using fxmanifest instead (see [docs](https://overextended.dev/ox_lib#usage)). -function lib.locale() - local lang = GetConvar('ox:locale', 'en') +function lib.locale(key) + local lang = key or lib.getLocaleKey() local locales = json.decode(LoadResourceFile(cache.resource, ('locales/%s.json'):format(lang))) + table.wipe(dict) + if not locales then local warning = "could not load 'locales/%s.json'" warn(warning:format(lang)) @@ -104,4 +106,8 @@ exports('getLocale', function(key) return dict[key] end) +AddEventHandler('ox_lib:setLocale', function(key) + lib.locale(key) +end) + return lib.locale diff --git a/resource/locale/client.lua b/resource/locale/client.lua index ebbd139..88c6d15 100644 --- a/resource/locale/client.lua +++ b/resource/locale/client.lua @@ -1,15 +1,33 @@ +local settings = require 'resource.settings' + +local function loadLocaleFile(key) + local file = LoadResourceFile(cache.resource, ('locales/%s.json'):format(key)) + or LoadResourceFile(cache.resource, 'locales/en.json') + + return file and json.decode(file) or {} +end + +function lib.getLocaleKey() return settings.locale end + +---@param key string +function lib.setLocale(key) + settings.locale = key + + SetResourceKvp('locale', key) + TriggerEvent('ox_lib:setLocale', key) + SendNUIMessage({ + action = 'setLocale', + data = loadLocaleFile(key) + }) +end + RegisterNUICallback('init', function(_, cb) cb(1) - SendNUIMessage({ - action = 'loadLocales', - data = {} - }) - - local JSON = LoadResourceFile(cache.resource, ('locales/%s.json'):format(GetConvar('ox:locale', 'en'))) or LoadResourceFile(cache.resource, 'locales/en.json') - SendNUIMessage({ action = 'setLocale', - data = JSON and json.decode(JSON) or {} + data = loadLocaleFile(settings.locale) }) end) + +lib.locale(settings.locale) diff --git a/resource/locale/server.lua b/resource/locale/server.lua new file mode 100644 index 0000000..552696f --- /dev/null +++ b/resource/locale/server.lua @@ -0,0 +1 @@ +function lib.getLocaleKey() return GetConvar('ox:locale', 'en') end diff --git a/resource/server.lua b/resource/server.lua new file mode 100644 index 0000000..99b62db --- /dev/null +++ b/resource/server.lua @@ -0,0 +1,14 @@ +local locales, localesN = lib.getFilesInDirectory('locales', '%.json') + +for i = 1, localesN do + local key = locales[i] + local value = key:gsub('%.json', '') + local label = (json.decode(LoadResourceFile(lib.name, ('locales/%s'):format(key)) or '') or '').language or value + locales[i] = { label = label, value = value } +end + +table.sort(locales, function(a, b) + return a.label < b.label +end) + +GlobalState['ox_lib:locales'] = locales