viveworker 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/README.md +178 -0
- package/launchd/io.viveworker.app.plist.example +39 -0
- package/ntfy/docker-compose.yml.example +10 -0
- package/ntfy/server.yml.example +28 -0
- package/package.json +24 -0
- package/scripts/lib/markdown-render.mjs +274 -0
- package/scripts/lib/pairing.mjs +83 -0
- package/scripts/viveworker-bridge.mjs +8892 -0
- package/scripts/viveworker.mjs +1353 -0
- package/viveworker.env.example +99 -0
- package/web/app.css +2303 -0
- package/web/app.js +3867 -0
- package/web/i18n.js +937 -0
- package/web/icons/apple-touch-icon.png +0 -0
- package/web/icons/viveworker-beacon-v.svg +19 -0
- package/web/icons/viveworker-icon-1024.png +0 -0
- package/web/icons/viveworker-icon-192.png +0 -0
- package/web/icons/viveworker-icon-512.png +0 -0
- package/web/icons/viveworker-v-check.svg +19 -0
- package/web/icons/viveworker-v-pulse.svg +24 -0
- package/web/index.html +17 -0
- package/web/manifest.webmanifest +22 -0
- package/web/sw.js +153 -0
package/web/i18n.js
ADDED
|
@@ -0,0 +1,937 @@
|
|
|
1
|
+
export const DEFAULT_LOCALE = "en";
|
|
2
|
+
export const SUPPORTED_LOCALES = Object.freeze(["en", "ja"]);
|
|
3
|
+
|
|
4
|
+
const translations = {
|
|
5
|
+
en: {
|
|
6
|
+
"common.codex": "Codex",
|
|
7
|
+
"common.appName": "viveworker",
|
|
8
|
+
"common.back": "Back",
|
|
9
|
+
"common.next": "Next",
|
|
10
|
+
"common.detail": "Detail",
|
|
11
|
+
"common.review": "Review",
|
|
12
|
+
"common.select": "Choose",
|
|
13
|
+
"common.approve": "Approve",
|
|
14
|
+
"common.reject": "Reject",
|
|
15
|
+
"common.implement": "Implement",
|
|
16
|
+
"common.notNow": "Not now",
|
|
17
|
+
"common.enableNow": "Enable now",
|
|
18
|
+
"common.notificationSettings": "Notification settings",
|
|
19
|
+
"common.addToHomeScreen": "Add to Home Screen",
|
|
20
|
+
"common.gotIt": "Got it",
|
|
21
|
+
"common.logOut": "Log out",
|
|
22
|
+
"common.actionable": "Actionable",
|
|
23
|
+
"common.actionNeeded": "Action needed",
|
|
24
|
+
"common.completed": "Completed",
|
|
25
|
+
"common.clear": "Clear",
|
|
26
|
+
"common.cancel": "Cancel",
|
|
27
|
+
"common.loading": "Loading",
|
|
28
|
+
"common.unavailable": "unavailable",
|
|
29
|
+
"common.yes": "Yes",
|
|
30
|
+
"common.no": "No",
|
|
31
|
+
"common.none": "none",
|
|
32
|
+
"common.settings": "Settings",
|
|
33
|
+
"common.pending": "Pending",
|
|
34
|
+
"common.timeline": "Timeline",
|
|
35
|
+
"common.choice": "Choice",
|
|
36
|
+
"common.completion": "Completed",
|
|
37
|
+
"common.task": "Task",
|
|
38
|
+
"common.approval": "Approval",
|
|
39
|
+
"common.plan": "Plan",
|
|
40
|
+
"common.userMessage": "You",
|
|
41
|
+
"common.assistantCommentary": "Update",
|
|
42
|
+
"common.assistantFinal": "Final reply",
|
|
43
|
+
"common.item": "Item",
|
|
44
|
+
"common.untitledItem": "Untitled item",
|
|
45
|
+
"common.useDeviceLanguage": "Use device language",
|
|
46
|
+
"language.option.en": "English",
|
|
47
|
+
"language.option.ja": "日本語",
|
|
48
|
+
"language.source.override": "Manual override",
|
|
49
|
+
"language.source.device": "Device language",
|
|
50
|
+
"language.source.default": "Setup default",
|
|
51
|
+
"language.source.fallback": "Fallback",
|
|
52
|
+
"tab.pending.title": "Pending",
|
|
53
|
+
"tab.pending.label": "Pending",
|
|
54
|
+
"tab.pending.eyebrow": "Action queue",
|
|
55
|
+
"tab.pending.description": "Items that need attention right now.",
|
|
56
|
+
"tab.timeline.title": "Timeline",
|
|
57
|
+
"tab.timeline.label": "Timeline",
|
|
58
|
+
"tab.timeline.eyebrow": "Recent activity",
|
|
59
|
+
"tab.timeline.description": "Conversation updates and operational events across recent threads.",
|
|
60
|
+
"tab.completed.title": "Completed",
|
|
61
|
+
"tab.completed.label": "Completed",
|
|
62
|
+
"tab.completed.eyebrow": "History",
|
|
63
|
+
"tab.completed.description": "Recent finished items and results you can review.",
|
|
64
|
+
"tab.settings.title": "Settings",
|
|
65
|
+
"tab.settings.label": "Settings",
|
|
66
|
+
"tab.settings.eyebrow": "Device",
|
|
67
|
+
"tab.settings.description": "Pairing, installation, and notification controls.",
|
|
68
|
+
"pair.copy":
|
|
69
|
+
"Pair this iPhone with your local Codex desktop session and keep approvals, plans, choices, and completions within reach.",
|
|
70
|
+
"pair.codeLabel": "Pairing code",
|
|
71
|
+
"pair.codePlaceholder": "Enter the pairing code",
|
|
72
|
+
"pair.connect": "Connect this iPhone",
|
|
73
|
+
"pair.helperTitle": "Add to Home Screen",
|
|
74
|
+
"pair.helperCopy": "Install viveworker for the best mobile layout and Web Push support.",
|
|
75
|
+
"banner.install.title": "Add viveworker to your Home Screen",
|
|
76
|
+
"banner.install.copy.safari":
|
|
77
|
+
"Install it from Safari for a cleaner iPhone layout and background notifications.",
|
|
78
|
+
"banner.install.copy.other": "Open this page in Safari to install viveworker to your Home Screen.",
|
|
79
|
+
"banner.push.title": "Push notifications can help",
|
|
80
|
+
"banner.push.copy.https": "Open viveworker over HTTPS to turn on push notifications.",
|
|
81
|
+
"banner.push.copy.standalone": "Add viveworker to your Home Screen to receive push notifications on iPhone.",
|
|
82
|
+
"banner.push.copy.denied":
|
|
83
|
+
"Notifications are currently blocked for this app. You can re-enable them later from iPhone settings.",
|
|
84
|
+
"banner.push.copy.default":
|
|
85
|
+
"Enable push notifications to catch approvals, plans, questions, and completions even when the app is in the background.",
|
|
86
|
+
"install.guide.title": "Add to Home Screen",
|
|
87
|
+
"install.guide.intro.safari":
|
|
88
|
+
"iPhone does not let websites trigger this directly, but you can add viveworker in a few taps.",
|
|
89
|
+
"install.guide.intro.other": "On iPhone, Home Screen installation works best from Safari.",
|
|
90
|
+
"install.guide.step.openSafari": "Open this same URL in Safari.",
|
|
91
|
+
"install.guide.step.tapShare": "Tap the Share button.",
|
|
92
|
+
"install.guide.step.chooseAdd": "Choose Add to Home Screen.",
|
|
93
|
+
"install.guide.step.tapAdd": "Tap Add, then open the new icon.",
|
|
94
|
+
"shell.subtitle.settings": "Pairing, notifications, and installation for this iPhone.",
|
|
95
|
+
"shell.subtitle.detail": "Review the selected item and act without leaving your current flow.",
|
|
96
|
+
"empty.pending":
|
|
97
|
+
"Nothing needs attention right now. New approvals, plans, and choices will appear here first.",
|
|
98
|
+
"empty.timeline": "No timeline activity is available yet. New conversation updates will show up here.",
|
|
99
|
+
"empty.completed": "Completed history is empty for now.",
|
|
100
|
+
"empty.default": "Nothing to show right now.",
|
|
101
|
+
"detail.selectTitle": "Choose something from the list",
|
|
102
|
+
"detail.selectCopy": "Pending approvals, plans, choices, and completed results will appear here.",
|
|
103
|
+
"detail.loadingCopy": "Opening the detail view...",
|
|
104
|
+
"detail.approvalRequested": "Approval requested.",
|
|
105
|
+
"detail.planReady": "Plan is ready.",
|
|
106
|
+
"detail.previousMessage": "Previous message",
|
|
107
|
+
"detail.macOnlyChoice": "Please answer this type of input on the Mac.",
|
|
108
|
+
"detail.detailUnavailable": "Detail not available.",
|
|
109
|
+
"detail.pageProgress": ({ page, totalPages }) => `Page ${page} / ${totalPages}`,
|
|
110
|
+
"reply.eyebrow": "Reply",
|
|
111
|
+
"reply.title": "Send a follow-up",
|
|
112
|
+
"reply.copy": "Send a new message back into this Codex thread from the latest completed result.",
|
|
113
|
+
"reply.fieldLabel": "Message",
|
|
114
|
+
"reply.placeholder": "Ask Codex to continue, refine the result, or try a different approach.",
|
|
115
|
+
"reply.send": "Send to Codex",
|
|
116
|
+
"reply.sendConfirm": "Send anyway",
|
|
117
|
+
"reply.sendAnother": "Send another message",
|
|
118
|
+
"reply.sendSending": "Sending...",
|
|
119
|
+
"reply.mode.groupLabel": "Reply mode",
|
|
120
|
+
"reply.mode.defaultLabel": "Default",
|
|
121
|
+
"reply.mode.planLabel": "Plan",
|
|
122
|
+
"reply.mode.on": "On",
|
|
123
|
+
"reply.mode.off": "Off",
|
|
124
|
+
"reply.mode.defaultHint": "Send a normal follow-up message.",
|
|
125
|
+
"reply.mode.planHint": "Start the next turn in Plan mode.",
|
|
126
|
+
"reply.notice.sentDefault": "Your message was sent to Codex.",
|
|
127
|
+
"reply.notice.sentPlan": "Your message was sent to Codex in Plan mode.",
|
|
128
|
+
"reply.sentPreviewLabel": "Sent message",
|
|
129
|
+
"reply.warning.title": "This thread already has newer messages.",
|
|
130
|
+
"reply.warning.copy": "Review the latest thread activity first, or send this message anyway if you still want to continue from here.",
|
|
131
|
+
"choice.questionFallback": "Choose an option.",
|
|
132
|
+
"choice.questionHeading": ({ index }) => `Question ${index}`,
|
|
133
|
+
"choice.ready": "Choice input is ready.",
|
|
134
|
+
"choice.needInput": "A choice input is required.",
|
|
135
|
+
"choice.oneQuestion": "1 question is included.",
|
|
136
|
+
"choice.multiQuestion": ({ count }) => `${count} questions are included.`,
|
|
137
|
+
"choice.macOnly": "Please answer this type of input on the Mac.",
|
|
138
|
+
"choice.submitHelp": "Choose one answer for each question, then submit them together.",
|
|
139
|
+
"choice.submit": "Submit Answers",
|
|
140
|
+
"summary.completed": "Read the finished result and any final notes.",
|
|
141
|
+
"summary.userMessage": "Open the message again and read it in context.",
|
|
142
|
+
"summary.assistantCommentary": "Read Codex's latest working update.",
|
|
143
|
+
"summary.assistantFinal": "Read Codex's final reply for this turn.",
|
|
144
|
+
"summary.approval": "Review what Codex wants to do and decide whether to allow it.",
|
|
145
|
+
"summary.plan": "Check the proposed plan before Codex starts implementing it.",
|
|
146
|
+
"summary.choice": "Pick the option Codex needs to continue.",
|
|
147
|
+
"summary.default": "Open the item to review its details.",
|
|
148
|
+
"intent.approval": "Approve or reject this request.",
|
|
149
|
+
"intent.plan": "Review this plan before Codex continues.",
|
|
150
|
+
"intent.choice": "Choose an answer so Codex can continue.",
|
|
151
|
+
"intent.completed": "Finished. Open to review the result.",
|
|
152
|
+
"intent.userMessage": "Open this message again.",
|
|
153
|
+
"intent.assistantCommentary": "Read the latest working update.",
|
|
154
|
+
"intent.assistantFinal": "Read Codex's final reply for this turn.",
|
|
155
|
+
"timeline.allThreads": "All",
|
|
156
|
+
"timeline.unknownThread": "Unknown thread",
|
|
157
|
+
"timeline.filterLabel": "Thread filter",
|
|
158
|
+
"settings.intro": "Check pairing, language, install status, and Web Push health for this iPhone.",
|
|
159
|
+
"settings.section.overview": "Quick setup",
|
|
160
|
+
"settings.section.notifications": "Notifications",
|
|
161
|
+
"settings.section.install": "Install",
|
|
162
|
+
"settings.section.device": "This iPhone",
|
|
163
|
+
"settings.group.general": "General",
|
|
164
|
+
"settings.group.device": "This iPhone",
|
|
165
|
+
"settings.group.values": "Current settings",
|
|
166
|
+
"settings.group.advanced": "Advanced",
|
|
167
|
+
"settings.group.actions": "Actions",
|
|
168
|
+
"settings.overview.title": "At a glance",
|
|
169
|
+
"settings.overview.copy": "See what is ready, what still needs setup, and what to do next on this iPhone.",
|
|
170
|
+
"settings.summary.notifications": "Notifications",
|
|
171
|
+
"settings.summary.install": "Home Screen",
|
|
172
|
+
"settings.summary.pairing": "Pairing",
|
|
173
|
+
"settings.nextStep.eyebrow": "Next step",
|
|
174
|
+
"settings.nextStep.enableNotifications.title": "Turn on notifications",
|
|
175
|
+
"settings.nextStep.enableNotifications.copy": "Enable Web Push on this iPhone so approvals, plans, and questions can reach you in the background.",
|
|
176
|
+
"settings.nextStep.serverDisabled.title": "Server setup is still missing",
|
|
177
|
+
"settings.nextStep.serverDisabled.copy": "Web Push is not enabled on this viveworker server yet, so this iPhone cannot subscribe yet.",
|
|
178
|
+
"settings.nextStep.openHttps.title": "Open the HTTPS version",
|
|
179
|
+
"settings.nextStep.openHttps.copy": "This page must be opened over HTTPS before iPhone can enable notifications.",
|
|
180
|
+
"settings.nextStep.install.title": "Add viveworker to Home Screen",
|
|
181
|
+
"settings.nextStep.install.copy": "Install the app from Safari, then reopen it from the Home Screen before enabling notifications.",
|
|
182
|
+
"settings.nextStep.permissionBlocked.title": "Notifications are blocked",
|
|
183
|
+
"settings.nextStep.permissionBlocked.copy": "Re-enable notifications in iPhone settings, then return here to test again.",
|
|
184
|
+
"settings.nextStep.test.title": "Everything is ready",
|
|
185
|
+
"settings.nextStep.test.copy": "Send a test notification to confirm this iPhone can receive pushes from viveworker.",
|
|
186
|
+
"settings.status.notAvailable": "Not available",
|
|
187
|
+
"settings.status.unsupported": "Not supported",
|
|
188
|
+
"settings.status.needsHttps": "Needs HTTPS",
|
|
189
|
+
"settings.status.needsHomeScreen": "Needs Home Screen",
|
|
190
|
+
"settings.status.blocked": "Blocked",
|
|
191
|
+
"settings.status.ready": "Ready",
|
|
192
|
+
"settings.status.actionNeeded": "Action needed",
|
|
193
|
+
"settings.status.installed": "Installed",
|
|
194
|
+
"settings.status.notInstalled": "Not installed",
|
|
195
|
+
"settings.status.connected": "Connected",
|
|
196
|
+
"settings.status.info": "Info",
|
|
197
|
+
"settings.notifications.title": "Notifications",
|
|
198
|
+
"settings.notifications.copy":
|
|
199
|
+
"Keep approvals, plans, questions, and completions within reach even when viveworker is in the background.",
|
|
200
|
+
"settings.notifications.serverDisabled": "Web Push is not enabled on the server yet.",
|
|
201
|
+
"settings.notifications.openHttps": "Open viveworker over HTTPS before enabling notifications.",
|
|
202
|
+
"settings.notifications.openHomeScreen":
|
|
203
|
+
"Open the Home Screen app before enabling notifications on iPhone.",
|
|
204
|
+
"settings.action.enableNotifications": "Enable Notifications",
|
|
205
|
+
"settings.action.disableNotifications": "Disable Notifications",
|
|
206
|
+
"settings.action.sendTest": "Send Test Notification",
|
|
207
|
+
"settings.action.reviewTechnical": "Review technical details",
|
|
208
|
+
"settings.action.revokeDevice": "Revoke",
|
|
209
|
+
"settings.action.removeThisDevice": "Remove this device",
|
|
210
|
+
"settings.install.title": "Install to Home Screen",
|
|
211
|
+
"settings.install.copy":
|
|
212
|
+
"For the best iPhone experience, install viveworker from Safari and open the Home Screen app.",
|
|
213
|
+
"settings.device.title": "Devices",
|
|
214
|
+
"settings.device.copy": "Manage trusted iPhones and browsers that can open this LAN viveworker app.",
|
|
215
|
+
"settings.device.count": ({ count }) => `${count} ${count === 1 ? "device" : "devices"}`,
|
|
216
|
+
"settings.device.section.current": "This device",
|
|
217
|
+
"settings.device.section.other": "Other trusted devices",
|
|
218
|
+
"settings.device.thisDevice": "This device",
|
|
219
|
+
"settings.device.emptyCurrent": "This device is not listed right now.",
|
|
220
|
+
"settings.device.emptyOther": "No other trusted devices are active.",
|
|
221
|
+
"settings.device.addAnother.title": "Add another device",
|
|
222
|
+
"settings.device.addAnother.heading": "Add a new iPhone or browser",
|
|
223
|
+
"settings.device.addAnother.copy":
|
|
224
|
+
"Run this on your Mac only when you want to add another trusted device. Your main app URL stays the same.",
|
|
225
|
+
"settings.device.addAnother.commandLabel": "Run on your Mac",
|
|
226
|
+
"settings.device.fallbackName": "Trusted device",
|
|
227
|
+
"settings.device.platform.iphone": "iPhone",
|
|
228
|
+
"settings.device.platform.ipad": "iPad",
|
|
229
|
+
"settings.device.platform.android": "Android device",
|
|
230
|
+
"settings.device.platform.mac": "Mac",
|
|
231
|
+
"settings.device.platform.browser": "Browser",
|
|
232
|
+
"settings.device.mode.standalone": "Home Screen app",
|
|
233
|
+
"settings.device.mode.browser": "Browser tab",
|
|
234
|
+
"settings.language.title": "Language",
|
|
235
|
+
"settings.language.copy": "Choose how this iPhone should display viveworker.",
|
|
236
|
+
"settings.pairing.title": "Pairing",
|
|
237
|
+
"settings.pairing.copy": "This iPhone is paired with your local Codex desktop session.",
|
|
238
|
+
"settings.pairing.connected": "Paired",
|
|
239
|
+
"settings.technical.title": "Technical details",
|
|
240
|
+
"settings.technical.copy": "Connection and notification diagnostics for this iPhone.",
|
|
241
|
+
"settings.technical.copyShort": "Connection and notification diagnostics.",
|
|
242
|
+
"settings.row.deviceId": "Device ID",
|
|
243
|
+
"settings.row.pairedAt": "Paired",
|
|
244
|
+
"settings.row.lastUsed": "Last used",
|
|
245
|
+
"settings.row.trustedUntil": "Trusted until",
|
|
246
|
+
"settings.row.status": "Status",
|
|
247
|
+
"settings.row.pairingStatus": "Pairing status",
|
|
248
|
+
"settings.row.serverWebPush": "Server Web Push",
|
|
249
|
+
"settings.row.secureContext": "Secure context",
|
|
250
|
+
"settings.row.homeScreenApp": "Home Screen app",
|
|
251
|
+
"settings.row.notificationPermission": "Notification permission",
|
|
252
|
+
"settings.row.browserSupport": "Browser support",
|
|
253
|
+
"settings.row.pushStatus": "Push notifications",
|
|
254
|
+
"settings.row.currentDeviceSubscribed": "This device subscribed",
|
|
255
|
+
"settings.row.lastSuccessfulDelivery": "Last successful delivery",
|
|
256
|
+
"settings.row.version": "Version",
|
|
257
|
+
"settings.row.currentLanguage": "Current language",
|
|
258
|
+
"settings.row.languageSource": "Language source",
|
|
259
|
+
"settings.row.defaultLanguage": "Setup default",
|
|
260
|
+
"notice.notificationsEnabled": "Notifications are enabled on this device.",
|
|
261
|
+
"notice.notificationsDisabled": "Notifications are disabled on this device.",
|
|
262
|
+
"notice.testNotificationSent": "Test notification sent.",
|
|
263
|
+
"notice.deviceRevoked": "Device removed.",
|
|
264
|
+
"notice.loggedOutKeepTrusted": "Logged out. This device stays trusted, so you can come back without pairing again.",
|
|
265
|
+
"notice.loggedOutDeviceRemoved": "Logged out and removed this device. Pair again before using viveworker here.",
|
|
266
|
+
"error.networkHint":
|
|
267
|
+
"Try reopening the latest HTTPS URL in Safari, then re-add the Home Screen app if needed.",
|
|
268
|
+
"error.webPushDisabled": "Web Push is not enabled on the server.",
|
|
269
|
+
"error.notificationsRequireHttps": "Notifications require HTTPS.",
|
|
270
|
+
"error.pushUnsupported": "This browser does not support Web Push.",
|
|
271
|
+
"error.openHomeScreen": "On iPhone, open viveworker from the Home Screen before enabling notifications.",
|
|
272
|
+
"error.notificationPermission": ({ status }) => `Notification permission is ${status}.`,
|
|
273
|
+
"error.pushServerNotReady": "The server is not ready for Web Push.",
|
|
274
|
+
"error.serviceWorkerUnavailable": "Service Worker is not available.",
|
|
275
|
+
"error.pairingUnavailable": "Pairing is not available right now.",
|
|
276
|
+
"error.invalidPairingCredentials": "The pairing code or pairing link is invalid.",
|
|
277
|
+
"error.pairingRateLimited": "Too many pairing attempts. Please wait a bit and try again.",
|
|
278
|
+
"error.authenticationRequired": "Authentication is required.",
|
|
279
|
+
"error.originNotAllowed": "This request was blocked because it did not come from a trusted viveworker origin.",
|
|
280
|
+
"error.deviceNotFound": "That device is no longer available.",
|
|
281
|
+
"error.pushSubscriptionExpired": "This notification subscription expired. Please enable notifications again.",
|
|
282
|
+
"error.itemNotFound": "That item is no longer available.",
|
|
283
|
+
"error.completionReplyUnavailable": "This completed item can no longer send a follow-up.",
|
|
284
|
+
"error.completionReplyThreadAdvanced": "This thread already has newer messages.",
|
|
285
|
+
"error.completionReplyEmpty": "Enter a message before sending it.",
|
|
286
|
+
"error.codexIpcNotConnected": "Codex desktop is not connected right now.",
|
|
287
|
+
"error.approvalNotFound": "This approval is no longer available.",
|
|
288
|
+
"error.approvalAlreadyHandled": "This approval was already handled.",
|
|
289
|
+
"error.planRequestNotFound": "This plan request is no longer available.",
|
|
290
|
+
"error.planRequestAlreadyHandled": "This plan request was already handled.",
|
|
291
|
+
"error.choiceInputNotFound": "This choice request is no longer available.",
|
|
292
|
+
"error.choiceInputReadOnly": "Please answer this type of input on the Mac.",
|
|
293
|
+
"error.choiceInputAlreadyHandled": "This choice request was already handled.",
|
|
294
|
+
"error.mkcertRootCaNotFound": "The mkcert root CA file could not be found.",
|
|
295
|
+
"server.fallback.codexTask": "Codex task",
|
|
296
|
+
"server.title.approval": "Approval",
|
|
297
|
+
"server.title.complete": "Completed",
|
|
298
|
+
"server.title.plan": "Plan",
|
|
299
|
+
"server.title.planReady": "Plan details",
|
|
300
|
+
"server.title.choice": "Choice",
|
|
301
|
+
"server.title.choiceReadOnly": "Input on Mac",
|
|
302
|
+
"server.title.userMessage": "User",
|
|
303
|
+
"server.title.assistantCommentary": "Update",
|
|
304
|
+
"server.title.assistantFinal": "Final reply",
|
|
305
|
+
"server.action.review": "Review",
|
|
306
|
+
"server.action.detail": "Detail",
|
|
307
|
+
"server.action.select": "Choose",
|
|
308
|
+
"server.action.approve": "Approve",
|
|
309
|
+
"server.action.reject": "Reject",
|
|
310
|
+
"server.action.implement": "Implement",
|
|
311
|
+
"server.message.commandApprovalNeeded": "Command approval needed.",
|
|
312
|
+
"server.message.fileApprovalNeeded": "File changes need approval.",
|
|
313
|
+
"server.message.commandPrefix": ({ command }) => `Command: ${command}`,
|
|
314
|
+
"server.message.pathPrefix": ({ path }) => `Path: ${path}`,
|
|
315
|
+
"server.message.approveOnMac": "Approve on Mac only: this iPhone alert mirrors codex.app.",
|
|
316
|
+
"server.message.approvalNeededInCodex": "Approval needed in Codex.",
|
|
317
|
+
"server.message.extraApprovals": ({ count }) => `Extra approvals: ${count}`,
|
|
318
|
+
"server.message.taskFinished": "Task finished.",
|
|
319
|
+
"server.message.planReady": "Plan is ready.",
|
|
320
|
+
"server.message.choiceSubmitted": "The selected answers were sent to Codex.",
|
|
321
|
+
"server.message.choiceSubmittedTest": "The test answers were received.",
|
|
322
|
+
"server.message.choiceSummarySubmitted": "Selected answers sent.",
|
|
323
|
+
"server.message.choiceSummaryReceivedTest": "Test answers received.",
|
|
324
|
+
"server.message.approvalAccepted": "Approved. Codex will continue.",
|
|
325
|
+
"server.message.approvalRejected": "Rejected. Codex was told not to continue this action.",
|
|
326
|
+
"server.message.planImplemented": "Codex was asked to start implementing from this plan.",
|
|
327
|
+
"server.message.planDismissed": "This plan prompt was closed and future reminders were suppressed.",
|
|
328
|
+
"server.confirm.planImplement": "Implementation will start from this plan.",
|
|
329
|
+
"server.confirm.approve": "This approval will be confirmed and Codex will continue.",
|
|
330
|
+
"server.confirm.reject": "This action will be rejected and Codex will be told not to continue.",
|
|
331
|
+
"server.pushTest.title": "viveworker test notification",
|
|
332
|
+
"server.pushTest.body": "Notifications are working on this iPhone.",
|
|
333
|
+
"server.page.notFoundTitle": "Not found",
|
|
334
|
+
"server.page.notFoundBody": "This approval link does not exist.",
|
|
335
|
+
"server.page.notFoundHint": "You can close this page safely.",
|
|
336
|
+
"server.page.approvalExpired": "Approval expired",
|
|
337
|
+
"server.page.choiceExpired": "Choice input expired",
|
|
338
|
+
"server.page.detailExpired": "Detail expired",
|
|
339
|
+
"server.page.approvalMissing": "Approval token not found",
|
|
340
|
+
"server.page.choiceMissing": "Choice input token not found",
|
|
341
|
+
"server.page.approvalHandled": "Approval already handled",
|
|
342
|
+
"server.page.detailMissing": "Completion detail not found",
|
|
343
|
+
"cli.help.usage": "Usage: viveworker <setup|start|stop|status|doctor> [options]",
|
|
344
|
+
"cli.help.commands": "Commands:",
|
|
345
|
+
"cli.help.setup": "setup Create config, generate pairing info, register launchd, start the bridge",
|
|
346
|
+
"cli.help.start": "start Start the bridge using the saved config",
|
|
347
|
+
"cli.help.stop": "stop Stop the bridge",
|
|
348
|
+
"cli.help.status": "status Print launchd/background status and health",
|
|
349
|
+
"cli.help.doctor": "doctor Diagnose the local setup",
|
|
350
|
+
"cli.help.commonOptions": "Common options:",
|
|
351
|
+
"cli.setup.complete": "viveworker setup complete",
|
|
352
|
+
"cli.setup.progress.prepare": "Preparing local viveworker setup...",
|
|
353
|
+
"cli.setup.progress.installCa": "Installing or refreshing the local CA ({stores})...",
|
|
354
|
+
"cli.setup.progress.installMkcert": "Installing mkcert with Homebrew...",
|
|
355
|
+
"cli.setup.progress.generateCert": "Generating local HTTPS certificate...",
|
|
356
|
+
"cli.setup.progress.generateVapid": "Generating Web Push keys...",
|
|
357
|
+
"cli.setup.progress.writeConfig": "Writing config files...",
|
|
358
|
+
"cli.setup.progress.launchd": "Registering and starting the launchd service...",
|
|
359
|
+
"cli.setup.progress.startBridge": "Starting the local bridge...",
|
|
360
|
+
"cli.setup.progress.health": "Waiting for viveworker to respond...",
|
|
361
|
+
"cli.setup.primaryUrl": "Primary URL (.local): {url}",
|
|
362
|
+
"cli.setup.fallbackUrl": "Fallback URL (IP): {url}",
|
|
363
|
+
"cli.setup.pairingCode": "Pairing code: {code}",
|
|
364
|
+
"cli.setup.pairingUrlLocal": "Pairing URL (.local): {url}",
|
|
365
|
+
"cli.setup.pairingUrlIp": "Pairing URL (IP): {url}",
|
|
366
|
+
"cli.setup.pairRefresh.title": "Add another device",
|
|
367
|
+
"cli.setup.pairRefresh.copy":
|
|
368
|
+
"Existing app URLs stay the same. Use the fresh pairing code or URL below only when you want to add another trusted device.",
|
|
369
|
+
"cli.setup.pairRefresh.reminder": "This pairing information is short-lived and one-time.",
|
|
370
|
+
"cli.setup.caDownloadLocal": "CA download (.local): {url}",
|
|
371
|
+
"cli.setup.caDownloadIp": "CA download (IP): {url}",
|
|
372
|
+
"cli.setup.webPushEnabled": "Web Push: enabled (HTTPS)",
|
|
373
|
+
"cli.setup.webPushDisabled": "Web Push: disabled",
|
|
374
|
+
"cli.setup.completePending": "viveworker setup finished, but health has not responded yet.",
|
|
375
|
+
"cli.setup.caFlow.title": "Before opening viveworker on iPhone, install and trust the local root certificate:",
|
|
376
|
+
"cli.setup.caFlow.step1": "1. Open the CA download URL or scan the QR code below on your iPhone.",
|
|
377
|
+
"cli.setup.caFlow.step2": "2. Install the rootCA.pem profile, then enable trust for it in iPhone certificate trust settings.",
|
|
378
|
+
"cli.setup.caFlow.step3": "3. After that, press Enter here to show the viveworker app URL and pairing QR.",
|
|
379
|
+
"cli.setup.instructions.https":
|
|
380
|
+
"Open the HTTPS URL in Safari, trust your local CA on iPhone, then add the app to the Home Screen to enable notifications.",
|
|
381
|
+
"cli.setup.instructions.afterCa":
|
|
382
|
+
"Now open the pairing URL in Safari on your iPhone, pair it if needed, then add viveworker to the Home Screen.",
|
|
383
|
+
"cli.setup.instructions.insecureHttpLan":
|
|
384
|
+
"Open the HTTP URL in Safari only if you intentionally allowed insecure LAN access. This mode is not recommended on shared Wi-Fi.",
|
|
385
|
+
"cli.setup.instructions.localOnlyHttp":
|
|
386
|
+
"This setup is loopback-only HTTP for local development. Use the default HTTPS setup or --allow-insecure-http-lan if you explicitly need LAN access.",
|
|
387
|
+
"logout.confirm.title": "Choose how to log out",
|
|
388
|
+
"logout.confirm.copy": "You can end just this session, or remove trust for this device so pairing is required next time.",
|
|
389
|
+
"logout.confirm.keepTrustedTitle": "Log out only",
|
|
390
|
+
"logout.confirm.keepTrustedCopy": "End this session now, but keep this device trusted for the next time you open viveworker.",
|
|
391
|
+
"logout.confirm.removeTitle": "Log out and remove this device",
|
|
392
|
+
"logout.confirm.removeCopy": "End this session, remove this device from trusted devices, and delete its push subscription.",
|
|
393
|
+
"logout.action.keepTrusted": "Log out",
|
|
394
|
+
"logout.action.removeDevice": "Log out and remove this device",
|
|
395
|
+
"cli.setup.warning.insecureHttpLan":
|
|
396
|
+
"Warning: insecure LAN HTTP is enabled. Session and device cookies can be exposed on the local network.",
|
|
397
|
+
"cli.setup.qrPairing": "Pairing QR:",
|
|
398
|
+
"cli.setup.qrCaDownload": "rootCA.pem download QR (IP):",
|
|
399
|
+
"cli.setup.prompt.continueToApp": "Press Enter to continue to the viveworker app URL.",
|
|
400
|
+
"cli.start.progress.prepare": "Loading saved viveworker config...",
|
|
401
|
+
"cli.start.progress.refreshPairing": "Refreshing expired pairing credentials...",
|
|
402
|
+
"cli.start.progress.launchd": "Starting the launchd service...",
|
|
403
|
+
"cli.start.progress.kickstart": "Reloading the viveworker launch agent...",
|
|
404
|
+
"cli.start.progress.bridge": "Starting the local bridge...",
|
|
405
|
+
"cli.start.progress.health": "Waiting for viveworker to respond...",
|
|
406
|
+
"cli.start.launchdStarted": "viveworker launchd service started.",
|
|
407
|
+
"cli.start.launchdStartedPending": "viveworker launchd service started, but health has not responded yet.",
|
|
408
|
+
"cli.start.bridgeStarted": "viveworker bridge started in background.",
|
|
409
|
+
"cli.start.bridgeStartedPending": "viveworker bridge started in background, but health has not responded yet.",
|
|
410
|
+
"cli.stop.launchdStopped": "viveworker launchd service stopped.",
|
|
411
|
+
"cli.stop.noProcess": "No background viveworker process found.",
|
|
412
|
+
"cli.stop.stopped": "Stopped background viveworker process {pid}.",
|
|
413
|
+
"cli.status.envFile": "Env file: {value}",
|
|
414
|
+
"cli.status.baseUrl": "Base URL: {value}",
|
|
415
|
+
"cli.status.webPush": "Web Push: {value}",
|
|
416
|
+
"cli.status.https": "HTTPS: {value}",
|
|
417
|
+
"cli.status.tlsCert": "TLS cert: {value}",
|
|
418
|
+
"cli.status.tlsKey": "TLS key: {value}",
|
|
419
|
+
"cli.status.launchAgent": "LaunchAgent: {value}",
|
|
420
|
+
"cli.status.launchd": "launchd: {value}",
|
|
421
|
+
"cli.status.pid": "pid: {value}",
|
|
422
|
+
"cli.status.health": "health: {value}",
|
|
423
|
+
"cli.status.enabled": "enabled",
|
|
424
|
+
"cli.status.disabled": "disabled",
|
|
425
|
+
"cli.status.installed": "installed",
|
|
426
|
+
"cli.status.notRunning": "not running",
|
|
427
|
+
"cli.status.ok": "ok",
|
|
428
|
+
"cli.status.failed": "failed",
|
|
429
|
+
"cli.doctor.ok": "viveworker doctor: ok",
|
|
430
|
+
"cli.doctor.foundIssues": "viveworker doctor found issues:",
|
|
431
|
+
"cli.doctor.issue.envMissing": "env file is missing",
|
|
432
|
+
"cli.doctor.issue.sessionSecretMissing": "SESSION_SECRET is missing",
|
|
433
|
+
"cli.doctor.issue.pairingMissing": "pairing credentials are missing",
|
|
434
|
+
"cli.doctor.issue.baseUrlMissing": "NATIVE_APPROVAL_SERVER_PUBLIC_BASE_URL is missing",
|
|
435
|
+
"cli.doctor.issue.lanHttpRequiresOverride": "LAN HTTP requires ALLOW_INSECURE_LAN_HTTP=1 or an HTTPS base URL",
|
|
436
|
+
"cli.doctor.issue.webPushHttps": "Web Push requires an HTTPS base URL",
|
|
437
|
+
"cli.doctor.issue.tlsCertMissing": "TLS_CERT_FILE is missing or unreadable",
|
|
438
|
+
"cli.doctor.issue.tlsKeyMissing": "TLS_KEY_FILE is missing or unreadable",
|
|
439
|
+
"cli.doctor.issue.vapidPublicMissing": "WEB_PUSH_VAPID_PUBLIC_KEY is missing",
|
|
440
|
+
"cli.doctor.issue.vapidPrivateMissing": "WEB_PUSH_VAPID_PRIVATE_KEY is missing",
|
|
441
|
+
"cli.doctor.issue.healthHttps": "health endpoint is not reachable over HTTPS",
|
|
442
|
+
"cli.doctor.issue.health": "health endpoint is not reachable",
|
|
443
|
+
},
|
|
444
|
+
ja: {
|
|
445
|
+
"common.codex": "Codex",
|
|
446
|
+
"common.appName": "viveworker",
|
|
447
|
+
"common.back": "戻る",
|
|
448
|
+
"common.next": "次へ",
|
|
449
|
+
"common.detail": "詳細",
|
|
450
|
+
"common.review": "判断する",
|
|
451
|
+
"common.select": "選ぶ",
|
|
452
|
+
"common.approve": "承認",
|
|
453
|
+
"common.reject": "拒否",
|
|
454
|
+
"common.implement": "実装する",
|
|
455
|
+
"common.notNow": "今はしない",
|
|
456
|
+
"common.enableNow": "今すぐ有効化",
|
|
457
|
+
"common.notificationSettings": "通知設定",
|
|
458
|
+
"common.addToHomeScreen": "ホーム画面に追加",
|
|
459
|
+
"common.gotIt": "わかりました",
|
|
460
|
+
"common.logOut": "ログアウト",
|
|
461
|
+
"common.actionable": "対応が必要",
|
|
462
|
+
"common.actionNeeded": "対応が必要",
|
|
463
|
+
"common.completed": "完了",
|
|
464
|
+
"common.clear": "クリア",
|
|
465
|
+
"common.cancel": "キャンセル",
|
|
466
|
+
"common.loading": "読み込み中",
|
|
467
|
+
"common.unavailable": "利用不可",
|
|
468
|
+
"common.yes": "はい",
|
|
469
|
+
"common.no": "いいえ",
|
|
470
|
+
"common.none": "なし",
|
|
471
|
+
"common.settings": "設定",
|
|
472
|
+
"common.pending": "未対応",
|
|
473
|
+
"common.timeline": "タイムライン",
|
|
474
|
+
"common.choice": "選択",
|
|
475
|
+
"common.completion": "完了",
|
|
476
|
+
"common.task": "タスク",
|
|
477
|
+
"common.approval": "承認",
|
|
478
|
+
"common.plan": "プラン",
|
|
479
|
+
"common.userMessage": "あなた",
|
|
480
|
+
"common.assistantCommentary": "途中経過",
|
|
481
|
+
"common.assistantFinal": "最終回答",
|
|
482
|
+
"common.item": "項目",
|
|
483
|
+
"common.untitledItem": "無題の項目",
|
|
484
|
+
"common.useDeviceLanguage": "端末の言語を使う",
|
|
485
|
+
"language.option.en": "English",
|
|
486
|
+
"language.option.ja": "日本語",
|
|
487
|
+
"language.source.override": "手動設定",
|
|
488
|
+
"language.source.device": "端末の言語",
|
|
489
|
+
"language.source.default": "setup 時の既定値",
|
|
490
|
+
"language.source.fallback": "フォールバック",
|
|
491
|
+
"tab.pending.title": "未対応",
|
|
492
|
+
"tab.pending.label": "未対応",
|
|
493
|
+
"tab.pending.eyebrow": "対応待ち",
|
|
494
|
+
"tab.pending.description": "いま対応が必要な項目です。",
|
|
495
|
+
"tab.timeline.title": "タイムライン",
|
|
496
|
+
"tab.timeline.label": "タイムライン",
|
|
497
|
+
"tab.timeline.eyebrow": "最近の動き",
|
|
498
|
+
"tab.timeline.description": "最近のスレッドにまたがる会話の更新と操作イベントです。",
|
|
499
|
+
"tab.completed.title": "完了",
|
|
500
|
+
"tab.completed.label": "完了",
|
|
501
|
+
"tab.completed.eyebrow": "履歴",
|
|
502
|
+
"tab.completed.description": "最近完了した項目と確認できる結果です。",
|
|
503
|
+
"tab.settings.title": "設定",
|
|
504
|
+
"tab.settings.label": "設定",
|
|
505
|
+
"tab.settings.eyebrow": "端末",
|
|
506
|
+
"tab.settings.description": "ペアリング、インストール、通知の設定です。",
|
|
507
|
+
"pair.copy":
|
|
508
|
+
"この iPhone をローカルの Codex desktop session とペアリングして、承認、プラン、選択、完了をすぐ確認できるようにします。",
|
|
509
|
+
"pair.codeLabel": "ペアリングコード",
|
|
510
|
+
"pair.codePlaceholder": "ペアリングコードを入力",
|
|
511
|
+
"pair.connect": "この iPhone を接続",
|
|
512
|
+
"pair.helperTitle": "ホーム画面に追加",
|
|
513
|
+
"pair.helperCopy": "モバイル表示と Web Push を最適に使うには viveworker をインストールしてください。",
|
|
514
|
+
"banner.install.title": "viveworker をホーム画面に追加",
|
|
515
|
+
"banner.install.copy.safari":
|
|
516
|
+
"Safari からインストールすると、iPhone 向け表示とバックグラウンド通知が使いやすくなります。",
|
|
517
|
+
"banner.install.copy.other": "Safari でこのページを開いて、viveworker をホーム画面に追加してください。",
|
|
518
|
+
"banner.push.title": "プッシュ通知を有効にすると便利です",
|
|
519
|
+
"banner.push.copy.https": "プッシュ通知を使うには HTTPS の viveworker を開いてください。",
|
|
520
|
+
"banner.push.copy.standalone": "iPhone でプッシュ通知を受けるには、viveworker をホーム画面に追加してください。",
|
|
521
|
+
"banner.push.copy.denied":
|
|
522
|
+
"このアプリの通知は現在ブロックされています。あとで iPhone の設定から再度有効にできます。",
|
|
523
|
+
"banner.push.copy.default":
|
|
524
|
+
"バックグラウンドでも承認、プラン、質問、完了に気づけるよう、プッシュ通知を有効にしてください。",
|
|
525
|
+
"install.guide.title": "ホーム画面に追加",
|
|
526
|
+
"install.guide.intro.safari":
|
|
527
|
+
"iPhone ではサイト側から直接追加できませんが、数タップでホーム画面に追加できます。",
|
|
528
|
+
"install.guide.intro.other": "iPhone では Safari からホーム画面に追加するのが最適です。",
|
|
529
|
+
"install.guide.step.openSafari": "この URL を Safari で開きます。",
|
|
530
|
+
"install.guide.step.tapShare": "共有ボタンをタップします。",
|
|
531
|
+
"install.guide.step.chooseAdd": "「ホーム画面に追加」を選びます。",
|
|
532
|
+
"install.guide.step.tapAdd": "「追加」を押して、新しいアイコンを開きます。",
|
|
533
|
+
"shell.subtitle.settings": "この iPhone のペアリング、通知、インストール設定です。",
|
|
534
|
+
"shell.subtitle.detail": "いまの流れを途切れさせずに、項目を確認して操作できます。",
|
|
535
|
+
"empty.pending": "いま対応が必要な項目はありません。新しい承認、プラン、選択がここに表示されます。",
|
|
536
|
+
"empty.timeline": "まだタイムライン項目はありません。新しい会話の更新がここに表示されます。",
|
|
537
|
+
"empty.completed": "完了履歴はまだありません。",
|
|
538
|
+
"empty.default": "いま表示できる項目はありません。",
|
|
539
|
+
"detail.selectTitle": "一覧から項目を選んでください",
|
|
540
|
+
"detail.selectCopy": "未対応の承認、プラン、選択、完了結果がここに表示されます。",
|
|
541
|
+
"detail.loadingCopy": "詳細を開いています...",
|
|
542
|
+
"detail.approvalRequested": "承認が必要です。",
|
|
543
|
+
"detail.planReady": "プランの確認が必要です。",
|
|
544
|
+
"detail.previousMessage": "ひとつ前のメッセージ",
|
|
545
|
+
"detail.macOnlyChoice": "この種類の入力は Mac で回答してください。",
|
|
546
|
+
"detail.detailUnavailable": "詳細は利用できません。",
|
|
547
|
+
"detail.pageProgress": ({ page, totalPages }) => `${page} / ${totalPages} ページ`,
|
|
548
|
+
"reply.eyebrow": "返信",
|
|
549
|
+
"reply.title": "Codex に返答する",
|
|
550
|
+
"reply.copy": "この完了結果を見ながら、同じ Codex スレッドに新しいメッセージを送れます。",
|
|
551
|
+
"reply.fieldLabel": "メッセージ",
|
|
552
|
+
"reply.placeholder": "続きを依頼したり、結果の修正や別案を Codex に伝えます。",
|
|
553
|
+
"reply.send": "Codex に送信",
|
|
554
|
+
"reply.sendConfirm": "それでも送信",
|
|
555
|
+
"reply.sendAnother": "もう一度送る",
|
|
556
|
+
"reply.sendSending": "送信中...",
|
|
557
|
+
"reply.mode.groupLabel": "返信モード",
|
|
558
|
+
"reply.mode.defaultLabel": "通常",
|
|
559
|
+
"reply.mode.planLabel": "Plan",
|
|
560
|
+
"reply.mode.on": "ON",
|
|
561
|
+
"reply.mode.off": "OFF",
|
|
562
|
+
"reply.mode.defaultHint": "通常のフォローアップとして送信します。",
|
|
563
|
+
"reply.mode.planHint": "次のターンを Plan モードで開始します。",
|
|
564
|
+
"reply.notice.sentDefault": "Codex にメッセージを送信しました。",
|
|
565
|
+
"reply.notice.sentPlan": "Codex に Plan モードでメッセージを送信しました。",
|
|
566
|
+
"reply.sentPreviewLabel": "送信した内容",
|
|
567
|
+
"reply.warning.title": "このスレッドには、すでに後続メッセージがあります。",
|
|
568
|
+
"reply.warning.copy": "先に最新のやり取りを確認するか、それでもよければこのまま送信してください。",
|
|
569
|
+
"choice.questionFallback": "選択肢を選んでください。",
|
|
570
|
+
"choice.questionHeading": ({ index }) => `質問 ${index}`,
|
|
571
|
+
"choice.ready": "選択入力の準備ができています。",
|
|
572
|
+
"choice.needInput": "選択肢の入力が必要です。",
|
|
573
|
+
"choice.oneQuestion": "1件の質問があります。",
|
|
574
|
+
"choice.multiQuestion": ({ count }) => `${count}件の質問があります。`,
|
|
575
|
+
"choice.macOnly": "この種類の入力は Mac で回答してください。",
|
|
576
|
+
"choice.submitHelp": "各質問で 1 つずつ選んでから、下のボタンでまとめて送信してください。",
|
|
577
|
+
"choice.submit": "回答を送信",
|
|
578
|
+
"summary.completed": "完了結果と最後のメモを確認します。",
|
|
579
|
+
"summary.userMessage": "このメッセージをもう一度開いて文脈付きで確認します。",
|
|
580
|
+
"summary.assistantCommentary": "Codex の最新の途中経過を確認します。",
|
|
581
|
+
"summary.assistantFinal": "このターンの Codex の最終回答を確認します。",
|
|
582
|
+
"summary.approval": "Codex がやろうとしていることを確認して、許可するか決めます。",
|
|
583
|
+
"summary.plan": "Codex が実装を始める前に、提案されたプランを確認します。",
|
|
584
|
+
"summary.choice": "Codex が先へ進むために必要な選択肢を選びます。",
|
|
585
|
+
"summary.default": "項目を開いて詳細を確認します。",
|
|
586
|
+
"intent.approval": "このリクエストを承認するか拒否します。",
|
|
587
|
+
"intent.plan": "Codex が続行する前にこのプランを確認します。",
|
|
588
|
+
"intent.choice": "Codex が続行できるように回答を選びます。",
|
|
589
|
+
"intent.completed": "完了済みです。結果を確認できます。",
|
|
590
|
+
"intent.userMessage": "このメッセージを開き直します。",
|
|
591
|
+
"intent.assistantCommentary": "最新の途中経過を確認します。",
|
|
592
|
+
"intent.assistantFinal": "このターンの Codex の最終回答を確認します。",
|
|
593
|
+
"timeline.allThreads": "すべて",
|
|
594
|
+
"timeline.unknownThread": "不明なスレッド",
|
|
595
|
+
"timeline.filterLabel": "スレッドフィルター",
|
|
596
|
+
"settings.intro": "この iPhone のペアリング、言語、インストール状況、Web Push の状態を確認できます。",
|
|
597
|
+
"settings.section.overview": "クイック確認",
|
|
598
|
+
"settings.section.notifications": "通知",
|
|
599
|
+
"settings.section.install": "インストール",
|
|
600
|
+
"settings.section.device": "この iPhone",
|
|
601
|
+
"settings.group.general": "一般",
|
|
602
|
+
"settings.group.device": "この iPhone",
|
|
603
|
+
"settings.group.values": "設定値",
|
|
604
|
+
"settings.group.advanced": "詳細設定",
|
|
605
|
+
"settings.group.actions": "操作",
|
|
606
|
+
"settings.overview.title": "ひと目で確認",
|
|
607
|
+
"settings.overview.copy": "この iPhone で準備できていること、まだ必要な設定、次にやることをまとめて確認できます。",
|
|
608
|
+
"settings.summary.notifications": "通知",
|
|
609
|
+
"settings.summary.install": "ホーム画面",
|
|
610
|
+
"settings.summary.pairing": "ペアリング",
|
|
611
|
+
"settings.nextStep.eyebrow": "次の一手",
|
|
612
|
+
"settings.nextStep.enableNotifications.title": "通知を有効にする",
|
|
613
|
+
"settings.nextStep.enableNotifications.copy": "この iPhone で Web Push を有効にすると、承認や質問をバックグラウンドでも受け取れます。",
|
|
614
|
+
"settings.nextStep.serverDisabled.title": "サーバー側の設定がまだ必要です",
|
|
615
|
+
"settings.nextStep.serverDisabled.copy": "この viveworker サーバーでは Web Push がまだ有効ではないため、この iPhone からは購読できません。",
|
|
616
|
+
"settings.nextStep.openHttps.title": "HTTPS 版を開く",
|
|
617
|
+
"settings.nextStep.openHttps.copy": "iPhone で通知を有効にするには、このページを HTTPS で開く必要があります。",
|
|
618
|
+
"settings.nextStep.install.title": "ホーム画面に追加する",
|
|
619
|
+
"settings.nextStep.install.copy": "Safari からアプリを追加し、ホーム画面版を開き直してから通知を有効にしてください。",
|
|
620
|
+
"settings.nextStep.permissionBlocked.title": "通知がブロックされています",
|
|
621
|
+
"settings.nextStep.permissionBlocked.copy": "iPhone の設定で通知を再許可してから、ここへ戻ってもう一度確認してください。",
|
|
622
|
+
"settings.nextStep.test.title": "準備は完了です",
|
|
623
|
+
"settings.nextStep.test.copy": "テスト通知を送って、この iPhone が viveworker の push を受け取れるか確認できます。",
|
|
624
|
+
"settings.status.notAvailable": "未対応",
|
|
625
|
+
"settings.status.unsupported": "非対応",
|
|
626
|
+
"settings.status.needsHttps": "HTTPS が必要",
|
|
627
|
+
"settings.status.needsHomeScreen": "ホーム画面追加が必要",
|
|
628
|
+
"settings.status.blocked": "ブロック中",
|
|
629
|
+
"settings.status.ready": "準備完了",
|
|
630
|
+
"settings.status.actionNeeded": "要対応",
|
|
631
|
+
"settings.status.installed": "追加済み",
|
|
632
|
+
"settings.status.notInstalled": "未追加",
|
|
633
|
+
"settings.status.connected": "接続済み",
|
|
634
|
+
"settings.status.info": "情報",
|
|
635
|
+
"settings.notifications.title": "通知",
|
|
636
|
+
"settings.notifications.copy":
|
|
637
|
+
"viveworker がバックグラウンドでも、承認、プラン、質問、完了を確認しやすくします。",
|
|
638
|
+
"settings.notifications.serverDisabled": "サーバー側で Web Push がまだ有効化されていません。",
|
|
639
|
+
"settings.notifications.openHttps": "通知を有効にする前に、HTTPS の viveworker を開いてください。",
|
|
640
|
+
"settings.notifications.openHomeScreen":
|
|
641
|
+
"iPhone では通知を有効にする前に、ホーム画面に追加したアプリを開いてください。",
|
|
642
|
+
"settings.action.enableNotifications": "通知を有効化",
|
|
643
|
+
"settings.action.disableNotifications": "通知を無効化",
|
|
644
|
+
"settings.action.sendTest": "テスト通知を送信",
|
|
645
|
+
"settings.action.reviewTechnical": "技術情報を確認",
|
|
646
|
+
"settings.action.revokeDevice": "削除",
|
|
647
|
+
"settings.action.removeThisDevice": "この端末を削除",
|
|
648
|
+
"settings.install.title": "ホーム画面に追加",
|
|
649
|
+
"settings.install.copy":
|
|
650
|
+
"iPhone で最も使いやすい体験にするには、Safari から viveworker をホーム画面に追加してください。",
|
|
651
|
+
"settings.device.title": "Devices",
|
|
652
|
+
"settings.device.copy": "この LAN 上で viveworker を開ける信頼済み端末を管理します。",
|
|
653
|
+
"settings.device.count": ({ count }) => `${count} 台の端末`,
|
|
654
|
+
"settings.device.section.current": "この端末",
|
|
655
|
+
"settings.device.section.other": "他の信頼済み端末",
|
|
656
|
+
"settings.device.thisDevice": "この端末",
|
|
657
|
+
"settings.device.emptyCurrent": "この端末の情報はまだ表示できません。",
|
|
658
|
+
"settings.device.emptyOther": "他に有効な信頼済み端末はありません。",
|
|
659
|
+
"settings.device.addAnother.title": "端末を追加する",
|
|
660
|
+
"settings.device.addAnother.heading": "新しい iPhone / ブラウザを追加",
|
|
661
|
+
"settings.device.addAnother.copy":
|
|
662
|
+
"別の端末を追加したいときだけ、Mac で次のコマンドを実行します。通常の app URL は変わりません。",
|
|
663
|
+
"settings.device.addAnother.commandLabel": "Mac で実行",
|
|
664
|
+
"settings.device.fallbackName": "信頼済み端末",
|
|
665
|
+
"settings.device.platform.iphone": "iPhone",
|
|
666
|
+
"settings.device.platform.ipad": "iPad",
|
|
667
|
+
"settings.device.platform.android": "Android 端末",
|
|
668
|
+
"settings.device.platform.mac": "Mac",
|
|
669
|
+
"settings.device.platform.browser": "ブラウザ",
|
|
670
|
+
"settings.device.mode.standalone": "ホーム画面アプリ",
|
|
671
|
+
"settings.device.mode.browser": "ブラウザ",
|
|
672
|
+
"settings.language.title": "言語",
|
|
673
|
+
"settings.language.copy": "この iPhone で viveworker を表示する言語を選びます。",
|
|
674
|
+
"settings.pairing.title": "ペアリング",
|
|
675
|
+
"settings.pairing.copy": "この iPhone はローカルの Codex desktop session とペアリングされています。",
|
|
676
|
+
"settings.pairing.connected": "ペアリング済み",
|
|
677
|
+
"settings.technical.title": "技術情報",
|
|
678
|
+
"settings.technical.copy": "この iPhone の接続状態や通知状態を確認できます。",
|
|
679
|
+
"settings.technical.copyShort": "接続や通知の診断情報です。",
|
|
680
|
+
"settings.row.deviceId": "Device ID",
|
|
681
|
+
"settings.row.pairedAt": "初回ペアリング",
|
|
682
|
+
"settings.row.lastUsed": "最終利用",
|
|
683
|
+
"settings.row.trustedUntil": "信頼期限",
|
|
684
|
+
"settings.row.status": "状態",
|
|
685
|
+
"settings.row.pairingStatus": "ペアリング状態",
|
|
686
|
+
"settings.row.serverWebPush": "サーバーの Web Push",
|
|
687
|
+
"settings.row.secureContext": "Secure context",
|
|
688
|
+
"settings.row.homeScreenApp": "ホーム画面アプリ",
|
|
689
|
+
"settings.row.notificationPermission": "通知権限",
|
|
690
|
+
"settings.row.browserSupport": "ブラウザ対応",
|
|
691
|
+
"settings.row.pushStatus": "Push 通知",
|
|
692
|
+
"settings.row.currentDeviceSubscribed": "この端末の購読状態",
|
|
693
|
+
"settings.row.lastSuccessfulDelivery": "最後の通知成功時刻",
|
|
694
|
+
"settings.row.version": "バージョン",
|
|
695
|
+
"settings.row.currentLanguage": "現在の言語",
|
|
696
|
+
"settings.row.languageSource": "言語ソース",
|
|
697
|
+
"settings.row.defaultLanguage": "setup 時の既定値",
|
|
698
|
+
"notice.notificationsEnabled": "この端末で通知を有効にしました。",
|
|
699
|
+
"notice.notificationsDisabled": "この端末の通知を無効にしました。",
|
|
700
|
+
"notice.testNotificationSent": "テスト通知を送信しました。",
|
|
701
|
+
"notice.deviceRevoked": "端末を削除しました。",
|
|
702
|
+
"notice.loggedOutKeepTrusted": "ログアウトしました。この端末の信頼は維持されるので、次回は再 pairing なしで戻れます。",
|
|
703
|
+
"notice.loggedOutDeviceRemoved": "ログアウトし、この端末の信頼も削除しました。次回は再 pairing が必要です。",
|
|
704
|
+
"error.networkHint":
|
|
705
|
+
"最新の HTTPS URL を Safari で開き直して、必要ならホーム画面アプリを追加し直してください。",
|
|
706
|
+
"error.webPushDisabled": "サーバー側で Web Push が有効ではありません。",
|
|
707
|
+
"error.notificationsRequireHttps": "通知には HTTPS が必要です。",
|
|
708
|
+
"error.pushUnsupported": "このブラウザは Web Push に対応していません。",
|
|
709
|
+
"error.openHomeScreen": "iPhone では通知を有効にする前に、ホーム画面の viveworker を開いてください。",
|
|
710
|
+
"error.notificationPermission": ({ status }) => `通知権限は ${status} です。`,
|
|
711
|
+
"error.pushServerNotReady": "サーバー側で Web Push の準備ができていません。",
|
|
712
|
+
"error.serviceWorkerUnavailable": "Service Worker は利用できません。",
|
|
713
|
+
"error.pairingUnavailable": "いまはペアリングできません。",
|
|
714
|
+
"error.invalidPairingCredentials": "ペアリングコードまたはリンクが正しくありません。",
|
|
715
|
+
"error.pairingRateLimited": "ペアリング試行が多すぎます。少し待ってから再試行してください。",
|
|
716
|
+
"error.authenticationRequired": "認証が必要です。",
|
|
717
|
+
"error.originNotAllowed": "信頼された viveworker origin からのリクエストではないため、ブロックされました。",
|
|
718
|
+
"error.deviceNotFound": "その端末はもう利用できません。",
|
|
719
|
+
"error.pushSubscriptionExpired": "この通知購読は期限切れです。もう一度通知を有効にしてください。",
|
|
720
|
+
"error.itemNotFound": "この項目はもう利用できません。",
|
|
721
|
+
"error.completionReplyUnavailable": "この完了項目には、もう返信できません。",
|
|
722
|
+
"error.completionReplyThreadAdvanced": "このスレッドには、すでに新しいメッセージがあります。",
|
|
723
|
+
"error.completionReplyEmpty": "送信前にメッセージを入力してください。",
|
|
724
|
+
"error.codexIpcNotConnected": "いまは Codex desktop に接続できていません。",
|
|
725
|
+
"error.approvalNotFound": "この承認はもう利用できません。",
|
|
726
|
+
"error.approvalAlreadyHandled": "この承認はすでに処理済みです。",
|
|
727
|
+
"error.planRequestNotFound": "このプラン確認はもう利用できません。",
|
|
728
|
+
"error.planRequestAlreadyHandled": "このプラン確認はすでに処理済みです。",
|
|
729
|
+
"error.choiceInputNotFound": "この選択入力はもう利用できません。",
|
|
730
|
+
"error.choiceInputReadOnly": "この種類の入力は Mac で回答してください。",
|
|
731
|
+
"error.choiceInputAlreadyHandled": "この選択入力はすでに処理済みです。",
|
|
732
|
+
"error.mkcertRootCaNotFound": "mkcert の root CA ファイルが見つかりません。",
|
|
733
|
+
"server.fallback.codexTask": "Codex task",
|
|
734
|
+
"server.title.approval": "要承認",
|
|
735
|
+
"server.title.complete": "完了",
|
|
736
|
+
"server.title.plan": "プラン確認",
|
|
737
|
+
"server.title.planReady": "プラン詳細",
|
|
738
|
+
"server.title.choice": "要選択",
|
|
739
|
+
"server.title.choiceReadOnly": "選択入力あり",
|
|
740
|
+
"server.title.userMessage": "ユーザー",
|
|
741
|
+
"server.title.assistantCommentary": "途中経過",
|
|
742
|
+
"server.title.assistantFinal": "最終回答",
|
|
743
|
+
"server.action.review": "判断する",
|
|
744
|
+
"server.action.detail": "詳細",
|
|
745
|
+
"server.action.select": "選ぶ",
|
|
746
|
+
"server.action.approve": "承認",
|
|
747
|
+
"server.action.reject": "拒否",
|
|
748
|
+
"server.action.implement": "実装する",
|
|
749
|
+
"server.message.commandApprovalNeeded": "コマンド実行の承認が必要です。",
|
|
750
|
+
"server.message.fileApprovalNeeded": "ファイル変更の承認が必要です。",
|
|
751
|
+
"server.message.commandPrefix": ({ command }) => `Command: ${command}`,
|
|
752
|
+
"server.message.pathPrefix": ({ path }) => `Path: ${path}`,
|
|
753
|
+
"server.message.approveOnMac": "Mac で承認してください: この iPhone 通知は codex.app の鏡像です。",
|
|
754
|
+
"server.message.approvalNeededInCodex": "Codex で承認が必要です。",
|
|
755
|
+
"server.message.extraApprovals": ({ count }) => `追加の承認: ${count}`,
|
|
756
|
+
"server.message.taskFinished": "タスクが完了しました。",
|
|
757
|
+
"server.message.planReady": "プランの確認が必要です。",
|
|
758
|
+
"server.message.choiceSubmitted": "選択内容を Codex に送信しました。",
|
|
759
|
+
"server.message.choiceSubmittedTest": "テスト回答を受け取りました。",
|
|
760
|
+
"server.message.choiceSummarySubmitted": "選択内容を送信しました。",
|
|
761
|
+
"server.message.choiceSummaryReceivedTest": "テスト回答を受信しました。",
|
|
762
|
+
"server.message.approvalAccepted": "承認しました。Codex を続行します。",
|
|
763
|
+
"server.message.approvalRejected": "拒否しました。Codex にこの操作を続けないよう伝えました。",
|
|
764
|
+
"server.message.planImplemented": "この plan から実装を開始するよう Codex に伝えました。",
|
|
765
|
+
"server.message.planDismissed": "この Plan 確認を閉じ、再通知を抑止しました。",
|
|
766
|
+
"server.confirm.planImplement": "この plan から実装を開始します。",
|
|
767
|
+
"server.confirm.approve": "この承認を確定して Codex を続行します。",
|
|
768
|
+
"server.confirm.reject": "この操作を拒否して Codex に続行しないよう伝えます。",
|
|
769
|
+
"server.pushTest.title": "viveworker テスト通知",
|
|
770
|
+
"server.pushTest.body": "この iPhone で通知が動作しています。",
|
|
771
|
+
"server.page.notFoundTitle": "見つかりません",
|
|
772
|
+
"server.page.notFoundBody": "この承認リンクは存在しません。",
|
|
773
|
+
"server.page.notFoundHint": "このページは閉じて大丈夫です。",
|
|
774
|
+
"server.page.approvalExpired": "承認リンクの期限が切れました",
|
|
775
|
+
"server.page.choiceExpired": "選択入力リンクの期限が切れました",
|
|
776
|
+
"server.page.detailExpired": "詳細リンクの期限が切れました",
|
|
777
|
+
"server.page.approvalMissing": "承認トークンが見つかりません",
|
|
778
|
+
"server.page.choiceMissing": "選択入力トークンが見つかりません",
|
|
779
|
+
"server.page.approvalHandled": "この承認はすでに処理済みです",
|
|
780
|
+
"server.page.detailMissing": "完了詳細が見つかりません",
|
|
781
|
+
"cli.help.usage": "Usage: viveworker <setup|start|stop|status|doctor> [options]",
|
|
782
|
+
"cli.help.commands": "Commands:",
|
|
783
|
+
"cli.help.setup": "setup 設定を作成し、ペアリング情報を生成し、launchd に登録して bridge を起動します",
|
|
784
|
+
"cli.help.start": "start 保存済み設定で bridge を起動します",
|
|
785
|
+
"cli.help.stop": "stop bridge を停止します",
|
|
786
|
+
"cli.help.status": "status launchd / バックグラウンド状態と health を表示します",
|
|
787
|
+
"cli.help.doctor": "doctor ローカル設定を診断します",
|
|
788
|
+
"cli.help.commonOptions": "共通オプション:",
|
|
789
|
+
"cli.setup.complete": "viveworker の setup が完了しました",
|
|
790
|
+
"cli.setup.progress.prepare": "viveworker のローカル設定を準備しています...",
|
|
791
|
+
"cli.setup.progress.installCa": "ローカル CA をインストールまたは更新しています ({stores})...",
|
|
792
|
+
"cli.setup.progress.installMkcert": "Homebrew で mkcert をインストールしています...",
|
|
793
|
+
"cli.setup.progress.generateCert": "ローカル HTTPS 証明書を生成しています...",
|
|
794
|
+
"cli.setup.progress.generateVapid": "Web Push の鍵を生成しています...",
|
|
795
|
+
"cli.setup.progress.writeConfig": "設定ファイルを書き込んでいます...",
|
|
796
|
+
"cli.setup.progress.launchd": "launchd サービスを登録して起動しています...",
|
|
797
|
+
"cli.setup.progress.startBridge": "ローカル bridge を起動しています...",
|
|
798
|
+
"cli.setup.progress.health": "viveworker の応答を待っています...",
|
|
799
|
+
"cli.setup.primaryUrl": "Primary URL (.local): {url}",
|
|
800
|
+
"cli.setup.fallbackUrl": "Fallback URL (IP): {url}",
|
|
801
|
+
"cli.setup.pairingCode": "Pairing code: {code}",
|
|
802
|
+
"cli.setup.pairingUrlLocal": "Pairing URL (.local): {url}",
|
|
803
|
+
"cli.setup.pairingUrlIp": "Pairing URL (IP): {url}",
|
|
804
|
+
"cli.setup.pairRefresh.title": "端末を追加する",
|
|
805
|
+
"cli.setup.pairRefresh.copy":
|
|
806
|
+
"既存の app URL はそのままです。新しい信頼済み端末を追加したいときだけ、下の fresh な pairing code / URL を使ってください。",
|
|
807
|
+
"cli.setup.pairRefresh.reminder": "この pairing 情報は短命かつ one-time です。",
|
|
808
|
+
"cli.setup.caDownloadLocal": "CA download (.local): {url}",
|
|
809
|
+
"cli.setup.caDownloadIp": "CA download (IP): {url}",
|
|
810
|
+
"cli.setup.webPushEnabled": "Web Push: enabled (HTTPS)",
|
|
811
|
+
"cli.setup.webPushDisabled": "Web Push: disabled",
|
|
812
|
+
"cli.setup.completePending": "viveworker の setup は完了しましたが、まだ health 応答は確認できていません。",
|
|
813
|
+
"cli.setup.caFlow.title": "iPhone で viveworker を開く前に、まずローカルの証明書をインストールしてください:",
|
|
814
|
+
"cli.setup.caFlow.step1": "1. 下の CA download URL を開くか QR を読み取り、iPhone で rootCA.pem を取得します。",
|
|
815
|
+
"cli.setup.caFlow.step2": "2. rootCA.pem をインストールし、iPhone の証明書信頼設定でその証明書を信頼します。",
|
|
816
|
+
"cli.setup.caFlow.step3": "3. そのあと、このターミナルで Enter を押すと viveworker の接続先 URL と Pairing QR を表示します。",
|
|
817
|
+
"cli.setup.instructions.https":
|
|
818
|
+
"Safari で HTTPS URL を開き、iPhone でローカル CA を信頼してから、ホーム画面に追加して通知を有効にしてください。",
|
|
819
|
+
"cli.setup.instructions.afterCa":
|
|
820
|
+
"次に iPhone の Safari で Pairing URL を開き、必要ならペアリングしてから、viveworker をホーム画面に追加してください。",
|
|
821
|
+
"cli.setup.instructions.insecureHttpLan":
|
|
822
|
+
"HTTP URL は、LAN 上の平文アクセスを明示的に許可した場合だけ Safari で開いてください。共有 Wi-Fi では非推奨です。",
|
|
823
|
+
"cli.setup.instructions.localOnlyHttp":
|
|
824
|
+
"この setup はローカル開発用の loopback-only HTTP です。iPhone から使うなら既定の HTTPS setup か --allow-insecure-http-lan を使ってください。",
|
|
825
|
+
"logout.confirm.title": "ログアウト方法を選んでください",
|
|
826
|
+
"logout.confirm.copy": "session だけ終えることも、この端末の信頼ごと削除して次回 pairing 必須にすることもできます。",
|
|
827
|
+
"logout.confirm.keepTrustedTitle": "ログアウトのみ",
|
|
828
|
+
"logout.confirm.keepTrustedCopy": "今の session だけ終了し、この端末の信頼は残します。",
|
|
829
|
+
"logout.confirm.removeTitle": "ログアウトしてこの端末を削除",
|
|
830
|
+
"logout.confirm.removeCopy": "session を終了し、この端末の信頼と push 購読も削除します。",
|
|
831
|
+
"logout.action.keepTrusted": "ログアウト",
|
|
832
|
+
"logout.action.removeDevice": "ログアウトしてこの端末を削除",
|
|
833
|
+
"cli.setup.warning.insecureHttpLan":
|
|
834
|
+
"警告: insecure LAN HTTP が有効です。session / device cookie がローカルネットワーク上で露出する可能性があります。",
|
|
835
|
+
"cli.setup.qrPairing": "Pairing QR:",
|
|
836
|
+
"cli.setup.qrCaDownload": "rootCA.pem download QR (IP):",
|
|
837
|
+
"cli.setup.prompt.continueToApp": "viveworker の接続先 URL を表示するには Enter を押してください。",
|
|
838
|
+
"cli.start.progress.prepare": "保存済みの viveworker 設定を読み込んでいます...",
|
|
839
|
+
"cli.start.progress.refreshPairing": "期限切れの pairing 情報を更新しています...",
|
|
840
|
+
"cli.start.progress.launchd": "launchd サービスを起動しています...",
|
|
841
|
+
"cli.start.progress.kickstart": "viveworker の launch agent を再読み込みしています...",
|
|
842
|
+
"cli.start.progress.bridge": "ローカル bridge を起動しています...",
|
|
843
|
+
"cli.start.progress.health": "viveworker の応答を待っています...",
|
|
844
|
+
"cli.start.launchdStarted": "viveworker の launchd サービスを開始しました。",
|
|
845
|
+
"cli.start.launchdStartedPending": "viveworker の launchd サービスは開始しましたが、まだ health 応答は確認できていません。",
|
|
846
|
+
"cli.start.bridgeStarted": "viveworker bridge をバックグラウンドで起動しました。",
|
|
847
|
+
"cli.start.bridgeStartedPending": "viveworker bridge はバックグラウンドで起動しましたが、まだ health 応答は確認できていません。",
|
|
848
|
+
"cli.stop.launchdStopped": "viveworker の launchd サービスを停止しました。",
|
|
849
|
+
"cli.stop.noProcess": "バックグラウンドの viveworker プロセスは見つかりませんでした。",
|
|
850
|
+
"cli.stop.stopped": "バックグラウンドの viveworker プロセス {pid} を停止しました。",
|
|
851
|
+
"cli.status.envFile": "Env file: {value}",
|
|
852
|
+
"cli.status.baseUrl": "Base URL: {value}",
|
|
853
|
+
"cli.status.webPush": "Web Push: {value}",
|
|
854
|
+
"cli.status.https": "HTTPS: {value}",
|
|
855
|
+
"cli.status.tlsCert": "TLS cert: {value}",
|
|
856
|
+
"cli.status.tlsKey": "TLS key: {value}",
|
|
857
|
+
"cli.status.launchAgent": "LaunchAgent: {value}",
|
|
858
|
+
"cli.status.launchd": "launchd: {value}",
|
|
859
|
+
"cli.status.pid": "pid: {value}",
|
|
860
|
+
"cli.status.health": "health: {value}",
|
|
861
|
+
"cli.status.enabled": "有効",
|
|
862
|
+
"cli.status.disabled": "無効",
|
|
863
|
+
"cli.status.installed": "インストール済み",
|
|
864
|
+
"cli.status.notRunning": "停止中",
|
|
865
|
+
"cli.status.ok": "ok",
|
|
866
|
+
"cli.status.failed": "failed",
|
|
867
|
+
"cli.doctor.ok": "viveworker doctor: ok",
|
|
868
|
+
"cli.doctor.foundIssues": "viveworker doctor で問題が見つかりました:",
|
|
869
|
+
"cli.doctor.issue.envMissing": "env ファイルが見つかりません",
|
|
870
|
+
"cli.doctor.issue.sessionSecretMissing": "SESSION_SECRET がありません",
|
|
871
|
+
"cli.doctor.issue.pairingMissing": "pairing 情報がありません",
|
|
872
|
+
"cli.doctor.issue.baseUrlMissing": "NATIVE_APPROVAL_SERVER_PUBLIC_BASE_URL がありません",
|
|
873
|
+
"cli.doctor.issue.lanHttpRequiresOverride": "LAN 上の HTTP には ALLOW_INSECURE_LAN_HTTP=1 か HTTPS の base URL が必要です",
|
|
874
|
+
"cli.doctor.issue.webPushHttps": "Web Push には HTTPS の base URL が必要です",
|
|
875
|
+
"cli.doctor.issue.tlsCertMissing": "TLS_CERT_FILE がないか、読み取れません",
|
|
876
|
+
"cli.doctor.issue.tlsKeyMissing": "TLS_KEY_FILE がないか、読み取れません",
|
|
877
|
+
"cli.doctor.issue.vapidPublicMissing": "WEB_PUSH_VAPID_PUBLIC_KEY がありません",
|
|
878
|
+
"cli.doctor.issue.vapidPrivateMissing": "WEB_PUSH_VAPID_PRIVATE_KEY がありません",
|
|
879
|
+
"cli.doctor.issue.healthHttps": "health endpoint に HTTPS で到達できません",
|
|
880
|
+
"cli.doctor.issue.health": "health endpoint に到達できません",
|
|
881
|
+
},
|
|
882
|
+
};
|
|
883
|
+
|
|
884
|
+
export function normalizeLocale(value) {
|
|
885
|
+
const normalized = String(value ?? "").trim().toLowerCase();
|
|
886
|
+
if (!normalized) {
|
|
887
|
+
return "";
|
|
888
|
+
}
|
|
889
|
+
if (normalized.startsWith("ja")) {
|
|
890
|
+
return "ja";
|
|
891
|
+
}
|
|
892
|
+
if (normalized.startsWith("en")) {
|
|
893
|
+
return "en";
|
|
894
|
+
}
|
|
895
|
+
return "";
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
export function resolveLocalePreference({ overrideLocale, detectedLocale, defaultLocale, fallbackLocale = DEFAULT_LOCALE } = {}) {
|
|
899
|
+
const override = normalizeLocale(overrideLocale);
|
|
900
|
+
if (override) {
|
|
901
|
+
return { locale: override, source: "override" };
|
|
902
|
+
}
|
|
903
|
+
const detected = normalizeLocale(detectedLocale);
|
|
904
|
+
if (detected) {
|
|
905
|
+
return { locale: detected, source: "device" };
|
|
906
|
+
}
|
|
907
|
+
const appDefault = normalizeLocale(defaultLocale);
|
|
908
|
+
if (appDefault) {
|
|
909
|
+
return { locale: appDefault, source: "default" };
|
|
910
|
+
}
|
|
911
|
+
return { locale: normalizeLocale(fallbackLocale) || DEFAULT_LOCALE, source: "fallback" };
|
|
912
|
+
}
|
|
913
|
+
|
|
914
|
+
export function t(locale, key, vars = {}) {
|
|
915
|
+
const normalizedLocale = normalizeLocale(locale) || DEFAULT_LOCALE;
|
|
916
|
+
const entry =
|
|
917
|
+
translations[normalizedLocale]?.[key] ??
|
|
918
|
+
translations[DEFAULT_LOCALE]?.[key] ??
|
|
919
|
+
key;
|
|
920
|
+
const raw = typeof entry === "function" ? entry(vars) : entry;
|
|
921
|
+
return interpolate(raw, vars);
|
|
922
|
+
}
|
|
923
|
+
|
|
924
|
+
export function localeDisplayName(locale, displayLocale = locale) {
|
|
925
|
+
const normalized = normalizeLocale(locale);
|
|
926
|
+
if (!normalized) {
|
|
927
|
+
return "";
|
|
928
|
+
}
|
|
929
|
+
return t(displayLocale, `language.option.${normalized}`);
|
|
930
|
+
}
|
|
931
|
+
|
|
932
|
+
function interpolate(template, vars) {
|
|
933
|
+
return String(template).replace(/\{(\w+)\}/gu, (_, key) => {
|
|
934
|
+
const value = vars?.[key];
|
|
935
|
+
return value == null ? "" : String(value);
|
|
936
|
+
});
|
|
937
|
+
}
|