How to translate YouTube subtitles into multiple languages

How to translate YouTube subtitles into multiple languages

September 7, 2026

YouTube wants one subtitle file per language, so a video in eight languages is eight files. The translation is the easy half. The eight times is what makes people give up around language three.

This guide covers both ways to do it: clicking through it yourself, which is fine for one or two languages, and handing the whole set to an AI agent that runs our command line tool for you. The second one is the same amount of work at eight languages as at two.

What YouTube gives you, and what it wants back

Open YouTube Studio, go to the subtitles of the video, and you can download the track you already have. You get a choice of formats, and the one to pick is .srt, because that is the subtitle format AI Glot reads.

What YouTube wants back is the same thing, once per language: an .srt file uploaded against a language you add to the video. There is no field anywhere that takes eight languages at once.

If your only track is YouTube’s automatic captions, fix them before you translate. Automatic transcription mishears product names, people’s names and anything said quickly. Translating that turns one wrong word in English into the same wrong word in eight languages, and you will be correcting it eight times instead of once.

The one thing about a subtitle file that decides the whole job

An SRT is a numbered list of cues. Each cue has a number, a start and end timecode, and the text on screen.

A cue before and after translation. Only the text line changes, so the file drops back onto the same video in sync.

The number and the timecode are structure. They are copied through untouched, one cue in gives one cue out, and nothing is merged or split, so the translated file drops back onto the same video and stays in sync.

And here is the constraint that shapes everything else: the file holds exactly one text track. There is no second column for Spanish and no place to add one. Translating an SRT replaces each cue’s text in place, which is precisely why players and YouTube use one file per language.

So eight languages is not one job with eight outputs. It is eight jobs.

One subtitle file holds one language, so eight languages is eight separate translations of the same cues.

Two axes, and the languages are only one of them

Most people have both at once: several videos, and several languages. They behave differently, and knowing which is which saves a lot of clicking.

What you have The shape of the work How to run it
One video, eight languages Eight files, eight jobs One job per language, looped
Twelve episodes, one language Twelve files, one job Put them in one ZIP
Twelve episodes, eight languages Eight ZIPs, eight jobs One ZIP per language, looped

The ZIP is the part people miss. A whole series in one language goes in as a single archive: up to 200 files, 20 MB for the archive and 4 MB per file, translated in one pass with one instruction and one glossary applied to every episode. Subtitle files have no shared schema to violate, so episodes of different lengths sit in the same archive happily.

The languages never collapse like that. Whichever route you take, the number of jobs is the number of languages.

The browser route, and when it is the right one

Upload the file at the SRT translator page or in the app, type one sentence about what you want, read the plan, approve it, download the result. Then do it again for the next language.

For one or two languages this is genuinely the fastest thing available, and there is no reason to open a terminal for it. At eight it becomes eight uploads, eight instructions, eight plans, eight approvals and eight downloads, and the mistakes start being clerical: the German file saved over the French one, one language quietly missing.

The agent route: one prompt, the whole set

If you already work with Claude, ChatGPT, Cursor or any other AI agent that can run commands on your machine, you do not have to touch a browser at all. Our command line tool signs in once and takes a file directly, so an agent can run the entire set and leave you a folder with one subtitle file per language.

The same eight languages, clicked through one at a time or handed to an agent as a single prompt.

Install it and sign in once:

npm install --global @ai-glot/cli
aiglot auth login

That opens a browser to authorize the machine. On a server with no browser, aiglot auth login --device gives you the device-code flow, and aiglot auth login --key <key> works in CI.

The prompt to hand your agent

Paste this, changing the path and the language list. It is written to be handed to an agent, not run yourself.

My English subtitles are at ~/Videos/episode-04.srt, exported from YouTube.

Translate them into Spanish, Portuguese, French, German, Italian, Japanese,
Hindi and Indonesian using the aiglot CLI. Read `aiglot batches create --help`
and `aiglot batches approve --help` first so you use the real flags, and run
`aiglot languages` to confirm each language tag before you start.

An SRT holds one language, so create ONE batch per target language, eight in
total. The source language is English: say so explicitly in every instruction
rather than letting it be inferred.

Use the lite quality tier. Add "keep every subtitle line under 42 characters
and never merge or split cues" as the string-level instruction at approval.

Show me all eight plans and the total word count and cost BEFORE you approve
anything. Then wait for me to confirm.

After I confirm, approve them, poll until each one reaches a terminal status,
and download the results into ~/Videos/subtitles/ as episode-04.<lang>.srt
using the two-letter code for each language. Tell me if any batch failed.

Four things in that prompt are doing real work, and they are the parts worth copying into your own.

It tells the agent to read the help first. An agent guessing flag names fails on the first call and then invents a plausible reason why. Reading the real help, or aiglot help --json for the whole command tree at once, removes that entirely.

It says one batch per language, out loud. An agent that assumes a single job with eight targets will write an instruction the format cannot honour, and a subtitle file that was supposed to be Japanese comes back as something else.

It names the source language. Without it the engine infers the source from the content, and that inference is least reliable exactly where it costs most: short lines, files that already contain a stray translated phrase, and text full of names.

It puts a stop before the spend. aiglot batches approve is the only command that costs credits. Everything before it is free and repeatable, so asking to see eight plans first costs nothing and prevents the expensive kind of misunderstanding.

What the agent actually runs, per language

The four steps, repeated once per language. Only approval spends credits, so every plan can be read for free.

Four commands, repeated per language. As a shell loop it looks like this, which is roughly what your agent will end up doing:

