From 8af19bae42b3139ae4b30ccc11e27121f3cef08d Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Fri, 29 Apr 2022 05:56:41 +1000 Subject: [PATCH] feat: locale system --- fxmanifest.lua | 3 ++- imports/locale/shared.lua | 30 ++++++++++++++++++++++++++++++ resource/locale/client.lua | 24 ++++++++++++++++++++++++ resource/locale/server.lua | 5 +++++ 4 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 imports/locale/shared.lua create mode 100644 resource/locale/client.lua create mode 100644 resource/locale/server.lua diff --git a/fxmanifest.lua b/fxmanifest.lua index 9ac6143..df8ba48 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -40,7 +40,8 @@ files { 'imports/**/client.lua', 'imports/**/shared.lua', 'web/build/index.html', - 'web/build/**/*' + 'web/build/**/*', + 'locales/*.json', } shared_script 'resource/main.lua' diff --git a/imports/locale/shared.lua b/imports/locale/shared.lua new file mode 100644 index 0000000..fd40938 --- /dev/null +++ b/imports/locale/shared.lua @@ -0,0 +1,30 @@ +local dict + +function locale(str, ...) + local lstr = dict[str] + + if lstr then + if ... then + return lstr and lstr:format(...) + end + + return lstr + end + + return ("Translation for '%s' does not exist"):format(str) +end + +local function loadLocale(locale) + local resourceName = GetCurrentResourceName() + local JSON = LoadResourceFile(resourceName, ('locales/%s.json'):format(locale)) or LoadResourceFile(resourceName, ('locales/en-US.json'):format(locale)) + + if JSON then + dict = json.decode(JSON) + end +end + +AddEventHandler('ox_lib:setLocale', loadLocale) + +return function() + loadLocale(GetExternalKvpString('ox_lib', 'locale') or 'en-US') +end diff --git a/resource/locale/client.lua b/resource/locale/client.lua new file mode 100644 index 0000000..fa2e53b --- /dev/null +++ b/resource/locale/client.lua @@ -0,0 +1,24 @@ +local userLocale = GetResourceKvpString('locale') + +local function loadLocale(locale, cb) + local JSON = LoadResourceFile('ox_lib', ('locales/%s.json'):format(locale)) or LoadResourceFile('ox_lib', ('locales/en-US.json'):format(locale)) + if cb then cb(JSON) end + + SetResourceKvp('locale', locale) + TriggerEvent('ox_lib:setLocale', locale) +end + +RegisterNUICallback('getLocale', loadLocale) + +if not userLocale then + local default = { 'en-US', 'fr-FR', 'de-DE', 'it-IT', 'es-ES', 'pt-BR', 'pl-PL', 'ru-RU', 'ko-KR', 'zh-TW', 'ja-JP', 'es-MX', 'zh-CN' } + userLocale = default[GetCurrentLanguage() + 1] +end + +loadLocale(userLocale) + +RegisterCommand('setlocale', function(_, args, _) + if args?[1] then + loadLocale(args[1]) + end +end, false) diff --git a/resource/locale/server.lua b/resource/locale/server.lua new file mode 100644 index 0000000..d5edfa1 --- /dev/null +++ b/resource/locale/server.lua @@ -0,0 +1,5 @@ +RegisterCommand('serverlocale', function(_, args, _) + if args?[1] then + SetResourceKvp('locale', args[1]) + end +end, true)