Configuration
Every entry in shared/config.lua. Defaults, types, and purpose.
All settings live in shared/config.lua. The file is in escrow_ignore
so it remains editable after install. Event name constants live in
shared/constants.lua. All user-facing text lives in the per-language
files under locales/, loaded by shared/locale.lua (see Localization
below).
[!warning] 3.0 regrouped the config. The loose top-level flags from earlier versions were folded into nested tables (
Config.Seasons,Config.Weather,Config.Forecast,Config.Temperature,Config.Warnings,Config.Admin) and there is no back-compat shim — an oldconfig.luacannot be copy-pasted onto 3.0. Start from the shipped file and re-apply your values. See the Changelog for the full old → new key map.
The file is ordered by how often you touch it, and this page follows the same three sections:
- Quick setup — framework, language, seasons, time, weather, UI.
- Features — exposure, snow, storms, betting, webhooks, the API.
- Advanced tuning — the weather tables, inert weather, debug.
Quick setup
Core
Config.Frameworkstringdefault: 'ESX'Framework identifier. One of 'ESX', 'QB'.
Config.Targetstringdefault: 'OX'Target resource identifier. One of 'OX', 'QB'.
Config.Languagestringdefault: 'en'Active language for the UI, notifications, and the admin menu. Loads the matching locales/<code>.json file. Shipped: 'en', 'fi', 'de', 'fr', 'pt-br', 'es', 'tr', 'nl', 'it', 'pl', 'zh'. See Localization below.
Config.NotificationSystemstringdefault: 'ox_lib'Notification backend. One of 'ox_lib', 'esx', 'qb', 'custom'.
Config.CustomNotifyfunction | nildefault: nilOptional function invoked when NotificationSystem = 'custom'. Signature: function(title, message, type).
Admin
Config.Admin.Identifiersstring[]default: {}Optional list of raw identifiers (license, steam, discord) treated as admin outside the framework's group system.
Config.Admin.Keybindtabledefault: { Enabled = false, Key = 'F7' }Keybind that opens the admin weather menu. When Enabled, registered through the ox_lib keybind system on the key in Key.
Seasons
Config.Seasons.Enabledbooleandefault: trueMaster toggle for the seasonal cycle. If false, season stays fixed on Config.Seasons.Default.
Config.Seasons.Defaultstringdefault: 'SUMMER'Season used when the cycle is disabled, or the initial season at first start. One of 'SPRING', 'SUMMER', 'FALL', 'WINTER'.
Config.Seasons.DurationDaysnumberdefault: 30In-game days per season when Realtime.Enabled is false.
Config.Seasons.FirstEventDelayMinutesnumberdefault: 30Minutes after a restart before the first seasonal event can roll.
Config.Seasons.Realtime.Enabledbooleandefault: falseWhen true, season follows the real-world month (see Realtime.MonthMap) instead of DurationDays.
Config.Seasons.Realtime.MonthMaptableMonth (1 to 12) to season ('SPRING', 'SUMMER', 'FALL', 'WINTER'). Shipped default maps Dec-Feb to winter, Mar-May to spring, Jun-Aug to summer, Sep-Nov to fall.
Time sync
Config.TimeSync.Enabledbooleandefault: trueServer-authoritative time sync. Ensures all players share the same clock.
Config.TimeSync.UseRealTimebooleandefault: falseMirror real-world time when true.
Config.TimeSync.Freezebooleandefault: falseFreeze time progression when UseRealTime is false.
Config.TimeSync.StartHournumberdefault: 12Config.TimeSync.StartMinutenumberdefault: 0Config.TimeSync.StartSecondnumberdefault: 0Config.TimeSync.TimeScalenumberdefault: 1.0Minute progression multiplier when UseRealTime is false.
Config.TimeSync.SyncIntervalSecondsnumberdefault: 15Server to client time broadcast cadence.
Config.TimeSync.RealtimeUtcOffsetMinutesnumber | nildefault: nilOptional fixed UTC offset (minutes) for realtime mode.
Weather
Config.Weather.Effectsbooleandefault: trueApply road traction, visual overlays, and weather-driven FX on clients.
Config.Weather.UpdateIntervalnumberdefault: 2.5Minutes between weather tick evaluations on the server.
Config.Weather.MinDurationnumberdefault: 5Minimum random weather duration (minutes).
Config.Weather.MaxDurationnumberdefault: 15Maximum random weather duration (minutes).
Config.Weather.DefaultDurationnumberdefault: 8Fallback duration (minutes) when Min/Max are not set.
Config.Weather.ChanceMultiplierstabledefault: { WetWeather = 0.6, SpringThunderEvent = 0.5 }0.01 to 1.0 multipliers. WetWeather tunes random RAIN/THUNDER frequency. SpringThunderEvent tunes the spring thunderstorm seasonal event.
Forecast
Config.Forecast.Daysnumberdefault: 6Number of days included in the forecast.
Config.Forecast.RefreshIntervalnumberdefault: 60Minutes between forecast regenerations.
Temperature
Config.Temperature.Enabledbooleandefault: trueCalculate and broadcast ambient temperature. Required for the forecast temperature, heatwave effects, and the exposure system.
Config.Temperature.Basenumberdefault: 10Base temperature in Celsius. Modulated by season, time-of-day, and weather.
Config.Temperature.Coldnumberdefault: 4At or below this, the player is flagged as 'cold'. Triggers cold-breath effects.
Config.Temperature.Hotnumberdefault: 30At or above this, heatwave effects apply.
Config.Temperature.Minnumberdefault: -20Hard temperature floor in Celsius.
Config.Temperature.Maxnumberdefault: 45Hard temperature cap in Celsius.
Weather warnings
Config.Warnings.Enabledbooleandefault: trueBroadcast in-world weather warnings during severe weather. Distinct from Config.Exposure.Warnings, which governs body-temperature notifications.
Config.Warnings.Soundsbooleandefault: falsePlay the warning sound FX alongside the text warning.
UI
Config.UI.EnableForecastbooleandefault: trueEnable the /forecast command and the newspaper-stand forecast interaction.
Config.UI.EnableWeatherHudbooleandefault: falseRender the small weather HUD panel. Also required for the body-temperature thermometer (see Config.Exposure.Hud).
Config.UI.NotifyOnWeatherChangebooleandefault: trueConfig.UI.NotifyOnTempChangebooleandefault: trueNotify when temperature changes by more than TempChangeThreshold.
Config.UI.TempChangeThresholdnumberdefault: 5Minimum temperature delta (in degrees) that triggers a notification.
Config.UI.WarningDurationnumberdefault: 10Seconds a warning banner stays on screen.
Config.UI.UseMetricbooleandefault: trueDisplay temperature in Celsius. Set false for Fahrenheit.
Config.UI.DisplayFormatstringdefault: 'both'HUD display format. One of 'icon', 'text', 'both'.
Features
Exposure
Body-temperature survival. The felt ("effective") temperature is the ambient synced temperature shifted by altitude, worn clothing, nearby heat sources or shelter, and how wet the player is. Cold pushes toward hypothermia, heat toward heatstroke. Effects are non-lethal and never drain health.
Config.Exposure.Enabledbooleandefault: trueMaster switch for the entire body-temperature feature: the felt-temp model, all cold and heat FX, every body-temperature warning, the thermometer HUD, and the gameplay consequences. false removes all of it. Ambient temperature, forecast, weather, and snow are unaffected.
Config.Exposure.Consequencesbooleandefault: trueGameplay penalties at danger tiers: stamina drain, reduced sprint, and aim shake. false leaves cosmetic FX and warnings only. Never drains health.
Config.Exposure.TickMsnumberdefault: 2000Client accumulator and server report cadence in milliseconds.
Config.Exposure.WarmthPerPointnumberdefault: 1.5Degrees of felt-temperature offset per point of worn clothing warmth (see shared/clothing_warmth.lua).
Config.Exposure.ColdDiscomfortnumberdefault: 6Felt temperature (Celsius) at or below which the first cold tier triggers.
Config.Exposure.ColdDangernumberdefault: 0Felt temperature for the second cold tier.
Config.Exposure.ColdSeverenumberdefault: -10Felt temperature for the severe cold tier.
Config.Exposure.HeatDiscomfortnumberdefault: 30Felt temperature at or above which the first heat tier triggers.
Config.Exposure.HeatDangernumberdefault: 36Felt temperature for the second heat tier.
Config.Exposure.HeatSeverenumberdefault: 42Felt temperature for the severe heat tier.
Config.Exposure.ComfortPointnumberdefault: 20Comfort midpoint (Celsius). Climate-controlled spaces such as vehicles and interiors pull felt temperature toward this.
Config.Exposure.ComfortCeilingCnumberdefault: 28Cold-side warming from clothing, fire, and shelter may raise felt temperature up to here but never above it, so bundling up can never cause heatstroke.
Config.Exposure.HeatwaveBoostCnumberdefault: 10Degrees the summer heatwave seasonal event adds to the base temperature while active, so heat danger is reachable.
Config.Exposure.Heattabledefault: { SunHeatC = 3.0, HeavyClothingHeatScale = 0.5, ShadeReliefC = 3.0, WetCoolingC = 4.0 }Heat-load model. SunHeatC is direct midday sun while unsheltered. HeavyClothingHeatScale is the fraction of clothing warmth that becomes heat load when hot. ShadeReliefC is relief under cover. WetCoolingC is evaporative cooling when wet.
Config.Exposure.Inertiatabledefault: { Enabled = true, CoolSeconds = 90, WarmSeconds = 45 }Thermal inertia. Body temperature lags the instantaneous felt temperature. CoolSeconds is the time constant while cooling, WarmSeconds while warming.
Config.Exposure.Wetnesstabledefault: { MaxPenaltyC = 6.0 }Being soaked lowers felt temperature by up to this many degrees when cold.
Config.Exposure.HeatSourcestabledefault: { Enabled = true, Radius = 4.0, FireBonusC = 8.0, HeaterBonusC = 6.0 }Nearby prop heat sources. Models is a list of prop names hashed at runtime (patio heater, barrel fire, beach fire, BBQ, fire logs). FireBonusC and HeaterBonusC are the warmth added within Radius.
Config.Exposure.RoofShelterCheckbooleandefault: trueThrottled synchronous roof probe that detects being outdoors under cover.
Config.Exposure.Consequencetabledefault: { StaminaDrain = true, MoveRateAtSevere = 0.85, SprintDisableAtSevere = true, AimShake = 'HAND_SHAKE', AimShakeAmp = 0.22 }Tuning for the danger-tier penalties. Applied only when Consequences is true.
Config.Exposure.Warningsbooleandefault: trueShow on-screen body-temperature notifications as tiers escalate. Sub-toggle, active only while Enabled.
Config.Exposure.Cuestabledefault: { Enabled = true, StepDeltaC = 4.0, CooldownMs = 6000, HysteresisMarginC = 1.5 }Legibility helpers. Enabled toggles the warmer/colder transition nudge. StepDeltaC is the minimum felt jump to fire a cue, CooldownMs the minimum interval. HysteresisMarginC is always-on anti-spam that keeps a warning tier from re-firing on a boundary, independent of Enabled.
Config.Exposure.Hudtabledefault: { Enabled = true }Optional felt-temperature thermometer on the weather HUD. Shows only when this and Config.UI.EnableWeatherHud are both true and the player is in a cold or heat tier. Cosmetic: it never changes the model or its consequences.
Config.Exposure.PersistEpisodesbooleandefault: falseLog danger episodes to the player_weather_effects table. Off by default: the table has no in-repo reader. Enable only if an external resource consumes it.
Altitude cooling
Standard atmospheric lapse rate: higher ground feels colder. Client-side and feeds exposure only. The displayed ambient temperature is unchanged, so there is no desync.
Config.LapseRate.Enabledbooleandefault: trueConfig.LapseRate.DegPer1000mnumberdefault: 6.5Degrees lost per 1000 m of elevation.
Config.LapseRate.SeaLevelZnumberdefault: 0.0World Z treated as the sea-level baseline.
Config.LapseRate.MaxOffsetCnumberdefault: 8Cap on the altitude-cooling magnitude in degrees, so high ground cannot stack into instant severe cold.
Snow depth
Server-tracked snow accumulation. Builds during snow weather, melts as it
warms up. Deep snow slows players on foot and kicks up wheel FX.
Published on GlobalState.nxSnowDepth.
Config.SnowDepth.Enabledbooleandefault: trueConfig.SnowDepth.MaxDepthnumberdefault: 1.0Maximum tracked depth in metres.
Config.SnowDepth.BuildPerMinAtFullIntensitynumberdefault: 0.06Depth gained per minute at full snow intensity.
Config.SnowDepth.MeltAboveTempCnumberdefault: 2Snow melts when the ambient temperature is above this.
Config.SnowDepth.MeltPerMinnumberdefault: 0.05Depth lost per minute while melting.
Config.SnowDepth.DeepThresholdnumberdefault: 0.45Depth at or above which deep-snow effects apply.
Config.SnowDepth.MoveRateAtMaxnumberdefault: 0.82On-foot move-rate floor at MaxDepth.
Config.SnowDepth.KickUpFxbooleandefault: trueWheel snow-spray particle FX on vehicles.
Config.SnowDepth.Sliptabledefault: { Enabled = false, MinDepth = 0.6, ChancePerSec = 0.04, Cooldown = 12 }Optional random slip-and-fall while sprinting in deep snow. Off by default.
Road traction
Config.RoadEffects.RainTractionReductionnumberdefault: 0.15Traction reduction during RAIN. Range 0.0 to 1.0.
Config.RoadEffects.ThunderTractionReductionnumberdefault: 0.25Config.RoadEffects.ClearingTractionReductionnumberdefault: 0.1Config.RoadEffects.SnowTractionReductionnumberdefault: 0.35Storm systems
Blackout pulses, lightning strike FX, and ocean wave simulation.
Config.StormSystems.Enabledbooleandefault: trueMaster toggle for all storm systems.
Config.StormSystems.SyncIntervalSecondsnumberdefault: 2Server to client cadence for storm state broadcasts.
Blackout
Config.StormSystems.Blackout.Enabledbooleandefault: trueConfig.StormSystems.Blackout.MinIntensitynumberdefault: 0.72Fallback intensity threshold for weather types not listed in EligibleWeather.
Config.StormSystems.Blackout.EligibleWeathertabledefault: { THUNDER = { minIntensity = 0.72 }, RAIN = { minIntensity = 0.88 }, BLIZZARD = { minIntensity = 0.72 } }Per-weather minimum intensity required for blackout pulses to fire.
Config.StormSystems.Blackout.PulseMinSecondsnumberdefault: 6Config.StormSystems.Blackout.PulseMaxSecondsnumberdefault: 14Config.StormSystems.Blackout.DurationTierstabledefault: {}Optional weighted duration tiers per weather type. When a weather type has tiers, each blackout pulse picks one at random (weighted) instead of using PulseMin/MaxSeconds. Each tier is { duration = seconds, weight = N } for a fixed value, or { min = seconds, max = seconds, weight = N } for a random range. Durations are clamped to [2, 300] seconds. Leave a weather key absent to keep the default short-pulse behavior. Example for dramatic thunderstorm outages: DurationTiers = { THUNDER = { { duration = 30, weight = 60 }, { duration = 60, weight = 30 }, { duration = 300, weight = 10 } } }.
Config.StormSystems.Blackout.CooldownMinSecondsnumberdefault: 20Config.StormSystems.Blackout.CooldownMaxSecondsnumberdefault: 45Config.StormSystems.Blackout.VehicleLightsbooleandefault: falseWhen false, vehicle lights are disabled during blackout pulses.
Strike FX
Config.StormSystems.StrikeFx.Enabledbooleandefault: trueConfig.StormSystems.StrikeFx.MinIntensitynumberdefault: 0.65Config.StormSystems.StrikeFx.ChancePerSyncnumberdefault: 0.18Probability of a strike FX broadcast on each sync interval while storm logic is active.
Config.StormSystems.StrikeFx.MinIntervalSecondsnumberdefault: 6Hard cooldown between strike FX broadcasts.
Config.StormSystems.StrikeFx.MinDistanceFromTargetnumberdefault: 25.0Config.StormSystems.StrikeFx.MaxDistanceFromTargetnumberdefault: 120.0Ocean
Config.StormSystems.Ocean.Enabledbooleandefault: trueConfig.StormSystems.Ocean.Modestringdefault: 'coastal''coastal' applies only when the player is near water. 'global' always applies.
Config.StormSystems.Ocean.UpdateIntervalMsnumberdefault: 2500Config.StormSystems.Ocean.DetectionRadiusnumberdefault: 90.0Config.StormSystems.Ocean.ProbeDepthnumberdefault: 24.0Config.StormSystems.Ocean.DefaultScalernumberdefault: 1.0Config.StormSystems.Ocean.Presetstabledefault: { calm = 1.0, normal = 1.3, rough = 1.6, storm = 2.0, experimental = 4.0 }Named scaler presets usable from the admin menu and the STORM_SET_OCEAN_OVERRIDE event.
Config.StormSystems.Ocean.WeatherScalerstablePer-weather automatic scaler. Keys mirror GTA weather types (CLEAR, RAIN, THUNDER, SNOW, BLIZZARD, etc.). Values multiply the base wave height.
Config.StormSystems.Ocean.BoatPhysicstabledefault: { Enabled = true, RoughThreshold = 1.35, StormThreshold = 1.8, RoughMaxSpeedMultiplier = 0.88, StormMaxSpeedMultiplier = 0.75, TurbulenceForce = 0.15, TurbulenceIntervalMs = 850 }Optional boat penalties under rough seas. Thresholds are scaler values, multipliers clamp max speed, TurbulenceForce adds periodic impulse.
Gameplay flooding
Subtle low-street flooding tied to the weather cycle. Separate from the
admin-only extreme flooding used for testing. Requires
Config.StormSystems.Enabled = true.
Config.GameplayFlooding.Enabledbooleandefault: falseMaster toggle for gameplay flooding.
Config.GameplayFlooding.AutoResetbooleandefault: trueAutomatically reset water after the profile duration expires.
Config.GameplayFlooding.CooldownMinutesnumberdefault: 180Minimum time between gameplay flood triggers.
Config.GameplayFlooding.DurationCheckIntervalSecondsnumberdefault: 30How often the server checks whether the active flood should expire.
Config.GameplayFlooding.ProfilestableFlood profile definitions keyed by id. Shipped: subtle, moderate, strong. Each profile: { maxFloodHeight, increaseRate, threadWait, durationMinutes }.
Config.GameplayFlooding.ProfileWeightstabledefault: { subtle = 0.78, moderate = 0.20, strong = 0.02 }Weighted selection when a profile is picked automatically.
Config.GameplayFlooding.SeasonRulestablePer-season trigger rules. Shipped: SPRING (THUNDER, minIntensity 0.72, triggerChance 0.35) and FALL (RAIN or THUNDER, minIntensity 0.80, triggerChance 0.20).
Betting
Weather betting kiosk. Players wager on the next forecast slot's outcome at the newspaper stand (ox_target). Odds are priced from the open slot's resolution distribution minus the house edge, so betting the shown forecast is always house-favourable.
Config.Betting.Enabledbooleandefault: trueConfig.Betting.Accountstringdefault: 'bank'Account stakes are debited from and payouts credited to.
Config.Betting.MinStakenumberdefault: 50Config.Betting.MaxStakenumberdefault: 5000Config.Betting.MaxSlotExposurenumberdefault: 50000Maximum total stake wagered per forecast slot across all players. 0 is unlimited. Bounds bank liability per round.
Config.Betting.HouseEdgenumberdefault: 0.10Fraction shaved off fair odds. Range 0.0 to 1.0.
Config.Betting.MinOddsnumberdefault: 1.05Minimum offered odds. Keep at or below about 1.07: a higher floor lifts the near-certain favourite back to positive expected value, which becomes a money-printing exploit.
Config.Betting.MaxOddsnumberdefault: 6.0Config.Betting.CooldownSecondsnumberdefault: 5Per-player cooldown between placed bets.
Config.Betting.Reputationbooleandefault: trueTrack per-player betting stats.
Webhooks
Discord webhooks for daily forecasts, severe-weather warnings, and
betting payouts. URLs can also come from convars
(nxfs_forecast_webhook, nxfs_warning_webhook, nxfs_betting_webhook),
which take precedence over the values here.
Config.Webhooks.Enabledbooleandefault: falseConfig.Webhooks.Forecaststringdefault: ''Forecast webhook URL, or set the convar nxfs_forecast_webhook.
Config.Webhooks.Warningsstringdefault: ''Warning webhook URL, or set the convar nxfs_warning_webhook.
Config.Webhooks.Bettingstringdefault: ''Betting-payout audit webhook URL, or set the convar nxfs_betting_webhook.
Config.Webhooks.MinWarningLevelnumberdefault: 3Only post warnings at or above this level. 3 is SEVERE.
Config.Webhooks.MinBetPayoutnumberdefault: 5000Only log betting payouts at or above this amount.
Config.Webhooks.Usernamestringdefault: 'NX Weather'Config.Webhooks.AvatarUrlstringdefault: ''Config.Webhooks.Colorstabledefault: { FORECAST, MINOR, MODERATE, SEVERE, EXTREME, BETTING }Embed colors per category as decimal integers.
Platform API
Exports and GlobalState that let other resources read weather state and optionally request or lock the weather. See the Exports and Events pages for the full surface.
Config.API.Enabledbooleandefault: trueRegister the read exports, the GlobalState writer, and the public on* events.
Config.API.AllowControlbooleandefault: trueAllow other resources to request or lock the weather through the control exports.
Config.API.GlobalStateThrottleMsnumberdefault: 2000Minimum interval between GlobalState weather rebuilds, in milliseconds.
Advanced tuning
The three tables below control what weather rolls, how it flows
from slot to slot, and how strong it gets. Each is an
override-merge over the built-in defaults: entries you list replace the
default, anything you omit keeps the shipped value. An empty table
({}) means 100% stock. Valid weather types are CLEAR, EXTRASUNNY,
CLOUDS, OVERCAST, RAIN, THUNDER, CLEARING, SMOG, FOGGY,
SNOW, BLIZZARD, SNOWLIGHT, and XMAS (typos are logged and
ignored).
Weather chances
Config.WeatherChancestablePer-season spawn weights (relative and auto-normalized — they need not sum to 1.0; set a type to 0 to disable it that season). Config.Weather.ChanceMultipliers and Config.InertWeather still apply on top. Partial edits work: Config.WeatherChances = { SUMMER = { RAIN = 0.15 } } only changes summer rain. Shipped weights cover SUMMER, WINTER, SPRING, and FALL.
Weather variations
Config.WeatherVariationstableTransition chains. The next weather is drawn from the current weather's list (first entry = itself, the most likely follow-on); omitted types fall back to a CLEAR/CLOUDS/OVERCAST chain. The betting kiosk prices its odds off these lists, so keep each chain to plausible, reachable transitions.
Weather intensity
Config.WeatherIntensitytabledefault: { THUNDER = { min = 0.60, max = 1.00 }, BLIZZARD = { min = 0.60, max = 1.00 }, RAIN = { min = 0.30, max = 0.90 }, SNOW = { min = 0.30, max = 0.90 }, default = { min = 0.10, max = 1.00 } }Per-weather strength range (0.0 to 1.0, picked uniformly). Higher means stronger storm FX, blackouts, ocean swell, grip loss, and snow build-up. Unlisted types use the default entry.
Inert weather
Atmospheric weather types (fog, smog, light xmas snow) that add variety without storm hazards. Time-gated so fog rolls in the early morning and smog settles midday.
Config.InertWeather.Enabledbooleandefault: trueConfig.InertWeather.FogVisibilityFloorMetersnumberdefault: 60Minimum fog visibility distance in metres.
Config.InertWeather.WeightstableSpawn weights merged into the per-season weather chances. Shipped: SPRING (FOGGY 0.06, SMOG 0.02), SUMMER (SMOG 0.05, FOGGY 0.02), FALL (FOGGY 0.08, SMOG 0.03), WINTER (XMAS 0.05).
Config.InertWeather.FogHourstabledefault: { startHour = 4, endHour = 9 }Window in which FOGGY may roll.
Config.InertWeather.SmogHourstabledefault: { startHour = 11, endHour = 18 }Window in which SMOG may roll.
Debug and logging
Config.Debugbooleandefault: falseEnables verbose debug logging and unlocks debug-only commands (see Commands page).
Config.EnableLoggingbooleandefault: trueWhen true, the optional analytics tables are created and weather changes are logged.
Localization
All user-facing text (UI labels, notification titles, warning copy,
weather and forecast strings, and the admin menu) lives in per-language
JSON files under locales/, loaded at runtime by shared/locale.lua.
The active file is selected by Config.Language, and any key missing
from a translation falls back to English.
Shipped languages: English (en), Finnish (fi), German (de), French
(fr), Brazilian Portuguese (pt-br), Spanish (es), Turkish (tr),
Dutch (nl), Italian (it), Polish (pl), and Chinese (zh).
To add or change a language, copy locales/en.json, translate the
values, and keep the keys and the %s, %d, and {placeholder} tokens
intact. Set Config.Language to the file name. The locales/*.json
files are listed in escrow_ignore and the manifest files{} block, so
they stay editable after install and load on the client.
[!note] Earlier versions kept this text in
Config.Locale,Config.WarningMessages,Config.WeatherMessages, and their*Fimirrors. Those tables were removed in 2.2.0. Move any customizations into the matchinglocales/<code>.jsonfile.