public List<SupportedLanguage> getSupportedLanguages(TaskMonitor monitor)
			throws IOException, CancelledException {
		HttpRequest request =
			request("languages").header(CONTENT_TYPE_HEADER, CONTENT_TYPE_JSON).GET().build();

		String jsonResponseStr = asyncRequest(request, BodyHandlers.ofString(), monitor);

		try {
			// [ { "code": "en", "name": "English", "targets": ["ar", ...
			JsonArray json = JsonParser.parseString(jsonResponseStr).getAsJsonArray();
			List<SupportedLanguage> results = new ArrayList<>();
			for (int i = 0; i < json.size(); i++) {
				SupportedLanguage supportedLang =
					parseSupportedLangJson(json.get(i).getAsJsonObject());
				results.add(supportedLang);
			}
			Collections.sort(results, (o1, o2) -> o1.langCode.compareTo(o2.langCode));
			return results;
		}
		catch (IllegalStateException | JsonSyntaxException e) {
			throw new IOException("Bad data in json response: " + jsonResponseStr, e);
		}
	}
Returns a list of languages that the LibreTranslate server supports.

@param monitor {@link TaskMonitor}
@return list of {@link SupportedLanguage} records
@throws IOException if error connecting or excessive time to respond
@throws CancelledException if cancelled
Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/string/translate/libretranslate/LibreTranslateStringTranslationService.java