SubtitleEdit/subtitleedit · error · InvalidOperationException
Unknown {kind} language '{requested}' for this translate eng
Error message
Unknown {kind} language '{requested}' for this translate engine. Use a code or English name; codes include: {known}... What it means
InvalidOperationException from ResolveLanguage: the requested source/target language could not be matched against the engine's language list by Code, TwoLetterIsoLanguageName, or Name (all case-insensitive). The message lists up to 30 known codes so the caller can pick a valid one.
Source
Thrown at src/seconv/Core/AutoTranslateRunner.cs:189
/// <summary>
/// Completes a user-supplied --translate-url to the full chat/completions endpoint.
/// Accepts a bare <c>host:port</c>, an OpenAI-style <c>.../v1</c> base (with or without
/// trailing slash), or an already-complete <c>.../chat/completions</c> URL.
/// </summary>
internal static string CompleteChatCompletionsUrl(string url)
{
return AutoTranslateUrl.Complete(url, LlamaCppTranslate.DefaultUrl);
}
internal static TranslationPair ResolveLanguage(List<TranslationPair> languages, string requested, string kind)
{
var match = languages.FirstOrDefault(p => p.Code.Equals(requested, StringComparison.OrdinalIgnoreCase))
?? languages.FirstOrDefault(p => p.TwoLetterIsoLanguageName.Equals(requested, StringComparison.OrdinalIgnoreCase))
?? languages.FirstOrDefault(p => p.Name.Equals(requested, StringComparison.OrdinalIgnoreCase));
if (match == null)
{
var known = string.Join(", ", languages.Select(p => p.Code).Take(30));
throw new InvalidOperationException(
$"Unknown {kind} language '{requested}' for this translate engine. Use a code or English name; codes include: {known}...");
}
return match;
}
/// <summary>
/// Local llama.cpp mode: resolve the llama-server binary and a translate model without
/// downloading anything. The Subtitle Edit data folders are probed first so an install
/// done via the SE GUI (Auto-translate > llama.cpp) is picked up automatically.
/// </summary>
private static LlamaCppModel ResolveLocalLlamaCpp(string? requestedModel)
{
LlamaCppLocal.EnsureServerBinary("Auto-translate > llama.cpp", "--translate-url");
return ResolveLlamaCppModel(requestedModel);
}
private static LlamaCppModel ResolveLlamaCppModel(string? requestedModel)View on GitHub (pinned to 17a9f07487)
Solutions
- Look at the 'codes include:' list in the message and pass one of those exact codes.
- Use the ISO 639-1 two-letter code (e.g. 'en', 'ja') which most engines register under TwoLetterIsoLanguageName.
- Use the English display name (e.g. 'Japanese') — also matched.
- If the engine is missing a needed language, switch to one that supports it (e.g. nllb covers 200+ languages).
Example fix
// before
throw new InvalidOperationException(
$"Unknown {kind} language '{requested}' for this translate engine. ...");
// after — surface the closest matches to cut trial-and-error
var suggestions = languages.Where(p => p.Code.StartsWith(requested, StringComparison.OrdinalIgnoreCase) || p.Name.Contains(requested, StringComparison.OrdinalIgnoreCase)).Take(5);
throw new InvalidOperationException($"Unknown {kind} language '{requested}'. Closest: {string.Join(", ", suggestions.Select(p => p.Code))}."); Defensive patterns
Strategy: validation
Validate before calling
static TranslationPair? TryResolve(List<TranslationPair> langs, string requested) =>
langs.FirstOrDefault(p => p.Code.Equals(requested, StringComparison.OrdinalIgnoreCase)) ??
langs.FirstOrDefault(p => p.TwoLetterIsoLanguageName.Equals(requested, StringComparison.OrdinalIgnoreCase)) ??
langs.FirstOrDefault(p => p.Name.Equals(requested, StringComparison.OrdinalIgnoreCase)); Type guard
static bool IsKnownLanguage(List<TranslationPair> langs, string requested) => TryResolve(langs, requested) != null;
Try / catch
null
Prevention
- Validate source/target against the engine's language list before starting the batch.
- Prefer ISO 639-1 two-letter codes (en, ja, de) for broadest engine support.
- Surface closest matches in the validation message to cut trial-and-error.
When it happens
Trigger: Passing a language code/name the active engine does not expose — e.g. 'zh-TW' for an engine that only lists 'zho'/'Chinese', or a 3-letter code where only the 2-letter is registered, or a typo.
Common situations: CLI --translate-source/--translate-target with a code not in the engine's list; switching engines without updating language args; macrolanguage vs. variant mismatch.
Related errors
- Translate engine '{options.TranslateEngine}' is not supporte
- Translate model '{name}' not found in {LlamaCppServerManager
- {Se.Language.Ocr.CrispEmbedNotDownloaded}
- Invalid version format
- Invalid hex string.
AI-assisted analysis of SubtitleEdit/subtitleedit@17a9f07487 (2026-08-13).
Data as JSON: /api/errors/5101e16a2d58f471.
Report an issue: GitHub.