Compare commits

...

26 Commits

Author SHA1 Message Date
github-actions
fb69c05145 Update locales [skip ci] 2025-08-21 06:02:21 +00:00
Jin Yi
df8fd9e0bd fix: api.ts file rebase to main 2025-08-21 14:56:44 +09:00
Jin Yi
0bf56742ef fix: add useComfyManagerService import 2025-08-21 14:56:44 +09:00
Jin Yi
861e6fc12f fix: v2 prefix (#5145) 2025-08-21 14:56:44 +09:00
Christian Byrne
68575c1353 [cleanup] Remove unused manager route enums (#4875) 2025-08-21 14:56:44 +09:00
Christian Byrne
fb375cbbee [feat] Add v2/ prefix to manager service base URL (#4872) 2025-08-21 14:56:44 +09:00
Christian Byrne
ac0884300f [feat] Add reactive feature flags foundation (#4817) 2025-08-21 14:56:44 +09:00
Jin Yi
58912e7aab [Manager] "Restarting" state after clicking restart button (#4637) 2025-08-21 14:56:44 +09:00
github-actions
65a001ed3b Update locales [skip ci] 2025-08-21 14:56:44 +09:00
Christian Byrne
25502f96e5 Fix errors from rebase (removed Tag component import and duplicated imports in api.ts) (#4608)
Co-authored-by: github-actions <github-actions@github.com>
2025-08-21 14:56:44 +09:00
Christian Byrne
0df7254e65 [fix] Fix json syntax error from rebase (#4607) 2025-08-21 14:56:44 +09:00
github-actions
2509cebe61 Update locales [skip ci] 2025-08-21 14:56:44 +09:00
bymyself
f5e1e22b86 [Update to v2 API] update WS done message 2025-08-21 14:56:44 +09:00
bymyself
bf51e6724f dont show missing nodes button in legacy manager mode 2025-08-21 14:56:44 +09:00
bymyself
38638f4207 improve command names 2025-08-21 14:56:44 +09:00
bymyself
6ac867cf1d use correct response shape 2025-08-21 14:56:44 +09:00
github-actions
7d42f1ff60 Update locales [skip ci] 2025-08-21 14:56:44 +09:00
bymyself
eda0c45e1b add "Check for Updates", "Install Missing" menu items 2025-08-21 14:56:44 +09:00
github-actions
fe762e19d4 Update locales [skip ci] 2025-08-21 14:56:44 +09:00
bymyself
b1fcf99885 Add banner indicating how to use legacy manager UI 2025-08-21 14:56:44 +09:00
bymyself
baa1c5bb1f move legacy option to startup arg 2025-08-21 14:56:44 +09:00
bymyself
4fbbbc0b42 await promises. update settings schema 2025-08-21 14:56:44 +09:00
bymyself
358d141b82 re-arrange menu items 2025-08-21 14:56:44 +09:00
bymyself
85d3568475 switch to v2 manager API endpoints 2025-08-21 14:56:44 +09:00
github-actions
df6ae2fedf Update locales [skip ci] 2025-08-21 14:56:44 +09:00
bymyself
df35f56b32 migrate manager menu items 2025-08-21 14:56:44 +09:00
38 changed files with 1596 additions and 933 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 70 KiB

View File

@@ -0,0 +1,131 @@
<template>
<div
class="inline-flex items-center justify-center"
:style="{ width: size + 'px', height: size + 'px' }"
>
<svg
xmlns="http://www.w3.org/2000/svg"
:width="size"
:height="size"
viewBox="0 0 14 14"
fill="none"
class="animate-spin"
:style="{ animationDuration: duration }"
>
<g clip-path="url(#clip0_776_9582)">
<!-- Top dot -->
<path
class="dot-animation"
style="animation-delay: 0s"
fill-rule="evenodd"
clip-rule="evenodd"
d="M7 2.21053C7.61042 2.21053 8.10526 1.71568 8.10526 1.10526C8.10526 0.494843 7.61042 0 7 0C6.38958 0 5.89474 0.494843 5.89474 1.10526C5.89474 1.71568 6.38958 2.21053 7 2.21053Z"
:fill="color"
/>
<!-- Left dot -->
<path
class="dot-animation"
style="animation-delay: 0.25s"
fill-rule="evenodd"
clip-rule="evenodd"
d="M2.21053 7C2.21053 7.61042 1.71568 8.10526 1.10526 8.10526C0.494843 8.10526 0 7.61042 0 7C0 6.38958 0.494843 5.89474 1.10526 5.89474C1.71568 5.89474 2.21053 6.38958 2.21053 7Z"
:fill="color"
/>
<!-- Right dot -->
<path
class="dot-animation"
style="animation-delay: 0.5s"
fill-rule="evenodd"
clip-rule="evenodd"
d="M14 7C14 7.61042 13.5052 8.10526 12.8947 8.10526C12.2843 8.10526 11.7895 7.61042 11.7895 7C11.7895 6.38958 12.2843 5.89474 12.8947 5.89474C13.5052 5.89474 14 6.38958 14 7Z"
:fill="color"
/>
<!-- Bottom dot -->
<path
class="dot-animation"
style="animation-delay: 0.75s"
fill-rule="evenodd"
clip-rule="evenodd"
d="M8.10526 12.8947C8.10526 13.5052 7.61041 14 6.99999 14C6.38957 14 5.89473 13.5052 5.89473 12.8947C5.89473 12.2843 6.38957 11.7895 6.99999 11.7895C7.61041 11.7895 8.10526 12.2843 8.10526 12.8947Z"
:fill="color"
/>
<!-- Top-left dot -->
<path
class="dot-animation"
style="animation-delay: 0.125s"
fill-rule="evenodd"
clip-rule="evenodd"
d="M2.05039 3.61349C2.48203 4.04513 3.18184 4.04513 3.61347 3.61349C4.0451 3.18186 4.0451 2.48205 3.61347 2.05042C3.18184 1.61878 2.48203 1.61878 2.05039 2.05042C1.61876 2.48205 1.61876 3.18186 2.05039 3.61349Z"
:fill="color"
/>
<!-- Bottom-right dot -->
<path
class="dot-animation"
style="animation-delay: 0.625s"
fill-rule="evenodd"
clip-rule="evenodd"
d="M11.9496 11.9496C11.518 12.3812 10.8182 12.3812 10.3865 11.9496C9.9549 11.5179 9.9549 10.8181 10.3865 10.3865C10.8182 9.95485 11.518 9.95485 11.9496 10.3865C12.3812 10.8181 12.3812 11.5179 11.9496 11.9496Z"
:fill="color"
/>
<!-- Bottom-left dot -->
<path
class="dot-animation"
style="animation-delay: 0.875s"
fill-rule="evenodd"
clip-rule="evenodd"
d="M2.05039 11.9496C2.48203 12.3812 3.18184 12.3812 3.61347 11.9496C4.0451 11.5179 4.0451 10.8181 3.61347 10.3865C3.18184 9.95485 2.48203 9.95485 2.05039 10.3865C1.61876 10.8181 1.61876 11.5179 2.05039 11.9496Z"
:fill="color"
/>
<!-- Top-right dot -->
<path
class="dot-animation"
style="animation-delay: 0.375s"
fill-rule="evenodd"
clip-rule="evenodd"
d="M11.9496 3.61349C11.518 4.04513 10.8182 4.04513 10.3865 3.61349C9.9549 3.18186 9.9549 2.48205 10.3865 2.05042C10.8182 1.61878 11.518 1.61878 11.9496 2.05042C12.3812 2.48205 12.3812 3.18186 11.9496 3.61349Z"
:fill="color"
/>
</g>
<defs>
<clipPath id="clip0_776_9582">
<rect width="14" height="14" fill="white" />
</clipPath>
</defs>
</svg>
</div>
</template>
<script setup lang="ts">
import { computed } from 'vue'
import { useColorPaletteStore } from '@/stores/workspace/colorPaletteStore'
const { size = 24, duration = '2s' } = defineProps<{
size?: number
duration?: string
}>()
const colorPaletteStore = useColorPaletteStore()
const color = computed(() =>
colorPaletteStore.completedActivePalette.light_theme ? '#2C2B30' : '#D4D4D4'
)
</script>
<style scoped>
.dot-animation {
animation: dot-pulse 1s ease-in-out infinite;
}
@keyframes dot-pulse {
0%,
80%,
100% {
opacity: 0.3;
}
40% {
opacity: 1;
}
}
</style>

View File

@@ -31,7 +31,7 @@
</div>
</template>
</ListBox>
<div v-if="isManagerInstalled" class="flex justify-end py-3">
<div v-if="!isLegacyManager" class="flex justify-end py-3">
<PackInstallButton
:disabled="isLoading || !!error || missingNodePacks.length === 0"
:node-packs="missingNodePacks"
@@ -45,14 +45,12 @@
<script setup lang="ts">
import Button from 'primevue/button'
import ListBox from 'primevue/listbox'
import { computed } from 'vue'
import { computed, onMounted, ref } from 'vue'
import NoResultsPlaceholder from '@/components/common/NoResultsPlaceholder.vue'
import MissingCoreNodesMessage from '@/components/dialog/content/MissingCoreNodesMessage.vue'
import PackInstallButton from '@/components/dialog/content/manager/button/PackInstallButton.vue'
import { useMissingNodes } from '@/composables/nodePack/useMissingNodes'
import { useComfyManagerService } from '@/services/comfyManagerService'
import { useDialogService } from '@/services/dialogService'
import { useAboutPanelStore } from '@/stores/aboutPanelStore'
import type { MissingNodeType } from '@/types/comfy'
import { ManagerTab } from '@/types/comfyManagerTypes'
@@ -60,22 +58,11 @@ const props = defineProps<{
missingNodeTypes: MissingNodeType[]
}>()
const aboutPanelStore = useAboutPanelStore()
// Get missing node packs from workflow with loading and error states
const { missingNodePacks, isLoading, error, missingCoreNodes } =
useMissingNodes()
// Determines if ComfyUI-Manager is installed by checking for its badge in the about panel
// This allows us to conditionally show the Manager button only when the extension is available
// TODO: Remove this check when Manager functionality is fully migrated into core
const isManagerInstalled = computed(() => {
return aboutPanelStore.badges.some(
(badge) =>
badge.label.includes('ComfyUI-Manager') ||
badge.url.includes('ComfyUI-Manager')
)
})
const isLegacyManager = ref(false)
const uniqueNodes = computed(() => {
const seenTypes = new Set()
@@ -103,6 +90,13 @@ const openManager = () => {
initialTab: ManagerTab.Missing
})
}
onMounted(async () => {
const isLegacyResponse = await useComfyManagerService().isLegacyManagerUI()
if (isLegacyResponse?.is_legacy_manager_ui) {
isLegacyManager.value = true
}
})
</script>
<style scoped>

View File

@@ -0,0 +1,82 @@
import { mount } from '@vue/test-utils'
import { createPinia } from 'pinia'
import PrimeVue from 'primevue/config'
import Tag from 'primevue/tag'
import Tooltip from 'primevue/tooltip'
import { describe, expect, it } from 'vitest'
import { createI18n } from 'vue-i18n'
import enMessages from '@/locales/en/main.json'
import ManagerHeader from './ManagerHeader.vue'
const i18n = createI18n({
legacy: false,
locale: 'en',
messages: {
en: enMessages
}
})
describe('ManagerHeader', () => {
const createWrapper = () => {
return mount(ManagerHeader, {
global: {
plugins: [createPinia(), PrimeVue, i18n],
directives: {
tooltip: Tooltip
},
components: {
Tag
}
}
})
}
it('renders the component title', () => {
const wrapper = createWrapper()
expect(wrapper.find('h2').text()).toBe(
enMessages.manager.discoverCommunityContent
)
})
it('displays the legacy manager UI tag', () => {
const wrapper = createWrapper()
const tag = wrapper.find('[data-pc-name="tag"]')
expect(tag.exists()).toBe(true)
expect(tag.text()).toContain(enMessages.manager.legacyManagerUI)
})
it('applies info severity to the tag', () => {
const wrapper = createWrapper()
const tag = wrapper.find('[data-pc-name="tag"]')
expect(tag.classes()).toContain('p-tag-info')
})
it('displays info icon in the tag', () => {
const wrapper = createWrapper()
const icon = wrapper.find('.pi-info-circle')
expect(icon.exists()).toBe(true)
})
it('has cursor-help class on the tag', () => {
const wrapper = createWrapper()
const tag = wrapper.find('[data-pc-name="tag"]')
expect(tag.classes()).toContain('cursor-help')
})
it('has proper structure with flex container', () => {
const wrapper = createWrapper()
const flexContainer = wrapper.find('.flex.justify-end.ml-auto.pr-4')
expect(flexContainer.exists()).toBe(true)
const tag = flexContainer.find('[data-pc-name="tag"]')
expect(tag.exists()).toBe(true)
})
})

View File

@@ -4,6 +4,22 @@
<h2 class="text-lg font-normal text-left">
{{ $t('manager.discoverCommunityContent') }}
</h2>
<div class="flex justify-end ml-auto pr-4">
<Tag
v-tooltip.left="$t('manager.legacyManagerUIDescription')"
severity="info"
icon="pi pi-info-circle"
:value="$t('manager.legacyManagerUI')"
class="cursor-help"
:pt="{
root: { class: 'text-xs' }
}"
/>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import Tag from 'primevue/tag'
</script>

View File

@@ -10,7 +10,6 @@
:loading="isInstalling"
:loading-message="$t('g.installing')"
@action="installAllPacks"
@click="onClick"
/>
</template>
@@ -37,10 +36,6 @@ const { nodePacks, variant, label } = defineProps<{
const isInstalling = inject(IsInstallingKey, ref(false))
const onClick = (): void => {
isInstalling.value = true
}
const managerStore = useComfyManagerStore()
const createPayload = (installItem: NodePack) => {
@@ -65,8 +60,6 @@ const installPack = (item: NodePack) =>
const installAllPacks = async () => {
if (!nodePacks?.length) return
isInstalling.value = true
const uninstalledPacks = nodePacks.filter(
(pack) => !managerStore.isPackInstalled(pack.id)
)

View File

@@ -84,10 +84,9 @@
</template>
<script setup lang="ts">
import { whenever } from '@vueuse/core'
import Card from 'primevue/card'
import ProgressSpinner from 'primevue/progressspinner'
import { computed, provide, ref } from 'vue'
import { computed, provide } from 'vue'
import { useI18n } from 'vue-i18n'
import PackVersionBadge from '@/components/dialog/content/manager/PackVersionBadge.vue'
@@ -114,18 +113,17 @@ const isLightTheme = computed(
() => colorPaletteStore.completedActivePalette.light_theme
)
const isInstalling = ref(false)
provide(IsInstallingKey, isInstalling)
const { isPackInstalled, isPackEnabled, isPackInstalling } =
useComfyManagerStore()
const { isPackInstalled, isPackEnabled } = useComfyManagerStore()
const isInstalling = computed(() => isPackInstalling(nodePack?.id))
provide(IsInstallingKey, isInstalling)
const isInstalled = computed(() => isPackInstalled(nodePack?.id))
const isDisabled = computed(
() => isInstalled.value && !isPackEnabled(nodePack?.id)
)
whenever(isInstalled, () => (isInstalling.value = false))
const nodesCount = computed(() =>
isMergedNodePack(nodePack) ? nodePack.comfy_nodes?.length : undefined
)

View File

@@ -1,40 +1,47 @@
<template>
<div
class="w-full px-6 py-4 shadow-lg flex items-center justify-between"
class="w-full px-6 py-2 shadow-lg flex items-center justify-between"
:class="{
'rounded-t-none': progressDialogContent.isExpanded,
'rounded-lg': !progressDialogContent.isExpanded
}"
>
<div class="justify-center text-sm font-bold leading-none">
<div class="flex items-center text-base leading-none">
<div class="flex items-center">
<template v-if="isInProgress">
<i class="pi pi-spin pi-spinner mr-2 text-3xl" />
<!-- 1. Queue running (install/enable/disable etc.) -->
<template v-if="isQueueRunning">
<DotSpinner duration="1s" class="mr-2" />
<span>{{ currentTaskName }}</span>
</template>
<!-- 3. Restarting -->
<template v-else-if="isRestarting">
<DotSpinner duration="1s" class="mr-2" />
<span>{{ $t('manager.restartingBackend') }}</span>
</template>
<!-- 4. Restart completed -->
<template v-else-if="isRestartCompleted">
<span class="mr-2">🎉</span>
<span>{{ $t('manager.extensionsSuccessfullyInstalled') }}</span>
</template>
<!-- 2. Tasks completed (waiting for restart) -->
<template v-else>
<i class="pi pi-check-circle mr-2 text-green-500" />
<span class="leading-none">{{
$t('manager.restartToApplyChanges')
}}</span>
<span class="mr-2"></span>
<span>
{{ $t('manager.clickToFinishSetup') }}
'{{ $t('manager.applyChanges') }}'
{{ $t('manager.toFinishSetup') }}
</span>
</template>
</div>
</div>
<div class="flex items-center gap-4">
<span v-if="isInProgress" class="text-xs font-bold text-neutral-600">
{{ comfyManagerStore.uncompletedCount }} {{ $t('g.progressCountOf') }}
{{ comfyManagerStore.taskLogs.length }}
</span>
<div class="flex items-center">
<Button
v-if="!isInProgress"
rounded
outlined
class="px-4 py-2 rounded-md mr-4"
@click="handleRestart"
>
{{ $t('g.restart') }}
</Button>
<!-- 1. Queue running -->
<template v-if="isQueueRunning">
<span class="text-sm text-neutral-700 dark-theme:text-neutral-400">
{{ completedTasksCount }} {{ $t('g.progressCountOf') }}
{{ taskLogs }}
</span>
<Button
:icon="
progressDialogContent.isExpanded
@@ -44,20 +51,46 @@
text
rounded
size="small"
class="font-bold"
severity="secondary"
:aria-label="progressDialogContent.isExpanded ? 'Collapse' : 'Expand'"
@click.stop="progressDialogContent.toggle"
/>
</template>
<!-- 2. Tasks completed (waiting for restart) -->
<template v-else-if="!isRestarting && !isRestartCompleted">
<Button
icon="pi pi-times"
text
rounded
size="small"
severity="secondary"
aria-label="Close"
@click.stop="closeDialog"
/>
</div>
outlined
class="rounded-md border-2 px-3 text-neutral-600 border-neutral-900 hover:bg-neutral-100 dark-theme:bg-none dark-theme:text-white dark-theme:border-white dark-theme:hover:bg-neutral-700"
@click="handleRestart"
>
{{ $t('manager.applyChanges') }}
</Button>
</template>
<!-- 3. Restarting -->
<template v-else-if="isRestarting">
<!-- No buttons during restart -->
</template>
<!-- 4. Restart completed -->
<template v-else-if="isRestartCompleted">
<!-- No buttons after restart completed (auto-close after 3 seconds) -->
</template>
<!-- Common: Close button -->
<Button
icon="pi pi-times"
text
rounded
size="small"
class="font-bold"
severity="secondary"
aria-label="Close"
@click.stop="closeDialog"
/>
</div>
</div>
</template>
@@ -65,9 +98,10 @@
<script setup lang="ts">
import { useEventListener } from '@vueuse/core'
import Button from 'primevue/button'
import { computed } from 'vue'
import { computed, ref } from 'vue'
import { useI18n } from 'vue-i18n'
import DotSpinner from '@/components/common/DotSpinner.vue'
import { api } from '@/scripts/api'
import { useComfyManagerService } from '@/services/comfyManagerService'
import { useWorkflowService } from '@/services/workflowService'
@@ -77,19 +111,34 @@ import {
} from '@/stores/comfyManagerStore'
import { useCommandStore } from '@/stores/commandStore'
import { useDialogStore } from '@/stores/dialogStore'
import { useSettingStore } from '@/stores/settingStore'
const { t } = useI18n()
const dialogStore = useDialogStore()
const progressDialogContent = useManagerProgressDialogStore()
const comfyManagerStore = useComfyManagerStore()
const settingStore = useSettingStore()
const isInProgress = computed(() => comfyManagerStore.uncompletedCount > 0)
// State management for restart process
const isRestarting = ref<boolean>(false)
const isRestartCompleted = ref<boolean>(false)
// Computed states
const isQueueRunning = computed(() => comfyManagerStore.uncompletedCount > 0)
const taskLogs = computed(() => comfyManagerStore.taskLogs.length)
const completedTasksCount = computed(() => {
if (isQueueRunning.value && taskLogs.value > 0) {
return taskLogs.value - 1
}
return taskLogs.value
})
const closeDialog = () => {
dialogStore.closeDialog({ key: 'global-manager-progress-dialog' })
}
const fallbackTaskName = t('g.installing')
const fallbackTaskName = t('manager.installingDependencies')
const currentTaskName = computed(() => {
if (!comfyManagerStore.taskLogs.length) return fallbackTaskName
const task = comfyManagerStore.taskLogs.at(-1)
@@ -97,21 +146,52 @@ const currentTaskName = computed(() => {
})
const handleRestart = async () => {
const onReconnect = async () => {
// Refresh manager state
// Store original toast setting value
const originalToastSetting = settingStore.get(
'Comfy.Toast.DisableReconnectingToast'
)
comfyManagerStore.clearLogs()
comfyManagerStore.setStale()
try {
await settingStore.set('Comfy.Toast.DisableReconnectingToast', true)
// Refresh node definitions
await useCommandStore().execute('Comfy.RefreshNodeDefinitions')
isRestarting.value = true
// Reload workflow
await useWorkflowService().reloadCurrentWorkflow()
const onReconnect = async () => {
try {
comfyManagerStore.setStale()
await useCommandStore().execute('Comfy.RefreshNodeDefinitions')
await useWorkflowService().reloadCurrentWorkflow()
} finally {
await settingStore.set(
'Comfy.Toast.DisableReconnectingToast',
originalToastSetting
)
isRestarting.value = false
isRestartCompleted.value = true
setTimeout(() => {
closeDialog()
comfyManagerStore.clearLogs()
}, 3000)
}
}
useEventListener(api, 'reconnected', onReconnect, { once: true })
await useComfyManagerService().rebootComfyUI()
} catch (error) {
// If restart fails, restore settings and reset state
await settingStore.set(
'Comfy.Toast.DisableReconnectingToast',
originalToastSetting
)
isRestarting.value = false
isRestartCompleted.value = false
closeDialog() // Close dialog on error
throw error
}
useEventListener(api, 'reconnected', onReconnect, { once: true })
await useComfyManagerService().rebootComfyUI()
closeDialog()
}
</script>

View File

@@ -16,10 +16,12 @@ import {
import { Point } from '@/lib/litegraph/src/litegraph'
import { api } from '@/scripts/api'
import { app } from '@/scripts/app'
import { useComfyManagerService } from '@/services/comfyManagerService'
import { useDialogService } from '@/services/dialogService'
import { useLitegraphService } from '@/services/litegraphService'
import { useWorkflowService } from '@/services/workflowService'
import type { ComfyCommand } from '@/stores/commandStore'
import { useCommandStore } from '@/stores/commandStore'
import { useExecutionStore } from '@/stores/executionStore'
import { useCanvasStore, useTitleEditorStore } from '@/stores/graphStore'
import { useHelpCenterStore } from '@/stores/helpCenterStore'
@@ -33,6 +35,7 @@ import { useBottomPanelStore } from '@/stores/workspace/bottomPanelStore'
import { useColorPaletteStore } from '@/stores/workspace/colorPaletteStore'
import { useSearchBoxStore } from '@/stores/workspace/searchBoxStore'
import { useWorkspaceStore } from '@/stores/workspaceStore'
import { ManagerTab } from '@/types/comfyManagerTypes'
import {
getAllNonIoNodesInSubgraph,
getExecutionIdsForSelectedNodes
@@ -711,12 +714,54 @@ export function useCoreCommands(): ComfyCommand[] {
}
},
{
id: 'Comfy.Manager.CustomNodesManager',
icon: 'pi pi-puzzle',
label: 'Toggle the Custom Nodes Manager',
id: 'Comfy.Manager.CustomNodesManager.ShowCustomNodesMenu',
icon: 'pi pi-objects-column',
label: 'Custom Nodes Manager',
versionAdded: '1.12.10',
function: async () => {
const { is_legacy_manager_ui } =
(await useComfyManagerService().isLegacyManagerUI()) ?? {}
if (is_legacy_manager_ui === true) {
try {
await useCommandStore().execute(
'Comfy.Manager.Menu.ToggleVisibility' // This command is registered by legacy manager FE extension
)
} catch (error) {
console.error('error', error)
useToastStore().add({
severity: 'error',
summary: t('g.error'),
detail: t('manager.legacyMenuNotAvailable'),
life: 3000
})
dialogService.showManagerDialog()
}
} else {
dialogService.showManagerDialog()
}
}
},
{
id: 'Comfy.Manager.ShowUpdateAvailablePacks',
icon: 'pi pi-sync',
label: 'Check for Custom Node Updates',
versionAdded: '1.17.0',
function: () => {
dialogService.toggleManagerDialog()
dialogService.showManagerDialog({
initialTab: ManagerTab.UpdateAvailable
})
}
},
{
id: 'Comfy.Manager.ShowMissingPacks',
icon: 'pi pi-exclamation-circle',
label: 'Install Missing Custom Nodes',
versionAdded: '1.17.0',
function: () => {
dialogService.showManagerDialog({
initialTab: ManagerTab.Missing
})
}
},
{
@@ -880,6 +925,44 @@ export function useCoreCommands(): ComfyCommand[] {
const modelSelectorDialog = useModelSelectorDialog()
modelSelectorDialog.show()
}
},
{
id: 'Comfy.Manager.CustomNodesManager.ShowLegacyCustomNodesMenu',
icon: 'pi pi-bars',
label: 'Custom Nodes (Legacy)',
versionAdded: '1.16.4',
function: async () => {
try {
await useCommandStore().execute(
'Comfy.Manager.CustomNodesManager.ToggleVisibility'
)
} catch (error) {
useToastStore().add({
severity: 'error',
summary: t('g.error'),
detail: t('manager.legacyMenuNotAvailable'),
life: 3000
})
}
}
},
{
id: 'Comfy.Manager.ShowLegacyManagerMenu',
icon: 'mdi mdi-puzzle',
label: 'Manager Menu (Legacy)',
versionAdded: '1.16.4',
function: async () => {
try {
await useCommandStore().execute('Comfy.Manager.Menu.ToggleVisibility')
} catch (error) {
useToastStore().add({
severity: 'error',
summary: t('g.error'),
detail: t('manager.legacyMenuNotAvailable'),
life: 3000
})
}
}
}
]

View File

@@ -0,0 +1,36 @@
import { computed, reactive, readonly } from 'vue'
import { api } from '@/scripts/api'
/**
* Known server feature flags (top-level, not extensions)
*/
export enum ServerFeatureFlag {
SUPPORTS_PREVIEW_METADATA = 'supports_preview_metadata',
MAX_UPLOAD_SIZE = 'max_upload_size'
}
/**
* Composable for reactive access to feature flags
*/
export function useFeatureFlags() {
// Create reactive state that tracks server feature flags
const flags = reactive({
get supportsPreviewMetadata() {
return api.getServerFeature(ServerFeatureFlag.SUPPORTS_PREVIEW_METADATA)
},
get maxUploadSize() {
return api.getServerFeature(ServerFeatureFlag.MAX_UPLOAD_SIZE)
}
})
// Create a reactive computed for any feature flag
const featureFlag = <T = unknown>(featurePath: string, defaultValue?: T) => {
return computed(() => api.getServerFeature(featurePath, defaultValue))
}
return {
flags: readonly(flags),
featureFlag
}
}

View File

@@ -13,6 +13,14 @@ export const CORE_MENU_COMMANDS = [
],
[['Edit'], ['Comfy.Undo', 'Comfy.Redo']],
[['Edit'], ['Comfy.OpenClipspace']],
[
['Manager'],
[
'Comfy.Manager.CustomNodesManager.ShowCustomNodesMenu',
'Comfy.Manager.ShowMissingPacks',
'Comfy.Manager.ShowUpdateAvailablePacks'
]
],
[
['Help'],
[

View File

@@ -13,6 +13,13 @@ import type { SettingParams } from '@/types/settingTypes'
* when they are no longer needed.
*/
export const CORE_SETTINGS: SettingParams[] = [
{
id: 'Comfy.Memory.AllowManualUnload',
name: 'Allow manual unload of models and execution cache via user command',
type: 'hidden',
defaultValue: true,
versionAdded: '1.18.0'
},
{
id: 'Comfy.Validation.Workflows',
name: 'Validate workflows',

View File

@@ -164,8 +164,20 @@
"Comfy_LoadDefaultWorkflow": {
"label": "تحميل سير العمل الافتراضي"
},
"Comfy_Manager_CustomNodesManager": {
"label": "تبديل مدير العقد المخصصة"
"Comfy_Manager_CustomNodesManager_ShowCustomNodesMenu": {
"label": "مدير العقد المخصصة"
},
"Comfy_Manager_CustomNodesManager_ShowLegacyCustomNodesMenu": {
"label": "العُقَد المخصصة (قديم)"
},
"Comfy_Manager_ShowLegacyManagerMenu": {
"label": "قائمة المدير (قديم)"
},
"Comfy_Manager_ShowMissingPacks": {
"label": "تثبيت العقد المخصصة المفقودة"
},
"Comfy_Manager_ShowUpdateAvailablePacks": {
"label": "التحقق من تحديثات العقد المخصصة"
},
"Comfy_Manager_ToggleManagerProgressDialog": {
"label": "تبديل شريط تقدم مدير العقد المخصصة"

View File

@@ -82,12 +82,6 @@
"title": "إنشاء حساب"
}
},
"breadcrumbsMenu": {
"clearWorkflow": "مسح سير العمل",
"deleteWorkflow": "حذف سير العمل",
"duplicate": "تكرار",
"enterNewName": "أدخل اسمًا جديدًا"
},
"chatHistory": {
"cancelEdit": "إلغاء",
"cancelEditTooltip": "إلغاء التعديل",
@@ -273,11 +267,11 @@
"choose_file_to_upload": "اختر ملفاً للرفع",
"clear": "مسح",
"clearAll": "مسح الكل",
"clearFilters": "مسح الفلاتر",
"close": "إغلاق",
"color": "اللون",
"comingSoon": "قريباً",
"command": "أمر",
"commandProhibited": "الأمر {command} محظور. يرجى التواصل مع المسؤول لمزيد من المعلومات.",
"community": "المجتمع",
"completed": "اكتمل",
"confirm": "تأكيد",
@@ -298,9 +292,7 @@
"devices": "الأجهزة",
"disableAll": "تعطيل الكل",
"disabling": "جارٍ التعطيل",
"dismiss": "تجاهل",
"download": "تنزيل",
"duplicate": "تكرار",
"edit": "تعديل",
"empty": "فارغ",
"enableAll": "تمكين الكل",
@@ -314,8 +306,6 @@
"filter": "تصفية",
"findIssues": "العثور على مشاكل",
"firstTimeUIMessage": "هذه هي المرة الأولى التي تستخدم فيها واجهة المستخدم الجديدة. اختر \"القائمة > استخدام القائمة الجديدة > تعطيل\" لاستعادة الواجهة القديمة.",
"frontendNewer": "إصدار الواجهة الأمامية {frontendVersion} قد لا يكون متوافقاً مع الإصدار الخلفي {backendVersion}.",
"frontendOutdated": "إصدار الواجهة الأمامية {frontendVersion} قديم. يتطلب الإصدار الخلفي {requiredVersion} أو أحدث.",
"goToNode": "الانتقال إلى العقدة",
"help": "مساعدة",
"icon": "أيقونة",
@@ -397,14 +387,11 @@
"unknownError": "خطأ غير معروف",
"update": "تحديث",
"updateAvailable": "تحديث متاح",
"updateFrontend": "تحديث الواجهة الأمامية",
"updated": "تم التحديث",
"updating": "جارٍ التحديث",
"upload": "رفع",
"usageHint": "تلميح الاستخدام",
"user": "المستخدم",
"versionMismatchWarning": "تحذير توافق الإصدارات",
"versionMismatchWarningMessage": "{warning}: {detail} زر https://docs.comfy.org/installation/update_comfyui#common-update-issues للحصول على تعليمات التحديث.",
"videoFailedToLoad": "فشل تحميل الفيديو",
"workflow": "سير العمل"
},
@@ -414,7 +401,6 @@
"resetView": "إعادة تعيين العرض",
"selectMode": "وضع التحديد",
"toggleLinkVisibility": "تبديل ظهور الروابط",
"toggleMinimap": "تبديل الخريطة المصغرة",
"zoomIn": "تكبير",
"zoomOut": "تصغير"
},
@@ -573,10 +559,6 @@
"applyingTexture": "جارٍ تطبيق الخامة...",
"backgroundColor": "لون الخلفية",
"camera": "الكاميرا",
"cameraType": {
"orthographic": "أرثوغرافي",
"perspective": "منظور"
},
"clearRecording": "مسح التسجيل",
"edgeThreshold": "عتبة الحواف",
"export": "تصدير",
@@ -597,7 +579,6 @@
"wireframe": "إطار سلكي"
},
"model": "النموذج",
"openIn3DViewer": "افتح في عارض ثلاثي الأبعاد",
"previewOutput": "معاينة المخرج",
"removeBackgroundImage": "إزالة صورة الخلفية",
"resizeNodeMatchOutput": "تغيير حجم العقدة لتتناسب مع المخرج",
@@ -608,22 +589,8 @@
"switchCamera": "تبديل الكاميرا",
"switchingMaterialMode": "جارٍ تبديل وضع المادة...",
"upDirection": "اتجاه الأعلى",
"upDirections": {
"original": "الأصلي"
},
"uploadBackgroundImage": "رفع صورة خلفية",
"uploadTexture": "رفع الخامة",
"viewer": {
"apply": "تطبيق",
"cameraSettings": "إعدادات الكاميرا",
"cameraType": "نوع الكاميرا",
"cancel": "إلغاء",
"exportSettings": "إعدادات التصدير",
"lightSettings": "إعدادات الإضاءة",
"modelSettings": "إعدادات النموذج",
"sceneSettings": "إعدادات المشهد",
"title": "عارض ثلاثي الأبعاد (بيتا)"
}
"uploadTexture": "رفع الخامة"
},
"loadWorkflowWarning": {
"coreNodesFromVersion": "يتطلب ComfyUI {version}:",
@@ -651,12 +618,15 @@
"title": "الصيانة"
},
"manager": {
"applyChanges": "تطبيق التغييرات",
"changingVersion": "تغيير الإصدار من {from} إلى {to}",
"clickToFinishSetup": "انقر",
"createdBy": "تم الإنشاء بواسطة",
"dependencies": "التبعيات",
"discoverCommunityContent": "استكشف حزم العقد والامتدادات والمزيد من إبداعات المجتمع...",
"downloads": "التنزيلات",
"errorConnecting": "خطأ في الاتصال بسجل عقد Comfy.",
"extensionsSuccessfullyInstalled": "تم تثبيت الإضافة/الإضافات بنجاح وهي جاهزة للاستخدام!",
"failed": "فشل ({count})",
"filter": {
"disabled": "معطّل",
@@ -668,8 +638,12 @@
"installAllMissingNodes": "تثبيت جميع العقد المفقودة",
"installSelected": "تثبيت المحدد",
"installationQueue": "قائمة التثبيت",
"installingDependencies": "يتم تثبيت المتطلبات...",
"lastUpdated": "آخر تحديث",
"latestVersion": "الأحدث",
"legacyManagerUI": "استخدام الواجهة القديمة",
"legacyManagerUIDescription": "لاستخدام واجهة مدير النسخة القديمة، ابدأ ComfyUI مع --enable-manager-legacy-ui",
"legacyMenuNotAvailable": "قائمة مدير النسخة القديمة غير متوفرة، سيتم التحويل إلى قائمة المدير الجديدة.",
"license": "الرخصة",
"loadingVersions": "جاري تحميل الإصدارات...",
"nightlyVersion": "ليلي",
@@ -681,6 +655,7 @@
"packsSelected": "الحزم المحددة",
"repository": "المستودع",
"restartToApplyChanges": "لـتطبيق التغييرات، يرجى إعادة تشغيل ComfyUI",
"restartingBackend": "يتم إعادة تشغيل الخلفية لتطبيق التغييرات...",
"searchPlaceholder": "بحث",
"selectVersion": "اختر الإصدار",
"sort": {
@@ -698,6 +673,7 @@
"unknown": "غير معروف"
},
"title": "مدير العقد المخصصة",
"toFinishSetup": "لإكمال الإعداد",
"totalNodes": "إجمالي العقد",
"tryAgainLater": "يرجى المحاولة مرة أخرى لاحقاً.",
"tryDifferentSearch": "يرجى تجربة استعلام بحث مختلف.",
@@ -739,28 +715,21 @@
"batchCountTooltip": "عدد المرات التي يجب فيها وضع توليد سير العمل في قائمة الانتظار",
"clear": "مسح سير العمل",
"clipspace": "فتح Clipspace",
"dark": "داكن",
"disabled": "معطل",
"disabledTooltip": "لن يتم وضع سير العمل في قائمة الانتظار تلقائيًا",
"execute": "تنفيذ",
"help": "مساعدة",
"hideMenu": "إخفاء القائمة",
"instant": "فوري",
"instantTooltip": "سيتم وضع سير العمل في قائمة الانتظار فور انتهاء التوليد",
"interrupt": "إلغاء التشغيل الحالي",
"light": "فاتح",
"manageExtensions": "إدارة الإضافات",
"onChange": "عند التغيير",
"onChangeTooltip": "سيتم وضع سير العمل في قائمة الانتظار عند إجراء تغيير",
"queue": "لوحة الانتظار",
"refresh": "تحديث تعريفات العقد",
"resetView": "إعادة تعيين عرض اللوحة",
"run": "تشغيل",
"runWorkflow": "تشغيل سير العمل (Shift للانتظار في البداية)",
"runWorkflowFront": "تشغيل سير العمل (انتظار في البداية)",
"settings": "الإعدادات",
"showMenu": "عرض القائمة",
"theme": "المظهر",
"toggleBottomPanel": "تبديل اللوحة السفلية"
},
"menuLabels": {
@@ -770,6 +739,7 @@
"Bypass/Unbypass Selected Nodes": "تجاوز/إلغاء تجاوز العقد المحددة",
"Canvas Performance": "أداء اللوحة",
"Canvas Toggle Lock": "تبديل قفل اللوحة",
"Check for Custom Node Updates": "التحقق من تحديثات العقد المخصصة",
"Check for Updates": "التحقق من التحديثات",
"Clear Pending Tasks": "مسح المهام المعلقة",
"Clear Workflow": "مسح سير العمل",
@@ -783,6 +753,8 @@
"Contact Support": "الاتصال بالدعم",
"Convert Selection to Subgraph": "تحويل التحديد إلى رسم فرعي",
"Convert selected nodes to group node": "تحويل العقد المحددة إلى عقدة مجموعة",
"Custom Nodes (Legacy)": "العقد المخصصة (قديم)",
"Custom Nodes Manager": "مدير العقد المخصصة",
"Decrease Brush Size in MaskEditor": "تقليل حجم الفرشاة في محرر القناع",
"Delete Selected Items": "حذف العناصر المحددة",
"Desktop User Guide": "دليل المستخدم لسطح المكتب",
@@ -799,10 +771,12 @@
"Help": "مساعدة",
"Help Center": "مركز المساعدة",
"Increase Brush Size in MaskEditor": "زيادة حجم الفرشاة في محرر القناع",
"Install Missing Custom Nodes": "تثبيت العقد المخصصة المفقودة",
"Interrupt": "إيقاف مؤقت",
"Load Default Workflow": "تحميل سير العمل الافتراضي",
"Manage group nodes": "إدارة عقد المجموعة",
"Manager": "المدير",
"Manager Menu (Legacy)": "قائمة المدير (قديم)",
"Minimap": "خريطة مصغرة",
"Model Library": "مكتبة النماذج",
"Move Selected Nodes Down": "تحريك العقد المحددة للأسفل",
@@ -828,7 +802,6 @@
"Pin/Unpin Selected Items": "تثبيت/إلغاء تثبيت العناصر المحددة",
"Pin/Unpin Selected Nodes": "تثبيت/إلغاء تثبيت العقد المحددة",
"Previous Opened Workflow": "سير العمل السابق المفتوح",
"Queue Panel": "لوحة الانتظار",
"Queue Prompt": "قائمة انتظار التعليمات",
"Queue Prompt (Front)": "قائمة انتظار التعليمات (أمامي)",
"Queue Selected Output Nodes": "قائمة انتظار عقد المخرجات المحددة",
@@ -845,13 +818,12 @@
"Show Model Selector (Dev)": "إظهار منتقي النماذج (للمطورين)",
"Show Settings Dialog": "عرض نافذة الإعدادات",
"Sign Out": "تسجيل خروج",
"Toggle Essential Bottom Panel": "تبديل لوحة العناصر الأساسية السفلية",
"Toggle Logs Bottom Panel": "تبديل لوحة السجلات السفلية",
"Toggle Search Box": "تبديل مربع البحث",
"Toggle Terminal Bottom Panel": "تبديل لوحة الطرفية السفلية",
"Toggle Theme (Dark/Light)": "تبديل السمة (داكن/فاتح)",
"Toggle View Controls Bottom Panel": "تبديل لوحة عناصر التحكم في العرض السفلية",
"Toggle the Custom Nodes Manager": "تبديل مدير العقد المخصصة",
"Toggle shortcuts_essentials Bottom Panel": "تبديل لوحة الاختصارات الأساسية السفلية",
"Toggle shortcuts_viewControls Bottom Panel": "تبديل لوحة اختصارات عرض التحكم السفلية",
"Toggle the Custom Nodes Manager Progress Bar": "تبديل شريط تقدم مدير العقد المخصصة",
"Undo": "تراجع",
"Ungroup selected group nodes": "فك تجميع عقد المجموعة المحددة",
@@ -859,14 +831,8 @@
"Workflows": "سير العمل",
"Zoom In": "تكبير",
"Zoom Out": "تصغير",
"Zoom to fit": "تكبير لتناسب"
},
"minimap": {
"nodeColors": "ألوان العقد",
"renderBypassState": "عرض حالة التجاوز",
"renderErrorState": "عرض حالة الخطأ",
"showGroups": "إظهار الإطارات/المجموعات",
"showLinks": "إظهار الروابط"
"Zoom to fit": "تكبير لتناسب",
"sideToolbar_queue": "شريط الأدوات الجانبي - قائمة الانتظار"
},
"missingModelsDialog": {
"doNotAskAgain": "عدم العرض مرة أخرى",
@@ -1186,31 +1152,10 @@
"Window": "النافذة",
"Workflow": "سير العمل"
},
"shortcuts": {
"essentials": "أساسي",
"keyboardShortcuts": "اختصارات لوحة المفاتيح",
"manageShortcuts": "إدارة الاختصارات",
"noKeybinding": "لا يوجد ارتباط مفتاح",
"subcategories": {
"node": "العقدة",
"panelControls": "عناصر تحكم اللوحة",
"queue": "قائمة الانتظار",
"view": "العرض",
"workflow": "سير العمل"
},
"viewControls": "عناصر تحكم العرض"
},
"sideToolbar": {
"browseTemplates": "تصفح القوالب المثال",
"downloads": "التنزيلات",
"helpCenter": "مركز المساعدة",
"labels": {
"models": "النماذج",
"nodes": "العُقَد",
"queue": "قائمة الانتظار",
"templates": "القوالب",
"workflows": "سير العمل"
},
"logout": "تسجيل الخروج",
"modelLibrary": "مكتبة النماذج",
"newBlankWorkflow": "إنشاء سير عمل جديد فارغ",
@@ -1248,7 +1193,7 @@
},
"showFlatList": "عرض القائمة المسطحة"
},
"templates": "القوالب",
"themeToggle": "تبديل السمة",
"workflowTab": {
"confirmDelete": "هل أنت متأكد من رغبتك في حذف هذا السير؟",
"confirmDeleteTitle": "حذف سير العمل؟",
@@ -1295,8 +1240,6 @@
"Video": "فيديو",
"Video API": "واجهة برمجة تطبيقات الفيديو"
},
"loadingMore": "تحميل المزيد من القوالب...",
"searchPlaceholder": "ابحث في القوالب...",
"template": {
"3D": {
"3d_hunyuan3d_image_to_model": "Hunyuan3D 2.0",
@@ -1619,7 +1562,6 @@
"failedToExportModel": "فشل في تصدير النموذج بصيغة {format}",
"failedToFetchBalance": "فشل في جلب الرصيد: {error}",
"failedToFetchLogs": "فشل في جلب سجلات الخادم",
"failedToInitializeLoad3dViewer": "فشل في تهيئة عارض ثلاثي الأبعاد",
"failedToInitiateCreditPurchase": "فشل في بدء شراء الرصيد: {error}",
"failedToPurchaseCredits": "فشل في شراء الرصيد: {error}",
"fileLoadError": "غير قادر على إيجاد سير العمل في {fileName}",
@@ -1675,13 +1617,6 @@
"prefix": "يجب أن يبدأ بـ {prefix}",
"required": "مطلوب"
},
"versionMismatchWarning": {
"dismiss": "رفض",
"frontendNewer": "إصدار الواجهة الأمامية {frontendVersion} قد لا يكون متوافقًا مع إصدار الواجهة الخلفية {backendVersion}.",
"frontendOutdated": "إصدار الواجهة الأمامية {frontendVersion} قديم. الواجهة الخلفية تتطلب الإصدار {requiredVersion} أو أعلى.",
"title": "تحذير توافق الإصدار",
"updateFrontend": "تحديث الواجهة الأمامية"
},
"welcome": {
"getStarted": "ابدأ الآن",
"title": "مرحباً بك في ComfyUI"

View File

@@ -164,8 +164,20 @@
"Comfy_LoadDefaultWorkflow": {
"label": "Load Default Workflow"
},
"Comfy_Manager_CustomNodesManager": {
"label": "Toggle the Custom Nodes Manager"
"Comfy_Manager_CustomNodesManager_ShowCustomNodesMenu": {
"label": "Custom Nodes Manager"
},
"Comfy_Manager_CustomNodesManager_ShowLegacyCustomNodesMenu": {
"label": "Custom Nodes (Legacy)"
},
"Comfy_Manager_ShowLegacyManagerMenu": {
"label": "Manager Menu (Legacy)"
},
"Comfy_Manager_ShowMissingPacks": {
"label": "Install Missing Custom Nodes"
},
"Comfy_Manager_ShowUpdateAvailablePacks": {
"label": "Check for Custom Node Updates"
},
"Comfy_Manager_ToggleManagerProgressDialog": {
"label": "Toggle the Custom Nodes Manager Progress Bar"
@@ -258,10 +270,10 @@
"label": "Toggle Logs Bottom Panel"
},
"Workspace_ToggleBottomPanelTab_shortcuts-essentials": {
"label": "Toggle Essential Bottom Panel"
"label": "Toggle shortcuts.essentials Bottom Panel"
},
"Workspace_ToggleBottomPanelTab_shortcuts-view-controls": {
"label": "Toggle View Controls Bottom Panel"
"label": "Toggle shortcuts.viewControls Bottom Panel"
},
"Workspace_ToggleFocusMode": {
"label": "Toggle Focus Mode"

View File

@@ -25,7 +25,6 @@
"confirmed": "Confirmed",
"reset": "Reset",
"resetAll": "Reset All",
"clearFilters": "Clear Filters",
"resetAllKeybindingsTooltip": "Reset all keybindings to default",
"customizeFolder": "Customize Folder",
"icon": "Icon",
@@ -99,12 +98,6 @@
"nodes": "Nodes",
"community": "Community",
"all": "All",
"versionMismatchWarning": "Version Compatibility Warning",
"versionMismatchWarningMessage": "{warning}: {detail} Visit https://docs.comfy.org/installation/update_comfyui#common-update-issues for update instructions.",
"frontendOutdated": "Frontend version {frontendVersion} is outdated. Backend requires {requiredVersion} or higher.",
"frontendNewer": "Frontend version {frontendVersion} may not be compatible with backend version {backendVersion}.",
"updateFrontend": "Update Frontend",
"dismiss": "Dismiss",
"update": "Update",
"updated": "Updated",
"resultsCount": "Found {count} Results",
@@ -144,15 +137,18 @@
"itemsSelected": "{selectedCount} items selected",
"progressCountOf": "of",
"keybindingAlreadyExists": "Keybinding already exists on",
"commandProhibited": "Command {command} is prohibited. Contact an administrator for more information.",
"startRecording": "Start Recording",
"stopRecording": "Stop Recording",
"micPermissionDenied": "Microphone permission denied",
"noAudioRecorded": "No audio recorded",
"nodesRunning": "nodes running",
"duplicate": "Duplicate"
"nodesRunning": "nodes running"
},
"manager": {
"title": "Custom Nodes Manager",
"legacyMenuNotAvailable": "Legacy manager menu is not available, defaulting to the new manager menu.",
"legacyManagerUI": "Use Legacy UI",
"legacyManagerUIDescription": "To use the legacy Manager UI, start ComfyUI with --enable-manager-legacy-ui",
"failed": "Failed ({count})",
"noNodesFound": "No nodes found",
"noNodesFoundDescription": "The pack's nodes either could not be parsed, or the pack is a frontend extension only and doesn't have any nodes.",
@@ -162,6 +158,12 @@
"inWorkflow": "In Workflow",
"infoPanelEmpty": "Click an item to see the info",
"restartToApplyChanges": "To apply changes, please restart ComfyUI",
"clickToFinishSetup": "Click",
"toFinishSetup": "to finish setup",
"applyChanges": "Apply Changes",
"restartingBackend": "Restarting backend to apply changes...",
"extensionsSuccessfullyInstalled": "Extension(s) successfully installed and are ready to use!",
"installingDependencies": "Installing dependencies...",
"loadingVersions": "Loading versions...",
"selectVersion": "Select Version",
"downloads": "Downloads",
@@ -435,19 +437,12 @@
"restart": "Restart"
},
"sideToolbar": {
"themeToggle": "Toggle Theme",
"helpCenter": "Help Center",
"logout": "Logout",
"queue": "Queue",
"nodeLibrary": "Node Library",
"workflows": "Workflows",
"templates": "Templates",
"labels": {
"queue": "Queue",
"nodes": "Nodes",
"models": "Models",
"workflows": "Workflows",
"templates": "Templates"
},
"browseTemplates": "Browse example templates",
"openWorkflow": "Open workflow in local file system",
"newBlankWorkflow": "Create a new blank workflow",
@@ -543,14 +538,7 @@
"clipspace": "Open Clipspace",
"resetView": "Reset canvas view",
"clear": "Clear workflow",
"toggleBottomPanel": "Toggle Bottom Panel",
"theme": "Theme",
"dark": "Dark",
"light": "Light",
"manageExtensions": "Manage Extensions",
"settings": "Settings",
"help": "Help",
"queue": "Queue Panel"
"toggleBottomPanel": "Toggle Bottom Panel"
},
"tabMenu": {
"duplicateTab": "Duplicate Tab",
@@ -563,8 +551,6 @@
},
"templateWorkflows": {
"title": "Get Started with a Template",
"loadingMore": "Loading more templates...",
"searchPlaceholder": "Search templates...",
"category": {
"ComfyUI Examples": "ComfyUI Examples",
"Custom Nodes": "Custom Nodes",
@@ -894,8 +880,7 @@
"fitView": "Fit View",
"selectMode": "Select Mode",
"panMode": "Pan Mode",
"toggleLinkVisibility": "Toggle Link Visibility",
"toggleMinimap": "Toggle Minimap"
"toggleLinkVisibility": "Toggle Link Visibility"
},
"groupNode": {
"create": "Create group node",
@@ -946,6 +931,7 @@
"menuLabels": {
"File": "File",
"Edit": "Edit",
"Manager": "Manager",
"Help": "Help",
"Check for Updates": "Check for Updates",
"Open Custom Nodes Folder": "Open Custom Nodes Folder",
@@ -1002,14 +988,17 @@
"ComfyUI Issues": "ComfyUI Issues",
"Interrupt": "Interrupt",
"Load Default Workflow": "Load Default Workflow",
"Toggle the Custom Nodes Manager": "Toggle the Custom Nodes Manager",
"Custom Nodes Manager": "Custom Nodes Manager",
"Custom Nodes (Legacy)": "Custom Nodes (Legacy)",
"Manager Menu (Legacy)": "Manager Menu (Legacy)",
"Install Missing Custom Nodes": "Install Missing Custom Nodes",
"Check for Custom Node Updates": "Check for Custom Node Updates",
"Toggle the Custom Nodes Manager Progress Bar": "Toggle the Custom Nodes Manager Progress Bar",
"Decrease Brush Size in MaskEditor": "Decrease Brush Size in MaskEditor",
"Increase Brush Size in MaskEditor": "Increase Brush Size in MaskEditor",
"Open Mask Editor for Selected Node": "Open Mask Editor for Selected Node",
"New": "New",
"Clipspace": "Clipspace",
"Manager": "Manager",
"Open": "Open",
"Queue Prompt": "Queue Prompt",
"Queue Prompt (Front)": "Queue Prompt (Front)",
@@ -1033,12 +1022,12 @@
"Show Keybindings Dialog": "Show Keybindings Dialog",
"Toggle Terminal Bottom Panel": "Toggle Terminal Bottom Panel",
"Toggle Logs Bottom Panel": "Toggle Logs Bottom Panel",
"Toggle Essential Bottom Panel": "Toggle Essential Bottom Panel",
"Toggle View Controls Bottom Panel": "Toggle View Controls Bottom Panel",
"Toggle shortcuts_essentials Bottom Panel": "Toggle shortcuts.essentials Bottom Panel",
"Toggle shortcuts_viewControls Bottom Panel": "Toggle shortcuts.viewControls Bottom Panel",
"Focus Mode": "Focus Mode",
"Model Library": "Model Library",
"Node Library": "Node Library",
"Queue Panel": "Queue Panel",
"sideToolbar_queue": "sideToolbar.queue",
"Workflows": "Workflows"
},
"desktopMenu": {
@@ -1383,13 +1372,6 @@
"outdatedVersionGeneric": "Some nodes require a newer version of ComfyUI. Please update to use all nodes.",
"coreNodesFromVersion": "Requires ComfyUI {version}:"
},
"versionMismatchWarning": {
"title": "Version Compatibility Warning",
"frontendOutdated": "Frontend version {frontendVersion} is outdated. Backend requires version {requiredVersion} or higher.",
"frontendNewer": "Frontend version {frontendVersion} may not be compatible with backend version {backendVersion}.",
"updateFrontend": "Update Frontend",
"dismiss": "Dismiss"
},
"errorDialog": {
"defaultTitle": "An error occurred",
"loadWorkflowTitle": "Loading aborted due to error reloading workflow data",
@@ -1451,31 +1433,12 @@
"depth": "Depth",
"lineart": "Lineart"
},
"upDirections": {
"original": "Original"
},
"startRecording": "Start Recording",
"stopRecording": "Stop Recording",
"exportRecording": "Export Recording",
"clearRecording": "Clear Recording",
"resizeNodeMatchOutput": "Resize Node to match output",
"loadingBackgroundImage": "Loading Background Image",
"cameraType": {
"perspective": "Perspective",
"orthographic": "Orthographic"
},
"viewer": {
"title": "3D Viewer (Beta)",
"apply": "Apply",
"cancel": "Cancel",
"cameraType": "Camera Type",
"sceneSettings": "Scene Settings",
"cameraSettings": "Camera Settings",
"lightSettings": "Light Settings",
"exportSettings": "Export Settings",
"modelSettings": "Model Settings"
},
"openIn3DViewer": "Open in 3D Viewer"
"loadingBackgroundImage": "Loading Background Image"
},
"toastMessages": {
"nothingToQueue": "Nothing to queue",
@@ -1513,8 +1476,7 @@
"useApiKeyTip": "Tip: Can't access normal login? Use the Comfy API Key option.",
"nothingSelected": "Nothing selected",
"cannotCreateSubgraph": "Cannot create subgraph",
"failedToConvertToSubgraph": "Failed to convert items to subgraph",
"failedToInitializeLoad3dViewer": "Failed to initialize 3D Viewer"
"failedToConvertToSubgraph": "Failed to convert items to subgraph"
},
"auth": {
"apiKey": {
@@ -1667,32 +1629,5 @@
"whatsNewPopup": {
"learnMore": "Learn more",
"noReleaseNotes": "No release notes available."
},
"breadcrumbsMenu": {
"duplicate": "Duplicate",
"clearWorkflow": "Clear Workflow",
"deleteWorkflow": "Delete Workflow",
"enterNewName": "Enter new name"
},
"shortcuts": {
"essentials": "Essential",
"viewControls": "View Controls",
"manageShortcuts": "Manage Shortcuts",
"noKeybinding": "No keybinding",
"keyboardShortcuts": "Keyboard Shortcuts",
"subcategories": {
"workflow": "Workflow",
"node": "Node",
"queue": "Queue",
"view": "View",
"panelControls": "Panel Controls"
}
},
"minimap": {
"nodeColors": "Node Colors",
"showLinks": "Show Links",
"showGroups": "Show Frames/Groups",
"renderBypassState": "Render Bypass State",
"renderErrorState": "Render Error State"
}
}

View File

@@ -164,8 +164,20 @@
"Comfy_LoadDefaultWorkflow": {
"label": "Cargar flujo de trabajo predeterminado"
},
"Comfy_Manager_CustomNodesManager": {
"label": "Administrador de nodos personalizados"
"Comfy_Manager_CustomNodesManager_ShowCustomNodesMenu": {
"label": "Nodos personalizados (Beta)"
},
"Comfy_Manager_CustomNodesManager_ShowLegacyCustomNodesMenu": {
"label": "Nodos personalizados (heredados)"
},
"Comfy_Manager_ShowLegacyManagerMenu": {
"label": "Menú del administrador (heredado)"
},
"Comfy_Manager_ShowMissingPacks": {
"label": "Instalar faltantes"
},
"Comfy_Manager_ShowUpdateAvailablePacks": {
"label": "Buscar actualizaciones"
},
"Comfy_Manager_ToggleManagerProgressDialog": {
"label": "Alternar diálogo de progreso del administrador"

View File

@@ -82,12 +82,6 @@
"title": "Crea una cuenta"
}
},
"breadcrumbsMenu": {
"clearWorkflow": "Limpiar flujo de trabajo",
"deleteWorkflow": "Eliminar flujo de trabajo",
"duplicate": "Duplicar",
"enterNewName": "Ingrese un nuevo nombre"
},
"chatHistory": {
"cancelEdit": "Cancelar",
"cancelEditTooltip": "Cancelar edición",
@@ -273,11 +267,11 @@
"choose_file_to_upload": "elige archivo para subir",
"clear": "Limpiar",
"clearAll": "Borrar todo",
"clearFilters": "Borrar filtros",
"close": "Cerrar",
"color": "Color",
"comingSoon": "Próximamente",
"command": "Comando",
"commandProhibited": "El comando {command} está prohibido. Contacta a un administrador para más información.",
"community": "Comunidad",
"completed": "Completado",
"confirm": "Confirmar",
@@ -298,9 +292,7 @@
"devices": "Dispositivos",
"disableAll": "Deshabilitar todo",
"disabling": "Deshabilitando",
"dismiss": "Descartar",
"download": "Descargar",
"duplicate": "Duplicar",
"edit": "Editar",
"empty": "Vacío",
"enableAll": "Habilitar todo",
@@ -314,8 +306,6 @@
"filter": "Filtrar",
"findIssues": "Encontrar problemas",
"firstTimeUIMessage": "Esta es la primera vez que usas la nueva interfaz. Elige \"Menú > Usar nuevo menú > Desactivado\" para restaurar la antigua interfaz.",
"frontendNewer": "La versión del frontend {frontendVersion} puede no ser compatible con la versión del backend {backendVersion}.",
"frontendOutdated": "La versión del frontend {frontendVersion} está desactualizada. El backend requiere la versión {requiredVersion} o superior.",
"goToNode": "Ir al nodo",
"help": "Ayuda",
"icon": "Icono",
@@ -397,14 +387,11 @@
"unknownError": "Error desconocido",
"update": "Actualizar",
"updateAvailable": "Actualización Disponible",
"updateFrontend": "Actualizar frontend",
"updated": "Actualizado",
"updating": "Actualizando",
"upload": "Subir",
"usageHint": "Sugerencia de uso",
"user": "Usuario",
"versionMismatchWarning": "Advertencia de compatibilidad de versión",
"versionMismatchWarningMessage": "{warning}: {detail} Visita https://docs.comfy.org/installation/update_comfyui#common-update-issues para obtener instrucciones de actualización.",
"videoFailedToLoad": "Falló la carga del video",
"workflow": "Flujo de trabajo"
},
@@ -414,7 +401,6 @@
"resetView": "Restablecer vista",
"selectMode": "Modo de selección",
"toggleLinkVisibility": "Alternar visibilidad de enlace",
"toggleMinimap": "Alternar minimapa",
"zoomIn": "Acercar",
"zoomOut": "Alejar"
},
@@ -573,10 +559,6 @@
"applyingTexture": "Aplicando textura...",
"backgroundColor": "Color de fondo",
"camera": "Cámara",
"cameraType": {
"orthographic": "Ortográfica",
"perspective": "Perspectiva"
},
"clearRecording": "Borrar grabación",
"edgeThreshold": "Umbral de borde",
"export": "Exportar",
@@ -597,7 +579,6 @@
"wireframe": "Malla"
},
"model": "Modelo",
"openIn3DViewer": "Abrir en el visor 3D",
"previewOutput": "Vista previa de salida",
"removeBackgroundImage": "Eliminar imagen de fondo",
"resizeNodeMatchOutput": "Redimensionar nodo para coincidir con la salida",
@@ -608,22 +589,8 @@
"switchCamera": "Cambiar cámara",
"switchingMaterialMode": "Cambiando modo de material...",
"upDirection": "Dirección hacia arriba",
"upDirections": {
"original": "Original"
},
"uploadBackgroundImage": "Subir imagen de fondo",
"uploadTexture": "Subir textura",
"viewer": {
"apply": "Aplicar",
"cameraSettings": "Configuración de la cámara",
"cameraType": "Tipo de cámara",
"cancel": "Cancelar",
"exportSettings": "Configuración de exportación",
"lightSettings": "Configuración de la luz",
"modelSettings": "Configuración del modelo",
"sceneSettings": "Configuración de la escena",
"title": "Visor 3D (Beta)"
}
"uploadTexture": "Subir textura"
},
"loadWorkflowWarning": {
"coreNodesFromVersion": "Requiere ComfyUI {version}:",
@@ -651,12 +618,15 @@
"title": "Mantenimiento"
},
"manager": {
"applyChanges": "Aplicar cambios",
"changingVersion": "Cambiando versión de {from} a {to}",
"clickToFinishSetup": "Haz clic",
"createdBy": "Creado Por",
"dependencies": "Dependencias",
"discoverCommunityContent": "Descubre paquetes de nodos, extensiones y más creados por la comunidad...",
"downloads": "Descargas",
"errorConnecting": "Error al conectar con el Registro de Nodos Comfy.",
"extensionsSuccessfullyInstalled": "¡Extensión(es) instalada(s) correctamente y listas para usar!",
"failed": "Falló ({count})",
"filter": {
"disabled": "Deshabilitado",
@@ -668,8 +638,12 @@
"installAllMissingNodes": "Instalar todos los nodos faltantes",
"installSelected": "Instalar Seleccionado",
"installationQueue": "Cola de Instalación",
"installingDependencies": "Instalando dependencias...",
"lastUpdated": "Última Actualización",
"latestVersion": "Última",
"legacyManagerUI": "Usar UI antigua",
"legacyManagerUIDescription": "Para usar la UI antigua del Manager, inicia ComfyUI con --enable-manager-legacy-ui",
"legacyMenuNotAvailable": "El menú del administrador antiguo no está disponible en esta versión de ComfyUI. Por favor, utiliza el nuevo menú del administrador en su lugar.",
"license": "Licencia",
"loadingVersions": "Cargando versiones...",
"nightlyVersion": "Nocturna",
@@ -681,6 +655,7 @@
"packsSelected": "Paquetes Seleccionados",
"repository": "Repositorio",
"restartToApplyChanges": "Para aplicar los cambios, por favor reinicia ComfyUI",
"restartingBackend": "Reiniciando el backend para aplicar los cambios...",
"searchPlaceholder": "Buscar",
"selectVersion": "Seleccionar Versión",
"sort": {
@@ -698,6 +673,7 @@
"unknown": "Desconocido"
},
"title": "Administrador de Nodos Personalizados",
"toFinishSetup": "para finalizar la configuración",
"totalNodes": "Total de Nodos",
"tryAgainLater": "Por favor intenta de nuevo más tarde.",
"tryDifferentSearch": "Por favor intenta con una consulta de búsqueda diferente.",
@@ -739,28 +715,21 @@
"batchCountTooltip": "El número de veces que la generación del flujo de trabajo debe ser encolada",
"clear": "Limpiar flujo de trabajo",
"clipspace": "Abrir Clipspace",
"dark": "Oscuro",
"disabled": "Deshabilitado",
"disabledTooltip": "El flujo de trabajo no se encolará automáticamente",
"execute": "Ejecutar",
"help": "Ayuda",
"hideMenu": "Ocultar menú",
"instant": "Instantáneo",
"instantTooltip": "El flujo de trabajo se encolará instantáneamente después de que finalice una generación",
"interrupt": "Cancelar ejecución actual",
"light": "Claro",
"manageExtensions": "Gestionar extensiones",
"onChange": "Al cambiar",
"onChangeTooltip": "El flujo de trabajo se encolará una vez que se haga un cambio",
"queue": "Panel de cola",
"refresh": "Actualizar definiciones de nodos",
"resetView": "Restablecer vista del lienzo",
"run": "Ejecutar",
"runWorkflow": "Ejecutar flujo de trabajo (Shift para encolar al frente)",
"runWorkflowFront": "Ejecutar flujo de trabajo (Encolar al frente)",
"settings": "Configuración",
"showMenu": "Mostrar menú",
"theme": "Tema",
"toggleBottomPanel": "Alternar panel inferior"
},
"menuLabels": {
@@ -770,6 +739,7 @@
"Bypass/Unbypass Selected Nodes": "Evitar/No evitar nodos seleccionados",
"Canvas Performance": "Rendimiento del lienzo",
"Canvas Toggle Lock": "Alternar bloqueo en lienzo",
"Check for Custom Node Updates": "Buscar actualizaciones de nodos personalizados",
"Check for Updates": "Buscar actualizaciones",
"Clear Pending Tasks": "Borrar tareas pendientes",
"Clear Workflow": "Borrar flujo de trabajo",
@@ -783,12 +753,14 @@
"Contact Support": "Contactar soporte",
"Convert Selection to Subgraph": "Convertir selección en subgrafo",
"Convert selected nodes to group node": "Convertir nodos seleccionados en nodo de grupo",
"Custom Nodes (Legacy)": "Nodos personalizados (heredado)",
"Custom Nodes Manager": "Administrador de Nodos Personalizados",
"Decrease Brush Size in MaskEditor": "Disminuir tamaño del pincel en MaskEditor",
"Delete Selected Items": "Eliminar elementos seleccionados",
"Desktop User Guide": "Guía de usuario de escritorio",
"Duplicate Current Workflow": "Duplicar flujo de trabajo actual",
"Edit": "Editar",
"Exit Subgraph": "Salir de subgrafo",
"Exit Subgraph": "Salir del subgrafo",
"Export": "Exportar",
"Export (API)": "Exportar (API)",
"File": "Archivo",
@@ -799,10 +771,12 @@
"Help": "Ayuda",
"Help Center": "Centro de ayuda",
"Increase Brush Size in MaskEditor": "Aumentar tamaño del pincel en MaskEditor",
"Install Missing Custom Nodes": "Instalar nodos personalizados faltantes",
"Interrupt": "Interrumpir",
"Load Default Workflow": "Cargar flujo de trabajo predeterminado",
"Manage group nodes": "Gestionar nodos de grupo",
"Manager": "Administrador",
"Manager Menu (Legacy)": "Menú de gestión (heredado)",
"Minimap": "Minimapa",
"Model Library": "Biblioteca de modelos",
"Move Selected Nodes Down": "Mover nodos seleccionados hacia abajo",
@@ -828,7 +802,6 @@
"Pin/Unpin Selected Items": "Anclar/Desanclar elementos seleccionados",
"Pin/Unpin Selected Nodes": "Anclar/Desanclar nodos seleccionados",
"Previous Opened Workflow": "Flujo de trabajo abierto anterior",
"Queue Panel": "Panel de cola",
"Queue Prompt": "Indicador de cola",
"Queue Prompt (Front)": "Indicador de cola (Frente)",
"Queue Selected Output Nodes": "Encolar nodos de salida seleccionados",
@@ -845,28 +818,21 @@
"Show Model Selector (Dev)": "Mostrar selector de modelo (Desarrollo)",
"Show Settings Dialog": "Mostrar diálogo de configuración",
"Sign Out": "Cerrar sesión",
"Toggle Essential Bottom Panel": "Alternar panel inferior esencial",
"Toggle Logs Bottom Panel": "Alternar panel inferior de registros",
"Toggle Search Box": "Alternar caja de búsqueda",
"Toggle Terminal Bottom Panel": "Alternar panel inferior de terminal",
"Toggle Theme (Dark/Light)": "Alternar tema (Oscuro/Claro)",
"Toggle View Controls Bottom Panel": "Alternar panel inferior de controles de vista",
"Toggle the Custom Nodes Manager": "Alternar el Administrador de Nodos Personalizados",
"Toggle shortcuts_essentials Bottom Panel": "Alternar panel inferior de atajos esenciales",
"Toggle shortcuts_viewControls Bottom Panel": "Alternar panel inferior de controles de vista",
"Toggle the Custom Nodes Manager Progress Bar": "Alternar la Barra de Progreso del Administrador de Nodos Personalizados",
"Undo": "Deshacer",
"Ungroup selected group nodes": "Desagrupar nodos de grupo seleccionados",
"Unpack the selected Subgraph": "Desempaquetar el Subgrafo seleccionado",
"Unpack the selected Subgraph": "Desempaquetar el subgrafo seleccionado",
"Workflows": "Flujos de trabajo",
"Zoom In": "Acercar",
"Zoom Out": "Alejar",
"Zoom to fit": "Ajustar al tamaño"
},
"minimap": {
"nodeColors": "Colores de nodos",
"renderBypassState": "Mostrar estado de omisión",
"renderErrorState": "Mostrar estado de error",
"showGroups": "Mostrar marcos/grupos",
"showLinks": "Mostrar enlaces"
"Zoom to fit": "Ajustar zoom",
"sideToolbar_queue": "Cola"
},
"missingModelsDialog": {
"doNotAskAgain": "No mostrar esto de nuevo",
@@ -1186,31 +1152,10 @@
"Window": "Ventana",
"Workflow": "Flujo de Trabajo"
},
"shortcuts": {
"essentials": "Esenciales",
"keyboardShortcuts": "Atajos de teclado",
"manageShortcuts": "Gestionar atajos",
"noKeybinding": "Sin asignación de tecla",
"subcategories": {
"node": "Nodo",
"panelControls": "Controles del panel",
"queue": "Cola",
"view": "Vista",
"workflow": "Flujo de trabajo"
},
"viewControls": "Controles de vista"
},
"sideToolbar": {
"browseTemplates": "Explorar plantillas de ejemplo",
"downloads": "Descargas",
"helpCenter": "Centro de ayuda",
"labels": {
"models": "Modelos",
"nodes": "Nodos",
"queue": "Cola",
"templates": "Plantillas",
"workflows": "Flujos de trabajo"
},
"logout": "Cerrar sesión",
"modelLibrary": "Biblioteca de modelos",
"newBlankWorkflow": "Crear un nuevo flujo de trabajo en blanco",
@@ -1248,7 +1193,7 @@
},
"showFlatList": "Mostrar lista plana"
},
"templates": "Plantillas",
"themeToggle": "Cambiar tema",
"workflowTab": {
"confirmDelete": "¿Estás seguro de que quieres eliminar este flujo de trabajo?",
"confirmDeleteTitle": "¿Eliminar flujo de trabajo?",
@@ -1295,8 +1240,6 @@
"Video": "Video",
"Video API": "API de Video"
},
"loadingMore": "Cargando más plantillas...",
"searchPlaceholder": "Buscar plantillas...",
"template": {
"3D": {
"3d_hunyuan3d_image_to_model": "Hunyuan3D 2.0",
@@ -1619,7 +1562,6 @@
"failedToExportModel": "Error al exportar modelo como {format}",
"failedToFetchBalance": "No se pudo obtener el saldo: {error}",
"failedToFetchLogs": "Error al obtener los registros del servidor",
"failedToInitializeLoad3dViewer": "No se pudo inicializar el visor 3D",
"failedToInitiateCreditPurchase": "No se pudo iniciar la compra de créditos: {error}",
"failedToPurchaseCredits": "No se pudo comprar créditos: {error}",
"fileLoadError": "No se puede encontrar el flujo de trabajo en {fileName}",
@@ -1675,13 +1617,6 @@
"prefix": "Debe comenzar con {prefix}",
"required": "Requerido"
},
"versionMismatchWarning": {
"dismiss": "Descartar",
"frontendNewer": "La versión del frontend {frontendVersion} puede no ser compatible con la versión del backend {backendVersion}.",
"frontendOutdated": "La versión del frontend {frontendVersion} está desactualizada. El backend requiere la versión {requiredVersion} o superior.",
"title": "Advertencia de compatibilidad de versión",
"updateFrontend": "Actualizar frontend"
},
"welcome": {
"getStarted": "Empezar",
"title": "Bienvenido a ComfyUI"

View File

@@ -164,8 +164,20 @@
"Comfy_LoadDefaultWorkflow": {
"label": "Charger le flux de travail par défaut"
},
"Comfy_Manager_CustomNodesManager": {
"label": "Gestionnaire de Nœuds Personnalisés"
"Comfy_Manager_CustomNodesManager_ShowCustomNodesMenu": {
"label": "Nœuds personnalisés (Beta)"
},
"Comfy_Manager_CustomNodesManager_ShowLegacyCustomNodesMenu": {
"label": "Nœuds personnalisés (hérités)"
},
"Comfy_Manager_ShowLegacyManagerMenu": {
"label": "Menu du gestionnaire (héritage)"
},
"Comfy_Manager_ShowMissingPacks": {
"label": "Installer manquants"
},
"Comfy_Manager_ShowUpdateAvailablePacks": {
"label": "Vérifier les mises à jour"
},
"Comfy_Manager_ToggleManagerProgressDialog": {
"label": "Basculer la boîte de dialogue de progression"

View File

@@ -82,12 +82,6 @@
"title": "Créer un compte"
}
},
"breadcrumbsMenu": {
"clearWorkflow": "Effacer le workflow",
"deleteWorkflow": "Supprimer le workflow",
"duplicate": "Dupliquer",
"enterNewName": "Entrez un nouveau nom"
},
"chatHistory": {
"cancelEdit": "Annuler",
"cancelEditTooltip": "Annuler la modification",
@@ -273,11 +267,11 @@
"choose_file_to_upload": "choisissez le fichier à télécharger",
"clear": "Effacer",
"clearAll": "Tout effacer",
"clearFilters": "Effacer les filtres",
"close": "Fermer",
"color": "Couleur",
"comingSoon": "Bientôt disponible",
"command": "Commande",
"commandProhibited": "La commande {command} est interdite. Contactez un administrateur pour plus d'informations.",
"community": "Communauté",
"completed": "Terminé",
"confirm": "Confirmer",
@@ -298,9 +292,7 @@
"devices": "Appareils",
"disableAll": "Désactiver tout",
"disabling": "Désactivation",
"dismiss": "Fermer",
"download": "Télécharger",
"duplicate": "Dupliquer",
"edit": "Modifier",
"empty": "Vide",
"enableAll": "Activer tout",
@@ -314,8 +306,6 @@
"filter": "Filtrer",
"findIssues": "Trouver des problèmes",
"firstTimeUIMessage": "C'est la première fois que vous utilisez la nouvelle interface utilisateur. Choisissez \"Menu > Utiliser le nouveau menu > Désactivé\" pour restaurer l'ancienne interface utilisateur.",
"frontendNewer": "La version du frontend {frontendVersion} peut ne pas être compatible avec la version du backend {backendVersion}.",
"frontendOutdated": "La version du frontend {frontendVersion} est obsolète. Le backend requiert la version {requiredVersion} ou supérieure.",
"goToNode": "Aller au nœud",
"help": "Aide",
"icon": "Icône",
@@ -397,14 +387,11 @@
"unknownError": "Erreur inconnue",
"update": "Mettre à jour",
"updateAvailable": "Mise à jour disponible",
"updateFrontend": "Mettre à jour le frontend",
"updated": "Mis à jour",
"updating": "Mise à jour",
"upload": "Téléverser",
"usageHint": "Conseil d'utilisation",
"user": "Utilisateur",
"versionMismatchWarning": "Avertissement de compatibilité de version",
"versionMismatchWarningMessage": "{warning} : {detail} Consultez https://docs.comfy.org/installation/update_comfyui#common-update-issues pour les instructions de mise à jour.",
"videoFailedToLoad": "Échec du chargement de la vidéo",
"workflow": "Flux de travail"
},
@@ -414,7 +401,6 @@
"resetView": "Réinitialiser la vue",
"selectMode": "Mode sélection",
"toggleLinkVisibility": "Basculer la visibilité des liens",
"toggleMinimap": "Afficher/Masquer la mini-carte",
"zoomIn": "Zoom avant",
"zoomOut": "Zoom arrière"
},
@@ -573,10 +559,6 @@
"applyingTexture": "Application de la texture...",
"backgroundColor": "Couleur de fond",
"camera": "Caméra",
"cameraType": {
"orthographic": "Orthographique",
"perspective": "Perspective"
},
"clearRecording": "Effacer l'enregistrement",
"edgeThreshold": "Seuil de Bordure",
"export": "Exportation",
@@ -597,7 +579,6 @@
"wireframe": "Fil de fer"
},
"model": "Modèle",
"openIn3DViewer": "Ouvrir dans la visionneuse 3D",
"previewOutput": "Aperçu de la sortie",
"removeBackgroundImage": "Supprimer l'image de fond",
"resizeNodeMatchOutput": "Redimensionner le nœud pour correspondre à la sortie",
@@ -608,22 +589,8 @@
"switchCamera": "Changer de caméra",
"switchingMaterialMode": "Changement de mode de matériau...",
"upDirection": "Direction Haut",
"upDirections": {
"original": "Original"
},
"uploadBackgroundImage": "Télécharger l'image de fond",
"uploadTexture": "Télécharger Texture",
"viewer": {
"apply": "Appliquer",
"cameraSettings": "Paramètres de la caméra",
"cameraType": "Type de caméra",
"cancel": "Annuler",
"exportSettings": "Paramètres dexportation",
"lightSettings": "Paramètres de léclairage",
"modelSettings": "Paramètres du modèle",
"sceneSettings": "Paramètres de la scène",
"title": "Visionneuse 3D (Bêta)"
}
"uploadTexture": "Télécharger Texture"
},
"loadWorkflowWarning": {
"coreNodesFromVersion": "Nécessite ComfyUI {version} :",
@@ -651,12 +618,15 @@
"title": "Maintenance"
},
"manager": {
"applyChanges": "Appliquer les modifications",
"changingVersion": "Changement de version de {from} à {to}",
"clickToFinishSetup": "Cliquez",
"createdBy": "Créé par",
"dependencies": "Dépendances",
"discoverCommunityContent": "Découvrez les packs de nœuds, extensions et plus encore créés par la communauté...",
"downloads": "Téléchargements",
"errorConnecting": "Erreur de connexion au registre de nœuds Comfy.",
"extensionsSuccessfullyInstalled": "Extension(s) installée(s) avec succès et prêtes à l'emploi !",
"failed": "Échoué ({count})",
"filter": {
"disabled": "Désactivé",
@@ -668,8 +638,12 @@
"installAllMissingNodes": "Installer tous les nœuds manquants",
"installSelected": "Installer sélectionné",
"installationQueue": "File d'attente d'installation",
"installingDependencies": "Installation des dépendances...",
"lastUpdated": "Dernière mise à jour",
"latestVersion": "Dernière",
"legacyManagerUI": "Utiliser l'interface utilisateur héritée",
"legacyManagerUIDescription": "Pour utiliser l'interface utilisateur de gestion héritée, démarrez ComfyUI avec --enable-manager-legacy-ui",
"legacyMenuNotAvailable": "Le menu du gestionnaire de l'ancienne version n'est pas disponible dans cette version de ComfyUI. Veuillez utiliser le nouveau menu du gestionnaire à la place.",
"license": "Licence",
"loadingVersions": "Chargement des versions...",
"nightlyVersion": "Nocturne",
@@ -681,6 +655,7 @@
"packsSelected": "Packs sélectionnés",
"repository": "Référentiel",
"restartToApplyChanges": "Pour appliquer les modifications, veuillez redémarrer ComfyUI",
"restartingBackend": "Redémarrage du backend pour appliquer les modifications...",
"searchPlaceholder": "Recherche",
"selectVersion": "Sélectionner la version",
"sort": {
@@ -698,6 +673,7 @@
"unknown": "Inconnu"
},
"title": "Gestionnaire de Nœuds Personnalisés",
"toFinishSetup": "pour terminer la configuration",
"totalNodes": "Total de Nœuds",
"tryAgainLater": "Veuillez réessayer plus tard.",
"tryDifferentSearch": "Veuillez essayer une autre requête de recherche.",
@@ -739,28 +715,21 @@
"batchCountTooltip": "Le nombre de fois que la génération du flux de travail doit être mise en file d'attente",
"clear": "Effacer le flux de travail",
"clipspace": "Ouvrir Clipspace",
"dark": "Sombre",
"disabled": "Désactivé",
"disabledTooltip": "Le flux de travail ne sera pas mis en file d'attente automatiquement",
"execute": "Exécuter",
"help": "Aide",
"hideMenu": "Masquer le menu",
"instant": "Instantané",
"instantTooltip": "Le flux de travail sera mis en file d'attente immédiatement après la fin d'une génération",
"interrupt": "Annuler l'exécution en cours",
"light": "Clair",
"manageExtensions": "Gérer les extensions",
"onChange": "Sur modification",
"onChangeTooltip": "Le flux de travail sera mis en file d'attente une fois une modification effectuée",
"queue": "Panneau de file dattente",
"refresh": "Actualiser les définitions des nœuds",
"resetView": "Réinitialiser la vue du canevas",
"run": "Exécuter",
"runWorkflow": "Exécuter le workflow (Maj pour mettre en file d'attente en premier)",
"runWorkflowFront": "Exécuter le workflow (Mettre en file d'attente en premier)",
"settings": "Paramètres",
"showMenu": "Afficher le menu",
"theme": "Thème",
"toggleBottomPanel": "Basculer le panneau inférieur"
},
"menuLabels": {
@@ -770,6 +739,7 @@
"Bypass/Unbypass Selected Nodes": "Contourner/Ne pas contourner les nœuds sélectionnés",
"Canvas Performance": "Performance du canevas",
"Canvas Toggle Lock": "Basculer le verrouillage de la toile",
"Check for Custom Node Updates": "Vérifier les mises à jour des nœuds personnalisés",
"Check for Updates": "Vérifier les mises à jour",
"Clear Pending Tasks": "Effacer les tâches en attente",
"Clear Workflow": "Effacer le flux de travail",
@@ -783,6 +753,8 @@
"Contact Support": "Contacter le support",
"Convert Selection to Subgraph": "Convertir la sélection en sous-graphe",
"Convert selected nodes to group node": "Convertir les nœuds sélectionnés en nœud de groupe",
"Custom Nodes (Legacy)": "Nœuds personnalisés (héritage)",
"Custom Nodes Manager": "Gestionnaire de Nœuds Personnalisés",
"Decrease Brush Size in MaskEditor": "Réduire la taille du pinceau dans MaskEditor",
"Delete Selected Items": "Supprimer les éléments sélectionnés",
"Desktop User Guide": "Guide de l'utilisateur de bureau",
@@ -797,12 +769,14 @@
"Give Feedback": "Donnez votre avis",
"Group Selected Nodes": "Grouper les nœuds sélectionnés",
"Help": "Aide",
"Help Center": "Centre daide",
"Help Center": "Centre d'aide",
"Increase Brush Size in MaskEditor": "Augmenter la taille du pinceau dans MaskEditor",
"Install Missing Custom Nodes": "Installer les nœuds personnalisés manquants",
"Interrupt": "Interrompre",
"Load Default Workflow": "Charger le flux de travail par défaut",
"Manage group nodes": "Gérer les nœuds de groupe",
"Manager": "Gestionnaire",
"Manager Menu (Legacy)": "Menu du gestionnaire (héritage)",
"Minimap": "Minicarte",
"Model Library": "Bibliothèque de modèles",
"Move Selected Nodes Down": "Déplacer les nœuds sélectionnés vers le bas",
@@ -828,7 +802,6 @@
"Pin/Unpin Selected Items": "Épingler/Désépingler les éléments sélectionnés",
"Pin/Unpin Selected Nodes": "Épingler/Désépingler les nœuds sélectionnés",
"Previous Opened Workflow": "Flux de travail ouvert précédent",
"Queue Panel": "Panneau de file dattente",
"Queue Prompt": "Invite de file d'attente",
"Queue Prompt (Front)": "Invite de file d'attente (Front)",
"Queue Selected Output Nodes": "Mettre en file dattente les nœuds de sortie sélectionnés",
@@ -845,28 +818,21 @@
"Show Model Selector (Dev)": "Afficher le sélecteur de modèle (Dev)",
"Show Settings Dialog": "Afficher la boîte de dialogue des paramètres",
"Sign Out": "Se déconnecter",
"Toggle Essential Bottom Panel": "Basculer le panneau inférieur essentiel",
"Toggle Logs Bottom Panel": "Basculer le panneau inférieur des journaux",
"Toggle Search Box": "Basculer la boîte de recherche",
"Toggle Terminal Bottom Panel": "Basculer le panneau inférieur du terminal",
"Toggle Theme (Dark/Light)": "Basculer le thème (Sombre/Clair)",
"Toggle View Controls Bottom Panel": "Basculer le panneau inférieur des contrôles daffichage",
"Toggle the Custom Nodes Manager": "Basculer le gestionnaire de nœuds personnalisés",
"Toggle shortcuts_essentials Bottom Panel": "Afficher/Masquer le panneau inférieur des raccourcis essentiels",
"Toggle shortcuts_viewControls Bottom Panel": "Afficher/Masquer le panneau inférieur des contrôles de vue",
"Toggle the Custom Nodes Manager Progress Bar": "Basculer la barre de progression du gestionnaire de nœuds personnalisés",
"Undo": "Annuler",
"Ungroup selected group nodes": "Dégrouper les nœuds de groupe sélectionnés",
"Unpack the selected Subgraph": "Décompresser le Subgraph sélectionné",
"Unpack the selected Subgraph": "Décompresser le sous-graphe sélectionné",
"Workflows": "Flux de travail",
"Zoom In": "Zoom avant",
"Zoom Out": "Zoom arrière",
"Zoom to fit": "Ajuster à lécran"
},
"minimap": {
"nodeColors": "Couleurs des nœuds",
"renderBypassState": "Afficher létat de contournement",
"renderErrorState": "Afficher létat derreur",
"showGroups": "Afficher les cadres/groupes",
"showLinks": "Afficher les liens"
"Zoom to fit": "Ajuster le zoom",
"sideToolbar_queue": "File d'attente"
},
"missingModelsDialog": {
"doNotAskAgain": "Ne plus afficher ce message",
@@ -1186,31 +1152,10 @@
"Window": "Fenêtre",
"Workflow": "Flux de Travail"
},
"shortcuts": {
"essentials": "Essentiel",
"keyboardShortcuts": "Raccourcis clavier",
"manageShortcuts": "Gérer les raccourcis",
"noKeybinding": "Aucun raccourci",
"subcategories": {
"node": "Nœud",
"panelControls": "Contrôles du panneau",
"queue": "File dattente",
"view": "Vue",
"workflow": "Flux de travail"
},
"viewControls": "Contrôles daffichage"
},
"sideToolbar": {
"browseTemplates": "Parcourir les modèles d'exemple",
"downloads": "Téléchargements",
"helpCenter": "Centre d'aide",
"labels": {
"models": "Modèles",
"nodes": "Nœuds",
"queue": "File dattente",
"templates": "Modèles",
"workflows": "Flux de travail"
},
"logout": "Déconnexion",
"modelLibrary": "Bibliothèque de modèles",
"newBlankWorkflow": "Créer un nouveau flux de travail vierge",
@@ -1248,7 +1193,7 @@
},
"showFlatList": "Afficher la liste plate"
},
"templates": "Modèles",
"themeToggle": "Changer le thème",
"workflowTab": {
"confirmDelete": "Êtes-vous sûr de vouloir supprimer ce flux de travail ?",
"confirmDeleteTitle": "Supprimer le flux de travail ?",
@@ -1295,8 +1240,6 @@
"Video": "Vidéo",
"Video API": "API vidéo"
},
"loadingMore": "Chargement de plus de modèles...",
"searchPlaceholder": "Rechercher des modèles...",
"template": {
"3D": {
"3d_hunyuan3d_image_to_model": "Hunyuan3D",
@@ -1619,7 +1562,6 @@
"failedToExportModel": "Échec de l'exportation du modèle en {format}",
"failedToFetchBalance": "Échec de la récupération du solde : {error}",
"failedToFetchLogs": "Échec de la récupération des journaux du serveur",
"failedToInitializeLoad3dViewer": "Échec de l'initialisation du visualiseur 3D",
"failedToInitiateCreditPurchase": "Échec de l'initiation de l'achat de crédits : {error}",
"failedToPurchaseCredits": "Échec de l'achat de crédits : {error}",
"fileLoadError": "Impossible de trouver le flux de travail dans {fileName}",
@@ -1675,13 +1617,6 @@
"prefix": "Doit commencer par {prefix}",
"required": "Requis"
},
"versionMismatchWarning": {
"dismiss": "Ignorer",
"frontendNewer": "La version du frontend {frontendVersion} peut ne pas être compatible avec la version du backend {backendVersion}.",
"frontendOutdated": "La version du frontend {frontendVersion} est obsolète. Le backend nécessite la version {requiredVersion} ou supérieure.",
"title": "Avertissement de compatibilité de version",
"updateFrontend": "Mettre à jour le frontend"
},
"welcome": {
"getStarted": "Commencer",
"title": "Bienvenue sur ComfyUI"

View File

@@ -164,8 +164,20 @@
"Comfy_LoadDefaultWorkflow": {
"label": "デフォルトのワークフローを読み込む"
},
"Comfy_Manager_CustomNodesManager": {
"label": "カスタムノードマネージャ"
"Comfy_Manager_CustomNodesManager_ShowCustomNodesMenu": {
"label": "カスタムノード(ベータ版)"
},
"Comfy_Manager_CustomNodesManager_ShowLegacyCustomNodesMenu": {
"label": "カスタムノード(レガシー)"
},
"Comfy_Manager_ShowLegacyManagerMenu": {
"label": "マネージャーメニュー(レガシー)"
},
"Comfy_Manager_ShowMissingPacks": {
"label": "不足しているパックをインストール"
},
"Comfy_Manager_ShowUpdateAvailablePacks": {
"label": "更新を確認"
},
"Comfy_Manager_ToggleManagerProgressDialog": {
"label": "プログレスダイアログの切り替え"

View File

@@ -82,12 +82,6 @@
"title": "アカウントを作成する"
}
},
"breadcrumbsMenu": {
"clearWorkflow": "ワークフローをクリア",
"deleteWorkflow": "ワークフローを削除",
"duplicate": "複製",
"enterNewName": "新しい名前を入力"
},
"chatHistory": {
"cancelEdit": "キャンセル",
"cancelEditTooltip": "編集をキャンセル",
@@ -273,11 +267,11 @@
"choose_file_to_upload": "アップロードするファイルを選択",
"clear": "クリア",
"clearAll": "すべてクリア",
"clearFilters": "フィルターをクリア",
"close": "閉じる",
"color": "色",
"comingSoon": "近日公開",
"command": "コマンド",
"commandProhibited": "コマンド {command} は禁止されています。詳細は管理者にお問い合わせください。",
"community": "コミュニティ",
"completed": "完了",
"confirm": "確認",
@@ -298,9 +292,7 @@
"devices": "デバイス",
"disableAll": "すべて無効にする",
"disabling": "無効化",
"dismiss": "閉じる",
"download": "ダウンロード",
"duplicate": "複製",
"edit": "編集",
"empty": "空",
"enableAll": "すべて有効にする",
@@ -314,8 +306,6 @@
"filter": "フィルタ",
"findIssues": "問題を見つける",
"firstTimeUIMessage": "新しいUIを初めて使用しています。「メニュー > 新しいメニューを使用 > 無効」を選択することで古いUIに戻すことが可能です。",
"frontendNewer": "フロントエンドのバージョン {frontendVersion} はバックエンドのバージョン {backendVersion} と互換性がない可能性があります。",
"frontendOutdated": "フロントエンドのバージョン {frontendVersion} は古くなっています。バックエンドは {requiredVersion} 以上が必要です。",
"goToNode": "ノードに移動",
"help": "ヘルプ",
"icon": "アイコン",
@@ -397,14 +387,11 @@
"unknownError": "不明なエラー",
"update": "更新",
"updateAvailable": "更新が利用可能",
"updateFrontend": "フロントエンドを更新",
"updated": "更新済み",
"updating": "更新中",
"upload": "アップロード",
"usageHint": "使用ヒント",
"user": "ユーザー",
"versionMismatchWarning": "バージョン互換性の警告",
"versionMismatchWarningMessage": "{warning}: {detail} 更新手順については https://docs.comfy.org/installation/update_comfyui#common-update-issues をご覧ください。",
"videoFailedToLoad": "ビデオの読み込みに失敗しました",
"workflow": "ワークフロー"
},
@@ -414,7 +401,6 @@
"resetView": "ビューをリセット",
"selectMode": "選択モード",
"toggleLinkVisibility": "リンクの表示切り替え",
"toggleMinimap": "ミニマップの切り替え",
"zoomIn": "拡大",
"zoomOut": "縮小"
},
@@ -573,10 +559,6 @@
"applyingTexture": "テクスチャを適用中...",
"backgroundColor": "背景色",
"camera": "カメラ",
"cameraType": {
"orthographic": "オルソグラフィック",
"perspective": "パースペクティブ"
},
"clearRecording": "録画をクリア",
"edgeThreshold": "エッジ閾値",
"export": "エクスポート",
@@ -597,7 +579,6 @@
"wireframe": "ワイヤーフレーム"
},
"model": "モデル",
"openIn3DViewer": "3Dビューアで開く",
"previewOutput": "出力のプレビュー",
"removeBackgroundImage": "背景画像を削除",
"resizeNodeMatchOutput": "ノードを出力に合わせてリサイズ",
@@ -608,22 +589,8 @@
"switchCamera": "カメラを切り替える",
"switchingMaterialMode": "マテリアルモードの切り替え中...",
"upDirection": "上方向",
"upDirections": {
"original": "オリジナル"
},
"uploadBackgroundImage": "背景画像をアップロード",
"uploadTexture": "テクスチャをアップロード",
"viewer": {
"apply": "適用",
"cameraSettings": "カメラ設定",
"cameraType": "カメラタイプ",
"cancel": "キャンセル",
"exportSettings": "エクスポート設定",
"lightSettings": "ライト設定",
"modelSettings": "モデル設定",
"sceneSettings": "シーン設定",
"title": "3Dビューアベータ"
}
"uploadTexture": "テクスチャをアップロード"
},
"loadWorkflowWarning": {
"coreNodesFromVersion": "ComfyUI {version} が必要です:",
@@ -651,12 +618,15 @@
"title": "メンテナンス"
},
"manager": {
"applyChanges": "変更を適用",
"changingVersion": "バージョンを {from} から {to} に変更",
"clickToFinishSetup": "クリック",
"createdBy": "作成者",
"dependencies": "依存関係",
"discoverCommunityContent": "コミュニティが作成したノードパック、拡張機能などを探す...",
"downloads": "ダウンロード",
"errorConnecting": "Comfy Node Registryへの接続エラー。",
"extensionsSuccessfullyInstalled": "拡張機能のインストールが完了し、使用可能になりました!",
"failed": "失敗しました ({count})",
"filter": {
"disabled": "無効",
@@ -668,8 +638,12 @@
"installAllMissingNodes": "すべての不足しているノードをインストール",
"installSelected": "選択したものをインストール",
"installationQueue": "インストールキュー",
"installingDependencies": "依存関係をインストール中...",
"lastUpdated": "最終更新日",
"latestVersion": "最新",
"legacyManagerUI": "レガシーUIを使用する",
"legacyManagerUIDescription": "レガシーManager UIを使用するには、--enable-manager-legacy-uiを付けてComfyUIを起動してください",
"legacyMenuNotAvailable": "このバージョンのComfyUIでは、レガシーマネージャーメニューは利用できません。新しいマネージャーメニューを使用してください。",
"license": "ライセンス",
"loadingVersions": "バージョンを読み込んでいます...",
"nightlyVersion": "ナイトリー",
@@ -681,6 +655,7 @@
"packsSelected": "選択したパック",
"repository": "リポジトリ",
"restartToApplyChanges": "変更を適用するには、ComfyUIを再起動してください",
"restartingBackend": "変更を適用するためにバックエンドを再起動しています...",
"searchPlaceholder": "検索",
"selectVersion": "バージョンを選択",
"sort": {
@@ -698,6 +673,7 @@
"unknown": "不明"
},
"title": "カスタムノードマネージャ",
"toFinishSetup": "してセットアップを完了します",
"totalNodes": "合計ノード数",
"tryAgainLater": "後ほど再試行してください。",
"tryDifferentSearch": "別の検索クエリを試してみてください。",
@@ -739,28 +715,21 @@
"batchCountTooltip": "ワークフロー生成回数",
"clear": "ワークフローをクリア",
"clipspace": "クリップスペースを開く",
"dark": "ダーク",
"disabled": "無効",
"disabledTooltip": "ワークフローは自動的にキューに追加されません",
"execute": "実行",
"help": "ヘルプ",
"hideMenu": "メニューを隠す",
"instant": "即時",
"instantTooltip": "生成完了後すぐにキューに追加",
"interrupt": "現在の実行を中止",
"light": "ライト",
"manageExtensions": "拡張機能の管理",
"onChange": "変更時",
"onChangeTooltip": "変更が行われるとワークフローがキューに追加されます",
"queue": "キューパネル",
"refresh": "ノードを更新",
"resetView": "ビューをリセット",
"run": "実行する",
"runWorkflow": "ワークフローを実行する (Shiftで先頭にキュー)",
"runWorkflowFront": "ワークフローを実行する (先頭にキュー)",
"settings": "設定",
"showMenu": "メニューを表示",
"theme": "テーマ",
"toggleBottomPanel": "下部パネルを切り替え"
},
"menuLabels": {
@@ -768,8 +737,9 @@
"Bottom Panel": "下部パネル",
"Browse Templates": "テンプレートを参照",
"Bypass/Unbypass Selected Nodes": "選択したノードのバイパス/バイパス解除",
"Canvas Performance": "キャンバスパフォーマンス",
"Canvas Performance": "キャンバスパフォーマンス",
"Canvas Toggle Lock": "キャンバスのロックを切り替え",
"Check for Custom Node Updates": "カスタムノードのアップデートを確認",
"Check for Updates": "更新を確認する",
"Clear Pending Tasks": "保留中のタスクをクリア",
"Clear Workflow": "ワークフローをクリア",
@@ -783,6 +753,8 @@
"Contact Support": "サポートに連絡",
"Convert Selection to Subgraph": "選択範囲をサブグラフに変換",
"Convert selected nodes to group node": "選択したノードをグループノードに変換",
"Custom Nodes (Legacy)": "カスタムノード(レガシー)",
"Custom Nodes Manager": "カスタムノードマネージャ",
"Decrease Brush Size in MaskEditor": "マスクエディタでブラシサイズを小さくする",
"Delete Selected Items": "選択したアイテムを削除",
"Desktop User Guide": "デスクトップユーザーガイド",
@@ -799,10 +771,12 @@
"Help": "ヘルプ",
"Help Center": "ヘルプセンター",
"Increase Brush Size in MaskEditor": "マスクエディタでブラシサイズを大きくする",
"Install Missing Custom Nodes": "不足しているカスタムノードをインストール",
"Interrupt": "中断",
"Load Default Workflow": "デフォルトワークフローを読み込む",
"Manage group nodes": "グループノードを管理",
"Manager": "マネージャー",
"Manager Menu (Legacy)": "マネージャーメニュー(レガシー)",
"Minimap": "ミニマップ",
"Model Library": "モデルライブラリ",
"Move Selected Nodes Down": "選択したノードを下へ移動",
@@ -828,7 +802,6 @@
"Pin/Unpin Selected Items": "選択したアイテムのピン留め/ピン留め解除",
"Pin/Unpin Selected Nodes": "選択したノードのピン留め/ピン留め解除",
"Previous Opened Workflow": "前に開いたワークフロー",
"Queue Panel": "キューパネル",
"Queue Prompt": "キューのプロンプト",
"Queue Prompt (Front)": "キューのプロンプト (前面)",
"Queue Selected Output Nodes": "選択した出力ノードをキューに追加",
@@ -845,13 +818,12 @@
"Show Model Selector (Dev)": "モデルセレクターを表示(開発用)",
"Show Settings Dialog": "設定ダイアログを表示",
"Sign Out": "サインアウト",
"Toggle Essential Bottom Panel": "エッセンシャル下部パネルの切り替え",
"Toggle Logs Bottom Panel": "ログ下部パネルの切り替え",
"Toggle Search Box": "検索ボックスの切り替え",
"Toggle Terminal Bottom Panel": "ターミナル下部パネルの切り替え",
"Toggle Theme (Dark/Light)": "テーマを切り替え(ダーク/ライト)",
"Toggle View Controls Bottom Panel": "ビューコントロール下部パネルの切り替え",
"Toggle the Custom Nodes Manager": "カスタムノードマネージャーを切り替え",
"Toggle shortcuts_essentials Bottom Panel": "ショートカット(基本)下部パネルの切り替え",
"Toggle shortcuts_viewControls Bottom Panel": "ショートカット(ビューコントロール)下部パネルの切り替え",
"Toggle the Custom Nodes Manager Progress Bar": "カスタムノードマネージャーの進行状況バーを切り替え",
"Undo": "元に戻す",
"Ungroup selected group nodes": "選択したグループノードのグループ解除",
@@ -859,14 +831,8 @@
"Workflows": "ワークフロー",
"Zoom In": "ズームイン",
"Zoom Out": "ズームアウト",
"Zoom to fit": "全体表示にズーム"
},
"minimap": {
"nodeColors": "ノードの色",
"renderBypassState": "バイパス状態を表示",
"renderErrorState": "エラー状態を表示",
"showGroups": "フレーム/グループを表示",
"showLinks": "リンクを表示"
"Zoom to fit": "全体表示にズーム",
"sideToolbar_queue": "キュー"
},
"missingModelsDialog": {
"doNotAskAgain": "再度表示しない",
@@ -1186,31 +1152,10 @@
"Window": "ウィンドウ",
"Workflow": "ワークフロー"
},
"shortcuts": {
"essentials": "基本",
"keyboardShortcuts": "キーボードショートカット",
"manageShortcuts": "ショートカットの管理",
"noKeybinding": "キー割り当てなし",
"subcategories": {
"node": "ノード",
"panelControls": "パネルコントロール",
"queue": "キュー",
"view": "ビュー",
"workflow": "ワークフロー"
},
"viewControls": "表示コントロール"
},
"sideToolbar": {
"browseTemplates": "サンプルテンプレートを表示",
"downloads": "ダウンロード",
"helpCenter": "ヘルプセンター",
"labels": {
"models": "モデル",
"nodes": "ノード",
"queue": "キュー",
"templates": "テンプレート",
"workflows": "ワークフロー"
},
"logout": "ログアウト",
"modelLibrary": "モデルライブラリ",
"newBlankWorkflow": "新しい空のワークフローを作成",
@@ -1248,7 +1193,7 @@
},
"showFlatList": "フラットリストを表示"
},
"templates": "テンプレート",
"themeToggle": "テーマの切り替え",
"workflowTab": {
"confirmDelete": "このワークフローを削除してもよろしいですか?",
"confirmDeleteTitle": "ワークフローを削除しますか?",
@@ -1295,8 +1240,6 @@
"Video": "ビデオ",
"Video API": "動画API"
},
"loadingMore": "さらにテンプレートを読み込み中...",
"searchPlaceholder": "テンプレートを検索...",
"template": {
"3D": {
"3d_hunyuan3d_image_to_model": "Hunyuan3D",
@@ -1619,7 +1562,6 @@
"failedToExportModel": "{format}としてモデルのエクスポートに失敗しました",
"failedToFetchBalance": "残高の取得に失敗しました: {error}",
"failedToFetchLogs": "サーバーログの取得に失敗しました",
"failedToInitializeLoad3dViewer": "3Dビューアの初期化に失敗しました",
"failedToInitiateCreditPurchase": "クレジット購入の開始に失敗しました: {error}",
"failedToPurchaseCredits": "クレジットの購入に失敗しました: {error}",
"fileLoadError": "{fileName}でワークフローが見つかりません",
@@ -1675,13 +1617,6 @@
"prefix": "{prefix}で始める必要があります",
"required": "必須"
},
"versionMismatchWarning": {
"dismiss": "閉じる",
"frontendNewer": "フロントエンドのバージョン {frontendVersion} は、バックエンドのバージョン {backendVersion} と互換性がない可能性があります。",
"frontendOutdated": "フロントエンドのバージョン {frontendVersion} は古くなっています。バックエンドはバージョン {requiredVersion} 以上が必要です。",
"title": "バージョン互換性の警告",
"updateFrontend": "フロントエンドを更新"
},
"welcome": {
"getStarted": "はじめる",
"title": "ComfyUIへようこそ"

View File

@@ -164,8 +164,20 @@
"Comfy_LoadDefaultWorkflow": {
"label": "기본 워크플로 로드"
},
"Comfy_Manager_CustomNodesManager": {
"label": "사용자 정의 노드 관리자"
"Comfy_Manager_CustomNodesManager_ShowCustomNodesMenu": {
"label": "사용자 정의 노드 (베타)"
},
"Comfy_Manager_CustomNodesManager_ShowLegacyCustomNodesMenu": {
"label": "커스텀 노드 (레거시)"
},
"Comfy_Manager_ShowLegacyManagerMenu": {
"label": "매니저 메뉴 (레거시)"
},
"Comfy_Manager_ShowMissingPacks": {
"label": "누락된 팩 설치"
},
"Comfy_Manager_ShowUpdateAvailablePacks": {
"label": "업데이트 확인"
},
"Comfy_Manager_ToggleManagerProgressDialog": {
"label": "진행 상황 대화 상자 전환"

View File

@@ -82,12 +82,6 @@
"title": "계정 생성"
}
},
"breadcrumbsMenu": {
"clearWorkflow": "워크플로 내용 지우기",
"deleteWorkflow": "워크플로 삭제",
"duplicate": "복제",
"enterNewName": "새 이름 입력"
},
"chatHistory": {
"cancelEdit": "취소",
"cancelEditTooltip": "편집 취소",
@@ -273,11 +267,11 @@
"choose_file_to_upload": "업로드할 파일 선택",
"clear": "지우기",
"clearAll": "모두 지우기",
"clearFilters": "필터 지우기",
"close": "닫기",
"color": "색상",
"comingSoon": "곧 출시 예정",
"command": "명령",
"commandProhibited": "명령 {command}은 금지되었습니다. 자세한 정보는 관리자에게 문의하십시오.",
"community": "커뮤니티",
"completed": "완료됨",
"confirm": "확인",
@@ -298,9 +292,7 @@
"devices": "장치",
"disableAll": "모두 비활성화",
"disabling": "비활성화 중",
"dismiss": "닫기",
"download": "다운로드",
"duplicate": "복제",
"edit": "편집",
"empty": "비어 있음",
"enableAll": "모두 활성화",
@@ -314,8 +306,6 @@
"filter": "필터",
"findIssues": "문제 찾기",
"firstTimeUIMessage": "새 UI를 처음 사용합니다. \"메뉴 > 새 메뉴 사용 > 비활성화\"를 선택하여 이전 UI로 복원하세요.",
"frontendNewer": "프론트엔드 버전 {frontendVersion}이(가) 백엔드 버전 {backendVersion}과(와) 호환되지 않을 수 있습니다.",
"frontendOutdated": "프론트엔드 버전 {frontendVersion}이(가) 오래되었습니다. 백엔드는 {requiredVersion} 이상이 필요합니다.",
"goToNode": "노드로 이동",
"help": "도움말",
"icon": "아이콘",
@@ -397,14 +387,11 @@
"unknownError": "알 수 없는 오류",
"update": "업데이트",
"updateAvailable": "업데이트 가능",
"updateFrontend": "프론트엔드 업데이트",
"updated": "업데이트 됨",
"updating": "업데이트 중",
"upload": "업로드",
"usageHint": "사용 힌트",
"user": "사용자",
"versionMismatchWarning": "버전 호환성 경고",
"versionMismatchWarningMessage": "{warning}: {detail} 업데이트 지침은 https://docs.comfy.org/installation/update_comfyui#common-update-issues 를 방문하세요.",
"videoFailedToLoad": "비디오를 로드하지 못했습니다.",
"workflow": "워크플로"
},
@@ -414,7 +401,6 @@
"resetView": "보기 재설정",
"selectMode": "선택 모드",
"toggleLinkVisibility": "링크 가시성 전환",
"toggleMinimap": "미니맵 전환",
"zoomIn": "확대",
"zoomOut": "축소"
},
@@ -573,10 +559,6 @@
"applyingTexture": "텍스처 적용 중...",
"backgroundColor": "배경색",
"camera": "카메라",
"cameraType": {
"orthographic": "직교",
"perspective": "원근"
},
"clearRecording": "녹화 지우기",
"edgeThreshold": "엣지 임계값",
"export": "내보내기",
@@ -597,7 +579,6 @@
"wireframe": "와이어프레임"
},
"model": "모델",
"openIn3DViewer": "3D 뷰어에서 열기",
"previewOutput": "출력 미리보기",
"removeBackgroundImage": "배경 이미지 제거",
"resizeNodeMatchOutput": "노드 크기를 출력에 맞추기",
@@ -608,22 +589,8 @@
"switchCamera": "카메라 전환",
"switchingMaterialMode": "재질 모드 전환 중...",
"upDirection": "위 방향",
"upDirections": {
"original": "원본"
},
"uploadBackgroundImage": "배경 이미지 업로드",
"uploadTexture": "텍스처 업로드",
"viewer": {
"apply": "적용",
"cameraSettings": "카메라 설정",
"cameraType": "카메라 유형",
"cancel": "취소",
"exportSettings": "내보내기 설정",
"lightSettings": "조명 설정",
"modelSettings": "모델 설정",
"sceneSettings": "씬 설정",
"title": "3D 뷰어 (베타)"
}
"uploadTexture": "텍스처 업로드"
},
"loadWorkflowWarning": {
"coreNodesFromVersion": "ComfyUI {version} 이상 필요:",
@@ -651,12 +618,15 @@
"title": "유지 보수"
},
"manager": {
"applyChanges": "변경 사항 적용",
"changingVersion": "{from}에서 {to}(으)로 버전 변경 중",
"clickToFinishSetup": "클릭",
"createdBy": "작성자",
"dependencies": "의존성",
"discoverCommunityContent": "커뮤니티에서 만든 노드 팩 및 확장 프로그램을 찾아보세요...",
"downloads": "다운로드",
"errorConnecting": "Comfy Node Registry에 연결하는 중 오류가 발생했습니다.",
"extensionsSuccessfullyInstalled": "확장 프로그램이 성공적으로 설치되어 사용할 준비가 되었습니다!",
"failed": "실패 ({count})",
"filter": {
"disabled": "비활성화",
@@ -668,8 +638,12 @@
"installAllMissingNodes": "모든 누락된 노드 설치",
"installSelected": "선택한 항목 설치",
"installationQueue": "설치 대기열",
"installingDependencies": "종속성 설치 중...",
"lastUpdated": "마지막 업데이트",
"latestVersion": "최신",
"legacyManagerUI": "레거시 UI 사용",
"legacyManagerUIDescription": "레거시 매니저 UI를 사용하려면, ComfyUI를 --enable-manager-legacy-ui로 시작하세요",
"legacyMenuNotAvailable": "이 버전의 ComfyUI에서는 레거시 매니저 메뉴를 사용할 수 없습니다. 대신 새로운 매니저 메뉴를 사용하십시오.",
"license": "라이선스",
"loadingVersions": "버전 로딩 중...",
"nightlyVersion": "최신 테스트 버전(nightly)",
@@ -681,6 +655,7 @@
"packsSelected": "선택한 노드 팩",
"repository": "저장소",
"restartToApplyChanges": "변경 사항을 적용하려면 ComfyUI를 재시작해 주세요",
"restartingBackend": "변경 사항을 적용하기 위해 백엔드를 재시작하는 중...",
"searchPlaceholder": "검색",
"selectVersion": "버전 선택",
"sort": {
@@ -698,6 +673,7 @@
"unknown": "알 수 없음"
},
"title": "사용자 정의 노드 관리자",
"toFinishSetup": "설정을 완료하려면",
"totalNodes": "총 노드",
"tryAgainLater": "나중에 다시 시도해 주세요.",
"tryDifferentSearch": "다른 검색어를 시도해 주세요.",
@@ -739,28 +715,21 @@
"batchCountTooltip": "워크플로 작업을 실행 대기열에 반복 추가할 횟수",
"clear": "워크플로 비우기",
"clipspace": "클립스페이스 열기",
"dark": "다크",
"disabled": "비활성화됨",
"disabledTooltip": "워크플로 작업을 자동으로 실행 대기열에 추가하지 않습니다.",
"execute": "실행",
"help": "도움말",
"hideMenu": "메뉴 숨기기",
"instant": "즉시",
"instantTooltip": "워크플로 실행이 완료되면 즉시 실행 대기열에 추가합니다.",
"interrupt": "현재 실행 취소",
"light": "라이트",
"manageExtensions": "확장 프로그램 관리",
"onChange": "변경 시",
"onChangeTooltip": "변경이 있는 경우에만 워크플로를 실행 대기열에 추가합니다.",
"queue": "대기열 패널",
"refresh": "노드 정의 새로 고침",
"resetView": "캔버스 보기 재설정",
"run": "실행",
"runWorkflow": "워크플로 실행 (시프트 키와 함께 클릭시 가장 먼저 실행)",
"runWorkflowFront": "워크플로 실행 (가장 먼저 실행)",
"settings": "설정",
"showMenu": "메뉴 표시",
"theme": "테마",
"toggleBottomPanel": "하단 패널 전환"
},
"menuLabels": {
@@ -770,6 +739,7 @@
"Bypass/Unbypass Selected Nodes": "선택한 노드 우회/우회 해제",
"Canvas Performance": "캔버스 성능",
"Canvas Toggle Lock": "캔버스 토글 잠금",
"Check for Custom Node Updates": "커스텀 노드 업데이트 확인",
"Check for Updates": "업데이트 확인",
"Clear Pending Tasks": "보류 중인 작업 제거하기",
"Clear Workflow": "워크플로 지우기",
@@ -783,12 +753,14 @@
"Contact Support": "고객 지원 문의",
"Convert Selection to Subgraph": "선택 영역을 서브그래프로 변환",
"Convert selected nodes to group node": "선택한 노드를 그룹 노드로 변환",
"Custom Nodes (Legacy)": "커스텀 노드(레거시)",
"Custom Nodes Manager": "사용자 정의 노드 관리자",
"Decrease Brush Size in MaskEditor": "마스크 편집기에서 브러시 크기 줄이기",
"Delete Selected Items": "선택한 항목 삭제",
"Desktop User Guide": "데스크톱 사용자 가이드",
"Duplicate Current Workflow": "현재 워크플로 복제",
"Edit": "편집",
"Exit Subgraph": "서브그래프 종료",
"Exit Subgraph": "서브그래프 나가기",
"Export": "내보내기",
"Export (API)": "내보내기 (API)",
"File": "파일",
@@ -799,10 +771,12 @@
"Help": "도움말",
"Help Center": "도움말 센터",
"Increase Brush Size in MaskEditor": "마스크 편집기에서 브러시 크기 늘리기",
"Install Missing Custom Nodes": "누락된 커스텀 노드 설치",
"Interrupt": "중단",
"Load Default Workflow": "기본 워크플로 불러오기",
"Manage group nodes": "그룹 노드 관리",
"Manager": "매니저",
"Manager Menu (Legacy)": "매니저 메뉴(레거시)",
"Minimap": "미니맵",
"Model Library": "모델 라이브러리",
"Move Selected Nodes Down": "선택한 노드 아래로 이동",
@@ -813,7 +787,7 @@
"New": "새로 만들기",
"Next Opened Workflow": "다음 열린 워크플로",
"Node Library": "노드 라이브러리",
"Node Links": "노드 링크",
"Node Links": "노드 연결",
"Open": "열기",
"Open 3D Viewer (Beta) for Selected Node": "선택한 노드에 대해 3D 뷰어(베타) 열기",
"Open Custom Nodes Folder": "사용자 정의 노드 폴더 열기",
@@ -828,7 +802,6 @@
"Pin/Unpin Selected Items": "선택한 항목 고정/고정 해제",
"Pin/Unpin Selected Nodes": "선택한 노드 고정/고정 해제",
"Previous Opened Workflow": "이전 열린 워크플로",
"Queue Panel": "대기열 패널",
"Queue Prompt": "실행 대기열에 프롬프트 추가",
"Queue Prompt (Front)": "실행 대기열 맨 앞에 프롬프트 추가",
"Queue Selected Output Nodes": "선택한 출력 노드 대기열에 추가",
@@ -845,13 +818,12 @@
"Show Model Selector (Dev)": "모델 선택기 표시 (개발자용)",
"Show Settings Dialog": "설정 대화상자 표시",
"Sign Out": "로그아웃",
"Toggle Essential Bottom Panel": "필수 하단 패널 전환",
"Toggle Logs Bottom Panel": "로그 하단 패널 전환",
"Toggle Search Box": "검색 상자 전환",
"Toggle Terminal Bottom Panel": "터미널 하단 패널 전환",
"Toggle Theme (Dark/Light)": "테마 전환 (어두운/밝은)",
"Toggle View Controls Bottom Panel": "뷰 컨트롤 하단 패널 전환",
"Toggle the Custom Nodes Manager": "커스텀 노드 매니저 전환",
"Toggle shortcuts_essentials Bottom Panel": "단축키_기본 하단 패널 전환",
"Toggle shortcuts_viewControls Bottom Panel": "단축키_뷰 컨트롤 하단 패널 전환",
"Toggle the Custom Nodes Manager Progress Bar": "커스텀 노드 매니저 진행률 표시줄 전환",
"Undo": "실행 취소",
"Ungroup selected group nodes": "선택한 그룹 노드 그룹 해제",
@@ -859,14 +831,8 @@
"Workflows": "워크플로우",
"Zoom In": "확대",
"Zoom Out": "축소",
"Zoom to fit": "화면에 맞추기"
},
"minimap": {
"nodeColors": "노드 색상",
"renderBypassState": "바이패스 상태 렌더링",
"renderErrorState": "에러 상태 렌더링",
"showGroups": "프레임/그룹 표시",
"showLinks": "링크 표시"
"Zoom to fit": "화면에 맞게 확대/축소",
"sideToolbar_queue": "대기열"
},
"missingModelsDialog": {
"doNotAskAgain": "다시 보지 않기",
@@ -1134,7 +1100,7 @@
},
"settingsCategories": {
"3D": "3D",
"3DViewer": "3D뷰어",
"3DViewer": "3D 뷰어",
"API Nodes": "API 노드",
"About": "정보",
"Appearance": "모양",
@@ -1186,31 +1152,10 @@
"Window": "창",
"Workflow": "워크플로"
},
"shortcuts": {
"essentials": "필수",
"keyboardShortcuts": "키보드 단축키",
"manageShortcuts": "단축키 관리",
"noKeybinding": "단축키 없음",
"subcategories": {
"node": "노드",
"panelControls": "패널 컨트롤",
"queue": "대기열",
"view": "보기",
"workflow": "워크플로우"
},
"viewControls": "보기 컨트롤"
},
"sideToolbar": {
"browseTemplates": "예제 템플릿 탐색",
"downloads": "다운로드",
"helpCenter": "도움말 센터",
"labels": {
"models": "모델",
"nodes": "노드",
"queue": "대기열",
"templates": "템플릿",
"workflows": "워크플로우"
},
"logout": "로그아웃",
"modelLibrary": "모델 라이브러리",
"newBlankWorkflow": "새 빈 워크플로 만들기",
@@ -1248,7 +1193,7 @@
},
"showFlatList": "평면 목록 표시"
},
"templates": "템플릿",
"themeToggle": "테마 전환",
"workflowTab": {
"confirmDelete": "정말로 이 워크플로를 삭제하시겠습니까?",
"confirmDeleteTitle": "워크플로 삭제",
@@ -1295,8 +1240,6 @@
"Video": "비디오",
"Video API": "비디오 API"
},
"loadingMore": "템플릿을 더 불러오는 중...",
"searchPlaceholder": "템플릿 검색...",
"template": {
"3D": {
"3d_hunyuan3d_image_to_model": "Hunyuan3D 2.0",
@@ -1619,7 +1562,6 @@
"failedToExportModel": "{format} 형식으로 모델 내보내기에 실패했습니다",
"failedToFetchBalance": "잔액을 가져오지 못했습니다: {error}",
"failedToFetchLogs": "서버 로그를 가져오는 데 실패했습니다",
"failedToInitializeLoad3dViewer": "3D 뷰어 초기화에 실패했습니다",
"failedToInitiateCreditPurchase": "크레딧 구매를 시작하지 못했습니다: {error}",
"failedToPurchaseCredits": "크레딧 구매에 실패했습니다: {error}",
"fileLoadError": "{fileName}에서 워크플로를 찾을 수 없습니다",
@@ -1675,13 +1617,6 @@
"prefix": "{prefix}(으)로 시작해야 합니다",
"required": "필수"
},
"versionMismatchWarning": {
"dismiss": "닫기",
"frontendNewer": "프론트엔드 버전 {frontendVersion}이(가) 백엔드 버전 {backendVersion}과(와) 호환되지 않을 수 있습니다.",
"frontendOutdated": "프론트엔드 버전 {frontendVersion}이(가) 오래되었습니다. 백엔드는 {requiredVersion} 이상 버전을 필요로 합니다.",
"title": "버전 호환성 경고",
"updateFrontend": "프론트엔드 업데이트"
},
"welcome": {
"getStarted": "시작하기",
"title": "ComfyUI에 오신 것을 환영합니다"

View File

@@ -164,8 +164,20 @@
"Comfy_LoadDefaultWorkflow": {
"label": "Загрузить стандартный рабочий процесс"
},
"Comfy_Manager_CustomNodesManager": {
"label": "Менеджер Пользовательских Узлов"
"Comfy_Manager_CustomNodesManager_ShowCustomNodesMenu": {
"label": "Пользовательские узлы (Бета)"
},
"Comfy_Manager_CustomNodesManager_ShowLegacyCustomNodesMenu": {
"label": "Пользовательские узлы (устаревшие)"
},
"Comfy_Manager_ShowLegacyManagerMenu": {
"label": "Меню менеджера (устаревшее)"
},
"Comfy_Manager_ShowMissingPacks": {
"label": "Установить отсутствующие"
},
"Comfy_Manager_ShowUpdateAvailablePacks": {
"label": "Проверить наличие обновлений"
},
"Comfy_Manager_ToggleManagerProgressDialog": {
"label": "Переключить диалоговое окно прогресса"

View File

@@ -82,12 +82,6 @@
"title": "Создать аккаунт"
}
},
"breadcrumbsMenu": {
"clearWorkflow": "Очистить рабочий процесс",
"deleteWorkflow": "Удалить рабочий процесс",
"duplicate": "Дублировать",
"enterNewName": "Введите новое имя"
},
"chatHistory": {
"cancelEdit": "Отмена",
"cancelEditTooltip": "Отменить редактирование",
@@ -273,11 +267,11 @@
"choose_file_to_upload": "выберите файл для загрузки",
"clear": "Очистить",
"clearAll": "Очистить всё",
"clearFilters": "Сбросить фильтры",
"close": "Закрыть",
"color": "Цвет",
"comingSoon": "Скоро будет",
"command": "Команда",
"commandProhibited": "Команда {command} запрещена. Свяжитесь с администратором для получения дополнительной информации.",
"community": "Сообщество",
"completed": "Завершено",
"confirm": "Подтвердить",
@@ -298,9 +292,7 @@
"devices": "Устройства",
"disableAll": "Отключить все",
"disabling": "Отключение",
"dismiss": "Закрыть",
"download": "Скачать",
"duplicate": "Дублировать",
"edit": "Редактировать",
"empty": "Пусто",
"enableAll": "Включить все",
@@ -314,8 +306,6 @@
"filter": "Фильтр",
"findIssues": "Найти проблемы",
"firstTimeUIMessage": "Вы впервые используете новый интерфейс. Выберите \"Меню > Использовать новое меню > Отключено\", чтобы восстановить старый интерфейс.",
"frontendNewer": "Версия интерфейса {frontendVersion} может быть несовместима с версией сервера {backendVersion}.",
"frontendOutdated": "Версия интерфейса {frontendVersion} устарела. Требуется версия не ниже {requiredVersion} для работы с сервером.",
"goToNode": "Перейти к ноде",
"help": "Помощь",
"icon": "Иконка",
@@ -397,14 +387,11 @@
"unknownError": "Неизвестная ошибка",
"update": "Обновить",
"updateAvailable": "Доступно обновление",
"updateFrontend": "Обновить интерфейс",
"updated": "Обновлено",
"updating": "Обновление",
"upload": "Загрузить",
"usageHint": "Подсказка по использованию",
"user": "Пользователь",
"versionMismatchWarning": "Предупреждение о несовместимости версий",
"versionMismatchWarningMessage": "{warning}: {detail} Посетите https://docs.comfy.org/installation/update_comfyui#common-update-issues для инструкций по обновлению.",
"videoFailedToLoad": "Не удалось загрузить видео",
"workflow": "Рабочий процесс"
},
@@ -414,7 +401,6 @@
"resetView": "Сбросить вид",
"selectMode": "Выбрать режим",
"toggleLinkVisibility": "Переключить видимость ссылок",
"toggleMinimap": "Показать/скрыть миникарту",
"zoomIn": "Увеличить",
"zoomOut": "Уменьшить"
},
@@ -573,10 +559,6 @@
"applyingTexture": "Применение текстуры...",
"backgroundColor": "Цвет фона",
"camera": "Камера",
"cameraType": {
"orthographic": "Ортографическая",
"perspective": "Перспективная"
},
"clearRecording": "Очистить запись",
"edgeThreshold": "Пороговое значение края",
"export": "Экспорт",
@@ -597,7 +579,6 @@
"wireframe": "Каркас"
},
"model": "Модель",
"openIn3DViewer": "Открыть в 3D просмотрщике",
"previewOutput": "Предварительный просмотр",
"removeBackgroundImage": "Удалить фоновое изображение",
"resizeNodeMatchOutput": "Изменить размер узла под вывод",
@@ -608,22 +589,8 @@
"switchCamera": "Переключить камеру",
"switchingMaterialMode": "Переключение режима материала...",
"upDirection": "Направление Вверх",
"upDirections": {
"original": "Оригинал"
},
"uploadBackgroundImage": "Загрузить фоновое изображение",
"uploadTexture": "Загрузить текстуру",
"viewer": {
"apply": "Применить",
"cameraSettings": "Настройки камеры",
"cameraType": "Тип камеры",
"cancel": "Отмена",
"exportSettings": "Настройки экспорта",
"lightSettings": "Настройки освещения",
"modelSettings": "Настройки модели",
"sceneSettings": "Настройки сцены",
"title": "3D Просмотрщик (Бета)"
}
"uploadTexture": "Загрузить текстуру"
},
"loadWorkflowWarning": {
"coreNodesFromVersion": "Требуется ComfyUI {version}:",
@@ -651,12 +618,15 @@
"title": "Обслуживание"
},
"manager": {
"applyChanges": "Применить изменения",
"changingVersion": "Изменение версии с {from} на {to}",
"clickToFinishSetup": "Нажмите",
"createdBy": "Создано",
"dependencies": "Зависимости",
"discoverCommunityContent": "Откройте для себя пакеты узлов, расширения и многое другое, созданные сообществом...",
"downloads": "Загрузки",
"errorConnecting": "Ошибка подключения к реестру Comfy Node.",
"extensionsSuccessfullyInstalled": "Расширение(я) успешно установлены и готовы к использованию!",
"failed": "Не удалось ({count})",
"filter": {
"disabled": "Отключено",
@@ -668,8 +638,12 @@
"installAllMissingNodes": "Установить все отсутствующие узлы",
"installSelected": "Установить выбранное",
"installationQueue": "Очередь установки",
"installingDependencies": "Установка зависимостей...",
"lastUpdated": "Последнее обновление",
"latestVersion": "Последняя",
"legacyManagerUI": "Использовать устаревший UI",
"legacyManagerUIDescription": "Чтобы использовать устаревший UI менеджера, запустите ComfyUI с --enable-manager-legacy-ui",
"legacyMenuNotAvailable": "Устаревшее меню менеджера недоступно в этой версии ComfyUI. Пожалуйста, используйте новое меню менеджера.",
"license": "Лицензия",
"loadingVersions": "Загрузка версий...",
"nightlyVersion": "Ночная",
@@ -681,6 +655,7 @@
"packsSelected": "Выбрано пакетов",
"repository": "Репозиторий",
"restartToApplyChanges": "Чтобы применить изменения, пожалуйста, перезапустите ComfyUI",
"restartingBackend": "Перезапуск бэкенда для применения изменений...",
"searchPlaceholder": "Поиск",
"selectVersion": "Выберите версию",
"sort": {
@@ -698,6 +673,7 @@
"unknown": "Неизвестно"
},
"title": "Менеджер Пользовательских Узлов",
"toFinishSetup": "чтобы завершить настройку",
"totalNodes": "Всего Узлов",
"tryAgainLater": "Пожалуйста, попробуйте позже.",
"tryDifferentSearch": "Пожалуйста, попробуйте изменить запрос.",
@@ -739,28 +715,21 @@
"batchCountTooltip": "Количество раз, когда генерация рабочего процесса должна быть помещена в очередь",
"clear": "Очистить рабочий процесс",
"clipspace": "Открыть Clipspace",
"dark": "Тёмная",
"disabled": "Отключено",
"disabledTooltip": "Рабочий процесс не будет автоматически помещён в очередь",
"execute": "Выполнить",
"help": "Справка",
"hideMenu": "Скрыть меню",
"instant": "Мгновенно",
"instantTooltip": "Рабочий процесс будет помещён в очередь сразу же после завершения генерации",
"interrupt": "Отменить текущее выполнение",
"light": "Светлая",
"manageExtensions": "Управление расширениями",
"onChange": "При изменении",
"onChangeTooltip": "Рабочий процесс будет поставлен в очередь после внесения изменений",
"queue": "Панель очереди",
"refresh": "Обновить определения нод",
"resetView": "Сбросить вид холста",
"run": "Запустить",
"runWorkflow": "Запустить рабочий процесс (Shift для очереди в начале)",
"runWorkflowFront": "Запустить рабочий процесс (Очередь в начале)",
"settings": "Настройки",
"showMenu": "Показать меню",
"theme": "Тема",
"toggleBottomPanel": "Переключить нижнюю панель"
},
"menuLabels": {
@@ -770,6 +739,7 @@
"Bypass/Unbypass Selected Nodes": "Обойти/восстановить выбранные ноды",
"Canvas Performance": "Производительность холста",
"Canvas Toggle Lock": "Переключение блокировки холста",
"Check for Custom Node Updates": "Проверить обновления пользовательских узлов",
"Check for Updates": "Проверить наличие обновлений",
"Clear Pending Tasks": "Очистить ожидающие задачи",
"Clear Workflow": "Очистить рабочий процесс",
@@ -783,6 +753,8 @@
"Contact Support": "Связаться с поддержкой",
"Convert Selection to Subgraph": "Преобразовать выделенное в подграф",
"Convert selected nodes to group node": "Преобразовать выбранные ноды в групповую ноду",
"Custom Nodes (Legacy)": "Пользовательские узлы (устаревшие)",
"Custom Nodes Manager": "Менеджер Пользовательских Узлов",
"Decrease Brush Size in MaskEditor": "Уменьшить размер кисти в MaskEditor",
"Delete Selected Items": "Удалить выбранные элементы",
"Desktop User Guide": "Руководство пользователя для настольных ПК",
@@ -793,16 +765,18 @@
"Export (API)": "Экспорт (API)",
"File": "Файл",
"Fit Group To Contents": "Подогнать группу под содержимое",
"Focus Mode": "Режим фокуса",
"Focus Mode": "Режим фокусировки",
"Give Feedback": "Оставить отзыв",
"Group Selected Nodes": "Сгруппировать выбранные ноды",
"Help": "Помощь",
"Help Center": "Центр поддержки",
"Help Center": "Центр помощи",
"Increase Brush Size in MaskEditor": "Увеличить размер кисти в MaskEditor",
"Install Missing Custom Nodes": "Установить отсутствующие пользовательские узлы",
"Interrupt": "Прервать",
"Load Default Workflow": "Загрузить стандартный рабочий процесс",
"Manage group nodes": "Управление групповыми нодами",
"Manager": "Менеджер",
"Manager Menu (Legacy)": "Меню управления (устаревшее)",
"Minimap": "Мини-карта",
"Model Library": "Библиотека моделей",
"Move Selected Nodes Down": "Переместить выбранные узлы вниз",
@@ -828,7 +802,6 @@
"Pin/Unpin Selected Items": "Закрепить/открепить выбранные элементы",
"Pin/Unpin Selected Nodes": "Закрепить/открепить выбранные ноды",
"Previous Opened Workflow": "Предыдущий открытый рабочий процесс",
"Queue Panel": "Панель очереди",
"Queue Prompt": "Запрос в очереди",
"Queue Prompt (Front)": "Запрос в очереди (спереди)",
"Queue Selected Output Nodes": "Добавить выбранные выходные узлы в очередь",
@@ -845,13 +818,12 @@
"Show Model Selector (Dev)": "Показать выбор модели (Dev)",
"Show Settings Dialog": "Показать диалог настроек",
"Sign Out": "Выйти",
"Toggle Essential Bottom Panel": "Показать/скрыть нижнюю панель основных элементов",
"Toggle Logs Bottom Panel": "Показать/скрыть нижнюю панель логов",
"Toggle Search Box": "Переключить поисковую панель",
"Toggle Terminal Bottom Panel": "Показать/скрыть нижнюю панель терминала",
"Toggle Theme (Dark/Light)": "Переключение темы (Тёмная/Светлая)",
"Toggle View Controls Bottom Panel": "Показать/скрыть нижнюю панель элементов управления",
"Toggle the Custom Nodes Manager": "Переключить менеджер пользовательских узлов",
"Toggle shortcuts_essentials Bottom Panel": "Показать/скрыть нижнюю панель shortcuts.essentials",
"Toggle shortcuts_viewControls Bottom Panel": "Показать/скрыть нижнюю панель shortcuts.viewControls",
"Toggle the Custom Nodes Manager Progress Bar": "Переключить индикатор выполнения менеджера пользовательских узлов",
"Undo": "Отменить",
"Ungroup selected group nodes": "Разгруппировать выбранные групповые ноды",
@@ -859,14 +831,8 @@
"Workflows": "Рабочие процессы",
"Zoom In": "Увеличить",
"Zoom Out": "Уменьшить",
"Zoom to fit": "Масштабировать по размеру"
},
"minimap": {
"nodeColors": "Цвета узлов",
"renderBypassState": "Отображать состояние обхода",
"renderErrorState": "Отображать состояние ошибки",
"showGroups": "Показать фреймы/группы",
"showLinks": "Показать связи"
"Zoom to fit": "Масштабировать по размеру",
"sideToolbar_queue": "Очередь"
},
"missingModelsDialog": {
"doNotAskAgain": "Больше не показывать это",
@@ -1134,7 +1100,7 @@
},
"settingsCategories": {
"3D": "3D",
"3DViewer": "3D-просмотрщик",
"3DViewer": "3D просмотрщик",
"API Nodes": "API-узлы",
"About": "О программе",
"Appearance": "Внешний вид",
@@ -1186,31 +1152,10 @@
"Window": "Окно",
"Workflow": "Рабочий процесс"
},
"shortcuts": {
"essentials": "Основные",
"keyboardShortcuts": "Горячие клавиши",
"manageShortcuts": "Управление горячими клавишами",
"noKeybinding": "Нет сочетания клавиш",
"subcategories": {
"node": "Узел",
"panelControls": "Управление панелью",
"queue": "Очередь",
"view": "Просмотр",
"workflow": "Рабочий процесс"
},
"viewControls": "Управление просмотром"
},
"sideToolbar": {
"browseTemplates": "Просмотреть примеры шаблонов",
"downloads": "Загрузки",
"helpCenter": "Центр поддержки",
"labels": {
"models": "Модели",
"nodes": "Узлы",
"queue": "Очередь",
"templates": "Шаблоны",
"workflows": "Воркфлоу"
},
"logout": "Выйти",
"modelLibrary": "Библиотека моделей",
"newBlankWorkflow": "Создайте новый пустой рабочий процесс",
@@ -1248,7 +1193,7 @@
},
"showFlatList": "Показать плоский список"
},
"templates": "Шаблоны",
"themeToggle": "Переключить тему",
"workflowTab": {
"confirmDelete": "Вы уверены, что хотите удалить этот рабочий процесс?",
"confirmDeleteTitle": "Удалить рабочий процесс?",
@@ -1295,8 +1240,6 @@
"Video": "Видео",
"Video API": "Video API"
},
"loadingMore": "Загрузка дополнительных шаблонов...",
"searchPlaceholder": "Поиск шаблонов...",
"template": {
"3D": {
"3d_hunyuan3d_image_to_model": "Hunyuan3D",
@@ -1619,7 +1562,6 @@
"failedToExportModel": "Не удалось экспортировать модель как {format}",
"failedToFetchBalance": "Не удалось получить баланс: {error}",
"failedToFetchLogs": "Не удалось получить серверные логи",
"failedToInitializeLoad3dViewer": "Не удалось инициализировать 3D просмотрщик",
"failedToInitiateCreditPurchase": "Не удалось начать покупку кредитов: {error}",
"failedToPurchaseCredits": "Не удалось купить кредиты: {error}",
"fileLoadError": "Не удалось найти рабочий процесс в {fileName}",
@@ -1675,13 +1617,6 @@
"prefix": "Должно начинаться с {prefix}",
"required": "Обязательно"
},
"versionMismatchWarning": {
"dismiss": "Закрыть",
"frontendNewer": "Версия интерфейса {frontendVersion} может быть несовместима с версией сервера {backendVersion}.",
"frontendOutdated": "Версия интерфейса {frontendVersion} устарела. Для работы с сервером требуется версия {requiredVersion} или новее.",
"title": "Предупреждение о несовместимости версий",
"updateFrontend": "Обновить интерфейс"
},
"welcome": {
"getStarted": "Начать",
"title": "Добро пожаловать в ComfyUI"

View File

@@ -164,8 +164,20 @@
"Comfy_LoadDefaultWorkflow": {
"label": "載入預設工作流程"
},
"Comfy_Manager_CustomNodesManager": {
"label": "切換自訂節點管理器"
"Comfy_Manager_CustomNodesManager_ShowCustomNodesMenu": {
"label": "自訂節點管理器"
},
"Comfy_Manager_CustomNodesManager_ShowLegacyCustomNodesMenu": {
"label": "自訂節點(舊版)"
},
"Comfy_Manager_ShowLegacyManagerMenu": {
"label": "管理選單(舊版)"
},
"Comfy_Manager_ShowMissingPacks": {
"label": "安裝缺少的自訂節點"
},
"Comfy_Manager_ShowUpdateAvailablePacks": {
"label": "檢查自訂節點更新"
},
"Comfy_Manager_ToggleManagerProgressDialog": {
"label": "切換自訂節點管理器進度條"

View File

@@ -82,12 +82,6 @@
"title": "建立帳戶"
}
},
"breadcrumbsMenu": {
"clearWorkflow": "清除工作流程",
"deleteWorkflow": "刪除工作流程",
"duplicate": "複製",
"enterNewName": "輸入新名稱"
},
"chatHistory": {
"cancelEdit": "取消",
"cancelEditTooltip": "取消編輯",
@@ -273,11 +267,11 @@
"choose_file_to_upload": "選擇要上傳的檔案",
"clear": "清除",
"clearAll": "全部清除",
"clearFilters": "清除篩選",
"close": "關閉",
"color": "顏色",
"comingSoon": "即將推出",
"command": "指令",
"commandProhibited": "指令 {command} 已被禁止。如需更多資訊,請聯絡管理員。",
"community": "社群",
"completed": "已完成",
"confirm": "確認",
@@ -298,9 +292,7 @@
"devices": "裝置",
"disableAll": "全部停用",
"disabling": "停用中",
"dismiss": "關閉",
"download": "下載",
"duplicate": "複製",
"edit": "編輯",
"empty": "空",
"enableAll": "全部啟用",
@@ -314,8 +306,6 @@
"filter": "篩選",
"findIssues": "尋找問題",
"firstTimeUIMessage": "這是您第一次使用新介面。若要返回舊介面,請前往「選單」>「使用新介面」>「關閉」。",
"frontendNewer": "前端版本 {frontendVersion} 可能與後端版本 {backendVersion} 不相容。",
"frontendOutdated": "前端版本 {frontendVersion} 已過時。後端需要 {requiredVersion} 或更高版本。",
"goToNode": "前往節點",
"help": "說明",
"icon": "圖示",
@@ -397,14 +387,11 @@
"unknownError": "未知錯誤",
"update": "更新",
"updateAvailable": "有可用更新",
"updateFrontend": "更新前端",
"updated": "已更新",
"updating": "更新中",
"upload": "上傳",
"usageHint": "使用提示",
"user": "使用者",
"versionMismatchWarning": "版本相容性警告",
"versionMismatchWarningMessage": "{warning}{detail} 請參閱 https://docs.comfy.org/installation/update_comfyui#common-update-issues 以取得更新說明。",
"videoFailedToLoad": "無法載入影片",
"workflow": "工作流程"
},
@@ -414,7 +401,6 @@
"resetView": "重設視圖",
"selectMode": "選取模式",
"toggleLinkVisibility": "切換連結顯示",
"toggleMinimap": "切換小地圖",
"zoomIn": "放大",
"zoomOut": "縮小"
},
@@ -573,10 +559,6 @@
"applyingTexture": "正在套用材質貼圖...",
"backgroundColor": "背景顏色",
"camera": "相機",
"cameraType": {
"orthographic": "正交",
"perspective": "透視"
},
"clearRecording": "清除錄影",
"edgeThreshold": "邊緣閾值",
"export": "匯出",
@@ -597,7 +579,6 @@
"wireframe": "線框"
},
"model": "模型",
"openIn3DViewer": "在 3D 檢視器中開啟",
"previewOutput": "預覽輸出",
"removeBackgroundImage": "移除背景圖片",
"resizeNodeMatchOutput": "調整節點以符合輸出",
@@ -608,22 +589,8 @@
"switchCamera": "切換相機",
"switchingMaterialMode": "正在切換材質模式...",
"upDirection": "上方方向",
"upDirections": {
"original": "原始"
},
"uploadBackgroundImage": "上傳背景圖片",
"uploadTexture": "上傳材質貼圖",
"viewer": {
"apply": "套用",
"cameraSettings": "相機設定",
"cameraType": "相機類型",
"cancel": "取消",
"exportSettings": "匯出設定",
"lightSettings": "燈光設定",
"modelSettings": "模型設定",
"sceneSettings": "場景設定",
"title": "3D 檢視器(測試版)"
}
"uploadTexture": "上傳材質貼圖"
},
"loadWorkflowWarning": {
"coreNodesFromVersion": "需要 ComfyUI {version}",
@@ -651,12 +618,15 @@
"title": "維護"
},
"manager": {
"applyChanges": "套用變更",
"changingVersion": "正在將版本從 {from} 變更為 {to}",
"clickToFinishSetup": "點擊",
"createdBy": "建立者",
"dependencies": "相依套件",
"discoverCommunityContent": "探索社群製作的節點包、擴充功能等...",
"downloads": "下載次數",
"errorConnecting": "連線至 Comfy Node Registry 時發生錯誤。",
"extensionsSuccessfullyInstalled": "擴充功能已成功安裝並可使用!",
"failed": "失敗({count}",
"filter": {
"disabled": "已停用",
@@ -668,8 +638,12 @@
"installAllMissingNodes": "安裝所有缺少的節點",
"installSelected": "安裝所選項目",
"installationQueue": "安裝佇列",
"installingDependencies": "正在安裝相依套件...",
"lastUpdated": "最後更新",
"latestVersion": "最新版本",
"legacyManagerUI": "使用舊版介面",
"legacyManagerUIDescription": "若要使用舊版管理介面,請以 --enable-manager-legacy-ui 啟動 ComfyUI",
"legacyMenuNotAvailable": "舊版管理選單不可用,已預設切換至新版管理選單。",
"license": "授權條款",
"loadingVersions": "正在載入版本...",
"nightlyVersion": "每夜建置版",
@@ -681,6 +655,7 @@
"packsSelected": "已選擇套件",
"repository": "儲存庫",
"restartToApplyChanges": "請重新啟動 ComfyUI 以套用變更",
"restartingBackend": "正在重新啟動後端以套用變更...",
"searchPlaceholder": "搜尋",
"selectVersion": "選擇版本",
"sort": {
@@ -698,6 +673,7 @@
"unknown": "未知"
},
"title": "自訂節點管理器",
"toFinishSetup": "以完成設定",
"totalNodes": "節點總數",
"tryAgainLater": "請稍後再試。",
"tryDifferentSearch": "請嘗試其他搜尋關鍵字。",
@@ -739,28 +715,21 @@
"batchCountTooltip": "工作流程產生應排入佇列的次數",
"clear": "清除工作流程",
"clipspace": "開啟 Clipspace",
"dark": "深色",
"disabled": "已停用",
"disabledTooltip": "工作流程將不會自動排入佇列",
"execute": "執行",
"help": "說明",
"hideMenu": "隱藏選單",
"instant": "立即",
"instantTooltip": "每次產生完成後,工作流程會立即排入佇列",
"interrupt": "取消目前執行",
"light": "淺色",
"manageExtensions": "管理擴充功能",
"onChange": "變更時",
"onChangeTooltip": "每當有變更時,工作流程會排入佇列",
"queue": "佇列面板",
"refresh": "重新整理節點定義",
"resetView": "重設畫布視圖",
"run": "執行",
"runWorkflow": "執行工作流程Shift 於前方排隊)",
"runWorkflowFront": "執行工作流程(前方排隊)",
"settings": "設定",
"showMenu": "顯示選單",
"theme": "主題",
"toggleBottomPanel": "切換下方面板"
},
"menuLabels": {
@@ -770,6 +739,7 @@
"Bypass/Unbypass Selected Nodes": "繞過/取消繞過選取節點",
"Canvas Performance": "畫布效能",
"Canvas Toggle Lock": "切換畫布鎖定",
"Check for Custom Node Updates": "檢查自訂節點更新",
"Check for Updates": "檢查更新",
"Clear Pending Tasks": "清除待處理任務",
"Clear Workflow": "清除工作流程",
@@ -783,6 +753,8 @@
"Contact Support": "聯絡支援",
"Convert Selection to Subgraph": "將選取內容轉為子圖",
"Convert selected nodes to group node": "將選取節點轉為群組節點",
"Custom Nodes (Legacy)": "自訂節點(舊版)",
"Custom Nodes Manager": "自訂節點管理員",
"Decrease Brush Size in MaskEditor": "在 MaskEditor 中減小筆刷大小",
"Delete Selected Items": "刪除選取項目",
"Desktop User Guide": "桌面應用程式使用指南",
@@ -799,11 +771,13 @@
"Help": "說明",
"Help Center": "說明中心",
"Increase Brush Size in MaskEditor": "在 MaskEditor 中增大筆刷大小",
"Install Missing Custom Nodes": "安裝缺少的自訂節點",
"Interrupt": "中斷",
"Load Default Workflow": "載入預設工作流程",
"Manage group nodes": "管理群組節點",
"Manager": "管理員",
"Minimap": "縮圖地圖",
"Manager Menu (Legacy)": "管理員選單(舊版)",
"Minimap": "小地圖",
"Model Library": "模型庫",
"Move Selected Nodes Down": "選取節點下移",
"Move Selected Nodes Left": "選取節點左移",
@@ -815,7 +789,7 @@
"Node Library": "節點庫",
"Node Links": "節點連結",
"Open": "開啟",
"Open 3D Viewer (Beta) for Selected Node": "為選取的節點開啟 3D 檢視器Beta",
"Open 3D Viewer (Beta) for Selected Node": "為選節點開啟 3D 檢視器Beta",
"Open Custom Nodes Folder": "開啟自訂節點資料夾",
"Open DevTools": "開啟開發者工具",
"Open Inputs Folder": "開啟輸入資料夾",
@@ -828,7 +802,6 @@
"Pin/Unpin Selected Items": "釘選/取消釘選選取項目",
"Pin/Unpin Selected Nodes": "釘選/取消釘選選取節點",
"Previous Opened Workflow": "上一個已開啟的工作流程",
"Queue Panel": "佇列面板",
"Queue Prompt": "加入提示至佇列",
"Queue Prompt (Front)": "將提示加入佇列前端",
"Queue Selected Output Nodes": "將選取的輸出節點加入佇列",
@@ -845,13 +818,12 @@
"Show Model Selector (Dev)": "顯示模型選擇器(開發用)",
"Show Settings Dialog": "顯示設定對話框",
"Sign Out": "登出",
"Toggle Essential Bottom Panel": "切換基本底部面板",
"Toggle Logs Bottom Panel": "切換日誌底部面板",
"Toggle Search Box": "切換搜尋框",
"Toggle Terminal Bottom Panel": "切換終端機底部面板",
"Toggle Theme (Dark/Light)": "切換主題(深色/淺色)",
"Toggle View Controls Bottom Panel": "切換檢視控制底部面板",
"Toggle the Custom Nodes Manager": "切換自訂節點管理器",
"Toggle shortcuts_essentials Bottom Panel": "切換快捷鍵_基本功能底部面板",
"Toggle shortcuts_viewControls Bottom Panel": "切換快捷鍵_檢視控制底部面板",
"Toggle the Custom Nodes Manager Progress Bar": "切換自訂節點管理器進度條",
"Undo": "復原",
"Ungroup selected group nodes": "取消群組選取的群組節點",
@@ -859,14 +831,8 @@
"Workflows": "工作流程",
"Zoom In": "放大",
"Zoom Out": "縮小",
"Zoom to fit": "縮放至適合大小"
},
"minimap": {
"nodeColors": "節點顏色",
"renderBypassState": "顯示繞過狀態",
"renderErrorState": "顯示錯誤狀態",
"showGroups": "顯示框架/群組",
"showLinks": "顯示連結"
"Zoom to fit": "縮放至適合大小",
"sideToolbar_queue": "側邊工具列_佇列"
},
"missingModelsDialog": {
"doNotAskAgain": "不要再顯示此訊息",
@@ -1186,31 +1152,10 @@
"Window": "視窗",
"Workflow": "工作流程"
},
"shortcuts": {
"essentials": "基本",
"keyboardShortcuts": "鍵盤快捷鍵",
"manageShortcuts": "管理快捷鍵",
"noKeybinding": "無快捷鍵",
"subcategories": {
"node": "節點",
"panelControls": "面板控制",
"queue": "佇列",
"view": "檢視",
"workflow": "工作流程"
},
"viewControls": "檢視控制"
},
"sideToolbar": {
"browseTemplates": "瀏覽範例模板",
"downloads": "下載",
"helpCenter": "說明中心",
"labels": {
"models": "模型",
"nodes": "節點",
"queue": "佇列",
"templates": "範本",
"workflows": "工作流程"
},
"logout": "登出",
"modelLibrary": "模型庫",
"newBlankWorkflow": "建立新的空白工作流程",
@@ -1248,7 +1193,7 @@
},
"showFlatList": "顯示平面清單"
},
"templates": "範本",
"themeToggle": "切換主題",
"workflowTab": {
"confirmDelete": "您確定要刪除這個工作流程嗎?",
"confirmDeleteTitle": "刪除工作流程?",
@@ -1295,8 +1240,6 @@
"Video": "影片",
"Video API": "影片 API"
},
"loadingMore": "正在載入更多範本...",
"searchPlaceholder": "搜尋範本...",
"template": {
"3D": {
"3d_hunyuan3d_image_to_model": "Hunyuan3D 2.0",
@@ -1619,7 +1562,6 @@
"failedToExportModel": "無法將模型匯出為 {format}",
"failedToFetchBalance": "取得餘額失敗:{error}",
"failedToFetchLogs": "無法取得伺服器日誌",
"failedToInitializeLoad3dViewer": "初始化 3D 檢視器失敗",
"failedToInitiateCreditPurchase": "啟動點數購買失敗:{error}",
"failedToPurchaseCredits": "購買點數失敗:{error}",
"fileLoadError": "無法在 {fileName} 中找到工作流程",
@@ -1675,13 +1617,6 @@
"prefix": "必須以 {prefix} 開頭",
"required": "必填"
},
"versionMismatchWarning": {
"dismiss": "關閉",
"frontendNewer": "前端版本 {frontendVersion} 可能與後端版本 {backendVersion} 不相容。",
"frontendOutdated": "前端版本 {frontendVersion} 已過時。後端需要版本 {requiredVersion} 或更高版本。",
"title": "版本相容性警告",
"updateFrontend": "更新前端"
},
"welcome": {
"getStarted": "開始使用",
"title": "歡迎使用 ComfyUI"

View File

@@ -164,8 +164,20 @@
"Comfy_LoadDefaultWorkflow": {
"label": "加载默认工作流"
},
"Comfy_Manager_CustomNodesManager": {
"label": "自定义节点管理器"
"Comfy_Manager_CustomNodesManager_ShowCustomNodesMenu": {
"label": "自定义节点(测试版)"
},
"Comfy_Manager_CustomNodesManager_ShowLegacyCustomNodesMenu": {
"label": "自訂節點(舊版)"
},
"Comfy_Manager_ShowLegacyManagerMenu": {
"label": "管理員選單(舊版)"
},
"Comfy_Manager_ShowMissingPacks": {
"label": "安装缺失的包"
},
"Comfy_Manager_ShowUpdateAvailablePacks": {
"label": "检查更新"
},
"Comfy_Manager_ToggleManagerProgressDialog": {
"label": "切换进度对话框"

View File

@@ -82,12 +82,6 @@
"title": "创建一个账户"
}
},
"breadcrumbsMenu": {
"clearWorkflow": "清除工作流程",
"deleteWorkflow": "删除工作流程",
"duplicate": "复制",
"enterNewName": "输入新名称"
},
"chatHistory": {
"cancelEdit": "取消",
"cancelEditTooltip": "取消编辑",
@@ -273,11 +267,11 @@
"choose_file_to_upload": "选择要上传的文件",
"clear": "清除",
"clearAll": "全部清除",
"clearFilters": "清除筛选",
"close": "关闭",
"color": "颜色",
"comingSoon": "即将推出",
"command": "指令",
"commandProhibited": "命令 {command} 被禁止。请联系管理员获取更多信息。",
"community": "社区",
"completed": "已完成",
"confirm": "确认",
@@ -298,9 +292,7 @@
"devices": "设备",
"disableAll": "禁用全部",
"disabling": "禁用中",
"dismiss": "关闭",
"download": "下载",
"duplicate": "复制",
"edit": "编辑",
"empty": "空",
"enableAll": "启用全部",
@@ -314,8 +306,6 @@
"filter": "过滤",
"findIssues": "查找问题",
"firstTimeUIMessage": "这是您第一次使用新界面。选择 \"菜单 > 使用新菜单 > 禁用\" 来恢复旧界面。",
"frontendNewer": "前端版本 {frontendVersion} 可能與後端版本 {backendVersion} 不相容。",
"frontendOutdated": "前端版本 {frontendVersion} 已过时。后端需要 {requiredVersion} 或更高版本。",
"goToNode": "转到节点",
"help": "帮助",
"icon": "图标",
@@ -397,14 +387,11 @@
"unknownError": "未知错误",
"update": "更新",
"updateAvailable": "有更新可用",
"updateFrontend": "更新前端",
"updated": "已更新",
"updating": "更新中",
"upload": "上传",
"usageHint": "使用提示",
"user": "用户",
"versionMismatchWarning": "版本相容性警告",
"versionMismatchWarningMessage": "{warning}{detail} 请参阅 https://docs.comfy.org/installation/update_comfyui#common-update-issues 以取得更新说明。",
"videoFailedToLoad": "视频加载失败",
"workflow": "工作流"
},
@@ -414,7 +401,6 @@
"resetView": "重置视图",
"selectMode": "选择模式",
"toggleLinkVisibility": "切换连线可见性",
"toggleMinimap": "切换小地图",
"zoomIn": "放大",
"zoomOut": "缩小"
},
@@ -573,10 +559,6 @@
"applyingTexture": "应用纹理中...",
"backgroundColor": "背景颜色",
"camera": "摄影机",
"cameraType": {
"orthographic": "正交",
"perspective": "透视"
},
"clearRecording": "清除录制",
"edgeThreshold": "边缘阈值",
"export": "导出",
@@ -597,7 +579,6 @@
"wireframe": "线框"
},
"model": "模型",
"openIn3DViewer": "在 3D 查看器中打开",
"previewOutput": "预览输出",
"removeBackgroundImage": "移除背景图片",
"resizeNodeMatchOutput": "调整节点以匹配输出",
@@ -608,22 +589,8 @@
"switchCamera": "切换摄影机类型",
"switchingMaterialMode": "切换材质模式中...",
"upDirection": "上方向",
"upDirections": {
"original": "原始"
},
"uploadBackgroundImage": "上传背景图片",
"uploadTexture": "上传纹理",
"viewer": {
"apply": "应用",
"cameraSettings": "相机设置",
"cameraType": "相机类型",
"cancel": "取消",
"exportSettings": "导出设置",
"lightSettings": "灯光设置",
"modelSettings": "模型设置",
"sceneSettings": "场景设置",
"title": "3D 查看器(测试版)"
}
"uploadTexture": "上传纹理"
},
"loadWorkflowWarning": {
"coreNodesFromVersion": "需要 ComfyUI {version}",
@@ -651,12 +618,15 @@
"title": "维护"
},
"manager": {
"applyChanges": "应用更改",
"changingVersion": "将版本从 {from} 更改为 {to}",
"clickToFinishSetup": "点击",
"createdBy": "创建者",
"dependencies": "依赖关系",
"discoverCommunityContent": "发现社区制作的节点包,扩展等等...",
"downloads": "下载",
"errorConnecting": "连接到Comfy节点注册表时出错。",
"extensionsSuccessfullyInstalled": "扩展已成功安装并可使用!",
"failed": "失败 ({count})",
"filter": {
"disabled": "已禁用",
@@ -668,8 +638,12 @@
"installAllMissingNodes": "安装所有缺失节点",
"installSelected": "安装选定",
"installationQueue": "安装队列",
"installingDependencies": "正在安装依赖项...",
"lastUpdated": "最后更新",
"latestVersion": "最新",
"legacyManagerUI": "使用旧版UI",
"legacyManagerUIDescription": "要使用旧版的管理器UI请启动ComfyUI并使用 --enable-manager-legacy-ui",
"legacyMenuNotAvailable": "在此版本的ComfyUI中不提供旧版的管理器菜单。请使用新的管理器菜单。",
"license": "许可证",
"loadingVersions": "正在加载版本...",
"nightlyVersion": "每夜",
@@ -681,6 +655,7 @@
"packsSelected": "选定的包",
"repository": "仓库",
"restartToApplyChanges": "要应用更改请重新启动ComfyUI",
"restartingBackend": "正在重启后端以应用更改...",
"searchPlaceholder": "搜索",
"selectVersion": "选择版本",
"sort": {
@@ -698,6 +673,7 @@
"unknown": "未知"
},
"title": "自定义节点管理器",
"toFinishSetup": "以完成设置",
"totalNodes": "节点总数",
"tryAgainLater": "请稍后再试。",
"tryDifferentSearch": "请尝试不同的搜索查询。",
@@ -739,28 +715,21 @@
"batchCountTooltip": "工作流生成次数",
"clear": "清空工作流",
"clipspace": "打开剪贴板",
"dark": "深色",
"disabled": "禁用",
"disabledTooltip": "工作流将不会自动执行",
"execute": "执行",
"help": "说明",
"hideMenu": "隐藏菜单",
"instant": "实时",
"instantTooltip": "工作流将会在生成完成后立即执行",
"interrupt": "取消当前任务",
"light": "淺色",
"manageExtensions": "管理擴充功能",
"onChange": "更改时",
"onChangeTooltip": "一旦进行更改,工作流将添加到执行队列",
"queue": "队列面板",
"refresh": "刷新节点",
"resetView": "重置视图",
"run": "运行",
"runWorkflow": "运行工作流程Shift排在前面",
"runWorkflowFront": "运行工作流程(排在前面)",
"settings": "设定",
"showMenu": "显示菜单",
"theme": "主题",
"toggleBottomPanel": "底部面板"
},
"menuLabels": {
@@ -770,6 +739,7 @@
"Bypass/Unbypass Selected Nodes": "忽略/取消忽略选定节点",
"Canvas Performance": "画布性能",
"Canvas Toggle Lock": "切换视图锁定",
"Check for Custom Node Updates": "檢查自訂節點更新",
"Check for Updates": "检查更新",
"Clear Pending Tasks": "清除待处理任务",
"Clear Workflow": "清除工作流",
@@ -783,7 +753,9 @@
"Contact Support": "联系支持",
"Convert Selection to Subgraph": "将选中内容转换为子图",
"Convert selected nodes to group node": "将选中节点转换为组节点",
"Decrease Brush Size in MaskEditor": "在 MaskEditor 中减小笔刷大小",
"Custom Nodes (Legacy)": "自訂節點(舊版)",
"Custom Nodes Manager": "自定义节点管理器",
"Decrease Brush Size in MaskEditor": "在 MaskEditor 中減小筆刷大小",
"Delete Selected Items": "删除选定的项目",
"Desktop User Guide": "桌面端用户指南",
"Duplicate Current Workflow": "复制当前工作流",
@@ -798,11 +770,13 @@
"Group Selected Nodes": "将选中节点转换为组节点",
"Help": "帮助",
"Help Center": "帮助中心",
"Increase Brush Size in MaskEditor": "在 MaskEditor 中增大刷大小",
"Increase Brush Size in MaskEditor": "在 MaskEditor 中增大刷大小",
"Install Missing Custom Nodes": "安裝缺少的自訂節點",
"Interrupt": "中断",
"Load Default Workflow": "加载默认工作流",
"Manage group nodes": "管理组节点",
"Manager": "管理器",
"Manager Menu (Legacy)": "管理選單(舊版)",
"Minimap": "小地图",
"Model Library": "模型库",
"Move Selected Nodes Down": "下移所选节点",
@@ -813,7 +787,7 @@
"New": "新建",
"Next Opened Workflow": "下一个打开的工作流",
"Node Library": "节点库",
"Node Links": "节点接",
"Node Links": "节点接",
"Open": "打开",
"Open 3D Viewer (Beta) for Selected Node": "为选中节点打开3D查看器测试版",
"Open Custom Nodes Folder": "打开自定义节点文件夹",
@@ -828,7 +802,6 @@
"Pin/Unpin Selected Items": "固定/取消固定选定项目",
"Pin/Unpin Selected Nodes": "固定/取消固定选定节点",
"Previous Opened Workflow": "上一个打开的工作流",
"Queue Panel": "队列面板",
"Queue Prompt": "执行提示词",
"Queue Prompt (Front)": "执行提示词 (优先执行)",
"Queue Selected Output Nodes": "将所选输出节点加入队列",
@@ -845,13 +818,12 @@
"Show Model Selector (Dev)": "顯示模型選擇器(開發用)",
"Show Settings Dialog": "显示设置对话框",
"Sign Out": "退出登录",
"Toggle Essential Bottom Panel": "切换基础底部面板",
"Toggle Logs Bottom Panel": "切换日志底部面板",
"Toggle Search Box": "切换搜索框",
"Toggle Terminal Bottom Panel": "切换终端底部面板",
"Toggle Theme (Dark/Light)": "切换主题(暗/亮)",
"Toggle View Controls Bottom Panel": "切换视图控制底部面板",
"Toggle the Custom Nodes Manager": "切换自定义节点管理器",
"Toggle shortcuts_essentials Bottom Panel": "切换快捷键·基础面板",
"Toggle shortcuts_viewControls Bottom Panel": "切换快捷键·视图控制面板",
"Toggle the Custom Nodes Manager Progress Bar": "切换自定义节点管理器进度条",
"Undo": "撤销",
"Ungroup selected group nodes": "解散选中组节点",
@@ -859,14 +831,8 @@
"Workflows": "工作流",
"Zoom In": "放大画面",
"Zoom Out": "缩小画面",
"Zoom to fit": "缩放以适应"
},
"minimap": {
"nodeColors": "节点颜色",
"renderBypassState": "渲染绕过状态",
"renderErrorState": "渲染错误状态",
"showGroups": "显示框架/分组",
"showLinks": "显示连接"
"Zoom to fit": "缩放以适应",
"sideToolbar_queue": "队列"
},
"missingModelsDialog": {
"doNotAskAgain": "不再显示此消息",
@@ -1186,31 +1152,10 @@
"Window": "窗口",
"Workflow": "工作流"
},
"shortcuts": {
"essentials": "常用",
"keyboardShortcuts": "键盘快捷键",
"manageShortcuts": "管理快捷键",
"noKeybinding": "无快捷键",
"subcategories": {
"node": "节点",
"panelControls": "面板控制",
"queue": "队列",
"view": "视图",
"workflow": "工作流"
},
"viewControls": "视图控制"
},
"sideToolbar": {
"browseTemplates": "浏览示例模板",
"downloads": "下载",
"helpCenter": "帮助中心",
"labels": {
"models": "模型",
"nodes": "节点",
"queue": "队列",
"templates": "模板",
"workflows": "工作流"
},
"logout": "登出",
"modelLibrary": "模型库",
"newBlankWorkflow": "创建空白工作流",
@@ -1248,7 +1193,7 @@
},
"showFlatList": "平铺结果"
},
"templates": "模板",
"themeToggle": "切换主题",
"workflowTab": {
"confirmDelete": "您确定要删除此工作流吗?",
"confirmDeleteTitle": "删除工作流?",
@@ -1295,8 +1240,6 @@
"Video": "视频生成",
"Video API": "视频 API"
},
"loadingMore": "正在加载更多模板...",
"searchPlaceholder": "搜索模板...",
"template": {
"3D": {
"3d_hunyuan3d_image_to_model": "混元3D 2.0 图生模型",
@@ -1619,7 +1562,6 @@
"failedToExportModel": "无法将模型导出为 {format}",
"failedToFetchBalance": "获取余额失败:{error}",
"failedToFetchLogs": "无法获取服务器日志",
"failedToInitializeLoad3dViewer": "初始化3D查看器失败",
"failedToInitiateCreditPurchase": "发起积分购买失败:{error}",
"failedToPurchaseCredits": "购买积分失败:{error}",
"fileLoadError": "无法在 {fileName} 中找到工作流",
@@ -1675,13 +1617,6 @@
"prefix": "必须以 {prefix} 开头",
"required": "必填"
},
"versionMismatchWarning": {
"dismiss": "关闭",
"frontendNewer": "前端版本 {frontendVersion} 可能與後端版本 {backendVersion} 不相容。",
"frontendOutdated": "前端版本 {frontendVersion} 已过时。後端需要 {requiredVersion} 版或更高版本。",
"title": "版本相容性警告",
"updateFrontend": "更新前端"
},
"welcome": {
"getStarted": "开始使用",
"title": "欢迎使用 ComfyUI"

View File

@@ -495,6 +495,7 @@ const zSettings = z.object({
'Comfy.Load3D.LightAdjustmentIncrement': z.number(),
'Comfy.Load3D.CameraType': z.enum(['perspective', 'orthographic']),
'Comfy.Load3D.3DViewerEnable': z.boolean(),
'Comfy.Memory.AllowManualUnload': z.boolean(),
'pysssss.SnapToGrid': z.boolean(),
/** VHS setting is used for queue video preview support. */
'VHS.AdvancedPreviews': z.string(),

View File

@@ -27,16 +27,16 @@ enum ManagerRoute {
UPDATE_ALL = 'manager/queue/update_all',
UNINSTALL = 'manager/queue/uninstall',
DISABLE = 'manager/queue/disable',
// FIX_NODE is currently unused but kept for potential future implementation
FIX_NODE = 'manager/queue/fix',
LIST_INSTALLED = 'customnode/installed',
GET_NODES = 'customnode/getmappings',
GET_PACKS = 'customnode/getlist',
IMPORT_FAIL_INFO = 'customnode/import_fail_info',
REBOOT = 'manager/reboot'
REBOOT = 'manager/reboot',
IS_LEGACY_MANAGER_UI = 'manager/is_legacy_manager_ui'
}
const managerApiClient = axios.create({
baseURL: api.apiURL(''),
baseURL: api.apiURL('/v2/'),
headers: {
'Content-Type': 'application/json'
}
@@ -247,6 +247,15 @@ export const useComfyManagerService = () => {
)
}
const isLegacyManagerUI = async (signal?: AbortSignal) => {
const errorContext = 'Checking if user set Manager to use the legacy UI'
return executeRequest<{ is_legacy_manager_ui: boolean }>(
() => managerApiClient.get(ManagerRoute.IS_LEGACY_MANAGER_UI, { signal }),
{ errorContext }
)
}
return {
// State
isLoading,
@@ -268,6 +277,7 @@ export const useComfyManagerService = () => {
updateAllPacks,
// System operations
rebootComfyUI
rebootComfyUI,
isLegacyManagerUI
}
}

View File

@@ -29,6 +29,7 @@ export const useComfyManagerStore = defineStore('comfyManager', () => {
const enabledPacksIds = ref<Set<string>>(new Set())
const disabledPacksIds = ref<Set<string>>(new Set())
const installedPacksIds = ref<Set<string>>(new Set())
const installingPacksIds = ref<Set<string>>(new Set())
const isStale = ref(true)
const taskLogs = ref<TaskLog[]>([])
@@ -49,6 +50,9 @@ export const useComfyManagerStore = defineStore('comfyManager', () => {
isInstalledPackId(packName) &&
enabledPacksIds.value.has(packName)
const isInstallingPackId = (packName: string | undefined): boolean =>
!!packName && installingPacksIds.value.has(packName)
const packsToIdSet = (packs: ManagerPackInstalled[]) =>
packs.reduce((acc, pack) => {
const id = pack.cnr_id || pack.aux_id
@@ -117,7 +121,11 @@ export const useComfyManagerStore = defineStore('comfyManager', () => {
whenever(isStale, refreshInstalledList, { immediate: true })
whenever(uncompletedCount, () => showManagerProgressDialog())
const withLogs = (task: () => Promise<null>, taskName: string) => {
const withLogs = (
task: () => Promise<null>,
taskName: string,
packId?: string
) => {
const { startListening, stopListening, logs } = useServerLogs()
const loggedTask = async () => {
@@ -128,6 +136,9 @@ export const useComfyManagerStore = defineStore('comfyManager', () => {
const onComplete = async () => {
await stopListening()
if (packId) {
installingPacksIds.value.delete(packId)
}
setStale()
}
@@ -152,8 +163,11 @@ export const useComfyManagerStore = defineStore('comfyManager', () => {
}
}
installingPacksIds.value.add(params.id)
const task = () => managerService.installPack(params, signal)
enqueueTask(withLogs(task, `${actionDescription} ${params.id}`))
enqueueTask(
withLogs(task, `${actionDescription} ${params.id}`, params.id)
)
},
{ maxSize: 1 }
)
@@ -162,14 +176,16 @@ export const useComfyManagerStore = defineStore('comfyManager', () => {
installPack.clear()
installPack.cancel()
const task = () => managerService.uninstallPack(params, signal)
enqueueTask(withLogs(task, t('manager.uninstalling', { id: params.id })))
enqueueTask(
withLogs(task, t('manager.uninstalling', { id: params.id }), params.id)
)
}
const updatePack = useCachedRequest<ManagerPackInfo, void>(
async (params: ManagerPackInfo, signal?: AbortSignal) => {
updateAllPacks.cancel()
const task = () => managerService.updatePack(params, signal)
enqueueTask(withLogs(task, t('g.updating', { id: params.id })))
enqueueTask(withLogs(task, t('g.updating', { id: params.id }), params.id))
},
{ maxSize: 1 }
)
@@ -184,7 +200,7 @@ export const useComfyManagerStore = defineStore('comfyManager', () => {
const disablePack = (params: ManagerPackInfo, signal?: AbortSignal) => {
const task = () => managerService.disablePack(params, signal)
enqueueTask(withLogs(task, t('g.disabling', { id: params.id })))
enqueueTask(withLogs(task, t('g.disabling', { id: params.id }), params.id))
}
const getInstalledPackVersion = (packId: string) => {
@@ -212,6 +228,7 @@ export const useComfyManagerStore = defineStore('comfyManager', () => {
installedPacksIds,
isPackInstalled: isInstalledPackId,
isPackEnabled: isEnabledPackId,
isPackInstalling: isInstallingPackId,
getInstalledPackVersion,
refreshInstalledList,

View File

@@ -19,7 +19,7 @@ export const IsInstallingKey: InjectionKey<Ref<boolean>> =
Symbol('isInstalling')
export enum ManagerWsQueueStatus {
DONE = 'done',
DONE = 'all-done',
IN_PROGRESS = 'in_progress'
}

View File

@@ -0,0 +1,440 @@
import { mount } from '@vue/test-utils'
import PrimeVue from 'primevue/config'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import { nextTick } from 'vue'
import { createI18n } from 'vue-i18n'
import ManagerProgressFooter from '@/components/dialog/footer/ManagerProgressFooter.vue'
import { useComfyManagerService } from '@/services/comfyManagerService'
import {
useComfyManagerStore,
useManagerProgressDialogStore
} from '@/stores/comfyManagerStore'
import { useCommandStore } from '@/stores/commandStore'
import { useDialogStore } from '@/stores/dialogStore'
import { useSettingStore } from '@/stores/settingStore'
import { TaskLog } from '@/types/comfyManagerTypes'
// Mock modules
vi.mock('@/stores/comfyManagerStore')
vi.mock('@/stores/dialogStore')
vi.mock('@/stores/settingStore')
vi.mock('@/stores/commandStore')
vi.mock('@/services/comfyManagerService')
// Mock useEventListener to capture the event handler
let reconnectHandler: (() => void) | null = null
vi.mock('@vueuse/core', async () => {
const actual = await vi.importActual('@vueuse/core')
return {
...actual,
useEventListener: vi.fn(
(_target: any, event: string, handler: any, _options: any) => {
if (event === 'reconnected') {
reconnectHandler = handler
}
}
)
}
})
vi.mock('@/services/workflowService', () => ({
useWorkflowService: vi.fn(() => ({
reloadCurrentWorkflow: vi.fn().mockResolvedValue(undefined)
}))
}))
vi.mock('@/stores/workspace/colorPaletteStore', () => ({
useColorPaletteStore: vi.fn(() => ({
completedActivePalette: {
light_theme: false
}
}))
}))
// Helper function to mount component with required setup
const mountComponent = (options: { captureError?: boolean } = {}) => {
const i18n = createI18n({
legacy: false,
locale: 'en',
messages: {
en: {}
}
})
const config: any = {
global: {
plugins: [PrimeVue, i18n],
mocks: {
$t: (key: string) => key // Mock i18n translation
}
}
}
// Add error handler for tests that expect errors
if (options.captureError) {
config.global.config = {
errorHandler: () => {
// Suppress error in test
}
}
}
return mount(ManagerProgressFooter, config)
}
describe('ManagerProgressFooter', () => {
const mockTaskLogs: TaskLog[] = []
const mockComfyManagerStore = {
uncompletedCount: 0,
taskLogs: mockTaskLogs,
allTasksDone: true,
clearLogs: vi.fn(),
setStale: vi.fn(),
// Add other required properties
isLoading: { value: false },
error: { value: null },
statusMessage: { value: 'DONE' },
installedPacks: {},
installedPacksIds: new Set(),
isPackInstalled: vi.fn(),
isPackEnabled: vi.fn(),
getInstalledPackVersion: vi.fn(),
refreshInstalledList: vi.fn(),
installPack: vi.fn(),
uninstallPack: vi.fn(),
updatePack: vi.fn(),
updateAllPacks: vi.fn(),
disablePack: vi.fn(),
enablePack: vi.fn()
}
const mockDialogStore = {
closeDialog: vi.fn(),
// Add other required properties
dialogStack: { value: [] },
showDialog: vi.fn(),
$id: 'dialog',
$state: {} as any,
$patch: vi.fn(),
$reset: vi.fn(),
$subscribe: vi.fn(),
$dispose: vi.fn(),
$onAction: vi.fn()
}
const mockSettingStore = {
get: vi.fn().mockReturnValue(false),
set: vi.fn(),
// Add other required properties
settingValues: { value: {} },
settingsById: { value: {} },
exists: vi.fn(),
getDefaultValue: vi.fn(),
loadSettingValues: vi.fn(),
updateValue: vi.fn(),
$id: 'setting',
$state: {} as any,
$patch: vi.fn(),
$reset: vi.fn(),
$subscribe: vi.fn(),
$dispose: vi.fn(),
$onAction: vi.fn()
}
const mockProgressDialogStore = {
isExpanded: false,
toggle: vi.fn(),
collapse: vi.fn(),
expand: vi.fn()
}
const mockCommandStore = {
execute: vi.fn().mockResolvedValue(undefined)
}
const mockComfyManagerService = {
rebootComfyUI: vi.fn().mockResolvedValue(null)
}
beforeEach(() => {
vi.clearAllMocks()
// Reset task logs
mockTaskLogs.length = 0
mockComfyManagerStore.taskLogs = mockTaskLogs
// Reset event handler
reconnectHandler = null
vi.mocked(useComfyManagerStore).mockReturnValue(
mockComfyManagerStore as any
)
vi.mocked(useDialogStore).mockReturnValue(mockDialogStore as any)
vi.mocked(useSettingStore).mockReturnValue(mockSettingStore as any)
vi.mocked(useManagerProgressDialogStore).mockReturnValue(
mockProgressDialogStore as any
)
vi.mocked(useCommandStore).mockReturnValue(mockCommandStore as any)
vi.mocked(useComfyManagerService).mockReturnValue(
mockComfyManagerService as any
)
})
describe('State 1: Queue Running', () => {
it('should display loading spinner and progress counter when queue is running', async () => {
// Setup queue running state
mockComfyManagerStore.uncompletedCount = 3
mockTaskLogs.push(
{ taskName: 'Installing pack1', logs: [] },
{ taskName: 'Installing pack2', logs: [] },
{ taskName: 'Installing pack3', logs: [] }
)
const wrapper = mountComponent()
// Check loading spinner exists (DotSpinner component)
expect(wrapper.find('.inline-flex').exists()).toBe(true)
// Check current task name is displayed
expect(wrapper.text()).toContain('Installing pack3')
// Check progress counter (completed: 2 of 3)
expect(wrapper.text()).toMatch(/2.*3/)
// Check expand/collapse button exists
const expandButton = wrapper.find('[aria-label="Expand"]')
expect(expandButton.exists()).toBe(true)
// Check Apply Changes button is NOT shown
expect(wrapper.text()).not.toContain('manager.applyChanges')
})
it('should toggle expansion when expand button is clicked', async () => {
mockComfyManagerStore.uncompletedCount = 1
mockTaskLogs.push({ taskName: 'Installing', logs: [] })
const wrapper = mountComponent()
const expandButton = wrapper.find('[aria-label="Expand"]')
await expandButton.trigger('click')
expect(mockProgressDialogStore.toggle).toHaveBeenCalled()
})
})
describe('State 2: Tasks Completed (Waiting for Restart)', () => {
it('should display check mark and Apply Changes button when all tasks are done', async () => {
// Setup tasks completed state
mockComfyManagerStore.uncompletedCount = 0
mockTaskLogs.push(
{ taskName: 'Installed pack1', logs: [] },
{ taskName: 'Installed pack2', logs: [] }
)
mockComfyManagerStore.allTasksDone = true
const wrapper = mountComponent()
// Check check mark emoji
expect(wrapper.text()).toContain('✅')
// Check restart message (split into 3 parts)
expect(wrapper.text()).toContain('manager.clickToFinishSetup')
expect(wrapper.text()).toContain('manager.applyChanges')
expect(wrapper.text()).toContain('manager.toFinishSetup')
// Check Apply Changes button exists
const applyButton = wrapper
.findAll('button')
.find((btn) => btn.text().includes('manager.applyChanges'))
expect(applyButton).toBeTruthy()
// Check no progress counter
expect(wrapper.text()).not.toMatch(/\d+.*of.*\d+/)
})
})
describe('State 3: Restarting', () => {
it('should display restarting message and spinner during restart', async () => {
// Setup completed state first
mockComfyManagerStore.uncompletedCount = 0
mockComfyManagerStore.allTasksDone = true
const wrapper = mountComponent()
// Click Apply Changes to trigger restart
const applyButton = wrapper
.findAll('button')
.find((btn) => btn.text().includes('manager.applyChanges'))
await applyButton?.trigger('click')
// Wait for state update
await nextTick()
// Check restarting message
expect(wrapper.text()).toContain('manager.restartingBackend')
// Check loading spinner during restart
expect(wrapper.find('.inline-flex').exists()).toBe(true)
// Check Apply Changes button is hidden
expect(wrapper.text()).not.toContain('manager.applyChanges')
})
})
describe('State 4: Restart Completed', () => {
it('should display success message and auto-close after 3 seconds', async () => {
vi.useFakeTimers()
// Setup completed state
mockComfyManagerStore.uncompletedCount = 0
mockComfyManagerStore.allTasksDone = true
const wrapper = mountComponent()
// Trigger restart
const applyButton = wrapper
.findAll('button')
.find((btn) => btn.text().includes('manager.applyChanges'))
await applyButton?.trigger('click')
// Wait for event listener to be set up
await nextTick()
// Trigger the reconnect handler directly
if (reconnectHandler) {
await reconnectHandler()
}
// Wait for restart completed state
await nextTick()
// Check success message
expect(wrapper.text()).toContain('🎉')
expect(wrapper.text()).toContain(
'manager.extensionsSuccessfullyInstalled'
)
// Check dialog closes after 3 seconds
vi.advanceTimersByTime(3000)
await nextTick()
expect(mockDialogStore.closeDialog).toHaveBeenCalledWith({
key: 'global-manager-progress-dialog'
})
expect(mockComfyManagerStore.clearLogs).toHaveBeenCalled()
vi.useRealTimers()
})
})
describe('Common Features', () => {
it('should always display close button', async () => {
const wrapper = mountComponent()
const closeButton = wrapper.find('[aria-label="Close"]')
expect(closeButton.exists()).toBe(true)
})
it('should close dialog when close button is clicked', async () => {
const wrapper = mountComponent()
const closeButton = wrapper.find('[aria-label="Close"]')
await closeButton.trigger('click')
expect(mockDialogStore.closeDialog).toHaveBeenCalledWith({
key: 'global-manager-progress-dialog'
})
})
})
describe('Toast Management', () => {
it('should suppress reconnection toasts during restart', async () => {
mockComfyManagerStore.uncompletedCount = 0
mockComfyManagerStore.allTasksDone = true
mockSettingStore.get.mockReturnValue(false) // Original setting
const wrapper = mountComponent()
// Click Apply Changes
const applyButton = wrapper
.findAll('button')
.find((btn) => btn.text().includes('manager.applyChanges'))
await applyButton?.trigger('click')
// Check toast setting was disabled
expect(mockSettingStore.set).toHaveBeenCalledWith(
'Comfy.Toast.DisableReconnectingToast',
true
)
})
it('should restore toast settings after restart completes', async () => {
mockComfyManagerStore.uncompletedCount = 0
mockComfyManagerStore.allTasksDone = true
mockSettingStore.get.mockReturnValue(false) // Original setting
const wrapper = mountComponent()
// Click Apply Changes
const applyButton = wrapper
.findAll('button')
.find((btn) => btn.text().includes('manager.applyChanges'))
await applyButton?.trigger('click')
// Wait for event listener to be set up
await nextTick()
// Trigger the reconnect handler directly
if (reconnectHandler) {
await reconnectHandler()
}
// Wait for settings restoration
await nextTick()
expect(mockSettingStore.set).toHaveBeenCalledWith(
'Comfy.Toast.DisableReconnectingToast',
false // Restored to original
)
})
})
describe('Error Handling', () => {
it('should restore state and close dialog on restart error', async () => {
mockComfyManagerStore.uncompletedCount = 0
mockComfyManagerStore.allTasksDone = true
// Mock restart to throw error
mockComfyManagerService.rebootComfyUI.mockRejectedValue(
new Error('Restart failed')
)
const wrapper = mountComponent({ captureError: true })
// Click Apply Changes
const applyButton = wrapper
.findAll('button')
.find((btn) => btn.text().includes('manager.applyChanges'))
expect(applyButton).toBeTruthy()
// The component throws the error but Vue Test Utils catches it
// We need to check if the error handling logic was executed
await applyButton!.trigger('click').catch(() => {
// Error is expected, ignore it
})
// Wait for error handling
await nextTick()
// Check dialog was closed on error
expect(mockDialogStore.closeDialog).toHaveBeenCalled()
// Check toast settings were restored
expect(mockSettingStore.set).toHaveBeenCalledWith(
'Comfy.Toast.DisableReconnectingToast',
false
)
// Check that the error handler was called
expect(mockComfyManagerService.rebootComfyUI).toHaveBeenCalled()
})
})
})

View File

@@ -0,0 +1,121 @@
import { beforeEach, describe, expect, it, vi } from 'vitest'
import { isReactive, isReadonly } from 'vue'
import {
ServerFeatureFlag,
useFeatureFlags
} from '@/composables/useFeatureFlags'
import { api } from '@/scripts/api'
// Mock the API module
vi.mock('@/scripts/api', () => ({
api: {
getServerFeature: vi.fn()
}
}))
describe('useFeatureFlags', () => {
beforeEach(() => {
vi.clearAllMocks()
})
describe('flags object', () => {
it('should provide reactive readonly flags', () => {
const { flags } = useFeatureFlags()
expect(isReadonly(flags)).toBe(true)
expect(isReactive(flags)).toBe(true)
})
it('should access supportsPreviewMetadata', () => {
vi.mocked(api.getServerFeature).mockImplementation(
(path, defaultValue) => {
if (path === ServerFeatureFlag.SUPPORTS_PREVIEW_METADATA)
return true as any
return defaultValue
}
)
const { flags } = useFeatureFlags()
expect(flags.supportsPreviewMetadata).toBe(true)
expect(api.getServerFeature).toHaveBeenCalledWith(
ServerFeatureFlag.SUPPORTS_PREVIEW_METADATA
)
})
it('should access maxUploadSize', () => {
vi.mocked(api.getServerFeature).mockImplementation(
(path, defaultValue) => {
if (path === ServerFeatureFlag.MAX_UPLOAD_SIZE)
return 209715200 as any // 200MB
return defaultValue
}
)
const { flags } = useFeatureFlags()
expect(flags.maxUploadSize).toBe(209715200)
expect(api.getServerFeature).toHaveBeenCalledWith(
ServerFeatureFlag.MAX_UPLOAD_SIZE
)
})
it('should return undefined when features are not available and no default provided', () => {
vi.mocked(api.getServerFeature).mockImplementation(
(_path, defaultValue) => defaultValue as any
)
const { flags } = useFeatureFlags()
expect(flags.supportsPreviewMetadata).toBeUndefined()
expect(flags.maxUploadSize).toBeUndefined()
})
})
describe('featureFlag', () => {
it('should create reactive computed for custom feature flags', () => {
vi.mocked(api.getServerFeature).mockImplementation(
(path, defaultValue) => {
if (path === 'custom.feature') return 'custom-value' as any
return defaultValue
}
)
const { featureFlag } = useFeatureFlags()
const customFlag = featureFlag('custom.feature', 'default')
expect(customFlag.value).toBe('custom-value')
expect(api.getServerFeature).toHaveBeenCalledWith(
'custom.feature',
'default'
)
})
it('should handle nested paths', () => {
vi.mocked(api.getServerFeature).mockImplementation(
(path, defaultValue) => {
if (path === 'extension.custom.nested.feature') return true as any
return defaultValue
}
)
const { featureFlag } = useFeatureFlags()
const nestedFlag = featureFlag('extension.custom.nested.feature', false)
expect(nestedFlag.value).toBe(true)
})
it('should work with ServerFeatureFlag enum', () => {
vi.mocked(api.getServerFeature).mockImplementation(
(path, defaultValue) => {
if (path === ServerFeatureFlag.MAX_UPLOAD_SIZE)
return 104857600 as any
return defaultValue
}
)
const { featureFlag } = useFeatureFlags()
const maxUploadSize = featureFlag(ServerFeatureFlag.MAX_UPLOAD_SIZE)
expect(maxUploadSize.value).toBe(104857600)
})
})
})

View File

@@ -28,7 +28,7 @@ describe('useManagerQueue', () => {
const getEventListenerCallback = () =>
vi.mocked(api.addEventListener).mock.calls[0][1]
const simulateServerStatus = async (status: 'done' | 'in_progress') => {
const simulateServerStatus = async (status: 'all-done' | 'in_progress') => {
const event = new CustomEvent('cm-queue-status', {
detail: { status }
})
@@ -49,7 +49,7 @@ describe('useManagerQueue', () => {
const queue = useManagerQueue()
expect(queue.queueLength.value).toBe(0)
expect(queue.statusMessage.value).toBe('done')
expect(queue.statusMessage.value).toBe('all-done')
expect(queue.allTasksDone.value).toBe(true)
})
})
@@ -104,7 +104,7 @@ describe('useManagerQueue', () => {
await nextTick()
// Should maintain the default status
expect(queue.statusMessage.value).toBe('done')
expect(queue.statusMessage.value).toBe('all-done')
})
it('should handle missing status property gracefully', async () => {
@@ -119,7 +119,7 @@ describe('useManagerQueue', () => {
await nextTick()
// Should maintain the default status
expect(queue.statusMessage.value).toBe('done')
expect(queue.statusMessage.value).toBe('all-done')
})
})
@@ -127,7 +127,7 @@ describe('useManagerQueue', () => {
it('should start the next task when server is idle and queue has items', async () => {
const { queue, mockTask } = createQueueWithMockTask()
await simulateServerStatus('done')
await simulateServerStatus('all-done')
// Task should have been started
expect(mockTask.task).toHaveBeenCalled()
@@ -138,7 +138,7 @@ describe('useManagerQueue', () => {
const { mockTask } = createQueueWithMockTask()
// Start the task
await simulateServerStatus('done')
await simulateServerStatus('all-done')
expect(mockTask.task).toHaveBeenCalled()
// Simulate task completion
@@ -148,7 +148,7 @@ describe('useManagerQueue', () => {
await simulateServerStatus('in_progress')
expect(mockTask.onComplete).not.toHaveBeenCalled()
await simulateServerStatus('done')
await simulateServerStatus('all-done')
expect(mockTask.onComplete).toHaveBeenCalled()
})
@@ -159,7 +159,7 @@ describe('useManagerQueue', () => {
queue.enqueueTask(mockTask)
// Start the task
await simulateServerStatus('done')
await simulateServerStatus('all-done')
expect(mockTask.task).toHaveBeenCalled()
// Simulate task completion
@@ -167,7 +167,7 @@ describe('useManagerQueue', () => {
// Simulate server cycle
await simulateServerStatus('in_progress')
await simulateServerStatus('done')
await simulateServerStatus('all-done')
// Should not throw errors even without onComplete
expect(queue.allTasksDone.value).toBe(true)
@@ -184,14 +184,14 @@ describe('useManagerQueue', () => {
expect(queue.queueLength.value).toBe(2)
// Process first task
await simulateServerStatus('done')
await simulateServerStatus('all-done')
expect(mockTask1.task).toHaveBeenCalled()
expect(queue.queueLength.value).toBe(1)
// Complete first task
await mockTask1.task.mock.results[0].value
await simulateServerStatus('in_progress')
await simulateServerStatus('done')
await simulateServerStatus('all-done')
expect(mockTask1.onComplete).toHaveBeenCalled()
// Process second task
@@ -201,7 +201,7 @@ describe('useManagerQueue', () => {
// Complete second task
await mockTask2.task.mock.results[0].value
await simulateServerStatus('in_progress')
await simulateServerStatus('done')
await simulateServerStatus('all-done')
expect(mockTask2.onComplete).toHaveBeenCalled()
// Queue should be empty and all tasks done
@@ -219,7 +219,7 @@ describe('useManagerQueue', () => {
queue.enqueueTask(mockTask)
// Start the task
await simulateServerStatus('done')
await simulateServerStatus('all-done')
expect(mockTask.task).toHaveBeenCalled()
// Let the promise rejection happen
@@ -231,7 +231,7 @@ describe('useManagerQueue', () => {
// Simulate server cycle
await simulateServerStatus('in_progress')
await simulateServerStatus('done')
await simulateServerStatus('all-done')
// onComplete should still be called for failed tasks
expect(mockTask.onComplete).toHaveBeenCalled()
@@ -252,7 +252,7 @@ describe('useManagerQueue', () => {
])
// Task 1
await simulateServerStatus('done')
await simulateServerStatus('all-done')
expect(mockTask1.task).toHaveBeenCalled()
// Verify state of onComplete callbacks
@@ -266,7 +266,7 @@ describe('useManagerQueue', () => {
// Task 2
await simulateServerStatus('in_progress')
await simulateServerStatus('done')
await simulateServerStatus('all-done')
expect(mockTask2.task).toHaveBeenCalled()
// Verify state of onComplete callbacks
@@ -279,7 +279,7 @@ describe('useManagerQueue', () => {
// Task 3
await simulateServerStatus('in_progress')
await simulateServerStatus('done')
await simulateServerStatus('all-done')
// Verify state of onComplete callbacks
expect(mockTask3.task).toHaveBeenCalled()
@@ -297,7 +297,7 @@ describe('useManagerQueue', () => {
// Add first task and start processing
queue.enqueueTask(mockTask1)
await simulateServerStatus('done')
await simulateServerStatus('all-done')
expect(mockTask1.task).toHaveBeenCalled()
// Add second task while first is processing
@@ -307,7 +307,7 @@ describe('useManagerQueue', () => {
// Complete first task
await mockTask1.task.mock.results[0].value
await simulateServerStatus('in_progress')
await simulateServerStatus('done')
await simulateServerStatus('all-done')
// Second task should now be processed
expect(mockTask2.task).toHaveBeenCalled()
@@ -318,9 +318,9 @@ describe('useManagerQueue', () => {
// Cycle server status without any tasks
await simulateServerStatus('in_progress')
await simulateServerStatus('done')
await simulateServerStatus('all-done')
await simulateServerStatus('in_progress')
await simulateServerStatus('done')
await simulateServerStatus('all-done')
// Should not cause any errors
expect(queue.allTasksDone.value).toBe(true)

View File

@@ -6,6 +6,8 @@ import { useComfyManagerService } from '@/services/comfyManagerService'
import { useComfyManagerStore } from '@/stores/comfyManagerStore'
import {
InstalledPacksResponse,
ManagerChannel,
ManagerDatabaseSource,
ManagerPackInstalled
} from '@/types/comfyManagerTypes'
@@ -13,6 +15,34 @@ vi.mock('@/services/comfyManagerService', () => ({
useComfyManagerService: vi.fn()
}))
vi.mock('@/services/dialogService', () => ({
useDialogService: () => ({
showManagerProgressDialog: vi.fn()
})
}))
vi.mock('@/composables/useManagerQueue', () => {
const enqueueTaskMock = vi.fn()
return {
useManagerQueue: () => ({
statusMessage: ref(''),
allTasksDone: ref(false),
enqueueTask: enqueueTaskMock,
uncompletedCount: ref(0)
}),
enqueueTask: enqueueTaskMock
}
})
vi.mock('@/composables/useServerLogs', () => ({
useServerLogs: () => ({
startListening: vi.fn(),
stopListening: vi.fn(),
logs: ref([])
})
}))
vi.mock('vue-i18n', () => ({
useI18n: () => ({
t: vi.fn((key) => key)
@@ -33,11 +63,7 @@ interface EnabledDisabledTestCase {
}
describe('useComfyManagerStore', () => {
let mockManagerService: {
isLoading: ReturnType<typeof ref<boolean>>
error: ReturnType<typeof ref<string | null>>
listInstalledPacks: ReturnType<typeof vi.fn>
}
let mockManagerService: ReturnType<typeof useComfyManagerService>
const triggerPacksChange = async (
installedPacks: InstalledPacksResponse,
@@ -55,10 +81,21 @@ describe('useComfyManagerStore', () => {
mockManagerService = {
isLoading: ref(false),
error: ref(null),
listInstalledPacks: vi.fn().mockResolvedValue({})
startQueue: vi.fn().mockResolvedValue(null),
resetQueue: vi.fn().mockResolvedValue(null),
getQueueStatus: vi.fn().mockResolvedValue(null),
listInstalledPacks: vi.fn().mockResolvedValue({}),
getImportFailInfo: vi.fn().mockResolvedValue(null),
installPack: vi.fn().mockResolvedValue(null),
uninstallPack: vi.fn().mockResolvedValue(null),
enablePack: vi.fn().mockResolvedValue(null),
disablePack: vi.fn().mockResolvedValue(null),
updatePack: vi.fn().mockResolvedValue(null),
updateAllPacks: vi.fn().mockResolvedValue(null),
rebootComfyUI: vi.fn().mockResolvedValue(null),
isLegacyManagerUI: vi.fn().mockResolvedValue(false)
}
// @ts-expect-error Mocking the return type of useComfyManagerService
vi.mocked(useComfyManagerService).mockReturnValue(mockManagerService)
})
@@ -313,4 +350,90 @@ describe('useComfyManagerStore', () => {
}
)
})
describe('isPackInstalling', () => {
it('should return false for packs not being installed', () => {
const store = useComfyManagerStore()
expect(store.isPackInstalling('test-pack')).toBe(false)
expect(store.isPackInstalling(undefined)).toBe(false)
expect(store.isPackInstalling('')).toBe(false)
})
it('should track pack as installing when installPack is called', async () => {
const store = useComfyManagerStore()
// Call installPack
await store.installPack.call({
id: 'test-pack',
repository: 'https://github.com/test/test-pack',
channel: ManagerChannel.DEV,
mode: ManagerDatabaseSource.CACHE,
selected_version: 'latest',
version: 'latest'
})
// Check that the pack is marked as installing
expect(store.isPackInstalling('test-pack')).toBe(true)
})
it('should remove pack from installing list when explicitly removed', async () => {
const store = useComfyManagerStore()
// Call installPack
await store.installPack.call({
id: 'test-pack',
repository: 'https://github.com/test/test-pack',
channel: ManagerChannel.DEV,
mode: ManagerDatabaseSource.CACHE,
selected_version: 'latest',
version: 'latest'
})
// Verify pack is installing
expect(store.isPackInstalling('test-pack')).toBe(true)
// Call installPack again for another pack to demonstrate multiple installs
await store.installPack.call({
id: 'another-pack',
repository: 'https://github.com/test/another-pack',
channel: ManagerChannel.DEV,
mode: ManagerDatabaseSource.CACHE,
selected_version: 'latest',
version: 'latest'
})
// Both should be installing
expect(store.isPackInstalling('test-pack')).toBe(true)
expect(store.isPackInstalling('another-pack')).toBe(true)
})
it('should track multiple packs installing independently', async () => {
const store = useComfyManagerStore()
// Install pack 1
await store.installPack.call({
id: 'pack-1',
repository: 'https://github.com/test/pack-1',
channel: ManagerChannel.DEV,
mode: ManagerDatabaseSource.CACHE,
selected_version: 'latest',
version: 'latest'
})
// Install pack 2
await store.installPack.call({
id: 'pack-2',
repository: 'https://github.com/test/pack-2',
channel: ManagerChannel.DEV,
mode: ManagerDatabaseSource.CACHE,
selected_version: 'latest',
version: 'latest'
})
// Both should be installing
expect(store.isPackInstalling('pack-1')).toBe(true)
expect(store.isPackInstalling('pack-2')).toBe(true)
expect(store.isPackInstalling('pack-3')).toBe(false)
})
})
})