diff --git a/browser_tests/rightClickMenu.spec.ts-snapshots/right-click-node-group-node-chromium-2x-linux.png b/browser_tests/rightClickMenu.spec.ts-snapshots/right-click-node-group-node-chromium-2x-linux.png index b8fdc4567..72e1184a7 100644 Binary files a/browser_tests/rightClickMenu.spec.ts-snapshots/right-click-node-group-node-chromium-2x-linux.png and b/browser_tests/rightClickMenu.spec.ts-snapshots/right-click-node-group-node-chromium-2x-linux.png differ diff --git a/browser_tests/rightClickMenu.spec.ts-snapshots/right-click-node-group-node-chromium-linux.png b/browser_tests/rightClickMenu.spec.ts-snapshots/right-click-node-group-node-chromium-linux.png index 51cc58290..470bd5f32 100644 Binary files a/browser_tests/rightClickMenu.spec.ts-snapshots/right-click-node-group-node-chromium-linux.png and b/browser_tests/rightClickMenu.spec.ts-snapshots/right-click-node-group-node-chromium-linux.png differ diff --git a/scripts/collect-i18n.ts b/scripts/collect-i18n.ts index 9473a7c2f..59bdf71bd 100644 --- a/scripts/collect-i18n.ts +++ b/scripts/collect-i18n.ts @@ -3,10 +3,10 @@ import { comfyPageFixture as test } from '../browser_tests/fixtures/ComfyPage' import { CORE_MENU_COMMANDS } from '../src/constants/coreMenuCommands' import { SERVER_CONFIG_ITEMS } from '../src/constants/serverConfig' import { formatCamelCase, normalizeI18nKey } from '../src/utils/formatUtil' +import { ComfyNodeDefImpl } from '../src/stores/nodeDefStore' import type { ComfyCommandImpl } from '../src/stores/commandStore' import type { FormItem, SettingParams } from '../src/types/settingTypes' import type { ComfyApi } from '../src/scripts/api' -import type { ComfyNodeDef } from '../src/types/apiTypes' const localePath = './src/locales/en.json' const extractMenuCommandLocaleStrings = (): Set => { @@ -111,58 +111,107 @@ test('collect-i18n', async ({ comfyPage }) => { ) // Node Definitions - const nodeDefs = (await comfyPage.page.evaluate(async () => { - const api = window['app'].api as ComfyApi - return await api.getNodeDefs() - })) as Record + const nodeDefs: ComfyNodeDefImpl[] = Object.values( + await comfyPage.page.evaluate(async () => { + const api = window['app'].api as ComfyApi + return await api.getNodeDefs() + }) + ).map((def) => new ComfyNodeDefImpl(def)) + + console.log(`Collected ${nodeDefs.length} node definitions`) + + const allDataTypesLocale = Object.fromEntries( + nodeDefs + .flatMap((nodeDef) => { + const inputDataTypes = Object.values(nodeDef.inputs.all).map( + (inputSpec) => inputSpec.type + ) + const outputDataTypes = nodeDef.outputs.all.map((output) => output.type) + const allDataTypes = [...inputDataTypes, ...outputDataTypes].flatMap( + (type: string) => type.split(',') + ) + return allDataTypes.map((dataType) => [ + normalizeI18nKey(dataType), + dataType + ]) + }) + .sort((a, b) => a[0].localeCompare(b[0])) + ) + + function extractInputs(nodeDef: ComfyNodeDefImpl) { + const inputs = Object.fromEntries( + nodeDef.inputs.all.flatMap((input) => { + // TODO(huchenlei): translate input name. Somehow `CLIPAttentionMultiply` will + // cause all subsequent translations to fail (Raw english values + // are generated). + const name = undefined + const tooltip = input.tooltip + + if (name === undefined && tooltip === undefined) { + return [] + } + + return [ + [ + normalizeI18nKey(input.name), + { + name, + tooltip + } + ] + ] + }) + ) + return Object.keys(inputs).length > 0 ? inputs : undefined + } + + function extractOutputs(nodeDef: ComfyNodeDefImpl) { + const outputs = Object.fromEntries( + nodeDef.outputs.all.flatMap((output, i) => { + // Ignore data types if they are already translated in allDataTypesLocale. + const name = output.name in allDataTypesLocale ? undefined : output.name + const tooltip = output.tooltip + + if (name === undefined && tooltip === undefined) { + return [] + } + + return [ + [ + i.toString(), + { + name, + tooltip + } + ] + ] + }) + ) + return Object.keys(outputs).length > 0 ? outputs : undefined + } const allNodeDefsLocale = Object.fromEntries( - Object.values(nodeDefs) + nodeDefs .sort((a, b) => a.name.localeCompare(b.name)) .map((nodeDef) => [ normalizeI18nKey(nodeDef.name), { display_name: nodeDef.display_name ?? nodeDef.name, - description: nodeDef.description || undefined + description: nodeDef.description || undefined, + inputs: extractInputs(nodeDef), + outputs: extractOutputs(nodeDef) } ]) ) const allNodeCategoriesLocale = Object.fromEntries( - Object.values(nodeDefs).flatMap((nodeDef) => + nodeDefs.flatMap((nodeDef) => nodeDef.category .split('/') .map((category) => [normalizeI18nKey(category), category]) ) ) - const allDataTypesLocale = Object.fromEntries( - Object.values(nodeDefs).flatMap((nodeDef) => { - const inputs = nodeDef.input ?? {} - const requiredInputs = inputs.required ?? {} - const optionalInputs = inputs.optional ?? {} - const allInputs = { - ...requiredInputs, - ...optionalInputs - } - - const inputDataTypes = Object.values(allInputs).map((inputSpec) => { - const typeRaw = inputSpec[0] - const type = Array.isArray(typeRaw) ? 'COMBO' : typeRaw - return type - }) - const outputDataTypes = nodeDef.output ?? [] - const allDataTypes = [...inputDataTypes, ...outputDataTypes].flatMap( - (type: string) => type.split(',') - ) - - return allDataTypes.map((dataType) => [ - normalizeI18nKey(dataType), - dataType - ]) - }) - ) - fs.writeFileSync( localePath, JSON.stringify( diff --git a/src/components/graph/NodeTooltip.vue b/src/components/graph/NodeTooltip.vue index a3e514a5b..e4db043f3 100644 --- a/src/components/graph/NodeTooltip.vue +++ b/src/components/graph/NodeTooltip.vue @@ -15,6 +15,8 @@ import { LiteGraph } from '@comfyorg/litegraph' import { app as comfyApp } from '@/scripts/app' import { useNodeDefStore } from '@/stores/nodeDefStore' import { useEventListener } from '@vueuse/core' +import { st } from '@/i18n' +import { normalizeI18nKey } from '@/utils/formatUtil' let idleTimeout: number const nodeDefStore = useNodeDefStore() @@ -69,7 +71,11 @@ const onIdle = () => { ) if (inputSlot !== -1) { const inputName = node.inputs[inputSlot].name - return showTooltip(nodeDef.inputs.getInput(inputName)?.tooltip) + const translatedTooltip = st( + `nodeDefs.${normalizeI18nKey(node.type)}.inputs.${normalizeI18nKey(inputName)}.tooltip`, + nodeDef.inputs.getInput(inputName)?.tooltip + ) + return showTooltip(translatedTooltip) } const outputSlot = canvas.isOverNodeOutput( @@ -79,15 +85,22 @@ const onIdle = () => { [0, 0] ) if (outputSlot !== -1) { - return showTooltip(nodeDef.outputs.all?.[outputSlot]?.tooltip) + const translatedTooltip = st( + `nodeDefs.${normalizeI18nKey(node.type)}.outputs.${outputSlot}.tooltip`, + nodeDef.outputs.all?.[outputSlot]?.tooltip + ) + return showTooltip(translatedTooltip) } const widget = comfyApp.canvas.getWidgetAtCursor() // Dont show for DOM widgets, these use native browser tooltips as we dont get proper mouse events on these if (widget && !widget.element) { - return showTooltip( - widget.tooltip ?? nodeDef.inputs.getInput(widget.name)?.tooltip + const translatedTooltip = st( + `nodeDefs.${normalizeI18nKey(node.type)}.inputs.${normalizeI18nKey(widget.name)}.tooltip`, + nodeDef.inputs.getInput(widget.name)?.tooltip ) + // Widget tooltip can be set dynamically, current translation collection does not support this. + return showTooltip(widget.tooltip ?? translatedTooltip) } } diff --git a/src/locales/en.json b/src/locales/en.json index f9f0108bf..7d6a8d679 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -874,7 +874,23 @@ }, "CheckpointLoaderSimple": { "display_name": "Load Checkpoint", - "description": "Loads a diffusion model checkpoint, diffusion models are used to denoise latents." + "description": "Loads a diffusion model checkpoint, diffusion models are used to denoise latents.", + "inputs": { + "ckpt_name": { + "tooltip": "The name of the checkpoint (model) to load." + } + }, + "outputs": { + "0": { + "tooltip": "The model used for denoising latents." + }, + "1": { + "tooltip": "The CLIP model used for encoding text prompts." + }, + "2": { + "tooltip": "The VAE model used for encoding and decoding images to and from latent space." + } + } }, "CheckpointSave": { "display_name": "Save Checkpoint" @@ -903,7 +919,20 @@ }, "CLIPTextEncode": { "display_name": "CLIP Text Encode (Prompt)", - "description": "Encodes a text prompt using a CLIP model into an embedding that can be used to guide the diffusion model towards generating specific images." + "description": "Encodes a text prompt using a CLIP model into an embedding that can be used to guide the diffusion model towards generating specific images.", + "inputs": { + "text": { + "tooltip": "The text to be encoded." + }, + "clip": { + "tooltip": "The CLIP model used for encoding the text." + } + }, + "outputs": { + "0": { + "tooltip": "A conditioning containing the embedded text used to guide the diffusion model." + } + } }, "CLIPTextEncodeControlnet": { "display_name": "CLIPTextEncodeControlnet" @@ -972,7 +1001,15 @@ "display_name": "ConditioningSetTimestepRange" }, "ConditioningTimestepsRange": { - "display_name": "Timesteps Range" + "display_name": "Timesteps Range", + "outputs": { + "1": { + "name": "BEFORE_RANGE" + }, + "2": { + "name": "AFTER_RANGE" + } + } }, "ConditioningZeroOut": { "display_name": "ConditioningZeroOut" @@ -981,25 +1018,64 @@ "display_name": "Apply ControlNet (OLD)" }, "ControlNetApplyAdvanced": { - "display_name": "Apply ControlNet" + "display_name": "Apply ControlNet", + "outputs": { + "0": { + "name": "positive" + }, + "1": { + "name": "negative" + } + } }, "ControlNetApplySD3": { - "display_name": "Apply Controlnet with VAE" + "display_name": "Apply Controlnet with VAE", + "outputs": { + "0": { + "name": "positive" + }, + "1": { + "name": "negative" + } + } }, "ControlNetInpaintingAliMamaApply": { - "display_name": "ControlNetInpaintingAliMamaApply" + "display_name": "ControlNetInpaintingAliMamaApply", + "outputs": { + "0": { + "name": "positive" + }, + "1": { + "name": "negative" + } + } }, "ControlNetLoader": { "display_name": "Load ControlNet Model" }, "CreateHookKeyframe": { - "display_name": "Create Hook Keyframe" + "display_name": "Create Hook Keyframe", + "outputs": { + "0": { + "name": "HOOK_KF" + } + } }, "CreateHookKeyframesFromFloats": { - "display_name": "Create Hook Keyframes From Floats" + "display_name": "Create Hook Keyframes From Floats", + "outputs": { + "0": { + "name": "HOOK_KF" + } + } }, "CreateHookKeyframesInterpolated": { - "display_name": "Create Hook Keyframes Interp." + "display_name": "Create Hook Keyframes Interp.", + "outputs": { + "0": { + "name": "HOOK_KF" + } + } }, "CreateHookLora": { "display_name": "Create Hook LoRA" @@ -1050,7 +1126,15 @@ }, "DevToolsNodeWithOutputList": { "display_name": "Node With Output List", - "description": "A node with an output list" + "description": "A node with an output list", + "outputs": { + "0": { + "name": "INTEGER OUTPUT" + }, + "1": { + "name": "INTEGER LIST OUTPUT" + } + } }, "DevToolsNodeWithStringInput": { "display_name": "Node With String Input", @@ -1083,11 +1167,32 @@ "display_name": "EmptyImage" }, "EmptyLatentAudio": { - "display_name": "EmptyLatentAudio" + "display_name": "EmptyLatentAudio", + "inputs": { + "batch_size": { + "tooltip": "The number of latent images in the batch." + } + } }, "EmptyLatentImage": { "display_name": "Empty Latent Image", - "description": "Create a new batch of empty latent images to be denoised via sampling." + "description": "Create a new batch of empty latent images to be denoised via sampling.", + "inputs": { + "width": { + "tooltip": "The width of the latent images in pixels." + }, + "height": { + "tooltip": "The height of the latent images in pixels." + }, + "batch_size": { + "tooltip": "The number of latent images in the batch." + } + }, + "outputs": { + "0": { + "tooltip": "The empty latent image batch." + } + } }, "EmptyLTXVLatentVideo": { "display_name": "EmptyLTXVLatentVideo" @@ -1189,10 +1294,37 @@ "display_name": "Upscale Image (using Model)" }, "InpaintModelConditioning": { - "display_name": "InpaintModelConditioning" + "display_name": "InpaintModelConditioning", + "inputs": { + "noise_mask": { + "tooltip": "Add a noise mask to the latent so sampling will only happen within the mask. Might improve results or completely break things depending on the model." + } + }, + "outputs": { + "0": { + "name": "positive" + }, + "1": { + "name": "negative" + }, + "2": { + "name": "latent" + } + } }, "InstructPixToPixConditioning": { - "display_name": "InstructPixToPixConditioning" + "display_name": "InstructPixToPixConditioning", + "outputs": { + "0": { + "name": "positive" + }, + "1": { + "name": "negative" + }, + "2": { + "name": "latent" + } + } }, "InvertMask": { "display_name": "InvertMask" @@ -1205,7 +1337,44 @@ }, "KSampler": { "display_name": "KSampler", - "description": "Uses the provided model, positive and negative conditioning to denoise the latent image." + "description": "Uses the provided model, positive and negative conditioning to denoise the latent image.", + "inputs": { + "model": { + "tooltip": "The model used for denoising the input latent." + }, + "seed": { + "tooltip": "The random seed used for creating the noise." + }, + "steps": { + "tooltip": "The number of steps used in the denoising process." + }, + "cfg": { + "tooltip": "The Classifier-Free Guidance scale balances creativity and adherence to the prompt. Higher values result in images more closely matching the prompt however too high values will negatively impact quality." + }, + "sampler_name": { + "tooltip": "The algorithm used when sampling, this can affect the quality, speed, and style of the generated output." + }, + "scheduler": { + "tooltip": "The scheduler controls how noise is gradually removed to form the image." + }, + "positive": { + "tooltip": "The conditioning describing the attributes you want to include in the image." + }, + "negative": { + "tooltip": "The conditioning describing the attributes you want to exclude from the image." + }, + "latent_image": { + "tooltip": "The latent image to denoise." + }, + "denoise": { + "tooltip": "The amount of denoising applied, lower values will maintain the structure of the initial image allowing for image to image sampling." + } + }, + "outputs": { + "0": { + "tooltip": "The denoised latent." + } + } }, "KSamplerAdvanced": { "display_name": "KSampler (Advanced)" @@ -1287,23 +1456,93 @@ }, "LoraLoader": { "display_name": "Load LoRA", - "description": "LoRAs are used to modify diffusion and CLIP models, altering the way in which latents are denoised such as applying styles. Multiple LoRA nodes can be linked together." + "description": "LoRAs are used to modify diffusion and CLIP models, altering the way in which latents are denoised such as applying styles. Multiple LoRA nodes can be linked together.", + "inputs": { + "model": { + "tooltip": "The diffusion model the LoRA will be applied to." + }, + "clip": { + "tooltip": "The CLIP model the LoRA will be applied to." + }, + "lora_name": { + "tooltip": "The name of the LoRA." + }, + "strength_model": { + "tooltip": "How strongly to modify the diffusion model. This value can be negative." + }, + "strength_clip": { + "tooltip": "How strongly to modify the CLIP model. This value can be negative." + } + }, + "outputs": { + "0": { + "tooltip": "The modified diffusion model." + }, + "1": { + "tooltip": "The modified CLIP model." + } + } }, "LoraLoaderModelOnly": { "display_name": "LoraLoaderModelOnly", - "description": "LoRAs are used to modify diffusion and CLIP models, altering the way in which latents are denoised such as applying styles. Multiple LoRA nodes can be linked together." + "description": "LoRAs are used to modify diffusion and CLIP models, altering the way in which latents are denoised such as applying styles. Multiple LoRA nodes can be linked together.", + "outputs": { + "0": { + "tooltip": "The modified diffusion model." + } + } }, "LoraSave": { - "display_name": "Extract and Save Lora" + "display_name": "Extract and Save Lora", + "inputs": { + "model_diff": { + "tooltip": "The ModelSubtract output to be converted to a lora." + }, + "text_encoder_diff": { + "tooltip": "The CLIPSubtract output to be converted to a lora." + } + } }, "LTXVConditioning": { - "display_name": "LTXVConditioning" + "display_name": "LTXVConditioning", + "outputs": { + "0": { + "name": "positive" + }, + "1": { + "name": "negative" + } + } }, "LTXVImgToVideo": { - "display_name": "LTXVImgToVideo" + "display_name": "LTXVImgToVideo", + "inputs": { + "image_noise_scale": { + "tooltip": "Amount of noise to apply on conditioning image latent." + } + }, + "outputs": { + "0": { + "name": "positive" + }, + "1": { + "name": "negative" + }, + "2": { + "name": "latent" + } + } }, "LTXVScheduler": { - "display_name": "LTXVScheduler" + "display_name": "LTXVScheduler", + "inputs": { + "stretch": { + "tooltip": "Stretch the sigmas to be in the range [terminal, 1]." + }, + "terminal": { + "tooltip": "The terminal value of the sigmas after stretching." + } + } }, "MaskComposite": { "display_name": "MaskComposite" @@ -1381,16 +1620,48 @@ "display_name": "ImageMorphology" }, "PairConditioningCombine": { - "display_name": "Cond Pair Combine" + "display_name": "Cond Pair Combine", + "outputs": { + "0": { + "name": "positive" + }, + "1": { + "name": "negative" + } + } }, "PairConditioningSetDefaultCombine": { - "display_name": "Cond Pair Set Default Combine" + "display_name": "Cond Pair Set Default Combine", + "outputs": { + "0": { + "name": "positive" + }, + "1": { + "name": "negative" + } + } }, "PairConditioningSetProperties": { - "display_name": "Cond Pair Set Props" + "display_name": "Cond Pair Set Props", + "outputs": { + "0": { + "name": "positive" + }, + "1": { + "name": "negative" + } + } }, "PairConditioningSetPropertiesAndCombine": { - "display_name": "Cond Pair Set Props Combine" + "display_name": "Cond Pair Set Props Combine", + "outputs": { + "0": { + "name": "positive" + }, + "1": { + "name": "negative" + } + } }, "PatchModelAddDownscale": { "display_name": "PatchModelAddDownscale (Kohya Deep Shrink)" @@ -1442,10 +1713,26 @@ "display_name": "RescaleCFG" }, "SamplerCustom": { - "display_name": "SamplerCustom" + "display_name": "SamplerCustom", + "outputs": { + "0": { + "name": "output" + }, + "1": { + "name": "denoised_output" + } + } }, "SamplerCustomAdvanced": { - "display_name": "SamplerCustomAdvanced" + "display_name": "SamplerCustomAdvanced", + "outputs": { + "0": { + "name": "output" + }, + "1": { + "name": "denoised_output" + } + } }, "SamplerDPMAdaptative": { "display_name": "SamplerDPMAdaptative" @@ -1488,7 +1775,15 @@ }, "SaveImage": { "display_name": "Save Image", - "description": "Saves the input images to your ComfyUI output directory." + "description": "Saves the input images to your ComfyUI output directory.", + "inputs": { + "images": { + "tooltip": "The images to save." + }, + "filename_prefix": { + "tooltip": "The prefix for the file to save. This may include formatting information such as %date:yyyy-MM-dd% or %Empty Latent Image.width% to include values from nodes." + } + } }, "SaveImageWebsocket": { "display_name": "SaveImageWebsocket" @@ -1497,7 +1792,18 @@ "display_name": "SaveLatent" }, "SD_4XUpscale_Conditioning": { - "display_name": "SD_4XUpscale_Conditioning" + "display_name": "SD_4XUpscale_Conditioning", + "outputs": { + "0": { + "name": "positive" + }, + "1": { + "name": "negative" + }, + "2": { + "name": "latent" + } + } }, "SDTurboScheduler": { "display_name": "SDTurboScheduler" @@ -1532,28 +1838,93 @@ "display_name": "Split Image with Alpha" }, "SplitSigmas": { - "display_name": "SplitSigmas" + "display_name": "SplitSigmas", + "outputs": { + "0": { + "name": "high_sigmas" + }, + "1": { + "name": "low_sigmas" + } + } }, "SplitSigmasDenoise": { - "display_name": "SplitSigmasDenoise" + "display_name": "SplitSigmasDenoise", + "outputs": { + "0": { + "name": "high_sigmas" + }, + "1": { + "name": "low_sigmas" + } + } }, "StableCascade_EmptyLatentImage": { - "display_name": "StableCascade_EmptyLatentImage" + "display_name": "StableCascade_EmptyLatentImage", + "outputs": { + "0": { + "name": "stage_c" + }, + "1": { + "name": "stage_b" + } + } }, "StableCascade_StageB_Conditioning": { "display_name": "StableCascade_StageB_Conditioning" }, "StableCascade_StageC_VAEEncode": { - "display_name": "StableCascade_StageC_VAEEncode" + "display_name": "StableCascade_StageC_VAEEncode", + "outputs": { + "0": { + "name": "stage_c" + }, + "1": { + "name": "stage_b" + } + } }, "StableCascade_SuperResolutionControlnet": { - "display_name": "StableCascade_SuperResolutionControlnet" + "display_name": "StableCascade_SuperResolutionControlnet", + "outputs": { + "0": { + "name": "controlnet_input" + }, + "1": { + "name": "stage_c" + }, + "2": { + "name": "stage_b" + } + } }, "StableZero123_Conditioning": { - "display_name": "StableZero123_Conditioning" + "display_name": "StableZero123_Conditioning", + "outputs": { + "0": { + "name": "positive" + }, + "1": { + "name": "negative" + }, + "2": { + "name": "latent" + } + } }, "StableZero123_Conditioning_Batched": { - "display_name": "StableZero123_Conditioning_Batched" + "display_name": "StableZero123_Conditioning_Batched", + "outputs": { + "0": { + "name": "positive" + }, + "1": { + "name": "negative" + }, + "2": { + "name": "latent" + } + } }, "StyleModelApply": { "display_name": "Apply Style Model" @@ -1562,10 +1933,32 @@ "display_name": "Load Style Model" }, "SV3D_Conditioning": { - "display_name": "SV3D_Conditioning" + "display_name": "SV3D_Conditioning", + "outputs": { + "0": { + "name": "positive" + }, + "1": { + "name": "negative" + }, + "2": { + "name": "latent" + } + } }, "SVD_img2vid_Conditioning": { - "display_name": "SVD_img2vid_Conditioning" + "display_name": "SVD_img2vid_Conditioning", + "outputs": { + "0": { + "name": "positive" + }, + "1": { + "name": "negative" + }, + "2": { + "name": "latent" + } + } }, "ThresholdMask": { "display_name": "ThresholdMask" @@ -1603,7 +1996,20 @@ }, "VAEDecode": { "display_name": "VAE Decode", - "description": "Decodes latent images back into pixel space images." + "description": "Decodes latent images back into pixel space images.", + "inputs": { + "samples": { + "tooltip": "The latent to be decoded." + }, + "vae": { + "tooltip": "The VAE model used for decoding the latent." + } + }, + "outputs": { + "0": { + "tooltip": "The decoded image." + } + } }, "VAEDecodeAudio": { "display_name": "VAEDecodeAudio" @@ -1643,91 +2049,91 @@ } }, "nodeCategories": { + "_for_testing": "_for_testing", + "custom_sampling": "custom_sampling", + "noise": "noise", "sampling": "sampling", - "loaders": "loaders", - "conditioning": "conditioning", - "latent": "latent", - "inpaint": "inpaint", - "batch": "batch", + "schedulers": "schedulers", + "guiders": "guiders", "image": "image", - "mask": "mask", - "upscaling": "upscaling", - "_for_testing": "_for_testing", - "transform": "transform", + "preprocessors": "preprocessors", "advanced": "advanced", - "style_model": "style_model", + "loaders": "loaders", + "model_merging": "model_merging", + "attention_experiments": "attention_experiments", + "conditioning": "conditioning", + "flux": "flux", + "hooks": "hooks", + "combine": "combine", + "cond single": "cond single", "controlnet": "controlnet", - "gligen": "gligen", + "scheduling": "scheduling", + "create": "create", + "mask": "mask", + "DevTools": "DevTools", "deprecated": "deprecated", - "operations": "operations", - "postprocessing": "postprocessing", - "compositing": "compositing", - "model_merging": "model_merging", + "latent": "latent", + "audio": "audio", + "video": "video", + "ltxv": "ltxv", + "sd3": "sd3", + "sigmas": "sigmas", "model_patches": "model_patches", "unet": "unet", - "preprocessors": "preprocessors", - "custom_sampling": "custom_sampling", - "schedulers": "schedulers", - "samplers": "samplers", - "sigmas": "sigmas", - "guiders": "guiders", - "noise": "noise", - "model": "model", - "animation": "animation", + "gligen": "gligen", + "postprocessing": "postprocessing", + "transform": "transform", + "batch": "batch", "video_models": "video_models", - "3d_models": "3d_models", - "upscale_diffusion": "upscale_diffusion", - "photomaker": "photomaker", - "stable_cascade": "stable_cascade", + "upscaling": "upscaling", + "inpaint": "inpaint", "instructpix2pix": "instructpix2pix", + "compositing": "compositing", + "samplers": "samplers", + "operations": "operations", "model_specific": "model_specific", - "attention_experiments": "attention_experiments", - "audio": "audio", - "sd3": "sd3", - "guidance": "guidance", - "flux": "flux", - "video": "video", - "ltxv": "ltxv", - "hooks": "hooks", - "create": "create", - "scheduling": "scheduling", - "combine": "combine", - "cond single": "cond single", + "model": "model", "cond pair": "cond pair", + "photomaker": "photomaker", + "animation": "animation", + "api": "api", + "upscale_diffusion": "upscale_diffusion", "clip": "clip", - "DevTools": "DevTools", - "api": "api" + "guidance": "guidance", + "stable_cascade": "stable_cascade", + "3d_models": "3d_models", + "style_model": "style_model" }, "dataTypes": { - "MODEL": "MODEL", - "INT": "INT", - "FLOAT": "FLOAT", - "COMBO": "COMBO", - "CONDITIONING": "CONDITIONING", - "LATENT": "LATENT", + "AUDIO": "AUDIO", + "BOOLEAN": "BOOLEAN", "CLIP": "CLIP", - "VAE": "VAE", - "STRING": "STRING", - "IMAGE": "IMAGE", - "MASK": "MASK", "CLIP_VISION": "CLIP_VISION", "CLIP_VISION_OUTPUT": "CLIP_VISION_OUTPUT", - "STYLE_MODEL": "STYLE_MODEL", + "COMBO": "COMBO", + "CONDITIONING": "CONDITIONING", "CONTROL_NET": "CONTROL_NET", + "FLOAT": "FLOAT", + "FLOATS": "FLOATS", "GLIGEN": "GLIGEN", - "BOOLEAN": "BOOLEAN", - "LATENT_OPERATION": "LATENT_OPERATION", - "UPSCALE_MODEL": "UPSCALE_MODEL", - "SAMPLER": "SAMPLER", - "SIGMAS": "SIGMAS", "GUIDER": "GUIDER", + "HOOK_KEYFRAMES": "HOOK_KEYFRAMES", + "HOOKS": "HOOKS", + "IMAGE": "IMAGE", + "INT": "INT", + "LATENT": "LATENT", + "LATENT_OPERATION": "LATENT_OPERATION", + "MASK": "MASK", + "MODEL": "MODEL", "NOISE": "NOISE", "PHOTOMAKER": "PHOTOMAKER", - "WEBCAM": "WEBCAM", - "AUDIO": "AUDIO", - "HOOKS": "HOOKS", - "HOOK_KEYFRAMES": "HOOK_KEYFRAMES", - "FLOATS": "FLOATS", - "TIMESTEPS_RANGE": "TIMESTEPS_RANGE" + "SAMPLER": "SAMPLER", + "SIGMAS": "SIGMAS", + "STRING": "STRING", + "STYLE_MODEL": "STYLE_MODEL", + "TIMESTEPS_RANGE": "TIMESTEPS_RANGE", + "UPSCALE_MODEL": "UPSCALE_MODEL", + "VAE": "VAE", + "WEBCAM": "WEBCAM" } } \ No newline at end of file diff --git a/src/locales/ja.json b/src/locales/ja.json index f2dc0838f..7df60d0c7 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -371,7 +371,20 @@ }, "CLIPTextEncode": { "description": "テキストプロンプトをCLIPモデルを使用してエンコードし、特定の画像を生成するために拡散モデルをガイドするために使用できる埋め込みに変換します。", - "display_name": "CLIPテキストエンコード(プロンプト)" + "display_name": "CLIPテキストエンコード(プロンプト)", + "inputs": { + "clip": { + "tooltip": "テキストのエンコードに使用されるCLIPモデル。" + }, + "text": { + "tooltip": "エンコードするテキスト。" + } + }, + "outputs": { + "0": { + "tooltip": "拡散モデルをガイドするために使用される埋め込まれたテキストを含む条件付け。" + } + } }, "CLIPTextEncodeControlnet": { "display_name": "CLIPテキストエンコードコントロールネット" @@ -405,7 +418,23 @@ }, "CheckpointLoaderSimple": { "description": "拡散モデルのチェックポイントを読み込みます。拡散モデルは潜在変数のノイズを除去するために使用されます。", - "display_name": "チェックポイントを読み込む" + "display_name": "チェックポイントを読み込む", + "inputs": { + "ckpt_name": { + "tooltip": "読み込むチェックポイント(モデル)の名前。" + } + }, + "outputs": { + "0": { + "tooltip": "潜在変数のデノイズに使用されるモデル。" + }, + "1": { + "tooltip": "テキストプロンプトをエンコードするために使用されるCLIPモデル。" + }, + "2": { + "tooltip": "画像を潜在空間にエンコードおよびデコードするために使用されるVAEモデル。" + } + } }, "CheckpointSave": { "display_name": "チェックポイントを保存" @@ -453,7 +482,15 @@ "display_name": "条件付けタイムステップ範囲" }, "ConditioningTimestepsRange": { - "display_name": "タイムステップ範囲" + "display_name": "タイムステップ範囲", + "outputs": { + "1": { + "name": "範囲前" + }, + "2": { + "name": "範囲後" + } + } }, "ConditioningZeroOut": { "display_name": "条件付けゼロアウト" @@ -462,25 +499,64 @@ "display_name": "ControlNetを適用(旧)" }, "ControlNetApplyAdvanced": { - "display_name": "ControlNetを適用" + "display_name": "ControlNetを適用", + "outputs": { + "0": { + "name": "ポジティブ" + }, + "1": { + "name": "ネガティブ" + } + } }, "ControlNetApplySD3": { - "display_name": "VAEでControlNetを適用" + "display_name": "VAEでControlNetを適用", + "outputs": { + "0": { + "name": "ポジティブ" + }, + "1": { + "name": "ネガティブ" + } + } }, "ControlNetInpaintingAliMamaApply": { - "display_name": "ControlNetインペインティングAliMamaを適用" + "display_name": "ControlNetインペインティングAliMamaを適用", + "outputs": { + "0": { + "name": "ポジティブ" + }, + "1": { + "name": "ネガティブ" + } + } }, "ControlNetLoader": { "display_name": "ControlNetモデルを読み込む" }, "CreateHookKeyframe": { - "display_name": "フックキーフレームを作成" + "display_name": "フックキーフレームを作成", + "outputs": { + "0": { + "name": "フックKF" + } + } }, "CreateHookKeyframesFromFloats": { - "display_name": "フックキーフレームを浮動小数点から作成" + "display_name": "フックキーフレームを浮動小数点から作成", + "outputs": { + "0": { + "name": "フックKF" + } + } }, "CreateHookKeyframesInterpolated": { - "display_name": "フックキーフレームを補間" + "display_name": "フックキーフレームを補間", + "outputs": { + "0": { + "name": "フックKF" + } + } }, "CreateHookLora": { "display_name": "フックLoRAを作成" @@ -531,7 +607,15 @@ }, "DevToolsNodeWithOutputList": { "description": "出力リストを持つノード", - "display_name": "出力リストノード" + "display_name": "出力リストノード", + "outputs": { + "0": { + "name": "整数出力" + }, + "1": { + "name": "整数リスト出力" + } + } }, "DevToolsNodeWithStringInput": { "description": "文字列入力を持つノード", @@ -567,11 +651,32 @@ "display_name": "空のLTXV潜在ビデオ" }, "EmptyLatentAudio": { - "display_name": "空の潜在音声" + "display_name": "空の潜在音声", + "inputs": { + "batch_size": { + "tooltip": "バッチ内の潜在画像の数。" + } + } }, "EmptyLatentImage": { "description": "サンプリングを通じてノイズを除去するための空の潜在画像の新しいバッチを作成します。", - "display_name": "空の潜在画像" + "display_name": "空の潜在画像", + "inputs": { + "batch_size": { + "tooltip": "バッチ内の潜在画像の数。" + }, + "height": { + "tooltip": "潜在画像の高さ(ピクセル単位)。" + }, + "width": { + "tooltip": "潜在画像の幅(ピクセル単位)。" + } + }, + "outputs": { + "0": { + "tooltip": "空の潜在画像バッチ。" + } + } }, "EmptyMochiLatentVideo": { "display_name": "空のMochi潜在ビデオ" @@ -670,10 +775,37 @@ "display_name": "モデルを使用して画像を拡大" }, "InpaintModelConditioning": { - "display_name": "インペイントモデル条件付け" + "display_name": "インペイントモデル条件付け", + "inputs": { + "noise_mask": { + "tooltip": "潜在にノイズマスクを追加し、サンプリングがマスク内でのみ行われるようにします。モデルによっては結果が改善されるか、完全に壊れる可能性があります。" + } + }, + "outputs": { + "0": { + "name": "ポジティブ" + }, + "1": { + "name": "ネガティブ" + }, + "2": { + "name": "潜在" + } + } }, "InstructPixToPixConditioning": { - "display_name": "PixToPix条件付け" + "display_name": "PixToPix条件付け", + "outputs": { + "0": { + "name": "ポジティブ" + }, + "1": { + "name": "ネガティブ" + }, + "2": { + "name": "潜在" + } + } }, "InvertMask": { "display_name": "マスクを反転" @@ -683,7 +815,44 @@ }, "KSampler": { "description": "提供されたモデル、正の条件付けと負の条件付けを使用して潜在画像のノイズを除去します。", - "display_name": "Kサンプラー" + "display_name": "Kサンプラー", + "inputs": { + "cfg": { + "tooltip": "Classifier-Free Guidanceスケールは、創造性とプロンプトへの遵守のバランスを取ります。値が高いほど、生成される画像はプロンプトにより近くなりますが、値が高すぎると品質に悪影響を及ぼす可能性があります。" + }, + "denoise": { + "tooltip": "適用されるデノイズの量。値が低いほど、初期画像の構造を維持し、画像から画像へのサンプリングが可能になります。" + }, + "latent_image": { + "tooltip": "デノイズする潜在画像。" + }, + "model": { + "tooltip": "入力潜在のデノイズに使用されるモデル。" + }, + "negative": { + "tooltip": "画像から除外したい属性を説明する条件付け。" + }, + "positive": { + "tooltip": "画像に含めたい属性を説明する条件付け。" + }, + "sampler_name": { + "tooltip": "サンプリング時に使用されるアルゴリズムで、生成される出力の品質、速度、スタイルに影響を与える可能性があります。" + }, + "scheduler": { + "tooltip": "スケジューラは、ノイズが徐々に除去されて画像が形成される方法を制御します。" + }, + "seed": { + "tooltip": "ノイズを生成するために使用されるランダムシード。" + }, + "steps": { + "tooltip": "デノイズプロセスで使用されるステップ数。" + } + }, + "outputs": { + "0": { + "tooltip": "デノイズされた潜在変数。" + } + } }, "KSamplerAdvanced": { "display_name": "Kサンプラー(高度)" @@ -695,13 +864,45 @@ "display_name": "カラススケジューラー" }, "LTXVConditioning": { - "display_name": "LTXV条件付け" + "display_name": "LTXV条件付け", + "outputs": { + "0": { + "name": "ポジティブ" + }, + "1": { + "name": "ネガティブ" + } + } }, "LTXVImgToVideo": { - "display_name": "LTXV画像からビデオへ" + "display_name": "LTXV画像からビデオへ", + "inputs": { + "image_noise_scale": { + "tooltip": "条件付け画像の潜在に適用するノイズの量。" + } + }, + "outputs": { + "0": { + "name": "ポジティブ" + }, + "1": { + "name": "ネガティブ" + }, + "2": { + "name": "潜在" + } + } }, "LTXVScheduler": { - "display_name": "LTXVスケジューラー" + "display_name": "LTXVスケジューラー", + "inputs": { + "stretch": { + "tooltip": "シグマを[terminal, 1]の範囲に伸ばします。" + }, + "terminal": { + "tooltip": "ストレッチ後のシグマの端末値。" + } + } }, "LaplaceScheduler": { "display_name": "ラプラススケジューラー" @@ -777,14 +978,52 @@ }, "LoraLoader": { "description": "LoRAは拡散およびCLIPモデルを修正するために使用され、潜在のノイズ除去方法を変更します。複数のLoRAノードを連結できます。", - "display_name": "LoRAを読み込む" + "display_name": "LoRAを読み込む", + "inputs": { + "clip": { + "tooltip": "LoRAが適用されるCLIPモデル。" + }, + "lora_name": { + "tooltip": "LoRAの名前。" + }, + "model": { + "tooltip": "LoRAが適用される拡散モデル。" + }, + "strength_clip": { + "tooltip": "CLIPモデルをどの程度変更するか。この値は負の値になる可能性があります。" + }, + "strength_model": { + "tooltip": "拡散モデルをどの程度変更するか。この値は負の値になる可能性があります。" + } + }, + "outputs": { + "0": { + "tooltip": "修正された拡散モデル。" + }, + "1": { + "tooltip": "修正されたCLIPモデル。" + } + } }, "LoraLoaderModelOnly": { "description": "LoRAは拡散およびCLIPモデルを修正するために使用され、潜在のノイズ除去方法を変更します。複数のLoRAノードを連結できます。", - "display_name": "LoRAローダーモデルのみ" + "display_name": "LoRAローダーモデルのみ", + "outputs": { + "0": { + "tooltip": "修正された拡散モデル。" + } + } }, "LoraSave": { - "display_name": "LoRAを抽出して保存" + "display_name": "LoRAを抽出して保存", + "inputs": { + "model_diff": { + "tooltip": "loraに変換されるModelSubtract出力。" + }, + "text_encoder_diff": { + "tooltip": "loraに変換されるCLIPSubtract出力。" + } + } }, "MaskComposite": { "display_name": "マスク合成" @@ -862,16 +1101,48 @@ "display_name": "画像形態学" }, "PairConditioningCombine": { - "display_name": "ペア条件付け組み合わせ" + "display_name": "ペア条件付け組み合わせ", + "outputs": { + "0": { + "name": "ポジティブ" + }, + "1": { + "name": "ネガティブ" + } + } }, "PairConditioningSetDefaultCombine": { - "display_name": "ペア条件付けデフォルト組み合わせを設定" + "display_name": "ペア条件付けデフォルト組み合わせを設定", + "outputs": { + "0": { + "name": "ポジティブ" + }, + "1": { + "name": "ネガティブ" + } + } }, "PairConditioningSetProperties": { - "display_name": "ペア条件付けプロパティ設定" + "display_name": "ペア条件付けプロパティ設定", + "outputs": { + "0": { + "name": "ポジティブ" + }, + "1": { + "name": "ネガティブ" + } + } }, "PairConditioningSetPropertiesAndCombine": { - "display_name": "ペア条件付けプロパティ設定と組み合わせ" + "display_name": "ペア条件付けプロパティ設定と組み合わせ", + "outputs": { + "0": { + "name": "ポジティブ" + }, + "1": { + "name": "ネガティブ" + } + } }, "PatchModelAddDownscale": { "display_name": "パッチモデル追加ダウンスケール(Kohya Deep Shrink)" @@ -926,19 +1197,68 @@ "display_name": "SDターボスケジューラー" }, "SD_4XUpscale_Conditioning": { - "display_name": "SD_4X拡大条件付け" + "display_name": "SD_4X拡大条件付け", + "outputs": { + "0": { + "name": "ポジティブ" + }, + "1": { + "name": "ネガティブ" + }, + "2": { + "name": "潜在" + } + } }, "SV3D_Conditioning": { - "display_name": "SV3D条件付け" + "display_name": "SV3D条件付け", + "outputs": { + "0": { + "name": "ポジティブ" + }, + "1": { + "name": "ネガティブ" + }, + "2": { + "name": "潜在" + } + } }, "SVD_img2vid_Conditioning": { - "display_name": "SVD_img2vid条件付け" + "display_name": "SVD_img2vid条件付け", + "outputs": { + "0": { + "name": "ポジティブ" + }, + "1": { + "name": "ネガティブ" + }, + "2": { + "name": "潜在" + } + } }, "SamplerCustom": { - "display_name": "カスタムサンプラー" + "display_name": "カスタムサンプラー", + "outputs": { + "0": { + "name": "出力" + }, + "1": { + "name": "デノイズ出力" + } + } }, "SamplerCustomAdvanced": { - "display_name": "カスタムサンプラー(高度)" + "display_name": "カスタムサンプラー(高度)", + "outputs": { + "0": { + "name": "出力" + }, + "1": { + "name": "デノイズ出力" + } + } }, "SamplerDPMAdaptative": { "display_name": "サンプラーDPM適応" @@ -981,7 +1301,15 @@ }, "SaveImage": { "description": "入力画像をComfyUI出力ディレクトリに保存します。", - "display_name": "画像を保存" + "display_name": "画像を保存", + "inputs": { + "filename_prefix": { + "tooltip": "保存するファイルのプレフィックス。この中には、ノードからの値を含めるために、%date:yyyy-MM-dd%や%Empty Latent Image.width%などのフォーマット情報が含まれる場合があります。" + }, + "images": { + "tooltip": "保存する画像。" + } + } }, "SaveImageWebsocket": { "display_name": "画像を保存するWebSocket" @@ -1019,28 +1347,93 @@ "display_name": "アルファで画像を分割" }, "SplitSigmas": { - "display_name": "シグマを分割" + "display_name": "シグマを分割", + "outputs": { + "0": { + "name": "高シグマ" + }, + "1": { + "name": "低シグマ" + } + } }, "SplitSigmasDenoise": { - "display_name": "シグマを分割してノイズ除去" + "display_name": "シグマを分割してノイズ除去", + "outputs": { + "0": { + "name": "高シグマ" + }, + "1": { + "name": "低シグマ" + } + } }, "StableCascade_EmptyLatentImage": { - "display_name": "安定カスケード_空の潜在画像" + "display_name": "安定カスケード_空の潜在画像", + "outputs": { + "0": { + "name": "ステージC" + }, + "1": { + "name": "ステージB" + } + } }, "StableCascade_StageB_Conditioning": { "display_name": "安定カスケード_ステージB条件付け" }, "StableCascade_StageC_VAEEncode": { - "display_name": "安定カスケード_ステージC_VAEエンコード" + "display_name": "安定カスケード_ステージC_VAEエンコード", + "outputs": { + "0": { + "name": "ステージC" + }, + "1": { + "name": "ステージB" + } + } }, "StableCascade_SuperResolutionControlnet": { - "display_name": "安定カスケード_超解像Controlnet" + "display_name": "安定カスケード_超解像Controlnet", + "outputs": { + "0": { + "name": "コントロールネット入力" + }, + "1": { + "name": "ステージC" + }, + "2": { + "name": "ステージB" + } + } }, "StableZero123_Conditioning": { - "display_name": "安定ゼロ123条件付け" + "display_name": "安定ゼロ123条件付け", + "outputs": { + "0": { + "name": "ポジティブ" + }, + "1": { + "name": "ネガティブ" + }, + "2": { + "name": "潜在" + } + } }, "StableZero123_Conditioning_Batched": { - "display_name": "安定ゼロ123条件付け(バッチ)" + "display_name": "安定ゼロ123条件付け(バッチ)", + "outputs": { + "0": { + "name": "ポジティブ" + }, + "1": { + "name": "ネガティブ" + }, + "2": { + "name": "潜在" + } + } }, "StyleModelApply": { "display_name": "スタイルモデルを適用" @@ -1078,7 +1471,20 @@ }, "VAEDecode": { "description": "潜在画像をピクセル空間画像にデコードします。", - "display_name": "VAEデコード" + "display_name": "VAEデコード", + "inputs": { + "samples": { + "tooltip": "デコードされる潜在。" + }, + "vae": { + "tooltip": "潜在のデコードに使用されるVAEモデル。" + } + }, + "outputs": { + "0": { + "tooltip": "デコードされた画像。" + } + } }, "VAEDecodeAudio": { "display_name": "VAEデコード音声" diff --git a/src/locales/ko.json b/src/locales/ko.json index bb0385421..c2697c9ce 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -354,7 +354,20 @@ }, "CLIPTextEncode": { "description": "CLIP 모델을 사용하여 텍스트 프롬프트를 인코딩하여 확산 모델이 특정 이미지를 생성하도록 안내하는 임베딩으로 변환합니다.", - "display_name": "CLIP 텍스트 인코딩 (프롬프트)" + "display_name": "CLIP 텍스트 인코딩 (프롬프트)", + "inputs": { + "clip": { + "tooltip": "텍스트 인코딩에 사용되는 CLIP 모델입니다." + }, + "text": { + "tooltip": "인코딩할 텍스트입니다." + } + }, + "outputs": { + "0": { + "tooltip": "확산 모델을 안내하는 데 사용되는 임베디드 텍스트를 포함하는 조건부입니다." + } + } }, "CLIPTextEncodeControlnet": { "display_name": "CLIP 텍스트 인코딩 (컨트롤넷)" @@ -388,7 +401,23 @@ }, "CheckpointLoaderSimple": { "description": "확산 모델 체크포인트를 로드합니다. 확산 모델은 잠재 데이터를 디노이즈하는 데 사용됩니다.", - "display_name": "체크포인트 로드" + "display_name": "체크포인트 로드", + "inputs": { + "ckpt_name": { + "tooltip": "로드할 체크포인트(모델)의 이름입니다." + } + }, + "outputs": { + "0": { + "tooltip": "노이즈 제거를 위한 잠재 모델입니다." + }, + "1": { + "tooltip": "텍스트 프롬프트를 인코딩하는 데 사용되는 CLIP 모델입니다." + }, + "2": { + "tooltip": "이미지를 잠재 공간으로 인코딩하고 디코딩하는 데 사용되는 VAE 모델입니다." + } + } }, "CheckpointSave": { "display_name": "체크포인트 저장" @@ -436,7 +465,15 @@ "display_name": "조건 (타임스텝 범위 설정)" }, "ConditioningTimestepsRange": { - "display_name": "조건 (타임스텝 범위)" + "display_name": "조건 (타임스텝 범위)", + "outputs": { + "1": { + "name": "범위_이전" + }, + "2": { + "name": "범위_이후" + } + } }, "ConditioningZeroOut": { "display_name": "조건 (제로 아웃)" @@ -445,25 +482,64 @@ "display_name": "컨트롤넷 적용 (구형)" }, "ControlNetApplyAdvanced": { - "display_name": "컨트롤넷 적용" + "display_name": "컨트롤넷 적용", + "outputs": { + "0": { + "name": "양성" + }, + "1": { + "name": "음성" + } + } }, "ControlNetApplySD3": { - "display_name": "컨트롤넷을 VAE와 함께 적용" + "display_name": "컨트롤넷을 VAE와 함께 적용", + "outputs": { + "0": { + "name": "양성" + }, + "1": { + "name": "음성" + } + } }, "ControlNetInpaintingAliMamaApply": { - "display_name": "컨트롤넷 인페인팅 AliMama 적용" + "display_name": "컨트롤넷 인페인팅 AliMama 적용", + "outputs": { + "0": { + "name": "양성" + }, + "1": { + "name": "음성" + } + } }, "ControlNetLoader": { "display_name": "컨트롤넷 모델 로드" }, "CreateHookKeyframe": { - "display_name": "후크 키프레임 생성" + "display_name": "후크 키프레임 생성", + "outputs": { + "0": { + "name": "후크_KF" + } + } }, "CreateHookKeyframesFromFloats": { - "display_name": "부동 소수점으로 후크 키프레임 생성" + "display_name": "부동 소수점으로 후크 키프레임 생성", + "outputs": { + "0": { + "name": "후크_KF" + } + } }, "CreateHookKeyframesInterpolated": { - "display_name": "보간된 후크 키프레임 생성" + "display_name": "보간된 후크 키프레임 생성", + "outputs": { + "0": { + "name": "후크_KF" + } + } }, "CreateHookLora": { "display_name": "후크 LoRA 생성" @@ -514,7 +590,15 @@ }, "DevToolsNodeWithOutputList": { "description": "출력 목록이 있는 노드", - "display_name": "출력 목록이 있는 노드" + "display_name": "출력 목록이 있는 노드", + "outputs": { + "0": { + "name": "정수 출력" + }, + "1": { + "name": "정수 목록 출력" + } + } }, "DevToolsNodeWithStringInput": { "description": "문자열 입력이 있는 노드", @@ -550,11 +634,32 @@ "display_name": "빈 LTXV 잠재 비디오" }, "EmptyLatentAudio": { - "display_name": "빈 잠재 오디오" + "display_name": "빈 잠재 오디오", + "inputs": { + "batch_size": { + "tooltip": "배치의 잠재 이미지 수입니다." + } + } }, "EmptyLatentImage": { "description": "샘플링을 통해 디노이즈할 빈 잠재 이미지의 새 배치를 생성합니다.", - "display_name": "빈 잠재 이미지" + "display_name": "빈 잠재 이미지", + "inputs": { + "batch_size": { + "tooltip": "배치의 잠재 이미지 수입니다." + }, + "height": { + "tooltip": "잠재 이미지의 높이(픽셀)입니다." + }, + "width": { + "tooltip": "잠재 이미지의 너비(픽셀)입니다." + } + }, + "outputs": { + "0": { + "tooltip": "빈 잠재 이미지 배치입니다." + } + } }, "EmptyMochiLatentVideo": { "display_name": "빈 Mochi 잠재 비디오" @@ -653,10 +758,37 @@ "display_name": "모델을 사용한 이미지 확대" }, "InpaintModelConditioning": { - "display_name": "인페인팅 모델 조건 설정" + "display_name": "인페인팅 모델 조건 설정", + "inputs": { + "noise_mask": { + "tooltip": "잠재에 노이즈 마스크를 추가하여 샘플링이 마스크 내에서만 발생하도록 합니다. 모델에 따라 결과가 개선되거나 완전히 망가질 수 있습니다." + } + }, + "outputs": { + "0": { + "name": "양성" + }, + "1": { + "name": "음성" + }, + "2": { + "name": "잠재" + } + } }, "InstructPixToPixConditioning": { - "display_name": "픽셀 간 조건 설정" + "display_name": "픽셀 간 조건 설정", + "outputs": { + "0": { + "name": "양성" + }, + "1": { + "name": "음성" + }, + "2": { + "name": "잠재" + } + } }, "InvertMask": { "display_name": "마스크 반전" @@ -666,7 +798,44 @@ }, "KSampler": { "description": "제공된 모델, 긍정 및 부정 조건을 사용하여 잠재 이미지를 디노이즈합니다.", - "display_name": "KSampler" + "display_name": "KSampler", + "inputs": { + "cfg": { + "tooltip": "Classifier-Free Guidance 스케일은 창의성과 프롬프트 준수를 균형 있게 조절합니다. 값이 높을수록 프롬프트와 더 밀접하게 일치하는 이미지가 생성되지만, 너무 높은 값은 품질에 부정적인 영향을 미칠 수 있습니다." + }, + "denoise": { + "tooltip": "적용되는 노이즈 제거의 양으로, 낮은 값은 초기 이미지의 구조를 유지하여 이미지 간 샘플링을 가능하게 합니다." + }, + "latent_image": { + "tooltip": "노이즈 제거할 잠재 이미지입니다." + }, + "model": { + "tooltip": "입력 잠재의 노이즈 제거에 사용되는 모델입니다." + }, + "negative": { + "tooltip": "이미지에서 제외하고 싶은 속성을 설명하는 조건입니다." + }, + "positive": { + "tooltip": "이미지에 포함하고 싶은 속성을 설명하는 조건입니다." + }, + "sampler_name": { + "tooltip": "샘플링 시 사용되는 알고리즘으로, 생성된 출력의 품질, 속도 및 스타일에 영향을 미칠 수 있습니다." + }, + "scheduler": { + "tooltip": "스케줄러는 노이즈가 점진적으로 제거되어 이미지를 형성하는 방식을 제어합니다." + }, + "seed": { + "tooltip": "노이즈 생성을 위한 랜덤 시드입니다." + }, + "steps": { + "tooltip": "노이즈 제거 과정에서 사용되는 단계 수입니다." + } + }, + "outputs": { + "0": { + "tooltip": "노이즈가 제거된 잠재입니다." + } + } }, "KSamplerAdvanced": { "display_name": "고급 KSampler" @@ -678,13 +847,45 @@ "display_name": "Karras 스케줄러" }, "LTXVConditioning": { - "display_name": "LTXV 조건 설정" + "display_name": "LTXV 조건 설정", + "outputs": { + "0": { + "name": "양성" + }, + "1": { + "name": "음성" + } + } }, "LTXVImgToVideo": { - "display_name": "LTXV 이미지에서 비디오로" + "display_name": "LTXV 이미지에서 비디오로", + "inputs": { + "image_noise_scale": { + "tooltip": "조건 이미지 잠재에 적용할 노이즈의 양입니다." + } + }, + "outputs": { + "0": { + "name": "양성" + }, + "1": { + "name": "음성" + }, + "2": { + "name": "잠재" + } + } }, "LTXVScheduler": { - "display_name": "LTXV 스케줄러" + "display_name": "LTXV 스케줄러", + "inputs": { + "stretch": { + "tooltip": "시그마를 [terminal, 1] 범위로 늘립니다." + }, + "terminal": { + "tooltip": "늘린 후 시그마의 최종 값입니다." + } + } }, "LaplaceScheduler": { "display_name": "라플라스 스케줄러" @@ -760,14 +961,52 @@ }, "LoraLoader": { "description": "LoRA는 확산 및 CLIP 모델을 수정하는 데 사용되며, 잠재 데이터를 디노이즈하는 방식을 변경합니다. 여러 LoRA 노드를 연결할 수 있습니다.", - "display_name": "LoRA 로드" + "display_name": "LoRA 로드", + "inputs": { + "clip": { + "tooltip": "LoRA가 적용될 CLIP 모델입니다." + }, + "lora_name": { + "tooltip": "LoRA의 이름입니다." + }, + "model": { + "tooltip": "LoRA가 적용될 확산 모델입니다." + }, + "strength_clip": { + "tooltip": "CLIP 모델을 수정하는 강도입니다. 이 값은 음수가 될 수 있습니다." + }, + "strength_model": { + "tooltip": "확산 모델을 수정하는 강도입니다. 이 값은 음수가 될 수 있습니다." + } + }, + "outputs": { + "0": { + "tooltip": "수정된 확산 모델입니다." + }, + "1": { + "tooltip": "수정된 CLIP 모델입니다." + } + } }, "LoraLoaderModelOnly": { "description": "LoRA는 확산 및 CLIP 모델을 수정하는 데 사용되며, 잠재 데이터를 디노이즈하는 방식을 변경합니다. 여러 LoRA 노드를 연결할 수 있습니다.", - "display_name": "LoRA 로드 (모델 전용)" + "display_name": "LoRA 로드 (모델 전용)", + "outputs": { + "0": { + "tooltip": "수정된 확산 모델입니다." + } + } }, "LoraSave": { - "display_name": "LoRA 추출 및 저장" + "display_name": "LoRA 추출 및 저장", + "inputs": { + "model_diff": { + "tooltip": "lora로 변환될 ModelSubtract 출력입니다." + }, + "text_encoder_diff": { + "tooltip": "lora로 변환될 CLIPSubtract 출력입니다." + } + } }, "MaskComposite": { "display_name": "마스크 합성" @@ -845,16 +1084,48 @@ "display_name": "이미지 형태 변환" }, "PairConditioningCombine": { - "display_name": "조건 쌍 (결합)" + "display_name": "조건 쌍 (결합)", + "outputs": { + "0": { + "name": "양성" + }, + "1": { + "name": "음성" + } + } }, "PairConditioningSetDefaultCombine": { - "display_name": "조건 쌍 (기본 결합 설정)" + "display_name": "조건 쌍 (기본 결합 설정)", + "outputs": { + "0": { + "name": "양성" + }, + "1": { + "name": "음성" + } + } }, "PairConditioningSetProperties": { - "display_name": "조건 쌍 (속성 설정)" + "display_name": "조건 쌍 (속성 설정)", + "outputs": { + "0": { + "name": "양성" + }, + "1": { + "name": "음성" + } + } }, "PairConditioningSetPropertiesAndCombine": { - "display_name": "조건 쌍 (속성 설정 및 결합)" + "display_name": "조건 쌍 (속성 설정 및 결합)", + "outputs": { + "0": { + "name": "양성" + }, + "1": { + "name": "음성" + } + } }, "PatchModelAddDownscale": { "display_name": "다운스케일 추가 모델 패치 (Kohya Deep Shrink)" @@ -909,19 +1180,68 @@ "display_name": "SD-Turbo 스케줄러" }, "SD_4XUpscale_Conditioning": { - "display_name": "SD_4X 확대 조건 설정" + "display_name": "SD_4X 확대 조건 설정", + "outputs": { + "0": { + "name": "양성" + }, + "1": { + "name": "음성" + }, + "2": { + "name": "잠재" + } + } }, "SV3D_Conditioning": { - "display_name": "SV3D 조건 설정" + "display_name": "SV3D 조건 설정", + "outputs": { + "0": { + "name": "양성" + }, + "1": { + "name": "음성" + }, + "2": { + "name": "잠재" + } + } }, "SVD_img2vid_Conditioning": { - "display_name": "SVD_img2vid 조건 설정" + "display_name": "SVD_img2vid 조건 설정", + "outputs": { + "0": { + "name": "양성" + }, + "1": { + "name": "음성" + }, + "2": { + "name": "잠재" + } + } }, "SamplerCustom": { - "display_name": "사용자 정의 샘플러" + "display_name": "사용자 정의 샘플러", + "outputs": { + "0": { + "name": "출력" + }, + "1": { + "name": "노이즈 제거된 출력" + } + } }, "SamplerCustomAdvanced": { - "display_name": "고급 사용자 정의 샘플러" + "display_name": "고급 사용자 정의 샘플러", + "outputs": { + "0": { + "name": "출력" + }, + "1": { + "name": "노이즈 제거된 출력" + } + } }, "SamplerDPMAdaptative": { "display_name": "DPMAdaptive 샘플러" @@ -964,7 +1284,15 @@ }, "SaveImage": { "description": "입력 이미지를 ComfyUI 출력 디렉토리에 저장합니다.", - "display_name": "이미지 저장" + "display_name": "이미지 저장", + "inputs": { + "filename_prefix": { + "tooltip": "저장할 파일의 접두사입니다. 여기에는 %date:yyyy-MM-dd% 또는 %Empty Latent Image.width%와 같은 형식 정보가 포함되어 노드의 값을 포함할 수 있습니다." + }, + "images": { + "tooltip": "저장할 이미지입니다." + } + } }, "SaveImageWebsocket": { "display_name": "이미지 웹소켓 전송" @@ -1002,28 +1330,93 @@ "display_name": "이미지와 알파채널 분리" }, "SplitSigmas": { - "display_name": "시그마 분할 (스텝형)" + "display_name": "시그마 분할 (스텝형)", + "outputs": { + "0": { + "name": "높은_시그마" + }, + "1": { + "name": "낮은_시그마" + } + } }, "SplitSigmasDenoise": { - "display_name": "시그마 분할 (디노이즈형)" + "display_name": "시그마 분할 (디노이즈형)", + "outputs": { + "0": { + "name": "높은_시그마" + }, + "1": { + "name": "낮은_시그마" + } + } }, "StableCascade_EmptyLatentImage": { - "display_name": "StableCascade 빈 잠재 이미지" + "display_name": "StableCascade 빈 잠재 이미지", + "outputs": { + "0": { + "name": "단계_c" + }, + "1": { + "name": "단계_b" + } + } }, "StableCascade_StageB_Conditioning": { "display_name": "StableCascasde_StageB 조건 설정" }, "StableCascade_StageC_VAEEncode": { - "display_name": "StableCascade_StageC VAE 인코딩" + "display_name": "StableCascade_StageC VAE 인코딩", + "outputs": { + "0": { + "name": "단계_c" + }, + "1": { + "name": "단계_b" + } + } }, "StableCascade_SuperResolutionControlnet": { - "display_name": "StableCascade 초고해상도 컨트롤넷" + "display_name": "StableCascade 초고해상도 컨트롤넷", + "outputs": { + "0": { + "name": "controlnet_input" + }, + "1": { + "name": "단계_c" + }, + "2": { + "name": "단계_b" + } + } }, "StableZero123_Conditioning": { - "display_name": "StableZero123 조건 설정" + "display_name": "StableZero123 조건 설정", + "outputs": { + "0": { + "name": "양성" + }, + "1": { + "name": "음성" + }, + "2": { + "name": "잠재" + } + } }, "StableZero123_Conditioning_Batched": { - "display_name": "StableZero123 조건 설정_배치" + "display_name": "StableZero123 조건 설정_배치", + "outputs": { + "0": { + "name": "양성" + }, + "1": { + "name": "음성" + }, + "2": { + "name": "잠재" + } + } }, "StyleModelApply": { "display_name": "스타일 모델 적용" @@ -1061,7 +1454,20 @@ }, "VAEDecode": { "description": "잠재 데이터를 픽셀 공간 이미지로 디코딩합니다.", - "display_name": "VAE 디코드" + "display_name": "VAE 디코드", + "inputs": { + "samples": { + "tooltip": "디코딩할 잠재입니다." + }, + "vae": { + "tooltip": "잠재 디코딩에 사용되는 VAE 모델입니다." + } + }, + "outputs": { + "0": { + "tooltip": "디코딩된 이미지입니다." + } + } }, "VAEDecodeAudio": { "display_name": "VAE 디코드 오디오" diff --git a/src/locales/ru.json b/src/locales/ru.json index 7bb95ba99..d57204b5c 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -371,7 +371,20 @@ }, "CLIPTextEncode": { "description": "Кодирует текстовый запрос с помощью модели CLIP в вектор, который можно использовать для управления моделью диффузии для генерации конкретных изображений.", - "display_name": "Кодирование текста CLIP (Запрос)" + "display_name": "Кодирование текста CLIP (Запрос)", + "inputs": { + "clip": { + "tooltip": "Модель CLIP, используемая для кодирования текста." + }, + "text": { + "tooltip": "Текст для кодирования." + } + }, + "outputs": { + "0": { + "tooltip": "Условие, содержащее встроенный текст, используемое для управления моделью диффузии." + } + } }, "CLIPTextEncodeControlnet": { "display_name": "Кодирование текста CLIP для Controlnet" @@ -405,7 +418,23 @@ }, "CheckpointLoaderSimple": { "description": "Загружает контрольную точку модели диффузии, модели диффузии используются для удаления шума из латентов.", - "display_name": "Загрузить контрольную точку" + "display_name": "Загрузить контрольную точку", + "inputs": { + "ckpt_name": { + "tooltip": "Имя контрольной точки (модели) для загрузки." + } + }, + "outputs": { + "0": { + "tooltip": "Модель, используемая для денойзинга латентов." + }, + "1": { + "tooltip": "Модель CLIP, используемая для кодирования текстовых подсказок." + }, + "2": { + "tooltip": "Модель VAE, используемая для кодирования и декодирования изображений из и в латентное пространство." + } + } }, "CheckpointSave": { "display_name": "Сохранить контрольную точку" @@ -453,7 +482,15 @@ "display_name": "Установить диапазон временных шагов кондиционирования" }, "ConditioningTimestepsRange": { - "display_name": "Диапазон временных шагов" + "display_name": "Диапазон временных шагов", + "outputs": { + "1": { + "name": "ДО_ДИАПАЗОНА" + }, + "2": { + "name": "ПОСЛЕ_ДИАПАЗОНА" + } + } }, "ConditioningZeroOut": { "display_name": "Обнуление кондиционирования" @@ -462,25 +499,64 @@ "display_name": "Применить ControlNet (СТАРОЕ)" }, "ControlNetApplyAdvanced": { - "display_name": "Применить ControlNet" + "display_name": "Применить ControlNet", + "outputs": { + "0": { + "name": "положительный" + }, + "1": { + "name": "отрицательный" + } + } }, "ControlNetApplySD3": { - "display_name": "Применить ControlNet с VAE" + "display_name": "Применить ControlNet с VAE", + "outputs": { + "0": { + "name": "положительный" + }, + "1": { + "name": "отрицательный" + } + } }, "ControlNetInpaintingAliMamaApply": { - "display_name": "Применить ControlNet для инпейнтинга AliMama" + "display_name": "Применить ControlNet для инпейнтинга AliMama", + "outputs": { + "0": { + "name": "положительный" + }, + "1": { + "name": "отрицательный" + } + } }, "ControlNetLoader": { "display_name": "Загрузить модель ControlNet" }, "CreateHookKeyframe": { - "display_name": "Создать ключевой кадр хука" + "display_name": "Создать ключевой кадр хука", + "outputs": { + "0": { + "name": "КЛЮЧЕВОЙ_КАДР" + } + } }, "CreateHookKeyframesFromFloats": { - "display_name": "Создать ключевые кадры хука из чисел с плавающей запятой" + "display_name": "Создать ключевые кадры хука из чисел с плавающей запятой", + "outputs": { + "0": { + "name": "КЛЮЧЕВОЙ_КАДР" + } + } }, "CreateHookKeyframesInterpolated": { - "display_name": "Создать интерполированные ключевые кадры хука" + "display_name": "Создать интерполированные ключевые кадры хука", + "outputs": { + "0": { + "name": "КЛЮЧЕВОЙ_КАДР" + } + } }, "CreateHookLora": { "display_name": "Создать хук LoRA" @@ -531,7 +607,15 @@ }, "DevToolsNodeWithOutputList": { "description": "Узел с выходным списком", - "display_name": "Узел с выходным списком" + "display_name": "Узел с выходным списком", + "outputs": { + "0": { + "name": "ЦЕЛОЧИСЛЬНЫЙ_ВЫХОД" + }, + "1": { + "name": "СПИСОК_ЦЕЛЫХ_ЧИСЕЛ" + } + } }, "DevToolsNodeWithStringInput": { "description": "Узел со строковым вводом", @@ -567,11 +651,32 @@ "display_name": "Пустое латентное видео LTXV" }, "EmptyLatentAudio": { - "display_name": "Пустой латентный аудио" + "display_name": "Пустой латентный аудио", + "inputs": { + "batch_size": { + "tooltip": "Количество латентных изображений в партии." + } + } }, "EmptyLatentImage": { "description": "Создает новую партию пустых латентных изображений для удаления шума через выборку.", - "display_name": "Пустое латентное изображение" + "display_name": "Пустое латентное изображение", + "inputs": { + "batch_size": { + "tooltip": "Количество латентных изображений в партии." + }, + "height": { + "tooltip": "Высота латентных изображений в пикселях." + }, + "width": { + "tooltip": "Ширина латентных изображений в пикселях." + } + }, + "outputs": { + "0": { + "tooltip": "Пустая партия латентных изображений." + } + } }, "EmptyMochiLatentVideo": { "display_name": "Пустое латентное видео Mochi" @@ -670,10 +775,37 @@ "display_name": "Увеличить изображение (с использованием модели)" }, "InpaintModelConditioning": { - "display_name": "Кондиционирование модели инпейнтинга" + "display_name": "Кондиционирование модели инпейнтинга", + "inputs": { + "noise_mask": { + "tooltip": "Добавьте маску шума к латентному изображению, чтобы выборка происходила только в пределах маски. Это может улучшить результаты или полностью испортить их в зависимости от модели." + } + }, + "outputs": { + "0": { + "name": "положительный" + }, + "1": { + "name": "отрицательный" + }, + "2": { + "name": "латентный" + } + } }, "InstructPixToPixConditioning": { - "display_name": "Кондиционирование PixToPix" + "display_name": "Кондиционирование PixToPix", + "outputs": { + "0": { + "name": "положительный" + }, + "1": { + "name": "отрицательный" + }, + "2": { + "name": "латентный" + } + } }, "InvertMask": { "display_name": "Инвертировать маску" @@ -683,7 +815,44 @@ }, "KSampler": { "description": "Использует предоставленную модель, положительное и отрицательное кондиционирование для удаления шума из латентного изображения.", - "display_name": "KSampler" + "display_name": "KSampler", + "inputs": { + "cfg": { + "tooltip": "Масштаб без классификатора балансирует креативность и соблюдение запроса. Более высокие значения приводят к изображениям, более точно соответствующим запросу, однако слишком высокие значения негативно скажутся на качестве." + }, + "denoise": { + "tooltip": "Количество уменьшения шума, более низкие значения сохранят структуру начального изображения, позволяя выборку изображений." + }, + "latent_image": { + "tooltip": "Латентное изображение для уменьшения шума." + }, + "model": { + "tooltip": "Модель, используемая для уменьшения шума входного латентного изображения." + }, + "negative": { + "tooltip": "Условие, описывающее атрибуты, которые вы хотите исключить из изображения." + }, + "positive": { + "tooltip": "Условие, описывающее атрибуты, которые вы хотите включить в изображение." + }, + "sampler_name": { + "tooltip": "Алгоритм, используемый при выборке, это может повлиять на качество, скорость и стиль сгенерированного вывода." + }, + "scheduler": { + "tooltip": "Планировщик контролирует, как шум постепенно удаляется для формирования изображения." + }, + "seed": { + "tooltip": "Случайное семя, используемое для создания шума." + }, + "steps": { + "tooltip": "Количество шагов, используемых в процессе уменьшения шума." + } + }, + "outputs": { + "0": { + "tooltip": "Денойзенный латент." + } + } }, "KSamplerAdvanced": { "display_name": "KSampler (Расширенный)" @@ -695,13 +864,45 @@ "display_name": "Планировщик Карраса" }, "LTXVConditioning": { - "display_name": "Кондиционирование LTXV" + "display_name": "Кондиционирование LTXV", + "outputs": { + "0": { + "name": "положительный" + }, + "1": { + "name": "отрицательный" + } + } }, "LTXVImgToVideo": { - "display_name": "LTXVImgToVideo" + "display_name": "LTXVImgToVideo", + "inputs": { + "image_noise_scale": { + "tooltip": "Количество шума, применяемого к латентному изображению." + } + }, + "outputs": { + "0": { + "name": "положительный" + }, + "1": { + "name": "отрицательный" + }, + "2": { + "name": "латентный" + } + } }, "LTXVScheduler": { - "display_name": "Планировщик LTXV" + "display_name": "Планировщик LTXV", + "inputs": { + "stretch": { + "tooltip": "Растянуть сигмы, чтобы они находились в диапазоне [terminal, 1]." + }, + "terminal": { + "tooltip": "Конечное значение сигм после растяжения." + } + } }, "LaplaceScheduler": { "display_name": "Планировщик Лапласа" @@ -777,14 +978,52 @@ }, "LoraLoader": { "description": "LoRA используются для изменения моделей диффузии и CLIP, изменяя способ, которым латенты удаляются от шума, например, применяя стили. Несколько узлов LoRA могут быть связаны вместе.", - "display_name": "Загрузить LoRA" + "display_name": "Загрузить LoRA", + "inputs": { + "clip": { + "tooltip": "Модель CLIP, к которой будет применена LoRA." + }, + "lora_name": { + "tooltip": "Имя LoRA." + }, + "model": { + "tooltip": "Диффузионная модель, к которой будет применена LoRA." + }, + "strength_clip": { + "tooltip": "Насколько сильно модифицировать модель CLIP. Это значение может быть отрицательным." + }, + "strength_model": { + "tooltip": "Насколько сильно модифицировать диффузионную модель. Это значение может быть отрицательным." + } + }, + "outputs": { + "0": { + "tooltip": "Модифицированная модель диффузии." + }, + "1": { + "tooltip": "Модифицированная модель CLIP." + } + } }, "LoraLoaderModelOnly": { "description": "LoRA используются для изменения моделей диффузии и CLIP, изменяя способ, которым латенты удаляются от шума, например, применяя стили. Несколько узлов LoRA могут быть связаны вместе.", - "display_name": "Загрузчик LoRA (Только модель)" + "display_name": "Загрузчик LoRA (Только модель)", + "outputs": { + "0": { + "tooltip": "Модифицированная модель диффузии." + } + } }, "LoraSave": { - "display_name": "Извлечь и сохранить LoRA" + "display_name": "Извлечь и сохранить LoRA", + "inputs": { + "model_diff": { + "tooltip": "Вывод ModelSubtract, который будет преобразован в lora." + }, + "text_encoder_diff": { + "tooltip": "Вывод CLIPSubtract, который будет преобразован в lora." + } + } }, "MaskComposite": { "display_name": "Составная маска" @@ -862,16 +1101,48 @@ "display_name": "Морфология изображения" }, "PairConditioningCombine": { - "display_name": "Объединение пар кондиционирования" + "display_name": "Объединение пар кондиционирования", + "outputs": { + "0": { + "name": "положительный" + }, + "1": { + "name": "отрицательный" + } + } }, "PairConditioningSetDefaultCombine": { - "display_name": "Установить значение по умолчанию для объединения пар кондиционирования" + "display_name": "Установить значение по умолчанию для объединения пар кондиционирования", + "outputs": { + "0": { + "name": "положительный" + }, + "1": { + "name": "отрицательный" + } + } }, "PairConditioningSetProperties": { - "display_name": "Установить свойства пар кондиционирования" + "display_name": "Установить свойства пар кондиционирования", + "outputs": { + "0": { + "name": "положительный" + }, + "1": { + "name": "отрицательный" + } + } }, "PairConditioningSetPropertiesAndCombine": { - "display_name": "Установить свойства пар кондиционирования и объединить" + "display_name": "Установить свойства пар кондиционирования и объединить", + "outputs": { + "0": { + "name": "положительный" + }, + "1": { + "name": "отрицательный" + } + } }, "PatchModelAddDownscale": { "display_name": "Добавить уменьшение модели патча (Kohya Deep Shrink)" @@ -926,19 +1197,68 @@ "display_name": "Планировщик SDTurbo" }, "SD_4XUpscale_Conditioning": { - "display_name": "SD_4XUpscale_Conditioning" + "display_name": "SD_4XUpscale_Conditioning", + "outputs": { + "0": { + "name": "положительный" + }, + "1": { + "name": "отрицательный" + }, + "2": { + "name": "латентный" + } + } }, "SV3D_Conditioning": { - "display_name": "SV3D_Кондиционирование" + "display_name": "SV3D_Кондиционирование", + "outputs": { + "0": { + "name": "положительный" + }, + "1": { + "name": "отрицательный" + }, + "2": { + "name": "латентный" + } + } }, "SVD_img2vid_Conditioning": { - "display_name": "SVD_img2vid_Кондиционирование" + "display_name": "SVD_img2vid_Кондиционирование", + "outputs": { + "0": { + "name": "положительный" + }, + "1": { + "name": "отрицательный" + }, + "2": { + "name": "латентный" + } + } }, "SamplerCustom": { - "display_name": "Пользовательский выборщик" + "display_name": "Пользовательский выборщик", + "outputs": { + "0": { + "name": "выход" + }, + "1": { + "name": "очищенный_выход" + } + } }, "SamplerCustomAdvanced": { - "display_name": "Пользовательский выборщик (Расширенный)" + "display_name": "Пользовательский выборщик (Расширенный)", + "outputs": { + "0": { + "name": "выход" + }, + "1": { + "name": "очищенный_выход" + } + } }, "SamplerDPMAdaptative": { "display_name": "Адаптивный выборщик DPM" @@ -981,7 +1301,15 @@ }, "SaveImage": { "description": "Сохраняет входные изображения в вашу директорию вывода ComfyUI.", - "display_name": "Сохранить изображение" + "display_name": "Сохранить изображение", + "inputs": { + "filename_prefix": { + "tooltip": "Префикс для файла, который нужно сохранить. Это может включать информацию о форматировании, такую как %date:yyyy-MM-dd% или %Empty Latent Image.width%, чтобы включить значения из узлов." + }, + "images": { + "tooltip": "Изображения для сохранения." + } + } }, "SaveImageWebsocket": { "display_name": "Сохранить изображение через веб-сокет" @@ -1019,28 +1347,93 @@ "display_name": "Разделить изображение с альфа-каналом" }, "SplitSigmas": { - "display_name": "Разделить сигмы" + "display_name": "Разделить сигмы", + "outputs": { + "0": { + "name": "высокие_сигмы" + }, + "1": { + "name": "низкие_сигмы" + } + } }, "SplitSigmasDenoise": { - "display_name": "Разделить сигмы для удаления шума" + "display_name": "Разделить сигмы для удаления шума", + "outputs": { + "0": { + "name": "высокие_сигмы" + }, + "1": { + "name": "низкие_сигмы" + } + } }, "StableCascade_EmptyLatentImage": { - "display_name": "StableCascade_Пустое латентное изображение" + "display_name": "StableCascade_Пустое латентное изображение", + "outputs": { + "0": { + "name": "этап_c" + }, + "1": { + "name": "этап_b" + } + } }, "StableCascade_StageB_Conditioning": { "display_name": "StableCascade_Этап B_Кондиционирование" }, "StableCascade_StageC_VAEEncode": { - "display_name": "StableCascade_Этап C_VAE Кодирование" + "display_name": "StableCascade_Этап C_VAE Кодирование", + "outputs": { + "0": { + "name": "этап_c" + }, + "1": { + "name": "этап_b" + } + } }, "StableCascade_SuperResolutionControlnet": { - "display_name": "StableCascade_Суперразрешение Controlnet" + "display_name": "StableCascade_Суперразрешение Controlnet", + "outputs": { + "0": { + "name": "вход_controlnet" + }, + "1": { + "name": "этап_c" + }, + "2": { + "name": "этап_b" + } + } }, "StableZero123_Conditioning": { - "display_name": "StableZero123_Кондиционирование" + "display_name": "StableZero123_Кондиционирование", + "outputs": { + "0": { + "name": "положительный" + }, + "1": { + "name": "отрицательный" + }, + "2": { + "name": "латентный" + } + } }, "StableZero123_Conditioning_Batched": { - "display_name": "StableZero123_Кондиционирование_Пакетное" + "display_name": "StableZero123_Кондиционирование_Пакетное", + "outputs": { + "0": { + "name": "положительный" + }, + "1": { + "name": "отрицательный" + }, + "2": { + "name": "латентный" + } + } }, "StyleModelApply": { "display_name": "Применить модель стиля" @@ -1078,7 +1471,20 @@ }, "VAEDecode": { "description": "Декодирует латентные изображения обратно в изображения в пиксельном пространстве.", - "display_name": "Декодировать VAE" + "display_name": "Декодировать VAE", + "inputs": { + "samples": { + "tooltip": "Латентное изображение для декодирования." + }, + "vae": { + "tooltip": "Модель VAE, используемая для декодирования латентного изображения." + } + }, + "outputs": { + "0": { + "tooltip": "Декодированное изображение." + } + } }, "VAEDecodeAudio": { "display_name": "Декодировать аудио VAE" diff --git a/src/locales/zh.json b/src/locales/zh.json index fee50dfd1..4a7568a40 100644 --- a/src/locales/zh.json +++ b/src/locales/zh.json @@ -371,7 +371,20 @@ }, "CLIPTextEncode": { "description": "使用CLIP模型对文本提示进行编码,生成可以引导扩散模型生成特定图像的嵌入。", - "display_name": "CLIP文本编码(提示)" + "display_name": "CLIP文本编码(提示)", + "inputs": { + "clip": { + "tooltip": "用于编码文本的 CLIP 模型。" + }, + "text": { + "tooltip": "要编码的文本。" + } + }, + "outputs": { + "0": { + "tooltip": "包含嵌入文本的条件,用于引导扩散模型。" + } + } }, "CLIPTextEncodeControlnet": { "display_name": "CLIP文本编码控制网" @@ -405,7 +418,23 @@ }, "CheckpointLoaderSimple": { "description": "加载扩散模型检查点,扩散模型用于去噪潜在图像。", - "display_name": "加载检查点" + "display_name": "加载检查点", + "inputs": { + "ckpt_name": { + "tooltip": "要加载的检查点(模型)的名称。" + } + }, + "outputs": { + "0": { + "tooltip": "用于去噪潜在变量的模型。" + }, + "1": { + "tooltip": "用于编码文本提示的CLIP模型。" + }, + "2": { + "tooltip": "用于将图像编码和解码到潜在空间的VAE模型。" + } + } }, "CheckpointSave": { "display_name": "保存检查点" @@ -453,7 +482,15 @@ "display_name": "条件设置时间步范围" }, "ConditioningTimestepsRange": { - "display_name": "时间步范围" + "display_name": "时间步范围", + "outputs": { + "1": { + "name": "范围前" + }, + "2": { + "name": "范围后" + } + } }, "ConditioningZeroOut": { "display_name": "条件零化" @@ -462,25 +499,64 @@ "display_name": "应用控制网(旧)" }, "ControlNetApplyAdvanced": { - "display_name": "应用控制网" + "display_name": "应用控制网", + "outputs": { + "0": { + "name": "正面" + }, + "1": { + "name": "负面" + } + } }, "ControlNetApplySD3": { - "display_name": "应用控制网与VAE" + "display_name": "应用控制网与VAE", + "outputs": { + "0": { + "name": "正面" + }, + "1": { + "name": "负面" + } + } }, "ControlNetInpaintingAliMamaApply": { - "display_name": "控制网修复AliMama应用" + "display_name": "控制网修复AliMama应用", + "outputs": { + "0": { + "name": "正面" + }, + "1": { + "name": "负面" + } + } }, "ControlNetLoader": { "display_name": "加载控制网模型" }, "CreateHookKeyframe": { - "display_name": "创建钩子关键帧" + "display_name": "创建钩子关键帧", + "outputs": { + "0": { + "name": "钩子关键帧" + } + } }, "CreateHookKeyframesFromFloats": { - "display_name": "从浮点数创建钩子关键帧" + "display_name": "从浮点数创建钩子关键帧", + "outputs": { + "0": { + "name": "钩子关键帧" + } + } }, "CreateHookKeyframesInterpolated": { - "display_name": "创建插值钩子关键帧" + "display_name": "创建插值钩子关键帧", + "outputs": { + "0": { + "name": "钩子关键帧" + } + } }, "CreateHookLora": { "display_name": "创建钩子LoRA" @@ -531,7 +607,15 @@ }, "DevToolsNodeWithOutputList": { "description": "一个具有输出列表的节点", - "display_name": "具有输出列表的节点" + "display_name": "具有输出列表的节点", + "outputs": { + "0": { + "name": "整数输出" + }, + "1": { + "name": "整数列表输出" + } + } }, "DevToolsNodeWithStringInput": { "description": "一个具有字符串输入的节点", @@ -567,11 +651,32 @@ "display_name": "空LTXV潜在视频" }, "EmptyLatentAudio": { - "display_name": "空潜在音频" + "display_name": "空潜在音频", + "inputs": { + "batch_size": { + "tooltip": "批次中的潜在图像数量。" + } + } }, "EmptyLatentImage": { "description": "创建一批新的空潜在图像,以通过采样进行去噪。", - "display_name": "空潜在图像" + "display_name": "空潜在图像", + "inputs": { + "batch_size": { + "tooltip": "批次中的潜在图像数量。" + }, + "height": { + "tooltip": "潜在图像的高度(以像素为单位)。" + }, + "width": { + "tooltip": "潜在图像的宽度(以像素为单位)。" + } + }, + "outputs": { + "0": { + "tooltip": "空的潜在图像批次。" + } + } }, "EmptyMochiLatentVideo": { "display_name": "空Mochi潜在视频" @@ -670,10 +775,37 @@ "display_name": "使用模型放大图像" }, "InpaintModelConditioning": { - "display_name": "修复模型条件" + "display_name": "修复模型条件", + "inputs": { + "noise_mask": { + "tooltip": "向潜在图像添加噪声掩码,以便采样仅在掩码内进行。根据模型的不同,可能会改善结果或完全破坏效果。" + } + }, + "outputs": { + "0": { + "name": "正面" + }, + "1": { + "name": "负面" + }, + "2": { + "name": "潜在" + } + } }, "InstructPixToPixConditioning": { - "display_name": "指令像素到像素条件" + "display_name": "指令像素到像素条件", + "outputs": { + "0": { + "name": "正面" + }, + "1": { + "name": "负面" + }, + "2": { + "name": "潜在" + } + } }, "InvertMask": { "display_name": "反转掩码" @@ -683,7 +815,44 @@ }, "KSampler": { "description": "使用提供的模型、正向和负向条件去噪潜在图像。", - "display_name": "K采样器" + "display_name": "K采样器", + "inputs": { + "cfg": { + "tooltip": "无分类器引导比例平衡创造力和对提示的遵循。更高的值会导致图像更接近提示,但过高的值会对质量产生负面影响。" + }, + "denoise": { + "tooltip": "应用的去噪量,较低的值将保持初始图像的结构,允许图像到图像的采样。" + }, + "latent_image": { + "tooltip": "要去噪的潜在图像。" + }, + "model": { + "tooltip": "用于去噪输入潜在图像的模型。" + }, + "negative": { + "tooltip": "描述您希望在图像中排除的属性的条件。" + }, + "positive": { + "tooltip": "描述您希望在图像中包含的属性的条件。" + }, + "sampler_name": { + "tooltip": "在采样时使用的算法,这会影响生成输出的质量、速度和风格。" + }, + "scheduler": { + "tooltip": "调度器控制噪声如何逐渐去除以形成图像。" + }, + "seed": { + "tooltip": "用于生成噪声的随机种子。" + }, + "steps": { + "tooltip": "去噪过程中使用的步骤数量。" + } + }, + "outputs": { + "0": { + "tooltip": "去噪后的潜在变量。" + } + } }, "KSamplerAdvanced": { "display_name": "K采样器(高级)" @@ -695,13 +864,45 @@ "display_name": "Karras调度器" }, "LTXVConditioning": { - "display_name": "LTXV条件" + "display_name": "LTXV条件", + "outputs": { + "0": { + "name": "正面" + }, + "1": { + "name": "负面" + } + } }, "LTXVImgToVideo": { - "display_name": "LTXV图像到视频" + "display_name": "LTXV图像到视频", + "inputs": { + "image_noise_scale": { + "tooltip": "在条件图像潜在图像上应用的噪声量。" + } + }, + "outputs": { + "0": { + "name": "正面" + }, + "1": { + "name": "负面" + }, + "2": { + "name": "潜在" + } + } }, "LTXVScheduler": { - "display_name": "LTXV调度器" + "display_name": "LTXV调度器", + "inputs": { + "stretch": { + "tooltip": "将 sigma 拉伸到范围 [terminal, 1]。" + }, + "terminal": { + "tooltip": "拉伸后 sigma 的终值。" + } + } }, "LaplaceScheduler": { "display_name": "拉普拉斯调度器" @@ -777,14 +978,52 @@ }, "LoraLoader": { "description": "LoRA用于修改扩散和CLIP模型,改变潜在图像的去噪方式,例如应用风格。多个LoRA节点可以链接在一起。", - "display_name": "加载LoRA" + "display_name": "加载LoRA", + "inputs": { + "clip": { + "tooltip": "LoRA 将应用于的 CLIP 模型。" + }, + "lora_name": { + "tooltip": "LoRA 的名称。" + }, + "model": { + "tooltip": "LoRA 将应用于的扩散模型。" + }, + "strength_clip": { + "tooltip": "修改 CLIP 模型的强度。此值可以为负。" + }, + "strength_model": { + "tooltip": "修改扩散模型的强度。此值可以为负。" + } + }, + "outputs": { + "0": { + "tooltip": "修改后的扩散模型。" + }, + "1": { + "tooltip": "修改后的CLIP模型。" + } + } }, "LoraLoaderModelOnly": { "description": "LoRA用于修改扩散和CLIP模型,改变潜在图像的去噪方式,例如应用风格。多个LoRA节点可以链接在一起。", - "display_name": "仅加载LoRA模型" + "display_name": "仅加载LoRA模型", + "outputs": { + "0": { + "tooltip": "修改后的扩散模型。" + } + } }, "LoraSave": { - "display_name": "提取并保存LoRA" + "display_name": "提取并保存LoRA", + "inputs": { + "model_diff": { + "tooltip": "要转换为 LoRA 的 ModelSubtract 输出。" + }, + "text_encoder_diff": { + "tooltip": "要转换为 LoRA 的 CLIPSubtract 输出。" + } + } }, "MaskComposite": { "display_name": "掩码合成" @@ -862,16 +1101,48 @@ "display_name": "图像形态学" }, "PairConditioningCombine": { - "display_name": "条件对组合" + "display_name": "条件对组合", + "outputs": { + "0": { + "name": "正面" + }, + "1": { + "name": "负面" + } + } }, "PairConditioningSetDefaultCombine": { - "display_name": "条件对设置默认组合" + "display_name": "条件对设置默认组合", + "outputs": { + "0": { + "name": "正面" + }, + "1": { + "name": "负面" + } + } }, "PairConditioningSetProperties": { - "display_name": "条件对设置属性" + "display_name": "条件对设置属性", + "outputs": { + "0": { + "name": "正面" + }, + "1": { + "name": "负面" + } + } }, "PairConditioningSetPropertiesAndCombine": { - "display_name": "条件对设置属性组合" + "display_name": "条件对设置属性组合", + "outputs": { + "0": { + "name": "正面" + }, + "1": { + "name": "负面" + } + } }, "PatchModelAddDownscale": { "display_name": "补丁模型添加下采样(Kohya深度缩小)" @@ -926,19 +1197,68 @@ "display_name": "SDTurbo调度器" }, "SD_4XUpscale_Conditioning": { - "display_name": "SD_4X放大条件" + "display_name": "SD_4X放大条件", + "outputs": { + "0": { + "name": "正面" + }, + "1": { + "name": "负面" + }, + "2": { + "name": "潜在" + } + } }, "SV3D_Conditioning": { - "display_name": "SV3D条件" + "display_name": "SV3D条件", + "outputs": { + "0": { + "name": "正面" + }, + "1": { + "name": "负面" + }, + "2": { + "name": "潜在" + } + } }, "SVD_img2vid_Conditioning": { - "display_name": "SVD_img2vid条件" + "display_name": "SVD_img2vid条件", + "outputs": { + "0": { + "name": "正面" + }, + "1": { + "name": "负面" + }, + "2": { + "name": "潜在" + } + } }, "SamplerCustom": { - "display_name": "自定义采样器" + "display_name": "自定义采样器", + "outputs": { + "0": { + "name": "输出" + }, + "1": { + "name": "去噪输出" + } + } }, "SamplerCustomAdvanced": { - "display_name": "自定义采样器(高级)" + "display_name": "自定义采样器(高级)", + "outputs": { + "0": { + "name": "输出" + }, + "1": { + "name": "去噪输出" + } + } }, "SamplerDPMAdaptative": { "display_name": "自适应DPM采样器" @@ -981,7 +1301,15 @@ }, "SaveImage": { "description": "将输入图像保存到您的ComfyUI输出目录。", - "display_name": "保存图像" + "display_name": "保存图像", + "inputs": { + "filename_prefix": { + "tooltip": "要保存的文件的前缀。这可能包括格式信息,例如 %date:yyyy-MM-dd% 或 %Empty Latent Image.width% 以包含节点中的值。" + }, + "images": { + "tooltip": "要保存的图像。" + } + } }, "SaveImageWebsocket": { "display_name": "保存图像Websocket" @@ -1019,28 +1347,93 @@ "display_name": "按Alpha分割图像" }, "SplitSigmas": { - "display_name": "分割Sigma" + "display_name": "分割Sigma", + "outputs": { + "0": { + "name": "高方差" + }, + "1": { + "name": "低方差" + } + } }, "SplitSigmasDenoise": { - "display_name": "分割Sigma去噪" + "display_name": "分割Sigma去噪", + "outputs": { + "0": { + "name": "高方差" + }, + "1": { + "name": "低方差" + } + } }, "StableCascade_EmptyLatentImage": { - "display_name": "稳定级联_空潜在图像" + "display_name": "稳定级联_空潜在图像", + "outputs": { + "0": { + "name": "阶段C" + }, + "1": { + "name": "阶段B" + } + } }, "StableCascade_StageB_Conditioning": { "display_name": "稳定级联_B阶段条件" }, "StableCascade_StageC_VAEEncode": { - "display_name": "稳定级联_C阶段VAE编码" + "display_name": "稳定级联_C阶段VAE编码", + "outputs": { + "0": { + "name": "阶段C" + }, + "1": { + "name": "阶段B" + } + } }, "StableCascade_SuperResolutionControlnet": { - "display_name": "稳定级联_超分辨率控制网" + "display_name": "稳定级联_超分辨率控制网", + "outputs": { + "0": { + "name": "控制网输入" + }, + "1": { + "name": "阶段C" + }, + "2": { + "name": "阶段B" + } + } }, "StableZero123_Conditioning": { - "display_name": "稳定零123条件" + "display_name": "稳定零123条件", + "outputs": { + "0": { + "name": "正面" + }, + "1": { + "name": "负面" + }, + "2": { + "name": "潜在" + } + } }, "StableZero123_Conditioning_Batched": { - "display_name": "稳定零123条件_批处理" + "display_name": "稳定零123条件_批处理", + "outputs": { + "0": { + "name": "正面" + }, + "1": { + "name": "负面" + }, + "2": { + "name": "潜在" + } + } }, "StyleModelApply": { "display_name": "应用风格模型" @@ -1078,7 +1471,20 @@ }, "VAEDecode": { "description": "将潜在图像解码回像素空间图像。", - "display_name": "VAE解码" + "display_name": "VAE解码", + "inputs": { + "samples": { + "tooltip": "要解码的潜在图像。" + }, + "vae": { + "tooltip": "用于解码潜在图像的 VAE 模型。" + } + }, + "outputs": { + "0": { + "tooltip": "解码后的图像。" + } + } }, "VAEDecodeAudio": { "display_name": "VAE解码音频" diff --git a/src/scripts/app.ts b/src/scripts/app.ts index e986cc5e9..6a8b5015f 100644 --- a/src/scripts/app.ts +++ b/src/scripts/app.ts @@ -61,7 +61,8 @@ import { type IBaseWidget } from '@comfyorg/litegraph/dist/types/widgets' import { workflowService } from '@/services/workflowService' import { useWidgetStore } from '@/stores/widgetStore' import { deserialiseAndCreate } from '@/extensions/core/vintageClipboard' -import { st } from '@/i18n' +import { st, t, te } from '@/i18n' +import { normalizeI18nKey } from '@/utils/formatUtil' export const ANIM_PREVIEW_WIDGET = '$$comfy_animation_preview' @@ -1932,9 +1933,16 @@ export class ComfyApp { } } else { // Node connection inputs - const inputOptions = inputIsRequired + const shapeOptions = inputIsRequired ? {} : { shape: LiteGraph.SlotShape.HollowCircle } + const inputOptions = { + ...shapeOptions, + label: st( + `nodeDefs.${normalizeI18nKey(nodeData.name)}.inputs.${normalizeI18nKey(inputName)}.name`, + inputName + ) + } this.addInput(inputName, type, inputOptions) widgetCreated = false } @@ -1964,9 +1972,15 @@ export class ComfyApp { if (output instanceof Array) output = 'COMBO' const outputName = nodeData['output_name'][o] || output const outputIsList = nodeData['output_is_list'][o] - const outputOptions = outputIsList + const shapeOptions = outputIsList ? { shape: LiteGraph.GRID_SHAPE } : {} + const nameKey = `nodeDefs.${normalizeI18nKey(nodeData.name)}.outputs.${o}.name` + const typeKey = `dataTypes.${normalizeI18nKey(output)}` + const outputOptions = { + ...shapeOptions, + label: te(nameKey) ? t(nameKey) : st(typeKey, outputName) + } this.addOutput(outputName, output, outputOptions) } @@ -1980,7 +1994,7 @@ export class ComfyApp { } configure(data: any) { - // Keep 'name', 'type', and 'shape' information from the original node definition. + // Keep 'name', 'type', 'shape', and 'label' information from the original node definition. const merge = ( current: Record, incoming: Record @@ -1991,7 +2005,7 @@ export class ComfyApp { this.inputs.push(current as INodeInputSlot) return incoming } - for (const key of ['name', 'type', 'shape']) { + for (const key of ['name', 'type', 'shape', 'label']) { if (current[key] !== undefined) { result[key] = current[key] } diff --git a/src/stores/nodeDefStore.ts b/src/stores/nodeDefStore.ts index 89ca88c06..ef3792d49 100644 --- a/src/stores/nodeDefStore.ts +++ b/src/stores/nodeDefStore.ts @@ -9,7 +9,7 @@ import { type InputSpec } from '@/types/apiTypes' import { defineStore } from 'pinia' -import { TreeNode } from 'primevue/treenode' +import type { TreeNode } from 'primevue/treenode' import { buildTree } from '@/utils/treeUtil' import { computed, ref } from 'vue' import axios from 'axios'