Skip to content

Checks

Dragoman runs 24 checks in three groups:

  • Setup: is the localization target there, gathered, compiled and without key conflicts?
  • Translation: is every text translated, current and correct in every language?
  • Assets: is there text in your Blueprints, widgets and tables that can never be translated?

Every check has a rule id (for example Placeholder), a name shown in the panel and the reports (Placeholder mismatch) and a default severity: Error, Warning or Info. Change a severity or turn a rule off in Rule Levels.

The problems that make Gather fail or keep translations out of the game are listed, and fixed, in the Gather setup window: see Gather setup.

Rule id Name Default Finds
NoTarget No localization target Error The target in the settings doesn’t exist.
NotGathered Not gathered Warning The target has no manifest yet.
NoForeignCulture No languages Warning Only the native language is set up.
EngineManifestMissing Engine manifest missing Error A target dependency has no manifest, so Gather fails.
CompileNeeded Compile needed Info Translations changed after the last compile.
Conflict Key conflict Warning One key with different source texts.

The target named in Target Name (default Game) is not in the Localization Dashboard. Create it in Tools > Localization Dashboard, or set the name of an existing target in Project Settings > Plugins > ta Dragoman. The asset checks still run without a target; the other checks need one.

The target exists but Unreal has never collected its text, so there is no .manifest file. Click Gather in the panel, or gather in the Localization Dashboard.

The target only has its native language (the pseudo language doesn’t count). Add the languages you translate to in the Localization Dashboard.

The target depends on another target, usually Engine, whose manifest file doesn’t exist. The message names the dependency and the missing file. Gather fails until the dependency is removed.

Some launcher builds (seen in 5.6) ship without Engine.manifest and Editor.manifest, and the default Game target depends on both. Repair gather setup removes the dependency; you can also remove it in the Localization Dashboard (target > Target Dependencies) or copy the manifests from another install.

A language’s translations (its .archive file) changed after its .locres file was last compiled, so the game and the editor preview still show the old text. Click Compile.

The last gather found one namespace and key with different source texts in different places, most often because a widget or Blueprint was copied. Only one of the texts can be translated. The message lists the texts and where they are. Give each text its own key. Dragoman reads the conflict report the gather writes next to the manifest (<Target>_Conflicts.csv or .txt).

These run for every language except the native language and the pseudo language. The native text is only checked for missing glyphs.

Rule id Name Default Finds
Missing Missing translation Warning No translation.
Stale Stale translation Warning The source changed after it was translated.
Machine Machine translation Info Machine translation (or a translation a file marks for review) not reviewed yet.
Identical Same as source Info The translation equals the source.
Placeholder Placeholder mismatch Error Format arguments lost or added.
Pattern Broken format pattern Error Unreal’s format validation fails for the language.
RichTag Rich text tag mismatch Error Rich text tags lost, added or broken.
Whitespace Whitespace mismatch Warning Leading or trailing whitespace differs from the source.
Length Too long Warning Longer than the note’s maximum, or much longer than the source.
Glyph Missing glyphs Error Characters the fonts can’t draw.
Glossary Glossary term Warning A glossary term isn’t translated as the glossary says.
DoNotTranslate Do-not-translate term Warning A term that must stay as it is was changed.

The text has no translation in this language, so the game shows the native text. Message: “No translation.” Fill it in the panel, from the translation memory, with machine translation or through a translator package.

The source text was edited after the translation was made. Unreal keeps such a translation but doesn’t use it. The message gives the source the translation was made for: Translated for: "<old source>". Review it, then keep it for the new source or change it. See Changed source texts.

The text was filled by machine translation, or imported from a file that marks it for review, and nobody has reviewed it yet. It waits in the review queue. Accepting it, or editing and saving it, clears the mark.

The translation is the source text itself. That is fine for names and numbers, otherwise the text was probably copied and not translated. Only texts with letters and more than three visible characters are checked, so OK or HP are not reported.

The translation lost or added a format argument such as {PlayerName} or {0}, so the game would show the wrong value or the raw braces. Arguments are read with Unreal’s own format parser. The message lists them: Missing {PlayerName}. or Unknown {Name} (not in the source).

Unreal’s own format validation fails for this language: unbalanced braces, a broken |plural(...), |gender(...) or |ordinal(...) block, or plural forms the language doesn’t have. The message is Unreal’s own error. For example, {Count}|plural(one=coin,other=coins) is valid in English; a language without a one form needs its own categories.

The translation lost, added or broke a rich text tag such as <Bold>…</> or <img id="coin"/>. Tags are compared by name; attributes are ignored. The message lists them: Missing tags <Bold> </>. or Extra tags <img/>.

The source starts or ends with spaces or line breaks that the translation doesn’t have, or the other way round. Texts joined in code then run together or get double spaces.

Two ways a translation can be too long:

  • It is longer than the MaxLength of its note. Message: 24 characters, the note allows 18.
  • It has no MaxLength and is more than Max Expansion times as long as its source (default 1.6). Message: 1.8x as long as the source (45 vs 25 characters). Sources shorter than Min Source Length For Expansion characters (default 12) are not checked this way, since short words often grow a lot (“OK” to “Einverstanden”). Set Max Expansion to 0 to turn this part off.

Lengths count visible characters: format arguments and rich text tags are not counted.

The fonts in Fonts To Check can’t draw some characters of the translation, so the game would show boxes. Dragoman reads the fonts’ own character maps, including composite fonts with their default, fallback and sub-font faces. The message shows the characters and their code points: The fonts cannot draw: 日本 (U+65E5, U+672C). Whitespace and control characters are not checked.

By default the list holds Unreal’s default UI font, Roboto, which UMG text uses unless a widget sets another font. Add the fonts your UI uses; with an empty list the check is skipped. This check also runs on the native text.

The source uses a glossary term, but the translation doesn’t use the glossary’s translation of it for this language. Message: "Health" should be translated as "Lebenspunkte". Terms are matched as whole words, ignoring case. The required translation may be followed by more letters, so inflected forms (German plurals, Turkish or Finnish case endings) count as correct.

The source uses a term marked as do-not-translate in the glossary (a name, a brand), but the translation doesn’t contain it exactly as written. Message: "Dragoman" must stay as it is.

Dragoman looks for text that can’t be translated, including text inside structs, arrays and maps:

  • Widget Blueprints: the properties of every widget, for example Title (Text Block) > Text.
  • Blueprints: the class defaults a Blueprint sets (not the ones it inherits unchanged) and text typed into pins of its graphs, for example EventGraph > Print Text > In Text.
  • Data tables: every row, for example Row Sword > Description.
  • Data assets, including primary data assets.
  • String tables, for unused entries.

Editor-only and transient properties are skipped. Turn the asset checks off with Scan Assets, and choose the folders with Asset Folders (/Game when empty) and Ignored Asset Folders. See Settings.

Rule id Name Default Finds
HardcodedText Hardcoded text Warning Text that is not localizable.
StringToText String converted to text Warning A typed-in string converted to text in a Blueprint.
BrokenStringTableRef Broken string table reference Error Reference to a missing string table or key.
UnusedStringTableEntry Unused string table entry Info A string table entry no checked asset uses.
NotInManifest Not gathered yet Info Texts new or changed since the last gather.
OutsideGather Outside gather paths Warning Assets with text the target’s gather paths skip.

A text with letters that is marked culture invariant, or whose Localize checkbox is off. It is never gathered, so players see it in the native language. Turn Localize on in the text’s options, or use a string table.

A Blueprint turns a typed-in string or name into text with To Text (String) or To Text (Name). That text is never gathered. Use a Text pin or a string table instead. The location shows the graph and the node, for example EventGraph > To Text (String). Conversions of connected pins (a variable, a function result) are not reported.

The text points to a string table that doesn’t exist (String table <id> does not exist.) or to a key the table doesn’t have (String table <id> has no key "<key>".). The game shows a “MISSING STRING TABLE ENTRY” text instead.

No checked asset uses this entry of a string table. C++ code (LOCTABLE) can still use it, so check before deleting it.

The asset has localizable text that the last gather didn’t see, because it is new or changed since. Gather again to send it to translators. One finding is reported per asset, with the number of texts. Text typed into Blueprint graph pins is not counted: Unreal gathers it from compiled bytecode.

