diff --git a/config/description.exs b/config/description.exs
index 33d959aab4..73ca4809b3 100644
--- a/config/description.exs
+++ b/config/description.exs
@@ -3544,7 +3544,8 @@
type: :module,
suggestions: [
Pleroma.Language.Translation.Deepl,
- Pleroma.Language.Translation.Libretranslate
+ Pleroma.Language.Translation.Libretranslate,
+ Pleroma.Language.Translation.TranslateLocally
]
},
%{
@@ -3586,6 +3587,14 @@
label: "LibreTranslate API Key",
type: :string,
suggestions: ["YOUR_API_KEY"]
+ },
+ %{
+ group: {:subgroup, Pleroma.Language.Translation.TranslateLocally},
+ key: :intermediate_language,
+ label:
+ "translateLocally intermediate language (used when direct source->target model is not available)",
+ type: :string,
+ suggestions: ["en"]
}
]
},
diff --git a/lib/pleroma/language/translation/translate_locally.ex b/lib/pleroma/language/translation/translate_locally.ex
index 4a3e9d7acc..7eaa95e7b2 100644
--- a/lib/pleroma/language/translation/translate_locally.ex
+++ b/lib/pleroma/language/translation/translate_locally.ex
@@ -1,5 +1,5 @@
# Pleroma: A lightweight social networking server
-# Copyright © 2017-2022 Pleroma Authors
+# Copyright © 2017-2024 Pleroma Authors
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Pleroma.Language.Translation.TranslateLocally do
@@ -71,16 +71,24 @@ def translate(content, source_language, target_language) do
@impl Provider
def supported_languages(:source) do
- languages_matrix()
- |> Map.keys()
+ languages =
+ languages_matrix()
+ |> elem(1)
+ |> Map.keys()
+
+ {:ok, languages}
end
@impl Provider
def supported_languages(:target) do
- languages_matrix()
- |> Map.values()
- |> List.flatten()
- |> Enum.uniq()
+ languages =
+ languages_matrix()
+ |> elem(1)
+ |> Map.values()
+ |> List.flatten()
+ |> Enum.uniq()
+
+ {:ok, languages}
end
@impl Provider
@@ -91,21 +99,25 @@ def languages_matrix do
|> Enum.map(fn {key, value} -> {key, Map.keys(value)} end)
|> Enum.into(%{})
- if intermediary_language() do
- languages
- |> Map.to_list()
- |> Enum.map(fn {key, value} ->
- with_intermediary =
- ((value ++ languages[intermediary_language()])
- |> Enum.uniq()) --
- [intermediary_language()]
+ matrix =
+ if intermediary_language() do
+ languages
+ |> Map.to_list()
+ |> Enum.map(fn {key, value} ->
+ with_intermediary =
+ (((value ++ languages[intermediary_language()])
+ |> Enum.uniq()) --
+ [key])
+ |> Enum.sort()
- {key, with_intermediary}
- end)
- |> Enum.into(%{})
- else
- languages
- end
+ {key, with_intermediary}
+ end)
+ |> Enum.into(%{})
+ else
+ languages
+ end
+
+ {:ok, matrix}
end
@impl Provider
diff --git a/test/pleroma/language/translation/translate_locally_test.exs b/test/pleroma/language/translation/translate_locally_test.exs
new file mode 100644
index 0000000000..51cbd11bd8
--- /dev/null
+++ b/test/pleroma/language/translation/translate_locally_test.exs
@@ -0,0 +1,59 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2024 Pleroma Authors
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Language.Translation.TranslateLocallyTest do
+ use Pleroma.DataCase
+
+ alias Pleroma.Language.Translation.TranslateLocally
+
+ @example_models %{
+ "de" => %{
+ "en" => "de-en-base"
+ },
+ "en" => %{
+ "de" => "en-de-base",
+ "pl" => "en-pl-tiny"
+ },
+ "cs" => %{
+ "en" => "cs-en-base"
+ },
+ "pl" => %{
+ "en" => "pl-en-tiny"
+ }
+ }
+
+ test "it returns languages list" do
+ clear_config([Pleroma.Language.Translation.TranslateLocally, :models], @example_models)
+
+ assert {:ok, languages} = TranslateLocally.supported_languages(:source)
+ assert ["cs", "de", "en", "pl"] = languages |> Enum.sort()
+ end
+
+ describe "it returns languages matrix" do
+ test "without intermediary language" do
+ clear_config([Pleroma.Language.Translation.TranslateLocally, :models], @example_models)
+
+ assert {:ok,
+ %{
+ "cs" => ["en"],
+ "de" => ["en"],
+ "en" => ["de", "pl"],
+ "pl" => ["en"]
+ }} = TranslateLocally.languages_matrix()
+ end
+
+ test "with intermediary language" do
+ clear_config([Pleroma.Language.Translation.TranslateLocally, :models], @example_models)
+ clear_config([Pleroma.Language.Translation.TranslateLocally, :intermediary_language], "en")
+
+ assert {:ok,
+ %{
+ "cs" => ["de", "en", "pl"],
+ "de" => ["en", "pl"],
+ "en" => ["de", "pl"],
+ "pl" => ["de", "en"]
+ }} = TranslateLocally.languages_matrix()
+ end
+ end
+end
diff --git a/test/support/translation_mock.ex b/test/support/translation_mock.ex
index 95da738d10..84ed8f696e 100644
--- a/test/support/translation_mock.ex
+++ b/test/support/translation_mock.ex
@@ -5,6 +5,8 @@
defmodule TranslationMock do
alias Pleroma.Language.Translation.Provider
+ use Provider
+
@behaviour Provider
@name "TranslationMock"