Get every string out of the code
Every word a player can see belongs in a string table: dialogue, menus, tooltips, item names, achievements, error messages, store copy. Text that stays hard-coded in scripts or baked into images can't be translated without a programmer, and it is the text testers find last.
button.text = "Continue";
// and a PNG with "GAME OVER" painted on itbutton.text = Loc.Get("UI_MAIN_CONTINUE");
// "GAME OVER" drawn as live text over the artQuick test: switch your build to a fake language that wraps every string in brackets, like [Continue]. Anything without brackets on screen is still hard-coded. For a fuller check, use a pseudo-language that also adds accents and extra length, like [Ćöñţîñûé·····]. It catches hard-coded text, missing characters and truncation in one pass.
- Easy to forget: the Steam page and its short description, achievements, trailer captions, key art and screenshots with text on them, patch notes. They rarely sit in the string table, so list them with everything else.
Build sentences that survive translation
Sentences assembled from pieces work in English and fall apart in French, where word order, articles and agreement change. Give the translator whole sentences with placeholders, and let them move the placeholders.
"You found " + count + " " + item + "!"
// French needs "Vous avez trouvé 3 pommes !"
// and the item name changes with the number"You found {count} {item}!"
// with plural forms for {item}:
// one: "pomme" other: "pommes"
// French "one" covers 0 and 1:
// 0 pomme · 1 pomme · 2 pommes- Use named placeholders like
{player}rather than%s, so the translator knows what will appear. - Numbers: don't forget 0 and 1. Every
{count},{amount}or{gold}needs its plural forms, and French doesn't split them like English: 0 and 1 take the singular, and so does anything below 2. English writes 0 coins and 1.5 kilos; French writes 0 pièce and 1,5 kilo. A string tested only with 5 or 10 will look fine and break on 0 or 1. - Support plural rules (ICU MessageFormat, or your engine's plural tables), because languages don't split singular and plural in the same place. English writes 0 apples; in French, 0 usually takes the singular, as in 0 pomme on a counter. Allow a separate message for zero too: in a sentence, Vous n'avez aucune pomme reads far better.
- List every possible value of a variable, or give examples. “{item}” could be a sword, an apple or a pair of boots, which are masculine, feminine and plural in French.
- Don't reuse one string in two places just because the English matches. “Free” on a price tag and “Free” on a prisoner are two different words in French.
Variables, apostrophes and prepositions
French drops a vowel before another vowel and replaces it with an apostrophe: de becomes d', le and la become l', que becomes qu'. When the next word is a variable, the translator can't know which form to write.
| String | {name} = Marc | {name} = Anna |
|---|---|---|
"L'épée de {name}" | L'épée de Marc ✓ | L'épée de Anna ✕ should be d'Anna |
"Je crois que {name} ment." | …que Marc ment. ✓ | …que Anna ment. ✕ should be qu'Anna |
"Vous trouvez le {item}." | le bouclier ✓ | le épée ✕ should be l'épée |
Place names are worse: the word before them depends on the gender, the number, the first letter and sometimes on tradition.
| {place} | "Travel to {place}" | "Back from {place}" |
|---|---|---|
| France | en France | de France |
| Canada | au Canada | du Canada |
| Iran | en Iran | d'Iran |
| Bahamas | aux Bahamas | des Bahamas |
| La Réunion | à La Réunion | de La Réunion |
| Paris | à Paris | de Paris |
Written as "Voyager à {place}", the sentence is wrong for four of these six places: à France, à Canada, à Iran, à Bahamas.
- Tell the translator what the variable holds, and whether any value starts with a vowel or a silent h. Then they can rephrase around it: L'épée appartient à {name} works for every name.
- Store places with their prepositions. Give each place its “to/in” and “from” forms (au Canada, du Canada) in the string table, so the sentence uses the whole phrase:
"Travel {place_to}". - For generated or player-entered names, let the code pick de or d' from the first letter, or store each noun with its article (l'épée, le bouclier). Watch out for the h: l'homme but le héros.
- Apostrophes can also break the file itself. French uses apostrophes constantly (l', d', qu', j'), so an unescaped
'inside'L'épée'ends the string early wherever text sits in single quotes: scripts, SQL, some engine formats, and Androidstrings.xml, which needs\'. Escape apostrophes on import, and test one French string with an apostrophe before the full delivery. - Straight or curly? Many French style guides use the typographic apostrophe
’. Check that your font has it, and tell your translator which one to use so it stays consistent.
Leave room for longer text
As a rule of thumb, plan for French to run 15 to 30% longer than English. It varies with the text, and short UI labels can grow much more. Design for the longest language from the start rather than shrinking text later.
- Make text wrap as much as you can. Buttons, dialogue boxes, tooltips, item cards: let them grow onto a second line or scroll rather than cut the text. Fixed-width, single-line boxes are the most common cause of truncated French.
- When a limit is real (a button, a HUD slot, a store field), write it next to the string as a number of characters.
- Avoid auto-shrinking text as the only fix: it ends up unreadable on a Switch in handheld mode.
- French keyboards are AZERTY. Press WASD to move means ZQSD in France, and a hard-coded “Press Q” points to the wrong key. Show key prompts from the player's actual keyboard layout, and let the translator write
{key_forward}rather than a letter. - Voice-over and subtitles. Longer French subtitles have less time on screen, so allow two lines and enough display time. If you plan a French dub, the script is written to the length of each English line: send the timings with it.
Check fonts and typography
French needs characters that many pixel fonts and custom fonts leave out. A missing glyph shows up as an empty box or a question mark in the middle of a word.
- Test your fonts with a sentence like « Où êtes-vous, cœur fidèle ? », which uses most of them.
- French as written in France puts a space before
? ! : ;and inside « guillemets ». If the engine breaks lines at that space, the punctuation ends up alone on the next line. A non-breaking space (U+00A0 or U+202F) fixes it, if your font and engine support it. - Uppercase accents matter in French: ÉPÉE, not EPEE.
- Tell your translator what the game can display, so they don't use characters that will break.
Give each line its context
Short strings are the hardest to translate because they are the most ambiguous. Is “Open” a button, a door that is already open, or a shop's opening hours? A one-line comment saves a round of questions and a round of fixes.
| ID | English | Context / comment | Max length |
|---|---|---|---|
UI_SHOP_OPEN | Open | Button: opens the shop window | 12 |
ITEM_ROSE_NAME | Rose | Flower item, not the color | 20 |
HUD_LIVES | Lives | Plural noun: number of lives left | 8 |
Screenshots beat descriptions. A folder of screenshots named by screen, or a short playthrough video, answers most questions before they are asked.
Write string IDs a human can read
The translator often sees your text as a spreadsheet, out of order, one line at a time. The string ID is the first clue to where a line appears and who says it. In dialogue, the most useful ID names the speaker and the person spoken to.
dlg_0412 "You left without me."
dlg_0413 "We're ready."CH2_MIRA_TO_JON_014 "You left without me."
CH2_MIRA_TO_PARTY_015 "We're ready."Why it matters in French: “You left without me” has six possible translations, depending on who is spoken to: Tu es parti or Tu es partie to a friend, Vous êtes parti or Vous êtes partie to one person politely, Vous êtes partis or Vous êtes parties to a group. Without the addressee, the translator has to guess, and a wrong guess is a bug that only a French player will notice.
Big cast or group scenes? Add a speaker column and an addressee column next to the text if your IDs can't carry them. Group lines need to say “to the group”.
Gender, plural and tu or vous
English hides a lot of grammar that French spells out. Decide these points before translation starts, so they stay consistent across the whole game.
The player
Is the player character male, female, chosen by the player, or never named? “Are you ready?” becomes Tu es prêt ? or Tu es prête ?. If the player chooses, the game needs two versions of those lines, or a neutral rewrite.
Tu or vous
Does the game speak to the player as a friend (tu) or politely (vous)? Do characters use tu or vous with each other, and does that change as they get closer? That shift can be a story beat.
One or many
“You” can be one person or a whole group. In co-op and party scenes, the text has to know which, because the verb changes.
My specialty
Gender-neutral French that nobody notices
When a line can be said by or to anyone, I rewrite it so that gender never shows, without slashes, dots or awkward workarounds. Players just read natural French.
| English | Gendered French | Seamless neutral French |
|---|---|---|
| Are you ready? | Tu es prêt ? / prête ? | On y va ? |
| You were brave. | Tu as été courageux / courageuse. | Tu as fait preuve de courage. |
| Welcome back! | Bienvenu / Bienvenue ! | Te revoilà ! |
The catch: neutral phrasing works line by line, but it is always a little less direct. When the speaker, the addressee and the context are missing on every line, the whole script has to be written blind, and the French slowly turns safe and flat. Clear string IDs and context let me keep neutral writing for the lines that truly need it, and give the rest its full voice.
Worth deciding early
Non-binary characters
English has a simple answer: singular they. French doesn't. Nouns, adjectives and past participles all carry a gender, and there is no neutral pronoun that every reader accepts. Many languages that give every noun a gender, like Spanish, Italian or German, face the same challenge.
New forms do exist, such as the pronoun iel or inclusive spellings like prêt·e. Some dictionaries now include them, but their use is still debated in France, and part of the audience may notice them more than the story itself.
- Seamless neutral phrasing for most lines, as shown above: respectful, and invisible to the reader.
- New forms like iel when the character's identity is part of the story and the studio wants it visible, decided together before translation.
- A line in the bio sheet on how the character describes themselves, and how much it matters to the story.
The question to settle: should the character's identity be visible in the French, or simply respected? Both are valid, and the answer changes how every line about them is written.
Give your characters an identity
In French, a translator doesn't just translate lines, they write each character's voice again: how formal they are, who they call tu or vous, their slang, their age, their humor. Without that information, everyone ends up sounding the same. A short bio sheet per main character changes everything.
- Gender, pronouns
- Woman, she/her
- Age
- Late 20s
- Role
- Smuggler who joins the player in chapter 1, later the rebel leader
- Personality
- Sarcastic, loyal, impatient
- How she speaks
- Short sentences, street slang, swears when stressed, never polite with authority
- Tu or vous
- Tu with the player from the start, vous with the council until chapter 5
- Name
- No hidden meaning, keep as is
- Sounds like
- A younger Han Solo with less charm
- Arc
- Softens toward the player; her jokes get kinder in act 3

