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.
Setup checks
Section titled “Setup checks”| 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. |
No localization target
Section titled “No localization target”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.
Not gathered
Section titled “Not gathered”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.
No languages
Section titled “No languages”The target only has its native language (the pseudo language doesn’t count). Add the languages you translate to in the Localization Dashboard.
Engine manifest missing
Section titled “Engine manifest missing”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.
Compile needed
Section titled “Compile needed”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.
Key conflict
Section titled “Key conflict”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).
Translation checks
Section titled “Translation checks”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. |
Missing translation
Section titled “Missing translation”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.
Stale translation
Section titled “Stale translation”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.
Machine translation
Section titled “Machine translation”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.
Same as source
Section titled “Same as source”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.
Placeholder mismatch
Section titled “Placeholder mismatch”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).
Broken format pattern
Section titled “Broken format pattern”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.
Rich text tag mismatch
Section titled “Rich text tag mismatch”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/>.
Whitespace mismatch
Section titled “Whitespace mismatch”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.
Too long
Section titled “Too long”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 (default12) are not checked this way, since short words often grow a lot (“OK” to “Einverstanden”). Set Max Expansion to0to turn this part off.
Lengths count visible characters: format arguments and rich text tags are not counted.
Missing glyphs
Section titled “Missing glyphs”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.
Glossary term
Section titled “Glossary term”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.
Do-not-translate term
Section titled “Do-not-translate term”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.
Asset checks
Section titled “Asset checks”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. |
Hardcoded text
Section titled “Hardcoded text”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.
String converted to text
Section titled “String converted to text”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.
Broken string table reference
Section titled “Broken string table reference”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.
Unused string table entry
Section titled “Unused string table entry”No checked asset uses this entry of a string table. C++ code (LOCTABLE) can still use it, so check before deleting it.
Not gathered yet
Section titled “Not gathered yet”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.
Outside gather paths
Section titled “Outside gather paths”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.
Gather setup
Section titled “Gather setup”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.
Changing severities
Section titled “Changing severities”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.
Data Validation
Section titled “Data Validation”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.