Loc Audit — Godot 4 localization QA
A downloadable plugin
Ship your game in one language and the layout is fine. Ship it in five and the buttons start pushing each other out of the row, a status line quietly loses half its sentence, and you hear about it from a player.
Loc Audit is a Godot 4 editor plugin that finds that damage before you ship.
Character counts don't find this
Other checkers estimate: this string is 40% longer in German, so it might not fit. That estimate is wrong in both directions, and here is why.
A Godot Control is never smaller than its own minimum size. A long translation does not spill out of a button — it makes the button bigger, and everything around it moves. Nothing is "overflowing" at any point, so looking for text that sticks out of a box finds nothing at all.
Loc Audit lays every scene out for real, in every locale, in an off-screen viewport, and measures what changed:
res://demo/main.tscn :: StartButton (Button) [de]
grew 140x (100 -> 240) - MENU_START -> "Spiel beginnen und fortsetzen"
res://demo/main.tscn :: MenuRow/SettingsButton (Button) [de]
grew 213x (70 -> 283) - MENU_SETTINGS -> "Einstellungen und Voreinstellungen"
The first locale in your list is the one you designed the screen in. Every other locale is compared against it, control by control.
And when a control is set to cut its text off instead of growing — clip_text, an overrun behaviour, or a LineEdit, which never grows — the words simply disappear. Those are measured against the width the control would actually need, icon and padding included:
res://demo/main.tscn :: StatusBar (Button) [de]
text is cut off: needs 283px, has 140px - MSG_WELCOME -> "Willkommen zurueck bei dem Spiel!"
Three more things it checks
| Untranslated | The key is in your CSV, but this locale's column is empty |
| Unused | Your CSV carries keys nothing in the project asks for any more |
| Undefined | The project asks for a key your CSV doesn't have |
| Hardcoded | A visible string assigned in GDScript that never went through tr() |
Keys are found through tr(), atr(), atr_n() and both arguments of tr_n(), plus translatable properties set in scenes. Comment lines and string literals are not counted, and anything under addons/ is left alone. A node with auto translation switched off is measured by the text it really shows, not the translation it would otherwise get.
The scanner reads your files as text rather than parsing them, so it sees a key where the key is written as a literal in the call — tr("MENU_START"). One held in a constant, joined from parts, or passed through a helper of your own is not seen, and its CSV row is listed as Unused: check a key before deleting it. Hardcoded likewise finds a literal written straight onto a visible property, not one set through set_text() or a variable.
CSV and PO, both directions
Godot reads CSV. Translators use PO. Loc Audit converts both ways:
- CSV → PO writes one locale out for a translator.
- PO → CSV merges the file back. Your other locale columns, and the keys the translator never touched, keep their values; the file is rewritten rather than patched, so its layout comes out as the plugin writes it. A CSV it cannot read — and one with an unnamed header column or a repeated key, which a rewrite could not carry over — is left untouched rather than replaced.
Quotes, newlines, tabs and backslashes survive the round trip — with one exception that is Godot's own: its CSV importer reads a backslash followed by a b f n r t v or a quote as an escape, so a value like C:\new cannot live in a translation CSV at all. Loc Audit tells you which keys hit that. The CSV is written beside the original and swapped in only once it is written and checked, so an ordinary failure — a full disk, a file it cannot open — leaves you with the file you already had rather than half of a new one.
What's in the box
- The plugin — one folder,
addons/loc_audit/. No dependencies, no build step. - A demo project with one of each fault built in, so you can press all four buttons before pointing them at your own game.
The dock fills its own fields in from Project Settings → Localization, so the first button you press already has something to work on.
How it was built
Loc Audit was built with AI tools: both the plugin's code and the text on this page were written with AI assistance, directed and reviewed by a person. Every claim above is held to an automated test suite that runs on Godot 4.4 and 4.7, and the plugin is loaded and exercised in a real editor on both before release.
The licence
Use it in as many projects as you like, forever — commercial ones included, at work, and in a repository the people working on those projects can read. No per-project fee, no seat count, nothing to credit. The one thing you may not do is pass the plugin on to somebody who has not bought it. The full text is LICENSE.txt in the download.
What it does not do
- It does not translate anything for you.
- It does not edit your scenes. Every result is a report you act on.
- Controls that scroll or page on purpose (
TextEdit,CodeEdit,RichTextLabel,ItemList,Tree) are not measured for growth, and folders holding a.gdignore— or anything underaddons/— are not scanned or laid out. - A
#, fuzzyentry in a PO, or one with an emptymsgstr, is left out of the CSV, the waymsgfmtleaves it out. A carriage return in a translation becomes a newline. - What is measured is the scene as the
.tscndescribes it. The check runs in the editor, and the editor only runs@toolscripts — so text an ordinary game script sets in_readyis not there to measure. A@toolscript does run, and nodes it creates are reported by their runtime path. - A CSV has nowhere to keep translator comments, so a PO written from a CSV carries none. Gettext plurals keep the singular form only, and
msgctxtis ignored. - Only text-format
.tscnscenes are scanned and laid out. Binary.scnscenes,.tresresources and GDScript embedded inside a.tscnare not. - A hidden branch — a dialog that opens later, a tab that is not the current one — is not measured, because Godot does not lay it out.
- The locales have to be registered under Project Settings → Localization. The dock warns about one nothing is loaded for.
- The overflow report prints the first 400 findings of a run; the key report lists 40 per category and counts the rest.
Requirements
Checked on Godot 4.4 and 4.7 — the full test suite passes, and the plugin loads in the editor and reports the numbers above from inside it, on both. Scenes are measured with your project's theme and default font, not the editor's. The versions in between have not been tried.
| Published | 6 days ago |
| Status | Released |
| Category | Tool |
| Author | Idle Hands |
| Tags | csv, gamedev, gettext, Godot, godot-plugin, localization, qa, tool, translation, User Interface (UI) |
| AI Disclosure | AI Assisted, Code, Text |
Purchase
In order to download this plugin you must purchase it at or above the minimum price of $12 USD. You will get access to the following files:




Leave a comment
Log in with itch.io to leave a comment.