NX CreativeNX CreativeDocs
Scriptsnx_fourseasons

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 old config.lua cannot 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:

  1. Quick setup — framework, language, seasons, time, weather, UI.
  2. Features — exposure, snow, storms, betting, webhooks, the API.
  3. 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: nil

Optional 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: true

Master 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: 30

In-game days per season when Realtime.Enabled is false.

Config.Seasons.FirstEventDelayMinutesnumberdefault: 30

Minutes after a restart before the first seasonal event can roll.

Config.Seasons.Realtime.Enabledbooleandefault: false

When true, season follows the real-world month (see Realtime.MonthMap) instead of DurationDays.

Config.Seasons.Realtime.MonthMaptable

Month (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: true

Server-authoritative time sync. Ensures all players share the same clock.

Config.TimeSync.UseRealTimebooleandefault: false

Mirror real-world time when true.

Config.TimeSync.Freezebooleandefault: false

Freeze time progression when UseRealTime is false.

Config.TimeSync.StartHournumberdefault: 12
Config.TimeSync.StartMinutenumberdefault: 0
Config.TimeSync.StartSecondnumberdefault: 0
Config.TimeSync.TimeScalenumberdefault: 1.0

Minute progression multiplier when UseRealTime is false.

Config.TimeSync.SyncIntervalSecondsnumberdefault: 15

Server to client time broadcast cadence.

Config.TimeSync.RealtimeUtcOffsetMinutesnumber | nildefault: nil

Optional fixed UTC offset (minutes) for realtime mode.

Weather

Config.Weather.Effectsbooleandefault: true

Apply road traction, visual overlays, and weather-driven FX on clients.

Config.Weather.UpdateIntervalnumberdefault: 2.5

Minutes between weather tick evaluations on the server.

Config.Weather.MinDurationnumberdefault: 5

Minimum random weather duration (minutes).

Config.Weather.MaxDurationnumberdefault: 15

Maximum random weather duration (minutes).

Config.Weather.DefaultDurationnumberdefault: 8

Fallback 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: 6

Number of days included in the forecast.

Config.Forecast.RefreshIntervalnumberdefault: 60

Minutes between forecast regenerations.

Temperature

Config.Temperature.Enabledbooleandefault: true

Calculate and broadcast ambient temperature. Required for the forecast temperature, heatwave effects, and the exposure system.

Config.Temperature.Basenumberdefault: 10

Base temperature in Celsius. Modulated by season, time-of-day, and weather.

Config.Temperature.Coldnumberdefault: 4

At or below this, the player is flagged as 'cold'. Triggers cold-breath effects.

Config.Temperature.Hotnumberdefault: 30

At or above this, heatwave effects apply.

Config.Temperature.Minnumberdefault: -20

Hard temperature floor in Celsius.

Config.Temperature.Maxnumberdefault: 45

Hard temperature cap in Celsius.

Weather warnings

Config.Warnings.Enabledbooleandefault: true

Broadcast in-world weather warnings during severe weather. Distinct from Config.Exposure.Warnings, which governs body-temperature notifications.

Config.Warnings.Soundsbooleandefault: false

Play the warning sound FX alongside the text warning.

UI

Config.UI.EnableForecastbooleandefault: true

Enable the /forecast command and the newspaper-stand forecast interaction.

Config.UI.EnableWeatherHudbooleandefault: false

Render the small weather HUD panel. Also required for the body-temperature thermometer (see Config.Exposure.Hud).

Config.UI.NotifyOnWeatherChangebooleandefault: true
Config.UI.NotifyOnTempChangebooleandefault: true

Notify when temperature changes by more than TempChangeThreshold.

Config.UI.TempChangeThresholdnumberdefault: 5

Minimum temperature delta (in degrees) that triggers a notification.

Config.UI.WarningDurationnumberdefault: 10

Seconds a warning banner stays on screen.

Config.UI.UseMetricbooleandefault: true

Display 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: true

Master 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: true

Gameplay penalties at danger tiers: stamina drain, reduced sprint, and aim shake. false leaves cosmetic FX and warnings only. Never drains health.

Config.Exposure.TickMsnumberdefault: 2000

Client accumulator and server report cadence in milliseconds.

Config.Exposure.WarmthPerPointnumberdefault: 1.5

Degrees of felt-temperature offset per point of worn clothing warmth (see shared/clothing_warmth.lua).

Config.Exposure.ColdDiscomfortnumberdefault: 6

Felt temperature (Celsius) at or below which the first cold tier triggers.

Config.Exposure.ColdDangernumberdefault: 0

Felt temperature for the second cold tier.

Config.Exposure.ColdSeverenumberdefault: -10

Felt temperature for the severe cold tier.

Config.Exposure.HeatDiscomfortnumberdefault: 30

Felt temperature at or above which the first heat tier triggers.

Config.Exposure.HeatDangernumberdefault: 36

Felt temperature for the second heat tier.

Config.Exposure.HeatSeverenumberdefault: 42

Felt temperature for the severe heat tier.

Config.Exposure.ComfortPointnumberdefault: 20

Comfort midpoint (Celsius). Climate-controlled spaces such as vehicles and interiors pull felt temperature toward this.

Config.Exposure.ComfortCeilingCnumberdefault: 28

Cold-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: 10

Degrees 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: true

Throttled 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: true

Show 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: false

Log 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: true
Config.LapseRate.DegPer1000mnumberdefault: 6.5

Degrees lost per 1000 m of elevation.

Config.LapseRate.SeaLevelZnumberdefault: 0.0

World Z treated as the sea-level baseline.

Config.LapseRate.MaxOffsetCnumberdefault: 8

Cap 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: true
Config.SnowDepth.MaxDepthnumberdefault: 1.0

Maximum tracked depth in metres.

Config.SnowDepth.BuildPerMinAtFullIntensitynumberdefault: 0.06

Depth gained per minute at full snow intensity.

Config.SnowDepth.MeltAboveTempCnumberdefault: 2

Snow melts when the ambient temperature is above this.

Config.SnowDepth.MeltPerMinnumberdefault: 0.05

Depth lost per minute while melting.

Config.SnowDepth.DeepThresholdnumberdefault: 0.45

Depth at or above which deep-snow effects apply.

Config.SnowDepth.MoveRateAtMaxnumberdefault: 0.82

On-foot move-rate floor at MaxDepth.

Config.SnowDepth.KickUpFxbooleandefault: true

Wheel 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.15

Traction reduction during RAIN. Range 0.0 to 1.0.

Config.RoadEffects.ThunderTractionReductionnumberdefault: 0.25
Config.RoadEffects.ClearingTractionReductionnumberdefault: 0.1
Config.RoadEffects.SnowTractionReductionnumberdefault: 0.35

Storm systems

Blackout pulses, lightning strike FX, and ocean wave simulation.

Config.StormSystems.Enabledbooleandefault: true

Master toggle for all storm systems.

Config.StormSystems.SyncIntervalSecondsnumberdefault: 2

Server to client cadence for storm state broadcasts.

Blackout

Config.StormSystems.Blackout.Enabledbooleandefault: true
Config.StormSystems.Blackout.MinIntensitynumberdefault: 0.72

Fallback 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: 6
Config.StormSystems.Blackout.PulseMaxSecondsnumberdefault: 14
Config.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: 20
Config.StormSystems.Blackout.CooldownMaxSecondsnumberdefault: 45
Config.StormSystems.Blackout.VehicleLightsbooleandefault: false

When false, vehicle lights are disabled during blackout pulses.

Strike FX

Config.StormSystems.StrikeFx.Enabledbooleandefault: true
Config.StormSystems.StrikeFx.MinIntensitynumberdefault: 0.65
Config.StormSystems.StrikeFx.ChancePerSyncnumberdefault: 0.18

Probability of a strike FX broadcast on each sync interval while storm logic is active.

Config.StormSystems.StrikeFx.MinIntervalSecondsnumberdefault: 6

Hard cooldown between strike FX broadcasts.

Config.StormSystems.StrikeFx.MinDistanceFromTargetnumberdefault: 25.0
Config.StormSystems.StrikeFx.MaxDistanceFromTargetnumberdefault: 120.0

Ocean

Config.StormSystems.Ocean.Enabledbooleandefault: true
Config.StormSystems.Ocean.Modestringdefault: 'coastal'

'coastal' applies only when the player is near water. 'global' always applies.

Config.StormSystems.Ocean.UpdateIntervalMsnumberdefault: 2500
Config.StormSystems.Ocean.DetectionRadiusnumberdefault: 90.0
Config.StormSystems.Ocean.ProbeDepthnumberdefault: 24.0
Config.StormSystems.Ocean.DefaultScalernumberdefault: 1.0
Config.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.WeatherScalerstable

Per-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: false

Master toggle for gameplay flooding.

Config.GameplayFlooding.AutoResetbooleandefault: true

Automatically reset water after the profile duration expires.

Config.GameplayFlooding.CooldownMinutesnumberdefault: 180

Minimum time between gameplay flood triggers.

Config.GameplayFlooding.DurationCheckIntervalSecondsnumberdefault: 30

How often the server checks whether the active flood should expire.

Config.GameplayFlooding.Profilestable

Flood 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.SeasonRulestable

Per-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: true
Config.Betting.Accountstringdefault: 'bank'

Account stakes are debited from and payouts credited to.

Config.Betting.MinStakenumberdefault: 50
Config.Betting.MaxStakenumberdefault: 5000
Config.Betting.MaxSlotExposurenumberdefault: 50000

Maximum total stake wagered per forecast slot across all players. 0 is unlimited. Bounds bank liability per round.

Config.Betting.HouseEdgenumberdefault: 0.10

Fraction shaved off fair odds. Range 0.0 to 1.0.

Config.Betting.MinOddsnumberdefault: 1.05

Minimum 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.0
Config.Betting.CooldownSecondsnumberdefault: 5

Per-player cooldown between placed bets.

Config.Betting.Reputationbooleandefault: true

Track 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: false
Config.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: 3

Only post warnings at or above this level. 3 is SEVERE.

Config.Webhooks.MinBetPayoutnumberdefault: 5000

Only 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: true

Register the read exports, the GlobalState writer, and the public on* events.

Config.API.AllowControlbooleandefault: true

Allow other resources to request or lock the weather through the control exports.

Config.API.GlobalStateThrottleMsnumberdefault: 2000

Minimum 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.WeatherChancestable

Per-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.WeatherVariationstable

Transition 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: true
Config.InertWeather.FogVisibilityFloorMetersnumberdefault: 60

Minimum fog visibility distance in metres.

Config.InertWeather.Weightstable

Spawn 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: false

Enables verbose debug logging and unlocks debug-only commands (see Commands page).

Config.EnableLoggingbooleandefault: true

When 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 *Fi mirrors. Those tables were removed in 2.2.0. Move any customizations into the matching locales/<code>.json file.

NX Docs