feat: Add built-in localization (i18n) support - #92
Merged
Conversation
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.
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
marked this pull request as ready for review
March 13, 2026 01:23
Contributor
Author
|
Couldn't do CN, JP, KO because the game doesn't support encoding for those languages |
This was referenced Mar 15, 2026
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…
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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..langbuild pipeline (42 files per locale)checkTranslationsGradle taskWhat changed
MessageKeysconstants +HFMessagesresolutionHelpLangGenerator).ui/ JavaHFMessages.get(playerRef, key)messageKey+messageArgsfields (backward-compatible)Architecture
HFMessages— Resolution: player preference → client locale → server default → en-US fallbackMessageKeys— 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 →.langparser with table, list, and rich text supportLanguage files
Dependencies
PRs #98 and #99 (FactionsX and SimpleClaims importers) are based on this branch — merge this first.
Test plan
./gradlew :HyperFactions:shadowJarbuilds clean/f help— all 42 help topics render correctly from markdown source/f settings player— language selector and notification toggles work and persist🤖 Generated with Claude Code