# Branching dialogue and string tables, in your design documents.

1 October 2026 · By the Nodary team

Write branching dialogue as a script, play it through and export it to Yarn Spinner. Keep the game’s text in a string table with a state per translation, length and placeholder checks, and files for your engine.

![The string table of Saltmarrow, a fictional sample project: keys, context and maximum lengths beside English, French, German, Japanese and Brazilian Portuguese columns, a coloured bar for each translation’s state, and each language’s progress above the grid, with three strings to fix in German and in Brazilian Portuguese](https://nodary.ai/release-media/2026-10-string-table.webp)

The words of a game pass through two pairs of hands: the narrative designer who writes the conversation, and the localization team who ships it in every language. Both now work in the design documents, next to the characters and systems the text belongs to.

## Branching dialogue, written as a script

The Dialogue block holds lines said by speakers. A line can offer choices, and each choice jumps to the line it names by a short id, so reordering never breaks a jump. Switch between Script, Play, which walks the conversation choice by choice as the player will, and Graph, which draws every jump. Nodary flags a choice that points at a line that no longer exists, a line no path reaches and a line that says nothing. Start from the Quest Dialogue template, or from the short example an empty dialogue offers.

## Out to Yarn Spinner

When the conversation holds together, Yarn file downloads a Yarn Spinner 2 script: one node per line, choices as options, jumps between nodes, and the first line tagged start. Import it with Yarn Spinner in Unity, Godot or Unreal. An agent connected over MCP runs the same checks with check_dialogue and gets the same script. Cut scenes keep their place in the Screenplay block, which reads Fountain.

## A state for every translation

Turn any spreadsheet into a string table, or type / and pick String table. Nodary reads the column roles from your headers, such as Key, Context, Max length and English, or Godot’s keys, en, fr, and adds a language in one click. Each translation is missing, draft, reviewed, final, or source changed once its source text moves, and nothing is rewritten when that happens. As you type, Nodary flags a string over its limit in characters a player sees, a lost or added placeholder, text left in the source language and stray spaces. Select a translation and a panel shows its source, its context, its length and the placeholders to keep.

## Files for engines and translators

Export CSV with every language for Godot and Unity, JSON for i18next, gettext .po with the key as context for Unreal and Godot, and XLIFF 1.2 for translation tools, carrying each string’s state, limit and context. A pseudo-localized language shows clipped text in your interface before any translation exists. Translators send back XLIFF, .po, JSON or CSV: strings are matched by key, previewed before anything changes, and an empty translation never erases one in the table. A build can also fetch the table from a fixed address, one language or all, final strings only if you ask.

## Try it in your workflow

1. Open the string table example.
2. Set Show to Problems: the German greeting has lost its {name}, and the French Load game button runs past its 16 characters.
3. Select the German greeting to read its source, its context and the placeholder to keep.
4. Open Export and choose XLIFF 1.2 for French.

There is no translation memory and no built-in machine translation; an agent you connect over MCP can write translations, which arrive as drafts. Plural forms live as ICU messages in one cell, and plural entries in a .po file are skipped on import. Dialogue conditions and variables are not modelled: a condition written into a choice, such as [Carrying a memory crystal], is read by people but never evaluated. Yarn Spinner is an export only, a dialogue holds up to 300 lines of up to 8 choices each, and dialogue lines do not reach the string table by themselves.

The page: https://nodary.ai/updates/string-tables-and-branching-dialogue
