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 &gt; 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

  1. Look at the 'codes include:' list in the message and pass one of those exact codes.
  2. Use the ISO 639-1 two-letter code (e.g. 'en', 'ja') which most engines register under TwoLetterIsoLanguageName.
  3. Use the English display name (e.g. 'Japanese') — also matched.
  4. 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

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


AI-assisted analysis of SubtitleEdit/subtitleedit@17a9f07487 (2026-08-13). Data as JSON: /api/errors/5101e16a2d58f471. Report an issue: GitHub.