commit: d0dac30ac6e6808e772a5ec0b378e2b8294fc93a
parent 013c60e13a5edfdd70e3ab87f8e5fa3dc501783e
Author: mkljczk <git@mkljczk.pl>
Date: Sat, 22 Feb 2025 15:53:44 +0100
Merge downstream changes
Signed-off-by: mkljczk <git@mkljczk.pl>
Diffstat:
8 files changed, 85 insertions(+), 31 deletions(-)
diff --git 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
@@ -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
@@ -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
@@ -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
@@ -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
diff --git a/test/pleroma/language/translation_test.ex b/test/pleroma/language/translation_test.ex
@@ -1,29 +0,0 @@
-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)
-
- test "it translates text" do
- assert {:ok,
- %{
- content: "txet emos",
- detected_source_language: _,
- provider: _
- }} = Translation.translate("some text", "en", "uk")
- end
-
- test "it stores translation result in cache" do
- Translation.translate("some text", "en", "uk")
-
- assert {:ok, result} =
- Cachex.get(
- :translations_cache,
- "en/uk/#{:crypto.hash(:sha256, "some text") |> Base.encode64()}"
- )
-
- assert result.content == "txet emos"
- end
-end
diff --git a/test/pleroma/language/translation_test.exs b/test/pleroma/language/translation_test.exs
@@ -0,0 +1,28 @@
+defmodule Pleroma.Language.TranslationTest do
+ use Pleroma.Web.ConnCase
+
+ alias Pleroma.Language.Translation
+
+ setup do: clear_config([Pleroma.Language.Translation, :provider], TranslationMock)
+
+ test "it translates text" do
+ assert {:ok,
+ %{
+ content: "txet emos",
+ detected_source_language: _,
+ provider: _
+ }} = Translation.translate("some text", "en", "uk")
+ end
+
+ test "it stores translation result in cache" do
+ Translation.translate("some text", "en", "uk")
+
+ assert {:ok, result} =
+ Cachex.get(
+ :translations_cache,
+ "en/uk/#{:crypto.hash(:sha256, "some text") |> Base.encode64()}"
+ )
+
+ assert result.content == "txet emos"
+ end
+end