Real-time inspection and verification of Simoa HD-X UI translations.
Click the button above to download woof.bat to the HD-X instrument PC.
It will automatically install and launch Woof. Inspection starts immediately.
Woof is a self-contained WPF overlay that helps verify translations in the Simoa HD-X software. It uses Windows UI Automation to inspect UI elements in real-time, looks up their expected translations in a local database extracted from the software's satellite assemblies, and flags mismatches.
The overlay window is always on top and resizable (drag the bottom-right grip). Drag the navy title bar to reposition it. Inspection is always active from launch - simply hover over any Simoa UI element. To temporarily pause inspection, switch to the full overlay window (not compact view) and minimize it. Restore the window to resume.
When you run woof.bat, a PowerShell console window will appear briefly showing extraction progress. This is normal - it auto-hides once the overlay is ready. During this time, Woof:
The extraction runs every launch to ensure the database matches your installed Simoa version.
The main tab. Hover your cursor over any Simoa UI element to see:
Match badges appear next to the translation lookup:
| ✓ MATCH | The UI text matches the expected translation for the detected language. |
| ✗ MISMATCH | The UI text does not match the expected translation. This is a potential localization issue. |
| - NOT TRANSLATED | The UI text still shows the English baseline, meaning the element has not been translated for this language. |
Below the translation section, the Screenshot Output area shows the current output folder. Click Browse to change it (persists across sessions). Click ? to reveal a help tooltip about the folder structure and filename format.
The Screenshot / List Sync buttons reconcile screenshots and CSV issue lists (explained below).
Search the translation database by key or value across all languages. Type multiple words to match in any order (case-insensitive). Results are capped at 500 entries.
Lists the most recent 500 inspected elements (newest first) with their control type, visible text, match status, and timestamp. Click any entry to jump back to the Inspector tab with that element's full translation details. History is in-memory only and resets when Woof is closed.
Shows metadata about the loaded translation database: total keys, language count, app version, source path, extraction timestamp, and currently detected language. The Source Files section lists every satellite assembly that strings were extracted from.
These work from any window - no need to focus Woof. The hotkey footer at the bottom of the overlay serves as a quick reminder.
| Shift+Alt | Toggle compact view - a small floating popup that follows your cursor showing the expected translation. The main window hides while compact view is active. The popup is click-through (you can interact with Simoa underneath). Press Shift+Alt again to return to the full window. |
| Ctrl+Shift | Capture a full-screen screenshot (PNG) of the primary monitor. A red gradient circle marks the cursor position. The file is saved to Woof_Results/Screenshots/{language}/ with a unique serial number in the filename. A matching row is appended to the CSV issue list. A confirmation popup briefly appears showing the serial number. |
Compact view replaces the full overlay with a small, semi-transparent popup that follows your cursor in real-time. It shows the expected translation for whatever UI element you're hovering over.
The popup border and glow indicate the match status:
| Green | Translation matches - the UI text is correct for the detected language. |
| Red | Mismatch - the UI text differs from the expected translation. |
| Cyan | Not translated - the UI text still shows the English baseline. |
The popup hides automatically when there's no translation data for the element under the cursor. Screenshots (Ctrl+Shift) work in compact mode too - a brief confirmation with the serial number appears next to the popup.
Every time you press Ctrl+Shift, Woof saves a screenshot and logs an issue entry. The output folder structure is:
Woof_Results/
Screenshots/
de/ <- one subfolder per language
Btn_OK (00001).png
T_MainTab-TI_Setup (00002).png
fr/
TI_UI.Reporting.ReportsView-C-DG_dataGrid (00003).png
List/
de_Issues.csv <- one CSV per language
fr_Issues.csv
Filenames are built from the UI hierarchy of the inspected element. Each ancestor contributes an abbreviated control type and its label (AutomationId or English-translated name), joined by hyphens. The result is truncated to 140 characters, followed by a unique 5-digit serial number in parentheses.
Filename abbreviations keep paths short to avoid Windows' 260-character path limit:
| Control types | Abbreviated to short codes: Button->Btn, Tab->T, TabItem->TI, Custom->C, DataGrid->DG, Pane->P, Header->H, HeaderItem->HI, Text->Tx, CheckBox->CB, ComboBox->Cmb, List->L, ListItem->LI, RadioButton->RB, Group->G, ScrollViewer->SV, Menu->M, MenuItem->MI, etc. |
| Namespace labels | Dotted names (e.g. Stratec.UserInterface.Reporting.EventLogView) are stripped to the last segment only (EventLogV). PART_ prefix is also removed. |
| Common words | Long words in class names are shortened: Report->Rpt, Results->Res, Sample->Smp, Column->Col, Header->Hdr, Processing->Proc, Current->Cur, Search->Srch, Barcode->BC, View->V, ViewModel->VM, Control->Ctrl, Presenter->P, etc. |
Example: TabItem_Stratec.UserInterface.Reporting.SampleResultsReportView becomes TI_SmpResRptV.
Serial numbers are global (shared across all languages), start at 00001, increment with every screenshot, and persist across sessions. They are stored in %LOCALAPPDATA%\Woof\woof_serial.txt. Delete this file to reset the counter.
CSV columns (UTF-8 with BOM, values double-quote escaped):
Serial, Baseline (EN), Expected, UI Hierarchy, Assembly, Resource, Screenshot Path
A brief confirmation popup appears after each capture showing the serial number (e.g. "Screenshot #00001 saved"). It auto-dismisses after 15 seconds or when you move the cursor.
The default output folder is your Desktop. Click Browse in the Inspector tab to change it - the setting persists across sessions.
Screenshots and CSV rows are linked by serial number. If you manually delete a screenshot file or edit a CSV, the two can get out of sync. The sync buttons in the Inspector tab reconcile them across all languages at once:
| Prioritize Lists | Keeps the CSVs as source of truth. Scans all CSV files, collects every serial number, then deletes any screenshot file whose serial does not appear in any CSV. Use this after cleaning up your issue lists. |
| Prioritize Screenshots | Keeps the screenshot files as source of truth. Scans all screenshot folders, collects every serial number from filenames, then removes any CSV row whose serial does not match an existing screenshot. Use this after deleting screenshot files you no longer need. |
A status message below the buttons shows the number of items deleted or removed after each sync.
Click the View / Edit Issues button at the bottom of the Inspector tab to open a full-screen viewer window. This window lets you browse all captured screenshots and their associated CSV issue entries in one place.
Language selector: Buttons across the top bar show each language that has issue data. Click a language to load its issues. The active language is highlighted in navy.
Issue rows: Each row shows:
The viewer window is resizable (opens maximized by default), is not always-on-top (unlike the main overlay), and appears in the Windows taskbar with a Woof icon. When the viewer opens, the main overlay automatically minimizes to the taskbar. It restores when you close the viewer. Deletions are permanent - both the screenshot PNG and the CSV row are removed immediately. If deleting the last issue for a language removes all rows, the CSV file itself is deleted.
Woof automatically detects which language the Simoa software is running in. On launch it defaults to English, then re-detects every time you left-click anywhere on screen (with a 10-second cooldown between checks).
Detection works by scanning up to 300 visible UI elements via Windows UI Automation and matching their text against each language dictionary. Strings that also appear in the English/neutral dictionary are only counted for English to avoid false positives from shared terms (e.g. "OK", "USB"). The language with the most unique matches wins. If no matches are found, it falls back to English.
The detected language is shown in the status bar at the top of the overlay (e.g. "Language: German (de)").
All Woof data is stored locally under %LOCALAPPDATA%\Woof\:
| translation_data\ | Extracted translation JSON files (one per language) and extraction metadata. Regenerated on every launch. |
| woof_config.json | Persisted settings (currently: screenshot output path). Updated when you change the output folder via Browse. |
| woof_serial.txt | Current screenshot serial counter. Delete this file to reset numbering back to 00001. |
| woof.log | Debug log with timestamped entries for inspection, language detection, and screenshot operations. |
Issue Viewer Window, Icon, Code Modularization
Filename Abbreviations, Single-Instance Guard, History Fixes
> separatorsScreenshot Serial Numbers, CSV Issue Lists, Sync Buttons
00001) that persists across sessionsWoof_Results/List/{language}_Issues.csv with baseline, expected, hierarchy, assembly, and resource infoWoof_Results/Screenshots/{lang}/ and CSVs to Woof_Results/List/Smooth Compact Follow, Screenshot Cursor Indicator, Database File Listing
GetConsoleProcessList APIPolish, Animations, Screenshot Fix, Console Cleanup
? tooltip explaining folder structure and filename logicCompact View, Screenshot Capture, Hotkeys
Shift+Alt to toggle a small popup that follows your cursor showing the expected translationCtrl+Shift to save a full-screen PNG to Woof_Results/{lang}/ with an English-derived filenameCompact UI, Language Fix, Debug Log Upload
Always-On Inspection, Language Detection Fix
Resizable Window, Translation Fixes, DPI Awareness
Standalone Light-Theme Tabbed Inspector
Initial Release