Skip to content
sign in

Help centre

Lab Forge documentation

Guides for translators and project managers working in Lab Forge.

Getting started#

Lab Forge takes a source file from upload to a checked, deliverable translation. Translators work in the review page; project managers set up projects, glossaries and client rules.

  1. Create a project: client name plus source and target languages.
  2. Upload files. The extension picks the processor; see Supported formats.
  3. Add glossary terms and paste client rules so they bind the run.
  4. Check the cost estimate on the task page, then run.
  5. Review QA findings. Blocking findings stop delivery until fixed or force-shipped with a note.
  6. Download the deliverable in the same format you uploaded.

Supported formats#

34 file extensions have a dedicated processor. This list is generated from the processor registry, so it always matches what the pipeline accepts. Maximum upload size: 250 MB.

CAT bilingual files and packages

Trados, memoQ and Phrase exports. Inline tags are validated after translation and locked segments are left untouched. Packages are unpacked, translated and re-zipped so they re-open in the original tool.

  • .sdlxliff
  • .mqxliff
  • .xliff
  • .xlf
  • .mxliff
  • .mqxlz
  • .sdlppx

Office documents and PDF

Word, PowerPoint, Excel, bilingual RTF and PDF. Layout and run-level styling are preserved; PDF is extracted (with OCR where needed) and delivered as a translated Word file.

  • .xlsx
  • .rtf
  • .docx
  • .pptx
  • .pdf

Subtitles and video

SRT, WebVTT and ASS/SSA keep timing, cue settings and style overrides. Video files are sampled for on-screen text and delivered as translated subtitles.

  • .srt
  • .vtt
  • .ass
  • .ssa
  • .mp4
  • .mov
  • .mkv
  • .webm

Software strings and web content

i18n resource files and markup. Keys, placeholders and structure stay intact; only translatable text changes.

  • .json
  • .yaml
  • .yml
  • .md
  • .markdown
  • .txt
  • .html
  • .htm
  • .po
  • .pot
  • .properties
  • .strings
  • .xml
  • .resx

QA checks#

Every translated segment passes 31 deterministic checks. They are rule-based, so the same file always gives the same result. Each finding is either blocking (delivery stops) or a warning (logged for review).

Structure and markup

Tags, codes and formatting must survive translation exactly, and nothing may be cut off.

  • inline tags
  • alphanumeric codes
  • formatting parity
  • superscript subscript
  • target truncation
  • control byte leak

Numbers and notation

Every number in the source appears in the target, none are invented, and decimals follow the target locale.

  • numbers
  • no introduced numbers
  • scientific notation
  • body decimal localization
  • number word whitespace

Was it really translated

Catches empty targets, targets that copy or echo the source, and source-script text leaking into the target.

  • target equals source
  • target echoes source
  • target empty when source has prose
  • empty target
  • source script leak
  • source quality guard
  • content drift

Terminology and names

Glossary terms, passthrough terms, named entities and capitalisation are checked, and terms stay consistent across the batch.

  • glossary terms
  • passthrough
  • named entity preservation
  • entity preservation
  • capitalization
  • intra batch consistency

Language-specific checks

Length ratio against the language pair, CJK punctuation and spacing, continuation markers and known typos for the target language.

  • length ratio
  • length ratio lut
  • cjk qe
  • cjk punctuation leak
  • glyph spacing
  • continuation marker leak
  • known language typos

When a task is blocked the deliverable is kept but not shipped. Fix and retry, or force-ship with a written reason; the reason is recorded in the audit log.

Glossary and TM#

Glossary

Term pairs are injected into every run and checked by the terminology gate. Each term has a category:

  • locked: always use this target
  • passthrough: keep the source term as is
  • brand: product or company name
  • technical: domain term

Import from: .csv.txt.tsv.xlsx.tmx.tbx.mqxlz.sdltm

Open the glossary

Translation memory

Approved segments are stored and offered as matches on later runs. Memories can be imported and exported as TMX or Trados SDLTM.

Open translation memory

Client rules

Paste raw client feedback on the project. Lab Forge extracts short, imperative rules you review before they bind a run; on conflict they override the default baseline.

Pricing meters#

Rates below are read from the same source as the Pricing page. Each task shows a cost estimate before it runs, and prepaid balance is drawn down as tasks complete.

Pricing meters
MeterRateNote
Source words¥75 / 1000 wordsExisting billed client rate. CJK characters count 1:1.
Translator token1 token = 1 source word (¥0.075)The same ¥75 / 1000 words, expressed per token.
Short-drama subtitles (SRT / video)¥5 / minuteExisting per-minute meter already on this page (≈67 tokens/min).
Bilingual output×1.5Source + target side-by-side.
Locked / pre-translated rowsNot billedExcluded from the word meter.

See the full Pricing page

Certificates and verify#

  1. Each delivered task can carry a signed certificate that records the file's hash and its QA findings.
  2. Anyone who receives the file opens /verify and enters the certificate ID, or pastes the certificate JSON.
  3. They then upload the file they received. Its fingerprint must match the certificate byte for byte.
  4. Where the format allows, the deterministic QA checks are re-run on the file and must reproduce the signed findings.
  5. The signature, file hash and revocation status are each shown as a separate check.

Share links for reviewers expire after 30 days by default and can be revoked at any time.

Verify a certificate

Keyboard shortcuts#

On macOS use Option (⌥); on Windows and Linux use Alt. Shortcuts are ignored while you type in a field.

Everywhere

  • Command palette⌘K
  • Navigate pages⌥1–9, ⌥0
  • Admin panel⌥⇧A
  • Pause task⌘P
  • Resume task⌘R
  • Export project⌘E
  • Run QA check⌘Q
  • Show shortcuts?
  • Close overlayEsc
  • Navigate results↑↓
  • Select item↵

Go to page

  • Overview⌥1
  • Projects⌥3
  • Clients⌥2
  • Queue⌥4
  • Open Translate⌥⇧F
  • Official Doc⌥⇧O
  • Memory⌥7
  • Glossary⌥6
  • XLIFF QA⌥8
  • Analytics⌥⇧D
  • Changelog⌥9
  • Docs⌥0

Review page

  • Next segmentj / ↓
  • Previous segmentk / ↑
  • Show review shortcuts?

FAQ#

API reference#

