feat(i18n): improve ai chat and settings localization

This commit is contained in:
poyrazavsever
2026-07-21 12:49:25 +03:00
parent 702856d942
commit fcc6f2078a
12 changed files with 521 additions and 374 deletions
+12 -8
View File
@@ -4,6 +4,8 @@ import { aiJsonError } from "@/server/ai/responses";
import { domainActorFromSession } from "@/server/auth/domain-actor";
import { getSessionContextFromHeaders } from "@/server/auth/session";
import { DomainError } from "@/server/domain/errors";
import { resolveFreelancerLocale } from "@/server/i18n/resolver";
import { createTranslator } from "@/server/i18n/translator";
import { getDomainService } from "@/server/services/runtime";
import { generateText } from "ai";
import { NextResponse } from "next/server";
@@ -11,20 +13,24 @@ import { NextResponse } from "next/server";
export const maxDuration = 120;
export async function POST(request: Request) {
let t: ReturnType<typeof createTranslator>["t"] | null = null;
try {
const context = await getSessionContextFromHeaders(new Headers(request.headers));
if (!context) {
throw new DomainError("UNAUTHENTICATED", "Oturum gerekli.");
throw new DomainError("UNAUTHENTICATED", "Authentication is required.");
}
if (context.profile.role !== "freelancer") {
throw new DomainError("FORBIDDEN", "Bu işlem yalnızca freelancer hesabına açıktır.");
throw new DomainError("FORBIDDEN", "This action is only available to freelancer accounts.");
}
const actor = domainActorFromSession(context);
const locale = await resolveFreelancerLocale(context);
t = createTranslator(locale.locale, ["finance", "common"]).t;
const analysisContext = buildFinanceAnalysisContext(getDomainService(), actor);
if (!analysisContext.hasData) {
return NextResponse.json({
text: "Son 30 güne ait finansal işlem bulunmadığı için analiz yapamıyorum. Lütfen yeni gelir veya gider ekleyin.",
text: t("finance.ai.noData"),
});
}
@@ -32,14 +38,12 @@ export async function POST(request: Request) {
const { text } = await generateText({
model: runtime.model,
timeout: runtime.timeout,
system: `Sen profesyonel bir finans danışmanısın.
Verilen finansal verilere dayanarak kısa, motive edici ve yapıcı bir finansal durum raporu sun.
Markdown başlıklar kullan, Türkçe konuş ve hukuki ya da finansal kesin hüküm verme.`,
prompt: `Aşağıdaki server-side finans özetine göre durum ve uygulanabilir öneriler sun:\n\n${analysisContext.text}`,
system: t("finance.ai.systemPrompt"),
prompt: t("finance.ai.prompt", { context: analysisContext.text }),
});
return NextResponse.json({ text });
} catch (error) {
return aiJsonError(error);
return aiJsonError(error, t ?? undefined);
}
}