diff --git a/web/extensions/core/i18n.js b/web/extensions/core/i18n.js index 883fed988..bd506d619 100644 --- a/web/extensions/core/i18n.js +++ b/web/extensions/core/i18n.js @@ -9,30 +9,43 @@ app.registerExtension({ if ("input" in defs[k] && defs[k].input.required) { for (const i in defs[k].input.required) { if (defs[k].input.required[i].length > 1) { - defs[k].input.required[i][1].label = i18next.t(`node.input.${k}.${i}`) + defs[k].input.required[i][1].label = i18next.t(`node.input.${i}`) } else { - defs[k].input.required[i].push({ label: i18next.t(`node.input.${k}.${i}`) }) + defs[k].input.required[i].push({ label: i18next.t(`node.input.${i}`) }) } } } + if ("input" in defs[k] && defs[k].input.optional) { + for (const i in defs[k].input.optional) { + if (defs[k].input.optional[i].length > 1) { + defs[k].input.optional[i][1].label = i18next.t(`node.input.${i}`) + } else { + defs[k].input.optional[i].push({ label: i18next.t(`node.input.${i}`) }) + } + } + } + + if (!("output_name" in defs[k]) && defs[k].output && defs[k].output.length > 0) { + defs[k].output_name = defs[k].output.map(i => i18next.t(`node.output.${i}`)) + } } }, nodeCreated(node) { if ("inputs" in node) { for (const item of node.inputs) { - item.label = i18next.t(`node.input.${node.comfyClass}.${item.name}`) + item.label = i18next.t(`node.input.${item.name}`) } } if ("widgets" in node) { for (const item of node.widgets) { - item.label = i18next.t(`node.input.${node.comfyClass}.${item.name}`) + item.label = i18next.t(`node.input.${item.name}`) } } if ("outputs" in node) { for (const item of node.outputs) { - item.label = i18next.t(`node.output.${node.comfyClass}.${item.name}`) + item.label = i18next.t(`node.output.${item.name}`) } } }, @@ -41,6 +54,7 @@ app.registerExtension({ for (const k in defs) { defs[k].category = i18next.t(`category.${defs[k].category}`) + defs[k].display_name = i18next.t(`node.title.${k}`) } } }) \ No newline at end of file diff --git a/web/i18n/en_US.js b/web/i18n/en_US.js index cf67296e9..a92873e4f 100644 --- a/web/i18n/en_US.js +++ b/web/i18n/en_US.js @@ -32,6 +32,8 @@ export default { "node.title.VAELoader": "Load VAE", "node.title.LoraLoader": "Load LoRA", "node.title.CLIPLoader": "Load CLIP", + "node.title.UNETLoader": "UNETLoader", + "node.title.DualCLIPLoader": "DualCLIPLoader", "node.title.ControlNetLoader": "Load ControlNet Model", "node.title.DiffControlNetLoader": "Load ControlNet Model (diff)", "node.title.StyleModelLoader": "Load Style Model", @@ -40,10 +42,11 @@ export default { // Conditioning "node.title.CLIPVisionEncode": "CLIP Vision Encode", "node.title.StyleModelApply": "Apply Style Model", + "node.title.unCLIPConditioning": "unCLIPConditioning", "node.title.CLIPTextEncode": "CLIP Text Encode (Prompt)", "node.title.CLIPSetLastLayer": "CLIP Set Last Layer", "node.title.ConditioningCombine": "Conditioning (Combine)", - "node.title.ConditioningAverage ": "Conditioning (Average)", + "node.title.ConditioningAverage": "Conditioning (Average)", "node.title.ConditioningConcat": "Conditioning (Concat)", "node.title.ConditioningSetArea": "Conditioning (Set Area)", "node.title.ConditioningSetMask": "Conditioning (Set Mask)", @@ -62,7 +65,7 @@ export default { "node.title.LatentUpscaleBy": "Upscale Latent By", "node.title.LatentComposite": "Latent Composite", "node.title.LatentBlend": "Latent Blend", - "LatentFromBatch": "Latent From Batch", + "node.title.LatentFromBatch": "Latent From Batch", "node.title.RepeatLatentBatch": "Repeat Latent Batch", // Image "node.title.SaveImage": "Save Image", @@ -77,12 +80,140 @@ export default { // _for_testing "node.title.VAEDecodeTiled": "VAE Decode (Tiled)", "node.title.VAEEncodeTiled": "VAE Encode (Tiled)", + "node.title.unCLIPCheckpointLoader": "unCLIPCheckpointLoader", + "node.title.GLIGENLoader": "GLIGENLoader", + "node.title.GLIGENTextBoxApply": "GLIGENTextBoxApply", + // extras + "node.title.Canny": "Canny", + "node.title.CLIPTextEncodeSDXLRefiner": "CLIPTextEncodeSDXLRefiner", + "node.title.CLIPTextEncodeSDXL": "CLIPTextEncodeSDXL", + "node.title.HypernetworkLoader": "HypernetworkLoader", + "node.title.LatentCompositeMasked": "LatentCompositeMasked", + "node.title.MaskToImage": "Convert Mask to Image", + "node.title.ImageToMask": "Convert Image to Mask", + "node.title.SolidMask": "SolidMask", + "node.title.InvertMask": "InvertMask", + "node.title.CropMask": "CropMask", + "node.title.MaskComposite": "MaskComposite", + "node.title.FeatherMask": "FeatherMask", + "node.title.ModelMergeSimple": "ModelMergeSimple", + "node.title.ModelMergeBlocks": "ModelMergeBlocks", + "node.title.CheckpointSave": "CheckpointSave", + "node.title.CLIPMergeSimple": "CLIPMergeSimple", + "node.title.ImageBlend": "Blend", + "node.title.ImageBlur": "Blur", + "node.title.ImageQuantize": "Quantize", + "node.title.ImageSharpen": "Sharpen", + "node.title.RebatchLatents": "Rebatch Latents", + "node.title.TomePatchModel": "TomePatchModel", + "node.title.UpscaleModelLoader": "UpscaleModelLoader", + "node.title.ImageUpscaleWithModel": "ImageUpscaleWithModel", + "node.title.DiffusersLoader": "DiffusersLoader", + "node.title.LoadLatent": "LoadLatent", + "node.title.SaveLatent": "SaveLatent", + "node.title.ConditioningZeroOut": "ConditioningZeroOut", + "node.title.ConditioningSetTimestepRange": "ConditioningSetTimestepRange", - "node.input.CheckpointLoaderSimple.ckpt_name": "ckpt_name", - "node.input.SaveImage.filename_prefix": "filename_prefix", - "node.input.SaveImage.images": "images", + "node.input.text": "text", + "node.input.clip": "clip", + "node.input.conditioning_1": "conditioning_1", + "node.input.conditioning_2": "conditioning_2", + "node.input.conditioning_to": "conditioning_to", + "node.input.conditioning_from": "conditioning_from", + "node.input.conditioning_to_strength": "conditioning_to_strength", + "node.input.conditioning": "conditioning", + "node.input.width": "width", + "node.input.height": "height", + "node.input.x": "x", + "node.input.y": "y", + "node.input.strength": "strength", + "node.input.mask": "mask", + "node.input.set_cond_area": "set_cond_area", + "node.input.start": "start", + "node.input.end": "end", + "node.input.samples": "samples", + "node.input.vae": "vae", + "node.input.pixels": "pixels", + "node.input.grow_mask_by": "grow_mask_by", + "node.input.filename_prefix": "filename_prefix", + "node.input.latent": "latent", + "node.input.ckpt_name": "ckpt_name", + "node.input.config_name": "config_name", + "node.input.model_path": "model_path", + "node.input.stop_at_clip_layer": "stop_at_clip_layer", + "node.input.model": "model", + "node.input.lora_name": "lora_name", + "node.input.strength_model": "strength_model", + "node.input.strength_clip": "strength_clip", + "node.input.vae_name": "vae_name", + "node.input.control_net_name": "control_net_name", + "node.input.control_net": "control_net", + "node.input.image": "image", + "node.input.positive": "positive", + "node.input.negative": "negative", + "node.input.start_percent": "start_percent", + "node.input.end_percent": "end_percent", + "node.input.unet_name": "unet_name", + "node.input.clip_name": "clip_name", + "node.input.clip_name1": "clip_name1", + "node.input.clip_name2": "clip_name2", + "node.input.clip_vision": "clip_vision", + "node.input.style_model_name": "style_model_name", + "node.input.style_model": "style_model", + "node.input.clip_vision_output": "clip_vision_output", + "node.input.noise_augmentation": "noise_augmentation", + "node.input.gligen_name": "gligen_name", + "node.input.gligen_textbox_model": "gligen_textbox_model", + "node.input.batch_size": "batch_size", + "node.input.batch_index": "batch_index", + "node.input.length": "length", + "node.input.amount": "amount", + "node.input.upscale_method": "upscale_method", + "node.input.crop": "crop", + "node.input.scale_by": "scale_by", + "node.input.images": "images", + "node.input.samples_to": "samples_to", + "node.input.samples_from": "samples_from", + "node.input.feather": "feather", + "node.input.samples1": "samples1", + "node.input.samples2": "samples2", + "node.input.blend_factor": "blend_factor", + "node.input.seed": "seed", + "node.input.steps": "steps", + "node.input.cfg": "cfg", + "node.input.sampler_name": "sampler_name", + "node.input.scheduler": "scheduler", + "node.input.latent_image": "latent_image", + "node.input.denoise": "denoise", + "node.input.add_noise": "add_noise", + "node.input.noise_seed": "noise_seed", + "node.input.start_at_step": "start_at_step", + "node.input.end_at_step": "end_at_step", + "node.input.return_with_leftover_noise": "return_with_leftover_noise", + "node.input.prompt": "prompt", + "node.input.extra_pnginfo": "extra_pnginfo", + "node.input.channel": "channel", + "node.input.left": "left", + "node.input.right": "right", + "node.input.top": "top", + "node.input.bottom": "bottom", + "node.input.feathering": "feathering", + "node.input.control_after_generate": "control_after_generate", + "node.input.low_threshold": "low_threshold", + "node.input.high_threshold": "high_threshold", - "node.output.CheckpointLoaderSimple.MODEL": "MODEL", + "node.output.CONDITIONING": "CONDITIONING", + "node.output.IMAGE": "IMAGE", + "node.output.LATENT": "LATENT", + "node.output.MODEL": "MODEL", + "node.output.CLIP": "CLIP", + "node.output.VAE": "VAE", + "node.output.CLIP_VISION": "CLIP_VISION", + "node.output.CONTROL_NET": "CONTROL_NET", + "node.output.CLIP_VISION_OUTPUT": "CLIP_VISION_OUTPUT", + "node.output.STYLE_MODEL": "STYLE_MODEL", + "node.output.GLIGEN": "GLIGEN", + "node.output.MASK": "MASK", "category.conditioning": "conditioning", "category.loaders": "loaders", diff --git a/web/i18n/zh_CN.js b/web/i18n/zh_CN.js index eae6dbe33..1ff84c36c 100644 --- a/web/i18n/zh_CN.js +++ b/web/i18n/zh_CN.js @@ -27,23 +27,26 @@ export default { "node.title.KSampler": "采样器", "node.title.KSamplerAdvanced": "采样器 (高级)", // Loaders - "node.title.CheckpointLoader": "Load Checkpoint (With Config)", + "node.title.CheckpointLoader": "加载模型 (指定配置)", "node.title.CheckpointLoaderSimple": "加载模型", - "node.title.VAELoader": "Load VAE", - "node.title.LoraLoader": "Load LoRA", - "node.title.CLIPLoader": "Load CLIP", - "node.title.ControlNetLoader": "Load ControlNet Model", - "node.title.DiffControlNetLoader": "Load ControlNet Model (diff)", - "node.title.StyleModelLoader": "Load Style Model", - "node.title.CLIPVisionLoader": "Load CLIP Vision", - "node.title.UpscaleModelLoader": "Load Upscale Model", + "node.title.VAELoader": "加载 VAE", + "node.title.LoraLoader": "加载 LoRA", + "node.title.CLIPLoader": "加载 CLIP", + "node.title.UNETLoader": "UNETLoader", + "node.title.DualCLIPLoader": "DualCLIPLoader", + "node.title.ControlNetLoader": "加载 ControlNet 模型", + "node.title.DiffControlNetLoader": "加载 ControlNet 模型 (diff)", + "node.title.StyleModelLoader": "加载样式模型", + "node.title.CLIPVisionLoader": "加载 CLIP 视觉", + "node.title.UpscaleModelLoader": "加载外扩模型", // Conditioning - "node.title.CLIPVisionEncode": "CLIP Vision Encode", + "node.title.CLIPVisionEncode": "CLIP 视觉编码", "node.title.StyleModelApply": "Apply Style Model", + "node.title.unCLIPConditioning": "unCLIPConditioning", "node.title.CLIPTextEncode": "CLIP Text Encode (Prompt)", "node.title.CLIPSetLastLayer": "CLIP Set Last Layer", "node.title.ConditioningCombine": "Conditioning (Combine)", - "node.title.ConditioningAverage ": "Conditioning (Average)", + "node.title.ConditioningAverage": "Conditioning (Average)", "node.title.ConditioningConcat": "Conditioning (Concat)", "node.title.ConditioningSetArea": "Conditioning (Set Area)", "node.title.ConditioningSetMask": "Conditioning (Set Mask)", @@ -62,7 +65,7 @@ export default { "node.title.LatentUpscaleBy": "Upscale Latent By", "node.title.LatentComposite": "Latent Composite", "node.title.LatentBlend": "Latent Blend", - "LatentFromBatch": "Latent From Batch", + "node.title.LatentFromBatch": "Latent From Batch", "node.title.RepeatLatentBatch": "Repeat Latent Batch", // Image "node.title.SaveImage": "Save Image", @@ -77,12 +80,140 @@ export default { // _for_testing "node.title.VAEDecodeTiled": "VAE Decode (Tiled)", "node.title.VAEEncodeTiled": "VAE Encode (Tiled)", + "node.title.unCLIPCheckpointLoader": "unCLIPCheckpointLoader", + "node.title.GLIGENLoader": "GLIGENLoader", + "node.title.GLIGENTextBoxApply": "GLIGENTextBoxApply", + // extras + "node.title.Canny": "Canny", + "node.title.CLIPTextEncodeSDXLRefiner": "CLIPTextEncodeSDXLRefiner", + "node.title.CLIPTextEncodeSDXL": "CLIPTextEncodeSDXL", + "node.title.HypernetworkLoader": "HypernetworkLoader", + "node.title.LatentCompositeMasked": "LatentCompositeMasked", + "node.title.MaskToImage": "Convert Mask to Image", + "node.title.ImageToMask": "Convert Image to Mask", + "node.title.SolidMask": "SolidMask", + "node.title.InvertMask": "InvertMask", + "node.title.CropMask": "CropMask", + "node.title.MaskComposite": "MaskComposite", + "node.title.FeatherMask": "FeatherMask", + "node.title.ModelMergeSimple": "ModelMergeSimple", + "node.title.ModelMergeBlocks": "ModelMergeBlocks", + "node.title.CheckpointSave": "CheckpointSave", + "node.title.CLIPMergeSimple": "CLIPMergeSimple", + "node.title.ImageBlend": "Blend", + "node.title.ImageBlur": "Blur", + "node.title.ImageQuantize": "Quantize", + "node.title.ImageSharpen": "Sharpen", + "node.title.RebatchLatents": "Rebatch Latents", + "node.title.TomePatchModel": "TomePatchModel", + "node.title.UpscaleModelLoader": "UpscaleModelLoader", + "node.title.ImageUpscaleWithModel": "ImageUpscaleWithModel", + "node.title.DiffusersLoader": "DiffusersLoader", + "node.title.LoadLatent": "LoadLatent", + "node.title.SaveLatent": "SaveLatent", + "node.title.ConditioningZeroOut": "ConditioningZeroOut", + "node.title.ConditioningSetTimestepRange": "ConditioningSetTimestepRange", - "node.input.CheckpointLoaderSimple.ckpt_name": "模型文件", - "node.input.SaveImage.filename_prefix": "文件名前缀", - "node.input.SaveImage.images": "图片", + "node.input.text": "文本", + "node.input.clip": "clip", + "node.input.conditioning_1": "conditioning_1", + "node.input.conditioning_2": "conditioning_2", + "node.input.conditioning_to": "conditioning_to", + "node.input.conditioning_from": "conditioning_from", + "node.input.conditioning_to_strength": "conditioning_to_strength", + "node.input.conditioning": "conditioning", + "node.input.width": "宽度", + "node.input.height": "高度", + "node.input.x": "x", + "node.input.y": "y", + "node.input.strength": "strength", + "node.input.mask": "遮罩", + "node.input.set_cond_area": "set_cond_area", + "node.input.start": "start", + "node.input.end": "end", + "node.input.samples": "samples", + "node.input.vae": "vae", + "node.input.pixels": "pixels", + "node.input.grow_mask_by": "grow_mask_by", + "node.input.filename_prefix": "文件名前缀", + "node.input.latent": "latent", + "node.input.ckpt_name": "模型文件", + "node.input.config_name": "配置文件", + "node.input.model_path": "模型路径", + "node.input.stop_at_clip_layer": "stop_at_clip_layer", + "node.input.model": "模型", + "node.input.lora_name": "lora_name", + "node.input.strength_model": "strength_model", + "node.input.strength_clip": "strength_clip", + "node.input.vae_name": "vae_name", + "node.input.control_net_name": "control_net_name", + "node.input.control_net": "control_net", + "node.input.image": "图像", + "node.input.positive": "positive", + "node.input.negative": "negative", + "node.input.start_percent": "start_percent", + "node.input.end_percent": "end_percent", + "node.input.unet_name": "unet_name", + "node.input.clip_name": "clip_name", + "node.input.clip_name1": "clip_name1", + "node.input.clip_name2": "clip_name2", + "node.input.clip_vision": "clip_vision", + "node.input.style_model_name": "style_model_name", + "node.input.style_model": "style_model", + "node.input.clip_vision_output": "clip_vision_output", + "node.input.noise_augmentation": "noise_augmentation", + "node.input.gligen_name": "gligen_name", + "node.input.gligen_textbox_model": "gligen_textbox_model", + "node.input.batch_size": "batch_size", + "node.input.batch_index": "batch_index", + "node.input.length": "length", + "node.input.amount": "amount", + "node.input.upscale_method": "upscale_method", + "node.input.crop": "crop", + "node.input.scale_by": "scale_by", + "node.input.images": "images", + "node.input.samples_to": "samples_to", + "node.input.samples_from": "samples_from", + "node.input.feather": "feather", + "node.input.samples1": "samples1", + "node.input.samples2": "samples2", + "node.input.blend_factor": "blend_factor", + "node.input.seed": "seed", + "node.input.steps": "steps", + "node.input.cfg": "cfg", + "node.input.sampler_name": "sampler_name", + "node.input.scheduler": "scheduler", + "node.input.latent_image": "latent_image", + "node.input.denoise": "denoise", + "node.input.add_noise": "add_noise", + "node.input.noise_seed": "noise_seed", + "node.input.start_at_step": "start_at_step", + "node.input.end_at_step": "end_at_step", + "node.input.return_with_leftover_noise": "return_with_leftover_noise", + "node.input.prompt": "prompt", + "node.input.extra_pnginfo": "extra_pnginfo", + "node.input.channel": "channel", + "node.input.left": "left", + "node.input.right": "right", + "node.input.top": "top", + "node.input.bottom": "bottom", + "node.input.feathering": "feathering", + "node.input.control_after_generate": "control_after_generate", + "node.input.low_threshold": "low_threshold", + "node.input.high_threshold": "high_threshold", - "node.output.CheckpointLoaderSimple.MODEL": "模型", + "node.output.CONDITIONING": "CONDITIONING", + "node.output.IMAGE": "图像", + "node.output.LATENT": "LATENT", + "node.output.MODEL": "模型", + "node.output.CLIP": "CLIP", + "node.output.VAE": "VAE", + "node.output.CLIP_VISION": "CLIP_VISION", + "node.output.CONTROL_NET": "CONTROL_NET", + "node.output.CLIP_VISION_OUTPUT": "CLIP_VISION_OUTPUT", + "node.output.STYLE_MODEL": "STYLE_MODEL", + "node.output.GLIGEN": "GLIGEN", + "node.output.MASK": "遮罩", "category.conditioning": "可调参数", "category.loaders": "加载器",