Internationalization & Localization Specification: Game Time System - wwestlake/Steamforge GitHub Wiki

Internationalization & Localization Specification: Game Time System

Purpose

This specification defines how the Steamforge Time System supports internationalization (i18n) and localization through a clean separation of server-side time authority and client-side representation.


Core Design Philosophy

"Server defines the world’s logic. Clients express it in their own voice."

Time in Steamforge is authoritative, deterministic, and language-neutral on the server. Clients are fully empowered to represent time in a localized and culturally appropriate way.


System Summary

✅ Server Responsibilities

  • Maintains a single authoritative value: ElapsedRealSeconds
  • Updates and replicates this value to all clients
  • Controls all time-based logic (event triggering, scheduling, farming, day/night cycles)
  • Does not format or represent time in human-readable ways

✅ Client Responsibilities

  • Receives ElapsedRealSeconds from server
  • Converts into FGameDateTime using TimeScale and shared calendar rules
  • Loads localized calendar labels and lore descriptions from DataTables
  • Displays time using appropriate format and cultural styling

Localization Targets

📅 Time Labels (from DataTables)

  • Day of Week (e.g., Sparkday → 火花日 / Funken-tag)
  • Month Names (e.g., Kindlemoon → 点火月 / Kindle-Monat)
  • Seasons (e.g., Forgewake → 炼醒 / Forge-Awaken)
  • Special Lore Days or Rituals

🧾 Display Format

  • 24-hour vs 12-hour clock format
  • Ordering (e.g., MM/DD/YYYY vs YYYY年MM月DD日)
  • Calendar UI variations
  • Text direction, font rendering, and glyph support

Technical Details

Replication

  • ElapsedRealSeconds is a replicated float from server
  • Clients are forbidden from modifying or accelerating this value

Blueprint Access

  • Clients may use Blueprint logic to:
    • Convert to FGameDateTime
    • Lookup names via localized DataTables
    • Display formatted time using helper nodes or utility library

Example Flow (Client-Side)

  1. Receive updated ElapsedRealSeconds
  2. Convert to FGameDateTime via formula
  3. Use FGameDateTime.DayOfWeek as index into LocalizedDayNameTable
  4. Format string with localized format (e.g., "Sparkday, Kindlemoon 12, Year 731")

Benefits

  • Supports fully localized experiences without code changes
  • Enables community-built language packs
  • Protects core simulation logic from tampering or desync
  • Cleanly separates logic (server) from expression (client)

Future Expansion

  • Player-configurable calendar UIs
  • Ritual tracking per locale
  • Voice-over or text-to-speech per language

Author: Steamforge Systems Team
Version: 1.0
Last Updated: 2025-03-28