search-rotation 0.4.9
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/LICENSE +21 -0
- package/README.md +124 -0
- package/dist/abort.js +14 -0
- package/dist/config.js +109 -0
- package/dist/engines/base.js +72 -0
- package/dist/engines/duckduckgo.js +98 -0
- package/dist/engines/exa.js +113 -0
- package/dist/engines/firecrawl.js +78 -0
- package/dist/engines/googlecse.js +41 -0
- package/dist/engines/hosted-mcp.js +24 -0
- package/dist/engines/index.js +13 -0
- package/dist/engines/jina.js +28 -0
- package/dist/engines/parallel.js +74 -0
- package/dist/engines/tavily.js +74 -0
- package/dist/history.js +59 -0
- package/dist/index.js +182 -0
- package/dist/mcp/engine-status.js +58 -0
- package/dist/mcp/http.js +35 -0
- package/dist/mcp/server.js +105 -0
- package/dist/persistence.js +80 -0
- package/dist/quota.js +37 -0
- package/dist/router.js +183 -0
- package/dist/search-time.js +31 -0
- package/dist/status.js +141 -0
- package/dist/types.js +1 -0
- package/dist/usage.js +95 -0
- package/dist/version.js +5 -0
- package/dist/web/app.js +155 -0
- package/dist/web/security.js +116 -0
- package/docs/assets/brand/FONT-LICENSE.txt +93 -0
- package/docs/assets/brand/README.md +18 -0
- package/docs/assets/brand/icon-128.png +0 -0
- package/docs/assets/brand/icon-32.png +0 -0
- package/docs/assets/brand/icon-512.png +0 -0
- package/docs/assets/brand/icon-dark-128.png +0 -0
- package/docs/assets/brand/icon-dark-512.png +0 -0
- package/docs/assets/brand/icon-dark.svg +1 -0
- package/docs/assets/brand/icon-light-128.png +0 -0
- package/docs/assets/brand/icon-light-512.png +0 -0
- package/docs/assets/brand/icon-light.svg +1 -0
- package/docs/assets/brand/icon-mono.svg +1 -0
- package/docs/assets/brand/icon.svg +1 -0
- package/docs/assets/brand/preview.png +0 -0
- package/docs/assets/brand/preview.svg +1 -0
- package/docs/assets/brand/wordmark-dark.svg +1 -0
- package/docs/assets/brand/wordmark-light.svg +1 -0
- package/docs/assets/dashboard-dark.png +0 -0
- package/docs/assets/dashboard-light.png +0 -0
- package/docs/assets/dashboard.png +0 -0
- package/docs/assets/mcp-tools-dark.png +0 -0
- package/docs/assets/mcp-tools-light.png +0 -0
- package/docs/assets/mcp-tools.png +0 -0
- package/docs/assets/search-rotation.svg +52 -0
- package/docs/clients.md +93 -0
- package/docs/operations.md +66 -0
- package/docs/provider-access.md +38 -0
- package/docs/release-notes.md +52 -0
- package/package.json +65 -0
- package/static/app.js +1126 -0
- package/static/engine-logos/README.md +11 -0
- package/static/engine-logos/duckduckgo.png +0 -0
- package/static/engine-logos/exa.png +0 -0
- package/static/engine-logos/firecrawl.png +0 -0
- package/static/engine-logos/google-cse.png +0 -0
- package/static/engine-logos/jina.png +0 -0
- package/static/engine-logos/parallel.png +0 -0
- package/static/engine-logos/tavily.png +0 -0
- package/static/i18n.js +709 -0
- package/static/index.html +95 -0
- package/static/style.css +1258 -0
package/static/i18n.js
ADDED
|
@@ -0,0 +1,709 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/* Übersetzungen für das Dashboard — global als window.I18N. */
|
|
4
|
+
|
|
5
|
+
window.I18N = {
|
|
6
|
+
de: {
|
|
7
|
+
"usage.total": "{n} Aufrufe · Monat",
|
|
8
|
+
"usage.totalOne": "{n} Aufruf · Monat",
|
|
9
|
+
"usage.detail": "{search} Suchen · {fetch} Fetches · {errors} Fehler",
|
|
10
|
+
"usage.help": "Lokal erfasste Engine-Versuche im aktuellen UTC-Kalendermonat, einschließlich Fallbacks und Dashboard-Tests. Suchen und Fetches zählen erfolgreiche Versuche; Fehler kommen hinzu. Credits können pro Aufruf variieren. Keine kontoübergreifende Statistik.",
|
|
11
|
+
"quota.remaining": "{remaining} / {limit} {unit} übrig",
|
|
12
|
+
"quota.remoteHelp": "Kontostand des Anbieter-Accounts, bis zu 5 Minuten gecacht. Kann Nutzung außerhalb dieser Installation enthalten; nach lokalen Aufrufen wird der Verbrauch geschätzt fortgeschrieben.",
|
|
13
|
+
"quota.localHelp": "Lokale Zählung, keine vollständige Anbieterabrechnung. Ohne bekanntes Limit lässt sich kein Restbudget bestimmen.",
|
|
14
|
+
"quota.fetchError": "Anbieter-Kontingent nicht abrufbar · lokale Daten",
|
|
15
|
+
"activity.caption": "Tool-Aufrufe · letzte 48 Stunden · 2 Stunden pro Balken",
|
|
16
|
+
"activity.bucket": "{total} Tool-Aufrufe: {search} Suchen, {fetch} Fetches · {errors} fehlgeschlagen",
|
|
17
|
+
"activity.providers": "{n} Engine-Versuche inkl. Fallbacks",
|
|
18
|
+
"activity.start": "vor 48 Stunden",
|
|
19
|
+
"activity.end": "jetzt · lokale Zeit",
|
|
20
|
+
"activity.sample": "Basis: letzte {n} gespeicherte Tool-Aufrufe (max. 200). Bei viel Aktivität oder geleertem Verlauf können Zeiträume fehlen. Balken fokussieren oder antippen für Details.",
|
|
21
|
+
"stat.searchesHelp": "Erfolgreiche, lokal gezählte Suchversuche im aktuellen UTC-Kalendermonat, einschließlich Dashboard-Tests.",
|
|
22
|
+
"stat.fetchesHelp": "Erfolgreiche, lokal gezählte Fetch-Versuche im aktuellen UTC-Kalendermonat, einschließlich Dashboard-Tests.",
|
|
23
|
+
"stat.errorsHelp": "Anteil insgesamt fehlgeschlagener Tool-Aufrufe in den letzten bis zu 200 Verlaufseinträgen. Ein erfolgreicher Fallback zählt hier als Erfolg; Engine-Fehler stehen bei der jeweiligen Engine.",
|
|
24
|
+
"stat.durationHelp": "Durchschnittliche Gesamtdauer erfolgreicher Tool-Aufrufe in den letzten bis zu 200 Verlaufseinträgen, einschließlich Fallbacks. Ohne Daten wird kein Wert angezeigt.",
|
|
25
|
+
|
|
26
|
+
"settings.resultsHelp": "Eine explizite Anzahl im Tool-Aufruf hat Vorrang. Anbieterstandard lässt die Anzahl offen; Trefferzahl und Kosten können je nach Engine variieren. Firecrawl: geschätzt 2 Credits bis 10 Ergebnisse, 4 ab 11. Ohne API-Key bleiben Anbieterlimits unbekannt.",
|
|
27
|
+
"settings.resultsCount": "Ergebnisanzahl (1–20)",
|
|
28
|
+
"settings.resultsProvider": "Anbieterstandard",
|
|
29
|
+
"settings.resultsCustom": "Eigene Vorgabe",
|
|
30
|
+
"settings.results": "Standard-Ergebnisanzahl",
|
|
31
|
+
"nav.tools": "MCP Tools",
|
|
32
|
+
"tools.title": "MCP Tools",
|
|
33
|
+
"tools.sub": "Vier Werkzeuge, die dein KI-Assistent aufrufen kann",
|
|
34
|
+
"tools.intro": "Beschreibe deinem Assistenten einfach, was du brauchst. Er ruft das passende Tool auf. Die Beispiele zeigen Toolname und Argumente; Kopieren führt keinen Aufruf aus.",
|
|
35
|
+
"tools.web_search": "Sucht im Web und gibt Titel, URLs und Textauszüge zurück. Rotiert automatisch zwischen Engines und wechselt bei Fehlern zum nächsten Anbieter.",
|
|
36
|
+
"tools.fetch_url": "Ruft eine bestimmte Webseite ab und gibt ihren Inhalt als Markdown zurück. Nutzt eine eigene Anbieter-Rotation für die Textextraktion.",
|
|
37
|
+
"tools.engine_status": "Zeigt Aktivierung, Zugang pro Funktion, lokale Nutzung und Kontingente. Fehlende Keys sind nicht automatisch ein Problem: Einige Funktionen gehen keyless. Gespeicherte Fehler sind historisch; dies ist kein Live-Funktionstest.",
|
|
38
|
+
"tools.open_dashboard": "Öffnet dieses Dashboard im Browser des Rechners, auf dem der Server läuft. Bei einem entfernten Server öffnet es nicht automatisch deinen lokalen Browser.",
|
|
39
|
+
"tools.parameters": "Parameter",
|
|
40
|
+
"tools.none": "Keine Parameter.",
|
|
41
|
+
"tools.example": "Beispielaufruf",
|
|
42
|
+
"tools.copy": "Beispiel für {name} kopieren",
|
|
43
|
+
"tools.param.query": "Erforderlich · Suchbegriff als Text.",
|
|
44
|
+
"tools.param.count": "Optional · 1–20 Ergebnisse. Ohne Angabe gilt die Dashboard-Vorgabe (anfangs 8) oder der Anbieterstandard.",
|
|
45
|
+
"tools.param.engine": "Optional · Bevorzugte Engine-ID, z. B. tavily. Fallback auf andere Anbieter bleibt aktiv.",
|
|
46
|
+
"tools.param.timeRange": "Optional · day/week/month/year: letzte 1/7/30/365 Tage bis heute (UTC, Tagesgenauigkeit). Nicht mit Datumsgrenzen kombinierbar. Nur kompatible Anbieter nehmen an Rotation und Failover teil.",
|
|
47
|
+
"tools.param.startDate": "Optional · Startdatum YYYY-MM-DD. Allein oder mit endDate; muss vor oder auf endDate liegen.",
|
|
48
|
+
"tools.param.endDate": "Optional · Enddatum YYYY-MM-DD. Datumsinterpretation hängt vom Anbieter ab; ungeeignete Anbieter werden übersprungen.",
|
|
49
|
+
"tools.param.url": "Erforderlich · Vollständige URL der Webseite.",
|
|
50
|
+
|
|
51
|
+
"settings.title": "Rotation einstellen",
|
|
52
|
+
"settings.strict": "Strikter Gratis-Modus",
|
|
53
|
+
"settings.strictHelp": "Engines mit erschöpftem bekanntem Kontingent werden übersprungen. Geschätzte oder unbekannte Limits garantieren keine Kostenfreiheit; Anbieter-Budgetlimits zusätzlich setzen.",
|
|
54
|
+
"settings.timeout": "Maximale Dauer pro Anfrage (Millisekunden)",
|
|
55
|
+
"test.fetchOk": "{chars} Zeichen · {ms}",
|
|
56
|
+
"quota.unknown": "Anbieterlimit und Gesamtverbrauch unbekannt",
|
|
57
|
+
"quota.providerBalance": "Kontostand",
|
|
58
|
+
"quota.localShort": "Aufrufe · lokal",
|
|
59
|
+
"quota.localCalls": "erfolgreiche Aufrufe diesen Monat · lokal gezählt",
|
|
60
|
+
"quota.period.day": "heute (Anbieter-Zeitzone)",
|
|
61
|
+
"quota.period.month": "diesen Monat (UTC)",
|
|
62
|
+
"quota.period.ip": "IP-basiert",
|
|
63
|
+
"quota.unit.requests": "Anfragen",
|
|
64
|
+
"quota.unit.credits": "Credits",
|
|
65
|
+
"quota.source.remote": "Anbieter",
|
|
66
|
+
"quota.source.local": "lokal gezählt",
|
|
67
|
+
"quota.source.unknown": "unbekannt",
|
|
68
|
+
"quota.estimated": "geschätzt",
|
|
69
|
+
|
|
70
|
+
"nav.overview": "Übersicht",
|
|
71
|
+
"nav.engines": "Engines",
|
|
72
|
+
"nav.history": "Verlauf",
|
|
73
|
+
"theme.toLight": "Helles Design",
|
|
74
|
+
"theme.toDark": "Dunkles Design",
|
|
75
|
+
"lang.menu": "Sprache wählen",
|
|
76
|
+
|
|
77
|
+
"overview.title": "Übersicht",
|
|
78
|
+
"overview.sub": "Puls, Rotation und Kontingente deiner Such-Engines",
|
|
79
|
+
"stat.searches": "Suchen",
|
|
80
|
+
"stat.searchesSub": "erfolgreich · dieser Monat",
|
|
81
|
+
"stat.fetches": "Fetches",
|
|
82
|
+
"stat.fetchesSub": "erfolgreich · dieser Monat",
|
|
83
|
+
"stat.errors": "Fehlerrate",
|
|
84
|
+
"stat.errorsSub": "letzte Tool-Aufrufe",
|
|
85
|
+
"stat.duration": "Ø Dauer",
|
|
86
|
+
"stat.durationSub": "erfolgreiche Aufrufe",
|
|
87
|
+
"stat.activity": "Aktivität",
|
|
88
|
+
"stat.activitySub": "letzte 48 Stunden",
|
|
89
|
+
"rotation.title": "Suchreihenfolge",
|
|
90
|
+
"rotation.sub": "Konfigurierte Reihenfolge · Startpunkt rotiert",
|
|
91
|
+
"rotation.empty": "Keine Engine aktiviert.",
|
|
92
|
+
"rotation.manage": "Engines verwalten",
|
|
93
|
+
"health.title": "Engine-Nutzung & Budget",
|
|
94
|
+
"health.sub": "Monatliche Aufrufe · kein Live-Funktionstest",
|
|
95
|
+
"health.source.remote": "remote",
|
|
96
|
+
"health.source.local": "lokal gezählt",
|
|
97
|
+
"health.source.none": "ohne festes Kontingent",
|
|
98
|
+
"health.off": "inaktiv",
|
|
99
|
+
"recent.title": "Letzte Aufrufe",
|
|
100
|
+
"recent.all": "Alle ansehen",
|
|
101
|
+
"recent.empty": "Noch keine Aufrufe.",
|
|
102
|
+
"setup.title": "MCP-Setup",
|
|
103
|
+
"setup.summary": "MCP-Setup anzeigen",
|
|
104
|
+
"snippet.codex": "Codex — ~/.codex/config.toml",
|
|
105
|
+
"snippet.claude": "Claude Desktop / Claude Code",
|
|
106
|
+
"snippet.remote": "Remote (Streamable HTTP)",
|
|
107
|
+
|
|
108
|
+
"engines.title": "Engines",
|
|
109
|
+
"engines.sub": "Reihenfolge per Drag & Drop · der Startpunkt rotiert je Anfrage",
|
|
110
|
+
"engines.stat": "{in} aktiviert · {keys} von {total} Keys gesetzt",
|
|
111
|
+
"engines.config": "Konfigurieren",
|
|
112
|
+
"engines.collapse": "Einklappen",
|
|
113
|
+
"key.set": "API-Key hinterlegen",
|
|
114
|
+
"key.replace": "Key ersetzen · aktuell: {masked}",
|
|
115
|
+
"key.clear": "Key löschen",
|
|
116
|
+
"extra.set": "gesetzt",
|
|
117
|
+
"btn.save": "Speichern",
|
|
118
|
+
"btn.clear": "Löschen",
|
|
119
|
+
"btn.copy": "Kopieren",
|
|
120
|
+
"btn.copied": "Kopiert ✓",
|
|
121
|
+
"signup": "Gratis-Key ↗",
|
|
122
|
+
"badge.keyless": "ohne Key",
|
|
123
|
+
"badge.quota": "Quota-API",
|
|
124
|
+
"cap.search": "Suche",
|
|
125
|
+
"cap.fetch": "Fetch",
|
|
126
|
+
"test.running": "Teste …",
|
|
127
|
+
"test.ok": "{count} Treffer · {ms}",
|
|
128
|
+
"notice.nokeys": "Noch keine Keys hinterlegt — verfügbare Funktionen und Limits hängen vom Anbieter ab. Lokale Aufrufe werden trotzdem gezählt; geteilte IP-Kontingente sind unbekannt. Keys lassen sich auf den Engine-Karten hinterlegen.",
|
|
129
|
+
|
|
130
|
+
"quota.remote": "{used} / {limit} · remote",
|
|
131
|
+
"quota.local": "{used} / {limit} · lokal gezählt",
|
|
132
|
+
"quota.none": "kein festes Kontingent",
|
|
133
|
+
"quota.error": "Remote-Quota-Fehler: {error}",
|
|
134
|
+
"quota.free": "{pct} % frei",
|
|
135
|
+
|
|
136
|
+
"history.title": "Verlauf",
|
|
137
|
+
"history.sub": "Suchen & Fetches · live alle 5 s",
|
|
138
|
+
"history.clear": "Verlauf leeren",
|
|
139
|
+
"history.confirm": "Verlauf wirklich leeren?",
|
|
140
|
+
"history.empty": "Noch keine Einträge.",
|
|
141
|
+
"history.noMatches": "Keine Aufrufe für diese Filter. Filter ändern oder zurücksetzen.",
|
|
142
|
+
"history.emptyHint": "Sobald der MCP-Server eine Suche oder einen Fetch ausführt, erscheint er hier.",
|
|
143
|
+
"hist.filter.all": "Alle",
|
|
144
|
+
"hist.filter.search": "Suchen",
|
|
145
|
+
"hist.filter.fetch": "Fetches",
|
|
146
|
+
"hist.search.ph": "Query oder Engine filtern …",
|
|
147
|
+
"hist.pause": "Live pausieren",
|
|
148
|
+
"hist.resume": "Live fortsetzen",
|
|
149
|
+
"hist.shown": "{n} Einträge · {f} fehlgeschlagen",
|
|
150
|
+
"hist.kind.search": "Suche",
|
|
151
|
+
"hist.kind.fetch": "Fetch",
|
|
152
|
+
"hist.failed": "fehlgeschlagen",
|
|
153
|
+
"hist.results": "{n} Treffer",
|
|
154
|
+
"hist.chars": "{n} Zeichen",
|
|
155
|
+
"hist.attempts": "Versuchs-Kette",
|
|
156
|
+
"hist.items": "Treffer",
|
|
157
|
+
"hist.markdown": "Markdown-Auszug",
|
|
158
|
+
|
|
159
|
+
"toast.saved": "Gespeichert",
|
|
160
|
+
"toast.copied": "In die Zwischenablage kopiert",
|
|
161
|
+
"toast.error": "Fehler: {msg}",
|
|
162
|
+
"footer.text": "Quotas: lokal pro Kalendermonat · remote wo verfügbar (5 Min Cache) · Verlauf alle 5 s, Kontingente alle 30 s",
|
|
163
|
+
"api.unauthorized": "401 — diese Dashboard-URL mit <code>?token=…</code> öffnen (steht im Server-Log).",
|
|
164
|
+
},
|
|
165
|
+
|
|
166
|
+
en: {
|
|
167
|
+
"usage.total": "{n} calls · month",
|
|
168
|
+
"usage.totalOne": "{n} call · month",
|
|
169
|
+
"usage.detail": "Searches: {search} · Fetches: {fetch} · Errors: {errors}",
|
|
170
|
+
"usage.help": "Engine attempts recorded locally this UTC calendar month, including fallbacks and dashboard tests. Searches and fetches count successful attempts; errors are added separately. Credits per call may vary. This is not an account-wide statistic.",
|
|
171
|
+
"quota.remaining": "{remaining} / {limit} {unit} remaining",
|
|
172
|
+
"quota.remoteHelp": "Provider account balance, cached for up to 5 minutes. May include usage outside this installation; estimated consumption is added after local calls.",
|
|
173
|
+
"quota.localHelp": "Local counters, not a complete provider billing statement. Remaining budget cannot be determined without a known limit.",
|
|
174
|
+
"quota.fetchError": "Provider quota unavailable · using local data",
|
|
175
|
+
"activity.caption": "Tool calls · last 48 hours · 2 hours per bar",
|
|
176
|
+
"activity.bucket": "Tool calls: {total} · Searches: {search} · Fetches: {fetch} · Failed: {errors}",
|
|
177
|
+
"activity.providers": "{n} engine attempts incl. fallbacks",
|
|
178
|
+
"activity.start": "48 hours ago",
|
|
179
|
+
"activity.end": "now · local time",
|
|
180
|
+
"activity.sample": "Based on the last {n} stored tool calls (max. 200). Heavy activity or cleared history can leave gaps. Focus or tap a bar for details.",
|
|
181
|
+
"stat.searchesHelp": "Successful search attempts recorded locally this UTC calendar month, including dashboard tests.",
|
|
182
|
+
"stat.fetchesHelp": "Successful fetch attempts recorded locally this UTC calendar month, including dashboard tests.",
|
|
183
|
+
"stat.errorsHelp": "Share of tool calls that ultimately failed in the last up to 200 history entries. A successful fallback counts as success here; individual engine errors appear with each engine.",
|
|
184
|
+
"stat.durationHelp": "Average total duration of successful tool calls in the last up to 200 history entries, including fallbacks. No value is shown without data.",
|
|
185
|
+
|
|
186
|
+
"settings.resultsHelp": "An explicit count in the tool call takes priority. Provider default omits the count; results and costs may vary by engine. Firecrawl: estimated 2 credits up to 10 results, 4 from 11. Without an API key, provider limits remain unknown.",
|
|
187
|
+
"settings.resultsCount": "Result count (1–20)",
|
|
188
|
+
"settings.resultsProvider": "Provider default",
|
|
189
|
+
"settings.resultsCustom": "Custom count",
|
|
190
|
+
"settings.results": "Default result count",
|
|
191
|
+
"nav.tools": "MCP Tools",
|
|
192
|
+
"tools.title": "MCP Tools",
|
|
193
|
+
"tools.sub": "Four tools your AI assistant can call",
|
|
194
|
+
"tools.intro": "Tell your assistant what you need and it will call the appropriate tool. Examples show tool names and arguments; copying an example does not run it.",
|
|
195
|
+
"tools.web_search": "Searches the web and returns titles, URLs and snippets. Automatically rotates between engines and falls back to another provider when a request fails.",
|
|
196
|
+
"tools.fetch_url": "Fetches a specific webpage and returns its content as Markdown. Uses a separate provider rotation for text extraction.",
|
|
197
|
+
"tools.engine_status": "Reports configuration, access per capability, local usage and quotas. A missing key is not always a problem: some capabilities work keyless. Stored errors are historical; this is not a live health check.",
|
|
198
|
+
"tools.open_dashboard": "Opens this dashboard in a browser on the machine running the server. A remote server does not automatically open your local browser.",
|
|
199
|
+
"tools.parameters": "Parameters",
|
|
200
|
+
"tools.none": "No parameters.",
|
|
201
|
+
"tools.example": "Example call",
|
|
202
|
+
"tools.copy": "Copy example for {name}",
|
|
203
|
+
"tools.param.query": "Required · Search query as text.",
|
|
204
|
+
"tools.param.count": "Optional · 1–20 results. Omit to use the dashboard setting (initially 8) or the provider default.",
|
|
205
|
+
"tools.param.engine": "Optional · Preferred engine ID, e.g. tavily. Fallback to other providers remains enabled.",
|
|
206
|
+
"tools.param.timeRange": "Optional · day/week/month/year: past 1/7/30/365 days through today (UTC, date precision). Cannot combine with date bounds. Rotation and failover use compatible providers only.",
|
|
207
|
+
"tools.param.startDate": "Optional · Start date YYYY-MM-DD. Alone or with endDate; must be on or before endDate.",
|
|
208
|
+
"tools.param.endDate": "Optional · End date YYYY-MM-DD. Date semantics depend on the provider; incompatible providers are skipped.",
|
|
209
|
+
"tools.param.url": "Required · Full webpage URL.",
|
|
210
|
+
|
|
211
|
+
"settings.title": "Rotation settings",
|
|
212
|
+
"settings.strict": "Strict free mode",
|
|
213
|
+
"settings.strictHelp": "Skips engines whose known quota is exhausted. Estimated or unknown limits cannot guarantee zero cost; also set provider spending caps.",
|
|
214
|
+
"settings.timeout": "Maximum request duration (milliseconds)",
|
|
215
|
+
"test.fetchOk": "{chars} characters · {ms}",
|
|
216
|
+
"quota.unknown": "Provider limit and total usage unknown",
|
|
217
|
+
"quota.providerBalance": "account balance",
|
|
218
|
+
"quota.localShort": "calls · local",
|
|
219
|
+
"quota.localCalls": "successful calls this month · counted locally",
|
|
220
|
+
"quota.period.day": "today (provider timezone)",
|
|
221
|
+
"quota.period.month": "this month (UTC)",
|
|
222
|
+
"quota.period.ip": "IP-based",
|
|
223
|
+
"quota.unit.requests": "requests",
|
|
224
|
+
"quota.unit.credits": "credits",
|
|
225
|
+
"quota.source.remote": "provider",
|
|
226
|
+
"quota.source.local": "counted locally",
|
|
227
|
+
"quota.source.unknown": "unknown",
|
|
228
|
+
"quota.estimated": "estimated",
|
|
229
|
+
|
|
230
|
+
"nav.overview": "Overview",
|
|
231
|
+
"nav.engines": "Engines",
|
|
232
|
+
"nav.history": "History",
|
|
233
|
+
"theme.toLight": "Light theme",
|
|
234
|
+
"theme.toDark": "Dark theme",
|
|
235
|
+
"lang.menu": "Choose language",
|
|
236
|
+
|
|
237
|
+
"overview.title": "Overview",
|
|
238
|
+
"overview.sub": "Pulse, rotation and quotas of your search engines",
|
|
239
|
+
"stat.searches": "Searches",
|
|
240
|
+
"stat.searchesSub": "successful · this month",
|
|
241
|
+
"stat.fetches": "Fetches",
|
|
242
|
+
"stat.fetchesSub": "successful · this month",
|
|
243
|
+
"stat.errors": "Error rate",
|
|
244
|
+
"stat.errorsSub": "of recent tool calls",
|
|
245
|
+
"stat.duration": "Ø duration",
|
|
246
|
+
"stat.durationSub": "successful calls",
|
|
247
|
+
"stat.activity": "Activity",
|
|
248
|
+
"stat.activitySub": "last 48 hours",
|
|
249
|
+
"rotation.title": "Search order",
|
|
250
|
+
"rotation.sub": "Configured order · starting engine rotates",
|
|
251
|
+
"rotation.empty": "No engine enabled.",
|
|
252
|
+
"rotation.manage": "Manage engines",
|
|
253
|
+
"health.title": "Engine usage & budget",
|
|
254
|
+
"health.sub": "Monthly calls · not a live health check",
|
|
255
|
+
"health.source.remote": "remote",
|
|
256
|
+
"health.source.local": "counted locally",
|
|
257
|
+
"health.source.none": "no fixed quota",
|
|
258
|
+
"health.off": "inactive",
|
|
259
|
+
"recent.title": "Recent calls",
|
|
260
|
+
"recent.all": "View all",
|
|
261
|
+
"recent.empty": "No calls yet.",
|
|
262
|
+
"setup.title": "MCP setup",
|
|
263
|
+
"setup.summary": "Show MCP setup",
|
|
264
|
+
"snippet.codex": "Codex — ~/.codex/config.toml",
|
|
265
|
+
"snippet.claude": "Claude Desktop / Claude Code",
|
|
266
|
+
"snippet.remote": "Remote (Streamable HTTP)",
|
|
267
|
+
|
|
268
|
+
"engines.title": "Engines",
|
|
269
|
+
"engines.sub": "Drag & drop to reorder · starting engine rotates per request",
|
|
270
|
+
"engines.stat": "{in} enabled · {keys} of {total} keys set",
|
|
271
|
+
"engines.config": "Configure",
|
|
272
|
+
"engines.collapse": "Collapse",
|
|
273
|
+
"key.set": "Enter API key",
|
|
274
|
+
"key.replace": "Replace key · current: {masked}",
|
|
275
|
+
"key.clear": "Delete key",
|
|
276
|
+
"extra.set": "set",
|
|
277
|
+
"btn.save": "Save",
|
|
278
|
+
"btn.clear": "Delete",
|
|
279
|
+
"btn.copy": "Copy",
|
|
280
|
+
"btn.copied": "Copied ✓",
|
|
281
|
+
"signup": "Free key ↗",
|
|
282
|
+
"badge.keyless": "no key needed",
|
|
283
|
+
"badge.quota": "Quota API",
|
|
284
|
+
"cap.search": "search",
|
|
285
|
+
"cap.fetch": "fetch",
|
|
286
|
+
"test.running": "Testing …",
|
|
287
|
+
"test.ok": "{count} results · {ms}",
|
|
288
|
+
"notice.nokeys": "No API keys configured. Available features and limits depend on the provider. Local calls are still counted; shared IP quotas are unknown. Add keys on the engine cards.",
|
|
289
|
+
|
|
290
|
+
"quota.remote": "{used} / {limit} · remote",
|
|
291
|
+
"quota.local": "{used} / {limit} · counted locally",
|
|
292
|
+
"quota.none": "no fixed quota",
|
|
293
|
+
"quota.error": "Remote quota error: {error}",
|
|
294
|
+
"quota.free": "{pct}% free",
|
|
295
|
+
|
|
296
|
+
"history.title": "History",
|
|
297
|
+
"history.sub": "Searches & fetches · live every 5 s",
|
|
298
|
+
"history.clear": "Clear history",
|
|
299
|
+
"history.confirm": "Really clear the history?",
|
|
300
|
+
"history.empty": "No entries yet.",
|
|
301
|
+
"history.noMatches": "No calls match these filters. Change or clear the filters.",
|
|
302
|
+
"history.emptyHint": "As soon as the MCP server runs a search or fetch, it will appear here.",
|
|
303
|
+
"hist.filter.all": "All",
|
|
304
|
+
"hist.filter.search": "Searches",
|
|
305
|
+
"hist.filter.fetch": "Fetches",
|
|
306
|
+
"hist.search.ph": "Filter by query or engine …",
|
|
307
|
+
"hist.pause": "Pause live",
|
|
308
|
+
"hist.resume": "Resume live",
|
|
309
|
+
"hist.shown": "{n} entries · {f} failed",
|
|
310
|
+
"hist.kind.search": "Search",
|
|
311
|
+
"hist.kind.fetch": "Fetch",
|
|
312
|
+
"hist.failed": "failed",
|
|
313
|
+
"hist.results": "{n} results",
|
|
314
|
+
"hist.chars": "{n} chars",
|
|
315
|
+
"hist.attempts": "Attempt chain",
|
|
316
|
+
"hist.items": "Results",
|
|
317
|
+
"hist.markdown": "Markdown excerpt",
|
|
318
|
+
|
|
319
|
+
"toast.saved": "Saved",
|
|
320
|
+
"toast.copied": "Copied to clipboard",
|
|
321
|
+
"toast.error": "Error: {msg}",
|
|
322
|
+
"footer.text": "Quotas: local per calendar month · remote where available (5 min cache) · history every 5 s, quotas every 30 s",
|
|
323
|
+
"api.unauthorized": "401 — open this dashboard URL with <code>?token=…</code> (see server log).",
|
|
324
|
+
},
|
|
325
|
+
|
|
326
|
+
zh: {
|
|
327
|
+
"nav.overview": "总览",
|
|
328
|
+
"nav.engines": "引擎",
|
|
329
|
+
"nav.history": "历史",
|
|
330
|
+
"theme.toLight": "浅色主题",
|
|
331
|
+
"theme.toDark": "深色主题",
|
|
332
|
+
"lang.menu": "选择语言",
|
|
333
|
+
|
|
334
|
+
"overview.title": "总览",
|
|
335
|
+
"overview.sub": "搜索引擎的状态、轮换与配额",
|
|
336
|
+
"stat.searches": "搜索",
|
|
337
|
+
"stat.searchesSub": "本月",
|
|
338
|
+
"stat.fetches": "抓取",
|
|
339
|
+
"stat.fetchesSub": "本月",
|
|
340
|
+
"stat.errors": "错误率",
|
|
341
|
+
"stat.errorsSub": "近期调用",
|
|
342
|
+
"stat.duration": "平均耗时",
|
|
343
|
+
"stat.durationSub": "成功调用",
|
|
344
|
+
"stat.activity": "活动",
|
|
345
|
+
"stat.activitySub": "过去 48 小时",
|
|
346
|
+
"rotation.title": "当前轮换",
|
|
347
|
+
"rotation.sub": "轮询从最上方开始",
|
|
348
|
+
"rotation.empty": "没有启用的引擎。",
|
|
349
|
+
"rotation.manage": "管理引擎",
|
|
350
|
+
"health.title": "引擎健康",
|
|
351
|
+
"health.sub": "剩余配额",
|
|
352
|
+
"health.source.remote": "远程",
|
|
353
|
+
"health.source.local": "本地计数",
|
|
354
|
+
"health.source.none": "无固定配额",
|
|
355
|
+
"health.off": "停用",
|
|
356
|
+
"recent.title": "最近调用",
|
|
357
|
+
"recent.all": "查看全部",
|
|
358
|
+
"recent.empty": "尚无调用。",
|
|
359
|
+
"setup.title": "MCP 配置",
|
|
360
|
+
"setup.summary": "显示 MCP 配置",
|
|
361
|
+
"snippet.codex": "Codex — ~/.codex/config.toml",
|
|
362
|
+
"snippet.claude": "Claude Desktop / Claude Code",
|
|
363
|
+
"snippet.remote": "远程(Streamable HTTP)",
|
|
364
|
+
|
|
365
|
+
"engines.title": "引擎",
|
|
366
|
+
"engines.sub": "拖拽排序 — 轮询从最上方开始",
|
|
367
|
+
"engines.stat": "{in} 个参与轮换 · 已设置 {keys}/{total} 个密钥",
|
|
368
|
+
"engines.config": "配置",
|
|
369
|
+
"engines.collapse": "收起",
|
|
370
|
+
"key.set": "输入 API 密钥",
|
|
371
|
+
"key.replace": "替换密钥 · 当前:{masked}",
|
|
372
|
+
"key.clear": "删除密钥",
|
|
373
|
+
"extra.set": "已设置",
|
|
374
|
+
"btn.save": "保存",
|
|
375
|
+
"btn.clear": "删除",
|
|
376
|
+
"btn.copy": "复制",
|
|
377
|
+
"btn.copied": "已复制 ✓",
|
|
378
|
+
"signup": "免费密钥 ↗",
|
|
379
|
+
"badge.keyless": "无需密钥",
|
|
380
|
+
"badge.quota": "配额 API",
|
|
381
|
+
"cap.search": "搜索",
|
|
382
|
+
"cap.fetch": "抓取",
|
|
383
|
+
"test.running": "测试中 …",
|
|
384
|
+
"test.ok": "{count} 条结果 · {ms} 毫秒",
|
|
385
|
+
"notice.nokeys": "No API keys configured. Available features and limits depend on the provider. Local calls are still counted; shared IP quotas are unknown. Add keys on the engine cards.",
|
|
386
|
+
|
|
387
|
+
"quota.remote": "{used} / {limit} · 远程",
|
|
388
|
+
"quota.local": "{used} / {limit} · 本地计数",
|
|
389
|
+
"quota.none": "无固定配额",
|
|
390
|
+
"quota.error": "远程配额错误:{error}",
|
|
391
|
+
"quota.free": "剩余 {pct}%",
|
|
392
|
+
|
|
393
|
+
"history.title": "历史记录",
|
|
394
|
+
"history.sub": "搜索与抓取 · 每 5 秒实时刷新",
|
|
395
|
+
"history.clear": "清空历史",
|
|
396
|
+
"history.confirm": "确定要清空历史吗?",
|
|
397
|
+
"history.empty": "暂无记录。",
|
|
398
|
+
"history.emptyHint": "MCP 服务器执行搜索或抓取后,记录会显示在这里。",
|
|
399
|
+
"hist.filter.all": "全部",
|
|
400
|
+
"hist.filter.search": "搜索",
|
|
401
|
+
"hist.filter.fetch": "抓取",
|
|
402
|
+
"hist.search.ph": "按查询或引擎筛选 …",
|
|
403
|
+
"hist.pause": "暂停实时",
|
|
404
|
+
"hist.resume": "恢复实时",
|
|
405
|
+
"hist.shown": "{n} 条记录 · {f} 条失败",
|
|
406
|
+
"hist.kind.search": "搜索",
|
|
407
|
+
"hist.kind.fetch": "抓取",
|
|
408
|
+
"hist.failed": "失败",
|
|
409
|
+
"hist.results": "{n} 条结果",
|
|
410
|
+
"hist.chars": "{n} 字符",
|
|
411
|
+
"hist.attempts": "尝试链",
|
|
412
|
+
"hist.items": "结果",
|
|
413
|
+
"hist.markdown": "Markdown 摘录",
|
|
414
|
+
|
|
415
|
+
"toast.saved": "已保存",
|
|
416
|
+
"toast.copied": "已复制到剪贴板",
|
|
417
|
+
"toast.error": "错误:{msg}",
|
|
418
|
+
"footer.text": "配额:按自然月本地统计 · 可用时拉取远程配额(5 分钟缓存)· 历史每 5 秒,配额每 30 秒",
|
|
419
|
+
"api.unauthorized": "401 — 请使用带 <code>?token=…</code> 的地址打开此面板(见服务器日志)。",
|
|
420
|
+
},
|
|
421
|
+
|
|
422
|
+
hi: {
|
|
423
|
+
"nav.overview": "अवलोकन",
|
|
424
|
+
"nav.engines": "इंजन",
|
|
425
|
+
"nav.history": "इतिहास",
|
|
426
|
+
"theme.toLight": "हल्की थीम",
|
|
427
|
+
"theme.toDark": "गहरी थीम",
|
|
428
|
+
"lang.menu": "भाषा चुनें",
|
|
429
|
+
|
|
430
|
+
"overview.title": "अवलोकन",
|
|
431
|
+
"overview.sub": "अपने खोज इंजनों की स्थिति, रोटेशन और कोटा",
|
|
432
|
+
"stat.searches": "खोजें",
|
|
433
|
+
"stat.searchesSub": "इस माह",
|
|
434
|
+
"stat.fetches": "फ़ेच",
|
|
435
|
+
"stat.fetchesSub": "इस माह",
|
|
436
|
+
"stat.errors": "त्रुटि दर",
|
|
437
|
+
"stat.errorsSub": "हाल के कॉल",
|
|
438
|
+
"stat.duration": "औसत अवधि",
|
|
439
|
+
"stat.durationSub": "सफल कॉल",
|
|
440
|
+
"stat.activity": "गतिविधि",
|
|
441
|
+
"stat.activitySub": "पिछले 48 घंटे",
|
|
442
|
+
"rotation.title": "वर्तमान रोटेशन",
|
|
443
|
+
"rotation.sub": "राउंड रॉबिन ऊपर से शुरू",
|
|
444
|
+
"rotation.empty": "कोई इंजन सक्रिय नहीं।",
|
|
445
|
+
"rotation.manage": "इंजन प्रबंधित करें",
|
|
446
|
+
"health.title": "इंजन स्वास्थ्य",
|
|
447
|
+
"health.sub": "शेष कोटा",
|
|
448
|
+
"health.source.remote": "रिमोट",
|
|
449
|
+
"health.source.local": "स्थानीय गणना",
|
|
450
|
+
"health.source.none": "कोई निश्चित कोटा नहीं",
|
|
451
|
+
"health.off": "निष्क्रिय",
|
|
452
|
+
"recent.title": "हाल के कॉल",
|
|
453
|
+
"recent.all": "सभी देखें",
|
|
454
|
+
"recent.empty": "अभी कोई कॉल नहीं।",
|
|
455
|
+
"setup.title": "MCP सेटअप",
|
|
456
|
+
"setup.summary": "MCP सेटअप दिखाएँ",
|
|
457
|
+
"snippet.codex": "Codex — ~/.codex/config.toml",
|
|
458
|
+
"snippet.claude": "Claude Desktop / Claude Code",
|
|
459
|
+
"snippet.remote": "रिमोट (Streamable HTTP)",
|
|
460
|
+
|
|
461
|
+
"engines.title": "इंजन",
|
|
462
|
+
"engines.sub": "क्रम बदलने के लिए ड्रैग करें — राउंड रॉबिन ऊपर से शुरू",
|
|
463
|
+
"engines.stat": "{in} रोटेशन में · {total} में से {keys} कुंजियाँ सेट",
|
|
464
|
+
"engines.config": "कॉन्फ़िगर करें",
|
|
465
|
+
"engines.collapse": "छोटा करें",
|
|
466
|
+
"key.set": "API कुंजी दर्ज करें",
|
|
467
|
+
"key.replace": "कुंजी बदलें · वर्तमान: {masked}",
|
|
468
|
+
"key.clear": "कुंजी हटाएँ",
|
|
469
|
+
"extra.set": "सेट",
|
|
470
|
+
"btn.save": "सहेजें",
|
|
471
|
+
"btn.clear": "हटाएँ",
|
|
472
|
+
"btn.copy": "कॉपी",
|
|
473
|
+
"btn.copied": "कॉपी हो गया ✓",
|
|
474
|
+
"signup": "निःशुल्क कुंजी ↗",
|
|
475
|
+
"badge.keyless": "कुंजी अनावश्यक",
|
|
476
|
+
"badge.quota": "कोटा API",
|
|
477
|
+
"cap.search": "खोज",
|
|
478
|
+
"cap.fetch": "फ़ेच",
|
|
479
|
+
"test.running": "परीक्षण चल रहा है …",
|
|
480
|
+
"test.ok": "{count} परिणाम · {ms} ms",
|
|
481
|
+
"notice.nokeys": "No API keys configured. Available features and limits depend on the provider. Local calls are still counted; shared IP quotas are unknown. Add keys on the engine cards.",
|
|
482
|
+
|
|
483
|
+
"quota.remote": "{used} / {limit} · रिमोट",
|
|
484
|
+
"quota.local": "{used} / {limit} · स्थानीय गणना",
|
|
485
|
+
"quota.none": "कोई निश्चित कोटा नहीं",
|
|
486
|
+
"quota.error": "रिमोट कोटा त्रुटि: {error}",
|
|
487
|
+
"quota.free": "{pct}% शेष",
|
|
488
|
+
|
|
489
|
+
"history.title": "इतिहास",
|
|
490
|
+
"history.sub": "खोजें और फ़ेच · हर 5 सेकंड लाइव",
|
|
491
|
+
"history.clear": "इतिहास साफ़ करें",
|
|
492
|
+
"history.confirm": "क्या वाकई इतिहास साफ़ करना है?",
|
|
493
|
+
"history.empty": "अभी कोई प्रविष्टि नहीं।",
|
|
494
|
+
"history.emptyHint": "MCP सर्वर द्वारा खोज या फ़ेच करने पर यहाँ प्रविष्टि दिखाई देगी।",
|
|
495
|
+
"hist.filter.all": "सभी",
|
|
496
|
+
"hist.filter.search": "खोजें",
|
|
497
|
+
"hist.filter.fetch": "फ़ेच",
|
|
498
|
+
"hist.search.ph": "क्वेरी या इंजन से फ़िल्टर करें …",
|
|
499
|
+
"hist.pause": "लाइव रोकें",
|
|
500
|
+
"hist.resume": "लाइव जारी रखें",
|
|
501
|
+
"hist.shown": "{n} प्रविष्टियाँ · {f} विफल",
|
|
502
|
+
"hist.kind.search": "खोज",
|
|
503
|
+
"hist.kind.fetch": "फ़ेच",
|
|
504
|
+
"hist.failed": "विफल",
|
|
505
|
+
"hist.results": "{n} परिणाम",
|
|
506
|
+
"hist.chars": "{n} अक्षर",
|
|
507
|
+
"hist.attempts": "प्रयास शृंखला",
|
|
508
|
+
"hist.items": "परिणाम",
|
|
509
|
+
"hist.markdown": "Markdown अंश",
|
|
510
|
+
|
|
511
|
+
"toast.saved": "सहेजा गया",
|
|
512
|
+
"toast.copied": "क्लिपबोर्ड पर कॉपी किया गया",
|
|
513
|
+
"toast.error": "त्रुटि: {msg}",
|
|
514
|
+
"footer.text": "कोटा: स्थानीय कैलेंडर माह प्रति · रिमोट कोटा जहाँ उपलब्ध (5 मिनट कैश) · इतिहास हर 5 सेकंड, कोटा हर 30 सेकंड",
|
|
515
|
+
"api.unauthorized": "401 — इस डैशबोर्ड URL को <code>?token=…</code> के साथ खोलें (सर्वर लॉग में है)।",
|
|
516
|
+
},
|
|
517
|
+
|
|
518
|
+
es: {
|
|
519
|
+
"nav.overview": "Resumen",
|
|
520
|
+
"nav.engines": "Motores",
|
|
521
|
+
"nav.history": "Historial",
|
|
522
|
+
"theme.toLight": "Tema claro",
|
|
523
|
+
"theme.toDark": "Tema oscuro",
|
|
524
|
+
"lang.menu": "Elegir idioma",
|
|
525
|
+
|
|
526
|
+
"overview.title": "Resumen",
|
|
527
|
+
"overview.sub": "Pulso, rotación y cuotas de tus motores de búsqueda",
|
|
528
|
+
"stat.searches": "Búsquedas",
|
|
529
|
+
"stat.searchesSub": "este mes",
|
|
530
|
+
"stat.fetches": "Fetches",
|
|
531
|
+
"stat.fetchesSub": "este mes",
|
|
532
|
+
"stat.errors": "Tasa de error",
|
|
533
|
+
"stat.errorsSub": "de llamadas recientes",
|
|
534
|
+
"stat.duration": "Ø duración",
|
|
535
|
+
"stat.durationSub": "llamadas exitosas",
|
|
536
|
+
"stat.activity": "Actividad",
|
|
537
|
+
"stat.activitySub": "últimas 48 horas",
|
|
538
|
+
"rotation.title": "Rotación actual",
|
|
539
|
+
"rotation.sub": "El round robin empieza arriba",
|
|
540
|
+
"rotation.empty": "Ningún motor activado.",
|
|
541
|
+
"rotation.manage": "Administrar motores",
|
|
542
|
+
"health.title": "Salud de motores",
|
|
543
|
+
"health.sub": "Cuotas restantes",
|
|
544
|
+
"health.source.remote": "remota",
|
|
545
|
+
"health.source.local": "conteo local",
|
|
546
|
+
"health.source.none": "sin cuota fija",
|
|
547
|
+
"health.off": "inactivo",
|
|
548
|
+
"recent.title": "Llamadas recientes",
|
|
549
|
+
"recent.all": "Ver todas",
|
|
550
|
+
"recent.empty": "Aún no hay llamadas.",
|
|
551
|
+
"setup.title": "Configuración MCP",
|
|
552
|
+
"setup.summary": "Mostrar configuración MCP",
|
|
553
|
+
"snippet.codex": "Codex — ~/.codex/config.toml",
|
|
554
|
+
"snippet.claude": "Claude Desktop / Claude Code",
|
|
555
|
+
"snippet.remote": "Remoto (Streamable HTTP)",
|
|
556
|
+
|
|
557
|
+
"engines.title": "Motores",
|
|
558
|
+
"engines.sub": "Arrastra para ordenar — el round robin empieza arriba",
|
|
559
|
+
"engines.stat": "{in} en rotación · {keys} de {total} claves configuradas",
|
|
560
|
+
"engines.config": "Configurar",
|
|
561
|
+
"engines.collapse": "Contraer",
|
|
562
|
+
"key.set": "Introducir clave API",
|
|
563
|
+
"key.replace": "Reemplazar clave · actual: {masked}",
|
|
564
|
+
"key.clear": "Eliminar clave",
|
|
565
|
+
"extra.set": "configurado",
|
|
566
|
+
"btn.save": "Guardar",
|
|
567
|
+
"btn.clear": "Eliminar",
|
|
568
|
+
"btn.copy": "Copiar",
|
|
569
|
+
"btn.copied": "Copiado ✓",
|
|
570
|
+
"signup": "Clave gratis ↗",
|
|
571
|
+
"badge.keyless": "sin clave",
|
|
572
|
+
"badge.quota": "API de cuota",
|
|
573
|
+
"cap.search": "búsqueda",
|
|
574
|
+
"cap.fetch": "fetch",
|
|
575
|
+
"test.running": "Probando …",
|
|
576
|
+
"test.ok": "{count} resultados · {ms} ms",
|
|
577
|
+
"notice.nokeys": "No API keys configured. Available features and limits depend on the provider. Local calls are still counted; shared IP quotas are unknown. Add keys on the engine cards.",
|
|
578
|
+
|
|
579
|
+
"quota.remote": "{used} / {limit} · remota",
|
|
580
|
+
"quota.local": "{used} / {limit} · conteo local",
|
|
581
|
+
"quota.none": "sin cuota fija",
|
|
582
|
+
"quota.error": "Error de cuota remota: {error}",
|
|
583
|
+
"quota.free": "{pct}% libre",
|
|
584
|
+
|
|
585
|
+
"history.title": "Historial",
|
|
586
|
+
"history.sub": "Búsquedas y fetches · en vivo cada 5 s",
|
|
587
|
+
"history.clear": "Borrar historial",
|
|
588
|
+
"history.confirm": "¿Seguro que quieres borrar el historial?",
|
|
589
|
+
"history.empty": "Aún no hay entradas.",
|
|
590
|
+
"history.emptyHint": "En cuanto el servidor MCP ejecute una búsqueda o fetch, aparecerá aquí.",
|
|
591
|
+
"hist.filter.all": "Todas",
|
|
592
|
+
"hist.filter.search": "Búsquedas",
|
|
593
|
+
"hist.filter.fetch": "Fetches",
|
|
594
|
+
"hist.search.ph": "Filtrar por consulta o motor …",
|
|
595
|
+
"hist.pause": "Pausar en vivo",
|
|
596
|
+
"hist.resume": "Reanudar en vivo",
|
|
597
|
+
"hist.shown": "{n} entradas · {f} fallidas",
|
|
598
|
+
"hist.kind.search": "Búsqueda",
|
|
599
|
+
"hist.kind.fetch": "Fetch",
|
|
600
|
+
"hist.failed": "fallido",
|
|
601
|
+
"hist.results": "{n} resultados",
|
|
602
|
+
"hist.chars": "{n} caracteres",
|
|
603
|
+
"hist.attempts": "Cadena de intentos",
|
|
604
|
+
"hist.items": "Resultados",
|
|
605
|
+
"hist.markdown": "Extracto markdown",
|
|
606
|
+
|
|
607
|
+
"toast.saved": "Guardado",
|
|
608
|
+
"toast.copied": "Copiado al portapapeles",
|
|
609
|
+
"toast.error": "Error: {msg}",
|
|
610
|
+
"footer.text": "Cuotas: local por mes natural · remota cuando está disponible (caché 5 min) · historial cada 5 s, cuotas cada 30 s",
|
|
611
|
+
"api.unauthorized": "401 — abre esta URL del panel con <code>?token=…</code> (está en el log del servidor).",
|
|
612
|
+
},
|
|
613
|
+
|
|
614
|
+
fr: {
|
|
615
|
+
"nav.overview": "Aperçu",
|
|
616
|
+
"nav.engines": "Moteurs",
|
|
617
|
+
"nav.history": "Historique",
|
|
618
|
+
"theme.toLight": "Thème clair",
|
|
619
|
+
"theme.toDark": "Thème sombre",
|
|
620
|
+
"lang.menu": "Choisir la langue",
|
|
621
|
+
|
|
622
|
+
"overview.title": "Aperçu",
|
|
623
|
+
"overview.sub": "Pouls, rotation et quotas de vos moteurs de recherche",
|
|
624
|
+
"stat.searches": "Recherches",
|
|
625
|
+
"stat.searchesSub": "ce mois-ci",
|
|
626
|
+
"stat.fetches": "Fetchs",
|
|
627
|
+
"stat.fetchesSub": "ce mois-ci",
|
|
628
|
+
"stat.errors": "Taux d'erreur",
|
|
629
|
+
"stat.errorsSub": "des appels récents",
|
|
630
|
+
"stat.duration": "Ø durée",
|
|
631
|
+
"stat.durationSub": "appels réussis",
|
|
632
|
+
"stat.activity": "Activité",
|
|
633
|
+
"stat.activitySub": "48 dernières heures",
|
|
634
|
+
"rotation.title": "Rotation actuelle",
|
|
635
|
+
"rotation.sub": "Le round robin commence en haut",
|
|
636
|
+
"rotation.empty": "Aucun moteur activé.",
|
|
637
|
+
"rotation.manage": "Gérer les moteurs",
|
|
638
|
+
"health.title": "Santé des moteurs",
|
|
639
|
+
"health.sub": "Quotas restants",
|
|
640
|
+
"health.source.remote": "distant",
|
|
641
|
+
"health.source.local": "compté localement",
|
|
642
|
+
"health.source.none": "pas de quota fixe",
|
|
643
|
+
"health.off": "inactif",
|
|
644
|
+
"recent.title": "Appels récents",
|
|
645
|
+
"recent.all": "Tout voir",
|
|
646
|
+
"recent.empty": "Aucun appel pour l'instant.",
|
|
647
|
+
"setup.title": "Configuration MCP",
|
|
648
|
+
"setup.summary": "Afficher la configuration MCP",
|
|
649
|
+
"snippet.codex": "Codex — ~/.codex/config.toml",
|
|
650
|
+
"snippet.claude": "Claude Desktop / Claude Code",
|
|
651
|
+
"snippet.remote": "Distant (Streamable HTTP)",
|
|
652
|
+
|
|
653
|
+
"engines.title": "Moteurs",
|
|
654
|
+
"engines.sub": "Glisser-déposer pour réordonner — le round robin commence en haut",
|
|
655
|
+
"engines.stat": "{in} en rotation · {keys} clés sur {total} définies",
|
|
656
|
+
"engines.config": "Configurer",
|
|
657
|
+
"engines.collapse": "Replier",
|
|
658
|
+
"key.set": "Saisir la clé API",
|
|
659
|
+
"key.replace": "Remplacer la clé · actuelle : {masked}",
|
|
660
|
+
"key.clear": "Supprimer la clé",
|
|
661
|
+
"extra.set": "défini",
|
|
662
|
+
"btn.save": "Enregistrer",
|
|
663
|
+
"btn.clear": "Supprimer",
|
|
664
|
+
"btn.copy": "Copier",
|
|
665
|
+
"btn.copied": "Copié ✓",
|
|
666
|
+
"signup": "Clé gratuite ↗",
|
|
667
|
+
"badge.keyless": "sans clé",
|
|
668
|
+
"badge.quota": "API de quota",
|
|
669
|
+
"cap.search": "recherche",
|
|
670
|
+
"cap.fetch": "fetch",
|
|
671
|
+
"test.running": "Test en cours …",
|
|
672
|
+
"test.ok": "{count} résultats · {ms} ms",
|
|
673
|
+
"notice.nokeys": "No API keys configured. Available features and limits depend on the provider. Local calls are still counted; shared IP quotas are unknown. Add keys on the engine cards.",
|
|
674
|
+
|
|
675
|
+
"quota.remote": "{used} / {limit} · distant",
|
|
676
|
+
"quota.local": "{used} / {limit} · compté localement",
|
|
677
|
+
"quota.none": "pas de quota fixe",
|
|
678
|
+
"quota.error": "Erreur de quota distant : {error}",
|
|
679
|
+
"quota.free": "{pct}% libre",
|
|
680
|
+
|
|
681
|
+
"history.title": "Historique",
|
|
682
|
+
"history.sub": "Recherches et fetchs · en direct toutes les 5 s",
|
|
683
|
+
"history.clear": "Vider l'historique",
|
|
684
|
+
"history.confirm": "Vider vraiment l'historique ?",
|
|
685
|
+
"history.empty": "Aucune entrée pour le moment.",
|
|
686
|
+
"history.emptyHint": "Dès que le serveur MCP effectue une recherche ou un fetch, il apparaît ici.",
|
|
687
|
+
"hist.filter.all": "Toutes",
|
|
688
|
+
"hist.filter.search": "Recherches",
|
|
689
|
+
"hist.filter.fetch": "Fetchs",
|
|
690
|
+
"hist.search.ph": "Filtrer par requête ou moteur …",
|
|
691
|
+
"hist.pause": "Suspendre le direct",
|
|
692
|
+
"hist.resume": "Reprendre le direct",
|
|
693
|
+
"hist.shown": "{n} entrées · {f} échecs",
|
|
694
|
+
"hist.kind.search": "Recherche",
|
|
695
|
+
"hist.kind.fetch": "Fetch",
|
|
696
|
+
"hist.failed": "échec",
|
|
697
|
+
"hist.results": "{n} résultats",
|
|
698
|
+
"hist.chars": "{n} caractères",
|
|
699
|
+
"hist.attempts": "Chaîne d'essais",
|
|
700
|
+
"hist.items": "Résultats",
|
|
701
|
+
"hist.markdown": "Extrait markdown",
|
|
702
|
+
|
|
703
|
+
"toast.saved": "Enregistré",
|
|
704
|
+
"toast.copied": "Copié dans le presse-papiers",
|
|
705
|
+
"toast.error": "Erreur : {msg}",
|
|
706
|
+
"footer.text": "Quotas : local par mois calendaire · distant si disponible (cache 5 min) · historique toutes les 5 s, quotas toutes les 30 s",
|
|
707
|
+
"api.unauthorized": "401 — ouvrez cette URL du tableau de bord avec <code>?token=…</code> (voir journal du serveur).",
|
|
708
|
+
},
|
|
709
|
+
};
|