WinCC Text Distributor: Resolving '???' Placeholders in Multilingual Runtime
When a WinCC project is extended with a new language, designers frequently observe that message texts (alarm lists, message classes, archive comments) translate correctly at runtime, while graphic screen elements — static text fields, button labels, IO field captions, group display text — display only ?????? regardless of the selected language flag. The root cause is the separation of text storage between the centralized Text Library and the per-object Picture Object text table, and the symptom resolves only by running the Text Distributor editor with a Unicode-compliant import file.
Problem Details: Symptom Matrix
| Element Type | Text Storage Location | Behavior After New Language Tab |
|---|---|---|
| Bit/Analog messages (Alarm Logging) | Text Library (centralized) | Translates correctly |
| Archive tag comments | Text Library | Translates correctly |
| User Archive column headers | Text Library | Translates correctly |
| Static text on picture | Picture Object property "Text" | Shows ??? |
| Button label text | Picture Object property "Text" | Shows ??? |
| IO field output text | Picture Object property "Output text" | Shows ??? |
| Status display text table | Picture Object internal table | Shows ??? |
| Group display entries | Picture Object internal table | Shows ??? |
| WinCC Online Trend Control axis labels | Picture Object property | Shows ??? |
This symptom pattern is the diagnostic fingerprint: any text defined inside the Graphics Designer picture tree is stored locally on the object instance and is independent of the Text Library editor. Adding a language tab in the Text Library only registers a new language column for the central table — it does not retroactively create language entries on the thousands of picture-bound objects in the PDL files.
Root Cause Analysis
WinCC (V7.x and the TIA Portal WinCC Unified runtime) maintains two parallel text storage systems that must both be localized to render correctly:
- Text Library (centralized text catalog) — A database-resident, language-indexed table holding all translatable message strings, user archive text, and any text linked to an object via the Text ID mechanism. Languages are managed as tabs (e.g., English, German, French, custom). When a new tab is created, a column is added; the WinCC Explorer automatically generates a language pair ID used at runtime to swap text. The display is driven by the project's configured Runtime language setting.
- Picture Object Texts (per-PDL storage) — Every static text, button, checkbox, radio button, IO field output value, and status display maintains its own internal multilingual text table. This table is populated at design time, not from the Text Library, and is what feeds the on-screen rendering layer when the Runtime language is toggled.
The ????? rendering means the Graphics Designer cannot find a text row for the currently active Language Code in the picture's local table. A blank or missing entry — not a font problem — causes the placeholder render. A language dongle is not required for project languages created in the editor; it is required only for switching the OS / runtime UI language. This is a common misdiagnosis.
Language Architecture (WinCC V7.5 / WinCC Unified)
WinCC V7.5 maintains an OS-level language dependency table. According to the Siemens runtime documentation, language switching is parameterized at the Computer Properties → Parameter tab in the WinCC Explorer; the active language is selected by the user via the flag icons in the runtime title bar or by the SetLanguage API. The WinCC V7.5 "How to Change Language in Runtime" manual describes the procedure to bind the language-change event to a function or a hotkey.
In WinCC Unified (TIA Portal V20/V21), the language model uses a two-level hierarchy: Project languages (used during engineering) and Runtime languages (used at runtime). The Siemens TIA documentation on "Languages in WinCC (RT Unified)" clarifies that the two levels are completely independent: a project language can be created in the engineering environment without being activated as a runtime language. For alarm-related text, the Locale IDs of the supported languages (RT Unified) page documents the BCP-47 style locale codes used by the AlarmSubscription.Language property at runtime.
Prerequisites
- WinCC V7.4 / V7.5 SPx (procedure identical for V7.0+) or WinCC Unified V16+ (different tool flow — see Section 8).
- Edit privileges on the WinCC project (local project, not remote-compiled).
- The Text Distributor start entry (WinCC Explorer → Tools → Text Distributor). This tool is part of the standard installation — no separate license.
- Microsoft Excel or any text editor capable of producing Unicode (UTF-16 LE, BOM-marked) plain text with
.txtextension. Notepad.exe with "Save as: Unicode" works; CSV saved directly from Excel will corrupt non-ASCII characters. - Read/write access to the project's
\TxtDist\working folder (auto-created on first export).
Step-by-Step Resolution Procedure
Step 1 — Verify All Project Languages Are Activated
- Open the WinCC Explorer.
- Right-click the project root → Languages.
- Confirm every required language is checked. Unchecked languages are not available to the Text Distributor and will produce
????. - Click Set as Project Language for the editing language; the additional tabs become the target languages.
Step 2 — Run the Text Distributor Export
- Launch the Text Distributor from WinCC Explorer → Tools → Text Distributor.
- In the Source Language dropdown, select the language used as the master (typically English).
- In Target Language, select the language that is showing
????. - Click Export → File (txt, csv).
- Choose a destination. The default folder is
<ProjectPath>\TxtDist\; the file is named with the language code, e.g.0009.txtfor English or0007.txtfor German. - The Languages.csv file is also written into the same folder and must be preserved; it maps the language IDs used in the export to the language tabs in the project. Do not edit this file manually.
Step 3 — Translate in Excel and Save as Unicode TXT
- Open the exported
.txtfile directly in Excel (drag-drop or File → Open → All Files → Unicode Text). - Translate every empty cell in the target-language column. The source-language column must remain untouched.
- Critical encoding step: Do not save back as CSV or XLSX. Use File → Save As → Save as type: "Text (Tab delimited) (*.txt)" → Save. Excel will prompt about format incompatibility — confirm Keep current format. Alternatively, open the file in Notepad and re-save with encoding Unicode (UTF-16 LE with BOM).
- Verify the file in a hex editor: the first two bytes must be
FF FE(UTF-16 LE BOM). A UTF-8 BOM (EF BB BF) is also acceptable in newer WinCC versions but UTF-16 LE is the canonical Siemens format and is the safest choice for legacy V7.x systems.
Step 4 — Re-Import Through the Text Distributor
- Return to the Text Distributor in WinCC Explorer.
- Click Import → From File. Navigate to the same
\TxtDist\folder and select the translated.txtfile. - The Text Distributor parses the file, matches text IDs to picture objects, and writes the translated strings back into the PDL picture objects.
- On completion, the tool writes an
ImportResult.xmlinto the same\TxtDist\folder. Open this file after every import — it lists every entry that failed to import, with a reason (e.g., "Picture not found", "Object property not available", "Encoding error").
Step 5 — Diagnose a Failed Import (ImportResult.xml)
The ImportResult.xml schema is straightforward. Typical failure entries and their meanings:
| Error Tag | Meaning | Remediation |
|---|---|---|
<Error>ENCODING</Error> |
File is not Unicode / wrong BOM | Re-save as Unicode TXT (UTF-16 LE) |
|
Picture was renamed or deleted between export and import | Re-export, translate, re-import |
<Error>PROPERTY_NOT_FOUND</Error> |
Object property does not exist in current target picture (e.g., text on a control that has been swapped) | Re-export to capture current picture set, then re-translate |
<Error>DUPLICATE_ID</Error> |
Two objects share the same Text ID | Regenerate Text IDs (Picture → Tools → Reset Text IDs) |
<Error>LANGUAGE_MISSING</Error> |
Target language not activated in project | Activate the language under project Properties → Languages |
Encoding Pitfalls and Common Import Errors
The most frequent import failure — and the one most often misattributed to a dongle or a project corruption — is the encoding mismatch. A translation workflow that uses Excel's "Save" (which writes CSV with system code page encoding) or saves as .csv (which writes UTF-8 without BOM) will appear to load into the Text Distributor but will fail the row-by-row match against the binary picture objects, producing an empty ImportResult.xml with all entries marked as "no change". The fix is always the same: a clean Unicode TXT file with the BOM intact.
Round-Trip Verification Test
Before committing a full project import, perform a single-picture round trip:
- Pick one picture with ten static text objects.
- Export → translate two entries → import.
- Inspect the PDL in the Graphics Designer — the translated strings should be visible in the property view for those two objects.
- Activate the project and toggle language in Runtime. If those two strings render correctly and the others still show
????, the import path is healthy and a full export/import cycle will succeed.
Verification in Runtime
After a successful import, complete the following verification sequence:
- Close the WinCC Explorer if open.
- Open Graphics Designer → Tools → Check Consistency. Any remaining
????entries will be flagged. - Activate the project.
- In Runtime, click the target language flag (or use the configured hotkey /
SetLanguageAPI call). - Navigate every process picture and visually confirm all text fields render in the target language.
- Trigger at least one alarm and verify the message list row also renders in the target language (this confirms the Text Library side of the localization is still intact after the import).
| Verification Step | Expected Result | Failure Indicator |
|---|---|---|
| Check Consistency passes | 0 errors, 0 warnings | Any "Missing language entry" warning = picture object table not fully populated |
| Runtime language flag toggles | Title bar updates, picture redraws | Flag does nothing = language tab not activated in project |
| All process pictures render localized text | No ???? visible anywhere |
Stray ???? = single object on that picture was not in the export scope (object was created after export) |
| Alarm line renders in target language | Message text shows translated string | Still in source language = Text Library row for that language is empty (edit via Alarm Logging → Text Library) |
| Project recompiles clean | OS Builder completes with no errors | Error → check ImportResult.xml from the most recent import |
WinCC Unified (TIA Portal) Equivalent Procedure
The Text Distributor is a WinCC V7.x tool. In WinCC Unified, the multilingual export/import is done from the project tree → Languages & Resources → Project languages with the Export translations and Import translations commands. The same rule applies: texts entered on screens via the Text property of an HMI tag / IO field / button are stored in the screen object and must be translated per screen via the language switching dropdown in the screen editor's properties pane. The TIA Portal V20 documentation on languages describes the project-language vs runtime-language separation, and the V21 locale ID list documents the runtime language codes used by API consumers.
A useful diagnostic in Unified: open any screen, switch the editor language dropdown to the target language, and check whether the text field is empty (untranslated) or shows the placeholder. If empty, the property value has never been entered for that language. Right-click → Translate text brings up the per-language editor.
Troubleshooting Matrix
| Symptom | Likely Root Cause | Resolution |
|---|---|---|
All text shows ???? including messages |
Language tab created but not added to project languages list | WinCC Explorer → right-click project → Languages → check the new language |
| Messages translate; static text does not | Text Library localized, picture objects not localized | Run Text Distributor export / translate / Unicode-TXT import |
Some pictures ???? after import |
Pictures modified or added after the export was taken | Re-export, translate only the new entries, re-import |
| Import does nothing, no errors logged | Encoding mismatch (CSV/UTF-8 without BOM) | Re-save as Unicode TXT (UTF-16 LE + BOM) |
| ImportResult.xml reports PICTURE_NOT_FOUND for a row | PDL file was renamed after the export was taken | Re-export, re-translate, re-import |
| Text shows source language after toggling runtime flag | Runtime language configuration does not include target language | Computer Properties → Parameter → enable target runtime language |
| Trend control axis labels still in source language | WinCC Online Trend Control stores its labels in a separate text table per picture | Re-export after opening the trend control configuration; the Text Distributor captures these strings only on open |
Group display entries ????
|
Group display internal text table not part of Text Library | Configure group display → translate directly in the configuration dialog for each language |
Performance and Project-Size Considerations
For projects with more than ~2,000 picture objects, the Text Distributor export produces files in the 1–10 MB range. Excel handles these, but the re-save step can take 30–60 seconds. For very large multi-language projects (10+ languages, 20,000+ text entries), a non-Excel workflow is faster: export to the Unicode .txt, then use a find/replace workflow in a dedicated editor such as Notepad++ (Encoding: UCS-2 LE BOM) or a script that operates on the \TxtDist\ files directly. The result must remain a Unicode TXT; the import engine does not accept XLSX or XLS.
Field Commissioning Tip
\GraCS\ folder and the \TxtDist\ folder before a bulk import.FAQ
Why do message texts translate correctly but static text on screens shows '????'?
Because WinCC stores message texts in the centralized Text Library and static text in the per-picture object table. Adding a new language tab in the Text Library does not auto-populate the picture-bound text tables — those must be localized through the Text Distributor export/import workflow with a Unicode TXT file.
Do I need a language dongle to add a new language in WinCC?
No. Project languages are created in the editor at no cost. A language dongle (WinCC Language Switch license) is required only if you want to change the operating-system / runtime UI language (menus, dialogs) at runtime, not to translate project text. The '????' symptom is unrelated to the dongle.
Why does my Text Distributor import complete without errors but nothing changes?
The file is almost certainly in the wrong encoding. Save the translated file as Unicode TXT (UTF-16 LE with BOM). A plain CSV saved from Excel uses the system code page and will silently pass through the importer without matching the binary picture objects. Verify by checking that the first two bytes of the file are FF FE.
Where is the ImportResult.xml file written?
In the project's \TxtDist\ folder, the same folder used for the export. The file is created on every import and lists every successfully applied and every failed row with a reason code (e.g., ENCODING, PICTURE_NOT_FOUND, PROPERTY_NOT_FOUND). It is overwritten on each import — copy it out if you need a historical record.
Does the same procedure apply in WinCC Unified (TIA Portal)?
No — the Text Distributor is a WinCC V7.x tool. In WinCC Unified, switch the screen editor language dropdown to the target language and enter translations directly in the Text property of each object, or use the project tree's Languages & Resources → Project languages → Export/Import translations workflow. The two-level separation between project languages and runtime languages still applies.