String Table Extractor moves inline text from your assets into a String Table and carries the translations you already have (UE 5.8)

Unreal links one text property at a time to a String Table entry. A project with three hundred labels, buttons and tooltips typed inline is three hundred clicks and three hundred keys typed by hand. And every existing translation is orphaned: the next gather files the moved text under a new namespace and key and drops the old one.

String Table Extractor does the move as one commandlet. It finds inline text in Widget Blueprints, Blueprint class defaults and component templates, Text pin defaults in graphs (Make Literal Text, Format Text, any function input), Data Table rows and Data Assets. It only opens packages the asset registry already flags with PKG_RequiresLocalizationGather.

A preview run writes an Extraction Sheet before anything changes: one proposed entry per distinct text, keys named by a rule you pick, identical texts folded together unless your culture archives already translate them differently, so “Close” on a door and “Close” on a menu can stay two entries. -Apply creates the entries, links each text to its entry, checks it reads exactly as before, recompiles each touched Blueprint once and saves. Each translation is copied verbatim to the new namespace and key in every culture archive, so the next gather keeps it. A Format Text node is only linked to an entry that reads as the same pattern with the same arguments, and its pin count is checked after.

Every file is backed up first and -Undo=<run id> restores a run. -Verify exits 2 while inline text remains, for CI. Before writing, it also refuses a table your Gather Text step would never reach, since the default Game target excludes Content/Localization.

Level actors aren’t walked by this version. Tested on Unreal Engine 5.8, Win64. The code was written with AI tools. It costs 14.99 USD on itch: