Skip to content

feat: Add built-in localization (i18n) support - #92

Merged
derrickmehaffy merged 77 commits into
releases/0.12.0from
feat/i18n
Mar 13, 2026
Merged

feat: Add built-in localization (i18n) support#92
derrickmehaffy merged 77 commits into
releases/0.12.0from
feat/i18n

Conversation

@derrickmehaffy

@derrickmehaffy derrickmehaffy commented Mar 10, 2026

Copy link
Copy Markdown
Contributor

Fixes #19

Summary

Full i18n support — every player-facing string is now translatable via Hytale's native I18nModule. Ships with complete English and Spanish translations.

  • 1,841 translation keys across 3 lang files (commands, GUI, admin)
  • 46 command classes, all GUI pages, and the help system migrated to i18n
  • Player Settings GUI with language selector and notification toggles
  • Help system rewritten: markdown source → .lang build pipeline (42 files per locale)
  • Translator workflow: scaffold scripts, translation guide, checkTranslations Gradle task

What changed

Area Before After
Commands & messages Hardcoded English strings MessageKeys constants + HFMessages resolution
Help system 430 lines of hardcoded Java Build-time markdown → lang pipeline (HelpLangGenerator)
GUI pages Hardcoded labels in .ui / Java All labels from lang keys via HFMessages.get(playerRef, key)
Player preferences None Language selector, territory/death notification toggles
FactionLog English-only messages Optional messageKey + messageArgs fields (backward-compatible)
Translations English only en-US + es-ES complete, fallback chain built in

Architecture

  • HFMessages — Resolution: player preference → client locale → server default → en-US fallback
  • MessageKeys — 1,841 static constants organized by inner classes (Commands, Gui, Admin, Help)
  • MessageUtil — i18n overloads: errorText(PlayerRef, key), successText(...), text(...)
  • PlayerData — Language preference + notification prefs persisted to JSON (backwards-compatible)
  • HelpLangGenerator — Build-time markdown → .lang parser with table, list, and rich text support

Language files

Server/Languages/
├── en-US/  hyperfactions.lang (453), hyperfactions_gui.lang (866), hyperfactions_admin.lang (801)
│   └── help/  (42 markdown files across 7 categories)
├── es-ES/  (complete Spanish translation, same structure)
└── fallback.lang

Dependencies

PRs #98 and #99 (FactionsX and SimpleClaims importers) are based on this branch — merge this first.

Test plan

  • ./gradlew :HyperFactions:shadowJar builds clean
  • All messages render in English — no raw keys visible in commands or GUI
  • /f help — all 42 help topics render correctly from markdown source
  • /f settings player — language selector and notification toggles work and persist
  • es-ES locale shows Spanish text throughout
  • Missing key in es-ES falls back to English
  • Territory/death notification toggles actually suppress messages

🤖 Generated with Claude Code

Add the foundational i18n system following Ecotale's proven pattern
with Hytale's native I18nModule:

- HFMessages: translation resolution engine with player/server language
  support and {0}/{1} placeholder formatting
- MessageKeys: static key constants organized by nested inner classes
  covering common, commands, protection, territory, GUI nav, and more
- MessageUtil: i18n-aware overloads (PlayerRef + key) alongside existing
  string-literal methods for gradual migration
- ServerConfig: defaultLanguage and usePlayerLanguage settings with
  JSON load/write support
- ConfigManager: convenience accessors for language settings
- PlayerData: languagePreference and notification preference fields
  (territoryAlerts, deathAnnouncements, powerNotifications)
- en-US/hyperfactions.lang: initial common.* translation keys (~25 keys)
…se 1a)

Migrate hardcoded English strings to MessageKeys constants for:
- FactionSubCommand.requireFaction()
- Create, Disband, Rename, Desc, Open, Close, Color commands
- Claim command (territory)

Add corresponding keys to MessageKeys.java and hyperfactions.lang.
Migrate hardcoded English strings to MessageKeys constants for:
- Invite, Accept/Join, Kick, Leave commands
- Promote, Demote, Transfer commands

Add corresponding keys to MessageKeys.java and hyperfactions.lang.
Migrate hardcoded English strings to MessageKeys constants for:
- Unclaim, Overclaim, Stuck commands (territory)
- Home, SetHome, DelHome commands (teleport)

Add corresponding keys to MessageKeys.java and hyperfactions.lang.
…ys (Phase 1d)

Migrate hardcoded English strings to MessageKeys constants for:
- Ally, Enemy, Neutral, Relations commands (relation)
- Chat, Invites, Request commands (social)
- Info, Members, List, Help, Who, Map, Power commands (info)
- Money, TreasuryCommandHandler (economy)

Add Invites and Request inner classes to MessageKeys. Expand
Relation, Chat, Info, Power, and Economy classes with new keys.
Migrate GuiSubCommand, SettingsSubCommand, FactionCommand to use
MessageKeys constants. Convert ProtectionChecker's 40 hardcoded
strings (action phrases, denial reasons, PvP, entity damage, combat
tag) to HFMessages.get() with server-default language fallback.
…8n keys (Phase 1f)

Convert AnnouncementManager to per-player i18n resolution for server
broadcasts. Migrate TeleportManager's 10 hardcoded strings (warmup,
cooldown, cancellation messages) and ChatManager's channel display
names. Add mount entry/teleport blocking messages from
TerritoryTickingSystem. Completes Phase 1 command/system migration.
Replace hardcoded help content with build-generated .lang files from
markdown sources. Add HelpLangGenerator build-time tool that parses
22 markdown topic files into hyperfactions_help.lang and
help-manifest.json. Refactor HelpRegistry to load structure from
manifest, HelpMessages to delegate to HFMessages/I18nModule, and
HelpCategory to use i18n display name keys. Create initial
hyperfactions_gui.lang with help category names. Add generateHelpLang
Gradle task wired into processResources.
Migrate navigation infrastructure to resolve display names via i18n keys
instead of hardcoded English strings. NavBarUtil.buildButtons() now accepts
PlayerRef and resolves keys through HFMessages. All page registry entries
in GuiManager updated to use MessageKeys constants.

Shared pages migrated: MainMenuPage (section titles), FactionInfoPage
(status labels, descriptions), RenameModalPage, DescriptionModalPage,
TagModalPage (all validation/success messages).

New files: hyperfactions_admin.lang (admin nav keys).
Migrate ~55 hardcoded English strings to i18n keys across both pages.
Reuse existing command keys (Home, Claim, Common, Leave) where messages
are semantically identical. Add DashboardGui and FactionMainGui key
classes for page-specific labels and messages.
…hase 3c)

Migrate all hardcoded English strings in FactionMembersPage, FactionBrowserPage,
FactionLeaderboardPage, and PlayerInfoPage to use HFMessages.get() with MessageKeys.
Add GuiCommon, MembersGui, BrowserGui, LeaderboardGui, and PlayerInfoGui key classes.
Migrate all hardcoded English strings in FactionRelationsPage,
SetRelationModalPage, FactionSettingsPage, and FactionModulesPage to
use HFMessages.get() with MessageKeys. Add RelationsGui, SettingsGui,
and ModulesGui key classes. Relation type labels use internal English
identifiers for logic with localizeType() resolving display text.
Migrate all 5 treasury page classes to i18n:
- TreasuryPage: dashboard stats, upkeep, transaction type names, actor names
- TreasuryDepositModalPage: deposit/withdraw modal labels and messages
- TreasuryTransferSearchPage: search results, player/faction tags
- TreasuryTransferConfirmPage: fee labels, transfer result messages
- TreasurySettingsPage: leader-only permission errors, limit validation

Add ~70 treasury keys to MessageKeys.TreasuryGui and hyperfactions_gui.lang.
…e 3f)

Migrate hardcoded strings to i18n keys across 8 remaining faction GUI pages:
- DisbandConfirmPage, LeaderLeaveConfirmPage, LeaveConfirmPage, TransferConfirmPage
- LogsViewerPage, FactionChatPage, FactionInvitesPage, ChunkMapPage

Adds ConfirmGui, LogsGui, ChatGui, InvitesGui, and MapGui key groups
with ~90 new translation entries in hyperfactions_gui.lang.
Migrate 85+ hardcoded strings across 4 new player GUI pages to i18n keys:
- CreateFactionPage: preview labels, validation errors, success messages
- InvitesPage: headers, counts, time formats, join result messages
- NewPlayerBrowsePage: sort dropdown, status badges, action buttons, join/request flows
- NewPlayerMapPage: position info, hint text, legend labels

Add CreateGui and NewPlayerGui inner classes to MessageKeys with 53 new keys.
Add MessageUtil.text() overload for i18n with color parameter.
Reuse existing keys: FactionInfoGui.STATUS_*, SettingsGui.PVP_*, MapGui.POSITION,
MapGui.LEGEND_PROTECTED, Common.ALREADY_IN_FACTION, Common.FACTION_NOT_FOUND.
@derrickmehaffy derrickmehaffy self-assigned this Mar 10, 2026
@derrickmehaffy derrickmehaffy added the enhancement New feature or request label Mar 10, 2026
Migrate all 25 admin page files to use HFMessages.get() and MessageKeys.
Add ~170 admin i18n keys to MessageKeys.AdminGui and hyperfactions_admin.lang
covering dashboard, actions, factions, members, relations, settings,
players, economy, zones, zone map, zone wizard, and version pages.
…ces (Phase 5)

- PlayerSettingsPage with language dropdown and notification toggles
- Language override cache in HFMessages for per-player i18n
- TerritoryNotifier checks player alert preferences before sending
- PlayerDeathSystem checks member preferences before death broadcasts
- /f settings player command opens personal settings
- Page registered in both faction and new player nav bars
- Preferences loaded on connect, cleared on disconnect
… (Phase 6)

- Full es-ES translations for commands, GUI, admin, and help content
- Stub .lang files for 7 additional locales (de-DE, fr-FR, ja-JP, pt-BR, ru-RU, tr-TR, zh-CN)
- Locale scaffolding scripts (new-translation.sh/bat)
- TRANSLATION_GUIDE.md with format docs and contribution process
- checkTranslations Gradle task to diff keys across locales
- fallback.lang for locale fallback documentation
- Rewrite player_settings.ui to follow established Container/Title/Content
  pattern from browse.ui and faction_settings.ui
