@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/README.md
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Illustrator MCP — Synthetic
|
|
2
|
+
|
|
3
|
+
Controlá Adobe Illustrator con lenguaje natural desde Claude (u otro cliente MCP) — capas,
|
|
4
|
+
artboards, paths, texto, color, exportación. Por [Synthetic](https://synthetic.com.ar).
|
|
5
|
+
|
|
6
|
+
**Estado: v0.3.** 136 tools probadas en vivo contra Illustrator real: documentos, capas
|
|
7
|
+
(incl. color, duplicar, reordenar), items (mover/rotar/escalar/orden Z/agrupar/flip/shear),
|
|
8
|
+
paths (crear/leer/editar puntos, compound paths), formas (rectángulo, rectángulo
|
|
9
|
+
redondeado, elipse, polígono, estrella, línea), texto (point/area, estilo, outline, find &
|
|
10
|
+
replace, leading, estilos de párrafo/carácter), color (fill/stroke/swatches/blend
|
|
11
|
+
mode/opacidad, gradientes, grupos de color, spot colors, patrones), símbolos, máscaras de
|
|
12
|
+
recorte, brushes, alinear/distribuir, trazo avanzado (dashes/cap/join/miter), guías, items
|
|
13
|
+
vinculados/embebidos, selección avanzada (misma fill, invertir), y **92 efectos en vivo**:
|
|
14
|
+
4 con parámetros reales tipados (drop shadow/feather/round corners/offset path) +
|
|
15
|
+
`apply_named_effect` (88 confirmados en vivo con valores por defecto — glows, distorsión,
|
|
16
|
+
3D, los 15 Warp, convertir a forma, blur, artístico, trazo de pincel, boceto, textura,
|
|
17
|
+
pixelar) + `apply_live_effect_raw` como escape hatch de XML crudo. Reproducir acciones
|
|
18
|
+
existentes también incluido. Los items se direccionan por nombre — usá `list_items` /
|
|
19
|
+
`get_selection` para descubrirlos, `rename_item` si uno no tiene nombre. Pendiente
|
|
20
|
+
(necesita los IDs internos reales de `executeMenuCommand`, que Illustrator no expone por
|
|
21
|
+
introspección — adivinarlos sin confirmar cada uno hizo colgar la app una vez): pathfinder
|
|
22
|
+
booleano, blends, distorsión de envolvente, malla degradada.
|
|
23
|
+
|
|
24
|
+
## Arquitectura
|
|
25
|
+
|
|
26
|
+
Bridge por WebSocket entre este server MCP (Node.js) y un panel CEP que corre dentro de
|
|
27
|
+
Illustrator — el mismo patrón que `photoshop-mcp`, elegido a propósito porque es
|
|
28
|
+
multiplataforma desde el día uno: este server **nunca lanza Illustrator.exe/.app**, se
|
|
29
|
+
conecta a una instancia ya abierta. No hace falta detectar rutas de instalación por
|
|
30
|
+
sistema operativo.
|
|
31
|
+
|
|
32
|
+
## Instalación (desarrollo)
|
|
33
|
+
|
|
34
|
+
1. `npm install`
|
|
35
|
+
2. Instalá el panel CEP:
|
|
36
|
+
- Windows: `.\install.ps1`
|
|
37
|
+
- macOS: `./install.sh`
|
|
38
|
+
3. Reiniciá Illustrator, abrí `Window > Extensions > Synthetic Illustrator MCP`.
|
|
39
|
+
4. Agregá el server a tu cliente MCP (`claude_desktop_config.json` o equivalente):
|
|
40
|
+
```json
|
|
41
|
+
{ "illustrator-mcp": { "command": "node", "args": ["/ruta/a/server.mjs"], "env": { "IL_MCP_LICENSE": "..." } } }
|
|
42
|
+
```
|
|
43
|
+
5. Probá con `il_healthcheck`.
|
|
44
|
+
|
|
45
|
+
## Idioma
|
|
46
|
+
|
|
47
|
+
Tools, mensajes del server y panel están en inglés por defecto y se traducen con los diccionarios
|
|
48
|
+
de `synthetic-idiomas` (vendorizados en `i18n/` y `bridge-cep/i18n-*` con `npm run sync-i18n`).
|
|
49
|
+
Idiomas: `en`, `es`, `pt-BR`, `fr`, `de`, `ja`; lo que falte traducir cae al inglés.
|
|
50
|
+
|
|
51
|
+
- **Panel CEP:** ⚙ (Settings) → **Language**. La interfaz del panel cambia al instante; la elección
|
|
52
|
+
se guarda en `settings.json`, en la misma carpeta que `license.json`
|
|
53
|
+
(`%APPDATA%\com.synthetic.illustrator-mcp.bridge\` en Windows,
|
|
54
|
+
`~/Library/Application Support/com.synthetic.illustrator-mcp.bridge/` en macOS).
|
|
55
|
+
- **Server MCP:** elige el idioma **una sola vez al arrancar**: `IL_MCP_LANG` → `SYNTHETIC_LANG` →
|
|
56
|
+
ese `settings.json` → inglés (lo loguea en stderr y en `--doctor`). Las descripciones de las tools
|
|
57
|
+
cambian recién al reiniciar el server MCP (o el cliente que lo lanza).
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/* synthetic-idiomas · core/i18n-core.cjs
|
|
2
|
+
*
|
|
3
|
+
* Runtime de idiomas compartido por todos los productos Synthetic (servers MCP en Node y
|
|
4
|
+
* paneles CEP en el navegador). Sin dependencias. UMD: `require()`/`import` desde Node,
|
|
5
|
+
* o <script> (queda en window.SyntheticI18n).
|
|
6
|
+
*
|
|
7
|
+
* Reglas:
|
|
8
|
+
* - Inglés es el idioma fuente. Cualquier clave que falte en otro idioma cae al inglés; si
|
|
9
|
+
* tampoco está, al texto por defecto que pase el código; si tampoco, a la clave. Nunca vacío.
|
|
10
|
+
* - Las traducciones de descripciones de tools llevan la huella (hash) del inglés del que se
|
|
11
|
+
* tradujeron. Si el inglés cambió desde entonces, se usa el inglés nuevo: nunca se muestra
|
|
12
|
+
* una traducción vieja que ya no corresponde.
|
|
13
|
+
*/
|
|
14
|
+
(function (root, factory) {
|
|
15
|
+
var api = factory();
|
|
16
|
+
if (typeof module === 'object' && module.exports) module.exports = api;
|
|
17
|
+
// En CEP con Node habilitado existen `module` y `window` a la vez: el panel lo busca en window.
|
|
18
|
+
if (root && (typeof module !== 'object' || typeof root.document !== 'undefined')) root.SyntheticI18n = api;
|
|
19
|
+
})(typeof self !== 'undefined' ? self : this, function () {
|
|
20
|
+
'use strict';
|
|
21
|
+
|
|
22
|
+
// Idiomas soportados, en el orden en que se muestran en los selectores.
|
|
23
|
+
var LANGUAGES = [
|
|
24
|
+
{ code: 'en', name: 'English' },
|
|
25
|
+
{ code: 'es', name: 'Español' },
|
|
26
|
+
{ code: 'pt-BR', name: 'Português (Brasil)' },
|
|
27
|
+
{ code: 'fr', name: 'Français' },
|
|
28
|
+
{ code: 'de', name: 'Deutsch' },
|
|
29
|
+
{ code: 'ja', name: '日本語' }
|
|
30
|
+
];
|
|
31
|
+
var CODES = LANGUAGES.map(function (l) { return l.code; });
|
|
32
|
+
var SOURCE = 'en';
|
|
33
|
+
|
|
34
|
+
// "es-AR", "es_419" → "es"; "pt", "pt-PT" → "pt-BR"; "EN-us" → "en"; desconocido → null.
|
|
35
|
+
function normalizeLanguage(input) {
|
|
36
|
+
if (!input || typeof input !== 'string') return null;
|
|
37
|
+
var s = input.trim().replace('_', '-').toLowerCase();
|
|
38
|
+
if (!s) return null;
|
|
39
|
+
for (var i = 0; i < CODES.length; i++) if (CODES[i].toLowerCase() === s) return CODES[i];
|
|
40
|
+
var base = s.split('-')[0];
|
|
41
|
+
if (base === 'pt') return 'pt-BR';
|
|
42
|
+
for (var j = 0; j < CODES.length; j++) if (CODES[j].toLowerCase() === base) return CODES[j];
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// FNV-1a de 32 bits sobre UTF-16: rápido, determinístico e idéntico en Node y navegador.
|
|
47
|
+
function hash(text) {
|
|
48
|
+
var h = 0x811c9dc5;
|
|
49
|
+
var s = String(text);
|
|
50
|
+
for (var i = 0; i < s.length; i++) {
|
|
51
|
+
h ^= s.charCodeAt(i);
|
|
52
|
+
h = (h + ((h << 1) + (h << 4) + (h << 7) + (h << 8) + (h << 24))) >>> 0;
|
|
53
|
+
}
|
|
54
|
+
return ('0000000' + h.toString(16)).slice(-8);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// "Hola {name}" + {name:"Ana"} → "Hola Ana". Placeholders sin valor quedan tal cual.
|
|
58
|
+
function interpolate(text, vars) {
|
|
59
|
+
if (!vars) return text;
|
|
60
|
+
return String(text).replace(/\{([a-zA-Z0-9_]+)\}/g, function (m, k) {
|
|
61
|
+
return Object.prototype.hasOwnProperty.call(vars, k) && vars[k] != null ? String(vars[k]) : m;
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* @param {object} opts
|
|
67
|
+
* locales: { en: {key: text}, es: {...}, ... } diccionarios planos
|
|
68
|
+
* hashes: { es: {key: hashDelInglés}, ... } (opcional) huellas de las traducciones de tools
|
|
69
|
+
* language: código pedido (se normaliza; si no está soportado, inglés)
|
|
70
|
+
*/
|
|
71
|
+
function createI18n(opts) {
|
|
72
|
+
opts = opts || {};
|
|
73
|
+
var locales = opts.locales || {};
|
|
74
|
+
var hashes = opts.hashes || {};
|
|
75
|
+
var language = normalizeLanguage(opts.language) || SOURCE;
|
|
76
|
+
if (!locales[language] && language !== SOURCE) language = SOURCE;
|
|
77
|
+
var en = locales[SOURCE] || {};
|
|
78
|
+
var lockMap = hashes[language] || {};
|
|
79
|
+
// Una traducción cuyo inglés cambió desde que se tradujo no se usa (cae al inglés actual).
|
|
80
|
+
var dict = {};
|
|
81
|
+
var raw = locales[language] || {};
|
|
82
|
+
Object.keys(raw).forEach(function (k) {
|
|
83
|
+
var lock = lockMap[k];
|
|
84
|
+
if (lock && typeof en[k] === 'string' && hash(en[k]) !== lock) return;
|
|
85
|
+
dict[k] = raw[k];
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
function has(key) { return Object.prototype.hasOwnProperty.call(dict, key) && typeof dict[key] === 'string' && dict[key] !== ''; }
|
|
89
|
+
|
|
90
|
+
// Texto de una clave de UI/mensajes con caída al inglés.
|
|
91
|
+
function t(key, vars, fallbackText) {
|
|
92
|
+
var text = has(key) ? dict[key]
|
|
93
|
+
: (typeof en[key] === 'string' && en[key] !== '') ? en[key]
|
|
94
|
+
: (fallbackText != null && fallbackText !== '') ? fallbackText
|
|
95
|
+
: key;
|
|
96
|
+
return interpolate(text, vars);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Traducción de un texto en inglés "vivo" (tomado del código en ejecución): solo si la
|
|
100
|
+
// traducción se hizo a partir de ese mismo inglés. Si no, devuelve el inglés.
|
|
101
|
+
function translateLive(key, englishNow) {
|
|
102
|
+
if (language === SOURCE || typeof englishNow !== 'string' || englishNow === '') return englishNow;
|
|
103
|
+
if (!has(key)) return englishNow;
|
|
104
|
+
var lock = lockMap[key];
|
|
105
|
+
if (lock && lock !== hash(englishNow)) return englishNow;
|
|
106
|
+
return dict[key];
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Recorre un JSON Schema y traduce cada `description` (y `title`) con claves estables:
|
|
110
|
+
// tool.<nombre>.param.<ruta> ej.: tool.apply_effect.param.clipId
|
|
111
|
+
// rutas anidadas con ".", ítems de arrays con "[]", ramas anyOf/oneOf con "|n".
|
|
112
|
+
function localizeSchema(schema, keyBase) {
|
|
113
|
+
if (!schema || typeof schema !== 'object') return schema;
|
|
114
|
+
var out = Array.isArray(schema) ? schema.slice() : Object.assign({}, schema);
|
|
115
|
+
if (typeof out.description === 'string') out.description = translateLive(keyBase, out.description);
|
|
116
|
+
if (typeof out.title === 'string') out.title = translateLive(keyBase + '#title', out.title);
|
|
117
|
+
if (out.properties && typeof out.properties === 'object') {
|
|
118
|
+
var props = {};
|
|
119
|
+
Object.keys(out.properties).forEach(function (name) {
|
|
120
|
+
props[name] = localizeSchema(out.properties[name], joinPath(keyBase, name));
|
|
121
|
+
});
|
|
122
|
+
out.properties = props;
|
|
123
|
+
}
|
|
124
|
+
if (out.items && typeof out.items === 'object' && !Array.isArray(out.items)) out.items = localizeSchema(out.items, keyBase + '[]');
|
|
125
|
+
['anyOf', 'oneOf', 'allOf'].forEach(function (k) {
|
|
126
|
+
if (Array.isArray(out[k])) out[k] = out[k].map(function (s, i) { return localizeSchema(s, keyBase + '|' + i); });
|
|
127
|
+
});
|
|
128
|
+
if (out.additionalProperties && typeof out.additionalProperties === 'object') {
|
|
129
|
+
out.additionalProperties = localizeSchema(out.additionalProperties, keyBase + '{}');
|
|
130
|
+
}
|
|
131
|
+
return out;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Traduce la lista de tools de una respuesta tools/list. Devuelve copias; no toca el original.
|
|
135
|
+
function localizeTools(tools) {
|
|
136
|
+
if (language === SOURCE || !Array.isArray(tools)) return tools;
|
|
137
|
+
return tools.map(function (tool) {
|
|
138
|
+
if (!tool || typeof tool.name !== 'string') return tool;
|
|
139
|
+
var base = 'tool.' + tool.name;
|
|
140
|
+
var copy = Object.assign({}, tool);
|
|
141
|
+
if (typeof copy.description === 'string') copy.description = translateLive(base, copy.description);
|
|
142
|
+
if (typeof copy.title === 'string') copy.title = translateLive(base + '#title', copy.title);
|
|
143
|
+
if (copy.inputSchema) copy.inputSchema = localizeSchemaRoot(copy.inputSchema, base);
|
|
144
|
+
return copy;
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
// En la raíz del inputSchema la descripción del objeto no se usa como parámetro.
|
|
148
|
+
function localizeSchemaRoot(schema, base) {
|
|
149
|
+
var out = Object.assign({}, schema);
|
|
150
|
+
if (out.properties) {
|
|
151
|
+
var props = {};
|
|
152
|
+
Object.keys(out.properties).forEach(function (name) {
|
|
153
|
+
props[name] = localizeSchema(out.properties[name], base + '.param.' + name);
|
|
154
|
+
});
|
|
155
|
+
out.properties = props;
|
|
156
|
+
}
|
|
157
|
+
return out;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// Plurales: busca "<clave>.<categoría>" según las reglas del idioma (Intl.PluralRules:
|
|
161
|
+
// one/other, en japonés solo other), después "<clave>.other" y por último "<clave>".
|
|
162
|
+
// {count} queda disponible como placeholder.
|
|
163
|
+
var pluralRules = null;
|
|
164
|
+
try { pluralRules = new Intl.PluralRules(language === 'pt-BR' ? 'pt-BR' : language); } catch (e) { pluralRules = null; }
|
|
165
|
+
function tn(key, count, vars) {
|
|
166
|
+
var v = Object.assign({ count: count }, vars || {});
|
|
167
|
+
var cat = pluralRules ? pluralRules.select(count) : (count === 1 ? 'one' : 'other');
|
|
168
|
+
var candidates = [key + '.' + cat, key + '.other', key];
|
|
169
|
+
for (var i = 0; i < candidates.length; i++) {
|
|
170
|
+
var k = candidates[i];
|
|
171
|
+
if (has(k) || (typeof en[k] === 'string' && en[k] !== '')) return t(k, v);
|
|
172
|
+
}
|
|
173
|
+
return t(key, v);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
return {
|
|
177
|
+
language: language,
|
|
178
|
+
t: t,
|
|
179
|
+
tn: tn,
|
|
180
|
+
translateLive: translateLive,
|
|
181
|
+
localizeTools: localizeTools,
|
|
182
|
+
has: has
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function joinPath(base, name) { return base + '.' + name; }
|
|
187
|
+
|
|
188
|
+
// Aplana la lista de tools de tools/list a { clave: inglés } con las mismas claves que usa
|
|
189
|
+
// localizeTools. Lo usa el extractor para generar el diccionario fuente.
|
|
190
|
+
function flattenTools(tools) {
|
|
191
|
+
var out = {};
|
|
192
|
+
(tools || []).forEach(function (tool) {
|
|
193
|
+
if (!tool || typeof tool.name !== 'string') return;
|
|
194
|
+
var base = 'tool.' + tool.name;
|
|
195
|
+
if (typeof tool.description === 'string' && tool.description) out[base] = tool.description;
|
|
196
|
+
if (typeof tool.title === 'string' && tool.title) out[base + '#title'] = tool.title;
|
|
197
|
+
var props = tool.inputSchema && tool.inputSchema.properties;
|
|
198
|
+
if (props) Object.keys(props).forEach(function (name) { walk(props[name], base + '.param.' + name); });
|
|
199
|
+
});
|
|
200
|
+
function walk(schema, key) {
|
|
201
|
+
if (!schema || typeof schema !== 'object') return;
|
|
202
|
+
if (typeof schema.description === 'string' && schema.description) out[key] = schema.description;
|
|
203
|
+
if (typeof schema.title === 'string' && schema.title) out[key + '#title'] = schema.title;
|
|
204
|
+
if (schema.properties) Object.keys(schema.properties).forEach(function (n) { walk(schema.properties[n], key + '.' + n); });
|
|
205
|
+
if (schema.items && typeof schema.items === 'object' && !Array.isArray(schema.items)) walk(schema.items, key + '[]');
|
|
206
|
+
['anyOf', 'oneOf', 'allOf'].forEach(function (k) {
|
|
207
|
+
if (Array.isArray(schema[k])) schema[k].forEach(function (s, i) { walk(s, key + '|' + i); });
|
|
208
|
+
});
|
|
209
|
+
if (schema.additionalProperties && typeof schema.additionalProperties === 'object') walk(schema.additionalProperties, key + '{}');
|
|
210
|
+
}
|
|
211
|
+
return out;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
return {
|
|
215
|
+
LANGUAGES: LANGUAGES,
|
|
216
|
+
CODES: CODES,
|
|
217
|
+
SOURCE: SOURCE,
|
|
218
|
+
normalizeLanguage: normalizeLanguage,
|
|
219
|
+
hash: hash,
|
|
220
|
+
interpolate: interpolate,
|
|
221
|
+
createI18n: createI18n,
|
|
222
|
+
flattenTools: flattenTools
|
|
223
|
+
};
|
|
224
|
+
});
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
{
|
|
2
|
+
"msg.bridge.notConnected": "Illustrator ist nicht verbunden. Öffnen Sie Illustrator mit dem Bedienfeld «Synthetic Illustrator MCP» (es stellt die Bridge auf Port {port} bereit).",
|
|
3
|
+
"msg.bridge.timeout": "Zeitüberschreitung ({ms} ms)",
|
|
4
|
+
"msg.doctor.bridgeConnecting": "Bridge: Verbindung zu {url} wird hergestellt (prüft, ob das Bedienfeld Synthetic Illustrator MCP in Illustrator geöffnet ist)...",
|
|
5
|
+
"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.",
|
|
6
|
+
"msg.doctor.bridgeOk": "Bridge erreichbar — das Bedienfeld Synthetic Illustrator MCP läuft in Illustrator.",
|
|
7
|
+
"msg.doctor.language": "Sprache: {language} (Quelle: {source})",
|
|
8
|
+
"msg.doctor.licenseFailed": "Lizenzprüfung fehlgeschlagen: {message}",
|
|
9
|
+
"msg.doctor.licenseInvalid": "ungültig",
|
|
10
|
+
"msg.doctor.licenseNotSet": "IL_MCP_LICENSE ist nicht gesetzt. Eine Lizenz erhalten Sie unter https://synthetic.com.ar/illustrator-mcp",
|
|
11
|
+
"msg.doctor.licensePlanActive": "aktiv",
|
|
12
|
+
"msg.doctor.licenseValid": "Lizenz gültig ({plan})",
|
|
13
|
+
"msg.doctor.nodeOk": "Node.js {version} (>=18 erforderlich)",
|
|
14
|
+
"msg.doctor.nodeTooOld": "Node.js {version} — Version 18 oder neuer erforderlich",
|
|
15
|
+
"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",
|
|
16
|
+
"msg.doctor.title": "Synthetic Illustrator MCP — doctor (Diagnose)",
|
|
17
|
+
"msg.healthcheck.hint": "Öffnen Sie Illustrator mit dem Bedienfeld Synthetic Illustrator MCP (es stellt die Bridge bereit).",
|
|
18
|
+
"msg.host.errorAtLine": "{message} (Zeile {line})",
|
|
19
|
+
"msg.host.itemNotFound": "Element nicht gefunden: {name}",
|
|
20
|
+
"msg.host.layerNotFound": "Ebene nicht gefunden: {name}",
|
|
21
|
+
"msg.host.noDocument": "Kein Dokument geöffnet",
|
|
22
|
+
"msg.host.notACompoundPath": "Kein zusammengesetzter Pfad: {name}",
|
|
23
|
+
"msg.host.notAGroup": "Keine Gruppe: {name}",
|
|
24
|
+
"msg.host.notAPath": "Kein Pfad: {name}",
|
|
25
|
+
"msg.host.unknownCommand": "Unbekannter Befehl: {cmd}",
|
|
26
|
+
"msg.license.getLicense": "Eine Lizenz erhalten Sie unter https://synthetic.com.ar/illustrator-mcp",
|
|
27
|
+
"msg.license.invalidOrMissing": "Ungültige oder fehlende Lizenz.",
|
|
28
|
+
"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",
|
|
29
|
+
"msg.license.required": "Lizenz erforderlich",
|
|
30
|
+
"msg.license.serverUnreachable": "Lizenzserver nicht erreichbar. Prüfen Sie Ihre Internetverbindung.",
|
|
31
|
+
"msg.license.serverUnreachableRetry": "Lizenzserver nicht erreichbar. Beim nächsten Aufruf wird es erneut versucht.",
|
|
32
|
+
"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.",
|
|
33
|
+
"tool.add_area_text_frame": "Fügt einen Flächentext-Rahmen hinzu: Der Text fließt innerhalb eines Rechtecks und bricht um.",
|
|
34
|
+
"tool.add_artboard": "Fügt eine neue Zeichenfläche hinzu.",
|
|
35
|
+
"tool.add_layer": "Fügt dem aktiven Dokument eine neue Ebene hinzu.",
|
|
36
|
+
"tool.add_shape_ellipse": "Fügt eine Ellipse hinzu.",
|
|
37
|
+
"tool.add_shape_line": "Fügt ein gerades Liniensegment zwischen zwei Punkten hinzu.",
|
|
38
|
+
"tool.add_shape_polygon": "Fügt ein regelmäßiges Polygon zentriert bei (cx, cy) hinzu.",
|
|
39
|
+
"tool.add_shape_rectangle": "Fügt ein Rechteck hinzu. top/left sind in Punkt, Dokumentkoordinaten (Y nach unten).",
|
|
40
|
+
"tool.add_shape_rounded_rectangle": "Fügt ein Rechteck mit abgerundeten Ecken hinzu.",
|
|
41
|
+
"tool.add_shape_star": "Fügt einen Stern zentriert bei (cx, cy) hinzu.",
|
|
42
|
+
"tool.add_spot_color": "Erstellt eine neue Schmuckfarbe aus einem CMYK-/RGB-/Graustufenwert und registriert sie in den Farbfeldern des Dokuments.",
|
|
43
|
+
"tool.add_swatch": "Fügt dem Dokument ein neues Farbfeld hinzu.",
|
|
44
|
+
"tool.add_text_frame": "Fügt einen Punkttext-Rahmen hinzu (der Text ist an einem einzigen Punkt verankert und wächst mit dem Inhalt) bei (x, y).",
|
|
45
|
+
"tool.align_items": "Richtet Elemente anhand ihres gemeinsamen Begrenzungsrahmens an einer Kante/Achse aus.",
|
|
46
|
+
"tool.apply_brush_to_path": "Wendet einen vorhandenen Pinsel auf die Kontur eines Pfads an.",
|
|
47
|
+
"tool.apply_character_style": "Wendet eine benannte Zeichenformatvorlage auf den gesamten Inhalt eines Textrahmens an.",
|
|
48
|
+
"tool.apply_drop_shadow_effect": "Wendet einen Live-Schlagschatten-Effekt an (nicht destruktiv, im Bedienfeld Aussehen bearbeitbar/entfernbar). Immer schwarz -- die Farb-/Füllmethode-Parameter des Effekts lehnten jeden live getesteten Wert ab, daher zeigt dies nur, was nachweislich funktioniert.",
|
|
49
|
+
"tool.apply_feather_effect": "Wendet einen Live-Federn-Effekt an (blendet die Kante des Elements weich aus).",
|
|
50
|
+
"tool.apply_gradient_fill": "Füllt ein Seitenelement mit einem vorhandenen Farbverlauf.",
|
|
51
|
+
"tool.apply_gradient_stroke": "Wendet einen vorhandenen Farbverlauf auf die Kontur eines Seitenelements an.",
|
|
52
|
+
"tool.apply_live_effect_raw": "Escape-Hatch: wendet einen beliebigen Live-Effekt anhand seines internen Namens und eines rohen XML-Parameter-Dictionary an (z. B. name='Adobe Drop Shadow', xml='<LiveEffect name=\"Adobe Drop Shadow\"><Dict>...</Dict></LiveEffect>'). Für Effekte, die kein eigenes Tool haben.",
|
|
53
|
+
"tool.apply_named_effect": "Wendet einen von 87 live bestätigt funktionierenden Illustrator-Effekten anhand eines Kurznamens mit Standardparametern an (oder einer rohen XML-<Dict>-Überschreibung für Feinsteuerung -- Format siehe apply_live_effect_raw). Deckt die meisten Effekte unter Effekt > Illustrator-Effekte und Effekt > Photoshop-Effekte ab. Nicht destruktiv/im Bedienfeld Aussehen bearbeitbar, wie die 4 eigenständigen Effekt-Tools (Schlagschatten, Federn, Abgerundete Ecken, Pfad verschieben), die stattdessen echte typisierte Parameter erhalten und bei Verfügbarkeit bevorzugt werden sollten.",
|
|
54
|
+
"tool.apply_offset_path_effect": "Wendet einen Live-Pfad-verschieben-Effekt an (vergrößert/verkleinert die Kontur eines Pfads).",
|
|
55
|
+
"tool.apply_paragraph_style": "Wendet eine benannte Absatzformatvorlage auf den gesamten Inhalt eines Textrahmens an.",
|
|
56
|
+
"tool.apply_pattern_fill": "Füllt ein Seitenelement mit einem vorhandenen Musterfeld.",
|
|
57
|
+
"tool.apply_round_corners_effect": "Wendet einen Live-Effekt für abgerundete Ecken auf einen Pfad an.",
|
|
58
|
+
"tool.apply_swatch": "Wendet ein vorhandenes Farbfeld als Füllung oder Kontur eines Seitenelements an.",
|
|
59
|
+
"tool.break_symbol_link": "Trennt die Verknüpfung einer Symbolinstanz und wandelt sie zurück in normal bearbeitbare Grafik um. Gibt den Namen des resultierenden Elements zurück.",
|
|
60
|
+
"tool.bring_forward": "Verschiebt ein Seitenelement eine Ebene nach vorn in der Stapelreihenfolge seiner Ebene.",
|
|
61
|
+
"tool.bring_to_front": "Bringt ein Seitenelement an die Spitze der Stapelreihenfolge seiner Ebene.",
|
|
62
|
+
"tool.close_document": "Schließt das aktive Dokument (save=true, um vorher zu speichern).",
|
|
63
|
+
"tool.convert_item_to_guide": "Wandelt ein Pfadelement in eine nicht druckbare Hilfslinie um.",
|
|
64
|
+
"tool.create_document": "Erstellt ein neues Dokument.",
|
|
65
|
+
"tool.create_gradient": "Erstellt einen linearen oder radialen Farbverlauf mit 2 oder mehr Farbstopps (Position 0-100). Gibt den Namen des Farbverlaufs zurück.",
|
|
66
|
+
"tool.create_path_from_points": "Erstellt ein PathItem aus einem Array von Ankerpunkten ({x,y} in Punkt, Dokumentkoordinaten mit Y hier nach unten übergeben — das Tool kehrt intern zur eigenen Y-nach-oben-Konvention von Illustrator um). Nur gerade Segmente (keine Bézier-Griffe); für Kurven anschließend set_path_point_handles verwenden.",
|
|
67
|
+
"tool.create_swatch_group": "Erstellt eine neue Farbfeldgruppe (Farbgruppe), die die angegebenen vorhandenen Farbfelder enthält.",
|
|
68
|
+
"tool.create_symbol_from_item": "Erstellt eine neue Symboldefinition aus einem Seitenelement. Illustrator ersetzt das Quellelement an Ort und Stelle durch eine Instanz des neuen Symbols.",
|
|
69
|
+
"tool.delete_artboard": "Löscht eine Zeichenfläche anhand des Index (ein Dokument muss mindestens eine behalten).",
|
|
70
|
+
"tool.delete_gradient": "Löscht einen Farbverlauf aus dem Dokument.",
|
|
71
|
+
"tool.delete_item": "Löscht ein Seitenelement anhand des Namens.",
|
|
72
|
+
"tool.delete_layer": "Löscht eine Ebene und alles darauf.",
|
|
73
|
+
"tool.delete_swatch": "Löscht ein Farbfeld aus dem Dokument.",
|
|
74
|
+
"tool.delete_symbol": "Löscht eine Symboldefinition aus dem Dokument (vorhandene Instanzen werden zu normaler Grafik).",
|
|
75
|
+
"tool.deselect_all": "Hebt die Auswahl im aktiven Dokument auf.",
|
|
76
|
+
"tool.distribute_items": "Verteilt 3 oder mehr Elemente mit gleichem Abstand zwischen ihren Kanten entlang einer Achse.",
|
|
77
|
+
"tool.duplicate_item": "Dupliziert ein Seitenelement. Gibt den (automatisch generierten) Namen des neuen Elements zurück.",
|
|
78
|
+
"tool.duplicate_layer": "Dupliziert eine Ebene und alles darauf (Layer hat im Illustrator-DOM kein direktes duplicate(), daher wird eine neue Ebene erstellt und jedes Element hineindupliziert). Gibt den Namen der neuen Ebene zurück.",
|
|
79
|
+
"tool.embed_placed_item": "Bettet ein verknüpftes platziertes Element in das Dokument ein (verweist nicht mehr auf die externe Datei).",
|
|
80
|
+
"tool.export_jpg": "Exportiert das aktive Dokument (oder eine Zeichenfläche) als JPEG.",
|
|
81
|
+
"tool.export_pdf": "Speichert das aktive Dokument als PDF (über Speichern unter, nicht Exportieren — PDF ist in Illustrator ein natives Speicherformat).",
|
|
82
|
+
"tool.export_png": "Exportiert das aktive Dokument (oder eine Zeichenfläche) als transparentes PNG-24.",
|
|
83
|
+
"tool.export_svg": "Exportiert das aktive Dokument als SVG.",
|
|
84
|
+
"tool.find_replace_text": "Sucht und ersetzt eine Teilzeichenfolge in allen Textrahmen des aktiven Dokuments. Gibt zurück, wie viele Rahmen geändert wurden.",
|
|
85
|
+
"tool.flip_item": "Spiegelt ein Seitenelement horizontal und/oder vertikal um seinen eigenen Mittelpunkt.",
|
|
86
|
+
"tool.get_document_info": "Infos zum aktiven Dokument: aktive Zeichenfläche, Anzahl der Zeichenflächen, Farbmodus, Einheiten, Ebenen.",
|
|
87
|
+
"tool.get_gradient": "Gibt Typ und Farbstopps eines Farbverlaufs zurück.",
|
|
88
|
+
"tool.get_item": "Informationen zu einem Seitenelement anhand des Namens: Typ, Begrenzung, Ebene und (bei Pfaden) Füllung/Kontur.",
|
|
89
|
+
"tool.get_item_bounds": "Geometrische Begrenzung (links, oben, rechts, unten, Breite, Höhe, in Punkt) eines Seitenelements.",
|
|
90
|
+
"tool.get_layer": "Infos zu einer Ebene anhand des Namens.",
|
|
91
|
+
"tool.get_path_points": "Gibt die Ankerpunkte und Bézier-Griffe eines Pfads zurück (in derselben Y-nach-unten-Konvention, die create_path_from_points verwendet).",
|
|
92
|
+
"tool.get_ruler_units": "Gibt die Lineal-Einheiten des Dokuments zurück.",
|
|
93
|
+
"tool.get_selection": "Listet die im Dokument aktuell ausgewählten Seitenelemente auf.",
|
|
94
|
+
"tool.get_text_contents": "Gibt den Textinhalt eines Textrahmens zurück.",
|
|
95
|
+
"tool.group_items": "Gruppiert Seitenelemente zu einem neuen GroupItem. Gibt den Namen der Gruppe zurück.",
|
|
96
|
+
"tool.il_healthcheck": "Prüft die Verbindung zu Illustrator: Version und aktives Dokument.",
|
|
97
|
+
"tool.il_info": "App-Infos: Version, geöffnete Dokumente.",
|
|
98
|
+
"tool.invert_selection": "Wählt alle Seitenelemente aus, die aktuell NICHT ausgewählt sind, und hebt die Auswahl der zuvor ausgewählten auf.",
|
|
99
|
+
"tool.list_artboards": "Listet die Zeichenflächen des Dokuments auf (Name, Begrenzung).",
|
|
100
|
+
"tool.list_brushes": "Listet die Pinsel des Dokuments nach Namen auf (die Skripting-API von Illustrator gibt den Pinseltyp -- Kunst/Kalligrafie/Muster/Streuung -- nicht preis, daher fehlt er).",
|
|
101
|
+
"tool.list_character_styles": "Listet die benannten Zeichenformatvorlagen des Dokuments auf.",
|
|
102
|
+
"tool.list_documents": "Listet die geöffneten Dokumente auf.",
|
|
103
|
+
"tool.list_fonts": "Listet eine Stichprobe der verfügbaren PostScript-Schriftnamen auf (die ersten 200 — Illustrator kann Tausende installiert haben).",
|
|
104
|
+
"tool.list_gradients": "Listet die Farbverläufe des Dokuments auf (Name, Typ, Anzahl der Farbstopps).",
|
|
105
|
+
"tool.list_group_children": "Listet die direkten Kindelemente eines GroupItem auf.",
|
|
106
|
+
"tool.list_items": "Listet die Seitenelemente des aktiven Dokuments auf (Name, Typ, Begrenzung). Optional auf eine Ebene nach Namen eingeschränkt.",
|
|
107
|
+
"tool.list_layers": "Listet den Ebenenbaum des aktiven Dokuments auf (Name, sichtbar, gesperrt, Anzahl der Objekte nach Typ).",
|
|
108
|
+
"tool.list_paragraph_styles": "Listet die benannten Absatzformatvorlagen des Dokuments auf.",
|
|
109
|
+
"tool.list_patterns": "Listet die Musterfelder des Dokuments auf.",
|
|
110
|
+
"tool.list_placed_items": "Listet die im Dokument platzierten (verknüpften oder eingebetteten) Raster-/Vektordateien auf.",
|
|
111
|
+
"tool.list_spot_colors": "Listet die Schmuckfarben des Dokuments auf.",
|
|
112
|
+
"tool.list_swatch_groups": "Listet die Farbfeldgruppen (Farbgruppen) des Dokuments und ihre jeweiligen Farbfelder auf.",
|
|
113
|
+
"tool.list_swatches": "Listet die Farbfelder des Dokuments auf.",
|
|
114
|
+
"tool.list_symbols": "Listet die Symbole des Dokuments auf.",
|
|
115
|
+
"tool.make_clipping_mask": "Gruppiert Elemente und verwendet eines davon (maskItemName, muss ein Pfad/zusammengesetzter Pfad sein) als Schnittmaske für den Rest. Gibt den Namen der Gruppe zurück.",
|
|
116
|
+
"tool.make_compound_path": "Kombiniert Pfadelemente zu einem einzigen CompoundPathItem (z. B. für Donut-Formen mit Löchern). Gibt den Namen des zusammengesetzten Pfads zurück.",
|
|
117
|
+
"tool.move_item": "Verschiebt ein Seitenelement an eine absolute Position (obere linke Ecke seines Begrenzungsrahmens, in Punkt).",
|
|
118
|
+
"tool.move_item_to_layer": "Verschiebt ein Seitenelement in eine andere Ebene.",
|
|
119
|
+
"tool.move_layer": "Ordnet eine Ebene nach vorn, nach hinten oder relativ zu einer anderen Ebene an.",
|
|
120
|
+
"tool.open_document": "Öffnet eine Datei.",
|
|
121
|
+
"tool.outline_text": "Wandelt einen Textrahmen in Konturen um (bearbeitbare Vektorpfade). Gibt den Namen der resultierenden Gruppe zurück — der ursprüngliche Textrahmen wird ersetzt.",
|
|
122
|
+
"tool.place_symbol_instance": "Platziert eine Instanz eines vorhandenen Symbols bei (x, y).",
|
|
123
|
+
"tool.play_action": "Spielt eine vorhandene Illustrator-Aktion (aus dem Bedienfeld Aktionen) anhand von Aktions- und Satznamen ab.",
|
|
124
|
+
"tool.release_clipping_mask": "Löst eine Schnittmaskengruppe wieder in ihre einzelnen Elemente auf (hebt Schnittmaske und Gruppierung auf).",
|
|
125
|
+
"tool.release_compound_path": "Löst ein CompoundPathItem wieder in seine einzelnen PathItems auf.",
|
|
126
|
+
"tool.release_guide": "Wandelt eine Hilfslinie zurück in einen normalen, bearbeitbaren Pfad um.",
|
|
127
|
+
"tool.relink_placed_item": "Verweist ein platziertes Element auf eine andere Datei auf der Festplatte um.",
|
|
128
|
+
"tool.rename_artboard": "Benennt eine Zeichenfläche anhand des Index um.",
|
|
129
|
+
"tool.rename_item": "Benennt ein Seitenelement um (über Elementnamen sprechen andere Tools ein bestimmtes Element an).",
|
|
130
|
+
"tool.rename_layer": "Benennt eine Ebene um.",
|
|
131
|
+
"tool.rename_symbol": "Benennt eine Symboldefinition um.",
|
|
132
|
+
"tool.resize_item": "Skaliert ein Seitenelement um seinen Mittelpunkt nach Prozent (100 = keine Änderung).",
|
|
133
|
+
"tool.rotate_item": "Dreht ein Seitenelement um seinen Mittelpunkt in Grad (positiv = gegen den Uhrzeigersinn).",
|
|
134
|
+
"tool.run_jsx": "Führt beliebiges ExtendScript in Illustrator aus. Der Code kann 'return' verwenden. Gibt {ok,data} zurück.",
|
|
135
|
+
"tool.run_jsx_json": "Führt ExtendScript aus, das einen serialisierbaren Wert (JSON) zurückgibt. Wie run_jsx, aber für Daten gedacht.",
|
|
136
|
+
"tool.save_document": "Speichert das aktive Dokument.",
|
|
137
|
+
"tool.save_document_as": "Speichert das aktive Dokument als neue .ai-Datei.",
|
|
138
|
+
"tool.select_items": "Legt die Auswahl des aktiven Dokuments auf die angegebenen Seitenelemente fest (nach Namen). Übergeben Sie ein leeres Array, um sie zu löschen.",
|
|
139
|
+
"tool.select_same_fill_color": "Wählt alle Seitenelemente im Dokument aus, deren Füllfarbe exakt mit der eines Referenzelements übereinstimmt.",
|
|
140
|
+
"tool.send_backward": "Verschiebt ein Seitenelement eine Ebene nach hinten in der Stapelreihenfolge seiner Ebene.",
|
|
141
|
+
"tool.send_to_back": "Schickt ein Seitenelement an das Ende der Stapelreihenfolge seiner Ebene.",
|
|
142
|
+
"tool.set_active_artboard": "Legt fest, welcher Zeichenflächen-Index aktiv ist (betrifft Tools, die standardmäßig „die aktive Zeichenfläche” verwenden, z. B. get_document_info).",
|
|
143
|
+
"tool.set_blend_mode": "Legt die Füllmethode eines Seitenelements fest.",
|
|
144
|
+
"tool.set_fill_color": "Legt die Füllfarbe eines Seitenelements fest oder entfernt die Füllung, wenn keine Farbe angegeben ist.",
|
|
145
|
+
"tool.set_group_clipped": "Low-Level: legt direkt fest, ob das oberste Element einer vorhandenen Gruppe als deren Schnittmaske verwendet wird.",
|
|
146
|
+
"tool.set_item_locked": "Sperrt oder entsperrt ein Seitenelement.",
|
|
147
|
+
"tool.set_item_visible": "Blendet ein Seitenelement ein oder aus.",
|
|
148
|
+
"tool.set_layer_color": "Legt die Auswahl-/Konturfarbe einer Ebene fest (im Bedienfeld Ebenen sowie als Auswahl-Hervorhebungsfarbe ihrer Elemente angezeigt), nicht die Grafik.",
|
|
149
|
+
"tool.set_layer_locked": "Sperrt eine Ebene oder hebt die Sperrung auf.",
|
|
150
|
+
"tool.set_layer_visible": "Blendet eine Ebene ein oder aus.",
|
|
151
|
+
"tool.set_opacity": "Legt die Deckkraft eines Seitenelements fest (0-100).",
|
|
152
|
+
"tool.set_path_closed": "Öffnet oder schließt einen Pfad.",
|
|
153
|
+
"tool.set_path_points": "Ersetzt die Ankerpunkte eines Pfads vollständig (gerade Segmente; gleiche Y-nach-unten-Konvention).",
|
|
154
|
+
"tool.set_ruler_units": "Legt die Lineal-Einheiten des Dokuments fest.",
|
|
155
|
+
"tool.set_stroke_cap": "Legt den Kappenstil der Kontur eines Pfads fest.",
|
|
156
|
+
"tool.set_stroke_color": "Legt die Konturfarbe eines Seitenelements fest oder entfernt die Kontur, wenn keine Farbe angegeben ist.",
|
|
157
|
+
"tool.set_stroke_dashes": "Legt das Strichmuster eines Pfads fest (Längen in Punkt, z. B. [4,2] für Strich-Lücke-Strich-Lücke). Für eine durchgezogene Linie ein leeres Array übergeben.",
|
|
158
|
+
"tool.set_stroke_join": "Legt den Eckenstil der Kontur eines Pfads fest.",
|
|
159
|
+
"tool.set_stroke_miter_limit": "Legt den Gehrungswinkel-Grenzwert eines Pfads fest (1-500; betrifft nur Gehrungsecken).",
|
|
160
|
+
"tool.set_stroke_width": "Legt die Konturstärke eines Seitenelements in Punkt fest.",
|
|
161
|
+
"tool.set_symbol_instance_symbol": "Verweist eine vorhandene Symbolinstanz auf eine andere Symboldefinition um.",
|
|
162
|
+
"tool.set_text_contents": "Legt den Textinhalt eines Textrahmens fest.",
|
|
163
|
+
"tool.set_text_justification": "Legt die Absatzausrichtung eines Textrahmens fest.",
|
|
164
|
+
"tool.set_text_leading": "Legt den Zeilenabstand eines Textrahmens in Punkt fest. Deaktiviert den automatischen Zeilenabstand (standardmäßig aktiv für Text), da ein zugewiesener Wert bei aktivem automatischem Zeilenabstand stillschweigend ignoriert wird.",
|
|
165
|
+
"tool.set_text_style": "Legt die Zeichenformatierung für den gesamten Inhalt eines Textrahmens fest: Schriftart (PostScript-Name, z. B. „Helvetica-Bold”), Größe (pt), Füllfarbe und/oder Laufweite.",
|
|
166
|
+
"tool.shear_item": "Schert (neigt) ein Seitenelement um seinen eigenen Mittelpunkt in Grad entlang einer Achse.",
|
|
167
|
+
"tool.translate_item": "Verschiebt ein Seitenelement relativ zu seiner aktuellen Position, in Punkt.",
|
|
168
|
+
"tool.ungroup_item": "Gruppiert ein GroupItem auf, indem seine Kindelemente in das übergeordnete Element der Gruppe verschoben werden.",
|
|
169
|
+
"ui.i18n.language": "Sprache",
|
|
170
|
+
"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.",
|
|
171
|
+
"ui.i18n.saveFailed": "Die Spracheinstellung konnte nicht gespeichert werden. Sie gilt nur für diese Sitzung.",
|
|
172
|
+
"ui.i18n.saved": "Sprache gespeichert.",
|
|
173
|
+
"ui.log.backupFailed": "Sicherung von {file} fehlgeschlagen: {message}",
|
|
174
|
+
"ui.log.bridgeError": "Bridge-Fehler: {message}",
|
|
175
|
+
"ui.log.clear": "leeren",
|
|
176
|
+
"ui.log.clearTitle": "Protokoll leeren",
|
|
177
|
+
"ui.log.clientConnected": "MCP-Client verbunden ({count})",
|
|
178
|
+
"ui.log.clientDisconnected": "MCP-Client getrennt ({count})",
|
|
179
|
+
"ui.log.commitFailed": "Übernahme fehlgeschlagen (zurückgesetzt): {message}",
|
|
180
|
+
"ui.log.downloadFailed": "Download von {file} fehlgeschlagen: {message}",
|
|
181
|
+
"ui.log.downloading": "{file} wird heruntergeladen...",
|
|
182
|
+
"ui.log.licenseSaveError": "Fehler beim Speichern des Lizenzschlüssels: {message}",
|
|
183
|
+
"ui.log.listening": "Bridge lauscht auf 127.0.0.1:{port}",
|
|
184
|
+
"ui.log.noUpdate": "Kein Update vorhanden",
|
|
185
|
+
"ui.log.portInUse": "Port {port} belegt: {message}",
|
|
186
|
+
"ui.log.portRetry": "Port {port} weiterhin belegt, neuer Versuch ({attempt}/{max})...",
|
|
187
|
+
"ui.log.restartingBridge": "Bridge wird neu gestartet...",
|
|
188
|
+
"ui.log.shaMismatch": "SHA256 von {file} stimmt nicht überein (erhalten {got}..., erwartet {expected}...)",
|
|
189
|
+
"ui.log.sizeDiffers": "Größe von {file} weicht vom Manifest ab ({got} vs. {expected}) — wird fortgesetzt",
|
|
190
|
+
"ui.log.title": "Aktivitätsprotokoll",
|
|
191
|
+
"ui.log.toggleTitle": "Protokoll ein-/ausblenden",
|
|
192
|
+
"ui.log.updateAborted": "Update abgebrochen: {reason}",
|
|
193
|
+
"ui.log.updateApplied": "Update v{version} angewendet. STARTEN SIE ILLUSTRATOR NEU, um das neue Bedienfeld zu laden.",
|
|
194
|
+
"ui.log.updateNoLicense": "Update fehlgeschlagen: kein Lizenzschlüssel gespeichert. Öffnen Sie die Einstellungen (⚙) und fügen Sie Ihren Lizenzschlüssel ein.",
|
|
195
|
+
"ui.log.wsLoadFailed": "'ws' konnte nicht geladen werden: {message} (--enable-nodejs?)",
|
|
196
|
+
"ui.product.subtitle": "Bridge · in Entwicklung",
|
|
197
|
+
"ui.settings.licenseEmpty": "Geben Sie vor dem Speichern einen Lizenzschlüssel ein.",
|
|
198
|
+
"ui.settings.licenseKey": "Lizenzschlüssel",
|
|
199
|
+
"ui.settings.licenseNotSaved": "Noch kein Lizenzschlüssel gespeichert — für Updates erforderlich.",
|
|
200
|
+
"ui.settings.licensePlaceholder": "Illustrator MCP-Lizenzschlüssel einfügen",
|
|
201
|
+
"ui.settings.licenseSaveFailed": "Lizenzschlüssel konnte nicht gespeichert werden (siehe Protokoll).",
|
|
202
|
+
"ui.settings.licenseSaved": "Lizenzschlüssel gespeichert.",
|
|
203
|
+
"ui.settings.saveLicense": "Lizenz speichern",
|
|
204
|
+
"ui.shell.builtBy": "Entwickelt von",
|
|
205
|
+
"ui.shell.openSite": "synthetic.com.ar öffnen",
|
|
206
|
+
"ui.status.active": "Bridge aktiv",
|
|
207
|
+
"ui.status.clientsMany": "{count} MCP-Clients",
|
|
208
|
+
"ui.status.clientsOne": "{count} MCP-Client",
|
|
209
|
+
"ui.status.error": "Fehler: {message}",
|
|
210
|
+
"ui.status.nodeUnavailable": "Node/ws nicht verfügbar",
|
|
211
|
+
"ui.status.port": "Port {port}",
|
|
212
|
+
"ui.status.portOpenFailed": "Port {port} konnte nicht geöffnet werden",
|
|
213
|
+
"ui.status.restart": "Neu starten",
|
|
214
|
+
"ui.status.starting": "Bridge wird gestartet…",
|
|
215
|
+
"ui.status.stopped": "Gestoppt",
|
|
216
|
+
"ui.status.updateApplied": "Update angewendet — Illustrator neu starten",
|
|
217
|
+
"ui.status.updateFailed": "Update fehlgeschlagen",
|
|
218
|
+
"ui.status.waitingForClient": "warte auf Client",
|
|
219
|
+
"ui.status.wsNoServer": "ws hat keinen WebSocketServer",
|
|
220
|
+
"ui.toolbar.reload": "Bedienfeld neu laden",
|
|
221
|
+
"ui.toolbar.settings": "Einstellungen",
|
|
222
|
+
"ui.update.appliedBody": "Schließen Sie Illustrator und öffnen Sie es erneut, um v{version} zu aktivieren.",
|
|
223
|
+
"ui.update.appliedTitle": "Update angewendet.",
|
|
224
|
+
"ui.update.available": "Update verfügbar",
|
|
225
|
+
"ui.update.installerTitle": "Falls der Hot-Swap fehlschlägt oder das Release ein neues Manifest erfordert",
|
|
226
|
+
"ui.update.later": "Später",
|
|
227
|
+
"ui.update.now": "Jetzt aktualisieren",
|
|
228
|
+
"ui.update.ok": "OK",
|
|
229
|
+
"ui.update.updating": "Wird aktualisiert..."
|
|
230
|
+
}
|