fix(i18n): add missing embedding translation keys, sync locales, clean up dead replaceMode branch

This commit is contained in:
Will Miao
2026-06-11 23:03:14 +08:00
parent d87863b423
commit 519bafebc8
16 changed files with 59 additions and 26 deletions

View File

@@ -113,6 +113,7 @@
"replacePreview": "Vorschau ersetzen", "replacePreview": "Vorschau ersetzen",
"copyCheckpointName": "Checkpoint-Name kopieren", "copyCheckpointName": "Checkpoint-Name kopieren",
"copyEmbeddingName": "Embedding-Name kopieren", "copyEmbeddingName": "Embedding-Name kopieren",
"embeddingNameCopied": "Embedding-Syntax kopiert",
"sendCheckpointToWorkflow": "An ComfyUI senden", "sendCheckpointToWorkflow": "An ComfyUI senden",
"sendEmbeddingToWorkflow": "An ComfyUI senden" "sendEmbeddingToWorkflow": "An ComfyUI senden"
}, },
@@ -1500,11 +1501,14 @@
"noMatchingNodes": "Keine kompatiblen Knoten im aktuellen Workflow verfügbar", "noMatchingNodes": "Keine kompatiblen Knoten im aktuellen Workflow verfügbar",
"noTargetNodeSelected": "Kein Zielknoten ausgewählt", "noTargetNodeSelected": "Kein Zielknoten ausgewählt",
"modelUpdated": "Modell im Workflow aktualisiert", "modelUpdated": "Modell im Workflow aktualisiert",
"modelFailed": "Fehler beim Aktualisieren des Modellknotens" "modelFailed": "Fehler beim Aktualisieren des Modellknotens",
"embeddingAdded": "Embedding zum Workflow hinzugefügt",
"embeddingFailed": "Fehler beim Hinzufügen des Embeddings"
}, },
"nodeSelector": { "nodeSelector": {
"recipe": "Rezept", "recipe": "Rezept",
"lora": "LoRA", "lora": "LoRA",
"embedding": "Embedding",
"replace": "Ersetzen", "replace": "Ersetzen",
"append": "Anhängen", "append": "Anhängen",
"selectTargetNode": "Zielknoten auswählen", "selectTargetNode": "Zielknoten auswählen",

View File

@@ -113,6 +113,7 @@
"replacePreview": "Replace Preview", "replacePreview": "Replace Preview",
"copyCheckpointName": "Copy checkpoint name", "copyCheckpointName": "Copy checkpoint name",
"copyEmbeddingName": "Copy embedding name", "copyEmbeddingName": "Copy embedding name",
"embeddingNameCopied": "Embedding syntax copied",
"sendCheckpointToWorkflow": "Send to ComfyUI", "sendCheckpointToWorkflow": "Send to ComfyUI",
"sendEmbeddingToWorkflow": "Send to ComfyUI" "sendEmbeddingToWorkflow": "Send to ComfyUI"
}, },
@@ -1500,11 +1501,14 @@
"noMatchingNodes": "No compatible nodes available in the current workflow", "noMatchingNodes": "No compatible nodes available in the current workflow",
"noTargetNodeSelected": "No target node selected", "noTargetNodeSelected": "No target node selected",
"modelUpdated": "Model updated in workflow", "modelUpdated": "Model updated in workflow",
"modelFailed": "Failed to update model node" "modelFailed": "Failed to update model node",
"embeddingAdded": "Embedding added to workflow",
"embeddingFailed": "Failed to add embedding"
}, },
"nodeSelector": { "nodeSelector": {
"recipe": "Recipe", "recipe": "Recipe",
"lora": "LoRA", "lora": "LoRA",
"embedding": "Embedding",
"replace": "Replace", "replace": "Replace",
"append": "Append", "append": "Append",
"selectTargetNode": "Select target node", "selectTargetNode": "Select target node",

View File

@@ -113,6 +113,7 @@
"replacePreview": "Reemplazar vista previa", "replacePreview": "Reemplazar vista previa",
"copyCheckpointName": "Copiar nombre del checkpoint", "copyCheckpointName": "Copiar nombre del checkpoint",
"copyEmbeddingName": "Copiar nombre del embedding", "copyEmbeddingName": "Copiar nombre del embedding",
"embeddingNameCopied": "Sintaxis de embedding copiada",
"sendCheckpointToWorkflow": "Enviar a ComfyUI", "sendCheckpointToWorkflow": "Enviar a ComfyUI",
"sendEmbeddingToWorkflow": "Enviar a ComfyUI" "sendEmbeddingToWorkflow": "Enviar a ComfyUI"
}, },
@@ -1500,11 +1501,14 @@
"noMatchingNodes": "No hay nodos compatibles disponibles en el flujo de trabajo actual", "noMatchingNodes": "No hay nodos compatibles disponibles en el flujo de trabajo actual",
"noTargetNodeSelected": "No se ha seleccionado ningún nodo de destino", "noTargetNodeSelected": "No se ha seleccionado ningún nodo de destino",
"modelUpdated": "Modelo actualizado en el flujo de trabajo", "modelUpdated": "Modelo actualizado en el flujo de trabajo",
"modelFailed": "Error al actualizar nodo de modelo" "modelFailed": "Error al actualizar nodo de modelo",
"embeddingAdded": "Embedding añadido al flujo de trabajo",
"embeddingFailed": "Error al añadir el embedding"
}, },
"nodeSelector": { "nodeSelector": {
"recipe": "Receta", "recipe": "Receta",
"lora": "LoRA", "lora": "LoRA",
"embedding": "Embedding",
"replace": "Reemplazar", "replace": "Reemplazar",
"append": "Añadir", "append": "Añadir",
"selectTargetNode": "Seleccionar nodo de destino", "selectTargetNode": "Seleccionar nodo de destino",

View File

@@ -113,6 +113,7 @@
"replacePreview": "Remplacer l'aperçu", "replacePreview": "Remplacer l'aperçu",
"copyCheckpointName": "Copier le nom du checkpoint", "copyCheckpointName": "Copier le nom du checkpoint",
"copyEmbeddingName": "Copier le nom de l'embedding", "copyEmbeddingName": "Copier le nom de l'embedding",
"embeddingNameCopied": "Syntaxe dembedding copiée",
"sendCheckpointToWorkflow": "Envoyer vers ComfyUI", "sendCheckpointToWorkflow": "Envoyer vers ComfyUI",
"sendEmbeddingToWorkflow": "Envoyer vers ComfyUI" "sendEmbeddingToWorkflow": "Envoyer vers ComfyUI"
}, },
@@ -1500,11 +1501,14 @@
"noMatchingNodes": "Aucun nœud compatible disponible dans le workflow actuel", "noMatchingNodes": "Aucun nœud compatible disponible dans le workflow actuel",
"noTargetNodeSelected": "Aucun nœud cible sélectionné", "noTargetNodeSelected": "Aucun nœud cible sélectionné",
"modelUpdated": "Modèle mis à jour dans le workflow", "modelUpdated": "Modèle mis à jour dans le workflow",
"modelFailed": "Échec de la mise à jour du nœud modèle" "modelFailed": "Échec de la mise à jour du nœud modèle",
"embeddingAdded": "Embedding ajouté au workflow",
"embeddingFailed": "Échec de l'ajout de l'embedding"
}, },
"nodeSelector": { "nodeSelector": {
"recipe": "Recipe", "recipe": "Recipe",
"lora": "LoRA", "lora": "LoRA",
"embedding": "Embedding",
"replace": "Remplacer", "replace": "Remplacer",
"append": "Ajouter", "append": "Ajouter",
"selectTargetNode": "Sélectionner le nœud cible", "selectTargetNode": "Sélectionner le nœud cible",

View File

@@ -113,6 +113,7 @@
"replacePreview": "החלף תצוגה מקדימה", "replacePreview": "החלף תצוגה מקדימה",
"copyCheckpointName": "העתק שם Checkpoint", "copyCheckpointName": "העתק שם Checkpoint",
"copyEmbeddingName": "העתק שם Embedding", "copyEmbeddingName": "העתק שם Embedding",
"embeddingNameCopied": "תחביר Embedding הועתק",
"sendCheckpointToWorkflow": "שלח ל-ComfyUI", "sendCheckpointToWorkflow": "שלח ל-ComfyUI",
"sendEmbeddingToWorkflow": "שלח ל-ComfyUI" "sendEmbeddingToWorkflow": "שלח ל-ComfyUI"
}, },
@@ -1500,11 +1501,14 @@
"noMatchingNodes": "אין צמתים תואמים זמינים ב-workflow הנוכחי", "noMatchingNodes": "אין צמתים תואמים זמינים ב-workflow הנוכחי",
"noTargetNodeSelected": "לא נבחר צומת יעד", "noTargetNodeSelected": "לא נבחר צומת יעד",
"modelUpdated": "מודל עודכן ב-workflow", "modelUpdated": "מודל עודכן ב-workflow",
"modelFailed": "עדכון צומת המודל נכשל" "modelFailed": "עדכון צומת המודל נכשל",
"embeddingAdded": "Embedding נוסף ל-workflow",
"embeddingFailed": "הוספת Embedding נכשלה"
}, },
"nodeSelector": { "nodeSelector": {
"recipe": "מתכון", "recipe": "מתכון",
"lora": "LoRA", "lora": "LoRA",
"embedding": "Embedding",
"replace": "החלף", "replace": "החלף",
"append": "הוסף", "append": "הוסף",
"selectTargetNode": "בחר צומת יעד", "selectTargetNode": "בחר צומת יעד",

View File

@@ -113,6 +113,7 @@
"replacePreview": "プレビューを置換", "replacePreview": "プレビューを置換",
"copyCheckpointName": "checkpoint名をコピー", "copyCheckpointName": "checkpoint名をコピー",
"copyEmbeddingName": "embedding名をコピー", "copyEmbeddingName": "embedding名をコピー",
"embeddingNameCopied": "Embedding構文をコピーしました",
"sendCheckpointToWorkflow": "ComfyUIに送信", "sendCheckpointToWorkflow": "ComfyUIに送信",
"sendEmbeddingToWorkflow": "ComfyUIに送信" "sendEmbeddingToWorkflow": "ComfyUIに送信"
}, },
@@ -1500,11 +1501,14 @@
"noMatchingNodes": "現在のワークフローには互換性のあるノードがありません", "noMatchingNodes": "現在のワークフローには互換性のあるノードがありません",
"noTargetNodeSelected": "ターゲットノードが選択されていません", "noTargetNodeSelected": "ターゲットノードが選択されていません",
"modelUpdated": "モデルがワークフローで更新されました", "modelUpdated": "モデルがワークフローで更新されました",
"modelFailed": "モデルノードの更新に失敗しました" "modelFailed": "モデルノードの更新に失敗しました",
"embeddingAdded": "Embeddingをワークフローに追加しました",
"embeddingFailed": "Embeddingの追加に失敗しました"
}, },
"nodeSelector": { "nodeSelector": {
"recipe": "レシピ", "recipe": "レシピ",
"lora": "LoRA", "lora": "LoRA",
"embedding": "Embedding",
"replace": "置換", "replace": "置換",
"append": "追加", "append": "追加",
"selectTargetNode": "ターゲットノードを選択", "selectTargetNode": "ターゲットノードを選択",

View File

@@ -113,6 +113,7 @@
"replacePreview": "미리보기 교체", "replacePreview": "미리보기 교체",
"copyCheckpointName": "Checkpoint 이름 복사", "copyCheckpointName": "Checkpoint 이름 복사",
"copyEmbeddingName": "Embedding 이름 복사", "copyEmbeddingName": "Embedding 이름 복사",
"embeddingNameCopied": "Embedding 구문 복사됨",
"sendCheckpointToWorkflow": "ComfyUI로 전송", "sendCheckpointToWorkflow": "ComfyUI로 전송",
"sendEmbeddingToWorkflow": "ComfyUI로 전송" "sendEmbeddingToWorkflow": "ComfyUI로 전송"
}, },
@@ -1500,11 +1501,14 @@
"noMatchingNodes": "현재 워크플로에서 호환되는 노드가 없습니다", "noMatchingNodes": "현재 워크플로에서 호환되는 노드가 없습니다",
"noTargetNodeSelected": "대상 노드가 선택되지 않았습니다", "noTargetNodeSelected": "대상 노드가 선택되지 않았습니다",
"modelUpdated": "모델이 워크플로에서 업데이트되었습니다", "modelUpdated": "모델이 워크플로에서 업데이트되었습니다",
"modelFailed": "모델 노드 업데이트 실패" "modelFailed": "모델 노드 업데이트 실패",
"embeddingAdded": "Embedding을 워크플로에 추가했습니다",
"embeddingFailed": "Embedding 추가 실패"
}, },
"nodeSelector": { "nodeSelector": {
"recipe": "레시피", "recipe": "레시피",
"lora": "LoRA", "lora": "LoRA",
"embedding": "임베딩",
"replace": "교체", "replace": "교체",
"append": "추가", "append": "추가",
"selectTargetNode": "대상 노드 선택", "selectTargetNode": "대상 노드 선택",

View File

@@ -113,6 +113,7 @@
"replacePreview": "Заменить превью", "replacePreview": "Заменить превью",
"copyCheckpointName": "Копировать имя checkpoint", "copyCheckpointName": "Копировать имя checkpoint",
"copyEmbeddingName": "Копировать имя embedding", "copyEmbeddingName": "Копировать имя embedding",
"embeddingNameCopied": "Синтаксис embedding скопирован",
"sendCheckpointToWorkflow": "Отправить в ComfyUI", "sendCheckpointToWorkflow": "Отправить в ComfyUI",
"sendEmbeddingToWorkflow": "Отправить в ComfyUI" "sendEmbeddingToWorkflow": "Отправить в ComfyUI"
}, },
@@ -1500,11 +1501,14 @@
"noMatchingNodes": "В текущем workflow нет совместимых узлов", "noMatchingNodes": "В текущем workflow нет совместимых узлов",
"noTargetNodeSelected": "Целевой узел не выбран", "noTargetNodeSelected": "Целевой узел не выбран",
"modelUpdated": "Модель обновлена в workflow", "modelUpdated": "Модель обновлена в workflow",
"modelFailed": "Не удалось обновить узел модели" "modelFailed": "Не удалось обновить узел модели",
"embeddingAdded": "Embedding добавлен в workflow",
"embeddingFailed": "Не удалось добавить embedding"
}, },
"nodeSelector": { "nodeSelector": {
"recipe": "Рецепт", "recipe": "Рецепт",
"lora": "LoRA", "lora": "LoRA",
"embedding": "Эмбеддинг",
"replace": "Заменить", "replace": "Заменить",
"append": "Добавить", "append": "Добавить",
"selectTargetNode": "Выберите целевой узел", "selectTargetNode": "Выберите целевой узел",

View File

@@ -113,6 +113,7 @@
"replacePreview": "替换预览", "replacePreview": "替换预览",
"copyCheckpointName": "复制 Checkpoint 名称", "copyCheckpointName": "复制 Checkpoint 名称",
"copyEmbeddingName": "复制 Embedding 名称", "copyEmbeddingName": "复制 Embedding 名称",
"embeddingNameCopied": "已复制 Embedding 语法",
"sendCheckpointToWorkflow": "发送到 ComfyUI", "sendCheckpointToWorkflow": "发送到 ComfyUI",
"sendEmbeddingToWorkflow": "发送到 ComfyUI" "sendEmbeddingToWorkflow": "发送到 ComfyUI"
}, },
@@ -1500,11 +1501,14 @@
"noMatchingNodes": "当前工作流中没有兼容的节点", "noMatchingNodes": "当前工作流中没有兼容的节点",
"noTargetNodeSelected": "未选择目标节点", "noTargetNodeSelected": "未选择目标节点",
"modelUpdated": "模型已更新到工作流", "modelUpdated": "模型已更新到工作流",
"modelFailed": "更新模型节点失败" "modelFailed": "更新模型节点失败",
"embeddingAdded": "Embedding 已追加到工作流",
"embeddingFailed": "添加 Embedding 失败"
}, },
"nodeSelector": { "nodeSelector": {
"recipe": "配方", "recipe": "配方",
"lora": "LoRA", "lora": "LoRA",
"embedding": "Embedding",
"replace": "替换", "replace": "替换",
"append": "追加", "append": "追加",
"selectTargetNode": "选择目标节点", "selectTargetNode": "选择目标节点",

View File

@@ -113,6 +113,7 @@
"replacePreview": "更換預覽圖", "replacePreview": "更換預覽圖",
"copyCheckpointName": "複製檢查點名稱", "copyCheckpointName": "複製檢查點名稱",
"copyEmbeddingName": "複製嵌入名稱", "copyEmbeddingName": "複製嵌入名稱",
"embeddingNameCopied": "已複製 Embedding 語法",
"sendCheckpointToWorkflow": "傳送到 ComfyUI", "sendCheckpointToWorkflow": "傳送到 ComfyUI",
"sendEmbeddingToWorkflow": "傳送到 ComfyUI" "sendEmbeddingToWorkflow": "傳送到 ComfyUI"
}, },
@@ -1500,11 +1501,14 @@
"noMatchingNodes": "目前工作流程中沒有相容的節點", "noMatchingNodes": "目前工作流程中沒有相容的節點",
"noTargetNodeSelected": "未選擇目標節點", "noTargetNodeSelected": "未選擇目標節點",
"modelUpdated": "模型已更新到工作流", "modelUpdated": "模型已更新到工作流",
"modelFailed": "更新模型節點失敗" "modelFailed": "更新模型節點失敗",
"embeddingAdded": "Embedding 已附加到工作流",
"embeddingFailed": "傳送 Embedding 到工作流失敗"
}, },
"nodeSelector": { "nodeSelector": {
"recipe": "配方", "recipe": "配方",
"lora": "LoRA", "lora": "LoRA",
"embedding": "Embedding",
"replace": "取代", "replace": "取代",
"append": "附加", "append": "附加",
"selectTargetNode": "選擇目標節點", "selectTargetNode": "選擇目標節點",

View File

@@ -56,7 +56,7 @@ export class EmbeddingContextMenu extends BaseContextMenu {
const folder = this.currentCard.dataset.folder || ''; const folder = this.currentCard.dataset.folder || '';
const name = this.currentCard.dataset.file_name || ''; const name = this.currentCard.dataset.file_name || '';
const embeddingCode = folder ? `embedding:${folder}/${name}` : `embedding:${name}`; const embeddingCode = folder ? `embedding:${folder}/${name}` : `embedding:${name}`;
sendEmbeddingToWorkflow(embeddingCode, false); sendEmbeddingToWorkflow(embeddingCode);
break; break;
} }
case 'refresh-metadata': case 'refresh-metadata':

View File

@@ -220,7 +220,7 @@ function handleSendToWorkflow(card, replaceMode, modelType) {
const folder = card.dataset.folder || ''; const folder = card.dataset.folder || '';
const name = card.dataset.file_name || ''; const name = card.dataset.file_name || '';
const embeddingCode = folder ? `embedding:${folder}/${name}` : `embedding:${name}`; const embeddingCode = folder ? `embedding:${folder}/${name}` : `embedding:${name}`;
sendEmbeddingToWorkflow(embeddingCode, false); sendEmbeddingToWorkflow(embeddingCode);
} else { } else {
showToast('modelCard.sendToWorkflow.checkpointNotImplemented', {}, 'info'); showToast('modelCard.sendToWorkflow.checkpointNotImplemented', {}, 'info');
} }

View File

@@ -1195,7 +1195,7 @@ async function handleSendToWorkflow(target, modelType) {
const folder = modalElement?.dataset?.folder || ''; const folder = modalElement?.dataset?.folder || '';
const name = currentFileName.replace(/\.[^.]+$/, ''); const name = currentFileName.replace(/\.[^.]+$/, '');
const embeddingCode = folder ? `embedding:${folder}/${name}` : `embedding:${name}`; const embeddingCode = folder ? `embedding:${folder}/${name}` : `embedding:${name}`;
await sendEmbeddingToWorkflow(embeddingCode, false); await sendEmbeddingToWorkflow(embeddingCode);
} }
} }

View File

@@ -565,7 +565,7 @@ export class BulkManager {
} }
const joinedCode = embeddingCodes.join(', '); const joinedCode = embeddingCodes.join(', ');
await sendEmbeddingToWorkflow(joinedCode, false); await sendEmbeddingToWorkflow(joinedCode);
} }
showBulkDeleteModal() { showBulkDeleteModal() {

View File

@@ -918,7 +918,7 @@ async function sendTextToNodes(nodeIds, nodesMap, text, mode, messages = {}) {
} }
} }
export async function sendEmbeddingToWorkflow(embeddingCode, replaceMode = false) { export async function sendEmbeddingToWorkflow(embeddingCode) {
const registry = await fetchWorkflowRegistry(); const registry = await fetchWorkflowRegistry();
if (!registry) { if (!registry) {
return false; return false;
@@ -937,32 +937,24 @@ export async function sendEmbeddingToWorkflow(embeddingCode, replaceMode = false
return false; return false;
} }
const mode = replaceMode ? 'replace' : 'append';
const messages = { const messages = {
successMessage: translate( successMessage: translate('uiHelpers.workflow.embeddingAdded', {}, 'Embedding added to workflow'),
replaceMode ? 'uiHelpers.workflow.embeddingReplaced' : 'uiHelpers.workflow.embeddingAdded',
{},
replaceMode ? 'Embedding replaced in workflow' : 'Embedding added to workflow'
),
failureMessage: translate('uiHelpers.workflow.embeddingFailed', {}, 'Failed to add embedding'), failureMessage: translate('uiHelpers.workflow.embeddingFailed', {}, 'Failed to add embedding'),
missingTargetMessage: translate('uiHelpers.workflow.noTargetNodeSelected', {}, 'No target node selected'), missingTargetMessage: translate('uiHelpers.workflow.noTargetNodeSelected', {}, 'No target node selected'),
}; };
const handleSend = (selectedNodeIds) => const handleSend = (selectedNodeIds) =>
sendTextToNodes(selectedNodeIds, textNodes, embeddingCode, mode, messages); sendTextToNodes(selectedNodeIds, textNodes, embeddingCode, 'append', messages);
if (nodeKeys.length === 1) { if (nodeKeys.length === 1) {
return await handleSend([nodeKeys[0]]); return await handleSend([nodeKeys[0]]);
} }
const actionType = translate('uiHelpers.nodeSelector.embedding', {}, 'Embedding'); const actionType = translate('uiHelpers.nodeSelector.embedding', {}, 'Embedding');
const actionMode = replaceMode
? translate('uiHelpers.nodeSelector.replace', {}, 'Replace')
: translate('uiHelpers.nodeSelector.append', {}, 'Append');
showNodeSelector(textNodes, { showNodeSelector(textNodes, {
actionType, actionType,
actionMode, actionMode: '',
onSend: handleSend, onSend: handleSend,
}); });
return true; return true;

View File

@@ -754,6 +754,7 @@ async def test_update_node_widget_sends_payload():
"widget_name": "ckpt_name", "widget_name": "ckpt_name",
"value": "models/checkpoints/model.ckpt", "value": "models/checkpoints/model.ckpt",
"graph_id": "root", "graph_id": "root",
"mode": "replace",
}, },
) )
] ]