comfyui-mcp 0.50.115 → 0.51.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/dist/boot.js CHANGED
@@ -14,6 +14,8 @@ import { resolveToolSurfacePolicy } from "./tools/tool-surface-filter.js";
14
14
  import { isLocalMode } from "./config.js";
15
15
  import { ensurePanelInstalled } from "./services/panel-installer.js";
16
16
  import { checkAndSelfUpdate } from "./services/self-update.js";
17
+ import { tr } from "./i18n/index.js";
18
+ import { banner, labelRows, numberedSteps } from "./i18n/terminal-layout.js";
17
19
  /**
18
20
  * Fire-and-forget: ensure the ComfyUI sidebar panel is installed (install-if-
19
21
  * missing) on MCP load. LOCAL-only, hard-timed-out, and never throws — it must
@@ -201,26 +203,35 @@ async function openTunnelAndAnnounce(host, port, token) {
201
203
  }, null, 2);
202
204
  // Single multi-line block to stderr so it survives MCP stdio framing and is
203
205
  // easy to copy from the terminal.
204
- process.stderr.write([
206
+ process.stderr.write(banner(`ComfyUI MCP — ${tr("cli.tunnel_title", "Remote / Hosted Connector is LIVE")}`, [
207
+ ...labelRows(" ", [
208
+ [tr("cli.tunnel_label_public_url", "Public MCP URL"), mcpUrl],
209
+ [tr("cli.tunnel_label_token", "Auth token"), token],
210
+ ]),
205
211
  "",
206
- "════════════════════════════════════════════════════════════════════",
207
- " ComfyUI MCP Remote / Hosted Connector is LIVE",
208
- "════════════════════════════════════════════════════════════════════",
209
- ` Public MCP URL : ${mcpUrl}`,
210
- ` Auth token : ${token}`,
212
+ // Names CLAUDE DESKTOP's own menu path, which is localised by Claude Desktop's
213
+ // language setting and not by ours. The English fallback must keep matching that app's
214
+ // English UI exactly; a catalog should only translate it to the wording Claude Desktop
215
+ // itself uses in that language, never to a literal translation of these words.
216
+ ` ${tr("cli.tunnel_desktop_connector_path", "Claude Desktop → Settings → Connectors → Add custom connector:")}`,
217
+ // The header NAMES are wire protocol, not prose — only the row labels translate.
218
+ ...labelRows(" • ", [
219
+ [tr("cli.tunnel_field_name", "Name"), "ComfyUI"],
220
+ [tr("cli.tunnel_field_url", "URL"), mcpUrl],
221
+ [
222
+ tr("cli.tunnel_field_header", "Header"),
223
+ // The alternative is one phrase, not the word "or" plus a header name: a lone
224
+ // conjunction is untranslatable without the sentence it sits in, and both header
225
+ // spellings have to survive into every language byte-for-byte anyway.
226
+ `X-API-Key: ${token} ${tr("cli.tunnel_header_alt", "(or Authorization: Bearer {token})", { token })}`,
227
+ ],
228
+ ]),
211
229
  "",
212
- " Claude Desktop Settings → Connectors → Add custom connector:",
213
- ` • Name : ComfyUI`,
214
- ` • URL : ${mcpUrl}`,
215
- ` • Header: X-API-Key: ${token} (or Authorization: Bearer ${token})`,
216
- "",
217
- " Headless / programmatic config snippet:",
230
+ ` ${tr("cli.tunnel_headless_snippet", "Headless / programmatic config snippet:")}`,
218
231
  snippet,
219
232
  "",
220
- " Keep this terminal open — the tunnel closes when the process exits.",
221
- "════════════════════════════════════════════════════════════════════",
222
- "",
223
- ].join("\n"));
233
+ ` ${tr("cli.tunnel_keep_open", "Keep this terminal open — the tunnel closes when the process exits.")}`,
234
+ ]));
224
235
  }
225
236
  /** A remote (non-loopback) ComfyUI served over https — the case where the pod's
226
237
  * browser panel needs the secure wss:// bridge instead of plain ws://. */
