Documentation Index
Fetch the complete documentation index at: https://dripart-fix-cloud-button-text-1773163393.mintlify.app/llms.txt
Use this file to discover all available pages before exploring further.
If you want to add support for multiple languages, you can refer to this document to learn how to implement multi-language support.
Currently, ComfyUI supports the following languages:
- English(en)
- Chinese (Simplified)(zh)
- Chinese (Traditional)(zh-TW)
- French(fr)
- Korean(ko)
- Russian(ru)
- Spanish(es)
- Japanese(ja)
- Arabic(ar)
Custom node i18n demo: comfyui-wiki/ComfyUI-i18n-demo
Directory Structure
Create a locales folder under your custom node, which supports multiple types of translation files:
your_custom_node/
├── __init__.py
├── your_node.py
└── locales/ # i18n support folder
├── en/ # English translations (recommended as the base)
│ ├── main.json # General English translation content
│ ├── nodeDefs.json # English node definition translations
│ ├── settings.json # Optional: settings interface translations
│ └── commands.json # Optional: command translations
├── zh/ # Chinese translation files
│ ├── nodeDefs.json # Chinese node definition translations
│ ├── main.json # General Chinese translation content
│ ├── settings.json # Chinese settings interface translations
│ └── commands.json # Chinese command translations
├──...
nodeDefs.json - Node Definition Translation
For example, here is a Python definition example of an i18n-demo node:
class I18nTextProcessor:
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"text": ("STRING", {
"multiline": True,
"default": "Hello World!",
"tooltip": "The original text content to be processed"
}),
"operation": (["uppercase", "lowercase", "reverse", "add_prefix"], {
"default": "uppercase",
"tooltip": "The text processing operation to be executed"
}),
"count": ("INT", {
"default": 1,
"min": 1,
"max": 10,
"step": 1,
"tooltip": "The number of times to repeat the operation"
}),
},
"optional": {
"prefix": ("STRING", {
"default": "[I18N] ",
"multiline": False,
"tooltip": "The prefix to add to the text"
}),
}
}
RETURN_TYPES = ("STRING",)
RETURN_NAMES = ("processed_text",)
FUNCTION = "process_text"
CATEGORY = "I18n Demo"
DESCRIPTION = "A simple i18n demo node that demonstrates text processing with internationalization support"
def process_text(self, text, operation, count, prefix=""):
try:
result = text
for _ in range(count):
if operation == "uppercase":
result = result.upper()
elif operation == "lowercase":
result = result.lower()
elif operation == "reverse":
result = result[::-1]
elif operation == "add_prefix":
result = prefix + result
return (result,)
except Exception as e:
print(f"I18nTextProcessor error: {e}")
return (f"Error: {str(e)}",)
Then the corresponding localized support nodeDefs.json file content should include:
{
"I18nTextProcessor": {
"display_name": "I18n Text Processor",
"description": "A simple i18n demo node that demonstrates text processing with internationalization support",
"inputs": {
"text": {
"name": "Text Input",
"tooltip": "The original text content to be processed"
},
"operation": {
"name": "Operation Type",
"tooltip": "The text processing operation to be executed",
"options": {
"uppercase": "To Uppercase",
"lowercase": "To Lowercase",
"reverse": "Reverse Text",
"add_prefix": "Add Prefix"
}
},
"count": {
"name": "Repeat Count",
"tooltip": "The number of times to repeat the operation"
},
"prefix": {
"name": "Prefix Text",
"tooltip": "The prefix to add to the text"
}
},
"outputs": {
"0": {
"name": "Processed Text",
"tooltip": "The final processed text result"
}
}
}
}
For the node output part, the corresponding output index is used instead of the output name, for example, the first output should be 0, the second output should be 1, and so on.
For example, in the i18n-demo custom node, we registered the following two menu settings:
app.registerExtension({
name: "I18nDemo",
settings: [
{
id: "I18nDemo.EnableDebugMode",
category: ["I18nDemo","DebugMode"], // This matches the settingsCategories key in main.json
name: "Enable Debug Mode", // Will be overridden by translation
tooltip: "Show debug information in console for i18n demo nodes", // Will be overridden by translation
type: "boolean",
defaultValue: false,
experimental: true,
onChange: (value) => {
console.log("I18n Demo:", value ? "Debug mode enabled" : "Debug mode disabled");
}
},
{
id: "I18nDemo.DefaultTextOperation",
category: ["I18nDemo","DefaultTextOperation"], // This matches the settingsCategories key in main.json
name: "Default Text Operation", // Will be overridden by translation
tooltip: "Default operation for text processor node", // Will be overridden by translation
type: "combo",
options: ["uppercase", "lowercase", "reverse", "add_prefix"],
defaultValue: "uppercase",
experimental: true
}
],
})
If you need to add corresponding internationalization support, for the menu category, you need to add it in the main.json file:
{
"settingsCategories": {
"I18nDemo": "I18n Demo",
"DebugMode": "Debug Mode",
"DefaultTextOperation": "Default Text Operation"
}
}
For the translation of the corresponding setting items, it is recommended to update them separately in the settings.json file, for example:
{
"I18nDemo_EnableDebugMode": {
"name": "Enable Debug Mode",
"tooltip": "Show debug information in console for i18n demo nodes"
},
"I18nDemo_DefaultTextOperation": {
"name": "Default Text Operation",
"tooltip": "Default operation for text processor node",
"options": {
"uppercase": "Uppercase",
"lowercase": "Lowercase",
"reverse": "Reverse",
"add_prefix": "Add Prefix"
}
}
}
Note that the name of the corresponding translation key should replace the . in the original id with _, for example:
"I18nDemo.EnableDebugMode" -> "I18nDemo_EnableDebugMode"
Custom Frontend Component Localization Support
[To be updated]