summaryrefslogtreecommitdiff
path: root/src/ollama_web/static/app.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/ollama_web/static/app.js')
-rw-r--r--src/ollama_web/static/app.js49
1 files changed, 27 insertions, 22 deletions
diff --git a/src/ollama_web/static/app.js b/src/ollama_web/static/app.js
index 00269b3..492f9e4 100644
--- a/src/ollama_web/static/app.js
+++ b/src/ollama_web/static/app.js
@@ -170,7 +170,7 @@ function addMessage(role) {
div.className = `message ${role}`;
const roleEl = document.createElement("div");
roleEl.className = "role";
- roleEl.textContent = role === "user" ? "あなた" : "アシスタント";
+ roleEl.textContent = role === "user" ? t("roles.user") : t("roles.assistant");
const body = document.createElement("div");
body.className = "body";
div.append(roleEl, body);
@@ -190,7 +190,7 @@ function addToolBubble(parentExtras, name, args) {
det.className = "tool";
const label = typeof window.toolLabel === "function" ? window.toolLabel(name) : name;
const sum = document.createElement("summary");
- sum.textContent = `${label} を実行中…`;
+ sum.textContent = t("status.executing_tool", "Executing {label}…").replace("{label}", label);
det.appendChild(sum);
if (args && Object.keys(args).length) {
const a = document.createElement("div");
@@ -210,7 +210,7 @@ function addThinkingBubble(parentExtras) {
const det = document.createElement("details");
det.className = "thinking";
const sum = document.createElement("summary");
- sum.textContent = "思考プロセス";
+ sum.textContent = t("status.thinking");
const body = document.createElement("div");
det.append(sum, body);
parentExtras.appendChild(det);
@@ -261,7 +261,7 @@ function renderSessionList(sessions) {
if (!sessions.length) {
const li = document.createElement("li");
li.className = "empty";
- li.textContent = "セッションがありません";
+ li.textContent = t("chat.no_sessions");
sessionListEl.appendChild(li);
return;
}
@@ -274,8 +274,8 @@ function renderSessionList(sessions) {
title.textContent = s.title || s.id;
const del = document.createElement("button");
del.className = "delete";
- del.textContent = "削除";
- del.title = "セッションを削除";
+ del.textContent = t("common.delete");
+ del.title = t("chat.delete_session");
del.addEventListener("click", (e) => {
e.stopPropagation();
deleteSession(s.id);
@@ -295,12 +295,12 @@ async function createSession() {
await selectSession(session.id);
} catch (err) {
console.error("failed to create session", err);
- alert("セッションの作成に失敗しました");
+ alert(t("chat.create_failed"));
}
}
async function deleteSession(id) {
- if (!confirm("このセッションを削除しますか?")) return;
+ if (!confirm(t("chat.delete_confirm"))) return;
try {
const res = await csrfFetch(`/api/sessions/${id}`, { method: "DELETE" });
if (!res.ok) throw new Error(res.statusText);
@@ -314,7 +314,7 @@ async function deleteSession(id) {
await loadSessions();
} catch (err) {
console.error("failed to delete session", err);
- alert("セッションの削除に失敗しました");
+ alert(t("chat.delete_failed"));
}
}
@@ -381,7 +381,7 @@ function renderSession() {
return f ? f.name : fid;
})
.join(", ");
- info.textContent = `添付: ${names}`;
+ info.textContent = t("chat.attachment_label", "Attached: {names}").replace("{names}", names);
body.appendChild(info);
}
} else if (m.role === "assistant") {
@@ -437,7 +437,7 @@ async function uploadFiles(files) {
await selectSession(currentSessionId);
} catch (err) {
console.error("failed to upload files", err);
- alert("ファイルのアップロードに失敗しました");
+ alert(t("chat.upload_failed"));
}
}
@@ -489,7 +489,7 @@ async function send() {
let displayContent = text;
if (pendingFiles.length) {
const names = pendingFiles.map((f) => f.name).join(", ");
- displayContent += (text ? "\n\n" : "") + `添付ファイル: ${names}`;
+ displayContent += (text ? "\n\n" : "") + t("chat.attachment_files", "Attached files: {names}").replace("{names}", names);
}
userBody.innerHTML = renderMarkdown(displayContent);
highlightIn(userBody);
@@ -527,7 +527,9 @@ async function send() {
});
} catch (err) {
assistantBody.textContent =
- err.name === "AbortError" ? "生成を停止しました" : `エラー: ${err.message}`;
+ err.name === "AbortError"
+ ? t("chat.stopped")
+ : t("chat.error_prefix", "Error: {message}").replace("{message}", err.message);
abortController = null;
cancelBtn.disabled = true;
sendBtn.disabled = false;
@@ -535,7 +537,7 @@ async function send() {
}
if (!res.ok || !res.body) {
- assistantBody.textContent = `エラー: ${res.status}`;
+ assistantBody.textContent = t("chat.error_prefix", "Error: {message}").replace("{message}", res.status);
abortController = null;
cancelBtn.disabled = true;
sendBtn.disabled = false;
@@ -606,7 +608,10 @@ async function send() {
} else if (ev.type === "tool_end") {
const b = pendingTools.shift();
if (b) {
- b.sum.textContent = b.sum.textContent.replace("実行中…", "完了");
+ b.sum.textContent = b.sum.textContent.replace(
+ t("status.running", "Running…"),
+ t("status.done")
+ );
b.result.textContent = (ev.result || "").slice(0, 2000);
chatEl.scrollTop = chatEl.scrollHeight;
}
@@ -621,7 +626,7 @@ async function send() {
waiting.className = "waiting-msg";
waiting.style.color = "var(--muted)";
waiting.style.fontStyle = "italic";
- waiting.textContent = "ollama が回答を生成中…";
+ waiting.textContent = t("chat.generating");
assistantBody.appendChild(waiting);
}
} else if (ev.type === "status") {
@@ -634,7 +639,7 @@ async function send() {
waiting.className = "waiting-msg";
waiting.style.color = "var(--muted)";
waiting.style.fontStyle = "italic";
- waiting.textContent = ev.message || "処理中…";
+ waiting.textContent = ev.message || t("chat.processing");
assistantBody.appendChild(waiting);
}
} else if (ev.type === "thinking") {
@@ -651,7 +656,7 @@ async function send() {
}
const span = document.createElement("span");
span.style.color = "#f85149";
- span.textContent = `エラー: ${ev.message}`;
+ span.textContent = t("chat.error_prefix", "Error: {message}").replace("{message}", ev.message);
assistantBody.appendChild(span);
} else if (ev.type === "done") {
break;
@@ -688,7 +693,7 @@ async function send() {
}
if (!assistantText && !pendingTools.length && !thinkingBody && !gotError) {
- assistantBody.textContent = "(応答なし)";
+ assistantBody.textContent = t("chat.no_response");
}
abortController = null;
@@ -704,7 +709,7 @@ async function send() {
if (errorHtml && chatEl.lastElementChild) {
const lastBody = chatEl.lastElementChild.querySelector(".body");
- if (lastBody && lastBody.textContent.trim() === "(応答なし)") {
+ if (lastBody && lastBody.textContent.trim() === t("chat.no_response")) {
lastBody.innerHTML = errorHtml;
}
}
@@ -736,7 +741,7 @@ async function clearMessages() {
});
if (!res.ok) throw new Error(res.statusText);
const data = await res.json();
- if (!data.cleared) throw new Error("クリアに失敗しました");
+ if (!data.cleared) throw new Error(t("chat.clear_failed"));
if (currentSession) {
currentSession.messages = [];
@@ -747,7 +752,7 @@ async function clearMessages() {
renderAttachments();
} catch (err) {
console.error("failed to clear messages", err);
- alert("メッセージのクリアに失敗しました");
+ alert(t("chat.clear_messages_failed"));
}
}