Translations

Last edit 11 Sept 2026, 15:01 by WikiModHistory

A story can be published in more than one language. You add a language, download its lines, translate them, and upload them back. Sexter rebuilds your Ink in that language and players can pick it.

Write the story itself in English first. That English version is what the library shows. Other languages here are extras you add after. A story that exists only in another language will not appear in the library.

Nothing is all-or-nothing. Lines you leave blank stay English, so a half-finished language is still playable, and you can upload your work in pieces as you go.

Add a language

Studio → Languages.

Pick a language and hit Add language. Available languages are the ones Sexter's interface supports: Español (Spanish), Português (Brasil), 中文 (Chinese), 日本語 (Japanese), Русский (Russian), Deutsch (German), Français (French), 한국어 (Korean).

Each language you add gets a row showing how far along it is, whether it is live, and when it was last built. Live / Not published is the publish button: click it to put the language in the player's picker, or take it out. Unpublished stays yellow with a warning, so a finished translation is harder to leave sitting offline. The Languages tab also shows a yellow warning when any language is below 100% or not published. The percentage is measured against the current English, so it updates when you change a conversation. You do not need Rebuild just to see the new number.

The language row

Every row has three actions, plus a ⋯ menu:

  • Download opens a menu:
    • Translation bundle is the one to start with. A zip of small JSON files, each a few conversations in speaking order with who sent every line
    • Only what needs work is the same bundle trimmed to lines that are missing or need redoing, which is what you want after the first pass
    • CSV opens in Excel, Numbers, Google Sheets, or LibreOffice
    • JSON is one flat file of every line and its id, for scripting
  • Upload takes the finished zip back. You can also pick one part file or a CSV if you are going file by file. Studio then saves the lines and rebuilds the playable Ink. A progress bar shows whether it is uploading, saving, or building, and how far along. Stay until the file is sent. After that you can leave. Come back to Languages and the same bar is still there. Only one save or rebuild runs at a time, so a second language has to wait. The row then updates on its own (percentage, built date) and says how many conversations were built. You do not need to refresh.

When two or more languages have unfinished lines, a bar above the list offers Download what needs work and Upload all. That zip has one folder per language (de/, es/, …) with only the missing and stale lines. After you change one conversation this is usually a single file in each folder. Translate a folder, put the zip back together, and upload it once. Upload all uses the same progress bar, one language after another.

  • Live / Not published (top of the row) puts the language in the player's picker, or hides it. Not published is yellow
  • ⋯ holds Rebuild (recompile from the current English without uploading) and Remove language. Rebuild uses the same progress bar as Upload.

The bundle

A full-length story runs to tens of thousands of lines, which is far too much to hand to a translator or an AI in one go. The bundle splits it into files of roughly a hundred kilobytes each, and a full-length story usually lands somewhere between twenty and fifty of them.

A conversation is never split across two files. That is deliberate: whoever translates a scene can see the whole thing, so pronouns, formality, and running jokes stay consistent. Translating loose lines out of context is what makes translated dialogue read badly.

Each file is a list of conversations in speaking order. from is who sent the line, en is the English, and the field named after the language is where your translation goes. German files use de, Japanese files use ja, and so on:

json
{
  "story": "Sexting my GF",
  "translateInto": "Deutsch",
  "part": "1 of 34",
  "you": "Jonathan, male, Melany's boyfriend",
  "instructions": ["..."],
  "conversations": [
    {
      "title": "mel-asks-ben-lingerie-advice",
      "with": "Ben",
      "lines": [
        { "from": "player", "kind": "choice", "en": "Hey Ben! Are you here??", "de": "" },
        { "from": "Ben", "en": "Hey Mel", "de": "" }
      ]
    }
  ]
}

Fill in de and leave from, en, kind, with, and you alone. The instructions block spells out the rules, so an AI you paste a file into has what it needs without you explaining anything.

If an AI hands the file back with that field renamed (tr, translation, de-DE), the upload still finds it. Bundles you downloaded before this used tr, and those still import too.

player means the player tapped that reply. Those are the buttons under the chat: keep them short.

Injector captures are different. Both sides are other characters (Character A on the left, Character B on the right). Those lines use the character's name in from, not player, even though Character B's bubbles sit on the right like a player message.

with is who the chat is with. you at the top of the file is who they are texting as, which you set under Notes for translators. See below for why it matters.

The zip also carries a README.txt you can pass straight to a translator.

The same English line listed twice in a scene is there so the translator can see the conversation. Uploading still applies that translation everywhere the English matches. If you need two identical lines translated differently, use the CSV instead, which addresses every line separately.

The CSV

One row per line of text, with these columns:

ColumnWhat it is
refThe join key. Do not edit this, it is how the upload finds the line again
groupWhich conversation or which part of the story this came from
contextLine number, or which character / post the row belongs to
kindMessage, Choice, Choice button, Bio, Chapter title, and so on
speakerWho sent the line. player for a tapped reply. On Injector captures, both sides are character names. Empty on Studio fields
sourceThe English text
translationThe only column you edit
statusmissing, translated, or stale
maxLengthHard character limit, where one exists (phone app names are capped at 12)
placeholdersPlaceholders that have to survive the translation

Column order does not matter on upload, it is matched on the header names, but the file has to keep a ref column and a translation column.

Notes for translators

Under Languages there is a Notes for translators panel. What you put there is copied into every file of the bundle, so it reaches whoever is translating without you repeating yourself.

Who the player is texting as is the important one. Many languages inflect the speaker's own words for gender: the player writing "I'm tired" is estoy cansado or estoy cansada in Spanish depending on who they are. The bundle already names the character on the other end, but nothing in your Ink says who the player is, so without this the translator is guessing. Write it plainly:

text
Jonathan, male, Melany's boyfriend

That is for the whole story. It shows up as you at the top of every file.

Anything else is free text for the rest: formality, pet names you want left in English, a character whose voice is easy to get wrong. It shows up as notesFromTheCreator at the top of each file.

None of this is ever shown to players. It exists only inside the bundle.

Translate it

Fill in the empty language fields in a bundle file, or the translation column in the CSV. Leave one empty and that line stays English.

Sexter does not translate for you. Use whatever translator you already have, machine or human.

With an AI, one bundle file per request works well. Ask it to return the same JSON with the language field filled in. Doing a whole story in one request does not, even where it fits: quality drops off, and a single bad response costs you everything instead of one batch you can redo.

Placeholders

Ink lines are exported with the non-text parts swapped out for numbered placeholders:

text
source        Hey {0}, did you see {1}?
placeholders  {0} {1}

Every placeholder in source has to appear in translation, exactly once, in the same order. That is what keeps variables, image tags, and glue attached to the right words. An upload row that drops or reorders a placeholder is rejected and reported.

Word order does change between languages, and a placeholder that has to move is the one case you cannot solve in the file. Reword the English line so it works in both, or leave that line English.

What you cannot put in a translation

The upload rejects anything that would change the story's structure rather than its words:

  • { or }, which open Ink logic
  • -> or <-, which are diverts
  • |, which is an Ink alternative
  • #, which starts an Ink tag
  • *, +, =, ~ or - as the first character of a line
  • [ or ] in a choice. Inside a choice those split the button label from the chat echo
  • A message that starts with [. That is the group chat speaker prefix, matched against character names
  • Line breaks. One row is one line
  • Text past a maxLength limit

Rejected lines are listed with their English text and the reason, right under the upload button. Fix those and upload again.

Upload it

Hit Upload and pick the zip you downloaded (with the translations filled in). One zip is enough. You can also upload a single part-01.json file or a CSV if you are working through the bundle a piece at a time.

The report tells you how many lines were imported, how many were left blank, how many did not match anything in the story, and which lines were rejected and why. A file inside the zip it cannot read is named in the report and skipped, so one bad part does not cost you the rest of the upload. The percentage updates immediately.

Uploading also rebuilds the story in that language. If a translation somehow still changes the structure of a conversation, that one file stays English and the build reports it, rather than shipping a broken save state.

Rebuild (in the ⋯ menu) recompiles the playable Ink from the current English text without uploading anything. You rarely need it. The percentage itself updates on its own when you change the English.

What gets translated

Ink content:

  • Messages
  • Choices, both the button and the chat echo
  • Text inside inline conditionals
  • Strings passed to externals

Studio content:

  • Story title, description, ending message, library tags
  • Character names, short names, nicknames, last names, bios, descriptions, personality, history
  • Chapter titles and subtitles
  • Cinematic slide text
  • TheGram profile display names and bios, post captions, comments and commenter names
  • FansOnly creator display names, bios, price labels, post captions, comments and commenter names
  • Swiper names and bios
  • Skipr questions, answers, and jump labels
  • Gallery category names
  • Injector thread titles
  • Per-story phone app names
  • Update notes

Not translated, because the Ink matches against them verbatim:

  • TheGram and FansOnly usernames
  • Flag and variable names
  • Image, SFX, and media ids
  • Ink filenames

Also not translated, because they are not creator copy:

  • Save file route badges and character name-status emojis, which are emoji, not words
  • Module settings, like the FansOnly currency number or the Sidedoor gallery code
  • Anything a player typed: their save names, TheGram and FansOnly comments, reviews
  • Chat history already on a player's phone, which arrives in whatever language they were reading at the time
  • Your notes for translators, which are instructions to the translator rather than copy

Cinematic titles stay untranslated too. Those are Studio labels, and players never see them.

Studio has no translatable field outside this list. A check runs against the database schema and fails the build if a new field or a new module table is added without a decision about it, so a future app cannot quietly ship untranslated.

Character names are a special case. They are translated for display, so a player reading in German sees the German name in the chat header and in Contacts, but your [Ben] group chat prefixes keep matching the English name. Do not translate speaker prefixes in your Ink; they are not exported.

Publish a language

The Live / Not published chip at the top of the row puts the language in the player's picker. You can publish at any percentage; the untranslated parts show in English.

The chip stays disabled until the language has been built at least once.

Click Live to hide it again. Anyone mid-play in that language keeps reading it until they switch.

When you edit the English

A translation is tied to the English text it was written for, not to a position in the file. That means you can keep working on your story without losing translations:

What you doWhat it costs
Insert a line anywhereNothing. Just translate the new line
Delete a lineNothing. Its translation is dropped
Move or reorder linesNothing. Translations follow the text
Reword a lineThat one line needs redoing

Rewording a line, or adding a new one, drops those characters out of the percentage. The Languages row rescans the current English when you save or add a conversation, pull from Git, or open the tab, so a language that was 100% will fall off 100% on its own. You do not need Rebuild for that. Rebuild only recompiles the playable Ink.

Changed lines stop being served, stop counting toward the percentage, and show up in the Only what needs work download. Studio fields (character bios, chapter titles, and so on) also mark the old translation stale. The row warns you when that happens: 12% needs redoing because the English changed. Players see English for those lines until you translate them again.

So after an editing pass, use Download what needs work at the top if you have more than one language. That is one zip for every language, usually one small file each. On a single language, Download → Only what needs work is the same thing. You do not need the whole story again.

Part numbers are not fixed

Parts follow the story: part 1 is the opening, the last one or two hold the Studio content (characters, chapter titles, TheGram, Skipr, and so on). Since chapters are written in order, your newest chapter sits in the highest-numbered parts and the early ones stop changing.

The numbering itself is not a permanent label. Files are filled to a size limit, so adding a scene early on pushes later conversations into different parts than last time. Uploads match on the English text rather than the file name, so nothing breaks and part order stays correct. Just do not hand a translator "parts 10 to 15" and assume it means the same conversations after you have edited the story. Split the work by chapter if you need a stable division.

Remove a language

The trash button in the ⋯ menu deletes every translation for that language and its compiled Ink. Players reading it switch back to English at their current spot, keeping their progress. There is no undo, so download the file first if you might want it back.

What players see

Menus, phone apps, Creator Studio, and the rest of the base-game chrome follow the account language (library Account, or the picker on login). Settings, Messages, Contacts, Gallery, TheGram, FansOnly, Swiper, Skipr, Injector, Idle Hustler, and the home screen widgets are all in that language. Account emails (recovery code, email verify, application and review news) use that language too. Story text is separate: Ink lines, character names, bios, and captions you wrote follow the language they pick for that story.

On the story card in the library, a small language badge appears when the story is published in the player's interface language. An Update badge sits next to it on the same row.

Search in the library has a language filter. It lists every language that at least one story has published, so players can find stories they can read in Deutsch, Español, and so on. English is the default for every story, so it is not in that list.

On the story sheet, next to Play or Continue, there is a language pill showing the current language and how complete it is. Tapping it lists English plus every published language with its percentage. The in-game phone Settings app has the same list, only for this story. If the story has no published translations, that Settings row is hidden. App language is not in the phone. It lives on Account.

The story sheet selects the player's account language when you have published it. If that language is not live, it uses the language they last picked, then English. They can change it on the sheet or in phone Settings.

Switching language mid-story keeps progress and saves. Messages already in the chat stay in the language they arrived in. Everything from that point on is in the new language.

Related

Official Sexter creator documentation. Older Unity / SmGF folder-mod docs remain at docs.unzipped.games. Creator Corner is for community models and production workflows.