- Fix crash from Style (HorizontalAlignment) on Group elements
- Fix DropdownBox crash by using DropdownEntryInfo with LocalizableString
  instead of plain List<String>, and string Value instead of integer index
- Move "Player" nav button to far right of both faction and new player
  nav bars using FlexWeight spacer pattern
- Remove player_settings from nav bar button list (rendered separately)
- Use rebuild() for state changes since page stores preferences as
  instance fields (async load race condition with openPlayerSettings)
- Replace hardcoded LOCALE_DISPLAY_NAMES list with Java's Locale class
  to generate native display names (e.g. "Español (España)")
- Add es-ES as second available locale in the language dropdown
- Fix es-ES nav.player_settings to match en-US ("Jugador" not "Ajustes")
Add cmd.set() calls to override hardcoded English text in all .ui
templates with HFMessages.get() lookups. Covers faction pages, admin
pages, shared/modal pages, new player pages, and help pages.

- Add ~570 new MessageKeys constants across all page domains
- Add ~280 new en-US .lang keys for GUI labels
- Add ~320 new es-ES admin .lang keys
- Add ~280 new es-ES GUI .lang keys
- Add element IDs to ~95 .ui template files for runtime text override
- Add common keys: clear, back, leave, transfer, disband
Add i18n support for remaining admin pages: zone creation wizard,
zone type change modal, and unclaim-all confirmation page. Fix
duplicate GUI_CANCEL constant in MessageKeys.
- Fix crash: #Title.Text selector on admin pages — add #PageTitle ID to
  all 29 admin .ui templates and update 28 Java files to use #PageTitle
- Fix help content showing English for non-English players — thread
  PlayerRef through HelpTopic.title(), HelpEntry.text(), and
  HelpMainPage.buildTopicCards() so help resolves per-player locale
- Fix category title using server default — use displayName(playerRef)
- Fix language dropdown truncation — use compact display names
  (English (US) instead of English (United States)) and widen to 220px
The custom serializePlayerData/deserializePlayerData methods in
JsonPlayerStorage did not include the i18n preference fields added
to PlayerData. Settings were saved in memory but lost on restart.

Also includes compact locale display names and help i18n threading
from earlier fixes that were committed separately.
The checkbox is shown but disabled since no power change
notifications are currently sent to players.
… config.json

Move help source files from src/main/help/{locale}/ to
src/main/resources/Server/Languages/{locale}/help/ so the build-time
HelpLangGenerator reads from the same directory structure as the
runtime language loader. Update translation scripts and build.gradle
to match the new path. Remove unused config.json (replaced by
per-feature config files in config/).
Restructure /f admin testgui and sentrytest under /f admin test <sub>
via new AdminTestHandler, adding /f admin test md for a future
markdown visual test page.

