Translate: parse language directives included in the text

This commit is contained in:
Acly
2024-07-24 12:00:07 +02:00
parent f42c0f29b6
commit df54344077
+42 -10
View File
@@ -1,7 +1,14 @@
"""Text translation using Argos Translate."""
"""Text translation using Argos Translate.
The node takes text input and translates it to English. The text may contain any
number of language directives in the form `lang:xx` where `xx` is a two-letter
language code. Text fragments after a language directives are translated.
If the language is `en` text is passed through unmodified.
"""
import re
from functools import cache
from typing import NamedTuple
@cache
@@ -51,20 +58,45 @@ def translate(text: str, language: str):
class Translate:
@staticmethod
def INPUT_TYPES():
return {
"required": {
"text": ("STRING", {"multiline": True}),
"language": ([code for code, _ in available_languages()],),
"target": (["en"],),
}
}
return {"required": {"text": ("STRING", {"multiline": True})}}
CATEGORY = "external_tooling"
RETURN_TYPES = ("STRING",)
FUNCTION = "translate"
def translate(self, text: str, language: str, target: str):
return (translate(text, language),)
def translate(self, text: str):
chunks = Chunk.parse(text)
print(chunks)
translated = " ".join(translate(c.text, c.lang) for c in chunks)
return (translated,)
_lang_regex = re.compile(r"(lang:\w\w)")
class Chunk(NamedTuple):
text: str
lang: str
@staticmethod
def parse(text: str):
languages = [code for code, name in available_languages()] + ["en"]
chunks: list[Chunk] = []
lang = "en"
last = 0
for m in _lang_regex.finditer(text):
if m.start() > 0:
chunks.append(Chunk(text[last : m.start()].strip(), lang))
last = m.end()
lang = m.group(0)[5:]
if lang not in languages:
raise ValueError(
f"Invalid language directive {m.group(0)} - {lang} is not a known language code."
f" Available languages: {', '.join(languages)}"
)
if last < len(text):
chunks.append(Chunk(text[last:].strip(), lang))
return [c for c in chunks if c.text != ""]
_embedding_regex = re.compile(r"(embedding:[^\s,]+)")