Allow listing languages, setting source language (#192)
[akkoma] / lib / pleroma / akkoma / translators / libre_translate.ex
index 615d041925e8df143821c640a40e836bea258277..319907c2ffeb1f68b3d718883767eb25d2a3f8ca 100644 (file)
@@ -14,10 +14,33 @@ defmodule Pleroma.Akkoma.Translators.LibreTranslate do
   end
 
   @impl Pleroma.Akkoma.Translator
-  def translate(string, to_language) do
-    with {:ok, %{status: 200} = response} <- do_request(string, to_language),
+  def languages do
+    with {:ok, %{status: 200} = response} <- do_languages(),
          {:ok, body} <- Jason.decode(response.body) do
-      %{"translatedText" => translated, "detectedLanguage" => %{"language" => detected}} = body
+      resp = Enum.map(body, fn %{"code" => code, "name" => name} -> %{code: code, name: name} end)
+      {:ok, resp}
+    else
+      {:ok, %{status: status} = response} ->
+        Logger.warning("LibreTranslate: Request rejected: #{inspect(response)}")
+        {:error, "LibreTranslate request failed (code #{status})"}
+
+      {:error, reason} ->
+        {:error, reason}
+    end
+  end
+
+  @impl Pleroma.Akkoma.Translator
+  def translate(string, from_language, to_language) do
+    with {:ok, %{status: 200} = response} <- do_request(string, from_language, to_language),
+         {:ok, body} <- Jason.decode(response.body) do
+      %{"translatedText" => translated} = body
+
+      detected =
+        if Map.has_key?(body, "detectedLanguage") do
+          get_in(body, ["detectedLanguage", "language"])
+        else
+          from_language
+        end
 
       {:ok, detected, translated}
     else
@@ -30,7 +53,7 @@ defmodule Pleroma.Akkoma.Translators.LibreTranslate do
     end
   end
 
-  defp do_request(string, to_language) do
+  defp do_request(string, from_language, to_language) do
     url = URI.parse(url())
     url = %{url | path: "/translate"}
 
@@ -38,7 +61,7 @@ defmodule Pleroma.Akkoma.Translators.LibreTranslate do
       to_string(url),
       Jason.encode!(%{
         q: string,
-        source: "auto",
+        source: if(is_nil(from_language), do: "auto", else: from_language),
         target: to_language,
         format: "html",
         api_key: api_key()
@@ -48,4 +71,11 @@ defmodule Pleroma.Akkoma.Translators.LibreTranslate do
       ]
     )
   end
+
+  defp do_languages() do
+    url = URI.parse(url())
+    url = %{url | path: "/languages"}
+
+    HTTP.get(to_string(url))
+  end
 end