KLINGON ANYBODY?
Hey Guys!
We are 76% of the way to our target - we can do this!
Please tell a friend about BEAUTIFUL DESOLATION or better yet, grab them a discounted copy. I had a request from a supporter about putting his beloved cat into the game, and at the $449 tier we will do just that.
On With the show!
Localization is an important factor when gamers decide if they will play a game or not.
We wanted CAYNE, as well as our future games, to feature as many languages as possible. Allowing multiple translations opens up a much wider audience and makes it more likely that non-English speaking sites will feature the game.
STASIS was in English and 6 additional languages, with Turkish coming a little later.
More languages = wider audience and more exposure.
So for us, CAYNE's multi-language support would be importance to its success. Although 60% of our gamers play in English, a massive swash of players wouldn’t experience the game as we intended if we didn’t allow for localization.
Building a translation system into the engine at an early stage meant that we needed to ensure that no text was hardcoded into the game. All of the strings that are displayed (even English) are read out of a language database on the initial load. If we'd left this to a later stage in development it would've been a mammoth task to replace every string. Furthermore, as we test in English we'd possibly miss language display bugs.
My advice to game developers is to separate language data from the main game engine and treat all text as external from the get go, don't try and jam this into the engine at a later date - you will regret it.
With this in mind we also considered fan translations. CAYNE has 8 languages at its launch date and I'm aware that a few more are being produced by fans at this very moment.
IN BRIEF
Our translation system doesn’t discriminate about where it gets the string data. As long as the data is formatted correctly it can be loaded at runtime into the engine.
The ‘official’ translations are loaded from the resources folder (this is not exposed to general users) however, when CAYNE launches it checks to see if the translation folder exists, and if so, it checks if there are any languages that have been included. Using this method we can separate fan translations from the official translations.
TEXT FILES THAT CONTAIN THE TRANSLATION DATA
It also allows easy data sharing – just unzip a file into the
translations folder and select the new language.
FANCY STUFF
Technically what happens in Unity is the following:
The User selects a language.
The game loops through the data-files that are specific to that language – each data file contains a specific simple schema (I went with a typical ini type structure because JSON would be confusing for the translators and is far more syntax error prone).
CONTENTS OF TRANSLATION FILE
Example:
[entry_7]
id_0=THIS IS THE MOUSE OVER NAME
data_0=THIS IS THE DESCRIPTION...
The game only stores the language that the player has selected - it loads those strings into a language array.
Every Text Object has a script attached to it. This script contains an ID. The ID relates to where the string sits in the array. So when the player calls a description, it just hops on over to that array, at that specific ID and displayed the correct string. There are a few cases where I do a forced update of all strings in the game when a language is selected, but this works in exactly the same manner.
I did break the translation input files into separate text files but this was for sanity sake and organization. They could've easily been in a single text file.
NOTE: Use Unicode UTF-8 and renamed the .txt file to .bytes when using Unity.
LOG FILE OF THE TEXT LOAD IN PROGRESS...
Commonly a game will load all of the languages into memory (either from a loc-kit or from hard coded strings) when the game starts, however, because our games are so text heavy this could cause issues later on. STASIS has 65,000 words! If I extrapolate that over 8 languages, we're looking at an array containing 500,000 words! It is unnecessary, so I chose only to load the single language set at language selection, treating all languages as separate runtime data (including English).
Interestingly this is why the spinner that indicates the game is loading when CAYNE first opens doesn’t contain the word ‘loading’ – because the text database hasn’t been loaded yet. There are some simple ways around this but nobody has noticed so far!
Roboto.pl did a smashing job and ensured we nailed down the larger language sets.
We had a great opportunity to get some of the languages sponsored by partners. In turn for some publicity, as well as a nice resume item. Polish, Spanish, Turkish and Italian were provided by these partners. If you are looking to get your product localized, please consider sending some work their way – you can try out the translations in CAYNE if you want to get a feel for their quality:
MAIN LANGUAGES & POLISH - www.roboto.pl
OSCAR PARDO – SPANISH - opardo86@gmail.com
TECHNOGAME – TURKISH - http://www.technogame.net
VINCENZO MARINO – ITALIAN - vincenzomarino.tp@gmail.com
If you'd like to take a look at the translation system, download CAYNE and open the game folder, you will find all the info neatly packaged and ready to go.
We'll be able to offer BEAUTIFUL DESOLATION both with official and fan translations. We are very excited about the possibilities.
Talk soon,
Chris & Nic