mirror of
https://git.pleroma.social/pleroma/pleroma.git
synced 2024-06-01 19:32:38 +00:00
Implement /api/v1/instance/translation_languages
Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
This commit is contained in:
parent
010c23e729
commit
f954f98fb7
|
@ -63,6 +63,32 @@ defmodule Pleroma.Language.Translation do
|
||||||
end
|
end
|
||||||
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_provider, do: Pleroma.Config.get([__MODULE__, :provider])
|
||||||
|
|
||||||
defp get_cache_key(text, source_language, target_language) do
|
defp get_cache_key(text, source_language, target_language) do
|
||||||
|
|
|
@ -97,6 +97,17 @@ defmodule Pleroma.Language.Translation.Deepl do
|
||||||
end
|
end
|
||||||
end
|
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
|
@impl Provider
|
||||||
def name, do: @name
|
def name, do: @name
|
||||||
|
|
||||||
|
|
|
@ -67,6 +67,17 @@ defmodule Pleroma.Language.Translation.Libretranslate do
|
||||||
end
|
end
|
||||||
end
|
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
|
@impl Provider
|
||||||
def name, do: @name
|
def name, do: @name
|
||||||
|
|
||||||
|
|
|
@ -21,5 +21,7 @@ defmodule Pleroma.Language.Translation.Provider do
|
||||||
@callback supported_languages(type :: :string | :target) ::
|
@callback supported_languages(type :: :string | :target) ::
|
||||||
{:ok, [String.t()]} | {:error, atom()}
|
{:ok, [String.t()]} | {:error, atom()}
|
||||||
|
|
||||||
|
@callback languages_matrix() :: {:ok, Map.t()} | {:error, atom()}
|
||||||
|
|
||||||
@callback name() :: String.t()
|
@callback name() :: String.t()
|
||||||
end
|
end
|
||||||
|
|
|
@ -46,6 +46,29 @@ defmodule Pleroma.Web.ApiSpec.InstanceOperation do
|
||||||
}
|
}
|
||||||
end
|
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
|
defp instance do
|
||||||
%Schema{
|
%Schema{
|
||||||
type: :object,
|
type: :object,
|
||||||
|
|
|
@ -24,5 +24,10 @@ defmodule Pleroma.Web.MastodonAPI.InstanceController do
|
||||||
@doc "GET /api/v1/instance/peers"
|
@doc "GET /api/v1/instance/peers"
|
||||||
def peers(conn, _params) do
|
def peers(conn, _params) do
|
||||||
json(conn, Pleroma.Stats.get_peers())
|
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
|
||||||
end
|
end
|
||||||
|
|
|
@ -84,6 +84,15 @@ defmodule Pleroma.Web.MastodonAPI.InstanceView do
|
||||||
}
|
}
|
||||||
end
|
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
|
def features do
|
||||||
[
|
[
|
||||||
"pleroma_api",
|
"pleroma_api",
|
||||||
|
|
|
@ -760,6 +760,7 @@ defmodule Pleroma.Web.Router do
|
||||||
|
|
||||||
get("/instance", InstanceController, :show)
|
get("/instance", InstanceController, :show)
|
||||||
get("/instance/peers", InstanceController, :peers)
|
get("/instance/peers", InstanceController, :peers)
|
||||||
|
get("/instance/translation_languages", InstanceController, :translation_languages)
|
||||||
|
|
||||||
get("/statuses", StatusController, :index)
|
get("/statuses", StatusController, :index)
|
||||||
get("/statuses/:id", StatusController, :show)
|
get("/statuses/:id", StatusController, :show)
|
||||||
|
|
|
@ -113,4 +113,13 @@ defmodule Pleroma.Web.MastodonAPI.InstanceControllerTest do
|
||||||
assert get(conn, "/api/v2/instance")
|
assert get(conn, "/api/v2/instance")
|
||||||
|> json_response_and_validate_schema(200)
|
|> json_response_and_validate_schema(200)
|
||||||
end
|
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
|
end
|
||||||
|
|
|
@ -24,7 +24,16 @@ defmodule TranslationMock do
|
||||||
|
|
||||||
@impl Provider
|
@impl Provider
|
||||||
def supported_languages(_) do
|
def supported_languages(_) do
|
||||||
["en", "pl"]
|
{:ok, ["en", "pl"]}
|
||||||
|
end
|
||||||
|
|
||||||
|
@impl Provider
|
||||||
|
def languages_matrix do
|
||||||
|
{:ok,
|
||||||
|
%{
|
||||||
|
"en" => ["pl"],
|
||||||
|
"pl" => ["en"]
|
||||||
|
}}
|
||||||
end
|
end
|
||||||
|
|
||||||
@impl Provider
|
@impl Provider
|
||||||
|
|
Loading…
Reference in a new issue