React + TypeScript application for syncing and reviewing Ignition exports.
The project runs in two modes:
- Web app (Vite)
- Desktop app (Electron wrapper around the same web UI)
Upload multiple Ignition translation XML files and merge them.
How it works:
- Parses all uploaded XML translation terms.
- Groups terms by key.
- Keeps keys that have one unique value across files.
- Flags keys with conflicting values as conflicts.
- Shows conflicts in an expandable list with per-value file provenance (which value appears in which files).
- Lets you select one value per conflicting key to include in the merged export.
- Any conflicting key without a selected value is excluded from export.
- Supports
Collapseper conflict andCollapse Allfor expanded conflicts.
Language validation for export:
- Ignition translation language is inferred from the uploaded filename suffix (final
_xxsegment before extension), for example_en,_pt,_es. - All uploaded files must share the same language suffix.
- If suffixes are mixed or missing, an inline error is shown and download is disabled.
Output:
merged_translations_<language>.xml(example:merged_translations_en.xml)- Conflict review + selection UI in the page
Upload multiple Ignition UDT definition JSON exports and compare/merge them.
How it works:
- Recursively finds all
tagType: "UdtType"definitions from each JSON. - Compares definitions with order-insensitive matching for object keys/arrays.
- Detects:
- Missing definitions per file
- Definition mismatches for same UDT name
- Mismatch type details:
- Missing properties only
- Unequal values only
- Missing properties + unequal values
- Shows expandable differences with:
- Highlighted JSON sections
- Variant-level missing/unequal summaries
- Copy JSON buttons
- Optional per-finding
Union mergeswitch (available for missing-properties-only mismatches) - Glossary info button for Difference/Mismatch/Missing/Unequal terms
- Collapse single / Collapse all controls
- Optional debug tools toggle (reveals temporary debug export actions)
Merge rule:
- Uses the first uploaded file as reference.
- By default, for UDT names that exist in the reference file, the merged output keeps that reference definition.
- If a UDT name is missing in the reference file, it keeps the first occurrence by upload order.
- Folder/path placement is resolved separately from definition content:
- Removes synthetic wrapper roots like
_types_when present in source exports. - Preserves provider folders (for example
isaac,isaac-uns,main) in the final merged file. - For the same UDT name found in multiple folders across files, uses the most specific folder path (deepest path) for merged output.
- Removes synthetic wrapper roots like
- For mismatches that are
missing properties only, you can enableUnion mergeon that finding to include the union of unique properties from all variants in the final export. Union mergedoes not override unequal-value conflicts; those continue following the reference-based rule.- Produces a merged JSON with unique UDT names.
Output:
merged_udt_definitions.json
Upload one Ignition translation XML and one or more Ignition project ZIP exports, then remove unused translation entries.
How it works:
- Parses all terms from the uploaded translation XML.
- Extracts all uploaded project ZIP files in memory.
- Scans text-based project files for key usage (
.json,.xml,.py,.sql,.txt,.yaml,.yml,.csv,.js,.ts,.tsx,.jsx). - Treats a key as
usedwhen the full key string exists in any scanned file. - Lists
unusedterms in a review table (Unused Translation Entries). - Exports a cleaned translation XML containing only used keys.
Detection note:
- This scan is literal string matching.
- Keys assembled dynamically at runtime (for example via string concatenation in scripts/expressions) may not be detected and can appear as unused.
Debug tools:
- A
Show debug toolstoggle reveals temporary troubleshooting actions. Download Cleaner Debug Data (Temporary)appears at the bottom of the analysis results box.
Output:
- If input filename ends with a locale suffix (
_en.xml,_es.xml,_pt.xml, etc.), export is named with_cleanedbefore the locale suffix. Example:merged_translations_en.xml->merged_translations_cleaned_en.xml - Fallback for non-locale filenames:
<name>_cleaned.xml
For Sync Translation, Sync UDT Definitons, and Translation Cleaner:
- Uploaded files and analysis results persist when switching tabs.
- State resets only when:
- You change/remove files in that tab
- You reload/restart the application
- React 19
- TypeScript 5
- Vite 6
- Electron 38
- Bootstrap 5
fast-xml-parser5.3.6jszip3
- Node.js 20+ (LTS recommended)
- npm 10+ recommended
- Windows for
.exepackaging
npm install
npm run devOpen the URL shown by Vite (default: http://localhost:5173).
npm install
npm run dev:appWhat this runs:
npm run dev(Vite dev server)npm run dev:electron(launches Electron after server is ready)
npm run buildPreview web production build:
npm run previewnpm run build:appThis builds web assets and packages Electron using electron-builder.
Windows artifacts (from current config):
- Installer (NSIS):
release/Ignition Sync Workbench Setup <version>.exe - Portable executable:
release/Ignition Sync Workbench <version>.exe
Build only the Windows portable executable:
npm run build:portablenpm run dev-> Start web dev server (Vite)npm run dev:electron-> Start Electron against existing dev servernpm run dev:app-> Run Vite + Electron togethernpm run build-> Type-check + web production buildnpm run build:web-> Web production build onlynpm run build:app-> Web build + Electron packagingnpm run build:portable-> Web build + Windows portable executable onlynpm run preview-> Serve built web assets locallynpm run lint-> ESLint
Before pushing changes:
npm run lint
npm run buildRecommended:
- Keep
package-lock.jsoncommitted. - Keep large local sample exports outside version control.
- Add new parser/comparison logic with deterministic rules and tests where possible.
electron/ Electron main + preload
src/
components/ UI pages/components
utils/ XML/JSON parsing, merge, comparison logic
public/ Static assets
- Confirm
npm run devworks first. - Then run
npm run dev:app(it waits forhttp://localhost:5173).
- Unsigned executables can trigger SmartScreen.
- For distribution, use code signing.
- Data persists across tabs in this version.
- If data is lost, check if the page/app was reloaded.
No license file is currently included in this repository.