The asset has localizable text, but the target never gathers it, so it is never translated. The message gives the reason:

  • Gather from packages is off for the target.
  • The asset’s folder is not in the target’s Include Path Wildcards.
  • The target’s Exclude Path Wildcards exclude it.
  • The asset is in Content/Localization/. Unreal never gathers from that folder, which is meant for compiled translations; move the asset to another folder.

Targets that gather from collections are not checked for this.

Repair gather setup… (in the panel’s Target menu and in Tools) lists what makes Gather fail or keeps translations out of the game, and fixes it when you ask. Problems marked Fails make Gather fail; Gather offers the repair before it starts. See Repair gather setup.

Id Problem Gather Repair
NoTarget No localization target: no text is gathered and nothing can be translated. Fails Creates the target: native language English, gathers Source and Content, loaded in the game.
UnknownTarget Target not found: the settings use a target the project doesn’t have. Fails Uses a target the project has in the ta Dragoman settings.
MissingDependencyManifest Dependency manifest missing: the target depends on a target whose manifest is missing. Some engine installs ship without Engine.manifest and Editor.manifest (seen in 5.6). Fails Removes the dependency (you can add it back in the Localization Dashboard).
UnknownDependency Unknown target dependency: the target depends on a target that does not exist anymore. Removes the dependency.
MissingManifestFile Additional manifest missing: an additional manifest dependency does not exist. Fails Removes the missing files from Additional Manifest Dependencies.
NothingGathered Nothing is gathered: gathering from text files, packages and metadata is off. Fails Gathers from the Source folder and from Content/*.
NoPackagePaths No content paths: gather from packages is on, but it has no include paths. Adds Content/* to the include paths.
NoSourcePaths No source folders: gather from text files is on, but it has no search folders, so no LOCTEXT from C++ is gathered. Adds the Source folder.
NoNativeCulture No native language: the gather cannot write a manifest. Fails Uses the target’s first language, or adds English (en), as the native language.
MissingConfigFiles Command line configs missing: the Config/Localization files for command line and build machine gathers (the panel and the dashboard write their own). Writes all Config/Localization files of the target.
NotLoadedInGame Translations not loaded in the game: the target’s loading policy is not Game, so players only see the native text. Loads the target in the game (adds it to Config/DefaultGame.ini, like Loading Policy = Game in the dashboard).
CulturesNotPackaged Languages not packaged: Project Settings > Packaging > Localizations to Package is missing languages of the target, so a packaged game leaves them out. Adds them to Localizations to Package.
LocalizationFolderAssets Assets in Content/Localization: Unreal never gathers that folder (it holds compiled translations). Reported only: move them to another folder in the Content Browser, so references are fixed up.

A repair changes the target’s settings (DefaultEditor.ini), the Config/Localization files, DefaultGame.ini (loading policy, Localizations to Package) or the ta Dragoman settings, like the Localization Dashboard and the Project Settings do. It leaves the pseudo language out of Localizations to Package on purpose.

In Project Settings > Plugins > ta Dragoman > Checks > Rule Levels, add an entry with the rule id (for example Identical) and a level:

Level Effect
Default The rule’s own severity.
Off The rule doesn’t run and reports nothing.
Info, Warning, Error The rule reports with this severity.

The levels apply everywhere: in the panel, in Data Validation, in the commandlet and in the reports. They are saved in Config/DefaultEditor.ini, so the team shares them.

For example, a project that ships some English words untranslated on purpose can set Identical to Off, and a team that wants overflowing text to fail CI can set Length to Error.

Dragoman checks Blueprints (including Widget Blueprints), data tables and data assets in the asset folders when they are validated: with Validate Assets, on save if your project validates on save, and before cooking. It reports:

  • Hardcoded text
  • String converted to text
  • Broken string table reference, for keys missing from an existing string table

The messages appear in the Message Log:

[ta Dragoman] Hardcoded text at Title (Text Block) > Text: "Start Game". This text is not localizable (culture invariant), so it is never translated.

Findings below Min Validation Severity (default Warning) are not reported. An error fails validation. Turn the integration off with Run During Data Validation.