Quick answer: Localization bugs fall into technical categories (text overflow, encoding errors, missing glyphs, broken RTL layout) and content categories (wrong translations, incorrect plurals, culturally inappropriate imagery). Track them with language and issue-type tags. Catch most technical issues with pseudo-localization and automated checks before translators ever see the build.
Localization bugs are unique in game development because they are invisible to the team that writes the code. Your English build looks perfect. Then you ship the German version and buttons overflow with text. The Japanese version shows empty boxes where characters should be. The Arabic version renders text left-to-right instead of right-to-left. Every localization bug feels like a surprise, but nearly all of them follow predictable patterns that you can test for systematically. This guide covers the most common localization bugs, how to find them before your players do, and how to organize your localization QA so nothing falls through the cracks.
Text Overflow: The Most Common Localization Bug
English is a compact language. When you translate a 20-character English string into German, French, or Portuguese, the result is often 30 to 40 characters. If your UI was designed with fixed-width buttons, labels, or text boxes that perfectly fit the English text, the translated text will overflow, truncate, or wrap in unintended ways.
The symptoms range from cosmetic to game-breaking. A button label that reads “Play” in English becomes “Spielen” in German — not dramatic, but it might clip the button’s edges. A tooltip that reads “Increases attack power by 15%” might expand to three lines in Italian, pushing other UI elements off the screen. A dialogue choice that overflows its container might become unclickable, softlocking the player.
The best prevention is flexible UI design from the start. Use auto-sizing containers, scrollable text areas, and fonts that support condensed rendering. Set a design rule that every text element must accommodate at least 50% more characters than the English source. This is not a precise formula — some languages expand by 30%, others by 100% — but it catches the majority of overflow issues.
For existing projects with fixed layouts, run an automated overflow check. Set every string in your localization table to a padded version (the English text with extra characters appended) and scan for visual clipping. This is pseudo-localization, and it reveals overflow issues without needing actual translations.
Encoding and Character Display Errors
Encoding bugs produce garbled text, question marks, empty rectangles, or completely invisible characters. They happen when the game expects one text encoding but receives another, or when the font file does not contain glyphs for certain characters.
The encoding problem is mostly solved by using UTF-8 everywhere. Your localization files, your source code, your database, and your text rendering pipeline should all use UTF-8. If any link in this chain uses Latin-1, Windows-1252, or another legacy encoding, characters outside the ASCII range will break. Check your text editor’s save encoding, your CSV export settings, and your engine’s import options.
The font problem is more persistent. A font that covers Latin, Greek, and Cyrillic scripts may lack glyphs for Chinese, Japanese, Korean (CJK), Thai, Arabic, or Devanagari characters. When the game tries to render a character that the font does not support, it shows a placeholder — usually a rectangle or a question mark. The fix is to include font files that cover every script your game supports, or to use a font fallback chain where the engine tries a second font if the first one lacks the needed glyph.
In Unity, TextMeshPro supports font fallbacks natively. Create a primary font asset for Latin text and fallback font assets for CJK, Arabic, and other scripts. The engine automatically switches fonts per character. In Godot, the DynamicFont system supports fallback fonts through the fallbacks property. In Unreal, the Slate font system supports composite fonts that combine multiple typefaces with range-based glyph coverage.
Test font coverage by loading your game in every supported language and checking for placeholder glyphs. Automate this by rendering every string in your localization table and flagging any string that contains glyphs not present in the assigned font file.
Right-to-Left Text and Bidirectional Layout
Arabic, Hebrew, Persian, and Urdu are written right-to-left (RTL). If your game supports any of these languages, your entire UI must mirror: menus flow from right to left, text aligns to the right, and progress bars fill from right to left. Numbers and embedded Latin text (like player names or item codes) remain left-to-right within the RTL flow. This bidirectional (bidi) rendering is one of the most technically complex aspects of game localization.
The most common RTL bugs are: text rendering in the wrong direction (each character is correct but the word order is reversed), UI elements not mirroring (the health bar is still on the left), punctuation appearing on the wrong side of a sentence, and line breaks occurring in the middle of words because the engine does not understand Arabic word boundaries.
Engine support for RTL varies. Unity’s TextMeshPro supports RTL text rendering with the “Enable RTL Editor” option, but UI mirroring requires custom code or an asset like RTL Support. Godot 4.x has built-in BiDi support through its text rendering system and supports UI mirroring through control layout directions. Unreal’s Slate and UMG support RTL text and layout mirroring, but setting it up requires careful configuration of text shaping and layout flow.
If you plan to support RTL languages, factor them into your UI architecture from the beginning. Retrofitting RTL support onto a left-to-right UI is expensive and error-prone. At minimum, avoid hardcoding layout directions. Use layout containers that respect a direction property, and flip that property per language.
Missing Translations and Fallback Behavior
A missing translation is any string that exists in the source language but not in the target language. When the game encounters a missing translation, what happens depends on your fallback strategy. Some games show the source English text. Some show the translation key (something like UI_MAIN_MENU_START_BUTTON). Some show nothing. All three are bugs, but they differ in severity.
Showing the English fallback is the least disruptive but can confuse players who do not read English. Showing the key string is ugly but informative for debugging. Showing nothing breaks the UI entirely. Choose your fallback strategy deliberately and implement it consistently.
Prevent missing translations with automated checks. Write a script that compares every key in your source language file against every target language file. Any key present in the source but missing in a target is flagged. Run this check in your CI pipeline so missing translations are caught before the build ships.
Track translation completeness per language in your project management tool. If German is 95% translated and Thai is 70% translated, you know which languages are ready for release and which need more work. Bugnet’s custom fields let you attach a language tag to localization bugs, making it easy to filter your dashboard by language and see exactly how many open issues remain for each locale.
Pluralization, Gender, and Grammar
English has two plural forms: singular and plural. “1 item” and “2 items.” Other languages have more. Russian has three plural forms. Arabic has six. Polish has four, with complex rules about which form applies to which numbers. If your localization system only supports “singular” and “plural,” it will produce grammatically incorrect text in many languages.
The same problem applies to grammatical gender. A string like “Your {item} is ready” works in English, but in French the article and adjective must agree with the gender of the noun. If the item is masculine, it is “Votre {item} est prêt.” If feminine, it is “Votre {item} est prête.” String concatenation cannot handle this. You need a localization system that supports gender variants per string.
Use the ICU MessageFormat standard or a similar system that supports plural categories (zero, one, two, few, many, other) and select expressions for gender. Most modern localization libraries support ICU format. If your engine’s built-in localization does not support it, use a third-party library or implement a custom parser.
Avoid string concatenation for any player-facing text. Never build a sentence by combining separately translated fragments like “You have” + count + “items.” Translated fragments may need different word order, different prepositions, or different verb conjugations depending on the surrounding context. Always translate complete sentences with placeholders for variable values.
Pseudo-Localization for Early Detection
Pseudo-localization is a testing technique where you replace every string in your game with a modified version that simulates the challenges of real translation. A pseudo-localized string takes the original English text, replaces characters with accented equivalents (“a” becomes “á”, “e” becomes “ê”), adds padding characters to simulate longer translations, and wraps the result in brackets to make boundaries visible.
For example, “Start Game” becomes “[Šţárţ Gámê xxxxxxxxx].” This immediately reveals several categories of bugs: text overflow (the padded string is longer than the container), hardcoded strings (any English text that was not run through the localization system), encoding issues (if the accented characters do not display correctly), and boundary issues (the brackets show where the string starts and ends).
Run pseudo-localization as part of your build process. Generate a pseudo-locale file from your source strings, set the game to use it, and play through every screen. Every English word you see is a hardcoded string that bypasses the localization system. Every clipped bracket is a text overflow. Every garbled accent is an encoding bug. Pseudo-localization catches these issues months before your translators deliver their first draft.
Most localization tools and libraries include a pseudo-localization option. If yours does not, write a simple script that processes your string table. The investment is minimal compared to the bugs it prevents.
Organizing Localization QA
Localization QA is different from general game QA because it requires language-specific knowledge and follows a different workflow. Organize it as a separate track with its own bug categories, priorities, and reviewers.
Create a taxonomy for localization bugs. Technical bugs include text overflow, encoding errors, missing fonts, broken RTL layout, and missing translation keys. These are fixed by developers. Content bugs include mistranslations, incorrect tone, culturally inappropriate references, and grammatical errors. These are fixed by translators. Keeping the two categories separate ensures bugs are routed to the right people.
For each supported language, designate a native speaker as the localization reviewer. This person plays through the game in their language and reports issues that automated checks cannot catch: awkward phrasing, inconsistent terminology, cultural references that do not land, and text that is technically correct but does not sound natural. Provide them with a checklist that covers every screen, menu, dialogue, and notification in the game.
Tag every localization bug with the affected language, the screen where it appears, and the type of issue. This tagging lets you generate reports per language (“German has 12 open issues, 8 are overflow, 4 are translation quality”) and track progress toward localization completion. Bugnet’s label system and custom fields support this workflow — create a “Language” custom field, set labels for “Overflow,” “Missing Translation,” “Font Issue,” and “Translation Quality,” and filter your dashboard to see exactly where each language stands.
Schedule localization QA in waves. The first wave runs pseudo-localization and automated checks to catch technical issues before translations arrive. The second wave runs after initial translations are integrated, focusing on visual and grammatical review. The third wave runs on the release candidate, covering edge cases like achievement text, error messages, and store page descriptions that are easy to forget. Each wave catches a different layer of bugs, and skipping any wave guarantees that bugs reach players.
Run pseudo-localization on your game today. The English text that still shows up untranslated is the text your players will see in their language — unchanged.