{"record":{"id":"6e29f4080edbfdc5","repo":"languagetool-org/languagetool","slug":"langcode-is-not-a-language-code-known-to-lang","errorCode":null,"errorMessage":"'${langCode}' is not a language code known to LanguageTool. Supported language codes are: ${String.join(\", \", getLangCodes())}. The list of languages is read from ${PROPERTIES_PATH} in the Java classpath. See https://dev.languagetool.org/java-api for details.","messagePattern":"'(.+?)' is not a language code known to LanguageTool\\. Supported language codes are: (.+?)\\. The list of languages is read from (.+?) in the Java classpath\\. See https://dev\\.languagetool\\.org/java-api for details\\.","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"languagetool-core/src/main/java/org/languagetool/Languages.java","lineNumber":239,"sourceCode":"  /**\n   * Get the Language object for the given language code.\n   * @param langCode e.g. <code>en</code> or <code>en-US</code>\n   * @param noopLanguageCodes list of languages that can be detected but that will not actually find any errors\n   *                           (can be used so non-supported languages are not detected as some other language)\n   * @throws IllegalArgumentException if the language is not supported or if the language code is invalid\n   * @since 4.4\n   */\n  public static Language getLanguageForShortCode(String langCode, List<String> noopLanguageCodes) {\n    Language language = getLanguageForShortCodeOrNull(langCode);\n    if (language == null) {\n      // e.g. 'fr-FR' requested (happens with LibreOffice 7.4):\n      language = Languages.getLongCodeToLangMapping().get(langCode);\n    }\n    if (language == null) {\n      if (noopLanguageCodes.contains(langCode)) {\n        return NOOP_LANGUAGE;\n      } else {\n        throw new IllegalArgumentException(\"'\" + langCode + \"' is not a language code known to LanguageTool.\" +\n                \" Supported language codes are: \" + String.join(\", \", getLangCodes()) + \". The list of languages is read from \" + PROPERTIES_PATH +\n                \" in the Java classpath. See https://dev.languagetool.org/java-api for details.\");\n      }\n    }\n    return language;\n  }\n\n  @NotNull\n  private static List<String> getLangCodes() {\n    List<String> codes = new ArrayList<>();\n    for (Language realLanguage : getStaticAndDynamicLanguages()) {\n      codes.add(realLanguage.getShortCodeWithCountryAndVariant());\n    }\n    Map<String, Language> longCodeToLang = getLongCodeToLangMapping();\n    for (Map.Entry<String, Language> entry : longCodeToLang.entrySet()) {\n      if (!codes.contains(entry.getKey())) {\n        codes.add(entry.getKey());\n      }","sourceCodeStart":221,"sourceCodeEnd":257,"githubUrl":"https://github.com/languagetool-org/languagetool/blob/2e990059ce67d5e2a0f7f7ca5d31160c6709df4b/languagetool-core/src/main/java/org/languagetool/Languages.java#L221-L257","documentation":"Languages.getLanguageForShortCode() looks up the given language code in the mapping loaded from language.properties on the classpath. If the code is unknown and not in the noopLanguageCodes list, it throws IllegalArgumentException listing all supported codes.","triggerScenarios":"Calling getLanguageForShortCode(\"xx\") with a 2-3 letter code not present in language.properties and not a noop code (e.g. misspelled code like 'en-USX', removed language, or placeholder value).","commonSituations":"Passing user-supplied language codes from HTTP requests without validation; using a language code from an older LanguageTool version that was removed; confusing ISO 639-3 and 639-1 codes.","solutions":["Validate the code against Languages.getLangCodes() (or Languages.isLanguageSupported) before lookup","Fix the code spelling / use a supported variant code (e.g. 'en-US')","Upgrade or check the classpath so the correct language.properties is loaded"],"exampleFix":"// before\nLanguage lang = Languages.getLanguageForShortCode(userInput); // throws\n// after\nif (Languages.isLanguageSupported(userInput)) {\n  Language lang = Languages.getLanguageForShortCode(userInput);\n}","handlingStrategy":"validation","validationCode":"if (!Languages.isLanguageSupported(code)) { throw new IllegalArgumentException(\"Unsupported language code: \" + code + \"; supported: \" + Languages.getLangCodes()); }","typeGuard":null,"tryCatchPattern":"try { Language lang = Languages.getLanguageForShortCode(code); } catch (IllegalArgumentException e) { lang = defaultLanguage; /* or return 400 to client */ }","preventionTips":["Whitelist/validate language codes at your API boundary using Languages.getLangCodes()","Normalize case and region (e.g. 'EN-us' -> 'en-US') before lookup","Pin the LanguageTool version and test lookups for all codes your clients send"],"tags":["java","language-code","illegal-argument"],"backgroundTag":"invalid-enum-value","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"}