615d041925e8df143821c640a40e836bea258277
[akkoma] / lib / pleroma / akkoma / translators / libre_translate.ex
1 defmodule Pleroma.Akkoma.Translators.LibreTranslate do
2 @behaviour Pleroma.Akkoma.Translator
3
4 alias Pleroma.Config
5 alias Pleroma.HTTP
6 require Logger
7
8 defp api_key do
9 Config.get([:libre_translate, :api_key])
10 end
11
12 defp url do
13 Config.get([:libre_translate, :url])
14 end
15
16 @impl Pleroma.Akkoma.Translator
17 def translate(string, to_language) do
18 with {:ok, %{status: 200} = response} <- do_request(string, to_language),
19 {:ok, body} <- Jason.decode(response.body) do
20 %{"translatedText" => translated, "detectedLanguage" => %{"language" => detected}} = body
21
22 {:ok, detected, translated}
23 else
24 {:ok, %{status: status} = response} ->
25 Logger.warning("libre_translate: request failed, #{inspect(response)}")
26 {:error, "libre_translate: request failed (code #{status})"}
27
28 {:error, reason} ->
29 {:error, reason}
30 end
31 end
32
33 defp do_request(string, to_language) do
34 url = URI.parse(url())
35 url = %{url | path: "/translate"}
36
37 HTTP.post(
38 to_string(url),
39 Jason.encode!(%{
40 q: string,
41 source: "auto",
42 target: to_language,
43 format: "html",
44 api_key: api_key()
45 }),
46 [
47 {"content-type", "application/json"}
48 ]
49 )
50 end
51 end