From eda682163216550c1c3ec5880b65b5ba5b68c2eb Mon Sep 17 00:00:00 2001 From: sepehr Date: Sun, 14 Jun 2026 12:45:12 +0200 Subject: [PATCH] i18n: fix missing keys and translate all non-admin frontend strings - Add 12 missing i18n keys (t() was returning the literal key string) to all 13 locales: dashboard.topbar.premiumAccess, dashboard.translate.complete.toastOkDesc, dashboard.translate.progress.{connectionLost,processingFallback}, glossaries.card.{term,created}, glossaries.termEditor.{addTerm,maxReached}, login.google.{connecting,errorFailed,errorGeneric}, login.orContinueWith - Add 6 FR-drift keys (landing.pricing.{free,enterprise}.{name,desc,cta}) - Add ~120 new i18n keys covering site header/footer, file-uploader, checkout success, dashboard pages, translate page, provider selector themes, language selector, translation complete, api-keys, services, settings, pricing (~1800 new key/locale pairs) - Wrap hardcoded French/English in components with t() calls - Convert LLM_THEMES/CLASSIC_THEMES/FALLBACK_PROVIDERS maps from hardcoded constants to t()-driven factories - Admin pages intentionally left untouched per request Files: 15 components/pages + src/lib/i18n.tsx Typecheck: passes (tsc --noEmit exit 0) --- frontend/src/app/checkout/success/page.tsx | 24 +- .../app/dashboard/api-keys/ApiKeyTable.tsx | 2 +- frontend/src/app/dashboard/api-keys/page.tsx | 2 +- frontend/src/app/dashboard/page.tsx | 10 +- frontend/src/app/dashboard/profile/page.tsx | 2 +- frontend/src/app/dashboard/services/page.tsx | 7 +- frontend/src/app/dashboard/settings/page.tsx | 6 +- .../dashboard/translate/LanguageSelector.tsx | 11 +- .../dashboard/translate/ProviderSelector.tsx | 95 +- .../translate/TranslationComplete.tsx | 8 +- frontend/src/app/dashboard/translate/page.tsx | 103 +- frontend/src/app/pricing/page.tsx | 4 +- frontend/src/components/file-uploader.tsx | 115 +- .../src/components/layout/site-footer.tsx | 14 +- .../src/components/layout/site-header.tsx | 20 +- frontend/src/lib/i18n.tsx | 1956 +++++++++++++++++ 16 files changed, 2188 insertions(+), 191 deletions(-) diff --git a/frontend/src/app/checkout/success/page.tsx b/frontend/src/app/checkout/success/page.tsx index 32ac2dc..a4a8084 100644 --- a/frontend/src/app/checkout/success/page.tsx +++ b/frontend/src/app/checkout/success/page.tsx @@ -5,6 +5,7 @@ import { useSearchParams, useRouter } from 'next/navigation'; import { useQueryClient } from '@tanstack/react-query'; import { API_BASE } from '@/lib/config'; import { CheckCircle2, XCircle, RefreshCw } from 'lucide-react'; +import { useI18n } from '@/lib/i18n'; /** * /checkout/success @@ -17,6 +18,7 @@ export default function CheckoutSuccessPage() { const router = useRouter(); const sessionId = searchParams.get('session_id'); const queryClient = useQueryClient(); + const { t } = useI18n(); const [status, setStatus] = useState<'syncing' | 'ok' | 'error'>('syncing'); const [message, setMessage] = useState(''); @@ -43,19 +45,23 @@ export default function CheckoutSuccessPage() { try { data = await res.json(); } catch { /* ignore */ } if (res.ok) { setStatus('ok'); - setMessage(data.data?.plan ? `Forfait ${data.data.plan} activé !` : 'Abonnement activé !'); + setMessage( + data.data?.plan + ? t('checkout.planActivated', { plan: data.data.plan }) + : t('checkout.subscriptionActivated') + ); queryClient.invalidateQueries({ queryKey: ['user', 'me'] }); // Redirect after 2s setTimeout(() => router.replace('/dashboard/profile?tab=subscription'), 2000); } else { setStatus('error'); - setMessage(data.message ?? data.error ?? 'Erreur de synchronisation'); + setMessage(data.message ?? data.error ?? t('checkout.syncError')); setTimeout(() => router.replace('/dashboard/profile?tab=subscription'), 3000); } }) .catch(() => { setStatus('error'); - setMessage('Erreur réseau. Votre paiement est confirmé — rechargez votre profil.'); + setMessage(t('checkout.networkError')); setTimeout(() => router.replace('/dashboard/profile?tab=subscription'), 3000); }); // eslint-disable-next-line react-hooks/exhaustive-deps @@ -67,24 +73,24 @@ export default function CheckoutSuccessPage() { {status === 'syncing' && ( <> -

Activation en cours…

-

Nous mettons à jour votre abonnement, veuillez patienter.

+

{t('checkout.activating')}

+

{t('checkout.activatingDesc')}

)} {status === 'ok' && ( <> -

Paiement confirmé !

+

{t('checkout.paymentConfirmed')}

{message}

-

Redirection vers votre profil…

+

{t('checkout.redirectingToProfile')}

)} {status === 'error' && ( <> -

Paiement reçu

+

{t('checkout.paymentReceived')}

{message}

-

Redirection…

+

{t('checkout.redirecting')}

)} diff --git a/frontend/src/app/dashboard/api-keys/ApiKeyTable.tsx b/frontend/src/app/dashboard/api-keys/ApiKeyTable.tsx index e77f0e6..5bfa105 100644 --- a/frontend/src/app/dashboard/api-keys/ApiKeyTable.tsx +++ b/frontend/src/app/dashboard/api-keys/ApiKeyTable.tsx @@ -109,7 +109,7 @@ export function ApiKeyTable({ keys, onRevoke, isRevoking }: ApiKeyTableProps) { - {copiedId === key.id ? 'Copied!' : t('apiKeys.table.copyPrefix')} + {copiedId === key.id ? t('apiKeys.copied') : t('apiKeys.table.copyPrefix')} diff --git a/frontend/src/app/dashboard/api-keys/page.tsx b/frontend/src/app/dashboard/api-keys/page.tsx index fc28f84..6319f6d 100644 --- a/frontend/src/app/dashboard/api-keys/page.tsx +++ b/frontend/src/app/dashboard/api-keys/page.tsx @@ -197,7 +197,7 @@ export default function ApiKeysPage() { {t('apiKeys.sectionTitle')}

- {keys.length > 0 ? `${keys[0].key_prefix}************************************` : 'No keys generated'} + {keys.length > 0 ? `${keys[0].key_prefix}************************************` : t('apiKeys.noKeysGenerated')}

diff --git a/frontend/src/app/dashboard/page.tsx b/frontend/src/app/dashboard/page.tsx index 112aa7c..2a31b0f 100644 --- a/frontend/src/app/dashboard/page.tsx +++ b/frontend/src/app/dashboard/page.tsx @@ -4,6 +4,7 @@ import { useEffect, useState } from 'react'; import { useRouter, useSearchParams } from 'next/navigation'; import { Loader2 } from 'lucide-react'; import { useUser } from './useUser'; +import { useI18n } from '@/lib/i18n'; import { API_BASE } from '@/lib/config'; /** @@ -18,6 +19,7 @@ export default function DashboardPage() { const checkoutSessionId = searchParams.get('session_id'); const [syncError, setSyncError] = useState(null); const { refetch } = useUser(); + const { t } = useI18n(); useEffect(() => { if (!checkoutSessionId) { @@ -42,20 +44,20 @@ export default function DashboardPage() { if (!cancelled) { if (!res.ok) { const errData = await res.json().catch(() => ({})); - setSyncError(errData.message || 'Erreur lors de la synchronisation du paiement.'); + setSyncError(errData.message || t('dashboard.checkoutSyncError')); } else { await refetch(); router.replace('/dashboard/translate'); } } } catch { - if (!cancelled) setSyncError('Erreur réseau. Veuillez rafraîchir la page.'); + if (!cancelled) setSyncError(t('dashboard.networkRefresh')); } }; runSync(); return () => { cancelled = true; }; - }, [checkoutSessionId, refetch, router]); + }, [checkoutSessionId, refetch, router, t]); if (syncError) { return ( @@ -65,7 +67,7 @@ export default function DashboardPage() { onClick={() => router.replace('/dashboard/translate')} className="text-xs text-muted-foreground underline" > - Continuer vers la traduction + {t('dashboard.continueToTranslate')}
); diff --git a/frontend/src/app/dashboard/profile/page.tsx b/frontend/src/app/dashboard/profile/page.tsx index 19a3332..ae8ba2a 100644 --- a/frontend/src/app/dashboard/profile/page.tsx +++ b/frontend/src/app/dashboard/profile/page.tsx @@ -207,7 +207,7 @@ export default function ProfilePage() { )}> {statusMsg.type === 'ok' ? : } {statusMsg.text} - + )} diff --git a/frontend/src/app/dashboard/services/page.tsx b/frontend/src/app/dashboard/services/page.tsx index abd0e86..4dd192c 100644 --- a/frontend/src/app/dashboard/services/page.tsx +++ b/frontend/src/app/dashboard/services/page.tsx @@ -5,8 +5,8 @@ import { Zap, CheckCircle2, Lock, Loader2, Globe, Brain } from 'lucide-react'; import { API_BASE } from '@/lib/config'; import { useI18n } from '@/lib/i18n'; -const FALLBACK_PROVIDERS = [ - { id: "google", label: "Google Traduction", description: "Traduction rapide, 130+ langues", mode: "classic" as const }, +const FALLBACK_PROVIDERS_FACTORY = (t: (k: string) => string) => [ + { id: "google", label: t('services.fallback.google.label'), description: t('services.fallback.google.desc'), mode: "classic" as const }, ]; interface AvailableProvider { @@ -19,6 +19,7 @@ interface AvailableProvider { export default function TranslationServicesPage() { const { t } = useI18n(); + const FALLBACK_PROVIDERS = FALLBACK_PROVIDERS_FACTORY(t); const [providers, setProviders] = useState([]); const [isLoading, setIsLoading] = useState(true); @@ -43,7 +44,7 @@ export default function TranslationServicesPage() { } }; fetchProviders(); - }, []); + }, [FALLBACK_PROVIDERS]); const classicProviders = providers.filter((p) => p.mode === "classic"); const llmProviders = providers.filter((p) => p.mode === "llm"); diff --git a/frontend/src/app/dashboard/settings/page.tsx b/frontend/src/app/dashboard/settings/page.tsx index 86398e4..852828a 100644 --- a/frontend/src/app/dashboard/settings/page.tsx +++ b/frontend/src/app/dashboard/settings/page.tsx @@ -28,9 +28,9 @@ export default function GeneralSettingsPage() { }; const formats = [ - { icon: FileSpreadsheet, color: 'text-green-500', name: 'Excel', ext: '.xlsx, .xls', features: [t('settings.formats.formulas'), t('settings.formats.styles'), t('settings.formats.images')] }, - { icon: FileText, color: 'text-blue-500', name: 'Word', ext: '.docx, .doc', features: [t('settings.formats.headers'), t('settings.formats.tables'), t('settings.formats.images')] }, - { icon: Presentation, color: 'text-orange-500', name: 'PowerPoint', ext: '.pptx, .ppt', features: [t('settings.formats.slides'), t('settings.formats.notes'), t('settings.formats.images')] }, + { icon: FileSpreadsheet, color: 'text-green-500', name: t('settings.formats.excel.name'), ext: '.xlsx, .xls', features: [t('settings.formats.formulas'), t('settings.formats.styles'), t('settings.formats.images')] }, + { icon: FileText, color: 'text-blue-500', name: t('settings.formats.word.name'), ext: '.docx, .doc', features: [t('settings.formats.headers'), t('settings.formats.tables'), t('settings.formats.images')] }, + { icon: Presentation, color: 'text-orange-500', name: t('settings.formats.powerpoint.name'), ext: '.pptx, .ppt', features: [t('settings.formats.slides'), t('settings.formats.notes'), t('settings.formats.images')] }, ]; return ( diff --git a/frontend/src/app/dashboard/translate/LanguageSelector.tsx b/frontend/src/app/dashboard/translate/LanguageSelector.tsx index 283f03f..ceecd66 100644 --- a/frontend/src/app/dashboard/translate/LanguageSelector.tsx +++ b/frontend/src/app/dashboard/translate/LanguageSelector.tsx @@ -32,6 +32,7 @@ function Combobox({ placeholder: string; onChange: (code: string) => void; }) { + const { t } = useI18n(); const [open, setOpen] = useState(false); const [query, setQuery] = useState(''); const ref = useRef(null); @@ -81,13 +82,13 @@ function Combobox({ type="text" value={query} onChange={e => setQuery(e.target.value)} - placeholder="Search..." + placeholder={t('langSelector.search')} className="w-full bg-transparent px-1 py-1 text-xs outline-none placeholder:text-brand-dark/30 dark:placeholder:text-white/30 text-brand-dark dark:text-white" />
{filtered.length === 0 && ( -
No results
+
{t('langSelector.noResults')}
)} {filtered.map(lang => ( @@ -174,7 +175,7 @@ export default function LanguageSelector({ {/* Target */}
- Cible + {t('langSelector.target')} = { +const LLM_THEMES_FACTORY = (t: (k: string) => string): Record => ({ deepseek: { - badge: 'Essentielle', - subBadge: 'Technique & Éco', + badge: t('providerTheme.deepseek.badge'), + subBadge: t('providerTheme.deepseek.subBadge'), accentClass: 'border-cyan-500/30 text-cyan-600 dark:text-cyan-400 bg-cyan-500/5', glowClass: 'from-cyan-500/10 dark:from-cyan-500/5 to-transparent', - descriptionOverride: 'Traduction ultra-précise et économique, idéale pour les documents techniques et le code.' + descriptionOverride: t('providerTheme.deepseek.desc') }, openai: { - badge: 'Premium', - subBadge: 'Haute Fidélité', + badge: t('providerTheme.openai.badge'), + subBadge: t('providerTheme.openai.subBadge'), accentClass: 'border-emerald-500/30 text-emerald-600 dark:text-emerald-400 bg-emerald-500/5', glowClass: 'from-emerald-500/10 dark:from-emerald-500/5 to-transparent', - descriptionOverride: 'Le standard mondial de l\'IA. Cohérence textuelle maximale et respect strict du style.' + descriptionOverride: t('providerTheme.openai.desc') }, minimax: { - badge: 'Avancée', - subBadge: 'Performance', + badge: t('providerTheme.minimax.badge'), + subBadge: t('providerTheme.minimax.subBadge'), accentClass: 'border-indigo-500/30 text-indigo-600 dark:text-indigo-400 bg-indigo-500/5', glowClass: 'from-indigo-500/10 dark:from-indigo-500/5 to-transparent', - descriptionOverride: 'Vitesse d\'exécution incroyable et excellente compréhension des structures complexes.' + descriptionOverride: t('providerTheme.minimax.desc') }, openrouter: { - badge: 'Express', - subBadge: 'Multi-Modèles', + badge: t('providerTheme.openrouter.badge'), + subBadge: t('providerTheme.openrouter.subBadge'), accentClass: 'border-purple-500/30 text-purple-600 dark:text-purple-400 bg-purple-500/5', glowClass: 'from-purple-500/10 dark:from-purple-500/5 to-transparent', - descriptionOverride: 'Accès unifié aux meilleurs modèles open-source optimisés pour la traduction.' + descriptionOverride: t('providerTheme.openrouter.desc') }, openrouter_premium: { - badge: 'Ultra', - subBadge: 'Maximum Context', + badge: t('providerTheme.openrouter_premium.badge'), + subBadge: t('providerTheme.openrouter_premium.subBadge'), accentClass: 'border-rose-500/30 text-rose-600 dark:text-rose-400 bg-rose-500/5', glowClass: 'from-rose-500/10 dark:from-rose-500/5 to-transparent', - descriptionOverride: 'Traduction assistée par les modèles de pointe (GPT-4o, Claude Sonnet 4.6) pour documents longs.' + descriptionOverride: t('providerTheme.openrouter_premium.desc') }, zai: { - badge: 'Spécialisée', - subBadge: 'Finance & Droit', + badge: t('providerTheme.zai.badge'), + subBadge: t('providerTheme.zai.subBadge'), accentClass: 'border-amber-500/30 text-amber-600 dark:text-amber-400 bg-amber-500/5', glowClass: 'from-amber-500/10 dark:from-amber-500/5 to-transparent', - descriptionOverride: 'Modèle affiné pour les terminologies métiers exigeantes (juridique, finance).' + descriptionOverride: t('providerTheme.zai.desc') } -}; +}); -const DEFAULT_LLM_THEME: CardTheme = { - badge: 'Moderne', - subBadge: 'Raisonnement IA', +const makeDefaultLlmTheme = (t: (k: string) => string): CardTheme => ({ + badge: t('providerTheme.default.badge'), + subBadge: t('providerTheme.default.subBadge'), accentClass: 'border-brand-accent/30 text-brand-accent bg-brand-accent/5', glowClass: 'from-brand-accent/10 to-transparent', - descriptionOverride: 'Traduction par grand modèle linguistique (LLM) avec analyse sémantique avancée.' -}; + descriptionOverride: t('providerTheme.default.desc') +}); -const CLASSIC_THEMES: Record = { +const CLASSIC_THEMES_FACTORY = (t: (k: string) => string): Record => ({ google: { - labelOverride: 'Google Traduction', - descriptionOverride: 'Traduction ultra-rapide couvrant plus de 130 langues. Recommandé pour les flux généraux.' + labelOverride: t('providerTheme.classic.google.label'), + descriptionOverride: t('providerTheme.classic.google.desc') }, deepl: { - labelOverride: 'DeepL Pro', - descriptionOverride: 'Traduction haute précision réputée pour sa fluidité et ses formulations naturelles.' + labelOverride: t('providerTheme.classic.deepl.label'), + descriptionOverride: t('providerTheme.classic.deepl.desc') }, google_cloud: { - labelOverride: 'Google Cloud API', - descriptionOverride: 'Moteur cloud professionnel optimisé pour le traitement de gros volumes de documents.' + labelOverride: t('providerTheme.classic.google_cloud.label'), + descriptionOverride: t('providerTheme.classic.google_cloud.desc') } -}; +}); export function ProviderSelector({ provider, @@ -100,6 +100,11 @@ export function ProviderSelector({ const { t } = useI18n(); const [activeTab, setActiveTab] = useState<'classic' | 'llm'>('classic'); + // Theme maps built from i18n (so they follow the active locale) + const LLM_THEMES = LLM_THEMES_FACTORY(t); + const DEFAULT_LLM_THEME = makeDefaultLlmTheme(t); + const CLASSIC_THEMES = CLASSIC_THEMES_FACTORY(t); + // Filter providers const classicProviders = availableProviders.filter((p) => p.mode === 'classic'); const llmProviders = availableProviders.filter((p) => p.mode === 'llm'); @@ -118,7 +123,7 @@ export function ProviderSelector({ return (
- {t('dashboard.translate.provider.loading') || 'Chargement des moteurs...'} + {t('dashboard.translate.provider.loading')}
); } @@ -126,7 +131,7 @@ export function ProviderSelector({ if (availableProviders.length === 0) { return (

- {t('dashboard.translate.provider.noneConfigured') || 'Aucun fournisseur configuré'} + {t('dashboard.translate.provider.noneConfigured')}

); } @@ -209,7 +214,7 @@ export function ProviderSelector({ {/* Title */}
@@ -225,7 +230,7 @@ export function ProviderSelector({ : 'text-brand-dark/50 dark:text-white/40 hover:text-brand-dark dark:hover:text-white' )} > - {t('dashboard.translate.provider.tabStandard') || 'Standard'} + {t('dashboard.translate.provider.tabStandard')}
@@ -252,7 +257,7 @@ export function ProviderSelector({
) : (

- Aucun traducteur standard disponible. + {t('providerSelector.noClassic')}

) ) : ( @@ -262,7 +267,7 @@ export function ProviderSelector({ ) : (

- Aucun modèle IA configuré. + {t('providerSelector.noLlm')}

) )} @@ -278,7 +283,7 @@ export function ProviderSelector({

{meta?.labelOverride || activeP.label} : {meta?.descriptionOverride || activeP.description} - Coût : 1 crédit par page + {t('providerSelector.costOne')}

) : null; })() @@ -291,7 +296,7 @@ export function ProviderSelector({ {activeP.label} : {theme.descriptionOverride} ({activeP.model || 'default'}) - Coût : {activeP.id === 'openrouter_premium' ? '5 crédits par page (Facteur Premium)' : '1 crédit par page'} + {activeP.id === 'openrouter_premium' ? t('providerSelector.costFive') : t('providerSelector.costOne')}

) : null; @@ -306,16 +311,16 @@ export function ProviderSelector({
- {t('dashboard.translate.provider.llmDivider') || 'Intelligence Artificielle Active'} + {t('dashboard.translate.provider.llmDivider')}

- Débloquez la traduction contextuelle haut de gamme pour vos documents entiers. + {t('providerSelector.unlockContextual')}

- {t('dashboard.translate.provider.upgrade') || 'Passer Pro'} + {t('dashboard.translate.provider.upgrade')}
)} diff --git a/frontend/src/app/dashboard/translate/TranslationComplete.tsx b/frontend/src/app/dashboard/translate/TranslationComplete.tsx index 930bc0b..59e4ddb 100644 --- a/frontend/src/app/dashboard/translate/TranslationComplete.tsx +++ b/frontend/src/app/dashboard/translate/TranslationComplete.tsx @@ -111,7 +111,7 @@ export function TranslationComplete({ : t('dashboard.translate.complete.descGeneric')}

- Haute qualité + {t('translateComplete.highQuality')}
@@ -122,17 +122,17 @@ export function TranslationComplete({

142

-

Segments

+

{t('translateComplete.segments')}

12.8k

-

Caractères

+

{t('translateComplete.characters')}

96%

-

Confiance

+

{t('translateComplete.confidence')}

diff --git a/frontend/src/app/dashboard/translate/page.tsx b/frontend/src/app/dashboard/translate/page.tsx index 92d755b..5122121 100644 --- a/frontend/src/app/dashboard/translate/page.tsx +++ b/frontend/src/app/dashboard/translate/page.tsx @@ -182,6 +182,12 @@ export default function TranslatePage() { const tgtLangName = config.languages.find(l => l.code === config.targetLang)?.name || config.targetLang; const activeStepIdx = getActiveStepIdx(submit.progress); const qualityLabel = useMemo(() => getQualityLabel(t, config.provider), [t, config.provider]); + const fileTypeButtons = [ + { label: t('translate.fileType.word'), type: 'word' as const, icon: }, + { label: t('translate.fileType.excel'), type: 'excel' as const, icon: }, + { label: t('translate.fileType.slides'), type: 'slides' as const, icon: }, + { label: t('translate.fileType.pdf'), type: 'pdf' as const, icon: }, + ]; return (
@@ -191,19 +197,27 @@ export default function TranslatePage() {
{showProcessing ? ( <> - Traitement en cours + {t('translate.header.processing')}

- Analyse IA Active + {(() => { + const full = t('translate.header.aiActive'); + const i = full.lastIndexOf(' '); + return <>{i === -1 ? full : <>{full.slice(0, i)} {full.slice(i + 1)}}; + })()}

- Votre mise en page est en cours de préservation par notre moteur contextuel. + {t('translate.header.aiActiveDesc')}

) : showComplete ? ( <> - Complété + {t('translate.header.completed')}

- Traduction terminée + {(() => { + const full = t('translate.header.completedTitle'); + const i = full.lastIndexOf(' '); + return <>{i === -1 ? full : <>{full.slice(0, i)} {full.slice(i + 1)}}; + })()}

{submit.fileName} @@ -211,12 +225,16 @@ export default function TranslatePage() { ) : ( <> - Espace Pro + {t('translate.header.proSpace')}

- Traduire un document + {(() => { + const full = t('translate.header.translateDoc'); + const i = full.lastIndexOf(' '); + return <>{i === -1 ? full : <>{full.slice(0, i)} {full.slice(i + 1)}}; + })()}

- Conservez la mise en page d'origine grâce au moteur de traduction ultra-haute fidélité. + {t('translate.header.translateDocDesc')}

)} @@ -240,7 +258,7 @@ export default function TranslatePage() { onClick={() => dropzoneInputRef.current?.click()} >
- Format natif + {t('translate.upload.nativeFormat')}
@@ -256,12 +274,7 @@ export default function TranslatePage() { {/* Simulated file triggers */}
e.stopPropagation()}> - {[ - { label: 'Word (.docx)', type: 'word' as const, icon: }, - { label: 'Excel (.xlsx)', type: 'excel' as const, icon: }, - { label: 'Slides (.pptx)', type: 'slides' as const, icon: }, - { label: 'PDF (.pdf)', type: 'pdf' as const, icon: }, - ].map(f => ( + {fileTypeButtons.map(f => ( {!upload.file && ( -

{t('dashboard.translate.noFile') || 'Veuillez charger un fichier'}

+

{t('translate.pleaseLoadFile')}

)} {upload.file && !config.targetLang && ( -

{t('dashboard.translate.noTargetLang') || 'Veuillez choisir une langue cible'}

+

{t('translate.chooseTargetLang')}

)}
@@ -343,7 +356,7 @@ export default function TranslatePage() {

- Moteur contextuel actif + {t('translate.contextEngineActive')}

{submit.fileName || upload.file?.name} @@ -376,7 +389,7 @@ export default function TranslatePage() {

- {activeStepIdx < 2 ? 'Phase 1: Initialisation' : 'Phase 2: Reconstruction Contextuelle'} + {activeStepIdx < 2 ? t('translate.phase1') : t('translate.phase2')} {Math.round(submit.progress)}% @@ -384,10 +397,10 @@ export default function TranslatePage() {
- } value={`${Math.round(submit.progress)}%`} label="segments" /> - } value="99.9%" label="précision" /> - } value="Turbo" label="vitesse" /> - } value={formatElapsed(elapsed)} label="temps" /> + } value={`${Math.round(submit.progress)}%`} label={t('translate.stat.segments')} /> + } value="99.9%" label={t('translate.stat.precision')} /> + } value="Turbo" label={t('translate.stat.speedLabel')} /> + } value={formatElapsed(elapsed)} label={t('translate.stat.time')} />
)} @@ -402,7 +415,7 @@ export default function TranslatePage() {

- Traduction terminée + {t('translate.header.completedTitle')}

{submit.fileName} @@ -410,7 +423,7 @@ export default function TranslatePage() {

- ✓ Qualité Maître + {t('translate.complete.masterQuality')}
@@ -420,13 +433,13 @@ export default function TranslatePage() { className="premium-button px-24 py-6 text-xl !rounded-full flex items-center gap-6 mb-8 group cursor-pointer hover:scale-[1.02] active:scale-95" > - Télécharger + {t('translate.download')}
@@ -441,7 +454,7 @@ export default function TranslatePage() {
-

Erreur lors de la traduction

+

{t('translate.failedTitle')}

{humanFriendlyError(submit.error)}

@@ -459,7 +472,7 @@ export default function TranslatePage() { className="premium-button w-full py-5 text-[12px] uppercase tracking-[0.25em] flex items-center justify-center gap-3 !rounded-2xl cursor-pointer hover:scale-[1.01] active:scale-98" > - Réessayer + {t('translate.retry')} )} @@ -556,7 +569,7 @@ export default function TranslatePage() { {config.mode === 'classic' ? (
- Indisponible en mode Standard (IA uniquement) + {t('translate.unavailableStandard')}
) : ( @@ -590,7 +603,7 @@ export default function TranslatePage() { {t('dashboard.translate.pdfMode.preserveLayout') || 'Mise en page'}

- Conserver la mise en page + {t('translate.preserveLayoutDesc')}

@@ -624,7 +637,7 @@ export default function TranslatePage() {

- Moniteur IA + {t('translate.monitor')}

{/* File summary */} @@ -670,8 +683,8 @@ export default function TranslatePage() { {/* Quality progress */}
- Intégrité Layout - 100% SECURE + {t('translate.layoutIntegrity')} + {t('translate.secureHundred')}
- ⟳ Annuler le processus + {t('translate.cancelProcess')}
)} @@ -695,7 +708,7 @@ export default function TranslatePage() {

- Récapitulatif + {t('translate.summary')}

@@ -717,8 +730,8 @@ export default function TranslatePage() {
- Intégrité Layout - 100% OK + {t('translate.layoutIntegrity')} + {t('translate.okHundred')}
@@ -773,9 +786,9 @@ export default function TranslatePage() { )} > {submit.isSubmitting ? ( - <> {t('dashboard.translate.actions.uploading') || 'Soumission...'} + <> {t('translate.submit')} ) : ( - <>Lancer la traduction + <>{t('translate.startTranslation')} )}
diff --git a/frontend/src/app/pricing/page.tsx b/frontend/src/app/pricing/page.tsx index cb0a8d1..29ae928 100644 --- a/frontend/src/app/pricing/page.tsx +++ b/frontend/src/app/pricing/page.tsx @@ -464,7 +464,7 @@ export default function PricingPage() { href={isLoggedIn ? "/dashboard" : "/"} className="px-6 py-2 rounded-full text-[9px] font-black uppercase tracking-widest text-foreground/40 hover:text-foreground transition-all" > - Dashboard + {t('pricing.dashboard')} {isLoggedIn && ( - {toastMsg.type === 'ok' ? '✓' : '✕'} + {toastMsg.type === 'ok' ? t('pricing.okSymbol') : t('pricing.errSymbol')}

{toastMsg.text}

diff --git a/frontend/src/components/file-uploader.tsx b/frontend/src/components/file-uploader.tsx index d74b40c..a5cb9bb 100644 --- a/frontend/src/components/file-uploader.tsx +++ b/frontend/src/components/file-uploader.tsx @@ -2,17 +2,17 @@ import { useState, useCallback, useEffect, useRef } from "react"; import { useDropzone } from "react-dropzone"; -import { - Upload, - FileText, - FileSpreadsheet, - Presentation, - X, - Download, - Loader2, - Cpu, - AlertTriangle, - Brain, +import { + Upload, + FileText, + FileSpreadsheet, + Presentation, + X, + Download, + Loader2, + Cpu, + AlertTriangle, + Brain, CheckCircle, File, Zap, @@ -35,6 +35,7 @@ import { Input } from "@/components/ui/input"; import { useTranslationStore, openaiModels, openrouterModels } from "@/lib/store"; import { translateDocument, languages, providers, extractTextsFromDocument, reconstructDocument, TranslatedText } from "@/lib/api"; import { useWebLLM } from "@/lib/webllm"; +import { useI18n } from "@/lib/i18n"; import { cn } from "@/lib/utils"; const fileIcons: Record = { @@ -54,13 +55,14 @@ interface FilePreviewProps { } const FilePreview = ({ file, onRemove }: FilePreviewProps) => { + const { t } = useI18n(); const [preview, setPreview] = useState(null); const [loading, setLoading] = useState(false); useEffect(() => { const generatePreview = async () => { if (!file) return; - + setLoading(true); try { if (file.type.startsWith('image/')) { @@ -120,7 +122,7 @@ const FilePreview = ({ file, onRemove }: FilePreviewProps) => {

- +
{getFileExtension(file.name).toUpperCase()} @@ -145,9 +147,9 @@ const FilePreview = ({ file, onRemove }: FilePreviewProps) => { ) : preview ? (
{file.type.startsWith('image/') ? ( - Preview ) : ( @@ -167,7 +169,7 @@ const FilePreview = ({ file, onRemove }: FilePreviewProps) => {
- Preview + {t('fileUploader.preview')}
@@ -583,7 +590,7 @@ export function FileUploader() {
- {translationStatus || "Processing..."} + {translationStatus || t('fileUploader.processing')} {Math.round(progress)}%
@@ -591,7 +598,7 @@ export function FileUploader() { {provider === "webllm" && (
- Translating locally with WebLLM... + {t('fileUploader.translatingLocally')}
)}
@@ -603,7 +610,7 @@ export function FileUploader() {
-

Translation Error

+

{t('fileUploader.translationError')}

{error}

@@ -620,9 +627,9 @@ export function FileUploader() {
- Translation Complete! + {t('fileUploader.translationComplete')} - Your document has been translated successfully while preserving all formatting. + {t('fileUploader.translationCompleteDesc')} diff --git a/frontend/src/components/layout/site-footer.tsx b/frontend/src/components/layout/site-footer.tsx index 1e4fe49..30e7a15 100644 --- a/frontend/src/components/layout/site-footer.tsx +++ b/frontend/src/components/layout/site-footer.tsx @@ -1,22 +1,24 @@ -import Link from "next/link" +import Link from "next/link"; +import { useI18n } from "@/lib/i18n"; export function SiteFooter() { + const { t } = useI18n(); return (
- © 2026 Wordly. All rights reserved. + {t('landing.footer.rights')}
- Pricing + {t('landing.nav.pricing')} - Terms + {t('layout.footer.terms')} - Privacy + {t('layout.footer.privacy')}
- ) + ); } diff --git a/frontend/src/components/layout/site-header.tsx b/frontend/src/components/layout/site-header.tsx index a3034d9..ae3e5c3 100644 --- a/frontend/src/components/layout/site-header.tsx +++ b/frontend/src/components/layout/site-header.tsx @@ -1,8 +1,12 @@ -import Link from "next/link" -import { Languages } from "lucide-react" -import { Button } from "@/components/ui/button" +"use client"; + +import Link from "next/link"; +import { Languages } from "lucide-react"; +import { Button } from "@/components/ui/button"; +import { useI18n } from "@/lib/i18n"; export function SiteHeader() { + const { t } = useI18n(); return (
@@ -17,23 +21,23 @@ export function SiteHeader() {
- ) + ); } diff --git a/frontend/src/lib/i18n.tsx b/frontend/src/lib/i18n.tsx index d62d4f0..06964ca 100644 --- a/frontend/src/lib/i18n.tsx +++ b/frontend/src/lib/i18n.tsx @@ -219,6 +219,7 @@ const messages: Record> = { "dashboard.translate.complete.download": "Download", "dashboard.translate.complete.newTranslation": "New Translation", "dashboard.translate.complete.toastOkTitle": "Success", + "dashboard.translate.complete.toastOkDesc": "{name} has been downloaded successfully.", "dashboard.translate.complete.toastFailTitle": "Failed", "dashboard.translate.complete.toastFailDesc": "Translation failed. Please try again.", @@ -248,6 +249,8 @@ const messages: Record> = { "dashboard.translate.pipeline.translate": "Translation", "dashboard.translate.pipeline.rebuild": "Rebuild", "dashboard.translate.pipeline.finalize": "Finalize", + "dashboard.translate.progress.processingFallback": "Processing…", + "dashboard.translate.progress.connectionLost": "Connection lost. Retrying…", "dashboard.translate.progress.failedTitle": "Translation failed", "dashboard.translate.error.unexpected": "An unexpected error occurred. Please try again.", "dashboard.translate.error.noResult": "Translation produced no results. Verify the document contains text, then try again or choose another engine.", @@ -312,6 +315,8 @@ const messages: Record> = { "glossaries.dialog.dropTitle": "Drag a CSV file here", "glossaries.dialog.dropOr": "or", "glossaries.dialog.dropFormats": "CSV, TSV, TXT", + "glossaries.termEditor.addTerm": "Add Term", + "glossaries.termEditor.maxReached": "Maximum {max} terms per glossary reached.", "glossaries.dialog.formatTitle": "Format", "glossaries.dialog.formatDesc": "source,target (one per line)", "glossaries.dialog.formatNote": "First line skipped if header detected", @@ -407,6 +412,8 @@ const messages: Record> = { "glossaries.badge.compatible": "Compatible", "glossaries.badge.otherTarget": "Other target", "glossaries.card.editTerms": "Edit terms", + "glossaries.card.created": "Created", + "glossaries.card.term": "term", "glossaries.card.delete": "Delete", "glossaries.grid.searchPlaceholder": "Search a glossary…", "glossaries.grid.noResults": "No results for this search.", @@ -678,6 +685,10 @@ const messages: Record> = { "login.signIn": "Sign In", "login.noAccount": "Don't have an account?", "login.signUpFree": "Sign up for free", + "login.orContinueWith": "or continue with email", + "login.google.connecting": "Connecting…", + "login.google.errorGeneric": "Something went wrong with Google sign-in.", + "login.google.errorFailed": "Google sign-in failed. Please try again.", "forgotPassword.enterEmail": "Please enter your email address", "forgotPassword.error": "An error occurred", "forgotPassword.title": "Forgot Password", @@ -985,6 +996,7 @@ const messages: Record> = { "memento.ctaMore": "Learn more", "common.backToHome": "Back to home", "dashboard.topbar.interfaceLabel": "Translation Interface", + "dashboard.topbar.premiumAccess": "Premium Access", "landing.hero.contextEngine": "Translation detected: Technical maintenance term for HVAC systems...", "landing.hero.liveAnalysis": "Live Analysis", "landing.hero.termsDetected": "terms detected", @@ -1005,6 +1017,144 @@ const messages: Record> = { "landing.translate.aiAnalysis": "Active AI Analysis", "landing.translate.processing": "Processing", "landing.translate.preservingLayout": "Your layout is being preserved", + "layout.nav.apiAccess": "API Access", + "layout.footer.terms": "Terms", + "layout.footer.privacy": "Privacy", + "fileUploader.uploadDocument": "Upload Document", + "fileUploader.uploadDesc": "Drag and drop or click to select a file (Excel, Word, PowerPoint)", + "fileUploader.dropHere": "Drop your file here...", + "fileUploader.dragAndDrop": "Drag & drop your document here", + "fileUploader.orClickBrowse": "or click to browse", + "fileUploader.preview": "Preview", + "fileUploader.translationOptions": "Translation Options", + "fileUploader.configureSettings": "Configure your translation settings", + "fileUploader.targetLanguage": "Target Language", + "fileUploader.selectLanguage": "Select language", + "fileUploader.translationProvider": "Translation Provider", + "fileUploader.selectProvider": "Select provider", + "fileUploader.advancedOptions": "Advanced Options", + "fileUploader.translateImages": "Translate Images", + "fileUploader.translating": "Translating...", + "fileUploader.translateDocument": "Translate Document", + "fileUploader.processing": "Processing...", + "fileUploader.translationError": "Translation Error", + "fileUploader.translationComplete": "Translation Complete!", + "fileUploader.translationCompleteDesc": "Your document has been translated successfully while preserving all formatting.", + "fileUploader.download": "Download Translated Document", + "fileUploader.webgpuUnsupported": "WebGPU is not supported in this browser. Please use Chrome 113+ or Edge 113+.", + "fileUploader.webllmNotLoaded": "WebLLM model not loaded. Go to Settings > Translation Services to load a model first.", + "fileUploader.extracting": "Extracting texts from document...", + "fileUploader.noTranslatable": "No translatable text found in document", + "fileUploader.foundTexts": "Found {count} texts to translate", + "fileUploader.translatingItem": "Translating {current}/{total}: \"{preview}\"", + "fileUploader.reconstructing": "Reconstructing document...", + "fileUploader.translatingLocally": "Translating locally with WebLLM...", + "checkout.activating": "Activating…", + "checkout.activatingDesc": "We are updating your subscription, please wait.", + "checkout.paymentConfirmed": "Payment confirmed!", + "checkout.subscriptionActivated": "Subscription activated!", + "checkout.planActivated": "{plan} plan activated!", + "checkout.redirectingToProfile": "Redirecting to your profile…", + "checkout.paymentReceived": "Payment received", + "checkout.redirecting": "Redirecting…", + "checkout.syncError": "Sync error", + "checkout.networkError": "Network error. Your payment is confirmed — please reload your profile.", + "dashboard.checkoutSyncError": "Error syncing payment.", + "dashboard.networkRefresh": "Network error. Please refresh the page.", + "dashboard.continueToTranslate": "Continue to translation", + "langSelector.search": "Search...", + "langSelector.noResults": "No results", + "langSelector.source": "Source", + "langSelector.target": "Target", + "langSelector.swap": "Swap", + "translateComplete.highQuality": "High quality", + "translateComplete.segments": "Segments", + "translateComplete.characters": "Characters", + "translateComplete.confidence": "Confidence", + "providerTheme.deepseek.badge": "Essential", + "providerTheme.deepseek.subBadge": "Technical & Eco", + "providerTheme.deepseek.desc": "Ultra-precise and economical translation, ideal for technical documents and code.", + "providerTheme.openai.badge": "Premium", + "providerTheme.openai.subBadge": "High fidelity", + "providerTheme.openai.desc": "The global AI standard. Maximum textual consistency and strict style respect.", + "providerTheme.minimax.badge": "Advanced", + "providerTheme.minimax.subBadge": "Performance", + "providerTheme.minimax.desc": "Incredible execution speed and excellent understanding of complex structures.", + "providerTheme.openrouter.badge": "Express", + "providerTheme.openrouter.subBadge": "Multi-model", + "providerTheme.openrouter.desc": "Unified access to the best open-source models optimized for translation.", + "providerTheme.openrouter_premium.badge": "Ultra", + "providerTheme.openrouter_premium.subBadge": "Maximum context", + "providerTheme.openrouter_premium.desc": "Assisted by state-of-the-art models (GPT-4o, Claude Sonnet 4.6) for long documents.", + "providerTheme.zai.badge": "Specialized", + "providerTheme.zai.subBadge": "Finance & Law", + "providerTheme.zai.desc": "Model fine-tuned for demanding business terminologies (legal, finance).", + "providerTheme.default.badge": "Modern", + "providerTheme.default.subBadge": "AI reasoning", + "providerTheme.default.desc": "Large language model (LLM) translation with advanced semantic analysis.", + "providerTheme.classic.google.label": "Google Translate", + "providerTheme.classic.google.desc": "Ultra-fast translation covering 130+ languages. Recommended for general flows.", + "providerTheme.classic.deepl.label": "DeepL Pro", + "providerTheme.classic.deepl.desc": "High-precision translation renowned for its fluidity and natural formulations.", + "providerTheme.classic.google_cloud.label": "Google Cloud API", + "providerTheme.classic.google_cloud.desc": "Professional cloud engine optimized for processing large volumes of documents.", + "providerSelector.noClassic": "No standard translator available.", + "providerSelector.noLlm": "No AI model configured.", + "providerSelector.costOne": "Cost: 1 credit per page", + "providerSelector.costFive": "Cost: 5 credits per page (Premium factor)", + "providerSelector.unlockContextual": "Unlock premium contextual translation for your entire documents.", + "translate.header.processing": "Processing in progress", + "translate.header.aiActive": "AI analysis active", + "translate.header.aiActiveDesc": "Your layout is being preserved by our contextual engine.", + "translate.header.completed": "Completed", + "translate.header.completedTitle": "Translation completed", + "translate.header.proSpace": "Pro space", + "translate.header.translateDoc": "Translate a document", + "translate.header.translateDocDesc": "Preserve the original layout with our ultra-high-fidelity translation engine.", + "translate.upload.nativeFormat": "Native format", + "translate.fileType.word": "Word (.docx)", + "translate.fileType.excel": "Excel (.xlsx)", + "translate.fileType.slides": "Slides (.pptx)", + "translate.fileType.pdf": "PDF (.pdf)", + "translate.startTranslation": "Start translation", + "translate.submit": "Submitting...", + "translate.chooseTargetLang": "Please choose a target language", + "translate.pleaseLoadFile": "Please upload a file first", + "translate.contextEngineActive": "Contextual engine active", + "translate.phase1": "Phase 1: Initialisation", + "translate.phase2": "Phase 2: Contextual reconstruction", + "translate.stat.segments": "segments", + "translate.stat.precision": "precision", + "translate.stat.speedLabel": "speed", + "translate.stat.turbo": "Turbo", + "translate.stat.time": "time", + "translate.complete.masterQuality": "✓ Master quality", + "translate.download": "Download", + "translate.newTranslation": "+ New translation", + "translate.failedTitle": "Translation error", + "translate.retry": "Retry", + "translate.uploadAnother": "Upload another file", + "translate.monitor": "AI monitor", + "translate.summary": "Summary", + "translate.cancelProcess": "⟳ Cancel the process", + "translate.layoutIntegrity": "Layout integrity", + "translate.secureHundred": "100% SECURE", + "translate.okHundred": "100% OK", + "translate.preserveLayout": "Preserve layout", + "translate.preserveLayoutDesc": "Preserve the layout", + "translate.textOnly": "Text only", + "translate.textOnlyDesc": "Fast translation of text only", + "translate.unavailableStandard": "Unavailable in Standard mode (AI only)", + "apiKeys.noKeysGenerated": "No keys generated", + "apiKeys.copied": "Copied!", + "services.fallback.google.label": "Google Translate", + "services.fallback.google.desc": "Fast translation, 130+ languages", + "settings.formats.excel.name": "Excel", + "settings.formats.word.name": "Word", + "settings.formats.powerpoint.name": "PowerPoint", + "pricing.dashboard": "Dashboard", + "pricing.okSymbol": "✓", + "pricing.errSymbol": "✕", }, fr: { @@ -1144,6 +1294,12 @@ const messages: Record> = { "landing.pricing.business.f5": "Webhooks et automatisation", "landing.pricing.business.f6": "5 postes d'équipe", "landing.pricing.business.cta": "Nous contacter", + "landing.pricing.free.name": "Gratuit", + "landing.pricing.free.desc": "Idéal pour découvrir l'application", + "landing.pricing.free.cta": "Choisir ce plan", + "landing.pricing.enterprise.name": "Entreprise", + "landing.pricing.enterprise.desc": "Solutions sur mesure pour les grandes organisations", + "landing.pricing.enterprise.cta": "Nous contacter", "landing.cta.title": "Commencez à traduire en 30 secondes", "landing.cta.subtitle": "Aucune carte bancaire requise. Essayez gratuitement dès maintenant et redonnez vie à vos documents multilingues.", "landing.cta.button": "Créer un compte gratuit", @@ -1204,6 +1360,7 @@ const messages: Record> = { "dashboard.translate.complete.download": "Télécharger", "dashboard.translate.complete.newTranslation": "Nouvelle traduction", "dashboard.translate.complete.toastOkTitle": "Succès", + "dashboard.translate.complete.toastOkDesc": "{name} a été téléchargé avec succès.", "dashboard.translate.complete.toastFailTitle": "Échec", "dashboard.translate.complete.toastFailDesc": "La traduction a échoué. Veuillez réessayer.", @@ -1233,6 +1390,8 @@ const messages: Record> = { "dashboard.translate.pipeline.translate": "Traduction", "dashboard.translate.pipeline.rebuild": "Reconstruction", "dashboard.translate.pipeline.finalize": "Finalisation", + "dashboard.translate.progress.processingFallback": "Traitement en cours…", + "dashboard.translate.progress.connectionLost": "Connexion perdue. Reconnexion…", "dashboard.translate.progress.failedTitle": "Traduction échouée", "dashboard.translate.error.unexpected": "Une erreur inattendue est survenue. Réessayez.", "dashboard.translate.error.noResult": "La traduction n'a produit aucun résultat. Vérifiez que le document contient du texte, puis réessayez ou choisissez un autre moteur.", @@ -1298,6 +1457,8 @@ const messages: Record> = { "glossaries.dialog.dropTitle": "Glissez un fichier CSV ici", "glossaries.dialog.dropOr": "ou", "glossaries.dialog.dropFormats": "CSV, TSV, TXT", + "glossaries.termEditor.addTerm": "Ajouter un terme", + "glossaries.termEditor.maxReached": "Maximum {max} termes par glossaire atteint.", "glossaries.dialog.formatTitle": "Format", "glossaries.dialog.formatDesc": "source,target (un par ligne)", @@ -1395,6 +1556,8 @@ const messages: Record> = { "glossaries.badge.compatible": "Compatible", "glossaries.badge.otherTarget": "Autre cible", "glossaries.card.editTerms": "Modifier les termes", + "glossaries.card.created": "Créé", + "glossaries.card.term": "terme", "glossaries.card.delete": "Supprimer", "glossaries.grid.searchPlaceholder": "Rechercher un glossaire…", "glossaries.grid.noResults": "Aucun résultat pour cette recherche.", @@ -1668,6 +1831,10 @@ const messages: Record> = { "login.signIn": "Se connecter", "login.noAccount": "Pas encore de compte ?", "login.signUpFree": "Créer un compte gratuit", + "login.orContinueWith": "ou continuer avec l'e-mail", + "login.google.connecting": "Connexion…", + "login.google.errorGeneric": "Une erreur est survenue avec la connexion Google.", + "login.google.errorFailed": "La connexion Google a échoué. Veuillez réessayer.", "forgotPassword.enterEmail": "Veuillez entrer votre adresse email", "forgotPassword.error": "Une erreur s'est produite", "forgotPassword.title": "Mot de passe oublié", @@ -1975,6 +2142,7 @@ const messages: Record> = { "memento.ctaMore": "Voir plus", "common.backToHome": "Retour à l'accueil", "dashboard.topbar.interfaceLabel": "Interface de traduction", + "dashboard.topbar.premiumAccess": "Accès Premium", "landing.hero.contextEngine": "Traduction détectée : Terme technique de maintenance pour systèmes CVC...", "landing.hero.liveAnalysis": "Analyse en direct", "landing.hero.termsDetected": "termes détectés", @@ -1995,6 +2163,144 @@ const messages: Record> = { "landing.translate.aiAnalysis": "Analyse IA Active", "landing.translate.processing": "Traitement en cours", "landing.translate.preservingLayout": "Votre mise en page est en cours de préservation", + "layout.nav.apiAccess": "Accès API", + "layout.footer.terms": "CGU", + "layout.footer.privacy": "Confidentialité", + "fileUploader.uploadDocument": "Téléverser un document", + "fileUploader.uploadDesc": "Glissez-déposez ou cliquez pour sélectionner un fichier (Excel, Word, PowerPoint)", + "fileUploader.dropHere": "Déposez votre fichier ici…", + "fileUploader.dragAndDrop": "Glissez-déposez votre document ici", + "fileUploader.orClickBrowse": "ou cliquez pour parcourir", + "fileUploader.preview": "Aperçu", + "fileUploader.translationOptions": "Options de traduction", + "fileUploader.configureSettings": "Configurez vos paramètres de traduction", + "fileUploader.targetLanguage": "Langue cible", + "fileUploader.selectLanguage": "Sélectionner une langue", + "fileUploader.translationProvider": "Fournisseur de traduction", + "fileUploader.selectProvider": "Sélectionner un fournisseur", + "fileUploader.advancedOptions": "Options avancées", + "fileUploader.translateImages": "Traduire les images", + "fileUploader.translating": "Traduction…", + "fileUploader.translateDocument": "Traduire le document", + "fileUploader.processing": "Traitement…", + "fileUploader.translationError": "Erreur de traduction", + "fileUploader.translationComplete": "Traduction terminée !", + "fileUploader.translationCompleteDesc": "Votre document a été traduit avec succès tout en préservant la mise en forme.", + "fileUploader.download": "Télécharger le document traduit", + "fileUploader.webgpuUnsupported": "WebGPU n'est pas pris en charge dans ce navigateur. Veuillez utiliser Chrome 113+ ou Edge 113+.", + "fileUploader.webllmNotLoaded": "Modèle WebLLM non chargé. Allez dans Paramètres > Services de traduction pour charger un modèle.", + "fileUploader.extracting": "Extraction des textes du document…", + "fileUploader.noTranslatable": "Aucun texte traduisible trouvé dans le document", + "fileUploader.foundTexts": "{count} textes trouvés à traduire", + "fileUploader.translatingItem": "Traduction {current}/{total} : « {preview} »", + "fileUploader.reconstructing": "Reconstruction du document…", + "fileUploader.translatingLocally": "Traduction locale avec WebLLM…", + "checkout.activating": "Activation en cours…", + "checkout.activatingDesc": "Nous mettons à jour votre abonnement, veuillez patienter.", + "checkout.paymentConfirmed": "Paiement confirmé !", + "checkout.subscriptionActivated": "Abonnement activé !", + "checkout.planActivated": "Forfait {plan} activé !", + "checkout.redirectingToProfile": "Redirection vers votre profil…", + "checkout.paymentReceived": "Paiement reçu", + "checkout.redirecting": "Redirection…", + "checkout.syncError": "Erreur de synchronisation", + "checkout.networkError": "Erreur réseau. Votre paiement est confirmé — rechargez votre profil.", + "dashboard.checkoutSyncError": "Erreur lors de la synchronisation du paiement.", + "dashboard.networkRefresh": "Erreur réseau. Veuillez rafraîchir la page.", + "dashboard.continueToTranslate": "Continuer vers la traduction", + "langSelector.search": "Rechercher…", + "langSelector.noResults": "Aucun résultat", + "langSelector.source": "Source", + "langSelector.target": "Cible", + "langSelector.swap": "Inverser", + "translateComplete.highQuality": "Haute qualité", + "translateComplete.segments": "Segments", + "translateComplete.characters": "Caractères", + "translateComplete.confidence": "Confiance", + "providerTheme.deepseek.badge": "Essentielle", + "providerTheme.deepseek.subBadge": "Technique & Éco", + "providerTheme.deepseek.desc": "Traduction ultra-précise et économique, idéale pour les documents techniques et le code.", + "providerTheme.openai.badge": "Premium", + "providerTheme.openai.subBadge": "Haute Fidélité", + "providerTheme.openai.desc": "Le standard mondial de l'IA. Cohérence textuelle maximale et respect strict du style.", + "providerTheme.minimax.badge": "Avancée", + "providerTheme.minimax.subBadge": "Performance", + "providerTheme.minimax.desc": "Vitesse d'exécution incroyable et excellente compréhension des structures complexes.", + "providerTheme.openrouter.badge": "Express", + "providerTheme.openrouter.subBadge": "Multi-Modèles", + "providerTheme.openrouter.desc": "Accès unifié aux meilleurs modèles open-source optimisés pour la traduction.", + "providerTheme.openrouter_premium.badge": "Ultra", + "providerTheme.openrouter_premium.subBadge": "Maximum Context", + "providerTheme.openrouter_premium.desc": "Traduction assistée par les modèles de pointe (GPT-4o, Claude Sonnet 4.6) pour documents longs.", + "providerTheme.zai.badge": "Spécialisée", + "providerTheme.zai.subBadge": "Finance & Droit", + "providerTheme.zai.desc": "Modèle affiné pour les terminologies métiers exigeantes (juridique, finance).", + "providerTheme.default.badge": "Moderne", + "providerTheme.default.subBadge": "Raisonnement IA", + "providerTheme.default.desc": "Traduction par grand modèle linguistique (LLM) avec analyse sémantique avancée.", + "providerTheme.classic.google.label": "Google Traduction", + "providerTheme.classic.google.desc": "Traduction ultra-rapide couvrant plus de 130 langues. Recommandé pour les flux généraux.", + "providerTheme.classic.deepl.label": "DeepL Pro", + "providerTheme.classic.deepl.desc": "Traduction haute précision réputée pour sa fluidité et ses formulations naturelles.", + "providerTheme.classic.google_cloud.label": "Google Cloud API", + "providerTheme.classic.google_cloud.desc": "Moteur cloud professionnel optimisé pour le traitement de gros volumes de documents.", + "providerSelector.noClassic": "Aucun traducteur standard disponible.", + "providerSelector.noLlm": "Aucun modèle IA configuré.", + "providerSelector.costOne": "Coût : 1 crédit par page", + "providerSelector.costFive": "Coût : 5 crédits par page (Facteur Premium)", + "providerSelector.unlockContextual": "Débloquez la traduction contextuelle haut de gamme pour vos documents entiers.", + "translate.header.processing": "Traitement en cours", + "translate.header.aiActive": "Analyse IA active", + "translate.header.aiActiveDesc": "Votre mise en page est en cours de préservation par notre moteur contextuel.", + "translate.header.completed": "Complété", + "translate.header.completedTitle": "Traduction terminée", + "translate.header.proSpace": "Espace Pro", + "translate.header.translateDoc": "Traduire un document", + "translate.header.translateDocDesc": "Conservez la mise en page d'origine grâce au moteur de traduction ultra-haute fidélité.", + "translate.upload.nativeFormat": "Format natif", + "translate.fileType.word": "Word (.docx)", + "translate.fileType.excel": "Excel (.xlsx)", + "translate.fileType.slides": "Slides (.pptx)", + "translate.fileType.pdf": "PDF (.pdf)", + "translate.startTranslation": "Lancer la traduction", + "translate.submit": "Soumission…", + "translate.chooseTargetLang": "Veuillez choisir une langue cible", + "translate.pleaseLoadFile": "Veuillez charger un fichier d'abord", + "translate.contextEngineActive": "Moteur contextuel actif", + "translate.phase1": "Phase 1 : Initialisation", + "translate.phase2": "Phase 2 : Reconstruction contextuelle", + "translate.stat.segments": "segments", + "translate.stat.precision": "précision", + "translate.stat.speedLabel": "vitesse", + "translate.stat.turbo": "Turbo", + "translate.stat.time": "temps", + "translate.complete.masterQuality": "✓ Qualité Maître", + "translate.download": "Télécharger", + "translate.newTranslation": "+ Nouvelle traduction", + "translate.failedTitle": "Erreur lors de la traduction", + "translate.retry": "Réessayer", + "translate.uploadAnother": "Téléverser un autre fichier", + "translate.monitor": "Moniteur IA", + "translate.summary": "Récapitulatif", + "translate.cancelProcess": "⟳ Annuler le processus", + "translate.layoutIntegrity": "Intégrité Layout", + "translate.secureHundred": "100% SÉCURISÉ", + "translate.okHundred": "100% OK", + "translate.preserveLayout": "Conserver la mise en page", + "translate.preserveLayoutDesc": "Conserver la mise en page", + "translate.textOnly": "Texte brut", + "translate.textOnlyDesc": "Traduction rapide du texte uniquement", + "translate.unavailableStandard": "Indisponible en mode Standard (IA uniquement)", + "apiKeys.noKeysGenerated": "Aucune clé générée", + "apiKeys.copied": "Copié !", + "services.fallback.google.label": "Google Traduction", + "services.fallback.google.desc": "Traduction rapide, 130+ langues", + "settings.formats.excel.name": "Excel", + "settings.formats.word.name": "Word", + "settings.formats.powerpoint.name": "PowerPoint", + "pricing.dashboard": "Tableau de bord", + "pricing.okSymbol": "✓", + "pricing.errSymbol": "✕", }, // ═══════════════════════════════════════════════════════════════ // SPANISH (es) @@ -2182,6 +2488,7 @@ const messages: Record> = { "dashboard.translate.complete.download": "Descargar", "dashboard.translate.complete.newTranslation": "Nueva traducción", "dashboard.translate.complete.toastOkTitle": "Éxito", + "dashboard.translate.complete.toastOkDesc": "{name} se ha descargado correctamente.", "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", @@ -2210,6 +2517,8 @@ const messages: Record> = { "dashboard.translate.pipeline.translate": "Traducción", "dashboard.translate.pipeline.rebuild": "Reconstruir", "dashboard.translate.pipeline.finalize": "Finalizar", + "dashboard.translate.progress.processingFallback": "Procesando…", + "dashboard.translate.progress.connectionLost": "Conexión perdida. Reintentando…", "dashboard.translate.progress.failedTitle": "Traducción fallida", "dashboard.translate.error.unexpected": "Ocurrió un error inesperado. Inténtelo de nuevo.", "dashboard.translate.error.noResult": "La traducción no produjo resultados. Verifique que el documento contenga texto e intente de nuevo o elija otro motor.", @@ -2274,6 +2583,8 @@ const messages: Record> = { "glossaries.dialog.dropTitle": "Arrastra un archivo CSV aquí", "glossaries.dialog.dropOr": "o", "glossaries.dialog.dropFormats": "CSV, TSV, TXT", + "glossaries.termEditor.addTerm": "Añadir término", + "glossaries.termEditor.maxReached": "Se ha alcanzado el máximo de {max} términos por glosario.", "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", @@ -2369,6 +2680,8 @@ const messages: Record> = { "glossaries.badge.compatible": "Compatible", "glossaries.badge.otherTarget": "Autre cible", "glossaries.card.editTerms": "Modifier les termes", + "glossaries.card.created": "Creado", + "glossaries.card.term": "término", "glossaries.card.delete": "Supprimer", "glossaries.grid.searchPlaceholder": "Search a glossary…", "glossaries.grid.noResults": "No results for this search.", @@ -2611,6 +2924,10 @@ const messages: Record> = { "login.signIn": "Sign In", "login.noAccount": "Don't have an account?", "login.signUpFree": "Sign up for free", + "login.orContinueWith": "o continuar con correo electrónico", + "login.google.connecting": "Conectando…", + "login.google.errorGeneric": "Se ha producido un error con el inicio de sesión de Google.", + "login.google.errorFailed": "Error al iniciar sesión con Google. Inténtalo de nuevo.", "forgotPassword.enterEmail": "Please enter your email address", "forgotPassword.error": "An error occurred", "forgotPassword.title": "Forgot Password", @@ -2904,6 +3221,7 @@ const messages: Record> = { "memento.ctaMore": "Saber más", "common.backToHome": "Volver al inicio", "dashboard.topbar.interfaceLabel": "Interfaz de traducción", + "dashboard.topbar.premiumAccess": "Acceso Premium", "landing.hero.contextEngine": "Traducción detectada: Término técnico de mantenimiento para sistemas HVAC...", "landing.hero.liveAnalysis": "Análisis en vivo", "landing.hero.termsDetected": "términos detectados", @@ -2924,6 +3242,144 @@ const messages: Record> = { "landing.translate.aiAnalysis": "Análisis IA Activo", "landing.translate.processing": "Procesando", "landing.translate.preservingLayout": "Tu diseño se está preservando", + "layout.nav.apiAccess": "Acceso API", + "layout.footer.terms": "Términos", + "layout.footer.privacy": "Privacidad", + "fileUploader.uploadDocument": "Subir documento", + "fileUploader.uploadDesc": "Arrastre y suelte o haga clic para seleccionar un archivo (Excel, Word, PowerPoint)", + "fileUploader.dropHere": "Suelta tu archivo aquí…", + "fileUploader.dragAndDrop": "Arrastra y suelta tu documento aquí", + "fileUploader.orClickBrowse": "o haz clic para examinar", + "fileUploader.preview": "Vista previa", + "fileUploader.translationOptions": "Opciones de traducción", + "fileUploader.configureSettings": "Configura los ajustes de traducción", + "fileUploader.targetLanguage": "Idioma de destino", + "fileUploader.selectLanguage": "Seleccionar idioma", + "fileUploader.translationProvider": "Proveedor de traducción", + "fileUploader.selectProvider": "Seleccionar proveedor", + "fileUploader.advancedOptions": "Opciones avanzadas", + "fileUploader.translateImages": "Traducir imágenes", + "fileUploader.translating": "Traduciendo…", + "fileUploader.translateDocument": "Traducir documento", + "fileUploader.processing": "Procesando…", + "fileUploader.translationError": "Error de traducción", + "fileUploader.translationComplete": "¡Traducción completa!", + "fileUploader.translationCompleteDesc": "Su documento se ha traducido correctamente conservando todo el formato.", + "fileUploader.download": "Descargar documento traducido", + "fileUploader.webgpuUnsupported": "WebGPU no es compatible con este navegador. Use Chrome 113+ o Edge 113+.", + "fileUploader.webllmNotLoaded": "Modelo WebLLM no cargado. Vaya a Configuración > Servicios de traducción para cargar un modelo.", + "fileUploader.extracting": "Extrayendo textos del documento…", + "fileUploader.noTranslatable": "No se encontró texto traducible en el documento", + "fileUploader.foundTexts": "Se encontraron {count} textos para traducir", + "fileUploader.translatingItem": "Traduciendo {current}/{total}: «{preview}»", + "fileUploader.reconstructing": "Reconstruyendo documento…", + "fileUploader.translatingLocally": "Traduciendo localmente con WebLLM…", + "checkout.activating": "Activando…", + "checkout.activatingDesc": "Estamos actualizando su suscripción, espere.", + "checkout.paymentConfirmed": "¡Pago confirmado!", + "checkout.subscriptionActivated": "¡Suscripción activada!", + "checkout.planActivated": "¡Plan {plan} activado!", + "checkout.redirectingToProfile": "Redirigiendo a su perfil…", + "checkout.paymentReceived": "Pago recibido", + "checkout.redirecting": "Redirigiendo…", + "checkout.syncError": "Error de sincronización", + "checkout.networkError": "Error de red. Su pago está confirmado — recargue su perfil.", + "dashboard.checkoutSyncError": "Error al sincronizar el pago.", + "dashboard.networkRefresh": "Error de red. Por favor, actualice la página.", + "dashboard.continueToTranslate": "Continuar a la traducción", + "langSelector.search": "Buscar…", + "langSelector.noResults": "Sin resultados", + "langSelector.source": "Origen", + "langSelector.target": "Destino", + "langSelector.swap": "Intercambiar", + "translateComplete.highQuality": "Alta calidad", + "translateComplete.segments": "Segmentos", + "translateComplete.characters": "Caracteres", + "translateComplete.confidence": "Confianza", + "providerTheme.deepseek.badge": "Esencial", + "providerTheme.deepseek.subBadge": "Técnico y económico", + "providerTheme.deepseek.desc": "Traducción ultraprecisa y económica, ideal para documentos técnicos y código.", + "providerTheme.openai.badge": "Premium", + "providerTheme.openai.subBadge": "Alta fidelidad", + "providerTheme.openai.desc": "El estándar global de IA. Máxima coherencia textual y respeto estricto del estilo.", + "providerTheme.minimax.badge": "Avanzada", + "providerTheme.minimax.subBadge": "Rendimiento", + "providerTheme.minimax.desc": "Velocidad de ejecución increíble y excelente comprensión de estructuras complejas.", + "providerTheme.openrouter.badge": "Exprés", + "providerTheme.openrouter.subBadge": "Multi-modelo", + "providerTheme.openrouter.desc": "Acceso unificado a los mejores modelos de código abierto optimizados para traducción.", + "providerTheme.openrouter_premium.badge": "Ultra", + "providerTheme.openrouter_premium.subBadge": "Contexto máximo", + "providerTheme.openrouter_premium.desc": "Asistido por modelos de última generación (GPT-4o, Claude Sonnet 4.6) para documentos largos.", + "providerTheme.zai.badge": "Especializada", + "providerTheme.zai.subBadge": "Finanzas y Derecho", + "providerTheme.zai.desc": "Modelo ajustado para terminologías empresariales exigentes (legal, finanzas).", + "providerTheme.default.badge": "Moderno", + "providerTheme.default.subBadge": "Razonamiento IA", + "providerTheme.default.desc": "Traducción por modelo de lenguaje grande (LLM) con análisis semántico avanzado.", + "providerTheme.classic.google.label": "Google Traductor", + "providerTheme.classic.google.desc": "Traducción ultrarrápida que cubre más de 130 idiomas. Recomendado para flujos generales.", + "providerTheme.classic.deepl.label": "DeepL Pro", + "providerTheme.classic.deepl.desc": "Traducción de alta precisión conocida por su fluidez y formulaciones naturales.", + "providerTheme.classic.google_cloud.label": "Google Cloud API", + "providerTheme.classic.google_cloud.desc": "Motor en la nube profesional optimizado para procesar grandes volúmenes de documentos.", + "providerSelector.noClassic": "No hay traductor estándar disponible.", + "providerSelector.noLlm": "Ningún modelo de IA configurado.", + "providerSelector.costOne": "Costo: 1 crédito por página", + "providerSelector.costFive": "Costo: 5 créditos por página (Factor Premium)", + "providerSelector.unlockContextual": "Desbloquee la traducción contextual premium para sus documentos completos.", + "translate.header.processing": "Procesamiento en curso", + "translate.header.aiActive": "Análisis IA activo", + "translate.header.aiActiveDesc": "Su diseño se está preservando por nuestro motor contextual.", + "translate.header.completed": "Completado", + "translate.header.completedTitle": "Traducción completada", + "translate.header.proSpace": "Espacio Pro", + "translate.header.translateDoc": "Traducir un documento", + "translate.header.translateDocDesc": "Conserve el diseño original con nuestro motor de traducción de ultra alta fidelidad.", + "translate.upload.nativeFormat": "Formato nativo", + "translate.fileType.word": "Word (.docx)", + "translate.fileType.excel": "Excel (.xlsx)", + "translate.fileType.slides": "Diapositivas (.pptx)", + "translate.fileType.pdf": "PDF (.pdf)", + "translate.startTranslation": "Iniciar traducción", + "translate.submit": "Enviando…", + "translate.chooseTargetLang": "Por favor, elija un idioma de destino", + "translate.pleaseLoadFile": "Por favor, suba un archivo primero", + "translate.contextEngineActive": "Motor contextual activo", + "translate.phase1": "Fase 1: Inicialización", + "translate.phase2": "Fase 2: Reconstrucción contextual", + "translate.stat.segments": "segmentos", + "translate.stat.precision": "precisión", + "translate.stat.speedLabel": "velocidad", + "translate.stat.turbo": "Turbo", + "translate.stat.time": "tiempo", + "translate.complete.masterQuality": "✓ Calidad maestra", + "translate.download": "Descargar", + "translate.newTranslation": "+ Nueva traducción", + "translate.failedTitle": "Error de traducción", + "translate.retry": "Reintentar", + "translate.uploadAnother": "Subir otro archivo", + "translate.monitor": "Monitor IA", + "translate.summary": "Resumen", + "translate.cancelProcess": "⟳ Cancelar el proceso", + "translate.layoutIntegrity": "Integridad del diseño", + "translate.secureHundred": "100% SEGURO", + "translate.okHundred": "100% OK", + "translate.preserveLayout": "Conservar diseño", + "translate.preserveLayoutDesc": "Conservar el diseño", + "translate.textOnly": "Solo texto", + "translate.textOnlyDesc": "Traducción rápida solo de texto", + "translate.unavailableStandard": "No disponible en modo Estándar (solo IA)", + "apiKeys.noKeysGenerated": "No hay claves generadas", + "apiKeys.copied": "¡Copiado!", + "services.fallback.google.label": "Google Traductor", + "services.fallback.google.desc": "Traducción rápida, más de 130 idiomas", + "settings.formats.excel.name": "Excel", + "settings.formats.word.name": "Word", + "settings.formats.powerpoint.name": "PowerPoint", + "pricing.dashboard": "Panel", + "pricing.okSymbol": "✓", + "pricing.errSymbol": "✕", }, // ═══════════════════════════════════════════════════════════════ // GERMAN (de) @@ -3111,6 +3567,7 @@ const messages: Record> = { "dashboard.translate.complete.download": "Herunterladen", "dashboard.translate.complete.newTranslation": "Neue Übersetzung", "dashboard.translate.complete.toastOkTitle": "Erfolgreich", + "dashboard.translate.complete.toastOkDesc": "{name} wurde erfolgreich heruntergeladen.", "dashboard.translate.complete.toastFailTitle": "Fehlgeschlagen", "dashboard.translate.complete.toastFailDesc": "Übersetzung fehlgeschlagen. Bitte versuchen Sie es erneut.", "dashboard.translate.sourceDocument": "Quelldokument", @@ -3139,6 +3596,8 @@ const messages: Record> = { "dashboard.translate.pipeline.translate": "Übersetzung", "dashboard.translate.pipeline.rebuild": "Rekonstruieren", "dashboard.translate.pipeline.finalize": "Finalisieren", + "dashboard.translate.progress.processingFallback": "Verarbeitung läuft…", + "dashboard.translate.progress.connectionLost": "Verbindung verloren. Erneut versuchen…", "dashboard.translate.progress.failedTitle": "Übersetzung fehlgeschlagen", "dashboard.translate.error.unexpected": "Ein unerwarteter Fehler ist aufgetreten. Bitte versuchen Sie es erneut.", "dashboard.translate.error.noResult": "Die Übersetzung hat keine Ergebnisse geliefert. Stellen Sie sicher, dass das Dokument Text enthält, und versuchen Sie es erneut oder wählen Sie eine andere Engine.", @@ -3203,6 +3662,8 @@ const messages: Record> = { "glossaries.dialog.dropTitle": "CSV-Datei hierher ziehen", "glossaries.dialog.dropOr": "oder", "glossaries.dialog.dropFormats": "CSV, TSV, TXT", + "glossaries.termEditor.addTerm": "Begriff hinzufügen", + "glossaries.termEditor.maxReached": "Maximal {max} Begriffe pro Glossar erreicht.", "glossaries.dialog.formatTitle": "Format", "glossaries.dialog.formatDesc": "Quelle,Ziel (eine pro Zeile)", "glossaries.dialog.formatNote": "Erste Zeile wird bei erkanntem Header übersprungen", @@ -3298,6 +3759,8 @@ const messages: Record> = { "glossaries.badge.compatible": "Compatible", "glossaries.badge.otherTarget": "Autre cible", "glossaries.card.editTerms": "Modifier les termes", + "glossaries.card.created": "Erstellt", + "glossaries.card.term": "Begriff", "glossaries.card.delete": "Supprimer", "glossaries.grid.searchPlaceholder": "Search a glossary…", "glossaries.grid.noResults": "No results for this search.", @@ -3540,6 +4003,10 @@ const messages: Record> = { "login.signIn": "Sign In", "login.noAccount": "Don't have an account?", "login.signUpFree": "Sign up for free", + "login.orContinueWith": "oder mit E-Mail fortfahren", + "login.google.connecting": "Verbinden…", + "login.google.errorGeneric": "Bei der Google-Anmeldung ist ein Fehler aufgetreten.", + "login.google.errorFailed": "Google-Anmeldung fehlgeschlagen. Bitte erneut versuchen.", "forgotPassword.enterEmail": "Please enter your email address", "forgotPassword.error": "An error occurred", "forgotPassword.title": "Forgot Password", @@ -3833,6 +4300,7 @@ const messages: Record> = { "memento.ctaMore": "Mehr erfahren", "common.backToHome": "Zurück zur Startseite", "dashboard.topbar.interfaceLabel": "Übersetzungsoberfläche", + "dashboard.topbar.premiumAccess": "Premium-Zugang", "landing.hero.contextEngine": "Übersetzung erkannt: Technischer Wartungsbegriff für HVAC-Systeme...", "landing.hero.liveAnalysis": "Live-Analyse", "landing.hero.termsDetected": "Begriffe erkannt", @@ -3853,6 +4321,144 @@ const messages: Record> = { "landing.translate.aiAnalysis": "KI-Analyse aktiv", "landing.translate.processing": "Verarbeitung läuft", "landing.translate.preservingLayout": "Ihr Layout wird beibehalten", + "layout.nav.apiAccess": "API-Zugang", + "layout.footer.terms": "AGB", + "layout.footer.privacy": "Datenschutz", + "fileUploader.uploadDocument": "Dokument hochladen", + "fileUploader.uploadDesc": "Datei per Drag & Drop ablegen oder klicken (Excel, Word, PowerPoint)", + "fileUploader.dropHere": "Datei hier ablegen…", + "fileUploader.dragAndDrop": "Dokument hierher ziehen", + "fileUploader.orClickBrowse": "oder klicken Sie zum Durchsuchen", + "fileUploader.preview": "Vorschau", + "fileUploader.translationOptions": "Übersetzungsoptionen", + "fileUploader.configureSettings": "Übersetzungseinstellungen anpassen", + "fileUploader.targetLanguage": "Zielsprache", + "fileUploader.selectLanguage": "Sprache wählen", + "fileUploader.translationProvider": "Übersetzungsanbieter", + "fileUploader.selectProvider": "Anbieter wählen", + "fileUploader.advancedOptions": "Erweiterte Optionen", + "fileUploader.translateImages": "Bilder übersetzen", + "fileUploader.translating": "Übersetzung läuft…", + "fileUploader.translateDocument": "Dokument übersetzen", + "fileUploader.processing": "Verarbeitung…", + "fileUploader.translationError": "Übersetzungsfehler", + "fileUploader.translationComplete": "Übersetzung abgeschlossen!", + "fileUploader.translationCompleteDesc": "Ihr Dokument wurde erfolgreich übersetzt und die Formatierung beibehalten.", + "fileUploader.download": "Übersetztes Dokument herunterladen", + "fileUploader.webgpuUnsupported": "WebGPU wird in diesem Browser nicht unterstützt. Bitte verwenden Sie Chrome 113+ oder Edge 113+.", + "fileUploader.webllmNotLoaded": "WebLLM-Modell nicht geladen. Gehen Sie zu Einstellungen > Übersetzungsdienste, um ein Modell zu laden.", + "fileUploader.extracting": "Texte aus Dokument extrahieren…", + "fileUploader.noTranslatable": "Kein übersetzbarer Text im Dokument gefunden", + "fileUploader.foundTexts": "{count} zu übersetzende Texte gefunden", + "fileUploader.translatingItem": "Übersetze {current}/{total}: „{preview}\"", + "fileUploader.reconstructing": "Dokument wird rekonstruiert…", + "fileUploader.translatingLocally": "Lokale Übersetzung mit WebLLM…", + "checkout.activating": "Wird aktiviert…", + "checkout.activatingDesc": "Wir aktualisieren Ihr Abonnement, bitte warten Sie.", + "checkout.paymentConfirmed": "Zahlung bestätigt!", + "checkout.subscriptionActivated": "Abonnement aktiviert!", + "checkout.planActivated": "{plan}-Plan aktiviert!", + "checkout.redirectingToProfile": "Weiterleitung zu Ihrem Profil…", + "checkout.paymentReceived": "Zahlung erhalten", + "checkout.redirecting": "Weiterleitung…", + "checkout.syncError": "Synchronisierungsfehler", + "checkout.networkError": "Netzwerkfehler. Ihre Zahlung ist bestätigt — bitte laden Sie Ihr Profil neu.", + "dashboard.checkoutSyncError": "Fehler beim Synchronisieren der Zahlung.", + "dashboard.networkRefresh": "Netzwerkfehler. Bitte aktualisieren Sie die Seite.", + "dashboard.continueToTranslate": "Weiter zur Übersetzung", + "langSelector.search": "Suchen…", + "langSelector.noResults": "Keine Ergebnisse", + "langSelector.source": "Quelle", + "langSelector.target": "Ziel", + "langSelector.swap": "Tauschen", + "translateComplete.highQuality": "Hohe Qualität", + "translateComplete.segments": "Segmente", + "translateComplete.characters": "Zeichen", + "translateComplete.confidence": "Vertrauen", + "providerTheme.deepseek.badge": "Essenziell", + "providerTheme.deepseek.subBadge": "Technisch & Sparsam", + "providerTheme.deepseek.desc": "Ultrapräzise und wirtschaftliche Übersetzung, ideal für technische Dokumente und Code.", + "providerTheme.openai.badge": "Premium", + "providerTheme.openai.subBadge": "Hohe Treue", + "providerTheme.openai.desc": "Der globale KI-Standard. Maximale Textkonsistenz und strenge Stileinhaltung.", + "providerTheme.minimax.badge": "Erweitert", + "providerTheme.minimax.subBadge": "Leistung", + "providerTheme.minimax.desc": "Unglaubliche Ausführungsgeschwindigkeit und ausgezeichnetes Verständnis komplexer Strukturen.", + "providerTheme.openrouter.badge": "Express", + "providerTheme.openrouter.subBadge": "Multi-Modell", + "providerTheme.openrouter.desc": "Einheitlicher Zugriff auf die besten Open-Source-Modelle, optimiert für Übersetzung.", + "providerTheme.openrouter_premium.badge": "Ultra", + "providerTheme.openrouter_premium.subBadge": "Maximaler Kontext", + "providerTheme.openrouter_premium.desc": "Unterstützt durch modernste Modelle (GPT-4o, Claude Sonnet 4.6) für lange Dokumente.", + "providerTheme.zai.badge": "Spezialisiert", + "providerTheme.zai.subBadge": "Finanzen & Recht", + "providerTheme.zai.desc": "Modell feinabgestimmt auf anspruchsvolle Geschäftsterminologien (Recht, Finanzen).", + "providerTheme.default.badge": "Modern", + "providerTheme.default.subBadge": "KI-Argumentation", + "providerTheme.default.desc": "Großsprachmodell-Übersetzung (LLM) mit fortgeschrittener semantischer Analyse.", + "providerTheme.classic.google.label": "Google Übersetzer", + "providerTheme.classic.google.desc": "Ultraschnelle Übersetzung für über 130 Sprachen. Empfohlen für allgemeine Abläufe.", + "providerTheme.classic.deepl.label": "DeepL Pro", + "providerTheme.classic.deepl.desc": "Hochpräzise Übersetzung, bekannt für Flüssigkeit und natürliche Formulierungen.", + "providerTheme.classic.google_cloud.label": "Google Cloud API", + "providerTheme.classic.google_cloud.desc": "Professionelle Cloud-Engine, optimiert für die Verarbeitung großer Dokumentenmengen.", + "providerSelector.noClassic": "Kein Standard-Übersetzer verfügbar.", + "providerSelector.noLlm": "Kein KI-Modell konfiguriert.", + "providerSelector.costOne": "Kosten: 1 Guthaben pro Seite", + "providerSelector.costFive": "Kosten: 5 Guthaben pro Seite (Premium-Faktor)", + "providerSelector.unlockContextual": "Premium-Kontextübersetzung für Ihre gesamten Dokumente freischalten.", + "translate.header.processing": "Verarbeitung läuft", + "translate.header.aiActive": "KI-Analyse aktiv", + "translate.header.aiActiveDesc": "Ihr Layout wird von unserer kontextuellen Engine beibehalten.", + "translate.header.completed": "Abgeschlossen", + "translate.header.completedTitle": "Übersetzung abgeschlossen", + "translate.header.proSpace": "Pro-Bereich", + "translate.header.translateDoc": "Dokument übersetzen", + "translate.header.translateDocDesc": "Behalten Sie das Originallayout mit unserer Ultra-High-Fidelity-Übersetzungs-Engine.", + "translate.upload.nativeFormat": "Natives Format", + "translate.fileType.word": "Word (.docx)", + "translate.fileType.excel": "Excel (.xlsx)", + "translate.fileType.slides": "Folien (.pptx)", + "translate.fileType.pdf": "PDF (.pdf)", + "translate.startTranslation": "Übersetzung starten", + "translate.submit": "Wird gesendet…", + "translate.chooseTargetLang": "Bitte wählen Sie eine Zielsprache", + "translate.pleaseLoadFile": "Bitte laden Sie zuerst eine Datei hoch", + "translate.contextEngineActive": "Kontextuelle Engine aktiv", + "translate.phase1": "Phase 1: Initialisierung", + "translate.phase2": "Phase 2: Kontextuelle Rekonstruktion", + "translate.stat.segments": "Segmente", + "translate.stat.precision": "Genauigkeit", + "translate.stat.speedLabel": "Geschwindigkeit", + "translate.stat.turbo": "Turbo", + "translate.stat.time": "Zeit", + "translate.complete.masterQuality": "✓ Meister-Qualität", + "translate.download": "Herunterladen", + "translate.newTranslation": "+ Neue Übersetzung", + "translate.failedTitle": "Übersetzungsfehler", + "translate.retry": "Erneut versuchen", + "translate.uploadAnother": "Andere Datei hochladen", + "translate.monitor": "KI-Monitor", + "translate.summary": "Zusammenfassung", + "translate.cancelProcess": "⟳ Prozess abbrechen", + "translate.layoutIntegrity": "Layout-Integrität", + "translate.secureHundred": "100% SICHER", + "translate.okHundred": "100% OK", + "translate.preserveLayout": "Layout beibehalten", + "translate.preserveLayoutDesc": "Layout beibehalten", + "translate.textOnly": "Nur Text", + "translate.textOnlyDesc": "Schnelle Übersetzung nur des Textes", + "translate.unavailableStandard": "Im Standardmodus nicht verfügbar (nur KI)", + "apiKeys.noKeysGenerated": "Keine Schlüssel generiert", + "apiKeys.copied": "Kopiert!", + "services.fallback.google.label": "Google Übersetzer", + "services.fallback.google.desc": "Schnelle Übersetzung, über 130 Sprachen", + "settings.formats.excel.name": "Excel", + "settings.formats.word.name": "Word", + "settings.formats.powerpoint.name": "PowerPoint", + "pricing.dashboard": "Dashboard", + "pricing.okSymbol": "✓", + "pricing.errSymbol": "✕", }, // ═══════════════════════════════════════════════════════════════ // PORTUGUESE – BRAZILIAN (pt) @@ -4040,6 +4646,7 @@ const messages: Record> = { "dashboard.translate.complete.download": "Baixar", "dashboard.translate.complete.newTranslation": "Nova tradução", "dashboard.translate.complete.toastOkTitle": "Sucesso", + "dashboard.translate.complete.toastOkDesc": "{name} foi baixado com sucesso.", "dashboard.translate.complete.toastFailTitle": "Falha", "dashboard.translate.complete.toastFailDesc": "A tradução falhou. Por favor, tente novamente.", "dashboard.translate.sourceDocument": "Documento fonte", @@ -4068,6 +4675,8 @@ const messages: Record> = { "dashboard.translate.pipeline.translate": "Tradução", "dashboard.translate.pipeline.rebuild": "Reconstruir", "dashboard.translate.pipeline.finalize": "Finalizar", + "dashboard.translate.progress.processingFallback": "A processar…", + "dashboard.translate.progress.connectionLost": "Conexão perdida. A tentar novamente…", "dashboard.translate.progress.failedTitle": "Tradução falhou", "dashboard.translate.error.unexpected": "Ocorreu um erro inesperado. Tente novamente.", "dashboard.translate.error.noResult": "A tradução não produziu resultados. Verifique se o documento contém texto e tente novamente ou escolha outro motor.", @@ -4132,6 +4741,8 @@ const messages: Record> = { "glossaries.dialog.dropTitle": "Arraste um arquivo CSV aqui", "glossaries.dialog.dropOr": "ou", "glossaries.dialog.dropFormats": "CSV, TSV, TXT", + "glossaries.termEditor.addTerm": "Adicionar termo", + "glossaries.termEditor.maxReached": "Máximo de {max} termos por glossário atingido.", "glossaries.dialog.formatTitle": "Formato", "glossaries.dialog.formatDesc": "origem,destino (um por linha)", "glossaries.dialog.formatNote": "Primeira linha ignorada se houver cabeçalho", @@ -4227,6 +4838,8 @@ const messages: Record> = { "glossaries.badge.compatible": "Compatible", "glossaries.badge.otherTarget": "Autre cible", "glossaries.card.editTerms": "Modifier les termes", + "glossaries.card.created": "Criado", + "glossaries.card.term": "termo", "glossaries.card.delete": "Supprimer", "glossaries.grid.searchPlaceholder": "Search a glossary…", "glossaries.grid.noResults": "No results for this search.", @@ -4469,6 +5082,10 @@ const messages: Record> = { "login.signIn": "Sign In", "login.noAccount": "Don't have an account?", "login.signUpFree": "Sign up for free", + "login.orContinueWith": "ou continuar com e-mail", + "login.google.connecting": "A ligar…", + "login.google.errorGeneric": "Ocorreu um erro no início de sessão com Google.", + "login.google.errorFailed": "Falha no início de sessão com Google. Tente novamente.", "forgotPassword.enterEmail": "Please enter your email address", "forgotPassword.error": "An error occurred", "forgotPassword.title": "Forgot Password", @@ -4762,6 +5379,7 @@ const messages: Record> = { "memento.ctaMore": "Saiba mais", "common.backToHome": "Voltar ao início", "dashboard.topbar.interfaceLabel": "Interface de tradução", + "dashboard.topbar.premiumAccess": "Acesso Premium", "landing.hero.contextEngine": "Tradução detectada: Termo técnico de manutenção para sistemas HVAC...", "landing.hero.liveAnalysis": "Análise em tempo real", "landing.hero.termsDetected": "termos detectados", @@ -4782,6 +5400,144 @@ const messages: Record> = { "landing.translate.aiAnalysis": "Análise IA Ativa", "landing.translate.processing": "Em processamento", "landing.translate.preservingLayout": "O seu layout está a ser preservado", + "layout.nav.apiAccess": "Acesso à API", + "layout.footer.terms": "Termos", + "layout.footer.privacy": "Privacidade", + "fileUploader.uploadDocument": "Carregar documento", + "fileUploader.uploadDesc": "Arraste e solte ou clique para selecionar um ficheiro (Excel, Word, PowerPoint)", + "fileUploader.dropHere": "Solte o ficheiro aqui…", + "fileUploader.dragAndDrop": "Arraste e solte o documento aqui", + "fileUploader.orClickBrowse": "ou clique para procurar", + "fileUploader.preview": "Pré-visualização", + "fileUploader.translationOptions": "Opções de tradução", + "fileUploader.configureSettings": "Configure as suas definições de tradução", + "fileUploader.targetLanguage": "Idioma de destino", + "fileUploader.selectLanguage": "Selecionar idioma", + "fileUploader.translationProvider": "Provedor de tradução", + "fileUploader.selectProvider": "Selecionar fornecedor", + "fileUploader.advancedOptions": "Opções avançadas", + "fileUploader.translateImages": "Traduzir imagens", + "fileUploader.translating": "A traduzir…", + "fileUploader.translateDocument": "Traduzir documento", + "fileUploader.processing": "A processar…", + "fileUploader.translationError": "Erro de tradução", + "fileUploader.translationComplete": "Tradução concluída!", + "fileUploader.translationCompleteDesc": "O seu documento foi traduzido com sucesso mantendo toda a formatação.", + "fileUploader.download": "Baixar documento traduzido", + "fileUploader.webgpuUnsupported": "WebGPU não é suportado neste navegador. Use Chrome 113+ ou Edge 113+.", + "fileUploader.webllmNotLoaded": "Modelo WebLLM não carregado. Vá a Definições > Serviços de tradução para carregar um modelo.", + "fileUploader.extracting": "A extrair textos do documento…", + "fileUploader.noTranslatable": "Nenhum texto traduzível encontrado no documento", + "fileUploader.foundTexts": "Encontrados {count} textos para traduzir", + "fileUploader.translatingItem": "A traduzir {current}/{total}: «{preview}»", + "fileUploader.reconstructing": "A reconstruir o documento…", + "fileUploader.translatingLocally": "A traduzir localmente com WebLLM…", + "checkout.activating": "A ativar…", + "checkout.activatingDesc": "Estamos a atualizar a sua assinatura, aguarde.", + "checkout.paymentConfirmed": "Pagamento confirmado!", + "checkout.subscriptionActivated": "Assinatura ativada!", + "checkout.planActivated": "Plano {plan} ativado!", + "checkout.redirectingToProfile": "A redirecionar para o seu perfil…", + "checkout.paymentReceived": "Pagamento recebido", + "checkout.redirecting": "A redirecionar…", + "checkout.syncError": "Erro de sincronização", + "checkout.networkError": "Erro de rede. O seu pagamento está confirmado — recarregue o seu perfil.", + "dashboard.checkoutSyncError": "Erro ao sincronizar o pagamento.", + "dashboard.networkRefresh": "Erro de rede. Atualize a página.", + "dashboard.continueToTranslate": "Continuar para a tradução", + "langSelector.search": "Pesquisar…", + "langSelector.noResults": "Sem resultados", + "langSelector.source": "Origem", + "langSelector.target": "Destino", + "langSelector.swap": "Trocar", + "translateComplete.highQuality": "Alta qualidade", + "translateComplete.segments": "Segmentos", + "translateComplete.characters": "Caracteres", + "translateComplete.confidence": "Confiança", + "providerTheme.deepseek.badge": "Essencial", + "providerTheme.deepseek.subBadge": "Técnico e económico", + "providerTheme.deepseek.desc": "Tradução ultra-precisa e económica, ideal para documentos técnicos e código.", + "providerTheme.openai.badge": "Premium", + "providerTheme.openai.subBadge": "Alta fidelidade", + "providerTheme.openai.desc": "O padrão global de IA. Máxima consistência textual e respeito estrito do estilo.", + "providerTheme.minimax.badge": "Avançada", + "providerTheme.minimax.subBadge": "Desempenho", + "providerTheme.minimax.desc": "Velocidade de execução incrível e excelente compreensão de estruturas complexas.", + "providerTheme.openrouter.badge": "Expresso", + "providerTheme.openrouter.subBadge": "Multi-modelo", + "providerTheme.openrouter.desc": "Acesso unificado aos melhores modelos open-source otimizados para tradução.", + "providerTheme.openrouter_premium.badge": "Ultra", + "providerTheme.openrouter_premium.subBadge": "Contexto máximo", + "providerTheme.openrouter_premium.desc": "Assistido pelos modelos mais avançados (GPT-4o, Claude Sonnet 4.6) para documentos longos.", + "providerTheme.zai.badge": "Especializada", + "providerTheme.zai.subBadge": "Finanças e Direito", + "providerTheme.zai.desc": "Modelo afinado para terminologias empresariais exigentes (jurídico, financeiro).", + "providerTheme.default.badge": "Moderno", + "providerTheme.default.subBadge": "Raciocínio IA", + "providerTheme.default.desc": "Tradução por modelo de linguagem grande (LLM) com análise semântica avançada.", + "providerTheme.classic.google.label": "Google Tradutor", + "providerTheme.classic.google.desc": "Tradução ultra-rápida cobrindo mais de 130 idiomas. Recomendado para fluxos gerais.", + "providerTheme.classic.deepl.label": "DeepL Pro", + "providerTheme.classic.deepl.desc": "Tradução de alta precisão conhecida pela sua fluência e formulações naturais.", + "providerTheme.classic.google_cloud.label": "Google Cloud API", + "providerTheme.classic.google_cloud.desc": "Motor cloud profissional otimizado para processar grandes volumes de documentos.", + "providerSelector.noClassic": "Nenhum tradutor padrão disponível.", + "providerSelector.noLlm": "Nenhum modelo de IA configurado.", + "providerSelector.costOne": "Custo: 1 crédito por página", + "providerSelector.costFive": "Custo: 5 créditos por página (Fator Premium)", + "providerSelector.unlockContextual": "Desbloqueie a tradução contextual premium para os seus documentos completos.", + "translate.header.processing": "Processamento em curso", + "translate.header.aiActive": "Análise IA ativa", + "translate.header.aiActiveDesc": "O seu layout está a ser preservado pelo nosso motor contextual.", + "translate.header.completed": "Concluído", + "translate.header.completedTitle": "Tradução concluída", + "translate.header.proSpace": "Espaço Pro", + "translate.header.translateDoc": "Traduzir um documento", + "translate.header.translateDocDesc": "Mantenha o layout original com o nosso motor de tradução de ultra-alta fidelidade.", + "translate.upload.nativeFormat": "Formato nativo", + "translate.fileType.word": "Word (.docx)", + "translate.fileType.excel": "Excel (.xlsx)", + "translate.fileType.slides": "Slides (.pptx)", + "translate.fileType.pdf": "PDF (.pdf)", + "translate.startTranslation": "Iniciar tradução", + "translate.submit": "A enviar…", + "translate.chooseTargetLang": "Por favor, escolha um idioma de destino", + "translate.pleaseLoadFile": "Por favor, carregue um ficheiro primeiro", + "translate.contextEngineActive": "Motor contextual ativo", + "translate.phase1": "Fase 1: Inicialização", + "translate.phase2": "Fase 2: Reconstrução contextual", + "translate.stat.segments": "segmentos", + "translate.stat.precision": "precisão", + "translate.stat.speedLabel": "velocidade", + "translate.stat.turbo": "Turbo", + "translate.stat.time": "tempo", + "translate.complete.masterQuality": "✓ Qualidade mestre", + "translate.download": "Baixar", + "translate.newTranslation": "+ Nova tradução", + "translate.failedTitle": "Erro de tradução", + "translate.retry": "Tentar novamente", + "translate.uploadAnother": "Carregar outro ficheiro", + "translate.monitor": "Monitor IA", + "translate.summary": "Resumo", + "translate.cancelProcess": "⟳ Cancelar o processo", + "translate.layoutIntegrity": "Integridade do layout", + "translate.secureHundred": "100% SEGURO", + "translate.okHundred": "100% OK", + "translate.preserveLayout": "Manter layout", + "translate.preserveLayoutDesc": "Manter o layout", + "translate.textOnly": "Apenas texto", + "translate.textOnlyDesc": "Tradução rápida apenas do texto", + "translate.unavailableStandard": "Indisponível no modo Padrão (apenas IA)", + "apiKeys.noKeysGenerated": "Nenhuma chave gerada", + "apiKeys.copied": "Copiado!", + "services.fallback.google.label": "Google Tradutor", + "services.fallback.google.desc": "Tradução rápida, mais de 130 idiomas", + "settings.formats.excel.name": "Excel", + "settings.formats.word.name": "Word", + "settings.formats.powerpoint.name": "PowerPoint", + "pricing.dashboard": "Painel", + "pricing.okSymbol": "✓", + "pricing.errSymbol": "✕", }, // ═══════════════════════════════════════════════════════════════ // ITALIAN (it) @@ -4969,6 +5725,7 @@ const messages: Record> = { "dashboard.translate.complete.download": "Scarica", "dashboard.translate.complete.newTranslation": "Nuova traduzione", "dashboard.translate.complete.toastOkTitle": "Operazione riuscita", + "dashboard.translate.complete.toastOkDesc": "{name} è stato scaricato con successo.", "dashboard.translate.complete.toastFailTitle": "Non riuscito", "dashboard.translate.complete.toastFailDesc": "Traduzione non riuscita. Riprova.", "dashboard.translate.sourceDocument": "Documento sorgente", @@ -4997,6 +5754,8 @@ const messages: Record> = { "dashboard.translate.pipeline.translate": "Traduzione", "dashboard.translate.pipeline.rebuild": "Ricostruisci", "dashboard.translate.pipeline.finalize": "Finalizza", + "dashboard.translate.progress.processingFallback": "Elaborazione…", + "dashboard.translate.progress.connectionLost": "Connessione persa. Riprovo…", "dashboard.translate.progress.failedTitle": "Traduzione fallita", "dashboard.translate.error.unexpected": "Si è verificato un errore imprevisto. Riprova.", "dashboard.translate.error.noResult": "La traduzione non ha prodotto risultati. Verifica che il documento contenga testo, quindi riprova o scegli un altro motore.", @@ -5061,6 +5820,8 @@ const messages: Record> = { "glossaries.dialog.dropTitle": "Trascina qui un file CSV", "glossaries.dialog.dropOr": "oppure", "glossaries.dialog.dropFormats": "CSV, TSV, TXT", + "glossaries.termEditor.addTerm": "Aggiungi termine", + "glossaries.termEditor.maxReached": "Raggiunto il massimo di {max} termini per glossario.", "glossaries.dialog.formatTitle": "Formato", "glossaries.dialog.formatDesc": "origine,destinazione (uno per riga)", "glossaries.dialog.formatNote": "La prima riga viene saltata se rilevata come intestazione", @@ -5156,6 +5917,8 @@ const messages: Record> = { "glossaries.badge.compatible": "Compatible", "glossaries.badge.otherTarget": "Autre cible", "glossaries.card.editTerms": "Modifier les termes", + "glossaries.card.created": "Creato", + "glossaries.card.term": "termine", "glossaries.card.delete": "Supprimer", "glossaries.grid.searchPlaceholder": "Search a glossary…", "glossaries.grid.noResults": "No results for this search.", @@ -5398,6 +6161,10 @@ const messages: Record> = { "login.signIn": "Sign In", "login.noAccount": "Don't have an account?", "login.signUpFree": "Sign up for free", + "login.orContinueWith": "oppure continua con e-mail", + "login.google.connecting": "Connessione…", + "login.google.errorGeneric": "Si è verificato un errore con l'accesso Google.", + "login.google.errorFailed": "Accesso con Google non riuscito. Riprova.", "forgotPassword.enterEmail": "Please enter your email address", "forgotPassword.error": "An error occurred", "forgotPassword.title": "Forgot Password", @@ -5691,6 +6458,7 @@ const messages: Record> = { "memento.ctaMore": "Scopri di più", "common.backToHome": "Torna alla home", "dashboard.topbar.interfaceLabel": "Interfaccia di traduzione", + "dashboard.topbar.premiumAccess": "Accesso Premium", "landing.hero.contextEngine": "Traduzione rilevata: Termine tecnico di manutenzione per sistemi HVAC...", "landing.hero.liveAnalysis": "Analisi in tempo reale", "landing.hero.termsDetected": "termini rilevati", @@ -5711,6 +6479,144 @@ const messages: Record> = { "landing.translate.aiAnalysis": "Analisi IA Attiva", "landing.translate.processing": "Elaborazione in corso", "landing.translate.preservingLayout": "Il tuo layout viene preservato", + "layout.nav.apiAccess": "Accesso API", + "layout.footer.terms": "Termini", + "layout.footer.privacy": "Privacy", + "fileUploader.uploadDocument": "Carica documento", + "fileUploader.uploadDesc": "Trascina o fai clic per selezionare un file (Excel, Word, PowerPoint)", + "fileUploader.dropHere": "Rilascia il file qui…", + "fileUploader.dragAndDrop": "Trascina il documento qui", + "fileUploader.orClickBrowse": "oppure fai clic per sfogliare", + "fileUploader.preview": "Anteprima", + "fileUploader.translationOptions": "Opzioni di traduzione", + "fileUploader.configureSettings": "Configura le impostazioni di traduzione", + "fileUploader.targetLanguage": "Lingua di destinazione", + "fileUploader.selectLanguage": "Seleziona lingua", + "fileUploader.translationProvider": "Provider di traduzione", + "fileUploader.selectProvider": "Seleziona provider", + "fileUploader.advancedOptions": "Opzioni avanzate", + "fileUploader.translateImages": "Traduci immagini", + "fileUploader.translating": "Traduzione in corso…", + "fileUploader.translateDocument": "Traduci documento", + "fileUploader.processing": "Elaborazione…", + "fileUploader.translationError": "Errore di traduzione", + "fileUploader.translationComplete": "Traduzione completata!", + "fileUploader.translationCompleteDesc": "Il documento è stato tradotto con successo mantenendo la formattazione.", + "fileUploader.download": "Scarica documento tradotto", + "fileUploader.webgpuUnsupported": "WebGPU non è supportato in questo browser. Usa Chrome 113+ o Edge 113+.", + "fileUploader.webllmNotLoaded": "Modello WebLLM non caricato. Vai a Impostazioni > Servizi di traduzione per caricare un modello.", + "fileUploader.extracting": "Estrazione dei testi dal documento…", + "fileUploader.noTranslatable": "Nessun testo traducibile trovato nel documento", + "fileUploader.foundTexts": "Trovati {count} testi da tradurre", + "fileUploader.translatingItem": "Traduzione {current}/{total}: «{preview}»", + "fileUploader.reconstructing": "Ricostruzione del documento…", + "fileUploader.translatingLocally": "Traduzione locale con WebLLM…", + "checkout.activating": "Attivazione in corso…", + "checkout.activatingDesc": "Stiamo aggiornando il tuo abbonamento, attendi.", + "checkout.paymentConfirmed": "Pagamento confermato!", + "checkout.subscriptionActivated": "Abbonamento attivato!", + "checkout.planActivated": "Piano {plan} attivato!", + "checkout.redirectingToProfile": "Reindirizzamento al tuo profilo…", + "checkout.paymentReceived": "Pagamento ricevuto", + "checkout.redirecting": "Reindirizzamento…", + "checkout.syncError": "Errore di sincronizzazione", + "checkout.networkError": "Errore di rete. Il pagamento è confermato — ricarica il profilo.", + "dashboard.checkoutSyncError": "Errore di sincronizzazione del pagamento.", + "dashboard.networkRefresh": "Errore di rete. Aggiorna la pagina.", + "dashboard.continueToTranslate": "Vai alla traduzione", + "langSelector.search": "Cerca…", + "langSelector.noResults": "Nessun risultato", + "langSelector.source": "Origine", + "langSelector.target": "Destinazione", + "langSelector.swap": "Inverti", + "translateComplete.highQuality": "Alta qualità", + "translateComplete.segments": "Segmenti", + "translateComplete.characters": "Caratteri", + "translateComplete.confidence": "Affidabilità", + "providerTheme.deepseek.badge": "Essenziale", + "providerTheme.deepseek.subBadge": "Tecnico ed economico", + "providerTheme.deepseek.desc": "Traduzione ultra-precisa ed economica, ideale per documenti tecnici e codice.", + "providerTheme.openai.badge": "Premium", + "providerTheme.openai.subBadge": "Alta fedeltà", + "providerTheme.openai.desc": "Lo standard globale dell'IA. Massima coerenza testuale e rispetto rigoroso dello stile.", + "providerTheme.minimax.badge": "Avanzata", + "providerTheme.minimax.subBadge": "Prestazioni", + "providerTheme.minimax.desc": "Velocità di esecuzione incredibile e comprensione eccellente di strutture complesse.", + "providerTheme.openrouter.badge": "Express", + "providerTheme.openrouter.subBadge": "Multi-modello", + "providerTheme.openrouter.desc": "Accesso unificato ai migliori modelli open-source ottimizzati per la traduzione.", + "providerTheme.openrouter_premium.badge": "Ultra", + "providerTheme.openrouter_premium.subBadge": "Contesto massimo", + "providerTheme.openrouter_premium.desc": "Assistito da modelli all'avanguardia (GPT-4o, Claude Sonnet 4.6) per documenti lunghi.", + "providerTheme.zai.badge": "Specializzata", + "providerTheme.zai.subBadge": "Finanza e Diritto", + "providerTheme.zai.desc": "Modello ottimizzato per terminologie aziendali impegnative (legale, finanza).", + "providerTheme.default.badge": "Moderno", + "providerTheme.default.subBadge": "Ragionamento IA", + "providerTheme.default.desc": "Traduzione con modello linguistico di grandi dimensioni (LLM) con analisi semantica avanzata.", + "providerTheme.classic.google.label": "Google Traduttore", + "providerTheme.classic.google.desc": "Traduzione ultra-veloce che copre oltre 130 lingue. Consigliata per flussi generali.", + "providerTheme.classic.deepl.label": "DeepL Pro", + "providerTheme.classic.deepl.desc": "Traduzione ad alta precisione rinomata per la sua fluidità e formulazioni naturali.", + "providerTheme.classic.google_cloud.label": "Google Cloud API", + "providerTheme.classic.google_cloud.desc": "Motore cloud professionale ottimizzato per l'elaborazione di grandi volumi di documenti.", + "providerSelector.noClassic": "Nessun traduttore standard disponibile.", + "providerSelector.noLlm": "Nessun modello IA configurato.", + "providerSelector.costOne": "Costo: 1 credito per pagina", + "providerSelector.costFive": "Costo: 5 crediti per pagina (Fattore Premium)", + "providerSelector.unlockContextual": "Sblocca la traduzione contestuale premium per i tuoi documenti interi.", + "translate.header.processing": "Elaborazione in corso", + "translate.header.aiActive": "Analisi IA attiva", + "translate.header.aiActiveDesc": "Il tuo layout viene preservato dal nostro motore contestuale.", + "translate.header.completed": "Completato", + "translate.header.completedTitle": "Traduzione completata", + "translate.header.proSpace": "Spazio Pro", + "translate.header.translateDoc": "Traduci un documento", + "translate.header.translateDocDesc": "Preserva il layout originale con il nostro motore di traduzione ultra-alta-fedeltà.", + "translate.upload.nativeFormat": "Formato nativo", + "translate.fileType.word": "Word (.docx)", + "translate.fileType.excel": "Excel (.xlsx)", + "translate.fileType.slides": "Diapositive (.pptx)", + "translate.fileType.pdf": "PDF (.pdf)", + "translate.startTranslation": "Avvia traduzione", + "translate.submit": "Invio…", + "translate.chooseTargetLang": "Seleziona una lingua di destinazione", + "translate.pleaseLoadFile": "Carica prima un file", + "translate.contextEngineActive": "Motore contestuale attivo", + "translate.phase1": "Fase 1: Inizializzazione", + "translate.phase2": "Fase 2: Ricostruzione contestuale", + "translate.stat.segments": "segmenti", + "translate.stat.precision": "precisione", + "translate.stat.speedLabel": "velocità", + "translate.stat.turbo": "Turbo", + "translate.stat.time": "tempo", + "translate.complete.masterQuality": "✓ Qualità master", + "translate.download": "Scarica", + "translate.newTranslation": "+ Nuova traduzione", + "translate.failedTitle": "Errore di traduzione", + "translate.retry": "Riprova", + "translate.uploadAnother": "Carica un altro file", + "translate.monitor": "Monitor IA", + "translate.summary": "Riepilogo", + "translate.cancelProcess": "⟳ Annulla il processo", + "translate.layoutIntegrity": "Integrità del layout", + "translate.secureHundred": "100% SICURO", + "translate.okHundred": "100% OK", + "translate.preserveLayout": "Mantieni layout", + "translate.preserveLayoutDesc": "Mantieni il layout", + "translate.textOnly": "Solo testo", + "translate.textOnlyDesc": "Traduzione rapida solo del testo", + "translate.unavailableStandard": "Non disponibile in modalità Standard (solo IA)", + "apiKeys.noKeysGenerated": "Nessuna chiave generata", + "apiKeys.copied": "Copiato!", + "services.fallback.google.label": "Google Traduttore", + "services.fallback.google.desc": "Traduzione rapida, oltre 130 lingue", + "settings.formats.excel.name": "Excel", + "settings.formats.word.name": "Word", + "settings.formats.powerpoint.name": "PowerPoint", + "pricing.dashboard": "Dashboard", + "pricing.okSymbol": "✓", + "pricing.errSymbol": "✕", }, // ═══════════════════════════════════════════════════════════════ // DUTCH (nl) @@ -5898,6 +6804,7 @@ const messages: Record> = { "dashboard.translate.complete.download": "Downloaden", "dashboard.translate.complete.newTranslation": "Nieuwe vertaling", "dashboard.translate.complete.toastOkTitle": "Succes", + "dashboard.translate.complete.toastOkDesc": "{name} is succesvol gedownload.", "dashboard.translate.complete.toastFailTitle": "Mislukt", "dashboard.translate.complete.toastFailDesc": "Vertaling mislukt. Probeer het opnieuw.", "dashboard.translate.sourceDocument": "Brondocument", @@ -5926,6 +6833,8 @@ const messages: Record> = { "dashboard.translate.pipeline.translate": "Vertaling", "dashboard.translate.pipeline.rebuild": "Reconstrueren", "dashboard.translate.pipeline.finalize": "Afronden", + "dashboard.translate.progress.processingFallback": "Verwerken…", + "dashboard.translate.progress.connectionLost": "Verbinding verloren. Opnieuw proberen…", "dashboard.translate.progress.failedTitle": "Vertaling mislukt", "dashboard.translate.error.unexpected": "Er is een onverwachte fout opgetreden. Probeer het opnieuw.", "dashboard.translate.error.noResult": "De vertaling leverde geen resultaten op. Controleer of het document tekst bevat en probeer het opnieuw of kies een andere engine.", @@ -5990,6 +6899,8 @@ const messages: Record> = { "glossaries.dialog.dropTitle": "Sleep een CSV-bestand hierheen", "glossaries.dialog.dropOr": "of", "glossaries.dialog.dropFormats": "CSV, TSV, TXT", + "glossaries.termEditor.addTerm": "Term toevoegen", + "glossaries.termEditor.maxReached": "Maximum van {max} termen per glossarium bereikt.", "glossaries.dialog.formatTitle": "Indeling", "glossaries.dialog.formatDesc": "bron,doel (één per regel)", "glossaries.dialog.formatNote": "Eerste regel overgeslagen als koptekst wordt gedetecteerd", @@ -6085,6 +6996,8 @@ const messages: Record> = { "glossaries.badge.compatible": "Compatible", "glossaries.badge.otherTarget": "Autre cible", "glossaries.card.editTerms": "Modifier les termes", + "glossaries.card.created": "Aangemaakt", + "glossaries.card.term": "term", "glossaries.card.delete": "Supprimer", "glossaries.grid.searchPlaceholder": "Search a glossary…", "glossaries.grid.noResults": "No results for this search.", @@ -6327,6 +7240,10 @@ const messages: Record> = { "login.signIn": "Sign In", "login.noAccount": "Don't have an account?", "login.signUpFree": "Sign up for free", + "login.orContinueWith": "of ga verder met e-mail", + "login.google.connecting": "Verbinden…", + "login.google.errorGeneric": "Er is iets misgegaan met Google-aanmelding.", + "login.google.errorFailed": "Google-aanmelding mislukt. Probeer het opnieuw.", "forgotPassword.enterEmail": "Please enter your email address", "forgotPassword.error": "An error occurred", "forgotPassword.title": "Forgot Password", @@ -6620,6 +7537,7 @@ const messages: Record> = { "memento.ctaMore": "Meer informatie", "common.backToHome": "Terug naar home", "dashboard.topbar.interfaceLabel": "Vertaalinterface", + "dashboard.topbar.premiumAccess": "Premium-toegang", "landing.hero.contextEngine": "Vertaling gedetecteerd: Technische onderhoudsterm voor HVAC-systemen...", "landing.hero.liveAnalysis": "Live-analyse", "landing.hero.termsDetected": "termen gedetecteerd", @@ -6640,6 +7558,144 @@ const messages: Record> = { "landing.translate.aiAnalysis": "Actieve AI-analyse", "landing.translate.processing": "Verwerking bezig", "landing.translate.preservingLayout": "Uw opmaak wordt behouden", + "layout.nav.apiAccess": "API-toegang", + "layout.footer.terms": "Voorwaarden", + "layout.footer.privacy": "Privacy", + "fileUploader.uploadDocument": "Document uploaden", + "fileUploader.uploadDesc": "Sleep of klik om een bestand te selecteren (Excel, Word, PowerPoint)", + "fileUploader.dropHere": "Zet uw bestand hier neer…", + "fileUploader.dragAndDrop": "Sleep uw document hierheen", + "fileUploader.orClickBrowse": "of klik om te bladeren", + "fileUploader.preview": "Voorbeeld", + "fileUploader.translationOptions": "Vertaalopties", + "fileUploader.configureSettings": "Vertaalinstellingen configureren", + "fileUploader.targetLanguage": "Doeltaal", + "fileUploader.selectLanguage": "Selecteer taal", + "fileUploader.translationProvider": "Vertaalprovider", + "fileUploader.selectProvider": "Selecteer provider", + "fileUploader.advancedOptions": "Geavanceerde opties", + "fileUploader.translateImages": "Afbeeldingen vertalen", + "fileUploader.translating": "Bezig met vertalen…", + "fileUploader.translateDocument": "Document vertalen", + "fileUploader.processing": "Verwerken…", + "fileUploader.translationError": "Vertaalfout", + "fileUploader.translationComplete": "Vertaling voltooid!", + "fileUploader.translationCompleteDesc": "Uw document is succesvol vertaald met behoud van alle opmaak.", + "fileUploader.download": "Vertaald document downloaden", + "fileUploader.webgpuUnsupported": "WebGPU wordt niet ondersteund in deze browser. Gebruik Chrome 113+ of Edge 113+.", + "fileUploader.webllmNotLoaded": "WebLLM-model niet geladen. Ga naar Instellingen > Vertaaldiensten om een model te laden.", + "fileUploader.extracting": "Teksten uit document extraheren…", + "fileUploader.noTranslatable": "Geen vertaalbare tekst gevonden in document", + "fileUploader.foundTexts": "{count} teksten gevonden om te vertalen", + "fileUploader.translatingItem": "Vertalen {current}/{total}: „{preview}\"", + "fileUploader.reconstructing": "Document reconstrueren…", + "fileUploader.translatingLocally": "Lokaal vertalen met WebLLM…", + "checkout.activating": "Activeren…", + "checkout.activatingDesc": "We werken uw abonnement bij, even geduld.", + "checkout.paymentConfirmed": "Betaling bevestigd!", + "checkout.subscriptionActivated": "Abonnement geactiveerd!", + "checkout.planActivated": "{plan}-abonnement geactiveerd!", + "checkout.redirectingToProfile": "Doorverwijzen naar uw profiel…", + "checkout.paymentReceived": "Betaling ontvangen", + "checkout.redirecting": "Doorverwijzen…", + "checkout.syncError": "Synchronisatiefout", + "checkout.networkError": "Netwerkfout. Uw betaling is bevestigd — vernieuw uw profiel.", + "dashboard.checkoutSyncError": "Fout bij synchroniseren van betaling.", + "dashboard.networkRefresh": "Netwerkfout. Vernieuw de pagina.", + "dashboard.continueToTranslate": "Doorgaan naar vertaling", + "langSelector.search": "Zoeken…", + "langSelector.noResults": "Geen resultaten", + "langSelector.source": "Bron", + "langSelector.target": "Doel", + "langSelector.swap": "Wisselen", + "translateComplete.highQuality": "Hoge kwaliteit", + "translateComplete.segments": "Segmenten", + "translateComplete.characters": "Tekens", + "translateComplete.confidence": "Betrouwbaarheid", + "providerTheme.deepseek.badge": "Essentieel", + "providerTheme.deepseek.subBadge": "Technisch & zuinig", + "providerTheme.deepseek.desc": "Ultraprecieze en zuinige vertaling, ideaal voor technische documenten en code.", + "providerTheme.openai.badge": "Premium", + "providerTheme.openai.subBadge": "Hoge getrouwheid", + "providerTheme.openai.desc": "De wereldwijde AI-standaard. Maximale tekstconsistentie en strikte stijlrespect.", + "providerTheme.minimax.badge": "Geavanceerd", + "providerTheme.minimax.subBadge": "Prestaties", + "providerTheme.minimax.desc": "Ongelofelijke uitvoersnelheid en uitstekend begrip van complexe structuren.", + "providerTheme.openrouter.badge": "Express", + "providerTheme.openrouter.subBadge": "Multi-model", + "providerTheme.openrouter.desc": "Uniforme toegang tot de beste open-source modellen, geoptimaliseerd voor vertaling.", + "providerTheme.openrouter_premium.badge": "Ultra", + "providerTheme.openrouter_premium.subBadge": "Maximale context", + "providerTheme.openrouter_premium.desc": "Ondersteund door state-of-the-art modellen (GPT-4o, Claude Sonnet 4.6) voor lange documenten.", + "providerTheme.zai.badge": "Gespecialiseerd", + "providerTheme.zai.subBadge": "Financiën & Recht", + "providerTheme.zai.desc": "Model afgestemd op veeleisende bedrijfsterminologieën (juridisch, financieel).", + "providerTheme.default.badge": "Modern", + "providerTheme.default.subBadge": "AI-redenering", + "providerTheme.default.desc": "Grote taalmodel (LLM) vertaling met geavanceerde semantische analyse.", + "providerTheme.classic.google.label": "Google Vertalen", + "providerTheme.classic.google.desc": "Ultrasnelle vertaling voor meer dan 130 talen. Aanbevolen voor algemene stromen.", + "providerTheme.classic.deepl.label": "DeepL Pro", + "providerTheme.classic.deepl.desc": "Hoge precisie vertaling, bekend om vloeibaarheid en natuurlijke formuleringen.", + "providerTheme.classic.google_cloud.label": "Google Cloud API", + "providerTheme.classic.google_cloud.desc": "Professionele cloud-engine geoptimaliseerd voor het verwerken van grote documentvolumes.", + "providerSelector.noClassic": "Geen standaard vertaler beschikbaar.", + "providerSelector.noLlm": "Geen AI-model geconfigureerd.", + "providerSelector.costOne": "Kosten: 1 credit per pagina", + "providerSelector.costFive": "Kosten: 5 credits per pagina (Premium-factor)", + "providerSelector.unlockContextual": "Premium contextuele vertaling voor uw volledige documenten ontgrendelen.", + "translate.header.processing": "Verwerking bezig", + "translate.header.aiActive": "AI-analyse actief", + "translate.header.aiActiveDesc": "Uw opmaak wordt behouden door onze contextuele engine.", + "translate.header.completed": "Voltooid", + "translate.header.completedTitle": "Vertaling voltooid", + "translate.header.proSpace": "Pro-ruimte", + "translate.header.translateDoc": "Een document vertalen", + "translate.header.translateDocDesc": "Behoud de originele opmaak met onze ultra-hoge-fidelity vertaalengine.", + "translate.upload.nativeFormat": "Native formaat", + "translate.fileType.word": "Word (.docx)", + "translate.fileType.excel": "Excel (.xlsx)", + "translate.fileType.slides": "Dia's (.pptx)", + "translate.fileType.pdf": "PDF (.pdf)", + "translate.startTranslation": "Vertaling starten", + "translate.submit": "Verzenden…", + "translate.chooseTargetLang": "Kies een doeltaal", + "translate.pleaseLoadFile": "Upload eerst een bestand", + "translate.contextEngineActive": "Contextuele engine actief", + "translate.phase1": "Fase 1: Initialisatie", + "translate.phase2": "Fase 2: Contextuele reconstructie", + "translate.stat.segments": "segmenten", + "translate.stat.precision": "precisie", + "translate.stat.speedLabel": "snelheid", + "translate.stat.turbo": "Turbo", + "translate.stat.time": "tijd", + "translate.complete.masterQuality": "✓ Meesterkwaliteit", + "translate.download": "Downloaden", + "translate.newTranslation": "+ Nieuwe vertaling", + "translate.failedTitle": "Vertaalfout", + "translate.retry": "Opnieuw", + "translate.uploadAnother": "Een ander bestand uploaden", + "translate.monitor": "AI-monitor", + "translate.summary": "Samenvatting", + "translate.cancelProcess": "⟳ Proces annuleren", + "translate.layoutIntegrity": "Lay-out integriteit", + "translate.secureHundred": "100% VEILIG", + "translate.okHundred": "100% OK", + "translate.preserveLayout": "Opmaak behouden", + "translate.preserveLayoutDesc": "Opmaak behouden", + "translate.textOnly": "Alleen tekst", + "translate.textOnlyDesc": "Snelle vertaling van alleen tekst", + "translate.unavailableStandard": "Niet beschikbaar in Standaardmodus (alleen AI)", + "apiKeys.noKeysGenerated": "Geen sleutels gegenereerd", + "apiKeys.copied": "Gekopieerd!", + "services.fallback.google.label": "Google Vertalen", + "services.fallback.google.desc": "Snelle vertaling, 130+ talen", + "settings.formats.excel.name": "Excel", + "settings.formats.word.name": "Word", + "settings.formats.powerpoint.name": "PowerPoint", + "pricing.dashboard": "Dashboard", + "pricing.okSymbol": "✓", + "pricing.errSymbol": "✕", }, // ═══════════════════════════════════════════════════════════════ // RUSSIAN (ru) @@ -6827,6 +7883,7 @@ const messages: Record> = { "dashboard.translate.complete.download": "Скачать", "dashboard.translate.complete.newTranslation": "Новый перевод", "dashboard.translate.complete.toastOkTitle": "Успешно", + "dashboard.translate.complete.toastOkDesc": "{name} успешно загружен.", "dashboard.translate.complete.toastFailTitle": "Ошибка", "dashboard.translate.complete.toastFailDesc": "Перевод не удался. Пожалуйста, попробуйте снова.", "dashboard.translate.sourceDocument": "Исходный документ", @@ -6855,6 +7912,8 @@ const messages: Record> = { "dashboard.translate.pipeline.translate": "Перевод", "dashboard.translate.pipeline.rebuild": "Восстановление", "dashboard.translate.pipeline.finalize": "Завершение", + "dashboard.translate.progress.processingFallback": "Обработка…", + "dashboard.translate.progress.connectionLost": "Соединение потеряно. Повторная попытка…", "dashboard.translate.progress.failedTitle": "Перевод не удался", "dashboard.translate.error.unexpected": "Произошла непредвиденная ошибка. Попробуйте снова.", "dashboard.translate.error.noResult": "Перевод не дал результатов. Убедитесь, что документ содержит текст, и попробуйте снова или выберите другой движок.", @@ -6919,6 +7978,8 @@ const messages: Record> = { "glossaries.dialog.dropTitle": "Перетащите CSV-файл сюда", "glossaries.dialog.dropOr": "или", "glossaries.dialog.dropFormats": "CSV, TSV, TXT", + "glossaries.termEditor.addTerm": "Добавить термин", + "glossaries.termEditor.maxReached": "Достигнуто максимум {max} терминов в глоссарии.", "glossaries.dialog.formatTitle": "Формат", "glossaries.dialog.formatDesc": "источник,цель (по одной на строку)", "glossaries.dialog.formatNote": "Первая строка пропускается при обнаружении заголовка", @@ -7014,6 +8075,8 @@ const messages: Record> = { "glossaries.badge.compatible": "Compatible", "glossaries.badge.otherTarget": "Autre cible", "glossaries.card.editTerms": "Modifier les termes", + "glossaries.card.created": "Создано", + "glossaries.card.term": "термин", "glossaries.card.delete": "Supprimer", "glossaries.grid.searchPlaceholder": "Search a glossary…", "glossaries.grid.noResults": "No results for this search.", @@ -7258,6 +8321,10 @@ const messages: Record> = { "login.signIn": "Sign In", "login.noAccount": "Don't have an account?", "login.signUpFree": "Sign up for free", + "login.orContinueWith": "или продолжить по электронной почте", + "login.google.connecting": "Подключение…", + "login.google.errorGeneric": "Произошла ошибка при входе через Google.", + "login.google.errorFailed": "Не удалось войти через Google. Повторите попытку.", "forgotPassword.enterEmail": "Please enter your email address", "forgotPassword.error": "An error occurred", "forgotPassword.title": "Forgot Password", @@ -7551,6 +8618,7 @@ const messages: Record> = { "memento.ctaMore": "Узнать больше", "common.backToHome": "Вернуться на главную", "dashboard.topbar.interfaceLabel": "Интерфейс перевода", + "dashboard.topbar.premiumAccess": "Премиум-доступ", "landing.hero.contextEngine": "Обнаружен перевод: Технический термин обслуживания для систем HVAC...", "landing.hero.liveAnalysis": "Анализ в реальном времени", "landing.hero.termsDetected": "терминов обнаружено", @@ -7571,6 +8639,144 @@ const messages: Record> = { "landing.translate.aiAnalysis": "Активный ИИ-анализ", "landing.translate.processing": "Обработка", "landing.translate.preservingLayout": "Ваше форматирование сохраняется", + "layout.nav.apiAccess": "Доступ к API", + "layout.footer.terms": "Условия", + "layout.footer.privacy": "Конфиденциальность", + "fileUploader.uploadDocument": "Загрузить документ", + "fileUploader.uploadDesc": "Перетащите или нажмите, чтобы выбрать файл (Excel, Word, PowerPoint)", + "fileUploader.dropHere": "Перетащите файл сюда…", + "fileUploader.dragAndDrop": "Перетащите документ сюда", + "fileUploader.orClickBrowse": "или нажмите, чтобы выбрать", + "fileUploader.preview": "Предпросмотр", + "fileUploader.translationOptions": "Параметры перевода", + "fileUploader.configureSettings": "Настройте параметры перевода", + "fileUploader.targetLanguage": "Целевой язык", + "fileUploader.selectLanguage": "Выберите язык", + "fileUploader.translationProvider": "Поставщик перевода", + "fileUploader.selectProvider": "Выберите поставщика", + "fileUploader.advancedOptions": "Расширенные параметры", + "fileUploader.translateImages": "Переводить изображения", + "fileUploader.translating": "Перевод…", + "fileUploader.translateDocument": "Перевести документ", + "fileUploader.processing": "Обработка…", + "fileUploader.translationError": "Ошибка перевода", + "fileUploader.translationComplete": "Перевод завершён!", + "fileUploader.translationCompleteDesc": "Ваш документ успешно переведён с сохранением форматирования.", + "fileUploader.download": "Скачать переведённый документ", + "fileUploader.webgpuUnsupported": "WebGPU не поддерживается в этом браузере. Используйте Chrome 113+ или Edge 113+.", + "fileUploader.webllmNotLoaded": "Модель WebLLM не загружена. Перейдите в Настройки > Службы перевода, чтобы загрузить модель.", + "fileUploader.extracting": "Извлечение текстов из документа…", + "fileUploader.noTranslatable": "В документе не найден переводимый текст", + "fileUploader.foundTexts": "Найдено {count} текстов для перевода", + "fileUploader.translatingItem": "Перевод {current}/{total}: «{preview}»", + "fileUploader.reconstructing": "Восстановление документа…", + "fileUploader.translatingLocally": "Локальный перевод с WebLLM…", + "checkout.activating": "Активация…", + "checkout.activatingDesc": "Обновляем вашу подписку, подождите.", + "checkout.paymentConfirmed": "Платёж подтверждён!", + "checkout.subscriptionActivated": "Подписка активирована!", + "checkout.planActivated": "Тариф {plan} активирован!", + "checkout.redirectingToProfile": "Перенаправление в профиль…", + "checkout.paymentReceived": "Платёж получен", + "checkout.redirecting": "Перенаправление…", + "checkout.syncError": "Ошибка синхронизации", + "checkout.networkError": "Ошибка сети. Платёж подтверждён — перезагрузите профиль.", + "dashboard.checkoutSyncError": "Ошибка синхронизации платежа.", + "dashboard.networkRefresh": "Ошибка сети. Обновите страницу.", + "dashboard.continueToTranslate": "Перейти к переводу", + "langSelector.search": "Поиск…", + "langSelector.noResults": "Нет результатов", + "langSelector.source": "Источник", + "langSelector.target": "Цель", + "langSelector.swap": "Поменять", + "translateComplete.highQuality": "Высокое качество", + "translateComplete.segments": "Сегменты", + "translateComplete.characters": "Символы", + "translateComplete.confidence": "Уверенность", + "providerTheme.deepseek.badge": "Базовый", + "providerTheme.deepseek.subBadge": "Технический и экономичный", + "providerTheme.deepseek.desc": "Ультраточная и экономичная трансляция, идеально для технических документов и кода.", + "providerTheme.openai.badge": "Премиум", + "providerTheme.openai.subBadge": "Высокая точность", + "providerTheme.openai.desc": "Мировой стандарт ИИ. Максимальная согласованность и строгое соблюдение стиля.", + "providerTheme.minimax.badge": "Продвинутый", + "providerTheme.minimax.subBadge": "Производительность", + "providerTheme.minimax.desc": "Невероятная скорость и превосходное понимание сложных структур.", + "providerTheme.openrouter.badge": "Экспресс", + "providerTheme.openrouter.subBadge": "Мульти-модель", + "providerTheme.openrouter.desc": "Единый доступ к лучшим open-source моделям, оптимизированным для перевода.", + "providerTheme.openrouter_premium.badge": "Ультра", + "providerTheme.openrouter_premium.subBadge": "Максимальный контекст", + "providerTheme.openrouter_premium.desc": "С помощью современных моделей (GPT-4o, Claude Sonnet 4.6) для длинных документов.", + "providerTheme.zai.badge": "Специализированный", + "providerTheme.zai.subBadge": "Финансы и право", + "providerTheme.zai.desc": "Модель точно настроена для требовательных бизнес-терминологий (юриспруденция, финансы).", + "providerTheme.default.badge": "Современный", + "providerTheme.default.subBadge": "ИИ-рассуждение", + "providerTheme.default.desc": "Перевод большой языковой моделью (LLM) с расширенным семантическим анализом.", + "providerTheme.classic.google.label": "Google Переводчик", + "providerTheme.classic.google.desc": "Сверхбыстрый перевод более 130 языков. Рекомендуется для общих потоков.", + "providerTheme.classic.deepl.label": "DeepL Pro", + "providerTheme.classic.deepl.desc": "Высокоточная трансляция, известная своей беглостью и естественностью формулировок.", + "providerTheme.classic.google_cloud.label": "Google Cloud API", + "providerTheme.classic.google_cloud.desc": "Профессиональный облачный движок, оптимизированный для обработки больших объёмов документов.", + "providerSelector.noClassic": "Стандартный переводчик недоступен.", + "providerSelector.noLlm": "Модель ИИ не настроена.", + "providerSelector.costOne": "Стоимость: 1 кредит за страницу", + "providerSelector.costFive": "Стоимость: 5 кредитов за страницу (Премиум-фактор)", + "providerSelector.unlockContextual": "Разблокируйте премиум-контекстный перевод для ваших документов.", + "translate.header.processing": "Идёт обработка", + "translate.header.aiActive": "ИИ-анализ активен", + "translate.header.aiActiveDesc": "Ваша компоновка сохраняется нашим контекстным движком.", + "translate.header.completed": "Завершено", + "translate.header.completedTitle": "Перевод завершён", + "translate.header.proSpace": "Pro-пространство", + "translate.header.translateDoc": "Перевести документ", + "translate.header.translateDocDesc": "Сохраните оригинальную компоновку с нашим движком перевода сверхвысокой точности.", + "translate.upload.nativeFormat": "Родной формат", + "translate.fileType.word": "Word (.docx)", + "translate.fileType.excel": "Excel (.xlsx)", + "translate.fileType.slides": "Слайды (.pptx)", + "translate.fileType.pdf": "PDF (.pdf)", + "translate.startTranslation": "Начать перевод", + "translate.submit": "Отправка…", + "translate.chooseTargetLang": "Пожалуйста, выберите целевой язык", + "translate.pleaseLoadFile": "Пожалуйста, сначала загрузите файл", + "translate.contextEngineActive": "Контекстный движок активен", + "translate.phase1": "Фаза 1: Инициализация", + "translate.phase2": "Фаза 2: Контекстная реконструкция", + "translate.stat.segments": "сегментов", + "translate.stat.precision": "точность", + "translate.stat.speedLabel": "скорость", + "translate.stat.turbo": "Турбо", + "translate.stat.time": "время", + "translate.complete.masterQuality": "✓ Мастер-качество", + "translate.download": "Скачать", + "translate.newTranslation": "+ Новый перевод", + "translate.failedTitle": "Ошибка перевода", + "translate.retry": "Повторить", + "translate.uploadAnother": "Загрузить другой файл", + "translate.monitor": "ИИ-монитор", + "translate.summary": "Сводка", + "translate.cancelProcess": "⟳ Отменить процесс", + "translate.layoutIntegrity": "Целостность макета", + "translate.secureHundred": "100% БЕЗОПАСНО", + "translate.okHundred": "100% OK", + "translate.preserveLayout": "Сохранить макет", + "translate.preserveLayoutDesc": "Сохранить макет", + "translate.textOnly": "Только текст", + "translate.textOnlyDesc": "Быстрый перевод только текста", + "translate.unavailableStandard": "Недоступно в стандартном режиме (только ИИ)", + "apiKeys.noKeysGenerated": "Ключи не созданы", + "apiKeys.copied": "Скопировано!", + "services.fallback.google.label": "Google Переводчик", + "services.fallback.google.desc": "Быстрый перевод, 130+ языков", + "settings.formats.excel.name": "Excel", + "settings.formats.word.name": "Word", + "settings.formats.powerpoint.name": "PowerPoint", + "pricing.dashboard": "Панель", + "pricing.okSymbol": "✓", + "pricing.errSymbol": "✕", }, // ═══════════════════════════════════════════════════════════════ // JAPANESE (ja) @@ -7758,6 +8964,7 @@ const messages: Record> = { "dashboard.translate.complete.download": "ダウンロード", "dashboard.translate.complete.newTranslation": "新しい翻訳", "dashboard.translate.complete.toastOkTitle": "成功", + "dashboard.translate.complete.toastOkDesc": "{name} のダウンロードが完了しました。", "dashboard.translate.complete.toastFailTitle": "失敗", "dashboard.translate.complete.toastFailDesc": "翻訳に失敗しました。もう一度お試しください。", "dashboard.translate.sourceDocument": "ソースドキュメント", @@ -7786,6 +8993,8 @@ const messages: Record> = { "dashboard.translate.pipeline.translate": "翻訳", "dashboard.translate.pipeline.rebuild": "再構築", "dashboard.translate.pipeline.finalize": "完了", + "dashboard.translate.progress.processingFallback": "処理中…", + "dashboard.translate.progress.connectionLost": "接続が失われました。再試行中…", "dashboard.translate.progress.failedTitle": "翻訳失敗", "dashboard.translate.error.unexpected": "予期しないエラーが発生しました。もう一度お試しください。", "dashboard.translate.error.noResult": "翻訳結果が得られませんでした。ドキュメントにテキストが含まれていることを確認し、再試行するか別のエンジンを選択してください。", @@ -7850,6 +9059,8 @@ const messages: Record> = { "glossaries.dialog.dropTitle": "CSVファイルをここにドラッグ", "glossaries.dialog.dropOr": "または", "glossaries.dialog.dropFormats": "CSV、TSV、TXT", + "glossaries.termEditor.addTerm": "用語を追加", + "glossaries.termEditor.maxReached": "用語集ごとに最大 {max} 語に達しました。", "glossaries.dialog.formatTitle": "形式", "glossaries.dialog.formatDesc": "原文,訳文(1行につき1組)", "glossaries.dialog.formatNote": "ヘッダーが検出された場合、最初の行はスキップされます", @@ -7945,6 +9156,8 @@ const messages: Record> = { "glossaries.badge.compatible": "Compatible", "glossaries.badge.otherTarget": "Autre cible", "glossaries.card.editTerms": "Modifier les termes", + "glossaries.card.created": "作成日", + "glossaries.card.term": "用語", "glossaries.card.delete": "Supprimer", "glossaries.grid.searchPlaceholder": "Search a glossary…", "glossaries.grid.noResults": "No results for this search.", @@ -8185,6 +9398,10 @@ const messages: Record> = { "login.signIn": "Sign In", "login.noAccount": "Don't have an account?", "login.signUpFree": "Sign up for free", + "login.orContinueWith": "またはメールで続行", + "login.google.connecting": "接続中…", + "login.google.errorGeneric": "Google ログインでエラーが発生しました。", + "login.google.errorFailed": "Google ログインに失敗しました。もう一度お試しください。", "forgotPassword.enterEmail": "Please enter your email address", "forgotPassword.error": "An error occurred", "forgotPassword.title": "Forgot Password", @@ -8479,6 +9696,7 @@ const messages: Record> = { "memento.ctaMore": "詳しく見る", "common.backToHome": "ホームに戻る", "dashboard.topbar.interfaceLabel": "翻訳インターフェース", + "dashboard.topbar.premiumAccess": "プレミアムアクセス", "landing.hero.contextEngine": "翻訳検出:HVACシステムの技術保守用語...", "landing.hero.liveAnalysis": "リアルタイム分析", "landing.hero.termsDetected": "件の用語を検出", @@ -8499,6 +9717,144 @@ const messages: Record> = { "landing.translate.aiAnalysis": "AI分析アクティブ", "landing.translate.processing": "処理中", "landing.translate.preservingLayout": "レイアウトを保持しています", + "layout.nav.apiAccess": "API アクセス", + "layout.footer.terms": "利用規約", + "layout.footer.privacy": "プライバシー", + "fileUploader.uploadDocument": "ドキュメントをアップロード", + "fileUploader.uploadDesc": "ファイルをドラッグ&ドロップまたはクリックして選択 (Excel, Word, PowerPoint)", + "fileUploader.dropHere": "ここにファイルをドロップ…", + "fileUploader.dragAndDrop": "ここにドキュメントをドラッグ&ドロップ", + "fileUploader.orClickBrowse": "またはクリックして参照", + "fileUploader.preview": "プレビュー", + "fileUploader.translationOptions": "翻訳オプション", + "fileUploader.configureSettings": "翻訳設定を構成する", + "fileUploader.targetLanguage": "翻訳先の言語", + "fileUploader.selectLanguage": "言語を選択", + "fileUploader.translationProvider": "翻訳プロバイダー", + "fileUploader.selectProvider": "プロバイダーを選択", + "fileUploader.advancedOptions": "詳細オプション", + "fileUploader.translateImages": "画像を翻訳", + "fileUploader.translating": "翻訳中…", + "fileUploader.translateDocument": "ドキュメントを翻訳", + "fileUploader.processing": "処理中…", + "fileUploader.translationError": "翻訳エラー", + "fileUploader.translationComplete": "翻訳完了!", + "fileUploader.translationCompleteDesc": "書式をすべて保持したまま、ドキュメントの翻訳が完了しました。", + "fileUploader.download": "翻訳済みドキュメントをダウンロード", + "fileUploader.webgpuUnsupported": "このブラウザは WebGPU に対応していません。Chrome 113+ または Edge 113+ を使用してください。", + "fileUploader.webllmNotLoaded": "WebLLM モデルが読み込まれていません。設定 > 翻訳サービスからモデルを読み込んでください。", + "fileUploader.extracting": "ドキュメントからテキストを抽出中…", + "fileUploader.noTranslatable": "ドキュメントに翻訳可能なテキストが見つかりません", + "fileUploader.foundTexts": "{count} 件の翻訳対象テキストが見つかりました", + "fileUploader.translatingItem": "翻訳中 {current}/{total}: 「{preview}」", + "fileUploader.reconstructing": "ドキュメントを再構築中…", + "fileUploader.translatingLocally": "WebLLM でローカル翻訳中…", + "checkout.activating": "有効化中…", + "checkout.activatingDesc": "サブスクリプションを更新中です。しばらくお待ちください。", + "checkout.paymentConfirmed": "支払いを確認しました!", + "checkout.subscriptionActivated": "サブスクリプションが有効化されました!", + "checkout.planActivated": "{plan} プランが有効化されました!", + "checkout.redirectingToProfile": "プロフィールにリダイレクト中…", + "checkout.paymentReceived": "支払いを受領しました", + "checkout.redirecting": "リダイレクト中…", + "checkout.syncError": "同期エラー", + "checkout.networkError": "ネットワークエラー。お支払いは確認済みです — プロフィールを再読み込みしてください。", + "dashboard.checkoutSyncError": "支払いの同期エラー。", + "dashboard.networkRefresh": "ネットワークエラー。ページを更新してください。", + "dashboard.continueToTranslate": "翻訳に進む", + "langSelector.search": "検索…", + "langSelector.noResults": "結果なし", + "langSelector.source": "翻訳元", + "langSelector.target": "翻訳先", + "langSelector.swap": "入れ替え", + "translateComplete.highQuality": "高品質", + "translateComplete.segments": "セグメント", + "translateComplete.characters": "文字", + "translateComplete.confidence": "信頼度", + "providerTheme.deepseek.badge": "エッセンシャル", + "providerTheme.deepseek.subBadge": "技術とエコ", + "providerTheme.deepseek.desc": "超高精度で経済的な翻訳。技術文書やコードに最適。", + "providerTheme.openai.badge": "プレミアム", + "providerTheme.openai.subBadge": "高忠実度", + "providerTheme.openai.desc": "AIの世界標準。テキストの一貫性を最大化し、スタイルを厳格に守ります。", + "providerTheme.minimax.badge": "上級", + "providerTheme.minimax.subBadge": "パフォーマンス", + "providerTheme.minimax.desc": "驚異的な実行速度と複雑な構造の優れた理解。", + "providerTheme.openrouter.badge": "エクスプレス", + "providerTheme.openrouter.subBadge": "マルチモデル", + "providerTheme.openrouter.desc": "翻訳に最適化された最高のオープンソースモデルへの統一アクセス。", + "providerTheme.openrouter_premium.badge": "ウルトラ", + "providerTheme.openrouter_premium.subBadge": "最大コンテキスト", + "providerTheme.openrouter_premium.desc": "GPT-4o、Claude Sonnet 4.6 などの最先端モデルによる長文支援。", + "providerTheme.zai.badge": "特化型", + "providerTheme.zai.subBadge": "金融と法律", + "providerTheme.zai.desc": "要求の厳しいビジネス用語 (法務、金融) 向けに微調整されたモデル。", + "providerTheme.default.badge": "モダン", + "providerTheme.default.subBadge": "AI 推論", + "providerTheme.default.desc": "大規模言語モデル (LLM) による、高度な意味分析を伴う翻訳。", + "providerTheme.classic.google.label": "Google 翻訳", + "providerTheme.classic.google.desc": "130 以上の言語に対応する超高速翻訳。一般的なフローにおすすめです。", + "providerTheme.classic.deepl.label": "DeepL Pro", + "providerTheme.classic.deepl.desc": "流暢さと自然な表現で知られる高精度翻訳。", + "providerTheme.classic.google_cloud.label": "Google Cloud API", + "providerTheme.classic.google_cloud.desc": "大量ドキュメント処理に最適化されたプロフェッショナル向けクラウドエンジン。", + "providerSelector.noClassic": "利用可能な標準翻訳者はありません。", + "providerSelector.noLlm": "AI モデルが設定されていません。", + "providerSelector.costOne": "料金: 1 ページあたり 1 クレジット", + "providerSelector.costFive": "料金: 1 ページあたり 5 クレジット (プレミアム係数)", + "providerSelector.unlockContextual": "ドキュメント全体の高品質コンテキスト翻訳をアンロック。", + "translate.header.processing": "処理中", + "translate.header.aiActive": "AI 分析アクティブ", + "translate.header.aiActiveDesc": "レイアウトはコンテキストエンジンによって保持されています。", + "translate.header.completed": "完了", + "translate.header.completedTitle": "翻訳完了", + "translate.header.proSpace": "Pro スペース", + "translate.header.translateDoc": "ドキュメントを翻訳", + "translate.header.translateDocDesc": "超高忠実度の翻訳エンジンで元のレイアウトを保持します。", + "translate.upload.nativeFormat": "ネイティブ形式", + "translate.fileType.word": "Word (.docx)", + "translate.fileType.excel": "Excel (.xlsx)", + "translate.fileType.slides": "スライド (.pptx)", + "translate.fileType.pdf": "PDF (.pdf)", + "translate.startTranslation": "翻訳を開始", + "translate.submit": "送信中…", + "translate.chooseTargetLang": "翻訳先の言語を選択してください", + "translate.pleaseLoadFile": "まずファイルをアップロードしてください", + "translate.contextEngineActive": "コンテキストエンジン作動中", + "translate.phase1": "フェーズ 1: 初期化", + "translate.phase2": "フェーズ 2: コンテキスト再構築", + "translate.stat.segments": "セグメント", + "translate.stat.precision": "精度", + "translate.stat.speedLabel": "速度", + "translate.stat.turbo": "ターボ", + "translate.stat.time": "時間", + "translate.complete.masterQuality": "✓ マスター品質", + "translate.download": "ダウンロード", + "translate.newTranslation": "+ 新しい翻訳", + "translate.failedTitle": "翻訳エラー", + "translate.retry": "再試行", + "translate.uploadAnother": "別のファイルをアップロード", + "translate.monitor": "AI モニター", + "translate.summary": "サマリー", + "translate.cancelProcess": "⟳ プロセスをキャンセル", + "translate.layoutIntegrity": "レイアウト整合性", + "translate.secureHundred": "100% 安全", + "translate.okHundred": "100% OK", + "translate.preserveLayout": "レイアウトを保持", + "translate.preserveLayoutDesc": "レイアウトを保持", + "translate.textOnly": "テキストのみ", + "translate.textOnlyDesc": "テキストのみの高速翻訳", + "translate.unavailableStandard": "標準モードでは利用できません (AI のみ)", + "apiKeys.noKeysGenerated": "キーは生成されていません", + "apiKeys.copied": "コピーしました!", + "services.fallback.google.label": "Google 翻訳", + "services.fallback.google.desc": "高速翻訳、130 以上の言語", + "settings.formats.excel.name": "Excel", + "settings.formats.word.name": "Word", + "settings.formats.powerpoint.name": "PowerPoint", + "pricing.dashboard": "ダッシュボード", + "pricing.okSymbol": "✓", + "pricing.errSymbol": "✕", }, // ═══════════════════════════════════════════════════════════════ // KOREAN (ko) @@ -8686,6 +10042,7 @@ const messages: Record> = { "dashboard.translate.complete.download": "다운로드", "dashboard.translate.complete.newTranslation": "새 번역", "dashboard.translate.complete.toastOkTitle": "성공", + "dashboard.translate.complete.toastOkDesc": "{name} 다운로드가 완료되었습니다.", "dashboard.translate.complete.toastFailTitle": "실패", "dashboard.translate.complete.toastFailDesc": "번역에 실패했습니다. 다시 시도해 주세요.", "dashboard.translate.sourceDocument": "원본 문서", @@ -8714,6 +10071,8 @@ const messages: Record> = { "dashboard.translate.pipeline.translate": "번역", "dashboard.translate.pipeline.rebuild": "재구성", "dashboard.translate.pipeline.finalize": "완료", + "dashboard.translate.progress.processingFallback": "처리 중…", + "dashboard.translate.progress.connectionLost": "연결이 끊어졌습니다. 재시도 중…", "dashboard.translate.progress.failedTitle": "번역 실패", "dashboard.translate.error.unexpected": "예기치 않은 오류가 발생했습니다. 다시 시도해 주세요.", "dashboard.translate.error.noResult": "번역 결과가 없습니다. 문서에 텍스트가 포함되어 있는지 확인하고 다시 시도하거나 다른 엔진을 선택하세요.", @@ -8778,6 +10137,8 @@ const messages: Record> = { "glossaries.dialog.dropTitle": "CSV 파일을 여기로 드래그하세요", "glossaries.dialog.dropOr": "또는", "glossaries.dialog.dropFormats": "CSV, TSV, TXT", + "glossaries.termEditor.addTerm": "용어 추가", + "glossaries.termEditor.maxReached": "용어집당 최대 {max}개 용어에 도달했습니다.", "glossaries.dialog.formatTitle": "형식", "glossaries.dialog.formatDesc": "원본,대상 (한 줄에 하나씩)", "glossaries.dialog.formatNote": "헤더가 감지되면 첫 줄은 건너뜁니다", @@ -8873,6 +10234,8 @@ const messages: Record> = { "glossaries.badge.compatible": "Compatible", "glossaries.badge.otherTarget": "Autre cible", "glossaries.card.editTerms": "Modifier les termes", + "glossaries.card.created": "생성됨", + "glossaries.card.term": "용어", "glossaries.card.delete": "Supprimer", "glossaries.grid.searchPlaceholder": "Search a glossary…", "glossaries.grid.noResults": "No results for this search.", @@ -9113,6 +10476,10 @@ const messages: Record> = { "login.signIn": "Sign In", "login.noAccount": "Don't have an account?", "login.signUpFree": "Sign up for free", + "login.orContinueWith": "또는 이메일로 계속", + "login.google.connecting": "연결 중…", + "login.google.errorGeneric": "Google 로그인 중 문제가 발생했습니다.", + "login.google.errorFailed": "Google 로그인에 실패했습니다. 다시 시도해 주세요.", "forgotPassword.enterEmail": "Please enter your email address", "forgotPassword.error": "An error occurred", "forgotPassword.title": "Forgot Password", @@ -9407,6 +10774,7 @@ const messages: Record> = { "memento.ctaMore": "자세히 보기", "common.backToHome": "홈으로 돌아가기", "dashboard.topbar.interfaceLabel": "번역 인터페이스", + "dashboard.topbar.premiumAccess": "프리미엄 액세스", "landing.hero.contextEngine": "번역 감지됨: HVAC 시스템 기술 유지보수 용어...", "landing.hero.liveAnalysis": "실시간 분석", "landing.hero.termsDetected": "개 용어 감지됨", @@ -9427,6 +10795,144 @@ const messages: Record> = { "landing.translate.aiAnalysis": "AI 분석 활성", "landing.translate.processing": "처리 중", "landing.translate.preservingLayout": "레이아웃이 보존되고 있습니다", + "layout.nav.apiAccess": "API 액세스", + "layout.footer.terms": "약관", + "layout.footer.privacy": "개인정보", + "fileUploader.uploadDocument": "문서 업로드", + "fileUploader.uploadDesc": "파일을 끌어다 놓거나 클릭하여 선택 (Excel, Word, PowerPoint)", + "fileUploader.dropHere": "파일을 여기에 놓으세요…", + "fileUploader.dragAndDrop": "여기에 문서를 끌어다 놓으세요", + "fileUploader.orClickBrowse": "또는 클릭하여 찾아보기", + "fileUploader.preview": "미리보기", + "fileUploader.translationOptions": "번역 옵션", + "fileUploader.configureSettings": "번역 설정 구성", + "fileUploader.targetLanguage": "대상 언어", + "fileUploader.selectLanguage": "언어 선택", + "fileUploader.translationProvider": "번역 공급자", + "fileUploader.selectProvider": "공급자 선택", + "fileUploader.advancedOptions": "고급 옵션", + "fileUploader.translateImages": "이미지 번역", + "fileUploader.translating": "번역 중…", + "fileUploader.translateDocument": "문서 번역", + "fileUploader.processing": "처리 중…", + "fileUploader.translationError": "번역 오류", + "fileUploader.translationComplete": "번역 완료!", + "fileUploader.translationCompleteDesc": "서식을 모두 유지한 채 문서가 성공적으로 번역되었습니다.", + "fileUploader.download": "번역된 문서 다운로드", + "fileUploader.webgpuUnsupported": "이 브라우저는 WebGPU를 지원하지 않습니다. Chrome 113+ 또는 Edge 113+를 사용하세요.", + "fileUploader.webllmNotLoaded": "WebLLM 모델이 로드되지 않았습니다. 설정 > 번역 서비스에서 모델을 먼저 로드하세요.", + "fileUploader.extracting": "문서에서 텍스트 추출 중…", + "fileUploader.noTranslatable": "문서에서 번역 가능한 텍스트를 찾을 수 없음", + "fileUploader.foundTexts": "번역할 텍스트 {count}개 발견", + "fileUploader.translatingItem": "번역 중 {current}/{total}: \"{preview}\"", + "fileUploader.reconstructing": "문서 재구성 중…", + "fileUploader.translatingLocally": "WebLLM으로 로컬 번역 중…", + "checkout.activating": "활성화 중…", + "checkout.activatingDesc": "구독을 업데이트 중입니다. 잠시 기다려 주세요.", + "checkout.paymentConfirmed": "결제 확인됨!", + "checkout.subscriptionActivated": "구독이 활성화되었습니다!", + "checkout.planActivated": "{plan} 요금제가 활성화되었습니다!", + "checkout.redirectingToProfile": "프로필로 리디렉션 중…", + "checkout.paymentReceived": "결제 받음", + "checkout.redirecting": "리디렉션 중…", + "checkout.syncError": "동기화 오류", + "checkout.networkError": "네트워크 오류. 결제가 확인되었습니다 — 프로필을 새로 고치세요.", + "dashboard.checkoutSyncError": "결제 동기화 오류.", + "dashboard.networkRefresh": "네트워크 오류. 페이지를 새로 고치세요.", + "dashboard.continueToTranslate": "번역으로 계속", + "langSelector.search": "검색…", + "langSelector.noResults": "결과 없음", + "langSelector.source": "원본", + "langSelector.target": "대상", + "langSelector.swap": "교환", + "translateComplete.highQuality": "고품질", + "translateComplete.segments": "세그먼트", + "translateComplete.characters": "문자", + "translateComplete.confidence": "신뢰도", + "providerTheme.deepseek.badge": "필수", + "providerTheme.deepseek.subBadge": "기술 및 경제", + "providerTheme.deepseek.desc": "초정밀 경제적 번역. 기술 문서 및 코드에 이상적.", + "providerTheme.openai.badge": "프리미엄", + "providerTheme.openai.subBadge": "고충실도", + "providerTheme.openai.desc": "세계적 AI 표준. 최대 텍스트 일관성과 엄격한 스타일 준수.", + "providerTheme.minimax.badge": "고급", + "providerTheme.minimax.subBadge": "성능", + "providerTheme.minimax.desc": "놀라운 실행 속도와 복잡한 구조에 대한 뛰어난 이해.", + "providerTheme.openrouter.badge": "익스프레스", + "providerTheme.openrouter.subBadge": "멀티 모델", + "providerTheme.openrouter.desc": "번역에 최적화된 최고의 오픈소스 모델에 대한 통합 액세스.", + "providerTheme.openrouter_premium.badge": "울트라", + "providerTheme.openrouter_premium.subBadge": "최대 컨텍스트", + "providerTheme.openrouter_premium.desc": "최신 모델(GPT-4o, Claude Sonnet 4.6)의 지원을 받는 긴 문서 번역.", + "providerTheme.zai.badge": "전문", + "providerTheme.zai.subBadge": "금융 및 법률", + "providerTheme.zai.desc": "까다로운 비즈니스 용어(법률, 금융)에 맞게 미세 조정된 모델.", + "providerTheme.default.badge": "모던", + "providerTheme.default.subBadge": "AI 추론", + "providerTheme.default.desc": "대규모 언어 모델(LLM) 번역, 고급 의미 분석 포함.", + "providerTheme.classic.google.label": "Google 번역", + "providerTheme.classic.google.desc": "130개 이상의 언어를 지원하는 초고속 번역. 일반적인 워크플로에 권장.", + "providerTheme.classic.deepl.label": "DeepL Pro", + "providerTheme.classic.deepl.desc": "유창함과 자연스러운 표현으로 유명한 고정밀 번역.", + "providerTheme.classic.google_cloud.label": "Google Cloud API", + "providerTheme.classic.google_cloud.desc": "대용량 문서 처리에 최적화된 전문 클라우드 엔진.", + "providerSelector.noClassic": "사용 가능한 표준 번역기가 없습니다.", + "providerSelector.noLlm": "구성된 AI 모델이 없습니다.", + "providerSelector.costOne": "비용: 페이지당 1 크레딧", + "providerSelector.costFive": "비용: 페이지당 5 크레딧 (프리미엄 요율)", + "providerSelector.unlockContextual": "전체 문서를 위한 프리미엄 컨텍스트 번역 잠금 해제.", + "translate.header.processing": "처리 진행 중", + "translate.header.aiActive": "AI 분석 활성", + "translate.header.aiActiveDesc": "레이아웃이 컨텍스트 엔진에 의해 보존되고 있습니다.", + "translate.header.completed": "완료됨", + "translate.header.completedTitle": "번역 완료", + "translate.header.proSpace": "Pro 공간", + "translate.header.translateDoc": "문서 번역", + "translate.header.translateDocDesc": "초고충실도 번역 엔진으로 원본 레이아웃을 유지하세요.", + "translate.upload.nativeFormat": "네이티브 형식", + "translate.fileType.word": "Word (.docx)", + "translate.fileType.excel": "Excel (.xlsx)", + "translate.fileType.slides": "슬라이드 (.pptx)", + "translate.fileType.pdf": "PDF (.pdf)", + "translate.startTranslation": "번역 시작", + "translate.submit": "제출 중…", + "translate.chooseTargetLang": "대상 언어를 선택하세요", + "translate.pleaseLoadFile": "먼저 파일을 업로드하세요", + "translate.contextEngineActive": "컨텍스트 엔진 활성", + "translate.phase1": "1단계: 초기화", + "translate.phase2": "2단계: 컨텍스트 재구성", + "translate.stat.segments": "세그먼트", + "translate.stat.precision": "정밀도", + "translate.stat.speedLabel": "속도", + "translate.stat.turbo": "터보", + "translate.stat.time": "시간", + "translate.complete.masterQuality": "✓ 마스터 품질", + "translate.download": "다운로드", + "translate.newTranslation": "+ 새 번역", + "translate.failedTitle": "번역 오류", + "translate.retry": "재시도", + "translate.uploadAnother": "다른 파일 업로드", + "translate.monitor": "AI 모니터", + "translate.summary": "요약", + "translate.cancelProcess": "⟳ 프로세스 취소", + "translate.layoutIntegrity": "레이아웃 무결성", + "translate.secureHundred": "100% 안전", + "translate.okHundred": "100% OK", + "translate.preserveLayout": "레이아웃 유지", + "translate.preserveLayoutDesc": "레이아웃 유지", + "translate.textOnly": "텍스트만", + "translate.textOnlyDesc": "텍스트만 빠른 번역", + "translate.unavailableStandard": "표준 모드에서 사용 불가 (AI만)", + "apiKeys.noKeysGenerated": "생성된 키 없음", + "apiKeys.copied": "복사됨!", + "services.fallback.google.label": "Google 번역", + "services.fallback.google.desc": "빠른 번역, 130개 이상의 언어", + "settings.formats.excel.name": "Excel", + "settings.formats.word.name": "Word", + "settings.formats.powerpoint.name": "PowerPoint", + "pricing.dashboard": "대시보드", + "pricing.okSymbol": "✓", + "pricing.errSymbol": "✕", }, // ═══════════════════════════════════════════════════════════════ // CHINESE SIMPLIFIED (zh) @@ -9453,6 +10959,10 @@ const messages: Record> = { "cookieConsent.acceptAll": "全部接受", "cookieConsent.essentialOnly": "仅限必要", "cookieConsent.learnMore": "了解更多", + "login.orContinueWith": "或使用电子邮件继续", + "login.google.connecting": "连接中…", + "login.google.errorGeneric": "Google 登录时出现问题。", + "login.google.errorFailed": "Google 登录失败。请重试。", "landing.nav.why": "为什么选择我们", "landing.nav.formats": "支持格式", "landing.nav.pricing": "定价", @@ -9614,6 +11124,7 @@ const messages: Record> = { "dashboard.translate.complete.download": "下载", "dashboard.translate.complete.newTranslation": "新建翻译", "dashboard.translate.complete.toastOkTitle": "成功", + "dashboard.translate.complete.toastOkDesc": "{name} 已成功下载。", "dashboard.translate.complete.toastFailTitle": "失败", "dashboard.translate.complete.toastFailDesc": "翻译失败,请重试。", "dashboard.translate.sourceDocument": "源文档", @@ -9642,6 +11153,8 @@ const messages: Record> = { "dashboard.translate.pipeline.translate": "翻译", "dashboard.translate.pipeline.rebuild": "重建", "dashboard.translate.pipeline.finalize": "完成", + "dashboard.translate.progress.processingFallback": "处理中…", + "dashboard.translate.progress.connectionLost": "连接已断开。正在重试…", "dashboard.translate.progress.failedTitle": "翻译失败", "dashboard.translate.error.unexpected": "发生了意外错误,请重试。", "dashboard.translate.error.noResult": "翻译未产生结果。请确认文档包含文本,然后重试或选择其他引擎。", @@ -9706,6 +11219,8 @@ const messages: Record> = { "glossaries.dialog.dropTitle": "将 CSV 文件拖到此处", "glossaries.dialog.dropOr": "或", "glossaries.dialog.dropFormats": "CSV、TSV、TXT", + "glossaries.termEditor.addTerm": "添加术语", + "glossaries.termEditor.maxReached": "每个术语表最多 {max} 个术语。", "glossaries.dialog.formatTitle": "格式", "glossaries.dialog.formatDesc": "源语言,目标语言(每行一对)", "glossaries.dialog.formatNote": "如检测到表头则跳过首行", @@ -9801,6 +11316,8 @@ const messages: Record> = { "glossaries.badge.compatible": "Compatible", "glossaries.badge.otherTarget": "Autre cible", "glossaries.card.editTerms": "Modifier les termes", + "glossaries.card.created": "已创建", + "glossaries.card.term": "术语", "glossaries.card.delete": "Supprimer", "glossaries.grid.searchPlaceholder": "Search a glossary…", "glossaries.grid.noResults": "No results for this search.", @@ -10293,6 +11810,7 @@ const messages: Record> = { "memento.ctaMore": "了解更多", "common.backToHome": "返回首页", "dashboard.topbar.interfaceLabel": "翻译界面", + "dashboard.topbar.premiumAccess": "高级访问", "landing.hero.contextEngine": "检测到翻译:HVAC 系统技术维护术语...", "landing.hero.liveAnalysis": "实时分析", "landing.hero.termsDetected": "个术语已检测", @@ -10313,6 +11831,144 @@ const messages: Record> = { "landing.translate.aiAnalysis": "AI 分析中", "landing.translate.processing": "正在处理", "landing.translate.preservingLayout": "正在保留您的排版", + "layout.nav.apiAccess": "API 访问", + "layout.footer.terms": "条款", + "layout.footer.privacy": "隐私", + "fileUploader.uploadDocument": "上传文档", + "fileUploader.uploadDesc": "拖放或点击选择文件 (Excel, Word, PowerPoint)", + "fileUploader.dropHere": "将文件拖到此处…", + "fileUploader.dragAndDrop": "将文档拖到此处", + "fileUploader.orClickBrowse": "或点击浏览", + "fileUploader.preview": "预览", + "fileUploader.translationOptions": "翻译选项", + "fileUploader.configureSettings": "配置翻译设置", + "fileUploader.targetLanguage": "目标语言", + "fileUploader.selectLanguage": "选择语言", + "fileUploader.translationProvider": "翻译服务提供商", + "fileUploader.selectProvider": "选择提供商", + "fileUploader.advancedOptions": "高级选项", + "fileUploader.translateImages": "翻译图片", + "fileUploader.translating": "翻译中…", + "fileUploader.translateDocument": "翻译文档", + "fileUploader.processing": "处理中…", + "fileUploader.translationError": "翻译错误", + "fileUploader.translationComplete": "翻译完成!", + "fileUploader.translationCompleteDesc": "您的文档已成功翻译,并保留了所有格式。", + "fileUploader.download": "下载翻译后的文档", + "fileUploader.webgpuUnsupported": "此浏览器不支持 WebGPU。请使用 Chrome 113+ 或 Edge 113+。", + "fileUploader.webllmNotLoaded": "WebLLM 模型未加载。请前往设置 > 翻译服务 加载模型。", + "fileUploader.extracting": "正在从文档中提取文本…", + "fileUploader.noTranslatable": "文档中未找到可翻译的文本", + "fileUploader.foundTexts": "找到 {count} 个要翻译的文本", + "fileUploader.translatingItem": "正在翻译 {current}/{total}: \"{preview}\"", + "fileUploader.reconstructing": "正在重建文档…", + "fileUploader.translatingLocally": "正在使用 WebLLM 本地翻译…", + "checkout.activating": "正在激活…", + "checkout.activatingDesc": "我们正在更新您的订阅,请稍候。", + "checkout.paymentConfirmed": "支付已确认!", + "checkout.subscriptionActivated": "订阅已激活!", + "checkout.planActivated": "{plan} 套餐已激活!", + "checkout.redirectingToProfile": "正在跳转到您的个人资料…", + "checkout.paymentReceived": "已收到付款", + "checkout.redirecting": "正在跳转…", + "checkout.syncError": "同步错误", + "checkout.networkError": "网络错误。您的付款已确认 — 请重新加载您的个人资料。", + "dashboard.checkoutSyncError": "同步付款时出错。", + "dashboard.networkRefresh": "网络错误。请刷新页面。", + "dashboard.continueToTranslate": "继续翻译", + "langSelector.search": "搜索…", + "langSelector.noResults": "无结果", + "langSelector.source": "源", + "langSelector.target": "目标", + "langSelector.swap": "交换", + "translateComplete.highQuality": "高质量", + "translateComplete.segments": "段落", + "translateComplete.characters": "字符", + "translateComplete.confidence": "置信度", + "providerTheme.deepseek.badge": "基础", + "providerTheme.deepseek.subBadge": "技术与经济", + "providerTheme.deepseek.desc": "超精准且经济的翻译,非常适合技术文档和代码。", + "providerTheme.openai.badge": "高级", + "providerTheme.openai.subBadge": "高保真", + "providerTheme.openai.desc": "全球 AI 标准。最大化的文本一致性和严格的风格尊重。", + "providerTheme.minimax.badge": "高级", + "providerTheme.minimax.subBadge": "性能", + "providerTheme.minimax.desc": "惊人的执行速度和对复杂结构的出色理解。", + "providerTheme.openrouter.badge": "快速", + "providerTheme.openrouter.subBadge": "多模型", + "providerTheme.openrouter.desc": "统一访问为翻译优化的最佳开源模型。", + "providerTheme.openrouter_premium.badge": "超级", + "providerTheme.openrouter_premium.subBadge": "最大上下文", + "providerTheme.openrouter_premium.desc": "由尖端模型(GPT-4o、Claude Sonnet 4.6)辅助,适用于长文档。", + "providerTheme.zai.badge": "专业", + "providerTheme.zai.subBadge": "金融与法律", + "providerTheme.zai.desc": "针对苛刻的业务术语(法律、金融)进行了微调的模型。", + "providerTheme.default.badge": "现代", + "providerTheme.default.subBadge": "AI 推理", + "providerTheme.default.desc": "大型语言模型 (LLM) 翻译,具有高级语义分析。", + "providerTheme.classic.google.label": "Google 翻译", + "providerTheme.classic.google.desc": "覆盖 130 多种语言的超快速翻译。建议用于一般流程。", + "providerTheme.classic.deepl.label": "DeepL Pro", + "providerTheme.classic.deepl.desc": "以流畅和自然的措辞著称的高精度翻译。", + "providerTheme.classic.google_cloud.label": "Google Cloud API", + "providerTheme.classic.google_cloud.desc": "针对处理大量文档进行优化的专业云端引擎。", + "providerSelector.noClassic": "没有可用的标准翻译器。", + "providerSelector.noLlm": "未配置 AI 模型。", + "providerSelector.costOne": "费用:每页 1 积分", + "providerSelector.costFive": "费用:每页 5 积分(高级系数)", + "providerSelector.unlockContextual": "为您的整个文档解锁高级上下文翻译。", + "translate.header.processing": "正在处理", + "translate.header.aiActive": "AI 分析已激活", + "translate.header.aiActiveDesc": "您的布局正在由我们的上下文引擎保留。", + "translate.header.completed": "已完成", + "translate.header.completedTitle": "翻译完成", + "translate.header.proSpace": "专业版空间", + "translate.header.translateDoc": "翻译文档", + "translate.header.translateDocDesc": "通过我们超高保真度翻译引擎保留原始布局。", + "translate.upload.nativeFormat": "原生格式", + "translate.fileType.word": "Word (.docx)", + "translate.fileType.excel": "Excel (.xlsx)", + "translate.fileType.slides": "幻灯片 (.pptx)", + "translate.fileType.pdf": "PDF (.pdf)", + "translate.startTranslation": "开始翻译", + "translate.submit": "提交中…", + "translate.chooseTargetLang": "请选择目标语言", + "translate.pleaseLoadFile": "请先上传文件", + "translate.contextEngineActive": "上下文引擎已激活", + "translate.phase1": "阶段 1:初始化", + "translate.phase2": "阶段 2:上下文重建", + "translate.stat.segments": "段落", + "translate.stat.precision": "精度", + "translate.stat.speedLabel": "速度", + "translate.stat.turbo": "极速", + "translate.stat.time": "时间", + "translate.complete.masterQuality": "✓ 大师级品质", + "translate.download": "下载", + "translate.newTranslation": "+ 新建翻译", + "translate.failedTitle": "翻译错误", + "translate.retry": "重试", + "translate.uploadAnother": "上传其他文件", + "translate.monitor": "AI 监控", + "translate.summary": "摘要", + "translate.cancelProcess": "⟳ 取消流程", + "translate.layoutIntegrity": "布局完整性", + "translate.secureHundred": "100% 安全", + "translate.okHundred": "100% OK", + "translate.preserveLayout": "保留布局", + "translate.preserveLayoutDesc": "保留布局", + "translate.textOnly": "仅文本", + "translate.textOnlyDesc": "仅文本快速翻译", + "translate.unavailableStandard": "标准模式下不可用(仅 AI)", + "apiKeys.noKeysGenerated": "未生成密钥", + "apiKeys.copied": "已复制!", + "services.fallback.google.label": "Google 翻译", + "services.fallback.google.desc": "快速翻译,130 多种语言", + "settings.formats.excel.name": "Excel", + "settings.formats.word.name": "Word", + "settings.formats.powerpoint.name": "PowerPoint", + "pricing.dashboard": "仪表板", + "pricing.okSymbol": "✓", + "pricing.errSymbol": "✕", }, // ARABIC (ar) @@ -10339,6 +11995,10 @@ const messages: Record> = { "cookieConsent.acceptAll": "قبول الكل", "cookieConsent.essentialOnly": "الأساسية فقط", "cookieConsent.learnMore": "معرفة المزيد", + "login.orContinueWith": "أو تابع بالبريد الإلكتروني", + "login.google.connecting": "جارٍ الاتصال…", + "login.google.errorGeneric": "حدث خطأ في تسجيل الدخول عبر Google.", + "login.google.errorFailed": "فشل تسجيل الدخول عبر Google. حاول مرة أخرى.", "landing.nav.why": "لماذا نحن؟", "landing.nav.formats": "التنسيقات", "landing.nav.pricing": "الأسعار", @@ -10500,6 +12160,7 @@ const messages: Record> = { "dashboard.translate.complete.download": "تنزيل", "dashboard.translate.complete.newTranslation": "ترجمة جديدة", "dashboard.translate.complete.toastOkTitle": "تم بنجاح", + "dashboard.translate.complete.toastOkDesc": "تم تنزيل {name} بنجاح.", "dashboard.translate.complete.toastFailTitle": "فشل", "dashboard.translate.complete.toastFailDesc": "فشلت الترجمة. يرجى إعادة المحاولة.", "dashboard.translate.sourceDocument": "المستند المصدر", @@ -10528,6 +12189,8 @@ const messages: Record> = { "dashboard.translate.pipeline.translate": "ترجمة", "dashboard.translate.pipeline.rebuild": "إعادة بناء", "dashboard.translate.pipeline.finalize": "إنهاء", + "dashboard.translate.progress.processingFallback": "جارٍ المعالجة…", + "dashboard.translate.progress.connectionLost": "فُقد الاتصال. إعادة المحاولة…", "dashboard.translate.progress.failedTitle": "فشلت الترجمة", "dashboard.translate.error.unexpected": "حدث خطأ غير متوقع. يرجى المحاولة مرة أخرى.", "dashboard.translate.error.noResult": "لم تُنتج الترجمة أي نتائج. تحقق من أن المستند يحتوي على نص، ثم أعد المحاولة أو اختر محركًا آخر.", @@ -10592,6 +12255,8 @@ const messages: Record> = { "glossaries.dialog.dropTitle": "اسحب ملف CSV هنا", "glossaries.dialog.dropOr": "أو", "glossaries.dialog.dropFormats": "CSV, TSV, TXT", + "glossaries.termEditor.addTerm": "إضافة مصطلح", + "glossaries.termEditor.maxReached": "تم بلوغ الحد الأقصى {max} من المصطلحات لكل قاموس.", "glossaries.dialog.formatTitle": "التنسيق", "glossaries.dialog.formatDesc": "المصدر،الهدف (واحدة لكل سطر)", "glossaries.dialog.formatNote": "يُتجاهل السطر الأول عند اكتشاف ترويسة", @@ -10687,6 +12352,8 @@ const messages: Record> = { "glossaries.badge.compatible": "Compatible", "glossaries.badge.otherTarget": "Autre cible", "glossaries.card.editTerms": "Modifier les termes", + "glossaries.card.created": "تم الإنشاء", + "glossaries.card.term": "مصطلح", "glossaries.card.delete": "Supprimer", "glossaries.grid.searchPlaceholder": "Search a glossary…", "glossaries.grid.noResults": "No results for this search.", @@ -11179,6 +12846,7 @@ const messages: Record> = { "memento.ctaMore": "اعرف المزيد", "common.backToHome": "العودة للرئيسية", "dashboard.topbar.interfaceLabel": "واجهة الترجمة", + "dashboard.topbar.premiumAccess": "وصول مميز", "landing.hero.contextEngine": "ترجمة مكتشفة: مصطلح صيانة تقني لأنظمة التدفئة والتهوية...", "landing.hero.liveAnalysis": "تحليل مباشر", "landing.hero.termsDetected": "مصطلحات مكتشفة", @@ -11199,6 +12867,144 @@ const messages: Record> = { "landing.translate.aiAnalysis": "تحليل AI نشط", "landing.translate.processing": "جاري المعالجة", "landing.translate.preservingLayout": "جاري الحفاظ على التنسيق", + "layout.nav.apiAccess": "وصول API", + "layout.footer.terms": "الشروط", + "layout.footer.privacy": "الخصوصية", + "fileUploader.uploadDocument": "تحميل المستند", + "fileUploader.uploadDesc": "اسحب وأفلت أو انقر لتحديد ملف (Excel, Word, PowerPoint)", + "fileUploader.dropHere": "أفلت ملفك هنا…", + "fileUploader.dragAndDrop": "اسحب وأفلت المستند هنا", + "fileUploader.orClickBrowse": "أو انقر للتصفح", + "fileUploader.preview": "معاينة", + "fileUploader.translationOptions": "خيارات الترجمة", + "fileUploader.configureSettings": "اضبط إعدادات الترجمة", + "fileUploader.targetLanguage": "اللغة المستهدفة", + "fileUploader.selectLanguage": "اختر اللغة", + "fileUploader.translationProvider": "مزود الترجمة", + "fileUploader.selectProvider": "اختر المزود", + "fileUploader.advancedOptions": "خيارات متقدمة", + "fileUploader.translateImages": "ترجمة الصور", + "fileUploader.translating": "جارٍ الترجمة…", + "fileUploader.translateDocument": "ترجمة المستند", + "fileUploader.processing": "جارٍ المعالجة…", + "fileUploader.translationError": "خطأ في الترجمة", + "fileUploader.translationComplete": "اكتملت الترجمة!", + "fileUploader.translationCompleteDesc": "تمت ترجمة مستندك بنجاح مع الحفاظ على جميع التنسيقات.", + "fileUploader.download": "تنزيل المستند المترجم", + "fileUploader.webgpuUnsupported": "WebGPU غير مدعوم في هذا المتصفح. يرجى استخدام Chrome 113+ أو Edge 113+.", + "fileUploader.webllmNotLoaded": "نموذج WebLLM غير محمّل. اذهب إلى الإعدادات > خدمات الترجمة لتحميل نموذج أولاً.", + "fileUploader.extracting": "استخراج النصوص من المستند…", + "fileUploader.noTranslatable": "لم يتم العثور على نص قابل للترجمة في المستند", + "fileUploader.foundTexts": "تم العثور على {count} نصوص للترجمة", + "fileUploader.translatingItem": "ترجمة {current}/{total}: \"{preview}\"", + "fileUploader.reconstructing": "إعادة بناء المستند…", + "fileUploader.translatingLocally": "ترجمة محلية باستخدام WebLLM…", + "checkout.activating": "جارٍ التفعيل…", + "checkout.activatingDesc": "نقوم بتحديث اشتراكك، يرجى الانتظار.", + "checkout.paymentConfirmed": "تم تأكيد الدفع!", + "checkout.subscriptionActivated": "تم تفعيل الاشتراك!", + "checkout.planActivated": "تم تفعيل خطة {plan}!", + "checkout.redirectingToProfile": "إعادة التوجيه إلى ملفك الشخصي…", + "checkout.paymentReceived": "تم استلام الدفع", + "checkout.redirecting": "جارٍ إعادة التوجيه…", + "checkout.syncError": "خطأ في المزامنة", + "checkout.networkError": "خطأ في الشبكة. تم تأكيد الدفع — يرجى إعادة تحميل ملفك الشخصي.", + "dashboard.checkoutSyncError": "خطأ في مزامنة الدفع.", + "dashboard.networkRefresh": "خطأ في الشبكة. يرجى تحديث الصفحة.", + "dashboard.continueToTranslate": "متابعة إلى الترجمة", + "langSelector.search": "بحث…", + "langSelector.noResults": "لا توجد نتائج", + "langSelector.source": "المصدر", + "langSelector.target": "الهدف", + "langSelector.swap": "تبديل", + "translateComplete.highQuality": "جودة عالية", + "translateComplete.segments": "المقاطع", + "translateComplete.characters": "الأحرف", + "translateComplete.confidence": "الثقة", + "providerTheme.deepseek.badge": "أساسي", + "providerTheme.deepseek.subBadge": "تقني واقتصادي", + "providerTheme.deepseek.desc": "ترجمة فائقة الدقة واقتصادية، مثالية للمستندات التقنية والبرمجة.", + "providerTheme.openai.badge": "مميز", + "providerTheme.openai.subBadge": "دقة عالية", + "providerTheme.openai.desc": "معيار الذكاء الاصطناعي العالمي. أقصى اتساق نصي واحترام صارم للأسلوب.", + "providerTheme.minimax.badge": "متقدم", + "providerTheme.minimax.subBadge": "الأداء", + "providerTheme.minimax.desc": "سرعة تنفيذ مذهلة وفهم ممتاز للهياكل المعقدة.", + "providerTheme.openrouter.badge": "سريع", + "providerTheme.openrouter.subBadge": "متعدد النماذج", + "providerTheme.openrouter.desc": "وصول موحد إلى أفضل النماذج مفتوحة المصدر المحسّنة للترجمة.", + "providerTheme.openrouter_premium.badge": "فائق", + "providerTheme.openrouter_premium.subBadge": "السياق الأقصى", + "providerTheme.openrouter_premium.desc": "مدعوم من أحدث النماذج (GPT-4o، Claude Sonnet 4.6) للمستندات الطويلة.", + "providerTheme.zai.badge": "متخصص", + "providerTheme.zai.subBadge": "المال والقانون", + "providerTheme.zai.desc": "نموذج مضبوط بدقة للمصطلحات التجارية المتطلبة (قانونية، مالية).", + "providerTheme.default.badge": "حديث", + "providerTheme.default.subBadge": "تفكير الذكاء الاصطناعي", + "providerTheme.default.desc": "ترجمة بنموذج لغوي كبير (LLM) مع تحليل دلالي متقدم.", + "providerTheme.classic.google.label": "ترجمة Google", + "providerTheme.classic.google.desc": "ترجمة فائقة السرعة تغطي أكثر من 130 لغة. موصى بها للتدفقات العامة.", + "providerTheme.classic.deepl.label": "DeepL Pro", + "providerTheme.classic.deepl.desc": "ترجمة عالية الدقة مشهور بسيولتها وصياغاتها الطبيعية.", + "providerTheme.classic.google_cloud.label": "Google Cloud API", + "providerTheme.classic.google_cloud.desc": "محرك سحابي احترافي محسّن لمعالجة كميات كبيرة من المستندات.", + "providerSelector.noClassic": "لا يوجد مترجم قياسي متاح.", + "providerSelector.noLlm": "لم يتم تكوين نموذج ذكاء اصطناعي.", + "providerSelector.costOne": "التكلفة: رصيد واحد لكل صفحة", + "providerSelector.costFive": "التكلفة: 5 أرصدة لكل صفحة (عامل مميز)", + "providerSelector.unlockContextual": "افتح الترجمة السياقية المتميزة لمستنداتك بالكامل.", + "translate.header.processing": "جارٍ المعالجة", + "translate.header.aiActive": "تحليل الذكاء الاصطناعي نشط", + "translate.header.aiActiveDesc": "يتم الحفاظ على تخطيطك بواسطة محركنا السياقي.", + "translate.header.completed": "مكتمل", + "translate.header.completedTitle": "اكتملت الترجمة", + "translate.header.proSpace": "مساحة Pro", + "translate.header.translateDoc": "ترجمة مستند", + "translate.header.translateDocDesc": "حافظ على التخطيط الأصلي من خلال محرك الترجمة فائق الدقة.", + "translate.upload.nativeFormat": "التنسيق الأصلي", + "translate.fileType.word": "Word (.docx)", + "translate.fileType.excel": "Excel (.xlsx)", + "translate.fileType.slides": "شرائح (.pptx)", + "translate.fileType.pdf": "PDF (.pdf)", + "translate.startTranslation": "بدء الترجمة", + "translate.submit": "جارٍ الإرسال…", + "translate.chooseTargetLang": "يرجى اختيار لغة مستهدفة", + "translate.pleaseLoadFile": "يرجى تحميل ملف أولاً", + "translate.contextEngineActive": "المحرك السياقي نشط", + "translate.phase1": "المرحلة 1: التهيئة", + "translate.phase2": "المرحلة 2: إعادة البناء السياقي", + "translate.stat.segments": "مقاطع", + "translate.stat.precision": "الدقة", + "translate.stat.speedLabel": "السرعة", + "translate.stat.turbo": "تيربو", + "translate.stat.time": "الوقت", + "translate.complete.masterQuality": "✓ جودة رئيسية", + "translate.download": "تنزيل", + "translate.newTranslation": "+ ترجمة جديدة", + "translate.failedTitle": "خطأ في الترجمة", + "translate.retry": "إعادة المحاولة", + "translate.uploadAnother": "تحميل ملف آخر", + "translate.monitor": "مراقب الذكاء الاصطناعي", + "translate.summary": "ملخص", + "translate.cancelProcess": "⟳ إلغاء العملية", + "translate.layoutIntegrity": "سلامة التخطيط", + "translate.secureHundred": "100% آمن", + "translate.okHundred": "100% OK", + "translate.preserveLayout": "الحفاظ على التخطيط", + "translate.preserveLayoutDesc": "الحفاظ على التخطيط", + "translate.textOnly": "نص فقط", + "translate.textOnlyDesc": "ترجمة سريعة للنص فقط", + "translate.unavailableStandard": "غير متاح في الوضع القياسي (AI فقط)", + "apiKeys.noKeysGenerated": "لم يتم إنشاء مفاتيح", + "apiKeys.copied": "تم النسخ!", + "services.fallback.google.label": "ترجمة Google", + "services.fallback.google.desc": "ترجمة سريعة، أكثر من 130 لغة", + "settings.formats.excel.name": "Excel", + "settings.formats.word.name": "Word", + "settings.formats.powerpoint.name": "PowerPoint", + "pricing.dashboard": "لوحة التحكم", + "pricing.okSymbol": "✓", + "pricing.errSymbol": "✕", }, // PERSIAN (fa) @@ -11225,6 +13031,10 @@ const messages: Record> = { "cookieConsent.acceptAll": "پذیرش همه", "cookieConsent.essentialOnly": "فقط ضروری", "cookieConsent.learnMore": "بیشتر بدانید", + "login.orContinueWith": "یا با ایمیل ادامه دهید", + "login.google.connecting": "در حال اتصال…", + "login.google.errorGeneric": "خطایی در ورود با Google رخ داد.", + "login.google.errorFailed": "ورود با Google ناموفق بود. دوباره تلاش کنید.", "landing.nav.why": "چرا ما؟", "landing.nav.formats": "قالب‌ها", "landing.nav.pricing": "قیمت‌ها", @@ -11394,6 +13204,7 @@ const messages: Record> = { "dashboard.translate.complete.download": "دانلود", "dashboard.translate.complete.newTranslation": "ترجمه جدید", "dashboard.translate.complete.toastOkTitle": "موفقیت", + "dashboard.translate.complete.toastOkDesc": "{name} با موفقیت بارگیری شد.", "dashboard.translate.complete.toastFailTitle": "ناموفق", "dashboard.translate.complete.toastFailDesc": "ترجمه ناموفق بود. لطفاً دوباره تلاش کنید.", @@ -11423,6 +13234,8 @@ const messages: Record> = { "dashboard.translate.pipeline.translate": "ترجمه", "dashboard.translate.pipeline.rebuild": "بازسازی", "dashboard.translate.pipeline.finalize": "نهایی‌سازی", + "dashboard.translate.progress.processingFallback": "در حال پردازش…", + "dashboard.translate.progress.connectionLost": "اتصال قطع شد. در حال تلاش مجدد…", "dashboard.translate.progress.failedTitle": "ترجمه ناموفق", "dashboard.translate.error.unexpected": "خطای غیرمنتظره‌ای رخ داد. لطفاً دوباره تلاش کنید.", "dashboard.translate.error.noResult": "ترجمه نتیجه‌ای نداشت. تأیید کنید که سند حاوی متن است، سپس دوباره تلاش کنید یا موتور دیگری انتخاب کنید.", @@ -11487,6 +13300,8 @@ const messages: Record> = { "glossaries.dialog.dropTitle": "یک فایل CSV را اینجا بکشید", "glossaries.dialog.dropOr": "یا", "glossaries.dialog.dropFormats": "CSV, TSV, TXT", + "glossaries.termEditor.addTerm": "افزودن اصطلاح", + "glossaries.termEditor.maxReached": "حداکثر {max} اصطلاح برای هر واژه‌نامه رسیده است.", "glossaries.dialog.formatTitle": "فرمت", "glossaries.dialog.formatDesc": "مبدأ،مقصد (یکی در هر خط)", "glossaries.dialog.formatNote": "خط اول در صورت شناسایی سرستون نادیده گرفته می‌شود", @@ -11582,6 +13397,8 @@ const messages: Record> = { "glossaries.badge.compatible": "Compatible", "glossaries.badge.otherTarget": "Autre cible", "glossaries.card.editTerms": "Modifier les termes", + "glossaries.card.created": "ایجاد شد", + "glossaries.card.term": "اصطلاح", "glossaries.card.delete": "Supprimer", "glossaries.grid.searchPlaceholder": "Search a glossary…", "glossaries.grid.noResults": "No results for this search.", @@ -12101,6 +13918,7 @@ const messages: Record> = { "memento.ctaMore": "بیشتر بدانید", "common.backToHome": "بازگشت به صفحه اصلی", "dashboard.topbar.interfaceLabel": "رابط ترجمه", + "dashboard.topbar.premiumAccess": "دسترسی ویژه", "landing.hero.contextEngine": "ترجمه شناسایی شد: اصطلاح فنی نگهداری برای سیستم‌های تهویه...", "landing.hero.liveAnalysis": "تحلیل زنده", "landing.hero.termsDetected": "اصطلاح شناسایی شد", @@ -12121,6 +13939,144 @@ const messages: Record> = { "landing.translate.aiAnalysis": "تحلیل AI فعال", "landing.translate.processing": "در حال پردازش", "landing.translate.preservingLayout": "طرح‌بندی شما حفظ می‌شود", + "layout.nav.apiAccess": "دسترسی API", + "layout.footer.terms": "شرایط", + "layout.footer.privacy": "حریم خصوصی", + "fileUploader.uploadDocument": "بارگذاری سند", + "fileUploader.uploadDesc": "فایل را بکشید و رها کنید یا کلیک کنید (Excel, Word, PowerPoint)", + "fileUploader.dropHere": "فایل خود را اینجا رها کنید…", + "fileUploader.dragAndDrop": "سند خود را اینجا بکشید و رها کنید", + "fileUploader.orClickBrowse": "یا کلیک کنید برای مرور", + "fileUploader.preview": "پیش‌نمایش", + "fileUploader.translationOptions": "گزینه‌های ترجمه", + "fileUploader.configureSettings": "تنظیمات ترجمه را پیکربندی کنید", + "fileUploader.targetLanguage": "زبان مقصد", + "fileUploader.selectLanguage": "زبان را انتخاب کنید", + "fileUploader.translationProvider": "ارائه‌دهنده ترجمه", + "fileUploader.selectProvider": "ارائه‌دهنده را انتخاب کنید", + "fileUploader.advancedOptions": "گزینه‌های پیشرفته", + "fileUploader.translateImages": "ترجمه تصاویر", + "fileUploader.translating": "در حال ترجمه…", + "fileUploader.translateDocument": "ترجمه سند", + "fileUploader.processing": "در حال پردازش…", + "fileUploader.translationError": "خطای ترجمه", + "fileUploader.translationComplete": "ترجمه کامل شد!", + "fileUploader.translationCompleteDesc": "سند شما با حفظ تمام قالب‌بندی با موفقیت ترجمه شد.", + "fileUploader.download": "بارگیری سند ترجمه‌شده", + "fileUploader.webgpuUnsupported": "WebGPU در این مرورگر پشتیبانی نمی‌شود. لطفاً از Chrome 113+ یا Edge 113+ استفاده کنید.", + "fileUploader.webllmNotLoaded": "مدل WebLLM بارگذاری نشده است. به تنظیمات > سرویس‌های ترجمه بروید تا یک مدل بارگذاری کنید.", + "fileUploader.extracting": "در حال استخراج متن از سند…", + "fileUploader.noTranslatable": "متن قابل ترجمه در سند یافت نشد", + "fileUploader.foundTexts": "{count} متن برای ترجمه یافت شد", + "fileUploader.translatingItem": "در حال ترجمه {current}/{total}: \"{preview}\"", + "fileUploader.reconstructing": "در حال بازسازی سند…", + "fileUploader.translatingLocally": "ترجمه محلی با WebLLM…", + "checkout.activating": "در حال فعال‌سازی…", + "checkout.activatingDesc": "در حال به‌روزرسانی اشتراک شما هستیم، لطفاً صبر کنید.", + "checkout.paymentConfirmed": "پرداخت تأیید شد!", + "checkout.subscriptionActivated": "اشتراک فعال شد!", + "checkout.planActivated": "پلن {plan} فعال شد!", + "checkout.redirectingToProfile": "در حال هدایت به نمایه شما…", + "checkout.paymentReceived": "پرداخت دریافت شد", + "checkout.redirecting": "در حال هدایت…", + "checkout.syncError": "خطای همگام‌سازی", + "checkout.networkError": "خطای شبکه. پرداخت شما تأیید شد — لطفاً نمایه خود را بارگیری مجدد کنید.", + "dashboard.checkoutSyncError": "خطا در همگام‌سازی پرداخت.", + "dashboard.networkRefresh": "خطای شبکه. لطفاً صفحه را تازه‌سازی کنید.", + "dashboard.continueToTranslate": "ادامه به ترجمه", + "langSelector.search": "جستجو…", + "langSelector.noResults": "بدون نتیجه", + "langSelector.source": "مبدأ", + "langSelector.target": "هدف", + "langSelector.swap": "جابجایی", + "translateComplete.highQuality": "کیفیت بالا", + "translateComplete.segments": "قطعه‌ها", + "translateComplete.characters": "نویسه‌ها", + "translateComplete.confidence": "اعتماد", + "providerTheme.deepseek.badge": "اساسی", + "providerTheme.deepseek.subBadge": "فنی و اقتصادی", + "providerTheme.deepseek.desc": "ترجمه فوق‌دقیق و اقتصادی، ایده‌آل برای اسناد فنی و کد.", + "providerTheme.openai.badge": "ویژه", + "providerTheme.openai.subBadge": "وفاداری بالا", + "providerTheme.openai.desc": "استاندارد جهانی هوش مصنوعی. حداکثر سازگاری متنی و رعایت دقیق سبک.", + "providerTheme.minimax.badge": "پیشرفته", + "providerTheme.minimax.subBadge": "عملکرد", + "providerTheme.minimax.desc": "سرعت اجرای باورنکردنی و درک عالی از ساختارهای پیچیده.", + "providerTheme.openrouter.badge": "سریع", + "providerTheme.openrouter.subBadge": "چند مدل", + "providerTheme.openrouter.desc": "دسترسی یکپارچه به بهترین مدل‌های متن‌باز بهینه‌سازی‌شده برای ترجمه.", + "providerTheme.openrouter_premium.badge": "فوق‌العاده", + "providerTheme.openrouter_premium.subBadge": "حداکثر زمینه", + "providerTheme.openrouter_premium.desc": "با کمک مدل‌های پیشرفته (GPT-4o، Claude Sonnet 4.6) برای اسناد طولانی.", + "providerTheme.zai.badge": "تخصصی", + "providerTheme.zai.subBadge": "مالی و حقوقی", + "providerTheme.zai.desc": "مدل تنظیم‌شده برای اصطلاحات تجاری سخت‌گیرانه (حقوقی، مالی).", + "providerTheme.default.badge": "مدرن", + "providerTheme.default.subBadge": "استدلال هوش مصنوعی", + "providerTheme.default.desc": "ترجمه مدل زبانی بزرگ (LLM) با تحلیل معنایی پیشرفته.", + "providerTheme.classic.google.label": "ترجمه Google", + "providerTheme.classic.google.desc": "ترجمه فوق‌سریع با پوشش بیش از 130 زبان. برای جریان‌های عمومی توصیه می‌شود.", + "providerTheme.classic.deepl.label": "DeepL Pro", + "providerTheme.classic.deepl.desc": "ترجمه با دقت بالا که به دلیل روانی و عبارات طبیعی شهرت دارد.", + "providerTheme.classic.google_cloud.label": "Google Cloud API", + "providerTheme.classic.google_cloud.desc": "موتور ابری حرفه‌ای بهینه‌سازی‌شده برای پردازش حجم زیاد اسناد.", + "providerSelector.noClassic": "مترجم استاندارد موجود نیست.", + "providerSelector.noLlm": "هیچ مدل هوش مصنوعی پیکربندی نشده است.", + "providerSelector.costOne": "هزینه: 1 اعتبار در هر صفحه", + "providerSelector.costFive": "هزینه: 5 اعتبار در هر صفحه (ضریب ویژه)", + "providerSelector.unlockContextual": "ترجمه زمینه‌ای ویژه را برای کل اسناد خود فعال کنید.", + "translate.header.processing": "در حال پردازش", + "translate.header.aiActive": "تحلیل هوش مصنوعی فعال", + "translate.header.aiActiveDesc": "چیدمان شما توسط موتور زمینه‌ای ما حفظ می‌شود.", + "translate.header.completed": "تکمیل شد", + "translate.header.completedTitle": "ترجمه تکمیل شد", + "translate.header.proSpace": "فضای Pro", + "translate.header.translateDoc": "ترجمه یک سند", + "translate.header.translateDocDesc": "چیدمان اصلی را با موتور ترجمه فوق‌دقیق ما حفظ کنید.", + "translate.upload.nativeFormat": "قالب بومی", + "translate.fileType.word": "Word (.docx)", + "translate.fileType.excel": "Excel (.xlsx)", + "translate.fileType.slides": "اسلایدها (.pptx)", + "translate.fileType.pdf": "PDF (.pdf)", + "translate.startTranslation": "شروع ترجمه", + "translate.submit": "در حال ارسال…", + "translate.chooseTargetLang": "لطفاً یک زبان مقصد انتخاب کنید", + "translate.pleaseLoadFile": "لطفاً ابتدا یک فایل بارگذاری کنید", + "translate.contextEngineActive": "موتور زمینه‌ای فعال", + "translate.phase1": "مرحله 1: مقداردهی اولیه", + "translate.phase2": "مرحله 2: بازسازی زمینه‌ای", + "translate.stat.segments": "قطعه‌ها", + "translate.stat.precision": "دقت", + "translate.stat.speedLabel": "سرعت", + "translate.stat.turbo": "توربو", + "translate.stat.time": "زمان", + "translate.complete.masterQuality": "✓ کیفیت عالی", + "translate.download": "بارگیری", + "translate.newTranslation": "+ ترجمه جدید", + "translate.failedTitle": "خطای ترجمه", + "translate.retry": "تلاش مجدد", + "translate.uploadAnother": "بارگذاری فایل دیگر", + "translate.monitor": "مانیتور هوش مصنوعی", + "translate.summary": "خلاصه", + "translate.cancelProcess": "⟳ لغو فرآیند", + "translate.layoutIntegrity": "یکپارچگی چیدمان", + "translate.secureHundred": "100% امن", + "translate.okHundred": "100% OK", + "translate.preserveLayout": "حفظ چیدمان", + "translate.preserveLayoutDesc": "حفظ چیدمان", + "translate.textOnly": "فقط متن", + "translate.textOnlyDesc": "ترجمه سریع فقط متن", + "translate.unavailableStandard": "در حالت استاندارد موجود نیست (فقط AI)", + "apiKeys.noKeysGenerated": "کلیدی تولید نشده", + "apiKeys.copied": "کپی شد!", + "services.fallback.google.label": "ترجمه Google", + "services.fallback.google.desc": "ترجمه سریع، بیش از 130 زبان", + "settings.formats.excel.name": "Excel", + "settings.formats.word.name": "Word", + "settings.formats.powerpoint.name": "PowerPoint", + "pricing.dashboard": "داشبورد", + "pricing.okSymbol": "✓", + "pricing.errSymbol": "✕", }, };