The documents that help, in order
- Character bio sheetsOne per main character, like the one above. Secondary characters can share a single page.
- GlossaryNames, places, factions, mechanics, and what stays in English.
- Pitch and toneOne page: genre, audience, tone, references (“dry humor, think older Valve games”).
- Style decisionsTu or vous, player gender, swearing level, translated title or not.
- Story outlineThe plot in a page or two, spoilers included. Translators need the ending to translate the beginning.
- World summaryA lore cheat sheet: history, places, the words people use in this world.
- Screenshots, video or a buildTo see where the text lives.
- Technical notesVariables, length limits, procedural rules, file format.
- A contact for questionsSomeone who answers within a day or two during the project.
Short beats complete. Translators work against a deadline and a word count, so a 200-page game bible won't be read cover to cover. One page per character and a two-page world summary will be read, and reread. If you only have a long design document, point to the sections that matter for the text.
Be consistent
A translator follows your source text closely. If the English says “Health” in one menu, “HP” in another and “Life” in a tooltip, the translator has to guess whether these are three things or one, and every language inherits the mess. Inconsistency in the source looks small in English and sloppy in ten languages.
"Iron sword" "Iron Sword" "iron sword"
"Health" "HP" "Life"
"Press A to continue"
"Press A to continue."
"Equip" "Wear" "Use" (same action)"Iron Sword" everywhere
"Health" everywhere
"Press A to continue" (prompts: no full stop)
"Equip" for every piece of gearWrite down your rules
A few lines are enough. Decide them once, then stick to them across the whole game.
| Text type | Capitalization | Punctuation | Example |
|---|---|---|---|
| Buttons, menus | Title Case | No full stop | Save Game |
| Tooltips, descriptions | Sentence case | Full stop | Restores some health. |
| Item names | Title Case | None | Iron Sword |
| Places, factions | Title Case | None | Old Growth |
| Dialogue | Normal sentences | Full stops are not optional | We leave at dawn. |
Why it matters in French: French doesn't use Title Case. Iron Sword becomes Épée en fer, with a single capital. So when your capitals jump around, the translator can't tell a proper name (the Old Growth, a faction) from a common word (old growth, a forest). Clear rules tell them which is which, and the French stays clean.
- One term per thing. Pick it, put it in the glossary, use it everywhere.
- One verb per action. If “Equip” equips, it equips everything.
- One punctuation rule per text type, kept from the first string to the last patch.
- Run a quick consistency pass before sending. Sorting your string file alphabetically shows duplicates and near-duplicates in seconds.
What gets translated, and what stays in English?
Names and text in the art need a decision before translation starts, not halfway through.
| Element | Usually | Watch out |
|---|---|---|
| Character names | Keep them, unless the name is a joke or carries a meaning players should get | Note the meaning in the bio sheet |
| Place names | Keep proper names (New Avalon), translate descriptive ones (the Sunken Forest → la Forêt engloutie) | Decide once, for the map, dialogue and UI alike |
| Factions, items, brands | Case by case | Same name everywhere, from tooltips to the Steam page |
| Text in the art: signs, posters, books, UI images | Translate what the player needs to read | Translated art means one version of the image per language. If it stays in English, add a subtitle or a tooltip |
Write it down as a DNT list. A do-not-translate list of every name and term that stays in English, sent with the strings, saves dozens of questions and keeps the game consistent.
Design procedural text for every language
Loot names, random quests, generated insults, barks built from fragments: procedural text multiplies content cheaply in English and multiplies bugs in French. The generator follows English grammar, and French has more of it.
name = prefix + " " + noun + " " + suffix
// "Rusty" + "Sword" + "of Doom"
// FR: "Rouillé Épée du Destin"
// wrong order, wrong gender// template the translator can reorder
fr: "{noun} {adj} {suffix}"
// nouns carry their gender
-sword = épée .gender = feminine
// "Épée rouillée du Destin"What breaks in French
| Problem | English | French |
|---|---|---|
| Adjectives agree with the noun | Rusty sword, rusty shield | épée rouillée, bouclier rouillé |
| Word order changes | Rusty Sword of Doom | Épée rouillée du Destin |
| Articles, elision, contractions | the sword of the Ancient | l'épée de l'Ancien, not le épée de le Ancien |
| Possessives flip | Mira's sword | l'épée de Mira |
| Capitals | The Rusty Sword | L'épée rouillée |
| Length varies per combination | Old Boots of the Great Walker | Vieilles bottes du Grand Marcheur |
- Few combinations? Write them out. Sixty full lines cost less than a generator and its bugs.
- Tag every fragment. The translator fills in the tags, the code picks the right form. Systems like Fluent ↗ or ICU
selecthandle this. - Let each language reorder. Put the assembly order in a translatable template instead of in the code.
- Store articles with nouns. l'épée, le bouclier, rather than a generic
{article}. - Let each language have its own tables. French may need more or fewer fragments than English.
- Explain the rules. Tell the translator how fragments combine, with real examples.
- Export samples for testing. A small tool that prints a few hundred random combinations, including the longest ones, lets testers check grammar and length without playing for hours.
Rule of thumb: a text generator is designed for several languages from day one. Fixing it after launch means recoding the system, not retranslating it.
Let a native eye decide what to adapt
You set the intent: keep it American, or make it feel local. Your translator spots which references land, which get lost, and adapts only those.
Translation is more than words. Food, holidays, school, sports, units and number formats all carry a culture. For each one, decide with your translator whether to keep it, because the setting is American and should feel that way, or adapt it, because the player should feel at home.
Keeping is often the right call: an American story should feel American, and French players know what Thanksgiving is. The skill is telling apart the references that carry meaning the player needs from the ones that are only flavor, and adapting only the first kind when they would get lost.
| English | Keep | Adapt | When to adapt |
|---|---|---|---|
| Pancakes for breakfast | des pancakes | des crêpes | A cozy village, not a diner in Ohio |
| Straight A's | que des A | que des 20 sur 20 | French schools grade out of 20 |
| Hit a home run | un home run | marquer un essai, faire un carton | Baseball means little in France |
| Thanksgiving dinner | le dîner de Thanksgiving | le repas de la Toussaint | Only if the story isn't set in the US |
| It's 75°F, 3 miles away | – | 24 °C, à 5 km | Almost always: nobody converts in their head |
Plot twist
One of your characters is… French?
In English, the French chef who says “Bonjour, mon ami! Zis soup is magnifique!” is instantly recognizable. In French, every line is already in French, so the accent and the sprinkled words vanish, and so does the joke. A character built on being foreign needs to stay foreign.
« Bonjour, mon ami ! Cette soupe
est magnifique ! »
// just a polite chef now« Buongiorno, amico mio !
Cette soupe, elle est magnifica ! »
// the chef becomes ItalianMy usual suggestion: “Let me make them Italian, or the Frenchness will go under the radar.” It is a creative call to make with your team, though. A character's origin can matter for the story, the art or the voice acting, and other options exist, such as a strong regional voice or another quirk. I'll propose; you decide.
Formats are not translation
"$1,299.99" "03/04/2026" "6:30 PM""1 299,99 €" "03/04/2026" = 3 April "18:30"
// use Intl / ICU formatters, not string tricksFrench writes decimals with a comma, thousands with a space, the currency after the number, and days before months. Let the engine's locale formatting handle it, so translators never have to edit numbers by hand.
One French or several?
French is spoken in France, Québec, Belgium, Switzerland and across Africa, and the differences show up in games.
Meals
Breakfast, lunch, dinner: petit-déjeuner, déjeuner, dîner in France, but déjeuner, dîner, souper in Québec. A quest that says “come for dinner” can point to the wrong time of day.
Words
Email, shopping, car: e-mail, faire du shopping, voiture in France; courriel, magasiner, char in Québec. Seventy and ninety are septante, nonante in Belgium and Switzerland.
Typography
In France, a space goes before : ; ! ?. Québec style guides keep it before the colon but use a thin space or none before ; ! ?. Even punctuation has a region.
For most games, one international French that reads naturally everywhere is the right choice. If Québec is a key market, or your game is full of slang and everyday life, a dedicated Canadian French version can be worth it. Tell your translator who you're writing for.
Send a complete package
Everything from the previous habits, sent together at the start: the documents listed in habit 8, plus three practical things.
And plan the timing
- Send the text once it is stable. A string freeze before translation starts avoids paying for lines that change the next week. Late changes are fine, as long as new and edited strings are marked.
- Translation isn't the last step. Keep time in the schedule for an in-game French check before release: truncated lines, missing context and leftover English only show up in the build.
Plan for after launch
Localization doesn't end at release. Patches, events and DLC add new strings, and players will report the lines that slipped through.
- Keep string IDs stable between versions, and mark new and changed strings so only those get sent.
- Keep the glossary and past translations, so new content uses the same words.
- Give French players a simple way to report text issues, like a Discord channel or a form, and log each report with its string ID.
- Budget a short in-game check (LQA) after each big update, not only before launch.
The checklist
Tick what's already done. Your progress is saved in this browser only.
None of these points will stop an experienced translator, though some affect the quality of the result. The checklist shows how well prepared your game is, and gives new projects a solid start.
0 of 17 done
Want a second pair of eyes?
A localization-readiness review checks your strings, variables, fonts and UI before translation starts, and gives you a short list of fixes. It costs far less than fixing the same issues in five languages after launch.