perf+security: fix build, secure downloads, dedupe translations, refactor i18n
All checks were successful
Deploy to Production / Build and Deploy (push) Successful in 2m49s

Frontend:
- Fix Framer Motion / motion-dom build error by pinning framer-motion to
  11.18.2 (compatible with React 19 and Next.js 16).
- Add cross-env and build:local script to bypass standalone symlink errors
  on Windows without Developer Mode.
- Allow NEXT_OUTPUT=default to disable standalone output for local builds.
- Refactor i18n: split 14,177-line src/lib/i18n.tsx into per-locale,
  per-namespace JSON files under src/lib/i18n/messages/.
- Load English synchronously; other locales loaded on demand via dynamic
  imports (reduces initial bundle, improves maintainability).
- Remove unused next-intl message files src/messages/en.json and fr.json.

Backend:
- Remove insecure legacy /api/v1/download/{filename} and /api/v1/cleanup/{filename}
  endpoints. The job-based /api/v1/download/{job_id} already enforces ownership.
- Deduplicate texts in TranslationService.translate_batch before sending them
  to the provider, reducing API calls for repeated strings.
- Pin httpx to <0.28 to fix TestClient incompatibility with starlette 0.35.1.
- Add pytest-cov and ruff dev dependencies/config.

DevOps:
- Remove hardcoded Grafana password from docker-compose.yml and
  docker-compose.monitoring.yml; use GRAFANA_PASSWORD env var.
- Change default TRANSLATION_SERVICE from ollama to google in
  docker-compose.yml (Ollama is an optional profile).
- Add GRAFANA_PASSWORD to .env.example.
- Add .coverage and frontend/pnpm-workspace.yaml to .gitignore.

Tests:
- Update API versioning tests for removed legacy endpoints.
- Add tests/test_translation_service.py for deduplication behavior.

