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 @@