Extend the help system with 9 new markdown entry types: bold, italic,
list (bullet + numbered), separator, callout boxes (with colored
accent bars), inline hex colors ([#RRGGBB]), named color shortcuts
(!warning, !success, !note, !muted), and typed callouts (>[!WARNING],
>[!INFO], >[!NOTE], >[!SUCCESS], >[!TIP]).

HelpEntry gains a color field for dynamic color overrides. The
build-time HelpLangGenerator parses all new syntax and emits color
metadata in help-manifest.json. HelpRegistry and HelpMainPage handle
the new types at runtime, applying colors to text and callout accent
bars. Five new .ui templates support the visual rendering.

TIP entries are unified into CALLOUT (backward-compatible: old TIP
manifests render as green callouts).
Complete German translations for all 3 .lang files:
hyperfactions.lang, hyperfactions_gui.lang, hyperfactions_admin.lang
Complete French translations for all 3 .lang files:
hyperfactions.lang, hyperfactions_gui.lang, hyperfactions_admin.lang
Complete Brazilian Portuguese translations for all 3 .lang files:
hyperfactions.lang, hyperfactions_gui.lang, hyperfactions_admin.lang
Complete Simplified Chinese translations for all 3 .lang files:
hyperfactions.lang, hyperfactions_gui.lang, hyperfactions_admin.lang
Complete Japanese translations for all 3 .lang files:
hyperfactions.lang, hyperfactions_gui.lang, hyperfactions_admin.lang
Complete Russian translations for all 3 .lang files:
hyperfactions.lang, hyperfactions_gui.lang, hyperfactions_admin.lang
Complete Korean translations for all 3 .lang files:
hyperfactions.lang, hyperfactions_gui.lang, hyperfactions_admin.lang
Complete Polish translations for all 3 .lang files:
hyperfactions.lang, hyperfactions_gui.lang, hyperfactions_admin.lang
Complete Italian translations for all 3 .lang files:
hyperfactions.lang, hyperfactions_gui.lang, hyperfactions_admin.lang
Complete Dutch translations for all 3 .lang files:
hyperfactions.lang, hyperfactions_gui.lang, hyperfactions_admin.lang
Complete Filipino/Tagalog translations for all 3 .lang files:
hyperfactions.lang, hyperfactions_gui.lang, hyperfactions_admin.lang
- Update AVAILABLE_LOCALES to include all 13 supported languages
- Update fallback.lang documentation with all locale statuses
- Add GitHub Action to verify missing translation keys on push/PR
Hytale client does not currently support CJK characters, so these
translations cannot render in-game. Removed until character support
is added.
Translate all 42 help markdown files into French, covering welcome,
faction management, power/land, diplomacy, combat, economy, quick
reference, and all admin sections.
Translate all 42 help markdown files into Brazilian Portuguese, covering
welcome, faction management, power/land, diplomacy, combat, economy,
quick reference, and all admin sections.
Translate all 42 help markdown files into Russian, covering welcome,
faction management, power/land, diplomacy, combat, economy, quick
reference, and all admin sections.
Translate all 42 help markdown files into Italian, covering welcome,
faction management, power/land, diplomacy, combat, economy, quick
reference, and all admin sections.
Translate all 42 help markdown files into Polish, covering welcome,
faction management, power/land, diplomacy, combat, economy, quick
reference, and all admin sections.
Translate all 42 help markdown files into German, covering welcome,
faction management, power/land, diplomacy, combat, economy, quick
reference, and all admin sections.
Translate all 42 help markdown files into Dutch, covering welcome,
faction management, power/land, diplomacy, combat, economy, quick
reference, and all admin sections.
Translate all 42 help markdown files into Filipino/Tagalog, covering
welcome, faction management, power/land, diplomacy, combat, economy,
quick reference, and all admin sections.
Add a second job that verifies all locales have matching help .md files
relative to en-US. Detects missing files (error), untranslated files
identical to en-US (warning), and extra files not in en-US (notice).
Also narrows trigger to pull_request only.
@derrickmehaffy
derrickmehaffy marked this pull request as ready for review March 13, 2026 01:23
@derrickmehaffy

Copy link
Copy Markdown
Contributor Author

Couldn't do CN, JP, KO because the game doesn't support encoding for those languages

@derrickmehaffy
derrickmehaffy merged commit 184fbf7 into releases/0.12.0 Mar 13, 2026
2 checks passed
@derrickmehaffy
derrickmehaffy deleted the feat/i18n branch March 13, 2026 01:26
derrickmehaffy added a commit that referenced this pull request Mar 19, 2026
* feat: Add built-in localization (i18n) support (#92)

* feat: add i18n infrastructure (Phase 0)

Add the foundational i18n system following Ecotale's proven pattern
with Hytale's native I18nModule:

- HFMessages: translation resolution engine with player/server language
  support and {0}/{1} placeholder formatting
- MessageKeys: static key constants organized by nested inner classes
  covering common, commands, protection, territory, GUI nav, and more
- MessageUtil: i18n-aware overloads (PlayerRef + key) alongside existing
  string-literal methods for gradual migration
- ServerConfig: defaultLanguage and usePlayerLanguage settings with
  JSON load/write support
- ConfigManager: convenience accessors for language settings
- PlayerData: languagePreference and notification preference fields
  (territoryAlerts, deathAnnouncements, powerNotifications)
- en-US/hyperfactions.lang: initial common.* translation keys (~25 keys)

* feat: migrate faction management and claim commands to i18n keys (Phase 1a)

Migrate hardcoded English strings to MessageKeys constants for:
- FactionSubCommand.requireFaction()
- Create, Disband, Rename, Desc, Open, Close, Color commands
- Claim command (territory)

Add corresponding keys to MessageKeys.java and hyperfactions.lang.

* feat: migrate member commands to i18n keys (Phase 1b)

Migrate hardcoded English strings to MessageKeys constants for:
- Invite, Accept/Join, Kick, Leave commands
- Promote, Demote, Transfer commands

Add corresponding keys to MessageKeys.java and hyperfactions.lang.

* feat: migrate territory and teleport commands to i18n keys (Phase 1c)

Migrate hardcoded English strings to MessageKeys constants for:
- Unclaim, Overclaim, Stuck commands (territory)
- Home, SetHome, DelHome commands (teleport)

Add corresponding keys to MessageKeys.java and hyperfactions.lang.

* feat: migrate relation, social, info, and economy commands to i18n keys (Phase 1d)

Migrate hardcoded English strings to MessageKeys constants for:
- Ally, Enemy, Neutral, Relations commands (relation)
- Chat, Invites, Request commands (social)
- Info, Members, List, Help, Who, Map, Power commands (info)
- Money, TreasuryCommandHandler (economy)

Add Invites and Request inner classes to MessageKeys. Expand
Relation, Chat, Info, Power, and Economy classes with new keys.

* feat: migrate UI commands and ProtectionChecker to i18n keys (Phase 1e)

Migrate GuiSubCommand, SettingsSubCommand, FactionCommand to use
MessageKeys constants. Convert ProtectionChecker's 40 hardcoded
strings (action phrases, denial reasons, PvP, entity damage, combat
tag) to HFMessages.get() with server-default language fallback.

* feat: migrate AnnouncementManager, TeleportManager, ChatManager to i18n keys (Phase 1f)

Convert AnnouncementManager to per-player i18n resolution for server
broadcasts. Migrate TeleportManager's 10 hardcoded strings (warmup,
cooldown, cancellation messages) and ChatManager's channel display
names. Add mount entry/teleport blocking messages from
TerritoryTickingSystem. Completes Phase 1 command/system migration.

* feat: add help system markdown-to-lang build pipeline (Phase 2)

Replace hardcoded help content with build-generated .lang files from
markdown sources. Add HelpLangGenerator build-time tool that parses
22 markdown topic files into hyperfactions_help.lang and
help-manifest.json. Refactor HelpRegistry to load structure from
manifest, HelpMessages to delegate to HFMessages/I18nModule, and
HelpCategory to use i18n display name keys. Create initial
hyperfactions_gui.lang with help category names. Add generateHelpLang
Gradle task wired into processResources.

* chore: exclude build package from gitignore pattern

* feat: localize nav system, shared pages, and modal pages (Phase 3a)

Migrate navigation infrastructure to resolve display names via i18n keys
instead of hardcoded English strings. NavBarUtil.buildButtons() now accepts
PlayerRef and resolves keys through HFMessages. All page registry entries
in GuiManager updated to use MessageKeys constants.

Shared pages migrated: MainMenuPage (section titles), FactionInfoPage
(status labels, descriptions), RenameModalPage, DescriptionModalPage,
TagModalPage (all validation/success messages).

New files: hyperfactions_admin.lang (admin nav keys).

* feat: localize FactionDashboardPage and FactionMainPage (Phase 3b)

Migrate ~55 hardcoded English strings to i18n keys across both pages.
Reuse existing command keys (Home, Claim, Common, Leave) where messages
are semantically identical. Add DashboardGui and FactionMainGui key
classes for page-specific labels and messages.

* feat: localize Members, Browser, Leaderboard, and PlayerInfo pages (Phase 3c)

Migrate all hardcoded English strings in FactionMembersPage, FactionBrowserPage,
FactionLeaderboardPage, and PlayerInfoPage to use HFMessages.get() with MessageKeys.
Add GuiCommon, MembersGui, BrowserGui, LeaderboardGui, and PlayerInfoGui key classes.

* feat: localize Relations, Settings, and Modules pages (Phase 3d)

Migrate all hardcoded English strings in FactionRelationsPage,
SetRelationModalPage, FactionSettingsPage, and FactionModulesPage to
use HFMessages.get() with MessageKeys. Add RelationsGui, SettingsGui,
and ModulesGui key classes. Relation type labels use internal English
identifiers for logic with localizeType() resolving display text.

* feat: localize Treasury pages (Phase 3e)

Migrate all 5 treasury page classes to i18n:
- TreasuryPage: dashboard stats, upkeep, transaction type names, actor names
- TreasuryDepositModalPage: deposit/withdraw modal labels and messages
- TreasuryTransferSearchPage: search results, player/faction tags
- TreasuryTransferConfirmPage: fee labels, transfer result messages
- TreasurySettingsPage: leader-only permission errors, limit validation

Add ~70 treasury keys to MessageKeys.TreasuryGui and hyperfactions_gui.lang.

* feat: localize confirmation, logs, chat, invites, and map pages (Phase 3f)

Migrate hardcoded strings to i18n keys across 8 remaining faction GUI pages:
- DisbandConfirmPage, LeaderLeaveConfirmPage, LeaveConfirmPage, TransferConfirmPage
- LogsViewerPage, FactionChatPage, FactionInvitesPage, ChunkMapPage

Adds ConfirmGui, LogsGui, ChatGui, InvitesGui, and MapGui key groups
with ~90 new translation entries in hyperfactions_gui.lang.

* feat: localize create faction and new player pages (Phase 3g)

Migrate 85+ hardcoded strings across 4 new player GUI pages to i18n keys:
- CreateFactionPage: preview labels, validation errors, success messages
- InvitesPage: headers, counts, time formats, join result messages
- NewPlayerBrowsePage: sort dropdown, status badges, action buttons, join/request flows
- NewPlayerMapPage: position info, hint text, legend labels

Add CreateGui and NewPlayerGui inner classes to MessageKeys with 53 new keys.
Add MessageUtil.text() overload for i18n with color parameter.
Reuse existing keys: FactionInfoGui.STATUS_*, SettingsGui.PVP_*, MapGui.POSITION,
MapGui.LEGEND_PROTECTED, Common.ALREADY_IN_FACTION, Common.FACTION_NOT_FOUND.

* feat: localize admin GUI pages (Phase 4)

Migrate all 25 admin page files to use HFMessages.get() and MessageKeys.
Add ~170 admin i18n keys to MessageKeys.AdminGui and hyperfactions_admin.lang
covering dashboard, actions, factions, members, relations, settings,
players, economy, zones, zone map, zone wizard, and version pages.

* feat: add Player Settings GUI with language and notification preferences (Phase 5)

- PlayerSettingsPage with language dropdown and notification toggles
- Language override cache in HFMessages for per-player i18n
- TerritoryNotifier checks player alert preferences before sending
- PlayerDeathSystem checks member preferences before death broadcasts
- /f settings player command opens personal settings
- Page registered in both faction and new player nav bars
- Preferences loaded on connect, cleared on disconnect

* feat: add Spanish translations, locale stubs, and translator workflow (Phase 6)

- Full es-ES translations for commands, GUI, admin, and help content
- Stub .lang files for 7 additional locales (de-DE, fr-FR, ja-JP, pt-BR, ru-RU, tr-TR, zh-CN)
- Locale scaffolding scripts (new-translation.sh/bat)
- TRANSLATION_GUIDE.md with format docs and contribution process
- checkTranslations Gradle task to diff keys across locales
- fallback.lang for locale fallback documentation

* fix: redesign Player Settings UI and fix nav bar placement

- Rewrite player_settings.ui to follow established Container/Title/Content
  pattern from browse.ui and faction_settings.ui
- Fix crash from Style (HorizontalAlignment) on Group elements
- Fix DropdownBox crash by using DropdownEntryInfo with LocalizableString
  instead of plain List<String>, and string Value instead of integer index
- Move "Player" nav button to far right of both faction and new player
  nav bars using FlexWeight spacer pattern
- Remove player_settings from nav bar button list (rendered separately)
- Use rebuild() for state changes since page stores preferences as
  instance fields (async load race condition with openPlayerSettings)

* feat: use native locale display names and add es-ES to language selector

- Replace hardcoded LOCALE_DISPLAY_NAMES list with Java's Locale class
  to generate native display names (e.g. "Español (España)")
- Add es-ES as second available locale in the language dropdown
- Fix es-ES nav.player_settings to match en-US ("Jugador" not "Ajustes")

* feat: localize all GUI pages with i18n support

Add cmd.set() calls to override hardcoded English text in all .ui
templates with HFMessages.get() lookups. Covers faction pages, admin
pages, shared/modal pages, new player pages, and help pages.

- Add ~570 new MessageKeys constants across all page domains
- Add ~280 new en-US .lang keys for GUI labels
- Add ~320 new es-ES admin .lang keys
- Add ~280 new es-ES GUI .lang keys
- Add element IDs to ~95 .ui template files for runtime text override
- Add common keys: clear, back, leave, transfer, disband

* feat: localize admin zone wizard, unclaim confirm, and type modal pages

Add i18n support for remaining admin pages: zone creation wizard,
zone type change modal, and unclaim-all confirmation page. Fix
duplicate GUI_CANCEL constant in MessageKeys.

* fix: admin GUI crash, help i18n resolution, and dropdown display names

- Fix crash: #Title.Text selector on admin pages — add #PageTitle ID to
  all 29 admin .ui templates and update 28 Java files to use #PageTitle
- Fix help content showing English for non-English players — thread
  PlayerRef through HelpTopic.title(), HelpEntry.text(), and
  HelpMainPage.buildTopicCards() so help resolves per-player locale
- Fix category title using server default — use displayName(playerRef)
- Fix language dropdown truncation — use compact display names
  (English (US) instead of English (United States)) and widen to 220px

* fix: persist player preferences to JSON storage

The custom serializePlayerData/deserializePlayerData methods in
JsonPlayerStorage did not include the i18n preference fields added
to PlayerData. Settings were saved in memory but lost on restart.

Also includes compact locale display names and help i18n threading
from earlier fixes that were committed separately.

* fix: disable Power Notifications toggle (not yet wired up)

The checkbox is shown but disabled since no power change
notifications are currently sent to players.

* refactor: relocate help markdown to Server/Languages and remove stale config.json

Move help source files from src/main/help/{locale}/ to
src/main/resources/Server/Languages/{locale}/help/ so the build-time
HelpLangGenerator reads from the same directory structure as the
runtime language loader. Update translation scripts and build.gradle
to match the new path. Remove unused config.json (replaced by
per-feature config files in config/).

* feat: restructure admin test commands and extend help markdown syntax

Restructure /f admin testgui and sentrytest under /f admin test <sub>
via new AdminTestHandler, adding /f admin test md for a future
markdown visual test page.

Extend the help system with 9 new markdown entry types: bold, italic,
list (bullet + numbered), separator, callout boxes (with colored
accent bars), inline hex colors ([#RRGGBB]), named color shortcuts
(!warning, !success, !note, !muted), and typed callouts (>[!WARNING],
>[!INFO], >[!NOTE], >[!SUCCESS], >[!TIP]).

HelpEntry gains a color field for dynamic color overrides. The
build-time HelpLangGenerator parses all new syntax and emits color
metadata in help-manifest.json. HelpRegistry and HelpMainPage handle
the new types at runtime, applying colors to text and callout accent
bars. Five new .ui templates support the visual rendering.

TIP entries are unified into CALLOUT (backward-compatible: old TIP
manifests render as green callouts).

* feat: add markdown rendering test page (/f admin test md)

Visual test page that renders every supported help markdown entry
type using the real .ui templates. Shows syntax labels alongside
rendered output for verification: text, heading, command, bold,
italic, bullet/numbered lists, separators, hex colors, named color
shortcuts, and all callout box types. Includes edge cases for text
wrapping and mixed content flow.

* docs: add help markdown style guide and move translation guide to docs/

Add docs/help-markdown.md covering the full help markdown syntax
(bold, italic, lists, separators, colors, callouts) with examples.

Move TRANSLATION_GUIDE.md to docs/translation-guide.md and update it
with the new syntax types and clear guidance on what to translate
vs. what to keep (color codes, callout type tags, named shortcuts
stay in English across all locales).

* feat: add new UI Gallery elements to button test page

Add elements discovered from 2026.02.17 UI Gallery to the element
test page: TabNavigation with HeaderTabsStyle, MultilineTextField,
tooltip demo (TooltipText + DefaultTextTooltipStyle), ContentSeparator
and PanelSeparatorFancy, ProgressBar template, HeaderSearch, Panel
and SimpleContainer variants. Update command reference to /f admin
test gui.

* fix: pin markdown test page title bar to top of container

* fix: remove invalid #Title/#Content slots from Panel and SimpleContainer

These templates are flat containers — content goes directly inside
with no insertion point wrappers. Only @Container/@DecoratedContainer
have #Title/#Content slots.

* fix: enable text wrapping and vertical centering in help templates

Replace fixed Height with auto-sizing (remove Anchor Height, use
Padding for spacing). Add Wrap: true to all Label styles so long
text wraps instead of truncating with ellipsis. Add VerticalAlignment:
Center for proper vertical text positioning.

Applies to all 8 help line templates: text, command, heading, bold,
italic, list, tip, and callout.

* feat: add table support to help markdown system

Tables use standard markdown pipe syntax (| col | col |) with
separator rows for headers. Supports per-cell inline formatting
(**bold**, *italic*, `command`, [#hex] colors) and row-level
color overrides. Includes 4 new .ui templates, parser/registry/
renderer updates, and visual test entries.

* fix: improve table visual styling with GitHub-style grid borders

Redesign table templates with proper grid lines: left border on each
cell for column separators, top/bottom borders on rows, header row
background, 200px cell width with generous padding. Add per-cell
inline formatting support (bold, italic, command, hex colors).

* feat: add admin help infrastructure with category filtering

Add 8 admin help categories (ADMIN_OVERVIEW through ADMIN_REFERENCE)
to HelpCategory enum with isAdmin() filter. Rewrite AdminHelpPage from
placeholder to full sidebar+content rendering. Filter admin categories
from player HelpMainPage. Add admin directory scanning to
HelpLangGenerator build pipeline.

* feat: rewrite player help categories 1-4 (en-US) with enhanced formatting

Comprehensive rewrite of welcome, your_faction, power_land, and
diplomacy help using tables, callouts, bold formatting, and accurate
default config values. 14 topics expanded with detailed mechanics.

* feat: rewrite player help categories 5-7 (en-US), add spawn protection/upkeep/permissions topics

Rewrite combat, economy, and quick_ref help with enhanced formatting.
Add 3 new topics: spawn_protection (combat mechanics), upkeep (territory
maintenance costs), and permissions (key permission nodes reference).

* feat: add comprehensive admin help content (en-US) — 18 topics across 8 categories

Complete admin help documentation covering overview, faction management,
zones, power manipulation, economy, configuration, maintenance (backups,
updates, imports), and admin command reference. All values sourced from
actual config defaults and handler implementations.

* feat: rewrite Spanish player help translations (es-ES) — 25 topics

Full rewrite of all es-ES player help to match updated en-US content.
Preserves command syntax, markdown formatting, and frontmatter IDs.
Includes 3 new topics: spawn_protection, upkeep, permissions.

* feat: add Spanish admin help translations (es-ES), remove placeholder languages

Add 18 es-ES admin help topics mirroring en-US structure. Remove
de-DE, fr-FR, ja-JP, pt-BR, ru-RU, tr-TR, zh-CN placeholder
translations — will be regenerated later with complete content.

* fix: strip inline markdown markers, join continuation lines, fix invalid commands

- Add inline marker stripping to HelpLangGenerator (build-time):
  **bold** → bold, `code` → code, *italic* → italic, -- → em-dash
- Join multi-line prose into single lines (each line = one UI entry)
- Remove non-existent /f admin modify and /f admin bypass references
- Fix duplicate debug toggle entry in admin command reference
- Apply same fixes to both en-US and es-ES help content

* feat: table rendering with inline rows, rich text, and help window resize

- Switch table rendering from .ui templates to appendInline with explicit
  calculated heights (fixes content-driven height not working with TextSpans)
- Support 2/3/4 column tables with dynamic width calculation and borders
- Add HelpRichText parser for inline markdown (bold, italic, code, colors)
- Increase help window size ~15% (750x650 → 863x748) for both player/admin
- Fix Y/N → Yes/No in roles permission table
- Use 2px row borders for visibility on all table rows
- Remove stripped inline markers from lang generator (rich text handles them)

* fix: remove duplicate gui.cancel key in admin lang files

Hytale's I18nModule rejects the entire lang file when it encounters a
duplicate key, causing ALL admin GUI translations to show raw keys.

* feat: localize GUI labels for es-ES — browse stats, log time/types, sort labels

Add i18n support for previously hardcoded English text across player and
admin GUI pages: browse entry stat labels (power/claims/members), activity
log time formatting and type names, leaderboard/browser/members sort labels.
Fix truncated Spanish button text (relations, settings, sort labels).

* feat(i18n): localize admin GUI pages, entry templates, and zone flag display names

Localize admin dashboard stats, faction/player/zone list entries,
activity log types and timestamps, economy/treasury labels, zone
flags with display names, integration flags, relation buttons,
action buttons, and faction log enhancements. Add ~100 new keys
to both en-US and es-ES admin and GUI lang files.

* feat(i18n): localize player member and browser entry templates

Add #IDs to anonymous labels in member_entry.ui (Power, Joined,
Last Death) and wire cmd.set() for all entry-level labels and
buttons in FactionMembersPage. Add no_description fallback key
for browser entries. Widen Recruitment label for Spanish. Add
11 new keys to both en-US and es-ES gui lang files.

* feat(i18n): localize admin member entries and player info page

Add #IDs to anonymous labels in admin_faction_members_entry.ui,
wire cmd.set() for entry labels and buttons in
AdminFactionMembersPage. Localize formatReason(), bypass checkbox
labels, and NoFactionLabel in AdminPlayerInfoPage. Widen sort
label and teleport button for Spanish. Add 13 new keys per locale.

* feat(i18n): localize player invite and relation entry templates

Add #IDs to anonymous labels in faction_invite_entry.ui and
faction_relation_entry.ui, wire cmd.set() for all entry-level labels
and buttons in FactionInvitesPage and FactionRelationsPage, add 17
new MessageKeys constants, and add en-US/es-ES lang entries.

Width adjustments: ClaimsLabel 50->55px, DirectionLabel 65->70px
for Spanish translations.

* feat(i18n): localize all hardcoded Java strings in GUI pages

Replace hardcoded English strings with HFMessages.get() calls:
- FactionPageOpener: "Treasury is not available." (5 occurrences)
- AdminPageOpener: "Economy system is not enabled." (3 occurrences)
- AdminFactionInfoPage: "+N more" officer list truncation
- FactionDashboardPage: "in <duration>" upkeep time prefix
- AdminVersionPage: "Unknown" fallbacks
- AdminActivityLogPage: "1h"/"24h"/"7d"/"All" time filter labels
- CreateZoneWizardPage: "circular"/"square" shape names
- ZoneChangeTypeModalPage: "flags reset"/"flags kept"

Add 14 new MessageKeys constants and en-US/es-ES lang entries.

* feat(i18n): localize admin nav bar title and economy entry buttons

Wire cmd.set() for Admin Panel title in AdminNavBarHelper and
Adjust/Info button text in AdminEconomyPage entries. Add 3 new
MessageKeys constants and en-US/es-ES lang entries.

Stage 5 (new player pages) already fully localized — no changes needed.

* feat(i18n): localize remaining hardcoded fallbacks and format strings

Replace all "Unknown", "None", "world", "another zone" fallbacks with
localized equivalents across admin and player GUI pages. Localize
treasury upkeep cost format ("every Nh") and time-left display strings.

* fix(i18n): resolve Spanish truncation, crashes, and missing translations across GUI

- Widen label/button widths across admin pages for longer Spanish text:
  player info (Primera conexion, Ultima conexion, Set/Reset/SetMax buttons),
  sort labels (Ordenar:) on players/economy/zones/members pages,
  bypass state label (Desactivado) on dashboard, teleport button and
  last online label on player entries, lock hints on faction settings
  and create faction pages
- Fix admin player info crash: replace CheckBoxWithLabel @Text (not
  dynamically settable) with empty checkbox + separate addressable labels
  for bypass toggles (Sin Perdida de Poder / Sin Decaimiento de Reclamos)
- Widen admin player info container 720->780px for button space
- Add lock hint Wrap:true and increased height for long Spanish text
- Fix treasury column widths to fit Spanish type names (Transferencia)
- Fix help table 4-column widths for longer Spanish headers
- Add missing NOTE callout to es-ES combat/tagging.md (line count parity)
- Remove unsupported mid-text color code from es-ES alliances table
- Add i18n cmd.set() calls for new player map page legend labels

* i18n: add German (de-DE) translations

Complete German translations for all 3 .lang files:
hyperfactions.lang, hyperfactions_gui.lang, hyperfactions_admin.lang

* i18n: add French (fr-FR) translations

Complete French translations for all 3 .lang files:
hyperfactions.lang, hyperfactions_gui.lang, hyperfactions_admin.lang

* i18n: add Brazilian Portuguese (pt-BR) translations

Complete Brazilian Portuguese translations for all 3 .lang files:
hyperfactions.lang, hyperfactions_gui.lang, hyperfactions_admin.lang

* i18n: add Simplified Chinese (zh-CN) translations

Complete Simplified Chinese translations for all 3 .lang files:
hyperfactions.lang, hyperfactions_gui.lang, hyperfactions_admin.lang

* i18n: add Japanese (ja-JP) translations

Complete Japanese translations for all 3 .lang files:
hyperfactions.lang, hyperfactions_gui.lang, hyperfactions_admin.lang

* i18n: add Russian (ru-RU) translations

Complete Russian translations for all 3 .lang files:
hyperfactions.lang, hyperfactions_gui.lang, hyperfactions_admin.lang

* i18n: add Korean (ko-KR) translations

Complete Korean translations for all 3 .lang files:
hyperfactions.lang, hyperfactions_gui.lang, hyperfactions_admin.lang

* i18n: add Polish (pl-PL) translations

Complete Polish translations for all 3 .lang files:
hyperfactions.lang, hyperfactions_gui.lang, hyperfactions_admin.lang

* i18n: add Italian (it-IT) translations

Complete Italian translations for all 3 .lang files:
hyperfactions.lang, hyperfactions_gui.lang, hyperfactions_admin.lang

* i18n: add Dutch (nl-NL) translations

Complete Dutch translations for all 3 .lang files:
hyperfactions.lang, hyperfactions_gui.lang, hyperfactions_admin.lang

* i18n: add Filipino/Tagalog (tl-PH) translations

Complete Filipino/Tagalog translations for all 3 .lang files:
hyperfactions.lang, hyperfactions_gui.lang, hyperfactions_admin.lang

* i18n: add all 13 locales to settings dropdown and CI verification

- Update AVAILABLE_LOCALES to include all 13 supported languages
- Update fallback.lang documentation with all locale statuses
- Add GitHub Action to verify missing translation keys on push/PR

* i18n: remove zh-CN, ja-JP, ko-KR locales

Hytale client does not currently support CJK characters, so these
translations cannot render in-game. Removed until character support
is added.

* i18n: add French (fr-FR) help file translations

Translate all 42 help markdown files into French, covering welcome,
faction management, power/land, diplomacy, combat, economy, quick
reference, and all admin sections.

* i18n: add Brazilian Portuguese (pt-BR) help file translations

Translate all 42 help markdown files into Brazilian Portuguese, covering
welcome, faction management, power/land, diplomacy, combat, economy,
quick reference, and all admin sections.

* i18n: add Russian (ru-RU) help file translations

Translate all 42 help markdown files into Russian, covering welcome,
faction management, power/land, diplomacy, combat, economy, quick
reference, and all admin sections.

* i18n: add Italian (it-IT) help file translations

Translate all 42 help markdown files into Italian, covering welcome,
faction management, power/land, diplomacy, combat, economy, quick
reference, and all admin sections.

* i18n: add Polish (pl-PL) help file translations

Translate all 42 help markdown files into Polish, covering welcome,
faction management, power/land, diplomacy, combat, economy, quick
reference, and all admin sections.

* i18n: add German (de-DE) help file translations

Translate all 42 help markdown files into German, covering welcome,
faction management, power/land, diplomacy, combat, economy, quick
reference, and all admin sections.

* i18n: add Dutch (nl-NL) help file translations

Translate all 42 help markdown files into Dutch, covering welcome,
faction management, power/land, diplomacy, combat, economy, quick
reference, and all admin sections.

* i18n: add Filipino/Tagalog (tl-PH) help file translations

Translate all 42 help markdown files into Filipino/Tagalog, covering
welcome, faction management, power/land, diplomacy, combat, economy,
quick reference, and all admin sections.

* ci: add help file verification to check-translations workflow

Add a second job that verifies all locales have matching help .md files
relative to en-US. Detects missing files (error), untranslated files
identical to en-US (warning), and extra files not in en-US (notice).
Also narrows trigger to pull_request only.

* feat: add SimpleClaims data importer (#99)

* feat: add i18n infrastructure (Phase 0)

Add the foundational i18n system following Ecotale's proven pattern
with Hytale's native I18nModule:

- HFMessages: translation resolution engine with player/server language
  support and {0}/{1} placeholder formatting
- MessageKeys: static key constants organized by nested inner classes
  covering common, commands, protection, territory, GUI nav, and more
- MessageUtil: i18n-aware overloads (PlayerRef + key) alongside existing
  string-literal methods for gradual migration
- ServerConfig: defaultLanguage and usePlayerLanguage settings with
  JSON load/write support
- ConfigManager: convenience accessors for language settings
- PlayerData: languagePreference and notification preference fields
  (territoryAlerts, deathAnnouncements, powerNotifications)
- en-US/hyperfactions.lang: initial common.* translation keys (~25 keys)

* feat: migrate faction management and claim commands to i18n keys (Phase 1a)

Migrate hardcoded English strings to MessageKeys constants for:
- FactionSubCommand.requireFaction()
- Create, Disband, Rename, Desc, Open, Close, Color commands
- Claim command (territory)

Add corresponding keys to MessageKeys.java and hyperfactions.lang.

* feat: migrate member commands to i18n keys (Phase 1b)

Migrate hardcoded English strings to MessageKeys constants for:
- Invite, Accept/Join, Kick, Leave commands
- Promote, Demote, Transfer commands

Add corresponding keys to MessageKeys.java and hyperfactions.lang.

* feat: migrate territory and teleport commands to i18n keys (Phase 1c)

Migrate hardcoded English strings to MessageKeys constants for:
- Unclaim, Overclaim, Stuck commands (territory)
- Home, SetHome, DelHome commands (teleport)

Add corresponding keys to MessageKeys.java and hyperfactions.lang.

* feat: migrate relation, social, info, and economy commands to i18n keys (Phase 1d)

Migrate hardcoded English strings to MessageKeys constants for:
- Ally, Enemy, Neutral, Relations commands (relation)
- Chat, Invites, Request commands (social)
- Info, Members, List, Help, Who, Map, Power commands (info)
- Money, TreasuryCommandHandler (economy)

Add Invites and Request inner classes to MessageKeys. Expand
Relation, Chat, Info, Power, and Economy classes with new keys.

* feat: migrate UI commands and ProtectionChecker to i18n keys (Phase 1e)

Migrate GuiSubCommand, SettingsSubCommand, FactionCommand to use
MessageKeys constants. Convert ProtectionChecker's 40 hardcoded
strings (action phrases, denial reasons, PvP, entity damage, combat
tag) to HFMessages.get() with server-default language fallback.

* feat: migrate AnnouncementManager, TeleportManager, ChatManager to i18n keys (Phase 1f)

Convert AnnouncementManager to per-player i18n resolution for server
broadcasts. Migrate TeleportManager's 10 hardcoded strings (warmup,
cooldown, cancellation messages) and ChatManager's channel display
names. Add mount entry/teleport blocking messages from
TerritoryTickingSystem. Completes Phase 1 command/system migration.

* feat: add help system markdown-to-lang build pipeline (Phase 2)

Replace hardcoded help content with build-generated .lang files from
markdown sources. Add HelpLangGenerator build-time tool that parses
22 markdown topic files into hyperfactions_help.lang and
help-manifest.json. Refactor HelpRegistry to load structure from
manifest, HelpMessages to delegate to HFMessages/I18nModule, and
HelpCategory to use i18n display name keys. Create initial
hyperfactions_gui.lang with help category names. Add generateHelpLang
Gradle task wired into processResources.

* chore: exclude build package from gitignore pattern

* feat: localize nav system, shared pages, and modal pages (Phase 3a)

Migrate navigation infrastructure to resolve display names via i18n keys
instead of hardcoded English strings. NavBarUtil.buildButtons() now accepts
PlayerRef and resolves keys through HFMessages. All page registry entries
in GuiManager updated to use MessageKeys constants.

Shared pages migrated: MainMenuPage (section titles), FactionInfoPage
(status labels, descriptions), RenameModalPage, DescriptionModalPage,
TagModalPage (all validation/success messages).

New files: hyperfactions_admin.lang (admin nav keys).

* feat: localize FactionDashboardPage and FactionMainPage (Phase 3b)

Migrate ~55 hardcoded English strings to i18n keys across both pages.
Reuse existing command keys (Home, Claim, Common, Leave) where messages
are semantically identical. Add DashboardGui and FactionMainGui key
classes for page-specific labels and messages.

* feat: localize Members, Browser, Leaderboard, and PlayerInfo pages (Phase 3c)

Migrate all hardcoded English strings in FactionMembersPage, FactionBrowserPage,
FactionLeaderboardPage, and PlayerInfoPage to use HFMessages.get() with MessageKeys.
Add GuiCommon, MembersGui, BrowserGui, LeaderboardGui, and PlayerInfoGui key classes.

* feat: localize Relations, Settings, and Modules pages (Phase 3d)

Migrate all hardcoded English strings in FactionRelationsPage,
SetRelationModalPage, FactionSettingsPage, and FactionModulesPage to
use HFMessages.get() with MessageKeys. Add RelationsGui, SettingsGui,
and ModulesGui key classes. Relation type labels use internal English
identifiers for logic with localizeType() resolving display text.

* feat: localize Treasury pages (Phase 3e)

Migrate all 5 treasury page classes to i18n:
- TreasuryPage: dashboard stats, upkeep, transaction type names, actor names
- TreasuryDepositModalPage: deposit/withdraw modal labels and messages
- TreasuryTransferSearchPage: search results, player/faction tags
- TreasuryTransferConfirmPage: fee labels, transfer result messages
- TreasurySettingsPage: leader-only permission errors, limit validation

Add ~70 treasury keys to MessageKeys.TreasuryGui and hyperfactions_gui.lang.

* feat: localize confirmation, logs, chat, invites, and map pages (Phase 3f)

Migrate hardcoded strings to i18n keys across 8 remaining faction GUI pages:
- DisbandConfirmPage, LeaderLeaveConfirmPage, LeaveConfirmPage, TransferConfirmPage
- LogsViewerPage, FactionChatPage, FactionInvitesPage, ChunkMapPage

Adds ConfirmGui, LogsGui, ChatGui, InvitesGui, and MapGui key groups
with ~90 new translation entries in hyperfactions_gui.lang.

* feat: localize create faction and new player pages (Phase 3g)

Migrate 85+ hardcoded strings across 4 new player GUI pages to i18n keys:
- CreateFactionPage: preview labels, validation errors, success messages
- InvitesPage: headers, counts, time formats, join result messages
- NewPlayerBrowsePage: sort dropdown, status badges, action buttons, join/request flows
- NewPlayerMapPage: position info, hint text, legend labels

Add CreateGui and NewPlayerGui inner classes to MessageKeys with 53 new keys.
Add MessageUtil.text() overload for i18n with color parameter.
Reuse existing keys: FactionInfoGui.STATUS_*, SettingsGui.PVP_*, MapGui.POSITION,
MapGui.LEGEND_PROTECTED, Common.ALREADY_IN_FACTION, Common.FACTION_NOT_FOUND.

* feat: localize admin GUI pages (Phase 4)

Migrate all 25 admin page files to use HFMessages.get() and MessageKeys.
Add ~170 admin i18n keys to MessageKeys.AdminGui and hyperfactions_admin.lang
covering dashboard, actions, factions, members, relations, settings,
players, economy, zones, zone map, zone wizard, and version pages.

* feat: add Player Settings GUI with language and notification preferences (Phase 5)

- PlayerSettingsPage with language dropdown and notification toggles
- Language override cache in HFMessages for per-player i18n
- TerritoryNotifier checks player alert preferences before sending
- PlayerDeathSystem checks member preferences before death broadcasts
- /f settings player command opens personal settings
- Page registered in both faction and new player nav bars
- Preferences loaded on connect, cleared on disconnect

* feat: add Spanish translations, locale stubs, and translator workflow (Phase 6)

- Full es-ES translations for commands, GUI, admin, and help content
- Stub .lang files for 7 additional locales (de-DE, fr-FR, ja-JP, pt-BR, ru-RU, tr-TR, zh-CN)
- Locale scaffolding scripts (new-translation.sh/bat)
- TRANSLATION_GUIDE.md with format docs and contribution process
- checkTranslations Gradle task to diff keys across locales
- fallback.lang for locale fallback documentation

* fix: redesign Player Settings UI and fix nav bar placement

- Rewrite player_settings.ui to follow established Container/Title/Content
  pattern from browse.ui and faction_settings.ui
- Fix crash from Style (HorizontalAlignment) on Group elements
- Fix DropdownBox crash by using DropdownEntryInfo with LocalizableString
  instead of plain List<String>, and string Value instead of integer index
- Move "Player" nav button to far right of both faction and new player
  nav bars using FlexWeight spacer pattern
- Remove player_settings from nav bar button list (rendered separately)
- Use rebuild() for state changes since page stores preferences as
  instance fields (async load race condition with openPlayerSettings)

* feat: use native locale display names and add es-ES to language selector

- Replace hardcoded LOCALE_DISPLAY_NAMES list with Java's Locale class
  to generate native display names (e.g. "Español (España)")
- Add es-ES as second available locale in the language dropdown
- Fix es-ES nav.player_settings to match en-US ("Jugador" not "Ajustes")

* feat: localize all GUI pages with i18n support

Add cmd.set() calls to override hardcoded English text in all .ui
templates with HFMessages.get() lookups. Covers faction pages, admin
pages, shared/modal pages, new player pages, and help pages.

- Add ~570 new MessageKeys constants across all page domains
- Add ~280 new en-US .lang keys for GUI labels
- Add ~320 new es-ES admin .lang keys
- Add ~280 new es-ES GUI .lang keys
- Add element IDs to ~95 .ui template files for runtime text override
- Add common keys: clear, back, leave, transfer, disband

* feat: localize admin zone wizard, unclaim confirm, and type modal pages

Add i18n support for remaining admin pages: zone creation wizard,
zone type change modal, and unclaim-all confirmation page. Fix
duplicate GUI_CANCEL constant in MessageKeys.

* fix: admin GUI crash, help i18n resolution, and dropdown display names

- Fix crash: #Title.Text selector on admin pages — add #PageTitle ID to
  all 29 admin .ui templates and update 28 Java files to use #PageTitle
- Fix help content showing English for non-English players — thread
  PlayerRef through HelpTopic.title(), HelpEntry.text(), and
  HelpMainPage.buildTopicCards() so help resolves per-player locale
- Fix category title using server default — use displayName(playerRef)
- Fix language dropdown truncation — use compact display names
  (English (US) instead of English (United States)) and widen to 220px

* fix: persist player preferences to JSON storage

The custom serializePlayerData/deserializePlayerData methods in
JsonPlayerStorage did not include the i18n preference fields added
to PlayerData. Settings were saved in memory but lost on restart.

Also includes compact locale display names and help i18n threading
from earlier fixes that were committed separately.

* fix: disable Power Notifications toggle (not yet wired up)

The checkbox is shown but disabled since no power change
notifications are currently sent to players.

* refactor: relocate help markdown to Server/Languages and remove stale config.json

Move help source files from src/main/help/{locale}/ to
src/main/resources/Server/Languages/{locale}/help/ so the build-time
HelpLangGenerator reads from the same directory structure as the
runtime language loader. Update translation scripts and build.gradle
to match the new path. Remove unused config.json (replaced by
per-feature config files in config/).

* feat: restructure admin test commands and extend help markdown syntax

Restructure /f admin testgui and sentrytest under /f admin test <sub>
via new AdminTestHandler, adding /f admin test md for a future
markdown visual test page.

Extend the help system with 9 new markdown entry types: bold, italic,
list (bullet + numbered), separator, callout boxes (with colored
accent bars), inline hex colors ([#RRGGBB]), named color shortcuts
(!warning, !success, !note, !muted), and typed callouts (>[!WARNING],
>[!INFO], >[!NOTE], >[!SUCCESS], >[!TIP]).

HelpEntry gains a color field for dynamic color overrides. The
build-time HelpLangGenerator parses all new syntax and emits color
metadata in help-manifest.json. HelpRegistry and HelpMainPage handle
the new types at runtime, applying colors to text and callout accent
bars. Five new .ui templates support the visual rendering.

TIP entries are unified into CALLOUT (backward-compatible: old TIP
manifests render as green callouts).

* feat: add markdown rendering test page (/f admin test md)

Visual test page that renders every supported help markdown entry
type using the real .ui templates. Shows syntax labels alongside
rendered output for verification: text, heading, command, bold,
italic, bullet/numbered lists, separators, hex colors, named color
shortcuts, and all callout box types. Includes edge cases for text
wrapping and mixed content flow.

* docs: add help markdown style guide and move translation guide to docs/

Add docs/help-markdown.md covering the full help markdown syntax
(bold, italic, lists, separators, colors, callouts) with examples.

Move TRANSLATION_GUIDE.md to docs/translation-guide.md and update it
with the new syntax types and clear guidance on what to translate
vs. what to keep (color codes, callout type tags, named shortcuts
stay in English across all locales).

* feat: add new UI Gallery elements to button test page

Add elements discovered from 2026.02.17 UI Gallery to the element
test page: TabNavigation with HeaderTabsStyle, MultilineTextField,
tooltip demo (TooltipText + DefaultTextTooltipStyle), ContentSeparator
and PanelSeparatorFancy, ProgressBar template, HeaderSearch, Panel
and SimpleContainer variants. Update command reference to /f admin
test gui.

* fix: pin markdown test page title bar to top of container

* fix: remove invalid #Title/#Content slots from Panel and SimpleContainer

These templates are flat containers — content goes directly inside
with no insertion point wrappers. Only @Container/@DecoratedContainer
have #Title/#Content slots.

* fix: enable text wrapping and vertical centering in help templates

Replace fixed Height with auto-sizing (remove Anchor Height, use
Padding for spacing). Add Wrap: true to all Label styles so long
text wraps instead of truncating with ellipsis. Add VerticalAlignment:
Center for proper vertical text positioning.

Applies to all 8 help line templates: text, command, heading, bold,
italic, list, tip, and callout.

* feat: add table support to help markdown system

Tables use standard markdown pipe syntax (| col | col |) with
separator rows for headers. Supports per-cell inline formatting
(**bold**, *italic*, `command`, [#hex] colors) and row-level
color overrides. Includes 4 new .ui templates, parser/registry/
renderer updates, and visual test entries.

* fix: improve table visual styling with GitHub-style grid borders

Redesign table templates with proper grid lines: left border on each
cell for column separators, top/bottom borders on rows, header row
background, 200px cell width with generous padding. Add per-cell
inline formatting support (bold, italic, command, hex colors).

* feat: add admin help infrastructure with category filtering

Add 8 admin help categories (ADMIN_OVERVIEW through ADMIN_REFERENCE)
to HelpCategory enum with isAdmin() filter. Rewrite AdminHelpPage from
placeholder to full sidebar+content rendering. Filter admin categories
from player HelpMainPage. Add admin directory scanning to
HelpLangGenerator build pipeline.

* feat: rewrite player help categories 1-4 (en-US) with enhanced formatting

Comprehensive rewrite of welcome, your_faction, power_land, and
diplomacy help using tables, callouts, bold formatting, and accurate
default config values. 14 topics expanded with detailed mechanics.

* feat: rewrite player help categories 5-7 (en-US), add spawn protection/upkeep/permissions topics

Rewrite combat, economy, and quick_ref help with enhanced formatting.
Add 3 new topics: spawn_protection (combat mechanics), upkeep (territory
maintenance costs), and permissions (key permission nodes reference).

* feat: add comprehensive admin help content (en-US) — 18 topics across 8 categories

Complete admin help documentation covering overview, faction management,
zones, power manipulation, economy, configuration, maintenance (backups,
updates, imports), and admin command reference. All values sourced from
actual config defaults and handler implementations.

* feat: rewrite Spanish player help translations (es-ES) — 25 topics

Full rewrite of all es-ES player help to match updated en-US content.
Preserves command syntax, markdown formatting, and frontmatter IDs.
Includes 3 new topics: spawn_protection, upkeep, permissions.

* feat: add Spanish admin help translations (es-ES), remove placeholder languages

Add 18 es-ES admin help topics mirroring en-US structure. Remove
de-DE, fr-FR, ja-JP, pt-BR, ru-RU, tr-TR, zh-CN placeholder
translations — will be regenerated later with complete content.

* fix: strip inline markdown markers, join continuation lines, fix invalid commands

- Add inline marker stripping to HelpLangGenerator (build-time):
  **bold** → bold, `code` → code, *italic* → italic, -- → em-dash
- Join multi-line prose into single lines (each line = one UI entry)
- Remove non-existent /f admin modify and /f admin bypass references
- Fix duplicate debug toggle entry in admin command reference
- Apply same fixes to both en-US and es-ES help content

* feat: table rendering with inline rows, rich text, and help window resize

- Switch table rendering from .ui templates to appendInline with explicit
  calculated heights (fixes content-driven height not working with TextSpans)
- Support 2/3/4 column tables with dynamic width calculation and borders
- Add HelpRichText parser for inline markdown (bold, italic, code, colors)
- Increase help window size ~15% (750x650 → 863x748) for both player/admin
- Fix Y/N → Yes/No in roles permission table
- Use 2px row borders for visibility on all table rows
- Remove stripped inline markers from lang generator (rich text handles them)

* fix: remove duplicate gui.cancel key in admin lang files

Hytale's I18nModule rejects the entire lang file when it encounters a
duplicate key, causing ALL admin GUI translations to show raw keys.

* feat: localize GUI labels for es-ES — browse stats, log time/types, sort labels

Add i18n support for previously hardcoded English text across player and
admin GUI pages: browse entry stat labels (power/claims/members), activity
log time formatting and type names, leaderboard/browser/members sort labels.
Fix truncated Spanish button text (relations, settings, sort labels).

* feat(i18n): localize admin GUI pages, entry templates, and zone flag display names

Localize admin dashboard stats, faction/player/zone list entries,
activity log types and timestamps, economy/treasury labels, zone
flags with display names, integration flags, relation buttons,
action buttons, and faction log enhancements. Add ~100 new keys
to both en-US and es-ES admin and GUI lang files.

* feat(i18n): localize player member and browser entry templates

Add #IDs to anonymous labels in member_entry.ui (Power, Joined,
Last Death) and wire cmd.set() for all entry-level labels and
buttons in FactionMembersPage. Add no_description fallback key
for browser entries. Widen Recruitment label for Spanish. Add
11 new keys to both en-US and es-ES gui lang files.

* feat(i18n): localize admin member entries and player info page

Add #IDs to anonymous labels in admin_faction_members_entry.ui,
wire cmd.set() for entry labels and buttons in
AdminFactionMembersPage. Localize formatReason(), bypass checkbox
labels, and NoFactionLabel in AdminPlayerInfoPage. Widen sort
label and teleport button for Spanish. Add 13 new keys per locale.

* feat(i18n): localize player invite and relation entry templates

Add #IDs to anonymous labels in faction_invite_entry.ui and
faction_relation_entry.ui, wire cmd.set() for all entry-level labels
and buttons in FactionInvitesPage and FactionRelationsPage, add 17
new MessageKeys constants, and add en-US/es-ES lang entries.

Width adjustments: ClaimsLabel 50->55px, DirectionLabel 65->70px
for Spanish translations.

* feat(i18n): localize all hardcoded Java strings in GUI pages

Replace hardcoded English strings with HFMessages.get() calls:
- FactionPageOpener: "Treasury is not available." (5 occurrences)
- AdminPageOpener: "Economy system is not enabled." (3 occurrences)
- AdminFactionInfoPage: "+N more" officer list truncation
- FactionDashboardPage: "in <duration>" upkeep time prefix
- AdminVersionPage: "Unknown" fallbacks
- AdminActivityLogPage: "1h"/"24h"/"7d"/"All" time filter labels
- CreateZoneWizardPage: "circular"/"square" shape names
- ZoneChangeTypeModalPage: "flags reset"/"flags kept"

Add 14 new MessageKeys constants and en-US/es-ES lang entries.

* feat(i18n): localize admin nav bar title and economy entry buttons

Wire cmd.set() for Admin Panel title in AdminNavBarHelper and
Adjust/Info button text in AdminEconomyPage entries. Add 3 new
MessageKeys constants and en-US/es-ES lang entries.

Stage 5 (new player pages) already fully localized — no changes needed.

* feat(i18n): localize remaining hardcoded fallbacks and format strings

Replace all "Unknown", "None", "world", "another zone" fallbacks with
localized equivalents across admin and player GUI pages. Localize
treasury upkeep cost format ("every Nh") and time-left display strings.

* fix(i18n): resolve Spanish truncation, crashes, and missing translations across GUI

- Widen label/button widths across admin pages for longer Spanish text:
  player info (Primera conexion, Ultima conexion, Set/Reset/SetMax buttons),
  sort labels (Ordenar:) on players/economy/zones/members pages,
  bypass state label (Desactivado) on dashboard, teleport button and
  last online label on player entries, lock hints on faction settings
  and create faction pages
- Fix admin player info crash: replace CheckBoxWithLabel @Text (not
  dynamically settable) with empty checkbox + separate addressable labels
  for bypass toggles (Sin Perdida de Poder / Sin Decaimiento de Reclamos)
- Widen admin player info container 720->780px for button space
- Add lock hint Wrap:true and increased height for long Spanish text
- Fix treasury column widths to fit Spanish type names (Transferencia)
- Fix help table 4-column widths for longer Spanish headers
- Add missing NOTE callout to es-ES combat/tagging.md (line count parity)
- Remove unsupported mid-text color code from es-ES alliances table
- Add i18n cmd.set() calls for new player map page legend labels

* feat: add SimpleClaims data importer

Import parties, claims, and alliances from SimpleClaims into
HyperFactions. Supports both SQLite (modern) and JSON (legacy)
storage formats with automatic detection.

Key conversion details:
- Party Owner → Leader, Members → Member (no Officer role in SC)
- Only mutual alliances imported as ALLY (one-way skipped)
- Player allies logged as data loss (no HF equivalent)
- Protection overrides mapped to outsider permission flags
- Default max power assigned (SC has no power system)
- No zones or homes (SC doesn't have these concepts)

Includes SQLite JDBC driver detection with clear error message
if the driver is unavailable.

* feat: add FactionsX data importer (#98)

* feat: add i18n infrastructure (Phase 0)

Add the foundational i18n system following Ecotale's proven pattern
with Hytale's native I18nModule:

- HFMessages: translation resolution engine with player/server language
  support and {0}/{1} placeholder formatting
- MessageKeys: static key constants organized by nested inner classes
  covering common, commands, protection, territory, GUI nav, and more
- MessageUtil: i18n-aware overloads (PlayerRef + key) alongside existing
  string-literal methods for gradual migration
- ServerConfig: defaultLanguage and usePlayerLanguage settings with
  JSON load/write support
- ConfigManager: convenience accessors for language settings
- PlayerData: languagePreference and notification preference fields
  (territoryAlerts, deathAnnouncements, powerNotifications)
- en-US/hyperfactions.lang: initial common.* translation keys (~25 keys)

* feat: migrate faction management and claim commands to i18n keys (Phase 1a)

Migrate hardcoded English strings to MessageKeys constants for:
- FactionSubCommand.requireFaction()
- Create, Disband, Rename, Desc, Open, Close, Color commands
- Claim command (territory)

Add corresponding keys to MessageKeys.java and hyperfactions.lang.

* feat: migrate member commands to i18n keys (Phase 1b)

Migrate hardcoded English strings to MessageKeys constants for:
- Invite, Accept/Join, Kick, Leave commands
- Promote, Demote, Transfer commands

Add corresponding keys to MessageKeys.java and hyperfactions.lang.

* feat: migrate territory and teleport commands to i18n keys (Phase 1c)

Migrate hardcoded English strings to MessageKeys constants for:
- Unclaim, Overclaim, Stuck commands (territory)
- Home, SetHome, DelHome commands (teleport)

Add corresponding keys to MessageKeys.java and hyperfactions.lang.

* feat: migrate relation, social, info, and economy commands to i18n keys (Phase 1d)

Migrate hardcoded English strings to MessageKeys constants for:
- Ally, Enemy, Neutral, Relations commands (relation)
- Chat, Invites, Request commands (social)
- Info, Members, List, Help, Who, Map, Power commands (info)
- Money, TreasuryCommandHandler (economy)

Add Invites and Request inner classes to MessageKeys. Expand
Relation, Chat, Info, Power, and Economy classes with new keys.

* feat: migrate UI commands and ProtectionChecker to i18n keys (Phase 1e)

Migrate GuiSubCommand, SettingsSubCommand, FactionCommand to use
MessageKeys constants. Convert ProtectionChecker's 40 hardcoded
strings (action phrases, denial reasons, PvP, entity damage, combat
tag) to HFMessages.get() with server-default language fallback.

* feat: migrate AnnouncementManager, TeleportManager, ChatManager to i18n keys (Phase 1f)

Convert AnnouncementManager to per-player i18n resolution for server
broadcasts. Migrate TeleportManager's 10 hardcoded strings (warmup,
cooldown, cancellation messages) and ChatManager's channel display
names. Add mount entry/teleport blocking messages from
TerritoryTickingSystem. Completes Phase 1 command/system migration.

* feat: add help system markdown-to-lang build pipeline (Phase 2)

Replace hardcoded help content with build-generated .lang files from
markdown sources. Add HelpLangGenerator build-time tool that parses
22 markdown topic files into hyperfactions_help.lang and
help-manifest.json. Refactor HelpRegistry to load structure from
manifest, HelpMessages to delegate to HFMessages/I18nModule, and
HelpCategory to use i18n display name keys. Create initial
hyperfactions_gui.lang with help category names. Add generateHelpLang
Gradle task wired into processResources.

* chore: exclude build package from gitignore pattern

* feat: localize nav system, shared pages, and modal pages (Phase 3a)

Migrate navigation infrastructure to resolve display names via i18n keys
instead of hardcoded English strings. NavBarUtil.buildButtons() now accepts
PlayerRef and resolves keys through HFMessages. All page registry entries
in GuiManager updated to use MessageKeys constants.

Shared pages migrated: MainMenuPage (section titles), FactionInfoPage
(status labels, descriptions), RenameModalPage, DescriptionModalPage,
TagModalPage (all validation/success messages).

New files: hyperfactions_admin.lang (admin nav keys).

* feat: localize FactionDashboardPage and FactionMainPage (Phase 3b)

Migrate ~55 hardcoded English strings to i18n keys across both pages.
Reuse existing command keys (Home, Claim, Common, Leave) where messages
are semantically identical. Add DashboardGui and FactionMainGui key
classes for page-specific labels and messages.

* feat: localize Members, Browser, Leaderboard, and PlayerInfo pages (Phase 3c)

Migrate all hardcoded English strings in FactionMembersPage, FactionBrowserPage,
FactionLeaderboardPage, and PlayerInfoPage to use HFMessages.get() with MessageKeys.
Add GuiCommon, MembersGui, BrowserGui, LeaderboardGui, and PlayerInfoGui key classes.

* feat: localize Relations, Settings, and Modules pages (Phase 3d)

Migrate all hardcoded English strings in FactionRelationsPage,
SetRelationModalPage, FactionSettingsPage, and FactionModulesPage to
use HFMessages.get() with MessageKeys. Add RelationsGui, SettingsGui,
and ModulesGui key classes. Relation type labels use internal English
identifiers for logic with localizeType() resolving display text.

* feat: localize Treasury pages (Phase 3e)

Migrate all 5 treasury page classes to i18n:
- TreasuryPage: dashboard stats, upkeep, transaction type names, actor names
- TreasuryDepositModalPage: deposit/withdraw modal labels and messages
- TreasuryTransferSearchPage: search results, player/faction tags
- TreasuryTransferConfirmPage: fee labels, transfer result messages
- TreasurySettingsPage: leader-only permission errors, limit validation

Add ~70 treasury keys to MessageKeys.TreasuryGui and hyperfactions_gui.lang.

* feat: localize confirmation, logs, chat, invites, and map pages (Phase 3f)

Migrate hardcoded strings to i18n keys across 8 remaining faction GUI pages:
- DisbandConfirmPage, LeaderLeaveConfirmPage, LeaveConfirmPage, TransferConfirmPage
- LogsViewerPage, FactionChatPage, FactionInvitesPage, ChunkMapPage

Adds ConfirmGui, LogsGui, ChatGui, InvitesGui, and MapGui key groups
with ~90 new translation entries in hyperfactions_gui.lang.

* feat: localize create faction and new player pages (Phase 3g)

Migrate 85+ hardcoded strings across 4 new player GUI pages to i18n keys:
- CreateFactionPage: preview labels, validation errors, success messages
- InvitesPage: headers, counts, time formats, join result messages
- NewPlayerBrowsePage: sort dropdown, status badges, action buttons, join/request flows
- NewPlayerMapPage: position info, hint text, legend labels

Add CreateGui and NewPlayerGui inner classes to MessageKeys with 53 new keys.
Add MessageUtil.text() overload for i18n with color parameter.
Reuse existing keys: FactionInfoGui.STATUS_*, SettingsGui.PVP_*, MapGui.POSITION,
MapGui.LEGEND_PROTECTED, Common.ALREADY_IN_FACTION, Common.FACTION_NOT_FOUND.

* feat: localize admin GUI pages (Phase 4)

Migrate all 25 admin page files to use HFMessages.get() and MessageKeys.
Add ~170 admin i18n keys to MessageKeys.AdminGui and hyperfactions_admin.lang
covering dashboard, actions, factions, members, relations, settings,
players, economy, zones, zone map, zone wizard, and version pages.

* feat: add Player Settings GUI with language and notification preferences (Phase 5)

- PlayerSettingsPage with language dropdown and notification toggles
- Language override cache in HFMessages for per-player i18n
- TerritoryNotifier checks player alert preferences before sending
- PlayerDeathSystem checks member preferences before death broadcasts
- /f settings player command opens personal settings
- Page registered in both faction and new player nav bars
- Preferences loaded on connect, cleared on disconnect

* feat: add Spanish translations, locale stubs, and translator workflow (Phase 6)

- Full es-ES translations for commands, GUI, admin, and help content
- Stub .lang files for 7 additional locales (de-DE, fr-FR, ja-JP, pt-BR, ru-RU, tr-TR, zh-CN)
- Locale scaffolding scripts (new-translation.sh/bat)
- TRANSLATION_GUIDE.md with format docs and contribution process
- checkTranslations Gradle task to diff keys across locales
- fallback.lang for locale fallback documentation

* fix: redesign Player Settings UI and fix nav bar placement

- Rewrite player_settings.ui to follow established Container/Title/Content
  pattern from browse.ui and faction_settings.ui
- Fix crash from Style (HorizontalAlignment) on Group elements
- Fix DropdownBox crash by using DropdownEntryInfo with LocalizableString
  instead of plain List<String>, and string Value instead of integer index
- Move "Player" nav button to far right of both faction and new player
  nav bars using FlexWeight spacer pattern
- Remove player_settings from nav bar button list (rendered separately)
- Use rebuild() for state changes since page stores preferences as
  instance fields (async load race condition with openPlayerSettings)

* feat: use native locale display names and add es-ES to language selector

- Replace hardcoded LOCALE_DISPLAY_NAMES list with Java's Locale class
  to generate native display names (e.g. "Español (España)")
- Add es-ES as second available locale in the language dropdown
- Fix es-ES nav.player_settings to match en-US ("Jugador" not "Ajustes")

* feat: localize all GUI pages with i18n support

Add cmd.set() calls to override hardcoded English text in all .ui
templates with HFMessages.get() lookups. Covers faction pages, admin
pages, shared/modal pages, new player pages, and help pages.

- Add ~570 new MessageKeys constants across all page domains
- Add ~280 new en-US .lang keys for GUI labels
- Add ~320 new es-ES admin .lang keys
- Add ~280 new es-ES GUI .lang keys
- Add element IDs to ~95 .ui template files for runtime text override
- Add common keys: clear, back, leave, transfer, disband

* feat: localize admin zone wizard, unclaim confirm, and type modal pages

Add i18n support for remaining admin pages: zone creation wizard,
zone type change modal, and unclaim-all confirmation page. Fix
duplicate GUI_CANCEL constant in MessageKeys.

* fix: admin GUI crash, help i18n resolution, and dropdown display names

- Fix crash: #Title.Text selector on admin pages — add #PageTitle ID to
  all 29 admin .ui templates and update 28 Java files to use #PageTitle
- Fix help content showing English for non-English players — thread
  PlayerRef through HelpTopic.title(), HelpEntry.text(), and
  HelpMainPage.buildTopicCards() so help resolves per-player locale
- Fix category title using server default — use displayName(playerRef)
- Fix language dropdown truncation — use compact display names
  (English (US) instead of English (United States)) and widen to 220px

* fix: persist player preferences to JSON storage

The custom serializePlayerData/deserializePlayerData methods in
JsonPlayerStorage did not include the i18n preference fields added
to PlayerData. Settings were saved in memory but lost on restart.

Also includes compact locale display names and help i18n threading
from earlier fixes that were committed separately.

* fix: disable Power Notifications toggle (not yet wired up)

The checkbox is shown but disabled since no power change
notifications are currently sent to players.

* refactor: relocate help markdown to Server/Languages and remove stale config.json

Move help source files from src/main/help/{locale}/ to
src/main/resources/Server/Languages/{locale}/help/ so the build-time
HelpLangGenerator reads from the same directory structure as the
runtime language loader. Update translation scripts and build.gradle
to match the new path. Remove unused config.json (replaced by
per-feature config files in config/).

* feat: restructure admin test commands and extend help markdown syntax

Restructure /f admin testgui and sentrytest under /f admin test <sub>
via new AdminTestHandler, adding /f admin test md for a future
markdown visual test page.

Extend the help system with 9 new markdown entry types: bold, italic,
list (bullet + numbered), separator, callout boxes (with colored
accent bars), inline hex colors ([#RRGGBB]), named color shortcuts
(!warning, !success, !note, !muted), and typed callouts (>[!WARNING],
>[!INFO], >[!NOTE], >[!SUCCESS], >[!TIP]).

HelpEntry gains a color field for dynamic color overrides. The
build-time HelpLangGenerator parses all new syntax and emits color
metadata in help-manifest.json. HelpRegistry and HelpMainPage handle
the new types at runtime, applying colors to text and callout accent
bars. Five new .ui templates support the visual rendering.

TIP entries are unified into CALLOUT (backward-compatible: old TIP
manifests render as green callouts).

* feat: add markdown rendering test page (/f admin test md)

Visual test page that renders every supported help markdown entry
type using the real .ui templates. Shows syntax labels alongside
rendered output for verification: text, heading, command, bold,
italic, bullet/numbered lists, separators, hex colors, named color
shortcuts, and all callout box types. Includes edge cases for text
wrapping and mixed content flow.

* docs: add help markdown style guide and move translation guide to docs/

Add docs/help-markdown.md covering the full help markdown syntax
(bold, italic, lists, separators, colors, callouts) with examples.

Move TRANSLATION_GUIDE.md to docs/translation-guide.md and update it
with the new syntax types and clear guidance on what to translate
vs. what to keep (color codes, callout type tags, named shortcuts
stay in English across all locales).

* feat: add new UI Gallery elements to button test page

Add elements discovered from 2026.02.17 UI Gallery to the element
test page: TabNavigation with HeaderTabsStyle, MultilineTextField,
tooltip demo (TooltipText + DefaultTextTooltipStyle), ContentSeparator
and PanelSeparatorFancy, ProgressBar template, HeaderSearch, Panel
and SimpleContainer variants. Update command reference to /f admin
test gui.

* fix: pin markdown test page title bar to top of container

* fix: remove invalid #Title/#Content slots from Panel and SimpleCont…
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant