Skip to content

Translation Queue

The Translation Queue is a real-time view of every translation job Sublarr is working on right now, plus the most recent finished and failed ones. Jobs stream their progress over WebSocket so the cue counter ticks up cue-by-cue without polling. From the queue you can cancel a runaway job, retry a failure, or jump into the resulting subtitle in the editor.

Open it from:

SurfaceNotes
Settings → Translation → QueueDedicated page; the most complete view.
Activity → Translations tabSame data with a smaller header for quick checks.
Dashboard → Activity FeedTranslation entries link straight to the queue page.

The page stacks three sections:

SectionContent
Active jobsJobs in running or queued state. Live progress bars.
Recent completionsLast 50 finished jobs with cost, duration, and link to the result.
FailuresJobs that errored, with truncated error message and retry button.

Each job in Active shows:

FieldEffect
Series / MovieWhat’s being translated. Click to open the source media in Library.
Source → TargetLanguage pair (en → de).
BackendWhich translation backend is doing the work.
Progress barPercentage based on cues completed / total cues.
ThroughputCues/second over the last 60 s rolling window.
ETAEstimated remaining time at current throughput.
Cost (running)Tokens or characters consumed so far × backend’s per-unit price. Hidden for free backends.
CancelCooperative cancellation — finishes the in-flight cue, rolls back partial output, marks cancelled.

Each row links to the actual subtitle the job produced. Sortable by:

ColumnDefault sort
Finished atMost-recent first (default).
DurationLongest first — surfaces slow jobs.
CostHighest first — surfaces expensive jobs.
CuesLargest first — proxy for content size.

Clicking a row opens the Subtitle Editor on the produced file, with the source side-by-side for comparison.

Failed jobs surface inline so you don’t have to dig through logs:

ColumnEffect
Series + episodeSame as active.
ErrorOne-line summary (e.g. “Backend rate-limited”, “Cue exceeds context”).
BackendWhich one failed; useful for “switch and retry” decisions.
LogsOpens the relevant section of Logs filtered to the job ID.
RetryRe-queues the job with the same parameters.
Retry on different backendPicks the next backend in the fallback chain and queues.

Cancel is cooperative, not forceful:

  1. The cancel signal is recorded in the job state.
  2. The current cue’s translation finishes (in-flight HTTP request completes).
  3. Partial cues already written are dropped — no half-translated file lands.
  4. Job exits with state cancelled.

Total time from click to terminal state is bounded by your backend’s per-request timeout (default 90 s).

The queue respects Settings → Translation → Workers — usually 2 concurrent jobs. Additional jobs queue with state queued and start when a slot frees. The queued count appears in the header so you can see backlog at a glance.

Every completed job writes a row to translation_events with cost, latency, token / character counts, and backend ID. The aggregated view lives in Cost & Memory; the queue shows the per-job number for situational awareness.

A toolbar above the lists supports:

FilterEffect
StatusShow only running, queued, completed, failed, cancelled.
BackendOnly jobs from one backend — useful when comparing quality between backends.
SeriesOnly jobs for one show.
Date rangeLimit the recent-completions list.

The queue is durable across restarts. If Sublarr is stopped mid-job, the job re-enters queued state on next boot and resumes when a worker picks it up — translation memory ensures no cue is paid for twice.

SymptomWhere to look
Job is queued for hoursWorkers maxed; raise Concurrent translations in Settings → Translation.
Throughput is zero on running jobBackend not responding — check Settings → Translation → Backend health + Logs.
Job shows failed with empty errorThe error message was longer than the truncation limit; click Logs for the full trace.
All jobs failing on one backendAuth issue (rate limited / invalid key) — check API Keys → Test for that backend.