Localization
The Season Pass uses a file-first localization system with automatic version management. Two languages are included by default: English (en-US) and German (de-DE).
File Location
configs/kyuubisoft_seasonpass/localization/
├── en-US.json # English (default)
└── de-DE.json # German
Language Setting
Set the active language in config.json:
{
"language": "en-US"
}
File-First Pattern
- The plugin checks
localization/{lang}.jsonon disk - If the file doesn't exist, it extracts the default from the JAR
- Missing keys fall back to
en-US - User edits to the file are preserved across updates
Version Management
Each localization file contains a _localization_version field:
{
"_localization_version": "3",
"seasonpass.ui.title": "Season Pass",
...
}
When the plugin ships new keys (version bump), it:
- Creates a backup of the existing file (
.bak) - Merges new keys into the user's file
- Updates the
_localization_versionfield - Preserves all user-customized values
Version Bump Required
When adding new i18n keys to a custom build, you must bump the _localization_version number. Otherwise, deployed files will NOT be updated (file-first pattern skips files that already exist).
Key Categories
Commands (seasonpass.cmd.*)
| Key | Default (en-US) |
|---|---|
seasonpass.cmd.players_only | This command is for players only |
seasonpass.cmd.no_permission | You don't have permission |
seasonpass.cmd.player_not_found | Player not found |
seasonpass.cmd.season_info | Season info message |
seasonpass.cmd.no_active_season | No active season |
seasonpass.cmd.premium_already | You already have premium |
seasonpass.cmd.premium_disabled | Premium is disabled |
seasonpass.cmd.premium_purchased | Premium purchased |
seasonpass.cmd.premium_insufficient | Not enough currency |
seasonpass.cmd.opening | Opening Season Pass... |
UI (seasonpass.ui.*)
| Key | Default (en-US) |
|---|---|
seasonpass.ui.title | Season Pass |
seasonpass.ui.tab_tiers | Tiers |
seasonpass.ui.tab_challenges | Challenges |
seasonpass.ui.tab_shop | Shop |
seasonpass.ui.tab_history | History |
seasonpass.ui.tab_settings | Settings |
seasonpass.ui.free_track | Free |
seasonpass.ui.premium_track | Premium |
seasonpass.ui.bonus_track | Bonus |
seasonpass.ui.season_ends_in | Season ends in: 0 |
seasonpass.ui.xp_progress | 0 / 1 XP |
seasonpass.ui.token_balance | 0 Tokens |
seasonpass.ui.premium_badge | PREMIUM |
Tiers (seasonpass.tier.*)
| Key | Default (en-US) |
|---|---|
seasonpass.tier.tier_up | Tier Up! You reached Tier 0 |
seasonpass.tier.claim | Claim now |
seasonpass.tier.claimed | Claimed |
seasonpass.tier.locked | Locked |
seasonpass.tier.premium_locked | Premium Only |
seasonpass.tier.reward_claimed | Reward claimed! |
seasonpass.tier.not_reached | Tier not reached yet |
seasonpass.tier.need_premium | Premium pass required |
Challenges (seasonpass.challenge.*)
| Key | Default (en-US) |
|---|---|
seasonpass.challenge.kill_mobs | Kill 0 mobs |
seasonpass.challenge.kill_specific | Kill 0 1 |
seasonpass.challenge.break_blocks | Break 0 blocks |
seasonpass.challenge.break_specific | Break 0 1 |
seasonpass.challenge.place_blocks | Place 0 blocks |
seasonpass.challenge.harvest | Harvest 0 crops |
seasonpass.challenge.travel | Travel 0 blocks |
seasonpass.challenge.discover_zone | Discover 0 zones |
seasonpass.challenge.play_time | Play for 0 minutes |
seasonpass.challenge.complete | Challenge completed! |
Shop (seasonpass.shop.*)
| Key | Default (en-US) |
|---|---|
seasonpass.shop.title | Season Shop |
seasonpass.shop.cost | 0 Tokens |
seasonpass.shop.buy | Buy |
seasonpass.shop.sold_out | SOLD |
seasonpass.shop.purchased | Purchased 0! |
seasonpass.shop.not_enough_tokens | Not enough tokens |
seasonpass.shop.daily_rotation | Daily Rotation |
seasonpass.shop.refreshes_in | Refreshes in: 0 |
Admin (seasonpass.admin.*)
| Key | Default (en-US) |
|---|---|
seasonpass.admin.season_started | Season 0 started |
seasonpass.admin.season_ended | Season ended |
seasonpass.admin.season_paused | Season paused |
seasonpass.admin.season_resumed | Season resumed |
seasonpass.admin.config_reloaded | Configuration reloaded |
seasonpass.admin.xp_granted | Granted 0 XP to 1 |
seasonpass.admin.tokens_granted | Granted 0 tokens to 1 |
seasonpass.admin.premium_granted | Premium granted to 0 |
seasonpass.admin.premium_revoked | Premium revoked from 0 |
seasonpass.admin.tier_set | Set 0's tier to 1 |
seasonpass.admin.player_reset | Reset 0's season data |
Settings (seasonpass.settings.*)
| Key | Default (en-US) |
|---|---|
seasonpass.settings.title | Settings |
seasonpass.settings.hud_enabled | HUD Tracker |
seasonpass.settings.hud_position | HUD Position |
seasonpass.settings.xp_notifications | XP Notifications |
seasonpass.settings.xp_notif.all | All |
seasonpass.settings.xp_notif.large | Large only |
seasonpass.settings.xp_notif.none | Off |
seasonpass.settings.tier_notifications | Tier-Up Notifications |
seasonpass.settings.challenge_notifications | Challenge Notifications |
seasonpass.settings.saved | Settings saved |
Adding a Custom Translation
- Copy
en-US.jsonand rename to your locale (e.g.,fr-FR.json) - Translate all values (keep the keys unchanged)
- Set
"language": "fr-FR"inconfig.json - Reload with
/spadmin reload
Partial Translations
You don't need to translate every key. Any missing key automatically falls back to the en-US value.