Blog
日本語版はこちらPractical notes on game localization: shipping in more languages, catching localization bugs, and working with translators.
Getting started
- Choosing target languages: a framework, not a ranking
There is no universal list of best languages to localize into. A practical framework for picking languages based on your own traffic, genre, and text volume.
- Community translation: when it works, and when it quietly hurts you
Fan translation can reach languages you'd never budget for professionally, but it comes with quality variance, consistency risk, and licensing questions worth settling up front.
- The honest pros and cons of localizing your game
Localization is not a free win. A clear-eyed look at what it gives you and what it costs, so you can weigh the decision for your own game instead of assuming the answer.
- Budgeting for localization: the line items nobody mentions
Localization cost is not just per-word translation. A working estimate needs review, engineering, coordination, and every update after launch.
- Translation, localization, internationalization, culturalization, LQA: what each word actually means
These five terms get used interchangeably, but they cover different work done by different people. Why the distinctions matter when you buy services or divide work internally.
- Minimum viable localization: the smallest scope that is still useful
Full localization is not the only option. Store-page-only, UI-only, and subtitle-only are all legitimate scopes players tolerate — as long as the game does not mix languages inside the core loop.
- Freelancer, agency, in-house, or community: who should translate your game
A qualitative comparison of the four common ways to get a game translated, and why file and format integrity stays the developer's job no matter which one you pick.
- Thinking about localization ROI without a spreadsheet full of guesses
A reasoning framework for deciding on localization: the cost side is knowable and bounded, the upside is uncertain, so test demand cheaply before committing.
- When to localize: launch day, after launch, or somewhere between
Simultaneous launch and post-launch localization solve different problems. What each costs, the signals that tell you it is time, and the middle roads that let you start small.
- Why localize your game? What translation actually buys you
Digital stores already sell your game worldwide — language is the barrier that remains. What localization buys you, what it costs, and when it makes sense.
Engineering
- Character encoding for game text: what breaks it, and why to verify per file
UTF-8 as the default, what a BOM is and how it surprises parsers, what mojibake actually is, how legacy encodings sneak in through spreadsheet exports, and why encoding needs checking per file.
- CSV vs JSON for localization files: what actually matters
CSV is spreadsheet-friendly but has quoting pitfalls; JSON is structured but merge-conflict-prone and hostile to raw editing. What matters is single source of truth, diff-ability, and round-trip safety.
- Dates, numbers, and currency: the formatting bugs that hide in plain sight
Decimal separators, digit grouping, date component order, clock format, and currency symbol placement all differ by locale. A hardcoded format string quietly leaks the developer's own locale into every build.
- Hardcoded strings quietly block localization — here's how to get them out
Text buried in source code can't be exported, counted, or translated safely. Moving it to keyed resource files and away from concatenation is the fix.
- What should happen when a translation is missing?
Silent fallback, the raw key, or an empty string — the trade-offs of each in development versus production, chained regional fallbacks, and why the usual answer is loud in dev, graceful in production.
- Fonts are a localization problem too — glyph coverage, fallback, and tofu
Translated text can be perfectly correct and still render as empty boxes if the font that draws it has no glyphs for the language. What glyph coverage, fallback chains, and Han unification mean in practice.
- Localizing a Godot game: an orientation
The general shape of localization in Godot — CSV-based translation import, a translate function used at display time, and locale selection — plus the engine-independent essentials.
- Grammatical gender and case: why your templates break in other languages
Many languages assign gender to nouns and inflect words by case. A template that works fine in English can become ungrammatical the moment a variable is substituted in.
- How placeholders break in translation: a failure catalog
Deleted tokens, extra tokens, case changes, fullwidth brackets, unsupported reordering, stray spacing — a catalog of how placeholders break, and why each one is mechanically detectable.
- Line breaking for CJK text — why word-wrap logic falls apart
Japanese text has no spaces between words, so space-based word wrap either does nothing or breaks in the wrong place. What kinsoku shori actually requires, and why embedded newlines betray you after translation.
- Organizing translation files: naming, layout, and why structure decides your merge conflicts
One file per language versus one per feature, naming conventions with language tags, where the source language lives, stable key order, and how structure shapes merge conflicts.
- Renaming and removing translation keys without losing work
Why a key rename looks like a delete plus an add to everything downstream, how to retire a key without losing its translations, and detecting orphaned and missing keys.
- Localizing a game with no engine localization support
Custom engines, small frameworks, and jam-scale projects often have to build localization from scratch — a key/value store, a lookup function, and the traps that catch home-grown systems.
- Localizing a mobile app: the moving parts engineers actually deal with
Resource files per language, how the OS language setting picks a locale, layouts that survive text expansion, and why the store listing is a separate job from the app itself.
- Placeholder styles in game text: a tour, and why to pick just one
printf-style, indexed, named, ICU MessageFormat, custom tags — the placeholder syntaxes you'll meet in game text, and why a project should standardize on one.
- Plural forms across languages — why 'append an s' does not scale
English has two number forms; Japanese has none; some languages have several. What CLDR's plural categories actually mean, and how ICU MessageFormat lets one string template cover all of them.
- Localizing visual novels and text-heavy narrative games
Visual novels live and die on prose — the sheer volume of dialogue, character voice, text box limits, and why regression tracking matters when scripts get revised.
- Rich text tags in translation: keeping markup alive across languages
Color tags, bold, ruby annotations, icon substitutions — inline markup has to survive translation intact. The common ways it breaks, and why checking it is mechanical and cheap.
- Right-to-left languages: why RTL support is an engineering feature, not a translation
Arabic, Hebrew, and other right-to-left scripts change more than reading direction. Layout mirroring, bidirectional text, and cursive letter shaping are all engineering concerns translation alone cannot solve.
- Shift_JIS and CP932 are not the same encoding — the pitfalls that follow
Files labeled Shift_JIS from Japanese Windows tools usually carry Microsoft's CP932 extensions. What that superset adds, where it breaks, and how to handle it safely.
- String key naming that survives growth
Hierarchical namespacing, stable IDs vs content-derived keys, encoding context in the key, and why reusing one key for two meanings is the mistake that costs the most later.
- Why translated text overflows your UI, and what to actually measure
Different languages expand or contract by different amounts, and 'character count' does not mean what most length checks assume it means. What to measure instead, and how to budget for it.
- Localizing a Unity game: an orientation
The general shape of localization work in Unity — locales, string tables, fonts, and the checks that matter — with a heavier focus on what applies no matter which engine you use.
- Localizing an Unreal Engine game: an orientation
The general workflow of gathering, translating, and compiling text in Unreal Engine — and the engine-independent groundwork that determines whether it goes smoothly.
- Internationalizing a web app: locale routing, the lang attribute, and locale-aware formatting
The lang attribute, why URL-based locale selection is what search engines can index, hreflang for alternate pages, formatting dates and numbers correctly, and keeping text out of templates.
File formats & standards
- Android string resources: strings.xml, plurals, and the qualifier system
How Android stores UI text as XML resources, how it picks a language and region at runtime, and the escaping and plural rules that trip up translators.
- Apple's .strings and .stringsdict: how iOS and macOS store translated text
The key-value .strings format, .stringsdict for plurals and width variants, the newer string-catalog concept, and how XLIFF fits the round trip.
- BCP 47 language tags: what ja-JP, zh-Hans, and pt-BR actually mean
How BCP 47 language tags are built from subtags, why script matters more than region for Chinese, and the mistakes that break matching and fallback.
- The PO file format: msgid, msgstr, and everything gettext adds around them
A precise look at GNU gettext's PO/POT format — plural forms, msgctxt, comments, fuzzy entries — and why it is still the default in open-source localization.
- ICU MessageFormat: writing strings that handle plurals and gender correctly
A precise walkthrough of ICU MessageFormat syntax — arguments, plural with CLDR categories, select, selectordinal, nesting, and the offset feature — and its main risk.
- Java .properties vs .NET .resx: two long-lived resource formats compared
Java's key=value .properties files and .NET's XML .resx files have solved the same problem for decades, in different ways — and each has its own bite.
- TMX and TBX explained: portable formats for translation memory and terminology
TMX stores translated sentence pairs, TBX stores approved terminology, and both exist so your linguistic assets outlive any single tool.
- Unicode CLDR: the locale data your formatting code should be reading, not guessing
What CLDR actually provides — plural rules, date/time/number patterns, collation, display names — and why locale-aware code reads it instead of hardcoding conventions.
- XLIFF: the interchange format that keeps translation work portable
How XLIFF structures file/unit/segment translation data, tracks workflow state, and protects round-tripping between your source files and translation tools.
- YAML vs JSON for translation files: nesting, comments, and version control
Both formats can hold the same key-value translations, but they behave differently under editing, diffing, and merging — and that difference matters more than syntax taste.
QA & troubleshooting
- Keeping a character's voice consistent across thousands of lines
A character's voice is spread across every line they speak, written over months by more than one translator. What keeps it consistent, what can be checked mechanically, and what still needs a human reader.
- The common localization bugs checklist: what to look for and why it happens
A working checklist of the localization defects that show up in almost every project — what each one looks like in game, how it gets introduced, and whether it can be caught mechanically or needs a human.
- Detecting untranslated strings — and the false positives that come with it
Target-identical-to-source is the basic signal for an untranslated string, but it comes with false positives worth knowing about, plus the quieter cases: empty targets, fallback leakage, and strings added after the last translation pass.
- Reading a diff of your localization files between builds
A diff is supposed to show you what changed. On a localization file it often shows you everything, unless the file is kept in a shape that keeps diffs meaningful.
- Double-encoded UTF-8: when ã� shows up instead of your text
UTF-8 bytes decoded once as a single-byte encoding, then re-encoded as UTF-8 again — a specific two-step corruption with a specific fix, and a reason it tends to happen twice.
- Duplicate keys in localization files: the bug that never throws an error
Duplicate keys rarely crash anything, which is exactly what makes them dangerous. How they get introduced, why last-one-wins hides the problem, and how to detect and prevent them.
- An emoji renders as two broken halves, or silently disappears
A single emoji shows up as a broken glyph, a missing character, or blows past a character limit that should have had room to spare. The cause is almost always a naive substring or truncation operation.
- The CSV that looks fine in one tool and garbage in another
A localization CSV that Japanese spreadsheet software opens perfectly and everything else reads as mojibake — the encoding default behind it, and a workflow that survives round trips.
- Why sampling stops working once AI is in your translation pipeline
Sampling-based review quietly assumes quality is uniform across a file. That assumption held better for a single human translator than it does for machine output — here is why, and what to check instead.
- Giving translators context: the highest-leverage QA input you control
A string table strips away who is speaking, where the text appears, and what a placeholder expands to. What to hand translators instead of a bare spreadsheet.
- Build the glossary before the bulk translation, not after
Item names, skill names, and UI verbs need one translation each, everywhere. A glossary and a style guide are how you get there — if you write them before translation starts.
- How AI translation fails in localization files — a mechanical look
Fluent output is not the same as correct output. A rundown of the specific ways machine and AI translation break localization files, and which failures a script can catch versus which need a human.
- The invisible characters breaking your key lookups and diffs
Zero-width spaces, stray BOMs, directional marks, non-breaking spaces — characters that look like nothing on screen but break exact-match comparison, key lookups, and diffs.
- In Japanese, choosing a first-person pronoun is choosing a character
English I carries no personality signal. Japanese has a real repertoire of first-person pronouns, each carrying age, gender, formality, and personality cues — and EN to JA localization has to pick one per character and keep it.
- Japanese politeness registers: a choice English never asks you to make
English gives almost no signal for which Japanese politeness register a line should use. For EN to JA localization, that choice has to be made deliberately, per speaker and relationship, and kept consistent.
- Treating localization files like code: checks on every change
Parseability, encoding, placeholder parity, tag balance, duplicate keys — the same discipline you apply to source code, applied to the files that carry your game's text.
- Localization regressions: why it was fine last build is not evidence
Source edits, retranslation, and re-imported files all silently change lines that were already approved. Treat localization the way you treat code: baseline, diff, verify.
- A localization smoke test you can run before every release
A short, repeatable pass through every language that catches the failures a full regression pass would also catch, but in minutes instead of days.
- QA for machine-translation post-editing: what changes when a human edits, not writes
MTPE flips the order of translation: a machine drafts, a human edits. That order change moves where errors hide and what a QA pass has to look for.
- Mojibake: reading the garbled text to find the fix
Strings like 縺ゅ↑縺溘 or äö are not random corruption — they are the correct bytes decoded with the wrong encoding. How to read the pattern and recover the original text.
- The player sees {playerName} on screen instead of their name
A raw token like {playerName} or %s shows up in the UI instead of a real value. Four different bugs produce the same symptom — here is how to tell them apart and fix each one.
- Pseudolocalization: testing your pipeline before a single real translation exists
Pseudolocalization transforms source text into an exaggerated stand-in translation so you can catch pipeline bugs — hardcoded strings, overflow, encoding issues — before translators ever touch the file.
- Reviewing a translation you cannot read
Most people who touch a localization file cannot read most of the languages in it. Here is what you can still verify, and what genuinely has to wait for a native reader.
- The item list is sorted in an order that looks wrong to players
An inventory, leaderboard, or friends list sorts translated names into an order native readers immediately flag as wrong — even though nothing crashed. The sort itself needs to be locale-aware.
- Translated text is clipped, cut off, or overlapping in the UI
A button label runs off its edge or two lines overlap only in translated builds. The container was designed for one language's average length — here is how to find the actual fix.
- Empty boxes instead of characters: it's a font problem, not an encoding problem
Text renders as tofu boxes or a fallback glyph while the underlying data is completely correct. How to tell a font problem from an encoding problem, and what to check.
- Tracking localization quality over time, without inventing a score
You do not need a single quality number to know whether localization is getting better or worse. Counting issues by category and severity, build over build, tells you more and lies less.
- Designing a translation review workflow that actually closes the loop
Review only works if it is clear who checks what, decisions get written down instead of re-argued, and an accepted fix actually reaches the file — not just the tester's notes.
- What is localization QA (LQA)? Two different checks people lump into one term
LQA gets used as a catch-all, but it covers two genuinely different kinds of check: linguistic quality and functional or format quality. They belong in different places in the pipeline, done by different people.
- Writing localization bug reports someone can actually act on
「The Japanese feels off」 is not a bug report — it is a feeling. The anatomy of a localization bug report that a translator can fix on the first pass.
- Japanese text wraps in the wrong place — a line starts with 、or 」
A line begins with a comma, a closing bracket sits alone at the start of a line, or a term splits awkwardly mid-word. These are real, well-defined rules being violated — not just an aesthetic complaint.
Language guides
- Arabic localization: RTL layout, shaping, and plurals as engineering, not translation
Right-to-left layout, cursive letter shaping, bidirectional text, and plural categories beyond singular and plural. Why Arabic support is mostly an engineering task.
- pt-BR vs pt-PT: why a bare pt tag is a mistake
Brazilian and European Portuguese differ in spelling, vocabulary, agreement, and address forms. Why the language tag needs to specify which one you mean.
- English to Japanese: what actually changes in your game text
Japanese localization is not a drop-in text swap. Three writing systems in one line, no word spacing, and layout rules English never forces you to think about.
- French for developers: expansion, gender agreement, and typography
French text runs longer than English, grammatical gender can break templates built from fragments, and French typography has its own spacing rules. A practical guide for engineers.
- Why German is the standard stress test for UI text expansion
Compound nouns, noun capitalization, and case-driven word forms make German one of the hardest languages to lay out for — which is exactly why it is worth designing against.
- Japanese to English: what actually changes in your game text
Going the other direction has its own set of traps: text that grows, subjects that must be added, and UI that was built for a language English is not.
- Korean game localization: what Hangul asks of your engine
Hangul is not an alphabet used the way Latin script is used. Syllable blocks, spacing rules, honorific levels, and font coverage all need separate attention.
- Russian plurals and cases: why a two-form template always breaks
Russian uses more plural categories than English and changes noun endings by grammatical case. Why ICU MessageFormat plural syntax, not string concatenation, is the only durable fix.
- Simplified vs traditional Chinese: two localization targets, not one
They are not interchangeable, and treating them as one 'Chinese' language file is one of the most common localization mistakes teams make.
- es-ES vs es-419: why one Spanish is rarely enough
Spain Spanish and Latin American Spanish diverge in vocabulary and address forms. What the BCP 47 tags mean and how to decide between one neutral variant and two.
Process & operations
- Where accessibility and localization overlap
Text reflow, screen reader pronunciation, subtitles, and hardcoded layouts are problems that show up for both accessibility and localization — solving one properly tends to solve the other.
- Hiring a Japanese translator for your game: what to look for and how to brief them
General translation skill and game translation skill are not the same thing. How to evaluate a Japanese translator and brief them well, even if you do not read Japanese yourself.
- How much does game localization cost? Build your own estimate
There is no universal number for what localizing a game costs. Here is how to build an estimate from your own word count, content mix, and scope decisions.
- Localizing a game that is still changing: an early access approach
Full translation of an unstable script wastes work every time a line changes. Here is how to localize an early access game as a series of deltas instead.
- Localization for live-service updates
Live-service games don't localize once — they localize on every recurring content drop, against a fixed event deadline. What that does to the process, and how to avoid shipping an event half-translated.
- Planning a localization timeline: when to start, and what breaks if you don't
Localization has its own schedule, with dependencies that are easy to miss until they cause a rushed, error-prone translation pass right before launch.
- Why localized text has to be seen in the real UI
A spreadsheet and a running game are different renderers. What breaks between them, how to build a fast language-switch testing workflow, and what to prioritize when time is limited.
- Preparing a localization kit: what to send before you send the text
A localization kit is the difference between a translator working from a bare string list and one working with everything they need to get it right the first time.
- What Japanese players notice: text quality as a product signal
In the Japanese market, text quality is read as a signal about the whole product. A craft-level look at register, character voice, and typography from the Japanese reader's perspective.
- The release-day localization checklist
A final pass before you ship: the localization items that are easy to overlook in the last week, why each one matters, and what to have ready for the inevitable post-launch fix.
- The store page as your cheapest localization experiment
The store page is many players' first contact with your game, has the lowest word count of any surface you can localize, and is where a bad translation can cost you more than none at all.
- What localization project management actually consists of
Nobody on a small team holds the title, but someone still does the work — preparing files, briefing translators, fielding queries, coordinating review. Naming the job makes the gaps visible.
- Translation memory, explained: reuse without repeating mistakes
What a translation memory actually stores, how fuzzy matching works, and why reusing a past translation can be either your biggest time-saver or your fastest way to spread an error.
- Working with freelance translators well
Freelance translators are how most small and mid-size studios localize. What makes that relationship work — and why switching to whoever is cheapest per job quietly costs you more.