Building a better localization system for GameMaker
A few weeks ago we released a localization update for Ghost Croquet!
And I released the underlying system for other people to use.
This is a small post about that (originally part of a bigger upcoming post)
The system
For most localization systems, the code using them might look something like this:
So you win some (being able to localize the game) and you lose some (as it is now harder to tell what the code does and there is potential for localization key typos).
However, with a little architecture work and an external tool (to automatically scoop up strings from the source files), the localized menu could look like this:
Which isn’t far off from the original code!
There are also a few more interesting things here like pluralization (“game” vs “games” and extra words in other languages), fallback (what gets shown if a string is missing?), and extracting context-comments for translators - check out the larger blog post about this.
Integration
With system in place, making the game strings localizable has been mostly a matter for finding strings in code and changing them to go through localization functions if appropriate.
But that’s not all it takes! There is always text that’s embedded into graphics resources (for example, most of our tutorial art included text), text that might not fit, glyphs that might not fit, and so on.
In the end I ended up changing quite a bit of code, but the benefits go beyond localization - for example, all sorts of input prompts can now not just show their labels in multiple languages, but show multiple key/button binds, adhere to arbitrary custom controls, and so on:
If you’d like a further breakdown, I wrote about the process in the Steam announcement.
Translation
In my past works (like Pixel Font Converter!), translation was often done by editing an INI or JSON file, testing it, and sending me a copy to include in the next release.
This time, I wanted to try a localization platform for a slightly more organized way for people to edit and collaborate on translations, so after looking around for a bit I’ve set up a Crowdin page for the game.
That’s been nice - there’s a little editor with optional categories (instead of a single big pile of strings), it can automatically show context information that you include with your strings, and you can even tag strings on uploaded screenshots to give a better understanding of how a string appears in-game.
Results and considerations
So, should you localize your game? Does it help?
Let’s look at the Steam Store traffic for Ghost Croquet.
This includes a bunch of sub-sources and mostly excludes the page visits that we brought ourselves.
I couldn’t figure out whether exact numbers of visits fall under partner NDA so I’m removing those from the graphs with Power of CSS.
Here’s a breakdown from Jan 1, 2024 to one week before the localization update:
Most of it this traffic is from Discovery Queue. Seems about right.
Here’s a breakdown from one week before the update to one week after:
Most of the traffic is still from Discovery Queue, but for new countries this time.
Apparently Steam store algorithm figured out that this update is mostly about localization and decided not to push the game to non-target groups this time. Very Cool, and I’ll avoid bundling localization with QoL updates in the future.
Here’s a breakdown from Jan 1, 2024 to today:
So in relative volume, the update has brought quite a few eyes on the game without us doing much else or using a “visibility round”.
Unfortunately, Ghost Croquet is a platformer (in 2024!) and its primary appeal is in multiplayer so the visits don’t convert to sales too easily.
Fortunately, Ghost Croquet also has fairly little text in it (~1200 words total, slightly longer than this post), so it doesn’t take much to make up for effort of adding an individual language, and most of that effort isn’t even in translation itself, but finding right people to translate and proofread so that you don’t end up paying money and then being flamed for a machine/LLM translation.
Other games might have better conversion metrics, but also might have more text in them.
And finally, initial integration effort can be substantially reduced depending on how your game is structured (i.e. whether you’ve kept a possibility of swapping text in mind while programming the systems) and how your localization system of choice works (e.g. I structured mine for being able to quickly integrate it).
Thanks for reading!
Should you need the links:
The localization system I developed can be found on itch.io.
Like with some of my other recent works, I plan to put it up on GitHub later on.The larger post about making the system can be found on my blog.
The larger post about its integration in Ghost Croquet can be found on Steam.