{"record":{"id":"57c32f3d8f8c7dbe","repo":"SubtitleEdit/subtitleedit","slug":"an-error-occurred-during-translate-jsonresult","errorCode":null,"errorMessage":"An error occurred during translate:\n\n {jsonResult}","messagePattern":"An error occurred during translate:\n\n (.+?)","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"src/libuilogic/AutoTranslate/MicrosoftTranslator.cs","lineNumber":102,"sourceCode":"            jsonBuilder.Append(\"{ \\\"Text\\\":\\\"\" + Json.EncodeJsonText(text) + \"\\\"}\");\n            jsonBuilder.Append(\"]\");\n            var json = jsonBuilder.ToString();\n            var content = new StringContent(json, Encoding.UTF8);\n            content.Headers.ContentType = MediaTypeHeaderValue.Parse(\"application/json\");\n            var result = await httpClient.PostAsync(url, content, cancellationToken);\n            var parser = new JsonParser();\n            var jsonResult = await result.Content.ReadAsStringAsync(cancellationToken);\n\n            if (!result.IsSuccessStatusCode)\n            {\n                Error = jsonResult;\n\n                if (result.StatusCode == HttpStatusCode.Unauthorized)\n                {\n                    throw new Exception(\"API key is not valid!\" + Environment.NewLine + Environment.NewLine + jsonResult);\n                }\n\n                throw new Exception(\"An error occurred during translate:\" + Environment.NewLine + Environment.NewLine + jsonResult);\n            }\n\n            var x = (List<object>)parser.Parse(jsonResult);\n            foreach (var xElement in x)\n            {\n                var dict = (Dictionary<string, object>)xElement;\n                var y = (List<object>)dict[\"translations\"];\n                foreach (var o in y)\n                {\n                    var textDictionary = (Dictionary<string, object>)o;\n                    var res = (string)textDictionary[\"text\"];\n                    res = res.Replace(\"<br />\", Environment.NewLine);\n                    res = res.Replace(\"<br/>\", Environment.NewLine);\n                    res = res.Replace(\"<br>\", Environment.NewLine);\n                    results.Add(res);\n                }\n            }\n","sourceCodeStart":84,"sourceCodeEnd":120,"githubUrl":"https://github.com/SubtitleEdit/subtitleedit/blob/17a9f0748781032255db3526b7215d2fb891e3af/src/libuilogic/AutoTranslate/MicrosoftTranslator.cs#L84-L120","documentation":"Thrown by MicrosoftTranslator.Translate() as the catch-all for any non-success, non-401 status from Azure Translator. Includes the full response body (jsonResult), which usually contains Azure's structured error JSON with a 'message' field explaining the cause.","triggerScenarios":"Translate() posts; result is not success and not 401. Common codes: 400 (bad request - unsupported language pair, text too long), 403 (forbidden - quota/resource disabled), 429 (rate limit), 503 (service unavailable).","commonSituations":"Unsupported source/target language code for Azure Translator; single-request character limit exceeded (Azure allows 10000 chars per request); 429 from exceeding the transactions-per-second quota; 503 during Azure incidents.","solutions":["Parse the jsonResult for Azure's error code/message (it has .error.code like 'UnsupportedLanguagePair').","For 429: reduce concurrency and add backoff.","For 400: verify the language codes are valid Azure Translator codes and the text fits the limit.","Check the Azure Service Health dashboard for incidents (503)."],"exampleFix":"// before\nthrow new Exception(\"An error occurred during translate:\" + Environment.NewLine + Environment.NewLine + jsonResult);\n\n// after - surface the HTTP code and Azure's structured error code alongside the body\nthrow new Exception($\"Azure Translator error: HTTP {(int)result.StatusCode} ({result.StatusCode}).\" + Environment.NewLine + Environment.NewLine + jsonResult);","handlingStrategy":"retry","validationCode":"// Validate language codes against Azure's supported set and respect the 10000-char limit\nif (text.Length > 10000)\n    throw new ArgumentOutOfRangeException(nameof(text), \"Azure Translator accepts at most 10000 characters per request.\");\nvar supported = await GetAzureLanguagesAsync(token);\nif (!supported.Contains(targetLanguageCode))\n    throw new ArgumentException($\"Target language '{targetLanguageCode}' is not supported by Azure Translator.\");","typeGuard":null,"tryCatchPattern":"try\n{\n    return await translator.Translate(text, src, tgt, token);\n}\ncatch (Exception ex) when (ex.Message.Contains(\"An error occurred during translate\"))\n{\n    // Parse Azure's error JSON (in the message body) for .error.code to branch\n    if (ex.Message.Contains(\"429\")) { await Task.Delay(backoff, token); return await translator.Translate(text, src, tgt, token); }\n    throw;\n}","preventionTips":["Chunk text under Azure's 10000-char per-request limit.","Pre-validate language codes against Azure Translator's /languages list.","On 429, back off; on 400, fix the payload; on 503, retry later.","Parse the jsonResult in the message for Azure's structured error code."],"tags":["api","azure","translation","rate-limit"],"backgroundTag":null,"analyzedSha":"17a9f0748781032255db3526b7215d2fb891e3af","analyzedAt":"2026-08-13T18:11:43.374Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}