@viudes/windsurf-api 0.1.3

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.
@@ -0,0 +1,1106 @@
1
+ {
2
+ "_meta": {
3
+ "name": "English",
4
+ "code": "en"
5
+ },
6
+
7
+ "brand": {
8
+ "sub": "Control Panel"
9
+ },
10
+
11
+ "nav": {
12
+ "group": {
13
+ "overview": "Overview",
14
+ "account": "Accounts",
15
+ "system": "System",
16
+ "about": "About"
17
+ },
18
+ "overview": "Dashboard",
19
+ "stats": "Statistics",
20
+ "windsurf-login": "Account Login",
21
+ "accounts": "Account Pool",
22
+ "bans": "Health Check",
23
+ "models": "Model Control",
24
+ "proxy": "Proxy",
25
+ "logs": "Logs",
26
+ "experimental": "Experimental",
27
+ "credits": "Credits"
28
+ },
29
+
30
+ "page": {
31
+ "overview": "Dashboard",
32
+ "stats": "Statistics",
33
+ "windsurf-login": "Account Login",
34
+ "accounts": "Account Pool",
35
+ "bans": "Health Check",
36
+ "models": "Model Control",
37
+ "proxy": "Proxy Config",
38
+ "logs": "Runtime Logs",
39
+ "experimental": "Experimental Features",
40
+ "credits": "Credits"
41
+ },
42
+
43
+ "pageTitle": {
44
+ "main": "WindsurfAPI bydwgx1337 Control Panel"
45
+ },
46
+
47
+ "pageSubtitle": {
48
+ "overview": "System status and key metrics overview",
49
+ "windsurf-login": "Login to Windsurf via Google / GitHub / Email to get API Key",
50
+ "accounts": "Manage account pool, probe subscription tiers and available models",
51
+ "models": "Configure model access policies, limit available model scope",
52
+ "proxy": "Configure global or per-account exit proxies; each dedicated proxy spawns an independent Language Server instance",
53
+ "logs": "Receive server logs in real-time via SSE streaming",
54
+ "stats": "Request volume, success rate, latency percentiles and account/model dimension stats",
55
+ "bans": "Track error accounts and abnormal status",
56
+ "experimental": "Unstable optimizations; disable anytime if issues occur",
57
+ "credits": "Thanks to contributors who submitted PRs / audited code / reported issues"
58
+ },
59
+
60
+ "button": {
61
+ "cancel": "Cancel",
62
+ "confirm": "Confirm",
63
+ "forceOverride": "Force Overwrite & Update",
64
+ "save": "Save",
65
+ "restart": "Restart",
66
+ "updateAndRestart": "Update and Restart"
67
+ },
68
+
69
+ "action": {
70
+ "checkUpdate": "Check Update",
71
+ "applyUpdate": "Update & Restart",
72
+ "updateLsBinary": "Update LS",
73
+ "restart": "Restart",
74
+ "reset": "Reset",
75
+ "save": "Save",
76
+ "clearPool": "Clear Pool",
77
+ "login": "Login",
78
+ "clear": "Clear",
79
+ "cancel": "Cancel",
80
+ "confirm": "Confirm",
81
+ "delete": "Delete",
82
+ "refresh": "Refresh",
83
+ "runNow": "Run now",
84
+ "probe": "Probe",
85
+ "probeTitle": "Probe capabilities",
86
+ "enable": "Enable",
87
+ "disable": "Disable",
88
+ "copy": "Copy",
89
+ "copyTitle": "Click to copy",
90
+ "configure": "Configure",
91
+ "test": "Test",
92
+ "readClipboard": "Read Clipboard",
93
+ "uploadJson": "Upload JSON",
94
+ "clearFile": "Clear File",
95
+ "batchImport": "Batch Import & Login",
96
+ "paste": "Paste",
97
+ "add": "Add",
98
+ "close": "Close",
99
+ "edit": "Edit",
100
+ "selectAll": "Select All",
101
+ "selectNone": "Select None",
102
+ "invert": "Invert",
103
+ "showPassword": "Show/Hide Password",
104
+ "revealKey": "Click to reveal and copy full API key",
105
+ "importLocal": "Import from local Windsurf"
106
+ },
107
+
108
+ "status": {
109
+ "active": "Active",
110
+ "disabled": "Disabled",
111
+ "error": "Error",
112
+ "running": "Running",
113
+ "stopped": "Stopped",
114
+ "success": "Success",
115
+ "failed": "Failed",
116
+ "pending": "Pending",
117
+ "unknown": "Unknown",
118
+ "rateLimited": "Rate Limited",
119
+ "loading": "Loading...",
120
+ "saving": "Saving...",
121
+ "testing": "Testing...",
122
+ "updateAndRestartHint": "Update and restart the service",
123
+ "proxySuccess": "✓ Connected. Egress IP {{ip}} · {{latency}}ms",
124
+ "proxyFailed": "✗ Failed: {{error}} · {{latency}}ms",
125
+ "checkingUpdate": "Checking for updates...",
126
+ "updateAvailable": "Update available",
127
+ "currentVersion": "Current:",
128
+ "remoteVersion": "Remote:",
129
+ "upToDate": "✓ Up to date ({{commit}}) · {{message}}",
130
+ "pullingRestarting": "Pulling + restarting...",
131
+ "cancelled": "Cancelled",
132
+ "noUpdateNeeded": "Already up to date, no update needed",
133
+ "updateComplete": "Update complete {{before}} → {{after}}",
134
+ "restarting": "Service restarting in background, page will auto-refresh in ~8 seconds...",
135
+ "notGitRepo": "Not a git repository",
136
+ "notGitRepoHint": "Ensure .git directory is present for one-click updates",
137
+ "selfUpdateUnavailable": "One-click update is unavailable in this deployment",
138
+ "selfUpdateDockerHint": "Run docker compose pull && docker compose up -d on the host to update. To enable in-dashboard one-click updates for Docker deployments, mount /var/run/docker.sock into the windsurf-api service in docker-compose.yml (note: this grants the container host-root privileges; assess the security tradeoff first).",
139
+ "dockerSelfUpdateBlocked": "Dashboard docker update currently blocked: {{reason}} {{detail}}",
140
+ "dockerReady": "Docker self-update ready",
141
+ "dockerImage": "Image:",
142
+ "dockerProject": "Compose project:",
143
+ "dockerUpdating": "Update started: pulling {{image}}; deployer sidecar will recreate the container in ~{{delay}}s…",
144
+ "dockerSidecarStarted": "Deployer container {{id}} started; this page will auto-refresh",
145
+ "workingDirDirty": "Working directory has local changes",
146
+ "workingDirDirtyHint": "The following files have local changes:<br>{{files}}<br>Continue will overwrite with remote version.",
147
+ "notFetched": "Not fetched",
148
+ "fetchFailed": "Fetch failed",
149
+ "clickToEditTier": "Click to manually edit tier (use when probe fails)"
150
+ },
151
+
152
+ "tier": {
153
+ "pro": "PRO",
154
+ "free": "FREE",
155
+ "expired": "Expired",
156
+ "unknown": "Unknown",
157
+ "expiredLabel": "Expired"
158
+ },
159
+
160
+ "creditsBar": {
161
+ "daily": "Daily Quota",
162
+ "weekly": "Weekly Quota",
163
+ "monthly": "Monthly Quota",
164
+ "prompt": "Prompt Credits",
165
+ "dailyShort": "D",
166
+ "weeklyShort": "W",
167
+ "promptShort": "P",
168
+ "columnTitle": "Quota Usage",
169
+ "columnTooltip": "Two bars indicate:\nD — Daily premium-request remaining %\nW — Weekly premium-request remaining % (main signal for Trial accounts)\n\nHigher = more left = safer\nHover each bar for reset time",
170
+ "dailyDetail": "Daily {{pct}}% remaining (resets {{reset}})",
171
+ "weeklyDetail": "Weekly {{pct}}% remaining (resets {{reset}})",
172
+ "promptDetail": "Prompt credits {{remain}} / {{limit}} remaining ({{pct}}%)",
173
+ "dailyNA": "Windsurf returned no daily-quota data",
174
+ "weeklyNA": "Windsurf returned no weekly-quota data",
175
+ "promptNA": "No prompt-credit data for this account",
176
+ "noResetTime": "reset time unknown"
177
+ },
178
+
179
+ "section": {
180
+ "banStatus": {
181
+ "title": "Health Status"
182
+ },
183
+ "lsStatus": {
184
+ "title": "Language Server",
185
+ "desc": "Language Server instance status"
186
+ },
187
+ "oauthLogin": {
188
+ "title": "Quick Login (Recommended)",
189
+ "desc": "Login to Windsurf directly with your Google or GitHub account — no password needed"
190
+ },
191
+ "emailLogin": {
192
+ "title": "Email & Password Login",
193
+ "desc": "For accounts registered with email+password only. Third-party login please use buttons above. Supports single login or batch import in \"[proxy] email password\" format."
194
+ },
195
+ "loginProxy": {
196
+ "title": "Login Proxy (Optional)",
197
+ "desc": "Specify a proxy for this login session; leave empty to use global proxy. When proxy takes effect, subsequent chat requests will also egress through this proxy."
198
+ },
199
+ "loginHistory": {
200
+ "title": "Login History",
201
+ "desc": "Local record of last 50 login operations"
202
+ },
203
+ "addAccount": {
204
+ "title": "Add Account",
205
+ "desc": "Supports both API Key and Auth Token methods",
206
+ "hint": "Recommended: Use Token method. Visit {{link}} after logging in, copy the Token and paste below. Works with all login methods (Email/Google/GitHub)."
207
+ },
208
+ "accountList": {
209
+ "title": "Account List",
210
+ "desc": "Click probe button to update capability info for a specific account"
211
+ },
212
+ "modelPolicy": {
213
+ "title": "Access Policy",
214
+ "desc": "Choose \"Allow All\" for no restrictions; \"Allowlist\" only permits listed models; \"Blocklist\" blocks listed models"
215
+ },
216
+ "modelList": {
217
+ "title": "Model List",
218
+ "titleAllow": "Allowed Models",
219
+ "titleBlock": "Blocked Models",
220
+ "descAllow": "Only selected models are allowed; unselected models return 403 error",
221
+ "descBlock": "Selected models will be blocked; unselected models work normally",
222
+ "search": "Search models...",
223
+ "provider": "Provider"
224
+ },
225
+ "globalProxy": {
226
+ "title": "Global Proxy",
227
+ "desc": "Accounts without dedicated proxy will use this configuration"
228
+ },
229
+ "accountProxy": {
230
+ "title": "Per-Account Proxy",
231
+ "desc": "Set dedicated proxy for specific accounts; each dedicated proxy spawns an independent LS instance"
232
+ },
233
+ "identityInjection": {
234
+ "title": "Model Identity Injection",
235
+ "desc": "When enabled, injects a system prompt at the start of each request, overriding Cascade's built-in Windsurf identity; each provider's template below can be customized and takes effect immediately after saving."
236
+ },
237
+ "cascadeReuse": {
238
+ "title": "Cascade Conversation Reuse",
239
+ "desc": "Reuse the same cascade_id across multi-turn conversations, only sending the latest user message to Windsurf. Let the server maintain context cache. Significantly reduces TTFB and upload volume on cache hits; automatically falls back to new session on cache miss or account/LS change. Requires client to retain full history and append in order (e.g., new-api, OpenWebUI). Note: this toggle only governs cascade_id reuse across requests — it does NOT control whether Cascade is used. Tool-emulated requests (Claude Code / Cline / Cursor) auto-skip reuse because each turn's content changes, regardless of this setting.",
240
+ "enable": "Enable Cascade Conversation Reuse",
241
+ "hint": "Enabled by default. When disabled, Cascade is still used but a fresh session is created per turn. Takes effect immediately on current conversation pool."
242
+ },
243
+ "identityPrompt": {
244
+ "title": "Model Identity Prompt",
245
+ "desc": "Inject model identity system prompt at the start of each request.",
246
+ "enable": "Enable Model Identity Injection",
247
+ "hint": "Enabled by default; templates below won't work when disabled.",
248
+ "templateHint": "Each provider's template is editable. {{model}} placeholder will be replaced with the requested model name."
249
+ },
250
+ "systemPrompts": {
251
+ "title": "System Prompts",
252
+ "desc": "Tool injection, conversation mode and other built-in prompt templates. Changes take effect immediately; click \"Reset\" to restore defaults."
253
+ },
254
+ "credentials": {
255
+ "title": "Credentials",
256
+ "desc": "Rotate API_KEY and the dashboard password at runtime. Saved into runtime-config.json and applied immediately — no container restart or .env reload needed. Next request must use the new value; the current session will be asked to re-login."
257
+ },
258
+ "quietWindow": {
259
+ "title": "Auto-update on quiet window",
260
+ "desc": "Watches per-minute request rate; if it stays at or below the threshold for the full window, auto-runs `docker compose pull && up -d`. 10-min cold-start grace; 24h cooldown after success; failure doesn't trigger cooldown. Requires /var/run/docker.sock mounted into the container (default docker-compose already does).",
261
+ "enable": "Enable quiet-window auto-update",
262
+ "hint": "Off by default. Current status: "
263
+ },
264
+ "stickyByUser": {
265
+ "title": "Sticky session per-user binding",
266
+ "desc": "When enabled, the same user is always bound to the same upstream account regardless of model. When off, binding uses (user, model) pairs — different models may land on different accounts (useful when accounts have model-specific restrictions). Requires STICKY_SESSION_ENABLED=1.",
267
+ "enable": "Ignore model dimension",
268
+ "hint": "Off by default. When on, user_a's opus/haiku/gemini all share a single binding."
269
+ },
270
+ "stickyNoFallback": {
271
+ "title": "Sticky session no-fallback",
272
+ "desc": "When enabled, if the account bound by sticky session hits a rate limit, error, or model unavailability, the proxy will NOT fall back to another account in the pool — the error is returned directly to the client. This ensures each user strictly consumes only their bound account's quota. Requires STICKY_SESSION_ENABLED=1.",
273
+ "enable": "Disable account fallback",
274
+ "hint": "Off by default. When on, a bound account failure won't consume other accounts' quota."
275
+ },
276
+ "droughtRestrict": {
277
+ "title": "Block premium models during drought",
278
+ "desc": "When every active account is below 5% weekly quota, premium model requests (claude-opus / claude-sonnet etc.) are refused with a clean 503 instead of burning the last bit of quota on an upstream 429. Free-tier models (gemini-2.5-flash etc.) still go through. Disable to forward premium requests anyway and accept the upstream rate-limit.",
279
+ "enable": "Enable drought-mode premium block",
280
+ "hint": "Default ON. Drought state is auto-detected from the account pool (GET /dashboard/api/drought for live state)."
281
+ },
282
+ "skin": {
283
+ "title": "Interface Style",
284
+ "desc": "Dashboard appearance. Modern is the default; sketch is an experimental simplified layout. The page refreshes after switching."
285
+ },
286
+ "lsPool": {
287
+ "title": "Language Server Pool",
288
+ "desc": "{{count}} LS instances · one process per dedicated proxy",
289
+ "sectionTitle": "Language Server Pool",
290
+ "sectionDesc": "Dedicated Language Server instances per proxy",
291
+ "port": "Port",
292
+ "defaultInstance": "Default Instance",
293
+ "noProxy": "No proxy"
294
+ },
295
+ "modelStats": {
296
+ "title": "Model Usage Statistics",
297
+ "desc": "Aggregated by model: requests, success count, error count, success rate, avg duration and p50/p95 latency percentiles"
298
+ },
299
+ "accountStats": {
300
+ "title": "Account Dimension Statistics",
301
+ "desc": "Request volume and success rate per account ID (first 8 chars)"
302
+ },
303
+ "accountHealth": {
304
+ "title": "Account Health Status"
305
+ },
306
+ "requestChart": {
307
+ "title": "Request Volume Time Series",
308
+ "subtitle": "Switch chart type and time range · hover for exact values",
309
+ "typeArea": "Area",
310
+ "typeLine": "Line",
311
+ "typeBar": "Bar",
312
+ "typeStacked": "Stacked",
313
+ "metricAll": "All Metrics",
314
+ "metricRequests": "Requests",
315
+ "metricErrors": "Errors",
316
+ "metricSuccess": "Success",
317
+ "legendRequests": "Requests",
318
+ "legendSuccess": "Success",
319
+ "legendErrors": "Errors",
320
+ "tooltipTime": "Time",
321
+ "tooltipRequests": "Requests",
322
+ "tooltipErrors": "Errors",
323
+ "tooltipSuccess": "Success",
324
+ "tooltipRate": "Success Rate"
325
+ },
326
+ "modelPie": {
327
+ "title": "Model Request Distribution",
328
+ "desc": "Share of requests for top 8 models"
329
+ }
330
+ },
331
+
332
+ "help": {
333
+ "token": "Recommended: Use Token method. Visit {{link}} after logging in, copy the Token and paste below. Works with all login methods (Email/Google/GitHub).",
334
+ "tokenGuide": "Recommended: Use Token method. Visit ",
335
+ "tokenGuideEnd": " after logging in, copy the Token and paste below. Works with all login methods (Email/Google/GitHub)."
336
+ },
337
+
338
+ "skin": {
339
+ "modern": "Modern",
340
+ "sketch": "Sketch (Experimental)",
341
+ "hint": "Saved to cookie and refreshed immediately"
342
+ },
343
+
344
+ "field": {
345
+ "email": {
346
+ "label": "Email",
347
+ "placeholder": "your-email@example.com"
348
+ },
349
+ "password": {
350
+ "label": "Password",
351
+ "placeholder": "••••••••"
352
+ },
353
+ "type": {
354
+ "label": "Type"
355
+ },
356
+ "tier": {
357
+ "label": "Tier"
358
+ },
359
+ "provider": {
360
+ "label": "Provider",
361
+ "all": "All Providers"
362
+ },
363
+ "searchModel": {
364
+ "label": "Search Model",
365
+ "placeholder": "Enter model name to filter..."
366
+ },
367
+ "defaultModel": {
368
+ "label": "Default Model",
369
+ "placeholder": "Leave blank to reject out-of-list requests",
370
+ "hint": "Requests for a model outside the list use this model instead of being rejected. Leave blank to reject (default)."
371
+ },
372
+ "proxyUser": {
373
+ "placeholder": "Proxy auth username"
374
+ },
375
+ "proxyPass": {
376
+ "placeholder": "Proxy auth password"
377
+ },
378
+ "searchProvider": {
379
+ "placeholder": "Search providers..."
380
+ },
381
+ "host": {
382
+ "label": "Host",
383
+ "placeholder": "proxy.example.com"
384
+ },
385
+ "port": {
386
+ "label": "Port",
387
+ "placeholder": "8080"
388
+ },
389
+ "username": {
390
+ "label": "Username",
391
+ "placeholder": "Optional"
392
+ },
393
+ "passwordProxy": {
394
+ "label": "Password",
395
+ "placeholder": "Optional"
396
+ },
397
+ "key": {
398
+ "label": "Key / Token",
399
+ "placeholder": "Paste Auth Token (from windsurf.com/show-auth-token)"
400
+ },
401
+ "label": {
402
+ "label": "Label",
403
+ "placeholder": "Optional"
404
+ },
405
+ "proxy": {
406
+ "label": "Proxy",
407
+ "placeholder": "http://proxy:8080 or socks5://user:pass@host:port (optional)",
408
+ "hint": "Leave empty to use global proxy settings"
409
+ },
410
+ "batchInput": {
411
+ "label": "Batch Import",
412
+ "hint": "One account per line. Supports: email password, email----password, email|password, email,password, email:password. JSON file upload is also supported. Optional proxy format: [proxy] email password."
413
+ },
414
+ "proxyType": {
415
+ "label": "Type"
416
+ },
417
+ "proxyHost": {
418
+ "label": "Host",
419
+ "placeholder": "Leave empty = use global"
420
+ },
421
+ "providerFilter": {
422
+ "label": "Provider"
423
+ },
424
+ "logLevel": {
425
+ "label": "Log Level"
426
+ },
427
+ "identitySearch": {
428
+ "placeholder": "Search providers..."
429
+ },
430
+ "search": {
431
+ "label": "Search",
432
+ "placeholder": "Search..."
433
+ },
434
+ "autoScroll": "Auto-scroll",
435
+ "autoAdd": "Auto-add to pool after login"
436
+ },
437
+
438
+ "table": {
439
+ "header": {
440
+ "time": "Time",
441
+ "email": "Email",
442
+ "status": "Status",
443
+ "proxy": "Proxy",
444
+ "action": "Action",
445
+ "id": "ID",
446
+ "label": "Label",
447
+ "tier": "Tier",
448
+ "rpm": "RPM",
449
+ "credits": "Credits",
450
+ "models": "Available Models",
451
+ "error": "Error",
452
+ "lastUsed": "Last Used",
453
+ "key": "Key",
454
+ "accountId": "Account ID",
455
+ "account": "Account",
456
+ "requests": "Requests",
457
+ "success": "Success",
458
+ "errors": "Errors",
459
+ "successRate": "Success Rate",
460
+ "avg": "Avg",
461
+ "p50": "p50",
462
+ "p95": "p95",
463
+ "errorCount": "Error Count",
464
+ "model": "Model",
465
+ "note": "Note"
466
+ },
467
+ "empty": {
468
+ "loginHistory": "No login records",
469
+ "accounts": "No accounts yet, please add one first",
470
+ "accountsProxy": "No accounts",
471
+ "modelStats": "No model statistics available",
472
+ "accountStats": "No account statistics available",
473
+ "banList": "No abnormal accounts",
474
+ "models": "No matching models",
475
+ "credits": "Loading...",
476
+ "accountNotFound": "Account not found",
477
+ "noValidAccounts": "No valid accounts available for routing",
478
+ "probeFailed": "Probe failed",
479
+ "noRequestData": "No request data",
480
+ "noAccountRequestData": "No account-level request data",
481
+ "noData": "No data"
482
+ }
483
+ },
484
+
485
+ "card": {
486
+ "activeAccounts": {
487
+ "title": "Active Accounts",
488
+ "subtitle": "{{total}} total · {{error}} abnormal"
489
+ },
490
+ "totalRequests": {
491
+ "title": "Total Requests",
492
+ "subtitle": "{{rate}}% success rate"
493
+ },
494
+ "uptime": {
495
+ "title": "Uptime",
496
+ "subtitle": "Started at {{time}}"
497
+ },
498
+ "languageServer": {
499
+ "title": "Language Server",
500
+ "running": "Running",
501
+ "stopped": "Stopped",
502
+ "subtitle": "{{count}} instances · Port {{port}}"
503
+ },
504
+ "responseCache": {
505
+ "title": "Response Cache",
506
+ "subtitle": "{{hits}} hit / {{misses}} miss · {{size}}/{{max}} entries"
507
+ },
508
+ "tokens": {
509
+ "title": "Token usage breakdown",
510
+ "subtitle": {
511
+ "empty": "no usage data yet"
512
+ }
513
+ },
514
+ "banStats": {
515
+ "title": "Health Overview"
516
+ },
517
+ "abnormalAccounts": {
518
+ "title": "Abnormal Accounts",
519
+ "subtitle": "Total {{count}} accounts"
520
+ },
521
+ "disabled": {
522
+ "title": "Disabled",
523
+ "subtitle": "Auto-disabled due to errors"
524
+ },
525
+ "rateLimit": {
526
+ "title": "Rate Limited",
527
+ "badge": "Rate Limited",
528
+ "subtitle": "Temporarily excluded from scheduling"
529
+ },
530
+ "stats": {
531
+ "title": "Total Requests",
532
+ "subtitle": "Running {{time}}"
533
+ },
534
+ "success": {
535
+ "title": "Success",
536
+ "subtitle": "{{rate}}% success rate"
537
+ },
538
+ "errors": {
539
+ "title": "Errors",
540
+ "subtitle": "{{rate}}% failure rate"
541
+ },
542
+ "p95Latency": {
543
+ "title": "Avg p95 Latency",
544
+ "subtitle": "{{count}} models"
545
+ },
546
+ "hitRate": {
547
+ "title": "Hit Rate",
548
+ "subtitle": "{{hits}} hit / {{misses}} miss"
549
+ },
550
+ "poolSize": {
551
+ "title": "Pool Size",
552
+ "subtitle": "Max {{max}} · TTL {{ttl}} min"
553
+ },
554
+ "stores": {
555
+ "title": "Stores",
556
+ "subtitle": "Expired {{expired}} · Evicted {{evicted}}"
557
+ },
558
+ "defaultInstance": "Default Instance",
559
+ "noProxy": "No proxy",
560
+ "restarts": "restarts",
561
+ "custom": "Customized"
562
+ },
563
+
564
+ "login": {
565
+ "title": "Control Panel Login",
566
+ "subtitle": "Please enter the admin password to continue",
567
+ "passwordPlaceholder": "Dashboard Password",
568
+ "lockedTitle": "Dashboard locked",
569
+ "lockedDesc": "Server bound to public host without <code>DASHBOARD_PASSWORD</code>. v2.0.55 fail-closed: API_KEY no longer doubles as the dashboard password.",
570
+ "lockedFix": "Fix:",
571
+ "lockedDocs": "See",
572
+ "button": "Login",
573
+ "checking": "Checking…",
574
+ "wrong": "Wrong password",
575
+ "empty": "Password required",
576
+ "locked": "Backend has no password configured — set DASHBOARD_PASSWORD or API_KEY env and restart",
577
+ "networkError": "Cannot reach server"
578
+ },
579
+
580
+ "range": {
581
+ "6h": "6h",
582
+ "24h": "24h",
583
+ "72h": "72h",
584
+ "7d": "7d",
585
+ "30d": "30d",
586
+ "all": "All",
587
+ "custom": "Custom",
588
+ "customTitle": "Custom Date Range",
589
+ "customStart": "Start Date",
590
+ "customEnd": "End Date",
591
+ "customApply": "Apply",
592
+ "customCancel": "Cancel",
593
+ "customHint": "Showing up to last 30 days"
594
+ },
595
+
596
+ "credits": {
597
+ "contributors": "Core Contributors",
598
+ "history": "Contributions · {{count}}",
599
+ "contributionDetails": "Details",
600
+ "cta": {
601
+ "title": "Want to join this list?",
602
+ "desc": "Open an issue or pull request on GitHub — bug fixes, new models, UI improvements, or security findings all get recognised here.",
603
+ "issue": "Open Issue",
604
+ "pr": "Open PR"
605
+ }
606
+ },
607
+
608
+ "experimental": {
609
+ "enable": "Enable",
610
+ "disable": "Disable",
611
+ "cascadeReuse": {
612
+ "title": "Enable Cascade Conversation Reuse",
613
+ "desc": "Disabled by default. When enabled, takes effect immediately on current conversation pool.",
614
+ "enable": "Enable Cascade Conversation Reuse",
615
+ "hint": "Disabled by default. When enabled, takes effect immediately on current conversation pool."
616
+ },
617
+ "identityPrompt": {
618
+ "title": "Enable Model Identity Injection",
619
+ "desc": "Enabled by default; templates below won't work when disabled."
620
+ },
621
+ "templateHint": "Each provider's template is editable. {{model}} placeholder will be replaced with the requested model name (e.g., claude-opus-4.6).",
622
+ "clearPool": "Clear Conversation Pool",
623
+ "refresh": "Refresh",
624
+ "noMatch": "No matches",
625
+ "restoreDefault": "Restore Default",
626
+ "save": "Save",
627
+ "default": "Default",
628
+ "toolReinforcement": "Tool Call Format Guide",
629
+ "communicationWithTools": "Communication with Tools",
630
+ "communicationNoTools": "Communication without Tools",
631
+ "promptEmpty": "Template cannot be empty",
632
+ "missingPlaceholder": "Missing {model} placeholder",
633
+ "missingPlaceholderDesc": "After saving, the provider's model name won't be replaced in the prompt. Continue?",
634
+ "restored": "restored"
635
+ },
636
+
637
+ "drought": {
638
+ "title": "Quota drought:",
639
+ "body": "Every active account is below the weekly quota threshold — add accounts or wait for reset"
640
+ },
641
+
642
+ "credentials": {
643
+ "apiKey": "API_KEY",
644
+ "dashboardPassword": "Dashboard Password",
645
+ "apiKeyPlaceholder": "New API_KEY (≥ 8 chars; leave blank to clear runtime override)",
646
+ "dashboardPwPlaceholder": "New dashboard password (≥ 8 chars; leave blank to clear runtime override)",
647
+ "show": "Show / Hide",
648
+ "save": "Save",
649
+ "saved": "Saved",
650
+ "set": "set",
651
+ "unset": "unset",
652
+ "apiKeyHint": "After saving, every chat client must use the new KEY; the old KEY stops working immediately.",
653
+ "dashboardPwHint": "Stored as a scrypt hash; the current session will be signed out and you'll need to log in again with the new password.",
654
+ "bruteForceHint": "Brute-force guard: same IP gets locked for 30 minutes after 5 failed dashboard logins (since v2.0.56).",
655
+ "confirmSave": "After saving, the old value stops working immediately. Continue?",
656
+ "confirmClear": "Clear the runtime override and fall back to the .env value?"
657
+ },
658
+
659
+ "confirm": {
660
+ "restartTitle": "Restart Language Server",
661
+ "restartDesc": "In-progress requests will fail. Continue?",
662
+ "updateLsTitle": "Update LS Binary",
663
+ "updateLsDesc": "Download the latest language_server from the WindsurfAPI / Windsurf desktop LS / Exafunction GitHub release and restart the LS pool. In-flight requests will fail once.",
664
+ "updateLsButton": "Update",
665
+ "restoreDefaultDesc": "restore to default?",
666
+ "clearPoolDesc": "All active Cascade sessions will be cleared. Continue?"
667
+ },
668
+
669
+ "modal": {
670
+ "blockedModels": {
671
+ "title": "Edit Available Models — {{email}}",
672
+ "hint": "Checked = available; Uncheck = disabled for this account",
673
+ "enabled": "Enabled",
674
+ "saved": "Saved: enabled {{enabled}} / disabled {{disabled}}",
675
+ "saving": "Saving...",
676
+ "total": "Total"
677
+ },
678
+ "restartLS": {
679
+ "title": "Restart Language Server",
680
+ "desc": "In-progress requests will fail. Continue?"
681
+ },
682
+ "deleteAccount": {
683
+ "title": "Delete Account",
684
+ "desc": "This action cannot be undone. Delete this account?"
685
+ },
686
+ "resetStats": {
687
+ "title": "Reset Statistics",
688
+ "desc": "Clear all statistics data?"
689
+ },
690
+ "overrideTier": {
691
+ "title": "Manually Set Account Tier",
692
+ "desc": "Current: {{current}}. The proxy routes by Windsurf's upstream cascade_allowed_models_config (per-account — free accounts often include GLM / SWE / Kimi etc.). When the Pro trial mis-detects (issue #8), manually set to pro to force-unlock every model.",
693
+ "options": {
694
+ "pro": "Pro (force-unlock all models)",
695
+ "free": "Free (route by upstream allowlist)",
696
+ "unknown": "Unknown (let system re-evaluate)"
697
+ }
698
+ },
699
+ "applyUpdate": {
700
+ "title": "Update & Restart",
701
+ "desc": "Will execute git pull and restart PM2. Dashboard will be briefly unavailable during restart (about 5-10 seconds). Continue?"
702
+ },
703
+ "dirtyWorktree": {
704
+ "title": "Local Changes in Working Directory",
705
+ "desc": "The following files have been modified but not committed:<br><br><code>{{files}}</code><br>Continuing will overwrite local changes with remote version. For non-git deployments (SFTP / zip), click force overwrite.",
706
+ "forceUpdate": "Force Overwrite & Update"
707
+ },
708
+ "configureProxy": {
709
+ "title": "Configure Account Proxy",
710
+ "desc": "Set dedicated proxy for account {{label}}"
711
+ }
712
+ },
713
+
714
+ "oauth": {
715
+ "tryAnotherWay": "Try Another Way",
716
+ "google": "Google Login",
717
+ "github": "GitHub Login",
718
+ "copyAuthToken": "Copy Auth Token",
719
+ "pasteToken": "Paste Token in Account Management",
720
+ "inlineTokenTitle": "Or paste Auth Token directly (recommended for OAuth-only accounts)",
721
+ "inlineTokenDesc": "Click the left button to open windsurf.com in a new tab → sign in with Google/GitHub → page shows Auth Token → copy and paste into the input on the right → click Add",
722
+ "openWindsurfToken": "Open windsurf.com for Token",
723
+ "tokenPlaceholder": "Paste Auth Token...",
724
+ "addWithToken": "Add via Token",
725
+ "status": {
726
+ "loading": "Logging in via {{provider}}...",
727
+ "success": "Login successful! {{email}} added to pool",
728
+ "codeium": "{{provider}} auth successful, registering with Codeium...",
729
+ "firebaseError": "Firebase SDK failed to load, please refresh and retry",
730
+ "loggingIn": "Logging in via {{label}}...",
731
+ "codeiumRegistering": "{{label}} auth success, registering Codeium...",
732
+ "loginSuccess": "Login successful {{email}} added to pool",
733
+ "loginFailed": "{{label}} login failed: {{error}}",
734
+ "originBlocked": "{{label}} OAuth is blocked for this dashboard origin by Firebase. Use Auth Token from windsurf.com/show-auth-token and add it in Account Management."
735
+ }
736
+ },
737
+
738
+ "update": {
739
+ "checking": "Checking for updates...",
740
+ "newVersion": "New version found",
741
+ "current": "Current",
742
+ "remote": "Remote",
743
+ "latest": "Already up to date",
744
+ "applying": "Pulling + restarting...",
745
+ "complete": "Update complete",
746
+ "restarting": "Service restarting in background, page will auto-refresh in ~8 seconds...",
747
+ "cancelled": "Cancelled",
748
+ "notGit": "Not a git deployment — one-click update unavailable",
749
+ "notGitDesc": "If you deployed via git clone, ensure .git directory is with WindsurfAPI source. For SFTP / zip uploads, manually replace files and pm2 restart.",
750
+ "upToDate": "Already up to date, no update needed"
751
+ },
752
+
753
+ "proxy": {
754
+ "test": {
755
+ "button": "Test Proxy",
756
+ "result": "Result"
757
+ },
758
+ "none": "None (use global)",
759
+ "direct": "Direct",
760
+ "global": "Global",
761
+ "current": "Current",
762
+ "notConfigured": "No global proxy configured",
763
+ "placeholderSaved": "Saved (leave empty to keep)",
764
+ "placeholderPassword": "Proxy auth password",
765
+ "auth": "Auth"
766
+ },
767
+
768
+ "localImport": {
769
+ "scanning": "Scanning local Windsurf client…",
770
+ "empty": "No logged-in local Windsurf credentials found",
771
+ "scannedPaths": "Scanned paths",
772
+ "found": "credential(s)",
773
+ "foundCount": "Found {{count}} local account(s) — review and click Import",
774
+ "account": "Account",
775
+ "key": "API Key",
776
+ "source": "Source",
777
+ "importBtn": "Import",
778
+ "importSuccess": "Imported {{email}}",
779
+ "unavailable": "Available only on localhost deployments — \"local Windsurf\" on a remote server belongs to someone else's machine, not yours."
780
+ },
781
+
782
+ "account": {
783
+ "addSuccess": "Account added",
784
+ "deleteSuccess": "Account deleted",
785
+ "enableSuccess": "Account enabled",
786
+ "disableSuccess": "Account disabled",
787
+ "resetErrors": "Errors reset",
788
+ "tierSet": "Tier set to {{tier}}",
789
+ "editModels": "Edit available models",
790
+ "probe": {
791
+ "doing": "Probing, takes about 10-30 seconds...",
792
+ "complete": "Probe complete: {{result}}",
793
+ "allDoing": "Probing all accounts, takes 1-3 minutes depending on count...",
794
+ "allComplete": "Probe complete: {{summary}}",
795
+ "probeAllComplete": "Probe complete: {{summary}}",
796
+ "probeComplete": "Probe complete: {{tier}}"
797
+ },
798
+ "credits": {
799
+ "refreshTitle": "Refresh credits",
800
+ "refreshed": "Credits refreshed",
801
+ "refreshFailed": "Refresh failed",
802
+ "allRefreshed": "All account credits refreshed: {{ok}} success / {{fail}} failed",
803
+ "refreshing": "Refreshing all account credits...",
804
+ "refreshingAll": "Refreshing all account credits..."
805
+ },
806
+ "ls": {
807
+ "restarting": "Language Server restarting..."
808
+ },
809
+ "detail": {
810
+ "toggle": "Expand / collapse details",
811
+ "ago": "ago",
812
+ "resetAt": "resets",
813
+ "creditPerCall": "Credits charged per call",
814
+ "creditUnit": "",
815
+ "plan": {
816
+ "title": "Subscription",
817
+ "name": "Plan",
818
+ "tier": "Tier",
819
+ "start": "Start",
820
+ "end": "End",
821
+ "overage": "Overage balance"
822
+ },
823
+ "quota": {
824
+ "title": "Quota Usage",
825
+ "daily": "Daily",
826
+ "weekly": "Weekly",
827
+ "promptCredits": "Prompt credits",
828
+ "flexCredits": "Flex credits",
829
+ "used": "used",
830
+ "fetchedAt": "Fetched",
831
+ "notApplicable": "Not applicable to this plan"
832
+ },
833
+ "models": {
834
+ "title": "Available Models",
835
+ "available": "available",
836
+ "blocked": "blocked"
837
+ },
838
+ "runtime": {
839
+ "title": "Runtime",
840
+ "status": "Status",
841
+ "errors": "Errors",
842
+ "rpm": "RPM",
843
+ "lastUsed": "Last used",
844
+ "lastProbed": "Last probed",
845
+ "creditsFetched": "Credits refreshed",
846
+ "accountId": "Account ID",
847
+ "apiKey": "API Key",
848
+ "lastError": "Last error"
849
+ }
850
+ }
851
+ },
852
+
853
+ "batch": {
854
+ "pasteFirst": "Please paste batch accounts first",
855
+ "importing": "Importing...",
856
+ "importingDesc": "{{count}} lines, please wait",
857
+ "importingFile": "Importing file {{name}}",
858
+ "complete": "Batch import complete",
859
+ "importFailed": "Batch import failed",
860
+ "importComplete": "Batch import complete: success {{success}} / skipped {{skipped}} / failed {{fail}}",
861
+ "success": "Success",
862
+ "skipped": "Skipped",
863
+ "fail": "Fail",
864
+ "formatError": "Line {{line}} format error",
865
+ "fileNone": "No JSON file selected",
866
+ "fileLoaded": "Selected file: {{name}}",
867
+ "fileReadFailed": "Failed to read file: {{error}}"
868
+ },
869
+
870
+ "quietWindow": {
871
+ "status": {
872
+ "disabled": "disabled",
873
+ "coldStart": "cold-start grace",
874
+ "cooldown": "cooldown",
875
+ "busy": "busy",
876
+ "eligible": "quiet · eligible"
877
+ },
878
+ "never": "never",
879
+ "lastUpdate": "last update",
880
+ "loadFailed": "load failed",
881
+ "triggered": "triggered",
882
+ "triggerFailed": "trigger failed"
883
+ },
884
+
885
+ "toast": {
886
+ "copied": "Copied",
887
+ "saved": "Saved",
888
+ "cleared": "Cleared",
889
+ "refresh": "Refresh",
890
+ "error": "Error",
891
+ "loading": "Loading...",
892
+ "exportOk": "Downloaded {{filename}}",
893
+ "exportFailed": "Export failed",
894
+ "enterHostPort": "Please enter host and port first",
895
+ "experimentalEnabled": "Experimental feature enabled",
896
+ "experimentalDisabled": "Experimental feature disabled",
897
+ "toggleFailed": "Toggle failed: {{error}}",
898
+ "modeUpdated": "Mode updated",
899
+ "defaultModelUpdated": "Default model updated",
900
+ "noTierModels": "No models available for this account tier",
901
+ "loginSuccess": "{{label}} login successful",
902
+ "loginFailed": "{{label}} login failed: {{error}}",
903
+ "loginSuccessAdded": "Login successful, account added to pool",
904
+ "clipboardRead": "Clipboard read",
905
+ "clipboardEmpty": "Clipboard is empty",
906
+ "clipboardUnsupported": "Current environment doesn't support auto clipboard read, please paste manually",
907
+ "clipboardError": "Failed to read clipboard: {{error}}",
908
+ "apiKeyCopied": "API Key copied",
909
+ "copyFailed": "Copy failed, please select manually",
910
+ "copyFailedError": "Copy failed: {{error}}",
911
+ "enterEmailPassword": "Please enter email and password",
912
+ "restarting": "Language Server restarting...",
913
+ "lsBinaryUpdating": "Updating LS binary…",
914
+ "lsBinaryUpdated": "LS binary updated ({{before}} → {{after}}), restarted {{count}} instance(s)",
915
+ "lsBinaryUpdatedColdPool": "LS binary updated ({{before}} → {{after}}), no running instances; new binary loads on next request",
916
+ "lsBinaryUpdatedWithErrors": "LS binary updated ({{before}} → {{after}}), restarted {{count}} instance(s) ({{errors}} failed)",
917
+ "lsBinaryAlreadyCurrent": "LS binary already current (sha:{{sha}}), no update needed",
918
+ "lsBinaryUpdateFailed": "LS update failed: {{error}}",
919
+ "lsBinaryUpdateRequestFailed": "LS update request failed: {{error}}",
920
+ "lsBinaryUnreadable": "LS binary unreadable: {{error}}",
921
+ "lsBinaryReadFailed": "Failed to read LS info: {{error}}",
922
+ "lsBinaryStat": "{{path}} · {{sizeMb}} MB · sha256:{{sha}} · installed {{age}}d ago",
923
+ "proxyConfigured": "Account proxy configured",
924
+ "proxyCleared": "Account proxy cleared",
925
+ "globalProxySaved": "Global proxy saved",
926
+ "globalProxyCleared": "Global proxy cleared",
927
+ "enterProxyHost": "Please enter proxy host",
928
+ "statsReset": "Statistics reset",
929
+ "enterKeyOrToken": "Please enter Key or Token",
930
+ "addFailed": "Add failed",
931
+ "probe": {
932
+ "doing": "Probing, takes about 10-30 seconds...",
933
+ "probeComplete": "Probe complete: {{tier}}",
934
+ "allDoing": "Probing all accounts, takes 1-3 minutes depending on count...",
935
+ "probeAllComplete": "Probe complete: {{summary}}"
936
+ },
937
+ "probeComplete": "Probe complete: {{tier}}",
938
+ "probeAllComplete": "Probe complete: {{summary}}",
939
+ "credits": {
940
+ "refreshed": "Credits refreshed",
941
+ "refreshFailed": "Failed to refresh credits",
942
+ "refreshing": "Refreshing credits...",
943
+ "allRefreshed": "All account credits refreshed: {{ok}} success / {{fail}} failed"
944
+ }
945
+ },
946
+
947
+ "log": {
948
+ "level": {
949
+ "all": "All Levels",
950
+ "debug": "Debug",
951
+ "info": "Info",
952
+ "warn": "Warn",
953
+ "error": "Error"
954
+ },
955
+ "searchPlaceholder": "Search log content...",
956
+ "clearView": "Clear View",
957
+ "viaSSE": "via SSE real-time streaming",
958
+ "export": {
959
+ "all": "All logs",
960
+ "api": "API request logs",
961
+ "system": "System runtime logs",
962
+ "txt": "Plain text",
963
+ "btn": "Download logs"
964
+ }
965
+ },
966
+
967
+ "model": {
968
+ "mode": {
969
+ "all": "Allow All",
970
+ "allowlist": "Allowlist",
971
+ "blocklist": "Blocklist"
972
+ },
973
+ "provider": {
974
+ "all": "All Providers",
975
+ "anthropic": "Anthropic",
976
+ "openai": "OpenAI",
977
+ "google": "Google",
978
+ "deepseek": "DeepSeek",
979
+ "xai": "xAI",
980
+ "alibaba": "Alibaba",
981
+ "moonshot": "Moonshot",
982
+ "windsurf": "Windsurf"
983
+ },
984
+ "list": {
985
+ "current": "Current List ({{count}})",
986
+ "empty": "List is empty"
987
+ }
988
+ },
989
+
990
+ "error": {
991
+ "generic": "An error occurred",
992
+ "unknown": "Unknown error",
993
+ "updateFailed": "Update failed",
994
+ "apiError": "API error",
995
+ "loadFailed": "Failed to load",
996
+ "probeFailed": "Probe failed",
997
+ "accountNotFound": "Account not found",
998
+ "openFailed": "Failed to open",
999
+ "saveFailed": "Save failed",
1000
+ "deleteFailed": "Delete failed",
1001
+ "networkError": "Network error",
1002
+ "authRequired": "Please login first",
1003
+ "clipboardNotSupported": "Current environment doesn't support clipboard auto-read, please paste manually",
1004
+ "clipboardEmpty": "Clipboard is empty",
1005
+ "clipboardReadFailed": "Failed to read clipboard",
1006
+ "firebaseLoadFailed": "Firebase SDK failed to load, please refresh and retry",
1007
+ "ERR_EMAIL_PASSWORD_REQUIRED": "Email and password are required",
1008
+ "ERR_HOST_PORT_REQUIRED": "Host and port are required",
1009
+ "ERR_SELF_UPDATE_UNAVAILABLE": "One-click update is unavailable for this deployment",
1010
+ "pull-failed": "Failed to pull image",
1011
+ "deployer-pull-failed": "Failed to pull deployer image (docker:24-cli)",
1012
+ "deployer-create-failed": "Failed to create deployer container",
1013
+ "deployer-create-no-id": "Deployer container created but no ID returned",
1014
+ "deployer-start-failed": "Failed to start deployer container",
1015
+ "ERR_UNCOMMITTED_CHANGES": "Working directory has uncommitted changes. Force overwrite?",
1016
+ "ERR_ACCOUNTS_REQUIRED": "Accounts array is required",
1017
+ "ERR_TEXT_REQUIRED": "Text field is required",
1018
+ "ERR_NO_VALID_LINES": "No valid lines found",
1019
+ "ERR_FORMAT_INVALID": "Invalid format. Expected: [proxy] email password",
1020
+ "ERR_UNSUPPORTED_IMPORT_ITEM": "Item could not be recognized as email/password, token, or API key",
1021
+ "ERR_JSON_INVALID": "Invalid JSON format",
1022
+ "ERR_JSON_FILE_REQUIRED": "Please choose a .json file",
1023
+ "ERR_IDTOKEN_REQUIRED": "ID token is required",
1024
+ "ERR_PROXY_PRIVATE_IP": "Proxy cannot point to private/local address",
1025
+ "ERR_PROXY_FORMAT_INVALID": "Invalid proxy format. Expected: protocol://[user:pass@]host:port",
1026
+ "ERR_PROXY_HTTP_ERROR": "Proxy returned HTTP error",
1027
+ "ERR_PROXY_PRIVATE_HOST": "Private/local host is not allowed",
1028
+ "ERR_CONNECTION_FAILED": "Connection failed",
1029
+ "ERR_TIMEOUT": "Timeout (10s)",
1030
+ "ERR_TLS_TUNNEL_ERROR": "TLS tunnel established but returned abnormal content",
1031
+ "ERR_TLS_FAILED": "TLS failed",
1032
+ "ERR_LOGIN_FAILED": "Login failed",
1033
+ "ERR_EMAIL_NOT_FOUND": "Email not registered for password login. If registered via Google/GitHub OAuth, use OAuth buttons or visit windsurf.com/show-auth-token to copy Auth Token",
1034
+ "ERR_INVALID_PASSWORD": "Invalid password",
1035
+ "ERR_INVALID_CREDENTIALS": "Invalid email or password",
1036
+ "ERR_NO_PASSWORD_SET": "No password set for this account. Use Google/GitHub OAuth or visit windsurf.com/show-auth-token to copy Auth Token",
1037
+ "ERR_USER_DISABLED": "Account has been disabled",
1038
+ "ERR_TOO_MANY_ATTEMPTS": "Too many attempts. Please try again later",
1039
+ "ERR_INVALID_EMAIL": "Invalid email format",
1040
+ "ERR_CODEIUM_REGISTER_FAILED": "Codeium registration failed",
1041
+ "ERR_AUTH1_TOKEN_MISSING": "Auth1 response missing token",
1042
+ "ERR_POSTAUTH_FAILED": "Windsurf PostAuth failed",
1043
+ "ERR_TOKEN_FETCH_FAILED": "Failed to fetch one-time auth token",
1044
+ "ERR_FIREBASE_TOKEN_MISSING": "Firebase response missing idToken",
1045
+ "ERR_LOCAL_IMPORT_LOOPBACK_ONLY": "Local import only available from 127.0.0.1 — open the dashboard from the host machine itself, not via a public domain",
1046
+ "ERR_LOCAL_IMPORT_FAILED": "Failed to scan local Windsurf credentials"
1047
+ },
1048
+
1049
+ "footer": {
1050
+ "version": "Version",
1051
+ "langToggle": "Switch language",
1052
+ "langToggleToEn": "Switch to English",
1053
+ "langToggleToZh": "切换到中文"
1054
+ },
1055
+
1056
+ "placeholder": {
1057
+ "noProxy": "No proxy"
1058
+ },
1059
+
1060
+ "loginResult": {
1061
+ "success": "✓ Login Successful",
1062
+ "apiKeyGenerated": "API Key generated{{autoAdd}}",
1063
+ "fail": "✗ Login Failed",
1064
+ "batchComplete": "Batch Import Complete",
1065
+ "batchDesc": "Total {{total}} accounts, {{success}} success, {{fail}} fail{{autoAdd}}",
1066
+ "tryOther": "Try Another Way",
1067
+ "oauthHint": "If Google/GitHub OAuth was used to register, password login won't work. Use the Google/GitHub buttons above, or visit {{link}} to copy Auth Token then manually add in Account Pool page.",
1068
+ "fields": {
1069
+ "email": "Email",
1070
+ "name": "Name",
1071
+ "apiKey": "API Key",
1072
+ "accountId": "Account ID"
1073
+ },
1074
+ "successTitle": "Login Success",
1075
+ "addedToPool": "and added to account pool"
1076
+ },
1077
+
1078
+ "timeRange": {
1079
+ "minutesAgo": "{{count}}m ago",
1080
+ "hoursAgo": "{{count}}h ago",
1081
+ "daysAgo": "{{count}}d ago"
1082
+ },
1083
+
1084
+ "time": {
1085
+ "day": "d",
1086
+ "hour": "h",
1087
+ "minute": "m",
1088
+ "second": "s"
1089
+ },
1090
+
1091
+ "prompt": {
1092
+ "editor": {
1093
+ "reset": "Reset",
1094
+ "search": "Search providers...",
1095
+ "templateHint": "{{model}} placeholder will be replaced with the requested model name."
1096
+ }
1097
+ },
1098
+
1099
+ "ls": {
1100
+ "defaultInstance": "Default Instance",
1101
+ "noProxy": "No proxy",
1102
+ "port": "Port",
1103
+ "pid": "PID",
1104
+ "restartCount": "Restarts"
1105
+ }
1106
+ }