From 05c5dfcbbbecb696f0250956d829f1dafb1670d5 Mon Sep 17 00:00:00 2001 From: sepehr Date: Sun, 10 May 2026 15:17:22 +0200 Subject: [PATCH] fix: add frontend/src/lib/ to git (was ignored by /lib/ pattern) The root .gitignore had `lib/` which matched frontend/src/lib/, causing Docker build to fail with "Module not found: Can't resolve '@/lib/utils'" and '@/lib/i18n'. Changed to `/lib/` so it only ignores the Python lib at repo root. Co-Authored-By: Claude Opus 4.7 --- .gitignore | 4 +- frontend/src/lib/api.ts | 161 + frontend/src/lib/apiClient.ts | 63 + frontend/src/lib/config.ts | 4 + frontend/src/lib/i18n.tsx | 8687 +++++++++++++++++++++++++++++++++ frontend/src/lib/pricing.ts | 6 + frontend/src/lib/store.ts | 135 + frontend/src/lib/types.ts | 5 + frontend/src/lib/utils.ts | 6 + frontend/src/lib/webllm.ts | 46 + 10 files changed, 9115 insertions(+), 2 deletions(-) create mode 100644 frontend/src/lib/api.ts create mode 100644 frontend/src/lib/apiClient.ts create mode 100644 frontend/src/lib/config.ts create mode 100644 frontend/src/lib/i18n.tsx create mode 100644 frontend/src/lib/pricing.ts create mode 100644 frontend/src/lib/store.ts create mode 100644 frontend/src/lib/types.ts create mode 100644 frontend/src/lib/utils.ts create mode 100644 frontend/src/lib/webllm.ts diff --git a/.gitignore b/.gitignore index 1608cb8..b96035e 100644 --- a/.gitignore +++ b/.gitignore @@ -10,8 +10,8 @@ dist/ downloads/ eggs/ .eggs/ -lib/ -lib64/ +/lib/ +/lib64/ parts/ sdist/ var/ diff --git a/frontend/src/lib/api.ts b/frontend/src/lib/api.ts new file mode 100644 index 0000000..20fd9fd --- /dev/null +++ b/frontend/src/lib/api.ts @@ -0,0 +1,161 @@ +import { API_BASE } from "./config"; + +export interface TranslatedText { + id: string; + translated_text: string; +} + +export interface Language { + code: string; + name: string; + flag: string; +} + +export interface Provider { + id: string; + name: string; + icon?: string; + description?: string; + mode?: "classic" | "llm"; +} + +export const languages: Language[] = [ + { code: "fr", name: "Français", flag: "🇫🇷" }, + { code: "en", name: "English", flag: "🇬🇧" }, + { code: "de", name: "Deutsch", flag: "🇩🇪" }, + { code: "es", name: "Español", flag: "🇪🇸" }, + { code: "it", name: "Italiano", flag: "🇮🇹" }, + { code: "pt", name: "Português", flag: "🇵🇹" }, + { code: "nl", name: "Nederlands", flag: "🇳🇱" }, + { code: "ru", name: "Русский", flag: "🇷🇺" }, + { code: "zh", name: "中文", flag: "🇨🇳" }, + { code: "ja", name: "日本語", flag: "🇯🇵" }, + { code: "ko", name: "한국어", flag: "🇰🇷" }, + { code: "ar", name: "العربية", flag: "🇸🇦" }, + { code: "fa", name: "فارسی", flag: "🇮🇷" }, + { code: "hi", name: "हिन्दी", flag: "🇮🇳" }, + { code: "tr", name: "Türkçe", flag: "🇹🇷" }, + { code: "pl", name: "Polski", flag: "🇵🇱" }, + { code: "sv", name: "Svenska", flag: "🇸🇪" }, + { code: "da", name: "Dansk", flag: "🇩🇰" }, + { code: "fi", name: "Suomi", flag: "🇫🇮" }, + { code: "no", name: "Norsk", flag: "🇳🇴" }, + { code: "cs", name: "Čeština", flag: "🇨🇿" }, + { code: "ro", name: "Română", flag: "🇷🇴" }, + { code: "hu", name: "Magyar", flag: "🇭🇺" }, + { code: "el", name: "Ελληνικά", flag: "🇬🇷" }, + { code: "he", name: "עברית", flag: "🇮🇱" }, + { code: "th", name: "ไทย", flag: "🇹🇭" }, + { code: "vi", name: "Tiếng Việt", flag: "🇻🇳" }, + { code: "id", name: "Bahasa Indonesia", flag: "🇮🇩" }, + { code: "uk", name: "Українська", flag: "🇺🇦" }, +]; + +export const providers: Provider[] = [ + { id: "google", name: "Google Translate", description: "Fast translation, 130+ languages" }, + { id: "deepl", name: "DeepL", description: "High-quality neural translation" }, + { id: "openai", name: "OpenAI", description: "GPT-powered context-aware translation", mode: "llm" }, + { id: "ollama", name: "Ollama (Local)", description: "Self-hosted LLM translation", mode: "llm" }, + { id: "openrouter", name: "OpenRouter", description: "Multi-model AI translation", mode: "llm" }, +]; + +export async function translateDocument(params: { + file: File; + targetLanguage: string; + provider: string; + ollamaModel?: string; + translateImages?: boolean; + systemPrompt?: string; + glossary?: string; + libreUrl?: string; + openaiApiKey?: string; + openaiModel?: string; + openrouterApiKey?: string; + openrouterModel?: string; +}): Promise { + const formData = new FormData(); + formData.append("file", params.file); + formData.append("target_language", params.targetLanguage); + formData.append("provider", params.provider); + if (params.ollamaModel) formData.append("ollama_model", params.ollamaModel); + if (params.translateImages !== undefined) + formData.append("translate_images", String(params.translateImages)); + if (params.systemPrompt) formData.append("system_prompt", params.systemPrompt); + if (params.glossary) formData.append("glossary", params.glossary); + if (params.libreUrl) formData.append("libre_url", params.libreUrl); + + const token = + typeof window !== "undefined" ? localStorage.getItem("token") : null; + const headers: Record = {}; + if (token) headers["Authorization"] = `Bearer ${token}`; + + const res = await fetch(`${API_BASE}/api/v1/translate`, { + method: "POST", + headers, + body: formData, + }); + + if (!res.ok) { + let msg = `HTTP ${res.status}`; + try { + const j = await res.json(); + msg = j.message || j.error || msg; + } catch {} + throw new Error(msg); + } + + return res.blob(); +} + +export async function extractTextsFromDocument( + file: File, +): Promise<{ texts: Array<{ id: string; text: string }>; session_id: string }> { + const formData = new FormData(); + formData.append("file", file); + + const token = + typeof window !== "undefined" ? localStorage.getItem("token") : null; + const headers: Record = {}; + if (token) headers["Authorization"] = `Bearer ${token}`; + + const res = await fetch(`${API_BASE}/api/v1/extract`, { + method: "POST", + headers, + body: formData, + }); + + if (!res.ok) { + throw new Error(`Extraction failed: HTTP ${res.status}`); + } + + return res.json(); +} + +export async function reconstructDocument( + sessionId: string, + translations: TranslatedText[], + targetLanguage: string, +): Promise { + const token = + typeof window !== "undefined" ? localStorage.getItem("token") : null; + const headers: Record = { + "Content-Type": "application/json", + }; + if (token) headers["Authorization"] = `Bearer ${token}`; + + const res = await fetch(`${API_BASE}/api/v1/reconstruct`, { + method: "POST", + headers, + body: JSON.stringify({ + session_id: sessionId, + translations, + target_language: targetLanguage, + }), + }); + + if (!res.ok) { + throw new Error(`Reconstruction failed: HTTP ${res.status}`); + } + + return res.blob(); +} diff --git a/frontend/src/lib/apiClient.ts b/frontend/src/lib/apiClient.ts new file mode 100644 index 0000000..8a4d85f --- /dev/null +++ b/frontend/src/lib/apiClient.ts @@ -0,0 +1,63 @@ +import { API_BASE } from "./config"; + +export class ApiClientError extends Error { + status: number; + code?: string; + + constructor(status: number, message: string, code?: string) { + super(message); + this.name = "ApiClientError"; + this.status = status; + this.code = code; + } +} + +async function request( + method: string, + url: string, + body?: unknown, +): Promise { + const headers: Record = {}; + + const token = + typeof window !== "undefined" ? localStorage.getItem("token") : null; + if (token) { + headers["Authorization"] = `Bearer ${token}`; + } + + if (body !== undefined) { + headers["Content-Type"] = "application/json"; + } + + const res = await fetch(`${API_BASE}${url}`, { + method, + headers, + body: body !== undefined ? JSON.stringify(body) : undefined, + }); + + if (!res.ok) { + let message = `HTTP ${res.status}`; + let code: string | undefined; + try { + const json = await res.json(); + message = json.message || json.error || json.detail || message; + code = json.code; + } catch {} + throw new ApiClientError(res.status, message, code); + } + + if (res.status === 204) return undefined as T; + + const json = await res.json(); + return json as T; +} + +export const apiClient = { + get: (url: string) => request("GET", url), + post: (url: string, body?: unknown) => request("POST", url, body), + patch: (url: string, body?: unknown) => request("PATCH", url, body), + put: (url: string, body?: unknown) => request("PUT", url, body), + delete: (url: string) => request("DELETE", url), +}; + +export const API_BASE_URL = API_BASE; diff --git a/frontend/src/lib/config.ts b/frontend/src/lib/config.ts new file mode 100644 index 0000000..576f9e8 --- /dev/null +++ b/frontend/src/lib/config.ts @@ -0,0 +1,4 @@ +export const API_BASE = + typeof window !== "undefined" + ? (process.env.NEXT_PUBLIC_API_URL || window.location.origin) + : (process.env.BACKEND_URL || "http://localhost:8000"); diff --git a/frontend/src/lib/i18n.tsx b/frontend/src/lib/i18n.tsx new file mode 100644 index 0000000..80d22d0 --- /dev/null +++ b/frontend/src/lib/i18n.tsx @@ -0,0 +1,8687 @@ +"use client"; + +import { + createContext, + useContext, + useState, + useCallback, + useEffect, + type ReactNode, +} from "react"; + +export type Locale = "en" | "fr" | "es" | "de" | "pt" | "it" | "nl" | "ru" | "ja" | "ko" | "zh" | "ar" | "fa"; + +const VALID_LOCALES: ReadonlyArray = ["en", "fr", "es", "de", "pt", "it", "nl", "ru", "ja", "ko", "zh", "ar", "fa"]; + +type TranslationParams = Record; + +const messages: Record> = { + + en: { +"auth.brandName": "Office Translator", + "dashboard.nav.translate": "Translate", + "dashboard.nav.profile": "My Profile", + "dashboard.nav.settings": "Settings", + "dashboard.nav.context": "Context", + "dashboard.nav.services": "Services", + "dashboard.nav.apiKeys": "API Keys", + "dashboard.nav.glossaries": "Glossaries", + "dashboard.header.title": "Dashboard", + "dashboard.header.subtitle": "Manage your translations", + "dashboard.header.toggleMenu": "Menu", + "dashboard.header.profileTitle": "My profile", + "dashboard.sidebar.theme": "Theme", + "dashboard.sidebar.signOut": "Sign Out", + "dashboard.sidebar.backHome": "Back to Home", + "dashboard.translate.pageTitle": "Translate a document", + "dashboard.translate.pageSubtitle": + "Import a file and choose the target language", + "dashboard.translate.errorNotificationTitle": "Error", + "dashboard.translate.dropzone.uploadAria": "File drop zone", + "dashboard.translate.dropzone.title": "Drag & drop your file here", + "dashboard.translate.dropzone.subtitle": + "or click to select (DOCX, XLSX, PPTX, PDF)", + "dashboard.translate.dropzone.replaceFile": "Replace file", + "dashboard.translate.language.source": "Source language", + "dashboard.translate.language.target": "Target language", + "dashboard.translate.language.loading": "Loading languages…", + "dashboard.translate.language.autoDetect": "Auto-detect", + "dashboard.translate.language.selectPlaceholder": "Select…", + "dashboard.translate.language.loadErrorPrefix": + "Failed to load languages", + "dashboard.translate.provider.loading": "Loading providers…", + "dashboard.translate.provider.noneConfigured": "No providers configured", + "dashboard.translate.provider.modelTitle": "Model", + "dashboard.translate.provider.sectionTitle": "Provider", + "dashboard.translate.provider.llmDivider": "AI · Context-Aware", + "dashboard.translate.provider.llmDividerPro": + "AI · Context-Aware (Pro)", + "dashboard.translate.provider.upgrade": "Upgrade to Pro", + "dashboard.translate.provider.upgradeSuffix": + "to unlock AI translation", + "dashboard.translate.trust.zeroRetention": "Zero retention", + "dashboard.translate.trust.deletedAfter": + "Files deleted after processing", + "dashboard.translate.actions.uploading": "Uploading…", + "dashboard.translate.actions.translate": "Translate", + "dashboard.translate.actions.filePrefix": "File: ", + "dashboard.translate.actions.cancel": "Cancel", + "dashboard.translate.actions.tryAgain": "Try Again", + "dashboard.translate.steps.uploading": "Uploading file…", + "dashboard.translate.steps.starting": "Starting translation…", + "dashboard.translate.complete.title": "Translation complete!", + "dashboard.translate.complete.descNamed": + "Your file {name} has been translated successfully.", + "dashboard.translate.complete.descGeneric": + "Your file has been translated successfully.", + "dashboard.translate.complete.downloading": "Downloading…", + "dashboard.translate.complete.download": "Download", + "dashboard.translate.complete.newTranslation": "New Translation", + "dashboard.translate.complete.toastOkTitle": "Success", + "dashboard.translate.complete.toastFailTitle": "Failed", + "dashboard.translate.complete.toastFailDesc": + "Translation failed. Please try again.", + "dashboard.translate.sourceDocument": "Source Document", + "dashboard.translate.configuration": "Configuration", + "dashboard.translate.translating": "Translation in progress", + "dashboard.translate.liveMonitor": "Live Monitor", + "dashboard.translate.summary": "Summary", + "dashboard.translate.engine": "Engine", + "dashboard.translate.confidence": "Confidence", + "dashboard.translate.cancel": "Cancel", + "dashboard.translate.segments": "Segments", + "dashboard.translate.characters": "Characters", + "dashboard.translate.elapsed": "Elapsed", + "dashboard.translate.segPerMin": "Seg/min", + "dashboard.translate.highQuality": "High quality", + "dashboard.translate.quality": "Quality", + "dashboard.translate.completed": "Translation complete", + "dashboard.translate.replace": "Replace", + "dashboard.translate.pdfMode.title": "PDF Translation Mode", + "dashboard.translate.pdfMode.preserveLayout": "Preserve Layout", + "dashboard.translate.pdfMode.textOnly": "Text Only", + "dashboard.translate.pdfMode.preserveLayoutDesc": "Keeps images, tables & formatting. Best for simple PDFs.", + "dashboard.translate.pdfMode.textOnlyDesc": "Translates all text perfectly. Clean output, no layout issues.", + "dashboard.translate.pipeline.upload": "Upload", + "dashboard.translate.pipeline.analyze": "Analyze", + "dashboard.translate.pipeline.translate": "Translation", + "dashboard.translate.pipeline.rebuild": "Rebuild", + "dashboard.translate.pipeline.finalize": "Finalize", + "dashboard.translate.progress.failedTitle": "Translation failed", + "glossaries.dialog.title": "New glossary", + "glossaries.dialog.description": "Create a glossary for your translations", + "glossaries.dialog.nameLabel": "Name", + "glossaries.dialog.namePlaceholder": "My glossary", + "glossaries.dialog.tabTemplates": "Templates", + "glossaries.dialog.tabFile": "File", + "glossaries.dialog.tabManual": "Manual", + "glossaries.dialog.cancel": "Cancel", + "glossaries.dialog.creating": "Creating…", + "glossaries.dialog.importing": "Importing…", + "glossaries.dialog.importBtn": "Import", + "glossaries.dialog.selectPrompt": "Select", + "glossaries.dialog.createBtn": "Create", + "glossaries.dialog.createEmpty": "Create empty", + "glossaries.dialog.terms": "terms", + "glossaries.dialog.templatesDesc": "Choose a predefined template", + "glossaries.dialog.templatesEmpty": "No templates available", + "glossaries.dialog.dropTitle": "Drag a CSV file here", + "glossaries.dialog.dropOr": "or", + "glossaries.dialog.dropFormats": "CSV, TSV, TXT", + "glossaries.dialog.formatTitle": "Format", + "glossaries.dialog.formatDesc": "source,target (one per line)", + "glossaries.dialog.formatNote": "First line skipped if header detected", + "glossaries.dialog.errorFormat": "Unsupported format", + "glossaries.dialog.errorSize": "File too large", + "glossaries.dialog.errorEmpty": "Empty file", + "glossaries.dialog.errorRead": "Read error", + "glossaries.dialog.parsing": "Parsing…", + "glossaries.dialog.termsImported": "terms imported", + "glossaries.dialog.changeFile": "Change file", + "glossaries.dialog.retry": "Retry", + + // ── Pricing page ── + "pricing.nav.back": "Back", + "pricing.nav.home": "Home", + "pricing.nav.mySubscription": "My Subscription", + + "pricing.header.badge": "AI Models Updated — March 2026", + "pricing.header.title": "A plan for every need", + "pricing.header.subtitle": "Translate your Word, Excel and PowerPoint documents while preserving the original layout. No API key required.", + "pricing.billing.monthly": "Monthly", + "pricing.billing.yearly": "Yearly", + + "pricing.plans.free.name": "Free", + "pricing.plans.starter.name": "Starter", + "pricing.plans.pro.name": "Pro", + "pricing.plans.business.name": "Business", + "pricing.plans.enterprise.name": "Enterprise", + + "pricing.plans.free.description": "Perfect for discovering the app", + "pricing.plans.starter.description": "For individuals and small projects", + "pricing.plans.pro.description": "For professionals and growing teams", + "pricing.plans.business.description": "For teams and organizations", + "pricing.plans.enterprise.description": "Custom solutions for large organizations", + + "pricing.plans.pro.highlight": "Most popular", + "pricing.plans.pro.badge": "POPULAR", + "pricing.plans.enterprise.badge": "ON REQUEST", + + "pricing.plans.free.feat1": "5 documents / month", + "pricing.plans.free.feat2": "Up to 15 pages per document", + "pricing.plans.free.feat3": "Google Translation included", + "pricing.plans.free.feat4": "All languages (130+)", + "pricing.plans.free.feat5": "Community support", + + "pricing.plans.starter.feat1": "50 documents / month", + "pricing.plans.starter.feat2": "Up to 50 pages per document", + "pricing.plans.starter.feat3": "Google Translation + DeepL", + "pricing.plans.starter.feat4": "Files up to 10 MB", + "pricing.plans.starter.feat5": "Email support", + "pricing.plans.starter.feat6": "30-day history", + + "pricing.plans.pro.feat1": "200 documents / month", + "pricing.plans.pro.feat2": "Up to 200 pages per document", + "pricing.plans.pro.feat3": "Essential AI Translation (DeepSeek V3.2)", + "pricing.plans.pro.feat4": "Google Translation + DeepL", + "pricing.plans.pro.feat5": "Files up to 25 MB", + "pricing.plans.pro.feat6": "Custom glossaries", + "pricing.plans.pro.feat7": "Priority support", + "pricing.plans.pro.feat8": "90-day history", + + "pricing.plans.business.feat1": "1,000 documents / month", + "pricing.plans.business.feat2": "Up to 500 pages per document", + "pricing.plans.business.feat3": "Essential + Premium AI (Claude Haiku)", + "pricing.plans.business.feat4": "All translation providers", + "pricing.plans.business.feat5": "Files up to 50 MB", + "pricing.plans.business.feat6": "API access (10,000 calls/month)", + "pricing.plans.business.feat7": "Notification webhooks", + "pricing.plans.business.feat8": "Dedicated support", + "pricing.plans.business.feat9": "1-year history", + "pricing.plans.business.feat10": "Advanced analytics", + + "pricing.plans.enterprise.feat1": "Unlimited documents", + "pricing.plans.enterprise.feat2": "All AI models (GPT-5, Claude Opus 4.6…)", + "pricing.plans.enterprise.feat3": "On-premise or dedicated cloud deployment", + "pricing.plans.enterprise.feat4": "99.9% SLA guaranteed", + "pricing.plans.enterprise.feat5": "24/7 dedicated support", + "pricing.plans.enterprise.feat6": "White-label", + "pricing.plans.enterprise.feat7": "Unlimited teams", + "pricing.plans.enterprise.feat8": "Custom integrations", + + "pricing.card.onRequest": "On request", + "pricing.card.free": "Free", + "pricing.card.perMonth": "/month", + "pricing.card.billedYearly": "Billed {price} € / year", + "pricing.card.documents": "Documents", + "pricing.card.pagesMax": "Max pages", + "pricing.card.aiTranslation": "AI Translation", + "pricing.card.unlimited": "Unlimited", + "pricing.card.perMonthStat": "/ month", + "pricing.card.perDoc": "p / doc", + "pricing.card.aiEssential": "Essential", + "pricing.card.aiEssentialPremium": "Essential + Premium", + "pricing.card.aiCustom": "Custom", + "pricing.card.myPlan": "My Plan", + "pricing.card.managePlan": "Manage my plan", + "pricing.card.startFree": "Start for free", + "pricing.card.contactUs": "Contact us", + "pricing.card.choosePlan": "Choose this plan", + "pricing.card.processing": "Processing…", + + "pricing.comparison.title": "Detailed comparison", + "pricing.comparison.subtitle": "Everything included in each plan", + "pricing.comparison.feature": "Feature", + "pricing.comparison.docsPerMonth": "Documents / month", + "pricing.comparison.pagesMaxPerDoc": "Max pages / document", + "pricing.comparison.maxFileSize": "Max file size", + "pricing.comparison.googleTranslation": "Google Translation", + "pricing.comparison.deepl": "DeepL", + "pricing.comparison.aiEssential": "Essential AI Translation", + "pricing.comparison.aiPremium": "Premium AI Translation", + "pricing.comparison.apiAccess": "API Access", + "pricing.comparison.priorityProcessing": "Priority processing", + "pricing.comparison.support": "Support", + "pricing.comparison.support.community": "Community", + "pricing.comparison.support.email": "Email", + "pricing.comparison.support.priority": "Priority", + "pricing.comparison.support.dedicated": "Dedicated", + "pricing.comparison.mb": "MB", + + "pricing.credits.title": "Additional credits", + "pricing.credits.subtitle": "Need more? Buy credits individually, no subscription.", + "pricing.credits.perPage": "1 credit = 1 translated page.", + "pricing.credits.bestValue": "Best value", + "pricing.credits.unit": "credits", + "pricing.credits.centsPerCredit": "cts / credit", + "pricing.credits.buy": "Buy", + + "pricing.trust.encryption.title": "End-to-end encryption", + "pricing.trust.encryption.sub": "TLS 1.3 + AES-256 at rest", + "pricing.trust.languages.title": "130+ languages", + "pricing.trust.languages.sub": "Including Arabic, Persian, Hebrew (RTL)", + "pricing.trust.parallel.title": "Parallel processing", + "pricing.trust.parallel.sub": "Ultra-fast multi-threaded AI", + "pricing.trust.availability.title": "Available 24/7", + "pricing.trust.availability.sub": "99.9% guaranteed uptime", + + "pricing.aiModels.title": "Our AI Models — March 2026", + "pricing.aiModels.essential.title": "Essential AI Translation", + "pricing.aiModels.essential.plan": "Pro Plan", + "pricing.aiModels.essential.descPrefix": "Based on", + "pricing.aiModels.essential.descSuffix": "— the most cost-effective AI model of 2026. Quality comparable to frontier models at 1/50th of the cost.", + "pricing.aiModels.essential.context": "163K tokens of context", + "pricing.aiModels.essential.value": "Excellent value for money", + "pricing.aiModels.premium.title": "Premium AI Translation", + "pricing.aiModels.premium.plan": "Business Plan", + "pricing.aiModels.premium.descPrefix": "Based on", + "pricing.aiModels.premium.descSuffix": "by Anthropic — accurate on legal, medical and complex technical documents.", + "pricing.aiModels.premium.context": "200K tokens of context", + "pricing.aiModels.premium.precision": "Best accuracy", + + "pricing.faq.title": "Frequently asked questions", + "pricing.faq.q1": "Can I change plans at any time?", + "pricing.faq.a1": "Yes. Upgrading is immediate and prorated. Downgrading takes effect at the end of the current period.", + "pricing.faq.q2": "What is \"Essential AI Translation\"?", + "pricing.faq.a2": "It's our AI engine based on DeepSeek V3.2 via OpenRouter. It understands your documents' context, preserves layout and handles technical terms much better than classic translation.", + "pricing.faq.q3": "What's the difference between Essential and Premium AI?", + "pricing.faq.a3": "Essential AI uses DeepSeek V3.2 (excellent value for money). Premium AI uses Anthropic's Claude 3.5 Haiku, more accurate on legal, medical and complex technical documents.", + "pricing.faq.q4": "Are my documents kept after translation?", + "pricing.faq.a4": "Translated files are available according to your plan (30 days Starter, 90 days Pro, 1 year Business). They are encrypted at rest and in transit.", + "pricing.faq.q5": "What happens if I exceed my monthly quota?", + "pricing.faq.a5": "You can buy additional credits individually, or upgrade your plan. You are notified at 80% usage.", + "pricing.faq.q6": "Is there a free trial for paid plans?", + "pricing.faq.a6": "The Free plan is permanent and requires no credit card. For Pro and Business plans, contact us for a 14-day trial.", + "pricing.faq.q7": "What file formats are supported?", + "pricing.faq.a7": "Word (.docx), Excel (.xlsx/.xls), PowerPoint (.pptx), and soon PDF. All plans support the same formats.", + + "pricing.cta.title": "Ready to start?", + "pricing.cta.subtitle": "Start for free, no credit card required. Upgrade when you need to.", + "pricing.cta.createAccount": "Create a free account", + "pricing.cta.login": "Sign in", + + "pricing.toast.demo": "Demo mode — Stripe is not yet configured. In production, you would be redirected to payment to activate the {planId} plan.", + "pricing.toast.networkError": "Network error. Please try again.", + "pricing.toast.paymentError": "Error creating payment.", + + // ── Register page ── + "register.title": "Create an account", + "register.subtitle": "Start translating for free", + "register.error.failed": "Registration failed", + + "register.name.label": "Name", + "register.name.placeholder": "Your name", + "register.name.error": "Name must be at least 2 characters", + + "register.email.label": "Email address", + "register.email.placeholder": "you@example.com", + "register.email.error": "Invalid email address", + + "register.password.label": "Password", + "register.password.error": "Password must be at least 8 characters with an uppercase, a lowercase and a digit", + "register.password.show": "Show password", + "register.password.hide": "Hide password", + "register.password.strengthLabel": "Strength:", + "register.password.strength.weak": "Weak", + "register.password.strength.medium": "Medium", + "register.password.strength.strong": "Strong", + + "register.confirmPassword.label": "Confirm password", + "register.confirmPassword.error": "Passwords do not match", + "register.confirmPassword.show": "Show", + "register.confirmPassword.hide": "Hide", + + "register.submit.creating": "Creating account...", + "register.submit.create": "Create my account", + + "register.hasAccount": "Already have an account?", + "register.login": "Sign in", + + "register.terms.prefix": "By creating an account, you accept our", + "register.terms.link": "terms of service", + + // ── Landing page ── + "landing.nav.whyUs": "Why Us", + "landing.nav.formats": "Formats", + "landing.nav.pricing": "Pricing", + "landing.nav.login": "Log in", + "landing.nav.startFree": "Start Free", + "landing.hero.badge": "New: PDF support + AI-powered translation", + "landing.hero.title1": "Translate Your Documents.", + "landing.hero.title2": "Keep the Formatting Perfect.", + "landing.hero.subtitle": "The only translator that preserves SmartArt, charts, tables of contents, shapes, headers & footers — exactly as they were. No surprises at checkout.", + "landing.hero.cta": "Start Free — 2 docs/month", + "landing.hero.seePlans": "See Plans", + "landing.trust.filesDeleted": "Files deleted after 60 min", + "landing.trust.noBait": "No bait-and-switch pricing", + "landing.trust.preview": "Preview before you pay", + "landing.why.title": "Your formatting, perfectly preserved", + "landing.why.subtitle": "Other translators break your layout. We don't.", + "landing.why.smartart.title": "SmartArt & Diagrams", + "landing.why.smartart.desc": "Organizational charts, flowcharts, hierarchy diagrams — all translated in place.", + "landing.why.toc.title": "Tables of Contents", + "landing.why.toc.desc": "TOC entries, page numbers, and cross-references are all updated correctly.", + "landing.why.charts.title": "Charts & Graphs", + "landing.why.charts.desc": "Titles, axis labels, legends, and series names — everything gets translated.", + "landing.why.shapes.title": "Shapes & Text Boxes", + "landing.why.shapes.desc": "Rectangles, rounded boxes, callouts — we find and translate text inside all shapes.", + "landing.why.headers.title": "Headers & Footers", + "landing.why.headers.desc": "Page headers, footers, and footnote text are never missed.", + "landing.why.languages.title": "130+ Languages", + "landing.why.languages.desc": "Google Translate, DeepL, and AI-powered engines for professional quality.", + "landing.pricing.title": "Simple, honest pricing", + "landing.pricing.subtitle": "What you see is what you pay. No hidden fees after translation.", + "landing.pricing.monthly": "Monthly", + "landing.pricing.yearly": "Yearly", + "landing.pricing.starter.title": "Starter", + "landing.pricing.starter.desc": "For individuals and small projects", + "landing.pricing.starter.f1": "50 documents / month", + "landing.pricing.starter.f2": "Up to 50 pages per document", + "landing.pricing.starter.f3": "Google Translate + DeepL", + "landing.pricing.starter.f4": "Files up to 10 MB", + "landing.pricing.starter.cta": "Get Started", + "landing.pricing.pro.title": "Pro", + "landing.pricing.pro.badge": "Most Popular", + "landing.pricing.pro.desc": "For professionals who need quality", + "landing.pricing.pro.f1": "200 documents / month", + "landing.pricing.pro.f2": "Up to 200 pages per document", + "landing.pricing.pro.f3": "AI-powered translation (DeepSeek)", + "landing.pricing.pro.f4": "Google + DeepL included", + "landing.pricing.pro.f5": "Custom glossaries & prompts", + "landing.pricing.pro.f6": "Priority support", + "landing.pricing.pro.cta": "Try Pro", + "landing.pricing.business.title": "Business", + "landing.pricing.business.desc": "For teams with high-volume needs", + "landing.pricing.business.f1": "1,000 documents / month", + "landing.pricing.business.f2": "Up to 500 pages per document", + "landing.pricing.business.f3": "Premium AI (Claude)", + "landing.pricing.business.f4": "All providers + API access", + "landing.pricing.business.f5": "Webhooks & automation", + "landing.pricing.business.f6": "5 team seats", + "landing.pricing.business.cta": "Contact Us", + "landing.pricing.honest": "The price shown is the price you pay. No hidden charges after translation.", + "landing.pricing.billedYearly": "billed yearly", + "landing.pricing.perMonth": "/mo", + "landing.formats.title": "Every format, every element", + "landing.formats.subtitle": "We translate what others miss.", + "landing.formats.word": "Word (.docx)", + "landing.formats.word.f1": "Paragraphs & headings", + "landing.formats.word.f2": "Tables & charts", + "landing.formats.word.f3": "SmartArt diagrams", + "landing.formats.word.f4": "Table of contents", + "landing.formats.word.f5": "Headers & footers", + "landing.formats.word.f6": "Shapes & text boxes", + "landing.formats.word.f7": "Footnotes & endnotes", + "landing.formats.excel": "Excel (.xlsx)", + "landing.formats.excel.f1": "Cell values", + "landing.formats.excel.f2": "Sheet names", + "landing.formats.excel.f3": "Charts & labels", + "landing.formats.excel.f4": "Headers & footers", + "landing.formats.excel.f5": "Merged cells preserved", + "landing.formats.powerpoint": "PowerPoint (.pptx)", + "landing.formats.powerpoint.f1": "Slide text & notes", + "landing.formats.powerpoint.f2": "Charts & diagrams", + "landing.formats.powerpoint.f3": "Shapes & text boxes", + "landing.formats.powerpoint.f4": "Master layouts", + "landing.formats.powerpoint.f5": "Animations preserved", + "landing.formats.pdf": "PDF", + "landing.formats.pdf.f1": "Text-based PDFs", + "landing.formats.pdf.f2": "Layout preserved", + "landing.formats.pdf.f3": "Images kept in place", + "landing.formats.pdf.f4": "Tables maintained", + "landing.formats.pdf.f5": "Output as DOCX or PDF", + "landing.cta.title": "Start translating in 30 seconds", + "landing.cta.subtitle": "No credit card required. Try 2 documents for free and see the difference.", + "landing.cta.button": "Create Free Account", + "landing.footer.privacy": "Privacy", + "landing.footer.terms": "Terms", + "landing.footer.contact": "Contact", + + // ── AI Engine section ── + "landing.ai.badge": "AI-Powered Translation Engine", + "landing.ai.title": "Translation that understands your craft", + "landing.ai.subtitle": "Our AI models analyze context, respect your terminology, and even translate text inside images.", + "landing.ai.context.title": "Industry Context", + "landing.ai.context.desc": "Describe your field and get tailored translations, not generic ones.", + "landing.ai.glossary.title": "Industry Glossaries", + "landing.ai.glossary.desc": "Define your technical terms. CTA stays \"Air Handling Unit\", never \"Call To Action\".", + "landing.ai.vision.title": "Image Vision", + "landing.ai.vision.desc": "Text embedded in images, diagrams and charts is detected and translated.", + "landing.ai.comparison.source": "Source (FR)", + "landing.ai.comparison.google": "Google Translate", + "landing.ai.comparison.ai": "Our AI", + "landing.ai.comparison.sourceText": "La batterie de chauffe est raccordée sur la CTA", + "landing.ai.comparison.googleText": "The heating battery is connected on the call to action", + "landing.ai.comparison.aiText": "The heating coil is connected to the AHU", + + // ── How it works section ── + "landing.howItWorks.title": "How it works", + "landing.howItWorks.subtitle": "Three steps. Zero formatting loss.", + "landing.howItWorks.step1.title": "Upload your file", + "landing.howItWorks.step1.desc": "Drag & drop your Excel, Word, PowerPoint or PDF document.", + "landing.howItWorks.step2.title": "Pick language & engine", + "landing.howItWorks.step2.desc": "Select target language and engine — standard or context-aware AI.", + "landing.howItWorks.step3.title": "Download the result", + "landing.howItWorks.step3.desc": "Get your translated document with formatting identical to the original.", + + "login.errorTitle": "Login Error", + "login.welcomeBack": "Welcome back", + "login.signInToContinue": "Sign in to continue translating", + "login.email": "Email", + "login.emailPlaceholder": "you@example.com", + "login.password": "Password", + "login.forgotPassword": "Forgot password?", + "login.passwordPlaceholder": "••••••••", + "login.signingIn": "Signing in...", + "login.signIn": "Sign In", + "login.noAccount": "Don't have an account?", + "login.signUpFree": "Sign up for free", + "forgotPassword.enterEmail": "Please enter your email address", + "forgotPassword.error": "An error occurred", + "forgotPassword.title": "Forgot Password", + "forgotPassword.checkEmail": "Check your inbox", + "forgotPassword.subtitle": "Enter your email to receive a reset link", + "forgotPassword.sentMessage": "If an account exists with this address, a reset email has been sent.", + "forgotPassword.emailLabel": "Email address", + "forgotPassword.emailPlaceholder": "you@example.com", + "forgotPassword.sending": "Sending...", + "forgotPassword.sendLink": "Send reset link", + "forgotPassword.backToLogin": "Back to login", + "forgotPassword.loading": "Loading...", + "resetPassword.passwordRequirements": "Password must contain at least 8 characters, one uppercase, one lowercase, and one number", + "resetPassword.passwordMismatch": "Passwords do not match", + "resetPassword.tokenMissing": "Missing token. Please use the link received by email.", + "resetPassword.error": "An error occurred", + "resetPassword.invalidLink": "Invalid link", + "resetPassword.invalidLinkMessage": "This reset link is invalid. Please request a new one.", + "resetPassword.requestNewLink": "Request new link", + "resetPassword.successTitle": "Password reset", + "resetPassword.newPasswordTitle": "New password", + "resetPassword.successSubtitle": "You will be redirected to login", + "resetPassword.subtitle": "Set your new password", + "resetPassword.successMessage": "Your password has been successfully reset. You will be redirected to the login page.", + "resetPassword.newPassword": "New password", + "resetPassword.showPassword": "Show password", + "resetPassword.hidePassword": "Hide password", + "resetPassword.confirmPassword": "Confirm password", + "resetPassword.resetting": "Resetting...", + "resetPassword.resetPassword": "Reset password", + "resetPassword.backToLogin": "Back to login", + "resetPassword.loading": "Loading...", + + // ── Common ── + "common.loading": "Loading...", + + // ── Profile ── + "profile.header.title": "My Profile", + "profile.header.subtitle": "Manage your account and preferences.", + "profile.tabs.account": "Account", + "profile.tabs.subscription": "Subscription", + "profile.tabs.preferences": "Preferences", + "profile.account.user": "User", + "profile.account.memberSince": "Member since", + "profile.plan.label": "Plan", + "profile.plan.free": "Free", + "profile.plan.starter": "Starter", + "profile.plan.pro": "Pro", + "profile.plan.business": "Business", + "profile.plan.enterprise": "Enterprise", + "profile.plan.pricePerMonth": "{price} €/month", + "profile.subscription.canceling": "Canceling", + "profile.subscription.active": "Active", + "profile.subscription.unknown": "Unknown", + "profile.subscription.accessUntil": "Access until", + "profile.subscription.renewalOn": "Renewal on", + "profile.subscription.upgradePlan": "Upgrade to a paid plan", + "profile.subscription.changePlan": "Change plan", + "profile.subscription.manageBilling": "Manage billing", + "profile.subscription.billingUnavailable": "Billing portal unavailable.", + "profile.subscription.billingError": "Error accessing billing portal.", + "profile.subscription.cancelSuccess": "Subscription canceled. You keep access until the end of the period.", + "profile.subscription.cancelError": "Error during cancellation.", + "profile.subscription.networkError": "Network error.", + "profile.usage.title": "Usage this month", + "profile.usage.resetOn": "Reset on", + "profile.usage.documents": "Documents", + "profile.usage.pages": "Pages", + "profile.usage.extraCredits": "extra credit", + "profile.usage.extraCreditsPlural": "extra credits", + "profile.usage.quotaReached": "Quota reached", + "profile.usage.quotaReachedDesc": "Upgrade to a higher plan to continue.", + "profile.usage.unlockMore": "Unlock more translations with a paid plan.", + "profile.usage.viewPlans": "View plans", + "profile.usage.includedInPlan": "Included in your plan", + "profile.danger.title": "Danger zone", + "profile.danger.description": "Cancellation takes effect at the end of your current period. You keep access until that date.", + "profile.danger.confirm": "Are you sure? This action cannot be undone.", + "profile.danger.confirmCancel": "Confirm cancellation", + "profile.danger.cancelSubscription": "Cancel my subscription", + "profile.danger.keep": "No, keep", + "profile.prefs.interfaceLang": "Interface language", + "profile.prefs.interfaceLangDesc": "The language is automatically detected based on your browser. You can change it manually.", + "profile.prefs.defaultTargetLang": "Default target language", + "profile.prefs.selectLanguage": "Select a language", + "profile.prefs.defaultTargetLangDesc": "This language will be pre-selected for your translations.", + "profile.prefs.save": "Save", + "profile.prefs.theme": "Theme", + "profile.prefs.themeDesc": "Choose the interface appearance", + "profile.prefs.cache": "Cache", + "profile.prefs.cacheDesc": "Clearing the local cache can fix some display issues.", + "profile.prefs.clearing": "Clearing...", + "profile.prefs.clearCache": "Clear cache", + + // ── Settings ── + "settings.title": "Settings", + "settings.subtitle": "General application configuration", + "settings.formats.title": "Supported formats", + "settings.formats.subtitle": "Document types you can translate", + "settings.formats.formulas": "Formulas", + "settings.formats.styles": "Styles", + "settings.formats.images": "Images", + "settings.formats.headers": "Headers", + "settings.formats.tables": "Tables", + "settings.formats.slides": "Slides", + "settings.formats.notes": "Notes", + "settings.cache.title": "Cache", + "settings.cache.desc": "Clearing the local cache can fix some display issues.", + "settings.cache.clearing": "Clearing...", + "settings.cache.clear": "Clear cache", + + // ── Services ── + "services.title": "Translation Providers", + "services.subtitle": "Providers are configured by the administrator. You can see which ones are currently available for your account.", + "services.loading": "Loading providers...", + "services.noProviders": "No providers are currently configured. Contact your administrator.", + "services.classic": "Classic Translation", + "services.llmPro": "LLM · Context-Aware (Pro)", + "services.available": "Available", + "services.model": "Model", + "services.adminOnly.title": "Provider configuration is admin-only", + "services.adminOnly.desc": "API keys, model selection, and provider activation are managed exclusively by the administrator in the admin panel. You never need to enter an API key.", + + // ── API Keys ── + "apiKeys.title": "API Keys", + "apiKeys.subtitle": "Manage your API keys for programmatic access to the translation API.", + "apiKeys.loading": "Loading...", + "apiKeys.sectionTitle": "API & Automation", + "apiKeys.sectionDesc": "Generate and manage your API keys for automation workflows", + "apiKeys.keysUsed": "{total} of {max} keys used", + "apiKeys.maxReached": "Maximum keys reached. Revoke a key to generate a new one.", + "apiKeys.canGenerate": "You can generate {count} more key", + "apiKeys.canGeneratePlural": "You can generate {count} more keys", + "apiKeys.generateNew": "Generate New Key", + "apiKeys.keyRevoked": "Key revoked", + "apiKeys.keyRevokedDesc": "The API key has been revoked successfully.", + "apiKeys.keyNotFound": "Key Not Found", + "apiKeys.keyNotFoundDesc": "The API key no longer exists. It may have already been revoked.", + "apiKeys.error": "Error", + "apiKeys.revokeError": "Failed to revoke the API key. Please try again.", + "apiKeys.limitReached": "Limit Reached", + "apiKeys.limitReachedDesc": "You have reached the maximum of 10 API keys. Revoke an existing key to generate a new one.", + "apiKeys.proRequired": "Pro Feature Required", + "apiKeys.proRequiredDesc": "API keys are a Pro feature. Please upgrade your account.", + "apiKeys.generateError": "Failed to generate API key. Please try again.", + "apiKeys.upgrade.title": "API Keys", + "apiKeys.upgrade.subtitle": "Automate your translations with API access", + "apiKeys.upgrade.feat1": "Generate unlimited API keys", + "apiKeys.upgrade.feat2": "Automate document translation", + "apiKeys.upgrade.feat3": "Webhook notifications", + "apiKeys.upgrade.feat4": "LLM translation modes", + "apiKeys.upgrade.proFeature": "API Keys are a {pro} feature. Upgrade to unlock API automation.", + "apiKeys.upgrade.pro": "Pro", + "apiKeys.upgrade.cta": "Upgrade to Pro", + "apiKeys.dialog.maxTitle": "Maximum Keys Reached", + "apiKeys.dialog.maxDesc": "You have reached the maximum of 10 API keys. Please revoke an existing key before generating a new one.", + "apiKeys.dialog.close": "Close", + "apiKeys.dialog.generated": "API Key Generated!", + "apiKeys.dialog.generatedDesc": "Your new API key has been created. Copy it now - it won't be shown again.", + "apiKeys.dialog.important": "Important:", + "apiKeys.dialog.importantDesc": "This is the only time you'll see this key. Store it securely.", + "apiKeys.dialog.apiKey": "API Key", + "apiKeys.dialog.name": "Name:", + "apiKeys.dialog.done": "Done", + "apiKeys.dialog.copied": "I've copied the key", + "apiKeys.dialog.generateTitle": "Generate New API Key", + "apiKeys.dialog.generateDesc": "Create a new API key for programmatic access to the translation API.", + "apiKeys.dialog.keyName": "Key Name (optional)", + "apiKeys.dialog.keyNamePlaceholder": "e.g., Production, Staging", + "apiKeys.dialog.keyNameHint": "A descriptive name to help you identify this key later.", + "apiKeys.dialog.nameTooLong": "Name must be {max} characters or less", + "apiKeys.dialog.nameInvalid": "Name can only contain letters, numbers, spaces, hyphens, and underscores", + "apiKeys.dialog.cancel": "Cancel", + "apiKeys.dialog.generating": "Generating...", + "apiKeys.dialog.generate": "Generate Key", + "apiKeys.table.name": "Name", + "apiKeys.table.prefix": "Prefix", + "apiKeys.table.created": "Created", + "apiKeys.table.lastUsed": "Last used", + "apiKeys.table.never": "Never", + "apiKeys.table.actions": "Actions", + "apiKeys.table.revoke": "Revoke", + "apiKeys.table.copyPrefix": "Copy key prefix", + "apiKeys.table.revokeKey": "Revoke key", + "apiKeys.revokeDialog.title": "Revoke API Key", + "apiKeys.revokeDialog.desc": "Are you sure you want to revoke the key \"{name}\"? This action cannot be undone.", + "apiKeys.revokeDialog.confirm": "Yes, revoke", + "apiKeys.revokeDialog.cancel": "Cancel", + + // ── Context & Glossary ── + "context.proTitle": "Pro Feature", + "context.proDesc": "Context and professional glossaries are available with Pro, Business and Enterprise plans. They provide more accurate translations through instructions and vocabulary specific to your domain.", + "context.viewPlans": "View plans", + "context.title": "Context & Glossary", + "context.subtitle": "Improve translation quality with instructions and vocabulary specific to your domain.", + "context.presets.title": "Professional glossaries", + "context.presets.desc": "Load a complete glossary with instructions and specialized terminology", + "context.instructions.title": "Context instructions", + "context.instructions.desc": "Instructions the AI will follow during translation", + "context.instructions.placeholder": "E.g.: You translate HVAC technical documents. Use precise engineering terminology...", + "context.glossary.title": "Technical glossary", + "context.glossary.desc": "Format: source=target (one per line). Glossaries loaded via preset are editable.", + "context.glossary.terms": "terms in the glossary", + "context.clearAll": "Clear all", + "context.saving": "Saving...", + "context.save": "Save", + + // ── Admin ── + "admin.login.title": "Administration", + "admin.login.required": "Login required", + "admin.login.password": "Admin password", + "admin.login.connecting": "Connecting...", + "admin.login.access": "Access admin panel", + "admin.login.restricted": "Restricted to administrators", + "admin.layout.checking": "Verifying authentication...", + "admin.dashboard.title": "Admin Dashboard", + "admin.dashboard.subtitle": "Administrator control panel", + "admin.dashboard.refresh": "Refresh", + "admin.dashboard.refreshTooltip": "Refresh dashboard data", + "admin.dashboard.config": "System Configuration", + "admin.dashboard.maxFileSize": "Max file size:", + "admin.dashboard.translationService": "Translation service:", + "admin.dashboard.formats": "Formats:", + "admin.nav.dashboard": "Dashboard", + "admin.nav.users": "Users", + "admin.nav.pricing": "Pricing & Stripe", + "admin.nav.providers": "Providers", + "admin.nav.system": "System", + "admin.nav.logs": "Logs", + "admin.users.title": "User Management", + "admin.users.subtitle": "View and manage user accounts", + "admin.users.planUpdated": "Plan updated", + "admin.users.planChanged": "The plan has been changed to \"{plan}\" successfully.", + "admin.users.unknownError": "Unknown error", + "admin.users.error": "Error", + "admin.users.planUpdateError": "Unable to update plan: {message}", + "admin.users.noKeys": "No keys", + "admin.users.noKeysDesc": "This user has no active API keys.", + "admin.users.keysRevoked": "Keys revoked", + "admin.users.keysRevokedDesc": "{count} API key(s) revoked successfully.", + "admin.users.revokeError": "Unable to revoke keys: {message}", + "admin.users.retry": "Retry", + "admin.system.title": "System", + "admin.system.subtitle": "Monitor system status and manage resources", + "admin.system.quotas": "Translation quotas", + "admin.system.resetQuotas": "Reset monthly quotas", + "admin.system.resetting": "Resetting...", + "admin.system.reset": "Reset", + "admin.system.allOperational": "All Systems Operational", + "admin.system.issuesDetected": "System Issues Detected", + "admin.system.waitingData": "Waiting for data...", + "admin.system.purging": "Purging...", + "admin.system.clean": "Clean", + "admin.system.purge": "Purge", + }, + + fr: { +"auth.brandName": "Office Translator", + "dashboard.nav.translate": "Traduire", + "dashboard.nav.profile": "Mon Profil", + "dashboard.nav.settings": "Paramètres", + "dashboard.nav.context": "Contexte", + "dashboard.nav.services": "Services", + "dashboard.nav.apiKeys": "Clés API", + "dashboard.nav.glossaries": "Glossaires", + "dashboard.header.title": "Dashboard", + "dashboard.header.subtitle": "Gérez vos traductions", + "dashboard.header.toggleMenu": "Menu", + "dashboard.header.profileTitle": "Mon profil", + "dashboard.sidebar.theme": "Thème", + "dashboard.sidebar.signOut": "Déconnexion", + "dashboard.sidebar.backHome": "Retour à l'accueil", + "dashboard.translate.pageTitle": "Traduire un document", + "dashboard.translate.pageSubtitle": + "Importez un fichier et choisissez la langue cible", + "dashboard.translate.errorNotificationTitle": "Erreur", + "dashboard.translate.dropzone.uploadAria": "Zone de dépôt de fichier", + "dashboard.translate.dropzone.title": "Glissez-déposez votre fichier ici", + "dashboard.translate.dropzone.subtitle": + "ou cliquez pour sélectionner (DOCX, XLSX, PPTX, PDF)", + "dashboard.translate.dropzone.replaceFile": "Remplacer le fichier", + "dashboard.translate.language.source": "Langue source", + "dashboard.translate.language.target": "Langue cible", + "dashboard.translate.language.loading": "Chargement des langues…", + "dashboard.translate.language.autoDetect": "Auto-détection", + "dashboard.translate.language.selectPlaceholder": "Sélectionner…", + "dashboard.translate.language.loadErrorPrefix": + "Erreur de chargement des langues", + "dashboard.translate.provider.loading": "Chargement des fournisseurs…", + "dashboard.translate.provider.noneConfigured": + "Aucun fournisseur configuré", + "dashboard.translate.provider.modelTitle": "Modèle", + "dashboard.translate.provider.sectionTitle": "Fournisseur", + "dashboard.translate.provider.llmDivider": "IA · Context-Aware", + "dashboard.translate.provider.llmDividerPro": + "IA · Context-Aware (Pro)", + "dashboard.translate.provider.upgrade": "Passer Pro", + "dashboard.translate.provider.upgradeSuffix": + "pour débloquer la traduction IA", + "dashboard.translate.trust.zeroRetention": "Rétention zéro", + "dashboard.translate.trust.deletedAfter": + "Fichiers supprimés après traitement", + "dashboard.translate.actions.uploading": "Chargement…", + "dashboard.translate.actions.translate": "Traduire", + "dashboard.translate.actions.filePrefix": "Fichier : ", + "dashboard.translate.actions.cancel": "Annuler", + "dashboard.translate.actions.tryAgain": "Réessayer", + "dashboard.translate.steps.uploading": "Chargement du fichier…", + "dashboard.translate.steps.starting": "Démarrage de la traduction…", + "dashboard.translate.complete.title": "Traduction terminée !", + "dashboard.translate.complete.descNamed": + "Votre fichier {name} a été traduit avec succès.", + "dashboard.translate.complete.descGeneric": + "Votre fichier a été traduit avec succès.", + "dashboard.translate.complete.downloading": "Téléchargement…", + "dashboard.translate.complete.download": "Télécharger", + "dashboard.translate.complete.newTranslation": "Nouvelle traduction", + "dashboard.translate.complete.toastOkTitle": "Succès", + "dashboard.translate.complete.toastFailTitle": "Échec", + "dashboard.translate.complete.toastFailDesc": + "La traduction a échoué. Veuillez réessayer.", + "dashboard.translate.sourceDocument": "Document source", + "dashboard.translate.configuration": "Configuration", + "dashboard.translate.translating": "Traduction en cours", + "dashboard.translate.liveMonitor": "Moniteur en direct", + "dashboard.translate.summary": "Résumé", + "dashboard.translate.engine": "Moteur", + "dashboard.translate.confidence": "Confiance", + "dashboard.translate.cancel": "Annuler", + "dashboard.translate.segments": "Segments", + "dashboard.translate.characters": "Caractères", + "dashboard.translate.elapsed": "Écoulé", + "dashboard.translate.segPerMin": "Seg/min", + "dashboard.translate.highQuality": "Haute qualité", + "dashboard.translate.quality": "Qualité", + "dashboard.translate.completed": "Traduction terminée", + "dashboard.translate.replace": "Remplacer", + "dashboard.translate.pdfMode.title": "Mode de traduction PDF", + "dashboard.translate.pdfMode.preserveLayout": "Préserver la mise en page", + "dashboard.translate.pdfMode.textOnly": "Texte uniquement", + "dashboard.translate.pdfMode.preserveLayoutDesc": "Conserve les images, tableaux et formatage. Idéal pour les PDF simples.", + "dashboard.translate.pdfMode.textOnlyDesc": "Traduit tout le texte parfaitement. Sortie propre, sans problème de mise en page.", + "dashboard.translate.pipeline.upload": "Upload", + "dashboard.translate.pipeline.analyze": "Analyse", + "dashboard.translate.pipeline.translate": "Traduction", + "dashboard.translate.pipeline.rebuild": "Reconstruction", + "dashboard.translate.pipeline.finalize": "Finalisation", + "dashboard.translate.progress.failedTitle": "Traduction échouée", + "glossaries.dialog.title": "Nouveau glossaire", + "glossaries.dialog.description": "Créez un glossaire pour vos traductions", + "glossaries.dialog.nameLabel": "Nom", + "glossaries.dialog.namePlaceholder": "Mon glossaire", + "glossaries.dialog.tabTemplates": "Modèles", + "glossaries.dialog.tabFile": "Fichier", + "glossaries.dialog.tabManual": "Manuel", + "glossaries.dialog.cancel": "Annuler", + "glossaries.dialog.creating": "Création…", + "glossaries.dialog.importing": "Import…", + "glossaries.dialog.importBtn": "Importer", + "glossaries.dialog.selectPrompt": "Sélectionner", + "glossaries.dialog.createBtn": "Créer", + "glossaries.dialog.createEmpty": "Créer vide", + "glossaries.dialog.terms": "termes", + "glossaries.dialog.templatesDesc": + "Choisissez un modèle prédéfini", + "glossaries.dialog.templatesEmpty": "Aucun modèle disponible", + "glossaries.dialog.dropTitle": "Glissez un fichier CSV ici", + "glossaries.dialog.dropOr": "ou", + "glossaries.dialog.dropFormats": "CSV, TSV, TXT", + "glossaries.dialog.formatTitle": "Format", + "glossaries.dialog.formatDesc": + "source,target (un par ligne)", + "glossaries.dialog.formatNote": + "Première ligne ignorée si en-tête détecté", + "glossaries.dialog.errorFormat": "Format non supporté", + "glossaries.dialog.errorSize": "Fichier trop volumineux", + "glossaries.dialog.errorEmpty": "Fichier vide", + "glossaries.dialog.errorRead": "Erreur de lecture", + "glossaries.dialog.parsing": "Analyse…", + "glossaries.dialog.termsImported": "termes importés", + "glossaries.dialog.changeFile": "Changer le fichier", + "glossaries.dialog.retry": "Réessayer", + + // ── Pricing page ── + "pricing.nav.back": "Retour", + "pricing.nav.home": "Accueil", + "pricing.nav.mySubscription": "Mon abonnement", + + "pricing.header.badge": "Modèles IA mis à jour — Mars 2026", + "pricing.header.title": "Un forfait pour chaque besoin", + "pricing.header.subtitle": "Traduisez vos documents Word, Excel et PowerPoint en conservant la mise en page originale. Sans jamais saisir de clé API.", + "pricing.billing.monthly": "Mensuel", + "pricing.billing.yearly": "Annuel", + + "pricing.plans.free.name": "Gratuit", + "pricing.plans.starter.name": "Starter", + "pricing.plans.pro.name": "Pro", + "pricing.plans.business.name": "Business", + "pricing.plans.enterprise.name": "Entreprise", + + "pricing.plans.free.description": "Parfait pour découvrir l'application", + "pricing.plans.starter.description": "Pour les particuliers et petits projets", + "pricing.plans.pro.description": "Pour les professionnels et équipes en croissance", + "pricing.plans.business.description": "Pour les équipes et organisations", + "pricing.plans.enterprise.description": "Solutions sur mesure pour grandes organisations", + + "pricing.plans.pro.highlight": "Le plus populaire", + "pricing.plans.pro.badge": "POPULAIRE", + "pricing.plans.enterprise.badge": "SUR DEVIS", + + "pricing.plans.free.feat1": "5 documents / mois", + "pricing.plans.free.feat2": "Jusqu'à 15 pages par document", + "pricing.plans.free.feat3": "Google Traduction inclus", + "pricing.plans.free.feat4": "Toutes les langues (130+)", + "pricing.plans.free.feat5": "Support communautaire", + + "pricing.plans.starter.feat1": "50 documents / mois", + "pricing.plans.starter.feat2": "Jusqu'à 50 pages par document", + "pricing.plans.starter.feat3": "Google Traduction + DeepL", + "pricing.plans.starter.feat4": "Fichiers jusqu'à 10 Mo", + "pricing.plans.starter.feat5": "Support par e-mail", + "pricing.plans.starter.feat6": "Historique 30 jours", + + "pricing.plans.pro.feat1": "200 documents / mois", + "pricing.plans.pro.feat2": "Jusqu'à 200 pages par document", + "pricing.plans.pro.feat3": "Traduction IA Essentielle (DeepSeek V3.2)", + "pricing.plans.pro.feat4": "Google Traduction + DeepL", + "pricing.plans.pro.feat5": "Fichiers jusqu'à 25 Mo", + "pricing.plans.pro.feat6": "Glossaires personnalisés", + "pricing.plans.pro.feat7": "Support prioritaire", + "pricing.plans.pro.feat8": "Historique 90 jours", + + "pricing.plans.business.feat1": "1 000 documents / mois", + "pricing.plans.business.feat2": "Jusqu'à 500 pages par document", + "pricing.plans.business.feat3": "IA Essentielle + Premium (Claude Haiku)", + "pricing.plans.business.feat4": "Tous les fournisseurs de traduction", + "pricing.plans.business.feat5": "Fichiers jusqu'à 50 Mo", + "pricing.plans.business.feat6": "Accès API (10 000 appels/mois)", + "pricing.plans.business.feat7": "Webhooks de notification", + "pricing.plans.business.feat8": "Support dédié", + "pricing.plans.business.feat9": "Historique 1 an", + "pricing.plans.business.feat10": "Analytiques avancées", + + "pricing.plans.enterprise.feat1": "Documents illimités", + "pricing.plans.enterprise.feat2": "Tous les modèles IA (GPT-5, Claude Opus 4.6…)", + "pricing.plans.enterprise.feat3": "Déploiement on-premise ou cloud dédié", + "pricing.plans.enterprise.feat4": "SLA 99,9 % garanti", + "pricing.plans.enterprise.feat5": "Support 24/7 dédié", + "pricing.plans.enterprise.feat6": "Marque blanche (white-label)", + "pricing.plans.enterprise.feat7": "Équipes illimitées", + "pricing.plans.enterprise.feat8": "Intégrations sur mesure", + + "pricing.card.onRequest": "Sur devis", + "pricing.card.free": "Gratuit", + "pricing.card.perMonth": "/mois", + "pricing.card.billedYearly": "Facturé {price} € / an", + "pricing.card.documents": "Documents", + "pricing.card.pagesMax": "Pages max", + "pricing.card.aiTranslation": "Traduction IA", + "pricing.card.unlimited": "Illimité", + "pricing.card.perMonthStat": "/ mois", + "pricing.card.perDoc": "p / doc", + "pricing.card.aiEssential": "Essentielle", + "pricing.card.aiEssentialPremium": "Essentielle + Premium", + "pricing.card.aiCustom": "Sur mesure", + "pricing.card.myPlan": "Mon forfait", + "pricing.card.managePlan": "Gérer mon forfait", + "pricing.card.startFree": "Commencer gratuitement", + "pricing.card.contactUs": "Nous contacter", + "pricing.card.choosePlan": "Choisir ce forfait", + "pricing.card.processing": "Traitement…", + + "pricing.comparison.title": "Comparaison détaillée", + "pricing.comparison.subtitle": "Tout ce qui est inclus dans chaque forfait", + "pricing.comparison.feature": "Fonctionnalité", + "pricing.comparison.docsPerMonth": "Documents / mois", + "pricing.comparison.pagesMaxPerDoc": "Pages max / document", + "pricing.comparison.maxFileSize": "Taille max fichier", + "pricing.comparison.googleTranslation": "Google Traduction", + "pricing.comparison.deepl": "DeepL", + "pricing.comparison.aiEssential": "Traduction IA Essentielle", + "pricing.comparison.aiPremium": "Traduction IA Premium", + "pricing.comparison.apiAccess": "Accès API", + "pricing.comparison.priorityProcessing": "Traitement prioritaire", + "pricing.comparison.support": "Support", + "pricing.comparison.support.community": "Communauté", + "pricing.comparison.support.email": "E-mail", + "pricing.comparison.support.priority": "Prioritaire", + "pricing.comparison.support.dedicated": "Dédié", + "pricing.comparison.mb": "Mo", + + "pricing.credits.title": "Crédits supplémentaires", + "pricing.credits.subtitle": "Besoin de plus ? Achetez des crédits à l'unité, sans abonnement.", + "pricing.credits.perPage": "1 crédit = 1 page traduite.", + "pricing.credits.bestValue": "Le meilleur rapport", + "pricing.credits.unit": "crédits", + "pricing.credits.centsPerCredit": "cts / crédit", + "pricing.credits.buy": "Acheter", + + "pricing.trust.encryption.title": "Chiffrement de bout en bout", + "pricing.trust.encryption.sub": "TLS 1.3 + AES-256 au repos", + "pricing.trust.languages.title": "130+ langues", + "pricing.trust.languages.sub": "Dont arabe, persan, hébreu (RTL)", + "pricing.trust.parallel.title": "Traitement parallèle", + "pricing.trust.parallel.sub": "IA multi-thread ultra-rapide", + "pricing.trust.availability.title": "Disponible 24/7", + "pricing.trust.availability.sub": "Uptime garanti 99,9 %", + + "pricing.aiModels.title": "Nos modèles IA — Mars 2026", + "pricing.aiModels.essential.title": "Traduction IA Essentielle", + "pricing.aiModels.essential.plan": "Forfait Pro", + "pricing.aiModels.essential.descPrefix": "Basée sur", + "pricing.aiModels.essential.descSuffix": "— le modèle IA le plus rentable de 2026. Qualité comparable aux modèles frontier à 1/50ème du coût.", + "pricing.aiModels.essential.context": "163K tokens de contexte", + "pricing.aiModels.essential.value": "Excellent rapport qualité/prix", + "pricing.aiModels.premium.title": "Traduction IA Premium", + "pricing.aiModels.premium.plan": "Forfait Business", + "pricing.aiModels.premium.descPrefix": "Basée sur", + "pricing.aiModels.premium.descSuffix": "d'Anthropic — précis sur les documents juridiques, médicaux et techniques complexes.", + "pricing.aiModels.premium.context": "200K tokens de contexte", + "pricing.aiModels.premium.precision": "Meilleure précision", + + "pricing.faq.title": "Questions fréquentes", + "pricing.faq.q1": "Puis-je changer de forfait à tout moment ?", + "pricing.faq.a1": "Oui. Le passage à un forfait supérieur est immédiat et proratisé. La rétrogradation prend effet à la fin de la période en cours.", + "pricing.faq.q2": "Qu'est-ce que la « Traduction IA Essentielle » ?", + "pricing.faq.a2": "C'est notre moteur IA basé sur DeepSeek V3.2 via OpenRouter. Il comprend le contexte de vos documents, préserve la mise en page et gère les termes techniques bien mieux qu'une traduction classique.", + "pricing.faq.q3": "Quelle est la différence entre IA Essentielle et IA Premium ?", + "pricing.faq.a3": "L'IA Essentielle utilise DeepSeek V3.2 (excellent rapport qualité/prix). L'IA Premium utilise Claude 3.5 Haiku d'Anthropic, plus précis sur les documents juridiques, médicaux et techniques complexes.", + "pricing.faq.q4": "Mes documents sont-ils conservés après traduction ?", + "pricing.faq.a4": "Les fichiers traduits sont disponibles selon votre forfait (30 jours Starter, 90 jours Pro, 1 an Business). Ils sont chiffrés au repos et en transit.", + "pricing.faq.q5": "Que se passe-t-il si je dépasse mon quota mensuel ?", + "pricing.faq.a5": "Vous pouvez acheter des crédits supplémentaires à l'unité, ou upgrader votre forfait. Vous êtes notifié à 80 % d'utilisation.", + "pricing.faq.q6": "Y a-t-il une version d'essai gratuite des forfaits payants ?", + "pricing.faq.a6": "Le forfait Gratuit est permanent et sans carte bancaire. Pour les forfaits Pro et Business, contactez-nous pour un accès d'essai de 14 jours.", + "pricing.faq.q7": "Quels formats de fichiers sont supportés ?", + "pricing.faq.a7": "Word (.docx), Excel (.xlsx/.xls), PowerPoint (.pptx), et bientôt PDF. Tous les plans supportent les mêmes formats.", + + "pricing.cta.title": "Prêt à commencer ?", + "pricing.cta.subtitle": "Commencez gratuitement, sans carte bancaire. Passez à un forfait supérieur quand vous en avez besoin.", + "pricing.cta.createAccount": "Créer un compte gratuit", + "pricing.cta.login": "Se connecter", + + "pricing.toast.demo": "Mode démo — Stripe n'est pas encore configuré. En production, vous seriez redirigé vers le paiement pour activer le forfait {planId}.", + "pricing.toast.networkError": "Erreur réseau. Veuillez réessayer.", + "pricing.toast.paymentError": "Erreur lors de la création du paiement.", + + // ── Register page ── + "register.title": "Créer un compte", + "register.subtitle": "Commencez à traduire gratuitement", + "register.error.failed": "L'inscription a échoué", + + "register.name.label": "Nom", + "register.name.placeholder": "Votre nom", + "register.name.error": "Le nom doit contenir au moins 2 caractères", + + "register.email.label": "Adresse email", + "register.email.placeholder": "vous@exemple.com", + "register.email.error": "Adresse email invalide", + + "register.password.label": "Mot de passe", + "register.password.error": "Le mot de passe doit contenir au moins 8 caractères, une majuscule, une minuscule et un chiffre", + "register.password.show": "Afficher le mot de passe", + "register.password.hide": "Masquer le mot de passe", + "register.password.strengthLabel": "Force :", + "register.password.strength.weak": "Faible", + "register.password.strength.medium": "Moyen", + "register.password.strength.strong": "Fort", + + "register.confirmPassword.label": "Confirmer le mot de passe", + "register.confirmPassword.error": "Les mots de passe ne correspondent pas", + "register.confirmPassword.show": "Afficher", + "register.confirmPassword.hide": "Masquer", + + "register.submit.creating": "Création du compte...", + "register.submit.create": "Créer mon compte", + + "register.hasAccount": "Vous avez déjà un compte ?", + "register.login": "Se connecter", + + "register.terms.prefix": "En créant un compte, vous acceptez notre", + "register.terms.link": "utilisation du service", + + // ── Landing page ── + "landing.nav.whyUs": "Pourquoi nous", + "landing.nav.formats": "Formats", + "landing.nav.pricing": "Tarifs", + "landing.nav.login": "Connexion", + "landing.nav.startFree": "Essai gratuit", + "landing.hero.badge": "Nouveau : prise en charge PDF + traduction par IA", + "landing.hero.title1": "Traduisez vos documents.", + "landing.hero.title2": "Gardez une mise en forme parfaite.", + "landing.hero.subtitle": "Le seul traducteur qui préserve les SmartArt, graphiques, tables des matières, formes, en-têtes et pieds de page — exactement tels qu'ils étaient. Aucune mauvaise surprise au moment de payer.", + "landing.hero.cta": "Essai gratuit — 2 documents/mois", + "landing.hero.seePlans": "Voir les offres", + "landing.trust.filesDeleted": "Fichiers supprimés après 60 min", + "landing.trust.noBait": "Pas de prix cachés", + "landing.trust.preview": "Aperçu avant paiement", + "landing.why.title": "Votre mise en forme, parfaitement préservée", + "landing.why.subtitle": "Les autres traducteurs détruisent votre mise en page. Pas nous.", + "landing.why.smartart.title": "SmartArt et diagrammes", + "landing.why.smartart.desc": "Organigrammes, diagrammes de flux, hiérarchies — tout traduit à l'identique.", + "landing.why.toc.title": "Tables des matières", + "landing.why.toc.desc": "Entrées de TDM, numéros de page et renvois sont tous mis à jour correctement.", + "landing.why.charts.title": "Graphiques", + "landing.why.charts.desc": "Titres, étiquettes d'axes, légendes et noms de séries — tout est traduit.", + "landing.why.shapes.title": "Formes et zones de texte", + "landing.why.shapes.desc": "Rectangles, blocs arrondis, légendes — nous trouvons et traduisons le texte dans toutes les formes.", + "landing.why.headers.title": "En-têtes et pieds de page", + "landing.why.headers.desc": "En-têtes, pieds de page et notes de bas de page ne sont jamais oubliés.", + "landing.why.languages.title": "130+ langues", + "landing.why.languages.desc": "Google Traduction, DeepL et moteurs IA pour une qualité professionnelle.", + "landing.pricing.title": "Des prix simples et honnêtes", + "landing.pricing.subtitle": "Ce que vous voyez est ce que vous payez. Aucun frais caché après traduction.", + "landing.pricing.monthly": "Mensuel", + "landing.pricing.yearly": "Annuel", + "landing.pricing.starter.title": "Starter", + "landing.pricing.starter.desc": "Pour les particuliers et petits projets", + "landing.pricing.starter.f1": "50 documents / mois", + "landing.pricing.starter.f2": "Jusqu'à 50 pages par document", + "landing.pricing.starter.f3": "Google Traduction + DeepL", + "landing.pricing.starter.f4": "Fichiers jusqu'à 10 Mo", + "landing.pricing.starter.cta": "Commencer", + "landing.pricing.pro.title": "Pro", + "landing.pricing.pro.badge": "Le plus populaire", + "landing.pricing.pro.desc": "Pour les professionnels exigeants", + "landing.pricing.pro.f1": "200 documents / mois", + "landing.pricing.pro.f2": "Jusqu'à 200 pages par document", + "landing.pricing.pro.f3": "Traduction par IA (DeepSeek)", + "landing.pricing.pro.f4": "Google + DeepL inclus", + "landing.pricing.pro.f5": "Glossaires et prompts personnalisés", + "landing.pricing.pro.f6": "Support prioritaire", + "landing.pricing.pro.cta": "Essayer Pro", + "landing.pricing.business.title": "Business", + "landing.pricing.business.desc": "Pour les équipes avec des besoins élevés", + "landing.pricing.business.f1": "1 000 documents / mois", + "landing.pricing.business.f2": "Jusqu'à 500 pages par document", + "landing.pricing.business.f3": "IA Premium (Claude)", + "landing.pricing.business.f4": "Tous les fournisseurs + accès API", + "landing.pricing.business.f5": "Webhooks et automatisation", + "landing.pricing.business.f6": "5 postes d'équipe", + "landing.pricing.business.cta": "Nous contacter", + "landing.pricing.honest": "Le prix affiché est le prix que vous payez. Aucun frais caché après traduction.", + "landing.pricing.billedYearly": "facturé annuellement", + "landing.pricing.perMonth": "/mois", + "landing.formats.title": "Chaque format, chaque élément", + "landing.formats.subtitle": "Nous traduisons ce que les autres oublient.", + "landing.formats.word": "Word (.docx)", + "landing.formats.word.f1": "Paragraphes et titres", + "landing.formats.word.f2": "Tableaux et graphiques", + "landing.formats.word.f3": "Diagrammes SmartArt", + "landing.formats.word.f4": "Table des matières", + "landing.formats.word.f5": "En-têtes et pieds de page", + "landing.formats.word.f6": "Formes et zones de texte", + "landing.formats.word.f7": "Notes de bas de page et de fin", + "landing.formats.excel": "Excel (.xlsx)", + "landing.formats.excel.f1": "Valeurs de cellules", + "landing.formats.excel.f2": "Noms de feuilles", + "landing.formats.excel.f3": "Graphiques et étiquettes", + "landing.formats.excel.f4": "En-têtes et pieds de page", + "landing.formats.excel.f5": "Cellules fusionnées préservées", + "landing.formats.powerpoint": "PowerPoint (.pptx)", + "landing.formats.powerpoint.f1": "Texte des diapositives et notes", + "landing.formats.powerpoint.f2": "Graphiques et diagrammes", + "landing.formats.powerpoint.f3": "Formes et zones de texte", + "landing.formats.powerpoint.f4": "Masques de diapositives", + "landing.formats.powerpoint.f5": "Animations préservées", + "landing.formats.pdf": "PDF", + "landing.formats.pdf.f1": "PDF textuels", + "landing.formats.pdf.f2": "Mise en page préservée", + "landing.formats.pdf.f3": "Images conservées en place", + "landing.formats.pdf.f4": "Tableaux maintenus", + "landing.formats.pdf.f5": "Sortie en DOCX ou PDF", + "landing.cta.title": "Commencez à traduire en 30 secondes", + "landing.cta.subtitle": "Aucune carte bancaire requise. Essayez 2 documents gratuitement et voyez la différence.", + "landing.cta.button": "Créer un compte gratuit", + "landing.footer.privacy": "Confidentialité", + "landing.footer.terms": "Conditions", + "landing.footer.contact": "Contact", + + "landing.ai.badge": "Moteur de Traduction IA", + "landing.ai.title": "La traduction qui comprend votre métier", + "landing.ai.subtitle": "Nos modèles IA analysent le contexte, respectent votre terminologie et traduisent même le texte dans vos images.", + "landing.ai.context.title": "Contexte métier", + "landing.ai.context.desc": "Décrivez votre domaine et obtenez des traductions adaptées, pas génériques.", + "landing.ai.glossary.title": "Glossaires métier", + "landing.ai.glossary.desc": "Définissez vos termes techniques. CTA restera « Air Handling Unit », jamais « Call To Action ».", + "landing.ai.vision.title": "Vision sur images", + "landing.ai.vision.desc": "Le texte incrusté dans vos images, diagrammes et graphiques est détecté et traduit.", + "landing.ai.comparison.source": "Source (FR)", + "landing.ai.comparison.google": "Google Translate", + "landing.ai.comparison.ai": "Notre IA", + "landing.ai.comparison.sourceText": "La batterie de chauffe est raccordée sur la CTA", + "landing.ai.comparison.googleText": "The heating battery is connected on the call to action", + "landing.ai.comparison.aiText": "The heating coil is connected to the AHU", + + "landing.howItWorks.title": "Comment ça marche ?", + "landing.howItWorks.subtitle": "Trois étapes. Zéro perte de format.", + "landing.howItWorks.step1.title": "Déposez votre fichier", + "landing.howItWorks.step1.desc": "Glissez-déposez votre document Excel, Word, PowerPoint ou PDF.", + "landing.howItWorks.step2.title": "Choisissez la langue et le moteur", + "landing.howItWorks.step2.desc": "Sélectionnez la langue cible et le moteur de traduction — classique ou IA contextuelle.", + "landing.howItWorks.step3.title": "Téléchargez le résultat", + "landing.howItWorks.step3.desc": "Récupérez votre document traduit avec un formatage identique à l'original.", + + "login.errorTitle": "Erreur de connexion", + "login.welcomeBack": "Bienvenue", + "login.signInToContinue": "Connectez-vous pour continuer à traduire", + "login.email": "Email", + "login.emailPlaceholder": "vous@exemple.com", + "login.password": "Mot de passe", + "login.forgotPassword": "Mot de passe oublié ?", + "login.passwordPlaceholder": "••••••••", + "login.signingIn": "Connexion en cours...", + "login.signIn": "Se connecter", + "login.noAccount": "Pas encore de compte ?", + "login.signUpFree": "Créer un compte gratuit", + "forgotPassword.enterEmail": "Veuillez entrer votre adresse email", + "forgotPassword.error": "Une erreur s'est produite", + "forgotPassword.title": "Mot de passe oublié", + "forgotPassword.checkEmail": "Vérifiez votre boîte mail", + "forgotPassword.subtitle": "Entrez votre email pour recevoir un lien de réinitialisation", + "forgotPassword.sentMessage": "Si un compte existe avec cette adresse, un email de réinitialisation a été envoyé.", + "forgotPassword.emailLabel": "Adresse email", + "forgotPassword.emailPlaceholder": "vous@exemple.com", + "forgotPassword.sending": "Envoi en cours...", + "forgotPassword.sendLink": "Envoyer le lien de réinitialisation", + "forgotPassword.backToLogin": "Retour à la connexion", + "forgotPassword.loading": "Chargement...", + "resetPassword.passwordRequirements": "Le mot de passe doit contenir au moins 8 caractères, une majuscule, une minuscule et un chiffre", + "resetPassword.passwordMismatch": "Les mots de passe ne correspondent pas", + "resetPassword.tokenMissing": "Token manquant. Veuillez utiliser le lien reçu par email.", + "resetPassword.error": "Une erreur s'est produite", + "resetPassword.invalidLink": "Lien invalide", + "resetPassword.invalidLinkMessage": "Ce lien de réinitialisation est invalide. Veuillez redemander un nouveau lien.", + "resetPassword.requestNewLink": "Redemander un lien", + "resetPassword.successTitle": "Mot de passe réinitialisé", + "resetPassword.newPasswordTitle": "Nouveau mot de passe", + "resetPassword.successSubtitle": "Vous allez être redirigé vers la connexion", + "resetPassword.subtitle": "Définissez votre nouveau mot de passe", + "resetPassword.successMessage": "Votre mot de passe a été réinitialisé avec succès. Vous allez être redirigé vers la page de connexion.", + "resetPassword.newPassword": "Nouveau mot de passe", + "resetPassword.showPassword": "Afficher le mot de passe", + "resetPassword.hidePassword": "Masquer le mot de passe", + "resetPassword.confirmPassword": "Confirmer le mot de passe", + "resetPassword.resetting": "Réinitialisation...", + "resetPassword.resetPassword": "Réinitialiser le mot de passe", + "resetPassword.backToLogin": "Retour à la connexion", + "resetPassword.loading": "Chargement...", + + // ── Common ── + "common.loading": "Chargement...", + + // ── Profile ── + "profile.header.title": "Mon Profil", + "profile.header.subtitle": "Gérez votre compte et vos préférences.", + "profile.tabs.account": "Compte", + "profile.tabs.subscription": "Abonnement", + "profile.tabs.preferences": "Préférences", + "profile.account.user": "Utilisateur", + "profile.account.memberSince": "Membre depuis", + "profile.plan.label": "Forfait", + "profile.plan.free": "Gratuit", + "profile.plan.starter": "Starter", + "profile.plan.pro": "Pro", + "profile.plan.business": "Business", + "profile.plan.enterprise": "Enterprise", + "profile.plan.pricePerMonth": "{price} €/mois", + "profile.subscription.canceling": "Annulation en cours", + "profile.subscription.active": "Actif", + "profile.subscription.unknown": "Inconnu", + "profile.subscription.accessUntil": "Accès jusqu'au", + "profile.subscription.renewalOn": "Renouvellement le", + "profile.subscription.upgradePlan": "Passer à un forfait payant", + "profile.subscription.changePlan": "Changer de forfait", + "profile.subscription.manageBilling": "Gérer la facturation", + "profile.subscription.billingUnavailable": "Portail de facturation non disponible.", + "profile.subscription.billingError": "Erreur lors de l'accès au portail.", + "profile.subscription.cancelSuccess": "Abonnement annulé. Vous conservez l'accès jusqu'à la fin de la période.", + "profile.subscription.cancelError": "Erreur lors de l'annulation.", + "profile.subscription.networkError": "Erreur réseau.", + "profile.usage.title": "Utilisation ce mois-ci", + "profile.usage.resetOn": "Reset le", + "profile.usage.documents": "Documents", + "profile.usage.pages": "Pages", + "profile.usage.extraCredits": "crédit supplémentaire", + "profile.usage.extraCreditsPlural": "crédits supplémentaires", + "profile.usage.quotaReached": "Quota atteint", + "profile.usage.quotaReachedDesc": "Passez à un forfait supérieur pour continuer.", + "profile.usage.unlockMore": "Débloquez plus de traductions avec un forfait payant.", + "profile.usage.viewPlans": "Voir les forfaits", + "profile.usage.includedInPlan": "Inclus dans votre forfait", + "profile.danger.title": "Zone danger", + "profile.danger.description": "L'annulation prend effet à la fin de votre période en cours. Vous conservez l'accès jusqu'à cette date.", + "profile.danger.confirm": "Êtes-vous sûr(e) ? Cette action ne peut pas être annulée.", + "profile.danger.confirmCancel": "Confirmer l'annulation", + "profile.danger.cancelSubscription": "Annuler mon abonnement", + "profile.danger.keep": "Non, garder", + "profile.prefs.interfaceLang": "Langue de l'interface", + "profile.prefs.interfaceLangDesc": "La langue est détectée automatiquement selon votre navigateur. Vous pouvez la changer manuellement.", + "profile.prefs.defaultTargetLang": "Langue cible par défaut", + "profile.prefs.selectLanguage": "Sélectionner une langue", + "profile.prefs.defaultTargetLangDesc": "Cette langue sera pré-sélectionnée lors de vos traductions.", + "profile.prefs.save": "Enregistrer", + "profile.prefs.theme": "Thème", + "profile.prefs.themeDesc": "Choisissez l'apparence de l'interface", + "profile.prefs.cache": "Cache", + "profile.prefs.cacheDesc": "Effacer le cache local peut résoudre certains problèmes d'affichage.", + "profile.prefs.clearing": "Effacement...", + "profile.prefs.clearCache": "Effacer le cache", + + // ── Settings ── + "settings.title": "Paramètres", + "settings.subtitle": "Configuration générale de l'application", + "settings.formats.title": "Formats supportés", + "settings.formats.subtitle": "Types de documents que vous pouvez traduire", + "settings.formats.formulas": "Formules", + "settings.formats.styles": "Styles", + "settings.formats.images": "Images", + "settings.formats.headers": "En-têtes", + "settings.formats.tables": "Tableaux", + "settings.formats.slides": "Slides", + "settings.formats.notes": "Notes", + "settings.cache.title": "Cache", + "settings.cache.desc": "Effacer le cache local peut résoudre certains problèmes d'affichage.", + "settings.cache.clearing": "Effacement...", + "settings.cache.clear": "Effacer le cache", + + // ── Services ── + "services.title": "Fournisseurs de traduction", + "services.subtitle": "Les fournisseurs sont configurés par l'administrateur. Vous pouvez voir ceux actuellement disponibles pour votre compte.", + "services.loading": "Chargement des fournisseurs...", + "services.noProviders": "Aucun fournisseur n'est actuellement configuré. Contactez votre administrateur.", + "services.classic": "Traduction classique", + "services.llmPro": "IA · Contextuelle (Pro)", + "services.available": "Disponible", + "services.model": "Modèle", + "services.adminOnly.title": "La configuration des fournisseurs est réservée à l'administrateur", + "services.adminOnly.desc": "Les clés API, la sélection de modèle et l'activation des fournisseurs sont gérées exclusivement par l'administrateur. Vous n'avez jamais besoin de saisir de clé API.", + + // ── API Keys ── + "apiKeys.title": "Clés API", + "apiKeys.subtitle": "Gérez vos clés API pour l'accès programmatique à l'API de traduction.", + "apiKeys.loading": "Chargement...", + "apiKeys.sectionTitle": "API & Automatisation", + "apiKeys.sectionDesc": "Générez et gérez vos clés API pour les workflows d'automatisation", + "apiKeys.keysUsed": "{total} sur {max} clés utilisées", + "apiKeys.maxReached": "Nombre maximum de clés atteint. Révoquez une clé pour en générer une nouvelle.", + "apiKeys.canGenerate": "Vous pouvez générer {count} clé supplémentaire", + "apiKeys.canGeneratePlural": "Vous pouvez générer {count} clés supplémentaires", + "apiKeys.generateNew": "Générer une nouvelle clé", + "apiKeys.keyRevoked": "Clé révoquée", + "apiKeys.keyRevokedDesc": "La clé API a été révoquée avec succès.", + "apiKeys.keyNotFound": "Clé introuvable", + "apiKeys.keyNotFoundDesc": "La clé API n'existe plus. Elle a peut-être déjà été révoquée.", + "apiKeys.error": "Erreur", + "apiKeys.revokeError": "Impossible de révoquer la clé API. Veuillez réessayer.", + "apiKeys.limitReached": "Limite atteinte", + "apiKeys.limitReachedDesc": "Vous avez atteint le maximum de 10 clés API. Révoquez une clé existante pour en générer une nouvelle.", + "apiKeys.proRequired": "Fonctionnalité Pro requise", + "apiKeys.proRequiredDesc": "Les clés API sont une fonctionnalité Pro. Veuillez mettre à niveau votre compte.", + "apiKeys.generateError": "Impossible de générer la clé API. Veuillez réessayer.", + "apiKeys.upgrade.title": "Clés API", + "apiKeys.upgrade.subtitle": "Automatisez vos traductions avec l'accès API", + "apiKeys.upgrade.feat1": "Générez des clés API illimitées", + "apiKeys.upgrade.feat2": "Automatisez la traduction de documents", + "apiKeys.upgrade.feat3": "Notifications webhook", + "apiKeys.upgrade.feat4": "Modes de traduction IA", + "apiKeys.upgrade.proFeature": "Les clés API sont une fonctionnalité {pro}. Passez à un forfait supérieur pour débloquer l'automatisation API.", + "apiKeys.upgrade.pro": "Pro", + "apiKeys.upgrade.cta": "Passer à Pro", + "apiKeys.dialog.maxTitle": "Nombre maximum de clés atteint", + "apiKeys.dialog.maxDesc": "Vous avez atteint le maximum de 10 clés API. Veuillez révoquer une clé existante avant d'en générer une nouvelle.", + "apiKeys.dialog.close": "Fermer", + "apiKeys.dialog.generated": "Clé API générée !", + "apiKeys.dialog.generatedDesc": "Votre nouvelle clé API a été créée. Copiez-la maintenant — elle ne sera plus affichée.", + "apiKeys.dialog.important": "Important :", + "apiKeys.dialog.importantDesc": "C'est la seule fois où vous verrez cette clé. Conservez-la en toute sécurité.", + "apiKeys.dialog.apiKey": "Clé API", + "apiKeys.dialog.name": "Nom :", + "apiKeys.dialog.done": "Terminé", + "apiKeys.dialog.copied": "J'ai copié la clé", + "apiKeys.dialog.generateTitle": "Générer une nouvelle clé API", + "apiKeys.dialog.generateDesc": "Créez une nouvelle clé API pour l'accès programmatique à l'API de traduction.", + "apiKeys.dialog.keyName": "Nom de la clé (facultatif)", + "apiKeys.dialog.keyNamePlaceholder": "ex : Production, Staging", + "apiKeys.dialog.keyNameHint": "Un nom descriptif pour vous aider à identifier cette clé plus tard.", + "apiKeys.dialog.nameTooLong": "Le nom ne doit pas dépasser {max} caractères", + "apiKeys.dialog.nameInvalid": "Le nom ne peut contenir que des lettres, chiffres, espaces, tirets et tirets bas", + "apiKeys.dialog.cancel": "Annuler", + "apiKeys.dialog.generating": "Génération...", + "apiKeys.dialog.generate": "Générer la clé", + "apiKeys.table.name": "Nom", + "apiKeys.table.prefix": "Préfixe", + "apiKeys.table.created": "Créée", + "apiKeys.table.lastUsed": "Dernière utilisation", + "apiKeys.table.never": "Jamais", + "apiKeys.table.actions": "Actions", + "apiKeys.table.revoke": "Révoquer", + "apiKeys.table.copyPrefix": "Copier le préfixe de la clé", + "apiKeys.table.revokeKey": "Révoquer la clé", + "apiKeys.revokeDialog.title": "Révoquer la clé API", + "apiKeys.revokeDialog.desc": "Êtes-vous sûr de vouloir révoquer la clé « {name} » ? Cette action est irréversible.", + "apiKeys.revokeDialog.confirm": "Oui, révoquer", + "apiKeys.revokeDialog.cancel": "Annuler", + + // ── Context & Glossary ── + "context.proTitle": "Fonctionnalité Pro", + "context.proDesc": "Le contexte et les glossaires professionnels sont disponibles avec les forfaits Pro, Business et Enterprise. Ils permettent d'obtenir des traductions plus précises grâce à des instructions et un vocabulaire spécifiques à votre domaine.", + "context.viewPlans": "Voir les forfaits", + "context.title": "Contexte & Glossaire", + "context.subtitle": "Améliorez la qualité de traduction avec des instructions et un vocabulaire spécifiques à votre domaine.", + "context.presets.title": "Glossaires professionnels", + "context.presets.desc": "Chargez un glossaire complet avec instructions et terminologie spécialisée", + "context.instructions.title": "Instructions de contexte", + "context.instructions.desc": "Instructions que l'IA suivra pendant la traduction", + "context.instructions.placeholder": "Ex : Vous traduisez des documents techniques HVAC. Utilisez une terminologie d'ingénierie précise...", + "context.glossary.title": "Glossaire technique", + "context.glossary.desc": "Format : source=cible (un par ligne). Les glossaires chargés via preset sont modifiables.", + "context.glossary.terms": "termes dans le glossaire", + "context.clearAll": "Tout effacer", + "context.saving": "Enregistrement...", + "context.save": "Enregistrer", + + // ── Admin ── + "admin.login.title": "Administration", + "admin.login.required": "Connexion requise", + "admin.login.password": "Mot de passe administrateur", + "admin.login.connecting": "Connexion...", + "admin.login.access": "Accéder au panneau admin", + "admin.login.restricted": "Accès réservé aux administrateurs", + "admin.layout.checking": "Vérification de l'authentification...", + "admin.dashboard.title": "Dashboard Admin", + "admin.dashboard.subtitle": "Panneau de contrôle administrateur", + "admin.dashboard.refresh": "Actualiser", + "admin.dashboard.refreshTooltip": "Actualiser les données du dashboard", + "admin.dashboard.config": "Configuration système", + "admin.dashboard.maxFileSize": "Taille max fichier :", + "admin.dashboard.translationService": "Service de traduction :", + "admin.dashboard.formats": "Formats :", + "admin.nav.dashboard": "Dashboard", + "admin.nav.users": "Utilisateurs", + "admin.nav.pricing": "Tarifs & Stripe", + "admin.nav.providers": "Fournisseurs", + "admin.nav.system": "Système", + "admin.nav.logs": "Logs", + "admin.users.title": "Gestion des Utilisateurs", + "admin.users.subtitle": "Visualiser et gérer les comptes utilisateurs", + "admin.users.planUpdated": "Plan mis à jour", + "admin.users.planChanged": "Le plan a été changé vers \"{plan}\" avec succès.", + "admin.users.unknownError": "Erreur inconnue", + "admin.users.error": "Erreur", + "admin.users.planUpdateError": "Impossible de mettre à jour le plan : {message}", + "admin.users.noKeys": "Aucune clé", + "admin.users.noKeysDesc": "Cet utilisateur n'a pas de clés API actives.", + "admin.users.keysRevoked": "Clés révoquées", + "admin.users.keysRevokedDesc": "{count} clé(s) API révoquée(s) avec succès.", + "admin.users.revokeError": "Impossible de révoquer les clés : {message}", + "admin.users.retry": "Réessayer", + "admin.system.title": "Système", + "admin.system.subtitle": "Surveiller l'état du système et gérer les ressources", + "admin.system.quotas": "Quotas de traduction", + "admin.system.resetQuotas": "Réinitialiser les quotas mensuels", + "admin.system.resetting": "Réinitialisation...", + "admin.system.reset": "Réinitialiser", + "admin.system.allOperational": "Tous les systèmes opérationnels", + "admin.system.issuesDetected": "Problèmes système détectés", + "admin.system.waitingData": "En attente de données...", + "admin.system.purging": "Purge...", + "admin.system.clean": "Nettoyer", + "admin.system.purge": "Purger", + }, + // ═══════════════════════════════════════════════════════════════ + // SPANISH (es) + // ═══════════════════════════════════════════════════════════════ + es: { + "auth.brandName": "Office Translator", + "dashboard.nav.translate": "Traducir", + "dashboard.nav.profile": "Mi perfil", + "dashboard.nav.settings": "Configuración", + "dashboard.nav.context": "Contexto", + "dashboard.nav.services": "Servicios", + "dashboard.nav.apiKeys": "Claves API", + "dashboard.nav.glossaries": "Glosarios", + "dashboard.header.title": "Panel de control", + "dashboard.header.subtitle": "Gestiona tus traducciones", + "dashboard.header.toggleMenu": "Menú", + "dashboard.header.profileTitle": "Mi perfil", + "dashboard.sidebar.theme": "Tema", + "dashboard.sidebar.signOut": "Cerrar sesión", + "dashboard.sidebar.backHome": "Volver al inicio", + "dashboard.translate.pageTitle": "Traducir un documento", + "dashboard.translate.pageSubtitle": "Importa un archivo y elige el idioma de destino", + "dashboard.translate.errorNotificationTitle": "Error", + "dashboard.translate.dropzone.uploadAria": "Zona para soltar archivos", + "dashboard.translate.dropzone.title": "Arrastra y suelta tu archivo aquí", + "dashboard.translate.dropzone.subtitle": "o haz clic para seleccionar (DOCX, XLSX, PPTX, PDF)", + "dashboard.translate.dropzone.replaceFile": "Reemplazar archivo", + "dashboard.translate.language.source": "Idioma de origen", + "dashboard.translate.language.target": "Idioma de destino", + "dashboard.translate.language.loading": "Cargando idiomas…", + "dashboard.translate.language.autoDetect": "Detección automática", + "dashboard.translate.language.selectPlaceholder": "Seleccionar…", + "dashboard.translate.language.loadErrorPrefix": "Error al cargar los idiomas", + "dashboard.translate.provider.loading": "Cargando proveedores…", + "dashboard.translate.provider.noneConfigured": "No hay proveedores configurados", + "dashboard.translate.provider.modelTitle": "Modelo", + "dashboard.translate.provider.sectionTitle": "Proveedor", + "dashboard.translate.provider.llmDivider": "IA · Contextual", + "dashboard.translate.provider.llmDividerPro": "IA · Contextual (Pro)", + "dashboard.translate.provider.upgrade": "Mejorar a Pro", + "dashboard.translate.provider.upgradeSuffix": "para desbloquear la traducción IA", + "dashboard.translate.trust.zeroRetention": "Sin retención", + "dashboard.translate.trust.deletedAfter": "Archivos eliminados tras el procesamiento", + "dashboard.translate.actions.uploading": "Subiendo…", + "dashboard.translate.actions.translate": "Traducir", + "dashboard.translate.actions.filePrefix": "Archivo: ", + "dashboard.translate.actions.cancel": "Cancelar", + "dashboard.translate.actions.tryAgain": "Reintentar", + "dashboard.translate.steps.uploading": "Subiendo archivo…", + "dashboard.translate.steps.starting": "Iniciando traducción…", + "dashboard.translate.complete.title": "¡Traducción completada!", + "dashboard.translate.complete.descNamed": "Tu archivo {name} se ha traducido correctamente.", + "dashboard.translate.complete.descGeneric": "Tu archivo se ha traducido correctamente.", + "dashboard.translate.complete.downloading": "Descargando…", + "dashboard.translate.complete.download": "Descargar", + "dashboard.translate.complete.newTranslation": "Nueva traducción", + "dashboard.translate.complete.toastOkTitle": "Éxito", + "dashboard.translate.complete.toastFailTitle": "Error", + "dashboard.translate.complete.toastFailDesc": "La traducción ha fallado. Por favor, inténtalo de nuevo.", + "dashboard.translate.sourceDocument": "Documento fuente", + "dashboard.translate.configuration": "Configuración", + "dashboard.translate.translating": "Traducción en progreso", + "dashboard.translate.liveMonitor": "Monitor en vivo", + "dashboard.translate.summary": "Resumen", + "dashboard.translate.engine": "Motor", + "dashboard.translate.confidence": "Confianza", + "dashboard.translate.cancel": "Cancelar", + "dashboard.translate.segments": "Segmentos", + "dashboard.translate.characters": "Caracteres", + "dashboard.translate.elapsed": "Transcurrido", + "dashboard.translate.segPerMin": "Seg/min", + "dashboard.translate.highQuality": "Alta calidad", + "dashboard.translate.quality": "Calidad", + "dashboard.translate.completed": "Traducción completada", + "dashboard.translate.replace": "Reemplazar", + "dashboard.translate.pdfMode.title": "Modo de traducción PDF", + "dashboard.translate.pdfMode.preserveLayout": "Conservar diseño", + "dashboard.translate.pdfMode.textOnly": "Solo texto", + "dashboard.translate.pdfMode.preserveLayoutDesc": "Mantiene imágenes, tablas y formato. Ideal para PDFs simples.", + "dashboard.translate.pdfMode.textOnlyDesc": "Traduce todo el texto perfectamente. Salida limpia, sin problemas de diseño.", + "dashboard.translate.pipeline.upload": "Subir", + "dashboard.translate.pipeline.analyze": "Analizar", + "dashboard.translate.pipeline.translate": "Traducción", + "dashboard.translate.pipeline.rebuild": "Reconstruir", + "dashboard.translate.pipeline.finalize": "Finalizar", + "dashboard.translate.progress.failedTitle": "Traducción fallida", + "glossaries.dialog.title": "Nuevo glosario", + "glossaries.dialog.description": "Crea un glosario para tus traducciones", + "glossaries.dialog.nameLabel": "Nombre", + "glossaries.dialog.namePlaceholder": "Mi glosario", + "glossaries.dialog.tabTemplates": "Plantillas", + "glossaries.dialog.tabFile": "Archivo", + "glossaries.dialog.tabManual": "Manual", + "glossaries.dialog.cancel": "Cancelar", + "glossaries.dialog.creating": "Creando…", + "glossaries.dialog.importing": "Importando…", + "glossaries.dialog.importBtn": "Importar", + "glossaries.dialog.selectPrompt": "Seleccionar", + "glossaries.dialog.createBtn": "Crear", + "glossaries.dialog.createEmpty": "Crear vacío", + "glossaries.dialog.terms": "términos", + "glossaries.dialog.templatesDesc": "Elige una plantilla predefinida", + "glossaries.dialog.templatesEmpty": "No hay plantillas disponibles", + "glossaries.dialog.dropTitle": "Arrastra un archivo CSV aquí", + "glossaries.dialog.dropOr": "o", + "glossaries.dialog.dropFormats": "CSV, TSV, TXT", + "glossaries.dialog.formatTitle": "Formato", + "glossaries.dialog.formatDesc": "origen,destino (uno por línea)", + "glossaries.dialog.formatNote": "Se ignora la primera línea si se detecta encabezado", + "glossaries.dialog.errorFormat": "Formato no compatible", + "glossaries.dialog.errorSize": "Archivo demasiado grande", + "glossaries.dialog.errorEmpty": "Archivo vacío", + "glossaries.dialog.errorRead": "Error de lectura", + "glossaries.dialog.parsing": "Analizando…", + "glossaries.dialog.termsImported": "términos importados", + "glossaries.dialog.changeFile": "Cambiar archivo", + "glossaries.dialog.retry": "Reintentar", + "pricing.nav.back": "Volver", + "pricing.nav.home": "Inicio", + "pricing.nav.mySubscription": "Mi suscripción", + "pricing.header.badge": "Modelos IA actualizados — Marzo 2026", + "pricing.header.title": "Un plan para cada necesidad", + "pricing.header.subtitle": "Traduce tus documentos de Word, Excel y PowerPoint conservando el diseño original. Sin necesidad de clave API.", + "pricing.billing.monthly": "Mensual", + "pricing.billing.yearly": "Anual", + "pricing.plans.free.name": "Gratis", + "pricing.plans.starter.name": "Starter", + "pricing.plans.pro.name": "Pro", + "pricing.plans.business.name": "Business", + "pricing.plans.enterprise.name": "Enterprise", + "pricing.plans.free.description": "Perfecto para descubrir la aplicación", + "pricing.plans.starter.description": "Para particulares y proyectos pequeños", + "pricing.plans.pro.description": "Para profesionales y equipos en crecimiento", + "pricing.plans.business.description": "Para equipos y organizaciones", + "pricing.plans.enterprise.description": "Soluciones a medida para grandes organizaciones", + "pricing.plans.pro.highlight": "El más popular", + "pricing.plans.pro.badge": "POPULAR", + "pricing.plans.enterprise.badge": "BAJO PETICIÓN", + "pricing.plans.free.feat1": "5 documentos / mes", + "pricing.plans.free.feat2": "Hasta 15 páginas por documento", + "pricing.plans.free.feat3": "Traductor de Google incluido", + "pricing.plans.free.feat4": "Todos los idiomas (130+)", + "pricing.plans.free.feat5": "Soporte comunitario", + "pricing.plans.starter.feat1": "50 documentos / mes", + "pricing.plans.starter.feat2": "Hasta 50 páginas por documento", + "pricing.plans.starter.feat3": "Traductor de Google + DeepL", + "pricing.plans.starter.feat4": "Archivos de hasta 10 MB", + "pricing.plans.starter.feat5": "Soporte por correo electrónico", + "pricing.plans.starter.feat6": "Historial de 30 días", + "pricing.plans.pro.feat1": "200 documentos / mes", + "pricing.plans.pro.feat2": "Hasta 200 páginas por documento", + "pricing.plans.pro.feat3": "Traducción IA Esencial (DeepSeek V3.2)", + "pricing.plans.pro.feat4": "Traductor de Google + DeepL", + "pricing.plans.pro.feat5": "Archivos de hasta 25 MB", + "pricing.plans.pro.feat6": "Glosarios personalizados", + "pricing.plans.pro.feat7": "Soporte prioritario", + "pricing.plans.pro.feat8": "Historial de 90 días", + "pricing.plans.business.feat1": "1 000 documentos / mes", + "pricing.plans.business.feat2": "Hasta 500 páginas por documento", + "pricing.plans.business.feat3": "IA Esencial + Premium (Claude Haiku)", + "pricing.plans.business.feat4": "Todos los proveedores de traducción", + "pricing.plans.business.feat5": "Archivos de hasta 50 MB", + "pricing.plans.business.feat6": "Acceso API (10 000 llamadas/mes)", + "pricing.plans.business.feat7": "Webhooks de notificación", + "pricing.plans.business.feat8": "Soporte dedicado", + "pricing.plans.business.feat9": "Historial de 1 año", + "pricing.plans.business.feat10": "Analíticas avanzadas", + "pricing.plans.enterprise.feat1": "Documentos ilimitados", + "pricing.plans.enterprise.feat2": "Todos los modelos de IA (GPT-5, Claude Opus 4.6…)", + "pricing.plans.enterprise.feat3": "Implementación local o en nube dedicada", + "pricing.plans.enterprise.feat4": "SLA 99,9 % garantizado", + "pricing.plans.enterprise.feat5": "Soporte dedicado 24/7", + "pricing.plans.enterprise.feat6": "Marca blanca", + "pricing.plans.enterprise.feat7": "Equipos ilimitados", + "pricing.plans.enterprise.feat8": "Integraciones a medida", + "pricing.card.onRequest": "Bajo petición", + "pricing.card.free": "Gratis", + "pricing.card.perMonth": "/mes", + "pricing.card.billedYearly": "Facturado {price} € / año", + "pricing.card.documents": "Documentos", + "pricing.card.pagesMax": "Páginas máx.", + "pricing.card.aiTranslation": "Traducción IA", + "pricing.card.unlimited": "Ilimitado", + "pricing.card.perMonthStat": "/ mes", + "pricing.card.perDoc": "p / doc", + "pricing.card.aiEssential": "Esencial", + "pricing.card.aiEssentialPremium": "Esencial + Premium", + "pricing.card.aiCustom": "A medida", + "pricing.card.myPlan": "Mi plan", + "pricing.card.managePlan": "Gestionar mi plan", + "pricing.card.startFree": "Empezar gratis", + "pricing.card.contactUs": "Contáctenos", + "pricing.card.choosePlan": "Elegir este plan", + "pricing.card.processing": "Procesando…", + "pricing.comparison.title": "Comparación detallada", + "pricing.comparison.subtitle": "Todo lo incluido en cada plan", + "pricing.comparison.feature": "Característica", + "pricing.comparison.docsPerMonth": "Documentos / mes", + "pricing.comparison.pagesMaxPerDoc": "Páginas máx. / documento", + "pricing.comparison.maxFileSize": "Tamaño máx. de archivo", + "pricing.comparison.googleTranslation": "Traductor de Google", + "pricing.comparison.deepl": "DeepL", + "pricing.comparison.aiEssential": "Traducción IA Esencial", + "pricing.comparison.aiPremium": "Traducción IA Premium", + "pricing.comparison.apiAccess": "Acceso API", + "pricing.comparison.priorityProcessing": "Procesamiento prioritario", + "pricing.comparison.support": "Soporte", + "pricing.comparison.support.community": "Comunidad", + "pricing.comparison.support.email": "Correo electrónico", + "pricing.comparison.support.priority": "Prioritario", + "pricing.comparison.support.dedicated": "Dedicado", + "pricing.comparison.mb": "MB", + "pricing.credits.title": "Créditos adicionales", + "pricing.credits.subtitle": "¿Necesitas más? Compra créditos individuales, sin suscripción.", + "pricing.credits.perPage": "1 crédito = 1 página traducida.", + "pricing.credits.bestValue": "Mejor relación calidad-precio", + "pricing.credits.unit": "créditos", + "pricing.credits.centsPerCredit": "cts / crédito", + "pricing.credits.buy": "Comprar", + "pricing.trust.encryption.title": "Cifrado de extremo a extremo", + "pricing.trust.encryption.sub": "TLS 1.3 + AES-256 en reposo", + "pricing.trust.languages.title": "130+ idiomas", + "pricing.trust.languages.sub": "Incluido árabe, persa, hebreo (RTL)", + "pricing.trust.parallel.title": "Procesamiento en paralelo", + "pricing.trust.parallel.sub": "IA multiproceso ultrarrápida", + "pricing.trust.availability.title": "Disponible 24/7", + "pricing.trust.availability.sub": "Disponibilidad garantizada del 99,9 %", + "pricing.aiModels.title": "Nuestros modelos de IA — Marzo 2026", + "pricing.aiModels.essential.title": "Traducción IA Esencial", + "pricing.aiModels.essential.plan": "Plan Pro", + "pricing.aiModels.essential.descPrefix": "Basado en", + "pricing.aiModels.essential.descSuffix": "— el modelo de IA más rentable de 2026. Calidad comparable a los modelos frontier a 1/50 del coste.", + "pricing.aiModels.essential.context": "163K tokens de contexto", + "pricing.aiModels.essential.value": "Excelente relación calidad-precio", + "pricing.aiModels.premium.title": "Traducción IA Premium", + "pricing.aiModels.premium.plan": "Plan Business", + "pricing.aiModels.premium.descPrefix": "Basado en", + "pricing.aiModels.premium.descSuffix": "de Anthropic — preciso en documentos jurídicos, médicos y técnicos complejos.", + "pricing.aiModels.premium.context": "200K tokens de contexto", + "pricing.aiModels.premium.precision": "Máxima precisión", + "pricing.faq.title": "Preguntas frecuentes", + "pricing.faq.q1": "¿Puedo cambiar de plan en cualquier momento?", + "pricing.faq.a1": "Sí. La mejora es inmediata y prorrateada. La bajada se aplica al final del periodo actual.", + "pricing.faq.q2": "¿Qué es la «Traducción IA Esencial»?", + "pricing.faq.a2": "Es nuestro motor de IA basado en DeepSeek V3.2 a través de OpenRouter. Comprende el contexto de tus documentos, conserva el diseño y maneja términos técnicos mucho mejor que una traducción clásica.", + "pricing.faq.q3": "¿Cuál es la diferencia entre IA Esencial e IA Premium?", + "pricing.faq.a3": "La IA Esencial usa DeepSeek V3.2 (excelente relación calidad-precio). La IA Premium usa Claude 3.5 Haiku de Anthropic, más precisa en documentos jurídicos, médicos y técnicos complejos.", + "pricing.faq.q4": "¿Se conservan mis documentos después de la traducción?", + "pricing.faq.a4": "Los archivos traducidos están disponibles según tu plan (30 días Starter, 90 días Pro, 1 año Business). Están cifrados en reposo y en tránsito.", + "pricing.faq.q5": "¿Qué ocurre si supero mi cuota mensual?", + "pricing.faq.a5": "Puedes comprar créditos adicionales de forma individual o mejorar tu plan. Se te notificará al alcanzar el 80 % de uso.", + "pricing.faq.q6": "¿Hay una prueba gratuita para los planes de pago?", + "pricing.faq.a6": "El plan Gratuito es permanente y no requiere tarjeta. Para los planes Pro y Business, contáctenos para una prueba de 14 días.", + "pricing.faq.q7": "¿Qué formatos de archivo son compatibles?", + "pricing.faq.a7": "Word (.docx), Excel (.xlsx/.xls), PowerPoint (.pptx) y próximamente PDF. Todos los planes son compatibles con los mismos formatos.", + "pricing.cta.title": "¿Listo para empezar?", + "pricing.cta.subtitle": "Empieza gratis, sin tarjeta de crédito. Mejora tu plan cuando lo necesites.", + "pricing.cta.createAccount": "Crear una cuenta gratuita", + "pricing.cta.login": "Iniciar sesión", + "pricing.toast.demo": "Modo demo — Stripe aún no está configurado. En producción, serías redirigido al pago para activar el plan {planId}.", + "pricing.toast.networkError": "Error de red. Por favor, inténtalo de nuevo.", + "pricing.toast.paymentError": "Error al crear el pago.", + "register.title": "Crear una cuenta", + "register.subtitle": "Empieza a traducir gratis", + "register.error.failed": "Error en el registro", + "register.name.label": "Nombre", + "register.name.placeholder": "Tu nombre", + "register.name.error": "El nombre debe tener al menos 2 caracteres", + "register.email.label": "Correo electrónico", + "register.email.placeholder": "tu@ejemplo.com", + "register.email.error": "Dirección de correo no válida", + "register.password.label": "Contraseña", + "register.password.error": "La contraseña debe tener al menos 8 caracteres, una mayúscula, una minúscula y un dígito", + "register.password.show": "Mostrar contraseña", + "register.password.hide": "Ocultar contraseña", + "register.password.strengthLabel": "Fortaleza:", + "register.password.strength.weak": "Débil", + "register.password.strength.medium": "Media", + "register.password.strength.strong": "Fuerte", + "register.confirmPassword.label": "Confirmar contraseña", + "register.confirmPassword.error": "Las contraseñas no coinciden", + "register.confirmPassword.show": "Mostrar", + "register.confirmPassword.hide": "Ocultar", + "register.submit.creating": "Creando cuenta...", + "register.submit.create": "Crear mi cuenta", + "register.hasAccount": "¿Ya tienes una cuenta?", + "register.login": "Iniciar sesión", + "register.terms.prefix": "Al crear una cuenta, aceptas nuestros", + "register.terms.link": "términos de servicio", + + // ── Landing page ── + "landing.nav.whyUs": "Por qué nosotros", + "landing.nav.formats": "Formatos", + "landing.nav.pricing": "Precios", + "landing.nav.login": "Iniciar sesión", + "landing.nav.startFree": "Prueba gratis", + "landing.hero.badge": "Nuevo: soporte PDF + traducción con IA", + "landing.hero.title1": "Traduce tus documentos.", + "landing.hero.title2": "Mantén el formato perfecto.", + "landing.hero.subtitle": "El único traductor que preserva SmartArt, gráficos, índices, formas, encabezados y pies de página — exactamente como eran. Sin sorpresas al pagar.", + "landing.hero.cta": "Prueba gratis — 2 documentos/mes", + "landing.hero.seePlans": "Ver planes", + "landing.trust.filesDeleted": "Archivos eliminados en 60 min", + "landing.trust.noBait": "Sin precios engañosos", + "landing.trust.preview": "Vista previa antes de pagar", + "landing.why.title": "Tu formato, perfectamente preservado", + "landing.why.subtitle": "Otros traductores rompen tu diseño. Nosotros no.", + "landing.why.smartart.title": "SmartArt y diagramas", + "landing.why.smartart.desc": "Organigramas, diagramas de flujo, jerarquías — todo traducido en su lugar.", + "landing.why.toc.title": "Índices de contenido", + "landing.why.toc.desc": "Entradas del índice, números de página y referencias cruzadas se actualizan correctamente.", + "landing.why.charts.title": "Gráficos y diagramas", + "landing.why.charts.desc": "Títulos, etiquetas de ejes, leyendas y nombres de series — todo se traduce.", + "landing.why.shapes.title": "Formas y cuadros de texto", + "landing.why.shapes.desc": "Rectángulos, cuadros redondeados, llamadas — encontramos y traducimos el texto dentro de todas las formas.", + "landing.why.headers.title": "Encabezados y pies de página", + "landing.why.headers.desc": "Encabezados, pies de página y notas al pie nunca se omiten.", + "landing.why.languages.title": "130+ idiomas", + "landing.why.languages.desc": "Google Translate, DeepL y motores de IA para una calidad profesional.", + "landing.pricing.title": "Precios simples y honestos", + "landing.pricing.subtitle": "Lo que ves es lo que pagas. Sin cargos ocultos después de traducir.", + "landing.pricing.monthly": "Mensual", + "landing.pricing.yearly": "Anual", + "landing.pricing.starter.title": "Starter", + "landing.pricing.starter.desc": "Para particulares y pequeños proyectos", + "landing.pricing.starter.f1": "50 documentos / mes", + "landing.pricing.starter.f2": "Hasta 50 páginas por documento", + "landing.pricing.starter.f3": "Google Translate + DeepL", + "landing.pricing.starter.f4": "Archivos de hasta 10 MB", + "landing.pricing.starter.cta": "Comenzar", + "landing.pricing.pro.title": "Pro", + "landing.pricing.pro.badge": "Más popular", + "landing.pricing.pro.desc": "Para profesionales que necesitan calidad", + "landing.pricing.pro.f1": "200 documentos / mes", + "landing.pricing.pro.f2": "Hasta 200 páginas por documento", + "landing.pricing.pro.f3": "Traducción con IA (DeepSeek)", + "landing.pricing.pro.f4": "Google + DeepL incluidos", + "landing.pricing.pro.f5": "Glosarios y prompts personalizados", + "landing.pricing.pro.f6": "Soporte prioritario", + "landing.pricing.pro.cta": "Probar Pro", + "landing.pricing.business.title": "Business", + "landing.pricing.business.desc": "Para equipos con alto volumen de trabajo", + "landing.pricing.business.f1": "1 000 documentos / mes", + "landing.pricing.business.f2": "Hasta 500 páginas por documento", + "landing.pricing.business.f3": "IA Premium (Claude)", + "landing.pricing.business.f4": "Todos los proveedores + acceso API", + "landing.pricing.business.f5": "Webhooks y automatización", + "landing.pricing.business.f6": "5 puestos de equipo", + "landing.pricing.business.cta": "Contáctenos", + "landing.pricing.honest": "El precio mostrado es el precio que pagas. Sin cargos ocultos después de traducir.", + "landing.pricing.billedYearly": "facturado anualmente", + "landing.pricing.perMonth": "/mes", + "landing.formats.title": "Cada formato, cada elemento", + "landing.formats.subtitle": "Traducimos lo que otros omiten.", + "landing.formats.word": "Word (.docx)", + "landing.formats.word.f1": "Párrafos y encabezados", + "landing.formats.word.f2": "Tablas y gráficos", + "landing.formats.word.f3": "Diagramas SmartArt", + "landing.formats.word.f4": "Índice de contenido", + "landing.formats.word.f5": "Encabezados y pies de página", + "landing.formats.word.f6": "Formas y cuadros de texto", + "landing.formats.word.f7": "Notas al pie y al final", + "landing.formats.excel": "Excel (.xlsx)", + "landing.formats.excel.f1": "Valores de celdas", + "landing.formats.excel.f2": "Nombres de hojas", + "landing.formats.excel.f3": "Gráficos y etiquetas", + "landing.formats.excel.f4": "Encabezados y pies de página", + "landing.formats.excel.f5": "Celdas combinadas preservadas", + "landing.formats.powerpoint": "PowerPoint (.pptx)", + "landing.formats.powerpoint.f1": "Texto de diapositivas y notas", + "landing.formats.powerpoint.f2": "Gráficos y diagramas", + "landing.formats.powerpoint.f3": "Formas y cuadros de texto", + "landing.formats.powerpoint.f4": "Diseños maestros", + "landing.formats.powerpoint.f5": "Animaciones preservadas", + "landing.formats.pdf": "PDF", + "landing.formats.pdf.f1": "PDF basados en texto", + "landing.formats.pdf.f2": "Diseño preservado", + "landing.formats.pdf.f3": "Imágenes en su lugar", + "landing.formats.pdf.f4": "Tablas mantenidas", + "landing.formats.pdf.f5": "Salida como DOCX o PDF", + "landing.cta.title": "Empieza a traducir en 30 segundos", + "landing.cta.subtitle": "Sin tarjeta de crédito. Prueba 2 documentos gratis y nota la diferencia.", + "landing.cta.button": "Crear cuenta gratis", + "landing.footer.privacy": "Privacidad", + "landing.footer.terms": "Términos", + "landing.footer.contact": "Contacto", + "landing.ai.badge": "Motor de Traduccion IA", + "landing.ai.title": "La traduccion que entiende su profesion", + "landing.ai.subtitle": "Nuestros modelos de IA analizan el contexto, respetan su terminologia y traducen incluso el texto dentro de las imagenes.", + "landing.ai.context.title": "Contexto del sector", + "landing.ai.context.desc": "Describa su sector y obtenga traducciones adaptadas, no genericas.", + "landing.ai.glossary.title": "Glosarios del sector", + "landing.ai.glossary.desc": "Defina sus terminos tecnicos. CTA sera Air Handling Unit, nunca Call To Action.", + "landing.ai.vision.title": "Vision de imagenes", + "landing.ai.vision.desc": "El texto en imagenes, diagramas y graficos se detecta y traduce.", + "landing.ai.comparison.source": "Fuente (FR)", + "landing.ai.comparison.google": "Google Translate", + "landing.ai.comparison.ai": "Nuestra IA", + "landing.howItWorks.title": "Como funciona?", + "landing.howItWorks.subtitle": "Tres pasos. Cero perdida de formato.", + "landing.howItWorks.step1.title": "Suba su archivo", + "landing.howItWorks.step1.desc": "Arrastre su documento Excel, Word, PowerPoint o PDF.", + "landing.howItWorks.step2.title": "Elija idioma y motor", + "landing.howItWorks.step2.desc": "Seleccione idioma destino y motor - estandar o IA contextual.", + "landing.howItWorks.step3.title": "Descargue el resultado", + "landing.howItWorks.step3.desc": "Obtenga su documento traducido con formato identico al original.", + "login.errorTitle": "Login Error", + "login.welcomeBack": "Welcome back", + "login.signInToContinue": "Sign in to continue translating", + "login.email": "Email", + "login.emailPlaceholder": "you@example.com", + "login.password": "Password", + "login.forgotPassword": "Forgot password?", + "login.passwordPlaceholder": "••••••••", + "login.signingIn": "Signing in...", + "login.signIn": "Sign In", + "login.noAccount": "Don't have an account?", + "login.signUpFree": "Sign up for free", + "forgotPassword.enterEmail": "Please enter your email address", + "forgotPassword.error": "An error occurred", + "forgotPassword.title": "Forgot Password", + "forgotPassword.checkEmail": "Check your inbox", + "forgotPassword.subtitle": "Enter your email to receive a reset link", + "forgotPassword.sentMessage": "If an account exists with this address, a reset email has been sent.", + "forgotPassword.emailLabel": "Email address", + "forgotPassword.emailPlaceholder": "you@example.com", + "forgotPassword.sending": "Sending...", + "forgotPassword.sendLink": "Send reset link", + "forgotPassword.backToLogin": "Back to login", + "forgotPassword.loading": "Loading...", + "resetPassword.passwordRequirements": "Password must contain at least 8 characters, one uppercase, one lowercase, and one number", + "resetPassword.passwordMismatch": "Passwords do not match", + "resetPassword.tokenMissing": "Missing token. Please use the link received by email.", + "resetPassword.error": "An error occurred", + "resetPassword.invalidLink": "Invalid link", + "resetPassword.invalidLinkMessage": "This reset link is invalid. Please request a new one.", + "resetPassword.requestNewLink": "Request new link", + "resetPassword.successTitle": "Password reset", + "resetPassword.newPasswordTitle": "New password", + "resetPassword.successSubtitle": "You will be redirected to login", + "resetPassword.subtitle": "Set your new password", + "resetPassword.successMessage": "Your password has been successfully reset. You will be redirected to the login page.", + "resetPassword.newPassword": "New password", + "resetPassword.showPassword": "Show password", + "resetPassword.hidePassword": "Hide password", + "resetPassword.confirmPassword": "Confirm password", + "resetPassword.resetting": "Resetting...", + "resetPassword.resetPassword": "Reset password", + "resetPassword.backToLogin": "Back to login", + "resetPassword.loading": "Loading...", + "common.loading": "Cargando...", + "profile.header.title": "Mi perfil", + "profile.header.subtitle": "Gestiona tu cuenta y preferencias.", + "profile.tabs.account": "Cuenta", + "profile.tabs.subscription": "Suscripción", + "profile.tabs.preferences": "Preferencias", + "profile.account.user": "Usuario", + "profile.account.memberSince": "Miembro desde", + "profile.plan.label": "Plan", + "profile.plan.free": "Gratis", + "profile.plan.starter": "Starter", + "profile.plan.pro": "Pro", + "profile.plan.business": "Business", + "profile.plan.enterprise": "Enterprise", + "profile.plan.pricePerMonth": "{price} €/mes", + "profile.subscription.canceling": "Cancelando", + "profile.subscription.active": "Activa", + "profile.subscription.unknown": "Desconocido", + "profile.subscription.accessUntil": "Acceso hasta", + "profile.subscription.renewalOn": "Renovación el", + "profile.subscription.upgradePlan": "Mejorar a un plan de pago", + "profile.subscription.changePlan": "Cambiar plan", + "profile.subscription.manageBilling": "Gestionar facturación", + "profile.subscription.billingUnavailable": "Portal de facturación no disponible.", + "profile.subscription.billingError": "Error al acceder al portal de facturación.", + "profile.subscription.cancelSuccess": "Suscripción cancelada. Mantienes el acceso hasta el final del periodo.", + "profile.subscription.cancelError": "Error durante la cancelación.", + "profile.subscription.networkError": "Error de red.", + "profile.usage.title": "Uso este mes", + "profile.usage.resetOn": "Reinicio el", + "profile.usage.documents": "Documentos", + "profile.usage.pages": "Páginas", + "profile.usage.extraCredits": "crédito extra", + "profile.usage.extraCreditsPlural": "créditos extra", + "profile.usage.quotaReached": "Cuota alcanzada", + "profile.usage.quotaReachedDesc": "Mejora a un plan superior para continuar.", + "profile.usage.unlockMore": "Desbloquea más traducciones con un plan de pago.", + "profile.usage.viewPlans": "Ver planes", + "profile.usage.includedInPlan": "Incluido en tu plan", + "profile.danger.title": "Zona de peligro", + "profile.danger.description": "La cancelación surte efecto al final de tu periodo actual. Mantienes el acceso hasta esa fecha.", + "profile.danger.confirm": "¿Estás seguro? Esta acción no se puede deshacer.", + "profile.danger.confirmCancel": "Confirmar cancelación", + "profile.danger.cancelSubscription": "Cancelar mi suscripción", + "profile.danger.keep": "No, mantener", + "profile.prefs.interfaceLang": "Idioma de la interfaz", + "profile.prefs.interfaceLangDesc": "El idioma se detecta automáticamente según tu navegador. Puedes cambiarlo manualmente.", + "profile.prefs.defaultTargetLang": "Idioma de destino predeterminado", + "profile.prefs.selectLanguage": "Seleccionar un idioma", + "profile.prefs.defaultTargetLangDesc": "Este idioma se preseleccionará para tus traducciones.", + "profile.prefs.save": "Guardar", + "profile.prefs.theme": "Tema", + "profile.prefs.themeDesc": "Elige la apariencia de la interfaz", + "profile.prefs.cache": "Caché", + "profile.prefs.cacheDesc": "Borrar la caché local puede solucionar algunos problemas de visualización.", + "profile.prefs.clearing": "Borrando...", + "profile.prefs.clearCache": "Borrar caché", + "settings.title": "Configuración", + "settings.subtitle": "Configuración general de la aplicación", + "settings.formats.title": "Formatos compatibles", + "settings.formats.subtitle": "Tipos de documentos que puedes traducir", + "settings.formats.formulas": "Fórmulas", + "settings.formats.styles": "Estilos", + "settings.formats.images": "Imágenes", + "settings.formats.headers": "Encabezados", + "settings.formats.tables": "Tablas", + "settings.formats.slides": "Diapositivas", + "settings.formats.notes": "Notas", + "settings.cache.title": "Caché", + "settings.cache.desc": "Borrar la caché local puede solucionar algunos problemas de visualización.", + "settings.cache.clearing": "Borrando...", + "settings.cache.clear": "Borrar caché", + "services.title": "Proveedores de traducción", + "services.subtitle": "Los proveedores están configurados por el administrador. Puedes ver cuáles están disponibles para tu cuenta.", + "services.loading": "Cargando proveedores...", + "services.noProviders": "No hay proveedores configurados actualmente. Contacta a tu administrador.", + "services.classic": "Traducción clásica", + "services.llmPro": "LLM · Contextual (Pro)", + "services.available": "Disponible", + "services.model": "Modelo", + "services.adminOnly.title": "La configuración de proveedores es solo para administradores", + "services.adminOnly.desc": "Las claves API, la selección de modelos y la activación de proveedores son gestionadas exclusivamente por el administrador en el panel de administración. Nunca necesitas introducir una clave API.", + "apiKeys.title": "Claves API", + "apiKeys.subtitle": "Gestiona tus claves API para el acceso programático a la API de traducción.", + "apiKeys.loading": "Cargando...", + "apiKeys.sectionTitle": "API y automatización", + "apiKeys.sectionDesc": "Genera y gestiona tus claves API para flujos de automatización", + "apiKeys.keysUsed": "{total} de {max} claves usadas", + "apiKeys.maxReached": "Máximo de claves alcanzado. Revoca una clave para generar una nueva.", + "apiKeys.canGenerate": "Puedes generar {count} clave más", + "apiKeys.canGeneratePlural": "Puedes generar {count} claves más", + "apiKeys.generateNew": "Generar nueva clave", + "apiKeys.keyRevoked": "Clave revocada", + "apiKeys.keyRevokedDesc": "La clave API ha sido revocada correctamente.", + "apiKeys.keyNotFound": "Clave no encontrada", + "apiKeys.keyNotFoundDesc": "La clave API ya no existe. Puede que ya haya sido revocada.", + "apiKeys.error": "Error", + "apiKeys.revokeError": "Error al revocar la clave API. Inténtalo de nuevo.", + "apiKeys.limitReached": "Límite alcanzado", + "apiKeys.limitReachedDesc": "Has alcanzado el máximo de 10 claves API. Revoca una clave existente para generar una nueva.", + "apiKeys.proRequired": "Función Pro requerida", + "apiKeys.proRequiredDesc": "Las claves API son una función Pro. Mejora tu cuenta.", + "apiKeys.generateError": "Error al generar la clave API. Inténtalo de nuevo.", + "apiKeys.upgrade.title": "Claves API", + "apiKeys.upgrade.subtitle": "Automatiza tus traducciones con acceso API", + "apiKeys.upgrade.feat1": "Genera claves API ilimitadas", + "apiKeys.upgrade.feat2": "Automatiza la traducción de documentos", + "apiKeys.upgrade.feat3": "Notificaciones por webhook", + "apiKeys.upgrade.feat4": "Modos de traducción LLM", + "apiKeys.upgrade.proFeature": "Las claves API son una función {pro}. Mejora para desbloquear la automatización API.", + "apiKeys.upgrade.pro": "Pro", + "apiKeys.upgrade.cta": "Mejorar a Pro", + "apiKeys.dialog.maxTitle": "Máximo de claves alcanzado", + "apiKeys.dialog.maxDesc": "Has alcanzado el máximo de 10 claves API. Revoca una clave existente antes de generar una nueva.", + "apiKeys.dialog.close": "Cerrar", + "apiKeys.dialog.generated": "¡Clave API generada!", + "apiKeys.dialog.generatedDesc": "Tu nueva clave API ha sido creada. Cópiala ahora, no se volverá a mostrar.", + "apiKeys.dialog.important": "Importante:", + "apiKeys.dialog.importantDesc": "Esta es la única vez que verás esta clave. Guárdala de forma segura.", + "apiKeys.dialog.apiKey": "Clave API", + "apiKeys.dialog.name": "Nombre:", + "apiKeys.dialog.done": "Listo", + "apiKeys.dialog.copied": "Ya he copiado la clave", + "apiKeys.dialog.generateTitle": "Generar nueva clave API", + "apiKeys.dialog.generateDesc": "Crea una nueva clave API para el acceso programático a la API de traducción.", + "apiKeys.dialog.keyName": "Nombre de la clave (opcional)", + "apiKeys.dialog.keyNamePlaceholder": "p.ej., Producción, Staging", + "apiKeys.dialog.keyNameHint": "Un nombre descriptivo para identificar esta clave más tarde.", + "apiKeys.dialog.nameTooLong": "El nombre debe tener {max} caracteres o menos", + "apiKeys.dialog.nameInvalid": "El nombre solo puede contener letras, números, espacios, guiones y guiones bajos", + "apiKeys.dialog.cancel": "Cancelar", + "apiKeys.dialog.generating": "Generando...", + "apiKeys.dialog.generate": "Generar clave", + "apiKeys.table.name": "Nombre", + "apiKeys.table.prefix": "Prefijo", + "apiKeys.table.created": "Creada", + "apiKeys.table.lastUsed": "Último uso", + "apiKeys.table.never": "Nunca", + "apiKeys.table.actions": "Acciones", + "apiKeys.table.revoke": "Revocar", + "apiKeys.table.copyPrefix": "Copiar prefijo de la clave", + "apiKeys.table.revokeKey": "Revocar clave", + "apiKeys.revokeDialog.title": "Revocar clave API", + "apiKeys.revokeDialog.desc": "¿Estás seguro de que quieres revocar la clave \"{name}\"? Esta acción no se puede deshacer.", + "apiKeys.revokeDialog.confirm": "Sí, revocar", + "apiKeys.revokeDialog.cancel": "Cancelar", + "context.proTitle": "Función Pro", + "context.proDesc": "El contexto y los glosarios profesionales están disponibles con los planes Pro, Business y Enterprise. Proporcionan traducciones más precisas mediante instrucciones y vocabulario específico de tu dominio.", + "context.viewPlans": "Ver planes", + "context.title": "Contexto y glosario", + "context.subtitle": "Mejora la calidad de traducción con instrucciones y vocabulario específico de tu dominio.", + "context.presets.title": "Glosarios profesionales", + "context.presets.desc": "Carga un glosario completo con instrucciones y terminología especializada", + "context.instructions.title": "Instrucciones de contexto", + "context.instructions.desc": "Instrucciones que la IA seguirá durante la traducción", + "context.instructions.placeholder": "P.ej.: Traduces documentos técnicos de climatización. Usa terminología de ingeniería precisa...", + "context.glossary.title": "Glosario técnico", + "context.glossary.desc": "Formato: origen=destino (uno por línea). Los glosarios cargados mediante preset son editables.", + "context.glossary.terms": "términos en el glosario", + "context.clearAll": "Borrar todo", + "context.saving": "Guardando...", + "context.save": "Guardar", + "admin.login.title": "Administración", + "admin.login.required": "Inicio de sesión requerido", + "admin.login.password": "Contraseña de administrador", + "admin.login.connecting": "Conectando...", + "admin.login.access": "Acceder al panel de administración", + "admin.login.restricted": "Restringido a administradores", + "admin.layout.checking": "Verificando autenticación...", + "admin.dashboard.title": "Panel de Administración", + "admin.dashboard.subtitle": "Panel de control del administrador", + "admin.dashboard.refresh": "Actualizar", + "admin.dashboard.refreshTooltip": "Actualizar datos del panel", + "admin.dashboard.config": "Configuración del sistema", + "admin.dashboard.maxFileSize": "Tamaño máximo de archivo:", + "admin.dashboard.translationService": "Servicio de traducción:", + "admin.dashboard.formats": "Formatos:", + "admin.nav.dashboard": "Dashboard", + "admin.nav.users": "Usuarios", + "admin.nav.pricing": "Precios y Stripe", + "admin.nav.providers": "Proveedores", + "admin.nav.system": "Sistema", + "admin.nav.logs": "Registros", + "admin.users.title": "Gestión de Usuarios", + "admin.users.subtitle": "Ver y gestionar cuentas de usuario", + "admin.users.planUpdated": "Plan actualizado", + "admin.users.planChanged": "El plan se ha cambiado a \"{plan}\" correctamente.", + "admin.users.unknownError": "Error desconocido", + "admin.users.error": "Error", + "admin.users.planUpdateError": "No se pudo actualizar el plan: {message}", + "admin.users.noKeys": "Sin claves", + "admin.users.noKeysDesc": "Este usuario no tiene claves API activas.", + "admin.users.keysRevoked": "Claves revocadas", + "admin.users.keysRevokedDesc": "{count} clave(s) API revocada(s) correctamente.", + "admin.users.revokeError": "No se pudieron revocar las claves: {message}", + "admin.users.retry": "Reintentar", + "admin.system.title": "Sistema", + "admin.system.subtitle": "Supervisar el estado del sistema y gestionar recursos", + "admin.system.quotas": "Cuotas de traducción", + "admin.system.resetQuotas": "Restablecer cuotas mensuales", + "admin.system.resetting": "Restableciendo...", + "admin.system.reset": "Restablecer", + "admin.system.allOperational": "Todos los sistemas operativos", + "admin.system.issuesDetected": "Problemas detectados en el sistema", + "admin.system.waitingData": "Esperando datos...", + "admin.system.purging": "Purgando...", + "admin.system.clean": "Limpiar", + "admin.system.purge": "Purgar", + }, + // ═══════════════════════════════════════════════════════════════ + // GERMAN (de) + // ═══════════════════════════════════════════════════════════════ + de: { + "auth.brandName": "Office Translator", + "dashboard.nav.translate": "Übersetzen", + "dashboard.nav.profile": "Mein Profil", + "dashboard.nav.settings": "Einstellungen", + "dashboard.nav.context": "Kontext", + "dashboard.nav.services": "Dienste", + "dashboard.nav.apiKeys": "API-Schlüssel", + "dashboard.nav.glossaries": "Glossare", + "dashboard.header.title": "Dashboard", + "dashboard.header.subtitle": "Verwalten Sie Ihre Übersetzungen", + "dashboard.header.toggleMenu": "Menü", + "dashboard.header.profileTitle": "Mein Profil", + "dashboard.sidebar.theme": "Design", + "dashboard.sidebar.signOut": "Abmelden", + "dashboard.sidebar.backHome": "Zurück zur Startseite", + "dashboard.translate.pageTitle": "Dokument übersetzen", + "dashboard.translate.pageSubtitle": "Datei importieren und Zielsprache wählen", + "dashboard.translate.errorNotificationTitle": "Fehler", + "dashboard.translate.dropzone.uploadAria": "Datei-Ablagebereich", + "dashboard.translate.dropzone.title": "Datei hierher ziehen und ablegen", + "dashboard.translate.dropzone.subtitle": "oder klicken, um auszuwählen (DOCX, XLSX, PPTX, PDF)", + "dashboard.translate.dropzone.replaceFile": "Datei ersetzen", + "dashboard.translate.language.source": "Ausgangssprache", + "dashboard.translate.language.target": "Zielsprache", + "dashboard.translate.language.loading": "Sprachen werden geladen…", + "dashboard.translate.language.autoDetect": "Automatisch erkennen", + "dashboard.translate.language.selectPlaceholder": "Auswählen…", + "dashboard.translate.language.loadErrorPrefix": "Fehler beim Laden der Sprachen", + "dashboard.translate.provider.loading": "Anbieter werden geladen…", + "dashboard.translate.provider.noneConfigured": "Keine Anbieter konfiguriert", + "dashboard.translate.provider.modelTitle": "Modell", + "dashboard.translate.provider.sectionTitle": "Anbieter", + "dashboard.translate.provider.llmDivider": "KI · Kontextbasiert", + "dashboard.translate.provider.llmDividerPro": "KI · Kontextbasiert (Pro)", + "dashboard.translate.provider.upgrade": "Auf Pro upgraden", + "dashboard.translate.provider.upgradeSuffix": "um KI-Übersetzung freizuschalten", + "dashboard.translate.trust.zeroRetention": "Keine Datenspeicherung", + "dashboard.translate.trust.deletedAfter": "Dateien nach Verarbeitung gelöscht", + "dashboard.translate.actions.uploading": "Wird hochgeladen…", + "dashboard.translate.actions.translate": "Übersetzen", + "dashboard.translate.actions.filePrefix": "Datei: ", + "dashboard.translate.actions.cancel": "Abbrechen", + "dashboard.translate.actions.tryAgain": "Erneut versuchen", + "dashboard.translate.steps.uploading": "Datei wird hochgeladen…", + "dashboard.translate.steps.starting": "Übersetzung wird gestartet…", + "dashboard.translate.complete.title": "Übersetzung abgeschlossen!", + "dashboard.translate.complete.descNamed": "Ihre Datei {name} wurde erfolgreich übersetzt.", + "dashboard.translate.complete.descGeneric": "Ihre Datei wurde erfolgreich übersetzt.", + "dashboard.translate.complete.downloading": "Wird heruntergeladen…", + "dashboard.translate.complete.download": "Herunterladen", + "dashboard.translate.complete.newTranslation": "Neue Übersetzung", + "dashboard.translate.complete.toastOkTitle": "Erfolgreich", + "dashboard.translate.complete.toastFailTitle": "Fehlgeschlagen", + "dashboard.translate.complete.toastFailDesc": "Übersetzung fehlgeschlagen. Bitte versuchen Sie es erneut.", + "dashboard.translate.sourceDocument": "Quelldokument", + "dashboard.translate.configuration": "Konfiguration", + "dashboard.translate.translating": "Übersetzung läuft", + "dashboard.translate.liveMonitor": "Live-Monitor", + "dashboard.translate.summary": "Zusammenfassung", + "dashboard.translate.engine": "Engine", + "dashboard.translate.confidence": "Konfidenz", + "dashboard.translate.cancel": "Abbrechen", + "dashboard.translate.segments": "Segmente", + "dashboard.translate.characters": "Zeichen", + "dashboard.translate.elapsed": "Verstrichen", + "dashboard.translate.segPerMin": "Seg/Min", + "dashboard.translate.highQuality": "Hohe Qualität", + "dashboard.translate.quality": "Qualität", + "dashboard.translate.completed": "Übersetzung abgeschlossen", + "dashboard.translate.replace": "Ersetzen", + "dashboard.translate.pdfMode.title": "PDF-Übersetzungsmodus", + "dashboard.translate.pdfMode.preserveLayout": "Layout beibehalten", + "dashboard.translate.pdfMode.textOnly": "Nur Text", + "dashboard.translate.pdfMode.preserveLayoutDesc": "Behält Bilder, Tabellen und Formatierung. Ideal für einfache PDFs.", + "dashboard.translate.pdfMode.textOnlyDesc": "Übersetzt den gesamten Text perfekt. Saubere Ausgabe ohne Layoutprobleme.", + "dashboard.translate.pipeline.upload": "Hochladen", + "dashboard.translate.pipeline.analyze": "Analysieren", + "dashboard.translate.pipeline.translate": "Übersetzung", + "dashboard.translate.pipeline.rebuild": "Rekonstruieren", + "dashboard.translate.pipeline.finalize": "Finalisieren", + "dashboard.translate.progress.failedTitle": "Übersetzung fehlgeschlagen", + "glossaries.dialog.title": "Neues Glossar", + "glossaries.dialog.description": "Erstellen Sie ein Glossar für Ihre Übersetzungen", + "glossaries.dialog.nameLabel": "Name", + "glossaries.dialog.namePlaceholder": "Mein Glossar", + "glossaries.dialog.tabTemplates": "Vorlagen", + "glossaries.dialog.tabFile": "Datei", + "glossaries.dialog.tabManual": "Manuell", + "glossaries.dialog.cancel": "Abbrechen", + "glossaries.dialog.creating": "Wird erstellt…", + "glossaries.dialog.importing": "Wird importiert…", + "glossaries.dialog.importBtn": "Importieren", + "glossaries.dialog.selectPrompt": "Auswählen", + "glossaries.dialog.createBtn": "Erstellen", + "glossaries.dialog.createEmpty": "Leer erstellen", + "glossaries.dialog.terms": "Begriffe", + "glossaries.dialog.templatesDesc": "Wählen Sie eine vordefinierte Vorlage", + "glossaries.dialog.templatesEmpty": "Keine Vorlagen verfügbar", + "glossaries.dialog.dropTitle": "CSV-Datei hierher ziehen", + "glossaries.dialog.dropOr": "oder", + "glossaries.dialog.dropFormats": "CSV, TSV, TXT", + "glossaries.dialog.formatTitle": "Format", + "glossaries.dialog.formatDesc": "Quelle,Ziel (eine pro Zeile)", + "glossaries.dialog.formatNote": "Erste Zeile wird bei erkanntem Header übersprungen", + "glossaries.dialog.errorFormat": "Nicht unterstütztes Format", + "glossaries.dialog.errorSize": "Datei zu groß", + "glossaries.dialog.errorEmpty": "Leere Datei", + "glossaries.dialog.errorRead": "Lesefehler", + "glossaries.dialog.parsing": "Wird analysiert…", + "glossaries.dialog.termsImported": "Begriffe importiert", + "glossaries.dialog.changeFile": "Datei ändern", + "glossaries.dialog.retry": "Erneut versuchen", + "pricing.nav.back": "Zurück", + "pricing.nav.home": "Startseite", + "pricing.nav.mySubscription": "Mein Abonnement", + "pricing.header.badge": "KI-Modelle aktualisiert — März 2026", + "pricing.header.title": "Der passende Plan für jedes Bedürfnis", + "pricing.header.subtitle": "Übersetzen Sie Ihre Word-, Excel- und PowerPoint-Dokumente unter Beibehaltung des Original-Layouts. Ohne API-Schlüssel.", + "pricing.billing.monthly": "Monatlich", + "pricing.billing.yearly": "Jährlich", + "pricing.plans.free.name": "Kostenlos", + "pricing.plans.starter.name": "Starter", + "pricing.plans.pro.name": "Pro", + "pricing.plans.business.name": "Business", + "pricing.plans.enterprise.name": "Enterprise", + "pricing.plans.free.description": "Perfekt zum Kennenlernen der App", + "pricing.plans.starter.description": "Für Einzelpersonen und kleine Projekte", + "pricing.plans.pro.description": "Für Professionals und wachsende Teams", + "pricing.plans.business.description": "Für Teams und Organisationen", + "pricing.plans.enterprise.description": "Maßgeschneiderte Lösungen für große Organisationen", + "pricing.plans.pro.highlight": "Am beliebtesten", + "pricing.plans.pro.badge": "BELIEBT", + "pricing.plans.enterprise.badge": "AUF ANFRAGE", + "pricing.plans.free.feat1": "5 Dokumente / Monat", + "pricing.plans.free.feat2": "Bis zu 15 Seiten pro Dokument", + "pricing.plans.free.feat3": "Google Übersetzer inklusive", + "pricing.plans.free.feat4": "Alle Sprachen (130+)", + "pricing.plans.free.feat5": "Community-Support", + "pricing.plans.starter.feat1": "50 Dokumente / Monat", + "pricing.plans.starter.feat2": "Bis zu 50 Seiten pro Dokument", + "pricing.plans.starter.feat3": "Google Übersetzer + DeepL", + "pricing.plans.starter.feat4": "Dateien bis zu 10 MB", + "pricing.plans.starter.feat5": "E-Mail-Support", + "pricing.plans.starter.feat6": "30 Tage Verlauf", + "pricing.plans.pro.feat1": "200 Dokumente / Monat", + "pricing.plans.pro.feat2": "Bis zu 200 Seiten pro Dokument", + "pricing.plans.pro.feat3": "KI-Basisübersetzung (DeepSeek V3.2)", + "pricing.plans.pro.feat4": "Google Übersetzer + DeepL", + "pricing.plans.pro.feat5": "Dateien bis zu 25 MB", + "pricing.plans.pro.feat6": "Benutzerdefinierte Glossare", + "pricing.plans.pro.feat7": "Prioritäts-Support", + "pricing.plans.pro.feat8": "90 Tage Verlauf", + "pricing.plans.business.feat1": "1.000 Dokumente / Monat", + "pricing.plans.business.feat2": "Bis zu 500 Seiten pro Dokument", + "pricing.plans.business.feat3": "Basis- + Premium-KI (Claude Haiku)", + "pricing.plans.business.feat4": "Alle Übersetzungsanbieter", + "pricing.plans.business.feat5": "Dateien bis zu 50 MB", + "pricing.plans.business.feat6": "API-Zugang (10.000 Aufrufe/Monat)", + "pricing.plans.business.feat7": "Benachrichtigungs-Webhooks", + "pricing.plans.business.feat8": "Dedizierter Support", + "pricing.plans.business.feat9": "1 Jahr Verlauf", + "pricing.plans.business.feat10": "Erweiterte Analysen", + "pricing.plans.enterprise.feat1": "Unbegrenzte Dokumente", + "pricing.plans.enterprise.feat2": "Alle KI-Modelle (GPT-5, Claude Opus 4.6…)", + "pricing.plans.enterprise.feat3": "On-Premise oder dedizierte Cloud", + "pricing.plans.enterprise.feat4": "99,9 % SLA garantiert", + "pricing.plans.enterprise.feat5": "24/7 dedizierter Support", + "pricing.plans.enterprise.feat6": "White-Label", + "pricing.plans.enterprise.feat7": "Unbegrenzte Teams", + "pricing.plans.enterprise.feat8": "Maßgeschneiderte Integrationen", + "pricing.card.onRequest": "Auf Anfrage", + "pricing.card.free": "Kostenlos", + "pricing.card.perMonth": "/Monat", + "pricing.card.billedYearly": "{price} € / Jahr abgerechnet", + "pricing.card.documents": "Dokumente", + "pricing.card.pagesMax": "Max. Seiten", + "pricing.card.aiTranslation": "KI-Übersetzung", + "pricing.card.unlimited": "Unbegrenzt", + "pricing.card.perMonthStat": "/ Monat", + "pricing.card.perDoc": "S. / Dok.", + "pricing.card.aiEssential": "Basis", + "pricing.card.aiEssentialPremium": "Basis + Premium", + "pricing.card.aiCustom": "Maßgeschneidert", + "pricing.card.myPlan": "Mein Plan", + "pricing.card.managePlan": "Plan verwalten", + "pricing.card.startFree": "Kostenlos starten", + "pricing.card.contactUs": "Kontaktieren Sie uns", + "pricing.card.choosePlan": "Diesen Plan wählen", + "pricing.card.processing": "Wird verarbeitet…", + "pricing.comparison.title": "Detaillierter Vergleich", + "pricing.comparison.subtitle": "Alles, was in jedem Plan enthalten ist", + "pricing.comparison.feature": "Funktion", + "pricing.comparison.docsPerMonth": "Dokumente / Monat", + "pricing.comparison.pagesMaxPerDoc": "Max. Seiten / Dokument", + "pricing.comparison.maxFileSize": "Max. Dateigröße", + "pricing.comparison.googleTranslation": "Google Übersetzer", + "pricing.comparison.deepl": "DeepL", + "pricing.comparison.aiEssential": "KI-Basisübersetzung", + "pricing.comparison.aiPremium": "KI-Premiumübersetzung", + "pricing.comparison.apiAccess": "API-Zugang", + "pricing.comparison.priorityProcessing": "Prioritätsverarbeitung", + "pricing.comparison.support": "Support", + "pricing.comparison.support.community": "Community", + "pricing.comparison.support.email": "E-Mail", + "pricing.comparison.support.priority": "Priorität", + "pricing.comparison.support.dedicated": "Dediziert", + "pricing.comparison.mb": "MB", + "pricing.credits.title": "Zusätzliche Guthaben", + "pricing.credits.subtitle": "Mehr benötigt? Guthaben einzeln kaufen, ohne Abo.", + "pricing.credits.perPage": "1 Guthaben = 1 übersetzte Seite.", + "pricing.credits.bestValue": "Bestes Preis-Leistungs-Verhältnis", + "pricing.credits.unit": "Guthaben", + "pricing.credits.centsPerCredit": "ct / Guthaben", + "pricing.credits.buy": "Kaufen", + "pricing.trust.encryption.title": "Ende-zu-Ende-Verschlüsselung", + "pricing.trust.encryption.sub": "TLS 1.3 + AES-256 im Ruhezustand", + "pricing.trust.languages.title": "130+ Sprachen", + "pricing.trust.languages.sub": "Einschließlich Arabisch, Persisch, Hebräisch (RTL)", + "pricing.trust.parallel.title": "Parallele Verarbeitung", + "pricing.trust.parallel.sub": "Ultraschnelle Multi-Thread-KI", + "pricing.trust.availability.title": "24/7 verfügbar", + "pricing.trust.availability.sub": "99,9 % garantierte Verfügbarkeit", + "pricing.aiModels.title": "Unsere KI-Modelle — März 2026", + "pricing.aiModels.essential.title": "KI-Basisübersetzung", + "pricing.aiModels.essential.plan": "Pro-Plan", + "pricing.aiModels.essential.descPrefix": "Basierend auf", + "pricing.aiModels.essential.descSuffix": "— dem kosteneffizientesten KI-Modell 2026. Qualität vergleichbar mit Frontier-Modellen zu 1/50 der Kosten.", + "pricing.aiModels.essential.context": "163K Token Kontext", + "pricing.aiModels.essential.value": "Hervorragendes Preis-Leistungs-Verhältnis", + "pricing.aiModels.premium.title": "KI-Premiumübersetzung", + "pricing.aiModels.premium.plan": "Business-Plan", + "pricing.aiModels.premium.descPrefix": "Basierend auf", + "pricing.aiModels.premium.descSuffix": "von Anthropic — präzise bei juristischen, medizinischen und komplexen technischen Dokumenten.", + "pricing.aiModels.premium.context": "200K Token Kontext", + "pricing.aiModels.premium.precision": "Höchste Genauigkeit", + "pricing.faq.title": "Häufig gestellte Fragen", + "pricing.faq.q1": "Kann ich jederzeit den Plan wechseln?", + "pricing.faq.a1": "Ja. Ein Upgrade erfolgt sofort und anteilig. Ein Downgrade wird am Ende des aktuellen Zeitraums wirksam.", + "pricing.faq.q2": "Was ist die «KI-Basisübersetzung»?", + "pricing.faq.a2": "Unser KI-Motor basiert auf DeepSeek V3.2 über OpenRouter. Er versteht den Kontext Ihrer Dokumente, erhält das Layout und verarbeitet Fachbegriffe deutlich besser als klassische Übersetzungen.", + "pricing.faq.q3": "Was ist der Unterschied zwischen Basis- und Premium-KI?", + "pricing.faq.a3": "Die Basis-KI nutzt DeepSeek V3.2 (hervorragendes Preis-Leistungs-Verhältnis). Die Premium-KI verwendet Claude 3.5 Haiku von Anthropic und ist genauer bei juristischen, medizinischen und komplexen technischen Dokumenten.", + "pricing.faq.q4": "Werden meine Dokumente nach der Übersetzung gespeichert?", + "pricing.faq.a4": "Übersetzte Dateien sind je nach Plan verfügbar (30 Tage Starter, 90 Tage Pro, 1 Jahr Business). Sie sind im Ruhezustand und bei der Übertragung verschlüsselt.", + "pricing.faq.q5": "Was passiert, wenn ich mein monatliches Kontingent überschreite?", + "pricing.faq.a5": "Sie können einzelne Guthaben kaufen oder Ihr Abo upgraden. Sie werden bei 80 % Nutzung benachrichtigt.", + "pricing.faq.q6": "Gibt es eine kostenlose Testversion für kostenpflichtige Pläne?", + "pricing.faq.a6": "Der Kostenlos-Plan ist dauerhaft und ohne Kreditkarte. Für Pro und Business kontaktieren Sie uns für eine 14-tägige Testphase.", + "pricing.faq.q7": "Welche Dateiformate werden unterstützt?", + "pricing.faq.a7": "Word (.docx), Excel (.xlsx/.xls), PowerPoint (.pptx) und bald PDF. Alle Pläne unterstützen dieselben Formate.", + "pricing.cta.title": "Bereit loszulegen?", + "pricing.cta.subtitle": "Starten Sie kostenlos, ohne Kreditkarte. Upgraden Sie, wenn Sie möchten.", + "pricing.cta.createAccount": "Kostenloses Konto erstellen", + "pricing.cta.login": "Anmelden", + "pricing.toast.demo": "Demo-Modus — Stripe ist noch nicht konfiguriert. In der Produktion würden Sie zur Zahlung weitergeleitet, um den Plan {planId} zu aktivieren.", + "pricing.toast.networkError": "Netzwerkfehler. Bitte versuchen Sie es erneut.", + "pricing.toast.paymentError": "Fehler beim Erstellen der Zahlung.", + "register.title": "Konto erstellen", + "register.subtitle": "Kostenlos mit dem Übersetzen beginnen", + "register.error.failed": "Registrierung fehlgeschlagen", + "register.name.label": "Name", + "register.name.placeholder": "Ihr Name", + "register.name.error": "Der Name muss mindestens 2 Zeichen lang sein", + "register.email.label": "E-Mail-Adresse", + "register.email.placeholder": "sie@beispiel.de", + "register.email.error": "Ungültige E-Mail-Adresse", + "register.password.label": "Passwort", + "register.password.error": "Das Passwort muss mindestens 8 Zeichen haben, mit Großbuchstabe, Kleinbuchstabe und Ziffer", + "register.password.show": "Passwort anzeigen", + "register.password.hide": "Passwort verbergen", + "register.password.strengthLabel": "Stärke:", + "register.password.strength.weak": "Schwach", + "register.password.strength.medium": "Mittel", + "register.password.strength.strong": "Stark", + "register.confirmPassword.label": "Passwort bestätigen", + "register.confirmPassword.error": "Passwörter stimmen nicht überein", + "register.confirmPassword.show": "Anzeigen", + "register.confirmPassword.hide": "Verbergen", + "register.submit.creating": "Konto wird erstellt...", + "register.submit.create": "Mein Konto erstellen", + "register.hasAccount": "Bereits ein Konto?", + "register.login": "Anmelden", + "register.terms.prefix": "Mit der Kontoerstellung akzeptieren Sie unsere", + "register.terms.link": "Nutzungsbedingungen", + + // ── Landing page ── + "landing.nav.whyUs": "Warum wir", + "landing.nav.formats": "Formate", + "landing.nav.pricing": "Preise", + "landing.nav.login": "Anmelden", + "landing.nav.startFree": "Kostenlos starten", + "landing.hero.badge": "Neu: PDF-Unterstützung + KI-gestützte Übersetzung", + "landing.hero.title1": "Übersetzen Sie Ihre Dokumente.", + "landing.hero.title2": "Behalten Sie die perfekte Formatierung.", + "landing.hero.subtitle": "Der einzige Übersetzer, der SmartArt, Diagramme, Inhaltsverzeichnisse, Formen, Kopf- und Fußzeilen bewahrt — genau so, wie sie waren. Keine Überraschungen beim Bezahlen.", + "landing.hero.cta": "Kostenlos starten — 2 Dok./Monat", + "landing.hero.seePlans": "Pläne ansehen", + "landing.trust.filesDeleted": "Dateien nach 60 Min. gelöscht", + "landing.trust.noBait": "Keine Lockangebote", + "landing.trust.preview": "Vorschau vor Bezahlung", + "landing.why.title": "Ihre Formatierung, perfekt erhalten", + "landing.why.subtitle": "Andere Übersetzer zerstören Ihr Layout. Wir nicht.", + "landing.why.smartart.title": "SmartArt & Diagramme", + "landing.why.smartart.desc": "Organigramme, Flussdiagramme, Hierarchien — alles an Ort und Stelle übersetzt.", + "landing.why.toc.title": "Inhaltsverzeichnisse", + "landing.why.toc.desc": "Verzeichniseinträge, Seitenzahlen und Querverweise werden korrekt aktualisiert.", + "landing.why.charts.title": "Diagramme & Grafiken", + "landing.why.charts.desc": "Titel, Achsenbeschriftungen, Legenden und Reihennamen — alles wird übersetzt.", + "landing.why.shapes.title": "Formen & Textfelder", + "landing.why.shapes.desc": "Rechtecke, abgerundete Boxen, Sprechblasen — wir finden und übersetzen Text in allen Formen.", + "landing.why.headers.title": "Kopf- & Fußzeilen", + "landing.why.headers.desc": "Kopfzeilen, Fußzeilen und Fußnotentexte werden nie übersehen.", + "landing.why.languages.title": "130+ Sprachen", + "landing.why.languages.desc": "Google Translate, DeepL und KI-gestützte Engines für professionelle Qualität.", + "landing.pricing.title": "Einfache, ehrliche Preise", + "landing.pricing.subtitle": "Was Sie sehen, ist was Sie zahlen. Keine versteckten Gebühren nach der Übersetzung.", + "landing.pricing.monthly": "Monatlich", + "landing.pricing.yearly": "Jährlich", + "landing.pricing.starter.title": "Starter", + "landing.pricing.starter.desc": "Für Einzelpersonen und kleine Projekte", + "landing.pricing.starter.f1": "50 Dokumente / Monat", + "landing.pricing.starter.f2": "Bis zu 50 Seiten pro Dokument", + "landing.pricing.starter.f3": "Google Translate + DeepL", + "landing.pricing.starter.f4": "Dateien bis zu 10 MB", + "landing.pricing.starter.cta": "Loslegen", + "landing.pricing.pro.title": "Pro", + "landing.pricing.pro.badge": "Am beliebtesten", + "landing.pricing.pro.desc": "Für Profis, die Qualität brauchen", + "landing.pricing.pro.f1": "200 Dokumente / Monat", + "landing.pricing.pro.f2": "Bis zu 200 Seiten pro Dokument", + "landing.pricing.pro.f3": "KI-gestützte Übersetzung (DeepSeek)", + "landing.pricing.pro.f4": "Google + DeepL inklusive", + "landing.pricing.pro.f5": "Benutzerdefinierte Glossare & Prompts", + "landing.pricing.pro.f6": "Prioritäts-Support", + "landing.pricing.pro.cta": "Pro testen", + "landing.pricing.business.title": "Business", + "landing.pricing.business.desc": "Für Teams mit hohem Bedarf", + "landing.pricing.business.f1": "1 000 Dokumente / Monat", + "landing.pricing.business.f2": "Bis zu 500 Seiten pro Dokument", + "landing.pricing.business.f3": "Premium-KI (Claude)", + "landing.pricing.business.f4": "Alle Anbieter + API-Zugriff", + "landing.pricing.business.f5": "Webhooks & Automatisierung", + "landing.pricing.business.f6": "5 Team-Plätze", + "landing.pricing.business.cta": "Kontakt aufnehmen", + "landing.pricing.honest": "Der angezeigte Preis ist der Preis, den Sie zahlen. Keine versteckten Gebühren nach der Übersetzung.", + "landing.pricing.billedYearly": "jährlich abgerechnet", + "landing.pricing.perMonth": "/Mon.", + "landing.formats.title": "Jedes Format, jedes Element", + "landing.formats.subtitle": "Wir übersetzen, was andere übersehen.", + "landing.formats.word": "Word (.docx)", + "landing.formats.word.f1": "Absätze und Überschriften", + "landing.formats.word.f2": "Tabellen und Diagramme", + "landing.formats.word.f3": "SmartArt-Diagramme", + "landing.formats.word.f4": "Inhaltsverzeichnis", + "landing.formats.word.f5": "Kopf- und Fußzeilen", + "landing.formats.word.f6": "Formen und Textfelder", + "landing.formats.word.f7": "Fuß- und Endnoten", + "landing.formats.excel": "Excel (.xlsx)", + "landing.formats.excel.f1": "Zellwerte", + "landing.formats.excel.f2": "Blattnamen", + "landing.formats.excel.f3": "Diagramme und Beschriftungen", + "landing.formats.excel.f4": "Kopf- und Fußzeilen", + "landing.formats.excel.f5": "Verbundene Zellen erhalten", + "landing.formats.powerpoint": "PowerPoint (.pptx)", + "landing.formats.powerpoint.f1": "Folientext und Notizen", + "landing.formats.powerpoint.f2": "Diagramme und Grafiken", + "landing.formats.powerpoint.f3": "Formen und Textfelder", + "landing.formats.powerpoint.f4": "Folienmaster", + "landing.formats.powerpoint.f5": "Animationen erhalten", + "landing.formats.pdf": "PDF", + "landing.formats.pdf.f1": "Textbasierte PDFs", + "landing.formats.pdf.f2": "Layout erhalten", + "landing.formats.pdf.f3": "Bilder an ihrem Platz", + "landing.formats.pdf.f4": "Tabellen beibehalten", + "landing.formats.pdf.f5": "Ausgabe als DOCX oder PDF", + "landing.cta.title": "In 30 Sekunden mit der Übersetzung beginnen", + "landing.cta.subtitle": "Keine Kreditkarte erforderlich. Testen Sie 2 Dokumente kostenlos und sehen Sie den Unterschied.", + "landing.cta.button": "Kostenloses Konto erstellen", + "landing.footer.privacy": "Datenschutz", + "landing.footer.terms": "AGB", + "landing.footer.contact": "Kontakt", + "landing.ai.badge": "KI-Ubersetzungsmotor", + "landing.ai.title": "Ubersetzung, die Ihr Fach versteht", + "landing.ai.subtitle": "Unsere KI-Modelle analysieren den Kontext, respektieren Ihre Terminologie und ubersetzen sogar Text in Bildern.", + "landing.ai.context.title": "Branchenkontext", + "landing.ai.context.desc": "Beschreiben Sie Ihr Fachgebiet und erhalten Sie massgeschneiderte Ubersetzungen.", + "landing.ai.glossary.title": "Fachglossare", + "landing.ai.glossary.desc": "Definieren Sie Ihre Fachbegriffe. CTA bleibt Air Handling Unit, nie Call To Action.", + "landing.ai.vision.title": "Bilderkennung", + "landing.ai.vision.desc": "Text in Bildern, Diagrammen und Grafiken wird erkannt und ubersetzt.", + "landing.ai.comparison.source": "Quelle (FR)", + "landing.ai.comparison.google": "Google Translate", + "landing.ai.comparison.ai": "Unsere KI", + "landing.howItWorks.title": "So funktioniert es", + "landing.howItWorks.subtitle": "Drei Schritte. Kein Formatverlust.", + "landing.howItWorks.step1.title": "Datei hochladen", + "landing.howItWorks.step1.desc": "Laden Sie Ihr Dokument per Drag and Drop.", + "landing.howItWorks.step2.title": "Sprache und Engine waehlen", + "landing.howItWorks.step2.desc": "Waehlen Sie Zielsprache und Engine - Standard oder kontextbewusste KI.", + "landing.howItWorks.step3.title": "Ergebnis herunterladen", + "landing.howItWorks.step3.desc": "Erhalten Sie Ihr ubersetztes Dokument mit identischer Formatierung.", + "login.errorTitle": "Login Error", + "login.welcomeBack": "Welcome back", + "login.signInToContinue": "Sign in to continue translating", + "login.email": "Email", + "login.emailPlaceholder": "you@example.com", + "login.password": "Password", + "login.forgotPassword": "Forgot password?", + "login.passwordPlaceholder": "••••••••", + "login.signingIn": "Signing in...", + "login.signIn": "Sign In", + "login.noAccount": "Don't have an account?", + "login.signUpFree": "Sign up for free", + "forgotPassword.enterEmail": "Please enter your email address", + "forgotPassword.error": "An error occurred", + "forgotPassword.title": "Forgot Password", + "forgotPassword.checkEmail": "Check your inbox", + "forgotPassword.subtitle": "Enter your email to receive a reset link", + "forgotPassword.sentMessage": "If an account exists with this address, a reset email has been sent.", + "forgotPassword.emailLabel": "Email address", + "forgotPassword.emailPlaceholder": "you@example.com", + "forgotPassword.sending": "Sending...", + "forgotPassword.sendLink": "Send reset link", + "forgotPassword.backToLogin": "Back to login", + "forgotPassword.loading": "Loading...", + "resetPassword.passwordRequirements": "Password must contain at least 8 characters, one uppercase, one lowercase, and one number", + "resetPassword.passwordMismatch": "Passwords do not match", + "resetPassword.tokenMissing": "Missing token. Please use the link received by email.", + "resetPassword.error": "An error occurred", + "resetPassword.invalidLink": "Invalid link", + "resetPassword.invalidLinkMessage": "This reset link is invalid. Please request a new one.", + "resetPassword.requestNewLink": "Request new link", + "resetPassword.successTitle": "Password reset", + "resetPassword.newPasswordTitle": "New password", + "resetPassword.successSubtitle": "You will be redirected to login", + "resetPassword.subtitle": "Set your new password", + "resetPassword.successMessage": "Your password has been successfully reset. You will be redirected to the login page.", + "resetPassword.newPassword": "New password", + "resetPassword.showPassword": "Show password", + "resetPassword.hidePassword": "Hide password", + "resetPassword.confirmPassword": "Confirm password", + "resetPassword.resetting": "Resetting...", + "resetPassword.resetPassword": "Reset password", + "resetPassword.backToLogin": "Back to login", + "resetPassword.loading": "Loading...", + "common.loading": "Laden...", + "profile.header.title": "Mein Profil", + "profile.header.subtitle": "Verwalten Sie Ihr Konto und Ihre Einstellungen.", + "profile.tabs.account": "Konto", + "profile.tabs.subscription": "Abonnement", + "profile.tabs.preferences": "Einstellungen", + "profile.account.user": "Benutzer", + "profile.account.memberSince": "Mitglied seit", + "profile.plan.label": "Plan", + "profile.plan.free": "Kostenlos", + "profile.plan.starter": "Starter", + "profile.plan.pro": "Pro", + "profile.plan.business": "Business", + "profile.plan.enterprise": "Enterprise", + "profile.plan.pricePerMonth": "{price} €/Monat", + "profile.subscription.canceling": "Kündigung läuft", + "profile.subscription.active": "Aktiv", + "profile.subscription.unknown": "Unbekannt", + "profile.subscription.accessUntil": "Zugang bis", + "profile.subscription.renewalOn": "Verlängerung am", + "profile.subscription.upgradePlan": "Auf einen kostenpflichtigen Plan upgraden", + "profile.subscription.changePlan": "Plan ändern", + "profile.subscription.manageBilling": "Abrechnung verwalten", + "profile.subscription.billingUnavailable": "Abrechnungsportal nicht verfügbar.", + "profile.subscription.billingError": "Fehler beim Zugriff auf das Abrechnungsportal.", + "profile.subscription.cancelSuccess": "Abonnement gekündigt. Sie behalten den Zugang bis zum Ende des Zeitraums.", + "profile.subscription.cancelError": "Fehler bei der Kündigung.", + "profile.subscription.networkError": "Netzwerkfehler.", + "profile.usage.title": "Nutzung diesen Monat", + "profile.usage.resetOn": "Zurücksetzung am", + "profile.usage.documents": "Dokumente", + "profile.usage.pages": "Seiten", + "profile.usage.extraCredits": "zusätzliches Guthaben", + "profile.usage.extraCreditsPlural": "zusätzliches Guthaben", + "profile.usage.quotaReached": "Kontingent erreicht", + "profile.usage.quotaReachedDesc": "Upgraden Sie auf einen höheren Plan, um fortzufahren.", + "profile.usage.unlockMore": "Schalten Sie mit einem kostenpflichtigen Plan mehr Übersetzungen frei.", + "profile.usage.viewPlans": "Pläne ansehen", + "profile.usage.includedInPlan": "In Ihrem Plan enthalten", + "profile.danger.title": "Gefahrenzone", + "profile.danger.description": "Die Kündigung wird am Ende Ihres aktuellen Zeitraums wirksam. Sie behalten den Zugang bis zu diesem Datum.", + "profile.danger.confirm": "Sind Sie sicher? Diese Aktion kann nicht rückgängig gemacht werden.", + "profile.danger.confirmCancel": "Kündigung bestätigen", + "profile.danger.cancelSubscription": "Mein Abonnement kündigen", + "profile.danger.keep": "Nein, behalten", + "profile.prefs.interfaceLang": "Sprache der Benutzeroberfläche", + "profile.prefs.interfaceLangDesc": "Die Sprache wird automatisch anhand Ihres Browsers erkannt. Sie können sie manuell ändern.", + "profile.prefs.defaultTargetLang": "Standard-Zielsprache", + "profile.prefs.selectLanguage": "Sprache auswählen", + "profile.prefs.defaultTargetLangDesc": "Diese Sprache wird für Ihre Übersetzungen vorausgewählt.", + "profile.prefs.save": "Speichern", + "profile.prefs.theme": "Design", + "profile.prefs.themeDesc": "Wählen Sie das Erscheinungsbild der Benutzeroberfläche", + "profile.prefs.cache": "Cache", + "profile.prefs.cacheDesc": "Das Löschen des lokalen Caches kann einige Anzeigeprobleme beheben.", + "profile.prefs.clearing": "Wird gelöscht...", + "profile.prefs.clearCache": "Cache löschen", + "settings.title": "Einstellungen", + "settings.subtitle": "Allgemeine Anwendungskonfiguration", + "settings.formats.title": "Unterstützte Formate", + "settings.formats.subtitle": "Dokumenttypen, die Sie übersetzen können", + "settings.formats.formulas": "Formeln", + "settings.formats.styles": "Stile", + "settings.formats.images": "Bilder", + "settings.formats.headers": "Kopfzeilen", + "settings.formats.tables": "Tabellen", + "settings.formats.slides": "Folien", + "settings.formats.notes": "Notizen", + "settings.cache.title": "Cache", + "settings.cache.desc": "Das Löschen des lokalen Caches kann einige Anzeigeprobleme beheben.", + "settings.cache.clearing": "Wird gelöscht...", + "settings.cache.clear": "Cache löschen", + "services.title": "Übersetzungsanbieter", + "services.subtitle": "Anbieter werden vom Administrator konfiguriert. Sie können sehen, welche derzeit für Ihr Konto verfügbar sind.", + "services.loading": "Anbieter werden geladen...", + "services.noProviders": "Derzeit sind keine Anbieter konfiguriert. Wenden Sie sich an Ihren Administrator.", + "services.classic": "Klassische Übersetzung", + "services.llmPro": "LLM · Kontextbezogen (Pro)", + "services.available": "Verfügbar", + "services.model": "Modell", + "services.adminOnly.title": "Anbieterkonfiguration ist nur für Administratoren", + "services.adminOnly.desc": "API-Schlüssel, Modellauswahl und Anbieteraktivierung werden ausschließlich vom Administrator im Admin-Panel verwaltet. Sie müssen niemals einen API-Schlüssel eingeben.", + "apiKeys.title": "API-Schlüssel", + "apiKeys.subtitle": "Verwalten Sie Ihre API-Schlüssel für den programmgesteuerten Zugriff auf die Übersetzungs-API.", + "apiKeys.loading": "Laden...", + "apiKeys.sectionTitle": "API & Automatisierung", + "apiKeys.sectionDesc": "Generieren und verwalten Sie Ihre API-Schlüssel für Automatisierungs-Workflows", + "apiKeys.keysUsed": "{total} von {max} Schlüsseln verwendet", + "apiKeys.maxReached": "Maximale Anzahl an Schlüsseln erreicht. Widerrufen Sie einen Schlüssel, um einen neuen zu generieren.", + "apiKeys.canGenerate": "Sie können {count} weiteren Schlüssel generieren", + "apiKeys.canGeneratePlural": "Sie können {count} weitere Schlüssel generieren", + "apiKeys.generateNew": "Neuen Schlüssel generieren", + "apiKeys.keyRevoked": "Schlüssel widerrufen", + "apiKeys.keyRevokedDesc": "Der API-Schlüssel wurde erfolgreich widerrufen.", + "apiKeys.keyNotFound": "Schlüssel nicht gefunden", + "apiKeys.keyNotFoundDesc": "Der API-Schlüssel existiert nicht mehr. Er wurde möglicherweise bereits widerrufen.", + "apiKeys.error": "Fehler", + "apiKeys.revokeError": "Der API-Schlüssel konnte nicht widerrufen werden. Bitte versuchen Sie es erneut.", + "apiKeys.limitReached": "Limit erreicht", + "apiKeys.limitReachedDesc": "Sie haben das Maximum von 10 API-Schlüsseln erreicht. Widerrufen Sie einen vorhandenen Schlüssel, um einen neuen zu generieren.", + "apiKeys.proRequired": "Pro-Funktion erforderlich", + "apiKeys.proRequiredDesc": "API-Schlüssel sind eine Pro-Funktion. Bitte upgraden Sie Ihr Konto.", + "apiKeys.generateError": "API-Schlüssel konnte nicht generiert werden. Bitte versuchen Sie es erneut.", + "apiKeys.upgrade.title": "API-Schlüssel", + "apiKeys.upgrade.subtitle": "Automatisieren Sie Ihre Übersetzungen mit API-Zugang", + "apiKeys.upgrade.feat1": "Generieren Sie unbegrenzt API-Schlüssel", + "apiKeys.upgrade.feat2": "Automatisieren Sie die Dokumentübersetzung", + "apiKeys.upgrade.feat3": "Webhook-Benachrichtigungen", + "apiKeys.upgrade.feat4": "LLM-Übersetzungsmodi", + "apiKeys.upgrade.proFeature": "API-Schlüssel sind eine {pro}-Funktion. Upgraden Sie, um API-Automatisierung freizuschalten.", + "apiKeys.upgrade.pro": "Pro", + "apiKeys.upgrade.cta": "Auf Pro upgraden", + "apiKeys.dialog.maxTitle": "Maximale Anzahl an Schlüsseln erreicht", + "apiKeys.dialog.maxDesc": "Sie haben das Maximum von 10 API-Schlüsseln erreicht. Bitte widerrufen Sie einen vorhandenen Schlüssel, bevor Sie einen neuen generieren.", + "apiKeys.dialog.close": "Schließen", + "apiKeys.dialog.generated": "API-Schlüssel generiert!", + "apiKeys.dialog.generatedDesc": "Ihr neuer API-Schlüssel wurde erstellt. Kopieren Sie ihn jetzt – er wird nicht erneut angezeigt.", + "apiKeys.dialog.important": "Wichtig:", + "apiKeys.dialog.importantDesc": "Dies ist das einzige Mal, dass Sie diesen Schlüssel sehen. Speichern Sie ihn sicher.", + "apiKeys.dialog.apiKey": "API-Schlüssel", + "apiKeys.dialog.name": "Name:", + "apiKeys.dialog.done": "Fertig", + "apiKeys.dialog.copied": "Ich habe den Schlüssel kopiert", + "apiKeys.dialog.generateTitle": "Neuen API-Schlüssel generieren", + "apiKeys.dialog.generateDesc": "Erstellen Sie einen neuen API-Schlüssel für den programmgesteuerten Zugriff auf die Übersetzungs-API.", + "apiKeys.dialog.keyName": "Schlüsselname (optional)", + "apiKeys.dialog.keyNamePlaceholder": "z.B., Produktion, Staging", + "apiKeys.dialog.keyNameHint": "Ein beschreibender Name, um diesen Schlüssel später zu identifizieren.", + "apiKeys.dialog.nameTooLong": "Der Name muss {max} Zeichen oder weniger haben", + "apiKeys.dialog.nameInvalid": "Der Name darf nur Buchstaben, Zahlen, Leerzeichen, Bindestriche und Unterstriche enthalten", + "apiKeys.dialog.cancel": "Abbrechen", + "apiKeys.dialog.generating": "Wird generiert...", + "apiKeys.dialog.generate": "Schlüssel generieren", + "apiKeys.table.name": "Name", + "apiKeys.table.prefix": "Präfix", + "apiKeys.table.created": "Erstellt", + "apiKeys.table.lastUsed": "Zuletzt verwendet", + "apiKeys.table.never": "Nie", + "apiKeys.table.actions": "Aktionen", + "apiKeys.table.revoke": "Widerrufen", + "apiKeys.table.copyPrefix": "Schlüsselpräfix kopieren", + "apiKeys.table.revokeKey": "Schlüssel widerrufen", + "apiKeys.revokeDialog.title": "API-Schlüssel widerrufen", + "apiKeys.revokeDialog.desc": "Sind Sie sicher, dass Sie den Schlüssel \"{name}\" widerrufen möchten? Diese Aktion kann nicht rückgängig gemacht werden.", + "apiKeys.revokeDialog.confirm": "Ja, widerrufen", + "apiKeys.revokeDialog.cancel": "Abbrechen", + "context.proTitle": "Pro-Funktion", + "context.proDesc": "Kontext und professionelle Glossare sind mit den Plänen Pro, Business und Enterprise verfügbar. Sie bieten genauere Übersetzungen durch Anweisungen und domänenspezifisches Vokabular.", + "context.viewPlans": "Pläne ansehen", + "context.title": "Kontext & Glossar", + "context.subtitle": "Verbessern Sie die Übersetzungsqualität mit Anweisungen und domänenspezifischem Vokabular.", + "context.presets.title": "Professionelle Glossare", + "context.presets.desc": "Laden Sie ein vollständiges Glossar mit Anweisungen und spezieller Terminologie", + "context.instructions.title": "Kontextanweisungen", + "context.instructions.desc": "Anweisungen, denen die KI während der Übersetzung folgt", + "context.instructions.placeholder": "Z.B.: Sie übersetzen HVAC-Fachdokumente. Verwenden Sie präzise Ingenieurterminologie...", + "context.glossary.title": "Technisches Glossar", + "context.glossary.desc": "Format: Quelle=Ziel (eines pro Zeile). Über Voreinstellung geladene Glossare sind bearbeitbar.", + "context.glossary.terms": "Begriffe im Glossar", + "context.clearAll": "Alles löschen", + "context.saving": "Wird gespeichert...", + "context.save": "Speichern", + "admin.login.title": "Administration", + "admin.login.required": "Anmeldung erforderlich", + "admin.login.password": "Admin-Passwort", + "admin.login.connecting": "Verbindung wird hergestellt...", + "admin.login.access": "Admin-Panel öffnen", + "admin.login.restricted": "Nur für Administratoren", + "admin.layout.checking": "Authentifizierung wird überprüft...", + "admin.dashboard.title": "Admin-Dashboard", + "admin.dashboard.subtitle": "Administratorkontrollpanel", + "admin.dashboard.refresh": "Aktualisieren", + "admin.dashboard.refreshTooltip": "Dashboard-Daten aktualisieren", + "admin.dashboard.config": "Systemkonfiguration", + "admin.dashboard.maxFileSize": "Max. Dateigröße:", + "admin.dashboard.translationService": "Übersetzungsdienst:", + "admin.dashboard.formats": "Formate:", + "admin.nav.dashboard": "Dashboard", + "admin.nav.users": "Benutzer", + "admin.nav.pricing": "Preise & Stripe", + "admin.nav.providers": "Anbieter", + "admin.nav.system": "System", + "admin.nav.logs": "Protokolle", + "admin.users.title": "Benutzerverwaltung", + "admin.users.subtitle": "Benutzerkonten anzeigen und verwalten", + "admin.users.planUpdated": "Plan aktualisiert", + "admin.users.planChanged": "Der Plan wurde erfolgreich zu \"{plan}\" geändert.", + "admin.users.unknownError": "Unbekannter Fehler", + "admin.users.error": "Fehler", + "admin.users.planUpdateError": "Plan konnte nicht aktualisiert werden: {message}", + "admin.users.noKeys": "Keine Schlüssel", + "admin.users.noKeysDesc": "Dieser Benutzer hat keine aktiven API-Schlüssel.", + "admin.users.keysRevoked": "Schlüssel widerrufen", + "admin.users.keysRevokedDesc": "{count} API-Schlüssel erfolgreich widerrufen.", + "admin.users.revokeError": "Schlüssel konnten nicht widerrufen werden: {message}", + "admin.users.retry": "Erneut versuchen", + "admin.system.title": "System", + "admin.system.subtitle": "Systemstatus überwachen und Ressourcen verwalten", + "admin.system.quotas": "Übersetzungskontingente", + "admin.system.resetQuotas": "Monatliche Kontingente zurücksetzen", + "admin.system.resetting": "Zurücksetzen...", + "admin.system.reset": "Zurücksetzen", + "admin.system.allOperational": "Alle Systeme betriebsbereit", + "admin.system.issuesDetected": "Systemprobleme erkannt", + "admin.system.waitingData": "Warte auf Daten...", + "admin.system.purging": "Bereinigung läuft...", + "admin.system.clean": "Bereinigen", + "admin.system.purge": "Bereinigen", + }, + // ═══════════════════════════════════════════════════════════════ + // PORTUGUESE – BRAZILIAN (pt) + // ═══════════════════════════════════════════════════════════════ + pt: { + "auth.brandName": "Office Translator", + "dashboard.nav.translate": "Traduzir", + "dashboard.nav.profile": "Meu perfil", + "dashboard.nav.settings": "Configurações", + "dashboard.nav.context": "Contexto", + "dashboard.nav.services": "Serviços", + "dashboard.nav.apiKeys": "Chaves de API", + "dashboard.nav.glossaries": "Glossários", + "dashboard.header.title": "Painel", + "dashboard.header.subtitle": "Gerencie suas traduções", + "dashboard.header.toggleMenu": "Menu", + "dashboard.header.profileTitle": "Meu perfil", + "dashboard.sidebar.theme": "Tema", + "dashboard.sidebar.signOut": "Sair", + "dashboard.sidebar.backHome": "Voltar ao início", + "dashboard.translate.pageTitle": "Traduzir um documento", + "dashboard.translate.pageSubtitle": "Importe um arquivo e escolha o idioma de destino", + "dashboard.translate.errorNotificationTitle": "Erro", + "dashboard.translate.dropzone.uploadAria": "Área para soltar arquivos", + "dashboard.translate.dropzone.title": "Arraste e solte seu arquivo aqui", + "dashboard.translate.dropzone.subtitle": "ou clique para selecionar (DOCX, XLSX, PPTX, PDF)", + "dashboard.translate.dropzone.replaceFile": "Substituir arquivo", + "dashboard.translate.language.source": "Idioma de origem", + "dashboard.translate.language.target": "Idioma de destino", + "dashboard.translate.language.loading": "Carregando idiomas…", + "dashboard.translate.language.autoDetect": "Detecção automática", + "dashboard.translate.language.selectPlaceholder": "Selecionar…", + "dashboard.translate.language.loadErrorPrefix": "Erro ao carregar os idiomas", + "dashboard.translate.provider.loading": "Carregando provedores…", + "dashboard.translate.provider.noneConfigured": "Nenhum provedor configurado", + "dashboard.translate.provider.modelTitle": "Modelo", + "dashboard.translate.provider.sectionTitle": "Provedor", + "dashboard.translate.provider.llmDivider": "IA · Contextual", + "dashboard.translate.provider.llmDividerPro": "IA · Contextual (Pro)", + "dashboard.translate.provider.upgrade": "Fazer upgrade para Pro", + "dashboard.translate.provider.upgradeSuffix": "para desbloquear a tradução por IA", + "dashboard.translate.trust.zeroRetention": "Zero retenção", + "dashboard.translate.trust.deletedAfter": "Arquivos excluídos após o processamento", + "dashboard.translate.actions.uploading": "Enviando…", + "dashboard.translate.actions.translate": "Traduzir", + "dashboard.translate.actions.filePrefix": "Arquivo: ", + "dashboard.translate.actions.cancel": "Cancelar", + "dashboard.translate.actions.tryAgain": "Tentar novamente", + "dashboard.translate.steps.uploading": "Enviando arquivo…", + "dashboard.translate.steps.starting": "Iniciando tradução…", + "dashboard.translate.complete.title": "Tradução concluída!", + "dashboard.translate.complete.descNamed": "Seu arquivo {name} foi traduzido com sucesso.", + "dashboard.translate.complete.descGeneric": "Seu arquivo foi traduzido com sucesso.", + "dashboard.translate.complete.downloading": "Baixando…", + "dashboard.translate.complete.download": "Baixar", + "dashboard.translate.complete.newTranslation": "Nova tradução", + "dashboard.translate.complete.toastOkTitle": "Sucesso", + "dashboard.translate.complete.toastFailTitle": "Falha", + "dashboard.translate.complete.toastFailDesc": "A tradução falhou. Por favor, tente novamente.", + "dashboard.translate.sourceDocument": "Documento fonte", + "dashboard.translate.configuration": "Configuração", + "dashboard.translate.translating": "Tradução em andamento", + "dashboard.translate.liveMonitor": "Monitor em tempo real", + "dashboard.translate.summary": "Resumo", + "dashboard.translate.engine": "Motor", + "dashboard.translate.confidence": "Confiança", + "dashboard.translate.cancel": "Cancelar", + "dashboard.translate.segments": "Segmentos", + "dashboard.translate.characters": "Caracteres", + "dashboard.translate.elapsed": "Decorrido", + "dashboard.translate.segPerMin": "Seg/min", + "dashboard.translate.highQuality": "Alta qualidade", + "dashboard.translate.quality": "Qualidade", + "dashboard.translate.completed": "Tradução concluída", + "dashboard.translate.replace": "Substituir", + "dashboard.translate.pdfMode.title": "Modo de tradução PDF", + "dashboard.translate.pdfMode.preserveLayout": "Preservar layout", + "dashboard.translate.pdfMode.textOnly": "Apenas texto", + "dashboard.translate.pdfMode.preserveLayoutDesc": "Mantém imagens, tabelas e formatação. Ideal para PDFs simples.", + "dashboard.translate.pdfMode.textOnlyDesc": "Traduz todo o texto perfeitamente. Saída limpa, sem problemas de layout.", + "dashboard.translate.pipeline.upload": "Enviar", + "dashboard.translate.pipeline.analyze": "Analisar", + "dashboard.translate.pipeline.translate": "Tradução", + "dashboard.translate.pipeline.rebuild": "Reconstruir", + "dashboard.translate.pipeline.finalize": "Finalizar", + "dashboard.translate.progress.failedTitle": "Tradução falhou", + "glossaries.dialog.title": "Novo glossário", + "glossaries.dialog.description": "Crie um glossário para suas traduções", + "glossaries.dialog.nameLabel": "Nome", + "glossaries.dialog.namePlaceholder": "Meu glossário", + "glossaries.dialog.tabTemplates": "Modelos", + "glossaries.dialog.tabFile": "Arquivo", + "glossaries.dialog.tabManual": "Manual", + "glossaries.dialog.cancel": "Cancelar", + "glossaries.dialog.creating": "Criando…", + "glossaries.dialog.importing": "Importando…", + "glossaries.dialog.importBtn": "Importar", + "glossaries.dialog.selectPrompt": "Selecionar", + "glossaries.dialog.createBtn": "Criar", + "glossaries.dialog.createEmpty": "Criar vazio", + "glossaries.dialog.terms": "termos", + "glossaries.dialog.templatesDesc": "Escolha um modelo predefinido", + "glossaries.dialog.templatesEmpty": "Nenhum modelo disponível", + "glossaries.dialog.dropTitle": "Arraste um arquivo CSV aqui", + "glossaries.dialog.dropOr": "ou", + "glossaries.dialog.dropFormats": "CSV, TSV, TXT", + "glossaries.dialog.formatTitle": "Formato", + "glossaries.dialog.formatDesc": "origem,destino (um por linha)", + "glossaries.dialog.formatNote": "Primeira linha ignorada se houver cabeçalho", + "glossaries.dialog.errorFormat": "Formato não suportado", + "glossaries.dialog.errorSize": "Arquivo muito grande", + "glossaries.dialog.errorEmpty": "Arquivo vazio", + "glossaries.dialog.errorRead": "Erro de leitura", + "glossaries.dialog.parsing": "Analisando…", + "glossaries.dialog.termsImported": "termos importados", + "glossaries.dialog.changeFile": "Trocar arquivo", + "glossaries.dialog.retry": "Tentar novamente", + "pricing.nav.back": "Voltar", + "pricing.nav.home": "Início", + "pricing.nav.mySubscription": "Minha assinatura", + "pricing.header.badge": "Modelos de IA atualizados — Março 2026", + "pricing.header.title": "Um plano para cada necessidade", + "pricing.header.subtitle": "Traduza seus documentos Word, Excel e PowerPoint preservando a formatação original. Sem necessidade de chave de API.", + "pricing.billing.monthly": "Mensal", + "pricing.billing.yearly": "Anual", + "pricing.plans.free.name": "Gratuito", + "pricing.plans.starter.name": "Starter", + "pricing.plans.pro.name": "Pro", + "pricing.plans.business.name": "Business", + "pricing.plans.enterprise.name": "Enterprise", + "pricing.plans.free.description": "Perfeito para conhecer o aplicativo", + "pricing.plans.starter.description": "Para pessoas físicas e projetos pequenos", + "pricing.plans.pro.description": "Para profissionais e equipes em crescimento", + "pricing.plans.business.description": "Para equipes e organizações", + "pricing.plans.enterprise.description": "Soluções personalizadas para grandes organizações", + "pricing.plans.pro.highlight": "Mais popular", + "pricing.plans.pro.badge": "POPULAR", + "pricing.plans.enterprise.badge": "SOB CONSULTA", + "pricing.plans.free.feat1": "5 documentos / mês", + "pricing.plans.free.feat2": "Até 15 páginas por documento", + "pricing.plans.free.feat3": "Google Tradutor incluído", + "pricing.plans.free.feat4": "Todos os idiomas (130+)", + "pricing.plans.free.feat5": "Suporte da comunidade", + "pricing.plans.starter.feat1": "50 documentos / mês", + "pricing.plans.starter.feat2": "Até 50 páginas por documento", + "pricing.plans.starter.feat3": "Google Tradutor + DeepL", + "pricing.plans.starter.feat4": "Arquivos de até 10 MB", + "pricing.plans.starter.feat5": "Suporte por e-mail", + "pricing.plans.starter.feat6": "Histórico de 30 dias", + "pricing.plans.pro.feat1": "200 documentos / mês", + "pricing.plans.pro.feat2": "Até 200 páginas por documento", + "pricing.plans.pro.feat3": "Tradução IA Essencial (DeepSeek V3.2)", + "pricing.plans.pro.feat4": "Google Tradutor + DeepL", + "pricing.plans.pro.feat5": "Arquivos de até 25 MB", + "pricing.plans.pro.feat6": "Glossários personalizados", + "pricing.plans.pro.feat7": "Suporte prioritário", + "pricing.plans.pro.feat8": "Histórico de 90 dias", + "pricing.plans.business.feat1": "1 000 documentos / mês", + "pricing.plans.business.feat2": "Até 500 páginas por documento", + "pricing.plans.business.feat3": "IA Essencial + Premium (Claude Haiku)", + "pricing.plans.business.feat4": "Todos os provedores de tradução", + "pricing.plans.business.feat5": "Arquivos de até 50 MB", + "pricing.plans.business.feat6": "Acesso à API (10 000 chamadas/mês)", + "pricing.plans.business.feat7": "Webhooks de notificação", + "pricing.plans.business.feat8": "Suporte dedicado", + "pricing.plans.business.feat9": "Histórico de 1 ano", + "pricing.plans.business.feat10": "Análises avançadas", + "pricing.plans.enterprise.feat1": "Documentos ilimitados", + "pricing.plans.enterprise.feat2": "Todos os modelos de IA (GPT-5, Claude Opus 4.6…)", + "pricing.plans.enterprise.feat3": "Implantação local ou em nuvem dedicada", + "pricing.plans.enterprise.feat4": "SLA 99,9 % garantido", + "pricing.plans.enterprise.feat5": "Suporte dedicado 24/7", + "pricing.plans.enterprise.feat6": "Marca branca (white-label)", + "pricing.plans.enterprise.feat7": "Equipes ilimitadas", + "pricing.plans.enterprise.feat8": "Integrações personalizadas", + "pricing.card.onRequest": "Sob consulta", + "pricing.card.free": "Gratuito", + "pricing.card.perMonth": "/mês", + "pricing.card.billedYearly": "Cobrado {price} € / ano", + "pricing.card.documents": "Documentos", + "pricing.card.pagesMax": "Páginas máx.", + "pricing.card.aiTranslation": "Tradução por IA", + "pricing.card.unlimited": "Ilimitado", + "pricing.card.perMonthStat": "/ mês", + "pricing.card.perDoc": "p / doc", + "pricing.card.aiEssential": "Essencial", + "pricing.card.aiEssentialPremium": "Essencial + Premium", + "pricing.card.aiCustom": "Personalizado", + "pricing.card.myPlan": "Meu plano", + "pricing.card.managePlan": "Gerenciar meu plano", + "pricing.card.startFree": "Começar gratuitamente", + "pricing.card.contactUs": "Fale conosco", + "pricing.card.choosePlan": "Escolher este plano", + "pricing.card.processing": "Processando…", + "pricing.comparison.title": "Comparação detalhada", + "pricing.comparison.subtitle": "Tudo incluído em cada plano", + "pricing.comparison.feature": "Recurso", + "pricing.comparison.docsPerMonth": "Documentos / mês", + "pricing.comparison.pagesMaxPerDoc": "Páginas máx. / documento", + "pricing.comparison.maxFileSize": "Tamanho máx. de arquivo", + "pricing.comparison.googleTranslation": "Google Tradutor", + "pricing.comparison.deepl": "DeepL", + "pricing.comparison.aiEssential": "Tradução IA Essencial", + "pricing.comparison.aiPremium": "Tradução IA Premium", + "pricing.comparison.apiAccess": "Acesso à API", + "pricing.comparison.priorityProcessing": "Processamento prioritário", + "pricing.comparison.support": "Suporte", + "pricing.comparison.support.community": "Comunidade", + "pricing.comparison.support.email": "E-mail", + "pricing.comparison.support.priority": "Prioritário", + "pricing.comparison.support.dedicated": "Dedicado", + "pricing.comparison.mb": "MB", + "pricing.credits.title": "Créditos adicionais", + "pricing.credits.subtitle": "Precisa de mais? Compre créditos avulsos, sem assinatura.", + "pricing.credits.perPage": "1 crédito = 1 página traduzida.", + "pricing.credits.bestValue": "Melhor custo-benefício", + "pricing.credits.unit": "créditos", + "pricing.credits.centsPerCredit": "cts / crédito", + "pricing.credits.buy": "Comprar", + "pricing.trust.encryption.title": "Criptografia de ponta a ponta", + "pricing.trust.encryption.sub": "TLS 1.3 + AES-256 em repouso", + "pricing.trust.languages.title": "130+ idiomas", + "pricing.trust.languages.sub": "Incluindo árabe, persa, hebraico (RTL)", + "pricing.trust.parallel.title": "Processamento paralelo", + "pricing.trust.parallel.sub": "IA multi-thread ultrarrápida", + "pricing.trust.availability.title": "Disponível 24/7", + "pricing.trust.availability.sub": "99,9 % de uptime garantido", + "pricing.aiModels.title": "Nossos modelos de IA — Março 2026", + "pricing.aiModels.essential.title": "Tradução IA Essencial", + "pricing.aiModels.essential.plan": "Plano Pro", + "pricing.aiModels.essential.descPrefix": "Baseado em", + "pricing.aiModels.essential.descSuffix": "— o modelo de IA mais econômico de 2026. Qualidade comparável a modelos frontier a 1/50 do custo.", + "pricing.aiModels.essential.context": "163K tokens de contexto", + "pricing.aiModels.essential.value": "Excelente custo-benefício", + "pricing.aiModels.premium.title": "Tradução IA Premium", + "pricing.aiModels.premium.plan": "Plano Business", + "pricing.aiModels.premium.descPrefix": "Baseado em", + "pricing.aiModels.premium.descSuffix": "da Anthropic — preciso em documentos jurídicos, médicos e técnicos complexos.", + "pricing.aiModels.premium.context": "200K tokens de contexto", + "pricing.aiModels.premium.precision": "Maior precisão", + "pricing.faq.title": "Perguntas frequentes", + "pricing.faq.q1": "Posso trocar de plano a qualquer momento?", + "pricing.faq.a1": "Sim. O upgrade é imediato e proporcional. O downgrade entra em vigor no final do período atual.", + "pricing.faq.q2": "O que é a «Tradução IA Essencial»?", + "pricing.faq.a2": "É nosso motor de IA baseado no DeepSeek V3.2 via OpenRouter. Ele compreende o contexto dos seus documentos, preserva a formatação e lida com termos técnicos muito melhor do que a tradução clássica.", + "pricing.faq.q3": "Qual a diferença entre IA Essencial e IA Premium?", + "pricing.faq.a3": "A IA Essencial usa DeepSeek V3.2 (excelente custo-benefício). A IA Premium usa Claude 3.5 Haiku da Anthropic, mais precisa em documentos jurídicos, médicos e técnicos complexos.", + "pricing.faq.q4": "Meus documentos são mantidos após a tradução?", + "pricing.faq.a4": "Os arquivos traduzidos ficam disponíveis de acordo com seu plano (30 dias Starter, 90 dias Pro, 1 ano Business). São criptografados em repouso e em trânsito.", + "pricing.faq.q5": "O que acontece se eu exceder minha cota mensal?", + "pricing.faq.a5": "Você pode comprar créditos avulsos ou fazer upgrade do plano. Você será notificado ao atingir 80 % de uso.", + "pricing.faq.q6": "Existe um teste gratuito para os planos pagos?", + "pricing.faq.a6": "O plano Gratuito é permanente e não exige cartão. Para os planos Pro e Business, entre em contato para um teste de 14 dias.", + "pricing.faq.q7": "Quais formatos de arquivo são suportados?", + "pricing.faq.a7": "Word (.docx), Excel (.xlsx/.xls), PowerPoint (.pptx) e em breve PDF. Todos os planos suportam os mesmos formatos.", + "pricing.cta.title": "Pronto para começar?", + "pricing.cta.subtitle": "Comece gratuitamente, sem cartão de crédito. Faça upgrade quando precisar.", + "pricing.cta.createAccount": "Criar uma conta gratuita", + "pricing.cta.login": "Entrar", + "pricing.toast.demo": "Modo demo — O Stripe ainda não está configurado. Em produção, você seria redirecionado para o pagamento para ativar o plano {planId}.", + "pricing.toast.networkError": "Erro de rede. Por favor, tente novamente.", + "pricing.toast.paymentError": "Erro ao criar o pagamento.", + "register.title": "Criar uma conta", + "register.subtitle": "Comece a traduzir gratuitamente", + "register.error.failed": "Falha no registro", + "register.name.label": "Nome", + "register.name.placeholder": "Seu nome", + "register.name.error": "O nome deve ter pelo menos 2 caracteres", + "register.email.label": "Endereço de e-mail", + "register.email.placeholder": "voce@exemplo.com", + "register.email.error": "Endereço de e-mail inválido", + "register.password.label": "Senha", + "register.password.error": "A senha deve ter pelo menos 8 caracteres, com uma letra maiúscula, uma minúscula e um dígito", + "register.password.show": "Mostrar senha", + "register.password.hide": "Ocultar senha", + "register.password.strengthLabel": "Força:", + "register.password.strength.weak": "Fraca", + "register.password.strength.medium": "Média", + "register.password.strength.strong": "Forte", + "register.confirmPassword.label": "Confirmar senha", + "register.confirmPassword.error": "As senhas não coincidem", + "register.confirmPassword.show": "Mostrar", + "register.confirmPassword.hide": "Ocultar", + "register.submit.creating": "Criando conta...", + "register.submit.create": "Criar minha conta", + "register.hasAccount": "Já tem uma conta?", + "register.login": "Entrar", + "register.terms.prefix": "Ao criar uma conta, você aceita nossos", + "register.terms.link": "termos de serviço", + + // ── Landing page ── + "landing.nav.whyUs": "Por que nós", + "landing.nav.formats": "Formatos", + "landing.nav.pricing": "Preços", + "landing.nav.login": "Entrar", + "landing.nav.startFree": "Teste grátis", + "landing.hero.badge": "Novo: suporte a PDF + tradução com IA", + "landing.hero.title1": "Traduza seus documentos.", + "landing.hero.title2": "Mantenha a formatação perfeita.", + "landing.hero.subtitle": "O único tradutor que preserva SmartArt, gráficos, sumários, formas, cabeçalhos e rodapés — exatamente como eram. Sem surpresas no checkout.", + "landing.hero.cta": "Teste grátis — 2 docs/mês", + "landing.hero.seePlans": "Ver planos", + "landing.trust.filesDeleted": "Arquivos excluídos após 60 min", + "landing.trust.noBait": "Sem preços enganosos", + "landing.trust.preview": "Pré-visualização antes de pagar", + "landing.why.title": "Sua formatação, perfeitamente preservada", + "landing.why.subtitle": "Outros tradutores quebram seu layout. Nós não.", + "landing.why.smartart.title": "SmartArt e diagramas", + "landing.why.smartart.desc": "Organogramas, fluxogramas, hierarquias — tudo traduzido no lugar.", + "landing.why.toc.title": "Sumários", + "landing.why.toc.desc": "Entradas do sumário, números de página e referências cruzadas são atualizados corretamente.", + "landing.why.charts.title": "Gráficos", + "landing.why.charts.desc": "Títulos, rótulos de eixos, legendas e nomes de séries — tudo é traduzido.", + "landing.why.shapes.title": "Formas e caixas de texto", + "landing.why.shapes.desc": "Retângulos, caixas arredondadas, balões — encontramos e traduzimos o texto dentro de todas as formas.", + "landing.why.headers.title": "Cabeçalhos e rodapés", + "landing.why.headers.desc": "Cabeçalhos, rodapés e notas de rodapé nunca são esquecidos.", + "landing.why.languages.title": "130+ idiomas", + "landing.why.languages.desc": "Google Tradutor, DeepL e motores de IA para qualidade profissional.", + "landing.pricing.title": "Preços simples e honestos", + "landing.pricing.subtitle": "O que você vê é o que você paga. Sem taxas ocultas após a tradução.", + "landing.pricing.monthly": "Mensal", + "landing.pricing.yearly": "Anual", + "landing.pricing.starter.title": "Starter", + "landing.pricing.starter.desc": "Para indivíduos e pequenos projetos", + "landing.pricing.starter.f1": "50 documentos / mês", + "landing.pricing.starter.f2": "Até 50 páginas por documento", + "landing.pricing.starter.f3": "Google Tradutor + DeepL", + "landing.pricing.starter.f4": "Arquivos de até 10 MB", + "landing.pricing.starter.cta": "Começar", + "landing.pricing.pro.title": "Pro", + "landing.pricing.pro.badge": "Mais popular", + "landing.pricing.pro.desc": "Para profissionais que precisam de qualidade", + "landing.pricing.pro.f1": "200 documentos / mês", + "landing.pricing.pro.f2": "Até 200 páginas por documento", + "landing.pricing.pro.f3": "Tradução com IA (DeepSeek)", + "landing.pricing.pro.f4": "Google + DeepL incluídos", + "landing.pricing.pro.f5": "Glossários e prompts personalizados", + "landing.pricing.pro.f6": "Suporte prioritário", + "landing.pricing.pro.cta": "Testar Pro", + "landing.pricing.business.title": "Business", + "landing.pricing.business.desc": "Para equipes com alto volume", + "landing.pricing.business.f1": "1 000 documentos / mês", + "landing.pricing.business.f2": "Até 500 páginas por documento", + "landing.pricing.business.f3": "IA Premium (Claude)", + "landing.pricing.business.f4": "Todos os provedores + acesso API", + "landing.pricing.business.f5": "Webhooks e automação", + "landing.pricing.business.f6": "5 vagas de equipe", + "landing.pricing.business.cta": "Fale conosco", + "landing.pricing.honest": "O preço exibido é o preço que você paga. Sem cobranças ocultas após a tradução.", + "landing.pricing.billedYearly": "cobrado anualmente", + "landing.pricing.perMonth": "/mês", + "landing.formats.title": "Cada formato, cada elemento", + "landing.formats.subtitle": "Traduzimos o que os outros esquecem.", + "landing.formats.word": "Word (.docx)", + "landing.formats.word.f1": "Parágrafos e títulos", + "landing.formats.word.f2": "Tabelas e gráficos", + "landing.formats.word.f3": "Diagramas SmartArt", + "landing.formats.word.f4": "Sumário", + "landing.formats.word.f5": "Cabeçalhos e rodapés", + "landing.formats.word.f6": "Formas e caixas de texto", + "landing.formats.word.f7": "Notas de rodapé e notas de fim", + "landing.formats.excel": "Excel (.xlsx)", + "landing.formats.excel.f1": "Valores das células", + "landing.formats.excel.f2": "Nomes das planilhas", + "landing.formats.excel.f3": "Gráficos e rótulos", + "landing.formats.excel.f4": "Cabeçalhos e rodapés", + "landing.formats.excel.f5": "Células mescladas preservadas", + "landing.formats.powerpoint": "PowerPoint (.pptx)", + "landing.formats.powerpoint.f1": "Texto dos slides e notas", + "landing.formats.powerpoint.f2": "Gráficos e diagramas", + "landing.formats.powerpoint.f3": "Formas e caixas de texto", + "landing.formats.powerpoint.f4": "Layouts mestres", + "landing.formats.powerpoint.f5": "Animações preservadas", + "landing.formats.pdf": "PDF", + "landing.formats.pdf.f1": "PDFs baseados em texto", + "landing.formats.pdf.f2": "Layout preservado", + "landing.formats.pdf.f3": "Imagens mantidas no lugar", + "landing.formats.pdf.f4": "Tabelas mantidas", + "landing.formats.pdf.f5": "Saída como DOCX ou PDF", + "landing.cta.title": "Comece a traduzir em 30 segundos", + "landing.cta.subtitle": "Sem necessidade de cartão de crédito. Experimente 2 documentos grátis e veja a diferença.", + "landing.cta.button": "Criar conta grátis", + "landing.footer.privacy": "Privacidade", + "landing.footer.terms": "Termos", + "landing.footer.contact": "Contato", + "landing.ai.badge": "Motor de Traducao IA", + "landing.ai.title": "Traducao que compreende sua area", + "landing.ai.subtitle": "Nossos modelos de IA analisam o contexto, respeitam sua terminologia e traduzem texto em imagens.", + "landing.ai.context.title": "Contexto do setor", + "landing.ai.context.desc": "Descreva seu setor e obtenha traducoes adaptadas.", + "landing.ai.glossary.title": "Glossarios do setor", + "landing.ai.glossary.desc": "Defina seus termos tecnicos. CTA sera Air Handling Unit, nunca Call To Action.", + "landing.ai.vision.title": "Visao de imagens", + "landing.ai.vision.desc": "Texto em imagens, diagramas e graficos e detectado e traduzido.", + "landing.ai.comparison.source": "Fonte (FR)", + "landing.ai.comparison.google": "Google Translate", + "landing.ai.comparison.ai": "Nossa IA", + "landing.howItWorks.title": "Como funciona?", + "landing.howItWorks.subtitle": "Tres passos. Zero perda de formato.", + "landing.howItWorks.step1.title": "Envie seu arquivo", + "landing.howItWorks.step1.desc": "Arraste seu documento Excel, Word, PowerPoint ou PDF.", + "landing.howItWorks.step2.title": "Escolha idioma e motor", + "landing.howItWorks.step2.desc": "Selecione idioma e motor - padrao ou IA contextual.", + "landing.howItWorks.step3.title": "Baixe o resultado", + "landing.howItWorks.step3.desc": "Receba seu documento traduzido com formatacao identica.", + "login.errorTitle": "Login Error", + "login.welcomeBack": "Welcome back", + "login.signInToContinue": "Sign in to continue translating", + "login.email": "Email", + "login.emailPlaceholder": "you@example.com", + "login.password": "Password", + "login.forgotPassword": "Forgot password?", + "login.passwordPlaceholder": "••••••••", + "login.signingIn": "Signing in...", + "login.signIn": "Sign In", + "login.noAccount": "Don't have an account?", + "login.signUpFree": "Sign up for free", + "forgotPassword.enterEmail": "Please enter your email address", + "forgotPassword.error": "An error occurred", + "forgotPassword.title": "Forgot Password", + "forgotPassword.checkEmail": "Check your inbox", + "forgotPassword.subtitle": "Enter your email to receive a reset link", + "forgotPassword.sentMessage": "If an account exists with this address, a reset email has been sent.", + "forgotPassword.emailLabel": "Email address", + "forgotPassword.emailPlaceholder": "you@example.com", + "forgotPassword.sending": "Sending...", + "forgotPassword.sendLink": "Send reset link", + "forgotPassword.backToLogin": "Back to login", + "forgotPassword.loading": "Loading...", + "resetPassword.passwordRequirements": "Password must contain at least 8 characters, one uppercase, one lowercase, and one number", + "resetPassword.passwordMismatch": "Passwords do not match", + "resetPassword.tokenMissing": "Missing token. Please use the link received by email.", + "resetPassword.error": "An error occurred", + "resetPassword.invalidLink": "Invalid link", + "resetPassword.invalidLinkMessage": "This reset link is invalid. Please request a new one.", + "resetPassword.requestNewLink": "Request new link", + "resetPassword.successTitle": "Password reset", + "resetPassword.newPasswordTitle": "New password", + "resetPassword.successSubtitle": "You will be redirected to login", + "resetPassword.subtitle": "Set your new password", + "resetPassword.successMessage": "Your password has been successfully reset. You will be redirected to the login page.", + "resetPassword.newPassword": "New password", + "resetPassword.showPassword": "Show password", + "resetPassword.hidePassword": "Hide password", + "resetPassword.confirmPassword": "Confirm password", + "resetPassword.resetting": "Resetting...", + "resetPassword.resetPassword": "Reset password", + "resetPassword.backToLogin": "Back to login", + "resetPassword.loading": "Loading...", + "common.loading": "Carregando...", + "profile.header.title": "Meu perfil", + "profile.header.subtitle": "Gerencie sua conta e preferências.", + "profile.tabs.account": "Conta", + "profile.tabs.subscription": "Assinatura", + "profile.tabs.preferences": "Preferências", + "profile.account.user": "Usuário", + "profile.account.memberSince": "Membro desde", + "profile.plan.label": "Plano", + "profile.plan.free": "Gratuito", + "profile.plan.starter": "Starter", + "profile.plan.pro": "Pro", + "profile.plan.business": "Business", + "profile.plan.enterprise": "Enterprise", + "profile.plan.pricePerMonth": "{price} €/mês", + "profile.subscription.canceling": "Cancelando", + "profile.subscription.active": "Ativa", + "profile.subscription.unknown": "Desconhecido", + "profile.subscription.accessUntil": "Acesso até", + "profile.subscription.renewalOn": "Renovação em", + "profile.subscription.upgradePlan": "Atualizar para um plano pago", + "profile.subscription.changePlan": "Alterar plano", + "profile.subscription.manageBilling": "Gerenciar cobrança", + "profile.subscription.billingUnavailable": "Portal de cobrança indisponível.", + "profile.subscription.billingError": "Erro ao acessar o portal de cobrança.", + "profile.subscription.cancelSuccess": "Assinatura cancelada. Você mantém o acesso até o final do período.", + "profile.subscription.cancelError": "Erro durante o cancelamento.", + "profile.subscription.networkError": "Erro de rede.", + "profile.usage.title": "Uso este mês", + "profile.usage.resetOn": "Redefinição em", + "profile.usage.documents": "Documentos", + "profile.usage.pages": "Páginas", + "profile.usage.extraCredits": "crédito extra", + "profile.usage.extraCreditsPlural": "créditos extras", + "profile.usage.quotaReached": "Cota atingida", + "profile.usage.quotaReachedDesc": "Atualize para um plano superior para continuar.", + "profile.usage.unlockMore": "Desbloqueie mais traduções com um plano pago.", + "profile.usage.viewPlans": "Ver planos", + "profile.usage.includedInPlan": "Incluído no seu plano", + "profile.danger.title": "Zona de perigo", + "profile.danger.description": "O cancelamento entra em vigor no final do seu período atual. Você mantém o acesso até essa data.", + "profile.danger.confirm": "Tem certeza? Esta ação não pode ser desfeita.", + "profile.danger.confirmCancel": "Confirmar cancelamento", + "profile.danger.cancelSubscription": "Cancelar minha assinatura", + "profile.danger.keep": "Não, manter", + "profile.prefs.interfaceLang": "Idioma da interface", + "profile.prefs.interfaceLangDesc": "O idioma é detectado automaticamente com base no seu navegador. Você pode alterá-lo manualmente.", + "profile.prefs.defaultTargetLang": "Idioma de destino padrão", + "profile.prefs.selectLanguage": "Selecione um idioma", + "profile.prefs.defaultTargetLangDesc": "Este idioma será pré-selecionado para suas traduções.", + "profile.prefs.save": "Salvar", + "profile.prefs.theme": "Tema", + "profile.prefs.themeDesc": "Escolha a aparência da interface", + "profile.prefs.cache": "Cache", + "profile.prefs.cacheDesc": "Limpar o cache local pode corrigir alguns problemas de exibição.", + "profile.prefs.clearing": "Limpando...", + "profile.prefs.clearCache": "Limpar cache", + "settings.title": "Configurações", + "settings.subtitle": "Configuração geral do aplicativo", + "settings.formats.title": "Formatos suportados", + "settings.formats.subtitle": "Tipos de documentos que você pode traduzir", + "settings.formats.formulas": "Fórmulas", + "settings.formats.styles": "Estilos", + "settings.formats.images": "Imagens", + "settings.formats.headers": "Cabeçalhos", + "settings.formats.tables": "Tabelas", + "settings.formats.slides": "Slides", + "settings.formats.notes": "Notas", + "settings.cache.title": "Cache", + "settings.cache.desc": "Limpar o cache local pode corrigir alguns problemas de exibição.", + "settings.cache.clearing": "Limpando...", + "settings.cache.clear": "Limpar cache", + "services.title": "Provedores de tradução", + "services.subtitle": "Os provedores são configurados pelo administrador. Você pode ver quais estão disponíveis para sua conta.", + "services.loading": "Carregando provedores...", + "services.noProviders": "Nenhum provedor está configurado no momento. Entre em contato com seu administrador.", + "services.classic": "Tradução clássica", + "services.llmPro": "LLM · Contextual (Pro)", + "services.available": "Disponível", + "services.model": "Modelo", + "services.adminOnly.title": "A configuração de provedores é exclusiva do administrador", + "services.adminOnly.desc": "Chaves de API, seleção de modelos e ativação de provedores são gerenciadas exclusivamente pelo administrador no painel administrativo. Você nunca precisa inserir uma chave de API.", + "apiKeys.title": "Chaves de API", + "apiKeys.subtitle": "Gerencie suas chaves de API para acesso programático à API de tradução.", + "apiKeys.loading": "Carregando...", + "apiKeys.sectionTitle": "API e automação", + "apiKeys.sectionDesc": "Gere e gerencie suas chaves de API para fluxos de automação", + "apiKeys.keysUsed": "{total} de {max} chaves usadas", + "apiKeys.maxReached": "Máximo de chaves atingido. Revogue uma chave para gerar uma nova.", + "apiKeys.canGenerate": "Você pode gerar mais {count} chave", + "apiKeys.canGeneratePlural": "Você pode gerar mais {count} chaves", + "apiKeys.generateNew": "Gerar nova chave", + "apiKeys.keyRevoked": "Chave revogada", + "apiKeys.keyRevokedDesc": "A chave de API foi revogada com sucesso.", + "apiKeys.keyNotFound": "Chave não encontrada", + "apiKeys.keyNotFoundDesc": "A chave de API não existe mais. Ela pode ter sido revogada anteriormente.", + "apiKeys.error": "Erro", + "apiKeys.revokeError": "Falha ao revogar a chave de API. Tente novamente.", + "apiKeys.limitReached": "Limite atingido", + "apiKeys.limitReachedDesc": "Você atingiu o máximo de 10 chaves de API. Revogue uma chave existente para gerar uma nova.", + "apiKeys.proRequired": "Recurso Pro necessário", + "apiKeys.proRequiredDesc": "Chaves de API são um recurso Pro. Atualize sua conta.", + "apiKeys.generateError": "Falha ao gerar a chave de API. Tente novamente.", + "apiKeys.upgrade.title": "Chaves de API", + "apiKeys.upgrade.subtitle": "Automatize suas traduções com acesso à API", + "apiKeys.upgrade.feat1": "Gere chaves de API ilimitadas", + "apiKeys.upgrade.feat2": "Automatize a tradução de documentos", + "apiKeys.upgrade.feat3": "Notificações por webhook", + "apiKeys.upgrade.feat4": "Modos de tradução LLM", + "apiKeys.upgrade.proFeature": "Chaves de API são um recurso {pro}. Atualize para desbloquear a automação por API.", + "apiKeys.upgrade.pro": "Pro", + "apiKeys.upgrade.cta": "Atualizar para Pro", + "apiKeys.dialog.maxTitle": "Máximo de chaves atingido", + "apiKeys.dialog.maxDesc": "Você atingiu o máximo de 10 chaves de API. Revogue uma chave existente antes de gerar uma nova.", + "apiKeys.dialog.close": "Fechar", + "apiKeys.dialog.generated": "Chave de API gerada!", + "apiKeys.dialog.generatedDesc": "Sua nova chave de API foi criada. Copie-a agora — ela não será exibida novamente.", + "apiKeys.dialog.important": "Importante:", + "apiKeys.dialog.importantDesc": "Esta é a única vez que você verá esta chave. Armazene-a com segurança.", + "apiKeys.dialog.apiKey": "Chave de API", + "apiKeys.dialog.name": "Nome:", + "apiKeys.dialog.done": "Concluído", + "apiKeys.dialog.copied": "Já copiei a chave", + "apiKeys.dialog.generateTitle": "Gerar nova chave de API", + "apiKeys.dialog.generateDesc": "Crie uma nova chave de API para acesso programático à API de tradução.", + "apiKeys.dialog.keyName": "Nome da chave (opcional)", + "apiKeys.dialog.keyNamePlaceholder": "ex., Produção, Staging", + "apiKeys.dialog.keyNameHint": "Um nome descritivo para identificar esta chave posteriormente.", + "apiKeys.dialog.nameTooLong": "O nome deve ter {max} caracteres ou menos", + "apiKeys.dialog.nameInvalid": "O nome só pode conter letras, números, espaços, hifens e sublinhados", + "apiKeys.dialog.cancel": "Cancelar", + "apiKeys.dialog.generating": "Gerando...", + "apiKeys.dialog.generate": "Gerar chave", + "apiKeys.table.name": "Nome", + "apiKeys.table.prefix": "Prefixo", + "apiKeys.table.created": "Criada", + "apiKeys.table.lastUsed": "Último uso", + "apiKeys.table.never": "Nunca", + "apiKeys.table.actions": "Ações", + "apiKeys.table.revoke": "Revogar", + "apiKeys.table.copyPrefix": "Copiar prefixo da chave", + "apiKeys.table.revokeKey": "Revogar chave", + "apiKeys.revokeDialog.title": "Revogar chave de API", + "apiKeys.revokeDialog.desc": "Tem certeza de que deseja revogar a chave \"{name}\"? Esta ação não pode ser desfeita.", + "apiKeys.revokeDialog.confirm": "Sim, revogar", + "apiKeys.revokeDialog.cancel": "Cancelar", + "context.proTitle": "Recurso Pro", + "context.proDesc": "Contexto e glossários profissionais estão disponíveis nos planos Pro, Business e Enterprise. Eles fornecem traduções mais precisas através de instruções e vocabulário específico do seu domínio.", + "context.viewPlans": "Ver planos", + "context.title": "Contexto e glossário", + "context.subtitle": "Melhore a qualidade da tradução com instruções e vocabulário específico do seu domínio.", + "context.presets.title": "Glossários profissionais", + "context.presets.desc": "Carregue um glossário completo com instruções e terminologia especializada", + "context.instructions.title": "Instruções de contexto", + "context.instructions.desc": "Instruções que a IA seguirá durante a tradução", + "context.instructions.placeholder": "Ex.: Você traduz documentos técnicos de climatização. Use terminologia de engenharia precisa...", + "context.glossary.title": "Glossário técnico", + "context.glossary.desc": "Formato: origem=destino (um por linha). Glossários carregados via predefinição são editáveis.", + "context.glossary.terms": "termos no glossário", + "context.clearAll": "Limpar tudo", + "context.saving": "Salvando...", + "context.save": "Salvar", + "admin.login.title": "Administração", + "admin.login.required": "Login necessário", + "admin.login.password": "Senha de administrador", + "admin.login.connecting": "Conectando...", + "admin.login.access": "Acessar painel admin", + "admin.login.restricted": "Restrito a administradores", + "admin.layout.checking": "Verificando autenticação...", + "admin.dashboard.title": "Painel de Administração", + "admin.dashboard.subtitle": "Painel de controle do administrador", + "admin.dashboard.refresh": "Atualizar", + "admin.dashboard.refreshTooltip": "Atualizar dados do painel", + "admin.dashboard.config": "Configuração do sistema", + "admin.dashboard.maxFileSize": "Tamanho máximo do arquivo:", + "admin.dashboard.translationService": "Serviço de tradução:", + "admin.dashboard.formats": "Formatos:", + "admin.nav.dashboard": "Dashboard", + "admin.nav.users": "Usuários", + "admin.nav.pricing": "Preços e Stripe", + "admin.nav.providers": "Provedores", + "admin.nav.system": "Sistema", + "admin.nav.logs": "Registros", + "admin.users.title": "Gestão de Usuários", + "admin.users.subtitle": "Visualizar e gerenciar contas de usuários", + "admin.users.planUpdated": "Plano atualizado", + "admin.users.planChanged": "O plano foi alterado para \"{plan}\" com sucesso.", + "admin.users.unknownError": "Erro desconhecido", + "admin.users.error": "Erro", + "admin.users.planUpdateError": "Não foi possível atualizar o plano: {message}", + "admin.users.noKeys": "Sem chaves", + "admin.users.noKeysDesc": "Este usuário não tem chaves API ativas.", + "admin.users.keysRevoked": "Chaves revogadas", + "admin.users.keysRevokedDesc": "{count} chave(s) API revogada(s) com sucesso.", + "admin.users.revokeError": "Não foi possível revogar as chaves: {message}", + "admin.users.retry": "Tentar novamente", + "admin.system.title": "Sistema", + "admin.system.subtitle": "Monitorar o status do sistema e gerenciar recursos", + "admin.system.quotas": "Cotas de tradução", + "admin.system.resetQuotas": "Redefinir cotas mensais", + "admin.system.resetting": "Redefinindo...", + "admin.system.reset": "Redefinir", + "admin.system.allOperational": "Todos os sistemas operacionais", + "admin.system.issuesDetected": "Problemas no sistema detectados", + "admin.system.waitingData": "Aguardando dados...", + "admin.system.purging": "Limpando...", + "admin.system.clean": "Limpar", + "admin.system.purge": "Limpar", + }, + // ═══════════════════════════════════════════════════════════════ + // ITALIAN (it) + // ═══════════════════════════════════════════════════════════════ + it: { + "auth.brandName": "Office Translator", + "dashboard.nav.translate": "Traduci", + "dashboard.nav.profile": "Il mio profilo", + "dashboard.nav.settings": "Impostazioni", + "dashboard.nav.context": "Contesto", + "dashboard.nav.services": "Servizi", + "dashboard.nav.apiKeys": "Chiavi API", + "dashboard.nav.glossaries": "Glossari", + "dashboard.header.title": "Dashboard", + "dashboard.header.subtitle": "Gestisci le tue traduzioni", + "dashboard.header.toggleMenu": "Menu", + "dashboard.header.profileTitle": "Il mio profilo", + "dashboard.sidebar.theme": "Tema", + "dashboard.sidebar.signOut": "Esci", + "dashboard.sidebar.backHome": "Torna alla home", + "dashboard.translate.pageTitle": "Traduci un documento", + "dashboard.translate.pageSubtitle": "Importa un file e scegli la lingua di destinazione", + "dashboard.translate.errorNotificationTitle": "Errore", + "dashboard.translate.dropzone.uploadAria": "Area di rilascio file", + "dashboard.translate.dropzone.title": "Trascina qui il tuo file", + "dashboard.translate.dropzone.subtitle": "oppure clicca per selezionare (DOCX, XLSX, PPTX, PDF)", + "dashboard.translate.dropzone.replaceFile": "Sostituisci file", + "dashboard.translate.language.source": "Lingua di origine", + "dashboard.translate.language.target": "Lingua di destinazione", + "dashboard.translate.language.loading": "Caricamento lingue…", + "dashboard.translate.language.autoDetect": "Rilevamento automatico", + "dashboard.translate.language.selectPlaceholder": "Seleziona…", + "dashboard.translate.language.loadErrorPrefix": "Errore nel caricamento delle lingue", + "dashboard.translate.provider.loading": "Caricamento provider…", + "dashboard.translate.provider.noneConfigured": "Nessun provider configurato", + "dashboard.translate.provider.modelTitle": "Modello", + "dashboard.translate.provider.sectionTitle": "Provider", + "dashboard.translate.provider.llmDivider": "IA · Contestuale", + "dashboard.translate.provider.llmDividerPro": "IA · Contestuale (Pro)", + "dashboard.translate.provider.upgrade": "Passa a Pro", + "dashboard.translate.provider.upgradeSuffix": "per sbloccare la traduzione IA", + "dashboard.translate.trust.zeroRetention": "Zero conservazione", + "dashboard.translate.trust.deletedAfter": "File eliminati dopo l'elaborazione", + "dashboard.translate.actions.uploading": "Caricamento…", + "dashboard.translate.actions.translate": "Traduci", + "dashboard.translate.actions.filePrefix": "File: ", + "dashboard.translate.actions.cancel": "Annulla", + "dashboard.translate.actions.tryAgain": "Riprova", + "dashboard.translate.steps.uploading": "Caricamento file…", + "dashboard.translate.steps.starting": "Avvio traduzione…", + "dashboard.translate.complete.title": "Traduzione completata!", + "dashboard.translate.complete.descNamed": "Il tuo file {name} è stato tradotto correttamente.", + "dashboard.translate.complete.descGeneric": "Il tuo file è stato tradotto correttamente.", + "dashboard.translate.complete.downloading": "Download in corso…", + "dashboard.translate.complete.download": "Scarica", + "dashboard.translate.complete.newTranslation": "Nuova traduzione", + "dashboard.translate.complete.toastOkTitle": "Operazione riuscita", + "dashboard.translate.complete.toastFailTitle": "Non riuscito", + "dashboard.translate.complete.toastFailDesc": "Traduzione non riuscita. Riprova.", + "dashboard.translate.sourceDocument": "Documento sorgente", + "dashboard.translate.configuration": "Configurazione", + "dashboard.translate.translating": "Traduzione in corso", + "dashboard.translate.liveMonitor": "Monitoraggio live", + "dashboard.translate.summary": "Riepilogo", + "dashboard.translate.engine": "Motore", + "dashboard.translate.confidence": "Confidenza", + "dashboard.translate.cancel": "Annulla", + "dashboard.translate.segments": "Segmenti", + "dashboard.translate.characters": "Caratteri", + "dashboard.translate.elapsed": "Trascorso", + "dashboard.translate.segPerMin": "Seg/min", + "dashboard.translate.highQuality": "Alta qualità", + "dashboard.translate.quality": "Qualità", + "dashboard.translate.completed": "Traduzione completata", + "dashboard.translate.replace": "Sostituisci", + "dashboard.translate.pdfMode.title": "Modalità traduzione PDF", + "dashboard.translate.pdfMode.preserveLayout": "Preserva layout", + "dashboard.translate.pdfMode.textOnly": "Solo testo", + "dashboard.translate.pdfMode.preserveLayoutDesc": "Mantiene immagini, tabelle e formattazione. Ideale per PDF semplici.", + "dashboard.translate.pdfMode.textOnlyDesc": "Traduce tutto il testo perfettamente. Output pulito, senza problemi di layout.", + "dashboard.translate.pipeline.upload": "Carica", + "dashboard.translate.pipeline.analyze": "Analizza", + "dashboard.translate.pipeline.translate": "Traduzione", + "dashboard.translate.pipeline.rebuild": "Ricostruisci", + "dashboard.translate.pipeline.finalize": "Finalizza", + "dashboard.translate.progress.failedTitle": "Traduzione fallita", + "glossaries.dialog.title": "Nuovo glossario", + "glossaries.dialog.description": "Crea un glossario per le tue traduzioni", + "glossaries.dialog.nameLabel": "Nome", + "glossaries.dialog.namePlaceholder": "Il mio glossario", + "glossaries.dialog.tabTemplates": "Modelli", + "glossaries.dialog.tabFile": "File", + "glossaries.dialog.tabManual": "Manuale", + "glossaries.dialog.cancel": "Annulla", + "glossaries.dialog.creating": "Creazione…", + "glossaries.dialog.importing": "Importazione…", + "glossaries.dialog.importBtn": "Importa", + "glossaries.dialog.selectPrompt": "Seleziona", + "glossaries.dialog.createBtn": "Crea", + "glossaries.dialog.createEmpty": "Crea vuoto", + "glossaries.dialog.terms": "termini", + "glossaries.dialog.templatesDesc": "Scegli un modello predefinito", + "glossaries.dialog.templatesEmpty": "Nessun modello disponibile", + "glossaries.dialog.dropTitle": "Trascina qui un file CSV", + "glossaries.dialog.dropOr": "oppure", + "glossaries.dialog.dropFormats": "CSV, TSV, TXT", + "glossaries.dialog.formatTitle": "Formato", + "glossaries.dialog.formatDesc": "origine,destinazione (uno per riga)", + "glossaries.dialog.formatNote": "La prima riga viene saltata se rilevata come intestazione", + "glossaries.dialog.errorFormat": "Formato non supportato", + "glossaries.dialog.errorSize": "File troppo grande", + "glossaries.dialog.errorEmpty": "File vuoto", + "glossaries.dialog.errorRead": "Errore di lettura", + "glossaries.dialog.parsing": "Analisi…", + "glossaries.dialog.termsImported": "termini importati", + "glossaries.dialog.changeFile": "Cambia file", + "glossaries.dialog.retry": "Riprova", + "pricing.nav.back": "Indietro", + "pricing.nav.home": "Home", + "pricing.nav.mySubscription": "Il mio abbonamento", + "pricing.header.badge": "Modelli IA aggiornati — Marzo 2026", + "pricing.header.title": "Un piano per ogni esigenza", + "pricing.header.subtitle": "Traduci i tuoi documenti Word, Excel e PowerPoint mantenendo la formattazione originale. Nessuna chiave API richiesta.", + "pricing.billing.monthly": "Mensile", + "pricing.billing.yearly": "Annuale", + "pricing.plans.free.name": "Gratuito", + "pricing.plans.starter.name": "Starter", + "pricing.plans.pro.name": "Pro", + "pricing.plans.business.name": "Business", + "pricing.plans.enterprise.name": "Enterprise", + "pricing.plans.free.description": "Perfetto per scoprire l'app", + "pricing.plans.starter.description": "Per privati e piccoli progetti", + "pricing.plans.pro.description": "Per professionisti e team in crescita", + "pricing.plans.business.description": "Per team e organizzazioni", + "pricing.plans.enterprise.description": "Soluzioni personalizzate per grandi organizzazioni", + "pricing.plans.pro.highlight": "Il più popolare", + "pricing.plans.pro.badge": "POPOLARE", + "pricing.plans.enterprise.badge": "SU RICHIESTA", + "pricing.plans.free.feat1": "5 documenti / mese", + "pricing.plans.free.feat2": "Fino a 15 pagine per documento", + "pricing.plans.free.feat3": "Google Traduttore incluso", + "pricing.plans.free.feat4": "Tutte le lingue (130+)", + "pricing.plans.free.feat5": "Supporto della community", + "pricing.plans.starter.feat1": "50 documenti / mese", + "pricing.plans.starter.feat2": "Fino a 50 pagine per documento", + "pricing.plans.starter.feat3": "Google Traduttore + DeepL", + "pricing.plans.starter.feat4": "File fino a 10 MB", + "pricing.plans.starter.feat5": "Supporto via e-mail", + "pricing.plans.starter.feat6": "Cronologia di 30 giorni", + "pricing.plans.pro.feat1": "200 documenti / mese", + "pricing.plans.pro.feat2": "Fino a 200 pagine per documento", + "pricing.plans.pro.feat3": "Traduzione IA Essenziale (DeepSeek V3.2)", + "pricing.plans.pro.feat4": "Google Traduttore + DeepL", + "pricing.plans.pro.feat5": "File fino a 25 MB", + "pricing.plans.pro.feat6": "Glossari personalizzati", + "pricing.plans.pro.feat7": "Supporto prioritario", + "pricing.plans.pro.feat8": "Cronologia di 90 giorni", + "pricing.plans.business.feat1": "1 000 documenti / mese", + "pricing.plans.business.feat2": "Fino a 500 pagine per documento", + "pricing.plans.business.feat3": "IA Essenziale + Premium (Claude Haiku)", + "pricing.plans.business.feat4": "Tutti i provider di traduzione", + "pricing.plans.business.feat5": "File fino a 50 MB", + "pricing.plans.business.feat6": "Accesso API (10 000 chiamate/mese)", + "pricing.plans.business.feat7": "Webhook di notifica", + "pricing.plans.business.feat8": "Supporto dedicato", + "pricing.plans.business.feat9": "Cronologia di 1 anno", + "pricing.plans.business.feat10": "Analisi avanzate", + "pricing.plans.enterprise.feat1": "Documenti illimitati", + "pricing.plans.enterprise.feat2": "Tutti i modelli IA (GPT-5, Claude Opus 4.6…)", + "pricing.plans.enterprise.feat3": "Distribuzione on-premise o cloud dedicato", + "pricing.plans.enterprise.feat4": "SLA 99,9 % garantito", + "pricing.plans.enterprise.feat5": "Supporto dedicato 24/7", + "pricing.plans.enterprise.feat6": "White-label", + "pricing.plans.enterprise.feat7": "Team illimitati", + "pricing.plans.enterprise.feat8": "Integrazioni personalizzate", + "pricing.card.onRequest": "Su richiesta", + "pricing.card.free": "Gratuito", + "pricing.card.perMonth": "/mese", + "pricing.card.billedYearly": "Fatturato {price} € / anno", + "pricing.card.documents": "Documenti", + "pricing.card.pagesMax": "Pagine max", + "pricing.card.aiTranslation": "Traduzione IA", + "pricing.card.unlimited": "Illimitato", + "pricing.card.perMonthStat": "/ mese", + "pricing.card.perDoc": "p / doc", + "pricing.card.aiEssential": "Essenziale", + "pricing.card.aiEssentialPremium": "Essenziale + Premium", + "pricing.card.aiCustom": "Personalizzato", + "pricing.card.myPlan": "Il mio piano", + "pricing.card.managePlan": "Gestisci il mio piano", + "pricing.card.startFree": "Inizia gratuitamente", + "pricing.card.contactUs": "Contattaci", + "pricing.card.choosePlan": "Scegli questo piano", + "pricing.card.processing": "Elaborazione…", + "pricing.comparison.title": "Confronto dettagliato", + "pricing.comparison.subtitle": "Tutto ciò che include ogni piano", + "pricing.comparison.feature": "Funzionalità", + "pricing.comparison.docsPerMonth": "Documenti / mese", + "pricing.comparison.pagesMaxPerDoc": "Pagine max / documento", + "pricing.comparison.maxFileSize": "Dimensione max file", + "pricing.comparison.googleTranslation": "Google Traduttore", + "pricing.comparison.deepl": "DeepL", + "pricing.comparison.aiEssential": "Traduzione IA Essenziale", + "pricing.comparison.aiPremium": "Traduzione IA Premium", + "pricing.comparison.apiAccess": "Accesso API", + "pricing.comparison.priorityProcessing": "Elaborazione prioritaria", + "pricing.comparison.support": "Supporto", + "pricing.comparison.support.community": "Community", + "pricing.comparison.support.email": "E-mail", + "pricing.comparison.support.priority": "Prioritario", + "pricing.comparison.support.dedicated": "Dedicato", + "pricing.comparison.mb": "MB", + "pricing.credits.title": "Crediti aggiuntivi", + "pricing.credits.subtitle": "Ne serve di più? Acquista crediti singoli, senza abbonamento.", + "pricing.credits.perPage": "1 credito = 1 pagina tradotta.", + "pricing.credits.bestValue": "Miglior rapporto qualità-prezzo", + "pricing.credits.unit": "crediti", + "pricing.credits.centsPerCredit": "cts / credito", + "pricing.credits.buy": "Acquista", + "pricing.trust.encryption.title": "Crittografia end-to-end", + "pricing.trust.encryption.sub": "TLS 1.3 + AES-256 a riposo", + "pricing.trust.languages.title": "130+ lingue", + "pricing.trust.languages.sub": "Tra cui arabo, persiano, ebraico (RTL)", + "pricing.trust.parallel.title": "Elaborazione parallela", + "pricing.trust.parallel.sub": "IA multi-thread ultraveloce", + "pricing.trust.availability.title": "Disponibile 24/7", + "pricing.trust.availability.sub": "99,9 % di uptime garantito", + "pricing.aiModels.title": "I nostri modelli IA — Marzo 2026", + "pricing.aiModels.essential.title": "Traduzione IA Essenziale", + "pricing.aiModels.essential.plan": "Piano Pro", + "pricing.aiModels.essential.descPrefix": "Basato su", + "pricing.aiModels.essential.descSuffix": "— il modello IA più conveniente del 2026. Qualità paragonabile ai modelli frontier a 1/50 del costo.", + "pricing.aiModels.essential.context": "163K token di contesto", + "pricing.aiModels.essential.value": "Eccellente rapporto qualità-prezzo", + "pricing.aiModels.premium.title": "Traduzione IA Premium", + "pricing.aiModels.premium.plan": "Piano Business", + "pricing.aiModels.premium.descPrefix": "Basato su", + "pricing.aiModels.premium.descSuffix": "di Anthropic — preciso su documenti legali, medici e tecnici complessi.", + "pricing.aiModels.premium.context": "200K token di contesto", + "pricing.aiModels.premium.precision": "Massima precisione", + "pricing.faq.title": "Domande frequenti", + "pricing.faq.q1": "Posso cambiare piano in qualsiasi momento?", + "pricing.faq.a1": "Sì. Il passaggio a un piano superiore è immediato e proporzionale. Il downgrade sarà attivo alla fine del periodo corrente.", + "pricing.faq.q2": "Cos'è la «Traduzione IA Essenziale»?", + "pricing.faq.a2": "È il nostro motore IA basato su DeepSeek V3.2 tramite OpenRouter. Comprende il contesto dei tuoi documenti, preserva il layout e gestisce i termini tecnici molto meglio della traduzione classica.", + "pricing.faq.q3": "Qual è la differenza tra IA Essenziale e IA Premium?", + "pricing.faq.a3": "L'IA Essenziale utilizza DeepSeek V3.2 (eccellente rapporto qualità-prezzo). L'IA Premium utilizza Claude 3.5 Haiku di Anthropic, più preciso su documenti legali, medici e tecnici complessi.", + "pricing.faq.q4": "I miei documenti vengono conservati dopo la traduzione?", + "pricing.faq.a4": "I file tradotti sono disponibili secondo il tuo piano (30 giorni Starter, 90 giorni Pro, 1 anno Business). Sono crittografati a riposo e in transito.", + "pricing.faq.q5": "Cosa succede se supero la quota mensile?", + "pricing.faq.a5": "Puoi acquistare crediti aggiuntivi singolarmente o fare upgrade del piano. Riceverai una notifica al raggiungimento dell'80 % di utilizzo.", + "pricing.faq.q6": "C'è un periodo di prova gratuito per i piani a pagamento?", + "pricing.faq.a6": "Il piano Gratuito è permanente e non richiede carta di credito. Per i piani Pro e Business, contattaci per una prova di 14 giorni.", + "pricing.faq.q7": "Quali formati di file sono supportati?", + "pricing.faq.a7": "Word (.docx), Excel (.xlsx/.xls), PowerPoint (.pptx) e presto PDF. Tutti i piani supportano gli stessi formati.", + "pricing.cta.title": "Pronto per iniziare?", + "pricing.cta.subtitle": "Inizia gratuitamente, senza carta di credito. Fai upgrade quando ne hai bisogno.", + "pricing.cta.createAccount": "Crea un account gratuito", + "pricing.cta.login": "Accedi", + "pricing.toast.demo": "Modalità demo — Stripe non è ancora configurato. In produzione, saresti reindirizzato al pagamento per attivare il piano {planId}.", + "pricing.toast.networkError": "Errore di rete. Riprova.", + "pricing.toast.paymentError": "Errore durante la creazione del pagamento.", + "register.title": "Crea un account", + "register.subtitle": "Inizia a tradurre gratuitamente", + "register.error.failed": "Registrazione non riuscita", + "register.name.label": "Nome", + "register.name.placeholder": "Il tuo nome", + "register.name.error": "Il nome deve contenere almeno 2 caratteri", + "register.email.label": "Indirizzo e-mail", + "register.email.placeholder": "tu@esempio.com", + "register.email.error": "Indirizzo e-mail non valido", + "register.password.label": "Password", + "register.password.error": "La password deve contenere almeno 8 caratteri, una maiuscola, una minuscola e una cifra", + "register.password.show": "Mostra password", + "register.password.hide": "Nascondi password", + "register.password.strengthLabel": "Sicurezza:", + "register.password.strength.weak": "Debole", + "register.password.strength.medium": "Media", + "register.password.strength.strong": "Forte", + "register.confirmPassword.label": "Conferma password", + "register.confirmPassword.error": "Le password non coincidono", + "register.confirmPassword.show": "Mostra", + "register.confirmPassword.hide": "Nascondi", + "register.submit.creating": "Creazione account...", + "register.submit.create": "Crea il mio account", + "register.hasAccount": "Hai già un account?", + "register.login": "Accedi", + "register.terms.prefix": "Creando un account, accetti i nostri", + "register.terms.link": "termini di servizio", + + // ── Landing page ── + "landing.nav.whyUs": "Perché noi", + "landing.nav.formats": "Formati", + "landing.nav.pricing": "Prezzi", + "landing.nav.login": "Accedi", + "landing.nav.startFree": "Prova gratis", + "landing.hero.badge": "Novità: supporto PDF + traduzione con IA", + "landing.hero.title1": "Traduci i tuoi documenti.", + "landing.hero.title2": "Mantieni la formattazione perfetta.", + "landing.hero.subtitle": "L'unico traduttore che preserva SmartArt, grafici, indici, forme, intestazioni e piè di pagina — esattamente come erano. Nessuna sorpresa al momento del pagamento.", + "landing.hero.cta": "Prova gratis — 2 documenti/mese", + "landing.hero.seePlans": "Vedi i piani", + "landing.trust.filesDeleted": "File eliminati dopo 60 min", + "landing.trust.noBait": "Nessun prezzo ingannevole", + "landing.trust.preview": "Anteprima prima di pagare", + "landing.why.title": "La tua formattazione, perfettamente preservata", + "landing.why.subtitle": "Altri traduttori rovinano il tuo layout. Noi no.", + "landing.why.smartart.title": "SmartArt e diagrammi", + "landing.why.smartart.desc": "Organigrammi, diagrammi di flusso, gerarchie — tutto tradotto al suo posto.", + "landing.why.toc.title": "Indici", + "landing.why.toc.desc": "Voci dell'indice, numeri di pagina e riferimenti incrociati vengono aggiornati correttamente.", + "landing.why.charts.title": "Grafici", + "landing.why.charts.desc": "Titoli, etichette degli assi, legende e nomi delle serie — tutto viene tradotto.", + "landing.why.shapes.title": "Forme e caselle di testo", + "landing.why.shapes.desc": "Rettangoli, box arrotondati, callout — troviamo e traduciamo il testo dentro tutte le forme.", + "landing.why.headers.title": "Intestazioni e piè di pagina", + "landing.why.headers.desc": "Intestazioni, piè di pagina e note a piè di pagina non vengono mai dimenticati.", + "landing.why.languages.title": "130+ lingue", + "landing.why.languages.desc": "Google Translate, DeepL e motori IA per una qualità professionale.", + "landing.pricing.title": "Prezzi semplici e onesti", + "landing.pricing.subtitle": "Quello che vedi è quello che paghi. Nessun costo nascosto dopo la traduzione.", + "landing.pricing.monthly": "Mensile", + "landing.pricing.yearly": "Annuale", + "landing.pricing.starter.title": "Starter", + "landing.pricing.starter.desc": "Per privati e piccoli progetti", + "landing.pricing.starter.f1": "50 documenti / mese", + "landing.pricing.starter.f2": "Fino a 50 pagine per documento", + "landing.pricing.starter.f3": "Google Translate + DeepL", + "landing.pricing.starter.f4": "File fino a 10 MB", + "landing.pricing.starter.cta": "Inizia", + "landing.pricing.pro.title": "Pro", + "landing.pricing.pro.badge": "Più popolare", + "landing.pricing.pro.desc": "Per professionisti che hanno bisogno di qualità", + "landing.pricing.pro.f1": "200 documenti / mese", + "landing.pricing.pro.f2": "Fino a 200 pagine per documento", + "landing.pricing.pro.f3": "Traduzione con IA (DeepSeek)", + "landing.pricing.pro.f4": "Google + DeepL inclusi", + "landing.pricing.pro.f5": "Glossari e prompt personalizzati", + "landing.pricing.pro.f6": "Supporto prioritario", + "landing.pricing.pro.cta": "Prova Pro", + "landing.pricing.business.title": "Business", + "landing.pricing.business.desc": "Per team con esigenze di alto volume", + "landing.pricing.business.f1": "1 000 documenti / mese", + "landing.pricing.business.f2": "Fino a 500 pagine per documento", + "landing.pricing.business.f3": "IA Premium (Claude)", + "landing.pricing.business.f4": "Tutti i provider + accesso API", + "landing.pricing.business.f5": "Webhook e automazione", + "landing.pricing.business.f6": "5 postazioni team", + "landing.pricing.business.cta": "Contattaci", + "landing.pricing.honest": "Il prezzo mostrato è il prezzo che paghi. Nessun costo nascosto dopo la traduzione.", + "landing.pricing.billedYearly": "fatturato annualmente", + "landing.pricing.perMonth": "/mese", + "landing.formats.title": "Ogni formato, ogni elemento", + "landing.formats.subtitle": "Traduciamo ciò che gli altri tralasciano.", + "landing.formats.word": "Word (.docx)", + "landing.formats.word.f1": "Paragrafi e intestazioni", + "landing.formats.word.f2": "Tabelle e grafici", + "landing.formats.word.f3": "Diagrammi SmartArt", + "landing.formats.word.f4": "Indice", + "landing.formats.word.f5": "Intestazioni e piè di pagina", + "landing.formats.word.f6": "Forme e caselle di testo", + "landing.formats.word.f7": "Note a piè di pagina e di chiusura", + "landing.formats.excel": "Excel (.xlsx)", + "landing.formats.excel.f1": "Valori delle celle", + "landing.formats.excel.f2": "Nomi dei fogli", + "landing.formats.excel.f3": "Grafici e etichette", + "landing.formats.excel.f4": "Intestazioni e piè di pagina", + "landing.formats.excel.f5": "Celle unite preservate", + "landing.formats.powerpoint": "PowerPoint (.pptx)", + "landing.formats.powerpoint.f1": "Testo delle slide e note", + "landing.formats.powerpoint.f2": "Grafici e diagrammi", + "landing.formats.powerpoint.f3": "Forme e caselle di testo", + "landing.formats.powerpoint.f4": "Layout master", + "landing.formats.powerpoint.f5": "Animazioni preservate", + "landing.formats.pdf": "PDF", + "landing.formats.pdf.f1": "PDF basati su testo", + "landing.formats.pdf.f2": "Layout preservato", + "landing.formats.pdf.f3": "Immagini mantenute al loro posto", + "landing.formats.pdf.f4": "Tabelle mantenute", + "landing.formats.pdf.f5": "Output come DOCX o PDF", + "landing.cta.title": "Inizia a tradurre in 30 secondi", + "landing.cta.subtitle": "Nessuna carta di credito richiesta. Prova 2 documenti gratuitamente e nota la differenza.", + "landing.cta.button": "Crea un account gratuito", + "landing.footer.privacy": "Privacy", + "landing.footer.terms": "Termini", + "landing.footer.contact": "Contatti", + "landing.ai.badge": "Motore di Traduzione IA", + "landing.ai.title": "Traduzione che comprende il tuo mestiere", + "landing.ai.subtitle": "I nostri modelli IA analizzano il contesto, rispettano la terminologia e traducono testo nelle immagini.", + "landing.ai.context.title": "Contesto settoriale", + "landing.ai.context.desc": "Descrivi il tuo settore e ottieni traduzioni su misura.", + "landing.ai.glossary.title": "Glossari di settore", + "landing.ai.glossary.desc": "Definisci i tuoi termini tecnici. CTA sara Air Handling Unit, mai Call To Action.", + "landing.ai.vision.title": "Visione immagini", + "landing.ai.vision.desc": "Il testo nelle immagini, diagrammi e grafici viene rilevato e tradotto.", + "landing.ai.comparison.source": "Fonte (FR)", + "landing.ai.comparison.google": "Google Translate", + "landing.ai.comparison.ai": "La nostra IA", + "landing.howItWorks.title": "Come funziona?", + "landing.howItWorks.subtitle": "Tre passaggi. Zero perdita di formato.", + "landing.howItWorks.step1.title": "Carica il file", + "landing.howItWorks.step1.desc": "Trascina il tuo documento Excel, Word, PowerPoint o PDF.", + "landing.howItWorks.step2.title": "Scegli lingua e motore", + "landing.howItWorks.step2.desc": "Seleziona lingua e motore - standard o IA contestuale.", + "landing.howItWorks.step3.title": "Scarica il risultato", + "landing.howItWorks.step3.desc": "Ricevi il documento tradotto con formattazione identica.", + "login.errorTitle": "Login Error", + "login.welcomeBack": "Welcome back", + "login.signInToContinue": "Sign in to continue translating", + "login.email": "Email", + "login.emailPlaceholder": "you@example.com", + "login.password": "Password", + "login.forgotPassword": "Forgot password?", + "login.passwordPlaceholder": "••••••••", + "login.signingIn": "Signing in...", + "login.signIn": "Sign In", + "login.noAccount": "Don't have an account?", + "login.signUpFree": "Sign up for free", + "forgotPassword.enterEmail": "Please enter your email address", + "forgotPassword.error": "An error occurred", + "forgotPassword.title": "Forgot Password", + "forgotPassword.checkEmail": "Check your inbox", + "forgotPassword.subtitle": "Enter your email to receive a reset link", + "forgotPassword.sentMessage": "If an account exists with this address, a reset email has been sent.", + "forgotPassword.emailLabel": "Email address", + "forgotPassword.emailPlaceholder": "you@example.com", + "forgotPassword.sending": "Sending...", + "forgotPassword.sendLink": "Send reset link", + "forgotPassword.backToLogin": "Back to login", + "forgotPassword.loading": "Loading...", + "resetPassword.passwordRequirements": "Password must contain at least 8 characters, one uppercase, one lowercase, and one number", + "resetPassword.passwordMismatch": "Passwords do not match", + "resetPassword.tokenMissing": "Missing token. Please use the link received by email.", + "resetPassword.error": "An error occurred", + "resetPassword.invalidLink": "Invalid link", + "resetPassword.invalidLinkMessage": "This reset link is invalid. Please request a new one.", + "resetPassword.requestNewLink": "Request new link", + "resetPassword.successTitle": "Password reset", + "resetPassword.newPasswordTitle": "New password", + "resetPassword.successSubtitle": "You will be redirected to login", + "resetPassword.subtitle": "Set your new password", + "resetPassword.successMessage": "Your password has been successfully reset. You will be redirected to the login page.", + "resetPassword.newPassword": "New password", + "resetPassword.showPassword": "Show password", + "resetPassword.hidePassword": "Hide password", + "resetPassword.confirmPassword": "Confirm password", + "resetPassword.resetting": "Resetting...", + "resetPassword.resetPassword": "Reset password", + "resetPassword.backToLogin": "Back to login", + "resetPassword.loading": "Loading...", + "common.loading": "Caricamento...", + "profile.header.title": "Il mio profilo", + "profile.header.subtitle": "Gestisci il tuo account e le tue preferenze.", + "profile.tabs.account": "Account", + "profile.tabs.subscription": "Abbonamento", + "profile.tabs.preferences": "Preferenze", + "profile.account.user": "Utente", + "profile.account.memberSince": "Membro dal", + "profile.plan.label": "Piano", + "profile.plan.free": "Free", + "profile.plan.starter": "Starter", + "profile.plan.pro": "Pro", + "profile.plan.business": "Business", + "profile.plan.enterprise": "Enterprise", + "profile.plan.pricePerMonth": "{price} €/mese", + "profile.subscription.canceling": "In cancellazione", + "profile.subscription.active": "Attivo", + "profile.subscription.unknown": "Sconosciuto", + "profile.subscription.accessUntil": "Accesso fino al", + "profile.subscription.renewalOn": "Rinnovo il", + "profile.subscription.upgradePlan": "Passa a un piano a pagamento", + "profile.subscription.changePlan": "Cambia piano", + "profile.subscription.manageBilling": "Gestisci fatturazione", + "profile.subscription.billingUnavailable": "Portale di fatturazione non disponibile.", + "profile.subscription.billingError": "Errore di accesso al portale di fatturazione.", + "profile.subscription.cancelSuccess": "Abbonamento cancellato. Mantieni l'accesso fino alla fine del periodo.", + "profile.subscription.cancelError": "Errore durante la cancellazione.", + "profile.subscription.networkError": "Errore di rete.", + "profile.usage.title": "Utilizzo di questo mese", + "profile.usage.resetOn": "Azzeramento il", + "profile.usage.documents": "Documenti", + "profile.usage.pages": "Pagine", + "profile.usage.extraCredits": "credito extra", + "profile.usage.extraCreditsPlural": "crediti extra", + "profile.usage.quotaReached": "Quota raggiunta", + "profile.usage.quotaReachedDesc": "Passa a un piano superiore per continuare.", + "profile.usage.unlockMore": "Sblocca più traduzioni con un piano a pagamento.", + "profile.usage.viewPlans": "Vedi i piani", + "profile.usage.includedInPlan": "Incluso nel tuo piano", + "profile.danger.title": "Zona pericolosa", + "profile.danger.description": "La cancellazione avrà effetto alla fine del periodo corrente. Mantieni l'accesso fino a quella data.", + "profile.danger.confirm": "Sei sicuro? Questa azione non può essere annullata.", + "profile.danger.confirmCancel": "Conferma cancellazione", + "profile.danger.cancelSubscription": "Cancella il mio abbonamento", + "profile.danger.keep": "No, mantieni", + "profile.prefs.interfaceLang": "Lingua dell'interfaccia", + "profile.prefs.interfaceLangDesc": "La lingua viene rilevata automaticamente in base al tuo browser. Puoi cambiarla manualmente.", + "profile.prefs.defaultTargetLang": "Lingua di destinazione predefinita", + "profile.prefs.selectLanguage": "Seleziona una lingua", + "profile.prefs.defaultTargetLangDesc": "Questa lingua sarà preselezionata per le tue traduzioni.", + "profile.prefs.save": "Salva", + "profile.prefs.theme": "Tema", + "profile.prefs.themeDesc": "Scegli l'aspetto dell'interfaccia", + "profile.prefs.cache": "Cache", + "profile.prefs.cacheDesc": "Svuotare la cache locale può risolvere alcuni problemi di visualizzazione.", + "profile.prefs.clearing": "Svuotamento...", + "profile.prefs.clearCache": "Svuota cache", + "settings.title": "Impostazioni", + "settings.subtitle": "Configurazione generale dell'applicazione", + "settings.formats.title": "Formati supportati", + "settings.formats.subtitle": "Tipi di documento che puoi tradurre", + "settings.formats.formulas": "Formule", + "settings.formats.styles": "Stili", + "settings.formats.images": "Immagini", + "settings.formats.headers": "Intestazioni", + "settings.formats.tables": "Tabelle", + "settings.formats.slides": "Diapositive", + "settings.formats.notes": "Note", + "settings.cache.title": "Cache", + "settings.cache.desc": "Svuotare la cache locale può risolvere alcuni problemi di visualizzazione.", + "settings.cache.clearing": "Svuotamento...", + "settings.cache.clear": "Svuota cache", + "services.title": "Fornitori di traduzione", + "services.subtitle": "I fornitori sono configurati dall'amministratore. Puoi vedere quali sono attualmente disponibili per il tuo account.", + "services.loading": "Caricamento fornitori...", + "services.noProviders": "Nessun fornitore attualmente configurato. Contatta il tuo amministratore.", + "services.classic": "Traduzione classica", + "services.llmPro": "LLM · Contestuale (Pro)", + "services.available": "Disponibile", + "services.model": "Modello", + "services.adminOnly.title": "La configurazione dei fornitori è riservata all'amministratore", + "services.adminOnly.desc": "Le chiavi API, la selezione dei modelli e l'attivazione dei fornitori sono gestite esclusivamente dall'amministratore nel pannello admin. Non è necessario inserire alcuna chiave API.", + "apiKeys.title": "Chiavi API", + "apiKeys.subtitle": "Gestisci le tue chiavi API per l'accesso programmatico all'API di traduzione.", + "apiKeys.loading": "Caricamento...", + "apiKeys.sectionTitle": "API e automazione", + "apiKeys.sectionDesc": "Genera e gestisci le tue chiavi API per i flussi di automazione", + "apiKeys.keysUsed": "{total} di {max} chiavi utilizzate", + "apiKeys.maxReached": "Numero massimo di chiavi raggiunto. Revoca una chiave per generarne una nuova.", + "apiKeys.canGenerate": "Puoi generare ancora {count} chiave", + "apiKeys.canGeneratePlural": "Puoi generare ancora {count} chiavi", + "apiKeys.generateNew": "Genera nuova chiave", + "apiKeys.keyRevoked": "Chiave revocata", + "apiKeys.keyRevokedDesc": "La chiave API è stata revocata con successo.", + "apiKeys.keyNotFound": "Chiave non trovata", + "apiKeys.keyNotFoundDesc": "La chiave API non esiste più. Potrebbe essere già stata revocata.", + "apiKeys.error": "Errore", + "apiKeys.revokeError": "Impossibile revocare la chiave API. Riprova.", + "apiKeys.limitReached": "Limite raggiunto", + "apiKeys.limitReachedDesc": "Hai raggiunto il massimo di 10 chiavi API. Revoca una chiave esistente per generarne una nuova.", + "apiKeys.proRequired": "Funzionalità Pro richiesta", + "apiKeys.proRequiredDesc": "Le chiavi API sono una funzionalità Pro. Aggiorna il tuo account.", + "apiKeys.generateError": "Impossibile generare la chiave API. Riprova.", + "apiKeys.upgrade.title": "Chiavi API", + "apiKeys.upgrade.subtitle": "Automatizza le tue traduzioni con l'accesso API", + "apiKeys.upgrade.feat1": "Genera chiavi API illimitate", + "apiKeys.upgrade.feat2": "Automatizza la traduzione dei documenti", + "apiKeys.upgrade.feat3": "Notifiche webhook", + "apiKeys.upgrade.feat4": "Modalità di traduzione LLM", + "apiKeys.upgrade.proFeature": "Le chiavi API sono una funzionalità {pro}. Aggiorna per sbloccare l'automazione API.", + "apiKeys.upgrade.pro": "Pro", + "apiKeys.upgrade.cta": "Passa a Pro", + "apiKeys.dialog.maxTitle": "Numero massimo di chiavi raggiunto", + "apiKeys.dialog.maxDesc": "Hai raggiunto il massimo di 10 chiavi API. Revoca una chiave esistente prima di generarne una nuova.", + "apiKeys.dialog.close": "Chiudi", + "apiKeys.dialog.generated": "Chiave API generata!", + "apiKeys.dialog.generatedDesc": "La tua nuova chiave API è stata creata. Copiala ora - non verrà più mostrata.", + "apiKeys.dialog.important": "Importante:", + "apiKeys.dialog.importantDesc": "Questa è l'unica volta che vedrai questa chiave. Conservala in modo sicuro.", + "apiKeys.dialog.apiKey": "Chiave API", + "apiKeys.dialog.name": "Nome:", + "apiKeys.dialog.done": "Fatto", + "apiKeys.dialog.copied": "Ho copiato la chiave", + "apiKeys.dialog.generateTitle": "Genera nuova chiave API", + "apiKeys.dialog.generateDesc": "Crea una nuova chiave API per l'accesso programmatico all'API di traduzione.", + "apiKeys.dialog.keyName": "Nome chiave (opzionale)", + "apiKeys.dialog.keyNamePlaceholder": "es. Produzione, Staging", + "apiKeys.dialog.keyNameHint": "Un nome descrittivo per identificare questa chiave in seguito.", + "apiKeys.dialog.nameTooLong": "Il nome deve contenere al massimo {max} caratteri", + "apiKeys.dialog.nameInvalid": "Il nome può contenere solo lettere, numeri, spazi, trattini e trattini bassi", + "apiKeys.dialog.cancel": "Annulla", + "apiKeys.dialog.generating": "Generazione...", + "apiKeys.dialog.generate": "Genera chiave", + "apiKeys.table.name": "Nome", + "apiKeys.table.prefix": "Prefisso", + "apiKeys.table.created": "Creata", + "apiKeys.table.lastUsed": "Ultimo utilizzo", + "apiKeys.table.never": "Mai", + "apiKeys.table.actions": "Azioni", + "apiKeys.table.revoke": "Revoca", + "apiKeys.table.copyPrefix": "Copia prefisso chiave", + "apiKeys.table.revokeKey": "Revoca chiave", + "apiKeys.revokeDialog.title": "Revoca chiave API", + "apiKeys.revokeDialog.desc": "Sei sicuro di voler revocare la chiave \"{name}\"? Questa azione non può essere annullata.", + "apiKeys.revokeDialog.confirm": "Sì, revoca", + "apiKeys.revokeDialog.cancel": "Annulla", + "context.proTitle": "Funzionalità Pro", + "context.proDesc": "Il contesto e i glossari professionali sono disponibili con i piani Pro, Business ed Enterprise. Offrono traduzioni più accurate grazie a istruzioni e vocabolario specifici del tuo dominio.", + "context.viewPlans": "Vedi i piani", + "context.title": "Contesto e glossario", + "context.subtitle": "Migliora la qualità della traduzione con istruzioni e vocabolario specifici del tuo dominio.", + "context.presets.title": "Glossari professionali", + "context.presets.desc": "Carica un glossario completo con istruzioni e terminologia specializzata", + "context.instructions.title": "Istruzioni di contesto", + "context.instructions.desc": "Istruzioni che l'IA seguirà durante la traduzione", + "context.instructions.placeholder": "Es.: Traduci documenti tecnici HVAC. Utilizza terminologia ingegneristica precisa...", + "context.glossary.title": "Glossario tecnico", + "context.glossary.desc": "Formato: origine=destinazione (uno per riga). I glossari caricati tramite preset sono modificabili.", + "context.glossary.terms": "termini nel glossario", + "context.clearAll": "Cancella tutto", + "context.saving": "Salvataggio...", + "context.save": "Salva", + "admin.login.title": "Amministrazione", + "admin.login.required": "Accesso richiesto", + "admin.login.password": "Password amministratore", + "admin.login.connecting": "Connessione...", + "admin.login.access": "Accedi al pannello admin", + "admin.login.restricted": "Riservato agli amministratori", + "admin.layout.checking": "Verifica dell'autenticazione...", + "admin.dashboard.title": "Dashboard Admin", + "admin.dashboard.subtitle": "Pannello di controllo amministratore", + "admin.dashboard.refresh": "Aggiorna", + "admin.dashboard.refreshTooltip": "Aggiorna dati dashboard", + "admin.dashboard.config": "Configurazione di sistema", + "admin.dashboard.maxFileSize": "Dimensione max file:", + "admin.dashboard.translationService": "Servizio di traduzione:", + "admin.dashboard.formats": "Formati:", + "admin.nav.dashboard": "Dashboard", + "admin.nav.users": "Utenti", + "admin.nav.pricing": "Prezzi e Stripe", + "admin.nav.providers": "Fornitori", + "admin.nav.system": "Sistema", + "admin.nav.logs": "Log", + "admin.users.title": "Gestione Utenti", + "admin.users.subtitle": "Visualizza e gestisci gli account utente", + "admin.users.planUpdated": "Piano aggiornato", + "admin.users.planChanged": "Il piano è stato modificato in \"{plan}\" con successo.", + "admin.users.unknownError": "Errore sconosciuto", + "admin.users.error": "Errore", + "admin.users.planUpdateError": "Impossibile aggiornare il piano: {message}", + "admin.users.noKeys": "Nessuna chiave", + "admin.users.noKeysDesc": "Questo utente non ha chiavi API attive.", + "admin.users.keysRevoked": "Chiavi revocate", + "admin.users.keysRevokedDesc": "{count} chiave/i API revocata/e con successo.", + "admin.users.revokeError": "Impossibile revocare le chiavi: {message}", + "admin.users.retry": "Riprova", + "admin.system.title": "Sistema", + "admin.system.subtitle": "Monitora lo stato del sistema e gestisci le risorse", + "admin.system.quotas": "Quote di traduzione", + "admin.system.resetQuotas": "Ripristina quote mensili", + "admin.system.resetting": "Ripristino...", + "admin.system.reset": "Ripristina", + "admin.system.allOperational": "Tutti i sistemi operativi", + "admin.system.issuesDetected": "Problemi di sistema rilevati", + "admin.system.waitingData": "In attesa di dati...", + "admin.system.purging": "Pulizia in corso...", + "admin.system.clean": "Pulisci", + "admin.system.purge": "Pulisci", + }, + // ═══════════════════════════════════════════════════════════════ + // DUTCH (nl) + // ═══════════════════════════════════════════════════════════════ + nl: { + "auth.brandName": "Office Translator", + "dashboard.nav.translate": "Vertalen", + "dashboard.nav.profile": "Mijn profiel", + "dashboard.nav.settings": "Instellingen", + "dashboard.nav.context": "Context", + "dashboard.nav.services": "Diensten", + "dashboard.nav.apiKeys": "API-sleutels", + "dashboard.nav.glossaries": "Woordenlijsten", + "dashboard.header.title": "Dashboard", + "dashboard.header.subtitle": "Beheer uw vertalingen", + "dashboard.header.toggleMenu": "Menu", + "dashboard.header.profileTitle": "Mijn profiel", + "dashboard.sidebar.theme": "Thema", + "dashboard.sidebar.signOut": "Uitloggen", + "dashboard.sidebar.backHome": "Terug naar home", + "dashboard.translate.pageTitle": "Document vertalen", + "dashboard.translate.pageSubtitle": "Importeer een bestand en kies de doeltaal", + "dashboard.translate.errorNotificationTitle": "Fout", + "dashboard.translate.dropzone.uploadAria": "Bestandsdropzone", + "dashboard.translate.dropzone.title": "Sleep uw bestand hierheen", + "dashboard.translate.dropzone.subtitle": "of klik om te selecteren (DOCX, XLSX, PPTX, PDF)", + "dashboard.translate.dropzone.replaceFile": "Bestand vervangen", + "dashboard.translate.language.source": "Brontaal", + "dashboard.translate.language.target": "Doeltaal", + "dashboard.translate.language.loading": "Talen laden…", + "dashboard.translate.language.autoDetect": "Automatisch detecteren", + "dashboard.translate.language.selectPlaceholder": "Selecteren…", + "dashboard.translate.language.loadErrorPrefix": "Fout bij laden van talen", + "dashboard.translate.provider.loading": "Providers laden…", + "dashboard.translate.provider.noneConfigured": "Geen providers geconfigureerd", + "dashboard.translate.provider.modelTitle": "Model", + "dashboard.translate.provider.sectionTitle": "Provider", + "dashboard.translate.provider.llmDivider": "AI · Contextbewust", + "dashboard.translate.provider.llmDividerPro": "AI · Contextbewust (Pro)", + "dashboard.translate.provider.upgrade": "Upgrade naar Pro", + "dashboard.translate.provider.upgradeSuffix": "om AI-vertaling te ontgrendelen", + "dashboard.translate.trust.zeroRetention": "Geen retentie", + "dashboard.translate.trust.deletedAfter": "Bestanden verwijderd na verwerking", + "dashboard.translate.actions.uploading": "Uploaden…", + "dashboard.translate.actions.translate": "Vertalen", + "dashboard.translate.actions.filePrefix": "Bestand: ", + "dashboard.translate.actions.cancel": "Annuleren", + "dashboard.translate.actions.tryAgain": "Opnieuw proberen", + "dashboard.translate.steps.uploading": "Bestand uploaden…", + "dashboard.translate.steps.starting": "Vertaling starten…", + "dashboard.translate.complete.title": "Vertaling voltooid!", + "dashboard.translate.complete.descNamed": "Uw bestand {name} is succesvol vertaald.", + "dashboard.translate.complete.descGeneric": "Uw bestand is succesvol vertaald.", + "dashboard.translate.complete.downloading": "Downloaden…", + "dashboard.translate.complete.download": "Downloaden", + "dashboard.translate.complete.newTranslation": "Nieuwe vertaling", + "dashboard.translate.complete.toastOkTitle": "Succes", + "dashboard.translate.complete.toastFailTitle": "Mislukt", + "dashboard.translate.complete.toastFailDesc": "Vertaling mislukt. Probeer het opnieuw.", + "dashboard.translate.sourceDocument": "Brondocument", + "dashboard.translate.configuration": "Configuratie", + "dashboard.translate.translating": "Vertaling bezig", + "dashboard.translate.liveMonitor": "Live monitor", + "dashboard.translate.summary": "Samenvatting", + "dashboard.translate.engine": "Engine", + "dashboard.translate.confidence": "Vertrouwen", + "dashboard.translate.cancel": "Annuleren", + "dashboard.translate.segments": "Segmenten", + "dashboard.translate.characters": "Tekens", + "dashboard.translate.elapsed": "Verstreken", + "dashboard.translate.segPerMin": "Seg/min", + "dashboard.translate.highQuality": "Hoge kwaliteit", + "dashboard.translate.quality": "Kwaliteit", + "dashboard.translate.completed": "Vertaling voltooid", + "dashboard.translate.replace": "Vervangen", + "dashboard.translate.pdfMode.title": "PDF-vertaalmodus", + "dashboard.translate.pdfMode.preserveLayout": "Indeling behouden", + "dashboard.translate.pdfMode.textOnly": "Alleen tekst", + "dashboard.translate.pdfMode.preserveLayoutDesc": "Behoudt afbeeldingen, tabellen en opmaak. Ideaal voor eenvoudige PDF's.", + "dashboard.translate.pdfMode.textOnlyDesc": "Vertaalt alle tekst perfect. Schone uitvoer, geen opmaakproblemen.", + "dashboard.translate.pipeline.upload": "Uploaden", + "dashboard.translate.pipeline.analyze": "Analyseren", + "dashboard.translate.pipeline.translate": "Vertaling", + "dashboard.translate.pipeline.rebuild": "Reconstrueren", + "dashboard.translate.pipeline.finalize": "Afronden", + "dashboard.translate.progress.failedTitle": "Vertaling mislukt", + "glossaries.dialog.title": "Nieuwe woordenlijst", + "glossaries.dialog.description": "Maak een woordenlijst voor uw vertalingen", + "glossaries.dialog.nameLabel": "Naam", + "glossaries.dialog.namePlaceholder": "Mijn woordenlijst", + "glossaries.dialog.tabTemplates": "Sjablonen", + "glossaries.dialog.tabFile": "Bestand", + "glossaries.dialog.tabManual": "Handmatig", + "glossaries.dialog.cancel": "Annuleren", + "glossaries.dialog.creating": "Aanmaken…", + "glossaries.dialog.importing": "Importeren…", + "glossaries.dialog.importBtn": "Importeren", + "glossaries.dialog.selectPrompt": "Selecteren", + "glossaries.dialog.createBtn": "Aanmaken", + "glossaries.dialog.createEmpty": "Leeg aanmaken", + "glossaries.dialog.terms": "termen", + "glossaries.dialog.templatesDesc": "Kies een vooraf gedefinieerd sjabloon", + "glossaries.dialog.templatesEmpty": "Geen sjablonen beschikbaar", + "glossaries.dialog.dropTitle": "Sleep een CSV-bestand hierheen", + "glossaries.dialog.dropOr": "of", + "glossaries.dialog.dropFormats": "CSV, TSV, TXT", + "glossaries.dialog.formatTitle": "Indeling", + "glossaries.dialog.formatDesc": "bron,doel (één per regel)", + "glossaries.dialog.formatNote": "Eerste regel overgeslagen als koptekst wordt gedetecteerd", + "glossaries.dialog.errorFormat": "Niet-ondersteunde indeling", + "glossaries.dialog.errorSize": "Bestand te groot", + "glossaries.dialog.errorEmpty": "Leeg bestand", + "glossaries.dialog.errorRead": "Leesfout", + "glossaries.dialog.parsing": "Verwerken…", + "glossaries.dialog.termsImported": "termen geïmporteerd", + "glossaries.dialog.changeFile": "Bestand wijzigen", + "glossaries.dialog.retry": "Opnieuw proberen", + "pricing.nav.back": "Terug", + "pricing.nav.home": "Home", + "pricing.nav.mySubscription": "Mijn abonnement", + "pricing.header.badge": "AI-modellen bijgewerkt — maart 2026", + "pricing.header.title": "Een abonnement voor elke behoefte", + "pricing.header.subtitle": "Vertaal uw Word-, Excel- en PowerPoint-documenten met behoud van de originele opmaak. Geen API-sleutel vereist.", + "pricing.billing.monthly": "Maandelijks", + "pricing.billing.yearly": "Jaarlijks", + "pricing.plans.free.name": "Gratis", + "pricing.plans.starter.name": "Starter", + "pricing.plans.pro.name": "Pro", + "pricing.plans.business.name": "Business", + "pricing.plans.enterprise.name": "Enterprise", + "pricing.plans.free.description": "Perfect om de app te ontdekken", + "pricing.plans.starter.description": "Voor particulieren en kleine projecten", + "pricing.plans.pro.description": "Voor professionals en groeiende teams", + "pricing.plans.business.description": "Voor teams en organisaties", + "pricing.plans.enterprise.description": "Maatwerkoplossingen voor grote organisaties", + "pricing.plans.pro.highlight": "Meest gekozen", + "pricing.plans.pro.badge": "POPULAIR", + "pricing.plans.enterprise.badge": "OP AANVRAAG", + "pricing.plans.free.feat1": "5 documenten / maand", + "pricing.plans.free.feat2": "Tot 15 pagina's per document", + "pricing.plans.free.feat3": "Google Vertalen inbegrepen", + "pricing.plans.free.feat4": "Alle talen (130+)", + "pricing.plans.free.feat5": "Communitysupport", + "pricing.plans.starter.feat1": "50 documenten / maand", + "pricing.plans.starter.feat2": "Tot 50 pagina's per document", + "pricing.plans.starter.feat3": "Google Vertalen + DeepL", + "pricing.plans.starter.feat4": "Bestanden tot 10 MB", + "pricing.plans.starter.feat5": "E-mailsupport", + "pricing.plans.starter.feat6": "30 dagen geschiedenis", + "pricing.plans.pro.feat1": "200 documenten / maand", + "pricing.plans.pro.feat2": "Tot 200 pagina's per document", + "pricing.plans.pro.feat3": "AI-basisvertaling (DeepSeek V3.2)", + "pricing.plans.pro.feat4": "Google Vertalen + DeepL", + "pricing.plans.pro.feat5": "Bestanden tot 25 MB", + "pricing.plans.pro.feat6": "Aangepaste woordenlijsten", + "pricing.plans.pro.feat7": "Prioriteitssupport", + "pricing.plans.pro.feat8": "90 dagen geschiedenis", + "pricing.plans.business.feat1": "1 000 documenten / maand", + "pricing.plans.business.feat2": "Tot 500 pagina's per document", + "pricing.plans.business.feat3": "Basis- + Premium-AI (Claude Haiku)", + "pricing.plans.business.feat4": "Alle vertaalproviders", + "pricing.plans.business.feat5": "Bestanden tot 50 MB", + "pricing.plans.business.feat6": "API-toegang (10 000 aanroepen/maand)", + "pricing.plans.business.feat7": "Meldingswebhooks", + "pricing.plans.business.feat8": "Dedicated support", + "pricing.plans.business.feat9": "1 jaar geschiedenis", + "pricing.plans.business.feat10": "Geavanceerde analyses", + "pricing.plans.enterprise.feat1": "Onbeperkte documenten", + "pricing.plans.enterprise.feat2": "Alle AI-modellen (GPT-5, Claude Opus 4.6…)", + "pricing.plans.enterprise.feat3": "On-premise of dedicated cloud", + "pricing.plans.enterprise.feat4": "99,9 % SLA gegarandeerd", + "pricing.plans.enterprise.feat5": "24/7 dedicated support", + "pricing.plans.enterprise.feat6": "White-label", + "pricing.plans.enterprise.feat7": "Onbeperkte teams", + "pricing.plans.enterprise.feat8": "Maatwerkintegraties", + "pricing.card.onRequest": "Op aanvraag", + "pricing.card.free": "Gratis", + "pricing.card.perMonth": "/maand", + "pricing.card.billedYearly": "Gefactureerd {price} € / jaar", + "pricing.card.documents": "Documenten", + "pricing.card.pagesMax": "Max. pagina's", + "pricing.card.aiTranslation": "AI-vertaling", + "pricing.card.unlimited": "Onbeperkt", + "pricing.card.perMonthStat": "/ maand", + "pricing.card.perDoc": "p / doc", + "pricing.card.aiEssential": "Basis", + "pricing.card.aiEssentialPremium": "Basis + Premium", + "pricing.card.aiCustom": "Maatwerk", + "pricing.card.myPlan": "Mijn abonnement", + "pricing.card.managePlan": "Abonnement beheren", + "pricing.card.startFree": "Gratis starten", + "pricing.card.contactUs": "Neem contact op", + "pricing.card.choosePlan": "Dit abonnement kiezen", + "pricing.card.processing": "Verwerken…", + "pricing.comparison.title": "Gedetailleerde vergelijking", + "pricing.comparison.subtitle": "Alles wat in elk abonnement is inbegrepen", + "pricing.comparison.feature": "Functie", + "pricing.comparison.docsPerMonth": "Documenten / maand", + "pricing.comparison.pagesMaxPerDoc": "Max. pagina's / document", + "pricing.comparison.maxFileSize": "Max. bestandsgrootte", + "pricing.comparison.googleTranslation": "Google Vertalen", + "pricing.comparison.deepl": "DeepL", + "pricing.comparison.aiEssential": "AI-basisvertaling", + "pricing.comparison.aiPremium": "AI-premiumvertaling", + "pricing.comparison.apiAccess": "API-toegang", + "pricing.comparison.priorityProcessing": "Prioriteitsverwerking", + "pricing.comparison.support": "Support", + "pricing.comparison.support.community": "Community", + "pricing.comparison.support.email": "E-mail", + "pricing.comparison.support.priority": "Prioriteit", + "pricing.comparison.support.dedicated": "Dedicated", + "pricing.comparison.mb": "MB", + "pricing.credits.title": "Extra tegoeden", + "pricing.credits.subtitle": "Meer nodig? Koop tegoeden per stuk, zonder abonnement.", + "pricing.credits.perPage": "1 tegoed = 1 vertaalde pagina.", + "pricing.credits.bestValue": "Beste waarde", + "pricing.credits.unit": "tegoeden", + "pricing.credits.centsPerCredit": "ct / tegoed", + "pricing.credits.buy": "Kopen", + "pricing.trust.encryption.title": "End-to-end-versleuteling", + "pricing.trust.encryption.sub": "TLS 1.3 + AES-256 at-rest", + "pricing.trust.languages.title": "130+ talen", + "pricing.trust.languages.sub": "Inclusief Arabisch, Perzisch, Hebreeuws (RTL)", + "pricing.trust.parallel.title": "Parallelle verwerking", + "pricing.trust.parallel.sub": "Ultrasnelle multi-threaded AI", + "pricing.trust.availability.title": "24/7 beschikbaar", + "pricing.trust.availability.sub": "99,9 % gegarandeerde beschikbaarheid", + "pricing.aiModels.title": "Onze AI-modellen — maart 2026", + "pricing.aiModels.essential.title": "AI-basisvertaling", + "pricing.aiModels.essential.plan": "Pro-abonnement", + "pricing.aiModels.essential.descPrefix": "Gebaseerd op", + "pricing.aiModels.essential.descSuffix": "— het meest kostenefficiënte AI-model van 2026. Kwaliteit vergelijkbaar met frontier-modellen voor 1/50 van de kosten.", + "pricing.aiModels.essential.context": "163K tokens context", + "pricing.aiModels.essential.value": "Uitstekende prijs-kwaliteitverhouding", + "pricing.aiModels.premium.title": "AI-premiumvertaling", + "pricing.aiModels.premium.plan": "Business-abonnement", + "pricing.aiModels.premium.descPrefix": "Gebaseerd op", + "pricing.aiModels.premium.descSuffix": "van Anthropic — nauwkeurig bij juridische, medische en complexe technische documenten.", + "pricing.aiModels.premium.context": "200K tokens context", + "pricing.aiModels.premium.precision": "Beste nauwkeurigheid", + "pricing.faq.title": "Veelgestelde vragen", + "pricing.faq.q1": "Kan ik op elk moment van abonnement wisselen?", + "pricing.faq.a1": "Ja. Upgraden gebeurt direct en naar rato. Downgraden gaat in aan het einde van de lopende periode.", + "pricing.faq.q2": "Wat is «AI-basisvertaling»?", + "pricing.faq.a2": "Het is onze AI-engine op basis van DeepSeek V3.2 via OpenRouter. Hij begrijpt de context van uw documenten, behoudt de opmaak en verwerkt vaktermen veel beter dan klassieke vertaling.", + "pricing.faq.q3": "Wat is het verschil tussen Basis- en Premium-AI?", + "pricing.faq.a3": "Basis-AI gebruikt DeepSeek V3.2 (uitstekende prijs-kwaliteit). Premium-AI gebruikt Claude 3.5 Haiku van Anthropic, nauwkeuriger bij juridische, medische en complexe technische documenten.", + "pricing.faq.q4": "Worden mijn documenten bewaard na vertaling?", + "pricing.faq.a4": "Vertaalde bestanden zijn beschikbaar volgens uw abonnement (30 dagen Starter, 90 dagen Pro, 1 jaar Business). Ze zijn versleuteld at-rest en in transit.", + "pricing.faq.q5": "Wat gebeurt er als ik mijn maandelijkse quotum overschrijd?", + "pricing.faq.a5": "U kunt extra tegoeden per stuk kopen of uw abonnement upgraden. U wordt op de hoogte gesteld bij 80 % gebruik.", + "pricing.faq.q6": "Is er een gratis proefperiode voor betaalde abonnementen?", + "pricing.faq.a6": "Het Gratis abonnement is permanent en vereist geen creditcard. Voor Pro en Business kunt u ons contacteren voor een proefperiode van 14 dagen.", + "pricing.faq.q7": "Welke bestandsformaten worden ondersteund?", + "pricing.faq.a7": "Word (.docx), Excel (.xlsx/.xls), PowerPoint (.pptx) en binnenkort PDF. Alle abonnementen ondersteunen dezelfde formaten.", + "pricing.cta.title": "Klaar om te beginnen?", + "pricing.cta.subtitle": "Start gratis, zonder creditcard. Upgrade wanneer u wilt.", + "pricing.cta.createAccount": "Gratis account aanmaken", + "pricing.cta.login": "Inloggen", + "pricing.toast.demo": "Demomodus — Stripe is nog niet geconfigureerd. In productie zou u worden doorgestuurd naar betaling om het {planId}-abonnement te activeren.", + "pricing.toast.networkError": "Netwerkfout. Probeer het opnieuw.", + "pricing.toast.paymentError": "Fout bij aanmaken van de betaling.", + "register.title": "Account aanmaken", + "register.subtitle": "Begin gratis met vertalen", + "register.error.failed": "Registratie mislukt", + "register.name.label": "Naam", + "register.name.placeholder": "Uw naam", + "register.name.error": "De naam moet minimaal 2 tekens bevatten", + "register.email.label": "E-mailadres", + "register.email.placeholder": "u@voorbeeld.nl", + "register.email.error": "Ongeldig e-mailadres", + "register.password.label": "Wachtwoord", + "register.password.error": "Het wachtwoord moet minimaal 8 tekens bevatten, met een hoofdletter, een kleine letter en een cijfer", + "register.password.show": "Wachtwoord tonen", + "register.password.hide": "Wachtwoord verbergen", + "register.password.strengthLabel": "Sterkte:", + "register.password.strength.weak": "Zwak", + "register.password.strength.medium": "Gemiddeld", + "register.password.strength.strong": "Sterk", + "register.confirmPassword.label": "Wachtwoord bevestigen", + "register.confirmPassword.error": "Wachtwoorden komen niet overeen", + "register.confirmPassword.show": "Tonen", + "register.confirmPassword.hide": "Verbergen", + "register.submit.creating": "Account wordt aangemaakt...", + "register.submit.create": "Mijn account aanmaken", + "register.hasAccount": "Al een account?", + "register.login": "Inloggen", + "register.terms.prefix": "Door een account aan te maken, accepteert u onze", + "register.terms.link": "gebruiksvoorwaarden", + + // ── Landing page ── + "landing.nav.whyUs": "Waarom wij", + "landing.nav.formats": "Formaten", + "landing.nav.pricing": "Prijzen", + "landing.nav.login": "Inloggen", + "landing.nav.startFree": "Gratis starten", + "landing.hero.badge": "Nieuw: PDF-ondersteuning + AI-gestuurde vertaling", + "landing.hero.title1": "Vertaal uw documenten.", + "landing.hero.title2": "Behoud de perfecte opmaak.", + "landing.hero.subtitle": "De enige vertaler die SmartArt, grafieken, inhoudsopgaven, vormen, kop- en voetteksten bewaart — precies zoals ze waren. Geen verrassingen bij het afrekenen.", + "landing.hero.cta": "Gratis starten — 2 docs/maand", + "landing.hero.seePlans": "Plannen bekijken", + "landing.trust.filesDeleted": "Bestanden verwijderd na 60 min", + "landing.trust.noBait": "Geen misleidende prijzen", + "landing.trust.preview": "Voorbeeld voordat u betaalt", + "landing.why.title": "Uw opmaak, perfect bewaard", + "landing.why.subtitle": "Andere vertalers breken uw lay-out. Wij niet.", + "landing.why.smartart.title": "SmartArt en diagrammen", + "landing.why.smartart.desc": "Organigrammen, stroomdiagrammen, hiërarchieën — alles op zijn plaats vertaald.", + "landing.why.toc.title": "Inhoudsopgaven", + "landing.why.toc.desc": "Inhoudsopgave-items, paginanummers en kruisverwijzingen worden correct bijgewerkt.", + "landing.why.charts.title": "Grafieken", + "landing.why.charts.desc": "Titels, aslabels, legenda's en serienamen — alles wordt vertaald.", + "landing.why.shapes.title": "Vormen en tekstvakken", + "landing.why.shapes.desc": "Rechthoeken, afgeronde vakken, callouts — we vinden en vertalen tekst in alle vormen.", + "landing.why.headers.title": "Kop- en voetteksten", + "landing.why.headers.desc": "Kopteksten, voetteksten en voetnoten worden nooit overgeslagen.", + "landing.why.languages.title": "130+ talen", + "landing.why.languages.desc": "Google Translate, DeepL en AI-engines voor professionele kwaliteit.", + "landing.pricing.title": "Eenvoudige, eerlijke prijzen", + "landing.pricing.subtitle": "Wat u ziet is wat u betaalt. Geen verborgen kosten na vertaling.", + "landing.pricing.monthly": "Maandelijks", + "landing.pricing.yearly": "Jaarlijks", + "landing.pricing.starter.title": "Starter", + "landing.pricing.starter.desc": "Voor particulieren en kleine projecten", + "landing.pricing.starter.f1": "50 documenten / maand", + "landing.pricing.starter.f2": "Tot 50 pagina's per document", + "landing.pricing.starter.f3": "Google Translate + DeepL", + "landing.pricing.starter.f4": "Bestanden tot 10 MB", + "landing.pricing.starter.cta": "Aan de slag", + "landing.pricing.pro.title": "Pro", + "landing.pricing.pro.badge": "Meest populair", + "landing.pricing.pro.desc": "Voor professionals die kwaliteit nodig hebben", + "landing.pricing.pro.f1": "200 documenten / maand", + "landing.pricing.pro.f2": "Tot 200 pagina's per document", + "landing.pricing.pro.f3": "AI-gestuurde vertaling (DeepSeek)", + "landing.pricing.pro.f4": "Google + DeepL inbegrepen", + "landing.pricing.pro.f5": "Aangepaste woordenlijsten en prompts", + "landing.pricing.pro.f6": "Prioriteitsondersteuning", + "landing.pricing.pro.cta": "Pro uitproberen", + "landing.pricing.business.title": "Business", + "landing.pricing.business.desc": "Voor teams met een hoog volume", + "landing.pricing.business.f1": "1 000 documenten / maand", + "landing.pricing.business.f2": "Tot 500 pagina's per document", + "landing.pricing.business.f3": "Premium-AI (Claude)", + "landing.pricing.business.f4": "Alle providers + API-toegang", + "landing.pricing.business.f5": "Webhooks en automatisering", + "landing.pricing.business.f6": "5 teamplaatsen", + "landing.pricing.business.cta": "Neem contact op", + "landing.pricing.honest": "De getoonde prijs is de prijs die u betaalt. Geen verborgen kosten na vertaling.", + "landing.pricing.billedYearly": "jaarlijks gefactureerd", + "landing.pricing.perMonth": "/mnd", + "landing.formats.title": "Elk formaat, elk element", + "landing.formats.subtitle": "We vertalen wat anderen missen.", + "landing.formats.word": "Word (.docx)", + "landing.formats.word.f1": "Alinea's en koppen", + "landing.formats.word.f2": "Tabellen en grafieken", + "landing.formats.word.f3": "SmartArt-diagrammen", + "landing.formats.word.f4": "Inhoudsopgave", + "landing.formats.word.f5": "Kop- en voetteksten", + "landing.formats.word.f6": "Vormen en tekstvakken", + "landing.formats.word.f7": "Voet- en eindnoten", + "landing.formats.excel": "Excel (.xlsx)", + "landing.formats.excel.f1": "Celwaarden", + "landing.formats.excel.f2": "Werkbladnamen", + "landing.formats.excel.f3": "Grafieken en labels", + "landing.formats.excel.f4": "Kop- en voetteksten", + "landing.formats.excel.f5": "Samengevoegde cellen behouden", + "landing.formats.powerpoint": "PowerPoint (.pptx)", + "landing.formats.powerpoint.f1": "Diatekst en notities", + "landing.formats.powerpoint.f2": "Grafieken en diagrammen", + "landing.formats.powerpoint.f3": "Vormen en tekstvakken", + "landing.formats.powerpoint.f4": "Diamodellen", + "landing.formats.powerpoint.f5": "Animaties behouden", + "landing.formats.pdf": "PDF", + "landing.formats.pdf.f1": "Op tekst gebaseerde PDF's", + "landing.formats.pdf.f2": "Lay-out behouden", + "landing.formats.pdf.f3": "Afbeeldingen op hun plaats", + "landing.formats.pdf.f4": "Tabellen behouden", + "landing.formats.pdf.f5": "Uitvoer als DOCX of PDF", + "landing.cta.title": "Begin met vertalen in 30 seconden", + "landing.cta.subtitle": "Geen creditcard nodig. Probeer 2 documenten gratis en zie het verschil.", + "landing.cta.button": "Gratis account aanmaken", + "landing.footer.privacy": "Privacy", + "landing.footer.terms": "Voorwaarden", + "landing.footer.contact": "Contact", + "landing.ai.badge": "AI-Powered Translation Engine", + "landing.ai.title": "Translation that understands your craft", + "landing.ai.subtitle": "Our AI models analyze context, respect your terminology, and even translate text inside images.", + "landing.ai.context.title": "Industry Context", + "landing.ai.context.desc": "Describe your field and get tailored translations, not generic ones.", + "landing.ai.glossary.title": "Industry Glossaries", + "landing.ai.glossary.desc": "Define your technical terms for precise, domain-specific translations.", + "landing.ai.vision.title": "Image Vision", + "landing.ai.vision.desc": "Text embedded in images, diagrams and charts is detected and translated.", + "landing.ai.comparison.source": "Source (FR)", + "landing.ai.comparison.google": "Google Translate", + "landing.ai.comparison.ai": "Our AI", + "landing.howItWorks.title": "How it works", + "landing.howItWorks.subtitle": "Three steps. Zero formatting loss.", + "landing.howItWorks.step1.title": "Upload your file", + "landing.howItWorks.step1.desc": "Drag and drop your Excel, Word, PowerPoint or PDF document.", + "landing.howItWorks.step2.title": "Pick language and engine", + "landing.howItWorks.step2.desc": "Select target language and engine - standard or context-aware AI.", + "landing.howItWorks.step3.title": "Download the result", + "landing.howItWorks.step3.desc": "Get your translated document with formatting identical to the original.", + "login.errorTitle": "Login Error", + "login.welcomeBack": "Welcome back", + "login.signInToContinue": "Sign in to continue translating", + "login.email": "Email", + "login.emailPlaceholder": "you@example.com", + "login.password": "Password", + "login.forgotPassword": "Forgot password?", + "login.passwordPlaceholder": "••••••••", + "login.signingIn": "Signing in...", + "login.signIn": "Sign In", + "login.noAccount": "Don't have an account?", + "login.signUpFree": "Sign up for free", + "forgotPassword.enterEmail": "Please enter your email address", + "forgotPassword.error": "An error occurred", + "forgotPassword.title": "Forgot Password", + "forgotPassword.checkEmail": "Check your inbox", + "forgotPassword.subtitle": "Enter your email to receive a reset link", + "forgotPassword.sentMessage": "If an account exists with this address, a reset email has been sent.", + "forgotPassword.emailLabel": "Email address", + "forgotPassword.emailPlaceholder": "you@example.com", + "forgotPassword.sending": "Sending...", + "forgotPassword.sendLink": "Send reset link", + "forgotPassword.backToLogin": "Back to login", + "forgotPassword.loading": "Loading...", + "resetPassword.passwordRequirements": "Password must contain at least 8 characters, one uppercase, one lowercase, and one number", + "resetPassword.passwordMismatch": "Passwords do not match", + "resetPassword.tokenMissing": "Missing token. Please use the link received by email.", + "resetPassword.error": "An error occurred", + "resetPassword.invalidLink": "Invalid link", + "resetPassword.invalidLinkMessage": "This reset link is invalid. Please request a new one.", + "resetPassword.requestNewLink": "Request new link", + "resetPassword.successTitle": "Password reset", + "resetPassword.newPasswordTitle": "New password", + "resetPassword.successSubtitle": "You will be redirected to login", + "resetPassword.subtitle": "Set your new password", + "resetPassword.successMessage": "Your password has been successfully reset. You will be redirected to the login page.", + "resetPassword.newPassword": "New password", + "resetPassword.showPassword": "Show password", + "resetPassword.hidePassword": "Hide password", + "resetPassword.confirmPassword": "Confirm password", + "resetPassword.resetting": "Resetting...", + "resetPassword.resetPassword": "Reset password", + "resetPassword.backToLogin": "Back to login", + "resetPassword.loading": "Loading...", + "common.loading": "Laden...", + "profile.header.title": "Mijn profiel", + "profile.header.subtitle": "Beheer je account en voorkeuren.", + "profile.tabs.account": "Account", + "profile.tabs.subscription": "Abonnement", + "profile.tabs.preferences": "Voorkeuren", + "profile.account.user": "Gebruiker", + "profile.account.memberSince": "Lid sinds", + "profile.plan.label": "Abonnement", + "profile.plan.free": "Free", + "profile.plan.starter": "Starter", + "profile.plan.pro": "Pro", + "profile.plan.business": "Business", + "profile.plan.enterprise": "Enterprise", + "profile.plan.pricePerMonth": "{price} €/maand", + "profile.subscription.canceling": "Wordt geannuleerd", + "profile.subscription.active": "Actief", + "profile.subscription.unknown": "Onbekend", + "profile.subscription.accessUntil": "Toegang tot", + "profile.subscription.renewalOn": "Verlenging op", + "profile.subscription.upgradePlan": "Upgrade naar een betaald abonnement", + "profile.subscription.changePlan": "Abonnement wijzigen", + "profile.subscription.manageBilling": "Facturatie beheren", + "profile.subscription.billingUnavailable": "Facturatieportaal niet beschikbaar.", + "profile.subscription.billingError": "Fout bij toegang tot facturatieportaal.", + "profile.subscription.cancelSuccess": "Abonnement geannuleerd. Je behoudt toegang tot het einde van de periode.", + "profile.subscription.cancelError": "Fout bij annulering.", + "profile.subscription.networkError": "Netwerkfout.", + "profile.usage.title": "Gebruik deze maand", + "profile.usage.resetOn": "Reset op", + "profile.usage.documents": "Documenten", + "profile.usage.pages": "Pagina's", + "profile.usage.extraCredits": "extra tegoed", + "profile.usage.extraCreditsPlural": "extra tegoeden", + "profile.usage.quotaReached": "Quota bereikt", + "profile.usage.quotaReachedDesc": "Upgrade naar een hoger abonnement om door te gaan.", + "profile.usage.unlockMore": "Ontgrendel meer vertalingen met een betaald abonnement.", + "profile.usage.viewPlans": "Abonnementen bekijken", + "profile.usage.includedInPlan": "Inbegrepen in je abonnement", + "profile.danger.title": "Gevaarzone", + "profile.danger.description": "Annulering wordt van kracht aan het einde van je huidige periode. Je behoudt toegang tot die datum.", + "profile.danger.confirm": "Weet je het zeker? Deze actie kan niet ongedaan worden gemaakt.", + "profile.danger.confirmCancel": "Annulering bevestigen", + "profile.danger.cancelSubscription": "Mijn abonnement annuleren", + "profile.danger.keep": "Nee, behouden", + "profile.prefs.interfaceLang": "Interfacetaal", + "profile.prefs.interfaceLangDesc": "De taal wordt automatisch gedetecteerd op basis van je browser. Je kunt deze handmatig wijzigen.", + "profile.prefs.defaultTargetLang": "Standaarddoeltaal", + "profile.prefs.selectLanguage": "Selecteer een taal", + "profile.prefs.defaultTargetLangDesc": "Deze taal wordt vooraf geselecteerd voor je vertalingen.", + "profile.prefs.save": "Opslaan", + "profile.prefs.theme": "Thema", + "profile.prefs.themeDesc": "Kies het uiterlijk van de interface", + "profile.prefs.cache": "Cache", + "profile.prefs.cacheDesc": "Het wissen van de lokale cache kan sommige weergaveproblemen oplossen.", + "profile.prefs.clearing": "Wissen...", + "profile.prefs.clearCache": "Cache wissen", + "settings.title": "Instellingen", + "settings.subtitle": "Algemene toepassingsconfiguratie", + "settings.formats.title": "Ondersteunde formaten", + "settings.formats.subtitle": "Documenttypen die je kunt vertalen", + "settings.formats.formulas": "Formules", + "settings.formats.styles": "Stijlen", + "settings.formats.images": "Afbeeldingen", + "settings.formats.headers": "Koppen", + "settings.formats.tables": "Tabellen", + "settings.formats.slides": "Dia's", + "settings.formats.notes": "Notities", + "settings.cache.title": "Cache", + "settings.cache.desc": "Het wissen van de lokale cache kan sommige weergaveproblemen oplossen.", + "settings.cache.clearing": "Wissen...", + "settings.cache.clear": "Cache wissen", + "services.title": "Vertaalaanbieders", + "services.subtitle": "Aanbieders worden geconfigureerd door de beheerder. Je kunt zien welke momenteel beschikbaar zijn voor je account.", + "services.loading": "Aanbieders laden...", + "services.noProviders": "Er zijn momenteel geen aanbieders geconfigureerd. Neem contact op met je beheerder.", + "services.classic": "Klassieke vertaling", + "services.llmPro": "LLM · Contextbewust (Pro)", + "services.available": "Beschikbaar", + "services.model": "Model", + "services.adminOnly.title": "Aanbiederconfiguratie is alleen voor beheerders", + "services.adminOnly.desc": "API-sleutels, modelselectie en aanbiederactivering worden uitsluitend beheerd door de beheerder in het adminpaneel. Je hoeft nooit een API-sleutel in te voeren.", + "apiKeys.title": "API-sleutels", + "apiKeys.subtitle": "Beheer je API-sleutels voor programmatische toegang tot de vertaal-API.", + "apiKeys.loading": "Laden...", + "apiKeys.sectionTitle": "API en automatisering", + "apiKeys.sectionDesc": "Genereer en beheer je API-sleutels voor automatiseringsworkflows", + "apiKeys.keysUsed": "{total} van {max} sleutels gebruikt", + "apiKeys.maxReached": "Maximum aantal sleutels bereikt. Trek een sleutel in om een nieuwe te genereren.", + "apiKeys.canGenerate": "Je kunt nog {count} sleutel genereren", + "apiKeys.canGeneratePlural": "Je kunt nog {count} sleutels genereren", + "apiKeys.generateNew": "Nieuwe sleutel genereren", + "apiKeys.keyRevoked": "Sleutel ingetrokken", + "apiKeys.keyRevokedDesc": "De API-sleutel is succesvol ingetrokken.", + "apiKeys.keyNotFound": "Sleutel niet gevonden", + "apiKeys.keyNotFoundDesc": "De API-sleutel bestaat niet meer. Deze is mogelijk al ingetrokken.", + "apiKeys.error": "Fout", + "apiKeys.revokeError": "Kon de API-sleutel niet intrekken. Probeer opnieuw.", + "apiKeys.limitReached": "Limiet bereikt", + "apiKeys.limitReachedDesc": "Je hebt het maximum van 10 API-sleutels bereikt. Trek een bestaande sleutel in om een nieuwe te genereren.", + "apiKeys.proRequired": "Pro-functie vereist", + "apiKeys.proRequiredDesc": "API-sleutels zijn een Pro-functie. Upgrade je account.", + "apiKeys.generateError": "Kon API-sleutel niet genereren. Probeer opnieuw.", + "apiKeys.upgrade.title": "API-sleutels", + "apiKeys.upgrade.subtitle": "Automatiseer je vertalingen met API-toegang", + "apiKeys.upgrade.feat1": "Genereer onbeperkt API-sleutels", + "apiKeys.upgrade.feat2": "Automatiseer documentvertaling", + "apiKeys.upgrade.feat3": "Webhook-meldingen", + "apiKeys.upgrade.feat4": "LLM-vertaalmodi", + "apiKeys.upgrade.proFeature": "API-sleutels zijn een {pro}-functie. Upgrade om API-automatisering te ontgrendelen.", + "apiKeys.upgrade.pro": "Pro", + "apiKeys.upgrade.cta": "Upgrade naar Pro", + "apiKeys.dialog.maxTitle": "Maximum aantal sleutels bereikt", + "apiKeys.dialog.maxDesc": "Je hebt het maximum van 10 API-sleutels bereikt. Trek een bestaande sleutel in voordat je een nieuwe genereert.", + "apiKeys.dialog.close": "Sluiten", + "apiKeys.dialog.generated": "API-sleutel gegenereerd!", + "apiKeys.dialog.generatedDesc": "Je nieuwe API-sleutel is aangemaakt. Kopieer hem nu - hij wordt niet meer getoond.", + "apiKeys.dialog.important": "Belangrijk:", + "apiKeys.dialog.importantDesc": "Dit is de enige keer dat je deze sleutel ziet. Bewaar hem veilig.", + "apiKeys.dialog.apiKey": "API-sleutel", + "apiKeys.dialog.name": "Naam:", + "apiKeys.dialog.done": "Klaar", + "apiKeys.dialog.copied": "Ik heb de sleutel gekopieerd", + "apiKeys.dialog.generateTitle": "Nieuwe API-sleutel genereren", + "apiKeys.dialog.generateDesc": "Maak een nieuwe API-sleutel aan voor programmatische toegang tot de vertaal-API.", + "apiKeys.dialog.keyName": "Sleutelnaam (optioneel)", + "apiKeys.dialog.keyNamePlaceholder": "bijv. Productie, Staging", + "apiKeys.dialog.keyNameHint": "Een beschrijvende naam om deze sleutel later te herkennen.", + "apiKeys.dialog.nameTooLong": "Naam mag maximaal {max} tekens bevatten", + "apiKeys.dialog.nameInvalid": "Naam mag alleen letters, cijfers, spaties, koppeltekens en underscores bevatten", + "apiKeys.dialog.cancel": "Annuleren", + "apiKeys.dialog.generating": "Genereren...", + "apiKeys.dialog.generate": "Sleutel genereren", + "apiKeys.table.name": "Naam", + "apiKeys.table.prefix": "Voorvoegsel", + "apiKeys.table.created": "Aangemaakt", + "apiKeys.table.lastUsed": "Laatst gebruikt", + "apiKeys.table.never": "Nooit", + "apiKeys.table.actions": "Acties", + "apiKeys.table.revoke": "Intrekken", + "apiKeys.table.copyPrefix": "Sleutelvoorvoegsel kopiëren", + "apiKeys.table.revokeKey": "Sleutel intrekken", + "apiKeys.revokeDialog.title": "API-sleutel intrekken", + "apiKeys.revokeDialog.desc": "Weet je zeker dat je de sleutel \"{name}\" wilt intrekken? Deze actie kan niet ongedaan worden gemaakt.", + "apiKeys.revokeDialog.confirm": "Ja, intrekken", + "apiKeys.revokeDialog.cancel": "Annuleren", + "context.proTitle": "Pro-functie", + "context.proDesc": "Context en professionele woordenlijsten zijn beschikbaar met Pro-, Business- en Enterprise-abonnementen. Ze bieden nauwkeurigere vertalingen via instructies en vocabulair specifiek voor jouw domein.", + "context.viewPlans": "Abonnementen bekijken", + "context.title": "Context en woordenlijst", + "context.subtitle": "Verbeter de vertaalkwaliteit met instructies en vocabulair specifiek voor jouw domein.", + "context.presets.title": "Professionele woordenlijsten", + "context.presets.desc": "Laad een volledige woordenlijst met instructies en gespecialiseerde terminologie", + "context.instructions.title": "Contextinstructies", + "context.instructions.desc": "Instructies die de AI volgt tijdens het vertalen", + "context.instructions.placeholder": "Bijv.: Je vertaalt HVAC-technische documenten. Gebruik nauwkeurige technische terminologie...", + "context.glossary.title": "Technische woordenlijst", + "context.glossary.desc": "Formaat: bron=doel (één per regel). Woordenlijsten geladen via preset zijn bewerkbaar.", + "context.glossary.terms": "termen in de woordenlijst", + "context.clearAll": "Alles wissen", + "context.saving": "Opslaan...", + "context.save": "Opslaan", + "admin.login.title": "Beheer", + "admin.login.required": "Inloggen vereist", + "admin.login.password": "Admin-wachtwoord", + "admin.login.connecting": "Verbinden...", + "admin.login.access": "Toegang tot admin-paneel", + "admin.login.restricted": "Alleen voor beheerders", + "admin.layout.checking": "Authenticatie verifiëren...", + "admin.dashboard.title": "Admin Dashboard", + "admin.dashboard.subtitle": "Beheerder controlepaneel", + "admin.dashboard.refresh": "Vernieuwen", + "admin.dashboard.refreshTooltip": "Dashboard-gegevens vernieuwen", + "admin.dashboard.config": "Systeemconfiguratie", + "admin.dashboard.maxFileSize": "Max bestandsgrootte:", + "admin.dashboard.translationService": "Vertaalservice:", + "admin.dashboard.formats": "Formaten:", + "admin.nav.dashboard": "Dashboard", + "admin.nav.users": "Gebruikers", + "admin.nav.pricing": "Prijzen & Stripe", + "admin.nav.providers": "Providers", + "admin.nav.system": "Systeem", + "admin.nav.logs": "Logboeken", + "admin.users.title": "Gebruikersbeheer", + "admin.users.subtitle": "Gebruikersaccounts bekijken en beheren", + "admin.users.planUpdated": "Abonnement bijgewerkt", + "admin.users.planChanged": "Het abonnement is succesvol gewijzigd naar \"{plan}\".", + "admin.users.unknownError": "Onbekende fout", + "admin.users.error": "Fout", + "admin.users.planUpdateError": "Kan abonnement niet bijwerken: {message}", + "admin.users.noKeys": "Geen sleutels", + "admin.users.noKeysDesc": "Deze gebruiker heeft geen actieve API-sleutels.", + "admin.users.keysRevoked": "Sleutels ingetrokken", + "admin.users.keysRevokedDesc": "{count} API-sleutel(s) succesvol ingetrokken.", + "admin.users.revokeError": "Kan sleutels niet intrekken: {message}", + "admin.users.retry": "Opnieuw proberen", + "admin.system.title": "Systeem", + "admin.system.subtitle": "Systeemstatus bewaken en bronnen beheren", + "admin.system.quotas": "Vertaalquota's", + "admin.system.resetQuotas": "Maandelijkse quota's resetten", + "admin.system.resetting": "Resetten...", + "admin.system.reset": "Resetten", + "admin.system.allOperational": "Alle systemen operationeel", + "admin.system.issuesDetected": "Systeemproblemen gedetecteerd", + "admin.system.waitingData": "Wachten op gegevens...", + "admin.system.purging": "Wissen...", + "admin.system.clean": "Opschonen", + "admin.system.purge": "Wissen", + }, + // ═══════════════════════════════════════════════════════════════ + // RUSSIAN (ru) + // ═══════════════════════════════════════════════════════════════ + ru: { + "auth.brandName": "Office Translator", + "dashboard.nav.translate": "Перевести", + "dashboard.nav.profile": "Мой профиль", + "dashboard.nav.settings": "Настройки", + "dashboard.nav.context": "Контекст", + "dashboard.nav.services": "Сервисы", + "dashboard.nav.apiKeys": "API-ключи", + "dashboard.nav.glossaries": "Глоссарии", + "dashboard.header.title": "Панель управления", + "dashboard.header.subtitle": "Управляйте своими переводами", + "dashboard.header.toggleMenu": "Меню", + "dashboard.header.profileTitle": "Мой профиль", + "dashboard.sidebar.theme": "Тема", + "dashboard.sidebar.signOut": "Выйти", + "dashboard.sidebar.backHome": "Вернуться на главную", + "dashboard.translate.pageTitle": "Перевести документ", + "dashboard.translate.pageSubtitle": "Импортируйте файл и выберите целевой язык", + "dashboard.translate.errorNotificationTitle": "Ошибка", + "dashboard.translate.dropzone.uploadAria": "Зона перетаскивания файлов", + "dashboard.translate.dropzone.title": "Перетащите файл сюда", + "dashboard.translate.dropzone.subtitle": "или нажмите, чтобы выбрать (DOCX, XLSX, PPTX, PDF)", + "dashboard.translate.dropzone.replaceFile": "Заменить файл", + "dashboard.translate.language.source": "Исходный язык", + "dashboard.translate.language.target": "Целевой язык", + "dashboard.translate.language.loading": "Загрузка языков…", + "dashboard.translate.language.autoDetect": "Автоопределение", + "dashboard.translate.language.selectPlaceholder": "Выбрать…", + "dashboard.translate.language.loadErrorPrefix": "Ошибка загрузки языков", + "dashboard.translate.provider.loading": "Загрузка провайдеров…", + "dashboard.translate.provider.noneConfigured": "Провайдеры не настроены", + "dashboard.translate.provider.modelTitle": "Модель", + "dashboard.translate.provider.sectionTitle": "Провайдер", + "dashboard.translate.provider.llmDivider": "ИИ · Контекстный", + "dashboard.translate.provider.llmDividerPro": "ИИ · Контекстный (Pro)", + "dashboard.translate.provider.upgrade": "Обновить до Pro", + "dashboard.translate.provider.upgradeSuffix": "чтобы разблокировать ИИ-перевод", + "dashboard.translate.trust.zeroRetention": "Без хранения", + "dashboard.translate.trust.deletedAfter": "Файлы удаляются после обработки", + "dashboard.translate.actions.uploading": "Загрузка…", + "dashboard.translate.actions.translate": "Перевести", + "dashboard.translate.actions.filePrefix": "Файл: ", + "dashboard.translate.actions.cancel": "Отмена", + "dashboard.translate.actions.tryAgain": "Повторить", + "dashboard.translate.steps.uploading": "Загрузка файла…", + "dashboard.translate.steps.starting": "Запуск перевода…", + "dashboard.translate.complete.title": "Перевод завершён!", + "dashboard.translate.complete.descNamed": "Ваш файл {name} успешно переведён.", + "dashboard.translate.complete.descGeneric": "Ваш файл успешно переведён.", + "dashboard.translate.complete.downloading": "Скачивание…", + "dashboard.translate.complete.download": "Скачать", + "dashboard.translate.complete.newTranslation": "Новый перевод", + "dashboard.translate.complete.toastOkTitle": "Успешно", + "dashboard.translate.complete.toastFailTitle": "Ошибка", + "dashboard.translate.complete.toastFailDesc": "Перевод не удался. Пожалуйста, попробуйте снова.", + "dashboard.translate.sourceDocument": "Исходный документ", + "dashboard.translate.configuration": "Настройки", + "dashboard.translate.translating": "Перевод выполняется", + "dashboard.translate.liveMonitor": "Мониторинг", + "dashboard.translate.summary": "Сводка", + "dashboard.translate.engine": "Движок", + "dashboard.translate.confidence": "Достоверность", + "dashboard.translate.cancel": "Отмена", + "dashboard.translate.segments": "Сегменты", + "dashboard.translate.characters": "Символы", + "dashboard.translate.elapsed": "Прошло", + "dashboard.translate.segPerMin": "Сег/мин", + "dashboard.translate.highQuality": "Высокое качество", + "dashboard.translate.quality": "Качество", + "dashboard.translate.completed": "Перевод завершён", + "dashboard.translate.replace": "Заменить", + "dashboard.translate.pdfMode.title": "Режим перевода PDF", + "dashboard.translate.pdfMode.preserveLayout": "Сохранить вёрстку", + "dashboard.translate.pdfMode.textOnly": "Только текст", + "dashboard.translate.pdfMode.preserveLayoutDesc": "Сохраняет изображения, таблицы и форматирование. Лучше для простых PDF.", + "dashboard.translate.pdfMode.textOnlyDesc": "Идеальный перевод всего текста. Чистый результат без проблем с вёрсткой.", + "dashboard.translate.pipeline.upload": "Загрузка", + "dashboard.translate.pipeline.analyze": "Анализ", + "dashboard.translate.pipeline.translate": "Перевод", + "dashboard.translate.pipeline.rebuild": "Восстановление", + "dashboard.translate.pipeline.finalize": "Завершение", + "dashboard.translate.progress.failedTitle": "Перевод не удался", + "glossaries.dialog.title": "Новый глоссарий", + "glossaries.dialog.description": "Создайте глоссарий для ваших переводов", + "glossaries.dialog.nameLabel": "Название", + "glossaries.dialog.namePlaceholder": "Мой глоссарий", + "glossaries.dialog.tabTemplates": "Шаблоны", + "glossaries.dialog.tabFile": "Файл", + "glossaries.dialog.tabManual": "Вручную", + "glossaries.dialog.cancel": "Отмена", + "glossaries.dialog.creating": "Создание…", + "glossaries.dialog.importing": "Импорт…", + "glossaries.dialog.importBtn": "Импортировать", + "glossaries.dialog.selectPrompt": "Выбрать", + "glossaries.dialog.createBtn": "Создать", + "glossaries.dialog.createEmpty": "Создать пустой", + "glossaries.dialog.terms": "терминов", + "glossaries.dialog.templatesDesc": "Выберите готовый шаблон", + "glossaries.dialog.templatesEmpty": "Нет доступных шаблонов", + "glossaries.dialog.dropTitle": "Перетащите CSV-файл сюда", + "glossaries.dialog.dropOr": "или", + "glossaries.dialog.dropFormats": "CSV, TSV, TXT", + "glossaries.dialog.formatTitle": "Формат", + "glossaries.dialog.formatDesc": "источник,цель (по одной на строку)", + "glossaries.dialog.formatNote": "Первая строка пропускается при обнаружении заголовка", + "glossaries.dialog.errorFormat": "Неподдерживаемый формат", + "glossaries.dialog.errorSize": "Файл слишком большой", + "glossaries.dialog.errorEmpty": "Пустой файл", + "glossaries.dialog.errorRead": "Ошибка чтения", + "glossaries.dialog.parsing": "Обработка…", + "glossaries.dialog.termsImported": "терминов импортировано", + "glossaries.dialog.changeFile": "Изменить файл", + "glossaries.dialog.retry": "Повторить", + "pricing.nav.back": "Назад", + "pricing.nav.home": "Главная", + "pricing.nav.mySubscription": "Моя подписка", + "pricing.header.badge": "ИИ-модели обновлены — март 2026", + "pricing.header.title": "Тариф для любых задач", + "pricing.header.subtitle": "Переводите документы Word, Excel и PowerPoint с сохранением исходного форматирования. Без API-ключей.", + "pricing.billing.monthly": "Ежемесячно", + "pricing.billing.yearly": "Ежегодно", + "pricing.plans.free.name": "Бесплатный", + "pricing.plans.starter.name": "Starter", + "pricing.plans.pro.name": "Pro", + "pricing.plans.business.name": "Business", + "pricing.plans.enterprise.name": "Enterprise", + "pricing.plans.free.description": "Отлично для знакомства с приложением", + "pricing.plans.starter.description": "Для частных лиц и небольших проектов", + "pricing.plans.pro.description": "Для профессионалов и растущих команд", + "pricing.plans.business.description": "Для команд и организаций", + "pricing.plans.enterprise.description": "Индивидуальные решения для крупных организаций", + "pricing.plans.pro.highlight": "Самый популярный", + "pricing.plans.pro.badge": "ПОПУЛЯРНЫЙ", + "pricing.plans.enterprise.badge": "ПО ЗАПРОСУ", + "pricing.plans.free.feat1": "5 документов / месяц", + "pricing.plans.free.feat2": "До 15 страниц на документ", + "pricing.plans.free.feat3": "Google Переводчик включён", + "pricing.plans.free.feat4": "Все языки (130+)", + "pricing.plans.free.feat5": "Поддержка сообщества", + "pricing.plans.starter.feat1": "50 документов / месяц", + "pricing.plans.starter.feat2": "До 50 страниц на документ", + "pricing.plans.starter.feat3": "Google Переводчик + DeepL", + "pricing.plans.starter.feat4": "Файлы до 10 МБ", + "pricing.plans.starter.feat5": "Поддержка по эл. почте", + "pricing.plans.starter.feat6": "История за 30 дней", + "pricing.plans.pro.feat1": "200 документов / месяц", + "pricing.plans.pro.feat2": "До 200 страниц на документ", + "pricing.plans.pro.feat3": "Базовый ИИ-перевод (DeepSeek V3.2)", + "pricing.plans.pro.feat4": "Google Переводчик + DeepL", + "pricing.plans.pro.feat5": "Файлы до 25 МБ", + "pricing.plans.pro.feat6": "Пользовательские глоссарии", + "pricing.plans.pro.feat7": "Приоритетная поддержка", + "pricing.plans.pro.feat8": "История за 90 дней", + "pricing.plans.business.feat1": "1 000 документов / месяц", + "pricing.plans.business.feat2": "До 500 страниц на документ", + "pricing.plans.business.feat3": "Базовый + Премиум ИИ (Claude Haiku)", + "pricing.plans.business.feat4": "Все провайдеры перевода", + "pricing.plans.business.feat5": "Файлы до 50 МБ", + "pricing.plans.business.feat6": "Доступ к API (10 000 вызовов/мес.)", + "pricing.plans.business.feat7": "Вебхуки уведомлений", + "pricing.plans.business.feat8": "Выделенная поддержка", + "pricing.plans.business.feat9": "История за 1 год", + "pricing.plans.business.feat10": "Расширенная аналитика", + "pricing.plans.enterprise.feat1": "Безлимитные документы", + "pricing.plans.enterprise.feat2": "Все ИИ-модели (GPT-5, Claude Opus 4.6…)", + "pricing.plans.enterprise.feat3": "Локальное развёртывание или выделенное облако", + "pricing.plans.enterprise.feat4": "SLA 99,9 % гарантировано", + "pricing.plans.enterprise.feat5": "Выделенная поддержка 24/7", + "pricing.plans.enterprise.feat6": "White-label", + "pricing.plans.enterprise.feat7": "Безлимитные команды", + "pricing.plans.enterprise.feat8": "Индивидуальные интеграции", + "pricing.card.onRequest": "По запросу", + "pricing.card.free": "Бесплатно", + "pricing.card.perMonth": "/мес.", + "pricing.card.billedYearly": "К оплате {price} € / год", + "pricing.card.documents": "Документы", + "pricing.card.pagesMax": "Макс. страниц", + "pricing.card.aiTranslation": "ИИ-перевод", + "pricing.card.unlimited": "Безлимит", + "pricing.card.perMonthStat": "/ месяц", + "pricing.card.perDoc": "стр. / док.", + "pricing.card.aiEssential": "Базовый", + "pricing.card.aiEssentialPremium": "Базовый + Премиум", + "pricing.card.aiCustom": "Индивидуальный", + "pricing.card.myPlan": "Мой тариф", + "pricing.card.managePlan": "Управлять тарифом", + "pricing.card.startFree": "Начать бесплатно", + "pricing.card.contactUs": "Связаться с нами", + "pricing.card.choosePlan": "Выбрать этот тариф", + "pricing.card.processing": "Обработка…", + "pricing.comparison.title": "Подробное сравнение", + "pricing.comparison.subtitle": "Всё, что входит в каждый тариф", + "pricing.comparison.feature": "Функция", + "pricing.comparison.docsPerMonth": "Документы / месяц", + "pricing.comparison.pagesMaxPerDoc": "Макс. страниц / документ", + "pricing.comparison.maxFileSize": "Макс. размер файла", + "pricing.comparison.googleTranslation": "Google Переводчик", + "pricing.comparison.deepl": "DeepL", + "pricing.comparison.aiEssential": "Базовый ИИ-перевод", + "pricing.comparison.aiPremium": "Премиум ИИ-перевод", + "pricing.comparison.apiAccess": "Доступ к API", + "pricing.comparison.priorityProcessing": "Приоритетная обработка", + "pricing.comparison.support": "Поддержка", + "pricing.comparison.support.community": "Сообщество", + "pricing.comparison.support.email": "Эл. почта", + "pricing.comparison.support.priority": "Приоритетная", + "pricing.comparison.support.dedicated": "Выделенная", + "pricing.comparison.mb": "МБ", + "pricing.credits.title": "Дополнительные кредиты", + "pricing.credits.subtitle": "Нужно больше? Купите кредиты поштучно, без подписки.", + "pricing.credits.perPage": "1 кредит = 1 переведённая страница.", + "pricing.credits.bestValue": "Лучшая ценность", + "pricing.credits.unit": "кредитов", + "pricing.credits.centsPerCredit": "коп. / кредит", + "pricing.credits.buy": "Купить", + "pricing.trust.encryption.title": "Сквозное шифрование", + "pricing.trust.encryption.sub": "TLS 1.3 + AES-256 при хранении", + "pricing.trust.languages.title": "130+ языков", + "pricing.trust.languages.sub": "Включая арабский, персидский, иврит (RTL)", + "pricing.trust.parallel.title": "Параллельная обработка", + "pricing.trust.parallel.sub": "Сверхбыстрая многопоточная ИИ", + "pricing.trust.availability.title": "Доступно 24/7", + "pricing.trust.availability.sub": "99,9 % гарантированный аптайм", + "pricing.aiModels.title": "Наши ИИ-модели — март 2026", + "pricing.aiModels.essential.title": "Базовый ИИ-перевод", + "pricing.aiModels.essential.plan": "Тариф Pro", + "pricing.aiModels.essential.descPrefix": "На базе", + "pricing.aiModels.essential.descSuffix": "— самой экономичной ИИ-модели 2026 года. Качество на уровне frontier-моделей при стоимости в 50 раз ниже.", + "pricing.aiModels.essential.context": "163K токенов контекста", + "pricing.aiModels.essential.value": "Отличное соотношение цены и качества", + "pricing.aiModels.premium.title": "Премиум ИИ-перевод", + "pricing.aiModels.premium.plan": "Тариф Business", + "pricing.aiModels.premium.descPrefix": "На базе", + "pricing.aiModels.premium.descSuffix": "от Anthropic — высокая точность на юридических, медицинских и сложных технических документах.", + "pricing.aiModels.premium.context": "200K токенов контекста", + "pricing.aiModels.premium.precision": "Наивысшая точность", + "pricing.faq.title": "Часто задаваемые вопросы", + "pricing.faq.q1": "Могу ли я сменить тариф в любое время?", + "pricing.faq.a1": "Да. Повышение тарифа применяется сразу с пересчётом. Понижение вступает в силу в конце текущего периода.", + "pricing.faq.q2": "Что такое «Базовый ИИ-перевод»?", + "pricing.faq.a2": "Это наш ИИ-движок на базе DeepSeek V3.2 через OpenRouter. Он понимает контекст документов, сохраняет форматирование и значительно лучше обрабатывает технические термины по сравнению с классическим переводом.", + "pricing.faq.q3": "В чём разница между базовым и премиум ИИ-переводом?", + "pricing.faq.a3": "Базовый ИИ использует DeepSeek V3.2 (отличное соотношение цены и качества). Премиум ИИ использует Claude 3.5 Haiku от Anthropic — более точный на юридических, медицинских и сложных технических документах.", + "pricing.faq.q4": "Сохраняются ли мои документы после перевода?", + "pricing.faq.a4": "Переведённые файлы доступны в зависимости от тарифа (30 дней Starter, 90 дней Pro, 1 год Business). Они зашифрованы при хранении и передаче.", + "pricing.faq.q5": "Что произойдёт при превышении месячной квоты?", + "pricing.faq.a5": "Вы можете докупить кредиты поштучно или повысить тариф. Уведомление приходит при достижении 80 % использования.", + "pricing.faq.q6": "Есть ли бесплатный пробный период для платных тарифов?", + "pricing.faq.a6": "Бесплатный тариф постоянный и не требует банковской карты. Для тарифов Pro и Business свяжитесь с нами для получения 14-дневного пробного доступа.", + "pricing.faq.q7": "Какие форматы файлов поддерживаются?", + "pricing.faq.a7": "Word (.docx), Excel (.xlsx/.xls), PowerPoint (.pptx), а скоро и PDF. Все тарифы поддерживают одинаковые форматы.", + "pricing.cta.title": "Готовы начать?", + "pricing.cta.subtitle": "Начните бесплатно, без банковской карты. Повысьте тариф, когда понадобится.", + "pricing.cta.createAccount": "Создать бесплатный аккаунт", + "pricing.cta.login": "Войти", + "pricing.toast.demo": "Деморежим — Stripe ещё не настроен. В рабочей среде вы были бы перенаправлены на страницу оплаты для активации тарифа {planId}.", + "pricing.toast.networkError": "Сетевая ошибка. Пожалуйста, попробуйте снова.", + "pricing.toast.paymentError": "Ошибка при создании платежа.", + "register.title": "Создать аккаунт", + "register.subtitle": "Начните переводить бесплатно", + "register.error.failed": "Ошибка регистрации", + "register.name.label": "Имя", + "register.name.placeholder": "Ваше имя", + "register.name.error": "Имя должно содержать не менее 2 символов", + "register.email.label": "Электронная почта", + "register.email.placeholder": "you@example.com", + "register.email.error": "Недействительный адрес эл. почты", + "register.password.label": "Пароль", + "register.password.error": "Пароль должен содержать не менее 8 символов, включая заглавную букву, строчную букву и цифру", + "register.password.show": "Показать пароль", + "register.password.hide": "Скрыть пароль", + "register.password.strengthLabel": "Надёжность:", + "register.password.strength.weak": "Слабая", + "register.password.strength.medium": "Средняя", + "register.password.strength.strong": "Сильная", + "register.confirmPassword.label": "Подтвердите пароль", + "register.confirmPassword.error": "Пароли не совпадают", + "register.confirmPassword.show": "Показать", + "register.confirmPassword.hide": "Скрыть", + "register.submit.creating": "Создание аккаунта...", + "register.submit.create": "Создать аккаунт", + "register.hasAccount": "Уже есть аккаунт?", + "register.login": "Войти", + "register.terms.prefix": "Создавая аккаунт, вы принимаете наши", + "register.terms.link": "условия использования", + + // ── Landing page ── + "landing.nav.whyUs": "Почему мы", + "landing.nav.formats": "Форматы", + "landing.nav.pricing": "Цены", + "landing.nav.login": "Войти", + "landing.nav.startFree": "Бесплатно", + "landing.hero.badge": "Новое: поддержка PDF + перевод с помощью ИИ", + "landing.hero.title1": "Переводите ваши документы.", + "landing.hero.title2": "Сохраняйте идеальное форматирование.", + "landing.hero.subtitle": "Единственный переводчик, который сохраняет SmartArt, диаграммы, оглавления, фигуры, колонтитулы — в точности такими, какими они были. Никаких сюрпризов при оплате.", + "landing.hero.cta": "Бесплатно — 2 документа/мес", + "landing.hero.seePlans": "Смотреть планы", + "landing.trust.filesDeleted": "Файлы удаляются через 60 мин", + "landing.trust.noBait": "Без обмана в ценах", + "landing.trust.preview": "Предпросмотр перед оплатой", + "landing.why.title": "Ваше форматирование идеально сохранено", + "landing.why.subtitle": "Другие переводчики ломают вёрстку. Мы — нет.", + "landing.why.smartart.title": "SmartArt и диаграммы", + "landing.why.smartart.desc": "Организационные схемы, блок-схемы, иерархии — всё переведено на своих местах.", + "landing.why.toc.title": "Оглавления", + "landing.why.toc.desc": "Элементы оглавления, номера страниц и перекрёстные ссылки корректно обновляются.", + "landing.why.charts.title": "Диаграммы и графики", + "landing.why.charts.desc": "Заголовки, подписи осей, легенды и названия рядов — всё переводится.", + "landing.why.shapes.title": "Фигуры и текстовые поля", + "landing.why.shapes.desc": "Прямоугольники, скруглённые блоки, выноски — мы находим и переводим текст во всех фигурах.", + "landing.why.headers.title": "Колонтитулы", + "landing.why.headers.desc": "Верхние и нижние колонтитулы, а также сноски никогда не пропускаются.", + "landing.why.languages.title": "130+ языков", + "landing.why.languages.desc": "Google Переводчик, DeepL и движки ИИ для профессионального качества.", + "landing.pricing.title": "Простые и честные цены", + "landing.pricing.subtitle": "Что видите — то и платите. Никаких скрытых платежей после перевода.", + "landing.pricing.monthly": "Ежемесячно", + "landing.pricing.yearly": "Ежегодно", + "landing.pricing.starter.title": "Starter", + "landing.pricing.starter.desc": "Для частных лиц и небольших проектов", + "landing.pricing.starter.f1": "50 документов / месяц", + "landing.pricing.starter.f2": "До 50 страниц на документ", + "landing.pricing.starter.f3": "Google Переводчик + DeepL", + "landing.pricing.starter.f4": "Файлы до 10 МБ", + "landing.pricing.starter.cta": "Начать", + "landing.pricing.pro.title": "Pro", + "landing.pricing.pro.badge": "Самый популярный", + "landing.pricing.pro.desc": "Для профессионалов, которым важно качество", + "landing.pricing.pro.f1": "200 документов / месяц", + "landing.pricing.pro.f2": "До 200 страниц на документ", + "landing.pricing.pro.f3": "Перевод с помощью ИИ (DeepSeek)", + "landing.pricing.pro.f4": "Google + DeepL включены", + "landing.pricing.pro.f5": "Пользовательские глоссарии и промпты", + "landing.pricing.pro.f6": "Приоритетная поддержка", + "landing.pricing.pro.cta": "Попробовать Pro", + "landing.pricing.business.title": "Business", + "landing.pricing.business.desc": "Для команд с большим объёмом работ", + "landing.pricing.business.f1": "1 000 документов / месяц", + "landing.pricing.business.f2": "До 500 страниц на документ", + "landing.pricing.business.f3": "Премиум ИИ (Claude)", + "landing.pricing.business.f4": "Все провайдеры + доступ к API", + "landing.pricing.business.f5": "Вебхуки и автоматизация", + "landing.pricing.business.f6": "5 рабочих мест", + "landing.pricing.business.cta": "Связаться с нами", + "landing.pricing.honest": "Указанная цена — это цена, которую вы платите. Никаких скрытых платежей после перевода.", + "landing.pricing.billedYearly": "оплата за год", + "landing.pricing.perMonth": "/мес", + "landing.formats.title": "Каждый формат, каждый элемент", + "landing.formats.subtitle": "Мы переводим то, что другие пропускают.", + "landing.formats.word": "Word (.docx)", + "landing.formats.word.f1": "Абзацы и заголовки", + "landing.formats.word.f2": "Таблицы и диаграммы", + "landing.formats.word.f3": "Диаграммы SmartArt", + "landing.formats.word.f4": "Оглавление", + "landing.formats.word.f5": "Колонтитулы", + "landing.formats.word.f6": "Фигуры и текстовые поля", + "landing.formats.word.f7": "Сноски и концевые сноски", + "landing.formats.excel": "Excel (.xlsx)", + "landing.formats.excel.f1": "Значения ячеек", + "landing.formats.excel.f2": "Имена листов", + "landing.formats.excel.f3": "Диаграммы и подписи", + "landing.formats.excel.f4": "Колонтитулы", + "landing.formats.excel.f5": "Объединённые ячейки сохранены", + "landing.formats.powerpoint": "PowerPoint (.pptx)", + "landing.formats.powerpoint.f1": "Текст слайдов и заметки", + "landing.formats.powerpoint.f2": "Диаграммы и схемы", + "landing.formats.powerpoint.f3": "Фигуры и текстовые поля", + "landing.formats.powerpoint.f4": "Мастер-макеты", + "landing.formats.powerpoint.f5": "Анимации сохранены", + "landing.formats.pdf": "PDF", + "landing.formats.pdf.f1": "Текстовые PDF", + "landing.formats.pdf.f2": "Макет сохранён", + "landing.formats.pdf.f3": "Изображения на своих местах", + "landing.formats.pdf.f4": "Таблицы сохранены", + "landing.formats.pdf.f5": "Результат в DOCX или PDF", + "landing.cta.title": "Начните переводить за 30 секунд", + "landing.cta.subtitle": "Кредитная карта не нужна. Попробуйте 2 документа бесплатно и оцените разницу.", + "landing.cta.button": "Создать бесплатный аккаунт", + "landing.footer.privacy": "Конфиденциальность", + "landing.footer.terms": "Условия", + "landing.footer.contact": "Контакты", + + "landing.ai.badge": "AI-Powered Translation Engine", + "landing.ai.title": "Translation that understands your craft", + "landing.ai.subtitle": "Our AI models analyze context, respect your terminology, and even translate text inside images.", + "landing.ai.context.title": "Industry Context", + "landing.ai.context.desc": "Describe your field and get tailored translations, not generic ones.", + "landing.ai.glossary.title": "Industry Glossaries", + "landing.ai.glossary.desc": "Define your technical terms for precise, domain-specific translations.", + "landing.ai.vision.title": "Image Vision", + "landing.ai.vision.desc": "Text embedded in images, diagrams and charts is detected and translated.", + "landing.ai.comparison.source": "Source (FR)", + "landing.ai.comparison.google": "Google Translate", + "landing.ai.comparison.ai": "Our AI", + "landing.howItWorks.title": "How it works", + "landing.howItWorks.subtitle": "Three steps. Zero formatting loss.", + "landing.howItWorks.step1.title": "Upload your file", + "landing.howItWorks.step1.desc": "Drag and drop your Excel, Word, PowerPoint or PDF document.", + "landing.howItWorks.step2.title": "Pick language and engine", + "landing.howItWorks.step2.desc": "Select target language and engine - standard or context-aware AI.", + "landing.howItWorks.step3.title": "Download the result", + "landing.howItWorks.step3.desc": "Get your translated document with formatting identical to the original.", + + "login.errorTitle": "Login Error", + "login.welcomeBack": "Welcome back", + "login.signInToContinue": "Sign in to continue translating", + "login.email": "Email", + "login.emailPlaceholder": "you@example.com", + "login.password": "Password", + "login.forgotPassword": "Forgot password?", + "login.passwordPlaceholder": "••••••••", + "login.signingIn": "Signing in...", + "login.signIn": "Sign In", + "login.noAccount": "Don't have an account?", + "login.signUpFree": "Sign up for free", + "forgotPassword.enterEmail": "Please enter your email address", + "forgotPassword.error": "An error occurred", + "forgotPassword.title": "Forgot Password", + "forgotPassword.checkEmail": "Check your inbox", + "forgotPassword.subtitle": "Enter your email to receive a reset link", + "forgotPassword.sentMessage": "If an account exists with this address, a reset email has been sent.", + "forgotPassword.emailLabel": "Email address", + "forgotPassword.emailPlaceholder": "you@example.com", + "forgotPassword.sending": "Sending...", + "forgotPassword.sendLink": "Send reset link", + "forgotPassword.backToLogin": "Back to login", + "forgotPassword.loading": "Loading...", + "resetPassword.passwordRequirements": "Password must contain at least 8 characters, one uppercase, one lowercase, and one number", + "resetPassword.passwordMismatch": "Passwords do not match", + "resetPassword.tokenMissing": "Missing token. Please use the link received by email.", + "resetPassword.error": "An error occurred", + "resetPassword.invalidLink": "Invalid link", + "resetPassword.invalidLinkMessage": "This reset link is invalid. Please request a new one.", + "resetPassword.requestNewLink": "Request new link", + "resetPassword.successTitle": "Password reset", + "resetPassword.newPasswordTitle": "New password", + "resetPassword.successSubtitle": "You will be redirected to login", + "resetPassword.subtitle": "Set your new password", + "resetPassword.successMessage": "Your password has been successfully reset. You will be redirected to the login page.", + "resetPassword.newPassword": "New password", + "resetPassword.showPassword": "Show password", + "resetPassword.hidePassword": "Hide password", + "resetPassword.confirmPassword": "Confirm password", + "resetPassword.resetting": "Resetting...", + "resetPassword.resetPassword": "Reset password", + "resetPassword.backToLogin": "Back to login", + "resetPassword.loading": "Loading...", + "common.loading": "Загрузка...", + "profile.header.title": "Мой профиль", + "profile.header.subtitle": "Управление аккаунтом и настройками.", + "profile.tabs.account": "Аккаунт", + "profile.tabs.subscription": "Подписка", + "profile.tabs.preferences": "Настройки", + "profile.account.user": "Пользователь", + "profile.account.memberSince": "Участник с", + "profile.plan.label": "Тариф", + "profile.plan.free": "Free", + "profile.plan.starter": "Starter", + "profile.plan.pro": "Pro", + "profile.plan.business": "Business", + "profile.plan.enterprise": "Enterprise", + "profile.plan.pricePerMonth": "{price} €/мес.", + "profile.subscription.canceling": "Отменяется", + "profile.subscription.active": "Активна", + "profile.subscription.unknown": "Неизвестно", + "profile.subscription.accessUntil": "Доступ до", + "profile.subscription.renewalOn": "Продление", + "profile.subscription.upgradePlan": "Перейти на платный тариф", + "profile.subscription.changePlan": "Сменить тариф", + "profile.subscription.manageBilling": "Управление оплатой", + "profile.subscription.billingUnavailable": "Портал оплаты недоступен.", + "profile.subscription.billingError": "Ошибка доступа к порталу оплаты.", + "profile.subscription.cancelSuccess": "Подписка отменена. Доступ сохраняется до конца текущего периода.", + "profile.subscription.cancelError": "Ошибка при отмене.", + "profile.subscription.networkError": "Ошибка сети.", + "profile.usage.title": "Использование за этот месяц", + "profile.usage.resetOn": "Сброс", + "profile.usage.documents": "Документы", + "profile.usage.pages": "Страницы", + "profile.usage.extraCredits": "дополнительный кредит", + "profile.usage.extraCreditsPlural": "дополнительных кредитов", + "profile.usage.quotaReached": "Лимит достигнут", + "profile.usage.quotaReachedDesc": "Перейдите на более высокий тариф, чтобы продолжить.", + "profile.usage.unlockMore": "Разблокируйте больше переводов с платным тарифом.", + "profile.usage.viewPlans": "Посмотреть тарифы", + "profile.usage.includedInPlan": "Включено в ваш тариф", + "profile.danger.title": "Опасная зона", + "profile.danger.description": "Отмена вступает в силу в конце текущего периода. Доступ сохраняется до этой даты.", + "profile.danger.confirm": "Вы уверены? Это действие нельзя отменить.", + "profile.danger.confirmCancel": "Подтвердить отмену", + "profile.danger.cancelSubscription": "Отменить мою подписку", + "profile.danger.keep": "Нет, оставить", + "profile.prefs.interfaceLang": "Язык интерфейса", + "profile.prefs.interfaceLangDesc": "Язык определяется автоматически на основе настроек браузера. Вы можете изменить его вручную.", + "profile.prefs.defaultTargetLang": "Язык перевода по умолчанию", + "profile.prefs.selectLanguage": "Выберите язык", + "profile.prefs.defaultTargetLangDesc": "Этот язык будет автоматически выбираться для ваших переводов.", + "profile.prefs.save": "Сохранить", + "profile.prefs.theme": "Тема", + "profile.prefs.themeDesc": "Выберите внешний вид интерфейса", + "profile.prefs.cache": "Кэш", + "profile.prefs.cacheDesc": "Очистка локального кэша может решить некоторые проблемы отображения.", + "profile.prefs.clearing": "Очистка...", + "profile.prefs.clearCache": "Очистить кэш", + "settings.title": "Настройки", + "settings.subtitle": "Общая конфигурация приложения", + "settings.formats.title": "Поддерживаемые форматы", + "settings.formats.subtitle": "Типы документов, которые можно перевести", + "settings.formats.formulas": "Формулы", + "settings.formats.styles": "Стили", + "settings.formats.images": "Изображения", + "settings.formats.headers": "Колонтитулы", + "settings.formats.tables": "Таблицы", + "settings.formats.slides": "Слайды", + "settings.formats.notes": "Заметки", + "settings.cache.title": "Кэш", + "settings.cache.desc": "Очистка локального кэша может решить некоторые проблемы отображения.", + "settings.cache.clearing": "Очистка...", + "settings.cache.clear": "Очистить кэш", + "services.title": "Провайдеры перевода", + "services.subtitle": "Провайдеры настраиваются администратором. Вы можете увидеть, какие из них доступны для вашего аккаунта.", + "services.loading": "Загрузка провайдеров...", + "services.noProviders": "Провайдеры не настроены. Обратитесь к администратору.", + "services.classic": "Классический перевод", + "services.llmPro": "LLM · Контекстный (Pro)", + "services.available": "Доступен", + "services.model": "Модель", + "services.adminOnly.title": "Настройка провайдеров доступна только администратору", + "services.adminOnly.desc": "API-ключи, выбор моделей и активация провайдеров управляются исключительно администратором в панели управления. Вам не нужно вводить API-ключ.", + "apiKeys.title": "API-ключи", + "apiKeys.subtitle": "Управляйте API-ключами для программного доступа к API перевода.", + "apiKeys.loading": "Загрузка...", + "apiKeys.sectionTitle": "API и автоматизация", + "apiKeys.sectionDesc": "Генерируйте и управляйте API-ключами для автоматизации рабочих процессов", + "apiKeys.keysUsed": "{total} из {max} ключей использовано", + "apiKeys.maxReached": "Достигнуто максимальное количество ключей. Отзовите ключ, чтобы создать новый.", + "apiKeys.canGenerate": "Вы можете создать ещё {count} ключ", + "apiKeys.canGeneratePlural": "Вы можете создать ещё {count} ключей", + "apiKeys.generateNew": "Создать новый ключ", + "apiKeys.keyRevoked": "Ключ отозван", + "apiKeys.keyRevokedDesc": "API-ключ успешно отозван.", + "apiKeys.keyNotFound": "Ключ не найден", + "apiKeys.keyNotFoundDesc": "API-ключ больше не существует. Возможно, он уже был отозван.", + "apiKeys.error": "Ошибка", + "apiKeys.revokeError": "Не удалось отозвать API-ключ. Попробуйте снова.", + "apiKeys.limitReached": "Лимит достигнут", + "apiKeys.limitReachedDesc": "Вы достигли максимума в 10 API-ключей. Отзовите существующий ключ, чтобы создать новый.", + "apiKeys.proRequired": "Требуется тариф Pro", + "apiKeys.proRequiredDesc": "API-ключи — функция тарифа Pro. Пожалуйста, повысьте свой тариф.", + "apiKeys.generateError": "Не удалось сгенерировать API-ключ. Попробуйте снова.", + "apiKeys.upgrade.title": "API-ключи", + "apiKeys.upgrade.subtitle": "Автоматизируйте переводы с помощью доступа к API", + "apiKeys.upgrade.feat1": "Неограниченное количество API-ключей", + "apiKeys.upgrade.feat2": "Автоматизация перевода документов", + "apiKeys.upgrade.feat3": "Уведомления через вебхуки", + "apiKeys.upgrade.feat4": "Режимы перевода LLM", + "apiKeys.upgrade.proFeature": "API-ключи — функция тарифа {pro}. Повысьте тариф, чтобы разблокировать автоматизацию API.", + "apiKeys.upgrade.pro": "Pro", + "apiKeys.upgrade.cta": "Перейти на Pro", + "apiKeys.dialog.maxTitle": "Достигнуто максимальное количество ключей", + "apiKeys.dialog.maxDesc": "Вы достигли максимума в 10 API-ключей. Отзовите существующий ключ перед созданием нового.", + "apiKeys.dialog.close": "Закрыть", + "apiKeys.dialog.generated": "API-ключ создан!", + "apiKeys.dialog.generatedDesc": "Ваш новый API-ключ создан. Скопируйте его сейчас — он больше не будет показан.", + "apiKeys.dialog.important": "Важно:", + "apiKeys.dialog.importantDesc": "Это единственный раз, когда вы видите этот ключ. Храните его в безопасности.", + "apiKeys.dialog.apiKey": "API-ключ", + "apiKeys.dialog.name": "Имя:", + "apiKeys.dialog.done": "Готово", + "apiKeys.dialog.copied": "Я скопировал ключ", + "apiKeys.dialog.generateTitle": "Создать новый API-ключ", + "apiKeys.dialog.generateDesc": "Создайте новый API-ключ для программного доступа к API перевода.", + "apiKeys.dialog.keyName": "Имя ключа (необязательно)", + "apiKeys.dialog.keyNamePlaceholder": "напр. Продакшен, Стегинг", + "apiKeys.dialog.keyNameHint": "Описательное имя для идентификации ключа в будущем.", + "apiKeys.dialog.nameTooLong": "Имя должно содержать не более {max} символов", + "apiKeys.dialog.nameInvalid": "Имя может содержать только буквы, цифры, пробелы, дефисы и подчёркивания", + "apiKeys.dialog.cancel": "Отмена", + "apiKeys.dialog.generating": "Генерация...", + "apiKeys.dialog.generate": "Создать ключ", + "apiKeys.table.name": "Имя", + "apiKeys.table.prefix": "Префикс", + "apiKeys.table.created": "Создан", + "apiKeys.table.lastUsed": "Последнее использование", + "apiKeys.table.never": "Никогда", + "apiKeys.table.actions": "Действия", + "apiKeys.table.revoke": "Отозвать", + "apiKeys.table.copyPrefix": "Копировать префикс ключа", + "apiKeys.table.revokeKey": "Отозвать ключ", + "apiKeys.revokeDialog.title": "Отзыв API-ключа", + "apiKeys.revokeDialog.desc": "Вы уверены, что хотите отозвать ключ \"{name}\"? Это действие нельзя отменить.", + "apiKeys.revokeDialog.confirm": "Да, отозвать", + "apiKeys.revokeDialog.cancel": "Отмена", + "context.proTitle": "Функция Pro", + "context.proDesc": "Контекст и профессиональные глоссарии доступны на тарифах Pro, Business и Enterprise. Они обеспечивают более точные переводы благодаря инструкциям и словарю, специфичному для вашей области.", + "context.viewPlans": "Посмотреть тарифы", + "context.title": "Контекст и глоссарий", + "context.subtitle": "Улучшите качество перевода с помощью инструкций и словаря, специфичного для вашей области.", + "context.presets.title": "Профессиональные глоссарии", + "context.presets.desc": "Загрузите полный глоссарий с инструкциями и специализированной терминологией", + "context.instructions.title": "Инструкции контекста", + "context.instructions.desc": "Инструкции, которым ИИ будет следовать при переводе", + "context.instructions.placeholder": "Напр.: Вы переводите техническую документацию по HVAC. Используйте точную инженерную терминологию...", + "context.glossary.title": "Технический глоссарий", + "context.glossary.desc": "Формат: источник=цель (по одному на строку). Глоссарии, загруженные через пресет, можно редактировать.", + "context.glossary.terms": "терминов в глоссарии", + "context.clearAll": "Очистить всё", + "context.saving": "Сохранение...", + "context.save": "Сохранить", + "admin.login.title": "Администрирование", + "admin.login.required": "Требуется вход", + "admin.login.password": "Пароль администратора", + "admin.login.connecting": "Подключение...", + "admin.login.access": "Войти в панель администратора", + "admin.login.restricted": "Доступ ограничен администраторами", + "admin.layout.checking": "Проверка аутентификации...", + "admin.dashboard.title": "Панель администратора", + "admin.dashboard.subtitle": "Панель управления администратора", + "admin.dashboard.refresh": "Обновить", + "admin.dashboard.refreshTooltip": "Обновить данные панели", + "admin.dashboard.config": "Конфигурация системы", + "admin.dashboard.maxFileSize": "Макс. размер файла:", + "admin.dashboard.translationService": "Служба перевода:", + "admin.dashboard.formats": "Форматы:", + "admin.nav.dashboard": "Dashboard", + "admin.nav.users": "Пользователи", + "admin.nav.pricing": "Цены и Stripe", + "admin.nav.providers": "Провайдеры", + "admin.nav.system": "Система", + "admin.nav.logs": "Журналы", + "admin.users.title": "Управление пользователями", + "admin.users.subtitle": "Просмотр и управление учётными записями", + "admin.users.planUpdated": "План обновлён", + "admin.users.planChanged": "План успешно изменён на \"{plan}\".", + "admin.users.unknownError": "Неизвестная ошибка", + "admin.users.error": "Ошибка", + "admin.users.planUpdateError": "Не удалось обновить план: {message}", + "admin.users.noKeys": "Нет ключей", + "admin.users.noKeysDesc": "У этого пользователя нет активных ключей API.", + "admin.users.keysRevoked": "Ключи отозваны", + "admin.users.keysRevokedDesc": "{count} ключ(ей) API успешно отозвано.", + "admin.users.revokeError": "Не удалось отозвать ключи: {message}", + "admin.users.retry": "Повторить", + "admin.system.title": "Система", + "admin.system.subtitle": "Мониторинг состояния системы и управление ресурсами", + "admin.system.quotas": "Квоты переводов", + "admin.system.resetQuotas": "Сбросить месячные квоты", + "admin.system.resetting": "Сброс...", + "admin.system.reset": "Сбросить", + "admin.system.allOperational": "Все системы работают", + "admin.system.issuesDetected": "Обнаружены проблемы в системе", + "admin.system.waitingData": "Ожидание данных...", + "admin.system.purging": "Очистка...", + "admin.system.clean": "Очистить", + "admin.system.purge": "Очистить", + }, + // ═══════════════════════════════════════════════════════════════ + // JAPANESE (ja) + // ═══════════════════════════════════════════════════════════════ + ja: { + "auth.brandName": "Office Translator", + "dashboard.nav.translate": "翻訳する", + "dashboard.nav.profile": "マイプロフィール", + "dashboard.nav.settings": "設定", + "dashboard.nav.context": "コンテキスト", + "dashboard.nav.services": "サービス", + "dashboard.nav.apiKeys": "APIキー", + "dashboard.nav.glossaries": "用語集", + "dashboard.header.title": "ダッシュボード", + "dashboard.header.subtitle": "翻訳を管理", + "dashboard.header.toggleMenu": "メニュー", + "dashboard.header.profileTitle": "マイプロフィール", + "dashboard.sidebar.theme": "テーマ", + "dashboard.sidebar.signOut": "ログアウト", + "dashboard.sidebar.backHome": "ホームに戻る", + "dashboard.translate.pageTitle": "ドキュメントを翻訳", + "dashboard.translate.pageSubtitle": "ファイルをインポートして翻訳先言語を選択", + "dashboard.translate.errorNotificationTitle": "エラー", + "dashboard.translate.dropzone.uploadAria": "ファイルドロップゾーン", + "dashboard.translate.dropzone.title": "ファイルをここにドラッグ&ドロップ", + "dashboard.translate.dropzone.subtitle": "またはクリックして選択(DOCX、XLSX、PPTX、PDF)", + "dashboard.translate.dropzone.replaceFile": "ファイルを置き換え", + "dashboard.translate.language.source": "翻訳元言語", + "dashboard.translate.language.target": "翻訳先言語", + "dashboard.translate.language.loading": "言語を読み込み中…", + "dashboard.translate.language.autoDetect": "自動検出", + "dashboard.translate.language.selectPlaceholder": "選択…", + "dashboard.translate.language.loadErrorPrefix": "言語の読み込みに失敗しました", + "dashboard.translate.provider.loading": "プロバイダーを読み込み中…", + "dashboard.translate.provider.noneConfigured": "プロバイダーが設定されていません", + "dashboard.translate.provider.modelTitle": "モデル", + "dashboard.translate.provider.sectionTitle": "プロバイダー", + "dashboard.translate.provider.llmDivider": "AI・コンテキスト認識", + "dashboard.translate.provider.llmDividerPro": "AI・コンテキスト認識(Pro)", + "dashboard.translate.provider.upgrade": "Proにアップグレード", + "dashboard.translate.provider.upgradeSuffix": "AI翻訳をアンロック", + "dashboard.translate.trust.zeroRetention": "データ保持なし", + "dashboard.translate.trust.deletedAfter": "処理後にファイルを削除", + "dashboard.translate.actions.uploading": "アップロード中…", + "dashboard.translate.actions.translate": "翻訳する", + "dashboard.translate.actions.filePrefix": "ファイル:", + "dashboard.translate.actions.cancel": "キャンセル", + "dashboard.translate.actions.tryAgain": "再試行", + "dashboard.translate.steps.uploading": "ファイルをアップロード中…", + "dashboard.translate.steps.starting": "翻訳を開始中…", + "dashboard.translate.complete.title": "翻訳完了!", + "dashboard.translate.complete.descNamed": "ファイル{name}の翻訳が正常に完了しました。", + "dashboard.translate.complete.descGeneric": "ファイルの翻訳が正常に完了しました。", + "dashboard.translate.complete.downloading": "ダウンロード中…", + "dashboard.translate.complete.download": "ダウンロード", + "dashboard.translate.complete.newTranslation": "新しい翻訳", + "dashboard.translate.complete.toastOkTitle": "成功", + "dashboard.translate.complete.toastFailTitle": "失敗", + "dashboard.translate.complete.toastFailDesc": "翻訳に失敗しました。もう一度お試しください。", + "dashboard.translate.sourceDocument": "ソースドキュメント", + "dashboard.translate.configuration": "設定", + "dashboard.translate.translating": "翻訳中", + "dashboard.translate.liveMonitor": "ライブモニター", + "dashboard.translate.summary": "概要", + "dashboard.translate.engine": "エンジン", + "dashboard.translate.confidence": "信頼度", + "dashboard.translate.cancel": "キャンセル", + "dashboard.translate.segments": "セグメント", + "dashboard.translate.characters": "文字", + "dashboard.translate.elapsed": "経過時間", + "dashboard.translate.segPerMin": "セグ/分", + "dashboard.translate.highQuality": "高品質", + "dashboard.translate.quality": "品質", + "dashboard.translate.completed": "翻訳完了", + "dashboard.translate.replace": "置換", + "dashboard.translate.pdfMode.title": "PDF翻訳モード", + "dashboard.translate.pdfMode.preserveLayout": "レイアウト保持", + "dashboard.translate.pdfMode.textOnly": "テキストのみ", + "dashboard.translate.pdfMode.preserveLayoutDesc": "画像、表、書式を保持。シンプルなPDFに最適。", + "dashboard.translate.pdfMode.textOnlyDesc": "すべてのテキストを完璧に翻訳。レイアウト問題のないクリーンな出力。", + "dashboard.translate.pipeline.upload": "アップロード", + "dashboard.translate.pipeline.analyze": "分析", + "dashboard.translate.pipeline.translate": "翻訳", + "dashboard.translate.pipeline.rebuild": "再構築", + "dashboard.translate.pipeline.finalize": "完了", + "dashboard.translate.progress.failedTitle": "翻訳失敗", + "glossaries.dialog.title": "新しい用語集", + "glossaries.dialog.description": "翻訳用の用語集を作成", + "glossaries.dialog.nameLabel": "名前", + "glossaries.dialog.namePlaceholder": "マイ用語集", + "glossaries.dialog.tabTemplates": "テンプレート", + "glossaries.dialog.tabFile": "ファイル", + "glossaries.dialog.tabManual": "手動", + "glossaries.dialog.cancel": "キャンセル", + "glossaries.dialog.creating": "作成中…", + "glossaries.dialog.importing": "インポート中…", + "glossaries.dialog.importBtn": "インポート", + "glossaries.dialog.selectPrompt": "選択", + "glossaries.dialog.createBtn": "作成", + "glossaries.dialog.createEmpty": "空で作成", + "glossaries.dialog.terms": "件", + "glossaries.dialog.templatesDesc": "定義済みテンプレートを選択", + "glossaries.dialog.templatesEmpty": "利用可能なテンプレートがありません", + "glossaries.dialog.dropTitle": "CSVファイルをここにドラッグ", + "glossaries.dialog.dropOr": "または", + "glossaries.dialog.dropFormats": "CSV、TSV、TXT", + "glossaries.dialog.formatTitle": "形式", + "glossaries.dialog.formatDesc": "原文,訳文(1行につき1組)", + "glossaries.dialog.formatNote": "ヘッダーが検出された場合、最初の行はスキップされます", + "glossaries.dialog.errorFormat": "サポートされていない形式", + "glossaries.dialog.errorSize": "ファイルが大きすぎます", + "glossaries.dialog.errorEmpty": "空のファイル", + "glossaries.dialog.errorRead": "読み取りエラー", + "glossaries.dialog.parsing": "解析中…", + "glossaries.dialog.termsImported": "件インポート済み", + "glossaries.dialog.changeFile": "ファイルを変更", + "glossaries.dialog.retry": "再試行", + "pricing.nav.back": "戻る", + "pricing.nav.home": "ホーム", + "pricing.nav.mySubscription": "マイサブスクリプション", + "pricing.header.badge": "AIモデル更新 — 2026年3月", + "pricing.header.title": "あらゆるニーズに応えるプラン", + "pricing.header.subtitle": "Word、Excel、PowerPointドキュメントを元のレイアウトを保持したまま翻訳。APIキー不要。", + "pricing.billing.monthly": "月額", + "pricing.billing.yearly": "年額", + "pricing.plans.free.name": "無料", + "pricing.plans.starter.name": "Starter", + "pricing.plans.pro.name": "Pro", + "pricing.plans.business.name": "Business", + "pricing.plans.enterprise.name": "Enterprise", + "pricing.plans.free.description": "アプリを試すのに最適", + "pricing.plans.starter.description": "個人や小規模プロジェクト向け", + "pricing.plans.pro.description": "プロフェッショナルや成長中のチーム向け", + "pricing.plans.business.description": "チームや組織向け", + "pricing.plans.enterprise.description": "大規模組織向けカスタムソリューション", + "pricing.plans.pro.highlight": "一番人気", + "pricing.plans.pro.badge": "人気No.1", + "pricing.plans.enterprise.badge": "要相談", + "pricing.plans.free.feat1": "月5ドキュメント", + "pricing.plans.free.feat2": "1ドキュメントあたり最大15ページ", + "pricing.plans.free.feat3": "Google翻訳付き", + "pricing.plans.free.feat4": "全言語対応(130+)", + "pricing.plans.free.feat5": "コミュニティサポート", + "pricing.plans.starter.feat1": "月50ドキュメント", + "pricing.plans.starter.feat2": "1ドキュメントあたり最大50ページ", + "pricing.plans.starter.feat3": "Google翻訳 + DeepL", + "pricing.plans.starter.feat4": "最大10 MBのファイル", + "pricing.plans.starter.feat5": "メールサポート", + "pricing.plans.starter.feat6": "30日間の履歴", + "pricing.plans.pro.feat1": "月200ドキュメント", + "pricing.plans.pro.feat2": "1ドキュメントあたり最大200ページ", + "pricing.plans.pro.feat3": "エッセンシャルAI翻訳(DeepSeek V3.2)", + "pricing.plans.pro.feat4": "Google翻訳 + DeepL", + "pricing.plans.pro.feat5": "最大25 MBのファイル", + "pricing.plans.pro.feat6": "カスタム用語集", + "pricing.plans.pro.feat7": "優先サポート", + "pricing.plans.pro.feat8": "90日間の履歴", + "pricing.plans.business.feat1": "月1,000ドキュメント", + "pricing.plans.business.feat2": "1ドキュメントあたり最大500ページ", + "pricing.plans.business.feat3": "エッセンシャル + プレミアムAI(Claude Haiku)", + "pricing.plans.business.feat4": "全翻訳プロバイダー", + "pricing.plans.business.feat5": "最大50 MBのファイル", + "pricing.plans.business.feat6": "APIアクセス(月10,000コール)", + "pricing.plans.business.feat7": "通知Webhook", + "pricing.plans.business.feat8": "専任サポート", + "pricing.plans.business.feat9": "1年間の履歴", + "pricing.plans.business.feat10": "高度な分析", + "pricing.plans.enterprise.feat1": "無制限ドキュメント", + "pricing.plans.enterprise.feat2": "全AIモデル(GPT-5、Claude Opus 4.6…)", + "pricing.plans.enterprise.feat3": "オンプレミスまたは専用クラウド展開", + "pricing.plans.enterprise.feat4": "99.9% SLA保証", + "pricing.plans.enterprise.feat5": "24/7専任サポート", + "pricing.plans.enterprise.feat6": "ホワイトラベル", + "pricing.plans.enterprise.feat7": "無制限チーム", + "pricing.plans.enterprise.feat8": "カスタム連携", + "pricing.card.onRequest": "要相談", + "pricing.card.free": "無料", + "pricing.card.perMonth": "/月", + "pricing.card.billedYearly": "年額 {price} € 請求", + "pricing.card.documents": "ドキュメント", + "pricing.card.pagesMax": "最大ページ数", + "pricing.card.aiTranslation": "AI翻訳", + "pricing.card.unlimited": "無制限", + "pricing.card.perMonthStat": "/ 月", + "pricing.card.perDoc": "p / doc", + "pricing.card.aiEssential": "エッセンシャル", + "pricing.card.aiEssentialPremium": "エッセンシャル + プレミアム", + "pricing.card.aiCustom": "カスタム", + "pricing.card.myPlan": "現在のプラン", + "pricing.card.managePlan": "プランを管理", + "pricing.card.startFree": "無料で始める", + "pricing.card.contactUs": "お問い合わせ", + "pricing.card.choosePlan": "このプランを選択", + "pricing.card.processing": "処理中…", + "pricing.comparison.title": "詳細な比較", + "pricing.comparison.subtitle": "各プランに含まれるすべての機能", + "pricing.comparison.feature": "機能", + "pricing.comparison.docsPerMonth": "ドキュメント / 月", + "pricing.comparison.pagesMaxPerDoc": "最大ページ数 / ドキュメント", + "pricing.comparison.maxFileSize": "最大ファイルサイズ", + "pricing.comparison.googleTranslation": "Google翻訳", + "pricing.comparison.deepl": "DeepL", + "pricing.comparison.aiEssential": "エッセンシャルAI翻訳", + "pricing.comparison.aiPremium": "プレミアムAI翻訳", + "pricing.comparison.apiAccess": "APIアクセス", + "pricing.comparison.priorityProcessing": "優先処理", + "pricing.comparison.support": "サポート", + "pricing.comparison.support.community": "コミュニティ", + "pricing.comparison.support.email": "メール", + "pricing.comparison.support.priority": "優先", + "pricing.comparison.support.dedicated": "専任", + "pricing.comparison.mb": "MB", + "pricing.credits.title": "追加クレジット", + "pricing.credits.subtitle": "もっと必要ですか?サブスクリプションなしでクレジットを個別購入。", + "pricing.credits.perPage": "1クレジット = 1翻訳ページ。", + "pricing.credits.bestValue": "最もお得", + "pricing.credits.unit": "クレジット", + "pricing.credits.centsPerCredit": "セント / クレジット", + "pricing.credits.buy": "購入", + "pricing.trust.encryption.title": "エンドツーエンド暗号化", + "pricing.trust.encryption.sub": "TLS 1.3 + AES-256(保存時)", + "pricing.trust.languages.title": "130+言語", + "pricing.trust.languages.sub": "アラビア語、ペルシャ語、ヘブライ語(RTL)を含む", + "pricing.trust.parallel.title": "並列処理", + "pricing.trust.parallel.sub": "超高速マルチスレッドAI", + "pricing.trust.availability.title": "24/7利用可能", + "pricing.trust.availability.sub": "99.9%稼働率保証", + "pricing.aiModels.title": "AIモデル一覧 — 2026年3月", + "pricing.aiModels.essential.title": "エッセンシャルAI翻訳", + "pricing.aiModels.essential.plan": "Proプラン", + "pricing.aiModels.essential.descPrefix": "ベース:", + "pricing.aiModels.essential.descSuffix": "— 2026年で最も費用対効果の高いAIモデル。フロンティアモデルと同等の品質を50分の1のコストで実現。", + "pricing.aiModels.essential.context": "163Kトークンのコンテキスト", + "pricing.aiModels.essential.value": "優れた費用対効果", + "pricing.aiModels.premium.title": "プレミアムAI翻訳", + "pricing.aiModels.premium.plan": "Businessプラン", + "pricing.aiModels.premium.descPrefix": "ベース:", + "pricing.aiModels.premium.descSuffix": "(Anthropic社製)— 法務、医療、複雑な技術文書に高精度。", + "pricing.aiModels.premium.context": "200Kトークンのコンテキスト", + "pricing.aiModels.premium.precision": "最高精度", + "pricing.faq.title": "よくある質問", + "pricing.faq.q1": "いつでもプランを変更できますか?", + "pricing.faq.a1": "はい。アップグレードは即時反映され、日割り計算されます。ダウングレードは現在の期間の終了時に適用されます。", + "pricing.faq.q2": "「エッセンシャルAI翻訳」とは何ですか?", + "pricing.faq.a2": "OpenRouter経由のDeepSeek V3.2をベースにしたAIエンジンです。ドキュメントのコンテキストを理解し、レイアウトを保持し、専門用語を従来の翻訳よりはるかに正確に処理します。", + "pricing.faq.q3": "エッセンシャルAIとプレミアムAIの違いは何ですか?", + "pricing.faq.a3": "エッセンシャルAIはDeepSeek V3.2を使用(優れた費用対効果)。プレミアムAIはAnthropic社のClaude 3.5 Haikuを使用し、法務、医療、複雑な技術文書でより高精度です。", + "pricing.faq.q4": "翻訳後もドキュメントは保存されますか?", + "pricing.faq.a4": "翻訳済みファイルはプランに応じて利用可能です(Starter 30日、Pro 90日、Business 1年)。保存時および通信時は暗号化されています。", + "pricing.faq.q5": "月間枠を超えた場合はどうなりますか?", + "pricing.faq.a5": "追加クレジットを個別購入するか、プランをアップグレードできます。使用量が80%に達すると通知されます。", + "pricing.faq.q6": "有料プランの無料試用はありますか?", + "pricing.faq.a6": "無料プランは永続的でクレジットカード不要です。ProおよびBusinessプランについては、14日間のトライアルをご希望の場合はお問い合わせください。", + "pricing.faq.q7": "対応ファイル形式を教えてください。", + "pricing.faq.a7": "Word(.docx)、Excel(.xlsx/.xls)、PowerPoint(.pptx)、および近日PDF対応予定。すべてのプランで同じ形式に対応しています。", + "pricing.cta.title": "始める準備はできましたか?", + "pricing.cta.subtitle": "クレジットカード不要で無料開始。必要に応じてアップグレード。", + "pricing.cta.createAccount": "無料アカウント作成", + "pricing.cta.login": "ログイン", + "pricing.toast.demo": "デモモード — Stripeはまだ設定されていません。本番環境では、{planId}プランを有効化するための支払いページにリダイレクトされます。", + "pricing.toast.networkError": "ネットワークエラー。もう一度お試しください。", + "pricing.toast.paymentError": "支払いの作成中にエラーが発生しました。", + "register.title": "アカウント作成", + "register.subtitle": "無料で翻訳を始めましょう", + "register.error.failed": "登録に失敗しました", + "register.name.label": "名前", + "register.name.placeholder": "お名前", + "register.name.error": "名前は2文字以上で入力してください", + "register.email.label": "メールアドレス", + "register.email.placeholder": "you@example.com", + "register.email.error": "無効なメールアドレス", + "register.password.label": "パスワード", + "register.password.error": "パスワードは8文字以上で、大文字・小文字・数字をそれぞれ1つ以上含めてください", + "register.password.show": "パスワードを表示", + "register.password.hide": "パスワードを非表示", + "register.password.strengthLabel": "強度:", + "register.password.strength.weak": "弱い", + "register.password.strength.medium": "普通", + "register.password.strength.strong": "強い", + "register.confirmPassword.label": "パスワード確認", + "register.confirmPassword.error": "パスワードが一致しません", + "register.confirmPassword.show": "表示", + "register.confirmPassword.hide": "非表示", + "register.submit.creating": "アカウント作成中...", + "register.submit.create": "アカウントを作成", + "register.hasAccount": "すでにアカウントをお持ちですか?", + "register.login": "ログイン", + "register.terms.prefix": "アカウントを作成することで、当社の", + "register.terms.link": "利用規約に同意したことになります", + + // ── Landing page ── + "landing.nav.whyUs": "選ばれる理由", + "landing.nav.formats": "対応形式", + "landing.nav.pricing": "料金", + "landing.nav.login": "ログイン", + "landing.nav.startFree": "無料で始める", + "landing.hero.badge": "新機能:PDF対応 + AI翻訳", + "landing.hero.title1": "ドキュメントを翻訳。", + "landing.hero.title2": "フォーマットは完璧に保持。", + "landing.hero.subtitle": "SmartArt、グラフ、目次、図形、ヘッダー&フッターを元のまま保持する唯一の翻訳ツール。チェックアウト時の驚きはありません。", + "landing.hero.cta": "無料で始める — 月2ファイル", + "landing.hero.seePlans": "プランを見る", + "landing.trust.filesDeleted": "60分後にファイルを削除", + "landing.trust.noBait": "不当な価格設定なし", + "landing.trust.preview": "支払い前にプレビュー", + "landing.why.title": "フォーマットを完璧に保持", + "landing.why.subtitle": "他の翻訳ツールはレイアウトを壊します。私たちは違います。", + "landing.why.smartart.title": "SmartArtと図形", + "landing.why.smartart.desc": "組織図、フローチャート、階層図 — すべてその場で翻訳。", + "landing.why.toc.title": "目次", + "landing.why.toc.desc": "目次の項目、ページ番号、相互参照がすべて正しく更新されます。", + "landing.why.charts.title": "グラフとチャート", + "landing.why.charts.desc": "タイトル、軸ラベル、凡例、系列名 — すべて翻訳されます。", + "landing.why.shapes.title": "図形とテキストボックス", + "landing.why.shapes.desc": "四角形、角丸ボックス、吹き出し — すべての図形内のテキストを見つけて翻訳します。", + "landing.why.headers.title": "ヘッダーとフッター", + "landing.why.headers.desc": "ページヘッダー、フッター、脚注テキストを見逃しません。", + "landing.why.languages.title": "130以上の言語", + "landing.why.languages.desc": "Google翻訳、DeepL、AIエンジンでプロ品質の翻訳を。", + "landing.pricing.title": "シンプルで正直な料金", + "landing.pricing.subtitle": "見たままの価格。翻訳後の隠し料金はありません。", + + "landing.ai.badge": "AI-Powered Translation Engine", + "landing.ai.title": "Translation that understands your craft", + "landing.ai.subtitle": "Our AI models analyze context, respect your terminology, and even translate text inside images.", + "landing.ai.context.title": "Industry Context", + "landing.ai.context.desc": "Describe your field and get tailored translations, not generic ones.", + "landing.ai.glossary.title": "Industry Glossaries", + "landing.ai.glossary.desc": "Define your technical terms for precise, domain-specific translations.", + "landing.ai.vision.title": "Image Vision", + "landing.ai.vision.desc": "Text embedded in images, diagrams and charts is detected and translated.", + "landing.ai.comparison.source": "Source (FR)", + "landing.ai.comparison.google": "Google Translate", + "landing.ai.comparison.ai": "Our AI", + "landing.howItWorks.title": "How it works", + "landing.howItWorks.subtitle": "Three steps. Zero formatting loss.", + "landing.howItWorks.step1.title": "Upload your file", + "landing.howItWorks.step1.desc": "Drag and drop your Excel, Word, PowerPoint or PDF document.", + "landing.howItWorks.step2.title": "Pick language and engine", + "landing.howItWorks.step2.desc": "Select target language and engine - standard or context-aware AI.", + "landing.howItWorks.step3.title": "Download the result", + "landing.howItWorks.step3.desc": "Get your translated document with formatting identical to the original.", "landing.pricing.monthly": "月額", + "landing.pricing.yearly": "年額", + "landing.pricing.starter.title": "Starter", + "landing.pricing.starter.desc": "個人や小規模プロジェクト向け", + "landing.pricing.starter.f1": "月50ドキュメント", + "landing.pricing.starter.f2": "1ドキュメント最大50ページ", + "landing.pricing.starter.f3": "Google翻訳 + DeepL", + "landing.pricing.starter.f4": "最大10 MBのファイル", + "landing.pricing.starter.cta": "始める", + "landing.pricing.pro.title": "Pro", + "landing.pricing.pro.badge": "一番人気", + "landing.pricing.pro.desc": "品質を求めるプロフェッショナル向け", + "landing.pricing.pro.f1": "月200ドキュメント", + "landing.pricing.pro.f2": "1ドキュメント最大200ページ", + "landing.pricing.pro.f3": "AI翻訳(DeepSeek)", + "landing.pricing.pro.f4": "Google + DeepL込み", + "landing.pricing.pro.f5": "カスタム用語集&プロンプト", + "landing.pricing.pro.f6": "優先サポート", + "landing.pricing.pro.cta": "Proを試す", + "landing.pricing.business.title": "Business", + "landing.pricing.business.desc": "大量のニーズを持つチーム向け", + "landing.pricing.business.f1": "月1,000ドキュメント", + "landing.pricing.business.f2": "1ドキュメント最大500ページ", + "landing.pricing.business.f3": "プレミアムAI(Claude)", + "landing.pricing.business.f4": "全プロバイダー + APIアクセス", + "landing.pricing.business.f5": "Webhookと自動化", + "landing.pricing.business.f6": "チームシート5席", + "landing.pricing.business.cta": "お問い合わせ", + "landing.pricing.honest": "表示された価格がお支払い金額です。翻訳後の隠し料金はありません。", + "landing.pricing.billedYearly": "年額請求", + "landing.pricing.perMonth": "/月", + "landing.formats.title": "すべての形式、すべての要素", + "landing.formats.subtitle": "他が見落とすものを翻訳します。", + "landing.formats.word": "Word (.docx)", + "landing.formats.word.f1": "段落と見出し", + "landing.formats.word.f2": "表とグラフ", + "landing.formats.word.f3": "SmartArt図", + "landing.formats.word.f4": "目次", + "landing.formats.word.f5": "ヘッダーとフッター", + "landing.formats.word.f6": "図形とテキストボックス", + "landing.formats.word.f7": "脚注と文末脚注", + "landing.formats.excel": "Excel (.xlsx)", + "landing.formats.excel.f1": "セルの値", + "landing.formats.excel.f2": "シート名", + "landing.formats.excel.f3": "グラフとラベル", + "landing.formats.excel.f4": "ヘッダーとフッター", + "landing.formats.excel.f5": "結合セルを保持", + "landing.formats.powerpoint": "PowerPoint (.pptx)", + "landing.formats.powerpoint.f1": "スライドテキストとノート", + "landing.formats.powerpoint.f2": "グラフと図", + "landing.formats.powerpoint.f3": "図形とテキストボックス", + "landing.formats.powerpoint.f4": "マスターレイアウト", + "landing.formats.powerpoint.f5": "アニメーションを保持", + "landing.formats.pdf": "PDF", + "landing.formats.pdf.f1": "テキストベースのPDF", + "landing.formats.pdf.f2": "レイアウトを保持", + "landing.formats.pdf.f3": "画像をそのまま保持", + "landing.formats.pdf.f4": "表を維持", + "landing.formats.pdf.f5": "DOCXまたはPDFで出力", + "landing.cta.title": "30秒で翻訳を開始", + "landing.cta.subtitle": "クレジットカード不要。2つのドキュメントを無料でお試しください。", + "landing.cta.button": "無料アカウント作成", + "landing.footer.privacy": "プライバシー", + "landing.footer.terms": "利用規約", + "landing.footer.contact": "お問い合わせ", + "login.signInToContinue": "Sign in to continue translating", + "login.email": "Email", + "login.emailPlaceholder": "you@example.com", + "login.password": "Password", + "login.forgotPassword": "Forgot password?", + "login.passwordPlaceholder": "••••••••", + "login.signingIn": "Signing in...", + "login.signIn": "Sign In", + "login.noAccount": "Don't have an account?", + "login.signUpFree": "Sign up for free", + "forgotPassword.enterEmail": "Please enter your email address", + "forgotPassword.error": "An error occurred", + "forgotPassword.title": "Forgot Password", + "forgotPassword.checkEmail": "Check your inbox", + "forgotPassword.subtitle": "Enter your email to receive a reset link", + "forgotPassword.sentMessage": "If an account exists with this address, a reset email has been sent.", + "forgotPassword.emailLabel": "Email address", + "forgotPassword.emailPlaceholder": "you@example.com", + "forgotPassword.sending": "Sending...", + "forgotPassword.sendLink": "Send reset link", + "forgotPassword.backToLogin": "Back to login", + "forgotPassword.loading": "Loading...", + "resetPassword.passwordRequirements": "Password must contain at least 8 characters, one uppercase, one lowercase, and one number", + "resetPassword.passwordMismatch": "Passwords do not match", + "resetPassword.tokenMissing": "Missing token. Please use the link received by email.", + "resetPassword.error": "An error occurred", + "resetPassword.invalidLink": "Invalid link", + "resetPassword.invalidLinkMessage": "This reset link is invalid. Please request a new one.", + "resetPassword.requestNewLink": "Request new link", + "resetPassword.successTitle": "Password reset", + "resetPassword.newPasswordTitle": "New password", + "resetPassword.successSubtitle": "You will be redirected to login", + "resetPassword.subtitle": "Set your new password", + "resetPassword.successMessage": "Your password has been successfully reset. You will be redirected to the login page.", + "resetPassword.newPassword": "New password", + "resetPassword.showPassword": "Show password", + "resetPassword.hidePassword": "Hide password", + "resetPassword.confirmPassword": "Confirm password", + "resetPassword.resetting": "Resetting...", + "resetPassword.resetPassword": "Reset password", + "resetPassword.backToLogin": "Back to login", + "resetPassword.loading": "Loading...", + + "common.loading": "読み込み中...", + "profile.header.title": "マイプロフィール", + "profile.header.subtitle": "アカウントと設定を管理します。", + "profile.tabs.account": "アカウント", + "profile.tabs.subscription": "サブスクリプション", + "profile.tabs.preferences": "設定", + "profile.account.user": "ユーザー", + "profile.account.memberSince": "登録日", + "profile.plan.label": "プラン", + "profile.plan.free": "Free", + "profile.plan.starter": "Starter", + "profile.plan.pro": "Pro", + "profile.plan.business": "Business", + "profile.plan.enterprise": "Enterprise", + "profile.plan.pricePerMonth": "{price} €/月", + "profile.subscription.canceling": "キャンセル中", + "profile.subscription.active": "有効", + "profile.subscription.unknown": "不明", + "profile.subscription.accessUntil": "アクセス可能期限", + "profile.subscription.renewalOn": "次回更新日", + "profile.subscription.upgradePlan": "有料プランにアップグレード", + "profile.subscription.changePlan": "プランを変更", + "profile.subscription.manageBilling": "支払い管理", + "profile.subscription.billingUnavailable": "支払いポータルは利用できません。", + "profile.subscription.billingError": "支払いポータルへのアクセス中にエラーが発生しました。", + "profile.subscription.cancelSuccess": "サブスクリプションがキャンセルされました。期間終了までアクセスできます。", + "profile.subscription.cancelError": "キャンセル中にエラーが発生しました。", + "profile.subscription.networkError": "ネットワークエラー。", + "profile.usage.title": "今月の使用量", + "profile.usage.resetOn": "リセット日", + "profile.usage.documents": "ドキュメント", + "profile.usage.pages": "ページ", + "profile.usage.extraCredits": "追加クレジット", + "profile.usage.extraCreditsPlural": "追加クレジット", + "profile.usage.quotaReached": "上限に達しました", + "profile.usage.quotaReachedDesc": "引き続きご利用いただくには、上位プランにアップグレードしてください。", + "profile.usage.unlockMore": "有料プランで翻訳数を増やせます。", + "profile.usage.viewPlans": "プランを見る", + "profile.usage.includedInPlan": "プランに含まれています", + "profile.danger.title": "危険区域", + "profile.danger.description": "キャンセルは現在の期間の終了時に反映されます。その日までアクセスは維持されます。", + "profile.danger.confirm": "本当によろしいですか?この操作は取り消せません。", + "profile.danger.confirmCancel": "キャンセルを確認", + "profile.danger.cancelSubscription": "サブスクリプションをキャンセルする", + "profile.danger.keep": "いいえ、維持します", + "profile.prefs.interfaceLang": "インターフェース言語", + "profile.prefs.interfaceLangDesc": "言語はブラウザに基づいて自動検出されます。手動で変更することもできます。", + "profile.prefs.defaultTargetLang": "デフォルトの翻訳先言語", + "profile.prefs.selectLanguage": "言語を選択", + "profile.prefs.defaultTargetLangDesc": "この言語が翻訳時に自動選択されます。", + "profile.prefs.save": "保存", + "profile.prefs.theme": "テーマ", + "profile.prefs.themeDesc": "インターフェースの外観を選択してください", + "profile.prefs.cache": "キャッシュ", + "profile.prefs.cacheDesc": "ローカルキャッシュをクリアすると、一部の表示問題が解決する場合があります。", + "profile.prefs.clearing": "クリア中...", + "profile.prefs.clearCache": "キャッシュをクリア", + "settings.title": "設定", + "settings.subtitle": "アプリケーションの全般設定", + "settings.formats.title": "対応フォーマット", + "settings.formats.subtitle": "翻訳可能なドキュメントの種類", + "settings.formats.formulas": "数式", + "settings.formats.styles": "スタイル", + "settings.formats.images": "画像", + "settings.formats.headers": "ヘッダー", + "settings.formats.tables": "テーブル", + "settings.formats.slides": "スライド", + "settings.formats.notes": "ノート", + "settings.cache.title": "キャッシュ", + "settings.cache.desc": "ローカルキャッシュをクリアすると、一部の表示問題が解決する場合があります。", + "settings.cache.clearing": "クリア中...", + "settings.cache.clear": "キャッシュをクリア", + "services.title": "翻訳プロバイダー", + "services.subtitle": "プロバイダーは管理者によって設定されます。現在アカウントで利用可能なプロバイダーを確認できます。", + "services.loading": "プロバイダーを読み込み中...", + "services.noProviders": "現在設定されているプロバイダーはありません。管理者にお問い合わせください。", + "services.classic": "クラシック翻訳", + "services.llmPro": "LLM · コンテキスト認識 (Pro)", + "services.available": "利用可能", + "services.model": "モデル", + "services.adminOnly.title": "プロバイダーの設定は管理者のみ", + "services.adminOnly.desc": "APIキー、モデルの選択、プロバイダーの有効化は管理者が管理パネルで管理します。APIキーを入力する必要はありません。", + "apiKeys.title": "APIキー", + "apiKeys.subtitle": "翻訳APIへのプログラムアクセス用APIキーを管理します。", + "apiKeys.loading": "読み込み中...", + "apiKeys.sectionTitle": "API & 自動化", + "apiKeys.sectionDesc": "自動化ワークフロー用のAPIキーを生成・管理します", + "apiKeys.keysUsed": "{max} 個中 {total} 個使用", + "apiKeys.maxReached": "キーの上限に達しました。新しいキーを生成するには既存のキーを取り消してください。", + "apiKeys.canGenerate": "あと {count} 個のキーを生成できます", + "apiKeys.canGeneratePlural": "あと {count} 個のキーを生成できます", + "apiKeys.generateNew": "新しいキーを生成", + "apiKeys.keyRevoked": "キーが取り消されました", + "apiKeys.keyRevokedDesc": "APIキーは正常に取り消されました。", + "apiKeys.keyNotFound": "キーが見つかりません", + "apiKeys.keyNotFoundDesc": "APIキーは存在しません。既に取り消されている可能性があります。", + "apiKeys.error": "エラー", + "apiKeys.revokeError": "APIキーの取り消しに失敗しました。もう一度お試しください。", + "apiKeys.limitReached": "上限に達しました", + "apiKeys.limitReachedDesc": "APIキーは最大10個までです。新しいキーを生成するには既存のキーを取り消してください。", + "apiKeys.proRequired": "Pro機能が必要です", + "apiKeys.proRequiredDesc": "APIキーはPro機能です。アカウントをアップグレードしてください。", + "apiKeys.generateError": "APIキーの生成に失敗しました。もう一度お試しください。", + "apiKeys.upgrade.title": "APIキー", + "apiKeys.upgrade.subtitle": "APIアクセスで翻訳を自動化", + "apiKeys.upgrade.feat1": "無制限のAPIキーを生成", + "apiKeys.upgrade.feat2": "ドキュメント翻訳を自動化", + "apiKeys.upgrade.feat3": "Webhook通知", + "apiKeys.upgrade.feat4": "LLM翻訳モード", + "apiKeys.upgrade.proFeature": "APIキーは{pro}機能です。アップグレードしてAPI自動化を有効にしてください。", + "apiKeys.upgrade.pro": "Pro", + "apiKeys.upgrade.cta": "Proにアップグレード", + "apiKeys.dialog.maxTitle": "キーの上限に達しました", + "apiKeys.dialog.maxDesc": "APIキーは最大10個までです。新しいキーを生成する前に既存のキーを取り消してください。", + "apiKeys.dialog.close": "閉じる", + "apiKeys.dialog.generated": "APIキーが生成されました!", + "apiKeys.dialog.generatedDesc": "新しいAPIキーが作成されました。今すぐコピーしてください - 再度表示されることはありません。", + "apiKeys.dialog.important": "重要:", + "apiKeys.dialog.importantDesc": "このキーが表示されるのは今回のみです。安全に保管してください。", + "apiKeys.dialog.apiKey": "APIキー", + "apiKeys.dialog.name": "名前:", + "apiKeys.dialog.done": "完了", + "apiKeys.dialog.copied": "キーをコピーしました", + "apiKeys.dialog.generateTitle": "新しいAPIキーを生成", + "apiKeys.dialog.generateDesc": "翻訳APIへのプログラムアクセス用の新しいAPIキーを作成します。", + "apiKeys.dialog.keyName": "キー名(オプション)", + "apiKeys.dialog.keyNamePlaceholder": "例:本番環境、ステージング", + "apiKeys.dialog.keyNameHint": "後でこのキーを識別するためのわかりやすい名前。", + "apiKeys.dialog.nameTooLong": "名前は{max}文字以内で入力してください", + "apiKeys.dialog.nameInvalid": "名前に使用できるのは文字、数字、スペース、ハイフン、アンダースコアのみです", + "apiKeys.dialog.cancel": "キャンセル", + "apiKeys.dialog.generating": "生成中...", + "apiKeys.dialog.generate": "キーを生成", + "apiKeys.table.name": "名前", + "apiKeys.table.prefix": "プレフィックス", + "apiKeys.table.created": "作成日", + "apiKeys.table.lastUsed": "最終使用日", + "apiKeys.table.never": "未使用", + "apiKeys.table.actions": "操作", + "apiKeys.table.revoke": "取り消し", + "apiKeys.table.copyPrefix": "キーのプレフィックスをコピー", + "apiKeys.table.revokeKey": "キーを取り消し", + "apiKeys.revokeDialog.title": "APIキーを取り消し", + "apiKeys.revokeDialog.desc": "キー「{name}」を取り消してもよろしいですか?この操作は取り消せません。", + "apiKeys.revokeDialog.confirm": "はい、取り消します", + "apiKeys.revokeDialog.cancel": "キャンセル", + "context.proTitle": "Pro機能", + "context.proDesc": "コンテキストとプロフェッショナル用語集はPro、Business、Enterpriseプランでご利用いただけます。ドメイン固有の指示と語彙により、より正確な翻訳が提供されます。", + "context.viewPlans": "プランを見る", + "context.title": "コンテキスト & 用語集", + "context.subtitle": "ドメイン固有の指示と語彙で翻訳品質を向上させます。", + "context.presets.title": "プロフェッショナル用語集", + "context.presets.desc": "指示と専門用語を含む完全な用語集を読み込みます", + "context.instructions.title": "コンテキスト指示", + "context.instructions.desc": "翻訳中にAIが従う指示", + "context.instructions.placeholder": "例:HVAC技術文書を翻訳します。正確な工学用語を使用してください...", + "context.glossary.title": "技術用語集", + "context.glossary.desc": "形式:source=target(1行に1つ)。プリセットで読み込んだ用語集は編集可能です。", + "context.glossary.terms": "用語集の用語数", + "context.clearAll": "すべてクリア", + "context.saving": "保存中...", + "context.save": "保存", + "admin.login.title": "管理画面", + "admin.login.required": "ログインが必要です", + "admin.login.password": "管理者パスワード", + "admin.login.connecting": "接続中...", + "admin.login.access": "管理画面にアクセス", + "admin.login.restricted": "管理者のみアクセス可能", + "admin.layout.checking": "認証を確認中...", + "admin.dashboard.title": "管理ダッシュボード", + "admin.dashboard.subtitle": "管理者コントロールパネル", + "admin.dashboard.refresh": "更新", + "admin.dashboard.refreshTooltip": "ダッシュボードデータを更新", + "admin.dashboard.config": "システム設定", + "admin.dashboard.maxFileSize": "最大ファイルサイズ:", + "admin.dashboard.translationService": "翻訳サービス:", + "admin.dashboard.formats": "対応形式:", + "admin.nav.dashboard": "Dashboard", + "admin.nav.users": "ユーザー", + "admin.nav.pricing": "料金と Stripe", + "admin.nav.providers": "プロバイダー", + "admin.nav.system": "システム", + "admin.nav.logs": "ログ", + "admin.users.title": "ユーザー管理", + "admin.users.subtitle": "ユーザーアカウントの表示と管理", + "admin.users.planUpdated": "プランが更新されました", + "admin.users.planChanged": "プランが「{plan}」に正常に変更されました。", + "admin.users.unknownError": "不明なエラー", + "admin.users.error": "エラー", + "admin.users.planUpdateError": "プランを更新できません:{message}", + "admin.users.noKeys": "キーなし", + "admin.users.noKeysDesc": "このユーザーにはアクティブなAPIキーがありません。", + "admin.users.keysRevoked": "キーが取り消されました", + "admin.users.keysRevokedDesc": "{count}件のAPIキーが正常に取り消されました。", + "admin.users.revokeError": "キーを取り消せません:{message}", + "admin.users.retry": "再試行", + "admin.system.title": "システム", + "admin.system.subtitle": "システム状態の監視とリソース管理", + "admin.system.quotas": "翻訳枠", + "admin.system.resetQuotas": "月間枠をリセット", + "admin.system.resetting": "リセット中...", + "admin.system.reset": "リセット", + "admin.system.allOperational": "すべてのシステムが正常稼働中", + "admin.system.issuesDetected": "システムに問題が検出されました", + "admin.system.waitingData": "データを待機中...", + "admin.system.purging": "パージ中...", + "admin.system.clean": "クリーン", + "admin.system.purge": "パージ", + }, + // ═══════════════════════════════════════════════════════════════ + // KOREAN (ko) + // ═══════════════════════════════════════════════════════════════ + ko: { + "auth.brandName": "Office Translator", + "dashboard.nav.translate": "번역", + "dashboard.nav.profile": "내 프로필", + "dashboard.nav.settings": "설정", + "dashboard.nav.context": "컨텍스트", + "dashboard.nav.services": "서비스", + "dashboard.nav.apiKeys": "API 키", + "dashboard.nav.glossaries": "용어집", + "dashboard.header.title": "대시보드", + "dashboard.header.subtitle": "번역 관리", + "dashboard.header.toggleMenu": "메뉴", + "dashboard.header.profileTitle": "내 프로필", + "dashboard.sidebar.theme": "테마", + "dashboard.sidebar.signOut": "로그아웃", + "dashboard.sidebar.backHome": "홈으로 돌아가기", + "dashboard.translate.pageTitle": "문서 번역", + "dashboard.translate.pageSubtitle": "파일을 가져오고 대상 언어를 선택하세요", + "dashboard.translate.errorNotificationTitle": "오류", + "dashboard.translate.dropzone.uploadAria": "파일 드롭 영역", + "dashboard.translate.dropzone.title": "여기에 파일을 드래그 앤 드롭하세요", + "dashboard.translate.dropzone.subtitle": "또는 클릭하여 선택 (DOCX, XLSX, PPTX, PDF)", + "dashboard.translate.dropzone.replaceFile": "파일 교체", + "dashboard.translate.language.source": "원본 언어", + "dashboard.translate.language.target": "대상 언어", + "dashboard.translate.language.loading": "언어 로딩 중…", + "dashboard.translate.language.autoDetect": "자동 감지", + "dashboard.translate.language.selectPlaceholder": "선택…", + "dashboard.translate.language.loadErrorPrefix": "언어 로딩 실패", + "dashboard.translate.provider.loading": "제공업체 로딩 중…", + "dashboard.translate.provider.noneConfigured": "구성된 제공업체 없음", + "dashboard.translate.provider.modelTitle": "모델", + "dashboard.translate.provider.sectionTitle": "제공업체", + "dashboard.translate.provider.llmDivider": "AI · 문맥 인식", + "dashboard.translate.provider.llmDividerPro": "AI · 문맥 인식 (Pro)", + "dashboard.translate.provider.upgrade": "Pro로 업그레이드", + "dashboard.translate.provider.upgradeSuffix": "AI 번역 잠금 해제", + "dashboard.translate.trust.zeroRetention": "데이터 미보관", + "dashboard.translate.trust.deletedAfter": "처리 후 파일 삭제", + "dashboard.translate.actions.uploading": "업로드 중…", + "dashboard.translate.actions.translate": "번역", + "dashboard.translate.actions.filePrefix": "파일: ", + "dashboard.translate.actions.cancel": "취소", + "dashboard.translate.actions.tryAgain": "다시 시도", + "dashboard.translate.steps.uploading": "파일 업로드 중…", + "dashboard.translate.steps.starting": "번역 시작 중…", + "dashboard.translate.complete.title": "번역 완료!", + "dashboard.translate.complete.descNamed": "파일 {name}의 번역이 성공적으로 완료되었습니다.", + "dashboard.translate.complete.descGeneric": "파일의 번역이 성공적으로 완료되었습니다.", + "dashboard.translate.complete.downloading": "다운로드 중…", + "dashboard.translate.complete.download": "다운로드", + "dashboard.translate.complete.newTranslation": "새 번역", + "dashboard.translate.complete.toastOkTitle": "성공", + "dashboard.translate.complete.toastFailTitle": "실패", + "dashboard.translate.complete.toastFailDesc": "번역에 실패했습니다. 다시 시도해 주세요.", + "dashboard.translate.sourceDocument": "원본 문서", + "dashboard.translate.configuration": "설정", + "dashboard.translate.translating": "번역 진행 중", + "dashboard.translate.liveMonitor": "실시간 모니터", + "dashboard.translate.summary": "요약", + "dashboard.translate.engine": "엔진", + "dashboard.translate.confidence": "신뢰도", + "dashboard.translate.cancel": "취소", + "dashboard.translate.segments": "세그먼트", + "dashboard.translate.characters": "문자", + "dashboard.translate.elapsed": "경과", + "dashboard.translate.segPerMin": "세그/분", + "dashboard.translate.highQuality": "고품질", + "dashboard.translate.quality": "품질", + "dashboard.translate.completed": "번역 완료", + "dashboard.translate.replace": "교체", + "dashboard.translate.pdfMode.title": "PDF 번역 모드", + "dashboard.translate.pdfMode.preserveLayout": "레이아웃 유지", + "dashboard.translate.pdfMode.textOnly": "텍스트만", + "dashboard.translate.pdfMode.preserveLayoutDesc": "이미지, 표 및 서식을 유지합니다. 간단한 PDF에 적합.", + "dashboard.translate.pdfMode.textOnlyDesc": "모든 텍스트를 완벽하게 번역합니다. 깔끔한 출력, 레이아웃 문제 없음.", + "dashboard.translate.pipeline.upload": "업로드", + "dashboard.translate.pipeline.analyze": "분석", + "dashboard.translate.pipeline.translate": "번역", + "dashboard.translate.pipeline.rebuild": "재구성", + "dashboard.translate.pipeline.finalize": "완료", + "dashboard.translate.progress.failedTitle": "번역 실패", + "glossaries.dialog.title": "새 용어집", + "glossaries.dialog.description": "번역을 위한 용어집을 만드세요", + "glossaries.dialog.nameLabel": "이름", + "glossaries.dialog.namePlaceholder": "내 용어집", + "glossaries.dialog.tabTemplates": "템플릿", + "glossaries.dialog.tabFile": "파일", + "glossaries.dialog.tabManual": "수동", + "glossaries.dialog.cancel": "취소", + "glossaries.dialog.creating": "생성 중…", + "glossaries.dialog.importing": "가져오는 중…", + "glossaries.dialog.importBtn": "가져오기", + "glossaries.dialog.selectPrompt": "선택", + "glossaries.dialog.createBtn": "생성", + "glossaries.dialog.createEmpty": "빈 용어집 생성", + "glossaries.dialog.terms": "개 용어", + "glossaries.dialog.templatesDesc": "미리 정의된 템플릿을 선택하세요", + "glossaries.dialog.templatesEmpty": "사용 가능한 템플릿이 없습니다", + "glossaries.dialog.dropTitle": "CSV 파일을 여기로 드래그하세요", + "glossaries.dialog.dropOr": "또는", + "glossaries.dialog.dropFormats": "CSV, TSV, TXT", + "glossaries.dialog.formatTitle": "형식", + "glossaries.dialog.formatDesc": "원본,대상 (한 줄에 하나씩)", + "glossaries.dialog.formatNote": "헤더가 감지되면 첫 줄은 건너뜁니다", + "glossaries.dialog.errorFormat": "지원되지 않는 형식", + "glossaries.dialog.errorSize": "파일이 너무 큽니다", + "glossaries.dialog.errorEmpty": "빈 파일", + "glossaries.dialog.errorRead": "읽기 오류", + "glossaries.dialog.parsing": "구문 분석 중…", + "glossaries.dialog.termsImported": "개 용어 가져옴", + "glossaries.dialog.changeFile": "파일 변경", + "glossaries.dialog.retry": "다시 시도", + "pricing.nav.back": "뒤로", + "pricing.nav.home": "홈", + "pricing.nav.mySubscription": "내 구독", + "pricing.header.badge": "AI 모델 업데이트 — 2026년 3월", + "pricing.header.title": "모든 요구에 맞는 플랜", + "pricing.header.subtitle": "원본 레이아웃을 유지하면서 Word, Excel, PowerPoint 문서를 번역하세요. API 키 불필요.", + "pricing.billing.monthly": "월간", + "pricing.billing.yearly": "연간", + "pricing.plans.free.name": "무료", + "pricing.plans.starter.name": "Starter", + "pricing.plans.pro.name": "Pro", + "pricing.plans.business.name": "Business", + "pricing.plans.enterprise.name": "Enterprise", + "pricing.plans.free.description": "앱을 체험하기에 완벽", + "pricing.plans.starter.description": "개인 및 소규모 프로젝트용", + "pricing.plans.pro.description": "전문가 및 성장 중인 팀용", + "pricing.plans.business.description": "팀 및 조직용", + "pricing.plans.enterprise.description": "대규모 조직을 위한 맞춤 솔루션", + "pricing.plans.pro.highlight": "가장 인기", + "pricing.plans.pro.badge": "인기", + "pricing.plans.enterprise.badge": "문의 필요", + "pricing.plans.free.feat1": "월 5개 문서", + "pricing.plans.free.feat2": "문서당 최대 15페이지", + "pricing.plans.free.feat3": "Google 번역 포함", + "pricing.plans.free.feat4": "모든 언어 (130+)", + "pricing.plans.free.feat5": "커뮤니티 지원", + "pricing.plans.starter.feat1": "월 50개 문서", + "pricing.plans.starter.feat2": "문서당 최대 50페이지", + "pricing.plans.starter.feat3": "Google 번역 + DeepL", + "pricing.plans.starter.feat4": "최대 10 MB 파일", + "pricing.plans.starter.feat5": "이메일 지원", + "pricing.plans.starter.feat6": "30일 기록", + "pricing.plans.pro.feat1": "월 200개 문서", + "pricing.plans.pro.feat2": "문서당 최대 200페이지", + "pricing.plans.pro.feat3": "에센셜 AI 번역 (DeepSeek V3.2)", + "pricing.plans.pro.feat4": "Google 번역 + DeepL", + "pricing.plans.pro.feat5": "최대 25 MB 파일", + "pricing.plans.pro.feat6": "사용자 지정 용어집", + "pricing.plans.pro.feat7": "우선 지원", + "pricing.plans.pro.feat8": "90일 기록", + "pricing.plans.business.feat1": "월 1,000개 문서", + "pricing.plans.business.feat2": "문서당 최대 500페이지", + "pricing.plans.business.feat3": "에센셜 + 프리미엄 AI (Claude Haiku)", + "pricing.plans.business.feat4": "모든 번역 제공업체", + "pricing.plans.business.feat5": "최대 50 MB 파일", + "pricing.plans.business.feat6": "API 액세스 (월 10,000회 호출)", + "pricing.plans.business.feat7": "알림 웹훅", + "pricing.plans.business.feat8": "전담 지원", + "pricing.plans.business.feat9": "1년 기록", + "pricing.plans.business.feat10": "고급 분석", + "pricing.plans.enterprise.feat1": "무제한 문서", + "pricing.plans.enterprise.feat2": "모든 AI 모델 (GPT-5, Claude Opus 4.6…)", + "pricing.plans.enterprise.feat3": "온프레미스 또는 전용 클라우드 배포", + "pricing.plans.enterprise.feat4": "99.9% SLA 보장", + "pricing.plans.enterprise.feat5": "24/7 전담 지원", + "pricing.plans.enterprise.feat6": "화이트라벨", + "pricing.plans.enterprise.feat7": "무제한 팀", + "pricing.plans.enterprise.feat8": "맞춤 연동", + "pricing.card.onRequest": "문의 필요", + "pricing.card.free": "무료", + "pricing.card.perMonth": "/월", + "pricing.card.billedYearly": "연 {price} € 청구", + "pricing.card.documents": "문서", + "pricing.card.pagesMax": "최대 페이지", + "pricing.card.aiTranslation": "AI 번역", + "pricing.card.unlimited": "무제한", + "pricing.card.perMonthStat": "/ 월", + "pricing.card.perDoc": "p / 문서", + "pricing.card.aiEssential": "에센셜", + "pricing.card.aiEssentialPremium": "에센셜 + 프리미엄", + "pricing.card.aiCustom": "맞춤", + "pricing.card.myPlan": "내 플랜", + "pricing.card.managePlan": "플랜 관리", + "pricing.card.startFree": "무료로 시작", + "pricing.card.contactUs": "문의하기", + "pricing.card.choosePlan": "이 플랜 선택", + "pricing.card.processing": "처리 중…", + "pricing.comparison.title": "상세 비교", + "pricing.comparison.subtitle": "각 플랜에 포함된 모든 기능", + "pricing.comparison.feature": "기능", + "pricing.comparison.docsPerMonth": "문서 / 월", + "pricing.comparison.pagesMaxPerDoc": "최대 페이지 / 문서", + "pricing.comparison.maxFileSize": "최대 파일 크기", + "pricing.comparison.googleTranslation": "Google 번역", + "pricing.comparison.deepl": "DeepL", + "pricing.comparison.aiEssential": "에센셜 AI 번역", + "pricing.comparison.aiPremium": "프리미엄 AI 번역", + "pricing.comparison.apiAccess": "API 액세스", + "pricing.comparison.priorityProcessing": "우선 처리", + "pricing.comparison.support": "지원", + "pricing.comparison.support.community": "커뮤니티", + "pricing.comparison.support.email": "이메일", + "pricing.comparison.support.priority": "우선", + "pricing.comparison.support.dedicated": "전담", + "pricing.comparison.mb": "MB", + "pricing.credits.title": "추가 크레딧", + "pricing.credits.subtitle": "더 필요하세요? 구독 없이 크레딧을 개별 구매하세요.", + "pricing.credits.perPage": "1 크레딧 = 1번역 페이지.", + "pricing.credits.bestValue": "최고 가성비", + "pricing.credits.unit": "크레딧", + "pricing.credits.centsPerCredit": "센트 / 크레딧", + "pricing.credits.buy": "구매", + "pricing.trust.encryption.title": "종단간 암호화", + "pricing.trust.encryption.sub": "TLS 1.3 + AES-256 (저장 시)", + "pricing.trust.languages.title": "130+개 언어", + "pricing.trust.languages.sub": "아랍어, 페르시아어, 히브리어 (RTL) 포함", + "pricing.trust.parallel.title": "병렬 처리", + "pricing.trust.parallel.sub": "초고속 멀티스레드 AI", + "pricing.trust.availability.title": "24/7 이용 가능", + "pricing.trust.availability.sub": "99.9% 가동 보장", + "pricing.aiModels.title": "AI 모델 — 2026년 3월", + "pricing.aiModels.essential.title": "에센셜 AI 번역", + "pricing.aiModels.essential.plan": "Pro 플랜", + "pricing.aiModels.essential.descPrefix": "기반:", + "pricing.aiModels.essential.descSuffix": "— 2026년 가장 비용 효율적인 AI 모델. 프론티어 모델과 동등한 품질을 50분의 1 비용으로 제공.", + "pricing.aiModels.essential.context": "163K 토큰 컨텍스트", + "pricing.aiModels.essential.value": "우수한 가성비", + "pricing.aiModels.premium.title": "프리미엄 AI 번역", + "pricing.aiModels.premium.plan": "Business 플랜", + "pricing.aiModels.premium.descPrefix": "기반:", + "pricing.aiModels.premium.descSuffix": "Anthropic사 제품 — 법률, 의료 및 복잡한 기술 문서에서 높은 정확도.", + "pricing.aiModels.premium.context": "200K 토큰 컨텍스트", + "pricing.aiModels.premium.precision": "최고 정확도", + "pricing.faq.title": "자주 묻는 질문", + "pricing.faq.q1": "언제든지 플랜을 변경할 수 있나요?", + "pricing.faq.a1": "네. 업그레이드는 즉시 적용되며 일할 계산됩니다. 다운그레이드는 현재 기간 종료 시 적용됩니다.", + "pricing.faq.q2": "「에센셜 AI 번역」이란 무엇인가요?", + "pricing.faq.a2": "OpenRouter를 통한 DeepSeek V3.2 기반 AI 엔진입니다. 문서의 컨텍스트를 이해하고, 레이아웃을 유지하며, 전문 용어를 기존 번역보다 훨씬 정확하게 처리합니다.", + "pricing.faq.q3": "에센셜 AI와 프리미엄 AI의 차이점은 무엇인가요?", + "pricing.faq.a3": "에센셜 AI는 DeepSeek V3.2를 사용 (우수한 가성비). 프리미엄 AI는 Anthropic의 Claude 3.5 Haiku를 사용하여 법률, 의료 및 복잡한 기술 문서에서 더 높은 정확도를 제공합니다.", + "pricing.faq.q4": "번역 후 문서가 보관되나요?", + "pricing.faq.a4": "번역된 파일은 플랜에 따라 이용 가능합니다 (Starter 30일, Pro 90일, Business 1년). 저장 시 및 전송 중 암호화됩니다.", + "pricing.faq.q5": "월간 할당량을 초과하면 어떻게 되나요?", + "pricing.faq.a5": "추가 크레딧을 개별 구매하거나 플랜을 업그레이드할 수 있습니다. 사용량이 80%에 도달하면 알림을 받습니다.", + "pricing.faq.q6": "유료 플랜의 무료 체험이 있나요?", + "pricing.faq.a6": "무료 플랜은 영구적이며 신용카드가 필요 없습니다. Pro 및 Business 플랜의 경우 14일 체험을 위해 문의해 주세요.", + "pricing.faq.q7": "어떤 파일 형식을 지원하나요?", + "pricing.faq.a7": "Word (.docx), Excel (.xlsx/.xls), PowerPoint (.pptx), 그리고 곧 PDF. 모든 플랜에서 동일한 형식을 지원합니다.", + "pricing.cta.title": "시작할 준비가 되셨나요?", + "pricing.cta.subtitle": "신용카드 없이 무료로 시작하세요. 필요할 때 업그레이드하세요.", + "pricing.cta.createAccount": "무료 계정 만들기", + "pricing.cta.login": "로그인", + "pricing.toast.demo": "데모 모드 — Stripe가 아직 구성되지 않았습니다. 프로덕션에서는 결제 페이지로 리디렉션되어 {planId} 플랜을 활성화합니다.", + "pricing.toast.networkError": "네트워크 오류. 다시 시도해 주세요.", + "pricing.toast.paymentError": "결제 생성 중 오류가 발생했습니다.", + "register.title": "계정 만들기", + "register.subtitle": "무료로 번역 시작", + "register.error.failed": "가입 실패", + "register.name.label": "이름", + "register.name.placeholder": "이름을 입력하세요", + "register.name.error": "이름은 최소 2자 이상이어야 합니다", + "register.email.label": "이메일 주소", + "register.email.placeholder": "you@example.com", + "register.email.error": "유효하지 않은 이메일 주소", + "register.password.label": "비밀번호", + "register.password.error": "비밀번호는 8자 이상이며 대문자, 소문자, 숫자를 각각 하나 이상 포함해야 합니다", + "register.password.show": "비밀번호 표시", + "register.password.hide": "비밀번호 숨기기", + "register.password.strengthLabel": "강도:", + "register.password.strength.weak": "약함", + "register.password.strength.medium": "보통", + "register.password.strength.strong": "강함", + "register.confirmPassword.label": "비밀번호 확인", + "register.confirmPassword.error": "비밀번호가 일치하지 않습니다", + "register.confirmPassword.show": "표시", + "register.confirmPassword.hide": "숨기기", + "register.submit.creating": "계정 생성 중...", + "register.submit.create": "계정 만들기", + "register.hasAccount": "이미 계정이 있으신가요?", + "register.login": "로그인", + "register.terms.prefix": "계정을 만들면 당사의", + "register.terms.link": "서비스 약관에 동의하게 됩니다", + + // ── Landing page ── + "landing.nav.whyUs": "왜 우리인가", + "landing.nav.formats": "지원 형식", + "landing.nav.pricing": "가격", + "landing.nav.login": "로그인", + "landing.nav.startFree": "무료로 시작", + "landing.ai.badge": "AI-Powered Translation Engine", + "landing.ai.title": "Translation that understands your craft", + "landing.ai.subtitle": "Our AI models analyze context, respect your terminology, and even translate text inside images.", + "landing.ai.context.title": "Industry Context", + "landing.ai.context.desc": "Describe your field and get tailored translations, not generic ones.", + "landing.ai.glossary.title": "Industry Glossaries", + "landing.ai.glossary.desc": "Define your technical terms for precise, domain-specific translations.", + "landing.ai.vision.title": "Image Vision", + "landing.ai.vision.desc": "Text embedded in images, diagrams and charts is detected and translated.", + "landing.ai.comparison.source": "Source (FR)", + "landing.ai.comparison.google": "Google Translate", + "landing.ai.comparison.ai": "Our AI", + "landing.howItWorks.title": "How it works", + "landing.howItWorks.subtitle": "Three steps. Zero formatting loss.", + "landing.howItWorks.step1.title": "Upload your file", + "landing.howItWorks.step1.desc": "Drag and drop your Excel, Word, PowerPoint or PDF document.", + "landing.howItWorks.step2.title": "Pick language and engine", + "landing.howItWorks.step2.desc": "Select target language and engine - standard or context-aware AI.", + "landing.howItWorks.step3.title": "Download the result", + "landing.howItWorks.step3.desc": "Get your translated document with formatting identical to the original.", + "landing.hero.badge": "새소식: PDF 지원 + AI 번역", + "landing.hero.title1": "문서를 번역하세요.", + "landing.hero.title2": "서식을 완벽하게 유지하세요.", + "landing.hero.subtitle": "SmartArt, 차트, 목차, 도형, 머리글 및 바닥글을 원래 그대로 보존하는 유일한 번역기입니다. 결제 시 놀라운 일은 없습니다.", + "landing.hero.cta": "무료 시작 — 월 2개 문서", + "landing.hero.seePlans": "플랜 보기", + "landing.trust.filesDeleted": "60분 후 파일 삭제", + "landing.trust.noBait": "미끼 가격 없음", + "landing.trust.preview": "결제 전 미리보기", + "landing.why.title": "서식을 완벽하게 보존", + "landing.why.subtitle": "다른 번역기는 레이아웃을 망칩니다. 우리는 다릅니다.", + "landing.why.smartart.title": "SmartArt 및 다이어그램", + "landing.why.smartart.desc": "조직도, 순서도, 계층 구조 — 모두 제자리에서 번역됩니다.", + "landing.why.toc.title": "목차", + "landing.why.toc.desc": "목차 항목, 페이지 번호, 상호 참조가 모두 올바르게 업데이트됩니다.", + "landing.why.charts.title": "차트 및 그래프", + "landing.why.charts.desc": "제목, 축 레이블, 범례, 계열 이름 — 모든 것이 번역됩니다.", + "landing.why.shapes.title": "도형 및 텍스트 상자", + "landing.why.shapes.desc": "사각형, 둥근 상자, 설명선 — 모든 도형 안의 텍스트를 찾아 번역합니다.", + "landing.why.headers.title": "머리글 및 바닥글", + "landing.why.headers.desc": "페이지 머리글, 바닥글, 각주 텍스트는 절대 누락되지 않습니다.", + "landing.why.languages.title": "130개 이상의 언어", + "landing.why.languages.desc": "Google 번역, DeepL 및 AI 엔진으로 전문적인 품질을 제공합니다.", + "landing.pricing.title": "간단하고 투명한 요금", + "landing.pricing.subtitle": "보이는 가격이 지불하실 금액입니다. 번역 후 숨겨진 비용이 없습니다.", + "landing.pricing.monthly": "월간", + "landing.pricing.yearly": "연간", + "landing.pricing.starter.title": "Starter", + "landing.pricing.starter.desc": "개인 및 소규모 프로젝트용", + "landing.pricing.starter.f1": "월 50개 문서", + "landing.pricing.starter.f2": "문서당 최대 50페이지", + "landing.pricing.starter.f3": "Google 번역 + DeepL", + "landing.pricing.starter.f4": "최대 10 MB 파일", + "landing.pricing.starter.cta": "시작하기", + "landing.pricing.pro.title": "Pro", + "landing.pricing.pro.badge": "가장 인기", + "landing.pricing.pro.desc": "품질이 필요한 전문가용", + "landing.pricing.pro.f1": "월 200개 문서", + "landing.pricing.pro.f2": "문서당 최대 200페이지", + "landing.pricing.pro.f3": "AI 번역 (DeepSeek)", + "landing.pricing.pro.f4": "Google + DeepL 포함", + "landing.pricing.pro.f5": "사용자 지정 용어집 및 프롬프트", + "landing.pricing.pro.f6": "우선 지원", + "landing.pricing.pro.cta": "Pro 체험", + "landing.pricing.business.title": "Business", + "landing.pricing.business.desc": "대용량이 필요한 팀용", + "landing.pricing.business.f1": "월 1,000개 문서", + "landing.pricing.business.f2": "문서당 최대 500페이지", + "landing.pricing.business.f3": "프리미엄 AI (Claude)", + "landing.pricing.business.f4": "모든 제공업체 + API 액세스", + "landing.pricing.business.f5": "웹훅 및 자동화", + "landing.pricing.business.f6": "팀 시트 5석", + "landing.pricing.business.cta": "문의하기", + "landing.pricing.honest": "표시된 가격이 지불하실 금액입니다. 번역 후 숨겨진 요금이 없습니다.", + "landing.pricing.billedYearly": "연간 청구", + "landing.pricing.perMonth": "/월", + "landing.formats.title": "모든 형식, 모든 요소", + "landing.formats.subtitle": "우리는 다른 번역기가 놓치는 것까지 번역합니다.", + "landing.formats.word.f1": "단락 및 제목", + "landing.formats.word.f2": "표 및 차트", + "landing.formats.word.f3": "SmartArt 다이어그램", + "landing.formats.word.f4": "목차", + "landing.formats.word.f5": "머리글 및 바닥글", + "landing.formats.word.f6": "도형 및 텍스트 상자", + "landing.formats.word.f7": "각주 및 미주", + "landing.formats.excel": "Excel (.xlsx)", + "landing.formats.excel.f1": "셀 값", + "landing.formats.excel.f2": "시트 이름", + "landing.formats.excel.f3": "차트 및 레이블", + "landing.formats.excel.f4": "머리글 및 바닥글", + "landing.formats.excel.f5": "병합된 셀 유지", + "landing.formats.powerpoint": "PowerPoint (.pptx)", + "landing.formats.powerpoint.f1": "슬라이드 텍스트 및 메모", + "landing.formats.powerpoint.f2": "차트 및 다이어그램", + "landing.formats.powerpoint.f3": "도형 및 텍스트 상자", + "landing.formats.powerpoint.f4": "마스터 레이아웃", + "landing.formats.powerpoint.f5": "애니메이션 유지", + "landing.formats.pdf": "PDF", + "landing.formats.pdf.f1": "텍스트 기반 PDF", + "landing.formats.pdf.f2": "레이아웃 유지", + "landing.formats.pdf.f3": "이미지 제자리 유지", + "landing.formats.pdf.f4": "표 유지", + "landing.formats.pdf.f5": "DOCX 또는 PDF로 출력", + "landing.cta.title": "30초 만에 번역 시작", + "landing.cta.subtitle": "신용카드 불필요. 2개 문서를 무료로 사용해 보시고 차이를 확인하세요.", + "landing.cta.button": "무료 계정 만들기", + "landing.footer.privacy": "개인정보", + "landing.footer.terms": "약관", + "landing.footer.contact": "문의", + "login.signInToContinue": "Sign in to continue translating", + "login.email": "Email", + "login.emailPlaceholder": "you@example.com", + "login.password": "Password", + "login.forgotPassword": "Forgot password?", + "login.passwordPlaceholder": "••••••••", + "login.signingIn": "Signing in...", + "login.signIn": "Sign In", + "login.noAccount": "Don't have an account?", + "login.signUpFree": "Sign up for free", + "forgotPassword.enterEmail": "Please enter your email address", + "forgotPassword.error": "An error occurred", + "forgotPassword.title": "Forgot Password", + "forgotPassword.checkEmail": "Check your inbox", + "forgotPassword.subtitle": "Enter your email to receive a reset link", + "forgotPassword.sentMessage": "If an account exists with this address, a reset email has been sent.", + "forgotPassword.emailLabel": "Email address", + "forgotPassword.emailPlaceholder": "you@example.com", + "forgotPassword.sending": "Sending...", + "forgotPassword.sendLink": "Send reset link", + "forgotPassword.backToLogin": "Back to login", + "forgotPassword.loading": "Loading...", + "resetPassword.passwordRequirements": "Password must contain at least 8 characters, one uppercase, one lowercase, and one number", + "resetPassword.passwordMismatch": "Passwords do not match", + "resetPassword.tokenMissing": "Missing token. Please use the link received by email.", + "resetPassword.error": "An error occurred", + "resetPassword.invalidLink": "Invalid link", + "resetPassword.invalidLinkMessage": "This reset link is invalid. Please request a new one.", + "resetPassword.requestNewLink": "Request new link", + "resetPassword.successTitle": "Password reset", + "resetPassword.newPasswordTitle": "New password", + "resetPassword.successSubtitle": "You will be redirected to login", + "resetPassword.subtitle": "Set your new password", + "resetPassword.successMessage": "Your password has been successfully reset. You will be redirected to the login page.", + "resetPassword.newPassword": "New password", + "resetPassword.showPassword": "Show password", + "resetPassword.hidePassword": "Hide password", + "resetPassword.confirmPassword": "Confirm password", + "resetPassword.resetting": "Resetting...", + "resetPassword.resetPassword": "Reset password", + "resetPassword.backToLogin": "Back to login", + "resetPassword.loading": "Loading...", + + "common.loading": "로딩 중...", + "profile.header.title": "내 프로필", + "profile.header.subtitle": "계정 및 환경설정을 관리합니다.", + "profile.tabs.account": "계정", + "profile.tabs.subscription": "구독", + "profile.tabs.preferences": "환경설정", + "profile.account.user": "사용자", + "profile.account.memberSince": "가입일", + "profile.plan.label": "플랜", + "profile.plan.free": "Free", + "profile.plan.starter": "Starter", + "profile.plan.pro": "Pro", + "profile.plan.business": "Business", + "profile.plan.enterprise": "Enterprise", + "profile.plan.pricePerMonth": "{price} €/월", + "profile.subscription.canceling": "취소 중", + "profile.subscription.active": "활성", + "profile.subscription.unknown": "알 수 없음", + "profile.subscription.accessUntil": "접근 가능 기한", + "profile.subscription.renewalOn": "갱신일", + "profile.subscription.upgradePlan": "유료 플랜으로 업그레이드", + "profile.subscription.changePlan": "플랜 변경", + "profile.subscription.manageBilling": "결제 관리", + "profile.subscription.billingUnavailable": "결제 포털을 사용할 수 없습니다.", + "profile.subscription.billingError": "결제 포털에 접근하는 중 오류가 발생했습니다.", + "profile.subscription.cancelSuccess": "구독이 취소되었습니다. 기간 종료까지 접근할 수 있습니다.", + "profile.subscription.cancelError": "취소 중 오류가 발생했습니다.", + "profile.subscription.networkError": "네트워크 오류.", + "profile.usage.title": "이번 달 사용량", + "profile.usage.resetOn": "초기화일", + "profile.usage.documents": "문서", + "profile.usage.pages": "페이지", + "profile.usage.extraCredits": "추가 크레딧", + "profile.usage.extraCreditsPlural": "추가 크레딧", + "profile.usage.quotaReached": "할당량 초과", + "profile.usage.quotaReachedDesc": "계속 사용하려면 상위 플랜으로 업그레이드하세요.", + "profile.usage.unlockMore": "유료 플랜으로 더 많은 번역을 사용하세요.", + "profile.usage.viewPlans": "플랜 보기", + "profile.usage.includedInPlan": "플랜에 포함됨", + "profile.danger.title": "위험 구역", + "profile.danger.description": "취소는 현재 기간이 끝나면 적용됩니다. 해당 날짜까지 접근이 유지됩니다.", + "profile.danger.confirm": "정말 진행하시겠습니까? 이 작업은 되돌릴 수 없습니다.", + "profile.danger.confirmCancel": "취소 확인", + "profile.danger.cancelSubscription": "구독 취소", + "profile.danger.keep": "아니요, 유지합니다", + "profile.prefs.interfaceLang": "인터페이스 언어", + "profile.prefs.interfaceLangDesc": "브라우저 설정에 따라 언어가 자동 감지됩니다. 수동으로 변경할 수도 있습니다.", + "profile.prefs.defaultTargetLang": "기본 번역 대상 언어", + "profile.prefs.selectLanguage": "언어 선택", + "profile.prefs.defaultTargetLangDesc": "이 언어가 번역 시 자동으로 선택됩니다.", + "profile.prefs.save": "저장", + "profile.prefs.theme": "테마", + "profile.prefs.themeDesc": "인터페이스 외모를 선택하세요", + "profile.prefs.cache": "캐시", + "profile.prefs.cacheDesc": "로컬 캐시를 지우면 일부 표시 문제가 해결될 수 있습니다.", + "profile.prefs.clearing": "지우는 중...", + "profile.prefs.clearCache": "캐시 지우기", + "settings.title": "설정", + "settings.subtitle": "일반 애플리케이션 설정", + "settings.formats.title": "지원 형식", + "settings.formats.subtitle": "번역 가능한 문서 유형", + "settings.formats.formulas": "수식", + "settings.formats.styles": "스타일", + "settings.formats.images": "이미지", + "settings.formats.headers": "머리글", + "settings.formats.tables": "표", + "settings.formats.slides": "슬라이드", + "settings.formats.notes": "메모", + "settings.cache.title": "캐시", + "settings.cache.desc": "로컬 캐시를 지우면 일부 표시 문제가 해결될 수 있습니다.", + "settings.cache.clearing": "지우는 중...", + "settings.cache.clear": "캐시 지우기", + "services.title": "번역 제공업체", + "services.subtitle": "제공업체는 관리자가 구성합니다. 현재 계정에서 사용 가능한 제공업체를 확인할 수 있습니다.", + "services.loading": "제공업체 로딩 중...", + "services.noProviders": "현재 구성된 제공업체가 없습니다. 관리자에게 문의하세요.", + "services.classic": "클래식 번역", + "services.llmPro": "LLM · 컨텍스트 인식 (Pro)", + "services.available": "사용 가능", + "services.model": "모델", + "services.adminOnly.title": "제공업체 설정은 관리자 전용입니다", + "services.adminOnly.desc": "API 키, 모델 선택, 제공업체 활성화는 관리자가 관리 패널에서 관리합니다. API 키를 입력할 필요가 없습니다.", + "apiKeys.title": "API 키", + "apiKeys.subtitle": "번역 API에 프로그래밍 방식으로 접근하기 위한 API 키를 관리합니다.", + "apiKeys.loading": "로딩 중...", + "apiKeys.sectionTitle": "API & 자동화", + "apiKeys.sectionDesc": "자동화 워크플로우를 위한 API 키 생성 및 관리", + "apiKeys.keysUsed": "{total} / {max} 키 사용", + "apiKeys.maxReached": "최대 키 수에 도달했습니다. 새 키를 생성하려면 기존 키를 취소하세요.", + "apiKeys.canGenerate": "{count}개의 키를 더 생성할 수 있습니다", + "apiKeys.canGeneratePlural": "{count}개의 키를 더 생성할 수 있습니다", + "apiKeys.generateNew": "새 키 생성", + "apiKeys.keyRevoked": "키가 취소되었습니다", + "apiKeys.keyRevokedDesc": "API 키가 성공적으로 취소되었습니다.", + "apiKeys.keyNotFound": "키를 찾을 수 없음", + "apiKeys.keyNotFoundDesc": "API 키가 더 이상 존재하지 않습니다. 이미 취소되었을 수 있습니다.", + "apiKeys.error": "오류", + "apiKeys.revokeError": "API 키 취소에 실패했습니다. 다시 시도해 주세요.", + "apiKeys.limitReached": "한도 도달", + "apiKeys.limitReachedDesc": "API 키는 최대 10개까지입니다. 새 키를 생성하려면 기존 키를 취소하세요.", + "apiKeys.proRequired": "Pro 기능 필요", + "apiKeys.proRequiredDesc": "API 키는 Pro 기능입니다. 계정을 업그레이드해 주세요.", + "apiKeys.generateError": "API 키 생성에 실패했습니다. 다시 시도해 주세요.", + "apiKeys.upgrade.title": "API 키", + "apiKeys.upgrade.subtitle": "API 액세스로 번역 자동화", + "apiKeys.upgrade.feat1": "무제한 API 키 생성", + "apiKeys.upgrade.feat2": "문서 번역 자동화", + "apiKeys.upgrade.feat3": "웹훅 알림", + "apiKeys.upgrade.feat4": "LLM 번역 모드", + "apiKeys.upgrade.proFeature": "API 키는 {pro} 기능입니다. 업그레이드하여 API 자동화를 잠금 해제하세요.", + "apiKeys.upgrade.pro": "Pro", + "apiKeys.upgrade.cta": "Pro로 업그레이드", + "apiKeys.dialog.maxTitle": "최대 키 수 도달", + "apiKeys.dialog.maxDesc": "API 키는 최대 10개까지입니다. 새 키를 생성하기 전에 기존 키를 취소해 주세요.", + "apiKeys.dialog.close": "닫기", + "apiKeys.dialog.generated": "API 키가 생성되었습니다!", + "apiKeys.dialog.generatedDesc": "새 API 키가 생성되었습니다. 지금 복사하세요 - 다시 표시되지 않습니다.", + "apiKeys.dialog.important": "중요:", + "apiKeys.dialog.importantDesc": "이 키가 표시되는 것은 이번뿐입니다. 안전하게 보관하세요.", + "apiKeys.dialog.apiKey": "API 키", + "apiKeys.dialog.name": "이름:", + "apiKeys.dialog.done": "완료", + "apiKeys.dialog.copied": "키를 복사했습니다", + "apiKeys.dialog.generateTitle": "새 API 키 생성", + "apiKeys.dialog.generateDesc": "번역 API에 프로그래밍 방식으로 접근하기 위한 새 API 키를 생성합니다.", + "apiKeys.dialog.keyName": "키 이름 (선택사항)", + "apiKeys.dialog.keyNamePlaceholder": "예: 프로덕션, 스테이징", + "apiKeys.dialog.keyNameHint": "나중에 이 키를 식별할 수 있는 설명적인 이름.", + "apiKeys.dialog.nameTooLong": "이름은 {max}자 이하여야 합니다", + "apiKeys.dialog.nameInvalid": "이름은 문자, 숫자, 공백, 하이픈, 밑줄만 포함할 수 있습니다", + "apiKeys.dialog.cancel": "취소", + "apiKeys.dialog.generating": "생성 중...", + "apiKeys.dialog.generate": "키 생성", + "apiKeys.table.name": "이름", + "apiKeys.table.prefix": "접두사", + "apiKeys.table.created": "생성일", + "apiKeys.table.lastUsed": "마지막 사용", + "apiKeys.table.never": "사용 안 함", + "apiKeys.table.actions": "작업", + "apiKeys.table.revoke": "취소", + "apiKeys.table.copyPrefix": "키 접두사 복사", + "apiKeys.table.revokeKey": "키 취소", + "apiKeys.revokeDialog.title": "API 키 취소", + "apiKeys.revokeDialog.desc": "키 \"{name}\"을(를) 취소하시겠습니까? 이 작업은 되돌릴 수 없습니다.", + "apiKeys.revokeDialog.confirm": "예, 취소합니다", + "apiKeys.revokeDialog.cancel": "취소", + "context.proTitle": "Pro 기능", + "context.proDesc": "컨텍스트 및 전문 용어집은 Pro, Business, Enterprise 플랜에서 사용할 수 있습니다. 도메인별 지침과 어휘를 통해 더 정확한 번역을 제공합니다.", + "context.viewPlans": "플랜 보기", + "context.title": "컨텍스트 & 용어집", + "context.subtitle": "도메인별 지침과 어휘로 번역 품질을 향상시킵니다.", + "context.presets.title": "전문 용어집", + "context.presets.desc": "지침과 전문 용어가 포함된 완전한 용어집을 불러옵니다", + "context.instructions.title": "컨텍스트 지침", + "context.instructions.desc": "번역 중 AI가 따를 지침", + "context.instructions.placeholder": "예: HVAC 기술 문서를 번역합니다. 정확한 공학 용어를 사용하세요...", + "context.glossary.title": "기술 용어집", + "context.glossary.desc": "형식: source=target (한 줄에 하나). 프리셋으로 불러온 용어집은 편집 가능합니다.", + "context.glossary.terms": "용어집의 용어 수", + "context.clearAll": "모두 지우기", + "context.saving": "저장 중...", + "context.save": "저장", + "admin.login.title": "관리", + "admin.login.required": "로그인 필요", + "admin.login.password": "관리자 비밀번호", + "admin.login.connecting": "연결 중...", + "admin.login.access": "관리 패널 접속", + "admin.login.restricted": "관리자 전용", + "admin.layout.checking": "인증 확인 중...", + "admin.dashboard.title": "관리 대시보드", + "admin.dashboard.subtitle": "관리자 제어판", + "admin.dashboard.refresh": "새로고침", + "admin.dashboard.refreshTooltip": "대시보드 데이터 새로고침", + "admin.dashboard.config": "시스템 구성", + "admin.dashboard.maxFileSize": "최대 파일 크기:", + "admin.dashboard.translationService": "번역 서비스:", + "admin.dashboard.formats": "형식:", + "admin.nav.dashboard": "Dashboard", + "admin.nav.users": "사용자", + "admin.nav.pricing": "요금 & Stripe", + "admin.nav.providers": "제공업체", + "admin.nav.system": "시스템", + "admin.nav.logs": "로그", + "admin.users.title": "사용자 관리", + "admin.users.subtitle": "사용자 계정 보기 및 관리", + "admin.users.planUpdated": "플랜이 업데이트되었습니다", + "admin.users.planChanged": "플랜이 \"{plan}\"(으)로 성공적으로 변경되었습니다.", + "admin.users.unknownError": "알 수 없는 오류", + "admin.users.error": "오류", + "admin.users.planUpdateError": "플랜을 업데이트할 수 없습니다: {message}", + "admin.users.noKeys": "키 없음", + "admin.users.noKeysDesc": "이 사용자는 활성 API 키가 없습니다.", + "admin.users.keysRevoked": "키가 취소되었습니다", + "admin.users.keysRevokedDesc": "{count}개의 API 키가 성공적으로 취소되었습니다.", + "admin.users.revokeError": "키를 취소할 수 없습니다: {message}", + "admin.users.retry": "재시도", + "admin.system.title": "시스템", + "admin.system.subtitle": "시스템 상태 모니터링 및 리소스 관리", + "admin.system.quotas": "번역 할당량", + "admin.system.resetQuotas": "월간 할당량 초기화", + "admin.system.resetting": "초기화 중...", + "admin.system.reset": "초기화", + "admin.system.allOperational": "모든 시스템 정상 가동 중", + "admin.system.issuesDetected": "시스템 문제가 감지되었습니다", + "admin.system.waitingData": "데이터 대기 중...", + "admin.system.purging": "삭제 중...", + "admin.system.clean": "정리", + "admin.system.purge": "삭제", + }, + // ═══════════════════════════════════════════════════════════════ + // CHINESE SIMPLIFIED (zh) + // ═══════════════════════════════════════════════════════════════ + zh: { + "auth.brandName": "Office Translator", + "dashboard.nav.translate": "翻译", + "dashboard.nav.profile": "我的资料", + "dashboard.nav.settings": "设置", + "dashboard.nav.context": "上下文", + "dashboard.nav.services": "服务", + "dashboard.nav.apiKeys": "API 密钥", + "dashboard.nav.glossaries": "术语表", + "dashboard.header.title": "控制面板", + "dashboard.header.subtitle": "管理您的翻译", + "dashboard.header.toggleMenu": "菜单", + "dashboard.header.profileTitle": "我的资料", + "dashboard.sidebar.theme": "主题", + "dashboard.sidebar.signOut": "退出登录", + "dashboard.sidebar.backHome": "返回首页", + "dashboard.translate.pageTitle": "翻译文档", + "dashboard.translate.pageSubtitle": "导入文件并选择目标语言", + "dashboard.translate.errorNotificationTitle": "错误", + "dashboard.translate.dropzone.uploadAria": "文件拖放区", + "dashboard.translate.dropzone.title": "将文件拖放到此处", + "dashboard.translate.dropzone.subtitle": "或点击选择(DOCX、XLSX、PPTX、PDF)", + "dashboard.translate.dropzone.replaceFile": "替换文件", + "dashboard.translate.language.source": "源语言", + "dashboard.translate.language.target": "目标语言", + "dashboard.translate.language.loading": "正在加载语言…", + "dashboard.translate.language.autoDetect": "自动检测", + "dashboard.translate.language.selectPlaceholder": "选择…", + "dashboard.translate.language.loadErrorPrefix": "语言加载失败", + "dashboard.translate.provider.loading": "正在加载服务商…", + "dashboard.translate.provider.noneConfigured": "未配置服务商", + "dashboard.translate.provider.modelTitle": "模型", + "dashboard.translate.provider.sectionTitle": "服务商", + "dashboard.translate.provider.llmDivider": "AI · 上下文感知", + "dashboard.translate.provider.llmDividerPro": "AI · 上下文感知(专业版)", + "dashboard.translate.provider.upgrade": "升级到专业版", + "dashboard.translate.provider.upgradeSuffix": "以解锁 AI 翻译", + "dashboard.translate.trust.zeroRetention": "零数据留存", + "dashboard.translate.trust.deletedAfter": "处理完成后文件即被删除", + "dashboard.translate.actions.uploading": "正在上传…", + "dashboard.translate.actions.translate": "翻译", + "dashboard.translate.actions.filePrefix": "文件:", + "dashboard.translate.actions.cancel": "取消", + "dashboard.translate.actions.tryAgain": "重试", + "dashboard.translate.steps.uploading": "正在上传文件…", + "dashboard.translate.steps.starting": "正在开始翻译…", + "dashboard.translate.complete.title": "翻译完成!", + "dashboard.translate.complete.descNamed": "您的文件 {name} 已成功翻译。", + "dashboard.translate.complete.descGeneric": "您的文件已成功翻译。", + "dashboard.translate.complete.downloading": "正在下载…", + "dashboard.translate.complete.download": "下载", + "dashboard.translate.complete.newTranslation": "新建翻译", + "dashboard.translate.complete.toastOkTitle": "成功", + "dashboard.translate.complete.toastFailTitle": "失败", + "dashboard.translate.complete.toastFailDesc": "翻译失败,请重试。", + "dashboard.translate.sourceDocument": "源文档", + "dashboard.translate.configuration": "配置", + "dashboard.translate.translating": "翻译进行中", + "dashboard.translate.liveMonitor": "实时监控", + "dashboard.translate.summary": "摘要", + "dashboard.translate.engine": "引擎", + "dashboard.translate.confidence": "置信度", + "dashboard.translate.cancel": "取消", + "dashboard.translate.segments": "片段", + "dashboard.translate.characters": "字符", + "dashboard.translate.elapsed": "已用时间", + "dashboard.translate.segPerMin": "片段/分钟", + "dashboard.translate.highQuality": "高质量", + "dashboard.translate.quality": "质量", + "dashboard.translate.completed": "翻译完成", + "dashboard.translate.replace": "替换", + "dashboard.translate.pdfMode.title": "PDF翻译模式", + "dashboard.translate.pdfMode.preserveLayout": "保留排版", + "dashboard.translate.pdfMode.textOnly": "仅文本", + "dashboard.translate.pdfMode.preserveLayoutDesc": "保留图片、表格和格式。适合简单PDF。", + "dashboard.translate.pdfMode.textOnlyDesc": "完美翻译所有文本。整洁输出,无排版问题。", + "dashboard.translate.pipeline.upload": "上传", + "dashboard.translate.pipeline.analyze": "分析", + "dashboard.translate.pipeline.translate": "翻译", + "dashboard.translate.pipeline.rebuild": "重建", + "dashboard.translate.pipeline.finalize": "完成", + "dashboard.translate.progress.failedTitle": "翻译失败", + "glossaries.dialog.title": "新建术语表", + "glossaries.dialog.description": "为您的翻译创建术语表", + "glossaries.dialog.nameLabel": "名称", + "glossaries.dialog.namePlaceholder": "我的术语表", + "glossaries.dialog.tabTemplates": "模板", + "glossaries.dialog.tabFile": "文件", + "glossaries.dialog.tabManual": "手动", + "glossaries.dialog.cancel": "取消", + "glossaries.dialog.creating": "正在创建…", + "glossaries.dialog.importing": "正在导入…", + "glossaries.dialog.importBtn": "导入", + "glossaries.dialog.selectPrompt": "选择", + "glossaries.dialog.createBtn": "创建", + "glossaries.dialog.createEmpty": "创建空表", + "glossaries.dialog.terms": "个术语", + "glossaries.dialog.templatesDesc": "选择预定义模板", + "glossaries.dialog.templatesEmpty": "暂无可用模板", + "glossaries.dialog.dropTitle": "将 CSV 文件拖到此处", + "glossaries.dialog.dropOr": "或", + "glossaries.dialog.dropFormats": "CSV、TSV、TXT", + "glossaries.dialog.formatTitle": "格式", + "glossaries.dialog.formatDesc": "源语言,目标语言(每行一对)", + "glossaries.dialog.formatNote": "如检测到表头则跳过首行", + "glossaries.dialog.errorFormat": "不支持的格式", + "glossaries.dialog.errorSize": "文件过大", + "glossaries.dialog.errorEmpty": "空文件", + "glossaries.dialog.errorRead": "读取错误", + "glossaries.dialog.parsing": "正在解析…", + "glossaries.dialog.termsImported": "个术语已导入", + "glossaries.dialog.changeFile": "更换文件", + "glossaries.dialog.retry": "重试", + "pricing.nav.back": "返回", + "pricing.nav.home": "首页", + "pricing.nav.mySubscription": "我的订阅", + "pricing.header.badge": "AI 模型已更新 — 2026年3月", + "pricing.header.title": "满足各种需求的方案", + "pricing.header.subtitle": "翻译 Word、Excel 和 PowerPoint 文档,同时保留原始排版。无需 API 密钥。", + "pricing.billing.monthly": "月付", + "pricing.billing.yearly": "年付", + "pricing.plans.free.name": "免费", + "pricing.plans.starter.name": "入门版", + "pricing.plans.pro.name": "专业版", + "pricing.plans.business.name": "企业版", + "pricing.plans.enterprise.name": "旗舰版", + "pricing.plans.free.description": "非常适合体验应用", + "pricing.plans.starter.description": "面向个人和小型项目", + "pricing.plans.pro.description": "面向专业人士和成长中的团队", + "pricing.plans.business.description": "面向团队和组织", + "pricing.plans.enterprise.description": "为大型组织提供定制解决方案", + "pricing.plans.pro.highlight": "最受欢迎", + "pricing.plans.pro.badge": "热门", + "pricing.plans.enterprise.badge": "按需报价", + "pricing.plans.free.feat1": "每月 5 份文档", + "pricing.plans.free.feat2": "每份文档最多 15 页", + "pricing.plans.free.feat3": "包含 Google 翻译", + "pricing.plans.free.feat4": "支持所有语言(130+)", + "pricing.plans.free.feat5": "社区支持", + "pricing.plans.starter.feat1": "每月 50 份文档", + "pricing.plans.starter.feat2": "每份文档最多 50 页", + "pricing.plans.starter.feat3": "Google 翻译 + DeepL", + "pricing.plans.starter.feat4": "文件最大 10 MB", + "pricing.plans.starter.feat5": "邮件支持", + "pricing.plans.starter.feat6": "30 天历史记录", + "pricing.plans.pro.feat1": "每月 200 份文档", + "pricing.plans.pro.feat2": "每份文档最多 200 页", + "pricing.plans.pro.feat3": "基础 AI 翻译(DeepSeek V3.2)", + "pricing.plans.pro.feat4": "Google 翻译 + DeepL", + "pricing.plans.pro.feat5": "文件最大 25 MB", + "pricing.plans.pro.feat6": "自定义术语表", + "pricing.plans.pro.feat7": "优先支持", + "pricing.plans.pro.feat8": "90 天历史记录", + "pricing.plans.business.feat1": "每月 1,000 份文档", + "pricing.plans.business.feat2": "每份文档最多 500 页", + "pricing.plans.business.feat3": "基础 + 高级 AI(Claude Haiku)", + "pricing.plans.business.feat4": "所有翻译服务商", + "pricing.plans.business.feat5": "文件最大 50 MB", + "pricing.plans.business.feat6": "API 访问(每月 10,000 次调用)", + "pricing.plans.business.feat7": "通知 Webhook", + "pricing.plans.business.feat8": "专属支持", + "pricing.plans.business.feat9": "1 年历史记录", + "pricing.plans.business.feat10": "高级分析", + "pricing.plans.enterprise.feat1": "无限文档", + "pricing.plans.enterprise.feat2": "所有 AI 模型(GPT-5、Claude Opus 4.6…)", + "pricing.plans.enterprise.feat3": "本地部署或专属云", + "pricing.plans.enterprise.feat4": "99.9% SLA 保障", + "pricing.plans.enterprise.feat5": "24/7 专属支持", + "pricing.plans.enterprise.feat6": "白标(White-label)", + "pricing.plans.enterprise.feat7": "无限团队", + "pricing.plans.enterprise.feat8": "定制集成", + "pricing.card.onRequest": "按需报价", + "pricing.card.free": "免费", + "pricing.card.perMonth": "/月", + "pricing.card.billedYearly": "按年计费 {price} €", + "pricing.card.documents": "文档", + "pricing.card.pagesMax": "最大页数", + "pricing.card.aiTranslation": "AI 翻译", + "pricing.card.unlimited": "无限", + "pricing.card.perMonthStat": "/ 月", + "pricing.card.perDoc": "页 / 文档", + "pricing.card.aiEssential": "基础版", + "pricing.card.aiEssentialPremium": "基础版 + 高级版", + "pricing.card.aiCustom": "定制", + "pricing.card.myPlan": "我的方案", + "pricing.card.managePlan": "管理方案", + "pricing.card.startFree": "免费开始", + "pricing.card.contactUs": "联系我们", + "pricing.card.choosePlan": "选择此方案", + "pricing.card.processing": "处理中…", + "pricing.comparison.title": "详细对比", + "pricing.comparison.subtitle": "各方案包含的所有功能", + "pricing.comparison.feature": "功能", + "pricing.comparison.docsPerMonth": "文档 / 月", + "pricing.comparison.pagesMaxPerDoc": "最大页数 / 文档", + "pricing.comparison.maxFileSize": "最大文件大小", + "pricing.comparison.googleTranslation": "Google 翻译", + "pricing.comparison.deepl": "DeepL", + "pricing.comparison.aiEssential": "基础 AI 翻译", + "pricing.comparison.aiPremium": "高级 AI 翻译", + "pricing.comparison.apiAccess": "API 访问", + "pricing.comparison.priorityProcessing": "优先处理", + "pricing.comparison.support": "支持", + "pricing.comparison.support.community": "社区", + "pricing.comparison.support.email": "邮件", + "pricing.comparison.support.priority": "优先", + "pricing.comparison.support.dedicated": "专属", + "pricing.comparison.mb": "MB", + "pricing.credits.title": "额外额度", + "pricing.credits.subtitle": "需要更多?单独购买额度,无需订阅。", + "pricing.credits.perPage": "1 额度 = 1 翻译页。", + "pricing.credits.bestValue": "最划算", + "pricing.credits.unit": "额度", + "pricing.credits.centsPerCredit": "分 / 额度", + "pricing.credits.buy": "购买", + "pricing.trust.encryption.title": "端到端加密", + "pricing.trust.encryption.sub": "TLS 1.3 + AES-256 静态加密", + "pricing.trust.languages.title": "130+ 种语言", + "pricing.trust.languages.sub": "包括阿拉伯语、波斯语、希伯来语(RTL)", + "pricing.trust.parallel.title": "并行处理", + "pricing.trust.parallel.sub": "超快多线程 AI", + "pricing.trust.availability.title": "7×24 小时可用", + "pricing.trust.availability.sub": "99.9% 可用性保障", + "pricing.aiModels.title": "我们的 AI 模型 — 2026年3月", + "pricing.aiModels.essential.title": "基础 AI 翻译", + "pricing.aiModels.essential.plan": "专业版方案", + "pricing.aiModels.essential.descPrefix": "基于", + "pricing.aiModels.essential.descSuffix": "— 2026 年最具性价比的 AI 模型。质量媲美前沿模型,成本仅为其 1/50。", + "pricing.aiModels.essential.context": "163K 上下文 Token", + "pricing.aiModels.essential.value": "性价比极佳", + "pricing.aiModels.premium.title": "高级 AI 翻译", + "pricing.aiModels.premium.plan": "企业版方案", + "pricing.aiModels.premium.descPrefix": "基于", + "pricing.aiModels.premium.descSuffix": "Anthropic 出品 — 在法律、医疗和复杂技术文档方面表现精准。", + "pricing.aiModels.premium.context": "200K 上下文 Token", + "pricing.aiModels.premium.precision": "最高精度", + "pricing.faq.title": "常见问题", + "pricing.faq.q1": "我可以随时更换方案吗?", + "pricing.faq.a1": "可以。升级立即生效并按比例计费。降级在当前周期结束时生效。", + "pricing.faq.q2": "什么是「基础 AI 翻译」?", + "pricing.faq.a2": "这是我们基于 DeepSeek V3.2 通过 OpenRouter 提供的 AI 引擎。它能够理解文档上下文、保留排版,在处理专业术语方面远优于传统翻译。", + "pricing.faq.q3": "基础 AI 和高级 AI 有什么区别?", + "pricing.faq.a3": "基础 AI 使用 DeepSeek V3.2(性价比极佳)。高级 AI 使用 Anthropic 的 Claude 3.5 Haiku,在法律、医疗和复杂技术文档方面精度更高。", + "pricing.faq.q4": "翻译后文档会被保留吗?", + "pricing.faq.a4": "翻译文件根据您的方案保留(入门版 30 天、专业版 90 天、企业版 1 年)。存储和传输过程中均已加密。", + "pricing.faq.q5": "超过月度配额会怎样?", + "pricing.faq.a5": "You can buy additional credits individually, or upgrade your plan.", + "landing.ai.badge": "AI-Powered Translation Engine", + "landing.ai.title": "Translation that understands your craft", + "landing.ai.subtitle": "Our AI models analyze context, respect your terminology, and even translate text inside images.", + "landing.ai.context.title": "Industry Context", + "landing.ai.context.desc": "Describe your field and get tailored translations, not generic ones.", + "landing.ai.glossary.title": "Industry Glossaries", + "landing.ai.glossary.desc": "Define your technical terms for precise, domain-specific translations.", + "landing.ai.vision.title": "Image Vision", + "landing.ai.vision.desc": "Text embedded in images, diagrams and charts is detected and translated.", + "landing.ai.comparison.source": "Source (FR)", + "landing.ai.comparison.google": "Google Translate", + "landing.ai.comparison.ai": "Our AI", + "landing.howItWorks.title": "How it works", + "landing.howItWorks.subtitle": "Three steps. Zero formatting loss.", + "landing.howItWorks.step1.title": "Upload your file", + "landing.howItWorks.step1.desc": "Drag and drop your Excel, Word, PowerPoint or PDF document.", + "landing.howItWorks.step2.title": "Pick language and engine", + "landing.howItWorks.step2.desc": "Select target language and engine - standard or context-aware AI.", + "landing.howItWorks.step3.title": "Download the result", + "landing.howItWorks.step3.desc": "Get your translated document with formatting identical to the original.", + "pricing.faq.q6": "付费方案有免费试用吗?", + "pricing.faq.a6": "免费方案永久有效且无需信用卡。专业版和企业版方案请联系我们获取 14 天试用。", + "pricing.faq.q7": "支持哪些文件格式?", + "pricing.faq.a7": "Word(.docx)、Excel(.xlsx/.xls)、PowerPoint(.pptx),即将支持 PDF。所有方案支持相同的格式。", + "pricing.cta.title": "准备好开始了吗?", + "pricing.cta.subtitle": "免费开始,无需信用卡。需要时再升级。", + "pricing.cta.createAccount": "创建免费账户", + "pricing.cta.login": "登录", + "pricing.toast.demo": "演示模式 — Stripe 尚未配置。在生产环境中,您将被重定向至支付页面以激活 {planId} 方案。", + "pricing.toast.networkError": "网络错误,请重试。", + "pricing.toast.paymentError": "创建支付时出错。", + "register.title": "创建账户", + "register.subtitle": "免费开始翻译", + "register.error.failed": "注册失败", + "register.name.label": "姓名", + "register.name.placeholder": "您的姓名", + "register.name.error": "姓名至少需要 2 个字符", + "register.email.label": "电子邮箱", + "register.email.placeholder": "you@example.com", + "register.email.error": "无效的邮箱地址", + "register.password.label": "密码", + "register.password.error": "密码至少需要 8 个字符,包含大写字母、小写字母和数字", + "register.password.show": "显示密码", + "register.password.hide": "隐藏密码", + "register.password.strengthLabel": "强度:", + "register.password.strength.weak": "弱", + "register.password.strength.medium": "中", + "register.password.strength.strong": "强", + "register.confirmPassword.label": "确认密码", + "register.confirmPassword.error": "两次输入的密码不一致", + "register.confirmPassword.show": "显示", + "register.confirmPassword.hide": "隐藏", + "register.submit.creating": "正在创建账户...", + "register.submit.create": "创建我的账户", + "register.hasAccount": "已有账户?", + "register.login": "登录", + "register.terms.prefix": "创建账户即表示您接受我们的", + "register.terms.link": "服务条款", + + // ── Landing page ── + "landing.nav.whyUs": "为什么选择我们", + "landing.nav.formats": "支持格式", + "landing.nav.pricing": "定价", + "landing.nav.login": "登录", + "landing.nav.startFree": "免费开始", + "landing.hero.badge": "新功能:PDF 支持 + AI 智能翻译", + "landing.hero.title1": "翻译您的文档。", + "landing.hero.title2": "保持格式完美。", + "landing.hero.subtitle": "唯一能够保留 SmartArt、图表、目录、形状、页眉页脚的翻译工具——与原文一模一样。结账时没有任何意外。", + "landing.hero.cta": "免费开始 — 每月2份文档", + "landing.hero.seePlans": "查看方案", + "landing.trust.filesDeleted": "文件在60分钟后删除", + "landing.trust.noBait": "无诱导性定价", + "landing.trust.preview": "付费前预览", + "landing.why.title": "您的格式,完美保留", + "landing.why.subtitle": "其他翻译器会破坏您的排版。我们不会。", + "landing.why.smartart.title": "SmartArt 与图表", + "landing.why.smartart.desc": "组织架构图、流程图、层级图——全部就地翻译。", + "landing.why.toc.title": "目录", + "landing.why.toc.desc": "目录条目、页码和交叉引用都会正确更新。", + "landing.why.charts.title": "图表与图形", + "landing.why.charts.desc": "标题、轴标签、图例和系列名称——全部翻译。", + "landing.why.shapes.title": "形状与文本框", + "landing.why.shapes.desc": "矩形、圆角框、标注——我们找到并翻译所有形状中的文本。", + "landing.why.headers.title": "页眉与页脚", + "landing.why.headers.desc": "页眉、页脚和脚注文本不会被遗漏。", + "landing.why.languages.title": "130+ 种语言", + "landing.why.languages.desc": "Google Translate, DeepL, and AI-powered engines for professional quality.", + "landing.pricing.monthly": "月付", + "landing.pricing.yearly": "年付", + "landing.pricing.starter.title": "Starter", + "landing.pricing.starter.desc": "面向个人和小型项目", + "landing.pricing.starter.f1": "每月 50 份文档", + "landing.pricing.starter.f2": "每份文档最多 50 页", + "landing.pricing.starter.f3": "Google 翻译 + DeepL", + "landing.pricing.starter.f4": "文件最大 10 MB", + "landing.pricing.starter.cta": "开始使用", + "landing.pricing.pro.title": "Pro", + "landing.pricing.pro.badge": "最受欢迎", + "landing.pricing.pro.desc": "面向追求品质的专业人士", + "landing.pricing.pro.f1": "每月 200 份文档", + "landing.pricing.pro.f2": "每份文档最多 200 页", + "landing.pricing.pro.f3": "AI 智能翻译(DeepSeek)", + "landing.pricing.pro.f4": "包含 Google + DeepL", + "landing.pricing.pro.f5": "自定义术语表和提示词", + "landing.pricing.pro.f6": "优先支持", + "landing.pricing.pro.cta": "试用 Pro", + "landing.pricing.business.title": "Business", + "landing.pricing.business.desc": "面向高用量团队", + "landing.pricing.business.f1": "每月 1,000 份文档", + "landing.pricing.business.f2": "每份文档最多 500 页", + "landing.pricing.business.f3": "高级 AI(Claude)", + "landing.pricing.business.f4": "所有服务商 + API 访问", + "landing.pricing.business.f5": "Webhook 与自动化", + "landing.pricing.business.f6": "5 个团队席位", + "landing.pricing.business.cta": "联系我们", + "landing.pricing.honest": "显示的价格就是您支付的价格。翻译后没有任何隐藏费用。", + "landing.pricing.billedYearly": "按年计费", + "landing.pricing.perMonth": "/月", + "landing.formats.title": "每种格式,每个元素", + "landing.formats.subtitle": "我们翻译其他人遗漏的内容。", + "landing.formats.word": "Word (.docx)", + "landing.formats.word.f1": "段落和标题", + "landing.formats.word.f2": "表格和图表", + "landing.formats.word.f3": "SmartArt 图", + "landing.formats.word.f4": "目录", + "landing.formats.word.f5": "页眉和页脚", + "landing.formats.word.f6": "形状和文本框", + "landing.formats.word.f7": "脚注和尾注", + "landing.formats.excel": "Excel (.xlsx)", + "landing.formats.excel.f1": "单元格值", + "landing.formats.excel.f2": "工作表名称", + "landing.formats.excel.f3": "图表和标签", + "landing.formats.excel.f4": "页眉和页脚", + "landing.formats.excel.f5": "合并单元格保留", + "landing.formats.powerpoint": "PowerPoint (.pptx)", + "landing.formats.powerpoint.f1": "幻灯片文本和备注", + "landing.formats.powerpoint.f2": "图表和图形", + "landing.formats.powerpoint.f3": "形状和文本框", + "landing.formats.powerpoint.f4": "母版布局", + "landing.formats.powerpoint.f5": "动画保留", + "landing.formats.pdf": "PDF", + "landing.formats.pdf.f1": "文本型 PDF", + "landing.formats.pdf.f2": "布局保留", + "landing.formats.pdf.f3": "图片位置不变", + "landing.formats.pdf.f4": "表格保留", + "landing.formats.pdf.f5": "输出为 DOCX 或 PDF", + "landing.cta.title": "30 秒开始翻译", + "landing.cta.subtitle": "无需信用卡。免费试用 2 份文档,体验差异。", + "landing.cta.button": "创建免费账户", + "landing.footer.privacy": "隐私", + "landing.footer.terms": "条款", + "landing.footer.contact": "联系我们", + + "common.loading": "加载中...", + "profile.header.title": "我的资料", + "profile.header.subtitle": "管理您的账户和偏好设置。", + "profile.tabs.account": "账户", + "profile.tabs.subscription": "订阅", + "profile.tabs.preferences": "偏好设置", + "profile.account.user": "用户", + "profile.account.memberSince": "注册时间", + "profile.plan.label": "套餐", + "profile.plan.free": "Free", + "profile.plan.starter": "Starter", + "profile.plan.pro": "Pro", + "profile.plan.business": "Business", + "profile.plan.enterprise": "Enterprise", + "profile.plan.pricePerMonth": "{price} €/月", + "profile.subscription.canceling": "取消中", + "profile.subscription.active": "有效", + "profile.subscription.unknown": "未知", + "profile.subscription.accessUntil": "访问截止日期", + "profile.subscription.renewalOn": "续费日期", + "profile.subscription.upgradePlan": "升级到付费套餐", + "profile.subscription.changePlan": "更改套餐", + "profile.subscription.manageBilling": "管理账单", + "profile.subscription.billingUnavailable": "账单门户不可用。", + "profile.subscription.billingError": "访问账单门户时出错。", + "profile.subscription.cancelSuccess": "订阅已取消。您可以继续使用至本期结束。", + "profile.subscription.cancelError": "取消时出错。", + "profile.subscription.networkError": "网络错误。", + "profile.usage.title": "本月使用量", + "profile.usage.resetOn": "重置日期", + "profile.usage.documents": "文档", + "profile.usage.pages": "页数", + "profile.usage.extraCredits": "额外额度", + "profile.usage.extraCreditsPlural": "额外额度", + "profile.usage.quotaReached": "配额已用完", + "profile.usage.quotaReachedDesc": "升级到更高套餐以继续使用。", + "profile.usage.unlockMore": "升级付费套餐以获取更多翻译。", + "profile.usage.viewPlans": "查看套餐", + "profile.usage.includedInPlan": "已包含在您的套餐中", + "profile.danger.title": "危险区域", + "profile.danger.description": "取消将在当前周期结束时生效。在此之前您可以继续使用。", + "profile.danger.confirm": "确定要继续吗?此操作不可撤销。", + "profile.danger.confirmCancel": "确认取消", + "profile.danger.cancelSubscription": "取消我的订阅", + "profile.danger.keep": "不,保留", + "profile.prefs.interfaceLang": "界面语言", + "profile.prefs.interfaceLangDesc": "语言会根据您的浏览器自动检测。您也可以手动更改。", + "profile.prefs.defaultTargetLang": "默认目标语言", + "profile.prefs.selectLanguage": "选择语言", + "profile.prefs.defaultTargetLangDesc": "翻译时将自动选择此语言。", + "profile.prefs.save": "保存", + "profile.prefs.theme": "主题", + "profile.prefs.themeDesc": "选择界面外观", + "profile.prefs.cache": "缓存", + "profile.prefs.cacheDesc": "清除本地缓存可以修复一些显示问题。", + "profile.prefs.clearing": "清除中...", + "profile.prefs.clearCache": "清除缓存", + "settings.title": "设置", + "settings.subtitle": "通用应用配置", + "settings.formats.title": "支持的格式", + "settings.formats.subtitle": "您可以翻译的文档类型", + "settings.formats.formulas": "公式", + "settings.formats.styles": "样式", + "settings.formats.images": "图片", + "settings.formats.headers": "页眉", + "settings.formats.tables": "表格", + "settings.formats.slides": "幻灯片", + "settings.formats.notes": "备注", + "settings.cache.title": "缓存", + "settings.cache.desc": "清除本地缓存可以修复一些显示问题。", + "settings.cache.clearing": "清除中...", + "settings.cache.clear": "清除缓存", + "services.title": "翻译服务提供商", + "services.subtitle": "服务提供商由管理员配置。您可以查看当前账户可用的提供商。", + "services.loading": "正在加载提供商...", + "services.noProviders": "当前没有配置任何提供商。请联系管理员。", + "services.classic": "经典翻译", + "services.llmPro": "LLM · 上下文感知 (Pro)", + "services.available": "可用", + "services.model": "模型", + "services.adminOnly.title": "提供商配置仅限管理员", + "services.adminOnly.desc": "API 密钥、模型选择和提供商激活由管理员在管理面板中管理。您无需输入 API 密钥。", + "apiKeys.title": "API 密钥", + "apiKeys.subtitle": "管理用于编程访问翻译 API 的 API 密钥。", + "apiKeys.loading": "加载中...", + "apiKeys.sectionTitle": "API 与自动化", + "apiKeys.sectionDesc": "生成和管理用于自动化工作流的 API 密钥", + "apiKeys.keysUsed": "已使用 {total} / {max} 个密钥", + "apiKeys.maxReached": "已达到密钥上限。请吊销现有密钥后再生成新密钥。", + "apiKeys.canGenerate": "还可以生成 {count} 个密钥", + "apiKeys.canGeneratePlural": "还可以生成 {count} 个密钥", + "apiKeys.generateNew": "生成新密钥", + "apiKeys.keyRevoked": "密钥已吊销", + "apiKeys.keyRevokedDesc": "API 密钥已成功吊销。", + "apiKeys.keyNotFound": "密钥未找到", + "apiKeys.keyNotFoundDesc": "API 密钥已不存在。可能已被吊销。", + "apiKeys.error": "错误", + "apiKeys.revokeError": "吊销 API 密钥失败。请重试。", + "apiKeys.limitReached": "已达上限", + "apiKeys.limitReachedDesc": "您已达到最多 10 个 API 密钥的限制。请吊销现有密钥后再生成新密钥。", + "apiKeys.proRequired": "需要 Pro 功能", + "apiKeys.proRequiredDesc": "API 密钥是 Pro 功能。请升级您的账户。", + "apiKeys.generateError": "生成 API 密钥失败。请重试。", + "apiKeys.upgrade.title": "API 密钥", + "apiKeys.upgrade.subtitle": "通过 API 访问自动化翻译", + "apiKeys.upgrade.feat1": "生成无限 API 密钥", + "apiKeys.upgrade.feat2": "自动化文档翻译", + "apiKeys.upgrade.feat3": "Webhook 通知", + "apiKeys.upgrade.feat4": "LLM 翻译模式", + "apiKeys.upgrade.proFeature": "API 密钥是{pro}功能。升级以解锁 API 自动化。", + "apiKeys.upgrade.pro": "Pro", + "apiKeys.upgrade.cta": "升级到 Pro", + "apiKeys.dialog.maxTitle": "已达最大密钥数", + "apiKeys.dialog.maxDesc": "您已达到最多 10 个 API 密钥的限制。请在生成新密钥前吊销现有密钥。", + "apiKeys.dialog.close": "关闭", + "apiKeys.dialog.generated": "API 密钥已生成!", + "apiKeys.dialog.generatedDesc": "新的 API 密钥已创建。请立即复制 - 之后将不再显示。", + "apiKeys.dialog.important": "重要提示:", + "apiKeys.dialog.importantDesc": "这是您唯一一次看到此密钥。请妥善保存。", + "apiKeys.dialog.apiKey": "API 密钥", + "apiKeys.dialog.name": "名称:", + "apiKeys.dialog.done": "完成", + "apiKeys.dialog.copied": "我已复制密钥", + "apiKeys.dialog.generateTitle": "生成新 API 密钥", + "apiKeys.dialog.generateDesc": "创建用于编程访问翻译 API 的新 API 密钥。", + "apiKeys.dialog.keyName": "密钥名称(可选)", + "apiKeys.dialog.keyNamePlaceholder": "例如:生产环境、测试环境", + "apiKeys.dialog.keyNameHint": "一个描述性的名称,方便您以后识别此密钥。", + "apiKeys.dialog.nameTooLong": "名称不得超过 {max} 个字符", + "apiKeys.dialog.nameInvalid": "名称只能包含字母、数字、空格、连字符和下划线", + "apiKeys.dialog.cancel": "取消", + "apiKeys.dialog.generating": "生成中...", + "apiKeys.dialog.generate": "生成密钥", + "apiKeys.table.name": "名称", + "apiKeys.table.prefix": "前缀", + "apiKeys.table.created": "创建时间", + "apiKeys.table.lastUsed": "最后使用", + "apiKeys.table.never": "从未使用", + "apiKeys.table.actions": "操作", + "apiKeys.table.revoke": "吊销", + "apiKeys.table.copyPrefix": "复制密钥前缀", + "apiKeys.table.revokeKey": "吊销密钥", + "apiKeys.revokeDialog.title": "吊销 API 密钥", + "apiKeys.revokeDialog.desc": "确定要吊销密钥\"{name}\"吗?此操作不可撤销。", + "apiKeys.revokeDialog.confirm": "是,吊销", + "apiKeys.revokeDialog.cancel": "取消", + "context.proTitle": "Pro 功能", + "context.proDesc": "上下文和专业术语表适用于 Pro、Business 和 Enterprise 套餐。它们通过特定领域的指令和词汇提供更准确的翻译。", + "context.viewPlans": "查看套餐", + "context.title": "上下文与术语表", + "context.subtitle": "通过特定领域的指令和词汇提高翻译质量。", + "context.presets.title": "专业术语表", + "context.presets.desc": "加载包含指令和专业术语的完整术语表", + "context.instructions.title": "上下文指令", + "context.instructions.desc": "翻译过程中 AI 将遵循的指令", + "context.instructions.placeholder": "例如:您翻译 HVAC 技术文档。请使用精确的工程术语...", + "context.glossary.title": "技术术语表", + "context.glossary.desc": "格式:source=target(每行一个)。通过预设加载的术语表可编辑。", + "context.glossary.terms": "术语表中的术语数", + "context.clearAll": "全部清除", + "context.saving": "保存中...", + "context.save": "保存", + "admin.login.title": "管理后台", + "admin.login.required": "需要登录", + "admin.login.password": "管理员密码", + "admin.login.connecting": "连接中...", + "admin.login.access": "进入管理面板", + "admin.login.restricted": "仅限管理员", + "admin.layout.checking": "正在验证身份...", + "admin.dashboard.title": "管理仪表盘", + "admin.dashboard.subtitle": "管理员控制面板", + "admin.dashboard.refresh": "刷新", + "admin.dashboard.refreshTooltip": "刷新仪表盘数据", + "admin.dashboard.config": "系统配置", + "admin.dashboard.maxFileSize": "最大文件大小:", + "admin.dashboard.translationService": "翻译服务:", + "admin.dashboard.formats": "支持格式:", + "admin.nav.dashboard": "Dashboard", + "admin.nav.users": "用户", + "admin.nav.pricing": "定价 & Stripe", + "admin.nav.providers": "服务商", + "admin.nav.system": "系统", + "admin.nav.logs": "日志", + "admin.users.title": "用户管理", + "admin.users.subtitle": "查看和管理用户账户", + "admin.users.planUpdated": "套餐已更新", + "admin.users.planChanged": "套餐已成功更改为\"{plan}\"。", + "admin.users.unknownError": "未知错误", + "admin.users.error": "错误", + "admin.users.planUpdateError": "无法更新套餐:{message}", + "admin.users.noKeys": "无密钥", + "admin.users.noKeysDesc": "该用户没有有效的API密钥。", + "admin.users.keysRevoked": "密钥已撤销", + "admin.users.keysRevokedDesc": "{count}个API密钥已成功撤销。", + "admin.users.revokeError": "无法撤销密钥:{message}", + "admin.users.retry": "重试", + "admin.system.title": "系统", + "admin.system.subtitle": "监控系统状态并管理资源", + "admin.system.quotas": "翻译配额", + "admin.system.resetQuotas": "重置月度配额", + "admin.system.resetting": "重置中...", + "admin.system.reset": "重置", + "admin.system.allOperational": "所有系统正常运行", + "admin.system.issuesDetected": "检测到系统问题", + "admin.system.waitingData": "等待数据...", + "admin.system.purging": "清理中...", + "admin.system.clean": "清理", + "admin.system.purge": "清除", + }, + + // ARABIC (ar) + // ═══════════════════════════════════════════════════════════════ + ar: { + "auth.brandName": "Office Translator", + "dashboard.nav.translate": "ترجمة", + "dashboard.nav.profile": "ملفي الشخصي", + "dashboard.nav.settings": "الإعدادات", + "dashboard.nav.context": "السياق", + "dashboard.nav.services": "الخدمات", + "dashboard.nav.apiKeys": "مفاتيح API", + "dashboard.nav.glossaries": "المعاجم", + "dashboard.header.title": "لوحة التحكم", + "dashboard.header.subtitle": "إدارة ترجماتك", + "dashboard.header.toggleMenu": "القائمة", + "dashboard.header.profileTitle": "ملفي الشخصي", + "dashboard.sidebar.theme": "المظهر", + "dashboard.sidebar.signOut": "تسجيل الخروج", + "dashboard.sidebar.backHome": "العودة إلى الصفحة الرئيسية", + "dashboard.translate.pageTitle": "ترجمة مستند", + "dashboard.translate.pageSubtitle": "استورد ملفًا واختر اللغة الهدف", + "dashboard.translate.errorNotificationTitle": "خطأ", + "dashboard.translate.dropzone.uploadAria": "منطقة إسقاط الملفات", + "dashboard.translate.dropzone.title": "اسحب ملفك وأفلته هنا", + "dashboard.translate.dropzone.subtitle": "أو انقر للاختيار (DOCX, XLSX, PPTX, PDF)", + "dashboard.translate.dropzone.replaceFile": "استبدال الملف", + "dashboard.translate.language.source": "لغة المصدر", + "dashboard.translate.language.target": "اللغة الهدف", + "dashboard.translate.language.loading": "جارٍ تحميل اللغات…", + "dashboard.translate.language.autoDetect": "كشف تلقائي", + "dashboard.translate.language.selectPlaceholder": "اختيار…", + "dashboard.translate.language.loadErrorPrefix": "فشل تحميل اللغات", + "dashboard.translate.provider.loading": "جارٍ تحميل مزوّدي الخدمة…", + "dashboard.translate.provider.noneConfigured": "لا يوجد مزوّدو خدمة مُعدّون", + "dashboard.translate.provider.modelTitle": "النموذج", + "dashboard.translate.provider.sectionTitle": "مزوّد الخدمة", + "dashboard.translate.provider.llmDivider": "ذكاء اصطناعي · مدرك للسياق", + "dashboard.translate.provider.llmDividerPro": "ذكاء اصطناعي · مدرك للسياق (Pro)", + "dashboard.translate.provider.upgrade": "الترقية إلى Pro", + "dashboard.translate.provider.upgradeSuffix": "لفتح ترجمة الذكاء الاصطناعي", + "dashboard.translate.trust.zeroRetention": "صفر احتفاظ بالبيانات", + "dashboard.translate.trust.deletedAfter": "تُحذف الملفات بعد المعالجة", + "dashboard.translate.actions.uploading": "جارٍ الرفع…", + "dashboard.translate.actions.translate": "ترجمة", + "dashboard.translate.actions.filePrefix": "الملف: ", + "dashboard.translate.actions.cancel": "إلغاء", + "dashboard.translate.actions.tryAgain": "إعادة المحاولة", + "dashboard.translate.steps.uploading": "جارٍ رفع الملف…", + "dashboard.translate.steps.starting": "جارٍ بدء الترجمة…", + "dashboard.translate.complete.title": "تمت الترجمة بنجاح!", + "dashboard.translate.complete.descNamed": "تمت ترجمة ملفك {name} بنجاح.", + "dashboard.translate.complete.descGeneric": "تمت ترجمة ملفك بنجاح.", + "dashboard.translate.complete.downloading": "جارٍ التنزيل…", + "dashboard.translate.complete.download": "تنزيل", + "dashboard.translate.complete.newTranslation": "ترجمة جديدة", + "dashboard.translate.complete.toastOkTitle": "تم بنجاح", + "dashboard.translate.complete.toastFailTitle": "فشل", + "dashboard.translate.complete.toastFailDesc": "فشلت الترجمة. يرجى إعادة المحاولة.", + "dashboard.translate.sourceDocument": "المستند المصدر", + "dashboard.translate.configuration": "الإعدادات", + "dashboard.translate.translating": "جارٍ الترجمة", + "dashboard.translate.liveMonitor": "المراقبة المباشرة", + "dashboard.translate.summary": "الملخص", + "dashboard.translate.engine": "المحرك", + "dashboard.translate.confidence": "الثقة", + "dashboard.translate.cancel": "إلغاء", + "dashboard.translate.segments": "الأجزاء", + "dashboard.translate.characters": "الأحرف", + "dashboard.translate.elapsed": "المنقضي", + "dashboard.translate.segPerMin": "جزء/دقيقة", + "dashboard.translate.highQuality": "جودة عالية", + "dashboard.translate.quality": "الجودة", + "dashboard.translate.completed": "اكتملت الترجمة", + "dashboard.translate.replace": "استبدال", + "dashboard.translate.pdfMode.title": "وضع ترجمة PDF", + "dashboard.translate.pdfMode.preserveLayout": "الحفاظ على التخطيط", + "dashboard.translate.pdfMode.textOnly": "نص فقط", + "dashboard.translate.pdfMode.preserveLayoutDesc": "يحافظ على الصور والجداول والتنسيق. مثالي لملفات PDF البسيطة.", + "dashboard.translate.pdfMode.textOnlyDesc": "يترجم كل النص بشكل مثالي. مخرجات نظيفة دون مشاكل تخطيط.", + "dashboard.translate.pipeline.upload": "رفع", + "dashboard.translate.pipeline.analyze": "تحليل", + "dashboard.translate.pipeline.translate": "ترجمة", + "dashboard.translate.pipeline.rebuild": "إعادة بناء", + "dashboard.translate.pipeline.finalize": "إنهاء", + "dashboard.translate.progress.failedTitle": "فشلت الترجمة", + "glossaries.dialog.title": "معجم جديد", + "glossaries.dialog.description": "أنشئ معجمًا لترجماتك", + "glossaries.dialog.nameLabel": "الاسم", + "glossaries.dialog.namePlaceholder": "معجمي", + "glossaries.dialog.tabTemplates": "القوالب", + "glossaries.dialog.tabFile": "ملف", + "glossaries.dialog.tabManual": "يدوي", + "glossaries.dialog.cancel": "إلغاء", + "glossaries.dialog.creating": "جارٍ الإنشاء…", + "glossaries.dialog.importing": "جارٍ الاستيراد…", + "glossaries.dialog.importBtn": "استيراد", + "glossaries.dialog.selectPrompt": "اختيار", + "glossaries.dialog.createBtn": "إنشاء", + "glossaries.dialog.createEmpty": "إنشاء فارغ", + "glossaries.dialog.terms": "مصطلحات", + "glossaries.dialog.templatesDesc": "اختر قالبًا مُعدًّا مسبقًا", + "glossaries.dialog.templatesEmpty": "لا توجد قوالب متاحة", + "glossaries.dialog.dropTitle": "اسحب ملف CSV هنا", + "glossaries.dialog.dropOr": "أو", + "glossaries.dialog.dropFormats": "CSV, TSV, TXT", + "glossaries.dialog.formatTitle": "التنسيق", + "glossaries.dialog.formatDesc": "المصدر،الهدف (واحدة لكل سطر)", + "glossaries.dialog.formatNote": "يُتجاهل السطر الأول عند اكتشاف ترويسة", + "glossaries.dialog.errorFormat": "تنسيق غير مدعوم", + "glossaries.dialog.errorSize": "الملف كبير جدًا", + "glossaries.dialog.errorEmpty": "ملف فارغ", + "glossaries.dialog.errorRead": "خطأ في القراءة", + "glossaries.dialog.parsing": "جارٍ التحليل…", + "glossaries.dialog.termsImported": "مصطلحات مستوردة", + "glossaries.dialog.changeFile": "تغيير الملف", + "glossaries.dialog.retry": "إعادة المحاولة", + "pricing.nav.back": "رجوع", + "pricing.nav.home": "الرئيسية", + "pricing.nav.mySubscription": "اشتراكي", + "pricing.header.badge": "نماذج الذكاء الاصطناعي المحدّثة — مارس 2026", + "pricing.header.title": "خطة لكل احتياج", + "pricing.header.subtitle": "ترجم مستندات Word و Excel و PowerPoint مع الحفاظ على التنسيق الأصلي. بدون الحاجة إلى مفتاح API.", + "pricing.billing.monthly": "شهري", + "pricing.billing.yearly": "سنوي", + "pricing.plans.free.name": "مجاني", + "pricing.plans.starter.name": "Starter", + "pricing.plans.pro.name": "Pro", + "pricing.plans.business.name": "Business", + "pricing.plans.enterprise.name": "Enterprise", + "pricing.plans.free.description": "مثالي لاكتشاف التطبيق", + "pricing.plans.starter.description": "للأفراد والمشاريع الصغيرة", + "pricing.plans.pro.description": "للمحترفين والفرق النامية", + "pricing.plans.business.description": "للفرق والمؤسسات", + "pricing.plans.enterprise.description": "حلول مخصصة للمؤسسات الكبيرة", + "pricing.plans.pro.highlight": "الأكثر شعبية", + "pricing.plans.pro.badge": "رائج", + "pricing.plans.enterprise.badge": "حسب الطلب", + "pricing.plans.free.feat1": "5 مستندات / شهر", + "pricing.plans.free.feat2": "حتى 15 صفحة لكل مستند", + "pricing.plans.free.feat3": "ترجمة Google مشمولة", + "pricing.plans.free.feat4": "جميع اللغات (130+)", + "pricing.plans.free.feat5": "دعم المجتمع", + "pricing.plans.starter.feat1": "50 مستندًا / شهر", + "pricing.plans.starter.feat2": "حتى 50 صفحة لكل مستند", + "pricing.plans.starter.feat3": "ترجمة Google + DeepL", + "pricing.plans.starter.feat4": "ملفات حتى 10 ميغابايت", + "pricing.plans.starter.feat5": "دعم عبر البريد الإلكتروني", + "pricing.plans.starter.feat6": "سجل 30 يومًا", + "pricing.plans.pro.feat1": "200 مستند / شهر", + "pricing.plans.pro.feat2": "حتى 200 صفحة لكل مستند", + "pricing.plans.pro.feat3": "ترجمة AI أساسية (DeepSeek V3.2)", + "pricing.plans.pro.feat4": "ترجمة Google + DeepL", + "pricing.plans.pro.feat5": "ملفات حتى 25 ميغابايت", + "pricing.plans.pro.feat6": "معاجم مخصصة", + "pricing.plans.pro.feat7": "دعم ذو أولوية", + "pricing.plans.pro.feat8": "سجل 90 يومًا", + "pricing.plans.business.feat1": "1 000 مستند / شهر", + "pricing.plans.business.feat2": "حتى 500 صفحة لكل مستند", + "pricing.plans.business.feat3": "AI أساسية + متميزة (Claude Haiku)", + "pricing.plans.business.feat4": "جميع مزوّدي الترجمة", + "pricing.plans.business.feat5": "ملفات حتى 50 ميغابايت", + "pricing.plans.business.feat6": "وصول API (10 000 استدعاء/شهر)", + "pricing.plans.business.feat7": "ويب هوك للإشعارات", + "pricing.plans.business.feat8": "دعم مخصص", + "pricing.plans.business.feat9": "سجل سنة واحدة", + "pricing.plans.business.feat10": "تحليلات متقدمة", + "pricing.plans.enterprise.feat1": "مستندات بلا حدود", + "pricing.plans.enterprise.feat2": "جميع نماذج AI (GPT-5, Claude Opus 4.6…)", + "pricing.plans.enterprise.feat3": "نشر محلي أو سحابة مخصصة", + "pricing.plans.enterprise.feat4": "SLA 99.9% مضمون", + "pricing.plans.enterprise.feat5": "دعم مخصص على مدار الساعة", + "pricing.plans.enterprise.feat6": "العلامة البيضاء (White-label)", + "pricing.plans.enterprise.feat7": "فرق بلا حدود", + "pricing.plans.enterprise.feat8": "تكاملات مخصصة", + "pricing.card.onRequest": "حسب الطلب", + "pricing.card.free": "مجاني", + "pricing.card.perMonth": "/شهر", + "pricing.card.billedYearly": "يُحاسب {price} € / سنة", + "pricing.card.documents": "المستندات", + "pricing.card.pagesMax": "الحد الأقصى للصفحات", + "pricing.card.aiTranslation": "ترجمة AI", + "pricing.card.unlimited": "بلا حدود", + "pricing.card.perMonthStat": "/ شهر", + "pricing.card.perDoc": "ص / مستند", + "pricing.card.aiEssential": "أساسي", + "pricing.card.aiEssentialPremium": "أساسي + متميز", + "pricing.card.aiCustom": "مخصص", + "pricing.card.myPlan": "خطتي", + "pricing.card.managePlan": "إدارة خطتي", + "pricing.card.startFree": "ابدأ مجانًا", + "pricing.card.contactUs": "تواصل معنا", + "pricing.card.choosePlan": "اختر هذه الخطة", + "pricing.card.processing": "جارٍ المعالجة…", + "pricing.comparison.title": "مقارنة تفصيلية", + "pricing.comparison.subtitle": "كل ما هو مشمول في كل خطة", + "pricing.comparison.feature": "الميزة", + "pricing.comparison.docsPerMonth": "المستندات / شهر", + "pricing.comparison.pagesMaxPerDoc": "الحد الأقصى للصفحات / مستند", + "pricing.comparison.maxFileSize": "الحد الأقصى لحجم الملف", + "pricing.comparison.googleTranslation": "ترجمة Google", + "pricing.comparison.deepl": "DeepL", + "pricing.comparison.aiEssential": "ترجمة AI أساسية", + "pricing.comparison.aiPremium": "ترجمة AI متميزة", + "pricing.comparison.apiAccess": "وصول API", + "pricing.comparison.priorityProcessing": "معالجة ذات أولوية", + "pricing.comparison.support": "الدعم", + "pricing.comparison.support.community": "المجتمع", + "pricing.comparison.support.email": "البريد الإلكتروني", + "pricing.comparison.support.priority": "ذو أولوية", + "pricing.comparison.support.dedicated": "مخصص", + "pricing.comparison.mb": "ميغابايت", + "pricing.credits.title": "أرصدة إضافية", + "pricing.credits.subtitle": "تحتاج المزيد؟ اشترِ أرصدة فردية بدون اشتراك.", + "pricing.credits.perPage": "رصيد واحد = صفحة واحدة مترجمة.", + "pricing.credits.bestValue": "أفضل قيمة", + "pricing.credits.unit": "أرصدة", + "pricing.credits.centsPerCredit": "سنت / رصيد", + "pricing.credits.buy": "شراء", + "pricing.trust.encryption.title": "تشفير شامل", + "pricing.trust.encryption.sub": "TLS 1.3 + AES-256 في حالة السكون", + "pricing.trust.languages.title": "+130 لغة", + "pricing.trust.languages.sub": "بما فيها العربية والفارسية والعبرية (RTL)", + "pricing.trust.parallel.title": "معالجة متوازية", + "pricing.trust.parallel.sub": "ذكاء اصطناعي متعدد المسارات فائق السرعة", + "pricing.trust.availability.title": "متاح على مدار الساعة", + "pricing.trust.availability.sub": "ضمان وقت تشغيل 99.9%", + "pricing.aiModels.title": "نماذج الذكاء الاصطناعي — مارس 2026", + "pricing.aiModels.essential.title": "ترجمة AI أساسية", + "pricing.aiModels.essential.plan": "خطة Pro", + "pricing.aiModels.essential.descPrefix": "مبني على", + "pricing.aiModels.essential.descSuffix": "— أنموذج الذكاء الاصطناعي الأكثر فعالية من حيث التكلفة لعام 2026. جودة مماثلة للنماذج المتقدمة بتكلفة 1/50.", + "pricing.aiModels.essential.context": "163K رمز سياقي", + "pricing.aiModels.essential.value": "قيمة ممتازة مقابل المال", + "pricing.aiModels.premium.title": "ترجمة AI متميزة", + "pricing.aiModels.premium.plan": "خطة Business", + "pricing.aiModels.premium.descPrefix": "مبني على", + "pricing.aiModels.premium.descSuffix": "من Anthropic — دقة عالية في المستندات القانونية والطبية والتقنية المعقدة.", + "pricing.aiModels.premium.context": "200K رمز سياقي", + "pricing.aiModels.premium.precision": "أعلى دقة", + "pricing.faq.title": "الأسئلة الشائعة", + "pricing.faq.q1": "هل يمكنني تغيير خطتي في أي وقت؟", + "pricing.faq.a1": "نعم. الترقية فورية ومُحاسب عليها بالتناسب. التخفيض يسري في نهاية الفترة الحالية.", + "pricing.faq.q2": "ما هي «ترجمة AI الأساسية»؟", + "pricing.faq.a2": "إنها محرك الذكاء الاصطناعي لدينا المبني على DeepSeek V3.2 عبر OpenRouter. يفهم سياق مستنداتك ويحافظ على التنسيق ويتعامل مع المصطلحات التقنية بشكل أفضل بكثير من الترجمة التقليدية.", + "pricing.faq.q3": "ما الفرق بين AI الأساسية وAI المتميزة؟", + "pricing.faq.a3": "AI الأساسية تستخدم DeepSeek V3.2 (قيمة ممتازة مقابل المال). AI المتميزة تستخدم Claude 3.5 Haiku من Anthropic وهي أكثر دقة في المستندات القانونية والطبية والتقنية المعقدة.", + "pricing.faq.q4": "هل تُحفظ مستنداتي بعد الترجمة؟", + "pricing.faq.a4": "الملفات المترجمة متاحة حسب خطتك (30 يومًا لـ Starter، 90 يومًا لـ Pro، سنة واحدة لـ Business). وهي مشفرة أثناء التخزين والنقل.", + "pricing.faq.q5": "ماذا يحدث إذا تجاوزت حصتي الشهرية؟", + "pricing.faq.a5": "يمكنك شراء أرصدة إضافية بشكل فردي أو ترقية خطتك. يتم إشعارك عند بلوغ 80% من الاستخدام.", + "pricing.faq.q6": "هل توجد فترة تجريبية مجانية للخطط المدفوعة؟", + "pricing.faq.a6": "الخطة المجانية دائمة ولا تتطلب بطاقة ائتمان. للخطط Pro و Business تواصل معنا للحصول على تجربة 14 يومًا.", + "pricing.faq.q7": "ما تنسيقات الملفات المدعومة؟", + "pricing.faq.a7": "Word (.docx), Excel (.xlsx/.xls), PowerPoint (.pptx), and soon PDF. All plans support the same formats.", + "landing.ai.badge": "AI-Powered Translation Engine", + "landing.ai.title": "Translation that understands your craft", + "landing.ai.subtitle": "Our AI models analyze context, respect your terminology, and even translate text inside images.", + "landing.ai.context.title": "Industry Context", + "landing.ai.context.desc": "Describe your field and get tailored translations, not generic ones.", + "landing.ai.glossary.title": "Industry Glossaries", + "landing.ai.glossary.desc": "Define your technical terms for precise, domain-specific translations.", + "landing.ai.vision.title": "Image Vision", + "landing.ai.vision.desc": "Text embedded in images, diagrams and charts is detected and translated.", + "landing.ai.comparison.source": "Source (FR)", + "landing.ai.comparison.google": "Google Translate", + "landing.ai.comparison.ai": "Our AI", + "landing.howItWorks.title": "How it works", + "landing.howItWorks.subtitle": "Three steps. Zero formatting loss.", + "landing.howItWorks.step1.title": "Upload your file", + "landing.howItWorks.step1.desc": "Drag and drop your Excel, Word, PowerPoint or PDF document.", + "landing.howItWorks.step2.title": "Pick language and engine", + "landing.howItWorks.step2.desc": "Select target language and engine - standard or context-aware AI.", + "landing.howItWorks.step3.title": "Download the result", + "landing.howItWorks.step3.desc": "Get your translated document with formatting identical to the original.", + "pricing.cta.title": "مستعد للبدء؟", + "pricing.cta.subtitle": "ابدأ مجانًا بدون بطاقة ائتمان. رقِّق عندما تحتاج.", + "pricing.cta.createAccount": "إنشاء حساب مجاني", + "pricing.cta.login": "تسجيل الدخول", + "pricing.toast.demo": "الوضع التجريبي — Stripe لم يُعدّ بعد. في بيئة الإنتاج سيتم توجيهك إلى الدفع لتفعيل خطة {planId}.", + "pricing.toast.networkError": "خطأ في الشبكة. يرجى إعادة المحاولة.", + "pricing.toast.paymentError": "خطأ أثناء إنشاء الدفع.", + "register.title": "إنشاء حساب", + "register.subtitle": "ابدأ الترجمة مجانًا", + "register.error.failed": "فشل التسجيل", + "register.name.label": "الاسم", + "register.name.placeholder": "اسمك", + "register.name.error": "يجب أن يحتوي الاسم على حرفين على الأقل", + "register.email.label": "البريد الإلكتروني", + "register.email.placeholder": "you@example.com", + "register.email.error": "عنوان بريد إلكتروني غير صالح", + "register.password.label": "كلمة المرور", + "register.password.error": "يجب أن تتكون كلمة المرور من 8 أحرف على الأقل، مع حرف كبير وحرف صغير ورقم", + "register.password.show": "إظهار كلمة المرور", + "register.password.hide": "إخفاء كلمة المرور", + "register.password.strengthLabel": "القوة:", + "register.password.strength.weak": "ضعيفة", + "register.password.strength.medium": "متوسطة", + "register.password.strength.strong": "قوية", + "register.confirmPassword.label": "تأكيد كلمة المرور", + "register.confirmPassword.error": "كلمتا المرور غير متطابقتين", + "register.confirmPassword.show": "إظهار", + "register.confirmPassword.hide": "إخفاء", + "register.submit.creating": "جارٍ إنشاء الحساب...", + "register.submit.create": "إنشاء حسابي", + "register.hasAccount": "لديك حساب بالفعل؟", + "register.login": "تسجيل الدخول", + "register.terms.prefix": "بإنشاء حساب، فإنك تقبل", + "register.terms.link": "شروط الخدمة الخاصة بنا", + + // ── Landing page ── + "landing.nav.whyUs": "لماذا نحن", + "landing.nav.formats": "التنسيقات", + "landing.nav.pricing": "الأسعار", + "landing.nav.login": "تسجيل الدخول", + "landing.nav.startFree": "ابدأ مجانًا", + "landing.hero.badge": "جديد: دعم PDF + ترجمة بالذكاء الاصطناعي", + "landing.hero.title1": "ترجم مستنداتك.", + "landing.hero.title2": "حافظ على التنسيق مثاليًا.", + "landing.hero.subtitle": "المترجم الوحيد الذي يحافظ على SmartArt والرسوم البيانية وجداول المحتويات والأشكال والرؤوس والتذييلات — تمامًا كما كانت. لا مفاجآت عند الدفع.", + "landing.hero.cta": "ابدأ مجانًا — مستندان/شهر", + "landing.hero.seePlans": "عرض الخطط", + "landing.trust.filesDeleted": "تُحذف الملفات بعد 60 دقيقة", + "landing.trust.noBait": "بدون أسعار خادعة", + "landing.trust.preview": "معاينة قبل الدفع", + "landing.why.title": "تنسيقك، محفوظ بشكل مثالي", + "landing.why.subtitle": "المترجمون الآخرون يفسدون تخطيطك. نحن لا.", + "landing.why.smartart.title": "SmartArt والمخططات", + "landing.why.smartart.desc": "Organizational charts, flowcharts, hierarchy diagrams - all translated in place.", + "landing.why.charts.title": "الرسوم البيانية والمخططات", + "landing.why.charts.desc": "العناوين، تسميات المحاور، التسميات التوضيحية، وأسماء السلاسل — كل شيء يُترجم.", + "landing.why.shapes.title": "الأشكال ومربعات النص", + "landing.why.shapes.desc": "مستطيلات، صناديق مستديرة، تعليقات توضيحية — نجد ونترجم النص داخل جميع الأشكال.", + "landing.why.headers.title": "الرؤوس والتذييلات", + "landing.why.headers.desc": "رؤوس الصفحات والتذييلات ونصوص الحواشي لا تُفوَّت أبدًا.", + "landing.why.languages.title": "+130 لغة", + "landing.why.languages.desc": "Google Translate و DeepL ومحركات ذكاء اصطناعي لجودة احترافية.", + "landing.pricing.title": "أسعار بسيطة وشفافة", + "landing.pricing.subtitle": "ما تراه هو ما تدفعه. لا رسوم خفية بعد الترجمة.", + "landing.pricing.monthly": "شهري", + "landing.pricing.yearly": "سنوي", + "landing.pricing.starter.title": "Starter", + "landing.pricing.starter.desc": "للأفراد والمشاريع الصغيرة", + "landing.pricing.starter.f1": "50 مستندًا / شهر", + "landing.pricing.starter.f2": "حتى 50 صفحة لكل مستند", + "landing.pricing.starter.f3": "Google Translate + DeepL", + "landing.pricing.starter.f4": "ملفات حتى 10 ميغابايت", + "landing.pricing.starter.cta": "ابدأ الآن", + "landing.pricing.pro.title": "Pro", + "landing.pricing.pro.badge": "الأكثر شعبية", + "landing.pricing.pro.desc": "للمحترفين الذين يحتاجون الجودة", + "landing.pricing.pro.f1": "200 مستند / شهر", + "landing.pricing.pro.f2": "حتى 200 صفحة لكل مستند", + "landing.pricing.pro.f3": "ترجمة بالذكاء الاصطناعي (DeepSeek)", + "landing.pricing.pro.f4": "Google + DeepL مشمولان", + "landing.pricing.pro.f5": "معاجم وأوامر مخصصة", + "landing.pricing.pro.f6": "دعم ذو أولوية", + "landing.pricing.pro.cta": "جرّب Pro", + "landing.pricing.business.title": "Business", + "landing.pricing.business.desc": "للفرق ذات الاحتياجات الكبيرة", + "landing.pricing.business.f1": "1 000 مستند / شهر", + "landing.pricing.business.f2": "حتى 500 صفحة لكل مستند", + "landing.pricing.business.f3": "ذكاء اصطناعي متميز (Claude)", + "landing.pricing.business.f4": "جميع مزوّدي الخدمة + وصول API", + "landing.pricing.business.f5": "ويب هوك وأتمتة", + "landing.pricing.business.f6": "5 مقاعد للفريق", + "landing.pricing.business.cta": "تواصل معنا", + "landing.pricing.honest": "السعر المعروض هو السعر الذي تدفعه. لا رسوم خفية بعد الترجمة.", + "landing.pricing.billedYearly": "يُحاسب سنويًا", + "landing.pricing.perMonth": "/شهر", + "landing.formats.title": "كل تنسيق، كل عنصر", + "landing.formats.subtitle": "نترجم ما يفوّته الآخرون.", + "landing.formats.word": "Word (.docx)", + "landing.formats.word.f1": "الفقرات والعناوين", + "landing.formats.word.f2": "الجداول والرسوم البيانية", + "landing.formats.word.f3": "مخططات SmartArt", + "landing.formats.word.f4": "جدول المحتويات", + "landing.formats.word.f5": "الرؤوس والتذييلات", + "landing.formats.word.f6": "الأشكال ومربعات النص", + "landing.formats.word.f7": "الحواشي والتعليقات الختامية", + "landing.formats.excel": "Excel (.xlsx)", + "landing.formats.excel.f1": "قيم الخلايا", + "landing.formats.excel.f2": "أسماء الأوراق", + "landing.formats.excel.f3": "الرسوم البيانية والتسميات", + "landing.formats.excel.f4": "الرؤوس والتذييلات", + "landing.formats.excel.f5": "الخلايا المدمجة محفوظة", + "landing.formats.powerpoint": "PowerPoint (.pptx)", + "landing.formats.powerpoint.f1": "نص الشرائح والملاحظات", + "landing.formats.powerpoint.f2": "الرسوم البيانية والمخططات", + "landing.formats.powerpoint.f3": "الأشكال ومربعات النص", + "landing.formats.powerpoint.f4": "التخطيطات الرئيسية", + "landing.formats.powerpoint.f5": "الحركات محفوظة", + "landing.formats.pdf": "PDF", + "landing.formats.pdf.f1": "ملفات PDF النصية", + "landing.formats.pdf.f2": "التخطيط محفوظ", + "landing.formats.pdf.f3": "الصور في مكانها", + "landing.formats.pdf.f4": "الجداول محفوظة", + "landing.formats.pdf.f5": "الإخراج كـ DOCX أو PDF", + "landing.cta.title": "ابدأ الترجمة في 30 ثانية", + "landing.cta.subtitle": "لا حاجة لبطاقة ائتمان. جرّب مستندين مجانًا وشاهد الفرق.", + "landing.cta.button": "إنشاء حساب مجاني", + "landing.footer.privacy": "الخصوصية", + "landing.footer.terms": "الشروط", + "landing.footer.contact": "اتصل بنا", + + "common.loading": "جارٍ التحميل...", + "profile.header.title": "ملفي الشخصي", + "profile.header.subtitle": "إدارة حسابك وتفضيلاتك.", + "profile.tabs.account": "الحساب", + "profile.tabs.subscription": "الاشتراك", + "profile.tabs.preferences": "التفضيلات", + "profile.account.user": "المستخدم", + "profile.account.memberSince": "عضو منذ", + "profile.plan.label": "الخطة", + "profile.plan.free": "Free", + "profile.plan.starter": "Starter", + "profile.plan.pro": "Pro", + "profile.plan.business": "Business", + "profile.plan.enterprise": "Enterprise", + "profile.plan.pricePerMonth": "{price} €/شهر", + "profile.subscription.canceling": "جارٍ الإلغاء", + "profile.subscription.active": "نشط", + "profile.subscription.unknown": "غير معروف", + "profile.subscription.accessUntil": "الوصول حتى", + "profile.subscription.renewalOn": "التجديد في", + "profile.subscription.upgradePlan": "الترقية إلى خطة مدفوعة", + "profile.subscription.changePlan": "تغيير الخطة", + "profile.subscription.manageBilling": "إدارة الفوترة", + "profile.subscription.billingUnavailable": "بوابة الفوترة غير متاحة.", + "profile.subscription.billingError": "خطأ في الوصول إلى بوابة الفوترة.", + "profile.subscription.cancelSuccess": "تم إلغاء الاشتراك. تحتفظ بالوصول حتى نهاية الفترة.", + "profile.subscription.cancelError": "حدث خطأ أثناء الإلغاء.", + "profile.subscription.networkError": "خطأ في الشبكة.", + "profile.usage.title": "الاستخدام هذا الشهر", + "profile.usage.resetOn": "إعادة التعيين في", + "profile.usage.documents": "المستندات", + "profile.usage.pages": "الصفحات", + "profile.usage.extraCredits": "رصيد إضافي", + "profile.usage.extraCreditsPlural": "أرصدة إضافية", + "profile.usage.quotaReached": "تم بلوغ الحصة", + "profile.usage.quotaReachedDesc": "قم بالترقية إلى خطة أعلى للمتابعة.", + "profile.usage.unlockMore": "احصل على المزيد من الترجمات مع خطة مدفوعة.", + "profile.usage.viewPlans": "عرض الخطط", + "profile.usage.includedInPlan": "مضمن في خطتك", + "profile.danger.title": "منطقة الخطر", + "profile.danger.description": "يتم تطبيق الإلغاء في نهاية الفترة الحالية. تحتفظ بالوصول حتى ذلك التاريخ.", + "profile.danger.confirm": "هل أنت متأكد؟ لا يمكن التراجع عن هذا الإجراء.", + "profile.danger.confirmCancel": "تأكيد الإلغاء", + "profile.danger.cancelSubscription": "إلغاء اشتراكي", + "profile.danger.keep": "لا، إبقاء", + "profile.prefs.interfaceLang": "لغة الواجهة", + "profile.prefs.interfaceLangDesc": "يتم اكتشاف اللغة تلقائيًا بناءً على متصفحك. يمكنك تغييرها يدويًا.", + "profile.prefs.defaultTargetLang": "اللغة الهدف الافتراضية", + "profile.prefs.selectLanguage": "اختر لغة", + "profile.prefs.defaultTargetLangDesc": "سيتم تحديد هذه اللغة مسبقًا لترجماتك.", + "profile.prefs.save": "حفظ", + "profile.prefs.theme": "المظهر", + "profile.prefs.themeDesc": "اختر مظهر الواجهة", + "profile.prefs.cache": "ذاكرة التخزين المؤقت", + "profile.prefs.cacheDesc": "مسح ذاكرة التخزين المؤقت المحلية قد يحل بعض مشاكل العرض.", + "profile.prefs.clearing": "جارٍ المسح...", + "profile.prefs.clearCache": "مسح ذاكرة التخزين المؤقت", + "settings.title": "الإعدادات", + "settings.subtitle": "إعدادات التطبيق العامة", + "settings.formats.title": "التنسيقات المدعومة", + "settings.formats.subtitle": "أنواع المستندات التي يمكنك ترجمتها", + "settings.formats.formulas": "الصيغ", + "settings.formats.styles": "الأنماط", + "settings.formats.images": "الصور", + "settings.formats.headers": "الرؤوس", + "settings.formats.tables": "الجداول", + "settings.formats.slides": "الشرائح", + "settings.formats.notes": "الملاحظات", + "settings.cache.title": "ذاكرة التخزين المؤقت", + "settings.cache.desc": "مسح ذاكرة التخزين المؤقت المحلية قد يحل بعض مشاكل العرض.", + "settings.cache.clearing": "جارٍ المسح...", + "settings.cache.clear": "مسح ذاكرة التخزين المؤقت", + "services.title": "مزودو الترجمة", + "services.subtitle": "تم تكوين المزودين من قبل المسؤول. يمكنك معرفة أيهم متاح حاليًا لحسابك.", + "services.loading": "جارٍ تحميل المزودين...", + "services.noProviders": "لا يوجد مزودون مكوّنون حاليًا. اتصل بالمسؤول.", + "services.classic": "ترجمة كلاسيكية", + "services.llmPro": "LLM · مدرك للسياق (Pro)", + "services.available": "متاح", + "services.model": "النموذج", + "services.adminOnly.title": "تكوين المزودين للمسؤولين فقط", + "services.adminOnly.desc": "يتم إدارة مفاتيح API واختيار النماذج وتفعيل المزودين حصريًا من قبل المسؤول في لوحة الإدارة. لا تحتاج أبدًا إلى إدخال مفتاح API.", + "apiKeys.title": "مفاتيح API", + "apiKeys.subtitle": "إدارة مفاتيح API للوصول البرمجي إلى واجهة الترجمة.", + "apiKeys.loading": "جارٍ التحميل...", + "apiKeys.sectionTitle": "API والأتمتة", + "apiKeys.sectionDesc": "إنشاء وإدارة مفاتيح API لسير عمل الأتمتة", + "apiKeys.keysUsed": "{total} من {max} مفاتيح مستخدمة", + "apiKeys.maxReached": "تم بلوغ الحد الأقصى للمفاتيح. قم بإلغاء مفتاح لإنشاء واحد جديد.", + "apiKeys.canGenerate": "يمكنك إنشاء {count} مفتاح إضافي", + "apiKeys.canGeneratePlural": "يمكنك إنشاء {count} مفاتيح إضافية", + "apiKeys.generateNew": "إنشاء مفتاح جديد", + "apiKeys.keyRevoked": "تم إلغاء المفتاح", + "apiKeys.keyRevokedDesc": "تم إلغاء مفتاح API بنجاح.", + "apiKeys.keyNotFound": "المفتاح غير موجود", + "apiKeys.keyNotFoundDesc": "مفتاح API لم يعد موجودًا. ربما تم إلغاؤه بالفعل.", + "apiKeys.error": "خطأ", + "apiKeys.revokeError": "فشل إلغاء مفتاح API. يرجى المحاولة مرة أخرى.", + "apiKeys.limitReached": "تم بلوغ الحد", + "apiKeys.limitReachedDesc": "لقد وصلت إلى الحد الأقصى وهو 10 مفاتيح API. قم بإلغاء مفتاح حالي لإنشاء واحد جديد.", + "apiKeys.proRequired": "ميزة Pro مطلوبة", + "apiKeys.proRequiredDesc": "مفاتيح API هي ميزة Pro. يرجى ترقية حسابك.", + "apiKeys.generateError": "فشل إنشاء مفتاح API. يرجى المحاولة مرة أخرى.", + "apiKeys.upgrade.title": "مفاتيح API", + "apiKeys.upgrade.subtitle": "أتمتة ترجماتك مع وصول API", + "apiKeys.upgrade.feat1": "إنشاء مفاتيح API غير محدودة", + "apiKeys.upgrade.feat2": "أتمتة ترجمة المستندات", + "apiKeys.upgrade.feat3": "إشعارات Webhook", + "apiKeys.upgrade.feat4": "أوضاع ترجمة LLM", + "apiKeys.upgrade.proFeature": "مفاتيح API هي ميزة {pro}. قم بالترقية لفتح أتمتة API.", + "apiKeys.upgrade.pro": "Pro", + "apiKeys.upgrade.cta": "الترقية إلى Pro", + "apiKeys.dialog.maxTitle": "تم بلوغ الحد الأقصى للمفاتيح", + "apiKeys.dialog.maxDesc": "لقد وصلت إلى الحد الأقصى وهو 10 مفاتيح API. يرجى إلغاء مفتاح حالي قبل إنشاء واحد جديد.", + "apiKeys.dialog.close": "إغلاق", + "apiKeys.dialog.generated": "تم إنشاء مفتاح API!", + "apiKeys.dialog.generatedDesc": "تم إنشاء مفتاح API الجديد. انسخه الآن - لن يظهر مرة أخرى.", + "apiKeys.dialog.important": "مهم:", + "apiKeys.dialog.importantDesc": "هذه هي المرة الوحيدة التي سترى فيها هذا المفتاح. احفظه في مكان آمن.", + "apiKeys.dialog.apiKey": "مفتاح API", + "apiKeys.dialog.name": "الاسم:", + "apiKeys.dialog.done": "تم", + "apiKeys.dialog.copied": "لقد نسخت المفتاح", + "apiKeys.dialog.generateTitle": "إنشاء مفتاح API جديد", + "apiKeys.dialog.generateDesc": "إنشاء مفتاح API جديد للوصول البرمجي إلى واجهة الترجمة.", + "apiKeys.dialog.keyName": "اسم المفتاح (اختياري)", + "apiKeys.dialog.keyNamePlaceholder": "مثال: الإنتاج، الاختبار", + "apiKeys.dialog.keyNameHint": "اسم وصفي لمساعدتك على التعرف على هذا المفتاح لاحقًا.", + "apiKeys.dialog.nameTooLong": "يجب ألا يتجاوز الاسم {max} حرفًا", + "apiKeys.dialog.nameInvalid": "يمكن أن يحتوي الاسم على أحرف وأرقام ومسافات وشرطات وشرطات سفلية فقط", + "apiKeys.dialog.cancel": "إلغاء", + "apiKeys.dialog.generating": "جارٍ الإنشاء...", + "apiKeys.dialog.generate": "إنشاء مفتاح", + "apiKeys.table.name": "الاسم", + "apiKeys.table.prefix": "البادئة", + "apiKeys.table.created": "تاريخ الإنشاء", + "apiKeys.table.lastUsed": "آخر استخدام", + "apiKeys.table.never": "أبدًا", + "apiKeys.table.actions": "الإجراءات", + "apiKeys.table.revoke": "إلغاء", + "apiKeys.table.copyPrefix": "نسخ بادئة المفتاح", + "apiKeys.table.revokeKey": "إلغاء المفتاح", + "apiKeys.revokeDialog.title": "إلغاء مفتاح API", + "apiKeys.revokeDialog.desc": "هل أنت متأكد من إلغاء المفتاح \"{name}\"؟ لا يمكن التراجع عن هذا الإجراء.", + "apiKeys.revokeDialog.confirm": "نعم، إلغاء", + "apiKeys.revokeDialog.cancel": "إلغاء", + "context.proTitle": "ميزة Pro", + "context.proDesc": "السياق والمصطلحات المهنية متاحة مع خطط Pro وBusiness وEnterprise. توفر ترجمات أكثر دقة من خلال تعليمات ومفردات خاصة بمجالك.", + "context.viewPlans": "عرض الخطط", + "context.title": "السياق والمصطلحات", + "context.subtitle": "حسّن جودة الترجمة من خلال تعليمات ومفردات خاصة بمجالك.", + "context.presets.title": "المصطلحات المهنية", + "context.presets.desc": "تحميل مصطلحات كاملة مع تعليمات ومصطلحات متخصصة", + "context.instructions.title": "تعليمات السياق", + "context.instructions.desc": "تعليمات سيتبعها الذكاء الاصطناعي أثناء الترجمة", + "context.instructions.placeholder": "مثال: أنت تترجم مستندات تقنية HVAC. استخدم مصطلحات الهندسة الدقيقة...", + "context.glossary.title": "المصطلحات التقنية", + "context.glossary.desc": "التنسيق: source=target (واحد في كل سطر). المصطلحات المحملة عبر الإعدادات المسبقة قابلة للتعديل.", + "context.glossary.terms": "مصطلحات في القاموس", + "context.clearAll": "مسح الكل", + "context.saving": "جارٍ الحفظ...", + "context.save": "حفظ", + "admin.login.title": "الإدارة", + "admin.login.required": "تسجيل الدخول مطلوب", + "admin.login.password": "كلمة مرور المسؤول", + "admin.login.connecting": "جارٍ الاتصال...", + "admin.login.access": "الدخول إلى لوحة الإدارة", + "admin.login.restricted": "مخصص للمسؤولين فقط", + "admin.layout.checking": "جارٍ التحقق من المصادقة...", + "admin.dashboard.title": "لوحة تحكم المسؤول", + "admin.dashboard.subtitle": "لوحة تحكم المسؤولين", + "admin.dashboard.refresh": "تحديث", + "admin.dashboard.refreshTooltip": "تحديث بيانات لوحة التحكم", + "admin.dashboard.config": "إعدادات النظام", + "admin.dashboard.maxFileSize": "الحد الأقصى لحجم الملف:", + "admin.dashboard.translationService": "خدمة الترجمة:", + "admin.dashboard.formats": "التنسيقات:", + "admin.nav.dashboard": "Dashboard", + "admin.nav.users": "المستخدمون", + "admin.nav.pricing": "الأسعار و Stripe", + "admin.nav.providers": "المزوّدون", + "admin.nav.system": "النظام", + "admin.nav.logs": "السجلات", + "admin.users.title": "إدارة المستخدمين", + "admin.users.subtitle": "عرض حسابات المستخدمين وإدارتها", + "admin.users.planUpdated": "تم تحديث الخطة", + "admin.users.planChanged": "تم تغيير الخطة إلى \"{plan}\" بنجاح.", + "admin.users.unknownError": "خطأ غير معروف", + "admin.users.error": "خطأ", + "admin.users.planUpdateError": "تعذر تحديث الخطة: {message}", + "admin.users.noKeys": "لا توجد مفاتيح", + "admin.users.noKeysDesc": "لا يمتلك هذا المستخدم مفاتيح API نشطة.", + "admin.users.keysRevoked": "تم إلغاء المفاتيح", + "admin.users.keysRevokedDesc": "تم إلغاء {count} مفتاح API بنجاح.", + "admin.users.revokeError": "تعذر إلغاء المفاتيح: {message}", + "admin.users.retry": "إعادة المحاولة", + "admin.system.title": "النظام", + "admin.system.subtitle": "مراقبة حالة النظام وإدارة الموارد", + "admin.system.quotas": "حصص الترجمة", + "admin.system.resetQuotas": "إعادة تعيين الحصص الشهرية", + "admin.system.resetting": "جارٍ إعادة التعيين...", + "admin.system.reset": "إعادة تعيين", + "admin.system.allOperational": "جميع الأنظمة تعمل بشكل طبيعي", + "admin.system.issuesDetected": "تم اكتشاف مشاكل في النظام", + "admin.system.waitingData": "في انتظار البيانات...", + "admin.system.purging": "جارٍ الحذف...", + "admin.system.clean": "تنظيف", + "admin.system.purge": "حذف", + }, + + // PERSIAN (fa) + // ═══════════════════════════════════════════════════════════════ + fa: { +"auth.brandName": "Office Translator", + "dashboard.nav.translate": "ترجمه", + "dashboard.nav.profile": "پروفایل من", + "dashboard.nav.settings": "تنظیمات", + "dashboard.nav.context": "زمینه", + "dashboard.nav.services": "خدمات", + "dashboard.nav.apiKeys": "کلیدهای API", + "dashboard.nav.glossaries": "واژه‌نامه‌ها", + "dashboard.header.title": "داشبورد", + "dashboard.header.subtitle": "مدیریت ترجمه‌های شما", + "dashboard.header.toggleMenu": "منو", + "dashboard.header.profileTitle": "پروفایل من", + "dashboard.sidebar.theme": "پوسته", + "dashboard.sidebar.signOut": "خروج", + "dashboard.sidebar.backHome": "بازگشت به صفحه اصلی", + "dashboard.translate.pageTitle": "ترجمه یک سند", + "dashboard.translate.pageSubtitle": + "یک فایل وارد کنید و زبان هدف را انتخاب کنید", + "dashboard.translate.errorNotificationTitle": "خطا", + "dashboard.translate.dropzone.uploadAria": "منطقه رها کردن فایل", + "dashboard.translate.dropzone.title": "فایل خود را اینجا بکشید و رها کنید", + "dashboard.translate.dropzone.subtitle": + "یا کلیک کنید برای انتخاب (DOCX, XLSX, PPTX, PDF)", + "dashboard.translate.dropzone.replaceFile": "جایگزینی فایل", + "dashboard.translate.language.source": "زبان مبدأ", + "dashboard.translate.language.target": "زبان مقصد", + "dashboard.translate.language.loading": "در حال بارگذاری زبان‌ها…", + "dashboard.translate.language.autoDetect": "تشخیص خودکار", + "dashboard.translate.language.selectPlaceholder": "انتخاب…", + "dashboard.translate.language.loadErrorPrefix": + "بارگذاری زبان‌ها ناموفق بود", + "dashboard.translate.provider.loading": "در حال بارگذاری ارائه‌دهنده‌ها…", + "dashboard.translate.provider.noneConfigured": "هیچ ارائه‌دهنده‌ای پیکربندی نشده", + "dashboard.translate.provider.modelTitle": "مدل", + "dashboard.translate.provider.sectionTitle": "ارائه‌دهنده", + "dashboard.translate.provider.llmDivider": "هوش مصنوعی · آگاه به زمینه", + "dashboard.translate.provider.llmDividerPro": + "هوش مصنوعی · آگاه به زمینه (حرفه‌ای)", + "dashboard.translate.provider.upgrade": "ارتقا به حرفه‌ای", + "dashboard.translate.provider.upgradeSuffix": + "برای دسترسی به ترجمه هوش مصنوعی", + "dashboard.translate.trust.zeroRetention": "بدون نگهداری", + "dashboard.translate.trust.deletedAfter": + "فایل‌ها پس از پردازش حذف می‌شوند", + "dashboard.translate.actions.uploading": "در حال بارگذاری…", + "dashboard.translate.actions.translate": "ترجمه", + "dashboard.translate.actions.filePrefix": "فایل: ", + "dashboard.translate.actions.cancel": "انصراف", + "dashboard.translate.actions.tryAgain": "تلاش دوباره", + "dashboard.translate.steps.uploading": "در حال بارگذاری فایل…", + "dashboard.translate.steps.starting": "در حال شروع ترجمه…", + "dashboard.translate.complete.title": "ترجمه کامل شد!", + "dashboard.translate.complete.descNamed": + "فایل {name} شما با موفقیت ترجمه شد.", + "dashboard.translate.complete.descGeneric": + "فایل شما با موفقیت ترجمه شد.", + "dashboard.translate.complete.downloading": "در حال دانلود…", + "dashboard.translate.complete.download": "دانلود", + "dashboard.translate.complete.newTranslation": "ترجمه جدید", + "dashboard.translate.complete.toastOkTitle": "موفقیت", + "dashboard.translate.complete.toastFailTitle": "ناموفق", + "dashboard.translate.complete.toastFailDesc": + "ترجمه ناموفق بود. لطفاً دوباره تلاش کنید.", + "dashboard.translate.sourceDocument": "سند مبدأ", + "dashboard.translate.configuration": "پیکربندی", + "dashboard.translate.translating": "در حال ترجمه", + "dashboard.translate.liveMonitor": "مانیتور زنده", + "dashboard.translate.summary": "خلاصه", + "dashboard.translate.engine": "موتور", + "dashboard.translate.confidence": "اطمینان", + "dashboard.translate.cancel": "لغو", + "dashboard.translate.segments": "بخش‌ها", + "dashboard.translate.characters": "نویسه‌ها", + "dashboard.translate.elapsed": "گذشته", + "dashboard.translate.segPerMin": "بخش/دقیقه", + "dashboard.translate.highQuality": "کیفیت بالا", + "dashboard.translate.quality": "کیفیت", + "dashboard.translate.completed": "ترجمه انجام شد", + "dashboard.translate.replace": "جایگزینی", + "dashboard.translate.pdfMode.title": "حالت ترجمه PDF", + "dashboard.translate.pdfMode.preserveLayout": "حفظ چیدمان", + "dashboard.translate.pdfMode.textOnly": "فقط متن", + "dashboard.translate.pdfMode.preserveLayoutDesc": "تصاویر، جداول و قالب‌بندی را حفظ می‌کند. مناسب PDFهای ساده.", + "dashboard.translate.pdfMode.textOnlyDesc": "تمام متن را کاملاً ترجمه می‌کند. خروجی تمیز، بدون مشکل چیدمان.", + "dashboard.translate.pipeline.upload": "بارگذاری", + "dashboard.translate.pipeline.analyze": "تحلیل", + "dashboard.translate.pipeline.translate": "ترجمه", + "dashboard.translate.pipeline.rebuild": "بازسازی", + "dashboard.translate.pipeline.finalize": "نهایی‌سازی", + "dashboard.translate.progress.failedTitle": "ترجمه ناموفق", + "glossaries.dialog.title": "واژه‌نامه جدید", + "glossaries.dialog.description": "یک واژه‌نامه برای ترجمه‌های خود بسازید", + "glossaries.dialog.nameLabel": "نام", + "glossaries.dialog.namePlaceholder": "واژه‌نامه من", + "glossaries.dialog.tabTemplates": "قالب‌ها", + "glossaries.dialog.tabFile": "فایل", + "glossaries.dialog.tabManual": "دستی", + "glossaries.dialog.cancel": "انصراف", + "glossaries.dialog.creating": "در حال ایجاد…", + "glossaries.dialog.importing": "در حال وارد کردن…", + "glossaries.dialog.importBtn": "وارد کردن", + "glossaries.dialog.selectPrompt": "انتخاب", + "glossaries.dialog.createBtn": "ایجاد", + "glossaries.dialog.createEmpty": "ایجاد خالی", + "glossaries.dialog.terms": "اصطلاحات", + "glossaries.dialog.templatesDesc": "یک قالب از پیش تعریف‌شده انتخاب کنید", + "glossaries.dialog.templatesEmpty": "قالبی موجود نیست", + "glossaries.dialog.dropTitle": "یک فایل CSV را اینجا بکشید", + "glossaries.dialog.dropOr": "یا", + "glossaries.dialog.dropFormats": "CSV, TSV, TXT", + "glossaries.dialog.formatTitle": "فرمت", + "glossaries.dialog.formatDesc": "مبدأ،مقصد (یکی در هر خط)", + "glossaries.dialog.formatNote": "خط اول در صورت شناسایی سرستون نادیده گرفته می‌شود", + "glossaries.dialog.errorFormat": "فرمت پشتیبانی نمی‌شود", + "glossaries.dialog.errorSize": "فایل بیش از حد بزرگ است", + "glossaries.dialog.errorEmpty": "فایل خالی", + "glossaries.dialog.errorRead": "خطای خواندن", + "glossaries.dialog.parsing": "در حال تجزیه…", + "glossaries.dialog.termsImported": "اصطلاح وارد شد", + "glossaries.dialog.changeFile": "تغییر فایل", + "glossaries.dialog.retry": "تلاش مجدد", + + // ── Pricing page ── + "pricing.nav.back": "بازگشت", + "pricing.nav.home": "خانه", + "pricing.nav.mySubscription": "اشتراک من", + + "pricing.header.badge": "مدل‌های هوش مصنوعی به‌روزرسانی شدند — مارس ۲۰۲۶", + "pricing.header.title": "طرحی برای هر نیازی", + "pricing.header.subtitle": "اسناد Word، Excel و PowerPoint خود را با حفظ قالب‌بندی اصلی ترجمه کنید. بدون نیاز به کلید API.", + "pricing.billing.monthly": "ماهانه", + "pricing.billing.yearly": "سالانه", + + "pricing.plans.free.name": "رایگان", + "pricing.plans.starter.name": "مبتدی", + "pricing.plans.pro.name": "حرفه‌ای", + "pricing.plans.business.name": "سازمانی", + "pricing.plans.enterprise.name": "شرکتی", + + "pricing.plans.free.description": "مناسب برای آشنایی با برنامه", + "pricing.plans.starter.description": "برای افراد و پروژه‌های کوچک", + "pricing.plans.pro.description": "برای متخصصان و تیم‌های در حال رشد", + "pricing.plans.business.description": "برای تیم‌ها و سازمان‌ها", + "pricing.plans.enterprise.description": "راه‌حل‌های سفارشی برای سازمان‌های بزرگ", + + "pricing.plans.pro.highlight": "محبوب‌ترین", + "pricing.plans.pro.badge": "محبوب", + "pricing.plans.enterprise.badge": "درخواستی", + + "pricing.plans.free.feat1": "۵ سند / ماه", + "pricing.plans.free.feat2": "تا ۱۵ صفحه برای هر سند", + "pricing.plans.free.feat3": "Google Translation شامل", + "pricing.plans.free.feat4": "تمام زبان‌ها (۱۳۰+)", + "pricing.plans.free.feat5": "پشتیبانی انجمن", + + "pricing.plans.starter.feat1": "۵۰ سند / ماه", + "pricing.plans.starter.feat2": "تا ۵۰ صفحه برای هر سند", + "pricing.plans.starter.feat3": "Google Translation + DeepL", + "pricing.plans.starter.feat4": "فایل‌ها تا ۱۰ مگابایت", + "pricing.plans.starter.feat5": "پشتیبانی ایمیل", + "pricing.plans.starter.feat6": "تاریخچه ۳۰ روزه", + + "pricing.plans.pro.feat1": "۲۰۰ سند / ماه", + "pricing.plans.pro.feat2": "تا ۲۰۰ صفحه برای هر سند", + "pricing.plans.pro.feat3": "ترجمه هوش مصنوعی پایه (DeepSeek V3.2)", + "pricing.plans.pro.feat4": "Google Translation + DeepL", + "pricing.plans.pro.feat5": "فایل‌ها تا ۲۵ مگابایت", + "pricing.plans.pro.feat6": "واژه‌نامه‌های سفارشی", + "pricing.plans.pro.feat7": "پشتیبانی اولویت‌دار", + "pricing.plans.pro.feat8": "تاریخچه ۹۰ روزه", + + "pricing.plans.business.feat1": "۱,۰۰۰ سند / ماه", + "pricing.plans.business.feat2": "تا ۵۰۰ صفحه برای هر سند", + "pricing.plans.business.feat3": "هوش مصنوعی پایه + پیشرفته (Claude Haiku)", + "pricing.plans.business.feat4": "تمام ارائه‌دهنده‌های ترجمه", + "pricing.plans.business.feat5": "فایل‌ها تا ۵۰ مگابایت", + "pricing.plans.business.feat6": "دسترسی API (۱۰,۰۰۰ فراخوان/ماه)", + "pricing.plans.business.feat7": "وب‌هوک اعلان", + "pricing.plans.business.feat8": "پشتیبانی اختصاصی", + "pricing.plans.business.feat9": "تاریخچه ۱ ساله", + "pricing.plans.business.feat10": "تحلیل پیشرفته", + + "pricing.plans.enterprise.feat1": "اسناد نامحدود", + "pricing.plans.enterprise.feat2": "تمام مدل‌های هوش مصنوعی (GPT-5, Claude Opus 4.6…)", + "pricing.plans.enterprise.feat3": "استقرار محلی یا ابری اختصاصی", + "pricing.plans.enterprise.feat4": "SLA 99.9% تضمین‌شده", + "pricing.plans.enterprise.feat5": "پشتیبانی اختصاصی ۲۴/۷", + "pricing.plans.enterprise.feat6": "برند سفارشی", + "pricing.plans.enterprise.feat7": "تیم‌های نامحدود", + "pricing.plans.enterprise.feat8": "یکپارچه‌سازی سفارشی", + + "pricing.card.onRequest": "درخواستی", + "pricing.card.free": "رایگان", + "pricing.card.perMonth": "/ماه", + "pricing.card.billedYearly": "{price} € / سال صورتحساب", + "pricing.card.documents": "اسناد", + "pricing.card.pagesMax": "حداکثر صفحات", + "pricing.card.aiTranslation": "ترجمه هوش مصنوعی", + "pricing.card.unlimited": "نامحدود", + "pricing.card.perMonthStat": "/ ماه", + "pricing.card.perDoc": "ص / سند", + "pricing.card.aiEssential": "پایه", + "pricing.card.aiEssentialPremium": "پایه + پیشرفته", + "pricing.card.aiCustom": "سفارشی", + "pricing.card.myPlan": "طرح من", + "pricing.card.managePlan": "مدیریت طرح من", + "pricing.card.startFree": "رایگان شروع کنید", + "pricing.card.contactUs": "تماس با ما", + "pricing.card.choosePlan": "انتخاب این طرح", + "pricing.card.processing": "در حال پردازش…", + + "pricing.comparison.title": "مقایسه تفصیلی", + "pricing.comparison.subtitle": "همه موارد شامل هر طرح", + "pricing.comparison.feature": "ویژگی", + "pricing.comparison.docsPerMonth": "اسناد / ماه", + "pricing.comparison.pagesMaxPerDoc": "حداکثر صفحات / سند", + "pricing.comparison.maxFileSize": "حداکثر حجم فایل", + "pricing.comparison.googleTranslation": "Google Translation", + "pricing.comparison.deepl": "DeepL", + "pricing.comparison.aiEssential": "ترجمه هوش مصنوعی پایه", + "pricing.comparison.aiPremium": "ترجمه هوش مصنوعی پیشرفته", + "pricing.comparison.apiAccess": "دسترسی API", + "pricing.comparison.priorityProcessing": "پردازش اولویت‌دار", + "pricing.comparison.support": "پشتیبانی", + "pricing.comparison.support.community": "انجمن", + "pricing.comparison.support.email": "ایمیل", + "pricing.comparison.support.priority": "اولویت‌دار", + "pricing.comparison.support.dedicated": "اختصاصی", + "pricing.comparison.mb": "مگابایت", + + "pricing.credits.title": "اعتبارات اضافی", + "pricing.credits.subtitle": "بیشتر نیاز دارید؟ اعتبار تکی بخرید، بدون اشتراک.", + "pricing.credits.perPage": "۱ اعتبار = ۱ صفحه ترجمه‌شده.", + "pricing.credits.bestValue": "بهترین ارزش", + "pricing.credits.unit": "اعتبار", + "pricing.credits.centsPerCredit": "سنت / اعتبار", + "pricing.credits.buy": "خرید", + + "pricing.trust.encryption.title": "رمزنگاری سرتاسری", + "pricing.trust.encryption.sub": "TLS 1.3 + AES-256 در حالت استراحت", + "pricing.trust.languages.title": "۱۳۰+ زبان", + "pricing.trust.languages.sub": "شامل عربی، فارسی، عبری (RTL)", + "pricing.trust.parallel.title": "پردازش موازی", + "pricing.trust.parallel.sub": "هوش مصنوعی چندنخی فوق‌سریع", + "pricing.trust.availability.title": "۲۴/۷ در دسترس", + "pricing.trust.availability.sub": "۹۹.۹٪ زمان فعالیت تضمین‌شده", + + "pricing.aiModels.title": "مدل‌های هوش مصنوعی ما — مارس ۲۰۲۶", + "pricing.aiModels.essential.title": "ترجمه هوش مصنوعی پایه", + "pricing.aiModels.essential.plan": "طرح حرفه‌ای", + "pricing.aiModels.essential.descPrefix": "مبتنی بر", + "pricing.aiModels.essential.descSuffix": "— مقرون‌به‌صرفه‌ترین مدل هوش مصنوعی سال ۲۰۲۶. کیفیت قابل مقایسه با مدل‌های پیشرو با یک‌پنجاهم هزینه.", + "pricing.aiModels.essential.context": "۱۶۳هزار توکن زمینه", + "pricing.aiModels.essential.value": "ارزش عالی نسبت به قیمت", + "pricing.aiModels.premium.title": "ترجمه هوش مصنوعی پیشرفته", + "pricing.aiModels.premium.plan": "طرح سازمانی", + "pricing.aiModels.premium.descPrefix": "مبتنی بر", + "pricing.aiModels.premium.descSuffix": "توسط Anthropic — دقیق در اسناد حقوقی، پزشکی و فنی پیچیده.", + "pricing.aiModels.premium.context": "۲۰۰هزار توکن زمینه", + "pricing.aiModels.premium.precision": "بالاترین دقت", + + "pricing.faq.title": "سوالات متداول", + "pricing.faq.q1": "آیا می‌توانم طرح را هر زمان بخواهم تغییر دهم؟", + "pricing.faq.a1": "بله. ارتقا فوری و به‌نسبت است. تنزل در پایان دوره جاری اعمال می‌شود.", + "pricing.faq.q2": "\"ترجمه هوش مصنوعی پایه\" چیست؟", + "pricing.faq.a2": "It is our AI engine based on DeepSeek V3.2 via OpenRouter.", + "pricing.faq.q3": "تفاوت هوش مصنوعی پایه و پیشرفته چیست؟", + "pricing.faq.a3": "هوش مصنوعی پایه از DeepSeek V3.2 استفاده می‌کند (ارزش عالی نسبت به قیمت). هوش مصنوعی پیشرفته از Claude 3.5 Haiku شرکت Anthropic استفاده می‌کند که در اسناد حقوقی، پزشکی و فنی پیچیده دقیق‌تر است.", + "pricing.faq.q4": "آیا اسناد من پس از ترجمه نگهداری می‌شوند؟", + "pricing.faq.a4": "فایل‌های ترجمه‌شده طبق طرح شما در دسترس هستند (۳۰ روز مبتدی، ۹۰ روز حرفه‌ای، ۱ سال سازمانی). آنها در حالت استراحت و هنگام انتقال رمزنگاری می‌شوند.", + "pricing.faq.q5": "اگر از سهمیه ماهانه خود فراتر رویم چه می‌شود؟", + "pricing.faq.a5": "می‌توانید اعتبار اضافی تکی بخرید یا طرح خود را ارتقا دهید. در ۸۰٪ مصرف به شما اطلاع داده می‌شود.", + "pricing.faq.q6": "آیا دوره آزمایشی رایگان برای طرح‌های پولی وجود دارد؟", + "pricing.faq.a6": "طرح رایگان دائمی است و نیاز به کارت اعتباری ندارد. برای طرح‌های حرفه‌ای و سازمانی، برای دوره آزمایشی ۱۴ روزه با ما تماس بگیرید.", + "pricing.faq.q7": "چه فرمت‌های فایلی پشتیبانی می‌شوند؟", + "pricing.faq.a7": "Word (.docx)، Excel (.xlsx/.xls)، PowerPoint (.pptx) و به‌زودی PDF. تمام طرح‌ها از فرمت‌های یکسان پشتیبانی می‌کنند.", + + "pricing.cta.title": "آماده شروع هستید؟", + "pricing.cta.subtitle": "رایگان شروع کنید، بدون نیاز به کارت اعتباری. هر زمان که نیاز داشتید ارتقا دهید.", + "pricing.cta.createAccount": "ایجاد حساب رایگان", + "pricing.cta.login": "ورود", + + "pricing.toast.demo": "حالت نمایشی — Stripe هنوز پیکربندی نشده. در محیط عملیاتی، برای فعال‌سازی طرح {planId} به صفحه پرداخت هدایت می‌شوید.", + "pricing.toast.networkError": "خطای شبکه. لطفاً دوباره تلاش کنید.", + "pricing.toast.paymentError": "خطا در ایجاد پرداخت.", + + // ── Register page ── + "register.title": "ایجاد حساب کاربری", + "register.subtitle": "ترجمه را رایگان شروع کنید", + "register.error.failed": "ثبت‌نام ناموفق بود", + + "register.name.label": "نام", + "register.name.placeholder": "نام شما", + "register.name.error": "نام باید حداقل ۲ کاراکتر باشد", + + "register.email.label": "آدرس ایمیل", + "register.email.placeholder": "you@example.com", + "register.email.error": "آدرس ایمیل نامعتبر", + + "register.password.label": "رمز عبور", + "register.password.error": "رمز عبور باید حداقل ۸ کاراکتر با یک حرف بزرگ، یک حرف کوچک و یک عدد باشد", + "register.password.show": "نمایش رمز عبور", + "register.password.hide": "مخفی کردن رمز عبور", + "register.password.strengthLabel": "قدرت:", + "register.password.strength.weak": "ضعیف", + "register.password.strength.medium": "متوسط", + "register.password.strength.strong": "قوی", + + "register.confirmPassword.label": "تأیید رمز عبور", + "register.confirmPassword.error": "رمزهای عبور مطابقت ندارند", + "register.confirmPassword.show": "نمایش", + "register.confirmPassword.hide": "مخفی", + + "register.submit.creating": "در حال ایجاد حساب...", + "register.submit.create": "حساب من را بساز", + "register.hasAccount": "قبلاً حساب دارید؟", + "register.login": "وارد شوید", + "register.terms.prefix": "با ایجاد حساب، شما می‌پذیرید", + "register.terms.link": "شرایط خدمات", + + // ── Landing page ── + "landing.nav.whyUs": "چرا ما", + "landing.nav.formats": "فرمت‌ها", + "landing.nav.pricing": "قیمت‌گذاری", + "landing.nav.login": "ورود", + "landing.nav.startFree": "شروع رایگان", + "landing.hero.badge": "جدید: پشتیبانی PDF + ترجمه مبتنی بر هوش مصنوعی", + "landing.hero.title1": "اسناد خود را ترجمه کنید.", + "landing.hero.title2": "قالب‌بندی را بی‌نقص نگه دارید.", + "landing.hero.subtitle": "تنها مترجمی که SmartArt، نمودارها، فهرست مطالب، اشکال، سرصفحات و پاصفحات را دقیقاً مانند اصلی حفظ می‌کند. بدون شگفتی هنگام پرداخت.", + "landing.hero.cta": "شروع رایگان — ۲ سند/ماه", + "landing.hero.seePlans": "مشاهده طرح‌ها", + "landing.trust.filesDeleted": "فایل‌ها پس از ۶۰ دقیقه حذف می‌شوند", + "landing.trust.noBait": "بدون قیمت فریبنده", + "landing.trust.preview": "پیش‌نمایش قبل از پرداخت", + "landing.why.title": "قالب‌بندی شما، کاملاً حفظ‌شده", + "landing.why.subtitle": "سایر مترجم‌ها قالب‌بندی شما را خراب می‌کنند. ما نه.", + "landing.why.smartart.title": "SmartArt و نمودارها", + "landing.why.smartart.desc": "نمودارهای سازمانی، فلوچارت‌ها، نمودارهای سلسله‌مراتبی — همه در جای خود ترجمه می‌شوند.", + "landing.why.toc.title": "فهرست مطالب", + "landing.why.toc.desc": "مدخل‌های فهرست، شماره صفحات و ارجاعات متقابل همه صحیح به‌روزرسانی می‌شوند.", + "landing.why.charts.title": "نمودارها و گراف‌ها", + "landing.why.charts.desc": "عناوین، برچسب‌های محور، راهنماها و نام سری‌ها — همه ترجمه می‌شوند.", + "landing.why.shapes.title": "اشکال و جعبه‌های متن", + "landing.why.shapes.desc": "مستطیل‌ها، جعبه‌های گرد، حاشیه‌نویسی‌ها — متن داخل همه اشکال را پیدا و ترجمه می‌کنیم.", + "landing.why.headers.title": "سرصفحات و پاصفحات", + "landing.why.headers.desc": "سرصفحات، پاصفحات و متن پاورقی هرگز از قلم نمی‌افتند.", + "landing.why.languages.title": "۱۳۰+ زبان", + "landing.why.languages.desc": "Google Translate، DeepL و موتورهای مبتنی بر هوش مصنوعی برای کیفیت حرفه‌ای.", + "landing.pricing.title": "قیمت‌گذاری ساده و صادقانه", + "landing.pricing.subtitle": "آنچه می‌بینید همان چیزی است که پرداخت می‌کنید. بدون هزینه پنهان پس از ترجمه.", + "landing.pricing.monthly": "ماهانه", + "landing.pricing.yearly": "سالانه", + "landing.pricing.starter.title": "مبتدی", + "landing.pricing.starter.desc": "برای افراد و پروژه‌های کوچک", + "landing.pricing.starter.f1": "۵۰ سند / ماه", + "landing.pricing.starter.f2": "تا ۵۰ صفحه برای هر سند", + "landing.pricing.starter.f3": "Google Translate + DeepL", + "landing.pricing.starter.f4": "فایل‌ها تا ۱۰ مگابایت", + "landing.pricing.starter.cta": "شروع کنید", + "landing.pricing.pro.title": "حرفه‌ای", + "landing.pricing.pro.badge": "محبوب‌ترین", + "landing.pricing.pro.desc": "برای متخصصانی که کیفیت می‌خواهند", + "landing.pricing.pro.f1": "۲۰۰ سند / ماه", + "landing.pricing.pro.f2": "تا ۲۰۰ صفحه برای هر سند", + "landing.pricing.pro.f3": "ترجمه مبتنی بر هوش مصنوعی (DeepSeek)", + "landing.pricing.pro.f4": "Google + DeepL شامل", + "landing.pricing.pro.f5": "واژه‌نامه‌ها و دستورات سفارشی", + "landing.pricing.pro.f6": "پشتیبانی اولویت‌دار", + "landing.pricing.pro.cta": "امتحان حرفه‌ای", + "landing.pricing.business.title": "سازمانی", + "landing.pricing.business.desc": "برای تیم‌های با حجم بالای نیاز", + "landing.pricing.business.f1": "۱,۰۰۰ سند / ماه", + "landing.pricing.business.f2": "تا ۵۰۰ صفحه برای هر سند", + "landing.pricing.business.f3": "هوش مصنوعی پیشرفته (Claude)", + "landing.pricing.business.f4": "تمام ارائه‌دهنده‌ها + دسترسی API", + "landing.pricing.business.f5": "وب‌هوک و خودکارسازی", + "landing.pricing.business.f6": "۵ صندلی تیمی", + "landing.pricing.business.cta": "تماس با ما", + "landing.pricing.honest": "قیمت نمایش‌داده‌شده همان قیمتی است که پرداخت می‌کنید. بدون هزینه پنهان پس از ترجمه.", + "landing.pricing.billedYearly": "صورتحساب سالانه", + "landing.pricing.perMonth": "/ماه", + "landing.formats.title": "هر فرمت، هر عنصر", + "landing.formats.subtitle": "آنچه دیگران از قلم می‌اندازند را ترجمه می‌کنیم.", + "landing.formats.word": "Word (.docx)", + "landing.formats.word.f1": "پاراگراف‌ها و عناوین", + "landing.formats.word.f2": "جداول و نمودارها", + "landing.formats.word.f3": "نمودارهای SmartArt", + "landing.formats.word.f4": "فهرست مطالب", + "landing.formats.word.f5": "سرصفحات و پاصفحات", + "landing.formats.word.f6": "اشکال و جعبه‌های متن", + "landing.formats.word.f7": "پاورقی‌ها و یادداشت‌های پایانی", + "landing.formats.excel": "Excel (.xlsx)", + "landing.formats.excel.f1": "مقادیر سلول", + "landing.formats.excel.f2": "نام برگه‌ها", + "landing.formats.excel.f3": "نمودارها و برچسب‌ها", + "landing.formats.excel.f4": "سرصفحات و پاصفحات", + "landing.formats.excel.f5": "سلول‌های ادغامی حفظ می‌شوند", + "landing.formats.powerpoint": "PowerPoint (.pptx)", + "landing.formats.powerpoint.f1": "متن اسلاید و یادداشت‌ها", + "landing.formats.powerpoint.f2": "نمودارها و دیاگرام‌ها", + "landing.formats.powerpoint.f3": "اشکال و جعبه‌های متن", + "landing.formats.powerpoint.f4": "طرح‌بندی‌های اصلی", + "landing.formats.powerpoint.f5": "انیمیشن‌ها حفظ می‌شوند", + "landing.formats.pdf": "PDF", + "landing.formats.pdf.f1": "فایل‌های PDF متنی", + "landing.formats.pdf.f2": "طرح‌بندی حفظ می‌شود", + "landing.formats.pdf.f3": "تصاویر در جای خود", + "landing.formats.pdf.f4": "جداول حفظ می‌شوند", + "landing.formats.pdf.f5": "خروجی به صورت DOCX یا PDF", + "landing.cta.title": "ترجمه را در ۳۰ ثانیه شروع کنید", + "landing.cta.subtitle": "بدون نیاز به کارت اعتباری. ۲ سند را رایگان امتحان کنید و تفاوت را ببینید.", + "landing.cta.button": "ایجاد حساب رایگان", + "landing.footer.privacy": "حریم خصوصی", + "landing.footer.terms": "شرایط", + "landing.footer.contact": "تماس", + + "landing.ai.badge": "AI-Powered Translation Engine", + "landing.ai.title": "Translation that understands your craft", + "landing.ai.subtitle": "Our AI models analyze context, respect your terminology, and even translate text inside images.", + "landing.ai.context.title": "Industry Context", + "landing.ai.context.desc": "Describe your field and get tailored translations, not generic ones.", + "landing.ai.glossary.title": "Industry Glossaries", + "landing.ai.glossary.desc": "Define your technical terms for precise, domain-specific translations.", + "landing.ai.vision.title": "Image Vision", + "landing.ai.vision.desc": "Text embedded in images, diagrams and charts is detected and translated.", + "landing.ai.comparison.source": "Source (FR)", + "landing.ai.comparison.google": "Google Translate", + "landing.ai.comparison.ai": "Our AI", + "landing.howItWorks.title": "How it works", + "landing.howItWorks.subtitle": "Three steps. Zero formatting loss.", + "landing.howItWorks.step1.title": "Upload your file", + "landing.howItWorks.step1.desc": "Drag and drop your Excel, Word, PowerPoint or PDF document.", + "landing.howItWorks.step2.title": "Pick language and engine", + "landing.howItWorks.step2.desc": "Select target language and engine - standard or context-aware AI.", + "landing.howItWorks.step3.title": "Download the result", + "landing.howItWorks.step3.desc": "Get your translated document with formatting identical to the original.", + + "common.loading": "در حال بارگذاری...", + "profile.header.title": "پروفایل من", + "profile.header.subtitle": "مدیریت حساب و تنظیمات شما.", + "profile.tabs.account": "حساب کاربری", + "profile.tabs.subscription": "اشتراک", + "profile.tabs.preferences": "تنظیمات", + "profile.account.user": "کاربر", + "profile.account.memberSince": "عضو از", + "profile.plan.label": "طرح", + "profile.plan.free": "رایگان", + "profile.plan.starter": "Starter", + "profile.plan.pro": "Pro", + "profile.plan.business": "Business", + "profile.plan.enterprise": "Enterprise", + "profile.plan.pricePerMonth": "{price} €/ماه", + "profile.subscription.canceling": "در حال لغو", + "profile.subscription.active": "فعال", + "profile.subscription.unknown": "نامشخص", + "profile.subscription.accessUntil": "دسترسی تا", + "profile.subscription.renewalOn": "تمدید در", + "profile.subscription.upgradePlan": "ارتقا به طرح پولی", + "profile.subscription.changePlan": "تغییر طرح", + "profile.subscription.manageBilling": "مدیریت صورتحساب", + "profile.subscription.billingUnavailable": "پورتال صورتحساب در دسترس نیست.", + "profile.subscription.billingError": "خطا در دسترسی به پورتال صورتحساب.", + "profile.subscription.cancelSuccess": "اشتراک لغو شد. تا پایان دوره فعلی به خدمات دسترسی خواهید داشت.", + "profile.subscription.cancelError": "خطا هنگام لغو.", + "profile.subscription.networkError": "خطای شبکه.", + "profile.usage.title": "مصرف این ماه", + "profile.usage.resetOn": "بازنشانی در", + "profile.usage.documents": "اسناد", + "profile.usage.pages": "صفحات", + "profile.usage.extraCredits": "اعتبار اضافی", + "profile.usage.extraCreditsPlural": "اعتبارهای اضافی", + "profile.usage.quotaReached": "سهمیه تمام شده", + "profile.usage.quotaReachedDesc": "برای ادامه، به طرح بالاتر ارتقا دهید.", + "profile.usage.unlockMore": "با طرح پولی ترجمه‌های بیشتری داشته باشید.", + "profile.usage.viewPlans": "مشاهده طرح‌ها", + "profile.usage.includedInPlan": "شامل طرح شما", + "profile.danger.title": "منطقه خطر", + "profile.danger.description": "لغو در پایان دوره فعلی اعمال می‌شود. تا آن تاریخ به خدمات خود دسترسی خواهید داشت.", + "profile.danger.confirm": "مطمئن هستید؟ این عمل قابل برگشت نیست.", + "profile.danger.confirmCancel": "تأیید لغو", + "profile.danger.cancelSubscription": "لغو اشتراک من", + "profile.danger.keep": "خیر، نگه دار", + "profile.prefs.interfaceLang": "زبان رابط کاربری", + "profile.prefs.interfaceLangDesc": "زبان به‌طور خودکار بر اساس مرورگر شما شناسایی می‌شود. می‌توانید آن را به‌صورت دستی تغییر دهید.", + "profile.prefs.defaultTargetLang": "زبان هدف پیش‌فرض", + "profile.prefs.selectLanguage": "انتخاب زبان", + "profile.prefs.defaultTargetLangDesc": "این زبان برای ترجمه‌های شما از پیش انتخاب خواهد شد.", + "profile.prefs.save": "ذخیره", + "profile.prefs.theme": "پوسته", + "profile.prefs.themeDesc": "ظاهر رابط کاربری را انتخاب کنید", + "profile.prefs.cache": "حافظه پنهان", + "profile.prefs.cacheDesc": "پاک کردن حافظه پنهان محلی ممکن است برخی مشکلات نمایش را برطرف کند.", + "profile.prefs.clearing": "در حال پاک کردن...", + "profile.prefs.clearCache": "پاک کردن حافظه پنهان", + "settings.title": "تنظیمات", + "settings.subtitle": "پیکربندی عمومی برنامه", + "settings.formats.title": "فرمت‌های پشتیبانی شده", + "settings.formats.subtitle": "انواع سند قابل ترجمه", + "settings.formats.formulas": "فرمول‌ها", + "settings.formats.styles": "سبک‌ها", + "settings.formats.images": "تصاویر", + "settings.formats.headers": "سرصفحه‌ها", + "settings.formats.tables": "جداول", + "settings.formats.slides": "اسلایدها", + "settings.formats.notes": "یادداشت‌ها", + "settings.cache.title": "حافظه پنهان", + "settings.cache.desc": "پاک کردن حافظه پنهان محلی ممکن است برخی مشکلات نمایش را برطرف کند.", + "settings.cache.clearing": "در حال پاک کردن...", + "settings.cache.clear": "پاک کردن حافظه پنهان", + "services.title": "ارائه‌دهندگان ترجمه", + "services.subtitle": "ارائه‌دهندگان توسط مدیر پیکربندی شده‌اند. می‌توانید ببینید کدام‌یک برای حساب شما فعال است.", + "services.loading": "در حال بارگذاری ارائه‌دهندگان...", + "services.noProviders": "در حال حاضر هیچ ارائه‌دهنده‌ای پیکربندی نشده. با مدیر تماس بگیرید.", + "services.classic": "ترجمه کلاسیک", + "services.llmPro": "LLM · مبتنی بر زمینه (Pro)", + "services.available": "در دسترس", + "services.model": "مدل", + "services.adminOnly.title": "پیکربندی ارائه‌دهنده فقط برای مدیر", + "services.adminOnly.desc": "کلیدهای API، انتخاب مدل و فعال‌سازی ارائه‌دهنده منحصراً توسط مدیر در پنل مدیریت انجام می‌شود. شما هرگز نیازی به وارد کردن کلید API ندارید.", + "apiKeys.title": "کلیدهای API", + "apiKeys.subtitle": "مدیریت کلیدهای API برای دسترسی برنامه‌نویسی به API ترجمه.", + "apiKeys.loading": "در حال بارگذاری...", + "apiKeys.sectionTitle": "API و خودکارسازی", + "apiKeys.sectionDesc": "تولید و مدیریت کلیدهای API برای گردش‌کار خودکارسازی", + "apiKeys.keysUsed": "{total} از {max} کلید استفاده شده", + "apiKeys.maxReached": "حداکثر کلیدها استفاده شده. یک کلید را لغو کنید تا کلید جدیدی بسازید.", + "apiKeys.canGenerate": "می‌توانید {count} کلید دیگر بسازید", + "apiKeys.canGeneratePlural": "می‌توانید {count} کلید دیگر بسازید", + "apiKeys.generateNew": "تولید کلید جدید", + "apiKeys.keyRevoked": "کلید لغو شد", + "apiKeys.keyRevokedDesc": "کلید API با موفقیت لغو شد.", + "apiKeys.keyNotFound": "کلید یافت نشد", + "apiKeys.keyNotFoundDesc": "کلید API دیگر وجود ندارد. ممکن است قبلاً لغو شده باشد.", + "apiKeys.error": "خطا", + "apiKeys.revokeError": "لغو کلید API ناموفق بود. لطفاً دوباره تلاش کنید.", + "apiKeys.limitReached": "محدودیت تکمیل شد", + "apiKeys.limitReachedDesc": "شما به حداکثر ۱۰ کلید API رسیده‌اید. یک کلید موجود را لغو کنید تا کلید جدیدی بسازید.", + "apiKeys.proRequired": "نیاز به ویژگی Pro", + "apiKeys.proRequiredDesc": "کلیدهای API یک ویژگی Pro هستند. لطفاً حساب خود را ارتقا دهید.", + "apiKeys.generateError": "تولید کلید API ناموفق بود. لطفاً دوباره تلاش کنید.", + "apiKeys.upgrade.title": "کلیدهای API", + "apiKeys.upgrade.subtitle": "ترجمه‌های خود را با دسترسی API خودکار کنید", + "apiKeys.upgrade.feat1": "تولید کلیدهای API نامحدود", + "apiKeys.upgrade.feat2": "خودکارسازی ترجمه اسناد", + "apiKeys.upgrade.feat3": "اعلان‌های Webhook", + "apiKeys.upgrade.feat4": "حالت‌های ترجمه LLM", + "apiKeys.upgrade.proFeature": "کلیدهای API یک ویژگی {pro} هستند. ارتقا دهید تا خودکارسازی API فعال شود.", + "apiKeys.upgrade.pro": "Pro", + "apiKeys.upgrade.cta": "ارتقا به Pro", + "apiKeys.dialog.maxTitle": "حداکثر کلیدها تکمیل شد", + "apiKeys.dialog.maxDesc": "شما به حداکثر ۱۰ کلید API رسیده‌اید. لطفاً قبل از تولید کلید جدید، یک کلید موجود را لغو کنید.", + "apiKeys.dialog.close": "بستن", + "apiKeys.dialog.generated": "کلید API تولید شد!", + "apiKeys.dialog.generatedDesc": "کلید API جدید شما ایجاد شد. اکنون آن را کپی کنید - دیگر نمایش داده نخواهد شد.", + "apiKeys.dialog.important": "مهم:", + "apiKeys.dialog.importantDesc": "این تنها باری است که این کلید را می‌بینید. آن را در جای امن نگه دارید.", + "apiKeys.dialog.apiKey": "کلید API", + "apiKeys.dialog.name": "نام:", + "apiKeys.dialog.done": "انجام شد", + "apiKeys.dialog.copied": "کلید را کپی کردم", + "apiKeys.dialog.generateTitle": "تولید کلید API جدید", + "apiKeys.dialog.generateDesc": "ایجاد کلید API جدید برای دسترسی برنامه‌نویسی به API ترجمه.", + "apiKeys.dialog.keyName": "نام کلید (اختیاری)", + "apiKeys.dialog.keyNamePlaceholder": "مثلاً: تولید، آزمایش", + "apiKeys.dialog.keyNameHint": "نامی توصیفی برای کمک به شناسایی این کلید در آینده.", + "apiKeys.dialog.nameTooLong": "نام باید {max} کاراکتر یا کمتر باشد", + "apiKeys.dialog.nameInvalid": "نام فقط می‌تواند شامل حروف، اعداد، فاصله، خط تیره و زیرخط باشد", + "apiKeys.dialog.cancel": "لغو", + "apiKeys.dialog.generating": "در حال تولید...", + "apiKeys.dialog.generate": "تولید کلید", + "apiKeys.table.name": "نام", + "apiKeys.table.prefix": "پیشوند", + "apiKeys.table.created": "تاریخ ایجاد", + "apiKeys.table.lastUsed": "آخرین استفاده", + "apiKeys.table.never": "هرگز", + "apiKeys.table.actions": "عملیات", + "apiKeys.table.revoke": "لغو", + "apiKeys.table.copyPrefix": "کپی پیشوند کلید", + "apiKeys.table.revokeKey": "لغو کلید", + "apiKeys.revokeDialog.title": "لغو کلید API", + "apiKeys.revokeDialog.desc": "آیا مطمئنید می‌خواهید کلید \"{name}\" را لغو کنید؟ این عمل قابل برگشت نیست.", + "apiKeys.revokeDialog.confirm": "بله، لغو کن", + "apiKeys.revokeDialog.cancel": "لغو", + "context.proTitle": "ویژگی Pro", + "context.proDesc": "زمینه و واژه‌نامه‌های حرفه‌ای با طرح‌های Pro، Business و Enterprise در دسترس هستند. آنها از طریق دستورالعمل‌ها و واژگان خاص حوزه شما، ترجمه‌های دقیق‌تری ارائه می‌دهند.", + "context.viewPlans": "مشاهده طرح‌ها", + "context.title": "زمینه و واژه‌نامه", + "context.subtitle": "با دستورالعمل‌ها و واژگان خاص حوزه خود، کیفیت ترجمه را بهبود ببخشید.", + "context.presets.title": "واژه‌نامه‌های حرفه‌ای", + "context.presets.desc": "بارگذاری واژه‌نامه کامل با دستورالعمل‌ها و اصطلاحات تخصصی", + "context.instructions.title": "دستورالعمل‌های زمینه", + "context.instructions.desc": "دستورالعمل‌هایی که هوش مصنوعی حین ترجمه پیروی می‌کند", + "context.instructions.placeholder": "مثال: شما اسناد فنی HVAC را ترجمه می‌کنید. از اصطلاحات دقیق مهندسی استفاده کنید...", + "context.glossary.title": "واژه‌نامه فنی", + "context.glossary.desc": "فرمت: source=target (یکی در هر خط). واژه‌نامه‌های بارگذاری‌شده از طریق پیش‌تنظیم قابل ویرایش هستند.", + "context.glossary.terms": "اصطلاح در واژه‌نامه", + "context.clearAll": "پاک کردن همه", + "context.saving": "در حال ذخیره...", + "context.save": "ذخیره", + "admin.login.title": "مدیریت", + "admin.login.required": "ورود لازم است", + "admin.login.password": "رمز عبور مدیر", + "admin.login.connecting": "در حال اتصال...", + "admin.login.access": "دسترسی به پنل مدیریت", + "admin.login.restricted": "مختص مدیران", + "admin.layout.checking": "در حال تأیید احراز هویت...", + "admin.dashboard.title": "داشبورد مدیریت", + "admin.dashboard.subtitle": "پنل کنترل مدیر", + "admin.dashboard.refresh": "بازنشانی", + "admin.dashboard.refreshTooltip": "بازنشانی داده‌های داشبورد", + "admin.dashboard.config": "پیکربندی سیستم", + "admin.dashboard.maxFileSize": "حداکثر حجم فایل:", + "admin.dashboard.translationService": "سرویس ترجمه:", + "admin.dashboard.formats": "فرمت‌ها:", + "admin.nav.dashboard": "Dashboard", + "admin.nav.users": "کاربران", + "admin.nav.pricing": "قیمت‌ها و Stripe", + "admin.nav.providers": "ارائه‌دهندگان", + "admin.nav.system": "سیستم", + "admin.nav.logs": "گزارش‌ها", + "admin.users.title": "مدیریت کاربران", + "admin.users.subtitle": "مشاهده و مدیریت حساب‌های کاربری", + "admin.users.planUpdated": "طرح به‌روز شد", + "admin.users.planChanged": "طرح با موفقیت به \"{plan}\" تغییر کرد.", + "admin.users.unknownError": "خطای ناشناخته", + "admin.users.error": "خطا", + "admin.users.planUpdateError": "به‌روزرسانی طرح ممکن نیست: {message}", + "admin.users.noKeys": "بدون کلید", + "admin.users.noKeysDesc": "این کاربر کلید API فعالی ندارد.", + "admin.users.keysRevoked": "کلیدها ابطال شدند", + "admin.users.keysRevokedDesc": "{count} کلید API با موفقیت ابطال شد.", + "admin.users.revokeError": "ابطال کلیدها ممکن نیست: {message}", + "admin.users.retry": "تلاش مجدد", + "admin.system.title": "سیستم", + "admin.system.subtitle": "پایش وضعیت سیستم و مدیریت منابع", + "admin.system.quotas": "سهمیه‌های ترجمه", + "admin.system.resetQuotas": "بازنشانی سهمیه‌های ماهانه", + "admin.system.resetting": "در حال بازنشانی...", + "admin.system.reset": "بازنشانی", + "admin.system.allOperational": "تمام سیستم‌ها عملیاتی هستند", + "admin.system.issuesDetected": "مشکلات سیستمی شناسایی شد", + "admin.system.waitingData": "در انتظار داده...", + "admin.system.purging": "در حال پاکسازی...", + "admin.system.clean": "پاکسازی", + "admin.system.purge": "حذف کامل", + }, +}; + +const RTL_LOCALES: ReadonlyArray = ["ar", "fa"]; + +interface I18nContextValue { + locale: Locale; + dir: "ltr" | "rtl"; + isRTL: boolean; + setLocale: (locale: Locale) => void; + t: (key: string, params?: TranslationParams) => string; +} + +const I18nContext = createContext(null); + +function interpolate( + template: string, + params?: TranslationParams, +): string { + if (!params) return template; + return Object.entries(params).reduce( + (acc, [k, v]) => acc.replace(new RegExp(`\\{${k}\\}`, "g"), String(v)), + template, + ); +} + +function detectInitialLocale(): Locale { + if (typeof window === "undefined") return "en"; + // 1. Saved preference wins + const saved = localStorage.getItem("locale"); + if (saved && (VALID_LOCALES as readonly string[]).includes(saved)) { + return saved as Locale; + } + // 2. Browser language (exact match: "fr", "de", …) + const primary = navigator.language.split("-")[0]; + if ((VALID_LOCALES as readonly string[]).includes(primary)) { + return primary as Locale; + } + // 3. Check all browser languages (e.g. navigator.languages = ["fr-FR","en-US","en"]) + const allLangs = navigator.languages || []; + for (const lang of allLangs) { + const code = lang.split("-")[0]; + if ((VALID_LOCALES as readonly string[]).includes(code)) { + return code as Locale; + } + } + return "en"; +} + +export function formatDate(date: Date, locale: Locale, options?: Intl.DateTimeFormatOptions): string { + const calendar = locale === "fa" ? "fa-IR-u-ca-persian" : locale === "ar" ? "ar-SA" : locale; + const defaults: Intl.DateTimeFormatOptions = { day: "numeric", month: "long", year: "numeric" }; + return date.toLocaleDateString(calendar, { ...defaults, ...options }); +} + +export function I18nProvider({ children }: { children: ReactNode }) { + const [locale, setLocale] = useState(detectInitialLocale); + + const isRTL = (RTL_LOCALES as readonly string[]).includes(locale); + const dir = isRTL ? "rtl" as const : "ltr" as const; + + useEffect(() => { + document.documentElement.dir = dir; + document.documentElement.lang = locale; + }, [locale, dir]); + + const handleSetLocale = useCallback((newLocale: Locale) => { + setLocale(newLocale); + localStorage.setItem("locale", newLocale); + }, []); + + const t = useCallback( + (key: string, params?: TranslationParams): string => { + const msg = messages[locale]?.[key] || messages.en[key] || key; + return interpolate(msg, params); + }, + [locale], + ); + + return ( + + {children} + + ); +} + +export function useI18n() { + const ctx = useContext(I18nContext); + if (!ctx) { + throw new Error("useI18n must be used within an I18nProvider"); + } + return ctx; +} + +export function useTranslation() { + const { t } = useI18n(); + return { t }; +} diff --git a/frontend/src/lib/pricing.ts b/frontend/src/lib/pricing.ts new file mode 100644 index 0000000..32a2421 --- /dev/null +++ b/frontend/src/lib/pricing.ts @@ -0,0 +1,6 @@ +export const ANNUAL_DISCOUNT_PERCENT = 20; +export const YEARLY_DISCOUNT_FACTOR = (100 - ANNUAL_DISCOUNT_PERCENT) / 100; + +export function computeYearlyFromMonthly(monthly: number): number { + return Number((monthly * 12 * YEARLY_DISCOUNT_FACTOR).toFixed(2)); +} diff --git a/frontend/src/lib/store.ts b/frontend/src/lib/store.ts new file mode 100644 index 0000000..4504fcb --- /dev/null +++ b/frontend/src/lib/store.ts @@ -0,0 +1,135 @@ +import { create } from "zustand"; +import { persist } from "zustand/middleware"; + +export const openaiModels = [ + { id: "gpt-4o", name: "GPT-4o" }, + { id: "gpt-4o-mini", name: "GPT-4o Mini" }, + { id: "gpt-4-turbo", name: "GPT-4 Turbo" }, +]; + +export const openrouterModels = [ + { id: "deepseek/deepseek-chat-v3-0324", name: "DeepSeek V3" }, + { id: "anthropic/claude-3.5-haiku", name: "Claude 3.5 Haiku" }, + { id: "google/gemini-2.0-flash-001", name: "Gemini 2.0 Flash" }, +]; + +interface TranslationSettings { + defaultTargetLanguage: string; + defaultProvider: string; + translateImages: boolean; + ollamaUrl: string; + ollamaModel: string; + openaiApiKey: string; + openaiModel: string; + openrouterApiKey: string; + openrouterModel: string; + libreTranslateUrl: string; + systemPrompt: string; + glossary: string; + adminToken?: string; +} + +interface TranslationState { + settings: TranslationSettings; + updateSettings: (partial: Partial) => void; + setAdminToken: (token: string | undefined) => void; + applyPreset: (preset: string) => void; + clearContext: () => void; +} + +const PRESETS: Record = { + hvac: { + systemPrompt: + "You are translating technical HVAC (Heating, Ventilation, and Air Conditioning) documents. Use precise engineering terminology as defined in ASHRAE standards and European EN standards. Maintain technical accuracy. Preserve all numerical values, units, and reference codes exactly.", + glossary: + "pression statique=static pressure\nrécupérateur de chaleur=heat recovery unit\nventilo-convecteur=fan coil unit\ngaine de ventilation=ventilation duct\ndiffuseur d'air=air diffuser\nclimatisation=air conditioning\ntraitement d'air=air handling\ncaisson de traitement d'air=air handling unit (AHU)\nréseau de distribution=distribution network\ncharge thermique=thermal load\ndébit d'air=airflow rate\ntaux de brassage=air change rate\nbilan thermique=heat balance\nconductivité thermique=thermal conductivity\ncoefficient de transmission thermique=thermal transmittance (U-value)\nisolation thermique=thermal insulation\nefficacité énergétique=energy efficiency\npuissance frigorifique=cooling capacity\npuissance calorifique=heating capacity\ngroupe d'eau glacée=chiller\n tour de refroidissement=cooling tower\npompes à chaleur=heat pump\n détendeur=expansion valve\névaporateur=evaporator\ncondenseur=condenser\ncompresseur=compressor\ncircuit frigorifique=refrigerant circuit\nfluide frigorigène=refrigerant\nrendement=efficiency\npertes de charge=pressure drop\nboucle d'eau=water loop\nplancher chauffant=underfloor heating\nradiateur=radiator\nboucle de régulation=control loop\nsonde de température=temperature sensor\nvanne trois voies=three-way valve\nregistre=damper\ncaisson d'extraction=exhaust unit\nVMC=mechanical ventilation (MV)\npuits canadien=Canadian well / earth tube\nennoblissement=building envelope\nétanchéité à l'air=airtightness\npont thermique=thermal bridge\ndéperdition thermique=heat loss\nconfort thermique=thermal comfort\nhygrométrie=humidity level\ncondensation=condensation\ninfiltration d'air=air infiltration\nrenouvellement d'air=fresh air supply\nair neuf=fresh air\nair vicié=stale air\nair recyclé=recirculated air\nboucle d'eau glacée=chilled water loop\nréseau aéraulique=air distribution system\nréseau hydraulique=hydraulic system\npertes de charge linéaires=linear pressure losses\npertes de charge singulières=local pressure losses\ndiamètre équivalent=equivalent diameter\ndébit volumique=volumetric flow rate\ndébit massique=mass flow rate", + }, + it: { + systemPrompt: + "You are translating IT and software documentation. Use standard technical terminology. Preserve all code snippets, API endpoints, variable names, and technical identifiers unchanged. Follow industry-standard translations for software concepts.", + glossary: + "serveur=server\nbase de données=database\ninterface utilisateur=user interface\npile technologique=tech stack\ndéploiement=deployment\nréseau=network\nstockage=storage\npare-feu=firewall\nbalanceur de charge=load balancer\nmot de passe=password\nauthentification=authentication\nautorisation=authorization\nchiffrement=encryption\ncertificat=certificate\njeton d'accès=access token\nrequête=request\nréponse=response\npoint de terminaison=endpoint\ninterface de programmation=API (Application Programming Interface)\nlogiciel=software\nmatériel=hardware\nmicrologiciel=firmware\nprogramme=program\nscript=script\nalgorithme=algorithm\nbase de code=codebase\ndépôt=repository\nbranche=branch\nfusion=merge\nrequête d'extraction=pull request\nintégration continue=continuous integration (CI)\ndéploiement continu=continuous deployment (CD)\npipeline=pipeline\nconteneur=container\norchestration=orchestration\nmachine virtuelle=virtual machine (VM)\ninstance=instance\ncluster=cluster\nnœud=node\npod=pod\nmicroservice=microservice\narchitecture=architecture\ninfrastructure=infrastructure\nplateforme=platform\nenvironnement=environment\nproduction=production\npréproduction=staging\ndéveloppement=development\ntest=test\nassurance qualité=quality assurance (QA)\nbogue=bug\ncorrection=fix\ncorrectif=patch\nversion=version\npublication=release\njournal=log\nsurveillance=monitoring\nalerte=alert\nmétrique=metric\ntableau de bord=dashboard\nrapport=report\nrapport d'erreur=error report\npile d'appels=stack trace\nexception=exception\ngestion des erreurs=error handling\nfile d'attente=queue\ntampon=buffer\ncache=cache\nperformance=performance\nlatence=latency\ndisponibilité=availability\névolutivité=scalability\nredondance=redundancy\nsauvegarde=backup\nrestauration=restore\nplan de reprise=recovery plan", + }, + legal: { + systemPrompt: + "You are translating legal documents, contracts, and regulatory texts. Use formal legal terminology consistent with civil law (French) and common law (English) traditions. Preserve all article references, section numbers, dates, monetary amounts, and legal citations exactly as written. Maintain the formal register.", + glossary: + "contrat=contract\nclause=clause\npartie=party\nrésiliation=termination\nrésiliation unilatérale=unilateral termination\nindemnité=indemnity\nindemnisation=compensation\nresponsabilité=liability\nresponsabilité civile=tort liability\nresponsabilité contractuelle=contractual liability\nlitige=dispute\narbitrage=arbitration\nmédiation=mediation\ntribunal=court\njuridiction=court / jurisdiction\ncompétence=jurisdiction\nappel=appeal\npourvoi en cassation=appeal to supreme court\nforce obligatoire=binding force\nexécution forcée=forced execution\ninexécution=non-performance\ndommages et intérêts=damages\ndommages-intérêts punitifs=punitive damages\nmise en demeure=formal notice\ngarantie=warranty / guarantee\ngarantie légale=statutory warranty\nvice caché=hidden defect\nvice de construction=construction defect\nobligation=obligation\nobligation de moyen=obligation of means\nobligation de résultat=obligation of result\nengagement=commitment\nstipulation=stipulation\ndisposition=provision\narticle=article\nalinéa=paragraph\nannexe=appendix / schedule\navenant=amendment\naddendum=addendum\nprotocole d'accord=memorandum of understanding (MOU)\nlettre d'intention=letter of intent (LOI)\nconditions générales=general terms and conditions\nconditions particulières=specific terms\nforce majeure=force majeure\ncas fortuit=act of God\npréavis=notice period\ndélai=deadline / time limit\nprescription=statute of limitations\nforclusion=forfeiture\ndroit de propriété=property right\ndroit d'auteur=copyright\nbrevet=patent\nmarque déposée=registered trademark\nlicence=license\ncession=assignment / transfer\ncession de créance=assignment of claim\ncession de bail=assignment of lease\nsous-location=sublease\ncaution=guarantor / surety\nhypothèque=mortgage\nnantissement=pledge\ngage=pledge / collateral\nsurendettement=over-indebtedness\nfaillite=bankruptcy\nredressement judiciaire=judicial reorganization\nliquidation=liquidation\nprocuration=power of attorney\nmandat=mandate\nprocès=trial\nassignation=summons\nconclusions=submissions\njugement=judgment\nordonnance=order\narrêt=ruling / decision\nsauf conduite=safe conduct\nastreinte=periodic penalty payment\nexécution provisoire=provisional execution\nappel en garantie=third-party proceedings\nintervention volontaire=voluntary intervention", + }, + medical: { + systemPrompt: + "You are translating medical and healthcare documents. Use precise medical terminology consistent with WHO standards and clinical nomenclature. Preserve all dosage information, drug names (use INN where applicable), measurements, and clinical values exactly. Maintain strict accuracy — errors in medical translation can have serious consequences.", + glossary: + "posologie=dosage\ncontre-indication=contraindication\neffet secondaire=side effect / adverse effect\neffet indésirable=adverse drug reaction (ADR)\ntraitement=treatment\ntraitement symptomatique=symptomatic treatment\ntraitement préventif=prophylactic treatment\ntraitement curatif=curative treatment\ndiagnostic=diagnosis\ndiagnostic différentiel=differential diagnosis\npronostic=prognosis\nsymptôme=symptom\nsyndrome=syndrome\nsigne clinique=clinical sign\nexamen clinique=clinical examination\nexamen complémentaire=additional examination\nordonnance=prescription\nprescription=prescription\nmolécule=molecule / active substance\nnom commercial=brand name\ndénomination commune internationale=International Nonproprietary Name (INN)\ngénérique=generic drug\ninteraction médicamenteuse=drug interaction\npharmacocinétique=pharmacokinetics\npharmacodynamie=pharmacodynamics\nbiodisponibilité=bioavailability\ndemi-vie=half-life\nmétabolisme=metabolism\nélimination=elimination\nvoie d'administration=route of administration\nvoie orale=oral route\nvoie intraveineuse=intravenous route\nvoie intramusculaire=intramuscular route\nvoie sous-cutanée=subcutaneous route\nvoie locale=topical route\npatient=patient\npatient ambulatoire=outpatient\npatient hospitalisé=inpatient\nhospitalisation=hospitalization\nconsultation=consultation\nurgences=emergency department\nréanimation=intensive care unit (ICU)\nchirurgie=surgery\nintervention chirurgicale=surgical procedure\nanesthésie=anesthesia\nanesthésie générale=general anesthesia\nanesthésie locale=local anesthesia\nantalgique=analgesic\nanalgésique=analgesic\nanti-inflammatoire=anti-inflammatory\nantibiotique=antibiotic\nantiviral=antiviral\nantifongique=antifungal\nanticoagulant=anticoagulant\nantihypertenseur=antihypertensive\nantidiabétique=antidiabetic\nimmunosuppresseur=immunosuppressant\ncorticostéroïde=corticosteroid\nchimiothérapie=chemotherapy\nradiothérapie=radiotherapy\nimmunothérapie=immunotherapy\nbiopsie=biopsy\néchographie=ultrasound\nradiographie=X-ray\nscanner=CT scan\nIRM=MRI (Magnetic Resonance Imaging)\nscintigraphie=scintigraphy\nendoscopie=endoscopy\nanalyse sanguine=blood test\nnumération formule sanguine=complete blood count (CBC)\nhémoglobine=hemoglobin\nglycémie=blood glucose\npression artérielle=blood pressure\nfréquence cardiaque=heart rate\nfréquence respiratoire=respiratory rate\nsaturation en oxygène=oxygen saturation\ntempérature corporelle=body temperature\nallergie=allergy\nintolérance=intolerance\nimmunisation=immunization\nvaccination=vaccination\nmaladie auto-immune=autoimmune disease\nmaladie chronique=chronic disease\nmaladie aiguë=acute disease\npathologie=pathology\nétiologie=etiology\nanatomopathologie=histopathology\nprévalence=prevalence\nincidence=incidence\népidémiologie=epidemiology\nsanté publique=public health", + }, + finance: { + systemPrompt: + "You are translating financial documents, reports, and regulatory filings. Use precise financial terminology consistent with IFRS (International Financial Reporting Standards) and local GAAP. Preserve all numerical values, currency amounts, percentages, and financial ratios exactly. Maintain formal business register.", + glossary: + "bilan=balance sheet\ncompte de résultat=income statement / profit and loss statement\nflux de trésorerie=cash flow\nétat des flux de trésorerie=statement of cash flows\nfonds propres=equity\ncapitaux propres=shareholders' equity\nactif=asset\npassif=liability\nactif circulant=current assets\nactif immobilisé=non-current assets / fixed assets\npassif courant=current liabilities\npassif à long terme=long-term liabilities\nimmobilisations=non-current assets\namortissement=depreciation\nprovision=provision\ndépréciation=impairment\nplus-value=capital gain\nmoins-value=capital loss\nchiffre d'affaires=revenue / turnover\nrésultat d'exploitation=operating income\nrésultat net=net income / net profit\nmarge brute=gross margin\nmarge opérationnelle=operating margin\nexcédent brut d'exploitation=EBITDA\nbénéfice=profit\nperte=loss\ndividende=dividend\naction=share / stock\nactionnaire=shareholder\nobligation=bond\ntaux d'intérêt=interest rate\ntaux d'emprunt=lending rate\nemprunt=loan\ndette=debt\ncrédit=credit\nleasing=lease\nlocation=rent\ninvestissement=investment\nretour sur investissement=return on investment (ROI)\nvaleur nette comptable=net book value\njuste valeur=fair value\nvaleur de marché=market value\ngoodwill=goodwill\nfrais généraux=overhead\ncharge=expense\nproduit=revenue / income\nfacture=invoice\navoir=credit note\nacompte=deposit / advance payment\nsolde=balance\narrêté de comptes=financial year-end closing\nexercice comptable=financial year / fiscal year\nbilan d'ouverture=opening balance sheet\nbilan de clôture=closing balance sheet\nécriture comptable=journal entry\nlettrage=reconciliation\nrapprochement bancaire=bank reconciliation\naudit=audit\ncommissaire aux comptes=statutory auditor\nexpert-comptable=certified public accountant (CPA)\nplan comptable=chart of accounts\nrésultat fiscal=taxable income\nimpôt sur les sociétés=corporate tax\ntaxe sur la valeur ajoutée=value added tax (VAT)\ncharge sociale=social security contribution\nfiscalité=taxation\noptimisation fiscale=tax optimization\nparadis fiscal=tax haven\nfusion-acquisition=merger and acquisition (M&A)\nprise de participation=equity stake\ncession d'actifs=asset disposal\nfiliale=subsidiary\nsociété mère=parent company\nfilialisation=incorporation of a subsidiary\ncession de parts=share transfer\naugmentation de capital=capital increase\nréduction de capital=capital reduction\ndissolution=dissolution\nliquidation=liquidation\nfaillite=bankruptcy\nprocédure collective=insolvency proceedings\ntresorerie=tresury\nfonds de roulement=working capital\nbesoin en fonds de roulement=working capital requirement\nratio d'endettement=debt ratio\nratio de liquidité=liquidity ratio\nrentabilité=profitability\nsolvabilité=solvency", + }, + marketing: { + systemPrompt: + "You are translating marketing documents, advertising copy, brand guidelines, and market research reports. Adapt the tone to the target culture while preserving brand voice. Translate idioms and cultural references appropriately — prioritize impact over literal meaning. Preserve all URLs, hashtags, and brand names.", + glossary: + "marché cible=target market\nsegment de marché=market segment\npart de marché=market share\npositionnement=positioning\nciblage=targeting\nstratégie de marque=brand strategy\nidentité visuelle=visual identity\nimage de marque=brand image\nnotoriété=brand awareness\nfidélisation=customer retention\nacquisition de clients=customer acquisition\ntaux de conversion=conversion rate\ntaux d'engagement=engagement rate\nretour sur investissement publicitaire=return on ad spend (ROAS)\ncoste par clic=cost per click (CPC)\ncoste par mille=cost per thousand (CPM)\ncoste par acquisition=cost per acquisition (CPA)\nclick-through rate=taux de clics (CTR)\nbalistique=bounce rate\ntunnel de conversion=conversion funnel\ncall-to-action=call-to-action (CTA)\nlanding page=landing page\nlead=piste / prospect\nprospection=prospecting\nqualification de lead=lead qualification\nCRM=CRM (Customer Relationship Management)\nbase de données=data base\nbase installée=installed base\ncampagne publicitaire=advertising campaign\ncampagne d'emailing=email campaign\nlettre d'information=newsletter\nréseaux sociaux=social media\ncommunity management=community management\ninfluenceur=influencer\npartenariat=partnership\nparrainage=sponsorship\nplacement de produit=product placement\nrelations publiques=public relations (PR)\ncommuniqué de presse=press release\nplan média=media plan\nachat d'espace=media buying\nprogrammatique=programmatic (advertising)\nSEO=référencement naturel (SEO)\nSEA=référencement payant (SEA)\nSEM=référencement sur les moteurs (SEM)\nmots-clés=keywords\ntrafic=traffic\naudience=audience\nreach=portée\nimpressions=impressions\nvues=views\npartages=shares\ncommentaires=comments\nabonnés=followers / subscribers\ntaux d'ouverture=open rate\ntaux de désabonnement=unsubscribe rate\nA/B testing=A/B testing\npersonas=buyer personas\nétude de marché=market research\nsondage=survey / poll\ngroupe focus=focus group\npanel=panel\nenquête de satisfaction=customer satisfaction survey\nNet Promoter Score=Net Promoter Score (NPS)\nexpérience client=customer experience (CX)\nparcours client=customer journey\npoints de contact=touchpoints\npromesse de marque=brand promise\nproposition de valeur=value proposition\navantage concurrentiel=competitive advantage\nSWOT=SWOT analysis\nbenchmark=benchmark / competitive analysis\navant-vente=pre-sales\naprès-vente=after-sales\nservice client=customer service\nsatisfaction client=customer satisfaction\nrecommandation=recommendation / referral\nbouche-à-oreille=word-of-mouth", + }, + construction: { + systemPrompt: + "You are translating construction, civil engineering, and architecture documents. Use precise technical terminology consistent with European standards (Eurocodes), building codes, and industry practices. Preserve all dimensions, quantities, material specifications, and reference standards exactly.", + glossary: + "chantier=construction site\n gros œuvre=structural work\nsecond œuvre=finishing work\nfondations=foundations\nfondations superficielles=shallow foundations\nfondations profondes=deep foundations\npieux=piles\nsemelle=footing\nradier=raft foundation\nvoile=wall / shear wall\npoteau=column\npoutre=beam\nplancher=floor slab\ndalle=slab\ndallage=ground floor slab\nmaçonnerie=masonry\nbéton armé=reinforced concrete\nbéton précontraint=prestressed concrete\nbéton préfabriqué=precast concrete\ncoulage=pouring (concrete)\ncoffrage=formwork\narmature=reinforcement\nacier d'armature=rebar\ntreillis soudé=welded mesh\ncadre=stirrup\nenrobage=concrete cover\nferraillage=reinforcement detailing\ncoulage en place=cast-in-place\npréfabrication=precast\nmontage=erection\ncharpente=framework / roof structure\ncharpente métallique=steel frame\ncharpente en bois=timber frame\ncouverture=roofing\nétanchéité=waterproofing\nisolation=insulation\nisolation thermique=thermal insulation\nisolation acoustique=acoustic insulation\nrevêtement de façade=facade cladding\nenduit=plaster / render\ncrépi=render\nbardage=cladding\nmenuiserie=joinery\nmenuiserie extérieure=external joinery\nmenuiserie intérieure=internal joinery\nfenêtre=window\nvitrage=glazing\ndouble vitrage=double glazing\nvitrage isolant=insulating glazing\nporte=door\nportail=gate\nfermeture=shutter / closure\nvolet roulant=roller shutter\nquincaillerie=ironmongery / hardware\nplomberie=plumbing\nsanitaire=sanitary fixtures\nrobinetterie=taps / faucets\ntuyauterie=piping\ntube=pipe\nraccord=fitting / coupling\nvanne=valve\nrobinet=valve / tap\ncoupe-circuit=circuit breaker\ntableau électrique=distribution board\ncâblage=wiring\nconducteur=conductor / wire\ngaine=conduit / duct\nchemin de câbles=cable tray\ndisjoncteur=circuit breaker\ninterrupteur=switch\nprise=socket / outlet\néclairage=lighting\nluminaire=luminaire / light fixture\nascenseur=elevator\nescalier=staircase\nrampe d'accès=access ramp\ncirculation=corridor / circulation area\ncouloir=corridor\ncage d'escalier=stairwell\nhall=lobby\npermis de construire=building permit\ndéclaration de travaux=works declaration\ndossier d'exécution=construction documents\nplans d'exécution=construction drawings\ndossier technique=technical file\nmétré=bill of quantities\navant-projet=preliminary design\nprojet définitif=detailed design\nmarché=contract (public works)\nentreprise générale=general contractor\nsous-traitant=subcontract\nlot=package / trade lot\nconducteur d'opération=project manager\nmaître d'ouvrage=client / project owner\nmaître d'œuvre=project supervisor / lead consultant\narchitecte=architect\nbureau d'études=engineering consultancy\nbureau de contrôle=inspection body\nORB=building technical controller\nDTU=technical specification document (DTU)\nAvis Technique=Technical Assessment\nRE2020=RE2020 (French energy regulation)", + }, + automotive: { + systemPrompt: + "You are translating automotive engineering documents, technical specifications, maintenance manuals, and homologation reports. Use precise automotive terminology consistent with SAE, ISO, and European UNECE standards. Preserve all technical specifications, tolerances, torque values, and reference numbers exactly.", + glossary: + "moteur=engine\nmoteur à combustion=internal combustion engine\nmoteur électrique=electric motor\nmoteur hybride=hybrid engine\nbloc moteur=engine block\nculasse=cylinder head\nvilebrequin=crankshaft\narbre à cames=camshaft\npiston=piston\nbielle=connecting rod\nsoupape=valve\nbougie d'allumage=spark plug\ninjecteur=injector\nturbo-compresseur=turbocharger\ncompresseur=supercharger\ncollecteur d'admission=intake manifold\ncollecteur d'échappement=exhaust manifold\nrapport de compression=compression ratio\ncylindrée=engine displacement\npuissance=power\ncouple=torque\nrégime=engine speed (RPM)\nboîte de vitesses=gearbox\nboîte automatique=automatic transmission\nboîte manuelle=manual transmission\nembrayage=clutch\nconvertisseur de couple=torque converter\narbre de transmission=driveshaft\ndifférentiel=differential\npont=axle\ntransmission=transmission / drivetrain\ntraction=front-wheel drive\npropulsion=rear-wheel drive\ntransmission intégrale=all-wheel drive (AWD)\nquatre roues motrices=four-wheel drive (4WD)\nsuspension=suspension\namortisseur=shock absorber\nressort=spring\nbarre stabilisatrice=stabilizer bar / anti-roll bar\nbras de suspension=control arm\ntriangle de suspension=wishbone\nroue=wheel\npneu=tire\njante=rim\npneumatique=tire\npression des pneus=tire pressure\nfrein=brake\nfrein à disque=disc brake\nfrein à tambour=drum brake\nétrier=caliper\ndisque de frein=brake disc\nplaque de frein=brake pad\nservo-frein=brake booster\nABS=ABS (Anti-lock Braking System)\nESP=ESP (Electronic Stability Program)\ndirection=steering\ncrémaillère de direction=rack and pinion\nassistance de direction=power steering\ncarrosserie=bodywork\nchâssis=chassis\npare-choc=bumper\naile=fender\ncapot=hood\ncoffre=trunk / boot\ntoit=roof\ntoit ouvrant=sunroof\nvitres électriques=power windows\nrétroviseur=mirror\ncapot moteur=hood / bonnet\nhabitacle=cabin / passenger compartment\ntableau de bord=dashboard\ncombiné d'instrument=instrument cluster\nvolant=steering wheel\nsiège=seat\nceinture de sécurité=seatbelt\nairbag=airbag\néclairage=lighting\nphare=headlight\nfeu arrière=taillight\nclignotant=turn signal / indicator\nfeu de frein=brake light\nantibrouillard=fog light\némissions=emissions\npollution=pollution\npot catalytique=catalytic converter\nfiltre à particules=particulate filter (DPF)\nNorme Euro=Euro standard\nhomologation=type approval\ncontrôle technique=MOT test / vehicle inspection\nrévision=service / maintenance\nvidange=oil change\ncourroie de distribution=timing belt\nliquide de refroidissement=coolant\nliquide de frein=brake fluid\nhuile moteur=engine oil\nbatterie=battery\nbatterie lithium-ion=lithium-ion battery\nautonomie=range\nrecharge=charging\nborne de recharge=charging station\nvéhicule électrique=electric vehicle (EV)\nvéhicule hybride rechargeable=plug-in hybrid (PHEV)\nvehicule autonome=autonomous vehicle\nADAS=Advanced Driver Assistance Systems\nassistance au maintien dans la voie=lane keeping assist\nrégulateur de vitesse adaptatif=adaptive cruise control\nfreinage d'urgence automatique=automatic emergency braking\nalerte de franchissement=lane departure warning", + }, +}; + +const defaultSettings: TranslationSettings = { + defaultTargetLanguage: "fr", + defaultProvider: "google", + translateImages: false, + ollamaUrl: "http://localhost:11434", + ollamaModel: "", + openaiApiKey: "", + openaiModel: "gpt-4o-mini", + openrouterApiKey: "", + openrouterModel: "deepseek/deepseek-chat-v3-0324", + libreTranslateUrl: "", + systemPrompt: "", + glossary: "", + adminToken: undefined, +}; + +export const useTranslationStore = create()( + persist( + (set) => ({ + settings: defaultSettings, + updateSettings: (partial) => + set((state) => ({ + settings: { ...state.settings, ...partial }, + })), + setAdminToken: (token) => + set((state) => ({ + settings: { ...state.settings, adminToken: token }, + })), + applyPreset: (preset) => + set((state) => ({ + settings: { + ...state.settings, + ...PRESETS[preset], + }, + })), + clearContext: () => + set((state) => ({ + settings: { ...state.settings, systemPrompt: "", glossary: "" }, + })), + }), + { + name: "translation-settings", + }, + ), +); diff --git a/frontend/src/lib/types.ts b/frontend/src/lib/types.ts new file mode 100644 index 0000000..fed1a26 --- /dev/null +++ b/frontend/src/lib/types.ts @@ -0,0 +1,5 @@ +export interface ApiResponse { + data?: T; + message?: string; + error?: string; +} diff --git a/frontend/src/lib/utils.ts b/frontend/src/lib/utils.ts new file mode 100644 index 0000000..365058c --- /dev/null +++ b/frontend/src/lib/utils.ts @@ -0,0 +1,6 @@ +import { type ClassValue, clsx } from "clsx"; +import { twMerge } from "tailwind-merge"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} diff --git a/frontend/src/lib/webllm.ts b/frontend/src/lib/webllm.ts new file mode 100644 index 0000000..f5f2d87 --- /dev/null +++ b/frontend/src/lib/webllm.ts @@ -0,0 +1,46 @@ +import { useState, useCallback } from "react"; + +interface WebLLMState { + isLoaded: boolean; + loading: boolean; + error: string | null; +} + +export function useWebLLM() { + const [state, setState] = useState({ + isLoaded: false, + loading: false, + error: null, + }); + + const isWebGPUSupported = useCallback(() => { + if (typeof navigator === "undefined") return false; + return "gpu" in navigator; + }, []); + + const translate = useCallback( + async ( + _text: string, + _targetLang: string, + _systemPrompt?: string, + _glossary?: string, + ): Promise => { + setState((s) => ({ ...s, loading: true, error: null })); + try { + throw new Error("WebLLM is not available in this environment"); + } catch (err) { + const message = + err instanceof Error ? err.message : "WebLLM translation failed"; + setState((s) => ({ ...s, loading: false, error: message })); + throw err; + } + }, + [], + ); + + return { + ...state, + isWebGPUSupported, + translate, + }; +}