Add OpenAI chat translation layer

This commit is contained in:
rajchales-monito
2026-07-29 20:32:57 +02:00
parent 4217c4d469
commit 46d18c69eb
5 changed files with 217 additions and 6 deletions
+34 -1
View File
@@ -79,6 +79,9 @@ $("#adminSoundRepeat").addEventListener("change", (event) => {
$("#adminSoundTest").addEventListener("click", () => {
playNotifySound({ ignoreMuted: true });
});
$("#translationEnabled").addEventListener("change", saveTranslationSettings);
$("#operatorLanguage").addEventListener("change", saveTranslationSettings);
$("#translationModel").addEventListener("change", saveTranslationSettings);
document.querySelectorAll("[data-settings-tab]").forEach((button) => {
button.addEventListener("click", () => {
const tab = button.dataset.settingsTab;
@@ -385,6 +388,21 @@ function renderSite() {
form.messageBadge.checked = s.notifications?.badgeOnAdminReply !== false;
form.messageLabel.checked = s.notifications?.labelOnAdminReply !== false;
form.messageWiggle.checked = s.notifications?.wiggleOnAdminReply !== false;
$("#translationEnabled").checked = Boolean(s.translations?.enabled);
$("#operatorLanguage").value = s.translations?.operatorLanguage || "cs";
$("#translationModel").value = s.translations?.model || "gpt-5.6-luna";
}
async function saveTranslationSettings() {
if (!state.site) return;
const settings = structuredClone(state.site.settings);
settings.translations = {
...(settings.translations || {}),
enabled: $("#translationEnabled").checked,
operatorLanguage: $("#operatorLanguage").value,
model: $("#translationModel").value.trim() || "gpt-5.6-luna"
};
await saveSite({ settings, isOnline: state.site.isOnline });
}
function renderConversations() {
@@ -511,13 +529,28 @@ function renderActive() {
$("#messages").innerHTML = messages.map((message) => `
<article class="message ${message.senderType}">
<div class="by">${escapeHtml(message.senderName || message.senderType)} · ${escapeHtml(message.createdAt)}</div>
${message.body ? `<p>${escapeHtml(message.body)}</p>` : ""}
${renderMessageBody(message)}
${renderAttachments(message.attachments)}
</article>
`).join("") + adminReadReceipt(conversation, messages);
$("#messages").scrollTop = $("#messages").scrollHeight;
}
function renderMessageBody(message) {
const original = message.body ? `<p>${escapeHtml(message.body)}</p>` : "";
if (!message.translatedBody) return original;
const label = message.senderType === "visitor"
? `Preklad do ${escapeHtml(message.translatedLanguage || "")}`
: `Odeslano zakaznikovi ${escapeHtml(message.translatedLanguage || "")}`;
return `
${original}
<div class="translation">
<span>${label}</span>
<p>${escapeHtml(message.translatedBody)}</p>
</div>
`;
}
async function renameVisitor(visitorToken) {
if (!state.active?.conversation || !visitorToken) return;
const currentName = conversationVisitorName(state.active.conversation);