Skin Deep: Blendo Localizer
Skin Deep will be released April 30, 2025! In the following weeks, I’ll be writing about the processes and development of Skin Deep.
Wishlist Skin Deep here!
To view all posts in this series, click here.
Blendo Localizer
Today I’ll be writing about the Blendo Localizer tool. Here’s what it looks like:
Context
For context: in Skin Deep, strings assets have 2 components:
- the string has an ID name. Example:
#str_hub_nina_900041
- the string has a text value. Example:
Feels like old times.
The reason for this text setup is so the game can be localized to other languages.
What does the tool do?
The Blendo Localizer tool does various things. I’ll note that this tool is not where we write/type strings into the game (we use a Google Sheet for that, as it makes sense to utilize its functionality rather than replicate it ourselves).
This Blendo Localizer tool is generally used to:
- Find and fix text bugs.
- Manage text assets.
- Assist with localization.
Basically, it’s a general-purpose tool to help with text assets. It got used very frequently during the project.
Search
Having a frictionless way to search for text assets was a primary goal. Similar to the Blendo Wav Tool, assets could be found by entering loose fragments of text into the filter boxes.
Example:
- I’m looking for a specific text asset where a cat mentions a potato and the moon.
- I would put into the name filter:
cat
(because the string ID will include the speaker name “cat”) - Then I would put into the displaytext filter:
potato moon
(because the cat’s dialogue will somehow involve the words potato and moon somewhere in the sentence.) - …this would then filter the list of results to this criteria. Done!
#str_cat_deli_00410
I'm over the moon for that potato.
It’s very basic but effective search functionality, allowing us to find assets in a few seconds at most. We found it worked very well – I recommend trying it out for your own tools.
AutoConverter
We keep all of our strings in a Google Sheets spreadsheet. One thing we needed was: a pipeline for moving the text out of the spreadsheet and into the game.
This was going to be a high-frequency task, so the goal was to make this pipeline as simple and fast as possible. This pipeline was called the AutoConverter.
Here’s the AutoConverter process:
- In the Google Sheet spreadsheet, we download it in .CSV format (File > Download > CSV)
- Blendo Localizer detects the newly-downloaded file, automatically converts it into the game format, and integrates it into the game. Done!
So yea, getting text into the game happens automatically behind the scenes. Once you download the CSV file from Google Sheets, the tool takes care of the rest without any clicks or intervention from you.
Basically, the tool “listens” to your download folder, and when it finds a CSV with a filename that matches a specific pattern, the tool converts it and integrates it into the game.
Credit where it’s due: this “listen” approach was from our programmer Eric, who used this approach in a prior tool he made for XNA asset conversion.
Localization
Additionally, if you have a handful of language CSV files, you can just bulk drag all of them into the tool window. The tool will convert them into the game format and integrate them into the game.
This is useful when receiving a delivery of localized languages.
Audio shortcuts
We ended up finding it helpful to be able to quickly access audio assets associated with a given string. We added these buttons:
This lets you find the .WAV file in windows explorer, open the .WAV file in your audio tool, or play the .WAV file.
Example: if we hear a line of VO that could use an audio tweak, we can quickly search for the VO’s subtitle line using the filter boxes, and then click the Edit .wav file
button.
(This is largely only possible because in Skin Deep, the VO audio filename and the subtitle string ID name are identical)
Tools Menu
Blendo Localizer has a Tools menu, for various functions:
Find stringID references
Strings can be used in many parts of the game: menus, in the world, in dialogue, in GUIs, in email messages, etc. Find stringID references found all references of a given string in the game. This was useful to find the context that a string was being used.
AutoConverter
This is an options panel that tells the tool whether to use the AutoConverter or not, what folder to listen to, and what filename wildcard to listen for.
View Stats
This prints out stats like word count, character count, and string count.
Check duplicates
This checks if multiple strings have the same exact text.
Check for unused stringIDs
This checks if any strings are not being referenced by the game.
Export to CSV
This is to convert the game strings back into CSV.
Check duplicate suffix number
This checks if multiple strings have the exact same 5-digit suffix number in their string ID.
List prefixes
Our string ID naming scheme uses _
underscores. List prefixes lists out all the string ID name prefix values, by looking at the values between the underscores.
Find empty strings
This lists strings that have no text in them.
SpaceFinder
This marks out spaces in a string:
This is most useful in some languages that use variants of spaces, or types of spaces you can’t see. There’s a lot!
Character Viewer
This gives information about each individual character:
For some languages, this is useful for find out exactly what character is being used. This uses information from the Unicode character database.
Example: sometimes a character that looks like a ; semicolon is sometimes not the semicolon you may expect.
Compare all languages
This compares the strings in all languages:
This compares all the languages to the base language (English) and prints out what strings are currently missing and if there are any extraneous strings.
Nuts and Bolts
Blendo Localizer was made with Winforms. It was written in C# with Visual Studio 2015.
If you think any of this may be useful, please feel free to adapt it to your own project:
Et al
There’s thousands of text strings in the game. I don’t think tenable to trudge through thousands of assets, or to spend a big chunk of your day doing tedious manual processes. Your time on this planet is limited! Be nice to yourself!
I feel very lucky that I’m able to create these tools pretty quickly. I value the time they save, and I find them fun to make. Sure, some of this tool’s functionality ended up being pretty niche and not being used too much. And you know what? I regret nothing! I’d do the same thing again!!!!!! Tools! ⚙️