TABLE OF CONTENTS
REQUIREMENTS FOR STRINGS
REQUIREMENTS FOR CULTURAL FORMAT
FONTS
LANGUAGE SELECTOR
SUPPORT
Our mission is to create a world-ready Netflix product, a product that feels truly local. For that to happen, the game needs to be developed with internationalization in mind.
Internationalization + Localization = Globalization
Internationalization lays a solid cultural data and software layer foundation so that translation can be done separately, and after translation is dropped in, the global product just works. Localization can be seen as the translation part (done by linguists and translators), Internationalization is everything else (done by engineers). Internationalization contributes heavily to best localized user experience.
Only when both internationalization and localization are done well, the goal of a world-ready Netflix product can be achieved.
This doc contains the internationalization requirements that gaming studios need to follow while developing the games.
REQUIREMENTS FOR STRINGS
EXTERNALIZE UI TEXT
UI text appearing in games need to be externalized in resource bundles for translation. English text hardcoded in game app source code or burned in an image won’t get translated.
USE CORRECT LANGUAGE CODE
Game has different localizable elements. After translations are back, put the translated text in resource bundles with correct language code.
Use the following language code for UI text resource bundles. Note that declaring the languages your app supports is required in order to list the supported languages correctly on Apple App Store. Please refer to the instructions here.
Language Name |
Language Code (iOS App Store) |
Language Code (Android Google Play Store) |
Language Code (Netflix Games UI String Resource Bundle) |
Arabic (Modern Standard) | ar | ar | ar |
Chinese (Simplified script) | zh-Hans | zh-CN | zh-Hans |
Chinese (Traditional script) | zh-Hant | zh-TW | zh-Hant |
Croatian | hr | hr | hr |
Czech | cs | cs-CZ | cs |
Danish | da | da-DK | da |
Dutch | nl | nl-NL | nl |
English (U.S., Global) | en | en-US | en |
English (UK) | en-GB | en-GB | en-GB |
English (Australia) | en-AU | en-AU | en-AU |
English (India) | en-IN | en-IN | en-IN |
Finnish | fi | fi-FI | fi |
French (Global) | fr | fr-FR | fr |
French (Canada) | fr-CA | fr-CA | fr-CA |
German | de | de-DE | de |
Greek | el | el-GR | el |
Hebrew | he | iw-IL | he |
Hindi | hi | hi-IN | hi |
Hungarian | hu | hu-HU | hu |
Indonesian | id | id | id |
Italian | it | it-IT | it |
Japanese | ja | ja-JP | ja |
Korean | ko | ko-KR | ko |
Malay | ms | ms | ms |
Norwegian | nb | no-NO | nb |
Polish | pl | pl-PL | pl |
Portuguese (Brazilian) | pt-BR | pt-BR | pt |
Portuguese (Portugal) | pt | pt-PT | pt-PT |
Romanian | ro | ro | ro |
Russian | ru | ru-RU | ru |
Spanish (Latam) | es-419 | es-419 | es |
Spanish (Spain) | es | es-ES | es-ES |
Swedish | sv | sv-SE | sv |
Thai | th | th | th |
Turkish | tr | tr-TR | tr |
Ukrainian | uk | uk | uk |
Vietnamese | vi | vi | vi |
HOW TO WRITE ENGLISH TEXT
PROVIDE COMPLETE SENTENCE
Many languages have different positions for grammatical components than that of English. Concatenation would create situations difficult to translate for many languages.
Example:
Good:
-
-
-
- Key = Your plan will change to %1$d Screen on %2$s.
-
-
Avoid:
-
-
-
- Key1 = Your plan will change to
- Key2 = %1$d Screen
- Key3 = on %1$s
-
-
USE DESCRIPTIVE VARIABLE NAME
Lack of context is a major source of translation errors. Descriptive names should include information about the type of the variable, would it be an integer or a string? For month name, would it be a full month name, or an abbreviated one? Etc.
Example:
Good: month_name_full, month_name_medium, month_name_short
Avoid: month
If it’s not possible to use a descriptive variable name, add comments to provide more context for translation.
USE INTENDED CASING
Many languages have different casing rules. Functions such as toUpperCase(), toLowerCase(), toCamelCase(), etc. often have problems for certain languages. Writing the casing as intended in the English strings allows translators to use proper casing for their language.
Example:
Good:
-
-
- Key = GAME ON
-
Avoid:
-
-
- Key = game on
-
And then programmatically call .toUpperCase() or a similar function to change it to “GAME ON”.
ALLOW GRAMMATICAL PLURAL TEXT
Many languages have various plural forms. Nouns in English have singular form when the number is one, and plural form when the number is not one. Please write text in a way that allows different translation for different number groups defined by the target language. For example, here is how you could write the English text on iOS.
GENDER CONSIDERATION
For gendered languages in which gender is marked in adjectives, articles, nouns, verbs, etc., it is important to take gender into consideration when localizing UI strings that are addressed to a second person (i.e. the player), in order to provide inclusive and gender-neutral solutions as much as possible.
Example:
English UI String |
Localization considerations |
How do you feel? TIRED HAPPY ANGRY |
For gendered-languages consider how adjectives/verbs, as applicable, can be handled to provide a gender neutral solution when possible. For example, is it possible to use nouns in this question instead of adjectives in the localized version? What do you feel? TIREDNESS HAPPINESS ANGER |
For gendered languages, it is common to find the use of the gendered (masculine) treatment to hint neutrality in established terminology such as game labels. While this use of the masculine may still be valid, we should be looking for organically gender-neutral and inclusive solutions that could be used instead (even when this means introducing new terminology), whenever possible*.
Example:
English UI String |
Localization considerations |
Multiplayer |
“Multiplayer” and “Single Player” are common labels in games, but their localized versions may be gendered. In such cases consider if there’s alternative terminology that can be used. E.g. “Group” and “Individual”. *Note: This should be done if meaning is not obscured and context allows. If finding a neutral alternative obstructs the meaning, conflicts with character limitations, or in any other way harms the gaming experience, the use of the generic masculine may still be justified. |
Single Player |
KEEP LOCALIZATION IN MIND
EXPECT TEXT TO EXPAND HORIZONTALLY
For example, German text might expand when compared to English source text. Generally expect around 40% expansion, shorter text may have bigger expansion. Some languages might contract, for example, Chinese. Usually expansion is more challenging for the UI than contraction. In design and development, allow text field width to auto-expand, or allow wrap into multiple lines.
EXPECT TEXT TO EXPAND VERTICALLY
Some languages need more vertical space. Languages with diacritics could expand vertically, for example, expect Thai text to expand vertically up or down as much as 70%.
USE PSEUDO-LOC EARLY IN DESIGN & DEVELOPMENT PHASE
Pseudo localization is a fake translation, to simulate certain localization language characteristics while maintaining the readability of the UI. Pseudo loc detects localization issues early. Following are some major localization issues that pseudo loc detects.
DETECT STRING CONCANETATION
String concatenation should be avoided by following the requirement of “Provide complete sentence”. Pseudo loc can detect string concatenation if the above requirement is not followed.
Example of string concatenation (avoid):
- Key1 = Your plan will change to
- Key2 = %1$d Screen
- Key3 = on %1$s.
With pseudo loc, the final sentence appearing on the UI could be something like [Ýoổuǚr ρlaǻñ ŵiîlļ çhaǻñgeễ ţoổ] [%1$d Šcŕeễeễñ] [oổñ %2$s.] A complete sentence separated by pairs of [] indicates string concatenation. Different platforms may have different pseudo localization patterns, but principles stay the same.
In the case of a complete sentence “Your plan will change to %1$d Screen on %1$s.”, the pseudo localized final sentence could look like the following: [Ýoổuǚr ρlaǻñ ŵiîlļ çhaǻñgeễ ţoổ %1$d Šcŕeễeễñ oổñ %2$s.] Notice the whole sentence is inside one pair of [].
SIMULATE STRING EXPANSION
Pseudo loc also expands string by a certain percentage to simulate string length expansion. If pseudo localized strings get truncated or overlap each other on the UI, it indicates localized UI will have similar issues. This needs to be fixed by UI design and implementation as soon as it appears.
UNITY PSEUDO-LOC TESTING
For games developed with Unity, please follow this guideline to enable and test with pseudo localization.
REQUIREMENTS FOR CULTURAL FORMAT
Cultural formats include Date, Time, Calendar, Timezone, Number, Currency, Phone number, Sorting, etc. See a list of examples here.
Cultural formats vary around the world, depending on the user's language and location. For example,
Date:
- English in US (en-US): Tuesday, January 5, 2020
- French in France (fr-FR): mardi 5 janvier 2020
- Japanese in Japan (ja-JP): 2020年1月5日火曜日
Currency:
- English in US (en-US): $1,234.56
- French in France (fr-FR): 1 234,56 €
- German in Germany (de-DE): 1.234,56 €
Notice the difference in above currency formats for thousands separator, decimal point, the position of the currency symbol, and the space in between currency symbol and the number amount.
USE I18N LIBRARY TO FORMAT
The good news is that all these cultural data have been collected and stored in a data repository called CLDR (Unicode Common Locale Data Repository). And internationalization (i18n) libraries use CLDR to format the cultural data for the user. On both iOS and Android, there are a rich set of readily available i18n API and functions that you can use to format the cultural data.
Locale is a way to identify cultural formats. The key is to use the user locale properly.
FORMAT BASED ON USER LOCALE
Every user has a user locale that reflects their language and culture. Always use the i18n functions that take a display locale for cultural format, and pass user locale as the display locale to these formatting functions.
USE LATIN NUMBER SYSTEM
Netflix products standardize on using Latin number system for all locales, make sure you set the number system of the user locale to latn. One effective way to do that is to add “-u-nu-latn” to user locale before formatting.
For example, for Arabic, Netflix products use Latin numbers (0, 1, 2, …), not Eastern Arabic numbers (٠١٢٣٤٥٦٧٨٩).
USE GREGORIAN CALENDAR
Netflix standardizes on using Gregorian Calendar for all locales, make sure you set the Calendar of the user locale to Gregorian. One effective way to do that is to add “-u-ca-gregory” to the user locale before formatting.
For example, for Thai, Netflix products use Gregorian Calendar (2021), not Buddhist Calendar (2564).
FONTS
CUSTOM FONTS
If you are in search of the custom fonts for some of the non-English languages to carry the look and feel of the English font sets you use for your game, we recommend the following services to find the open-source or licensed fonts that work for your intended design.
- fonts.google.com
- enterprise.monotype.com
- To get invited to the Netflix Fonts library, submit this form.
Both services support preview of the input text, as well as language selector to filter the fonts that support desired target languages. For any additional assistance, please reach out to your Localization Producer at Netflix.
PRODUCT FONTS
The table below is provided only as a reference. Netflix products use the following fonts for UI text on iOS and Android, should you wish to mirror the Netflix look and feel, please use these.
Language Name |
iOS |
Android |
Arabic (Modern Standard) |
Handset Sans Kufi |
Handset Sans Kufi |
Chinese (Simplified script) |
(System sans serif font) |
(System sans serif font) |
Chinese (Traditional script) |
(system sans serif font) |
(system sans serif font) |
Croatian |
Netflix Sans |
Netflix Sans |
Czech |
Netflix Sans |
Netflix Sans |
Danish |
Netflix Sans |
Netflix Sans |
Dutch |
Netflix Sans |
Netflix Sans |
English (Global) |
Netflix Sans |
Netflix Sans |
English (UK) |
Netflix Sans |
Netflix Sans |
English (Australia) |
Netflix Sans |
Netflix Sans |
English (India) |
Netflix Sans |
Netflix Sans |
Finnish |
Netflix Sans |
Netflix Sans |
French (Global) |
Netflix Sans |
Netflix Sans |
French (Canada) |
Netflix Sans |
Netflix Sans |
German |
Netflix Sans |
Netflix Sans |
Greek |
Netflix Sans |
Netflix Sans |
Hebrew |
(system sans serif font) |
(system sans serif font) |
Hindi |
(system sans serif font) |
(system sans serif font) |
Hungarian |
Netflix Sans |
Netflix Sans |
Indonesian |
Netflix Sans |
Netflix Sans |
Italian |
Netflix Sans |
Netflix Sans |
Japanese |
(system sans serif font) |
(system sans serif font) |
Korean |
(system sans serif font) |
(system sans serif font) |
Malay |
Netflix Sans |
Netflix Sans |
Norwegian |
Netflix Sans |
Netflix Sans |
Polish |
Netflix Sans |
Netflix Sans |
Portuguese (Brazilian) |
Netflix Sans |
Netflix Sans |
Portuguese (Portugal) |
Netflix Sans |
Netflix Sans |
Romanian |
Netflix Sans |
Netflix Sans |
Russian |
Netflix Sans |
Netflix Sans |
Spanish (Latam) |
Netflix Sans |
Netflix Sans |
Spanish (Spain) |
Netflix Sans |
Netflix Sans |
Swedish |
Netflix Sans |
Netflix Sans |
Thai |
Graphik TH |
Graphik TH |
Turkish |
Netflix Sans |
Netflix Sans |
Ukrainian |
Netflix Sans |
Netflix Sans |
Vietnamese |
Netflix Sans |
Netflix Sans |
SUBTITLE FONTS
The table below is provided only as a reference. Netflix uses the following fonts for subtitles, should you wish to mirror the Netflix look and feel, please use these.
Language Name |
Font |
Arabic (Modern Standard) |
HandsetNaskhArabic-Regular |
Chinese (Simplified script) |
MHeiM18030_CForNetflix |
Chinese (Traditional script) |
MHeiM-B5HK_CForNetflix |
Croatian |
Netflix Sans |
Czech |
Netflix Sans |
Danish |
Netflix Sans |
Dutch |
Netflix Sans |
English (Global) |
Netflix Sans |
English (UK) |
Netflix Sans |
English (Australia) |
Netflix Sans |
English (India) |
Netflix Sans |
Finnish |
Netflix Sans |
French (Global) |
Netflix Sans |
French (Canada) |
Netflix Sans |
German |
Netflix Sans |
Greek |
Netflix Sans |
Hebrew |
Hebrew_for_Netflix-R |
Hindi |
HandsetSansDevanagari |
Hungarian |
Netflix Sans |
Indonesian |
Netflix Sans |
Italian |
Netflix Sans |
Japanese |
HeiseiMaruGoth213_CForNetflix |
Korean |
YDGothic120ProForNetflix |
Malay |
Netflix Sans |
Norwegian |
Netflix Sans |
Polish |
Netflix Sans |
Portuguese (Brazilian) |
Netflix Sans |
Portuguese (Portugal) |
Netflix Sans |
Romanian |
Netflix Sans |
Russian |
Netflix Sans |
Spanish (Latam) |
Netflix Sans |
Spanish (Spain) |
Netflix Sans |
Swedish |
Netflix Sans |
Thai |
HandsetSansThai-Regular |
Turkish |
Netflix Sans |
Ukrainian |
Netflix Sans |
Vietnamese |
Netflix Sans |
FONT ISSUES ON UNITY AND WORKAROUNDS
Unity has some platform limitations with font rendering for a few languages. Here are some of the font issues on Unity and the suggested workarounds.
Language | Symptom | Workaround |
Arabic | Characters appear disjointed. |
Unity lacks proper capability for Arabic support, the suggested workaround is to use the following third party plugin: https://github.com/pnarimani/RTLTMPro * This plugin by default selects the Farsi replacement option, which would replace Arabic “Yeh” incorrectly with Farsi “Yeh”, resulting in this issue. Make sure to uncheck theFarsi option in the inspector. * About font: The license for the plugin itself is MIT license, however the license for the fonts packaged with this plugin is not clear, so we recommend the studio to use NotoSansArabic font. If the studio wants to use something else for stylistic reasons, please let us know and we can work together to find something else that works from a technical, and licensing perspective. * Please generate the font asset the usual way: Under Resources > Font, right click and select “Import New Asset…” to import new font asset; thenselect the newly imported font asset, right click and choose Create > TextMeshPro > Font Asset. * This plugin’s font asset generation direction will NOT work, do NOT follow this: https://github.com/pnarimani/RTLTMPro#how-to-create-font-assets |
Thai | Overlap of vowels with long-stemmed characters. |
Unity3D font renderer lacks support for GPOS and GSUB, which Thai font rendering heavily depends on. There is a ThaiFontAdjuster Unity package that can be used to workaround this issue. * About font: The license for the plugin itself is MIT license, however the license for the NECTEC National Fonts (Garuda, Loma, Kinnari, Norasi) is not clear, so we recommend the studio to use the NotoSansThai font packaged in the third party plugin. |
Note these are just workarounds, the ultimate solution relies on Unity to fix these issues on the platform.
IN-GAME LANGUAGE SELECTOR
Allow your players to select the language they wish to play your game in by adding the in-game language selector in the main menu. Below is the table of how you should display the languages regardless of the language selected to help players be able to navigate to their desired language in case they accidentally land in a language they cannot read.
English Version | Display Version (FULL) | Len | Display Version (SHORT) | Len |
Arabic | العربية | 7 | العربية | 7 |
Chinese (Simplified) | 简体中文 | 4 | 简体中文 | 4 |
Chinese (Traditional) | 繁體中文 | 4 | 繁體中文 | 4 |
Croatian | Hrvatski | 8 | Hrvatski | 8 |
Czech | Čeština | 7 | Čeština | 7 |
Danish | Dansk | 5 | Dansk | 5 |
Dutch | Nederlands | 10 | Nederlands | 10 |
English (US) | English | 7 | English | 7 |
Filipino | Filipino | 8 | Filipino | 8 |
Finnish | Suomi | 5 | Suomi | 5 |
French |
Français | 8 | Français | 8 |
German | Deutsch | 7 | Deutsch | 7 |
Greek | Ελληνικά | 8 | Ελληνικά | 8 |
Hebrew | עברית | 5 | עברית | 5 |
Hindi | हिंदी | 6 | हिंदी | 6 |
Hungarian | Magyar | 6 | Magyar | 6 |
Indonesian | Bahasa Indonesia | 16 | Indonesia | 9 |
Italian | Italiano | 8 | Italiano | 8 |
Japanese | 日本語 | 3 | 日本語 | 3 |
Korean | 한국어 | 3 | 한국어 | 3 |
Malay | Bahasa Melayu | 13 | Melayu | 6 |
Norwegian | Norsk | 5 | Norsk | 5 |
Polish | Polski | 6 | Polski | 6 |
Portuguese (Brazil) | Português (Brasil) | 18 | Português (BR) | 14 |
Portuguese | Português (Portugal) | 20 | Português (PT) | 14 |
Romanian | Română | 6 | Română | 6 |
Russian | Русский | 7 | Русский | 7 |
Spanish (Castilian) | Español (España) | 16 | Español (ES) | 12 |
Spanish (Latin America) | Español (Latino) | 16 | Español (LA) | 12 |
Swedish | Svenska | 7 | Svenska | 7 |
Thai | ไทย | 3 | ไทย | 3 |
Turkish | Türkçe | 6 | Türkçe | 6 |
Ukrainian | Українська | 10 | Українська | 10 |
Vietnamese | Tiếng Việt | 10 | Tiếng Việt | 10 |
SUPPORT
Please direct any i18n questions to your Localization Producer at Netflix.