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"