Localization Inspector
Woof

Woof

Real-time inspection and verification of Simoa HD-X UI translations.

Download Woof

Download woof.bat Version 2.11.0

Quick Start

This tool must be run on an HD-X instrument PC with the Simoa software installed.
1

Download

Click the button above to download woof.bat to the HD-X instrument PC.

2

Double-click to run

It will automatically install and launch Woof. Inspection starts immediately.

System Requirements

  • Windows 10/11 with PowerShell 5.1 or later
  • Simoa HD-X software installed (for translation extraction)
  • .NET Framework 4.5+ (included with Windows)
  • No admin rights required

Overview

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.

Startup Behavior

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:

  1. Auto-detects your Simoa HD-X installation path
  2. Extracts the latest translation strings from all satellite assemblies (takes a few seconds)
  3. Loads the translation database into memory
  4. Opens the overlay window and begins inspecting

The extraction runs every launch to ensure the database matches your installed Simoa version.

Tabs

Inspector

The main tab. Hover your cursor over any Simoa UI element to see:

  • Element Inspector - TYPE (e.g. Button, TextBlock), TEXT (the visible label), ID (AutomationId), and CLASS (the WPF class name).
  • UI Hierarchy - the element's path from its top-level ancestor down, showing each parent's type and name.
  • Translation Lookup - the database key, match type (exact_id, exact_text, or neutral_text), the English baseline, and the expected translation for the detected language.
  • Assembly & Resource - which .NET assembly and resource file the translation came from.
  • All Translations - click the "ALL TRANSLATIONS" toggle to expand/collapse a card for every language in the database.

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

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.

History

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.

Database

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.

Global Hotkeys

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

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.

Screenshot & CSV Issue List

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.

Sync Buttons

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.

Issue Viewer

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:

  • Delete button (red X) - removes the screenshot file from disk, deletes the CSV row, and removes the row from view
  • Serial number - the 5-digit serial matching the screenshot filename
  • Screenshot thumbnail - a scaled-down preview of the captured screenshot
  • Baseline (EN) / Expected - stacked vertically: the English source text on top, the expected translation for the selected language below (in blue)

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.

Language Detection

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)").

Data Storage

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.
v2.11.0 Latest February 2026

Issue Viewer Window, Icon, Code Modularization

  • Issue Viewer: New full-screen window for browsing and managing captured screenshots and CSV issue entries - launched via "View / Edit Issues" button in the Inspector tab
  • Language selector: Top bar shows buttons for each language with issue data; click to switch languages
  • Issue rows: Each row displays a delete button, serial number, screenshot thumbnail, and stacked Baseline (EN) / Expected text
  • Delete issues: Click the red X to permanently remove a screenshot file and its CSV row; deletes the CSV file entirely if no issues remain
  • Auto-minimize: Main overlay minimizes when the viewer opens, restores when it closes
  • Resizable window: Opens maximized, supports resize, not always-on-top, shows in taskbar
  • Application icon: Navy "W" icon appears in the Windows taskbar for both the main overlay and the Issue Viewer
  • Code modularization: Overlay split into woof_overlay.ps1 + woof_overlay_viewer.ps1 (both under 1500 lines)
  • Debug log: Now overwritten on each launch instead of appending
v2.10.0 February 2026

Filename Abbreviations, Single-Instance Guard, History Fixes

  • Filename abbreviations: Control types shortened (Button->Btn, TabItem->TI, Custom->C, etc.), dotted namespace labels stripped to final segment, and common words abbreviated (Report->Rpt, Sample->Smp, View->V, etc.) for much shorter filenames
  • Single-instance guard: Launching Woof while already running shows a warning popup instead of starting a duplicate
  • History "Not Translated": Elements showing the English baseline are now marked with a cyan " - Not translated" badge instead of red "Mismatch"
  • No DB match in red: Elements not found in the translation database now show red in the History tab (was gray)
  • Fixed: Screenshot save failures on long paths (MAX_PATH exceeded) - filename truncation tightened
  • Fixed: CSV issue lists no longer have multi-line entries - UI hierarchy newlines collapsed to > separators
v2.9.0 February 2026

