commit: f954f98fb7a1dd2503f5929de7589d43df9d5c06
parent 010c23e729e2d643938e6a8a55cd57ee2b5b3d88
Author: marcin mikołajczak <git@mkljczk.pl>
Date: Sat, 13 May 2023 13:22:04 +0200
Implement /api/v1/instance/translation_languages
Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
Diffstat:
10 files changed, 107 insertions(+), 1 deletion(-)
diff --git a/lib/pleroma/language/translation.ex b/lib/pleroma/language/translation.ex
@@ -63,6 +63,32 @@ defmodule Pleroma.Language.Translation do
end
end
+ def languages_matrix do
+ provider = get_provider()
+
+ cache_key = "languages_matrix/#{provider.name()}"
+
+ case @cachex.get(:translations_cache, cache_key) do
+ {:ok, nil} ->
+ result =
+ if !configured?() do
+ {:error, :not_found}
+ else
+ provider.languages_matrix()
+ end
+
+ store_result(result, cache_key)
+
+ result
+
+ {:ok, result} ->
+ {:ok, result}
+
+ {:error, error} ->
+ {:error, error}
+ end
+ end
+
defp get_provider, do: Pleroma.Config.get([__MODULE__, :provider])
defp get_cache_key(text, source_language, target_language) do
diff --git a/lib/pleroma/language/translation/deepl.ex b/lib/pleroma/language/translation/deepl.ex
@@ -98,6 +98,17 @@ defmodule Pleroma.Language.Translation.Deepl do
end
@impl Provider
+ def languages_matrix do
+ with {:ok, source_languages} <- supported_languages(:source),
+ {:ok, target_languages} <- supported_languages(:target) do
+ {:ok,
+ Map.new(source_languages, fn language -> {language, target_languages -- [language]} end)}
+ else
+ {:error, error} -> {:error, error}
+ end
+ end
+
+ @impl Provider
def name, do: @name
defp base_url do
diff --git a/lib/pleroma/language/translation/libretranslate.ex b/lib/pleroma/language/translation/libretranslate.ex
@@ -68,6 +68,17 @@ defmodule Pleroma.Language.Translation.Libretranslate do
end
@impl Provider
+ def languages_matrix do
+ with {:ok, source_languages} <- supported_languages(:source),
+ {:ok, target_languages} <- supported_languages(:target) do
+ {:ok,
+ Map.new(source_languages, fn language -> {language, target_languages -- [language]} end)}
+ else
+ {:error, error} -> {:error, error}
+ end
+ end
+
+ @impl Provider
def name, do: @name
defp base_url do
diff --git a/lib/pleroma/language/translation/provider.ex b/lib/pleroma/language/translation/provider.ex
@@ -21,5 +21,7 @@ defmodule Pleroma.Language.Translation.Provider do
@callback supported_languages(type :: :string | :target) ::
{:ok, [String.t()]} | {:error, atom()}
+ @callback languages_matrix() :: {:ok, Map.t()} | {:error, atom()}
+
@callback name() :: String.t()
end
diff --git a/lib/pleroma/web/api_spec/operations/instance_operation.ex b/lib/pleroma/web/api_spec/operations/instance_operation.ex
@@ -46,6 +46,29 @@ defmodule Pleroma.Web.ApiSpec.InstanceOperation do
}
end
+ def translation_languages_operation do
+ %Operation{
+ tags: ["Instance misc"],
+ summary: "Retrieve supported languages matrix",
+ operationId: "InstanceController.translation_languages",
+ responses: %{
+ 200 =>
+ Operation.response(
+ "Translation languages matrix",
+ "application/json",
+ %Schema{
+ type: :object,
+ additionalProperties: %Schema{
+ type: :array,
+ items: %Schema{type: :string},
+ description: "Supported target languages for a source language"
+ }
+ }
+ )
+ }
+ }
+ end
+
defp instance do
%Schema{
type: :object,
diff --git a/lib/pleroma/web/mastodon_api/controllers/instance_controller.ex b/lib/pleroma/web/mastodon_api/controllers/instance_controller.ex
@@ -24,5 +24,10 @@ defmodule Pleroma.Web.MastodonAPI.InstanceController do
@doc "GET /api/v1/instance/peers"
def peers(conn, _params) do
json(conn, Pleroma.Stats.get_peers())
+end
+
+ @doc "GET /api/v1/instance/translation_languages"
+ def translation_languages(conn, _params) do
+ render(conn, "translation_languages.json")
end
end
diff --git a/lib/pleroma/web/mastodon_api/views/instance_view.ex b/lib/pleroma/web/mastodon_api/views/instance_view.ex
@@ -84,6 +84,15 @@ defmodule Pleroma.Web.MastodonAPI.InstanceView do
}
end
+ def render("translation_languages.json", _) do
+ with true <- Pleroma.Language.Translation.configured?(),
+ {:ok, languages} <- Pleroma.Language.Translation.languages_matrix() do
+ languages
+ else
+ _ -> %{}
+ end
+ end
+
def features do
[
"pleroma_api",
diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex
@@ -760,6 +760,7 @@ defmodule Pleroma.Web.Router do
get("/instance", InstanceController, :show)
get("/instance/peers", InstanceController, :peers)
+ get("/instance/translation_languages", InstanceController, :translation_languages)
get("/statuses", StatusController, :index)
get("/statuses/:id", StatusController, :show)
diff --git a/test/pleroma/web/mastodon_api/controllers/instance_controller_test.exs b/test/pleroma/web/mastodon_api/controllers/instance_controller_test.exs
@@ -113,4 +113,13 @@ defmodule Pleroma.Web.MastodonAPI.InstanceControllerTest do
assert get(conn, "/api/v2/instance")
|> json_response_and_validate_schema(200)
end
+
+ test "translation languages matrix", %{conn: conn} do
+ clear_config([Pleroma.Language.Translation, :provider], TranslationMock)
+
+ assert %{"en" => ["pl"], "pl" => ["en"]} =
+ conn
+ |> get("/api/v1/instance/translation_languages")
+ |> json_response_and_validate_schema(200)
+ end
end
diff --git a/test/support/translation_mock.ex b/test/support/translation_mock.ex
@@ -24,7 +24,16 @@ defmodule TranslationMock do
@impl Provider
def supported_languages(_) do
- ["en", "pl"]
+ {:ok, ["en", "pl"]}
+ end
+
+ @impl Provider
+ def languages_matrix do
+ {:ok,
+ %{
+ "en" => ["pl"],
+ "pl" => ["en"]
+ }}
end
@impl Provider