FitQuill

FitQuill

created by Decaz

Check that every translated line fits your pixel font text boxes.

Free demo · nothing is uploaded

FitQuill help

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

  1. Drop your text files: one CSV with a column per language, or one JSON file per language.
  2. Drop your font: a .ttf/.otf pixel font, or a .fnt file with its .png image.
  3. Set your boxes: FitQuill guesses a size for each kind of text. Replace the guesses with your real box sizes.
  4. Check the variables: give the longest value each {NAME} or %d can take.
  5. Read the results, click a red line, type a shorter version, and watch the overflow disappear.
  6. 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.

PatternWidthLinesApplies to
menu.*481menu.quit, menu.play…
dialogue.*2203every dialogue line
dialogue.boss_*1802dialogue.boss_intro (beats dialogue.*)
*_title1201shop_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

ProblemMeaning
Too many linesThe text needs more lines than the box has, e.g. "4 lines, 3 max".
Too wideA line is wider than the box, by the number of pixels shown.
Word too longOne word is wider than the box: no line break can save it. Shorten it, or allow a hyphen.
Missing charactersThe 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

  1. Click a line in the results. It is drawn with your font in its box: the box is gold, the overflow red.
  2. Type a shorter version in Fix this text. The drawing and the verdict update as you type.
  3. 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.

ModeUse it forHow lines are cut
Godot 4 · WordLabel or RichTextLabel with autowrap WordAt 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 Smartautowrap Word (Smart)Like Word, but a word too long for the box is cut between letters instead of overflowing.
Godot 4 · Arbitraryautowrap ArbitraryAnywhere, between any two letters.
Phaser · TextText with wordWrap.widthAt spaces. The space after a word must fit too.
Phaser · BitmapTextBitmapText with maxWidthAt spaces, Phaser's own way. Characters missing from the font take no room.
LÖVElove.graphics.printf, Font:getWrapAt spaces; a word wider than the box is cut between letters.
Only where I put \nEngines without automatic wrappingOnly 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.

Does every line fit?

FitQuill draws each translated text with your game's pixel font, in the box where it will appear, and lists every line that overflows. Then you try your fixes right here.

Everything stays on your computer. Nothing is uploaded.

Drop your texts and your font here You can drop them together, or one after the other.
  1. 1Your textsA CSV with one column per language (Godot style), or one JSON file per language.
  2. 2Your fontA .ttf pixel font, or a .fnt file with its .png image.
  3. 3Your boxesFitQuill guesses a size for each kind of text. Adjust them to your real boxes.