0a4a7fe1090b131f8990307faf3e36642d9c138c
[akkoma] / lib / pleroma / akkoma / translators / deepl.ex
1 defmodule Pleroma.Akkoma.Translators.DeepL do
2 @behaviour Pleroma.Akkoma.Translator
3
4 alias Pleroma.HTTP
5 alias Pleroma.Config
6 require Logger
7
8 defp base_url(:free) do
9 "https://api-free.deepl.com/v2/"
10 end
11
12 defp base_url(:pro) do
13 "https://api.deepl.com/v2/"
14 end
15
16 defp api_key do
17 Config.get([:deepl, :api_key])
18 end
19
20 defp tier do
21 Config.get([:deepl, :tier])
22 end
23
24 @impl Pleroma.Akkoma.Translator
25 def translate(string, to_language) do
26 with {:ok, %{status: 200} = response} <- do_request(api_key(), tier(), string, to_language),
27 {:ok, body} <- Jason.decode(response.body) do
28 %{"translations" => [%{"text" => translated, "detected_source_language" => detected}]} =
29 body
30
31 {:ok, detected, translated}
32 else
33 {:ok, %{status: status} = response} ->
34 Logger.warning("DeepL: Request rejected: #{inspect(response)}")
35 {:error, "DeepL request failed (code #{status})"}
36
37 {:error, reason} ->
38 {:error, reason}
39 end
40 end
41
42 defp do_request(api_key, tier, string, to_language) do
43 HTTP.post(
44 base_url(tier) <> "translate",
45 URI.encode_query(
46 %{
47 text: string,
48 target_lang: to_language
49 },
50 :rfc3986
51 ),
52 [
53 {"authorization", "DeepL-Auth-Key #{api_key}"},
54 {"content-type", "application/x-www-form-urlencoded"}
55 ]
56 )
57 end
58 end