audit_widget_text
Sweep Widget Blueprints to find player-visible texts typed inline instead of in String Tables, so they can be given proper namespace/key identity for translators.
Instructions
Sweep Widget Blueprints and report which player-visible texts are typed INLINE rather than coming from a String Table -- the localization-maintainability question. NOTE: this corrects the intuition most people start with: a text written as a bare string is NOT lost to localization. Unreal assigns it a stable key when the package is saved, and FTextInspector::ShouldGatherForLocalization returns true, so it DOES get collected and translated. What it lacks is a MEANINGFUL identity: the namespace comes out empty and the key is an opaque GUID like 971E3B3B436AEE91028BA1ADB97B3046. That still costs -- translators see no context, and re-authoring the text churns the key, orphaning the translation. So this reports identity_kind per text: string_table (best), explicit (an author-given namespace/key), auto_key (typed inline, key generated on save) and none (never saved, no identity yet). Default output is everything that is NOT string_table or explicit.
Returns: { folder_path, widget_blueprints_scanned, texts_examined, counts_by_identity: {string_table, explicit, auto_key, none}, not_gathered_count, entries: [{ widget_bp_path, widget_name, widget_class, property_name, text, identity_kind, will_be_gathered, namespace, key, string_table }], truncated } -- not_gathered_count is the engine's own ShouldGatherForLocalization saying a text will NOT be collected at all; in a saved asset that is normally 0, and anything above it is a real alarm.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| recursive | No | Recurse into subfolders (default true). | |
| folder_path | No | Content folder to sweep (default /Game). Every UWidgetBlueprint under it is loaded and walked. | |
| include_all | No | Also report the texts that already have a good identity, string_table and explicit ones included (default false). | |
| max_results | No | Max Widget Blueprints to load (default 500). Loading a WBP is not free; a whole-project sweep is a heavy call. | |
| include_data_assets | No | Also sweep DataTables and DataAssets under the same folder (default false). This is where an AAA game actually keeps its text -- item names, quest descriptions, tooltips -- and it is text the widget walk cannot reach, because there the FTexts sit in nested struct fields rather than on a widget class. Nested structs and arrays of structs are walked too. |