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.
- Create a project: client name plus source and target languages.
- Upload files. The extension picks the processor; see Supported formats.
- Add glossary terms and paste client rules so they bind the run.
- Check the cost estimate on the task page, then run.
- Review QA findings. Blocking findings stop delivery until fixed or force-shipped with a note.
- 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
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
Translation memory
Approved segments are stored and offered as matches on later runs. Memories can be imported and exported as TMX or Trados SDLTM.
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.
| Meter | Rate | Note |
|---|---|---|
| Source words | ¥75 / 1000 words | Existing billed client rate. CJK characters count 1:1. |
| Translator token | 1 token = 1 source word (¥0.075) | The same ¥75 / 1000 words, expressed per token. |
| Short-drama subtitles (SRT / video) | ¥5 / minute | Existing per-minute meter already on this page (≈67 tokens/min). |
| Bilingual output | ×1.5 | Source + target side-by-side. |
| Locked / pre-translated rows | Not billed | Excluded from the word meter. |
Certificates and verify#
- Each delivered task can carry a signed certificate that records the file's hash and its QA findings.
- Anyone who receives the file opens /verify and enters the certificate ID, or pastes the certificate JSON.
- They then upload the file they received. Its fingerprint must match the certificate byte for byte.
- Where the format allows, the deterministic QA checks are re-run on the file and must reproduce the signed findings.
- 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.
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#
Each task type uses the translation route the operator configured for that job, so translation and video runs do not necessarily share one route. Every result then passes the same deterministic QA checks.
Yes. Pause and resume from the task page, or cancel it. A finished task cannot be cancelled; a settled task can be deleted, and its share links are removed with it.
Uploads are fingerprinted. An identical file already in the project is skipped as a duplicate instead of being stored twice.
OWNER_TODO for the owner: confirm whether every upload surface offers an explicit 'upload anyway' override (the API accepts force=true)
Only the extensions in Supported formats have a processor. Other types are refused at upload so you never pay for a run that cannot produce a deliverable.
Create a share link on the task or project. The recipient needs no account. Links can be revoked at any time.
Sessions last 7 days. Signing out ends the session on the server as well as in the browser.
Email support@tempproject.online.
OWNER_TODO for the owner: confirm the response-time commitment, if any, before quoting one here
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.txtPOST
/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