add chat lang
This commit is contained in:
@@ -1,5 +1,18 @@
|
||||
import type { ChatMessage, Profile } from '../types'
|
||||
import { renderMarkdown } from '../lib/markdown'
|
||||
import { getCurrentLang } from './mode-tabs'
|
||||
|
||||
// Get translated content for a chat message
|
||||
function getTranslatedContent(msg: ChatMessage): string {
|
||||
const currentLang = getCurrentLang()
|
||||
const originalLang = msg.value.lang || 'ja'
|
||||
const translations = msg.value.translations
|
||||
|
||||
if (translations && currentLang !== originalLang && translations[currentLang]) {
|
||||
return translations[currentLang].content || msg.value.content
|
||||
}
|
||||
return msg.value.content
|
||||
}
|
||||
|
||||
// Escape HTML to prevent XSS
|
||||
function escapeHtml(text: string): string {
|
||||
@@ -123,10 +136,11 @@ export function renderChatThreadList(
|
||||
? `<img class="chat-avatar" src="${author.avatarUrl}" alt="@${escapeHtml(author.handle)}">`
|
||||
: `<div class="chat-avatar-placeholder"></div>`
|
||||
|
||||
// Truncate content for preview
|
||||
const preview = msg.value.content.length > 100
|
||||
? msg.value.content.slice(0, 100) + '...'
|
||||
: msg.value.content
|
||||
// Truncate content for preview (use translated content)
|
||||
const displayContent = getTranslatedContent(msg)
|
||||
const preview = displayContent.length > 100
|
||||
? displayContent.slice(0, 100) + '...'
|
||||
: displayContent
|
||||
|
||||
return `
|
||||
<a href="/@${userHandle}/at/chat/${rkey}" class="chat-thread-item">
|
||||
@@ -206,7 +220,8 @@ export function renderChatThread(
|
||||
? `<img class="chat-avatar" src="${author.avatarUrl}" alt="@${escapeHtml(author.handle)}">`
|
||||
: `<div class="chat-avatar-placeholder"></div>`
|
||||
|
||||
const content = renderMarkdown(msg.value.content)
|
||||
const displayContent = getTranslatedContent(msg)
|
||||
const content = renderMarkdown(displayContent)
|
||||
const recordLink = `/@${author.handle}/at/collection/ai.syui.log.chat/${rkey}`
|
||||
|
||||
return `
|
||||
|
||||
@@ -140,7 +140,7 @@ async function render(route: Route): Promise<void> {
|
||||
// Load posts (local only for admin, remote for others)
|
||||
const posts = await getPosts(did, config.collection, localOnly)
|
||||
|
||||
// Collect available languages from posts
|
||||
// Collect available languages from posts (used for non-chat pages)
|
||||
const availableLangs = new Set<string>()
|
||||
for (const post of posts) {
|
||||
// Add original language (default: ja for Japanese posts)
|
||||
@@ -153,7 +153,7 @@ async function render(route: Route): Promise<void> {
|
||||
}
|
||||
}
|
||||
}
|
||||
const langList = Array.from(availableLangs)
|
||||
let langList = Array.from(availableLangs)
|
||||
|
||||
// Build page
|
||||
let html = renderHeader(handle, oauthEnabled)
|
||||
@@ -237,6 +237,21 @@ async function render(route: Route): Promise<void> {
|
||||
const chatMessages = await getChatMessages(did, aiDid, 'ai.syui.log.chat')
|
||||
const aiProfile = await getProfile(aiDid, false)
|
||||
const pds = await getPds(did)
|
||||
|
||||
// Collect available languages from chat messages
|
||||
const chatLangs = new Set<string>()
|
||||
for (const msg of chatMessages) {
|
||||
const msgLang = msg.value.lang || 'ja'
|
||||
chatLangs.add(msgLang)
|
||||
if (msg.value.translations) {
|
||||
for (const lang of Object.keys(msg.value.translations)) {
|
||||
chatLangs.add(lang)
|
||||
}
|
||||
}
|
||||
}
|
||||
langList = Array.from(chatLangs)
|
||||
|
||||
html += renderLangSelector(langList)
|
||||
html += `<div id="content">${renderChatListPage(chatMessages, did, handle, aiDid, aiHandle, profile, aiProfile, pds || undefined)}</div>`
|
||||
html += `<nav class="back-nav"><a href="/@${handle}">${handle}</a></nav>`
|
||||
|
||||
@@ -248,6 +263,21 @@ async function render(route: Route): Promise<void> {
|
||||
const chatMessages = await getChatMessages(did, aiDid, 'ai.syui.log.chat')
|
||||
const aiProfile = await getProfile(aiDid, false)
|
||||
const pds = await getPds(did)
|
||||
|
||||
// Collect available languages from chat messages
|
||||
const chatLangs = new Set<string>()
|
||||
for (const msg of chatMessages) {
|
||||
const msgLang = msg.value.lang || 'ja'
|
||||
chatLangs.add(msgLang)
|
||||
if (msg.value.translations) {
|
||||
for (const lang of Object.keys(msg.value.translations)) {
|
||||
chatLangs.add(lang)
|
||||
}
|
||||
}
|
||||
}
|
||||
langList = Array.from(chatLangs)
|
||||
|
||||
html += renderLangSelector(langList)
|
||||
html += `<div id="content">${renderChatThreadPage(chatMessages, route.rkey, did, handle, aiDid, aiHandle, profile, aiProfile, pds || undefined)}</div>`
|
||||
html += `<nav class="back-nav"><a href="/@${handle}/at/chat">chat</a></nav>`
|
||||
|
||||
|
||||
@@ -75,5 +75,11 @@ export interface ChatMessage {
|
||||
createdAt: string
|
||||
root?: string
|
||||
parent?: string
|
||||
lang?: string
|
||||
translations?: {
|
||||
[lang: string]: {
|
||||
content: string
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user