Translate: parse language directives included in the text
This commit is contained in:
+42
-10
@@ -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,]+)")
|
||||
|
||||
Reference in New Issue
Block a user