Utilities
EaWLocalizationTool.GUI — a WPF editor for DAT files for manual translation and review, built for modders who need full control over localization. Loads the original DAT plus a translation source (TSV or another DAT); filters by status (All / Untranslated / Translated / Modified / Issues / Duplicates / Dup. differ / Similar / Technical); auto-validates \n, \r, %s/%d, [tags], <tags>, {modifiers}, and leading/trailing whitespace and line breaks; smart detection of technical entries (placeholders, crawl-text separators, DO NOT DISPLAY phrases, the TEXT_END_OF_DATA marker); a right-click context menu (copy original, paste original as translation, clear translation, copy key); safe writing that preserves CRC32 and keys as a byte-perfect copy of the original; autosave with a configurable interval; error/event logging for crash diagnostics; dark/light theme with font scaling; TSV export for Excel/Google Sheets.
“Base game → expansion” translation transfer — the “⇄ Transfer” button opens a window with four files (the base game’s original and translation, the expansion’s original and translation; the last two can instead be the expansion already open in the app). Row matching: first by key when the English text agrees (case/whitespace-insensitive), then by the English text itself — exact first, then normalized. A separate key match handles minor text differences: when the key exists in the base game and the English texts differ only by a typo, an extra or missing letter, or a punctuation mark, the translation transfers by key with no confirmation. Conditions (all together): a text of at least 20 characters, the changed fragment no longer than 3 characters and no more than 5% of the length (after trimming the shared start and end of the normalized texts), the same digits, and the difference isn’t merely a hyphen or a space (a different spelling of a name, e.g. “Abregado-rae” / “Abregado Rae”). Differences in words or numbers don’t qualify and go to confirmation instead. A dry-run preview (before anything is written) shows match counts per type, conflicts, unmatched rows, and how many rows will need confirmation.
Rows with any review mark other than “not reviewed” (-) are never overwritten; technical rows are never touched at all. Where the donor has several different translations of the same English original, a separate variant-picker window opens (default: skip). Disputed rows (the key exists in the base game, but its English text under that key differs) go to a confirmation window: both originals, the expansion’s current translation, and the base game’s translation by key and by phrase, all side by side; the “Result” column is edited just like a translation in the main window, with “match by key”/“match by phrase” buttons for selected rows and a cell context menu (copy, insert into result, append, insert all variants, apply the result to rows with the same text). The result is written to a NEW, timestamped (yyMMdd HHmm) DAT in the expansion’s translation folder — existing files are never overwritten, a paired TSV with review statuses is saved alongside it, and the previous working TSV is kept as .bak. A separate “Match report” button saves and opens a TSV with every row, its match type, and a discrepancy flag — with named filters (“Matched by key”, “Minor text difference”, “Same phrase in base game”, “Expansion only”, etc.), counters, search, and copy-only viewing.
Transfer is one specific action performed on two files; everything below is a standalone editor capability, not tied to the transfer feature.
Folder structure and session continuity — original\, translated\, work\, and transfer\ folders are created at startup and mirror the game’s own structure, so files copy from and into the game without any path changes; the transfer window picks the newest DATs from them automatically. For every opened translation, a working TSV work\{game}\{name} [{key hash}].tsv is kept next to the app: created when the file is opened (the previous version stays as .bak), updated on DAT save and autosave — the hash tells the base game and the expansion apart so the files never get mixed up. Reopening a translation picks review statuses back up from the paired TSV (or from the working file if there’s no paired TSV), so review progress isn’t lost between sessions; the ReviewStatus column is present both in the export and when a TSV is loaded as the translation source.
Review and bulk editing (a general editor capability, independent of transfer) — an editable “Review” column (+ / +/- / - or a free-form comment) with a counter and progress bar in the header; multi-row selection (Ctrl/Shift+click) and a “Review for selected” context menu apply a mark to the whole group at once. The “↔ Align edges” button matches the leading/trailing whitespace and line breaks of every translated non-technical row’s translation to its original, without touching the text in between.
Duplicates and similar rows (also a standalone capability, unrelated to transfer) — “Duplicates” (exact same English text) and “Dup. differ” (translations within the group have diverged) filters; “Similar” rows differ only in case or whitespace, with a tooltip explaining exactly how. “Apply to all duplicates” copies a translation across the whole group (reviewed rows are skipped by default); “Apply to similar (case-aware)” adapts the translation’s case to each target individually (lower/UPPER/Sentence case/Title Case).
EaWLocalizationTool (console) — extraction of XML/DAT/TXT into TSV, matching with translation, and repacking while preserving CRC32.
StarWarsLocalizer — an AI translator based on the Gemini API (3.1 Flash Lite / 2.5 Flash) with two-level hallucination verification and technical token control.
EaWTextureConverter — a WPF tool for batch DDS↔PNG conversion without external executables, compatible with any EaW/FoC mod. Recursive mod folder scan or manual file selection; DDS → PNG conversion preserving the alpha channel (via Magick.NET, DXT1/DXT3/DXT5) and PNG → DDS via a custom binary writer (uncompressed BGRA 32bpp, output compatible with DirectX 9/the Alamo engine); automatic mod root detection via the Data\Art structure with no hardcoded names; support for both EaW layouts (Data\Art\Textures and Data\patch2\DATA\ART\TEXTURES) with the full relative folder structure preserved in the output; column sorting, select/deselect all, bilingual interface, dark and light theme.
MEGExtractor — a tool for working with the game’s .meg archives.
Requirements
Windows 10/11 x64, .NET 10 Desktop Runtime
Build and Release
Starting with release v1.1.0, builds are automated via GitHub Actions (earlier releases were built and uploaded by hand): on a vX.Y.Z tag (or manually for an existing tag), the workflow builds EaWLocalizationTool.GUI and EaWTextureConverter in three variants at once — win-x64, win-x86 (self-contained, no .NET install needed) and generic (smaller, requires the .NET 10 Desktop Runtime) — and publishes a GitHub Release with notes pulled straight from this changelog, plus a SHA256SUMS.txt checksum file. Every release carries a build provenance attestation (GitHub build provenance attestation) that anyone can verify with gh attestation verify <archive> --repo EMP-UA/SW_EaW-Localization-Suite-UA_EN. With the right secrets configured, the same workflow also uploads the generic variant to Nexus Mods as a new version of the existing files.
Download
The latest releases are available on GitHub Releases.
Security and Transparency
The source code for all utilities and the Inno Setup installer script are completely open-source. Core tools are portable and run without special privileges: the SetupFonts.bat script automatically detects the OS version — on modern Windows (10 build 1809+ and 11) it allows local font installation without administrator rights, while older systems or a global install safely request elevation via UAC.
The installer uses HKEY_CURRENT_USER solely to support the uninstaller and track the version (to prevent duplication); SetupFonts.bat modifies the Fonts branch (in HKEY_CURRENT_USER or HKEY_LOCAL_MACHINE, depending on the choice made) to officially register fonts, which the game engine requires. Gemini API keys are entered manually by the user and are not stored in the repository.
The uninstaller completely removes all localization files and its own registry entries, and interactively confirms before automatically removing installed fonts from the system.
The files have been checked by Nexus Mods moderation and VirusTotal. The lack of a digital signature is standard for non-commercial fan projects.
Related Project
Developed for Star Wars: Empire at War — Ukrainian Localization.
Credits
- Gemini API — the main linguistic engine
- CsvHelper — TSV table processing
- Magick.NET — DDS decoding
- ImageSharp — PNG processing
- BCnEncoder.NET — BCn encoding
- Inno Setup — installer
- Exo 2 — base for the game’s Ukrainian fonts