diff --git a/nodes/text/text_utils_LP.py b/nodes/text/text_utils_LP.py index 1905f6c..50ca340 100644 --- a/nodes/text/text_utils_LP.py +++ b/nodes/text/text_utils_LP.py @@ -87,7 +87,7 @@ class TextTranslate: def INPUT_TYPES(s): return {"required": {"text": ("STRING", {"default": "text", "multiline": True})}} RETURN_TYPES = ("STRING",) - RETURN_NAMES = ("text",) + RETURN_NAMES = ("english TEXT",) FUNCTION = "text_translate" CATEGORY = "LevelPixel/Text" @@ -101,6 +101,104 @@ class TextTranslate: except Exception as e: print(f"Translation error: {e}") return (text,) + +class TextTranslateManualAll: + @classmethod + def INPUT_TYPES(s): + source_language_codes = [ + 'auto', 'af', 'am', 'ar', 'az', 'be', 'bg', 'bn', 'bs', 'ca', 'ceb', 'co', + 'cs', 'cy', 'da', 'de', 'el', 'en', 'eo', 'es', 'et', 'eu', 'fa', 'fi', + 'fr', 'fy', 'ga', 'gd', 'gl', 'gu', 'ha', 'haw', 'he', 'hi', 'hmn', 'hr', + 'ht', 'hu', 'hy', 'id', 'ig', 'is', 'it', 'ja', 'jv', 'ka', 'kk', 'km', + 'kn', 'ko', 'ku', 'ky', 'la', 'lb', 'lo', 'lt', 'lv', 'mg', 'mi', 'mk', + 'ml', 'mn', 'mr', 'ms', 'mt', 'my', 'ne', 'nl', 'no', 'ny', 'pa', 'pl', + 'ps', 'pt', 'ro', 'ru', 'rw', 'sd', 'si', 'sk', 'sl', 'sm', 'sn', 'so', + 'sq', 'sr', 'st', 'su', 'sv', 'sw', 'ta', 'te', 'tg', 'th', 'tk', 'tl', 'tr', + 'tt', 'ug', 'uk', 'ur', 'uz', 'vi', 'xh', 'yi', 'yo', 'zh-CN', 'zh-TW', 'zu' + ] + target_language_codes = [code for code in source_language_codes if code != 'auto'] + return { + "required": {"text": ("STRING", {"default": "text", "multiline": True}), + "source_lang": (source_language_codes, {"default":"auto"}), + "target_lang": (target_language_codes, {"default":"en"})}, + } + RETURN_TYPES = ("STRING",) + RETURN_NAMES = ("text",) + FUNCTION = "text_translate_manual_all" + CATEGORY = "LevelPixel/Text" + + def text_translate_manual_all(self, text, source_lang='auto', target_lang='en'): + if text.strip(): + try: + translator = GoogleTranslator(source=source_lang, target=target_lang) + text = translator.translate(text) + except Exception as e: + print(f"Translation error: {e}") + return (text,) + +class TextTranslateManual: + @classmethod + def INPUT_TYPES(s): + source_language_codes = [ + 'auto', + 'English', + 'Русский', + 'Deutsch', + 'Français', + 'Italiano', + 'Polski', + 'Українська', + 'Nederlands', + 'Español', + '简体中文', + '繁體中文', + '日本語', + 'हिन्दी', + 'العربية', + 'Português', + 'বাংলা' + ] + target_language_codes = [code for code in source_language_codes if code != 'auto'] + return { + "required": {"text": ("STRING", {"default": "text", "multiline": True}), + "source_lang": (source_language_codes, {"default":"auto"}), + "target_lang": (target_language_codes, {"default":"English"})}, + } + RETURN_TYPES = ("STRING",) + RETURN_NAMES = ("text",) + FUNCTION = "text_translate_manual" + CATEGORY = "LevelPixel/Text" + + def text_translate_manual(self, text, source_lang='auto', target_lang='English'): + language_name_to_code = { + 'auto': 'auto', + 'English': 'en', + 'Русский': 'ru', + 'Deutsch': 'de', + 'Français': 'fr', + 'Italiano': 'it', + 'Polski': 'pl', + 'Українська': 'uk', + 'Nederlands': 'nl', + 'Español': 'es', + '简体中文': 'zh-CN', + '繁體中文': 'zh-TW', + '日本語': 'ja', + 'हिन्दी': 'hi', + 'العربية': 'ar', + 'Português': 'pt', + 'বাংলা': 'bn', + } + + if text.strip(): + try: + source_lang_code = language_name_to_code.get(source_lang) + target_lang_code = language_name_to_code.get(target_lang) + translator = GoogleTranslator(source=source_lang_code, target=target_lang_code) + text = translator.translate(text) + except Exception as e: + print(f"Translation error: {e}") + return (text,) class TextToList: def __init__(self): @@ -312,6 +410,8 @@ NODE_CLASS_MAPPINGS = { "TextChoiceParser|LP": TextChoiceParser, "CLIPTextEncodeTranslate|LP": CLIPTextEncodeTranslate, "TextTranslate|LP": TextTranslate, + "TextTranslateManualAll|LP": TextTranslateManualAll, + "TextTranslateManual|LP": TextTranslateManual, "TextToList|LP": TextToList, "SplitCompoundText|LP": SplitCompoundText, "KeepOnlyEnglishWords|LP": KeepOnlyEnglishWords, @@ -322,6 +422,8 @@ NODE_DISPLAY_NAME_MAPPINGS = { "TextChoiceParser|LP": "Text Choice Parser [LP]", "CLIPTextEncodeTranslate|LP": "CLIP Text Encode Translate [LP]", "TextTranslate|LP": "Text Translate [LP]", + "TextTranslateManualAll|LP": "Text Translate Manual (All langs) [LP]", + "TextTranslateManual|LP": "Text Translate Manual [LP]", "TextToList|LP": "Text To List [LP]", "SplitCompoundText|LP": "Split Compound Text [LP]", "KeepOnlyEnglishWords|LP": "Keep Only English Words [LP]", diff --git a/pyproject.toml b/pyproject.toml index 1f63449..fedd6e4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "comfyui-levelpixel" -description = "Main nodes of the Level Pixel company (aka levelpixel, LP). Includes convenient nodes for working with images from folders; counting files in a folder; cleaning memory; tag filters. Model Unloader, LLM Unloader, Free memory, Tag Filters, Tag Category Filters, Tag Choice Parser, File counter, Image Loader From Path (with counters), Image Remove Background based on RemBG." +description = "Main nodes of the Level Pixel company (aka levelpixel, LP). Includes convenient nodes for working with images from folders; counting files in a folder; cleaning memory; tag filters. Model Unloader, Free memory, Tag Filters, Tag Category Filters, Tag Choice Parser, File counter, Image Loader From Path (with counters), Image Remove Background based on RemBG, Google Translator, Language Translator, Override Device, Delay, Lora Tag Loader." version = "1.2.1" license = { file = "LICENSE" } dependencies = ["torch>=2.0.1", "torchvision>=0.15.2", "pillow>=9.4.0", "numpy", "matplotlib", "scikit-build-core>=0.10.7", "rembg>=2.0.59", "onnxruntime-gpu>=1.20.0", "onnxruntime>=1.20.0", "googletrans", "langdetect", "httpcore", "deep_translator"]