@@ -594,10 +682,10 @@ function PipelineStepper({ activeIdx, t }: { activeIdx: number; t: (key: string)
/** Small stat box */
function StatBox({ icon, value, label }: { icon: React.ReactNode; value: string; label: string }) {
return (
-
-
{icon}
-
{value}
-
{label}
+
+
{icon}
+
{value}
+
{label}
);
}
diff --git a/frontend/src/app/pricing/page.tsx b/frontend/src/app/pricing/page.tsx
index ccd85fe..e1fc826 100644
--- a/frontend/src/app/pricing/page.tsx
+++ b/frontend/src/app/pricing/page.tsx
@@ -4,14 +4,13 @@ import { useState, useEffect } from "react";
import Link from "next/link";
import { useRouter, useSearchParams } from "next/navigation";
import {
- Check, X, Zap, Building2, Crown, Sparkles, ArrowRight, ArrowLeft,
- Star, Shield, Rocket, Users, Headphones, Lock, Globe,
- Clock, ChevronDown, ChevronUp, Cpu, BarChart3, Infinity,
- FileText, Layers, Brain, BadgeCheck, Gauge
+ Check, CheckCircle2, X, Zap, Building2, Crown, Sparkles, ArrowRight,
+ ArrowLeft, ChevronLeft, Star, Shield, Rocket, Users, Headphones, Lock,
+ Globe, Clock, ChevronDown, ChevronUp, Cpu, BarChart3, Infinity,
+ FileText, Layers, Brain, BadgeCheck, Gauge, Activity,
} from "lucide-react";
import { Button } from "@/components/ui/button";
import { Badge } from "@/components/ui/badge";
-import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import { cn } from "@/lib/utils";
import { API_BASE } from "@/lib/config";
import { ANNUAL_DISCOUNT_PERCENT } from "@/lib/pricing";
@@ -200,41 +199,41 @@ const STATIC_CREDITS: CreditPackage[] = [
];
/* ─────────────────────────────────────────────
- Visual config by plan
+ Visual config by plan — editorial design
───────────────────────────────────────────── */
const PLAN_ICONS: Record
= {
- free: Sparkles,
+ free: Star,
starter: Zap,
pro: Crown,
- business: Building2,
- enterprise: Rocket,
+ business: Globe,
+ enterprise: Shield,
};
-const PLAN_COLORS: Record = {
- free: { gradient: "from-slate-600 to-slate-700", border: "border-slate-700/50", badge: "bg-slate-700", button: "bg-slate-700 hover:bg-slate-600" },
- starter: { gradient: "from-blue-600 to-blue-700", border: "border-blue-700/50", badge: "bg-blue-600", button: "bg-blue-600 hover:bg-blue-500" },
- pro: { gradient: "from-violet-600 to-violet-700", border: "border-violet-500/60",badge: "bg-violet-600", button: "bg-violet-600 hover:bg-violet-500" },
- business: { gradient: "from-emerald-600 to-emerald-700",border:"border-emerald-700/50",badge:"bg-emerald-600", button: "bg-emerald-600 hover:bg-emerald-500" },
- enterprise: { gradient: "from-amber-600 to-amber-700", border: "border-amber-700/50", badge: "bg-amber-600", button: "bg-amber-600 hover:bg-amber-500" },
+const PLAN_COLORS: Record = {
+ free: { header: "bg-muted", iconColor: "text-foreground/20", nameColor: "text-foreground/40" },
+ starter: { header: "bg-foreground", iconColor: "text-white/20", nameColor: "text-white/50" },
+ pro: { header: "bg-accent", iconColor: "text-white/30", nameColor: "text-white/50" },
+ business: { header: "bg-foreground", iconColor: "text-accent/40", nameColor: "text-white/50" },
+ enterprise: { header: "bg-[#252525]", iconColor: "text-white/10", nameColor: "text-white/50" },
};
/** Avoids flash of static prices before the API responds on refresh. */
function PricingDataSkeleton() {
return (
<>
-
+
{Array.from({ length: 5 }).map((_, i) => (
-
-
))}
@@ -404,27 +403,28 @@ export default function PricingPage() {
return (
- {/* ── Top navigation ── */}
-
-
+ {/* ── Top navigation — breadcrumb bar ── */}
+
+
router.back()}
- className="inline-flex items-center gap-2 text-sm text-muted-foreground hover:text-foreground transition-colors"
+ className="flex items-center gap-3 text-[10px] font-black uppercase tracking-[0.4em] text-foreground/30 hover:text-foreground transition-all group"
>
-
+
{t('pricing.nav.back')}
-
+
+
- {isLoggedIn ? "Dashboard" : t('pricing.nav.home')}
+ Dashboard
{isLoggedIn && (
{t('pricing.nav.mySubscription')}
@@ -438,185 +438,238 @@ export default function PricingPage() {
{toastMsg.type === 'ok' ? '✓' : '✕'}
{toastMsg.text}
-
setToastMsg(null)} className="text-muted-foreground hover:text-foreground text-lg leading-none">✕
+
setToastMsg(null)} className="text-muted-foreground hover:text-foreground text-lg leading-none">×
)}
{/* ── Header ── */}
-
-
-
- {t('pricing.header.badge')}
-
-
- {t('pricing.header.title')}
+
+
+
+ {t('pricing.header.badge')}
+
+
+ {t('pricing.header.title').split(' ').slice(0, -2).join(' ')}{" "}
+
+ {t('pricing.header.title').split(' ').slice(-2).join(' ')}
+
-
+
{t('pricing.header.subtitle')}
+
- {/* Monthly / Yearly toggle */}
-
+ {/* ── Monthly / Yearly toggle ── */}
+
+
setIsYearly(false)}
- className={cn(
- "px-5 py-2 rounded-full text-sm font-medium transition-all",
- !isYearly ? "bg-foreground text-background shadow" : "text-muted-foreground hover:text-foreground"
- )}
+ className={`px-8 py-3 rounded-full text-[10px] font-black uppercase tracking-widest transition-all ${!isYearly ? 'bg-foreground text-white shadow-xl' : 'text-foreground/60 hover:text-foreground'}`}
>
{t('pricing.billing.monthly')}
setIsYearly(true)}
- className={cn(
- "px-5 py-2 rounded-full text-sm font-medium transition-all flex items-center gap-2",
- isYearly ? "bg-foreground text-background shadow" : "text-muted-foreground hover:text-foreground"
- )}
+ className={`px-8 py-3 rounded-full text-[10px] font-black uppercase tracking-widest transition-all ${isYearly ? 'bg-foreground text-white shadow-xl' : 'text-foreground/60 hover:text-foreground'}`}
>
{t('pricing.billing.yearly')}
-
- −{annualDiscountPercent} %
-
+ −{annualDiscountPercent} %
- {/* ── Plan cards (+ comparison + credits): skeleton until API responds to avoid stale price flash ── */}
-
+ {/* ── Plan cards (skeleton until API responds) ── */}
+
{!pricingLoaded ? (
) : (
<>
-
+
{plans.map((plan) => {
const Icon = PLAN_ICONS[plan.id] ?? Sparkles;
const colors = PLAN_COLORS[plan.id] ?? PLAN_COLORS.starter;
const price = displayPrice(plan);
const isCurrent = currentPlan === plan.id;
const isEnterprise = plan.id === "enterprise";
+ const isFree = plan.id === "free";
return (
- {/* Popular badge */}
- {plan.badge && (
-
- {t(plan.badge)}
-
- )}
-
- {isCurrent && (
-
- {t('pricing.card.myPlan')}
-
- )}
-
- {/* Header */}
-
-
-
-
+ {/* ── Header section ── */}
+
+ {/* Badges for popular/current plan */}
+ {plan.popular && (
+
+ {plan.badge && (
+
+ {t(plan.badge)}
+
+ )}
+ {isCurrent && (
+
+
{t('pricing.card.myPlan')}
+
+ )}
-
{t(plan.name)}
-
-
- {isEnterprise ? (
-
{t('pricing.card.onRequest')}
- ) : price === 0 ? (
-
{t('pricing.card.free')}
- ) : (
-
-
{price} €
-
{t('pricing.card.perMonth')}
+ )}
+ {plan.badge && !plan.popular && (
+
+
+ {t(plan.badge)}
+
+
+ )}
+ {/* "My Plan" badge for current non-popular plan */}
+ {isCurrent && !plan.popular && (
+
+
+
{t('pricing.card.myPlan')}
+
)}
+ {/* Icon + plan name */}
+
+
+
+ {t(plan.name)}
+
+
+
+ {/* Price */}
+
+ {isEnterprise ? (
+
+ {t('pricing.card.onRequest')}
+
+ ) : price === 0 ? (
+
+ {t('pricing.card.free')}
+
+ ) : (
+ <>
+ {price} €
+ {t('pricing.card.perMonth')}
+ >
+ )}
+
+
+ {/* Yearly billing note */}
{isYearly && plan.price_yearly > 0 && (
-
+
{t('pricing.card.billedYearly', { price: plan.price_yearly.toFixed(2) })}
)}
-
{t(plan.description || '')}
+ {/* Description */}
+
+ {t(plan.description || '')}
+
- {/* Features */}
-
- {/* Key stats */}
-
-
}
- label={t('pricing.card.documents')}
- value={plan.docs_per_month === -1 ? t('pricing.card.unlimited') : `${plan.docs_per_month} ${t('pricing.card.perMonthStat')}`}
- />
-
}
- label={t('pricing.card.pagesMax')}
- value={plan.max_pages_per_doc === -1 ? t('pricing.card.unlimited') : `${plan.max_pages_per_doc} ${t('pricing.card.perDoc')}`}
- />
+ {/* ── Content section ── */}
+
+ {/* Metrics */}
+
+
+
+
+ {t('pricing.card.documents')}
+
+
+ {plan.docs_per_month === -1 ? t('pricing.card.unlimited') : `${plan.docs_per_month} ${t('pricing.card.perMonthStat')}`}
+
+
+
+
+
+ {t('pricing.card.pagesMax')}
+
+
+ {plan.max_pages_per_doc === -1 ? t('pricing.card.unlimited') : `${plan.max_pages_per_doc} ${t('pricing.card.perDoc')}`}
+
+
{plan.ai_translation && (
-
}
- label={t('pricing.card.aiTranslation')}
- value={
- plan.ai_tier === "essential" ? t('pricing.card.aiEssential') :
- plan.ai_tier === "premium" ? t('pricing.card.aiEssentialPremium') : t('pricing.card.aiCustom')
- }
- highlight
- />
+
+
+
+
{t('pricing.card.aiTranslation')}
+
+
+ {plan.ai_tier === "essential" ? t('pricing.card.aiEssential') :
+ plan.ai_tier === "premium" ? t('pricing.card.aiEssentialPremium') :
+ t('pricing.card.aiCustom')}
+
+
)}
-
+ {/* Features list */}
+
{plan.features.map((feat, i) => (
-
-
- {t(feat)}
-
+
+
+
+
+ {t(feat)}
+
))}
-
-
+
- {/* CTA */}
-
+ {/* CTA */}
{isCurrent ? (
-
router.push("/dashboard/profile")}
+
- {t('pricing.card.managePlan')}
-
- ) : plan.id === "free" && !currentPlan ? (
-
router.push("/auth/register")}
+ {t('pricing.card.managePlan')}
+
+
+ ) : isFree && !currentPlan ? (
+
{t('pricing.card.startFree')}
-
+
+
) : (
handleSubscribe(plan.id)}
disabled={loadingPlanId !== null}
className={cn(
- "w-full py-2.5 px-4 rounded-xl text-sm font-semibold text-white transition-all flex items-center justify-center gap-2",
- colors.button,
+ "w-full py-4 rounded-2xl text-[11px] font-black uppercase tracking-widest transition-all flex items-center justify-center gap-3 border shadow-sm hover:shadow-xl active:scale-95",
+ plan.popular
+ ? "bg-muted text-foreground border-black/5 hover:bg-foreground hover:text-white"
+ : "bg-foreground text-white border-transparent hover:bg-accent",
loadingPlanId !== null && "opacity-70 cursor-not-allowed"
)}
>
@@ -631,7 +684,7 @@ export default function PricingPage() {
) : (
<>
{isEnterprise ? t('pricing.card.contactUs') : t('pricing.card.choosePlan')}
-
+
>
)}
@@ -719,7 +772,7 @@ export default function PricingPage() {
)}
{pkg.credits}
{t('pricing.credits.unit')}
-
{pkg.price} €
+
{pkg.price} €
{(pkg.price_per_credit * 100).toFixed(0)} {t('pricing.credits.centsPerCredit')}
{t('pricing.credits.buy')}
@@ -766,7 +819,7 @@ export default function PricingPage() {
{t('pricing.aiModels.essential.context')}
$0.25/$0.38 per 1M
- {t('pricing.aiModels.essential.value')}
+ {t('pricing.aiModels.essential.value')}
@@ -840,17 +893,3 @@ export default function PricingPage() {
);
}
-
-/* ── Sub-components ── */
-function Stat({ icon, label, value, highlight }: { icon: React.ReactNode; label: string; value: string; highlight?: boolean }) {
- return (
-
- {icon}
- {label} :
- {value}
-
- );
-}
diff --git a/frontend/src/lib/i18n.tsx b/frontend/src/lib/i18n.tsx
index 4fe2432..db5ecac 100644
--- a/frontend/src/lib/i18n.tsx
+++ b/frontend/src/lib/i18n.tsx
@@ -154,6 +154,12 @@ const messages: Record
> = {
"landing.pricing.business.f5": "Webhooks & automation",
"landing.pricing.business.f6": "5 team seats",
"landing.pricing.business.cta": "Contact Us",
+ "landing.pricing.free.name": "Free",
+ "landing.pricing.free.desc": "Perfect to discover the app",
+ "landing.pricing.free.cta": "Choose this plan",
+ "landing.pricing.enterprise.name": "Enterprise",
+ "landing.pricing.enterprise.desc": "Custom solutions for large organizations",
+ "landing.pricing.enterprise.cta": "Contact us",
"landing.cta.title": "Start translating in 30 seconds",
"landing.cta.subtitle": "No credit card required. Try for free now and bring your multilingual documents back to life.",
"landing.cta.button": "Create Free Account",
@@ -746,6 +752,22 @@ const messages: Record> = {
"landing.hero.liveAnalysis": "Live Analysis",
"landing.hero.termsDetected": "terms detected",
"landing.steps.process": "PROCESS",
+ "landing.translate.newProject": "New Project",
+ "landing.translate.title": "Translate a document",
+ "landing.translate.subtitle": "Import a file and choose the target language",
+ "landing.translate.sourceDocument": "Source Document",
+ "landing.translate.configuration": "Configuration",
+ "landing.translate.sourceLang": "Source Language",
+ "landing.translate.targetLang": "Target Language",
+ "landing.translate.provider": "Provider",
+ "landing.translate.startTranslation": "Start Translation",
+ "landing.translate.zeroRetention": "Zero retention",
+ "landing.translate.filesDeleted": "Files deleted after processing",
+ "landing.translate.dropHere": "Drag & drop here",
+ "landing.translate.supportedFormats": "DOCX, XLSX, PPTX or PDF files supported",
+ "landing.translate.aiAnalysis": "Active AI Analysis",
+ "landing.translate.processing": "Processing",
+ "landing.translate.preservingLayout": "Your layout is being preserved",
},
fr: {
@@ -1483,6 +1505,22 @@ const messages: Record> = {
"landing.hero.liveAnalysis": "Analyse en direct",
"landing.hero.termsDetected": "termes détectés",
"landing.steps.process": "PROCESSUS",
+ "landing.translate.newProject": "Nouveau projet",
+ "landing.translate.title": "Traduire un document",
+ "landing.translate.subtitle": "Importez un fichier et choisissez la langue cible",
+ "landing.translate.sourceDocument": "Document source",
+ "landing.translate.configuration": "Configuration",
+ "landing.translate.sourceLang": "Langue source",
+ "landing.translate.targetLang": "Langue cible",
+ "landing.translate.provider": "Fournisseur",
+ "landing.translate.startTranslation": "Lancer la traduction",
+ "landing.translate.zeroRetention": "Rétention zéro",
+ "landing.translate.filesDeleted": "Fichiers supprimés après traitement",
+ "landing.translate.dropHere": "Glissez-déposez ici",
+ "landing.translate.supportedFormats": "Fichiers DOCX, XLSX, PPTX ou PDF supportés",
+ "landing.translate.aiAnalysis": "Analyse IA Active",
+ "landing.translate.processing": "Traitement en cours",
+ "landing.translate.preservingLayout": "Votre mise en page est en cours de préservation",
},
// ═══════════════════════════════════════════════════════════════
// SPANISH (es)
@@ -2164,6 +2202,22 @@ const messages: Record> = {
"landing.hero.liveAnalysis": "Análisis en vivo",
"landing.hero.termsDetected": "términos detectados",
"landing.steps.process": "PROCESO",
+ "landing.translate.newProject": "Nuevo proyecto",
+ "landing.translate.title": "Traducir un documento",
+ "landing.translate.subtitle": "Importa un archivo y elige el idioma de destino",
+ "landing.translate.sourceDocument": "Documento fuente",
+ "landing.translate.configuration": "Configuración",
+ "landing.translate.sourceLang": "Idioma de origen",
+ "landing.translate.targetLang": "Idioma de destino",
+ "landing.translate.provider": "Proveedor",
+ "landing.translate.startTranslation": "Iniciar traducción",
+ "landing.translate.zeroRetention": "Retención cero",
+ "landing.translate.filesDeleted": "Archivos eliminados tras el procesamiento",
+ "landing.translate.dropHere": "Arrastra y suelta aquí",
+ "landing.translate.supportedFormats": "Archivos DOCX, XLSX, PPTX o PDF compatibles",
+ "landing.translate.aiAnalysis": "Análisis IA Activo",
+ "landing.translate.processing": "Procesando",
+ "landing.translate.preservingLayout": "Tu diseño se está preservando",
},
// ═══════════════════════════════════════════════════════════════
// GERMAN (de)
@@ -2845,6 +2899,22 @@ const messages: Record> = {
"landing.hero.liveAnalysis": "Live-Analyse",
"landing.hero.termsDetected": "Begriffe erkannt",
"landing.steps.process": "PROZESS",
+ "landing.translate.newProject": "Neues Projekt",
+ "landing.translate.title": "Dokument übersetzen",
+ "landing.translate.subtitle": "Datei importieren und Zielsprache wählen",
+ "landing.translate.sourceDocument": "Quelldokument",
+ "landing.translate.configuration": "Konfiguration",
+ "landing.translate.sourceLang": "Quellsprache",
+ "landing.translate.targetLang": "Zielsprache",
+ "landing.translate.provider": "Anbieter",
+ "landing.translate.startTranslation": "Übersetzung starten",
+ "landing.translate.zeroRetention": "Keine Speicherung",
+ "landing.translate.filesDeleted": "Dateien nach Verarbeitung gelöscht",
+ "landing.translate.dropHere": "Hier ablegen",
+ "landing.translate.supportedFormats": "DOCX, XLSX, PPTX oder PDF Dateien unterstützt",
+ "landing.translate.aiAnalysis": "KI-Analyse aktiv",
+ "landing.translate.processing": "Verarbeitung läuft",
+ "landing.translate.preservingLayout": "Ihr Layout wird beibehalten",
},
// ═══════════════════════════════════════════════════════════════
// PORTUGUESE – BRAZILIAN (pt)
@@ -3526,6 +3596,22 @@ const messages: Record> = {
"landing.hero.liveAnalysis": "Análise em tempo real",
"landing.hero.termsDetected": "termos detectados",
"landing.steps.process": "PROCESSO",
+ "landing.translate.newProject": "Novo projeto",
+ "landing.translate.title": "Traduzir um documento",
+ "landing.translate.subtitle": "Importe um arquivo e escolha o idioma de destino",
+ "landing.translate.sourceDocument": "Documento fonte",
+ "landing.translate.configuration": "Configuração",
+ "landing.translate.sourceLang": "Idioma de origem",
+ "landing.translate.targetLang": "Idioma de destino",
+ "landing.translate.provider": "Fornecedor",
+ "landing.translate.startTranslation": "Iniciar tradução",
+ "landing.translate.zeroRetention": "Retenção zero",
+ "landing.translate.filesDeleted": "Ficheiros eliminados após processamento",
+ "landing.translate.dropHere": "Arraste e solte aqui",
+ "landing.translate.supportedFormats": "Ficheiros DOCX, XLSX, PPTX ou PDF suportados",
+ "landing.translate.aiAnalysis": "Análise IA Ativa",
+ "landing.translate.processing": "Em processamento",
+ "landing.translate.preservingLayout": "O seu layout está a ser preservado",
},
// ═══════════════════════════════════════════════════════════════
// ITALIAN (it)
@@ -4207,6 +4293,22 @@ const messages: Record> = {
"landing.hero.liveAnalysis": "Analisi in tempo reale",
"landing.hero.termsDetected": "termini rilevati",
"landing.steps.process": "PROCESSO",
+ "landing.translate.newProject": "Nuovo progetto",
+ "landing.translate.title": "Traduci un documento",
+ "landing.translate.subtitle": "Importa un file e scegli la lingua di destinazione",
+ "landing.translate.sourceDocument": "Documento sorgente",
+ "landing.translate.configuration": "Configurazione",
+ "landing.translate.sourceLang": "Lingua sorgente",
+ "landing.translate.targetLang": "Lingua di destinazione",
+ "landing.translate.provider": "Fornitore",
+ "landing.translate.startTranslation": "Avvia traduzione",
+ "landing.translate.zeroRetention": "Zero conservazione",
+ "landing.translate.filesDeleted": "File eliminati dopo l'elaborazione",
+ "landing.translate.dropHere": "Trascina e rilascia qui",
+ "landing.translate.supportedFormats": "File DOCX, XLSX, PPTX o PDF supportati",
+ "landing.translate.aiAnalysis": "Analisi IA Attiva",
+ "landing.translate.processing": "Elaborazione in corso",
+ "landing.translate.preservingLayout": "Il tuo layout viene preservato",
},
// ═══════════════════════════════════════════════════════════════
// DUTCH (nl)
@@ -4888,6 +4990,22 @@ const messages: Record> = {
"landing.hero.liveAnalysis": "Live-analyse",
"landing.hero.termsDetected": "termen gedetecteerd",
"landing.steps.process": "PROCES",
+ "landing.translate.newProject": "Nieuw project",
+ "landing.translate.title": "Vertaal een document",
+ "landing.translate.subtitle": "Importeer een bestand en kies de doeltaal",
+ "landing.translate.sourceDocument": "Brondocument",
+ "landing.translate.configuration": "Configuratie",
+ "landing.translate.sourceLang": "Brontaal",
+ "landing.translate.targetLang": "Doeltaal",
+ "landing.translate.provider": "Provider",
+ "landing.translate.startTranslation": "Vertaling starten",
+ "landing.translate.zeroRetention": "Nul retentie",
+ "landing.translate.filesDeleted": "Bestanden verwijderd na verwerking",
+ "landing.translate.dropHere": "Sleep en zet hier neer",
+ "landing.translate.supportedFormats": "DOCX, XLSX, PPTX of PDF bestanden ondersteund",
+ "landing.translate.aiAnalysis": "Actieve AI-analyse",
+ "landing.translate.processing": "Verwerking bezig",
+ "landing.translate.preservingLayout": "Uw opmaak wordt behouden",
},
// ═══════════════════════════════════════════════════════════════
// RUSSIAN (ru)
@@ -5571,6 +5689,22 @@ const messages: Record> = {
"landing.hero.liveAnalysis": "Анализ в реальном времени",
"landing.hero.termsDetected": "терминов обнаружено",
"landing.steps.process": "ПРОЦЕСС",
+ "landing.translate.newProject": "Новый проект",
+ "landing.translate.title": "Перевести документ",
+ "landing.translate.subtitle": "Импортируйте файл и выберите целевой язык",
+ "landing.translate.sourceDocument": "Исходный документ",
+ "landing.translate.configuration": "Настройки",
+ "landing.translate.sourceLang": "Исходный язык",
+ "landing.translate.targetLang": "Целевой язык",
+ "landing.translate.provider": "Провайдер",
+ "landing.translate.startTranslation": "Начать перевод",
+ "landing.translate.zeroRetention": "Нулевое хранение",
+ "landing.translate.filesDeleted": "Файлы удаляются после обработки",
+ "landing.translate.dropHere": "Перетащите сюда",
+ "landing.translate.supportedFormats": "Поддерживаются файлы DOCX, XLSX, PPTX или PDF",
+ "landing.translate.aiAnalysis": "Активный ИИ-анализ",
+ "landing.translate.processing": "Обработка",
+ "landing.translate.preservingLayout": "Ваше форматирование сохраняется",
},
// ═══════════════════════════════════════════════════════════════
// JAPANESE (ja)
@@ -6251,6 +6385,22 @@ const messages: Record> = {
"landing.hero.liveAnalysis": "リアルタイム分析",
"landing.hero.termsDetected": "件の用語を検出",
"landing.steps.process": "プロセス",
+ "landing.translate.newProject": "新規プロジェクト",
+ "landing.translate.title": "ドキュメントを翻訳",
+ "landing.translate.subtitle": "ファイルをインポートして翻訳先言語を選択",
+ "landing.translate.sourceDocument": "ソースドキュメント",
+ "landing.translate.configuration": "設定",
+ "landing.translate.sourceLang": "翻訳元言語",
+ "landing.translate.targetLang": "翻訳先言語",
+ "landing.translate.provider": "プロバイダー",
+ "landing.translate.startTranslation": "翻訳を開始",
+ "landing.translate.zeroRetention": "ゼロ保持",
+ "landing.translate.filesDeleted": "処理後にファイルを削除",
+ "landing.translate.dropHere": "ここにドラッグ&ドロップ",
+ "landing.translate.supportedFormats": "DOCX, XLSX, PPTX, PDFファイル対応",
+ "landing.translate.aiAnalysis": "AI分析アクティブ",
+ "landing.translate.processing": "処理中",
+ "landing.translate.preservingLayout": "レイアウトを保持しています",
},
// ═══════════════════════════════════════════════════════════════
// KOREAN (ko)
@@ -6931,6 +7081,22 @@ const messages: Record> = {
"landing.hero.liveAnalysis": "실시간 분석",
"landing.hero.termsDetected": "개 용어 감지됨",
"landing.steps.process": "프로세스",
+ "landing.translate.newProject": "새 프로젝트",
+ "landing.translate.title": "문서 번역",
+ "landing.translate.subtitle": "파일을 가져오고 대상 언어를 선택하세요",
+ "landing.translate.sourceDocument": "원본 문서",
+ "landing.translate.configuration": "설정",
+ "landing.translate.sourceLang": "원본 언어",
+ "landing.translate.targetLang": "대상 언어",
+ "landing.translate.provider": "제공자",
+ "landing.translate.startTranslation": "번역 시작",
+ "landing.translate.zeroRetention": "제로 보관",
+ "landing.translate.filesDeleted": "처리 후 파일 삭제됨",
+ "landing.translate.dropHere": "여기에 드래그 앤 드롭",
+ "landing.translate.supportedFormats": "DOCX, XLSX, PPTX 또는 PDF 파일 지원",
+ "landing.translate.aiAnalysis": "AI 분석 활성",
+ "landing.translate.processing": "처리 중",
+ "landing.translate.preservingLayout": "레이아웃이 보존되고 있습니다",
},
// ═══════════════════════════════════════════════════════════════
// CHINESE SIMPLIFIED (zh)
@@ -7569,6 +7735,22 @@ const messages: Record> = {
"landing.hero.liveAnalysis": "实时分析",
"landing.hero.termsDetected": "个术语已检测",
"landing.steps.process": "流程",
+ "landing.translate.newProject": "新项目",
+ "landing.translate.title": "翻译文档",
+ "landing.translate.subtitle": "导入文件并选择目标语言",
+ "landing.translate.sourceDocument": "源文档",
+ "landing.translate.configuration": "配置",
+ "landing.translate.sourceLang": "源语言",
+ "landing.translate.targetLang": "目标语言",
+ "landing.translate.provider": "提供商",
+ "landing.translate.startTranslation": "开始翻译",
+ "landing.translate.zeroRetention": "零保留",
+ "landing.translate.filesDeleted": "处理后删除文件",
+ "landing.translate.dropHere": "拖放到此处",
+ "landing.translate.supportedFormats": "支持 DOCX, XLSX, PPTX 或 PDF 文件",
+ "landing.translate.aiAnalysis": "AI 分析中",
+ "landing.translate.processing": "正在处理",
+ "landing.translate.preservingLayout": "正在保留您的排版",
},
// ARABIC (ar)
@@ -8207,6 +8389,22 @@ const messages: Record> = {
"landing.hero.liveAnalysis": "تحليل مباشر",
"landing.hero.termsDetected": "مصطلحات مكتشفة",
"landing.steps.process": "العملية",
+ "landing.translate.newProject": "مشروع جديد",
+ "landing.translate.title": "ترجمة مستند",
+ "landing.translate.subtitle": "استورد ملفًا واختر اللغة المستهدفة",
+ "landing.translate.sourceDocument": "المستند المصدر",
+ "landing.translate.configuration": "الإعدادات",
+ "landing.translate.sourceLang": "لغة المصدر",
+ "landing.translate.targetLang": "اللغة المستهدفة",
+ "landing.translate.provider": "المزود",
+ "landing.translate.startTranslation": "بدء الترجمة",
+ "landing.translate.zeroRetention": "صفر احتفاظ",
+ "landing.translate.filesDeleted": "الملفات محذوفة بعد المعالجة",
+ "landing.translate.dropHere": "اسحب وأفلت هنا",
+ "landing.translate.supportedFormats": "ملفات DOCX, XLSX, PPTX أو PDF مدعومة",
+ "landing.translate.aiAnalysis": "تحليل AI نشط",
+ "landing.translate.processing": "جاري المعالجة",
+ "landing.translate.preservingLayout": "جاري الحفاظ على التنسيق",
},
// PERSIAN (fa)
@@ -8881,6 +9079,22 @@ const messages: Record> = {
"landing.hero.liveAnalysis": "تحلیل زنده",
"landing.hero.termsDetected": "اصطلاح شناسایی شد",
"landing.steps.process": "فرآیند",
+ "landing.translate.newProject": "پروژه جدید",
+ "landing.translate.title": "ترجمه سند",
+ "landing.translate.subtitle": "فایل را وارد کنید و زبان مقصد را انتخاب کنید",
+ "landing.translate.sourceDocument": "سند منبع",
+ "landing.translate.configuration": "پیکربندی",
+ "landing.translate.sourceLang": "زبان منبع",
+ "landing.translate.targetLang": "زبان مقصد",
+ "landing.translate.provider": "ارائهدهنده",
+ "landing.translate.startTranslation": "شروع ترجمه",
+ "landing.translate.zeroRetention": "صفر نگهداری",
+ "landing.translate.filesDeleted": "فایلها پس از پردازش حذف میشوند",
+ "landing.translate.dropHere": "اینجا بکشید و رها کنید",
+ "landing.translate.supportedFormats": "فایلهای DOCX, XLSX, PPTX یا PDF پشتیبانی میشوند",
+ "landing.translate.aiAnalysis": "تحلیل AI فعال",
+ "landing.translate.processing": "در حال پردازش",
+ "landing.translate.preservingLayout": "طرحبندی شما حفظ میشود",
},
};