Add translation module for Argos Translate #351
4 changed files with 73 additions and 8 deletions
|
@ -885,7 +885,8 @@
|
||||||
config :pleroma, :argos_translate,
|
config :pleroma, :argos_translate,
|
||||||
command_argos_translate: "argos-translate",
|
command_argos_translate: "argos-translate",
|
||||||
command_argospm: "argospm",
|
command_argospm: "argospm",
|
||||||
default_language: "en"
|
fallback_language: "en",
|
||||||
|
strip_html: true
|
||||||
|
|
||||||
# Import environment specific config. This must remain at the bottom
|
# Import environment specific config. This must remain at the bottom
|
||||||
# of this file so it overrides the configuration defined above.
|
# of this file so it overrides the configuration defined above.
|
||||||
|
|
|
@ -1143,6 +1143,9 @@ Translations are available at `/api/v1/statuses/:id/translations/:language`, whe
|
||||||
|
|
||||||
### `:argos_translate`
|
### `:argos_translate`
|
||||||
|
|
||||||
|
[Argos Translate](https://github.com/argosopentech/argos-translate) is the library used by Libre Translate and can run as a command line tool. It's more basic than Libre Translate as it doesn't provide a way to properly handle html or language detection.
|
||||||
|
|
||||||
- `:command_argos_translate` - command for `argos-translate`. Can be the command if it's in your PATH, or the full path to the file (default: `argos-translate`).
|
- `:command_argos_translate` - command for `argos-translate`. Can be the command if it's in your PATH, or the full path to the file (default: `argos-translate`).
|
||||||
- `:command_argospm` - command for `argospm`. Can be the command if it's in your PATH, or the full path to the file (default: `argospm`).
|
- `:command_argospm` - command for `argospm`. Can be the command if it's in your PATH, or the full path to the file (default: `argospm`).
|
||||||
- `:default_language` - When no language is provided to translate from, this language will be used. Must be a two letter langage code from a language you have installed (default: `en`).
|
- `:fallback_language` - When no language is provided to translate from, this language will be used. Must be a two letter langage code from a language you have installed (default: `en`).
|
||||||
|
- `:strip_html` - Strip html from the post before translating the text (default: `true`).
|
||||||
|
|
|
@ -11,8 +11,8 @@ defp argospm do
|
||||||
Config.get([:argos_translate, :command_argospm])
|
Config.get([:argos_translate, :command_argospm])
|
||||||
end
|
end
|
||||||
|
|
||||||
defp default_language do
|
defp fallback_language do
|
||||||
Config.get([:argos_translate, :default_language])
|
Config.get([:argos_translate, :fallback_language])
|
||||||
end
|
end
|
||||||
|
|
||||||
defp safe_languages() do
|
defp safe_languages() do
|
||||||
|
@ -63,19 +63,45 @@ defp safe_translate(string, from_language, to_language) do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp clean_string(string, true) do
|
||||||
|
string
|
||||||
|
|> String.replace("<p>", "\n")
|
||||||
|
|> String.replace("</p>", "\n")
|
||||||
|
|> String.replace("<br>", "\n")
|
||||||
|
|> String.replace("<br/>", "\n")
|
||||||
|
|> String.replace("<li>", "\n")
|
||||||
|
|> Pleroma.HTML.strip_tags()
|
||||||
|
|> HtmlEntities.decode()
|
||||||
|
end
|
||||||
|
|
||||||
|
defp clean_string(string, _), do: string
|
||||||
|
|
||||||
|
defp htmlify_response(string, true) do
|
||||||
|
string
|
||||||
|
|> HtmlEntities.encode()
|
||||||
|
|> String.replace("\n", "<br/>")
|
||||||
|
end
|
||||||
|
|
||||||
|
defp htmlify_response(string, _), do: string
|
||||||
|
|
||||||
@impl Pleroma.Akkoma.Translator
|
@impl Pleroma.Akkoma.Translator
|
||||||
def translate(string, from_language, to_language) do
|
def translate(string, from_language, to_language) do
|
||||||
|
strip_html = Config.get([:argos_translate, :strip_html])
|
||||||
# Akkoma's Pleroma-fe expects us to detect the source language automatically.
|
# Akkoma's Pleroma-fe expects us to detect the source language automatically.
|
||||||
# Argos-translate doesn't have that option (yet?)
|
# Argos-translate doesn't have that option (yet?)
|
||||||
# see <https://github.com/argosopentech/argos-translate/issues/9>
|
# see <https://github.com/argosopentech/argos-translate/issues/9>
|
||||||
# For now we choose a default source language from settings.
|
# For now we choose a fallback source language from settings.
|
||||||
# Afterwards people get the option to overwrite the source language from a dropdown.
|
# Afterwards people get the option to overwrite the source language from a dropdown.
|
||||||
from_language = from_language || default_language()
|
from_language = from_language || fallback_language()
|
||||||
to_language = to_language || default_language()
|
to_language = to_language || fallback_language()
|
||||||
|
# Argos Translate doesn't properly translate HTML (yet?)
|
||||||
|
# For now we give admins the option to strip the html before translating
|
||||||
|
# Note that we have to add some html back to the response afterwards
|
||||||
|
string = clean_string(string, strip_html)
|
||||||
|
|
||||||
with {translated, 0} <-
|
with {translated, 0} <-
|
||||||
safe_translate(string, from_language, to_language) do
|
safe_translate(string, from_language, to_language) do
|
||||||
{:ok, from_language, translated}
|
{:ok, from_language, translated |> htmlify_response(strip_html)}
|
||||||
else
|
else
|
||||||
{response, _} -> {:error, "ArgosTranslate failed to translate (#{response})"}
|
{response, _} -> {:error, "ArgosTranslate failed to translate (#{response})"}
|
||||||
end
|
end
|
||||||
|
|
|
@ -63,4 +63,39 @@ test "it returns a proper error when the executable can't be found" do
|
||||||
assert {:error, "ArgosTranslate failed to translate" <> _} =
|
assert {:error, "ArgosTranslate failed to translate" <> _} =
|
||||||
ArgosTranslate.translate("blabla", "nl", "en")
|
ArgosTranslate.translate("blabla", "nl", "en")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "it can strip html" do
|
||||||
|
content =
|
||||||
|
~s[<p>What's up my fellow fedizens?</p><p>So anyway</p><ul><li><a class="hashtag" data-tag="cofe" href="https://suya.space/tag/cofe">#cofe</a></li><li><a class="hashtag" data-tag="suya" href="https://cofe.space/tag/suya">#Suya</a></li></ul><p>ammiright!<br/>:ablobfoxhyper:</p>]
|
||||||
|
|
||||||
|
stripped_content =
|
||||||
|
"\nWhat's up my fellow fedizens?\n\nSo anyway\n\n#cofe\n#Suya\nammiright!\n:ablobfoxhyper:\n"
|
||||||
|
|
||||||
|
expected_response_strip_html =
|
||||||
|
"<br/>What's up my fellow fedizens?<br/><br/>So anyway<br/><br/>#cofe<br/>#Suya<br/>ammiright!<br/>:ablobfoxhyper:<br/>"
|
||||||
|
|
||||||
|
response_strip_html =
|
||||||
|
with_mock System, [:passthrough],
|
||||||
|
cmd: fn "argos-translate_test",
|
||||||
|
["--from-lang", _, "--to-lang", _, ^stripped_content],
|
||||||
|
_ ->
|
||||||
|
{stripped_content, 0}
|
||||||
|
end do
|
||||||
|
ArgosTranslate.translate(content, "nl", "en")
|
||||||
|
end
|
||||||
|
|
||||||
|
clear_config([:argos_translate, :strip_html], false)
|
||||||
|
|
||||||
|
response_no_strip_html =
|
||||||
|
with_mock System, [:passthrough],
|
||||||
|
cmd: fn "argos-translate_test", ["--from-lang", _, "--to-lang", _, string], _ ->
|
||||||
|
{string, 0}
|
||||||
|
end do
|
||||||
|
ArgosTranslate.translate(content, "nl", "en")
|
||||||
|
end
|
||||||
|
|
||||||
|
assert {:ok, "nl", content} == response_no_strip_html
|
||||||
|
|
||||||
|
assert {:ok, "nl", expected_response_strip_html} == response_strip_html
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue