Getting started
FitQuill answers one question: does every translated line fit in its text box, drawn with your game's pixel font? Counting characters is not enough with pixel fonts: an "i" may be 2 pixels wide and an "M" 6. FitQuill measures each letter, breaks the lines the way your engine does, and lists every text that is too wide or has too many lines.
The short version
- Drop your text files: one CSV with a column per language, or one JSON file per language.
- Drop your font: a .ttf/.otf pixel font, or a .fnt file with its .png image.
- Set your boxes: FitQuill guesses a size for each kind of text. Replace the guesses with your real box sizes.
- Check the variables: give the longest value each
{NAME} or %d can take.
- Read the results, click a red line, type a shorter version, and watch the overflow disappear.
- Save the fixed files with the full version (this demo checks everything and lets you try fixes).
You can drop texts and font together, in any order, on the start screen. To look around first, click Try with an example.
Everything happens on your computer. FitQuill is a single page that works offline: no file is ever uploaded.
1 · Texts
CSV, one column per language (the Godot format)
keys,en,fr,de
menu.quit,Quit,Quitter,Beenden
dialogue.intro,"Hello, traveller!","Bonjour, voyageur !","Hallo, Reisender!"
- The first column holds the keys, the first row the language codes (
en, fr, pt_BR, zh_Hans…).
- Separators: comma, semicolon or tab, found automatically. Excel's
sep=; first line is understood.
- Texts with commas, quotes or line breaks must be in double quotes, as Excel and Godot write them.
- Columns that are not a language (
comment, notes…) are skipped. Start a column name with _ to hide it from Godot and FitQuill.
JSON, one file per language
en.json { "menu": { "quit": "Quit", "play": "Play" } }
fr.json { "menu": { "quit": "Quitter", "play": "Jouer" } }
- The language comes from the file name:
fr.json, strings_fr.json, ui-pt_BR.json.
- Nested keys are joined with dots:
menu.quit. Flat keys work too.
- One file holding every language (
{ "en": {…}, "fr": {…} }) is also read.
- Language files can be dropped together or one after the other: each one is added to the project. A file with the same name or language replaces the old one, and your fixes in the other languages are kept.
- Two files with the same name in different folders (
en/strings.json, fr/strings.json) must be renamed first, because FitQuill tells files apart by name.
Encodings
UTF-8 (with or without BOM), UTF-16 and Windows-1252 (Excel's default on Windows) are recognised. Fixed files are saved in the same encoding, with the same line endings.
Source language
The source language is the one your boxes were designed for (English by default). FitQuill uses it to guess the first box sizes, since its texts already fit. Pick another one with the round button in the language table of section 1.
What section 1 reports
Missing and empty translations, keys written twice (most engines silently keep the second one), and translations that lose or add a variable: {GOLD} in English but not in French usually means a broken line in the game.
2 · Font
TrueType or OpenType (.ttf, .otf)
Pixel fonts are drawn on a grid: they are sharp at one size (8, 12, 16 px…) and its multiples. FitQuill finds that size and uses it. If your game draws the font at another size, pick it in Pixel size: every size from 5 px is offered.
- ×2, ×3 mean the font drawn 2 or 3 times bigger. Box widths are then measured in those bigger pixels too.
- Widths come from the font's own letter advances and kerning, exactly as Godot adds them up.
- At a size where the font's pixels fall between screen pixels, FitQuill shows a note: the game will look blurry and may round a pixel here and there. Prefer the sharp size or a multiple.
AngelCode bitmap font (.fnt + .png)
Drop the .fnt file together with its .png image (or images). Text, XML and binary .fnt files are read, with their kerning. These are the files made by BMFont, Hiero, FontQuill and most bitmap-font tools.
Characters missing from the font
Every character used by your texts is looked up in the font. A missing one shows as an empty box (or nothing) in the game. The list gives the character, its code and the keys that use it, so you can add it to the font or change the text.
Try a line
Type anything to see it drawn with the font, at any zoom, on a dark or light screen. The width of each line is shown in pixels.
3 · Boxes
A rule gives the room of one kind of text box: its width in pixels (the room for text, inside the box borders and margins) and its maximum number of lines.
| Pattern | Width | Lines | Applies to |
menu.* | 48 | 1 | menu.quit, menu.play… |
dialogue.* | 220 | 3 | every dialogue line |
dialogue.boss_* | 180 | 2 | dialogue.boss_intro (beats dialogue.*) |
*_title | 120 | 1 | shop_title, quest_title… |
* matches anything. When several rules match a key, the most precise one wins (the one with the most letters outside the stars).
- Keys matched by no rule use the Everything else row at the bottom of the table.
- FitQuill guesses one rule per key prefix from the source language. Guessed rules are marked guessed and follow the font if you change it. Once you edit a rule, it is yours and stays as typed.
- Guess sizes again rebuilds the guesses from the current texts and font.
Measure your boxes in the game or in the engine editor. In Godot, it is the Label's width (its size.x), in the same pixels as the font size.
4 · Variables
In the game, {GOLD} becomes 5 or 99999, and {PLAYER_NAME} becomes whatever the player typed. FitQuill measures each text with the longest value of each variable, so a line that passes fits for every player.
- Recognised forms:
{name}, {0}, {{name}}, ${name}, %s, %d, %1$s, %NAME%, and RPG Maker's \N[1], \P[1], \V[1], \G.
- A first value is guessed from the name (
GOLD gives a number, NAME a long name). Type your game's real limits: the longest name allowed, the biggest amount of gold.
- Use wide letters for names:
WWWWWWWWWWWW is a fair worst case for a 12-letter name.
- Go back to the guessed values undoes your changes.
5 · Fit check
Every text, in every language, is wrapped the way your engine does it and compared with its box.
- Line breaks: choose your engine first (see Line-break modes). It changes where lines are cut, so it changes the results.
- The language cards give the number of texts that overflow in each language. Click one to show only that language.
- The results table can show all problems, overflows only, too many lines, too wide, missing characters, or everything including the texts that fit. Filter by language, category or search words.
The problems
| Problem | Meaning |
| Too many lines | The text needs more lines than the box has, e.g. "4 lines, 3 max". |
| Too wide | A line is wider than the box, by the number of pixels shown. |
| Word too long | One word is wider than the box: no line break can save it. Shorten it, or allow a hyphen. |
| Missing characters | The font has no drawing for a character of this text. |
The source language is checked too. If an English line overflows, the box rule is probably wrong, not the text.
Fixing a text
- Click a line in the results. It is drawn with your font in its box: the box is gold, the overflow red.
- Type a shorter version in Fix this text. The drawing and the verdict update as you type.
- When it fits, move on to the next one. Fixed lines are counted in the export section.
- Undo my changes brings back the original text of the selected line.
- Line breaks you type are kept. In a CSV they are saved inside the quoted cell; in a JSON file as
\n.
- Keep the variables and tags of the original. FitQuill warns you when a translation loses a variable.
In this free demo you can try every fix, but saving the fixed files needs the full version.
6 · Export
This free demo checks everything and lets you try fixes, but it cannot save the fixed files or the problem list. The full version saves each fixed file in its exact original layout (only your fixes change) and the problem list as a CSV for your translators.
7 · Browse
Every string of the project, in every language, with its box rule and its missing characters highlighted. Use it to check a rule covers the right keys, to read a translation in context, or to find a key by its text.
Line-break modes
Each mode is ported from the engine's own source code and was checked against the real engine.
| Mode | Use it for | How lines are cut |
| Godot 4 · Word | Label or RichTextLabel with autowrap Word | At spaces, after hyphens and slashes, between Chinese, Japanese and Korean characters (Unicode rules, as Godot). Never before "!" or "?" with a no-break space. |
| Godot 4 · Word Smart | autowrap Word (Smart) | Like Word, but a word too long for the box is cut between letters instead of overflowing. |
| Godot 4 · Arbitrary | autowrap Arbitrary | Anywhere, between any two letters. |
| Phaser · Text | Text with wordWrap.width | At spaces. The space after a word must fit too. |
| Phaser · BitmapText | BitmapText with maxWidth | At spaces, Phaser's own way. Characters missing from the font take no room. |
| LÖVE | love.graphics.printf, Font:getWrap | At spaces; a word wider than the box is cut between letters. |
| Only where I put \n | Engines without automatic wrapping | Only at the line breaks written in the text. |
Another engine? Pick the mode that cuts the same way (most cut at spaces like Phaser Text or LÖVE), and check a few lines in your game.
Tags, codes and special characters
- Formatting tags such as
[b], [color=red], [wave], <b>, <color=#f00> are not drawn by the game, so FitQuill does not measure them.
- If your game shows the tags as they are (a Godot Label without BBCode, Phaser, LÖVE), tick [b] tags drawn as text next to the line-break choice.
- RPG Maker codes such as
\C[2], \I[5], \., \! take no room. \N[1], \P[1], \V[1] and \G are measured as variables.
- Line breaks: a real line break in the cell, or
\n written as two characters, both count. Unicode line and paragraph separators count too.
- No-break spaces (French
« Oui ! ») are respected: a line is never cut there.
- Zero-width characters (zero-width space, emoji joiners, soft hyphen, direction marks) take no room and are never reported as missing.
- A tab counts as at least 4 spaces.
Settings and projects
- Your boxes, variables, line-break mode, source language and font size are remembered in this browser for each set of text files. Load the same files tomorrow and everything is back. The 40 most recent projects are remembered.
- Save settings writes them to a
.fitquill.json file. Keep it next to your translation files, or share it with your team. Open settings… (or dropping the file with your texts) applies it again.
- When settings are restored, a Start fresh button goes back to the guesses.
- Loading new texts while you have unsaved fixes asks you first.
Problems and questions
"No language columns found"
The first row of the CSV must name the languages with their codes: keys,en,fr. Names such as English are not language codes.
A language is called by a strange name
For JSON files the language comes from the file name. Rename texts.json to texts_fr.json.
Accents look wrong (é, �)
The file is probably not saved in the encoding it claims. Save it again as UTF-8 from your editor or from Excel (CSV UTF-8), then load it again.
A text passes in FitQuill but overflows in the game
- Check the box width: it is the room for the text inside the margins, not the whole box.
- Check the font size and the ×2/×3 choice match what the game draws.
- Check the line-break mode matches your engine and node.
- Check the variable values: the game may show a longer value than the one typed in section 4.
Everything overflows
The boxes are probably too small, or the font size too big. Look at the source language first: if it overflows too, fix the rules, not the texts.
The font is blurry
It is not a pixel font, or it is drawn at a size where its pixels fall between screen pixels. Pick the size marked sharpest.
Which browsers?
Recent Chrome, Edge, Firefox (Windows, macOS, Linux) and Safari (macOS). No installation, no account, no internet needed.
About
FitQuill free demo — created by Decaz. decaz.itch.io/fitquill
Questions, a bug, a format you need: leave a comment on the itch.io page. Updates are free for everyone who bought FitQuill.
Made with: the Pixelify Sans, IBM Plex Sans and IBM Plex Mono fonts (SIL Open Font License 1.1) and the linebreak library by Devon Govett (MIT). Their licences are in the licenses folder.