add seperate source and dest entries in language listing (#193)
[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 languages do
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
22 {:ok, resp, resp}
23 else
24 {:ok, %{status: status} = response} ->
25 Logger.warning("LibreTranslate: Request rejected: #{inspect(response)}")
26 {:error, "LibreTranslate request failed (code #{status})"}
27
28 {:error, reason} ->
29 {:error, reason}
30 end
31 end
32
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
38
39 detected =
40 if Map.has_key?(body, "detectedLanguage") do
41 get_in(body, ["detectedLanguage", "language"])
42 else
43 from_language
44 end
45
46 {:ok, detected, translated}
47 else
48 {:ok, %{status: status} = response} ->
49 Logger.warning("libre_translate: request failed, #{inspect(response)}")
50 {:error, "libre_translate: request failed (code #{status})"}
51
52 {:error, reason} ->
53 {:error, reason}
54 end
55 end
56
57 defp do_request(string, from_language, to_language) do
58 url = URI.parse(url())
59 url = %{url | path: "/translate"}
60
61 HTTP.post(
62 to_string(url),
63 Jason.encode!(%{
64 q: string,
65 source: if(is_nil(from_language), do: "auto", else: from_language),
66 target: to_language,
67 format: "html",
68 api_key: api_key()
69 }),
70 [
71 {"content-type", "application/json"}
72 ]
73 )
74 end
75
76 defp do_languages() do
77 url = URI.parse(url())
78 url = %{url | path: "/languages"}
79
80 HTTP.get(to_string(url))
81 end
82 end