fix: comprehensive i18n — replace hardcoded French/English strings with t() calls
Some checks failed
Deploy to Production / Build and Deploy (push) Failing after 1m7s

Replaced ~100+ hardcoded French and English text strings across 30+ components
with proper i18n t() calls. Added 57 new translation keys to all 15 locale files
(ar, de, en, es, fa, fr, hi, it, ja, ko, nl, pl, pt, ru, zh).

Key changes:
- contextual-ai-chat.tsx: 30 French strings → t() (actions, toasts, labels, placeholders)
- ai-chat.tsx: 15 French/English strings → t() (header, tabs, welcome, insights, history)
- note-inline-editor.tsx: 20 French fallbacks removed (toolbar, save status, checklist)
- lab-skeleton.tsx: French loading text → t()
- admin-header.tsx, header.tsx, editor-connections-section.tsx: French fallbacks removed
- New AI chat component, agent cards, sidebar, settings panel i18n cleanup

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-04-26 21:14:45 +02:00
parent e358171c45
commit 153c921960
60 changed files with 4125 additions and 1677 deletions

View File

@@ -0,0 +1,28 @@
import { NextResponse } from 'next/server'
import { auth } from '@/auth'
import prisma from '@/lib/prisma'
export async function GET(req: Request) {
try {
const session = await auth()
if (!session?.user?.id) {
return new NextResponse('Unauthorized', { status: 401 })
}
const conversations = await prisma.conversation.findMany({
where: { userId: session.user.id },
orderBy: { updatedAt: 'desc' },
take: 5,
include: {
messages: {
orderBy: { createdAt: 'asc' }
}
}
})
return NextResponse.json(conversations)
} catch (error) {
console.error('Error fetching chat history:', error)
return new NextResponse('Internal Server Error', { status: 500 })
}
}

View File

@@ -0,0 +1,44 @@
import { NextResponse } from 'next/server'
import { auth } from '@/auth'
import { prisma } from '@/lib/prisma'
import { generateText } from 'ai'
import { getChatProvider } from '@/lib/ai/factory'
import { getSystemConfig } from '@/lib/config'
export async function GET(req: Request) {
try {
const session = await auth()
if (!session?.user?.id) {
return new NextResponse('Unauthorized', { status: 401 })
}
// Fetch the 5 most recently updated notes
const notes = await prisma.note.findMany({
where: { userId: session.user.id },
orderBy: { updatedAt: 'desc' },
take: 5,
select: { title: true, content: true }
})
if (notes.length === 0) {
return NextResponse.json({ insight: "Vous n'avez pas encore de notes pour générer des insights." })
}
const context = notes.map((n, i) => `Note ${i + 1}:\nTitre: ${n.title || 'Sans titre'}\nContenu: ${n.content}`).join('\n\n')
const config = await getSystemConfig()
const provider = getChatProvider(config)
const model = provider.getModel()
const result = await generateText({
model,
system: `Tu es un assistant IA d'analyse. Ton but est de lire les 5 dernières notes de l'utilisateur et d'en dégager un résumé synthétique ou 3 insights (idées clés/tendances).
Sois concis, direct, et réponds en markdown. Le ton doit être professionnel.`,
prompt: `Voici les 5 dernières notes de l'utilisateur:\n\n${context}`
})
return NextResponse.json({ insight: result.text })
} catch (error) {
console.error('Error generating insights:', error)
return new NextResponse('Internal Server Error', { status: 500 })
}
}

View File

@@ -47,12 +47,13 @@ export async function POST(req: Request) {
// 2. Parse request body — messages arrive as UIMessage[] from DefaultChatTransport
const body = await req.json()
const { messages: rawMessages, conversationId, notebookId, language, webSearch } = body as {
const { messages: rawMessages, conversationId, notebookId, language, webSearch, noteContext } = body as {
messages: UIMessage[]
conversationId?: string
notebookId?: string
language?: string
webSearch?: boolean
noteContext?: { title: string; content: string; tone: string }
}
// Convert UIMessages to CoreMessages for streamText
@@ -146,7 +147,16 @@ export async function POST(req: Request) {
- Natural tone, neither corporate nor too casual.
- No unnecessary intro phrases ("Here's what I found", "Based on your notes"). Answer directly.
- No upsell questions at the end ("Would you like me to...", "Do you want..."). If you have useful additional info, just give it.
- If the user says "Momento" they mean Memento (this app).
- If the user says "Momento" they mean Momento (this app).
## About Momento
Momento is an intelligent note-taking application. Key features include:
- **Notes & Editor**: Create rich Markdown notes with an integrated AI Copilot to rewrite, summarize, or translate content.
- **Organization**: Group notes into Notebooks and tag them with Labels.
- **Search**: Advanced semantic search to find notes by meaning, not just keywords, and Web Search integration.
- **Agents**: Create specialized AI Agents with custom system prompts for specific recurring tasks.
- **Lab**: Experimental AI tools for data analysis and deeper insights.
If the user asks how to use this tool, explain these features simply and helpfully.
## Available tools
You have access to these tools for deeper research:
@@ -174,7 +184,16 @@ You have access to these tools for deeper research:
- Ton naturel, ni corporate ni trop familier.
- Pas de phrase d'intro inutile ("Voici ce que j'ai trouvé", "Basé sur vos notes"). Réponds directement.
- Pas de question upsell à la fin ("Souhaitez-vous que je...", "Acceptez-vous que..."). Si tu as une info complémentaire utile, donne-la.
- Si l'utilisateur dit "Momento" il parle de Memento (cette application).
- Si l'utilisateur dit "Momento" il parle de Momento (cette application).
## À propos de Momento
Momento est une application de prise de notes intelligente. Ses fonctionnalités principales :
- **Éditeur de notes** : Prise de notes en Markdown riche avec un Copilot IA intégré pour réécrire, résumer ou traduire du texte.
- **Organisation** : Regroupement des notes dans des Carnets (Notebooks) et utilisation d'Étiquettes (Labels).
- **Recherche** : Recherche sémantique avancée pour trouver des notes par le sens, et recherche Web intégrée.
- **Agents** : Création d'Agents IA spécialisés avec des instructions personnalisées pour des tâches récurrentes.
- **Lab** : Outils IA expérimentaux pour l'analyse de données et les insights.
Si l'utilisateur demande comment utiliser cet outil, explique ces fonctionnalités simplement et avec bienveillance.
## Outils disponibles
Tu as accès à ces outils pour des recherches approfondies :
@@ -301,7 +320,21 @@ Tu as accès à ces outils pour des recherches approfondies :
? prompts.contextWithNotes
: prompts.contextNoNotes
let copilotContext = ''
if (noteContext) {
copilotContext = `\n\n## Current Note Context
You are currently helping the user edit a specific note. Here is the current content of the note:
Title: ${noteContext.title || 'Untitled'}
Content:
${noteContext.content || '(empty)'}
The user wants you to write in a **${noteContext.tone || 'professional'}** tone.
Keep your suggestions tailored to this note and tone. You can suggest rewrites, answer questions about the note, or draft new sections.`
}
const systemPrompt = `${prompts.system}
${copilotContext}
${contextBlock}