1
\$\begingroup\$

Welcome to the most boring part of game development but everyone loves to see games adapted to their native language.

I have seen companies going nuts over this part of game development and I fully understand why. There's a package in Unity to do this. I am using Cocos creator 3.0. I am considering writing my own simple class. Here's my plan: I will convert every single word using Google Translate and prepare an Excel sheet or JSON, load these key values for different languages in a data structure and the user can convert this with the help of a Singleton class. I have a question though, is this good enough or there are problems which I am not aware of? Because I am getting the feeling that it's not that easy.

\$\endgroup\$
3
  • 2
    \$\begingroup\$ You can cut a couple of steps if you just use the Google Sheets and the =GOOGLETRANSLATE(cell with text, “source language”, “target language”) formula ;-) \$\endgroup\$
    – Kromster
    Commented Oct 14, 2021 at 11:28
  • 3
    \$\begingroup\$ @Kromster please don't encourage the use of Google Translate as a localization tool. 😓 \$\endgroup\$
    – DMGregory
    Commented Oct 14, 2021 at 12:05
  • 2
    \$\begingroup\$ @DMGregory Fully agreed, however it has its uses in localization too. Since OP already mentioned Google Translate - I gave a hint on how to make it simpler. \$\endgroup\$
    – Kromster
    Commented Oct 14, 2021 at 12:13

1 Answer 1

2
\$\begingroup\$

Google Translate is not a localization tool, and the method you proposed will not give you a good translation.

An automated translation cannot understand differences in context. Let's take the single word "back" displayed on a button in your UI. Does this mean...

  • "Return to the previous screen/state" (like navigating a multi-screen UI, or unpausing and returning to gameplay), which we might translate into French as "retour"

  • "Switch to the rear side of this object" (like switching between front and back designs for a shirt you're customizing), which we might translate as "côté arrière"

  • "Invest and become a backer of this project/cause" (like supporting a Kickstarter or charitable project), which we might translate as "soutenir" or "financer"

...etc. And this is for just one common word translated into one language. Multiply this uncertainty by all the words in your game, by all the languages you want to support. If you automatically substitute word by word, you're playing Russian Roulette, and eventually you will get the wrong interpretation of a word somewhere, or they'll chain together into gibberish.

(Real-world example of this from my own recent experience: I have a student who sometimes leans on automatic translation for in-class discussions. Unfortunately the translator seems to translate "life amount", as in HP/Health Points, into "blood volume", which has a significantly more gruesome sound to an English-speaker!)

And that's not even talking about subject-verb agreement, gendered languages, or the variety of plural rules that can also change which specific form we'd translate to based on nearby words/values.

And it's saying nothing about voice and tone, matching the style of communication in your game to the right level of formality or casualness for its brand or the character who's speaking.

Your translation should be done at the granularity of a complete passage of text, not word by word. Say an entire heading or paragraph, or an entire message spoken by a character.

Each place the same text occurs in a different context, it should be given a different underlying localization ID (key), so that it can be translated differently in the two contexts. (eg. if it occurs sometimes as a label on a stat profile and sometimes as a power-up toast in the HUD and sometimes as a column heading in a leaderboard, each of these may take different forms or need to be abbreviated differently to fit — something I ran into myself with gadget names in Splinter Cell Blacklist for example)

This includes if sometimes you want to display the word in a different case, or add a colon at the end like "Strength" vs "STRENGTH: 42" — different languages actually have different rules for how this is done, so it's better to let a translator pick the right way to do it for their language.

Each localization ID should be associated with not just the display text in the source language, but also with a description explaining what it means in the context where it appears. Then a translator can see both these pieces of information and take them into account when crafting an appropriate translation.

And lastly: you should hire a proper translator, a human with the judgement to navigate this context and the expertise to tell good translations from bad, something an automated online tool cannot do for you.

(Also, do not use my translations either — it's been a long time since I studied in French immersion, and so these examples themselves may be inaccurate, or technically valid but inappropriate for regional dialects)


I'd also add: localization is NOT the most boring part of game development. It's laborious, to be sure. But the challenge of identifying all the texts that need translation, organizing them in a way that's intuitive to work with, describing them in a way that's clear to translators, finding ways to assemble dynamic texts with proper gender and numeric agreement, and staying within display length budgets — it's fascinating.

If it's just a stepping stone on your way to your goal, then as Ze Frank says, try to fall in love with the shape of the stone. 😉

(Or hire someone who will — you'll get better localization from someone who's passionate about it than someone who just wants to get it over with!)

\$\endgroup\$
13
  • 1
    \$\begingroup\$ This, and the complexity of integrating object counts and gender in dialogs, etc. (e.g. after the player picks a few apples, an NPC could say "I see you brought an apple/one apple/three apples with you" which could translate differently in some different languages) \$\endgroup\$
    – Vaillancourt
    Commented Oct 14, 2021 at 12:15
  • 1
    \$\begingroup\$ We had a great markup system for counts / numeric agreement in Snowdrop when making Starlink: our localized texts could contain markup like { variable ? first form, second form, third form...} and then based on the numeric value of the variable and the plural rule for the current language, the corresponding text form from the list would be interpolated into the string. We used plural rules and ordering of forms according to this document \$\endgroup\$
    – DMGregory
    Commented Oct 14, 2021 at 12:25
  • 1
    \$\begingroup\$ iirc you need to switch to using proper i18n engines for that sort of things, since many languages have many quirks besides simple counting. \$\endgroup\$
    – Kromster
    Commented Oct 14, 2021 at 12:36
  • 1
    \$\begingroup\$ From the top of my head - different languages have different genders associated with some objects (e.g. Ship is a she in Eng, but he in Rus). So if there's a need to collect sentences such as "Borrow %s from %s without disturbing him/her" can already become messy. \$\endgroup\$
    – Kromster
    Commented Oct 14, 2021 at 12:42
  • 3
    \$\begingroup\$ Sure. My bigger point being is - localization is a spectrum. Ranging from 0 - no localization. 0.1 - GoogleTranslated. 0.4 - localized by human translators without seeing the game. 0.5 - localized by generic human translators seeing the game. 0.7 - localized by translators who know the games theme and know how the games need to be localized. 0.8 - i18n with professional translators. 0.95 - high-end i18n human-translation with pros in linguistics and native speakers covering all the quirks and idioms and such. \$\endgroup\$
    – Kromster
    Commented Oct 14, 2021 at 13:12

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .