Skip to content

Files, formats and export

A project’s strings arrive as files and leave as files. This page is about both directions.

FormatExtensionsNotes
JSON.jsonNested objects are flattened with dots
Flutter ARB.arbParsed as JSON
YAML.yaml, .ymlNested keys flattened with dots
gettext.pomsgid / msgstr pairs
Android resources.xml<string name="…">
Apple strings.strings, .stringsdict"key" = "value";
XLIFF.xliff, .xlf1.2 and 2.0 trans-units
CSV.csvFirst column key, second value
Markdown.md, .mdxOne segment per block, edited as Markdown

The format is taken from the extension, and a file whose extension is not on this list is refused with a message naming the ones that are.

Nested structures become dotted keys, so this file:

{ "home": { "title": "Hello", "cta": "Start" } }

produces the keys home.title and home.cta. That is what your code will look up, and what the export writes back.

Uploading a source file creates a segment for every key in it. Uploading the same file again — same name, same folder — is how you push changes:

  • A key that already exists has its source text updated.
  • A key that was deleted earlier comes back.
  • A new key is added.
  • The order of the file becomes the order of the segments, so a block inserted in the middle stays in the middle rather than jumping to the end.

Upload with a target language set and the file is read as translations rather than as sources: the values are matched to existing segments by key and written into that language. A translation that already has a status keeps it, so importing does not quietly un-approve work.

This is the path for moving in from another tool — push your source file first, then one file per language.

Files live in folders inside the project, and a file is identified by name and path: locales/en.json and mobile/en.json are two different files.

  • Rename a folder and every file under it is moved in one operation.
  • Merge duplicates cleans up files with the same name and path that were created twice — a common result of the same file being pushed by two different pipelines before either had a file ID.

Export writes approved translations back into a file.

WhatWhere
One language, one formatFiles tab → Export, or GET /v1/workspaces/{id}/segments/export
Every language as a ZIPFiles tab → Export all, or GET /v1/workspaces/{id}/segments/export-zip
Straight into the repositoryownlate pull
As a runtime bundleReleases and OTA

Export produces json, yaml or po. Without an explicit format, the file’s own format is used.

Two options change what ends up in the file:

  • Source fallback — pass a source language and untranslated keys are written with their source text instead of being omitted. Use it when a missing key would break your app; leave it off when you would rather see the gap.
  • Untranslatable segments are always written with their source text, whatever else you asked for.