Translations that stay
in sync with your script.

BranchPy's Localization tools track coverage across every language in your Ren'Py project, export strings to Excel for your translators, and apply finished translations back in one step — without leaving VS Code.

✓ Coverage by language 📊 XLSX export / import 🔍 Pre-apply validation 🔒 Backup on every apply 🌐 Multi-language

Managing translations by hand doesn't scale

A Ren'Py tl/ folder with two or more languages quickly becomes unmanageable. Strings get added to the source, but translators work in separate files or spreadsheets. By release, you don't know which strings are translated, which are stale, and which are orphaned leftovers from a rewrite.

BranchPy's Localization Coverage audit reads your actual tl/ files at any time and gives you an exact count. The Export → Translate → Import round-trip replaces copy-paste workflows with a structured, validated pipeline that checks every row before writing a single file.

What it does

📊

Coverage Audit

Per-language coverage percentage, missing string count, and orphaned block detection — all in one panel that updates every time you re-run.

📤

Export to XLSX

Export every translatable string to a spreadsheet with source text, translation key, source file, and language columns. Translators can work in any spreadsheet tool.

🔍

Import & Validate

Load the finished workbook and get a full validation report before writing anything: missing keys, placeholder mismatches, duplicate rows, and empty translations all flagged separately.

Apply with Preview

The preview panel shows every row that will change, grouped by language. Rows with warnings require explicit confirmation; rows with errors are blocked until fixed in the spreadsheet.

⚠️

Source Drift Detection

If the English source changed since the translator received the export, the affected rows are flagged as SOURCE_DRIFT so you can decide whether to accept or skip them per row.

🔒

Automatic Backup

A timestamped backup of every .rpy file that will be modified is created before the first write. If anything goes wrong, you have a complete point-in-time snapshot to restore from.

See it in action

Screenshots from BranchPy v1.1.24 running on a Ren'Py project with French and Italian translations.

BranchPy XLSX export open in Excel showing locale, key, source_text, translation, status, and source_file columns for French and Italian rows
The exported workbook in Excel — locale, key, source text, translation, status, and file path in every row
alt="Localization Coverage panel in VS Code showing 15 source strings, 100% coverage for French and Italian, and 3 orphaned blocks" style="width:100%; border-radius:10px; border:1px solid rgba(255,255,255,0.08);" loading="lazy">
Coverage panel — per-language breakdown with Export and Import & Validate buttons
L10n Import Preview panel showing 33 total rows, 23 to update, 10 warnings — rows listed by French and Italian locale
Import Preview — every change listed before a single file is written
Import Preview panel continued — warnings section showing 10 EMPTY_TRANSLATION rows, Apply button visible at the bottom
Warnings are listed per row — Apply is gated until you explicitly confirm

The round-trip workflow

Export → translate → import → apply. Each step is independent — pause between any two without losing work.

  1. Run Coverage AuditSee current translation percentages and find missing or orphaned strings before you start.
  2. Export to XLSXClick Export in the Localization section of Control Center. Save the workbook and send it to your translator.
  3. Translate in ExcelThe translator fills in the Translation column. The source text and file path are there for context.
  4. Import & ValidatePick the finished workbook. BranchPy validates every row and opens a preview of all changes.
  5. Review & ApplyApprove the preview. BranchPy backs up the .rpy files, writes the translations, and reports coverage before and after.

Validation — what gets checked

Every row in the workbook passes through 8 checks before it can proceed to Apply.

Code Outcome What it means
PLACEHOLDER_MISMATCH Rejected A [variable] or {tag} present in the source is missing from the translation, or vice versa.
EMPTY_TRANSLATION Warning The translation cell is blank. The row can still be applied if you confirm.
SOURCE_DRIFT Warning The source text changed after export. The translation may be based on outdated text.
UNKNOWN_KEY Rejected The translation key no longer exists in the project (the string was removed or renamed).
DUPLICATE_KEY Rejected The same key appears more than once in the import file.

Free for all Ren'Py projects

Localization Coverage is included in the free Ren'Py tier. Install BranchPy, open your project, and run your first audit in seconds.

Get BranchPy free Installation guide