mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-04-19 22:09:37 +00:00
Compare commits
43 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e961e64497 | ||
|
|
006d544ac5 | ||
|
|
467b35f98d | ||
|
|
eb43234a3a | ||
|
|
5da26e917a | ||
|
|
96b2987590 | ||
|
|
653ed6f096 | ||
|
|
3cb303ff05 | ||
|
|
af6cb31214 | ||
|
|
54ca111c7c | ||
|
|
e2bbfe7d80 | ||
|
|
3b9a5a61b2 | ||
|
|
27ec6139a8 | ||
|
|
fa06d6ea99 | ||
|
|
47435cdfed | ||
|
|
cfb884b118 | ||
|
|
1af0b4f992 | ||
|
|
c36e55f0b7 | ||
|
|
9f6c828cfe | ||
|
|
cf51254d24 | ||
|
|
b0cc5eac95 | ||
|
|
feeb1d19c8 | ||
|
|
920266e1ff | ||
|
|
b81ccc0507 | ||
|
|
f4c523f188 | ||
|
|
cce5ade578 | ||
|
|
3767749398 | ||
|
|
c3ceef0461 | ||
|
|
ac952fbee3 | ||
|
|
72f7c3101d | ||
|
|
ca9627cada | ||
|
|
c8f62cd963 | ||
|
|
9900e46b95 | ||
|
|
c433b38ba8 | ||
|
|
0b501d7a1c | ||
|
|
0e197261b0 | ||
|
|
89bf5c182d | ||
|
|
e80c75482e | ||
|
|
569a131624 | ||
|
|
b1d02c6a7b | ||
|
|
abeafd5625 | ||
|
|
0906d7873a | ||
|
|
0ce3f1ecb0 |
127
.github/workflows/i18n-custom-nodes.yaml
vendored
Normal file
127
.github/workflows/i18n-custom-nodes.yaml
vendored
Normal file
@@ -0,0 +1,127 @@
|
||||
name: Update Locales for given custom node repository
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
owner:
|
||||
description: 'Owner of the repository to update locales for'
|
||||
required: true
|
||||
type: string
|
||||
repository:
|
||||
description: 'Repository to update locales for'
|
||||
required: true
|
||||
type: string
|
||||
fork_owner:
|
||||
description: 'Owner of the forked repository'
|
||||
required: false
|
||||
type: string
|
||||
default: 'Comfy-Org'
|
||||
|
||||
jobs:
|
||||
update-locales:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout ComfyUI
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: 'comfyanonymous/ComfyUI'
|
||||
path: 'ComfyUI'
|
||||
ref: master
|
||||
- name: Checkout ComfyUI_frontend
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: 'Comfy-Org/ComfyUI_frontend'
|
||||
path: 'ComfyUI_frontend'
|
||||
- name: Checkout ComfyUI_devtools
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: 'Comfy-Org/ComfyUI_devtools'
|
||||
path: 'ComfyUI/custom_nodes/ComfyUI_devtools'
|
||||
- name: Checkout custom node repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: ${{ inputs.owner }}/${{ inputs.repository }}
|
||||
path: 'ComfyUI/custom_nodes/${{ inputs.repository }}'
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: lts/*
|
||||
- uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: '3.10'
|
||||
- name: Install ComfyUI requirements
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
|
||||
pip install -r requirements.txt
|
||||
pip install wait-for-it
|
||||
shell: bash
|
||||
working-directory: ComfyUI
|
||||
- name: Install custom node requirements
|
||||
run: |
|
||||
if [ -f "requirements.txt" ]; then
|
||||
pip install -r requirements.txt
|
||||
fi
|
||||
shell: bash
|
||||
working-directory: ComfyUI/custom_nodes/${{ inputs.repository }}
|
||||
- name: Build & Install ComfyUI_frontend
|
||||
run: |
|
||||
npm ci
|
||||
npm run build
|
||||
rm -rf ../ComfyUI/web/*
|
||||
mv dist/* ../ComfyUI/web/
|
||||
shell: bash
|
||||
working-directory: ComfyUI_frontend
|
||||
- name: Start ComfyUI server
|
||||
run: |
|
||||
python main.py --cpu --multi-user &
|
||||
wait-for-it --service 127.0.0.1:8188 -t 600
|
||||
working-directory: ComfyUI
|
||||
shell: bash
|
||||
- name: Install Playwright Browsers
|
||||
run: npx playwright install chromium --with-deps
|
||||
working-directory: ComfyUI_frontend
|
||||
- name: Start dev server
|
||||
# Run electron dev server as it is a superset of the web dev server
|
||||
# We do want electron specific UIs to be translated.
|
||||
run: npm run dev:electron &
|
||||
working-directory: ComfyUI_frontend
|
||||
- name: Capture base i18n
|
||||
run: npx tsx scripts/diff-i18n capture
|
||||
working-directory: ComfyUI_frontend
|
||||
- name: Update en.json
|
||||
run: npm run collect-i18n
|
||||
env:
|
||||
PLAYWRIGHT_TEST_URL: http://localhost:5173
|
||||
working-directory: ComfyUI_frontend
|
||||
- name: Update translations
|
||||
run: npm run locale
|
||||
env:
|
||||
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
|
||||
working-directory: ComfyUI_frontend
|
||||
- name: Diff base vs updated i18n
|
||||
run: npx tsx scripts/diff-i18n diff
|
||||
working-directory: ComfyUI_frontend
|
||||
- name: Update i18n in custom node repository
|
||||
run: |
|
||||
LOCALE_DIR=ComfyUI/custom_nodes/${{ inputs.repository }}/locales/
|
||||
install -d "$LOCALE_DIR"
|
||||
cp -rf ComfyUI_frontend/temp/diff/* "$LOCALE_DIR"
|
||||
- name: Check and create fork of custom node repository
|
||||
run: |
|
||||
gh repo fork ${{ inputs.owner }}/${{ inputs.repository }} --clone=false || {
|
||||
echo "Fork failed - repository might already be forked"
|
||||
# Exit 0 to prevent the workflow from failing
|
||||
exit 0
|
||||
}
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GH_TOKEN }}
|
||||
- name: Commit and push changes
|
||||
run: |
|
||||
git checkout -b update-locales
|
||||
git add -A
|
||||
git commit -m "Update locales"
|
||||
git remote add org_fork git@github.com:${{ inputs.fork_owner }}/${{ inputs.repository }}.git
|
||||
git push org_fork update-locales
|
||||
gh pr create --title "Update locales for ${{ inputs.repository }}" --repo ${{ inputs.owner }}/${{ inputs.repository }} --head ${{ inputs.fork_owner }}:update-locales
|
||||
working-directory: ComfyUI/custom_nodes/${{ inputs.repository }}
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GH_TOKEN }}
|
||||
4
.gitignore
vendored
4
.gitignore
vendored
@@ -39,4 +39,6 @@ browser_tests/*/*-win32.png
|
||||
|
||||
.env
|
||||
|
||||
dist.zip
|
||||
dist.zip
|
||||
|
||||
/temp/
|
||||
@@ -10,7 +10,7 @@ module.exports = defineConfig({
|
||||
entryLocale: 'en',
|
||||
output: 'src/locales',
|
||||
outputLocales: ['zh', 'ru', 'ja', 'ko'],
|
||||
reference: `Special names to keep untranslated: flux, photomaker, clip, vae, cfg.
|
||||
reference: `Special names to keep untranslated: flux, photomaker, clip, vae, cfg, stable audio, stable cascade.
|
||||
'latent' is the short form of 'latent space'.
|
||||
'mask' is in the context of image processing.
|
||||
`
|
||||
|
||||
@@ -6,10 +6,9 @@
|
||||
/tests-ui/ @Comfy-Org/comfy_maintainer
|
||||
/browser_tests/ @Comfy-Org/comfy_maintainer
|
||||
/.env_example @Comfy-Org/comfy_maintainer
|
||||
/src/locales/ @Comfy-Org/comfy_maintainer
|
||||
|
||||
# Japanese translation
|
||||
/src/locales/ja.json @shinshin86 @Comfy-Org/comfy_maintainer
|
||||
# Translations (AIGODLIKE team + shinshin86)
|
||||
/src/locales/ @Yorha4D @KarryCharon @DorotaLuna @shinshin86 @Comfy-Org/comfy_maintainer
|
||||
|
||||
# Load 3D extension
|
||||
/src/extensions/core/load3d.ts @jtydhr88 @Comfy-Org/comfy_frontend_devs
|
||||
|
||||
24
README.md
24
README.md
@@ -52,16 +52,30 @@ pause
|
||||
|
||||
### Stable Release
|
||||
|
||||
Stable releases are published weekly in the ComfyUI main repository, aligned with ComfyUI backend's stable release schedule.
|
||||
|
||||
#### Feature Freeze
|
||||
|
||||
There will be a 2-day feature freeze before each stable release. During this period, no new major features will be merged.
|
||||
Stable releases are published bi-weekly in the ComfyUI main repository.
|
||||
|
||||
## Release Summary
|
||||
|
||||
### Major features
|
||||
|
||||
<details>
|
||||
<summary>v1.5: Native translation (i18n)</summary>
|
||||
|
||||
ComfyUI now includes built-in translation support, replacing the need for third-party translation extensions. Select your language
|
||||
in `Comfy > Locale > Language` to translate the interface into English, Chinese (Simplified), Russian, Japanese, or Korean. This native
|
||||
implementation offers better performance, reliability, and maintainability compared to previous solutions.<br>
|
||||
|
||||
More details available here: https://blog.comfy.org/p/native-localization-support-i18n
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>v1.4: New mask editor</summary>
|
||||
|
||||
https://github.com/Comfy-Org/ComfyUI_frontend/pull/1284 implements a new mask editor.
|
||||
|
||||

|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>v1.3.22: Integrated server terminal</summary>
|
||||
|
||||
|
||||
@@ -34,6 +34,8 @@ There are two ways to run the tests:
|
||||
```
|
||||
This opens a user interface where you can select specific tests to run and inspect the test execution timeline.
|
||||
|
||||
To run the same test multiple times in Playwright's UI mode, you must launch the main ComfyUI process with the `--multi-user` flag.
|
||||
|
||||

|
||||
|
||||
## Screenshot Expectations
|
||||
|
||||
116
browser_tests/assets/single_connected_reroute_node.json
Normal file
116
browser_tests/assets/single_connected_reroute_node.json
Normal file
@@ -0,0 +1,116 @@
|
||||
{
|
||||
"last_node_id": 16,
|
||||
"last_link_id": 18,
|
||||
"nodes": [
|
||||
{
|
||||
"id": 12,
|
||||
"type": "VAEDecode",
|
||||
"pos": [620, 260],
|
||||
"size": [210, 46],
|
||||
"flags": {},
|
||||
"order": 2,
|
||||
"mode": 0,
|
||||
"inputs": [
|
||||
{
|
||||
"name": "samples",
|
||||
"type": "LATENT",
|
||||
"link": null
|
||||
},
|
||||
{
|
||||
"name": "vae",
|
||||
"type": "VAE",
|
||||
"link": 18
|
||||
}
|
||||
],
|
||||
"outputs": [
|
||||
{
|
||||
"name": "IMAGE",
|
||||
"type": "IMAGE",
|
||||
"links": null
|
||||
}
|
||||
],
|
||||
"properties": {
|
||||
"Node name for S&R": "VAEDecode"
|
||||
},
|
||||
"widgets_values": []
|
||||
},
|
||||
{
|
||||
"id": 13,
|
||||
"type": "Reroute",
|
||||
"pos": [510, 280],
|
||||
"size": [75, 26],
|
||||
"flags": {},
|
||||
"order": 1,
|
||||
"mode": 0,
|
||||
"inputs": [
|
||||
{
|
||||
"name": "",
|
||||
"type": "*",
|
||||
"link": 13
|
||||
}
|
||||
],
|
||||
"outputs": [
|
||||
{
|
||||
"name": "",
|
||||
"type": "VAE",
|
||||
"links": [18],
|
||||
"slot_index": 0
|
||||
}
|
||||
],
|
||||
"properties": {
|
||||
"showOutputText": false,
|
||||
"horizontal": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"type": "CheckpointLoaderSimple",
|
||||
"pos": [160, 240],
|
||||
"size": [315, 98],
|
||||
"flags": {},
|
||||
"order": 0,
|
||||
"mode": 0,
|
||||
"inputs": [],
|
||||
"outputs": [
|
||||
{
|
||||
"name": "MODEL",
|
||||
"type": "MODEL",
|
||||
"links": [],
|
||||
"slot_index": 0
|
||||
},
|
||||
{
|
||||
"name": "CLIP",
|
||||
"type": "CLIP",
|
||||
"links": [],
|
||||
"slot_index": 1
|
||||
},
|
||||
{
|
||||
"name": "VAE",
|
||||
"type": "VAE",
|
||||
"links": [13],
|
||||
"slot_index": 2
|
||||
}
|
||||
],
|
||||
"properties": {
|
||||
"Node name for S&R": "CheckpointLoaderSimple"
|
||||
},
|
||||
"widgets_values": ["v1-5-pruned-emaonly.safetensors"]
|
||||
}
|
||||
],
|
||||
"links": [
|
||||
[13, 4, 2, 13, 0, "*"],
|
||||
[18, 13, 0, 12, 1, "VAE"]
|
||||
],
|
||||
"groups": [],
|
||||
"config": {},
|
||||
"extra": {
|
||||
"ds": {
|
||||
"scale": 1,
|
||||
"offset": {
|
||||
"0": 0,
|
||||
"1": 0
|
||||
}
|
||||
}
|
||||
},
|
||||
"version": 0.4
|
||||
}
|
||||
@@ -77,8 +77,12 @@ test.describe('Missing models warning', () => {
|
||||
test.describe('Settings', () => {
|
||||
test('@mobile Should be visible on mobile', async ({ comfyPage }) => {
|
||||
await comfyPage.page.keyboard.press('Control+,')
|
||||
const searchBox = comfyPage.page.locator('.settings-content')
|
||||
await expect(searchBox).toBeVisible()
|
||||
const settingsContent = comfyPage.page.locator('.settings-content')
|
||||
await expect(settingsContent).toBeVisible()
|
||||
const isUsableHeight = await settingsContent.evaluate(
|
||||
(el) => el.clientHeight > 30
|
||||
)
|
||||
expect(isUsableHeight).toBeTruthy()
|
||||
})
|
||||
|
||||
test('Can open settings with hotkey', async ({ comfyPage }) => {
|
||||
@@ -94,7 +98,7 @@ test.describe('Settings', () => {
|
||||
test('Can change canvas zoom speed setting', async ({ comfyPage }) => {
|
||||
const maxSpeed = 2.5
|
||||
await comfyPage.setSetting('Comfy.Graph.ZoomSpeed', maxSpeed)
|
||||
test.step('Setting should persist', async () => {
|
||||
await test.step('Setting should persist', async () => {
|
||||
expect(await comfyPage.getSetting('Comfy.Graph.ZoomSpeed')).toBe(maxSpeed)
|
||||
})
|
||||
})
|
||||
|
||||
@@ -907,5 +907,19 @@ const makeMatcher = function <T>(
|
||||
export const comfyExpect = expect.extend({
|
||||
toBePinned: makeMatcher((n) => n.isPinned(), 'pinned'),
|
||||
toBeBypassed: makeMatcher((n) => n.isBypassed(), 'bypassed'),
|
||||
toBeCollapsed: makeMatcher((n) => n.isCollapsed(), 'collapsed')
|
||||
toBeCollapsed: makeMatcher((n) => n.isCollapsed(), 'collapsed'),
|
||||
async toHaveFocus(locator: Locator, options = { timeout: 256 }) {
|
||||
const isFocused = await locator.evaluate(
|
||||
(el) => el === document.activeElement
|
||||
)
|
||||
|
||||
await expect(async () => {
|
||||
expect(isFocused).toBe(!this.isNot)
|
||||
}).toPass(options)
|
||||
|
||||
return {
|
||||
pass: isFocused,
|
||||
message: () => `Expected element to ${isFocused ? 'not ' : ''}be focused.`
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
import { expect } from '@playwright/test'
|
||||
import { comfyPageFixture as test } from './fixtures/ComfyPage'
|
||||
import {
|
||||
comfyPageFixture as test,
|
||||
comfyExpect as expect
|
||||
} from './fixtures/ComfyPage'
|
||||
|
||||
test.describe('Node search box', () => {
|
||||
test.beforeEach(async ({ comfyPage }) => {
|
||||
@@ -105,26 +107,85 @@ test.describe('Node search box', () => {
|
||||
})
|
||||
|
||||
test.describe('Filtering', () => {
|
||||
const expectFilterChips = async (comfyPage, expectedTexts: string[]) => {
|
||||
const chips = comfyPage.searchBox.filterChips
|
||||
|
||||
// Check that the number of chips matches the expected count
|
||||
await expect(chips).toHaveCount(expectedTexts.length)
|
||||
|
||||
// Verify the text and visibility of each filter chip
|
||||
await Promise.all(
|
||||
expectedTexts.map(async (text, index) => {
|
||||
const chip = chips.nth(index)
|
||||
await expect(chip).toContainText(text)
|
||||
await expect(chip).toBeVisible()
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
test.beforeEach(async ({ comfyPage }) => {
|
||||
await comfyPage.doubleClickCanvas()
|
||||
})
|
||||
|
||||
test('Can add filter', async ({ comfyPage }) => {
|
||||
await comfyPage.searchBox.addFilter('MODEL', 'Input Type')
|
||||
await expect(comfyPage.searchBox.filterChips).toHaveCount(1)
|
||||
await expectFilterChips(comfyPage, ['MODEL'])
|
||||
})
|
||||
|
||||
test('Can add multiple filters', async ({ comfyPage }) => {
|
||||
await comfyPage.searchBox.addFilter('MODEL', 'Input Type')
|
||||
await comfyPage.searchBox.addFilter('CLIP', 'Output Type')
|
||||
await expect(comfyPage.searchBox.filterChips).toHaveCount(2)
|
||||
await expectFilterChips(comfyPage, ['MODEL', 'CLIP'])
|
||||
})
|
||||
|
||||
test('Can remove filter', async ({ comfyPage }) => {
|
||||
await comfyPage.searchBox.addFilter('MODEL', 'Input Type')
|
||||
await comfyPage.searchBox.addFilter('CLIP', 'Output Type')
|
||||
await comfyPage.searchBox.removeFilter(0)
|
||||
await expect(comfyPage.searchBox.filterChips).toHaveCount(1)
|
||||
await expectFilterChips(comfyPage, [])
|
||||
})
|
||||
|
||||
test.describe('Removing from multiple filters', () => {
|
||||
test.beforeEach(async ({ comfyPage }) => {
|
||||
await comfyPage.searchBox.addFilter('MODEL', 'Input Type')
|
||||
await comfyPage.searchBox.addFilter('CLIP', 'Output Type')
|
||||
await comfyPage.searchBox.addFilter('utils', 'Category')
|
||||
})
|
||||
|
||||
test('Can remove first filter', async ({ comfyPage }) => {
|
||||
await comfyPage.searchBox.removeFilter(0)
|
||||
await expectFilterChips(comfyPage, ['CLIP', 'utils'])
|
||||
await comfyPage.searchBox.removeFilter(0)
|
||||
await expectFilterChips(comfyPage, ['utils'])
|
||||
await comfyPage.searchBox.removeFilter(0)
|
||||
await expectFilterChips(comfyPage, [])
|
||||
})
|
||||
|
||||
test('Can remove middle filter', async ({ comfyPage }) => {
|
||||
await comfyPage.searchBox.removeFilter(1)
|
||||
await expectFilterChips(comfyPage, ['MODEL', 'utils'])
|
||||
})
|
||||
|
||||
test('Can remove last filter', async ({ comfyPage }) => {
|
||||
await comfyPage.searchBox.removeFilter(2)
|
||||
await expectFilterChips(comfyPage, ['MODEL', 'CLIP'])
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
test.describe('Input focus behavior', () => {
|
||||
test.beforeEach(async ({ comfyPage }) => {
|
||||
await comfyPage.doubleClickCanvas()
|
||||
})
|
||||
|
||||
test('focuses input after adding a filter', async ({ comfyPage }) => {
|
||||
await comfyPage.searchBox.addFilter('MODEL', 'Input Type')
|
||||
await expect(comfyPage.searchBox.input).toHaveFocus()
|
||||
})
|
||||
|
||||
test('focuses input after removing a filter', async ({ comfyPage }) => {
|
||||
await comfyPage.searchBox.addFilter('MODEL', 'Input Type')
|
||||
await comfyPage.searchBox.removeFilter(0)
|
||||
await expect(comfyPage.searchBox.input).toHaveFocus()
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
36
browser_tests/rerouteNode.spec.ts
Normal file
36
browser_tests/rerouteNode.spec.ts
Normal file
@@ -0,0 +1,36 @@
|
||||
import { expect } from '@playwright/test'
|
||||
import { comfyPageFixture as test } from './fixtures/ComfyPage'
|
||||
|
||||
test.describe('Reroute Node', () => {
|
||||
test.beforeEach(async ({ comfyPage }) => {
|
||||
await comfyPage.setSetting('Comfy.UseNewMenu', 'Top')
|
||||
})
|
||||
|
||||
test.afterEach(async ({ comfyPage }) => {
|
||||
await comfyPage.setupWorkflowsDirectory({})
|
||||
})
|
||||
|
||||
test('loads from inserted workflow', async ({ comfyPage }) => {
|
||||
const workflowName = 'single_connected_reroute_node.json'
|
||||
await comfyPage.setupWorkflowsDirectory({
|
||||
[workflowName]: workflowName
|
||||
})
|
||||
await comfyPage.setup()
|
||||
await comfyPage.menu.topbar.triggerTopbarCommand(['Workflow', 'New'])
|
||||
|
||||
// Insert the workflow
|
||||
const workflowsTab = comfyPage.menu.workflowsTab
|
||||
await workflowsTab.open()
|
||||
await workflowsTab.getPersistedItem(workflowName).click({ button: 'right' })
|
||||
const insertButton = comfyPage.page.locator('.p-contextmenu-item-link', {
|
||||
hasText: 'Insert'
|
||||
})
|
||||
await insertButton.click()
|
||||
|
||||
// Close the sidebar tab
|
||||
await workflowsTab.tabButton.click()
|
||||
await workflowsTab.root.waitFor({ state: 'hidden' })
|
||||
|
||||
await expect(comfyPage.canvas).toHaveScreenshot('reroute_inserted.png')
|
||||
})
|
||||
})
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 31 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 29 KiB |
20
package-lock.json
generated
20
package-lock.json
generated
@@ -1,17 +1,17 @@
|
||||
{
|
||||
"name": "@comfyorg/comfyui-frontend",
|
||||
"version": "1.6.1",
|
||||
"version": "1.6.6",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@comfyorg/comfyui-frontend",
|
||||
"version": "1.6.1",
|
||||
"version": "1.6.6",
|
||||
"license": "GPL-3.0-only",
|
||||
"dependencies": {
|
||||
"@atlaskit/pragmatic-drag-and-drop": "^1.3.1",
|
||||
"@comfyorg/comfyui-electron-types": "^0.3.34",
|
||||
"@comfyorg/litegraph": "^0.8.46",
|
||||
"@comfyorg/comfyui-electron-types": "^0.4.3",
|
||||
"@comfyorg/litegraph": "^0.8.48",
|
||||
"@primevue/themes": "^4.0.5",
|
||||
"@vueuse/core": "^11.0.0",
|
||||
"@xterm/addon-fit": "^0.10.0",
|
||||
@@ -1951,15 +1951,15 @@
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/@comfyorg/comfyui-electron-types": {
|
||||
"version": "0.3.34",
|
||||
"resolved": "https://registry.npmjs.org/@comfyorg/comfyui-electron-types/-/comfyui-electron-types-0.3.34.tgz",
|
||||
"integrity": "sha512-l4+llMrUh/nUxuBC1A1Zicu6EAZ74pDJPm14zQpyLleNeyj71FKIkgX/hIpbCegv5CwRgYXEdEN8FqTTKugf/A==",
|
||||
"version": "0.4.3",
|
||||
"resolved": "https://registry.npmjs.org/@comfyorg/comfyui-electron-types/-/comfyui-electron-types-0.4.3.tgz",
|
||||
"integrity": "sha512-hSM3mchpsYN0e7oZ7XLWjEvFDvE1rgzaB9YkCeqIiZYZgLL78T79ssM0n5ra17Zv7Mqwl6ErZblXvbQE/36RPw==",
|
||||
"license": "GPL-3.0-only"
|
||||
},
|
||||
"node_modules/@comfyorg/litegraph": {
|
||||
"version": "0.8.46",
|
||||
"resolved": "https://registry.npmjs.org/@comfyorg/litegraph/-/litegraph-0.8.46.tgz",
|
||||
"integrity": "sha512-uI4AZJzW9p85jRmDWLhpQXnG9xqXo46oKaHRHhqYAzM7Ai0/d9gqIP//h3O4joEYw2zYOYVMGx2gCZAsyJcSmA==",
|
||||
"version": "0.8.48",
|
||||
"resolved": "https://registry.npmjs.org/@comfyorg/litegraph/-/litegraph-0.8.48.tgz",
|
||||
"integrity": "sha512-acbbo5LXPqgo5mxa+hxWKx6oUalEotkjgk6/UpYyOp+fVN3UPHCD07jgijcujDQTVUYzeNWVj0v9iZBU5DBTpg==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@cspotcode/source-map-support": {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@comfyorg/comfyui-frontend",
|
||||
"private": true,
|
||||
"version": "1.6.1",
|
||||
"version": "1.6.6",
|
||||
"type": "module",
|
||||
"repository": "https://github.com/Comfy-Org/ComfyUI_frontend",
|
||||
"homepage": "https://comfy.org",
|
||||
@@ -82,8 +82,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@atlaskit/pragmatic-drag-and-drop": "^1.3.1",
|
||||
"@comfyorg/comfyui-electron-types": "^0.3.34",
|
||||
"@comfyorg/litegraph": "^0.8.46",
|
||||
"@comfyorg/comfyui-electron-types": "^0.4.3",
|
||||
"@comfyorg/litegraph": "^0.8.48",
|
||||
"@primevue/themes": "^4.0.5",
|
||||
"@vueuse/core": "^11.0.0",
|
||||
"@xterm/addon-fit": "^0.10.0",
|
||||
|
||||
@@ -11,6 +11,7 @@ import type { ComfyApi } from '../src/scripts/api'
|
||||
const localePath = './src/locales/en/main.json'
|
||||
const nodeDefsPath = './src/locales/en/nodeDefs.json'
|
||||
const commandsPath = './src/locales/en/commands.json'
|
||||
const settingsPath = './src/locales/en/settings.json'
|
||||
|
||||
const extractMenuCommandLocaleStrings = (): Set<string> => {
|
||||
const labels = new Set<string>()
|
||||
@@ -231,7 +232,6 @@ test('collect-i18n', async ({ comfyPage }) => {
|
||||
{
|
||||
...locale,
|
||||
menuLabels: allLabelsLocale,
|
||||
settingsDialog: allSettingsLocale,
|
||||
// Do merge for settingsCategories as there are some manual translations
|
||||
// for special panels like "About" and "Keybinding".
|
||||
settingsCategories: {
|
||||
@@ -250,4 +250,5 @@ test('collect-i18n', async ({ comfyPage }) => {
|
||||
|
||||
fs.writeFileSync(nodeDefsPath, JSON.stringify(allNodeDefsLocale, null, 2))
|
||||
fs.writeFileSync(commandsPath, JSON.stringify(allCommandsLocale, null, 2))
|
||||
fs.writeFileSync(settingsPath, JSON.stringify(allSettingsLocale, null, 2))
|
||||
})
|
||||
|
||||
124
scripts/diff-i18n.ts
Normal file
124
scripts/diff-i18n.ts
Normal file
@@ -0,0 +1,124 @@
|
||||
import {
|
||||
readFileSync,
|
||||
writeFileSync,
|
||||
readdirSync,
|
||||
mkdirSync,
|
||||
existsSync,
|
||||
rmSync
|
||||
} from 'fs'
|
||||
import { join, dirname } from 'path'
|
||||
|
||||
// Ensure directories exist
|
||||
function ensureDir(dir: string) {
|
||||
if (!existsSync(dir)) {
|
||||
mkdirSync(dir, { recursive: true })
|
||||
}
|
||||
}
|
||||
|
||||
// Read JSON file
|
||||
function readJsonFile(path: string) {
|
||||
try {
|
||||
return JSON.parse(readFileSync(path, 'utf-8'))
|
||||
} catch {
|
||||
return {}
|
||||
}
|
||||
}
|
||||
|
||||
// Get all JSON files recursively
|
||||
function getAllJsonFiles(dir: string): string[] {
|
||||
const files: string[] = []
|
||||
const items = readdirSync(dir, { withFileTypes: true })
|
||||
|
||||
for (const item of items) {
|
||||
const path = join(dir, item.name)
|
||||
if (item.isDirectory()) {
|
||||
files.push(...getAllJsonFiles(path))
|
||||
} else if (item.name.endsWith('.json')) {
|
||||
files.push(path)
|
||||
}
|
||||
}
|
||||
return files
|
||||
}
|
||||
|
||||
// Find additions in new object compared to base
|
||||
function findAdditions(base: any, updated: any): Record<string, any> {
|
||||
const additions: Record<string, any> = {}
|
||||
|
||||
for (const key in updated) {
|
||||
if (!(key in base)) {
|
||||
additions[key] = updated[key]
|
||||
} else if (
|
||||
typeof updated[key] === 'object' &&
|
||||
!Array.isArray(updated[key]) &&
|
||||
typeof base[key] === 'object' &&
|
||||
!Array.isArray(base[key])
|
||||
) {
|
||||
const nestedAdditions = findAdditions(base[key], updated[key])
|
||||
if (Object.keys(nestedAdditions).length > 0) {
|
||||
additions[key] = nestedAdditions
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return additions
|
||||
}
|
||||
|
||||
// Capture command
|
||||
function capture(srcLocaleDir: string, tempBaseDir: string) {
|
||||
ensureDir(tempBaseDir)
|
||||
const files = getAllJsonFiles(srcLocaleDir)
|
||||
|
||||
for (const file of files) {
|
||||
const relativePath = file.replace(srcLocaleDir, '')
|
||||
const targetPath = join(tempBaseDir, relativePath)
|
||||
ensureDir(dirname(targetPath))
|
||||
writeFileSync(targetPath, readFileSync(file))
|
||||
}
|
||||
console.log('Captured current locale files to temp/base/')
|
||||
}
|
||||
|
||||
// Diff command
|
||||
function diff(srcLocaleDir: string, tempBaseDir: string, tempDiffDir: string) {
|
||||
ensureDir(tempDiffDir)
|
||||
const files = getAllJsonFiles(srcLocaleDir)
|
||||
|
||||
for (const file of files) {
|
||||
const relativePath = file.replace(srcLocaleDir, '')
|
||||
const basePath = join(tempBaseDir, relativePath)
|
||||
const diffPath = join(tempDiffDir, relativePath)
|
||||
|
||||
const baseContent = readJsonFile(basePath)
|
||||
const updatedContent = readJsonFile(file)
|
||||
|
||||
const additions = findAdditions(baseContent, updatedContent)
|
||||
if (Object.keys(additions).length > 0) {
|
||||
ensureDir(dirname(diffPath))
|
||||
writeFileSync(diffPath, JSON.stringify(additions, null, 2))
|
||||
console.log(`Wrote diff to ${diffPath}`)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Command handling
|
||||
const command = process.argv[2]
|
||||
const SRC_LOCALE_DIR = 'src/locales'
|
||||
const TEMP_BASE_DIR = 'temp/base'
|
||||
const TEMP_DIFF_DIR = 'temp/diff'
|
||||
|
||||
switch (command) {
|
||||
case 'capture':
|
||||
capture(SRC_LOCALE_DIR, TEMP_BASE_DIR)
|
||||
break
|
||||
case 'diff':
|
||||
diff(SRC_LOCALE_DIR, TEMP_BASE_DIR, TEMP_DIFF_DIR)
|
||||
break
|
||||
case 'clean':
|
||||
// Remove temp directory recursively
|
||||
if (existsSync('temp')) {
|
||||
rmSync('temp', { recursive: true, force: true })
|
||||
console.log('Removed temp directory')
|
||||
}
|
||||
break
|
||||
default:
|
||||
console.log('Please specify either "capture" or "diff" command')
|
||||
}
|
||||
77
src/assets/palettes/arc.json
Normal file
77
src/assets/palettes/arc.json
Normal file
@@ -0,0 +1,77 @@
|
||||
{
|
||||
"id": "arc",
|
||||
"name": "Arc",
|
||||
"colors": {
|
||||
"node_slot": {
|
||||
"BOOLEAN": "",
|
||||
"CLIP": "#eacb8b",
|
||||
"CLIP_VISION": "#A8DADC",
|
||||
"CLIP_VISION_OUTPUT": "#ad7452",
|
||||
"CONDITIONING": "#cf876f",
|
||||
"CONTROL_NET": "#00d78d",
|
||||
"CONTROL_NET_WEIGHTS": "",
|
||||
"FLOAT": "",
|
||||
"GLIGEN": "",
|
||||
"IMAGE": "#80a1c0",
|
||||
"IMAGEUPLOAD": "",
|
||||
"INT": "",
|
||||
"LATENT": "#b38ead",
|
||||
"LATENT_KEYFRAME": "",
|
||||
"MASK": "#a3bd8d",
|
||||
"MODEL": "#8978a7",
|
||||
"SAMPLER": "",
|
||||
"SIGMAS": "",
|
||||
"STRING": "",
|
||||
"STYLE_MODEL": "#C2FFAE",
|
||||
"T2I_ADAPTER_WEIGHTS": "",
|
||||
"TAESD": "#DCC274",
|
||||
"TIMESTEP_KEYFRAME": "",
|
||||
"UPSCALE_MODEL": "",
|
||||
"VAE": "#be616b"
|
||||
},
|
||||
"litegraph_base": {
|
||||
"BACKGROUND_IMAGE": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABcklEQVR4nO3YMUoDARgF4RfxBqZI6/0vZqFn0MYtrLIQMFN8U6V4LAtD+Jm9XG/v30OGl2e/AP7yevz4+vx45nvgF/+QGITEICQGITEIiUFIjNNC3q43u3/YnRJyPOzeQ+0e220nhRzReC8e7R7bbdvl+Jal1Bs46jEIiUFIDEJiEBKDkBhKPbZT6qHdptRTu02p53DUYxASg5AYhMQgJAYhMZR6bKfUQ7tNqad2m1LP4ajHICQGITEIiUFIDEJiKPXYTqmHdptST+02pZ7DUY9BSAxCYhASg5AYhMRQ6rGdUg/tNqWe2m1KPYejHoOQGITEICQGITEIiaHUYzulHtptSj2125R6Dkc9BiExCIlBSAxCYhASQ6nHdko9tNuUemq3KfUcjnoMQmIQEoOQGITEICSGUo/tlHpotyn11G5T6jkc9RiExCAkBiExCIlBSAylHtsp9dBuU+qp3abUczjqMQiJQUgMQmIQEoOQGITE+AHFISNQrFTGuwAAAABJRU5ErkJggg==",
|
||||
"CLEAR_BACKGROUND_COLOR": "#2b2f38",
|
||||
"NODE_TITLE_COLOR": "#b2b7bd",
|
||||
"NODE_SELECTED_TITLE_COLOR": "#FFF",
|
||||
"NODE_TEXT_SIZE": 14,
|
||||
"NODE_TEXT_COLOR": "#AAA",
|
||||
"NODE_SUBTEXT_SIZE": 12,
|
||||
"NODE_DEFAULT_COLOR": "#2b2f38",
|
||||
"NODE_DEFAULT_BGCOLOR": "#242730",
|
||||
"NODE_DEFAULT_BOXCOLOR": "#6e7581",
|
||||
"NODE_DEFAULT_SHAPE": 2,
|
||||
"NODE_BOX_OUTLINE_COLOR": "#FFF",
|
||||
"NODE_BYPASS_BGCOLOR": "#FF00FF",
|
||||
"NODE_ERROR_COLOUR": "#E00",
|
||||
"DEFAULT_SHADOW_COLOR": "rgba(0,0,0,0.5)",
|
||||
"DEFAULT_GROUP_FONT": 22,
|
||||
"WIDGET_BGCOLOR": "#2b2f38",
|
||||
"WIDGET_OUTLINE_COLOR": "#6e7581",
|
||||
"WIDGET_TEXT_COLOR": "#DDD",
|
||||
"WIDGET_SECONDARY_TEXT_COLOR": "#b2b7bd",
|
||||
"LINK_COLOR": "#9A9",
|
||||
"EVENT_LINK_COLOR": "#A86",
|
||||
"CONNECTING_LINK_COLOR": "#AFA"
|
||||
},
|
||||
"comfy_base": {
|
||||
"fg-color": "#fff",
|
||||
"bg-color": "#2b2f38",
|
||||
"comfy-menu-bg": "#242730",
|
||||
"comfy-menu-secondary-bg": "#22252E",
|
||||
"comfy-input-bg": "#2b2f38",
|
||||
"input-text": "#ddd",
|
||||
"descrip-text": "#b2b7bd",
|
||||
"drag-text": "#ccc",
|
||||
"error-text": "#ff4444",
|
||||
"border-color": "#6e7581",
|
||||
"tr-even-bg-color": "#2b2f38",
|
||||
"tr-odd-bg-color": "#242730",
|
||||
"content-bg": "#6e7581",
|
||||
"content-fg": "#fff",
|
||||
"content-hover-bg": "#2b2f38",
|
||||
"content-hover-fg": "#fff",
|
||||
"bar-shadow": "rgba(8, 8, 8, 0.75) 0 0 0.5rem"
|
||||
}
|
||||
}
|
||||
}
|
||||
70
src/assets/palettes/dark.json
Normal file
70
src/assets/palettes/dark.json
Normal file
@@ -0,0 +1,70 @@
|
||||
{
|
||||
"id": "dark",
|
||||
"name": "Dark (Default)",
|
||||
"colors": {
|
||||
"node_slot": {
|
||||
"CLIP": "#FFD500",
|
||||
"CLIP_VISION": "#A8DADC",
|
||||
"CLIP_VISION_OUTPUT": "#ad7452",
|
||||
"CONDITIONING": "#FFA931",
|
||||
"CONTROL_NET": "#6EE7B7",
|
||||
"IMAGE": "#64B5F6",
|
||||
"LATENT": "#FF9CF9",
|
||||
"MASK": "#81C784",
|
||||
"MODEL": "#B39DDB",
|
||||
"STYLE_MODEL": "#C2FFAE",
|
||||
"VAE": "#FF6E6E",
|
||||
"NOISE": "#B0B0B0",
|
||||
"GUIDER": "#66FFFF",
|
||||
"SAMPLER": "#ECB4B4",
|
||||
"SIGMAS": "#CDFFCD",
|
||||
"TAESD": "#DCC274"
|
||||
},
|
||||
"litegraph_base": {
|
||||
"BACKGROUND_IMAGE": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAIAAAD/gAIDAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQBJREFUeNrs1rEKwjAUhlETUkj3vP9rdmr1Ysammk2w5wdxuLgcMHyptfawuZX4pJSWZTnfnu/lnIe/jNNxHHGNn//HNbbv+4dr6V+11uF527arU7+u63qfa/bnmh8sWLBgwYJlqRf8MEptXPBXJXa37BSl3ixYsGDBMliwFLyCV/DeLIMFCxYsWLBMwSt4Be/NggXLYMGCBUvBK3iNruC9WbBgwYJlsGApeAWv4L1ZBgsWLFiwYJmCV/AK3psFC5bBggULloJX8BpdwXuzYMGCBctgwVLwCl7Be7MMFixYsGDBsu8FH1FaSmExVfAxBa/gvVmwYMGCZbBg/W4vAQYA5tRF9QYlv/QAAAAASUVORK5CYII=",
|
||||
"CLEAR_BACKGROUND_COLOR": "#222",
|
||||
"NODE_TITLE_COLOR": "#999",
|
||||
"NODE_SELECTED_TITLE_COLOR": "#FFF",
|
||||
"NODE_TEXT_SIZE": 14,
|
||||
"NODE_TEXT_COLOR": "#AAA",
|
||||
"NODE_SUBTEXT_SIZE": 12,
|
||||
"NODE_DEFAULT_COLOR": "#333",
|
||||
"NODE_DEFAULT_BGCOLOR": "#353535",
|
||||
"NODE_DEFAULT_BOXCOLOR": "#666",
|
||||
"NODE_DEFAULT_SHAPE": 2,
|
||||
"NODE_BOX_OUTLINE_COLOR": "#FFF",
|
||||
"NODE_BYPASS_BGCOLOR": "#FF00FF",
|
||||
"NODE_ERROR_COLOUR": "#E00",
|
||||
"DEFAULT_SHADOW_COLOR": "rgba(0,0,0,0.5)",
|
||||
"DEFAULT_GROUP_FONT": 24,
|
||||
"WIDGET_BGCOLOR": "#222",
|
||||
"WIDGET_OUTLINE_COLOR": "#666",
|
||||
"WIDGET_TEXT_COLOR": "#DDD",
|
||||
"WIDGET_SECONDARY_TEXT_COLOR": "#999",
|
||||
"LINK_COLOR": "#9A9",
|
||||
"EVENT_LINK_COLOR": "#A86",
|
||||
"CONNECTING_LINK_COLOR": "#AFA",
|
||||
"BADGE_FG_COLOR": "#FFF",
|
||||
"BADGE_BG_COLOR": "#0F1F0F"
|
||||
},
|
||||
"comfy_base": {
|
||||
"fg-color": "#fff",
|
||||
"bg-color": "#202020",
|
||||
"comfy-menu-bg": "#353535",
|
||||
"comfy-menu-secondary-bg": "#303030",
|
||||
"comfy-input-bg": "#222",
|
||||
"input-text": "#ddd",
|
||||
"descrip-text": "#999",
|
||||
"drag-text": "#ccc",
|
||||
"error-text": "#ff4444",
|
||||
"border-color": "#4e4e4e",
|
||||
"tr-even-bg-color": "#222",
|
||||
"tr-odd-bg-color": "#353535",
|
||||
"content-bg": "#4e4e4e",
|
||||
"content-fg": "#fff",
|
||||
"content-hover-bg": "#222",
|
||||
"content-hover-fg": "#fff",
|
||||
"bar-shadow": "rgba(16, 16, 16, 0.5) 0 0 0.5rem"
|
||||
}
|
||||
}
|
||||
}
|
||||
77
src/assets/palettes/github.json
Normal file
77
src/assets/palettes/github.json
Normal file
@@ -0,0 +1,77 @@
|
||||
{
|
||||
"id": "github",
|
||||
"name": "Github",
|
||||
"colors": {
|
||||
"node_slot": {
|
||||
"BOOLEAN": "",
|
||||
"CLIP": "#eacb8b",
|
||||
"CLIP_VISION": "#A8DADC",
|
||||
"CLIP_VISION_OUTPUT": "#ad7452",
|
||||
"CONDITIONING": "#cf876f",
|
||||
"CONTROL_NET": "#00d78d",
|
||||
"CONTROL_NET_WEIGHTS": "",
|
||||
"FLOAT": "",
|
||||
"GLIGEN": "",
|
||||
"IMAGE": "#80a1c0",
|
||||
"IMAGEUPLOAD": "",
|
||||
"INT": "",
|
||||
"LATENT": "#b38ead",
|
||||
"LATENT_KEYFRAME": "",
|
||||
"MASK": "#a3bd8d",
|
||||
"MODEL": "#8978a7",
|
||||
"SAMPLER": "",
|
||||
"SIGMAS": "",
|
||||
"STRING": "",
|
||||
"STYLE_MODEL": "#C2FFAE",
|
||||
"T2I_ADAPTER_WEIGHTS": "",
|
||||
"TAESD": "#DCC274",
|
||||
"TIMESTEP_KEYFRAME": "",
|
||||
"UPSCALE_MODEL": "",
|
||||
"VAE": "#be616b"
|
||||
},
|
||||
"litegraph_base": {
|
||||
"BACKGROUND_IMAGE": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAIAAAD/gAIDAAAACXBIWXMAAAsTAAALEwEAmpwYAAAGlmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDEgNzkuMTQ2Mjg5OSwgMjAyMy8wNi8yNS0yMDowMTo1NSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI1LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMS0xM1QwMDoxODowMiswMTowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTEtMTVUMDI6MDQ6NTkrMDE6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTEtMTVUMDI6MDQ6NTkrMDE6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmIyYzRhNjA5LWJmYTctYTg0MC1iOGFlLTk3MzE2ZjM1ZGIyNyIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjk0ZmNlZGU4LTE1MTctZmQ0MC04ZGU3LWYzOTgxM2E3ODk5ZiIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjIzMWIxMGIwLWI0ZmItMDI0ZS1iMTJlLTMwNTMwM2NkMDdjOCI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MjMxYjEwYjAtYjRmYi0wMjRlLWIxMmUtMzA1MzAzY2QwN2M4IiBzdEV2dDp3aGVuPSIyMDIzLTExLTEzVDAwOjE4OjAyKzAxOjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjUuMSAoV2luZG93cykiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjQ4OWY1NzlmLTJkNjUtZWQ0Zi04OTg0LTA4NGE2MGE1ZTMzNSIgc3RFdnQ6d2hlbj0iMjAyMy0xMS0xNVQwMjowNDo1OSswMTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI1LjEgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpiMmM0YTYwOS1iZmE3LWE4NDAtYjhhZS05NzMxNmYzNWRiMjciIHN0RXZ0OndoZW49IjIwMjMtMTEtMTVUMDI6MDQ6NTkrMDE6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyNS4xIChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4OTe6GAAAAx0lEQVR42u3WMQoAIQxFwRzJys77X8vSLiRgITif7bYbgrwYc/mKXyBoY4VVBgsWLFiwYFmOlTv+9jfDOjHmr8u6eVkGCxYsWLBgmc5S8ApewXvgYRksWLBgKXidpeBdloL3wMOCBctgwVLwCl7BuyyDBQsWLFiwTGcpeAWv4D3wsAwWLFiwFLzOUvAuS8F74GHBgmWwYCl4Ba/gXZbBggULFixYprMUvIJX8B54WAYLFixYCl5nKXiXpeA98LBgwTJYsGC9tg1o8f4TTtqzNQAAAABJRU5ErkJggg==",
|
||||
"CLEAR_BACKGROUND_COLOR": "#040506",
|
||||
"NODE_TITLE_COLOR": "#999",
|
||||
"NODE_SELECTED_TITLE_COLOR": "#e5eaf0",
|
||||
"NODE_TEXT_SIZE": 14,
|
||||
"NODE_TEXT_COLOR": "#bcc2c8",
|
||||
"NODE_SUBTEXT_SIZE": 12,
|
||||
"NODE_DEFAULT_COLOR": "#161b22",
|
||||
"NODE_DEFAULT_BGCOLOR": "#13171d",
|
||||
"NODE_DEFAULT_BOXCOLOR": "#30363d",
|
||||
"NODE_DEFAULT_SHAPE": 2,
|
||||
"NODE_BOX_OUTLINE_COLOR": "#e5eaf0",
|
||||
"NODE_BYPASS_BGCOLOR": "#FF00FF",
|
||||
"NODE_ERROR_COLOUR": "#E00",
|
||||
"DEFAULT_SHADOW_COLOR": "rgba(0,0,0,0.5)",
|
||||
"DEFAULT_GROUP_FONT": 24,
|
||||
"WIDGET_BGCOLOR": "#161b22",
|
||||
"WIDGET_OUTLINE_COLOR": "#30363d",
|
||||
"WIDGET_TEXT_COLOR": "#bcc2c8",
|
||||
"WIDGET_SECONDARY_TEXT_COLOR": "#999",
|
||||
"LINK_COLOR": "#9A9",
|
||||
"EVENT_LINK_COLOR": "#A86",
|
||||
"CONNECTING_LINK_COLOR": "#AFA"
|
||||
},
|
||||
"comfy_base": {
|
||||
"fg-color": "#e5eaf0",
|
||||
"bg-color": "#161b22",
|
||||
"comfy-menu-bg": "#13171d",
|
||||
"comfy-menu-secondary-bg": "#11141A",
|
||||
"comfy-input-bg": "#161b22",
|
||||
"input-text": "#bcc2c8",
|
||||
"descrip-text": "#999",
|
||||
"drag-text": "#ccc",
|
||||
"error-text": "#ff4444",
|
||||
"border-color": "#30363d",
|
||||
"tr-even-bg-color": "#161b22",
|
||||
"tr-odd-bg-color": "#13171d",
|
||||
"content-bg": "#30363d",
|
||||
"content-fg": "#e5eaf0",
|
||||
"content-hover-bg": "#161b22",
|
||||
"content-hover-fg": "#e5eaf0",
|
||||
"bar-shadow": "rgba(0, 0, 0, 1) 0 0 0.5rem"
|
||||
}
|
||||
}
|
||||
}
|
||||
65
src/assets/palettes/light.json
Normal file
65
src/assets/palettes/light.json
Normal file
@@ -0,0 +1,65 @@
|
||||
{
|
||||
"id": "light",
|
||||
"name": "Light",
|
||||
"colors": {
|
||||
"node_slot": {
|
||||
"CLIP": "#FFA726",
|
||||
"CLIP_VISION": "#5C6BC0",
|
||||
"CLIP_VISION_OUTPUT": "#8D6E63",
|
||||
"CONDITIONING": "#EF5350",
|
||||
"CONTROL_NET": "#66BB6A",
|
||||
"IMAGE": "#42A5F5",
|
||||
"LATENT": "#AB47BC",
|
||||
"MASK": "#9CCC65",
|
||||
"MODEL": "#7E57C2",
|
||||
"STYLE_MODEL": "#D4E157",
|
||||
"VAE": "#FF7043"
|
||||
},
|
||||
"litegraph_base": {
|
||||
"BACKGROUND_IMAGE": "data:image/gif;base64,R0lGODlhZABkALMAAAAAAP///+vr6+rq6ujo6Ofn5+bm5uXl5d3d3f///wAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAkALAAAAABkAGQAAAT/UMhJq7046827HkcoHkYxjgZhnGG6si5LqnIM0/fL4qwwIMAg0CAsEovBIxKhRDaNy2GUOX0KfVFrssrNdpdaqTeKBX+dZ+jYvEaTf+y4W66mC8PUdrE879f9d2mBeoNLfH+IhYBbhIx2jkiHiomQlGKPl4uZe3CaeZifnnijgkESBqipqqusra6vsLGys62SlZO4t7qbuby7CLa+wqGWxL3Gv3jByMOkjc2lw8vOoNSi0czAncXW3Njdx9Pf48/Z4Kbbx+fQ5evZ4u3k1fKR6cn03vHlp7T9/v8A/8Gbp4+gwXoFryXMB2qgwoMMHyKEqA5fxX322FG8tzBcRnMW/zlulPbRncmQGidKjMjyYsOSKEF2FBlJQMCbOHP6c9iSZs+UnGYCdbnSo1CZI5F64kn0p1KnTH02nSoV3dGTV7FFHVqVq1dtWcMmVQZTbNGu72zqXMuW7danVL+6e4t1bEy6MeueBYLXrNO5Ze36jQtWsOG97wIj1vt3St/DjTEORss4nNq2mDP3e7w4r1bFkSET5hy6s2TRlD2/mSxXtSHQhCunXo26NevCpmvD/UU6tuullzULH76q92zdZG/Ltv1a+W+osI/nRmyc+fRi1Xdbh+68+0vv10dH3+77KD/i6IdnX669/frn5Zsjh4/2PXju8+8bzc9/6fj27LFnX11/+IUnXWl7BJfegm79FyB9JOl3oHgSklefgxAC+FmFGpqHIYcCfkhgfCohSKKJVo044YUMttggiBkmp6KFXw1oII24oYhjiDByaKOOHcp3Y5BD/njikSkO+eBREQAAOw==",
|
||||
"CLEAR_BACKGROUND_COLOR": "lightgray",
|
||||
"NODE_TITLE_COLOR": "#222",
|
||||
"NODE_SELECTED_TITLE_COLOR": "#000",
|
||||
"NODE_TEXT_SIZE": 14,
|
||||
"NODE_TEXT_COLOR": "#444",
|
||||
"NODE_SUBTEXT_SIZE": 12,
|
||||
"NODE_DEFAULT_COLOR": "#F7F7F7",
|
||||
"NODE_DEFAULT_BGCOLOR": "#F5F5F5",
|
||||
"NODE_DEFAULT_BOXCOLOR": "#CCC",
|
||||
"NODE_DEFAULT_SHAPE": 2,
|
||||
"NODE_BOX_OUTLINE_COLOR": "#000",
|
||||
"NODE_BYPASS_BGCOLOR": "#FF00FF",
|
||||
"NODE_ERROR_COLOUR": "#E00",
|
||||
"DEFAULT_SHADOW_COLOR": "rgba(0,0,0,0.1)",
|
||||
"DEFAULT_GROUP_FONT": 24,
|
||||
"WIDGET_BGCOLOR": "#D4D4D4",
|
||||
"WIDGET_OUTLINE_COLOR": "#999",
|
||||
"WIDGET_TEXT_COLOR": "#222",
|
||||
"WIDGET_SECONDARY_TEXT_COLOR": "#555",
|
||||
"LINK_COLOR": "#4CAF50",
|
||||
"EVENT_LINK_COLOR": "#FF9800",
|
||||
"CONNECTING_LINK_COLOR": "#2196F3",
|
||||
"BADGE_FG_COLOR": "#000",
|
||||
"BADGE_BG_COLOR": "#FFF"
|
||||
},
|
||||
"comfy_base": {
|
||||
"fg-color": "#222",
|
||||
"bg-color": "#DDD",
|
||||
"comfy-menu-bg": "#F5F5F5",
|
||||
"comfy-menu-secondary-bg": "#EEE",
|
||||
"comfy-input-bg": "#C9C9C9",
|
||||
"input-text": "#222",
|
||||
"descrip-text": "#444",
|
||||
"drag-text": "#555",
|
||||
"error-text": "#F44336",
|
||||
"border-color": "#888",
|
||||
"tr-even-bg-color": "#f9f9f9",
|
||||
"tr-odd-bg-color": "#fff",
|
||||
"content-bg": "#e0e0e0",
|
||||
"content-fg": "#222",
|
||||
"content-hover-bg": "#adadad",
|
||||
"content-hover-fg": "#222",
|
||||
"bar-shadow": "rgba(16, 16, 16, 0.25) 0 0 0.5rem"
|
||||
}
|
||||
}
|
||||
}
|
||||
77
src/assets/palettes/nord.json
Normal file
77
src/assets/palettes/nord.json
Normal file
@@ -0,0 +1,77 @@
|
||||
{
|
||||
"id": "nord",
|
||||
"name": "Nord",
|
||||
"colors": {
|
||||
"node_slot": {
|
||||
"BOOLEAN": "",
|
||||
"CLIP": "#eacb8b",
|
||||
"CLIP_VISION": "#A8DADC",
|
||||
"CLIP_VISION_OUTPUT": "#ad7452",
|
||||
"CONDITIONING": "#cf876f",
|
||||
"CONTROL_NET": "#00d78d",
|
||||
"CONTROL_NET_WEIGHTS": "",
|
||||
"FLOAT": "",
|
||||
"GLIGEN": "",
|
||||
"IMAGE": "#80a1c0",
|
||||
"IMAGEUPLOAD": "",
|
||||
"INT": "",
|
||||
"LATENT": "#b38ead",
|
||||
"LATENT_KEYFRAME": "",
|
||||
"MASK": "#a3bd8d",
|
||||
"MODEL": "#8978a7",
|
||||
"SAMPLER": "",
|
||||
"SIGMAS": "",
|
||||
"STRING": "",
|
||||
"STYLE_MODEL": "#C2FFAE",
|
||||
"T2I_ADAPTER_WEIGHTS": "",
|
||||
"TAESD": "#DCC274",
|
||||
"TIMESTEP_KEYFRAME": "",
|
||||
"UPSCALE_MODEL": "",
|
||||
"VAE": "#be616b"
|
||||
},
|
||||
"litegraph_base": {
|
||||
"BACKGROUND_IMAGE": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAIAAAD/gAIDAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFu2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDEgNzkuMTQ2Mjg5OSwgMjAyMy8wNi8yNS0yMDowMTo1NSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI1LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMS0xM1QwMDoxODowMiswMTowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTEtMTVUMDE6MjA6NDUrMDE6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTEtMTVUMDE6MjA6NDUrMDE6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjUwNDFhMmZjLTEzNzQtMTk0ZC1hZWY4LTYxMzM1MTVmNjUwMCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoyMzFiMTBiMC1iNGZiLTAyNGUtYjEyZS0zMDUzMDNjZDA3YzgiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoyMzFiMTBiMC1iNGZiLTAyNGUtYjEyZS0zMDUzMDNjZDA3YzgiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjIzMWIxMGIwLWI0ZmItMDI0ZS1iMTJlLTMwNTMwM2NkMDdjOCIgc3RFdnQ6d2hlbj0iMjAyMy0xMS0xM1QwMDoxODowMiswMTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI1LjEgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo1MDQxYTJmYy0xMzc0LTE5NGQtYWVmOC02MTMzNTE1ZjY1MDAiIHN0RXZ0OndoZW49IjIwMjMtMTEtMTVUMDE6MjA6NDUrMDE6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyNS4xIChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz73jWg/AAAAyUlEQVR42u3WKwoAIBRFQRdiMb1idv9Lsxn9gEFw4Dbb8JCTojbbXEJwjJVL2HKwYMGCBQuWLbDmjr+9zrBGjHl1WVcvy2DBggULFizTWQpewSt4HzwsgwULFiwFr7MUvMtS8D54WLBgGSxYCl7BK3iXZbBgwYIFC5bpLAWv4BW8Dx6WwYIFC5aC11kK3mUpeB88LFiwDBYsBa/gFbzLMliwYMGCBct0loJX8AreBw/LYMGCBUvB6ywF77IUvA8eFixYBgsWrNfWAZPltufdad+1AAAAAElFTkSuQmCC",
|
||||
"CLEAR_BACKGROUND_COLOR": "#212732",
|
||||
"NODE_TITLE_COLOR": "#999",
|
||||
"NODE_SELECTED_TITLE_COLOR": "#e5eaf0",
|
||||
"NODE_TEXT_SIZE": 14,
|
||||
"NODE_TEXT_COLOR": "#bcc2c8",
|
||||
"NODE_SUBTEXT_SIZE": 12,
|
||||
"NODE_DEFAULT_COLOR": "#2e3440",
|
||||
"NODE_DEFAULT_BGCOLOR": "#161b22",
|
||||
"NODE_DEFAULT_BOXCOLOR": "#545d70",
|
||||
"NODE_DEFAULT_SHAPE": 2,
|
||||
"NODE_BOX_OUTLINE_COLOR": "#e5eaf0",
|
||||
"NODE_BYPASS_BGCOLOR": "#FF00FF",
|
||||
"NODE_ERROR_COLOUR": "#E00",
|
||||
"DEFAULT_SHADOW_COLOR": "rgba(0,0,0,0.5)",
|
||||
"DEFAULT_GROUP_FONT": 24,
|
||||
"WIDGET_BGCOLOR": "#2e3440",
|
||||
"WIDGET_OUTLINE_COLOR": "#545d70",
|
||||
"WIDGET_TEXT_COLOR": "#bcc2c8",
|
||||
"WIDGET_SECONDARY_TEXT_COLOR": "#999",
|
||||
"LINK_COLOR": "#9A9",
|
||||
"EVENT_LINK_COLOR": "#A86",
|
||||
"CONNECTING_LINK_COLOR": "#AFA"
|
||||
},
|
||||
"comfy_base": {
|
||||
"fg-color": "#e5eaf0",
|
||||
"bg-color": "#2e3440",
|
||||
"comfy-menu-bg": "#161b22",
|
||||
"comfy-menu-secondary-bg": "#14181F",
|
||||
"comfy-input-bg": "#2e3440",
|
||||
"input-text": "#bcc2c8",
|
||||
"descrip-text": "#999",
|
||||
"drag-text": "#ccc",
|
||||
"error-text": "#ff4444",
|
||||
"border-color": "#545d70",
|
||||
"tr-even-bg-color": "#2e3440",
|
||||
"tr-odd-bg-color": "#161b22",
|
||||
"content-bg": "#545d70",
|
||||
"content-fg": "#e5eaf0",
|
||||
"content-hover-bg": "#2e3440",
|
||||
"content-hover-fg": "#e5eaf0",
|
||||
"bar-shadow": "rgba(0, 0, 0, 0.75) 0 0 0.5rem"
|
||||
}
|
||||
}
|
||||
}
|
||||
62
src/assets/palettes/solarized.json
Normal file
62
src/assets/palettes/solarized.json
Normal file
@@ -0,0 +1,62 @@
|
||||
{
|
||||
"id": "solarized",
|
||||
"name": "Solarized",
|
||||
"colors": {
|
||||
"node_slot": {
|
||||
"CLIP": "#2AB7CA",
|
||||
"CLIP_VISION": "#6c71c4",
|
||||
"CLIP_VISION_OUTPUT": "#859900",
|
||||
"CONDITIONING": "#d33682",
|
||||
"CONTROL_NET": "#d1ffd7",
|
||||
"IMAGE": "#5940bb",
|
||||
"LATENT": "#268bd2",
|
||||
"MASK": "#CCC9E7",
|
||||
"MODEL": "#dc322f",
|
||||
"STYLE_MODEL": "#1a998a",
|
||||
"UPSCALE_MODEL": "#054A29",
|
||||
"VAE": "#facfad"
|
||||
},
|
||||
"litegraph_base": {
|
||||
"NODE_TITLE_COLOR": "#fdf6e3",
|
||||
"NODE_SELECTED_TITLE_COLOR": "#A9D400",
|
||||
"NODE_TEXT_SIZE": 14,
|
||||
"NODE_TEXT_COLOR": "#657b83",
|
||||
"NODE_SUBTEXT_SIZE": 12,
|
||||
"NODE_DEFAULT_COLOR": "#094656",
|
||||
"NODE_DEFAULT_BGCOLOR": "#073642",
|
||||
"NODE_DEFAULT_BOXCOLOR": "#839496",
|
||||
"NODE_DEFAULT_SHAPE": 2,
|
||||
"NODE_BOX_OUTLINE_COLOR": "#fdf6e3",
|
||||
"NODE_BYPASS_BGCOLOR": "#FF00FF",
|
||||
"NODE_ERROR_COLOUR": "#E00",
|
||||
"DEFAULT_SHADOW_COLOR": "rgba(0,0,0,0.5)",
|
||||
"DEFAULT_GROUP_FONT": 24,
|
||||
"WIDGET_BGCOLOR": "#002b36",
|
||||
"WIDGET_OUTLINE_COLOR": "#839496",
|
||||
"WIDGET_TEXT_COLOR": "#fdf6e3",
|
||||
"WIDGET_SECONDARY_TEXT_COLOR": "#93a1a1",
|
||||
"LINK_COLOR": "#2aa198",
|
||||
"EVENT_LINK_COLOR": "#268bd2",
|
||||
"CONNECTING_LINK_COLOR": "#859900"
|
||||
},
|
||||
"comfy_base": {
|
||||
"fg-color": "#fdf6e3",
|
||||
"bg-color": "#002b36",
|
||||
"comfy-menu-bg": "#073642",
|
||||
"comfy-menu-secondary-bg": "#06323D",
|
||||
"comfy-input-bg": "#002b36",
|
||||
"input-text": "#93a1a1",
|
||||
"descrip-text": "#586e75",
|
||||
"drag-text": "#839496",
|
||||
"error-text": "#dc322f",
|
||||
"border-color": "#657b83",
|
||||
"tr-even-bg-color": "#002b36",
|
||||
"tr-odd-bg-color": "#073642",
|
||||
"content-bg": "#657b83",
|
||||
"content-fg": "#fdf6e3",
|
||||
"content-hover-bg": "#002b36",
|
||||
"content-hover-fg": "#fdf6e3",
|
||||
"bar-shadow": "rgba(16, 16, 16, 0.5) 0 0 0.5rem"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,7 +2,8 @@
|
||||
<Splitter
|
||||
class="splitter-overlay-root splitter-overlay"
|
||||
:pt:gutter="sidebarPanelVisible ? '' : 'hidden'"
|
||||
stateKey="sidebar-splitter"
|
||||
:key="activeSidebarTabId"
|
||||
:stateKey="activeSidebarTabId"
|
||||
stateStorage="local"
|
||||
>
|
||||
<SplitterPanel
|
||||
@@ -63,6 +64,9 @@ const sidebarPanelVisible = computed(
|
||||
const bottomPanelVisible = computed(
|
||||
() => useBottomPanelStore().bottomPanelVisible
|
||||
)
|
||||
const activeSidebarTabId = computed(
|
||||
() => useSidebarTabStore().activeSidebarTabId
|
||||
)
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
@@ -57,7 +57,7 @@ const handleClick = (increment: boolean) => {
|
||||
let newCount: number
|
||||
if (increment) {
|
||||
const originalCount = batchCount.value - 1
|
||||
newCount = originalCount * 2
|
||||
newCount = Math.min(originalCount * 2, maxQueueCount.value)
|
||||
} else {
|
||||
const originalCount = batchCount.value + 1
|
||||
newCount = Math.floor(originalCount / 2)
|
||||
|
||||
@@ -230,6 +230,10 @@ watch([isDragging, isOverlappingWithTopMenu], ([dragging, overlapping]) => {
|
||||
@apply p-1;
|
||||
}
|
||||
|
||||
.is-docked :deep(.p-panel-content) {
|
||||
@apply p-0;
|
||||
}
|
||||
|
||||
:deep(.p-panel-header) {
|
||||
display: none;
|
||||
}
|
||||
|
||||
35
src/components/common/FormColorPicker.vue
Normal file
35
src/components/common/FormColorPicker.vue
Normal file
@@ -0,0 +1,35 @@
|
||||
<template>
|
||||
<div class="color-picker-wrapper flex items-center gap-2">
|
||||
<ColorPicker v-model="modelValue">
|
||||
<template #header>
|
||||
<div class="flex items-center justify-between p-2">
|
||||
<span>{{ props.label }}</span>
|
||||
<Button
|
||||
v-if="props.defaultValue"
|
||||
icon="pi pi-refresh"
|
||||
text
|
||||
size="small"
|
||||
@click="resetColor"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
</ColorPicker>
|
||||
<InputText v-model="modelValue" class="w-28" :placeholder="label" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import Button from 'primevue/button'
|
||||
import ColorPicker from 'primevue/colorpicker'
|
||||
import InputText from 'primevue/inputtext'
|
||||
|
||||
const modelValue = defineModel<string>('modelValue')
|
||||
const props = defineProps<{
|
||||
defaultValue?: string
|
||||
label?: string
|
||||
}>()
|
||||
|
||||
const resetColor = () => {
|
||||
modelValue.value = props.defaultValue || '#000000'
|
||||
}
|
||||
</script>
|
||||
80
src/components/common/FormImageUpload.vue
Normal file
80
src/components/common/FormImageUpload.vue
Normal file
@@ -0,0 +1,80 @@
|
||||
<template>
|
||||
<div class="image-upload-wrapper">
|
||||
<div class="flex gap-2 items-center">
|
||||
<div
|
||||
class="preview-box border rounded p-2 w-16 h-16 flex items-center justify-center"
|
||||
:class="{ 'bg-gray-100 dark:bg-gray-800': !modelValue }"
|
||||
>
|
||||
<img
|
||||
v-if="modelValue"
|
||||
:src="modelValue"
|
||||
class="max-w-full max-h-full object-contain"
|
||||
/>
|
||||
<i v-else class="pi pi-image text-gray-400 text-xl"></i>
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col gap-2">
|
||||
<Button
|
||||
icon="pi pi-upload"
|
||||
:label="$t('g.upload')"
|
||||
size="small"
|
||||
@click="triggerFileInput"
|
||||
/>
|
||||
<Button
|
||||
v-if="modelValue"
|
||||
class="w-full"
|
||||
outlined
|
||||
icon="pi pi-trash"
|
||||
severity="danger"
|
||||
size="small"
|
||||
@click="clearImage"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<input
|
||||
ref="fileInput"
|
||||
type="file"
|
||||
class="hidden"
|
||||
accept="image/*"
|
||||
@change="handleFileUpload"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref } from 'vue'
|
||||
import Button from 'primevue/button'
|
||||
|
||||
const props = defineProps<{
|
||||
modelValue: string
|
||||
}>()
|
||||
|
||||
const emit = defineEmits<{
|
||||
(e: 'update:modelValue', value: string): void
|
||||
}>()
|
||||
|
||||
const fileInput = ref<HTMLInputElement | null>(null)
|
||||
|
||||
const triggerFileInput = () => {
|
||||
fileInput.value?.click()
|
||||
}
|
||||
|
||||
const handleFileUpload = (event: Event) => {
|
||||
const target = event.target as HTMLInputElement
|
||||
if (target.files && target.files[0]) {
|
||||
const file = target.files[0]
|
||||
const reader = new FileReader()
|
||||
reader.onload = (e) => {
|
||||
emit('update:modelValue', e.target?.result as string)
|
||||
}
|
||||
reader.readAsDataURL(file)
|
||||
}
|
||||
}
|
||||
|
||||
const clearImage = () => {
|
||||
emit('update:modelValue', '')
|
||||
if (fileInput.value) {
|
||||
fileInput.value.value = ''
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -1,24 +1,26 @@
|
||||
<!-- A generalized form item for rendering in a form. -->
|
||||
<template>
|
||||
<div class="form-label flex flex-grow items-center">
|
||||
<span class="text-muted" :class="props.labelClass">
|
||||
<slot name="name-prefix"></slot>
|
||||
{{ props.item.name }}
|
||||
<i
|
||||
v-if="props.item.tooltip"
|
||||
class="pi pi-info-circle bg-transparent"
|
||||
v-tooltip="props.item.tooltip"
|
||||
<div class="flex flex-row items-center gap-2">
|
||||
<div class="form-label flex flex-grow items-center">
|
||||
<span class="text-muted" :class="props.labelClass">
|
||||
<slot name="name-prefix"></slot>
|
||||
{{ props.item.name }}
|
||||
<i
|
||||
v-if="props.item.tooltip"
|
||||
class="pi pi-info-circle bg-transparent"
|
||||
v-tooltip="props.item.tooltip"
|
||||
/>
|
||||
<slot name="name-suffix"></slot>
|
||||
</span>
|
||||
</div>
|
||||
<div class="form-input flex justify-end">
|
||||
<component
|
||||
:is="markRaw(getFormComponent(props.item))"
|
||||
:id="props.id"
|
||||
v-model:modelValue="formValue"
|
||||
v-bind="getFormAttrs(props.item)"
|
||||
/>
|
||||
<slot name="name-suffix"></slot>
|
||||
</span>
|
||||
</div>
|
||||
<div class="form-input flex justify-end">
|
||||
<component
|
||||
:is="markRaw(getFormComponent(props.item))"
|
||||
:id="props.id"
|
||||
v-model:modelValue="formValue"
|
||||
v-bind="getFormAttrs(props.item)"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -31,6 +33,8 @@ import Select from 'primevue/select'
|
||||
import ToggleSwitch from 'primevue/toggleswitch'
|
||||
import CustomFormValue from '@/components/common/CustomFormValue.vue'
|
||||
import InputSlider from '@/components/common/InputSlider.vue'
|
||||
import FormImageUpload from '@/components/common/FormImageUpload.vue'
|
||||
import FormColorPicker from '@/components/common/FormColorPicker.vue'
|
||||
|
||||
const formValue = defineModel<any>('formValue')
|
||||
const props = defineProps<{
|
||||
@@ -82,6 +86,10 @@ function getFormComponent(item: FormItem): Component {
|
||||
return InputSlider
|
||||
case 'combo':
|
||||
return Select
|
||||
case 'image':
|
||||
return FormImageUpload
|
||||
case 'color':
|
||||
return FormColorPicker
|
||||
default:
|
||||
return InputText
|
||||
}
|
||||
|
||||
@@ -1,22 +1,29 @@
|
||||
<template>
|
||||
<div :class="props.class">
|
||||
<IconField>
|
||||
<InputIcon :class="props.icon" />
|
||||
<InputText
|
||||
class="search-box-input"
|
||||
:class="{ ['with-filter']: props.filterIcon }"
|
||||
@input="handleInput"
|
||||
:modelValue="props.modelValue"
|
||||
:placeholder="props.placeholder"
|
||||
/>
|
||||
<Button
|
||||
v-if="props.filterIcon"
|
||||
class="p-inputicon"
|
||||
class="p-inputicon filter-button"
|
||||
:icon="props.filterIcon"
|
||||
text
|
||||
severity="contrast"
|
||||
@click="$emit('showFilter', $event)"
|
||||
/>
|
||||
<InputText
|
||||
class="search-box-input w-full"
|
||||
@input="handleInput"
|
||||
:modelValue="props.modelValue"
|
||||
:placeholder="props.placeholder"
|
||||
/>
|
||||
<InputIcon v-if="!props.modelValue" :class="props.icon" />
|
||||
<Button
|
||||
v-if="props.modelValue"
|
||||
class="p-inputicon clear-button"
|
||||
icon="pi pi-times"
|
||||
text
|
||||
severity="contrast"
|
||||
@click="clearSearch"
|
||||
/>
|
||||
</IconField>
|
||||
<div
|
||||
class="search-filters pt-2 flex flex-wrap gap-2"
|
||||
@@ -79,21 +86,19 @@ const handleInput = (event: Event) => {
|
||||
emit('update:modelValue', target.value)
|
||||
emitSearch(target.value)
|
||||
}
|
||||
|
||||
const clearSearch = () => {
|
||||
emit('update:modelValue', '')
|
||||
emitSearch('')
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.search-box-input {
|
||||
width: 100%;
|
||||
padding-left: 36px;
|
||||
}
|
||||
|
||||
.search-box-input.with-filter {
|
||||
padding-right: 36px;
|
||||
:deep(.p-inputtext) {
|
||||
--p-form-field-padding-x: 0.625rem;
|
||||
}
|
||||
|
||||
.p-button.p-inputicon {
|
||||
padding: 0;
|
||||
width: auto;
|
||||
border: none !important;
|
||||
@apply p-0 w-auto border-none;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -82,6 +82,10 @@ import { isElectron } from '@/utils/envUtil'
|
||||
import { normalizeI18nKey } from '@/utils/formatUtil'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
|
||||
const props = defineProps<{
|
||||
defaultPanel?: 'about' | 'keybinding' | 'extension' | 'server-config'
|
||||
}>()
|
||||
|
||||
const KeybindingPanel = defineAsyncComponent(
|
||||
() => import('./setting/KeybindingPanel.vue')
|
||||
)
|
||||
@@ -116,12 +120,6 @@ const serverConfigPanelNode: SettingTreeNode = {
|
||||
children: []
|
||||
}
|
||||
|
||||
const extensionPanelNodeList = computed<SettingTreeNode[]>(() => {
|
||||
const settingStore = useSettingStore()
|
||||
const showExtensionPanel = settingStore.get('Comfy.Settings.ExtensionPanel')
|
||||
return showExtensionPanel ? [extensionPanelNode] : []
|
||||
})
|
||||
|
||||
/**
|
||||
* Server config panel is only available in Electron. We might want to support
|
||||
* it in the web version in the future.
|
||||
@@ -140,7 +138,7 @@ const categories = computed<SettingTreeNode[]>(() =>
|
||||
[
|
||||
...settingCategories.value,
|
||||
keybindingPanelNode,
|
||||
...extensionPanelNodeList.value,
|
||||
extensionPanelNode,
|
||||
...serverConfigPanelNodeList.value,
|
||||
aboutPanelNode
|
||||
].map((node) => ({
|
||||
@@ -162,7 +160,10 @@ watch(activeCategory, (newCategory, oldCategory) => {
|
||||
})
|
||||
|
||||
onMounted(() => {
|
||||
activeCategory.value = categories.value[0]
|
||||
activeCategory.value = props.defaultPanel
|
||||
? categories.value.find((x) => x.key === props.defaultPanel) ??
|
||||
categories.value[0]
|
||||
: categories.value[0]
|
||||
})
|
||||
|
||||
const sortedGroups = (category: SettingTreeNode): ISettingGroup[] => {
|
||||
@@ -190,7 +191,7 @@ const handleSearch = (query: string) => {
|
||||
const idLower = setting.id.toLowerCase()
|
||||
const nameLower = setting.name.toLowerCase()
|
||||
const translatedName = t(
|
||||
`settingsDialog.${normalizeI18nKey(setting.id)}.name`
|
||||
`settings.${normalizeI18nKey(setting.id)}.name`
|
||||
).toLocaleLowerCase()
|
||||
|
||||
return (
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { computed, ref, defineProps } from 'vue'
|
||||
import { computed, ref } from 'vue'
|
||||
import Button from 'primevue/button'
|
||||
import { useToast } from 'primevue/usetoast'
|
||||
import { ExecutionErrorWsMessage } from '@/types/apiTypes'
|
||||
|
||||
@@ -5,7 +5,12 @@
|
||||
v-model="filters['global'].value"
|
||||
:placeholder="$t('g.searchExtensions') + '...'"
|
||||
/>
|
||||
<Message v-if="hasChanges" severity="info" pt:text="w-full">
|
||||
<Message
|
||||
v-if="hasChanges"
|
||||
severity="info"
|
||||
pt:text="w-full"
|
||||
class="max-h-96 overflow-y-auto"
|
||||
>
|
||||
<ul>
|
||||
<li v-for="ext in changedExtensions" :key="ext.name">
|
||||
<span>
|
||||
@@ -30,14 +35,33 @@
|
||||
size="small"
|
||||
:filters="filters"
|
||||
>
|
||||
<Column field="name" :header="$t('g.extensionName')" sortable></Column>
|
||||
<Column :header="$t('g.extensionName')" sortable field="name">
|
||||
<template #body="slotProps">
|
||||
{{ slotProps.data.name }}
|
||||
<Tag
|
||||
v-if="extensionStore.isCoreExtension(slotProps.data.name)"
|
||||
value="Core"
|
||||
/>
|
||||
</template>
|
||||
</Column>
|
||||
<Column
|
||||
:pt="{
|
||||
headerCell: 'flex items-center justify-end',
|
||||
bodyCell: 'flex items-center justify-end'
|
||||
}"
|
||||
>
|
||||
<template #header>
|
||||
<Button
|
||||
icon="pi pi-ellipsis-h"
|
||||
text
|
||||
severity="secondary"
|
||||
@click="menu.show($event)"
|
||||
/>
|
||||
<ContextMenu ref="menu" :model="contextMenuItems" />
|
||||
</template>
|
||||
<template #body="slotProps">
|
||||
<ToggleSwitch
|
||||
:disabled="extensionStore.isExtensionReadOnly(slotProps.data.name)"
|
||||
v-model="editingEnabledExtensions[slotProps.data.name]"
|
||||
@change="updateExtensionStatus"
|
||||
/>
|
||||
@@ -54,7 +78,9 @@ import { useSettingStore } from '@/stores/settingStore'
|
||||
import DataTable from 'primevue/datatable'
|
||||
import Column from 'primevue/column'
|
||||
import ToggleSwitch from 'primevue/toggleswitch'
|
||||
import Tag from 'primevue/tag'
|
||||
import Button from 'primevue/button'
|
||||
import ContextMenu from 'primevue/contextmenu'
|
||||
import Message from 'primevue/message'
|
||||
import { FilterMatchMode } from '@primevue/core/api'
|
||||
import PanelTemplate from './PanelTemplate.vue'
|
||||
@@ -101,8 +127,55 @@ const updateExtensionStatus = () => {
|
||||
])
|
||||
}
|
||||
|
||||
const enableAllExtensions = () => {
|
||||
extensionStore.extensions.forEach((ext) => {
|
||||
if (extensionStore.isExtensionReadOnly(ext.name)) return
|
||||
|
||||
editingEnabledExtensions.value[ext.name] = true
|
||||
})
|
||||
updateExtensionStatus()
|
||||
}
|
||||
|
||||
const disableAllExtensions = () => {
|
||||
extensionStore.extensions.forEach((ext) => {
|
||||
if (extensionStore.isExtensionReadOnly(ext.name)) return
|
||||
|
||||
editingEnabledExtensions.value[ext.name] = false
|
||||
})
|
||||
updateExtensionStatus()
|
||||
}
|
||||
|
||||
const disableThirdPartyExtensions = () => {
|
||||
extensionStore.extensions.forEach((ext) => {
|
||||
if (extensionStore.isCoreExtension(ext.name)) return
|
||||
|
||||
editingEnabledExtensions.value[ext.name] = false
|
||||
})
|
||||
updateExtensionStatus()
|
||||
}
|
||||
|
||||
const applyChanges = () => {
|
||||
// Refresh the page to apply changes
|
||||
window.location.reload()
|
||||
}
|
||||
|
||||
const menu = ref<InstanceType<typeof ContextMenu>>()
|
||||
const contextMenuItems = [
|
||||
{
|
||||
label: 'Enable All',
|
||||
icon: 'pi pi-check',
|
||||
command: enableAllExtensions
|
||||
},
|
||||
{
|
||||
label: 'Disable All',
|
||||
icon: 'pi pi-times',
|
||||
command: disableAllExtensions
|
||||
},
|
||||
{
|
||||
label: 'Disable 3rd Party',
|
||||
icon: 'pi pi-times',
|
||||
command: disableThirdPartyExtensions,
|
||||
disabled: !extensionStore.hasThirdPartyExtensions
|
||||
}
|
||||
]
|
||||
</script>
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
</Column>
|
||||
<Column
|
||||
field="id"
|
||||
header="Command ID"
|
||||
:header="$t('g.command')"
|
||||
sortable
|
||||
class="max-w-64 2xl:max-w-full"
|
||||
>
|
||||
@@ -50,7 +50,7 @@
|
||||
</div>
|
||||
</template>
|
||||
</Column>
|
||||
<Column field="keybinding" header="Keybinding">
|
||||
<Column field="keybinding" :header="$t('g.keybinding')">
|
||||
<template #body="slotProps">
|
||||
<KeyComboDisplay
|
||||
v-if="slotProps.data.keybinding"
|
||||
|
||||
@@ -51,11 +51,7 @@
|
||||
>
|
||||
<Divider v-if="i > 0" />
|
||||
<h3>{{ $t(`serverConfigCategories.${label}`, label) }}</h3>
|
||||
<div
|
||||
v-for="item in items"
|
||||
:key="item.name"
|
||||
class="flex items-center mb-4"
|
||||
>
|
||||
<div v-for="item in items" :key="item.name" class="mb-4">
|
||||
<FormItem
|
||||
:item="translateItem(item)"
|
||||
v-model:formValue="item.value"
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
<div
|
||||
v-for="setting in group.settings"
|
||||
:key="setting.id"
|
||||
class="setting-item flex items-center mb-4"
|
||||
class="setting-item mb-4"
|
||||
>
|
||||
<SettingItem :setting="setting" />
|
||||
</div>
|
||||
|
||||
@@ -37,7 +37,7 @@ function translateOptions(options: (SettingOption | string)[]) {
|
||||
|
||||
return {
|
||||
text: t(
|
||||
`settingsDialog.${normalizeI18nKey(props.setting.id)}.options.${normalizeI18nKey(optionLabel)}`,
|
||||
`settings.${normalizeI18nKey(props.setting.id)}.options.${normalizeI18nKey(optionLabel)}`,
|
||||
optionLabel
|
||||
),
|
||||
value: optionValue
|
||||
@@ -49,9 +49,9 @@ const formItem = computed(() => {
|
||||
const normalizedId = normalizeI18nKey(props.setting.id)
|
||||
return {
|
||||
...props.setting,
|
||||
name: t(`settingsDialog.${normalizedId}.name`, props.setting.name),
|
||||
name: t(`settings.${normalizedId}.name`, props.setting.name),
|
||||
tooltip: props.setting.tooltip
|
||||
? t(`settingsDialog.${normalizedId}.tooltip`, props.setting.tooltip)
|
||||
? t(`settings.${normalizedId}.tooltip`, props.setting.tooltip)
|
||||
: undefined,
|
||||
options: props.setting.options
|
||||
? translateOptions(props.setting.options)
|
||||
|
||||
@@ -18,7 +18,7 @@ import { LGraphBadge } from '@comfyorg/litegraph'
|
||||
import _ from 'lodash'
|
||||
import { NodeBadgeMode } from '@/types/nodeSource'
|
||||
import { ComfyNodeDefImpl, useNodeDefStore } from '@/stores/nodeDefStore'
|
||||
import type { Palette } from '@/types/colorPalette'
|
||||
import type { Palette } from '@/types/colorPaletteTypes'
|
||||
|
||||
const settingStore = useSettingStore()
|
||||
const nodeSourceBadgeMode = computed(
|
||||
|
||||
@@ -13,14 +13,14 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, onMounted, onUnmounted, CSSProperties, watch } from 'vue'
|
||||
import { ref, CSSProperties, watch } from 'vue'
|
||||
import { app } from '@/scripts/app'
|
||||
import { LGraphGroup, LGraphNode, LiteGraph } from '@comfyorg/litegraph'
|
||||
import EditableText from '@/components/common/EditableText.vue'
|
||||
import { ComfyExtension } from '@/types/comfy'
|
||||
import { useSettingStore } from '@/stores/settingStore'
|
||||
import type { LiteGraphCanvasEvent } from '@comfyorg/litegraph'
|
||||
import { useCanvasStore, useTitleEditorStore } from '@/stores/graphStore'
|
||||
import { useEventListener } from '@vueuse/core'
|
||||
|
||||
const settingStore = useSettingStore()
|
||||
|
||||
@@ -97,54 +97,38 @@ watch(
|
||||
)
|
||||
|
||||
const canvasEventHandler = (event: LiteGraphCanvasEvent) => {
|
||||
if (!settingStore.get('Comfy.Group.DoubleClickTitleToEdit')) {
|
||||
return
|
||||
}
|
||||
|
||||
if (event.detail.subType === 'group-double-click') {
|
||||
if (!settingStore.get('Comfy.Group.DoubleClickTitleToEdit')) {
|
||||
return
|
||||
}
|
||||
|
||||
const group: LGraphGroup = event.detail.group
|
||||
const [x, y] = group.pos
|
||||
|
||||
const e = event.detail.originalEvent
|
||||
const relativeY = e.canvasY - y
|
||||
// Only allow editing if the click is on the title bar
|
||||
if (relativeY > group.titleHeight) {
|
||||
if (relativeY <= group.titleHeight) {
|
||||
titleEditorStore.titleEditorTarget = group
|
||||
}
|
||||
} else if (event.detail.subType === 'node-double-click') {
|
||||
if (!settingStore.get('Comfy.Node.DoubleClickTitleToEdit')) {
|
||||
return
|
||||
}
|
||||
|
||||
titleEditorStore.titleEditorTarget = group
|
||||
}
|
||||
}
|
||||
const node: LGraphNode = event.detail.node
|
||||
const [x, y] = node.pos
|
||||
|
||||
const extension: ComfyExtension = {
|
||||
name: 'Comfy.NodeTitleEditor',
|
||||
nodeCreated(node: LGraphNode) {
|
||||
// Store the original callback
|
||||
const originalCallback = node.onNodeTitleDblClick
|
||||
|
||||
node.onNodeTitleDblClick = function (e: MouseEvent, ...args: any[]) {
|
||||
if (!settingStore.get('Comfy.Node.DoubleClickTitleToEdit')) {
|
||||
return
|
||||
}
|
||||
|
||||
titleEditorStore.titleEditorTarget = this
|
||||
|
||||
// Call the original callback if it exists
|
||||
if (typeof originalCallback === 'function') {
|
||||
originalCallback.call(this, e, ...args)
|
||||
}
|
||||
const e = event.detail.originalEvent
|
||||
const relativeY = e.canvasY - y
|
||||
// Only allow editing if the click is on the title bar
|
||||
if (relativeY <= 0) {
|
||||
titleEditorStore.titleEditorTarget = node
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
document.addEventListener('litegraph:canvas', canvasEventHandler)
|
||||
app.registerExtension(extension)
|
||||
})
|
||||
|
||||
onUnmounted(() => {
|
||||
document.removeEventListener('litegraph:canvas', canvasEventHandler)
|
||||
})
|
||||
useEventListener(document, 'litegraph:canvas', canvasEventHandler)
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
@@ -26,9 +26,12 @@
|
||||
<Button icon="pi pi-folder" @click="browsePath" class="w-12" />
|
||||
</div>
|
||||
|
||||
<Message v-if="pathError" severity="error">
|
||||
<Message v-if="pathError" severity="error" class="whitespace-pre-line">
|
||||
{{ pathError }}
|
||||
</Message>
|
||||
<Message v-if="pathExists" severity="warn">
|
||||
{{ $t('install.pathExists') }}
|
||||
</Message>
|
||||
</div>
|
||||
|
||||
<!-- System Paths Info -->
|
||||
@@ -74,6 +77,7 @@ const { t } = useI18n()
|
||||
|
||||
const installPath = defineModel<string>('installPath', { required: true })
|
||||
const pathError = defineModel<string>('pathError', { required: true })
|
||||
const pathExists = ref(false)
|
||||
const appData = ref('')
|
||||
const appPath = ref('')
|
||||
|
||||
@@ -92,11 +96,25 @@ onMounted(async () => {
|
||||
const validatePath = async (path: string) => {
|
||||
try {
|
||||
pathError.value = ''
|
||||
pathExists.value = false
|
||||
const validation = await electron.validateInstallPath(path)
|
||||
|
||||
// Create a pre-formatted list of errors
|
||||
if (!validation.isValid) {
|
||||
pathError.value = validation.error
|
||||
const errors: string[] = []
|
||||
if (validation.cannotWrite) errors.push(t('install.cannotWrite'))
|
||||
if (validation.freeSpace < validation.requiredSpace) {
|
||||
const requiredGB = validation.requiredSpace / 1024 / 1024 / 1024
|
||||
errors.push(`${t('install.insufficientFreeSpace')}: ${requiredGB} GB`)
|
||||
}
|
||||
if (validation.parentMissing) errors.push(t('install.parentMissing'))
|
||||
if (validation.error)
|
||||
errors.push(`${t('install.unhandledError')}: ${validation.error}`)
|
||||
pathError.value = errors.join('\n')
|
||||
}
|
||||
|
||||
// Display the path exists warning
|
||||
if (validation.exists) pathExists.value = true
|
||||
} catch (error) {
|
||||
pathError.value = t('install.pathValidationFailed')
|
||||
}
|
||||
|
||||
@@ -57,18 +57,6 @@
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex items-center gap-3 p-2 rounded cursor-not-allowed">
|
||||
<Checkbox disabled :binary="true" />
|
||||
<div>
|
||||
<label class="text-neutral-200 font-medium">
|
||||
{{ $t('install.customNodes') }}
|
||||
<Tag severity="secondary"> {{ $t('g.comingSoon') }}... </Tag>
|
||||
</label>
|
||||
<p class="text-sm text-neutral-400 my-1">
|
||||
{{ $t('install.customNodesDescription') }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -82,7 +70,6 @@
|
||||
<script setup lang="ts">
|
||||
import { ref, computed, watchEffect } from 'vue'
|
||||
import { electronAPI } from '@/utils/envUtil'
|
||||
import Tag from 'primevue/tag'
|
||||
import InputText from 'primevue/inputtext'
|
||||
import Button from 'primevue/button'
|
||||
import Checkbox from 'primevue/checkbox'
|
||||
|
||||
@@ -54,6 +54,7 @@
|
||||
<!-- FilterAndValue -->
|
||||
<template v-slot:chip="{ value }">
|
||||
<SearchFilterChip
|
||||
:key="`${value[0].id}-${value[1]}`"
|
||||
@remove="onRemoveFilter($event, value)"
|
||||
:text="value[1]"
|
||||
:badge="value[0].invokeSequence.toUpperCase()"
|
||||
@@ -65,7 +66,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { computed, onMounted, ref } from 'vue'
|
||||
import { computed, nextTick, onMounted, ref } from 'vue'
|
||||
import AutoCompletePlus from '@/components/primevueOverride/AutoCompletePlus.vue'
|
||||
import Dialog from 'primevue/dialog'
|
||||
import Button from 'primevue/button'
|
||||
@@ -124,11 +125,12 @@ const search = (query: string) => {
|
||||
|
||||
const emit = defineEmits(['addFilter', 'removeFilter', 'addNode'])
|
||||
|
||||
let inputElement: HTMLInputElement | null = null
|
||||
const reFocusInput = () => {
|
||||
const inputElement = document.getElementById(inputId) as HTMLInputElement
|
||||
inputElement ??= document.getElementById(inputId) as HTMLInputElement
|
||||
if (inputElement) {
|
||||
inputElement.blur()
|
||||
inputElement.focus()
|
||||
nextTick(() => inputElement?.focus())
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
v-model="selectedFilterValue"
|
||||
:options="filterValues"
|
||||
filter
|
||||
autoFilterFocus
|
||||
/>
|
||||
</div>
|
||||
<div class="_footer">
|
||||
|
||||
@@ -110,6 +110,9 @@ onMounted(() => {
|
||||
})
|
||||
|
||||
onUnmounted(() => {
|
||||
if (progressPreviewBlobUrl.value) {
|
||||
URL.revokeObjectURL(progressPreviewBlobUrl.value)
|
||||
}
|
||||
api.removeEventListener('b_preview', onProgressPreviewReceived)
|
||||
})
|
||||
|
||||
@@ -164,6 +167,9 @@ const formatTime = (time?: number) => {
|
||||
|
||||
const onProgressPreviewReceived = async ({ detail }: CustomEvent) => {
|
||||
if (props.task.displayStatus === TaskItemDisplayStatus.Running) {
|
||||
if (progressPreviewBlobUrl.value) {
|
||||
URL.revokeObjectURL(progressPreviewBlobUrl.value)
|
||||
}
|
||||
progressPreviewBlobUrl.value = URL.createObjectURL(detail)
|
||||
}
|
||||
}
|
||||
|
||||
108
src/components/topbar/WorkflowTab.vue
Normal file
108
src/components/topbar/WorkflowTab.vue
Normal file
@@ -0,0 +1,108 @@
|
||||
<template>
|
||||
<div class="flex p-2 gap-2 workflow-tab" ref="workflowTabRef" v-bind="$attrs">
|
||||
<span
|
||||
class="workflow-label text-sm max-w-[150px] truncate inline-block"
|
||||
v-tooltip.bottom="workflowOption.workflow.key"
|
||||
>
|
||||
{{ workflowOption.workflow.filename }}
|
||||
</span>
|
||||
<div class="relative">
|
||||
<span
|
||||
class="status-indicator"
|
||||
v-if="
|
||||
!workspaceStore.shiftDown &&
|
||||
(workflowOption.workflow.isModified ||
|
||||
!workflowOption.workflow.isPersisted)
|
||||
"
|
||||
>•</span
|
||||
>
|
||||
<Button
|
||||
class="close-button p-0 w-auto"
|
||||
icon="pi pi-times"
|
||||
text
|
||||
severity="secondary"
|
||||
size="small"
|
||||
@click.stop="onCloseWorkflow(workflowOption)"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ComfyWorkflow } from '@/stores/workflowStore'
|
||||
import { useWorkflowStore } from '@/stores/workflowStore'
|
||||
import Button from 'primevue/button'
|
||||
import { ref } from 'vue'
|
||||
import { workflowService } from '@/services/workflowService'
|
||||
import { useWorkspaceStore } from '@/stores/workspaceStore'
|
||||
import { usePragmaticDraggable, usePragmaticDroppable } from '@/hooks/dndHooks'
|
||||
|
||||
interface WorkflowOption {
|
||||
value: string
|
||||
workflow: ComfyWorkflow
|
||||
}
|
||||
|
||||
const props = defineProps<{
|
||||
class?: string
|
||||
workflowOption: WorkflowOption
|
||||
}>()
|
||||
|
||||
const workspaceStore = useWorkspaceStore()
|
||||
const workflowStore = useWorkflowStore()
|
||||
const workflowTabRef = ref<HTMLElement | null>(null)
|
||||
|
||||
const closeWorkflows = async (options: WorkflowOption[]) => {
|
||||
for (const opt of options) {
|
||||
if (
|
||||
!(await workflowService.closeWorkflow(opt.workflow, {
|
||||
warnIfUnsaved: !workspaceStore.shiftDown
|
||||
}))
|
||||
) {
|
||||
// User clicked cancel
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const onCloseWorkflow = (option: WorkflowOption) => {
|
||||
closeWorkflows([option])
|
||||
}
|
||||
const tabGetter = () => workflowTabRef.value as HTMLElement
|
||||
|
||||
usePragmaticDraggable(tabGetter, {
|
||||
getInitialData: () => {
|
||||
return {
|
||||
workflowKey: props.workflowOption.workflow.key
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
usePragmaticDroppable(tabGetter, {
|
||||
getData: () => {
|
||||
return {
|
||||
workflowKey: props.workflowOption.workflow.key
|
||||
}
|
||||
},
|
||||
onDrop: (e) => {
|
||||
const fromIndex = workflowStore.openWorkflows.findIndex(
|
||||
(wf) => wf.key === e.source.data.workflowKey
|
||||
)
|
||||
const toIndex = workflowStore.openWorkflows.findIndex(
|
||||
(wf) => wf.key === e.location.current.dropTargets[0]?.data.workflowKey
|
||||
)
|
||||
if (fromIndex !== toIndex) {
|
||||
workflowStore.reorderWorkflows(fromIndex, toIndex)
|
||||
}
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.status-indicator {
|
||||
@apply absolute font-bold;
|
||||
font-size: 1.5rem;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
}
|
||||
</style>
|
||||
@@ -9,36 +9,11 @@
|
||||
dataKey="value"
|
||||
>
|
||||
<template #option="{ option }">
|
||||
<div
|
||||
class="flex p-2 gap-2"
|
||||
<WorkflowTab
|
||||
@contextmenu="showContextMenu($event, option)"
|
||||
@click.middle="onCloseWorkflow(option)"
|
||||
>
|
||||
<span
|
||||
class="workflow-label text-sm max-w-[150px] truncate inline-block"
|
||||
v-tooltip.bottom="option.workflow.key"
|
||||
>
|
||||
{{ option.workflow.filename }}
|
||||
</span>
|
||||
<div class="relative">
|
||||
<span
|
||||
class="status-indicator"
|
||||
v-if="
|
||||
!workspaceStore.shiftDown &&
|
||||
(option.workflow.isModified || !option.workflow.isPersisted)
|
||||
"
|
||||
>•</span
|
||||
>
|
||||
<Button
|
||||
class="close-button p-0 w-auto"
|
||||
icon="pi pi-times"
|
||||
text
|
||||
severity="secondary"
|
||||
size="small"
|
||||
@click.stop="onCloseWorkflow(option)"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
:workflow-option="option"
|
||||
/>
|
||||
</template>
|
||||
</SelectButton>
|
||||
<Button
|
||||
@@ -52,6 +27,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import WorkflowTab from '@/components/topbar/WorkflowTab.vue'
|
||||
import { ComfyWorkflow } from '@/stores/workflowStore'
|
||||
import { useWorkflowStore } from '@/stores/workflowStore'
|
||||
import { useCommandStore } from '@/stores/commandStore'
|
||||
@@ -78,11 +54,6 @@ const workflowStore = useWorkflowStore()
|
||||
const rightClickedTab = ref<WorkflowOption>(null)
|
||||
const menu = ref()
|
||||
|
||||
const showContextMenu = (event, option) => {
|
||||
rightClickedTab.value = option
|
||||
menu.value.show(event)
|
||||
}
|
||||
|
||||
const workflowToOption = (workflow: ComfyWorkflow): WorkflowOption => ({
|
||||
value: workflow.path,
|
||||
workflow
|
||||
@@ -126,6 +97,10 @@ const onCloseWorkflow = (option: WorkflowOption) => {
|
||||
closeWorkflows([option])
|
||||
}
|
||||
|
||||
const showContextMenu = (event, option) => {
|
||||
rightClickedTab.value = option
|
||||
menu.value.show(event)
|
||||
}
|
||||
const contextMenuItems = computed(() => {
|
||||
const tab = rightClickedTab.value as WorkflowOption
|
||||
if (!tab) return []
|
||||
@@ -166,7 +141,6 @@ const contextMenuItems = computed(() => {
|
||||
}
|
||||
]
|
||||
})
|
||||
|
||||
const commandStore = useCommandStore()
|
||||
</script>
|
||||
|
||||
@@ -189,14 +163,6 @@ const commandStore = useCommandStore()
|
||||
@apply visible;
|
||||
}
|
||||
|
||||
.status-indicator {
|
||||
@apply absolute font-bold;
|
||||
font-size: 1.5rem;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
}
|
||||
|
||||
:deep(.p-togglebutton:hover) .status-indicator {
|
||||
@apply hidden;
|
||||
}
|
||||
|
||||
16
src/constants/coreColorPalettes.ts
Normal file
16
src/constants/coreColorPalettes.ts
Normal file
@@ -0,0 +1,16 @@
|
||||
import dark from '@/assets/palettes/dark.json'
|
||||
import light from '@/assets/palettes/light.json'
|
||||
import solarized from '@/assets/palettes/solarized.json'
|
||||
import arc from '@/assets/palettes/arc.json'
|
||||
import nord from '@/assets/palettes/nord.json'
|
||||
import github from '@/assets/palettes/github.json'
|
||||
import type { ColorPalettes } from '@/types/colorPaletteTypes'
|
||||
|
||||
export const CORE_COLOR_PALETTES: ColorPalettes = {
|
||||
dark,
|
||||
light,
|
||||
solarized,
|
||||
arc,
|
||||
nord,
|
||||
github
|
||||
} as const
|
||||
@@ -21,5 +21,6 @@ export const CORE_MENU_COMMANDS = [
|
||||
'Comfy.Help.OpenComfyUIDocs',
|
||||
'Comfy.Help.OpenComfyOrgDiscord'
|
||||
]
|
||||
]
|
||||
],
|
||||
[['Help'], ['Comfy.Help.AboutComfyUI']]
|
||||
]
|
||||
|
||||
@@ -436,14 +436,6 @@ export const CORE_SETTINGS: SettingParams[] = [
|
||||
defaultValue: [] as string[],
|
||||
versionAdded: '1.3.11'
|
||||
},
|
||||
{
|
||||
id: 'Comfy.Settings.ExtensionPanel',
|
||||
name: 'Show extension panel in settings dialog',
|
||||
type: 'boolean',
|
||||
defaultValue: false,
|
||||
experimental: true,
|
||||
versionAdded: '1.3.11'
|
||||
},
|
||||
{
|
||||
id: 'Comfy.Validation.NodeDefs',
|
||||
name: 'Validate node definitions (slow)',
|
||||
|
||||
@@ -2,455 +2,12 @@
|
||||
import { useToastStore } from '@/stores/toastStore'
|
||||
import { app } from '../../scripts/app'
|
||||
import { $el } from '../../scripts/ui'
|
||||
import type { ColorPalettes, Palette } from '@/types/colorPalette'
|
||||
import type { ColorPalettes, Palette } from '@/types/colorPaletteTypes'
|
||||
import { LGraphCanvas, LiteGraph } from '@comfyorg/litegraph'
|
||||
|
||||
import { CORE_COLOR_PALETTES } from '@/constants/coreColorPalettes'
|
||||
// Manage color palettes
|
||||
|
||||
const colorPalettes: ColorPalettes = {
|
||||
dark: {
|
||||
id: 'dark',
|
||||
name: 'Dark (Default)',
|
||||
colors: {
|
||||
node_slot: {
|
||||
CLIP: '#FFD500', // bright yellow
|
||||
CLIP_VISION: '#A8DADC', // light blue-gray
|
||||
CLIP_VISION_OUTPUT: '#ad7452', // rusty brown-orange
|
||||
CONDITIONING: '#FFA931', // vibrant orange-yellow
|
||||
CONTROL_NET: '#6EE7B7', // soft mint green
|
||||
IMAGE: '#64B5F6', // bright sky blue
|
||||
LATENT: '#FF9CF9', // light pink-purple
|
||||
MASK: '#81C784', // muted green
|
||||
MODEL: '#B39DDB', // light lavender-purple
|
||||
STYLE_MODEL: '#C2FFAE', // light green-yellow
|
||||
VAE: '#FF6E6E', // bright red
|
||||
NOISE: '#B0B0B0', // gray
|
||||
GUIDER: '#66FFFF', // cyan
|
||||
SAMPLER: '#ECB4B4', // very soft red
|
||||
SIGMAS: '#CDFFCD', // soft lime green
|
||||
TAESD: '#DCC274' // cheesecake
|
||||
},
|
||||
litegraph_base: {
|
||||
BACKGROUND_IMAGE:
|
||||
'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAIAAAD/gAIDAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQBJREFUeNrs1rEKwjAUhlETUkj3vP9rdmr1Ysammk2w5wdxuLgcMHyptfawuZX4pJSWZTnfnu/lnIe/jNNxHHGNn//HNbbv+4dr6V+11uF527arU7+u63qfa/bnmh8sWLBgwYJlqRf8MEptXPBXJXa37BSl3ixYsGDBMliwFLyCV/DeLIMFCxYsWLBMwSt4Be/NggXLYMGCBUvBK3iNruC9WbBgwYJlsGApeAWv4L1ZBgsWLFiwYJmCV/AK3psFC5bBggULloJX8BpdwXuzYMGCBctgwVLwCl7Be7MMFixYsGDBsu8FH1FaSmExVfAxBa/gvVmwYMGCZbBg/W4vAQYA5tRF9QYlv/QAAAAASUVORK5CYII=',
|
||||
CLEAR_BACKGROUND_COLOR: '#222',
|
||||
NODE_TITLE_COLOR: '#999',
|
||||
NODE_SELECTED_TITLE_COLOR: '#FFF',
|
||||
NODE_TEXT_SIZE: 14,
|
||||
NODE_TEXT_COLOR: '#AAA',
|
||||
NODE_SUBTEXT_SIZE: 12,
|
||||
NODE_DEFAULT_COLOR: '#333',
|
||||
NODE_DEFAULT_BGCOLOR: '#353535',
|
||||
NODE_DEFAULT_BOXCOLOR: '#666',
|
||||
NODE_DEFAULT_SHAPE: 'box',
|
||||
NODE_BOX_OUTLINE_COLOR: '#FFF',
|
||||
NODE_BYPASS_BGCOLOR: '#FF00FF',
|
||||
NODE_ERROR_COLOUR: '#E00',
|
||||
DEFAULT_SHADOW_COLOR: 'rgba(0,0,0,0.5)',
|
||||
DEFAULT_GROUP_FONT: 24,
|
||||
|
||||
WIDGET_BGCOLOR: '#222',
|
||||
WIDGET_OUTLINE_COLOR: '#666',
|
||||
WIDGET_TEXT_COLOR: '#DDD',
|
||||
WIDGET_SECONDARY_TEXT_COLOR: '#999',
|
||||
|
||||
LINK_COLOR: '#9A9',
|
||||
EVENT_LINK_COLOR: '#A86',
|
||||
CONNECTING_LINK_COLOR: '#AFA',
|
||||
|
||||
BADGE_FG_COLOR: '#FFF',
|
||||
BADGE_BG_COLOR: '#0F1F0F'
|
||||
},
|
||||
comfy_base: {
|
||||
'fg-color': '#fff',
|
||||
'bg-color': '#202020',
|
||||
'comfy-menu-bg': '#353535',
|
||||
'comfy-menu-secondary-bg': '#303030',
|
||||
'comfy-input-bg': '#222',
|
||||
'input-text': '#ddd',
|
||||
'descrip-text': '#999',
|
||||
'drag-text': '#ccc',
|
||||
'error-text': '#ff4444',
|
||||
'border-color': '#4e4e4e',
|
||||
'tr-even-bg-color': '#222',
|
||||
'tr-odd-bg-color': '#353535',
|
||||
'content-bg': '#4e4e4e',
|
||||
'content-fg': '#fff',
|
||||
'content-hover-bg': '#222',
|
||||
'content-hover-fg': '#fff',
|
||||
'bar-shadow': 'rgba(16, 16, 16, 0.5) 0 0 0.5rem'
|
||||
}
|
||||
}
|
||||
},
|
||||
light: {
|
||||
id: 'light',
|
||||
name: 'Light',
|
||||
colors: {
|
||||
node_slot: {
|
||||
CLIP: '#FFA726', // orange
|
||||
CLIP_VISION: '#5C6BC0', // indigo
|
||||
CLIP_VISION_OUTPUT: '#8D6E63', // brown
|
||||
CONDITIONING: '#EF5350', // red
|
||||
CONTROL_NET: '#66BB6A', // green
|
||||
IMAGE: '#42A5F5', // blue
|
||||
LATENT: '#AB47BC', // purple
|
||||
MASK: '#9CCC65', // light green
|
||||
MODEL: '#7E57C2', // deep purple
|
||||
STYLE_MODEL: '#D4E157', // lime
|
||||
VAE: '#FF7043' // deep orange
|
||||
},
|
||||
litegraph_base: {
|
||||
BACKGROUND_IMAGE:
|
||||
'data:image/gif;base64,R0lGODlhZABkALMAAAAAAP///+vr6+rq6ujo6Ofn5+bm5uXl5d3d3f///wAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAkALAAAAABkAGQAAAT/UMhJq7046827HkcoHkYxjgZhnGG6si5LqnIM0/fL4qwwIMAg0CAsEovBIxKhRDaNy2GUOX0KfVFrssrNdpdaqTeKBX+dZ+jYvEaTf+y4W66mC8PUdrE879f9d2mBeoNLfH+IhYBbhIx2jkiHiomQlGKPl4uZe3CaeZifnnijgkESBqipqqusra6vsLGys62SlZO4t7qbuby7CLa+wqGWxL3Gv3jByMOkjc2lw8vOoNSi0czAncXW3Njdx9Pf48/Z4Kbbx+fQ5evZ4u3k1fKR6cn03vHlp7T9/v8A/8Gbp4+gwXoFryXMB2qgwoMMHyKEqA5fxX322FG8tzBcRnMW/zlulPbRncmQGidKjMjyYsOSKEF2FBlJQMCbOHP6c9iSZs+UnGYCdbnSo1CZI5F64kn0p1KnTH02nSoV3dGTV7FFHVqVq1dtWcMmVQZTbNGu72zqXMuW7danVL+6e4t1bEy6MeueBYLXrNO5Ze36jQtWsOG97wIj1vt3St/DjTEORss4nNq2mDP3e7w4r1bFkSET5hy6s2TRlD2/mSxXtSHQhCunXo26NevCpmvD/UU6tuullzULH76q92zdZG/Ltv1a+W+osI/nRmyc+fRi1Xdbh+68+0vv10dH3+77KD/i6IdnX669/frn5Zsjh4/2PXju8+8bzc9/6fj27LFnX11/+IUnXWl7BJfegm79FyB9JOl3oHgSklefgxAC+FmFGpqHIYcCfkhgfCohSKKJVo044YUMttggiBkmp6KFXw1oII24oYhjiDByaKOOHcp3Y5BD/njikSkO+eBREQAAOw==',
|
||||
CLEAR_BACKGROUND_COLOR: 'lightgray',
|
||||
NODE_TITLE_COLOR: '#222',
|
||||
NODE_SELECTED_TITLE_COLOR: '#000',
|
||||
NODE_TEXT_SIZE: 14,
|
||||
NODE_TEXT_COLOR: '#444',
|
||||
NODE_SUBTEXT_SIZE: 12,
|
||||
NODE_DEFAULT_COLOR: '#F7F7F7',
|
||||
NODE_DEFAULT_BGCOLOR: '#F5F5F5',
|
||||
NODE_DEFAULT_BOXCOLOR: '#CCC',
|
||||
NODE_DEFAULT_SHAPE: 'box',
|
||||
NODE_BOX_OUTLINE_COLOR: '#000',
|
||||
NODE_BYPASS_BGCOLOR: '#FF00FF',
|
||||
NODE_ERROR_COLOUR: '#E00',
|
||||
DEFAULT_SHADOW_COLOR: 'rgba(0,0,0,0.1)',
|
||||
DEFAULT_GROUP_FONT: 24,
|
||||
|
||||
WIDGET_BGCOLOR: '#D4D4D4',
|
||||
WIDGET_OUTLINE_COLOR: '#999',
|
||||
WIDGET_TEXT_COLOR: '#222',
|
||||
WIDGET_SECONDARY_TEXT_COLOR: '#555',
|
||||
|
||||
LINK_COLOR: '#4CAF50',
|
||||
EVENT_LINK_COLOR: '#FF9800',
|
||||
CONNECTING_LINK_COLOR: '#2196F3',
|
||||
|
||||
BADGE_FG_COLOR: '#000',
|
||||
BADGE_BG_COLOR: '#FFF'
|
||||
},
|
||||
comfy_base: {
|
||||
'fg-color': '#222',
|
||||
'bg-color': '#DDD',
|
||||
'comfy-menu-bg': '#F5F5F5',
|
||||
'comfy-menu-secondary-bg': '#EEE',
|
||||
'comfy-input-bg': '#C9C9C9',
|
||||
'input-text': '#222',
|
||||
'descrip-text': '#444',
|
||||
'drag-text': '#555',
|
||||
'error-text': '#F44336',
|
||||
'border-color': '#888',
|
||||
'tr-even-bg-color': '#f9f9f9',
|
||||
'tr-odd-bg-color': '#fff',
|
||||
'content-bg': '#e0e0e0',
|
||||
'content-fg': '#222',
|
||||
'content-hover-bg': '#adadad',
|
||||
'content-hover-fg': '#222',
|
||||
'bar-shadow': 'rgba(16, 16, 16, 0.25) 0 0 0.5rem'
|
||||
}
|
||||
}
|
||||
},
|
||||
solarized: {
|
||||
id: 'solarized',
|
||||
name: 'Solarized',
|
||||
colors: {
|
||||
node_slot: {
|
||||
CLIP: '#2AB7CA', // light blue
|
||||
CLIP_VISION: '#6c71c4', // blue violet
|
||||
CLIP_VISION_OUTPUT: '#859900', // olive green
|
||||
CONDITIONING: '#d33682', // magenta
|
||||
CONTROL_NET: '#d1ffd7', // light mint green
|
||||
IMAGE: '#5940bb', // deep blue violet
|
||||
LATENT: '#268bd2', // blue
|
||||
MASK: '#CCC9E7', // light purple-gray
|
||||
MODEL: '#dc322f', // red
|
||||
STYLE_MODEL: '#1a998a', // teal
|
||||
UPSCALE_MODEL: '#054A29', // dark green
|
||||
VAE: '#facfad' // light pink-orange
|
||||
},
|
||||
litegraph_base: {
|
||||
NODE_TITLE_COLOR: '#fdf6e3', // Base3
|
||||
NODE_SELECTED_TITLE_COLOR: '#A9D400',
|
||||
NODE_TEXT_SIZE: 14,
|
||||
NODE_TEXT_COLOR: '#657b83', // Base00
|
||||
NODE_SUBTEXT_SIZE: 12,
|
||||
NODE_DEFAULT_COLOR: '#094656',
|
||||
NODE_DEFAULT_BGCOLOR: '#073642', // Base02
|
||||
NODE_DEFAULT_BOXCOLOR: '#839496', // Base0
|
||||
NODE_DEFAULT_SHAPE: 'box',
|
||||
NODE_BOX_OUTLINE_COLOR: '#fdf6e3', // Base3
|
||||
NODE_BYPASS_BGCOLOR: '#FF00FF',
|
||||
NODE_ERROR_COLOUR: '#E00',
|
||||
DEFAULT_SHADOW_COLOR: 'rgba(0,0,0,0.5)',
|
||||
DEFAULT_GROUP_FONT: 24,
|
||||
|
||||
WIDGET_BGCOLOR: '#002b36', // Base03
|
||||
WIDGET_OUTLINE_COLOR: '#839496', // Base0
|
||||
WIDGET_TEXT_COLOR: '#fdf6e3', // Base3
|
||||
WIDGET_SECONDARY_TEXT_COLOR: '#93a1a1', // Base1
|
||||
|
||||
LINK_COLOR: '#2aa198', // Solarized Cyan
|
||||
EVENT_LINK_COLOR: '#268bd2', // Solarized Blue
|
||||
CONNECTING_LINK_COLOR: '#859900' // Solarized Green
|
||||
},
|
||||
comfy_base: {
|
||||
'fg-color': '#fdf6e3', // Base3
|
||||
'bg-color': '#002b36', // Base03
|
||||
'comfy-menu-bg': '#073642', // Base02
|
||||
'comfy-menu-secondary-bg': '#06323D',
|
||||
'comfy-input-bg': '#002b36', // Base03
|
||||
'input-text': '#93a1a1', // Base1
|
||||
'descrip-text': '#586e75', // Base01
|
||||
'drag-text': '#839496', // Base0
|
||||
'error-text': '#dc322f', // Solarized Red
|
||||
'border-color': '#657b83', // Base00
|
||||
'tr-even-bg-color': '#002b36',
|
||||
'tr-odd-bg-color': '#073642',
|
||||
'content-bg': '#657b83',
|
||||
'content-fg': '#fdf6e3',
|
||||
'content-hover-bg': '#002b36',
|
||||
'content-hover-fg': '#fdf6e3',
|
||||
'bar-shadow': 'rgba(16, 16, 16, 0.5) 0 0 0.5rem'
|
||||
}
|
||||
}
|
||||
},
|
||||
arc: {
|
||||
id: 'arc',
|
||||
name: 'Arc',
|
||||
colors: {
|
||||
node_slot: {
|
||||
BOOLEAN: '',
|
||||
CLIP: '#eacb8b',
|
||||
CLIP_VISION: '#A8DADC',
|
||||
CLIP_VISION_OUTPUT: '#ad7452',
|
||||
CONDITIONING: '#cf876f',
|
||||
CONTROL_NET: '#00d78d',
|
||||
CONTROL_NET_WEIGHTS: '',
|
||||
FLOAT: '',
|
||||
GLIGEN: '',
|
||||
IMAGE: '#80a1c0',
|
||||
IMAGEUPLOAD: '',
|
||||
INT: '',
|
||||
LATENT: '#b38ead',
|
||||
LATENT_KEYFRAME: '',
|
||||
MASK: '#a3bd8d',
|
||||
MODEL: '#8978a7',
|
||||
SAMPLER: '',
|
||||
SIGMAS: '',
|
||||
STRING: '',
|
||||
STYLE_MODEL: '#C2FFAE',
|
||||
T2I_ADAPTER_WEIGHTS: '',
|
||||
TAESD: '#DCC274',
|
||||
TIMESTEP_KEYFRAME: '',
|
||||
UPSCALE_MODEL: '',
|
||||
VAE: '#be616b'
|
||||
},
|
||||
litegraph_base: {
|
||||
BACKGROUND_IMAGE:
|
||||
'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABcklEQVR4nO3YMUoDARgF4RfxBqZI6/0vZqFn0MYtrLIQMFN8U6V4LAtD+Jm9XG/v30OGl2e/AP7yevz4+vx45nvgF/+QGITEICQGITEIiUFIjNNC3q43u3/YnRJyPOzeQ+0e220nhRzReC8e7R7bbdvl+Jal1Bs46jEIiUFIDEJiEBKDkBhKPbZT6qHdptRTu02p53DUYxASg5AYhMQgJAYhMZR6bKfUQ7tNqad2m1LP4ajHICQGITEIiUFIDEJiKPXYTqmHdptST+02pZ7DUY9BSAxCYhASg5AYhMRQ6rGdUg/tNqWe2m1KPYejHoOQGITEICQGITEIiaHUYzulHtptSj2125R6Dkc9BiExCIlBSAxCYhASQ6nHdko9tNuUemq3KfUcjnoMQmIQEoOQGITEICSGUo/tlHpotyn11G5T6jkc9RiExCAkBiExCIlBSAylHtsp9dBuU+qp3abUczjqMQiJQUgMQmIQEoOQGITE+AHFISNQrFTGuwAAAABJRU5ErkJggg==',
|
||||
CLEAR_BACKGROUND_COLOR: '#2b2f38',
|
||||
NODE_TITLE_COLOR: '#b2b7bd',
|
||||
NODE_SELECTED_TITLE_COLOR: '#FFF',
|
||||
NODE_TEXT_SIZE: 14,
|
||||
NODE_TEXT_COLOR: '#AAA',
|
||||
NODE_SUBTEXT_SIZE: 12,
|
||||
NODE_DEFAULT_COLOR: '#2b2f38',
|
||||
NODE_DEFAULT_BGCOLOR: '#242730',
|
||||
NODE_DEFAULT_BOXCOLOR: '#6e7581',
|
||||
NODE_DEFAULT_SHAPE: 'box',
|
||||
NODE_BOX_OUTLINE_COLOR: '#FFF',
|
||||
NODE_BYPASS_BGCOLOR: '#FF00FF',
|
||||
NODE_ERROR_COLOUR: '#E00',
|
||||
DEFAULT_SHADOW_COLOR: 'rgba(0,0,0,0.5)',
|
||||
DEFAULT_GROUP_FONT: 22,
|
||||
WIDGET_BGCOLOR: '#2b2f38',
|
||||
WIDGET_OUTLINE_COLOR: '#6e7581',
|
||||
WIDGET_TEXT_COLOR: '#DDD',
|
||||
WIDGET_SECONDARY_TEXT_COLOR: '#b2b7bd',
|
||||
LINK_COLOR: '#9A9',
|
||||
EVENT_LINK_COLOR: '#A86',
|
||||
CONNECTING_LINK_COLOR: '#AFA'
|
||||
},
|
||||
comfy_base: {
|
||||
'fg-color': '#fff',
|
||||
'bg-color': '#2b2f38',
|
||||
'comfy-menu-bg': '#242730',
|
||||
'comfy-menu-secondary-bg': '#22252E',
|
||||
'comfy-input-bg': '#2b2f38',
|
||||
'input-text': '#ddd',
|
||||
'descrip-text': '#b2b7bd',
|
||||
'drag-text': '#ccc',
|
||||
'error-text': '#ff4444',
|
||||
'border-color': '#6e7581',
|
||||
'tr-even-bg-color': '#2b2f38',
|
||||
'tr-odd-bg-color': '#242730',
|
||||
'content-bg': '#6e7581',
|
||||
'content-fg': '#fff',
|
||||
'content-hover-bg': '#2b2f38',
|
||||
'content-hover-fg': '#fff',
|
||||
'bar-shadow': 'rgba(8, 8, 8, 0.75) 0 0 0.5rem'
|
||||
}
|
||||
}
|
||||
},
|
||||
nord: {
|
||||
id: 'nord',
|
||||
name: 'Nord',
|
||||
colors: {
|
||||
node_slot: {
|
||||
BOOLEAN: '',
|
||||
CLIP: '#eacb8b',
|
||||
CLIP_VISION: '#A8DADC',
|
||||
CLIP_VISION_OUTPUT: '#ad7452',
|
||||
CONDITIONING: '#cf876f',
|
||||
CONTROL_NET: '#00d78d',
|
||||
CONTROL_NET_WEIGHTS: '',
|
||||
FLOAT: '',
|
||||
GLIGEN: '',
|
||||
IMAGE: '#80a1c0',
|
||||
IMAGEUPLOAD: '',
|
||||
INT: '',
|
||||
LATENT: '#b38ead',
|
||||
LATENT_KEYFRAME: '',
|
||||
MASK: '#a3bd8d',
|
||||
MODEL: '#8978a7',
|
||||
SAMPLER: '',
|
||||
SIGMAS: '',
|
||||
STRING: '',
|
||||
STYLE_MODEL: '#C2FFAE',
|
||||
T2I_ADAPTER_WEIGHTS: '',
|
||||
TAESD: '#DCC274',
|
||||
TIMESTEP_KEYFRAME: '',
|
||||
UPSCALE_MODEL: '',
|
||||
VAE: '#be616b'
|
||||
},
|
||||
litegraph_base: {
|
||||
BACKGROUND_IMAGE:
|
||||
'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAIAAAD/gAIDAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFu2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDEgNzkuMTQ2Mjg5OSwgMjAyMy8wNi8yNS0yMDowMTo1NSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI1LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMS0xM1QwMDoxODowMiswMTowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTEtMTVUMDE6MjA6NDUrMDE6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTEtMTVUMDE6MjA6NDUrMDE6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjUwNDFhMmZjLTEzNzQtMTk0ZC1hZWY4LTYxMzM1MTVmNjUwMCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoyMzFiMTBiMC1iNGZiLTAyNGUtYjEyZS0zMDUzMDNjZDA3YzgiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoyMzFiMTBiMC1iNGZiLTAyNGUtYjEyZS0zMDUzMDNjZDA3YzgiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjIzMWIxMGIwLWI0ZmItMDI0ZS1iMTJlLTMwNTMwM2NkMDdjOCIgc3RFdnQ6d2hlbj0iMjAyMy0xMS0xM1QwMDoxODowMiswMTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI1LjEgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo1MDQxYTJmYy0xMzc0LTE5NGQtYWVmOC02MTMzNTE1ZjY1MDAiIHN0RXZ0OndoZW49IjIwMjMtMTEtMTVUMDE6MjA6NDUrMDE6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyNS4xIChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz73jWg/AAAAyUlEQVR42u3WKwoAIBRFQRdiMb1idv9Lsxn9gEFw4Dbb8JCTojbbXEJwjJVL2HKwYMGCBQuWLbDmjr+9zrBGjHl1WVcvy2DBggULFizTWQpewSt4HzwsgwULFiwFr7MUvMtS8D54WLBgGSxYCl7BK3iXZbBgwYIFC5bpLAWv4BW8Dx6WwYIFC5aC11kK3mUpeB88LFiwDBYsBa/gFbzLMliwYMGCBct0loJX8AreBw/LYMGCBUvB6ywF77IUvA8eFixYBgsWrNfWAZPltufdad+1AAAAAElFTkSuQmCC',
|
||||
CLEAR_BACKGROUND_COLOR: '#212732',
|
||||
NODE_TITLE_COLOR: '#999',
|
||||
NODE_SELECTED_TITLE_COLOR: '#e5eaf0',
|
||||
NODE_TEXT_SIZE: 14,
|
||||
NODE_TEXT_COLOR: '#bcc2c8',
|
||||
NODE_SUBTEXT_SIZE: 12,
|
||||
NODE_DEFAULT_COLOR: '#2e3440',
|
||||
NODE_DEFAULT_BGCOLOR: '#161b22',
|
||||
NODE_DEFAULT_BOXCOLOR: '#545d70',
|
||||
NODE_DEFAULT_SHAPE: 'box',
|
||||
NODE_BOX_OUTLINE_COLOR: '#e5eaf0',
|
||||
NODE_BYPASS_BGCOLOR: '#FF00FF',
|
||||
NODE_ERROR_COLOUR: '#E00',
|
||||
DEFAULT_SHADOW_COLOR: 'rgba(0,0,0,0.5)',
|
||||
DEFAULT_GROUP_FONT: 24,
|
||||
WIDGET_BGCOLOR: '#2e3440',
|
||||
WIDGET_OUTLINE_COLOR: '#545d70',
|
||||
WIDGET_TEXT_COLOR: '#bcc2c8',
|
||||
WIDGET_SECONDARY_TEXT_COLOR: '#999',
|
||||
LINK_COLOR: '#9A9',
|
||||
EVENT_LINK_COLOR: '#A86',
|
||||
CONNECTING_LINK_COLOR: '#AFA'
|
||||
},
|
||||
comfy_base: {
|
||||
'fg-color': '#e5eaf0',
|
||||
'bg-color': '#2e3440',
|
||||
'comfy-menu-bg': '#161b22',
|
||||
'comfy-menu-secondary-bg': '#14181F',
|
||||
'comfy-input-bg': '#2e3440',
|
||||
'input-text': '#bcc2c8',
|
||||
'descrip-text': '#999',
|
||||
'drag-text': '#ccc',
|
||||
'error-text': '#ff4444',
|
||||
'border-color': '#545d70',
|
||||
'tr-even-bg-color': '#2e3440',
|
||||
'tr-odd-bg-color': '#161b22',
|
||||
'content-bg': '#545d70',
|
||||
'content-fg': '#e5eaf0',
|
||||
'content-hover-bg': '#2e3440',
|
||||
'content-hover-fg': '#e5eaf0',
|
||||
'bar-shadow': 'rgba(0, 0, 0, 0.75) 0 0 0.5rem'
|
||||
}
|
||||
}
|
||||
},
|
||||
github: {
|
||||
id: 'github',
|
||||
name: 'Github',
|
||||
colors: {
|
||||
node_slot: {
|
||||
BOOLEAN: '',
|
||||
CLIP: '#eacb8b',
|
||||
CLIP_VISION: '#A8DADC',
|
||||
CLIP_VISION_OUTPUT: '#ad7452',
|
||||
CONDITIONING: '#cf876f',
|
||||
CONTROL_NET: '#00d78d',
|
||||
CONTROL_NET_WEIGHTS: '',
|
||||
FLOAT: '',
|
||||
GLIGEN: '',
|
||||
IMAGE: '#80a1c0',
|
||||
IMAGEUPLOAD: '',
|
||||
INT: '',
|
||||
LATENT: '#b38ead',
|
||||
LATENT_KEYFRAME: '',
|
||||
MASK: '#a3bd8d',
|
||||
MODEL: '#8978a7',
|
||||
SAMPLER: '',
|
||||
SIGMAS: '',
|
||||
STRING: '',
|
||||
STYLE_MODEL: '#C2FFAE',
|
||||
T2I_ADAPTER_WEIGHTS: '',
|
||||
TAESD: '#DCC274',
|
||||
TIMESTEP_KEYFRAME: '',
|
||||
UPSCALE_MODEL: '',
|
||||
VAE: '#be616b'
|
||||
},
|
||||
litegraph_base: {
|
||||
BACKGROUND_IMAGE:
|
||||
'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAIAAAD/gAIDAAAACXBIWXMAAAsTAAALEwEAmpwYAAAGlmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDEgNzkuMTQ2Mjg5OSwgMjAyMy8wNi8yNS0yMDowMTo1NSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI1LjEgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMS0xM1QwMDoxODowMiswMTowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTEtMTVUMDI6MDQ6NTkrMDE6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTEtMTVUMDI6MDQ6NTkrMDE6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmIyYzRhNjA5LWJmYTctYTg0MC1iOGFlLTk3MzE2ZjM1ZGIyNyIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjk0ZmNlZGU4LTE1MTctZmQ0MC04ZGU3LWYzOTgxM2E3ODk5ZiIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjIzMWIxMGIwLWI0ZmItMDI0ZS1iMTJlLTMwNTMwM2NkMDdjOCI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MjMxYjEwYjAtYjRmYi0wMjRlLWIxMmUtMzA1MzAzY2QwN2M4IiBzdEV2dDp3aGVuPSIyMDIzLTExLTEzVDAwOjE4OjAyKzAxOjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjUuMSAoV2luZG93cykiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjQ4OWY1NzlmLTJkNjUtZWQ0Zi04OTg0LTA4NGE2MGE1ZTMzNSIgc3RFdnQ6d2hlbj0iMjAyMy0xMS0xNVQwMjowNDo1OSswMTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI1LjEgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpiMmM0YTYwOS1iZmE3LWE4NDAtYjhhZS05NzMxNmYzNWRiMjciIHN0RXZ0OndoZW49IjIwMjMtMTEtMTVUMDI6MDQ6NTkrMDE6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyNS4xIChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4OTe6GAAAAx0lEQVR42u3WMQoAIQxFwRzJys77X8vSLiRgITif7bYbgrwYc/mKXyBoY4VVBgsWLFiwYFmOlTv+9jfDOjHmr8u6eVkGCxYsWLBgmc5S8ApewXvgYRksWLBgKXidpeBdloL3wMOCBctgwVLwCl7BuyyDBQsWLFiwTGcpeAWv4D3wsAwWLFiwFLzOUvAuS8F74GHBgmWwYCl4Ba/gXZbBggULFixYprMUvIJX8B54WAYLFixYCl5nKXiXpeA98LBgwTJYsGC9tg1o8f4TTtqzNQAAAABJRU5ErkJggg==',
|
||||
CLEAR_BACKGROUND_COLOR: '#040506',
|
||||
NODE_TITLE_COLOR: '#999',
|
||||
NODE_SELECTED_TITLE_COLOR: '#e5eaf0',
|
||||
NODE_TEXT_SIZE: 14,
|
||||
NODE_TEXT_COLOR: '#bcc2c8',
|
||||
NODE_SUBTEXT_SIZE: 12,
|
||||
NODE_DEFAULT_COLOR: '#161b22',
|
||||
NODE_DEFAULT_BGCOLOR: '#13171d',
|
||||
NODE_DEFAULT_BOXCOLOR: '#30363d',
|
||||
NODE_DEFAULT_SHAPE: 'box',
|
||||
NODE_BOX_OUTLINE_COLOR: '#e5eaf0',
|
||||
NODE_BYPASS_BGCOLOR: '#FF00FF',
|
||||
NODE_ERROR_COLOUR: '#E00',
|
||||
DEFAULT_SHADOW_COLOR: 'rgba(0,0,0,0.5)',
|
||||
DEFAULT_GROUP_FONT: 24,
|
||||
WIDGET_BGCOLOR: '#161b22',
|
||||
WIDGET_OUTLINE_COLOR: '#30363d',
|
||||
WIDGET_TEXT_COLOR: '#bcc2c8',
|
||||
WIDGET_SECONDARY_TEXT_COLOR: '#999',
|
||||
LINK_COLOR: '#9A9',
|
||||
EVENT_LINK_COLOR: '#A86',
|
||||
CONNECTING_LINK_COLOR: '#AFA'
|
||||
},
|
||||
comfy_base: {
|
||||
'fg-color': '#e5eaf0',
|
||||
'bg-color': '#161b22',
|
||||
'comfy-menu-bg': '#13171d',
|
||||
'comfy-menu-secondary-bg': '#11141A',
|
||||
'comfy-input-bg': '#161b22',
|
||||
'input-text': '#bcc2c8',
|
||||
'descrip-text': '#999',
|
||||
'drag-text': '#ccc',
|
||||
'error-text': '#ff4444',
|
||||
'border-color': '#30363d',
|
||||
'tr-even-bg-color': '#161b22',
|
||||
'tr-odd-bg-color': '#13171d',
|
||||
'content-bg': '#30363d',
|
||||
'content-fg': '#e5eaf0',
|
||||
'content-hover-bg': '#161b22',
|
||||
'content-hover-fg': '#e5eaf0',
|
||||
'bar-shadow': 'rgba(0, 0, 0, 1) 0 0 0.5rem'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const colorPalettes = CORE_COLOR_PALETTES
|
||||
const id = 'Comfy.ColorPalette'
|
||||
const idCustomColorPalettes = 'Comfy.CustomColorPalettes'
|
||||
const defaultColorPaletteId = 'dark'
|
||||
@@ -705,7 +262,19 @@ app.registerExtension({
|
||||
colorPalette.colors.litegraph_base.hasOwnProperty(key) &&
|
||||
LiteGraph.hasOwnProperty(key)
|
||||
) {
|
||||
LiteGraph[key] = colorPalette.colors.litegraph_base[key]
|
||||
const value = colorPalette.colors.litegraph_base[key]
|
||||
if (key === 'NODE_DEFAULT_SHAPE' && typeof value === 'string') {
|
||||
console.warn(
|
||||
`litegraph_base.NODE_DEFAULT_SHAPE only accepts [${[
|
||||
LiteGraph.BOX_SHAPE,
|
||||
LiteGraph.ROUND_SHAPE,
|
||||
LiteGraph.CARD_SHAPE
|
||||
].join(', ')}] but got ${value}`
|
||||
)
|
||||
LiteGraph.NODE_DEFAULT_SHAPE = LiteGraph.ROUND_SHAPE
|
||||
} else {
|
||||
LiteGraph[key] = value
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1748,7 +1748,17 @@ app.registerExtension({
|
||||
node.onExecuted = function (message: any) {
|
||||
onExecuted?.apply(this, arguments)
|
||||
|
||||
modelWidget.value = message.model_file[0]
|
||||
let filePath = message.model_file[0]
|
||||
|
||||
if (!filePath) {
|
||||
const msg = 'unable to get model file path.'
|
||||
|
||||
console.error(msg)
|
||||
|
||||
useToastStore().addAlert(msg)
|
||||
}
|
||||
|
||||
modelWidget.value = filePath.replaceAll('\\', '/')
|
||||
|
||||
configureLoad3D(
|
||||
load3d,
|
||||
|
||||
@@ -35,6 +35,7 @@ app.registerExtension({
|
||||
}
|
||||
|
||||
this.onConnectionsChange = (type, index, connected, link_info) => {
|
||||
if (app.configuringGraph) return
|
||||
this.applyOrientation()
|
||||
|
||||
// Prevent multiple connections to different types when we have no input
|
||||
|
||||
@@ -3,8 +3,13 @@ import { ComfyWidgets, addValueControlWidgets } from '../../scripts/widgets'
|
||||
import { app } from '../../scripts/app'
|
||||
import { applyTextReplacements } from '../../scripts/utils'
|
||||
import { LiteGraph, LGraphNode } from '@comfyorg/litegraph'
|
||||
import type { INodeInputSlot, IWidget } from '@comfyorg/litegraph'
|
||||
import type {
|
||||
INodeInputSlot,
|
||||
IWidget,
|
||||
LiteGraphCanvasEvent
|
||||
} from '@comfyorg/litegraph'
|
||||
import type { InputSpec } from '@/types/apiTypes'
|
||||
import { useNodeDefStore } from '@/stores/nodeDefStore'
|
||||
|
||||
const CONVERTED_TYPE = 'converted-widget'
|
||||
const VALID_TYPES = [
|
||||
@@ -721,6 +726,40 @@ app.registerExtension({
|
||||
defaultValue: true
|
||||
})
|
||||
},
|
||||
setup() {
|
||||
app.canvas.getWidgetLinkType = function (widget, node) {
|
||||
const nodeDefStore = useNodeDefStore()
|
||||
const nodeDef = nodeDefStore.nodeDefsByName[node.type]
|
||||
const input = nodeDef.inputs.getInput(widget.name)
|
||||
return input?.type
|
||||
}
|
||||
|
||||
document.addEventListener(
|
||||
'litegraph:canvas',
|
||||
async (e: LiteGraphCanvasEvent) => {
|
||||
if (e.detail.subType === 'connectingWidgetLink') {
|
||||
const { node, link, widget } = e.detail
|
||||
if (!node || !link || !widget) return
|
||||
|
||||
const nodeData = node.constructor.nodeData
|
||||
if (!nodeData) return
|
||||
const all = {
|
||||
...nodeData?.input?.required,
|
||||
...nodeData?.input?.optional
|
||||
}
|
||||
const inputSpec = all[widget.name]
|
||||
if (!inputSpec) return
|
||||
|
||||
const input = convertToInput(node, widget, inputSpec)
|
||||
if (!input) return
|
||||
|
||||
const originNode = link.node
|
||||
|
||||
originNode.connect(link.slot, node, node.inputs.lastIndexOf(input))
|
||||
}
|
||||
}
|
||||
)
|
||||
},
|
||||
async beforeRegisterNodeDef(nodeType, nodeData, app) {
|
||||
// Add menu options to convert to/from widgets
|
||||
const origGetExtraMenuOptions = nodeType.prototype.getExtraMenuOptions
|
||||
|
||||
@@ -500,6 +500,16 @@ export function useCoreCommands(): ComfyCommand[] {
|
||||
function: () => {
|
||||
useSearchBoxStore().toggleVisible()
|
||||
}
|
||||
},
|
||||
{
|
||||
id: 'Comfy.Help.AboutComfyUI',
|
||||
icon: 'pi pi-info-circle',
|
||||
label: 'Open About ComfyUI',
|
||||
menubarLabel: 'About ComfyUI',
|
||||
versionAdded: '1.6.4',
|
||||
function: () => {
|
||||
showSettingsDialog('about')
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
24
src/i18n.ts
24
src/i18n.ts
@@ -14,21 +14,27 @@ import zhCommands from './locales/zh/commands.json'
|
||||
import ruCommands from './locales/ru/commands.json'
|
||||
import jaCommands from './locales/ja/commands.json'
|
||||
import koCommands from './locales/ko/commands.json'
|
||||
import enSettings from './locales/en/settings.json'
|
||||
import zhSettings from './locales/zh/settings.json'
|
||||
import ruSettings from './locales/ru/settings.json'
|
||||
import jaSettings from './locales/ja/settings.json'
|
||||
import koSettings from './locales/ko/settings.json'
|
||||
|
||||
function buildLocale<M, N, C>(main: M, nodes: N, commands: C) {
|
||||
function buildLocale<M, N, C, S>(main: M, nodes: N, commands: C, settings: S) {
|
||||
return {
|
||||
...main,
|
||||
nodeDefs: nodes,
|
||||
commands: commands
|
||||
commands: commands,
|
||||
settings: settings
|
||||
}
|
||||
}
|
||||
|
||||
const messages = {
|
||||
en: buildLocale(en, enNodes, enCommands),
|
||||
zh: buildLocale(zh, zhNodes, zhCommands),
|
||||
ru: buildLocale(ru, ruNodes, ruCommands),
|
||||
ja: buildLocale(ja, jaNodes, jaCommands),
|
||||
ko: buildLocale(ko, koNodes, koCommands)
|
||||
en: buildLocale(en, enNodes, enCommands, enSettings),
|
||||
zh: buildLocale(zh, zhNodes, zhCommands, zhSettings),
|
||||
ru: buildLocale(ru, ruNodes, ruCommands, ruSettings),
|
||||
ja: buildLocale(ja, jaNodes, jaCommands, jaSettings),
|
||||
ko: buildLocale(ko, koNodes, koCommands, koSettings)
|
||||
}
|
||||
|
||||
export const i18n = createI18n({
|
||||
@@ -39,8 +45,8 @@ export const i18n = createI18n({
|
||||
messages,
|
||||
// Ignore warnings for locale options as each option is in its own language.
|
||||
// e.g. "English", "中文", "Русский", "日本語", "한국어"
|
||||
missingWarn: /^(?!settingsDialog\.Comfy_Locale\.options\.).+/,
|
||||
fallbackWarn: /^(?!settingsDialog\.Comfy_Locale\.options\.).+/
|
||||
missingWarn: /^(?!settings\.Comfy_Locale\.options\.).+/,
|
||||
fallbackWarn: /^(?!settings\.Comfy_Locale\.options\.).+/
|
||||
})
|
||||
|
||||
/** Convenience shorthand: i18n.global */
|
||||
|
||||
@@ -95,6 +95,9 @@
|
||||
"Comfy_GroupNode_UngroupSelectedGroupNodes": {
|
||||
"label": "Ungroup selected group nodes"
|
||||
},
|
||||
"Comfy_Help_AboutComfyUI": {
|
||||
"label": "Open About ComfyUI"
|
||||
},
|
||||
"Comfy_Help_OpenComfyOrgDiscord": {
|
||||
"label": "Open Comfy-Org Discord"
|
||||
},
|
||||
|
||||
@@ -42,6 +42,9 @@
|
||||
"no": "No",
|
||||
"cancel": "Cancel",
|
||||
"close": "Close",
|
||||
"back": "Back",
|
||||
"next": "Next",
|
||||
"install": "Install",
|
||||
"overwrite": "Overwrite",
|
||||
"customize": "Customize",
|
||||
"experimental": "BETA",
|
||||
@@ -59,7 +62,12 @@
|
||||
"searchFailedMessage": "We couldn't find any settings matching your search. Try adjusting your search terms.",
|
||||
"noTasksFound": "No Tasks Found",
|
||||
"noTasksFoundMessage": "There are no tasks in the queue.",
|
||||
"newFolder": "New Folder"
|
||||
"newFolder": "New Folder",
|
||||
"enableAll": "Enable All",
|
||||
"disableAll": "Disable All",
|
||||
"command": "Command",
|
||||
"keybinding": "Keybinding",
|
||||
"upload": "Upload"
|
||||
},
|
||||
"color": {
|
||||
"default": "Default",
|
||||
@@ -120,6 +128,11 @@
|
||||
"systemLocations": "System Locations",
|
||||
"failedToSelectDirectory": "Failed to select directory",
|
||||
"pathValidationFailed": "Failed to validate path",
|
||||
"pathExists": "Directory already exists - please ensure you have backed up all data",
|
||||
"cannotWrite": "Unable to write to the selected path",
|
||||
"insufficientFreeSpace": "Insufficient space - minimum free space",
|
||||
"parentMissing": "Path does not exist - create the containing directory first",
|
||||
"unhandledError": "Unknown error",
|
||||
"installLocationDescription": "Select the directory for ComfyUI's user data. A python environment will be installed to the selected location. Please make sure the selected disk has enough space (~15GB) left.",
|
||||
"installLocationTooltip": "ComfyUI's user data directory. Stores:\n- Python Environment\n- Models\n- Custom nodes\n",
|
||||
"appDataLocationTooltip": "ComfyUI's app data directory. Stores:\n- Logs\n- Server configs",
|
||||
@@ -173,7 +186,7 @@
|
||||
}
|
||||
},
|
||||
"customNodes": "Custom Nodes",
|
||||
"customNodesDescription": "Reference custom node files from existing ComfyUI installations and install their dependencies."
|
||||
"customNodesDescription": "Reinstall custom nodes from existing ComfyUI installations."
|
||||
},
|
||||
"serverStart": {
|
||||
"reinstall": "Reinstall",
|
||||
@@ -193,353 +206,6 @@
|
||||
"revertChanges": "Revert Changes",
|
||||
"restart": "Restart"
|
||||
},
|
||||
"settingsDialog": {
|
||||
"Comfy-Desktop_AutoUpdate": {
|
||||
"name": "Automatically check for updates"
|
||||
},
|
||||
"Comfy-Desktop_SendStatistics": {
|
||||
"name": "Send anonymous crash reports"
|
||||
},
|
||||
"Comfy_ColorPalette": {
|
||||
"name": "Color Palette"
|
||||
},
|
||||
"Comfy_ConfirmClear": {
|
||||
"name": "Require confirmation when clearing workflow"
|
||||
},
|
||||
"Comfy_DevMode": {
|
||||
"name": "Enable dev mode options (API save, etc.)"
|
||||
},
|
||||
"Comfy_DisableFloatRounding": {
|
||||
"name": "Disable default float widget rounding.",
|
||||
"tooltip": "(requires page reload) Cannot disable round when round is set by the node in the backend."
|
||||
},
|
||||
"Comfy_DisableSliders": {
|
||||
"name": "Disable node widget sliders"
|
||||
},
|
||||
"Comfy_DOMClippingEnabled": {
|
||||
"name": "Enable DOM element clipping (enabling may reduce performance)"
|
||||
},
|
||||
"Comfy_EditAttention_Delta": {
|
||||
"name": "Ctrl+up/down precision"
|
||||
},
|
||||
"Comfy_EnableTooltips": {
|
||||
"name": "Enable Tooltips"
|
||||
},
|
||||
"Comfy_EnableWorkflowViewRestore": {
|
||||
"name": "Save and restore canvas position and zoom level in workflows"
|
||||
},
|
||||
"Comfy_Extension_Disabled": {
|
||||
"name": "Disabled extension names"
|
||||
},
|
||||
"Comfy_FloatRoundingPrecision": {
|
||||
"name": "Float widget rounding decimal places [0 = auto].",
|
||||
"tooltip": "(requires page reload)"
|
||||
},
|
||||
"Comfy_Graph_CanvasInfo": {
|
||||
"name": "Show canvas info on bottom left corner (fps, etc.)"
|
||||
},
|
||||
"Comfy_Graph_CanvasMenu": {
|
||||
"name": "Show graph canvas menu"
|
||||
},
|
||||
"Comfy_Graph_CtrlShiftZoom": {
|
||||
"name": "Enable fast-zoom shortcut (Ctrl + Shift + Drag)"
|
||||
},
|
||||
"Comfy_Graph_LinkMarkers": {
|
||||
"name": "Link midpoint markers",
|
||||
"options": {
|
||||
"None": "None",
|
||||
"Circle": "Circle",
|
||||
"Arrow": "Arrow"
|
||||
}
|
||||
},
|
||||
"Comfy_Graph_ZoomSpeed": {
|
||||
"name": "Canvas zoom speed"
|
||||
},
|
||||
"Comfy_Group_DoubleClickTitleToEdit": {
|
||||
"name": "Double click group title to edit"
|
||||
},
|
||||
"Comfy_GroupSelectedNodes_Padding": {
|
||||
"name": "Group selected nodes padding"
|
||||
},
|
||||
"Comfy_InvertMenuScrolling": {
|
||||
"name": "Invert Context Menu Scrolling"
|
||||
},
|
||||
"Comfy_Keybinding_NewBindings": {
|
||||
"name": "Keybindings set by the user"
|
||||
},
|
||||
"Comfy_Keybinding_UnsetBindings": {
|
||||
"name": "Keybindings unset by the user"
|
||||
},
|
||||
"Comfy_LinkRelease_Action": {
|
||||
"name": "Action on link release (No modifier)",
|
||||
"options": {
|
||||
"context menu": "context menu",
|
||||
"search box": "search box",
|
||||
"no action": "no action"
|
||||
}
|
||||
},
|
||||
"Comfy_LinkRelease_ActionShift": {
|
||||
"name": "Action on link release (Shift)",
|
||||
"options": {
|
||||
"context menu": "context menu",
|
||||
"search box": "search box",
|
||||
"no action": "no action"
|
||||
}
|
||||
},
|
||||
"Comfy_LinkRenderMode": {
|
||||
"name": "Link Render Mode",
|
||||
"options": {
|
||||
"Straight": "Straight",
|
||||
"Linear": "Linear",
|
||||
"Spline": "Spline",
|
||||
"Hidden": "Hidden"
|
||||
}
|
||||
},
|
||||
"Comfy_Locale": {
|
||||
"name": "Language"
|
||||
},
|
||||
"Comfy_MaskEditor_BrushAdjustmentSpeed": {
|
||||
"name": "Brush adjustment speed multiplier",
|
||||
"tooltip": "Controls how quickly the brush size and hardness change when adjusting. Higher values mean faster changes."
|
||||
},
|
||||
"Comfy_MaskEditor_UseDominantAxis": {
|
||||
"name": "Lock brush adjustment to dominant axis",
|
||||
"tooltip": "When enabled, brush adjustments will only affect size OR hardness based on which direction you move more"
|
||||
},
|
||||
"Comfy_MaskEditor_UseNewEditor": {
|
||||
"name": "Use new mask editor",
|
||||
"tooltip": "Switch to the new mask editor interface"
|
||||
},
|
||||
"Comfy_MenuPosition": {
|
||||
"name": "Save legacy menu's position"
|
||||
},
|
||||
"Comfy_ModelLibrary_AutoLoadAll": {
|
||||
"name": "Automatically load all model folders",
|
||||
"tooltip": "If true, all folders will load as soon as you open the model library (this may cause delays while it loads). If false, root level model folders will only load once you click on them."
|
||||
},
|
||||
"Comfy_ModelLibrary_NameFormat": {
|
||||
"name": "What name to display in the model library tree view",
|
||||
"tooltip": "Select \"filename\" to render a simplified view of the raw filename (without directory or \".safetensors\" extension) in the model list. Select \"title\" to display the configurable model metadata title.",
|
||||
"options": {
|
||||
"filename": "filename",
|
||||
"title": "title"
|
||||
}
|
||||
},
|
||||
"Comfy_Node_AutoSnapLinkToSlot": {
|
||||
"name": "Auto snap link to node slot",
|
||||
"tooltip": "When dragging a link over a node, the link automatically snap to a viable input slot on the node"
|
||||
},
|
||||
"Comfy_Node_BypassAllLinksOnDelete": {
|
||||
"name": "Keep all links when deleting nodes",
|
||||
"tooltip": "When deleting a node, attempt to reconnect all of its input and output links (bypassing the deleted node)"
|
||||
},
|
||||
"Comfy_Node_DoubleClickTitleToEdit": {
|
||||
"name": "Double click node title to edit"
|
||||
},
|
||||
"Comfy_Node_MiddleClickRerouteNode": {
|
||||
"name": "Middle-click creates a new Reroute node"
|
||||
},
|
||||
"Comfy_Node_Opacity": {
|
||||
"name": "Node opacity"
|
||||
},
|
||||
"Comfy_Node_ShowDeprecated": {
|
||||
"name": "Show deprecated nodes in search",
|
||||
"tooltip": "Deprecated nodes are hidden by default in the UI, but remain functional in existing workflows that use them."
|
||||
},
|
||||
"Comfy_Node_ShowExperimental": {
|
||||
"name": "Show experimental nodes in search",
|
||||
"tooltip": "Experimental nodes are marked as such in the UI and may be subject to significant changes or removal in future versions. Use with caution in production workflows"
|
||||
},
|
||||
"Comfy_Node_SnapHighlightsNode": {
|
||||
"name": "Snap highlights node",
|
||||
"tooltip": "When dragging a link over a node with viable input slot, highlight the node"
|
||||
},
|
||||
"Comfy_NodeBadge_NodeIdBadgeMode": {
|
||||
"name": "Node ID badge mode",
|
||||
"options": {
|
||||
"None": "None",
|
||||
"Show all": "Show all"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeBadge_NodeLifeCycleBadgeMode": {
|
||||
"name": "Node life cycle badge mode",
|
||||
"options": {
|
||||
"None": "None",
|
||||
"Show all": "Show all"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeBadge_NodeSourceBadgeMode": {
|
||||
"name": "Node source badge mode",
|
||||
"options": {
|
||||
"None": "None",
|
||||
"Show all": "Show all",
|
||||
"Hide built-in": "Hide built-in"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeInputConversionSubmenus": {
|
||||
"name": "In the node context menu, place the entries that convert between input/widget in sub-menus."
|
||||
},
|
||||
"Comfy_NodeLibrary_Bookmarks": {
|
||||
"name": "Node library bookmarks with display name (deprecated)"
|
||||
},
|
||||
"Comfy_NodeLibrary_Bookmarks_V2": {
|
||||
"name": "Node library bookmarks v2 with unique name"
|
||||
},
|
||||
"Comfy_NodeLibrary_BookmarksCustomization": {
|
||||
"name": "Node library bookmarks customization"
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl": {
|
||||
"name": "Node search box implementation",
|
||||
"options": {
|
||||
"default": "default",
|
||||
"litegraph (legacy)": "litegraph (legacy)"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_NodePreview": {
|
||||
"name": "Node preview",
|
||||
"tooltip": "Only applies to the default implementation"
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_ShowCategory": {
|
||||
"name": "Show node category in search results",
|
||||
"tooltip": "Only applies to the default implementation"
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_ShowIdName": {
|
||||
"name": "Show node id name in search results",
|
||||
"tooltip": "Only applies to the default implementation"
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_ShowNodeFrequency": {
|
||||
"name": "Show node frequency in search results",
|
||||
"tooltip": "Only applies to the default implementation"
|
||||
},
|
||||
"Comfy_NodeSuggestions_number": {
|
||||
"name": "Number of nodes suggestions",
|
||||
"tooltip": "Only for litegraph searchbox/context menu"
|
||||
},
|
||||
"Comfy_Pointer_ClickBufferTime": {
|
||||
"name": "Pointer click drift delay",
|
||||
"tooltip": "After pressing a pointer button down, this is the maximum time (in milliseconds) that pointer movement can be ignored for.\n\nHelps prevent objects from being unintentionally nudged if the pointer is moved whilst clicking."
|
||||
},
|
||||
"Comfy_Pointer_ClickDrift": {
|
||||
"name": "Pointer click drift (maximum distance)",
|
||||
"tooltip": "If the pointer moves more than this distance while holding a button down, it is considered dragging (rather than clicking).\n\nHelps prevent objects from being unintentionally nudged if the pointer is moved whilst clicking."
|
||||
},
|
||||
"Comfy_Pointer_DoubleClickTime": {
|
||||
"name": "Double click interval (maximum)",
|
||||
"tooltip": "The maximum time in milliseconds between the two clicks of a double-click. Increasing this value may assist if double-clicks are sometimes not registered."
|
||||
},
|
||||
"Comfy_PreviewFormat": {
|
||||
"name": "Preview image format",
|
||||
"tooltip": "When displaying a preview in the image widget, convert it to a lightweight image, e.g. webp, jpeg, webp;50, etc."
|
||||
},
|
||||
"Comfy_PromptFilename": {
|
||||
"name": "Prompt for filename when saving workflow"
|
||||
},
|
||||
"Comfy_Queue_ImageFit": {
|
||||
"name": "Queue image fit"
|
||||
},
|
||||
"Comfy_Queue_MaxHistoryItems": {
|
||||
"name": "Queue history size",
|
||||
"tooltip": "The maximum number of tasks that show in the queue history."
|
||||
},
|
||||
"Comfy_QueueButton_BatchCountLimit": {
|
||||
"name": "Batch count limit",
|
||||
"tooltip": "The maximum number of tasks added to the queue at one button click"
|
||||
},
|
||||
"Comfy_RerouteBeta": {
|
||||
"name": "Opt-in to the reroute beta test",
|
||||
"tooltip": "Enables the new native reroutes.\n\nReroutes can be added by holding alt and dragging from a link line, or on the link menu.\n\nDisabling this option is non-destructive - reroutes are hidden."
|
||||
},
|
||||
"Comfy_Server_LaunchArgs": {
|
||||
"name": "Server launch arguments",
|
||||
"tooltip": "These are the actual arguments that are passed to the server when it is launched."
|
||||
},
|
||||
"Comfy_Server_ServerConfigValues": {
|
||||
"name": "Server config values for frontend display",
|
||||
"tooltip": "Server config values used for frontend display only"
|
||||
},
|
||||
"Comfy_Settings_ExtensionPanel": {
|
||||
"name": "Show extension panel in settings dialog"
|
||||
},
|
||||
"Comfy_Sidebar_Location": {
|
||||
"name": "Sidebar location",
|
||||
"options": {
|
||||
"left": "left",
|
||||
"right": "right"
|
||||
}
|
||||
},
|
||||
"Comfy_Sidebar_Size": {
|
||||
"name": "Sidebar size",
|
||||
"options": {
|
||||
"normal": "normal",
|
||||
"small": "small"
|
||||
}
|
||||
},
|
||||
"Comfy_SnapToGrid_GridSize": {
|
||||
"name": "Snap to grid size",
|
||||
"tooltip": "When dragging and resizing nodes while holding shift they will be aligned to the grid, this controls the size of that grid."
|
||||
},
|
||||
"Comfy_TextareaWidget_FontSize": {
|
||||
"name": "Textarea widget font size"
|
||||
},
|
||||
"Comfy_TextareaWidget_Spellcheck": {
|
||||
"name": "Textarea widget spellcheck"
|
||||
},
|
||||
"Comfy_TreeExplorer_ItemPadding": {
|
||||
"name": "Tree explorer item padding"
|
||||
},
|
||||
"Comfy_UseNewMenu": {
|
||||
"name": "Use new menu",
|
||||
"options": {
|
||||
"Disabled": "Disabled",
|
||||
"Top": "Top",
|
||||
"Bottom": "Bottom"
|
||||
}
|
||||
},
|
||||
"Comfy_Validation_NodeDefs": {
|
||||
"name": "Validate node definitions (slow)",
|
||||
"tooltip": "Recommended for node developers. This will validate all node definitions on startup."
|
||||
},
|
||||
"Comfy_Validation_Workflows": {
|
||||
"name": "Validate workflows"
|
||||
},
|
||||
"Comfy_WidgetControlMode": {
|
||||
"name": "Widget control mode",
|
||||
"tooltip": "Controls when widget values are updated (randomize/increment/decrement), either before the prompt is queued or after.",
|
||||
"options": {
|
||||
"before": "before",
|
||||
"after": "after"
|
||||
}
|
||||
},
|
||||
"Comfy_Window_UnloadConfirmation": {
|
||||
"name": "Show confirmation when closing window"
|
||||
},
|
||||
"Comfy_Workflow_ConfirmDelete": {
|
||||
"name": "Show confirmation when deleting workflows"
|
||||
},
|
||||
"Comfy_Workflow_ShowMissingModelsWarning": {
|
||||
"name": "Show missing models warning"
|
||||
},
|
||||
"Comfy_Workflow_ShowMissingNodesWarning": {
|
||||
"name": "Show missing nodes warning"
|
||||
},
|
||||
"Comfy_Workflow_SortNodeIdOnSave": {
|
||||
"name": "Sort node IDs when saving workflow"
|
||||
},
|
||||
"Comfy_Workflow_WorkflowTabsPosition": {
|
||||
"name": "Opened workflows position",
|
||||
"options": {
|
||||
"Sidebar": "Sidebar",
|
||||
"Topbar": "Topbar"
|
||||
}
|
||||
},
|
||||
"LiteGraph_Canvas_MaximumFps": {
|
||||
"name": "Maxium FPS",
|
||||
"tooltip": "The maximum frames per second that the canvas is allowed to render. Caps GPU usage at the cost of smoothness. If 0, the screen refresh rate is used. Default: 0"
|
||||
},
|
||||
"pysssss_SnapToGrid": {
|
||||
"name": "Always snap to grid"
|
||||
}
|
||||
},
|
||||
"sideToolbar": {
|
||||
"themeToggle": "Toggle Theme",
|
||||
"logout": "Logout",
|
||||
@@ -688,6 +354,7 @@
|
||||
"Convert selected nodes to group node": "Convert selected nodes to group node",
|
||||
"Manage group nodes": "Manage group nodes",
|
||||
"Ungroup selected group nodes": "Ungroup selected group nodes",
|
||||
"About ComfyUI": "About ComfyUI",
|
||||
"Comfy-Org Discord": "Comfy-Org Discord",
|
||||
"ComfyUI Docs": "ComfyUI Docs",
|
||||
"ComfyUI Issues": "ComfyUI Issues",
|
||||
|
||||
@@ -312,6 +312,24 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"CLIPTextEncodePixArtAlpha": {
|
||||
"display_name": "CLIPTextEncodePixArtAlpha",
|
||||
"description": "Encodes text and sets the resolution conditioning for PixArt Alpha. Does not apply to PixArt Sigma.",
|
||||
"inputs": {
|
||||
"width": {
|
||||
"name": "width"
|
||||
},
|
||||
"height": {
|
||||
"name": "height"
|
||||
},
|
||||
"text": {
|
||||
"name": "text"
|
||||
},
|
||||
"clip": {
|
||||
"name": "clip"
|
||||
}
|
||||
}
|
||||
},
|
||||
"CLIPTextEncodeSD3": {
|
||||
"display_name": "CLIPTextEncodeSD3",
|
||||
"inputs": {
|
||||
@@ -650,6 +668,31 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"ConditioningStableAudio": {
|
||||
"display_name": "ConditioningStableAudio",
|
||||
"inputs": {
|
||||
"positive": {
|
||||
"name": "positive"
|
||||
},
|
||||
"negative": {
|
||||
"name": "negative"
|
||||
},
|
||||
"seconds_start": {
|
||||
"name": "seconds_start"
|
||||
},
|
||||
"seconds_total": {
|
||||
"name": "seconds_total"
|
||||
}
|
||||
},
|
||||
"outputs": {
|
||||
"0": {
|
||||
"name": "positive"
|
||||
},
|
||||
"1": {
|
||||
"name": "negative"
|
||||
}
|
||||
}
|
||||
},
|
||||
"ConditioningTimestepsRange": {
|
||||
"display_name": "Timesteps Range",
|
||||
"inputs": {
|
||||
@@ -4180,6 +4223,35 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"Preview3D": {
|
||||
"display_name": "Preview 3D",
|
||||
"inputs": {
|
||||
"model_file": {
|
||||
"name": "model_file"
|
||||
},
|
||||
"show_grid": {
|
||||
"name": "show_grid"
|
||||
},
|
||||
"camera_type": {
|
||||
"name": "camera_type"
|
||||
},
|
||||
"view": {
|
||||
"name": "view"
|
||||
},
|
||||
"material": {
|
||||
"name": "material"
|
||||
},
|
||||
"bg_color": {
|
||||
"name": "bg_color"
|
||||
},
|
||||
"light_intensity": {
|
||||
"name": "light_intensity"
|
||||
},
|
||||
"up_direction": {
|
||||
"name": "up_direction"
|
||||
}
|
||||
}
|
||||
},
|
||||
"PreviewAudio": {
|
||||
"display_name": "PreviewAudio",
|
||||
"inputs": {
|
||||
@@ -5245,6 +5317,14 @@
|
||||
},
|
||||
"overlap": {
|
||||
"name": "overlap"
|
||||
},
|
||||
"temporal_size": {
|
||||
"name": "temporal_size",
|
||||
"tooltip": "Only used for video VAEs: Amount of frames to decode at a time."
|
||||
},
|
||||
"temporal_overlap": {
|
||||
"name": "temporal_overlap",
|
||||
"tooltip": "Only used for video VAEs: Amount of frames to overlap."
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -5298,6 +5378,17 @@
|
||||
},
|
||||
"tile_size": {
|
||||
"name": "tile_size"
|
||||
},
|
||||
"overlap": {
|
||||
"name": "overlap"
|
||||
},
|
||||
"temporal_size": {
|
||||
"name": "temporal_size",
|
||||
"tooltip": "Only used for video VAEs: Amount of frames to encode at a time."
|
||||
},
|
||||
"temporal_overlap": {
|
||||
"name": "temporal_overlap",
|
||||
"tooltip": "Only used for video VAEs: Amount of frames to overlap."
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
344
src/locales/en/settings.json
Normal file
344
src/locales/en/settings.json
Normal file
@@ -0,0 +1,344 @@
|
||||
{
|
||||
"Comfy-Desktop_AutoUpdate": {
|
||||
"name": "Automatically check for updates"
|
||||
},
|
||||
"Comfy-Desktop_SendStatistics": {
|
||||
"name": "Send anonymous crash reports"
|
||||
},
|
||||
"Comfy_ColorPalette": {
|
||||
"name": "Color Palette"
|
||||
},
|
||||
"Comfy_ConfirmClear": {
|
||||
"name": "Require confirmation when clearing workflow"
|
||||
},
|
||||
"Comfy_DevMode": {
|
||||
"name": "Enable dev mode options (API save, etc.)"
|
||||
},
|
||||
"Comfy_DisableFloatRounding": {
|
||||
"name": "Disable default float widget rounding.",
|
||||
"tooltip": "(requires page reload) Cannot disable round when round is set by the node in the backend."
|
||||
},
|
||||
"Comfy_DisableSliders": {
|
||||
"name": "Disable node widget sliders"
|
||||
},
|
||||
"Comfy_DOMClippingEnabled": {
|
||||
"name": "Enable DOM element clipping (enabling may reduce performance)"
|
||||
},
|
||||
"Comfy_EditAttention_Delta": {
|
||||
"name": "Ctrl+up/down precision"
|
||||
},
|
||||
"Comfy_EnableTooltips": {
|
||||
"name": "Enable Tooltips"
|
||||
},
|
||||
"Comfy_EnableWorkflowViewRestore": {
|
||||
"name": "Save and restore canvas position and zoom level in workflows"
|
||||
},
|
||||
"Comfy_Extension_Disabled": {
|
||||
"name": "Disabled extension names"
|
||||
},
|
||||
"Comfy_FloatRoundingPrecision": {
|
||||
"name": "Float widget rounding decimal places [0 = auto].",
|
||||
"tooltip": "(requires page reload)"
|
||||
},
|
||||
"Comfy_Graph_CanvasInfo": {
|
||||
"name": "Show canvas info on bottom left corner (fps, etc.)"
|
||||
},
|
||||
"Comfy_Graph_CanvasMenu": {
|
||||
"name": "Show graph canvas menu"
|
||||
},
|
||||
"Comfy_Graph_CtrlShiftZoom": {
|
||||
"name": "Enable fast-zoom shortcut (Ctrl + Shift + Drag)"
|
||||
},
|
||||
"Comfy_Graph_LinkMarkers": {
|
||||
"name": "Link midpoint markers",
|
||||
"options": {
|
||||
"None": "None",
|
||||
"Circle": "Circle",
|
||||
"Arrow": "Arrow"
|
||||
}
|
||||
},
|
||||
"Comfy_Graph_ZoomSpeed": {
|
||||
"name": "Canvas zoom speed"
|
||||
},
|
||||
"Comfy_Group_DoubleClickTitleToEdit": {
|
||||
"name": "Double click group title to edit"
|
||||
},
|
||||
"Comfy_GroupSelectedNodes_Padding": {
|
||||
"name": "Group selected nodes padding"
|
||||
},
|
||||
"Comfy_InvertMenuScrolling": {
|
||||
"name": "Invert Context Menu Scrolling"
|
||||
},
|
||||
"Comfy_Keybinding_NewBindings": {
|
||||
"name": "Keybindings set by the user"
|
||||
},
|
||||
"Comfy_Keybinding_UnsetBindings": {
|
||||
"name": "Keybindings unset by the user"
|
||||
},
|
||||
"Comfy_LinkRelease_Action": {
|
||||
"name": "Action on link release (No modifier)",
|
||||
"options": {
|
||||
"context menu": "context menu",
|
||||
"search box": "search box",
|
||||
"no action": "no action"
|
||||
}
|
||||
},
|
||||
"Comfy_LinkRelease_ActionShift": {
|
||||
"name": "Action on link release (Shift)",
|
||||
"options": {
|
||||
"context menu": "context menu",
|
||||
"search box": "search box",
|
||||
"no action": "no action"
|
||||
}
|
||||
},
|
||||
"Comfy_LinkRenderMode": {
|
||||
"name": "Link Render Mode",
|
||||
"options": {
|
||||
"Straight": "Straight",
|
||||
"Linear": "Linear",
|
||||
"Spline": "Spline",
|
||||
"Hidden": "Hidden"
|
||||
}
|
||||
},
|
||||
"Comfy_Locale": {
|
||||
"name": "Language"
|
||||
},
|
||||
"Comfy_MaskEditor_BrushAdjustmentSpeed": {
|
||||
"name": "Brush adjustment speed multiplier",
|
||||
"tooltip": "Controls how quickly the brush size and hardness change when adjusting. Higher values mean faster changes."
|
||||
},
|
||||
"Comfy_MaskEditor_UseDominantAxis": {
|
||||
"name": "Lock brush adjustment to dominant axis",
|
||||
"tooltip": "When enabled, brush adjustments will only affect size OR hardness based on which direction you move more"
|
||||
},
|
||||
"Comfy_MaskEditor_UseNewEditor": {
|
||||
"name": "Use new mask editor",
|
||||
"tooltip": "Switch to the new mask editor interface"
|
||||
},
|
||||
"Comfy_MenuPosition": {
|
||||
"name": "Save legacy menu's position"
|
||||
},
|
||||
"Comfy_ModelLibrary_AutoLoadAll": {
|
||||
"name": "Automatically load all model folders",
|
||||
"tooltip": "If true, all folders will load as soon as you open the model library (this may cause delays while it loads). If false, root level model folders will only load once you click on them."
|
||||
},
|
||||
"Comfy_ModelLibrary_NameFormat": {
|
||||
"name": "What name to display in the model library tree view",
|
||||
"tooltip": "Select \"filename\" to render a simplified view of the raw filename (without directory or \".safetensors\" extension) in the model list. Select \"title\" to display the configurable model metadata title.",
|
||||
"options": {
|
||||
"filename": "filename",
|
||||
"title": "title"
|
||||
}
|
||||
},
|
||||
"Comfy_Node_AutoSnapLinkToSlot": {
|
||||
"name": "Auto snap link to node slot",
|
||||
"tooltip": "When dragging a link over a node, the link automatically snap to a viable input slot on the node"
|
||||
},
|
||||
"Comfy_Node_BypassAllLinksOnDelete": {
|
||||
"name": "Keep all links when deleting nodes",
|
||||
"tooltip": "When deleting a node, attempt to reconnect all of its input and output links (bypassing the deleted node)"
|
||||
},
|
||||
"Comfy_Node_DoubleClickTitleToEdit": {
|
||||
"name": "Double click node title to edit"
|
||||
},
|
||||
"Comfy_Node_MiddleClickRerouteNode": {
|
||||
"name": "Middle-click creates a new Reroute node"
|
||||
},
|
||||
"Comfy_Node_Opacity": {
|
||||
"name": "Node opacity"
|
||||
},
|
||||
"Comfy_Node_ShowDeprecated": {
|
||||
"name": "Show deprecated nodes in search",
|
||||
"tooltip": "Deprecated nodes are hidden by default in the UI, but remain functional in existing workflows that use them."
|
||||
},
|
||||
"Comfy_Node_ShowExperimental": {
|
||||
"name": "Show experimental nodes in search",
|
||||
"tooltip": "Experimental nodes are marked as such in the UI and may be subject to significant changes or removal in future versions. Use with caution in production workflows"
|
||||
},
|
||||
"Comfy_Node_SnapHighlightsNode": {
|
||||
"name": "Snap highlights node",
|
||||
"tooltip": "When dragging a link over a node with viable input slot, highlight the node"
|
||||
},
|
||||
"Comfy_NodeBadge_NodeIdBadgeMode": {
|
||||
"name": "Node ID badge mode",
|
||||
"options": {
|
||||
"None": "None",
|
||||
"Show all": "Show all"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeBadge_NodeLifeCycleBadgeMode": {
|
||||
"name": "Node life cycle badge mode",
|
||||
"options": {
|
||||
"None": "None",
|
||||
"Show all": "Show all"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeBadge_NodeSourceBadgeMode": {
|
||||
"name": "Node source badge mode",
|
||||
"options": {
|
||||
"None": "None",
|
||||
"Show all": "Show all",
|
||||
"Hide built-in": "Hide built-in"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeInputConversionSubmenus": {
|
||||
"name": "In the node context menu, place the entries that convert between input/widget in sub-menus."
|
||||
},
|
||||
"Comfy_NodeLibrary_Bookmarks": {
|
||||
"name": "Node library bookmarks with display name (deprecated)"
|
||||
},
|
||||
"Comfy_NodeLibrary_Bookmarks_V2": {
|
||||
"name": "Node library bookmarks v2 with unique name"
|
||||
},
|
||||
"Comfy_NodeLibrary_BookmarksCustomization": {
|
||||
"name": "Node library bookmarks customization"
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl": {
|
||||
"name": "Node search box implementation",
|
||||
"options": {
|
||||
"default": "default",
|
||||
"litegraph (legacy)": "litegraph (legacy)"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_NodePreview": {
|
||||
"name": "Node preview",
|
||||
"tooltip": "Only applies to the default implementation"
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_ShowCategory": {
|
||||
"name": "Show node category in search results",
|
||||
"tooltip": "Only applies to the default implementation"
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_ShowIdName": {
|
||||
"name": "Show node id name in search results",
|
||||
"tooltip": "Only applies to the default implementation"
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_ShowNodeFrequency": {
|
||||
"name": "Show node frequency in search results",
|
||||
"tooltip": "Only applies to the default implementation"
|
||||
},
|
||||
"Comfy_NodeSuggestions_number": {
|
||||
"name": "Number of nodes suggestions",
|
||||
"tooltip": "Only for litegraph searchbox/context menu"
|
||||
},
|
||||
"Comfy_Pointer_ClickBufferTime": {
|
||||
"name": "Pointer click drift delay",
|
||||
"tooltip": "After pressing a pointer button down, this is the maximum time (in milliseconds) that pointer movement can be ignored for.\n\nHelps prevent objects from being unintentionally nudged if the pointer is moved whilst clicking."
|
||||
},
|
||||
"Comfy_Pointer_ClickDrift": {
|
||||
"name": "Pointer click drift (maximum distance)",
|
||||
"tooltip": "If the pointer moves more than this distance while holding a button down, it is considered dragging (rather than clicking).\n\nHelps prevent objects from being unintentionally nudged if the pointer is moved whilst clicking."
|
||||
},
|
||||
"Comfy_Pointer_DoubleClickTime": {
|
||||
"name": "Double click interval (maximum)",
|
||||
"tooltip": "The maximum time in milliseconds between the two clicks of a double-click. Increasing this value may assist if double-clicks are sometimes not registered."
|
||||
},
|
||||
"Comfy_PreviewFormat": {
|
||||
"name": "Preview image format",
|
||||
"tooltip": "When displaying a preview in the image widget, convert it to a lightweight image, e.g. webp, jpeg, webp;50, etc."
|
||||
},
|
||||
"Comfy_PromptFilename": {
|
||||
"name": "Prompt for filename when saving workflow"
|
||||
},
|
||||
"Comfy_Queue_ImageFit": {
|
||||
"name": "Queue image fit"
|
||||
},
|
||||
"Comfy_Queue_MaxHistoryItems": {
|
||||
"name": "Queue history size",
|
||||
"tooltip": "The maximum number of tasks that show in the queue history."
|
||||
},
|
||||
"Comfy_QueueButton_BatchCountLimit": {
|
||||
"name": "Batch count limit",
|
||||
"tooltip": "The maximum number of tasks added to the queue at one button click"
|
||||
},
|
||||
"Comfy_RerouteBeta": {
|
||||
"name": "Opt-in to the reroute beta test",
|
||||
"tooltip": "Enables the new native reroutes.\n\nReroutes can be added by holding alt and dragging from a link line, or on the link menu.\n\nDisabling this option is non-destructive - reroutes are hidden."
|
||||
},
|
||||
"Comfy_Server_LaunchArgs": {
|
||||
"name": "Server launch arguments",
|
||||
"tooltip": "These are the actual arguments that are passed to the server when it is launched."
|
||||
},
|
||||
"Comfy_Server_ServerConfigValues": {
|
||||
"name": "Server config values for frontend display",
|
||||
"tooltip": "Server config values used for frontend display only"
|
||||
},
|
||||
"Comfy_Sidebar_Location": {
|
||||
"name": "Sidebar location",
|
||||
"options": {
|
||||
"left": "left",
|
||||
"right": "right"
|
||||
}
|
||||
},
|
||||
"Comfy_Sidebar_Size": {
|
||||
"name": "Sidebar size",
|
||||
"options": {
|
||||
"normal": "normal",
|
||||
"small": "small"
|
||||
}
|
||||
},
|
||||
"Comfy_SnapToGrid_GridSize": {
|
||||
"name": "Snap to grid size",
|
||||
"tooltip": "When dragging and resizing nodes while holding shift they will be aligned to the grid, this controls the size of that grid."
|
||||
},
|
||||
"Comfy_TextareaWidget_FontSize": {
|
||||
"name": "Textarea widget font size"
|
||||
},
|
||||
"Comfy_TextareaWidget_Spellcheck": {
|
||||
"name": "Textarea widget spellcheck"
|
||||
},
|
||||
"Comfy_TreeExplorer_ItemPadding": {
|
||||
"name": "Tree explorer item padding"
|
||||
},
|
||||
"Comfy_UseNewMenu": {
|
||||
"name": "Use new menu",
|
||||
"options": {
|
||||
"Disabled": "Disabled",
|
||||
"Top": "Top",
|
||||
"Bottom": "Bottom"
|
||||
}
|
||||
},
|
||||
"Comfy_Validation_NodeDefs": {
|
||||
"name": "Validate node definitions (slow)",
|
||||
"tooltip": "Recommended for node developers. This will validate all node definitions on startup."
|
||||
},
|
||||
"Comfy_Validation_Workflows": {
|
||||
"name": "Validate workflows"
|
||||
},
|
||||
"Comfy_WidgetControlMode": {
|
||||
"name": "Widget control mode",
|
||||
"tooltip": "Controls when widget values are updated (randomize/increment/decrement), either before the prompt is queued or after.",
|
||||
"options": {
|
||||
"before": "before",
|
||||
"after": "after"
|
||||
}
|
||||
},
|
||||
"Comfy_Window_UnloadConfirmation": {
|
||||
"name": "Show confirmation when closing window"
|
||||
},
|
||||
"Comfy_Workflow_ConfirmDelete": {
|
||||
"name": "Show confirmation when deleting workflows"
|
||||
},
|
||||
"Comfy_Workflow_ShowMissingModelsWarning": {
|
||||
"name": "Show missing models warning"
|
||||
},
|
||||
"Comfy_Workflow_ShowMissingNodesWarning": {
|
||||
"name": "Show missing nodes warning"
|
||||
},
|
||||
"Comfy_Workflow_SortNodeIdOnSave": {
|
||||
"name": "Sort node IDs when saving workflow"
|
||||
},
|
||||
"Comfy_Workflow_WorkflowTabsPosition": {
|
||||
"name": "Opened workflows position",
|
||||
"options": {
|
||||
"Sidebar": "Sidebar",
|
||||
"Topbar": "Topbar"
|
||||
}
|
||||
},
|
||||
"LiteGraph_Canvas_MaximumFps": {
|
||||
"name": "Maxium FPS",
|
||||
"tooltip": "The maximum frames per second that the canvas is allowed to render. Caps GPU usage at the cost of smoothness. If 0, the screen refresh rate is used. Default: 0"
|
||||
},
|
||||
"pysssss_SnapToGrid": {
|
||||
"name": "Always snap to grid"
|
||||
}
|
||||
}
|
||||
@@ -95,6 +95,9 @@
|
||||
"Comfy_GroupNode_UngroupSelectedGroupNodes": {
|
||||
"label": "選択したグループノードのグループ解除"
|
||||
},
|
||||
"Comfy_Help_AboutComfyUI": {
|
||||
"label": "ComfyUIについてを開く"
|
||||
},
|
||||
"Comfy_Help_OpenComfyOrgDiscord": {
|
||||
"label": "Comfy-OrgのDiscordを開く"
|
||||
},
|
||||
|
||||
@@ -65,10 +65,12 @@
|
||||
"g": {
|
||||
"about": "情報",
|
||||
"add": "追加",
|
||||
"back": "戻る",
|
||||
"cancel": "キャンセル",
|
||||
"close": "閉じる",
|
||||
"color": "色",
|
||||
"comingSoon": "近日公開",
|
||||
"command": "コマンド",
|
||||
"confirm": "確認",
|
||||
"copyToClipboard": "クリップボードにコピー",
|
||||
"currentUser": "現在のユーザー",
|
||||
@@ -77,8 +79,10 @@
|
||||
"delete": "削除",
|
||||
"deprecated": "非推奨",
|
||||
"devices": "デバイス",
|
||||
"disableAll": "すべて無効にする",
|
||||
"download": "ダウンロード",
|
||||
"empty": "空",
|
||||
"enableAll": "すべて有効にする",
|
||||
"error": "エラー",
|
||||
"experimental": "ベータ",
|
||||
"extensionName": "拡張機能名",
|
||||
@@ -88,11 +92,14 @@
|
||||
"icon": "アイコン",
|
||||
"imageFailedToLoad": "画像の読み込みに失敗しました",
|
||||
"insert": "挿入",
|
||||
"install": "インストール",
|
||||
"keybinding": "キーバインディング",
|
||||
"loadAllFolders": "すべてのフォルダーを読み込む",
|
||||
"loadWorkflow": "ワークフローを読み込む",
|
||||
"loading": "読み込み中",
|
||||
"logs": "ログ",
|
||||
"newFolder": "新しいフォルダー",
|
||||
"next": "次へ",
|
||||
"no": "いいえ",
|
||||
"noResultsFound": "結果が見つかりません",
|
||||
"noTasksFound": "タスクが見つかりません",
|
||||
@@ -122,6 +129,7 @@
|
||||
"showReport": "レポートを表示",
|
||||
"systemInfo": "システム情報",
|
||||
"terminal": "ターミナル",
|
||||
"upload": "アップロード",
|
||||
"videoFailedToLoad": "ビデオの読み込みに失敗しました"
|
||||
},
|
||||
"graphCanvasMenu": {
|
||||
@@ -151,9 +159,10 @@
|
||||
"install": {
|
||||
"appDataLocationTooltip": "ComfyUIのアプリデータディレクトリ。保存内容:\n- ログ\n- サーバー設定",
|
||||
"appPathLocationTooltip": "ComfyUIのアプリ資産ディレクトリ。ComfyUIのコードとアセットを保存します",
|
||||
"cannotWrite": "選択したパスに書き込むことができません",
|
||||
"chooseInstallationLocation": "インストール先を選択",
|
||||
"customNodes": "カスタムノード",
|
||||
"customNodesDescription": "既存のComfyUIインストールからカスタムノードファイルを参照し、その依存関係をインストールします。",
|
||||
"customNodesDescription": "既存のComfyUIインストールからカスタムノードを再インストールします。",
|
||||
"desktopAppSettings": "デスクトップアプリの設定",
|
||||
"desktopAppSettingsDescription": "ComfyUIのデスクトップでの動作を設定します。これらの設定は後で変更可能です。",
|
||||
"desktopSettings": "デスクトップ設定",
|
||||
@@ -177,6 +186,7 @@
|
||||
"installLocation": "インストール先",
|
||||
"installLocationDescription": "ComfyUIのユーザーデータを保存するディレクトリを選択してください。Python環境が選択した場所にインストールされます。選択したディスクに約15GBの空き容量が必要です。",
|
||||
"installLocationTooltip": "ComfyUIのユーザーデータディレクトリ。保存内容:\n- Python環境\n- モデル\n- カスタムノード\n",
|
||||
"insufficientFreeSpace": "空き容量が不足しています - 最低限の空き容量",
|
||||
"manualConfiguration": {
|
||||
"createVenv": "次のディレクトリに仮想環境を作成する必要があります",
|
||||
"requirements": "要件",
|
||||
@@ -188,6 +198,8 @@
|
||||
"migration": "移行",
|
||||
"migrationOptional": "移行は任意です。既存のインストールがない場合、このステップをスキップできます。",
|
||||
"migrationSourcePathDescription": "既存のComfyUIインストールがある場合、既存のユーザーファイルやモデルを新しいインストールにコピー/リンクできます。",
|
||||
"parentMissing": "パスが存在しません - 最初に含まれるディレクトリを作成してください",
|
||||
"pathExists": "ディレクトリはすでに存在します - すべてのデータをバックアップしたことを確認してください",
|
||||
"pathValidationFailed": "パスの検証に失敗しました",
|
||||
"selectItemsToMigrate": "移行する項目を選択",
|
||||
"settings": {
|
||||
@@ -209,7 +221,8 @@
|
||||
},
|
||||
"learnMoreAboutData": "データ収集の詳細を見る"
|
||||
},
|
||||
"systemLocations": "システムの場所"
|
||||
"systemLocations": "システムの場所",
|
||||
"unhandledError": "未知のエラー"
|
||||
},
|
||||
"menu": {
|
||||
"autoQueue": "自動キュー",
|
||||
@@ -235,6 +248,7 @@
|
||||
"toggleBottomPanel": "下部パネルを切り替え"
|
||||
},
|
||||
"menuLabels": {
|
||||
"About ComfyUI": "ComfyUIについて",
|
||||
"Browse Templates": "テンプレートを参照",
|
||||
"Bypass/Unbypass Selected Nodes": "選択したノードのバイパス/バイパス解除",
|
||||
"Canvas Toggle Link Visibility": "キャンバスのリンク表示を切り替え",
|
||||
@@ -560,353 +574,6 @@
|
||||
"Window": "ウィンドウ",
|
||||
"Workflow": "ワークフロー"
|
||||
},
|
||||
"settingsDialog": {
|
||||
"Comfy-Desktop_AutoUpdate": {
|
||||
"name": "自動的に更新を確認する"
|
||||
},
|
||||
"Comfy-Desktop_SendStatistics": {
|
||||
"name": "匿名のクラッシュレポートを送信する"
|
||||
},
|
||||
"Comfy_ColorPalette": {
|
||||
"name": "カラーパレット"
|
||||
},
|
||||
"Comfy_ConfirmClear": {
|
||||
"name": "ワークフローをクリアする際に確認を要求する"
|
||||
},
|
||||
"Comfy_DOMClippingEnabled": {
|
||||
"name": "DOM要素のクリッピングを有効にする(有効にするとパフォーマンスが低下する可能性があります)"
|
||||
},
|
||||
"Comfy_DevMode": {
|
||||
"name": "開発モードオプションを有効にする(API保存など)"
|
||||
},
|
||||
"Comfy_DisableFloatRounding": {
|
||||
"name": "デフォルトの浮動小数点ウィジェットの丸めを無効にする。",
|
||||
"tooltip": "(ページの再読み込みが必要) バックエンドのノードで丸めが設定されている場合、丸めを無効にすることはできません。"
|
||||
},
|
||||
"Comfy_DisableSliders": {
|
||||
"name": "ノードウィジェットスライダーを無効にする"
|
||||
},
|
||||
"Comfy_EditAttention_Delta": {
|
||||
"name": "Ctrl+上/下の精度"
|
||||
},
|
||||
"Comfy_EnableTooltips": {
|
||||
"name": "ツールチップを有効にする"
|
||||
},
|
||||
"Comfy_EnableWorkflowViewRestore": {
|
||||
"name": "ワークフロー内のキャンバスの位置とズームレベルを保存および復元する"
|
||||
},
|
||||
"Comfy_Extension_Disabled": {
|
||||
"name": "無効な拡張機能名"
|
||||
},
|
||||
"Comfy_FloatRoundingPrecision": {
|
||||
"name": "浮動小数点ウィジェットの丸め小数点数 [0 = 自動]。",
|
||||
"tooltip": "(ページの再読み込みが必要)"
|
||||
},
|
||||
"Comfy_Graph_CanvasInfo": {
|
||||
"name": "左下隅にキャンバス情報を表示する(fpsなど)"
|
||||
},
|
||||
"Comfy_Graph_CanvasMenu": {
|
||||
"name": "グラフキャンバスメニューを表示する"
|
||||
},
|
||||
"Comfy_Graph_CtrlShiftZoom": {
|
||||
"name": "ファストズームショートカットを有効にする(Ctrl + Shift + ドラッグ)"
|
||||
},
|
||||
"Comfy_Graph_LinkMarkers": {
|
||||
"name": "リンク中点マーカー",
|
||||
"options": {
|
||||
"Arrow": "矢印",
|
||||
"Circle": "円",
|
||||
"None": "なし"
|
||||
}
|
||||
},
|
||||
"Comfy_Graph_ZoomSpeed": {
|
||||
"name": "キャンバスズーム速度"
|
||||
},
|
||||
"Comfy_GroupSelectedNodes_Padding": {
|
||||
"name": "選択したノードのパディング"
|
||||
},
|
||||
"Comfy_Group_DoubleClickTitleToEdit": {
|
||||
"name": "グループタイトルをダブルクリックして編集"
|
||||
},
|
||||
"Comfy_InvertMenuScrolling": {
|
||||
"name": "コンテキストメニューのスクロールを反転する"
|
||||
},
|
||||
"Comfy_Keybinding_NewBindings": {
|
||||
"name": "ユーザーによって設定されたキー割り当て"
|
||||
},
|
||||
"Comfy_Keybinding_UnsetBindings": {
|
||||
"name": "ユーザーによって解除されたキー割り当て"
|
||||
},
|
||||
"Comfy_LinkRelease_Action": {
|
||||
"name": "リンクリリース時のアクション(修飾子なし)",
|
||||
"options": {
|
||||
"context menu": "コンテキストメニュー",
|
||||
"no action": "アクションなし",
|
||||
"search box": "検索ボックス"
|
||||
}
|
||||
},
|
||||
"Comfy_LinkRelease_ActionShift": {
|
||||
"name": "リンクリリース時のアクション(Shift)",
|
||||
"options": {
|
||||
"context menu": "コンテキストメニュー",
|
||||
"no action": "アクションなし",
|
||||
"search box": "検索ボックス"
|
||||
}
|
||||
},
|
||||
"Comfy_LinkRenderMode": {
|
||||
"name": "リンクレンダーモード",
|
||||
"options": {
|
||||
"Hidden": "隠す",
|
||||
"Linear": "リニア",
|
||||
"Spline": "スプライン",
|
||||
"Straight": "ストレート"
|
||||
}
|
||||
},
|
||||
"Comfy_Locale": {
|
||||
"name": "言語"
|
||||
},
|
||||
"Comfy_MaskEditor_BrushAdjustmentSpeed": {
|
||||
"name": "ブラシ調整速度の倍率",
|
||||
"tooltip": "調整時にブラシのサイズと硬さがどれだけ速く変化するかを制御します。値が高いほど、変化が速くなります。"
|
||||
},
|
||||
"Comfy_MaskEditor_UseDominantAxis": {
|
||||
"name": "ブラシ調整を優先軸に固定する",
|
||||
"tooltip": "有効にすると、ブラシの調整は、どの方向に多く動かすかに基づいて、サイズまたは硬さのいずれかにのみ影響します。"
|
||||
},
|
||||
"Comfy_MaskEditor_UseNewEditor": {
|
||||
"name": "新しいマスクエディタを使用する",
|
||||
"tooltip": "新しいマスクエディタインターフェースに切り替えます。"
|
||||
},
|
||||
"Comfy_MenuPosition": {
|
||||
"name": "レガシーメニューの位置を保存"
|
||||
},
|
||||
"Comfy_ModelLibrary_AutoLoadAll": {
|
||||
"name": "すべてのモデルフォルダーを自動的に読み込む",
|
||||
"tooltip": "trueの場合、モデルライブラリを開くとすぐにすべてのフォルダーが読み込まれます(これにより読み込み中に遅延が発生する可能性があります)。falseの場合、ルートレベルのモデルフォルダーはクリックするまで読み込まれません。"
|
||||
},
|
||||
"Comfy_ModelLibrary_NameFormat": {
|
||||
"name": "モデルライブラリツリービューに表示する名前",
|
||||
"options": {
|
||||
"filename": "ファイル名",
|
||||
"title": "タイトル"
|
||||
},
|
||||
"tooltip": "\"ファイル名\"を選択すると、モデルリストにディレクトリや\".safetensors\"拡張子なしの生のファイル名の簡略化されたビューが表示されます。\"タイトル\"を選択すると、設定可能なモデルメタデータタイトルが表示されます。"
|
||||
},
|
||||
"Comfy_NodeBadge_NodeIdBadgeMode": {
|
||||
"name": "ノードIDバッジモード",
|
||||
"options": {
|
||||
"None": "なし",
|
||||
"Show all": "すべて表示"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeBadge_NodeLifeCycleBadgeMode": {
|
||||
"name": "ノードライフサイクルバッジモード",
|
||||
"options": {
|
||||
"None": "なし",
|
||||
"Show all": "すべて表示"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeBadge_NodeSourceBadgeMode": {
|
||||
"name": "ノードソースバッジモード",
|
||||
"options": {
|
||||
"Hide built-in": "組み込みを隠す",
|
||||
"None": "なし",
|
||||
"Show all": "すべて表示"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeInputConversionSubmenus": {
|
||||
"name": "ノードのコンテキストメニューに、入力/ウィジェット間の変換を行うエントリをサブメニューに配置します。"
|
||||
},
|
||||
"Comfy_NodeLibrary_Bookmarks": {
|
||||
"name": "ノードライブラリのブックマーク(非推奨)"
|
||||
},
|
||||
"Comfy_NodeLibrary_BookmarksCustomization": {
|
||||
"name": "ノードライブラリのブックマークカスタマイズ"
|
||||
},
|
||||
"Comfy_NodeLibrary_Bookmarks_V2": {
|
||||
"name": "ユニークな名前のノードライブラリのブックマークv2"
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl": {
|
||||
"name": "ノード検索ボックスの実装",
|
||||
"options": {
|
||||
"default": "デフォルト",
|
||||
"litegraph (legacy)": "litegraph (レガシー)"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_NodePreview": {
|
||||
"name": "ノードプレビュー",
|
||||
"tooltip": "デフォルトの実装にのみ適用されます"
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_ShowCategory": {
|
||||
"name": "検索結果にノードカテゴリを表示",
|
||||
"tooltip": "デフォルトの実装にのみ適用されます"
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_ShowIdName": {
|
||||
"name": "検索結果にノードID名を表示",
|
||||
"tooltip": "デフォルトの実装にのみ適用されます"
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_ShowNodeFrequency": {
|
||||
"name": "検索結果にノード頻度を表示",
|
||||
"tooltip": "デフォルトの実装にのみ適用されます"
|
||||
},
|
||||
"Comfy_NodeSuggestions_number": {
|
||||
"name": "ノード提案の数",
|
||||
"tooltip": "ライトグラフの検索ボックス/コンテキストメニュー専用"
|
||||
},
|
||||
"Comfy_Node_AutoSnapLinkToSlot": {
|
||||
"name": "ノードスロットにリンクを自動スナップ",
|
||||
"tooltip": "ノードの上にリンクをドラッグすると、リンクがノードの有効な入力スロットに自動的にスナップします"
|
||||
},
|
||||
"Comfy_Node_BypassAllLinksOnDelete": {
|
||||
"name": "ノード削除時にすべてのリンクを保持",
|
||||
"tooltip": "ノードを削除する際、削除されたノードをバイパスしてすべての入力および出力リンクを再接続しようとします"
|
||||
},
|
||||
"Comfy_Node_DoubleClickTitleToEdit": {
|
||||
"name": "ノードタイトルをダブルクリックして編集"
|
||||
},
|
||||
"Comfy_Node_MiddleClickRerouteNode": {
|
||||
"name": "ミドルクリックで新しいリルートノードを作成"
|
||||
},
|
||||
"Comfy_Node_Opacity": {
|
||||
"name": "ノードの不透明度"
|
||||
},
|
||||
"Comfy_Node_ShowDeprecated": {
|
||||
"name": "検索で非推奨ノードを表示",
|
||||
"tooltip": "非推奨ノードはデフォルトでUIに隠されていますが、それを使用する既存のワークフローでは機能し続けます。"
|
||||
},
|
||||
"Comfy_Node_ShowExperimental": {
|
||||
"name": "検索で実験的ノードを表示",
|
||||
"tooltip": "実験的ノードはUIでそのようにマークされており、将来のバージョンで大幅な変更や削除の対象となる可能性があります。生産ワークフローでの使用には注意が必要です"
|
||||
},
|
||||
"Comfy_Node_SnapHighlightsNode": {
|
||||
"name": "スナップハイライトノード",
|
||||
"tooltip": "有効な入力スロットを持つノードの上にリンクをドラッグすると、ノードがハイライトされます"
|
||||
},
|
||||
"Comfy_Pointer_ClickBufferTime": {
|
||||
"name": "ポインタークリックドリフト遅延",
|
||||
"tooltip": "ポインターボタンを押した後、ポインタの動きが無視される最大時間(ミリ秒単位)です。\n\nクリック中にポインタが移動した場合、オブジェクトが意図せず動かされるのを防ぎます。"
|
||||
},
|
||||
"Comfy_Pointer_ClickDrift": {
|
||||
"name": "ポインタークリックドリフト(最大距離)",
|
||||
"tooltip": "ボタンを押し続けている間にポインタがこの距離以上移動した場合、クリックではなくドラッグと見なされます。\n\nクリック中にポインタが移動した場合、オブジェクトが意図せず動かされるのを防ぎます。"
|
||||
},
|
||||
"Comfy_Pointer_DoubleClickTime": {
|
||||
"name": "ダブルクリック間隔(最大)",
|
||||
"tooltip": "ダブルクリックの2回のクリック間の最大時間(ミリ秒単位)。この値を増やすことで、ダブルクリックが時々登録されない場合に助けになるかもしれません。"
|
||||
},
|
||||
"Comfy_PreviewFormat": {
|
||||
"name": "プレビュー画像フォーマット",
|
||||
"tooltip": "画像ウィジェットでプレビューを表示する際、軽量画像に変換します(例:webp、jpeg、webp;50など)。"
|
||||
},
|
||||
"Comfy_PromptFilename": {
|
||||
"name": "ワークフローを保存する際にファイル名を入力するよう促す"
|
||||
},
|
||||
"Comfy_QueueButton_BatchCountLimit": {
|
||||
"name": "バッチ数制限",
|
||||
"tooltip": "1回のボタンクリックでキューに追加できるタスクの最大数"
|
||||
},
|
||||
"Comfy_Queue_ImageFit": {
|
||||
"name": "キュー画像フィット"
|
||||
},
|
||||
"Comfy_Queue_MaxHistoryItems": {
|
||||
"name": "キュー履歴サイズ",
|
||||
"tooltip": "キュー履歴に表示されるタスクの最大数。"
|
||||
},
|
||||
"Comfy_RerouteBeta": {
|
||||
"name": "リルートベータテストに参加する",
|
||||
"tooltip": "新しいネイティブリルートを有効にします。\n\nリルートは、リンクラインからドラッグしながらaltを押すか、リンクメニューで追加できます。\n\nこのオプションを無効にしても破壊的ではなく、リルートは隠されます。"
|
||||
},
|
||||
"Comfy_Server_LaunchArgs": {
|
||||
"name": "サーバー起動引数",
|
||||
"tooltip": "これらは、サーバーが起動されるときに渡される実際の引数です。"
|
||||
},
|
||||
"Comfy_Server_ServerConfigValues": {
|
||||
"name": "フロントエンド表示用のサーバー設定値",
|
||||
"tooltip": "フロントエンド表示のみに使用されるサーバー設定値"
|
||||
},
|
||||
"Comfy_Settings_ExtensionPanel": {
|
||||
"name": "設定ダイアログに拡張パネルを表示"
|
||||
},
|
||||
"Comfy_Sidebar_Location": {
|
||||
"name": "サイドバーの位置",
|
||||
"options": {
|
||||
"left": "左",
|
||||
"right": "右"
|
||||
}
|
||||
},
|
||||
"Comfy_Sidebar_Size": {
|
||||
"name": "サイドバーのサイズ",
|
||||
"options": {
|
||||
"normal": "通常",
|
||||
"small": "小"
|
||||
}
|
||||
},
|
||||
"Comfy_SnapToGrid_GridSize": {
|
||||
"name": "グリッドサイズにスナップ",
|
||||
"tooltip": "シフトを押しながらノードをドラッグおよびサイズ変更すると、グリッドに整列されます。これにより、そのグリッドのサイズが制御されます。"
|
||||
},
|
||||
"Comfy_TextareaWidget_FontSize": {
|
||||
"name": "テキストエリアウィジェットのフォントサイズ"
|
||||
},
|
||||
"Comfy_TextareaWidget_Spellcheck": {
|
||||
"name": "テキストエリアウィジェットのスペルチェック"
|
||||
},
|
||||
"Comfy_TreeExplorer_ItemPadding": {
|
||||
"name": "ツリーエクスプローラーアイテムのパディング"
|
||||
},
|
||||
"Comfy_UseNewMenu": {
|
||||
"name": "新しいメニューを使用",
|
||||
"options": {
|
||||
"Bottom": "下",
|
||||
"Disabled": "無効",
|
||||
"Top": "上"
|
||||
}
|
||||
},
|
||||
"Comfy_Validation_NodeDefs": {
|
||||
"name": "ノード定義を検証(遅い)",
|
||||
"tooltip": "ノード開発者に推奨されます。これにより、起動時にすべてのノード定義が検証されます。"
|
||||
},
|
||||
"Comfy_Validation_Workflows": {
|
||||
"name": "ワークフローを検証"
|
||||
},
|
||||
"Comfy_WidgetControlMode": {
|
||||
"name": "ウィジェット制御モード",
|
||||
"options": {
|
||||
"after": "後",
|
||||
"before": "前"
|
||||
},
|
||||
"tooltip": "ウィジェットの値が更新されるタイミングを制御します(ランダム化/インクリメント/デクリメント)、プロンプトがキューに入れられる前または後のいずれかです。"
|
||||
},
|
||||
"Comfy_Window_UnloadConfirmation": {
|
||||
"name": "ウィンドウを閉じるときに確認を表示"
|
||||
},
|
||||
"Comfy_Workflow_ConfirmDelete": {
|
||||
"name": "ワークフローを削除する際に確認を表示"
|
||||
},
|
||||
"Comfy_Workflow_ShowMissingModelsWarning": {
|
||||
"name": "欠落しているモデルの警告を表示"
|
||||
},
|
||||
"Comfy_Workflow_ShowMissingNodesWarning": {
|
||||
"name": "欠落しているノードの警告を表示"
|
||||
},
|
||||
"Comfy_Workflow_SortNodeIdOnSave": {
|
||||
"name": "ワークフローを保存する際にノードIDをソート"
|
||||
},
|
||||
"Comfy_Workflow_WorkflowTabsPosition": {
|
||||
"name": "開いているワークフローの位置",
|
||||
"options": {
|
||||
"Sidebar": "サイドバー",
|
||||
"Topbar": "トップバー"
|
||||
}
|
||||
},
|
||||
"LiteGraph_Canvas_MaximumFps": {
|
||||
"name": "最大FPS",
|
||||
"tooltip": "キャンバスがレンダリングできる最大フレーム数です。スムーズさの代わりにGPU使用量を制限します。0の場合、画面のリフレッシュレートが使用されます。デフォルト:0"
|
||||
},
|
||||
"pysssss_SnapToGrid": {
|
||||
"name": "常にグリッドにスナップ"
|
||||
}
|
||||
},
|
||||
"sideToolbar": {
|
||||
"browseTemplates": "サンプルテンプレートを表示",
|
||||
"downloads": "ダウンロード",
|
||||
|
||||
@@ -249,6 +249,24 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"CLIPTextEncodePixArtAlpha": {
|
||||
"description": "テキストをエンコードし、PixArt Alphaの解像度条件を設定します。PixArt Sigmaには適用されません。",
|
||||
"display_name": "CLIPTextEncodePixArtAlpha",
|
||||
"inputs": {
|
||||
"clip": {
|
||||
"name": "clip"
|
||||
},
|
||||
"height": {
|
||||
"name": "高さ"
|
||||
},
|
||||
"text": {
|
||||
"name": "テキスト"
|
||||
},
|
||||
"width": {
|
||||
"name": "幅"
|
||||
}
|
||||
}
|
||||
},
|
||||
"CLIPTextEncodeSD3": {
|
||||
"display_name": "CLIPテキストエンコードSD3",
|
||||
"inputs": {
|
||||
@@ -650,6 +668,31 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"ConditioningStableAudio": {
|
||||
"display_name": "ConditioningStableAudio",
|
||||
"inputs": {
|
||||
"negative": {
|
||||
"name": "ネガティブ"
|
||||
},
|
||||
"positive": {
|
||||
"name": "ポジティブ"
|
||||
},
|
||||
"seconds_start": {
|
||||
"name": "秒_開始"
|
||||
},
|
||||
"seconds_total": {
|
||||
"name": "秒_合計"
|
||||
}
|
||||
},
|
||||
"outputs": {
|
||||
"0": {
|
||||
"name": "ポジティブ"
|
||||
},
|
||||
"1": {
|
||||
"name": "ネガティブ"
|
||||
}
|
||||
}
|
||||
},
|
||||
"ConditioningTimestepsRange": {
|
||||
"display_name": "タイムステップ範囲",
|
||||
"inputs": {
|
||||
@@ -4180,6 +4223,35 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"Preview3D": {
|
||||
"display_name": "3Dプレビュー",
|
||||
"inputs": {
|
||||
"bg_color": {
|
||||
"name": "背景色"
|
||||
},
|
||||
"camera_type": {
|
||||
"name": "カメラタイプ"
|
||||
},
|
||||
"light_intensity": {
|
||||
"name": "光の強度"
|
||||
},
|
||||
"material": {
|
||||
"name": "マテリアル"
|
||||
},
|
||||
"model_file": {
|
||||
"name": "モデルファイル"
|
||||
},
|
||||
"show_grid": {
|
||||
"name": "グリッドを表示"
|
||||
},
|
||||
"up_direction": {
|
||||
"name": "上方向"
|
||||
},
|
||||
"view": {
|
||||
"name": "ビュー"
|
||||
}
|
||||
}
|
||||
},
|
||||
"PreviewAudio": {
|
||||
"display_name": "オーディオプレビュー",
|
||||
"inputs": {
|
||||
@@ -5215,6 +5287,14 @@
|
||||
"samples": {
|
||||
"name": "サンプル"
|
||||
},
|
||||
"temporal_overlap": {
|
||||
"name": "temporal_overlap",
|
||||
"tooltip": "ビデオVAE専用:重複するフレームの数。"
|
||||
},
|
||||
"temporal_size": {
|
||||
"name": "temporal_size",
|
||||
"tooltip": "ビデオVAE専用:一度にデコードするフレームの数。"
|
||||
},
|
||||
"tile_size": {
|
||||
"name": "タイルサイズ"
|
||||
},
|
||||
@@ -5265,9 +5345,20 @@
|
||||
"VAEEncodeTiled": {
|
||||
"display_name": "VAEエンコード(タイル)",
|
||||
"inputs": {
|
||||
"overlap": {
|
||||
"name": "オーバーラップ"
|
||||
},
|
||||
"pixels": {
|
||||
"name": "ピクセル"
|
||||
},
|
||||
"temporal_overlap": {
|
||||
"name": "temporal_overlap",
|
||||
"tooltip": "ビデオVAE専用:重複するフレームの数。"
|
||||
},
|
||||
"temporal_size": {
|
||||
"name": "temporal_size",
|
||||
"tooltip": "ビデオVAE専用:一度にエンコードするフレームの数。"
|
||||
},
|
||||
"tile_size": {
|
||||
"name": "タイルサイズ"
|
||||
},
|
||||
|
||||
344
src/locales/ja/settings.json
Normal file
344
src/locales/ja/settings.json
Normal file
@@ -0,0 +1,344 @@
|
||||
{
|
||||
"Comfy-Desktop_AutoUpdate": {
|
||||
"name": "自動的に更新を確認する"
|
||||
},
|
||||
"Comfy-Desktop_SendStatistics": {
|
||||
"name": "匿名のクラッシュレポートを送信する"
|
||||
},
|
||||
"Comfy_ColorPalette": {
|
||||
"name": "カラーパレット"
|
||||
},
|
||||
"Comfy_ConfirmClear": {
|
||||
"name": "ワークフローをクリアする際に確認を要求する"
|
||||
},
|
||||
"Comfy_DOMClippingEnabled": {
|
||||
"name": "DOM要素のクリッピングを有効にする(有効にするとパフォーマンスが低下する可能性があります)"
|
||||
},
|
||||
"Comfy_DevMode": {
|
||||
"name": "開発モードオプションを有効にする(API保存など)"
|
||||
},
|
||||
"Comfy_DisableFloatRounding": {
|
||||
"name": "デフォルトの浮動小数点ウィジェットの丸めを無効にする。",
|
||||
"tooltip": "(ページの再読み込みが必要) バックエンドのノードで丸めが設定されている場合、丸めを無効にすることはできません。"
|
||||
},
|
||||
"Comfy_DisableSliders": {
|
||||
"name": "ノードウィジェットスライダーを無効にする"
|
||||
},
|
||||
"Comfy_EditAttention_Delta": {
|
||||
"name": "Ctrl+上/下の精度"
|
||||
},
|
||||
"Comfy_EnableTooltips": {
|
||||
"name": "ツールチップを有効にする"
|
||||
},
|
||||
"Comfy_EnableWorkflowViewRestore": {
|
||||
"name": "ワークフロー内のキャンバスの位置とズームレベルを保存および復元する"
|
||||
},
|
||||
"Comfy_Extension_Disabled": {
|
||||
"name": "無効な拡張機能名"
|
||||
},
|
||||
"Comfy_FloatRoundingPrecision": {
|
||||
"name": "浮動小数点ウィジェットの丸め小数点数 [0 = 自動]。",
|
||||
"tooltip": "(ページの再読み込みが必要)"
|
||||
},
|
||||
"Comfy_Graph_CanvasInfo": {
|
||||
"name": "左下隅にキャンバス情報を表示する(fpsなど)"
|
||||
},
|
||||
"Comfy_Graph_CanvasMenu": {
|
||||
"name": "グラフキャンバスメニューを表示する"
|
||||
},
|
||||
"Comfy_Graph_CtrlShiftZoom": {
|
||||
"name": "ファストズームショートカットを有効にする(Ctrl + Shift + ドラッグ)"
|
||||
},
|
||||
"Comfy_Graph_LinkMarkers": {
|
||||
"name": "リンク中点マーカー",
|
||||
"options": {
|
||||
"Arrow": "矢印",
|
||||
"Circle": "円",
|
||||
"None": "なし"
|
||||
}
|
||||
},
|
||||
"Comfy_Graph_ZoomSpeed": {
|
||||
"name": "キャンバスズーム速度"
|
||||
},
|
||||
"Comfy_GroupSelectedNodes_Padding": {
|
||||
"name": "選択したノードのパディング"
|
||||
},
|
||||
"Comfy_Group_DoubleClickTitleToEdit": {
|
||||
"name": "グループタイトルをダブルクリックして編集"
|
||||
},
|
||||
"Comfy_InvertMenuScrolling": {
|
||||
"name": "コンテキストメニューのスクロールを反転する"
|
||||
},
|
||||
"Comfy_Keybinding_NewBindings": {
|
||||
"name": "ユーザーによって設定されたキー割り当て"
|
||||
},
|
||||
"Comfy_Keybinding_UnsetBindings": {
|
||||
"name": "ユーザーによって解除されたキー割り当て"
|
||||
},
|
||||
"Comfy_LinkRelease_Action": {
|
||||
"name": "リンクリリース時のアクション(修飾子なし)",
|
||||
"options": {
|
||||
"context menu": "コンテキストメニュー",
|
||||
"no action": "アクションなし",
|
||||
"search box": "検索ボックス"
|
||||
}
|
||||
},
|
||||
"Comfy_LinkRelease_ActionShift": {
|
||||
"name": "リンクリリース時のアクション(Shift)",
|
||||
"options": {
|
||||
"context menu": "コンテキストメニュー",
|
||||
"no action": "アクションなし",
|
||||
"search box": "検索ボックス"
|
||||
}
|
||||
},
|
||||
"Comfy_LinkRenderMode": {
|
||||
"name": "リンクレンダーモード",
|
||||
"options": {
|
||||
"Hidden": "隠す",
|
||||
"Linear": "リニア",
|
||||
"Spline": "スプライン",
|
||||
"Straight": "ストレート"
|
||||
}
|
||||
},
|
||||
"Comfy_Locale": {
|
||||
"name": "言語"
|
||||
},
|
||||
"Comfy_MaskEditor_BrushAdjustmentSpeed": {
|
||||
"name": "ブラシ調整速度の倍率",
|
||||
"tooltip": "調整時にブラシのサイズと硬さがどれだけ速く変化するかを制御します。値が高いほど、変化が速くなります。"
|
||||
},
|
||||
"Comfy_MaskEditor_UseDominantAxis": {
|
||||
"name": "ブラシ調整を優先軸に固定する",
|
||||
"tooltip": "有効にすると、ブラシの調整は、どの方向に多く動かすかに基づいて、サイズまたは硬さのいずれかにのみ影響します。"
|
||||
},
|
||||
"Comfy_MaskEditor_UseNewEditor": {
|
||||
"name": "新しいマスクエディタを使用する",
|
||||
"tooltip": "新しいマスクエディタインターフェースに切り替えます。"
|
||||
},
|
||||
"Comfy_MenuPosition": {
|
||||
"name": "レガシーメニューの位置を保存"
|
||||
},
|
||||
"Comfy_ModelLibrary_AutoLoadAll": {
|
||||
"name": "すべてのモデルフォルダーを自動的に読み込む",
|
||||
"tooltip": "trueの場合、モデルライブラリを開くとすぐにすべてのフォルダーが読み込まれます(これにより読み込み中に遅延が発生する可能性があります)。falseの場合、ルートレベルのモデルフォルダーはクリックするまで読み込まれません。"
|
||||
},
|
||||
"Comfy_ModelLibrary_NameFormat": {
|
||||
"name": "モデルライブラリツリービューに表示する名前",
|
||||
"options": {
|
||||
"filename": "ファイル名",
|
||||
"title": "タイトル"
|
||||
},
|
||||
"tooltip": "\"ファイル名\"を選択すると、モデルリストにディレクトリや\".safetensors\"拡張子なしの生のファイル名の簡略化されたビューが表示されます。\"タイトル\"を選択すると、設定可能なモデルメタデータタイトルが表示されます。"
|
||||
},
|
||||
"Comfy_NodeBadge_NodeIdBadgeMode": {
|
||||
"name": "ノードIDバッジモード",
|
||||
"options": {
|
||||
"None": "なし",
|
||||
"Show all": "すべて表示"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeBadge_NodeLifeCycleBadgeMode": {
|
||||
"name": "ノードライフサイクルバッジモード",
|
||||
"options": {
|
||||
"None": "なし",
|
||||
"Show all": "すべて表示"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeBadge_NodeSourceBadgeMode": {
|
||||
"name": "ノードソースバッジモード",
|
||||
"options": {
|
||||
"Hide built-in": "組み込みを隠す",
|
||||
"None": "なし",
|
||||
"Show all": "すべて表示"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeInputConversionSubmenus": {
|
||||
"name": "ノードのコンテキストメニューに、入力/ウィジェット間の変換を行うエントリをサブメニューに配置します。"
|
||||
},
|
||||
"Comfy_NodeLibrary_Bookmarks": {
|
||||
"name": "ノードライブラリのブックマーク(非推奨)"
|
||||
},
|
||||
"Comfy_NodeLibrary_BookmarksCustomization": {
|
||||
"name": "ノードライブラリのブックマークカスタマイズ"
|
||||
},
|
||||
"Comfy_NodeLibrary_Bookmarks_V2": {
|
||||
"name": "ユニークな名前のノードライブラリのブックマークv2"
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl": {
|
||||
"name": "ノード検索ボックスの実装",
|
||||
"options": {
|
||||
"default": "デフォルト",
|
||||
"litegraph (legacy)": "litegraph (レガシー)"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_NodePreview": {
|
||||
"name": "ノードプレビュー",
|
||||
"tooltip": "デフォルトの実装にのみ適用されます"
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_ShowCategory": {
|
||||
"name": "検索結果にノードカテゴリを表示",
|
||||
"tooltip": "デフォルトの実装にのみ適用されます"
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_ShowIdName": {
|
||||
"name": "検索結果にノードID名を表示",
|
||||
"tooltip": "デフォルトの実装にのみ適用されます"
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_ShowNodeFrequency": {
|
||||
"name": "検索結果にノード頻度を表示",
|
||||
"tooltip": "デフォルトの実装にのみ適用されます"
|
||||
},
|
||||
"Comfy_NodeSuggestions_number": {
|
||||
"name": "ノード提案の数",
|
||||
"tooltip": "ライトグラフの検索ボックス/コンテキストメニュー専用"
|
||||
},
|
||||
"Comfy_Node_AutoSnapLinkToSlot": {
|
||||
"name": "ノードスロットにリンクを自動スナップ",
|
||||
"tooltip": "ノードの上にリンクをドラッグすると、リンクがノードの有効な入力スロットに自動的にスナップします"
|
||||
},
|
||||
"Comfy_Node_BypassAllLinksOnDelete": {
|
||||
"name": "ノード削除時にすべてのリンクを保持",
|
||||
"tooltip": "ノードを削除する際、削除されたノードをバイパスしてすべての入力および出力リンクを再接続しようとします"
|
||||
},
|
||||
"Comfy_Node_DoubleClickTitleToEdit": {
|
||||
"name": "ノードタイトルをダブルクリックして編集"
|
||||
},
|
||||
"Comfy_Node_MiddleClickRerouteNode": {
|
||||
"name": "ミドルクリックで新しいリルートノードを作成"
|
||||
},
|
||||
"Comfy_Node_Opacity": {
|
||||
"name": "ノードの不透明度"
|
||||
},
|
||||
"Comfy_Node_ShowDeprecated": {
|
||||
"name": "検索で非推奨ノードを表示",
|
||||
"tooltip": "非推奨ノードはデフォルトでUIに隠されていますが、それを使用する既存のワークフローでは機能し続けます。"
|
||||
},
|
||||
"Comfy_Node_ShowExperimental": {
|
||||
"name": "検索で実験的ノードを表示",
|
||||
"tooltip": "実験的ノードはUIでそのようにマークされており、将来のバージョンで大幅な変更や削除の対象となる可能性があります。生産ワークフローでの使用には注意が必要です"
|
||||
},
|
||||
"Comfy_Node_SnapHighlightsNode": {
|
||||
"name": "スナップハイライトノード",
|
||||
"tooltip": "有効な入力スロットを持つノードの上にリンクをドラッグすると、ノードがハイライトされます"
|
||||
},
|
||||
"Comfy_Pointer_ClickBufferTime": {
|
||||
"name": "ポインタークリックドリフト遅延",
|
||||
"tooltip": "ポインターボタンを押した後、ポインタの動きが無視される最大時間(ミリ秒単位)です。\n\nクリック中にポインタが移動した場合、オブジェクトが意図せず動かされるのを防ぎます。"
|
||||
},
|
||||
"Comfy_Pointer_ClickDrift": {
|
||||
"name": "ポインタークリックドリフト(最大距離)",
|
||||
"tooltip": "ボタンを押し続けている間にポインタがこの距離以上移動した場合、クリックではなくドラッグと見なされます。\n\nクリック中にポインタが移動した場合、オブジェクトが意図せず動かされるのを防ぎます。"
|
||||
},
|
||||
"Comfy_Pointer_DoubleClickTime": {
|
||||
"name": "ダブルクリック間隔(最大)",
|
||||
"tooltip": "ダブルクリックの2回のクリック間の最大時間(ミリ秒単位)。この値を増やすことで、ダブルクリックが時々登録されない場合に助けになるかもしれません。"
|
||||
},
|
||||
"Comfy_PreviewFormat": {
|
||||
"name": "プレビュー画像フォーマット",
|
||||
"tooltip": "画像ウィジェットでプレビューを表示する際、軽量画像に変換します(例:webp、jpeg、webp;50など)。"
|
||||
},
|
||||
"Comfy_PromptFilename": {
|
||||
"name": "ワークフローを保存する際にファイル名を入力するよう促す"
|
||||
},
|
||||
"Comfy_QueueButton_BatchCountLimit": {
|
||||
"name": "バッチ数制限",
|
||||
"tooltip": "1回のボタンクリックでキューに追加できるタスクの最大数"
|
||||
},
|
||||
"Comfy_Queue_ImageFit": {
|
||||
"name": "キュー画像フィット"
|
||||
},
|
||||
"Comfy_Queue_MaxHistoryItems": {
|
||||
"name": "キュー履歴サイズ",
|
||||
"tooltip": "キュー履歴に表示されるタスクの最大数。"
|
||||
},
|
||||
"Comfy_RerouteBeta": {
|
||||
"name": "リルートベータテストに参加する",
|
||||
"tooltip": "新しいネイティブリルートを有効にします。\n\nリルートは、リンクラインからドラッグしながらaltを押すか、リンクメニューで追加できます。\n\nこのオプションを無効にしても破壊的ではなく、リルートは隠されます。"
|
||||
},
|
||||
"Comfy_Server_LaunchArgs": {
|
||||
"name": "サーバー起動引数",
|
||||
"tooltip": "これらは、サーバーが起動されるときに渡される実際の引数です。"
|
||||
},
|
||||
"Comfy_Server_ServerConfigValues": {
|
||||
"name": "フロントエンド表示用のサーバー設定値",
|
||||
"tooltip": "フロントエンド表示のみに使用されるサーバー設定値"
|
||||
},
|
||||
"Comfy_Sidebar_Location": {
|
||||
"name": "サイドバーの位置",
|
||||
"options": {
|
||||
"left": "左",
|
||||
"right": "右"
|
||||
}
|
||||
},
|
||||
"Comfy_Sidebar_Size": {
|
||||
"name": "サイドバーのサイズ",
|
||||
"options": {
|
||||
"normal": "通常",
|
||||
"small": "小"
|
||||
}
|
||||
},
|
||||
"Comfy_SnapToGrid_GridSize": {
|
||||
"name": "グリッドサイズにスナップ",
|
||||
"tooltip": "シフトを押しながらノードをドラッグおよびサイズ変更すると、グリッドに整列されます。これにより、そのグリッドのサイズが制御されます。"
|
||||
},
|
||||
"Comfy_TextareaWidget_FontSize": {
|
||||
"name": "テキストエリアウィジェットのフォントサイズ"
|
||||
},
|
||||
"Comfy_TextareaWidget_Spellcheck": {
|
||||
"name": "テキストエリアウィジェットのスペルチェック"
|
||||
},
|
||||
"Comfy_TreeExplorer_ItemPadding": {
|
||||
"name": "ツリーエクスプローラーアイテムのパディング"
|
||||
},
|
||||
"Comfy_UseNewMenu": {
|
||||
"name": "新しいメニューを使用",
|
||||
"options": {
|
||||
"Bottom": "下",
|
||||
"Disabled": "無効",
|
||||
"Top": "上"
|
||||
}
|
||||
},
|
||||
"Comfy_Validation_NodeDefs": {
|
||||
"name": "ノード定義を検証(遅い)",
|
||||
"tooltip": "ノード開発者に推奨されます。これにより、起動時にすべてのノード定義が検証されます。"
|
||||
},
|
||||
"Comfy_Validation_Workflows": {
|
||||
"name": "ワークフローを検証"
|
||||
},
|
||||
"Comfy_WidgetControlMode": {
|
||||
"name": "ウィジェット制御モード",
|
||||
"options": {
|
||||
"after": "後",
|
||||
"before": "前"
|
||||
},
|
||||
"tooltip": "ウィジェットの値が更新されるタイミングを制御します(ランダム化/インクリメント/デクリメント)、プロンプトがキューに入れられる前または後のいずれかです。"
|
||||
},
|
||||
"Comfy_Window_UnloadConfirmation": {
|
||||
"name": "ウィンドウを閉じるときに確認を表示"
|
||||
},
|
||||
"Comfy_Workflow_ConfirmDelete": {
|
||||
"name": "ワークフローを削除する際に確認を表示"
|
||||
},
|
||||
"Comfy_Workflow_ShowMissingModelsWarning": {
|
||||
"name": "欠落しているモデルの警告を表示"
|
||||
},
|
||||
"Comfy_Workflow_ShowMissingNodesWarning": {
|
||||
"name": "欠落しているノードの警告を表示"
|
||||
},
|
||||
"Comfy_Workflow_SortNodeIdOnSave": {
|
||||
"name": "ワークフローを保存する際にノードIDをソート"
|
||||
},
|
||||
"Comfy_Workflow_WorkflowTabsPosition": {
|
||||
"name": "開いているワークフローの位置",
|
||||
"options": {
|
||||
"Sidebar": "サイドバー",
|
||||
"Topbar": "トップバー"
|
||||
}
|
||||
},
|
||||
"LiteGraph_Canvas_MaximumFps": {
|
||||
"name": "最大FPS",
|
||||
"tooltip": "キャンバスがレンダリングできる最大フレーム数です。スムーズさの代わりにGPU使用量を制限します。0の場合、画面のリフレッシュレートが使用されます。デフォルト:0"
|
||||
},
|
||||
"pysssss_SnapToGrid": {
|
||||
"name": "常にグリッドにスナップ"
|
||||
}
|
||||
}
|
||||
@@ -95,6 +95,9 @@
|
||||
"Comfy_GroupNode_UngroupSelectedGroupNodes": {
|
||||
"label": "선택한 그룹 노드 분리"
|
||||
},
|
||||
"Comfy_Help_AboutComfyUI": {
|
||||
"label": "ComfyUI 정보 열기"
|
||||
},
|
||||
"Comfy_Help_OpenComfyOrgDiscord": {
|
||||
"label": "Comfy-Org 디스코드 열기"
|
||||
},
|
||||
|
||||
@@ -65,10 +65,12 @@
|
||||
"g": {
|
||||
"about": "정보",
|
||||
"add": "추가",
|
||||
"back": "뒤로",
|
||||
"cancel": "취소",
|
||||
"close": "닫기",
|
||||
"color": "색상",
|
||||
"comingSoon": "곧 출시 예정",
|
||||
"command": "명령",
|
||||
"confirm": "확인",
|
||||
"copyToClipboard": "클립보드에 복사",
|
||||
"currentUser": "현재 사용자",
|
||||
@@ -77,8 +79,10 @@
|
||||
"delete": "삭제",
|
||||
"deprecated": "사용 중단",
|
||||
"devices": "장치",
|
||||
"disableAll": "모두 비활성화",
|
||||
"download": "다운로드",
|
||||
"empty": "비어 있음",
|
||||
"enableAll": "모두 활성화",
|
||||
"error": "오류",
|
||||
"experimental": "베타",
|
||||
"extensionName": "확장 이름",
|
||||
@@ -88,11 +92,14 @@
|
||||
"icon": "아이콘",
|
||||
"imageFailedToLoad": "이미지를 로드하지 못했습니다.",
|
||||
"insert": "삽입",
|
||||
"install": "설치",
|
||||
"keybinding": "키 바인딩",
|
||||
"loadAllFolders": "모든 폴더 로드",
|
||||
"loadWorkflow": "워크플로우 로드",
|
||||
"loading": "로딩 중",
|
||||
"logs": "로그",
|
||||
"newFolder": "새 폴더",
|
||||
"next": "다음",
|
||||
"no": "아니오",
|
||||
"noResultsFound": "결과를 찾을 수 없습니다.",
|
||||
"noTasksFound": "작업을 찾을 수 없습니다.",
|
||||
@@ -122,6 +129,7 @@
|
||||
"showReport": "보고서 보기",
|
||||
"systemInfo": "시스템 정보",
|
||||
"terminal": "터미널",
|
||||
"upload": "업로드",
|
||||
"videoFailedToLoad": "비디오를 로드하지 못했습니다."
|
||||
},
|
||||
"graphCanvasMenu": {
|
||||
@@ -151,9 +159,10 @@
|
||||
"install": {
|
||||
"appDataLocationTooltip": "ComfyUI의 앱 데이터 디렉토리. 저장소:\n- 로그\n- 서버 구성",
|
||||
"appPathLocationTooltip": "ComfyUI의 앱 에셋 디렉토리. ComfyUI 코드 및 에셋을 저장합니다.",
|
||||
"cannotWrite": "선택한 경로에 쓸 수 없습니다",
|
||||
"chooseInstallationLocation": "설치 위치 선택",
|
||||
"customNodes": "사용자 정의 노드",
|
||||
"customNodesDescription": "기존 ComfyUI 설치에서 사용자 정의 노드 파일을 참조하고 해당 종속성을 설치합니다.",
|
||||
"customNodesDescription": "기존 ComfyUI 설치에서 사용자 정의 노드를 다시 설치합니다.",
|
||||
"desktopAppSettings": "데스크탑 앱 설정",
|
||||
"desktopAppSettingsDescription": "ComfyUI가 데스크탑에서 어떻게 작동하는지 구성하세요. 이 설정은 나중에 변경할 수 있습니다.",
|
||||
"desktopSettings": "데스크탑 설정",
|
||||
@@ -177,6 +186,7 @@
|
||||
"installLocation": "설치 위치",
|
||||
"installLocationDescription": "ComfyUI의 사용자 데이터 디렉토리를 선택하십시오. 선택한 위치에 Python 환경이 설치됩니다. 선택한 디스크에 충분한 공간(~15GB)이 남아 있는지 확인하십시오.",
|
||||
"installLocationTooltip": "ComfyUI의 사용자 데이터 디렉토리. 저장소:\n- Python 환경\n- 모델\n- 사용자 정의 노드\n",
|
||||
"insufficientFreeSpace": "공간이 부족합니다 - 최소한의 여유 공간",
|
||||
"manualConfiguration": {
|
||||
"createVenv": "다음 디렉토리에 가상 환경을 생성해야 합니다",
|
||||
"requirements": "요구 사항",
|
||||
@@ -188,6 +198,8 @@
|
||||
"migration": "마이그레이션",
|
||||
"migrationOptional": "마이그레이션은 선택 사항입니다. 기존에 설치된 것이 없다면, 이 단계를 건너뛸 수 있습니다.",
|
||||
"migrationSourcePathDescription": "기존에 설치된 ComfyUI가 있는 경우, 기존 사용자 파일과 모델을 새 설치에 복사하거나 링크할 수 있습니다",
|
||||
"parentMissing": "경로가 존재하지 않습니다 - 먼저 포함하는 디렉토리를 생성하세요",
|
||||
"pathExists": "디렉토리가 이미 존재합니다 - 모든 데이터를 백업했는지 확인해 주세요",
|
||||
"pathValidationFailed": "경로 유효성 검사 실패",
|
||||
"selectItemsToMigrate": "마이그레이션 항목 선택",
|
||||
"settings": {
|
||||
@@ -209,7 +221,8 @@
|
||||
},
|
||||
"learnMoreAboutData": "데이터 수집에 대해 더 알아보기"
|
||||
},
|
||||
"systemLocations": "시스템 위치"
|
||||
"systemLocations": "시스템 위치",
|
||||
"unhandledError": "알 수 없는 오류"
|
||||
},
|
||||
"menu": {
|
||||
"autoQueue": "자동 큐",
|
||||
@@ -235,6 +248,7 @@
|
||||
"toggleBottomPanel": "하단 패널 전환"
|
||||
},
|
||||
"menuLabels": {
|
||||
"About ComfyUI": "ComfyUI에 대하여",
|
||||
"Browse Templates": "템플릿 탐색",
|
||||
"Bypass/Unbypass Selected Nodes": "선택한 노드 우회/우회 해제",
|
||||
"Canvas Toggle Link Visibility": "캔버스 토글 링크 가시성",
|
||||
@@ -560,353 +574,6 @@
|
||||
"Window": "창",
|
||||
"Workflow": "워크플로"
|
||||
},
|
||||
"settingsDialog": {
|
||||
"Comfy-Desktop_AutoUpdate": {
|
||||
"name": "자동 업데이트 확인"
|
||||
},
|
||||
"Comfy-Desktop_SendStatistics": {
|
||||
"name": "익명으로 충돌 보고서 전송"
|
||||
},
|
||||
"Comfy_ColorPalette": {
|
||||
"name": "색상 팔레트"
|
||||
},
|
||||
"Comfy_ConfirmClear": {
|
||||
"name": "워크플로 비우기 시 확인 요구"
|
||||
},
|
||||
"Comfy_DOMClippingEnabled": {
|
||||
"name": "DOM 요소 클리핑 활성화 (활성화 시 성능 저하 가능)"
|
||||
},
|
||||
"Comfy_DevMode": {
|
||||
"name": "개발자 모드 옵션 활성화 (API 저장 등)"
|
||||
},
|
||||
"Comfy_DisableFloatRounding": {
|
||||
"name": "기본 부동 소수점 위젯 반올림 비활성화",
|
||||
"tooltip": "(페이지 새로 고침 필요) 백엔드에서 노드에 의해 설정된 반올림이 있을 때 반올림을 비활성화할 수 없습니다."
|
||||
},
|
||||
"Comfy_DisableSliders": {
|
||||
"name": "노드 위젯 슬라이더 비활성화"
|
||||
},
|
||||
"Comfy_EditAttention_Delta": {
|
||||
"name": "Ctrl+위/아래 정밀도"
|
||||
},
|
||||
"Comfy_EnableTooltips": {
|
||||
"name": "툴팁 활성화"
|
||||
},
|
||||
"Comfy_EnableWorkflowViewRestore": {
|
||||
"name": "워크플로에서 캔버스 위치 및 확대/축소 수준 저장 및 복원"
|
||||
},
|
||||
"Comfy_Extension_Disabled": {
|
||||
"name": "비활성화된 확장 이름"
|
||||
},
|
||||
"Comfy_FloatRoundingPrecision": {
|
||||
"name": "부동 소수점 위젯 반올림 소수 자리 수 [0 = 자동]",
|
||||
"tooltip": "(페이지 새로 고침 필요)"
|
||||
},
|
||||
"Comfy_Graph_CanvasInfo": {
|
||||
"name": "왼쪽 하단 모서리에 캔버스 정보 표시 (fps 등)"
|
||||
},
|
||||
"Comfy_Graph_CanvasMenu": {
|
||||
"name": "그래프 캔버스 메뉴 표시"
|
||||
},
|
||||
"Comfy_Graph_CtrlShiftZoom": {
|
||||
"name": "빠른 확대/축소 단축키 활성화 (Ctrl + Shift + 드래그)"
|
||||
},
|
||||
"Comfy_Graph_LinkMarkers": {
|
||||
"name": "링크 중간점 마커",
|
||||
"options": {
|
||||
"Arrow": "화살표",
|
||||
"Circle": "원",
|
||||
"None": "없음"
|
||||
}
|
||||
},
|
||||
"Comfy_Graph_ZoomSpeed": {
|
||||
"name": "캔버스 확대/축소 속도"
|
||||
},
|
||||
"Comfy_GroupSelectedNodes_Padding": {
|
||||
"name": "선택된 노드 패딩"
|
||||
},
|
||||
"Comfy_Group_DoubleClickTitleToEdit": {
|
||||
"name": "그룹 제목을 두 번 클릭하여 편집"
|
||||
},
|
||||
"Comfy_InvertMenuScrolling": {
|
||||
"name": "컨텍스트 메뉴 스크롤 반전"
|
||||
},
|
||||
"Comfy_Keybinding_NewBindings": {
|
||||
"name": "사용자가 설정한 키 바인딩"
|
||||
},
|
||||
"Comfy_Keybinding_UnsetBindings": {
|
||||
"name": "사용자가 해제한 키 바인딩"
|
||||
},
|
||||
"Comfy_LinkRelease_Action": {
|
||||
"name": "링크 해제 시 동작 (수정자 없음)",
|
||||
"options": {
|
||||
"context menu": "컨텍스트 메뉴",
|
||||
"no action": "작업 없음",
|
||||
"search box": "검색 상자"
|
||||
}
|
||||
},
|
||||
"Comfy_LinkRelease_ActionShift": {
|
||||
"name": "링크 해제 시 동작 (Shift)",
|
||||
"options": {
|
||||
"context menu": "컨텍스트 메뉴",
|
||||
"no action": "작업 없음",
|
||||
"search box": "검색 상자"
|
||||
}
|
||||
},
|
||||
"Comfy_LinkRenderMode": {
|
||||
"name": "링크 렌더 모드",
|
||||
"options": {
|
||||
"Hidden": "숨김",
|
||||
"Linear": "선형",
|
||||
"Spline": "스플라인",
|
||||
"Straight": "직선"
|
||||
}
|
||||
},
|
||||
"Comfy_Locale": {
|
||||
"name": "언어"
|
||||
},
|
||||
"Comfy_MaskEditor_BrushAdjustmentSpeed": {
|
||||
"name": "브러시 조정 속도 배수",
|
||||
"tooltip": "조정할 때 브러시 크기와 경도가 얼마나 빨리 변하는지를 제어합니다. 값이 높을수록 변화가 더 빠릅니다."
|
||||
},
|
||||
"Comfy_MaskEditor_UseDominantAxis": {
|
||||
"name": "브러시 조정을 지배 축에 고정",
|
||||
"tooltip": "활성화하면 브러시 조정이 이동하는 방향에 따라 크기 또는 경도에만 영향을 미칩니다."
|
||||
},
|
||||
"Comfy_MaskEditor_UseNewEditor": {
|
||||
"name": "새 마스크 편집기 사용",
|
||||
"tooltip": "새 마스크 편집기 인터페이스로 전환"
|
||||
},
|
||||
"Comfy_MenuPosition": {
|
||||
"name": "구식 메뉴의 위치 저장"
|
||||
},
|
||||
"Comfy_ModelLibrary_AutoLoadAll": {
|
||||
"name": "모든 모델 폴더 자동 로드",
|
||||
"tooltip": "참이면 모든 폴더가 모델 라이브러리를 열 때 즉시 로드됩니다 (로드하는 동안 지연이 발생할 수 있습니다). 거짓이면 루트 수준 모델 폴더는 클릭할 때만 로드됩니다."
|
||||
},
|
||||
"Comfy_ModelLibrary_NameFormat": {
|
||||
"name": "모델 라이브러리 트리 뷰에 표시할 이름",
|
||||
"options": {
|
||||
"filename": "파일 이름",
|
||||
"title": "제목"
|
||||
},
|
||||
"tooltip": "\"파일 이름\"을 선택하면 모델 목록에서 원시 파일 이름(디렉토리 또는 \".safetensors\" 확장자 없이)의 단순화된 뷰가 렌더링됩니다. \"제목\"을 선택하면 구성 가능한 모델 메타데이터 제목이 표시됩니다."
|
||||
},
|
||||
"Comfy_NodeBadge_NodeIdBadgeMode": {
|
||||
"name": "노드 ID 배지 모드",
|
||||
"options": {
|
||||
"None": "없음",
|
||||
"Show all": "모두 표시"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeBadge_NodeLifeCycleBadgeMode": {
|
||||
"name": "노드 생명 주기 배지 모드",
|
||||
"options": {
|
||||
"None": "없음",
|
||||
"Show all": "모두 표시"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeBadge_NodeSourceBadgeMode": {
|
||||
"name": "노드 출처 배지 모드",
|
||||
"options": {
|
||||
"Hide built-in": "내장 숨기기",
|
||||
"None": "없음",
|
||||
"Show all": "모두 표시"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeInputConversionSubmenus": {
|
||||
"name": "노드 컨텍스트 메뉴에서 입력/위젯 간 변환 항목을 하위 메뉴에 배치합니다."
|
||||
},
|
||||
"Comfy_NodeLibrary_Bookmarks": {
|
||||
"name": "노드 라이브러리 북마크 (지원 중단)"
|
||||
},
|
||||
"Comfy_NodeLibrary_BookmarksCustomization": {
|
||||
"name": "노드 라이브러리 북마크 사용자 정의"
|
||||
},
|
||||
"Comfy_NodeLibrary_Bookmarks_V2": {
|
||||
"name": "고유 이름을 가진 노드 라이브러리 북마크 v2"
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl": {
|
||||
"name": "노드 검색 상자 구현",
|
||||
"options": {
|
||||
"default": "기본",
|
||||
"litegraph (legacy)": "litegraph (구버전)"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_NodePreview": {
|
||||
"name": "노드 미리보기",
|
||||
"tooltip": "기본 구현에만 적용됩니다."
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_ShowCategory": {
|
||||
"name": "검색 결과에 노드 카테고리 표시",
|
||||
"tooltip": "기본 구현에만 적용됩니다."
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_ShowIdName": {
|
||||
"name": "검색 결과에 노드 ID 이름 표시",
|
||||
"tooltip": "기본 구현에만 적용됩니다."
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_ShowNodeFrequency": {
|
||||
"name": "검색 결과에 노드 빈도 표시",
|
||||
"tooltip": "기본 구현에만 적용됩니다."
|
||||
},
|
||||
"Comfy_NodeSuggestions_number": {
|
||||
"name": "노드 제안 수",
|
||||
"tooltip": "라이트그래프 검색 상자/컨텍스트 메뉴 전용"
|
||||
},
|
||||
"Comfy_Node_AutoSnapLinkToSlot": {
|
||||
"name": "링크를 노드 슬롯에 자동 스냅",
|
||||
"tooltip": "링크를 노드 위로 드래그할 때 링크가 노드의 유효한 입력 슬롯에 자동으로 스냅됩니다."
|
||||
},
|
||||
"Comfy_Node_BypassAllLinksOnDelete": {
|
||||
"name": "노드 삭제 시 모든 링크 유지",
|
||||
"tooltip": "노드를 삭제할 때 모든 입력 및 출력 링크를 재연결하려고 시도합니다 (삭제된 노드를 우회)."
|
||||
},
|
||||
"Comfy_Node_DoubleClickTitleToEdit": {
|
||||
"name": "노드 제목을 두 번 클릭하여 편집"
|
||||
},
|
||||
"Comfy_Node_MiddleClickRerouteNode": {
|
||||
"name": "중간 클릭으로 새 경로재설정 노드 생성"
|
||||
},
|
||||
"Comfy_Node_Opacity": {
|
||||
"name": "노드 불투명도"
|
||||
},
|
||||
"Comfy_Node_ShowDeprecated": {
|
||||
"name": "검색에서 지원 중단된 노드 표시",
|
||||
"tooltip": "지원 중단된 노드는 기본적으로 UI에서 숨겨지지만, 이를 사용하는 기존 워크플로에서는 여전히 기능합니다."
|
||||
},
|
||||
"Comfy_Node_ShowExperimental": {
|
||||
"name": "검색에서 실험적 노드 표시",
|
||||
"tooltip": "실험적 노드는 UI에서 그렇게 표시되며, 향후 버전에서 상당한 변경이나 제거의 대상이 될 수 있습니다. 프로덕션 워크플로에서 주의하여 사용하십시오."
|
||||
},
|
||||
"Comfy_Node_SnapHighlightsNode": {
|
||||
"name": "스냅 하이라이트 노드",
|
||||
"tooltip": "링크를 유효한 입력 슬롯이 있는 노드 위로 드래그할 때 노드를 강조 표시합니다."
|
||||
},
|
||||
"Comfy_Pointer_ClickBufferTime": {
|
||||
"name": "포인터 클릭 드리프트 지연",
|
||||
"tooltip": "포인터 버튼을 누른 후, 포인터 움직임을 무시할 수 있는 최대 시간(밀리초)입니다.\n\n클릭하는 동안 포인터가 움직여 의도치 않게 객체가 밀리는 것을 방지합니다."
|
||||
},
|
||||
"Comfy_Pointer_ClickDrift": {
|
||||
"name": "포인터 클릭 드리프트 (최대 거리)",
|
||||
"tooltip": "버튼을 누른 상태에서 포인터가 이 거리보다 더 많이 움직이면, 클릭이 아닌 드래그로 간주됩니다.\n\n클릭하는 동안 포인터가 움직여 의도치 않게 객체가 밀리는 것을 방지합니다."
|
||||
},
|
||||
"Comfy_Pointer_DoubleClickTime": {
|
||||
"name": "더블 클릭 간격 (최대)",
|
||||
"tooltip": "더블 클릭의 두 클릭 사이의 최대 시간(밀리초)입니다. 이 값을 늘리면 가끔 더블 클릭이 인식되지 않는 문제를 해결할 수 있습니다."
|
||||
},
|
||||
"Comfy_PreviewFormat": {
|
||||
"name": "미리보기 이미지 형식",
|
||||
"tooltip": "이미지 위젯에서 미리보기를 표시할 때 경량 이미지로 변환합니다. '이미지 포맷;품질' 예: webp, jpeg, webp;50 등."
|
||||
},
|
||||
"Comfy_PromptFilename": {
|
||||
"name": "워크플로 저장 시 파일 이름 프롬프트"
|
||||
},
|
||||
"Comfy_QueueButton_BatchCountLimit": {
|
||||
"name": "배치 수 제한",
|
||||
"tooltip": "한 번의 버튼 클릭으로 큐에 추가되는 최대 작업 수입니다."
|
||||
},
|
||||
"Comfy_Queue_ImageFit": {
|
||||
"name": "큐 이미지 맞춤"
|
||||
},
|
||||
"Comfy_Queue_MaxHistoryItems": {
|
||||
"name": "큐 기록 갯수",
|
||||
"tooltip": "큐 기록에 표시되는 최대 작업 수입니다."
|
||||
},
|
||||
"Comfy_RerouteBeta": {
|
||||
"name": "경로재설정 베타 테스트 참여",
|
||||
"tooltip": "새로운 기본 경로재설정을 활성화합니다.\n\n링크 라인에서 Alt를 누른 채 드래그하거나 링크 메뉴에서 경로재설정을 추가할 수 있습니다.\n\n이 옵션을 비활성화해도 경로재설정은 삭제되지 않고 숨겨집니다."
|
||||
},
|
||||
"Comfy_Server_LaunchArgs": {
|
||||
"name": "서버 시작 인수",
|
||||
"tooltip": "서버가 시작될 때 전달되는 실제 인수입니다."
|
||||
},
|
||||
"Comfy_Server_ServerConfigValues": {
|
||||
"name": "프론트엔드 표시를 위한 서버 구성 값",
|
||||
"tooltip": "프론트엔드 표시를 위해 사용되는 서버 구성 값만 해당됩니다."
|
||||
},
|
||||
"Comfy_Settings_ExtensionPanel": {
|
||||
"name": "설정 대화 상자에서 확장 패널 표시"
|
||||
},
|
||||
"Comfy_Sidebar_Location": {
|
||||
"name": "사이드바 위치",
|
||||
"options": {
|
||||
"left": "왼쪽",
|
||||
"right": "오른쪽"
|
||||
}
|
||||
},
|
||||
"Comfy_Sidebar_Size": {
|
||||
"name": "사이드바 크기",
|
||||
"options": {
|
||||
"normal": "보통",
|
||||
"small": "작음"
|
||||
}
|
||||
},
|
||||
"Comfy_SnapToGrid_GridSize": {
|
||||
"name": "그리드 크기에 스냅",
|
||||
"tooltip": "Shift 키를 누른 상태에서 노드를 드래그하거나 크기를 조절하면 그리드에 맞춰 정렬됩니다. 이 설정은 그리드의 크기를 제어합니다."
|
||||
},
|
||||
"Comfy_TextareaWidget_FontSize": {
|
||||
"name": "텍스트 영역 위젯 글꼴 크기"
|
||||
},
|
||||
"Comfy_TextareaWidget_Spellcheck": {
|
||||
"name": "텍스트 영역 위젯 맞춤법 검사"
|
||||
},
|
||||
"Comfy_TreeExplorer_ItemPadding": {
|
||||
"name": "트리 탐색기 항목 패딩"
|
||||
},
|
||||
"Comfy_UseNewMenu": {
|
||||
"name": "새 메뉴 사용",
|
||||
"options": {
|
||||
"Bottom": "하단",
|
||||
"Disabled": "비활성화",
|
||||
"Top": "상단"
|
||||
}
|
||||
},
|
||||
"Comfy_Validation_NodeDefs": {
|
||||
"name": "노드 정의 유효성 검사 (느림)",
|
||||
"tooltip": "노드 개발자에게 권장됩니다. 시작 시 모든 노드 정의를 유효성 검사합니다."
|
||||
},
|
||||
"Comfy_Validation_Workflows": {
|
||||
"name": "워크플로 유효성 검사"
|
||||
},
|
||||
"Comfy_WidgetControlMode": {
|
||||
"name": "위젯 제어 모드",
|
||||
"options": {
|
||||
"after": "다음",
|
||||
"before": "이전"
|
||||
},
|
||||
"tooltip": "위젯 값이 업데이트되는 시점을 제어합니다 (무작위화/증가/감소), 프롬프트가 큐에 추가되기 전 또는 후입니다."
|
||||
},
|
||||
"Comfy_Window_UnloadConfirmation": {
|
||||
"name": "창 닫을 때 확인 표시"
|
||||
},
|
||||
"Comfy_Workflow_ConfirmDelete": {
|
||||
"name": "워크플로 삭제 시 확인 표시"
|
||||
},
|
||||
"Comfy_Workflow_ShowMissingModelsWarning": {
|
||||
"name": "누락된 모델 경고 표시"
|
||||
},
|
||||
"Comfy_Workflow_ShowMissingNodesWarning": {
|
||||
"name": "누락된 노드 경고 표시"
|
||||
},
|
||||
"Comfy_Workflow_SortNodeIdOnSave": {
|
||||
"name": "워크플로 저장 시 노드 ID 정렬"
|
||||
},
|
||||
"Comfy_Workflow_WorkflowTabsPosition": {
|
||||
"name": "열린 워크플로 위치",
|
||||
"options": {
|
||||
"Sidebar": "사이드바",
|
||||
"Topbar": "상단바"
|
||||
}
|
||||
},
|
||||
"LiteGraph_Canvas_MaximumFps": {
|
||||
"name": "최대 FPS",
|
||||
"tooltip": "캔버스가 렌더링할 수 있는 최대 프레임 수입니다. 부드러움의 대가로 GPU 사용량을 제한합니다. 0이면 화면 새로 고침 속도가 사용됩니다. 기본값: 0"
|
||||
},
|
||||
"pysssss_SnapToGrid": {
|
||||
"name": "항상 그리드에 스냅"
|
||||
}
|
||||
},
|
||||
"sideToolbar": {
|
||||
"browseTemplates": "예제 템플릿 탐색",
|
||||
"downloads": "다운로드",
|
||||
|
||||
@@ -249,6 +249,24 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"CLIPTextEncodePixArtAlpha": {
|
||||
"description": "텍스트를 인코딩하고 PixArt Alpha의 해상도 조건을 설정합니다. PixArt Sigma에는 적용되지 않습니다.",
|
||||
"display_name": "CLIPTextEncodePixArtAlpha",
|
||||
"inputs": {
|
||||
"clip": {
|
||||
"name": "클립"
|
||||
},
|
||||
"height": {
|
||||
"name": "높이"
|
||||
},
|
||||
"text": {
|
||||
"name": "텍스트"
|
||||
},
|
||||
"width": {
|
||||
"name": "너비"
|
||||
}
|
||||
}
|
||||
},
|
||||
"CLIPTextEncodeSD3": {
|
||||
"display_name": "CLIP 텍스트 인코딩 (SD3)",
|
||||
"inputs": {
|
||||
@@ -650,6 +668,31 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"ConditioningStableAudio": {
|
||||
"display_name": "ConditioningStableAudio",
|
||||
"inputs": {
|
||||
"negative": {
|
||||
"name": "부정적"
|
||||
},
|
||||
"positive": {
|
||||
"name": "긍정적"
|
||||
},
|
||||
"seconds_start": {
|
||||
"name": "초 시작"
|
||||
},
|
||||
"seconds_total": {
|
||||
"name": "총 초"
|
||||
}
|
||||
},
|
||||
"outputs": {
|
||||
"0": {
|
||||
"name": "긍정적"
|
||||
},
|
||||
"1": {
|
||||
"name": "부정적"
|
||||
}
|
||||
}
|
||||
},
|
||||
"ConditioningTimestepsRange": {
|
||||
"display_name": "조건 (타임스텝 범위)",
|
||||
"inputs": {
|
||||
@@ -4180,6 +4223,35 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"Preview3D": {
|
||||
"display_name": "3D 미리보기",
|
||||
"inputs": {
|
||||
"bg_color": {
|
||||
"name": "배경색"
|
||||
},
|
||||
"camera_type": {
|
||||
"name": "카메라 유형"
|
||||
},
|
||||
"light_intensity": {
|
||||
"name": "빛의 강도"
|
||||
},
|
||||
"material": {
|
||||
"name": "재료"
|
||||
},
|
||||
"model_file": {
|
||||
"name": "모델 파일"
|
||||
},
|
||||
"show_grid": {
|
||||
"name": "그리드 표시"
|
||||
},
|
||||
"up_direction": {
|
||||
"name": "위 방향"
|
||||
},
|
||||
"view": {
|
||||
"name": "보기"
|
||||
}
|
||||
}
|
||||
},
|
||||
"PreviewAudio": {
|
||||
"display_name": "오디오 미리듣기",
|
||||
"inputs": {
|
||||
@@ -5215,6 +5287,14 @@
|
||||
"samples": {
|
||||
"name": "샘플"
|
||||
},
|
||||
"temporal_overlap": {
|
||||
"name": "temporal_overlap",
|
||||
"tooltip": "비디오 VAE에만 사용됩니다: 겹치는 프레임의 양."
|
||||
},
|
||||
"temporal_size": {
|
||||
"name": "temporal_size",
|
||||
"tooltip": "비디오 VAE에만 사용됩니다: 한 번에 디코딩할 프레임의 양."
|
||||
},
|
||||
"tile_size": {
|
||||
"name": "타일_크기"
|
||||
},
|
||||
@@ -5265,9 +5345,20 @@
|
||||
"VAEEncodeTiled": {
|
||||
"display_name": "VAE 인코드 (타일)",
|
||||
"inputs": {
|
||||
"overlap": {
|
||||
"name": "중첩"
|
||||
},
|
||||
"pixels": {
|
||||
"name": "픽셀"
|
||||
},
|
||||
"temporal_overlap": {
|
||||
"name": "temporal_overlap",
|
||||
"tooltip": "비디오 VAE에만 사용됩니다: 겹치는 프레임의 양."
|
||||
},
|
||||
"temporal_size": {
|
||||
"name": "temporal_size",
|
||||
"tooltip": "비디오 VAE에만 사용됩니다: 한 번에 인코딩할 프레임의 양."
|
||||
},
|
||||
"tile_size": {
|
||||
"name": "타일_크기"
|
||||
},
|
||||
|
||||
344
src/locales/ko/settings.json
Normal file
344
src/locales/ko/settings.json
Normal file
@@ -0,0 +1,344 @@
|
||||
{
|
||||
"Comfy-Desktop_AutoUpdate": {
|
||||
"name": "자동 업데이트 확인"
|
||||
},
|
||||
"Comfy-Desktop_SendStatistics": {
|
||||
"name": "익명으로 충돌 보고서 전송"
|
||||
},
|
||||
"Comfy_ColorPalette": {
|
||||
"name": "색상 팔레트"
|
||||
},
|
||||
"Comfy_ConfirmClear": {
|
||||
"name": "워크플로 비우기 시 확인 요구"
|
||||
},
|
||||
"Comfy_DOMClippingEnabled": {
|
||||
"name": "DOM 요소 클리핑 활성화 (활성화 시 성능 저하 가능)"
|
||||
},
|
||||
"Comfy_DevMode": {
|
||||
"name": "개발자 모드 옵션 활성화 (API 저장 등)"
|
||||
},
|
||||
"Comfy_DisableFloatRounding": {
|
||||
"name": "기본 부동 소수점 위젯 반올림 비활성화",
|
||||
"tooltip": "(페이지 새로 고침 필요) 백엔드에서 노드에 의해 설정된 반올림이 있을 때 반올림을 비활성화할 수 없습니다."
|
||||
},
|
||||
"Comfy_DisableSliders": {
|
||||
"name": "노드 위젯 슬라이더 비활성화"
|
||||
},
|
||||
"Comfy_EditAttention_Delta": {
|
||||
"name": "Ctrl+위/아래 정밀도"
|
||||
},
|
||||
"Comfy_EnableTooltips": {
|
||||
"name": "툴팁 활성화"
|
||||
},
|
||||
"Comfy_EnableWorkflowViewRestore": {
|
||||
"name": "워크플로에서 캔버스 위치 및 확대/축소 수준 저장 및 복원"
|
||||
},
|
||||
"Comfy_Extension_Disabled": {
|
||||
"name": "비활성화된 확장 이름"
|
||||
},
|
||||
"Comfy_FloatRoundingPrecision": {
|
||||
"name": "부동 소수점 위젯 반올림 소수 자리 수 [0 = 자동]",
|
||||
"tooltip": "(페이지 새로 고침 필요)"
|
||||
},
|
||||
"Comfy_Graph_CanvasInfo": {
|
||||
"name": "왼쪽 하단 모서리에 캔버스 정보 표시 (fps 등)"
|
||||
},
|
||||
"Comfy_Graph_CanvasMenu": {
|
||||
"name": "그래프 캔버스 메뉴 표시"
|
||||
},
|
||||
"Comfy_Graph_CtrlShiftZoom": {
|
||||
"name": "빠른 확대/축소 단축키 활성화 (Ctrl + Shift + 드래그)"
|
||||
},
|
||||
"Comfy_Graph_LinkMarkers": {
|
||||
"name": "링크 중간점 마커",
|
||||
"options": {
|
||||
"Arrow": "화살표",
|
||||
"Circle": "원",
|
||||
"None": "없음"
|
||||
}
|
||||
},
|
||||
"Comfy_Graph_ZoomSpeed": {
|
||||
"name": "캔버스 확대/축소 속도"
|
||||
},
|
||||
"Comfy_GroupSelectedNodes_Padding": {
|
||||
"name": "선택된 노드 패딩"
|
||||
},
|
||||
"Comfy_Group_DoubleClickTitleToEdit": {
|
||||
"name": "그룹 제목을 두 번 클릭하여 편집"
|
||||
},
|
||||
"Comfy_InvertMenuScrolling": {
|
||||
"name": "컨텍스트 메뉴 스크롤 반전"
|
||||
},
|
||||
"Comfy_Keybinding_NewBindings": {
|
||||
"name": "사용자가 설정한 키 바인딩"
|
||||
},
|
||||
"Comfy_Keybinding_UnsetBindings": {
|
||||
"name": "사용자가 해제한 키 바인딩"
|
||||
},
|
||||
"Comfy_LinkRelease_Action": {
|
||||
"name": "링크 해제 시 동작 (수정자 없음)",
|
||||
"options": {
|
||||
"context menu": "컨텍스트 메뉴",
|
||||
"no action": "작업 없음",
|
||||
"search box": "검색 상자"
|
||||
}
|
||||
},
|
||||
"Comfy_LinkRelease_ActionShift": {
|
||||
"name": "링크 해제 시 동작 (Shift)",
|
||||
"options": {
|
||||
"context menu": "컨텍스트 메뉴",
|
||||
"no action": "작업 없음",
|
||||
"search box": "검색 상자"
|
||||
}
|
||||
},
|
||||
"Comfy_LinkRenderMode": {
|
||||
"name": "링크 렌더 모드",
|
||||
"options": {
|
||||
"Hidden": "숨김",
|
||||
"Linear": "선형",
|
||||
"Spline": "스플라인",
|
||||
"Straight": "직선"
|
||||
}
|
||||
},
|
||||
"Comfy_Locale": {
|
||||
"name": "언어"
|
||||
},
|
||||
"Comfy_MaskEditor_BrushAdjustmentSpeed": {
|
||||
"name": "브러시 조정 속도 배수",
|
||||
"tooltip": "조정할 때 브러시 크기와 경도가 얼마나 빨리 변하는지를 제어합니다. 값이 높을수록 변화가 더 빠릅니다."
|
||||
},
|
||||
"Comfy_MaskEditor_UseDominantAxis": {
|
||||
"name": "브러시 조정을 지배 축에 고정",
|
||||
"tooltip": "활성화하면 브러시 조정이 이동하는 방향에 따라 크기 또는 경도에만 영향을 미칩니다."
|
||||
},
|
||||
"Comfy_MaskEditor_UseNewEditor": {
|
||||
"name": "새 마스크 편집기 사용",
|
||||
"tooltip": "새 마스크 편집기 인터페이스로 전환"
|
||||
},
|
||||
"Comfy_MenuPosition": {
|
||||
"name": "구식 메뉴의 위치 저장"
|
||||
},
|
||||
"Comfy_ModelLibrary_AutoLoadAll": {
|
||||
"name": "모든 모델 폴더 자동 로드",
|
||||
"tooltip": "참이면 모든 폴더가 모델 라이브러리를 열 때 즉시 로드됩니다 (로드하는 동안 지연이 발생할 수 있습니다). 거짓이면 루트 수준 모델 폴더는 클릭할 때만 로드됩니다."
|
||||
},
|
||||
"Comfy_ModelLibrary_NameFormat": {
|
||||
"name": "모델 라이브러리 트리 뷰에 표시할 이름",
|
||||
"options": {
|
||||
"filename": "파일 이름",
|
||||
"title": "제목"
|
||||
},
|
||||
"tooltip": "\"파일 이름\"을 선택하면 모델 목록에서 원시 파일 이름(디렉토리 또는 \".safetensors\" 확장자 없이)의 단순화된 뷰가 렌더링됩니다. \"제목\"을 선택하면 구성 가능한 모델 메타데이터 제목이 표시됩니다."
|
||||
},
|
||||
"Comfy_NodeBadge_NodeIdBadgeMode": {
|
||||
"name": "노드 ID 배지 모드",
|
||||
"options": {
|
||||
"None": "없음",
|
||||
"Show all": "모두 표시"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeBadge_NodeLifeCycleBadgeMode": {
|
||||
"name": "노드 생명 주기 배지 모드",
|
||||
"options": {
|
||||
"None": "없음",
|
||||
"Show all": "모두 표시"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeBadge_NodeSourceBadgeMode": {
|
||||
"name": "노드 출처 배지 모드",
|
||||
"options": {
|
||||
"Hide built-in": "내장 숨기기",
|
||||
"None": "없음",
|
||||
"Show all": "모두 표시"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeInputConversionSubmenus": {
|
||||
"name": "노드 컨텍스트 메뉴에서 입력/위젯 간 변환 항목을 하위 메뉴에 배치합니다."
|
||||
},
|
||||
"Comfy_NodeLibrary_Bookmarks": {
|
||||
"name": "노드 라이브러리 북마크 (지원 중단)"
|
||||
},
|
||||
"Comfy_NodeLibrary_BookmarksCustomization": {
|
||||
"name": "노드 라이브러리 북마크 사용자 정의"
|
||||
},
|
||||
"Comfy_NodeLibrary_Bookmarks_V2": {
|
||||
"name": "고유 이름을 가진 노드 라이브러리 북마크 v2"
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl": {
|
||||
"name": "노드 검색 상자 구현",
|
||||
"options": {
|
||||
"default": "기본",
|
||||
"litegraph (legacy)": "litegraph (구버전)"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_NodePreview": {
|
||||
"name": "노드 미리보기",
|
||||
"tooltip": "기본 구현에만 적용됩니다."
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_ShowCategory": {
|
||||
"name": "검색 결과에 노드 카테고리 표시",
|
||||
"tooltip": "기본 구현에만 적용됩니다."
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_ShowIdName": {
|
||||
"name": "검색 결과에 노드 ID 이름 표시",
|
||||
"tooltip": "기본 구현에만 적용됩니다."
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_ShowNodeFrequency": {
|
||||
"name": "검색 결과에 노드 빈도 표시",
|
||||
"tooltip": "기본 구현에만 적용됩니다."
|
||||
},
|
||||
"Comfy_NodeSuggestions_number": {
|
||||
"name": "노드 제안 수",
|
||||
"tooltip": "라이트그래프 검색 상자/컨텍스트 메뉴 전용"
|
||||
},
|
||||
"Comfy_Node_AutoSnapLinkToSlot": {
|
||||
"name": "링크를 노드 슬롯에 자동 스냅",
|
||||
"tooltip": "링크를 노드 위로 드래그할 때 링크가 노드의 유효한 입력 슬롯에 자동으로 스냅됩니다."
|
||||
},
|
||||
"Comfy_Node_BypassAllLinksOnDelete": {
|
||||
"name": "노드 삭제 시 모든 링크 유지",
|
||||
"tooltip": "노드를 삭제할 때 모든 입력 및 출력 링크를 재연결하려고 시도합니다 (삭제된 노드를 우회)."
|
||||
},
|
||||
"Comfy_Node_DoubleClickTitleToEdit": {
|
||||
"name": "노드 제목을 두 번 클릭하여 편집"
|
||||
},
|
||||
"Comfy_Node_MiddleClickRerouteNode": {
|
||||
"name": "중간 클릭으로 새 경로재설정 노드 생성"
|
||||
},
|
||||
"Comfy_Node_Opacity": {
|
||||
"name": "노드 불투명도"
|
||||
},
|
||||
"Comfy_Node_ShowDeprecated": {
|
||||
"name": "검색에서 지원 중단된 노드 표시",
|
||||
"tooltip": "지원 중단된 노드는 기본적으로 UI에서 숨겨지지만, 이를 사용하는 기존 워크플로에서는 여전히 기능합니다."
|
||||
},
|
||||
"Comfy_Node_ShowExperimental": {
|
||||
"name": "검색에서 실험적 노드 표시",
|
||||
"tooltip": "실험적 노드는 UI에서 그렇게 표시되며, 향후 버전에서 상당한 변경이나 제거의 대상이 될 수 있습니다. 프로덕션 워크플로에서 주의하여 사용하십시오."
|
||||
},
|
||||
"Comfy_Node_SnapHighlightsNode": {
|
||||
"name": "스냅 하이라이트 노드",
|
||||
"tooltip": "링크를 유효한 입력 슬롯이 있는 노드 위로 드래그할 때 노드를 강조 표시합니다."
|
||||
},
|
||||
"Comfy_Pointer_ClickBufferTime": {
|
||||
"name": "포인터 클릭 드리프트 지연",
|
||||
"tooltip": "포인터 버튼을 누른 후, 포인터 움직임을 무시할 수 있는 최대 시간(밀리초)입니다.\n\n클릭하는 동안 포인터가 움직여 의도치 않게 객체가 밀리는 것을 방지합니다."
|
||||
},
|
||||
"Comfy_Pointer_ClickDrift": {
|
||||
"name": "포인터 클릭 드리프트 (최대 거리)",
|
||||
"tooltip": "버튼을 누른 상태에서 포인터가 이 거리보다 더 많이 움직이면, 클릭이 아닌 드래그로 간주됩니다.\n\n클릭하는 동안 포인터가 움직여 의도치 않게 객체가 밀리는 것을 방지합니다."
|
||||
},
|
||||
"Comfy_Pointer_DoubleClickTime": {
|
||||
"name": "더블 클릭 간격 (최대)",
|
||||
"tooltip": "더블 클릭의 두 클릭 사이의 최대 시간(밀리초)입니다. 이 값을 늘리면 가끔 더블 클릭이 인식되지 않는 문제를 해결할 수 있습니다."
|
||||
},
|
||||
"Comfy_PreviewFormat": {
|
||||
"name": "미리보기 이미지 형식",
|
||||
"tooltip": "이미지 위젯에서 미리보기를 표시할 때 경량 이미지로 변환합니다. '이미지 포맷;품질' 예: webp, jpeg, webp;50 등."
|
||||
},
|
||||
"Comfy_PromptFilename": {
|
||||
"name": "워크플로 저장 시 파일 이름 프롬프트"
|
||||
},
|
||||
"Comfy_QueueButton_BatchCountLimit": {
|
||||
"name": "배치 수 제한",
|
||||
"tooltip": "한 번의 버튼 클릭으로 큐에 추가되는 최대 작업 수입니다."
|
||||
},
|
||||
"Comfy_Queue_ImageFit": {
|
||||
"name": "큐 이미지 맞춤"
|
||||
},
|
||||
"Comfy_Queue_MaxHistoryItems": {
|
||||
"name": "큐 기록 갯수",
|
||||
"tooltip": "큐 기록에 표시되는 최대 작업 수입니다."
|
||||
},
|
||||
"Comfy_RerouteBeta": {
|
||||
"name": "경로재설정 베타 테스트 참여",
|
||||
"tooltip": "새로운 기본 경로재설정을 활성화합니다.\n\n링크 라인에서 Alt를 누른 채 드래그하거나 링크 메뉴에서 경로재설정을 추가할 수 있습니다.\n\n이 옵션을 비활성화해도 경로재설정은 삭제되지 않고 숨겨집니다."
|
||||
},
|
||||
"Comfy_Server_LaunchArgs": {
|
||||
"name": "서버 시작 인수",
|
||||
"tooltip": "서버가 시작될 때 전달되는 실제 인수입니다."
|
||||
},
|
||||
"Comfy_Server_ServerConfigValues": {
|
||||
"name": "프론트엔드 표시를 위한 서버 구성 값",
|
||||
"tooltip": "프론트엔드 표시를 위해 사용되는 서버 구성 값만 해당됩니다."
|
||||
},
|
||||
"Comfy_Sidebar_Location": {
|
||||
"name": "사이드바 위치",
|
||||
"options": {
|
||||
"left": "왼쪽",
|
||||
"right": "오른쪽"
|
||||
}
|
||||
},
|
||||
"Comfy_Sidebar_Size": {
|
||||
"name": "사이드바 크기",
|
||||
"options": {
|
||||
"normal": "보통",
|
||||
"small": "작음"
|
||||
}
|
||||
},
|
||||
"Comfy_SnapToGrid_GridSize": {
|
||||
"name": "그리드 크기에 스냅",
|
||||
"tooltip": "Shift 키를 누른 상태에서 노드를 드래그하거나 크기를 조절하면 그리드에 맞춰 정렬됩니다. 이 설정은 그리드의 크기를 제어합니다."
|
||||
},
|
||||
"Comfy_TextareaWidget_FontSize": {
|
||||
"name": "텍스트 영역 위젯 글꼴 크기"
|
||||
},
|
||||
"Comfy_TextareaWidget_Spellcheck": {
|
||||
"name": "텍스트 영역 위젯 맞춤법 검사"
|
||||
},
|
||||
"Comfy_TreeExplorer_ItemPadding": {
|
||||
"name": "트리 탐색기 항목 패딩"
|
||||
},
|
||||
"Comfy_UseNewMenu": {
|
||||
"name": "새 메뉴 사용",
|
||||
"options": {
|
||||
"Bottom": "하단",
|
||||
"Disabled": "비활성화",
|
||||
"Top": "상단"
|
||||
}
|
||||
},
|
||||
"Comfy_Validation_NodeDefs": {
|
||||
"name": "노드 정의 유효성 검사 (느림)",
|
||||
"tooltip": "노드 개발자에게 권장됩니다. 시작 시 모든 노드 정의를 유효성 검사합니다."
|
||||
},
|
||||
"Comfy_Validation_Workflows": {
|
||||
"name": "워크플로 유효성 검사"
|
||||
},
|
||||
"Comfy_WidgetControlMode": {
|
||||
"name": "위젯 제어 모드",
|
||||
"options": {
|
||||
"after": "다음",
|
||||
"before": "이전"
|
||||
},
|
||||
"tooltip": "위젯 값이 업데이트되는 시점을 제어합니다 (무작위화/증가/감소), 프롬프트가 큐에 추가되기 전 또는 후입니다."
|
||||
},
|
||||
"Comfy_Window_UnloadConfirmation": {
|
||||
"name": "창 닫을 때 확인 표시"
|
||||
},
|
||||
"Comfy_Workflow_ConfirmDelete": {
|
||||
"name": "워크플로 삭제 시 확인 표시"
|
||||
},
|
||||
"Comfy_Workflow_ShowMissingModelsWarning": {
|
||||
"name": "누락된 모델 경고 표시"
|
||||
},
|
||||
"Comfy_Workflow_ShowMissingNodesWarning": {
|
||||
"name": "누락된 노드 경고 표시"
|
||||
},
|
||||
"Comfy_Workflow_SortNodeIdOnSave": {
|
||||
"name": "워크플로 저장 시 노드 ID 정렬"
|
||||
},
|
||||
"Comfy_Workflow_WorkflowTabsPosition": {
|
||||
"name": "열린 워크플로 위치",
|
||||
"options": {
|
||||
"Sidebar": "사이드바",
|
||||
"Topbar": "상단바"
|
||||
}
|
||||
},
|
||||
"LiteGraph_Canvas_MaximumFps": {
|
||||
"name": "최대 FPS",
|
||||
"tooltip": "캔버스가 렌더링할 수 있는 최대 프레임 수입니다. 부드러움의 대가로 GPU 사용량을 제한합니다. 0이면 화면 새로 고침 속도가 사용됩니다. 기본값: 0"
|
||||
},
|
||||
"pysssss_SnapToGrid": {
|
||||
"name": "항상 그리드에 스냅"
|
||||
}
|
||||
}
|
||||
@@ -95,6 +95,9 @@
|
||||
"Comfy_GroupNode_UngroupSelectedGroupNodes": {
|
||||
"label": "Разгруппировать выбранные групповые узлы"
|
||||
},
|
||||
"Comfy_Help_AboutComfyUI": {
|
||||
"label": "Открыть о ComfyUI"
|
||||
},
|
||||
"Comfy_Help_OpenComfyOrgDiscord": {
|
||||
"label": "Открыть Comfy-Org Discord"
|
||||
},
|
||||
|
||||
@@ -65,10 +65,12 @@
|
||||
"g": {
|
||||
"about": "О программе",
|
||||
"add": "Добавить",
|
||||
"back": "Назад",
|
||||
"cancel": "Отмена",
|
||||
"close": "Закрыть",
|
||||
"color": "Цвет",
|
||||
"comingSoon": "Скоро будет",
|
||||
"command": "Команда",
|
||||
"confirm": "Подтвердить",
|
||||
"copyToClipboard": "Скопировать в буфер обмена",
|
||||
"currentUser": "Текущий пользователь",
|
||||
@@ -77,8 +79,10 @@
|
||||
"delete": "Удалить",
|
||||
"deprecated": "УСТАРЕЛО",
|
||||
"devices": "Устройства",
|
||||
"disableAll": "Отключить все",
|
||||
"download": "Скачать",
|
||||
"empty": "Пусто",
|
||||
"enableAll": "Включить все",
|
||||
"error": "Ошибка",
|
||||
"experimental": "БЕТА",
|
||||
"extensionName": "Имя расширения",
|
||||
@@ -88,11 +92,14 @@
|
||||
"icon": "Иконка",
|
||||
"imageFailedToLoad": "Не удалось загрузить изображение",
|
||||
"insert": "Вставить",
|
||||
"install": "Установить",
|
||||
"keybinding": "Привязка клавиш",
|
||||
"loadAllFolders": "Загрузить все папки",
|
||||
"loadWorkflow": "Загрузить рабочий процесс",
|
||||
"loading": "Загрузка",
|
||||
"logs": "Журналы",
|
||||
"newFolder": "Новая папка",
|
||||
"next": "Далее",
|
||||
"no": "Нет",
|
||||
"noResultsFound": "Результатов не найдено",
|
||||
"noTasksFound": "Задачи не найдены",
|
||||
@@ -122,6 +129,7 @@
|
||||
"showReport": "Показать отчет",
|
||||
"systemInfo": "Информация о системе",
|
||||
"terminal": "Терминал",
|
||||
"upload": "Загрузить",
|
||||
"videoFailedToLoad": "Не удалось загрузить видео"
|
||||
},
|
||||
"graphCanvasMenu": {
|
||||
@@ -151,9 +159,10 @@
|
||||
"install": {
|
||||
"appDataLocationTooltip": "Директория данных приложения ComfyUI. Хранит:\n- Логи\n- Конфигурации сервера",
|
||||
"appPathLocationTooltip": "Директория активов приложения ComfyUI. Хранит код и активы ComfyUI",
|
||||
"cannotWrite": "Невозможно записать в выбранный путь",
|
||||
"chooseInstallationLocation": "Выберите место установки",
|
||||
"customNodes": "Пользовательские узлы",
|
||||
"customNodesDescription": "Ссылайтесь на файлы пользовательских узлов из существующих установок ComfyUI и устанавливайте их зависимости.",
|
||||
"customNodesDescription": "Переустановите пользовательские узлы из существующих установок ComfyUI.",
|
||||
"desktopAppSettings": "Настройки настольного приложения",
|
||||
"desktopAppSettingsDescription": "Настройте, как ComfyUI ведет себя на вашем рабочем столе. Вы можете изменить эти настройки позже.",
|
||||
"desktopSettings": "Настройки рабочего стола",
|
||||
@@ -177,6 +186,7 @@
|
||||
"installLocation": "Место установки",
|
||||
"installLocationDescription": "Выберите директорию для пользовательских данных ComfyUI. В выбранном месте будет установлена среда Python. Пожалуйста, убедитесь, что на выбранном диске достаточно места (~15 ГБ).",
|
||||
"installLocationTooltip": "Директория пользовательских данных ComfyUI. Хранит:\n- Среда Python\n- Модели\n- Пользовательские узлы\n",
|
||||
"insufficientFreeSpace": "Недостаточно места - минимально необходимое свободное место",
|
||||
"manualConfiguration": {
|
||||
"createVenv": "Вам потребуется создать виртуальное окружение в следующем каталоге",
|
||||
"requirements": "Требования",
|
||||
@@ -188,6 +198,8 @@
|
||||
"migration": "Миграция",
|
||||
"migrationOptional": "Миграция является необязательной. Если у вас нет существующей установки, вы можете пропустить этот шаг.",
|
||||
"migrationSourcePathDescription": "Если у вас есть существующая установка ComfyUI, мы можем скопировать/связать ваши существующие пользовательские файлы и модели в новую установку.",
|
||||
"parentMissing": "Путь не существует - сначала создайте родительский каталог",
|
||||
"pathExists": "Директория уже существует - пожалуйста, убедитесь, что вы сделали резервное копирование всех данных",
|
||||
"pathValidationFailed": "Не удалось проверить путь",
|
||||
"selectItemsToMigrate": "Выберите элементы для миграции",
|
||||
"settings": {
|
||||
@@ -209,7 +221,8 @@
|
||||
},
|
||||
"learnMoreAboutData": "Узнать больше о сборе данных"
|
||||
},
|
||||
"systemLocations": "Системные места"
|
||||
"systemLocations": "Системные места",
|
||||
"unhandledError": "Неизвестная ошибка"
|
||||
},
|
||||
"menu": {
|
||||
"autoQueue": "Автоочередь",
|
||||
@@ -235,6 +248,7 @@
|
||||
"toggleBottomPanel": "Переключить нижнюю панель"
|
||||
},
|
||||
"menuLabels": {
|
||||
"About ComfyUI": "О ComfyUI",
|
||||
"Browse Templates": "Просмотреть шаблоны",
|
||||
"Bypass/Unbypass Selected Nodes": "Обойти/восстановить выбранные узлы",
|
||||
"Canvas Toggle Link Visibility": "Переключение видимости ссылки на холст",
|
||||
@@ -560,353 +574,6 @@
|
||||
"Window": "Окно",
|
||||
"Workflow": "Рабочий процесс"
|
||||
},
|
||||
"settingsDialog": {
|
||||
"Comfy-Desktop_AutoUpdate": {
|
||||
"name": "Автоматически проверять обновления"
|
||||
},
|
||||
"Comfy-Desktop_SendStatistics": {
|
||||
"name": "Отправлять анонимные отчеты о сбоях"
|
||||
},
|
||||
"Comfy_ColorPalette": {
|
||||
"name": "Цветовая палитра"
|
||||
},
|
||||
"Comfy_ConfirmClear": {
|
||||
"name": "Требовать подтверждение при очистке рабочего процесса"
|
||||
},
|
||||
"Comfy_DOMClippingEnabled": {
|
||||
"name": "Включить обрезку элементов DOM (включение может снизить производительность)"
|
||||
},
|
||||
"Comfy_DevMode": {
|
||||
"name": "Включить параметры режима разработчика (сохранение API и т.д.)"
|
||||
},
|
||||
"Comfy_DisableFloatRounding": {
|
||||
"name": "Отключить округление по умолчанию для плавающих виджетов.",
|
||||
"tooltip": "(требуется перезагрузка страницы) Невозможно отключить округление, если оно установлено узлом на сервере."
|
||||
},
|
||||
"Comfy_DisableSliders": {
|
||||
"name": "Отключить ползунки виджетов узлов"
|
||||
},
|
||||
"Comfy_EditAttention_Delta": {
|
||||
"name": "Точность Ctrl+вверх/вниз"
|
||||
},
|
||||
"Comfy_EnableTooltips": {
|
||||
"name": "Включить подсказки"
|
||||
},
|
||||
"Comfy_EnableWorkflowViewRestore": {
|
||||
"name": "Сохранять и восстанавливать положение и уровень масштабирования холста в рабочих процессах"
|
||||
},
|
||||
"Comfy_Extension_Disabled": {
|
||||
"name": "Отключенные имена расширений"
|
||||
},
|
||||
"Comfy_FloatRoundingPrecision": {
|
||||
"name": "Количество знаков после запятой для округления плавающего виджета [0 = авто].",
|
||||
"tooltip": "(требуется перезагрузка страницы)"
|
||||
},
|
||||
"Comfy_Graph_CanvasInfo": {
|
||||
"name": "Показать информацию о холсте в нижнем левом углу (fps и т.д.)"
|
||||
},
|
||||
"Comfy_Graph_CanvasMenu": {
|
||||
"name": "Показать меню холста графа"
|
||||
},
|
||||
"Comfy_Graph_CtrlShiftZoom": {
|
||||
"name": "Включить быстрый зум с помощью сочетания клавиш (Ctrl + Shift + Перетаскивание)"
|
||||
},
|
||||
"Comfy_Graph_LinkMarkers": {
|
||||
"name": "Маркер середины ссылки",
|
||||
"options": {
|
||||
"Arrow": "Стрелка",
|
||||
"Circle": "Круг",
|
||||
"None": "Нет"
|
||||
}
|
||||
},
|
||||
"Comfy_Graph_ZoomSpeed": {
|
||||
"name": "Скорость зума холста"
|
||||
},
|
||||
"Comfy_GroupSelectedNodes_Padding": {
|
||||
"name": "Отступ для выбранных узлов группы"
|
||||
},
|
||||
"Comfy_Group_DoubleClickTitleToEdit": {
|
||||
"name": "Дважды щелкните по заголовку группы, чтобы редактировать"
|
||||
},
|
||||
"Comfy_InvertMenuScrolling": {
|
||||
"name": "Инвертировать прокрутку контекстного меню"
|
||||
},
|
||||
"Comfy_Keybinding_NewBindings": {
|
||||
"name": "Сочетания клавиш, установленные пользователем"
|
||||
},
|
||||
"Comfy_Keybinding_UnsetBindings": {
|
||||
"name": "Сочетания клавиш, снятые пользователем"
|
||||
},
|
||||
"Comfy_LinkRelease_Action": {
|
||||
"name": "Действие при отпускании ссылки (без модификатора)",
|
||||
"options": {
|
||||
"context menu": "контекстное меню",
|
||||
"no action": "без действия",
|
||||
"search box": "поисковая строка"
|
||||
}
|
||||
},
|
||||
"Comfy_LinkRelease_ActionShift": {
|
||||
"name": "Действие при отпускании ссылки (Shift)",
|
||||
"options": {
|
||||
"context menu": "контекстное меню",
|
||||
"no action": "без действия",
|
||||
"search box": "поисковая строка"
|
||||
}
|
||||
},
|
||||
"Comfy_LinkRenderMode": {
|
||||
"name": "Режим рендеринга ссылки",
|
||||
"options": {
|
||||
"Hidden": "Скрытый",
|
||||
"Linear": "Линейный",
|
||||
"Spline": "Сплайн",
|
||||
"Straight": "Прямой"
|
||||
}
|
||||
},
|
||||
"Comfy_Locale": {
|
||||
"name": "Язык"
|
||||
},
|
||||
"Comfy_MaskEditor_BrushAdjustmentSpeed": {
|
||||
"name": "Множитель скорости регулировки кисти",
|
||||
"tooltip": "Управляет тем, как быстро изменяются размер и жесткость кисти при регулировке. Более высокие значения означают более быстрые изменения."
|
||||
},
|
||||
"Comfy_MaskEditor_UseDominantAxis": {
|
||||
"name": "Закрепить регулировку кисти по доминирующей оси",
|
||||
"tooltip": "При включении регулировки кисти будет влиять только на размер ИЛИ жесткость в зависимости от того, в каком направлении вы двигаетесь больше"
|
||||
},
|
||||
"Comfy_MaskEditor_UseNewEditor": {
|
||||
"name": "Использовать новый редактор масок",
|
||||
"tooltip": "Переключиться на новый интерфейс редактора масок"
|
||||
},
|
||||
"Comfy_MenuPosition": {
|
||||
"name": "Сохранить положение старого меню"
|
||||
},
|
||||
"Comfy_ModelLibrary_AutoLoadAll": {
|
||||
"name": "Автоматически загружать все папки моделей",
|
||||
"tooltip": "Если true, все папки будут загружены, как только вы откроете библиотеку моделей (это может вызвать задержки при загрузке). Если false, корневые папки моделей будут загружены только после нажатия на них."
|
||||
},
|
||||
"Comfy_ModelLibrary_NameFormat": {
|
||||
"name": "Какое имя отображать в древовидном представлении библиотеки моделей",
|
||||
"options": {
|
||||
"filename": "имя файла",
|
||||
"title": "название"
|
||||
},
|
||||
"tooltip": "Выберите \"имя файла\", чтобы отобразить упрощенный вид сырого имени файла (без директории или расширения \".safetensors\") в списке моделей. Выберите \"название\", чтобы отобразить настраиваемое название метаданных модели."
|
||||
},
|
||||
"Comfy_NodeBadge_NodeIdBadgeMode": {
|
||||
"name": "Режим значка ID узла",
|
||||
"options": {
|
||||
"None": "Нет",
|
||||
"Show all": "Показать все"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeBadge_NodeLifeCycleBadgeMode": {
|
||||
"name": "Режим значка жизненного цикла узла",
|
||||
"options": {
|
||||
"None": "Нет",
|
||||
"Show all": "Показать все"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeBadge_NodeSourceBadgeMode": {
|
||||
"name": "Режим значка источника узла",
|
||||
"options": {
|
||||
"Hide built-in": "Скрыть встроенные",
|
||||
"None": "Нет",
|
||||
"Show all": "Показать все"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeInputConversionSubmenus": {
|
||||
"name": "В контекстном меню узла разместите элементы, которые конвертируют между вводом/виджетом в подменю."
|
||||
},
|
||||
"Comfy_NodeLibrary_Bookmarks": {
|
||||
"name": "Закладки библиотеки узлов с отображаемым именем (устарело)"
|
||||
},
|
||||
"Comfy_NodeLibrary_BookmarksCustomization": {
|
||||
"name": "Настройка закладок библиотеки узлов"
|
||||
},
|
||||
"Comfy_NodeLibrary_Bookmarks_V2": {
|
||||
"name": "Закладки библиотеки узлов v2 с уникальным именем"
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl": {
|
||||
"name": "Реализация поискового поля узлов",
|
||||
"options": {
|
||||
"default": "по умолчанию",
|
||||
"litegraph (legacy)": "litegraph (устаревший)"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_NodePreview": {
|
||||
"name": "Предварительный просмотр узла",
|
||||
"tooltip": "Применяется только к стандартной реализации"
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_ShowCategory": {
|
||||
"name": "Показать категорию узла в результатах поиска",
|
||||
"tooltip": "Применяется только к стандартной реализации"
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_ShowIdName": {
|
||||
"name": "Показать имя ID узла в результатах поиска",
|
||||
"tooltip": "Применяется только к стандартной реализации"
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_ShowNodeFrequency": {
|
||||
"name": "Показать частоту узла в результатах поиска",
|
||||
"tooltip": "Применяется только к стандартной реализации"
|
||||
},
|
||||
"Comfy_NodeSuggestions_number": {
|
||||
"name": "Количество предложений узлов",
|
||||
"tooltip": "Только для поля поиска litegraph/контекстного меню"
|
||||
},
|
||||
"Comfy_Node_AutoSnapLinkToSlot": {
|
||||
"name": "Автоматически привязывать ссылку к слоту узла",
|
||||
"tooltip": "При перетаскивании ссылки над узлом ссылка автоматически привязывается к подходящему входному слоту узла"
|
||||
},
|
||||
"Comfy_Node_BypassAllLinksOnDelete": {
|
||||
"name": "Сохранить все ссылки при удалении узлов",
|
||||
"tooltip": "При удалении узла попытаться переподключить все его входные и выходные ссылки (обходя удаленный узел)"
|
||||
},
|
||||
"Comfy_Node_DoubleClickTitleToEdit": {
|
||||
"name": "Дважды щелкните по заголовку узла, чтобы редактировать"
|
||||
},
|
||||
"Comfy_Node_MiddleClickRerouteNode": {
|
||||
"name": "Средний щелчок создает новый узел перенаправления"
|
||||
},
|
||||
"Comfy_Node_Opacity": {
|
||||
"name": "Непрозрачность узла"
|
||||
},
|
||||
"Comfy_Node_ShowDeprecated": {
|
||||
"name": "Показать устаревшие узлы в поиске",
|
||||
"tooltip": "Устаревшие узлы по умолчанию скрыты в интерфейсе, но остаются функциональными в существующих рабочих процессах, которые их используют."
|
||||
},
|
||||
"Comfy_Node_ShowExperimental": {
|
||||
"name": "Показать экспериментальные узлы в поиске",
|
||||
"tooltip": "Экспериментальные узлы помечены как таковые в интерфейсе и могут подвергаться значительным изменениям или удалению в будущих версиях. Используйте с осторожностью в производственных рабочих процессах"
|
||||
},
|
||||
"Comfy_Node_SnapHighlightsNode": {
|
||||
"name": "Подсветка узла при привязке",
|
||||
"tooltip": "При перетаскивании ссылки над узлом с подходящим входным слотом, узел подсвечивается"
|
||||
},
|
||||
"Comfy_Pointer_ClickBufferTime": {
|
||||
"name": "Задержка дрейфа щелчка указателя",
|
||||
"tooltip": "После нажатия кнопки указателя, это максимальное время (в миллисекундах), в течение которого движение указателя может быть проигнорировано.\n\nПомогает предотвратить непреднамеренное смещение объектов, если указатель перемещается во время щелчка."
|
||||
},
|
||||
"Comfy_Pointer_ClickDrift": {
|
||||
"name": "Дрейф щелчка указателя (максимальное расстояние)",
|
||||
"tooltip": "Если указатель перемещается более чем на это расстояние, удерживая кнопку, это считается перетаскиванием (а не щелчком).\n\nПомогает предотвратить непреднамеренное смещение объектов, если указатель перемещается во время щелчка."
|
||||
},
|
||||
"Comfy_Pointer_DoubleClickTime": {
|
||||
"name": "Интервал двойного щелчка (максимум)",
|
||||
"tooltip": "Максимальное время в миллисекундах между двумя щелчками двойного щелчка. Увеличение этого значения может помочь, если двойные щелчки иногда не регистрируются."
|
||||
},
|
||||
"Comfy_PreviewFormat": {
|
||||
"name": "Формат изображения предварительного просмотра",
|
||||
"tooltip": "При отображении предварительного просмотра в виджете изображения, преобразуйте его в легковесное изображение, например, webp, jpeg, webp;50 и т.д."
|
||||
},
|
||||
"Comfy_PromptFilename": {
|
||||
"name": "Запрос имени файла при сохранении рабочего процесса"
|
||||
},
|
||||
"Comfy_QueueButton_BatchCountLimit": {
|
||||
"name": "Ограничение количества партий",
|
||||
"tooltip": "Максимальное количество задач, добавляемых в очередь за одно нажатие кнопки"
|
||||
},
|
||||
"Comfy_Queue_ImageFit": {
|
||||
"name": "Подгонка изображения в очереди"
|
||||
},
|
||||
"Comfy_Queue_MaxHistoryItems": {
|
||||
"name": "Размер истории очереди",
|
||||
"tooltip": "Максимальное количество задач, отображаемых в истории очереди."
|
||||
},
|
||||
"Comfy_RerouteBeta": {
|
||||
"name": "Участвовать в бета-тестировании перенаправления",
|
||||
"tooltip": "Включает новые нативные перенаправления.\n\nПеренаправления можно добавлять, удерживая alt и перетаскивая от линии ссылки или в меню ссылки.\n\nОтключение этой опции не разрушительно - перенаправления скрыты."
|
||||
},
|
||||
"Comfy_Server_LaunchArgs": {
|
||||
"name": "Аргументы запуска сервера",
|
||||
"tooltip": "Это фактические аргументы, которые передаются серверу при его запуске."
|
||||
},
|
||||
"Comfy_Server_ServerConfigValues": {
|
||||
"name": "Значения конфигурации сервера для отображения на фронтенде",
|
||||
"tooltip": "Значения конфигурации сервера, используемые только для отображения на фронтенде"
|
||||
},
|
||||
"Comfy_Settings_ExtensionPanel": {
|
||||
"name": "Показать панель расширений в диалоговом окне настроек"
|
||||
},
|
||||
"Comfy_Sidebar_Location": {
|
||||
"name": "Расположение боковой панели",
|
||||
"options": {
|
||||
"left": "слева",
|
||||
"right": "справа"
|
||||
}
|
||||
},
|
||||
"Comfy_Sidebar_Size": {
|
||||
"name": "Размер боковой панели",
|
||||
"options": {
|
||||
"normal": "нормальный",
|
||||
"small": "маленький"
|
||||
}
|
||||
},
|
||||
"Comfy_SnapToGrid_GridSize": {
|
||||
"name": "Размер сетки привязки",
|
||||
"tooltip": "При перетаскивании и изменении размера узлов, удерживая shift, они будут выровнены по сетке, это контролирует размер этой сетки."
|
||||
},
|
||||
"Comfy_TextareaWidget_FontSize": {
|
||||
"name": "Размер шрифта виджета текстовой области"
|
||||
},
|
||||
"Comfy_TextareaWidget_Spellcheck": {
|
||||
"name": "Проверка орфографии виджета текстовой области"
|
||||
},
|
||||
"Comfy_TreeExplorer_ItemPadding": {
|
||||
"name": "Отступ элемента в проводнике дерева"
|
||||
},
|
||||
"Comfy_UseNewMenu": {
|
||||
"name": "Использовать новое меню",
|
||||
"options": {
|
||||
"Bottom": "Внизу",
|
||||
"Disabled": "Отключено",
|
||||
"Top": "Вверху"
|
||||
}
|
||||
},
|
||||
"Comfy_Validation_NodeDefs": {
|
||||
"name": "Проверка определений узлов (медленно)",
|
||||
"tooltip": "Рекомендуется для разработчиков узлов. Это проверит все определения узлов при запуске."
|
||||
},
|
||||
"Comfy_Validation_Workflows": {
|
||||
"name": "Проверка рабочих процессов"
|
||||
},
|
||||
"Comfy_WidgetControlMode": {
|
||||
"name": "Режим управления виджетом",
|
||||
"options": {
|
||||
"after": "после",
|
||||
"before": "до"
|
||||
},
|
||||
"tooltip": "Управляет тем, когда обновляются значения виджета (случайные/увеличение/уменьшение), либо до того, как запрос будет поставлен в очередь, либо после."
|
||||
},
|
||||
"Comfy_Window_UnloadConfirmation": {
|
||||
"name": "Показать подтверждение при закрытии окна"
|
||||
},
|
||||
"Comfy_Workflow_ConfirmDelete": {
|
||||
"name": "Показать подтверждение при удалении рабочих процессов"
|
||||
},
|
||||
"Comfy_Workflow_ShowMissingModelsWarning": {
|
||||
"name": "Показать предупреждение об отсутствующих моделях"
|
||||
},
|
||||
"Comfy_Workflow_ShowMissingNodesWarning": {
|
||||
"name": "Показать предупреждение об отсутствующих узлах"
|
||||
},
|
||||
"Comfy_Workflow_SortNodeIdOnSave": {
|
||||
"name": "Сортировать ID узлов при сохранении рабочего процесса"
|
||||
},
|
||||
"Comfy_Workflow_WorkflowTabsPosition": {
|
||||
"name": "Положение открытых рабочих процессов",
|
||||
"options": {
|
||||
"Sidebar": "Боковая панель",
|
||||
"Topbar": "Верхняя панель"
|
||||
}
|
||||
},
|
||||
"LiteGraph_Canvas_MaximumFps": {
|
||||
"name": "Максимум FPS",
|
||||
"tooltip": "Максимальное количество кадров в секунду, которое холст может рендерить. Ограничивает использование GPU за счет плавности. Если 0, используется частота обновления экрана. По умолчанию: 0"
|
||||
},
|
||||
"pysssss_SnapToGrid": {
|
||||
"name": "Всегда привязываться к сетке"
|
||||
}
|
||||
},
|
||||
"sideToolbar": {
|
||||
"browseTemplates": "Просмотреть примеры шаблонов",
|
||||
"downloads": "Загрузки",
|
||||
|
||||
@@ -249,6 +249,24 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"CLIPTextEncodePixArtAlpha": {
|
||||
"description": "Кодирует текст и устанавливает условие разрешения для PixArt Alpha. Не применяется к PixArt Sigma.",
|
||||
"display_name": "CLIPTextEncodePixArtAlpha",
|
||||
"inputs": {
|
||||
"clip": {
|
||||
"name": "clip"
|
||||
},
|
||||
"height": {
|
||||
"name": "высота"
|
||||
},
|
||||
"text": {
|
||||
"name": "текст"
|
||||
},
|
||||
"width": {
|
||||
"name": "ширина"
|
||||
}
|
||||
}
|
||||
},
|
||||
"CLIPTextEncodeSD3": {
|
||||
"display_name": "Кодирование текста CLIP SD3",
|
||||
"inputs": {
|
||||
@@ -650,6 +668,31 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"ConditioningStableAudio": {
|
||||
"display_name": "ConditioningStableAudio",
|
||||
"inputs": {
|
||||
"negative": {
|
||||
"name": "отрицательный"
|
||||
},
|
||||
"positive": {
|
||||
"name": "положительный"
|
||||
},
|
||||
"seconds_start": {
|
||||
"name": "секунды_начала"
|
||||
},
|
||||
"seconds_total": {
|
||||
"name": "всего_секунд"
|
||||
}
|
||||
},
|
||||
"outputs": {
|
||||
"0": {
|
||||
"name": "положительный"
|
||||
},
|
||||
"1": {
|
||||
"name": "отрицательный"
|
||||
}
|
||||
}
|
||||
},
|
||||
"ConditioningTimestepsRange": {
|
||||
"display_name": "Диапазон временных шагов",
|
||||
"inputs": {
|
||||
@@ -4180,6 +4223,35 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"Preview3D": {
|
||||
"display_name": "Предварительный просмотр 3D",
|
||||
"inputs": {
|
||||
"bg_color": {
|
||||
"name": "цвет_фона"
|
||||
},
|
||||
"camera_type": {
|
||||
"name": "тип_камеры"
|
||||
},
|
||||
"light_intensity": {
|
||||
"name": "интенсивность_света"
|
||||
},
|
||||
"material": {
|
||||
"name": "материал"
|
||||
},
|
||||
"model_file": {
|
||||
"name": "файл_модели"
|
||||
},
|
||||
"show_grid": {
|
||||
"name": "показать_сетку"
|
||||
},
|
||||
"up_direction": {
|
||||
"name": "направление_вверх"
|
||||
},
|
||||
"view": {
|
||||
"name": "вид"
|
||||
}
|
||||
}
|
||||
},
|
||||
"PreviewAudio": {
|
||||
"display_name": "Предварительный просмотр аудио",
|
||||
"inputs": {
|
||||
@@ -5215,6 +5287,14 @@
|
||||
"samples": {
|
||||
"name": "образцы"
|
||||
},
|
||||
"temporal_overlap": {
|
||||
"name": "temporal_overlap",
|
||||
"tooltip": "Используется только для видео VAE: количество кадров для перекрытия."
|
||||
},
|
||||
"temporal_size": {
|
||||
"name": "temporal_size",
|
||||
"tooltip": "Используется только для видео VAE: количество кадров для декодирования за раз."
|
||||
},
|
||||
"tile_size": {
|
||||
"name": "размер_плитки"
|
||||
},
|
||||
@@ -5265,9 +5345,20 @@
|
||||
"VAEEncodeTiled": {
|
||||
"display_name": "Кодировать VAE (плитками)",
|
||||
"inputs": {
|
||||
"overlap": {
|
||||
"name": "перекрытие"
|
||||
},
|
||||
"pixels": {
|
||||
"name": "пиксели"
|
||||
},
|
||||
"temporal_overlap": {
|
||||
"name": "temporal_overlap",
|
||||
"tooltip": "Используется только для видео VAEs: количество кадров для перекрытия."
|
||||
},
|
||||
"temporal_size": {
|
||||
"name": "temporal_size",
|
||||
"tooltip": "Используется только для видео VAEs: количество кадров для кодирования за один раз."
|
||||
},
|
||||
"tile_size": {
|
||||
"name": "размер_плитки"
|
||||
},
|
||||
|
||||
344
src/locales/ru/settings.json
Normal file
344
src/locales/ru/settings.json
Normal file
@@ -0,0 +1,344 @@
|
||||
{
|
||||
"Comfy-Desktop_AutoUpdate": {
|
||||
"name": "Автоматически проверять обновления"
|
||||
},
|
||||
"Comfy-Desktop_SendStatistics": {
|
||||
"name": "Отправлять анонимные отчеты о сбоях"
|
||||
},
|
||||
"Comfy_ColorPalette": {
|
||||
"name": "Цветовая палитра"
|
||||
},
|
||||
"Comfy_ConfirmClear": {
|
||||
"name": "Требовать подтверждение при очистке рабочего процесса"
|
||||
},
|
||||
"Comfy_DOMClippingEnabled": {
|
||||
"name": "Включить обрезку элементов DOM (включение может снизить производительность)"
|
||||
},
|
||||
"Comfy_DevMode": {
|
||||
"name": "Включить параметры режима разработчика (сохранение API и т.д.)"
|
||||
},
|
||||
"Comfy_DisableFloatRounding": {
|
||||
"name": "Отключить округление по умолчанию для плавающих виджетов.",
|
||||
"tooltip": "(требуется перезагрузка страницы) Невозможно отключить округление, если оно установлено узлом на сервере."
|
||||
},
|
||||
"Comfy_DisableSliders": {
|
||||
"name": "Отключить ползунки виджетов узлов"
|
||||
},
|
||||
"Comfy_EditAttention_Delta": {
|
||||
"name": "Точность Ctrl+вверх/вниз"
|
||||
},
|
||||
"Comfy_EnableTooltips": {
|
||||
"name": "Включить подсказки"
|
||||
},
|
||||
"Comfy_EnableWorkflowViewRestore": {
|
||||
"name": "Сохранять и восстанавливать положение и уровень масштабирования холста в рабочих процессах"
|
||||
},
|
||||
"Comfy_Extension_Disabled": {
|
||||
"name": "Отключенные имена расширений"
|
||||
},
|
||||
"Comfy_FloatRoundingPrecision": {
|
||||
"name": "Количество знаков после запятой для округления плавающего виджета [0 = авто].",
|
||||
"tooltip": "(требуется перезагрузка страницы)"
|
||||
},
|
||||
"Comfy_Graph_CanvasInfo": {
|
||||
"name": "Показать информацию о холсте в нижнем левом углу (fps и т.д.)"
|
||||
},
|
||||
"Comfy_Graph_CanvasMenu": {
|
||||
"name": "Показать меню холста графа"
|
||||
},
|
||||
"Comfy_Graph_CtrlShiftZoom": {
|
||||
"name": "Включить быстрый зум с помощью сочетания клавиш (Ctrl + Shift + Перетаскивание)"
|
||||
},
|
||||
"Comfy_Graph_LinkMarkers": {
|
||||
"name": "Маркер середины ссылки",
|
||||
"options": {
|
||||
"Arrow": "Стрелка",
|
||||
"Circle": "Круг",
|
||||
"None": "Нет"
|
||||
}
|
||||
},
|
||||
"Comfy_Graph_ZoomSpeed": {
|
||||
"name": "Скорость зума холста"
|
||||
},
|
||||
"Comfy_GroupSelectedNodes_Padding": {
|
||||
"name": "Отступ для выбранных узлов группы"
|
||||
},
|
||||
"Comfy_Group_DoubleClickTitleToEdit": {
|
||||
"name": "Дважды щелкните по заголовку группы, чтобы редактировать"
|
||||
},
|
||||
"Comfy_InvertMenuScrolling": {
|
||||
"name": "Инвертировать прокрутку контекстного меню"
|
||||
},
|
||||
"Comfy_Keybinding_NewBindings": {
|
||||
"name": "Сочетания клавиш, установленные пользователем"
|
||||
},
|
||||
"Comfy_Keybinding_UnsetBindings": {
|
||||
"name": "Сочетания клавиш, снятые пользователем"
|
||||
},
|
||||
"Comfy_LinkRelease_Action": {
|
||||
"name": "Действие при отпускании ссылки (без модификатора)",
|
||||
"options": {
|
||||
"context menu": "контекстное меню",
|
||||
"no action": "без действия",
|
||||
"search box": "поисковая строка"
|
||||
}
|
||||
},
|
||||
"Comfy_LinkRelease_ActionShift": {
|
||||
"name": "Действие при отпускании ссылки (Shift)",
|
||||
"options": {
|
||||
"context menu": "контекстное меню",
|
||||
"no action": "без действия",
|
||||
"search box": "поисковая строка"
|
||||
}
|
||||
},
|
||||
"Comfy_LinkRenderMode": {
|
||||
"name": "Режим рендеринга ссылки",
|
||||
"options": {
|
||||
"Hidden": "Скрытый",
|
||||
"Linear": "Линейный",
|
||||
"Spline": "Сплайн",
|
||||
"Straight": "Прямой"
|
||||
}
|
||||
},
|
||||
"Comfy_Locale": {
|
||||
"name": "Язык"
|
||||
},
|
||||
"Comfy_MaskEditor_BrushAdjustmentSpeed": {
|
||||
"name": "Множитель скорости регулировки кисти",
|
||||
"tooltip": "Управляет тем, как быстро изменяются размер и жесткость кисти при регулировке. Более высокие значения означают более быстрые изменения."
|
||||
},
|
||||
"Comfy_MaskEditor_UseDominantAxis": {
|
||||
"name": "Закрепить регулировку кисти по доминирующей оси",
|
||||
"tooltip": "При включении регулировки кисти будет влиять только на размер ИЛИ жесткость в зависимости от того, в каком направлении вы двигаетесь больше"
|
||||
},
|
||||
"Comfy_MaskEditor_UseNewEditor": {
|
||||
"name": "Использовать новый редактор масок",
|
||||
"tooltip": "Переключиться на новый интерфейс редактора масок"
|
||||
},
|
||||
"Comfy_MenuPosition": {
|
||||
"name": "Сохранить положение старого меню"
|
||||
},
|
||||
"Comfy_ModelLibrary_AutoLoadAll": {
|
||||
"name": "Автоматически загружать все папки моделей",
|
||||
"tooltip": "Если true, все папки будут загружены, как только вы откроете библиотеку моделей (это может вызвать задержки при загрузке). Если false, корневые папки моделей будут загружены только после нажатия на них."
|
||||
},
|
||||
"Comfy_ModelLibrary_NameFormat": {
|
||||
"name": "Какое имя отображать в древовидном представлении библиотеки моделей",
|
||||
"options": {
|
||||
"filename": "имя файла",
|
||||
"title": "название"
|
||||
},
|
||||
"tooltip": "Выберите \"имя файла\", чтобы отобразить упрощенный вид сырого имени файла (без директории или расширения \".safetensors\") в списке моделей. Выберите \"название\", чтобы отобразить настраиваемое название метаданных модели."
|
||||
},
|
||||
"Comfy_NodeBadge_NodeIdBadgeMode": {
|
||||
"name": "Режим значка ID узла",
|
||||
"options": {
|
||||
"None": "Нет",
|
||||
"Show all": "Показать все"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeBadge_NodeLifeCycleBadgeMode": {
|
||||
"name": "Режим значка жизненного цикла узла",
|
||||
"options": {
|
||||
"None": "Нет",
|
||||
"Show all": "Показать все"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeBadge_NodeSourceBadgeMode": {
|
||||
"name": "Режим значка источника узла",
|
||||
"options": {
|
||||
"Hide built-in": "Скрыть встроенные",
|
||||
"None": "Нет",
|
||||
"Show all": "Показать все"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeInputConversionSubmenus": {
|
||||
"name": "В контекстном меню узла разместите элементы, которые конвертируют между вводом/виджетом в подменю."
|
||||
},
|
||||
"Comfy_NodeLibrary_Bookmarks": {
|
||||
"name": "Закладки библиотеки узлов с отображаемым именем (устарело)"
|
||||
},
|
||||
"Comfy_NodeLibrary_BookmarksCustomization": {
|
||||
"name": "Настройка закладок библиотеки узлов"
|
||||
},
|
||||
"Comfy_NodeLibrary_Bookmarks_V2": {
|
||||
"name": "Закладки библиотеки узлов v2 с уникальным именем"
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl": {
|
||||
"name": "Реализация поискового поля узлов",
|
||||
"options": {
|
||||
"default": "по умолчанию",
|
||||
"litegraph (legacy)": "litegraph (устаревший)"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_NodePreview": {
|
||||
"name": "Предварительный просмотр узла",
|
||||
"tooltip": "Применяется только к стандартной реализации"
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_ShowCategory": {
|
||||
"name": "Показать категорию узла в результатах поиска",
|
||||
"tooltip": "Применяется только к стандартной реализации"
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_ShowIdName": {
|
||||
"name": "Показать имя ID узла в результатах поиска",
|
||||
"tooltip": "Применяется только к стандартной реализации"
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_ShowNodeFrequency": {
|
||||
"name": "Показать частоту узла в результатах поиска",
|
||||
"tooltip": "Применяется только к стандартной реализации"
|
||||
},
|
||||
"Comfy_NodeSuggestions_number": {
|
||||
"name": "Количество предложений узлов",
|
||||
"tooltip": "Только для поля поиска litegraph/контекстного меню"
|
||||
},
|
||||
"Comfy_Node_AutoSnapLinkToSlot": {
|
||||
"name": "Автоматически привязывать ссылку к слоту узла",
|
||||
"tooltip": "При перетаскивании ссылки над узлом ссылка автоматически привязывается к подходящему входному слоту узла"
|
||||
},
|
||||
"Comfy_Node_BypassAllLinksOnDelete": {
|
||||
"name": "Сохранить все ссылки при удалении узлов",
|
||||
"tooltip": "При удалении узла попытаться переподключить все его входные и выходные ссылки (обходя удаленный узел)"
|
||||
},
|
||||
"Comfy_Node_DoubleClickTitleToEdit": {
|
||||
"name": "Дважды щелкните по заголовку узла, чтобы редактировать"
|
||||
},
|
||||
"Comfy_Node_MiddleClickRerouteNode": {
|
||||
"name": "Средний щелчок создает новый узел перенаправления"
|
||||
},
|
||||
"Comfy_Node_Opacity": {
|
||||
"name": "Непрозрачность узла"
|
||||
},
|
||||
"Comfy_Node_ShowDeprecated": {
|
||||
"name": "Показать устаревшие узлы в поиске",
|
||||
"tooltip": "Устаревшие узлы по умолчанию скрыты в интерфейсе, но остаются функциональными в существующих рабочих процессах, которые их используют."
|
||||
},
|
||||
"Comfy_Node_ShowExperimental": {
|
||||
"name": "Показать экспериментальные узлы в поиске",
|
||||
"tooltip": "Экспериментальные узлы помечены как таковые в интерфейсе и могут подвергаться значительным изменениям или удалению в будущих версиях. Используйте с осторожностью в производственных рабочих процессах"
|
||||
},
|
||||
"Comfy_Node_SnapHighlightsNode": {
|
||||
"name": "Подсветка узла при привязке",
|
||||
"tooltip": "При перетаскивании ссылки над узлом с подходящим входным слотом, узел подсвечивается"
|
||||
},
|
||||
"Comfy_Pointer_ClickBufferTime": {
|
||||
"name": "Задержка дрейфа щелчка указателя",
|
||||
"tooltip": "После нажатия кнопки указателя, это максимальное время (в миллисекундах), в течение которого движение указателя может быть проигнорировано.\n\nПомогает предотвратить непреднамеренное смещение объектов, если указатель перемещается во время щелчка."
|
||||
},
|
||||
"Comfy_Pointer_ClickDrift": {
|
||||
"name": "Дрейф щелчка указателя (максимальное расстояние)",
|
||||
"tooltip": "Если указатель перемещается более чем на это расстояние, удерживая кнопку, это считается перетаскиванием (а не щелчком).\n\nПомогает предотвратить непреднамеренное смещение объектов, если указатель перемещается во время щелчка."
|
||||
},
|
||||
"Comfy_Pointer_DoubleClickTime": {
|
||||
"name": "Интервал двойного щелчка (максимум)",
|
||||
"tooltip": "Максимальное время в миллисекундах между двумя щелчками двойного щелчка. Увеличение этого значения может помочь, если двойные щелчки иногда не регистрируются."
|
||||
},
|
||||
"Comfy_PreviewFormat": {
|
||||
"name": "Формат изображения предварительного просмотра",
|
||||
"tooltip": "При отображении предварительного просмотра в виджете изображения, преобразуйте его в легковесное изображение, например, webp, jpeg, webp;50 и т.д."
|
||||
},
|
||||
"Comfy_PromptFilename": {
|
||||
"name": "Запрос имени файла при сохранении рабочего процесса"
|
||||
},
|
||||
"Comfy_QueueButton_BatchCountLimit": {
|
||||
"name": "Ограничение количества партий",
|
||||
"tooltip": "Максимальное количество задач, добавляемых в очередь за одно нажатие кнопки"
|
||||
},
|
||||
"Comfy_Queue_ImageFit": {
|
||||
"name": "Подгонка изображения в очереди"
|
||||
},
|
||||
"Comfy_Queue_MaxHistoryItems": {
|
||||
"name": "Размер истории очереди",
|
||||
"tooltip": "Максимальное количество задач, отображаемых в истории очереди."
|
||||
},
|
||||
"Comfy_RerouteBeta": {
|
||||
"name": "Участвовать в бета-тестировании перенаправления",
|
||||
"tooltip": "Включает новые нативные перенаправления.\n\nПеренаправления можно добавлять, удерживая alt и перетаскивая от линии ссылки или в меню ссылки.\n\nОтключение этой опции не разрушительно - перенаправления скрыты."
|
||||
},
|
||||
"Comfy_Server_LaunchArgs": {
|
||||
"name": "Аргументы запуска сервера",
|
||||
"tooltip": "Это фактические аргументы, которые передаются серверу при его запуске."
|
||||
},
|
||||
"Comfy_Server_ServerConfigValues": {
|
||||
"name": "Значения конфигурации сервера для отображения на фронтенде",
|
||||
"tooltip": "Значения конфигурации сервера, используемые только для отображения на фронтенде"
|
||||
},
|
||||
"Comfy_Sidebar_Location": {
|
||||
"name": "Расположение боковой панели",
|
||||
"options": {
|
||||
"left": "слева",
|
||||
"right": "справа"
|
||||
}
|
||||
},
|
||||
"Comfy_Sidebar_Size": {
|
||||
"name": "Размер боковой панели",
|
||||
"options": {
|
||||
"normal": "нормальный",
|
||||
"small": "маленький"
|
||||
}
|
||||
},
|
||||
"Comfy_SnapToGrid_GridSize": {
|
||||
"name": "Размер сетки привязки",
|
||||
"tooltip": "При перетаскивании и изменении размера узлов, удерживая shift, они будут выровнены по сетке, это контролирует размер этой сетки."
|
||||
},
|
||||
"Comfy_TextareaWidget_FontSize": {
|
||||
"name": "Размер шрифта виджета текстовой области"
|
||||
},
|
||||
"Comfy_TextareaWidget_Spellcheck": {
|
||||
"name": "Проверка орфографии виджета текстовой области"
|
||||
},
|
||||
"Comfy_TreeExplorer_ItemPadding": {
|
||||
"name": "Отступ элемента в проводнике дерева"
|
||||
},
|
||||
"Comfy_UseNewMenu": {
|
||||
"name": "Использовать новое меню",
|
||||
"options": {
|
||||
"Bottom": "Внизу",
|
||||
"Disabled": "Отключено",
|
||||
"Top": "Вверху"
|
||||
}
|
||||
},
|
||||
"Comfy_Validation_NodeDefs": {
|
||||
"name": "Проверка определений узлов (медленно)",
|
||||
"tooltip": "Рекомендуется для разработчиков узлов. Это проверит все определения узлов при запуске."
|
||||
},
|
||||
"Comfy_Validation_Workflows": {
|
||||
"name": "Проверка рабочих процессов"
|
||||
},
|
||||
"Comfy_WidgetControlMode": {
|
||||
"name": "Режим управления виджетом",
|
||||
"options": {
|
||||
"after": "после",
|
||||
"before": "до"
|
||||
},
|
||||
"tooltip": "Управляет тем, когда обновляются значения виджета (случайные/увеличение/уменьшение), либо до того, как запрос будет поставлен в очередь, либо после."
|
||||
},
|
||||
"Comfy_Window_UnloadConfirmation": {
|
||||
"name": "Показать подтверждение при закрытии окна"
|
||||
},
|
||||
"Comfy_Workflow_ConfirmDelete": {
|
||||
"name": "Показать подтверждение при удалении рабочих процессов"
|
||||
},
|
||||
"Comfy_Workflow_ShowMissingModelsWarning": {
|
||||
"name": "Показать предупреждение об отсутствующих моделях"
|
||||
},
|
||||
"Comfy_Workflow_ShowMissingNodesWarning": {
|
||||
"name": "Показать предупреждение об отсутствующих узлах"
|
||||
},
|
||||
"Comfy_Workflow_SortNodeIdOnSave": {
|
||||
"name": "Сортировать ID узлов при сохранении рабочего процесса"
|
||||
},
|
||||
"Comfy_Workflow_WorkflowTabsPosition": {
|
||||
"name": "Положение открытых рабочих процессов",
|
||||
"options": {
|
||||
"Sidebar": "Боковая панель",
|
||||
"Topbar": "Верхняя панель"
|
||||
}
|
||||
},
|
||||
"LiteGraph_Canvas_MaximumFps": {
|
||||
"name": "Максимум FPS",
|
||||
"tooltip": "Максимальное количество кадров в секунду, которое холст может рендерить. Ограничивает использование GPU за счет плавности. Если 0, используется частота обновления экрана. По умолчанию: 0"
|
||||
},
|
||||
"pysssss_SnapToGrid": {
|
||||
"name": "Всегда привязываться к сетке"
|
||||
}
|
||||
}
|
||||
@@ -95,6 +95,9 @@
|
||||
"Comfy_GroupNode_UngroupSelectedGroupNodes": {
|
||||
"label": "取消选定组节点的分组"
|
||||
},
|
||||
"Comfy_Help_AboutComfyUI": {
|
||||
"label": "打开关于ComfyUI"
|
||||
},
|
||||
"Comfy_Help_OpenComfyOrgDiscord": {
|
||||
"label": "打开Comfy-Org Discord"
|
||||
},
|
||||
|
||||
@@ -65,10 +65,12 @@
|
||||
"g": {
|
||||
"about": "关于",
|
||||
"add": "添加",
|
||||
"back": "返回",
|
||||
"cancel": "取消",
|
||||
"close": "关闭",
|
||||
"color": "颜色",
|
||||
"comingSoon": "即将推出",
|
||||
"command": "命令",
|
||||
"confirm": "确认",
|
||||
"copyToClipboard": "复制到剪贴板",
|
||||
"currentUser": "当前用户",
|
||||
@@ -77,8 +79,10 @@
|
||||
"delete": "删除",
|
||||
"deprecated": "已弃用",
|
||||
"devices": "设备",
|
||||
"disableAll": "禁用全部",
|
||||
"download": "下载",
|
||||
"empty": "空",
|
||||
"enableAll": "启用全部",
|
||||
"error": "错误",
|
||||
"experimental": "测试版",
|
||||
"extensionName": "扩展名称",
|
||||
@@ -88,11 +92,14 @@
|
||||
"icon": "图标",
|
||||
"imageFailedToLoad": "图像加载失败",
|
||||
"insert": "插入",
|
||||
"install": "安装",
|
||||
"keybinding": "快捷键",
|
||||
"loadAllFolders": "加载所有文件夹",
|
||||
"loadWorkflow": "加载工作流",
|
||||
"loading": "加载中",
|
||||
"logs": "日志",
|
||||
"newFolder": "新文件夹",
|
||||
"next": "下一步",
|
||||
"no": "否",
|
||||
"noResultsFound": "未找到结果",
|
||||
"noTasksFound": "未找到任务",
|
||||
@@ -122,6 +129,7 @@
|
||||
"showReport": "显示报告",
|
||||
"systemInfo": "系统信息",
|
||||
"terminal": "终端",
|
||||
"upload": "上传",
|
||||
"videoFailedToLoad": "视频加载失败"
|
||||
},
|
||||
"graphCanvasMenu": {
|
||||
@@ -151,9 +159,10 @@
|
||||
"install": {
|
||||
"appDataLocationTooltip": "ComfyUI 的应用数据目录。存储:\n- 日志\n- 服务器配置",
|
||||
"appPathLocationTooltip": "ComfyUI 的应用资产目录。存储 ComfyUI 代码和资产",
|
||||
"cannotWrite": "无法写入所选路径",
|
||||
"chooseInstallationLocation": "选择安装位置",
|
||||
"customNodes": "自定义节点",
|
||||
"customNodesDescription": "引用现有 ComfyUI 安装的自定义节点文件并安装其依赖项。",
|
||||
"customNodesDescription": "从现有的ComfyUI安装中重新安装自定义节点。",
|
||||
"desktopAppSettings": "桌面应用设置",
|
||||
"desktopAppSettingsDescription": "配置 ComfyUI 在桌面上的行为。您可以稍后更改这些设置。",
|
||||
"desktopSettings": "桌面设置",
|
||||
@@ -177,6 +186,7 @@
|
||||
"installLocation": "安装位置",
|
||||
"installLocationDescription": "选择 ComfyUI 用户数据的目录。将安装一个 Python 环境到所选位置。请确保所选磁盘有足够的空间(约 15GB)。",
|
||||
"installLocationTooltip": "ComfyUI 的用户数据目录。存储:\n- Python 环境\n- 模型\n- 自定义节点\n",
|
||||
"insufficientFreeSpace": "空间不足 - 最小可用空间",
|
||||
"manualConfiguration": {
|
||||
"createVenv": "您需要在以下目录中创建虚拟环境",
|
||||
"requirements": "需求",
|
||||
@@ -188,6 +198,8 @@
|
||||
"migration": "迁移",
|
||||
"migrationOptional": "迁移是可选的。如果您没有现有安装,可以跳过此步骤。",
|
||||
"migrationSourcePathDescription": "如果您有现有的 ComfyUI 安装,我们可以将您的现有用户文件和模型复制/链接到新安装。",
|
||||
"parentMissing": "路径不存在 - 首先创建包含目录",
|
||||
"pathExists": "目录已存在 - 请确保您已备份所有数据",
|
||||
"pathValidationFailed": "路径验证失败",
|
||||
"selectItemsToMigrate": "选择要迁移的项目",
|
||||
"settings": {
|
||||
@@ -209,7 +221,8 @@
|
||||
},
|
||||
"learnMoreAboutData": "了解更多关于数据收集的信息"
|
||||
},
|
||||
"systemLocations": "系统位置"
|
||||
"systemLocations": "系统位置",
|
||||
"unhandledError": "未知错误"
|
||||
},
|
||||
"menu": {
|
||||
"autoQueue": "自动执行",
|
||||
@@ -235,6 +248,7 @@
|
||||
"toggleBottomPanel": "底部面板"
|
||||
},
|
||||
"menuLabels": {
|
||||
"About ComfyUI": "关于ComfyUI",
|
||||
"Browse Templates": "浏览模板",
|
||||
"Bypass/Unbypass Selected Nodes": "旁路/取消旁路选定节点",
|
||||
"Canvas Toggle Link Visibility": "切换链接可见性",
|
||||
@@ -560,353 +574,6 @@
|
||||
"Window": "窗口",
|
||||
"Workflow": "工作流"
|
||||
},
|
||||
"settingsDialog": {
|
||||
"Comfy-Desktop_AutoUpdate": {
|
||||
"name": "自动检查更新"
|
||||
},
|
||||
"Comfy-Desktop_SendStatistics": {
|
||||
"name": "发送匿名崩溃报告"
|
||||
},
|
||||
"Comfy_ColorPalette": {
|
||||
"name": "调色板"
|
||||
},
|
||||
"Comfy_ConfirmClear": {
|
||||
"name": "清除工作流时需要确认"
|
||||
},
|
||||
"Comfy_DOMClippingEnabled": {
|
||||
"name": "启用DOM元素裁剪(启用可能会降低性能)"
|
||||
},
|
||||
"Comfy_DevMode": {
|
||||
"name": "启用开发模式选项(API保存等)"
|
||||
},
|
||||
"Comfy_DisableFloatRounding": {
|
||||
"name": "禁用默认浮动小部件四舍五入。",
|
||||
"tooltip": "(需要重新加载页面) 当后端节点设置了四舍五入时,无法禁用四舍五入。"
|
||||
},
|
||||
"Comfy_DisableSliders": {
|
||||
"name": "禁用节点小部件滑块"
|
||||
},
|
||||
"Comfy_EditAttention_Delta": {
|
||||
"name": "Ctrl+上/下 精度"
|
||||
},
|
||||
"Comfy_EnableTooltips": {
|
||||
"name": "启用工具提示"
|
||||
},
|
||||
"Comfy_EnableWorkflowViewRestore": {
|
||||
"name": "在工作流中保存和恢复画布位置及缩放级别"
|
||||
},
|
||||
"Comfy_Extension_Disabled": {
|
||||
"name": "禁用的扩展名称"
|
||||
},
|
||||
"Comfy_FloatRoundingPrecision": {
|
||||
"name": "浮动小部件四舍五入的小数位数 [0 = 自动]。",
|
||||
"tooltip": "(需要重新加载页面)"
|
||||
},
|
||||
"Comfy_Graph_CanvasInfo": {
|
||||
"name": "在左下角显示画布信息(fps等)"
|
||||
},
|
||||
"Comfy_Graph_CanvasMenu": {
|
||||
"name": "显示图形画布菜单"
|
||||
},
|
||||
"Comfy_Graph_CtrlShiftZoom": {
|
||||
"name": "启用快速缩放快捷键(Ctrl + Shift + 拖动)"
|
||||
},
|
||||
"Comfy_Graph_LinkMarkers": {
|
||||
"name": "链接中点标记",
|
||||
"options": {
|
||||
"Arrow": "箭头",
|
||||
"Circle": "圆",
|
||||
"None": "无"
|
||||
}
|
||||
},
|
||||
"Comfy_Graph_ZoomSpeed": {
|
||||
"name": "画布缩放速度"
|
||||
},
|
||||
"Comfy_GroupSelectedNodes_Padding": {
|
||||
"name": "选定节点的组内边距"
|
||||
},
|
||||
"Comfy_Group_DoubleClickTitleToEdit": {
|
||||
"name": "双击组标题以编辑"
|
||||
},
|
||||
"Comfy_InvertMenuScrolling": {
|
||||
"name": "反转上下文菜单滚动"
|
||||
},
|
||||
"Comfy_Keybinding_NewBindings": {
|
||||
"name": "用户设置的键绑定"
|
||||
},
|
||||
"Comfy_Keybinding_UnsetBindings": {
|
||||
"name": "用户取消的键绑定"
|
||||
},
|
||||
"Comfy_LinkRelease_Action": {
|
||||
"name": "释放链接时的操作(无修饰符)",
|
||||
"options": {
|
||||
"context menu": "上下文菜单",
|
||||
"no action": "无操作",
|
||||
"search box": "搜索框"
|
||||
}
|
||||
},
|
||||
"Comfy_LinkRelease_ActionShift": {
|
||||
"name": "释放链接时的操作(Shift)",
|
||||
"options": {
|
||||
"context menu": "上下文菜单",
|
||||
"no action": "无操作",
|
||||
"search box": "搜索框"
|
||||
}
|
||||
},
|
||||
"Comfy_LinkRenderMode": {
|
||||
"name": "链接渲染模式",
|
||||
"options": {
|
||||
"Hidden": "隐藏",
|
||||
"Linear": "线性",
|
||||
"Spline": "样条",
|
||||
"Straight": "直线"
|
||||
}
|
||||
},
|
||||
"Comfy_Locale": {
|
||||
"name": "语言"
|
||||
},
|
||||
"Comfy_MaskEditor_BrushAdjustmentSpeed": {
|
||||
"name": "画笔调整速度倍增器",
|
||||
"tooltip": "控制调整时画笔大小和硬度变化的速度。更高的值意味着更快的变化。"
|
||||
},
|
||||
"Comfy_MaskEditor_UseDominantAxis": {
|
||||
"name": "将画笔调整锁定到主轴",
|
||||
"tooltip": "启用后,画笔调整将仅根据您移动的方向影响大小或硬度。"
|
||||
},
|
||||
"Comfy_MaskEditor_UseNewEditor": {
|
||||
"name": "使用新画笔编辑器",
|
||||
"tooltip": "切换到新的画笔编辑器界面"
|
||||
},
|
||||
"Comfy_MenuPosition": {
|
||||
"name": "保存旧版菜单位置"
|
||||
},
|
||||
"Comfy_ModelLibrary_AutoLoadAll": {
|
||||
"name": "自动加载所有模型文件夹",
|
||||
"tooltip": "如果为真,所有文件夹将在打开模型库时立即加载(这可能会导致加载时的延迟)。如果为假,根级模型文件夹仅在您单击它们时加载。"
|
||||
},
|
||||
"Comfy_ModelLibrary_NameFormat": {
|
||||
"name": "在模型库树视图中显示的名称",
|
||||
"options": {
|
||||
"filename": "文件名",
|
||||
"title": "标题"
|
||||
},
|
||||
"tooltip": "选择“文件名”以在模型列表中呈现原始文件名的简化视图(不带目录或“.safetensors”扩展名)。选择“标题”以显示可配置的模型元数据标题。"
|
||||
},
|
||||
"Comfy_NodeBadge_NodeIdBadgeMode": {
|
||||
"name": "节点ID徽章模式",
|
||||
"options": {
|
||||
"None": "无",
|
||||
"Show all": "显示全部"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeBadge_NodeLifeCycleBadgeMode": {
|
||||
"name": "节点生命周期徽章模式",
|
||||
"options": {
|
||||
"None": "无",
|
||||
"Show all": "显示全部"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeBadge_NodeSourceBadgeMode": {
|
||||
"name": "节点源徽章模式",
|
||||
"options": {
|
||||
"Hide built-in": "隐藏内置",
|
||||
"None": "无",
|
||||
"Show all": "显示全部"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeInputConversionSubmenus": {
|
||||
"name": "在节点上下文菜单中,将输入/小部件之间转换的条目放置在子菜单中。"
|
||||
},
|
||||
"Comfy_NodeLibrary_Bookmarks": {
|
||||
"name": "节点库书签及显示名称(已弃用)"
|
||||
},
|
||||
"Comfy_NodeLibrary_BookmarksCustomization": {
|
||||
"name": "节点库书签自定义"
|
||||
},
|
||||
"Comfy_NodeLibrary_Bookmarks_V2": {
|
||||
"name": "节点库书签v2及唯一名称"
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl": {
|
||||
"name": "节点搜索框实现",
|
||||
"options": {
|
||||
"default": "默认",
|
||||
"litegraph (legacy)": "litegraph(遗留)"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_NodePreview": {
|
||||
"name": "节点预览",
|
||||
"tooltip": "仅适用于默认实现"
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_ShowCategory": {
|
||||
"name": "在搜索结果中显示节点类别",
|
||||
"tooltip": "仅适用于默认实现"
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_ShowIdName": {
|
||||
"name": "在搜索结果中显示节点ID名称",
|
||||
"tooltip": "仅适用于默认实现"
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_ShowNodeFrequency": {
|
||||
"name": "在搜索结果中显示节点频率",
|
||||
"tooltip": "仅适用于默认实现"
|
||||
},
|
||||
"Comfy_NodeSuggestions_number": {
|
||||
"name": "节点建议数量",
|
||||
"tooltip": "仅适用于 litegraph 搜索框/上下文菜单"
|
||||
},
|
||||
"Comfy_Node_AutoSnapLinkToSlot": {
|
||||
"name": "自动将链接吸附到节点插槽",
|
||||
"tooltip": "在节点上拖动链接时,链接会自动吸附到节点的可用输入插槽。"
|
||||
},
|
||||
"Comfy_Node_BypassAllLinksOnDelete": {
|
||||
"name": "删除节点时保留所有链接",
|
||||
"tooltip": "删除节点时,尝试重新连接其所有输入和输出链接(绕过已删除的节点)。"
|
||||
},
|
||||
"Comfy_Node_DoubleClickTitleToEdit": {
|
||||
"name": "双击节点标题以编辑"
|
||||
},
|
||||
"Comfy_Node_MiddleClickRerouteNode": {
|
||||
"name": "中键单击创建新的重定向节点"
|
||||
},
|
||||
"Comfy_Node_Opacity": {
|
||||
"name": "节点不透明度"
|
||||
},
|
||||
"Comfy_Node_ShowDeprecated": {
|
||||
"name": "在搜索中显示已弃用的节点",
|
||||
"tooltip": "已弃用的节点在UI中默认隐藏,但在使用它们的现有工作流中仍然有效。"
|
||||
},
|
||||
"Comfy_Node_ShowExperimental": {
|
||||
"name": "在搜索中显示实验性节点",
|
||||
"tooltip": "实验性节点在UI中标记为实验性,可能在未来版本中发生重大变化或被移除。在生产工作流中谨慎使用。"
|
||||
},
|
||||
"Comfy_Node_SnapHighlightsNode": {
|
||||
"name": "吸附高亮节点",
|
||||
"tooltip": "在拖动链接经过具有可用输入插槽的节点时,高亮显示该节点。"
|
||||
},
|
||||
"Comfy_Pointer_ClickBufferTime": {
|
||||
"name": "指针点击漂移延迟",
|
||||
"tooltip": "按下指针按钮后,这是指针移动可以被忽略的最大时间(以毫秒为单位)。\n\n有助于防止在点击时意外推动对象。"
|
||||
},
|
||||
"Comfy_Pointer_ClickDrift": {
|
||||
"name": "指针点击漂移(最大距离)",
|
||||
"tooltip": "如果指针在按住按钮时移动超过此距离,则视为拖动(而不是点击)。\n\n有助于防止在点击时意外推动对象。"
|
||||
},
|
||||
"Comfy_Pointer_DoubleClickTime": {
|
||||
"name": "双击间隔(最大)",
|
||||
"tooltip": "双击的两次点击之间的最大时间(以毫秒为单位)。增加此值可能有助于解决双击有时未被注册的问题。"
|
||||
},
|
||||
"Comfy_PreviewFormat": {
|
||||
"name": "预览图像格式",
|
||||
"tooltip": "在图像小部件中显示预览时,将其转换为轻量级图像,例如webp、jpeg、webp;50等。"
|
||||
},
|
||||
"Comfy_PromptFilename": {
|
||||
"name": "保存工作流时提示文件名"
|
||||
},
|
||||
"Comfy_QueueButton_BatchCountLimit": {
|
||||
"name": "批处理计数限制",
|
||||
"tooltip": "一次点击按钮添加到队列的最大任务数量"
|
||||
},
|
||||
"Comfy_Queue_ImageFit": {
|
||||
"name": "队列图像适应"
|
||||
},
|
||||
"Comfy_Queue_MaxHistoryItems": {
|
||||
"name": "队列历史大小",
|
||||
"tooltip": "队列历史中显示的最大任务数量。"
|
||||
},
|
||||
"Comfy_RerouteBeta": {
|
||||
"name": "选择加入重定向测试版",
|
||||
"tooltip": "启用新的本地重定向。\n\n可以通过按住alt并从链接线拖动来添加重定向,或在链接菜单中添加。\n\n禁用此选项不会造成破坏 - 重定向将被隐藏。"
|
||||
},
|
||||
"Comfy_Server_LaunchArgs": {
|
||||
"name": "服务器启动参数",
|
||||
"tooltip": "这些是启动服务器时传递给服务器的实际参数。"
|
||||
},
|
||||
"Comfy_Server_ServerConfigValues": {
|
||||
"name": "前端显示的服务器配置值",
|
||||
"tooltip": "仅用于前端显示的服务器配置值"
|
||||
},
|
||||
"Comfy_Settings_ExtensionPanel": {
|
||||
"name": "在设置对话框中显示扩展面板"
|
||||
},
|
||||
"Comfy_Sidebar_Location": {
|
||||
"name": "侧边栏位置",
|
||||
"options": {
|
||||
"left": "左侧",
|
||||
"right": "右侧"
|
||||
}
|
||||
},
|
||||
"Comfy_Sidebar_Size": {
|
||||
"name": "侧边栏大小",
|
||||
"options": {
|
||||
"normal": "正常",
|
||||
"small": "小"
|
||||
}
|
||||
},
|
||||
"Comfy_SnapToGrid_GridSize": {
|
||||
"name": "吸附到网格大小",
|
||||
"tooltip": "在按住shift拖动和调整节点大小时,它们将对齐到网格,这控制着网格的大小。"
|
||||
},
|
||||
"Comfy_TextareaWidget_FontSize": {
|
||||
"name": "文本区域小部件字体大小"
|
||||
},
|
||||
"Comfy_TextareaWidget_Spellcheck": {
|
||||
"name": "文本区域小部件拼写检查"
|
||||
},
|
||||
"Comfy_TreeExplorer_ItemPadding": {
|
||||
"name": "树形浏览器项目内边距"
|
||||
},
|
||||
"Comfy_UseNewMenu": {
|
||||
"name": "使用新菜单",
|
||||
"options": {
|
||||
"Bottom": "底部",
|
||||
"Disabled": "禁用",
|
||||
"Top": "顶部"
|
||||
}
|
||||
},
|
||||
"Comfy_Validation_NodeDefs": {
|
||||
"name": "验证节点定义(慢)",
|
||||
"tooltip": "推荐给节点开发者。这将在启动时验证所有节点定义。"
|
||||
},
|
||||
"Comfy_Validation_Workflows": {
|
||||
"name": "验证工作流"
|
||||
},
|
||||
"Comfy_WidgetControlMode": {
|
||||
"name": "小部件控制模式",
|
||||
"options": {
|
||||
"after": "之后",
|
||||
"before": "之前"
|
||||
},
|
||||
"tooltip": "控制小部件值的更新时机(随机/增量/减量),可以在提示排队之前或之后。"
|
||||
},
|
||||
"Comfy_Window_UnloadConfirmation": {
|
||||
"name": "关闭窗口时显示确认"
|
||||
},
|
||||
"Comfy_Workflow_ConfirmDelete": {
|
||||
"name": "删除工作流时显示确认"
|
||||
},
|
||||
"Comfy_Workflow_ShowMissingModelsWarning": {
|
||||
"name": "显示缺失模型警告"
|
||||
},
|
||||
"Comfy_Workflow_ShowMissingNodesWarning": {
|
||||
"name": "显示缺失节点警告"
|
||||
},
|
||||
"Comfy_Workflow_SortNodeIdOnSave": {
|
||||
"name": "保存工作流时排序节点ID"
|
||||
},
|
||||
"Comfy_Workflow_WorkflowTabsPosition": {
|
||||
"name": "已打开工作流的位置",
|
||||
"options": {
|
||||
"Sidebar": "侧边栏",
|
||||
"Topbar": "顶部栏"
|
||||
}
|
||||
},
|
||||
"LiteGraph_Canvas_MaximumFps": {
|
||||
"name": "最大FPS",
|
||||
"tooltip": "画布允许渲染的最大帧数。限制GPU使用以换取流畅度。如果为0,则使用屏幕刷新率。默认值:0"
|
||||
},
|
||||
"pysssss_SnapToGrid": {
|
||||
"name": "始终吸附到网格"
|
||||
}
|
||||
},
|
||||
"sideToolbar": {
|
||||
"browseTemplates": "浏览示例模板",
|
||||
"downloads": "下载",
|
||||
|
||||
@@ -249,6 +249,24 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"CLIPTextEncodePixArtAlpha": {
|
||||
"description": "对文本进行编码并为PixArt Alpha设置分辨率条件。不适用于PixArt Sigma。",
|
||||
"display_name": "CLIPTextEncodePixArtAlpha",
|
||||
"inputs": {
|
||||
"clip": {
|
||||
"name": "clip"
|
||||
},
|
||||
"height": {
|
||||
"name": "高度"
|
||||
},
|
||||
"text": {
|
||||
"name": "文本"
|
||||
},
|
||||
"width": {
|
||||
"name": "宽度"
|
||||
}
|
||||
}
|
||||
},
|
||||
"CLIPTextEncodeSD3": {
|
||||
"display_name": "CLIP文本编码SD3",
|
||||
"inputs": {
|
||||
@@ -650,6 +668,31 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"ConditioningStableAudio": {
|
||||
"display_name": "StableAudio条件",
|
||||
"inputs": {
|
||||
"negative": {
|
||||
"name": "负向"
|
||||
},
|
||||
"positive": {
|
||||
"name": "正向"
|
||||
},
|
||||
"seconds_start": {
|
||||
"name": "开始秒数"
|
||||
},
|
||||
"seconds_total": {
|
||||
"name": "总秒数"
|
||||
}
|
||||
},
|
||||
"outputs": {
|
||||
"0": {
|
||||
"name": "正向"
|
||||
},
|
||||
"1": {
|
||||
"name": "负向"
|
||||
}
|
||||
}
|
||||
},
|
||||
"ConditioningTimestepsRange": {
|
||||
"display_name": "时间步范围",
|
||||
"inputs": {
|
||||
@@ -4180,6 +4223,35 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"Preview3D": {
|
||||
"display_name": "3D预览",
|
||||
"inputs": {
|
||||
"bg_color": {
|
||||
"name": "背景颜色"
|
||||
},
|
||||
"camera_type": {
|
||||
"name": "相机类型"
|
||||
},
|
||||
"light_intensity": {
|
||||
"name": "光照强度"
|
||||
},
|
||||
"material": {
|
||||
"name": "材质"
|
||||
},
|
||||
"model_file": {
|
||||
"name": "模型文件"
|
||||
},
|
||||
"show_grid": {
|
||||
"name": "显示网格"
|
||||
},
|
||||
"up_direction": {
|
||||
"name": "上方向"
|
||||
},
|
||||
"view": {
|
||||
"name": "视图"
|
||||
}
|
||||
}
|
||||
},
|
||||
"PreviewAudio": {
|
||||
"display_name": "预览音频",
|
||||
"inputs": {
|
||||
@@ -5215,6 +5287,14 @@
|
||||
"samples": {
|
||||
"name": "样本"
|
||||
},
|
||||
"temporal_overlap": {
|
||||
"name": "时间重叠",
|
||||
"tooltip": "仅用于视频VAEs:重叠的帧数。"
|
||||
},
|
||||
"temporal_size": {
|
||||
"name": "时间尺寸",
|
||||
"tooltip": "仅用于视频VAEs:一次解码的帧数。"
|
||||
},
|
||||
"tile_size": {
|
||||
"name": "瓷砖大小"
|
||||
},
|
||||
@@ -5265,9 +5345,20 @@
|
||||
"VAEEncodeTiled": {
|
||||
"display_name": "VAE编码(平铺)",
|
||||
"inputs": {
|
||||
"overlap": {
|
||||
"name": "重叠"
|
||||
},
|
||||
"pixels": {
|
||||
"name": "像素"
|
||||
},
|
||||
"temporal_overlap": {
|
||||
"name": "时间重叠",
|
||||
"tooltip": "仅用于视频VAEs:重叠的帧数。"
|
||||
},
|
||||
"temporal_size": {
|
||||
"name": "时间尺寸",
|
||||
"tooltip": "仅用于视频VAEs:一次编码的帧数。"
|
||||
},
|
||||
"tile_size": {
|
||||
"name": "瓷砖大小"
|
||||
},
|
||||
|
||||
344
src/locales/zh/settings.json
Normal file
344
src/locales/zh/settings.json
Normal file
@@ -0,0 +1,344 @@
|
||||
{
|
||||
"Comfy-Desktop_AutoUpdate": {
|
||||
"name": "自动检查更新"
|
||||
},
|
||||
"Comfy-Desktop_SendStatistics": {
|
||||
"name": "发送匿名崩溃报告"
|
||||
},
|
||||
"Comfy_ColorPalette": {
|
||||
"name": "调色板"
|
||||
},
|
||||
"Comfy_ConfirmClear": {
|
||||
"name": "清除工作流时需要确认"
|
||||
},
|
||||
"Comfy_DOMClippingEnabled": {
|
||||
"name": "启用DOM元素裁剪(启用可能会降低性能)"
|
||||
},
|
||||
"Comfy_DevMode": {
|
||||
"name": "启用开发模式选项(API保存等)"
|
||||
},
|
||||
"Comfy_DisableFloatRounding": {
|
||||
"name": "禁用默认浮动小部件四舍五入。",
|
||||
"tooltip": "(需要重新加载页面) 当后端节点设置了四舍五入时,无法禁用四舍五入。"
|
||||
},
|
||||
"Comfy_DisableSliders": {
|
||||
"name": "禁用节点小部件滑块"
|
||||
},
|
||||
"Comfy_EditAttention_Delta": {
|
||||
"name": "Ctrl+上/下 精度"
|
||||
},
|
||||
"Comfy_EnableTooltips": {
|
||||
"name": "启用工具提示"
|
||||
},
|
||||
"Comfy_EnableWorkflowViewRestore": {
|
||||
"name": "在工作流中保存和恢复画布位置及缩放级别"
|
||||
},
|
||||
"Comfy_Extension_Disabled": {
|
||||
"name": "禁用的扩展名称"
|
||||
},
|
||||
"Comfy_FloatRoundingPrecision": {
|
||||
"name": "浮动小部件四舍五入的小数位数 [0 = 自动]。",
|
||||
"tooltip": "(需要重新加载页面)"
|
||||
},
|
||||
"Comfy_Graph_CanvasInfo": {
|
||||
"name": "在左下角显示画布信息(fps等)"
|
||||
},
|
||||
"Comfy_Graph_CanvasMenu": {
|
||||
"name": "显示图形画布菜单"
|
||||
},
|
||||
"Comfy_Graph_CtrlShiftZoom": {
|
||||
"name": "启用快速缩放快捷键(Ctrl + Shift + 拖动)"
|
||||
},
|
||||
"Comfy_Graph_LinkMarkers": {
|
||||
"name": "链接中点标记",
|
||||
"options": {
|
||||
"Arrow": "箭头",
|
||||
"Circle": "圆",
|
||||
"None": "无"
|
||||
}
|
||||
},
|
||||
"Comfy_Graph_ZoomSpeed": {
|
||||
"name": "画布缩放速度"
|
||||
},
|
||||
"Comfy_GroupSelectedNodes_Padding": {
|
||||
"name": "选定节点的组内边距"
|
||||
},
|
||||
"Comfy_Group_DoubleClickTitleToEdit": {
|
||||
"name": "双击组标题以编辑"
|
||||
},
|
||||
"Comfy_InvertMenuScrolling": {
|
||||
"name": "反转上下文菜单滚动"
|
||||
},
|
||||
"Comfy_Keybinding_NewBindings": {
|
||||
"name": "用户设置的键绑定"
|
||||
},
|
||||
"Comfy_Keybinding_UnsetBindings": {
|
||||
"name": "用户取消的键绑定"
|
||||
},
|
||||
"Comfy_LinkRelease_Action": {
|
||||
"name": "释放链接时的操作(无修饰符)",
|
||||
"options": {
|
||||
"context menu": "上下文菜单",
|
||||
"no action": "无操作",
|
||||
"search box": "搜索框"
|
||||
}
|
||||
},
|
||||
"Comfy_LinkRelease_ActionShift": {
|
||||
"name": "释放链接时的操作(Shift)",
|
||||
"options": {
|
||||
"context menu": "上下文菜单",
|
||||
"no action": "无操作",
|
||||
"search box": "搜索框"
|
||||
}
|
||||
},
|
||||
"Comfy_LinkRenderMode": {
|
||||
"name": "链接渲染模式",
|
||||
"options": {
|
||||
"Hidden": "隐藏",
|
||||
"Linear": "线性",
|
||||
"Spline": "样条",
|
||||
"Straight": "直线"
|
||||
}
|
||||
},
|
||||
"Comfy_Locale": {
|
||||
"name": "语言"
|
||||
},
|
||||
"Comfy_MaskEditor_BrushAdjustmentSpeed": {
|
||||
"name": "画笔调整速度倍增器",
|
||||
"tooltip": "控制调整时画笔大小和硬度变化的速度。更高的值意味着更快的变化。"
|
||||
},
|
||||
"Comfy_MaskEditor_UseDominantAxis": {
|
||||
"name": "将画笔调整锁定到主轴",
|
||||
"tooltip": "启用后,画笔调整将仅根据您移动的方向影响大小或硬度。"
|
||||
},
|
||||
"Comfy_MaskEditor_UseNewEditor": {
|
||||
"name": "使用新画笔编辑器",
|
||||
"tooltip": "切换到新的画笔编辑器界面"
|
||||
},
|
||||
"Comfy_MenuPosition": {
|
||||
"name": "保存旧版菜单位置"
|
||||
},
|
||||
"Comfy_ModelLibrary_AutoLoadAll": {
|
||||
"name": "自动加载所有模型文件夹",
|
||||
"tooltip": "如果为真,所有文件夹将在打开模型库时立即加载(这可能会导致加载时的延迟)。如果为假,根级模型文件夹仅在您单击它们时加载。"
|
||||
},
|
||||
"Comfy_ModelLibrary_NameFormat": {
|
||||
"name": "在模型库树视图中显示的名称",
|
||||
"options": {
|
||||
"filename": "文件名",
|
||||
"title": "标题"
|
||||
},
|
||||
"tooltip": "选择“文件名”以在模型列表中呈现原始文件名的简化视图(不带目录或“.safetensors”扩展名)。选择“标题”以显示可配置的模型元数据标题。"
|
||||
},
|
||||
"Comfy_NodeBadge_NodeIdBadgeMode": {
|
||||
"name": "节点ID徽章模式",
|
||||
"options": {
|
||||
"None": "无",
|
||||
"Show all": "显示全部"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeBadge_NodeLifeCycleBadgeMode": {
|
||||
"name": "节点生命周期徽章模式",
|
||||
"options": {
|
||||
"None": "无",
|
||||
"Show all": "显示全部"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeBadge_NodeSourceBadgeMode": {
|
||||
"name": "节点源徽章模式",
|
||||
"options": {
|
||||
"Hide built-in": "隐藏内置",
|
||||
"None": "无",
|
||||
"Show all": "显示全部"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeInputConversionSubmenus": {
|
||||
"name": "在节点上下文菜单中,将输入/小部件之间转换的条目放置在子菜单中。"
|
||||
},
|
||||
"Comfy_NodeLibrary_Bookmarks": {
|
||||
"name": "节点库书签及显示名称(已弃用)"
|
||||
},
|
||||
"Comfy_NodeLibrary_BookmarksCustomization": {
|
||||
"name": "节点库书签自定义"
|
||||
},
|
||||
"Comfy_NodeLibrary_Bookmarks_V2": {
|
||||
"name": "节点库书签v2及唯一名称"
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl": {
|
||||
"name": "节点搜索框实现",
|
||||
"options": {
|
||||
"default": "默认",
|
||||
"litegraph (legacy)": "litegraph(遗留)"
|
||||
}
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_NodePreview": {
|
||||
"name": "节点预览",
|
||||
"tooltip": "仅适用于默认实现"
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_ShowCategory": {
|
||||
"name": "在搜索结果中显示节点类别",
|
||||
"tooltip": "仅适用于默认实现"
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_ShowIdName": {
|
||||
"name": "在搜索结果中显示节点ID名称",
|
||||
"tooltip": "仅适用于默认实现"
|
||||
},
|
||||
"Comfy_NodeSearchBoxImpl_ShowNodeFrequency": {
|
||||
"name": "在搜索结果中显示节点频率",
|
||||
"tooltip": "仅适用于默认实现"
|
||||
},
|
||||
"Comfy_NodeSuggestions_number": {
|
||||
"name": "节点建议数量",
|
||||
"tooltip": "仅适用于 litegraph 搜索框/上下文菜单"
|
||||
},
|
||||
"Comfy_Node_AutoSnapLinkToSlot": {
|
||||
"name": "自动将链接吸附到节点插槽",
|
||||
"tooltip": "在节点上拖动链接时,链接会自动吸附到节点的可用输入插槽。"
|
||||
},
|
||||
"Comfy_Node_BypassAllLinksOnDelete": {
|
||||
"name": "删除节点时保留所有链接",
|
||||
"tooltip": "删除节点时,尝试重新连接其所有输入和输出链接(绕过已删除的节点)。"
|
||||
},
|
||||
"Comfy_Node_DoubleClickTitleToEdit": {
|
||||
"name": "双击节点标题以编辑"
|
||||
},
|
||||
"Comfy_Node_MiddleClickRerouteNode": {
|
||||
"name": "中键单击创建新的重定向节点"
|
||||
},
|
||||
"Comfy_Node_Opacity": {
|
||||
"name": "节点不透明度"
|
||||
},
|
||||
"Comfy_Node_ShowDeprecated": {
|
||||
"name": "在搜索中显示已弃用的节点",
|
||||
"tooltip": "已弃用的节点在UI中默认隐藏,但在使用它们的现有工作流中仍然有效。"
|
||||
},
|
||||
"Comfy_Node_ShowExperimental": {
|
||||
"name": "在搜索中显示实验性节点",
|
||||
"tooltip": "实验性节点在UI中标记为实验性,可能在未来版本中发生重大变化或被移除。在生产工作流中谨慎使用。"
|
||||
},
|
||||
"Comfy_Node_SnapHighlightsNode": {
|
||||
"name": "吸附高亮节点",
|
||||
"tooltip": "在拖动链接经过具有可用输入插槽的节点时,高亮显示该节点。"
|
||||
},
|
||||
"Comfy_Pointer_ClickBufferTime": {
|
||||
"name": "指针点击漂移延迟",
|
||||
"tooltip": "按下指针按钮后,这是指针移动可以被忽略的最大时间(以毫秒为单位)。\n\n有助于防止在点击时意外推动对象。"
|
||||
},
|
||||
"Comfy_Pointer_ClickDrift": {
|
||||
"name": "指针点击漂移(最大距离)",
|
||||
"tooltip": "如果指针在按住按钮时移动超过此距离,则视为拖动(而不是点击)。\n\n有助于防止在点击时意外推动对象。"
|
||||
},
|
||||
"Comfy_Pointer_DoubleClickTime": {
|
||||
"name": "双击间隔(最大)",
|
||||
"tooltip": "双击的两次点击之间的最大时间(以毫秒为单位)。增加此值可能有助于解决双击有时未被注册的问题。"
|
||||
},
|
||||
"Comfy_PreviewFormat": {
|
||||
"name": "预览图像格式",
|
||||
"tooltip": "在图像小部件中显示预览时,将其转换为轻量级图像,例如webp、jpeg、webp;50等。"
|
||||
},
|
||||
"Comfy_PromptFilename": {
|
||||
"name": "保存工作流时提示文件名"
|
||||
},
|
||||
"Comfy_QueueButton_BatchCountLimit": {
|
||||
"name": "批处理计数限制",
|
||||
"tooltip": "一次点击按钮添加到队列的最大任务数量"
|
||||
},
|
||||
"Comfy_Queue_ImageFit": {
|
||||
"name": "队列图像适应"
|
||||
},
|
||||
"Comfy_Queue_MaxHistoryItems": {
|
||||
"name": "队列历史大小",
|
||||
"tooltip": "队列历史中显示的最大任务数量。"
|
||||
},
|
||||
"Comfy_RerouteBeta": {
|
||||
"name": "选择加入重定向测试版",
|
||||
"tooltip": "启用新的本地重定向。\n\n可以通过按住alt并从链接线拖动来添加重定向,或在链接菜单中添加。\n\n禁用此选项不会造成破坏 - 重定向将被隐藏。"
|
||||
},
|
||||
"Comfy_Server_LaunchArgs": {
|
||||
"name": "服务器启动参数",
|
||||
"tooltip": "这些是启动服务器时传递给服务器的实际参数。"
|
||||
},
|
||||
"Comfy_Server_ServerConfigValues": {
|
||||
"name": "前端显示的服务器配置值",
|
||||
"tooltip": "仅用于前端显示的服务器配置值"
|
||||
},
|
||||
"Comfy_Sidebar_Location": {
|
||||
"name": "侧边栏位置",
|
||||
"options": {
|
||||
"left": "左侧",
|
||||
"right": "右侧"
|
||||
}
|
||||
},
|
||||
"Comfy_Sidebar_Size": {
|
||||
"name": "侧边栏大小",
|
||||
"options": {
|
||||
"normal": "正常",
|
||||
"small": "小"
|
||||
}
|
||||
},
|
||||
"Comfy_SnapToGrid_GridSize": {
|
||||
"name": "吸附到网格大小",
|
||||
"tooltip": "在按住shift拖动和调整节点大小时,它们将对齐到网格,这控制着网格的大小。"
|
||||
},
|
||||
"Comfy_TextareaWidget_FontSize": {
|
||||
"name": "文本区域小部件字体大小"
|
||||
},
|
||||
"Comfy_TextareaWidget_Spellcheck": {
|
||||
"name": "文本区域小部件拼写检查"
|
||||
},
|
||||
"Comfy_TreeExplorer_ItemPadding": {
|
||||
"name": "树形浏览器项目内边距"
|
||||
},
|
||||
"Comfy_UseNewMenu": {
|
||||
"name": "使用新菜单",
|
||||
"options": {
|
||||
"Bottom": "底部",
|
||||
"Disabled": "禁用",
|
||||
"Top": "顶部"
|
||||
}
|
||||
},
|
||||
"Comfy_Validation_NodeDefs": {
|
||||
"name": "验证节点定义(慢)",
|
||||
"tooltip": "推荐给节点开发者。这将在启动时验证所有节点定义。"
|
||||
},
|
||||
"Comfy_Validation_Workflows": {
|
||||
"name": "验证工作流"
|
||||
},
|
||||
"Comfy_WidgetControlMode": {
|
||||
"name": "小部件控制模式",
|
||||
"options": {
|
||||
"after": "之后",
|
||||
"before": "之前"
|
||||
},
|
||||
"tooltip": "控制小部件值的更新时机(随机/增量/减量),可以在提示排队之前或之后。"
|
||||
},
|
||||
"Comfy_Window_UnloadConfirmation": {
|
||||
"name": "关闭窗口时显示确认"
|
||||
},
|
||||
"Comfy_Workflow_ConfirmDelete": {
|
||||
"name": "删除工作流时显示确认"
|
||||
},
|
||||
"Comfy_Workflow_ShowMissingModelsWarning": {
|
||||
"name": "显示缺失模型警告"
|
||||
},
|
||||
"Comfy_Workflow_ShowMissingNodesWarning": {
|
||||
"name": "显示缺失节点警告"
|
||||
},
|
||||
"Comfy_Workflow_SortNodeIdOnSave": {
|
||||
"name": "保存工作流时排序节点ID"
|
||||
},
|
||||
"Comfy_Workflow_WorkflowTabsPosition": {
|
||||
"name": "已打开工作流的位置",
|
||||
"options": {
|
||||
"Sidebar": "侧边栏",
|
||||
"Topbar": "顶部栏"
|
||||
}
|
||||
},
|
||||
"LiteGraph_Canvas_MaximumFps": {
|
||||
"name": "最大FPS",
|
||||
"tooltip": "画布允许渲染的最大帧数。限制GPU使用以换取流畅度。如果为0,则使用屏幕刷新率。默认值:0"
|
||||
},
|
||||
"pysssss_SnapToGrid": {
|
||||
"name": "始终吸附到网格"
|
||||
}
|
||||
}
|
||||
@@ -63,7 +63,6 @@ import { useWidgetStore } from '@/stores/widgetStore'
|
||||
import { deserialiseAndCreate } from '@/extensions/core/vintageClipboard'
|
||||
import { st } from '@/i18n'
|
||||
import { normalizeI18nKey } from '@/utils/formatUtil'
|
||||
import { ISerialisedGraph } from '@comfyorg/litegraph'
|
||||
|
||||
export const ANIM_PREVIEW_WIDGET = '$$comfy_animation_preview'
|
||||
|
||||
@@ -591,9 +590,13 @@ export class ComfyApp {
|
||||
options.push({
|
||||
content: 'Bypass',
|
||||
callback: (obj) => {
|
||||
if (this.mode === LGraphEventMode.BYPASS)
|
||||
this.mode = LGraphEventMode.ALWAYS
|
||||
else this.mode = LGraphEventMode.BYPASS
|
||||
const mode =
|
||||
this.mode === LGraphEventMode.BYPASS
|
||||
? LGraphEventMode.ALWAYS
|
||||
: LGraphEventMode.BYPASS
|
||||
for (const item of app.canvas.selectedItems) {
|
||||
if (item instanceof LGraphNode) item.mode = mode
|
||||
}
|
||||
this.graph.change()
|
||||
}
|
||||
})
|
||||
@@ -1548,6 +1551,7 @@ export class ComfyApp {
|
||||
api.addEventListener('executing', ({ detail }) => {
|
||||
this.progress = null
|
||||
this.graph.setDirtyCanvas(true, false)
|
||||
this.revokePreviews(this.runningNodeId)
|
||||
delete this.nodePreviewImages[this.runningNodeId]
|
||||
})
|
||||
|
||||
@@ -1590,6 +1594,8 @@ export class ComfyApp {
|
||||
|
||||
const blob = detail
|
||||
const blobUrl = URL.createObjectURL(blob)
|
||||
// Ensure clean up if `executing` event is missed.
|
||||
this.revokePreviews(id)
|
||||
this.nodePreviewImages[id] = [blobUrl]
|
||||
})
|
||||
|
||||
@@ -1610,52 +1616,6 @@ export class ComfyApp {
|
||||
}
|
||||
}
|
||||
|
||||
#addWidgetLinkHandling() {
|
||||
app.canvas.getWidgetLinkType = function (widget, node) {
|
||||
const nodeDefStore = useNodeDefStore()
|
||||
const nodeDef = nodeDefStore.nodeDefsByName[node.type]
|
||||
const input = nodeDef.inputs.getInput(widget.name)
|
||||
return input?.type
|
||||
}
|
||||
|
||||
type ConnectingWidgetLink = {
|
||||
subType: 'connectingWidgetLink'
|
||||
widget: IWidget
|
||||
node: LGraphNode
|
||||
link: { node: LGraphNode; slot: number }
|
||||
}
|
||||
|
||||
document.addEventListener(
|
||||
'litegraph:canvas',
|
||||
async (e: CustomEvent<ConnectingWidgetLink>) => {
|
||||
if (e.detail.subType === 'connectingWidgetLink') {
|
||||
const { convertToInput } = await import(
|
||||
'@/extensions/core/widgetInputs'
|
||||
)
|
||||
|
||||
const { node, link, widget } = e.detail
|
||||
if (!node || !link || !widget) return
|
||||
|
||||
const nodeData = node.constructor.nodeData
|
||||
if (!nodeData) return
|
||||
const all = {
|
||||
...nodeData?.input?.required,
|
||||
...nodeData?.input?.optional
|
||||
}
|
||||
const inputSpec = all[widget.name]
|
||||
if (!inputSpec) return
|
||||
|
||||
const input = convertToInput(node, widget, inputSpec)
|
||||
if (!input) return
|
||||
|
||||
const originNode = link.node
|
||||
|
||||
originNode.connect(link.slot, node, node.inputs.lastIndexOf(input))
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
#addAfterConfigureHandler() {
|
||||
const app = this
|
||||
const onConfigure = app.graph.onConfigure
|
||||
@@ -1680,13 +1640,15 @@ export class ComfyApp {
|
||||
* Loads all extensions from the API into the window in parallel
|
||||
*/
|
||||
async #loadExtensions() {
|
||||
useExtensionStore().loadDisabledExtensionNames()
|
||||
const extensionStore = useExtensionStore()
|
||||
extensionStore.loadDisabledExtensionNames()
|
||||
|
||||
const extensions = await api.getExtensions()
|
||||
|
||||
// Need to load core extensions first as some custom extensions
|
||||
// may depend on them.
|
||||
await import('../extensions/core/index')
|
||||
extensionStore.captureCoreExtensions()
|
||||
await Promise.all(
|
||||
extensions
|
||||
.filter((extension) => !extension.includes('extensions/core'))
|
||||
@@ -1782,7 +1744,6 @@ export class ComfyApp {
|
||||
this.#addDropHandler()
|
||||
this.#addCopyHandler()
|
||||
this.#addPasteHandler()
|
||||
this.#addWidgetLinkHandling()
|
||||
|
||||
await this.#invokeExtensionsAsync('setup')
|
||||
}
|
||||
@@ -2883,11 +2844,24 @@ export class ComfyApp {
|
||||
app.graph.setDirtyCanvas(true, true)
|
||||
}
|
||||
|
||||
/**
|
||||
* Frees memory allocated to image preview blobs for a specific node, by revoking the URLs associated with them.
|
||||
* @param nodeId ID of the node to revoke all preview images of
|
||||
*/
|
||||
revokePreviews(nodeId: NodeId) {
|
||||
if (!this.nodePreviewImages[nodeId]?.[Symbol.iterator]) return
|
||||
for (const url of this.nodePreviewImages[nodeId]) {
|
||||
URL.revokeObjectURL(url)
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Clean current state
|
||||
*/
|
||||
clean() {
|
||||
this.nodeOutputs = {}
|
||||
for (const id of Object.keys(this.nodePreviewImages)) {
|
||||
this.revokePreviews(id)
|
||||
}
|
||||
this.nodePreviewImages = {}
|
||||
this.lastNodeErrors = null
|
||||
this.lastExecutionError = null
|
||||
|
||||
@@ -39,11 +39,27 @@ export function showMissingModelsWarning(props: {
|
||||
})
|
||||
}
|
||||
|
||||
export function showSettingsDialog() {
|
||||
export function showSettingsDialog(
|
||||
panel?: 'about' | 'keybinding' | 'extension' | 'server-config'
|
||||
) {
|
||||
const props = panel ? { props: { defaultPanel: panel } } : undefined
|
||||
|
||||
useDialogStore().showDialog({
|
||||
key: 'global-settings',
|
||||
headerComponent: SettingDialogHeader,
|
||||
component: SettingDialogContent
|
||||
component: SettingDialogContent,
|
||||
...props
|
||||
})
|
||||
}
|
||||
|
||||
export function showAboutDialog() {
|
||||
useDialogStore().showDialog({
|
||||
key: 'global-settings',
|
||||
headerComponent: SettingDialogHeader,
|
||||
component: SettingDialogContent,
|
||||
props: {
|
||||
defaultPanel: 'about'
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -327,7 +327,8 @@ export const workflowService = {
|
||||
skip_events: true,
|
||||
skip_render: true
|
||||
})
|
||||
canvas.selectNodes()
|
||||
canvas.reroutesEnabled = app.canvas.reroutesEnabled
|
||||
canvas.selectItems()
|
||||
canvas.copyToClipboard()
|
||||
app.canvas.pasteFromClipboard()
|
||||
if (old !== null) {
|
||||
|
||||
@@ -9,6 +9,27 @@ import { useMenuItemStore } from './menuItemStore'
|
||||
import { useBottomPanelStore } from './workspace/bottomPanelStore'
|
||||
import { useWidgetStore } from './widgetStore'
|
||||
|
||||
/**
|
||||
* These extensions are always active, even if they are disabled in the setting.
|
||||
* TODO(https://github.com/Comfy-Org/ComfyUI_frontend/issues/1996):
|
||||
* Migrate logic to out of extensions/core, as features provided
|
||||
* by these extensions are now essential to core.
|
||||
*/
|
||||
export const ALWAYS_ENABLED_EXTENSIONS: readonly string[] = [
|
||||
'Comfy.ColorPalette'
|
||||
]
|
||||
|
||||
export const ALWAYS_DISABLED_EXTENSIONS: readonly string[] = [
|
||||
// pysssss.Locking is replaced by pin/unpin in ComfyUI core.
|
||||
// https://github.com/Comfy-Org/litegraph.js/pull/117
|
||||
'pysssss.Locking',
|
||||
// pysssss.SnapToGrid is replaced by Comfy.Graph.AlwaysSnapToGrid in ComfyUI core.
|
||||
// pysssss.SnapToGrid tries to write global app.shiftDown state, which is no longer
|
||||
// allowed since v1.3.12.
|
||||
// https://github.com/Comfy-Org/ComfyUI_frontend/issues/1176
|
||||
'pysssss.SnapToGrid'
|
||||
]
|
||||
|
||||
export const useExtensionStore = defineStore('extension', () => {
|
||||
// For legacy reasons, the name uniquely identifies an extension
|
||||
const extensionByName = ref<Record<string, ComfyExtension>>({})
|
||||
@@ -32,6 +53,13 @@ export const useExtensionStore = defineStore('extension', () => {
|
||||
return extensions.value.filter((ext) => isExtensionEnabled(ext.name))
|
||||
})
|
||||
|
||||
function isExtensionReadOnly(name: string) {
|
||||
return (
|
||||
ALWAYS_DISABLED_EXTENSIONS.includes(name) ||
|
||||
ALWAYS_ENABLED_EXTENSIONS.includes(name)
|
||||
)
|
||||
}
|
||||
|
||||
function registerExtension(extension: ComfyExtension) {
|
||||
if (!extension.name) {
|
||||
throw new Error("Extensions must have a 'name' property.")
|
||||
@@ -72,16 +100,31 @@ export const useExtensionStore = defineStore('extension', () => {
|
||||
disabledExtensionNames.value = new Set(
|
||||
useSettingStore().get('Comfy.Extension.Disabled')
|
||||
)
|
||||
// pysssss.Locking is replaced by pin/unpin in ComfyUI core.
|
||||
// https://github.com/Comfy-Org/litegraph.js/pull/117
|
||||
disabledExtensionNames.value.add('pysssss.Locking')
|
||||
// pysssss.SnapToGrid is replaced by Comfy.Graph.AlwaysSnapToGrid in ComfyUI core.
|
||||
// pysssss.SnapToGrid tries to write global app.shiftDown state, which is no longer
|
||||
// allowed since v1.3.12.
|
||||
// https://github.com/Comfy-Org/ComfyUI_frontend/issues/1176
|
||||
disabledExtensionNames.value.add('pysssss.SnapToGrid')
|
||||
for (const name of ALWAYS_DISABLED_EXTENSIONS) {
|
||||
disabledExtensionNames.value.add(name)
|
||||
}
|
||||
for (const name of ALWAYS_ENABLED_EXTENSIONS) {
|
||||
disabledExtensionNames.value.delete(name)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Core extensions are extensions that are defined in the core package.
|
||||
* See /extensions/core/index.ts for the list.
|
||||
*/
|
||||
const coreExtensionNames = ref<string[]>([])
|
||||
function captureCoreExtensions() {
|
||||
coreExtensionNames.value = app.extensions.map((ext) => ext.name)
|
||||
}
|
||||
|
||||
function isCoreExtension(name: string) {
|
||||
return coreExtensionNames.value.includes(name)
|
||||
}
|
||||
|
||||
const hasThirdPartyExtensions = computed(() => {
|
||||
return extensions.value.some((ext) => !isCoreExtension(ext.name))
|
||||
})
|
||||
|
||||
// Some core extensions are registered before the store is initialized, e.g.
|
||||
// colorPalette.
|
||||
// Register them manually here so the state of app.extensions and
|
||||
@@ -95,7 +138,11 @@ export const useExtensionStore = defineStore('extension', () => {
|
||||
enabledExtensions,
|
||||
inactiveDisabledExtensionNames,
|
||||
isExtensionEnabled,
|
||||
isExtensionReadOnly,
|
||||
registerExtension,
|
||||
loadDisabledExtensionNames
|
||||
loadDisabledExtensionNames,
|
||||
captureCoreExtensions,
|
||||
isCoreExtension,
|
||||
hasThirdPartyExtensions
|
||||
}
|
||||
})
|
||||
|
||||
@@ -145,6 +145,7 @@ export interface WorkflowStore {
|
||||
modifiedWorkflows: ComfyWorkflow[]
|
||||
getWorkflowByPath: (path: string) => ComfyWorkflow | null
|
||||
syncWorkflows: (dir?: string) => Promise<void>
|
||||
reorderWorkflows: (from: number, to: number) => void
|
||||
}
|
||||
|
||||
export const useWorkflowStore = defineStore('workflow', () => {
|
||||
@@ -202,6 +203,11 @@ export const useWorkflowStore = defineStore('workflow', () => {
|
||||
const openWorkflows = computed(() =>
|
||||
openWorkflowPaths.value.map((path) => workflowLookup.value[path])
|
||||
)
|
||||
const reorderWorkflows = (from: number, to: number) => {
|
||||
const movedTab = openWorkflowPaths.value[from]
|
||||
openWorkflowPaths.value.splice(from, 1)
|
||||
openWorkflowPaths.value.splice(to, 0, movedTab)
|
||||
}
|
||||
const isOpen = (workflow: ComfyWorkflow) =>
|
||||
openWorkflowPathSet.value.has(workflow.path)
|
||||
|
||||
@@ -388,6 +394,7 @@ export const useWorkflowStore = defineStore('workflow', () => {
|
||||
renameWorkflow,
|
||||
deleteWorkflow,
|
||||
saveWorkflow,
|
||||
reorderWorkflows,
|
||||
|
||||
workflows,
|
||||
bookmarkedWorkflows,
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { ZodType, z } from 'zod'
|
||||
import { zComfyWorkflow, zNodeId } from './comfyWorkflow'
|
||||
import { fromZodError } from 'zod-validation-error'
|
||||
import { colorPalettesSchema } from './colorPalette'
|
||||
import { colorPalettesSchema } from './colorPaletteTypes'
|
||||
import { LinkReleaseTriggerAction } from './searchBoxTypes'
|
||||
import { NodeBadgeMode } from './nodeSource'
|
||||
import { zKeybinding } from './keyBindingTypes'
|
||||
|
||||
@@ -1,102 +0,0 @@
|
||||
import { z } from 'zod'
|
||||
|
||||
const nodeSlotSchema = z
|
||||
.object({
|
||||
BOOLEAN: z.string().optional(),
|
||||
CLIP: z.string(),
|
||||
CLIP_VISION: z.string(),
|
||||
CLIP_VISION_OUTPUT: z.string(),
|
||||
CONDITIONING: z.string(),
|
||||
CONTROL_NET: z.string(),
|
||||
CONTROL_NET_WEIGHTS: z.string().optional(),
|
||||
FLOAT: z.string().optional(),
|
||||
GLIGEN: z.string().optional(),
|
||||
IMAGE: z.string(),
|
||||
IMAGEUPLOAD: z.string().optional(),
|
||||
INT: z.string().optional(),
|
||||
LATENT: z.string(),
|
||||
LATENT_KEYFRAME: z.string().optional(),
|
||||
MASK: z.string(),
|
||||
MODEL: z.string(),
|
||||
SAMPLER: z.string().optional(),
|
||||
SIGMAS: z.string().optional(),
|
||||
STRING: z.string().optional(),
|
||||
STYLE_MODEL: z.string(),
|
||||
T2I_ADAPTER_WEIGHTS: z.string().optional(),
|
||||
TAESD: z.string(),
|
||||
TIMESTEP_KEYFRAME: z.string().optional(),
|
||||
UPSCALE_MODEL: z.string().optional(),
|
||||
VAE: z.string()
|
||||
})
|
||||
.passthrough()
|
||||
|
||||
const litegraphBaseSchema = z
|
||||
.object({
|
||||
BACKGROUND_IMAGE: z.string(),
|
||||
CLEAR_BACKGROUND_COLOR: z.string(),
|
||||
NODE_TITLE_COLOR: z.string(),
|
||||
NODE_SELECTED_TITLE_COLOR: z.string(),
|
||||
NODE_TEXT_SIZE: z.number(),
|
||||
NODE_TEXT_COLOR: z.string(),
|
||||
NODE_SUBTEXT_SIZE: z.number(),
|
||||
NODE_DEFAULT_COLOR: z.string(),
|
||||
NODE_DEFAULT_BGCOLOR: z.string(),
|
||||
NODE_DEFAULT_BOXCOLOR: z.string(),
|
||||
NODE_DEFAULT_SHAPE: z.string(),
|
||||
NODE_BOX_OUTLINE_COLOR: z.string(),
|
||||
NODE_BYPASS_BGCOLOR: z.string(),
|
||||
NODE_ERROR_COLOUR: z.string(),
|
||||
DEFAULT_SHADOW_COLOR: z.string(),
|
||||
DEFAULT_GROUP_FONT: z.number(),
|
||||
WIDGET_BGCOLOR: z.string(),
|
||||
WIDGET_OUTLINE_COLOR: z.string(),
|
||||
WIDGET_TEXT_COLOR: z.string(),
|
||||
WIDGET_SECONDARY_TEXT_COLOR: z.string(),
|
||||
LINK_COLOR: z.string(),
|
||||
EVENT_LINK_COLOR: z.string(),
|
||||
CONNECTING_LINK_COLOR: z.string(),
|
||||
BADGE_FG_COLOR: z.string().optional(),
|
||||
BADGE_BG_COLOR: z.string().optional()
|
||||
})
|
||||
.passthrough()
|
||||
|
||||
const comfyBaseSchema = z.object({
|
||||
['fg-color']: z.string(),
|
||||
['bg-color']: z.string(),
|
||||
['bg-img']: z.string().optional(),
|
||||
['comfy-menu-bg']: z.string(),
|
||||
['comfy-menu-secondary-bg']: z.string().optional(),
|
||||
['comfy-input-bg']: z.string(),
|
||||
['input-text']: z.string(),
|
||||
['descrip-text']: z.string(),
|
||||
['drag-text']: z.string(),
|
||||
['error-text']: z.string(),
|
||||
['border-color']: z.string(),
|
||||
['tr-even-bg-color']: z.string(),
|
||||
['tr-odd-bg-color']: z.string(),
|
||||
['content-bg']: z.string(),
|
||||
['content-fg']: z.string(),
|
||||
['content-hover-bg']: z.string(),
|
||||
['content-hover-fg']: z.string(),
|
||||
['bar-shadow']: z.string()
|
||||
})
|
||||
|
||||
const colorsSchema = z
|
||||
.object({
|
||||
node_slot: nodeSlotSchema,
|
||||
litegraph_base: litegraphBaseSchema,
|
||||
comfy_base: comfyBaseSchema
|
||||
})
|
||||
.passthrough()
|
||||
|
||||
const paletteSchema = z.object({
|
||||
id: z.string(),
|
||||
name: z.string(),
|
||||
colors: colorsSchema
|
||||
})
|
||||
|
||||
export const colorPalettesSchema = z.record(paletteSchema)
|
||||
|
||||
export type Colors = z.infer<typeof colorsSchema>
|
||||
export type Palette = z.infer<typeof paletteSchema>
|
||||
export type ColorPalettes = z.infer<typeof colorPalettesSchema>
|
||||
105
src/types/colorPaletteTypes.ts
Normal file
105
src/types/colorPaletteTypes.ts
Normal file
@@ -0,0 +1,105 @@
|
||||
import { LiteGraph } from '@comfyorg/litegraph'
|
||||
import { z } from 'zod'
|
||||
|
||||
const nodeSlotSchema = z.object({
|
||||
BOOLEAN: z.string().optional(),
|
||||
CLIP: z.string().optional(),
|
||||
CLIP_VISION: z.string().optional(),
|
||||
CLIP_VISION_OUTPUT: z.string().optional(),
|
||||
CONDITIONING: z.string().optional(),
|
||||
CONTROL_NET: z.string().optional(),
|
||||
CONTROL_NET_WEIGHTS: z.string().optional(),
|
||||
FLOAT: z.string().optional(),
|
||||
GLIGEN: z.string().optional(),
|
||||
IMAGE: z.string().optional(),
|
||||
IMAGEUPLOAD: z.string().optional(),
|
||||
INT: z.string().optional(),
|
||||
LATENT: z.string().optional(),
|
||||
LATENT_KEYFRAME: z.string().optional(),
|
||||
MASK: z.string().optional(),
|
||||
MODEL: z.string().optional(),
|
||||
SAMPLER: z.string().optional(),
|
||||
SIGMAS: z.string().optional(),
|
||||
STRING: z.string().optional(),
|
||||
STYLE_MODEL: z.string().optional(),
|
||||
T2I_ADAPTER_WEIGHTS: z.string().optional(),
|
||||
TAESD: z.string().optional(),
|
||||
TIMESTEP_KEYFRAME: z.string().optional(),
|
||||
UPSCALE_MODEL: z.string().optional(),
|
||||
VAE: z.string().optional()
|
||||
})
|
||||
|
||||
const litegraphBaseSchema = z.object({
|
||||
BACKGROUND_IMAGE: z.string().optional(),
|
||||
CLEAR_BACKGROUND_COLOR: z.string().optional(),
|
||||
NODE_TITLE_COLOR: z.string().optional(),
|
||||
NODE_SELECTED_TITLE_COLOR: z.string().optional(),
|
||||
NODE_TEXT_SIZE: z.number().optional(),
|
||||
NODE_TEXT_COLOR: z.string().optional(),
|
||||
NODE_SUBTEXT_SIZE: z.number().optional(),
|
||||
NODE_DEFAULT_COLOR: z.string().optional(),
|
||||
NODE_DEFAULT_BGCOLOR: z.string().optional(),
|
||||
NODE_DEFAULT_BOXCOLOR: z.string().optional(),
|
||||
NODE_DEFAULT_SHAPE: z
|
||||
.union([
|
||||
z.literal(LiteGraph.BOX_SHAPE),
|
||||
z.literal(LiteGraph.ROUND_SHAPE),
|
||||
z.literal(LiteGraph.CARD_SHAPE)
|
||||
])
|
||||
.optional(),
|
||||
NODE_BOX_OUTLINE_COLOR: z.string().optional(),
|
||||
NODE_BYPASS_BGCOLOR: z.string().optional(),
|
||||
NODE_ERROR_COLOUR: z.string().optional(),
|
||||
DEFAULT_SHADOW_COLOR: z.string().optional(),
|
||||
DEFAULT_GROUP_FONT: z.number().optional(),
|
||||
WIDGET_BGCOLOR: z.string().optional(),
|
||||
WIDGET_OUTLINE_COLOR: z.string().optional(),
|
||||
WIDGET_TEXT_COLOR: z.string().optional(),
|
||||
WIDGET_SECONDARY_TEXT_COLOR: z.string().optional(),
|
||||
LINK_COLOR: z.string().optional(),
|
||||
EVENT_LINK_COLOR: z.string().optional(),
|
||||
CONNECTING_LINK_COLOR: z.string().optional(),
|
||||
BADGE_FG_COLOR: z.string().optional(),
|
||||
BADGE_BG_COLOR: z.string().optional()
|
||||
})
|
||||
|
||||
const comfyBaseSchema = z.object({
|
||||
['fg-color']: z.string(),
|
||||
['bg-color']: z.string(),
|
||||
['bg-img']: z.string().optional(),
|
||||
['comfy-menu-bg']: z.string(),
|
||||
['comfy-menu-secondary-bg']: z.string().optional(),
|
||||
['comfy-input-bg']: z.string(),
|
||||
['input-text']: z.string(),
|
||||
['descrip-text']: z.string(),
|
||||
['drag-text']: z.string(),
|
||||
['error-text']: z.string(),
|
||||
['border-color']: z.string(),
|
||||
['tr-even-bg-color']: z.string(),
|
||||
['tr-odd-bg-color']: z.string(),
|
||||
['content-bg']: z.string(),
|
||||
['content-fg']: z.string(),
|
||||
['content-hover-bg']: z.string(),
|
||||
['content-hover-fg']: z.string(),
|
||||
['bar-shadow']: z.string()
|
||||
})
|
||||
|
||||
const colorsSchema = z
|
||||
.object({
|
||||
node_slot: nodeSlotSchema,
|
||||
litegraph_base: litegraphBaseSchema,
|
||||
comfy_base: comfyBaseSchema
|
||||
})
|
||||
.passthrough()
|
||||
|
||||
const paletteSchema = z.object({
|
||||
id: z.string(),
|
||||
name: z.string(),
|
||||
colors: colorsSchema
|
||||
})
|
||||
|
||||
export const colorPalettesSchema = z.record(paletteSchema)
|
||||
|
||||
export type Colors = z.infer<typeof colorsSchema>
|
||||
export type Palette = z.infer<typeof paletteSchema>
|
||||
export type ColorPalettes = z.infer<typeof colorPalettesSchema>
|
||||
@@ -37,7 +37,11 @@ export const getNodeSource = (python_module?: string): NodeSource => {
|
||||
badgeText: '🦊'
|
||||
}
|
||||
} else if (modules[0] === 'custom_nodes') {
|
||||
const displayName = shortenNodeName(modules[1])
|
||||
const moduleName = modules[1]
|
||||
// Custom nodes installed via ComfyNodeRegistry will be in the format of
|
||||
// custom_nodes.<custom node name>@<version>
|
||||
const customNodeName = moduleName.split('@')[0]
|
||||
const displayName = shortenNodeName(customNodeName)
|
||||
return {
|
||||
type: NodeSourceType.CustomNodes,
|
||||
className: 'comfy-custom-nodes',
|
||||
|
||||
@@ -6,6 +6,8 @@ export type SettingInputType =
|
||||
| 'slider'
|
||||
| 'combo'
|
||||
| 'text'
|
||||
| 'image'
|
||||
| 'color'
|
||||
| 'hidden'
|
||||
|
||||
export type SettingCustomRenderer = (
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
<GpuPicker v-model:device="device" />
|
||||
<div class="flex pt-6 justify-end">
|
||||
<Button
|
||||
label="Next"
|
||||
:label="$t('g.next')"
|
||||
icon="pi pi-arrow-right"
|
||||
iconPos="right"
|
||||
@click="activateCallback('1')"
|
||||
@@ -37,13 +37,13 @@
|
||||
/>
|
||||
<div class="flex pt-6 justify-between">
|
||||
<Button
|
||||
label="Back"
|
||||
:label="$t('g.back')"
|
||||
severity="secondary"
|
||||
icon="pi pi-arrow-left"
|
||||
@click="activateCallback('0')"
|
||||
/>
|
||||
<Button
|
||||
label="Next"
|
||||
:label="$t('g.next')"
|
||||
icon="pi pi-arrow-right"
|
||||
iconPos="right"
|
||||
@click="activateCallback('2')"
|
||||
@@ -58,13 +58,13 @@
|
||||
/>
|
||||
<div class="flex pt-6 justify-between">
|
||||
<Button
|
||||
label="Back"
|
||||
:label="$t('g.back')"
|
||||
severity="secondary"
|
||||
icon="pi pi-arrow-left"
|
||||
@click="activateCallback('1')"
|
||||
/>
|
||||
<Button
|
||||
label="Next"
|
||||
:label="$t('g.next')"
|
||||
icon="pi pi-arrow-right"
|
||||
iconPos="right"
|
||||
@click="activateCallback('3')"
|
||||
@@ -78,13 +78,13 @@
|
||||
/>
|
||||
<div class="flex pt-6 justify-between">
|
||||
<Button
|
||||
label="Back"
|
||||
:label="$t('g.back')"
|
||||
severity="secondary"
|
||||
icon="pi pi-arrow-left"
|
||||
@click="activateCallback('2')"
|
||||
/>
|
||||
<Button
|
||||
label="Install"
|
||||
:label="$t('g.install')"
|
||||
icon="pi pi-check"
|
||||
iconPos="right"
|
||||
:disabled="hasError"
|
||||
|
||||
63
tests-ui/tests/fast/nodeSource.test.ts
Normal file
63
tests-ui/tests/fast/nodeSource.test.ts
Normal file
@@ -0,0 +1,63 @@
|
||||
import { getNodeSource, NodeSourceType } from '@/types/nodeSource'
|
||||
|
||||
describe('getNodeSource', () => {
|
||||
it('should return UNKNOWN_NODE_SOURCE when python_module is undefined', () => {
|
||||
const result = getNodeSource(undefined)
|
||||
expect(result).toEqual({
|
||||
type: NodeSourceType.Unknown,
|
||||
className: 'comfy-unknown',
|
||||
displayText: 'Unknown',
|
||||
badgeText: '?'
|
||||
})
|
||||
})
|
||||
|
||||
it('should identify core nodes from nodes module', () => {
|
||||
const result = getNodeSource('nodes.some_module')
|
||||
expect(result).toEqual({
|
||||
type: NodeSourceType.Core,
|
||||
className: 'comfy-core',
|
||||
displayText: 'Comfy Core',
|
||||
badgeText: '🦊'
|
||||
})
|
||||
})
|
||||
|
||||
it('should identify core nodes from comfy_extras module', () => {
|
||||
const result = getNodeSource('comfy_extras.some_module')
|
||||
expect(result).toEqual({
|
||||
type: NodeSourceType.Core,
|
||||
className: 'comfy-core',
|
||||
displayText: 'Comfy Core',
|
||||
badgeText: '🦊'
|
||||
})
|
||||
})
|
||||
|
||||
it('should identify custom nodes and format their names', () => {
|
||||
const result = getNodeSource('custom_nodes.ComfyUI-Example')
|
||||
expect(result).toEqual({
|
||||
type: NodeSourceType.CustomNodes,
|
||||
className: 'comfy-custom-nodes',
|
||||
displayText: 'Example',
|
||||
badgeText: 'Example'
|
||||
})
|
||||
})
|
||||
|
||||
it('should identify custom nodes with version and format their names', () => {
|
||||
const result = getNodeSource('custom_nodes.ComfyUI-Example@1.0.0')
|
||||
expect(result).toEqual({
|
||||
type: NodeSourceType.CustomNodes,
|
||||
className: 'comfy-custom-nodes',
|
||||
displayText: 'Example',
|
||||
badgeText: 'Example'
|
||||
})
|
||||
})
|
||||
|
||||
it('should return UNKNOWN_NODE_SOURCE for unrecognized modules', () => {
|
||||
const result = getNodeSource('unknown_module.something')
|
||||
expect(result).toEqual({
|
||||
type: NodeSourceType.Unknown,
|
||||
className: 'comfy-unknown',
|
||||
displayText: 'Unknown',
|
||||
badgeText: '?'
|
||||
})
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user