[backport] Refactor app menu items and update side toolbar (#4665, #4946) (#5030)

* Refactor app menu items (#4665)

* Restructures the application menu
- rename Workflow to File
- move new & template items to top level
- add View menu and related sub items

Commands
- add "active" state getter shown as checkmark in the menu

Node side panel
- add refresh node defs
- change reset view icon

Help center
- change to use store for visibility

Fixes
- Fix bug with mouse down where if you drag mouse out, mouse up wasn't caught
- Fix issue with canvas info setting not triggering a redraw on change

* Fix missing translation warnings

* Add separator under new

* tidy

* Update locales [skip ci]

* fix some tests

* fix

* Hide icon if there is an active state within the menu item group

* Update locales [skip ci]

* Fix tests

* Implement feedback
- Remove queue, node lib, model lib, workflows, manager, help center
- Add minimap, link visibility

* Update locales [skip ci]

* Add plus icon on "New" menu item

* Update locales [skip ci]

* Fix test

* Fix translations

* Update locales [skip ci]

* Update locales [skip ci]

---------

Co-authored-by: github-actions <github-actions@github.com>

* Update side toolbar menu (#4946)

Side toolbar menu UI updates

- Currently the template modal is very hidden. Many users do not find it
- The current icons are quite aleatory

 **What**:
- Add templates shortcut button
- Add item label in normal size
- Use custom icon

Critical design decisions or edge cases that need attention:
- Sidebar tabs registered using custom icons will have their associated
command registed with an undefined icon (currently only string icons are
accepted, not components). I couldn't see anywhere directly using this
icon, but we should consider autogenerating an icon font so we can use
classes for our custom icons (or locating and updating locations to
support both icon types)

Normal mode:
<img width="621" height="1034" alt="image"
src="https://github.com/user-attachments/assets/c1d1cee2-004e-4ff8-b3fa-197329b0d2ae"
/>

Small mode:
<img width="176" height="325" alt="image"
src="https://github.com/user-attachments/assets/3824b8f6-bc96-4e62-aece-f0265113d2e3"
/>

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-4946-Update-side-toolbar-menu-24d6d73d365081c5b2bdc0ee8b61dc50)
by [Unito](https://www.unito.io)

---------

Co-authored-by: github-actions <github-actions@github.com>

---------

Co-authored-by: pythongosssss <125205205+pythongosssss@users.noreply.github.com>
Co-authored-by: github-actions <github-actions@github.com>
This commit is contained in:
Christian Byrne
2025-08-15 19:25:59 -07:00
committed by GitHub
parent 2ee5541b6a
commit 0f4057c8b2
48 changed files with 1477 additions and 155 deletions

View File

@@ -50,7 +50,7 @@ export class Topbar {
workflowName: string,
command: 'Save' | 'Save As' | 'Export'
) {
await this.triggerTopbarCommand(['Workflow', command])
await this.triggerTopbarCommand(['File', command])
await this.getSaveDialog().fill(workflowName)
await this.page.keyboard.press('Enter')
@@ -72,8 +72,8 @@ export class Topbar {
}
async triggerTopbarCommand(path: string[]) {
if (path.length < 2) {
throw new Error('Path is too short')
if (path.length < 1) {
throw new Error('Path cannot be empty')
}
const menu = await this.openTopbarMenu()
@@ -85,6 +85,13 @@ export class Topbar {
.locator('.p-tieredmenu-item')
.filter({ has: topLevelMenuItem })
await topLevelMenu.waitFor({ state: 'visible' })
// Handle top-level commands (like "New")
if (path.length === 1) {
await topLevelMenuItem.click()
return
}
await topLevelMenu.hover()
let currentMenu = topLevelMenu

View File

@@ -268,10 +268,7 @@ test.describe('Group Node', () => {
await comfyPage.setSetting('Comfy.ConfirmClear', false)
// Clear workflow
await comfyPage.menu.topbar.triggerTopbarCommand([
'Edit',
'Clear Workflow'
])
await comfyPage.executeCommand('Comfy.ClearWorkflow')
await comfyPage.ctrlV()
await verifyNodeLoaded(comfyPage, 1)
@@ -280,7 +277,7 @@ test.describe('Group Node', () => {
test('Copies and pastes group node into a newly created blank workflow', async ({
comfyPage
}) => {
await comfyPage.menu.topbar.triggerTopbarCommand(['Workflow', 'New'])
await comfyPage.menu.topbar.triggerTopbarCommand(['New'])
await comfyPage.ctrlV()
await verifyNodeLoaded(comfyPage, 1)
})
@@ -296,7 +293,7 @@ test.describe('Group Node', () => {
test('Serializes group node after copy and paste across workflows', async ({
comfyPage
}) => {
await comfyPage.menu.topbar.triggerTopbarCommand(['Workflow', 'New'])
await comfyPage.menu.topbar.triggerTopbarCommand(['New'])
await comfyPage.ctrlV()
const currentGraphState = await comfyPage.page.evaluate(() =>
window['app'].graph.serialize()

View File

@@ -684,7 +684,7 @@ test.describe('Load workflow', () => {
workflowA = generateUniqueFilename()
await comfyPage.menu.topbar.saveWorkflow(workflowA)
workflowB = generateUniqueFilename()
await comfyPage.menu.topbar.triggerTopbarCommand(['Workflow', 'New'])
await comfyPage.menu.topbar.triggerTopbarCommand(['New'])
await comfyPage.menu.topbar.saveWorkflow(workflowB)
// Wait for localStorage to persist the workflow paths before reloading

View File

@@ -75,7 +75,7 @@ test.describe('Menu', () => {
test('Displays keybinding next to item', async ({ comfyPage }) => {
await comfyPage.menu.topbar.openTopbarMenu()
const workflowMenuItem = comfyPage.menu.topbar.getMenuItem('Workflow')
const workflowMenuItem = comfyPage.menu.topbar.getMenuItem('File')
await workflowMenuItem.hover()
const exportTag = comfyPage.page.locator('.keybinding-tag', {
hasText: 'Ctrl + s'

View File

@@ -18,7 +18,7 @@ test.describe('Reroute Node', () => {
[workflowName]: workflowName
})
await comfyPage.setup()
await comfyPage.menu.topbar.triggerTopbarCommand(['Workflow', 'New'])
await comfyPage.menu.topbar.triggerTopbarCommand(['New'])
// Insert the workflow
const workflowsTab = comfyPage.menu.workflowsTab

View File

@@ -63,7 +63,7 @@ test.describe('Workflow Tab Thumbnails', () => {
test('Should show thumbnail when hovering over a non-active tab', async ({
comfyPage
}) => {
await comfyPage.menu.topbar.triggerTopbarCommand(['Workflow', 'New'])
await comfyPage.menu.topbar.triggerTopbarCommand(['New'])
const thumbnailImg = await getTabThumbnailImage(
comfyPage,
0,
@@ -73,7 +73,7 @@ test.describe('Workflow Tab Thumbnails', () => {
})
test('Should not show thumbnail for active tab', async ({ comfyPage }) => {
await comfyPage.menu.topbar.triggerTopbarCommand(['Workflow', 'New'])
await comfyPage.menu.topbar.triggerTopbarCommand(['New'])
const thumbnailImg = await getTabThumbnailImage(
comfyPage,
1,
@@ -105,7 +105,7 @@ test.describe('Workflow Tab Thumbnails', () => {
await comfyPage.nextFrame()
// Create a new workflow (tab 1) which will be empty
await comfyPage.menu.topbar.triggerTopbarCommand(['Workflow', 'New'])
await comfyPage.menu.topbar.triggerTopbarCommand(['New'])
await comfyPage.nextFrame()
// Now we have two tabs: tab 0 (default workflow with nodes) and tab 1 (empty)

View File

@@ -0,0 +1,6 @@
<svg viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.91396 12.7428L5.41396 10.7428C5.57175 10.1116 5.09439 9.50024 4.44382 9.50024H2.50538C2.04651 9.50024 1.64652 9.81253 1.53523 10.2577L1.03523 12.2577C0.877446 12.8888 1.3548 13.5002 2.00538 13.5002H3.94382C4.40269 13.5002 4.80267 13.1879 4.91396 12.7428Z" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/>
<path d="M5.91396 6.74277L6.41396 4.74277C6.57175 4.11163 6.09439 3.50024 5.44382 3.50024H3.50538C3.04651 3.50024 2.64652 3.81253 2.53523 4.2577L2.03523 6.2577C1.87745 6.88885 2.3548 7.50024 3.00538 7.50024H4.94382C5.40269 7.50024 5.80267 7.18794 5.91396 6.74277Z" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/>
<path d="M10.914 12.7428L11.414 10.7428C11.5718 10.1116 11.0944 9.50024 10.4438 9.50024H8.50538C8.04651 9.50024 7.64652 9.81253 7.53523 10.2577L7.03523 12.2577C6.87745 12.8888 7.3548 13.5002 8.00538 13.5002H9.94382C10.4027 13.5002 10.8027 13.1879 10.914 12.7428Z" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/>
<path d="M12.2342 5.46739L11.5287 7.11354C11.4248 7.35597 11.0811 7.35597 10.9772 7.11354L10.2717 5.46739C10.2414 5.39659 10.185 5.34017 10.1141 5.30983L8.468 4.60433C8.22557 4.50044 8.22557 4.15675 8.468 4.05285L10.1141 3.34736C10.185 3.31701 10.2414 3.26059 10.2717 3.18979L10.9772 1.54364C11.0811 1.30121 11.4248 1.30121 11.5287 1.54364L12.2342 3.18979C12.2645 3.26059 12.3209 3.31701 12.3918 3.34736L14.0379 4.05285C14.2803 4.15675 14.2803 4.50044 14.0379 4.60433L12.3918 5.30983C12.3209 5.34017 12.2645 5.39659 12.2342 5.46739Z" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1,3 @@
<svg viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M10.6667 10L10.598 10.2577C10.4812 10.6954 10.0848 11 9.63172 11H5.30161C4.64458 11 4.16608 10.3772 4.33538 9.74234L5.40204 5.74234C5.51878 5.30458 5.91523 5 6.36828 5H10.8286C11.4199 5 11.8505 5.56051 11.6982 6.13185L11.6736 6.22389M14 8H10M4.5 8H2" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 405 B

View File

@@ -0,0 +1,5 @@
<svg viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M13.1894 6.24254L13.6894 4.24254C13.8471 3.61139 13.3698 3 12.7192 3H3.78077C3.3219 3 2.92192 3.3123 2.81062 3.75746L2.31062 5.75746C2.15284 6.38861 2.63019 7 3.28077 7H12.2192C12.6781 7 13.0781 6.6877 13.1894 6.24254Z" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/>
<path d="M13.1894 12.2425L13.6894 10.2425C13.8471 9.61139 13.3698 9 12.7192 9H8.78077C8.3219 9 7.92192 9.3123 7.81062 9.75746L7.31062 11.7575C7.15284 12.3886 7.6302 13 8.28077 13H12.2192C12.6781 13 13.0781 12.6877 13.1894 12.2425Z" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/>
<path d="M5.18936 12.2425L5.68936 10.2425C5.84714 9.61139 5.36978 9 4.71921 9H3.78077C3.3219 9 2.92192 9.3123 2.81062 9.75746L2.31062 11.7575C2.15284 12.3886 2.6302 13 3.28077 13H4.21921C4.67808 13 5.07806 12.6877 5.18936 12.2425Z" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 970 B

View File

@@ -8,10 +8,13 @@
:icon-badge="tab.iconBadge"
:tooltip="tab.tooltip"
:tooltip-suffix="getTabTooltipSuffix(tab)"
:label="tab.label || tab.title"
:is-small="isSmall"
:selected="tab.id === selectedTab?.id"
:class="tab.id + '-tab-button'"
@click="onTabClick(tab)"
/>
<SidebarTemplatesButton />
<div class="side-tool-bar-end">
<SidebarLogoutIcon v-if="userStore.isMultiUserServer" />
<SidebarHelpCenterIcon />
@@ -43,6 +46,7 @@ import type { SidebarTabExtension } from '@/types/extensionTypes'
import SidebarHelpCenterIcon from './SidebarHelpCenterIcon.vue'
import SidebarIcon from './SidebarIcon.vue'
import SidebarLogoutIcon from './SidebarLogoutIcon.vue'
import SidebarTemplatesButton from './SidebarTemplatesButton.vue'
const workspaceStore = useWorkspaceStore()
const settingStore = useSettingStore()
@@ -86,7 +90,7 @@ const getTabTooltipSuffix = (tab: SidebarTabExtension) => {
box-shadow: var(--bar-shadow);
--sidebar-width: 4rem;
--sidebar-icon-size: 1.5rem;
--sidebar-icon-size: 1rem;
}
.side-tool-bar-container.small-sidebar {

View File

@@ -58,11 +58,12 @@
<script setup lang="ts">
import { storeToRefs } from 'pinia'
import { computed, onMounted, ref } from 'vue'
import { computed, onMounted } from 'vue'
import HelpCenterMenuContent from '@/components/helpcenter/HelpCenterMenuContent.vue'
import ReleaseNotificationToast from '@/components/helpcenter/ReleaseNotificationToast.vue'
import WhatsNewPopup from '@/components/helpcenter/WhatsNewPopup.vue'
import { useHelpCenterStore } from '@/stores/helpCenterStore'
import { useReleaseStore } from '@/stores/releaseStore'
import { useSettingStore } from '@/stores/settingStore'
@@ -70,8 +71,9 @@ import SidebarIcon from './SidebarIcon.vue'
const settingStore = useSettingStore()
const releaseStore = useReleaseStore()
const helpCenterStore = useHelpCenterStore()
const { shouldShowRedDot } = storeToRefs(releaseStore)
const isHelpCenterVisible = ref(false)
const { isVisible: isHelpCenterVisible } = storeToRefs(helpCenterStore)
const sidebarLocation = computed(() =>
settingStore.get('Comfy.Sidebar.Location')
@@ -80,11 +82,11 @@ const sidebarLocation = computed(() =>
const sidebarSize = computed(() => settingStore.get('Comfy.Sidebar.Size'))
const toggleHelpCenter = () => {
isHelpCenterVisible.value = !isHelpCenterVisible.value
helpCenterStore.toggle()
}
const closeHelpCenter = () => {
isHelpCenterVisible.value = false
helpCenterStore.hide()
}
// Initialize release store on mount
@@ -130,6 +132,7 @@ onMounted(async () => {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);

View File

@@ -19,12 +19,29 @@
@click="emit('click', $event)"
>
<template #icon>
<slot name="icon">
<OverlayBadge v-if="shouldShowBadge" :value="overlayValue">
<i :class="icon + ' side-bar-button-icon'" />
</OverlayBadge>
<i v-else :class="icon + ' side-bar-button-icon'" />
</slot>
<div class="side-bar-button-content">
<slot name="icon">
<OverlayBadge v-if="shouldShowBadge" :value="overlayValue">
<i
v-if="typeof icon === 'string'"
:class="icon + ' side-bar-button-icon'"
/>
<component :is="icon" v-else class="side-bar-button-icon" />
</OverlayBadge>
<i
v-else-if="typeof icon === 'string'"
:class="icon + ' side-bar-button-icon'"
/>
<component
:is="icon"
v-else-if="typeof icon === 'object'"
class="side-bar-button-icon"
/>
</slot>
<span v-if="label && !isSmall" class="side-bar-button-label">{{
t(label)
}}</span>
</div>
</template>
</Button>
</template>
@@ -33,6 +50,7 @@
import Button from 'primevue/button'
import OverlayBadge from 'primevue/overlaybadge'
import { computed } from 'vue'
import type { Component } from 'vue'
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
@@ -41,13 +59,17 @@ const {
selected = false,
tooltip = '',
tooltipSuffix = '',
iconBadge = ''
iconBadge = '',
label = '',
isSmall = false
} = defineProps<{
icon?: string
icon?: string | Component
selected?: boolean
tooltip?: string
tooltipSuffix?: string
iconBadge?: string | (() => string | null)
label?: string
isSmall?: boolean
}>()
const emit = defineEmits<{
@@ -74,10 +96,23 @@ const computedTooltip = computed(() => t(tooltip) + tooltipSuffix)
<style scoped>
.side-bar-button {
width: var(--sidebar-width);
height: var(--sidebar-width);
height: calc(var(--sidebar-width) + 0.5rem);
border-radius: 0;
}
.side-tool-bar-end .side-bar-button {
height: var(--sidebar-width);
}
.side-bar-button-content {
@apply flex flex-col items-center gap-2;
}
.side-bar-button-label {
@apply text-[10px] text-center whitespace-nowrap;
line-height: 1;
}
.comfyui-body-left .side-bar-button.side-bar-button-selected,
.comfyui-body-left .side-bar-button.side-bar-button-selected:hover {
border-left: 4px solid var(--p-button-text-primary-color);

View File

@@ -0,0 +1,35 @@
<template>
<SidebarIcon
:icon="TemplateIcon"
:tooltip="$t('sideToolbar.templates')"
:label="$t('sideToolbar.labels.templates')"
:is-small="isSmall"
class="templates-tab-button"
@click="openTemplates"
/>
</template>
<script setup lang="ts">
import { computed, defineAsyncComponent, markRaw } from 'vue'
import { useCommandStore } from '@/stores/commandStore'
import { useSettingStore } from '@/stores/settingStore'
import SidebarIcon from './SidebarIcon.vue'
// Import the custom template icon
const TemplateIcon = markRaw(
defineAsyncComponent(() => import('virtual:icons/comfy/template'))
)
const settingStore = useSettingStore()
const commandStore = useCommandStore()
const isSmall = computed(
() => settingStore.get('Comfy.Sidebar.Size') === 'small'
)
const openTemplates = () => {
void commandStore.execute('Comfy.BrowseTemplates')
}
</script>

View File

@@ -30,11 +30,18 @@
/>
<Button
v-tooltip.bottom="$t('sideToolbar.nodeLibraryTab.resetView')"
icon="pi pi-refresh"
icon="pi pi-filter-slash"
text
severity="secondary"
@click="resetOrganization"
/>
<Button
v-tooltip.bottom="$t('menu.refresh')"
icon="pi pi-refresh"
text
severity="secondary"
@click="() => commandStore.execute('Comfy.RefreshNodeDefinitions')"
/>
<Popover ref="groupingPopover">
<div class="flex flex-col gap-1 p-2">
<Button
@@ -139,6 +146,7 @@ import {
DEFAULT_SORTING_ID,
nodeOrganizationService
} from '@/services/nodeOrganizationService'
import { useCommandStore } from '@/stores/commandStore'
import { useNodeBookmarkStore } from '@/stores/nodeBookmarkStore'
import { ComfyNodeDefImpl, useNodeDefStore } from '@/stores/nodeDefStore'
import { useNodeHelpStore } from '@/stores/workspace/nodeHelpStore'
@@ -155,6 +163,7 @@ import NodeBookmarkTreeExplorer from './nodeLibrary/NodeBookmarkTreeExplorer.vue
const nodeDefStore = useNodeDefStore()
const nodeBookmarkStore = useNodeBookmarkStore()
const nodeHelpStore = useNodeHelpStore()
const commandStore = useCommandStore()
const expandedKeys = ref<Record<string, boolean>>({})
const { expandNode, toggleNodeOnEvent } = useTreeExpansion(expandedKeys)

View File

@@ -55,9 +55,30 @@
v-bind="props.action"
:href="item.url"
target="_blank"
:class="typeof item.class === 'function' ? item.class() : item.class"
@mousedown="
isZoomCommand(item) ? handleZoomMouseDown(item, $event) : undefined
"
@click="isZoomCommand(item) ? handleZoomClick($event) : undefined"
>
<span v-if="item.icon" class="p-menubar-item-icon" :class="item.icon" />
<i
v-if="hasActiveStateSiblings(item)"
class="p-menubar-item-icon pi pi-check text-sm"
:class="{ invisible: !item.comfyCommand?.active?.() }"
/>
<span
v-else-if="
item.icon && item.comfyCommand?.id !== 'Comfy.NewBlankWorkflow'
"
class="p-menubar-item-icon"
:class="item.icon"
/>
<span class="p-menubar-item-label text-nowrap">{{ item.label }}</span>
<i
v-if="item.comfyCommand?.id === 'Comfy.NewBlankWorkflow'"
class="ml-auto"
:class="item.icon"
/>
<span
v-if="item?.comfyCommand?.keybinding"
class="ml-auto border border-surface rounded text-muted text-xs text-nowrap p-1 keybinding-tag"
@@ -94,6 +115,7 @@ import { useSettingStore } from '@/stores/settingStore'
import { useColorPaletteStore } from '@/stores/workspace/colorPaletteStore'
import { showNativeSystemMenu } from '@/utils/envUtil'
import { normalizeI18nKey } from '@/utils/formatUtil'
import { whileMouseDown } from '@/utils/mouseDownUtil'
const colorPaletteStore = useColorPaletteStore()
const menuItemsStore = useMenuItemStore()
@@ -163,16 +185,22 @@ const extraMenuItems: MenuItem[] = [
},
{ separator: true },
{
key: 'manage-extensions',
label: t('menu.manageExtensions'),
icon: 'mdi mdi-puzzle-outline',
command: showManageExtensions
key: 'browse-templates',
label: t('menuLabels.Browse Templates'),
icon: 'pi pi-folder-open',
command: () => commandStore.execute('Comfy.BrowseTemplates')
},
{
key: 'settings',
label: t('g.settings'),
icon: 'mdi mdi-cog-outline',
command: () => showSettings()
},
{
key: 'manage-extensions',
label: t('menu.manageExtensions'),
icon: 'mdi mdi-puzzle-outline',
command: showManageExtensions
}
]
@@ -237,6 +265,36 @@ const onMenuShow = () => {
}
})
}
const isZoomCommand = (item: MenuItem) => {
return (
item.comfyCommand?.id === 'Comfy.Canvas.ZoomIn' ||
item.comfyCommand?.id === 'Comfy.Canvas.ZoomOut'
)
}
const handleZoomMouseDown = (item: MenuItem, event: MouseEvent) => {
if (item.comfyCommand) {
whileMouseDown(
event,
async () => {
await commandStore.execute(item.comfyCommand!.id)
},
50
)
}
}
const handleZoomClick = (event: MouseEvent) => {
event.preventDefault()
event.stopPropagation()
// Prevent the menu from closing for zoom commands
return false
}
const hasActiveStateSiblings = (item: MenuItem): boolean => {
return menuItemsStore.menuItemHasActiveStateChildren[item.parentPath]
}
</script>
<style scoped>

View File

@@ -1,16 +1,21 @@
import { markRaw } from 'vue'
import { defineAsyncComponent, markRaw } from 'vue'
import ModelLibrarySidebarTab from '@/components/sidebar/tabs/ModelLibrarySidebarTab.vue'
import { useElectronDownloadStore } from '@/stores/electronDownloadStore'
import type { SidebarTabExtension } from '@/types/extensionTypes'
import { isElectron } from '@/utils/envUtil'
const AiModelIcon = markRaw(
defineAsyncComponent(() => import('virtual:icons/comfy/ai-model'))
)
export const useModelLibrarySidebarTab = (): SidebarTabExtension => {
return {
id: 'model-library',
icon: 'pi pi-box',
icon: AiModelIcon,
title: 'sideToolbar.modelLibrary',
tooltip: 'sideToolbar.modelLibrary',
label: 'sideToolbar.labels.models',
component: markRaw(ModelLibrarySidebarTab),
type: 'vue',
iconBadge: () => {

View File

@@ -1,14 +1,19 @@
import { markRaw } from 'vue'
import { defineAsyncComponent, markRaw } from 'vue'
import NodeLibrarySidebarTab from '@/components/sidebar/tabs/NodeLibrarySidebarTab.vue'
import type { SidebarTabExtension } from '@/types/extensionTypes'
const NodeIcon = markRaw(
defineAsyncComponent(() => import('virtual:icons/comfy/node'))
)
export const useNodeLibrarySidebarTab = (): SidebarTabExtension => {
return {
id: 'node-library',
icon: 'pi pi-book',
icon: NodeIcon,
title: 'sideToolbar.nodeLibrary',
tooltip: 'sideToolbar.nodeLibrary',
label: 'sideToolbar.labels.nodes',
component: markRaw(NodeLibrarySidebarTab),
type: 'vue'
}

View File

@@ -15,6 +15,7 @@ export const useQueueSidebarTab = (): SidebarTabExtension => {
},
title: 'sideToolbar.queue',
tooltip: 'sideToolbar.queue',
label: 'sideToolbar.labels.queue',
component: markRaw(QueueSidebarTab),
type: 'vue'
}

View File

@@ -1,16 +1,20 @@
import { markRaw } from 'vue'
import { defineAsyncComponent, markRaw } from 'vue'
import WorkflowsSidebarTab from '@/components/sidebar/tabs/WorkflowsSidebarTab.vue'
import { useSettingStore } from '@/stores/settingStore'
import { useWorkflowStore } from '@/stores/workflowStore'
import type { SidebarTabExtension } from '@/types/extensionTypes'
const WorkflowIcon = markRaw(
defineAsyncComponent(() => import('virtual:icons/comfy/workflow'))
)
export const useWorkflowsSidebarTab = (): SidebarTabExtension => {
const settingStore = useSettingStore()
const workflowStore = useWorkflowStore()
return {
id: 'workflows',
icon: 'pi pi-folder-open',
icon: WorkflowIcon,
iconBadge: () => {
if (
settingStore.get('Comfy.Workflow.WorkflowTabsPosition') !== 'Sidebar'
@@ -22,6 +26,7 @@ export const useWorkflowsSidebarTab = (): SidebarTabExtension => {
},
title: 'sideToolbar.workflows',
tooltip: 'sideToolbar.workflows',
label: 'sideToolbar.labels.workflows',
component: markRaw(WorkflowsSidebarTab),
type: 'vue'
}

View File

@@ -21,6 +21,7 @@ import { useWorkflowService } from '@/services/workflowService'
import type { ComfyCommand } from '@/stores/commandStore'
import { useExecutionStore } from '@/stores/executionStore'
import { useCanvasStore, useTitleEditorStore } from '@/stores/graphStore'
import { useHelpCenterStore } from '@/stores/helpCenterStore'
import { useNodeOutputStore } from '@/stores/imagePreviewStore'
import { useQueueSettingsStore, useQueueStore } from '@/stores/queueStore'
import { useSettingStore } from '@/stores/settingStore'
@@ -278,6 +279,7 @@ export function useCoreCommands(): ComfyCommand[] {
id: 'Comfy.Canvas.FitView',
icon: 'pi pi-expand',
label: 'Fit view to selected nodes',
menubarLabel: 'Zoom to fit',
category: 'view-controls' as const,
function: () => {
if (app.canvas.empty) {
@@ -303,6 +305,7 @@ export function useCoreCommands(): ComfyCommand[] {
id: 'Comfy.Canvas.ToggleLinkVisibility',
icon: 'pi pi-eye',
label: 'Canvas Toggle Link Visibility',
menubarLabel: 'Node Links',
versionAdded: '1.3.6',
function: (() => {
@@ -324,12 +327,15 @@ export function useCoreCommands(): ComfyCommand[] {
)
}
}
})()
})(),
active: () =>
useSettingStore().get('Comfy.LinkRenderMode') !== LiteGraph.HIDDEN_LINK
},
{
id: 'Comfy.Canvas.ToggleMinimap',
icon: 'pi pi-map',
label: 'Canvas Toggle Minimap',
menubarLabel: 'Minimap',
versionAdded: '1.24.1',
function: async () => {
const settingStore = useSettingStore()
@@ -337,7 +343,8 @@ export function useCoreCommands(): ComfyCommand[] {
'Comfy.Minimap.Visible',
!settingStore.get('Comfy.Minimap.Visible')
)
}
},
active: () => useSettingStore().get('Comfy.Minimap.Visible')
},
{
id: 'Comfy.QueuePrompt',
@@ -541,21 +548,25 @@ export function useCoreCommands(): ComfyCommand[] {
id: 'Workspace.ToggleBottomPanel',
icon: 'pi pi-list',
label: 'Toggle Bottom Panel',
menubarLabel: 'Bottom Panel',
versionAdded: '1.3.22',
category: 'view-controls' as const,
function: () => {
bottomPanelStore.toggleBottomPanel()
}
},
active: () => bottomPanelStore.bottomPanelVisible
},
{
id: 'Workspace.ToggleFocusMode',
icon: 'pi pi-eye',
label: 'Toggle Focus Mode',
menubarLabel: 'Focus Mode',
versionAdded: '1.3.27',
category: 'view-controls' as const,
function: () => {
useWorkspaceStore().toggleFocusMode()
}
},
active: () => useWorkspaceStore().focusMode
},
{
id: 'Comfy.Graph.FitGroupToContents',
@@ -815,6 +826,34 @@ export function useCoreCommands(): ComfyCommand[] {
graph.unpackSubgraph(subgraphNode)
}
},
{
id: 'Comfy.OpenManagerDialog',
icon: 'mdi mdi-puzzle-outline',
label: 'Manager',
function: () => {
dialogService.showManagerDialog()
}
},
{
id: 'Comfy.ToggleHelpCenter',
icon: 'pi pi-question-circle',
label: 'Help Center',
function: () => {
useHelpCenterStore().toggle()
},
active: () => useHelpCenterStore().isVisible
},
{
id: 'Comfy.ToggleCanvasInfo',
icon: 'pi pi-info-circle',
label: 'Canvas Performance',
function: async () => {
const settingStore = useSettingStore()
const currentValue = settingStore.get('Comfy.Graph.CanvasInfo')
await settingStore.set('Comfy.Graph.CanvasInfo', !currentValue)
},
active: () => useSettingStore().get('Comfy.Graph.CanvasInfo')
},
{
id: 'Workspace.ToggleBottomPanel.Shortcuts',
icon: 'pi pi-key',

View File

@@ -19,6 +19,7 @@ export const useLitegraphSettings = () => {
const canvasInfoEnabled = settingStore.get('Comfy.Graph.CanvasInfo')
if (canvasStore.canvas) {
canvasStore.canvas.show_info = canvasInfoEnabled
canvasStore.canvas.draw(false, true)
}
})

View File

@@ -1,8 +1,9 @@
export const CORE_MENU_COMMANDS = [
[['Workflow'], ['Comfy.NewBlankWorkflow']],
[['Workflow'], ['Comfy.OpenWorkflow', 'Comfy.BrowseTemplates']],
[[], ['Comfy.NewBlankWorkflow']],
[[], []], // Separator after New
[['File'], ['Comfy.OpenWorkflow']],
[
['Workflow'],
['File'],
[
'Comfy.SaveWorkflow',
'Comfy.SaveWorkflowAs',
@@ -11,8 +12,6 @@ export const CORE_MENU_COMMANDS = [
]
],
[['Edit'], ['Comfy.Undo', 'Comfy.Redo']],
[['Edit'], ['Comfy.RefreshNodeDefinitions']],
[['Edit'], ['Comfy.ClearWorkflow']],
[['Edit'], ['Comfy.OpenClipspace']],
[
['Help'],

View File

@@ -179,6 +179,9 @@
"Comfy_OpenClipspace": {
"label": "Clipspace"
},
"Comfy_OpenManagerDialog": {
"label": "مدير"
},
"Comfy_OpenWorkflow": {
"label": "فتح سير عمل"
},
@@ -206,6 +209,12 @@
"Comfy_ShowSettingsDialog": {
"label": "عرض نافذة الإعدادات"
},
"Comfy_ToggleCanvasInfo": {
"label": "أداء اللوحة"
},
"Comfy_ToggleHelpCenter": {
"label": "مركز المساعدة"
},
"Comfy_ToggleTheme": {
"label": "تبديل النمط (فاتح/داكن)"
},

View File

@@ -1347,13 +1347,225 @@
"showManual": "عرض مهام الصيانة",
"confirmTitle": "هل أنت متأكد؟",
"terminalDefaultMessage": "عند تشغيل أمر استكشاف الأخطاء، سيتم عرض أي مخرجات هنا.",
"consoleLogs": "سجلات وحدة التحكم",
"error": {
"toastTitle": "خطأ في المهمة",
"taskFailed": "فشل تنفيذ المهمة.",
"cannotContinue": "غير قادر على المتابعة - لا تزال هناك أخطاء",
"defaultDescription": "حدث خطأ أثناء تنفيذ مهمة الصيانة."
}
"title": "الصيانة"
},
"manager": {
"changingVersion": "تغيير الإصدار من {from} إلى {to}",
"createdBy": "تم الإنشاء بواسطة",
"dependencies": "التبعيات",
"discoverCommunityContent": "استكشف حزم العقد والامتدادات والمزيد من إبداعات المجتمع...",
"downloads": "التنزيلات",
"errorConnecting": "خطأ في الاتصال بسجل عقد Comfy.",
"failed": "فشل ({count})",
"filter": {
"disabled": "معطّل",
"enabled": "ممكّن",
"nodePack": "حزمة العقد"
},
"inWorkflow": "في سير العمل",
"infoPanelEmpty": "انقر على عنصر لعرض المعلومات",
"installAllMissingNodes": "تثبيت جميع العقد المفقودة",
"installSelected": "تثبيت المحدد",
"installationQueue": "قائمة التثبيت",
"lastUpdated": "آخر تحديث",
"latestVersion": "الأحدث",
"license": "الرخصة",
"loadingVersions": "جاري تحميل الإصدارات...",
"nightlyVersion": "ليلي",
"noDescription": "لا يوجد وصف متاح",
"noNodesFound": "لم يتم العثور على عقد",
"noNodesFoundDescription": "لم يمكن تحليل عقد الحزمة، أو أن الحزمة هي امتداد للواجهة فقط ولا تحتوي على أي عقد.",
"noResultsFound": "لم يتم العثور على نتائج مطابقة لبحثك.",
"nodePack": "حزمة العقد",
"packsSelected": "الحزم المحددة",
"repository": "المستودع",
"restartToApplyChanges": "لـتطبيق التغييرات، يرجى إعادة تشغيل ComfyUI",
"searchPlaceholder": "بحث",
"selectVersion": "اختر الإصدار",
"sort": {
"created": "الأحدث",
"downloads": "الأكثر شيوعاً",
"publisher": "الناشر",
"updated": "تم التحديث مؤخراً"
},
"status": {
"active": "نشط",
"banned": "محظور",
"deleted": "محذوف",
"flagged": "معلم",
"pending": "قيد الانتظار",
"unknown": "غير معروف"
},
"title": "مدير العقد المخصصة",
"totalNodes": "إجمالي العقد",
"tryAgainLater": "يرجى المحاولة مرة أخرى لاحقاً.",
"tryDifferentSearch": "يرجى تجربة استعلام بحث مختلف.",
"uninstall": "إلغاء التثبيت",
"uninstallSelected": "إلغاء تثبيت المحدد",
"uninstalling": "جاري إلغاء التثبيت",
"update": "تحديث",
"updatingAllPacks": "تحديث جميع الحزم",
"version": "الإصدار"
},
"maskEditor": {
"Apply to Whole Image": "تطبيق على كامل الصورة",
"Brush Settings": "إعدادات الفرشاة",
"Brush Shape": "شكل الفرشاة",
"Clear": "مسح",
"Color Select Settings": "إعدادات اختيار اللون",
"Fill Opacity": "شفافية التعبئة",
"Hardness": "الصلابة",
"Image Layer": "طبقة الصورة",
"Invert": "عكس",
"Layers": "الطبقات",
"Live Preview": "معاينة حية",
"Mask Layer": "طبقة القناع",
"Mask Opacity": "شفافية القناع",
"Mask Tolerance": "تسامح القناع",
"Method": "الطريقة",
"Opacity": "الشفافية",
"Paint Bucket Settings": "إعدادات دلو الطلاء",
"Reset to Default": "إعادة إلى الافتراضي",
"Selection Opacity": "شفافية التحديد",
"Smoothing Precision": "دقة التنعيم",
"Stop at mask": "التوقف عند القناع",
"Thickness": "السماكة",
"Tolerance": "التسامح"
},
"menu": {
"autoQueue": "الانتظار التلقائي",
"batchCount": "عدد الدُفعات",
"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": {
"About ComfyUI": "حول ComfyUI",
"Add Edit Model Step": "إضافة خطوة تعديل النموذج",
"Bottom Panel": "لوحة سفلية",
"Browse Templates": "تصفح القوالب",
"Bypass/Unbypass Selected Nodes": "تجاوز/إلغاء تجاوز العقد المحددة",
"Canvas Performance": "أداء اللوحة",
"Canvas Toggle Lock": "تبديل قفل اللوحة",
"Check for Updates": "التحقق من التحديثات",
"Clear Pending Tasks": "مسح المهام المعلقة",
"Clear Workflow": "مسح سير العمل",
"Clipspace": "مساحة القص",
"Close Current Workflow": "إغلاق سير العمل الحالي",
"Collapse/Expand Selected Nodes": "طي/توسيع العقد المحددة",
"Comfy-Org Discord": "ديسكورد Comfy-Org",
"ComfyUI Docs": "وثائق ComfyUI",
"ComfyUI Forum": "منتدى ComfyUI",
"ComfyUI Issues": "مشاكل ComfyUI",
"Contact Support": "الاتصال بالدعم",
"Convert Selection to Subgraph": "تحويل التحديد إلى رسم فرعي",
"Convert selected nodes to group node": "تحويل العقد المحددة إلى عقدة مجموعة",
"Decrease Brush Size in MaskEditor": "تقليل حجم الفرشاة في محرر القناع",
"Delete Selected Items": "حذف العناصر المحددة",
"Desktop User Guide": "دليل المستخدم لسطح المكتب",
"Duplicate Current Workflow": "نسخ سير العمل الحالي",
"Edit": "تحرير",
"Exit Subgraph": "الخروج من الرسم الفرعي",
"Export": "تصدير",
"Export (API)": "تصدير (API)",
"File": "ملف",
"Fit Group To Contents": "ملائمة المجموعة للمحتويات",
"Focus Mode": "وضع التركيز",
"Give Feedback": "تقديم ملاحظات",
"Group Selected Nodes": "تجميع العقد المحددة",
"Help": "مساعدة",
"Help Center": "مركز المساعدة",
"Increase Brush Size in MaskEditor": "زيادة حجم الفرشاة في محرر القناع",
"Interrupt": "إيقاف مؤقت",
"Load Default Workflow": "تحميل سير العمل الافتراضي",
"Manage group nodes": "إدارة عقد المجموعة",
"Manager": "المدير",
"Minimap": "خريطة مصغرة",
"Model Library": "مكتبة النماذج",
"Move Selected Nodes Down": "تحريك العقد المحددة للأسفل",
"Move Selected Nodes Left": "تحريك العقد المحددة لليسار",
"Move Selected Nodes Right": "تحريك العقد المحددة لليمين",
"Move Selected Nodes Up": "تحريك العقد المحددة للأعلى",
"Mute/Unmute Selected Nodes": "كتم/إلغاء كتم العقد المحددة",
"New": "جديد",
"Next Opened Workflow": "سير العمل التالي المفتوح",
"Node Library": "مكتبة العقد",
"Node Links": "روابط العقد",
"Open": "فتح",
"Open 3D Viewer (Beta) for Selected Node": "فتح عارض ثلاثي الأبعاد (بيتا) للعقدة المحددة",
"Open Custom Nodes Folder": "فتح مجلد العقد المخصصة",
"Open DevTools": "فتح أدوات المطور",
"Open Inputs Folder": "فتح مجلد المدخلات",
"Open Logs Folder": "فتح مجلد السجلات",
"Open Mask Editor for Selected Node": "فتح محرر القناع للعقدة المحددة",
"Open Models Folder": "فتح مجلد النماذج",
"Open Outputs Folder": "فتح مجلد المخرجات",
"Open Sign In Dialog": "فتح نافذة تسجيل الدخول",
"Open extra_model_paths_yaml": "فتح ملف extra_model_paths.yaml",
"Pin/Unpin Selected Items": "تثبيت/إلغاء تثبيت العناصر المحددة",
"Pin/Unpin Selected Nodes": "تثبيت/إلغاء تثبيت العقد المحددة",
"Previous Opened Workflow": "سير العمل السابق المفتوح",
"Queue Panel": "لوحة الانتظار",
"Queue Prompt": "قائمة انتظار التعليمات",
"Queue Prompt (Front)": "قائمة انتظار التعليمات (أمامي)",
"Queue Selected Output Nodes": "قائمة انتظار عقد المخرجات المحددة",
"Quit": "خروج",
"Redo": "إعادة",
"Refresh Node Definitions": "تحديث تعريفات العقد",
"Reinstall": "إعادة التثبيت",
"Reset View": "إعادة تعيين العرض",
"Resize Selected Nodes": "تغيير حجم العقد المحددة",
"Restart": "إعادة التشغيل",
"Save": "حفظ",
"Save As": "حفظ باسم",
"Show Keybindings Dialog": "عرض مربع حوار اختصارات لوحة المفاتيح",
"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 the Custom Nodes Manager Progress Bar": "تبديل شريط تقدم مدير العقد المخصصة",
"Undo": "تراجع",
"Ungroup selected group nodes": "فك تجميع عقد المجموعة المحددة",
"Unpack the selected Subgraph": "فك تجميع الرسم البياني الفرعي المحدد",
"Workflows": "سير العمل",
"Zoom In": "تكبير",
"Zoom Out": "تصغير",
"Zoom to fit": "تكبير لتناسب"
},
"minimap": {
"nodeColors": "ألوان العقد",
"renderBypassState": "عرض حالة التجاوز",
"renderErrorState": "عرض حالة الخطأ",
"showGroups": "إظهار الإطارات/المجموعات",
"showLinks": "إظهار الروابط"
},
"missingModelsDialog": {
"doNotAskAgain": "عدم العرض مرة أخرى",
@@ -1457,7 +1669,594 @@
"exportSettings": "إعدادات التصدير",
"modelSettings": "إعدادات النموذج"
},
"openIn3DViewer": "افتح في عارض ثلاثي الأبعاد"
"openIn3DViewer": "افتح في عارض ثلاثي الأبعاد",
"cuda-device": {
"name": "فهرس جهاز CUDA المستخدم"
},
"cuda-malloc": {
"name": "استخدام تخصيص الذاكرة CUDA malloc"
},
"default-hashing-function": {
"name": "دالة التجزئة الافتراضية لملفات النماذج"
},
"deterministic": {
"name": "جعل pytorch يستخدم خوارزميات حتمية أبطأ عندما يكون ذلك ممكنًا.",
"tooltip": "يرجى ملاحظة أن هذا قد لا يجعل الصور حتمية في جميع الحالات."
},
"directml": {
"name": "فهرس جهاز DirectML"
},
"disable-all-custom-nodes": {
"name": "تعطيل تحميل جميع العقد المخصصة."
},
"disable-ipex-optimize": {
"name": "تعطيل تحسين IPEX"
},
"disable-metadata": {
"name": "تعطيل حفظ بيانات وصف الطلب في الملفات."
},
"disable-smart-memory": {
"name": "تعطيل إدارة الذاكرة الذكية",
"tooltip": "إجبار ComfyUI على نقل النماذج إلى الذاكرة العشوائية بدلاً من إبقائها في ذاكرة الفيديو عند الإمكان."
},
"disable-xformers": {
"name": "تعطيل تحسين xFormers"
},
"dont-print-server": {
"name": "عدم طباعة مخرجات الخادم في وحدة التحكم."
},
"dont-upcast-attention": {
"name": "منع ترقية الانتباه"
},
"enable-cors-header": {
"name": "تمكين ترويسة CORS: استخدم \"*\" لجميع النطاقات أو حدد نطاقًا"
},
"fast": {
"name": "تمكين بعض التحسينات غير المختبرة والتي قد تؤثر على الجودة."
},
"force-channels-last": {
"name": "إجبار صيغة الذاكرة channels-last"
},
"force-upcast-attention": {
"name": "إجبار ترقية الانتباه"
},
"global-precision": {
"name": "الدقة العائمة العالمية",
"tooltip": "الدقة العائمة العالمية"
},
"input-directory": {
"name": "مجلد الإدخال"
},
"listen": {
"name": "المضيف: عنوان IP للاستماع عليه"
},
"log-level": {
"name": "مستوى تفصيل السجلات"
},
"max-upload-size": {
"name": "الحد الأقصى لحجم التحميل (ميجابايت)"
},
"output-directory": {
"name": "مجلد الإخراج"
},
"port": {
"name": "المنفذ: المنفذ للاستماع عليه"
},
"preview-method": {
"name": "الطريقة المستخدمة للمعاينات الخفية"
},
"preview-size": {
"name": "حجم صور المعاينة"
},
"reserve-vram": {
"name": "ذاكرة الفيديو المحجوزة (جيجابايت)",
"tooltip": "حدد كمية ذاكرة الفيديو (جيجابايت) التي تريد حجزها لاستخدام نظام التشغيل/البرامج الأخرى. بشكل افتراضي يتم حجز كمية معينة حسب نظام التشغيل."
},
"text-encoder-precision": {
"name": "دقة مشفر النص",
"tooltip": "دقة مشفر النص"
},
"tls-certfile": {
"name": "ملف شهادة TLS: مسار ملف شهادة TLS للـ HTTPS"
},
"tls-keyfile": {
"name": "ملف مفتاح TLS: مسار ملف مفتاح TLS للـ HTTPS"
},
"unet-precision": {
"name": "دقة UNET",
"tooltip": "دقة UNET"
},
"vae-precision": {
"name": "دقة VAE",
"tooltip": "دقة VAE"
},
"vram-management": {
"name": "وضع إدارة ذاكرة الفيديو (VRAM)"
}
},
"serverStart": {
"openLogs": "فتح السجلات",
"process": {
"error": "غير قادر على بدء ComfyUI Desktop",
"initial-state": "جارٍ التحميل...",
"python-setup": "جارٍ إعداد بيئة بايثون...",
"ready": "جارٍ الانتهاء...",
"starting-server": "جارٍ بدء خادم ComfyUI..."
},
"reportIssue": "الإبلاغ عن مشكلة",
"showTerminal": "إظهار الطرفية",
"troubleshoot": "استكشاف الأخطاء"
},
"settingsCategories": {
"3D": "ثلاثي الأبعاد",
"3DViewer": "عارض ثلاثي الأبعاد",
"API Nodes": "عقد API",
"About": "حول",
"Appearance": "المظهر",
"BrushAdjustment": "تعديل الفرشاة",
"Camera": "الكاميرا",
"Canvas": "اللوحة",
"ColorPalette": "لوحة الألوان",
"Comfy": "كومفي",
"Comfy-Desktop": "كومفي-سطح المكتب",
"ContextMenu": "القائمة السياقية",
"Credits": "الشكر",
"CustomColorPalettes": "لوحات ألوان مخصصة",
"DevMode": "وضع المطور",
"EditTokenWeight": "تعديل وزن الرمز",
"Extension": "الإضافة",
"General": "عام",
"Graph": "الرسم البياني",
"Group": "المجموعة",
"Keybinding": "اختصارات لوحة المفاتيح",
"Light": "الإضاءة",
"Link": "الرابط",
"LinkRelease": "إصدار الرابط",
"LiteGraph": "الرسم البياني الخفيف",
"Load 3D": "تحميل ثلاثي الأبعاد",
"Locale": "اللغة",
"Mask Editor": "محرر القناع",
"Menu": "القائمة",
"ModelLibrary": "مكتبة النماذج",
"NewEditor": "المحرر الجديد",
"Node": "العقدة",
"Node Search Box": "مربع بحث العقد",
"Node Widget": "أداة العقدة",
"NodeLibrary": "مكتبة العقد",
"Notification Preferences": "تفضيلات الإشعارات",
"Pointer": "المؤشر",
"Queue": "قائمة الانتظار",
"QueueButton": "زر قائمة الانتظار",
"Reroute": "إعادة التوجيه",
"RerouteBeta": "إعادة توجيه بيتا",
"Scene": "المشهد",
"Server": "الخادم",
"Server-Config": "إعدادات الخادم",
"Settings": "الإعدادات",
"Sidebar": "الشريط الجانبي",
"Tree Explorer": "مستكشف الشجرة",
"UV": "إحداثيات UV",
"User": "المستخدم",
"Validation": "التحقق",
"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": "إنشاء سير عمل جديد فارغ",
"nodeLibrary": "مكتبة العقد",
"nodeLibraryTab": {
"groupBy": "التجميع حسب",
"groupStrategies": {
"category": "الفئة",
"categoryDesc": "التجميع حسب فئة العقد",
"module": "الوحدة",
"moduleDesc": "التجميع حسب مصدر الوحدة",
"source": "المصدر",
"sourceDesc": "التجميع حسب نوع المصدر (أساسي، مخصص، API)"
},
"resetView": "إعادة تعيين العرض إلى الافتراضي",
"sortBy": {
"alphabetical": "أبجدي",
"alphabeticalDesc": "الفرز أبجدياً داخل المجموعات",
"original": "الأصلي",
"originalDesc": "الاحتفاظ بالترتيب الأصلي"
},
"sortMode": "طريقة الفرز"
},
"openWorkflow": "فتح سير العمل من نظام الملفات المحلي",
"queue": "قائمة الانتظار",
"queueTab": {
"backToAllTasks": "العودة إلى جميع المهام",
"clearPendingTasks": "مسح المهام المعلقة",
"containImagePreview": "ملء معاينة الصورة",
"coverImagePreview": "تكييف معاينة الصورة",
"filter": "تصفية النتائج",
"filters": {
"hideCached": "إخفاء المخزنة مؤقتًا",
"hideCanceled": "إخفاء الملغاة"
},
"showFlatList": "عرض القائمة المسطحة"
},
"templates": "القوالب",
"workflowTab": {
"confirmDelete": "هل أنت متأكد من رغبتك في حذف هذا السير؟",
"confirmDeleteTitle": "حذف سير العمل؟",
"confirmOverwrite": "الملف أدناه موجود بالفعل. هل تريد الكتابة فوقه؟",
"confirmOverwriteTitle": "الكتابة فوق الملف الموجود؟",
"deleteFailed": "فشل محاولة حذف سير العمل.",
"deleteFailedTitle": "فشل الحذف",
"deleted": "تم حذف سير العمل",
"dirtyClose": "تم تعديل الملفات أدناه. هل تريد حفظها قبل الإغلاق؟",
"dirtyCloseHint": "اضغط Shift للإغلاق بدون تنبيه",
"dirtyCloseTitle": "حفظ التغييرات؟",
"workflowTreeType": {
"bookmarks": "العلامات",
"browse": "تصفح",
"open": "فتح"
}
},
"workflows": "سير العمل"
},
"tabMenu": {
"addToBookmarks": "إضافة إلى العلامات",
"closeOtherTabs": "إغلاق التبويبات الأخرى",
"closeTab": "إغلاق التبويب",
"closeTabsToLeft": "إغلاق التبويبات إلى اليسار",
"closeTabsToRight": "إغلاق التبويبات إلى اليمين",
"duplicateTab": "تكرار التبويب",
"removeFromBookmarks": "إزالة من العلامات"
},
"templateWorkflows": {
"category": {
"3D": "ثلاثي الأبعاد",
"All": "كل القوالب",
"Area Composition": "تكوين المنطقة",
"Audio": "صوت",
"Basics": "أساسيات",
"ComfyUI Examples": "أمثلة ComfyUI",
"ControlNet": "كونترول نت",
"Custom Nodes": "عُقد مخصصة",
"Flux": "فلوكس",
"Image": "صورة",
"Image API": "واجهة برمجة تطبيقات الصور",
"LLM API": "واجهة برمجة تطبيقات نماذج اللغة الكبيرة",
"Upscaling": "تحسين الجودة",
"Video": "فيديو",
"Video API": "واجهة برمجة تطبيقات الفيديو"
},
"loadingMore": "تحميل المزيد من القوالب...",
"searchPlaceholder": "ابحث في القوالب...",
"template": {
"3D": {
"3d_hunyuan3d_image_to_model": "Hunyuan3D 2.0",
"3d_hunyuan3d_multiview_to_model": "Hunyuan3D 2.0 MV",
"3d_hunyuan3d_multiview_to_model_turbo": "Hunyuan3D 2.0 MV Turbo",
"stable_zero123_example": "Stable Zero123"
},
"3D API": {
"api_rodin_image_to_model": "Rodin: من صورة إلى نموذج",
"api_rodin_multiview_to_model": "Rodin: من عدة زوايا إلى نموذج",
"api_tripo_image_to_model": "Tripo: من صورة إلى نموذج",
"api_tripo_multiview_to_model": "Tripo: من عدة زوايا إلى نموذج",
"api_tripo_text_to_model": "Tripo: من نص إلى نموذج"
},
"Area Composition": {
"area_composition": "تكوين المناطق",
"area_composition_square_area_for_subject": "تكوين المناطق - مربع الموضوع"
},
"Audio": {
"audio_ace_step_1_m2m_editing": "ACE-Step v1 تحرير M2M",
"audio_ace_step_1_t2a_instrumentals": "ACE-Step v1 من نص إلى موسيقى آلية",
"audio_ace_step_1_t2a_song": "ACE-Step v1 من نص إلى أغنية",
"audio_stable_audio_example": "Stable Audio"
},
"Basics": {
"default": "توليد الصور",
"embedding_example": "تضمين",
"gligen_textbox_example": "صندوق نص Gligen",
"image2image": "صورة إلى صورة",
"inpaint_example": "إعادة التلوين",
"inpaint_model_outpainting": "التوسيع",
"lora": "LoRA",
"lora_multiple": "عدة LoRA"
},
"ControlNet": {
"2_pass_pose_worship": "ControlNet الوضعية مرورين",
"controlnet_example": "ControlNet الرسومات التخطيطية",
"depth_controlnet": "ControlNet العمق",
"depth_t2i_adapter": "محول T2I للعمق",
"mixing_controlnets": "دمج ControlNet"
},
"Flux": {
"flux_canny_model_example": "نموذج Flux كاني",
"flux_depth_lora_example": "عمق Flux LoRA",
"flux_dev_checkpoint_example": "Flux تطوير fp8",
"flux_dev_full_text_to_image": "Flux تطوير كامل من نص إلى صورة",
"flux_fill_inpaint_example": "Flux إعادة تلوين",
"flux_fill_outpaint_example": "Flux توسيع",
"flux_kontext_dev_basic": "Flux Kontext تطوير (أساسي)",
"flux_kontext_dev_grouped": "Flux Kontext تطوير (مجموعات)",
"flux_redux_model_example": "نموذج Flux Redux",
"flux_schnell": "Flux سريع fp8",
"flux_schnell_full_text_to_image": "Flux سريع كامل من نص إلى صورة"
},
"Image": {
"hidream_e1_full": "HiDream E1 كامل",
"hidream_i1_dev": "HiDream I1 تطوير",
"hidream_i1_fast": "HiDream I1 سريع",
"hidream_i1_full": "HiDream I1 كامل",
"image_chroma_text_to_image": "Chroma من نص إلى صورة",
"image_cosmos_predict2_2B_t2i": "Cosmos Predict2 2B من نص إلى صورة",
"image_lotus_depth_v1_1": "Lotus عمق",
"image_omnigen2_image_edit": "OmniGen2 تعديل الصور",
"image_omnigen2_t2i": "OmniGen2 من نص إلى صورة",
"sd3_5_large_blur": "SD3.5 ضباب كبير",
"sd3_5_large_canny_controlnet_example": "SD3.5 كاني كبير مع ControlNet",
"sd3_5_large_depth": "SD3.5 عمق كبير",
"sd3_5_simple_example": "SD3.5 بسيط",
"sdxl_refiner_prompt_example": "SDXL تحسين العبارات",
"sdxl_revision_text_prompts": "SDXL مراجعة العبارات النصية",
"sdxl_revision_zero_positive": "SDXL مراجعة صفر إيجابي",
"sdxl_simple_example": "SDXL بسيط",
"sdxlturbo_example": "SDXL Turbo"
},
"Image API": {
"api_bfl_flux_1_kontext_max_image": "BFL Flux.1 Kontext ماكس",
"api_bfl_flux_1_kontext_multiple_images_input": "BFL Flux.1 Kontext إدخال صور متعددة",
"api_bfl_flux_1_kontext_pro_image": "BFL Flux.1 Kontext برو",
"api_bfl_flux_pro_t2i": "BFL Flux[Pro]: من نص إلى صورة",
"api_ideogram_v3_t2i": "Ideogram V3: من نص إلى صورة",
"api_luma_photon_i2i": "Luma Photon: من صورة إلى صورة",
"api_luma_photon_style_ref": "Luma Photon: مرجع الأسلوب",
"api_openai_dall_e_2_inpaint": "OpenAI: Dall-E 2 إعادة التلوين",
"api_openai_dall_e_2_t2i": "OpenAI: Dall-E 2 من نص إلى صورة",
"api_openai_dall_e_3_t2i": "OpenAI: Dall-E 3 من نص إلى صورة",
"api_openai_image_1_i2i": "OpenAI: GPT-Image-1 من صورة إلى صورة",
"api_openai_image_1_inpaint": "OpenAI: GPT-Image-1 إعادة التلوين",
"api_openai_image_1_multi_inputs": "OpenAI: GPT-Image-1 مدخلات متعددة",
"api_openai_image_1_t2i": "OpenAI: GPT-Image-1 من نص إلى صورة",
"api_recraft_image_gen_with_color_control": "Recraft: توليد الصور مع تحكم اللون",
"api_recraft_image_gen_with_style_control": "Recraft: توليد الصور مع تحكم الأسلوب",
"api_recraft_vector_gen": "Recraft: توليد المتجهات",
"api_runway_reference_to_image": "Runway: من مرجع إلى صورة",
"api_runway_text_to_image": "Runway: من نص إلى صورة",
"api_stability_ai_i2i": "Stability AI: من صورة إلى صورة",
"api_stability_ai_sd3_5_i2i": "Stability AI: SD3.5 من صورة إلى صورة",
"api_stability_ai_sd3_5_t2i": "Stability AI: SD3.5 من نص إلى صورة",
"api_stability_ai_stable_image_ultra_t2i": "Stability AI: صورة مستقرة ألترا من نص إلى صورة"
},
"LLM API": {
"api_google_gemini": "Google Gemini: محادثة",
"api_openai_chat": "OpenAI: محادثة"
},
"Upscaling": {
"esrgan_example": "ESRGAN",
"hiresfix_esrgan_workflow": "HiresFix ESRGAN سير العمل",
"hiresfix_latent_workflow": "تكبير",
"latent_upscale_different_prompt_model": "تكبير كامن مع نموذج عبارات مختلف"
},
"Video": {
"hunyuan_video_text_to_video": "Hunyuan فيديو نص إلى فيديو",
"image_to_video": "SVD من صورة إلى فيديو",
"image_to_video_wan": "Wan 2.1 من صورة إلى فيديو",
"ltxv_image_to_video": "LTXV من صورة إلى فيديو",
"ltxv_text_to_video": "LTXV من نص إلى فيديو",
"mochi_text_to_video_example": "Mochi من نص إلى فيديو",
"text_to_video_wan": "Wan 2.1 من نص إلى فيديو",
"txt_to_image_to_video": "SVD من نص إلى صورة إلى فيديو",
"video_cosmos_predict2_2B_video2world_480p_16fps": "Cosmos Predict2 2B فيديو إلى العالم 480p 16fps",
"video_wan2_1_fun_camera_v1_1_14B": "Wan 2.1 كاميرا ممتعة 14B",
"video_wan2_1_fun_camera_v1_1_1_3B": "Wan 2.1 كاميرا ممتعة 1.3B",
"video_wan_vace_14B_ref2v": "Wan VACE من المرجع إلى فيديو",
"video_wan_vace_14B_t2v": "Wan VACE من نص إلى فيديو",
"video_wan_vace_14B_v2v": "Wan VACE فيديو تحكم",
"video_wan_vace_flf2v": "Wan VACE الإطار الأول والأخير",
"video_wan_vace_inpainting": "Wan VACE إعادة التلوين الداخلي",
"video_wan_vace_outpainting": "Wan VACE التوسيع الخارجي",
"wan2_1_flf2v_720_f16": "Wan 2.1 FLF2V 720p F16",
"wan2_1_fun_control": "Wan 2.1 تحكم نت",
"wan2_1_fun_inp": "Wan 2.1 إعادة التلوين"
},
"Video API": {
"api_hailuo_minimax_i2v": "MiniMax: من صورة إلى فيديو",
"api_hailuo_minimax_t2v": "MiniMax: من نص إلى فيديو",
"api_kling_effects": "Kling: تأثيرات الفيديو",
"api_kling_flf": "Kling: FLF2V",
"api_kling_i2v": "Kling: من صورة إلى فيديو",
"api_luma_i2v": "Luma: من صورة إلى فيديو",
"api_luma_t2v": "Luma: من نص إلى فيديو",
"api_moonvalley_image_to_video": "Moonvalley: من صورة إلى فيديو",
"api_moonvalley_text_to_video": "Moonvalley: من نص إلى فيديو",
"api_pika_i2v": "Pika: من صورة إلى فيديو",
"api_pika_scene": "Pika المشاهد: من صور إلى فيديو",
"api_pixverse_i2v": "PixVerse: من صورة إلى فيديو",
"api_pixverse_t2v": "PixVerse: من نص إلى فيديو",
"api_pixverse_template_i2v": "PixVerse القوالب: من صورة إلى فيديو",
"api_runway_first_last_frame": "Runway: الإطار الأول والأخير إلى فيديو",
"api_runway_gen3a_turbo_image_to_video": "Runway: Gen3a Turbo من صورة إلى فيديو",
"api_runway_gen4_turo_image_to_video": "Runway: Gen4 Turbo من صورة إلى فيديو",
"api_veo2_i2v": "Veo2: من صورة إلى فيديو"
}
},
"templateDescription": {
"3D": {
"3d_hunyuan3d_image_to_model": "إنشاء نماذج ثلاثية الأبعاد من صور فردية باستخدام Hunyuan3D 2.0.",
"3d_hunyuan3d_multiview_to_model": "إنشاء نماذج ثلاثية الأبعاد من عدة زوايا باستخدام Hunyuan3D 2.0 MV.",
"3d_hunyuan3d_multiview_to_model_turbo": "إنشاء نماذج ثلاثية الأبعاد من عدة زوايا باستخدام Hunyuan3D 2.0 MV Turbo.",
"stable_zero123_example": "إنشاء مشاهد ثلاثية الأبعاد من صور فردية باستخدام Stable Zero123."
},
"3D API": {
"api_rodin_image_to_model": "إنشاء نماذج ثلاثية الأبعاد مفصلة من صور فردية باستخدام Rodin AI.",
"api_rodin_multiview_to_model": "نحت نماذج ثلاثية الأبعاد شاملة باستخدام إعادة بناء متعددة الزوايا من Rodin.",
"api_tripo_image_to_model": "إنشاء أصول ثلاثية الأبعاد احترافية من صور ثنائية الأبعاد باستخدام محرك Tripo.",
"api_tripo_multiview_to_model": "بناء نماذج ثلاثية الأبعاد من عدة زوايا باستخدام ماسح Tripo المتقدم.",
"api_tripo_text_to_model": "تصميم أشياء ثلاثية الأبعاد من الوصف النصي باستخدام نمذجة Tripo المدفوعة بالنص."
},
"Area Composition": {
"area_composition": "إنشاء صور عبر التحكم في التكوين ضمن مناطق محددة.",
"area_composition_square_area_for_subject": "إنشاء صور بوضع ثابت للموضوع باستخدام تكوين المناطق."
},
"Audio": {
"audio_ace_step_1_m2m_editing": "تحرير الأغاني الموجودة لتغيير الأسلوب والكلمات باستخدام ACE-Step v1 M2M.",
"audio_ace_step_1_t2a_instrumentals": "إنشاء موسيقى آلية من نصوص باستخدام ACE-Step v1.",
"audio_ace_step_1_t2a_song": "إنشاء أغاني بصوت غنائي من نصوص مع دعم التعدد اللغوي وتخصيص الأسلوب باستخدام ACE-Step v1.",
"audio_stable_audio_example": "إنشاء صوت من نصوص باستخدام Stable Audio."
},
"Basics": {
"default": "إنشاء صور من نصوص الإرشادات.",
"embedding_example": "إنشاء صور باستخدام الانعكاس النصي لأنماط متسقة.",
"gligen_textbox_example": "إنشاء صور مع وضع دقيق للأشياء باستخدام مربعات النص.",
"image2image": "تحويل الصور الموجودة باستخدام نصوص الإرشادات.",
"inpaint_example": "تعديل أجزاء محددة من الصور بسلاسة.",
"inpaint_model_outpainting": "تمديد الصور خارج حدودها الأصلية.",
"lora": "إنشاء صور باستخدام نماذج LoRA لأنماط أو مواضيع متخصصة.",
"lora_multiple": "إنشاء صور عبر دمج عدة نماذج LoRA."
},
"ControlNet": {
"2_pass_pose_worship": "إنشاء صور موجهة بإشارات وضعية باستخدام ControlNet.",
"controlnet_example": "إنشاء صور موجهة برموز مرجعية مرسومة باستخدام ControlNet.",
"depth_controlnet": "إنشاء صور موجهة بمعلومات العمق باستخدام ControlNet.",
"depth_t2i_adapter": "إنشاء صور موجهة بمعلومات العمق باستخدام محول T2I.",
"mixing_controlnets": "إنشاء صور بدمج عدة نماذج ControlNet."
},
"Flux": {
"flux_canny_model_example": "إنشاء صور موجهة بالكشف عن الحواف باستخدام Flux Canny.",
"flux_depth_lora_example": "إنشاء صور موجهة بمعلومات العمق باستخدام Flux LoRA.",
"flux_dev_checkpoint_example": "إنشاء صور باستخدام نسخة Flux Dev fp8 المضغوطة. مناسبة لأجهزة ذات VRAM محدود، تتطلب ملف نموذج واحد فقط، لكن جودة الصورة أقل قليلاً من النسخة الكاملة.",
"flux_dev_full_text_to_image": "إنشاء صور عالية الجودة مع نسخة Flux Dev الكاملة. تحتاج VRAM أكبر وعدة ملفات نموذج، لكنها توفر أفضل قدرة على اتباع النص وجودة الصور.",
"flux_fill_inpaint_example": "ملء أجزاء مفقودة من الصور باستخدام Flux inpainting.",
"flux_fill_outpaint_example": "تمديد الصور خارج الحدود باستخدام Flux outpainting.",
"flux_kontext_dev_basic": "تعديل الصور باستخدام Flux Kontext مع رؤية كاملة للعُقد، مثالي لتعلم سير العمل.",
"flux_kontext_dev_grouped": "نسخة مبسطة من Flux Kontext مع عُقد مجمعة لمساحة عمل أنظف.",
"flux_redux_model_example": "إنشاء صور عبر نقل الأسلوب من صور مرجعية باستخدام Flux Redux.",
"flux_schnell": "إنشاء صور بسرعة مع نسخة Flux Schnell fp8 المضغوطة. مثالية للأجهزة منخفضة الأداء، تتطلب 4 خطوات فقط لإنشاء الصور.",
"flux_schnell_full_text_to_image": "إنشاء صور بسرعة مع نسخة Flux Schnell الكاملة. تستخدم ترخيص Apache2.0، تحتاج 4 خطوات فقط مع جودة صور جيدة."
},
"Image": {
"hidream_e1_full": "تحرير الصور مع HiDream E1 - نموذج احترافي لتحرير الصور باستخدام اللغة الطبيعية.",
"hidream_i1_dev": "إنشاء صور مع HiDream I1 Dev - نسخة متوازنة مع 28 خطوة استدلال، مناسبة لأجهزة متوسطة الأداء.",
"hidream_i1_fast": "إنشاء صور بسرعة مع HiDream I1 Fast - نسخة خفيفة مع 16 خطوة استدلال، مثالية للمعاينات السريعة على أجهزة منخفضة الأداء.",
"hidream_i1_full": "إنشاء صور مع HiDream I1 Full - نسخة كاملة مع 50 خطوة استدلال لأعلى جودة.",
"image_chroma_text_to_image": "Chroma معدلة من Flux وتحوي بعض التغييرات في البنية.",
"image_cosmos_predict2_2B_t2i": "إنشاء صور باستخدام Cosmos-Predict2 2B T2I بدقة فيزيائية عالية وتفاصيل غنية.",
"image_lotus_depth_v1_1": "تشغيل Lotus Depth في ComfyUI لتقدير عمق أحادي بدون تدريب مسبق مع احتفاظ عالي بالتفاصيل.",
"image_omnigen2_image_edit": "تحرير الصور باستخدام تعليمات اللغة الطبيعية مع دعم متقدم للصور والنصوص في OmniGen2.",
"image_omnigen2_t2i": "إنشاء صور عالية الجودة من نصوص باستخدام نموذج OmniGen2 الموحد متعدد الأنماط 7B ذو البنية ذات المسارين.",
"sd3_5_large_blur": "إنشاء صور موجهة باستخدام صور مرجعية ضبابية باستخدام SD 3.5.",
"sd3_5_large_canny_controlnet_example": "إنشاء صور موجهة بالكشف عن الحواف باستخدام SD 3.5 Canny ControlNet.",
"sd3_5_large_depth": "إنشاء صور موجهة بمعلومات العمق باستخدام SD 3.5.",
"sd3_5_simple_example": "إنشاء صور باستخدام SD 3.5.",
"sdxl_refiner_prompt_example": "تحسين صور SDXL باستخدام نماذج التكرير.",
"sdxl_revision_text_prompts": "إنشاء صور بنقل مفاهيم من صور مرجعية باستخدام SDXL Revision.",
"sdxl_revision_zero_positive": "إنشاء صور باستخدام نصوص وصور مرجعية مع SDXL Revision.",
"sdxl_simple_example": "إنشاء صور عالية الجودة باستخدام SDXL.",
"sdxlturbo_example": "إنشاء صور في خطوة واحدة باستخدام SDXL Turbo."
},
"Image API": {
"api_bfl_flux_1_kontext_max_image": "تعديل الصور باستخدام Flux.1 Kontext max image.",
"api_bfl_flux_1_kontext_multiple_images_input": "إدخال عدة صور وتعديلها باستخدام Flux.1 Kontext.",
"api_bfl_flux_1_kontext_pro_image": "تعديل الصور باستخدام Flux.1 Kontext pro image.",
"api_bfl_flux_pro_t2i": "إنشاء صور مع اتباع ممتاز للنص وجودة بصرية باستخدام FLUX.1 Pro.",
"api_ideogram_v3_t2i": "إنشاء صور ذات جودة احترافية مع محاذاة ممتازة للنص، الواقعية الفوتوغرافية، ودعم النصوص باستخدام Ideogram V3.",
"api_luma_photon_i2i": "توجيه إنشاء الصور باستخدام مزيج من الصور والنص.",
"api_luma_photon_style_ref": "إنشاء صور بدمج مرجعيات الأسلوب مع تحكم دقيق باستخدام Luma Photon.",
"api_openai_dall_e_2_inpaint": "تعديل الصور باستخدام تقنيات inpainting مع OpenAI Dall-E 2 API.",
"api_openai_dall_e_2_t2i": "إنشاء صور من نصوص باستخدام OpenAI Dall-E 2 API.",
"api_openai_dall_e_3_t2i": "إنشاء صور من نصوص باستخدام OpenAI Dall-E 3 API.",
"api_openai_image_1_i2i": "إنشاء صور من صور مدخلة باستخدام OpenAI GPT Image 1 API.",
"api_openai_image_1_inpaint": "تعديل الصور باستخدام تقنيات inpainting مع OpenAI GPT Image 1 API.",
"api_openai_image_1_multi_inputs": "إنشاء صور من مدخلات متعددة باستخدام OpenAI GPT Image 1 API.",
"api_openai_image_1_t2i": "إنشاء صور من نصوص باستخدام OpenAI GPT Image 1 API.",
"api_recraft_image_gen_with_color_control": "إنشاء صور مع لوحات ألوان مخصصة ومرئيات خاصة بالعلامة التجارية باستخدام Recraft.",
"api_recraft_image_gen_with_style_control": "التحكم في الأسلوب باستخدام أمثلة بصرية، محاذاة المواقع، وضبط دقيق للكائنات. تخزين ومشاركة الأنماط لضمان تناسق العلامة التجارية.",
"api_recraft_vector_gen": "إنشاء صور فيكتور عالية الجودة من نصوص باستخدام مولد الفكتور AI الخاص بـ Recraft.",
"api_runway_reference_to_image": "إنشاء صور جديدة بناءً على أنماط وتراكيب مرجعية باستخدام Runway AI.",
"api_runway_text_to_image": "إنشاء صور عالية الجودة من نصوص باستخدام نموذج Runway AI.",
"api_stability_ai_i2i": "تحويل الصور مع إنشاء عالي الجودة باستخدام Stability AI، مثالي للتحرير المهني ونقل الأسلوب.",
"api_stability_ai_sd3_5_i2i": "إنشاء صور عالية الجودة مع اتباع ممتاز للنص. مثالي للاستخدامات المهنية بدقة 1 ميجابكسل.",
"api_stability_ai_sd3_5_t2i": "إنشاء صور عالية الجودة مع اتباع ممتاز للنص. مثالي للاستخدامات المهنية بدقة 1 ميجابكسل.",
"api_stability_ai_stable_image_ultra_t2i": "إنشاء صور عالية الجودة مع اتباع ممتاز للنص. مثالي للاستخدامات المهنية بدقة 1 ميجابكسل."
},
"LLM API": {
"api_google_gemini": "اختبر الذكاء الاصطناعي متعدد الوسائط من Google مع قدرات التفكير لدى Gemini.",
"api_openai_chat": "التفاعل مع نماذج اللغة المتقدمة من OpenAI للمحادثات الذكية."
},
"Upscaling": {
"esrgan_example": "تكبير الصور باستخدام نماذج ESRGAN لتعزيز الجودة.",
"hiresfix_esrgan_workflow": "تكبير الصور باستخدام نماذج ESRGAN خلال خطوات التوليد الوسيطة.",
"hiresfix_latent_workflow": "تكبير الصور بتحسين الجودة في الفضاء الكامن.",
"latent_upscale_different_prompt_model": "تكبير الصور مع تغيير العبارات المستخدمة عبر مراحل التوليد."
},
"Video": {
"hunyuan_video_text_to_video": "إنشاء فيديوهات من نصوص باستخدام نموذج Hunyuan.",
"image_to_video": "إنشاء فيديوهات من صور ثابتة.",
"image_to_video_wan": "إنشاء فيديوهات من صور باستخدام Wan 2.1.",
"ltxv_image_to_video": "إنشاء فيديوهات من صور ثابتة.",
"ltxv_text_to_video": "إنشاء فيديوهات من نصوص.",
"mochi_text_to_video_example": "إنشاء فيديوهات من نصوص باستخدام نموذج Mochi.",
"text_to_video_wan": "إنشاء فيديوهات من نصوص باستخدام Wan 2.1.",
"txt_to_image_to_video": "إنشاء فيديوهات عن طريق إنشاء صور من النصوص أولاً.",
"video_cosmos_predict2_2B_video2world_480p_16fps": "إنشاء فيديوهات باستخدام Cosmos-Predict2 2B Video2World، بإنتاج محاكاة فيديو بدقة فيزيائية عالية وجودة فائقة ومتسقة.",
"video_wan2_1_fun_camera_v1_1_14B": "إنشاء فيديوهات عالية الجودة مع تحكم متقدم بالكاميرا باستخدام النموذج الكامل 14B.",
"video_wan2_1_fun_camera_v1_1_1_3B": "إنشاء فيديوهات ديناميكية مع حركات كاميرا سينمائية باستخدام نموذج Wan 2.1 Fun Camera 1.3B.",
"video_wan_vace_14B_ref2v": "إنشاء فيديوهات تطابق أسلوب ومحتوى صورة مرجعية. مثالي لإنشاء فيديوهات متناسقة الأسلوب.",
"video_wan_vace_14B_t2v": "تحويل أوصاف نصية إلى فيديوهات عالية الجودة. يدعم دقة 480p و720p مع نموذج VACE-14B.",
"video_wan_vace_14B_v2v": "إنشاء فيديوهات بالتحكم في فيديوهات الإدخال والصور المرجعية باستخدام Wan VACE.",
"video_wan_vace_flf2v": "إنشاء انتقالات فيديو سلسة عبر تحديد الإطارات الأولى والأخيرة. يدعم تسلسل إطارات مفتاحية مخصصة.",
"video_wan_vace_inpainting": "تعديل مناطق محددة في الفيديو مع الحفاظ على المحتوى المحيط. مثالي لإزالة أو استبدال الأجسام.",
"video_wan_vace_outpainting": "إنشاء فيديوهات ممتدة عبر توسيع حجم الفيديو باستخدام Wan VACE outpainting.",
"wan2_1_flf2v_720_f16": "إنشاء فيديوهات بالتحكم في الإطارات الأولى والأخيرة باستخدام Wan 2.1 FLF2V.",
"wan2_1_fun_control": "إنشاء فيديوهات موجهة بالتحكم بالوضع، العمق، والحواف باستخدام Wan 2.1 ControlNet.",
"wan2_1_fun_inp": "إنشاء فيديوهات من الإطارات الأولى والأخيرة باستخدام Wan 2.1 inpainting."
},
"Video API": {
"api_hailuo_minimax_i2v": "إنشاء فيديوهات مصقولة من الصور والنصوص مع دمج CGI باستخدام MiniMax.",
"api_hailuo_minimax_t2v": "إنشاء فيديوهات عالية الجودة مباشرة من نصوص. استكشف قدرات MiniMax المتقدمة لإنشاء سرد بصري متنوع مع تأثيرات CGI احترافية وعناصر أسلوبية لإحياء وصفك.",
"api_kling_effects": "إنشاء فيديوهات ديناميكية بتطبيق تأثيرات بصرية على الصور باستخدام Kling.",
"api_kling_flf": "إنشاء فيديوهات عبر التحكم في الإطارات الأولى والأخيرة.",
"api_kling_i2v": "إنشاء فيديوهات مع اتباع ممتاز للنصوص للحركات والتعابير وحركات الكاميرا باستخدام Kling.",
"api_luma_i2v": "تحويل الصور الثابتة إلى رسوم متحركة عالية الجودة بشكل فوري.",
"api_luma_t2v": "يمكن إنشاء فيديوهات عالية الجودة باستخدام نصوص بسيطة.",
"api_moonvalley_image_to_video": "إنشاء فيديوهات سينمائية بدقة 1080p من صور عبر نموذج مدرب حصريًا على بيانات مرخصة.",
"api_moonvalley_text_to_video": "إنشاء فيديوهات سينمائية بدقة 1080p من نصوص عبر نموذج مدرب حصريًا على بيانات مرخصة.",
"api_pika_i2v": "إنشاء فيديوهات متحركة سلسة من صورة ثابتة واحدة باستخدام Pika AI.",
"api_pika_scene": "إنشاء فيديوهات تدمج عدة صور مدخلة باستخدام Pika Scenes.",
"api_pixverse_i2v": "إنشاء فيديوهات ديناميكية من الصور الثابتة مع الحركة والتأثيرات باستخدام PixVerse.",
"api_pixverse_t2v": "إنشاء فيديوهات مع تفسير دقيق للنصوص وديناميكية فيديو مذهلة.",
"api_pixverse_template_i2v": "إنشاء فيديوهات ديناميكية من الصور الثابتة مع الحركة والتأثيرات باستخدام PixVerse.",
"api_runway_first_last_frame": "إنشاء انتقالات فيديو سلسة بين إطارين رئيسيين بدقة Runway.",
"api_runway_gen3a_turbo_image_to_video": "إنشاء فيديوهات سينمائية من صور ثابتة باستخدام Runway Gen3a Turbo.",
"api_runway_gen4_turo_image_to_video": "إنشاء فيديوهات ديناميكية من الصور باستخدام Runway Gen4 Turbo.",
"api_veo2_i2v": "إنشاء فيديوهات من الصور باستخدام Google Veo2 API."
}
},
"title": "ابدأ باستخدام قالب"
},
"toastMessages": {
"nothingToQueue": "لا يوجد شيء للإضافة إلى الطابور",

View File

@@ -182,6 +182,9 @@
"Comfy_OpenClipspace": {
"label": "Clipspace"
},
"Comfy_OpenManagerDialog": {
"label": "Manager"
},
"Comfy_OpenWorkflow": {
"label": "Open Workflow"
},
@@ -209,6 +212,12 @@
"Comfy_ShowSettingsDialog": {
"label": "Show Settings Dialog"
},
"Comfy_ToggleCanvasInfo": {
"label": "Canvas Performance"
},
"Comfy_ToggleHelpCenter": {
"label": "Help Center"
},
"Comfy_ToggleTheme": {
"label": "Toggle Theme (Dark/Light)"
},

View File

@@ -436,6 +436,14 @@
"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",
@@ -537,7 +545,8 @@
"light": "Light",
"manageExtensions": "Manage Extensions",
"settings": "Settings",
"help": "Help"
"help": "Help",
"queue": "Queue Panel"
},
"tabMenu": {
"duplicateTab": "Duplicate Tab",
@@ -931,7 +940,7 @@
"Image Layer": "Image Layer"
},
"menuLabels": {
"Workflow": "Workflow",
"File": "File",
"Edit": "Edit",
"Help": "Help",
"Check for Updates": "Check for Updates",
@@ -949,16 +958,16 @@
"Browse Templates": "Browse Templates",
"Add Edit Model Step": "Add Edit Model Step",
"Delete Selected Items": "Delete Selected Items",
"Fit view to selected nodes": "Fit view to selected nodes",
"Zoom to fit": "Zoom to fit",
"Move Selected Nodes Down": "Move Selected Nodes Down",
"Move Selected Nodes Left": "Move Selected Nodes Left",
"Move Selected Nodes Right": "Move Selected Nodes Right",
"Move Selected Nodes Up": "Move Selected Nodes Up",
"Reset View": "Reset View",
"Resize Selected Nodes": "Resize Selected Nodes",
"Canvas Toggle Link Visibility": "Canvas Toggle Link Visibility",
"Node Links": "Node Links",
"Canvas Toggle Lock": "Canvas Toggle Lock",
"Canvas Toggle Minimap": "Canvas Toggle Minimap",
"Minimap": "Minimap",
"Pin/Unpin Selected Items": "Pin/Unpin Selected Items",
"Bypass/Unbypass Selected Nodes": "Bypass/Unbypass Selected Nodes",
"Collapse/Expand Selected Nodes": "Collapse/Expand Selected Nodes",
@@ -994,6 +1003,7 @@
"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)",
@@ -1003,6 +1013,8 @@
"Save": "Save",
"Save As": "Save As",
"Show Settings Dialog": "Show Settings Dialog",
"Canvas Performance": "Canvas Performance",
"Help Center": "Help Center",
"Toggle Theme (Dark/Light)": "Toggle Theme (Dark/Light)",
"Undo": "Undo",
"Open Sign In Dialog": "Open Sign In Dialog",
@@ -1011,14 +1023,17 @@
"Next Opened Workflow": "Next Opened Workflow",
"Previous Opened Workflow": "Previous Opened Workflow",
"Toggle Search Box": "Toggle Search Box",
"Toggle Bottom Panel": "Toggle Bottom Panel",
"Bottom Panel": "Bottom Panel",
"Show Keybindings Dialog": "Show Keybindings Dialog",
"Toggle Terminal Bottom Panel": "Toggle Terminal Bottom Panel",
"Toggle Logs Bottom Panel": "Toggle Logs Bottom Panel",
"Toggle Focus Mode": "Toggle Focus Mode",
"Toggle Model Library Sidebar": "Toggle Model Library Sidebar",
"Toggle Node Library Sidebar": "Toggle Node Library Sidebar",
"Toggle Queue Sidebar": "Toggle Queue Sidebar",
"Toggle Workflows Sidebar": "Toggle Workflows Sidebar"
"Toggle Essential Bottom Panel": "Toggle Essential Bottom Panel",
"Toggle View Controls Bottom Panel": "Toggle View Controls Bottom Panel",
"Focus Mode": "Focus Mode",
"Model Library": "Model Library",
"Node Library": "Node Library",
"Queue Panel": "Queue Panel",
"Workflows": "Workflows"
},
"desktopMenu": {
"reinstall": "Reinstall",

View File

@@ -179,6 +179,9 @@
"Comfy_OpenClipspace": {
"label": "Abrir espacio de clips"
},
"Comfy_OpenManagerDialog": {
"label": "Administrador"
},
"Comfy_OpenWorkflow": {
"label": "Abrir Flujo de Trabajo"
},
@@ -206,6 +209,12 @@
"Comfy_ShowSettingsDialog": {
"label": "Mostrar Diálogo de Configuraciones"
},
"Comfy_ToggleCanvasInfo": {
"label": "Rendimiento del lienzo"
},
"Comfy_ToggleHelpCenter": {
"label": "Centro de ayuda"
},
"Comfy_ToggleTheme": {
"label": "Cambiar Tema (Oscuro/Claro)"
},

View File

@@ -729,6 +729,7 @@
"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",
@@ -742,11 +743,11 @@
"menuLabels": {
"About ComfyUI": "Acerca de ComfyUI",
"Add Edit Model Step": "Agregar paso de edición de modelo",
"Bottom Panel": "Panel inferior",
"Browse Templates": "Explorar plantillas",
"Bypass/Unbypass Selected Nodes": "Evitar/No evitar nodos seleccionados",
"Canvas Toggle Link Visibility": "Alternar visibilidad de enlace en lienzo",
"Canvas Performance": "Rendimiento del lienzo",
"Canvas Toggle Lock": "Alternar bloqueo en lienzo",
"Canvas Toggle Minimap": "Lienzo: Alternar minimapa",
"Check for Updates": "Buscar actualizaciones",
"Clear Pending Tasks": "Borrar tareas pendientes",
"Clear Workflow": "Borrar flujo de trabajo",
@@ -768,15 +769,20 @@
"Exit Subgraph": "Salir de subgrafo",
"Export": "Exportar",
"Export (API)": "Exportar (API)",
"File": "Archivo",
"Fit Group To Contents": "Ajustar grupo a contenidos",
"Fit view to selected nodes": "Ajustar vista a los nodos seleccionados",
"Focus Mode": "Modo de enfoque",
"Give Feedback": "Dar retroalimentación",
"Group Selected Nodes": "Agrupar nodos seleccionados",
"Help": "Ayuda",
"Help Center": "Centro de ayuda",
"Increase Brush Size in MaskEditor": "Aumentar tamaño del pincel en MaskEditor",
"Interrupt": "Interrumpir",
"Load Default Workflow": "Cargar flujo de trabajo predeterminado",
"Manage group nodes": "Gestionar nodos de grupo",
"Manager": "Administrador",
"Minimap": "Minimapa",
"Model Library": "Biblioteca de modelos",
"Move Selected Nodes Down": "Mover nodos seleccionados hacia abajo",
"Move Selected Nodes Left": "Mover nodos seleccionados hacia la izquierda",
"Move Selected Nodes Right": "Mover nodos seleccionados hacia la derecha",
@@ -784,6 +790,8 @@
"Mute/Unmute Selected Nodes": "Silenciar/Activar sonido de nodos seleccionados",
"New": "Nuevo",
"Next Opened Workflow": "Siguiente flujo de trabajo abierto",
"Node Library": "Biblioteca de nodos",
"Node Links": "Enlaces de nodos",
"Open": "Abrir",
"Open Custom Nodes Folder": "Abrir carpeta de nodos personalizados",
"Open DevTools": "Abrir DevTools",
@@ -797,6 +805,7 @@
"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",
@@ -811,23 +820,21 @@
"Save As": "Guardar como",
"Show Settings Dialog": "Mostrar diálogo de configuración",
"Sign Out": "Cerrar sesión",
"Toggle Bottom Panel": "Alternar panel inferior",
"Toggle Focus Mode": "Alternar modo de enfoque",
"Toggle Essential Bottom Panel": "Alternar panel inferior esencial",
"Toggle Logs Bottom Panel": "Alternar panel inferior de registros",
"Toggle Model Library Sidebar": "Alternar barra lateral de la biblioteca de modelos",
"Toggle Node Library Sidebar": "Alternar barra lateral de la biblioteca de nodos",
"Toggle Queue Sidebar": "Alternar barra lateral de la cola",
"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 Workflows Sidebar": "Alternar barra lateral de los flujos de trabajo",
"Toggle View Controls Bottom Panel": "Alternar panel inferior de controles de vista",
"Toggle the Custom Nodes Manager": "Alternar el Administrador de Nodos Personalizados",
"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",
"Workflow": "Flujo de trabajo",
"Unpack the selected Subgraph": "Desempaquetar el Subgrafo seleccionado",
"Workflows": "Flujos de trabajo",
"Zoom In": "Acercar",
"Zoom Out": "Alejar"
"Zoom Out": "Alejar",
"Zoom to fit": "Ajustar al tamaño"
},
"minimap": {
"nodeColors": "Colores de nodos",
@@ -1157,6 +1164,13 @@
"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",
@@ -1194,6 +1208,7 @@
},
"showFlatList": "Mostrar lista plana"
},
"templates": "Plantillas",
"workflowTab": {
"confirmDelete": "¿Estás seguro de que quieres eliminar este flujo de trabajo?",
"confirmDeleteTitle": "¿Eliminar flujo de trabajo?",

View File

@@ -179,6 +179,9 @@
"Comfy_OpenClipspace": {
"label": "Espace de clip"
},
"Comfy_OpenManagerDialog": {
"label": "Gestionnaire"
},
"Comfy_OpenWorkflow": {
"label": "Ouvrir le flux de travail"
},
@@ -206,6 +209,12 @@
"Comfy_ShowSettingsDialog": {
"label": "Afficher la boîte de dialogue des paramètres"
},
"Comfy_ToggleCanvasInfo": {
"label": "Performance du canvas"
},
"Comfy_ToggleHelpCenter": {
"label": "Centre d'aide"
},
"Comfy_ToggleTheme": {
"label": "Changer de thème (Sombre/Clair)"
},

View File

@@ -729,6 +729,7 @@
"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",
@@ -742,11 +743,11 @@
"menuLabels": {
"About ComfyUI": "À propos de ComfyUI",
"Add Edit Model Step": "Ajouter une étape dédition de modèle",
"Bottom Panel": "Panneau inférieur",
"Browse Templates": "Parcourir les modèles",
"Bypass/Unbypass Selected Nodes": "Contourner/Ne pas contourner les nœuds sélectionnés",
"Canvas Toggle Link Visibility": "Basculer la visibilité du lien de la toile",
"Canvas Performance": "Performance du canevas",
"Canvas Toggle Lock": "Basculer le verrouillage de la toile",
"Canvas Toggle Minimap": "Basculer la mini-carte du canevas",
"Check for Updates": "Vérifier les mises à jour",
"Clear Pending Tasks": "Effacer les tâches en attente",
"Clear Workflow": "Effacer le flux de travail",
@@ -768,15 +769,20 @@
"Exit Subgraph": "Quitter le sous-graphe",
"Export": "Exporter",
"Export (API)": "Exporter (API)",
"File": "Fichier",
"Fit Group To Contents": "Ajuster le groupe au contenu",
"Fit view to selected nodes": "Ajuster la vue aux nœuds sélectionnés",
"Focus Mode": "Mode focus",
"Give Feedback": "Donnez votre avis",
"Group Selected Nodes": "Grouper les nœuds sélectionnés",
"Help": "Aide",
"Help Center": "Centre daide",
"Increase Brush Size in MaskEditor": "Augmenter la taille du pinceau dans MaskEditor",
"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",
"Minimap": "Minicarte",
"Model Library": "Bibliothèque de modèles",
"Move Selected Nodes Down": "Déplacer les nœuds sélectionnés vers le bas",
"Move Selected Nodes Left": "Déplacer les nœuds sélectionnés vers la gauche",
"Move Selected Nodes Right": "Déplacer les nœuds sélectionnés vers la droite",
@@ -784,6 +790,8 @@
"Mute/Unmute Selected Nodes": "Mettre en sourdine/Activer le son des nœuds sélectionnés",
"New": "Nouveau",
"Next Opened Workflow": "Prochain flux de travail ouvert",
"Node Library": "Bibliothèque de nœuds",
"Node Links": "Liens de nœuds",
"Open": "Ouvrir",
"Open Custom Nodes Folder": "Ouvrir le dossier des nœuds personnalisés",
"Open DevTools": "Ouvrir DevTools",
@@ -797,6 +805,7 @@
"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",
@@ -811,23 +820,21 @@
"Save As": "Enregistrer sous",
"Show Settings Dialog": "Afficher la boîte de dialogue des paramètres",
"Sign Out": "Se déconnecter",
"Toggle Bottom Panel": "Basculer le panneau inférieur",
"Toggle Focus Mode": "Basculer le mode focus",
"Toggle Essential Bottom Panel": "Afficher/Masquer le panneau inférieur essentiel",
"Toggle Logs Bottom Panel": "Basculer le panneau inférieur des journaux",
"Toggle Model Library Sidebar": "Afficher/Masquer la barre latérale de la bibliothèque de modèles",
"Toggle Node Library Sidebar": "Afficher/Masquer la barre latérale de la bibliothèque de nœuds",
"Toggle Queue Sidebar": "Afficher/Masquer la barre latérale de la file dattente",
"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 Workflows Sidebar": "Afficher/Masquer la barre latérale des workflows",
"Toggle View Controls Bottom Panel": "Afficher/Masquer le panneau inférieur des contrôles de vue",
"Toggle the Custom Nodes Manager": "Basculer le gestionnaire de nœuds personnalisés",
"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",
"Workflow": "Flux de travail",
"Unpack the selected Subgraph": "Décompresser le Subgraph sélectionné",
"Workflows": "Flux de travail",
"Zoom In": "Zoom avant",
"Zoom Out": "Zoom arrière"
"Zoom Out": "Zoom arrière",
"Zoom to fit": "Ajuster à lécran"
},
"minimap": {
"nodeColors": "Couleurs des nœuds",
@@ -1157,6 +1164,13 @@
"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",
@@ -1194,6 +1208,7 @@
},
"showFlatList": "Afficher la liste plate"
},
"templates": "Modèles",
"workflowTab": {
"confirmDelete": "Êtes-vous sûr de vouloir supprimer ce flux de travail ?",
"confirmDeleteTitle": "Supprimer le flux de travail ?",

View File

@@ -179,6 +179,9 @@
"Comfy_OpenClipspace": {
"label": "クリップスペース"
},
"Comfy_OpenManagerDialog": {
"label": "マネージャー"
},
"Comfy_OpenWorkflow": {
"label": "ワークフローを開く"
},
@@ -206,6 +209,12 @@
"Comfy_ShowSettingsDialog": {
"label": "設定ダイアログを表示"
},
"Comfy_ToggleCanvasInfo": {
"label": "キャンバスパフォーマンス"
},
"Comfy_ToggleHelpCenter": {
"label": "ヘルプセンター"
},
"Comfy_ToggleTheme": {
"label": "テーマの切り替え(ダーク/ライト)"
},

View File

@@ -729,6 +729,7 @@
"manageExtensions": "拡張機能の管理",
"onChange": "変更時",
"onChangeTooltip": "変更が行われるとワークフローがキューに追加されます",
"queue": "キューパネル",
"refresh": "ノードを更新",
"resetView": "ビューをリセット",
"run": "実行する",
@@ -742,11 +743,11 @@
"menuLabels": {
"About ComfyUI": "ComfyUIについて",
"Add Edit Model Step": "モデル編集ステップを追加",
"Bottom Panel": "下部パネル",
"Browse Templates": "テンプレートを参照",
"Bypass/Unbypass Selected Nodes": "選択したノードのバイパス/バイパス解除",
"Canvas Toggle Link Visibility": "キャンバスのリンク表示を切り替え",
"Canvas Performance": "キャンバスパフォーマンス",
"Canvas Toggle Lock": "キャンバスのロックを切り替え",
"Canvas Toggle Minimap": "キャンバス ミニマップの切り替え",
"Check for Updates": "更新を確認する",
"Clear Pending Tasks": "保留中のタスクをクリア",
"Clear Workflow": "ワークフローをクリア",
@@ -768,15 +769,20 @@
"Exit Subgraph": "サブグラフを終了",
"Export": "エクスポート",
"Export (API)": "エクスポート (API)",
"File": "ファイル",
"Fit Group To Contents": "グループを内容に合わせる",
"Fit view to selected nodes": "選択したノードにビューを合わせる",
"Focus Mode": "フォーカスモード",
"Give Feedback": "フィードバックを送る",
"Group Selected Nodes": "選択したノードをグループ化",
"Help": "ヘルプ",
"Help Center": "ヘルプセンター",
"Increase Brush Size in MaskEditor": "マスクエディタでブラシサイズを大きくする",
"Interrupt": "中断",
"Load Default Workflow": "デフォルトワークフローを読み込む",
"Manage group nodes": "グループノードを管理",
"Manager": "マネージャー",
"Minimap": "ミニマップ",
"Model Library": "モデルライブラリ",
"Move Selected Nodes Down": "選択したノードを下へ移動",
"Move Selected Nodes Left": "選択したノードを左へ移動",
"Move Selected Nodes Right": "選択したノードを右へ移動",
@@ -784,6 +790,8 @@
"Mute/Unmute Selected Nodes": "選択したノードのミュート/ミュート解除",
"New": "新規",
"Next Opened Workflow": "次に開いたワークフロー",
"Node Library": "ノードライブラリ",
"Node Links": "ノードリンク",
"Open": "開く",
"Open Custom Nodes Folder": "カスタムノードフォルダを開く",
"Open DevTools": "DevToolsを開く",
@@ -797,6 +805,7 @@
"Pin/Unpin Selected Items": "選択したアイテムのピン留め/ピン留め解除",
"Pin/Unpin Selected Nodes": "選択したノードのピン留め/ピン留め解除",
"Previous Opened Workflow": "前に開いたワークフロー",
"Queue Panel": "キューパネル",
"Queue Prompt": "キューのプロンプト",
"Queue Prompt (Front)": "キューのプロンプト (前面)",
"Queue Selected Output Nodes": "選択した出力ノードをキューに追加",
@@ -811,23 +820,21 @@
"Save As": "名前を付けて保存",
"Show Settings Dialog": "設定ダイアログを表示",
"Sign Out": "サインアウト",
"Toggle Bottom Panel": "下部パネルの切り替え",
"Toggle Focus Mode": "フォーカスモードの切り替え",
"Toggle Essential Bottom Panel": "エッセンシャル下部パネルの切り替え",
"Toggle Logs Bottom Panel": "ログパネル下部を切り替え",
"Toggle Model Library Sidebar": "モデルライブラリサイドバーを切り替え",
"Toggle Node Library Sidebar": "ノードライブラリサイドバーを切り替え",
"Toggle Queue Sidebar": "キューサイドバーを切り替え",
"Toggle Search Box": "検索ボックスの切り替え",
"Toggle Terminal Bottom Panel": "ターミナルパネル下部を切り替え",
"Toggle Theme (Dark/Light)": "テーマを切り替え(ダーク/ライト)",
"Toggle Workflows Sidebar": "ワークフローサイドバーを切り替え",
"Toggle View Controls Bottom Panel": "ビューコントロール下部パネルの切り替え",
"Toggle the Custom Nodes Manager": "カスタムノードマネージャーを切り替え",
"Toggle the Custom Nodes Manager Progress Bar": "カスタムノードマネージャーの進行状況バーを切り替え",
"Undo": "元に戻す",
"Ungroup selected group nodes": "選択したグループノードのグループ解除",
"Workflow": "ワークフロー",
"Unpack the selected Subgraph": "選択したサブグラフを展開",
"Workflows": "ワークフロー",
"Zoom In": "ズームイン",
"Zoom Out": "ズームアウト"
"Zoom Out": "ズームアウト",
"Zoom to fit": "全体表示にズーム"
},
"minimap": {
"nodeColors": "ノードの色",
@@ -1157,6 +1164,13 @@
"browseTemplates": "サンプルテンプレートを表示",
"downloads": "ダウンロード",
"helpCenter": "ヘルプセンター",
"labels": {
"models": "モデル",
"nodes": "ノード",
"queue": "キュー",
"templates": "テンプレート",
"workflows": "ワークフロー"
},
"logout": "ログアウト",
"modelLibrary": "モデルライブラリ",
"newBlankWorkflow": "新しい空のワークフローを作成",
@@ -1194,6 +1208,7 @@
},
"showFlatList": "フラットリストを表示"
},
"templates": "テンプレート",
"workflowTab": {
"confirmDelete": "このワークフローを削除してもよろしいですか?",
"confirmDeleteTitle": "ワークフローを削除しますか?",

View File

@@ -179,6 +179,9 @@
"Comfy_OpenClipspace": {
"label": "클립스페이스"
},
"Comfy_OpenManagerDialog": {
"label": "매니저"
},
"Comfy_OpenWorkflow": {
"label": "워크플로 열기"
},
@@ -206,6 +209,12 @@
"Comfy_ShowSettingsDialog": {
"label": "설정 대화상자 보기"
},
"Comfy_ToggleCanvasInfo": {
"label": "캔버스 성능"
},
"Comfy_ToggleHelpCenter": {
"label": "도움말 센터"
},
"Comfy_ToggleTheme": {
"label": "밝기 테마 전환 (어두운/밝은)"
},

View File

@@ -729,6 +729,7 @@
"manageExtensions": "확장 프로그램 관리",
"onChange": "변경 시",
"onChangeTooltip": "변경이 있는 경우에만 워크플로를 실행 대기열에 추가합니다.",
"queue": "대기열 패널",
"refresh": "노드 정의 새로 고침",
"resetView": "캔버스 보기 재설정",
"run": "실행",
@@ -742,11 +743,11 @@
"menuLabels": {
"About ComfyUI": "ComfyUI에 대하여",
"Add Edit Model Step": "모델 편집 단계 추가",
"Bottom Panel": "하단 패널",
"Browse Templates": "템플릿 탐색",
"Bypass/Unbypass Selected Nodes": "선택한 노드 우회/우회 해제",
"Canvas Toggle Link Visibility": "캔버스 토글 링크 가시성",
"Canvas Performance": "캔버스 성",
"Canvas Toggle Lock": "캔버스 토글 잠금",
"Canvas Toggle Minimap": "캔버스 미니맵 전환",
"Check for Updates": "업데이트 확인",
"Clear Pending Tasks": "보류 중인 작업 제거하기",
"Clear Workflow": "워크플로 지우기",
@@ -768,15 +769,20 @@
"Exit Subgraph": "서브그래프 종료",
"Export": "내보내기",
"Export (API)": "내보내기 (API)",
"File": "파일",
"Fit Group To Contents": "그룹을 내용에 맞게 조정",
"Fit view to selected nodes": "선택한 노드에 맞게 보기 조정",
"Focus Mode": "포커스 모드",
"Give Feedback": "피드백 제공",
"Group Selected Nodes": "선택한 노드 그룹화",
"Help": "도움말",
"Help Center": "도움말 센터",
"Increase Brush Size in MaskEditor": "마스크 편집기에서 브러시 크기 늘리기",
"Interrupt": "중단",
"Load Default Workflow": "기본 워크플로 불러오기",
"Manage group nodes": "그룹 노드 관리",
"Manager": "매니저",
"Minimap": "미니맵",
"Model Library": "모델 라이브러리",
"Move Selected Nodes Down": "선택한 노드 아래로 이동",
"Move Selected Nodes Left": "선택한 노드 왼쪽으로 이동",
"Move Selected Nodes Right": "선택한 노드 오른쪽으로 이동",
@@ -784,6 +790,8 @@
"Mute/Unmute Selected Nodes": "선택한 노드 활성화/비활성화",
"New": "새로 만들기",
"Next Opened Workflow": "다음 열린 워크플로",
"Node Library": "노드 라이브러리",
"Node Links": "노드 링크",
"Open": "열기",
"Open Custom Nodes Folder": "사용자 정의 노드 폴더 열기",
"Open DevTools": "개발자 도구 열기",
@@ -797,6 +805,7 @@
"Pin/Unpin Selected Items": "선택한 항목 고정/고정 해제",
"Pin/Unpin Selected Nodes": "선택한 노드 고정/고정 해제",
"Previous Opened Workflow": "이전 열린 워크플로",
"Queue Panel": "대기열 패널",
"Queue Prompt": "실행 대기열에 프롬프트 추가",
"Queue Prompt (Front)": "실행 대기열 맨 앞에 프롬프트 추가",
"Queue Selected Output Nodes": "선택한 출력 노드 대기열에 추가",
@@ -811,23 +820,21 @@
"Save As": "다른 이름으로 저장",
"Show Settings Dialog": "설정 대화상자 표시",
"Sign Out": "로그아웃",
"Toggle Bottom Panel": "하단 패널 전환",
"Toggle Focus Mode": "포커스 모드 전환",
"Toggle Essential Bottom Panel": "필수 하단 패널 전환",
"Toggle Logs Bottom Panel": "로그 하단 패널 전환",
"Toggle Model Library Sidebar": "모델 라이브러리 사이드바 전환",
"Toggle Node Library Sidebar": "노드 라이브러리 사이드바 전환",
"Toggle Queue Sidebar": "실행 대기열 사이드바 전환",
"Toggle Search Box": "검색 상자 전환",
"Toggle Terminal Bottom Panel": "터미널 하단 패널 전환",
"Toggle Theme (Dark/Light)": "테마 전환 (어두운/밝은)",
"Toggle Workflows Sidebar": "워크플로 사이드바 전환",
"Toggle View Controls Bottom Panel": "뷰 컨트롤 하단 패널 전환",
"Toggle the Custom Nodes Manager": "커스텀 노드 매니저 전환",
"Toggle the Custom Nodes Manager Progress Bar": "커스텀 노드 매니저 진행률 표시줄 전환",
"Undo": "실행 취소",
"Ungroup selected group nodes": "선택한 그룹 노드 그룹 해제",
"Workflow": "워크플로",
"Unpack the selected Subgraph": "선택한 서브그래프 풀기",
"Workflows": "워크플로우",
"Zoom In": "확대",
"Zoom Out": "축소"
"Zoom Out": "축소",
"Zoom to fit": "화면에 맞추기"
},
"minimap": {
"nodeColors": "노드 색상",
@@ -1157,6 +1164,13 @@
"browseTemplates": "예제 템플릿 탐색",
"downloads": "다운로드",
"helpCenter": "도움말 센터",
"labels": {
"models": "모델",
"nodes": "노드",
"queue": "대기열",
"templates": "템플릿",
"workflows": "워크플로우"
},
"logout": "로그아웃",
"modelLibrary": "모델 라이브러리",
"newBlankWorkflow": "새 빈 워크플로 만들기",
@@ -1194,6 +1208,7 @@
},
"showFlatList": "평면 목록 표시"
},
"templates": "템플릿",
"workflowTab": {
"confirmDelete": "정말로 이 워크플로를 삭제하시겠습니까?",
"confirmDeleteTitle": "워크플로 삭제",

View File

@@ -179,6 +179,9 @@
"Comfy_OpenClipspace": {
"label": "Клипспейс"
},
"Comfy_OpenManagerDialog": {
"label": "Менеджер"
},
"Comfy_OpenWorkflow": {
"label": "Открыть рабочий процесс"
},
@@ -206,6 +209,12 @@
"Comfy_ShowSettingsDialog": {
"label": "Показать диалог настроек"
},
"Comfy_ToggleCanvasInfo": {
"label": "Производительность холста"
},
"Comfy_ToggleHelpCenter": {
"label": "Центр поддержки"
},
"Comfy_ToggleTheme": {
"label": "Переключить тему (Тёмная/Светлая)"
},

View File

@@ -729,6 +729,7 @@
"manageExtensions": "Управление расширениями",
"onChange": "При изменении",
"onChangeTooltip": "Рабочий процесс будет поставлен в очередь после внесения изменений",
"queue": "Панель очереди",
"refresh": "Обновить определения нод",
"resetView": "Сбросить вид холста",
"run": "Запустить",
@@ -742,11 +743,11 @@
"menuLabels": {
"About ComfyUI": "О ComfyUI",
"Add Edit Model Step": "Добавить или изменить шаг модели",
"Bottom Panel": "Нижняя панель",
"Browse Templates": "Просмотреть шаблоны",
"Bypass/Unbypass Selected Nodes": "Обойти/восстановить выбранные ноды",
"Canvas Toggle Link Visibility": "Переключение видимости ссылки на холст",
"Canvas Performance": "Производительность холста",
"Canvas Toggle Lock": "Переключение блокировки холста",
"Canvas Toggle Minimap": "Показать/скрыть миникарту на холсте",
"Check for Updates": "Проверить наличие обновлений",
"Clear Pending Tasks": "Очистить ожидающие задачи",
"Clear Workflow": "Очистить рабочий процесс",
@@ -768,15 +769,20 @@
"Exit Subgraph": "Выйти из подграфа",
"Export": "Экспортировать",
"Export (API)": "Экспорт (API)",
"File": "Файл",
"Fit Group To Contents": "Подогнать группу под содержимое",
"Fit view to selected nodes": "Подогнать вид под выбранные ноды",
"Focus Mode": "Режим фокуса",
"Give Feedback": "Оставить отзыв",
"Group Selected Nodes": "Сгруппировать выбранные ноды",
"Help": "Помощь",
"Help Center": "Центр поддержки",
"Increase Brush Size in MaskEditor": "Увеличить размер кисти в MaskEditor",
"Interrupt": "Прервать",
"Load Default Workflow": "Загрузить стандартный рабочий процесс",
"Manage group nodes": "Управление групповыми нодами",
"Manager": "Менеджер",
"Minimap": "Мини-карта",
"Model Library": "Библиотека моделей",
"Move Selected Nodes Down": "Переместить выбранные узлы вниз",
"Move Selected Nodes Left": "Переместить выбранные узлы влево",
"Move Selected Nodes Right": "Переместить выбранные узлы вправо",
@@ -784,6 +790,8 @@
"Mute/Unmute Selected Nodes": "Отключить/включить звук для выбранных нод",
"New": "Новый",
"Next Opened Workflow": "Следующий открытый рабочий процесс",
"Node Library": "Библиотека узлов",
"Node Links": "Связи узлов",
"Open": "Открыть",
"Open Custom Nodes Folder": "Открыть папку пользовательских нод",
"Open DevTools": "Открыть инструменты разработчика",
@@ -797,6 +805,7 @@
"Pin/Unpin Selected Items": "Закрепить/открепить выбранные элементы",
"Pin/Unpin Selected Nodes": "Закрепить/открепить выбранные ноды",
"Previous Opened Workflow": "Предыдущий открытый рабочий процесс",
"Queue Panel": "Панель очереди",
"Queue Prompt": "Запрос в очереди",
"Queue Prompt (Front)": "Запрос в очереди (спереди)",
"Queue Selected Output Nodes": "Добавить выбранные выходные узлы в очередь",
@@ -811,23 +820,21 @@
"Save As": "Сохранить как",
"Show Settings Dialog": "Показать диалог настроек",
"Sign Out": "Выйти",
"Toggle Bottom Panel": ереключить нижнюю панель",
"Toggle Focus Mode": "Переключить режим фокуса",
"Toggle Essential Bottom Panel": оказать/скрыть основную нижнюю панель",
"Toggle Logs Bottom Panel": "Переключение нижней панели журналов",
"Toggle Model Library Sidebar": "Показать/скрыть боковую панель библиотеки моделей",
"Toggle Node Library Sidebar": "Показать/скрыть боковую панель библиотеки узлов",
"Toggle Queue Sidebar": "Показать/скрыть боковую панель очереди",
"Toggle Search Box": "Переключить поисковую панель",
"Toggle Terminal Bottom Panel": "Переключение нижней панели терминала",
"Toggle Theme (Dark/Light)": "Переключение темы (Тёмная/Светлая)",
"Toggle Workflows Sidebar": "Показать/скрыть боковую панель рабочих процессов",
"Toggle View Controls Bottom Panel": "Показать/скрыть панель управления просмотром",
"Toggle the Custom Nodes Manager": "Переключить менеджер пользовательских узлов",
"Toggle the Custom Nodes Manager Progress Bar": "Переключить индикатор выполнения менеджера пользовательских узлов",
"Undo": "Отменить",
"Ungroup selected group nodes": "Разгруппировать выбранные групповые ноды",
"Workflow": "Рабочий процесс",
"Unpack the selected Subgraph": "Распаковать выбранный подграф",
"Workflows": "Рабочие процессы",
"Zoom In": "Увеличить",
"Zoom Out": "Уменьшить"
"Zoom Out": "Уменьшить",
"Zoom to fit": "Масштабировать по размеру"
},
"minimap": {
"nodeColors": "Цвета узлов",
@@ -1157,6 +1164,13 @@
"browseTemplates": "Просмотреть примеры шаблонов",
"downloads": "Загрузки",
"helpCenter": "Центр поддержки",
"labels": {
"models": "Модели",
"nodes": "Узлы",
"queue": "Очередь",
"templates": "Шаблоны",
"workflows": "Воркфлоу"
},
"logout": "Выйти",
"modelLibrary": "Библиотека моделей",
"newBlankWorkflow": "Создайте новый пустой рабочий процесс",
@@ -1194,6 +1208,7 @@
},
"showFlatList": "Показать плоский список"
},
"templates": "Шаблоны",
"workflowTab": {
"confirmDelete": "Вы уверены, что хотите удалить этот рабочий процесс?",
"confirmDeleteTitle": "Удалить рабочий процесс?",

View File

@@ -179,6 +179,9 @@
"Comfy_OpenClipspace": {
"label": "Clipspace"
},
"Comfy_OpenManagerDialog": {
"label": "管理器"
},
"Comfy_OpenWorkflow": {
"label": "開啟工作流程"
},
@@ -206,6 +209,12 @@
"Comfy_ShowSettingsDialog": {
"label": "顯示設定對話框"
},
"Comfy_ToggleCanvasInfo": {
"label": "畫布效能"
},
"Comfy_ToggleHelpCenter": {
"label": "說明中心"
},
"Comfy_ToggleTheme": {
"label": "切換主題(深色/淺色)"
},

View File

@@ -729,6 +729,7 @@
"manageExtensions": "管理擴充功能",
"onChange": "變更時",
"onChangeTooltip": "每當有變更時,工作流程會排入佇列",
"queue": "佇列面板",
"refresh": "重新整理節點定義",
"resetView": "重設畫布視圖",
"run": "執行",
@@ -742,11 +743,11 @@
"menuLabels": {
"About ComfyUI": "關於 ComfyUI",
"Add Edit Model Step": "新增編輯模型步驟",
"Bottom Panel": "底部面板",
"Browse Templates": "瀏覽範本",
"Bypass/Unbypass Selected Nodes": "繞過/取消繞過選取節點",
"Canvas Toggle Link Visibility": "切換連結可見性",
"Canvas Performance": "畫布效能",
"Canvas Toggle Lock": "切換畫布鎖定",
"Canvas Toggle Minimap": "畫布切換小地圖",
"Check for Updates": "檢查更新",
"Clear Pending Tasks": "清除待處理任務",
"Clear Workflow": "清除工作流程",
@@ -768,15 +769,20 @@
"Exit Subgraph": "離開子圖",
"Export": "匯出",
"Export (API)": "匯出API",
"File": "檔案",
"Fit Group To Contents": "群組貼合內容",
"Fit view to selected nodes": "視圖貼合選取節點",
"Focus Mode": "專注模式",
"Give Feedback": "提供意見回饋",
"Group Selected Nodes": "群組選取節點",
"Help": "說明",
"Help Center": "說明中心",
"Increase Brush Size in MaskEditor": "在 MaskEditor 中增大筆刷大小",
"Interrupt": "中斷",
"Load Default Workflow": "載入預設工作流程",
"Manage group nodes": "管理群組節點",
"Manager": "管理員",
"Minimap": "縮圖地圖",
"Model Library": "模型庫",
"Move Selected Nodes Down": "選取節點下移",
"Move Selected Nodes Left": "選取節點左移",
"Move Selected Nodes Right": "選取節點右移",
@@ -784,6 +790,8 @@
"Mute/Unmute Selected Nodes": "靜音/取消靜音選取節點",
"New": "新增",
"Next Opened Workflow": "下一個已開啟的工作流程",
"Node Library": "節點庫",
"Node Links": "節點連結",
"Open": "開啟",
"Open Custom Nodes Folder": "開啟自訂節點資料夾",
"Open DevTools": "開啟開發者工具",
@@ -797,6 +805,7 @@
"Pin/Unpin Selected Items": "釘選/取消釘選選取項目",
"Pin/Unpin Selected Nodes": "釘選/取消釘選選取節點",
"Previous Opened Workflow": "上一個已開啟的工作流程",
"Queue Panel": "佇列面板",
"Queue Prompt": "加入提示至佇列",
"Queue Prompt (Front)": "將提示加入佇列前端",
"Queue Selected Output Nodes": "將選取的輸出節點加入佇列",
@@ -811,23 +820,21 @@
"Save As": "另存新檔",
"Show Settings Dialog": "顯示設定對話框",
"Sign Out": "登出",
"Toggle Bottom Panel": "切換下方面板",
"Toggle Focus Mode": "切換專注模式",
"Toggle Essential Bottom Panel": "切換基本下方面板",
"Toggle Logs Bottom Panel": "切換日誌下方面板",
"Toggle Model Library Sidebar": "切換模型庫側邊欄",
"Toggle Node Library Sidebar": "切換節點庫側邊欄",
"Toggle Queue Sidebar": "切換佇列側邊欄",
"Toggle Search Box": "切換搜尋框",
"Toggle Terminal Bottom Panel": "切換終端機底部面板",
"Toggle Theme (Dark/Light)": "切換主題(深色/淺色)",
"Toggle Workflows Sidebar": "切換工作流程側邊欄",
"Toggle View Controls Bottom Panel": "切換檢視控制下方面板",
"Toggle the Custom Nodes Manager": "切換自訂節點管理器",
"Toggle the Custom Nodes Manager Progress Bar": "切換自訂節點管理器進度條",
"Undo": "復原",
"Ungroup selected group nodes": "取消群組選取的群組節點",
"Workflow": "工作流程",
"Unpack the selected Subgraph": "解包所選子圖",
"Workflows": "工作流程",
"Zoom In": "放大",
"Zoom Out": "縮小"
"Zoom Out": "縮小",
"Zoom to fit": "縮放至適合大小"
},
"minimap": {
"nodeColors": "節點顏色",
@@ -1157,6 +1164,13 @@
"browseTemplates": "瀏覽範例模板",
"downloads": "下載",
"helpCenter": "說明中心",
"labels": {
"models": "模型",
"nodes": "節點",
"queue": "佇列",
"templates": "範本",
"workflows": "工作流程"
},
"logout": "登出",
"modelLibrary": "模型庫",
"newBlankWorkflow": "建立新的空白工作流程",
@@ -1194,6 +1208,7 @@
},
"showFlatList": "顯示平面清單"
},
"templates": "範本",
"workflowTab": {
"confirmDelete": "您確定要刪除這個工作流程嗎?",
"confirmDeleteTitle": "刪除工作流程?",

View File

@@ -179,6 +179,9 @@
"Comfy_OpenClipspace": {
"label": "打开剪贴板"
},
"Comfy_OpenManagerDialog": {
"label": "管理器"
},
"Comfy_OpenWorkflow": {
"label": "打开工作流"
},
@@ -206,6 +209,12 @@
"Comfy_ShowSettingsDialog": {
"label": "显示设置对话框"
},
"Comfy_ToggleCanvasInfo": {
"label": "畫布效能"
},
"Comfy_ToggleHelpCenter": {
"label": "說明中心"
},
"Comfy_ToggleTheme": {
"label": "切换主题"
},

View File

@@ -729,6 +729,7 @@
"manageExtensions": "管理擴充功能",
"onChange": "更改时",
"onChangeTooltip": "一旦进行更改,工作流将添加到执行队列",
"queue": "佇列面板",
"refresh": "刷新节点",
"resetView": "重置视图",
"run": "运行",
@@ -742,11 +743,11 @@
"menuLabels": {
"About ComfyUI": "关于ComfyUI",
"Add Edit Model Step": "添加编辑模型步骤",
"Bottom Panel": "底部面板",
"Browse Templates": "浏览模板",
"Bypass/Unbypass Selected Nodes": "忽略/取消忽略选定节点",
"Canvas Toggle Link Visibility": "切换连线可见性",
"Canvas Performance": "畫布效能",
"Canvas Toggle Lock": "切换视图锁定",
"Canvas Toggle Minimap": "画布切换小地图",
"Check for Updates": "检查更新",
"Clear Pending Tasks": "清除待处理任务",
"Clear Workflow": "清除工作流",
@@ -768,15 +769,20 @@
"Exit Subgraph": "退出子圖",
"Export": "导出",
"Export (API)": "导出 (API)",
"File": "檔案",
"Fit Group To Contents": "适应组内容",
"Fit view to selected nodes": "适应视图到选中节点",
"Focus Mode": "專注模式",
"Give Feedback": "提供反馈",
"Group Selected Nodes": "将选中节点转换为组节点",
"Help": "帮助",
"Help Center": "說明中心",
"Increase Brush Size in MaskEditor": "在 MaskEditor 中增大筆刷大小",
"Interrupt": "中断",
"Load Default Workflow": "加载默认工作流",
"Manage group nodes": "管理组节点",
"Manager": "管理員",
"Minimap": "縮圖地圖",
"Model Library": "模型庫",
"Move Selected Nodes Down": "下移所选节点",
"Move Selected Nodes Left": "左移所选节点",
"Move Selected Nodes Right": "右移所选节点",
@@ -784,6 +790,8 @@
"Mute/Unmute Selected Nodes": "静音/取消静音选定节点",
"New": "新建",
"Next Opened Workflow": "下一个打开的工作流",
"Node Library": "節點庫",
"Node Links": "節點連結",
"Open": "打开",
"Open Custom Nodes Folder": "打开自定义节点文件夹",
"Open DevTools": "打开开发者工具",
@@ -797,6 +805,7 @@
"Pin/Unpin Selected Items": "固定/取消固定选定项目",
"Pin/Unpin Selected Nodes": "固定/取消固定选定节点",
"Previous Opened Workflow": "上一个打开的工作流",
"Queue Panel": "佇列面板",
"Queue Prompt": "执行提示词",
"Queue Prompt (Front)": "执行提示词 (优先执行)",
"Queue Selected Output Nodes": "将所选输出节点加入队列",
@@ -811,23 +820,21 @@
"Save As": "另存为",
"Show Settings Dialog": "显示设置对话框",
"Sign Out": "退出登录",
"Toggle Bottom Panel": "切换底部面板",
"Toggle Focus Mode": "切换专注模式",
"Toggle Essential Bottom Panel": "切換基本下方面板",
"Toggle Logs Bottom Panel": "切换日志底部面板",
"Toggle Model Library Sidebar": "切换模型库侧边栏",
"Toggle Node Library Sidebar": "切换节点库侧边栏",
"Toggle Queue Sidebar": "切换队列侧边栏",
"Toggle Search Box": "切换搜索框",
"Toggle Terminal Bottom Panel": "切换终端底部面板",
"Toggle Theme (Dark/Light)": "切换主题(暗/亮)",
"Toggle Workflows Sidebar": "切换工作流侧边栏",
"Toggle View Controls Bottom Panel": "切換檢視控制下方面板",
"Toggle the Custom Nodes Manager": "切换自定义节点管理器",
"Toggle the Custom Nodes Manager Progress Bar": "切换自定义节点管理器进度条",
"Undo": "撤销",
"Ungroup selected group nodes": "解散选中组节点",
"Workflow": "工作流",
"Unpack the selected Subgraph": "解開所選子圖",
"Workflows": "工作流程",
"Zoom In": "放大画面",
"Zoom Out": "缩小画面"
"Zoom Out": "缩小画面",
"Zoom to fit": "縮放至適合大小"
},
"minimap": {
"nodeColors": "節點顏色",
@@ -1157,6 +1164,13 @@
"browseTemplates": "浏览示例模板",
"downloads": "下载",
"helpCenter": "帮助中心",
"labels": {
"models": "模型",
"nodes": "節點",
"queue": "佇列",
"templates": "範本",
"workflows": "工作流程"
},
"logout": "登出",
"modelLibrary": "模型库",
"newBlankWorkflow": "创建空白工作流",
@@ -1194,6 +1208,7 @@
},
"showFlatList": "平铺结果"
},
"templates": "範本",
"workflowTab": {
"confirmDelete": "您确定要删除此工作流吗?",
"confirmDeleteTitle": "删除工作流?",

View File

@@ -17,6 +17,7 @@ export interface ComfyCommand {
versionAdded?: string
confirmation?: string // If non-nullish, this command will prompt for confirmation
source?: string
active?: () => boolean // Getter to check if the command is active/toggled on
category?: 'essentials' | 'view-controls' // For shortcuts panel organization
}
@@ -30,6 +31,7 @@ export class ComfyCommandImpl implements ComfyCommand {
versionAdded?: string
confirmation?: string
source?: string
active?: () => boolean
category?: 'essentials' | 'view-controls'
constructor(command: ComfyCommand) {
@@ -42,6 +44,7 @@ export class ComfyCommandImpl implements ComfyCommand {
this.versionAdded = command.versionAdded
this.confirmation = command.confirmation
this.source = command.source
this.active = command.active
this.category = command.category
}

View File

@@ -0,0 +1,25 @@
import { defineStore } from 'pinia'
import { ref } from 'vue'
export const useHelpCenterStore = defineStore('helpCenter', () => {
const isVisible = ref(false)
const toggle = () => {
isVisible.value = !isVisible.value
}
const show = () => {
isVisible.value = true
}
const hide = () => {
isVisible.value = false
}
return {
isVisible,
toggle,
show,
hide
}
})

View File

@@ -10,6 +10,7 @@ import { useCommandStore } from './commandStore'
export const useMenuItemStore = defineStore('menuItem', () => {
const commandStore = useCommandStore()
const menuItems = ref<MenuItem[]>([])
const menuItemHasActiveStateChildren = ref<Record<string, boolean>>({})
const registerMenuGroup = (path: string[], items: MenuItem[]) => {
let currentLevel = menuItems.value
@@ -45,6 +46,14 @@ export const useMenuItemStore = defineStore('menuItem', () => {
}
// Add the new items to the last level
currentLevel.push(...items)
// Store if any of the children have active state as we will hide the icon if they do
const parentPath = path.join('.')
if (!menuItemHasActiveStateChildren.value[parentPath]) {
menuItemHasActiveStateChildren.value[parentPath] = items.some(
(item) => item.comfyCommand?.active
)
}
}
const registerCommands = (path: string[], commandIds: string[]) => {
@@ -57,7 +66,8 @@ export const useMenuItemStore = defineStore('menuItem', () => {
label: command.menubarLabel,
icon: command.icon,
tooltip: command.tooltip,
comfyCommand: command
comfyCommand: command,
parentPath: path.join('.')
}) as MenuItem
)
registerMenuGroup(path, items)
@@ -92,6 +102,7 @@ export const useMenuItemStore = defineStore('menuItem', () => {
registerMenuGroup,
registerCommands,
loadExtensionMenuCommands,
registerCoreMenuCommands
registerCoreMenuCommands,
menuItemHasActiveStateChildren
}
})

View File

@@ -7,6 +7,7 @@ import { useQueueSidebarTab } from '@/composables/sidebarTabs/useQueueSidebarTab
import { useWorkflowsSidebarTab } from '@/composables/sidebarTabs/useWorkflowsSidebarTab'
import { t, te } from '@/i18n'
import { useCommandStore } from '@/stores/commandStore'
import { useMenuItemStore } from '@/stores/menuItemStore'
import { SidebarTabExtension } from '@/types/extensionTypes'
export const useSidebarTabStore = defineStore('sidebarTab', () => {
@@ -38,16 +39,34 @@ export const useSidebarTabStore = defineStore('sidebarTab', () => {
: String(tab.tooltip)
: undefined
const menubarLabelFunction = () => {
const menubarLabelKeys: Record<string, string> = {
queue: 'menu.queue',
'node-library': 'sideToolbar.nodeLibrary',
'model-library': 'sideToolbar.modelLibrary',
workflows: 'sideToolbar.workflows'
}
const key = menubarLabelKeys[tab.id]
if (key && te(key)) {
return t(key)
}
return tab.title
}
useCommandStore().registerCommand({
id: `Workspace.ToggleSidebarTab.${tab.id}`,
icon: tab.icon,
icon: typeof tab.icon === 'string' ? tab.icon : undefined,
label: labelFunction,
menubarLabel: menubarLabelFunction,
tooltip: tooltipFunction,
versionAdded: '1.3.9',
category: 'view-controls' as const,
function: () => {
toggleSidebarTab(tab.id)
},
active: () => activeSidebarTab.value?.id === tab.id,
source: 'System'
})
}
@@ -73,6 +92,25 @@ export const useSidebarTabStore = defineStore('sidebarTab', () => {
registerSidebarTab(useNodeLibrarySidebarTab())
registerSidebarTab(useModelLibrarySidebarTab())
registerSidebarTab(useWorkflowsSidebarTab())
const menuStore = useMenuItemStore()
menuStore.registerCommands(
['View'],
[
'Workspace.ToggleBottomPanel',
'Comfy.BrowseTemplates',
'Workspace.ToggleFocusMode',
'Comfy.ToggleCanvasInfo',
'Comfy.Canvas.ToggleMinimap',
'Comfy.Canvas.ToggleLinkVisibility'
]
)
menuStore.registerCommands(
['View'],
['Comfy.Canvas.ZoomIn', 'Comfy.Canvas.ZoomOut', 'Comfy.Canvas.FitView']
)
}
return {

View File

@@ -6,9 +6,10 @@ import type { ComfyCommand } from '@/stores/commandStore'
export interface BaseSidebarTabExtension {
id: string
title: string
icon?: string
icon?: string | Component
iconBadge?: string | (() => string | null)
tooltip?: string
label?: string
}
export interface BaseBottomPanelExtension {

View File

@@ -16,12 +16,17 @@ export const whileMouseDown = (
callback(iteration++)
}, interval)
const dispose = useEventListener(element, 'mouseup', () => {
const dispose = () => {
clearInterval(intervalId)
dispose()
})
disposeGlobal()
disposeLocal()
}
// Listen for mouseup globally to catch cases where user drags out of element
const disposeGlobal = useEventListener(document, 'mouseup', dispose)
const disposeLocal = useEventListener(element, 'mouseup', dispose)
return {
dispose
dispose: dispose
}
}

12
src/vite-env.d.ts vendored
View File

@@ -1,5 +1,17 @@
/// <reference types="vite/client" />
declare module 'virtual:icons/*' {
import type { DefineComponent } from 'vue'
const component: DefineComponent
export default component
}
declare module '~icons/*' {
import type { DefineComponent } from 'vue'
const component: DefineComponent
export default component
}
declare global {
interface Window {
__COMFYUI_FRONTEND_VERSION__: string

View File

@@ -1,8 +1,18 @@
import vue from '@vitejs/plugin-vue'
import { FileSystemIconLoader } from 'unplugin-icons/loaders'
import Icons from 'unplugin-icons/vite'
import { defineConfig } from 'vitest/config'
export default defineConfig({
plugins: [vue()],
plugins: [
vue(),
Icons({
compiler: 'vue3',
customCollections: {
comfy: FileSystemIconLoader('src/assets/icons/custom')
}
})
],
test: {
globals: true,
environment: 'happy-dom',