diff --git a/lib/pleroma/application_requirements.ex b/lib/pleroma/application_requirements.ex index a334d12ee..211b4882d 100644 --- a/lib/pleroma/application_requirements.ex +++ b/lib/pleroma/application_requirements.ex @@ -189,7 +189,23 @@ defmodule Pleroma.ApplicationRequirements do false end - if Enum.all?([preview_proxy_commands_status | filter_commands_statuses], & &1) do + translation_commands_status = + if Pleroma.Language.Translation.missing_dependencies() == [] do + true + else + Logger.error( + "The following dependencies required by the currently enabled " <> + "translation provider are not installed: " <> + inspect(Pleroma.Language.Translation.missing_dependencies()) + ) + + false + end + + if Enum.all?( + [preview_proxy_commands_status, translation_commands_status | filter_commands_statuses], + & &1 + ) do :ok else {:error, diff --git a/lib/pleroma/language/translation.ex b/lib/pleroma/language/translation.ex index e4916389d..3706e76eb 100644 --- a/lib/pleroma/language/translation.ex +++ b/lib/pleroma/language/translation.ex @@ -11,6 +11,16 @@ defmodule Pleroma.Language.Translation do !!provider and provider.configured? end + def missing_dependencies do + provider = get_provider() + + if provider do + provider.missing_dependencies() + else + [] + end + end + def translate(text, source_language, target_language) do cache_key = get_cache_key(text, source_language, target_language) @@ -23,6 +33,7 @@ defmodule Pleroma.Language.Translation do {:error, :not_found} else provider.translate(text, source_language, target_language) + |> scrub_html() end store_result(result, cache_key) @@ -102,4 +113,15 @@ defmodule Pleroma.Language.Translation do defp store_result(_, _), do: nil defp content_hash(text), do: :crypto.hash(:sha256, text) |> Base.encode64() + + defp scrub_html({:ok, %{content: content} = result}) when is_binary(content) do + scrubbers = Pleroma.Config.get([:markup, :scrub_policy]) + + content + |> Pleroma.HTML.filter_tags(scrubbers) + + {:ok, %{result | content: content}} + end + + defp scrub_html(result), do: result end diff --git a/lib/pleroma/language/translation/deepl.ex b/lib/pleroma/language/translation/deepl.ex index 4f668fbba..e027035b4 100644 --- a/lib/pleroma/language/translation/deepl.ex +++ b/lib/pleroma/language/translation/deepl.ex @@ -7,6 +7,8 @@ defmodule Pleroma.Language.Translation.Deepl do alias Pleroma.Language.Translation.Provider + use Provider + @behaviour Provider @name "DeepL" diff --git a/lib/pleroma/language/translation/libretranslate.ex b/lib/pleroma/language/translation/libretranslate.ex index b793b166e..fd727d1cf 100644 --- a/lib/pleroma/language/translation/libretranslate.ex +++ b/lib/pleroma/language/translation/libretranslate.ex @@ -7,6 +7,8 @@ defmodule Pleroma.Language.Translation.Libretranslate do alias Pleroma.Language.Translation.Provider + use Provider + @behaviour Provider @name "LibreTranslate" @@ -44,7 +46,7 @@ defmodule Pleroma.Language.Translation.Libretranslate do %{ content: content, detected_source_language: source_language, - provider: "LibreTranslate" + provider: @name }} _ -> diff --git a/lib/pleroma/language/translation/provider.ex b/lib/pleroma/language/translation/provider.ex index f12cba2cd..533b5355a 100644 --- a/lib/pleroma/language/translation/provider.ex +++ b/lib/pleroma/language/translation/provider.ex @@ -3,6 +3,10 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Language.Translation.Provider do + alias Pleroma.Language.Translation.Provider + + @callback missing_dependencies() :: [String.t()] + @callback configured?() :: boolean() @callback translate( @@ -24,4 +28,13 @@ defmodule Pleroma.Language.Translation.Provider do @callback languages_matrix() :: {:ok, Map.t()} | {:error, atom()} @callback name() :: String.t() + + defmacro __using__(_opts) do + quote do + @impl Provider + def missing_dependencies, do: [] + + defoverridable missing_dependencies: 0 + end + end end diff --git a/test/pleroma/language/translation/deepl_test.ex b/test/pleroma/language/translation/deepl_test.exs similarity index 100% rename from test/pleroma/language/translation/deepl_test.ex rename to test/pleroma/language/translation/deepl_test.exs diff --git a/test/pleroma/language/translation_test.ex b/test/pleroma/language/translation_test.exs similarity index 94% rename from test/pleroma/language/translation_test.ex rename to test/pleroma/language/translation_test.exs index ecab3d20f..0be7a8d60 100644 --- a/test/pleroma/language/translation_test.ex +++ b/test/pleroma/language/translation_test.exs @@ -2,7 +2,6 @@ defmodule Pleroma.Language.TranslationTest do use Pleroma.Web.ConnCase alias Pleroma.Language.Translation - # use Oban.Testing, repo: Pleroma.Repo setup do: clear_config([Pleroma.Language.Translation, :provider], TranslationMock)