Verified:
- pnpm run build:local passes.
- uv run pytest tests/test_providers/* tests/test_translation_service.py
  tests/test_story_3_5_api_versioning.py tests/test_download_endpoint.py
  tests/test_translators/test_excel_translator.py: provider/translator tests
  pass; one pre-existing French error-message test still fails (message is
  returned in English, unrelated to this change).
This commit is contained in:
2026-06-14 16:44:18 +02:00
parent eda6821632
commit fa637abff0
365 changed files with 23910 additions and 14955 deletions

View File

@@ -183,6 +183,11 @@ STRIPE_PRICE_BUSINESS_MONTHLY=price_xxx
STRIPE_PRICE_BUSINESS_YEARLY=price_xxx STRIPE_PRICE_BUSINESS_YEARLY=price_xxx
# ============== Monitoring ============== # ============== Monitoring ==============
# Optional. Default: admin. Grafana admin username.
GRAFANA_USER=admin
# Required when Grafana is enabled. If absent: Grafana may fail to start. Generate with: secrets.token_urlsafe(32)
GRAFANA_PASSWORD=
# Optional. Default: INFO. Log format: json or console (default from ENV/LOG_FORMAT). # Optional. Default: INFO. Log format: json or console (default from ENV/LOG_FORMAT).
LOG_LEVEL=INFO LOG_LEVEL=INFO
LOG_FORMAT=json LOG_FORMAT=json

7
.gitignore vendored
View File

@@ -82,3 +82,10 @@ uv.lock
*.pem *.pem
*_ssl_certificate*.zip *_ssl_certificate*.zip
# Coverage reports
.coverage
htmlcov/
# Auto-generated pnpm workspace file (placeholders)
frontend/pnpm-workspace.yaml

View File

@@ -8,7 +8,7 @@
# docker compose -f docker-compose.yml -f docker-compose.monitoring.yml up -d # docker compose -f docker-compose.yml -f docker-compose.monitoring.yml up -d
# #
# Access: # Access:
# Grafana: http://<IP_SERVEUR>:3001 (admin / WordlyGrafana2026!) # Grafana: http://<IP_SERVEUR>:3001 (admin / $GRAFANA_PASSWORD)
# Ou via NPM: monitoring.wordly.art -> wordly-grafana:3000 # Ou via NPM: monitoring.wordly.art -> wordly-grafana:3000
# ============================================ # ============================================
@@ -54,8 +54,8 @@ services:
container_name: wordly-grafana container_name: wordly-grafana
restart: unless-stopped restart: unless-stopped
environment: environment:
- GF_SECURITY_ADMIN_USER=admin - GF_SECURITY_ADMIN_USER=${GRAFANA_USER:-admin}
- GF_SECURITY_ADMIN_PASSWORD=WordlyGrafana2026! - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD}
- GF_USERS_ALLOW_SIGN_UP=false - GF_USERS_ALLOW_SIGN_UP=false
- GF_SERVER_ROOT_URL=https://monitoring.wordly.art - GF_SERVER_ROOT_URL=https://monitoring.wordly.art
- GF_INSTALL_PLUGINS=grafana-clock-panel - GF_INSTALL_PLUGINS=grafana-clock-panel

View File

@@ -87,7 +87,7 @@ services:
environment: environment:
- DATABASE_URL=postgresql+asyncpg://${POSTGRES_USER:-translate}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB:-translate_db} - DATABASE_URL=postgresql+asyncpg://${POSTGRES_USER:-translate}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB:-translate_db}
- REDIS_URL=redis://redis:6379/0 - REDIS_URL=redis://redis:6379/0
- TRANSLATION_SERVICE=${TRANSLATION_SERVICE:-ollama} - TRANSLATION_SERVICE=${TRANSLATION_SERVICE:-google}
- OLLAMA_BASE_URL=${OLLAMA_BASE_URL:-http://ollama:11434} - OLLAMA_BASE_URL=${OLLAMA_BASE_URL:-http://ollama:11434}
- OLLAMA_MODEL=${OLLAMA_MODEL:-llama3} - OLLAMA_MODEL=${OLLAMA_MODEL:-llama3}
- DEEPL_API_KEY=${DEEPL_API_KEY:-} - DEEPL_API_KEY=${DEEPL_API_KEY:-}
@@ -251,7 +251,7 @@ services:
restart: unless-stopped restart: unless-stopped
environment: environment:
- GF_SECURITY_ADMIN_USER=${GRAFANA_USER:-admin} - GF_SECURITY_ADMIN_USER=${GRAFANA_USER:-admin}
- GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD:-WordlyGrafana2026!} - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD}
- GF_USERS_ALLOW_SIGN_UP=false - GF_USERS_ALLOW_SIGN_UP=false
- GF_SERVER_ROOT_URL=https://monitoring.wordly.art - GF_SERVER_ROOT_URL=https://monitoring.wordly.art
- GF_INSTALL_PLUGINS=grafana-clock-panel - GF_INSTALL_PLUGINS=grafana-clock-panel

View File

@@ -5,8 +5,10 @@ import type { NextConfig } from "next";
const backendUrl = (process.env.BACKEND_URL || "http://127.0.0.1:8000").replace(/\/$/, ""); const backendUrl = (process.env.BACKEND_URL || "http://127.0.0.1:8000").replace(/\/$/, "");
const nextConfig: NextConfig = { const nextConfig: NextConfig = {
// Docker: standalone output for optimized production images // Docker: standalone output for optimized production images.
output: "standalone", // On Windows without Developer Mode / admin rights the standalone symlink
// copy can fail with EPERM. Set NEXT_OUTPUT=default to disable standalone.
output: process.env.NEXT_OUTPUT === "default" ? undefined : "standalone",
// Turbopack ne résout pas le require() dynamique de lightningcss → "Module not found". // Turbopack ne résout pas le require() dynamique de lightningcss → "Module not found".
// Toujours lancer avec Webpack : npm run dev ou next dev --webpack (pas "next dev" seul). // Toujours lancer avec Webpack : npm run dev ou next dev --webpack (pas "next dev" seul).
serverExternalPackages: ["lightningcss", "@tailwindcss/postcss", "@tailwindcss/node"], serverExternalPackages: ["lightningcss", "@tailwindcss/postcss", "@tailwindcss/node"],

View File

@@ -6,6 +6,7 @@
"dev": "next dev --webpack", "dev": "next dev --webpack",
"dev:turbo": "next dev", "dev:turbo": "next dev",
"build": "next build --webpack", "build": "next build --webpack",
"build:local": "cross-env NEXT_OUTPUT=default next build --webpack",
"build:turbo": "next build", "build:turbo": "next build",
"start": "next start", "start": "next start",
"lint": "eslint", "lint": "eslint",
@@ -33,7 +34,7 @@
"agentation-mcp": "^1.2.0", "agentation-mcp": "^1.2.0",
"class-variance-authority": "^0.7.1", "class-variance-authority": "^0.7.1",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"framer-motion": "^12.23.24", "framer-motion": "11.18.2",
"lucide-react": "^0.555.0", "lucide-react": "^0.555.0",
"next": "16.0.6", "next": "16.0.6",
"next-intl": "^4.8.3", "next-intl": "^4.8.3",
@@ -54,6 +55,7 @@
"@types/react-dom": "^19", "@types/react-dom": "^19",
"@vitejs/plugin-react": "^5.1.4", "@vitejs/plugin-react": "^5.1.4",
"agentation": "^3.0.2", "agentation": "^3.0.2",
"cross-env": "^10.1.0",
"eslint": "^9", "eslint": "^9",
"eslint-config-next": "16.0.6", "eslint-config-next": "16.0.6",
"jsdom": "^28.1.0", "jsdom": "^28.1.0",

7833
frontend/pnpm-lock.yaml generated Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,48 @@
{
"admin.login.title": "الإدارة",
"admin.login.required": "تسجيل الدخول مطلوب",
"admin.login.password": "كلمة مرور المسؤول",
"admin.login.connecting": "جارٍ الاتصال...",
"admin.login.access": "الدخول إلى لوحة الإدارة",
"admin.login.restricted": "مخصص للمسؤولين فقط",
"admin.layout.checking": "جارٍ التحقق من المصادقة...",
"admin.dashboard.title": "لوحة تحكم المسؤول",
"admin.dashboard.subtitle": "لوحة تحكم المسؤولين",
"admin.dashboard.refresh": "تحديث",
"admin.dashboard.refreshTooltip": "تحديث بيانات لوحة التحكم",
"admin.dashboard.config": "إعدادات النظام",
"admin.dashboard.maxFileSize": "الحد الأقصى لحجم الملف:",
"admin.dashboard.translationService": "خدمة الترجمة:",
"admin.dashboard.formats": "التنسيقات:",
"admin.nav.dashboard": "Dashboard",
"admin.nav.users": "المستخدمون",
"admin.nav.pricing": "الأسعار و Stripe",
"admin.nav.providers": "المزوّدون",
"admin.nav.system": "النظام",
"admin.nav.logs": "السجلات",
"admin.users.title": "إدارة المستخدمين",
"admin.users.subtitle": "عرض حسابات المستخدمين وإدارتها",
"admin.users.planUpdated": "تم تحديث الخطة",
"admin.users.planChanged": "تم تغيير الخطة إلى \\\"{plan}\\\" بنجاح.",
"admin.users.unknownError": "خطأ غير معروف",
"admin.users.error": "خطأ",
"admin.users.planUpdateError": "تعذر تحديث الخطة: {message}",
"admin.users.noKeys": "لا توجد مفاتيح",
"admin.users.noKeysDesc": "لا يمتلك هذا المستخدم مفاتيح API نشطة.",
"admin.users.keysRevoked": "تم إلغاء المفاتيح",
"admin.users.keysRevokedDesc": "تم إلغاء {count} مفتاح API بنجاح.",
"admin.users.revokeError": "تعذر إلغاء المفاتيح: {message}",
"admin.users.retry": "إعادة المحاولة",
"admin.system.title": "النظام",
"admin.system.subtitle": "مراقبة حالة النظام وإدارة الموارد",
"admin.system.quotas": "حصص الترجمة",
"admin.system.resetQuotas": "إعادة تعيين الحصص الشهرية",
"admin.system.resetting": "جارٍ إعادة التعيين...",
"admin.system.reset": "إعادة تعيين",
"admin.system.allOperational": "جميع الأنظمة تعمل بشكل طبيعي",
"admin.system.issuesDetected": "تم اكتشاف مشاكل في النظام",
"admin.system.waitingData": "في انتظار البيانات...",
"admin.system.purging": "جارٍ الحذف...",
"admin.system.clean": "تنظيف",
"admin.system.purge": "حذف"
}

View File

@@ -0,0 +1,72 @@
{
"apiKeys.webhook.title": "Intégration Webhook",
"apiKeys.webhook.descriptionBefore": "Passez un paramètre ",
"apiKeys.webhook.descriptionAfter": " pour recevoir une requête POST lorsque votre traduction est terminée.",
"apiKeys.webhook.codeParam": "webhook_url",
"apiKeys.title": "مفاتيح API",
"apiKeys.subtitle": "إدارة مفاتيح API للوصول البرمجي إلى واجهة الترجمة.",
"apiKeys.loading": "جارٍ التحميل...",
"apiKeys.sectionTitle": "API والأتمتة",
"apiKeys.sectionDesc": "إنشاء وإدارة مفاتيح API لسير عمل الأتمتة",
"apiKeys.keysUsed": "{total} من {max} مفاتيح مستخدمة",
"apiKeys.maxReached": "تم بلوغ الحد الأقصى للمفاتيح. قم بإلغاء مفتاح لإنشاء واحد جديد.",
"apiKeys.canGenerate": "يمكنك إنشاء {count} مفتاح إضافي",
"apiKeys.canGeneratePlural": "يمكنك إنشاء {count} مفاتيح إضافية",
"apiKeys.generateNew": "إنشاء مفتاح جديد",
"apiKeys.keyRevoked": "تم إلغاء المفتاح",
"apiKeys.keyRevokedDesc": "تم إلغاء مفتاح API بنجاح.",
"apiKeys.keyNotFound": "المفتاح غير موجود",
"apiKeys.keyNotFoundDesc": "مفتاح API لم يعد موجودًا. ربما تم إلغاؤه بالفعل.",
"apiKeys.error": "خطأ",
"apiKeys.revokeError": "فشل إلغاء مفتاح API. يرجى المحاولة مرة أخرى.",
"apiKeys.limitReached": "تم بلوغ الحد",
"apiKeys.limitReachedDesc": "لقد وصلت إلى الحد الأقصى وهو 10 مفاتيح API. قم بإلغاء مفتاح حالي لإنشاء واحد جديد.",
"apiKeys.proRequired": "ميزة Pro مطلوبة",
"apiKeys.proRequiredDesc": "مفاتيح API هي ميزة Pro. يرجى ترقية حسابك.",
"apiKeys.generateError": "فشل إنشاء مفتاح API. يرجى المحاولة مرة أخرى.",
"apiKeys.upgrade.title": "مفاتيح API",
"apiKeys.upgrade.subtitle": "أتمتة ترجماتك مع وصول API",
"apiKeys.upgrade.feat1": "إنشاء مفاتيح API غير محدودة",
"apiKeys.upgrade.feat2": "أتمتة ترجمة المستندات",
"apiKeys.upgrade.feat3": "إشعارات Webhook",
"apiKeys.upgrade.feat4": "أوضاع ترجمة LLM",
"apiKeys.upgrade.proFeature": "مفاتيح API هي ميزة {pro}. قم بالترقية لفتح أتمتة API.",
"apiKeys.upgrade.pro": "Pro",
"apiKeys.upgrade.cta": "الترقية إلى Pro",
"apiKeys.dialog.maxTitle": "تم بلوغ الحد الأقصى للمفاتيح",
"apiKeys.dialog.maxDesc": "لقد وصلت إلى الحد الأقصى وهو 10 مفاتيح API. يرجى إلغاء مفتاح حالي قبل إنشاء واحد جديد.",
"apiKeys.dialog.close": "إغلاق",
"apiKeys.dialog.generated": "تم إنشاء مفتاح API!",
"apiKeys.dialog.generatedDesc": "تم إنشاء مفتاح API الجديد. انسخه الآن - لن يظهر مرة أخرى.",
"apiKeys.dialog.important": "مهم:",
"apiKeys.dialog.importantDesc": "هذه هي المرة الوحيدة التي سترى فيها هذا المفتاح. احفظه في مكان آمن.",
"apiKeys.dialog.apiKey": "مفتاح API",
"apiKeys.dialog.name": "الاسم:",
"apiKeys.dialog.done": "تم",
"apiKeys.dialog.copied": "لقد نسخت المفتاح",
"apiKeys.dialog.generateTitle": "إنشاء مفتاح API جديد",
"apiKeys.dialog.generateDesc": "إنشاء مفتاح API جديد للوصول البرمجي إلى واجهة الترجمة.",
"apiKeys.dialog.keyName": "اسم المفتاح (اختياري)",
"apiKeys.dialog.keyNamePlaceholder": "مثال: الإنتاج، الاختبار",
"apiKeys.dialog.keyNameHint": "اسم وصفي لمساعدتك على التعرف على هذا المفتاح لاحقًا.",
"apiKeys.dialog.nameTooLong": "يجب ألا يتجاوز الاسم {max} حرفًا",
"apiKeys.dialog.nameInvalid": "يمكن أن يحتوي الاسم على أحرف وأرقام ومسافات وشرطات وشرطات سفلية فقط",
"apiKeys.dialog.cancel": "إلغاء",
"apiKeys.dialog.generating": "جارٍ الإنشاء...",
"apiKeys.dialog.generate": "إنشاء مفتاح",
"apiKeys.table.name": "الاسم",
"apiKeys.table.prefix": "البادئة",
"apiKeys.table.created": "تاريخ الإنشاء",
"apiKeys.table.lastUsed": "آخر استخدام",
"apiKeys.table.never": "أبدًا",
"apiKeys.table.actions": "الإجراءات",
"apiKeys.table.revoke": "إلغاء",
"apiKeys.table.copyPrefix": "نسخ بادئة المفتاح",
"apiKeys.table.revokeKey": "إلغاء المفتاح",
"apiKeys.revokeDialog.title": "إلغاء مفتاح API",
"apiKeys.revokeDialog.desc": "هل أنت متأكد من إلغاء المفتاح \\\"{name}\\\"؟ لا يمكن التراجع عن هذا الإجراء.",
"apiKeys.revokeDialog.confirm": "نعم، إلغاء",
"apiKeys.revokeDialog.cancel": "إلغاء",
"apiKeys.noKeysGenerated": "لم يتم إنشاء مفاتيح",
"apiKeys.copied": "تم النسخ!"
}

View File

@@ -0,0 +1,3 @@
{
"auth.brandName": "Wordly"
}

View File

@@ -0,0 +1,12 @@
{
"checkout.activating": "جارٍ التفعيل…",
"checkout.activatingDesc": "نقوم بتحديث اشتراكك، يرجى الانتظار.",
"checkout.paymentConfirmed": "تم تأكيد الدفع!",
"checkout.subscriptionActivated": "تم تفعيل الاشتراك!",
"checkout.planActivated": "تم تفعيل خطة {plan}!",
"checkout.redirectingToProfile": "إعادة التوجيه إلى ملفك الشخصي…",
"checkout.paymentReceived": "تم استلام الدفع",
"checkout.redirecting": "جارٍ إعادة التوجيه…",
"checkout.syncError": "خطأ في المزامنة",
"checkout.networkError": "خطأ في الشبكة. تم تأكيد الدفع — يرجى إعادة تحميل ملفك الشخصي."
}

View File

@@ -0,0 +1,4 @@
{
"common.loading": "جارٍ التحميل...",
"common.backToHome": "العودة للرئيسية"
}

View File

@@ -0,0 +1,25 @@
{
"context.proTitle": "ميزة Pro",
"context.proDesc": "السياق والمصطلحات المهنية متاحة مع خطط Pro وBusiness وEnterprise. توفر ترجمات أكثر دقة من خلال تعليمات ومفردات خاصة بمجالك.",
"context.viewPlans": "عرض الخطط",
"context.title": "السياق والمصطلحات",
"context.subtitle": "حسّن جودة الترجمة من خلال تعليمات ومفردات خاصة بمجالك.",
"context.presets.title": "المصطلحات المهنية",
"context.presets.desc": "تحميل مصطلحات كاملة مع تعليمات ومصطلحات متخصصة",
"context.instructions.title": "تعليمات السياق",
"context.instructions.desc": "تعليمات سيتبعها الذكاء الاصطناعي أثناء الترجمة",
"context.instructions.placeholder": "مثال: أنت تترجم مستندات تقنية HVAC. استخدم مصطلحات الهندسة الدقيقة...",
"context.glossary.title": "المصطلحات التقنية",
"context.glossary.desc": "التنسيق: source=target (واحد في كل سطر). المصطلحات المحملة عبر الإعدادات المسبقة قابلة للتعديل.",
"context.glossary.terms": "مصطلحات في القاموس",
"context.clearAll": "مسح الكل",
"context.saving": "جارٍ الحفظ...",
"context.save": "حفظ",
"context.presets.createGlossary": "إنشاء مسرد",
"context.presets.created": "تم إنشاء المسرد",
"context.presets.createdDesc": "تم إنشاء المسرد \\\"{name}\\\" بـ {count} مصطلحات.",
"context.presets.hint": "انقر على إعداد مسبق لإنشاء مسرد بمصطلحات خاصة بالمجال. أد穹 مصادرك في قسم المسرات.",
"context.glossary.manage": "إدارة المسرات",
"context.saved": "تم الحفظ",
"context.savedDesc": "تم حفظ تعليمات السياق الخاصة بك."
}

View File

@@ -0,0 +1,7 @@
{
"cookieConsent.title": "ملفات تعريف الارتباط على Wordly",
"cookieConsent.description": "نستخدم ملفات تعريف الارتباط الأساسية لعمل التطبيق (الجلسة، الأمان، اللغة). بإذنك، نستخدم أيضًا ملفات تعريف ارتباط اختيارية لقياس حركة المرور وتحسين المنتج.",
"cookieConsent.acceptAll": "قبول الكل",
"cookieConsent.essentialOnly": "الأساسية فقط",
"cookieConsent.learnMore": "معرفة المزيد"
}

View File

@@ -0,0 +1,111 @@
{
"dashboard.nav.translate": "ترجمة",
"dashboard.nav.profile": "ملفي الشخصي",
"dashboard.nav.settings": "الإعدادات",
"dashboard.nav.context": "السياق",
"dashboard.nav.services": "الخدمات",
"dashboard.nav.apiKeys": "مفاتيح API",
"dashboard.nav.glossaries": "المعاجم",
"dashboard.header.title": "لوحة التحكم",
"dashboard.header.subtitle": "إدارة ترجماتك",
"dashboard.header.toggleMenu": "القائمة",
"dashboard.header.profileTitle": "ملفي الشخصي",
"dashboard.sidebar.theme": "المظهر",
"dashboard.sidebar.signOut": "تسجيل الخروج",
"dashboard.sidebar.backHome": "العودة إلى الصفحة الرئيسية",
"dashboard.sidebar.upgradeToPro": "الترقية إلى Pro ←",
"dashboard.translate.pageTitle": "ترجمة مستند",
"dashboard.translate.pageSubtitle": "استورد ملفًا واختر اللغة الهدف",
"dashboard.translate.errorNotificationTitle": "خطأ",
"dashboard.translate.dropzone.uploadAria": "منطقة إسقاط الملفات",
"dashboard.translate.dropzone.title": "اسحب ملفك وأفلته هنا",
"dashboard.translate.dropzone.subtitle": "أو انقر للاختيار (DOCX, XLSX, PPTX, PDF)",
"dashboard.translate.dropzone.replaceFile": "استبدال الملف",
"dashboard.translate.language.source": "لغة المصدر",
"dashboard.translate.language.target": "اللغة الهدف",
"dashboard.translate.language.loading": "جارٍ تحميل اللغات…",
"dashboard.translate.language.autoDetect": "كشف تلقائي",
"dashboard.translate.language.selectPlaceholder": "اختيار…",
"dashboard.translate.language.loadErrorPrefix": "فشل تحميل اللغات",
"dashboard.translate.provider.loading": "جارٍ تحميل مزوّدي الخدمة…",
"dashboard.translate.provider.noneConfigured": "لا يوجد مزوّدو خدمة مُعدّون",
"dashboard.translate.provider.modelTitle": "النموذج",
"dashboard.translate.provider.sectionTitle": "مزوّد الخدمة",
"dashboard.translate.provider.llmDivider": "ذكاء اصطناعي · مدرك للسياق",
"dashboard.translate.provider.llmDividerPro": "ذكاء اصطناعي · مدرك للسياق (Pro)",
"dashboard.translate.provider.upgrade": "الترقية إلى Pro",
"dashboard.translate.provider.upgradeSuffix": "لفتح ترجمة الذكاء الاصطناعي",
"dashboard.translate.trust.zeroRetention": "صفر احتفاظ بالبيانات",
"dashboard.translate.trust.deletedAfter": "تُحذف الملفات بعد المعالجة",
"dashboard.translate.actions.uploading": "جارٍ الرفع…",
"dashboard.translate.actions.translate": "ترجمة",
"dashboard.translate.actions.filePrefix": "الملف: ",
"dashboard.translate.actions.cancel": "إلغاء",
"dashboard.translate.actions.tryAgain": "إعادة المحاولة",
"dashboard.translate.steps.uploading": "جارٍ رفع الملف…",
"dashboard.translate.steps.starting": "جارٍ بدء الترجمة…",
"dashboard.translate.complete.title": "تمت الترجمة بنجاح!",
"dashboard.translate.complete.descNamed": "تمت ترجمة ملفك {name} بنجاح.",
"dashboard.translate.complete.descGeneric": "تمت ترجمة ملفك بنجاح.",
"dashboard.translate.complete.downloading": "جارٍ التنزيل…",
"dashboard.translate.complete.download": "تنزيل",
"dashboard.translate.complete.newTranslation": "ترجمة جديدة",
"dashboard.translate.complete.toastOkTitle": "تم بنجاح",
"dashboard.translate.complete.toastOkDesc": "تم تنزيل {name} بنجاح.",
"dashboard.translate.complete.toastFailTitle": "فشل",
"dashboard.translate.complete.toastFailDesc": "فشلت الترجمة. يرجى إعادة المحاولة.",
"dashboard.translate.sourceDocument": "المستند المصدر",
"dashboard.translate.configuration": "الإعدادات",
"dashboard.translate.translating": "جارٍ الترجمة",
"dashboard.translate.liveMonitor": "المراقبة المباشرة",
"dashboard.translate.summary": "الملخص",
"dashboard.translate.engine": "المحرك",
"dashboard.translate.confidence": "الثقة",
"dashboard.translate.cancel": "إلغاء",
"dashboard.translate.segments": "الأجزاء",
"dashboard.translate.characters": "الأحرف",
"dashboard.translate.elapsed": "المنقضي",
"dashboard.translate.segPerMin": "جزء/دقيقة",
"dashboard.translate.highQuality": "جودة عالية",
"dashboard.translate.quality": "الجودة",
"dashboard.translate.completed": "اكتملت الترجمة",
"dashboard.translate.replace": "استبدال",
"dashboard.translate.pdfMode.title": "وضع ترجمة PDF",
"dashboard.translate.pdfMode.preserveLayout": "الحفاظ على التخطيط",
"dashboard.translate.pdfMode.textOnly": "نص فقط",
"dashboard.translate.pdfMode.preserveLayoutDesc": "يحافظ على الصور والجداول والتنسيق. مثالي لملفات PDF البسيطة.",
"dashboard.translate.pdfMode.textOnlyDesc": "يترجم كل النص بشكل مثالي. مخرجات نظيفة دون مشاكل تخطيط.",
"dashboard.translate.pipeline.upload": "رفع",
"dashboard.translate.pipeline.analyze": "تحليل",
"dashboard.translate.pipeline.translate": "ترجمة",
"dashboard.translate.pipeline.rebuild": "إعادة بناء",
"dashboard.translate.pipeline.finalize": "إنهاء",
"dashboard.translate.progress.processingFallback": "جارٍ المعالجة…",
"dashboard.translate.progress.connectionLost": "فُقد الاتصال. إعادة المحاولة…",
"dashboard.translate.progress.failedTitle": "فشلت الترجمة",
"dashboard.translate.error.unexpected": "حدث خطأ غير متوقع. يرجى المحاولة مرة أخرى.",
"dashboard.translate.error.noResult": "لم تُنتج الترجمة أي نتائج. تحقق من أن المستند يحتوي على نص، ثم أعد المحاولة أو اختر محركًا آخر.",
"dashboard.translate.error.apiKey": "مفتاح API غير صالح أو مفقود. اتصل بالمسؤول لإعداد مفاتيح API.",
"dashboard.translate.error.quota": "تم بلوغ حد الاستخدام. أعد المحاولة بعد بضع دقائق أو اختر محركًا آخر.",
"dashboard.translate.error.timeout": "انتهت مهلة الاتصال بخدمة الترجمة. تحقق من شبكتك وأعد المحاولة.",
"dashboard.translate.error.sessionExpired": "انتهت الجلسة. انقر على إعادة المحاولة لإعادة تشغيل الترجمة.",
"dashboard.translate.error.empty": "يبدو أن المستند فارغ أو لا يحتوي على نص قابل للترجمة (صورة PDF ممسوحة ضوئيًا؟).",
"dashboard.translate.error.unsupported": "تنسيق ملف غير مدعوم أو ملف تالف.",
"dashboard.translate.error.connection": "فُقد الاتصال. تحقق من شبكتك وأعد المحاولة.",
"dashboard.translate.error.generic": "فشلت الترجمة: {detail}",
"dashboard.translate.error.title": "فشلت الترجمة",
"dashboard.translate.retry": "إعادة محاولة الترجمة",
"dashboard.translate.newFile": "ملف جديد",
"dashboard.translate.modeAI": "وضع الذكاء الاصطناعي",
"dashboard.translate.modeClassic": "الوضع الكلاسيكي",
"dashboard.translate.glossaryLLMHint": "القواميس المصطلحية متاحة في وضع الذكاء الاصطناعي",
"dashboard.translate.submitting": "جارٍ الإرسال...",
"dashboard.translate.submit": "بدء الترجمة",
"dashboard.translate.noFile": "قم بتحميل ملف أولاً",
"dashboard.translate.noTargetLang": "اختر لغة الهدف",
"dashboard.topbar.interfaceLabel": "واجهة الترجمة",
"dashboard.topbar.premiumAccess": "وصول مميز",
"dashboard.checkoutSyncError": "خطأ في مزامنة الدفع.",
"dashboard.networkRefresh": "خطأ في الشبكة. يرجى تحديث الصفحة.",
"dashboard.continueToTranslate": "متابعة إلى الترجمة"
}

View File

@@ -0,0 +1,31 @@
{
"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…"
}

View File

@@ -0,0 +1,189 @@
{
"glossaries.yourGlossaries": "معاجمك",
"glossaries.title": "المعاجم والسياق",
"glossaries.description": "قم بإدارة معاجمك وتعليمات السياق للحصول على ترجمات أكثر دقة.",
"glossaries.createNew": "إنشاء جديد",
"glossaries.empty": "لا توجد معاجم بعد",
"glossaries.emptyDesc": "أنشئ أول معجم لك أو حمّل إعدادًا مسبقًا احترافيًا أعلاه",
"glossaries.defineTerms": "مصطلحات",
"glossaries.aboutTitle": "حول المعاجم",
"glossaries.aboutDesc": "تتيح لك المعاجم تحديد ترجمات دقيقة لمصطلحات معينة. عند الترجمة، يتم استخدام مصطلحات المعجم لضمان ترجمات متسقة ودقيقة.",
"glossaries.aboutFormat": "كل مصطلح له كلمة مصدر وترجمات بلغات متعددة. حدد معجمًا في صفحة الترجمة لتطبيقه.",
"glossaries.toast.created": "تم إنشاء المعجم",
"glossaries.toast.createdDesc": "تم إنشاء المعجم \\\"{name}\\\".",
"glossaries.toast.imported": "تم استيراد المعجم",
"glossaries.toast.importedDesc": "تم استيراد المعجم \\\"{name}\\\".",
"glossaries.toast.updated": "تم تحديث المعجم",
"glossaries.toast.updatedDesc": "تم تحديث المعجم \\\"{name}\\\".",
"glossaries.toast.deleted": "تم حذف المعجم",
"glossaries.toast.deletedDesc": "تم حذف المعجم.",
"glossaries.toast.error": "خطأ",
"glossaries.toast.errorCreate": "فشل إنشاء المعجم",
"glossaries.toast.errorImport": "فشل استيراد المعجم",
"glossaries.toast.errorUpdate": "فشل تحديث المعجم",
"glossaries.toast.errorDelete": "فشل حذف المعجم",
"glossaries.dialog.title": "معجم جديد",
"glossaries.dialog.description": "أنشئ معجمًا لترجماتك",
"glossaries.dialog.nameLabel": "الاسم",
"glossaries.dialog.namePlaceholder": "معجمي",
"glossaries.dialog.tabTemplates": "القوالب",
"glossaries.dialog.tabFile": "ملف",
"glossaries.dialog.tabManual": "يدوي",
"glossaries.dialog.cancel": "إلغاء",
"glossaries.dialog.creating": "جارٍ الإنشاء…",
"glossaries.dialog.importing": "جارٍ الاستيراد…",
"glossaries.dialog.importBtn": "استيراد",
"glossaries.dialog.selectPrompt": "اختيار",
"glossaries.dialog.createBtn": "إنشاء",
"glossaries.dialog.createEmpty": "إنشاء فارغ",
"glossaries.dialog.terms": "مصطلحات",
"glossaries.dialog.templatesDesc": "اختر قالبًا مُعدًّا مسبقًا",
"glossaries.dialog.templatesEmpty": "لا توجد قوالب متاحة",
"glossaries.dialog.dropTitle": "اسحب ملف CSV هنا",
"glossaries.dialog.dropOr": "أو",
"glossaries.dialog.dropFormats": "CSV, TSV, TXT",
"glossaries.termEditor.addTerm": "إضافة مصطلح",
"glossaries.termEditor.maxReached": "تم بلوغ الحد الأقصى {max} من المصطلحات لكل قاموس.",
"glossaries.dialog.formatTitle": "التنسيق",
"glossaries.dialog.formatDesc": "المصدر،الهدف (واحدة لكل سطر)",
"glossaries.dialog.formatNote": "يُتجاهل السطر الأول عند اكتشاف ترويسة",
"glossaries.dialog.errorFormat": "تنسيق غير مدعوم",
"glossaries.dialog.errorSize": "الملف كبير جدًا",
"glossaries.dialog.errorEmpty": "ملف فارغ",
"glossaries.dialog.errorRead": "خطأ في القراءة",
"glossaries.dialog.parsing": "جارٍ التحليل…",
"glossaries.dialog.termsImported": "مصطلحات مستوردة",
"glossaries.dialog.changeFile": "تغيير الملف",
"glossaries.dialog.retry": "إعادة المحاولة",
"glossaries.edit.title": "Modifier le glossaire",
"glossaries.edit.description": "Modifiez le nom, la paire de langues et les termes du glossaire.",
"glossaries.edit.nameLabel": "Nom du glossaire",
"glossaries.edit.namePlaceholder": "Entrez le nom du glossaire...",
"glossaries.edit.sourceLang": "Langue source",
"glossaries.edit.targetLang": "Langue cible",
"glossaries.edit.termsLabel": "Termes ({count} valides)",
"glossaries.edit.exportCsv": "Exporter CSV",
"glossaries.edit.importCsv": "Importer CSV",
"glossaries.edit.cancel": "Annuler",
"glossaries.edit.saving": "Enregistrement...",
"glossaries.edit.saveChanges": "Enregistrer les modifications",
"glossaries.edit.importFailedTitle": "Échec de l'importation",
"glossaries.edit.importFailedMaxDesc": "Le CSV contient {count} termes, le maximum est de {max}. Veuillez réduire le nombre de termes.",
"glossaries.edit.importSuccessTitle": "Importation réussie",
"glossaries.edit.importSuccessDesc": "{count} termes importés avec succès.",
"glossaries.edit.importFailedEmptyDesc": "Aucun terme valide trouvé dans le fichier CSV.",
"glossaries.edit.importFailedReadDesc": "Impossible de lire le fichier CSV.",
"glossaries.delete.title": "Supprimer le glossaire",
"glossaries.delete.description": "Êtes-vous sûr de vouloir supprimer ce glossaire ?",
"glossaries.delete.warning": "Cette action est irréversible",
"glossaries.delete.warningDesc": "Toutes les paires de termes seront définitivement supprimées.",
"glossaries.delete.cancel": "Annuler",
"glossaries.delete.deleting": "Suppression...",
"glossaries.delete.deleteBtn": "Supprimer",
"glossaries.upgrade.title": "Glossaires",
"glossaries.upgrade.description": "Personnalisez vos traductions avec une terminologie personnalisée",
"glossaries.upgrade.feature1": "Créez plusieurs glossaires",
"glossaries.upgrade.feature2": "Définissez des paires de termes source→cible",
"glossaries.upgrade.feature3": "Importez/exportez via CSV",
"glossaries.upgrade.feature4": "Appliquez aux traductions LLM",
"glossaries.upgrade.proFeatureBefore": "Les glossaires sont une fonctionnalité ",
"glossaries.upgrade.proFeatureAfter": ". Passez à un forfait supérieur pour débloquer la terminologie personnalisée.",
"glossaries.upgrade.proLabel": "Pro",
"glossaries.upgrade.upgradeBtn": "Passer à Pro",
"glossaries.loading": "Chargement...",
"glossaries.howItWorks.title": "Comment ces paramètres sont utilisés",
"glossaries.howItWorks.step1Title": "Configurez ici",
"glossaries.howItWorks.step1Desc": "Rédigez vos instructions de contexte ou créez/importez un glossaire de termes.",
"glossaries.howItWorks.step2Title": "Activez dans Traduire",
"glossaries.howItWorks.step2Desc": "Sur la page de traduction, dans la colonne de droite, sélectionnez votre glossaire.",
"glossaries.howItWorks.warning": "Les instructions de contexte s'appliquent automatiquement à toutes vos traductions IA une fois enregistrées. Les glossaires doivent être sélectionnés manuellement sur la page Traduire.",
"glossaries.howItWorks.goToTranslate": "Aller à Traduire",
"glossaries.status.unsaved": "Non enregistré",
"glossaries.status.active": "Actif · s'applique à toutes les traductions IA",
"glossaries.status.inactive": "Inactif",
"glossaries.instructions.whatForBold": "À quoi ça sert ?",
"glossaries.instructions.whatForDesc": "Ces instructions sont envoyées automatiquement à l'IA avant chaque traduction, sans que vous ayez besoin de faire quoi que ce soit sur la page Traduire. Utilisez-les pour guider le style, le registre ou la terminologie générale.",
"glossaries.instructions.example": "Exemple : « Vous traduisez des rapports financiers. Soyez formel, précis et conservez tous les chiffres. »",
"glossaries.instructions.charCount": "{count} caractères",
"glossaries.instructions.emptyHint": "Vide — aucune instruction envoyée à l'IA",
"glossaries.instructions.clearAll": "Tout effacer",
"glossaries.instructions.saving": "Enregistrement…",
"glossaries.instructions.saved": "Enregistré",
"glossaries.presets.whatForBold": "À quoi ça sert ?",
"glossaries.presets.whatForDesc": "Cliquer sur une carte crée un glossaire pré-rempli avec les termes spécialisés du domaine. Ce glossaire apparaîtra dans vos glossaires ci-dessous, et vous pourrez le sélectionner manuellement sur la page Traduire pour forcer des traductions de termes précis.",
"glossaries.presets.clickHint": "Cliquez sur une carte → glossaire créé → sélectionnez-le dans Traduire",
"glossaries.presets.creating": "Création…",
"glossaries.presets.alreadyImported": "Déjà importé",
"glossaries.presets.it.title": "IT / Logiciel",
"glossaries.presets.it.desc": "Développement, infrastructure, DevOps",
"glossaries.presets.legal.title": "Juridique / Contrats",
"glossaries.presets.legal.desc": "Droit des affaires, contentieux",
"glossaries.presets.medical.title": "Médical / Santé",
"glossaries.presets.medical.desc": "Pharmacologie, chirurgie, diagnostic",
"glossaries.presets.finance.title": "Finance / Comptabilité",
"glossaries.presets.finance.desc": "IFRS, bilans, fiscalité",
"glossaries.presets.marketing.title": "Marketing / Publicité",
"glossaries.presets.marketing.desc": "Digital, branding, analytics",
"glossaries.presets.hr.title": "RH / Ressources Humaines",
"glossaries.presets.hr.desc": "Contrats, politiques, recrutement",
"glossaries.presets.scientific.title": "Scientifique / Recherche",
"glossaries.presets.scientific.desc": "Publications, thèses, articles",
"glossaries.presets.ecommerce.title": "E-commerce / Vente",
"glossaries.presets.ecommerce.desc": "Boutiques en ligne, catalogues, CRM",
"glossaries.grid.title": "Vos",
"glossaries.grid.titleHighlight": "glossaires",
"glossaries.grid.countWithAction": "{count} glossaire({plural}) — cliquez sur une carte pour la modifier",
"glossaries.grid.emptyAction": "Créez votre premier glossaire ou importez un preset ci-dessus",
"glossaries.grid.activeTranslation": "Traduction active :",
"glossaries.grid.goToTranslate": "Aller à Traduire pour activer",
"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.",
"glossaries.detail.backToList": "Back to glossaries",
"glossaries.detail.save": "Save",
"glossaries.detail.savedTitle": "Saved",
"glossaries.detail.savedDesc": "The glossary has been updated.",
"glossaries.detail.settingsTitle": "Settings",
"glossaries.detail.sourceLang": "Source language",
"glossaries.detail.targetLang": "Target language",
"glossaries.detail.termsTitle": "Terms",
"glossaries.detail.terms": "terms",
"glossaries.detail.searchTerms": "Filter…",
"glossaries.detail.noTerms": "No terms yet.",
"glossaries.detail.addFirstTerm": "Add the first term",
"glossaries.detail.addTerm": "Add a term",
"glossaries.detail.maxReached": "Maximum limit reached",
"glossaries.detail.source": "Source",
"glossaries.detail.target": "Target",
"glossaries.detail.sourcePlaceholder": "source term",
"glossaries.detail.targetPlaceholder": "target term",
"glossaries.detail.csvTitle": "CSV",
"glossaries.detail.csvDesc": "Export your terms as CSV or import new ones (replaces the current list).",
"glossaries.detail.export": "Export",
"glossaries.detail.import": "Import",
"glossaries.detail.dangerTitle": "Danger zone",
"glossaries.detail.dangerDesc": "Deletion is permanent. All associated terms will be lost.",
"glossaries.detail.deleteGlossary": "Delete this glossary",
"glossaries.detail.confirmDelete": "Confirm deletion?",
"glossaries.detail.confirm": "Confirm",
"glossaries.detail.cancel": "Cancel",
"glossaries.detail.sourceLangNote": "'The original source is in French. For other languages, we read the term's translations field (if available).'",
"glossaries.detail.sourceLocked": "fixed",
"glossaries.detail.sourceLockedNote": "Templates only store the source in French. Multilingual source is on the roadmap.",
"glossaries.detail.targetLangNote": "Pick a language to see the matching translations, or « Multilingual » for the default value.",
"glossaries.detail.notFoundTitle": "Glossary not found",
"glossaries.detail.notFoundDesc": "This glossary does not exist or you don't have access to it.",
"glossaries.detail.maxTermsTitle": "Limit reached",
"glossaries.detail.maxTermsDesc": "Maximum {max} terms per glossary.",
"glossaries.detail.importEmptyTitle": "Empty file",
"glossaries.detail.importEmptyDesc": "No terms detected in this file.",
"glossaries.detail.importedTitle": "Imported",
"glossaries.detail.importedDesc": "{count} terms imported.",
"glossaries.detail.importErrorTitle": "Read error",
"glossaries.detail.importErrorDesc": "Unable to read the file."
}

View File

@@ -0,0 +1,56 @@
// Auto-generated by scripts/generate_i18n_index.py
// Merges all namespace JSON files for locale "ar".
import admin from "./admin.json";
import apiKeys from "./apiKeys.json";
import auth from "./auth.json";
import checkout from "./checkout.json";
import common from "./common.json";
import context from "./context.json";
import cookieConsent from "./cookieConsent.json";
import dashboard from "./dashboard.json";
import fileUploader from "./fileUploader.json";
import glossaries from "./glossaries.json";
import landing from "./landing.json";
import langSelector from "./langSelector.json";
import layout from "./layout.json";
import login from "./login.json";
import memento from "./memento.json";
import pricing from "./pricing.json";
import profile from "./profile.json";
import providerSelector from "./providerSelector.json";
import providerTheme from "./providerTheme.json";
import register from "./register.json";
import services from "./services.json";
import settings from "./settings.json";
import translate from "./translate.json";
import translateComplete from "./translateComplete.json";
const messages: Record<string, string> = {
...admin,
...apiKeys,
...auth,
...checkout,
...common,
...context,
...cookieConsent,
...dashboard,
...fileUploader,
...glossaries,
...landing,
...langSelector,
...layout,
...login,
...memento,
...pricing,
...profile,
...providerSelector,
...providerTheme,
...register,
...services,
...settings,
...translate,
...translateComplete,
};
export default messages;

View File

@@ -0,0 +1,146 @@
{
"landing.nav.why": "لماذا نحن؟",
"landing.nav.formats": "التنسيقات",
"landing.nav.pricing": "الأسعار",
"landing.nav.login": "تسجيل الدخول",
"landing.nav.startFree": "ابدأ مجانًا",
"landing.hero.tag": "ذكاء اصطناعي احترافي للمستندات",
"landing.hero.titleLine1": "ترجم مستنداتك.",
"landing.hero.titleLine2": "مع تنسيق مثالي.",
"landing.hero.description": "المترجم الوحيد الذي يحافظ على SmartArt والرسوم البيانية وجداول المحتويات والأشكال والتخطيطات المعقدة — تمامًا كما كانت.",
"landing.hero.ctaMain": "ابدأ مجانًا — مستندان/شهر",
"landing.hero.ctaSec": "عرض العروض",
"landing.hero.deleted": "الملفات تُحذف بعد 60 دقيقة",
"landing.hero.noHidden": "بدون رسوم خفية",
"landing.hero.preview": "معاينة قبل الدفع",
"landing.hero.formattedOk": "التنسيق سليم",
"landing.hero.aiActive": "ترجمة الذكاء الاصطناعي نشطة",
"landing.steps.title": "كيف يعمل؟",
"landing.steps.subtitle": "ثلاث خطوات. صفر فقدان في التنسيق.",
"landing.steps.step1.num": "01",
"landing.steps.step1.title": "ارفع ملفك",
"landing.steps.step1.desc": "اسحب وأفلت مستند Excel أو Word أو PowerPoint أو PDF.",
"landing.steps.step2.num": "02",
"landing.steps.step2.title": "اختر اللغة والمحرك",
"landing.steps.step2.desc": "حدد اللغة المستهدفة والمحرك — كلاسيكي أو ذكاء اصطناعي سياقي.",
"landing.steps.step3.num": "03",
"landing.steps.step3.title": "حمّل النتيجة",
"landing.steps.step3.desc": "احصل على مستندك المترجم بتنسيق مطابق تمامًا للأصل.",
"landing.features.tag": "محرك ترجمة بالذكاء الاصطناعي",
"landing.features.title": "ترجمة تفهم مجالك",
"landing.features.description": "نماذج الذكاء الاصطناعي لدينا تحلل السياق وتحترم مصطلحاتك وحتى تترجم النصوص داخل الصور.",
"landing.features.context.title": "سياق الصناعة",
"landing.features.context.desc": "صِف مجالك واحصل على ترجمات مخصصة، وليس عامة.",
"landing.features.glossary.title": "قواميس المصطلحات",
"landing.features.glossary.desc": "حدد مصطلحاتك التقنية. CTA تبقى «وحدة معالجة الهواء»، وليس «الدعوة للإجراء».",
"landing.features.vision.title": "التعرف على الصور",
"landing.features.vision.desc": "النص المضمن في الصور والمخططات والرسوم البياني يتم اكتشافه وترجمته.",
"landing.features.demo.source": "المصدر (FR)",
"landing.features.demo.google": "Google Translate",
"landing.features.demo.ours": "ذكاؤنا الاصطناعي",
"landing.layout.title": "تنسيقك،",
"landing.layout.title2": "محفوظ بشكل مثالي",
"landing.layout.subtitle": "المترجمون الآخرون يدمرون تخطيطك. نحن لا.",
"landing.layout.p1.title": "SmartArt والمخططات",
"landing.layout.p1.desc": "الهياكل التنظيمية، المخططات الانسيابية، التسلسلات الهرمية — كلها مترجمة بشكل مطابق.",
"landing.layout.p2.title": "جداول المحتويات",
"landing.layout.p2.desc": "إدخالات جدول المحتويات وأرقام الصفحات والمراجع المتبادلة محدثة بشكل صحيح.",
"landing.layout.p3.title": "الرسوم والمخططات البيانية",
"landing.layout.p3.desc": "العناوين، تسميات المحاور، التسميات التوضيحية وأسماء السلاسل — كل شيء مترجم.",
"landing.layout.p4.title": "الأشكال ومربعات النص",
"landing.layout.p4.desc": "مستطيلات، كتل مستديرة، تعليقات توضيحية — محلية في كل مكان.",
"landing.layout.p5.title": "الرؤوس والتذييلات",
"landing.layout.p5.desc": "الرؤوس والتذييلات والحواشي لا تُفوت أبدًا.",
"landing.layout.p6.title": "130+ لغة",
"landing.layout.p6.desc": "Google Translate و DeepL ومحركات ذكاء اصطناعي احترافية.",
"landing.formats.title": "كل تنسيق،",
"landing.formats.title2": "كل عنصر",
"landing.formats.subtitle": "نترجم ما يفوته الآخرون. عملك يستحق توثيقًا لا تشوبه شائبة.",
"landing.formats.word.name": "Word",
"landing.formats.word.i1": "الفقرات والعناوين",
"landing.formats.word.i2": "الجداول والرسوم البيانية",
"landing.formats.word.i3": "مخططات SmartArt",
"landing.formats.word.i4": "جدول المحتويات",
"landing.formats.word.i5": "الرؤوس والتذييلات",
"landing.formats.word.i6": "الأشكال ومربعات النص",
"landing.formats.word.i7": "الحواشي والتعليقات الختامية",
"landing.formats.excel.name": "Excel",
"landing.formats.excel.i1": "قيم الخلايا",
"landing.formats.excel.i2": "أسماء الأوراق",
"landing.formats.excel.i3": "الرسوم والتسميات",
"landing.formats.excel.i4": "الرؤوس والتذييلات",
"landing.formats.excel.i5": "الخلايا المدمجة محفوظة",
"landing.formats.pptx.name": "PowerPoint",
"landing.formats.pptx.i1": "نص الشرائح والملاحظات",
"landing.formats.pptx.i2": "الرسوم والمخططات",
"landing.formats.pptx.i3": "الأشكال ومربعات النص",
"landing.formats.pptx.i4": "التخطيطات الرئيسية",
"landing.formats.pptx.i5": "الرسوم المتحركة محفوظة",
"landing.formats.pdf.name": "PDF",
"landing.formats.pdf.i1": "ملفات PDF النصية",
"landing.formats.pdf.i2": "التخطيط محفوظ",
"landing.formats.pdf.i3": "الصور في مكانها",
"landing.formats.pdf.i4": "الجداول محفوظة",
"landing.formats.pdf.i5": "الإخراج كـ DOCX أو PDF",
"landing.pricing.title": "أسعار بسيطة وشفافة",
"landing.pricing.subtitle": "ما تراه هو ما تدفعه. بدون رسوم خفية.",
"landing.pricing.monthly": "شهريًا",
"landing.pricing.annual": "سنويًا",
"landing.pricing.bestValue": "الأكثر شعبية",
"landing.pricing.month": "/شهر",
"landing.pricing.footer": "السعر المعروض هو السعر الذي تدفعه. بدون رسوم خفية بعد الترجمة.",
"landing.pricing.starter.name": "Starter",
"landing.pricing.starter.desc": "للأفراد والمشاريع الصغيرة",
"landing.pricing.starter.f1": "50 مستند / شهر",
"landing.pricing.starter.f2": "حتى 50 صفحة لكل مستند",
"landing.pricing.starter.f3": "Google Translate + DeepL",
"landing.pricing.starter.f4": "ملفات حتى 10 ميجابايت",
"landing.pricing.starter.cta": "ابدأ الآن",
"landing.pricing.pro.name": "Pro",
"landing.pricing.pro.desc": "للمحترفين المتميزين",
"landing.pricing.pro.f1": "200 مستند / شهر",
"landing.pricing.pro.f2": "حتى 200 صفحة لكل مستند",
"landing.pricing.pro.f3": "ترجمة بالذكاء الاصطناعي",
"landing.pricing.pro.f4": "Google + DeepL مشمولان",
"landing.pricing.pro.f5": "قواميس وأوامر مخصصة",
"landing.pricing.pro.f6": "دعم ذو أولوية",
"landing.pricing.pro.cta": "جرّب Pro",
"landing.pricing.business.name": "الأعمال",
"landing.pricing.business.desc": "للفرق ذات الاحتياجات الكبيرة",
"landing.pricing.business.f1": "1,000 مستند / شهر",
"landing.pricing.business.f2": "حتى 500 صفحة لكل مستند",
"landing.pricing.business.f3": "ذكاء اصطناعي متميز (Claude)",
"landing.pricing.business.f4": "جميع المزودين + واجهة برمجة التطبيقات",
"landing.pricing.business.f5": "خطاطف الويب والأتمتة",
"landing.pricing.business.f6": "5 مقاعد للفريق",
"landing.pricing.business.cta": "تواصل معنا",
"landing.cta.title": "ابدأ الترجمة في 30 ثانية",
"landing.cta.subtitle": "لا حاجة لبطاقة ائتمان. جرّب مجانًا الآن وأعد الحياة إلى مستنداتك متعددة اللغات.",
"landing.cta.button": "إنشاء حساب مجاني",
"landing.cta.secure": "محمي بتشفير AES-256",
"landing.footer.desc": "خبراء في الترجمة الذكية للمستندات. نمزج بين فن التنسيق وعلم الذكاء الاصطناعي السياقي.",
"landing.footer.product": "المنتج",
"landing.footer.resources": "الموارد",
"landing.footer.legal": "قانوني",
"landing.footer.rights": "© 2026 Wordly.art — جميع الحقوق محفوظة.",
"landing.hero.contextEngine": "ترجمة مكتشفة: مصطلح صيانة تقني لأنظمة التدفئة والتهوية...",
"landing.hero.liveAnalysis": "تحليل مباشر",
"landing.hero.termsDetected": "مصطلحات مكتشفة",
"landing.steps.process": "العملية",
"landing.translate.newProject": "مشروع جديد",
"landing.translate.title": "ترجمة مستند",
"landing.translate.subtitle": "استورد ملفًا واختر اللغة المستهدفة",
"landing.translate.sourceDocument": "المستند المصدر",
"landing.translate.configuration": "الإعدادات",
"landing.translate.sourceLang": "لغة المصدر",
"landing.translate.targetLang": "اللغة المستهدفة",
"landing.translate.provider": "المزود",
"landing.translate.startTranslation": "بدء الترجمة",
"landing.translate.zeroRetention": "صفر احتفاظ",
"landing.translate.filesDeleted": "الملفات محذوفة بعد المعالجة",
"landing.translate.dropHere": "اسحب وأفلت هنا",
"landing.translate.supportedFormats": "ملفات DOCX, XLSX, PPTX أو PDF مدعومة",
"landing.translate.aiAnalysis": "تحليل AI نشط",
"landing.translate.processing": "جاري المعالجة",
"landing.translate.preservingLayout": "جاري الحفاظ على التنسيق"
}

View File

@@ -0,0 +1,7 @@
{
"langSelector.search": "بحث…",
"langSelector.noResults": "لا توجد نتائج",
"langSelector.source": "المصدر",
"langSelector.target": "الهدف",
"langSelector.swap": "تبديل"
}

View File

@@ -0,0 +1,5 @@
{
"layout.nav.apiAccess": "وصول API",
"layout.footer.terms": "الشروط",
"layout.footer.privacy": "الخصوصية"
}

View File

@@ -0,0 +1,6 @@
{
"login.orContinueWith": "أو تابع بالبريد الإلكتروني",
"login.google.connecting": "جارٍ الاتصال…",
"login.google.errorGeneric": "حدث خطأ في تسجيل الدخول عبر Google.",
"login.google.errorFailed": "فشل تسجيل الدخول عبر Google. حاول مرة أخرى."
}

View File

@@ -0,0 +1,6 @@
{
"memento.title": "اكتشف Momento",
"memento.slogan": "Momento ليس مجرد تطبيق ملاحظات. إنه نظام بيئي ذكي يربط ويحلل ويطور أفكارك في الوقت الفعلي باستخدام 6 وكلاء ذكاء اصطناعي وبحث دلالي متقدم.",
"memento.ctaFree": "ابدأ مجاناً",
"memento.ctaMore": "اعرف المزيد"
}

View File

@@ -0,0 +1,151 @@
{
"pricing.nav.back": "رجوع",
"pricing.nav.home": "الرئيسية",
"pricing.nav.mySubscription": "اشتراكي",
"pricing.header.badge": "نماذج الذكاء الاصطناعي المحدّثة — مارس 2026",
"pricing.header.title": "خطة لكل احتياج",
"pricing.header.subtitle": "ترجم مستندات Word و Excel و PowerPoint مع الحفاظ على التنسيق الأصلي. بدون الحاجة إلى مفتاح API.",
"pricing.billing.monthly": "شهري",
"pricing.billing.yearly": "سنوي",
"pricing.plans.free.name": "مجاني",
"pricing.plans.starter.name": "Starter",
"pricing.plans.pro.name": "Pro",
"pricing.plans.business.name": "Business",
"pricing.plans.enterprise.name": "Enterprise",
"pricing.plans.free.description": "مثالي لاكتشاف التطبيق",
"pricing.plans.starter.description": "للأفراد والمشاريع الصغيرة",
"pricing.plans.pro.description": "للمحترفين والفرق النامية",
"pricing.plans.business.description": "للفرق والمؤسسات",
"pricing.plans.enterprise.description": "حلول مخصصة للمؤسسات الكبيرة",
"pricing.plans.pro.highlight": "الأكثر شعبية",
"pricing.plans.pro.badge": "رائج",
"pricing.plans.enterprise.badge": "حسب الطلب",
"pricing.plans.free.feat1": "5 مستندات / شهر",
"pricing.plans.free.feat2": "حتى 15 صفحة لكل مستند",
"pricing.plans.free.feat3": "ترجمة Google مشمولة",
"pricing.plans.free.feat4": "جميع اللغات (130+)",
"pricing.plans.free.feat5": "دعم المجتمع",
"pricing.plans.starter.feat1": "50 مستندًا / شهر",
"pricing.plans.starter.feat2": "حتى 50 صفحة لكل مستند",
"pricing.plans.starter.feat3": "ترجمة Google + DeepL",
"pricing.plans.starter.feat4": "ملفات حتى 10 ميغابايت",
"pricing.plans.starter.feat5": "دعم عبر البريد الإلكتروني",
"pricing.plans.starter.feat6": "سجل 30 يومًا",
"pricing.plans.pro.feat1": "200 مستند / شهر",
"pricing.plans.pro.feat2": "حتى 200 صفحة لكل مستند",
"pricing.plans.pro.feat3": "ترجمة الذكاء الاصطناعي الأساسية",
"pricing.plans.pro.feat4": "ترجمة Google + DeepL",
"pricing.plans.pro.feat5": "ملفات حتى 25 ميغابايت",
"pricing.plans.pro.feat6": "معاجم مخصصة",
"pricing.plans.pro.feat7": "دعم ذو أولوية",
"pricing.plans.pro.feat8": "سجل 90 يومًا",
"pricing.plans.business.feat1": "1 000 مستند / شهر",
"pricing.plans.business.feat2": "حتى 500 صفحة لكل مستند",
"pricing.plans.business.feat3": "AI أساسية + متميزة (Claude Haiku)",
"pricing.plans.business.feat4": "جميع مزوّدي الترجمة",
"pricing.plans.business.feat5": "ملفات حتى 50 ميغابايت",
"pricing.plans.business.feat6": "وصول API (10 000 استدعاء/شهر)",
"pricing.plans.business.feat7": "ويب هوك للإشعارات",
"pricing.plans.business.feat8": "دعم مخصص",
"pricing.plans.business.feat9": "سجل سنة واحدة",
"pricing.plans.business.feat10": "تحليلات متقدمة",
"pricing.plans.enterprise.feat1": "مستندات بلا حدود",
"pricing.plans.enterprise.feat2": "جميع نماذج AI (GPT-5, Claude Opus 4.6…)",
"pricing.plans.enterprise.feat3": "نشر محلي أو سحابة مخصصة",
"pricing.plans.enterprise.feat4": "SLA 99.9% مضمون",
"pricing.plans.enterprise.feat5": "دعم مخصص على مدار الساعة",
"pricing.plans.enterprise.feat6": "العلامة البيضاء (White-label)",
"pricing.plans.enterprise.feat7": "فرق بلا حدود",
"pricing.plans.enterprise.feat8": "تكاملات مخصصة",
"pricing.card.onRequest": "حسب الطلب",
"pricing.card.free": "مجاني",
"pricing.card.perMonth": "/شهر",
"pricing.card.billedYearly": "يُحاسب {price} € / سنة",
"pricing.card.documents": "المستندات",
"pricing.card.pagesMax": "الحد الأقصى للصفحات",
"pricing.card.aiTranslation": "ترجمة AI",
"pricing.card.unlimited": "بلا حدود",
"pricing.card.perMonthStat": "/ شهر",
"pricing.card.perDoc": "ص / مستند",
"pricing.card.aiEssential": "أساسي",
"pricing.card.aiEssentialPremium": "أساسي + متميز",
"pricing.card.aiCustom": "مخصص",
"pricing.card.myPlan": "خطتي",
"pricing.card.managePlan": "إدارة خطتي",
"pricing.card.startFree": "ابدأ مجانًا",
"pricing.card.contactUs": "تواصل معنا",
"pricing.card.choosePlan": "اختر هذه الخطة",
"pricing.card.processing": "جارٍ المعالجة…",
"pricing.comparison.title": "مقارنة تفصيلية",
"pricing.comparison.subtitle": "كل ما هو مشمول في كل خطة",
"pricing.comparison.feature": "الميزة",
"pricing.comparison.docsPerMonth": "المستندات / شهر",
"pricing.comparison.pagesMaxPerDoc": "الحد الأقصى للصفحات / مستند",
"pricing.comparison.maxFileSize": "الحد الأقصى لحجم الملف",
"pricing.comparison.googleTranslation": "ترجمة Google",
"pricing.comparison.deepl": "DeepL",
"pricing.comparison.aiEssential": "ترجمة AI أساسية",
"pricing.comparison.aiPremium": "ترجمة AI متميزة",
"pricing.comparison.apiAccess": "وصول API",
"pricing.comparison.priorityProcessing": "معالجة ذات أولوية",
"pricing.comparison.support": "الدعم",
"pricing.comparison.support.community": "المجتمع",
"pricing.comparison.support.email": "البريد الإلكتروني",
"pricing.comparison.support.priority": "ذو أولوية",
"pricing.comparison.support.dedicated": "مخصص",
"pricing.comparison.mb": "ميغابايت",
"pricing.credits.title": "أرصدة إضافية",
"pricing.credits.subtitle": "تحتاج المزيد؟ اشترِ أرصدة فردية بدون اشتراك.",
"pricing.credits.perPage": "رصيد واحد = صفحة واحدة مترجمة.",
"pricing.credits.bestValue": "أفضل قيمة",
"pricing.credits.unit": "أرصدة",
"pricing.credits.centsPerCredit": "سنت / رصيد",
"pricing.credits.buy": "شراء",
"pricing.trust.encryption.title": "تشفير شامل",
"pricing.trust.encryption.sub": "TLS 1.3 + AES-256 في حالة السكون",
"pricing.trust.languages.title": "+130 لغة",
"pricing.trust.languages.sub": "بما فيها العربية والفارسية والعبرية (RTL)",
"pricing.trust.parallel.title": "معالجة متوازية",
"pricing.trust.parallel.sub": "ذكاء اصطناعي متعدد المسارات فائق السرعة",
"pricing.trust.availability.title": "متاح على مدار الساعة",
"pricing.trust.availability.sub": "ضمان وقت تشغيل 99.9%",
"pricing.aiModels.title": "نماذج الذكاء الاصطناعي — مارس 2026",
"pricing.aiModels.essential.title": "ترجمة AI أساسية",
"pricing.aiModels.essential.plan": "خطة Pro",
"pricing.aiModels.essential.descPrefix": "مبني على",
"pricing.aiModels.essential.descSuffix": "— أنموذج الذكاء الاصطناعي الأكثر فعالية من حيث التكلفة لعام 2026. جودة مماثلة للنماذج المتقدمة بتكلفة أقل بكثير.",
"pricing.aiModels.essential.modelName": "نموذج الذكاء الاصطناعي الأساسي",
"pricing.aiModels.essential.context": "163K رمز سياقي",
"pricing.aiModels.essential.value": "قيمة ممتازة مقابل المال",
"pricing.aiModels.premium.title": "ترجمة AI متميزة",
"pricing.aiModels.premium.plan": "خطة Business",
"pricing.aiModels.premium.descPrefix": "مبني على",
"pricing.aiModels.premium.descSuffix": "من Anthropic — دقة عالية في المستندات القانونية والطبية والتقنية المعقدة.",
"pricing.aiModels.premium.context": "200K رمز سياقي",
"pricing.aiModels.premium.precision": "أعلى دقة",
"pricing.faq.title": "الأسئلة الشائعة",
"pricing.faq.q1": "هل يمكنني تغيير خطتي في أي وقت؟",
"pricing.faq.a1": "نعم. الترقية فورية ومُحاسب عليها بالتناسب. التخفيض يسري في نهاية الفترة الحالية.",
"pricing.faq.q2": "ما هي «ترجمة AI الأساسية»؟",
"pricing.faq.a2": "إنه محرك الذكاء الاصطناعي الخاص بنا. يفهم سياق مستنداتك، ويحافظ على التخطيط، ويتعامل مع المصطلحات التقنية بشكل أفضل بكثير من الترجمة الكلاسيكية.",
"pricing.faq.q3": "ما الفرق بين AI الأساسية وAI المتميزة؟",
"pricing.faq.a3": "الذكاء الاصطناعي الأساسي يستخدم نموذجًا محسّنًا (قيمة ممتازة مقابل المال). الذكاء الاصطناعي المتميز يستخدم Claude 3.5 Haiku من Anthropic، أكثر دقة في المستندات القانونية والطبية والتقنية المعقدة.",
"pricing.faq.q4": "هل تُحفظ مستنداتي بعد الترجمة؟",
"pricing.faq.a4": "الملفات المترجمة متاحة حسب خطتك (30 يومًا لـ Starter، 90 يومًا لـ Pro، سنة واحدة لـ Business). وهي مشفرة أثناء التخزين والنقل.",
"pricing.faq.q5": "ماذا يحدث إذا تجاوزت حصتي الشهرية؟",
"pricing.faq.a5": "يمكنك شراء أرصدة إضافية بشكل فردي أو ترقية خطتك. يتم إشعارك عند بلوغ 80% من الاستخدام.",
"pricing.faq.q6": "هل توجد فترة تجريبية مجانية للخطط المدفوعة؟",
"pricing.faq.a6": "الخطة المجانية دائمة ولا تتطلب بطاقة ائتمان. للخطط Pro و Business تواصل معنا للحصول على تجربة 14 يومًا.",
"pricing.faq.q7": "ما تنسيقات الملفات المدعومة؟",
"pricing.faq.a7": "Word (.docx), Excel (.xlsx/.xls), PowerPoint (.pptx), and soon PDF. All plans support the same formats.",
"pricing.cta.title": "مستعد للبدء؟",
"pricing.cta.subtitle": "ابدأ مجانًا بدون بطاقة ائتمان. رقِّق عندما تحتاج.",
"pricing.cta.createAccount": "إنشاء حساب مجاني",
"pricing.cta.login": "تسجيل الدخول",
"pricing.toast.demo": "الوضع التجريبي — Stripe لم يُعدّ بعد. في بيئة الإنتاج سيتم توجيهك إلى الدفع لتفعيل خطة {planId}.",
"pricing.toast.networkError": "خطأ في الشبكة. يرجى إعادة المحاولة.",
"pricing.toast.paymentError": "خطأ أثناء إنشاء الدفع.",
"pricing.dashboard": "لوحة التحكم",
"pricing.okSymbol": "✓",
"pricing.errSymbol": "✕"
}

View File

@@ -0,0 +1,58 @@
{
"profile.header.title": "ملفي الشخصي",
"profile.header.subtitle": "إدارة حسابك وتفضيلاتك.",
"profile.tabs.account": "الحساب",
"profile.tabs.subscription": "الاشتراك",
"profile.tabs.preferences": "التفضيلات",
"profile.account.user": "المستخدم",
"profile.account.memberSince": "عضو منذ",
"profile.plan.label": "الخطة",
"profile.plan.free": "Free",
"profile.plan.starter": "Starter",
"profile.plan.pro": "Pro",
"profile.plan.business": "Business",
"profile.plan.enterprise": "Enterprise",
"profile.plan.pricePerMonth": "{price} €/شهر",
"profile.subscription.canceling": "جارٍ الإلغاء",
"profile.subscription.active": "نشط",
"profile.subscription.unknown": "غير معروف",
"profile.subscription.accessUntil": "الوصول حتى",
"profile.subscription.renewalOn": "التجديد في",
"profile.subscription.upgradePlan": "الترقية إلى خطة مدفوعة",
"profile.subscription.changePlan": "تغيير الخطة",
"profile.subscription.manageBilling": "إدارة الفوترة",
"profile.subscription.billingUnavailable": "بوابة الفوترة غير متاحة.",
"profile.subscription.billingError": "خطأ في الوصول إلى بوابة الفوترة.",
"profile.subscription.cancelSuccess": "تم إلغاء الاشتراك. تحتفظ بالوصول حتى نهاية الفترة.",
"profile.subscription.cancelError": "حدث خطأ أثناء الإلغاء.",
"profile.subscription.networkError": "خطأ في الشبكة.",
"profile.usage.title": "الاستخدام هذا الشهر",
"profile.usage.resetOn": "إعادة التعيين في",
"profile.usage.documents": "المستندات",
"profile.usage.pages": "الصفحات",
"profile.usage.extraCredits": "رصيد إضافي",
"profile.usage.extraCreditsPlural": "أرصدة إضافية",
"profile.usage.quotaReached": "تم بلوغ الحصة",
"profile.usage.quotaReachedDesc": "قم بالترقية إلى خطة أعلى للمتابعة.",
"profile.usage.unlockMore": "احصل على المزيد من الترجمات مع خطة مدفوعة.",
"profile.usage.viewPlans": "عرض الخطط",
"profile.usage.includedInPlan": "مضمن في خطتك",
"profile.danger.title": "منطقة الخطر",
"profile.danger.description": "يتم تطبيق الإلغاء في نهاية الفترة الحالية. تحتفظ بالوصول حتى ذلك التاريخ.",
"profile.danger.confirm": "هل أنت متأكد؟ لا يمكن التراجع عن هذا الإجراء.",
"profile.danger.confirmCancel": "تأكيد الإلغاء",
"profile.danger.cancelSubscription": "إلغاء اشتراكي",
"profile.danger.keep": "لا، إبقاء",
"profile.prefs.interfaceLang": "لغة الواجهة",
"profile.prefs.interfaceLangDesc": "يتم اكتشاف اللغة تلقائيًا بناءً على متصفحك. يمكنك تغييرها يدويًا.",
"profile.prefs.defaultTargetLang": "اللغة الهدف الافتراضية",
"profile.prefs.selectLanguage": "اختر لغة",
"profile.prefs.defaultTargetLangDesc": "سيتم تحديد هذه اللغة مسبقًا لترجماتك.",
"profile.prefs.save": "حفظ",
"profile.prefs.theme": "المظهر",
"profile.prefs.themeDesc": "اختر مظهر الواجهة",
"profile.prefs.cache": "ذاكرة التخزين المؤقت",
"profile.prefs.cacheDesc": "مسح ذاكرة التخزين المؤقت المحلية قد يحل بعض مشاكل العرض.",
"profile.prefs.clearing": "جارٍ المسح...",
"profile.prefs.clearCache": "مسح ذاكرة التخزين المؤقت"
}

View File

@@ -0,0 +1,7 @@
{
"providerSelector.noClassic": "لا يوجد مترجم قياسي متاح.",
"providerSelector.noLlm": "لم يتم تكوين نموذج ذكاء اصطناعي.",
"providerSelector.costOne": "التكلفة: رصيد واحد لكل صفحة",
"providerSelector.costFive": "التكلفة: 5 أرصدة لكل صفحة (عامل مميز)",
"providerSelector.unlockContextual": "افتح الترجمة السياقية المتميزة لمستنداتك بالكامل."
}

View File

@@ -0,0 +1,29 @@
{
"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": "محرك سحابي احترافي محسّن لمعالجة كميات كبيرة من المستندات."
}

View File

@@ -0,0 +1,29 @@
{
"register.title": "إنشاء حساب",
"register.subtitle": "ابدأ الترجمة مجانًا",
"register.error.failed": "فشل التسجيل",
"register.name.label": "الاسم",
"register.name.placeholder": "اسمك",
"register.name.error": "يجب أن يحتوي الاسم على حرفين على الأقل",
"register.email.label": "البريد الإلكتروني",
"register.email.placeholder": "you@example.com",
"register.email.error": "عنوان بريد إلكتروني غير صالح",
"register.password.label": "كلمة المرور",
"register.password.error": "يجب أن تتكون كلمة المرور من 8 أحرف على الأقل، مع حرف كبير وحرف صغير ورقم",
"register.password.show": "إظهار كلمة المرور",
"register.password.hide": "إخفاء كلمة المرور",
"register.password.strengthLabel": "القوة:",
"register.password.strength.weak": "ضعيفة",
"register.password.strength.medium": "متوسطة",
"register.password.strength.strong": "قوية",
"register.confirmPassword.label": "تأكيد كلمة المرور",
"register.confirmPassword.error": "كلمتا المرور غير متطابقتين",
"register.confirmPassword.show": "إظهار",
"register.confirmPassword.hide": "إخفاء",
"register.submit.creating": "جارٍ إنشاء الحساب...",
"register.submit.create": "إنشاء حسابي",
"register.hasAccount": "لديك حساب بالفعل؟",
"register.login": "تسجيل الدخول",
"register.terms.prefix": "بإنشاء حساب، فإنك تقبل",
"register.terms.link": "شروط الخدمة الخاصة بنا"
}

View File

@@ -0,0 +1,14 @@
{
"services.title": "مزودو الترجمة",
"services.subtitle": "تم تكوين المزودين من قبل المسؤول. يمكنك معرفة أيهم متاح حاليًا لحسابك.",
"services.loading": "جارٍ تحميل المزودين...",
"services.noProviders": "لا يوجد مزودون مكوّنون حاليًا. اتصل بالمسؤول.",
"services.classic": "ترجمة كلاسيكية",
"services.llmPro": "LLM · مدرك للسياق (Pro)",
"services.available": "متاح",
"services.model": "النموذج",
"services.adminOnly.title": "تكوين المزودين للمسؤولين فقط",
"services.adminOnly.desc": "يتم إدارة مفاتيح API واختيار النماذج وتفعيل المزودين حصريًا من قبل المسؤول في لوحة الإدارة. لا تحتاج أبدًا إلى إدخال مفتاح API.",
"services.fallback.google.label": "ترجمة Google",
"services.fallback.google.desc": "ترجمة سريعة، أكثر من 130 لغة"
}

View File

@@ -0,0 +1,20 @@
{
"settings.title": "الإعدادات",
"settings.subtitle": "إعدادات التطبيق العامة",
"settings.formats.title": "التنسيقات المدعومة",
"settings.formats.subtitle": "أنواع المستندات التي يمكنك ترجمتها",
"settings.formats.formulas": "الصيغ",
"settings.formats.styles": "الأنماط",
"settings.formats.images": "الصور",
"settings.formats.headers": "الرؤوس",
"settings.formats.tables": "الجداول",
"settings.formats.slides": "الشرائح",
"settings.formats.notes": "الملاحظات",
"settings.cache.title": "ذاكرة التخزين المؤقت",
"settings.cache.desc": "مسح ذاكرة التخزين المؤقت المحلية قد يحل بعض مشاكل العرض.",
"settings.cache.clearing": "جارٍ المسح...",
"settings.cache.clear": "مسح ذاكرة التخزين المؤقت",
"settings.formats.excel.name": "Excel",
"settings.formats.word.name": "Word",
"settings.formats.powerpoint.name": "PowerPoint"
}

View File

@@ -0,0 +1,92 @@
{
"translate.mode.label": "Mode de traduction",
"translate.mode.classic": "Classique",
"translate.mode.classicDesc": "Rapide",
"translate.mode.proLlm": "Pro LLM",
"translate.mode.proLlmDesc": "Contextuel",
"translate.mode.tooltip": "Passez à Pro pour la traduction LLM",
"translate.mode.upgradeLink": "Passer à Pro",
"translate.mode.upgradeDesc": "pour des traductions alimentées par LLM",
"translate.glossary.title": "المسرد",
"translate.glossary.select": "اختر مسرداً",
"translate.glossary.none": "بدون",
"translate.glossary.terms": "مصطلحات",
"translate.glossary.proOnly": "قم بالترقية إلى Pro لاستخدام المصطلحات",
"translate.glossary.myGlossaries": "مصطلحاتي",
"translate.glossary.fromTemplate": "إنشاء من قالب",
"translate.glossary.noGlossaryForPair": "لا مصطلحات لـ",
"translate.glossary.noGlossaries": "لا مصطلحات",
"translate.glossary.loading": "جاري التحميل...",
"translate.glossary.classicMode": "محرك محايد بدون مسرد (AI فقط)",
"translate.glossary.selectPlaceholder": "اختر مسرداً...",
"translate.glossary.multilingual": "متعدد اللغات",
"translate.glossary.noGlossaryAvailable": "لا يوجد مسرد متاح",
"translate.glossary.filterByLang": "تصفية حسب اللغة",
"translate.glossary.active": "نشط",
"translate.glossary.inactive": "غير نشط",
"translate.glossary.availableTemplates": "القوالب المتاحة",
"translate.glossary.importing": "جاري الاستيراد...",
"translate.glossary.imported": "(مستورد)",
"translate.glossary.noGlossaryForSource": "لا يوجد مسرد أو قالب للغة المصدر",
"translate.glossary.createGlossary": "إنشاء مسرد",
"translate.glossary.showAll": "عرض جميع المسارد",
"translate.glossary.activePreview": "معاينة التطابقات النشطة:",
"translate.glossary.total": "الإجمالي",
"translate.glossary.moreTerms": "مصطلحات إضافية",
"translate.glossary.noTerms": "لا توجد مصطلحات في هذا المسرد.",
"translate.glossary.sourceTerm": "مصطلح المصدر",
"translate.glossary.translation": "الترجمة",
"translate.glossary.addTerm": "إضافة مصطلح",
"translate.glossary.disabledMode": "محرك محايد بدون مسرد مطبق",
"translate.glossary.addTermError": "خطأ في إضافة المصطلح",
"translate.glossary.networkError": "خطأ في الشبكة",
"translate.glossary.importFailed": "فشل الاستيراد ({status})",
"translate.glossary.helpText": "يسرد المسرد ترجمة دقيقة للمصطلحات. اختر مسرداً تطابق لغته المصدر اللغة الأصلية لمستندك.",
"translate.glossary.sourceWarning": "تحذير: هذا المسرد يستخدم لغة المصدر",
"translate.glossary.sourceWarningBut": "ولكن مستندك مهيأ بـ",
"translate.glossary.targetWarning": "عدم توافق الهدف: هذا المسرد مصمم للترجمة إلى",
"translate.glossary.targetWarningBut": "ولكن مستندك يستهدف",
"translate.glossary.targetWarningEnd": "قد لا تكون المصطلحات ذات صلة.",
"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 فقط)"
}

View File

@@ -0,0 +1,6 @@
{
"translateComplete.highQuality": "جودة عالية",
"translateComplete.segments": "المقاطع",
"translateComplete.characters": "الأحرف",
"translateComplete.confidence": "الثقة"
}

View File

@@ -0,0 +1,48 @@
{
"admin.login.title": "Administration",
"admin.login.required": "Anmeldung erforderlich",
"admin.login.password": "Admin-Passwort",
"admin.login.connecting": "Verbindung wird hergestellt...",
"admin.login.access": "Admin-Panel öffnen",
"admin.login.restricted": "Nur für Administratoren",
"admin.layout.checking": "Authentifizierung wird überprüft...",
"admin.dashboard.title": "Admin-Dashboard",
"admin.dashboard.subtitle": "Administratorkontrollpanel",
"admin.dashboard.refresh": "Aktualisieren",
"admin.dashboard.refreshTooltip": "Dashboard-Daten aktualisieren",
"admin.dashboard.config": "Systemkonfiguration",
"admin.dashboard.maxFileSize": "Max. Dateigröße:",
"admin.dashboard.translationService": "Übersetzungsdienst:",
"admin.dashboard.formats": "Formate:",
"admin.nav.dashboard": "Dashboard",
"admin.nav.users": "Benutzer",
"admin.nav.pricing": "Preise & Stripe",
"admin.nav.providers": "Anbieter",
"admin.nav.system": "System",
"admin.nav.logs": "Protokolle",
"admin.users.title": "Benutzerverwaltung",
"admin.users.subtitle": "Benutzerkonten anzeigen und verwalten",
"admin.users.planUpdated": "Plan aktualisiert",
"admin.users.planChanged": "Der Plan wurde erfolgreich zu \\\"{plan}\\\" geändert.",
"admin.users.unknownError": "Unbekannter Fehler",
"admin.users.error": "Fehler",
"admin.users.planUpdateError": "Plan konnte nicht aktualisiert werden: {message}",
"admin.users.noKeys": "Keine Schlüssel",
"admin.users.noKeysDesc": "Dieser Benutzer hat keine aktiven API-Schlüssel.",
"admin.users.keysRevoked": "Schlüssel widerrufen",
"admin.users.keysRevokedDesc": "{count} API-Schlüssel erfolgreich widerrufen.",
"admin.users.revokeError": "Schlüssel konnten nicht widerrufen werden: {message}",
"admin.users.retry": "Erneut versuchen",
"admin.system.title": "System",
"admin.system.subtitle": "Systemstatus überwachen und Ressourcen verwalten",
"admin.system.quotas": "Übersetzungskontingente",
"admin.system.resetQuotas": "Monatliche Kontingente zurücksetzen",
"admin.system.resetting": "Zurücksetzen...",
"admin.system.reset": "Zurücksetzen",
"admin.system.allOperational": "Alle Systeme betriebsbereit",
"admin.system.issuesDetected": "Systemprobleme erkannt",
"admin.system.waitingData": "Warte auf Daten...",
"admin.system.purging": "Bereinigung läuft...",
"admin.system.clean": "Bereinigen",
"admin.system.purge": "Bereinigen"
}

View File

@@ -0,0 +1,72 @@
{
"apiKeys.webhook.title": "Intégration Webhook",
"apiKeys.webhook.descriptionBefore": "Passez un paramètre ",
"apiKeys.webhook.descriptionAfter": " pour recevoir une requête POST lorsque votre traduction est terminée.",
"apiKeys.webhook.codeParam": "webhook_url",
"apiKeys.title": "API-Schlüssel",
"apiKeys.subtitle": "Verwalten Sie Ihre API-Schlüssel für den programmgesteuerten Zugriff auf die Übersetzungs-API.",
"apiKeys.loading": "Laden...",
"apiKeys.sectionTitle": "API & Automatisierung",
"apiKeys.sectionDesc": "Generieren und verwalten Sie Ihre API-Schlüssel für Automatisierungs-Workflows",
"apiKeys.keysUsed": "{total} von {max} Schlüsseln verwendet",
"apiKeys.maxReached": "Maximale Anzahl an Schlüsseln erreicht. Widerrufen Sie einen Schlüssel, um einen neuen zu generieren.",
"apiKeys.canGenerate": "Sie können {count} weiteren Schlüssel generieren",
"apiKeys.canGeneratePlural": "Sie können {count} weitere Schlüssel generieren",
"apiKeys.generateNew": "Neuen Schlüssel generieren",
"apiKeys.keyRevoked": "Schlüssel widerrufen",
"apiKeys.keyRevokedDesc": "Der API-Schlüssel wurde erfolgreich widerrufen.",
"apiKeys.keyNotFound": "Schlüssel nicht gefunden",
"apiKeys.keyNotFoundDesc": "Der API-Schlüssel existiert nicht mehr. Er wurde möglicherweise bereits widerrufen.",
"apiKeys.error": "Fehler",
"apiKeys.revokeError": "Der API-Schlüssel konnte nicht widerrufen werden. Bitte versuchen Sie es erneut.",
"apiKeys.limitReached": "Limit erreicht",
"apiKeys.limitReachedDesc": "Sie haben das Maximum von 10 API-Schlüsseln erreicht. Widerrufen Sie einen vorhandenen Schlüssel, um einen neuen zu generieren.",
"apiKeys.proRequired": "Pro-Funktion erforderlich",
"apiKeys.proRequiredDesc": "API-Schlüssel sind eine Pro-Funktion. Bitte upgraden Sie Ihr Konto.",
"apiKeys.generateError": "API-Schlüssel konnte nicht generiert werden. Bitte versuchen Sie es erneut.",
"apiKeys.upgrade.title": "API-Schlüssel",
"apiKeys.upgrade.subtitle": "Automatisieren Sie Ihre Übersetzungen mit API-Zugang",
"apiKeys.upgrade.feat1": "Generieren Sie unbegrenzt API-Schlüssel",
"apiKeys.upgrade.feat2": "Automatisieren Sie die Dokumentübersetzung",
"apiKeys.upgrade.feat3": "Webhook-Benachrichtigungen",
"apiKeys.upgrade.feat4": "LLM-Übersetzungsmodi",
"apiKeys.upgrade.proFeature": "API-Schlüssel sind eine {pro}-Funktion. Upgraden Sie, um API-Automatisierung freizuschalten.",
"apiKeys.upgrade.pro": "Pro",
"apiKeys.upgrade.cta": "Auf Pro upgraden",
"apiKeys.dialog.maxTitle": "Maximale Anzahl an Schlüsseln erreicht",
"apiKeys.dialog.maxDesc": "Sie haben das Maximum von 10 API-Schlüsseln erreicht. Bitte widerrufen Sie einen vorhandenen Schlüssel, bevor Sie einen neuen generieren.",
"apiKeys.dialog.close": "Schließen",
"apiKeys.dialog.generated": "API-Schlüssel generiert!",
"apiKeys.dialog.generatedDesc": "Ihr neuer API-Schlüssel wurde erstellt. Kopieren Sie ihn jetzt er wird nicht erneut angezeigt.",
"apiKeys.dialog.important": "Wichtig:",
"apiKeys.dialog.importantDesc": "Dies ist das einzige Mal, dass Sie diesen Schlüssel sehen. Speichern Sie ihn sicher.",
"apiKeys.dialog.apiKey": "API-Schlüssel",
"apiKeys.dialog.name": "Name:",
"apiKeys.dialog.done": "Fertig",
"apiKeys.dialog.copied": "Ich habe den Schlüssel kopiert",
"apiKeys.dialog.generateTitle": "Neuen API-Schlüssel generieren",
"apiKeys.dialog.generateDesc": "Erstellen Sie einen neuen API-Schlüssel für den programmgesteuerten Zugriff auf die Übersetzungs-API.",
"apiKeys.dialog.keyName": "Schlüsselname (optional)",
"apiKeys.dialog.keyNamePlaceholder": "z.B., Produktion, Staging",
"apiKeys.dialog.keyNameHint": "Ein beschreibender Name, um diesen Schlüssel später zu identifizieren.",
"apiKeys.dialog.nameTooLong": "Der Name muss {max} Zeichen oder weniger haben",
"apiKeys.dialog.nameInvalid": "Der Name darf nur Buchstaben, Zahlen, Leerzeichen, Bindestriche und Unterstriche enthalten",
"apiKeys.dialog.cancel": "Abbrechen",
"apiKeys.dialog.generating": "Wird generiert...",
"apiKeys.dialog.generate": "Schlüssel generieren",
"apiKeys.table.name": "Name",
"apiKeys.table.prefix": "Präfix",
"apiKeys.table.created": "Erstellt",
"apiKeys.table.lastUsed": "Zuletzt verwendet",
"apiKeys.table.never": "Nie",
"apiKeys.table.actions": "Aktionen",
"apiKeys.table.revoke": "Widerrufen",
"apiKeys.table.copyPrefix": "Schlüsselpräfix kopieren",
"apiKeys.table.revokeKey": "Schlüssel widerrufen",
"apiKeys.revokeDialog.title": "API-Schlüssel widerrufen",
"apiKeys.revokeDialog.desc": "Sind Sie sicher, dass Sie den Schlüssel \\\"{name}\\\" widerrufen möchten? Diese Aktion kann nicht rückgängig gemacht werden.",
"apiKeys.revokeDialog.confirm": "Ja, widerrufen",
"apiKeys.revokeDialog.cancel": "Abbrechen",
"apiKeys.noKeysGenerated": "Keine Schlüssel generiert",
"apiKeys.copied": "Kopiert!"
}

View File

@@ -0,0 +1,3 @@
{
"auth.brandName": "Wordly"
}

View File

@@ -0,0 +1,12 @@
{
"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."
}

View File

@@ -0,0 +1,4 @@
{
"common.loading": "Laden...",
"common.backToHome": "Zurück zur Startseite"
}

View File

@@ -0,0 +1,25 @@
{
"context.proTitle": "Pro-Funktion",
"context.proDesc": "Kontext und professionelle Glossare sind mit den Plänen Pro, Business und Enterprise verfügbar. Sie bieten genauere Übersetzungen durch Anweisungen und domänenspezifisches Vokabular.",
"context.viewPlans": "Pläne ansehen",
"context.title": "Kontext & Glossar",
"context.subtitle": "Verbessern Sie die Übersetzungsqualität mit Anweisungen und domänenspezifischem Vokabular.",
"context.presets.title": "Professionelle Glossare",
"context.presets.desc": "Laden Sie ein vollständiges Glossar mit Anweisungen und spezieller Terminologie",
"context.instructions.title": "Kontextanweisungen",
"context.instructions.desc": "Anweisungen, denen die KI während der Übersetzung folgt",
"context.instructions.placeholder": "Z.B.: Sie übersetzen HVAC-Fachdokumente. Verwenden Sie präzise Ingenieurterminologie...",
"context.glossary.title": "Technisches Glossar",
"context.glossary.desc": "Format: Quelle=Ziel (eines pro Zeile). Über Voreinstellung geladene Glossare sind bearbeitbar.",
"context.glossary.terms": "Begriffe im Glossar",
"context.clearAll": "Alles löschen",
"context.saving": "Wird gespeichert...",
"context.save": "Speichern",
"context.presets.createGlossary": "Glossar erstellen",
"context.presets.created": "Glossar erstellt",
"context.presets.createdDesc": "Das Glossar \\\"{name}\\\" wurde mit {count} Begriffen erstellt.",
"context.presets.hint": "Klicken Sie auf ein Preset, um ein Glossar mit domänenspezifischen Begriffen zu erstellen. Verwalten Sie Ihre Glossare im Glossar-Bereich.",
"context.glossary.manage": "Glossare verwalten",
"context.saved": "Gespeichert",
"context.savedDesc": "Ihre Kontextanweisungen wurden gespeichert."
}

View File

@@ -0,0 +1,7 @@
{
"cookieConsent.title": "Cookies auf Wordly",
"cookieConsent.description": "Wir verwenden essenzielle Cookies, damit die App funktioniert (Sitzung, Sicherheit, Sprache). Mit Ihrer Erlaubnis verwenden wir auch optionale Cookies zur Verkehrsmessung und Produktverbesserung.",
"cookieConsent.acceptAll": "Alle akzeptieren",
"cookieConsent.essentialOnly": "Nur Essenzielle",
"cookieConsent.learnMore": "Mehr erfahren"
}

View File

@@ -0,0 +1,111 @@
{
"dashboard.nav.translate": "Übersetzen",
"dashboard.nav.profile": "Mein Profil",
"dashboard.nav.settings": "Einstellungen",
"dashboard.nav.context": "Kontext",
"dashboard.nav.services": "Dienste",
"dashboard.nav.apiKeys": "API-Schlüssel",
"dashboard.nav.glossaries": "Glossare",
"dashboard.header.title": "Dashboard",
"dashboard.header.subtitle": "Verwalten Sie Ihre Übersetzungen",
"dashboard.header.toggleMenu": "Menü",
"dashboard.header.profileTitle": "Mein Profil",
"dashboard.sidebar.theme": "Design",
"dashboard.sidebar.signOut": "Abmelden",
"dashboard.sidebar.backHome": "Zurück zur Startseite",
"dashboard.sidebar.upgradeToPro": "Auf Pro upgraden →",
"dashboard.translate.pageTitle": "Dokument übersetzen",
"dashboard.translate.pageSubtitle": "Datei importieren und Zielsprache wählen",
"dashboard.translate.errorNotificationTitle": "Fehler",
"dashboard.translate.dropzone.uploadAria": "Datei-Ablagebereich",
"dashboard.translate.dropzone.title": "Datei hierher ziehen und ablegen",
"dashboard.translate.dropzone.subtitle": "oder klicken, um auszuwählen (DOCX, XLSX, PPTX, PDF)",
"dashboard.translate.dropzone.replaceFile": "Datei ersetzen",
"dashboard.translate.language.source": "Ausgangssprache",
"dashboard.translate.language.target": "Zielsprache",
"dashboard.translate.language.loading": "Sprachen werden geladen…",
"dashboard.translate.language.autoDetect": "Automatisch erkennen",
"dashboard.translate.language.selectPlaceholder": "Auswählen…",
"dashboard.translate.language.loadErrorPrefix": "Fehler beim Laden der Sprachen",
"dashboard.translate.provider.loading": "Anbieter werden geladen…",
"dashboard.translate.provider.noneConfigured": "Keine Anbieter konfiguriert",
"dashboard.translate.provider.modelTitle": "Modell",
"dashboard.translate.provider.sectionTitle": "Anbieter",
"dashboard.translate.provider.llmDivider": "KI · Kontextbasiert",
"dashboard.translate.provider.llmDividerPro": "KI · Kontextbasiert (Pro)",
"dashboard.translate.provider.upgrade": "Auf Pro upgraden",
"dashboard.translate.provider.upgradeSuffix": "um KI-Übersetzung freizuschalten",
"dashboard.translate.trust.zeroRetention": "Keine Datenspeicherung",
"dashboard.translate.trust.deletedAfter": "Dateien nach Verarbeitung gelöscht",
"dashboard.translate.actions.uploading": "Wird hochgeladen…",
"dashboard.translate.actions.translate": "Übersetzen",
"dashboard.translate.actions.filePrefix": "Datei: ",
"dashboard.translate.actions.cancel": "Abbrechen",
"dashboard.translate.actions.tryAgain": "Erneut versuchen",
"dashboard.translate.steps.uploading": "Datei wird hochgeladen…",
"dashboard.translate.steps.starting": "Übersetzung wird gestartet…",
"dashboard.translate.complete.title": "Übersetzung abgeschlossen!",
"dashboard.translate.complete.descNamed": "Ihre Datei {name} wurde erfolgreich übersetzt.",
"dashboard.translate.complete.descGeneric": "Ihre Datei wurde erfolgreich übersetzt.",
"dashboard.translate.complete.downloading": "Wird heruntergeladen…",
"dashboard.translate.complete.download": "Herunterladen",
"dashboard.translate.complete.newTranslation": "Neue Übersetzung",
"dashboard.translate.complete.toastOkTitle": "Erfolgreich",
"dashboard.translate.complete.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",
"dashboard.translate.configuration": "Konfiguration",
"dashboard.translate.translating": "Übersetzung läuft",
"dashboard.translate.liveMonitor": "Live-Monitor",
"dashboard.translate.summary": "Zusammenfassung",
"dashboard.translate.engine": "Engine",
"dashboard.translate.confidence": "Konfidenz",
"dashboard.translate.cancel": "Abbrechen",
"dashboard.translate.segments": "Segmente",
"dashboard.translate.characters": "Zeichen",
"dashboard.translate.elapsed": "Verstrichen",
"dashboard.translate.segPerMin": "Seg/Min",
"dashboard.translate.highQuality": "Hohe Qualität",
"dashboard.translate.quality": "Qualität",
"dashboard.translate.completed": "Übersetzung abgeschlossen",
"dashboard.translate.replace": "Ersetzen",
"dashboard.translate.pdfMode.title": "PDF-Übersetzungsmodus",
"dashboard.translate.pdfMode.preserveLayout": "Layout beibehalten",
"dashboard.translate.pdfMode.textOnly": "Nur Text",
"dashboard.translate.pdfMode.preserveLayoutDesc": "Behält Bilder, Tabellen und Formatierung. Ideal für einfache PDFs.",
"dashboard.translate.pdfMode.textOnlyDesc": "Übersetzt den gesamten Text perfekt. Saubere Ausgabe ohne Layoutprobleme.",
"dashboard.translate.pipeline.upload": "Hochladen",
"dashboard.translate.pipeline.analyze": "Analysieren",
"dashboard.translate.pipeline.translate": "Übersetzung",
"dashboard.translate.pipeline.rebuild": "Rekonstruieren",
"dashboard.translate.pipeline.finalize": "Finalisieren",
"dashboard.translate.progress.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.",
"dashboard.translate.error.apiKey": "Ungültiger oder fehlender API-Schlüssel. Kontaktieren Sie den Administrator zur Konfiguration.",
"dashboard.translate.error.quota": "Nutzungslimit erreicht. Versuchen Sie es in wenigen Minuten erneut oder wählen Sie eine andere Engine.",
"dashboard.translate.error.timeout": "Verbindung zum Übersetzungsdienst zeitüberschritten. Prüfen Sie Ihr Netzwerk und versuchen Sie es erneut.",
"dashboard.translate.error.sessionExpired": "Sitzung abgelaufen. Klicken Sie auf Erneut versuchen, um die Übersetzung neu zu starten.",
"dashboard.translate.error.empty": "Das Dokument scheint leer zu sein oder enthält keinen übersetzbaren Text (eingescanntes PDF?).",
"dashboard.translate.error.unsupported": "Nicht unterstütztes Dateiformat oder beschädigte Datei.",
"dashboard.translate.error.connection": "Verbindung verloren. Prüfen Sie Ihr Netzwerk und versuchen Sie es erneut.",
"dashboard.translate.error.generic": "Übersetzung fehlgeschlagen: {detail}",
"dashboard.translate.error.title": "Übersetzung fehlgeschlagen",
"dashboard.translate.retry": "Übersetzung erneut versuchen",
"dashboard.translate.newFile": "Neue Datei",
"dashboard.translate.modeAI": "KI-Modus",
"dashboard.translate.modeClassic": "Klassischer Modus",
"dashboard.translate.glossaryLLMHint": "Glossare im KI-Modus verfügbar",
"dashboard.translate.submitting": "Wird gesendet...",
"dashboard.translate.submit": "Übersetzung starten",
"dashboard.translate.noFile": "Laden Sie zuerst eine Datei hoch",
"dashboard.translate.noTargetLang": "Wählen Sie eine Zielsprache",
"dashboard.topbar.interfaceLabel": "Übersetzungsoberfläche",
"dashboard.topbar.premiumAccess": "Premium-Zugang",
"dashboard.checkoutSyncError": "Fehler beim Synchronisieren der Zahlung.",
"dashboard.networkRefresh": "Netzwerkfehler. Bitte aktualisieren Sie die Seite.",
"dashboard.continueToTranslate": "Weiter zur Übersetzung"
}

View File

@@ -0,0 +1,31 @@
{
"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…"
}

View File

@@ -0,0 +1,14 @@
{
"forgotPassword.enterEmail": "Please enter your email address",
"forgotPassword.error": "An error occurred",
"forgotPassword.title": "Forgot Password",
"forgotPassword.checkEmail": "Check your inbox",
"forgotPassword.subtitle": "Enter your email to receive a reset link",
"forgotPassword.sentMessage": "If an account exists with this address, a reset email has been sent.",
"forgotPassword.emailLabel": "Email address",
"forgotPassword.emailPlaceholder": "you@example.com",
"forgotPassword.sending": "Sending...",
"forgotPassword.sendLink": "Send reset link",
"forgotPassword.backToLogin": "Back to login",
"forgotPassword.loading": "Loading..."
}

View File

@@ -0,0 +1,189 @@
{
"glossaries.yourGlossaries": "Ihre Glossare",
"glossaries.title": "Glossare & Kontext",
"glossaries.description": "Verwalten Sie Ihre Glossare und Kontextanweisungen für genauere Übersetzungen.",
"glossaries.createNew": "Neu erstellen",
"glossaries.empty": "Noch keine Glossare",
"glossaries.emptyDesc": "Erstellen Sie Ihr erstes Glossar oder laden Sie eine professionelle Vorlage oben",
"glossaries.defineTerms": "Begriffe",
"glossaries.aboutTitle": "Über Glossare",
"glossaries.aboutDesc": "Glossare ermöglichen es Ihnen, exakte Übersetzungen für bestimmte Begriffe zu definieren. Bei der Übersetzung werden die Glossarbegriffe für konsistente und präzise Übersetzungen verwendet.",
"glossaries.aboutFormat": "Jeder Begriff hat ein Quellwort und Übersetzungen in mehreren Sprachen. Wählen Sie ein Glossar auf der Übersetzungsseite aus, um es anzuwenden.",
"glossaries.toast.created": "Glossar erstellt",
"glossaries.toast.createdDesc": "Das Glossar \\\"{name}\\\" wurde erstellt.",
"glossaries.toast.imported": "Glossar importiert",
"glossaries.toast.importedDesc": "Das Glossar \\\"{name}\\\" wurde importiert.",
"glossaries.toast.updated": "Glossar aktualisiert",
"glossaries.toast.updatedDesc": "Das Glossar \\\"{name}\\\" wurde aktualisiert.",
"glossaries.toast.deleted": "Glossar gelöscht",
"glossaries.toast.deletedDesc": "Das Glossar wurde gelöscht.",
"glossaries.toast.error": "Fehler",
"glossaries.toast.errorCreate": "Glossar konnte nicht erstellt werden",
"glossaries.toast.errorImport": "Glossar konnte nicht importiert werden",
"glossaries.toast.errorUpdate": "Glossar konnte nicht aktualisiert werden",
"glossaries.toast.errorDelete": "Glossar konnte nicht gelöscht werden",
"glossaries.dialog.title": "Neues Glossar",
"glossaries.dialog.description": "Erstellen Sie ein Glossar für Ihre Übersetzungen",
"glossaries.dialog.nameLabel": "Name",
"glossaries.dialog.namePlaceholder": "Mein Glossar",
"glossaries.dialog.tabTemplates": "Vorlagen",
"glossaries.dialog.tabFile": "Datei",
"glossaries.dialog.tabManual": "Manuell",
"glossaries.dialog.cancel": "Abbrechen",
"glossaries.dialog.creating": "Wird erstellt…",
"glossaries.dialog.importing": "Wird importiert…",
"glossaries.dialog.importBtn": "Importieren",
"glossaries.dialog.selectPrompt": "Auswählen",
"glossaries.dialog.createBtn": "Erstellen",
"glossaries.dialog.createEmpty": "Leer erstellen",
"glossaries.dialog.terms": "Begriffe",
"glossaries.dialog.templatesDesc": "Wählen Sie eine vordefinierte Vorlage",
"glossaries.dialog.templatesEmpty": "Keine Vorlagen verfügbar",
"glossaries.dialog.dropTitle": "CSV-Datei hierher ziehen",
"glossaries.dialog.dropOr": "oder",
"glossaries.dialog.dropFormats": "CSV, TSV, TXT",
"glossaries.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",
"glossaries.dialog.errorFormat": "Nicht unterstütztes Format",
"glossaries.dialog.errorSize": "Datei zu groß",
"glossaries.dialog.errorEmpty": "Leere Datei",
"glossaries.dialog.errorRead": "Lesefehler",
"glossaries.dialog.parsing": "Wird analysiert…",
"glossaries.dialog.termsImported": "Begriffe importiert",
"glossaries.dialog.changeFile": "Datei ändern",
"glossaries.dialog.retry": "Erneut versuchen",
"glossaries.edit.title": "Modifier le glossaire",
"glossaries.edit.description": "Modifiez le nom, la paire de langues et les termes du glossaire.",
"glossaries.edit.nameLabel": "Nom du glossaire",
"glossaries.edit.namePlaceholder": "Entrez le nom du glossaire...",
"glossaries.edit.sourceLang": "Langue source",
"glossaries.edit.targetLang": "Langue cible",
"glossaries.edit.termsLabel": "Termes ({count} valides)",
"glossaries.edit.exportCsv": "Exporter CSV",
"glossaries.edit.importCsv": "Importer CSV",
"glossaries.edit.cancel": "Annuler",
"glossaries.edit.saving": "Enregistrement...",
"glossaries.edit.saveChanges": "Enregistrer les modifications",
"glossaries.edit.importFailedTitle": "Échec de l'importation",
"glossaries.edit.importFailedMaxDesc": "Le CSV contient {count} termes, le maximum est de {max}. Veuillez réduire le nombre de termes.",
"glossaries.edit.importSuccessTitle": "Importation réussie",
"glossaries.edit.importSuccessDesc": "{count} termes importés avec succès.",
"glossaries.edit.importFailedEmptyDesc": "Aucun terme valide trouvé dans le fichier CSV.",
"glossaries.edit.importFailedReadDesc": "Impossible de lire le fichier CSV.",
"glossaries.delete.title": "Supprimer le glossaire",
"glossaries.delete.description": "Êtes-vous sûr de vouloir supprimer ce glossaire ?",
"glossaries.delete.warning": "Cette action est irréversible",
"glossaries.delete.warningDesc": "Toutes les paires de termes seront définitivement supprimées.",
"glossaries.delete.cancel": "Annuler",
"glossaries.delete.deleting": "Suppression...",
"glossaries.delete.deleteBtn": "Supprimer",
"glossaries.upgrade.title": "Glossaires",
"glossaries.upgrade.description": "Personnalisez vos traductions avec une terminologie personnalisée",
"glossaries.upgrade.feature1": "Créez plusieurs glossaires",
"glossaries.upgrade.feature2": "Définissez des paires de termes source→cible",
"glossaries.upgrade.feature3": "Importez/exportez via CSV",
"glossaries.upgrade.feature4": "Appliquez aux traductions LLM",
"glossaries.upgrade.proFeatureBefore": "Les glossaires sont une fonctionnalité ",
"glossaries.upgrade.proFeatureAfter": ". Passez à un forfait supérieur pour débloquer la terminologie personnalisée.",
"glossaries.upgrade.proLabel": "Pro",
"glossaries.upgrade.upgradeBtn": "Passer à Pro",
"glossaries.loading": "Chargement...",
"glossaries.howItWorks.title": "Comment ces paramètres sont utilisés",
"glossaries.howItWorks.step1Title": "Configurez ici",
"glossaries.howItWorks.step1Desc": "Rédigez vos instructions de contexte ou créez/importez un glossaire de termes.",
"glossaries.howItWorks.step2Title": "Activez dans Traduire",
"glossaries.howItWorks.step2Desc": "Sur la page de traduction, dans la colonne de droite, sélectionnez votre glossaire.",
"glossaries.howItWorks.warning": "Les instructions de contexte s'appliquent automatiquement à toutes vos traductions IA une fois enregistrées. Les glossaires doivent être sélectionnés manuellement sur la page Traduire.",
"glossaries.howItWorks.goToTranslate": "Aller à Traduire",
"glossaries.status.unsaved": "Non enregistré",
"glossaries.status.active": "Actif · s'applique à toutes les traductions IA",
"glossaries.status.inactive": "Inactif",
"glossaries.instructions.whatForBold": "À quoi ça sert ?",
"glossaries.instructions.whatForDesc": "Ces instructions sont envoyées automatiquement à l'IA avant chaque traduction, sans que vous ayez besoin de faire quoi que ce soit sur la page Traduire. Utilisez-les pour guider le style, le registre ou la terminologie générale.",
"glossaries.instructions.example": "Exemple : « Vous traduisez des rapports financiers. Soyez formel, précis et conservez tous les chiffres. »",
"glossaries.instructions.charCount": "{count} caractères",
"glossaries.instructions.emptyHint": "Vide — aucune instruction envoyée à l'IA",
"glossaries.instructions.clearAll": "Tout effacer",
"glossaries.instructions.saving": "Enregistrement…",
"glossaries.instructions.saved": "Enregistré",
"glossaries.presets.whatForBold": "À quoi ça sert ?",
"glossaries.presets.whatForDesc": "Cliquer sur une carte crée un glossaire pré-rempli avec les termes spécialisés du domaine. Ce glossaire apparaîtra dans vos glossaires ci-dessous, et vous pourrez le sélectionner manuellement sur la page Traduire pour forcer des traductions de termes précis.",
"glossaries.presets.clickHint": "Cliquez sur une carte → glossaire créé → sélectionnez-le dans Traduire",
"glossaries.presets.creating": "Création…",
"glossaries.presets.alreadyImported": "Déjà importé",
"glossaries.presets.it.title": "IT / Logiciel",
"glossaries.presets.it.desc": "Développement, infrastructure, DevOps",
"glossaries.presets.legal.title": "Juridique / Contrats",
"glossaries.presets.legal.desc": "Droit des affaires, contentieux",
"glossaries.presets.medical.title": "Médical / Santé",
"glossaries.presets.medical.desc": "Pharmacologie, chirurgie, diagnostic",
"glossaries.presets.finance.title": "Finance / Comptabilité",
"glossaries.presets.finance.desc": "IFRS, bilans, fiscalité",
"glossaries.presets.marketing.title": "Marketing / Publicité",
"glossaries.presets.marketing.desc": "Digital, branding, analytics",
"glossaries.presets.hr.title": "RH / Ressources Humaines",
"glossaries.presets.hr.desc": "Contrats, politiques, recrutement",
"glossaries.presets.scientific.title": "Scientifique / Recherche",
"glossaries.presets.scientific.desc": "Publications, thèses, articles",
"glossaries.presets.ecommerce.title": "E-commerce / Vente",
"glossaries.presets.ecommerce.desc": "Boutiques en ligne, catalogues, CRM",
"glossaries.grid.title": "Vos",
"glossaries.grid.titleHighlight": "glossaires",
"glossaries.grid.countWithAction": "{count} glossaire({plural}) — cliquez sur une carte pour la modifier",
"glossaries.grid.emptyAction": "Créez votre premier glossaire ou importez un preset ci-dessus",
"glossaries.grid.activeTranslation": "Traduction active :",
"glossaries.grid.goToTranslate": "Aller à Traduire pour activer",
"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.",
"glossaries.detail.backToList": "Back to glossaries",
"glossaries.detail.save": "Save",
"glossaries.detail.savedTitle": "Saved",
"glossaries.detail.savedDesc": "The glossary has been updated.",
"glossaries.detail.settingsTitle": "Settings",
"glossaries.detail.sourceLang": "Source language",
"glossaries.detail.targetLang": "Target language",
"glossaries.detail.termsTitle": "Terms",
"glossaries.detail.terms": "terms",
"glossaries.detail.searchTerms": "Filter…",
"glossaries.detail.noTerms": "No terms yet.",
"glossaries.detail.addFirstTerm": "Add the first term",
"glossaries.detail.addTerm": "Add a term",
"glossaries.detail.maxReached": "Maximum limit reached",
"glossaries.detail.source": "Source",
"glossaries.detail.target": "Target",
"glossaries.detail.sourcePlaceholder": "source term",
"glossaries.detail.targetPlaceholder": "target term",
"glossaries.detail.csvTitle": "CSV",
"glossaries.detail.csvDesc": "Export your terms as CSV or import new ones (replaces the current list).",
"glossaries.detail.export": "Export",
"glossaries.detail.import": "Import",
"glossaries.detail.dangerTitle": "Danger zone",
"glossaries.detail.dangerDesc": "Deletion is permanent. All associated terms will be lost.",
"glossaries.detail.deleteGlossary": "Delete this glossary",
"glossaries.detail.confirmDelete": "Confirm deletion?",
"glossaries.detail.confirm": "Confirm",
"glossaries.detail.cancel": "Cancel",
"glossaries.detail.sourceLangNote": "'The original source is in French. For other languages, we read the term's translations field (if available).'",
"glossaries.detail.sourceLocked": "fixed",
"glossaries.detail.sourceLockedNote": "Templates only store the source in French. Multilingual source is on the roadmap.",
"glossaries.detail.targetLangNote": "Pick a language to see the matching translations, or « Multilingual » for the default value.",
"glossaries.detail.notFoundTitle": "Glossary not found",
"glossaries.detail.notFoundDesc": "This glossary does not exist or you don't have access to it.",
"glossaries.detail.maxTermsTitle": "Limit reached",
"glossaries.detail.maxTermsDesc": "Maximum {max} terms per glossary.",
"glossaries.detail.importEmptyTitle": "Empty file",
"glossaries.detail.importEmptyDesc": "No terms detected in this file.",
"glossaries.detail.importedTitle": "Imported",
"glossaries.detail.importedDesc": "{count} terms imported.",
"glossaries.detail.importErrorTitle": "Read error",
"glossaries.detail.importErrorDesc": "Unable to read the file."
}

View File

@@ -0,0 +1,60 @@
// Auto-generated by scripts/generate_i18n_index.py
// Merges all namespace JSON files for locale "de".
import admin from "./admin.json";
import apiKeys from "./apiKeys.json";
import auth from "./auth.json";
import checkout from "./checkout.json";
import common from "./common.json";
import context from "./context.json";
import cookieConsent from "./cookieConsent.json";
import dashboard from "./dashboard.json";
import fileUploader from "./fileUploader.json";
import forgotPassword from "./forgotPassword.json";
import glossaries from "./glossaries.json";
import landing from "./landing.json";
import langSelector from "./langSelector.json";
import layout from "./layout.json";
import login from "./login.json";
import memento from "./memento.json";
import pricing from "./pricing.json";
import profile from "./profile.json";
import providerSelector from "./providerSelector.json";
import providerTheme from "./providerTheme.json";
import register from "./register.json";
import resetPassword from "./resetPassword.json";
import services from "./services.json";
import settings from "./settings.json";
import translate from "./translate.json";
import translateComplete from "./translateComplete.json";
const messages: Record<string, string> = {
...admin,
...apiKeys,
...auth,
...checkout,
...common,
...context,
...cookieConsent,
...dashboard,
...fileUploader,
...forgotPassword,
...glossaries,
...landing,
...langSelector,
...layout,
...login,
...memento,
...pricing,
...profile,
...providerSelector,
...providerTheme,
...register,
...resetPassword,
...services,
...settings,
...translate,
...translateComplete,
};
export default messages;

View File

@@ -0,0 +1,146 @@
{
"landing.nav.why": "Warum wir?",
"landing.nav.formats": "Formate",
"landing.nav.pricing": "Preise",
"landing.nav.login": "Anmelden",
"landing.nav.startFree": "Kostenlos starten",
"landing.hero.tag": "Professionelle Dokument-KI",
"landing.hero.titleLine1": "Übersetzen Sie Ihre Dokumente.",
"landing.hero.titleLine2": "Mit perfekter Formatierung.",
"landing.hero.description": "Der einzige Übersetzer, der SmartArt, Diagramme, Inhaltsverzeichnisse, Formen und komplexe Layouts bewahrt — genau wie im Original.",
"landing.hero.ctaMain": "Kostenlos starten — 2 Docs/Monat",
"landing.hero.ctaSec": "Angebote sehen",
"landing.hero.deleted": "Dateien nach 60 Min. gelöscht",
"landing.hero.noHidden": "Keine versteckten Gebühren",
"landing.hero.preview": "Vorschau vor Bezahlung",
"landing.hero.formattedOk": "Formatierung OK",
"landing.hero.aiActive": "KI-Übersetzung aktiv",
"landing.steps.title": "Wie funktioniert es?",
"landing.steps.subtitle": "Drei Schritte. Kein Formatverlust.",
"landing.steps.step1.num": "01",
"landing.steps.step1.title": "Datei hochladen",
"landing.steps.step1.desc": "Drag & Drop Ihres Excel-, Word-, PowerPoint- oder PDF-Dokuments.",
"landing.steps.step2.num": "02",
"landing.steps.step2.title": "Sprache & Engine wählen",
"landing.steps.step2.desc": "Zielsprache und Engine auswählen — klassisch oder kontextbewusste KI.",
"landing.steps.step3.num": "03",
"landing.steps.step3.title": "Ergebnis herunterladen",
"landing.steps.step3.desc": "Erhalten Sie Ihr übersetztes Dokument mit identischer Formatierung wie das Original.",
"landing.features.tag": "KI-Übersetzungsengine",
"landing.features.title": "Übersetzung, die Ihr Handwerk versteht",
"landing.features.description": "Unsere KI-Modelle analysieren den Kontext, respektieren Ihre Terminologie und übersetzen sogar Text in Bildern.",
"landing.features.context.title": "Branchenkontext",
"landing.features.context.desc": "Beschreiben Sie Ihr Fachgebiet und erhalten Sie maßgeschneiderte Übersetzungen — nicht generische.",
"landing.features.glossary.title": "Fachglossare",
"landing.features.glossary.desc": "Definieren Sie Ihre Fachbegriffe. CTA bleibt «Luftbehandlungsanlage», nie «Call To Action».",
"landing.features.vision.title": "Bilderkennung",
"landing.features.vision.desc": "Text in Bildern, Diagrammen und Grafiken wird erkannt und übersetzt.",
"landing.features.demo.source": "Quelle (FR)",
"landing.features.demo.google": "Google Translate",
"landing.features.demo.ours": "Unsere KI",
"landing.layout.title": "Ihre Formatierung,",
"landing.layout.title2": "perfekt erhalten",
"landing.layout.subtitle": "Andere Übersetzer zerstören Ihr Layout. Wir nicht.",
"landing.layout.p1.title": "SmartArt & Diagramme",
"landing.layout.p1.desc": "Organigramme, Flussdiagramme, Hierarchien — alles identisch übersetzt.",
"landing.layout.p2.title": "Inhaltsverzeichnisse",
"landing.layout.p2.desc": "Inhaltsverzeichniseinträge, Seitenzahlen und Querverweise korrekt aktualisiert.",
"landing.layout.p3.title": "Diagramme & Grafiken",
"landing.layout.p3.desc": "Titel, Achsenbeschriftungen, Legenden und Reihennamen — alles übersetzt.",
"landing.layout.p4.title": "Formen & Textfelder",
"landing.layout.p4.desc": "Rechtecke, abgerundete Blöcke, Legenden — überall lokalisiert.",
"landing.layout.p5.title": "Kopf- & Fußzeilen",
"landing.layout.p5.desc": "Kopfzeilen, Fußzeilen und Fußnoten werden nie übersehen.",
"landing.layout.p6.title": "130+ Sprachen",
"landing.layout.p6.desc": "Google Translate, DeepL und professionelle KI-Engines.",
"landing.formats.title": "Jedes Format,",
"landing.formats.title2": "jedes Element",
"landing.formats.subtitle": "Wir übersetzen, was andere vergessen. Ihr Unternehmen verdient einwandfreie Dokumentation.",
"landing.formats.word.name": "Word",
"landing.formats.word.i1": "Absätze und Überschriften",
"landing.formats.word.i2": "Tabellen und Diagramme",
"landing.formats.word.i3": "SmartArt-Diagramme",
"landing.formats.word.i4": "Inhaltsverzeichnis",
"landing.formats.word.i5": "Kopf- und Fußzeilen",
"landing.formats.word.i6": "Formen und Textfelder",
"landing.formats.word.i7": "Fuß- und Endnoten",
"landing.formats.excel.name": "Excel",
"landing.formats.excel.i1": "Zellwerte",
"landing.formats.excel.i2": "Blattnamen",
"landing.formats.excel.i3": "Diagramme und Beschriftungen",
"landing.formats.excel.i4": "Kopf- und Fußzeilen",
"landing.formats.excel.i5": "Verbundene Zellen erhalten",
"landing.formats.pptx.name": "PowerPoint",
"landing.formats.pptx.i1": "Folientext und Notizen",
"landing.formats.pptx.i2": "Diagramme und Grafiken",
"landing.formats.pptx.i3": "Formen und Textfelder",
"landing.formats.pptx.i4": "Folienmaster",
"landing.formats.pptx.i5": "Animationen erhalten",
"landing.formats.pdf.name": "PDF",
"landing.formats.pdf.i1": "Textbasierte PDFs",
"landing.formats.pdf.i2": "Layout erhalten",
"landing.formats.pdf.i3": "Bilder an Ort und Stelle",
"landing.formats.pdf.i4": "Tabellen beibehalten",
"landing.formats.pdf.i5": "Ausgabe als DOCX oder PDF",
"landing.pricing.title": "Einfache, ehrliche Preise",
"landing.pricing.subtitle": "Was Sie sehen, ist was Sie zahlen. Keine versteckten Gebühren.",
"landing.pricing.monthly": "Monatlich",
"landing.pricing.annual": "Jährlich",
"landing.pricing.bestValue": "Am beliebtesten",
"landing.pricing.month": "/Monat",
"landing.pricing.footer": "Der angezeigte Preis ist der Preis, den Sie zahlen. Keine versteckten Gebühren nach der Übersetzung.",
"landing.pricing.starter.name": "Starter",
"landing.pricing.starter.desc": "Für Einzelpersonen und kleine Projekte",
"landing.pricing.starter.f1": "50 Dokumente / Monat",
"landing.pricing.starter.f2": "Bis zu 50 Seiten pro Dokument",
"landing.pricing.starter.f3": "Google Translate + DeepL",
"landing.pricing.starter.f4": "Dateien bis zu 10 MB",
"landing.pricing.starter.cta": "Loslegen",
"landing.pricing.pro.name": "Pro",
"landing.pricing.pro.desc": "Für anspruchsvolle Profis",
"landing.pricing.pro.f1": "200 Dokumente / Monat",
"landing.pricing.pro.f2": "Bis zu 200 Seiten pro Dokument",
"landing.pricing.pro.f3": "KI-gestützte Übersetzung",
"landing.pricing.pro.f4": "Google + DeepL inklusive",
"landing.pricing.pro.f5": "Individuelle Glossare & Prompts",
"landing.pricing.pro.f6": "Prioritäts-Support",
"landing.pricing.pro.cta": "Pro testen",
"landing.pricing.business.name": "Business",
"landing.pricing.business.desc": "Für Teams mit hohem Bedarf",
"landing.pricing.business.f1": "1 000 Dokumente / Monat",
"landing.pricing.business.f2": "Bis zu 500 Seiten pro Dokument",
"landing.pricing.business.f3": "Premium-KI (Claude)",
"landing.pricing.business.f4": "Alle Anbieter + API-Zugang",
"landing.pricing.business.f5": "Webhooks & Automatisierung",
"landing.pricing.business.f6": "5 Teamplätze",
"landing.pricing.business.cta": "Kontaktieren Sie uns",
"landing.cta.title": "In 30 Sekunden mit der Übersetzung beginnen",
"landing.cta.subtitle": "Keine Kreditkarte erforderlich. Probieren Sie es jetzt kostenlos und erwecken Sie Ihre mehrsprachigen Dokumente zum Leben.",
"landing.cta.button": "Kostenloses Konto erstellen",
"landing.cta.secure": "Geschützt durch AES-256-Verschlüsselung",
"landing.footer.desc": "Experte für intelligente Dokumentenübersetzung. Wir verbinden die Kunst des Layouts mit der Wissenschaft kontextbezogener KI.",
"landing.footer.product": "Produkt",
"landing.footer.resources": "Ressourcen",
"landing.footer.legal": "Rechtliches",
"landing.footer.rights": "© 2026 Wordly.art — Alle Rechte vorbehalten.",
"landing.hero.contextEngine": "Übersetzung erkannt: Technischer Wartungsbegriff für HVAC-Systeme...",
"landing.hero.liveAnalysis": "Live-Analyse",
"landing.hero.termsDetected": "Begriffe erkannt",
"landing.steps.process": "PROZESS",
"landing.translate.newProject": "Neues Projekt",
"landing.translate.title": "Dokument übersetzen",
"landing.translate.subtitle": "Datei importieren und Zielsprache wählen",
"landing.translate.sourceDocument": "Quelldokument",
"landing.translate.configuration": "Konfiguration",
"landing.translate.sourceLang": "Quellsprache",
"landing.translate.targetLang": "Zielsprache",
"landing.translate.provider": "Anbieter",
"landing.translate.startTranslation": "Übersetzung starten",
"landing.translate.zeroRetention": "Keine Speicherung",
"landing.translate.filesDeleted": "Dateien nach Verarbeitung gelöscht",
"landing.translate.dropHere": "Hier ablegen",
"landing.translate.supportedFormats": "DOCX, XLSX, PPTX oder PDF Dateien unterstützt",
"landing.translate.aiAnalysis": "KI-Analyse aktiv",
"landing.translate.processing": "Verarbeitung läuft",
"landing.translate.preservingLayout": "Ihr Layout wird beibehalten"
}

View File

@@ -0,0 +1,7 @@
{
"langSelector.search": "Suchen…",
"langSelector.noResults": "Keine Ergebnisse",
"langSelector.source": "Quelle",
"langSelector.target": "Ziel",
"langSelector.swap": "Tauschen"
}

View File

@@ -0,0 +1,5 @@
{
"layout.nav.apiAccess": "API-Zugang",
"layout.footer.terms": "AGB",
"layout.footer.privacy": "Datenschutz"
}

View File

@@ -0,0 +1,18 @@
{
"login.errorTitle": "Login Error",
"login.welcomeBack": "Welcome back",
"login.signInToContinue": "Sign in to continue translating",
"login.email": "Email",
"login.emailPlaceholder": "you@example.com",
"login.password": "Password",
"login.forgotPassword": "Forgot password?",
"login.passwordPlaceholder": "••••••••",
"login.signingIn": "Signing in...",
"login.signIn": "Sign In",
"login.noAccount": "Don't have an account?",
"login.signUpFree": "Sign up for free",
"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."
}

View File

@@ -0,0 +1,6 @@
{
"memento.title": "Entdecken Sie Momento",
"memento.slogan": "Momento ist mehr als nur eine Notizen-App. Es ist ein intelligentes Ökosystem, das Ihre Ideen in Echtzeit verbindet, analysiert und weiterentwickelt mit 6 KI-Agenten und semantischer Suche.",
"memento.ctaFree": "Kostenlos starten",
"memento.ctaMore": "Mehr erfahren"
}

View File

@@ -0,0 +1,151 @@
{
"pricing.nav.back": "Zurück",
"pricing.nav.home": "Startseite",
"pricing.nav.mySubscription": "Mein Abonnement",
"pricing.header.badge": "KI-Modelle aktualisiert — März 2026",
"pricing.header.title": "Der passende Plan für jedes Bedürfnis",
"pricing.header.subtitle": "Übersetzen Sie Ihre Word-, Excel- und PowerPoint-Dokumente unter Beibehaltung des Original-Layouts. Ohne API-Schlüssel.",
"pricing.billing.monthly": "Monatlich",
"pricing.billing.yearly": "Jährlich",
"pricing.plans.free.name": "Kostenlos",
"pricing.plans.starter.name": "Starter",
"pricing.plans.pro.name": "Pro",
"pricing.plans.business.name": "Business",
"pricing.plans.enterprise.name": "Enterprise",
"pricing.plans.free.description": "Perfekt zum Kennenlernen der App",
"pricing.plans.starter.description": "Für Einzelpersonen und kleine Projekte",
"pricing.plans.pro.description": "Für Professionals und wachsende Teams",
"pricing.plans.business.description": "Für Teams und Organisationen",
"pricing.plans.enterprise.description": "Maßgeschneiderte Lösungen für große Organisationen",
"pricing.plans.pro.highlight": "Am beliebtesten",
"pricing.plans.pro.badge": "BELIEBT",
"pricing.plans.enterprise.badge": "AUF ANFRAGE",
"pricing.plans.free.feat1": "5 Dokumente / Monat",
"pricing.plans.free.feat2": "Bis zu 15 Seiten pro Dokument",
"pricing.plans.free.feat3": "Google Übersetzer inklusive",
"pricing.plans.free.feat4": "Alle Sprachen (130+)",
"pricing.plans.free.feat5": "Community-Support",
"pricing.plans.starter.feat1": "50 Dokumente / Monat",
"pricing.plans.starter.feat2": "Bis zu 50 Seiten pro Dokument",
"pricing.plans.starter.feat3": "Google Übersetzer + DeepL",
"pricing.plans.starter.feat4": "Dateien bis zu 10 MB",
"pricing.plans.starter.feat5": "E-Mail-Support",
"pricing.plans.starter.feat6": "30 Tage Verlauf",
"pricing.plans.pro.feat1": "200 Dokumente / Monat",
"pricing.plans.pro.feat2": "Bis zu 200 Seiten pro Dokument",
"pricing.plans.pro.feat3": "KI-Basisübersetzung",
"pricing.plans.pro.feat4": "Google Übersetzer + DeepL",
"pricing.plans.pro.feat5": "Dateien bis zu 25 MB",
"pricing.plans.pro.feat6": "Benutzerdefinierte Glossare",
"pricing.plans.pro.feat7": "Prioritäts-Support",
"pricing.plans.pro.feat8": "90 Tage Verlauf",
"pricing.plans.business.feat1": "1.000 Dokumente / Monat",
"pricing.plans.business.feat2": "Bis zu 500 Seiten pro Dokument",
"pricing.plans.business.feat3": "Basis- + Premium-KI (Claude Haiku)",
"pricing.plans.business.feat4": "Alle Übersetzungsanbieter",
"pricing.plans.business.feat5": "Dateien bis zu 50 MB",
"pricing.plans.business.feat6": "API-Zugang (10.000 Aufrufe/Monat)",
"pricing.plans.business.feat7": "Benachrichtigungs-Webhooks",
"pricing.plans.business.feat8": "Dedizierter Support",
"pricing.plans.business.feat9": "1 Jahr Verlauf",
"pricing.plans.business.feat10": "Erweiterte Analysen",
"pricing.plans.enterprise.feat1": "Unbegrenzte Dokumente",
"pricing.plans.enterprise.feat2": "Alle KI-Modelle (GPT-5, Claude Opus 4.6…)",
"pricing.plans.enterprise.feat3": "On-Premise oder dedizierte Cloud",
"pricing.plans.enterprise.feat4": "99,9 % SLA garantiert",
"pricing.plans.enterprise.feat5": "24/7 dedizierter Support",
"pricing.plans.enterprise.feat6": "White-Label",
"pricing.plans.enterprise.feat7": "Unbegrenzte Teams",
"pricing.plans.enterprise.feat8": "Maßgeschneiderte Integrationen",
"pricing.card.onRequest": "Auf Anfrage",
"pricing.card.free": "Kostenlos",
"pricing.card.perMonth": "/Monat",
"pricing.card.billedYearly": "{price} € / Jahr abgerechnet",
"pricing.card.documents": "Dokumente",
"pricing.card.pagesMax": "Max. Seiten",
"pricing.card.aiTranslation": "KI-Übersetzung",
"pricing.card.unlimited": "Unbegrenzt",
"pricing.card.perMonthStat": "/ Monat",
"pricing.card.perDoc": "S. / Dok.",
"pricing.card.aiEssential": "Basis",
"pricing.card.aiEssentialPremium": "Basis + Premium",
"pricing.card.aiCustom": "Maßgeschneidert",
"pricing.card.myPlan": "Mein Plan",
"pricing.card.managePlan": "Plan verwalten",
"pricing.card.startFree": "Kostenlos starten",
"pricing.card.contactUs": "Kontaktieren Sie uns",
"pricing.card.choosePlan": "Diesen Plan wählen",
"pricing.card.processing": "Wird verarbeitet…",
"pricing.comparison.title": "Detaillierter Vergleich",
"pricing.comparison.subtitle": "Alles, was in jedem Plan enthalten ist",
"pricing.comparison.feature": "Funktion",
"pricing.comparison.docsPerMonth": "Dokumente / Monat",
"pricing.comparison.pagesMaxPerDoc": "Max. Seiten / Dokument",
"pricing.comparison.maxFileSize": "Max. Dateigröße",
"pricing.comparison.googleTranslation": "Google Übersetzer",
"pricing.comparison.deepl": "DeepL",
"pricing.comparison.aiEssential": "KI-Basisübersetzung",
"pricing.comparison.aiPremium": "KI-Premiumübersetzung",
"pricing.comparison.apiAccess": "API-Zugang",
"pricing.comparison.priorityProcessing": "Prioritätsverarbeitung",
"pricing.comparison.support": "Support",
"pricing.comparison.support.community": "Community",
"pricing.comparison.support.email": "E-Mail",
"pricing.comparison.support.priority": "Priorität",
"pricing.comparison.support.dedicated": "Dediziert",
"pricing.comparison.mb": "MB",
"pricing.credits.title": "Zusätzliche Guthaben",
"pricing.credits.subtitle": "Mehr benötigt? Guthaben einzeln kaufen, ohne Abo.",
"pricing.credits.perPage": "1 Guthaben = 1 übersetzte Seite.",
"pricing.credits.bestValue": "Bestes Preis-Leistungs-Verhältnis",
"pricing.credits.unit": "Guthaben",
"pricing.credits.centsPerCredit": "ct / Guthaben",
"pricing.credits.buy": "Kaufen",
"pricing.trust.encryption.title": "Ende-zu-Ende-Verschlüsselung",
"pricing.trust.encryption.sub": "TLS 1.3 + AES-256 im Ruhezustand",
"pricing.trust.languages.title": "130+ Sprachen",
"pricing.trust.languages.sub": "Einschließlich Arabisch, Persisch, Hebräisch (RTL)",
"pricing.trust.parallel.title": "Parallele Verarbeitung",
"pricing.trust.parallel.sub": "Ultraschnelle Multi-Thread-KI",
"pricing.trust.availability.title": "24/7 verfügbar",
"pricing.trust.availability.sub": "99,9 % garantierte Verfügbarkeit",
"pricing.aiModels.title": "Unsere KI-Modelle — März 2026",
"pricing.aiModels.essential.title": "KI-Basisübersetzung",
"pricing.aiModels.essential.plan": "Pro-Plan",
"pricing.aiModels.essential.descPrefix": "Basierend auf",
"pricing.aiModels.essential.descSuffix": "— dem kosteneffizientesten KI-Modell 2026. Qualität vergleichbar mit Frontier-Modellen zu einem Bruchteil der Kosten.",
"pricing.aiModels.essential.modelName": "unser Essentielles KI-Modell",
"pricing.aiModels.essential.context": "163K Token Kontext",
"pricing.aiModels.essential.value": "Hervorragendes Preis-Leistungs-Verhältnis",
"pricing.aiModels.premium.title": "KI-Premiumübersetzung",
"pricing.aiModels.premium.plan": "Business-Plan",
"pricing.aiModels.premium.descPrefix": "Basierend auf",
"pricing.aiModels.premium.descSuffix": "von Anthropic — präzise bei juristischen, medizinischen und komplexen technischen Dokumenten.",
"pricing.aiModels.premium.context": "200K Token Kontext",
"pricing.aiModels.premium.precision": "Höchste Genauigkeit",
"pricing.faq.title": "Häufig gestellte Fragen",
"pricing.faq.q1": "Kann ich jederzeit den Plan wechseln?",
"pricing.faq.a1": "Ja. Ein Upgrade erfolgt sofort und anteilig. Ein Downgrade wird am Ende des aktuellen Zeitraums wirksam.",
"pricing.faq.q2": "Was ist die «KI-Basisübersetzung»?",
"pricing.faq.a2": "Unser KI-Motor versteht den Kontext Ihrer Dokumente, erhält das Layout und verarbeitet Fachbegriffe deutlich besser als klassische Übersetzungen.",
"pricing.faq.q3": "Was ist der Unterschied zwischen Basis- und Premium-KI?",
"pricing.faq.a3": "Die Basis-KI nutzt ein optimiertes Modell (hervorragendes Preis-Leistungs-Verhältnis). Die Premium-KI verwendet Claude 3.5 Haiku von Anthropic und ist genauer bei juristischen, medizinischen und komplexen technischen Dokumenten.",
"pricing.faq.q4": "Werden meine Dokumente nach der Übersetzung gespeichert?",
"pricing.faq.a4": "Übersetzte Dateien sind je nach Plan verfügbar (30 Tage Starter, 90 Tage Pro, 1 Jahr Business). Sie sind im Ruhezustand und bei der Übertragung verschlüsselt.",
"pricing.faq.q5": "Was passiert, wenn ich mein monatliches Kontingent überschreite?",
"pricing.faq.a5": "Sie können einzelne Guthaben kaufen oder Ihr Abo upgraden. Sie werden bei 80 % Nutzung benachrichtigt.",
"pricing.faq.q6": "Gibt es eine kostenlose Testversion für kostenpflichtige Pläne?",
"pricing.faq.a6": "Der Kostenlos-Plan ist dauerhaft und ohne Kreditkarte. Für Pro und Business kontaktieren Sie uns für eine 14-tägige Testphase.",
"pricing.faq.q7": "Welche Dateiformate werden unterstützt?",
"pricing.faq.a7": "Word (.docx), Excel (.xlsx/.xls), PowerPoint (.pptx) und bald PDF. Alle Pläne unterstützen dieselben Formate.",
"pricing.cta.title": "Bereit loszulegen?",
"pricing.cta.subtitle": "Starten Sie kostenlos, ohne Kreditkarte. Upgraden Sie, wenn Sie möchten.",
"pricing.cta.createAccount": "Kostenloses Konto erstellen",
"pricing.cta.login": "Anmelden",
"pricing.toast.demo": "Demo-Modus — Stripe ist noch nicht konfiguriert. In der Produktion würden Sie zur Zahlung weitergeleitet, um den Plan {planId} zu aktivieren.",
"pricing.toast.networkError": "Netzwerkfehler. Bitte versuchen Sie es erneut.",
"pricing.toast.paymentError": "Fehler beim Erstellen der Zahlung.",
"pricing.dashboard": "Dashboard",
"pricing.okSymbol": "✓",
"pricing.errSymbol": "✕"
}

View File

@@ -0,0 +1,58 @@
{
"profile.header.title": "Mein Profil",
"profile.header.subtitle": "Verwalten Sie Ihr Konto und Ihre Einstellungen.",
"profile.tabs.account": "Konto",
"profile.tabs.subscription": "Abonnement",
"profile.tabs.preferences": "Einstellungen",
"profile.account.user": "Benutzer",
"profile.account.memberSince": "Mitglied seit",
"profile.plan.label": "Plan",
"profile.plan.free": "Kostenlos",
"profile.plan.starter": "Starter",
"profile.plan.pro": "Pro",
"profile.plan.business": "Business",
"profile.plan.enterprise": "Enterprise",
"profile.plan.pricePerMonth": "{price} €/Monat",
"profile.subscription.canceling": "Kündigung läuft",
"profile.subscription.active": "Aktiv",
"profile.subscription.unknown": "Unbekannt",
"profile.subscription.accessUntil": "Zugang bis",
"profile.subscription.renewalOn": "Verlängerung am",
"profile.subscription.upgradePlan": "Auf einen kostenpflichtigen Plan upgraden",
"profile.subscription.changePlan": "Plan ändern",
"profile.subscription.manageBilling": "Abrechnung verwalten",
"profile.subscription.billingUnavailable": "Abrechnungsportal nicht verfügbar.",
"profile.subscription.billingError": "Fehler beim Zugriff auf das Abrechnungsportal.",
"profile.subscription.cancelSuccess": "Abonnement gekündigt. Sie behalten den Zugang bis zum Ende des Zeitraums.",
"profile.subscription.cancelError": "Fehler bei der Kündigung.",
"profile.subscription.networkError": "Netzwerkfehler.",
"profile.usage.title": "Nutzung diesen Monat",
"profile.usage.resetOn": "Zurücksetzung am",
"profile.usage.documents": "Dokumente",
"profile.usage.pages": "Seiten",
"profile.usage.extraCredits": "zusätzliches Guthaben",
"profile.usage.extraCreditsPlural": "zusätzliches Guthaben",
"profile.usage.quotaReached": "Kontingent erreicht",
"profile.usage.quotaReachedDesc": "Upgraden Sie auf einen höheren Plan, um fortzufahren.",
"profile.usage.unlockMore": "Schalten Sie mit einem kostenpflichtigen Plan mehr Übersetzungen frei.",
"profile.usage.viewPlans": "Pläne ansehen",
"profile.usage.includedInPlan": "In Ihrem Plan enthalten",
"profile.danger.title": "Gefahrenzone",
"profile.danger.description": "Die Kündigung wird am Ende Ihres aktuellen Zeitraums wirksam. Sie behalten den Zugang bis zu diesem Datum.",
"profile.danger.confirm": "Sind Sie sicher? Diese Aktion kann nicht rückgängig gemacht werden.",
"profile.danger.confirmCancel": "Kündigung bestätigen",
"profile.danger.cancelSubscription": "Mein Abonnement kündigen",
"profile.danger.keep": "Nein, behalten",
"profile.prefs.interfaceLang": "Sprache der Benutzeroberfläche",
"profile.prefs.interfaceLangDesc": "Die Sprache wird automatisch anhand Ihres Browsers erkannt. Sie können sie manuell ändern.",
"profile.prefs.defaultTargetLang": "Standard-Zielsprache",
"profile.prefs.selectLanguage": "Sprache auswählen",
"profile.prefs.defaultTargetLangDesc": "Diese Sprache wird für Ihre Übersetzungen vorausgewählt.",
"profile.prefs.save": "Speichern",
"profile.prefs.theme": "Design",
"profile.prefs.themeDesc": "Wählen Sie das Erscheinungsbild der Benutzeroberfläche",
"profile.prefs.cache": "Cache",
"profile.prefs.cacheDesc": "Das Löschen des lokalen Caches kann einige Anzeigeprobleme beheben.",
"profile.prefs.clearing": "Wird gelöscht...",
"profile.prefs.clearCache": "Cache löschen"
}

View File

@@ -0,0 +1,7 @@
{
"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."
}

View File

@@ -0,0 +1,29 @@
{
"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."
}

View File

@@ -0,0 +1,29 @@
{
"register.title": "Konto erstellen",
"register.subtitle": "Kostenlos mit dem Übersetzen beginnen",
"register.error.failed": "Registrierung fehlgeschlagen",
"register.name.label": "Name",
"register.name.placeholder": "Ihr Name",
"register.name.error": "Der Name muss mindestens 2 Zeichen lang sein",
"register.email.label": "E-Mail-Adresse",
"register.email.placeholder": "sie@beispiel.de",
"register.email.error": "Ungültige E-Mail-Adresse",
"register.password.label": "Passwort",
"register.password.error": "Das Passwort muss mindestens 8 Zeichen haben, mit Großbuchstabe, Kleinbuchstabe und Ziffer",
"register.password.show": "Passwort anzeigen",
"register.password.hide": "Passwort verbergen",
"register.password.strengthLabel": "Stärke:",
"register.password.strength.weak": "Schwach",
"register.password.strength.medium": "Mittel",
"register.password.strength.strong": "Stark",
"register.confirmPassword.label": "Passwort bestätigen",
"register.confirmPassword.error": "Passwörter stimmen nicht überein",
"register.confirmPassword.show": "Anzeigen",
"register.confirmPassword.hide": "Verbergen",
"register.submit.creating": "Konto wird erstellt...",
"register.submit.create": "Mein Konto erstellen",
"register.hasAccount": "Bereits ein Konto?",
"register.login": "Anmelden",
"register.terms.prefix": "Mit der Kontoerstellung akzeptieren Sie unsere",
"register.terms.link": "Nutzungsbedingungen"
}

View File

@@ -0,0 +1,22 @@
{
"resetPassword.passwordRequirements": "Password must contain at least 8 characters, one uppercase, one lowercase, and one number",
"resetPassword.passwordMismatch": "Passwords do not match",
"resetPassword.tokenMissing": "Missing token. Please use the link received by email.",
"resetPassword.error": "An error occurred",
"resetPassword.invalidLink": "Invalid link",
"resetPassword.invalidLinkMessage": "This reset link is invalid. Please request a new one.",
"resetPassword.requestNewLink": "Request new link",
"resetPassword.successTitle": "Password reset",
"resetPassword.newPasswordTitle": "New password",
"resetPassword.successSubtitle": "You will be redirected to login",
"resetPassword.subtitle": "Set your new password",
"resetPassword.successMessage": "Your password has been successfully reset. You will be redirected to the login page.",
"resetPassword.newPassword": "New password",
"resetPassword.showPassword": "Show password",
"resetPassword.hidePassword": "Hide password",
"resetPassword.confirmPassword": "Confirm password",
"resetPassword.resetting": "Resetting...",
"resetPassword.resetPassword": "Reset password",
"resetPassword.backToLogin": "Back to login",
"resetPassword.loading": "Loading..."
}

View File

@@ -0,0 +1,14 @@
{
"services.title": "Übersetzungsanbieter",
"services.subtitle": "Anbieter werden vom Administrator konfiguriert. Sie können sehen, welche derzeit für Ihr Konto verfügbar sind.",
"services.loading": "Anbieter werden geladen...",
"services.noProviders": "Derzeit sind keine Anbieter konfiguriert. Wenden Sie sich an Ihren Administrator.",
"services.classic": "Klassische Übersetzung",
"services.llmPro": "LLM · Kontextbezogen (Pro)",
"services.available": "Verfügbar",
"services.model": "Modell",
"services.adminOnly.title": "Anbieterkonfiguration ist nur für Administratoren",
"services.adminOnly.desc": "API-Schlüssel, Modellauswahl und Anbieteraktivierung werden ausschließlich vom Administrator im Admin-Panel verwaltet. Sie müssen niemals einen API-Schlüssel eingeben.",
"services.fallback.google.label": "Google Übersetzer",
"services.fallback.google.desc": "Schnelle Übersetzung, über 130 Sprachen"
}

View File

@@ -0,0 +1,20 @@
{
"settings.title": "Einstellungen",
"settings.subtitle": "Allgemeine Anwendungskonfiguration",
"settings.formats.title": "Unterstützte Formate",
"settings.formats.subtitle": "Dokumenttypen, die Sie übersetzen können",
"settings.formats.formulas": "Formeln",
"settings.formats.styles": "Stile",
"settings.formats.images": "Bilder",
"settings.formats.headers": "Kopfzeilen",
"settings.formats.tables": "Tabellen",
"settings.formats.slides": "Folien",
"settings.formats.notes": "Notizen",
"settings.cache.title": "Cache",
"settings.cache.desc": "Das Löschen des lokalen Caches kann einige Anzeigeprobleme beheben.",
"settings.cache.clearing": "Wird gelöscht...",
"settings.cache.clear": "Cache löschen",
"settings.formats.excel.name": "Excel",
"settings.formats.word.name": "Word",
"settings.formats.powerpoint.name": "PowerPoint"
}

View File

@@ -0,0 +1,92 @@
{
"translate.mode.label": "Mode de traduction",
"translate.mode.classic": "Classique",
"translate.mode.classicDesc": "Rapide",
"translate.mode.proLlm": "Pro LLM",
"translate.mode.proLlmDesc": "Contextuel",
"translate.mode.tooltip": "Passez à Pro pour la traduction LLM",
"translate.mode.upgradeLink": "Passer à Pro",
"translate.mode.upgradeDesc": "pour des traductions alimentées par LLM",
"translate.glossary.title": "Glossar",
"translate.glossary.select": "Glossar auswählen",
"translate.glossary.none": "Keins",
"translate.glossary.terms": "Begriffe",
"translate.glossary.proOnly": "Upgraden Sie auf Pro für Glossare",
"translate.glossary.myGlossaries": "Meine Glossare",
"translate.glossary.fromTemplate": "Aus Vorlage erstellen",
"translate.glossary.noGlossaryForPair": "Kein Glossar für",
"translate.glossary.noGlossaries": "Keine Glossare",
"translate.glossary.loading": "Laden...",
"translate.glossary.classicMode": "Neutraler Motor ohne Glossar (nur KI)",
"translate.glossary.selectPlaceholder": "Glossar auswählen...",
"translate.glossary.multilingual": "MEHRSPRACHIG",
"translate.glossary.noGlossaryAvailable": "Kein Glossar verfügbar",
"translate.glossary.filterByLang": "Nach Sprache filtern",
"translate.glossary.active": "Aktiv",
"translate.glossary.inactive": "Inaktiv",
"translate.glossary.availableTemplates": "Verfügbare Vorlagen",
"translate.glossary.importing": "Importiere...",
"translate.glossary.imported": "(Importiert)",
"translate.glossary.noGlossaryForSource": "Kein Glossar oder Vorlage für Ausgangssprache",
"translate.glossary.createGlossary": "Glossar erstellen",
"translate.glossary.showAll": "Alle Glossare anzeigen",
"translate.glossary.activePreview": "Vorschau aktiver Zuordnungen:",
"translate.glossary.total": "gesamt",
"translate.glossary.moreTerms": "weitere Begriffe",
"translate.glossary.noTerms": "Keine Begriffe in diesem Glossar.",
"translate.glossary.sourceTerm": "Quellbegriff",
"translate.glossary.translation": "Übersetzung",
"translate.glossary.addTerm": "Begriff hinzufügen",
"translate.glossary.disabledMode": "Neutraler Motor ohne angewandtes Glossar",
"translate.glossary.addTermError": "Fehler beim Hinzufügen des Begriffs",
"translate.glossary.networkError": "Netzwerkfehler",
"translate.glossary.importFailed": "Import fehlgeschlagen ({status})",
"translate.glossary.helpText": "Das Glossar erzwingt die präzise Übersetzung von Begriffen. Wählen Sie ein Glossar, dessen Ausgangssprache der Originalsprache Ihres Dokuments entspricht.",
"translate.glossary.sourceWarning": "Achtung: Dieses Glossar verwendet die Ausgangssprache",
"translate.glossary.sourceWarningBut": "aber Ihr Dokument ist konfiguriert auf",
"translate.glossary.targetWarning": "Ziel-Inkompatibilität: Dieses Glossar ist für die Übersetzung in",
"translate.glossary.targetWarningBut": "aber Ihr Dokument zielt auf",
"translate.glossary.targetWarningEnd": "Die Begriffe sind möglicherweise nicht relevant.",
"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)"
}

View File

@@ -0,0 +1,6 @@
{
"translateComplete.highQuality": "Hohe Qualität",
"translateComplete.segments": "Segmente",
"translateComplete.characters": "Zeichen",
"translateComplete.confidence": "Vertrauen"
}

View File

@@ -0,0 +1,48 @@
{
"admin.login.title": "Administration",
"admin.login.required": "Login required",
"admin.login.password": "Admin password",
"admin.login.connecting": "Connecting...",
"admin.login.access": "Access admin panel",
"admin.login.restricted": "Restricted to administrators",
"admin.layout.checking": "Verifying authentication...",
"admin.dashboard.title": "Admin Dashboard",
"admin.dashboard.subtitle": "Administrator control panel",
"admin.dashboard.refresh": "Refresh",
"admin.dashboard.refreshTooltip": "Refresh dashboard data",
"admin.dashboard.config": "System Configuration",
"admin.dashboard.maxFileSize": "Max file size:",
"admin.dashboard.translationService": "Translation service:",
"admin.dashboard.formats": "Formats:",
"admin.nav.dashboard": "Dashboard",
"admin.nav.users": "Users",
"admin.nav.pricing": "Pricing & Stripe",
"admin.nav.providers": "Providers",
"admin.nav.system": "System",
"admin.nav.logs": "Logs",
"admin.users.title": "User Management",
"admin.users.subtitle": "View and manage user accounts",
"admin.users.planUpdated": "Plan updated",
"admin.users.planChanged": "The plan has been changed to \\\"{plan}\\\" successfully.",
"admin.users.unknownError": "Unknown error",
"admin.users.error": "Error",
"admin.users.planUpdateError": "Unable to update plan: {message}",
"admin.users.noKeys": "No keys",
"admin.users.noKeysDesc": "This user has no active API keys.",
"admin.users.keysRevoked": "Keys revoked",
"admin.users.keysRevokedDesc": "{count} API key(s) revoked successfully.",
"admin.users.revokeError": "Unable to revoke keys: {message}",
"admin.users.retry": "Retry",
"admin.system.title": "System",
"admin.system.subtitle": "Monitor system status and manage resources",
"admin.system.quotas": "Translation quotas",
"admin.system.resetQuotas": "Reset monthly quotas",
"admin.system.resetting": "Resetting...",
"admin.system.reset": "Reset",
"admin.system.allOperational": "All Systems Operational",
"admin.system.issuesDetected": "System Issues Detected",
"admin.system.waitingData": "Waiting for data...",
"admin.system.purging": "Purging...",
"admin.system.clean": "Clean",
"admin.system.purge": "Purge"
}

View File

@@ -0,0 +1,72 @@
{
"apiKeys.webhook.title": "Webhook Integration",
"apiKeys.webhook.descriptionBefore": "Pass a ",
"apiKeys.webhook.descriptionAfter": " parameter to receive a POST request when your translation is complete.",
"apiKeys.webhook.codeParam": "webhook_url",
"apiKeys.title": "API Keys",
"apiKeys.subtitle": "Manage your API keys for programmatic access to the translation API.",
"apiKeys.loading": "Loading...",
"apiKeys.sectionTitle": "API & Automation",
"apiKeys.sectionDesc": "Generate and manage your API keys for automation workflows",
"apiKeys.keysUsed": "{total} of {max} keys used",
"apiKeys.maxReached": "Maximum keys reached. Revoke a key to generate a new one.",
"apiKeys.canGenerate": "You can generate {count} more key",
"apiKeys.canGeneratePlural": "You can generate {count} more keys",
"apiKeys.generateNew": "Generate New Key",
"apiKeys.keyRevoked": "Key revoked",
"apiKeys.keyRevokedDesc": "The API key has been revoked successfully.",
"apiKeys.keyNotFound": "Key Not Found",
"apiKeys.keyNotFoundDesc": "The API key no longer exists. It may have already been revoked.",
"apiKeys.error": "Error",
"apiKeys.revokeError": "Failed to revoke the API key. Please try again.",
"apiKeys.limitReached": "Limit Reached",
"apiKeys.limitReachedDesc": "You have reached the maximum of 10 API keys. Revoke an existing key to generate a new one.",
"apiKeys.proRequired": "Pro Feature Required",
"apiKeys.proRequiredDesc": "API keys are a Pro feature. Please upgrade your account.",
"apiKeys.generateError": "Failed to generate API key. Please try again.",
"apiKeys.upgrade.title": "API Keys",
"apiKeys.upgrade.subtitle": "Automate your translations with API access",
"apiKeys.upgrade.feat1": "Generate unlimited API keys",
"apiKeys.upgrade.feat2": "Automate document translation",
"apiKeys.upgrade.feat3": "Webhook notifications",
"apiKeys.upgrade.feat4": "LLM translation modes",
"apiKeys.upgrade.proFeature": "API Keys are a {pro} feature. Upgrade to unlock API automation.",
"apiKeys.upgrade.pro": "Pro",
"apiKeys.upgrade.cta": "Upgrade to Pro",
"apiKeys.dialog.maxTitle": "Maximum Keys Reached",
"apiKeys.dialog.maxDesc": "You have reached the maximum of 10 API keys. Please revoke an existing key before generating a new one.",
"apiKeys.dialog.close": "Close",
"apiKeys.dialog.generated": "API Key Generated!",
"apiKeys.dialog.generatedDesc": "Your new API key has been created. Copy it now - it won't be shown again.",
"apiKeys.dialog.important": "Important:",
"apiKeys.dialog.importantDesc": "This is the only time you'll see this key. Store it securely.",
"apiKeys.dialog.apiKey": "API Key",
"apiKeys.dialog.name": "Name:",
"apiKeys.dialog.done": "Done",
"apiKeys.dialog.copied": "I've copied the key",
"apiKeys.dialog.generateTitle": "Generate New API Key",
"apiKeys.dialog.generateDesc": "Create a new API key for programmatic access to the translation API.",
"apiKeys.dialog.keyName": "Key Name (optional)",
"apiKeys.dialog.keyNamePlaceholder": "e.g., Production, Staging",
"apiKeys.dialog.keyNameHint": "A descriptive name to help you identify this key later.",
"apiKeys.dialog.nameTooLong": "Name must be {max} characters or less",
"apiKeys.dialog.nameInvalid": "Name can only contain letters, numbers, spaces, hyphens, and underscores",
"apiKeys.dialog.cancel": "Cancel",
"apiKeys.dialog.generating": "Generating...",
"apiKeys.dialog.generate": "Generate Key",
"apiKeys.table.name": "Name",
"apiKeys.table.prefix": "Prefix",
"apiKeys.table.created": "Created",
"apiKeys.table.lastUsed": "Last used",
"apiKeys.table.never": "Never",
"apiKeys.table.actions": "Actions",
"apiKeys.table.revoke": "Revoke",
"apiKeys.table.copyPrefix": "Copy key prefix",
"apiKeys.table.revokeKey": "Revoke key",
"apiKeys.revokeDialog.title": "Revoke API Key",
"apiKeys.revokeDialog.desc": "Are you sure you want to revoke the key \\\"{name}\\\"? This action cannot be undone.",
"apiKeys.revokeDialog.confirm": "Yes, revoke",
"apiKeys.revokeDialog.cancel": "Cancel",
"apiKeys.noKeysGenerated": "No keys generated",
"apiKeys.copied": "Copied!"
}

View File

@@ -0,0 +1,3 @@
{
"auth.brandName": "Wordly"
}

View File

@@ -0,0 +1,12 @@
{
"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."
}

View File

@@ -0,0 +1,4 @@
{
"common.loading": "Loading...",
"common.backToHome": "Back to home"
}

View File

@@ -0,0 +1,25 @@
{
"context.proTitle": "Pro Feature",
"context.proDesc": "Context and professional glossaries are available with Pro, Business and Enterprise plans. They provide more accurate translations through instructions and vocabulary specific to your domain.",
"context.viewPlans": "View plans",
"context.title": "Context & Glossary",
"context.subtitle": "Improve translation quality with instructions and vocabulary specific to your domain.",
"context.presets.title": "Professional glossaries",
"context.presets.desc": "Load a complete glossary with instructions and specialized terminology",
"context.instructions.title": "Context instructions",
"context.instructions.desc": "Instructions the AI will follow during translation",
"context.instructions.placeholder": "E.g.: You translate HVAC technical documents. Use precise engineering terminology...",
"context.glossary.title": "Technical glossary",
"context.glossary.desc": "Format: source=target (one per line). Glossaries loaded via preset are editable.",
"context.glossary.terms": "terms in the glossary",
"context.clearAll": "Clear all",
"context.saving": "Saving...",
"context.save": "Save",
"context.presets.createGlossary": "Create glossary",
"context.presets.created": "Glossary created",
"context.presets.createdDesc": "The glossary \\\"{name}\\\" has been created with {count} terms.",
"context.presets.hint": "Click a preset to create a glossary with domain-specific terms. Manage your glossaries in the Glossaries section.",
"context.glossary.manage": "Manage glossaries",
"context.saved": "Saved",
"context.savedDesc": "Your context instructions have been saved."
}

View File

@@ -0,0 +1,7 @@
{
"cookieConsent.title": "Cookies on Wordly",
"cookieConsent.description": "We use essential cookies so the app works (session, security, language). With your permission, we also use optional cookies to measure traffic and improve the product.",
"cookieConsent.acceptAll": "Accept all",
"cookieConsent.essentialOnly": "Essential only",
"cookieConsent.learnMore": "Learn more"
}

View File

@@ -0,0 +1,115 @@
{
"dashboard.nav.translate": "Translate",
"dashboard.nav.profile": "My Profile",
"dashboard.nav.settings": "Settings",
"dashboard.nav.context": "Context",
"dashboard.nav.services": "Services",
"dashboard.nav.apiKeys": "API Keys",
"dashboard.nav.glossaries": "Glossaries & Context",
"dashboard.header.title": "Dashboard",
"dashboard.header.subtitle": "Manage your translations",
"dashboard.header.toggleMenu": "Menu",
"dashboard.header.profileTitle": "My profile",
"dashboard.sidebar.theme": "Theme",
"dashboard.sidebar.signOut": "Sign Out",
"dashboard.sidebar.backHome": "Back to Home",
"dashboard.sidebar.upgradeToPro": "Upgrade to Pro →",
"dashboard.translate.pageTitle": "Translate a document",
"dashboard.translate.pageSubtitle": "Import a file and choose the target language",
"dashboard.translate.errorNotificationTitle": "Error",
"dashboard.translate.dropzone.uploadAria": "File drop zone",
"dashboard.translate.dropzone.title": "Drag & drop your file here",
"dashboard.translate.dropzone.subtitle": "or click to select (DOCX, XLSX, PPTX, PDF)",
"dashboard.translate.dropzone.replaceFile": "Replace file",
"dashboard.translate.language.source": "Source language",
"dashboard.translate.language.target": "Target language",
"dashboard.translate.language.loading": "Loading languages…",
"dashboard.translate.language.autoDetect": "Auto-detect",
"dashboard.translate.language.selectPlaceholder": "Select…",
"dashboard.translate.language.loadErrorPrefix": "Failed to load languages",
"dashboard.translate.provider.loading": "Loading providers…",
"dashboard.translate.provider.noneConfigured": "No providers configured",
"dashboard.translate.provider.modelTitle": "Model",
"dashboard.translate.provider.sectionTitle": "Provider",
"dashboard.translate.provider.llmDivider": "AI · Context-Aware",
"dashboard.translate.provider.llmDividerPro": "AI · Context-Aware (Pro)",
"dashboard.translate.provider.upgrade": "Upgrade to Pro",
"dashboard.translate.provider.upgradeSuffix": "to unlock AI translation",
"dashboard.translate.provider.tabStandard": "Standard",
"dashboard.translate.provider.tabLLM": "AI Multi-Models",
"dashboard.translate.translateImages": "Translate images",
"dashboard.translate.translateImagesDesc": "Extract and translate text inside images (vision required)",
"dashboard.translate.trust.zeroRetention": "Zero retention",
"dashboard.translate.trust.deletedAfter": "Files deleted after processing",
"dashboard.translate.actions.uploading": "Uploading…",
"dashboard.translate.actions.translate": "Translate",
"dashboard.translate.actions.filePrefix": "File: ",
"dashboard.translate.actions.cancel": "Cancel",
"dashboard.translate.actions.tryAgain": "Try Again",
"dashboard.translate.steps.uploading": "Uploading file…",
"dashboard.translate.steps.starting": "Starting translation…",
"dashboard.translate.complete.title": "Translation complete!",
"dashboard.translate.complete.descNamed": "Your file {name} has been translated successfully.",
"dashboard.translate.complete.descGeneric": "Your file has been translated successfully.",
"dashboard.translate.complete.downloading": "Downloading…",
"dashboard.translate.complete.download": "Download",
"dashboard.translate.complete.newTranslation": "New Translation",
"dashboard.translate.complete.toastOkTitle": "Success",
"dashboard.translate.complete.toastOkDesc": "{name} has been downloaded successfully.",
"dashboard.translate.complete.toastFailTitle": "Failed",
"dashboard.translate.complete.toastFailDesc": "Translation failed. Please try again.",
"dashboard.translate.sourceDocument": "Source Document",
"dashboard.translate.configuration": "Configuration",
"dashboard.translate.translating": "Translation in progress",
"dashboard.translate.liveMonitor": "Live Monitor",
"dashboard.translate.summary": "Summary",
"dashboard.translate.engine": "Engine",
"dashboard.translate.confidence": "Confidence",
"dashboard.translate.cancel": "Cancel",
"dashboard.translate.segments": "Segments",
"dashboard.translate.characters": "Characters",
"dashboard.translate.elapsed": "Elapsed",
"dashboard.translate.segPerMin": "Seg/min",
"dashboard.translate.highQuality": "High quality",
"dashboard.translate.quality": "Quality",
"dashboard.translate.completed": "Translation complete",
"dashboard.translate.replace": "Replace",
"dashboard.translate.pdfMode.title": "PDF Translation Mode",
"dashboard.translate.pdfMode.preserveLayout": "Preserve Layout",
"dashboard.translate.pdfMode.textOnly": "Text Only",
"dashboard.translate.pdfMode.preserveLayoutDesc": "Keeps images, tables & formatting. Best for simple PDFs.",
"dashboard.translate.pdfMode.textOnlyDesc": "Translates all text perfectly. Clean output, no layout issues.",
"dashboard.translate.pipeline.upload": "Upload",
"dashboard.translate.pipeline.analyze": "Analyze",
"dashboard.translate.pipeline.translate": "Translation",
"dashboard.translate.pipeline.rebuild": "Rebuild",
"dashboard.translate.pipeline.finalize": "Finalize",
"dashboard.translate.progress.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.",
"dashboard.translate.error.apiKey": "Invalid or missing API key. Contact the administrator to configure API keys.",
"dashboard.translate.error.quota": "Usage limit reached. Try again in a few minutes or choose another engine.",
"dashboard.translate.error.timeout": "Connection to the translation service timed out. Check your network and try again.",
"dashboard.translate.error.sessionExpired": "Session expired. Click Retry to restart the translation.",
"dashboard.translate.error.empty": "The document appears empty or contains no translatable text (scanned PDF image?).",
"dashboard.translate.error.unsupported": "Unsupported file format or corrupted file.",
"dashboard.translate.error.connection": "Connection lost. Check your network and try again.",
"dashboard.translate.error.generic": "Translation failed: {detail}",
"dashboard.translate.error.title": "Translation failed",
"dashboard.translate.retry": "Retry translation",
"dashboard.translate.newFile": "New file",
"dashboard.translate.modeAI": "AI Mode",
"dashboard.translate.modeClassic": "Classic Mode",
"dashboard.translate.glossaryLLMHint": "Glossaries available in AI mode",
"dashboard.translate.submitting": "Submitting...",
"dashboard.translate.submit": "Start translation",
"dashboard.translate.noFile": "Upload a file first",
"dashboard.translate.noTargetLang": "Select a target language",
"dashboard.topbar.interfaceLabel": "Translation Interface",
"dashboard.topbar.premiumAccess": "Premium Access",
"dashboard.checkoutSyncError": "Error syncing payment.",
"dashboard.networkRefresh": "Network error. Please refresh the page.",
"dashboard.continueToTranslate": "Continue to translation"
}

View File

@@ -0,0 +1,31 @@
{
"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..."
}

View File

@@ -0,0 +1,14 @@
{
"forgotPassword.enterEmail": "Please enter your email address",
"forgotPassword.error": "An error occurred",
"forgotPassword.title": "Forgot Password",
"forgotPassword.checkEmail": "Check your inbox",
"forgotPassword.subtitle": "Enter your email to receive a reset link",
"forgotPassword.sentMessage": "If an account exists with this address, a reset email has been sent.",
"forgotPassword.emailLabel": "Email address",
"forgotPassword.emailPlaceholder": "you@example.com",
"forgotPassword.sending": "Sending...",
"forgotPassword.sendLink": "Send reset link",
"forgotPassword.backToLogin": "Back to login",
"forgotPassword.loading": "Loading..."
}

View File

@@ -0,0 +1,189 @@
{
"glossaries.yourGlossaries": "Your glossaries",
"glossaries.title": "Glossaries & Context",
"glossaries.description": "Manage your glossaries and context instructions for more accurate translations.",
"glossaries.createNew": "Create new",
"glossaries.empty": "No glossaries yet",
"glossaries.emptyDesc": "Create your first glossary or load a professional preset above",
"glossaries.defineTerms": "terms",
"glossaries.aboutTitle": "About glossaries",
"glossaries.aboutDesc": "Glossaries let you define exact translations for specific terms. When you translate a document, the glossary terms are used to ensure consistent and accurate translations.",
"glossaries.aboutFormat": "Each term has a source word and translations in multiple languages. Select a glossary in the translation page to apply it.",
"glossaries.toast.created": "Glossary created",
"glossaries.toast.createdDesc": "The glossary \\\"{name}\\\" has been created.",
"glossaries.toast.imported": "Glossary imported",
"glossaries.toast.importedDesc": "The glossary \\\"{name}\\\" has been imported.",
"glossaries.toast.updated": "Glossary updated",
"glossaries.toast.updatedDesc": "The glossary \\\"{name}\\\" has been updated.",
"glossaries.toast.deleted": "Glossary deleted",
"glossaries.toast.deletedDesc": "The glossary has been deleted.",
"glossaries.toast.error": "Error",
"glossaries.toast.errorCreate": "Failed to create glossary",
"glossaries.toast.errorImport": "Failed to import glossary",
"glossaries.toast.errorUpdate": "Failed to update glossary",
"glossaries.toast.errorDelete": "Failed to delete glossary",
"glossaries.dialog.title": "New glossary",
"glossaries.dialog.description": "Create a glossary for your translations",
"glossaries.dialog.nameLabel": "Name",
"glossaries.dialog.namePlaceholder": "My glossary",
"glossaries.dialog.tabTemplates": "Templates",
"glossaries.dialog.tabFile": "File",
"glossaries.dialog.tabManual": "Manual",
"glossaries.dialog.cancel": "Cancel",
"glossaries.dialog.creating": "Creating…",
"glossaries.dialog.importing": "Importing…",
"glossaries.dialog.importBtn": "Import",
"glossaries.dialog.selectPrompt": "Select",
"glossaries.dialog.createBtn": "Create",
"glossaries.dialog.createEmpty": "Create empty",
"glossaries.dialog.terms": "terms",
"glossaries.dialog.templatesDesc": "Choose a predefined template",
"glossaries.dialog.templatesEmpty": "No templates available",
"glossaries.dialog.dropTitle": "Drag a CSV file here",
"glossaries.dialog.dropOr": "or",
"glossaries.dialog.dropFormats": "CSV, TSV, TXT",
"glossaries.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",
"glossaries.dialog.errorFormat": "Unsupported format",
"glossaries.dialog.errorSize": "File too large",
"glossaries.dialog.errorEmpty": "Empty file",
"glossaries.dialog.errorRead": "Read error",
"glossaries.dialog.parsing": "Parsing…",
"glossaries.dialog.termsImported": "terms imported",
"glossaries.dialog.changeFile": "Change file",
"glossaries.dialog.retry": "Retry",
"glossaries.edit.title": "Edit Glossary",
"glossaries.edit.description": "Update the glossary name, language pair, and terms.",
"glossaries.edit.nameLabel": "Glossary Name",
"glossaries.edit.namePlaceholder": "Enter glossary name...",
"glossaries.edit.sourceLang": "Source language",
"glossaries.edit.targetLang": "Target language",
"glossaries.edit.termsLabel": "Terms ({count} valid)",
"glossaries.edit.exportCsv": "Export CSV",
"glossaries.edit.importCsv": "Import CSV",
"glossaries.edit.cancel": "Cancel",
"glossaries.edit.saving": "Saving...",
"glossaries.edit.saveChanges": "Save Changes",
"glossaries.edit.importFailedTitle": "Import failed",
"glossaries.edit.importFailedMaxDesc": "CSV contains {count} terms, but maximum is {max}. Please reduce the number of terms.",
"glossaries.edit.importSuccessTitle": "Import successful",
"glossaries.edit.importSuccessDesc": "{count} terms imported successfully.",
"glossaries.edit.importFailedEmptyDesc": "No valid terms found in CSV file.",
"glossaries.edit.importFailedReadDesc": "Failed to read CSV file.",
"glossaries.delete.title": "Delete Glossary",
"glossaries.delete.description": "Are you sure you want to delete this glossary?",
"glossaries.delete.warning": "This action cannot be undone",
"glossaries.delete.warningDesc": "All term pairs will be permanently removed.",
"glossaries.delete.cancel": "Cancel",
"glossaries.delete.deleting": "Deleting...",
"glossaries.delete.deleteBtn": "Delete",
"glossaries.upgrade.title": "Glossaries",
"glossaries.upgrade.description": "Customize your translations with custom terminology",
"glossaries.upgrade.feature1": "Create multiple glossaries",
"glossaries.upgrade.feature2": "Define source→target term pairs",
"glossaries.upgrade.feature3": "Import/export via CSV",
"glossaries.upgrade.feature4": "Apply to LLM translations",
"glossaries.upgrade.proFeatureBefore": "Glossaries are a ",
"glossaries.upgrade.proFeatureAfter": " feature. Upgrade to unlock custom terminology.",
"glossaries.upgrade.proLabel": "Pro",
"glossaries.upgrade.upgradeBtn": "Upgrade to Pro",
"glossaries.loading": "Loading...",
"glossaries.howItWorks.title": "How these settings are used",
"glossaries.howItWorks.step1Title": "Configure here",
"glossaries.howItWorks.step1Desc": "Write your context instructions or create/import a glossary of terms.",
"glossaries.howItWorks.step2Title": "Activate in Translate",
"glossaries.howItWorks.step2Desc": "On the translation page, in the right column, select your glossary.",
"glossaries.howItWorks.warning": "Context instructions apply automatically to all your AI translations once saved. Glossaries must be manually selected on the Translate page.",
"glossaries.howItWorks.goToTranslate": "Go to Translate",
"glossaries.status.unsaved": "Unsaved",
"glossaries.status.active": "Active · applies to all AI translations",
"glossaries.status.inactive": "Inactive",
"glossaries.instructions.whatForBold": "What is it for?",
"glossaries.instructions.whatForDesc": "These instructions are automatically sent to the AI before each translation, without you having to do anything on the Translate page. Use them to guide the style, register or general terminology.",
"glossaries.instructions.example": "Example: \\\"You translate financial reports. Be formal, precise and keep all figures.\\\"",
"glossaries.instructions.charCount": "{count} characters",
"glossaries.instructions.emptyHint": "Empty — no instructions sent to the AI",
"glossaries.instructions.clearAll": "Clear all",
"glossaries.instructions.saving": "Saving...",
"glossaries.instructions.saved": "Saved",
"glossaries.presets.whatForBold": "What is it for?",
"glossaries.presets.whatForDesc": "Clicking a card creates a pre-filled glossary with domain-specific terms. This glossary will appear in your glossaries below, and you can manually select it on the Translate page to force precise term translations.",
"glossaries.presets.clickHint": "Click a card → glossary created → select it in Translate",
"glossaries.presets.creating": "Creating...",
"glossaries.presets.alreadyImported": "Imported",
"glossaries.presets.it.title": "IT / Software",
"glossaries.presets.it.desc": "Development, infrastructure, DevOps",
"glossaries.presets.legal.title": "Legal / Contracts",
"glossaries.presets.legal.desc": "Business law, litigation",
"glossaries.presets.medical.title": "Medical / Health",
"glossaries.presets.medical.desc": "Pharmacology, surgery, diagnosis",
"glossaries.presets.finance.title": "Finance / Accounting",
"glossaries.presets.finance.desc": "IFRS, balance sheets, taxation",
"glossaries.presets.marketing.title": "Marketing / Advertising",
"glossaries.presets.marketing.desc": "Digital, branding, analytics",
"glossaries.presets.hr.title": "HR / Human Resources",
"glossaries.presets.hr.desc": "Contracts, policies, recruitment",
"glossaries.presets.scientific.title": "Scientific / Research",
"glossaries.presets.scientific.desc": "Publications, theses, articles",
"glossaries.presets.ecommerce.title": "E-commerce / Sales",
"glossaries.presets.ecommerce.desc": "Online stores, catalogs, CRM",
"glossaries.grid.title": "Your",
"glossaries.grid.titleHighlight": "glossaries",
"glossaries.grid.countWithAction": "{count} glossary({plural}) — click a card to edit",
"glossaries.grid.emptyAction": "Create your first glossary or import a preset above",
"glossaries.grid.activeTranslation": "Active translation:",
"glossaries.grid.goToTranslate": "Go to Translate to activate",
"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.",
"glossaries.detail.backToList": "Back to glossaries",
"glossaries.detail.save": "Save",
"glossaries.detail.savedTitle": "Saved",
"glossaries.detail.savedDesc": "The glossary has been updated.",
"glossaries.detail.settingsTitle": "Settings",
"glossaries.detail.sourceLang": "Source language",
"glossaries.detail.targetLang": "Target language",
"glossaries.detail.termsTitle": "Terms",
"glossaries.detail.terms": "terms",
"glossaries.detail.searchTerms": "Filter…",
"glossaries.detail.noTerms": "No terms yet.",
"glossaries.detail.addFirstTerm": "Add the first term",
"glossaries.detail.addTerm": "Add a term",
"glossaries.detail.maxReached": "Maximum limit reached",
"glossaries.detail.source": "Source",
"glossaries.detail.target": "Target",
"glossaries.detail.sourcePlaceholder": "source term",
"glossaries.detail.targetPlaceholder": "target term",
"glossaries.detail.csvTitle": "CSV",
"glossaries.detail.csvDesc": "Export your terms as CSV or import new ones (replaces the current list).",
"glossaries.detail.export": "Export",
"glossaries.detail.import": "Import",
"glossaries.detail.dangerTitle": "Danger zone",
"glossaries.detail.dangerDesc": "Deletion is permanent. All associated terms will be lost.",
"glossaries.detail.deleteGlossary": "Delete this glossary",
"glossaries.detail.confirmDelete": "Confirm deletion?",
"glossaries.detail.confirm": "Confirm",
"glossaries.detail.cancel": "Cancel",
"glossaries.detail.sourceLangNote": "'The original source is in French. For other languages, we read the term's translations field (if available).'",
"glossaries.detail.sourceLocked": "fixed",
"glossaries.detail.sourceLockedNote": "Templates only store the source in French. Multilingual source is on the roadmap.",
"glossaries.detail.targetLangNote": "Pick a language to see the matching translations, or « Multilingual » for the default value.",
"glossaries.detail.notFoundTitle": "Glossary not found",
"glossaries.detail.notFoundDesc": "This glossary does not exist or you don't have access to it.",
"glossaries.detail.maxTermsTitle": "Limit reached",
"glossaries.detail.maxTermsDesc": "Maximum {max} terms per glossary.",
"glossaries.detail.importEmptyTitle": "Empty file",
"glossaries.detail.importEmptyDesc": "No terms detected in this file.",
"glossaries.detail.importedTitle": "Imported",
"glossaries.detail.importedDesc": "{count} terms imported.",
"glossaries.detail.importErrorTitle": "Read error",
"glossaries.detail.importErrorDesc": "Unable to read the file."
}

View File

@@ -0,0 +1,60 @@
// Auto-generated by scripts/generate_i18n_index.py
// Merges all namespace JSON files for locale "en".
import admin from "./admin.json";
import apiKeys from "./apiKeys.json";
import auth from "./auth.json";
import checkout from "./checkout.json";
import common from "./common.json";
import context from "./context.json";
import cookieConsent from "./cookieConsent.json";
import dashboard from "./dashboard.json";
import fileUploader from "./fileUploader.json";
import forgotPassword from "./forgotPassword.json";
import glossaries from "./glossaries.json";
import landing from "./landing.json";
import langSelector from "./langSelector.json";
import layout from "./layout.json";
import login from "./login.json";
import memento from "./memento.json";
import pricing from "./pricing.json";
import profile from "./profile.json";
import providerSelector from "./providerSelector.json";
import providerTheme from "./providerTheme.json";
import register from "./register.json";
import resetPassword from "./resetPassword.json";
import services from "./services.json";
import settings from "./settings.json";
import translate from "./translate.json";
import translateComplete from "./translateComplete.json";
const messages: Record<string, string> = {
...admin,
...apiKeys,
...auth,
...checkout,
...common,
...context,
...cookieConsent,
...dashboard,
...fileUploader,
...forgotPassword,
...glossaries,
...landing,
...langSelector,
...layout,
...login,
...memento,
...pricing,
...profile,
...providerSelector,
...providerTheme,
...register,
...resetPassword,
...services,
...settings,
...translate,
...translateComplete,
};
export default messages;

View File

@@ -0,0 +1,152 @@
{
"landing.nav.why": "Why Us?",
"landing.nav.formats": "Formats",
"landing.nav.pricing": "Pricing",
"landing.nav.login": "Log in",
"landing.nav.startFree": "Start Free",
"landing.hero.tag": "Professional Document AI",
"landing.hero.titleLine1": "Translate your documents.",
"landing.hero.titleLine2": "Keep the formatting perfect.",
"landing.hero.description": "The only translator that preserves SmartArt, charts, tables of contents, shapes, and complex layouts — exactly as they were.",
"landing.hero.ctaMain": "Start Free — 2 docs/month",
"landing.hero.ctaSec": "See Offers",
"landing.hero.deleted": "Files deleted after 60 min",
"landing.hero.noHidden": "No hidden fees",
"landing.hero.preview": "Preview before payment",
"landing.hero.formattedOk": "Formatting OK",
"landing.hero.aiActive": "AI Translation active",
"landing.steps.title": "How it works?",
"landing.steps.subtitle": "Three steps. Zero formatting loss.",
"landing.steps.step1.num": "01",
"landing.steps.step1.title": "Upload your file",
"landing.steps.step1.desc": "Drag & drop your Excel, Word, PowerPoint or PDF document.",
"landing.steps.step2.num": "02",
"landing.steps.step2.title": "Pick language & engine",
"landing.steps.step2.desc": "Select target language and engine — classic or context-aware AI.",
"landing.steps.step3.num": "03",
"landing.steps.step3.title": "Download the result",
"landing.steps.step3.desc": "Get your translated document with formatting identical to the original.",
"landing.features.tag": "AI Translation Engine",
"landing.features.title": "Translation that understands your craft",
"landing.features.description": "Our AI models analyze context, respect your terminology, and even translate text inside images.",
"landing.features.context.title": "Industry Context",
"landing.features.context.desc": "Describe your field and get tailored translations, not generic ones.",
"landing.features.glossary.title": "Industry Glossaries",
"landing.features.glossary.desc": "Define your technical terms. CTA stays 'Air Handling Unit', never 'Call To Action'.",
"landing.features.vision.title": "Image Vision",
"landing.features.vision.desc": "Text embedded in images, diagrams and charts is detected and translated.",
"landing.features.demo.source": "Source (FR)",
"landing.features.demo.google": "Google Translate",
"landing.features.demo.ours": "Our AI",
"landing.layout.title": "Your formatting,",
"landing.layout.title2": "perfectly preserved",
"landing.layout.subtitle": "Other translators break your layout. We don't.",
"landing.layout.p1.title": "SmartArt & Diagrams",
"landing.layout.p1.desc": "Org charts, flowcharts, hierarchies — all translated identically.",
"landing.layout.p2.title": "Tables of Contents",
"landing.layout.p2.desc": "TOC entries, page numbers and cross-references updated correctly.",
"landing.layout.p3.title": "Charts & Graphs",
"landing.layout.p3.desc": "Titles, axis labels, legends and series names — everything is translated.",
"landing.layout.p4.title": "Shapes & Text Boxes",
"landing.layout.p4.desc": "Rectangles, rounded blocks, callouts — localized everywhere.",
"landing.layout.p5.title": "Headers & Footers",
"landing.layout.p5.desc": "Headers, footers and footnotes are never missed.",
"landing.layout.p6.title": "130+ Languages",
"landing.layout.p6.desc": "Google Translate, DeepL and professional-grade AI engines.",
"landing.formats.title": "Every format,",
"landing.formats.title2": "every element",
"landing.formats.subtitle": "We translate what others miss. Your business deserves irreproachable documentation.",
"landing.formats.word.name": "Word",
"landing.formats.word.i1": "Paragraphs & headings",
"landing.formats.word.i2": "Tables & charts",
"landing.formats.word.i3": "SmartArt diagrams",
"landing.formats.word.i4": "Table of contents",
"landing.formats.word.i5": "Headers & footers",
"landing.formats.word.i6": "Shapes & text boxes",
"landing.formats.word.i7": "Footnotes & endnotes",
"landing.formats.excel.name": "Excel",
"landing.formats.excel.i1": "Cell values",
"landing.formats.excel.i2": "Sheet names",
"landing.formats.excel.i3": "Charts & labels",
"landing.formats.excel.i4": "Headers & footers",
"landing.formats.excel.i5": "Merged cells preserved",
"landing.formats.pptx.name": "PowerPoint",
"landing.formats.pptx.i1": "Slide text & notes",
"landing.formats.pptx.i2": "Charts & diagrams",
"landing.formats.pptx.i3": "Shapes & text boxes",
"landing.formats.pptx.i4": "Master layouts",
"landing.formats.pptx.i5": "Animations preserved",
"landing.formats.pdf.name": "PDF",
"landing.formats.pdf.i1": "Text-based PDFs",
"landing.formats.pdf.i2": "Layout preserved",
"landing.formats.pdf.i3": "Images kept in place",
"landing.formats.pdf.i4": "Tables maintained",
"landing.formats.pdf.i5": "Output as DOCX or PDF",
"landing.pricing.title": "Simple, honest pricing",
"landing.pricing.subtitle": "What you see is what you pay. No hidden fees.",
"landing.pricing.monthly": "Monthly",
"landing.pricing.annual": "Annual",
"landing.pricing.bestValue": "Most Popular",
"landing.pricing.month": "/month",
"landing.pricing.footer": "The displayed price is the price you pay. No hidden fees after translation.",
"landing.pricing.starter.name": "Starter",
"landing.pricing.starter.desc": "For individuals and small projects",
"landing.pricing.starter.f1": "50 documents / month",
"landing.pricing.starter.f2": "Up to 50 pages per doc",
"landing.pricing.starter.f3": "Google Translate + DeepL",
"landing.pricing.starter.f4": "Files up to 10 MB",
"landing.pricing.starter.cta": "Get Started",
"landing.pricing.pro.name": "Pro",
"landing.pricing.pro.desc": "For demanding professionals",
"landing.pricing.pro.f1": "200 documents / month",
"landing.pricing.pro.f2": "Up to 200 pages per doc",
"landing.pricing.pro.f3": "AI-powered translation",
"landing.pricing.pro.f4": "Google + DeepL included",
"landing.pricing.pro.f5": "Custom glossaries & prompts",
"landing.pricing.pro.f6": "Priority support",
"landing.pricing.pro.cta": "Try Pro",
"landing.pricing.business.name": "Business",
"landing.pricing.business.desc": "For teams with high-volume needs",
"landing.pricing.business.f1": "1,000 documents / month",
"landing.pricing.business.f2": "Up to 500 pages per doc",
"landing.pricing.business.f3": "Premium AI (Claude)",
"landing.pricing.business.f4": "All providers + API access",
"landing.pricing.business.f5": "Webhooks & automation",
"landing.pricing.business.f6": "5 team seats",
"landing.pricing.business.cta": "Contact Us",
"landing.pricing.free.name": "Free",
"landing.pricing.free.desc": "Perfect to discover the app",
"landing.pricing.free.cta": "Choose this plan",
"landing.pricing.enterprise.name": "Enterprise",
"landing.pricing.enterprise.desc": "Custom solutions for large organizations",
"landing.pricing.enterprise.cta": "Contact us",
"landing.cta.title": "Start translating in 30 seconds",
"landing.cta.subtitle": "No credit card required. Try for free now and bring your multilingual documents back to life.",
"landing.cta.button": "Create Free Account",
"landing.cta.secure": "Secured by AES-256 encryption",
"landing.footer.desc": "Expert in intelligent document translation. We blend the art of layout with the science of contextual AI.",
"landing.footer.product": "Product",
"landing.footer.resources": "Resources",
"landing.footer.legal": "Legal",
"landing.footer.rights": "© 2026 Wordly.art — All rights reserved.",
"landing.hero.contextEngine": "Translation detected: Technical maintenance term for HVAC systems...",
"landing.hero.liveAnalysis": "Live Analysis",
"landing.hero.termsDetected": "terms detected",
"landing.steps.process": "PROCESS",
"landing.translate.newProject": "New Project",
"landing.translate.title": "Translate a document",
"landing.translate.subtitle": "Import a file and choose the target language",
"landing.translate.sourceDocument": "Source Document",
"landing.translate.configuration": "Configuration",
"landing.translate.sourceLang": "Source Language",
"landing.translate.targetLang": "Target Language",
"landing.translate.provider": "Provider",
"landing.translate.startTranslation": "Start Translation",
"landing.translate.zeroRetention": "Zero retention",
"landing.translate.filesDeleted": "Files deleted after processing",
"landing.translate.dropHere": "Drag & drop here",
"landing.translate.supportedFormats": "DOCX, XLSX, PPTX or PDF files supported",
"landing.translate.aiAnalysis": "Active AI Analysis",
"landing.translate.processing": "Processing",
"landing.translate.preservingLayout": "Your layout is being preserved"
}

View File

@@ -0,0 +1,7 @@
{
"langSelector.search": "Search...",
"langSelector.noResults": "No results",
"langSelector.source": "Source",
"langSelector.target": "Target",
"langSelector.swap": "Swap"
}

View File

@@ -0,0 +1,5 @@
{
"layout.nav.apiAccess": "API Access",
"layout.footer.terms": "Terms",
"layout.footer.privacy": "Privacy"
}

View File

@@ -0,0 +1,18 @@
{
"login.errorTitle": "Login Error",
"login.welcomeBack": "Welcome back",
"login.signInToContinue": "Sign in to continue translating",
"login.email": "Email",
"login.emailPlaceholder": "you@example.com",
"login.password": "Password",
"login.forgotPassword": "Forgot password?",
"login.passwordPlaceholder": "••••••••",
"login.signingIn": "Signing in...",
"login.signIn": "Sign In",
"login.noAccount": "Don't have an account?",
"login.signUpFree": "Sign up for free",
"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."
}

View File

@@ -0,0 +1,6 @@
{
"memento.title": "Discover Momento",
"memento.slogan": "Momento is more than just a notes application. It's an intelligent ecosystem that connects, analyzes, and develops your ideas in real-time using 6 AI agents and cutting-edge semantic search.",
"memento.ctaFree": "Start for free",
"memento.ctaMore": "Learn more"
}

View File

@@ -0,0 +1,151 @@
{
"pricing.nav.back": "Back",
"pricing.nav.home": "Home",
"pricing.nav.mySubscription": "My Subscription",
"pricing.header.badge": "AI Models Updated — March 2026",
"pricing.header.title": "A plan for every need",
"pricing.header.subtitle": "Translate your Word, Excel and PowerPoint documents while preserving the original layout. No API key required.",
"pricing.billing.monthly": "Monthly",
"pricing.billing.yearly": "Yearly",
"pricing.plans.free.name": "Free",
"pricing.plans.starter.name": "Starter",
"pricing.plans.pro.name": "Pro",
"pricing.plans.business.name": "Business",
"pricing.plans.enterprise.name": "Enterprise",
"pricing.plans.free.description": "Perfect for discovering the app",
"pricing.plans.starter.description": "For individuals and small projects",
"pricing.plans.pro.description": "For professionals and growing teams",
"pricing.plans.business.description": "For teams and organizations",
"pricing.plans.enterprise.description": "Custom solutions for large organizations",
"pricing.plans.pro.highlight": "Most popular",
"pricing.plans.pro.badge": "POPULAR",
"pricing.plans.enterprise.badge": "ON REQUEST",
"pricing.plans.free.feat1": "5 documents / month",
"pricing.plans.free.feat2": "Up to 15 pages per document",
"pricing.plans.free.feat3": "Google Translation included",
"pricing.plans.free.feat4": "All languages (130+)",
"pricing.plans.free.feat5": "Community support",
"pricing.plans.starter.feat1": "50 documents / month",
"pricing.plans.starter.feat2": "Up to 50 pages per document",
"pricing.plans.starter.feat3": "Google Translation + DeepL",
"pricing.plans.starter.feat4": "Files up to 10 MB",
"pricing.plans.starter.feat5": "Email support",
"pricing.plans.starter.feat6": "30-day history",
"pricing.plans.pro.feat1": "200 documents / month",
"pricing.plans.pro.feat2": "Up to 200 pages per document",
"pricing.plans.pro.feat3": "Essential AI Translation",
"pricing.plans.pro.feat4": "Google Translation + DeepL",
"pricing.plans.pro.feat5": "Files up to 25 MB",
"pricing.plans.pro.feat6": "Custom glossaries",
"pricing.plans.pro.feat7": "Priority support",
"pricing.plans.pro.feat8": "90-day history",
"pricing.plans.business.feat1": "1,000 documents / month",
"pricing.plans.business.feat2": "Up to 500 pages per document",
"pricing.plans.business.feat3": "Essential + Premium AI (Claude Haiku)",
"pricing.plans.business.feat4": "All translation providers",
"pricing.plans.business.feat5": "Files up to 50 MB",
"pricing.plans.business.feat6": "API access (10,000 calls/month)",
"pricing.plans.business.feat7": "Notification webhooks",
"pricing.plans.business.feat8": "Dedicated support",
"pricing.plans.business.feat9": "1-year history",
"pricing.plans.business.feat10": "Advanced analytics",
"pricing.plans.enterprise.feat1": "Unlimited documents",
"pricing.plans.enterprise.feat2": "All AI models (GPT-5, Claude Opus 4.6…)",
"pricing.plans.enterprise.feat3": "On-premise or dedicated cloud deployment",
"pricing.plans.enterprise.feat4": "99.9% SLA guaranteed",
"pricing.plans.enterprise.feat5": "24/7 dedicated support",
"pricing.plans.enterprise.feat6": "White-label",
"pricing.plans.enterprise.feat7": "Unlimited teams",
"pricing.plans.enterprise.feat8": "Custom integrations",
"pricing.card.onRequest": "On request",
"pricing.card.free": "Free",
"pricing.card.perMonth": "/month",
"pricing.card.billedYearly": "Billed {price} € / year",
"pricing.card.documents": "Documents",
"pricing.card.pagesMax": "Max pages",
"pricing.card.aiTranslation": "AI Translation",
"pricing.card.unlimited": "Unlimited",
"pricing.card.perMonthStat": "/ month",
"pricing.card.perDoc": "p / doc",
"pricing.card.aiEssential": "Essential",
"pricing.card.aiEssentialPremium": "Essential + Premium",
"pricing.card.aiCustom": "Custom",
"pricing.card.myPlan": "My Plan",
"pricing.card.managePlan": "Manage my plan",
"pricing.card.startFree": "Start for free",
"pricing.card.contactUs": "Contact us",
"pricing.card.choosePlan": "Choose this plan",
"pricing.card.processing": "Processing…",
"pricing.comparison.title": "Detailed comparison",
"pricing.comparison.subtitle": "Everything included in each plan",
"pricing.comparison.feature": "Feature",
"pricing.comparison.docsPerMonth": "Documents / month",
"pricing.comparison.pagesMaxPerDoc": "Max pages / document",
"pricing.comparison.maxFileSize": "Max file size",
"pricing.comparison.googleTranslation": "Google Translation",
"pricing.comparison.deepl": "DeepL",
"pricing.comparison.aiEssential": "Essential AI Translation",
"pricing.comparison.aiPremium": "Premium AI Translation",
"pricing.comparison.apiAccess": "API Access",
"pricing.comparison.priorityProcessing": "Priority processing",
"pricing.comparison.support": "Support",
"pricing.comparison.support.community": "Community",
"pricing.comparison.support.email": "Email",
"pricing.comparison.support.priority": "Priority",
"pricing.comparison.support.dedicated": "Dedicated",
"pricing.comparison.mb": "MB",
"pricing.credits.title": "Additional credits",
"pricing.credits.subtitle": "Need more? Buy credits individually, no subscription.",
"pricing.credits.perPage": "1 credit = 1 translated page.",
"pricing.credits.bestValue": "Best value",
"pricing.credits.unit": "credits",
"pricing.credits.centsPerCredit": "cts / credit",
"pricing.credits.buy": "Buy",
"pricing.trust.encryption.title": "End-to-end encryption",
"pricing.trust.encryption.sub": "TLS 1.3 + AES-256 at rest",
"pricing.trust.languages.title": "130+ languages",
"pricing.trust.languages.sub": "Including Arabic, Persian, Hebrew (RTL)",
"pricing.trust.parallel.title": "Parallel processing",
"pricing.trust.parallel.sub": "Ultra-fast multi-threaded AI",
"pricing.trust.availability.title": "Available 24/7",
"pricing.trust.availability.sub": "99.9% guaranteed uptime",
"pricing.aiModels.title": "Our AI Models — March 2026",
"pricing.aiModels.essential.title": "Essential AI Translation",
"pricing.aiModels.essential.plan": "Pro Plan",
"pricing.aiModels.essential.descPrefix": "Based on",
"pricing.aiModels.essential.descSuffix": "— the most cost-effective AI model of 2026. Quality comparable to frontier models at a fraction of the cost.",
"pricing.aiModels.essential.modelName": "our Essential AI model",
"pricing.aiModels.essential.context": "163K tokens of context",
"pricing.aiModels.essential.value": "Excellent value for money",
"pricing.aiModels.premium.title": "Premium AI Translation",
"pricing.aiModels.premium.plan": "Business Plan",
"pricing.aiModels.premium.descPrefix": "Based on",
"pricing.aiModels.premium.descSuffix": "by Anthropic — accurate on legal, medical and complex technical documents.",
"pricing.aiModels.premium.context": "200K tokens of context",
"pricing.aiModels.premium.precision": "Best accuracy",
"pricing.faq.title": "Frequently asked questions",
"pricing.faq.q1": "Can I change plans at any time?",
"pricing.faq.a1": "Yes. Upgrading is immediate and prorated. Downgrading takes effect at the end of the current period.",
"pricing.faq.q2": "What is \\\"Essential AI Translation\\\"?",
"pricing.faq.a2": "It's our AI engine. It understands your documents' context, preserves layout and handles technical terms much better than classic translation.",
"pricing.faq.q3": "What's the difference between Essential and Premium AI?",
"pricing.faq.a3": "Essential AI uses an optimized model (excellent value for money). Premium AI uses Anthropic's Claude Sonnet 4.6, more accurate on legal, medical and complex technical documents.",
"pricing.faq.q4": "Are my documents kept after translation?",
"pricing.faq.a4": "Translated files are available according to your plan (30 days Starter, 90 days Pro, 1 year Business). They are encrypted at rest and in transit.",
"pricing.faq.q5": "What happens if I exceed my monthly quota?",
"pricing.faq.a5": "You can buy additional credits individually, or upgrade your plan. You are notified at 80% usage.",
"pricing.faq.q6": "Is there a free trial for paid plans?",
"pricing.faq.a6": "The Free plan is permanent and requires no credit card. For Pro and Business plans, contact us for a 14-day trial.",
"pricing.faq.q7": "What file formats are supported?",
"pricing.faq.a7": "Word (.docx), Excel (.xlsx/.xls), PowerPoint (.pptx), and soon PDF. All plans support the same formats.",
"pricing.cta.title": "Ready to start?",
"pricing.cta.subtitle": "Start for free, no credit card required. Upgrade when you need to.",
"pricing.cta.createAccount": "Create a free account",
"pricing.cta.login": "Sign in",
"pricing.toast.demo": "Demo mode — Stripe is not yet configured. In production, you would be redirected to payment to activate the {planId} plan.",
"pricing.toast.networkError": "Network error. Please try again.",
"pricing.toast.paymentError": "Error creating payment.",
"pricing.dashboard": "Dashboard",
"pricing.okSymbol": "✓",
"pricing.errSymbol": "✕"
}

View File

@@ -0,0 +1,58 @@
{
"profile.header.title": "My Profile",
"profile.header.subtitle": "Manage your account and preferences.",
"profile.tabs.account": "Account",
"profile.tabs.subscription": "Subscription",
"profile.tabs.preferences": "Preferences",
"profile.account.user": "User",
"profile.account.memberSince": "Member since",
"profile.plan.label": "Plan",
"profile.plan.free": "Free",
"profile.plan.starter": "Starter",
"profile.plan.pro": "Pro",
"profile.plan.business": "Business",
"profile.plan.enterprise": "Enterprise",
"profile.plan.pricePerMonth": "{price} €/month",
"profile.subscription.canceling": "Canceling",
"profile.subscription.active": "Active",
"profile.subscription.unknown": "Unknown",
"profile.subscription.accessUntil": "Access until",
"profile.subscription.renewalOn": "Renewal on",
"profile.subscription.upgradePlan": "Upgrade to a paid plan",
"profile.subscription.changePlan": "Change plan",
"profile.subscription.manageBilling": "Manage billing",
"profile.subscription.billingUnavailable": "Billing portal unavailable.",
"profile.subscription.billingError": "Error accessing billing portal.",
"profile.subscription.cancelSuccess": "Subscription canceled. You keep access until the end of the period.",
"profile.subscription.cancelError": "Error during cancellation.",
"profile.subscription.networkError": "Network error.",
"profile.usage.title": "Usage this month",
"profile.usage.resetOn": "Reset on",
"profile.usage.documents": "Documents",
"profile.usage.pages": "Pages",
"profile.usage.extraCredits": "extra credit",
"profile.usage.extraCreditsPlural": "extra credits",
"profile.usage.quotaReached": "Quota reached",
"profile.usage.quotaReachedDesc": "Upgrade to a higher plan to continue.",
"profile.usage.unlockMore": "Unlock more translations with a paid plan.",
"profile.usage.viewPlans": "View plans",
"profile.usage.includedInPlan": "Included in your plan",
"profile.danger.title": "Danger zone",
"profile.danger.description": "Cancellation takes effect at the end of your current period. You keep access until that date.",
"profile.danger.confirm": "Are you sure? This action cannot be undone.",
"profile.danger.confirmCancel": "Confirm cancellation",
"profile.danger.cancelSubscription": "Cancel my subscription",
"profile.danger.keep": "No, keep",
"profile.prefs.interfaceLang": "Interface language",
"profile.prefs.interfaceLangDesc": "The language is automatically detected based on your browser. You can change it manually.",
"profile.prefs.defaultTargetLang": "Default target language",
"profile.prefs.selectLanguage": "Select a language",
"profile.prefs.defaultTargetLangDesc": "This language will be pre-selected for your translations.",
"profile.prefs.save": "Save",
"profile.prefs.theme": "Theme",
"profile.prefs.themeDesc": "Choose the interface appearance",
"profile.prefs.cache": "Cache",
"profile.prefs.cacheDesc": "Clearing the local cache can fix some display issues.",
"profile.prefs.clearing": "Clearing...",
"profile.prefs.clearCache": "Clear cache"
}

View File

@@ -0,0 +1,7 @@
{
"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."
}

View File

@@ -0,0 +1,29 @@
{
"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."
}

View File

@@ -0,0 +1,29 @@
{
"register.title": "Create an account",
"register.subtitle": "Start translating for free",
"register.error.failed": "Registration failed",
"register.name.label": "Name",
"register.name.placeholder": "Your name",
"register.name.error": "Name must be at least 2 characters",
"register.email.label": "Email address",
"register.email.placeholder": "you@example.com",
"register.email.error": "Invalid email address",
"register.password.label": "Password",
"register.password.error": "Password must be at least 8 characters with an uppercase, a lowercase and a digit",
"register.password.show": "Show password",
"register.password.hide": "Hide password",
"register.password.strengthLabel": "Strength:",
"register.password.strength.weak": "Weak",
"register.password.strength.medium": "Medium",
"register.password.strength.strong": "Strong",
"register.confirmPassword.label": "Confirm password",
"register.confirmPassword.error": "Passwords do not match",
"register.confirmPassword.show": "Show",
"register.confirmPassword.hide": "Hide",
"register.submit.creating": "Creating account...",
"register.submit.create": "Create my account",
"register.hasAccount": "Already have an account?",
"register.login": "Sign in",
"register.terms.prefix": "By creating an account, you accept our",
"register.terms.link": "terms of service"
}

View File

@@ -0,0 +1,22 @@
{
"resetPassword.passwordRequirements": "Password must contain at least 8 characters, one uppercase, one lowercase, and one number",
"resetPassword.passwordMismatch": "Passwords do not match",
"resetPassword.tokenMissing": "Missing token. Please use the link received by email.",
"resetPassword.error": "An error occurred",
"resetPassword.invalidLink": "Invalid link",
"resetPassword.invalidLinkMessage": "This reset link is invalid. Please request a new one.",
"resetPassword.requestNewLink": "Request new link",
"resetPassword.successTitle": "Password reset",
"resetPassword.newPasswordTitle": "New password",
"resetPassword.successSubtitle": "You will be redirected to login",
"resetPassword.subtitle": "Set your new password",
"resetPassword.successMessage": "Your password has been successfully reset. You will be redirected to the login page.",
"resetPassword.newPassword": "New password",
"resetPassword.showPassword": "Show password",
"resetPassword.hidePassword": "Hide password",
"resetPassword.confirmPassword": "Confirm password",
"resetPassword.resetting": "Resetting...",
"resetPassword.resetPassword": "Reset password",
"resetPassword.backToLogin": "Back to login",
"resetPassword.loading": "Loading..."
}

View File

@@ -0,0 +1,14 @@
{
"services.title": "Translation Providers",
"services.subtitle": "Providers are configured by the administrator. You can see which ones are currently available for your account.",
"services.loading": "Loading providers...",
"services.noProviders": "No providers are currently configured. Contact your administrator.",
"services.classic": "Classic Translation",
"services.llmPro": "LLM · Context-Aware (Pro)",
"services.available": "Available",
"services.model": "Model",
"services.adminOnly.title": "Provider configuration is admin-only",
"services.adminOnly.desc": "API keys, model selection, and provider activation are managed exclusively by the administrator in the admin panel. You never need to enter an API key.",
"services.fallback.google.label": "Google Translate",
"services.fallback.google.desc": "Fast translation, 130+ languages"
}

View File

@@ -0,0 +1,20 @@
{
"settings.title": "Settings",
"settings.subtitle": "General application configuration",
"settings.formats.title": "Supported formats",
"settings.formats.subtitle": "Document types you can translate",
"settings.formats.formulas": "Formulas",
"settings.formats.styles": "Styles",
"settings.formats.images": "Images",
"settings.formats.headers": "Headers",
"settings.formats.tables": "Tables",
"settings.formats.slides": "Slides",
"settings.formats.notes": "Notes",
"settings.cache.title": "Cache",
"settings.cache.desc": "Clearing the local cache can fix some display issues.",
"settings.cache.clearing": "Clearing...",
"settings.cache.clear": "Clear cache",
"settings.formats.excel.name": "Excel",
"settings.formats.word.name": "Word",
"settings.formats.powerpoint.name": "PowerPoint"
}

View File

@@ -0,0 +1,93 @@
{
"translate.glossary.selectGlossary": "Select a glossary...",
"translate.mode.label": "Translation Mode",
"translate.mode.classic": "Classic",
"translate.mode.classicDesc": "Fast",
"translate.mode.proLlm": "Pro LLM",
"translate.mode.proLlmDesc": "Context-Aware",
"translate.mode.tooltip": "Upgrade to Pro for LLM translation",
"translate.mode.upgradeLink": "Upgrade to Pro",
"translate.mode.upgradeDesc": "for LLM-powered translations",
"translate.glossary.title": "Glossary",
"translate.glossary.select": "Select a glossary",
"translate.glossary.none": "None",
"translate.glossary.terms": "terms",
"translate.glossary.proOnly": "Upgrade to Pro to use glossaries",
"translate.glossary.myGlossaries": "My glossaries",
"translate.glossary.fromTemplate": "Create from template",
"translate.glossary.noGlossaryForPair": "No glossary for",
"translate.glossary.noGlossaries": "No glossaries yet",
"translate.glossary.loading": "Loading...",
"translate.glossary.classicMode": "Neutral engine without glossary (AI only)",
"translate.glossary.selectPlaceholder": "Select a glossary...",
"translate.glossary.multilingual": "MULTILINGUAL",
"translate.glossary.noGlossaryAvailable": "No glossary available",
"translate.glossary.filterByLang": "Filter by language",
"translate.glossary.active": "Active",
"translate.glossary.inactive": "Inactive",
"translate.glossary.availableTemplates": "Available templates",
"translate.glossary.importing": "Importing...",
"translate.glossary.imported": "(Imported)",
"translate.glossary.noGlossaryForSource": "No glossary or template for source language",
"translate.glossary.createGlossary": "Create a glossary",
"translate.glossary.showAll": "Show all glossaries",
"translate.glossary.activePreview": "Active matches preview:",
"translate.glossary.total": "total",
"translate.glossary.moreTerms": "more terms",
"translate.glossary.noTerms": "No terms in this glossary.",
"translate.glossary.sourceTerm": "Source term",
"translate.glossary.translation": "Translation",
"translate.glossary.addTerm": "Add term",
"translate.glossary.disabledMode": "Neutral engine without glossary applied",
"translate.glossary.addTermError": "Error adding term",
"translate.glossary.networkError": "Network error",
"translate.glossary.importFailed": "Import failed ({status})",
"translate.glossary.helpText": "The glossary forces precise term translation. Choose a glossary whose source language matches your document's original language.",
"translate.glossary.sourceWarning": "Warning: This glossary uses source language",
"translate.glossary.sourceWarningBut": "but your document is configured in",
"translate.glossary.targetWarning": "Target mismatch: This glossary is designed to translate to",
"translate.glossary.targetWarningBut": "but your document targets",
"translate.glossary.targetWarningEnd": "Terms may not be relevant.",
"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)"
}

View File

@@ -0,0 +1,6 @@
{
"translateComplete.highQuality": "High quality",
"translateComplete.segments": "Segments",
"translateComplete.characters": "Characters",
"translateComplete.confidence": "Confidence"
}

View File

@@ -0,0 +1,48 @@
{
"admin.login.title": "Administración",
"admin.login.required": "Inicio de sesión requerido",
"admin.login.password": "Contraseña de administrador",
"admin.login.connecting": "Conectando...",
"admin.login.access": "Acceder al panel de administración",
"admin.login.restricted": "Restringido a administradores",
"admin.layout.checking": "Verificando autenticación...",
"admin.dashboard.title": "Panel de Administración",
"admin.dashboard.subtitle": "Panel de control del administrador",
"admin.dashboard.refresh": "Actualizar",
"admin.dashboard.refreshTooltip": "Actualizar datos del panel",
"admin.dashboard.config": "Configuración del sistema",
"admin.dashboard.maxFileSize": "Tamaño máximo de archivo:",
"admin.dashboard.translationService": "Servicio de traducción:",
"admin.dashboard.formats": "Formatos:",
"admin.nav.dashboard": "Dashboard",
"admin.nav.users": "Usuarios",
"admin.nav.pricing": "Precios y Stripe",
"admin.nav.providers": "Proveedores",
"admin.nav.system": "Sistema",
"admin.nav.logs": "Registros",
"admin.users.title": "Gestión de Usuarios",
"admin.users.subtitle": "Ver y gestionar cuentas de usuario",
"admin.users.planUpdated": "Plan actualizado",
"admin.users.planChanged": "El plan se ha cambiado a \\\"{plan}\\\" correctamente.",
"admin.users.unknownError": "Error desconocido",
"admin.users.error": "Error",
"admin.users.planUpdateError": "No se pudo actualizar el plan: {message}",
"admin.users.noKeys": "Sin claves",
"admin.users.noKeysDesc": "Este usuario no tiene claves API activas.",
"admin.users.keysRevoked": "Claves revocadas",
"admin.users.keysRevokedDesc": "{count} clave(s) API revocada(s) correctamente.",
"admin.users.revokeError": "No se pudieron revocar las claves: {message}",
"admin.users.retry": "Reintentar",
"admin.system.title": "Sistema",
"admin.system.subtitle": "Supervisar el estado del sistema y gestionar recursos",
"admin.system.quotas": "Cuotas de traducción",
"admin.system.resetQuotas": "Restablecer cuotas mensuales",
"admin.system.resetting": "Restableciendo...",
"admin.system.reset": "Restablecer",
"admin.system.allOperational": "Todos los sistemas operativos",
"admin.system.issuesDetected": "Problemas detectados en el sistema",
"admin.system.waitingData": "Esperando datos...",
"admin.system.purging": "Purgando...",
"admin.system.clean": "Limpiar",
"admin.system.purge": "Purgar"
}

View File

@@ -0,0 +1,72 @@
{
"apiKeys.webhook.title": "Intégration Webhook",
"apiKeys.webhook.descriptionBefore": "Passez un paramètre ",
"apiKeys.webhook.descriptionAfter": " pour recevoir une requête POST lorsque votre traduction est terminée.",
"apiKeys.webhook.codeParam": "webhook_url",
"apiKeys.title": "Claves API",
"apiKeys.subtitle": "Gestiona tus claves API para el acceso programático a la API de traducción.",
"apiKeys.loading": "Cargando...",
"apiKeys.sectionTitle": "API y automatización",
"apiKeys.sectionDesc": "Genera y gestiona tus claves API para flujos de automatización",
"apiKeys.keysUsed": "{total} de {max} claves usadas",
"apiKeys.maxReached": "Máximo de claves alcanzado. Revoca una clave para generar una nueva.",
"apiKeys.canGenerate": "Puedes generar {count} clave más",
"apiKeys.canGeneratePlural": "Puedes generar {count} claves más",
"apiKeys.generateNew": "Generar nueva clave",
"apiKeys.keyRevoked": "Clave revocada",
"apiKeys.keyRevokedDesc": "La clave API ha sido revocada correctamente.",
"apiKeys.keyNotFound": "Clave no encontrada",
"apiKeys.keyNotFoundDesc": "La clave API ya no existe. Puede que ya haya sido revocada.",
"apiKeys.error": "Error",
"apiKeys.revokeError": "Error al revocar la clave API. Inténtalo de nuevo.",
"apiKeys.limitReached": "Límite alcanzado",
"apiKeys.limitReachedDesc": "Has alcanzado el máximo de 10 claves API. Revoca una clave existente para generar una nueva.",
"apiKeys.proRequired": "Función Pro requerida",
"apiKeys.proRequiredDesc": "Las claves API son una función Pro. Mejora tu cuenta.",
"apiKeys.generateError": "Error al generar la clave API. Inténtalo de nuevo.",
"apiKeys.upgrade.title": "Claves API",
"apiKeys.upgrade.subtitle": "Automatiza tus traducciones con acceso API",
"apiKeys.upgrade.feat1": "Genera claves API ilimitadas",
"apiKeys.upgrade.feat2": "Automatiza la traducción de documentos",
"apiKeys.upgrade.feat3": "Notificaciones por webhook",
"apiKeys.upgrade.feat4": "Modos de traducción LLM",
"apiKeys.upgrade.proFeature": "Las claves API son una función {pro}. Mejora para desbloquear la automatización API.",
"apiKeys.upgrade.pro": "Pro",
"apiKeys.upgrade.cta": "Mejorar a Pro",
"apiKeys.dialog.maxTitle": "Máximo de claves alcanzado",
"apiKeys.dialog.maxDesc": "Has alcanzado el máximo de 10 claves API. Revoca una clave existente antes de generar una nueva.",
"apiKeys.dialog.close": "Cerrar",
"apiKeys.dialog.generated": "¡Clave API generada!",
"apiKeys.dialog.generatedDesc": "Tu nueva clave API ha sido creada. Cópiala ahora, no se volverá a mostrar.",
"apiKeys.dialog.important": "Importante:",
"apiKeys.dialog.importantDesc": "Esta es la única vez que verás esta clave. Guárdala de forma segura.",
"apiKeys.dialog.apiKey": "Clave API",
"apiKeys.dialog.name": "Nombre:",
"apiKeys.dialog.done": "Listo",
"apiKeys.dialog.copied": "Ya he copiado la clave",
"apiKeys.dialog.generateTitle": "Generar nueva clave API",
"apiKeys.dialog.generateDesc": "Crea una nueva clave API para el acceso programático a la API de traducción.",
"apiKeys.dialog.keyName": "Nombre de la clave (opcional)",
"apiKeys.dialog.keyNamePlaceholder": "p.ej., Producción, Staging",
"apiKeys.dialog.keyNameHint": "Un nombre descriptivo para identificar esta clave más tarde.",
"apiKeys.dialog.nameTooLong": "El nombre debe tener {max} caracteres o menos",
"apiKeys.dialog.nameInvalid": "El nombre solo puede contener letras, números, espacios, guiones y guiones bajos",
"apiKeys.dialog.cancel": "Cancelar",
"apiKeys.dialog.generating": "Generando...",
"apiKeys.dialog.generate": "Generar clave",
"apiKeys.table.name": "Nombre",
"apiKeys.table.prefix": "Prefijo",
"apiKeys.table.created": "Creada",
"apiKeys.table.lastUsed": "Último uso",
"apiKeys.table.never": "Nunca",
"apiKeys.table.actions": "Acciones",
"apiKeys.table.revoke": "Revocar",
"apiKeys.table.copyPrefix": "Copiar prefijo de la clave",
"apiKeys.table.revokeKey": "Revocar clave",
"apiKeys.revokeDialog.title": "Revocar clave API",
"apiKeys.revokeDialog.desc": "¿Estás seguro de que quieres revocar la clave \\\"{name}\\\"? Esta acción no se puede deshacer.",
"apiKeys.revokeDialog.confirm": "Sí, revocar",
"apiKeys.revokeDialog.cancel": "Cancelar",
"apiKeys.noKeysGenerated": "No hay claves generadas",
"apiKeys.copied": "¡Copiado!"
}

View File

@@ -0,0 +1,3 @@
{
"auth.brandName": "Wordly"
}

View File

@@ -0,0 +1,12 @@
{
"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."
}

View File

@@ -0,0 +1,4 @@
{
"common.loading": "Cargando...",
"common.backToHome": "Volver al inicio"
}

View File

@@ -0,0 +1,25 @@
{
"context.proTitle": "Función Pro",
"context.proDesc": "El contexto y los glosarios profesionales están disponibles con los planes Pro, Business y Enterprise. Proporcionan traducciones más precisas mediante instrucciones y vocabulario específico de tu dominio.",
"context.viewPlans": "Ver planes",
"context.title": "Contexto y glosario",
"context.subtitle": "Mejora la calidad de traducción con instrucciones y vocabulario específico de tu dominio.",
"context.presets.title": "Glosarios profesionales",
"context.presets.desc": "Carga un glosario completo con instrucciones y terminología especializada",
"context.instructions.title": "Instrucciones de contexto",
"context.instructions.desc": "Instrucciones que la IA seguirá durante la traducción",
"context.instructions.placeholder": "P.ej.: Traduces documentos técnicos de climatización. Usa terminología de ingeniería precisa...",
"context.glossary.title": "Glosario técnico",
"context.glossary.desc": "Formato: origen=destino (uno por línea). Los glosarios cargados mediante preset son editables.",
"context.glossary.terms": "términos en el glosario",
"context.clearAll": "Borrar todo",
"context.saving": "Guardando...",
"context.save": "Guardar",
"context.presets.createGlossary": "Crear glosario",
"context.presets.created": "Glosario creado",
"context.presets.createdDesc": "El glosario \\\"{name}\\\" ha sido creado con {count} términos.",
"context.presets.hint": "Haz clic en un preset para crear un glosario con términos específicos del dominio. Gestiona tus glosarios en la sección de Glosarios.",
"context.glossary.manage": "Gestionar glosarios",
"context.saved": "Guardado",
"context.savedDesc": "Tus instrucciones de contexto se han guardado."
}

View File

@@ -0,0 +1,7 @@
{
"cookieConsent.title": "Cookies en Wordly",
"cookieConsent.description": "Usamos cookies esenciales para que la aplicación funcione (sesión, seguridad, idioma). Con su permiso, también usamos cookies opcionales para medir el tráfico y mejorar el producto.",
"cookieConsent.acceptAll": "Aceptar todas",
"cookieConsent.essentialOnly": "Solo esenciales",
"cookieConsent.learnMore": "Más información"
}

View File

@@ -0,0 +1,111 @@
{
"dashboard.nav.translate": "Traducir",
"dashboard.nav.profile": "Mi perfil",
"dashboard.nav.settings": "Configuración",
"dashboard.nav.context": "Contexto",
"dashboard.nav.services": "Servicios",
"dashboard.nav.apiKeys": "Claves API",
"dashboard.nav.glossaries": "Glosarios",
"dashboard.header.title": "Panel de control",
"dashboard.header.subtitle": "Gestiona tus traducciones",
"dashboard.header.toggleMenu": "Menú",
"dashboard.header.profileTitle": "Mi perfil",
"dashboard.sidebar.theme": "Tema",
"dashboard.sidebar.signOut": "Cerrar sesión",
"dashboard.sidebar.backHome": "Volver al inicio",
"dashboard.sidebar.upgradeToPro": "Pasar a Pro →",
"dashboard.translate.pageTitle": "Traducir un documento",
"dashboard.translate.pageSubtitle": "Importa un archivo y elige el idioma de destino",
"dashboard.translate.errorNotificationTitle": "Error",
"dashboard.translate.dropzone.uploadAria": "Zona para soltar archivos",
"dashboard.translate.dropzone.title": "Arrastra y suelta tu archivo aquí",
"dashboard.translate.dropzone.subtitle": "o haz clic para seleccionar (DOCX, XLSX, PPTX, PDF)",
"dashboard.translate.dropzone.replaceFile": "Reemplazar archivo",
"dashboard.translate.language.source": "Idioma de origen",
"dashboard.translate.language.target": "Idioma de destino",
"dashboard.translate.language.loading": "Cargando idiomas…",
"dashboard.translate.language.autoDetect": "Detección automática",
"dashboard.translate.language.selectPlaceholder": "Seleccionar…",
"dashboard.translate.language.loadErrorPrefix": "Error al cargar los idiomas",
"dashboard.translate.provider.loading": "Cargando proveedores…",
"dashboard.translate.provider.noneConfigured": "No hay proveedores configurados",
"dashboard.translate.provider.modelTitle": "Modelo",
"dashboard.translate.provider.sectionTitle": "Proveedor",
"dashboard.translate.provider.llmDivider": "IA · Contextual",
"dashboard.translate.provider.llmDividerPro": "IA · Contextual (Pro)",
"dashboard.translate.provider.upgrade": "Mejorar a Pro",
"dashboard.translate.provider.upgradeSuffix": "para desbloquear la traducción IA",
"dashboard.translate.trust.zeroRetention": "Sin retención",
"dashboard.translate.trust.deletedAfter": "Archivos eliminados tras el procesamiento",
"dashboard.translate.actions.uploading": "Subiendo…",
"dashboard.translate.actions.translate": "Traducir",
"dashboard.translate.actions.filePrefix": "Archivo: ",
"dashboard.translate.actions.cancel": "Cancelar",
"dashboard.translate.actions.tryAgain": "Reintentar",
"dashboard.translate.steps.uploading": "Subiendo archivo…",
"dashboard.translate.steps.starting": "Iniciando traducción…",
"dashboard.translate.complete.title": "¡Traducción completada!",
"dashboard.translate.complete.descNamed": "Tu archivo {name} se ha traducido correctamente.",
"dashboard.translate.complete.descGeneric": "Tu archivo se ha traducido correctamente.",
"dashboard.translate.complete.downloading": "Descargando…",
"dashboard.translate.complete.download": "Descargar",
"dashboard.translate.complete.newTranslation": "Nueva traducción",
"dashboard.translate.complete.toastOkTitle": "Éxito",
"dashboard.translate.complete.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",
"dashboard.translate.configuration": "Configuración",
"dashboard.translate.translating": "Traducción en progreso",
"dashboard.translate.liveMonitor": "Monitor en vivo",
"dashboard.translate.summary": "Resumen",
"dashboard.translate.engine": "Motor",
"dashboard.translate.confidence": "Confianza",
"dashboard.translate.cancel": "Cancelar",
"dashboard.translate.segments": "Segmentos",
"dashboard.translate.characters": "Caracteres",
"dashboard.translate.elapsed": "Transcurrido",
"dashboard.translate.segPerMin": "Seg/min",
"dashboard.translate.highQuality": "Alta calidad",
"dashboard.translate.quality": "Calidad",
"dashboard.translate.completed": "Traducción completada",
"dashboard.translate.replace": "Reemplazar",
"dashboard.translate.pdfMode.title": "Modo de traducción PDF",
"dashboard.translate.pdfMode.preserveLayout": "Conservar diseño",
"dashboard.translate.pdfMode.textOnly": "Solo texto",
"dashboard.translate.pdfMode.preserveLayoutDesc": "Mantiene imágenes, tablas y formato. Ideal para PDFs simples.",
"dashboard.translate.pdfMode.textOnlyDesc": "Traduce todo el texto perfectamente. Salida limpia, sin problemas de diseño.",
"dashboard.translate.pipeline.upload": "Subir",
"dashboard.translate.pipeline.analyze": "Analizar",
"dashboard.translate.pipeline.translate": "Traducción",
"dashboard.translate.pipeline.rebuild": "Reconstruir",
"dashboard.translate.pipeline.finalize": "Finalizar",
"dashboard.translate.progress.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.",
"dashboard.translate.error.apiKey": "Clave API no válida o faltante. Contacte al administrador para configurar las claves.",
"dashboard.translate.error.quota": "Límite de uso alcanzado. Intente de nuevo en unos minutos o elija otro motor.",
"dashboard.translate.error.timeout": "La conexión al servicio de traducción expiró. Verifique su red e intente de nuevo.",
"dashboard.translate.error.sessionExpired": "Sesión expirada. Haga clic en Reintentar para reiniciar la traducción.",
"dashboard.translate.error.empty": "El documento parece vacío o no contiene texto traducible (¿PDF escaneado?).",
"dashboard.translate.error.unsupported": "Formato de archivo no compatible o archivo dañado.",
"dashboard.translate.error.connection": "Conexión perdida. Verifique su red e intente de nuevo.",
"dashboard.translate.error.generic": "Traducción fallida: {detail}",
"dashboard.translate.error.title": "Traducción fallida",
"dashboard.translate.retry": "Reintentar traducción",
"dashboard.translate.newFile": "Nuevo archivo",
"dashboard.translate.modeAI": "Modo IA",
"dashboard.translate.modeClassic": "Modo Clásico",
"dashboard.translate.glossaryLLMHint": "Glosarios disponibles en modo IA",
"dashboard.translate.submitting": "Enviando...",
"dashboard.translate.submit": "Iniciar traducción",
"dashboard.translate.noFile": "Suba un archivo primero",
"dashboard.translate.noTargetLang": "Seleccione un idioma de destino",
"dashboard.topbar.interfaceLabel": "Interfaz de traducción",
"dashboard.topbar.premiumAccess": "Acceso Premium",
"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"
}

View File

@@ -0,0 +1,31 @@
{
"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…"
}

View File

@@ -0,0 +1,14 @@
{
"forgotPassword.enterEmail": "Please enter your email address",
"forgotPassword.error": "An error occurred",
"forgotPassword.title": "Forgot Password",
"forgotPassword.checkEmail": "Check your inbox",
"forgotPassword.subtitle": "Enter your email to receive a reset link",
"forgotPassword.sentMessage": "If an account exists with this address, a reset email has been sent.",
"forgotPassword.emailLabel": "Email address",
"forgotPassword.emailPlaceholder": "you@example.com",
"forgotPassword.sending": "Sending...",
"forgotPassword.sendLink": "Send reset link",
"forgotPassword.backToLogin": "Back to login",
"forgotPassword.loading": "Loading..."
}

View File

@@ -0,0 +1,189 @@
{
"glossaries.yourGlossaries": "Tus glosarios",
"glossaries.title": "Glosarios y Contexto",
"glossaries.description": "Gestiona tus glosarios e instrucciones de contexto para traducciones más precisas.",
"glossaries.createNew": "Crear nuevo",
"glossaries.empty": "Sin glosarios",
"glossaries.emptyDesc": "Crea tu primer glosario o carga un preset profesional arriba",
"glossaries.defineTerms": "términos",
"glossaries.aboutTitle": "Sobre los glosarios",
"glossaries.aboutDesc": "Los glosarios te permiten definir traducciones exactas para términos específicos. Al traducir, los términos del glosario garantizan traducciones consistentes y precisas.",
"glossaries.aboutFormat": "Cada término tiene una palabra fuente y traducciones en varios idiomas. Selecciona un glosario en la página de traducción para aplicarlo.",
"glossaries.toast.created": "Glosario creado",
"glossaries.toast.createdDesc": "El glosario \\\"{name}\\\" ha sido creado.",
"glossaries.toast.imported": "Glosario importado",
"glossaries.toast.importedDesc": "El glosario \\\"{name}\\\" ha sido importado.",
"glossaries.toast.updated": "Glosario actualizado",
"glossaries.toast.updatedDesc": "El glosario \\\"{name}\\\" ha sido actualizado.",
"glossaries.toast.deleted": "Glosario eliminado",
"glossaries.toast.deletedDesc": "El glosario ha sido eliminado.",
"glossaries.toast.error": "Error",
"glossaries.toast.errorCreate": "Error al crear el glosario",
"glossaries.toast.errorImport": "Error al importar el glosario",
"glossaries.toast.errorUpdate": "Error al actualizar el glosario",
"glossaries.toast.errorDelete": "Error al eliminar el glosario",
"glossaries.dialog.title": "Nuevo glosario",
"glossaries.dialog.description": "Crea un glosario para tus traducciones",
"glossaries.dialog.nameLabel": "Nombre",
"glossaries.dialog.namePlaceholder": "Mi glosario",
"glossaries.dialog.tabTemplates": "Plantillas",
"glossaries.dialog.tabFile": "Archivo",
"glossaries.dialog.tabManual": "Manual",
"glossaries.dialog.cancel": "Cancelar",
"glossaries.dialog.creating": "Creando…",
"glossaries.dialog.importing": "Importando…",
"glossaries.dialog.importBtn": "Importar",
"glossaries.dialog.selectPrompt": "Seleccionar",
"glossaries.dialog.createBtn": "Crear",
"glossaries.dialog.createEmpty": "Crear vacío",
"glossaries.dialog.terms": "términos",
"glossaries.dialog.templatesDesc": "Elige una plantilla predefinida",
"glossaries.dialog.templatesEmpty": "No hay plantillas disponibles",
"glossaries.dialog.dropTitle": "Arrastra un archivo CSV aquí",
"glossaries.dialog.dropOr": "o",
"glossaries.dialog.dropFormats": "CSV, TSV, TXT",
"glossaries.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",
"glossaries.dialog.errorFormat": "Formato no compatible",
"glossaries.dialog.errorSize": "Archivo demasiado grande",
"glossaries.dialog.errorEmpty": "Archivo vacío",
"glossaries.dialog.errorRead": "Error de lectura",
"glossaries.dialog.parsing": "Analizando…",
"glossaries.dialog.termsImported": "términos importados",
"glossaries.dialog.changeFile": "Cambiar archivo",
"glossaries.dialog.retry": "Reintentar",
"glossaries.edit.title": "Modifier le glossaire",
"glossaries.edit.description": "Modifiez le nom, la paire de langues et les termes du glossaire.",
"glossaries.edit.nameLabel": "Nom du glossaire",
"glossaries.edit.namePlaceholder": "Entrez le nom du glossaire...",
"glossaries.edit.sourceLang": "Langue source",
"glossaries.edit.targetLang": "Langue cible",
"glossaries.edit.termsLabel": "Termes ({count} valides)",
"glossaries.edit.exportCsv": "Exporter CSV",
"glossaries.edit.importCsv": "Importer CSV",
"glossaries.edit.cancel": "Annuler",
"glossaries.edit.saving": "Enregistrement...",
"glossaries.edit.saveChanges": "Enregistrer les modifications",
"glossaries.edit.importFailedTitle": "Échec de l'importation",
"glossaries.edit.importFailedMaxDesc": "Le CSV contient {count} termes, le maximum est de {max}. Veuillez réduire le nombre de termes.",
"glossaries.edit.importSuccessTitle": "Importation réussie",
"glossaries.edit.importSuccessDesc": "{count} termes importés avec succès.",
"glossaries.edit.importFailedEmptyDesc": "Aucun terme valide trouvé dans le fichier CSV.",
"glossaries.edit.importFailedReadDesc": "Impossible de lire le fichier CSV.",
"glossaries.delete.title": "Supprimer le glossaire",
"glossaries.delete.description": "Êtes-vous sûr de vouloir supprimer ce glossaire ?",
"glossaries.delete.warning": "Cette action est irréversible",
"glossaries.delete.warningDesc": "Toutes les paires de termes seront définitivement supprimées.",
"glossaries.delete.cancel": "Annuler",
"glossaries.delete.deleting": "Suppression...",
"glossaries.delete.deleteBtn": "Supprimer",
"glossaries.upgrade.title": "Glossaires",
"glossaries.upgrade.description": "Personnalisez vos traductions avec une terminologie personnalisée",
"glossaries.upgrade.feature1": "Créez plusieurs glossaires",
"glossaries.upgrade.feature2": "Définissez des paires de termes source→cible",
"glossaries.upgrade.feature3": "Importez/exportez via CSV",
"glossaries.upgrade.feature4": "Appliquez aux traductions LLM",
"glossaries.upgrade.proFeatureBefore": "Les glossaires sont une fonctionnalité ",
"glossaries.upgrade.proFeatureAfter": ". Passez à un forfait supérieur pour débloquer la terminologie personnalisée.",
"glossaries.upgrade.proLabel": "Pro",
"glossaries.upgrade.upgradeBtn": "Passer à Pro",
"glossaries.loading": "Chargement...",
"glossaries.howItWorks.title": "Comment ces paramètres sont utilisés",
"glossaries.howItWorks.step1Title": "Configurez ici",
"glossaries.howItWorks.step1Desc": "Rédigez vos instructions de contexte ou créez/importez un glossaire de termes.",
"glossaries.howItWorks.step2Title": "Activez dans Traduire",
"glossaries.howItWorks.step2Desc": "Sur la page de traduction, dans la colonne de droite, sélectionnez votre glossaire.",
"glossaries.howItWorks.warning": "Les instructions de contexte s'appliquent automatiquement à toutes vos traductions IA une fois enregistrées. Les glossaires doivent être sélectionnés manuellement sur la page Traduire.",
"glossaries.howItWorks.goToTranslate": "Aller à Traduire",
"glossaries.status.unsaved": "Non enregistré",
"glossaries.status.active": "Actif · s'applique à toutes les traductions IA",
"glossaries.status.inactive": "Inactif",
"glossaries.instructions.whatForBold": "À quoi ça sert ?",
"glossaries.instructions.whatForDesc": "Ces instructions sont envoyées automatiquement à l'IA avant chaque traduction, sans que vous ayez besoin de faire quoi que ce soit sur la page Traduire. Utilisez-les pour guider le style, le registre ou la terminologie générale.",
"glossaries.instructions.example": "Exemple : « Vous traduisez des rapports financiers. Soyez formel, précis et conservez tous les chiffres. »",
"glossaries.instructions.charCount": "{count} caractères",
"glossaries.instructions.emptyHint": "Vide — aucune instruction envoyée à l'IA",
"glossaries.instructions.clearAll": "Tout effacer",
"glossaries.instructions.saving": "Enregistrement…",
"glossaries.instructions.saved": "Enregistré",
"glossaries.presets.whatForBold": "À quoi ça sert ?",
"glossaries.presets.whatForDesc": "Cliquer sur une carte crée un glossaire pré-rempli avec les termes spécialisés du domaine. Ce glossaire apparaîtra dans vos glossaires ci-dessous, et vous pourrez le sélectionner manuellement sur la page Traduire pour forcer des traductions de termes précis.",
"glossaries.presets.clickHint": "Cliquez sur une carte → glossaire créé → sélectionnez-le dans Traduire",
"glossaries.presets.creating": "Création…",
"glossaries.presets.alreadyImported": "Déjà importé",
"glossaries.presets.it.title": "IT / Logiciel",
"glossaries.presets.it.desc": "Développement, infrastructure, DevOps",
"glossaries.presets.legal.title": "Juridique / Contrats",
"glossaries.presets.legal.desc": "Droit des affaires, contentieux",
"glossaries.presets.medical.title": "Médical / Santé",
"glossaries.presets.medical.desc": "Pharmacologie, chirurgie, diagnostic",
"glossaries.presets.finance.title": "Finance / Comptabilité",
"glossaries.presets.finance.desc": "IFRS, bilans, fiscalité",
"glossaries.presets.marketing.title": "Marketing / Publicité",
"glossaries.presets.marketing.desc": "Digital, branding, analytics",
"glossaries.presets.hr.title": "RH / Ressources Humaines",
"glossaries.presets.hr.desc": "Contrats, politiques, recrutement",
"glossaries.presets.scientific.title": "Scientifique / Recherche",
"glossaries.presets.scientific.desc": "Publications, thèses, articles",
"glossaries.presets.ecommerce.title": "E-commerce / Vente",
"glossaries.presets.ecommerce.desc": "Boutiques en ligne, catalogues, CRM",
"glossaries.grid.title": "Vos",
"glossaries.grid.titleHighlight": "glossaires",
"glossaries.grid.countWithAction": "{count} glossaire({plural}) — cliquez sur une carte pour la modifier",
"glossaries.grid.emptyAction": "Créez votre premier glossaire ou importez un preset ci-dessus",
"glossaries.grid.activeTranslation": "Traduction active :",
"glossaries.grid.goToTranslate": "Aller à Traduire pour activer",
"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.",
"glossaries.detail.backToList": "Back to glossaries",
"glossaries.detail.save": "Save",
"glossaries.detail.savedTitle": "Saved",
"glossaries.detail.savedDesc": "The glossary has been updated.",
"glossaries.detail.settingsTitle": "Settings",
"glossaries.detail.sourceLang": "Source language",
"glossaries.detail.targetLang": "Target language",
"glossaries.detail.termsTitle": "Terms",
"glossaries.detail.terms": "terms",
"glossaries.detail.searchTerms": "Filter…",
"glossaries.detail.noTerms": "No terms yet.",
"glossaries.detail.addFirstTerm": "Add the first term",
"glossaries.detail.addTerm": "Add a term",
"glossaries.detail.maxReached": "Maximum limit reached",
"glossaries.detail.source": "Source",
"glossaries.detail.target": "Target",
"glossaries.detail.sourcePlaceholder": "source term",
"glossaries.detail.targetPlaceholder": "target term",
"glossaries.detail.csvTitle": "CSV",
"glossaries.detail.csvDesc": "Export your terms as CSV or import new ones (replaces the current list).",
"glossaries.detail.export": "Export",
"glossaries.detail.import": "Import",
"glossaries.detail.dangerTitle": "Danger zone",
"glossaries.detail.dangerDesc": "Deletion is permanent. All associated terms will be lost.",
"glossaries.detail.deleteGlossary": "Delete this glossary",
"glossaries.detail.confirmDelete": "Confirm deletion?",
"glossaries.detail.confirm": "Confirm",
"glossaries.detail.cancel": "Cancel",
"glossaries.detail.sourceLangNote": "'The original source is in French. For other languages, we read the term's translations field (if available).'",
"glossaries.detail.sourceLocked": "fixed",
"glossaries.detail.sourceLockedNote": "Templates only store the source in French. Multilingual source is on the roadmap.",
"glossaries.detail.targetLangNote": "Pick a language to see the matching translations, or « Multilingual » for the default value.",
"glossaries.detail.notFoundTitle": "Glossary not found",
"glossaries.detail.notFoundDesc": "This glossary does not exist or you don't have access to it.",
"glossaries.detail.maxTermsTitle": "Limit reached",
"glossaries.detail.maxTermsDesc": "Maximum {max} terms per glossary.",
"glossaries.detail.importEmptyTitle": "Empty file",
"glossaries.detail.importEmptyDesc": "No terms detected in this file.",
"glossaries.detail.importedTitle": "Imported",
"glossaries.detail.importedDesc": "{count} terms imported.",
"glossaries.detail.importErrorTitle": "Read error",
"glossaries.detail.importErrorDesc": "Unable to read the file."
}

View File

@@ -0,0 +1,60 @@
// Auto-generated by scripts/generate_i18n_index.py
// Merges all namespace JSON files for locale "es".
import admin from "./admin.json";
import apiKeys from "./apiKeys.json";
import auth from "./auth.json";
import checkout from "./checkout.json";
import common from "./common.json";
import context from "./context.json";
import cookieConsent from "./cookieConsent.json";
import dashboard from "./dashboard.json";
import fileUploader from "./fileUploader.json";
import forgotPassword from "./forgotPassword.json";
import glossaries from "./glossaries.json";
import landing from "./landing.json";
import langSelector from "./langSelector.json";
import layout from "./layout.json";
import login from "./login.json";
import memento from "./memento.json";
import pricing from "./pricing.json";
import profile from "./profile.json";
import providerSelector from "./providerSelector.json";
import providerTheme from "./providerTheme.json";
import register from "./register.json";
import resetPassword from "./resetPassword.json";
import services from "./services.json";
import settings from "./settings.json";
import translate from "./translate.json";
import translateComplete from "./translateComplete.json";
const messages: Record<string, string> = {
...admin,
...apiKeys,
...auth,
...checkout,
...common,
...context,
...cookieConsent,
...dashboard,
...fileUploader,
...forgotPassword,
...glossaries,
...landing,
...langSelector,
...layout,
...login,
...memento,
...pricing,
...profile,
...providerSelector,
...providerTheme,
...register,
...resetPassword,
...services,
...settings,
...translate,
...translateComplete,
};
export default messages;

View File

@@ -0,0 +1,146 @@
{
"landing.nav.why": "¿Por qué nosotros?",
"landing.nav.formats": "Formatos",
"landing.nav.pricing": "Precios",
"landing.nav.login": "Iniciar sesión",
"landing.nav.startFree": "Prueba gratis",
"landing.hero.tag": "IA Documental Profesional",
"landing.hero.titleLine1": "Traduce tus documentos.",
"landing.hero.titleLine2": "Con formato perfecto.",
"landing.hero.description": "El único traductor que preserva SmartArt, gráficos, índices, formas y diseños complejos — exactamente como eran.",
"landing.hero.ctaMain": "Prueba gratis — 2 docs/mes",
"landing.hero.ctaSec": "Ver ofertas",
"landing.hero.deleted": "Archivos eliminados tras 60 min",
"landing.hero.noHidden": "Sin cargos ocultos",
"landing.hero.preview": "Vista previa antes de pagar",
"landing.hero.formattedOk": "Formato OK",
"landing.hero.aiActive": "Traducción IA activa",
"landing.steps.title": "¿Cómo funciona?",
"landing.steps.subtitle": "Tres pasos. Cero pérdida de formato.",
"landing.steps.step1.num": "01",
"landing.steps.step1.title": "Sube tu archivo",
"landing.steps.step1.desc": "Arrastra y suelta tu documento Excel, Word, PowerPoint o PDF.",
"landing.steps.step2.num": "02",
"landing.steps.step2.title": "Elige idioma y motor",
"landing.steps.step2.desc": "Selecciona el idioma destino y el motor — clásico o IA contextual.",
"landing.steps.step3.num": "03",
"landing.steps.step3.title": "Descarga el resultado",
"landing.steps.step3.desc": "Obtén tu documento traducido con un formato idéntico al original.",
"landing.features.tag": "Motor de Traducción IA",
"landing.features.title": "Una traducción que entiende tu oficio",
"landing.features.description": "Nuestros modelos de IA analizan el contexto, respetan tu terminología y hasta traducen el texto dentro de las imágenes.",
"landing.features.context.title": "Contexto sectorial",
"landing.features.context.desc": "Describe tu sector y obtén traducciones adaptadas, no genéricas.",
"landing.features.glossary.title": "Glosarios sectoriales",
"landing.features.glossary.desc": "Define tus términos técnicos. CTA será «Unidad de Tratamiento de Aire», nunca «Llamada a la Acción».",
"landing.features.vision.title": "Visión de imágenes",
"landing.features.vision.desc": "El texto incrustado en imágenes, diagramas y gráficos se detecta y traduce.",
"landing.features.demo.source": "Origen (FR)",
"landing.features.demo.google": "Google Translate",
"landing.features.demo.ours": "Nuestra IA",
"landing.layout.title": "Tu formato,",
"landing.layout.title2": "perfectamente conservado",
"landing.layout.subtitle": "Otros traductores rompen tu diseño. Nosotros no.",
"landing.layout.p1.title": "SmartArt y diagramas",
"landing.layout.p1.desc": "Organigramas, flujos, jerarquías — todo traducido idénticamente.",
"landing.layout.p2.title": "Índices de contenido",
"landing.layout.p2.desc": "Entradas del índice, números de página y referencias cruzadas actualizados correctamente.",
"landing.layout.p3.title": "Gráficos y diagramas",
"landing.layout.p3.desc": "Títulos, etiquetas de ejes, leyendas y nombres de series — todo traducido.",
"landing.layout.p4.title": "Formas y cuadros de texto",
"landing.layout.p4.desc": "Rectángulos, bloques redondeados, llamadas — localizados en todas partes.",
"landing.layout.p5.title": "Encabezados y pies de página",
"landing.layout.p5.desc": "Encabezados, pies de página y notas al pie nunca se pasan por alto.",
"landing.layout.p6.title": "130+ idiomas",
"landing.layout.p6.desc": "Google Translate, DeepL y motores de IA de grado profesional.",
"landing.formats.title": "Cada formato,",
"landing.formats.title2": "cada elemento",
"landing.formats.subtitle": "Traducimos lo que otros olvidan. Tu empresa merece una documentación impecable.",
"landing.formats.word.name": "Word",
"landing.formats.word.i1": "Párrafos y encabezados",
"landing.formats.word.i2": "Tablas y gráficos",
"landing.formats.word.i3": "Diagramas SmartArt",
"landing.formats.word.i4": "Índice de contenido",
"landing.formats.word.i5": "Encabezados y pies",
"landing.formats.word.i6": "Formas y cuadros de texto",
"landing.formats.word.i7": "Notas al pie y al final",
"landing.formats.excel.name": "Excel",
"landing.formats.excel.i1": "Valores de celdas",
"landing.formats.excel.i2": "Nombres de hojas",
"landing.formats.excel.i3": "Gráficos y etiquetas",
"landing.formats.excel.i4": "Encabezados y pies",
"landing.formats.excel.i5": "Celdas combinadas conservadas",
"landing.formats.pptx.name": "PowerPoint",
"landing.formats.pptx.i1": "Texto de diapositivas y notas",
"landing.formats.pptx.i2": "Gráficos y diagramas",
"landing.formats.pptx.i3": "Formas y cuadros de texto",
"landing.formats.pptx.i4": "Diseños maestros",
"landing.formats.pptx.i5": "Animaciones conservadas",
"landing.formats.pdf.name": "PDF",
"landing.formats.pdf.i1": "PDF basados en texto",
"landing.formats.pdf.i2": "Diseño conservado",
"landing.formats.pdf.i3": "Imágenes en su lugar",
"landing.formats.pdf.i4": "Tablas mantenidas",
"landing.formats.pdf.i5": "Salida como DOCX o PDF",
"landing.pricing.title": "Precios simples y honestos",
"landing.pricing.subtitle": "Lo que ves es lo que pagas. Sin cargos ocultos.",
"landing.pricing.monthly": "Mensual",
"landing.pricing.annual": "Anual",
"landing.pricing.bestValue": "Más popular",
"landing.pricing.month": "/mes",
"landing.pricing.footer": "El precio mostrado es el precio que pagas. Sin cargos ocultos después de la traducción.",
"landing.pricing.starter.name": "Starter",
"landing.pricing.starter.desc": "Para particulares y proyectos pequeños",
"landing.pricing.starter.f1": "50 documentos / mes",
"landing.pricing.starter.f2": "Hasta 50 páginas por doc",
"landing.pricing.starter.f3": "Google Translate + DeepL",
"landing.pricing.starter.f4": "Archivos de hasta 10 MB",
"landing.pricing.starter.cta": "Empezar",
"landing.pricing.pro.name": "Pro",
"landing.pricing.pro.desc": "Para profesionales exigentes",
"landing.pricing.pro.f1": "200 documentos / mes",
"landing.pricing.pro.f2": "Hasta 200 páginas por doc",
"landing.pricing.pro.f3": "Traducción con IA",
"landing.pricing.pro.f4": "Google + DeepL incluidos",
"landing.pricing.pro.f5": "Glosarios y prompts personalizados",
"landing.pricing.pro.f6": "Soporte prioritario",
"landing.pricing.pro.cta": "Probar Pro",
"landing.pricing.business.name": "Business",
"landing.pricing.business.desc": "Para equipos con grandes necesidades",
"landing.pricing.business.f1": "1 000 documentos / mes",
"landing.pricing.business.f2": "Hasta 500 páginas por doc",
"landing.pricing.business.f3": "IA Premium (Claude)",
"landing.pricing.business.f4": "Todos los proveedores + API",
"landing.pricing.business.f5": "Webhooks y automatización",
"landing.pricing.business.f6": "5 puestos de equipo",
"landing.pricing.business.cta": "Contáctenos",
"landing.cta.title": "Empieza a traducir en 30 segundos",
"landing.cta.subtitle": "No se necesita tarjeta de crédito. Prueba gratis ahora y da vida a tus documentos multilingües.",
"landing.cta.button": "Crear cuenta gratuita",
"landing.cta.secure": "Protegido con cifrado AES-256",
"landing.footer.desc": "Especialistas en traducción inteligente de documentos. Combinamos el arte del diseño con la ciencia de la IA contextual.",
"landing.footer.product": "Producto",
"landing.footer.resources": "Recursos",
"landing.footer.legal": "Legal",
"landing.footer.rights": "© 2026 Wordly.art — Todos los derechos reservados.",
"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",
"landing.steps.process": "PROCESO",
"landing.translate.newProject": "Nuevo proyecto",
"landing.translate.title": "Traducir un documento",
"landing.translate.subtitle": "Importa un archivo y elige el idioma de destino",
"landing.translate.sourceDocument": "Documento fuente",
"landing.translate.configuration": "Configuración",
"landing.translate.sourceLang": "Idioma de origen",
"landing.translate.targetLang": "Idioma de destino",
"landing.translate.provider": "Proveedor",
"landing.translate.startTranslation": "Iniciar traducción",
"landing.translate.zeroRetention": "Retención cero",
"landing.translate.filesDeleted": "Archivos eliminados tras el procesamiento",
"landing.translate.dropHere": "Arrastra y suelta aquí",
"landing.translate.supportedFormats": "Archivos DOCX, XLSX, PPTX o PDF compatibles",
"landing.translate.aiAnalysis": "Análisis IA Activo",
"landing.translate.processing": "Procesando",
"landing.translate.preservingLayout": "Tu diseño se está preservando"
}

Some files were not shown because too many files have changed in this diff Show More