Screenshot Serial Numbers, CSV Issue Lists, Sync Buttons

  • Serial numbers: Each screenshot gets a unique 5-digit serial (e.g. 00001) that persists across sessions
  • CSV issue lists: Every screenshot automatically appends a row to Woof_Results/List/{language}_Issues.csv with baseline, expected, hierarchy, assembly, and resource info
  • Restructured output: Screenshots now save to Woof_Results/Screenshots/{lang}/ and CSVs to Woof_Results/List/
  • Sync buttons: "Prioritize Lists" deletes orphan screenshots not in any CSV; "Prioritize Screenshots" removes orphan CSV rows with no matching screenshot
  • Confirmation popup: Now shows the serial number (e.g. "Screenshot #00001 saved")
v2.8.0 February 2026

Smooth Compact Follow, Screenshot Cursor Indicator, Database File Listing

  • Compact view: Now smoothly follows cursor with animated easing — no more static positioning
  • Screenshot cursor indicator: A semi-transparent red gradient circle marks the cursor position in saved screenshots
  • Database tab: Lists all source assembly files used for string extraction (filename + folder path)
  • Hotkey footer: Redesigned with dark navy background and highlighted key names for better visibility
  • Removed: Regenerate Database and Re-detect Language buttons (both fully automated at launch)
  • Fixed: Console window now reliably closes via GetConsoleProcessList API
v2.7.0 February 2026

Polish, Animations, Screenshot Fix, Console Cleanup

  • Compact view: Hides automatically when no translation text to show (no more empty black box)
  • Styling: Dark green background with glowing border effect on compact popup
  • Screenshot confirmation: Brief "Saved!" popup appears for 15 seconds after capture, auto-hides on cursor movement
  • Button animations: All buttons have rounded corners and elastic bounce animation on hover
  • Screenshot help: Expandable ? tooltip explaining folder structure and filename logic
  • Fixed: Ctrl+Shift screenshot capture now works reliably
  • Fixed: Console window now closes properly when overlay is closed
v2.6.0 February 2026

Compact View, Screenshot Capture, Hotkeys

  • Compact view: Press Shift+Alt to toggle a small popup that follows your cursor showing the expected translation
  • Screenshot capture: Press Ctrl+Shift to save a full-screen PNG to Woof_Results/{lang}/ with an English-derived filename
  • Screenshot output path: Configurable via Browse button in Inspector tab — persists across sessions
  • Hotkey footer: Keyboard shortcuts displayed at the bottom of the overlay window
v2.5.0 February 2026

Compact UI, Language Fix, Debug Log Upload

  • Compact: Window reduced to 380x420 (from 500x525) — smaller footprint alongside Simoa
  • Fixed: Re-detect Language button now uses the correct dedup algorithm
  • New: Debug logs auto-upload to Cloudflare for remote diagnostics
  • New: Detailed language detection logging (dictionary sizes, sample texts, vote breakdown)
v2.4.1 February 2026

Always-On Inspection, Language Detection Fix

  • New: Inspection starts automatically on launch - no manual toggle needed
  • Removed: Inspect button (always-on 24/7 real-time inspection)
  • Fixed: Language detection no longer misidentifies English UI as French
  • Fixed: HD-1 references updated to HD-X throughout UI
v2.3.1 February 2026

Resizable Window, Translation Fixes, DPI Awareness

  • New: Resizable window with drag grip (MinWidth 350, MinHeight 400)
  • Fixed: Element name newline normalization - multiline tab headers now match DB
  • Fixed: DPI-aware cursor exclusion zone (physical-to-logical conversion)
  • Fixed: Translation lookup now finds multiline UI text (e.g., "System Resources")
  • Fixed: History "No DB match" caused by newlines in element text
  • Fixed: Hierarchy text no longer wraps mid-word due to embedded newlines
  • Improved: All v2.2.x reliability fixes included (resource disposal, SharedState sync, etc.)
v2.0.0 February 2026

Standalone Light-Theme Tabbed Inspector

  • New: Fully self-contained - no web browser or WebSocket needed
  • New: Light theme with Quanterix branding (500x750 window)
  • New: 4-tab interface - Inspector, Search, History, Database
  • New: Search translations by key or value across all languages
  • New: Inspection history with CSV export
  • New: Database tab with stats, regeneration, and language re-detection
  • Improved: Cursor-position-based skip for smoother inspection
  • Removed: WebSocket server (no longer needed)
v1.0.0 January 2026

Initial Release

  • Real-time UI element inspection via Windows UI Automation
  • Translation lookup from .NET satellite assemblies
  • WebSocket server for web app integration
  • Dark theme overlay popup
  • Automatic language detection
  • On-demand database regeneration