Baren81 Devlog

Galaxy13 – 12 Languages, and the Fonts Had to Be Cut Down

Title card: 12 languages, and the fonts had to be cut down — Galaxy Devlog #13

Written by

in

,

Galaxy Devlog #13 · Read the Galaxy build log

I do not write code and I cannot read it. Call the Cat: Galaxy, the Unity sequel to a game I already shipped, is written line by line by AI agents. My job is to say what I want, set the rules they work under, and check whether what comes back is actually right.

This one is about the fact that letters can disappear before translation even becomes the problem.

Letters can disappear before translation does

Right now the project’s translation and font baseline covers Korean, English, Japanese, Simplified and Traditional Chinese, Spanish, French, German, Portuguese, Russian, Thai, and Vietnamese — 12 languages in total. Steam applies its own supported-language filter, so the visible list is not guaranteed to be identical across platforms.

There are 4 text tables, totaling 637 rows as of `loc_check.py`’s run on 2026-08-30. Multiply that by 12 languages and you get 7,644 translation cells to manage. Adding new text grows that row count too, so this is not a fixed number — it’s a snapshot from that day’s check. It’s a static coverage metric, not a score for translation quality.

The in-game language selection screen.
The in-game language selection screen.

Why we didn’t bundle in the whole font

Bundling entire fonts for character-heavy languages like Chinese and Japanese blows up app size. Instead of the full font, `loc_fonts.py` builds a per-language subset containing only the characters that actually appear in the current text tables.

The recorded subset sizes: the default font is 182KB, Japanese 362KB, Simplified Chinese 275KB, Traditional Chinese 294KB, and Thai 31KB — about 1.1MB combined. That figure is for the font files themselves; it is not the same number as total app-size savings.

The Noto Sans / Thai / JP / SC / TC font list in the credits screen.
The Noto Sans / Thai / JP / SC / TC font list in the credits screen.

Adding text creates one more step

Once a subset exists, adding a new sentence can introduce a character that isn’t in the font yet. That’s why translation goes in but one character still shows up as a blank box.

So every time text is added, this order gets followed:

Add to the text table -> Regenerate the font subset -> Run loc_check.py -> Check for missing glyphs and placeholder mismatches

The check currently shows no untranslated cells and no placeholder mismatches across 637 rows and 12 languages. That doesn’t mean every language has actually been turned on, on a real device, to check glyphs, button width, and line wrapping. Passing the static check and confirming on-screen quality are two separate things.

Why blanks didn’t get machine-filled

Filling an untranslated language with a copy of the English text makes the table look complete. But a reader would mistake it for an official translation.

So Indonesian is not in the supported list. Any language outside the current list falls back to English. Adding it for real means doing translation and glyph verification across all 4 text tables at the same time.

Copy this

A localization check tool needs to cover at least these four things.

CheckWhat to confirm
Blanksmissing text per language
Glyphswhether every character used in the translation exists in the font
Placeholderswhether counts and order of things like {0} match
Lengthwhether a long translation overflows a button or panel

And machine translation is not “a button that raises your supported-language count.” A sentence no human has reviewed can be more dangerous than a blank cell. If there’s a scope where automated translation is acceptable, write that scope down separately, and keep the official supported list distinct from a temporary fallback.

What this post is worth

Bragging about supporting 12 languages isn’t the point. The point is treating the translation table, the glyphs, and the on-screen width as three separate checks. One table can pass while the font is still missing something, or the text still runs off screen. Font file size shouldn’t be read as the same number as total app-size savings, either.

Next post

After expanding languages and screens, the next thing to confirm is whether the data carries over safely. The next post covers how a save boundary was set up so an empty new game can’t overwrite existing progress.

Solo dev of Call the Cat, shipped after 178 days
on Google Play
and Steam.
Now building the sequel, Call the Cat: Galaxy, in public.