1 defmodule Pleroma.Akkoma.Translators.LibreTranslate do
2 @behaviour Pleroma.Akkoma.Translator
9 Config.get([:libre_translate, :api_key])
13 Config.get([:libre_translate, :url])
16 @impl Pleroma.Akkoma.Translator
18 with {:ok, %{status: 200} = response} <- do_languages(),
19 {:ok, body} <- Jason.decode(response.body) do
20 resp = Enum.map(body, fn %{"code" => code, "name" => name} -> %{code: code, name: name} end)
21 # No separate source/dest
24 {:ok, %{status: status} = response} ->
25 Logger.warning("LibreTranslate: Request rejected: #{inspect(response)}")
26 {:error, "LibreTranslate request failed (code #{status})"}
33 @impl Pleroma.Akkoma.Translator
34 def translate(string, from_language, to_language) do
35 with {:ok, %{status: 200} = response} <- do_request(string, from_language, to_language),
36 {:ok, body} <- Jason.decode(response.body) do
37 %{"translatedText" => translated} = body
40 if Map.has_key?(body, "detectedLanguage") do
41 get_in(body, ["detectedLanguage", "language"])
46 {:ok, detected, translated}
48 {:ok, %{status: status} = response} ->
49 Logger.warning("libre_translate: request failed, #{inspect(response)}")
50 {:error, "libre_translate: request failed (code #{status})"}
57 defp do_request(string, from_language, to_language) do
58 url = URI.parse(url())
59 url = %{url | path: "/translate"}
65 source: if(is_nil(from_language), do: "auto", else: from_language),
71 {"content-type", "application/json"}
76 defp do_languages() do
77 url = URI.parse(url())
78 url = %{url | path: "/languages"}
80 HTTP.get(to_string(url))