Files, formats and export
A project’s strings arrive as files and leave as files. This page is about both directions.
Supported formats
Section titled “Supported formats”| Format | Extensions | Notes |
|---|---|---|
| JSON | .json | Nested objects are flattened with dots |
| Flutter ARB | .arb | Parsed as JSON |
| YAML | .yaml, .yml | Nested keys flattened with dots |
| gettext | .po | msgid / msgstr pairs |
| Android resources | .xml | <string name="…"> |
| Apple strings | .strings, .stringsdict | "key" = "value"; |
| XLIFF | .xliff, .xlf | 1.2 and 2.0 trans-units |
| CSV | .csv | First column key, second value |
| Markdown | .md, .mdx | One 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
Section titled “Uploading”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.
Importing existing translations
Section titled “Importing existing translations”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.
Folders
Section titled “Folders”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
Section titled “Export”Export writes approved translations back into a file.
| What | Where |
|---|---|
| One language, one format | Files tab → Export, or GET /v1/workspaces/{id}/segments/export |
| Every language as a ZIP | Files tab → Export all, or GET /v1/workspaces/{id}/segments/export-zip |
| Straight into the repository | ownlate pull |
| As a runtime bundle | Releases 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.