# "code:Language" pairs, so the filename gets the code and the instruction
# gets the language name.
for pair in es:Spanish pt:Portuguese fr:French de:German \
            it:Italian ja:Japanese hi:Hindi id:Indonesian; do
  code=${pair%%:*}
  lang=${pair#*:}

  id=$(aiglot batches create ~/Videos/episode-04.srt \
        --instruction "The source language is English. Translate the text of every cue into ${lang}. Leave cue numbers and timecodes exactly as they are." \
        --json | jq -r '.data.id')

  # Read the plan for free, and only then commit.
  aiglot batches get "$id" --json | jq '.data.plan'

  aiglot batches approve "$id" --quality lite \
    --instructions "Keep every subtitle line under 42 characters. Never merge or split cues."

  # Wait for a TERMINAL status, not for a specific one.
  until status=$(aiglot batches get "$id" --json | jq -r '.data.status'); \
    [ "$status" = "completed" ] || [ "$status" = "failed" ] || [ "$status" = "cancelled" ]; do
    sleep 5
  done

  [ "$status" = "completed" ] && \
    aiglot batches download "$id" --output ~/Videos/subtitles/episode-04.${code}.srt
done

One detail in there is worth stealing even if you never translate a subtitle. The loop waits for any terminal status rather than watching for completed. A script that waits only for the status it hopes for will wait forever on a failure, because a comparison against a value that never arrives is not an error. It is just always false.

There is also an MCP server, aiglot mcp, if your agent prefers tools to a shell. The CLI is the better starting point: it works in a script, it works in CI, and you can read exactly what ran.

The two instructions people mix up

This distinction is the one thing in this whole workflow that fails silently, so it is worth thirty seconds.

The plan instruction decides what gets translated. It is read once, against the shape of the file, and it is where the target language belongs. “Translate the text of every cue into German.”

The string-level instructions are applied while each line is written. The engine sees one subtitle line at a time, so these can only describe something visible inside a line. Line length, tone, a name that must not be touched.

A line-length rule put in the plan does nothing useful, and a sentence like “only translate the second half of the file” put in the string-level instructions does nothing at all, because there is no file in view at that point. Nothing errors. You just get output that ignored you.

Keeping names identical across a whole series

Eight languages times twelve episodes is ninety-six files, and the thing that goes wrong is not grammar. It is that your product is called one thing in episode two and another in episode nine.

A glossary settles the terms that must not drift, and applies the same decision to every file.

Put the terms that must not drift into a workspace glossary once: product names, character names, the house translation of a phrase you repeat in every intro. It then applies to every file in every language, including the episode you publish next month.

This is where a general machine translator struggles, and the reason is mechanical. Its glossary substitutes a term wherever it matches, so the sentence around the substitution is not reconsidered. A glossary here is carried in as meaning while the line is written, so the term inflects into the sentence instead of being dropped into the middle of it.

Uploading the set back to YouTube

In Studio, add a language to the video, then upload the file for it. Do the first one, watch thirty seconds of the video with that track on, and check two things: that a long line has not become a wall of text, and that the timing still feels right when the wording got longer. Translated text usually runs 15 to 30% longer than English, which is exactly what the line-length instruction is protecting you from.

Then upload the rest.

What this actually buys you

Two separate things, and it is worth keeping them apart, because the evidence for each is different.

Discoverability, which is the reason to translate

This one comes straight from YouTube. “On average, over two-thirds of a creator’s audience watch time comes from outside of their home area.” That is YouTube’s own figure, on its own translation tools page, and it is the single most useful number in this article: most of your audience is already somewhere else.

The mechanism is stated on the same page. Translated titles and descriptions can appear in YouTube search results for viewers who speak those languages, and a viewer searching in their own language can find and watch any video that carries subtitles they can read. A video with one English track is discoverable in one language. A video with nine tracks is discoverable in nine.

So translate the title and the description too, not only the subtitles. They are what the search result is made of, and they are three lines of text next to an hour of speech.

Accessibility, which is the reason to caption at all

Captions are not a nice-to-have for a large group of people. The World Health Organization reports that more than 1.5 billion people live with some degree of hearing loss, of whom 430 million have hearing loss significant enough to need rehabilitation, and projects 2.5 billion by 2050, or one person in four.

Then there is everyone who can hear perfectly well and still reads. In a YouGov poll of 1,000 US adults in July 2023, 63% of under-30s said they prefer subtitles on when watching in a language they already know. Preference rose as age fell, and it was the youngest group that wanted them most.

And people watch on mute. In a study run by Verizon Media and Publicis Media in April 2019 across 5,616 US adults, 80% said they are more likely to watch an entire video when captions are available, and half said captions matter to them because they usually watch with the sound off.

Be precise about what those last two numbers prove, because it is easy to stretch them. They measure captions in a language the viewer already speaks, so they are the argument for having a subtitle track at all, not evidence that a Japanese track earns you Japanese viewers. The YouTube figure above is the one that speaks to translation. Taken together the case is simply that a text track earns attention, and a text track in someone’s own language earns attention in a market you currently do not appear in.

Two more figures worth having in mind, from research on buying rather than watching: CSA Research found 76% of online shoppers prefer to buy products with information in their own language, and 40% will not buy from sites in other languages at all. If your videos sell something, that is the same argument applied to the checkout.

What about YouTube’s own auto-translate

YouTube can machine-translate a caption track for a viewer, in the player. It costs nothing and it is a reasonable fallback for a long tail of languages you will never publish properly.

It is also not yours. You do not choose the wording, you cannot fix a term that comes out wrong, it is not the same for every viewer, and the file does not exist anywhere you can reuse it. An uploaded track behaves the opposite way: it appears in your video’s own subtitle menu, it says what you decided it says, and the same file works on every other platform you post that video to.

Use auto-translate for the languages you are not investing in. Upload real tracks for the ones you are.

The honest scope of this

For a single short video in one language, a person who speaks it will do a better job than any of this, and you should ask them.

For eight languages across a back catalogue, the file handling is the whole cost, and it is not language work. Run the bulk through AI Glot, then put review where it earns its keep: the languages that matter most to your audience, and the videos that actually sell something. Plenty of teams use it as a first pass and have a native speaker read the output, which is a good use of an expert and a bad use of an afternoon spent renaming files.

If you want to try it on one episode before committing to a series, the subtitle translator takes a file without an account. Then create a free account when you are ready to run the whole set.


The limits quoted here are the ones in force when this was written: 4 MB per SRT file, and for an archive of subtitle files, 200 files and 20 MB. Word counts, cue counts and costs always come from the plan for your own file, which is free to produce and free to correct.

10,000 words free when you sign up

Ready to translate your large files?