local ConvarLang = GetConvar("lang", "none") local OXLang = GetConvar("ox:locale", "none") local QBXLang = GetConvar("qb_locale", "none") local txLang = GetConvar("txAdmin-locale", "none") local esxLang = GetConvar("esx:locale", "none") BridgeSharedConfig = Require("settings/sharedConfig.lua") Lang = ConvarLang ~= "none" and ConvarLang or BridgeSharedConfig.Lang ~= "auto" and BridgeSharedConfig.Lang or OXLang ~= "none" and OXLang or QBXLang ~= "none" and QBXLang or txLang ~= "none" and txLang or esxLang ~= "none" and esxLang or "en" Language = {} function Language.Locale(str, ...) local resource = GetInvokingResource() or GetCurrentResourceName() assert(resource, "Resource name not found") local locales = LoadResourceFile(resource, "locales/" .. Lang .. ".json") locales = locales and json.decode(locales) or {} -- Handle nested tables via dot notation local current = locales for part in str:gmatch("[^%.]+") do if type(current) ~= "table" then warn(("Invalid nested locale path: %s"):format(str)) return str end current = current[part] if not current then warn(("Locale not found for key: %s in language: %s"):format(str, Lang)) return str end end -- Handle variable replacement local args = {...} if type(current) == "string" and #args > 0 then current = string.format(current, ...) end return current end return Language