clauderipple 0.8.9 → 0.9.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/CHANGELOG.md +62 -0
- package/README.es.md +0 -4
- package/README.ja.md +0 -4
- package/README.ko.md +5 -1
- package/README.md +5 -1
- package/README.pt-BR.md +0 -4
- package/README.zh-CN.md +0 -4
- package/dist/app/dist/main.js +23 -3
- package/dist/app/package.json +1 -1
- package/dist/cli/src/codex.js +3 -1
- package/dist/cli/src/index.js +1 -1
- package/dist/cli/src/settings.js +5 -2
- package/dist/cli/src/tray.js +41 -5
- package/dist/mod/.claude-plugin/plugin.json +9 -1
- package/dist/mod/hooks/cache.ts +60 -0
- package/dist/mod/hooks/compact.ts +40 -0
- package/dist/mod/hooks/handoff.ts +43 -0
- package/dist/mod/hooks/i18n.ts +2716 -0
- package/dist/mod/hooks/judge.ts +226 -0
- package/dist/mod/hooks/ladder.js +179 -0
- package/dist/mod/hooks/ladder.ts +174 -0
- package/dist/mod/hooks/modes.ts +93 -0
- package/dist/mod/hooks/register.tsx +1458 -256
- package/dist/mod/hooks/session.ts +62 -0
- package/dist/mod/hooks/settings.js +342 -0
- package/dist/mod/hooks/settings.ts +321 -0
- package/dist/mod/hooks/stats.ts +59 -0
- package/dist/mod/hooks/ui/agents.tsx +138 -0
- package/dist/mod/hooks/ui/alerts.tsx +370 -0
- package/dist/mod/hooks/ui/art.ts +628 -0
- package/dist/mod/hooks/ui/band.tsx +836 -0
- package/dist/mod/hooks/ui/kit.tsx +258 -0
- package/dist/mod/hooks/ui/log.tsx +109 -0
- package/dist/mod/hooks/ui/parts.tsx +217 -0
- package/dist/mod/hooks/ui/ripple.ts +614 -0
- package/dist/mod/hooks/ui/settings.tsx +376 -0
- package/dist/mod/hooks/ui/setup.tsx +148 -0
- package/dist/mod/hooks/ui/theme.ts +217 -0
- package/dist/mod/hooks/ui/view.ts +371 -0
- package/dist/mod/hooks/worker.ts +1 -1
- package/dist/mod/hooks/workers.ts +217 -0
- package/dist/mod/tests/register.test.tsx +1730 -0
- package/dist/mod/tests/ui.test.tsx +853 -0
- package/dist/mod/tsconfig.json +2 -1
- package/dist/mod/types/index.d.ts +320 -1
- package/dist/router/src/admin.js +195 -53
- package/dist/router/src/agents.js +24 -5
- package/dist/router/src/bootstrap.js +4 -2
- package/dist/router/src/compat.js +10 -2
- package/dist/router/src/config.js +3 -0
- package/dist/router/src/health.js +33 -0
- package/dist/router/src/index.js +1 -0
- package/dist/router/src/ingress/models.js +4 -1
- package/dist/router/src/mod-settings.js +119 -0
- package/dist/router/src/model-policy.js +6 -0
- package/dist/router/src/model-scores.js +159 -0
- package/dist/router/src/picker.js +7 -0
- package/dist/router/src/providers/anthropic-account-pool.js +10 -4
- package/dist/router/src/providers/anthropic-accounts.js +26 -1
- package/dist/router/src/providers/chatgpt/catalog.js +45 -14
- package/dist/router/src/providers/chatgpt/index.js +9 -3
- package/dist/router/src/providers/chatgpt/translate.js +9 -5
- package/dist/router/src/providers/google/index.js +6 -2
- package/dist/router/src/providers/openai/index.js +4 -1
- package/dist/router/src/providers/openai/translate.js +1 -1
- package/dist/router/src/proxy.js +14 -3
- package/dist/router/src/version.js +1 -1
- package/dist/ui/app.js +932 -209
- package/dist/ui/favicon-32.png +0 -0
- package/dist/ui/favicon.svg +12 -0
- package/dist/ui/i18n.js +923 -237
- package/dist/ui/index.html +159 -87
- package/dist/ui/style.css +789 -408
- package/docs/ARCHITECTURE.md +134 -2
- package/package.json +7 -3
|
@@ -0,0 +1,2716 @@
|
|
|
1
|
+
// Pure display strings. Model-facing prompts intentionally stay in English.
|
|
2
|
+
import type { Lang } from '../types'
|
|
3
|
+
export type { Lang } from '../types'
|
|
4
|
+
|
|
5
|
+
const EN = {
|
|
6
|
+
// Band (including shared display labels and accessibility text).
|
|
7
|
+
'band.brand': 'ClaudeRipple',
|
|
8
|
+
'band.effort': 'Effort',
|
|
9
|
+
'band.model': 'Model',
|
|
10
|
+
'band.auto': 'Auto',
|
|
11
|
+
'band.manual': 'Manual',
|
|
12
|
+
'band.paused': 'Paused',
|
|
13
|
+
'band.off': 'Off',
|
|
14
|
+
'band.on': 'On',
|
|
15
|
+
'band.autoOff': 'Auto off',
|
|
16
|
+
'band.autoPaused': 'auto paused',
|
|
17
|
+
'band.deciding': 'Deciding…',
|
|
18
|
+
'band.decidingText': '◌ deciding…',
|
|
19
|
+
'band.low': 'Low',
|
|
20
|
+
'band.medium': 'Medium',
|
|
21
|
+
'band.high': 'High',
|
|
22
|
+
'band.xhigh': 'X-High',
|
|
23
|
+
'band.max': 'Max',
|
|
24
|
+
'band.pausedHint': 'Auto pauses on this model: effort changes there are not known to keep the cache.',
|
|
25
|
+
'band.offHint': 'Auto is off; the effort is yours.',
|
|
26
|
+
'band.decidingHint': 'The judge is picking the effort for this prompt.',
|
|
27
|
+
'band.effortTitle': 'Effort {value}{hint} · Click to pick an effort',
|
|
28
|
+
'band.effortAlt': 'Effort {value} ({mode}){why}',
|
|
29
|
+
'band.context': 'Context',
|
|
30
|
+
'band.contextAlt': 'Context {value} of {window} ({tokens} tokens)',
|
|
31
|
+
'band.cache': 'Cache',
|
|
32
|
+
'band.cacheWarm': 'Cache · Warm',
|
|
33
|
+
'band.cacheStopped': 'Cache · Warm stopped',
|
|
34
|
+
'band.cold': 'cold',
|
|
35
|
+
'band.cacheTip': 'Prompt cache {state}{warm}',
|
|
36
|
+
'band.warmFor': 'warm for {time}',
|
|
37
|
+
'band.expired': 'expired',
|
|
38
|
+
'band.warmStoppedTip': ' · keep-warm stopped: {reason}',
|
|
39
|
+
'band.warmOnTip': ' · keep-warm on, {count} pings',
|
|
40
|
+
'band.noReply': 'No reply yet',
|
|
41
|
+
'band.cacheAlt': 'Cache {state}{warm}',
|
|
42
|
+
'band.timeLeft': '{time} left',
|
|
43
|
+
'band.unknown': 'unknown',
|
|
44
|
+
'band.keepWarmAlt': ', keep warm on{count}',
|
|
45
|
+
'band.limitCaption': '{window} limit{save}',
|
|
46
|
+
'band.saveCaption': ' · SAVE',
|
|
47
|
+
'band.limitAlt': '{window} limit {value}{reset}',
|
|
48
|
+
'band.fiveHour': '5-hour',
|
|
49
|
+
'band.weekly': 'Weekly',
|
|
50
|
+
'band.resetting': 'resetting',
|
|
51
|
+
'band.resetsIn': 'resets in {time}',
|
|
52
|
+
'band.resetsAt': 'resets {time}',
|
|
53
|
+
'band.router': 'Router',
|
|
54
|
+
'band.routerAlt': 'Router: {value}',
|
|
55
|
+
'band.resentCaption': 'RESENT · {status}',
|
|
56
|
+
'band.failedCaption': 'FAILED · {status}',
|
|
57
|
+
'band.lastRoute': 'LAST ROUTE',
|
|
58
|
+
'band.logHint': 'Click for the request log',
|
|
59
|
+
'band.routeAlt': 'Last route: {model} via {provider}{effort}{cache}, {time}{status}',
|
|
60
|
+
'band.routeCache': ', cache {percent}%',
|
|
61
|
+
'band.routeResent': ', resent {status}',
|
|
62
|
+
'band.routeFailed': ', failed {status}',
|
|
63
|
+
'band.warm': 'Warm',
|
|
64
|
+
'band.handoff': 'Handoff',
|
|
65
|
+
'band.compact': 'Compact',
|
|
66
|
+
'band.log': 'Log',
|
|
67
|
+
'band.agents': 'Agents',
|
|
68
|
+
'band.settings': 'Settings',
|
|
69
|
+
'band.effortShort': 'Effort',
|
|
70
|
+
'band.hit': 'hit {percent}%',
|
|
71
|
+
'band.effortAutoAlt': 'Effort Auto {state}',
|
|
72
|
+
'band.warmAlt': 'Keep cache warm {state}',
|
|
73
|
+
'band.handoffAdvised': 'Handoff (advised: a fresh chat pays now)',
|
|
74
|
+
'band.closeLog': 'Close the request log',
|
|
75
|
+
'band.openLog': 'Open the request log',
|
|
76
|
+
'band.agentsAlt': 'Agents: {count} running',
|
|
77
|
+
'band.settingsAlt': 'Ripple settings',
|
|
78
|
+
'band.warmStopped': 'warm stopped',
|
|
79
|
+
'band.warmText': '≈warm',
|
|
80
|
+
'band.save': 'save',
|
|
81
|
+
'band.resent': '{status} resent',
|
|
82
|
+
'band.cachePercent': 'cache {percent}%',
|
|
83
|
+
'band.closeLogText': 'Close log',
|
|
84
|
+
'band.footerPaused': ' (paused)',
|
|
85
|
+
'band.footerOff': ' (auto off)',
|
|
86
|
+
'band.footerManual': ' (manual)',
|
|
87
|
+
'band.footerContext': 'ctx {percent}%',
|
|
88
|
+
'band.routerRestart': 'ClaudeRipple: restart the router to show routes here',
|
|
89
|
+
'band.routerDown': 'ClaudeRipple: router not answering',
|
|
90
|
+
// Alerts.
|
|
91
|
+
'alerts.coldTitle': 'The cache went cold',
|
|
92
|
+
'alerts.coldBody': 'It sat {minutes} min, so the next prompt re-reads all {tokens} tokens at full price.',
|
|
93
|
+
'alerts.swampTitle': 'Context {percent}% full',
|
|
94
|
+
'alerts.swampBody': '{tokens} tokens ride along with every prompt: slower, dearer, blurrier.',
|
|
95
|
+
'alerts.hotTitle': '{window} limit at {percent}%',
|
|
96
|
+
'alerts.saveOnBody': 'Save mode is on: Auto stays at medium or below until the reset.',
|
|
97
|
+
'alerts.saveBody': 'Save mode holds Auto at medium or below until the reset.',
|
|
98
|
+
'alerts.saveOff': 'Turn save mode off',
|
|
99
|
+
'alerts.save': 'Save mode',
|
|
100
|
+
'alerts.notNow': 'Not now',
|
|
101
|
+
'alerts.judgeTitle': 'The effort judge is not answering',
|
|
102
|
+
'alerts.judgeNetworkTitle': 'The connection is unsteady; Haiku is judging for now',
|
|
103
|
+
'alerts.routerModel': 'The router model',
|
|
104
|
+
'alerts.judgeBody': '{judge}: {reason}. {fallback}',
|
|
105
|
+
'alerts.keepEffort': 'The current effort stays meanwhile.',
|
|
106
|
+
'alerts.askHaiku': 'Haiku judges meanwhile.',
|
|
107
|
+
'alerts.openSettings': 'Open settings',
|
|
108
|
+
'alerts.compactTitle': 'Compact this chat',
|
|
109
|
+
'alerts.compactBody': 'Say what the summary must keep, or leave it to the summary.',
|
|
110
|
+
'alerts.cancel': 'Cancel',
|
|
111
|
+
'alerts.handoffTitle': 'Hand off to a fresh chat',
|
|
112
|
+
'alerts.quickBody': 'Quick: a summary from the cache that the new chat picks up.',
|
|
113
|
+
'alerts.fullBody': 'Full: the handoff skill checks git and writes HANDOFF.md first.',
|
|
114
|
+
'alerts.go': 'Go',
|
|
115
|
+
'alerts.dismiss': 'Dismiss',
|
|
116
|
+
'alerts.handingOff': 'Handing off…',
|
|
117
|
+
'alerts.fullProgress': 'Running the handoff: checking git and writing HANDOFF.md.',
|
|
118
|
+
'alerts.quickProgress': 'Writing a summary a fresh chat can resume from.',
|
|
119
|
+
'alerts.handoffDone': 'Handoff done',
|
|
120
|
+
'alerts.summaryReady': 'The summary is ready.',
|
|
121
|
+
'alerts.copyAgain': 'Copy again',
|
|
122
|
+
'alerts.compacting': 'Compacting…',
|
|
123
|
+
'alerts.compactingBody': 'Summarizing the chat; it continues from the summary.',
|
|
124
|
+
'alerts.compacted': 'Compacted',
|
|
125
|
+
'alerts.compactedBody': 'The chat continues from the summary.',
|
|
126
|
+
'alerts.failed': 'That did not finish',
|
|
127
|
+
'alerts.unchanged': 'Nothing was changed.',
|
|
128
|
+
'alerts.keep': 'Keep',
|
|
129
|
+
'alerts.keepPlaceholder': 'decisions, open questions, file names… (optional)',
|
|
130
|
+
'alerts.compactSubmit': 'compact',
|
|
131
|
+
'alerts.quick': 'Quick',
|
|
132
|
+
'alerts.full': 'Full',
|
|
133
|
+
'alerts.continue': 'New session now',
|
|
134
|
+
'alerts.confirm': 'Ask first',
|
|
135
|
+
'alerts.copy': 'Copy only',
|
|
136
|
+
'alerts.continueHint': 'Opens a new session in this folder with the handoff filled in; press Enter there to go on. This chat stays.',
|
|
137
|
+
'alerts.confirmHint': 'Writes the summary and stops; you choose whether to move to a new session. This chat stays.',
|
|
138
|
+
'alerts.copyHint': 'Copies the summary to the clipboard; nothing else changes.',
|
|
139
|
+
'alerts.handoffReady': 'Handoff ready',
|
|
140
|
+
'alerts.handoffReadyBody': 'Move to a new session in this folder? This chat stays as it is.',
|
|
141
|
+
'alerts.openNew': 'Move to a new session',
|
|
142
|
+
'alerts.openedBody': 'A new session opened with the handoff filled in: press Enter there to go on.',
|
|
143
|
+
'alerts.readHandoffFile': 'Read the handoff in {path} and continue from it.',
|
|
144
|
+
'alerts.copyText': 'Copy',
|
|
145
|
+
'toasts.newSessionFallback': 'Could not open a new session; the handoff is copied instead.',
|
|
146
|
+
'alerts.kind': 'Kind ',
|
|
147
|
+
'alerts.then': 'Then ',
|
|
148
|
+
'alerts.demoDown': 'Jev out of credits (demo)',
|
|
149
|
+
'alerts.copied': 'The resume note was copied; this chat was kept.',
|
|
150
|
+
'alerts.compactFailed': 'Compaction did not finish.',
|
|
151
|
+
// Settings.
|
|
152
|
+
'settings.effortBlurb': 'How Auto picks the effort for each prompt you send.',
|
|
153
|
+
'settings.workers': 'Workers',
|
|
154
|
+
'settings.mode': 'Mode',
|
|
155
|
+
'settings.modeNone': 'Base',
|
|
156
|
+
'band.mode': 'Mode',
|
|
157
|
+
'band.modeTip': 'Mode “{name}” is on: the workers follow it. Change it in quick settings.',
|
|
158
|
+
'settings.workersBlurb': 'Which agent runs each kind of delegated task.',
|
|
159
|
+
'settings.judge': 'Judge',
|
|
160
|
+
'settings.judgeBlurb': 'Who decides: effort for prompts, tier for tasks.',
|
|
161
|
+
'settings.cacheBlurb': 'Keep the prompt cache warm while you step away.',
|
|
162
|
+
'settings.handoff': 'Compact & Handoff',
|
|
163
|
+
'settings.handoffBlurb': 'How a heavy chat is compacted or handed to a fresh one.',
|
|
164
|
+
'settings.look': 'Look',
|
|
165
|
+
'settings.lookBlurb': 'What the band shows and how.',
|
|
166
|
+
'settings.light': 'Light',
|
|
167
|
+
'settings.lightBlurb': 'chores, repetition, lookups',
|
|
168
|
+
'settings.standard': 'Standard',
|
|
169
|
+
'settings.standardBlurb': 'designed builds, research, review',
|
|
170
|
+
'settings.deep': 'Deep',
|
|
171
|
+
'settings.deepBlurb': 'careful, high-stakes, hard reasoning',
|
|
172
|
+
'settings.design': 'Design',
|
|
173
|
+
'settings.designBlurb': 'UI, visual, brand',
|
|
174
|
+
'settings.tierAlt': '{name} tier',
|
|
175
|
+
'settings.biasAlt': 'Bias {value}{selected}',
|
|
176
|
+
'settings.selected': ' (selected)',
|
|
177
|
+
'settings.onSuffix': ' (on)',
|
|
178
|
+
'settings.offSuffix': ' (off)',
|
|
179
|
+
'settings.mixedSuffix': ' (some on)',
|
|
180
|
+
'settings.cheaper': 'Cheaper',
|
|
181
|
+
'settings.smarter': 'Smarter',
|
|
182
|
+
'settings.autoHint': 'picks per prompt; your own pick turns it off',
|
|
183
|
+
'settings.lean': 'Lean',
|
|
184
|
+
'settings.leanHint': 'tips close calls only',
|
|
185
|
+
'settings.floor': 'Never below',
|
|
186
|
+
'settings.ceiling': 'Never above',
|
|
187
|
+
'settings.floorWins': 'below the floor: the floor wins',
|
|
188
|
+
'settings.unavailable': ' (unavailable)',
|
|
189
|
+
'settings.takesOver': 'Takes over',
|
|
190
|
+
'settings.autoAgent': 'ripple:auto',
|
|
191
|
+
'settings.allSpawns': 'All spawns',
|
|
192
|
+
'settings.fallback': 'Fallback',
|
|
193
|
+
'settings.fallbackHint': 'when a tier’s provider is out of quota',
|
|
194
|
+
'settings.haiku': 'Haiku',
|
|
195
|
+
'settings.jev': 'Jev',
|
|
196
|
+
'settings.routerModel': 'Router model',
|
|
197
|
+
'settings.haikuHint': 'Haiku 5.5 on your Claude login · about a second a prompt',
|
|
198
|
+
'settings.keyEnv': 'from TYPESAFE_API_KEY',
|
|
199
|
+
'settings.keyFile': 'saved in ~/.config/jev/.env',
|
|
200
|
+
'settings.keySaved': 'saved',
|
|
201
|
+
'settings.keyPaste': 'paste a TypeSafe API key',
|
|
202
|
+
'settings.saveKey': 'save',
|
|
203
|
+
'settings.testing': 'Testing…',
|
|
204
|
+
'settings.keyWorks': 'Key works',
|
|
205
|
+
'settings.keyRejected': 'Key rejected',
|
|
206
|
+
'settings.key': 'Key',
|
|
207
|
+
'settings.test': 'Test',
|
|
208
|
+
'settings.noModels': 'no router models listed',
|
|
209
|
+
'settings.haikuFallback': 'falls back to Haiku',
|
|
210
|
+
'settings.keepWarm': 'Keep warm',
|
|
211
|
+
'settings.keepWarmHint': 'pings the cache just before it expires',
|
|
212
|
+
'settings.for': 'For',
|
|
213
|
+
'settings.afterReply': 'after the last reply',
|
|
214
|
+
'settings.chatsFrom': 'Chats from',
|
|
215
|
+
'settings.tokens': 'tokens',
|
|
216
|
+
'settings.warmCost': 'Each ping re-reads the whole chat from cache: about a tenth of its input price, and the same share of plan limits.',
|
|
217
|
+
'settings.noSkill': 'None: a turn writes HANDOFF.md',
|
|
218
|
+
'settings.compactWith': 'Compact with',
|
|
219
|
+
'settings.sessionCompactor': 'The session’s own',
|
|
220
|
+
'settings.afterHandoff': 'After handoff',
|
|
221
|
+
'settings.handoffButton': 'Handoff button',
|
|
222
|
+
'settings.whenAdvised': 'When advised',
|
|
223
|
+
'settings.always': 'Always',
|
|
224
|
+
'settings.fullHandoff': 'Full handoff',
|
|
225
|
+
'settings.heavyAt': 'Heavy at',
|
|
226
|
+
'settings.context': 'context',
|
|
227
|
+
'settings.cacheTimer': 'Cache timer',
|
|
228
|
+
'settings.reason': 'Reason',
|
|
229
|
+
'settings.route': 'Route',
|
|
230
|
+
'settings.limits': 'Limits',
|
|
231
|
+
'settings.layout': 'Layout',
|
|
232
|
+
'settings.dashboard': 'Dashboard',
|
|
233
|
+
'settings.minimal': 'Minimal',
|
|
234
|
+
'settings.footerHint': 'one line in the footer',
|
|
235
|
+
'settings.appearance': 'Appearance',
|
|
236
|
+
'settings.dark': 'Dark',
|
|
237
|
+
'settings.lightAppearance': 'Light',
|
|
238
|
+
'settings.show': 'Show',
|
|
239
|
+
'settings.language': 'Language',
|
|
240
|
+
'settings.title': 'settings',
|
|
241
|
+
'settings.quick': 'Quick settings',
|
|
242
|
+
'settings.effortAuto': 'Automatic effort',
|
|
243
|
+
'settings.openAll': 'Open all settings',
|
|
244
|
+
'setup.workersNote': 'Workers start on the ladder; set it up on the dashboard.',
|
|
245
|
+
'setup.changeDashboard': 'Use the band or /ripple for quick changes; open all settings for the dashboard.',
|
|
246
|
+
'settings.save': 'Save',
|
|
247
|
+
'settings.discard': 'Discard',
|
|
248
|
+
'settings.close': 'Close',
|
|
249
|
+
'settings.autoLine': 'Picks the effort for every prompt by itself.',
|
|
250
|
+
'settings.autoOffNote': 'The level you pick in the app’s effort menu stays.',
|
|
251
|
+
'settings.judgeLine': 'Sets each prompt’s effort and each delegated task’s tier.',
|
|
252
|
+
'settings.modeLine': 'The set of agents that delegated tasks go to.',
|
|
253
|
+
'settings.warmLine': 'Pings the cache just before it goes cold.',
|
|
254
|
+
'settings.warmCostShort': 'Each ping costs about a tenth of the input price.',
|
|
255
|
+
'settings.sayAuto': '{judge} picks the effort for every prompt.',
|
|
256
|
+
'settings.sayManual': 'Effort stays where you set it in the app.',
|
|
257
|
+
'settings.sayWarm': 'And I’ll keep the cache warm.',
|
|
258
|
+
'band.hideBand': 'Hide the band',
|
|
259
|
+
'settings.unsaved': '● unsaved',
|
|
260
|
+
// Setup.
|
|
261
|
+
'setup.judgeTitle': 'Who decides',
|
|
262
|
+
'setup.judgeBlurb': 'A small, fast judge picks each prompt’s effort and each task’s worker.',
|
|
263
|
+
'setup.workersTitle': 'Who does the work',
|
|
264
|
+
'setup.cacheTitle': 'Keep the cache warm?',
|
|
265
|
+
'setup.cacheBlurb': 'An idle chat’s cache expires; Ripple can ping it while you are away.',
|
|
266
|
+
'setup.effortSummary': 'Auto {state}, judged by {judge}',
|
|
267
|
+
'setup.cacheSummary': 'kept warm for {hours}h after each reply',
|
|
268
|
+
'setup.cacheOff': 'not kept warm',
|
|
269
|
+
'setup.ready': 'ClaudeRipple is ready',
|
|
270
|
+
'setup.welcome': 'Welcome to ClaudeRipple',
|
|
271
|
+
'setup.start': 'Start',
|
|
272
|
+
'setup.finish': 'Finish',
|
|
273
|
+
'setup.next': 'Next',
|
|
274
|
+
'setup.back': 'Back',
|
|
275
|
+
'setup.skip': 'Skip setup',
|
|
276
|
+
// Agents.
|
|
277
|
+
'agents.waiting': 'waiting',
|
|
278
|
+
'agents.routerModel': 'router model',
|
|
279
|
+
'agents.marker': 'marker',
|
|
280
|
+
'agents.default': 'default',
|
|
281
|
+
'agents.by': 'by {name}',
|
|
282
|
+
'agents.thinking': 'thinking',
|
|
283
|
+
'agents.fallback': '▲ ran the fallback: {reason}',
|
|
284
|
+
'agents.emptyTitle': 'No agents yet',
|
|
285
|
+
'agents.emptyBody': 'Tasks Claude delegates appear here, with the worker Ripple picked and why.',
|
|
286
|
+
'agents.liveCount': '{count} running',
|
|
287
|
+
'agents.noneRunning': 'None running',
|
|
288
|
+
'agents.doneCount': '{count} finished',
|
|
289
|
+
// Log.
|
|
290
|
+
'log.resent': '↻ {status} resent',
|
|
291
|
+
'log.input': 'in {tokens}',
|
|
292
|
+
'log.output': 'out {tokens}',
|
|
293
|
+
'log.thisSession': 'This session',
|
|
294
|
+
'log.allSessions': 'All sessions',
|
|
295
|
+
'log.showAll': 'Show all sessions',
|
|
296
|
+
'log.onlySession': 'This session only',
|
|
297
|
+
'log.legend': '● this session ○ other sessions',
|
|
298
|
+
'log.empty': 'No model requests yet.',
|
|
299
|
+
'log.judge': 'Effort judge',
|
|
300
|
+
'log.judgeWorker': 'Worker judge',
|
|
301
|
+
'log.judgeFell': '{asked} failed → {by}',
|
|
302
|
+
'log.sure': 'sure {percent}%',
|
|
303
|
+
// Toasts and locally generated failure/reason text.
|
|
304
|
+
'toasts.keySingle': 'Paste a single TypeSafe API key',
|
|
305
|
+
'toasts.keyPrivateFailed': 'Could not make the Jev key file private (chmod 600)',
|
|
306
|
+
'toasts.keySaved': 'ClaudeRipple: Jev key saved privately; environment keys still take priority.',
|
|
307
|
+
'toasts.judgeDown': 'ClaudeRipple: {reason}; keeping the current effort or asking Haiku.',
|
|
308
|
+
'toasts.keyMissing': 'Jev key missing',
|
|
309
|
+
'toasts.jevNoVerdict': 'Jev returned no verdict',
|
|
310
|
+
'judge.keptUnsure': 'Unsure, kept the running effort',
|
|
311
|
+
'toasts.routerNoVerdict': 'Router judge returned no verdict',
|
|
312
|
+
'toasts.haikuNoVerdict': 'Haiku returned no verdict',
|
|
313
|
+
'toasts.noVerdict': 'no verdict',
|
|
314
|
+
'toasts.judgeUnavailable': 'judge unavailable',
|
|
315
|
+
'toasts.explicitMarker': 'explicit worker marker',
|
|
316
|
+
'toasts.workerFallback': 'ClaudeRipple: {reason}; running {name}.',
|
|
317
|
+
'toasts.modeEnded': 'The {name} mode has ended.',
|
|
318
|
+
'toasts.yourPick': 'your pick',
|
|
319
|
+
'toasts.effortEnter': 'ClaudeRipple: press Enter so the app effort control follows your pick.',
|
|
320
|
+
'toasts.settingsSaved': 'ClaudeRipple: settings saved.',
|
|
321
|
+
'toasts.clipboardFallback': 'ClaudeRipple: clipboard unavailable; the resume note is in the prompt.',
|
|
322
|
+
'toasts.handoffFailed': 'ClaudeRipple: handoff failed; nothing was cleared.',
|
|
323
|
+
'toasts.compactFailed': 'ClaudeRipple: compaction failed; the chat was kept.',
|
|
324
|
+
'toasts.warmStopped': 'ClaudeRipple: {reason}',
|
|
325
|
+
'toasts.warmBoundReason': 'Keep warm stopped: time bound reached',
|
|
326
|
+
'toasts.warmBound': 'ClaudeRipple: keep warm stopped at its time bound.',
|
|
327
|
+
'toasts.appEffort': 'app effort',
|
|
328
|
+
'toasts.appEffortChanged': 'app effort changed',
|
|
329
|
+
'toasts.autoOff': 'ClaudeRipple: your app effort change turned Auto off.',
|
|
330
|
+
'toasts.handoffEmpty': 'ClaudeRipple: handoff produced no answer; nothing was cleared.',
|
|
331
|
+
'toasts.ownModel': 'ClaudeRipple: {name} runs on its own model, not "{model}"',
|
|
332
|
+
'toasts.transcriptEmpty': 'Transcript is empty or over the compaction budget',
|
|
333
|
+
'toasts.summaryEmpty': 'Haiku returned no usable summary',
|
|
334
|
+
'toasts.compactFallback': 'ClaudeRipple: Haiku compaction failed; using the session compactor.',
|
|
335
|
+
'toasts.error': 'ClaudeRipple: {reason}',
|
|
336
|
+
'toasts.jevTimeout': 'Jev timed out',
|
|
337
|
+
'toasts.jevRejected': 'Jev key rejected',
|
|
338
|
+
'toasts.jevCredits': 'Jev out of credits',
|
|
339
|
+
'toasts.jevRateLimited': 'Jev rate limited',
|
|
340
|
+
'toasts.jevHttp': 'Jev request failed ({status})',
|
|
341
|
+
'toasts.warmNoReply': 'Keep warm stopped: no fork reply',
|
|
342
|
+
'toasts.warmNoCache': 'Keep warm stopped: cache was not read',
|
|
343
|
+
'toasts.providerQuota': 'ChatGPT accounts are unavailable or out of quota',
|
|
344
|
+
'toasts.saveMode': 'save mode',
|
|
345
|
+
'toasts.yourSettings': 'your settings',
|
|
346
|
+
'toasts.jevNetwork': 'Jev network unavailable',
|
|
347
|
+
'toasts.workerMissing': '{name} is not installed',
|
|
348
|
+
// Commands (stats and debug labels included).
|
|
349
|
+
'commands.description': 'ClaudeRipple effort, workers, cache and session tools',
|
|
350
|
+
'commands.argumentHint': 'settings|setup|auto|warm|save|handoff [full]|stats|debug|agents|log|bar|cold|swamp|hot|down',
|
|
351
|
+
'commands.logDescription': 'Open or close the ClaudeRipple request log',
|
|
352
|
+
'commands.barDescription': 'Show or hide the ClaudeRipple band',
|
|
353
|
+
'commands.logTitle': 'ClaudeRipple',
|
|
354
|
+
'commands.agentsTitle': 'ClaudeRipple Agents',
|
|
355
|
+
'commands.help': 'ClaudeRipple: settings, setup, auto, warm, save, handoff [full], stats, debug, agents, log, bar, cold, swamp, hot, down.',
|
|
356
|
+
'commands.done': 'ClaudeRipple: {command}.',
|
|
357
|
+
'commands.logOpened': 'ClaudeRipple log opened.',
|
|
358
|
+
'commands.logClosed': 'ClaudeRipple log closed.',
|
|
359
|
+
'commands.barShown': 'ClaudeRipple line shown above the prompt.',
|
|
360
|
+
'commands.barHidden': 'ClaudeRipple line hidden. /ripple-bar shows it again.',
|
|
361
|
+
'commands.statsAuto': 'Auto: {prompts} prompts, {requests} requests; {total} weighted tokens',
|
|
362
|
+
'commands.statsTokens': 'Tokens: input {input}, write {write}, read {read}, output {output}',
|
|
363
|
+
'commands.statsEffort': '{effort} {prompts} prompts / {cost} weighted',
|
|
364
|
+
'commands.statsJudges': 'Judges: haiku {haiku}, jev {jev}, model {model}; {tokens} tokens, {ms} ms ({avg} ms avg)',
|
|
365
|
+
'commands.statsWorkers': 'Workers: {workers}',
|
|
366
|
+
'commands.statsWarm': 'Warm: {pings} pings, {cost} weighted tokens',
|
|
367
|
+
'commands.debugJudge': 'judge',
|
|
368
|
+
'commands.debugJudgeModel': 'judgeModel',
|
|
369
|
+
'commands.debugPick': 'pick',
|
|
370
|
+
'commands.debugPaused': 'paused',
|
|
371
|
+
'commands.debugCache': 'cache',
|
|
372
|
+
'commands.debugWarm': 'warm',
|
|
373
|
+
'commands.debugLastSpawn': 'lastSpawn',
|
|
374
|
+
'commands.debugLastRequest': 'lastRequest',
|
|
375
|
+
'commands.debugEffort': 'effort',
|
|
376
|
+
'commands.debugWhy': 'why',
|
|
377
|
+
'commands.debugBy': 'by',
|
|
378
|
+
'commands.debugAt': 'at',
|
|
379
|
+
'commands.debugSure': 'sure',
|
|
380
|
+
'commands.debugTtlMs': 'ttlMs',
|
|
381
|
+
'commands.debugLastReplyAt': 'lastReplyAt',
|
|
382
|
+
'commands.debugExpiresAt': 'expiresAt',
|
|
383
|
+
'commands.debugPings': 'pings',
|
|
384
|
+
'commands.debugCost': 'cost',
|
|
385
|
+
'commands.debugStopped': 'stopped',
|
|
386
|
+
'commands.debugLastPingAt': 'lastPingAt',
|
|
387
|
+
'commands.debugTier': 'tier',
|
|
388
|
+
'commands.debugTarget': 'target',
|
|
389
|
+
'commands.debugAgent': 'agent',
|
|
390
|
+
'commands.debugModel': 'model',
|
|
391
|
+
'commands.debugMs': 'ms',
|
|
392
|
+
'commands.debugFallbackReason': 'fallbackReason',
|
|
393
|
+
'commands.debugAppEffort': 'appEffort',
|
|
394
|
+
'commands.debugSentEffort': 'sentEffort',
|
|
395
|
+
'commands.debugLog': 'ClaudeRipple {where}: {reason}',
|
|
396
|
+
'commands.routerHttp': 'router HTTP {status}',
|
|
397
|
+
'commands.compactSkip': 'ClaudeRipple summarizes with Haiku when compaction is needed.',
|
|
398
|
+
// Workers card, Jev source, and worker picks in the Agents pane.
|
|
399
|
+
'workers.previous': 'Previous',
|
|
400
|
+
'workers.next': 'Next',
|
|
401
|
+
'workers.page': 'Page {page} of {pages}',
|
|
402
|
+
'workers.general': 'General',
|
|
403
|
+
'workers.design': 'Design',
|
|
404
|
+
'workers.frontend': 'Frontend',
|
|
405
|
+
'workers.backend': 'Backend',
|
|
406
|
+
'workers.infra': 'Infrastructure',
|
|
407
|
+
'workers.data': 'Data',
|
|
408
|
+
'workers.test': 'Tests',
|
|
409
|
+
'workers.docs': 'Documentation',
|
|
410
|
+
'workers.research': 'Research',
|
|
411
|
+
'workers.mode': 'Mode',
|
|
412
|
+
'workers.rung.light': 'Low worker',
|
|
413
|
+
'workers.rung.standard': 'Medium worker',
|
|
414
|
+
'workers.rung.hard': 'High worker',
|
|
415
|
+
'workers.rung.plan': 'Max worker',
|
|
416
|
+
'workers.rungHint.light': 'Finding files, quick lookups, skimming logs, mechanical edits',
|
|
417
|
+
'workers.rungHint.standard': 'Specified implementation, refactors, summaries, drafts',
|
|
418
|
+
'workers.rungHint.hard': 'Hard debugging, multi-file changes, independent review and rebuttal',
|
|
419
|
+
'workers.rungHint.plan': 'Best result available: planning, design, architecture, opinions',
|
|
420
|
+
'workers.rungEmpty': '{rung} has no model set',
|
|
421
|
+
'workers.notCandidate': '{name} is not a candidate here',
|
|
422
|
+
'workers.sessionModel': 'the session\'s model',
|
|
423
|
+
'workers.offset': 'Effort offset',
|
|
424
|
+
'workers.anyEffort': 'Any effort',
|
|
425
|
+
'workers.noTarget': 'Use next level / fallback',
|
|
426
|
+
'workers.judgeBlurb': 'Who decides: effort for prompts, domain and level for tasks.',
|
|
427
|
+
'workers.disabled': '{provider} is switched off',
|
|
428
|
+
'workers.nested': 'A subagent may not start another subagent: do this part yourself, then report back.',
|
|
429
|
+
'workers.none': 'No enabled worker is available',
|
|
430
|
+
'workers.loading': 'Loading the router\'s workers…',
|
|
431
|
+
'workers.providerSub': '{on} of {count} on',
|
|
432
|
+
'workers.fallbackHint': 'when pinned targets cannot run',
|
|
433
|
+
'workers.pinDetails': 'More options',
|
|
434
|
+
'workers.back': 'Back',
|
|
435
|
+
'settings.ladderWaiting': 'Waiting for the router\'s model list.',
|
|
436
|
+
'jev.zenMissing': 'No OpenCode Zen authorization key in ClaudeRipple config',
|
|
437
|
+
'agents.domainLevel': '{domain} / {level}',
|
|
438
|
+
'agents.tokens': '≈{tokens} tok',
|
|
439
|
+
// Time units: countdowns, reset times, durations.
|
|
440
|
+
'units.seconds': '{n}s',
|
|
441
|
+
'units.minutes': '{n}m',
|
|
442
|
+
'units.hours': '{n}h',
|
|
443
|
+
'units.days': '{n}d',
|
|
444
|
+
'units.minSec': '{m}m {s}s',
|
|
445
|
+
'units.hourMin': '{h}h {m}m',
|
|
446
|
+
} as const
|
|
447
|
+
|
|
448
|
+
export type Key = keyof typeof EN
|
|
449
|
+
|
|
450
|
+
const KO: Record<Key, string> = {
|
|
451
|
+
// Band (including shared display labels and accessibility text).
|
|
452
|
+
'band.brand': 'ClaudeRipple',
|
|
453
|
+
'band.effort': '추론 강도',
|
|
454
|
+
'band.model': '모델',
|
|
455
|
+
'band.auto': '자동',
|
|
456
|
+
'band.manual': '수동',
|
|
457
|
+
'band.paused': '일시 중지',
|
|
458
|
+
'band.off': '꺼짐',
|
|
459
|
+
'band.on': '켜짐',
|
|
460
|
+
'band.autoOff': '자동 꺼짐',
|
|
461
|
+
'band.autoPaused': '자동 일시 중지',
|
|
462
|
+
'band.deciding': '판정 중…',
|
|
463
|
+
'band.decidingText': '◌ 판정 중…',
|
|
464
|
+
'band.low': '낮음',
|
|
465
|
+
'band.medium': '중간',
|
|
466
|
+
'band.high': '높음',
|
|
467
|
+
'band.xhigh': '매우 높음',
|
|
468
|
+
'band.max': '최대',
|
|
469
|
+
'band.pausedHint': '이 모델에서는 자동 선택이 일시 중지됩니다. 해당 모델에서 추론 강도를 변경할 때 캐시가 유지되는지 확인되지 않았습니다.',
|
|
470
|
+
'band.offHint': '자동 선택이 꺼져 있습니다. 추론 강도를 직접 설정하세요.',
|
|
471
|
+
'band.decidingHint': '판정 모델이 프롬프트의 추론 강도를 결정하는 중입니다.',
|
|
472
|
+
'band.effortTitle': '추론 강도 {value}{hint} · 클릭하여 강도 선택',
|
|
473
|
+
'band.effortAlt': '추론 강도 {value} ({mode}){why}',
|
|
474
|
+
'band.context': '컨텍스트',
|
|
475
|
+
'band.contextAlt': '컨텍스트 {value} / {window} ({tokens} 토큰)',
|
|
476
|
+
'band.cache': '캐시',
|
|
477
|
+
'band.cacheWarm': '캐시 · 유지 중',
|
|
478
|
+
'band.cacheStopped': '캐시 · 유지 중단',
|
|
479
|
+
'band.cold': '만료',
|
|
480
|
+
'band.cacheTip': '프롬프트 캐시 {state}{warm}',
|
|
481
|
+
'band.warmFor': '{time} 후 만료',
|
|
482
|
+
'band.expired': '만료됨',
|
|
483
|
+
'band.warmStoppedTip': ' · 캐시 유지 중단: {reason}',
|
|
484
|
+
'band.warmOnTip': ' · 캐시 유지 켜짐, 핑 {count}회',
|
|
485
|
+
'band.noReply': '아직 응답 없음',
|
|
486
|
+
'band.cacheAlt': '캐시 {state}{warm}',
|
|
487
|
+
'band.timeLeft': '{time} 남음',
|
|
488
|
+
'band.unknown': '알 수 없음',
|
|
489
|
+
'band.keepWarmAlt': ', 캐시 유지 켜짐{count}',
|
|
490
|
+
'band.limitCaption': '{window} 한도{save}',
|
|
491
|
+
'band.saveCaption': ' · 절약',
|
|
492
|
+
'band.limitAlt': '{window} 한도 {value}{reset}',
|
|
493
|
+
'band.fiveHour': '5시간',
|
|
494
|
+
'band.weekly': '주간',
|
|
495
|
+
'band.resetting': '초기화 중',
|
|
496
|
+
'band.resetsIn': '{time} 뒤 초기화',
|
|
497
|
+
'band.resetsAt': '{time} 초기화',
|
|
498
|
+
'band.router': '라우터',
|
|
499
|
+
'band.routerAlt': '라우터: {value}',
|
|
500
|
+
'band.resentCaption': '재전송 · {status}',
|
|
501
|
+
'band.failedCaption': '실패 · {status}',
|
|
502
|
+
'band.lastRoute': '최근 라우팅',
|
|
503
|
+
'band.logHint': '클릭하여 요청 로그 조회',
|
|
504
|
+
'band.routeAlt': '최근 라우팅: {model}({provider} 경유){effort}{cache}, {time}{status}',
|
|
505
|
+
'band.routeCache': ', 캐시 {percent}%',
|
|
506
|
+
'band.routeResent': ', {status} 재전송',
|
|
507
|
+
'band.routeFailed': ', {status} 실패',
|
|
508
|
+
'band.warm': '캐시 유지',
|
|
509
|
+
'band.handoff': '인수인계',
|
|
510
|
+
'band.compact': '압축',
|
|
511
|
+
'band.log': '로그',
|
|
512
|
+
'band.agents': '에이전트',
|
|
513
|
+
'band.settings': '설정',
|
|
514
|
+
'band.effortShort': '강도',
|
|
515
|
+
'band.hit': '적중 {percent}%',
|
|
516
|
+
'band.effortAutoAlt': '추론 강도 자동 {state}',
|
|
517
|
+
'band.warmAlt': '캐시 유지 {state}',
|
|
518
|
+
'band.handoffAdvised': '인수인계 (권장: 지금은 새 대화가 더 효율적입니다)',
|
|
519
|
+
'band.closeLog': '요청 로그 닫기',
|
|
520
|
+
'band.openLog': '요청 로그 열기',
|
|
521
|
+
'band.agentsAlt': '에이전트: {count}개 실행 중',
|
|
522
|
+
'band.settingsAlt': 'Ripple 설정',
|
|
523
|
+
'band.warmStopped': '유지 중단',
|
|
524
|
+
'band.warmText': '≈유지',
|
|
525
|
+
'band.save': '절약',
|
|
526
|
+
'band.resent': '{status} 재전송',
|
|
527
|
+
'band.cachePercent': '캐시 {percent}%',
|
|
528
|
+
'band.closeLogText': '로그 닫기',
|
|
529
|
+
'band.footerPaused': ' (일시 중지)',
|
|
530
|
+
'band.footerOff': ' (자동 꺼짐)',
|
|
531
|
+
'band.footerManual': ' (수동)',
|
|
532
|
+
'band.footerContext': 'ctx {percent}%',
|
|
533
|
+
'band.routerRestart': 'ClaudeRipple: 라우팅 경로를 표시하려면 라우터를 재시작하세요',
|
|
534
|
+
'band.routerDown': 'ClaudeRipple: 라우터가 응답하지 않습니다',
|
|
535
|
+
// Alerts.
|
|
536
|
+
'alerts.coldTitle': '캐시가 만료되었습니다',
|
|
537
|
+
'alerts.coldBody': '{minutes}분 동안 대기하여 캐시가 만료되었습니다. 다음 프롬프트는 {tokens} 토큰 전체를 새로 읽어 비용이 발생합니다.',
|
|
538
|
+
'alerts.swampTitle': '컨텍스트 {percent}% 사용',
|
|
539
|
+
'alerts.swampBody': '프롬프트마다 {tokens} 토큰이 함께 전송되어 응답 속도와 정확도, 비용에 영향을 줍니다.',
|
|
540
|
+
'alerts.hotTitle': '{window} 한도 {percent}% 도달',
|
|
541
|
+
'alerts.saveOnBody': '절약 모드 켜짐: 초기화까지 자동 강도는 중간 이하입니다.',
|
|
542
|
+
'alerts.saveBody': '절약 모드는 초기화까지 자동 강도를 중간 이하로 유지합니다.',
|
|
543
|
+
'alerts.saveOff': '절약 모드 끄기',
|
|
544
|
+
'alerts.save': '절약 모드',
|
|
545
|
+
'alerts.notNow': '나중에',
|
|
546
|
+
'alerts.judgeTitle': '추론 강도 판정 모델이 응답하지 않습니다',
|
|
547
|
+
'alerts.judgeNetworkTitle': '네트워크 연결이 불안정하여 임시로 Haiku가 판정합니다',
|
|
548
|
+
'alerts.routerModel': '라우터 모델',
|
|
549
|
+
'alerts.judgeBody': '{judge}: {reason}. {fallback}',
|
|
550
|
+
'alerts.keepEffort': '복구 전까지는 현재 강도를 유지합니다.',
|
|
551
|
+
'alerts.askHaiku': '복구 전까지는 Haiku가 판정합니다.',
|
|
552
|
+
'alerts.openSettings': '설정 열기',
|
|
553
|
+
'alerts.compactTitle': '대화 압축',
|
|
554
|
+
'alerts.compactBody': '요약에 꼭 남길 내용을 입력하세요. 비워 두면 자동으로 요약합니다.',
|
|
555
|
+
'alerts.cancel': '취소',
|
|
556
|
+
'alerts.handoffTitle': '새 대화로 인수인계',
|
|
557
|
+
'alerts.quickBody': '간단: 캐시로 요약을 생성해 새 대화에서 이어받습니다.',
|
|
558
|
+
'alerts.fullBody': '전체: 인수인계 스킬이 git을 확인하고 HANDOFF.md를 먼저 작성합니다.',
|
|
559
|
+
'alerts.go': '실행',
|
|
560
|
+
'alerts.dismiss': '닫기',
|
|
561
|
+
'alerts.handingOff': '인수인계 중…',
|
|
562
|
+
'alerts.fullProgress': '인수인계 실행 중: git을 확인하고 HANDOFF.md를 작성합니다.',
|
|
563
|
+
'alerts.quickProgress': '새 대화가 이어받을 요약을 작성하는 중입니다.',
|
|
564
|
+
'alerts.handoffDone': '인수인계 완료',
|
|
565
|
+
'alerts.summaryReady': '요약이 준비되었습니다.',
|
|
566
|
+
'alerts.copyAgain': '다시 복사',
|
|
567
|
+
'alerts.compacting': '압축 중…',
|
|
568
|
+
'alerts.compactingBody': '대화를 요약하는 중입니다. 이후에는 요약을 바탕으로 대화를 이어갑니다.',
|
|
569
|
+
'alerts.compacted': '압축 완료',
|
|
570
|
+
'alerts.compactedBody': '요약을 바탕으로 대화를 이어갑니다.',
|
|
571
|
+
'alerts.failed': '완료되지 않았습니다',
|
|
572
|
+
'alerts.unchanged': '아무것도 변경되지 않았습니다.',
|
|
573
|
+
'alerts.keep': '남길 내용',
|
|
574
|
+
'alerts.keepPlaceholder': '결정 사항, 남은 질문, 파일 이름… (선택)',
|
|
575
|
+
'alerts.compactSubmit': '압축',
|
|
576
|
+
'alerts.quick': '간단',
|
|
577
|
+
'alerts.full': '전체',
|
|
578
|
+
'alerts.continue': '새 세션에서 바로',
|
|
579
|
+
'alerts.confirm': '확인 후 이동',
|
|
580
|
+
'alerts.copy': '복사만',
|
|
581
|
+
'alerts.continueHint': '같은 폴더에 새 세션을 열고 인수인계를 입력창에 채워 둡니다. 거기서 Enter를 누르면 이어집니다. 지금 대화는 그대로 둡니다.',
|
|
582
|
+
'alerts.confirmHint': '요약까지만 만들고 멈춥니다. 새 세션으로 넘어갈지 직접 고릅니다. 지금 대화는 그대로 둡니다.',
|
|
583
|
+
'alerts.copyHint': '요약을 클립보드에 복사만 하고 다른 것은 바꾸지 않습니다.',
|
|
584
|
+
'alerts.handoffReady': '인수인계 준비 완료',
|
|
585
|
+
'alerts.handoffReadyBody': '같은 폴더의 새 세션으로 넘어갈까요? 지금 대화는 그대로 둡니다.',
|
|
586
|
+
'alerts.openNew': '새 세션으로 넘어가기',
|
|
587
|
+
'alerts.openedBody': '새 세션을 열고 인수인계를 채워 두었습니다. 거기서 Enter를 누르면 이어집니다.',
|
|
588
|
+
'alerts.readHandoffFile': '{path}의 인수인계를 읽고 이어서 진행해 주세요.',
|
|
589
|
+
'alerts.copyText': '복사',
|
|
590
|
+
'toasts.newSessionFallback': '새 세션을 열지 못해 인수인계를 대신 복사했습니다.',
|
|
591
|
+
'alerts.kind': '유형 ',
|
|
592
|
+
'alerts.then': '이후 동작 ',
|
|
593
|
+
'alerts.demoDown': 'Jev 크레딧 소진 (데모)',
|
|
594
|
+
'alerts.copied': '재개용 요약 메모를 복사했습니다. 현재 대화는 보존됩니다.',
|
|
595
|
+
'alerts.compactFailed': '대화 압축을 마치지 못했습니다.',
|
|
596
|
+
// Settings.
|
|
597
|
+
'settings.effortBlurb': '전송하는 프롬프트마다 추론 강도를 자동으로 선택합니다.',
|
|
598
|
+
'settings.workers': '워커',
|
|
599
|
+
'settings.mode': '모드',
|
|
600
|
+
'settings.modeNone': '기본',
|
|
601
|
+
'band.mode': '모드',
|
|
602
|
+
'band.modeTip': '“{name}” 모드가 켜져 있습니다. 워커가 이 모드를 따릅니다. 빠른 설정에서 바꿀 수 있습니다.',
|
|
603
|
+
'settings.workersBlurb': '위임 작업 유형별로 실행할 워커를 설정합니다.',
|
|
604
|
+
'settings.judge': '판정 모델',
|
|
605
|
+
'settings.judgeBlurb': '프롬프트의 추론 강도와 위임 작업의 등급을 결정하는 모델입니다.',
|
|
606
|
+
'settings.cacheBlurb': '자리를 비운 동안에도 프롬프트 캐시를 유지합니다.',
|
|
607
|
+
'settings.handoff': '압축·인수인계',
|
|
608
|
+
'settings.handoffBlurb': '컨텍스트가 큰 대화를 압축하거나 새 대화로 인수인계합니다.',
|
|
609
|
+
'settings.look': '화면 표시',
|
|
610
|
+
'settings.lookBlurb': '상태 바에 표시할 항목과 형태를 설정합니다.',
|
|
611
|
+
'settings.light': '경량',
|
|
612
|
+
'settings.lightBlurb': '단순 반복 작업, 파일 조회',
|
|
613
|
+
'settings.standard': '표준',
|
|
614
|
+
'settings.standardBlurb': '명세 기반 구현, 조사, 코드 리뷰',
|
|
615
|
+
'settings.deep': '심층',
|
|
616
|
+
'settings.deepBlurb': '신중한 판단, 고위험 작업, 복잡한 추론',
|
|
617
|
+
'settings.design': '디자인',
|
|
618
|
+
'settings.designBlurb': 'UI, 시각 디자인, 브랜드',
|
|
619
|
+
'settings.tierAlt': '{name} 등급',
|
|
620
|
+
'settings.biasAlt': '성향 {value}{selected}',
|
|
621
|
+
'settings.selected': ' (선택됨)',
|
|
622
|
+
'settings.onSuffix': ' (켜짐)',
|
|
623
|
+
'settings.offSuffix': ' (꺼짐)',
|
|
624
|
+
'settings.mixedSuffix': ' (일부 켜짐)',
|
|
625
|
+
'settings.cheaper': '저렴하게',
|
|
626
|
+
'settings.smarter': '똑똑하게',
|
|
627
|
+
'settings.autoHint': '프롬프트마다 자동 선택하며, 직접 변경 시 비활성화됩니다.',
|
|
628
|
+
'settings.lean': '성향',
|
|
629
|
+
'settings.leanHint': '판단이 모호할 때만 적용',
|
|
630
|
+
'settings.floor': '최저 강도',
|
|
631
|
+
'settings.ceiling': '최고 강도',
|
|
632
|
+
'settings.floorWins': '최저 강도 미만이므로 최저 강도를 적용합니다.',
|
|
633
|
+
'settings.unavailable': ' (사용 불가)',
|
|
634
|
+
'settings.takesOver': '적용 대상',
|
|
635
|
+
'settings.autoAgent': 'ripple:auto',
|
|
636
|
+
'settings.allSpawns': '모든 서브에이전트',
|
|
637
|
+
'settings.fallback': '대체 워커',
|
|
638
|
+
'settings.fallbackHint': '해당 등급의 프로바이더 한도가 소진되었을 때',
|
|
639
|
+
'settings.haiku': 'Haiku',
|
|
640
|
+
'settings.jev': 'Jev',
|
|
641
|
+
'settings.routerModel': '라우터 모델',
|
|
642
|
+
'settings.haikuHint': 'Claude 로그인으로 Haiku 5.5 사용 · 프롬프트당 약 1초',
|
|
643
|
+
'settings.keyEnv': 'TYPESAFE_API_KEY에서 읽음',
|
|
644
|
+
'settings.keyFile': '~/.config/jev/.env에 저장됨',
|
|
645
|
+
'settings.keySaved': '저장됨',
|
|
646
|
+
'settings.keyPaste': 'TypeSafe API 키 붙여넣기',
|
|
647
|
+
'settings.saveKey': '저장',
|
|
648
|
+
'settings.testing': '확인 중…',
|
|
649
|
+
'settings.keyWorks': 'API 키 인증 성공',
|
|
650
|
+
'settings.keyRejected': 'API 키 인증 실패',
|
|
651
|
+
'settings.key': 'API 키',
|
|
652
|
+
'settings.test': '테스트',
|
|
653
|
+
'settings.noModels': '표시할 라우터 모델이 없습니다.',
|
|
654
|
+
'settings.haikuFallback': '실패 시 Haiku로 대체',
|
|
655
|
+
'settings.keepWarm': '캐시 유지',
|
|
656
|
+
'settings.keepWarmHint': '만료 직전에 캐시 핑 전송',
|
|
657
|
+
'settings.for': '유지 시간',
|
|
658
|
+
'settings.afterReply': '마지막 응답 기준',
|
|
659
|
+
'settings.chatsFrom': '대상 대화',
|
|
660
|
+
'settings.tokens': '토큰 이상',
|
|
661
|
+
'settings.warmCost': '핑을 보낼 때마다 캐시에서 대화 전체를 다시 읽습니다. 입력 비용의 약 1/10이며, 요금제 한도도 동일 비율로 소진합니다.',
|
|
662
|
+
'settings.noSkill': '스킬 없음: 1턴의 대화로 HANDOFF.md 작성',
|
|
663
|
+
'settings.compactWith': '압축 담당 모델',
|
|
664
|
+
'settings.sessionCompactor': '세션 기본',
|
|
665
|
+
'settings.afterHandoff': '인수인계 후 동작',
|
|
666
|
+
'settings.handoffButton': '인수인계 버튼 표시',
|
|
667
|
+
'settings.whenAdvised': '권장 시',
|
|
668
|
+
'settings.always': '항상',
|
|
669
|
+
'settings.fullHandoff': '전체 인수인계',
|
|
670
|
+
'settings.heavyAt': '대화 압축 기준',
|
|
671
|
+
'settings.context': '컨텍스트',
|
|
672
|
+
'settings.cacheTimer': '캐시 타이머',
|
|
673
|
+
'settings.reason': '판정 사유',
|
|
674
|
+
'settings.route': '라우팅 경로',
|
|
675
|
+
'settings.limits': '한도',
|
|
676
|
+
'settings.layout': '레이아웃',
|
|
677
|
+
'settings.dashboard': '대시보드',
|
|
678
|
+
'settings.minimal': '최소화',
|
|
679
|
+
'settings.footerHint': '하단 한 줄 표시',
|
|
680
|
+
'settings.appearance': '테마',
|
|
681
|
+
'settings.dark': '다크',
|
|
682
|
+
'settings.lightAppearance': '라이트',
|
|
683
|
+
'settings.show': '표시 항목',
|
|
684
|
+
'settings.language': '언어',
|
|
685
|
+
'settings.title': '설정',
|
|
686
|
+
'settings.quick': '빠른 설정',
|
|
687
|
+
'settings.effortAuto': '자동 추론 강도',
|
|
688
|
+
'settings.openAll': '전체 설정 열기',
|
|
689
|
+
'setup.workersNote': '워커는 기본 사다리 규칙으로 시작하며, 대시보드에서 맞춤 설정할 수 있습니다.',
|
|
690
|
+
'setup.changeDashboard': '상태 바나 /ripple에서 빠르게 변경하고, 전체 설정 열기로 대시보드로 이동할 수 있습니다.',
|
|
691
|
+
'settings.save': '저장',
|
|
692
|
+
'settings.discard': '변경 취소',
|
|
693
|
+
'settings.close': '닫기',
|
|
694
|
+
'settings.autoLine': '프롬프트마다 알맞은 강도를 자동으로 고릅니다.',
|
|
695
|
+
'settings.autoOffNote': '앱의 강도 메뉴에서 고른 값을 그대로 씁니다.',
|
|
696
|
+
'settings.judgeLine': '추론 강도와 위임 작업 등급을 정합니다.',
|
|
697
|
+
'settings.modeLine': '위임 작업을 맡길 워커 묶음을 고릅니다.',
|
|
698
|
+
'settings.warmLine': '캐시가 식기 직전에 핑을 보내 데워 둡니다.',
|
|
699
|
+
'settings.warmCostShort': '핑마다 입력 비용의 약 1/10이 듭니다.',
|
|
700
|
+
'settings.sayAuto': '{judge} 판정으로 프롬프트마다 추론 강도를 골라요.',
|
|
701
|
+
'settings.sayManual': '추론 강도는 앱에서 고른 대로 둘게요.',
|
|
702
|
+
'settings.sayWarm': '캐시는 식기 전에 데워 둘게요.',
|
|
703
|
+
'band.hideBand': '띠 숨기기',
|
|
704
|
+
'settings.unsaved': '● 저장되지 않음',
|
|
705
|
+
// Setup.
|
|
706
|
+
'setup.judgeTitle': '판정 방식 설정',
|
|
707
|
+
'setup.judgeBlurb': '작고 빠른 판정 모델이 프롬프트마다 강도를, 작업마다 워커를 결정합니다.',
|
|
708
|
+
'setup.workersTitle': '작업 실행 주체',
|
|
709
|
+
'setup.cacheTitle': '캐시를 유지할까요?',
|
|
710
|
+
'setup.cacheBlurb': '대화가 유휴 상태일 때 캐시가 만료됩니다. 자리를 비워도 Ripple이 핑을 보내 캐시를 유지할 수 있습니다.',
|
|
711
|
+
'setup.effortSummary': '자동 강도 {state}, 판정 모델: {judge}',
|
|
712
|
+
'setup.cacheSummary': '응답 후 {hours}시간 동안 캐시 유지',
|
|
713
|
+
'setup.cacheOff': '캐시 유지 사용 안 함',
|
|
714
|
+
'setup.ready': 'ClaudeRipple 준비 완료',
|
|
715
|
+
'setup.welcome': 'ClaudeRipple을 시작합니다',
|
|
716
|
+
'setup.start': '시작',
|
|
717
|
+
'setup.finish': '완료',
|
|
718
|
+
'setup.next': '다음',
|
|
719
|
+
'setup.back': '이전',
|
|
720
|
+
'setup.skip': '설정 건너뛰기',
|
|
721
|
+
// Agents.
|
|
722
|
+
'agents.waiting': '대기 중',
|
|
723
|
+
'agents.routerModel': '라우터 모델',
|
|
724
|
+
'agents.marker': '마커',
|
|
725
|
+
'agents.default': '기본값',
|
|
726
|
+
'agents.by': '{name} 배정',
|
|
727
|
+
'agents.thinking': '추론 중',
|
|
728
|
+
'agents.fallback': '▲ 대체 워커 실행: {reason}',
|
|
729
|
+
'agents.emptyTitle': '실행 중인 에이전트 없음',
|
|
730
|
+
'agents.emptyBody': 'Claude가 위임한 작업이 이곳에 표시되며, Ripple이 선정한 워커와 사유를 확인할 수 있습니다.',
|
|
731
|
+
'agents.liveCount': '{count}개 실행 중',
|
|
732
|
+
'agents.noneRunning': '실행 중인 에이전트 없음',
|
|
733
|
+
'agents.doneCount': '{count}개 완료',
|
|
734
|
+
// Log.
|
|
735
|
+
'log.resent': '↻ {status} 재전송',
|
|
736
|
+
'log.input': '입력 {tokens}',
|
|
737
|
+
'log.output': '출력 {tokens}',
|
|
738
|
+
'log.thisSession': '현재 세션',
|
|
739
|
+
'log.allSessions': '전체 세션',
|
|
740
|
+
'log.showAll': '전체 세션 표시',
|
|
741
|
+
'log.onlySession': '현재 세션만 표시',
|
|
742
|
+
'log.legend': '● 현재 세션 ○ 다른 세션',
|
|
743
|
+
'log.empty': '아직 모델 요청 내역이 없습니다.',
|
|
744
|
+
'log.judge': '강도 판정',
|
|
745
|
+
'log.judgeWorker': '워커 판정',
|
|
746
|
+
'log.judgeFell': '{asked} 실패 → {by}',
|
|
747
|
+
'log.sure': '확신도 {percent}%',
|
|
748
|
+
// Toasts and locally generated failure/reason text.
|
|
749
|
+
'toasts.keySingle': '단일 TypeSafe API 키를 입력하세요',
|
|
750
|
+
'toasts.keyPrivateFailed': 'Jev 키 파일 권한을 비공개로 변경하지 못했습니다 (chmod 600)',
|
|
751
|
+
'toasts.keySaved': 'ClaudeRipple: Jev 키를 안전하게 저장했습니다. 환경 변수 키가 우선 적용됩니다.',
|
|
752
|
+
'toasts.judgeDown': 'ClaudeRipple: {reason}. 현재 추론 강도를 유지하거나 Haiku에 판정을 요청합니다.',
|
|
753
|
+
'toasts.keyMissing': 'Jev 키 누락',
|
|
754
|
+
'toasts.jevNoVerdict': 'Jev 판정 결과 없음',
|
|
755
|
+
'judge.keptUnsure': '판정 결과가 모호하여 현재 강도 유지',
|
|
756
|
+
'toasts.routerNoVerdict': '라우터 판정 모델 결과 없음',
|
|
757
|
+
'toasts.haikuNoVerdict': 'Haiku 판정 결과 없음',
|
|
758
|
+
'toasts.noVerdict': '판정 결과 없음',
|
|
759
|
+
'toasts.judgeUnavailable': '판정 모델 사용 불가',
|
|
760
|
+
'toasts.explicitMarker': '명시적 워커 마커',
|
|
761
|
+
'toasts.workerFallback': 'ClaudeRipple: {reason}. {name} 워커로 대체 실행합니다.',
|
|
762
|
+
'toasts.modeEnded': '{name} 모드가 종료되었습니다.',
|
|
763
|
+
'toasts.yourPick': '사용자 직접 선택',
|
|
764
|
+
'toasts.effortEnter': 'ClaudeRipple: Enter를 누르면 앱의 추론 강도 설정도 선택한 값을 반영합니다.',
|
|
765
|
+
'toasts.settingsSaved': 'ClaudeRipple: 설정을 저장했습니다.',
|
|
766
|
+
'toasts.clipboardFallback': 'ClaudeRipple: 클립보드를 사용할 수 없어 재개 메모를 프롬프트에 삽입했습니다.',
|
|
767
|
+
'toasts.handoffFailed': 'ClaudeRipple: 인수인계에 실패했습니다. 기존 대화는 유지됩니다.',
|
|
768
|
+
'toasts.compactFailed': 'ClaudeRipple: 대화 압축에 실패했습니다. 기존 대화는 유지됩니다.',
|
|
769
|
+
'toasts.warmStopped': 'ClaudeRipple: {reason}',
|
|
770
|
+
'toasts.warmBoundReason': '캐시 유지 중단: 설정된 시간 한도 도달',
|
|
771
|
+
'toasts.warmBound': 'ClaudeRipple: 시간 한도에 도달하여 캐시 유지를 중단했습니다.',
|
|
772
|
+
'toasts.appEffort': '앱 추론 강도',
|
|
773
|
+
'toasts.appEffortChanged': '앱 추론 강도 변경됨',
|
|
774
|
+
'toasts.autoOff': 'ClaudeRipple: 앱에서 추론 강도를 변경하여 자동 선택이 비활성화되었습니다.',
|
|
775
|
+
'toasts.handoffEmpty': 'ClaudeRipple: 인수인계 결과가 비어 있어 작업을 취소했습니다.',
|
|
776
|
+
'toasts.ownModel': 'ClaudeRipple: {name} 에이전트는 "{model}" 대신 지정된 자체 모델로 실행됩니다.',
|
|
777
|
+
'toasts.transcriptEmpty': '대화 기록이 비어 있거나 압축 예산 한도를 초과했습니다.',
|
|
778
|
+
'toasts.summaryEmpty': 'Haiku에서 유효한 요약 결과를 수신하지 못했습니다.',
|
|
779
|
+
'toasts.compactFallback': 'ClaudeRipple: Haiku 압축 실패로 세션 기본 압축기를 사용합니다.',
|
|
780
|
+
'toasts.error': 'ClaudeRipple: {reason}',
|
|
781
|
+
'toasts.jevTimeout': 'Jev 요청 시간 초과',
|
|
782
|
+
'toasts.jevRejected': 'Jev 키 인증 거부됨',
|
|
783
|
+
'toasts.jevCredits': 'Jev 크레딧 소진됨',
|
|
784
|
+
'toasts.jevRateLimited': 'Jev 속도 제한 초과',
|
|
785
|
+
'toasts.jevHttp': 'Jev 요청 실패 ({status})',
|
|
786
|
+
'toasts.warmNoReply': '캐시 유지 중단: 포크 응답 없음',
|
|
787
|
+
'toasts.warmNoCache': '캐시 유지 중단: 캐시 미적중',
|
|
788
|
+
'toasts.providerQuota': 'ChatGPT 계정을 사용할 수 없거나 사용량 한도가 소진되었습니다.',
|
|
789
|
+
'toasts.saveMode': '절약 모드',
|
|
790
|
+
'toasts.yourSettings': '사용자 설정',
|
|
791
|
+
'toasts.jevNetwork': 'Jev 네트워크 연결 불가',
|
|
792
|
+
'toasts.workerMissing': '{name} 에이전트 미설치',
|
|
793
|
+
// Commands (stats and debug labels included).
|
|
794
|
+
'commands.description': 'ClaudeRipple 추론 강도, 워커, 캐시 및 세션 도구',
|
|
795
|
+
'commands.argumentHint': 'settings|setup|auto|warm|save|handoff [full]|stats|debug|agents|log|bar|cold|swamp|hot|down',
|
|
796
|
+
'commands.logDescription': 'ClaudeRipple 요청 로그 열기/닫기',
|
|
797
|
+
'commands.barDescription': 'ClaudeRipple 상태 바 표시/숨기기',
|
|
798
|
+
'commands.logTitle': 'ClaudeRipple',
|
|
799
|
+
'commands.agentsTitle': 'ClaudeRipple 에이전트',
|
|
800
|
+
'commands.help': 'ClaudeRipple 하위 명령: settings, setup, auto, warm, save, handoff [full], stats, debug, agents, log, bar, cold, swamp, hot, down.',
|
|
801
|
+
'commands.done': 'ClaudeRipple: {command} 완료.',
|
|
802
|
+
'commands.logOpened': 'ClaudeRipple 로그를 열었습니다.',
|
|
803
|
+
'commands.logClosed': 'ClaudeRipple 로그를 닫았습니다.',
|
|
804
|
+
'commands.barShown': '프롬프트 상단에 ClaudeRipple 상태 바를 표시합니다.',
|
|
805
|
+
'commands.barHidden': 'ClaudeRipple 상태 바를 숨겼습니다. /ripple-bar로 다시 표시할 수 있습니다.',
|
|
806
|
+
'commands.statsAuto': '자동: 프롬프트 {prompts}개, 요청 {requests}개, 가중 토큰 {total}',
|
|
807
|
+
'commands.statsTokens': '토큰: 입력 {input}, 쓰기 {write}, 읽기 {read}, 출력 {output}',
|
|
808
|
+
'commands.statsEffort': '{effort} 프롬프트 {prompts}개 / 가중치 {cost}',
|
|
809
|
+
'commands.statsJudges': '판정 모델: haiku {haiku}, jev {jev}, 모델 {model}; 토큰 {tokens}, {ms} ms (평균 {avg} ms)',
|
|
810
|
+
'commands.statsWorkers': '워커: {workers}',
|
|
811
|
+
'commands.statsWarm': '캐시 유지: 핑 {pings}회, 가중 토큰 {cost}',
|
|
812
|
+
'commands.debugJudge': '판정 모델',
|
|
813
|
+
'commands.debugJudgeModel': '판정용 라우터 모델',
|
|
814
|
+
'commands.debugPick': '선택',
|
|
815
|
+
'commands.debugPaused': '일시 중지',
|
|
816
|
+
'commands.debugCache': '캐시',
|
|
817
|
+
'commands.debugWarm': '캐시 유지',
|
|
818
|
+
'commands.debugLastSpawn': '최근 생성',
|
|
819
|
+
'commands.debugLastRequest': '최근 요청',
|
|
820
|
+
'commands.debugEffort': '추론 강도',
|
|
821
|
+
'commands.debugWhy': '사유',
|
|
822
|
+
'commands.debugBy': '선택 주체',
|
|
823
|
+
'commands.debugAt': '시각',
|
|
824
|
+
'commands.debugSure': '확신도',
|
|
825
|
+
'commands.debugTtlMs': 'TTL(ms)',
|
|
826
|
+
'commands.debugLastReplyAt': '최근 응답 시각',
|
|
827
|
+
'commands.debugExpiresAt': '만료 시각',
|
|
828
|
+
'commands.debugPings': '핑 횟수',
|
|
829
|
+
'commands.debugCost': '비용',
|
|
830
|
+
'commands.debugStopped': '중단 사유',
|
|
831
|
+
'commands.debugLastPingAt': '최근 핑 시각',
|
|
832
|
+
'commands.debugTier': '등급',
|
|
833
|
+
'commands.debugTarget': '대상',
|
|
834
|
+
'commands.debugAgent': '에이전트',
|
|
835
|
+
'commands.debugModel': '모델',
|
|
836
|
+
'commands.debugMs': 'ms',
|
|
837
|
+
'commands.debugFallbackReason': '대체 사유',
|
|
838
|
+
'commands.debugAppEffort': '앱 강도',
|
|
839
|
+
'commands.debugSentEffort': '전송 강도',
|
|
840
|
+
'commands.debugLog': 'ClaudeRipple {where}: {reason}',
|
|
841
|
+
'commands.routerHttp': '라우터 HTTP {status}',
|
|
842
|
+
'commands.compactSkip': '압축이 필요할 때 ClaudeRipple이 Haiku로 요약합니다.',
|
|
843
|
+
// Workers card, Jev source, and worker picks in the Agents pane.
|
|
844
|
+
'workers.previous': '이전',
|
|
845
|
+
'workers.next': '다음',
|
|
846
|
+
'workers.page': '{page} / {pages}페이지',
|
|
847
|
+
'workers.general': '일반',
|
|
848
|
+
'workers.design': '디자인',
|
|
849
|
+
'workers.frontend': '프론트엔드',
|
|
850
|
+
'workers.backend': '백엔드',
|
|
851
|
+
'workers.infra': '인프라',
|
|
852
|
+
'workers.data': '데이터',
|
|
853
|
+
'workers.test': '테스트',
|
|
854
|
+
'workers.docs': '문서',
|
|
855
|
+
'workers.research': '조사',
|
|
856
|
+
'workers.mode': '모드',
|
|
857
|
+
'workers.rung.light': '로우 워커',
|
|
858
|
+
'workers.rung.standard': '미디움 워커',
|
|
859
|
+
'workers.rung.hard': '하이 워커',
|
|
860
|
+
'workers.rung.plan': '맥스 워커',
|
|
861
|
+
'workers.rungHint.light': '파일 검색, 단건 조회, 로그 검토, 기계적 수정',
|
|
862
|
+
'workers.rungHint.standard': '명세 기반 구현, 리팩터링, 요약, 초안 작성',
|
|
863
|
+
'workers.rungHint.hard': '고난도 디버깅, 다중 파일 변경, 독립적 검토 및 반박',
|
|
864
|
+
'workers.rungHint.plan': '최상의 품질: 기획, 설계, 아키텍처 수립, 심층 의견 제시',
|
|
865
|
+
'workers.rungEmpty': '{rung}에 설정된 모델이 없습니다',
|
|
866
|
+
'workers.notCandidate': '이 분야 후보에 없는 모델입니다: {name}',
|
|
867
|
+
'workers.sessionModel': '세션 기본 모델',
|
|
868
|
+
'workers.offset': '추론 강도 보정',
|
|
869
|
+
'workers.anyEffort': '제한 없음',
|
|
870
|
+
'workers.noTarget': '상위 등급 또는 대체 워커 사용',
|
|
871
|
+
'workers.judgeBlurb': '프롬프트의 추론 강도와 작업 분야 및 등급을 결정하는 모델입니다.',
|
|
872
|
+
'workers.disabled': '{provider} 비활성화됨',
|
|
873
|
+
'workers.nested': '서브에이전트는 하위 서브에이전트를 생성할 수 없습니다. 이 부분은 직접 실행하고 결과를 보고하세요.',
|
|
874
|
+
'workers.none': '사용 가능한 활성 워커 없음',
|
|
875
|
+
'workers.loading': '라우터의 워커 목록을 불러오는 중…',
|
|
876
|
+
'workers.providerSub': '{count}개 중 {on}개 활성',
|
|
877
|
+
'workers.fallbackHint': '고정된 대상을 실행할 수 없을 때',
|
|
878
|
+
'workers.pinDetails': '추가 옵션',
|
|
879
|
+
'workers.back': '뒤로 가기',
|
|
880
|
+
'settings.ladderWaiting': '라우터에서 모델 목록을 수신하는 중입니다.',
|
|
881
|
+
'jev.zenMissing': 'ClaudeRipple 설정에 OpenCode Zen 인증 키가 없습니다',
|
|
882
|
+
'agents.domainLevel': '{domain} / {level}',
|
|
883
|
+
'agents.tokens': '≈{tokens} 토큰',
|
|
884
|
+
// Time units: countdowns, reset times, durations.
|
|
885
|
+
'units.seconds': '{n}초',
|
|
886
|
+
'units.minutes': '{n}분',
|
|
887
|
+
'units.hours': '{n}시간',
|
|
888
|
+
'units.days': '{n}일',
|
|
889
|
+
'units.minSec': '{m}분 {s}초',
|
|
890
|
+
'units.hourMin': '{h}시간 {m}분',
|
|
891
|
+
}
|
|
892
|
+
|
|
893
|
+
const ZH: Record<Key, string> = {
|
|
894
|
+
// Band (including shared display labels and accessibility text).
|
|
895
|
+
'band.brand': 'ClaudeRipple',
|
|
896
|
+
'band.effort': '推理强度',
|
|
897
|
+
'band.model': '模型',
|
|
898
|
+
'band.auto': '自动',
|
|
899
|
+
'band.manual': '手动',
|
|
900
|
+
'band.paused': '已暂停',
|
|
901
|
+
'band.off': '关闭',
|
|
902
|
+
'band.on': '开启',
|
|
903
|
+
'band.autoOff': '自动模式关闭',
|
|
904
|
+
'band.autoPaused': '自动模式已暂停',
|
|
905
|
+
'band.deciding': '判定中…',
|
|
906
|
+
'band.decidingText': '◌ 判定中…',
|
|
907
|
+
'band.low': '低',
|
|
908
|
+
'band.medium': '中',
|
|
909
|
+
'band.high': '高',
|
|
910
|
+
'band.xhigh': '超高',
|
|
911
|
+
'band.max': '最高',
|
|
912
|
+
'band.pausedHint': '此模型上自动模式已暂停:尚不确定在此模型上切换推理强度能否保住缓存。',
|
|
913
|
+
'band.offHint': '自动模式已关闭,推理强度由你决定。',
|
|
914
|
+
'band.decidingHint': '判定模型正在为这条提示词选择推理强度。',
|
|
915
|
+
'band.effortTitle': '推理强度 {value}{hint} · 点击选择推理强度',
|
|
916
|
+
'band.effortAlt': '推理强度 {value}({mode}){why}',
|
|
917
|
+
'band.context': '上下文',
|
|
918
|
+
'band.contextAlt': '上下文 {value},共 {window}({tokens} token)',
|
|
919
|
+
'band.cache': '缓存',
|
|
920
|
+
'band.cacheWarm': '缓存 · 保温中',
|
|
921
|
+
'band.cacheStopped': '缓存 · 保温已停',
|
|
922
|
+
'band.cold': '已过期',
|
|
923
|
+
'band.cacheTip': '提示词缓存{state}{warm}',
|
|
924
|
+
'band.warmFor': '{time}后过期',
|
|
925
|
+
'band.expired': '已过期',
|
|
926
|
+
'band.warmStoppedTip': ' · 保温已停止:{reason}',
|
|
927
|
+
'band.warmOnTip': ' · 保温开启,已 ping {count} 次',
|
|
928
|
+
'band.noReply': '尚无回复',
|
|
929
|
+
'band.cacheAlt': '缓存{state}{warm}',
|
|
930
|
+
'band.timeLeft': '剩余 {time}',
|
|
931
|
+
'band.unknown': '未知',
|
|
932
|
+
'band.keepWarmAlt': ',保温开启{count}',
|
|
933
|
+
'band.limitCaption': '{window}限额{save}',
|
|
934
|
+
'band.saveCaption': ' · 节省',
|
|
935
|
+
'band.limitAlt': '{window}限额 {value}{reset}',
|
|
936
|
+
'band.fiveHour': '5 小时',
|
|
937
|
+
'band.weekly': '每周',
|
|
938
|
+
'band.resetting': '重置中',
|
|
939
|
+
'band.resetsIn': '{time}后重置',
|
|
940
|
+
'band.resetsAt': '{time} 重置',
|
|
941
|
+
'band.router': '路由服务',
|
|
942
|
+
'band.routerAlt': '路由服务:{value}',
|
|
943
|
+
'band.resentCaption': '已重发 · {status}',
|
|
944
|
+
'band.failedCaption': '失败 · {status}',
|
|
945
|
+
'band.lastRoute': '最近路由',
|
|
946
|
+
'band.logHint': '点击查看请求日志',
|
|
947
|
+
'band.routeAlt': '最近路由:{model} 经由 {provider}{effort}{cache}, {time}{status}',
|
|
948
|
+
'band.routeCache': ', 缓存 {percent}%',
|
|
949
|
+
'band.routeResent': ', 已重发 {status}',
|
|
950
|
+
'band.routeFailed': ', 失败 {status}',
|
|
951
|
+
'band.warm': '保温',
|
|
952
|
+
'band.handoff': '交接',
|
|
953
|
+
'band.compact': '压缩',
|
|
954
|
+
'band.log': '日志',
|
|
955
|
+
'band.agents': '代理',
|
|
956
|
+
'band.settings': '设置',
|
|
957
|
+
'band.effortShort': '强度',
|
|
958
|
+
'band.hit': '命中 {percent}%',
|
|
959
|
+
'band.effortAutoAlt': '推理强度自动{state}',
|
|
960
|
+
'band.warmAlt': '缓存保温{state}',
|
|
961
|
+
'band.handoffAdvised': '交接(建议:现在换新对话更划算)',
|
|
962
|
+
'band.closeLog': '关闭请求日志',
|
|
963
|
+
'band.openLog': '打开请求日志',
|
|
964
|
+
'band.agentsAlt': '代理:{count} 个运行中',
|
|
965
|
+
'band.settingsAlt': 'Ripple 设置',
|
|
966
|
+
'band.warmStopped': '保温已停',
|
|
967
|
+
'band.warmText': '≈保温',
|
|
968
|
+
'band.save': '节省',
|
|
969
|
+
'band.resent': '{status} 已重发',
|
|
970
|
+
'band.cachePercent': '缓存 {percent}%',
|
|
971
|
+
'band.closeLogText': '关闭日志',
|
|
972
|
+
'band.footerPaused': ' (已暂停)',
|
|
973
|
+
'band.footerOff': ' (自动模式关闭)',
|
|
974
|
+
'band.footerManual': ' (手动)',
|
|
975
|
+
'band.footerContext': '上下文 {percent}%',
|
|
976
|
+
'band.routerRestart': 'ClaudeRipple: 重启路由服务后,此处才会显示路由',
|
|
977
|
+
'band.routerDown': 'ClaudeRipple: 路由服务无响应',
|
|
978
|
+
// Alerts.
|
|
979
|
+
'alerts.coldTitle': '缓存已过期',
|
|
980
|
+
'alerts.coldBody': '闲置了 {minutes} 分钟,下一条提示词会按全价重读全部 {tokens} token。',
|
|
981
|
+
'alerts.swampTitle': '上下文已用 {percent}%',
|
|
982
|
+
'alerts.swampBody': '每条提示词都带着 {tokens} token:更慢、更贵、更模糊。',
|
|
983
|
+
'alerts.hotTitle': '{window}限额已达 {percent}%',
|
|
984
|
+
'alerts.saveOnBody': '节省模式已开启:重置前,自动强度保持在“中”或以下。',
|
|
985
|
+
'alerts.saveBody': '节省模式会在重置前把自动强度保持在“中”或以下。',
|
|
986
|
+
'alerts.saveOff': '关闭节省模式',
|
|
987
|
+
'alerts.save': '节省模式',
|
|
988
|
+
'alerts.notNow': '暂不',
|
|
989
|
+
'alerts.judgeTitle': '推理强度判定模型无响应',
|
|
990
|
+
'alerts.judgeNetworkTitle': '网络连接不稳定,暂由 Haiku 判定',
|
|
991
|
+
'alerts.routerModel': '路由模型',
|
|
992
|
+
'alerts.judgeBody': '{judge}:{reason}。{fallback}',
|
|
993
|
+
'alerts.keepEffort': '在此期间保持当前强度。',
|
|
994
|
+
'alerts.askHaiku': '在此期间由 Haiku 判定。',
|
|
995
|
+
'alerts.openSettings': '打开设置',
|
|
996
|
+
'alerts.compactTitle': '压缩此对话',
|
|
997
|
+
'alerts.compactBody': '请输入摘要必须保留的内容;留空则自动总结。',
|
|
998
|
+
'alerts.cancel': '取消',
|
|
999
|
+
'alerts.handoffTitle': '交接到新对话',
|
|
1000
|
+
'alerts.quickBody': '快速:基于缓存写一份摘要,新对话从这里接着做。',
|
|
1001
|
+
'alerts.fullBody': '完整:交接技能先检查 git 并写入 HANDOFF.md。',
|
|
1002
|
+
'alerts.go': '开始',
|
|
1003
|
+
'alerts.dismiss': '关闭',
|
|
1004
|
+
'alerts.handingOff': '正在交接…',
|
|
1005
|
+
'alerts.fullProgress': '正在交接:检查 git 并写入 HANDOFF.md。',
|
|
1006
|
+
'alerts.quickProgress': '正在写一份新对话可以接续的摘要。',
|
|
1007
|
+
'alerts.handoffDone': '交接完成',
|
|
1008
|
+
'alerts.summaryReady': '摘要已就绪。',
|
|
1009
|
+
'alerts.copyAgain': '再次复制',
|
|
1010
|
+
'alerts.compacting': '正在压缩…',
|
|
1011
|
+
'alerts.compactingBody': '正在总结对话,之后从摘要继续。',
|
|
1012
|
+
'alerts.compacted': '已压缩',
|
|
1013
|
+
'alerts.compactedBody': '对话将从摘要继续。',
|
|
1014
|
+
'alerts.failed': '未能完成',
|
|
1015
|
+
'alerts.unchanged': '没有做任何更改。',
|
|
1016
|
+
'alerts.keep': '保留',
|
|
1017
|
+
'alerts.keepPlaceholder': '决定、待解决的问题、文件名…(可选)',
|
|
1018
|
+
'alerts.compactSubmit': '压缩',
|
|
1019
|
+
'alerts.quick': '快速',
|
|
1020
|
+
'alerts.full': '完整',
|
|
1021
|
+
'alerts.continue': '立即开新会话',
|
|
1022
|
+
'alerts.confirm': '先问我',
|
|
1023
|
+
'alerts.copy': '仅复制',
|
|
1024
|
+
'alerts.continueHint': '在此文件夹打开新会话并填好交接内容,在那里按 Enter 即可继续。当前对话保留。',
|
|
1025
|
+
'alerts.confirmHint': '只写好摘要就停下,由你决定是否转到新会话。当前对话保留。',
|
|
1026
|
+
'alerts.copyHint': '只把摘要复制到剪贴板,其他不变。',
|
|
1027
|
+
'alerts.handoffReady': '交接已就绪',
|
|
1028
|
+
'alerts.handoffReadyBody': '要转到此文件夹的新会话吗?当前对话保持不变。',
|
|
1029
|
+
'alerts.openNew': '转到新会话',
|
|
1030
|
+
'alerts.openedBody': '已打开新会话并填好交接内容:在那里按 Enter 继续。',
|
|
1031
|
+
'alerts.readHandoffFile': '请阅读 {path} 中的交接内容并接着进行。',
|
|
1032
|
+
'alerts.copyText': '复制',
|
|
1033
|
+
'toasts.newSessionFallback': '无法打开新会话,已改为复制交接内容。',
|
|
1034
|
+
'alerts.kind': '方式 ',
|
|
1035
|
+
'alerts.then': '然后 ',
|
|
1036
|
+
'alerts.demoDown': 'Jev 额度用尽(演示)',
|
|
1037
|
+
'alerts.copied': '已复制续接说明,此对话已保留。',
|
|
1038
|
+
'alerts.compactFailed': '压缩未完成。',
|
|
1039
|
+
// Settings.
|
|
1040
|
+
'settings.effortBlurb': '自动模式如何为你发送的每条提示词选择推理强度。',
|
|
1041
|
+
'settings.workers': 'Worker',
|
|
1042
|
+
'settings.mode': '模式',
|
|
1043
|
+
'settings.modeNone': '默认',
|
|
1044
|
+
'band.mode': '模式',
|
|
1045
|
+
'band.modeTip': '“{name}”模式已开启,Worker 按它分配。可在快捷设置中更改。',
|
|
1046
|
+
'settings.workersBlurb': '每类委派任务由哪个代理执行。',
|
|
1047
|
+
'settings.judge': '判定',
|
|
1048
|
+
'settings.judgeBlurb': '由谁决定:提示词的推理强度、任务的等级。',
|
|
1049
|
+
'settings.cacheBlurb': '离开时让提示词缓存保持有效。',
|
|
1050
|
+
'settings.handoff': '压缩与交接',
|
|
1051
|
+
'settings.handoffBlurb': '较重的对话如何压缩或交接到新对话。',
|
|
1052
|
+
'settings.look': '显示',
|
|
1053
|
+
'settings.lookBlurb': '状态栏显示什么、如何显示。',
|
|
1054
|
+
'settings.light': '轻量',
|
|
1055
|
+
'settings.lightBlurb': '杂务、重复、查询',
|
|
1056
|
+
'settings.standard': '标准',
|
|
1057
|
+
'settings.standardBlurb': '按既定设计实现、调研、评审',
|
|
1058
|
+
'settings.deep': '深度',
|
|
1059
|
+
'settings.deepBlurb': '需谨慎处理的任务、高风险任务、复杂推理',
|
|
1060
|
+
'settings.design': '设计',
|
|
1061
|
+
'settings.designBlurb': 'UI、视觉、品牌',
|
|
1062
|
+
'settings.tierAlt': '{name}等级',
|
|
1063
|
+
'settings.biasAlt': '倾向 {value}{selected}',
|
|
1064
|
+
'settings.selected': ' (已选)',
|
|
1065
|
+
'settings.onSuffix': ' (开启)',
|
|
1066
|
+
'settings.offSuffix': ' (关闭)',
|
|
1067
|
+
'settings.mixedSuffix': ' (部分开启)',
|
|
1068
|
+
'settings.cheaper': '更省',
|
|
1069
|
+
'settings.smarter': '更聪明',
|
|
1070
|
+
'settings.autoHint': '按提示词选择;你手动选择后即关闭',
|
|
1071
|
+
'settings.lean': '倾向',
|
|
1072
|
+
'settings.leanHint': '只影响难分的情况',
|
|
1073
|
+
'settings.floor': '不低于',
|
|
1074
|
+
'settings.ceiling': '不高于',
|
|
1075
|
+
'settings.floorWins': '低于下限:以下限为准',
|
|
1076
|
+
'settings.unavailable': ' (不可用)',
|
|
1077
|
+
'settings.takesOver': '接管范围',
|
|
1078
|
+
'settings.autoAgent': 'ripple:auto',
|
|
1079
|
+
'settings.allSpawns': '所有子代理',
|
|
1080
|
+
'settings.fallback': '备用',
|
|
1081
|
+
'settings.fallbackHint': '当某等级的供应商额度用尽时',
|
|
1082
|
+
'settings.haiku': 'Haiku',
|
|
1083
|
+
'settings.jev': 'Jev',
|
|
1084
|
+
'settings.routerModel': '路由模型',
|
|
1085
|
+
'settings.haikuHint': '使用你的 Claude 登录运行 Haiku 5.5 · 每条提示词约 1 秒',
|
|
1086
|
+
'settings.keyEnv': '来自 TYPESAFE_API_KEY',
|
|
1087
|
+
'settings.keyFile': '已保存在 ~/.config/jev/.env',
|
|
1088
|
+
'settings.keySaved': '已保存',
|
|
1089
|
+
'settings.keyPaste': '粘贴 TypeSafe API 密钥',
|
|
1090
|
+
'settings.saveKey': '保存',
|
|
1091
|
+
'settings.testing': '测试中…',
|
|
1092
|
+
'settings.keyWorks': '密钥有效',
|
|
1093
|
+
'settings.keyRejected': '密钥被拒绝',
|
|
1094
|
+
'settings.key': '密钥',
|
|
1095
|
+
'settings.test': '测试',
|
|
1096
|
+
'settings.noModels': '路由服务未列出任何模型',
|
|
1097
|
+
'settings.haikuFallback': '失败时回退到 Haiku',
|
|
1098
|
+
'settings.keepWarm': '缓存保温',
|
|
1099
|
+
'settings.keepWarmHint': '在缓存过期前 ping 一次',
|
|
1100
|
+
'settings.for': '持续',
|
|
1101
|
+
'settings.afterReply': '自最后一次回复起',
|
|
1102
|
+
'settings.chatsFrom': '对话规模',
|
|
1103
|
+
'settings.tokens': 'token 起',
|
|
1104
|
+
'settings.warmCost': '每次 ping 都会从缓存重新读取整个对话:约为其输入价格的十分之一,并按同样比例占用套餐限额。',
|
|
1105
|
+
'settings.noSkill': '无:由一轮对话写入 HANDOFF.md',
|
|
1106
|
+
'settings.compactWith': '压缩方式',
|
|
1107
|
+
'settings.sessionCompactor': '会话自带',
|
|
1108
|
+
'settings.afterHandoff': '交接之后',
|
|
1109
|
+
'settings.handoffButton': '交接按钮',
|
|
1110
|
+
'settings.whenAdvised': '建议时',
|
|
1111
|
+
'settings.always': '始终',
|
|
1112
|
+
'settings.fullHandoff': '完整交接',
|
|
1113
|
+
'settings.heavyAt': '使用率阈值',
|
|
1114
|
+
'settings.context': '上下文',
|
|
1115
|
+
'settings.cacheTimer': '缓存计时',
|
|
1116
|
+
'settings.reason': '原因',
|
|
1117
|
+
'settings.route': '路由',
|
|
1118
|
+
'settings.limits': '限额',
|
|
1119
|
+
'settings.layout': '布局',
|
|
1120
|
+
'settings.dashboard': '仪表盘',
|
|
1121
|
+
'settings.minimal': '极简',
|
|
1122
|
+
'settings.footerHint': '在底栏显示一行',
|
|
1123
|
+
'settings.appearance': '外观',
|
|
1124
|
+
'settings.dark': '深色',
|
|
1125
|
+
'settings.lightAppearance': '浅色',
|
|
1126
|
+
'settings.show': '显示',
|
|
1127
|
+
'settings.language': '语言',
|
|
1128
|
+
'settings.title': '设置',
|
|
1129
|
+
'settings.quick': '快捷设置',
|
|
1130
|
+
'settings.effortAuto': '自动推理强度',
|
|
1131
|
+
'settings.openAll': '打开全部设置',
|
|
1132
|
+
'setup.workersNote': 'Worker 默认使用阶梯;详细设置在控制面板中。',
|
|
1133
|
+
'setup.changeDashboard': '在状态栏或 /ripple 中快速调整;打开全部设置可前往控制面板。',
|
|
1134
|
+
'settings.save': '保存',
|
|
1135
|
+
'settings.discard': '放弃',
|
|
1136
|
+
'settings.close': '关闭',
|
|
1137
|
+
'settings.autoLine': '为每条提示词自动选择合适的推理强度。',
|
|
1138
|
+
'settings.autoOffNote': '沿用你在应用强度菜单中选择的级别。',
|
|
1139
|
+
'settings.judgeLine': '决定提示词的推理强度和委派任务的等级。',
|
|
1140
|
+
'settings.modeLine': '选择执行委派任务的一组代理。',
|
|
1141
|
+
'settings.warmLine': '在缓存过期前 ping 一次,让它保持温热。',
|
|
1142
|
+
'settings.warmCostShort': '每次 ping 约为输入价格的十分之一。',
|
|
1143
|
+
'settings.sayAuto': '由 {judge} 判定,为每条提示词选择推理强度。',
|
|
1144
|
+
'settings.sayManual': '推理强度保持你在应用中设置的级别。',
|
|
1145
|
+
'settings.sayWarm': '缓存我会替你保温。',
|
|
1146
|
+
'band.hideBand': '隐藏横条',
|
|
1147
|
+
'settings.unsaved': '● 未保存',
|
|
1148
|
+
// Setup.
|
|
1149
|
+
'setup.judgeTitle': '由谁决定',
|
|
1150
|
+
'setup.judgeBlurb': '一个小而快的判定模型为每条提示词选强度、为每个任务选 Worker。',
|
|
1151
|
+
'setup.workersTitle': '由谁干活',
|
|
1152
|
+
'setup.cacheTitle': '保持缓存有效?',
|
|
1153
|
+
'setup.cacheBlurb': '闲置对话的缓存会过期;你离开时,Ripple 可以 ping 它来保持。',
|
|
1154
|
+
'setup.effortSummary': '自动模式{state},由 {judge} 判定',
|
|
1155
|
+
'setup.cacheSummary': '每次回复后保温 {hours} 小时',
|
|
1156
|
+
'setup.cacheOff': '不保温',
|
|
1157
|
+
'setup.ready': 'ClaudeRipple 已就绪',
|
|
1158
|
+
'setup.welcome': '欢迎使用 ClaudeRipple',
|
|
1159
|
+
'setup.start': '开始',
|
|
1160
|
+
'setup.finish': '完成',
|
|
1161
|
+
'setup.next': '下一步',
|
|
1162
|
+
'setup.back': '上一步',
|
|
1163
|
+
'setup.skip': '跳过设置',
|
|
1164
|
+
// Agents.
|
|
1165
|
+
'agents.waiting': '等待中',
|
|
1166
|
+
'agents.routerModel': '路由模型',
|
|
1167
|
+
'agents.marker': '标记',
|
|
1168
|
+
'agents.default': '默认',
|
|
1169
|
+
'agents.by': '来源:{name}',
|
|
1170
|
+
'agents.thinking': '思考中',
|
|
1171
|
+
'agents.fallback': '▲ 已运行备用代理:{reason}',
|
|
1172
|
+
'agents.emptyTitle': '暂无代理',
|
|
1173
|
+
'agents.emptyBody': 'Claude 委派的任务会显示在这里,还有 Ripple 选的 Worker 和原因。',
|
|
1174
|
+
'agents.liveCount': '{count} 个运行中',
|
|
1175
|
+
'agents.noneRunning': '无运行中的代理',
|
|
1176
|
+
'agents.doneCount': '{count} 个已完成',
|
|
1177
|
+
// Log.
|
|
1178
|
+
'log.resent': '↻ {status} 已重发',
|
|
1179
|
+
'log.input': '输入 {tokens}',
|
|
1180
|
+
'log.output': '输出 {tokens}',
|
|
1181
|
+
'log.thisSession': '本会话',
|
|
1182
|
+
'log.allSessions': '所有会话',
|
|
1183
|
+
'log.showAll': '显示所有会话',
|
|
1184
|
+
'log.onlySession': '仅本会话',
|
|
1185
|
+
'log.legend': '● 本会话 ○ 其他会话',
|
|
1186
|
+
'log.empty': '暂无模型请求。',
|
|
1187
|
+
'log.judge': '强度判定',
|
|
1188
|
+
'log.judgeWorker': '工作者判定',
|
|
1189
|
+
'log.judgeFell': '{asked} 失败 → {by}',
|
|
1190
|
+
'log.sure': '确信 {percent}%',
|
|
1191
|
+
// Toasts and locally generated failure/reason text.
|
|
1192
|
+
'toasts.keySingle': '请只粘贴一个 TypeSafe API 密钥',
|
|
1193
|
+
'toasts.keyPrivateFailed': '无法将 Jev 密钥文件设为私有 (chmod 600)',
|
|
1194
|
+
'toasts.keySaved': 'ClaudeRipple: Jev 密钥已私密保存;环境变量中的密钥仍然优先。',
|
|
1195
|
+
'toasts.judgeDown': 'ClaudeRipple: {reason};保持当前推理强度或改问 Haiku。',
|
|
1196
|
+
'toasts.keyMissing': '缺少 Jev 密钥',
|
|
1197
|
+
'toasts.jevNoVerdict': 'Jev 未给出判定',
|
|
1198
|
+
'judge.keptUnsure': '判断不一,保持当前强度',
|
|
1199
|
+
'toasts.routerNoVerdict': '路由判定模型未给出判定',
|
|
1200
|
+
'toasts.haikuNoVerdict': 'Haiku 未给出判定',
|
|
1201
|
+
'toasts.noVerdict': '无判定',
|
|
1202
|
+
'toasts.judgeUnavailable': '判定模型不可用',
|
|
1203
|
+
'toasts.explicitMarker': '显式 Worker 标记',
|
|
1204
|
+
'toasts.workerFallback': 'ClaudeRipple: {reason};改为运行 {name}。',
|
|
1205
|
+
'toasts.modeEnded': '{name} 模式已结束',
|
|
1206
|
+
'toasts.yourPick': '你的选择',
|
|
1207
|
+
'toasts.effortEnter': 'ClaudeRipple: 按 Enter,让应用的推理强度控件跟随你的选择。',
|
|
1208
|
+
'toasts.settingsSaved': 'ClaudeRipple: 设置已保存。',
|
|
1209
|
+
'toasts.clipboardFallback': 'ClaudeRipple: 剪贴板不可用,续接说明已放入提示词框。',
|
|
1210
|
+
'toasts.handoffFailed': 'ClaudeRipple: 交接失败,未清除任何内容。',
|
|
1211
|
+
'toasts.compactFailed': 'ClaudeRipple: 压缩失败,对话已保留。',
|
|
1212
|
+
'toasts.warmStopped': 'ClaudeRipple: {reason}',
|
|
1213
|
+
'toasts.warmBoundReason': '保温已停止:达到时间上限',
|
|
1214
|
+
'toasts.warmBound': 'ClaudeRipple: 已达到时间上限,保温已停止。',
|
|
1215
|
+
'toasts.appEffort': '应用推理强度',
|
|
1216
|
+
'toasts.appEffortChanged': '应用推理强度已更改',
|
|
1217
|
+
'toasts.autoOff': 'ClaudeRipple: 你在应用中更改了推理强度,自动模式已关闭。',
|
|
1218
|
+
'toasts.handoffEmpty': 'ClaudeRipple: 交接没有产生结果,未清除任何内容。',
|
|
1219
|
+
'toasts.ownModel': 'ClaudeRipple: {name} 使用自己的模型运行,而不是“{model}”',
|
|
1220
|
+
'toasts.transcriptEmpty': '对话记录为空或超出压缩预算',
|
|
1221
|
+
'toasts.summaryEmpty': 'Haiku 未返回可用的摘要',
|
|
1222
|
+
'toasts.compactFallback': 'ClaudeRipple: Haiku 压缩失败,改用会话自带的压缩。',
|
|
1223
|
+
'toasts.error': 'ClaudeRipple: {reason}',
|
|
1224
|
+
'toasts.jevTimeout': 'Jev 超时',
|
|
1225
|
+
'toasts.jevRejected': 'Jev 密钥被拒绝',
|
|
1226
|
+
'toasts.jevCredits': 'Jev 额度用尽',
|
|
1227
|
+
'toasts.jevRateLimited': 'Jev 请求受限',
|
|
1228
|
+
'toasts.jevHttp': 'Jev 请求失败 ({status})',
|
|
1229
|
+
'toasts.warmNoReply': '保温已停止:ping 无回复',
|
|
1230
|
+
'toasts.warmNoCache': '保温已停止:未读取缓存',
|
|
1231
|
+
'toasts.providerQuota': 'ChatGPT 账号不可用或额度已用尽',
|
|
1232
|
+
'toasts.saveMode': '节省模式',
|
|
1233
|
+
'toasts.yourSettings': '你的设置',
|
|
1234
|
+
'toasts.jevNetwork': 'Jev 网络不可用',
|
|
1235
|
+
'toasts.workerMissing': '未安装 {name}',
|
|
1236
|
+
// Commands (stats and debug labels included).
|
|
1237
|
+
'commands.description': 'ClaudeRipple 推理强度、Worker、缓存与会话工具',
|
|
1238
|
+
'commands.argumentHint': 'settings|setup|auto|warm|save|handoff [full]|stats|debug|agents|log|bar|cold|swamp|hot|down',
|
|
1239
|
+
'commands.logDescription': '打开或关闭 ClaudeRipple 请求日志',
|
|
1240
|
+
'commands.barDescription': '显示或隐藏 ClaudeRipple 状态栏',
|
|
1241
|
+
'commands.logTitle': 'ClaudeRipple',
|
|
1242
|
+
'commands.agentsTitle': 'ClaudeRipple 代理',
|
|
1243
|
+
'commands.help': 'ClaudeRipple 子命令:settings, setup, auto, warm, save, handoff [full], stats, debug, agents, log, bar, cold, swamp, hot, down.',
|
|
1244
|
+
'commands.done': 'ClaudeRipple: {command}.',
|
|
1245
|
+
'commands.logOpened': '已打开 ClaudeRipple 日志。',
|
|
1246
|
+
'commands.logClosed': '已关闭 ClaudeRipple 日志。',
|
|
1247
|
+
'commands.barShown': 'ClaudeRipple 状态栏已显示在提示词上方。',
|
|
1248
|
+
'commands.barHidden': 'ClaudeRipple 状态栏已隐藏,/ripple-bar 可重新显示。',
|
|
1249
|
+
'commands.statsAuto': '自动:{prompts} 条提示词,{requests} 次请求;加权 token {total}',
|
|
1250
|
+
'commands.statsTokens': 'Token:输入 {input},写入 {write},读取 {read},输出 {output}',
|
|
1251
|
+
'commands.statsEffort': '{effort} {prompts} 条提示词 / 加权 {cost}',
|
|
1252
|
+
'commands.statsJudges': '判定:haiku {haiku},jev {jev},模型 {model};{tokens} token,{ms} ms(平均 {avg} ms)',
|
|
1253
|
+
'commands.statsWorkers': 'Worker:{workers}',
|
|
1254
|
+
'commands.statsWarm': '保温:ping {pings} 次,加权 token {cost}',
|
|
1255
|
+
'commands.debugJudge': '判定',
|
|
1256
|
+
'commands.debugJudgeModel': '判定模型',
|
|
1257
|
+
'commands.debugPick': '选择',
|
|
1258
|
+
'commands.debugPaused': '已暂停',
|
|
1259
|
+
'commands.debugCache': '缓存',
|
|
1260
|
+
'commands.debugWarm': '保温',
|
|
1261
|
+
'commands.debugLastSpawn': '最近派生',
|
|
1262
|
+
'commands.debugLastRequest': '最近请求',
|
|
1263
|
+
'commands.debugEffort': '推理强度',
|
|
1264
|
+
'commands.debugWhy': '原因',
|
|
1265
|
+
'commands.debugBy': '来源',
|
|
1266
|
+
'commands.debugAt': '时间',
|
|
1267
|
+
'commands.debugSure': '把握',
|
|
1268
|
+
'commands.debugTtlMs': 'TTL (ms)',
|
|
1269
|
+
'commands.debugLastReplyAt': '最近回复时间',
|
|
1270
|
+
'commands.debugExpiresAt': '过期时间',
|
|
1271
|
+
'commands.debugPings': 'ping 次数',
|
|
1272
|
+
'commands.debugCost': '花费',
|
|
1273
|
+
'commands.debugStopped': '停止原因',
|
|
1274
|
+
'commands.debugLastPingAt': '最近 ping 时间',
|
|
1275
|
+
'commands.debugTier': '等级',
|
|
1276
|
+
'commands.debugTarget': '目标',
|
|
1277
|
+
'commands.debugAgent': '代理',
|
|
1278
|
+
'commands.debugModel': '模型',
|
|
1279
|
+
'commands.debugMs': 'ms',
|
|
1280
|
+
'commands.debugFallbackReason': '备用原因',
|
|
1281
|
+
'commands.debugAppEffort': '应用推理强度',
|
|
1282
|
+
'commands.debugSentEffort': '发送的推理强度',
|
|
1283
|
+
'commands.debugLog': 'ClaudeRipple {where}: {reason}',
|
|
1284
|
+
'commands.routerHttp': '路由服务 HTTP {status}',
|
|
1285
|
+
'commands.compactSkip': '需要压缩时,ClaudeRipple 会用 Haiku 进行总结。',
|
|
1286
|
+
// Workers card, Jev source, and worker picks in the Agents pane.
|
|
1287
|
+
'workers.previous': '上一页',
|
|
1288
|
+
'workers.next': '下一页',
|
|
1289
|
+
'workers.page': '第 {page}/{pages} 页',
|
|
1290
|
+
'workers.general': '通用',
|
|
1291
|
+
'workers.design': '设计',
|
|
1292
|
+
'workers.frontend': '前端',
|
|
1293
|
+
'workers.backend': '后端',
|
|
1294
|
+
'workers.infra': '基础设施',
|
|
1295
|
+
'workers.data': '数据',
|
|
1296
|
+
'workers.test': '测试',
|
|
1297
|
+
'workers.docs': '文档',
|
|
1298
|
+
'workers.research': '调研',
|
|
1299
|
+
'workers.mode': '方式',
|
|
1300
|
+
'workers.rung.light': 'Low Worker',
|
|
1301
|
+
'workers.rung.standard': 'Medium Worker',
|
|
1302
|
+
'workers.rung.hard': 'High Worker',
|
|
1303
|
+
'workers.rung.plan': 'Max Worker',
|
|
1304
|
+
'workers.rungHint.light': '查找文件、单次查询、浏览日志、机械式修改',
|
|
1305
|
+
'workers.rungHint.standard': '按明确规格实现、重构、摘要、草稿',
|
|
1306
|
+
'workers.rungHint.hard': '困难的调试、多文件改动、独立评审与反驳',
|
|
1307
|
+
'workers.rungHint.plan': '力求最佳结果:规划、设计、架构、意见',
|
|
1308
|
+
'workers.rungEmpty': '{rung}没有设置模型',
|
|
1309
|
+
'workers.notCandidate': '{name} 不是此领域的候选',
|
|
1310
|
+
'workers.sessionModel': '会话模型',
|
|
1311
|
+
'workers.offset': '强度偏移',
|
|
1312
|
+
'workers.anyEffort': '不限',
|
|
1313
|
+
'workers.noTarget': '使用下一等级 / 备用',
|
|
1314
|
+
'workers.judgeBlurb': '由谁决定:提示词的推理强度、任务的领域和等级。',
|
|
1315
|
+
'workers.disabled': '{provider} 已关闭',
|
|
1316
|
+
'workers.nested': '子代理不能再启动子代理:这部分请自己完成,然后汇报结果。',
|
|
1317
|
+
'workers.none': '没有可用的已启用 Worker',
|
|
1318
|
+
'workers.loading': '正在读取路由器的 Worker 列表…',
|
|
1319
|
+
'workers.providerSub': '已开启 {on}/{count}',
|
|
1320
|
+
'workers.fallbackHint': '当固定的目标无法运行时',
|
|
1321
|
+
'workers.pinDetails': '更多选项',
|
|
1322
|
+
'workers.back': '返回',
|
|
1323
|
+
'settings.ladderWaiting': '正在等待路由器的模型列表。',
|
|
1324
|
+
'jev.zenMissing': 'ClaudeRipple 配置中没有 OpenCode Zen 授权密钥',
|
|
1325
|
+
'agents.domainLevel': '{domain} / {level}',
|
|
1326
|
+
'agents.tokens': '≈{tokens} token',
|
|
1327
|
+
// Time units: countdowns, reset times, durations.
|
|
1328
|
+
'units.seconds': '{n}秒',
|
|
1329
|
+
'units.minutes': '{n}分钟',
|
|
1330
|
+
'units.hours': '{n}小时',
|
|
1331
|
+
'units.days': '{n}天',
|
|
1332
|
+
'units.minSec': '{m}分{s}秒',
|
|
1333
|
+
'units.hourMin': '{h}小时{m}分',
|
|
1334
|
+
}
|
|
1335
|
+
|
|
1336
|
+
const JA: Record<Key, string> = {
|
|
1337
|
+
// Band (including shared display labels and accessibility text).
|
|
1338
|
+
'band.brand': 'ClaudeRipple',
|
|
1339
|
+
'band.effort': '推論強度',
|
|
1340
|
+
'band.model': 'モデル',
|
|
1341
|
+
'band.auto': '自動',
|
|
1342
|
+
'band.manual': '手動',
|
|
1343
|
+
'band.paused': '一時停止',
|
|
1344
|
+
'band.off': 'オフ',
|
|
1345
|
+
'band.on': 'オン',
|
|
1346
|
+
'band.autoOff': '自動オフ',
|
|
1347
|
+
'band.autoPaused': '自動は一時停止中',
|
|
1348
|
+
'band.deciding': '判定中…',
|
|
1349
|
+
'band.decidingText': '◌ 判定中…',
|
|
1350
|
+
'band.low': '低',
|
|
1351
|
+
'band.medium': '中',
|
|
1352
|
+
'band.high': '高',
|
|
1353
|
+
'band.xhigh': '超高',
|
|
1354
|
+
'band.max': '最大',
|
|
1355
|
+
'band.pausedHint': 'このモデルでは自動を一時停止しています。ここで推論強度を変えてもキャッシュが保たれるかは確認されていません。',
|
|
1356
|
+
'band.offHint': '自動はオフです。推論強度はご自身で選びます。',
|
|
1357
|
+
'band.decidingHint': '判定モデルがこのプロンプトの推論強度を選んでいます。',
|
|
1358
|
+
'band.effortTitle': '推論強度 {value}{hint} · クリックして推論強度を選択',
|
|
1359
|
+
'band.effortAlt': '推論強度 {value} ({mode}){why}',
|
|
1360
|
+
'band.context': 'コンテキスト',
|
|
1361
|
+
'band.contextAlt': 'コンテキスト {value}/{window}({tokens} トークン)',
|
|
1362
|
+
'band.cache': 'キャッシュ',
|
|
1363
|
+
'band.cacheWarm': 'キャッシュ · 保持中',
|
|
1364
|
+
'band.cacheStopped': 'キャッシュ · 保持停止',
|
|
1365
|
+
'band.cold': '期限切れ',
|
|
1366
|
+
'band.cacheTip': 'プロンプトキャッシュ: {state}{warm}',
|
|
1367
|
+
'band.warmFor': 'あと {time} 有効',
|
|
1368
|
+
'band.expired': '期限切れ',
|
|
1369
|
+
'band.warmStoppedTip': ' · キャッシュ保持を停止: {reason}',
|
|
1370
|
+
'band.warmOnTip': ' · キャッシュ保持オン、ping {count} 回',
|
|
1371
|
+
'band.noReply': 'まだ応答なし',
|
|
1372
|
+
'band.cacheAlt': 'キャッシュ {state}{warm}',
|
|
1373
|
+
'band.timeLeft': '残り {time}',
|
|
1374
|
+
'band.unknown': '不明',
|
|
1375
|
+
'band.keepWarmAlt': '、キャッシュ保持オン{count}',
|
|
1376
|
+
'band.limitCaption': '{window}上限{save}',
|
|
1377
|
+
'band.saveCaption': ' · 節約',
|
|
1378
|
+
'band.limitAlt': '{window}上限 {value}{reset}',
|
|
1379
|
+
'band.fiveHour': '5時間',
|
|
1380
|
+
'band.weekly': '週間',
|
|
1381
|
+
'band.resetting': 'リセット中',
|
|
1382
|
+
'band.resetsIn': '{time}後にリセット',
|
|
1383
|
+
'band.resetsAt': '{time}にリセット',
|
|
1384
|
+
'band.router': 'ルーター',
|
|
1385
|
+
'band.routerAlt': 'ルーター: {value}',
|
|
1386
|
+
'band.resentCaption': '再送 · {status}',
|
|
1387
|
+
'band.failedCaption': '失敗 · {status}',
|
|
1388
|
+
'band.lastRoute': '直近のルート',
|
|
1389
|
+
'band.logHint': 'クリックでリクエストログを表示',
|
|
1390
|
+
'band.routeAlt': '直近のルート: {model}({provider} 経由){effort}{cache}, {time}{status}',
|
|
1391
|
+
'band.routeCache': ', キャッシュ {percent}%',
|
|
1392
|
+
'band.routeResent': ', {status} 再送',
|
|
1393
|
+
'band.routeFailed': ', {status} 失敗',
|
|
1394
|
+
'band.warm': '保持',
|
|
1395
|
+
'band.handoff': '引き継ぎ',
|
|
1396
|
+
'band.compact': '圧縮',
|
|
1397
|
+
'band.log': 'ログ',
|
|
1398
|
+
'band.agents': 'エージェント',
|
|
1399
|
+
'band.settings': '設定',
|
|
1400
|
+
'band.effortShort': '強度',
|
|
1401
|
+
'band.hit': 'ヒット {percent}%',
|
|
1402
|
+
'band.effortAutoAlt': '推論強度の自動 {state}',
|
|
1403
|
+
'band.warmAlt': 'キャッシュ保持 {state}',
|
|
1404
|
+
'band.handoffAdvised': '引き継ぎ(推奨: 今は新しい会話のほうが得です)',
|
|
1405
|
+
'band.closeLog': 'リクエストログを閉じる',
|
|
1406
|
+
'band.openLog': 'リクエストログを開く',
|
|
1407
|
+
'band.agentsAlt': 'エージェント: {count} 件実行中',
|
|
1408
|
+
'band.settingsAlt': 'Ripple の設定',
|
|
1409
|
+
'band.warmStopped': '保持停止',
|
|
1410
|
+
'band.warmText': '≈保持',
|
|
1411
|
+
'band.save': '節約',
|
|
1412
|
+
'band.resent': '{status} 再送',
|
|
1413
|
+
'band.cachePercent': 'キャッシュ {percent}%',
|
|
1414
|
+
'band.closeLogText': 'ログを閉じる',
|
|
1415
|
+
'band.footerPaused': ' (一時停止)',
|
|
1416
|
+
'band.footerOff': ' (自動オフ)',
|
|
1417
|
+
'band.footerManual': ' (手動)',
|
|
1418
|
+
'band.footerContext': 'ctx {percent}%',
|
|
1419
|
+
'band.routerRestart': 'ClaudeRipple: ここにルートを表示するにはルーターを再起動してください',
|
|
1420
|
+
'band.routerDown': 'ClaudeRipple: ルーターが応答しません',
|
|
1421
|
+
// Alerts.
|
|
1422
|
+
'alerts.coldTitle': 'キャッシュの期限が切れました',
|
|
1423
|
+
'alerts.coldBody': '{minutes} 分止まっていたので、次のプロンプトで {tokens} トークンを定価で読み直します。',
|
|
1424
|
+
'alerts.swampTitle': 'コンテキスト {percent}% 使用中',
|
|
1425
|
+
'alerts.swampBody': 'プロンプトごとに {tokens} トークンが付いていき、遅く・高く・曖昧になります。',
|
|
1426
|
+
'alerts.hotTitle': '{window}上限の {percent}% に到達',
|
|
1427
|
+
'alerts.saveOnBody': '節約モードがオン: リセットまで自動は「中」以下です。',
|
|
1428
|
+
'alerts.saveBody': '節約モードはリセットまで自動を「中」以下にとどめます。',
|
|
1429
|
+
'alerts.saveOff': '節約モードをオフ',
|
|
1430
|
+
'alerts.save': '節約モード',
|
|
1431
|
+
'alerts.notNow': 'あとで',
|
|
1432
|
+
'alerts.judgeTitle': '推論強度の判定モデルが応答しません',
|
|
1433
|
+
'alerts.judgeNetworkTitle': '接続が不安定なため Haiku が代わりに判定します',
|
|
1434
|
+
'alerts.routerModel': 'ルーターのモデル',
|
|
1435
|
+
'alerts.judgeBody': '{judge}: {reason}。{fallback}',
|
|
1436
|
+
'alerts.keepEffort': 'その間は今の推論強度のままです。',
|
|
1437
|
+
'alerts.askHaiku': 'その間は Haiku が判定します。',
|
|
1438
|
+
'alerts.openSettings': '設定を開く',
|
|
1439
|
+
'alerts.compactTitle': 'この会話を圧縮',
|
|
1440
|
+
'alerts.compactBody': '要約に必ず残す内容を入力してください。空欄の場合は自動で要約します。',
|
|
1441
|
+
'alerts.cancel': 'キャンセル',
|
|
1442
|
+
'alerts.handoffTitle': '新しい会話に引き継ぐ',
|
|
1443
|
+
'alerts.quickBody': 'クイック: キャッシュから要約を書き、新しい会話が引き継ぎます。',
|
|
1444
|
+
'alerts.fullBody': 'フル: 引き継ぎスキルが git を確認し、先に HANDOFF.md を書きます。',
|
|
1445
|
+
'alerts.go': '実行',
|
|
1446
|
+
'alerts.dismiss': '閉じる',
|
|
1447
|
+
'alerts.handingOff': '引き継ぎ中…',
|
|
1448
|
+
'alerts.fullProgress': '引き継ぎを実行中: git を確認して HANDOFF.md を書いています。',
|
|
1449
|
+
'alerts.quickProgress': '新しい会話が再開できる要約を書いています。',
|
|
1450
|
+
'alerts.handoffDone': '引き継ぎ完了',
|
|
1451
|
+
'alerts.summaryReady': '要約ができました。',
|
|
1452
|
+
'alerts.copyAgain': 'もう一度コピー',
|
|
1453
|
+
'alerts.compacting': '圧縮中…',
|
|
1454
|
+
'alerts.compactingBody': '会話を要約しています。完了後は要約をもとに会話を続けます。',
|
|
1455
|
+
'alerts.compacted': '圧縮しました',
|
|
1456
|
+
'alerts.compactedBody': '要約をもとに会話を続けます。',
|
|
1457
|
+
'alerts.failed': '完了しませんでした',
|
|
1458
|
+
'alerts.unchanged': '何も変更していません。',
|
|
1459
|
+
'alerts.keep': '残す内容',
|
|
1460
|
+
'alerts.keepPlaceholder': '決定事項、未解決の質問、ファイル名…(任意)',
|
|
1461
|
+
'alerts.compactSubmit': '圧縮',
|
|
1462
|
+
'alerts.quick': 'クイック',
|
|
1463
|
+
'alerts.full': 'フル',
|
|
1464
|
+
'alerts.continue': '新しいセッションですぐ',
|
|
1465
|
+
'alerts.confirm': '先に確認',
|
|
1466
|
+
'alerts.copy': 'コピーのみ',
|
|
1467
|
+
'alerts.continueHint': 'このフォルダで新しいセッションを開き、引き継ぎを入力欄に入れておきます。そこで Enter を押すと続きます。今の会話はそのままです。',
|
|
1468
|
+
'alerts.confirmHint': '要約だけ作って止まります。新しいセッションへ移るかは自分で選びます。今の会話はそのままです。',
|
|
1469
|
+
'alerts.copyHint': '要約をクリップボードにコピーするだけで、ほかは変えません。',
|
|
1470
|
+
'alerts.handoffReady': '引き継ぎの準備完了',
|
|
1471
|
+
'alerts.handoffReadyBody': 'このフォルダの新しいセッションへ移りますか?今の会話はそのままです。',
|
|
1472
|
+
'alerts.openNew': '新しいセッションへ移る',
|
|
1473
|
+
'alerts.openedBody': '新しいセッションを開いて引き継ぎを入れました。そこで Enter を押すと続きます。',
|
|
1474
|
+
'alerts.readHandoffFile': '{path} の引き継ぎを読んで続けてください。',
|
|
1475
|
+
'alerts.copyText': 'コピー',
|
|
1476
|
+
'toasts.newSessionFallback': '新しいセッションを開けなかったため、引き継ぎをコピーしました。',
|
|
1477
|
+
'alerts.kind': '方式 ',
|
|
1478
|
+
'alerts.then': '次に ',
|
|
1479
|
+
'alerts.demoDown': 'Jev のクレジット切れ(デモ)',
|
|
1480
|
+
'alerts.copied': '再開メモをコピーしました。この会話はそのままです。',
|
|
1481
|
+
'alerts.compactFailed': '圧縮が完了しませんでした。',
|
|
1482
|
+
// Settings.
|
|
1483
|
+
'settings.effortBlurb': '送信するプロンプトごとに、自動が推論強度を選ぶ方法。',
|
|
1484
|
+
'settings.workers': 'ワーカー',
|
|
1485
|
+
'settings.mode': 'モード',
|
|
1486
|
+
'settings.modeNone': '基本',
|
|
1487
|
+
'band.mode': 'モード',
|
|
1488
|
+
'band.modeTip': '「{name}」モードがオンです。ワーカーはこれに従います。クイック設定で変更できます。',
|
|
1489
|
+
'settings.workersBlurb': '委任タスクの種類ごとに実行するエージェント。',
|
|
1490
|
+
'settings.judge': '判定',
|
|
1491
|
+
'settings.judgeBlurb': '誰が決めるか: プロンプトは推論強度、タスクは区分。',
|
|
1492
|
+
'settings.cacheBlurb': '席を外している間、プロンプトキャッシュを保持します。',
|
|
1493
|
+
'settings.handoff': '圧縮・引き継ぎ',
|
|
1494
|
+
'settings.handoffBlurb': '重くなった会話を圧縮するか、新しい会話に引き継ぐ方法。',
|
|
1495
|
+
'settings.look': '表示',
|
|
1496
|
+
'settings.lookBlurb': 'バーに何をどう表示するか。',
|
|
1497
|
+
'settings.light': '軽量',
|
|
1498
|
+
'settings.lightBlurb': '雑用、繰り返し、調べ物',
|
|
1499
|
+
'settings.standard': '標準',
|
|
1500
|
+
'settings.standardBlurb': '設計に沿った実装、調査、レビュー',
|
|
1501
|
+
'settings.deep': '熟考',
|
|
1502
|
+
'settings.deepBlurb': '慎重な判断、高リスクの作業、複雑な推論',
|
|
1503
|
+
'settings.design': 'デザイン',
|
|
1504
|
+
'settings.designBlurb': 'UI、ビジュアル、ブランド',
|
|
1505
|
+
'settings.tierAlt': '{name} 区分',
|
|
1506
|
+
'settings.biasAlt': '選択傾向 {value}{selected}',
|
|
1507
|
+
'settings.selected': ' (選択中)',
|
|
1508
|
+
'settings.onSuffix': ' (オン)',
|
|
1509
|
+
'settings.offSuffix': ' (オフ)',
|
|
1510
|
+
'settings.mixedSuffix': ' (一部オン)',
|
|
1511
|
+
'settings.cheaper': '安く',
|
|
1512
|
+
'settings.smarter': '賢く',
|
|
1513
|
+
'settings.autoHint': 'プロンプトごとに選択。自分で選ぶとオフ',
|
|
1514
|
+
'settings.lean': '選択傾向',
|
|
1515
|
+
'settings.leanHint': '判断が拮抗した場合のみ適用',
|
|
1516
|
+
'settings.floor': '下限',
|
|
1517
|
+
'settings.ceiling': '上限',
|
|
1518
|
+
'settings.floorWins': '下限より下: 下限が優先',
|
|
1519
|
+
'settings.unavailable': ' (利用不可)',
|
|
1520
|
+
'settings.takesOver': '対象',
|
|
1521
|
+
'settings.autoAgent': 'ripple:auto',
|
|
1522
|
+
'settings.allSpawns': 'すべてのサブエージェント',
|
|
1523
|
+
'settings.fallback': '代替',
|
|
1524
|
+
'settings.fallbackHint': '区分のプロバイダーが上限に達したとき',
|
|
1525
|
+
'settings.haiku': 'Haiku',
|
|
1526
|
+
'settings.jev': 'Jev',
|
|
1527
|
+
'settings.routerModel': 'ルーターのモデル',
|
|
1528
|
+
'settings.haikuHint': 'Claude のログインで Haiku 5.5 を使用 · 1 プロンプト約 1 秒',
|
|
1529
|
+
'settings.keyEnv': 'TYPESAFE_API_KEY から',
|
|
1530
|
+
'settings.keyFile': '~/.config/jev/.env に保存済み',
|
|
1531
|
+
'settings.keySaved': '保存済み',
|
|
1532
|
+
'settings.keyPaste': 'TypeSafe の API キーを貼り付け',
|
|
1533
|
+
'settings.saveKey': '保存',
|
|
1534
|
+
'settings.testing': 'テスト中…',
|
|
1535
|
+
'settings.keyWorks': 'キーは有効',
|
|
1536
|
+
'settings.keyRejected': 'キーが拒否されました',
|
|
1537
|
+
'settings.key': 'キー',
|
|
1538
|
+
'settings.test': 'テスト',
|
|
1539
|
+
'settings.noModels': 'ルーターのモデルが一覧にありません',
|
|
1540
|
+
'settings.haikuFallback': '失敗時は Haiku を使用',
|
|
1541
|
+
'settings.keepWarm': 'キャッシュ保持',
|
|
1542
|
+
'settings.keepWarmHint': '期限切れ直前にキャッシュへ ping',
|
|
1543
|
+
'settings.for': '期間',
|
|
1544
|
+
'settings.afterReply': '最後の応答から',
|
|
1545
|
+
'settings.chatsFrom': '対象の会話',
|
|
1546
|
+
'settings.tokens': 'トークン以上',
|
|
1547
|
+
'settings.warmCost': 'ping のたびに会話全体をキャッシュから読み直します。入力料金の約 10 分の 1 で、プランの上限も同じ割合で使います。',
|
|
1548
|
+
'settings.noSkill': 'なし: 1 ターンで HANDOFF.md を書く',
|
|
1549
|
+
'settings.compactWith': '圧縮方法',
|
|
1550
|
+
'settings.sessionCompactor': 'セッション標準',
|
|
1551
|
+
'settings.afterHandoff': '引き継ぎ後',
|
|
1552
|
+
'settings.handoffButton': '引き継ぎボタン',
|
|
1553
|
+
'settings.whenAdvised': '推奨時',
|
|
1554
|
+
'settings.always': '常に',
|
|
1555
|
+
'settings.fullHandoff': 'フル引き継ぎ',
|
|
1556
|
+
'settings.heavyAt': '使用率の目安',
|
|
1557
|
+
'settings.context': 'コンテキスト',
|
|
1558
|
+
'settings.cacheTimer': 'キャッシュタイマー',
|
|
1559
|
+
'settings.reason': '理由',
|
|
1560
|
+
'settings.route': 'ルート',
|
|
1561
|
+
'settings.limits': '上限',
|
|
1562
|
+
'settings.layout': 'レイアウト',
|
|
1563
|
+
'settings.dashboard': 'ダッシュボード',
|
|
1564
|
+
'settings.minimal': 'ミニマル',
|
|
1565
|
+
'settings.footerHint': 'フッターに 1 行で',
|
|
1566
|
+
'settings.appearance': 'テーマ',
|
|
1567
|
+
'settings.dark': 'ダーク',
|
|
1568
|
+
'settings.lightAppearance': 'ライト',
|
|
1569
|
+
'settings.show': '表示項目',
|
|
1570
|
+
'settings.language': '言語',
|
|
1571
|
+
'settings.title': '設定',
|
|
1572
|
+
'settings.quick': 'クイック設定',
|
|
1573
|
+
'settings.effortAuto': '推論強度の自動選択',
|
|
1574
|
+
'settings.openAll': 'すべての設定を開く',
|
|
1575
|
+
'setup.workersNote': 'ワーカーはラダーで開始します。詳細設定はダッシュボードにあります。',
|
|
1576
|
+
'setup.changeDashboard': 'バーや /ripple で素早く変更できます。すべての設定を開くとダッシュボードに移動します。',
|
|
1577
|
+
'settings.save': '保存',
|
|
1578
|
+
'settings.discard': '破棄',
|
|
1579
|
+
'settings.close': '閉じる',
|
|
1580
|
+
'settings.autoLine': 'プロンプトごとに推論強度を自動で選びます。',
|
|
1581
|
+
'settings.autoOffNote': 'アプリの強度メニューで選んだ値をそのまま使います。',
|
|
1582
|
+
'settings.judgeLine': 'プロンプトの推論強度と委任タスクの区分を決めます。',
|
|
1583
|
+
'settings.modeLine': '委任タスクを任せるエージェントの組み合わせです。',
|
|
1584
|
+
'settings.warmLine': 'キャッシュが切れる直前に ping して温めておきます。',
|
|
1585
|
+
'settings.warmCostShort': 'ping ごとに入力料金の約 10 分の 1 がかかります。',
|
|
1586
|
+
'settings.sayAuto': '{judge} の判定で、プロンプトごとに推論強度を選びます。',
|
|
1587
|
+
'settings.sayManual': '推論強度はアプリで選んだままにします。',
|
|
1588
|
+
'settings.sayWarm': 'キャッシュは冷める前に温めておきますね。',
|
|
1589
|
+
'band.hideBand': 'バンドを隠す',
|
|
1590
|
+
'settings.unsaved': '● 未保存',
|
|
1591
|
+
// Setup.
|
|
1592
|
+
'setup.judgeTitle': '誰が決めるか',
|
|
1593
|
+
'setup.judgeBlurb': '小さく速い判定モデルが、プロンプトごとの強度とタスクごとのワーカーを選びます。',
|
|
1594
|
+
'setup.workersTitle': '誰が作業するか',
|
|
1595
|
+
'setup.cacheTitle': 'キャッシュを保持しますか?',
|
|
1596
|
+
'setup.cacheBlurb': '放置した会話のキャッシュは切れます。離席中は Ripple が ping して保てます。',
|
|
1597
|
+
'setup.effortSummary': '自動 {state}、判定: {judge}',
|
|
1598
|
+
'setup.cacheSummary': '応答ごとに {hours} 時間保持',
|
|
1599
|
+
'setup.cacheOff': '保持しない',
|
|
1600
|
+
'setup.ready': 'ClaudeRipple の準備ができました',
|
|
1601
|
+
'setup.welcome': 'ClaudeRipple へようこそ',
|
|
1602
|
+
'setup.start': '開始',
|
|
1603
|
+
'setup.finish': '完了',
|
|
1604
|
+
'setup.next': '次へ',
|
|
1605
|
+
'setup.back': '戻る',
|
|
1606
|
+
'setup.skip': 'セットアップをスキップ',
|
|
1607
|
+
// Agents.
|
|
1608
|
+
'agents.waiting': '待機中',
|
|
1609
|
+
'agents.routerModel': 'ルーターのモデル',
|
|
1610
|
+
'agents.marker': 'マーカー',
|
|
1611
|
+
'agents.default': 'デフォルト',
|
|
1612
|
+
'agents.by': '選択元: {name}',
|
|
1613
|
+
'agents.thinking': '思考中',
|
|
1614
|
+
'agents.fallback': '▲ 代替で実行: {reason}',
|
|
1615
|
+
'agents.emptyTitle': 'エージェントはまだありません',
|
|
1616
|
+
'agents.emptyBody': 'Claude が委任したタスクがここに出ます。Ripple が選んだワーカーと理由も。',
|
|
1617
|
+
'agents.liveCount': '{count} 件実行中',
|
|
1618
|
+
'agents.noneRunning': '実行中なし',
|
|
1619
|
+
'agents.doneCount': '{count} 件完了',
|
|
1620
|
+
// Log.
|
|
1621
|
+
'log.resent': '↻ {status} 再送',
|
|
1622
|
+
'log.input': '入力 {tokens}',
|
|
1623
|
+
'log.output': '出力 {tokens}',
|
|
1624
|
+
'log.thisSession': 'このセッション',
|
|
1625
|
+
'log.allSessions': 'すべてのセッション',
|
|
1626
|
+
'log.showAll': 'すべてのセッションを表示',
|
|
1627
|
+
'log.onlySession': 'このセッションのみ',
|
|
1628
|
+
'log.legend': '● このセッション ○ ほかのセッション',
|
|
1629
|
+
'log.empty': 'モデルへのリクエストはまだありません。',
|
|
1630
|
+
'log.judge': '強度判定',
|
|
1631
|
+
'log.judgeWorker': 'ワーカー判定',
|
|
1632
|
+
'log.judgeFell': '{asked} 失敗 → {by}',
|
|
1633
|
+
'log.sure': '確信 {percent}%',
|
|
1634
|
+
// Toasts and locally generated failure/reason text.
|
|
1635
|
+
'toasts.keySingle': 'TypeSafe の API キーを 1 つだけ貼り付けてください',
|
|
1636
|
+
'toasts.keyPrivateFailed': 'Jev のキーファイルを非公開にできませんでした (chmod 600)',
|
|
1637
|
+
'toasts.keySaved': 'ClaudeRipple: Jev のキーを非公開で保存しました。環境変数のキーが引き続き優先されます。',
|
|
1638
|
+
'toasts.judgeDown': 'ClaudeRipple: {reason}。現在の推論強度を維持するか、Haiku に尋ねます。',
|
|
1639
|
+
'toasts.keyMissing': 'Jev のキーがありません',
|
|
1640
|
+
'toasts.jevNoVerdict': 'Jev が判定を返しませんでした',
|
|
1641
|
+
'judge.keptUnsure': '判断が割れたため現在の強度を維持',
|
|
1642
|
+
'toasts.routerNoVerdict': 'ルーターの判定モデルが判定を返しませんでした',
|
|
1643
|
+
'toasts.haikuNoVerdict': 'Haiku が判定を返しませんでした',
|
|
1644
|
+
'toasts.noVerdict': '判定なし',
|
|
1645
|
+
'toasts.judgeUnavailable': '判定モデルを利用できません',
|
|
1646
|
+
'toasts.explicitMarker': '明示的なワーカーマーカー',
|
|
1647
|
+
'toasts.workerFallback': 'ClaudeRipple: {reason}。{name} で実行します。',
|
|
1648
|
+
'toasts.modeEnded': '{name} モードが終了しました',
|
|
1649
|
+
'toasts.yourPick': 'ご自身の選択',
|
|
1650
|
+
'toasts.effortEnter': 'ClaudeRipple: Enter を押すと、アプリの推論強度もこの選択に合わせます。',
|
|
1651
|
+
'toasts.settingsSaved': 'ClaudeRipple: 設定を保存しました。',
|
|
1652
|
+
'toasts.clipboardFallback': 'ClaudeRipple: クリップボードが使えないため、再開メモをプロンプトに入れました。',
|
|
1653
|
+
'toasts.handoffFailed': 'ClaudeRipple: 引き継ぎに失敗しました。何も消去していません。',
|
|
1654
|
+
'toasts.compactFailed': 'ClaudeRipple: 圧縮に失敗しました。会話はそのままです。',
|
|
1655
|
+
'toasts.warmStopped': 'ClaudeRipple: {reason}',
|
|
1656
|
+
'toasts.warmBoundReason': 'キャッシュ保持を停止: 時間の上限に到達',
|
|
1657
|
+
'toasts.warmBound': 'ClaudeRipple: 時間の上限に達したため、キャッシュ保持を停止しました。',
|
|
1658
|
+
'toasts.appEffort': 'アプリの推論強度',
|
|
1659
|
+
'toasts.appEffortChanged': 'アプリの推論強度が変更されました',
|
|
1660
|
+
'toasts.autoOff': 'ClaudeRipple: アプリで推論強度が変更されたため、自動をオフにしました。',
|
|
1661
|
+
'toasts.handoffEmpty': 'ClaudeRipple: 引き継ぎの結果が空でした。何も消去していません。',
|
|
1662
|
+
'toasts.ownModel': 'ClaudeRipple: {name} は「{model}」ではなく、自身のモデルで実行されます',
|
|
1663
|
+
'toasts.transcriptEmpty': '会話記録が空か、圧縮できる量を超えています',
|
|
1664
|
+
'toasts.summaryEmpty': 'Haiku から使える要約が返りませんでした',
|
|
1665
|
+
'toasts.compactFallback': 'ClaudeRipple: Haiku での圧縮に失敗したため、セッション標準の圧縮を使います。',
|
|
1666
|
+
'toasts.error': 'ClaudeRipple: {reason}',
|
|
1667
|
+
'toasts.jevTimeout': 'Jev がタイムアウトしました',
|
|
1668
|
+
'toasts.jevRejected': 'Jev のキーが拒否されました',
|
|
1669
|
+
'toasts.jevCredits': 'Jev のクレジット切れ',
|
|
1670
|
+
'toasts.jevRateLimited': 'Jev のレート制限',
|
|
1671
|
+
'toasts.jevHttp': 'Jev へのリクエストに失敗しました ({status})',
|
|
1672
|
+
'toasts.warmNoReply': 'キャッシュ保持を停止: ping の応答なし',
|
|
1673
|
+
'toasts.warmNoCache': 'キャッシュ保持を停止: キャッシュが読まれませんでした',
|
|
1674
|
+
'toasts.providerQuota': 'ChatGPT アカウントが使えないか、上限に達しています',
|
|
1675
|
+
'toasts.saveMode': '節約モード',
|
|
1676
|
+
'toasts.yourSettings': 'ご自身の設定',
|
|
1677
|
+
'toasts.jevNetwork': 'Jev のネットワークに接続できません',
|
|
1678
|
+
'toasts.workerMissing': '{name} がインストールされていません',
|
|
1679
|
+
// Commands (stats and debug labels included).
|
|
1680
|
+
'commands.description': 'ClaudeRipple の推論強度、ワーカー、キャッシュ、セッションツール',
|
|
1681
|
+
'commands.argumentHint': 'settings|setup|auto|warm|save|handoff [full]|stats|debug|agents|log|bar|cold|swamp|hot|down',
|
|
1682
|
+
'commands.logDescription': 'ClaudeRipple のリクエストログを開閉',
|
|
1683
|
+
'commands.barDescription': 'ClaudeRipple のバーを表示・非表示',
|
|
1684
|
+
'commands.logTitle': 'ClaudeRipple',
|
|
1685
|
+
'commands.agentsTitle': 'ClaudeRipple エージェント',
|
|
1686
|
+
'commands.help': 'ClaudeRipple のサブコマンド: settings, setup, auto, warm, save, handoff [full], stats, debug, agents, log, bar, cold, swamp, hot, down.',
|
|
1687
|
+
'commands.done': 'ClaudeRipple: {command}.',
|
|
1688
|
+
'commands.logOpened': 'ClaudeRipple のログを開きました。',
|
|
1689
|
+
'commands.logClosed': 'ClaudeRipple のログを閉じました。',
|
|
1690
|
+
'commands.barShown': 'ClaudeRipple のバーをプロンプトの上に表示しました。',
|
|
1691
|
+
'commands.barHidden': 'ClaudeRipple のバーを非表示にしました。/ripple-bar で再表示できます。',
|
|
1692
|
+
'commands.statsAuto': '自動: プロンプト {prompts} 件、リクエスト {requests} 件、加重トークン {total}',
|
|
1693
|
+
'commands.statsTokens': 'トークン: 入力 {input}、書き込み {write}、読み取り {read}、出力 {output}',
|
|
1694
|
+
'commands.statsEffort': '{effort} プロンプト {prompts} 件 / 加重 {cost}',
|
|
1695
|
+
'commands.statsJudges': '判定: haiku {haiku}、jev {jev}、モデル {model}、{tokens} トークン、{ms} ms (平均 {avg} ms)',
|
|
1696
|
+
'commands.statsWorkers': 'ワーカー: {workers}',
|
|
1697
|
+
'commands.statsWarm': 'キャッシュ保持: ping {pings} 回、加重トークン {cost}',
|
|
1698
|
+
'commands.debugJudge': '判定',
|
|
1699
|
+
'commands.debugJudgeModel': '判定モデル',
|
|
1700
|
+
'commands.debugPick': '選択',
|
|
1701
|
+
'commands.debugPaused': '一時停止',
|
|
1702
|
+
'commands.debugCache': 'キャッシュ',
|
|
1703
|
+
'commands.debugWarm': 'キャッシュ保持',
|
|
1704
|
+
'commands.debugLastSpawn': '直近の起動',
|
|
1705
|
+
'commands.debugLastRequest': '直近のリクエスト',
|
|
1706
|
+
'commands.debugEffort': '推論強度',
|
|
1707
|
+
'commands.debugWhy': '理由',
|
|
1708
|
+
'commands.debugBy': '選択元',
|
|
1709
|
+
'commands.debugAt': '時刻',
|
|
1710
|
+
'commands.debugSure': '確信度',
|
|
1711
|
+
'commands.debugTtlMs': 'TTL (ms)',
|
|
1712
|
+
'commands.debugLastReplyAt': '直近の応答時刻',
|
|
1713
|
+
'commands.debugExpiresAt': '期限',
|
|
1714
|
+
'commands.debugPings': 'ping 回数',
|
|
1715
|
+
'commands.debugCost': 'コスト',
|
|
1716
|
+
'commands.debugStopped': '停止理由',
|
|
1717
|
+
'commands.debugLastPingAt': '直近の ping 時刻',
|
|
1718
|
+
'commands.debugTier': '区分',
|
|
1719
|
+
'commands.debugTarget': '対象',
|
|
1720
|
+
'commands.debugAgent': 'エージェント',
|
|
1721
|
+
'commands.debugModel': 'モデル',
|
|
1722
|
+
'commands.debugMs': 'ms',
|
|
1723
|
+
'commands.debugFallbackReason': '代替理由',
|
|
1724
|
+
'commands.debugAppEffort': 'アプリの推論強度',
|
|
1725
|
+
'commands.debugSentEffort': '送信した推論強度',
|
|
1726
|
+
'commands.debugLog': 'ClaudeRipple {where}: {reason}',
|
|
1727
|
+
'commands.routerHttp': 'ルーター HTTP {status}',
|
|
1728
|
+
'commands.compactSkip': '圧縮が必要なときは、ClaudeRipple が Haiku で要約します。',
|
|
1729
|
+
// Workers card, Jev source, and worker picks in the Agents pane.
|
|
1730
|
+
'workers.previous': '前へ',
|
|
1731
|
+
'workers.next': '次へ',
|
|
1732
|
+
'workers.page': '{page}/{pages} ページ',
|
|
1733
|
+
'workers.general': '汎用',
|
|
1734
|
+
'workers.design': 'デザイン',
|
|
1735
|
+
'workers.frontend': 'フロントエンド',
|
|
1736
|
+
'workers.backend': 'バックエンド',
|
|
1737
|
+
'workers.infra': 'インフラ',
|
|
1738
|
+
'workers.data': 'データ',
|
|
1739
|
+
'workers.test': 'テスト',
|
|
1740
|
+
'workers.docs': 'ドキュメント',
|
|
1741
|
+
'workers.research': '調査',
|
|
1742
|
+
'workers.mode': '方式',
|
|
1743
|
+
'workers.rung.light': 'Low ワーカー',
|
|
1744
|
+
'workers.rung.standard': 'Medium ワーカー',
|
|
1745
|
+
'workers.rung.hard': 'High ワーカー',
|
|
1746
|
+
'workers.rung.plan': 'Max ワーカー',
|
|
1747
|
+
'workers.rungHint.light': 'ファイル探し・単発の調べもの・ログの流し読み・機械的な修正',
|
|
1748
|
+
'workers.rungHint.standard': '仕様が決まった実装・リファクタリング・要約・下書き',
|
|
1749
|
+
'workers.rungHint.hard': '難しいデバッグ・複数ファイルの変更・独立したレビューと反論',
|
|
1750
|
+
'workers.rungHint.plan': '最良の結果:計画・設計・アーキテクチャ・意見',
|
|
1751
|
+
'workers.rungEmpty': '{rung}にモデルが設定されていません',
|
|
1752
|
+
'workers.notCandidate': '{name} はこの分野の候補ではありません',
|
|
1753
|
+
'workers.sessionModel': 'セッションのモデル',
|
|
1754
|
+
'workers.offset': '強度の補正',
|
|
1755
|
+
'workers.anyEffort': '指定なし',
|
|
1756
|
+
'workers.noTarget': '次の区分 / 代替を使用',
|
|
1757
|
+
'workers.judgeBlurb': '誰が決めるか: プロンプトは推論強度、タスクは分野と区分。',
|
|
1758
|
+
'workers.disabled': '{provider} はオフです',
|
|
1759
|
+
'workers.nested': 'サブエージェントは別のサブエージェントを起動できません。この部分は自分で行い、結果を報告してください。',
|
|
1760
|
+
'workers.none': '使える有効なワーカーがありません',
|
|
1761
|
+
'workers.loading': 'ルーターのワーカー一覧を読み込み中…',
|
|
1762
|
+
'workers.providerSub': '{count} 件中 {on} 件オン',
|
|
1763
|
+
'workers.fallbackHint': '固定した対象が実行できないとき',
|
|
1764
|
+
'workers.pinDetails': 'その他の設定',
|
|
1765
|
+
'workers.back': '戻る',
|
|
1766
|
+
'settings.ladderWaiting': 'ルーターのモデル一覧を待っています。',
|
|
1767
|
+
'jev.zenMissing': 'ClaudeRipple の設定に OpenCode Zen の認証キーがありません',
|
|
1768
|
+
'agents.domainLevel': '{domain} / {level}',
|
|
1769
|
+
'agents.tokens': '≈{tokens} トークン',
|
|
1770
|
+
// Time units: countdowns, reset times, durations.
|
|
1771
|
+
'units.seconds': '{n}秒',
|
|
1772
|
+
'units.minutes': '{n}分',
|
|
1773
|
+
'units.hours': '{n}時間',
|
|
1774
|
+
'units.days': '{n}日',
|
|
1775
|
+
'units.minSec': '{m}分{s}秒',
|
|
1776
|
+
'units.hourMin': '{h}時間{m}分',
|
|
1777
|
+
}
|
|
1778
|
+
|
|
1779
|
+
const ES: Record<Key, string> = {
|
|
1780
|
+
// Band (including shared display labels and accessibility text).
|
|
1781
|
+
'band.brand': 'ClaudeRipple',
|
|
1782
|
+
'band.effort': 'Esfuerzo',
|
|
1783
|
+
'band.model': 'Modelo',
|
|
1784
|
+
'band.auto': 'Auto',
|
|
1785
|
+
'band.manual': 'Manual',
|
|
1786
|
+
'band.paused': 'En pausa',
|
|
1787
|
+
'band.off': 'Desactivado',
|
|
1788
|
+
'band.on': 'Activado',
|
|
1789
|
+
'band.autoOff': 'Auto desactivado',
|
|
1790
|
+
'band.autoPaused': 'auto en pausa',
|
|
1791
|
+
'band.deciding': 'Decidiendo…',
|
|
1792
|
+
'band.decidingText': '◌ decidiendo…',
|
|
1793
|
+
'band.low': 'Bajo',
|
|
1794
|
+
'band.medium': 'Medio',
|
|
1795
|
+
'band.high': 'Alto',
|
|
1796
|
+
'band.xhigh': 'Muy alto',
|
|
1797
|
+
'band.max': 'Máximo',
|
|
1798
|
+
'band.pausedHint': 'Auto se pausa en este modelo: no se sabe si cambiar el esfuerzo aquí conserva la caché.',
|
|
1799
|
+
'band.offHint': 'Auto está desactivado; el esfuerzo lo eliges tú.',
|
|
1800
|
+
'band.decidingHint': 'El juez está eligiendo el esfuerzo para este prompt.',
|
|
1801
|
+
'band.effortTitle': 'Esfuerzo {value}{hint} · Haz clic para elegir un esfuerzo',
|
|
1802
|
+
'band.effortAlt': 'Esfuerzo {value} ({mode}){why}',
|
|
1803
|
+
'band.context': 'Contexto',
|
|
1804
|
+
'band.contextAlt': 'Contexto {value} de {window} ({tokens} tokens)',
|
|
1805
|
+
'band.cache': 'Caché',
|
|
1806
|
+
'band.cacheWarm': 'Caché · Caliente',
|
|
1807
|
+
'band.cacheStopped': 'Caché · Sin mantener',
|
|
1808
|
+
'band.cold': 'fría',
|
|
1809
|
+
'band.cacheTip': 'Caché del prompt {state}{warm}',
|
|
1810
|
+
'band.warmFor': 'caduca en {time}',
|
|
1811
|
+
'band.expired': 'caducada',
|
|
1812
|
+
'band.warmStoppedTip': ' · se dejó de mantener caliente: {reason}',
|
|
1813
|
+
'band.warmOnTip': ' · se mantiene caliente, {count} pings',
|
|
1814
|
+
'band.noReply': 'Aún sin respuesta',
|
|
1815
|
+
'band.cacheAlt': 'Caché {state}{warm}',
|
|
1816
|
+
'band.timeLeft': 'quedan {time}',
|
|
1817
|
+
'band.unknown': 'desconocida',
|
|
1818
|
+
'band.keepWarmAlt': ', se mantiene caliente{count}',
|
|
1819
|
+
'band.limitCaption': 'límite {window}{save}',
|
|
1820
|
+
'band.saveCaption': ' · AHORRO',
|
|
1821
|
+
'band.limitAlt': 'Límite {window}: {value}{reset}',
|
|
1822
|
+
'band.fiveHour': '5 horas',
|
|
1823
|
+
'band.weekly': 'semanal',
|
|
1824
|
+
'band.resetting': 'restableciendo',
|
|
1825
|
+
'band.resetsIn': 'se restablece en {time}',
|
|
1826
|
+
'band.resetsAt': 'se restablece a las {time}',
|
|
1827
|
+
'band.router': 'Router',
|
|
1828
|
+
'band.routerAlt': 'Router: {value}',
|
|
1829
|
+
'band.resentCaption': 'REENVIADO · {status}',
|
|
1830
|
+
'band.failedCaption': 'FALLÓ · {status}',
|
|
1831
|
+
'band.lastRoute': 'ÚLTIMA RUTA',
|
|
1832
|
+
'band.logHint': 'Haz clic para ver el registro de solicitudes',
|
|
1833
|
+
'band.routeAlt': 'Última ruta: {model} vía {provider}{effort}{cache}, {time}{status}',
|
|
1834
|
+
'band.routeCache': ', caché {percent}%',
|
|
1835
|
+
'band.routeResent': ', reenviado {status}',
|
|
1836
|
+
'band.routeFailed': ', falló {status}',
|
|
1837
|
+
'band.warm': 'Mantener',
|
|
1838
|
+
'band.handoff': 'Traspaso',
|
|
1839
|
+
'band.compact': 'Compactar',
|
|
1840
|
+
'band.log': 'Registro',
|
|
1841
|
+
'band.agents': 'Agentes',
|
|
1842
|
+
'band.settings': 'Ajustes',
|
|
1843
|
+
'band.effortShort': 'Esfuerzo',
|
|
1844
|
+
'band.hit': 'acierto {percent}%',
|
|
1845
|
+
'band.effortAutoAlt': 'Esfuerzo auto {state}',
|
|
1846
|
+
'band.warmAlt': 'Mantener la caché caliente {state}',
|
|
1847
|
+
'band.handoffAdvised': 'Traspaso (recomendado: ahora conviene una conversación nueva)',
|
|
1848
|
+
'band.closeLog': 'Cerrar el registro de solicitudes',
|
|
1849
|
+
'band.openLog': 'Abrir el registro de solicitudes',
|
|
1850
|
+
'band.agentsAlt': 'Agentes: {count} en ejecución',
|
|
1851
|
+
'band.settingsAlt': 'Configuración de Ripple',
|
|
1852
|
+
'band.warmStopped': 'sin mantener',
|
|
1853
|
+
'band.warmText': '≈caliente',
|
|
1854
|
+
'band.save': 'ahorro',
|
|
1855
|
+
'band.resent': '{status} reenviado',
|
|
1856
|
+
'band.cachePercent': 'caché {percent}%',
|
|
1857
|
+
'band.closeLogText': 'Cerrar registro',
|
|
1858
|
+
'band.footerPaused': ' (en pausa)',
|
|
1859
|
+
'band.footerOff': ' (auto desactivado)',
|
|
1860
|
+
'band.footerManual': ' (manual)',
|
|
1861
|
+
'band.footerContext': 'ctx {percent}%',
|
|
1862
|
+
'band.routerRestart': 'ClaudeRipple: reinicia el router para ver las rutas aquí',
|
|
1863
|
+
'band.routerDown': 'ClaudeRipple: el router no responde',
|
|
1864
|
+
// Alerts.
|
|
1865
|
+
'alerts.coldTitle': 'La caché se enfrió',
|
|
1866
|
+
'alerts.coldBody': 'Estuvo {minutes} min parada, así que el próximo prompt relee sus {tokens} tokens a precio completo.',
|
|
1867
|
+
'alerts.swampTitle': 'Contexto al {percent}%',
|
|
1868
|
+
'alerts.swampBody': '{tokens} tokens viajan con cada prompt: más lento, más caro, más difuso.',
|
|
1869
|
+
'alerts.hotTitle': 'Límite {window} al {percent}%',
|
|
1870
|
+
'alerts.saveOnBody': 'El modo ahorro está activado: Auto se queda en medio o menos hasta el reinicio.',
|
|
1871
|
+
'alerts.saveBody': 'El modo ahorro deja Auto en medio o menos hasta el reinicio.',
|
|
1872
|
+
'alerts.saveOff': 'Desactivar el modo ahorro',
|
|
1873
|
+
'alerts.save': 'Modo ahorro',
|
|
1874
|
+
'alerts.notNow': 'Ahora no',
|
|
1875
|
+
'alerts.judgeTitle': 'El juez de esfuerzo no responde',
|
|
1876
|
+
'alerts.judgeNetworkTitle': 'La conexión es inestable; Haiku decide por ahora',
|
|
1877
|
+
'alerts.routerModel': 'El modelo del router',
|
|
1878
|
+
'alerts.judgeBody': '{judge}: {reason}. {fallback}',
|
|
1879
|
+
'alerts.keepEffort': 'Mientras tanto se mantiene el esfuerzo actual.',
|
|
1880
|
+
'alerts.askHaiku': 'Mientras tanto juzga Haiku.',
|
|
1881
|
+
'alerts.openSettings': 'Abrir configuración',
|
|
1882
|
+
'alerts.compactTitle': 'Compactar esta conversación',
|
|
1883
|
+
'alerts.compactBody': 'Indica qué debe conservar el resumen; si lo dejas en blanco, se resumirá automáticamente.',
|
|
1884
|
+
'alerts.cancel': 'Cancelar',
|
|
1885
|
+
'alerts.handoffTitle': 'Traspasar a una conversación nueva',
|
|
1886
|
+
'alerts.quickBody': 'Rápido: un resumen desde la caché que retoma la conversación nueva.',
|
|
1887
|
+
'alerts.fullBody': 'Completo: la skill de traspaso revisa git y escribe HANDOFF.md antes.',
|
|
1888
|
+
'alerts.go': 'Iniciar',
|
|
1889
|
+
'alerts.dismiss': 'Cerrar',
|
|
1890
|
+
'alerts.handingOff': 'Traspasando…',
|
|
1891
|
+
'alerts.fullProgress': 'Ejecutando el traspaso: revisando git y escribiendo HANDOFF.md.',
|
|
1892
|
+
'alerts.quickProgress': 'Escribiendo un resumen desde el que pueda continuar una conversación nueva.',
|
|
1893
|
+
'alerts.handoffDone': 'Traspaso listo',
|
|
1894
|
+
'alerts.summaryReady': 'El resumen está listo.',
|
|
1895
|
+
'alerts.copyAgain': 'Copiar de nuevo',
|
|
1896
|
+
'alerts.compacting': 'Compactando…',
|
|
1897
|
+
'alerts.compactingBody': 'Resumiendo la conversación; continúa desde el resumen.',
|
|
1898
|
+
'alerts.compacted': 'Compactada',
|
|
1899
|
+
'alerts.compactedBody': 'La conversación continúa desde el resumen.',
|
|
1900
|
+
'alerts.failed': 'No se completó',
|
|
1901
|
+
'alerts.unchanged': 'No se cambió nada.',
|
|
1902
|
+
'alerts.keep': 'Conservar',
|
|
1903
|
+
'alerts.keepPlaceholder': 'decisiones, preguntas abiertas, nombres de archivo… (opcional)',
|
|
1904
|
+
'alerts.compactSubmit': 'compactar',
|
|
1905
|
+
'alerts.quick': 'Rápido',
|
|
1906
|
+
'alerts.full': 'Completo',
|
|
1907
|
+
'alerts.continue': 'Sesión nueva ya',
|
|
1908
|
+
'alerts.confirm': 'Preguntar antes',
|
|
1909
|
+
'alerts.copy': 'Solo copiar',
|
|
1910
|
+
'alerts.continueHint': 'Abre una sesión nueva en esta carpeta con el traspaso escrito; pulsa Enter allí para seguir. Esta conversación se queda.',
|
|
1911
|
+
'alerts.confirmHint': 'Escribe el resumen y se detiene; tú eliges si pasar a una sesión nueva. Esta conversación se queda.',
|
|
1912
|
+
'alerts.copyHint': 'Copia el resumen al portapapeles; nada más cambia.',
|
|
1913
|
+
'alerts.handoffReady': 'Traspaso listo',
|
|
1914
|
+
'alerts.handoffReadyBody': '¿Pasar a una sesión nueva en esta carpeta? Esta conversación se queda como está.',
|
|
1915
|
+
'alerts.openNew': 'Pasar a una sesión nueva',
|
|
1916
|
+
'alerts.openedBody': 'Se abrió una sesión nueva con el traspaso escrito: pulsa Enter allí para seguir.',
|
|
1917
|
+
'alerts.readHandoffFile': 'Lee el traspaso en {path} y continúa desde ahí.',
|
|
1918
|
+
'alerts.copyText': 'Copiar',
|
|
1919
|
+
'toasts.newSessionFallback': 'No se pudo abrir una sesión nueva; el traspaso se copió en su lugar.',
|
|
1920
|
+
'alerts.kind': 'Tipo ',
|
|
1921
|
+
'alerts.then': 'Después ',
|
|
1922
|
+
'alerts.demoDown': 'Jev sin créditos (demo)',
|
|
1923
|
+
'alerts.copied': 'Se copió la nota para continuar; esta conversación se conservó.',
|
|
1924
|
+
'alerts.compactFailed': 'La compactación no terminó.',
|
|
1925
|
+
// Settings.
|
|
1926
|
+
'settings.effortBlurb': 'Cómo Auto elige el esfuerzo de cada prompt que envías.',
|
|
1927
|
+
'settings.workers': 'Workers',
|
|
1928
|
+
'settings.mode': 'Modo',
|
|
1929
|
+
'settings.modeNone': 'Base',
|
|
1930
|
+
'band.mode': 'Modo',
|
|
1931
|
+
'band.modeTip': 'El modo «{name}» está activo: los workers lo siguen. Cámbialo en los ajustes rápidos.',
|
|
1932
|
+
'settings.workersBlurb': 'Qué agente ejecuta cada tipo de tarea delegada.',
|
|
1933
|
+
'settings.judge': 'Juez',
|
|
1934
|
+
'settings.judgeBlurb': 'Quién decide: el esfuerzo de los prompts y el nivel de las tareas.',
|
|
1935
|
+
'settings.cacheBlurb': 'Mantiene caliente la caché del prompt mientras no estás.',
|
|
1936
|
+
'settings.handoff': 'Compactar y traspasar',
|
|
1937
|
+
'settings.handoffBlurb': 'Cómo se compacta una conversación pesada o se traspasa a una nueva.',
|
|
1938
|
+
'settings.look': 'Vista',
|
|
1939
|
+
'settings.lookBlurb': 'Qué muestra la barra y cómo.',
|
|
1940
|
+
'settings.light': 'Ligero',
|
|
1941
|
+
'settings.lightBlurb': 'tareas menores, repetición, consultas',
|
|
1942
|
+
'settings.standard': 'Estándar',
|
|
1943
|
+
'settings.standardBlurb': 'implementación ya diseñada, investigación, revisión',
|
|
1944
|
+
'settings.deep': 'Profundo',
|
|
1945
|
+
'settings.deepBlurb': 'tareas delicadas, de alto riesgo o con razonamiento complejo',
|
|
1946
|
+
'settings.design': 'Diseño',
|
|
1947
|
+
'settings.designBlurb': 'UI, visual, marca',
|
|
1948
|
+
'settings.tierAlt': 'Nivel {name}',
|
|
1949
|
+
'settings.biasAlt': 'Preferencia {value}{selected}',
|
|
1950
|
+
'settings.selected': ' (seleccionado)',
|
|
1951
|
+
'settings.onSuffix': ' (activado)',
|
|
1952
|
+
'settings.offSuffix': ' (desactivado)',
|
|
1953
|
+
'settings.mixedSuffix': ' (algunos activados)',
|
|
1954
|
+
'settings.cheaper': 'Más barato',
|
|
1955
|
+
'settings.smarter': 'Más inteligente',
|
|
1956
|
+
'settings.autoHint': 'elige en cada prompt; si eliges tú, se desactiva',
|
|
1957
|
+
'settings.lean': 'Preferencia',
|
|
1958
|
+
'settings.leanHint': 'solo desempata los casos dudosos',
|
|
1959
|
+
'settings.floor': 'Nunca menos de',
|
|
1960
|
+
'settings.ceiling': 'Nunca más de',
|
|
1961
|
+
'settings.floorWins': 'por debajo del mínimo: gana el mínimo',
|
|
1962
|
+
'settings.unavailable': ' (no disponible)',
|
|
1963
|
+
'settings.takesOver': 'Se encarga de',
|
|
1964
|
+
'settings.autoAgent': 'ripple:auto',
|
|
1965
|
+
'settings.allSpawns': 'Todos los subagentes',
|
|
1966
|
+
'settings.fallback': 'Respaldo',
|
|
1967
|
+
'settings.fallbackHint': 'cuando el proveedor de un nivel se queda sin cuota',
|
|
1968
|
+
'settings.haiku': 'Haiku',
|
|
1969
|
+
'settings.jev': 'Jev',
|
|
1970
|
+
'settings.routerModel': 'Modelo del router',
|
|
1971
|
+
'settings.haikuHint': 'Haiku 5.5 con tu sesión de Claude · alrededor de un segundo por prompt',
|
|
1972
|
+
'settings.keyEnv': 'desde TYPESAFE_API_KEY',
|
|
1973
|
+
'settings.keyFile': 'guardada en ~/.config/jev/.env',
|
|
1974
|
+
'settings.keySaved': 'guardada',
|
|
1975
|
+
'settings.keyPaste': 'pega una clave de API de TypeSafe',
|
|
1976
|
+
'settings.saveKey': 'guardar',
|
|
1977
|
+
'settings.testing': 'Probando…',
|
|
1978
|
+
'settings.keyWorks': 'La clave funciona',
|
|
1979
|
+
'settings.keyRejected': 'Clave rechazada',
|
|
1980
|
+
'settings.key': 'Clave',
|
|
1981
|
+
'settings.test': 'Probar',
|
|
1982
|
+
'settings.noModels': 'no hay modelos del router',
|
|
1983
|
+
'settings.haikuFallback': 'recurre a Haiku si falla',
|
|
1984
|
+
'settings.keepWarm': 'Mantener caché',
|
|
1985
|
+
'settings.keepWarmHint': 'hace ping a la caché justo antes de que caduque',
|
|
1986
|
+
'settings.for': 'Durante',
|
|
1987
|
+
'settings.afterReply': 'tras la última respuesta',
|
|
1988
|
+
'settings.chatsFrom': 'A partir de',
|
|
1989
|
+
'settings.tokens': 'tokens',
|
|
1990
|
+
'settings.warmCost': 'Cada ping vuelve a leer toda la conversación desde la caché: alrededor de una décima parte de su precio de entrada, y la misma proporción de los límites del plan.',
|
|
1991
|
+
'settings.noSkill': 'Ninguna: un turno escribe HANDOFF.md',
|
|
1992
|
+
'settings.compactWith': 'Compactar con',
|
|
1993
|
+
'settings.sessionCompactor': 'El de la sesión',
|
|
1994
|
+
'settings.afterHandoff': 'Tras traspasar',
|
|
1995
|
+
'settings.handoffButton': 'Botón Traspaso',
|
|
1996
|
+
'settings.whenAdvised': 'Si se recomienda',
|
|
1997
|
+
'settings.always': 'Siempre',
|
|
1998
|
+
'settings.fullHandoff': 'Modo completo',
|
|
1999
|
+
'settings.heavyAt': 'Umbral de uso',
|
|
2000
|
+
'settings.context': 'contexto',
|
|
2001
|
+
'settings.cacheTimer': 'Temporizador de caché',
|
|
2002
|
+
'settings.reason': 'Motivo',
|
|
2003
|
+
'settings.route': 'Ruta',
|
|
2004
|
+
'settings.limits': 'Límites',
|
|
2005
|
+
'settings.layout': 'Disposición',
|
|
2006
|
+
'settings.dashboard': 'Panel',
|
|
2007
|
+
'settings.minimal': 'Mínimo',
|
|
2008
|
+
'settings.footerHint': 'una línea en el pie',
|
|
2009
|
+
'settings.appearance': 'Apariencia',
|
|
2010
|
+
'settings.dark': 'Oscuro',
|
|
2011
|
+
'settings.lightAppearance': 'Claro',
|
|
2012
|
+
'settings.show': 'Mostrar',
|
|
2013
|
+
'settings.language': 'Idioma',
|
|
2014
|
+
'settings.title': 'configuración',
|
|
2015
|
+
'settings.quick': 'Ajustes rápidos',
|
|
2016
|
+
'settings.effortAuto': 'Esfuerzo automático',
|
|
2017
|
+
'settings.openAll': 'Abrir todos los ajustes',
|
|
2018
|
+
'setup.workersNote': 'Los workers empiezan en la escalera; los detalles están en el panel.',
|
|
2019
|
+
'setup.changeDashboard': 'Haz cambios rápidos en la barra o con /ripple; abre todos los ajustes para ir al panel.',
|
|
2020
|
+
'settings.save': 'Guardar',
|
|
2021
|
+
'settings.discard': 'Descartar',
|
|
2022
|
+
'settings.close': 'Cerrar',
|
|
2023
|
+
'settings.autoLine': 'Elige por sí solo el esfuerzo de cada prompt.',
|
|
2024
|
+
'settings.autoOffNote': 'Se queda el nivel que elijas en el menú de esfuerzo de la app.',
|
|
2025
|
+
'settings.judgeLine': 'Decide el esfuerzo de cada prompt y el nivel de cada tarea delegada.',
|
|
2026
|
+
'settings.modeLine': 'El conjunto de agentes que recibe las tareas delegadas.',
|
|
2027
|
+
'settings.warmLine': 'Hace ping a la caché justo antes de que se enfríe.',
|
|
2028
|
+
'settings.warmCostShort': 'Cada ping cuesta cerca de una décima parte del precio de entrada.',
|
|
2029
|
+
'settings.sayAuto': '{judge} elige el esfuerzo de cada prompt.',
|
|
2030
|
+
'settings.sayManual': 'El esfuerzo se queda como lo pongas en la app.',
|
|
2031
|
+
'settings.sayWarm': 'Y mantendré la caché caliente.',
|
|
2032
|
+
'band.hideBand': 'Ocultar la barra',
|
|
2033
|
+
'settings.unsaved': '● sin guardar',
|
|
2034
|
+
// Setup.
|
|
2035
|
+
'setup.judgeTitle': 'Quién decide',
|
|
2036
|
+
'setup.judgeBlurb': 'Un juez pequeño y rápido elige el esfuerzo de cada prompt y el worker de cada tarea.',
|
|
2037
|
+
'setup.workersTitle': 'Quién hace el trabajo',
|
|
2038
|
+
'setup.cacheTitle': '¿Mantener la caché caliente?',
|
|
2039
|
+
'setup.cacheBlurb': 'La caché de una conversación inactiva caduca; Ripple puede hacerle ping mientras no estás.',
|
|
2040
|
+
'setup.effortSummary': 'Auto {state}, decide {judge}',
|
|
2041
|
+
'setup.cacheSummary': 'caliente durante {hours} h tras cada respuesta',
|
|
2042
|
+
'setup.cacheOff': 'no se mantiene caliente',
|
|
2043
|
+
'setup.ready': 'ClaudeRipple está listo',
|
|
2044
|
+
'setup.welcome': 'Te damos la bienvenida a ClaudeRipple',
|
|
2045
|
+
'setup.start': 'Empezar',
|
|
2046
|
+
'setup.finish': 'Terminar',
|
|
2047
|
+
'setup.next': 'Siguiente',
|
|
2048
|
+
'setup.back': 'Atrás',
|
|
2049
|
+
'setup.skip': 'Omitir configuración',
|
|
2050
|
+
// Agents.
|
|
2051
|
+
'agents.waiting': 'en espera',
|
|
2052
|
+
'agents.routerModel': 'modelo del router',
|
|
2053
|
+
'agents.marker': 'marcador',
|
|
2054
|
+
'agents.default': 'predeterminado',
|
|
2055
|
+
'agents.by': 'origen: {name}',
|
|
2056
|
+
'agents.thinking': 'pensando',
|
|
2057
|
+
'agents.fallback': '▲ se usó el respaldo: {reason}',
|
|
2058
|
+
'agents.emptyTitle': 'Aún no hay agentes',
|
|
2059
|
+
'agents.emptyBody': 'Las tareas que Claude delega aparecen aquí, con el worker que eligió Ripple y por qué.',
|
|
2060
|
+
'agents.liveCount': '{count} en ejecución',
|
|
2061
|
+
'agents.noneRunning': 'Ninguno en ejecución',
|
|
2062
|
+
'agents.doneCount': '{count} terminados',
|
|
2063
|
+
// Log.
|
|
2064
|
+
'log.resent': '↻ {status} reenviado',
|
|
2065
|
+
'log.input': 'entrada {tokens}',
|
|
2066
|
+
'log.output': 'salida {tokens}',
|
|
2067
|
+
'log.thisSession': 'Esta sesión',
|
|
2068
|
+
'log.allSessions': 'Todas las sesiones',
|
|
2069
|
+
'log.showAll': 'Mostrar todas las sesiones',
|
|
2070
|
+
'log.onlySession': 'Solo esta sesión',
|
|
2071
|
+
'log.legend': '● esta sesión ○ otras sesiones',
|
|
2072
|
+
'log.empty': 'Aún no hay solicitudes a modelos.',
|
|
2073
|
+
'log.judge': 'Juicio de esfuerzo',
|
|
2074
|
+
'log.judgeWorker': 'Juicio de trabajador',
|
|
2075
|
+
'log.judgeFell': '{asked} falló → {by}',
|
|
2076
|
+
'log.sure': 'seguro {percent}%',
|
|
2077
|
+
// Toasts and locally generated failure/reason text.
|
|
2078
|
+
'toasts.keySingle': 'Pega una sola clave de API de TypeSafe',
|
|
2079
|
+
'toasts.keyPrivateFailed': 'No se pudo hacer privado el archivo de clave de Jev (chmod 600)',
|
|
2080
|
+
'toasts.keySaved': 'ClaudeRipple: clave de Jev guardada en privado; las claves del entorno siguen teniendo prioridad.',
|
|
2081
|
+
'toasts.judgeDown': 'ClaudeRipple: {reason}; se mantiene el esfuerzo actual o se consulta a Haiku.',
|
|
2082
|
+
'toasts.keyMissing': 'Falta la clave de Jev',
|
|
2083
|
+
'toasts.jevNoVerdict': 'Jev no dio veredicto',
|
|
2084
|
+
'judge.keptUnsure': 'Dudoso, se mantiene el esfuerzo actual',
|
|
2085
|
+
'toasts.routerNoVerdict': 'El juez del router no dio veredicto',
|
|
2086
|
+
'toasts.haikuNoVerdict': 'Haiku no dio veredicto',
|
|
2087
|
+
'toasts.noVerdict': 'sin veredicto',
|
|
2088
|
+
'toasts.judgeUnavailable': 'juez no disponible',
|
|
2089
|
+
'toasts.explicitMarker': 'marcador de worker explícito',
|
|
2090
|
+
'toasts.workerFallback': 'ClaudeRipple: {reason}; se ejecuta {name}.',
|
|
2091
|
+
'toasts.modeEnded': 'El modo {name} ha terminado.',
|
|
2092
|
+
'toasts.yourPick': 'tu elección',
|
|
2093
|
+
'toasts.effortEnter': 'ClaudeRipple: pulsa Enter para que el control de esfuerzo de la app siga tu elección.',
|
|
2094
|
+
'toasts.settingsSaved': 'ClaudeRipple: configuración guardada.',
|
|
2095
|
+
'toasts.clipboardFallback': 'ClaudeRipple: portapapeles no disponible; la nota para continuar está en el prompt.',
|
|
2096
|
+
'toasts.handoffFailed': 'ClaudeRipple: el traspaso falló; no se borró nada.',
|
|
2097
|
+
'toasts.compactFailed': 'ClaudeRipple: la compactación falló; se conservó la conversación.',
|
|
2098
|
+
'toasts.warmStopped': 'ClaudeRipple: {reason}',
|
|
2099
|
+
'toasts.warmBoundReason': 'Se dejó de mantener caliente: se alcanzó el límite de tiempo',
|
|
2100
|
+
'toasts.warmBound': 'ClaudeRipple: se dejó de mantener la caché caliente al alcanzar el límite de tiempo.',
|
|
2101
|
+
'toasts.appEffort': 'esfuerzo de la app',
|
|
2102
|
+
'toasts.appEffortChanged': 'cambió el esfuerzo de la app',
|
|
2103
|
+
'toasts.autoOff': 'ClaudeRipple: tu cambio de esfuerzo en la app desactivó Auto.',
|
|
2104
|
+
'toasts.handoffEmpty': 'ClaudeRipple: el traspaso no produjo respuesta; no se borró nada.',
|
|
2105
|
+
'toasts.ownModel': 'ClaudeRipple: {name} se ejecuta con su propio modelo, no con "{model}"',
|
|
2106
|
+
'toasts.transcriptEmpty': 'La transcripción está vacía o supera el presupuesto de compactación',
|
|
2107
|
+
'toasts.summaryEmpty': 'Haiku no devolvió un resumen utilizable',
|
|
2108
|
+
'toasts.compactFallback': 'ClaudeRipple: falló la compactación con Haiku; se usa el compactador de la sesión.',
|
|
2109
|
+
'toasts.error': 'ClaudeRipple: {reason}',
|
|
2110
|
+
'toasts.jevTimeout': 'Jev agotó el tiempo de espera',
|
|
2111
|
+
'toasts.jevRejected': 'Clave de Jev rechazada',
|
|
2112
|
+
'toasts.jevCredits': 'Jev sin créditos',
|
|
2113
|
+
'toasts.jevRateLimited': 'Jev: límite de frecuencia alcanzado',
|
|
2114
|
+
'toasts.jevHttp': 'Falló la solicitud a Jev ({status})',
|
|
2115
|
+
'toasts.warmNoReply': 'Se dejó de mantener caliente: el ping no obtuvo respuesta',
|
|
2116
|
+
'toasts.warmNoCache': 'Se dejó de mantener caliente: no se leyó la caché',
|
|
2117
|
+
'toasts.providerQuota': 'Las cuentas de ChatGPT no están disponibles o no tienen cuota',
|
|
2118
|
+
'toasts.saveMode': 'modo ahorro',
|
|
2119
|
+
'toasts.yourSettings': 'tu configuración',
|
|
2120
|
+
'toasts.jevNetwork': 'Red de Jev no disponible',
|
|
2121
|
+
'toasts.workerMissing': '{name} no está instalado',
|
|
2122
|
+
// Commands (stats and debug labels included).
|
|
2123
|
+
'commands.description': 'Esfuerzo, workers, caché y herramientas de sesión de ClaudeRipple',
|
|
2124
|
+
'commands.argumentHint': 'settings|setup|auto|warm|save|handoff [full]|stats|debug|agents|log|bar|cold|swamp|hot|down',
|
|
2125
|
+
'commands.logDescription': 'Abre o cierra el registro de solicitudes de ClaudeRipple',
|
|
2126
|
+
'commands.barDescription': 'Muestra u oculta la barra de ClaudeRipple',
|
|
2127
|
+
'commands.logTitle': 'ClaudeRipple',
|
|
2128
|
+
'commands.agentsTitle': 'Agentes de ClaudeRipple',
|
|
2129
|
+
'commands.help': 'Subcomandos de ClaudeRipple: settings, setup, auto, warm, save, handoff [full], stats, debug, agents, log, bar, cold, swamp, hot, down.',
|
|
2130
|
+
'commands.done': 'ClaudeRipple: {command}.',
|
|
2131
|
+
'commands.logOpened': 'Registro de ClaudeRipple abierto.',
|
|
2132
|
+
'commands.logClosed': 'Registro de ClaudeRipple cerrado.',
|
|
2133
|
+
'commands.barShown': 'Barra de ClaudeRipple visible sobre el prompt.',
|
|
2134
|
+
'commands.barHidden': 'Barra de ClaudeRipple oculta. /ripple-bar la vuelve a mostrar.',
|
|
2135
|
+
'commands.statsAuto': 'Auto: {prompts} prompts, {requests} solicitudes; {total} tokens ponderados',
|
|
2136
|
+
'commands.statsTokens': 'Tokens: entrada {input}, escritura {write}, lectura {read}, salida {output}',
|
|
2137
|
+
'commands.statsEffort': '{effort} {prompts} prompts / {cost} ponderados',
|
|
2138
|
+
'commands.statsJudges': 'Jueces: haiku {haiku}, jev {jev}, modelo {model}; {tokens} tokens, {ms} ms ({avg} ms de media)',
|
|
2139
|
+
'commands.statsWorkers': 'Workers: {workers}',
|
|
2140
|
+
'commands.statsWarm': 'Mantener caliente: {pings} pings, {cost} tokens ponderados',
|
|
2141
|
+
'commands.debugJudge': 'juez',
|
|
2142
|
+
'commands.debugJudgeModel': 'modelo juez',
|
|
2143
|
+
'commands.debugPick': 'elección',
|
|
2144
|
+
'commands.debugPaused': 'en pausa',
|
|
2145
|
+
'commands.debugCache': 'caché',
|
|
2146
|
+
'commands.debugWarm': 'mantener caliente',
|
|
2147
|
+
'commands.debugLastSpawn': 'último lanzamiento',
|
|
2148
|
+
'commands.debugLastRequest': 'última solicitud',
|
|
2149
|
+
'commands.debugEffort': 'esfuerzo',
|
|
2150
|
+
'commands.debugWhy': 'motivo',
|
|
2151
|
+
'commands.debugBy': 'origen',
|
|
2152
|
+
'commands.debugAt': 'hora',
|
|
2153
|
+
'commands.debugSure': 'confianza',
|
|
2154
|
+
'commands.debugTtlMs': 'TTL (ms)',
|
|
2155
|
+
'commands.debugLastReplyAt': 'última respuesta',
|
|
2156
|
+
'commands.debugExpiresAt': 'caduca',
|
|
2157
|
+
'commands.debugPings': 'pings',
|
|
2158
|
+
'commands.debugCost': 'coste',
|
|
2159
|
+
'commands.debugStopped': 'detenido',
|
|
2160
|
+
'commands.debugLastPingAt': 'último ping',
|
|
2161
|
+
'commands.debugTier': 'nivel',
|
|
2162
|
+
'commands.debugTarget': 'destino',
|
|
2163
|
+
'commands.debugAgent': 'agente',
|
|
2164
|
+
'commands.debugModel': 'modelo',
|
|
2165
|
+
'commands.debugMs': 'ms',
|
|
2166
|
+
'commands.debugFallbackReason': 'motivo del respaldo',
|
|
2167
|
+
'commands.debugAppEffort': 'esfuerzo de la app',
|
|
2168
|
+
'commands.debugSentEffort': 'esfuerzo enviado',
|
|
2169
|
+
'commands.debugLog': 'ClaudeRipple {where}: {reason}',
|
|
2170
|
+
'commands.routerHttp': 'HTTP del router {status}',
|
|
2171
|
+
'commands.compactSkip': 'ClaudeRipple resume con Haiku cuando hace falta compactar.',
|
|
2172
|
+
// Workers card, Jev source, and worker picks in the Agents pane.
|
|
2173
|
+
'workers.previous': 'Anterior',
|
|
2174
|
+
'workers.next': 'Siguiente',
|
|
2175
|
+
'workers.page': 'Página {page} de {pages}',
|
|
2176
|
+
'workers.general': 'General',
|
|
2177
|
+
'workers.design': 'Diseño',
|
|
2178
|
+
'workers.frontend': 'Frontend',
|
|
2179
|
+
'workers.backend': 'Backend',
|
|
2180
|
+
'workers.infra': 'Infraestructura',
|
|
2181
|
+
'workers.data': 'Datos',
|
|
2182
|
+
'workers.test': 'Pruebas',
|
|
2183
|
+
'workers.docs': 'Documentación',
|
|
2184
|
+
'workers.research': 'Investigación',
|
|
2185
|
+
'workers.mode': 'Modo',
|
|
2186
|
+
'workers.rung.light': 'Low worker',
|
|
2187
|
+
'workers.rung.standard': 'Medium worker',
|
|
2188
|
+
'workers.rung.hard': 'High worker',
|
|
2189
|
+
'workers.rung.plan': 'Max worker',
|
|
2190
|
+
'workers.rungHint.light': 'Buscar archivos, consultas puntuales, revisar registros, ediciones mecánicas',
|
|
2191
|
+
'workers.rungHint.standard': 'Implementación especificada, refactorizaciones, resúmenes, borradores',
|
|
2192
|
+
'workers.rungHint.hard': 'Depuración difícil, cambios en varios archivos, revisión y refutación independientes',
|
|
2193
|
+
'workers.rungHint.plan': 'El mejor resultado posible: planificación, diseño, arquitectura, opiniones',
|
|
2194
|
+
'workers.rungEmpty': '{rung} no tiene modelo asignado',
|
|
2195
|
+
'workers.notCandidate': '{name} no es candidato en este campo',
|
|
2196
|
+
'workers.sessionModel': 'el modelo de la sesión',
|
|
2197
|
+
'workers.offset': 'Ajuste esfuerzo',
|
|
2198
|
+
'workers.anyEffort': 'Cualquiera',
|
|
2199
|
+
'workers.noTarget': 'Usar el siguiente nivel / respaldo',
|
|
2200
|
+
'workers.judgeBlurb': 'Quién decide: el esfuerzo de los prompts y el ámbito y nivel de las tareas.',
|
|
2201
|
+
'workers.disabled': '{provider} está desactivado',
|
|
2202
|
+
'workers.nested': 'Un subagente no puede iniciar otro subagente: haz esta parte tú mismo y luego informa.',
|
|
2203
|
+
'workers.none': 'No hay ningún worker activado disponible',
|
|
2204
|
+
'workers.loading': 'Cargando los workers del router…',
|
|
2205
|
+
'workers.providerSub': '{on} de {count} activados',
|
|
2206
|
+
'workers.fallbackHint': 'cuando los destinos fijados no pueden ejecutarse',
|
|
2207
|
+
'workers.pinDetails': 'Más opciones',
|
|
2208
|
+
'workers.back': 'Volver',
|
|
2209
|
+
'settings.ladderWaiting': 'Esperando la lista de modelos del router.',
|
|
2210
|
+
'jev.zenMissing': 'No hay clave de autorización de OpenCode Zen en la configuración de ClaudeRipple',
|
|
2211
|
+
'agents.domainLevel': '{domain} / {level}',
|
|
2212
|
+
'agents.tokens': '≈{tokens} tok',
|
|
2213
|
+
// Time units: countdowns, reset times, durations.
|
|
2214
|
+
'units.seconds': '{n} s',
|
|
2215
|
+
'units.minutes': '{n} min',
|
|
2216
|
+
'units.hours': '{n} h',
|
|
2217
|
+
'units.days': '{n} d',
|
|
2218
|
+
'units.minSec': '{m} min {s} s',
|
|
2219
|
+
'units.hourMin': '{h} h {m} min',
|
|
2220
|
+
}
|
|
2221
|
+
|
|
2222
|
+
const PT: Record<Key, string> = {
|
|
2223
|
+
// Band (including shared display labels and accessibility text).
|
|
2224
|
+
'band.brand': 'ClaudeRipple',
|
|
2225
|
+
'band.effort': 'Esforço',
|
|
2226
|
+
'band.model': 'Modelo',
|
|
2227
|
+
'band.auto': 'Auto',
|
|
2228
|
+
'band.manual': 'Manual',
|
|
2229
|
+
'band.paused': 'Pausado',
|
|
2230
|
+
'band.off': 'Desativado',
|
|
2231
|
+
'band.on': 'Ativado',
|
|
2232
|
+
'band.autoOff': 'Auto desativado',
|
|
2233
|
+
'band.autoPaused': 'auto pausado',
|
|
2234
|
+
'band.deciding': 'Decidindo…',
|
|
2235
|
+
'band.decidingText': '◌ decidindo…',
|
|
2236
|
+
'band.low': 'Baixo',
|
|
2237
|
+
'band.medium': 'Médio',
|
|
2238
|
+
'band.high': 'Alto',
|
|
2239
|
+
'band.xhigh': 'Muito alto',
|
|
2240
|
+
'band.max': 'Máximo',
|
|
2241
|
+
'band.pausedHint': 'O Auto pausa neste modelo: não se sabe se mudar o esforço aqui preserva o cache.',
|
|
2242
|
+
'band.offHint': 'O Auto está desativado; o esforço é escolha sua.',
|
|
2243
|
+
'band.decidingHint': 'O juiz está escolhendo o esforço para este prompt.',
|
|
2244
|
+
'band.effortTitle': 'Esforço {value}{hint} · Clique para escolher um esforço',
|
|
2245
|
+
'band.effortAlt': 'Esforço {value} ({mode}){why}',
|
|
2246
|
+
'band.context': 'Contexto',
|
|
2247
|
+
'band.contextAlt': 'Contexto {value} de {window} ({tokens} tokens)',
|
|
2248
|
+
'band.cache': 'Cache',
|
|
2249
|
+
'band.cacheWarm': 'Cache · Quente',
|
|
2250
|
+
'band.cacheStopped': 'Cache · Sem manter',
|
|
2251
|
+
'band.cold': 'frio',
|
|
2252
|
+
'band.cacheTip': 'Cache do prompt {state}{warm}',
|
|
2253
|
+
'band.warmFor': 'expira em {time}',
|
|
2254
|
+
'band.expired': 'expirado',
|
|
2255
|
+
'band.warmStoppedTip': ' · parou de manter quente: {reason}',
|
|
2256
|
+
'band.warmOnTip': ' · mantendo quente, {count} pings',
|
|
2257
|
+
'band.noReply': 'Ainda sem resposta',
|
|
2258
|
+
'band.cacheAlt': 'Cache {state}{warm}',
|
|
2259
|
+
'band.timeLeft': 'restam {time}',
|
|
2260
|
+
'band.unknown': 'desconhecido',
|
|
2261
|
+
'band.keepWarmAlt': ', mantendo quente{count}',
|
|
2262
|
+
'band.limitCaption': 'limite {window}{save}',
|
|
2263
|
+
'band.saveCaption': ' · ECONOMIA',
|
|
2264
|
+
'band.limitAlt': 'Limite {window}: {value}{reset}',
|
|
2265
|
+
'band.fiveHour': '5 horas',
|
|
2266
|
+
'band.weekly': 'semanal',
|
|
2267
|
+
'band.resetting': 'renovando',
|
|
2268
|
+
'band.resetsIn': 'renova em {time}',
|
|
2269
|
+
'band.resetsAt': 'renova às {time}',
|
|
2270
|
+
'band.router': 'Roteador',
|
|
2271
|
+
'band.routerAlt': 'Roteador: {value}',
|
|
2272
|
+
'band.resentCaption': 'REENVIADO · {status}',
|
|
2273
|
+
'band.failedCaption': 'FALHOU · {status}',
|
|
2274
|
+
'band.lastRoute': 'ÚLTIMA ROTA',
|
|
2275
|
+
'band.logHint': 'Clique para ver o log de requisições',
|
|
2276
|
+
'band.routeAlt': 'Última rota: {model} via {provider}{effort}{cache}, {time}{status}',
|
|
2277
|
+
'band.routeCache': ', cache {percent}%',
|
|
2278
|
+
'band.routeResent': ', reenviado {status}',
|
|
2279
|
+
'band.routeFailed': ', falhou {status}',
|
|
2280
|
+
'band.warm': 'Manter',
|
|
2281
|
+
'band.handoff': 'Repasse',
|
|
2282
|
+
'band.compact': 'Compactar',
|
|
2283
|
+
'band.log': 'Log',
|
|
2284
|
+
'band.agents': 'Agentes',
|
|
2285
|
+
'band.settings': 'Ajustes',
|
|
2286
|
+
'band.effortShort': 'Esforço',
|
|
2287
|
+
'band.hit': 'acerto {percent}%',
|
|
2288
|
+
'band.effortAutoAlt': 'Esforço auto {state}',
|
|
2289
|
+
'band.warmAlt': 'Manter o cache quente {state}',
|
|
2290
|
+
'band.handoffAdvised': 'Repasse (recomendado: agora uma conversa nova compensa)',
|
|
2291
|
+
'band.closeLog': 'Fechar o log de requisições',
|
|
2292
|
+
'band.openLog': 'Abrir o log de requisições',
|
|
2293
|
+
'band.agentsAlt': 'Agentes: {count} em execução',
|
|
2294
|
+
'band.settingsAlt': 'Configurações do Ripple',
|
|
2295
|
+
'band.warmStopped': 'sem manter',
|
|
2296
|
+
'band.warmText': '≈quente',
|
|
2297
|
+
'band.save': 'economia',
|
|
2298
|
+
'band.resent': '{status} reenviado',
|
|
2299
|
+
'band.cachePercent': 'cache {percent}%',
|
|
2300
|
+
'band.closeLogText': 'Fechar log',
|
|
2301
|
+
'band.footerPaused': ' (pausado)',
|
|
2302
|
+
'band.footerOff': ' (auto desativado)',
|
|
2303
|
+
'band.footerManual': ' (manual)',
|
|
2304
|
+
'band.footerContext': 'ctx {percent}%',
|
|
2305
|
+
'band.routerRestart': 'ClaudeRipple: reinicie o roteador para ver as rotas aqui',
|
|
2306
|
+
'band.routerDown': 'ClaudeRipple: o roteador não responde',
|
|
2307
|
+
// Alerts.
|
|
2308
|
+
'alerts.coldTitle': 'O cache esfriou',
|
|
2309
|
+
'alerts.coldBody': 'Ficou parada {minutes} min, então o próximo prompt relê os {tokens} tokens pelo preço cheio.',
|
|
2310
|
+
'alerts.swampTitle': 'Contexto {percent}% cheio',
|
|
2311
|
+
'alerts.swampBody': '{tokens} tokens vão junto com cada prompt: mais lento, mais caro, mais confuso.',
|
|
2312
|
+
'alerts.hotTitle': 'Limite {window} em {percent}%',
|
|
2313
|
+
'alerts.saveOnBody': 'O modo economia está ativado: o Auto fica em médio ou abaixo até a renovação.',
|
|
2314
|
+
'alerts.saveBody': 'O modo economia mantém o Auto em médio ou abaixo até a renovação.',
|
|
2315
|
+
'alerts.saveOff': 'Desativar o modo economia',
|
|
2316
|
+
'alerts.save': 'Modo economia',
|
|
2317
|
+
'alerts.notNow': 'Agora não',
|
|
2318
|
+
'alerts.judgeTitle': 'O juiz de esforço não está respondendo',
|
|
2319
|
+
'alerts.judgeNetworkTitle': 'A conexão está instável; o Haiku decide por enquanto',
|
|
2320
|
+
'alerts.routerModel': 'O modelo do roteador',
|
|
2321
|
+
'alerts.judgeBody': '{judge}: {reason}. {fallback}',
|
|
2322
|
+
'alerts.keepEffort': 'Enquanto isso, fica o esforço atual.',
|
|
2323
|
+
'alerts.askHaiku': 'Enquanto isso, o Haiku julga.',
|
|
2324
|
+
'alerts.openSettings': 'Abrir configurações',
|
|
2325
|
+
'alerts.compactTitle': 'Compactar esta conversa',
|
|
2326
|
+
'alerts.compactBody': 'Informe o que o resumo deve manter; se deixar em branco, a conversa será resumida automaticamente.',
|
|
2327
|
+
'alerts.cancel': 'Cancelar',
|
|
2328
|
+
'alerts.handoffTitle': 'Repassar para uma conversa nova',
|
|
2329
|
+
'alerts.quickBody': 'Rápido: um resumo a partir do cache que a conversa nova retoma.',
|
|
2330
|
+
'alerts.fullBody': 'Completo: a skill de repasse verifica o git e escreve o HANDOFF.md antes.',
|
|
2331
|
+
'alerts.go': 'Iniciar',
|
|
2332
|
+
'alerts.dismiss': 'Fechar',
|
|
2333
|
+
'alerts.handingOff': 'Repassando…',
|
|
2334
|
+
'alerts.fullProgress': 'Executando o repasse: verificando o git e escrevendo o HANDOFF.md.',
|
|
2335
|
+
'alerts.quickProgress': 'Escrevendo um resumo para continuar em uma nova conversa.',
|
|
2336
|
+
'alerts.handoffDone': 'Repasse concluído',
|
|
2337
|
+
'alerts.summaryReady': 'O resumo está pronto.',
|
|
2338
|
+
'alerts.copyAgain': 'Copiar de novo',
|
|
2339
|
+
'alerts.compacting': 'Compactando…',
|
|
2340
|
+
'alerts.compactingBody': 'Resumindo a conversa; ela continua a partir do resumo.',
|
|
2341
|
+
'alerts.compacted': 'Compactada',
|
|
2342
|
+
'alerts.compactedBody': 'A conversa continua a partir do resumo.',
|
|
2343
|
+
'alerts.failed': 'Não foi concluído',
|
|
2344
|
+
'alerts.unchanged': 'Nada foi alterado.',
|
|
2345
|
+
'alerts.keep': 'Manter',
|
|
2346
|
+
'alerts.keepPlaceholder': 'decisões, perguntas em aberto, nomes de arquivos… (opcional)',
|
|
2347
|
+
'alerts.compactSubmit': 'compactar',
|
|
2348
|
+
'alerts.quick': 'Rápido',
|
|
2349
|
+
'alerts.full': 'Completo',
|
|
2350
|
+
'alerts.continue': 'Nova sessão já',
|
|
2351
|
+
'alerts.confirm': 'Perguntar antes',
|
|
2352
|
+
'alerts.copy': 'Só copiar',
|
|
2353
|
+
'alerts.continueHint': 'Abre uma nova sessão nesta pasta com a passagem preenchida; aperte Enter lá para seguir. Esta conversa fica.',
|
|
2354
|
+
'alerts.confirmHint': 'Escreve o resumo e para; você escolhe se vai para uma nova sessão. Esta conversa fica.',
|
|
2355
|
+
'alerts.copyHint': 'Copia o resumo para a área de transferência; nada mais muda.',
|
|
2356
|
+
'alerts.handoffReady': 'Passagem pronta',
|
|
2357
|
+
'alerts.handoffReadyBody': 'Ir para uma nova sessão nesta pasta? Esta conversa fica como está.',
|
|
2358
|
+
'alerts.openNew': 'Ir para uma nova sessão',
|
|
2359
|
+
'alerts.openedBody': 'Uma nova sessão foi aberta com a passagem preenchida: aperte Enter lá para seguir.',
|
|
2360
|
+
'alerts.readHandoffFile': 'Leia a passagem em {path} e continue a partir dela.',
|
|
2361
|
+
'alerts.copyText': 'Copiar',
|
|
2362
|
+
'toasts.newSessionFallback': 'Não foi possível abrir uma nova sessão; a passagem foi copiada.',
|
|
2363
|
+
'alerts.kind': 'Tipo ',
|
|
2364
|
+
'alerts.then': 'Depois ',
|
|
2365
|
+
'alerts.demoDown': 'Jev sem créditos (demo)',
|
|
2366
|
+
'alerts.copied': 'A nota para continuar foi copiada; esta conversa foi mantida.',
|
|
2367
|
+
'alerts.compactFailed': 'A compactação não terminou.',
|
|
2368
|
+
// Settings.
|
|
2369
|
+
'settings.effortBlurb': 'Como o Auto escolhe o esforço de cada prompt que você envia.',
|
|
2370
|
+
'settings.workers': 'Workers',
|
|
2371
|
+
'settings.mode': 'Modo',
|
|
2372
|
+
'settings.modeNone': 'Base',
|
|
2373
|
+
'band.mode': 'Modo',
|
|
2374
|
+
'band.modeTip': 'O modo “{name}” está ativo: os workers o seguem. Mude-o nas configurações rápidas.',
|
|
2375
|
+
'settings.workersBlurb': 'Qual agente executa cada tipo de tarefa delegada.',
|
|
2376
|
+
'settings.judge': 'Juiz',
|
|
2377
|
+
'settings.judgeBlurb': 'Quem decide: o esforço dos prompts e o nível das tarefas.',
|
|
2378
|
+
'settings.cacheBlurb': 'Mantém o cache do prompt quente enquanto você está fora.',
|
|
2379
|
+
'settings.handoff': 'Compactar e repassar',
|
|
2380
|
+
'settings.handoffBlurb': 'Como uma conversa pesada é compactada ou repassada para uma nova.',
|
|
2381
|
+
'settings.look': 'Visual',
|
|
2382
|
+
'settings.lookBlurb': 'O que a barra mostra e como.',
|
|
2383
|
+
'settings.light': 'Leve',
|
|
2384
|
+
'settings.lightBlurb': 'tarefas simples, repetição, consultas',
|
|
2385
|
+
'settings.standard': 'Padrão',
|
|
2386
|
+
'settings.standardBlurb': 'implementação já planejada, pesquisa, revisão',
|
|
2387
|
+
'settings.deep': 'Profundo',
|
|
2388
|
+
'settings.deepBlurb': 'tarefas delicadas, de alto risco ou com raciocínio complexo',
|
|
2389
|
+
'settings.design': 'Design',
|
|
2390
|
+
'settings.designBlurb': 'UI, visual, marca',
|
|
2391
|
+
'settings.tierAlt': 'Nível {name}',
|
|
2392
|
+
'settings.biasAlt': 'Preferência {value}{selected}',
|
|
2393
|
+
'settings.selected': ' (selecionado)',
|
|
2394
|
+
'settings.onSuffix': ' (ativado)',
|
|
2395
|
+
'settings.offSuffix': ' (desativado)',
|
|
2396
|
+
'settings.mixedSuffix': ' (alguns ativados)',
|
|
2397
|
+
'settings.cheaper': 'Mais barato',
|
|
2398
|
+
'settings.smarter': 'Mais inteligente',
|
|
2399
|
+
'settings.autoHint': 'escolhe a cada prompt; se você escolher, ele desliga',
|
|
2400
|
+
'settings.lean': 'Preferência',
|
|
2401
|
+
'settings.leanHint': 'só desempata casos apertados',
|
|
2402
|
+
'settings.floor': 'Nunca abaixo',
|
|
2403
|
+
'settings.ceiling': 'Nunca acima',
|
|
2404
|
+
'settings.floorWins': 'abaixo do mínimo: o mínimo vence',
|
|
2405
|
+
'settings.unavailable': ' (indisponível)',
|
|
2406
|
+
'settings.takesOver': 'Aplicar a',
|
|
2407
|
+
'settings.autoAgent': 'ripple:auto',
|
|
2408
|
+
'settings.allSpawns': 'Todos os subagentes',
|
|
2409
|
+
'settings.fallback': 'Reserva',
|
|
2410
|
+
'settings.fallbackHint': 'quando o provedor de um nível fica sem cota',
|
|
2411
|
+
'settings.haiku': 'Haiku',
|
|
2412
|
+
'settings.jev': 'Jev',
|
|
2413
|
+
'settings.routerModel': 'Modelo do roteador',
|
|
2414
|
+
'settings.haikuHint': 'Haiku 5.5 no seu login do Claude · cerca de um segundo por prompt',
|
|
2415
|
+
'settings.keyEnv': 'de TYPESAFE_API_KEY',
|
|
2416
|
+
'settings.keyFile': 'salva em ~/.config/jev/.env',
|
|
2417
|
+
'settings.keySaved': 'salva',
|
|
2418
|
+
'settings.keyPaste': 'cole uma chave de API da TypeSafe',
|
|
2419
|
+
'settings.saveKey': 'salvar',
|
|
2420
|
+
'settings.testing': 'Testando…',
|
|
2421
|
+
'settings.keyWorks': 'A chave funciona',
|
|
2422
|
+
'settings.keyRejected': 'Chave recusada',
|
|
2423
|
+
'settings.key': 'Chave',
|
|
2424
|
+
'settings.test': 'Testar',
|
|
2425
|
+
'settings.noModels': 'nenhum modelo do roteador listado',
|
|
2426
|
+
'settings.haikuFallback': 'recorre ao Haiku se falhar',
|
|
2427
|
+
'settings.keepWarm': 'Manter quente',
|
|
2428
|
+
'settings.keepWarmHint': 'faz ping no cache pouco antes de expirar',
|
|
2429
|
+
'settings.for': 'Por',
|
|
2430
|
+
'settings.afterReply': 'após a última resposta',
|
|
2431
|
+
'settings.chatsFrom': 'A partir de',
|
|
2432
|
+
'settings.tokens': 'tokens',
|
|
2433
|
+
'settings.warmCost': 'Cada ping relê a conversa inteira do cache: cerca de um décimo do preço de entrada, e a mesma fração dos limites do plano.',
|
|
2434
|
+
'settings.noSkill': 'Nenhuma: um turno escreve o HANDOFF.md',
|
|
2435
|
+
'settings.compactWith': 'Compactar com',
|
|
2436
|
+
'settings.sessionCompactor': 'O da própria sessão',
|
|
2437
|
+
'settings.afterHandoff': 'Após o repasse',
|
|
2438
|
+
'settings.handoffButton': 'Botão Repasse',
|
|
2439
|
+
'settings.whenAdvised': 'Quando recomendado',
|
|
2440
|
+
'settings.always': 'Sempre',
|
|
2441
|
+
'settings.fullHandoff': 'Modo completo',
|
|
2442
|
+
'settings.heavyAt': 'Avisar em',
|
|
2443
|
+
'settings.context': 'contexto',
|
|
2444
|
+
'settings.cacheTimer': 'Timer do cache',
|
|
2445
|
+
'settings.reason': 'Motivo',
|
|
2446
|
+
'settings.route': 'Rota',
|
|
2447
|
+
'settings.limits': 'Limites',
|
|
2448
|
+
'settings.layout': 'Layout',
|
|
2449
|
+
'settings.dashboard': 'Painel',
|
|
2450
|
+
'settings.minimal': 'Mínimo',
|
|
2451
|
+
'settings.footerHint': 'uma linha no rodapé',
|
|
2452
|
+
'settings.appearance': 'Aparência',
|
|
2453
|
+
'settings.dark': 'Escuro',
|
|
2454
|
+
'settings.lightAppearance': 'Claro',
|
|
2455
|
+
'settings.show': 'Mostrar',
|
|
2456
|
+
'settings.language': 'Idioma',
|
|
2457
|
+
'settings.title': 'configurações',
|
|
2458
|
+
'settings.quick': 'Configurações rápidas',
|
|
2459
|
+
'settings.effortAuto': 'Esforço automático',
|
|
2460
|
+
'settings.openAll': 'Abrir todas as configurações',
|
|
2461
|
+
'setup.workersNote': 'Os workers começam na escada; os detalhes estão no painel.',
|
|
2462
|
+
'setup.changeDashboard': 'Faça ajustes rápidos na barra ou com /ripple; abra todas as configurações para ir ao painel.',
|
|
2463
|
+
'settings.save': 'Salvar',
|
|
2464
|
+
'settings.discard': 'Descartar',
|
|
2465
|
+
'settings.close': 'Fechar',
|
|
2466
|
+
'settings.autoLine': 'Escolhe sozinho o esforço de cada prompt.',
|
|
2467
|
+
'settings.autoOffNote': 'Fica o nível que você escolher no menu de esforço do app.',
|
|
2468
|
+
'settings.judgeLine': 'Decide o esforço de cada prompt e o nível de cada tarefa delegada.',
|
|
2469
|
+
'settings.modeLine': 'O conjunto de agentes que recebe as tarefas delegadas.',
|
|
2470
|
+
'settings.warmLine': 'Faz ping no cache pouco antes de ele esfriar.',
|
|
2471
|
+
'settings.warmCostShort': 'Cada ping custa cerca de um décimo do preço de entrada.',
|
|
2472
|
+
'settings.sayAuto': '{judge} escolhe o esforço de cada prompt.',
|
|
2473
|
+
'settings.sayManual': 'O esforço fica como você definir no app.',
|
|
2474
|
+
'settings.sayWarm': 'E eu mantenho o cache quente.',
|
|
2475
|
+
'band.hideBand': 'Ocultar a barra',
|
|
2476
|
+
'settings.unsaved': '● não salvo',
|
|
2477
|
+
// Setup.
|
|
2478
|
+
'setup.judgeTitle': 'Quem decide',
|
|
2479
|
+
'setup.judgeBlurb': 'Um juiz pequeno e rápido escolhe o esforço de cada prompt e o worker de cada tarefa.',
|
|
2480
|
+
'setup.workersTitle': 'Quem faz o trabalho',
|
|
2481
|
+
'setup.cacheTitle': 'Manter o cache quente?',
|
|
2482
|
+
'setup.cacheBlurb': 'O cache de uma conversa parada expira; o Ripple pode fazer ping nele enquanto você está fora.',
|
|
2483
|
+
'setup.effortSummary': 'Auto {state}, decidido por {judge}',
|
|
2484
|
+
'setup.cacheSummary': 'mantido quente por {hours}h após cada resposta',
|
|
2485
|
+
'setup.cacheOff': 'não é mantido quente',
|
|
2486
|
+
'setup.ready': 'O ClaudeRipple está pronto',
|
|
2487
|
+
'setup.welcome': 'Boas-vindas ao ClaudeRipple',
|
|
2488
|
+
'setup.start': 'Começar',
|
|
2489
|
+
'setup.finish': 'Concluir',
|
|
2490
|
+
'setup.next': 'Próximo',
|
|
2491
|
+
'setup.back': 'Voltar',
|
|
2492
|
+
'setup.skip': 'Pular configuração',
|
|
2493
|
+
// Agents.
|
|
2494
|
+
'agents.waiting': 'aguardando',
|
|
2495
|
+
'agents.routerModel': 'modelo do roteador',
|
|
2496
|
+
'agents.marker': 'marcador',
|
|
2497
|
+
'agents.default': 'padrão',
|
|
2498
|
+
'agents.by': 'origem: {name}',
|
|
2499
|
+
'agents.thinking': 'pensando',
|
|
2500
|
+
'agents.fallback': '▲ executou o agente de reserva: {reason}',
|
|
2501
|
+
'agents.emptyTitle': 'Nenhum agente ainda',
|
|
2502
|
+
'agents.emptyBody': 'As tarefas que o Claude delega aparecem aqui, com o worker que o Ripple escolheu e o motivo.',
|
|
2503
|
+
'agents.liveCount': '{count} em execução',
|
|
2504
|
+
'agents.noneRunning': 'Nenhum em execução',
|
|
2505
|
+
'agents.doneCount': '{count} concluídos',
|
|
2506
|
+
// Log.
|
|
2507
|
+
'log.resent': '↻ {status} reenviado',
|
|
2508
|
+
'log.input': 'entrada {tokens}',
|
|
2509
|
+
'log.output': 'saída {tokens}',
|
|
2510
|
+
'log.thisSession': 'Esta sessão',
|
|
2511
|
+
'log.allSessions': 'Todas as sessões',
|
|
2512
|
+
'log.showAll': 'Mostrar todas as sessões',
|
|
2513
|
+
'log.onlySession': 'Só esta sessão',
|
|
2514
|
+
'log.legend': '● esta sessão ○ outras sessões',
|
|
2515
|
+
'log.empty': 'Nenhuma requisição a modelos ainda.',
|
|
2516
|
+
'log.judge': 'Julgamento de esforço',
|
|
2517
|
+
'log.judgeWorker': 'Julgamento de worker',
|
|
2518
|
+
'log.judgeFell': '{asked} falhou → {by}',
|
|
2519
|
+
'log.sure': 'certeza {percent}%',
|
|
2520
|
+
// Toasts and locally generated failure/reason text.
|
|
2521
|
+
'toasts.keySingle': 'Cole uma única chave de API da TypeSafe',
|
|
2522
|
+
'toasts.keyPrivateFailed': 'Não foi possível tornar privado o arquivo da chave do Jev (chmod 600)',
|
|
2523
|
+
'toasts.keySaved': 'ClaudeRipple: chave do Jev salva de forma privada; chaves do ambiente continuam tendo prioridade.',
|
|
2524
|
+
'toasts.judgeDown': 'ClaudeRipple: {reason}; mantendo o esforço atual ou consultando o Haiku.',
|
|
2525
|
+
'toasts.keyMissing': 'Chave do Jev ausente',
|
|
2526
|
+
'toasts.jevNoVerdict': 'O Jev não deu veredito',
|
|
2527
|
+
'judge.keptUnsure': 'Incerto, mantém o esforço atual',
|
|
2528
|
+
'toasts.routerNoVerdict': 'O juiz do roteador não deu veredito',
|
|
2529
|
+
'toasts.haikuNoVerdict': 'O Haiku não deu veredito',
|
|
2530
|
+
'toasts.noVerdict': 'sem veredito',
|
|
2531
|
+
'toasts.judgeUnavailable': 'juiz indisponível',
|
|
2532
|
+
'toasts.explicitMarker': 'marcador de worker explícito',
|
|
2533
|
+
'toasts.workerFallback': 'ClaudeRipple: {reason}; executando {name}.',
|
|
2534
|
+
'toasts.modeEnded': 'O modo {name} terminou.',
|
|
2535
|
+
'toasts.yourPick': 'sua escolha',
|
|
2536
|
+
'toasts.effortEnter': 'ClaudeRipple: pressione Enter para o controle de esforço do app seguir sua escolha.',
|
|
2537
|
+
'toasts.settingsSaved': 'ClaudeRipple: configurações salvas.',
|
|
2538
|
+
'toasts.clipboardFallback': 'ClaudeRipple: área de transferência indisponível; a nota para continuar está no prompt.',
|
|
2539
|
+
'toasts.handoffFailed': 'ClaudeRipple: o repasse falhou; nada foi apagado.',
|
|
2540
|
+
'toasts.compactFailed': 'ClaudeRipple: a compactação falhou; a conversa foi mantida.',
|
|
2541
|
+
'toasts.warmStopped': 'ClaudeRipple: {reason}',
|
|
2542
|
+
'toasts.warmBoundReason': 'Parou de manter quente: limite de tempo atingido',
|
|
2543
|
+
'toasts.warmBound': 'ClaudeRipple: parou de manter o cache quente ao atingir o limite de tempo.',
|
|
2544
|
+
'toasts.appEffort': 'esforço do app',
|
|
2545
|
+
'toasts.appEffortChanged': 'esforço do app alterado',
|
|
2546
|
+
'toasts.autoOff': 'ClaudeRipple: sua mudança de esforço no app desativou o Auto.',
|
|
2547
|
+
'toasts.handoffEmpty': 'ClaudeRipple: o repasse não produziu resposta; nada foi apagado.',
|
|
2548
|
+
'toasts.ownModel': 'ClaudeRipple: {name} roda no próprio modelo, não em "{model}"',
|
|
2549
|
+
'toasts.transcriptEmpty': 'A transcrição está vazia ou passa do orçamento de compactação',
|
|
2550
|
+
'toasts.summaryEmpty': 'O Haiku não retornou um resumo utilizável',
|
|
2551
|
+
'toasts.compactFallback': 'ClaudeRipple: a compactação com Haiku falhou; usando o compactador da sessão.',
|
|
2552
|
+
'toasts.error': 'ClaudeRipple: {reason}',
|
|
2553
|
+
'toasts.jevTimeout': 'Tempo esgotado no Jev',
|
|
2554
|
+
'toasts.jevRejected': 'Chave do Jev recusada',
|
|
2555
|
+
'toasts.jevCredits': 'Jev sem créditos',
|
|
2556
|
+
'toasts.jevRateLimited': 'Jev: limite de taxa atingido',
|
|
2557
|
+
'toasts.jevHttp': 'A requisição ao Jev falhou ({status})',
|
|
2558
|
+
'toasts.warmNoReply': 'Parou de manter quente: o ping não teve resposta',
|
|
2559
|
+
'toasts.warmNoCache': 'Parou de manter quente: o cache não foi lido',
|
|
2560
|
+
'toasts.providerQuota': 'As contas do ChatGPT estão indisponíveis ou sem cota',
|
|
2561
|
+
'toasts.saveMode': 'modo economia',
|
|
2562
|
+
'toasts.yourSettings': 'suas configurações',
|
|
2563
|
+
'toasts.jevNetwork': 'Rede do Jev indisponível',
|
|
2564
|
+
'toasts.workerMissing': '{name} não está instalado',
|
|
2565
|
+
// Commands (stats and debug labels included).
|
|
2566
|
+
'commands.description': 'Esforço, workers, cache e ferramentas de sessão do ClaudeRipple',
|
|
2567
|
+
'commands.argumentHint': 'settings|setup|auto|warm|save|handoff [full]|stats|debug|agents|log|bar|cold|swamp|hot|down',
|
|
2568
|
+
'commands.logDescription': 'Abre ou fecha o log de requisições do ClaudeRipple',
|
|
2569
|
+
'commands.barDescription': 'Mostra ou oculta a barra do ClaudeRipple',
|
|
2570
|
+
'commands.logTitle': 'ClaudeRipple',
|
|
2571
|
+
'commands.agentsTitle': 'Agentes do ClaudeRipple',
|
|
2572
|
+
'commands.help': 'Subcomandos do ClaudeRipple: settings, setup, auto, warm, save, handoff [full], stats, debug, agents, log, bar, cold, swamp, hot, down.',
|
|
2573
|
+
'commands.done': 'ClaudeRipple: {command}.',
|
|
2574
|
+
'commands.logOpened': 'Log do ClaudeRipple aberto.',
|
|
2575
|
+
'commands.logClosed': 'Log do ClaudeRipple fechado.',
|
|
2576
|
+
'commands.barShown': 'Barra do ClaudeRipple visível acima do prompt.',
|
|
2577
|
+
'commands.barHidden': 'Barra do ClaudeRipple oculta. /ripple-bar mostra de novo.',
|
|
2578
|
+
'commands.statsAuto': 'Auto: {prompts} prompts, {requests} requisições; {total} tokens ponderados',
|
|
2579
|
+
'commands.statsTokens': 'Tokens: entrada {input}, gravação {write}, leitura {read}, saída {output}',
|
|
2580
|
+
'commands.statsEffort': '{effort} {prompts} prompts / {cost} ponderados',
|
|
2581
|
+
'commands.statsJudges': 'Juízes: haiku {haiku}, jev {jev}, modelo {model}; {tokens} tokens, {ms} ms ({avg} ms em média)',
|
|
2582
|
+
'commands.statsWorkers': 'Workers: {workers}',
|
|
2583
|
+
'commands.statsWarm': 'Manter quente: {pings} pings, {cost} tokens ponderados',
|
|
2584
|
+
'commands.debugJudge': 'juiz',
|
|
2585
|
+
'commands.debugJudgeModel': 'modelo juiz',
|
|
2586
|
+
'commands.debugPick': 'escolha',
|
|
2587
|
+
'commands.debugPaused': 'pausado',
|
|
2588
|
+
'commands.debugCache': 'cache',
|
|
2589
|
+
'commands.debugWarm': 'manter quente',
|
|
2590
|
+
'commands.debugLastSpawn': 'último lançamento',
|
|
2591
|
+
'commands.debugLastRequest': 'última requisição',
|
|
2592
|
+
'commands.debugEffort': 'esforço',
|
|
2593
|
+
'commands.debugWhy': 'motivo',
|
|
2594
|
+
'commands.debugBy': 'origem',
|
|
2595
|
+
'commands.debugAt': 'hora',
|
|
2596
|
+
'commands.debugSure': 'confiança',
|
|
2597
|
+
'commands.debugTtlMs': 'TTL (ms)',
|
|
2598
|
+
'commands.debugLastReplyAt': 'última resposta',
|
|
2599
|
+
'commands.debugExpiresAt': 'expira',
|
|
2600
|
+
'commands.debugPings': 'pings',
|
|
2601
|
+
'commands.debugCost': 'custo',
|
|
2602
|
+
'commands.debugStopped': 'parado',
|
|
2603
|
+
'commands.debugLastPingAt': 'último ping',
|
|
2604
|
+
'commands.debugTier': 'nível',
|
|
2605
|
+
'commands.debugTarget': 'destino',
|
|
2606
|
+
'commands.debugAgent': 'agente',
|
|
2607
|
+
'commands.debugModel': 'modelo',
|
|
2608
|
+
'commands.debugMs': 'ms',
|
|
2609
|
+
'commands.debugFallbackReason': 'motivo da reserva',
|
|
2610
|
+
'commands.debugAppEffort': 'esforço do app',
|
|
2611
|
+
'commands.debugSentEffort': 'esforço enviado',
|
|
2612
|
+
'commands.debugLog': 'ClaudeRipple {where}: {reason}',
|
|
2613
|
+
'commands.routerHttp': 'HTTP do roteador {status}',
|
|
2614
|
+
'commands.compactSkip': 'O ClaudeRipple resume com o Haiku quando a compactação é necessária.',
|
|
2615
|
+
// Workers card, Jev source, and worker picks in the Agents pane.
|
|
2616
|
+
'workers.previous': 'Anterior',
|
|
2617
|
+
'workers.next': 'Próxima',
|
|
2618
|
+
'workers.page': 'Página {page} de {pages}',
|
|
2619
|
+
'workers.general': 'Geral',
|
|
2620
|
+
'workers.design': 'Design',
|
|
2621
|
+
'workers.frontend': 'Frontend',
|
|
2622
|
+
'workers.backend': 'Backend',
|
|
2623
|
+
'workers.infra': 'Infraestrutura',
|
|
2624
|
+
'workers.data': 'Dados',
|
|
2625
|
+
'workers.test': 'Testes',
|
|
2626
|
+
'workers.docs': 'Documentação',
|
|
2627
|
+
'workers.research': 'Pesquisa',
|
|
2628
|
+
'workers.mode': 'Modo',
|
|
2629
|
+
'workers.rung.light': 'Low worker',
|
|
2630
|
+
'workers.rung.standard': 'Medium worker',
|
|
2631
|
+
'workers.rung.hard': 'High worker',
|
|
2632
|
+
'workers.rung.plan': 'Max worker',
|
|
2633
|
+
'workers.rungHint.light': 'Procurar arquivos, consultas pontuais, ler logs por cima, edições mecânicas',
|
|
2634
|
+
'workers.rungHint.standard': 'Implementação especificada, refatorações, resumos, rascunhos',
|
|
2635
|
+
'workers.rungHint.hard': 'Depuração difícil, mudanças em vários arquivos, revisão e contestação independentes',
|
|
2636
|
+
'workers.rungHint.plan': 'O melhor resultado possível: planejamento, design, arquitetura, opiniões',
|
|
2637
|
+
'workers.rungEmpty': '{rung} não tem modelo definido',
|
|
2638
|
+
'workers.notCandidate': '{name} não é candidato neste campo',
|
|
2639
|
+
'workers.sessionModel': 'o modelo da sessão',
|
|
2640
|
+
'workers.offset': 'Ajuste esforço',
|
|
2641
|
+
'workers.anyEffort': 'Qualquer',
|
|
2642
|
+
'workers.noTarget': 'Usar o próximo nível / reserva',
|
|
2643
|
+
'workers.judgeBlurb': 'Quem decide: o esforço dos prompts e a área e o nível das tarefas.',
|
|
2644
|
+
'workers.disabled': '{provider} está desativado',
|
|
2645
|
+
'workers.nested': 'Um subagente não pode iniciar outro subagente: faça esta parte você mesmo e depois informe.',
|
|
2646
|
+
'workers.none': 'Nenhum worker ativado está disponível',
|
|
2647
|
+
'workers.loading': 'Carregando os workers do roteador…',
|
|
2648
|
+
'workers.providerSub': '{on} de {count} ativados',
|
|
2649
|
+
'workers.fallbackHint': 'quando os destinos fixados não podem rodar',
|
|
2650
|
+
'workers.pinDetails': 'Mais opções',
|
|
2651
|
+
'workers.back': 'Voltar',
|
|
2652
|
+
'settings.ladderWaiting': 'Aguardando a lista de modelos do roteador.',
|
|
2653
|
+
'jev.zenMissing': 'Não há chave de autorização do OpenCode Zen na configuração do ClaudeRipple',
|
|
2654
|
+
'agents.domainLevel': '{domain} / {level}',
|
|
2655
|
+
'agents.tokens': '≈{tokens} tok',
|
|
2656
|
+
// Time units: countdowns, reset times, durations.
|
|
2657
|
+
'units.seconds': '{n} s',
|
|
2658
|
+
'units.minutes': '{n} min',
|
|
2659
|
+
'units.hours': '{n} h',
|
|
2660
|
+
'units.days': '{n} d',
|
|
2661
|
+
'units.minSec': '{m} min {s} s',
|
|
2662
|
+
'units.hourMin': '{h} h {m} min',
|
|
2663
|
+
}
|
|
2664
|
+
|
|
2665
|
+
// Independent tables: a translator can replace any language without changing English.
|
|
2666
|
+
export const STRINGS: Record<Lang, Record<Key, string>> = {
|
|
2667
|
+
ko: { ...KO },
|
|
2668
|
+
en: { ...EN },
|
|
2669
|
+
zh: { ...ZH },
|
|
2670
|
+
ja: { ...JA },
|
|
2671
|
+
es: { ...ES },
|
|
2672
|
+
pt: { ...PT },
|
|
2673
|
+
}
|
|
2674
|
+
|
|
2675
|
+
const DEBUG_KEYS: Readonly<Record<string, Key>> = {
|
|
2676
|
+
judge: 'commands.debugJudge', judgeModel: 'commands.debugJudgeModel', pick: 'commands.debugPick',
|
|
2677
|
+
paused: 'commands.debugPaused', cache: 'commands.debugCache', warm: 'commands.debugWarm',
|
|
2678
|
+
lastSpawn: 'commands.debugLastSpawn', lastRequest: 'commands.debugLastRequest',
|
|
2679
|
+
effort: 'commands.debugEffort', why: 'commands.debugWhy', by: 'commands.debugBy', at: 'commands.debugAt', sure: 'commands.debugSure',
|
|
2680
|
+
ttlMs: 'commands.debugTtlMs', lastReplyAt: 'commands.debugLastReplyAt', expiresAt: 'commands.debugExpiresAt',
|
|
2681
|
+
pings: 'commands.debugPings', cost: 'commands.debugCost', stopped: 'commands.debugStopped', lastPingAt: 'commands.debugLastPingAt',
|
|
2682
|
+
tier: 'commands.debugTier', target: 'commands.debugTarget', agent: 'commands.debugAgent', model: 'commands.debugModel',
|
|
2683
|
+
ms: 'commands.debugMs', fallbackReason: 'commands.debugFallbackReason', appEffort: 'commands.debugAppEffort', sentEffort: 'commands.debugSentEffort',
|
|
2684
|
+
}
|
|
2685
|
+
|
|
2686
|
+
/** Localize diagnostic labels, not model ids, enum values, or model-written reasons. */
|
|
2687
|
+
export function debugText(lang: Lang, value: unknown): string {
|
|
2688
|
+
return JSON.stringify(value, (_key, entry: unknown) => {
|
|
2689
|
+
if (!entry || typeof entry !== 'object' || Array.isArray(entry)) return entry
|
|
2690
|
+
return Object.fromEntries(Object.entries(entry).map(([key, item]) => [
|
|
2691
|
+
Object.hasOwn(DEBUG_KEYS, key) ? t(lang, DEBUG_KEYS[key]!) : key, item,
|
|
2692
|
+
]))
|
|
2693
|
+
}, 2)
|
|
2694
|
+
}
|
|
2695
|
+
|
|
2696
|
+
export function t(lang: Lang, key: string, vars?: Readonly<Record<string, string | number>>): string {
|
|
2697
|
+
const table: Readonly<Record<string, string>> = STRINGS[lang] ?? STRINGS.en
|
|
2698
|
+
const english: Readonly<Record<string, string>> = STRINGS.en
|
|
2699
|
+
const text = Object.hasOwn(table, key) ? table[key] : undefined
|
|
2700
|
+
const fallback = Object.hasOwn(english, key) ? english[key] : undefined
|
|
2701
|
+
return (text ?? fallback ?? key).replace(/\{(\w+)\}/g, (placeholder, name: string) =>
|
|
2702
|
+
vars && Object.hasOwn(vars, name) ? String(vars[name]) : placeholder)
|
|
2703
|
+
}
|
|
2704
|
+
|
|
2705
|
+
const NAMES: Readonly<Record<string, Lang>> = {
|
|
2706
|
+
korean: 'ko', '한국어': 'ko', english: 'en', chinese: 'zh', '简体中文': 'zh', '中文': 'zh',
|
|
2707
|
+
japanese: 'ja', '日本語': 'ja', spanish: 'es', 'español': 'es', portuguese: 'pt', 'português': 'pt',
|
|
2708
|
+
}
|
|
2709
|
+
|
|
2710
|
+
export function langFrom(value: string | undefined): Lang | undefined {
|
|
2711
|
+
if (!value) return undefined
|
|
2712
|
+
const normalized = value.trim().toLowerCase()
|
|
2713
|
+
if (Object.hasOwn(NAMES, normalized)) return NAMES[normalized]
|
|
2714
|
+
const base = normalized.split(/[-_.@]/)[0]
|
|
2715
|
+
return base === 'ko' || base === 'en' || base === 'zh' || base === 'ja' || base === 'es' || base === 'pt' ? base : undefined
|
|
2716
|
+
}
|