From 517ae56763dccfd7f91bbf484267fd4ae8678392 Mon Sep 17 00:00:00 2001 From: Chenlei Hu Date: Fri, 6 Dec 2024 13:56:54 -0800 Subject: [PATCH] Translate node title and description (#1822) * Collect node def i18n * Add collected en locale * Sort by node id * Add translations * Show translated node def * Update locales [skip ci] --------- Co-authored-by: github-actions --- browser_tests/fixtures/ComfyPage.ts | 29 +- scripts/collect-i18n.ts | 26 +- src/components/graph/GraphCanvas.vue | 12 +- src/locales/en.json | 795 +++++++++++++++++++++++++++ src/locales/ja.json | 795 +++++++++++++++++++++++++++ src/locales/ru.json | 795 +++++++++++++++++++++++++++ src/locales/zh.json | 795 +++++++++++++++++++++++++++ src/scripts/app.ts | 40 +- 8 files changed, 3265 insertions(+), 22 deletions(-) diff --git a/browser_tests/fixtures/ComfyPage.ts b/browser_tests/fixtures/ComfyPage.ts index 6428c9531..98ddf01e8 100644 --- a/browser_tests/fixtures/ComfyPage.ts +++ b/browser_tests/fixtures/ComfyPage.ts @@ -846,18 +846,23 @@ export const comfyPageFixture = base.extend<{ comfyPage: ComfyPage }>({ const userId = await comfyPage.setupUser(username) comfyPage.userIds[parallelIndex] = userId - await comfyPage.setupSettings({ - 'Comfy.UseNewMenu': 'Disabled', - // Hide canvas menu/info by default. - 'Comfy.Graph.CanvasInfo': false, - 'Comfy.Graph.CanvasMenu': false, - // Hide all badges by default. - 'Comfy.NodeBadge.NodeIdBadgeMode': NodeBadgeMode.None, - 'Comfy.NodeBadge.NodeSourceBadgeMode': NodeBadgeMode.None, - // Disable tooltips by default to avoid flakiness. - 'Comfy.EnableTooltips': false, - 'Comfy.userId': userId - }) + try { + await comfyPage.setupSettings({ + 'Comfy.UseNewMenu': 'Disabled', + // Hide canvas menu/info by default. + 'Comfy.Graph.CanvasInfo': false, + 'Comfy.Graph.CanvasMenu': false, + // Hide all badges by default. + 'Comfy.NodeBadge.NodeIdBadgeMode': NodeBadgeMode.None, + 'Comfy.NodeBadge.NodeSourceBadgeMode': NodeBadgeMode.None, + // Disable tooltips by default to avoid flakiness. + 'Comfy.EnableTooltips': false, + 'Comfy.userId': userId + }) + } catch (e) { + console.error(e) + } + await comfyPage.setup() await use(comfyPage) } diff --git a/scripts/collect-i18n.ts b/scripts/collect-i18n.ts index d0a9817c6..c77e0b8ac 100644 --- a/scripts/collect-i18n.ts +++ b/scripts/collect-i18n.ts @@ -5,6 +5,7 @@ import { SERVER_CONFIG_ITEMS } from '../src/constants/serverConfig' import { formatCamelCase, normalizeI18nKey } from '../src/utils/formatUtil' import type { ComfyCommandImpl } from '../src/stores/commandStore' import type { FormItem, SettingParams } from '../src/types/settingTypes' +import type { ComfyApi } from '../src/scripts/api' const localePath = './src/locales/en.json' const extractMenuCommandLocaleStrings = (): Set => { @@ -27,6 +28,8 @@ test('collect-i18n', async ({ comfyPage }) => { }) const locale = JSON.parse(fs.readFileSync(localePath, 'utf-8')) + + // Commands const menuLabels = extractMenuCommandLocaleStrings() const commandMenuLabels = new Set( commands.map((command) => command.menubarLabel ?? command.label ?? '') @@ -38,6 +41,7 @@ test('collect-i18n', async ({ comfyPage }) => { Array.from(allLabels).map((label) => [normalizeI18nKey(label), label]) ) + // Settings const settings = await comfyPage.page.evaluate(() => { const workspace = window['app'].extensionManager const settings = workspace.setting.settings as Record @@ -72,6 +76,7 @@ test('collect-i18n', async ({ comfyPage }) => { ]) ) + // Server Configs const allServerConfigsLocale = Object.fromEntries( SERVER_CONFIG_ITEMS.map((config) => [ normalizeI18nKey(config.id), @@ -91,6 +96,24 @@ 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() + }) + + const allNodeDefsLocale = Object.fromEntries( + Object.values(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 + } + ]) + ) + fs.writeFileSync( localePath, JSON.stringify( @@ -105,7 +128,8 @@ test('collect-i18n', async ({ comfyPage }) => { ...allSettingCategoriesLocale }, serverConfigItems: allServerConfigsLocale, - serverConfigCategories: allServerConfigCategoriesLocale + serverConfigCategories: allServerConfigCategoriesLocale, + nodeDefs: allNodeDefsLocale }, null, 2 diff --git a/src/components/graph/GraphCanvas.vue b/src/components/graph/GraphCanvas.vue index 0ff030fa4..8053a7418 100644 --- a/src/components/graph/GraphCanvas.vue +++ b/src/components/graph/GraphCanvas.vue @@ -33,7 +33,7 @@ import LiteGraphCanvasSplitterOverlay from '@/components/LiteGraphCanvasSplitter import NodeSearchboxPopover from '@/components/searchbox/NodeSearchBoxPopover.vue' import NodeTooltip from '@/components/graph/NodeTooltip.vue' import NodeBadge from '@/components/graph/NodeBadge.vue' -import { ref, computed, onMounted, watchEffect } from 'vue' +import { ref, computed, onMounted, watchEffect, watch } from 'vue' import { app as comfyApp } from '@/scripts/app' import { useSettingStore } from '@/stores/settingStore' import { ComfyNodeDefImpl, useNodeDefStore } from '@/stores/nodeDefStore' @@ -63,6 +63,7 @@ import { useWorkflowStore } from '@/stores/workflowStore' import { setStorageValue } from '@/scripts/utils' import { ChangeTracker } from '@/scripts/changeTracker' import { api } from '@/scripts/api' +import { useCommandStore } from '@/stores/commandStore' const emit = defineEmits(['ready']) const canvasRef = ref(null) @@ -312,6 +313,15 @@ onMounted(async () => { window['graph'] = comfyApp.graph comfyAppReady.value = true + + // Start watching for locale change after the initial value is loaded. + watch( + () => settingStore.get('Comfy.Locale'), + () => { + useCommandStore().execute('Comfy.RefreshNodeDefinitions') + } + ) + emit('ready') }) diff --git a/src/locales/en.json b/src/locales/en.json index 3b779a135..d50b1664a 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -753,5 +753,800 @@ "Cache": "Cache", "Attention": "Attention", "General": "General" + }, + "nodeDefs": { + "AddNoise": { + "display_name": "AddNoise" + }, + "AlignYourStepsScheduler": { + "display_name": "AlignYourStepsScheduler" + }, + "BasicGuider": { + "display_name": "BasicGuider" + }, + "BasicScheduler": { + "display_name": "BasicScheduler" + }, + "BetaSamplingScheduler": { + "display_name": "BetaSamplingScheduler" + }, + "Canny": { + "display_name": "Canny" + }, + "CFGGuider": { + "display_name": "CFGGuider" + }, + "CheckpointLoader": { + "display_name": "Load Checkpoint With Config (DEPRECATED)" + }, + "CheckpointLoaderSimple": { + "display_name": "Load Checkpoint", + "description": "Loads a diffusion model checkpoint, diffusion models are used to denoise latents." + }, + "CheckpointSave": { + "display_name": "Save Checkpoint" + }, + "CLIPAttentionMultiply": { + "display_name": "CLIPAttentionMultiply" + }, + "CLIPLoader": { + "display_name": "Load CLIP", + "description": "[Recipes]\n\nstable_diffusion: clip-l\nstable_cascade: clip-g\nsd3: t5 / clip-g / clip-l\nstable_audio: t5\nmochi: t5" + }, + "CLIPMergeAdd": { + "display_name": "CLIPMergeAdd" + }, + "CLIPMergeSimple": { + "display_name": "CLIPMergeSimple" + }, + "CLIPMergeSubtract": { + "display_name": "CLIPMergeSubtract" + }, + "CLIPSave": { + "display_name": "CLIPSave" + }, + "CLIPSetLastLayer": { + "display_name": "CLIP Set Last Layer" + }, + "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." + }, + "CLIPTextEncodeControlnet": { + "display_name": "CLIPTextEncodeControlnet" + }, + "CLIPTextEncodeFlux": { + "display_name": "CLIPTextEncodeFlux" + }, + "CLIPTextEncodeHunyuanDiT": { + "display_name": "CLIPTextEncodeHunyuanDiT" + }, + "CLIPTextEncodeSD3": { + "display_name": "CLIPTextEncodeSD3" + }, + "CLIPTextEncodeSDXL": { + "display_name": "CLIPTextEncodeSDXL" + }, + "CLIPTextEncodeSDXLRefiner": { + "display_name": "CLIPTextEncodeSDXLRefiner" + }, + "CLIPVisionEncode": { + "display_name": "CLIP Vision Encode" + }, + "CLIPVisionLoader": { + "display_name": "Load CLIP Vision" + }, + "CombineHooks2": { + "display_name": "Combine Hooks [2]" + }, + "CombineHooks4": { + "display_name": "Combine Hooks [4]" + }, + "CombineHooks8": { + "display_name": "Combine Hooks [8]" + }, + "ConditioningAverage": { + "display_name": "ConditioningAverage" + }, + "ConditioningCombine": { + "display_name": "Conditioning (Combine)" + }, + "ConditioningConcat": { + "display_name": "Conditioning (Concat)" + }, + "ConditioningSetArea": { + "display_name": "Conditioning (Set Area)" + }, + "ConditioningSetAreaPercentage": { + "display_name": "Conditioning (Set Area with Percentage)" + }, + "ConditioningSetAreaStrength": { + "display_name": "ConditioningSetAreaStrength" + }, + "ConditioningSetDefaultCombine": { + "display_name": "Cond Set Default Combine" + }, + "ConditioningSetMask": { + "display_name": "Conditioning (Set Mask)" + }, + "ConditioningSetProperties": { + "display_name": "Cond Set Props" + }, + "ConditioningSetPropertiesAndCombine": { + "display_name": "Cond Set Props Combine" + }, + "ConditioningSetTimestepRange": { + "display_name": "ConditioningSetTimestepRange" + }, + "ConditioningTimestepsRange": { + "display_name": "Timesteps Range" + }, + "ConditioningZeroOut": { + "display_name": "ConditioningZeroOut" + }, + "ControlNetApply": { + "display_name": "Apply ControlNet (OLD)" + }, + "ControlNetApplyAdvanced": { + "display_name": "Apply ControlNet" + }, + "ControlNetApplySD3": { + "display_name": "Apply Controlnet with VAE" + }, + "ControlNetInpaintingAliMamaApply": { + "display_name": "ControlNetInpaintingAliMamaApply" + }, + "ControlNetLoader": { + "display_name": "Load ControlNet Model" + }, + "CreateHookKeyframe": { + "display_name": "Create Hook Keyframe" + }, + "CreateHookKeyframesFromFloats": { + "display_name": "Create Hook Keyframes From Floats" + }, + "CreateHookKeyframesInterpolated": { + "display_name": "Create Hook Keyframes Interp." + }, + "CreateHookLora": { + "display_name": "Create Hook LoRA" + }, + "CreateHookLoraModelOnly": { + "display_name": "Create Hook LoRA (MO)" + }, + "CreateHookModelAsLora": { + "display_name": "Create Hook Model as LoRA" + }, + "CreateHookModelAsLoraModelOnly": { + "display_name": "Create Hook Model as LoRA (MO)" + }, + "CropMask": { + "display_name": "CropMask" + }, + "DevToolsDeprecatedNode": { + "display_name": "Deprecated Node", + "description": "A deprecated node" + }, + "DevToolsErrorRaiseNode": { + "display_name": "Raise Error", + "description": "Raise an error for development purposes" + }, + "DevToolsErrorRaiseNodeWithMessage": { + "display_name": "Raise Error with Message", + "description": "Raise an error with message for development purposes" + }, + "DevToolsExperimentalNode": { + "display_name": "Experimental Node", + "description": "A experimental node" + }, + "DevToolsLongComboDropdown": { + "display_name": "Long Combo Dropdown", + "description": "A long combo dropdown" + }, + "DevToolsNodeWithForceInput": { + "display_name": "Node With Force Input", + "description": "A node with a forced input" + }, + "DevToolsNodeWithOnlyOptionalInput": { + "display_name": "Node With Only Optional Input", + "description": "A node with only optional input" + }, + "DevToolsNodeWithOptionalInput": { + "display_name": "Node With Optional Input", + "description": "A node with an optional input" + }, + "DevToolsNodeWithOutputList": { + "display_name": "Node With Output List", + "description": "A node with an output list" + }, + "DevToolsNodeWithStringInput": { + "display_name": "Node With String Input", + "description": "A node with a string input" + }, + "DevToolsNodeWithUnionInput": { + "display_name": "Node With Union Input", + "description": "A node with a union input" + }, + "DiffControlNetLoader": { + "display_name": "Load ControlNet Model (diff)" + }, + "DifferentialDiffusion": { + "display_name": "Differential Diffusion" + }, + "DiffusersLoader": { + "display_name": "DiffusersLoader" + }, + "DisableNoise": { + "display_name": "DisableNoise" + }, + "DualCFGGuider": { + "display_name": "DualCFGGuider" + }, + "DualCLIPLoader": { + "display_name": "DualCLIPLoader", + "description": "[Recipes]\n\nsdxl: clip-l, clip-g\nsd3: clip-l, clip-g / clip-l, t5 / clip-g, t5\nflux: clip-l, t5" + }, + "EmptyImage": { + "display_name": "EmptyImage" + }, + "EmptyLatentAudio": { + "display_name": "EmptyLatentAudio" + }, + "EmptyLatentImage": { + "display_name": "Empty Latent Image", + "description": "Create a new batch of empty latent images to be denoised via sampling." + }, + "EmptyLTXVLatentVideo": { + "display_name": "EmptyLTXVLatentVideo" + }, + "EmptyMochiLatentVideo": { + "display_name": "EmptyMochiLatentVideo" + }, + "EmptySD3LatentImage": { + "display_name": "EmptySD3LatentImage" + }, + "ExponentialScheduler": { + "display_name": "ExponentialScheduler" + }, + "FeatherMask": { + "display_name": "FeatherMask" + }, + "FlipSigmas": { + "display_name": "FlipSigmas" + }, + "FluxGuidance": { + "display_name": "FluxGuidance" + }, + "FreeU": { + "display_name": "FreeU" + }, + "FreeU_V2": { + "display_name": "FreeU_V2" + }, + "GITSScheduler": { + "display_name": "GITSScheduler" + }, + "GLIGENLoader": { + "display_name": "GLIGENLoader" + }, + "GLIGENTextBoxApply": { + "display_name": "GLIGENTextBoxApply" + }, + "GrowMask": { + "display_name": "GrowMask" + }, + "HypernetworkLoader": { + "display_name": "HypernetworkLoader" + }, + "HyperTile": { + "display_name": "HyperTile" + }, + "ImageBatch": { + "display_name": "Batch Images" + }, + "ImageBlend": { + "display_name": "Image Blend" + }, + "ImageBlur": { + "display_name": "Image Blur" + }, + "ImageColorToMask": { + "display_name": "ImageColorToMask" + }, + "ImageCompositeMasked": { + "display_name": "ImageCompositeMasked" + }, + "ImageCrop": { + "display_name": "Image Crop" + }, + "ImageFromBatch": { + "display_name": "ImageFromBatch" + }, + "ImageInvert": { + "display_name": "Invert Image" + }, + "ImageOnlyCheckpointLoader": { + "display_name": "Image Only Checkpoint Loader (img2vid model)" + }, + "ImageOnlyCheckpointSave": { + "display_name": "ImageOnlyCheckpointSave" + }, + "ImagePadForOutpaint": { + "display_name": "Pad Image for Outpainting" + }, + "ImageQuantize": { + "display_name": "Image Quantize" + }, + "ImageScale": { + "display_name": "Upscale Image" + }, + "ImageScaleBy": { + "display_name": "Upscale Image By" + }, + "ImageScaleToTotalPixels": { + "display_name": "Scale Image to Total Pixels" + }, + "ImageSharpen": { + "display_name": "Image Sharpen" + }, + "ImageToMask": { + "display_name": "Convert Image to Mask" + }, + "ImageUpscaleWithModel": { + "display_name": "Upscale Image (using Model)" + }, + "InpaintModelConditioning": { + "display_name": "InpaintModelConditioning" + }, + "InstructPixToPixConditioning": { + "display_name": "InstructPixToPixConditioning" + }, + "InvertMask": { + "display_name": "InvertMask" + }, + "JoinImageWithAlpha": { + "display_name": "Join Image with Alpha" + }, + "KarrasScheduler": { + "display_name": "KarrasScheduler" + }, + "KSampler": { + "display_name": "KSampler", + "description": "Uses the provided model, positive and negative conditioning to denoise the latent image." + }, + "KSamplerAdvanced": { + "display_name": "KSampler (Advanced)" + }, + "KSamplerSelect": { + "display_name": "KSamplerSelect" + }, + "LaplaceScheduler": { + "display_name": "LaplaceScheduler" + }, + "LatentAdd": { + "display_name": "LatentAdd" + }, + "LatentApplyOperation": { + "display_name": "LatentApplyOperation" + }, + "LatentApplyOperationCFG": { + "display_name": "LatentApplyOperationCFG" + }, + "LatentBatch": { + "display_name": "LatentBatch" + }, + "LatentBatchSeedBehavior": { + "display_name": "LatentBatchSeedBehavior" + }, + "LatentBlend": { + "display_name": "Latent Blend" + }, + "LatentComposite": { + "display_name": "Latent Composite" + }, + "LatentCompositeMasked": { + "display_name": "LatentCompositeMasked" + }, + "LatentCrop": { + "display_name": "Crop Latent" + }, + "LatentFlip": { + "display_name": "Flip Latent" + }, + "LatentFromBatch": { + "display_name": "Latent From Batch" + }, + "LatentInterpolate": { + "display_name": "LatentInterpolate" + }, + "LatentMultiply": { + "display_name": "LatentMultiply" + }, + "LatentOperationSharpen": { + "display_name": "LatentOperationSharpen" + }, + "LatentOperationTonemapReinhard": { + "display_name": "LatentOperationTonemapReinhard" + }, + "LatentRotate": { + "display_name": "Rotate Latent" + }, + "LatentSubtract": { + "display_name": "LatentSubtract" + }, + "LatentUpscale": { + "display_name": "Upscale Latent" + }, + "LatentUpscaleBy": { + "display_name": "Upscale Latent By" + }, + "LoadAudio": { + "display_name": "LoadAudio" + }, + "LoadImage": { + "display_name": "Load Image" + }, + "LoadImageMask": { + "display_name": "Load Image (as Mask)" + }, + "LoadLatent": { + "display_name": "LoadLatent" + }, + "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." + }, + "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." + }, + "LoraSave": { + "display_name": "Extract and Save Lora" + }, + "LTXVConditioning": { + "display_name": "LTXVConditioning" + }, + "LTXVImgToVideo": { + "display_name": "LTXVImgToVideo" + }, + "LTXVScheduler": { + "display_name": "LTXVScheduler" + }, + "MaskComposite": { + "display_name": "MaskComposite" + }, + "MaskToImage": { + "display_name": "Convert Mask to Image" + }, + "ModelMergeAdd": { + "display_name": "ModelMergeAdd" + }, + "ModelMergeAuraflow": { + "display_name": "ModelMergeAuraflow" + }, + "ModelMergeBlocks": { + "display_name": "ModelMergeBlocks" + }, + "ModelMergeFlux1": { + "display_name": "ModelMergeFlux1" + }, + "ModelMergeLTXV": { + "display_name": "ModelMergeLTXV" + }, + "ModelMergeMochiPreview": { + "display_name": "ModelMergeMochiPreview" + }, + "ModelMergeSD1": { + "display_name": "ModelMergeSD1" + }, + "ModelMergeSD2": { + "display_name": "ModelMergeSD2" + }, + "ModelMergeSD3_2B": { + "display_name": "ModelMergeSD3_2B" + }, + "ModelMergeSD35_Large": { + "display_name": "ModelMergeSD35_Large" + }, + "ModelMergeSDXL": { + "display_name": "ModelMergeSDXL" + }, + "ModelMergeSimple": { + "display_name": "ModelMergeSimple" + }, + "ModelMergeSubtract": { + "display_name": "ModelMergeSubtract" + }, + "ModelSamplingAuraFlow": { + "display_name": "ModelSamplingAuraFlow" + }, + "ModelSamplingContinuousEDM": { + "display_name": "ModelSamplingContinuousEDM" + }, + "ModelSamplingContinuousV": { + "display_name": "ModelSamplingContinuousV" + }, + "ModelSamplingDiscrete": { + "display_name": "ModelSamplingDiscrete" + }, + "ModelSamplingFlux": { + "display_name": "ModelSamplingFlux" + }, + "ModelSamplingLTXV": { + "display_name": "ModelSamplingLTXV" + }, + "ModelSamplingSD3": { + "display_name": "ModelSamplingSD3" + }, + "ModelSamplingStableCascade": { + "display_name": "ModelSamplingStableCascade" + }, + "ModelSave": { + "display_name": "ModelSave" + }, + "Morphology": { + "display_name": "ImageMorphology" + }, + "PairConditioningCombine": { + "display_name": "Cond Pair Combine" + }, + "PairConditioningSetDefaultCombine": { + "display_name": "Cond Pair Set Default Combine" + }, + "PairConditioningSetProperties": { + "display_name": "Cond Pair Set Props" + }, + "PairConditioningSetPropertiesAndCombine": { + "display_name": "Cond Pair Set Props Combine" + }, + "PatchModelAddDownscale": { + "display_name": "PatchModelAddDownscale (Kohya Deep Shrink)" + }, + "PerpNeg": { + "display_name": "Perp-Neg (DEPRECATED by PerpNegGuider)" + }, + "PerpNegGuider": { + "display_name": "PerpNegGuider" + }, + "PerturbedAttentionGuidance": { + "display_name": "PerturbedAttentionGuidance" + }, + "PhotoMakerEncode": { + "display_name": "PhotoMakerEncode" + }, + "PhotoMakerLoader": { + "display_name": "PhotoMakerLoader" + }, + "PolyexponentialScheduler": { + "display_name": "PolyexponentialScheduler" + }, + "PorterDuffImageComposite": { + "display_name": "Porter-Duff Image Composite" + }, + "PreviewAudio": { + "display_name": "PreviewAudio" + }, + "PreviewImage": { + "display_name": "Preview Image", + "description": "Saves the input images to your ComfyUI output directory." + }, + "RandomNoise": { + "display_name": "RandomNoise" + }, + "RebatchImages": { + "display_name": "Rebatch Images" + }, + "RebatchLatents": { + "display_name": "Rebatch Latents" + }, + "RepeatImageBatch": { + "display_name": "RepeatImageBatch" + }, + "RepeatLatentBatch": { + "display_name": "Repeat Latent Batch" + }, + "RescaleCFG": { + "display_name": "RescaleCFG" + }, + "SamplerCustom": { + "display_name": "SamplerCustom" + }, + "SamplerCustomAdvanced": { + "display_name": "SamplerCustomAdvanced" + }, + "SamplerDPMAdaptative": { + "display_name": "SamplerDPMAdaptative" + }, + "SamplerDPMPP_2M_SDE": { + "display_name": "SamplerDPMPP_2M_SDE" + }, + "SamplerDPMPP_2S_Ancestral": { + "display_name": "SamplerDPMPP_2S_Ancestral" + }, + "SamplerDPMPP_3M_SDE": { + "display_name": "SamplerDPMPP_3M_SDE" + }, + "SamplerDPMPP_SDE": { + "display_name": "SamplerDPMPP_SDE" + }, + "SamplerEulerAncestral": { + "display_name": "SamplerEulerAncestral" + }, + "SamplerEulerAncestralCFGPP": { + "display_name": "SamplerEulerAncestralCFG++" + }, + "SamplerEulerCFGpp": { + "display_name": "SamplerEulerCFG++" + }, + "SamplerLCMUpscale": { + "display_name": "SamplerLCMUpscale" + }, + "SamplerLMS": { + "display_name": "SamplerLMS" + }, + "SaveAnimatedPNG": { + "display_name": "SaveAnimatedPNG" + }, + "SaveAnimatedWEBP": { + "display_name": "SaveAnimatedWEBP" + }, + "SaveAudio": { + "display_name": "SaveAudio" + }, + "SaveImage": { + "display_name": "Save Image", + "description": "Saves the input images to your ComfyUI output directory." + }, + "SaveImageWebsocket": { + "display_name": "SaveImageWebsocket" + }, + "SaveLatent": { + "display_name": "SaveLatent" + }, + "SD_4XUpscale_Conditioning": { + "display_name": "SD_4XUpscale_Conditioning" + }, + "SDTurboScheduler": { + "display_name": "SDTurboScheduler" + }, + "SelfAttentionGuidance": { + "display_name": "Self-Attention Guidance" + }, + "SetClipHooks": { + "display_name": "Set CLIP Hooks" + }, + "SetHookKeyframes": { + "display_name": "Set Hook Keyframes" + }, + "SetLatentNoiseMask": { + "display_name": "Set Latent Noise Mask" + }, + "SetUnionControlNetType": { + "display_name": "SetUnionControlNetType" + }, + "SkipLayerGuidanceDiT": { + "display_name": "SkipLayerGuidanceDiT", + "description": "Generic version of SkipLayerGuidance node that can be used on every DiT model." + }, + "SkipLayerGuidanceSD3": { + "display_name": "SkipLayerGuidanceSD3", + "description": "Generic version of SkipLayerGuidance node that can be used on every DiT model." + }, + "SolidMask": { + "display_name": "SolidMask" + }, + "SplitImageWithAlpha": { + "display_name": "Split Image with Alpha" + }, + "SplitSigmas": { + "display_name": "SplitSigmas" + }, + "SplitSigmasDenoise": { + "display_name": "SplitSigmasDenoise" + }, + "StableCascade_EmptyLatentImage": { + "display_name": "StableCascade_EmptyLatentImage" + }, + "StableCascade_StageB_Conditioning": { + "display_name": "StableCascade_StageB_Conditioning" + }, + "StableCascade_StageC_VAEEncode": { + "display_name": "StableCascade_StageC_VAEEncode" + }, + "StableCascade_SuperResolutionControlnet": { + "display_name": "StableCascade_SuperResolutionControlnet" + }, + "StableZero123_Conditioning": { + "display_name": "StableZero123_Conditioning" + }, + "StableZero123_Conditioning_Batched": { + "display_name": "StableZero123_Conditioning_Batched" + }, + "StyleModelApply": { + "display_name": "Apply Style Model" + }, + "StyleModelLoader": { + "display_name": "Load Style Model" + }, + "SV3D_Conditioning": { + "display_name": "SV3D_Conditioning" + }, + "SVD_img2vid_Conditioning": { + "display_name": "SVD_img2vid_Conditioning" + }, + "ThresholdMask": { + "display_name": "ThresholdMask" + }, + "TomePatchModel": { + "display_name": "TomePatchModel" + }, + "TorchCompileModel": { + "display_name": "TorchCompileModel" + }, + "TripleCLIPLoader": { + "display_name": "TripleCLIPLoader", + "description": "[Recipes]\n\nsd3: clip-l, clip-g, t5" + }, + "unCLIPCheckpointLoader": { + "display_name": "unCLIPCheckpointLoader" + }, + "unCLIPConditioning": { + "display_name": "unCLIPConditioning" + }, + "UNetCrossAttentionMultiply": { + "display_name": "UNetCrossAttentionMultiply" + }, + "UNETLoader": { + "display_name": "Load Diffusion Model" + }, + "UNetSelfAttentionMultiply": { + "display_name": "UNetSelfAttentionMultiply" + }, + "UNetTemporalAttentionMultiply": { + "display_name": "UNetTemporalAttentionMultiply" + }, + "UpscaleModelLoader": { + "display_name": "Load Upscale Model" + }, + "VAEDecode": { + "display_name": "VAE Decode", + "description": "Decodes latent images back into pixel space images." + }, + "VAEDecodeAudio": { + "display_name": "VAEDecodeAudio" + }, + "VAEDecodeTiled": { + "display_name": "VAE Decode (Tiled)" + }, + "VAEEncode": { + "display_name": "VAE Encode" + }, + "VAEEncodeAudio": { + "display_name": "VAEEncodeAudio" + }, + "VAEEncodeForInpaint": { + "display_name": "VAE Encode (for Inpainting)" + }, + "VAEEncodeTiled": { + "display_name": "VAE Encode (Tiled)" + }, + "VAELoader": { + "display_name": "Load VAE" + }, + "VAESave": { + "display_name": "VAESave" + }, + "VideoLinearCFGGuidance": { + "display_name": "VideoLinearCFGGuidance" + }, + "VideoTriangleCFGGuidance": { + "display_name": "VideoTriangleCFGGuidance" + }, + "VPScheduler": { + "display_name": "VPScheduler" + }, + "WebcamCapture": { + "display_name": "Webcam Capture" + } } } \ No newline at end of file diff --git a/src/locales/ja.json b/src/locales/ja.json index 7b9f74e27..2e1269e6e 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -196,6 +196,801 @@ "noTasksFound": "タスクが見つかりませんでした", "noTasksFoundMessage": "キューにタスクがありません。", "noWorkflowsFound": "ワークフローが見つかりませんでした。", + "nodeDefs": { + "AddNoise": { + "display_name": "ノイズを追加" + }, + "AlignYourStepsScheduler": { + "display_name": "ステップを整列" + }, + "BasicGuider": { + "display_name": "基本ガイダー" + }, + "BasicScheduler": { + "display_name": "基本スケジューラー" + }, + "BetaSamplingScheduler": { + "display_name": "ベータサンプリングスケジューラー" + }, + "CFGGuider": { + "display_name": "CFGガイダー" + }, + "CLIPAttentionMultiply": { + "display_name": "CLIP注意の乗算" + }, + "CLIPLoader": { + "description": "[レシピ]\n\nstable_diffusion: clip-l\nstable_cascade: clip-g\nsd3: t5 / clip-g / clip-l\nstable_audio: t5\nmochi: t5", + "display_name": "CLIPを読み込む" + }, + "CLIPMergeAdd": { + "display_name": "CLIPマージ追加" + }, + "CLIPMergeSimple": { + "display_name": "CLIPマージシンプル" + }, + "CLIPMergeSubtract": { + "display_name": "CLIPマージ減算" + }, + "CLIPSave": { + "display_name": "CLIPを保存" + }, + "CLIPSetLastLayer": { + "display_name": "CLIPの最終層を設定" + }, + "CLIPTextEncode": { + "description": "テキストプロンプトをCLIPモデルを使用してエンコードし、特定の画像を生成するために拡散モデルをガイドするために使用できる埋め込みに変換します。", + "display_name": "CLIPテキストエンコード(プロンプト)" + }, + "CLIPTextEncodeControlnet": { + "display_name": "CLIPテキストエンコードコントロールネット" + }, + "CLIPTextEncodeFlux": { + "display_name": "CLIPテキストエンコードフラックス" + }, + "CLIPTextEncodeHunyuanDiT": { + "display_name": "CLIPテキストエンコードフンユアンDiT" + }, + "CLIPTextEncodeSD3": { + "display_name": "CLIPテキストエンコードSD3" + }, + "CLIPTextEncodeSDXL": { + "display_name": "CLIPテキストエンコードSDXL" + }, + "CLIPTextEncodeSDXLRefiner": { + "display_name": "CLIPテキストエンコードSDXLリファイナー" + }, + "CLIPVisionEncode": { + "display_name": "CLIPビジョンエンコード" + }, + "CLIPVisionLoader": { + "display_name": "CLIPビジョンを読み込む" + }, + "Canny": { + "display_name": "キャニー" + }, + "CheckpointLoader": { + "display_name": "設定でチェックポイントを読み込む(非推奨)" + }, + "CheckpointLoaderSimple": { + "description": "拡散モデルのチェックポイントを読み込みます。拡散モデルは潜在変数のノイズを除去するために使用されます。", + "display_name": "チェックポイントを読み込む" + }, + "CheckpointSave": { + "display_name": "チェックポイントを保存" + }, + "CombineHooks2": { + "display_name": "フックを組み合わせる [2]" + }, + "CombineHooks4": { + "display_name": "フックを組み合わせる [4]" + }, + "CombineHooks8": { + "display_name": "フックを組み合わせる [8]" + }, + "ConditioningAverage": { + "display_name": "条件付け平均" + }, + "ConditioningCombine": { + "display_name": "条件付け(組み合わせ)" + }, + "ConditioningConcat": { + "display_name": "条件付け(連結)" + }, + "ConditioningSetArea": { + "display_name": "条件付け(エリア設定)" + }, + "ConditioningSetAreaPercentage": { + "display_name": "条件付け(パーセンテージでエリア設定)" + }, + "ConditioningSetAreaStrength": { + "display_name": "条件付けエリア強度" + }, + "ConditioningSetDefaultCombine": { + "display_name": "条件付けデフォルト組み合わせを設定" + }, + "ConditioningSetMask": { + "display_name": "条件付け(マスク設定)" + }, + "ConditioningSetProperties": { + "display_name": "条件付けプロパティ設定" + }, + "ConditioningSetPropertiesAndCombine": { + "display_name": "条件付けプロパティ設定と組み合わせ" + }, + "ConditioningSetTimestepRange": { + "display_name": "条件付けタイムステップ範囲" + }, + "ConditioningTimestepsRange": { + "display_name": "タイムステップ範囲" + }, + "ConditioningZeroOut": { + "display_name": "条件付けゼロアウト" + }, + "ControlNetApply": { + "display_name": "ControlNetを適用(旧)" + }, + "ControlNetApplyAdvanced": { + "display_name": "ControlNetを適用" + }, + "ControlNetApplySD3": { + "display_name": "VAEでControlNetを適用" + }, + "ControlNetInpaintingAliMamaApply": { + "display_name": "ControlNetインペインティングAliMamaを適用" + }, + "ControlNetLoader": { + "display_name": "ControlNetモデルを読み込む" + }, + "CreateHookKeyframe": { + "display_name": "フックキーフレームを作成" + }, + "CreateHookKeyframesFromFloats": { + "display_name": "フックキーフレームを浮動小数点から作成" + }, + "CreateHookKeyframesInterpolated": { + "display_name": "フックキーフレームを補間" + }, + "CreateHookLora": { + "display_name": "フックLoRAを作成" + }, + "CreateHookLoraModelOnly": { + "display_name": "フックLoRA(モデルのみ)" + }, + "CreateHookModelAsLora": { + "display_name": "フックモデルをLoRAとして作成" + }, + "CreateHookModelAsLoraModelOnly": { + "display_name": "フックモデルをLoRAとして作成(モデルのみ)" + }, + "CropMask": { + "display_name": "マスクをトリミング" + }, + "DevToolsDeprecatedNode": { + "description": "非推奨のノード", + "display_name": "非推奨ノード" + }, + "DevToolsErrorRaiseNode": { + "description": "開発目的のためにエラーを発生させる", + "display_name": "エラーを発生させる" + }, + "DevToolsErrorRaiseNodeWithMessage": { + "description": "開発目的のためにメッセージ付きのエラーを発生させる", + "display_name": "メッセージ付きエラーを発生させる" + }, + "DevToolsExperimentalNode": { + "description": "実験的なノード", + "display_name": "実験的ノード" + }, + "DevToolsLongComboDropdown": { + "description": "長いコンボドロップダウン", + "display_name": "ロングコンボドロップダウン" + }, + "DevToolsNodeWithForceInput": { + "description": "強制入力を持つノード", + "display_name": "強制入力ノード" + }, + "DevToolsNodeWithOnlyOptionalInput": { + "description": "オプション入力のみを持つノード", + "display_name": "オプション入力のみのノード" + }, + "DevToolsNodeWithOptionalInput": { + "description": "オプション入力を持つノード", + "display_name": "オプション入力ノード" + }, + "DevToolsNodeWithOutputList": { + "description": "出力リストを持つノード", + "display_name": "出力リストノード" + }, + "DevToolsNodeWithStringInput": { + "description": "文字列入力を持つノード", + "display_name": "文字列入力ノード" + }, + "DevToolsNodeWithUnionInput": { + "description": "ユニオン入力を持つノード", + "display_name": "ユニオン入力ノード" + }, + "DiffControlNetLoader": { + "display_name": "ControlNetモデルを読み込む(diff)" + }, + "DifferentialDiffusion": { + "display_name": "差分拡散" + }, + "DiffusersLoader": { + "display_name": "ディフューザーを読み込む" + }, + "DisableNoise": { + "display_name": "ノイズを無効にする" + }, + "DualCFGGuider": { + "display_name": "デュアルCFGガイダー" + }, + "DualCLIPLoader": { + "description": "[レシピ]\n\nsdxl: clip-l, clip-g\nsd3: clip-l, clip-g / clip-l, t5 / clip-g, t5\nflux: clip-l, t5", + "display_name": "デュアルCLIPを読み込む" + }, + "EmptyImage": { + "display_name": "空の画像" + }, + "EmptyLTXVLatentVideo": { + "display_name": "空のLTXV潜在ビデオ" + }, + "EmptyLatentAudio": { + "display_name": "空の潜在音声" + }, + "EmptyLatentImage": { + "description": "サンプリングを通じてノイズを除去するための空の潜在画像の新しいバッチを作成します。", + "display_name": "空の潜在画像" + }, + "EmptyMochiLatentVideo": { + "display_name": "空のMochi潜在ビデオ" + }, + "EmptySD3LatentImage": { + "display_name": "空のSD3潜在画像" + }, + "ExponentialScheduler": { + "display_name": "指数スケジューラー" + }, + "FeatherMask": { + "display_name": "フェザー マスク" + }, + "FlipSigmas": { + "display_name": "シグマを反転" + }, + "FluxGuidance": { + "display_name": "フラックスガイダンス" + }, + "FreeU": { + "display_name": "FreeU" + }, + "FreeU_V2": { + "display_name": "FreeU_V2" + }, + "GITSScheduler": { + "display_name": "GITSスケジューラー" + }, + "GLIGENLoader": { + "display_name": "GLIGENを読み込む" + }, + "GLIGENTextBoxApply": { + "display_name": "GLIGENテキストボックスを適用" + }, + "GrowMask": { + "display_name": "マスクを拡大" + }, + "HyperTile": { + "display_name": "ハイパータイル" + }, + "HypernetworkLoader": { + "display_name": "ハイパーネットワークを読み込む" + }, + "ImageBatch": { + "display_name": "画像バッチ" + }, + "ImageBlend": { + "display_name": "画像ブレンド" + }, + "ImageBlur": { + "display_name": "画像ぼかし" + }, + "ImageColorToMask": { + "display_name": "画像色をマスクに変換" + }, + "ImageCompositeMasked": { + "display_name": "マスクされた画像合成" + }, + "ImageCrop": { + "display_name": "画像トリミング" + }, + "ImageFromBatch": { + "display_name": "バッチから画像を取得" + }, + "ImageInvert": { + "display_name": "画像を反転" + }, + "ImageOnlyCheckpointLoader": { + "display_name": "画像のみのチェックポイントローダー(img2vidモデル)" + }, + "ImageOnlyCheckpointSave": { + "display_name": "画像のみのチェックポイント保存" + }, + "ImagePadForOutpaint": { + "display_name": "アウトペイント用に画像をパッド" + }, + "ImageQuantize": { + "display_name": "画像を量子化" + }, + "ImageScale": { + "display_name": "画像を拡大" + }, + "ImageScaleBy": { + "display_name": "画像を拡大(指定サイズ)" + }, + "ImageScaleToTotalPixels": { + "display_name": "画像を総ピクセルにスケール" + }, + "ImageSharpen": { + "display_name": "画像をシャープ化" + }, + "ImageToMask": { + "display_name": "画像をマスクに変換" + }, + "ImageUpscaleWithModel": { + "display_name": "モデルを使用して画像を拡大" + }, + "InpaintModelConditioning": { + "display_name": "インペイントモデル条件付け" + }, + "InstructPixToPixConditioning": { + "display_name": "PixToPix条件付け" + }, + "InvertMask": { + "display_name": "マスクを反転" + }, + "JoinImageWithAlpha": { + "display_name": "アルファで画像を結合" + }, + "KSampler": { + "description": "提供されたモデル、正の条件付けと負の条件付けを使用して潜在画像のノイズを除去します。", + "display_name": "Kサンプラー" + }, + "KSamplerAdvanced": { + "display_name": "Kサンプラー(高度)" + }, + "KSamplerSelect": { + "display_name": "Kサンプラー選択" + }, + "KarrasScheduler": { + "display_name": "カラススケジューラー" + }, + "LTXVConditioning": { + "display_name": "LTXV条件付け" + }, + "LTXVImgToVideo": { + "display_name": "LTXV画像からビデオへ" + }, + "LTXVScheduler": { + "display_name": "LTXVスケジューラー" + }, + "LaplaceScheduler": { + "display_name": "ラプラススケジューラー" + }, + "LatentAdd": { + "display_name": "潜在追加" + }, + "LatentApplyOperation": { + "display_name": "潜在操作を適用" + }, + "LatentApplyOperationCFG": { + "display_name": "潜在操作CFGを適用" + }, + "LatentBatch": { + "display_name": "潜在バッチ" + }, + "LatentBatchSeedBehavior": { + "display_name": "潜在バッチシード動作" + }, + "LatentBlend": { + "display_name": "潜在ブレンド" + }, + "LatentComposite": { + "display_name": "潜在合成" + }, + "LatentCompositeMasked": { + "display_name": "マスクされた潜在合成" + }, + "LatentCrop": { + "display_name": "潜在トリミング" + }, + "LatentFlip": { + "display_name": "潜在反転" + }, + "LatentFromBatch": { + "display_name": "バッチから潜在を取得" + }, + "LatentInterpolate": { + "display_name": "潜在補間" + }, + "LatentMultiply": { + "display_name": "潜在乗算" + }, + "LatentOperationSharpen": { + "display_name": "潜在操作シャープ化" + }, + "LatentOperationTonemapReinhard": { + "display_name": "潜在操作トーンマップライナード" + }, + "LatentRotate": { + "display_name": "潜在回転" + }, + "LatentSubtract": { + "display_name": "潜在減算" + }, + "LatentUpscale": { + "display_name": "潜在を拡大" + }, + "LatentUpscaleBy": { + "display_name": "潜在を拡大(指定サイズ)" + }, + "LoadAudio": { + "display_name": "音声を読み込む" + }, + "LoadImage": { + "display_name": "画像を読み込む" + }, + "LoadImageMask": { + "display_name": "画像を読み込む(マスクとして)" + }, + "LoadLatent": { + "display_name": "潜在を読み込む" + }, + "LoraLoader": { + "description": "LoRAは拡散およびCLIPモデルを修正するために使用され、潜在のノイズ除去方法を変更します。複数のLoRAノードを連結できます。", + "display_name": "LoRAを読み込む" + }, + "LoraLoaderModelOnly": { + "description": "LoRAは拡散およびCLIPモデルを修正するために使用され、潜在のノイズ除去方法を変更します。複数のLoRAノードを連結できます。", + "display_name": "LoRAローダーモデルのみ" + }, + "LoraSave": { + "display_name": "LoRAを抽出して保存" + }, + "MaskComposite": { + "display_name": "マスク合成" + }, + "MaskToImage": { + "display_name": "マスクを画像に変換" + }, + "ModelMergeAdd": { + "display_name": "モデルマージ追加" + }, + "ModelMergeAuraflow": { + "display_name": "モデルマージオーラフロー" + }, + "ModelMergeBlocks": { + "display_name": "モデルマージブロック" + }, + "ModelMergeFlux1": { + "display_name": "モデルマージフラックス1" + }, + "ModelMergeLTXV": { + "display_name": "モデルマージLTXV" + }, + "ModelMergeMochiPreview": { + "display_name": "モデルマージMochiプレビュー" + }, + "ModelMergeSD1": { + "display_name": "モデルマージSD1" + }, + "ModelMergeSD2": { + "display_name": "モデルマージSD2" + }, + "ModelMergeSD35_Large": { + "display_name": "モデルマージSD35_Large" + }, + "ModelMergeSD3_2B": { + "display_name": "モデルマージSD3_2B" + }, + "ModelMergeSDXL": { + "display_name": "モデルマージSDXL" + }, + "ModelMergeSimple": { + "display_name": "モデルマージシンプル" + }, + "ModelMergeSubtract": { + "display_name": "モデルマージ減算" + }, + "ModelSamplingAuraFlow": { + "display_name": "モデルサンプリングオーラフロー" + }, + "ModelSamplingContinuousEDM": { + "display_name": "モデルサンプリング連続EDM" + }, + "ModelSamplingContinuousV": { + "display_name": "モデルサンプリング連続V" + }, + "ModelSamplingDiscrete": { + "display_name": "モデルサンプリング離散" + }, + "ModelSamplingFlux": { + "display_name": "モデルサンプリングフラックス" + }, + "ModelSamplingLTXV": { + "display_name": "モデルサンプリングLTXV" + }, + "ModelSamplingSD3": { + "display_name": "モデルサンプリングSD3" + }, + "ModelSamplingStableCascade": { + "display_name": "モデルサンプリング安定カスケード" + }, + "ModelSave": { + "display_name": "モデルを保存" + }, + "Morphology": { + "display_name": "画像形態学" + }, + "PairConditioningCombine": { + "display_name": "ペア条件付け組み合わせ" + }, + "PairConditioningSetDefaultCombine": { + "display_name": "ペア条件付けデフォルト組み合わせを設定" + }, + "PairConditioningSetProperties": { + "display_name": "ペア条件付けプロパティ設定" + }, + "PairConditioningSetPropertiesAndCombine": { + "display_name": "ペア条件付けプロパティ設定と組み合わせ" + }, + "PatchModelAddDownscale": { + "display_name": "パッチモデル追加ダウンスケール(Kohya Deep Shrink)" + }, + "PerpNeg": { + "display_name": "Perp-Neg(PerpNegGuiderによって非推奨)" + }, + "PerpNegGuider": { + "display_name": "PerpNegガイダー" + }, + "PerturbedAttentionGuidance": { + "display_name": "摂動注意ガイダンス" + }, + "PhotoMakerEncode": { + "display_name": "フォトメーカーエンコード" + }, + "PhotoMakerLoader": { + "display_name": "フォトメーカーを読み込む" + }, + "PolyexponentialScheduler": { + "display_name": "ポリ指数スケジューラー" + }, + "PorterDuffImageComposite": { + "display_name": "ポーターダフ画像合成" + }, + "PreviewAudio": { + "display_name": "オーディオプレビュー" + }, + "PreviewImage": { + "description": "入力画像をComfyUI出力ディレクトリに保存します。", + "display_name": "画像プレビュー" + }, + "RandomNoise": { + "display_name": "ランダムノイズ" + }, + "RebatchImages": { + "display_name": "画像を再バッチ" + }, + "RebatchLatents": { + "display_name": "潜在を再バッチ" + }, + "RepeatImageBatch": { + "display_name": "画像バッチを繰り返す" + }, + "RepeatLatentBatch": { + "display_name": "潜在バッチを繰り返す" + }, + "RescaleCFG": { + "display_name": "CFGを再スケール" + }, + "SDTurboScheduler": { + "display_name": "SDターボスケジューラー" + }, + "SD_4XUpscale_Conditioning": { + "display_name": "SD_4X拡大条件付け" + }, + "SV3D_Conditioning": { + "display_name": "SV3D条件付け" + }, + "SVD_img2vid_Conditioning": { + "display_name": "SVD_img2vid条件付け" + }, + "SamplerCustom": { + "display_name": "カスタムサンプラー" + }, + "SamplerCustomAdvanced": { + "display_name": "カスタムサンプラー(高度)" + }, + "SamplerDPMAdaptative": { + "display_name": "サンプラーDPM適応" + }, + "SamplerDPMPP_2M_SDE": { + "display_name": "サンプラーDPMPP_2M_SDE" + }, + "SamplerDPMPP_2S_Ancestral": { + "display_name": "サンプラーDPMPP_2S_祖先" + }, + "SamplerDPMPP_3M_SDE": { + "display_name": "サンプラーDPMPP_3M_SDE" + }, + "SamplerDPMPP_SDE": { + "display_name": "サンプラーDPMPP_SDE" + }, + "SamplerEulerAncestral": { + "display_name": "サンプラーオイラー祖先" + }, + "SamplerEulerAncestralCFGPP": { + "display_name": "サンプラーオイラー祖先CFG++" + }, + "SamplerEulerCFGpp": { + "display_name": "サンプラーオイラーCFG++" + }, + "SamplerLCMUpscale": { + "display_name": "サンプラーLCM拡大" + }, + "SamplerLMS": { + "display_name": "サンプラーLMS" + }, + "SaveAnimatedPNG": { + "display_name": "アニメーションPNGを保存" + }, + "SaveAnimatedWEBP": { + "display_name": "アニメーションWEBPを保存" + }, + "SaveAudio": { + "display_name": "オーディオを保存" + }, + "SaveImage": { + "description": "入力画像をComfyUI出力ディレクトリに保存します。", + "display_name": "画像を保存" + }, + "SaveImageWebsocket": { + "display_name": "画像を保存するWebSocket" + }, + "SaveLatent": { + "display_name": "潜在を保存" + }, + "SelfAttentionGuidance": { + "display_name": "自己注意ガイダンス" + }, + "SetClipHooks": { + "display_name": "CLIPフックを設定" + }, + "SetHookKeyframes": { + "display_name": "フックキーフレームを設定" + }, + "SetLatentNoiseMask": { + "display_name": "潜在ノイズマスクを設定" + }, + "SetUnionControlNetType": { + "display_name": "Union ControlNetタイプを設定" + }, + "SkipLayerGuidanceDiT": { + "description": "すべてのDiTモデルで使用できるSkipLayerGuidanceノードの一般的なバージョン。", + "display_name": "SkipLayerGuidanceDiT" + }, + "SkipLayerGuidanceSD3": { + "description": "すべてのDiTモデルで使用できるSkipLayerGuidanceノードの一般的なバージョン。", + "display_name": "SkipLayerGuidanceSD3" + }, + "SolidMask": { + "display_name": "ソリッドマスク" + }, + "SplitImageWithAlpha": { + "display_name": "アルファで画像を分割" + }, + "SplitSigmas": { + "display_name": "シグマを分割" + }, + "SplitSigmasDenoise": { + "display_name": "シグマを分割してノイズ除去" + }, + "StableCascade_EmptyLatentImage": { + "display_name": "安定カスケード_空の潜在画像" + }, + "StableCascade_StageB_Conditioning": { + "display_name": "安定カスケード_ステージB条件付け" + }, + "StableCascade_StageC_VAEEncode": { + "display_name": "安定カスケード_ステージC_VAEエンコード" + }, + "StableCascade_SuperResolutionControlnet": { + "display_name": "安定カスケード_超解像Controlnet" + }, + "StableZero123_Conditioning": { + "display_name": "安定ゼロ123条件付け" + }, + "StableZero123_Conditioning_Batched": { + "display_name": "安定ゼロ123条件付け(バッチ)" + }, + "StyleModelApply": { + "display_name": "スタイルモデルを適用" + }, + "StyleModelLoader": { + "display_name": "スタイルモデルを読み込む" + }, + "ThresholdMask": { + "display_name": "しきい値マスク" + }, + "TomePatchModel": { + "display_name": "トメパッチモデル" + }, + "TorchCompileModel": { + "display_name": "Torchコンパイルモデル" + }, + "TripleCLIPLoader": { + "description": "[レシピ]\n\nsd3: clip-l, clip-g, t5", + "display_name": "トリプルCLIPを読み込む" + }, + "UNETLoader": { + "display_name": "拡散モデルを読み込む" + }, + "UNetCrossAttentionMultiply": { + "display_name": "UNetクロス注意の乗算" + }, + "UNetSelfAttentionMultiply": { + "display_name": "UNet自己注意の乗算" + }, + "UNetTemporalAttentionMultiply": { + "display_name": "UNet時間的注意の乗算" + }, + "UpscaleModelLoader": { + "display_name": "拡大モデルを読み込む" + }, + "VAEDecode": { + "description": "潜在画像をピクセル空間画像にデコードします。", + "display_name": "VAEデコード" + }, + "VAEDecodeAudio": { + "display_name": "VAEデコード音声" + }, + "VAEDecodeTiled": { + "display_name": "VAEデコード(タイル)" + }, + "VAEEncode": { + "display_name": "VAEエンコード" + }, + "VAEEncodeAudio": { + "display_name": "VAEエンコード音声" + }, + "VAEEncodeForInpaint": { + "display_name": "VAEエンコード(インペイント用)" + }, + "VAEEncodeTiled": { + "display_name": "VAEエンコード(タイル)" + }, + "VAELoader": { + "display_name": "VAEを読み込む" + }, + "VAESave": { + "display_name": "VAEを保存" + }, + "VPScheduler": { + "display_name": "VPスケジューラー" + }, + "VideoLinearCFGGuidance": { + "display_name": "ビデオ線形CFGガイダンス" + }, + "VideoTriangleCFGGuidance": { + "display_name": "ビデオ三角形CFGガイダンス" + }, + "WebcamCapture": { + "display_name": "ウェブカメラキャプチャ" + }, + "unCLIPCheckpointLoader": { + "display_name": "unCLIPチェックポイントローダー" + }, + "unCLIPConditioning": { + "display_name": "unCLIP条件付け" + } + }, "notSupported": { "continue": "続ける", "continueTooltip": "私のデバイスはサポートされていると確信しています", diff --git a/src/locales/ru.json b/src/locales/ru.json index 0f0bdac6c..7d088590c 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -196,6 +196,801 @@ "noTasksFound": "Задачи не найдены", "noTasksFoundMessage": "В очереди нет задач.", "noWorkflowsFound": "Рабочие процессы не найдены.", + "nodeDefs": { + "AddNoise": { + "display_name": "Добавить шум" + }, + "AlignYourStepsScheduler": { + "display_name": "Планировщик выравнивания шагов" + }, + "BasicGuider": { + "display_name": "Основной гид" + }, + "BasicScheduler": { + "display_name": "Основной планировщик" + }, + "BetaSamplingScheduler": { + "display_name": "Планировщик выборки Бета" + }, + "CFGGuider": { + "display_name": "CFG Гид" + }, + "CLIPAttentionMultiply": { + "display_name": "Умножение внимания CLIP" + }, + "CLIPLoader": { + "description": "[Рецепты]\n\nstable_diffusion: clip-l\nstable_cascade: clip-g\nsd3: t5 / clip-g / clip-l\nstable_audio: t5\nmochi: t5", + "display_name": "Загрузить CLIP" + }, + "CLIPMergeAdd": { + "display_name": "Сложение CLIP" + }, + "CLIPMergeSimple": { + "display_name": "Простое слияние CLIP" + }, + "CLIPMergeSubtract": { + "display_name": "Вычитание CLIP" + }, + "CLIPSave": { + "display_name": "Сохранить CLIP" + }, + "CLIPSetLastLayer": { + "display_name": "Установить последний слой CLIP" + }, + "CLIPTextEncode": { + "description": "Кодирует текстовый запрос с помощью модели CLIP в вектор, который можно использовать для управления моделью диффузии для генерации конкретных изображений.", + "display_name": "Кодирование текста CLIP (Запрос)" + }, + "CLIPTextEncodeControlnet": { + "display_name": "Кодирование текста CLIP для Controlnet" + }, + "CLIPTextEncodeFlux": { + "display_name": "Кодирование текста CLIP Flux" + }, + "CLIPTextEncodeHunyuanDiT": { + "display_name": "Кодирование текста CLIP HunyuanDiT" + }, + "CLIPTextEncodeSD3": { + "display_name": "Кодирование текста CLIP SD3" + }, + "CLIPTextEncodeSDXL": { + "display_name": "Кодирование текста CLIP SDXL" + }, + "CLIPTextEncodeSDXLRefiner": { + "display_name": "Кодирование текста CLIP SDXL Refinement" + }, + "CLIPVisionEncode": { + "display_name": "Кодирование видения CLIP" + }, + "CLIPVisionLoader": { + "display_name": "Загрузить видение CLIP" + }, + "Canny": { + "display_name": "Канни" + }, + "CheckpointLoader": { + "display_name": "Загрузить контрольную точку с конфигурацией (УСТАРЕЛО)" + }, + "CheckpointLoaderSimple": { + "description": "Загружает контрольную точку модели диффузии, модели диффузии используются для удаления шума из латентов.", + "display_name": "Загрузить контрольную точку" + }, + "CheckpointSave": { + "display_name": "Сохранить контрольную точку" + }, + "CombineHooks2": { + "display_name": "Объединить хуки [2]" + }, + "CombineHooks4": { + "display_name": "Объединить хуки [4]" + }, + "CombineHooks8": { + "display_name": "Объединить хуки [8]" + }, + "ConditioningAverage": { + "display_name": "Среднее кондиционирование" + }, + "ConditioningCombine": { + "display_name": "Кондиционирование (Объединение)" + }, + "ConditioningConcat": { + "display_name": "Кондиционирование (Конкатенация)" + }, + "ConditioningSetArea": { + "display_name": "Кондиционирование (Установить область)" + }, + "ConditioningSetAreaPercentage": { + "display_name": "Кондиционирование (Установить область с процентом)" + }, + "ConditioningSetAreaStrength": { + "display_name": "Сила установки области кондиционирования" + }, + "ConditioningSetDefaultCombine": { + "display_name": "Установить значение по умолчанию для объединения кондиционирования" + }, + "ConditioningSetMask": { + "display_name": "Кондиционирование (Установить маску)" + }, + "ConditioningSetProperties": { + "display_name": "Установить свойства кондиционирования" + }, + "ConditioningSetPropertiesAndCombine": { + "display_name": "Установить свойства кондиционирования и объединить" + }, + "ConditioningSetTimestepRange": { + "display_name": "Установить диапазон временных шагов кондиционирования" + }, + "ConditioningTimestepsRange": { + "display_name": "Диапазон временных шагов" + }, + "ConditioningZeroOut": { + "display_name": "Обнуление кондиционирования" + }, + "ControlNetApply": { + "display_name": "Применить ControlNet (СТАРОЕ)" + }, + "ControlNetApplyAdvanced": { + "display_name": "Применить ControlNet" + }, + "ControlNetApplySD3": { + "display_name": "Применить ControlNet с VAE" + }, + "ControlNetInpaintingAliMamaApply": { + "display_name": "Применить ControlNet для инпейнтинга AliMama" + }, + "ControlNetLoader": { + "display_name": "Загрузить модель ControlNet" + }, + "CreateHookKeyframe": { + "display_name": "Создать ключевой кадр хука" + }, + "CreateHookKeyframesFromFloats": { + "display_name": "Создать ключевые кадры хука из чисел с плавающей запятой" + }, + "CreateHookKeyframesInterpolated": { + "display_name": "Создать интерполированные ключевые кадры хука" + }, + "CreateHookLora": { + "display_name": "Создать хук LoRA" + }, + "CreateHookLoraModelOnly": { + "display_name": "Создать хук LoRA (Только модель)" + }, + "CreateHookModelAsLora": { + "display_name": "Создать хук модели как LoRA" + }, + "CreateHookModelAsLoraModelOnly": { + "display_name": "Создать хук модели как LoRA (Только модель)" + }, + "CropMask": { + "display_name": "Обрезать маску" + }, + "DevToolsDeprecatedNode": { + "description": "Устаревший узел", + "display_name": "Устаревший узел" + }, + "DevToolsErrorRaiseNode": { + "description": "Выбросить ошибку для целей разработки", + "display_name": "Выбросить ошибку" + }, + "DevToolsErrorRaiseNodeWithMessage": { + "description": "Выбросить ошибку с сообщением для целей разработки", + "display_name": "Выбросить ошибку с сообщением" + }, + "DevToolsExperimentalNode": { + "description": "Экспериментальный узел", + "display_name": "Экспериментальный узел" + }, + "DevToolsLongComboDropdown": { + "description": "Длинный комбинированный выпадающий список", + "display_name": "Длинный комбинированный выпадающий список" + }, + "DevToolsNodeWithForceInput": { + "description": "Узел с принудительным вводом", + "display_name": "Узел с принудительным вводом" + }, + "DevToolsNodeWithOnlyOptionalInput": { + "description": "Узел только с необязательным вводом", + "display_name": "Узел только с необязательным вводом" + }, + "DevToolsNodeWithOptionalInput": { + "description": "Узел с необязательным вводом", + "display_name": "Узел с необязательным вводом" + }, + "DevToolsNodeWithOutputList": { + "description": "Узел с выходным списком", + "display_name": "Узел с выходным списком" + }, + "DevToolsNodeWithStringInput": { + "description": "Узел со строковым вводом", + "display_name": "Узел со строковым вводом" + }, + "DevToolsNodeWithUnionInput": { + "description": "Узел с объединённым вводом", + "display_name": "Узел с объединённым вводом" + }, + "DiffControlNetLoader": { + "display_name": "Загрузить модель ControlNet (дифф)" + }, + "DifferentialDiffusion": { + "display_name": "Дифференциальная диффузия" + }, + "DiffusersLoader": { + "display_name": "Загрузчик диффузоров" + }, + "DisableNoise": { + "display_name": "Отключить шум" + }, + "DualCFGGuider": { + "display_name": "Двойной CFG Гид" + }, + "DualCLIPLoader": { + "description": "[Рецепты]\n\nsdxl: clip-l, clip-g\nsd3: clip-l, clip-g / clip-l, t5 / clip-g, t5\nflux: clip-l, t5", + "display_name": "Двойной загрузчик CLIP" + }, + "EmptyImage": { + "display_name": "Пустое изображение" + }, + "EmptyLTXVLatentVideo": { + "display_name": "Пустое латентное видео LTXV" + }, + "EmptyLatentAudio": { + "display_name": "Пустой латентный аудио" + }, + "EmptyLatentImage": { + "description": "Создает новую партию пустых латентных изображений для удаления шума через выборку.", + "display_name": "Пустое латентное изображение" + }, + "EmptyMochiLatentVideo": { + "display_name": "Пустое латентное видео Mochi" + }, + "EmptySD3LatentImage": { + "display_name": "Пустое латентное изображение SD3" + }, + "ExponentialScheduler": { + "display_name": "Экспоненциальный планировщик" + }, + "FeatherMask": { + "display_name": "Пернатая маска" + }, + "FlipSigmas": { + "display_name": "Перевернуть сигмы" + }, + "FluxGuidance": { + "display_name": "Направление Flux" + }, + "FreeU": { + "display_name": "FreeU" + }, + "FreeU_V2": { + "display_name": "FreeU_V2" + }, + "GITSScheduler": { + "display_name": "GITSScheduler" + }, + "GLIGENLoader": { + "display_name": "Загрузчик GLIGEN" + }, + "GLIGENTextBoxApply": { + "display_name": "Применить текстовое поле GLIGEN" + }, + "GrowMask": { + "display_name": "Увеличить маску" + }, + "HyperTile": { + "display_name": "Гиперплитка" + }, + "HypernetworkLoader": { + "display_name": "Загрузчик гиперсети" + }, + "ImageBatch": { + "display_name": "Партия изображений" + }, + "ImageBlend": { + "display_name": "Смешивание изображений" + }, + "ImageBlur": { + "display_name": "Размытие изображения" + }, + "ImageColorToMask": { + "display_name": "Цвет изображения в маску" + }, + "ImageCompositeMasked": { + "display_name": "Составное изображение с маской" + }, + "ImageCrop": { + "display_name": "Обрезка изображения" + }, + "ImageFromBatch": { + "display_name": "Изображение из партии" + }, + "ImageInvert": { + "display_name": "Инвертировать изображение" + }, + "ImageOnlyCheckpointLoader": { + "display_name": "Загрузчик контрольной точки только для изображения (модель img2vid)" + }, + "ImageOnlyCheckpointSave": { + "display_name": "Сохранить только контрольную точку изображения" + }, + "ImagePadForOutpaint": { + "display_name": "Добавить поля к изображению для выкрашивания" + }, + "ImageQuantize": { + "display_name": "Квантизация изображения" + }, + "ImageScale": { + "display_name": "Масштабировать изображение" + }, + "ImageScaleBy": { + "display_name": "Масштабировать изображение на" + }, + "ImageScaleToTotalPixels": { + "display_name": "Масштабировать изображение до общего количества пикселей" + }, + "ImageSharpen": { + "display_name": "Резкость изображения" + }, + "ImageToMask": { + "display_name": "Преобразовать изображение в маску" + }, + "ImageUpscaleWithModel": { + "display_name": "Увеличить изображение (с использованием модели)" + }, + "InpaintModelConditioning": { + "display_name": "Кондиционирование модели инпейнтинга" + }, + "InstructPixToPixConditioning": { + "display_name": "Кондиционирование PixToPix" + }, + "InvertMask": { + "display_name": "Инвертировать маску" + }, + "JoinImageWithAlpha": { + "display_name": "Объединить изображение с альфа-каналом" + }, + "KSampler": { + "description": "Использует предоставленную модель, положительное и отрицательное кондиционирование для удаления шума из латентного изображения.", + "display_name": "KSampler" + }, + "KSamplerAdvanced": { + "display_name": "KSampler (Расширенный)" + }, + "KSamplerSelect": { + "display_name": "Выбор KSampler" + }, + "KarrasScheduler": { + "display_name": "Планировщик Карраса" + }, + "LTXVConditioning": { + "display_name": "Кондиционирование LTXV" + }, + "LTXVImgToVideo": { + "display_name": "LTXVImgToVideo" + }, + "LTXVScheduler": { + "display_name": "Планировщик LTXV" + }, + "LaplaceScheduler": { + "display_name": "Планировщик Лапласа" + }, + "LatentAdd": { + "display_name": "Добавить латент" + }, + "LatentApplyOperation": { + "display_name": "Применить операцию к латенту" + }, + "LatentApplyOperationCFG": { + "display_name": "Применить операцию к латенту CFG" + }, + "LatentBatch": { + "display_name": "Партия латентов" + }, + "LatentBatchSeedBehavior": { + "display_name": "Поведение семени партии латентов" + }, + "LatentBlend": { + "display_name": "Смешивание латентов" + }, + "LatentComposite": { + "display_name": "Составной латент" + }, + "LatentCompositeMasked": { + "display_name": "Составной латент с маской" + }, + "LatentCrop": { + "display_name": "Обрезка латента" + }, + "LatentFlip": { + "display_name": "Перевернуть латент" + }, + "LatentFromBatch": { + "display_name": "Латент из партии" + }, + "LatentInterpolate": { + "display_name": "Интерполяция латента" + }, + "LatentMultiply": { + "display_name": "Умножить латент" + }, + "LatentOperationSharpen": { + "display_name": "Операция латента: резкость" + }, + "LatentOperationTonemapReinhard": { + "display_name": "Операция латента: тональная карта Рейнхарда" + }, + "LatentRotate": { + "display_name": "Повернуть латент" + }, + "LatentSubtract": { + "display_name": "Вычесть латент" + }, + "LatentUpscale": { + "display_name": "Увеличить латент" + }, + "LatentUpscaleBy": { + "display_name": "Увеличить латент на" + }, + "LoadAudio": { + "display_name": "Загрузить аудио" + }, + "LoadImage": { + "display_name": "Загрузить изображение" + }, + "LoadImageMask": { + "display_name": "Загрузить изображение (как маску)" + }, + "LoadLatent": { + "display_name": "Загрузить латент" + }, + "LoraLoader": { + "description": "LoRA используются для изменения моделей диффузии и CLIP, изменяя способ, которым латенты удаляются от шума, например, применяя стили. Несколько узлов LoRA могут быть связаны вместе.", + "display_name": "Загрузить LoRA" + }, + "LoraLoaderModelOnly": { + "description": "LoRA используются для изменения моделей диффузии и CLIP, изменяя способ, которым латенты удаляются от шума, например, применяя стили. Несколько узлов LoRA могут быть связаны вместе.", + "display_name": "Загрузчик LoRA (Только модель)" + }, + "LoraSave": { + "display_name": "Извлечь и сохранить LoRA" + }, + "MaskComposite": { + "display_name": "Составная маска" + }, + "MaskToImage": { + "display_name": "Преобразовать маску в изображение" + }, + "ModelMergeAdd": { + "display_name": "Сложение моделей" + }, + "ModelMergeAuraflow": { + "display_name": "Слияние моделей Auraflow" + }, + "ModelMergeBlocks": { + "display_name": "Слияние блоков моделей" + }, + "ModelMergeFlux1": { + "display_name": "Слияние моделей Flux1" + }, + "ModelMergeLTXV": { + "display_name": "Слияние моделей LTXV" + }, + "ModelMergeMochiPreview": { + "display_name": "Предварительный просмотр слияния моделей Mochi" + }, + "ModelMergeSD1": { + "display_name": "Слияние моделей SD1" + }, + "ModelMergeSD2": { + "display_name": "Слияние моделей SD2" + }, + "ModelMergeSD35_Large": { + "display_name": "Слияние моделей SD35_Large" + }, + "ModelMergeSD3_2B": { + "display_name": "Слияние моделей SD3_2B" + }, + "ModelMergeSDXL": { + "display_name": "Слияние моделей SDXL" + }, + "ModelMergeSimple": { + "display_name": "Простое слияние моделей" + }, + "ModelMergeSubtract": { + "display_name": "Вычитание моделей" + }, + "ModelSamplingAuraFlow": { + "display_name": "Выборка модели AuraFlow" + }, + "ModelSamplingContinuousEDM": { + "display_name": "Выборка модели Continuous EDM" + }, + "ModelSamplingContinuousV": { + "display_name": "Выборка модели Continuous V" + }, + "ModelSamplingDiscrete": { + "display_name": "Дискретная выборка модели" + }, + "ModelSamplingFlux": { + "display_name": "Выборка модели Flux" + }, + "ModelSamplingLTXV": { + "display_name": "Выборка модели LTXV" + }, + "ModelSamplingSD3": { + "display_name": "Выборка модели SD3" + }, + "ModelSamplingStableCascade": { + "display_name": "Выборка модели Stable Cascade" + }, + "ModelSave": { + "display_name": "Сохранить модель" + }, + "Morphology": { + "display_name": "Морфология изображения" + }, + "PairConditioningCombine": { + "display_name": "Объединение пар кондиционирования" + }, + "PairConditioningSetDefaultCombine": { + "display_name": "Установить значение по умолчанию для объединения пар кондиционирования" + }, + "PairConditioningSetProperties": { + "display_name": "Установить свойства пар кондиционирования" + }, + "PairConditioningSetPropertiesAndCombine": { + "display_name": "Установить свойства пар кондиционирования и объединить" + }, + "PatchModelAddDownscale": { + "display_name": "Добавить уменьшение модели патча (Kohya Deep Shrink)" + }, + "PerpNeg": { + "display_name": "Перп-Нег (УСТАРЕЛО из-за PerpNegGuider)" + }, + "PerpNegGuider": { + "display_name": "PerpNegGuider" + }, + "PerturbedAttentionGuidance": { + "display_name": "Направление с учетом возмущений" + }, + "PhotoMakerEncode": { + "display_name": "Кодирование PhotoMaker" + }, + "PhotoMakerLoader": { + "display_name": "Загрузчик PhotoMaker" + }, + "PolyexponentialScheduler": { + "display_name": "Полиэкспоненциальный планировщик" + }, + "PorterDuffImageComposite": { + "display_name": "Составное изображение Портера-Даффа" + }, + "PreviewAudio": { + "display_name": "Предварительный просмотр аудио" + }, + "PreviewImage": { + "description": "Сохраняет входные изображения в вашу директорию вывода ComfyUI.", + "display_name": "Предварительный просмотр изображения" + }, + "RandomNoise": { + "display_name": "Случайный шум" + }, + "RebatchImages": { + "display_name": "Перепаковать изображения" + }, + "RebatchLatents": { + "display_name": "Перепаковать латенты" + }, + "RepeatImageBatch": { + "display_name": "Повторить партию изображений" + }, + "RepeatLatentBatch": { + "display_name": "Повторить партию латентов" + }, + "RescaleCFG": { + "display_name": "Масштабировать CFG" + }, + "SDTurboScheduler": { + "display_name": "Планировщик SDTurbo" + }, + "SD_4XUpscale_Conditioning": { + "display_name": "SD_4XUpscale_Conditioning" + }, + "SV3D_Conditioning": { + "display_name": "SV3D_Кондиционирование" + }, + "SVD_img2vid_Conditioning": { + "display_name": "SVD_img2vid_Кондиционирование" + }, + "SamplerCustom": { + "display_name": "Пользовательский выборщик" + }, + "SamplerCustomAdvanced": { + "display_name": "Пользовательский выборщик (Расширенный)" + }, + "SamplerDPMAdaptative": { + "display_name": "Адаптивный выборщик DPM" + }, + "SamplerDPMPP_2M_SDE": { + "display_name": "Выборщик DPMPP_2M_SDE" + }, + "SamplerDPMPP_2S_Ancestral": { + "display_name": "Выборщик DPMPP_2S_Ancestral" + }, + "SamplerDPMPP_3M_SDE": { + "display_name": "Выборщик DPMPP_3M_SDE" + }, + "SamplerDPMPP_SDE": { + "display_name": "Выборщик DPMPP_SDE" + }, + "SamplerEulerAncestral": { + "display_name": "Выборщик Эйлера (Анастр.)" + }, + "SamplerEulerAncestralCFGPP": { + "display_name": "Выборщик Эйлера (Анастр.) CFG++" + }, + "SamplerEulerCFGpp": { + "display_name": "Выборщик Эйлера CFG++" + }, + "SamplerLCMUpscale": { + "display_name": "Выборщик LCM Upscale" + }, + "SamplerLMS": { + "display_name": "Выборщик LMS" + }, + "SaveAnimatedPNG": { + "display_name": "Сохранить анимированный PNG" + }, + "SaveAnimatedWEBP": { + "display_name": "Сохранить анимированный WEBP" + }, + "SaveAudio": { + "display_name": "Сохранить аудио" + }, + "SaveImage": { + "description": "Сохраняет входные изображения в вашу директорию вывода ComfyUI.", + "display_name": "Сохранить изображение" + }, + "SaveImageWebsocket": { + "display_name": "Сохранить изображение через веб-сокет" + }, + "SaveLatent": { + "display_name": "Сохранить латент" + }, + "SelfAttentionGuidance": { + "display_name": "Направление самовнимания" + }, + "SetClipHooks": { + "display_name": "Установить хуки CLIP" + }, + "SetHookKeyframes": { + "display_name": "Установить ключевые кадры хука" + }, + "SetLatentNoiseMask": { + "display_name": "Установить маску шума латента" + }, + "SetUnionControlNetType": { + "display_name": "Установить тип объединенного ControlNet" + }, + "SkipLayerGuidanceDiT": { + "description": "Универсальная версия узла SkipLayerGuidance, которую можно использовать на любой модели DiT.", + "display_name": "Пропустить руководство по слоям DiT" + }, + "SkipLayerGuidanceSD3": { + "description": "Универсальная версия узла SkipLayerGuidance, которую можно использовать на любой модели DiT.", + "display_name": "Пропустить руководство по слоям SD3" + }, + "SolidMask": { + "display_name": "Сплошная маска" + }, + "SplitImageWithAlpha": { + "display_name": "Разделить изображение с альфа-каналом" + }, + "SplitSigmas": { + "display_name": "Разделить сигмы" + }, + "SplitSigmasDenoise": { + "display_name": "Разделить сигмы для удаления шума" + }, + "StableCascade_EmptyLatentImage": { + "display_name": "StableCascade_Пустое латентное изображение" + }, + "StableCascade_StageB_Conditioning": { + "display_name": "StableCascade_Этап B_Кондиционирование" + }, + "StableCascade_StageC_VAEEncode": { + "display_name": "StableCascade_Этап C_VAE Кодирование" + }, + "StableCascade_SuperResolutionControlnet": { + "display_name": "StableCascade_Суперразрешение Controlnet" + }, + "StableZero123_Conditioning": { + "display_name": "StableZero123_Кондиционирование" + }, + "StableZero123_Conditioning_Batched": { + "display_name": "StableZero123_Кондиционирование_Пакетное" + }, + "StyleModelApply": { + "display_name": "Применить модель стиля" + }, + "StyleModelLoader": { + "display_name": "Загрузить модель стиля" + }, + "ThresholdMask": { + "display_name": "Пороговая маска" + }, + "TomePatchModel": { + "display_name": "Модель патча Tome" + }, + "TorchCompileModel": { + "display_name": "Скомпилировать модель Torch" + }, + "TripleCLIPLoader": { + "description": "[Рецепты]\n\nsd3: clip-l, clip-g, t5", + "display_name": "Тройной загрузчик CLIP" + }, + "UNETLoader": { + "display_name": "Загрузить модель диффузии" + }, + "UNetCrossAttentionMultiply": { + "display_name": "Умножение перекрестного внимания UNet" + }, + "UNetSelfAttentionMultiply": { + "display_name": "Умножение самовнимания UNet" + }, + "UNetTemporalAttentionMultiply": { + "display_name": "Умножение временного внимания UNet" + }, + "UpscaleModelLoader": { + "display_name": "Загрузить модель увеличения" + }, + "VAEDecode": { + "description": "Декодирует латентные изображения обратно в изображения в пиксельном пространстве.", + "display_name": "Декодировать VAE" + }, + "VAEDecodeAudio": { + "display_name": "Декодировать аудио VAE" + }, + "VAEDecodeTiled": { + "display_name": "Декодировать VAE (плитками)" + }, + "VAEEncode": { + "display_name": "Кодировать VAE" + }, + "VAEEncodeAudio": { + "display_name": "Кодировать аудио VAE" + }, + "VAEEncodeForInpaint": { + "display_name": "Кодировать VAE (для инпейнтинга)" + }, + "VAEEncodeTiled": { + "display_name": "Кодировать VAE (плитками)" + }, + "VAELoader": { + "display_name": "Загрузить VAE" + }, + "VAESave": { + "display_name": "Сохранить VAE" + }, + "VPScheduler": { + "display_name": "Планировщик VP" + }, + "VideoLinearCFGGuidance": { + "display_name": "Направление Video Linear CFG" + }, + "VideoTriangleCFGGuidance": { + "display_name": "Направление Video Triangle CFG" + }, + "WebcamCapture": { + "display_name": "Захват с веб-камеры" + }, + "unCLIPCheckpointLoader": { + "display_name": "Загрузчик контрольной точки unCLIP" + }, + "unCLIPConditioning": { + "display_name": "unCLIP кондиционирование" + } + }, "notSupported": { "continue": "Продолжить", "continueTooltip": "Я уверен, что мое устройство поддерживается", diff --git a/src/locales/zh.json b/src/locales/zh.json index 9c149b49a..08bb76ce1 100644 --- a/src/locales/zh.json +++ b/src/locales/zh.json @@ -196,6 +196,801 @@ "noTasksFound": "未找到任务", "noTasksFoundMessage": "队列中没有任务。", "noWorkflowsFound": "未找到工作流", + "nodeDefs": { + "AddNoise": { + "display_name": "添加噪声" + }, + "AlignYourStepsScheduler": { + "display_name": "对齐步骤调度器" + }, + "BasicGuider": { + "display_name": "基本引导器" + }, + "BasicScheduler": { + "display_name": "基本调度器" + }, + "BetaSamplingScheduler": { + "display_name": "贝塔采样调度器" + }, + "CFGGuider": { + "display_name": "CFG引导器" + }, + "CLIPAttentionMultiply": { + "display_name": "CLIP注意力乘法" + }, + "CLIPLoader": { + "description": "[配方]\n\n稳定扩散:clip-l\n稳定级联:clip-g\nsd3:t5 / clip-g / clip-l\n稳定音频:t5\nmochi:t5", + "display_name": "加载CLIP" + }, + "CLIPMergeAdd": { + "display_name": "CLIP合并添加" + }, + "CLIPMergeSimple": { + "display_name": "CLIP合并简单" + }, + "CLIPMergeSubtract": { + "display_name": "CLIP合并减法" + }, + "CLIPSave": { + "display_name": "保存CLIP" + }, + "CLIPSetLastLayer": { + "display_name": "设置CLIP最后一层" + }, + "CLIPTextEncode": { + "description": "使用CLIP模型对文本提示进行编码,生成可以引导扩散模型生成特定图像的嵌入。", + "display_name": "CLIP文本编码(提示)" + }, + "CLIPTextEncodeControlnet": { + "display_name": "CLIP文本编码控制网" + }, + "CLIPTextEncodeFlux": { + "display_name": "CLIP文本编码Flux" + }, + "CLIPTextEncodeHunyuanDiT": { + "display_name": "CLIP文本编码混元DiT" + }, + "CLIPTextEncodeSD3": { + "display_name": "CLIP文本编码SD3" + }, + "CLIPTextEncodeSDXL": { + "display_name": "CLIP文本编码SDXL" + }, + "CLIPTextEncodeSDXLRefiner": { + "display_name": "CLIP文本编码SDXL精炼器" + }, + "CLIPVisionEncode": { + "display_name": "CLIP视觉编码" + }, + "CLIPVisionLoader": { + "display_name": "加载CLIP视觉" + }, + "Canny": { + "display_name": "Canny边缘检测" + }, + "CheckpointLoader": { + "display_name": "加载检查点配置(已弃用)" + }, + "CheckpointLoaderSimple": { + "description": "加载扩散模型检查点,扩散模型用于去噪潜在图像。", + "display_name": "加载检查点" + }, + "CheckpointSave": { + "display_name": "保存检查点" + }, + "CombineHooks2": { + "display_name": "组合钩子 [2]" + }, + "CombineHooks4": { + "display_name": "组合钩子 [4]" + }, + "CombineHooks8": { + "display_name": "组合钩子 [8]" + }, + "ConditioningAverage": { + "display_name": "条件平均" + }, + "ConditioningCombine": { + "display_name": "条件(组合)" + }, + "ConditioningConcat": { + "display_name": "条件(连接)" + }, + "ConditioningSetArea": { + "display_name": "条件(设置区域)" + }, + "ConditioningSetAreaPercentage": { + "display_name": "条件(按百分比设置区域)" + }, + "ConditioningSetAreaStrength": { + "display_name": "条件设置区域强度" + }, + "ConditioningSetDefaultCombine": { + "display_name": "条件设置默认组合" + }, + "ConditioningSetMask": { + "display_name": "条件(设置掩码)" + }, + "ConditioningSetProperties": { + "display_name": "条件设置属性" + }, + "ConditioningSetPropertiesAndCombine": { + "display_name": "条件设置属性组合" + }, + "ConditioningSetTimestepRange": { + "display_name": "条件设置时间步范围" + }, + "ConditioningTimestepsRange": { + "display_name": "时间步范围" + }, + "ConditioningZeroOut": { + "display_name": "条件零化" + }, + "ControlNetApply": { + "display_name": "应用控制网(旧)" + }, + "ControlNetApplyAdvanced": { + "display_name": "应用控制网" + }, + "ControlNetApplySD3": { + "display_name": "应用控制网与VAE" + }, + "ControlNetInpaintingAliMamaApply": { + "display_name": "控制网修复AliMama应用" + }, + "ControlNetLoader": { + "display_name": "加载控制网模型" + }, + "CreateHookKeyframe": { + "display_name": "创建钩子关键帧" + }, + "CreateHookKeyframesFromFloats": { + "display_name": "从浮点数创建钩子关键帧" + }, + "CreateHookKeyframesInterpolated": { + "display_name": "创建插值钩子关键帧" + }, + "CreateHookLora": { + "display_name": "创建钩子LoRA" + }, + "CreateHookLoraModelOnly": { + "display_name": "仅创建钩子LoRA(MO)" + }, + "CreateHookModelAsLora": { + "display_name": "创建钩子模型作为LoRA" + }, + "CreateHookModelAsLoraModelOnly": { + "display_name": "仅创建钩子模型作为LoRA(MO)" + }, + "CropMask": { + "display_name": "裁剪掩码" + }, + "DevToolsDeprecatedNode": { + "description": "一个已弃用的节点", + "display_name": "已弃用节点" + }, + "DevToolsErrorRaiseNode": { + "description": "出于开发目的引发错误", + "display_name": "引发错误" + }, + "DevToolsErrorRaiseNodeWithMessage": { + "description": "出于开发目的引发带消息的错误", + "display_name": "带消息的引发错误" + }, + "DevToolsExperimentalNode": { + "description": "一个实验性的节点", + "display_name": "实验性节点" + }, + "DevToolsLongComboDropdown": { + "description": "一个长组合下拉菜单", + "display_name": "长组合下拉菜单" + }, + "DevToolsNodeWithForceInput": { + "description": "一个具有强制输入的节点", + "display_name": "强制输入节点" + }, + "DevToolsNodeWithOnlyOptionalInput": { + "description": "一个仅有可选输入的节点", + "display_name": "仅有可选输入的节点" + }, + "DevToolsNodeWithOptionalInput": { + "description": "一个具有可选输入的节点", + "display_name": "具有可选输入的节点" + }, + "DevToolsNodeWithOutputList": { + "description": "一个具有输出列表的节点", + "display_name": "具有输出列表的节点" + }, + "DevToolsNodeWithStringInput": { + "description": "一个具有字符串输入的节点", + "display_name": "具有字符串输入的节点" + }, + "DevToolsNodeWithUnionInput": { + "description": "一个具有联合输入的节点", + "display_name": "具有联合输入的节点" + }, + "DiffControlNetLoader": { + "display_name": "加载控制网模型(diff)" + }, + "DifferentialDiffusion": { + "display_name": "差分扩散" + }, + "DiffusersLoader": { + "display_name": "扩散器加载器" + }, + "DisableNoise": { + "display_name": "禁用噪声" + }, + "DualCFGGuider": { + "display_name": "双CFG引导器" + }, + "DualCLIPLoader": { + "description": "[配方]\n\nsdxl:clip-l,clip-g\nsd3:clip-l,clip-g / clip-l,t5 / clip-g,t5\nflux:clip-l,t5", + "display_name": "双CLIP加载器" + }, + "EmptyImage": { + "display_name": "空图像" + }, + "EmptyLTXVLatentVideo": { + "display_name": "空LTXV潜在视频" + }, + "EmptyLatentAudio": { + "display_name": "空潜在音频" + }, + "EmptyLatentImage": { + "description": "创建一批新的空潜在图像,以通过采样进行去噪。", + "display_name": "空潜在图像" + }, + "EmptyMochiLatentVideo": { + "display_name": "空Mochi潜在视频" + }, + "EmptySD3LatentImage": { + "display_name": "空SD3潜在图像" + }, + "ExponentialScheduler": { + "display_name": "指数调度器" + }, + "FeatherMask": { + "display_name": "羽毛掩码" + }, + "FlipSigmas": { + "display_name": "翻转Sigma" + }, + "FluxGuidance": { + "display_name": "Flux引导" + }, + "FreeU": { + "display_name": "FreeU" + }, + "FreeU_V2": { + "display_name": "FreeU_V2" + }, + "GITSScheduler": { + "display_name": "GITS调度器" + }, + "GLIGENLoader": { + "display_name": "GLIGEN加载器" + }, + "GLIGENTextBoxApply": { + "display_name": "GLIGEN文本框应用" + }, + "GrowMask": { + "display_name": "扩展掩码" + }, + "HyperTile": { + "display_name": "超平铺" + }, + "HypernetworkLoader": { + "display_name": "超网络加载器" + }, + "ImageBatch": { + "display_name": "图像批处理" + }, + "ImageBlend": { + "display_name": "图像混合" + }, + "ImageBlur": { + "display_name": "图像模糊" + }, + "ImageColorToMask": { + "display_name": "图像颜色到掩码" + }, + "ImageCompositeMasked": { + "display_name": "图像合成掩码" + }, + "ImageCrop": { + "display_name": "图像裁剪" + }, + "ImageFromBatch": { + "display_name": "从批次获取图像" + }, + "ImageInvert": { + "display_name": "反转图像" + }, + "ImageOnlyCheckpointLoader": { + "display_name": "仅图像检查点加载器(img2vid模型)" + }, + "ImageOnlyCheckpointSave": { + "display_name": "仅图像检查点保存" + }, + "ImagePadForOutpaint": { + "display_name": "为外绘填充图像" + }, + "ImageQuantize": { + "display_name": "图像量化" + }, + "ImageScale": { + "display_name": "图像放大" + }, + "ImageScaleBy": { + "display_name": "按比例放大图像" + }, + "ImageScaleToTotalPixels": { + "display_name": "将图像缩放到总像素" + }, + "ImageSharpen": { + "display_name": "图像锐化" + }, + "ImageToMask": { + "display_name": "将图像转换为掩码" + }, + "ImageUpscaleWithModel": { + "display_name": "使用模型放大图像" + }, + "InpaintModelConditioning": { + "display_name": "修复模型条件" + }, + "InstructPixToPixConditioning": { + "display_name": "指令像素到像素条件" + }, + "InvertMask": { + "display_name": "反转掩码" + }, + "JoinImageWithAlpha": { + "display_name": "与Alpha合并图像" + }, + "KSampler": { + "description": "使用提供的模型、正向和负向条件去噪潜在图像。", + "display_name": "K采样器" + }, + "KSamplerAdvanced": { + "display_name": "K采样器(高级)" + }, + "KSamplerSelect": { + "display_name": "K采样器选择" + }, + "KarrasScheduler": { + "display_name": "Karras调度器" + }, + "LTXVConditioning": { + "display_name": "LTXV条件" + }, + "LTXVImgToVideo": { + "display_name": "LTXV图像到视频" + }, + "LTXVScheduler": { + "display_name": "LTXV调度器" + }, + "LaplaceScheduler": { + "display_name": "拉普拉斯调度器" + }, + "LatentAdd": { + "display_name": "潜在添加" + }, + "LatentApplyOperation": { + "display_name": "潜在应用操作" + }, + "LatentApplyOperationCFG": { + "display_name": "潜在应用操作CFG" + }, + "LatentBatch": { + "display_name": "潜在批处理" + }, + "LatentBatchSeedBehavior": { + "display_name": "潜在批处理种子行为" + }, + "LatentBlend": { + "display_name": "潜在混合" + }, + "LatentComposite": { + "display_name": "潜在合成" + }, + "LatentCompositeMasked": { + "display_name": "潜在合成掩码" + }, + "LatentCrop": { + "display_name": "裁剪潜在" + }, + "LatentFlip": { + "display_name": "翻转潜在" + }, + "LatentFromBatch": { + "display_name": "从批次获取潜在" + }, + "LatentInterpolate": { + "display_name": "潜在插值" + }, + "LatentMultiply": { + "display_name": "潜在乘法" + }, + "LatentOperationSharpen": { + "display_name": "潜在操作锐化" + }, + "LatentOperationTonemapReinhard": { + "display_name": "潜在操作色调映射Reinhard" + }, + "LatentRotate": { + "display_name": "旋转潜在" + }, + "LatentSubtract": { + "display_name": "潜在减法" + }, + "LatentUpscale": { + "display_name": "放大潜在" + }, + "LatentUpscaleBy": { + "display_name": "按比例放大潜在" + }, + "LoadAudio": { + "display_name": "加载音频" + }, + "LoadImage": { + "display_name": "加载图像" + }, + "LoadImageMask": { + "display_name": "加载图像(作为掩码)" + }, + "LoadLatent": { + "display_name": "加载潜在" + }, + "LoraLoader": { + "description": "LoRA用于修改扩散和CLIP模型,改变潜在图像的去噪方式,例如应用风格。多个LoRA节点可以链接在一起。", + "display_name": "加载LoRA" + }, + "LoraLoaderModelOnly": { + "description": "LoRA用于修改扩散和CLIP模型,改变潜在图像的去噪方式,例如应用风格。多个LoRA节点可以链接在一起。", + "display_name": "仅加载LoRA模型" + }, + "LoraSave": { + "display_name": "提取并保存LoRA" + }, + "MaskComposite": { + "display_name": "掩码合成" + }, + "MaskToImage": { + "display_name": "将掩码转换为图像" + }, + "ModelMergeAdd": { + "display_name": "模型合并添加" + }, + "ModelMergeAuraflow": { + "display_name": "模型合并Auraflow" + }, + "ModelMergeBlocks": { + "display_name": "模型合并块" + }, + "ModelMergeFlux1": { + "display_name": "模型合并Flux1" + }, + "ModelMergeLTXV": { + "display_name": "模型合并LTXV" + }, + "ModelMergeMochiPreview": { + "display_name": "模型合并Mochi预览" + }, + "ModelMergeSD1": { + "display_name": "模型合并SD1" + }, + "ModelMergeSD2": { + "display_name": "模型合并SD2" + }, + "ModelMergeSD35_Large": { + "display_name": "模型合并SD35_大" + }, + "ModelMergeSD3_2B": { + "display_name": "模型合并SD3_2B" + }, + "ModelMergeSDXL": { + "display_name": "模型合并SDXL" + }, + "ModelMergeSimple": { + "display_name": "模型合并简单" + }, + "ModelMergeSubtract": { + "display_name": "模型合并减法" + }, + "ModelSamplingAuraFlow": { + "display_name": "模型采样AuraFlow" + }, + "ModelSamplingContinuousEDM": { + "display_name": "模型采样连续EDM" + }, + "ModelSamplingContinuousV": { + "display_name": "模型采样连续V" + }, + "ModelSamplingDiscrete": { + "display_name": "模型采样离散" + }, + "ModelSamplingFlux": { + "display_name": "模型采样Flux" + }, + "ModelSamplingLTXV": { + "display_name": "模型采样LTXV" + }, + "ModelSamplingSD3": { + "display_name": "模型采样SD3" + }, + "ModelSamplingStableCascade": { + "display_name": "模型采样稳定级联" + }, + "ModelSave": { + "display_name": "保存模型" + }, + "Morphology": { + "display_name": "图像形态学" + }, + "PairConditioningCombine": { + "display_name": "条件对组合" + }, + "PairConditioningSetDefaultCombine": { + "display_name": "条件对设置默认组合" + }, + "PairConditioningSetProperties": { + "display_name": "条件对设置属性" + }, + "PairConditioningSetPropertiesAndCombine": { + "display_name": "条件对设置属性组合" + }, + "PatchModelAddDownscale": { + "display_name": "补丁模型添加下采样(Kohya深度缩小)" + }, + "PerpNeg": { + "display_name": "Perp-Neg(已弃用,使用PerpNegGuider)" + }, + "PerpNegGuider": { + "display_name": "PerpNeg引导器" + }, + "PerturbedAttentionGuidance": { + "display_name": "扰动注意力引导" + }, + "PhotoMakerEncode": { + "display_name": "PhotoMaker编码" + }, + "PhotoMakerLoader": { + "display_name": "PhotoMaker加载器" + }, + "PolyexponentialScheduler": { + "display_name": "多指数调度器" + }, + "PorterDuffImageComposite": { + "display_name": "Porter-Duff图像合成" + }, + "PreviewAudio": { + "display_name": "预览音频" + }, + "PreviewImage": { + "description": "将输入图像保存到您的ComfyUI输出目录。", + "display_name": "预览图像" + }, + "RandomNoise": { + "display_name": "随机噪声" + }, + "RebatchImages": { + "display_name": "重新批处理图像" + }, + "RebatchLatents": { + "display_name": "重新批处理潜在" + }, + "RepeatImageBatch": { + "display_name": "重复图像批处理" + }, + "RepeatLatentBatch": { + "display_name": "重复潜在批处理" + }, + "RescaleCFG": { + "display_name": "重新缩放CFG" + }, + "SDTurboScheduler": { + "display_name": "SDTurbo调度器" + }, + "SD_4XUpscale_Conditioning": { + "display_name": "SD_4X放大条件" + }, + "SV3D_Conditioning": { + "display_name": "SV3D条件" + }, + "SVD_img2vid_Conditioning": { + "display_name": "SVD_img2vid条件" + }, + "SamplerCustom": { + "display_name": "自定义采样器" + }, + "SamplerCustomAdvanced": { + "display_name": "自定义采样器(高级)" + }, + "SamplerDPMAdaptative": { + "display_name": "自适应DPM采样器" + }, + "SamplerDPMPP_2M_SDE": { + "display_name": "DPMPP_2M_SDE采样器" + }, + "SamplerDPMPP_2S_Ancestral": { + "display_name": "DPMPP_2S_祖先采样器" + }, + "SamplerDPMPP_3M_SDE": { + "display_name": "DPMPP_3M_SDE采样器" + }, + "SamplerDPMPP_SDE": { + "display_name": "DPMPP_SDE采样器" + }, + "SamplerEulerAncestral": { + "display_name": "欧拉祖先采样器" + }, + "SamplerEulerAncestralCFGPP": { + "display_name": "欧拉祖先CFG++采样器" + }, + "SamplerEulerCFGpp": { + "display_name": "欧拉CFG++采样器" + }, + "SamplerLCMUpscale": { + "display_name": "LCM放大采样器" + }, + "SamplerLMS": { + "display_name": "LMS采样器" + }, + "SaveAnimatedPNG": { + "display_name": "保存动画PNG" + }, + "SaveAnimatedWEBP": { + "display_name": "保存动画WEBP" + }, + "SaveAudio": { + "display_name": "保存音频" + }, + "SaveImage": { + "description": "将输入图像保存到您的ComfyUI输出目录。", + "display_name": "保存图像" + }, + "SaveImageWebsocket": { + "display_name": "保存图像Websocket" + }, + "SaveLatent": { + "display_name": "保存潜在" + }, + "SelfAttentionGuidance": { + "display_name": "自注意力引导" + }, + "SetClipHooks": { + "display_name": "设置CLIP钩子" + }, + "SetHookKeyframes": { + "display_name": "设置钩子关键帧" + }, + "SetLatentNoiseMask": { + "display_name": "设置潜在噪声掩码" + }, + "SetUnionControlNetType": { + "display_name": "设置联合控制网类型" + }, + "SkipLayerGuidanceDiT": { + "description": "通用版本的跳过层引导节点,可用于每个DiT模型。", + "display_name": "跳过层引导DiT" + }, + "SkipLayerGuidanceSD3": { + "description": "通用版本的跳过层引导节点,可用于每个DiT模型。", + "display_name": "跳过层引导SD3" + }, + "SolidMask": { + "display_name": "实心掩码" + }, + "SplitImageWithAlpha": { + "display_name": "按Alpha分割图像" + }, + "SplitSigmas": { + "display_name": "分割Sigma" + }, + "SplitSigmasDenoise": { + "display_name": "分割Sigma去噪" + }, + "StableCascade_EmptyLatentImage": { + "display_name": "稳定级联_空潜在图像" + }, + "StableCascade_StageB_Conditioning": { + "display_name": "稳定级联_B阶段条件" + }, + "StableCascade_StageC_VAEEncode": { + "display_name": "稳定级联_C阶段VAE编码" + }, + "StableCascade_SuperResolutionControlnet": { + "display_name": "稳定级联_超分辨率控制网" + }, + "StableZero123_Conditioning": { + "display_name": "稳定零123条件" + }, + "StableZero123_Conditioning_Batched": { + "display_name": "稳定零123条件_批处理" + }, + "StyleModelApply": { + "display_name": "应用风格模型" + }, + "StyleModelLoader": { + "display_name": "加载风格模型" + }, + "ThresholdMask": { + "display_name": "阈值掩码" + }, + "TomePatchModel": { + "display_name": "Tome补丁模型" + }, + "TorchCompileModel": { + "display_name": "Torch编译模型" + }, + "TripleCLIPLoader": { + "description": "[配方]\n\nsd3:clip-l,clip-g,t5", + "display_name": "三重CLIP加载器" + }, + "UNETLoader": { + "display_name": "加载扩散模型" + }, + "UNetCrossAttentionMultiply": { + "display_name": "UNet交叉注意力乘法" + }, + "UNetSelfAttentionMultiply": { + "display_name": "UNet自注意力乘法" + }, + "UNetTemporalAttentionMultiply": { + "display_name": "UNet时间注意力乘法" + }, + "UpscaleModelLoader": { + "display_name": "加载放大模型" + }, + "VAEDecode": { + "description": "将潜在图像解码回像素空间图像。", + "display_name": "VAE解码" + }, + "VAEDecodeAudio": { + "display_name": "VAE解码音频" + }, + "VAEDecodeTiled": { + "display_name": "VAE解码(平铺)" + }, + "VAEEncode": { + "display_name": "VAE编码" + }, + "VAEEncodeAudio": { + "display_name": "VAE编码音频" + }, + "VAEEncodeForInpaint": { + "display_name": "VAE编码(用于修复)" + }, + "VAEEncodeTiled": { + "display_name": "VAE编码(平铺)" + }, + "VAELoader": { + "display_name": "加载VAE" + }, + "VAESave": { + "display_name": "保存VAE" + }, + "VPScheduler": { + "display_name": "VPS调度器" + }, + "VideoLinearCFGGuidance": { + "display_name": "视频线性CFG引导" + }, + "VideoTriangleCFGGuidance": { + "display_name": "视频三角形CFG引导" + }, + "WebcamCapture": { + "display_name": "网络摄像头捕获" + }, + "unCLIPCheckpointLoader": { + "display_name": "unCLIP检查点加载器" + }, + "unCLIPConditioning": { + "display_name": "unCLIP条件" + } + }, "notSupported": { "continue": "继续", "continueTooltip": "我确定我的设备是受支持的", diff --git a/src/scripts/app.ts b/src/scripts/app.ts index 8132ef466..40b973c74 100644 --- a/src/scripts/app.ts +++ b/src/scripts/app.ts @@ -5,7 +5,7 @@ import { initWidgets } from './widgets' import { ComfyUI, $el } from './ui' -import { api } from './api' +import { api, type ComfyApi } from './api' import { defaultGraph } from './defaultGraph' import { getPngMetadata, @@ -61,6 +61,7 @@ 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 { t } from '@/i18n' export const ANIM_PREVIEW_WIDGET = '$$comfy_animation_preview' @@ -114,6 +115,7 @@ export class ComfyApp { static clipspace_return_node = null vueAppReady: boolean + api: ComfyApi ui: ComfyUI extensions: ComfyExtension[] extensionManager: ExtensionManager @@ -184,6 +186,7 @@ export class ComfyApp { constructor() { this.vueAppReady = false this.ui = new ComfyUI(this) + this.api = api this.bodyTop = $el('div.comfyui-body-top', { parent: document.body }) this.bodyLeft = $el('div.comfyui-body-left', { parent: document.body }) this.bodyRight = $el('div.comfyui-body-right', { parent: document.body }) @@ -1818,14 +1821,38 @@ export class ComfyApp { nodeDefStore.updateNodeDefs(nodeDefArray) } + #translateNodeDefs(defs: Record) { + return Object.fromEntries( + Object.entries(defs).map(([name, def]) => [ + name, + { + ...def, + display_name: t( + `nodeDefs.${name}.display_name`, + def.display_name ?? def.name + ), + description: def.description + ? t(`nodeDefs.${name}.description`, def.description) + : undefined + } + ]) + ) + } + + async #getNodeDefs() { + return this.#translateNodeDefs( + await api.getNodeDefs({ + validate: useSettingStore().get('Comfy.Validation.NodeDefs') + }) + ) + } + /** * Registers nodes with the graph */ async registerNodes() { // Load node definitions from the backend - const defs = await api.getNodeDefs({ - validate: useSettingStore().get('Comfy.Validation.NodeDefs') - }) + const defs = await this.#getNodeDefs() await this.registerNodesFromDefs(defs) await this.#invokeExtensionsAsync('registerCustomNodes') if (this.vueAppReady) { @@ -2766,10 +2793,7 @@ export class ComfyApp { useToastStore().add(requestToastMessage) } - const defs = await api.getNodeDefs({ - validate: useSettingStore().get('Comfy.Validation.NodeDefs') - }) - + const defs = await this.#getNodeDefs() for (const nodeId in defs) { this.registerNodeDef(nodeId, defs[nodeId]) }