@@ -257,9 +268,16 @@ async function main() {
257
268
  const { setupAgent, AGENT_NAMES } = await import("./services/agent-setup.js");
258
269
  const agent = cli.setupAgent;
259
270
  if (!AGENT_NAMES.includes(agent)) {
260
- process.stderr.write(`\nUsage: comfyui-mcp setup <${AGENT_NAMES.join("|")}> [--compact|--full] [--comfyui-url <url>] [--dry-run]\n` +
261
- (cli.setupAgent ? `\nUnknown agent "${cli.setupAgent}".\n` : "") +
262
- `\nWrites the comfyui MCP server entry into the agent's own config file.\n`);
271
+ // Only the prose translates. The command itself is passed in as a variable rather than
272
+ // spliced around a translated "Usage" label, so what the user has to type back stays
273
+ // verbatim in every language including the agent names, which are the literal values
274
+ // the parser matches on.
275
+ const usage = `comfyui-mcp setup <${AGENT_NAMES.join("|")}> [--compact|--full] [--comfyui-url <url>] [--dry-run]`;
276
+ process.stderr.write(`\n${tr("cli.setup_usage", "Usage: {command}", { command: usage })}\n` +
277
+ (cli.setupAgent
278
+ ? `\n${tr("cli.setup_unknown_agent", 'Unknown agent "{agent}".', { agent: cli.setupAgent })}\n`
279
+ : "") +
280
+ `\n${tr("cli.setup_what_it_does", "Writes the comfyui MCP server entry into the agent's own config file.")}\n`);
263
281
  process.exit(1);
264
282
  }
265
283
  try {
@@ -272,11 +290,15 @@ async function main() {
272
290
  const lines = [
273
291
  "",
274
292
  result.wrote
275
- ? `✓ Added the "comfyui" MCP server to ${result.configPath}`
276
- : `— dry run: would write ${result.configPath} as —`,
293
+ ? tr("cli.setup_wrote", '✓ Added the "comfyui" MCP server to {path}', {
294
+ path: result.configPath,
295
+ })
296
+ : tr("cli.setup_dry_run", "— dry run: would write {path} as —", {
297
+ path: result.configPath,
298
+ }),
277
299
  ...(result.wrote ? [] : ["", result.content.trimEnd()]),
278
300
  "",
279
- "Next steps:",
301
+ tr("cli.setup_next_steps", "Next steps:"),
280
302
  ...result.nextSteps.map((s) => ` • ${s}`),
281
303
  "",
282
304
  ];
@@ -284,7 +306,9 @@ async function main() {
284
306
  process.exit(0);
285
307
  }
286
308
  catch (err) {
287
- process.stderr.write(`\ncomfyui-mcp setup failed: ${err instanceof Error ? err.message : err}\n`);
309
+ process.stderr.write(`\n${tr("cli.setup_failed", "comfyui-mcp setup failed: {error}", {
310
+ error: err instanceof Error ? err.message : String(err),
311
+ })}\n`);
288
312
  process.exit(1);
289
313
  }
290
314
  }
@@ -327,7 +351,7 @@ async function main() {
327
351
  // local ComfyUI (which would make the banner below lie about what it drives).
328
352
  const urlError = validateConnectUrl(cli.comfyuiUrl);
329
353
  if (urlError) {
330
- process.stderr.write(`\nComfyUI MCP — cannot start: ${urlError}\n\n`);
354
+ process.stderr.write(`\n${tr("cli.cannot_start", "ComfyUI MCP — cannot start: {error}", { error: urlError })}\n\n`);
331
355
  process.exit(1);
332
356
  }
333
357
  process.env.COMFYUI_URL = cli.comfyuiUrl;
@@ -337,34 +361,45 @@ async function main() {
337
361
  // Remote https pod → secure wss:// tunnel (auto); local/http or
338
362
  // --insecure-bridge → plain loopback ws://. Informational only here.
339
363
  const secureBridge = !cli.insecureBridge && isRemoteHttpsPod(cli.comfyuiUrl);
340
- const bridgeLine = secureBridge
341
- ? " Agent bridge : wss:// secure Cloudflare tunnel (auto — nothing to copy)"
342
- : ` Agent bridge : ws://127.0.0.1:${bridgePort}`;
343
- process.stderr.write([
344
- "",
345
- "════════════════════════════════════════════════════════════════════",
346
- " ComfyUI MCP local agent bridge is starting",
347
- "════════════════════════════════════════════════════════════════════",
348
- bridgeLine,
349
- ` Driving : ${cli.comfyuiUrl}`,
350
- secureBridge
351
- ? " Secure : the pod's HTTPS panel connects automatically over an\n encrypted tunnel — no URL to paste, works in any browser."
352
- : null,
353
- "",
354
- " Next steps:",
355
- ` 1. Open that ComfyUI in your browser: ${cli.comfyuiUrl}`,
356
- " 2. In the Agent panel's Settings General, turn ON",
357
- " 'Use external/local orchestrator (advanced)'.",
358
- " 3. Click Connect in the panel (the Agent panel's Connect dropdown).",
364
+ const bridgeValue = secureBridge
365
+ ? tr("cli.connect_bridge_secure", "wss:// secure Cloudflare tunnel (auto — nothing to copy)")
366
+ : `ws://127.0.0.1:${bridgePort}`;
367
+ // Every string below that NAMES A PANEL CONTROL keeps its English fallback exactly as
368
+ // the panel renders it in English today, and says so in its key. The panel's own labels
369
+ // are being translated separately; until a catalog carries both, an English fallback is
370
+ // the only wording that still matches the button the user has to find. A catalog entry
371
+ // for one of these keys is only correct if it uses the panel's translation of that
372
+ // control, not a fresh translation of the sentence.
373
+ const steps = [
374
+ tr("cli.connect_step_open_comfyui", "Open that ComfyUI in your browser: {url}", {
375
+ url: cli.comfyuiUrl,
376
+ }),
377
+ tr("cli.connect_step_enable_external_orchestrator", "In the Agent panel's Settings → General, turn ON\n'Use external/local orchestrator (advanced)'."),
378
+ tr("cli.connect_step_click_connect", "Click Connect in the panel (the Agent panel's Connect dropdown)."),
379
+ ];
380
+ process.stderr.write(banner(`ComfyUI MCP ${tr("cli.connect_title", "local agent bridge is starting")}`, [
381
+ ...labelRows(" ", [
382
+ [tr("cli.connect_label_bridge", "Agent bridge"), bridgeValue],
383
+ [tr("cli.connect_label_driving", "Driving"), cli.comfyuiUrl],
384
+ ...(secureBridge
385
+ ? [
386
+ [
387
+ tr("cli.connect_label_secure", "Secure"),
388
+ tr("cli.connect_secure_note", "the pod's HTTPS panel connects automatically over an\nencrypted tunnel — no URL to paste, works in any browser."),
389
+ ],
390
+ ]
391
+ : []),
392
+ ]),
359
393
  "",
360
- " Until you click Connect this window stays quiet — that's expected, not",
361
- " a hang. The agent runs HERE on your Claude/Codex login; nothing is",
362
- " installed on the ComfyUI box. Keep this terminal open.",
363
- "════════════════════════════════════════════════════════════════════",
394
+ ` ${tr("cli.connect_next_steps", "Next steps:")}`,
395
+ ...numberedSteps(steps),
364
396
  "",
365
- ]
366
- .filter((l) => l !== null)
367
- .join("\n"));
397
+ ...tr("cli.connect_quiet_note", "Until you click Connect this window stays quiet — that's expected, not\n" +
398
+ "a hang. The agent runs HERE on your Claude/Codex login; nothing is\n" +
399
+ "installed on the ComfyUI box. Keep this terminal open.")
400
+ .split("\n")
401
+ .map((l) => ` ${l}`),
402
+ ]));
368
403
  }
369
404
  const { runPanelOrchestrator } = await import("./orchestrator/index.js");
370
405
  await runPanelOrchestrator();
package/dist/boot.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"boot.js","sourceRoot":"","sources":["../src/boot.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"boot.js","sourceRoot":"","sources":["../src/boot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * The orchestrator's translation runtime.
3
+ *
4
+ * The behaviour worth guarding is what happens when translation CANNOT work — this text is
5
+ * printed during startup and while reporting other failures, so it must never be able to add
6
+ * a failure of its own.
7
+ */
8
+ import { describe, it, expect, afterEach } from "vitest";
9
+ import { readFileSync } from "node:fs";
10
+ import { join } from "node:path";
11
+ import { tr, trFor, resolveLocale, processLocale, LOCALES, __resetI18nForTest } from "./index.js";
12
+ afterEach(() => __resetI18nForTest());
13
+ describe("fallbacks", () => {
14
+ it("renders the English fallback when a key is missing, never the key", () => {
15
+ expect(trFor("ko", "cli.nope", "Usage: comfyui-mcp")).toBe("Usage: comfyui-mcp");
16
+ expect(trFor("ko", "cli.nope", "Save")).not.toContain("cli.");
17
+ });
18
+ it("interpolates {vars} in the fallback as well as the translation", () => {
19
+ expect(trFor("en", "cli.x", "port {port} is busy", { port: 9180 })).toBe("port 9180 is busy");
20
+ });
21
+ it("an unshipped or malformed locale still renders English rather than throwing", () => {
22
+ expect(() => trFor("kl-GL", "cli.x", "hello")).not.toThrow();
23
+ expect(trFor("kl-GL", "cli.x", "hello")).toBe("hello");
24
+ });
25
+ });
26
+ describe("locale resolution", () => {
27
+ it("strips the encoding suffix POSIX env vars carry", () => {
28
+ // LANG is "ko_KR.UTF-8" in the wild — underscore separator and an encoding suffix, both
29
+ // of which make a naive lookup miss and silently fall back to English.
30
+ expect(resolveLocale("ko_KR.UTF-8")).toBe("ko");
31
+ expect(resolveLocale("pt_BR.utf8")).toBe("pt-BR");
32
+ expect(resolveLocale("zh_TW")).toBe("zh-TW");
33
+ });
34
+ it("falls back to a shipped regional variant when the base language is not shipped alone", () => {
35
+ expect(resolveLocale("pt-PT")).toBe("pt-BR");
36
+ expect(resolveLocale("zh-HK")).toBe("zh-TW");
37
+ });
38
+ it("refuses a language we do not ship rather than guessing", () => {
39
+ expect(resolveLocale("kl")).toBeNull();
40
+ expect(resolveLocale("")).toBeNull();
41
+ expect(resolveLocale(null)).toBeNull();
42
+ });
43
+ it("--lang beats the environment, and explicit env beats the POSIX chain", () => {
44
+ const prev = { ...process.env };
45
+ try {
46
+ process.env.LANG = "fr_FR.UTF-8";
47
+ expect(processLocale(["node", "cli", "--lang", "ko"])).toBe("ko");
48
+ expect(processLocale(["node", "cli", "--lang=ja"])).toBe("ja");
49
+ expect(processLocale(["node", "cli"])).toBe("fr");
50
+ process.env.COMFYUI_MCP_LANG = "es";
51
+ expect(processLocale(["node", "cli"])).toBe("es");
52
+ }
53
+ finally {
54
+ process.env = prev;
55
+ }
56
+ });
57
+ it("defaults to English when nothing is set", () => {
58
+ const prev = { ...process.env };
59
+ try {
60
+ for (const k of ["COMFYUI_MCP_LANG", "LC_ALL", "LC_MESSAGES", "LANG"])
61
+ delete process.env[k];
62
+ expect(processLocale(["node", "cli"])).toBe("en");
63
+ }
64
+ finally {
65
+ process.env = prev;
66
+ }
67
+ });
68
+ });
69
+ describe("plurals", () => {
70
+ it("uses the categories the language actually has", () => {
71
+ const forms = { one: "{count} model", other: "{count} models" };
72
+ expect(trFor("en", "cli.n", forms, { count: 1 })).toBe("1 model");
73
+ expect(trFor("en", "cli.n", forms, { count: 4 })).toBe("4 models");
74
+ // Korean has a single form; an English-shaped one/other split would be wrong.
75
+ expect(trFor("ko", "cli.n", forms, { count: 1 })).toBe("1 model");
76
+ });
77
+ });
78
+ describe("the terminal vs the panel are separate audiences", () => {
79
+ it("trFor renders a given panel's language regardless of the process locale", () => {
80
+ // A `say` frame names panel controls ("Settings → OpenRouter"), so it must match the
81
+ // language of the panel it lands in — not the language of whoever started the server.
82
+ const prev = process.env.COMFYUI_MCP_LANG;
83
+ try {
84
+ process.env.COMFYUI_MCP_LANG = "en";
85
+ expect(tr("cli.x", "Ready")).toBe("Ready");
86
+ expect(trFor("ko", "cli.x", "Ready")).toBe("Ready"); // no catalog yet -> English
87
+ expect(() => trFor("ko", "cli.x", "Ready")).not.toThrow();
88
+ }
89
+ finally {
90
+ if (prev === undefined)
91
+ delete process.env.COMFYUI_MCP_LANG;
92
+ else
93
+ process.env.COMFYUI_MCP_LANG = prev;
94
+ }
95
+ });
96
+ });
97
+ describe("packaging", () => {
98
+ it("ships locales/ in the npm tarball", () => {
99
+ // Without this the whole feature works perfectly on a dev machine and ships DEAD to every
100
+ // npm user: the catalogs simply are not in the package, so `trFor` finds no file and
101
+ // every language silently renders English. Nothing else would catch it.
102
+ const pkg = JSON.parse(readFileSync(join(import.meta.dirname, "..", "..", "package.json"), "utf8"));
103
+ expect(pkg.files).toContain("locales");
104
+ });
105
+ it("offers exactly the languages ComfyUI ships, so the panel list cannot disagree", () => {
106
+ expect([...LOCALES].sort()).toEqual(["ar", "en", "es", "fa", "fr", "ja", "ko", "pt-BR", "ru", "tr", "zh", "zh-TW"].sort());
107
+ });
108
+ });
109
+ //# sourceMappingURL=i18n.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.test.js","sourceRoot":"","sources":["../../src/i18n/i18n.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,194 @@
1
+ /**
2
+ * Translations for the HUMAN-facing text this process emits.
3
+ *
4
+ * SCOPE — read this before adding a key.
5
+ *
6
+ * Almost everything this repo emits is read by an LLM, not a person: the 89 panel tool
7
+ * definitions, the ~610 `.describe()` parameter docs, `PANEL_SYSTEM_APPEND`, the per-backend
8
+ * system prompts, `src/tools/vocabulary.ts`, `retired-redirect.ts`, and the refusal modules.
9
+ * Those are prompt engineering — their exact English wording is what the model routes on, and
10
+ * `check:vocabulary` gates it in CI. **None of it may be translated.** Doing so degrades
11
+ * model behaviour silently, and no test in this repo would catch it.
12
+ *
13
+ * What belongs here is the ~150 strings a PERSON reads:
14
+ * - the CLI (`renderCliHelp`, the connect/tunnel banners, `setup` output)
15
+ * - the `say` bridge frames that render as chat bubbles in the panel
16
+ * - `ready-banner.ts`, `start-failure-notice.ts`
17
+ * - the two HTML pages in `panel-console-http.ts`
18
+ *
19
+ * TWO AUDIENCES, TWO LOCALES. The CLI writes to a terminal owned by whoever launched the
20
+ * process, so it follows the environment. A `say` frame renders inside a specific panel tab,
21
+ * whose language is that user's own setting — and those strings NAME PANEL CONTROLS
22
+ * ("Settings → OpenRouter"), so they must be in the same language as the control they point
23
+ * at, or the instruction is useless. Hence `tr()` (process locale) and `trFor()` (a given
24
+ * panel's locale) are separate calls rather than one ambient default.
25
+ */
26
+ import { readFileSync, existsSync } from "node:fs";
27
+ import { dirname, join } from "node:path";
28
+ import { fileURLToPath } from "node:url";
29
+ /** Same codes ComfyUI ships, so the panel's language list and ours cannot disagree. */
30
+ export const LOCALES = [
31
+ "en", "zh", "zh-TW", "ru", "ja", "ko", "fr", "es", "pt-BR", "tr", "ar", "fa",
32
+ ];
33
+ const SUPPORTED = new Set(LOCALES);
34
+ /** Resolve arbitrary input to a shipped locale, or null. Mirrors the panel's rules. */
35
+ export function resolveLocale(input) {
36
+ if (!input)
37
+ return null;
38
+ // Env values arrive as "ko_KR.UTF-8" / "pt_BR.utf8" — strip encoding and normalise.
39
+ const raw = String(input).trim().split(".")[0].replace("_", "-");
40
+ if (!raw)
41
+ return null;
42
+ if (SUPPORTED.has(raw))
43
+ return raw;
44
+ // Script matters more than region for Chinese. We ship `zh` (Simplified) and `zh-TW`
45
+ // (Traditional); Hong Kong and Macau write Traditional, so plain base-matching to `zh`
46
+ // would hand those users the wrong script — legible-ish, but visibly wrong, and the kind
47
+ // of thing that reads as "they didn't think about us".
48
+ const TRADITIONAL = /^zh-(HK|MO|Hant)/i;
49
+ if (TRADITIONAL.test(raw))
50
+ return "zh-TW";
51
+ const base = raw.split("-")[0];
52
+ if (SUPPORTED.has(base))
53
+ return base;
54
+ const lower = raw.toLowerCase();
55
+ for (const code of SUPPORTED) {
56
+ if (code.toLowerCase() === lower || code.toLowerCase() === base.toLowerCase())
57
+ return code;
58
+ }
59
+ // Base not shipped standalone but a regional variant is: pt-PT -> pt-BR, zh-HK -> zh-TW.
60
+ for (const code of LOCALES) {
61
+ if (code.toLowerCase().startsWith(`${base.toLowerCase()}-`))
62
+ return code;
63
+ }
64
+ return null;
65
+ }
66
+ /**
67
+ * The locale for terminal output. `--lang` beats the app-specific env var, which beats the
68
+ * POSIX locale chain. Explicit intent wins over ambient configuration at every step.
69
+ */
70
+ export function processLocale(argv = process.argv) {
71
+ const flagIdx = argv.findIndex((a) => a === "--lang" || a.startsWith("--lang="));
72
+ if (flagIdx !== -1) {
73
+ const raw = argv[flagIdx].includes("=") ? argv[flagIdx].split("=")[1] : argv[flagIdx + 1];
74
+ const hit = resolveLocale(raw);
75
+ if (hit)
76
+ return hit;
77
+ }
78
+ for (const env of ["COMFYUI_MCP_LANG", "LC_ALL", "LC_MESSAGES", "LANG"]) {
79
+ const hit = resolveLocale(process.env[env]);
80
+ if (hit)
81
+ return hit;
82
+ }
83
+ return "en";
84
+ }
85
+ /** locale -> flat key map. Loaded lazily and cached; `en` is always empty (fallbacks inline). */
86
+ const catalogs = new Map();
87
+ function localesDir() {
88
+ // Resolves from dist/i18n/ at runtime and src/i18n/ under vitest — walk up to the package
89
+ // root either way rather than assuming which one we are in.
90
+ let dir = dirname(fileURLToPath(import.meta.url));
91
+ for (let i = 0; i < 5; i++) {
92
+ const candidate = join(dir, "locales");
93
+ if (existsSync(candidate))
94
+ return candidate;
95
+ dir = dirname(dir);
96
+ }
97
+ return join(dirname(fileURLToPath(import.meta.url)), "..", "..", "locales");
98
+ }
99
+ function flatten(obj, prefix = "", out = {}) {
100
+ if (!obj || typeof obj !== "object")
101
+ return out;
102
+ for (const [k, v] of Object.entries(obj)) {
103
+ const key = prefix ? `${prefix}.${k}` : k;
104
+ if (v && typeof v === "object" && !Array.isArray(v))
105
+ flatten(v, key, out);
106
+ else if (typeof v === "string")
107
+ out[key] = v;
108
+ }
109
+ return out;
110
+ }
111
+ function catalogFor(locale) {
112
+ const cached = catalogs.get(locale);
113
+ if (cached)
114
+ return cached;
115
+ let loaded = {};
116
+ // English needs no file: every call site carries its English text as the fallback.
117
+ if (locale !== "en") {
118
+ try {
119
+ const p = join(localesDir(), locale, "main.json");
120
+ if (existsSync(p))
121
+ loaded = flatten(JSON.parse(readFileSync(p, "utf8")));
122
+ }
123
+ catch {
124
+ // A malformed or unreadable catalog means English, never a crash. This text is printed
125
+ // during startup and while reporting other failures — it must not be able to add one.
126
+ loaded = {};
127
+ }
128
+ }
129
+ catalogs.set(locale, loaded);
130
+ return loaded;
131
+ }
132
+ const pluralRules = new Map();
133
+ function pluralCategory(locale, n) {
134
+ try {
135
+ let r = pluralRules.get(locale);
136
+ if (!r) {
137
+ r = new Intl.PluralRules(locale);
138
+ pluralRules.set(locale, r);
139
+ }
140
+ return r.select(n);
141
+ }
142
+ catch {
143
+ return n === 1 ? "one" : "other";
144
+ }
145
+ }
146
+ function pickForm(fallback, n) {
147
+ if (typeof fallback === "string")
148
+ return fallback;
149
+ if (!fallback || typeof fallback !== "object")
150
+ return "";
151
+ return fallback[pluralCategory("en", n)] ?? fallback.other ?? Object.values(fallback)[0] ?? "";
152
+ }
153
+ /**
154
+ * Translate for a specific locale.
155
+ *
156
+ * `fallback` is the English source text and stays at the call site, so the code reads as prose
157
+ * and a missing translation degrades to correct English rather than a raw key. Counted strings
158
+ * pass `{ count }` and take an object fallback (`{ one: "…", other: "…" }`); the category comes
159
+ * from `Intl.PluralRules`, which knows that Korean has one form and Russian four.
160
+ */
161
+ export function trFor(locale, key, fallback, vars) {
162
+ const resolved = resolveLocale(locale) ?? "en";
163
+ const cat = catalogFor(resolved);
164
+ let out;
165
+ if (vars && typeof vars.count === "number") {
166
+ const c = pluralCategory(resolved, vars.count);
167
+ out = cat[`${key}_${c}`] ?? cat[`${key}_other`] ?? cat[key];
168
+ if (out === undefined)
169
+ out = pickForm(fallback, vars.count);
170
+ }
171
+ else {
172
+ out = cat[key] ?? (typeof fallback === "string" ? fallback : pickForm(fallback, 0));
173
+ }
174
+ out = out ?? "";
175
+ // ONE pass. A loop of `split(...).join(...)` per variable expands placeholders that appear
176
+ // INSIDE an already-substituted value — a pod named `{id}` would be rewritten by the next
177
+ // variable's turn, destroying the user's own data. A single pass never revisits its output.
178
+ if (vars) {
179
+ out = out.replace(/\{(\w+)\}/g, (whole, name) => Object.prototype.hasOwnProperty.call(vars, name) ? String(vars[name]) : whole);
180
+ }
181
+ return out;
182
+ }
183
+ let cachedProcessLocale = null;
184
+ /** Translate for the TERMINAL — CLI help, banners, startup errors. */
185
+ export function tr(key, fallback, vars) {
186
+ cachedProcessLocale ??= processLocale();
187
+ return trFor(cachedProcessLocale, key, fallback, vars);
188
+ }
189
+ /** Test seam: forget the memoised process locale and every loaded catalog. */
190
+ export function __resetI18nForTest() {
191
+ cachedProcessLocale = null;
192
+ catalogs.clear();
193
+ }
194
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"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"}