modelroom 0.0.5 → 0.1.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 +15 -0
- package/README.md +40 -8
- package/dist/bin/modelroom.js +241 -75
- package/dist/bin/modelroom.js.map +1 -1
- package/dist/lib/agents/index.d.ts +6 -0
- package/dist/lib/agents/index.d.ts.map +1 -1
- package/dist/lib/agents/index.js +22 -4
- package/dist/lib/agents/index.js.map +1 -1
- package/dist/lib/artifact.d.ts +1 -1
- package/dist/lib/artifact.d.ts.map +1 -1
- package/dist/lib/artifact.js +9 -5
- package/dist/lib/artifact.js.map +1 -1
- package/dist/lib/config.d.ts +17 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +40 -4
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/frontmatter.d.ts +2 -0
- package/dist/lib/frontmatter.d.ts.map +1 -1
- package/dist/lib/frontmatter.js +11 -2
- package/dist/lib/frontmatter.js.map +1 -1
- package/dist/lib/i18n.d.ts +315 -0
- package/dist/lib/i18n.d.ts.map +1 -0
- package/dist/lib/i18n.js +651 -0
- package/dist/lib/i18n.js.map +1 -0
- package/dist/lib/lang.d.ts +4 -0
- package/dist/lib/lang.d.ts.map +1 -0
- package/dist/lib/lang.js +5 -0
- package/dist/lib/lang.js.map +1 -0
- package/dist/lib/lint.d.ts +3 -0
- package/dist/lib/lint.d.ts.map +1 -1
- package/dist/lib/lint.js +22 -12
- package/dist/lib/lint.js.map +1 -1
- package/dist/lib/locale.d.ts +9 -0
- package/dist/lib/locale.d.ts.map +1 -0
- package/dist/lib/locale.js +32 -0
- package/dist/lib/locale.js.map +1 -0
- package/dist/lib/opencode.d.ts +31 -1
- package/dist/lib/opencode.d.ts.map +1 -1
- package/dist/lib/opencode.js +83 -1
- package/dist/lib/opencode.js.map +1 -1
- package/dist/lib/server.d.ts +3 -0
- package/dist/lib/server.d.ts.map +1 -1
- package/dist/lib/server.js +79 -36
- package/dist/lib/server.js.map +1 -1
- package/dist/lib/templates.d.ts +7 -0
- package/dist/lib/templates.d.ts.map +1 -0
- package/dist/lib/templates.js +30 -0
- package/dist/lib/templates.js.map +1 -0
- package/docs/02-convention.md +10 -5
- package/docs/03-cli.md +59 -14
- package/docs/04-agents.md +27 -3
- package/package.json +9 -19
- package/templates/{AGENTS.md → en/AGENTS.md} +8 -3
- package/templates/ja/AGENTS.md +38 -0
- package/templates/ja/room/BEHAVIOUR.md +18 -0
- package/templates/ja/room/BRIEF.md +16 -0
- package/templates/ja/room/SPEC.md +9 -0
- package/templates/ja/room/index.html +53 -0
- package/templates/modelroom.json +3 -1
- package/ui/assets/app.js +120 -47
- package/ui/dashboard.html +11 -7
- package/ui/kit.html +13 -9
- package/ui/modelroom.css +1 -2
- package/ui/room.html +11 -7
- package/ui/settings.html +11 -7
- /package/templates/{room → en/room}/BEHAVIOUR.md +0 -0
- /package/templates/{room → en/room}/BRIEF.md +0 -0
- /package/templates/{room → en/room}/SPEC.md +0 -0
- /package/templates/{room → en/room}/index.html +0 -0
package/dist/lib/i18n.js
ADDED
|
@@ -0,0 +1,651 @@
|
|
|
1
|
+
// modelroom — the text, in every language it ships.
|
|
2
|
+
//
|
|
3
|
+
// One catalog for the CLI, the server and the tool UI: a phrase lives in one
|
|
4
|
+
// place, and a missing translation is a type error. The catalogs are plain data
|
|
5
|
+
// so the browser bundle can import them without pulling Node into the UI.
|
|
6
|
+
export const en = {
|
|
7
|
+
// ── CLI ────────────────────────────────────────────────────────────────────
|
|
8
|
+
'cli.usage': `modelroom {version} — a full-scale model room for UI
|
|
9
|
+
|
|
10
|
+
usage
|
|
11
|
+
modelroom [serve] [--port 4321] [--host 127.0.0.1] [--open] [--lang en|ja]
|
|
12
|
+
modelroom init [<room>] [--dir rooms] [--lang en|ja] [--force]
|
|
13
|
+
modelroom check [--json] [--strict]
|
|
14
|
+
modelroom doctor
|
|
15
|
+
modelroom --version | --help
|
|
16
|
+
|
|
17
|
+
A room is one screen: modelroom/rooms/<name>/ with BRIEF.md, SPEC.md,
|
|
18
|
+
BEHAVIOUR.md and an artifact.
|
|
19
|
+
Config lives in modelroom/modelroom.json; local state in .modelroom/state.json
|
|
20
|
+
(git-ignore it).`,
|
|
21
|
+
'cli.error.unknownCommand': 'unknown command: {cmd}',
|
|
22
|
+
'cli.error.invalidLang': 'unsupported language: {lang} (use en or ja)',
|
|
23
|
+
'cli.serve.rooms': ' rooms {rooms}',
|
|
24
|
+
'cli.serve.roomsNone': '(none yet — try: npx modelroom init hello)',
|
|
25
|
+
'cli.serve.agent': ' agent {line}',
|
|
26
|
+
'cli.serve.artifacts': ' Artifacts are served unmodified. Writable files: {docs}',
|
|
27
|
+
'cli.serve.ctrlC': ' Ctrl+C to stop',
|
|
28
|
+
'cli.serve.portInUse': 'port {port} is in use — pass --port <n>',
|
|
29
|
+
'cli.init.skip': 'skip {label} (exists)',
|
|
30
|
+
'cli.init.created': 'created in {dir}:',
|
|
31
|
+
'cli.init.next': 'next',
|
|
32
|
+
'cli.init.nextServe': ' npx modelroom',
|
|
33
|
+
'cli.init.nextOpen': ' open http://127.0.0.1:{port}/rooms/{room}',
|
|
34
|
+
'cli.init.gitignore': '.gitignore (+ {path})',
|
|
35
|
+
'cli.init.language': 'language {lang} ({source})',
|
|
36
|
+
'cli.init.languageSource.flag': '--lang',
|
|
37
|
+
'cli.init.languageSource.config': 'modelroom.json',
|
|
38
|
+
'cli.init.languageSource.env': 'environment',
|
|
39
|
+
'cli.init.languageSource.default': 'default',
|
|
40
|
+
'cli.init.languageAuto': 'detected automatically — pass --lang en|ja to pin it',
|
|
41
|
+
'cli.init.legacy': 'existing config at {path}; keeping the old layout',
|
|
42
|
+
'cli.check.issue': '{level} {where} {code} {message}',
|
|
43
|
+
'cli.check.summary': '{rooms} room(s), {errors} error(s), {warnings} warning(s)',
|
|
44
|
+
'cli.check.level.error': 'FAIL',
|
|
45
|
+
'cli.check.level.warn': 'warn',
|
|
46
|
+
'cli.doctor.node': 'node {version} (needs >= 22.18)',
|
|
47
|
+
'cli.doctor.root': 'root exists: {path}',
|
|
48
|
+
'cli.doctor.roomsDir': 'rooms dir exists: {path}',
|
|
49
|
+
'cli.doctor.rooms': 'rooms found: {rooms}',
|
|
50
|
+
'cli.doctor.roomsNone': 'rooms found: none',
|
|
51
|
+
'cli.doctor.config': 'config: {path}',
|
|
52
|
+
'cli.doctor.configDefaults': 'config: modelroom.json (defaults in use)',
|
|
53
|
+
'cli.doctor.state': 'state: {path}',
|
|
54
|
+
'cli.doctor.lang': 'language: {lang}',
|
|
55
|
+
'cli.doctor.agents': 'agent instructions: {path}',
|
|
56
|
+
'cli.doctor.agentsMissing': 'agent instructions: missing ({path})',
|
|
57
|
+
'cli.doctor.agentPath': 'agent command on PATH: {command}',
|
|
58
|
+
'cli.doctor.agentMissing': 'agent command on PATH: {command} (not found — the chat will fail)',
|
|
59
|
+
'cli.doctor.playwright': 'png rendering (playwright): available',
|
|
60
|
+
'cli.doctor.playwrightMissing': 'png rendering (playwright): not installed (optional)',
|
|
61
|
+
'cli.doctor.room': 'room {room}: {detail}',
|
|
62
|
+
'cli.doctor.roomDocsOk': 'docs ok',
|
|
63
|
+
'cli.doctor.roomMissing': 'missing {docs}',
|
|
64
|
+
'cli.doctor.noArtifact': ', no {artifact}',
|
|
65
|
+
'cli.doctor.bothConfigs': 'both modelroom.json and modelroom/modelroom.json exist; the root one wins',
|
|
66
|
+
'cli.doctor.allGood': 'all good',
|
|
67
|
+
'cli.doctor.problems': '{count} problem(s)',
|
|
68
|
+
'cli.doctor.optional': ' (optional)',
|
|
69
|
+
// ── lint / frontmatter ─────────────────────────────────────────────────────
|
|
70
|
+
'lint.reserved-type': '{key} must be {allowed}, got {got}',
|
|
71
|
+
'lint.or': 'or',
|
|
72
|
+
'lint.tags-shape': 'tags must be a flat list of strings',
|
|
73
|
+
'lint.synonym': '{key} duplicates {canonical} — keep one',
|
|
74
|
+
'lint.no-frontmatter': 'no frontmatter — add title, summary and tags',
|
|
75
|
+
'lint.h1-title': 'H1 "{h1}" differs from title "{title}"',
|
|
76
|
+
'lint.variant': '{key}: {values} — same value, different spelling',
|
|
77
|
+
'lint.superseded-missing': 'superseded_by points to a room that does not exist: {target}',
|
|
78
|
+
'lint.nested': 'nested values are not supported — keep frontmatter flat',
|
|
79
|
+
'lint.syntax': 'not a key: value line — {line}',
|
|
80
|
+
'lint.duplicate-key': 'duplicate key: {key}',
|
|
81
|
+
'lint.unterminated': 'unterminated frontmatter',
|
|
82
|
+
// ── server ─────────────────────────────────────────────────────────────────
|
|
83
|
+
'server.noRooms': 'no rooms',
|
|
84
|
+
'server.docName': 'name must be one of {docs}',
|
|
85
|
+
'server.notEditable': 'this file is not editable',
|
|
86
|
+
'server.changedElsewhere': 'changed elsewhere',
|
|
87
|
+
'server.methodDoc': 'GET or PUT',
|
|
88
|
+
'server.emptyPrompt': 'empty prompt',
|
|
89
|
+
'server.roomRunningChat': 'this room is already running',
|
|
90
|
+
'server.roomRunning': 'room is running',
|
|
91
|
+
'server.alreadyRendering': 'already rendering',
|
|
92
|
+
'server.badBodyRead': 'request body could not be read',
|
|
93
|
+
'server.bodyObject': 'body must be a JSON object',
|
|
94
|
+
'server.bodyJson': 'body must be valid JSON',
|
|
95
|
+
'server.badRequest': 'bad request',
|
|
96
|
+
'server.internal': 'internal error',
|
|
97
|
+
'server.agentExited': '{room}: agent exited ({code})',
|
|
98
|
+
'server.cannotStart': 'cannot start {command}: {message}',
|
|
99
|
+
'server.artifactNotFound': 'artifact not found: {path}',
|
|
100
|
+
'server.changed': 'changed: {file}',
|
|
101
|
+
'server.agentWorking': '{room}: agent is working…',
|
|
102
|
+
'server.rendering': '{room}: rendering {file}…',
|
|
103
|
+
'server.rendered': '{room}: {file} updated',
|
|
104
|
+
'server.installHint': 'PNG rendering needs Playwright:\n npm install --include=dev playwright && npx playwright install chromium\n(modelroom works without it — the room just has no thumbnail.)',
|
|
105
|
+
// ── common UI ──────────────────────────────────────────────────────────────
|
|
106
|
+
'common.rooms': 'Rooms',
|
|
107
|
+
'common.settings': 'Settings',
|
|
108
|
+
'common.refresh': 'refresh',
|
|
109
|
+
'common.retry': 'retry',
|
|
110
|
+
'common.copy': 'Copy reply',
|
|
111
|
+
'common.copied': 'copied',
|
|
112
|
+
'common.cancel': 'cancel',
|
|
113
|
+
'common.save': 'save',
|
|
114
|
+
'common.saving': 'saving…',
|
|
115
|
+
'common.saved': 'saved',
|
|
116
|
+
'common.failed': 'failed',
|
|
117
|
+
'common.loading': 'loading…',
|
|
118
|
+
'common.ready': 'ready',
|
|
119
|
+
'common.reconnecting': 'reconnecting…',
|
|
120
|
+
'common.running': 'running',
|
|
121
|
+
'common.any': 'any',
|
|
122
|
+
'common.none': 'none',
|
|
123
|
+
'common.close': 'close',
|
|
124
|
+
'common.open': 'open',
|
|
125
|
+
'common.delete': 'delete',
|
|
126
|
+
'common.edit': 'Edit',
|
|
127
|
+
'common.preview': 'Preview',
|
|
128
|
+
'common.split': 'Edit and preview',
|
|
129
|
+
'common.sideBySide': 'Side by side',
|
|
130
|
+
'common.stacked': 'Stacked',
|
|
131
|
+
'common.tabs': 'Tabs',
|
|
132
|
+
'common.tiles': 'Tiles',
|
|
133
|
+
'common.filter': '{name} filter',
|
|
134
|
+
'common.noValueMatches': 'No value matches',
|
|
135
|
+
'common.theme': 'Theme',
|
|
136
|
+
'common.themeLight': 'Light theme',
|
|
137
|
+
'common.themeDark': 'Dark theme',
|
|
138
|
+
'common.room': 'Room',
|
|
139
|
+
// ── dashboard ──────────────────────────────────────────────────────────────
|
|
140
|
+
'dashboard.search': 'Search rooms, docs, tags… ( / )',
|
|
141
|
+
'dashboard.searchLabel': 'Search rooms',
|
|
142
|
+
'dashboard.reload': 'Reload the room list',
|
|
143
|
+
'dashboard.archived': 'archived ({count})',
|
|
144
|
+
'dashboard.nothingMatches': 'Nothing matches',
|
|
145
|
+
'dashboard.noRooms': 'No rooms yet',
|
|
146
|
+
'dashboard.noRoomsHint': 'A room is one screen: rooms/<name>/ with BRIEF.md, SPEC.md, BEHAVIOUR.md and an artifact.',
|
|
147
|
+
'dashboard.noThumb': 'no thumbnail yet',
|
|
148
|
+
'dashboard.noArtifact': 'no artifact yet',
|
|
149
|
+
'dashboard.roomsCount': 'rooms {total}',
|
|
150
|
+
'dashboard.roomsFiltered': '{visible} / {total}',
|
|
151
|
+
'dashboard.archivedBadge': 'archived',
|
|
152
|
+
'dashboard.behavioursOne': '{count} behaviour',
|
|
153
|
+
'dashboard.behavioursOther': '{count} behaviours',
|
|
154
|
+
'dashboard.searchBadge': 'search: {query}',
|
|
155
|
+
'dashboard.clearAll': 'clear all',
|
|
156
|
+
'dashboard.clearSearch': 'Clear search and filters',
|
|
157
|
+
'dashboard.loosen': 'Loosen a filter, or search for something else.',
|
|
158
|
+
// ── room ───────────────────────────────────────────────────────────────────
|
|
159
|
+
'room.chat': 'Chat',
|
|
160
|
+
'room.docs': 'Docs',
|
|
161
|
+
'room.artifact': 'Artifact',
|
|
162
|
+
'room.session': 'Session',
|
|
163
|
+
'room.showSession': 'Show session panel',
|
|
164
|
+
'room.hideSession': 'Hide session panel',
|
|
165
|
+
'room.sessionPanel': 'Room panel',
|
|
166
|
+
'room.loading': 'loading room…',
|
|
167
|
+
'room.cannotOpen': 'Cannot open this room',
|
|
168
|
+
'room.cannotLoad': 'cannot load this room',
|
|
169
|
+
'room.newSession': 'new session',
|
|
170
|
+
'room.newSessionConfirm': 'Start a new session for this room? The conversation context resets.',
|
|
171
|
+
'room.newSessionStarted': 'new session started',
|
|
172
|
+
'room.sessionLabel': 'session {id}…',
|
|
173
|
+
'room.agentLabel': '{adapter} · {command}',
|
|
174
|
+
// ── chat / composer ────────────────────────────────────────────────────────
|
|
175
|
+
'chat.title': 'Chat',
|
|
176
|
+
'chat.agentLog': 'agent log',
|
|
177
|
+
'chat.resumed': '— resumed this session ({turns} turns)',
|
|
178
|
+
'chat.resumedOne': '— resumed this session (1 turn)',
|
|
179
|
+
'chat.couldNotSend': 'could not send: {reason}',
|
|
180
|
+
'chat.couldNotReach': 'could not reach the server',
|
|
181
|
+
'chat.agentBusy': 'the agent is busy',
|
|
182
|
+
'chat.empty': 'A room is one screen. Ask for the change; watch the artifact move.',
|
|
183
|
+
'composer.placeholder': "Ask the agent to change this room. It edits the room's files; the artifact updates here.",
|
|
184
|
+
'composer.messageLabel': 'Message the agent',
|
|
185
|
+
'composer.send': 'Send',
|
|
186
|
+
'composer.stop': 'Stop',
|
|
187
|
+
'composer.queue': 'Queue',
|
|
188
|
+
'composer.removeQueued': 'Remove queued prompt: {text}',
|
|
189
|
+
'composer.hint': 'Enter to send · Shift+Enter for a new line',
|
|
190
|
+
'composer.working': 'agent is working…',
|
|
191
|
+
'chat.suggestion.tighten': 'Tighten the spacing and the type scale.',
|
|
192
|
+
'chat.suggestion.states': 'Add a loading state and an error state.',
|
|
193
|
+
'chat.suggestion.primary': 'Make the primary action the obvious one.',
|
|
194
|
+
'chat.suggestion.spec': 'Rewrite SPEC.md so it only holds what the screen cannot show.',
|
|
195
|
+
// ── docs ───────────────────────────────────────────────────────────────────
|
|
196
|
+
'docs.failed': 'failed: {error}',
|
|
197
|
+
'docs.changedElsewhere': 'changed elsewhere',
|
|
198
|
+
'docs.saving': 'saving…',
|
|
199
|
+
'docs.unsaved': 'unsaved…',
|
|
200
|
+
'docs.savedAt': 'saved {time}',
|
|
201
|
+
'docs.onDiskAt': 'on disk {time}',
|
|
202
|
+
'docs.empty': 'No docs yet.',
|
|
203
|
+
'docs.docView': 'Doc view mode',
|
|
204
|
+
'docs.splitOrientation': 'Split orientation',
|
|
205
|
+
'docs.layout': 'Doc layout',
|
|
206
|
+
'docs.conflictTitle': 'This file changed elsewhere',
|
|
207
|
+
'docs.conflictBody': 'Your version is still here. Reload the file from disk, or keep your version and overwrite it.',
|
|
208
|
+
'docs.conflictText': '{name} changed on disk while you were typing.',
|
|
209
|
+
'docs.reload': 'Reload from disk',
|
|
210
|
+
'docs.keepMine': 'Keep mine',
|
|
211
|
+
'docs.takeTheirs': 'Take theirs',
|
|
212
|
+
'docs.frontmatter': 'Frontmatter',
|
|
213
|
+
'docs.notConfigured': 'No docs configured.',
|
|
214
|
+
'docs.sourceLabel': '{name} — markdown source',
|
|
215
|
+
// ── artifact ───────────────────────────────────────────────────────────────
|
|
216
|
+
'artifact.title': 'Artifact',
|
|
217
|
+
'artifact.fit': 'fit',
|
|
218
|
+
'artifact.deviceWidth': 'Device width',
|
|
219
|
+
'artifact.view': 'Artifact view',
|
|
220
|
+
'artifact.makePng': 'make png',
|
|
221
|
+
'artifact.openRaw': 'open raw',
|
|
222
|
+
'artifact.png': 'png',
|
|
223
|
+
'artifact.noArtifact': 'No artifact yet — {artifact}. Ask the agent to create it.',
|
|
224
|
+
'artifact.thumbnail': 'artifact thumbnail',
|
|
225
|
+
'artifact.noPng': 'No PNG yet. Use “make png” — it needs Playwright.',
|
|
226
|
+
'artifact.reload': 'Reload the artifact',
|
|
227
|
+
'artifact.empty': 'No artifact yet.',
|
|
228
|
+
'artifact.error': 'Could not render the artifact.',
|
|
229
|
+
'artifact.device.sp': 'phone',
|
|
230
|
+
'artifact.device.tablet': 'tablet',
|
|
231
|
+
'artifact.device.pc': 'desktop',
|
|
232
|
+
// ── session ────────────────────────────────────────────────────────────────
|
|
233
|
+
'session.title': 'Session',
|
|
234
|
+
'session.unavailable': 'Session information is only available with the opencode adapter.',
|
|
235
|
+
'session.context': 'Context',
|
|
236
|
+
'session.contextUsed': 'Context window used',
|
|
237
|
+
'session.contextHigh': '{pct}% — consider compact (limit {limit})',
|
|
238
|
+
'session.contextUnknown': 'Context: not measurable yet (no run, or unknown limit)',
|
|
239
|
+
'session.cost': 'Cost',
|
|
240
|
+
'session.tokensIn': 'Tokens ↑',
|
|
241
|
+
'session.tokensOut': 'Tokens ↓',
|
|
242
|
+
'session.reasoning': 'reasoning',
|
|
243
|
+
'session.cache': 'Cache',
|
|
244
|
+
'session.state': 'State',
|
|
245
|
+
'session.model': 'model',
|
|
246
|
+
'session.workspace': 'workspace',
|
|
247
|
+
'session.skills': 'Skills',
|
|
248
|
+
'session.mcp': 'MCP',
|
|
249
|
+
// ── parts / status ─────────────────────────────────────────────────────────
|
|
250
|
+
'parts.changes': 'changes',
|
|
251
|
+
'parts.output': 'output',
|
|
252
|
+
'parts.reasoning': 'reasoning',
|
|
253
|
+
'parts.filesOne': '{count} file',
|
|
254
|
+
'parts.filesOther': '{count} files',
|
|
255
|
+
'parts.truncated': 'output was truncated',
|
|
256
|
+
'parts.exit': 'exit {code}',
|
|
257
|
+
'status.running': 'running',
|
|
258
|
+
'status.done': 'done',
|
|
259
|
+
'status.error': 'error',
|
|
260
|
+
// ── settings ───────────────────────────────────────────────────────────────
|
|
261
|
+
'settings.title': 'Settings',
|
|
262
|
+
'settings.agent': 'Agent',
|
|
263
|
+
'settings.agentHint': 'modelroom drives the agent you already use. Nothing here is sent anywhere by modelroom itself.',
|
|
264
|
+
'settings.adapter': 'Adapter',
|
|
265
|
+
'settings.adapter.opencode': 'opencode — OpenCode CLI (sessions, model, agent)',
|
|
266
|
+
'settings.adapter.command': 'command — any CLI, with args containing {prompt} and {session}',
|
|
267
|
+
'settings.command': 'Command',
|
|
268
|
+
'settings.agentName': 'Agent name',
|
|
269
|
+
'settings.model': 'Model',
|
|
270
|
+
'settings.modelDescription': 'optional — many agents fail on an unset default',
|
|
271
|
+
'settings.standalone': "Run the agent against its own server, using this process's environment (opencode)",
|
|
272
|
+
'settings.config': 'Config',
|
|
273
|
+
'settings.configHint': 'Committed defaults live in {path}; anything saved here is kept locally in {state} (git-ignored). Editable room files are: {docs}.',
|
|
274
|
+
'settings.root': 'root {root}',
|
|
275
|
+
'settings.rooms': 'rooms {rooms}/',
|
|
276
|
+
'settings.artifact': 'artifact {artifact}',
|
|
277
|
+
'settings.language': 'language {lang}',
|
|
278
|
+
'settings.adapterLine': 'agent {adapter}',
|
|
279
|
+
'settings.commandLine': 'command {command}',
|
|
280
|
+
'settings.agentLine': 'agent name {agent}',
|
|
281
|
+
'settings.modelLine': 'model {model}',
|
|
282
|
+
'settings.default': 'default',
|
|
283
|
+
'settings.thumbnails': 'Thumbnails',
|
|
284
|
+
'settings.thumbnailsHint': 'Rendering a room to PNG is optional and needs Playwright. modelroom works without it — rooms simply show no thumbnail.',
|
|
285
|
+
'settings.thumbnailsAlert': 'Rendering an artifact to PNG needs Playwright and a browser: {command}. modelroom works without it — rooms simply show no thumbnail.',
|
|
286
|
+
'settings.saved': 'saved {time}',
|
|
287
|
+
'settings.failed': 'failed: {error}',
|
|
288
|
+
'settings.couldNotReach': 'failed: could not reach the server',
|
|
289
|
+
'settings.invalidLanguage': 'invalid language',
|
|
290
|
+
// ── facet ──────────────────────────────────────────────────────────────────
|
|
291
|
+
'facet.any': 'any',
|
|
292
|
+
'facet.noMatch': 'No value matches',
|
|
293
|
+
'facet.clear': 'Clear',
|
|
294
|
+
'facet.more': '+{count} more',
|
|
295
|
+
'facet.searchValues': 'search {count} values',
|
|
296
|
+
'facet.searchOrPick': 'search or pick',
|
|
297
|
+
// ── workshop ───────────────────────────────────────────────────────────────
|
|
298
|
+
'kit.filter': 'Filter — the facet control',
|
|
299
|
+
'kit.icons': 'Icons',
|
|
300
|
+
'kit.segmented': 'SegmentedControl',
|
|
301
|
+
'kit.buttons': 'Button · Badge · ActionIcon · CopyButton · Loader',
|
|
302
|
+
'kit.panels': 'Panels',
|
|
303
|
+
'kit.markdown': 'Markdown',
|
|
304
|
+
'kit.markdownChat': 'Markdown — chat',
|
|
305
|
+
'kit.markdownDoc': 'Markdown — doc preview',
|
|
306
|
+
'kit.formControls': 'Form controls',
|
|
307
|
+
'kit.card': 'Card / surfaces',
|
|
308
|
+
'kit.split': 'Split (react-resizable-panels)',
|
|
309
|
+
'kit.divider': 'Divider',
|
|
310
|
+
'kit.tags': 'Tags',
|
|
311
|
+
'kit.noRooms': 'No rooms yet',
|
|
312
|
+
'kit.noRoomsHint': 'A room is one screen: rooms/<name>/.',
|
|
313
|
+
'kit.filterHint': "Mantine's provided parts: MultiSelect / Select under 500 candidates, Combobox + useVirtualizedCombobox above.",
|
|
314
|
+
'kit.iconsHint': "lucide-react behind a name — the tool's own set, drawn at the size the caller asks for.",
|
|
315
|
+
'kit.segmentedHint': 'The edit / split / preview, orientation and layout switches.',
|
|
316
|
+
'kit.markdownHint': "markdown-it with raw HTML disabled; code fences get a copy button; the rhythm is Mantine's Typography.",
|
|
317
|
+
'kit.docHint': 'Frontmatter is split out by the panel, not here.',
|
|
318
|
+
'kit.formHint': 'TextInput, Checkbox, Select, MultiSelect — the settings form and the facets.',
|
|
319
|
+
'kit.cardHint': "The dashboard's room cards and the settings sections.",
|
|
320
|
+
'kit.splitHint': "Mantine has no split pane; the room's columns and the docs split use this one library.",
|
|
321
|
+
};
|
|
322
|
+
export const ja = {
|
|
323
|
+
// ── CLI ────────────────────────────────────────────────────────────────────
|
|
324
|
+
'cli.usage': `modelroom {version} — UI のためのフルスケール・モデルルーム
|
|
325
|
+
|
|
326
|
+
使い方
|
|
327
|
+
modelroom [serve] [--port 4321] [--host 127.0.0.1] [--open] [--lang en|ja]
|
|
328
|
+
modelroom init [<room>] [--dir rooms] [--lang en|ja] [--force]
|
|
329
|
+
modelroom check [--json] [--strict]
|
|
330
|
+
modelroom doctor
|
|
331
|
+
modelroom --version | --help
|
|
332
|
+
|
|
333
|
+
room は1画面です: modelroom/rooms/<name>/ に BRIEF.md、SPEC.md、
|
|
334
|
+
BEHAVIOUR.md、そして artifact を置きます。
|
|
335
|
+
設定は modelroom/modelroom.json、ローカル状態は .modelroom/state.json
|
|
336
|
+
(git-ignore してください)。`,
|
|
337
|
+
'cli.error.unknownCommand': '不明なコマンド: {cmd}',
|
|
338
|
+
'cli.error.invalidLang': '未対応の言語です: {lang}(en または ja)',
|
|
339
|
+
'cli.serve.rooms': ' rooms {rooms}',
|
|
340
|
+
'cli.serve.roomsNone': '(まだありません — npx modelroom init hello を試してください)',
|
|
341
|
+
'cli.serve.agent': ' agent {line}',
|
|
342
|
+
'cli.serve.artifacts': ' artifact は無改変で配信されます。書き込み可能: {docs}',
|
|
343
|
+
'cli.serve.ctrlC': ' 停止するには Ctrl+C',
|
|
344
|
+
'cli.serve.portInUse': 'ポート {port} は使用中です — --port <n> を指定してください',
|
|
345
|
+
'cli.init.skip': 'skip {label}(既存)',
|
|
346
|
+
'cli.init.created': '{dir} に作成しました:',
|
|
347
|
+
'cli.init.next': '次に',
|
|
348
|
+
'cli.init.nextServe': ' npx modelroom',
|
|
349
|
+
'cli.init.nextOpen': ' open http://127.0.0.1:{port}/rooms/{room}',
|
|
350
|
+
'cli.init.gitignore': '.gitignore(+ {path})',
|
|
351
|
+
'cli.init.language': '言語 {lang}({source})',
|
|
352
|
+
'cli.init.languageSource.flag': '--lang',
|
|
353
|
+
'cli.init.languageSource.config': 'modelroom.json',
|
|
354
|
+
'cli.init.languageSource.env': '環境変数',
|
|
355
|
+
'cli.init.languageSource.default': '既定値',
|
|
356
|
+
'cli.init.languageAuto': '自動判定しました — 固定するには --lang en|ja',
|
|
357
|
+
'cli.init.legacy': '既存の設定 {path} があるため、旧レイアウトのままにします',
|
|
358
|
+
'cli.check.issue': '{level} {where} {code} {message}',
|
|
359
|
+
'cli.check.summary': '{rooms} room、エラー {errors}、警告 {warnings}',
|
|
360
|
+
'cli.check.level.error': 'FAIL',
|
|
361
|
+
'cli.check.level.warn': 'warn',
|
|
362
|
+
'cli.doctor.node': 'node {version}(>= 22.18 が必要)',
|
|
363
|
+
'cli.doctor.root': 'root が存在: {path}',
|
|
364
|
+
'cli.doctor.roomsDir': 'rooms ディレクトリが存在: {path}',
|
|
365
|
+
'cli.doctor.rooms': 'rooms: {rooms}',
|
|
366
|
+
'cli.doctor.roomsNone': 'rooms: なし',
|
|
367
|
+
'cli.doctor.config': '設定: {path}',
|
|
368
|
+
'cli.doctor.configDefaults': '設定: modelroom.json(既定値を使用)',
|
|
369
|
+
'cli.doctor.state': '状態: {path}',
|
|
370
|
+
'cli.doctor.lang': '言語: {lang}',
|
|
371
|
+
'cli.doctor.agents': 'エージェント指示: {path}',
|
|
372
|
+
'cli.doctor.agentsMissing': 'エージェント指示: なし({path})',
|
|
373
|
+
'cli.doctor.agentPath': 'agent コマンドが PATH にあります: {command}',
|
|
374
|
+
'cli.doctor.agentMissing': 'agent コマンドが PATH にありません: {command}(チャットは失敗します)',
|
|
375
|
+
'cli.doctor.playwright': 'PNG 生成(playwright): 利用可能',
|
|
376
|
+
'cli.doctor.playwrightMissing': 'PNG 生成(playwright): 未インストール(任意)',
|
|
377
|
+
'cli.doctor.room': 'room {room}: {detail}',
|
|
378
|
+
'cli.doctor.roomDocsOk': 'docs OK',
|
|
379
|
+
'cli.doctor.roomMissing': '不足 {docs}',
|
|
380
|
+
'cli.doctor.noArtifact': '、{artifact} なし',
|
|
381
|
+
'cli.doctor.bothConfigs': 'modelroom.json と modelroom/modelroom.json の両方があります。ルート側を使用します',
|
|
382
|
+
'cli.doctor.allGood': 'すべて正常です',
|
|
383
|
+
'cli.doctor.problems': '{count} 件の問題',
|
|
384
|
+
'cli.doctor.optional': '(任意)',
|
|
385
|
+
// ── lint / frontmatter ─────────────────────────────────────────────────────
|
|
386
|
+
'lint.reserved-type': '{key} は {allowed} である必要があります(実際は {got})',
|
|
387
|
+
'lint.or': 'または',
|
|
388
|
+
'lint.tags-shape': 'tags は文字列のフラットなリストである必要があります',
|
|
389
|
+
'lint.synonym': '{key} は {canonical} と重複しています — どちらか1つにしてください',
|
|
390
|
+
'lint.no-frontmatter': 'frontmatter がありません — title、summary、tags を追加してください',
|
|
391
|
+
'lint.h1-title': 'H1「{h1}」が title「{title}」と異なります',
|
|
392
|
+
'lint.variant': '{key}: {values} — 同じ値が別の綴りで書かれています',
|
|
393
|
+
'lint.superseded-missing': 'superseded_by が存在しない room を指しています: {target}',
|
|
394
|
+
'lint.nested': 'ネストした値は未対応です — frontmatter はフラットにしてください',
|
|
395
|
+
'lint.syntax': 'key: value の行ではありません — {line}',
|
|
396
|
+
'lint.duplicate-key': 'キーが重複しています: {key}',
|
|
397
|
+
'lint.unterminated': 'frontmatter が閉じられていません',
|
|
398
|
+
// ── server ─────────────────────────────────────────────────────────────────
|
|
399
|
+
'server.noRooms': 'room がありません',
|
|
400
|
+
'server.docName': 'name は {docs} のいずれかである必要があります',
|
|
401
|
+
'server.notEditable': 'このファイルは編集できません',
|
|
402
|
+
'server.changedElsewhere': '別の場所で変更されています',
|
|
403
|
+
'server.methodDoc': 'GET または PUT',
|
|
404
|
+
'server.emptyPrompt': 'プロンプトが空です',
|
|
405
|
+
'server.roomRunningChat': 'この room はすでに実行中です',
|
|
406
|
+
'server.roomRunning': 'room は実行中です',
|
|
407
|
+
'server.alreadyRendering': 'すでにレンダリング中です',
|
|
408
|
+
'server.badBodyRead': 'リクエスト本文を読み取れませんでした',
|
|
409
|
+
'server.bodyObject': '本文は JSON オブジェクトである必要があります',
|
|
410
|
+
'server.bodyJson': '本文は有効な JSON である必要があります',
|
|
411
|
+
'server.badRequest': '不正なリクエスト',
|
|
412
|
+
'server.internal': '内部エラー',
|
|
413
|
+
'server.agentExited': '{room}: エージェントが終了しました({code})',
|
|
414
|
+
'server.cannotStart': '{command} を起動できません: {message}',
|
|
415
|
+
'server.artifactNotFound': 'artifact が見つかりません: {path}',
|
|
416
|
+
'server.changed': '変更: {file}',
|
|
417
|
+
'server.agentWorking': '{room}: エージェントが作業中…',
|
|
418
|
+
'server.rendering': '{room}: {file} を描画中…',
|
|
419
|
+
'server.rendered': '{room}: {file} を更新しました',
|
|
420
|
+
'server.installHint': 'PNG 生成には Playwright が必要です:\n npm install --include=dev playwright && npx playwright install chromium\n(なくても modelroom は動きます — room のサムネイルが出ないだけです。)',
|
|
421
|
+
// ── common UI ──────────────────────────────────────────────────────────────
|
|
422
|
+
'common.rooms': 'Rooms',
|
|
423
|
+
'common.settings': '設定',
|
|
424
|
+
'common.refresh': '更新',
|
|
425
|
+
'common.retry': '再試行',
|
|
426
|
+
'common.copy': '返信をコピー',
|
|
427
|
+
'common.copied': 'コピーしました',
|
|
428
|
+
'common.cancel': 'キャンセル',
|
|
429
|
+
'common.save': '保存',
|
|
430
|
+
'common.saving': '保存中…',
|
|
431
|
+
'common.saved': '保存しました',
|
|
432
|
+
'common.failed': '失敗',
|
|
433
|
+
'common.loading': '読み込み中…',
|
|
434
|
+
'common.ready': '準備完了',
|
|
435
|
+
'common.reconnecting': '再接続中…',
|
|
436
|
+
'common.running': '実行中',
|
|
437
|
+
'common.any': 'すべて',
|
|
438
|
+
'common.none': 'なし',
|
|
439
|
+
'common.close': '閉じる',
|
|
440
|
+
'common.open': '開く',
|
|
441
|
+
'common.delete': '削除',
|
|
442
|
+
'common.edit': '編集',
|
|
443
|
+
'common.preview': 'プレビュー',
|
|
444
|
+
'common.split': '編集とプレビュー',
|
|
445
|
+
'common.sideBySide': '左右',
|
|
446
|
+
'common.stacked': '上下',
|
|
447
|
+
'common.tabs': 'タブ',
|
|
448
|
+
'common.tiles': 'タイル',
|
|
449
|
+
'common.filter': '{name} フィルター',
|
|
450
|
+
'common.noValueMatches': '一致する値がありません',
|
|
451
|
+
'common.theme': 'テーマ',
|
|
452
|
+
'common.themeLight': 'ライトテーマ',
|
|
453
|
+
'common.themeDark': 'ダークテーマ',
|
|
454
|
+
'common.room': 'Room',
|
|
455
|
+
// ── dashboard ──────────────────────────────────────────────────────────────
|
|
456
|
+
'dashboard.search': 'room、docs、tags を検索…( / )',
|
|
457
|
+
'dashboard.searchLabel': 'room を検索',
|
|
458
|
+
'dashboard.reload': 'room 一覧を再読み込み',
|
|
459
|
+
'dashboard.archived': 'アーカイブ({count})',
|
|
460
|
+
'dashboard.nothingMatches': '一致するものがありません',
|
|
461
|
+
'dashboard.noRooms': 'room がまだありません',
|
|
462
|
+
'dashboard.noRoomsHint': 'room は1画面です: rooms/<name>/ に BRIEF.md、SPEC.md、BEHAVIOUR.md、artifact を置きます。',
|
|
463
|
+
'dashboard.noThumb': 'サムネイルはまだありません',
|
|
464
|
+
'dashboard.noArtifact': 'artifact はまだありません',
|
|
465
|
+
'dashboard.roomsCount': 'rooms {total}',
|
|
466
|
+
'dashboard.roomsFiltered': '{visible} / {total}',
|
|
467
|
+
'dashboard.archivedBadge': 'アーカイブ',
|
|
468
|
+
'dashboard.behavioursOne': '約束 {count}',
|
|
469
|
+
'dashboard.behavioursOther': '約束 {count}',
|
|
470
|
+
'dashboard.searchBadge': '検索: {query}',
|
|
471
|
+
'dashboard.clearAll': 'すべてクリア',
|
|
472
|
+
'dashboard.clearSearch': '検索とフィルターをクリア',
|
|
473
|
+
'dashboard.loosen': 'フィルターを緩めるか、別の言葉で検索してください。',
|
|
474
|
+
// ── room ───────────────────────────────────────────────────────────────────
|
|
475
|
+
'room.chat': 'チャット',
|
|
476
|
+
'room.docs': 'ドキュメント',
|
|
477
|
+
'room.artifact': 'Artifact',
|
|
478
|
+
'room.session': 'セッション',
|
|
479
|
+
'room.showSession': 'セッションパネルを表示',
|
|
480
|
+
'room.hideSession': 'セッションパネルを隠す',
|
|
481
|
+
'room.sessionPanel': 'room パネル',
|
|
482
|
+
'room.loading': 'room を読み込み中…',
|
|
483
|
+
'room.cannotOpen': 'この room を開けません',
|
|
484
|
+
'room.cannotLoad': 'この room を読み込めません',
|
|
485
|
+
'room.newSession': '新しいセッション',
|
|
486
|
+
'room.newSessionConfirm': 'この room の新しいセッションを開始しますか?会話の文脈はリセットされます。',
|
|
487
|
+
'room.newSessionStarted': '新しいセッションを開始しました',
|
|
488
|
+
'room.sessionLabel': 'session {id}…',
|
|
489
|
+
'room.agentLabel': '{adapter} · {command}',
|
|
490
|
+
// ── chat / composer ────────────────────────────────────────────────────────
|
|
491
|
+
'chat.title': 'チャット',
|
|
492
|
+
'chat.agentLog': 'エージェントログ',
|
|
493
|
+
'chat.resumed': '— このセッションを再開しました({turns} ターン)',
|
|
494
|
+
'chat.resumedOne': '— このセッションを再開しました(1 ターン)',
|
|
495
|
+
'chat.couldNotSend': '送信できません: {reason}',
|
|
496
|
+
'chat.couldNotReach': 'サーバーに接続できません',
|
|
497
|
+
'chat.agentBusy': 'エージェントが実行中です',
|
|
498
|
+
'chat.empty': 'room は1画面です。変更を依頼して、artifact が動くのを見てください。',
|
|
499
|
+
'composer.placeholder': 'この room を変えるようエージェントに依頼します。room のファイルを編集し、artifact はここで更新されます。',
|
|
500
|
+
'composer.messageLabel': 'エージェントにメッセージ',
|
|
501
|
+
'composer.send': '送信',
|
|
502
|
+
'composer.stop': '停止',
|
|
503
|
+
'composer.queue': 'キュー',
|
|
504
|
+
'composer.removeQueued': 'キューから削除: {text}',
|
|
505
|
+
'composer.hint': 'Enter で送信 · Shift+Enter で改行',
|
|
506
|
+
'composer.working': 'エージェントが作業中…',
|
|
507
|
+
'chat.suggestion.tighten': '余白と文字サイズのスケールを詰めてください。',
|
|
508
|
+
'chat.suggestion.states': '読み込み状態とエラー状態を追加してください。',
|
|
509
|
+
'chat.suggestion.primary': '主要なアクションを一番目立つようにしてください。',
|
|
510
|
+
'chat.suggestion.spec': 'SPEC.md を、画面では見えないことだけに書き直してください。',
|
|
511
|
+
// ── docs ───────────────────────────────────────────────────────────────────
|
|
512
|
+
'docs.failed': '失敗: {error}',
|
|
513
|
+
'docs.changedElsewhere': '別の場所で変更されています',
|
|
514
|
+
'docs.saving': '保存中…',
|
|
515
|
+
'docs.unsaved': '未保存…',
|
|
516
|
+
'docs.savedAt': '保存 {time}',
|
|
517
|
+
'docs.onDiskAt': 'ディスク {time}',
|
|
518
|
+
'docs.empty': 'ドキュメントはまだありません。',
|
|
519
|
+
'docs.docView': 'ドキュメント表示モード',
|
|
520
|
+
'docs.splitOrientation': '分割の向き',
|
|
521
|
+
'docs.layout': 'ドキュメントのレイアウト',
|
|
522
|
+
'docs.conflictTitle': 'このファイルは別の場所で変更されました',
|
|
523
|
+
'docs.conflictBody': 'あなたの版はここに残っています。ディスクから再読み込みするか、あなたの版で上書きしてください。',
|
|
524
|
+
'docs.conflictText': '{name} は入力中にディスク上で変更されました。',
|
|
525
|
+
'docs.reload': 'ディスクから再読み込み',
|
|
526
|
+
'docs.keepMine': '自分の版を残す',
|
|
527
|
+
'docs.takeTheirs': '相手の版を取る',
|
|
528
|
+
'docs.frontmatter': 'Frontmatter',
|
|
529
|
+
'docs.notConfigured': 'ドキュメントが設定されていません。',
|
|
530
|
+
'docs.sourceLabel': '{name} — Markdown ソース',
|
|
531
|
+
// ── artifact ───────────────────────────────────────────────────────────────
|
|
532
|
+
'artifact.title': 'Artifact',
|
|
533
|
+
'artifact.fit': 'フィット',
|
|
534
|
+
'artifact.deviceWidth': 'デバイス幅',
|
|
535
|
+
'artifact.view': 'Artifact 表示',
|
|
536
|
+
'artifact.makePng': 'PNG 生成',
|
|
537
|
+
'artifact.openRaw': '元ファイルを開く',
|
|
538
|
+
'artifact.png': 'png',
|
|
539
|
+
'artifact.noArtifact': 'artifact はまだありません — {artifact}。エージェントに作成を依頼してください。',
|
|
540
|
+
'artifact.thumbnail': 'artifact のサムネイル',
|
|
541
|
+
'artifact.noPng': 'PNG はまだありません。「PNG 生成」を使います(Playwright が必要)。',
|
|
542
|
+
'artifact.reload': 'Artifact を再読み込み',
|
|
543
|
+
'artifact.empty': 'Artifact はまだありません。',
|
|
544
|
+
'artifact.error': 'Artifact を描画できませんでした。',
|
|
545
|
+
'artifact.device.sp': 'スマートフォン',
|
|
546
|
+
'artifact.device.tablet': 'タブレット',
|
|
547
|
+
'artifact.device.pc': 'デスクトップ',
|
|
548
|
+
// ── session ────────────────────────────────────────────────────────────────
|
|
549
|
+
'session.title': 'セッション',
|
|
550
|
+
'session.unavailable': 'この room のセッション情報は opencode アダプタのときだけ表示します。',
|
|
551
|
+
'session.context': 'コンテキスト',
|
|
552
|
+
'session.contextUsed': '使用中のコンテキスト',
|
|
553
|
+
'session.contextHigh': '{pct}% — compact を検討(上限 {limit})',
|
|
554
|
+
'session.contextUnknown': 'コンテキスト: 計測できません(まだ実行がないか、上限が不明)',
|
|
555
|
+
'session.cost': '費用',
|
|
556
|
+
'session.tokensIn': 'トークン ↑',
|
|
557
|
+
'session.tokensOut': 'トークン ↓',
|
|
558
|
+
'session.reasoning': 'reasoning',
|
|
559
|
+
'session.cache': 'キャッシュ',
|
|
560
|
+
'session.state': '状態',
|
|
561
|
+
'session.model': 'model',
|
|
562
|
+
'session.workspace': 'workspace',
|
|
563
|
+
'session.skills': 'スキル',
|
|
564
|
+
'session.mcp': 'MCP',
|
|
565
|
+
// ── parts / status ─────────────────────────────────────────────────────────
|
|
566
|
+
'parts.changes': '変更',
|
|
567
|
+
'parts.output': '出力',
|
|
568
|
+
'parts.reasoning': 'reasoning',
|
|
569
|
+
'parts.filesOne': '{count} ファイル',
|
|
570
|
+
'parts.filesOther': '{count} ファイル',
|
|
571
|
+
'parts.truncated': '出力は切り詰められました',
|
|
572
|
+
'parts.exit': '終了コード {code}',
|
|
573
|
+
'status.running': '実行中',
|
|
574
|
+
'status.done': '完了',
|
|
575
|
+
'status.error': 'エラー',
|
|
576
|
+
// ── settings ───────────────────────────────────────────────────────────────
|
|
577
|
+
'settings.title': '設定',
|
|
578
|
+
'settings.agent': 'エージェント',
|
|
579
|
+
'settings.agentHint': 'modelroom は、あなたがすでに使っているエージェントを動かします。ここでの設定が modelroom からどこかへ送信されることはありません。',
|
|
580
|
+
'settings.adapter': 'アダプタ',
|
|
581
|
+
'settings.adapter.opencode': 'opencode — OpenCode CLI(セッション、モデル、エージェント)',
|
|
582
|
+
'settings.adapter.command': 'command — 任意の CLI。args に {prompt} と {session} を含めます',
|
|
583
|
+
'settings.command': 'コマンド',
|
|
584
|
+
'settings.agentName': 'エージェント名',
|
|
585
|
+
'settings.model': 'モデル',
|
|
586
|
+
'settings.modelDescription': '任意 — 既定値がないと失敗するエージェントが多いです',
|
|
587
|
+
'settings.standalone': 'このプロセスの環境を使って、エージェント自身のサーバーで実行する(opencode)',
|
|
588
|
+
'settings.config': '設定',
|
|
589
|
+
'settings.configHint': 'コミットされる既定値は {path} にあります。ここで保存した内容は {state}(git-ignore)にローカル保存されます。編集可能な room ファイル: {docs}。',
|
|
590
|
+
'settings.root': 'root {root}',
|
|
591
|
+
'settings.rooms': 'rooms {rooms}/',
|
|
592
|
+
'settings.artifact': 'artifact {artifact}',
|
|
593
|
+
'settings.language': '言語 {lang}',
|
|
594
|
+
'settings.adapterLine': 'agent {adapter}',
|
|
595
|
+
'settings.commandLine': 'command {command}',
|
|
596
|
+
'settings.agentLine': 'agent 名 {agent}',
|
|
597
|
+
'settings.modelLine': 'model {model}',
|
|
598
|
+
'settings.default': '既定',
|
|
599
|
+
'settings.thumbnails': 'サムネイル',
|
|
600
|
+
'settings.thumbnailsHint': 'room を PNG にするのは任意で、Playwright が必要です。なくても modelroom は動きます — サムネイルが出ないだけです。',
|
|
601
|
+
'settings.thumbnailsAlert': 'artifact を PNG にするには Playwright とブラウザが必要です: {command}。なくても modelroom は動きます — サムネイルが出ないだけです。',
|
|
602
|
+
'settings.saved': '保存しました {time}',
|
|
603
|
+
'settings.failed': '失敗: {error}',
|
|
604
|
+
'settings.couldNotReach': '失敗: サーバーに接続できません',
|
|
605
|
+
'settings.invalidLanguage': '不正な言語です',
|
|
606
|
+
// ── facet ──────────────────────────────────────────────────────────────────
|
|
607
|
+
'facet.any': 'すべて',
|
|
608
|
+
'facet.noMatch': '一致する値がありません',
|
|
609
|
+
'facet.clear': 'クリア',
|
|
610
|
+
'facet.more': '他 {count} 件',
|
|
611
|
+
'facet.searchValues': '{count} 件の値を検索',
|
|
612
|
+
'facet.searchOrPick': '検索または選択',
|
|
613
|
+
// ── workshop ───────────────────────────────────────────────────────────────
|
|
614
|
+
'kit.filter': 'フィルター — facet コントロール',
|
|
615
|
+
'kit.icons': 'アイコン',
|
|
616
|
+
'kit.segmented': 'SegmentedControl',
|
|
617
|
+
'kit.buttons': 'Button · Badge · ActionIcon · CopyButton · Loader',
|
|
618
|
+
'kit.panels': 'パネル',
|
|
619
|
+
'kit.markdown': 'Markdown',
|
|
620
|
+
'kit.markdownChat': 'Markdown — チャット',
|
|
621
|
+
'kit.markdownDoc': 'Markdown — ドキュメントプレビュー',
|
|
622
|
+
'kit.formControls': 'フォームコントロール',
|
|
623
|
+
'kit.card': 'カード / サーフェス',
|
|
624
|
+
'kit.split': 'Split(react-resizable-panels)',
|
|
625
|
+
'kit.divider': '区切り',
|
|
626
|
+
'kit.tags': 'タグ',
|
|
627
|
+
'kit.noRooms': 'room がまだありません',
|
|
628
|
+
'kit.noRoomsHint': 'room は1画面です: rooms/<name>/。',
|
|
629
|
+
'kit.filterHint': 'Mantine の部品そのまま: 候補が500以下なら MultiSelect / Select、それ以上なら Combobox + useVirtualizedCombobox。',
|
|
630
|
+
'kit.iconsHint': '名前の後ろに lucide-react — ツール自身のアイコン一式を、呼び出し側のサイズで描きます。',
|
|
631
|
+
'kit.segmentedHint': '編集 / 分割 / プレビュー、向き、レイアウトの切り替え。',
|
|
632
|
+
'kit.markdownHint': 'markdown-it は生の HTML を無効化。コードブロックにはコピーボタン、リズムは Mantine の Typography。',
|
|
633
|
+
'kit.docHint': 'frontmatter はここではなく、パネル側で分離されます。',
|
|
634
|
+
'kit.formHint': 'TextInput、Checkbox、Select、MultiSelect — 設定フォームと facet。',
|
|
635
|
+
'kit.cardHint': 'ダッシュボードの room カードと設定セクション。',
|
|
636
|
+
'kit.splitHint': 'Mantine に分割ペインはありません。room の列とドキュメントの分割はこの1つのライブラリを使います。',
|
|
637
|
+
};
|
|
638
|
+
export const CATALOGS = { en, ja };
|
|
639
|
+
/** The text for one key. Unknown keys fall back to English, then to the key. */
|
|
640
|
+
export function t(lang, key, params) {
|
|
641
|
+
const catalog = CATALOGS[lang] ?? en;
|
|
642
|
+
const template = catalog[key] ?? en[key] ?? key;
|
|
643
|
+
if (!params)
|
|
644
|
+
return template;
|
|
645
|
+
return template.replace(/\{(\w+)\}/g, (match, name) => Object.hasOwn(params, name) ? String(params[name]) : match);
|
|
646
|
+
}
|
|
647
|
+
/** The same, for values that may be a language string from the outside. */
|
|
648
|
+
export function text(lang, key, params) {
|
|
649
|
+
return t(lang === 'ja' ? 'ja' : 'en', key, params);
|
|
650
|
+
}
|
|
651
|
+
//# sourceMappingURL=i18n.js.map
|