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).
59 lines
3.3 KiB
JSON
59 lines
3.3 KiB
JSON
{
|
|
"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"
|
|
}
|