For integrators. Authenticate with the session cookie from /api/v1/auth/login. Every path below is checked against the live router source in CI.

  • POST/api/v1/auth/loginAuthenticate with your username OR your registered email, plus password. Returns a lab_session cookie (HttpOnly, 7-day TTL).
    200 { "token": "...", "github_login": "operator", "email": "op@example.com" }
    curl -X POST https://lab-forge.com.cn/api/v1/auth/login \
      -H "Content-Type: application/json" \
      -d '{"username":"operator","password":"your-password"}' \
      -c ./cookies.txt
  • POST/api/v1/auth/registerRegister a new operator account. An invite code from your account manager is required unless the operator has opened signup.
    201 { "token": "...", "github_login": "newop", "email": "op@example.com" }
    curl -X POST https://lab-forge.com.cn/api/v1/auth/register \
      -H "Content-Type: application/json" \
      -d '{"username":"newop","password":"...","email":"op@example.com","registration_code":"..."}'
  • GET/api/v1/auth/meVerify the current session. Returns operator info or 401.
    200 { "github_login": "operator", "email": "...", "token_version": 0, "is_admin": false }
    curl -X GET https://lab-forge.com.cn/api/v1/auth/me \
      -b ./cookies.txt
  • GET/api/v1/projectsList all projects for the authenticated operator.
    200 [{ "id": "uuid", "client_name": "...", "source_lang": "EN", ... }]
    curl -X GET https://lab-forge.com.cn/api/v1/projects \
      -b ./cookies.txt
  • POST/api/v1/projectsCreate a new project with client name, language pair, and rules profile.
    201 { "id": "uuid", "client_name": "Acme Corp", ... }
    curl -X POST https://lab-forge.com.cn/api/v1/projects \
      -H "Content-Type: application/json" \
      -b ./cookies.txt \
      -d '{"client_name":"Acme Corp","source_lang":"EN","target_langs":["NL"],"rules_profile_id":"example-ifu"}'
  • PATCH/api/v1/projects/{project_id}Update project metadata or rules profile.
    200 { "id": "uuid", ... }
    curl -X PATCH https://lab-forge.com.cn/api/v1/projects/<id> \
      -H "Content-Type: application/json" \
      -b ./cookies.txt \
      -d '{"client_name":"Acme Corp (updated)","cost_cap_usd":5.0}'
  • DELETE/api/v1/projects/{project_id}Delete a project and all associated files/tasks. Irreversible.
    204 No Content
    curl -X DELETE https://lab-forge.com.cn/api/v1/projects/<id> \
      -b ./cookies.txt
  • POST/api/v1/documentsUpload a source document (bilingual RTF, XLIFF/CAT package, DOCX, SRT, etc. — routed by extension). project_id is a form field. Max 250 MB; 409 on a duplicate SHA-256 unless force=true.
    201 { "id": "uuid", "filename": "bilingual.rtf", "mode": "translate", ... }
    curl -X POST https://lab-forge.com.cn/api/v1/documents \
      -F "project_id=<project-uuid>" \
      -F "file=@bilingual.rtf" \
      -F "mode=translate" \
      -b ./cookies.txt
  • POST/api/v1/glossaryAdd a glossary term pair (source → target) with category and flags. 409 if the exact source_term + target_lang pair already exists.
    201 { "id": "uuid", "source_term": "Low Speckle", ... }
    curl -X POST https://lab-forge.com.cn/api/v1/glossary \
      -H "Content-Type: application/json" \
      -b ./cookies.txt \
      -d '{"project_id":"<project-uuid>","source_lang":"EN","target_lang":"NL","source_term":"Low Speckle","target_term":"Lage speckle","category":"technical","case_sensitive":true}'
  • POST/api/v1/projects/{project_id}/extract-rulesPaste raw client feedback; the extractor returns one-sentence imperative rules you can review before they bind a run.
    200 { "rules": [{ "imperative": "Product names must stay in English.", ... }] }
    curl -X POST https://lab-forge.com.cn/api/v1/projects/<id>/extract-rules \
      -H "Content-Type: application/json" \
      -b ./cookies.txt \
      -d '{"raw_text":"Product names must stay in English. Use NL decimal comma."}'
  • POST/api/v1/tasksDispatch a translation task for an uploaded document. Returns immediately; follow progress by polling the task or streaming its events.
    201 { "id": "uuid", "status": "queued", ... }
    curl -X POST https://lab-forge.com.cn/api/v1/tasks \
      -H "Content-Type: application/json" \
      -b ./cookies.txt \
      -d '{"project_id":"<project-uuid>","document_id":"<doc-uuid>","target_lang":"NL"}'
  • GET/api/v1/tasks/{task_id}Get task status, progress, and QA findings.
    200 { "id": "uuid", "status": "running", "qa_report": { "progress": { "latest": { "stage": "translate", "percent": 61.3, "current": 87, "total": 142 } } }, ... }
    curl -X GET https://lab-forge.com.cn/api/v1/tasks/<task-id> \
      -b ./cookies.txt
  • GET/api/v1/tasks/{task_id}/eventsSSE stream for real-time task progress events. Connect via EventSource for live updates.
    text/event-stream: data: {"type":"progress","payload":{"step":"translate","message":"…","percent":61.3}}
    curl -N https://lab-forge.com.cn/api/v1/tasks/<task-id>/events \
      -b ./cookies.txt
  • POST/api/v1/tasks/{task_id}/cancelCancel a running task. Terminal tasks cannot be cancelled.
    200 { "id": "uuid", "status": "cancelled", ... }  |  409 { "code": "task_not_cancellable" }
    curl -X POST https://lab-forge.com.cn/api/v1/tasks/<task-id>/cancel \
      -b ./cookies.txt
  • POST/api/v1/tasks/{task_id}/confirmConfirm a completed task for delivery. Idempotent — calling twice returns 200.
    200 { "status": "confirmed" }
    curl -X POST https://lab-forge.com.cn/api/v1/tasks/<task-id>/confirm \
      -b ./cookies.txt
  • POST/api/v1/tasks/{task_id}/force-shipForce-deliver a blocked task with an audit note.
    200 { "status": "force_shipped" }
    curl -X POST https://lab-forge.com.cn/api/v1/tasks/<task-id>/force-ship \
      -H "Content-Type: application/json" \
      -b ./cookies.txt \
      -d '{"reason":"False positive on gate #14 — client approved override."}'
  • GET/api/v1/tasks/{task_id}/deliverableDownload the finished deliverable, returned in the shape the source arrived in (bilingual RTF, CAT package, DOCX, SRT, …).
    200 application/octet-stream (binary, Content-Disposition names the file)
    curl -X GET https://lab-forge.com.cn/api/v1/tasks/<task-id>/deliverable \
      -b ./cookies.txt \
      -OJ