The Most Dangerous “Game”: Hunting Down Strings in Unreal Engine

As I entered into the world of Games Localization, I already had a bit of experience on my back. I used to be a QA for a Japanese gaming company during my study abroad and helped localize a few titles. But this was only as a linguist and a program QA (which in this case was more of beta-testing than it was actual Software QA’ing). So, when I embarked on this journey to localize an indie game with the help of my entire class, I thought this would be a piece of cake, or at least, not so daunting that I couldn’t do it.

So, I put up my sail and followed the directions of my astrolabe to The Stranded Traveler Island. Surely, nothing could make this go wrong!

[Journal entry 30, Day 20]

I’ve been trapped in the bowels of Unreal Engine now for days. I can’t even remember the last time I saw daylight. The fog on this island is unbreakable and I haven’t found my boat. How did this happen? How did I get here? Let’s retrace my steps to see where it all began.

Journal Entry 1: Coming to the Island

After searching for indie developers with games to localize, my professor Max Troyer (he/him/his) presented us with The Stranded Traveler by Spitfire Games: a free 2D platformer on Steam . We had just finished a module on localizing in Unreal and several failed contacts with other indie developers yielded no results. So, to the Stranded Traveler we went! As a class, we divided the tasks into several different categories resulting in this lovely task sheet:

a screenshot of the tasks tab from Microsoft teams

As a more technically inclined student, I was assigned to go into Unreal and find a way to localize the remaining hardcoded strings. The process seemed simple enough: just attach the strings in graph view to a function component that grabs the strings from a table and hijack the output. What could possibly go wrong?

Journal Entry 5: Lost in the Woods

So, remember when I said the process would be simple? I’ve been in the weeds of this program for days and I can’t make heads or tails of where I’m at. What happened?

Well, the answer is two fold: a function not working as designed and a maze of variables and functions to comb through. In Unreal Engine, there are a few ways you can make your game: graph view, which allows you to make a sort of decision map for code, via an external editor like Visual Studio where you can look at the source code as code, and finally in a visual editor where you can visually place objects and actions onto a 3D plane. This is supposed to make it easier for new and advanced programmers to make a game. For me, it just ended with frustration.

Since hard-coded strings aren’t available for Unreal’s handy-dandy “set the string to localizable” feature. They are left as they are and will stay in whatever the source language is no matter what you do. The result means that the game can’t be completely localized. So, you have to “hijack” the string to make sure it goes into the table to be localized.

a screenshot of graph view in unreal engine, there are two boxes that stand out, one with a red circle around it, one with a red X over it
Graph view or as I like to call it the bane of my existence.

Initially, we tried to use “Make Text from String Table”, a function used when the string table is available. So I worked tirelessly to find all the strings in a maze of graph view where a variable’s usage is known but not where it was set. I was quickly reminded how much I didn’t like looking at code I didn’t write myself. No hate to the creator, of course: devs working by themselves are bound to be the only ones looking at the good and thereby the only ones knowing how the code works. But now that I have all the strings, it should work, right? Wrong.

Instead what ended up happening was a nice big error of <MISSING STRING TABLE ENTRY> on every string I extracted. But I clearly have string table entries, so why isn’t the program finding it?! This is one of the many mysteries of Stranded Traveler Island that I don’t fully understand. The best explanation I came up with is that the individual blueprints couldn’t access the string table because for some reason it wasn’t a global variable (a variable able to be accessed by every program). At first I was utterly defeated: a whole team of my classmates and professor were relying on me to figure out this code and I had nothing. I took a step back and took a breath. After all, I needed to find a solution.

Journal Entry 10: A Light in the Fog

Eureka! I have found a solution. After wandering aimlessly through the fog, my professor presented me with the option to use a different function: “Find Text in Localization Table”. For some reason, unbeknownst to me, this interpreted my table as a global variable and as a result, I could just hijack the strings by pulling the entry out myself. Was it a lot of work to do? Yes, but I figured it out regardless. Unfortunately, my teacher had to be my rubber duck during a teams chat and listen to me ramble as I tried to figure out how to get the code to work (sorry, Max!).

Once every string was found, I ran the game to make sure we didn’t have the same error. Lo and behold, she worked! All the strings showed up, no errors, and the text was finally in the localization dashboard! That meant that QA work on the game could finally begin and more importantly, that our crowdsourced translators ACTUALLY had a game to work on!

With this part of the project done, I was finally able to say one thing. I hate code visualizers. My god, I hate code visualizers with every fiber of my being. This is something I never thought I’d hear myself saying but it is so true. When you are working on someone else’s code and all you have is a visual representation of that code, so many things either make little or no sense at all. I can’t figure out what all these functions and variables are without seeing them in context and since I can’t see them in context, it was a mystery. So much of a mystery that I made a meme explaining my newfound dislike.

A picture of two men shaking hands, the text reads Friendship ended with Code Visualizers, Now looking at actual code is my best friend.

Journal Entry 31: Leaving the Island

For the most part, this project taught me a lot about real game development and what problems localizers run into. Instead of easy to find strings, we were left with some easy-to-find strings and a mountain of code to look through for the rest. Localizing cannot be done without these strings so we have to have them all in one place to send to linguists and translators.

It taught me that working in a group means people really depend on you, especially if you’re one of the only people who can do a certain task. I’m extremely thankful that my classmates were supportive and gave me time to do this regardless of the time crunch. I had gotten sick and couldn’t work on the game much for a day, but everyone was super kind in giving me time to rest before I got back to it. Will this happen again in the future or in a real game dev setting? Probably not, but it was a nice thing to have regardless.

And finally, it reminded me of how rewarding it is to finally have something work, or to figure out a big piece of the puzzle. Coding and translating are two of my passions and in a way, this combined both. Yes, I was INSANELY frustrated by not being able to find all the strings and, then when I did finally find them, having an error in the game. But it felt amazing when it finally did work and then I was able to let others make headway.

In the end, this reminded me of why I like games localization so much and why I want to go into this as part of my career. After all, it isn’t every day that you get to work on a title with people you enjoy working with. Which before I forget, I’d like to thank everyone who worked on this project for all their hard work. So thanks to: Dayna Brown, Hannah Epstein, Lesley Chang, Lindsay Vail, Maddy Sanchez, Nick Niculescu, Sarah Blackwell, Sarah Tesfasion, Shuyun Xiao, Yijun Guo, Yuqi Liu, and Xiaoyu Cai for all your work with me on this project. And to our professor, Max Troyer, for helping us embark on this journey

Now if you’ll excuse me, I have a boat to catch so that I can go on yet another perilous journey into the world of games localization.

Leave a Comment

css.php