feat(localization): add StringTable discovery and validation - #131
feat(localization): add StringTable discovery and validation#131kunkunGames wants to merge 1 commit into
Conversation
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 3b829d9374
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| return nullptr; | ||
| } | ||
|
|
||
| UObject* Object = FSoftObjectPath(OutObjectPath).TryLoad(); |
There was a problem hiding this comment.
Reject redirected StringTable paths
When asset_path names an UObjectRedirector left by a StringTable rename, FSoftObjectPath::TryLoad() follows the redirect and returns the destination table. The action then silently inspects or validates a different asset and even reports its new path, despite the exact-path/no-substitution contract; reject redirects or verify that the loaded object's path still equals OutObjectPath before returning it.
Useful? React with 👍 / 👎.
Summary
Add a cohesive, read-only localization preflight surface for culture discovery and bounded StringTable discovery, readback, and validation without mutating or dirtying packages.
Problem
Monolith already exposes StringTable authoring through the broad
blueprintnamespace, but automation has no focused read-only contract for finding tables, paging large entry sets, bounding metadata/text payloads, or proving that validation covered the whole asset. Callers currently have to load and reconstruct this state themselves, and a truncated scan can be mistaken for a valid table.Solution
Add four actions under a dedicated read-only and idempotent
localizationdispatcher:list_cultureslist_string_tablesget_string_tablevalidate_string_tableAll asset inputs require canonical mounted package paths or matching top-level object paths. Culture lists, asset pages, entry pages, metadata rows, text values, validation scans, and issue pages have documented hard bounds. Readback separates
has_more_entries,all_entries_covered, andmetadata_complete; validation reportsvalid=trueonly when the scan is complete and has zero errors.The implementation keeps memory bounded while finding the lexicographically smallest entry keys, rather than materializing an unbounded sorted copy. It registers before the config-authoring gate because culture and StringTable inspection do not depend on config mutation, so these actions remain available when
bEnableConfig=false.The existing
blueprintStringTable actions remain the authoring surface. This PR intentionally adds no create, set, remove, import, export, transaction, dirty, or save action.Verification
RunUAT BuildPlugin -NoTargetPlatforms -Rocket: 436/436 build actions passed; UAT exit code 0RunUAT BuildPlugin -NoTargetPlatforms -Rocket: 436/436 build actions passed; UAT exit code 0Automation RunTests Monolith.Localization.Read: 3/3 passed, zero failures/skips, exit code 0Automation RunTests Monolith.Localization.Read: 3/3 passed, zero failures/skips, exit code 0using namespacedirectives, or individualusingdeclarationsgit diff --checkpassedDocs/testing/2026-08-04-string-table-discovery-validation.mdThe first focused run in each engine also disproved a proposed case-insensitive duplicate-key audit: Unreal's
FTextKeyidentity does not retain simultaneousCaseandcaserows in a StringTable. The unreachable check and misleading test were removed rather than reporting a diagnostic from data the engine cannot preserve; the final runs above are the post-correction 3/3 gates.Compatibility and risk
This PR adds a direct
AssetRegistrydependency to the existing editor moduleMonolithConfig; it does not add a runtime module or change the existingblueprintStringTable authoring contract. It also reconciles the stale documentedconfigcount with the seven actions already registered by source before adding the four-action localization namespace.Large tables remain bounded by hard caps and explicit continuation/completeness fields. Invalid paths, wrong asset types, load failures, and incomplete validation fail explicitly; no fallback asset, widened path, substitute data, or silent legacy branch is used.
Visual evidence
Not applicable: this PR adds headless action handlers, schemas, automation tests, documentation, and routing guidance with no visual or editor-facing UI change.