{"record":{"id":"a5dd0e6b08172651","repo":"languagetool-org/languagetool","slug":"you-specified-preferredvariants-but-you-didn-t-s","errorCode":null,"errorMessage":"You specified 'preferredVariants' but you didn't specify 'language=auto'","messagePattern":"You specified 'preferredVariants' but you didn't specify 'language=auto'","errorType":"validation","errorClass":"BadRequestException","httpStatus":400,"severity":"error","filePath":"languagetool-server/src/main/java/org/languagetool/server/V2TextChecker.java","lineNumber":138,"sourceCode":"    DetectedLanguage detectedLang = detectLanguageOfString(text, null, preferredVariants, noopLangs, preferredLangs, forcePreferredLanguages);\n    Language givenLang;\n    if (getLanguageAutoDetect(parameters)) {\n      givenLang = detectedLang.getDetectedLanguage();\n    } else {\n      givenLang = parseLanguage(langParam);\n    }\n    return new DetectedLanguage(givenLang, detectedLang.getDetectedLanguage(), detectedLang.getDetectionConfidence(),\n      detectedLang.getDetectionSource());\n  }\n\n  @Override\n  @NotNull\n  protected List<String> getPreferredVariants(Map<String, String> parameters) {\n    List<String> preferredVariants;\n    if (parameters.get(\"preferredVariants\") != null) {\n      preferredVariants = Arrays.asList(COMMA_WHITESPACE_PATTERN.split(parameters.get(\"preferredVariants\")));\n      if (!\"auto\".equals(parameters.get(\"language\")) && (parameters.get(\"multilingual\") == null || parameters.get(\"multilingual\").equals(\"false\"))) {\n        throw new BadRequestException(\"You specified 'preferredVariants' but you didn't specify 'language=auto'\");\n      }\n    } else {\n      preferredVariants = Collections.emptyList();\n    }\n    return preferredVariants;\n  }\n\n}\n","sourceCodeStart":120,"sourceCodeEnd":147,"githubUrl":"https://github.com/languagetool-org/languagetool/blob/2e990059ce67d5e2a0f7f7ca5d31160c6709df4b/languagetool-server/src/main/java/org/languagetool/server/V2TextChecker.java#L120-L147","documentation":"In the v2 API, 'preferredVariants' is only meaningful together with automatic language detection (language=auto) or multilingual mode. Specifying preferredVariants with a concrete language is contradictory, so V2TextChecker.getPreferredVariants() throws this BadRequestException.","triggerScenarios":"Calling /v2/check with preferredVariants=de-DE and language=en-US (a concrete language, no multilingual=true) — HTTP 400.","commonSituations":"Clients that always append preferredVariants to requests even when a fixed language is configured; template code combining parameters from different examples; multilingual mode flag misspelled or set to \"false\" string.","solutions":["Set language=auto when using preferredVariants","Or add multilingual=true if you genuinely want multilingual checking","Or remove preferredVariants when a concrete language is set","Centralize request building so preferredVariants is only added for auto/multilingual mode"],"exampleFix":"// before\nparams.put(\"language\", \"en-US\");\nparams.put(\"preferredVariants\", \"en-GB\");\n// after\nparams.put(\"language\", \"auto\");\nparams.put(\"preferredVariants\", \"en-GB\");","handlingStrategy":"validation","validationCode":"if (params.preferredVariants && params.language !== 'auto' && params.multilingual !== 'true') {\n  throw new Error('preferredVariants requires language=auto or multilingual=true');\n}","typeGuard":"const canUsePreferredVariants = (p) => p.language === 'auto' || p.multilingual === 'true';","tryCatchPattern":"try { await check(params); } catch (e) { if (/didn't specify 'language=auto'/.test(e.message)) { delete params.preferredVariants; return check(params); } throw e; }","preventionTips":["Only attach preferredVariants when language=auto or multilingual=true","Centralize request assembly to enforce the pairing","Write an integration test covering the auto+preferredVariants combination"],"tags":["http","api","validation","conflicting-parameters","languagetool"],"backgroundTag":"mutually-exclusive-flags","analyzedSha":"2e990059ce67d5e2a0f7f7ca5d31160c6709df4b","analyzedAt":"2026-09-06T09:20:17.015Z","contentChangedAt":"2026-09-06T09:20:17.015Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}