{"record":{"id":"aef50b7be7a4e688","repo":"languagetool-org/languagetool","slug":"invalid-format-for-preferredvariants-expected-a","errorCode":null,"errorMessage":"Invalid format for 'preferredVariants', expected a dash as in 'en-GB': '{preferredVariant}'","messagePattern":"Invalid format for 'preferredVariants', expected a dash as in 'en-GB': '(.+?)'","errorType":"validation","errorClass":"BadRequestException","httpStatus":400,"severity":"error","filePath":"languagetool-server/src/main/java/org/languagetool/server/TextChecker.java","lineNumber":1017,"sourceCode":"                                          List<String> noopLangs, List<String> preferredLangs, boolean forcePreferredLanguages) {\n    Language lang;\n    String cleanText = languageIdentifier.cleanAndShortenText(text);\n    DetectedLanguage detected = languageIdentifier.detectLanguage(cleanText, noopLangs, preferredLangs, forcePreferredLanguages);\n    if (detected == null) {\n      lang = parseLanguage(fallbackLanguage != null ? fallbackLanguage : \"en\");\n    } else {\n      lang = detected.getDetectedLanguage();\n    }\n    //String mode;\n    //long t1 = System.nanoTime();\n    //long t2 = System.nanoTime();\n    //float runTime = (t2-t1)/1000.0f/1000.0f;\n    //System.out.printf(Locale.ENGLISH, \"detected \" + detected + \" using \" + mode + \" in %.2fms for %d chars\\n\", runTime, text.length());\n    \n    if (preferredVariants.size() > 0) {\n      for (String preferredVariant : preferredVariants) {\n        if (!preferredVariant.contains(\"-\")) {\n          throw new BadRequestException(\"Invalid format for 'preferredVariants', expected a dash as in 'en-GB': '\" + preferredVariant + \"'\");\n        }\n        String preferredVariantLang = preferredVariant.split(\"-\")[0];\n        if (preferredVariantLang.equals(lang.getShortCode())) {\n          lang = parseLanguage(preferredVariant);\n          if (lang == null) {\n            throw new BadRequestException(\"Invalid 'preferredVariants', no such language/variant found: '\" + preferredVariant + \"'\");\n          }\n        }\n      }\n    } else {\n      if (lang.getDefaultLanguageVariant() != null) {\n        lang = lang.getDefaultLanguageVariant();\n      }\n    }\n    return new DetectedLanguage(null, lang, detected != null ? detected.getDetectionConfidence() : 0f,\n      detected != null ? detected.getDetectionSource() : null);\n  }\n","sourceCodeStart":999,"sourceCodeEnd":1035,"githubUrl":"https://github.com/languagetool-org/languagetool/blob/2e990059ce67d5e2a0f7f7ca5d31160c6709df4b/languagetool-server/src/main/java/org/languagetool/server/TextChecker.java#L999-L1035","documentation":"LanguageTool's server rejects a 'preferredVariants' entry that lacks a dash separating language code from region/variant (e.g. 'en' instead of 'en-GB'). Preferred variants must be full language variants like 'en-GB' or 'de-DE'. The check runs in TextChecker before language resolution so malformed input fails fast with HTTP 400.","triggerScenarios":"POSTing to /v2/check with preferredVariants=en or preferredVariants=en,de (comma list containing a dash-less item); any entry not containing '-' throws.","commonSituations":"Clients pass a bare language code (from a UI language selector) instead of a full variant; code that splits user locale incorrectly; hand-built query strings assuming 'language' syntax works for preferredVariants.","solutions":["Include the variant part: use 'en-GB', 'en-US', 'de-DE' etc., not bare codes","Validate each comma-separated entry contains '-' before calling the API","If only a language is known, drop it from preferredVariants and rely on language=auto detection","Check the parameter spelling is preferredVariants (uppercase V) in v2 API"],"exampleFix":"// before\nparams.put(\"preferredVariants\", \"en,de-DE\");\n// after\nparams.put(\"preferredVariants\", \"en-US,de-DE\");","handlingStrategy":"validation","validationCode":"function validatePreferredVariants(v) {\n  const items = String(v).split(/,\\s*/);\n  if (items.some(i => !i.includes(\"-\"))) throw new Error(\"preferredVariants entries need a dash, e.g. en-GB\");\n}","typeGuard":"const isLangVariant = (s) => typeof s === 'string' && /^[a-z]{2,3}-[A-Za-z0-9]+$/.test(s);","tryCatchPattern":null,"preventionTips":["Always use full BCP-47-style variants like en-GB","Validate against /v2/languages output","Never pass bare language codes in preferredVariants"],"tags":["http","api","validation","languagetool"],"backgroundTag":"invalid-argument-format","analyzedSha":"2e990059ce67d5e2a0f7f7ca5d31160c6709df4b","analyzedAt":"2026-09-06T09:20:17.015Z","contentChangedAt":"2026-09-06T09:20:17.015Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}