Add supported languages list to /api/v2/instance
Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
This commit is contained in:
parent
f0eb8e0b0c
commit
28f8bb00d8
9 changed files with 155 additions and 25 deletions
|
|
@ -6,9 +6,9 @@ defmodule Pleroma.Language.Translation do
|
|||
@cachex Pleroma.Config.get([:cachex, :provider], Cachex)
|
||||
|
||||
def configured? do
|
||||
service = get_service()
|
||||
provider = get_provider()
|
||||
|
||||
!!service and service.configured?
|
||||
!!provider and provider.configured?
|
||||
end
|
||||
|
||||
def translate(text, source_language, target_language) do
|
||||
|
|
@ -16,13 +16,13 @@ defmodule Pleroma.Language.Translation do
|
|||
|
||||
case @cachex.get(:translations_cache, cache_key) do
|
||||
{:ok, nil} ->
|
||||
service = get_service()
|
||||
provider = get_provider()
|
||||
|
||||
result =
|
||||
if !service or !service.configured? do
|
||||
if !configured?() do
|
||||
{:error, :not_found}
|
||||
else
|
||||
service.translate(text, source_language, target_language)
|
||||
provider.translate(text, source_language, target_language)
|
||||
end
|
||||
|
||||
store_result(result, cache_key)
|
||||
|
|
@ -37,7 +37,33 @@ defmodule Pleroma.Language.Translation do
|
|||
end
|
||||
end
|
||||
|
||||
defp get_service, do: Pleroma.Config.get([__MODULE__, :provider])
|
||||
def supported_languages(type) when type in [:source, :target] do
|
||||
provider = get_provider()
|
||||
|
||||
cache_key = "#{type}_languages/#{provider.name()}"
|
||||
|
||||
case @cachex.get(:translations_cache, cache_key) do
|
||||
{:ok, nil} ->
|
||||
result =
|
||||
if !configured?() do
|
||||
{:error, :not_found}
|
||||
else
|
||||
provider.supported_languages(type)
|
||||
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
|
||||
"#{source_language}/#{target_language}/#{content_hash(text)}"
|
||||
|
|
|
|||
|
|
@ -9,14 +9,17 @@ defmodule Pleroma.Language.Translation.Deepl do
|
|||
|
||||
@behaviour Provider
|
||||
|
||||
@name "DeepL"
|
||||
|
||||
@impl Provider
|
||||
def configured? do
|
||||
is_atom(get_base_url()) and not_empty_string(get_api_key())
|
||||
end
|
||||
def configured?, do: not_empty_string(base_url()) and not_empty_string(api_key())
|
||||
|
||||
@impl Provider
|
||||
def translate(content, source_language, target_language) do
|
||||
endpoint = get_base_url()
|
||||
endpoint =
|
||||
base_url()
|
||||
|> URI.merge("/v2/translate")
|
||||
|> URI.to_string()
|
||||
|
||||
case Pleroma.HTTP.post(
|
||||
endpoint <>
|
||||
|
|
@ -30,7 +33,7 @@ defmodule Pleroma.Language.Translation.Deepl do
|
|||
"",
|
||||
[
|
||||
{"Content-Type", "application/x-www-form-urlencoded"},
|
||||
{"Authorization", "DeepL-Auth-Key #{get_api_key()}"}
|
||||
{"Authorization", "DeepL-Auth-Key #{api_key()}"}
|
||||
]
|
||||
) do
|
||||
{:ok, %{status: 429}} ->
|
||||
|
|
@ -50,7 +53,7 @@ defmodule Pleroma.Language.Translation.Deepl do
|
|||
%{
|
||||
content: content,
|
||||
detected_source_language: detected_source_language,
|
||||
provider: "DeepL"
|
||||
provider: @name
|
||||
}}
|
||||
|
||||
_ ->
|
||||
|
|
@ -58,11 +61,41 @@ defmodule Pleroma.Language.Translation.Deepl do
|
|||
end
|
||||
end
|
||||
|
||||
defp get_base_url do
|
||||
@impl Provider
|
||||
def supported_languages(type) when type in [:source, :target] do
|
||||
endpoint =
|
||||
base_url()
|
||||
|> URI.merge("/v2/languages")
|
||||
|> URI.to_string()
|
||||
|
||||
case Pleroma.HTTP.post(
|
||||
endpoint <> "?" <> URI.encode_query(%{type: type}),
|
||||
"",
|
||||
[
|
||||
{"Content-Type", "application/x-www-form-urlencoded"},
|
||||
{"Authorization", "DeepL-Auth-Key #{api_key()}"}
|
||||
]
|
||||
) do
|
||||
{:ok, %{status: 200} = res} ->
|
||||
languages =
|
||||
Jason.decode!(res.body)
|
||||
|> Enum.map(fn %{"language" => language} -> language |> String.downcase() end)
|
||||
|
||||
{:ok, languages}
|
||||
|
||||
_ ->
|
||||
{:error, :internal_server_error}
|
||||
end
|
||||
end
|
||||
|
||||
@impl Provider
|
||||
def name, do: @name
|
||||
|
||||
defp base_url do
|
||||
Pleroma.Config.get([__MODULE__, :base_url])
|
||||
end
|
||||
|
||||
defp get_api_key do
|
||||
defp api_key do
|
||||
Pleroma.Config.get([__MODULE__, :api_key])
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -9,21 +9,21 @@ defmodule Pleroma.Language.Translation.Libretranslate do
|
|||
|
||||
@behaviour Provider
|
||||
|
||||
@name "LibreTranslate"
|
||||
|
||||
@impl Provider
|
||||
def configured?, do: not_empty_string(get_base_url())
|
||||
def configured?, do: not_empty_string(base_url()) and not_empty_string(api_key())
|
||||
|
||||
@impl Provider
|
||||
def translate(content, source_language, target_language) do
|
||||
endpoint = endpoint_url()
|
||||
|
||||
case Pleroma.HTTP.post(
|
||||
endpoint,
|
||||
base_url() <> "/translate",
|
||||
Jason.encode!(%{
|
||||
q: content,
|
||||
source: source_language |> String.upcase(),
|
||||
target: target_language,
|
||||
format: "html",
|
||||
api_key: get_api_key()
|
||||
api_key: api_key()
|
||||
}),
|
||||
[
|
||||
{"Content-Type", "application/json"}
|
||||
|
|
@ -52,15 +52,29 @@ defmodule Pleroma.Language.Translation.Libretranslate do
|
|||
end
|
||||
end
|
||||
|
||||
defp endpoint_url do
|
||||
get_base_url() <> "/translate"
|
||||
@impl Provider
|
||||
def supported_languages(_) do
|
||||
case Pleroma.HTTP.get(base_url() <> "/languages") do
|
||||
{:ok, %{status: 200} = res} ->
|
||||
languages =
|
||||
Jason.decode!(res.body)
|
||||
|> Enum.map(fn %{"code" => code} -> code end)
|
||||
|
||||
{:ok, languages}
|
||||
|
||||
_ ->
|
||||
{:error, :internal_server_error}
|
||||
end
|
||||
end
|
||||
|
||||
defp get_base_url do
|
||||
@impl Provider
|
||||
def name, do: @name
|
||||
|
||||
defp base_url do
|
||||
Pleroma.Config.get([__MODULE__, :base_url])
|
||||
end
|
||||
|
||||
defp get_api_key do
|
||||
defp api_key do
|
||||
Pleroma.Config.get([__MODULE__, :api_key], "")
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -17,4 +17,9 @@ defmodule Pleroma.Language.Translation.Provider do
|
|||
provider: String.t()
|
||||
}}
|
||||
| {:error, atom()}
|
||||
|
||||
@callback supported_languages(type :: :string | :target) ::
|
||||
{:ok, [String.t()]} | {:error, atom()}
|
||||
|
||||
@callback name() :: String.t()
|
||||
end
|
||||
|
|
|
|||
|
|
@ -206,10 +206,32 @@ defmodule Pleroma.Web.MastodonAPI.InstanceView do
|
|||
vapid: %{
|
||||
public_key: Keyword.get(Pleroma.Web.Push.vapid_config(), :public_key)
|
||||
},
|
||||
translation: %{enabled: Pleroma.Language.Translation.configured?()}
|
||||
translation: translation_config()
|
||||
})
|
||||
end
|
||||
|
||||
defp translation_config do
|
||||
enabled = Pleroma.Language.Translation.configured?()
|
||||
|
||||
source_languages =
|
||||
case Pleroma.Language.Translation.supported_languages(:source) do
|
||||
{:ok, languages} -> languages
|
||||
_ -> nil
|
||||
end
|
||||
|
||||
target_languages =
|
||||
case Pleroma.Language.Translation.supported_languages(:target) do
|
||||
{:ok, languages} -> languages
|
||||
_ -> nil
|
||||
end
|
||||
|
||||
%{
|
||||
enabled: enabled,
|
||||
source_languages: source_languages,
|
||||
target_languages: target_languages
|
||||
}
|
||||
end
|
||||
|
||||
defp pleroma_configuration(instance) do
|
||||
%{
|
||||
metadata: %{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue