@synthetic-ai/illustrator-mcp 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +57 -0
- package/i18n/i18n-core.cjs +224 -0
- package/i18n/locales/de.json +230 -0
- package/i18n/locales/en.json +230 -0
- package/i18n/locales/es.json +230 -0
- package/i18n/locales/fr.json +230 -0
- package/i18n/locales/hashes/de.json +230 -0
- package/i18n/locales/hashes/es.json +230 -0
- package/i18n/locales/hashes/fr.json +230 -0
- package/i18n/locales/hashes/ja.json +230 -0
- package/i18n/locales/hashes/pt-BR.json +230 -0
- package/i18n/locales/ja.json +230 -0
- package/i18n/locales/pt-BR.json +230 -0
- package/i18n/locales.js +3 -0
- package/i18n/node.cjs +124 -0
- package/i18n/panel.cjs +178 -0
- package/package.json +50 -0
- package/server.mjs +726 -0
package/i18n/locales.js
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/* Generado por synthetic-idiomas (tools/i18n.mjs build) — no editar a mano. */
|
|
2
|
+
(function (r) { r.SyntheticLocales = r.SyntheticLocales || {}; r.SyntheticLocales["illustrator-mcp"] = {"en":{"ui.i18n.language":"Language","ui.i18n.restartNote":"The AI tool descriptions switch language after you restart the MCP server (or the app that runs it).","ui.i18n.saved":"Language saved.","ui.i18n.saveFailed":"Couldn't save the language preference. It will only last for this session.","msg.bridge.notConnected":"Illustrator not connected. Open Illustrator with the «Synthetic Illustrator MCP» panel (which hosts the bridge on port {port}).","msg.bridge.timeout":"timeout ({ms}ms)","msg.doctor.bridgeConnecting":"Bridge: connecting to {url} (checking the Synthetic Illustrator MCP panel is open in Illustrator)...","msg.doctor.bridgeFail":"Bridge not reachable. Open Illustrator with the Synthetic Illustrator MCP panel (Window → Extensions → Synthetic Illustrator MCP) and confirm it says \"Bridge active\".","msg.doctor.bridgeOk":"Bridge reachable — Synthetic Illustrator MCP panel is running inside Illustrator.","msg.doctor.language":"Language: {language} (source: {source})","msg.doctor.licenseFailed":"License check failed: {message}","msg.doctor.licenseInvalid":"invalid","msg.doctor.licenseNotSet":"IL_MCP_LICENSE is not set. Get a license at https://synthetic.com.ar/illustrator-mcp","msg.doctor.licensePlanActive":"active","msg.doctor.licenseValid":"License valid ({plan})","msg.doctor.nodeOk":"Node.js {version} (>=18 required)","msg.doctor.nodeTooOld":"Node.js {version} — needs to be 18 or newer","msg.doctor.support":"Still stuck? Paste this output into a ticket at https://synthetic.com.ar/dashboard/support","msg.doctor.title":"Synthetic Illustrator MCP — doctor","msg.healthcheck.hint":"Open Illustrator with the Synthetic Illustrator MCP panel (it hosts the bridge).","msg.host.errorAtLine":"{message} (line {line})","msg.host.itemNotFound":"Item not found: {name}","msg.host.layerNotFound":"Layer not found: {name}","msg.host.noDocument":"No document open","msg.host.notACompoundPath":"Not a compound path: {name}","msg.host.notAGroup":"Not a group: {name}","msg.host.notAPath":"Not a path: {name}","msg.host.unknownCommand":"unknown cmd: {cmd}","msg.license.getLicense":"Get a license at https://synthetic.com.ar/illustrator-mcp","msg.license.invalidOrMissing":"Invalid or missing license.","msg.license.noKey":"No license key. Set IL_MCP_LICENSE in your MCP config. Get a license at https://synthetic.com.ar/illustrator-mcp","msg.license.required":"License required","msg.license.serverUnreachable":"License server unreachable. Check your internet connection.","msg.license.serverUnreachableRetry":"License server unreachable. Will retry next call.","msg.server.instructions":"Illustrator MCP (Synthetic). Controls Adobe Illustrator through a bridge plugin. Tool convention: diagnostics il_* ; domain verb_noun (list_layers, get_document_info) ; escape hatches run_jsx / run_jsx_json. Start with il_healthcheck. Page items are addressed by name (set one with rename_item if an item has none) — list_items/get_item/get_selection to discover names. Covers documents, layers, items (move/rotate/resize/z-order/group), paths, shapes, text, color/fill/stroke/swatches, artboards, and export (PNG/JPG/SVG/PDF).","ui.log.backupFailed":"Backup failed for {file}: {message}","ui.log.bridgeError":"bridge error: {message}","ui.log.clear":"clear","ui.log.clearTitle":"Clear log","ui.log.clientConnected":"MCP client connected ({count})","ui.log.clientDisconnected":"MCP client disconnected ({count})","ui.log.commitFailed":"Commit failed (rolled back): {message}","ui.log.downloadFailed":"Download failed for {file}: {message}","ui.log.downloading":"Downloading {file}...","ui.log.licenseSaveError":"Error saving license key: {message}","ui.log.listening":"bridge listening on 127.0.0.1:{port}","ui.log.noUpdate":"No update to apply","ui.log.portInUse":"port {port} in use: {message}","ui.log.portRetry":"port {port} still in use, retrying ({attempt}/{max})...","ui.log.restartingBridge":"Restarting bridge...","ui.log.shaMismatch":"SHA256 mismatch for {file} (got {got}..., expected {expected}...)","ui.log.sizeDiffers":"Size differs from manifest for {file} ({got} vs {expected}) — continuing","ui.log.title":"Activity log","ui.log.toggleTitle":"Show/hide log","ui.log.updateAborted":"Update aborted: {reason}","ui.log.updateApplied":"Update v{version} applied. RESTART ILLUSTRATOR to load the new panel.","ui.log.updateNoLicense":"Update failed: no license key saved. Open Settings (⚙) and paste your license key.","ui.log.wsLoadFailed":"could not load 'ws': {message} (--enable-nodejs?)","ui.product.subtitle":"Bridge · in development","ui.settings.licenseEmpty":"Enter a license key before saving.","ui.settings.licenseKey":"License key","ui.settings.licenseNotSaved":"No license key saved yet — required for updates.","ui.settings.licensePlaceholder":"Paste your Illustrator MCP license key","ui.settings.licenseSaveFailed":"Failed to save license key (see log).","ui.settings.licenseSaved":"License key saved.","ui.settings.saveLicense":"Save license","ui.shell.builtBy":"Built by","ui.shell.openSite":"Open synthetic.com.ar","ui.status.active":"Bridge active","ui.status.clientsMany":"{count} MCP clients","ui.status.clientsOne":"{count} MCP client","ui.status.error":"Error: {message}","ui.status.nodeUnavailable":"Node/ws unavailable","ui.status.port":"Port {port}","ui.status.portOpenFailed":"Could not open port {port}","ui.status.restart":"Restart","ui.status.starting":"Starting bridge…","ui.status.stopped":"Stopped","ui.status.updateApplied":"Update applied — restart Illustrator","ui.status.updateFailed":"Update failed","ui.status.waitingForClient":"waiting for client","ui.status.wsNoServer":"ws has no WebSocketServer","ui.toolbar.reload":"Reload panel","ui.toolbar.settings":"Settings","ui.update.appliedBody":"Close and reopen Illustrator to activate v{version}.","ui.update.appliedTitle":"Update applied.","ui.update.available":"Update available","ui.update.installerTitle":"If hot-swap fails or the release needs a fresh manifest","ui.update.later":"Later","ui.update.now":"Update now","ui.update.ok":"OK","ui.update.updating":"Updating..."},"es":{"msg.bridge.notConnected":"Illustrator no está conectado. Abre Illustrator con el panel «Synthetic Illustrator MCP» (que aloja el bridge en el puerto {port}).","msg.bridge.timeout":"tiempo de espera agotado ({ms}ms)","msg.doctor.bridgeConnecting":"Bridge: conectando a {url} (verificando que el panel Synthetic Illustrator MCP esté abierto en Illustrator)...","msg.doctor.bridgeFail":"No se puede acceder al bridge. Abre Illustrator con el panel Synthetic Illustrator MCP (Ventana → Extensiones → Synthetic Illustrator MCP) y confirma que diga \"Bridge active\".","msg.doctor.bridgeOk":"Bridge accesible — el panel Synthetic Illustrator MCP se está ejecutando dentro de Illustrator.","msg.doctor.language":"Idioma: {language} (origen: {source})","msg.doctor.licenseFailed":"Falló la verificación de la licencia: {message}","msg.doctor.licenseInvalid":"no válida","msg.doctor.licenseNotSet":"IL_MCP_LICENSE no está configurada. Obtén una licencia en https://synthetic.com.ar/illustrator-mcp","msg.doctor.licensePlanActive":"activa","msg.doctor.licenseValid":"Licencia válida ({plan})","msg.doctor.nodeOk":"Node.js {version} (se requiere >=18)","msg.doctor.nodeTooOld":"Node.js {version} — se necesita la versión 18 o posterior","msg.doctor.support":"¿Sigues con problemas? Pega esta salida en un ticket en https://synthetic.com.ar/dashboard/support","msg.doctor.title":"Synthetic Illustrator MCP — doctor","msg.healthcheck.hint":"Abre Illustrator con el panel Synthetic Illustrator MCP (aloja el bridge).","msg.host.errorAtLine":"{message} (línea {line})","msg.host.itemNotFound":"Elemento no encontrado: {name}","msg.host.layerNotFound":"No se encontró la capa: {name}","msg.host.noDocument":"No hay ningún documento abierto","msg.host.notACompoundPath":"No es un trazado compuesto: {name}","msg.host.notAGroup":"No es un grupo: {name}","msg.host.notAPath":"No es un trazado: {name}","msg.host.unknownCommand":"comando desconocido: {cmd}","msg.license.getLicense":"Obtén una licencia en https://synthetic.com.ar/illustrator-mcp","msg.license.invalidOrMissing":"Licencia no válida o faltante.","msg.license.noKey":"No hay clave de licencia. Configura IL_MCP_LICENSE en tu configuración MCP. Obtén una licencia en https://synthetic.com.ar/illustrator-mcp","msg.license.required":"Se requiere una licencia","msg.license.serverUnreachable":"No se puede contactar al servidor de licencias. Revisa tu conexión a internet.","msg.license.serverUnreachableRetry":"No se puede contactar al servidor de licencias. Se reintentará en la próxima llamada.","msg.server.instructions":"Illustrator MCP (Synthetic). Controla Adobe Illustrator a través de un plugin puente. Convención de tools: diagnóstico il_* ; dominio verbo_sustantivo (list_layers, get_document_info) ; escape hatches run_jsx / run_jsx_json. Empieza con il_healthcheck. Los elementos de página se direccionan por nombre (asignale uno con rename_item si un elemento no tiene) — usa list_items/get_item/get_selection para descubrir nombres. Cubre documentos, capas, elementos (mover/rotar/escalar/orden Z/agrupar), trazados, formas, texto, color/relleno/trazo/muestras, mesas de trabajo y exportación (PNG/JPG/SVG/PDF).","ui.i18n.language":"Idioma","ui.i18n.restartNote":"Las descripciones de las herramientas de IA cambian de idioma cuando reinicias el servidor MCP (o la app que lo ejecuta).","ui.i18n.saveFailed":"No se pudo guardar la preferencia de idioma. Solo se mantendrá durante esta sesión.","ui.i18n.saved":"Idioma guardado.","ui.log.backupFailed":"Falló la copia de seguridad de {file}: {message}","ui.log.bridgeError":"error del bridge: {message}","ui.log.clear":"limpiar","ui.log.clearTitle":"Limpiar registro","ui.log.clientConnected":"Cliente MCP conectado ({count})","ui.log.clientDisconnected":"Cliente MCP desconectado ({count})","ui.log.commitFailed":"No se pudo aplicar (se revirtió): {message}","ui.log.downloadFailed":"Falló la descarga de {file}: {message}","ui.log.downloading":"Descargando {file}...","ui.log.licenseSaveError":"Error al guardar la clave de licencia: {message}","ui.log.listening":"bridge escuchando en 127.0.0.1:{port}","ui.log.noUpdate":"No hay ninguna actualización para aplicar","ui.log.portInUse":"puerto {port} en uso: {message}","ui.log.portRetry":"el puerto {port} sigue en uso, reintentando ({attempt}/{max})...","ui.log.restartingBridge":"Reiniciando el bridge...","ui.log.shaMismatch":"El SHA256 de {file} no coincide (se obtuvo {got}..., se esperaba {expected}...)","ui.log.sizeDiffers":"El tamaño de {file} difiere del manifiesto ({got} vs {expected}) — continuando","ui.log.title":"Registro de actividad","ui.log.toggleTitle":"Mostrar/ocultar registro","ui.log.updateAborted":"Actualización cancelada: {reason}","ui.log.updateApplied":"Actualización v{version} aplicada. REINICIA ILLUSTRATOR para cargar el panel nuevo.","ui.log.updateNoLicense":"Falló la actualización: no hay ninguna clave de licencia guardada. Abre Configuración (⚙) y pega tu clave de licencia.","ui.log.wsLoadFailed":"no se pudo cargar 'ws': {message} (--enable-nodejs?)","ui.product.subtitle":"Bridge · en desarrollo","ui.settings.licenseEmpty":"Ingresa una clave de licencia antes de guardar.","ui.settings.licenseKey":"Clave de licencia","ui.settings.licenseNotSaved":"Aún no hay ninguna clave de licencia guardada — es necesaria para las actualizaciones.","ui.settings.licensePlaceholder":"Pega tu clave de licencia de Illustrator MCP","ui.settings.licenseSaveFailed":"No se pudo guardar la clave de licencia (ver registro).","ui.settings.licenseSaved":"Clave de licencia guardada.","ui.settings.saveLicense":"Guardar licencia","ui.shell.builtBy":"Creado por","ui.shell.openSite":"Abrir synthetic.com.ar","ui.status.active":"Bridge activo","ui.status.clientsMany":"{count} clientes MCP","ui.status.clientsOne":"{count} cliente MCP","ui.status.error":"Error: {message}","ui.status.nodeUnavailable":"Node/ws no disponible","ui.status.port":"Puerto {port}","ui.status.portOpenFailed":"No se pudo abrir el puerto {port}","ui.status.restart":"Reiniciar","ui.status.starting":"Iniciando el bridge…","ui.status.stopped":"Detenido","ui.status.updateApplied":"Actualización aplicada — reinicia Illustrator","ui.status.updateFailed":"Falló la actualización","ui.status.waitingForClient":"esperando al cliente","ui.status.wsNoServer":"ws no tiene WebSocketServer","ui.toolbar.reload":"Recargar panel","ui.toolbar.settings":"Configuración","ui.update.appliedBody":"Cierra y vuelve a abrir Illustrator para activar la v{version}.","ui.update.appliedTitle":"Actualización aplicada.","ui.update.available":"Actualización disponible","ui.update.installerTitle":"Si el reemplazo en caliente falla o la versión necesita un manifiesto nuevo","ui.update.later":"Más tarde","ui.update.now":"Actualizar ahora","ui.update.ok":"OK","ui.update.updating":"Actualizando..."},"pt-BR":{"msg.bridge.notConnected":"Illustrator não conectado. Abra o Illustrator com o painel «Synthetic Illustrator MCP» (que hospeda a ponte na porta {port}).","msg.bridge.timeout":"tempo esgotado ({ms}ms)","msg.doctor.bridgeConnecting":"Ponte: conectando a {url} (verificando se o painel Synthetic Illustrator MCP está aberto no Illustrator)...","msg.doctor.bridgeFail":"Ponte inacessível. Abra o Illustrator com o painel Synthetic Illustrator MCP (Janela → Extensões → Synthetic Illustrator MCP) e confirme que ele mostra \"Bridge active\".","msg.doctor.bridgeOk":"Ponte acessível — o painel Synthetic Illustrator MCP está em execução no Illustrator.","msg.doctor.language":"Idioma: {language} (origem: {source})","msg.doctor.licenseFailed":"Falha na verificação da licença: {message}","msg.doctor.licenseInvalid":"inválida","msg.doctor.licenseNotSet":"IL_MCP_LICENSE não está definida. Obtenha uma licença em https://synthetic.com.ar/illustrator-mcp","msg.doctor.licensePlanActive":"ativa","msg.doctor.licenseValid":"Licença válida ({plan})","msg.doctor.nodeOk":"Node.js {version} (requer >=18)","msg.doctor.nodeTooOld":"Node.js {version} — precisa ser 18 ou mais recente","msg.doctor.support":"Ainda com problemas? Cole esta saída em um ticket em https://synthetic.com.ar/dashboard/support","msg.doctor.title":"Synthetic Illustrator MCP — doctor","msg.healthcheck.hint":"Abra o Illustrator com o painel Synthetic Illustrator MCP (ele hospeda a ponte).","msg.host.errorAtLine":"{message} (linha {line})","msg.host.itemNotFound":"Item não encontrado: {name}","msg.host.layerNotFound":"Camada não encontrada: {name}","msg.host.noDocument":"Nenhum documento aberto","msg.host.notACompoundPath":"Não é um traçado composto: {name}","msg.host.notAGroup":"Não é um grupo: {name}","msg.host.notAPath":"Não é um traçado: {name}","msg.host.unknownCommand":"comando desconhecido: {cmd}","msg.license.getLicense":"Obtenha uma licença em https://synthetic.com.ar/illustrator-mcp","msg.license.invalidOrMissing":"Licença inválida ou ausente.","msg.license.noKey":"Nenhuma chave de licença. Defina IL_MCP_LICENSE na configuração do MCP. Obtenha uma licença em https://synthetic.com.ar/illustrator-mcp","msg.license.required":"Licença necessária","msg.license.serverUnreachable":"Servidor de licenças inacessível. Verifique sua conexão com a internet.","msg.license.serverUnreachableRetry":"Servidor de licenças inacessível. Nova tentativa na próxima chamada.","msg.server.instructions":"Illustrator MCP (Synthetic). Controla o Adobe Illustrator por meio de um plugin ponte. Convenção de tools: diagnóstico il_* ; domínio verbo_substantivo (list_layers, get_document_info) ; escape hatches run_jsx / run_jsx_json. Comece com il_healthcheck. Os itens de página são endereçados por nome (defina um com rename_item se um item não tiver) — use list_items/get_item/get_selection para descobrir nomes. Cobre documentos, camadas, itens (mover/girar/redimensionar/ordem Z/agrupar), traçados, formas, texto, cor/preenchimento/traço/amostras, prancheta e exportação (PNG/JPG/SVG/PDF).","ui.i18n.language":"Idioma","ui.i18n.restartNote":"As descrições das ferramentas de IA mudam de idioma depois que você reinicia o servidor MCP (ou o app que o executa).","ui.i18n.saveFailed":"Não foi possível salvar a preferência de idioma. Ela valerá só nesta sessão.","ui.i18n.saved":"Idioma salvo.","ui.log.backupFailed":"Falha no backup de {file}: {message}","ui.log.bridgeError":"erro da ponte: {message}","ui.log.clear":"limpar","ui.log.clearTitle":"Limpar registro","ui.log.clientConnected":"Cliente MCP conectado ({count})","ui.log.clientDisconnected":"Cliente MCP desconectado ({count})","ui.log.commitFailed":"Falha ao confirmar (alterações revertidas): {message}","ui.log.downloadFailed":"Falha no download de {file}: {message}","ui.log.downloading":"Baixando {file}...","ui.log.licenseSaveError":"Erro ao salvar a chave de licença: {message}","ui.log.listening":"ponte escutando em 127.0.0.1:{port}","ui.log.noUpdate":"Nenhuma atualização para aplicar","ui.log.portInUse":"porta {port} em uso: {message}","ui.log.portRetry":"porta {port} ainda em uso, tentando de novo ({attempt}/{max})...","ui.log.restartingBridge":"Reiniciando a ponte...","ui.log.shaMismatch":"SHA256 não confere para {file} (obtido {got}..., esperado {expected}...)","ui.log.sizeDiffers":"Tamanho diferente do manifesto para {file} ({got} vs {expected}) — continuando","ui.log.title":"Registro de atividades","ui.log.toggleTitle":"Mostrar/ocultar registro","ui.log.updateAborted":"Atualização cancelada: {reason}","ui.log.updateApplied":"Atualização v{version} aplicada. REINICIE O ILLUSTRATOR para carregar o novo painel.","ui.log.updateNoLicense":"Falha na atualização: nenhuma chave de licença salva. Abra Configurações (⚙) e cole sua chave de licença.","ui.log.wsLoadFailed":"não foi possível carregar 'ws': {message} (--enable-nodejs?)","ui.product.subtitle":"Bridge · em desenvolvimento","ui.settings.licenseEmpty":"Insira uma chave de licença antes de salvar.","ui.settings.licenseKey":"Chave de licença","ui.settings.licenseNotSaved":"Nenhuma chave de licença salva — necessária para atualizações.","ui.settings.licensePlaceholder":"Cole sua chave de licença do Illustrator MCP","ui.settings.licenseSaveFailed":"Falha ao salvar a chave de licença (veja o registro).","ui.settings.licenseSaved":"Chave de licença salva.","ui.settings.saveLicense":"Salvar licença","ui.shell.builtBy":"Criado por","ui.shell.openSite":"Abrir synthetic.com.ar","ui.status.active":"Ponte ativa","ui.status.clientsMany":"{count} clientes MCP","ui.status.clientsOne":"{count} cliente MCP","ui.status.error":"Erro: {message}","ui.status.nodeUnavailable":"Node/ws indisponível","ui.status.port":"Porta {port}","ui.status.portOpenFailed":"Não foi possível abrir a porta {port}","ui.status.restart":"Reiniciar","ui.status.starting":"Iniciando a ponte…","ui.status.stopped":"Parado","ui.status.updateApplied":"Atualização aplicada — reinicie o Illustrator","ui.status.updateFailed":"Falha na atualização","ui.status.waitingForClient":"aguardando cliente","ui.status.wsNoServer":"ws não tem WebSocketServer","ui.toolbar.reload":"Recarregar painel","ui.toolbar.settings":"Configurações","ui.update.appliedBody":"Feche e reabra o Illustrator para ativar a v{version}.","ui.update.appliedTitle":"Atualização aplicada.","ui.update.available":"Atualização disponível","ui.update.installerTitle":"Se a troca a quente falhar ou a versão exigir um manifesto novo","ui.update.later":"Depois","ui.update.now":"Atualizar agora","ui.update.ok":"OK","ui.update.updating":"Atualizando..."},"fr":{"msg.bridge.notConnected":"Illustrator n'est pas connecté. Ouvrez Illustrator avec le panneau « Synthetic Illustrator MCP » (qui héberge la passerelle sur le port {port}).","msg.bridge.timeout":"délai dépassé ({ms} ms)","msg.doctor.bridgeConnecting":"Passerelle : connexion à {url} (vérification que le panneau Synthetic Illustrator MCP est ouvert dans Illustrator)...","msg.doctor.bridgeFail":"Passerelle injoignable. Ouvrez Illustrator avec le panneau Synthetic Illustrator MCP (Fenêtre → Extensions → Synthetic Illustrator MCP) et vérifiez qu'il indique \"Bridge active\".","msg.doctor.bridgeOk":"Passerelle joignable — le panneau Synthetic Illustrator MCP est en cours d'exécution dans Illustrator.","msg.doctor.language":"Langue : {language} (source : {source})","msg.doctor.licenseFailed":"Échec de la vérification de la licence : {message}","msg.doctor.licenseInvalid":"non valide","msg.doctor.licenseNotSet":"IL_MCP_LICENSE n'est pas défini. Obtenez une licence sur https://synthetic.com.ar/illustrator-mcp","msg.doctor.licensePlanActive":"active","msg.doctor.licenseValid":"Licence valide ({plan})","msg.doctor.nodeOk":"Node.js {version} (>=18 requis)","msg.doctor.nodeTooOld":"Node.js {version} — la version 18 ou ultérieure est requise","msg.doctor.support":"Toujours bloqué ? Collez cette sortie dans un ticket sur https://synthetic.com.ar/dashboard/support","msg.doctor.title":"Synthetic Illustrator MCP — doctor","msg.healthcheck.hint":"Ouvrez Illustrator avec le panneau Synthetic Illustrator MCP (il héberge la passerelle).","msg.host.errorAtLine":"{message} (ligne {line})","msg.host.itemNotFound":"Élément introuvable : {name}","msg.host.layerNotFound":"Calque introuvable : {name}","msg.host.noDocument":"Aucun document ouvert","msg.host.notACompoundPath":"Ce n'est pas un tracé composé : {name}","msg.host.notAGroup":"Ce n'est pas un groupe : {name}","msg.host.notAPath":"Ce n'est pas un tracé : {name}","msg.host.unknownCommand":"commande inconnue : {cmd}","msg.license.getLicense":"Obtenez une licence sur https://synthetic.com.ar/illustrator-mcp","msg.license.invalidOrMissing":"Licence non valide ou manquante.","msg.license.noKey":"Aucune clé de licence. Définissez IL_MCP_LICENSE dans votre configuration MCP. Obtenez une licence sur https://synthetic.com.ar/illustrator-mcp","msg.license.required":"Licence requise","msg.license.serverUnreachable":"Serveur de licences injoignable. Vérifiez votre connexion Internet.","msg.license.serverUnreachableRetry":"Serveur de licences injoignable. Nouvelle tentative au prochain appel.","msg.server.instructions":"Illustrator MCP (Synthetic). Contrôle Adobe Illustrator via un plugin passerelle. Convention des tools : diagnostic il_* ; domaine verbe_nom (list_layers, get_document_info) ; échappatoires run_jsx / run_jsx_json. Commencez par il_healthcheck. Les éléments de page sont adressés par nom (attribuez-en un avec rename_item si un élément n'en a pas) — utilisez list_items/get_item/get_selection pour découvrir les noms. Couvre les documents, calques, éléments (déplacer/pivoter/redimensionner/ordre Z/grouper), tracés, formes, texte, couleur/fond/contour/nuanciers, plans de travail et export (PNG/JPG/SVG/PDF).","ui.i18n.language":"Langue","ui.i18n.restartNote":"Les descriptions des outils IA changent de langue après le redémarrage du serveur MCP (ou de l'application qui l'exécute).","ui.i18n.saveFailed":"Impossible d'enregistrer la préférence de langue. Elle ne vaudra que pour cette session.","ui.i18n.saved":"Langue enregistrée.","ui.log.backupFailed":"Échec de la sauvegarde de {file} : {message}","ui.log.bridgeError":"erreur de la passerelle : {message}","ui.log.clear":"effacer","ui.log.clearTitle":"Effacer le journal","ui.log.clientConnected":"Client MCP connecté ({count})","ui.log.clientDisconnected":"Client MCP déconnecté ({count})","ui.log.commitFailed":"Échec de la validation (modifications annulées) : {message}","ui.log.downloadFailed":"Échec du téléchargement de {file} : {message}","ui.log.downloading":"Téléchargement de {file}...","ui.log.licenseSaveError":"Erreur lors de l'enregistrement de la clé de licence : {message}","ui.log.listening":"passerelle en écoute sur 127.0.0.1:{port}","ui.log.noUpdate":"Aucune mise à jour à appliquer","ui.log.portInUse":"port {port} occupé : {message}","ui.log.portRetry":"port {port} toujours occupé, nouvelle tentative ({attempt}/{max})...","ui.log.restartingBridge":"Redémarrage de la passerelle...","ui.log.shaMismatch":"SHA256 non concordant pour {file} (obtenu {got}..., attendu {expected}...)","ui.log.sizeDiffers":"Taille différente du manifeste pour {file} ({got} vs {expected}) — poursuite","ui.log.title":"Journal d'activité","ui.log.toggleTitle":"Afficher/masquer le journal","ui.log.updateAborted":"Mise à jour interrompue : {reason}","ui.log.updateApplied":"Mise à jour v{version} appliquée. REDÉMARREZ ILLUSTRATOR pour charger le nouveau panneau.","ui.log.updateNoLicense":"Échec de la mise à jour : aucune clé de licence enregistrée. Ouvrez Paramètres (⚙) et collez votre clé de licence.","ui.log.wsLoadFailed":"impossible de charger 'ws' : {message} (--enable-nodejs ?)","ui.product.subtitle":"Passerelle · en développement","ui.settings.licenseEmpty":"Saisissez une clé de licence avant d'enregistrer.","ui.settings.licenseKey":"Clé de licence","ui.settings.licenseNotSaved":"Aucune clé de licence enregistrée — requise pour les mises à jour.","ui.settings.licensePlaceholder":"Collez votre clé de licence Illustrator MCP","ui.settings.licenseSaveFailed":"Échec de l'enregistrement de la clé de licence (voir le journal).","ui.settings.licenseSaved":"Clé de licence enregistrée.","ui.settings.saveLicense":"Enregistrer la licence","ui.shell.builtBy":"Créé par","ui.shell.openSite":"Ouvrir synthetic.com.ar","ui.status.active":"Passerelle active","ui.status.clientsMany":"{count} clients MCP","ui.status.clientsOne":"{count} client MCP","ui.status.error":"Erreur : {message}","ui.status.nodeUnavailable":"Node/ws indisponible","ui.status.port":"Port {port}","ui.status.portOpenFailed":"Impossible d'ouvrir le port {port}","ui.status.restart":"Redémarrer","ui.status.starting":"Démarrage de la passerelle…","ui.status.stopped":"Arrêté","ui.status.updateApplied":"Mise à jour appliquée — redémarrez Illustrator","ui.status.updateFailed":"Échec de la mise à jour","ui.status.waitingForClient":"en attente d'un client","ui.status.wsNoServer":"ws ne fournit pas WebSocketServer","ui.toolbar.reload":"Recharger le panneau","ui.toolbar.settings":"Paramètres","ui.update.appliedBody":"Fermez et rouvrez Illustrator pour activer la v{version}.","ui.update.appliedTitle":"Mise à jour appliquée.","ui.update.available":"Mise à jour disponible","ui.update.installerTitle":"Si le remplacement à chaud échoue ou si la version nécessite un nouveau manifeste","ui.update.later":"Plus tard","ui.update.now":"Mettre à jour","ui.update.ok":"OK","ui.update.updating":"Mise à jour en cours..."},"de":{"msg.bridge.notConnected":"Illustrator ist nicht verbunden. Öffnen Sie Illustrator mit dem Bedienfeld «Synthetic Illustrator MCP» (es stellt die Bridge auf Port {port} bereit).","msg.bridge.timeout":"Zeitüberschreitung ({ms} ms)","msg.doctor.bridgeConnecting":"Bridge: Verbindung zu {url} wird hergestellt (prüft, ob das Bedienfeld Synthetic Illustrator MCP in Illustrator geöffnet ist)...","msg.doctor.bridgeFail":"Bridge nicht erreichbar. Öffnen Sie Illustrator mit dem Bedienfeld Synthetic Illustrator MCP (Fenster → Erweiterungen → Synthetic Illustrator MCP) und prüfen Sie, ob dort \"Bridge active\" steht.","msg.doctor.bridgeOk":"Bridge erreichbar — das Bedienfeld Synthetic Illustrator MCP läuft in Illustrator.","msg.doctor.language":"Sprache: {language} (Quelle: {source})","msg.doctor.licenseFailed":"Lizenzprüfung fehlgeschlagen: {message}","msg.doctor.licenseInvalid":"ungültig","msg.doctor.licenseNotSet":"IL_MCP_LICENSE ist nicht gesetzt. Eine Lizenz erhalten Sie unter https://synthetic.com.ar/illustrator-mcp","msg.doctor.licensePlanActive":"aktiv","msg.doctor.licenseValid":"Lizenz gültig ({plan})","msg.doctor.nodeOk":"Node.js {version} (>=18 erforderlich)","msg.doctor.nodeTooOld":"Node.js {version} — Version 18 oder neuer erforderlich","msg.doctor.support":"Kommen Sie nicht weiter? Erstellen Sie unter https://synthetic.com.ar/dashboard/support ein Ticket und fügen Sie diese Ausgabe ein","msg.doctor.title":"Synthetic Illustrator MCP — doctor (Diagnose)","msg.healthcheck.hint":"Öffnen Sie Illustrator mit dem Bedienfeld Synthetic Illustrator MCP (es stellt die Bridge bereit).","msg.host.errorAtLine":"{message} (Zeile {line})","msg.host.itemNotFound":"Element nicht gefunden: {name}","msg.host.layerNotFound":"Ebene nicht gefunden: {name}","msg.host.noDocument":"Kein Dokument geöffnet","msg.host.notACompoundPath":"Kein zusammengesetzter Pfad: {name}","msg.host.notAGroup":"Keine Gruppe: {name}","msg.host.notAPath":"Kein Pfad: {name}","msg.host.unknownCommand":"Unbekannter Befehl: {cmd}","msg.license.getLicense":"Eine Lizenz erhalten Sie unter https://synthetic.com.ar/illustrator-mcp","msg.license.invalidOrMissing":"Ungültige oder fehlende Lizenz.","msg.license.noKey":"Kein Lizenzschlüssel. Setzen Sie IL_MCP_LICENSE in Ihrer MCP-Konfiguration. Eine Lizenz erhalten Sie unter https://synthetic.com.ar/illustrator-mcp","msg.license.required":"Lizenz erforderlich","msg.license.serverUnreachable":"Lizenzserver nicht erreichbar. Prüfen Sie Ihre Internetverbindung.","msg.license.serverUnreachableRetry":"Lizenzserver nicht erreichbar. Beim nächsten Aufruf wird es erneut versucht.","msg.server.instructions":"Illustrator MCP (Synthetic). Steuert Adobe Illustrator über ein Bridge-Plugin. Tool-Konvention: Diagnose il_* ; Bereich Verb_Substantiv (list_layers, get_document_info) ; Escape-Hatches run_jsx / run_jsx_json. Beginnen Sie mit il_healthcheck. Seitenelemente werden über den Namen angesprochen (vergeben Sie mit rename_item einen, falls ein Element keinen hat) — mit list_items/get_item/get_selection finden Sie Namen. Deckt Dokumente, Ebenen, Elemente (Verschieben/Drehen/Skalieren/Z-Reihenfolge/Gruppieren), Pfade, Formen, Text, Farbe/Füllung/Kontur/Farbfelder, Zeichenflächen und Export (PNG/JPG/SVG/PDF) ab.","ui.i18n.language":"Sprache","ui.i18n.restartNote":"Die Beschreibungen der KI-Tools wechseln die Sprache, nachdem Sie den MCP-Server (oder die App, die ihn ausführt) neu gestartet haben.","ui.i18n.saveFailed":"Die Spracheinstellung konnte nicht gespeichert werden. Sie gilt nur für diese Sitzung.","ui.i18n.saved":"Sprache gespeichert.","ui.log.backupFailed":"Sicherung von {file} fehlgeschlagen: {message}","ui.log.bridgeError":"Bridge-Fehler: {message}","ui.log.clear":"leeren","ui.log.clearTitle":"Protokoll leeren","ui.log.clientConnected":"MCP-Client verbunden ({count})","ui.log.clientDisconnected":"MCP-Client getrennt ({count})","ui.log.commitFailed":"Übernahme fehlgeschlagen (zurückgesetzt): {message}","ui.log.downloadFailed":"Download von {file} fehlgeschlagen: {message}","ui.log.downloading":"{file} wird heruntergeladen...","ui.log.licenseSaveError":"Fehler beim Speichern des Lizenzschlüssels: {message}","ui.log.listening":"Bridge lauscht auf 127.0.0.1:{port}","ui.log.noUpdate":"Kein Update vorhanden","ui.log.portInUse":"Port {port} belegt: {message}","ui.log.portRetry":"Port {port} weiterhin belegt, neuer Versuch ({attempt}/{max})...","ui.log.restartingBridge":"Bridge wird neu gestartet...","ui.log.shaMismatch":"SHA256 von {file} stimmt nicht überein (erhalten {got}..., erwartet {expected}...)","ui.log.sizeDiffers":"Größe von {file} weicht vom Manifest ab ({got} vs. {expected}) — wird fortgesetzt","ui.log.title":"Aktivitätsprotokoll","ui.log.toggleTitle":"Protokoll ein-/ausblenden","ui.log.updateAborted":"Update abgebrochen: {reason}","ui.log.updateApplied":"Update v{version} angewendet. STARTEN SIE ILLUSTRATOR NEU, um das neue Bedienfeld zu laden.","ui.log.updateNoLicense":"Update fehlgeschlagen: kein Lizenzschlüssel gespeichert. Öffnen Sie die Einstellungen (⚙) und fügen Sie Ihren Lizenzschlüssel ein.","ui.log.wsLoadFailed":"'ws' konnte nicht geladen werden: {message} (--enable-nodejs?)","ui.product.subtitle":"Bridge · in Entwicklung","ui.settings.licenseEmpty":"Geben Sie vor dem Speichern einen Lizenzschlüssel ein.","ui.settings.licenseKey":"Lizenzschlüssel","ui.settings.licenseNotSaved":"Noch kein Lizenzschlüssel gespeichert — für Updates erforderlich.","ui.settings.licensePlaceholder":"Illustrator MCP-Lizenzschlüssel einfügen","ui.settings.licenseSaveFailed":"Lizenzschlüssel konnte nicht gespeichert werden (siehe Protokoll).","ui.settings.licenseSaved":"Lizenzschlüssel gespeichert.","ui.settings.saveLicense":"Lizenz speichern","ui.shell.builtBy":"Entwickelt von","ui.shell.openSite":"synthetic.com.ar öffnen","ui.status.active":"Bridge aktiv","ui.status.clientsMany":"{count} MCP-Clients","ui.status.clientsOne":"{count} MCP-Client","ui.status.error":"Fehler: {message}","ui.status.nodeUnavailable":"Node/ws nicht verfügbar","ui.status.port":"Port {port}","ui.status.portOpenFailed":"Port {port} konnte nicht geöffnet werden","ui.status.restart":"Neu starten","ui.status.starting":"Bridge wird gestartet…","ui.status.stopped":"Gestoppt","ui.status.updateApplied":"Update angewendet — Illustrator neu starten","ui.status.updateFailed":"Update fehlgeschlagen","ui.status.waitingForClient":"warte auf Client","ui.status.wsNoServer":"ws hat keinen WebSocketServer","ui.toolbar.reload":"Bedienfeld neu laden","ui.toolbar.settings":"Einstellungen","ui.update.appliedBody":"Schließen Sie Illustrator und öffnen Sie es erneut, um v{version} zu aktivieren.","ui.update.appliedTitle":"Update angewendet.","ui.update.available":"Update verfügbar","ui.update.installerTitle":"Falls der Hot-Swap fehlschlägt oder das Release ein neues Manifest erfordert","ui.update.later":"Später","ui.update.now":"Jetzt aktualisieren","ui.update.ok":"OK","ui.update.updating":"Wird aktualisiert..."},"ja":{"msg.bridge.notConnected":"Illustrator に接続されていません。「Synthetic Illustrator MCP」パネル(ポート {port} でブリッジをホストします)を開いた状態で Illustrator を起動してください。","msg.bridge.timeout":"タイムアウト({ms}ms)","msg.doctor.bridgeConnecting":"ブリッジ:{url} に接続中(Illustrator で Synthetic Illustrator MCP パネルが開いているか確認しています)...","msg.doctor.bridgeFail":"ブリッジに到達できません。Synthetic Illustrator MCP パネル(ウィンドウ → エクステンション → Synthetic Illustrator MCP)を開いた状態で Illustrator を起動し、パネルに \"Bridge active\" と表示されていることを確認してください。","msg.doctor.bridgeOk":"ブリッジに到達できます — Synthetic Illustrator MCP パネルが Illustrator 内で動作しています。","msg.doctor.language":"言語:{language}(設定元:{source})","msg.doctor.licenseFailed":"ライセンスの確認に失敗しました:{message}","msg.doctor.licenseInvalid":"無効","msg.doctor.licenseNotSet":"IL_MCP_LICENSE が設定されていません。ライセンスは https://synthetic.com.ar/illustrator-mcp で入手できます","msg.doctor.licensePlanActive":"アクティブ","msg.doctor.licenseValid":"ライセンス有効({plan})","msg.doctor.nodeOk":"Node.js {version}(18 以上が必要)","msg.doctor.nodeTooOld":"Node.js {version} — 18 以上が必要です","msg.doctor.support":"それでも解決しない場合は、この出力を https://synthetic.com.ar/dashboard/support のチケットに貼り付けてください","msg.doctor.title":"Synthetic Illustrator MCP — 診断","msg.healthcheck.hint":"Synthetic Illustrator MCP パネル(ブリッジをホストします)を開いた状態で Illustrator を起動してください。","msg.host.errorAtLine":"{message}({line} 行目)","msg.host.itemNotFound":"アイテムが見つかりません:{name}","msg.host.layerNotFound":"レイヤーが見つかりません:{name}","msg.host.noDocument":"ドキュメントが開かれていません","msg.host.notACompoundPath":"複合パスではありません:{name}","msg.host.notAGroup":"グループではありません:{name}","msg.host.notAPath":"パスではありません:{name}","msg.host.unknownCommand":"不明なコマンド:{cmd}","msg.license.getLicense":"ライセンスは https://synthetic.com.ar/illustrator-mcp で入手できます","msg.license.invalidOrMissing":"ライセンスが無効か、見つかりません。","msg.license.noKey":"ライセンスキーがありません。MCP の設定で IL_MCP_LICENSE を設定してください。ライセンスは https://synthetic.com.ar/illustrator-mcp で入手できます","msg.license.required":"ライセンスが必要です","msg.license.serverUnreachable":"ライセンスサーバーに接続できません。インターネット接続を確認してください。","msg.license.serverUnreachableRetry":"ライセンスサーバーに接続できません。次回の呼び出し時に再試行します。","msg.server.instructions":"Illustrator MCP(Synthetic)。ブリッジプラグインを通じて Adobe Illustrator を制御します。ツールの命名規則:診断は il_* ;ドメインは動詞_名詞(list_layers、get_document_info);エスケープハッチは run_jsx / run_jsx_json。まず il_healthcheck から始めてください。ページアイテムは名前でアドレス指定します(名前がない場合は rename_item で設定)— list_items/get_item/get_selection で名前を確認できます。ドキュメント、レイヤー、アイテム(移動/回転/拡大縮小/重ね順/グループ化)、パス、シェイプ、テキスト、カラー/塗り/線/スウォッチ、アートボード、書き出し(PNG/JPG/SVG/PDF)をカバーします。","ui.i18n.language":"言語","ui.i18n.restartNote":"AI 向けのツールの説明は、MCP サーバー(またはそれを実行しているアプリ)を再起動すると言語が切り替わります。","ui.i18n.saveFailed":"言語の設定を保存できませんでした。このセッションの間のみ有効です。","ui.i18n.saved":"言語を保存しました。","ui.log.backupFailed":"{file} のバックアップに失敗しました:{message}","ui.log.bridgeError":"ブリッジエラー:{message}","ui.log.clear":"クリア","ui.log.clearTitle":"ログをクリア","ui.log.clientConnected":"MCP クライアントが接続しました({count})","ui.log.clientDisconnected":"MCP クライアントが切断しました({count})","ui.log.commitFailed":"コミットに失敗しました(ロールバック済み):{message}","ui.log.downloadFailed":"{file} のダウンロードに失敗しました:{message}","ui.log.downloading":"{file} をダウンロード中...","ui.log.licenseSaveError":"ライセンスキーの保存中にエラーが発生しました:{message}","ui.log.listening":"ブリッジが 127.0.0.1:{port} で待機中","ui.log.noUpdate":"適用するアップデートはありません","ui.log.portInUse":"ポート {port} は使用中です:{message}","ui.log.portRetry":"ポート {port} はまだ使用中です。再試行しています({attempt}/{max})...","ui.log.restartingBridge":"ブリッジを再起動中...","ui.log.shaMismatch":"{file} の SHA256 が一致しません(取得値 {got}...、期待値 {expected}...)","ui.log.sizeDiffers":"{file} のサイズがマニフェストと異なります({got} / {expected}) — 続行します","ui.log.title":"アクティビティログ","ui.log.toggleTitle":"ログの表示/非表示","ui.log.updateAborted":"アップデートを中止しました:{reason}","ui.log.updateApplied":"アップデート v{version} を適用しました。新しいパネルを読み込むには Illustrator を再起動してください。","ui.log.updateNoLicense":"アップデートに失敗しました:ライセンスキーが保存されていません。設定(⚙)を開いてライセンスキーを貼り付けてください。","ui.log.wsLoadFailed":"'ws' を読み込めませんでした:{message}(--enable-nodejs?)","ui.product.subtitle":"ブリッジ · 開発中","ui.settings.licenseEmpty":"保存する前にライセンスキーを入力してください。","ui.settings.licenseKey":"ライセンスキー","ui.settings.licenseNotSaved":"ライセンスキーはまだ保存されていません — アップデートに必要です。","ui.settings.licensePlaceholder":"Illustrator MCP のライセンスキーを貼り付け","ui.settings.licenseSaveFailed":"ライセンスキーを保存できませんでした(ログを参照)。","ui.settings.licenseSaved":"ライセンスキーを保存しました。","ui.settings.saveLicense":"ライセンスを保存","ui.shell.builtBy":"制作:","ui.shell.openSite":"synthetic.com.ar を開く","ui.status.active":"ブリッジ稼働中","ui.status.clientsMany":"MCP クライアント {count} 件","ui.status.clientsOne":"MCP クライアント {count} 件","ui.status.error":"エラー:{message}","ui.status.nodeUnavailable":"Node/ws を利用できません","ui.status.port":"ポート {port}","ui.status.portOpenFailed":"ポート {port} を開けませんでした","ui.status.restart":"再起動","ui.status.starting":"ブリッジを起動中…","ui.status.stopped":"停止中","ui.status.updateApplied":"アップデート適用済み — Illustrator を再起動してください","ui.status.updateFailed":"アップデートに失敗しました","ui.status.waitingForClient":"クライアント待機中","ui.status.wsNoServer":"ws に WebSocketServer がありません","ui.toolbar.reload":"パネルを再読み込み","ui.toolbar.settings":"設定","ui.update.appliedBody":"v{version} を有効にするには、Illustrator を終了してから再度開いてください。","ui.update.appliedTitle":"アップデートを適用しました。","ui.update.available":"アップデートがあります","ui.update.installerTitle":"ホットスワップに失敗した場合や、リリースに新しいマニフェストが必要な場合","ui.update.later":"後で","ui.update.now":"今すぐアップデート","ui.update.ok":"OK","ui.update.updating":"アップデート中..."}};
|
|
3
|
+
r.SyntheticLocaleHashes = r.SyntheticLocaleHashes || {}; r.SyntheticLocaleHashes["illustrator-mcp"] = {"es":{"msg.bridge.notConnected":"6e1f0db6","msg.bridge.timeout":"12fc6317","msg.doctor.bridgeConnecting":"b206eeb8","msg.doctor.bridgeFail":"8b9138fc","msg.doctor.bridgeOk":"f6604a43","msg.doctor.language":"3a029c1a","msg.doctor.licenseFailed":"f1eef276","msg.doctor.licenseInvalid":"cbd1f530","msg.doctor.licenseNotSet":"7599dba8","msg.doctor.licensePlanActive":"d975992f","msg.doctor.licenseValid":"6f7b5eca","msg.doctor.nodeOk":"37febd74","msg.doctor.nodeTooOld":"c4f94d78","msg.doctor.support":"690cf1d9","msg.doctor.title":"f53cab58","msg.healthcheck.hint":"8a3c816c","msg.host.errorAtLine":"fdb1cbdf","msg.host.itemNotFound":"c97c9214","msg.host.layerNotFound":"c6736744","msg.host.noDocument":"abfad495","msg.host.notACompoundPath":"0e798cd2","msg.host.notAGroup":"1ef7eb49","msg.host.notAPath":"f04b002f","msg.host.unknownCommand":"7ba35587","msg.license.getLicense":"bdbc5661","msg.license.invalidOrMissing":"ffe92668","msg.license.noKey":"1b17b882","msg.license.required":"77f55985","msg.license.serverUnreachable":"09275073","msg.license.serverUnreachableRetry":"72610a70","msg.server.instructions":"d7d1c7c1","ui.i18n.language":"9a73db9b","ui.i18n.restartNote":"3b4de3f7","ui.i18n.saveFailed":"f37363a2","ui.i18n.saved":"f93e683a","ui.log.backupFailed":"8d9d65dc","ui.log.bridgeError":"5ffb90eb","ui.log.clear":"5c6e1222","ui.log.clearTitle":"b6df9a4c","ui.log.clientConnected":"c64fbe57","ui.log.clientDisconnected":"4d24ed13","ui.log.commitFailed":"b27615ba","ui.log.downloadFailed":"75c70a5e","ui.log.downloading":"faf69eff","ui.log.licenseSaveError":"77a064aa","ui.log.listening":"a80a123a","ui.log.noUpdate":"49715ed0","ui.log.portInUse":"27138cd6","ui.log.portRetry":"e45da25e","ui.log.restartingBridge":"494043f5","ui.log.shaMismatch":"d7d16526","ui.log.sizeDiffers":"58cf932f","ui.log.title":"81a9da96","ui.log.toggleTitle":"1311a0b3","ui.log.updateAborted":"de464239","ui.log.updateApplied":"28633bff","ui.log.updateNoLicense":"c187efb1","ui.log.wsLoadFailed":"d2d0eac7","ui.product.subtitle":"515ccdb5","ui.settings.licenseEmpty":"b35cbae5","ui.settings.licenseKey":"c4eed0bb","ui.settings.licenseNotSaved":"9f239ac1","ui.settings.licensePlaceholder":"a5c86aaa","ui.settings.licenseSaveFailed":"4e19ae84","ui.settings.licenseSaved":"31f4a65a","ui.settings.saveLicense":"3e2eb03b","ui.shell.builtBy":"180c77d8","ui.shell.openSite":"b3f60686","ui.status.active":"c9748d7a","ui.status.clientsMany":"1cbf8a94","ui.status.clientsOne":"5ef837ef","ui.status.error":"868c2626","ui.status.nodeUnavailable":"b8f90d3a","ui.status.port":"9572ed4b","ui.status.portOpenFailed":"71df1881","ui.status.restart":"2f44ed8c","ui.status.starting":"f53deb2c","ui.status.stopped":"863f19ee","ui.status.updateApplied":"3cdd45c3","ui.status.updateFailed":"e4a171b1","ui.status.waitingForClient":"0003adde","ui.status.wsNoServer":"46022422","ui.toolbar.reload":"a9264292","ui.toolbar.settings":"4b058728","ui.update.appliedBody":"0b6f2fea","ui.update.appliedTitle":"e059a7bd","ui.update.available":"676409df","ui.update.installerTitle":"fb0924bc","ui.update.later":"f7f62b49","ui.update.now":"e9601784","ui.update.ok":"85e4b82f","ui.update.updating":"64d870e3"},"pt-BR":{"msg.bridge.notConnected":"6e1f0db6","msg.bridge.timeout":"12fc6317","msg.doctor.bridgeConnecting":"b206eeb8","msg.doctor.bridgeFail":"8b9138fc","msg.doctor.bridgeOk":"f6604a43","msg.doctor.language":"3a029c1a","msg.doctor.licenseFailed":"f1eef276","msg.doctor.licenseInvalid":"cbd1f530","msg.doctor.licenseNotSet":"7599dba8","msg.doctor.licensePlanActive":"d975992f","msg.doctor.licenseValid":"6f7b5eca","msg.doctor.nodeOk":"37febd74","msg.doctor.nodeTooOld":"c4f94d78","msg.doctor.support":"690cf1d9","msg.doctor.title":"f53cab58","msg.healthcheck.hint":"8a3c816c","msg.host.errorAtLine":"fdb1cbdf","msg.host.itemNotFound":"c97c9214","msg.host.layerNotFound":"c6736744","msg.host.noDocument":"abfad495","msg.host.notACompoundPath":"0e798cd2","msg.host.notAGroup":"1ef7eb49","msg.host.notAPath":"f04b002f","msg.host.unknownCommand":"7ba35587","msg.license.getLicense":"bdbc5661","msg.license.invalidOrMissing":"ffe92668","msg.license.noKey":"1b17b882","msg.license.required":"77f55985","msg.license.serverUnreachable":"09275073","msg.license.serverUnreachableRetry":"72610a70","msg.server.instructions":"d7d1c7c1","ui.i18n.language":"9a73db9b","ui.i18n.restartNote":"3b4de3f7","ui.i18n.saveFailed":"f37363a2","ui.i18n.saved":"f93e683a","ui.log.backupFailed":"8d9d65dc","ui.log.bridgeError":"5ffb90eb","ui.log.clear":"5c6e1222","ui.log.clearTitle":"b6df9a4c","ui.log.clientConnected":"c64fbe57","ui.log.clientDisconnected":"4d24ed13","ui.log.commitFailed":"b27615ba","ui.log.downloadFailed":"75c70a5e","ui.log.downloading":"faf69eff","ui.log.licenseSaveError":"77a064aa","ui.log.listening":"a80a123a","ui.log.noUpdate":"49715ed0","ui.log.portInUse":"27138cd6","ui.log.portRetry":"e45da25e","ui.log.restartingBridge":"494043f5","ui.log.shaMismatch":"d7d16526","ui.log.sizeDiffers":"58cf932f","ui.log.title":"81a9da96","ui.log.toggleTitle":"1311a0b3","ui.log.updateAborted":"de464239","ui.log.updateApplied":"28633bff","ui.log.updateNoLicense":"c187efb1","ui.log.wsLoadFailed":"d2d0eac7","ui.product.subtitle":"515ccdb5","ui.settings.licenseEmpty":"b35cbae5","ui.settings.licenseKey":"c4eed0bb","ui.settings.licenseNotSaved":"9f239ac1","ui.settings.licensePlaceholder":"a5c86aaa","ui.settings.licenseSaveFailed":"4e19ae84","ui.settings.licenseSaved":"31f4a65a","ui.settings.saveLicense":"3e2eb03b","ui.shell.builtBy":"180c77d8","ui.shell.openSite":"b3f60686","ui.status.active":"c9748d7a","ui.status.clientsMany":"1cbf8a94","ui.status.clientsOne":"5ef837ef","ui.status.error":"868c2626","ui.status.nodeUnavailable":"b8f90d3a","ui.status.port":"9572ed4b","ui.status.portOpenFailed":"71df1881","ui.status.restart":"2f44ed8c","ui.status.starting":"f53deb2c","ui.status.stopped":"863f19ee","ui.status.updateApplied":"3cdd45c3","ui.status.updateFailed":"e4a171b1","ui.status.waitingForClient":"0003adde","ui.status.wsNoServer":"46022422","ui.toolbar.reload":"a9264292","ui.toolbar.settings":"4b058728","ui.update.appliedBody":"0b6f2fea","ui.update.appliedTitle":"e059a7bd","ui.update.available":"676409df","ui.update.installerTitle":"fb0924bc","ui.update.later":"f7f62b49","ui.update.now":"e9601784","ui.update.ok":"85e4b82f","ui.update.updating":"64d870e3"},"fr":{"msg.bridge.notConnected":"6e1f0db6","msg.bridge.timeout":"12fc6317","msg.doctor.bridgeConnecting":"b206eeb8","msg.doctor.bridgeFail":"8b9138fc","msg.doctor.bridgeOk":"f6604a43","msg.doctor.language":"3a029c1a","msg.doctor.licenseFailed":"f1eef276","msg.doctor.licenseInvalid":"cbd1f530","msg.doctor.licenseNotSet":"7599dba8","msg.doctor.licensePlanActive":"d975992f","msg.doctor.licenseValid":"6f7b5eca","msg.doctor.nodeOk":"37febd74","msg.doctor.nodeTooOld":"c4f94d78","msg.doctor.support":"690cf1d9","msg.doctor.title":"f53cab58","msg.healthcheck.hint":"8a3c816c","msg.host.errorAtLine":"fdb1cbdf","msg.host.itemNotFound":"c97c9214","msg.host.layerNotFound":"c6736744","msg.host.noDocument":"abfad495","msg.host.notACompoundPath":"0e798cd2","msg.host.notAGroup":"1ef7eb49","msg.host.notAPath":"f04b002f","msg.host.unknownCommand":"7ba35587","msg.license.getLicense":"bdbc5661","msg.license.invalidOrMissing":"ffe92668","msg.license.noKey":"1b17b882","msg.license.required":"77f55985","msg.license.serverUnreachable":"09275073","msg.license.serverUnreachableRetry":"72610a70","msg.server.instructions":"d7d1c7c1","ui.i18n.language":"9a73db9b","ui.i18n.restartNote":"3b4de3f7","ui.i18n.saveFailed":"f37363a2","ui.i18n.saved":"f93e683a","ui.log.backupFailed":"8d9d65dc","ui.log.bridgeError":"5ffb90eb","ui.log.clear":"5c6e1222","ui.log.clearTitle":"b6df9a4c","ui.log.clientConnected":"c64fbe57","ui.log.clientDisconnected":"4d24ed13","ui.log.commitFailed":"b27615ba","ui.log.downloadFailed":"75c70a5e","ui.log.downloading":"faf69eff","ui.log.licenseSaveError":"77a064aa","ui.log.listening":"a80a123a","ui.log.noUpdate":"49715ed0","ui.log.portInUse":"27138cd6","ui.log.portRetry":"e45da25e","ui.log.restartingBridge":"494043f5","ui.log.shaMismatch":"d7d16526","ui.log.sizeDiffers":"58cf932f","ui.log.title":"81a9da96","ui.log.toggleTitle":"1311a0b3","ui.log.updateAborted":"de464239","ui.log.updateApplied":"28633bff","ui.log.updateNoLicense":"c187efb1","ui.log.wsLoadFailed":"d2d0eac7","ui.product.subtitle":"515ccdb5","ui.settings.licenseEmpty":"b35cbae5","ui.settings.licenseKey":"c4eed0bb","ui.settings.licenseNotSaved":"9f239ac1","ui.settings.licensePlaceholder":"a5c86aaa","ui.settings.licenseSaveFailed":"4e19ae84","ui.settings.licenseSaved":"31f4a65a","ui.settings.saveLicense":"3e2eb03b","ui.shell.builtBy":"180c77d8","ui.shell.openSite":"b3f60686","ui.status.active":"c9748d7a","ui.status.clientsMany":"1cbf8a94","ui.status.clientsOne":"5ef837ef","ui.status.error":"868c2626","ui.status.nodeUnavailable":"b8f90d3a","ui.status.port":"9572ed4b","ui.status.portOpenFailed":"71df1881","ui.status.restart":"2f44ed8c","ui.status.starting":"f53deb2c","ui.status.stopped":"863f19ee","ui.status.updateApplied":"3cdd45c3","ui.status.updateFailed":"e4a171b1","ui.status.waitingForClient":"0003adde","ui.status.wsNoServer":"46022422","ui.toolbar.reload":"a9264292","ui.toolbar.settings":"4b058728","ui.update.appliedBody":"0b6f2fea","ui.update.appliedTitle":"e059a7bd","ui.update.available":"676409df","ui.update.installerTitle":"fb0924bc","ui.update.later":"f7f62b49","ui.update.now":"e9601784","ui.update.ok":"85e4b82f","ui.update.updating":"64d870e3"},"de":{"msg.bridge.notConnected":"6e1f0db6","msg.bridge.timeout":"12fc6317","msg.doctor.bridgeConnecting":"b206eeb8","msg.doctor.bridgeFail":"8b9138fc","msg.doctor.bridgeOk":"f6604a43","msg.doctor.language":"3a029c1a","msg.doctor.licenseFailed":"f1eef276","msg.doctor.licenseInvalid":"cbd1f530","msg.doctor.licenseNotSet":"7599dba8","msg.doctor.licensePlanActive":"d975992f","msg.doctor.licenseValid":"6f7b5eca","msg.doctor.nodeOk":"37febd74","msg.doctor.nodeTooOld":"c4f94d78","msg.doctor.support":"690cf1d9","msg.doctor.title":"f53cab58","msg.healthcheck.hint":"8a3c816c","msg.host.errorAtLine":"fdb1cbdf","msg.host.itemNotFound":"c97c9214","msg.host.layerNotFound":"c6736744","msg.host.noDocument":"abfad495","msg.host.notACompoundPath":"0e798cd2","msg.host.notAGroup":"1ef7eb49","msg.host.notAPath":"f04b002f","msg.host.unknownCommand":"7ba35587","msg.license.getLicense":"bdbc5661","msg.license.invalidOrMissing":"ffe92668","msg.license.noKey":"1b17b882","msg.license.required":"77f55985","msg.license.serverUnreachable":"09275073","msg.license.serverUnreachableRetry":"72610a70","msg.server.instructions":"d7d1c7c1","ui.i18n.language":"9a73db9b","ui.i18n.restartNote":"3b4de3f7","ui.i18n.saveFailed":"f37363a2","ui.i18n.saved":"f93e683a","ui.log.backupFailed":"8d9d65dc","ui.log.bridgeError":"5ffb90eb","ui.log.clear":"5c6e1222","ui.log.clearTitle":"b6df9a4c","ui.log.clientConnected":"c64fbe57","ui.log.clientDisconnected":"4d24ed13","ui.log.commitFailed":"b27615ba","ui.log.downloadFailed":"75c70a5e","ui.log.downloading":"faf69eff","ui.log.licenseSaveError":"77a064aa","ui.log.listening":"a80a123a","ui.log.noUpdate":"49715ed0","ui.log.portInUse":"27138cd6","ui.log.portRetry":"e45da25e","ui.log.restartingBridge":"494043f5","ui.log.shaMismatch":"d7d16526","ui.log.sizeDiffers":"58cf932f","ui.log.title":"81a9da96","ui.log.toggleTitle":"1311a0b3","ui.log.updateAborted":"de464239","ui.log.updateApplied":"28633bff","ui.log.updateNoLicense":"c187efb1","ui.log.wsLoadFailed":"d2d0eac7","ui.product.subtitle":"515ccdb5","ui.settings.licenseEmpty":"b35cbae5","ui.settings.licenseKey":"c4eed0bb","ui.settings.licenseNotSaved":"9f239ac1","ui.settings.licensePlaceholder":"a5c86aaa","ui.settings.licenseSaveFailed":"4e19ae84","ui.settings.licenseSaved":"31f4a65a","ui.settings.saveLicense":"3e2eb03b","ui.shell.builtBy":"180c77d8","ui.shell.openSite":"b3f60686","ui.status.active":"c9748d7a","ui.status.clientsMany":"1cbf8a94","ui.status.clientsOne":"5ef837ef","ui.status.error":"868c2626","ui.status.nodeUnavailable":"b8f90d3a","ui.status.port":"9572ed4b","ui.status.portOpenFailed":"71df1881","ui.status.restart":"2f44ed8c","ui.status.starting":"f53deb2c","ui.status.stopped":"863f19ee","ui.status.updateApplied":"3cdd45c3","ui.status.updateFailed":"e4a171b1","ui.status.waitingForClient":"0003adde","ui.status.wsNoServer":"46022422","ui.toolbar.reload":"a9264292","ui.toolbar.settings":"4b058728","ui.update.appliedBody":"0b6f2fea","ui.update.appliedTitle":"e059a7bd","ui.update.available":"676409df","ui.update.installerTitle":"fb0924bc","ui.update.later":"f7f62b49","ui.update.now":"e9601784","ui.update.ok":"85e4b82f","ui.update.updating":"64d870e3"},"ja":{"msg.bridge.notConnected":"6e1f0db6","msg.bridge.timeout":"12fc6317","msg.doctor.bridgeConnecting":"b206eeb8","msg.doctor.bridgeFail":"8b9138fc","msg.doctor.bridgeOk":"f6604a43","msg.doctor.language":"3a029c1a","msg.doctor.licenseFailed":"f1eef276","msg.doctor.licenseInvalid":"cbd1f530","msg.doctor.licenseNotSet":"7599dba8","msg.doctor.licensePlanActive":"d975992f","msg.doctor.licenseValid":"6f7b5eca","msg.doctor.nodeOk":"37febd74","msg.doctor.nodeTooOld":"c4f94d78","msg.doctor.support":"690cf1d9","msg.doctor.title":"f53cab58","msg.healthcheck.hint":"8a3c816c","msg.host.errorAtLine":"fdb1cbdf","msg.host.itemNotFound":"c97c9214","msg.host.layerNotFound":"c6736744","msg.host.noDocument":"abfad495","msg.host.notACompoundPath":"0e798cd2","msg.host.notAGroup":"1ef7eb49","msg.host.notAPath":"f04b002f","msg.host.unknownCommand":"7ba35587","msg.license.getLicense":"bdbc5661","msg.license.invalidOrMissing":"ffe92668","msg.license.noKey":"1b17b882","msg.license.required":"77f55985","msg.license.serverUnreachable":"09275073","msg.license.serverUnreachableRetry":"72610a70","msg.server.instructions":"d7d1c7c1","ui.i18n.language":"9a73db9b","ui.i18n.restartNote":"3b4de3f7","ui.i18n.saveFailed":"f37363a2","ui.i18n.saved":"f93e683a","ui.log.backupFailed":"8d9d65dc","ui.log.bridgeError":"5ffb90eb","ui.log.clear":"5c6e1222","ui.log.clearTitle":"b6df9a4c","ui.log.clientConnected":"c64fbe57","ui.log.clientDisconnected":"4d24ed13","ui.log.commitFailed":"b27615ba","ui.log.downloadFailed":"75c70a5e","ui.log.downloading":"faf69eff","ui.log.licenseSaveError":"77a064aa","ui.log.listening":"a80a123a","ui.log.noUpdate":"49715ed0","ui.log.portInUse":"27138cd6","ui.log.portRetry":"e45da25e","ui.log.restartingBridge":"494043f5","ui.log.shaMismatch":"d7d16526","ui.log.sizeDiffers":"58cf932f","ui.log.title":"81a9da96","ui.log.toggleTitle":"1311a0b3","ui.log.updateAborted":"de464239","ui.log.updateApplied":"28633bff","ui.log.updateNoLicense":"c187efb1","ui.log.wsLoadFailed":"d2d0eac7","ui.product.subtitle":"515ccdb5","ui.settings.licenseEmpty":"b35cbae5","ui.settings.licenseKey":"c4eed0bb","ui.settings.licenseNotSaved":"9f239ac1","ui.settings.licensePlaceholder":"a5c86aaa","ui.settings.licenseSaveFailed":"4e19ae84","ui.settings.licenseSaved":"31f4a65a","ui.settings.saveLicense":"3e2eb03b","ui.shell.builtBy":"180c77d8","ui.shell.openSite":"b3f60686","ui.status.active":"c9748d7a","ui.status.clientsMany":"1cbf8a94","ui.status.clientsOne":"5ef837ef","ui.status.error":"868c2626","ui.status.nodeUnavailable":"b8f90d3a","ui.status.port":"9572ed4b","ui.status.portOpenFailed":"71df1881","ui.status.restart":"2f44ed8c","ui.status.starting":"f53deb2c","ui.status.stopped":"863f19ee","ui.status.updateApplied":"3cdd45c3","ui.status.updateFailed":"e4a171b1","ui.status.waitingForClient":"0003adde","ui.status.wsNoServer":"46022422","ui.toolbar.reload":"a9264292","ui.toolbar.settings":"4b058728","ui.update.appliedBody":"0b6f2fea","ui.update.appliedTitle":"e059a7bd","ui.update.available":"676409df","ui.update.installerTitle":"fb0924bc","ui.update.later":"f7f62b49","ui.update.now":"e9601784","ui.update.ok":"85e4b82f","ui.update.updating":"64d870e3"}}; })(typeof self !== 'undefined' ? self : this);
|
package/i18n/node.cjs
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/* synthetic-idiomas · core/node.cjs
|
|
2
|
+
*
|
|
3
|
+
* Lado Node (servers MCP): decide el idioma al arrancar y carga los diccionarios del producto.
|
|
4
|
+
*
|
|
5
|
+
* Orden para elegir el idioma (el primero que dé un idioma soportado gana):
|
|
6
|
+
* 1. Variable de entorno del producto (ej. PS_MCP_LANG), si el producto define una.
|
|
7
|
+
* 2. SYNTHETIC_LANG (vale para todos los productos).
|
|
8
|
+
* 3. settings.json del panel del producto: <USER_DATA>/<carpeta del panel>/settings.json
|
|
9
|
+
* 4. settings.json compartido de Synthetic: <USER_DATA>/com.synthetic/settings.json
|
|
10
|
+
* 5. Inglés.
|
|
11
|
+
*
|
|
12
|
+
* <USER_DATA> es la misma carpeta que devuelve CEP con SystemPath.USER_DATA:
|
|
13
|
+
* Windows: %APPDATA% · macOS: ~/Library/Application Support · Linux (dev): ~/.config
|
|
14
|
+
*
|
|
15
|
+
* El idioma se lee UNA vez al arrancar: las descripciones de las tools se registran al inicio
|
|
16
|
+
* de la sesión MCP y los clientes no las vuelven a pedir. Cambiar el idioma en el panel se
|
|
17
|
+
* aplica al reiniciar el server (o la app cliente).
|
|
18
|
+
*/
|
|
19
|
+
'use strict';
|
|
20
|
+
var fs = require('fs');
|
|
21
|
+
var path = require('path');
|
|
22
|
+
var os = require('os');
|
|
23
|
+
var core = require('./i18n-core.cjs');
|
|
24
|
+
|
|
25
|
+
var SHARED_FOLDER = 'com.synthetic';
|
|
26
|
+
|
|
27
|
+
function userDataDir(env, platform) {
|
|
28
|
+
env = env || process.env;
|
|
29
|
+
platform = platform || process.platform;
|
|
30
|
+
if (platform === 'win32') return env.APPDATA || path.join(os.homedir(), 'AppData', 'Roaming');
|
|
31
|
+
if (platform === 'darwin') return path.join(os.homedir(), 'Library', 'Application Support');
|
|
32
|
+
return env.XDG_CONFIG_HOME || path.join(os.homedir(), '.config');
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function settingsPath(folder, env, platform) {
|
|
36
|
+
return path.join(userDataDir(env, platform), folder, 'settings.json');
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function readJson(file) {
|
|
40
|
+
try { return JSON.parse(fs.readFileSync(file, 'utf8').replace(/^/, '')); } catch (e) { return null; }
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* @param {object} o
|
|
45
|
+
* envVar: variable propia del producto (ej. 'PS_MCP_LANG')
|
|
46
|
+
* settingsFolder: carpeta del panel dentro de USER_DATA (ej. 'com.synthetic.photoshop-mcp.bridge')
|
|
47
|
+
* @returns {{ language: string, source: string }}
|
|
48
|
+
*/
|
|
49
|
+
function resolveLanguage(o) {
|
|
50
|
+
o = o || {};
|
|
51
|
+
var env = o.env || process.env;
|
|
52
|
+
var tries = [];
|
|
53
|
+
if (o.envVar) tries.push([env[o.envVar], 'env:' + o.envVar]);
|
|
54
|
+
tries.push([env.SYNTHETIC_LANG, 'env:SYNTHETIC_LANG']);
|
|
55
|
+
if (o.settingsFolder) {
|
|
56
|
+
var p = settingsPath(o.settingsFolder, env, o.platform);
|
|
57
|
+
var s = readJson(p);
|
|
58
|
+
tries.push([s && s.language, p]);
|
|
59
|
+
}
|
|
60
|
+
var shared = settingsPath(SHARED_FOLDER, env, o.platform);
|
|
61
|
+
var sh = readJson(shared);
|
|
62
|
+
tries.push([sh && sh.language, shared]);
|
|
63
|
+
for (var i = 0; i < tries.length; i++) {
|
|
64
|
+
var lang = core.normalizeLanguage(tries[i][0]);
|
|
65
|
+
if (lang) return { language: lang, source: tries[i][1] };
|
|
66
|
+
}
|
|
67
|
+
return { language: core.SOURCE, source: 'default' };
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Lee <dir>/<idioma>.json y <dir>/hashes/<idioma>.json para todos los idiomas soportados.
|
|
71
|
+
function loadLocales(dir) {
|
|
72
|
+
var locales = {}, hashes = {};
|
|
73
|
+
core.CODES.forEach(function (code) {
|
|
74
|
+
var d = readJson(path.join(dir, code + '.json'));
|
|
75
|
+
if (d) locales[code] = d;
|
|
76
|
+
var h = readJson(path.join(dir, 'hashes', code + '.json'));
|
|
77
|
+
if (h) hashes[code] = h;
|
|
78
|
+
});
|
|
79
|
+
return { locales: locales, hashes: hashes };
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Atajo para un server MCP:
|
|
84
|
+
* const i18n = createServerI18n({ localesDir, envVar: 'PS_MCP_LANG', settingsFolder: '...' });
|
|
85
|
+
* i18n.t('msg.license.missing') // mensajes
|
|
86
|
+
* i18n.localizeTools(tools) // respuesta de tools/list
|
|
87
|
+
*/
|
|
88
|
+
function createServerI18n(o) {
|
|
89
|
+
var picked = resolveLanguage(o);
|
|
90
|
+
var data = loadLocales(o.localesDir);
|
|
91
|
+
var i18n = core.createI18n({ locales: data.locales, hashes: data.hashes, language: picked.language });
|
|
92
|
+
i18n.languageSource = picked.source;
|
|
93
|
+
// Idioma pedido (puede diferir de `language` si ese idioma todavía no tiene diccionario).
|
|
94
|
+
i18n.requestedLanguage = picked.language;
|
|
95
|
+
return i18n;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Para servers hechos con McpServer del SDK oficial: envuelve la respuesta de tools/list.
|
|
99
|
+
// Llamar DESPUÉS de registrar todas las tools y ANTES de server.connect().
|
|
100
|
+
function patchMcpServerToolsList(mcpServer, i18n) {
|
|
101
|
+
if (!i18n || i18n.language === core.SOURCE) return false;
|
|
102
|
+
var inner = mcpServer && (mcpServer.server || mcpServer);
|
|
103
|
+
var handlers = inner && inner._requestHandlers;
|
|
104
|
+
if (!handlers || typeof handlers.get !== 'function') return false;
|
|
105
|
+
var original = handlers.get('tools/list');
|
|
106
|
+
if (typeof original !== 'function') return false;
|
|
107
|
+
handlers.set('tools/list', async function (request, extra) {
|
|
108
|
+
var result = await original(request, extra);
|
|
109
|
+
if (result && Array.isArray(result.tools)) return Object.assign({}, result, { tools: i18n.localizeTools(result.tools) });
|
|
110
|
+
return result;
|
|
111
|
+
});
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
module.exports = {
|
|
116
|
+
SHARED_FOLDER: SHARED_FOLDER,
|
|
117
|
+
userDataDir: userDataDir,
|
|
118
|
+
settingsPath: settingsPath,
|
|
119
|
+
resolveLanguage: resolveLanguage,
|
|
120
|
+
loadLocales: loadLocales,
|
|
121
|
+
createServerI18n: createServerI18n,
|
|
122
|
+
patchMcpServerToolsList: patchMcpServerToolsList,
|
|
123
|
+
core: core
|
|
124
|
+
};
|
package/i18n/panel.cjs
ADDED
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/* synthetic-idiomas · core/panel.cjs
|
|
2
|
+
*
|
|
3
|
+
* Lado panel CEP (navegador de CEP con Node habilitado o no). Cargar DESPUÉS de i18n-core.cjs y
|
|
4
|
+
* de los diccionarios del producto:
|
|
5
|
+
*
|
|
6
|
+
* <script src="i18n/i18n-core.cjs"></script>
|
|
7
|
+
* <script src="i18n/panel.cjs"></script>
|
|
8
|
+
* <script src="i18n/locales.js"></script> ← generado: SyntheticLocales['<producto>'] = { en:{…}, es:{…}, … }
|
|
9
|
+
*
|
|
10
|
+
* var i18n = SyntheticPanelI18n.init({ product: 'photoshop-mcp', settingsFolder: 'com.synthetic.photoshop-mcp.bridge', cs: cs });
|
|
11
|
+
* i18n.t('ui.settings.title');
|
|
12
|
+
* i18n.apply(document); // traduce [data-i18n], [data-i18n-title], [data-i18n-placeholder], [data-i18n-aria-label]
|
|
13
|
+
* i18n.renderSelector(el, { restartNote: true });
|
|
14
|
+
*
|
|
15
|
+
* Preferencia: <USER_DATA>/<settingsFolder>/settings.json → { "language": "es" } (misma carpeta
|
|
16
|
+
* por usuario que usa Photoshop MCP para license.json). El server MCP del producto lee ese
|
|
17
|
+
* archivo al arrancar (ver core/node.cjs), por eso el cambio de idioma de las tools se aplica
|
|
18
|
+
* al reiniciar el server. La interfaz del panel sí cambia en el momento.
|
|
19
|
+
*
|
|
20
|
+
* Idioma por defecto del panel si nunca se eligió uno: el idioma de la interfaz de la app de
|
|
21
|
+
* Adobe (hostEnvironment.appUILocale), y si no está soportado, inglés. Esto NO se guarda: el
|
|
22
|
+
* server solo cambia de idioma cuando el usuario elige uno explícitamente.
|
|
23
|
+
*/
|
|
24
|
+
(function (root) {
|
|
25
|
+
'use strict';
|
|
26
|
+
var core = root.SyntheticI18n;
|
|
27
|
+
if (!core) throw new Error('Cargá i18n-core.cjs antes que panel.cjs');
|
|
28
|
+
|
|
29
|
+
function nodeRequire(name) {
|
|
30
|
+
try { if (typeof root.cep_node !== 'undefined' && root.cep_node.require) return root.cep_node.require(name); } catch (e) { /* sin Node */ }
|
|
31
|
+
try { if (typeof require === 'function') return require(name); } catch (e2) { /* sin Node */ }
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function fsPathFromUri(p) {
|
|
36
|
+
// cs.getSystemPath() devuelve "file:///C:/..." en algunas versiones de CEP.
|
|
37
|
+
var s = String(p || '');
|
|
38
|
+
if (s.indexOf('file:') === 0) {
|
|
39
|
+
s = decodeURIComponent(s.replace(/^file:[\/\\]*/, ''));
|
|
40
|
+
if (!/^[A-Za-z]:/.test(s)) s = '/' + s;
|
|
41
|
+
}
|
|
42
|
+
return s;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function userDataDir(cs) {
|
|
46
|
+
try {
|
|
47
|
+
var SP = root.SystemPath;
|
|
48
|
+
if (cs && SP && SP.USER_DATA) return fsPathFromUri(cs.getSystemPath(SP.USER_DATA));
|
|
49
|
+
} catch (e) { /* sin CSInterface */ }
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function joinPath(a, b) { return a.replace(/[\\/]+$/, '') + '/' + b; }
|
|
54
|
+
|
|
55
|
+
function readSettings(file) {
|
|
56
|
+
var fs = nodeRequire('fs');
|
|
57
|
+
try {
|
|
58
|
+
if (fs) return JSON.parse(String(fs.readFileSync(file, 'utf8')).replace(/^\uFEFF/, ''));
|
|
59
|
+
if (root.cep && root.cep.fs) { var r = root.cep.fs.readFile(file); if (r.err === 0) return JSON.parse(r.data); }
|
|
60
|
+
} catch (e) { /* no existe o está roto */ }
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function writeSettings(file, patch) {
|
|
65
|
+
var current = readSettings(file) || {};
|
|
66
|
+
for (var k in patch) if (Object.prototype.hasOwnProperty.call(patch, k)) current[k] = patch[k];
|
|
67
|
+
var text = JSON.stringify(current, null, 2);
|
|
68
|
+
var fs = nodeRequire('fs'), path = nodeRequire('path');
|
|
69
|
+
try {
|
|
70
|
+
if (fs && path) {
|
|
71
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
72
|
+
fs.writeFileSync(file, text, 'utf8');
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
if (root.cep && root.cep.fs) {
|
|
76
|
+
root.cep.fs.makedir(file.replace(/[\\/][^\\/]+$/, ''));
|
|
77
|
+
return root.cep.fs.writeFile(file, text).err === 0;
|
|
78
|
+
}
|
|
79
|
+
} catch (e) { /* sin permisos */ }
|
|
80
|
+
try { root.localStorage.setItem('synthetic.language', patch.language); } catch (e2) { /* nada */ }
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function hostLanguage(cs) {
|
|
85
|
+
var env = null;
|
|
86
|
+
try { env = cs.hostEnvironment || (cs.getHostEnvironment && cs.getHostEnvironment()); } catch (e) { env = null; }
|
|
87
|
+
try { if (typeof env === 'string') env = JSON.parse(env); } catch (e2) { env = null; }
|
|
88
|
+
return env ? core.normalizeLanguage(env.appUILocale) : null;
|
|
89
|
+
}
|
|
90
|
+
var selectorSeq = 0;
|
|
91
|
+
|
|
92
|
+
function init(opts) {
|
|
93
|
+
opts = opts || {};
|
|
94
|
+
var cs = opts.cs || null;
|
|
95
|
+
var all = (root.SyntheticLocales && root.SyntheticLocales[opts.product]) || {};
|
|
96
|
+
var locks = (root.SyntheticLocaleHashes && root.SyntheticLocaleHashes[opts.product]) || {};
|
|
97
|
+
var base = userDataDir(cs);
|
|
98
|
+
var file = base && opts.settingsFolder ? joinPath(base, opts.settingsFolder + '/settings.json') : null;
|
|
99
|
+
var saved = file ? readSettings(file) : null;
|
|
100
|
+
var stored = null;
|
|
101
|
+
try { stored = root.localStorage.getItem('synthetic.language'); } catch (e) { /* nada */ }
|
|
102
|
+
var chosen = core.normalizeLanguage(saved && saved.language) || core.normalizeLanguage(stored);
|
|
103
|
+
var lang = chosen || hostLanguage(cs) || core.SOURCE;
|
|
104
|
+
var api = { settingsFile: file, explicit: !!chosen, listeners: [] };
|
|
105
|
+
|
|
106
|
+
function build(code) {
|
|
107
|
+
var i = core.createI18n({ locales: all, hashes: locks, language: code });
|
|
108
|
+
api.language = i.language;
|
|
109
|
+
api.t = i.t;
|
|
110
|
+
api.tn = i.tn;
|
|
111
|
+
try { root.document.documentElement.setAttribute('lang', i.language); } catch (e) { /* sin DOM */ }
|
|
112
|
+
}
|
|
113
|
+
build(lang);
|
|
114
|
+
|
|
115
|
+
api.apply = function (scope) {
|
|
116
|
+
scope = scope || root.document;
|
|
117
|
+
var attrs = [['data-i18n', null], ['data-i18n-title', 'title'], ['data-i18n-placeholder', 'placeholder'], ['data-i18n-aria-label', 'aria-label']];
|
|
118
|
+
attrs.forEach(function (pair) {
|
|
119
|
+
var nodes = scope.querySelectorAll('[' + pair[0] + ']');
|
|
120
|
+
for (var n = 0; n < nodes.length; n++) {
|
|
121
|
+
var el = nodes[n], key = el.getAttribute(pair[0]);
|
|
122
|
+
if (!pair[1]) el.textContent = api.t(key, null, el.textContent);
|
|
123
|
+
else el.setAttribute(pair[1], api.t(key, null, el.getAttribute(pair[1])));
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
// Cambia el idioma: guarda la preferencia (para el panel y el server) y retraduce la UI.
|
|
129
|
+
api.setLanguage = function (code) {
|
|
130
|
+
var norm = core.normalizeLanguage(code) || core.SOURCE;
|
|
131
|
+
var saved2 = file ? writeSettings(file, { language: norm }) : false;
|
|
132
|
+
if (!saved2) { try { root.localStorage.setItem('synthetic.language', norm); } catch (e) { /* nada */ } }
|
|
133
|
+
api.explicit = true;
|
|
134
|
+
build(norm);
|
|
135
|
+
api.apply();
|
|
136
|
+
api.listeners.forEach(function (fn) { try { fn(norm, saved2); } catch (e) { /* listener roto */ } });
|
|
137
|
+
return saved2;
|
|
138
|
+
};
|
|
139
|
+
api.onChange = function (fn) { api.listeners.push(fn); };
|
|
140
|
+
|
|
141
|
+
// <select> con los idiomas (nombres en su propio idioma) + nota de reinicio opcional.
|
|
142
|
+
api.renderSelector = function (container, o) {
|
|
143
|
+
o = o || {};
|
|
144
|
+
var doc = root.document;
|
|
145
|
+
var wrap = doc.createElement('div');
|
|
146
|
+
wrap.className = 'synth-lang';
|
|
147
|
+
var label = doc.createElement('label');
|
|
148
|
+
label.className = 'synth-lang-label';
|
|
149
|
+
label.setAttribute('data-i18n', 'ui.i18n.language');
|
|
150
|
+
label.textContent = api.t('ui.i18n.language', null, 'Language');
|
|
151
|
+
var select = doc.createElement('select');
|
|
152
|
+
select.className = 'synth-lang-select';
|
|
153
|
+
core.LANGUAGES.forEach(function (l) {
|
|
154
|
+
var opt = doc.createElement('option');
|
|
155
|
+
opt.value = l.code; opt.textContent = l.name;
|
|
156
|
+
if (l.code === api.language) opt.selected = true;
|
|
157
|
+
select.appendChild(opt);
|
|
158
|
+
});
|
|
159
|
+
label.htmlFor = select.id = 'synthLangSelect' + (++selectorSeq);
|
|
160
|
+
wrap.appendChild(label); wrap.appendChild(select);
|
|
161
|
+
var note = null;
|
|
162
|
+
if (o.restartNote) {
|
|
163
|
+
note = doc.createElement('div');
|
|
164
|
+
note.className = 'synth-lang-note';
|
|
165
|
+
note.setAttribute('data-i18n', 'ui.i18n.restartNote');
|
|
166
|
+
note.textContent = api.t('ui.i18n.restartNote', null, 'The AI tool descriptions switch language after restarting the MCP server.');
|
|
167
|
+
wrap.appendChild(note);
|
|
168
|
+
}
|
|
169
|
+
select.addEventListener('change', function () { api.setLanguage(select.value); });
|
|
170
|
+
container.appendChild(wrap);
|
|
171
|
+
return select;
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
return api;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
root.SyntheticPanelI18n = { init: init, _fsPathFromUri: fsPathFromUri };
|
|
178
|
+
})(typeof self !== 'undefined' ? self : this);
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@synthetic-ai/illustrator-mcp",
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Control Adobe Illustrator with AI tools via MCP — 136 tools covering documents, layers, items, paths, shapes, text, color/gradients/patterns, symbols, clipping masks, brushes, align/distribute, 92 live effects, artboards, and export. By Synthetic (synthetic.com.ar).",
|
|
6
|
+
"homepage": "https://synthetic.com.ar/illustrator-mcp",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/matiasEltrece/illustrator-mcp"
|
|
10
|
+
},
|
|
11
|
+
"author": "Synthetic <hola@synthetic.com.ar> (https://synthetic.com.ar)",
|
|
12
|
+
"license": "UNLICENSED",
|
|
13
|
+
"keywords": [
|
|
14
|
+
"mcp",
|
|
15
|
+
"illustrator",
|
|
16
|
+
"adobe",
|
|
17
|
+
"model-context-protocol",
|
|
18
|
+
"claude",
|
|
19
|
+
"ai",
|
|
20
|
+
"synthetic"
|
|
21
|
+
],
|
|
22
|
+
"main": "./server.mjs",
|
|
23
|
+
"bin": {
|
|
24
|
+
"illustrator-mcp": "./server.mjs"
|
|
25
|
+
},
|
|
26
|
+
"files": [
|
|
27
|
+
"server.mjs",
|
|
28
|
+
"i18n/",
|
|
29
|
+
"README.md"
|
|
30
|
+
],
|
|
31
|
+
"scripts": {
|
|
32
|
+
"start": "node server.mjs",
|
|
33
|
+
"check": "node --check server.mjs",
|
|
34
|
+
"sync-i18n": "node scripts/sync-i18n.mjs"
|
|
35
|
+
},
|
|
36
|
+
"engines": {
|
|
37
|
+
"node": ">=18"
|
|
38
|
+
},
|
|
39
|
+
"publishConfig": {
|
|
40
|
+
"access": "public"
|
|
41
|
+
},
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"@modelcontextprotocol/sdk": "^1.6.0",
|
|
44
|
+
"ws": "^8.18.0",
|
|
45
|
+
"zod": "^3.23.8"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"javascript-obfuscator": "^4.1.1"
|
|
49
|
+
}
|
|
50
|
+
}
|