Skip to content

Core concepts

Everything in Ownlate hangs off five objects. Once you know how they nest, the rest of the product — the API, the CLI, the editor — reads the same way.

workspace
├── members, glossary, translation memory, QA rules, API keys, billing
└── project
├── translation file
│ └── segment ── translation (one per target language)
├── release ── OTA distribution
├── task, integration, SDK token

The workspace is the tenant. It is created with a name and a billing currency, it owns a plan and a subscription, and nothing inside it is visible from any other workspace.

These live at workspace level and are shared by every project inside it:

  • Members and their access levels
  • Glossary — terminology, per source language
  • Translation memory — every approved translation, reusable everywhere
  • QA rules — custom regular expressions checked on submission
  • API keys — programmatic access, scoped to your own permissions
  • Audit log — an append-only record of significant actions
  • Integrations — those with workspace scope, which apply to every project

A workspace is identified by a UUID. Almost every REST path starts with it, and almost every GraphQL operation takes it as workspaceId.

A project is one product, or one part of one, and holds the strings for it.

FieldMeaning
sourceLanguageThe language your developers write in. One per project, fixed after creation.
targetLanguagesWhat it is translated into. Add more at any time.
visibilityprivate, or public — a public project’s progress and translations are readable without signing in.
statusactive or archived. Archiving hides a project without destroying it; deleting an archived project is permanent.
ossApprovedAtSet when the platform approves a public project as open — see below.

A public project can additionally be approved by the platform as open. An open project appears in the public catalogue, and anyone signed in — not only members — may leave translation suggestions on it. Suggestions change nothing until a reviewer accepts them. See The translation workflow.

A file is the unit you upload and export. It has a name, a folder path and a format, and the two together identify it: locales/en.json is one file, mobile/en.json is another.

The format is detected from the extension when you upload, and decides how the content is parsed into segments. Renaming a folder rewrites the path of every file under it in one operation.

A segment is one translatable string in one file — the level everything else works at.

FieldMeaning
keyThe identifier your code uses, e.g. home.title. Nested JSON and YAML keys are flattened with dots.
sourceTextThe text in the project’s source language.
isPluralWhether the segment carries plural forms rather than a single string.
translatableSet to false for a key that must never be translated — a brand name, a format token. Untranslatable segments are skipped by pre-translation and exported with their source text.
contextUrl, screenshotUrlWhere the string appears, for translators who cannot see it otherwise.

Changing a segment’s source text marks every translation of it outdated — the string a translator approved no longer describes what the product says.

Each segment carries one translation per target language, and each translation has a text (or a map of plural forms) and a status.

StatusMeaning
untranslatedNothing has been written yet
draftSaved as work in progress, not submitted
needs_reviewSubmitted, waiting for a reviewer
reviewedA reviewer has checked it, waiting for approval
approvedSigned off — this is what gets exported and released
in_progressWas rejected and is being reworked
outdatedThe source text changed after this translation was written

Plural forms are stored as a map of the CLDR categories the target language actually uses — zero, one, two, few, many, other.

Every time a translation is approved, the pair (source text → target text) is written to the workspace translation memory. The memory is scored with a Levenshtein similarity from 0 to 100, where 100 is an exact match, and it is what powers editor suggestions and pre-translation. See Translation memory.

A release is a frozen snapshot of the approved translations of a project, numbered with an incrementing version. A project also has one OTA distribution — a permanent access key that serves the latest release, or any earlier version, over HTTP without authentication. See Releases and OTA.

Plans are metered in words, and a word is a whitespace-separated token of the translation text. The counter moves when a translation is written, and the workspace total can be recomputed from the approved translations at any time. See Plans and billing.