diff --git a/examples/webpage/app.js b/examples/webpage/app.js index c6218ad..269ebb0 100644 --- a/examples/webpage/app.js +++ b/examples/webpage/app.js @@ -170,7 +170,7 @@ function setConnectButton() { els.chatId.disabled = state.connected || state.connecting; els.copyChatIdBtn.disabled = !state.connected || !state.chatId; if (state.connecting) { - els.connectBtn.textContent = "Connecting…"; + els.connectBtn.textContent = "连接中…"; els.connectBtn.disabled = true; els.connectBtn.classList.remove("is-disconnect"); } else if (state.connected) { @@ -207,8 +207,8 @@ async function copyChatId() { function setMicButton() { els.micBtn.disabled = !state.connected; els.micBtn.setAttribute("aria-pressed", state.micEnabled ? "true" : "false"); - els.micBtn.title = state.micEnabled ? "Mute mic" : "Unmute mic"; - els.micLabel.textContent = state.micEnabled ? "Mute mic" : "Enable mic"; + els.micBtn.title = state.micEnabled ? "关闭麦克风" : "开启麦克风"; + els.micLabel.textContent = state.micEnabled ? "关闭麦克风" : "开启麦克风"; els.micIndicator.classList.toggle("is-active", state.micEnabled); } @@ -231,8 +231,8 @@ function setAssistantState(value) { const label = text.length > 32 ? `${text.slice(0, 31)}…` : text; state.assistantState = text; els.stateIndicator.classList.toggle("is-active", Boolean(text)); - els.stateLabel.textContent = label ? `State ${label}` : "State -"; - els.stateIndicator.title = label ? `Assistant state: ${text}` : "Assistant state"; + els.stateLabel.textContent = label ? `状态 ${label}` : "状态 -"; + els.stateIndicator.title = label ? `助手状态:${text}` : "助手状态"; syncCameraDrawer(text); } @@ -253,7 +253,7 @@ function syncCameraDrawer(value) { els.conversation.classList.toggle("has-camera", open); els.cameraDrawer.setAttribute("aria-hidden", open ? "false" : "true"); if (open) { - els.cameraState.textContent = `State ${value}`; + els.cameraState.textContent = `状态 ${value}`; els.cameraQuestion.textContent = prompt; renderSampleThumbnails(); selectDefaultImage(); @@ -261,7 +261,7 @@ function syncCameraDrawer(value) { if (!state.cameraActive) populateDeviceSelect(); }); } else { - els.cameraState.textContent = "State -"; + els.cameraState.textContent = "状态 -"; els.cameraQuestion.textContent = ""; if (wasOpen) resetCameraInput(); } @@ -277,7 +277,7 @@ function addBubble(role, text) { if (role !== "system") { const tag = document.createElement("span"); tag.className = "bubble__role"; - tag.textContent = role === "user" ? "You" : "Assistant"; + tag.textContent = role === "user" ? "你" : "助手"; bubble.appendChild(tag); } const body = document.createElement("span"); @@ -299,7 +299,7 @@ function addImageBubble(role, imageUrl, text) { if (role !== "system") { const tag = document.createElement("span"); tag.className = "bubble__role"; - tag.textContent = role === "user" ? "You" : "Assistant"; + tag.textContent = role === "user" ? "你" : "助手"; bubble.appendChild(tag); } const img = document.createElement("img"); @@ -334,7 +334,7 @@ function clearChat() { setAssistantState(""); const empty = document.createElement("div"); empty.className = "chat__empty"; - empty.innerHTML = "

Chat cleared.

"; + empty.innerHTML = "

对话已清空。

"; els.chatLog.appendChild(empty); } @@ -656,7 +656,7 @@ function wsSend(data) { function clearWsLog() { state.wsLogGroup = null; els.wsLog.innerHTML = - '
No websocket events yet.
'; + '
暂无 WebSocket 事件。
'; } /* ---------------------------------------------------------------- Audio */ @@ -679,7 +679,7 @@ function renderMicDevices() { const defaultOption = document.createElement("option"); defaultOption.value = ""; - defaultOption.textContent = "Default microphone"; + defaultOption.textContent = "默认麦克风"; els.micSelect.appendChild(defaultOption); state.micDevices.forEach((device, index) => { @@ -752,7 +752,7 @@ async function startMic() { state.micSourceNode.connect(state.recorderNode); state.micEnabled = true; - addWsLog("system", "mic capture started (binary input.audio frames)"); + addWsLog("system", "麦克风已开启(PCM 音频流)"); setMicButton(); } @@ -788,7 +788,7 @@ function stopMic() { state.micEnabled = false; updateMeter(0); if (wasEnabled) { - addWsLog("system", "mic capture stopped"); + addWsLog("system", "麦克风已关闭"); } setMicButton(); } @@ -902,7 +902,7 @@ function mediaToPayload(source) { try { dataUrl = canvas.toDataURL("image/jpeg", IMAGE_JPEG_QUALITY); } catch (err) { - addWsLog("system", `image encode failed: ${err.message || err}`); + addWsLog("system", `图片编码失败:${err.message || err}`); return null; } return { dataUrl, mime: "image/jpeg", width: w, height: h }; @@ -952,7 +952,7 @@ function populateDeviceSelect(activeDeviceId) { async function startCamera(deviceId) { if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) { - addWsLog("system", "getUserMedia not available in this browser"); + addWsLog("system", "该浏览器不支持摄像头访问"); return; } stopCameraStream(); @@ -965,7 +965,7 @@ async function startCamera(deviceId) { audio: false, }); } catch (err) { - addWsLog("system", `camera error: ${err.message || err}`); + addWsLog("system", `摄像头错误:${err.message || err}`); return; } els.cameraVideo.srcObject = state.cameraStream; @@ -1029,7 +1029,7 @@ async function selectFileImage(file) { clearSampleSelection(); setPendingImage(payload); } catch (err) { - addWsLog("system", `upload error: ${err.message || err}`); + addWsLog("system", `上传错误:${err.message || err}`); } finally { URL.revokeObjectURL(objectUrl); } @@ -1045,7 +1045,7 @@ async function selectSampleImage(src, buttonEl) { if (buttonEl) buttonEl.classList.add("is-selected"); setPendingImage(payload); } catch (err) { - addWsLog("system", `sample error: ${err.message || err}`); + addWsLog("system", `示例图加载错误:${err.message || err}`); } } @@ -1260,9 +1260,9 @@ async function connect() { state.connecting = true; state.chatId = chatId; els.chatId.value = chatId; - setStatus("connecting", "Connecting…"); + setStatus("connecting", "连接中…"); setConnectButton(); - addWsLog("system", `connecting ${url}`); + addWsLog("system", `正在连接 ${url}`); try { // Pre-warm audio context on user gesture so playback works on Safari. @@ -1309,15 +1309,15 @@ async function connect() { state.connecting = false; state.connected = true; resetPlaybackClock(); - addWsLog("system", "websocket open"); - setStatus("connected", "Connected"); + addWsLog("system", "连接已建立"); + setStatus("connected", "已连接"); setConnectButton(); setMicButton(); setMicSelectEnabled(); refreshMicDevices(); wsSend(JSON.stringify(startMessage)); - addBubble("system", "Session started."); + addBubble("system", "会话已开始。"); setComposerEnabled(true); setCameraButtonEnabled(); els.textInput.focus(); @@ -1378,11 +1378,11 @@ async function connect() { if (wasConnected) { addBubble( "system", - `Session ended${event.reason ? ` — ${event.reason}` : ""}.`, + `会话已结束${event.reason ? `:${event.reason}` : ""}。`, ); - setStatus("idle", "Disconnected"); + setStatus("idle", "未连接"); } else { - setStatus("error", "Connection closed"); + setStatus("error", "连接已断开"); } }); } @@ -1424,7 +1424,7 @@ els.micBtn.addEventListener("click", async () => { } } catch (err) { console.error("Mic error", err); - addBubble("system", `Mic error: ${err.message || err}`); + addBubble("system", `麦克风错误:${err.message || err}`); } finally { els.micBtn.disabled = !state.connected; } @@ -1441,7 +1441,7 @@ els.micSelect.addEventListener("change", async () => { await startMic(); } catch (err) { console.error("Mic switch error", err); - addBubble("system", `Mic switch error: ${err.message || err}`); + addBubble("system", `麦克风切换错误:${err.message || err}`); } finally { setMicButton(); setMicSelectEnabled(); @@ -1534,7 +1534,7 @@ window.addEventListener("beforeunload", () => { els.url.value = defaultWsUrl(); -setStatus("idle", "Disconnected"); +setStatus("idle", "未连接"); setConnectButton(); setMicButton(); setMicSelectEnabled(); diff --git a/examples/webpage/index.html b/examples/webpage/index.html index 3c1c1c9..4d6d4c7 100644 --- a/examples/webpage/index.html +++ b/examples/webpage/index.html @@ -16,7 +16,7 @@
- Disconnected + 未连接
@@ -70,13 +70,13 @@ -
+

Connect to the engine, enable your mic, and start talking.

@@ -168,7 +195,7 @@
-