💡 Before submitting subtitles in a new language, run six QC passes in Subtitle Edit: CPS at the language limit (20 English adult, 17 Vietnamese adult), 2-frame minimum gap with the 24fps collapse rule, 42 characters per line, semantic line breaks (manual only), glyph coverage against the Netflix Accepted Glyph List, and forced narratives in a separate file. Each pass targets a different failure mode.
Key takeaways
- CPS limits are language-specific: English adult 20, Vietnamese adult 17, children's always lower - update your Subtitle Edit profile to match the target language before the QC run.
- The 2-frame minimum gap has a companion rule: at 24fps, any gap of 3-11 frames must be collapsed to exactly 2 frames, not left at an intermediate value.
- Every character must appear in the Netflix Accepted Glyph List - curly quotes, the U+2014 dash character, and the ellipsis character (U+2026) are common failures.
- Semantic line breaks follow linguistic structure (never split subject from verb, adjective from noun) - no tool automates this check.
- Forced narrative events belong in a separate delivery file, flagged with the forced disposition, not embedded in the main subtitle track.
What is a new-language Netflix subtitle QC checklist, and why is it different from a revision?
A revision pass corrects specific errors the spotter or translator introduced. A Netflix subtitle QC checklist for a new language is different: it validates the entire file against specs the reviewer may never have encountered before - the CPS limit for a language they have not delivered previously, glyphs they cannot visually identify as unsupported, and line-break conventions that differ from their native tongue. When I deliver a language for the first time, I run a structured six-category checklist rather than trusting my editorial eye alone.
The first time I delivered a Vietnamese subtitle file, I had the CPS limit set to 20 - the English adult value. Vietnamese adult CPS is 17. The Netflix automated QC rejected the file with a CPS violation on a line I would never have flagged manually. Running the tool check first would have caught it in two minutes. That is the point of a structured checklist: it catches category-level errors before they reach the platform gate.
The six QC categories and which Subtitle Edit check covers each
I run these in a fixed order. Timing first because CPS and gap violations are the most common automated rejection; glyphs last because they require an external reference list.
| QC category | What to check | Subtitle Edit location |
|---|---|---|
| CPS | No event exceeds the language's CPS limit | Tools > Check subtitle > "Characters too fast" |
| Duration | Min 20 frames (~833 ms at 24fps); max 7 s | Tools > Check subtitle > short/long event duration |
| Gap | Min 2 frames; collapse 3-11 frame gaps to exactly 2 frames at 24fps | Tools > Check subtitle > "Gap too short" |
| Line structure | Max 42 chars/line, 2 lines max, bottom-heavy line breaks | Tools > Check subtitle > "Line too long" |
| Glyph coverage | All characters in Netflix Accepted Glyph List | Manual: Tools > Statistics > character list |
| Positioning | No overlap with on-screen text; center-justified, bottom default | Video preview; check forced-top events visually |
| Forced narratives | FN events in a separate file with forced flag | Separate SE project file; mux with correct disposition |
How do I configure the CPS and timing checks for a specific language?
Subtitle Edit stores per-profile settings. Before running any QC pass on a new language, I update the settings to match that language's TTSG page. The Netflix TTSG lists CPS limits, characters per line, and duration ranges for each language it supports.
Subtitle Edit - profile setup for a new language:
Options > Settings > Subtitle
For Vietnamese (adult):
Maximum characters per second: 17
Maximum characters per line: 42
Minimum duration (ms): 833
Maximum duration (ms): 7000
For English (adult):
Maximum characters per second: 20
Maximum characters per line: 42
Minimum duration (ms): 833
Maximum duration (ms): 7000
Then run:
Tools > Check subtitle
Enable: "Characters too fast (CPS)"
Enable: "Line too long"
Enable: "Short event duration"
Enable: "Long event duration"
Enable: "Gap too short between subtitles"
Set minimum gap: 2 frames
Also run:
Tools > Fix common errors
Enable: "Fix short display times"
Enable: "Fix gap too short"
Enable: "Remove extra spaces"
Enable: "Remove empty lines"
What each step does:
- Maximum CPS set before the check: Subtitle Edit uses the value you set in Options > Settings to color-code events in the grid. Set this BEFORE opening the file; otherwise the grid will not update until you change and reload.
- Fix short display times: Extends any event shorter than the minimum duration by pushing the out-time forward, without overlapping the next event. I review each change manually before saving.
- Fix gap too short: Applies the 2-frame minimum. I always manually verify the adjusted events - automatic gap adjustment can clip a critical frame on a cut.
- Remove extra spaces: Catches trailing spaces and double spaces inside a cue, which cause CPS miscounts in some downstream validators.
What needs manual review: semantic line breaks and glyph coverage?
Netflix's general requirements state that line breaks must follow linguistic structure: break after punctuation or before conjunctions and prepositions; never split a subject from its verb, an adjective from its noun, an article from its noun, or a preposition from its object. Subtitle Edit knows character counts; it does not know that "the quick brown" is a single phrase. I do this pass with the original source open in a second Subtitle Edit window, comparing line-break positions side by side. For Vietnamese, the break points follow spoken rhythm, which is why a native-language reviewer matters for this check specifically.
For glyph coverage, Netflix's general requirements state that only characters from the Netflix Accepted Glyph List may appear in the subtitle file. The most common violations I see when checking a file for the first time:
- Curly (smart) quotes (U+201C, U+201D, U+2018, U+2019) instead of straight quotes - word processors auto-substitute these.
- The long dash character (U+2014) instead of a standard hyphen-minus (U+002D).
- Ellipsis character (U+2026) instead of three consecutive periods (...).
- Non-breaking space (U+00A0) instead of a regular space (U+0020).
In Subtitle Edit, I use Tools > Statistics to export a character frequency list. Any character outside the standard ASCII range plus the documented language set stands out when you sort by Unicode code point. For Vietnamese, all precomposed NFC diacritics are in the glyph list; NFD (decomposed) versions are not. If the subtitle file came from certain tools or a macOS system, run a normalization check before import:
// Quick NFC normalization check for a subtitle file
// Run with: node normalize-check.mjs subtitles.srt
import { readFileSync, writeFileSync } from 'fs';
import { argv } from 'process';
const inputPath = argv[2];
const src = readFileSync(inputPath, 'utf8');
const normalized = src.normalize('NFC');
if (src !== normalized) {
const outPath = inputPath.replace(/.(w+)$/, '-nfc.$1');
writeFileSync(outPath, normalized, 'utf8');
console.log('NFD characters found - written as NFC to ' + outPath);
} else {
console.log('File is already NFC - no changes needed');
}
The NFC check matters specifically for Vietnamese on Netflix because the platform's renderer expects precomposed characters. A file that looks correct in a text editor may fail silently on some devices if it contains decomposed diacritics.
Forced narratives: a separate file, not a flag in the main track
Forced narratives are subtitle events that display even when the viewer has subtitles turned off - typically foreign-language dialogue, on-screen text, or key untranslated inserts. Netflix requires forced narrative events in a separate file (not embedded in the same file as the main subtitle track). The file must carry the correct forced flag in its metadata.
My checklist for forced narratives before packaging:
- Identify every event that qualifies as forced (foreign-language spoken line, on-screen sign, key untranslated dialogue).
- Copy those events into a new Subtitle Edit project file.
- Mark the forced disposition in the TTML metadata or in the ffmpeg mux step (
-disposition:s:0 forced). - Verify the forced file contains only FN events - no full-dialogue lines.
- Confirm the main subtitle track does NOT contain the FN events - they belong only in the separate FN file.
What can I do myself, and when does a native-language specialist speed up the QC?
The timing, duration, gap, CPS and character-count checks in Subtitle Edit are free and self-serve. Configured correctly for the target language, those five checks run in under five minutes on any file length. The NFC normalization script above runs in seconds.
The two categories that require human judgment - and where a native-language specialist earns their cost back quickly - are semantic line breaks and glyph coverage for scripts you do not read. A Vietnamese native speaker spots a bad line break in a tonal compound word in seconds; a non-native reviewer may spend 10 minutes on the same error. For glyph coverage in a script you do not read (Cyrillic, Arabic, CJK), a reviewer who works in that script daily catches visually similar but technically different characters immediately.
If you are preparing a new language for the first time and want the full six-category pass done correctly before submission, the subtitle translation and QC service covers both delivery formats and native-language review. I run this checklist on every file before it leaves my desk.
FAQ
Do I need a different Subtitle Edit profile for each language?
Yes. The minimum useful setup is one profile per language-tier combination: English adult (20 CPS, 42 CPL), Vietnamese adult (17 CPS, 42 CPL), Vietnamese children's (13 CPS, 42 CPL). Subtitle Edit saves Settings presets under Options > Settings. I keep a named preset for each language I deliver regularly and switch profiles as the first step of a new job, before opening any file.
What is the minimum gap at 25fps and 29.97fps?
The rule is 2 frames at all frame rates. At 25fps, 2 frames is 80 ms. At 29.97fps (drop-frame), 2 frames is approximately 66.7 ms. The 3-11 frame collapse rule is documented in the Netflix TTSG timing guidelines specifically for 24fps content. For other frame rates I apply the same principle (any gap under half a second should be exactly 2 frames) but verify against the TTSG timing guidelines for your specific package frame rate.
What is the Netflix Accepted Glyph List and where do I find it?
The Netflix Accepted Glyph List is a document available through the Netflix Partner Help Center for authorized partners. It lists every Unicode code point that Netflix's subtitle rendering system is guaranteed to display correctly across supported devices. If you do not have partner portal access, check the specific characters against the TTSG language page for your target, which typically notes special glyph requirements in its Notes section.
Can I run these QC checks on an SRT file, or only TTML?
Subtitle Edit's Check subtitle and Fix common errors tools work on any supported format, including SRT. CPS, duration, gap, and line-length checks are all format-independent. The glyph check and NFC normalization check also apply to any text format. The TTML-specific checks (percentage-only values, tts:fontSize="100%") only matter at the export step. I always run the full checklist on the native editing format first, then export to the delivery format and do a final visual check.
How long does the full six-category QC pass take on a 90-minute feature?
Timing checks (CPS, duration, gap) run in Subtitle Edit in under five minutes. Semantic line breaks take 15-30 minutes, depending on how many events need manual review. Glyph check takes 5-10 minutes using the character frequency export. Positioning and forced narrative checks take 10-20 minutes with video preview open. Total: roughly 40-60 minutes for a full QC pass on a fresh language delivery. On a revision, I always rerun the timing checks from scratch; the others I spot-check at known problem areas.
Official Sources
- Netflix TTSG: General Requirements - glyph list requirement, min/max duration (5/6 s to 7 s), 2-line max, center-justified positioning, line break principles, forced narrative note. Verified November 2026.
- Netflix TTSG: Subtitle Timing Guidelines - min 20 frames duration, min 2-frame gap, 3-11 frame collapse rule at 24fps, shot-change rules. Verified November 2026.
- Netflix TTSG: English (USA) - CPS limits (20 adult, 17 children), 42 CPL. Verified November 2026.
- Netflix TTSG: Vietnamese - CPS limits (17 adult, 13 children; SDH: 20/17), 42 CPL, Vietnamese formatting rules. Verified November 2026.
- Subtitle Edit Documentation (Nikse.dk) - Fix common errors, Check subtitle, Settings profiles. Verified November 2026.

Written by Dao Huy (Lucas), Vietnamese translator and localization specialist (English, Chinese and French into Vietnamese). See translation services →
