diff --git a/src/i18n/messages/ar.json b/src/i18n/messages/ar.json new file mode 100644 index 0000000000..a996a37708 --- /dev/null +++ b/src/i18n/messages/ar.json @@ -0,0 +1,2040 @@ +{ + "common": { + "save": "حفظ", + "cancel": "إلغاء", + "delete": "حذف", + "loading": "جار التحميل...", + "error": "حدث خطأ", + "success": "النجاح", + "confirm": "هل أنت متأكد؟", + "refresh": "تحديث", + "close": "إغلاق", + "add": "أضف", + "edit": "تحرير", + "search": "بحث", + "back": "العودة", + "next": "التالي", + "submit": "إرسال", + "reset": "إعادة تعيين", + "copy": "نسخ", + "copied": "منسوخ!", + "enabled": "ممكّن", + "disabled": "غير مفعّل", + "active": "نشط", + "inactive": "غير نشط", + "noData": "لا توجد بيانات متاحة", + "configure": "تكوين", + "manage": "إدارة", + "name": "الاسم", + "actions": "الإجراءات", + "status": "الحالة", + "type": "اكتب", + "model": "نموذج", + "models": "نماذج", + "provider": "مزود", + "account": "الحساب", + "time": "الوقت", + "details": "التفاصيل", + "created": "تم إنشاؤها", + "lastUsed": "آخر استخدام", + "loadMore": "تحميل المزيد", + "noResults": "لم يتم العثور على نتائج", + "reloadPage": "إعادة تحميل الصفحة", + "connected": "متصل", + "disconnected": "غير متصل", + "notConfigured": "لم يتم تكوينه", + "testConnection": "اتصال الاختبار", + "enable": "تمكين", + "disable": "تعطيل", + "columns": "أعمدة", + "newest": "الأحدث", + "oldest": "الأقدم", + "all": "الكل", + "none": "لا شيء", + "yes": "نعم", + "no": "لا", + "warning": "تحذير", + "note": "ملاحظة", + "free": "مجاني", + "skipToContent": "انتقل إلى المحتوى" + }, + "sidebar": { + "home": "الصفحة الرئيسية", + "dashboard": "لوحة القيادة", + "providers": "المزوّدون", + "combos": "المجموعات", + "usage": "الاستخدام", + "analytics": "التحليلات", + "costs": "التكاليف", + "health": "الصحة", + "limits": "الحدود والحصص", + "cliTools": "أدوات سطر الأوامر", + "settings": "الإعدادات", + "translator": "مترجم", + "docs": "المستندات", + "issues": "القضايا", + "endpoint": "نقطة النهاية", + "apiManager": "مدير API", + "logs": "سجلات", + "auditLog": "سجل التدقيق", + "shutdown": "إيقاف التشغيل", + "restart": "إعادة التشغيل", + "shutdownConfirm": "هل تريد إيقاف OmniRoute؟", + "restartConfirm": "هل تريد إعادة تشغيل OmniRoute؟", + "version": "v{version}", + "debug": "تصحيح", + "system": "النظام", + "help": "مساعدة", + "serverDisconnected": "تم قطع اتصال الخادم", + "serverDisconnectedMsg": "تم إيقاف الخادم الوكيل أو يتم إعادة تشغيله.", + "expandSidebar": "قم بتوسيع الشريط الجانبي", + "collapseSidebar": "طي الشريط الجانبي" + }, + "header": { + "logout": "تسجيل الخروج", + "language": "اللغة", + "providers": "المزوّدون", + "providerDescription": "إدارة اتصالات مزوّدي الذكاء الاصطناعي", + "combos": "المجموعات", + "comboDescription": "مجموعات نماذج مع التبديل الاحتياطي", + "usage": "الاستخدام والتحليلات", + "usageDescription": "مراقبة استخدام واجهة برمجة التطبيقات (API) واستهلاك الرمز المميز وسجلات الطلبات", + "analytics": "التحليلات", + "analyticsDescription": "الرسوم البيانية والاتجاهات ورؤى التقييم", + "cliTools": "أدوات سطر الأوامر", + "cliToolsDescription": "تكوين أدوات CLI", + "home": "الصفحة الرئيسية", + "homeDescription": "مرحبًا بك في OmniRoute", + "endpoint": "نقطة النهاية", + "endpointDescription": "تكوين نقطة النهاية API", + "settings": "الإعدادات", + "settingsDescription": "إدارة تفضيلاتك", + "openaiCompatible": "متوافق مع OpenAI", + "anthropicCompatible": "متوافق مع Anthropic" + }, + "home": { + "quickStart": "بداية سريعة", + "quickStartDesc": "ابدأ خلال 4 خطوات: وصّل المزوّدين، فعّل توجيه النماذج، وراقب كل شيء.", + "fullDocs": "التوثيق الكامل", + "step1Title": "1. إنشاء مفتاح API", + "step1Desc": "انتقل إلى Endpoint -> Registered Keys. أنشئ مفتاحًا واحدًا لكل بيئة.", + "step2Title": "2. ربط مقدمي الخدمات", + "step2Desc": "أضف الحسابات في Providers. يدعم OAuth وAPI Key والخطط المجانية.", + "step3Title": "3. اضبط عميلك", + "step3Desc": "عيّن عنوان Base URL إلى {url} في IDE أو عميل API لديك.", + "step4Title": "4. المراقبة والتحسين", + "step4Desc": "تتبّع الرموز والتكلفة والأخطاء في سجلات الطلبات والتحليلات.", + "providersOverview": "نظرة عامة على مقدمي الخدمة", + "configuredOf": "تم تكوين {configured} من بين {total} الموفرين المتاحين", + "noModelsAvailable": "لا توجد نماذج متاحة لهذا المزود.", + "configureFirst": "قم بتكوين الاتصال أولاً في {providers}", + "configureProvider": "تكوين الموفر", + "modelAvailable": "يتوفر طراز {count}", + "modelsAvailable": "{count} النماذج المتوفرة", + "connectionsActive": "{count} الاتصال نشط", + "connectionsActivePlural": "{count} الاتصالات نشطة", + "copyModelName": "انسخ اسم الموديل", + "documentation": "التوثيق", + "healthMonitor": "مراقب الصحة", + "reportIssue": "الإبلاغ عن مشكلة", + "activeError": "{active} نشط · {errors} خطأ", + "oauthLabel": "OAuth", + "apiKeyLabel": "مفتاح واجهة برمجة التطبيقات", + "requestsShort": "{count} طلب", + "providerModelsTitle": "{provider} - النماذج", + "copiedModel": "تم النسخ: {model}", + "aliasLabel": "الاسم المستعار" + }, + "analytics": { + "title": "التحليلات", + "overviewDescription": "راقب أنماط استخدام واجهة برمجة التطبيقات (API) واستهلاك الرمز المميز والتكاليف واتجاهات النشاط عبر جميع مقدمي الخدمات والنماذج.", + "evalsDescription": "قم بتشغيل مجموعات التقييم لاختبار نقاط نهاية LLM الخاصة بك والتحقق من صحتها. مقارنة جودة النموذج، واكتشاف الانحدارات، وقياس وقت الاستجابة.", + "overview": "نظرة عامة", + "evals": "التقييمات" + }, + "apiManager": { + "title": "مفاتيح واجهة برمجة التطبيقات", + "createKey": "إنشاء مفتاح API", + "key": "مفتاح", + "revokeKey": "إبطال المفتاح", + "revokeConfirm": "هل أنت متأكد أنك تريد إلغاء مفتاح API هذا؟", + "noKeys": "لا توجد مفاتيح API حتى الآن", + "noKeysDesc": "قم بإنشاء مفتاح API الأول الخاص بك لمصادقة الطلبات إلى نقطة النهاية الخاصة بك", + "keyLabel": "تسمية المفتاح", + "permissions": "الأذونات", + "expiresAt": "تنتهي", + "never": "أبدا", + "revoke": "إبطال", + "showKey": "إظهار المفتاح", + "hideKey": "إخفاء المفتاح", + "copyKey": "انسخ مفتاح واجهة برمجة التطبيقات", + "allModels": "جميع الموديلات", + "selectedModels": "نماذج مختارة", + "readOnly": "قراءة فقط", + "fullAccess": "الوصول الكامل", + "keyManagement": "إدارة مفاتيح API", + "keyManagementDesc": "قم بإنشاء وإدارة مفاتيح API لمصادقة الطلبات إلى نقطة النهاية الخاصة بك", + "totalKeys": "مجموع المفاتيح", + "restricted": "مقيد", + "totalRequests": "إجمالي الطلبات", + "modelsAvailable": "النماذج المتاحة", + "registeredKeys": "المفاتيح المسجلة", + "keysRegistered": "{count} مفاتيح مسجلة", + "keyRegistered": "تم تسجيل المفتاح {count}", + "keysSecurityNote": "يعزل كل مفتاح تتبع الاستخدام ويمكن إبطاله بشكل مستقل. يتم إخفاء المفاتيح بعد إنشائها لأسباب أمنية.", + "createFirstKey": "قم بإنشاء مفتاحك الأول", + "name": "الاسم", + "usage": "الاستخدام", + "created": "تم إنشاؤها", + "actions": "الإجراءات", + "reqs": "طلبات", + "neverUsed": "لم تستخدم قط", + "deleteConfirm": "هل تريد حذف مفتاح واجهة برمجة التطبيقات هذا؟", + "usageTips": "نصائح الاستخدام", + "tipAuth": "استخدم مفاتيح API في رأس التفويض كحامل YOUR_KEY", + "tipSecure": "يتم عرض المفاتيح مرة واحدة فقط أثناء الإنشاء — قم بتخزينها بشكل آمن", + "tipSeparate": "قم بإنشاء مفاتيح منفصلة لعملاء أو بيئات مختلفة", + "tipRestrict": "قم بتقييد المفاتيح لنماذج محددة لتحسين الأمان والتحكم في التكلفة", + "keyName": "اسم المفتاح", + "keyNamePlaceholder": "على سبيل المثال، مفتاح الإنتاج، مفتاح التطوير", + "keyNameDesc": "اختر اسمًا وصفيًا لتحديد غرض هذا المفتاح", + "keyCreated": "تم إنشاء مفتاح API", + "keyCreatedSuccess": "تم إنشاء المفتاح بنجاح!", + "keyCreatedNote": "انسخ هذا المفتاح وقم بتخزينه الآن - لن يتم عرضه مرة أخرى.", + "done": "تم", + "savePermissions": "حفظ الأذونات", + "allowAll": "السماح للكل", + "restrict": "تقييد", + "allowAllInfo": "يمكن لهذا المفتاح الوصول إلى كافة الموديلات المتاحة.", + "restrictInfo": "يمكن لهذا المفتاح الوصول إلى {selected} من طرازات {total}.", + "selected": "تم تحديد {count}", + "all": "الكل", + "clear": "واضح", + "searchModels": "نماذج البحث بالاسم أو المزود...", + "noModelsFound": "لم يتم العثور على نماذج", + "keyNameRequired": "اسم المفتاح مطلوب", + "keyNameTooLong": "يجب أن يتكون اسم المفتاح من {max} حرفًا أو أقل", + "keyNameInvalid": "يمكن أن يحتوي اسم المفتاح فقط على أحرف وأرقام ومسافات وواصلات وشرطات سفلية", + "invalidKeyName": "اسم المفتاح غير صالح", + "failedCreateKey": "فشل في إنشاء المفتاح", + "failedCreateKeyRetry": "فشل في إنشاء المفتاح. يرجى المحاولة مرة أخرى.", + "invalidKeyId": "معرف المفتاح غير صالح", + "failedDeleteKey": "فشل في حذف المفتاح", + "failedDeleteKeyRetry": "فشل في حذف المفتاح. يرجى المحاولة مرة أخرى.", + "invalidModelsSelection": "تحديد النماذج غير صالح", + "cannotSelectMoreThanModels": "لا يمكن تحديد أكثر من {max} من النماذج", + "failedUpdatePermissions": "فشل تحديث الأذونات", + "failedUpdatePermissionsRetry": "فشل تحديث الأذونات. يرجى المحاولة مرة أخرى.", + "unknownProvider": "غير معروف", + "copyMaskedKey": "انسخ المفتاح المقنع", + "modelsCount": "{count, plural, one {# model} other {# models}}", + "lastUsedOn": "الأخير: {date}", + "editPermissions": "تحرير الأذونات", + "deleteKey": "حذف المفتاح", + "model": "{count} النموذج", + "models": "{count} النماذج", + "permissionsTitle": "الأذونات: {name}", + "allowAllDesc": "يمكن لهذا المفتاح الوصول إلى كافة الموديلات المتاحة.", + "restrictDesc": "يمكن لهذا المفتاح الوصول إلى {selectedCount} من طرازات {totalModels}.", + "selectedCount": "تم تحديد {count}" + }, + "auditLog": { + "title": "سجل التدقيق", + "searchPlaceholder": "إجراءات البحث...", + "action": "العمل", + "actor": "ممثل", + "target": "الهدف", + "ipAddress": "عنوان IP", + "timestamp": "الطابع الزمني", + "noEntries": "لم يتم العثور على إدخالات التدقيق", + "filterByAction": "التصفية حسب الإجراء...", + "filterByActor": "تصفية حسب الممثل...", + "filterEntriesAria": "تصفية إدخالات سجل التدقيق", + "filterByActionTypeAria": "التصفية حسب نوع الإجراء", + "filterByActorAria": "تصفية حسب الممثل", + "refreshAuditLogAria": "تحديث سجل التدقيق", + "tableAria": "إدخالات سجل التدقيق", + "failedFetchAuditLog": "فشل جلب سجل التدقيق", + "notAvailable": "—", + "description": "الإجراءات الإدارية والأحداث الأمنية", + "showing": "عرض {count} إدخالات (الإزاحة {offset})", + "previous": "السابق" + }, + "cliTools": { + "title": "أدوات سطر الأوامر", + "noActiveProviders": "لا يوجد مقدمي خدمات نشطين", + "noActiveProvidersDesc": "الرجاء إضافة موفري الخدمة والاتصال بهم أولاً لتكوين أدوات واجهة سطر الأوامر (CLI).", + "mapModels": "نماذج الخرائط", + "testConnection": "اتصال الاختبار", + "connectionStatus": "حالة الاتصال", + "configureEndpoint": "تكوين نقطة النهاية", + "instructions": "تعليمات", + "modelMapping": "رسم الخرائط النموذجية", + "baseUrl": "عنوان URL الأساسي", + "apiKey": "مفتاح واجهة برمجة التطبيقات", + "configured": "تم تكوينه", + "notConfigured": "لم يتم تكوينه", + "notInstalled": "غير مثبت", + "custom": "مخصص", + "unknown": "غير معروف", + "lastSavedAt": "آخر حفظ: {date}", + "never": "أبدا", + "justNow": "الآن فقط", + "minutesAgoShort": "{count} منذ", + "hoursAgoShort": "{count}h منذ", + "daysAgoShort": "{count}d منذ", + "monthsAgoShort": "{count}قبل شهر", + "yearsAgoShort": "{count}قبل عام", + "runtimeCheckFailed": "فشل التحقق من وقت التشغيل", + "yourApiKeyPlaceholder": "مفتاح API الخاص بك", + "modelPlaceholder": "معرف الموفر/النموذج", + "configurationSaved": "تم حفظ التكوين بنجاح.", + "failedToSave": "فشل حفظ التكوين.", + "noApiKeysCreateOne": "لا توجد مفاتيح API - قم بإنشاء واحد في صفحة المفاتيح", + "defaultOmnirouteKey": "sk_omniroute (افتراضي)", + "selectModel": "حدد النموذج", + "selectModelForAlias": "تحديد نموذج لـ {alias}", + "selectModelForTool": "حدد نموذجًا لـ {tool}", + "select": "اختر", + "clear": "واضح", + "comingSoon": "قريبا", + "checkingRuntime": "التحقق من حالة وقت التشغيل...", + "guideOnlyIntegration": "تكامل الدليل فقط (لا يتطلب وقت تشغيل محلي)", + "cliRuntimeDetected": "تم اكتشاف وقت تشغيل CLI وأصبح جاهزًا", + "cliFoundNotRunnable": "تم العثور على واجهة سطر الأوامر (CLI) ولكنها غير قابلة للتشغيل{reason}", + "cliRuntimeNotDetected": "لم يتم الكشف عن وقت تشغيل CLI", + "binary": "ثنائي", + "configPath": "مسار التكوين", + "configPathShort": "التكوين", + "failedCheckRuntimeStatus": "فشل في التحقق من حالة وقت التشغيل.", + "copy": "نسخ", + "copied": "منقول", + "copyConfig": "نسخ التكوين", + "saveConfig": "حفظ التكوين", + "selectionSaved": "تم حفظ التحديد", + "guide": "دليل", + "detected": "تم الكشف عنها", + "notReady": "غير جاهز", + "active": "نشط", + "inactive": "غير نشط", + "startMitm": "ابدأ تشغيل MITM", + "stopMitm": "وقف ميتم", + "mitmStarted": "بدأ MITM بنجاح!", + "mitmStopped": "توقف MITM بنجاح!", + "failedStart": "فشل بدء تشغيل MITM", + "failedStop": "فشل في إيقاف MITM", + "saveMappings": "حفظ التعيينات", + "mappingsSaved": "تم حفظ التعيينات!", + "failedSaveMappings": "فشل حفظ التعيينات", + "howItWorks": "كيف يعمل:", + "antigravityHowWorksDesc": "تقوم Antigravity بإرسال الطلبات إلى نقطة نهاية Google. يقوم MITM باعتراضهم وإعادة توجيههم إلى OmniRoute.", + "antigravityStep1": "1. ابدأ تشغيل MITM لتوجيه الطلبات عبر OmniRoute.", + "antigravityStep2Prefix": "2. أضف", + "antigravityStep2Suffix": "إلى ملف المضيفين الخاص بك كـ 127.0.0.1.", + "antigravityStep3": "3. سيتم فتح Antigravity والطلبات بالوكالة.", + "sudoPasswordRequiredTitle": "كلمة مرور سودو مطلوبة", + "sudoPasswordHint": "كلمة مرور المسؤول مطلوبة لتعديل ملف المضيفين وإعدادات وكيل النظام.", + "enterSudoPassword": "أدخل كلمة مرور سودو", + "sudoPasswordRequiredError": "كلمة مرور سودو مطلوبة.", + "cancel": "إلغاء", + "confirm": "تأكيد", + "settingsApplied": "تم تطبيق الإعدادات بنجاح!", + "failedApplySettings": "فشل في تطبيق الإعدادات", + "settingsReset": "تمت إعادة ضبط الإعدادات بنجاح!", + "failedResetSettings": "فشل في إعادة ضبط الإعدادات", + "backupRestored": "تمت استعادة النسخة الاحتياطية!", + "failedRestore": "فشل في الاستعادة", + "checkingCli": "جارٍ التحقق من {tool} CLI...", + "cliNotRunnable": "{tool} تم تثبيت واجهة سطر الأوامر (CLI) ولكنها غير قابلة للتشغيل", + "cliNotInstalled": "{tool} واجهة سطر الأوامر غير مثبتة", + "cliNotDetected": "{tool} لم يتم اكتشاف واجهة سطر الأوامر", + "cliDetectedReady": "{tool} تم اكتشاف واجهة سطر الأوامر (CLI) وهي جاهزة", + "cliFoundFailedHealthcheck": "{tool} تم العثور على واجهة سطر الأوامر (CLI) ولكن فشل التحقق من سلامة وقت التشغيل{reason}.", + "installCliPrompt": "الرجاء تثبيت {tool} CLI لاستخدام هذه الميزة.", + "installCodexPrompt": "الرجاء تثبيت Codex CLI لاستخدام ميزة التطبيق التلقائي.", + "hide": "إخفاء", + "howToInstall": "كيفية التثبيت", + "installationGuide": "دليل التثبيت", + "platforms": "ماك / لينكس / ويندوز:", + "afterInstallationRun": "بعد التثبيت، قم بتشغيل", + "toVerify": "للتحقق.", + "current": "الحالي", + "baseUrlPlaceholder": "https://.../v1", + "resetToDefault": "إعادة التعيين إلى الوضع الافتراضي", + "providerModelPlaceholder": "معرف الموفر/النموذج", + "apply": "تطبيق", + "reset": "إعادة تعيين", + "manualConfig": "التكوين اليدوي", + "backups": "النسخ الاحتياطية", + "configBackups": "النسخ الاحتياطية التكوين", + "noBackupsYet": "لا توجد نسخ احتياطية حتى الآن. يتم إنشاء النسخ الاحتياطية تلقائيًا قبل كل تطبيق أو إعادة تعيين.", + "restore": "استعادة", + "backupRestoredReloading": "تمت استعادة النسخة الاحتياطية! جارٍ إعادة تحميل الحالة...", + "failedRestoreBackup": "فشل في استعادة النسخة الاحتياطية", + "applied": "تم التطبيق!", + "failed": "فشل", + "resetDone": "إعادة تعيين!", + "omnirouteConfiguredOpenAiCompatible": "تم تكوين OmniRoute كموفر متوافق مع OpenAI", + "provider": "مزود", + "model": "نموذج", + "providers": "مقدمي الخدمات", + "auth": "مصادقة", + "noApiKeysAvailable": "لا توجد مفاتيح API متاحة", + "usingDefaultOmniroute": "باستخدام الافتراضي: sk_omniroute", + "updateConfig": "تحديث التكوين", + "applyConfig": "تطبيق التكوين", + "noBackupsAvailable": "لا توجد نسخ احتياطية متاحة.", + "profileSaved": "تم حفظ الملف الشخصي \"{name}\"!", + "failedSaveProfile": "فشل حفظ الملف الشخصي", + "profileActivated": "تم تفعيل الملف الشخصي!", + "failedActivateProfile": "فشل في تفعيل الملف الشخصي", + "profiles": "الملفات الشخصية", + "savedProfiles": "الملفات الشخصية المحفوظة", + "noProfilesYet": "لم يتم حفظ أي ملفات شخصية حتى الآن. احفظ التكوين الحالي كملف تعريف أدناه.", + "activate": "تفعيل", + "deleteProfile": "حذف الملف الشخصي", + "profileNamePlaceholder": "اسم الملف الشخصي (مثل الحساب الشخصي)", + "saveCurrent": "حفظ الحالي", + "codexAuthNotePrefix": "يستخدم الدستور الغذائي", + "codexAuthNoteMiddle": "مع", + "codexAuthNoteSuffix": "انقر فوق \"تطبيق\" للتكوين التلقائي.", + "claudeManualConfiguration": "كلود CLI - التكوين اليدوي", + "codexManualConfiguration": "Codex CLI - التكوين اليدوي", + "droidManualConfiguration": "Factory Droid - التكوين اليدوي", + "openClawManualConfiguration": "فتح المخلب - التكوين اليدوي", + "clineManualConfiguration": "التكوين اليدوي لكلين", + "kiloManualConfiguration": "التكوين اليدوي للكيلو كود", + "toolDescriptions": { + "antigravity": "جوجل مكافحة الجاذبية IDE مع MITM", + "claude": "الأنثروبي كلود كود CLI", + "codex": "OpenAI Codex CLI", + "droid": "مساعد مصنع الروبوت AI", + "openclaw": "افتح مساعد Claw AI", + "cline": "Cline AI Coding Assistant CLI", + "kilo": "كيلو كود AI مساعد CLI", + "cursor": "محرر كود المؤشر AI", + "continue": "تابع مساعد الذكاء الاصطناعي" + }, + "guides": { + "cursor": { + "notes": { + "0": "يتطلب حساب Cursor Pro لاستخدام هذه الميزة.", + "1": "يقوم المؤشر بتوجيه الطلبات من خلال الخادم الخاص به، لذلك لا يتم دعم نقطة النهاية المحلية. يرجى تمكين Cloud Endpoint في الإعدادات." + }, + "steps": { + "1": { + "title": "افتح الإعدادات", + "desc": "انتقل إلى الإعدادات -> النماذج" + }, + "2": { + "title": "تمكين OpenAI API", + "desc": "تمكين خيار \"مفتاح OpenAI API\"." + }, + "3": { + "title": "عنوان URL الأساسي" + }, + "4": { + "title": "مفتاح واجهة برمجة التطبيقات" + }, + "5": { + "title": "إضافة نموذج مخصص", + "desc": "انقر فوق \"عرض كافة النماذج\" -> \"إضافة نموذج مخصص\"" + }, + "6": { + "title": "حدد النموذج" + } + } + }, + "continue": { + "steps": { + "1": { + "title": "افتح التكوين", + "desc": "افتح متابعة ملف التكوين" + }, + "2": { + "title": "مفتاح واجهة برمجة التطبيقات" + }, + "3": { + "title": "حدد النموذج" + }, + "4": { + "title": "إضافة تكوين النموذج", + "desc": "أضف التكوين التالي إلى مجموعة النماذج الخاصة بك:" + } + } + } + } + }, + "combos": { + "title": "المجموعات", + "description": "قم بإنشاء مجموعات نماذج باستخدام التوجيه المرجح والدعم الاحتياطي", + "createCombo": "إنشاء التحرير والسرد", + "editCombo": "تحرير التحرير والسرد", + "deleteCombo": "حذف التحرير والسرد", + "noModels": "لا نماذج", + "noModelsYet": "لم تتم إضافة أي نماذج حتى الآن", + "addModel": "إضافة نموذج", + "addModelToCombo": "إضافة نموذج إلى التحرير والسرد", + "routingStrategy": "استراتيجية التوجيه", + "maxRetries": "ماكس إعادة المحاولة", + "timeout": "المهلة (مللي ثانية)", + "healthcheck": "فحص الصحة", + "priority": "الأولوية", + "fallback": "احتياطي", + "roundRobin": "جولة روبن", + "random": "عشوائي", + "leastLatency": "الكمون الأقل", + "comboName": "اسم التحرير والسرد", + "comboNamePlaceholder": "بلدي التحرير والسرد", + "deleteConfirm": "هل تريد حذف هذا التحرير والسرد؟", + "noCombosYet": "لا المجموعات بعد", + "comboCreated": "تم إنشاء التحرير والسرد بنجاح", + "comboUpdated": "تم تحديث التحرير والسرد بنجاح", + "comboDeleted": "تم حذف التحرير والسرد", + "failedCreate": "فشل إنشاء التحرير والسرد", + "failedUpdate": "فشل تحديث التحرير والسرد", + "errorCreating": "حدث خطأ أثناء إنشاء التحرير والسرد", + "errorUpdating": "حدث خطأ أثناء تحديث التحرير والسرد", + "errorDeleting": "حدث خطأ أثناء حذف التحرير والسرد", + "testFailed": "فشل طلب الاختبار", + "failedToggle": "فشل تبديل التحرير والسرد", + "testResults": "نتائج الاختبار — {name}", + "resolvedBy": "تم الحل بواسطة:", + "more": "+{count} المزيد", + "reqs": "طلبات", + "success": "النجاح", + "proxyConfigured": "تم تكوين الوكيل", + "copyComboName": "انسخ اسم التحرير والسرد", + "enableCombo": "تمكين التحرير والسرد", + "disableCombo": "تعطيل التحرير والسرد", + "testCombo": "التحرير والسرد الاختبار", + "duplicate": "مكررة", + "proxyConfig": "تكوين الوكيل", + "nameRequired": "الاسم مطلوب", + "nameInvalid": "فقط الحروف والأرقام، -، _، / و . مسموح به", + "nameHint": "الحروف والأرقام، -، _، / و . مسموح به", + "priorityDesc": "التراجع المتسلسل: تجربة النموذج 1 أولاً، ثم 2، وما إلى ذلك.", + "weightedDesc": "يوزع حركة المرور حسب نسبة الوزن مع التراجع", + "roundRobinDesc": "التوزيع الدائري: ينتقل كل طلب إلى النموذج التالي بالتناوب", + "randomDesc": "اختيار عشوائي موحد، ثم الرجوع إلى النماذج المتبقية", + "leastUsedDesc": "يختار النموذج الذي يحتوي على أقل عدد من الطلبات، مع موازنة الحمل مع مرور الوقت", + "costOptimizedDesc": "الطرق إلى النموذج الأرخص تعتمد أولاً على التسعير", + "models": "نماذج", + "autoBalance": "التوازن التلقائي", + "advancedSettings": "الإعدادات المتقدمة", + "retryDelay": "تأخير إعادة المحاولة (ملي ثانية)", + "concurrencyPerModel": "التزامن/النموذج", + "queueTimeout": "مهلة قائمة الانتظار (مللي ثانية)", + "advancedHint": "اتركه فارغًا لاستخدام الإعدادات الافتراضية العامة. تتجاوز هذه الإعدادات لكل موفر.", + "moveUp": "تحرك للأعلى", + "moveDown": "تحرك للأسفل", + "removeModel": "إزالة", + "saving": "جارٍ الحفظ...", + "weighted": "مرجح", + "leastUsed": "الأقل استخدامًا", + "costOpt": "تكلفة الاختيار" + }, + "costs": { + "title": "التكاليف", + "budget": "الميزانية", + "totalCost": "التكلفة الإجمالية", + "breakdown": "تقسيم التكلفة", + "noData": "لا توجد بيانات التكلفة", + "byModel": "حسب الموديل", + "byProvider": "بواسطة المزود" + }, + "endpoint": { + "title": "نقطة نهاية واجهة برمجة التطبيقات", + "available": "نقاط النهاية المتاحة", + "cloudProxy": "الوكيل السحابي", + "disableConfirm": "هل أنت متأكد أنك تريد تعطيل الوكيل السحابي؟", + "baseUrl": "عنوان URL الأساسي", + "apiKeyLabel": "مفتاح واجهة برمجة التطبيقات", + "registeredKeys": "المفاتيح المسجلة", + "chatCompletions": "استكمالات الدردشة", + "responses": "الردود", + "listModels": "نماذج القائمة", + "usingCloudProxy": "باستخدام وكيل السحابة", + "usingLocalServer": "باستخدام الخادم المحلي", + "machineId": "معرف الجهاز: {id}...", + "disableCloud": "تعطيل السحابة", + "enableCloud": "تمكين السحابة", + "modelsAcrossEndpoints": "نماذج {models} عبر نقاط النهاية {endpoints}", + "chatDesc": "الدردشة المتدفقة وغير المتدفقة مع جميع مقدمي الخدمة", + "embeddings": "التضمين", + "embeddingsDesc": "تضمينات نصية للبحث وخطوط أنابيب RAG", + "imageGeneration": "توليد الصور", + "imageDesc": "توليد الصور من المطالبات النصية", + "rerank": "إعادة الترتيب", + "rerankDesc": "إعادة ترتيب المستندات حسب صلتها بالاستعلام", + "audioTranscription": "النسخ الصوتي", + "audioTranscriptionDesc": "نسخ الملفات الصوتية إلى نص (Whisper)", + "textToSpeech": "تحويل النص إلى كلام", + "textToSpeechDesc": "تحويل النص إلى كلام يبدو طبيعيا", + "moderations": "الاعتدالات", + "moderationsDesc": "الإشراف على المحتوى وتصنيف السلامة", + "enableCloudTitle": "تمكين الوكيل السحابي", + "whatYouGet": "ما سوف تحصل عليه", + "cloudBenefitAccess": "الوصول إلى API الخاص بك من أي مكان في العالم", + "cloudBenefitShare": "مشاركة نقطة النهاية مع فريقك بسهولة", + "cloudBenefitPorts": "لا حاجة لفتح المنافذ أو تكوين جدار الحماية", + "cloudBenefitEdge": "شبكة حافة عالمية سريعة", + "cloudSessionNote": "ستحتفظ السحابة بجلسة المصادقة الخاصة بك لمدة يوم واحد. إذا لم يتم استخدامه، سيتم حذفه تلقائيا.", + "cloudUnstableNote": "السحابة غير مستقرة حاليًا مع Claude Code OAuth في بعض الحالات.", + "cloudConnected": "الوكيل السحابي متصل!", + "connectingToCloud": "جارٍ الاتصال بالسحابة...", + "verifyingConnection": "جارٍ التحقق من الاتصال...", + "connecting": "جارٍ الاتصال...", + "verifying": "جارٍ التحقق...", + "connected": "متصل!", + "disableCloudTitle": "تعطيل الوكيل السحابي", + "disableWarning": "سيتم حذف جميع جلسات المصادقة من السحابة.", + "syncingData": "جارٍ مزامنة أحدث البيانات...", + "disablingCloud": "جارٍ تعطيل السحابة...", + "syncing": "جارٍ المزامنة...", + "disabling": "جارٍ التعطيل...", + "cloudConnectedVerified": "تم توصيل Cloud Proxy والتحقق منه!", + "connectedVerificationPending": "متصل - التحقق معلق", + "connectedVerificationPendingWithError": "متصل — التحقق معلق: {error}", + "cloudDisabledSuccess": "تم تعطيل السحابة بنجاح", + "syncedSuccess": "تمت المزامنة بنجاح", + "failedDisable": "فشل في تعطيل السحابة", + "failedEnable": "فشل في تمكين السحابة", + "cloudRequestTimeout": "انتهت مهلة الطلب السحابي", + "cloudRequestFailed": "فشل طلب السحابة", + "cloudWorkerUnreachable": "لا يمكن الوصول إلى عامل السحابة. تأكد من تشغيل الخدمة السحابية (npm run dev in /cloud).", + "connectionFailed": "فشل الاتصال", + "syncFailed": "فشلت مزامنة البيانات السحابية", + "providerModelsTitle": "{provider} — النماذج", + "noModelsForProvider": "لا توجد نماذج متاحة لهذا المزود.", + "chat": "الدردشة", + "embedding": "التضمين", + "image": "صورة", + "custom": "مخصص", + "modelsCount": "{count, plural, one {# model} other {# models}}" + }, + "health": { + "title": "صحة النظام", + "description": "المراقبة في الوقت الحقيقي لمثيل OmniRoute الخاص بك", + "healthy": "صحي", + "degraded": "متدهورة", + "down": "أسفل", + "uptime": "الجهوزية", + "memory": "الذاكرة", + "memoryRss": "الذاكرة (آر إس إس)", + "heap": "كومة", + "cpu": "وحدة المعالجة المركزية", + "database": "قاعدة البيانات", + "version": "الإصدار", + "lastCheck": "الفحص الأخير", + "providerHealth": "صحة المزود", + "systemMetrics": "مقاييس النظام", + "tokenHealth": "صحة الرمز", + "refreshAll": "تحديث الكل", + "checkNow": "تحقق الآن", + "loadingHealth": "جارٍ تحميل البيانات الصحية...", + "failedToLoad": "فشل تحميل البيانات الصحية: {error}", + "retry": "أعد المحاولة", + "allOperational": "جميع الأنظمة قيد التشغيل", + "issuesDetected": "تم اكتشاف مشاكل في النظام", + "updatedAt": "تم التحديث {time}", + "latency": "الكمون", + "latencyP50": "ص50", + "latencyP95": "ص95", + "latencyP99": "ص99", + "millisecondsShort": "{value}ms", + "notAvailable": "—", + "totalRequests": "إجمالي الطلبات", + "noDataYet": "لا توجد بيانات حتى الآن", + "promptCache": "ذاكرة التخزين المؤقت الفوري", + "entries": "إدخالات", + "hitRate": "معدل الإصابة", + "hitsMisses": "الزيارات / الأخطاء", + "signatureCache": "ذاكرة التخزين المؤقت للتوقيع", + "signatureDefaults": "الافتراضيات", + "signatureTool": "أداة", + "signatureFamily": "العائلة", + "signatureSession": "جلسة", + "recovering": "يتعافى", + "noCBData": "لا تتوفر بيانات قاطع الدائرة. تقديم بعض الطلبات أولا.", + "providerHealthStatusAria": "الحالة الصحية للمزود", + "issuesLabel": "تم اكتشاف المشكلات", + "operational": "التشغيلية", + "providers": "مقدمي الخدمات", + "healthyCount": "{count} صحي", + "nodeVersion": "العقدة {version}", + "failures": "{count} فشل", + "failuresPlural": "{count} حالات الفشل", + "lastFailure": "الاخير", + "rateLimitStatus": "حالة حد السعر", + "activeLimiters": "{count} المحدد النشط", + "activeLimitersPlural": "{count} المحددات النشطة", + "queued": "في قائمة الانتظار", + "queuedCount": "{count} في قائمة الانتظار", + "running": "تشغيل", + "runningCount": "{count} قيد التشغيل", + "ok": "حسنًا", + "activeLockouts": "عمليات الإغلاق النشطة", + "resetConfirm": "إعادة ضبط كافة قواطع الدائرة إلى الحالة الصحية؟ سيؤدي هذا إلى مسح جميع أعداد الفشل واستعادة كافة الموفرين إلى الحالة التشغيلية.", + "resetAllTitle": "إعادة ضبط كافة قواطع الدائرة إلى الحالة الصحية", + "resetting": "إعادة الضبط...", + "resetAll": "إعادة ضبط الكل", + "until": "حتى {time}" + }, + "limits": { + "title": "الحدود والحصص", + "rateLimit": "حد السعر", + "remaining": "المتبقي", + "requestsPerMinute": "طلبات/دقيقة", + "tokensPerMinute": "الرموز / دقيقة", + "dailyLimit": "الحد اليومي" + }, + "logs": { + "title": "سجلات", + "requestLogs": "سجلات الطلب", + "proxyLogs": "سجلات الوكيل", + "auditLog": "سجل التدقيق", + "console": "وحدة التحكم", + "auditLogDesc": "الإجراءات الإدارية والأحداث الأمنية", + "loading": "جار التحميل...", + "refresh": "تحديث", + "filterByAction": "التصفية حسب الإجراء...", + "filterByActor": "تصفية حسب الممثل...", + "filterEntriesAria": "تصفية إدخالات سجل التدقيق", + "filterByActionTypeAria": "التصفية حسب نوع الإجراء", + "filterByActorAria": "تصفية حسب الممثل", + "refreshAuditLogAria": "تحديث سجل التدقيق", + "tableAria": "إدخالات سجل التدقيق", + "failedFetchAuditLog": "فشل جلب سجل التدقيق", + "showing": "عرض {count} إدخالات (الإزاحة {offset})", + "search": "بحث", + "timestamp": "الطابع الزمني", + "action": "العمل", + "actor": "ممثل", + "target": "الهدف", + "details": "التفاصيل", + "ipAddress": "عنوان IP", + "notAvailable": "—", + "noEntries": "لم يتم العثور على إدخالات سجل التدقيق", + "previous": "السابق", + "next": "التالي" + }, + "onboarding": { + "welcome": "مرحبًا", + "security": "الأمن", + "test": "اختبار", + "ready": "جاهز!", + "setPassword": "تعيين كلمة المرور", + "addProvider": "أضف مزودك الأول", + "getStarted": "ابدأ", + "skip": "تخطي", + "skipWizard": "تخطي المعالج بالكامل", + "skipPassword": "تخطي إعداد كلمة المرور", + "skipAndContinue": "تخطي ومتابعة", + "passwordLabel": "كلمة المرور", + "confirmPassword": "تأكيد كلمة المرور", + "enterPassword": "أدخل كلمة المرور", + "confirmPasswordPlaceholder": "تأكيد كلمة المرور", + "passwordsMismatch": "كلمات المرور غير متطابقة", + "setupComplete": "اكتمل الإعداد!", + "goToDashboard": "انتقل إلى لوحة المعلومات →", + "welcomeDesc": "OmniRoute هو وكيل AI API المحلي الخاص بك. يقوم بتوجيه الطلبات إلى العديد من موفري الذكاء الاصطناعي مع موازنة التحميل وتجاوز الفشل وتتبع الاستخدام.", + "multiProvider": "متعدد الموفر", + "usageTracking": "تتبع الاستخدام", + "apiKeyMgmt": "إدارة مفتاح واجهة برمجة التطبيقات (API)", + "securityDesc": "قم بتعيين كلمة مرور لحماية لوحة المعلومات الخاصة بك، أو قم بالتخطي الآن.", + "providerDesc": "قم بتوصيل مزود الذكاء الاصطناعي الأول الخاص بك. يمكنك إضافة المزيد لاحقا.", + "apiKeyRequired": "مفتاح واجهة برمجة التطبيقات (مطلوب)", + "customUrlOptional": "عنوان URL المخصص (اختياري)", + "testDesc": "دعونا نتحقق من أن اتصال المزود الخاص بك يعمل.", + "runTest": "قم بتشغيل اختبار الاتصال", + "testingConnection": "اختبار الاتصال...", + "connectionSuccessful": "تم الاتصال بنجاح! المزود الخاص بك جاهز.", + "noProviderFound": "لم يتم العثور على مزود. يمكنك إضافة واحدة من لوحة التحكم لاحقًا.", + "testFailed": "فشل الاختبار، ولكن يمكنك تكوين ذلك لاحقًا.", + "couldNotTest": "لا يمكن الاختبار الآن. يمكنك الاختبار من لوحة القيادة.", + "doneDesc": "أنت جاهز تمامًا! تم تكوين مثيل OmniRoute الخاص بك وأصبح جاهزًا لتوكيل طلبات الذكاء الاصطناعي.", + "yourEndpoint": "نقطة النهاية الخاصة بك:", + "continue": "متابعة", + "retry": "أعد المحاولة", + "failedSetPassword": "فشل في تعيين كلمة المرور. حاول ثانية.", + "failedAddProvider": "فشلت إضافة الموفر. حاول ثانية.", + "connectionError": "خطأ في الاتصال. يرجى المحاولة مرة أخرى.", + "provider": "مزود" + }, + "providers": { + "title": "مقدمي الخدمات", + "addProvider": "إضافة موفر", + "editProvider": "تحرير الموفر", + "deleteProvider": "حذف الموفر", + "noProviders": "لم يتم تكوين أي مقدمي خدمات", + "modelAvailability": "توفر النموذج", + "accounts": "الحسابات", + "newAccount": "حساب جديد", + "deleteConfirm": "هل أنت متأكد أنك تريد حذف هذا الموفر؟", + "testing": "اختبار...", + "testConnection": "اتصال الاختبار", + "testSuccess": "تم الاتصال بنجاح", + "testFailed": "فشل الاتصال", + "available": "متاح", + "cooldown": "فترة التهدئة", + "unavailable": "غير متاح", + "unknown": "غير معروف", + "oauthLabel": "OAuth", + "compatibleLabel": "متوافق", + "chat": "الدردشة", + "responses": "الردود", + "messages": "الرسائل", + "oauthProviders": "موفري OAuth", + "freeProviders": "مقدمي الخدمة المجانية", + "apiKeyProviders": "موفري مفاتيح API", + "compatibleProviders": "مقدمو خدمات API المتوافقون", + "testAll": "اختبار الكل", + "testAllOAuth": "اختبار كافة اتصالات OAuth", + "testAllFree": "اختبار كافة الاتصالات المجانية", + "testAllApiKey": "اختبار جميع اتصالات مفتاح API", + "testAllCompatible": "اختبار كافة الاتصالات المتوافقة", + "connected": "{count} متصل", + "errorCount": "{count} خطأ ({code})", + "errorCountNoCode": "{count} خطأ", + "noConnections": "لا اتصالات", + "disabled": "معطل", + "enableProvider": "تمكين المزود", + "disableProvider": "تعطيل المزود", + "testResults": "نتائج الاختبار", + "noCompatibleYet": "لم تتم إضافة أي مقدمي خدمات متوافقين حتى الآن", + "compatibleHint": "استخدم الأزرار أعلاه لإضافة نقاط نهاية متوافقة مع OpenAI أو Anthropic", + "addOpenAICompatible": "إضافة متوافق مع OpenAI", + "addAnthropicCompatible": "أضف متوافقًا مع الأنثروبولوجيا", + "addNewProvider": "إضافة مزود جديد", + "backToProviders": "العودة إلى مقدمي الخدمة", + "configureNewProvider": "قم بتكوين موفر AI جديد لاستخدامه مع تطبيقاتك.", + "providerLabel": "مزود", + "selectProvider": "حدد مزودًا", + "selectedProvider": "المزود المختار", + "authMethod": "طريقة المصادقة", + "apiKeyLabel": "مفتاح واجهة برمجة التطبيقات", + "apiKeyRequired": "مطلوب مفتاح API", + "selectProviderRequired": "الرجاء اختيار مزود", + "enterApiKey": "أدخل مفتاح API الخاص بك", + "apiKeySecure": "سيتم تشفير مفتاح API الخاص بك وتخزينه بشكل آمن.", + "oauth2Connect": "تواصل مع OAuth2", + "oauth2Label": "OAuth2", + "oauth2Desc": "قم بتوصيل حسابك باستخدام مصادقة OAuth2.", + "displayName": "اسم العرض", + "displayNamePlaceholder": "على سبيل المثال، واجهة برمجة تطبيقات الإنتاج، وبيئة التطوير", + "displayNameHint": "اختياري. اسم مألوف لتعريف هذا التكوين.", + "active": "نشط", + "activeDescription": "قم بتمكين هذا الموفر للاستخدام في تطبيقاتك", + "cancel": "إلغاء", + "createProvider": "إنشاء موفر", + "failedCreate": "فشل في إنشاء الموفر", + "errorOccurred": "حدث خطأ. يرجى المحاولة مرة أخرى.", + "modelStatus": "حالة النموذج", + "allModelsOperational": "جميع الموديلات شغالة", + "modelsWithIssues": "{count} الطراز (النماذج) الذي به مشكلات", + "allModelsNormal": "جميع النماذج تستجيب بشكل طبيعي.", + "cooldownCleared": "تم مسح فترة التهدئة لـ {model}", + "failedClearCooldown": "فشل في مسح فترة التهدئة", + "loadingAvailability": "جارٍ تحميل مدى توفر الطراز...", + "clearCooldown": "واضح", + "clearing": "المقاصة...", + "until": "حتى {time}", + "providerTestFailed": "فشل اختبار الموفر", + "modeTest": "{mode} اختبار", + "passedCount": "تم {count}", + "failedCount": "فشل {count}", + "testedCount": "تم اختبار {count}", + "millisecondsAbbr": "{value}ms", + "okShort": "حسنًا", + "errorShort": "خطأ", + "noActiveConnectionsInGroup": "لم يتم العثور على اتصالات نشطة لهذه المجموعة.", + "allTestsPassed": "تم اجتياز جميع اختبارات {total}", + "testSummary": "تم اجتياز {passed}/{total}، وفشل {failed}", + "nameLabel": "الاسم", + "prefixLabel": "بادئة", + "baseUrlLabel": "عنوان URL الأساسي", + "apiTypeLabel": "نوع واجهة برمجة التطبيقات", + "prefixHint": "مطلوب. بادئة فريدة لأسماء النماذج.", + "nameHint": "مطلوب. تسمية ودية لهذه العقدة.", + "baseUrlHint": "مطلوب. عنوان URL الأساسي لواجهة برمجة تطبيقات الموفر.", + "anthropicPrefixPlaceholder": "ac-منتج", + "openaiPrefixPlaceholder": "oc-منتج", + "anthropicBaseUrlPlaceholder": "https://api.anthropic.com/v1", + "openaiBaseUrlPlaceholder": "https://api.openai.com/v1", + "validateConnection": "التحقق من صحة الاتصال", + "validating": "جارٍ التحقق...", + "connectionValid": "الاتصال صالح!", + "connectionFailed": "فشل الاتصال. تحقق من عنوان URL والمفتاح.", + "testKeyLabel": "اختبار مفتاح API", + "testKeyPlaceholder": "sk-... (للتحقق فقط)", + "providerNotFound": "لم يتم العثور على الموفر", + "deleteConnectionConfirm": "هل تريد حذف هذا الاتصال؟", + "failedSetAlias": "فشل في تعيين الاسم المستعار", + "failedSaveConnection": "فشل حفظ الاتصال", + "failedSaveConnectionRetry": "فشل حفظ الاتصال. يرجى المحاولة مرة أخرى.", + "failedRetestConnection": "فشل في إعادة اختبار الاتصال", + "deleteCompatibleNodeConfirm": "هل تريد حذف العقدة المتوافقة {type} هذه؟", + "anthropicCompatibleDetails": "تفاصيل متوافقة الأنثروبي", + "openaiCompatibleDetails": "تفاصيل متوافقة مع OpenAI", + "messagesApi": "واجهة برمجة تطبيقات الرسائل", + "responsesApi": "واجهة برمجة التطبيقات للردود", + "chatCompletions": "استكمالات الدردشة", + "importingModels": "جارٍ الاستيراد...", + "importFromModels": "الاستيراد من / النماذج", + "addConnectionToImport": "أضف اتصالاً لتمكين الاستيراد.", + "noModelsConfigured": "لم يتم تكوين أي نماذج", + "connectionCount": "{count} الاتصال (الاتصالات)", + "fetchingModels": "جارٍ جلب النماذج المتوفرة...", + "failedFetchModels": "فشل جلب النماذج", + "noModelsFound": "لم يتم العثور على نماذج", + "importFailed": "فشل الاستيراد", + "noNewModelsAdded": "لم تتم إضافة نماذج جديدة.", + "adding": "جارٍ الإضافة...", + "importingModelsTitle": "استيراد النماذج", + "copyModel": "نموذج النسخ", + "removeModel": "إزالة النموذج", + "rateLimitProtected": "محمي", + "rateLimitUnprotected": "غير محمية", + "enableRateLimitProtection": "انقر لتمكين حماية حدود المعدل", + "disableRateLimitProtection": "انقر لتعطيل حماية حد المعدل", + "productionKey": "مفتاح الإنتاج", + "enterNewApiKey": "أدخل مفتاح API الجديد", + "optional": "اختياري", + "anthropicCompatibleName": "متوافق مع الأنثروبولوجيا", + "openaiCompatibleName": "متوافق مع OpenAI", + "failedImportModels": "فشل استيراد النماذج", + "noModelsReturnedFromEndpoint": "لم يتم إرجاع أي نماذج من نقطة النهاية /models.", + "importingModelsProgress": "جارٍ استيراد {current} من طرازات {total}...", + "foundModelsStartingImport": "تم العثور على نماذج {count}. جارٍ بدء الاستيراد...", + "importingModelById": "جارٍ استيراد {modelId}...", + "importSuccessCount": "تم استيراد {count, plural, one {# model} other {# models}} بنجاح!", + "noNewModelsAddedExisting": "لم تتم إضافة أي نماذج جديدة (كلها موجودة بالفعل).", + "importDoneCount": "✓ تم! {count, plural, one {# model imported.} other {# models imported.}}", + "unexpectedErrorOccurred": "حدث خطأ غير متوقع", + "connectionCountLabel": "{count, plural, one {# connection} other {# connections}}", + "messagesPath": "الرسائل", + "responsesPath": "الردود", + "chatCompletionsPath": "الدردشة/الإكمال", + "add": "أضف", + "edit": "تحرير", + "delete": "حذف", + "anthropic": "أنثروبي", + "openai": "OpenAI", + "singleConnectionPerCompatible": "يُسمح باتصال واحد فقط لكل عقدة متوافقة. أضف عقدة أخرى إذا كنت بحاجة إلى المزيد من الاتصالات.", + "connections": "اتصالات", + "providerProxyTitleConfigured": "وكيل الموفر: {host}", + "configured": "تم تكوينه", + "providerProxyConfigureHint": "قم بتكوين الوكيل لجميع اتصالات هذا الموفر", + "providerProxy": "وكيل الموفر", + "noConnectionsYet": "لا توجد اتصالات حتى الآن", + "addFirstConnectionHint": "أضف اتصالك الأول للبدء", + "addConnection": "إضافة اتصال", + "availableModels": "النماذج المتاحة", + "pageAutoRefresh": "سيتم تحديث الصفحة تلقائيا...", + "statusDisabled": "معطل", + "statusConnected": "متصل", + "statusRuntimeIssue": "مشكلة وقت التشغيل", + "statusAuthFailed": "فشلت المصادقة", + "statusRateLimited": "معدل محدود", + "statusNetworkIssue": "مشكلة الشبكة", + "statusTestUnsupported": "اختبار غير معتمد", + "statusUnavailable": "غير متاح", + "statusFailed": "فشل", + "statusError": "خطأ", + "oauthAccount": "حساب أووث", + "errorTypeRuntime": "وقت التشغيل المحلي", + "errorTypeUpstreamAuth": "مصادقة المنبع", + "errorTypeMissingCredential": "بيانات الاعتماد مفقودة", + "errorTypeRefreshFailed": "فشل التحديث", + "errorTypeTokenExpired": "انتهت صلاحية الرمز المميز", + "errorTypeRateLimited": "معدل محدود", + "errorTypeUpstreamUnavailable": "المنبع غير متاح", + "errorTypeNetworkError": "خطأ في الشبكة", + "errorTypeTestUnsupported": "اختبار غير معتمد", + "errorTypeUpstreamError": "خطأ المنبع", + "proxySourceGlobal": "عالمي", + "proxySourceProvider": "مزود", + "proxySourceKey": "مفتاح", + "proxyConfiguredBySource": "الوكيل ({source}): {host}", + "autoPriority": "تلقائي: {priority}", + "proxy": "وكيل", + "retestAuthentication": "إعادة اختبار المصادقة", + "retest": "إعادة الاختبار", + "disableConnection": "تعطيل الاتصال", + "enableConnection": "تمكين الاتصال", + "reauthenticateConnection": "إعادة مصادقة هذا الاتصال", + "proxyConfig": "تكوين الوكيل", + "aliasExistsAlert": "الاسم المستعار \"{alias}\" موجود بالفعل. الرجاء استخدام نموذج مختلف أو تعديل الاسم المستعار الموجود.", + "openRouterAnyModelHint": "يدعم OpenRouter أي طراز. إضافة نماذج وإنشاء أسماء مستعارة للوصول السريع.", + "modelIdFromOpenRouter": "معرف النموذج (من OpenRouter)", + "openRouterModelPlaceholder": "أنثروبي/كلود-3-أوبوس", + "customModels": "نماذج مخصصة", + "customModelsHint": "قم بإضافة معرفات النماذج غير الموجودة في القائمة الافتراضية. ستكون هذه متاحة للتوجيه.", + "modelId": "معرف النموذج", + "customModelPlaceholder": "على سبيل المثال جي بي تي-4.5-توربو", + "loading": "جار التحميل...", + "removeCustomModel": "إزالة النموذج المخصص", + "noCustomModels": "لم تتم إضافة نماذج مخصصة بعد.", + "allSuggestedAliasesExist": "كافة الأسماء المستعارة المقترحة موجودة بالفعل. الرجاء اختيار نموذج مختلف أو إزالة الأسماء المستعارة المتضاربة.", + "failedSaveCustomModel": "فشل حفظ النموذج المخصص", + "modelAddedSuccess": "تمت إضافة النموذج {modelId} بنجاح", + "failedAddModelTryAgain": "فشلت إضافة النموذج. يرجى المحاولة مرة أخرى.", + "failedSaveImportedModel": "فشل حفظ النموذج المستورد في قاعدة البيانات المخصصة", + "failedImportModelsTryAgain": "فشل استيراد النماذج. يرجى المحاولة مرة أخرى.", + "failedRemoveModelFromDatabase": "فشل في إزالة النموذج من قاعدة البيانات", + "modelRemovedSuccess": "تمت إزالة النموذج بنجاح", + "failedDeleteModelTryAgain": "فشل في حذف النموذج. يرجى المحاولة مرة أخرى.", + "compatibleModelsDescription": "قم بإضافة نماذج متوافقة مع {type} يدويًا أو قم باستيرادها من نقطة النهاية /models.", + "anthropicCompatibleModelPlaceholder": "كلود-3-أوبوس-20240229", + "openaiCompatibleModelPlaceholder": "gpt-4o", + "apiKeyValidationFailed": "فشل التحقق من صحة مفتاح API. يرجى التحقق من المفتاح الخاص بك والمحاولة مرة أخرى.", + "addProviderApiKeyTitle": "أضف {provider} مفتاح واجهة برمجة التطبيقات", + "checking": "جارٍ التحقق...", + "check": "تحقق", + "valid": "صالح", + "invalid": "غير صالح", + "creating": "جارٍ الإنشاء...", + "validationChecksAnthropicCompatible": "يتحقق التحقق من الصحة {provider} من خلال التحقق من مفتاح API.", + "validationChecksOpenAiCompatible": "عمليات التحقق من الصحة {provider} عبر /models على عنوان URL الأساسي الخاص بك.", + "priorityLabel": "الأولوية", + "saving": "جارٍ الحفظ...", + "save": "حفظ", + "editConnection": "تحرير الاتصال", + "accountName": "اسم الحساب", + "email": "البريد الإلكتروني", + "healthCheckMinutes": "فحص الصحة (دقيقة)", + "healthCheckHint": "الفاصل الزمني لتحديث الرمز المميز. 0 = معطل.", + "failedTestConnection": "فشل في اختبار الاتصال", + "failed": "فشل", + "leaveBlankKeepCurrentApiKey": "اتركه فارغًا للاحتفاظ بمفتاح API الحالي.", + "editCompatibleTitle": "تحرير {type} متوافق", + "compatibleBaseUrlHint": "استخدم عنوان URL الأساسي (الذي ينتهي بـ /v1) لواجهة برمجة التطبيقات المتوافقة مع {type}.", + "apiKeyForCheck": "مفتاح API (للفحص)", + "compatibleProdPlaceholder": "{type} متوافق (المنتج)" + }, + "settings": { + "title": "الإعدادات", + "general": "عام", + "security": "الأمن", + "appearance": "المظهر", + "routing": "التوجيه", + "cache": "ذاكرة التخزين المؤقت", + "resilience": "المرونة", + "systemPrompt": "موجه النظام", + "thinkingBudget": "ميزانية التفكير", + "proxy": "وكيل", + "pricing": "التسعير", + "storage": "التخزين", + "policies": "السياسات", + "ipFilter": "مرشح IP", + "comboDefaults": "افتراضيات التحرير والسرد", + "fallbackChains": "سلاسل احتياطية", + "changePassword": "تغيير كلمة المرور", + "enablePassword": "تمكين كلمة المرور", + "darkMode": "الوضع المظلم", + "lightMode": "وضع الضوء", + "systemTheme": "موضوع النظام", + "enableCache": "تمكين ذاكرة التخزين المؤقت", + "cacheTTL": "ذاكرة التخزين المؤقت TTL", + "maxCacheSize": "الحد الأقصى لحجم ذاكرة التخزين المؤقت", + "clearCache": "مسح ذاكرة التخزين المؤقت", + "cacheHits": "زيارات ذاكرة التخزين المؤقت", + "cacheMisses": "يفتقد ذاكرة التخزين المؤقت", + "hitRate": "معدل الإصابة", + "cacheEntries": "إدخالات ذاكرة التخزين المؤقت", + "circuitBreaker": "قواطع دوائر", + "retryPolicy": "إعادة محاولة السياسة", + "maxRetries": "ماكس إعادة المحاولة", + "retryDelay": "إعادة المحاولة تأخير", + "timeoutMs": "المهلة (مللي ثانية)", + "enableSystemPrompt": "تمكين موجه النظام", + "systemPromptText": "نص موجه النظام", + "enableThinking": "تمكين التفكير", + "maxThinkingTokens": "رموز التفكير ماكس", + "enableProxy": "تمكين الوكيل", + "proxyUrl": "عنوان URL الوكيل", + "pricingRates": "تنسيق أسعار التسعير", + "currentPricing": "نظرة عامة على الأسعار الحالية", + "loadingPricing": "جارٍ تحميل بيانات الأسعار...", + "noPricing": "لا توجد بيانات التسعير المتاحة", + "input": "الإدخال", + "output": "الإخراج", + "cached": "مخبأة", + "reasoning": "المنطق", + "cacheCreation": "إنشاء ذاكرة التخزين المؤقت", + "customPricing": "التسعير المخصص", + "databaseSize": "حجم قاعدة البيانات", + "backupDb": "قاعدة بيانات النسخ الاحتياطي", + "restoreDb": "استعادة قاعدة البيانات", + "exportData": "تصدير البيانات", + "importData": "استيراد البيانات", + "clearData": "مسح كافة البيانات", + "clearDataConfirm": "سيؤدي هذا إلى حذف جميع البيانات بشكل دائم. هل أنت متأكد؟", + "enableRequestLogs": "تمكين سجلات الطلب", + "logRetention": "الاحتفاظ بالسجل", + "ipWhitelist": "القائمة البيضاء للملكية الفكرية", + "ipBlacklist": "القائمة السوداء للملكية الفكرية", + "addIP": "أضف IP", + "savedSuccessfully": "تم حفظ الإعدادات بنجاح", + "ai": "منظمة العفو الدولية", + "advanced": "متقدم", + "localMode": "الوضع المحلي — كافة البيانات المخزنة على جهازك", + "settingsSectionsAria": "أقسام الإعدادات", + "switchThemes": "التبديل بين السمات الفاتحة والداكنة", + "themeSelectionAria": "اختيار الموضوع", + "themeLight": "ضوء", + "themeDark": "الظلام", + "themeSystem": "النظام", + "hideHealthLogs": "إخفاء سجلات التحقق من الصحة", + "hideHealthLogsDesc": "عند التشغيل، قم بمنع رسائل [HealthCheck] في وحدة تحكم الخادم", + "promptCache": "ذاكرة التخزين المؤقت الفوري", + "flushCache": "مسح ذاكرة التخزين المؤقت", + "flushing": "فلاشينغ…", + "size": "الحجم", + "hits": "الزيارات", + "evictions": "عمليات الإخلاء", + "loadingCacheStats": "جارٍ تحميل إحصائيات ذاكرة التخزين المؤقت…", + "globalProxy": "الوكيل العالمي", + "globalProxyDesc": "قم بتكوين وكيل خارجي عالمي لجميع مكالمات API. يمكن للموفرين الفرديين والمجموعات والمفاتيح تجاوز هذا.", + "noGlobalProxy": "لم يتم تكوين وكيل عالمي", + "globalLabel": "عالمي", + "configure": "تكوين", + "globalSystemPrompt": "موجه النظام العالمي", + "systemPromptDesc": "تم إدراجه في جميع الطلبات على مستوى الوكيل", + "saved": "تم الحفظ", + "systemPromptPlaceholder": "أدخل موجه النظام لإدخاله في كافة الطلبات...", + "systemPromptHint": "يتم إضافة هذه المطالبة مسبقًا إلى رسالة النظام الخاصة بكل طلب. يُستخدم للحصول على الإرشادات العامة أو إرشادات السلامة أو قواعد تنسيق الاستجابة.", + "chars": "{count} حرف", + "thinkingBudgetTitle": "ميزانية التفكير", + "thinkingBudgetDesc": "التحكم في استخدام الرمز المميز لاستدلال الذكاء الاصطناعي عبر جميع الطلبات", + "passthrough": "العبور", + "passthroughDesc": "لا توجد تغييرات - يتحكم العميل في ميزانية التفكير", + "auto": "تلقائي", + "autoDesc": "قم بتجريد كل تكوينات التفكير - دع مقدم الخدمة يقرر", + "custom": "مخصص", + "customDesc": "قم بتعيين ميزانية رمزية ثابتة لجميع الطلبات", + "adaptive": "التكيف", + "adaptiveDesc": "مقياس الميزانية على أساس تعقيد الطلب", + "effortNone": "لا شيء (0 الرموز)", + "effortLow": "منخفض (1 ألف رمز)", + "effortMedium": "متوسط (10 آلاف رمز)", + "effortHigh": "عالية (128 ألف رمز)", + "tokenBudget": "ميزانية الرمز المميز", + "tokens": "الرموز", + "baseEffortLevel": "مستوى الجهد الأساسي", + "adaptiveHint": "يتغير الوضع التكيفي من هذا المستوى الأساسي استنادًا إلى عدد الرسائل واستخدام الأداة وطول المطالبة.", + "requireLogin": "تتطلب تسجيل الدخول", + "requireLoginDesc": "عند التشغيل، تتطلب لوحة القيادة كلمة المرور. عند إيقاف التشغيل، قم بالوصول دون تسجيل الدخول.", + "currentPassword": "كلمة المرور الحالية", + "enterCurrentPassword": "أدخل كلمة المرور الحالية", + "newPassword": "كلمة المرور الجديدة", + "enterNewPassword": "أدخل كلمة المرور الجديدة", + "confirmPassword": "تأكيد كلمة المرور الجديدة", + "confirmPasswordPlaceholder": "تأكيد كلمة المرور الجديدة", + "passwordsNoMatch": "كلمات المرور غير متطابقة", + "passwordUpdated": "تم تحديث كلمة المرور بنجاح", + "failedUpdatePassword": "فشل تحديث كلمة المرور", + "errorOccurred": "حدث خطأ", + "updatePassword": "تحديث كلمة المرور", + "setPassword": "تعيين كلمة المرور", + "apiEndpointProtection": "حماية نقطة النهاية لواجهة برمجة التطبيقات (API).", + "requireAuthModels": "يتطلب مفتاح API لـ /models", + "requireAuthModelsDesc": "عند التشغيل، تقوم نقطة النهاية /v1/models بإرجاع 404 للطلبات التي لم تتم مصادقتها. يمنع اكتشاف النموذج بواسطة مستخدمين غير مصرح لهم.", + "blockedProviders": "مقدمي الخدمات المحظورين", + "blockedProvidersDesc": "إخفاء موفري خدمات محددين من استجابة /v1/models. لن يظهر مقدمو الخدمات المحظورون في قوائم النماذج.", + "providersBlocked": "{count} تم حظر الموفر (المزودين) من /models", + "blockProviderTitle": "كتلة {provider}", + "unblockProviderTitle": "قم بإلغاء حظر {provider}", + "routingStrategy": "استراتيجية التوجيه", + "fillFirst": "املأ أولاً", + "fillFirstDesc": "استخدم الحسابات بترتيب الأولوية", + "roundRobin": "جولة روبن", + "roundRobinDesc": "التنقل بين جميع الحسابات", + "p2c": "P2C", + "p2cDesc": "اختر 2 عشوائيًا، واستخدم الأكثر صحة", + "random": "عشوائي", + "randomDesc": "حساب عشوائي لكل طلب", + "leastUsed": "الأقل استخدامًا", + "leastUsedDesc": "اختر الحساب الأقل استخدامًا مؤخرًا", + "costOpt": "خيار التكلفة", + "costOptDesc": "تفضل أرخص حساب متاح", + "stickyLimit": "الحد اللزج", + "stickyLimitDesc": "المكالمات لكل حساب قبل التبديل", + "modelAliases": "الأسماء المستعارة النموذجية", + "modelAliasesDesc": "أنماط أحرف البدل لإعادة تعيين أسماء النماذج • استخدم * و؟", + "aliasPatternPlaceholder": "كلود السوناتة-*", + "aliasTargetPlaceholder": "كلود السوناتة-4-20250514", + "pattern": "نمط", + "targetModel": "نموذج الهدف", + "add": "+ أضف", + "session": "جلسة", + "sessionDetailsAria": "تفاصيل الجلسة", + "status": "الحالة", + "authenticated": "مصادقة", + "guest": "ضيف", + "loginTime": "وقت تسجيل الدخول", + "sessionAge": "عمر الجلسة", + "browser": "المتصفح", + "clearLocalData": "مسح البيانات المحلية", + "logout": "تسجيل الخروج", + "clearLocalDataConfirm": "هل تريد مسح كافة البيانات المحلية؟ سيؤدي هذا إلى إعادة ضبط تفضيلاتك.", + "unknown": "غير معروف", + "systemActor": "نظام", + "ipAccessControl": "التحكم في الوصول إلى IP", + "ipAccessControlDesc": "حظر أو السماح بعناوين IP محددة", + "ipModeDisabled": "معطل", + "ipModeBlacklist": "القائمة السوداء", + "ipModeWhitelist": "القائمة البيضاء", + "ipModeWhitelistPriority": "أولوية WL", + "addIpAddress": "أضف عنوان IP", + "ipAddressPlaceholder": "192.168.1.0/24 أو 10.0.*.*", + "block": "+ بلوك", + "allow": "+ السماح", + "blocked": "محظور ({count})", + "allowed": "مسموح به ({count})", + "temporaryBans": "الحظر المؤقت ({count})", + "minLeft": "{min} دقيقة متبقية", + "auditLog": "سجل التدقيق", + "searchAuditLogs": "البحث في سجلات التدقيق...", + "failedLoadAuditLog": "فشل تحميل سجل التدقيق", + "noAuditEvents": "لم يتم العثور على أحداث التدقيق", + "action": "العمل", + "actor": "ممثل", + "details": "التفاصيل", + "time": "الوقت", + "fallbackChainsTitle": "سلاسل احتياطية", + "fallbackChainsDesc": "تحديد الترتيب الاحتياطي للموفر لكل نموذج", + "addChain": "+ إضافة سلسلة", + "modelName": "اسم النموذج", + "modelNamePlaceholder": "كلود السوناتة-4-20250514", + "providersCommaSeparated": "مقدمو الخدمة (مفصولون بفواصل، حسب ترتيب الأولوية)", + "providersCommaSeparatedPlaceholder": "أنثروبي، أوبيناي، الجوزاء", + "createChain": "إنشاء سلسلة", + "noFallbackChains": "لا سلاسل احتياطية", + "noFallbackChainsDesc": "قم بإنشاء سلسلة لتحديد الترتيب الاحتياطي للموفر للنموذج.", + "loadingFallbackChains": "جارٍ تحميل السلاسل الاحتياطية...", + "deleteChainConfirm": "هل تريد حذف السلسلة الاحتياطية لـ \"{model}\"؟", + "chainCreated": "تم إنشاء السلسلة لـ {model}", + "chainDeleted": "تم حذف السلسلة لـ {model}", + "failedCreateChain": "فشل في إنشاء السلسلة", + "failedDeleteChain": "فشل في حذف السلسلة", + "deleteChain": "حذف السلسلة", + "fillModelAndProviders": "يرجى ملء اسم النموذج ومقدمي الخدمات", + "addAtLeastOneProvider": "قم بإضافة مزود واحد على الأقل", + "comboDefaultsTitle": "افتراضيات التحرير والسرد", + "globalComboConfig": "تكوين التحرير والسرد العالمي", + "defaultStrategy": "الإستراتيجية الافتراضية", + "defaultStrategyDesc": "يتم تطبيقه على المجموعات الجديدة بدون استراتيجية واضحة", + "comboStrategyAria": "استراتيجية التحرير والسرد", + "priority": "الأولوية", + "weighted": "مرجح", + "maxRetriesLabel": "ماكس إعادة المحاولة", + "retryDelayLabel": "تأخير إعادة المحاولة (ملي ثانية)", + "timeoutLabel": "المهلة (مللي ثانية)", + "healthCheck": "فحص الصحة", + "healthCheckDesc": "التحقق المسبق من توفر الموفر", + "trackMetrics": "تتبع المقاييس", + "trackMetricsDesc": "تسجيل مقاييس الطلب لكل مجموعة", + "providerOverrides": "تجاوزات الموفر", + "providerOverridesDesc": "تجاوز المهلة وإعادة المحاولة لكل مزود. تتجاوز إعدادات الموفر الإعدادات الافتراضية العامة.", + "providerMaxRetriesAria": "{provider} الحد الأقصى لعدد مرات إعادة المحاولة", + "providerTimeoutAria": "{provider} المهلة مللي ثانية", + "removeProviderOverrideAria": "قم بإزالة تجاوز {provider}", + "newProviderNamePlaceholder": "على سبيل المثال جوجل، افتحي...", + "newProviderNameAria": "اسم المزود الجديد", + "retries": "إعادة المحاولة", + "ms": "مللي", + "saveComboDefaults": "حفظ إعدادات التحرير والسرد الافتراضية", + "maxNestingDepth": "أقصى عمق التعشيش", + "concurrencyPerModel": "التزامن/النموذج", + "queueTimeout": "مهلة قائمة الانتظار (مللي ثانية)", + "providerProfiles": "ملفات تعريف المزود", + "providerProfilesDesc": "إعدادات مرونة منفصلة لموفري OAuth (القائم على الجلسة) ومفتاح API (المقيّد). لدى موفري OAuth حدود أكثر صرامة بسبب انخفاض حدود الأسعار.", + "oauthProviders": "موفري OAuth", + "apiKeyProviders": "موفري مفاتيح API", + "transientCooldown": "فترة التهدئة العابرة", + "rateLimitCooldown": "حد معدل التهدئة", + "maxBackoffLevel": "الحد الأقصى لمستوى التراجع", + "cbThreshold": "عتبة CB", + "cbResetTime": "وقت إعادة ضبط CB", + "rateLimiting": "الحد من المعدل", + "rateLimitingDesc": "يتم تحديد معدل موفري API Key تلقائيًا باستخدام الإعدادات الافتراضية الآمنة. يتم تعلم الحدود من رؤوس الاستجابة وتكييفها بمرور الوقت.", + "defaultSafetyNet": "شبكة الأمان الافتراضية", + "rpm": "دورة في الدقيقة", + "minGap": "مين جاب", + "maxConcurrent": "ماكس المتزامنة", + "activeLimiters": "المحددات النشطة", + "noActiveLimiters": "لا توجد محددات معدل نشطة حتى الآن.", + "reservoir": "الخزان", + "running": "الجري", + "queued": "في قائمة الانتظار", + "circuitBreakers": "قواطع الدائرة", + "breakerStateClosed": "مغلق", + "breakerStateOpen": "مفتوح", + "breakerStateHalfOpen": "نصف مفتوح", + "tripped": "{count} تعثرت", + "healthy": "{count} صحي", + "resetAll": "إعادة ضبط الكل", + "noCircuitBreakers": "لا توجد قواطع دوائر نشطة حتى الآن. يتم إنشاؤها تلقائيًا عندما تتدفق الطلبات عبر مسار التحرير والسرد.", + "failures": "{count} الفشل (الإخفاقات)", + "policiesLocked": "السياسات والمعرفات المقفلة", + "allOperational": "جميع الأنظمة جاهزة للعمل - لا توجد عمليات إغلاق أو قواطع متعثرة", + "loadingPolicies": "جارٍ تحميل السياسات...", + "lockedIdentifiers": "معرفات مقفلة", + "unlockedIdentifier": "مفتوح: {identifier}", + "sinceDate": "منذ {date}", + "forceUnlock": "فتح القوة", + "unlocking": "جارٍ الفتح...", + "failedUnlock": "فشل في فتح القفل", + "failedLoadWithStatus": "فشل التحميل: {status}", + "failedLoadResilience": "فشل تحميل حالة المرونة", + "saveFailed": "فشل الحفظ", + "resetFailed": "فشلت إعادة التعيين", + "loadingResilience": "جارٍ تحميل حالة المرونة...", + "retry": "أعد المحاولة", + "systemStorage": "النظام والتخزين", + "allDataLocal": "جميع البيانات المخزنة محليا على جهازك", + "databasePath": "مسار قاعدة البيانات", + "exportDatabase": "تصدير قاعدة البيانات", + "exportAll": "تصدير الكل (.tar.gz)", + "importDatabase": "استيراد قاعدة البيانات", + "confirmDbImport": "تأكيد استيراد قاعدة البيانات", + "confirmDbImportDesc": "سيؤدي هذا إلى استبدال كافة البيانات الحالية بالمحتوى من {file}. سيتم إنشاء نسخة احتياطية تلقائيًا قبل الاستيراد.", + "yesImport": "نعم استيراد", + "lastBackup": "النسخ الاحتياطي الأخير", + "noBackupYet": "لا يوجد نسخة احتياطية حتى الآن", + "backupNow": "النسخ الاحتياطي الآن", + "backupRestore": "النسخ الاحتياطي والاستعادة", + "viewBackups": "عرض النسخ الاحتياطية", + "hide": "إخفاء", + "backupRetentionDesc": "يتم إنشاء لقطات قاعدة البيانات تلقائيًا قبل الاستعادة وكل 15 دقيقة عند تغيير البيانات. الاحتفاظ: 24 ساعة + 30 نسخة احتياطية يومية مع التدوير الذكي.", + "loadingBackups": "جارٍ تحميل النسخ الاحتياطية...", + "noBackupsYet": "لا توجد نسخ احتياطية متاحة حتى الآن. سيتم إنشاء النسخ الاحتياطية تلقائيًا عند تغيير البيانات.", + "backupsAvailable": "{count} النسخ الاحتياطية متاحة", + "refresh": "تحديث", + "confirm": "تأكيد؟", + "yes": "نعم", + "no": "لا", + "restore": "استعادة", + "invalidFileType": "نوع الملف غير صالح. يتم قبول ملفات .sqlite فقط.", + "exportFailed": "فشل التصدير", + "exportFailedWithError": "فشل التصدير: {error}", + "fullExportFailedWithError": "فشل التصدير الكامل: {error}", + "backupCreated": "تم إنشاء النسخة الاحتياطية: {file}", + "restoreSuccess": "المستعادة! {connections} اتصالات، {nodes} عقد، {combos} مجموعات، {apiKeys} مفاتيح API.", + "importSuccess": "تم استيراد قاعدة البيانات! {connections} اتصالات، {nodes} عقد، {combos} مجموعات، {apiKeys} مفاتيح API.", + "justNow": "الآن فقط", + "minutesAgo": "{count} منذ", + "hoursAgo": "{count}h منذ", + "daysAgo": "{count}d منذ", + "backupReasonManual": "دليل", + "backupReasonPreRestore": "استعادة مسبقة", + "connectionsCount": "{count, plural, one {# connection} other {# connections}}", + "noChangesSinceBackup": "لا توجد تغييرات منذ النسخ الاحتياطي الأخير", + "backupFailed": "فشل النسخ الاحتياطي", + "restoreFailed": "فشلت عملية الاستعادة", + "importFailed": "فشل الاستيراد", + "errorDuringRestore": "حدث خطأ أثناء الاستعادة", + "errorDuringImport": "حدث خطأ أثناء الاستيراد", + "modelPricing": "تسعير النموذج", + "modelPricingDesc": "تكوين معدلات التكلفة لكل نموذج • جميع الأسعار بالرموز المميزة $/1M", + "providers": "مقدمي الخدمات", + "registry": "التسجيل", + "priced": "مسعر", + "searchProvidersModels": "البحث عن موفري الخدمة أو النماذج...", + "showAll": "إظهار الكل", + "noProvidersMatch": "لا يوجد مقدمي خدمات مطابقين لبحثك.", + "howPricingWorks": "كيف يعمل التسعير", + "cacheWrite": "كتابة ذاكرة التخزين المؤقت", + "unsaved": "غير محفوظ", + "resetDefaults": "إعادة تعيين الإعدادات الافتراضية", + "saveProvider": "حفظ المزود", + "saving": "جارٍ الحفظ...", + "model": "نموذج", + "models": "نماذج", + "moreProviders": "{count} المزيد من مقدمي الخدمة", + "withPricing": "مع تكوين التسعير", + "policiesCircuitBreakers": "السياسات وقواطع الدائرة", + "activeIssuesDetected": "تم اكتشاف مشكلات نشطة", + "off": "إيقاف", + "resetPricingConfirm": "هل تريد إعادة تعيين جميع أسعار {provider} إلى الإعدادات الافتراضية؟", + "pricingDescInput": "الإدخال: الرموز المرسلة إلى النموذج", + "pricingDescOutput": "الإخراج: الرموز التي تم إنشاؤها", + "pricingDescCached": "ذاكرة التخزين المؤقت: الإدخال المعاد استخدامه (~50% من معدل الإدخال)", + "pricingDescReasoning": "المنطق: رموز التفكير (يعود إلى الإخراج)", + "pricingDescCacheWrite": "كتابة ذاكرة التخزين المؤقت: إنشاء إدخالات ذاكرة التخزين المؤقت (يعود إلى الإدخال)", + "pricingDescFormula": "التكلفة = (الإدخال × معدل الإدخال) + (الإخراج × معدل الإخراج) + (التخزين المؤقت × معدل_التخزين المؤقت) لكل مليون رمز مميز.", + "pricingSettingsTitle": "إعدادات التسعير", + "totalModels": "نماذج إجمالية", + "active": "نشط", + "costCalculation": "حساب التكلفة", + "costCalculationDesc": "يتم حساب التكاليف بناءً على استخدام الرمز المميز ومعدلات التسعير التي تم تكوينها لكل نموذج.", + "pricingFormat": "تنسيق التسعير", + "pricingFormatDesc": "جميع الأسعار برموز $/1M (دولار لكل مليون رمز).", + "tokenTypes": "أنواع الرموز", + "inputTokenDesc": "الرموز السريعة القياسية", + "outputTokenDesc": "رموز الإكمال/الاستجابة", + "cachedTokenDesc": "رموز الإدخال المخزنة مؤقتًا (عادةً 50% من معدل الإدخال)", + "reasoningTokenDesc": "رموز الاستدلال/التفكير الخاصة (الرجوع إلى معدل الإنتاج)", + "cacheCreationTokenDesc": "الرموز المميزة المستخدمة لإنشاء إدخالات ذاكرة التخزين المؤقت (الرجوع إلى معدل الإدخال)", + "customPricingNote": "يمكنك تجاوز التسعير الافتراضي لنماذج محددة. تحظى التجاوزات المخصصة بالأولوية على الأسعار التي يتم اكتشافها تلقائيًا.", + "editPricing": "تحرير التسعير", + "viewFullDetails": "عرض التفاصيل الكاملة" + }, + "translator": { + "title": "مترجم", + "metaTitle": "ملعب المترجم | OmniRoute", + "metaDescription": "تصحيح واختبار وتصور ترجمات تنسيق واجهة برمجة التطبيقات (API) بين مقدمي الخدمة", + "playgroundTitle": "ملعب المترجم", + "playground": "ملعب", + "realtime": "نشاط الترجمة في الوقت الحقيقي", + "chatTester": "اختبار الدردشة", + "testBench": "مقعد الاختبار", + "liveMonitor": "مراقب مباشر", + "modeDescriptionPlayground": "الصق أي نص طلب واجهة برمجة التطبيقات (API) وشاهد كيف يقوم OmniRoute بترجمته بين تنسيقات الموفر (OpenAI ↔ Claude ↔ Gemini ↔ Responses API)", + "modeDescriptionChatTester": "أرسل طلبات دردشة حقيقية من خلال OmniRoute وافحص الرحلة الكاملة ذهابًا وإيابًا: الإدخال، والطلب المترجم، واستجابة الموفر، والمخرجات المترجمة.", + "modeDescriptionTestBench": "قم بتشغيل السيناريوهات المحددة مسبقًا وقارن التوافق عبر الموفرين والنماذج.", + "modeDescriptionLiveMonitor": "شاهد أحداث الترجمة في الوقت الفعلي أثناء تدفق الطلبات عبر OmniRoute.", + "modeDescriptionFallback": "تصحيح الأخطاء واختبارها وتصور كيفية قيام OmniRoute بترجمة طلبات واجهة برمجة التطبيقات (API) بين مقدمي الخدمة.", + "recentTranslations": "الترجمات الأخيرة", + "noTranslations": "لا توجد ترجمات بعد", + "source": "المصدر", + "target": "الهدف", + "time": "الوقت", + "model": "نموذج", + "status": "الحالة", + "latency": "الكمون", + "totalTranslations": "إجمالي الترجمات", + "successful": "ناجح", + "errors": "أخطاء", + "avgLatency": "متوسط الكمون", + "millisecondsShort": "{value}ms", + "notAvailableSymbol": "—", + "liveAutoRefreshing": "مباشر - التحديث التلقائي", + "paused": "متوقف مؤقتًا", + "eventsAppearHint": "تظهر أحداث الترجمة هنا أثناء تدفق الطلبات عبر OmniRoute. استخدم أيًا من هذه الطرق لإنشاء الأحداث:", + "chatTesterTab": "علامة تبويب اختبار الدردشة", + "testBenchTab": "علامة التبويب اختبار البدلاء", + "externalApiCalls": "مكالمات API الخارجية", + "ideCliIntegrations": "تكاملات IDE/CLI", + "inMemoryNote": "ملاحظة: يتم تخزين الأحداث في الذاكرة وإعادة تعيينها عند إعادة تشغيل الخادم.", + "ok": "حسنًا", + "errorShort": "خطأ", + "formatConverter": "محول التنسيق", + "formatConverterDescription": "الصق أو اكتب نص طلب JSON. سيقوم المترجم بالكشف التلقائي عن التنسيق المصدر وتحويله إلى التنسيق الهدف. استخدم هذا لتصحيح كيفية ترجمة OmniRoute للطلبات بين التنسيقات (OpenAI ↔ Claude ↔ Gemini ↔ Responses API).", + "input": "الإدخال", + "output": "الإخراج", + "auto": "تلقائي", + "swapFormats": "تبادل الصيغ", + "translateAction": "ترجمة", + "clear": "واضح", + "inputPlaceholder": "الصق نص الطلب هنا أو حدد القالب أدناه...", + "exampleTemplates": "قوالب سبيل المثال", + "exampleTemplatesHint": "- انقر للتحميل", + "templateLoadHint": "يقوم القالب بتحميل الطلب بتنسيق {format}. قم بتغيير تنسيق المصدر للتحميل بتنسيق مختلف.", + "compatibilityTester": "اختبار التوافق", + "compatibilityReport": "تقرير التوافق", + "testBenchDescription": "قم بتشغيل سيناريوهات محددة مسبقًا (الدردشة البسيطة، واستدعاء الأدوات، وما إلى ذلك) للتحقق من توافق الترجمة وموفر الخدمة. حدد تنسيق المصدر والموفر المستهدف، ثم قم بإجراء جميع الاختبارات لمعرفة نسبة التوافق. استخدم هذا للعثور على الميزات التي تعمل عبر مقدمي الخدمة.", + "targetProvider": "مقدم الهدف", + "runAllTests": "تشغيل كافة الاختبارات", + "runTest": "تشغيل الاختبار", + "reRun": "إعادة تشغيل", + "running": "جارٍ...", + "passed": "مرت", + "failed": "فشل", + "passedIconLabel": "✅ نجح", + "chunks": "قطع", + "scenarioSimpleChat": "دردشة بسيطة", + "scenarioToolCalling": "استدعاء الأداة", + "scenarioMultiTurn": "متعدد المنعطفات", + "scenarioThinking": "التفكير", + "scenarioSystemPrompt": "موجه النظام", + "scenarioStreaming": "الجري", + "templateNames": { + "simple-chat": "دردشة بسيطة", + "tool-calling": "استدعاء الأداة", + "multi-turn": "متعدد المنعطفات", + "thinking": "التفكير", + "system-prompt": "موجه النظام", + "streaming": "الجري" + }, + "templateDescriptions": { + "simple-chat": "رسالة نصية أساسية", + "tool-calling": "استدعاء الوظيفة/الأداة", + "multi-turn": "حوار مع التاريخ", + "thinking": "التفكير الموسع / الاستدلال", + "system-prompt": "تعليمات النظام المعقدة", + "streaming": "طلب تدفق SSE" + }, + "templatePayloads": { + "simpleChat": { + "system": "أنت مساعد مفيد.", + "userGreeting": "مرحبا! كيف حالك اليوم؟" + }, + "toolCalling": { + "userWeather": "ما هو الطقس في ساو باولو ؟", + "toolDescription": "الحصول على الطقس الحالي لموقع ما", + "cityNameDescription": "اسم المدينة" + }, + "multiTurn": { + "system": "أنت مساعد الترميز.", + "userInitial": "اكتب دالة لفرز مصفوفة في بايثون.", + "assistantExample": "إليك وظيفة فرز بسيطة:\n\n```بيثون\nتعريفsort_array(arr):\n العودة مرتبة (arr)\n```", + "userFollowUp": "الآن قم بفرزها بترتيب تنازلي." + }, + "thinking": { + "question": "ما هو مجموع أول 100 عدد أولي؟" + }, + "systemPrompt": { + "systemInstruction": "أنت مهندس برمجيات كبير متخصص في الأنظمة الموزعة. أجب عن الأسئلة بإيجاز باستخدام أفضل ممارسات الصناعة. قم دائمًا بتقديم أمثلة التعليمات البرمجية عندما يكون ذلك مناسبًا. قم بتنسيق ردودك باستخدام تخفيض السعر.", + "question": "كيف يمكنني تنفيذ نمط قاطع الدائرة؟" + }, + "streaming": { + "prompt": "أخبرني قصة قصيرة عن روبوت يتعلم الرسم." + } + }, + "openaiCompatibleLabel": "متوافق مع OpenAI", + "anthropicCompatibleLabel": "متوافق مع الأنثروبولوجيا", + "noTemplateForFormat": "لا يوجد قالب لهذا التنسيق", + "translationFailed": "فشلت الترجمة: {error}", + "pipelineDebugger": "مصحح أخطاء خطوط الأنابيب", + "translationPipeline": "خط أنابيب الترجمة", + "pipelineVisualization": "تصور خطوط الأنابيب", + "pipelineVisualizationHint": "أرسل رسالة لترى كيف يتدفق طلبك من خلال الكشف → الترجمة → الاتصال بالمزود.", + "chatTesterDescription": "أرسل الرسائل بتنسيق عميل محدد وافحص كل خطوة من خطوات الترجمة.", + "chatTesterFlow": "طلب العميل ← اكتشاف التنسيق ← OpenAI Intermediate ← تنسيق الموفر ← الاستجابة", + "clickStepToInspect": "انقر فوق أي خطوة لفحص البيانات في تلك المرحلة.", + "clientFormat": "تنسيق العميل", + "provider": "مزود", + "modelPlaceholder": "حدد أو اكتب اسم الطراز...", + "sendMessageToSeePipeline": "أرسل رسالة لرؤية مسار الترجمة", + "chatMessageHintPrefix": "سيتم تنسيق رسالتك كـ", + "chatMessageHintSuffix": "الطلب، وترجمته عبر المسار، وإرساله إلى الموفر المحدد.", + "youWithFormat": "أنت ({format})", + "assistant": "مساعد", + "typeMessage": "اكتب رسالة...", + "send": "أرسل", + "clientRequest": "طلب العميل", + "clientRequestDescription": "نص الطلب كما سيرسله عميلك", + "formatDetected": "تم الكشف عن التنسيق", + "formatDetectedDescription": "يقوم OmniRoute بالكشف التلقائي عن تنسيق واجهة برمجة التطبيقات (API) من بنية الطلب", + "openaiIntermediate": "OpenAI المتوسطة", + "openaiIntermediateDescription": "يتم أولاً تطبيع جميع التنسيقات إلى تنسيق OpenAI (الجسر العالمي)", + "providerFormat": "تنسيق الموفر", + "providerFormatDescription": "تتم ترجمة تنسيق OpenAI إلى التنسيق الأصلي للموفر", + "providerResponse": "استجابة المزود", + "providerResponseRawDescription": "الاستجابة الأولية من واجهة برمجة تطبيقات الموفر", + "providerResponseSseDescription": "دفق SSE الخام من واجهة برمجة تطبيقات الموفر", + "unexpectedError": "حدث خطأ غير متوقع", + "error": "خطأ", + "errorMessage": "خطأ: {message}", + "requestFailed": "فشل الطلب", + "noTextExtracted": "(لم يتم استخراج النص)", + "liveMonitorDescriptionPrefix": "يعرض أحداث الترجمة أثناء تدفق مكالمات API عبر OmniRoute. تأتي الأحداث من المخزن المؤقت في الذاكرة (يتم إعادة التعيين عند إعادة التشغيل). استخدم", + "liveMonitorDescriptionSuffix": "أو مكالمات API الخارجية لإنشاء الأحداث." + }, + "usage": { + "title": "الاستخدام", + "loggerTab": "المسجل", + "proxyTab": "وكيل", + "budgetManagement": "إدارة الميزانية", + "budgetSaved": "تم حفظ حدود الميزانية", + "budgetSaveFailed": "فشل في حفظ الميزانية", + "loadingBudgetData": "جارٍ تحميل بيانات الميزانية...", + "noApiKeysTitle": "لا توجد مفاتيح API", + "noApiKeysDescription": "أضف مفاتيح واجهة برمجة التطبيقات (API) أولاً لإعداد حدود الميزانية.", + "apiKey": "مفتاح واجهة برمجة التطبيقات", + "todaysSpend": "إنفاق اليوم", + "thisMonth": "هذا الشهر", + "setLimits": "تعيين الحدود", + "dailyLimitUsd": "الحد اليومي (دولار أمريكي)", + "monthlyLimitUsd": "الحد الشهري (دولار أمريكي)", + "warningThresholdPercent": "عتبة التحذير (%)", + "dailyLimitPlaceholder": "على سبيل المثال 5.00", + "monthlyLimitPlaceholder": "على سبيل المثال 50.00", + "warningThresholdPlaceholder": "80", + "saveLimits": "حفظ الحدود", + "budgetOk": "الميزانية جيدة — {remaining} متبقية", + "budgetExceeded": "تم تجاوز الميزانية — قد يتم حظر الطلبات", + "totalRequests": "إجمالي الطلبات", + "noDataYet": "لا توجد بيانات حتى الآن", + "latency": "الكمون", + "latencyP50": "ص50", + "latencyP95": "ص95", + "latencyP99": "ص99", + "promptCache": "ذاكرة التخزين المؤقت الفوري", + "systemHealth": "صحة النظام", + "entries": "إدخالات", + "activeCount": "{count} نشط", + "openCircuitBreakersDetected": "تم اكتشاف قواطع الدائرة المفتوحة", + "hitRate": "معدل الإصابة", + "hitsMisses": "الزيارات / الأخطاء", + "circuitBreakers": "قواطع الدائرة", + "lockedIPs": "عناوين IP المقفلة", + "lockoutsAutoRefreshHint": "أقفال حد المعدل لكل طراز • التحديث التلقائي لمدة 10 ثوانٍ", + "lockedCount": "{count, plural, one {# locked} other {# locked}}", + "timeLeft": "{time} اليسار", + "howItWorks": "كيف يعمل", + "howItWorksSubtitle": "تعرف على كيفية التحقق من صحة التقييمات من استجابات LLM الخاصة بك", + "define": "تحديد", + "defineStepDescription": "أنشئ حالات اختبار باستخدام مطالبات الإدخال ومعايير الإخراج المتوقعة باستخدام إستراتيجيات مثل الاحتواء أو التعبير العادي أو المطابقة التامة.", + "run": "تشغيل", + "runStepDescription": "قم بتنفيذ حالات الاختبار على نقاط نهاية LLM الخاصة بك من خلال OmniRoute. يتم إرسال كل حالة كطلب API حقيقي.", + "evaluate": "تقييم", + "evaluateStepDescription": "تتم مقارنة الاستجابات بالمعايير المتوقعة. راجع النجاح/الفشل لكل حالة باستخدام مقاييس زمن الاستجابة والتعليقات التفصيلية.", + "evalSuites": "أجنحة التقييم", + "evalSuitesHint": "انقر فوق مجموعة لعرض حالات الاختبار، ثم قم بالتشغيل لتقييم نقاط نهاية LLM الخاصة بك", + "evalsLoading": "جارٍ تحميل مجموعات التقييم...", + "noEvalSuitesFound": "لم يتم العثور على أجنحة Eval", + "noEvalSuitesDescription": "يمكن تعريف مجموعات Eval عبر واجهة برمجة التطبيقات (API) أو في التعليمات البرمجية. يقومون باختبار مخرجات النموذج مقابل النتائج المتوقعة باستخدام إستراتيجيات مثل الاحتواء والتعبير العادي والمطابقة التامة والوظائف المخصصة.", + "columnCase": "القضية", + "columnStatus": "الحالة", + "columnLatency": "الكمون", + "columnDetails": "التفاصيل", + "columnModel": "نموذج", + "columnStrategy": "استراتيجية", + "columnExpected": "متوقع", + "statsSuites": "أجنحة", + "statsTestCases": "حالات الاختبار", + "statsModels": "نماذج", + "statsCoverage": "التغطية", + "statsStrategiesCount": "إستراتيجيات {count}", + "evaluationStrategies": "استراتيجيات التقييم", + "modelsUnderTest": "نماذج تحت الاختبار", + "searchSuitesPlaceholder": "أجنحة البحث...", + "passSuffix": "تمرير", + "casesCount": "{count, plural, one {# case} other {# cases}}", + "runEval": "تشغيل التقييم", + "runningProgress": "جارٍ تشغيل {current}/{total}...", + "passRate": "معدل النجاح", + "summaryBreakdown": "تم اجتياز {passed} · فشل {failed} · {total} الإجمالي", + "passedIconLabel": "✅ نجح", + "failedIconLabel": "❌فشل", + "detailsContains": "يحتوي على: \"{term}\"", + "detailsRegex": "التعبير العادي: {pattern}", + "detailsExpected": "المتوقع: \"{expected}\"", + "noResultsYet": "لا توجد نتائج حتى الآن", + "testCasesCount": "حالات الاختبار ({count})", + "noTestCasesDefined": "لم يتم تحديد حالات الاختبار", + "runEvalHint": "انقر فوق \"Run Eval\" لتنفيذ جميع الحالات ضد نقطة نهاية LLM الخاصة بك. يرسل كل اختبار طلبًا حقيقيًا عبر OmniRoute.", + "notifyNoTestCases": "لم يتم تحديد حالات اختبار لهذه المجموعة", + "notifyAllCasesPassed": "تم اجتياز جميع حالات {total} ✅", + "notifySomeCasesFailed": "تم اجتياز {passed}/{total}، وفشل {failed}", + "notifyEvalRunFailed": "فشل تشغيل التقييم", + "notifyEvalTitle": "التقييم: {name}", + "modelEvals": "التقييمات النموذجية", + "evalsHeroDescription": "قم باختبار نقاط نهاية LLM الخاصة بك والتحقق من صحتها عن طريق تشغيل مجموعات التقييم المحددة مسبقًا. تحتوي كل مجموعة على حالات اختبار ترسل مطالبات حقيقية من خلال OmniRoute وتقارن الاستجابات بالمعايير المتوقعة - مما يساعدك على اكتشاف التراجعات ومقارنة النماذج وضمان جودة الاستجابة عبر مقدمي الخدمة.", + "qualityValidation": "التحقق من الجودة", + "modelComparison": "مقارنة النماذج", + "regressionDetection": "كشف الانحدار", + "latencyBenchmarks": "مقاييس الكمون", + "modelLockouts": "عمليات الإغلاق النموذجية", + "noLockouts": "لا توجد نماذج مقفلة حاليا", + "activeSessions": "الجلسات النشطة", + "noSessions": "لا توجد جلسات نشطة", + "sessionsHint": "تظهر الجلسات أثناء تدفق الطلبات عبر الوكيل", + "sessionsTrackedHint": "تتبع عن طريق طلب البصمات • التحديث التلقائي 5S", + "session": "جلسة", + "age": "العمر", + "requests": "الطلبات", + "connection": "اتصال", + "durationMillisecondsShort": "{value}ms", + "durationSecondsShort": "{value}s", + "durationMinutesShort": "{value}م", + "durationHoursShort": "{value}h", + "reasonSeparator": " - ", + "notAvailableSymbol": "-", + "providerLimits": "حدود المزود", + "noProviders": "لا يوجد مقدمي خدمات متصلين", + "connectProvidersForQuota": "اتصل بموفري خدمة OAuth لتتبع حدود حصص واجهة برمجة التطبيقات (API) واستخدامها.", + "accountsCount": "{count, plural, one {# account} other {# accounts}}", + "filteredFromCount": "(تمت التصفية من {count})", + "autoRefresh": "التحديث التلقائي", + "refreshAll": "تحديث الكل", + "loadingQuotas": "جار التحميل...", + "account": "الحساب", + "modelQuotas": "الحصص النموذجية", + "lastUsed": "آخر استخدام", + "actions": "الإجراءات", + "refreshQuota": "تحديث الحصة", + "today": "اليوم", + "tomorrow": "غدا", + "dayTimeFormat": "{day}، {time}", + "inDuration": "في {duration}", + "notApplicable": "لا يوجد", + "rawPlanWithValue": "الخطة الأولية: {plan}", + "noPlanFromProvider": "لا توجد خطة من المزود", + "noQuotaData": "لا توجد بيانات الحصص", + "noQuotaDataAvailable": "لا توجد بيانات الحصص المتاحة", + "noAccountsForTierFilter": "لم يتم العثور على حسابات لمرشح الطبقة", + "tierAll": "الكل", + "tierEnterprise": "المؤسسة", + "tierTeam": "فريق", + "tierBusiness": "الأعمال", + "tierUltra": "الترا", + "tierPro": "برو", + "tierPlus": "زائد", + "tierFree": "مجاني", + "tierUnknown": "غير معروف" + }, + "modals": { + "waitingAuth": "في انتظار التصريح", + "verificationUrl": "عنوان URL للتحقق", + "yourCode": "الرمز الخاص بك", + "remoteAccess": "الوصول عن بعد:", + "connectedSuccess": "تم الاتصال بنجاح!", + "connectionFailed": "فشل الاتصال", + "chooseAuthMethod": "اختر طريقة المصادقة الخاصة بك:", + "awsBuilderId": "معرف منشئ AWS", + "awsIamIdentity": "مركز هوية AWS IAM", + "googleAccount": "حساب جوجل", + "githubAccount": "حساب جيثب", + "importToken": "رمز الاستيراد", + "pasteToken": "قم بلصق رمز التحديث من Kiro IDE.", + "awsRegion": "منطقة أوس", + "autoDetecting": "الكشف التلقائي عن الرموز...", + "readingFromCache": "القراءة من ذاكرة التخزين المؤقت لـ AWS SSO", + "readingFromCursor": "القراءة من قاعدة بيانات المؤشر IDE", + "initializing": "جارٍ التهيئة...", + "pricingConfig": "تكوين التسعير", + "loadingPricing": "جارٍ تحميل بيانات الأسعار...", + "pricingRatesFormat": "تنسيق أسعار التسعير", + "noPricingData": "لا توجد بيانات التسعير المتاحة", + "noModelsFound": "لم يتم العثور على نماذج" + }, + "loggers": { + "allProviders": "جميع مقدمي الخدمات", + "allModels": "جميع الموديلات", + "allAccounts": "جميع الحسابات", + "allApiKeys": "جميع مفاتيح API", + "allTypes": "جميع الأنواع", + "allLevels": "جميع المستويات", + "modelAZ": "الموديل أ-ي", + "modelZA": "الموديل Z-A", + "loadingLogs": "جارٍ تحميل السجلات...", + "loadingProxyLogs": "جارٍ تحميل سجلات الوكيل...", + "noLogEntries": "لم يتم العثور على إدخالات السجل", + "noPayloadData": "لا توجد بيانات حمولة متاحة لإدخال السجل هذا.", + "proxyEvent": "حدث الوكيل", + "proxy": "وكيل", + "level": "المستوى", + "directNative": "مباشر (وطني)", + "combo": "كومبو", + "inputTokens": "أنا:", + "outputTokens": "يا:" + }, + "stats": { + "usageOverview": "نظرة عامة على الاستخدام", + "outputTokens": "رموز الإخراج", + "totalCost": "التكلفة الإجمالية", + "usageByModel": "الاستخدام حسب الموديل", + "usageByAccount": "الاستخدام عن طريق الحساب", + "failedToLoad": "فشل تحميل إحصائيات الاستخدام.", + "tokenHealth": "صحة الرمز", + "totalOAuth": "إجمالي OAuth", + "healthy": "صحي", + "warning": "تحذير", + "errored": "خطأ", + "lastCheck": "الاختيار الأخير", + "noData": "لا توجد بيانات", + "share": "شارك", + "unableToLoad": "غير قادر على تحميل مقاييس النظام", + "product": "المنتج", + "resources": "الموارد", + "company": "الشركة" + }, + "auth": { + "welcome": "مرحبًا", + "signIn": "تسجيل الدخول", + "enterPassword": "أدخل كلمة المرور الخاصة بك للمتابعة", + "password": "كلمة المرور", + "unifiedProxy": "وكيل API موحّد للذكاء الاصطناعي", + "unifiedAiApiProxy": "وكيل API موحّد للذكاء الاصطناعي", + "unifiedAiApiProxyDesc": "توجيه الطلبات إلى موفري الذكاء الاصطناعي المتعددين من خلال نقطة نهاية واحدة. موازنة التحميل وتجاوز الفشل وتتبع الاستخدام المدمج.", + "passwordNotEnabled": "لم يتم تمكين الحماية بكلمة المرور", + "loading": "جار التحميل...", + "invalidPassword": "كلمة المرور غير صالحة", + "errorOccurredRetry": "حدث خطأ. يرجى المحاولة مرة أخرى.", + "configureInstance": "دعنا نقوم بتكوين مثيل OmniRoute الخاص بك", + "runOnboardingWizard": "قم بتشغيل معالج الإعداد لإعداد كلمة المرور الخاصة بك وتوصيل أول مزود للذكاء الاصطناعي.", + "startOnboarding": "ابدأ الإعداد", + "secureYourInstance": "تأمين المثيل الخاص بك", + "setPasswordDescription": "قم بتعيين كلمة مرور لحماية لوحة المعلومات الخاصة بك وتأمين نقاط نهاية API الخاصة بك من الوصول غير المصرح به.", + "configurePassword": "تكوين كلمة المرور", + "continue": "متابعة", + "windowWillClose": "ستغلق هذه النافذة تلقائيا...", + "closeTabNow": "يمكنك إغلاق علامة التبويب هذه الآن.", + "copyUrlManual": "انسخ عنوان URL من شريط العنوان والصقه داخل التطبيق.", + "accessDeniedDescription": "ليس لديك إذن للوصول إلى هذا المورد. تحقق من مفتاح API الخاص بك أو اتصل بالمسؤول.", + "goToDashboard": "انتقل إلى لوحة المعلومات", + "featureMultiProviderTitle": "متعدد الموفر", + "featureMultiProviderDesc": "OpenAI، وAnthropic، وGoogle، والمزيد", + "featureLoadBalancingTitle": "موازنة التحميل", + "featureLoadBalancingDesc": "توزيع الطلبات بذكاء", + "featureUsageTrackingTitle": "تتبع الاستخدام", + "featureUsageTrackingDesc": "مراقبة التكاليف والرموز", + "resetPassword": "إعادة تعيين كلمة المرور", + "resetDescription": "اختر طريقة لاستعادة الوصول إلى لوحة المعلومات الخاصة بك", + "stopServer": "أوقف خادم OmniRoute", + "processing": "جارٍ المعالجة...", + "pleaseWait": "يرجى الانتظار حتى نكمل التفويض.", + "authSuccess": "تم التفويض بنجاح!", + "copyUrl": "انسخ عنوان URL هذا", + "accessDenied": "تم رفض الوصول", + "methodCliTitle": "الطريقة الأولى: إعادة تعيين CLI", + "methodCliDescription": "قم بتشغيل الأمر التالي على الخادم الذي يعمل عليه OmniRoute:", + "methodCliHint": "سيطالبك هذا بتعيين كلمة مرور جديدة. يجب إيقاف الخادم أولاً.", + "methodManualTitle": "الطريقة الثانية: إعادة الضبط اليدوي", + "methodManualDescription": "احذف كلمة المرور من قاعدة البيانات وقم بتعيين كلمة مرور جديدة عند بدء التشغيل:", + "setPasswordInYour": "عيّن كلمة مرور جديدة في ملف", + "fileLabelSuffix": "ملف:", + "newPasswordPlaceholder": "كلمة_مرور_جديدة", + "deleteSettingsFile": "حذف", + "orRemovePasswordHashField": "أو قم بإزالة حقل كلمة المرور", + "restartServerWithNewPassword": "أعد تشغيل الخادم وسيتم استخدام كلمة المرور الجديدة", + "backToLogin": "العودة إلى تسجيل الدخول", + "forgotPassword": "هل نسيت كلمة المرور؟" + }, + "landing": { + "brandName": "OmniRoute", + "navigateHome": "انتقل إلى المنزل", + "toggleMenu": "تبديل القائمة", + "featuresLink": "الميزات", + "docsLink": "المستندات", + "github": "جيثب", + "versionLive": "الإصدار 1.0 أصبح الآن مباشرًا", + "oneEndpoint": "نقطة نهاية واحدة ل", + "allProviders": "جميع مقدمي الذكاء الاصطناعي", + "heroDescription": "وكيل نقطة النهاية AI مع لوحة تحكم الويب - منفذ JavaScript لـ CLIProxyAPI. يعمل بسلاسة مع Claude Code وOpenAI Codex وCline وRooCode وأدوات CLI الأخرى.", + "getStarted": "ابدأ", + "viewOnGithub": "عرض على جيثب", + "powerfulFeatures": "ميزات قوية", + "featuresSubtitle": "كل ما تحتاجه لإدارة البنية الأساسية للذكاء الاصطناعي لديك في مكان واحد، مصمم خصيصًا للتوسع.", + "featureUnifiedEndpointTitle": "نقطة النهاية الموحدة", + "featureUnifiedEndpointDesc": "الوصول إلى جميع مقدمي الخدمة عبر عنوان URL قياسي واحد لواجهة برمجة التطبيقات (API).", + "featureEasySetupTitle": "إعداد سهل", + "featureEasySetupDesc": "ابدأ العمل في دقائق معدودة باستخدام أمر npx.", + "featureModelFallbackTitle": "نموذج احتياطي", + "featureModelFallbackDesc": "تبديل مقدمي الخدمة تلقائيًا في حالة الفشل أو زمن الوصول العالي.", + "featureUsageTrackingTitle": "تتبع الاستخدام", + "featureUsageTrackingDesc": "تحليلات مفصلة ومراقبة التكاليف عبر جميع النماذج.", + "featureOAuthApiKeysTitle": "مفاتيح OAuth وAPI", + "featureOAuthApiKeysDesc": "إدارة بيانات الاعتماد بشكل آمن في قبو واحد.", + "featureCloudSyncTitle": "مزامنة السحابة", + "featureCloudSyncDesc": "مزامنة التكوينات الخاصة بك عبر الأجهزة على الفور.", + "featureCliSupportTitle": "دعم سطر الأوامر", + "featureCliSupportDesc": "يعمل مع Claude Code وCodex وCline وCursor والمزيد.", + "featureDashboardTitle": "لوحة القيادة", + "featureDashboardDesc": "لوحة تحكم مرئية لتحليل حركة المرور في الوقت الحقيقي.", + "howItWorks": "كيف يعمل OmniRoute", + "howItWorksDescription": "تتدفق البيانات بسلاسة من تطبيقك عبر طبقة التوجيه الذكية الخاصة بنا إلى أفضل مزود لهذه المهمة.", + "howItWorksStep1Title": "1. واجهة سطر الأوامر (CLI) ومجموعات SDK", + "howItWorksStep1Description": "تبدأ طلباتك من أدواتك المفضلة أو SDK الموحد الخاص بنا. فقط قم بتغيير عنوان URL الأساسي.", + "howItWorksStep2Title": "2. مركز OmniRoute", + "howItWorksStep2Description": "يقوم محركنا بتحليل الموجه، والتحقق من صحة مقدم الخدمة، والمسارات للحصول على أقل زمن وصول أو تكلفة.", + "howItWorksStep3Title": "3. مقدمو الذكاء الاصطناعي", + "howItWorksStep3Description": "يتم تنفيذ الطلب بواسطة OpenAI أو Anthropic أو Gemini أو غيرهم على الفور.", + "getStartedIn30Seconds": "ابدأ في 30 ثانية", + "getStartedDescription": "قم بتثبيت OmniRoute، وقم بتكوين موفري الخدمة عبر لوحة تحكم الويب، وابدأ في توجيه طلبات الذكاء الاصطناعي.", + "installOmniRoute": "قم بتثبيت OmniRoute", + "installStepDescription": "قم بتشغيل الأمر npx لبدء الخادم على الفور", + "openDashboard": "افتح لوحة المعلومات", + "openDashboardStepDescription": "تكوين مقدمي الخدمات ومفاتيح API عبر واجهة الويب", + "routeRequests": "طلبات الطريق", + "routeRequestsStepDescription": "قم بتوجيه أدوات CLI الخاصة بك إلى {endpoint}", + "terminal": "محطة", + "copy": "نسخ", + "copied": "✓ منقول", + "startingOmniRoute": "بدء تشغيل OmniRoute...", + "serverRunningOnLabel": "الخادم قيد التشغيل", + "dashboardLabel": "لوحة القيادة", + "readyToRoute": "جاهز للتوجيه! ✓", + "configureProvidersNote": "📝 تكوين مقدمي الخدمات في لوحة القيادة أو استخدام متغيرات البيئة", + "dataLocation": "موقع البيانات:", + "dataLocationMacLinux": " ماك/لينكس:", + "dataLocationWindows": " ويندوز:", + "product": "المنتج", + "dashboardLink": "لوحة القيادة", + "changelog": "سجل التغيير", + "resources": "الموارد", + "documentation": "التوثيق", + "npm": "الآلية الوقائية الوطنية", + "legal": "قانوني", + "mitLicense": "رخصة معهد ماساتشوستس للتكنولوجيا", + "footerTagline": "نقطة النهاية الموحدة لتوليد الذكاء الاصطناعي. يمكنك الاتصال بموفري خدمات الذكاء الاصطناعي وتوجيههم وإدارتهم بسهولة.", + "copyright": "© {year} أومنيروتي. جميع الحقوق محفوظة.", + "flowToolClaudeCode": "كلود كود", + "flowToolOpenAICodex": "مخطوطة OpenAI", + "flowToolCline": "كلاين", + "flowToolCursor": "المؤشر", + "flowProviderOpenAI": "OpenAI", + "flowProviderAnthropic": "أنثروبي", + "flowProviderGemini": "الجوزاء", + "flowProviderGithubCopilot": "جيثب مساعد الطيار", + "interactiveDiagram": "رسم تخطيطي تفاعلي مرئي على سطح المكتب", + "ctaTitle": "هل أنت مستعد لتبسيط البنية الأساسية للذكاء الاصطناعي لديك؟", + "ctaDescription": "انضم إلى المطورين الذين يقومون بتبسيط عمليات تكامل الذكاء الاصطناعي الخاصة بهم مع OmniRoute. مفتوح المصدر ومجاني للبدء.", + "startFree": "ابدأ مجانًا", + "readDocumentation": "قراءة الوثائق" + }, + "docs": { + "title": "التوثيق", + "quickStart": "بداية سريعة", + "features": "الميزات", + "supportedProviders": "مقدمي الخدمات المدعومة", + "supportedProvidersToc": "مقدمي الخدمات", + "commonUseCases": "حالات الاستخدام الشائعة", + "clientCompatibility": "توافق العميل", + "apiReference": "مرجع واجهة برمجة التطبيقات", + "method": "الطريقة", + "path": "المسار", + "notes": "ملاحظات", + "modelPrefixes": "البادئات النموذجية", + "prefix": "بادئة", + "troubleshooting": "استكشاف الأخطاء وإصلاحها", + "supportsChat": "يدعم كلاً من نقاط نهاية الدردشة والردود.", + "oauthAutoRefresh": "اتصال OAuth مع التحديث التلقائي للرمز المميز.", + "fullStreaming": "دعم البث الكامل لجميع الموديلات.", + "docsLabel": "المستندات", + "docsHeroDescription": "بوابة الذكاء الاصطناعي لبرامج LLM متعددة الموفرين. نقطة نهاية واحدة لـ OpenAI وAnthropic وGemini وGitHub Copilot وClaude Code وCursor وأكثر من 20 مزودًا آخر.", + "openDashboard": "افتح لوحة المعلومات", + "endpointPage": "صفحة نقطة النهاية", + "github": "جيثب", + "reportIssue": "تقرير المشكلة", + "onThisPage": "في هذه الصفحة", + "documentationVersion": "التوثيق - v{version}", + "quickStartStep1Title": "1. التثبيت والتشغيل", + "quickStartStep1Prefix": "تشغيل", + "quickStartStep1Middle": "أو استنساخ من GitHub وتشغيله", + "quickStartStep2Title": "2. إنشاء مفتاح API", + "quickStartStep2Text": "انتقل إلى نقطة النهاية -> المفاتيح المسجلة. إنشاء مفتاح واحد لكل بيئة.", + "quickStartStep3Title": "3. ربط مقدمي الخدمات", + "quickStartStep3Text": "أضف حسابات الموفر عبر تسجيل الدخول إلى OAuth، أو مفتاح API، أو الاتصال التلقائي للطبقة المجانية.", + "quickStartStep4Title": "4. قم بتعيين عنوان URL لقاعدة العميل", + "quickStartStep4Prefix": "قم بتوجيه عميل IDE أو API الخاص بك إلى", + "quickStartStep4Suffix": "استخدم بادئة الموفر، على سبيل المثال", + "featureRoutingTitle": "التوجيه متعدد الموفرين", + "featureRoutingText": "توجيه الطلبات إلى أكثر من 30 من موفري خدمات الذكاء الاصطناعي من خلال نقطة نهاية واحدة متوافقة مع OpenAI. يدعم واجهات برمجة التطبيقات للدردشة والاستجابات والصوت والصورة.", + "featureCombosTitle": "المجموعات والموازنة", + "featureCombosText": "أنشئ مجموعات نماذج باستخدام سلاسل احتياطية واستراتيجيات موازنة: دورة روبن، والأولوية، والعشوائية، والأقل استخدامًا، والمُحسَّنة من حيث التكلفة.", + "featureUsageTitle": "تتبع الاستخدام والتكلفة", + "featureUsageText": "عد الرموز المميزة في الوقت الفعلي، وحساب التكلفة لكل مزود/نموذج، وتوزيع تفصيلي للاستخدام حسب مفتاح واجهة برمجة التطبيقات والحساب.", + "featureAnalyticsTitle": "لوحة تحكم التحليلات", + "featureAnalyticsText": "التحليلات المرئية مع الرسوم البيانية للطلبات والرموز المميزة والأخطاء ووقت الاستجابة والتكاليف وشعبية النموذج بمرور الوقت.", + "featureHealthTitle": "مراقبة الصحة", + "featureHealthText": "فحوصات صحية حية، وحالة المزود، وحالات قاطع الدائرة، والكشف التلقائي عن حد المعدل مع التراجع الأسي.", + "featureCliTitle": "أدوات سطر الأوامر", + "featureCliText": "إدارة تكوينات IDE، وتصدير/استيراد النسخ الاحتياطية، واكتشاف ملفات تعريف المخطوطة، وتكوين الإعدادات من لوحة المعلومات.", + "featureSecurityTitle": "الأمن والسياسات", + "featureSecurityText": "مصادقة مفتاح واجهة برمجة التطبيقات (API)، وتصفية IP، وحارس الحقن الفوري، وسياسات المجال، وإدارة الجلسة، وتسجيل التدقيق.", + "featureCloudSyncTitle": "مزامنة السحابة", + "featureCloudSyncText": "قم بمزامنة التكوين الخاص بك مع Cloudflare Workers للوصول عن بعد باستخدام بيانات الاعتماد المشفرة وتجاوز الفشل التلقائي.", + "providersAcrossConnectionTypes": "موفرو {count} عبر ثلاثة أنواع من الاتصال.", + "manageProviders": "إدارة مقدمي الخدمة", + "providersCount": "{count} مقدمو الخدمة", + "providerTypeFree": "الطبقة الحرة", + "providerTypeOAuth": "OAuth", + "providerTypeApiKey": "مفتاح واجهة برمجة التطبيقات", + "useCaseSingleEndpointTitle": "نقطة نهاية واحدة للعديد من مقدمي الخدمة", + "useCaseSingleEndpointText": "قم بتوجيه العملاء إلى عنوان URL أساسي واحد وتوجيههم حسب بادئة النموذج (على سبيل المثال: gh/، cc/، kr/، openai/).", + "useCaseFallbackTitle": "الاحتياطي وتبديل النموذج مع المجموعات", + "useCaseFallbackText": "قم بإنشاء نماذج مجمعة في Dashboard وحافظ على استقرار تكوين العميل أثناء تدوير مقدمي الخدمة داخليًا.", + "useCaseUsageVisibilityTitle": "الاستخدام والتكلفة ورؤية التصحيح", + "useCaseUsageVisibilityText": "تتبع الرموز المميزة والتكلفة حسب الموفر والحساب ومفتاح واجهة برمجة التطبيقات في علامتي التبويب \"الاستخدام\" و\"التحليلات\".", + "clientCherryStudioTitle": "ستوديو الكرز", + "baseUrlLabel": "عنوان URL الأساسي", + "chatEndpointLabel": "نقطة نهاية الدردشة", + "modelRecommendationLabel": "توصية النموذج: بادئة صريحة", + "clientCodexTitle": "نماذج Codex / GitHub Copilot", + "clientCodexBullet1": "استخدم معرفات النماذج مع", + "clientCodexBullet2": "نماذج عائلة Codex تتجه تلقائيًا إلى", + "clientCodexBullet3": "وتستمر النماذج غير التابعة للدستور الغذائي", + "clientCursorTitle": "بيئة تطوير متكاملة للمؤشر", + "clientCursorBullet1": "استخدم", + "clientCursorBullet1Suffix": "بادئة لنماذج المؤشر.", + "clientCursorBullet2": "اتصال OAuth - قم بتسجيل الدخول من صفحة مقدمي الخدمة.", + "clientClaudeTitle": "كلود كود / مضاد الجاذبية", + "clientClaudeBullet1Prefix": "استخدم", + "clientClaudeBullet1Middle": "(كلود) أو", + "clientClaudeBullet1Suffix": "(مضاد الجاذبية) البادئة.", + "endpointChatNote": "نقطة نهاية الدردشة المتوافقة مع OpenAI (افتراضي).", + "endpointResponsesNote": "نقطة نهاية واجهة برمجة التطبيقات للاستجابات (Codex، o-series).", + "endpointModelsNote": "كتالوج نموذجي لجميع مقدمي الخدمات المتصلين.", + "endpointAudioNote": "النسخ الصوتي (Deepgram، AssemblyAI).", + "endpointImagesNote": "توليد الصور (NanoBanana).", + "endpointRewriteChatNote": "إعادة كتابة المساعد للعملاء بدون /v1.", + "endpointRewriteResponsesNote": "أعد كتابة المساعد للاستجابات بدون /v1.", + "endpointRewriteModelsNote": "أعد كتابة المساعد لاكتشاف النموذج بدون /v1.", + "modelPrefixesDescriptionStart": "استخدم بادئة الموفر قبل اسم الطراز للتوجيه إلى موفر محدد. مثال:", + "modelPrefixesDescriptionEnd": "طرق إلى GitHub Copilot.", + "provider": "مزود", + "type": "اكتب", + "troubleshootingModelRouting": "إذا فشل العميل في توجيه النموذج، فاستخدم الموفر/النموذج الصريح (على سبيل المثال: gh/gpt-5.1-codex).", + "troubleshootingAmbiguousModels": "إذا تلقيت أخطاء نموذجية غامضة، فاختر بادئة الموفر بدلاً من معرف النموذج المجرد.", + "troubleshootingCodexFamily": "بالنسبة لنماذج عائلة GitHub Codex، احتفظ بالنموذج كـ gh/; يقوم جهاز التوجيه بتحديد/الاستجابات تلقائيًا.", + "troubleshootingTestConnection": "استخدم لوحة المعلومات > الموفرون > اختبار الاتصال قبل الاختبار من بيئات تطوير متكاملة أو عملاء خارجيين.", + "troubleshootingCircuitBreaker": "إذا أظهر مقدم الخدمة أن قاطع الدائرة مفتوح، فانتظر حتى فترة التهدئة أو راجع صفحة الصحة للحصول على التفاصيل.", + "troubleshootingOAuth": "بالنسبة لموفري OAuth، قم بإعادة المصادقة إذا انتهت صلاحية الرموز المميزة. تحقق من مؤشر حالة بطاقة المزود." + }, + "legal": { + "privacyPolicy": "سياسة الخصوصية", + "termsOfService": "شروط الخدمة", + "providerConfigurations": "تكوينات الموفر", + "apiKeys": "مفاتيح واجهة برمجة التطبيقات", + "usageLogs": "سجلات الاستخدام", + "applicationSettings": "إعدادات التطبيق", + "viewExportAnalytics": "عرض وتصدير تحليلات الاستخدام", + "clearHistory": "مسح سجل الاستخدام في أي وقت", + "configureRetention": "تكوين سياسات الاحتفاظ بالسجل", + "backupRestore": "النسخ الاحتياطي واستعادة قاعدة البيانات الخاصة بك", + "privacyMetadataTitle": "سياسة الخصوصية | OmniRoute", + "privacyMetadataDescription": "سياسة الخصوصية لجهاز التوجيه الوكيل OmniRoute AI API.", + "termsMetadataTitle": "شروط الخدمة | OmniRoute", + "termsMetadataDescription": "شروط الخدمة لجهاز التوجيه الوكيل OmniRoute AI API.", + "backToHome": "العودة إلى المنزل", + "lastUpdated": "آخر تحديث: {date}", + "policyLastUpdatedDate": "13 فبراير 2026", + "listSeparator": "-", + "questionsVisit": "أسئلة؟ قم بزيارة موقعنا", + "githubRepository": "مستودع جيثب", + "privacySection1Title": "1. العمارة المحلية الأولى", + "privacySection1Text": "تم تصميم OmniRoute كتطبيق محلي أولاً. تتم جميع عمليات معالجة البيانات وتخزينها بالكامل على جهازك. لا يوجد خادم مركزي يجمع معلوماتك.", + "privacySection2Title": "2. البيانات التي نقوم بتخزينها", + "privacyDataStoredIn": "يتم تخزين البيانات التالية محليًا في", + "privacyDataProviderConfigurationsDesc": "عناوين URL للاتصال وأنواع الموفرين وإعدادات الأولوية", + "privacyDataApiKeysDesc": "مشفرة ومخزنة محليًا للمصادقة مع موفري الذكاء الاصطناعي", + "privacyDataUsageLogsDesc": "عدد الطلبات واستخدام الرمز المميز وأسماء النماذج والطوابع الزمنية وأوقات الاستجابة", + "privacyDataApplicationSettingsDesc": "تفضيلات السمة، وإستراتيجية التوجيه، وتكوينات التحرير والسرد", + "privacySection3Title": "3. لا يوجد قياس عن بعد", + "privacySection3Text": "لا يقوم OmniRoute بجمع بيانات القياس عن بعد أو التحليلات أو تقارير الأعطال. لا يتم إرسال أي بيانات إلينا أو إلى أي طرف ثالث. تظل أنماط الاستخدام واستدعاءات API والتكوينات خاصة تمامًا.", + "privacySection4Title": "4. موفرو الذكاء الاصطناعي التابعون لجهات خارجية", + "privacySection4Text": "عند إجراء استدعاءات واجهة برمجة التطبيقات من خلال OmniRoute، تتم إعادة توجيه طلباتك إلى موفري الذكاء الاصطناعي الذين قمت بتكوينهم (على سبيل المثال: OpenAI، وAnthropic، وGoogle). لدى هؤلاء المزودين سياسات خصوصية خاصة بهم تحكم كيفية تعاملهم مع بياناتك. يرجى مراجعة:", + "privacyOpenAiPolicy": "سياسة خصوصية OpenAI", + "privacyAnthropicPolicy": "سياسة الخصوصية الإنسانية", + "privacyGooglePolicy": "سياسة خصوصية جوجل", + "privacySection5Title": "5. المزامنة السحابية (اختياري)", + "privacySection5Text": "إذا قمت بتمكين ميزة المزامنة السحابية الاختيارية، فقد يتم نقل تكوينات الموفر ومفاتيح API إلى نقطة نهاية سحابية تم تكوينها. يتم تعطيل هذه الميزة افتراضيًا وتتطلب الاشتراك الصريح.", + "privacySection6Title": "6. التسجيل", + "privacyLoggingIntro": "يمكن تكوين سجلات الطلب من خلال إعدادات لوحة المعلومات. يمكنك:", + "privacySection7Title": "7. حقوقك", + "privacySection7TextStart": "وبما أن جميع البيانات مخزنة محليًا، فلديك السيطرة الكاملة. يمكنك حذف بياناتك في أي وقت عن طريق إزالة", + "privacySection7TextEnd": "الدليل أو استخدام ميزات النسخ الاحتياطي واستعادة قاعدة البيانات في لوحة المعلومات.", + "termsSection1Title": "1. نظرة عامة", + "termsSection1Text": "OmniRoute هو أول جهاز توجيه وكيل محلي لواجهة برمجة التطبيقات (AI API) يعمل بالكامل على جهازك. يقوم بتوجيه الطلبات إلى العديد من موفري الذكاء الاصطناعي مع موازنة التحميل وتجاوز الفشل وتتبع الاستخدام.", + "termsSection2Title": "2. مسؤوليات المستخدم", + "termsResponsibilityApiKeys": "أنت وحدك المسؤول عن إدارة مفاتيح واجهة برمجة التطبيقات وبيانات الاعتماد الخاصة بك لموفري الذكاء الاصطناعي التابعين لجهات خارجية (OpenAI وAnthropic وGoogle وما إلى ذلك).", + "termsResponsibilityCompliance": "يجب عليك الالتزام بشروط الخدمة الخاصة بكل مزود للذكاء الاصطناعي الذي يمكنك الوصول إلى واجهة برمجة التطبيقات (API) الخاصة به من خلال OmniRoute.", + "termsResponsibilitySecurity": "أنت مسؤول عن أمان تثبيت OmniRoute المحلي لديك، بما في ذلك تعيين كلمة مرور وتقييد الوصول إلى الشبكة.", + "termsSection3Title": "3. كيف يعمل", + "termsSection3Text": "يعمل OmniRoute كوكيل وسيط. تتم ترجمة مكالمات API المرسلة إلى OmniRoute وإعادة توجيهها إلى موفري الذكاء الاصطناعي الذين تم تكوينهم. لا يقوم OmniRoute بتعديل محتوى طلباتك أو استجاباتك بما يتجاوز ترجمة البروتوكول الضرورية.", + "termsSection4Title": "4. التعامل مع البيانات", + "termsDataStoredLocally": "يتم تخزين جميع البيانات محليًا على جهازك في قاعدة بيانات SQLite.", + "termsNoTransmission": "لا يقوم OmniRoute بنقل أي بيانات إلى خوادم خارجية إلا إذا قمت بتمكين ميزات المزامنة السحابية بشكل صريح.", + "termsDataLocationText": "يتم تخزين سجلات الاستخدام ومفاتيح API والتكوين في", + "termsSection5Title": "5. إخلاء المسؤولية", + "termsSection5Text": "يتم توفير OmniRoute \"كما هو\" دون أي ضمان من أي نوع. نحن لسنا مسؤولين عن أي تكاليف يتم تكبدها من خلال استخدام واجهة برمجة التطبيقات (API)، أو انقطاع الخدمة، أو فقدان البيانات. احتفظ دائمًا بنسخ احتياطية من التكوين الخاص بك.", + "termsSection6Title": "6. المصدر المفتوح", + "termsSection6Text": "OmniRoute هو برنامج مفتوح المصدر. ولك الحرية في فحصه وتعديله وتوزيعه بموجب شروط ترخيصه." + } +} diff --git a/src/i18n/messages/bg.json b/src/i18n/messages/bg.json new file mode 100644 index 0000000000..2287401d25 --- /dev/null +++ b/src/i18n/messages/bg.json @@ -0,0 +1,2040 @@ +{ + "common": { + "save": "Запазване", + "cancel": "Отказ", + "delete": "Изтриване", + "loading": "Зареждане...", + "error": "Възникна грешка", + "success": "Успех", + "confirm": "сигурен ли си", + "refresh": "Опресняване", + "close": "затвори", + "add": "Добавете", + "edit": "Редактиране", + "search": "Търсене", + "back": "Назад", + "next": "Следваща", + "submit": "Изпратете", + "reset": "Нулиране", + "copy": "копие", + "copied": "Копирано!", + "enabled": "Активирано", + "disabled": "Забранено", + "active": "Активен", + "inactive": "Неактивен", + "noData": "Няма налични данни", + "configure": "Конфигуриране", + "manage": "Управлявайте", + "name": "Име", + "actions": "Действия", + "status": "Статус", + "type": "Тип", + "model": "Модел", + "models": "модели", + "provider": "Доставчик", + "account": "акаунт", + "time": "време", + "details": "Подробности", + "created": "Създаден", + "lastUsed": "Последно използвано", + "loadMore": "Зареди още", + "noResults": "Няма намерени резултати", + "reloadPage": "Презареди страницата", + "connected": "Свързан", + "disconnected": "Прекъсната връзка", + "notConfigured": "Не е конфигуриран", + "testConnection": "Тестова връзка", + "enable": "Активирайте", + "disable": "Деактивиране", + "columns": "Колони", + "newest": "Най-новите", + "oldest": "Най-старият", + "all": "Всички", + "none": "Няма", + "yes": "да", + "no": "не", + "warning": "Предупреждение", + "note": "Забележка", + "free": "безплатно", + "skipToContent": "Преминете към съдържанието" + }, + "sidebar": { + "home": "Начало", + "dashboard": "Табло", + "providers": "Доставчици", + "combos": "Комбота", + "usage": "Използване", + "analytics": "Анализ", + "costs": "Разходи", + "health": "здраве", + "limits": "Ограничения и квоти", + "cliTools": "CLI инструменти", + "settings": "Настройки", + "translator": "Преводач", + "docs": "Документи", + "issues": "Проблеми", + "endpoint": "Крайна точка", + "apiManager": "API мениджър", + "logs": "трупи", + "auditLog": "Дневник за одит", + "shutdown": "Изключване", + "restart": "Рестартирайте", + "shutdownConfirm": "Изключване на OmniRoute?", + "restartConfirm": "Рестартиране на OmniRoute?", + "version": "v{version}", + "debug": "Отстраняване на грешки", + "system": "система", + "help": "Помощ", + "serverDisconnected": "Връзката със сървъра е прекъсната", + "serverDisconnectedMsg": "Прокси сървърът е спрян или се рестартира.", + "expandSidebar": "Разширете страничната лента", + "collapseSidebar": "Свиване на страничната лента" + }, + "header": { + "logout": "Изход", + "language": "език", + "providers": "Доставчици", + "providerDescription": "Управлявайте връзките си с доставчик на AI", + "combos": "Комбота", + "comboDescription": "Комбинирани модели с резервен вариант", + "usage": "Използване и анализ", + "usageDescription": "Наблюдавайте използването на API, консумацията на токени и регистрационните файлове на заявките", + "analytics": "Анализ", + "analyticsDescription": "Графики, тенденции и прозрения за оценка", + "cliTools": "CLI инструменти", + "cliToolsDescription": "Конфигурирайте CLI инструменти", + "home": "Начало", + "homeDescription": "Добре дошли в OmniRoute", + "endpoint": "Крайна точка", + "endpointDescription": "Конфигурация на крайна точка на API", + "settings": "Настройки", + "settingsDescription": "Управлявайте вашите предпочитания", + "openaiCompatible": "Съвместим с OpenAI", + "anthropicCompatible": "Антропно съвместим" + }, + "home": { + "quickStart": "Бърз старт", + "quickStartDesc": "Станете и бягайте в 4 стъпки. Свържете доставчици, маршрутизирайте модели, наблюдавайте всичко.", + "fullDocs": "Пълни документи", + "step1Title": "1. Създайте API ключ", + "step1Desc": "Отидете на Endpoint -> Регистрирани ключове. Генерирайте по един ключ за среда.", + "step2Title": "2. Свържете доставчици", + "step2Desc": "Добавете акаунти в Providers. Поддържа OAuth, API ключ и безплатни нива.", + "step3Title": "3. Насочете клиента си", + "step3Desc": "Задайте основен URL адрес на {url} във вашия IDE или API клиент.", + "step4Title": "4. Наблюдавайте и оптимизирайте", + "step4Desc": "Проследявайте токени, цена и грешки в Request Logs и Analytics.", + "providersOverview": "Преглед на доставчиците", + "configuredOf": "{configured} конфигуриран от {total} налични доставчици", + "noModelsAvailable": "Няма налични модели за този доставчик.", + "configureFirst": "Първо конфигурирайте връзка в {providers}", + "configureProvider": "Конфигуриране на доставчик", + "modelAvailable": "Наличен модел {count}", + "modelsAvailable": "{count} налични модели", + "connectionsActive": "{count} връзката е активна", + "connectionsActivePlural": "{count} активни връзки", + "copyModelName": "Копирайте името на модела", + "documentation": "Документация", + "healthMonitor": "Здравен монитор", + "reportIssue": "Докладвайте за проблем", + "activeError": "{active} активен · {errors} грешка", + "oauthLabel": "OAuth", + "apiKeyLabel": "API ключ", + "requestsShort": "{count} изискване", + "providerModelsTitle": "{provider} - Модели", + "copiedModel": "Копирано: {model}", + "aliasLabel": "псевдоним" + }, + "analytics": { + "title": "Анализ", + "overviewDescription": "Наблюдавайте своите модели на използване на API, потреблението на токени, разходите и тенденциите в дейността при всички доставчици и модели.", + "evalsDescription": "Изпълнете пакети за оценка, за да тествате и валидирате вашите крайни точки на LLM. Сравнете качеството на модела, открийте регресии и сравните латентността.", + "overview": "Преглед", + "evals": "Оценки" + }, + "apiManager": { + "title": "API ключове", + "createKey": "Създайте API ключ", + "key": "Ключ", + "revokeKey": "Отмяна на ключа", + "revokeConfirm": "Сигурни ли сте, че искате да отмените този API ключ?", + "noKeys": "Все още няма API ключове", + "noKeysDesc": "Създайте първия си API ключ за удостоверяване на заявки към вашата крайна точка", + "keyLabel": "Ключов етикет", + "permissions": "Разрешения", + "expiresAt": "Изтича", + "never": "Никога", + "revoke": "Отмени", + "showKey": "Показване на ключ", + "hideKey": "Скриване на ключ", + "copyKey": "Копиране на API ключ", + "allModels": "Всички модели", + "selectedModels": "Избрани модели", + "readOnly": "Само за четене", + "fullAccess": "Пълен достъп", + "keyManagement": "Управление на API ключове", + "keyManagementDesc": "Създавайте и управлявайте API ключове за удостоверяване на заявки към вашата крайна точка", + "totalKeys": "Общо ключове", + "restricted": "Ограничен", + "totalRequests": "Общо заявки", + "modelsAvailable": "Налични модели", + "registeredKeys": "Регистрирани ключове", + "keysRegistered": "Регистрирани {count} ключове", + "keyRegistered": "Ключът {count} е регистриран", + "keysSecurityNote": "Всеки ключ изолира проследяването на използването и може да бъде отменен независимо. Ключовете се маскират след създаването за сигурност.", + "createFirstKey": "Създайте своя първи ключ", + "name": "Име", + "usage": "Използване", + "created": "Създаден", + "actions": "Действия", + "reqs": "изисквания", + "neverUsed": "Никога не е използван", + "deleteConfirm": "Да се изтрие ли този API ключ?", + "usageTips": "Съвети за употреба", + "tipAuth": "Използвайте API ключове в заглавката за оторизация като носител YOUR_KEY", + "tipSecure": "Ключовете се показват само веднъж по време на създаване — съхранявайте ги сигурно", + "tipSeparate": "Създайте отделни ключове за различни клиенти или среди", + "tipRestrict": "Ограничете ключовете до конкретни модели за по-добра сигурност и контрол на разходите", + "keyName": "Име на ключ", + "keyNamePlaceholder": "напр. производствен ключ, ключ за разработка", + "keyNameDesc": "Изберете описателно име, за да идентифицирате целта на този ключ", + "keyCreated": "Ключът за API е създаден", + "keyCreatedSuccess": "Ключът е създаден успешно!", + "keyCreatedNote": "Копирайте и запазете този ключ сега — няма да се показва отново.", + "done": "Готово", + "savePermissions": "Запазване на разрешенията", + "allowAll": "Разреши всички", + "restrict": "Ограничете", + "allowAllInfo": "Този ключ има достъп до всички налични модели.", + "restrictInfo": "Този ключ има достъп до {selected} от {total} модели.", + "selected": "{count} избран", + "all": "Всички", + "clear": "ясно", + "searchModels": "Търсете модели по име или доставчик...", + "noModelsFound": "Няма намерени модели", + "keyNameRequired": "Изисква се име на ключ", + "keyNameTooLong": "Името на ключа трябва да съдържа {max} знака или по-малко", + "keyNameInvalid": "Името на ключ може да съдържа само букви, цифри, интервали, тирета и долни черти", + "invalidKeyName": "Невалидно име на ключ", + "failedCreateKey": "Неуспешно създаване на ключ", + "failedCreateKeyRetry": "Неуспешно създаване на ключ. Моля, опитайте отново.", + "invalidKeyId": "Невалиден ID на ключа", + "failedDeleteKey": "Неуспешно изтриване на ключа", + "failedDeleteKeyRetry": "Неуспешно изтриване на ключа. Моля, опитайте отново.", + "invalidModelsSelection": "Невалиден избор на модели", + "cannotSelectMoreThanModels": "Не можете да изберете повече от {max} модела", + "failedUpdatePermissions": "Неуспешно актуализиране на разрешенията", + "failedUpdatePermissionsRetry": "Неуспешно актуализиране на разрешенията. Моля, опитайте отново.", + "unknownProvider": "неизвестен", + "copyMaskedKey": "Копиране на маскиран ключ", + "modelsCount": "{count, plural, one {# model} other {# models}}", + "lastUsedOn": "Последно: {date}", + "editPermissions": "Разрешения за редактиране", + "deleteKey": "Ключ за изтриване", + "model": "{count} модел", + "models": "{count} модели", + "permissionsTitle": "Разрешения: {name}", + "allowAllDesc": "Този ключ има достъп до всички налични модели.", + "restrictDesc": "Този ключ има достъп до {selectedCount} от {totalModels} модели.", + "selectedCount": "{count} избран" + }, + "auditLog": { + "title": "Дневник за одит", + "searchPlaceholder": "Действия при търсене...", + "action": "Действие", + "actor": "актьор", + "target": "Цел", + "ipAddress": "IP адрес", + "timestamp": "Времево клеймо", + "noEntries": "Няма намерени записи за одит", + "filterByAction": "Филтриране по действие...", + "filterByActor": "Филтриране по актьор...", + "filterEntriesAria": "Филтриране на записи в журнала за проверка", + "filterByActionTypeAria": "Филтриране по тип действие", + "filterByActorAria": "Филтриране по актьор", + "refreshAuditLogAria": "Обновяване на журнала за проверка", + "tableAria": "Записи в дневника за одит", + "failedFetchAuditLog": "Неуспешно извличане на журнал за проверка", + "notAvailable": "—", + "description": "Административни действия и събития за сигурност", + "showing": "Показани са {count} записи (отместване {offset})", + "previous": "Предишен" + }, + "cliTools": { + "title": "CLI инструменти", + "noActiveProviders": "Няма активни доставчици", + "noActiveProvidersDesc": "Моля, първо добавете и свържете доставчици, за да конфигурирате CLI инструменти.", + "mapModels": "Модели на карти", + "testConnection": "Тестова връзка", + "connectionStatus": "Състояние на връзката", + "configureEndpoint": "Конфигуриране на крайна точка", + "instructions": "Инструкции", + "modelMapping": "Картографиране на модели", + "baseUrl": "Основен URL адрес", + "apiKey": "API ключ", + "configured": "Конфигуриран", + "notConfigured": "Не е конфигуриран", + "notInstalled": "Не е инсталиран", + "custom": "По поръчка", + "unknown": "неизвестен", + "lastSavedAt": "Последно запазено: {date}", + "never": "Никога", + "justNow": "точно сега", + "minutesAgoShort": "преди {count}мин", + "hoursAgoShort": "преди {count}ч", + "daysAgoShort": "преди {count}d", + "monthsAgoShort": "преди {count}мес", + "yearsAgoShort": "преди {count}г", + "runtimeCheckFailed": "Проверката по време на изпълнение е неуспешна", + "yourApiKeyPlaceholder": "вашият-api-ключ", + "modelPlaceholder": "доставчик/идентификатор на модел", + "configurationSaved": "Конфигурацията е запазена успешно.", + "failedToSave": "Неуспешно запазване на конфигурацията.", + "noApiKeysCreateOne": "Без API ключове – Създайте такъв в страницата Ключове", + "defaultOmnirouteKey": "sk_omniroute (по подразбиране)", + "selectModel": "Изберете Модел", + "selectModelForAlias": "Изберете модел за {alias}", + "selectModelForTool": "Изберете модел за {tool}", + "select": "Изберете", + "clear": "ясно", + "comingSoon": "Очаквайте скоро", + "checkingRuntime": "Проверява се състоянието на изпълнение...", + "guideOnlyIntegration": "Интеграция само с ръководство (не се изисква локално време за изпълнение)", + "cliRuntimeDetected": "Времето за изпълнение на CLI е открито и готово", + "cliFoundNotRunnable": "CLI е намерен, но не може да се изпълнява{reason}", + "cliRuntimeNotDetected": "Времето за изпълнение на CLI не е открито", + "binary": "Двоичен", + "configPath": "Конфигурационен път", + "configPathShort": "Конфиг", + "failedCheckRuntimeStatus": "Неуспешна проверка на състоянието на изпълнение.", + "copy": "копие", + "copied": "Копирано", + "copyConfig": "Копиране на конфигур", + "saveConfig": "Запазване на конфигурацията", + "selectionSaved": "Изборът е запазен", + "guide": "Ръководство", + "detected": "Открито", + "notReady": "Не е готов", + "active": "Активен", + "inactive": "Неактивен", + "startMitm": "Стартирайте MITM", + "stopMitm": "Спрете MITM", + "mitmStarted": "MITM стартира успешно!", + "mitmStopped": "MITM спря успешно!", + "failedStart": "Неуспешно стартиране на MITM", + "failedStop": "Неуспешно спиране на MITM", + "saveMappings": "Запазване на съпоставянията", + "mappingsSaved": "Картографиите са запазени!", + "failedSaveMappings": "Неуспешно запазване на съпоставянията", + "howItWorks": "Как работи:", + "antigravityHowWorksDesc": "Antigravity изпраща заявки до крайната точка на Google. MITM ги прихваща и пренасочва към OmniRoute.", + "antigravityStep1": "1. Стартирайте MITM, за да маршрутизирате заявки през OmniRoute.", + "antigravityStep2Prefix": "2. Добавете", + "antigravityStep2Suffix": "към вашия хост файл като 127.0.0.1.", + "antigravityStep3": "3. Отворете Antigravity и заявките ще бъдат проксиирани.", + "sudoPasswordRequiredTitle": "Изисква се парола за Sudo", + "sudoPasswordHint": "Необходима е администраторска парола, за да промените настройките на хост файла и системния прокси.", + "enterSudoPassword": "Въведете sudo парола", + "sudoPasswordRequiredError": "Изисква се парола за Sudo.", + "cancel": "Отказ", + "confirm": "Потвърдете", + "settingsApplied": "Настройките са приложени успешно!", + "failedApplySettings": "Неуспешно прилагане на настройките", + "settingsReset": "Настройките са нулирани успешно!", + "failedResetSettings": "Неуспешно нулиране на настройките", + "backupRestored": "Резервното копие е възстановено!", + "failedRestore": "Неуспешно възстановяване", + "checkingCli": "Проверява се {tool} CLI...", + "cliNotRunnable": "{tool} CLI е инсталиран, но не може да се изпълнява", + "cliNotInstalled": "{tool} CLI не е инсталиран", + "cliNotDetected": "{tool} CLI не е открит", + "cliDetectedReady": "{tool} CLI открит и готов", + "cliFoundFailedHealthcheck": "{tool} CLI бе намерен, но проверката на изправността по време на изпълнение не бе успешна{reason}.", + "installCliPrompt": "Моля, инсталирайте {tool} CLI, за да използвате тази функция.", + "installCodexPrompt": "Моля, инсталирайте Codex CLI, за да използвате функцията за автоматично прилагане.", + "hide": "Скрий се", + "howToInstall": "Как да инсталирате", + "installationGuide": "Ръководство за инсталиране", + "platforms": "macOS / Linux / Windows:", + "afterInstallationRun": "След инсталацията стартирайте", + "toVerify": "за проверка.", + "current": "Текущ", + "baseUrlPlaceholder": "https://.../v1", + "resetToDefault": "Възстановяване по подразбиране", + "providerModelPlaceholder": "доставчик/идентификатор на модел", + "apply": "Кандидатствайте", + "reset": "Нулиране", + "manualConfig": "Ръчна конфигурация", + "backups": "Архивиране", + "configBackups": "Резервни копия на конфигурацията", + "noBackupsYet": "Все още няма резервни копия. Архивите се създават автоматично преди всяко прилагане или нулиране.", + "restore": "Възстановяване", + "backupRestoredReloading": "Резервното копие е възстановено! Състоянието се презарежда...", + "failedRestoreBackup": "Неуспешно възстановяване на архива", + "applied": "Приложено!", + "failed": "Неуспешно", + "resetDone": "Нулиране!", + "omnirouteConfiguredOpenAiCompatible": "OmniRoute е конфигуриран като OpenAI-съвместим доставчик", + "provider": "Доставчик", + "model": "Модел", + "providers": "Доставчици", + "auth": "авт", + "noApiKeysAvailable": "Няма налични API ключове", + "usingDefaultOmniroute": "Използва се по подразбиране: sk_omniroute", + "updateConfig": "Актуализиране на конфигурацията", + "applyConfig": "Прилагане на конфигур", + "noBackupsAvailable": "Няма налични резервни копия.", + "profileSaved": "Профилът „{name}“ запазен!", + "failedSaveProfile": "Неуспешно запазване на профила", + "profileActivated": "Профилът е активиран!", + "failedActivateProfile": "Неуспешно активиране на профила", + "profiles": "Профили", + "savedProfiles": "Запазени профили", + "noProfilesYet": "Все още няма запазени профили. Запазете текущата конфигурация като профил по-долу.", + "activate": "Активирайте", + "deleteProfile": "Изтриване на профил", + "profileNamePlaceholder": "Име на потребителския профил (напр. личен акаунт)", + "saveCurrent": "Запазване на текущия", + "codexAuthNotePrefix": "Codex използва", + "codexAuthNoteMiddle": "с", + "codexAuthNoteSuffix": "Щракнете върху „Приложи“ за автоматично конфигуриране.", + "claudeManualConfiguration": "Claude CLI - Ръчна конфигурация", + "codexManualConfiguration": "Codex CLI - Ръчна конфигурация", + "droidManualConfiguration": "Фабричен Droid - Ръчна конфигурация", + "openClawManualConfiguration": "Open Claw - Ръчна конфигурация", + "clineManualConfiguration": "Ръчна конфигурация на Cline", + "kiloManualConfiguration": "Ръчна конфигурация на Kilo Code", + "toolDescriptions": { + "antigravity": "Google Antigravity IDE с MITM", + "claude": "Антропен код на Клод CLI", + "codex": "OpenAI Codex CLI", + "droid": "Фабричен Droid AI Assistant", + "openclaw": "Open Claw AI Assistant", + "cline": "Cline AI Coding Assistant CLI", + "kilo": "Kilo Code AI Assistant CLI", + "cursor": "Cursor AI Code Editor", + "continue": "Продължете AI Assistant" + }, + "guides": { + "cursor": { + "notes": { + "0": "Изисква Cursor Pro акаунт, за да използвате тази функция.", + "1": "Курсорът маршрутизира заявките през собствен сървър, така че локалната крайна точка не се поддържа. Моля, активирайте Cloud Endpoint в Настройки." + }, + "steps": { + "1": { + "title": "Отворете Настройки", + "desc": "Отидете на Настройки -> Модели" + }, + "2": { + "title": "Активирайте OpenAI API", + "desc": "Активирайте опцията „OpenAI API ключ“." + }, + "3": { + "title": "Основен URL адрес" + }, + "4": { + "title": "API ключ" + }, + "5": { + "title": "Добавете персонализиран модел", + "desc": "Кликнете върху „Преглед на всички модели“ -> „Добавяне на персонализиран модел“" + }, + "6": { + "title": "Изберете Модел" + } + } + }, + "continue": { + "steps": { + "1": { + "title": "Отворете Config", + "desc": "Отворете Продължете конфигурационния файл" + }, + "2": { + "title": "API ключ" + }, + "3": { + "title": "Изберете Модел" + }, + "4": { + "title": "Добавяне на конфигурация на модела", + "desc": "Добавете следната конфигурация към вашия масив от модели:" + } + } + } + } + }, + "combos": { + "title": "Комбота", + "description": "Създавайте комбинации от модели с претеглено маршрутизиране и резервна поддръжка", + "createCombo": "Създайте комбо", + "editCombo": "Комбинация за редактиране", + "deleteCombo": "Изтриване на комбо", + "noModels": "Няма модели", + "noModelsYet": "Все още няма добавени модели", + "addModel": "Добавяне на модел", + "addModelToCombo": "Добавете модел към комбо", + "routingStrategy": "Стратегия за маршрутизиране", + "maxRetries": "Макс. повторни опити", + "timeout": "Изчакване (ms)", + "healthcheck": "Здравна проверка", + "priority": "Приоритет", + "fallback": "Резервен вариант", + "roundRobin": "Round Robin", + "random": "Случаен", + "leastLatency": "Най-малко забавяне", + "comboName": "Комбинирано име", + "comboNamePlaceholder": "моята комбинация", + "deleteConfirm": "Изтриване на тази комбинация?", + "noCombosYet": "Все още няма комбинации", + "comboCreated": "Комбинацията е създадена успешно", + "comboUpdated": "Комбото е актуализирано успешно", + "comboDeleted": "Комбинацията е изтрита", + "failedCreate": "Неуспешно създаване на комбинация", + "failedUpdate": "Неуспешно актуализиране на комбинацията", + "errorCreating": "Грешка при създаването на комбо", + "errorUpdating": "Грешка при актуализирането на комбинацията", + "errorDeleting": "Грешка при изтриването на комбинацията", + "testFailed": "Тестовата заявка е неуспешна", + "failedToggle": "Неуспешно превключване на комбинацията", + "testResults": "Резултати от теста — {name}", + "resolvedBy": "Разрешено от:", + "more": "+ още {count}", + "reqs": "изисквания", + "success": "успех", + "proxyConfigured": "Конфигуриран прокси", + "copyComboName": "Копирайте името на комбинацията", + "enableCombo": "Активиране на комбинацията", + "disableCombo": "Деактивиране на комбинацията", + "testCombo": "Тестова комбинация", + "duplicate": "Дубликат", + "proxyConfig": "Прокси конфигурация", + "nameRequired": "Името е задължително", + "nameInvalid": "Само букви, цифри, -, _, / и . позволено", + "nameHint": "Букви, цифри, -, _, / и . позволено", + "priorityDesc": "Последователен резервен вариант: първо се опитва модел 1, след това 2 и т.н.", + "weightedDesc": "Разпределя трафика по тегловни проценти с резервен вариант", + "roundRobinDesc": "Кръгово разпределение: всяка заявка отива към следващия модел на ротация", + "randomDesc": "Единен случаен избор, след което се връща към останалите модели", + "leastUsedDesc": "Избира модела с най-малко заявки, като балансира натоварването във времето", + "costOptimizedDesc": "Първо маршрути към най-евтиния модел въз основа на ценообразуването", + "models": "Модели", + "autoBalance": "Автоматичен баланс", + "advancedSettings": "Разширени настройки", + "retryDelay": "Забавяне при повторен опит (ms)", + "concurrencyPerModel": "Паралелност / Модел", + "queueTimeout": "Време за изчакване на опашката (ms)", + "advancedHint": "Оставете празно, за да използвате глобалните настройки по подразбиране. Те заменят настройките за всеки доставчик.", + "moveUp": "Придвижете се нагоре", + "moveDown": "Придвижете се надолу", + "removeModel": "Премахнете", + "saving": "Запазва се...", + "weighted": "Претеглени", + "leastUsed": "Най-малко използван", + "costOpt": "Cost-Opt" + }, + "costs": { + "title": "Разходи", + "budget": "Бюджет", + "totalCost": "Обща цена", + "breakdown": "Разбивка на разходите", + "noData": "Няма данни за разходите", + "byModel": "По модел", + "byProvider": "От Доставчик" + }, + "endpoint": { + "title": "Крайна точка на API", + "available": "Налични крайни точки", + "cloudProxy": "Облачен прокси", + "disableConfirm": "Сигурни ли сте, че искате да деактивирате облачното прокси?", + "baseUrl": "Основен URL адрес", + "apiKeyLabel": "API ключ", + "registeredKeys": "Регистрирани ключове", + "chatCompletions": "Чат завършвания", + "responses": "Отговори", + "listModels": "Списък на моделите", + "usingCloudProxy": "Използване на облачен прокси", + "usingLocalServer": "Използване на локален сървър", + "machineId": "ID на машината: {id}...", + "disableCloud": "Деактивиране на облака", + "enableCloud": "Активиране на облака", + "modelsAcrossEndpoints": "{models} модели в {endpoints} крайни точки", + "chatDesc": "Поточно и нестрийминг чат с всички доставчици", + "embeddings": "Вграждания", + "embeddingsDesc": "Текстови вграждания за търсене и RAG тръбопроводи", + "imageGeneration": "Генериране на изображения", + "imageDesc": "Генерирайте изображения от текстови подкани", + "rerank": "Прекласиране", + "rerankDesc": "Пренареждане на документите по отношение на заявка", + "audioTranscription": "Аудио транскрипция", + "audioTranscriptionDesc": "Транскрибирайте аудио файлове в текст (Whisper)", + "textToSpeech": "Преобразуване на текст в реч", + "textToSpeechDesc": "Преобразувайте текст в естествено звучаща реч", + "moderations": "Модерации", + "moderationsDesc": "Модериране на съдържанието и класификация за безопасност", + "enableCloudTitle": "Активиране на облачен прокси", + "whatYouGet": "Какво ще получите", + "cloudBenefitAccess": "Достъп до вашия API от всяка точка на света", + "cloudBenefitShare": "Лесно споделяйте крайна точка с вашия екип", + "cloudBenefitPorts": "Няма нужда да отваряте портове или да конфигурирате защитна стена", + "cloudBenefitEdge": "Бърза глобална крайна мрежа", + "cloudSessionNote": "Cloud ще запази сесията ви за удостоверяване за 1 ден. Ако не се използва, ще се изтрие автоматично.", + "cloudUnstableNote": "Cloud в момента е нестабилен с Claude Code OAuth в някои случаи.", + "cloudConnected": "Облачен прокси е свързан!", + "connectingToCloud": "Свързване с облак...", + "verifyingConnection": "Проверка на връзката...", + "connecting": "Свързване...", + "verifying": "Проверка...", + "connected": "Свързан!", + "disableCloudTitle": "Деактивирайте облачния прокси", + "disableWarning": "Всички сесии за удостоверяване ще бъдат изтрити от облака.", + "syncingData": "Синхронизиране на най-новите данни...", + "disablingCloud": "Деактивиране на облака...", + "syncing": "Синхронизиране...", + "disabling": "Деактивиране...", + "cloudConnectedVerified": "Облачен прокси свързан и проверен!", + "connectedVerificationPending": "Свързан — изчаква се проверка", + "connectedVerificationPendingWithError": "Свързан — изчаква се проверка: {error}", + "cloudDisabledSuccess": "Облакът е деактивиран успешно", + "syncedSuccess": "Синхронизирано успешно", + "failedDisable": "Неуспешно деактивиране на облака", + "failedEnable": "Неуспешно активиране на облака", + "cloudRequestTimeout": "Време за изчакване на заявката за облак", + "cloudRequestFailed": "Неуспешна заявка за облак", + "cloudWorkerUnreachable": "Не можа да се достигне до облачния работник. Уверете се, че облачната услуга работи (npm run dev в /cloud).", + "connectionFailed": "Връзката е неуспешна", + "syncFailed": "Неуспешно синхронизиране на данните в облака", + "providerModelsTitle": "{provider} — Модели", + "noModelsForProvider": "Няма налични модели за този доставчик.", + "chat": "Чат", + "embedding": "Вграждане", + "image": "Изображение", + "custom": "обичай", + "modelsCount": "{count, plural, one {# model} other {# models}}" + }, + "health": { + "title": "Здраве на системата", + "description": "Мониторинг в реално време на вашето копие OmniRoute", + "healthy": "Здрави", + "degraded": "Деградирал", + "down": "Надолу", + "uptime": "Работно време", + "memory": "памет", + "memoryRss": "Памет (RSS)", + "heap": "Купчина", + "cpu": "CPU", + "database": "База данни", + "version": "Версия", + "lastCheck": "Последна проверка", + "providerHealth": "Здраве на доставчика", + "systemMetrics": "Системни показатели", + "tokenHealth": "Токен Здраве", + "refreshAll": "Опресни всички", + "checkNow": "Проверете сега", + "loadingHealth": "Здравните данни се зареждат...", + "failedToLoad": "Неуспешно зареждане на здравни данни: {error}", + "retry": "Опитайте отново", + "allOperational": "Всички системи работят", + "issuesDetected": "Открити са системни проблеми", + "updatedAt": "Актуализиран {time}", + "latency": "Латентност", + "latencyP50": "p50", + "latencyP95": "стр. 95", + "latencyP99": "стр. 99", + "millisecondsShort": "{value}ms", + "notAvailable": "—", + "totalRequests": "Общо заявки", + "noDataYet": "Все още няма данни", + "promptCache": "Кеш на подканите", + "entries": "Вписвания", + "hitRate": "Процент на попадения", + "hitsMisses": "Попадения / пропуски", + "signatureCache": "Кеш на подписите", + "signatureDefaults": "По подразбиране", + "signatureTool": "Инструмент", + "signatureFamily": "семейство", + "signatureSession": "Сесия", + "recovering": "Възстановява се", + "noCBData": "Няма налични данни за прекъсвачи. Първо направете някои заявки.", + "providerHealthStatusAria": "Здравен статус на доставчика", + "issuesLabel": "Открити проблеми", + "operational": "Оперативен", + "providers": "Доставчици", + "healthyCount": "{count} здрав", + "nodeVersion": "Възел {version}", + "failures": "{count} грешка", + "failuresPlural": "{count} грешки", + "lastFailure": "Последно", + "rateLimitStatus": "Състояние на лимита на скоростта", + "activeLimiters": "{count} активен ограничител", + "activeLimitersPlural": "{count} активни ограничители", + "queued": "На опашка", + "queuedCount": "{count} на опашка", + "running": "бягане", + "runningCount": "{count} работи", + "ok": "добре", + "activeLockouts": "Активни блокировки", + "resetConfirm": "Нулиране на всички прекъсвачи в изправно състояние? Това ще изчисти всички преброявания на грешки и ще възстанови всички доставчици до работно състояние.", + "resetAllTitle": "Нулирайте всички прекъсвачи в изправно състояние", + "resetting": "Нулиране...", + "resetAll": "Нулиране на всички", + "until": "До {time}" + }, + "limits": { + "title": "Ограничения и квоти", + "rateLimit": "Лимит на скоростта", + "remaining": "оставащи", + "requestsPerMinute": "Заявки/мин", + "tokensPerMinute": "Токени/мин", + "dailyLimit": "Дневен лимит" + }, + "logs": { + "title": "трупи", + "requestLogs": "Регистри на заявки", + "proxyLogs": "Прокси регистрационни файлове", + "auditLog": "Дневник за одит", + "console": "Конзола", + "auditLogDesc": "Административни действия и събития за сигурност", + "loading": "Зареждане...", + "refresh": "Опресняване", + "filterByAction": "Филтриране по действие...", + "filterByActor": "Филтриране по актьор...", + "filterEntriesAria": "Филтриране на записи в журнала за проверка", + "filterByActionTypeAria": "Филтриране по тип действие", + "filterByActorAria": "Филтриране по актьор", + "refreshAuditLogAria": "Обновяване на журнала за проверка", + "tableAria": "Записи в дневника за одит", + "failedFetchAuditLog": "Неуспешно извличане на журнал за проверка", + "showing": "Показани са {count} записи (отместване {offset})", + "search": "Търсене", + "timestamp": "Времево клеймо", + "action": "Действие", + "actor": "актьор", + "target": "Цел", + "details": "Подробности", + "ipAddress": "IP адрес", + "notAvailable": "—", + "noEntries": "Няма намерени записи в журнала за проверка", + "previous": "Предишен", + "next": "Следваща" + }, + "onboarding": { + "welcome": "Добре дошли", + "security": "сигурност", + "test": "Тест", + "ready": "Готови!", + "setPassword": "Задайте парола", + "addProvider": "Добавете първия си доставчик", + "getStarted": "Започнете", + "skip": "Пропускане", + "skipWizard": "Изцяло пропуснете съветника", + "skipPassword": "Пропуснете настройката на парола", + "skipAndContinue": "Пропусни и продължи", + "passwordLabel": "Парола", + "confirmPassword": "Потвърдете паролата", + "enterPassword": "Въведете парола", + "confirmPasswordPlaceholder": "Потвърдете паролата", + "passwordsMismatch": "Паролите не съвпадат", + "setupComplete": "Настройката е завършена!", + "goToDashboard": "Отидете на таблото →", + "welcomeDesc": "OmniRoute е вашият местен AI API прокси. Той насочва заявки към множество доставчици на AI с балансиране на натоварването, преход при срив и проследяване на използването.", + "multiProvider": "Мулти-доставчик", + "usageTracking": "Проследяване на използването", + "apiKeyMgmt": "API Key Mgmt", + "securityDesc": "Задайте парола, за да защитите таблото си за управление, или пропуснете засега.", + "providerDesc": "Свържете първия си доставчик на AI. Можете да добавите още по-късно.", + "apiKeyRequired": "API ключ (задължително)", + "customUrlOptional": "Персонализиран URL (по избор)", + "testDesc": "Нека проверим дали връзката ви с доставчика работи.", + "runTest": "Изпълнете тест за връзка", + "testingConnection": "Връзката се тества...", + "connectionSuccessful": "Връзката е успешна! Вашият доставчик е готов.", + "noProviderFound": "Няма намерен доставчик. Можете да добавите такъв от таблото за управление по-късно.", + "testFailed": "Тестът е неуспешен, но можете да конфигурирате това по-късно.", + "couldNotTest": "Не може да се тества в момента. Можете да тествате от таблото.", + "doneDesc": "Всичко е готово! Вашето копие на OmniRoute е конфигурирано и готово за прокси заявки за AI.", + "yourEndpoint": "Вашата крайна точка:", + "continue": "Продължи", + "retry": "Опитайте отново", + "failedSetPassword": "Неуспешно задаване на парола. Опитайте отново.", + "failedAddProvider": "Неуспешно добавяне на доставчик. Опитайте отново.", + "connectionError": "Грешка при свързване. Моля, опитайте отново.", + "provider": "Доставчик" + }, + "providers": { + "title": "Доставчици", + "addProvider": "Добавяне на доставчик", + "editProvider": "Редактиране на доставчик", + "deleteProvider": "Изтриване на доставчик", + "noProviders": "Няма конфигурирани доставчици", + "modelAvailability": "Наличност на модела", + "accounts": "Сметки", + "newAccount": "Нов акаунт", + "deleteConfirm": "Сигурни ли сте, че искате да изтриете този доставчик?", + "testing": "Тестване...", + "testConnection": "Тестова връзка", + "testSuccess": "Връзката е успешна", + "testFailed": "Връзката е неуспешна", + "available": "Наличен", + "cooldown": "Разхлаждане", + "unavailable": "Недостъпен", + "unknown": "неизвестен", + "oauthLabel": "OAuth", + "compatibleLabel": "Съвместим", + "chat": "Чат", + "responses": "Отговори", + "messages": "Съобщения", + "oauthProviders": "Доставчици на OAuth", + "freeProviders": "Безплатни доставчици", + "apiKeyProviders": "Доставчици на API ключове", + "compatibleProviders": "API Key Съвместими доставчици", + "testAll": "Тествайте всички", + "testAllOAuth": "Тествайте всички OAuth връзки", + "testAllFree": "Тествайте всички безплатни връзки", + "testAllApiKey": "Тествайте всички API Key връзки", + "testAllCompatible": "Тествайте всички съвместими връзки", + "connected": "{count} Свързан", + "errorCount": "{count} Грешка ({code})", + "errorCountNoCode": "{count} Грешка", + "noConnections": "Никакви връзки", + "disabled": "Забранено", + "enableProvider": "Активиране на доставчика", + "disableProvider": "Деактивиране на доставчика", + "testResults": "Резултати от теста", + "noCompatibleYet": "Все още няма добавени съвместими доставчици", + "compatibleHint": "Използвайте бутоните по-горе, за да добавите крайни точки, съвместими с OpenAI или Anthropic", + "addOpenAICompatible": "Добавете OpenAI съвместим", + "addAnthropicCompatible": "Добавяне на Anthropic Compatible", + "addNewProvider": "Добавяне на нов доставчик", + "backToProviders": "Обратно към Доставчици", + "configureNewProvider": "Конфигурирайте нов доставчик на AI, който да използвате с вашите приложения.", + "providerLabel": "Доставчик", + "selectProvider": "Изберете доставчик", + "selectedProvider": "Избран доставчик", + "authMethod": "Метод за удостоверяване", + "apiKeyLabel": "API ключ", + "apiKeyRequired": "Изисква се API ключ", + "selectProviderRequired": "Моля, изберете доставчик", + "enterApiKey": "Въведете вашия API ключ", + "apiKeySecure": "Вашият API ключ ще бъде шифрован и съхранен сигурно.", + "oauth2Connect": "Свържете се с OAuth2", + "oauth2Label": "OAuth2", + "oauth2Desc": "Свържете акаунта си чрез OAuth2 удостоверяване.", + "displayName": "Екранно име", + "displayNamePlaceholder": "напр. API за производство, среда за разработка", + "displayNameHint": "Не е задължително. Удобно име за идентифициране на тази конфигурация.", + "active": "Активен", + "activeDescription": "Разрешете този доставчик за използване във вашите приложения", + "cancel": "Отказ", + "createProvider": "Създаване на доставчик", + "failedCreate": "Неуспешно създаване на доставчик", + "errorOccurred": "Възникна грешка. Моля, опитайте отново.", + "modelStatus": "Статус на модела", + "allModelsOperational": "Всички модели работещи", + "modelsWithIssues": "{count} модел(а) с проблеми", + "allModelsNormal": "Всички модели реагират нормално.", + "cooldownCleared": "Времето за изчакване е изчистено за {model}", + "failedClearCooldown": "Неуспешно изчистване на времето за охлаждане", + "loadingAvailability": "Наличността на модела се зарежда...", + "clearCooldown": "ясно", + "clearing": "Изчистване...", + "until": "До {time}", + "providerTestFailed": "Тестът на доставчика е неуспешен", + "modeTest": "{mode} Тествайте", + "passedCount": "{count} премина", + "failedCount": "{count} неуспешно", + "testedCount": "{count} тестван", + "millisecondsAbbr": "{value}ms", + "okShort": "добре", + "errorShort": "ГРЕШКА", + "noActiveConnectionsInGroup": "Няма намерени активни връзки за тази група.", + "allTestsPassed": "Всички {total} тестове преминаха", + "testSummary": "{passed}/{total} издържан, {failed} неуспешен", + "nameLabel": "Име", + "prefixLabel": "Префикс", + "baseUrlLabel": "Основен URL адрес", + "apiTypeLabel": "API тип", + "prefixHint": "Задължително. Уникален префикс за имена на модели.", + "nameHint": "Задължително. Приятелски етикет за този възел.", + "baseUrlHint": "Задължително. Основен URL адрес на API на доставчика.", + "anthropicPrefixPlaceholder": "ac-prod", + "openaiPrefixPlaceholder": "oc-prod", + "anthropicBaseUrlPlaceholder": "https://api.anthropic.com/v1", + "openaiBaseUrlPlaceholder": "https://api.openai.com/v1", + "validateConnection": "Проверка на връзката", + "validating": "Потвърждава се...", + "connectionValid": "Връзката е валидна!", + "connectionFailed": "Връзката е неуспешна. Проверете URL адреса и ключа.", + "testKeyLabel": "Тествайте API ключ", + "testKeyPlaceholder": "sk-... (само за проверка)", + "providerNotFound": "Доставчикът не е намерен", + "deleteConnectionConfirm": "Изтриване на тази връзка?", + "failedSetAlias": "Неуспешно задаване на псевдоним", + "failedSaveConnection": "Неуспешно запазване на връзката", + "failedSaveConnectionRetry": "Неуспешно запазване на връзката. Моля, опитайте отново.", + "failedRetestConnection": "Неуспешно повторно тестване на връзката", + "deleteCompatibleNodeConfirm": "Да се изтрие ли този {type} съвместим възел?", + "anthropicCompatibleDetails": "Подробности за антропна съвместимост", + "openaiCompatibleDetails": "Подробности за съвместимост с OpenAI", + "messagesApi": "API за съобщения", + "responsesApi": "API за отговори", + "chatCompletions": "Чат завършвания", + "importingModels": "Импортиране...", + "importFromModels": "Импортиране от /models", + "addConnectionToImport": "Добавете връзка, за да активирате импортирането.", + "noModelsConfigured": "Няма конфигурирани модели", + "connectionCount": "{count} връзка(и)", + "fetchingModels": "Извличане на налични модели...", + "failedFetchModels": "Неуспешно извличане на модели", + "noModelsFound": "Няма намерени модели", + "importFailed": "Неуспешно импортиране", + "noNewModelsAdded": "Няма добавени нови модели.", + "adding": "Добавяне...", + "importingModelsTitle": "Импортиране на модели", + "copyModel": "Копиране на модел", + "removeModel": "Премахване на модела", + "rateLimitProtected": "Защитен", + "rateLimitUnprotected": "Незащитен", + "enableRateLimitProtection": "Щракнете, за да активирате защитата на ограничението на скоростта", + "disableRateLimitProtection": "Щракнете, за да деактивирате защитата на ограничението на скоростта", + "productionKey": "Производствен ключ", + "enterNewApiKey": "Въведете нов API ключ", + "optional": "Не е задължително", + "anthropicCompatibleName": "Антропно съвместим", + "openaiCompatibleName": "Съвместим с OpenAI", + "failedImportModels": "Неуспешно импортиране на модели", + "noModelsReturnedFromEndpoint": "Няма върнати модели от /models endpoint.", + "importingModelsProgress": "Импортиране на {current} от {total} модели...", + "foundModelsStartingImport": "Намерени {count} модели. Импортирането започва...", + "importingModelById": "Импортиране на {modelId}...", + "importSuccessCount": "Успешно импортиран {count, plural, one {# model} other {# models}}!", + "noNewModelsAddedExisting": "Не са добавени нови модели (всички вече съществуват).", + "importDoneCount": "✓ Готово! {count, plural, one {# model imported.} other {# models imported.}}", + "unexpectedErrorOccurred": "Възникна неочаквана грешка", + "connectionCountLabel": "{count, plural, one {# connection} other {# connections}}", + "messagesPath": "съобщения", + "responsesPath": "отговори", + "chatCompletionsPath": "чат/завършвания", + "add": "Добавете", + "edit": "Редактиране", + "delete": "Изтриване", + "anthropic": "Антропен", + "openai": "OpenAI", + "singleConnectionPerCompatible": "Разрешена е само една връзка на съвместим възел. Добавете друг възел, ако имате нужда от повече връзки.", + "connections": "Връзки", + "providerProxyTitleConfigured": "Прокси на доставчика: {host}", + "configured": "конфигуриран", + "providerProxyConfigureHint": "Конфигурирайте прокси за всички връзки на този доставчик", + "providerProxy": "Прокси доставчик", + "noConnectionsYet": "Все още няма връзки", + "addFirstConnectionHint": "Добавете първата си връзка, за да започнете", + "addConnection": "Добавяне на връзка", + "availableModels": "Налични модели", + "pageAutoRefresh": "Страницата ще се обнови автоматично...", + "statusDisabled": "деактивиран", + "statusConnected": "свързан", + "statusRuntimeIssue": "проблем по време на изпълнение", + "statusAuthFailed": "неуспешно удостоверяване", + "statusRateLimited": "ограничена скорост", + "statusNetworkIssue": "проблем с мрежата", + "statusTestUnsupported": "тестът не се поддържа", + "statusUnavailable": "недостъпен", + "statusFailed": "неуспешно", + "statusError": "грешка", + "oauthAccount": "OAuth акаунт", + "errorTypeRuntime": "Локално време за изпълнение", + "errorTypeUpstreamAuth": "Upstream auth", + "errorTypeMissingCredential": "Липсват идентификационни данни", + "errorTypeRefreshFailed": "Опресняването не бе успешно", + "errorTypeTokenExpired": "Токенът е изтекъл", + "errorTypeRateLimited": "Ограничена скорост", + "errorTypeUpstreamUnavailable": "Възходящото течение не е налично", + "errorTypeNetworkError": "Мрежова грешка", + "errorTypeTestUnsupported": "Тестът не се поддържа", + "errorTypeUpstreamError": "Грешка нагоре по веригата", + "proxySourceGlobal": "Глобален", + "proxySourceProvider": "Доставчик", + "proxySourceKey": "Ключ", + "proxyConfiguredBySource": "Прокси ({source}): {host}", + "autoPriority": "Автоматично: {priority}", + "proxy": "Прокси", + "retestAuthentication": "Повторно тестване на автентификацията", + "retest": "Повторен тест", + "disableConnection": "Деактивирайте връзката", + "enableConnection": "Разрешете връзката", + "reauthenticateConnection": "Повторно удостоверяване на тази връзка", + "proxyConfig": "Прокси конфигурация", + "aliasExistsAlert": "Псевдонимът „{alias}“ вече съществува. Моля, използвайте различен модел или редактирайте съществуващ псевдоним.", + "openRouterAnyModelHint": "OpenRouter поддържа всеки модел. Добавете модели и създайте псевдоними за бърз достъп.", + "modelIdFromOpenRouter": "ID на модела (от OpenRouter)", + "openRouterModelPlaceholder": "антропичен/claude-3-opus", + "customModels": "Персонализирани модели", + "customModelsHint": "Добавете идентификатори на модели, които не са в списъка по подразбиране. Те ще бъдат достъпни за маршрутизиране.", + "modelId": "ID на модела", + "customModelPlaceholder": "напр. gpt-4.5-турбо", + "loading": "Зареждане...", + "removeCustomModel": "Премахване на потребителски модел", + "noCustomModels": "Все още няма добавени персонализирани модели.", + "allSuggestedAliasesExist": "Всички предложени псевдоними вече съществуват. Моля, изберете друг модел или премахнете противоречивите псевдоними.", + "failedSaveCustomModel": "Неуспешно запазване на персонализирания модел", + "modelAddedSuccess": "Модел {modelId} добавен успешно", + "failedAddModelTryAgain": "Неуспешно добавяне на модел. Моля, опитайте отново.", + "failedSaveImportedModel": "Неуспешно запазване на импортирания модел в персонализирана база данни", + "failedImportModelsTryAgain": "Неуспешно импортиране на модели. Моля, опитайте отново.", + "failedRemoveModelFromDatabase": "Неуспешно премахване на модела от базата данни", + "modelRemovedSuccess": "Моделът е премахнат успешно", + "failedDeleteModelTryAgain": "Неуспешно изтриване на модела. Моля, опитайте отново.", + "compatibleModelsDescription": "Добавете {type}-съвместими модели ръчно или ги импортирайте от крайната точка /models.", + "anthropicCompatibleModelPlaceholder": "клод-3-опус-20240229", + "openaiCompatibleModelPlaceholder": "gpt-4o", + "apiKeyValidationFailed": "Проверката на API ключа е неуспешна. Моля, проверете ключа си и опитайте отново.", + "addProviderApiKeyTitle": "Добавяне на {provider} API ключ", + "checking": "Проверка...", + "check": "Проверете", + "valid": "Валиден", + "invalid": "Невалиден", + "creating": "Създаване...", + "validationChecksAnthropicCompatible": "Валидирането проверява {provider} чрез проверка на API ключа.", + "validationChecksOpenAiCompatible": "Проверки за валидиране {provider} чрез /models на вашия основен URL адрес.", + "priorityLabel": "Приоритет", + "saving": "Запазва се...", + "save": "Запазване", + "editConnection": "Редактиране на връзката", + "accountName": "Име на акаунта", + "email": "Имейл", + "healthCheckMinutes": "Проверка на здравето (мин.)", + "healthCheckHint": "Интервал за опресняване на проактивен токен. 0 = забранено.", + "failedTestConnection": "Неуспешно тестване на връзката", + "failed": "Неуспешно", + "leaveBlankKeepCurrentApiKey": "Оставете празно, за да запазите текущия API ключ.", + "editCompatibleTitle": "Редактиране {type} Съвместим", + "compatibleBaseUrlHint": "Използвайте основния URL (завършващ на /v1) за вашия {type}-съвместим API.", + "apiKeyForCheck": "API ключ (за проверка)", + "compatibleProdPlaceholder": "{type} Съвместим (Prod)" + }, + "settings": { + "title": "Настройки", + "general": "генерал", + "security": "сигурност", + "appearance": "Външен вид", + "routing": "Маршрутизиране", + "cache": "Кеш памет", + "resilience": "Устойчивост", + "systemPrompt": "Системен ред", + "thinkingBudget": "Мислен бюджет", + "proxy": "Прокси", + "pricing": "Ценообразуване", + "storage": "Съхранение", + "policies": "Политики", + "ipFilter": "IP филтър", + "comboDefaults": "Комбо по подразбиране", + "fallbackChains": "Резервни вериги", + "changePassword": "Промяна на паролата", + "enablePassword": "Активиране на парола", + "darkMode": "Тъмен режим", + "lightMode": "Светлинен режим", + "systemTheme": "Системна тема", + "enableCache": "Активиране на кеша", + "cacheTTL": "Кеш TTL", + "maxCacheSize": "Макс. размер на кеша", + "clearCache": "Изчистване на кеша", + "cacheHits": "Попадения в кеша", + "cacheMisses": "Кеш пропуски", + "hitRate": "Процент на попадения", + "cacheEntries": "Записи в кеша", + "circuitBreaker": "Прекъсвач", + "retryPolicy": "Правила за повторен опит", + "maxRetries": "Макс. повторни опити", + "retryDelay": "Отлагане на повторен опит", + "timeoutMs": "Изчакване (ms)", + "enableSystemPrompt": "Активиране на системна подкана", + "systemPromptText": "Текст на системната подкана", + "enableThinking": "Активиране на мисленето", + "maxThinkingTokens": "Макс жетони за мислене", + "enableProxy": "Активиране на прокси", + "proxyUrl": "Прокси URL", + "pricingRates": "Формат на цените", + "currentPricing": "Текущ преглед на цените", + "loadingPricing": "Данните за цените се зареждат...", + "noPricing": "Няма налични данни за цените", + "input": "Вход", + "output": "Изход", + "cached": "Кеширано", + "reasoning": "Разсъждение", + "cacheCreation": "Създаване на кеш памет", + "customPricing": "Персонализирано ценообразуване", + "databaseSize": "Размер на базата данни", + "backupDb": "Архивиране на база данни", + "restoreDb": "Възстановяване на база данни", + "exportData": "Експортиране на данни", + "importData": "Импортиране на данни", + "clearData": "Изчистване на всички данни", + "clearDataConfirm": "Това ще изтрие завинаги всички данни. сигурен ли си", + "enableRequestLogs": "Активиране на регистрационните файлове на заявките", + "logRetention": "Запазване на регистрационни файлове", + "ipWhitelist": "IP бял списък", + "ipBlacklist": "IP черен списък", + "addIP": "Добавете IP", + "savedSuccessfully": "Настройките са запазени успешно", + "ai": "AI", + "advanced": "Разширено", + "localMode": "Локален режим — Всички данни, съхранени на вашето устройство", + "settingsSectionsAria": "Раздели за настройки", + "switchThemes": "Превключване между светли и тъмни теми", + "themeSelectionAria": "Избор на тема", + "themeLight": "светлина", + "themeDark": "Тъмно", + "themeSystem": "система", + "hideHealthLogs": "Скриване на журналите за проверка на здравето", + "hideHealthLogsDesc": "Когато е ВКЛЮЧЕНО, потиска съобщенията [HealthCheck] в сървърната конзола", + "promptCache": "Кеш на подканите", + "flushCache": "Прочистване на кеша", + "flushing": "Зачервяване...", + "size": "Размер", + "hits": "Хитове", + "evictions": "Изгонвания", + "loadingCacheStats": "Статистическите данни за кеша се зареждат...", + "globalProxy": "Глобален прокси", + "globalProxyDesc": "Конфигурирайте глобален изходящ прокси за всички извиквания на API. Индивидуалните доставчици, комбинации и ключове могат да отменят това.", + "noGlobalProxy": "Няма конфигуриран глобален прокси", + "globalLabel": "Глобален", + "configure": "Конфигуриране", + "globalSystemPrompt": "Глобална системна подкана", + "systemPromptDesc": "Инжектиран във всички заявки на прокси ниво", + "saved": "Запазено", + "systemPromptPlaceholder": "Въведете системна подкана за инжектиране във всички заявки...", + "systemPromptHint": "Тази подкана се добавя към системното съобщение на всяка заявка. Използвайте за глобални инструкции, указания за безопасност или правила за форматиране на отговор.", + "chars": "{count} знака", + "thinkingBudgetTitle": "Мислен бюджет", + "thinkingBudgetDesc": "Контролирайте използването на токен за мотивиране на AI във всички заявки", + "passthrough": "Преминаване", + "passthroughDesc": "Без промени — клиентът контролира мислещия бюджет", + "auto": "Авто", + "autoDesc": "Премахнете цялата мислеща конфигурация — оставете доставчика да реши", + "custom": "По поръчка", + "customDesc": "Задайте фиксиран бюджет за токени за всички заявки", + "adaptive": "Адаптивна", + "adaptiveDesc": "Мащабирайте бюджет въз основа на сложността на заявката", + "effortNone": "Няма (0 токена)", + "effortLow": "Нисък (1K токена)", + "effortMedium": "Среден (10K токена)", + "effortHigh": "Висок (128K токена)", + "tokenBudget": "Токен бюджет", + "tokens": "токени", + "baseEffortLevel": "Базово ниво на усилие", + "adaptiveHint": "Адаптивният режим се мащабира от това базово ниво въз основа на броя на съобщенията, използването на инструмента и дължината на подканата.", + "requireLogin": "Изискване за влизане", + "requireLoginDesc": "Когато е ВКЛЮЧЕНО, таблото за управление изисква парола. Когато е ИЗКЛЮЧЕНО, достъп без влизане.", + "currentPassword": "Текуща парола", + "enterCurrentPassword": "Въведете текущата парола", + "newPassword": "Нова парола", + "enterNewPassword": "Въведете нова парола", + "confirmPassword": "Потвърдете новата парола", + "confirmPasswordPlaceholder": "Потвърдете новата парола", + "passwordsNoMatch": "Паролите не съвпадат", + "passwordUpdated": "Паролата е актуализирана успешно", + "failedUpdatePassword": "Неуспешно актуализиране на паролата", + "errorOccurred": "Възникна грешка", + "updatePassword": "Актуализиране на паролата", + "setPassword": "Задайте парола", + "apiEndpointProtection": "API Endpoint Protection", + "requireAuthModels": "Изискване на API ключ за /models", + "requireAuthModelsDesc": "Когато е ВКЛЮЧЕНО, крайната точка /v1/models връща 404 за неупълномощени заявки. Предотвратява откриването на модел от неоторизирани потребители.", + "blockedProviders": "Блокирани доставчици", + "blockedProvidersDesc": "Скриване на конкретни доставчици от отговора /v1/models. Блокираните доставчици няма да се показват в списъците с модели.", + "providersBlocked": "{count} доставчик(и) е блокиран от /models", + "blockProviderTitle": "Блокиране на {provider}", + "unblockProviderTitle": "Отблокиране на {provider}", + "routingStrategy": "Стратегия за маршрутизиране", + "fillFirst": "Първо попълнете", + "fillFirstDesc": "Използвайте акаунти в приоритетен ред", + "roundRobin": "Round Robin", + "roundRobinDesc": "Преминете през всички сметки", + "p2c": "P2C", + "p2cDesc": "Изберете 2 произволни, използвайте по-здравословния", + "random": "Случаен", + "randomDesc": "Произволен акаунт за всяка заявка", + "leastUsed": "Най-малко използван", + "leastUsedDesc": "Изберете най-малко използван акаунт", + "costOpt": "Цена Опт", + "costOptDesc": "Предпочитайте най-евтиния наличен акаунт", + "stickyLimit": "Лепкава граница", + "stickyLimitDesc": "Обаждания на акаунт преди превключване", + "modelAliases": "Псевдоними на модела", + "modelAliasesDesc": "Шаблони за заместващи символи за пренасочване на имена на модели • Използвайте * и ?", + "aliasPatternPlaceholder": "клод-сонет-*", + "aliasTargetPlaceholder": "клод-сонет-4-20250514", + "pattern": "Модел", + "targetModel": "Целеви модел", + "add": "+ Добавяне", + "session": "Сесия", + "sessionDetailsAria": "Подробности за сесията", + "status": "Статус", + "authenticated": "Удостоверен", + "guest": "Гост", + "loginTime": "Време за влизане", + "sessionAge": "Възраст на сесията", + "browser": "Браузър", + "clearLocalData": "Изчистване на локалните данни", + "logout": "Изход", + "clearLocalDataConfirm": "Изчистване на всички локални данни? Това ще нулира вашите предпочитания.", + "unknown": "неизвестен", + "systemActor": "система", + "ipAccessControl": "IP контрол на достъпа", + "ipAccessControlDesc": "Блокиране или разрешаване на конкретни IP адреси", + "ipModeDisabled": "Забранено", + "ipModeBlacklist": "Черен списък", + "ipModeWhitelist": "Бял списък", + "ipModeWhitelistPriority": "WL приоритет", + "addIpAddress": "Добавете IP адрес", + "ipAddressPlaceholder": "192.168.1.0/24 или 10.0.*.*", + "block": "+ Блокиране", + "allow": "+ Позволи", + "blocked": "Блокиран ({count})", + "allowed": "Разрешено ({count})", + "temporaryBans": "Временни забрани ({count})", + "minLeft": "Остават {min}m", + "auditLog": "Дневник за одит", + "searchAuditLogs": "Търсене в журналите за проверка...", + "failedLoadAuditLog": "Неуспешно зареждане на журнала за проверка", + "noAuditEvents": "Няма намерени одитни събития", + "action": "Действие", + "actor": "актьор", + "details": "Подробности", + "time": "време", + "fallbackChainsTitle": "Резервни вериги", + "fallbackChainsDesc": "Определете резервна поръчка на доставчика за модел", + "addChain": "+ Добавяне на верига", + "modelName": "Име на модела", + "modelNamePlaceholder": "клод-сонет-4-20250514", + "providersCommaSeparated": "Доставчици (разделени със запетая, в приоритетен ред)", + "providersCommaSeparatedPlaceholder": "антропичен, опенай, близнаци", + "createChain": "Създаване на верига", + "noFallbackChains": "Без резервни вериги", + "noFallbackChainsDesc": "Създайте верига, за да определите резервна поръчка на доставчика за модел.", + "loadingFallbackChains": "Резервните вериги се зареждат...", + "deleteChainConfirm": "Да се изтрие ли резервната верига за „{model}“?", + "chainCreated": "Създадена верига за {model}", + "chainDeleted": "Веригата е изтрита за {model}", + "failedCreateChain": "Неуспешно създаване на верига", + "failedDeleteChain": "Неуспешно изтриване на веригата", + "deleteChain": "Изтриване на верига", + "fillModelAndProviders": "Моля, попълнете името на модела и доставчиците", + "addAtLeastOneProvider": "Добавете поне един доставчик", + "comboDefaultsTitle": "Комбо по подразбиране", + "globalComboConfig": "Глобална комбинирана конфигурация", + "defaultStrategy": "Стратегия по подразбиране", + "defaultStrategyDesc": "Прилага се към нови комбинации без изрична стратегия", + "comboStrategyAria": "Комбо стратегия", + "priority": "Приоритет", + "weighted": "Претеглени", + "maxRetriesLabel": "Макс. повторни опити", + "retryDelayLabel": "Забавяне при повторен опит (ms)", + "timeoutLabel": "Изчакване (ms)", + "healthCheck": "Здравна проверка", + "healthCheckDesc": "Проверете предварително наличността на доставчика", + "trackMetrics": "Проследяване на показатели", + "trackMetricsDesc": "Записвайте показатели за комбо заявка", + "providerOverrides": "Замени на доставчика", + "providerOverridesDesc": "Замяна на времето за изчакване и повторни опити за всеки доставчик. Настройките на доставчика заменят глобалните настройки по подразбиране.", + "providerMaxRetriesAria": "{provider} макс. повторни опити", + "providerTimeoutAria": "{provider} таймаут мс", + "removeProviderOverrideAria": "Премахнете замяната на {provider}", + "newProviderNamePlaceholder": "напр. гугъл, отвори...", + "newProviderNameAria": "Ново име на доставчика", + "retries": "повторни опити", + "ms": "г-жа", + "saveComboDefaults": "Запазване на настройките по подразбиране на комбинацията", + "maxNestingDepth": "Максимална дълбочина на влагане", + "concurrencyPerModel": "Паралелност / Модел", + "queueTimeout": "Време за изчакване на опашката (ms)", + "providerProfiles": "Профили на доставчици", + "providerProfilesDesc": "Отделни настройки за устойчивост за доставчици на OAuth (базиран на сесия) и API ключ (измерен). Доставчиците на OAuth имат по-строги прагове поради по-ниските лимити на скоростта.", + "oauthProviders": "Доставчици на OAuth", + "apiKeyProviders": "Доставчици на API ключове", + "transientCooldown": "Временно охлаждане", + "rateLimitCooldown": "Лимит на скоростта на изчакване", + "maxBackoffLevel": "Максимално ниво на отстъпка", + "cbThreshold": "CB праг", + "cbResetTime": "Време за нулиране на CB", + "rateLimiting": "Ограничаване на скоростта", + "rateLimitingDesc": "Доставчиците на API ключове са автоматично ограничени по скорост с безопасни настройки по подразбиране. Ограниченията се научават от заглавките на отговорите и се адаптират с времето.", + "defaultSafetyNet": "Предпазна мрежа по подразбиране", + "rpm": "RPM", + "minGap": "Мин. празнина", + "maxConcurrent": "Максимално едновременно", + "activeLimiters": "Активни ограничители", + "noActiveLimiters": "Все още няма активни ограничители на скоростта.", + "reservoir": "Резервоар", + "running": "бягане", + "queued": "На опашка", + "circuitBreakers": "Автоматични прекъсвачи", + "breakerStateClosed": "Затворено", + "breakerStateOpen": "Отворете", + "breakerStateHalfOpen": "Полуотворено", + "tripped": "{count} се задейства", + "healthy": "{count} здрав", + "resetAll": "Нулиране на всички", + "noCircuitBreakers": "Все още няма активни прекъсвачи. Те се създават автоматично, когато заявките преминават през комбинирания конвейер.", + "failures": "{count} грешка(и)", + "policiesLocked": "Политики и заключени идентификатори", + "allOperational": "Всички системи работят — без блокиране или задействани прекъсвачи", + "loadingPolicies": "Правилата се зареждат...", + "lockedIdentifiers": "Заключени идентификатори", + "unlockedIdentifier": "Отключено: {identifier}", + "sinceDate": "от {date}", + "forceUnlock": "Принудително отключване", + "unlocking": "Отключване...", + "failedUnlock": "Неуспешно отключване", + "failedLoadWithStatus": "Неуспешно зареждане: {status}", + "failedLoadResilience": "Неуспешно зареждане на състоянието на устойчивост", + "saveFailed": "Запазването не бе успешно", + "resetFailed": "Неуспешно нулиране", + "loadingResilience": "Състоянието на устойчивост се зарежда...", + "retry": "Опитайте отново", + "systemStorage": "Система и съхранение", + "allDataLocal": "Всички данни, съхранявани локално на вашата машина", + "databasePath": "Път на базата данни", + "exportDatabase": "Експортиране на база данни", + "exportAll": "Експортиране на всички (.tar.gz)", + "importDatabase": "Импортиране на база данни", + "confirmDbImport": "Потвърдете импортирането на база данни", + "confirmDbImportDesc": "Това ще замени всички текущи данни със съдържанието от {file}. Резервно копие ще бъде създадено автоматично преди импортирането.", + "yesImport": "Да, импортиране", + "lastBackup": "Последно архивиране", + "noBackupYet": "Все още няма резервно копие", + "backupNow": "Архивирайте сега", + "backupRestore": "Архивиране и възстановяване", + "viewBackups": "Преглед на резервни копия", + "hide": "Скрий се", + "backupRetentionDesc": "Моментните снимки на базата данни се създават автоматично преди възстановяване и на всеки 15 минути, когато данните се променят. Задържане: 24 часа + 30 ежедневни резервни копия с интелигентна ротация.", + "loadingBackups": "Резервните копия се зареждат...", + "noBackupsYet": "Все още няма налични резервни копия. Архивите ще се създават автоматично при промяна на данните.", + "backupsAvailable": "{count} налични резервни копия", + "refresh": "Опресняване", + "confirm": "Потвърждаване?", + "yes": "да", + "no": "не", + "restore": "Възстановяване", + "invalidFileType": "Невалиден тип файл. Приемат се само .sqlite файлове.", + "exportFailed": "Неуспешно експортиране", + "exportFailedWithError": "Неуспешно експортиране: {error}", + "fullExportFailedWithError": "Неуспешно пълно експортиране: {error}", + "backupCreated": "Създаден резервен копие: {file}", + "restoreSuccess": "Възстановен! {connections} връзки, {nodes} възли, {combos} комбинации, {apiKeys} API ключове.", + "importSuccess": "Базата данни е импортирана! {connections} връзки, {nodes} възли, {combos} комбинации, {apiKeys} API ключове.", + "justNow": "точно сега", + "minutesAgo": "преди {count}мин", + "hoursAgo": "преди {count}ч", + "daysAgo": "преди {count}d", + "backupReasonManual": "ръководство", + "backupReasonPreRestore": "предварително възстановяване", + "connectionsCount": "{count, plural, one {# connection} other {# connections}}", + "noChangesSinceBackup": "Няма промени от последното архивиране", + "backupFailed": "Неуспешно архивиране", + "restoreFailed": "Възстановяването не бе успешно", + "importFailed": "Неуспешно импортиране", + "errorDuringRestore": "Възникна грешка по време на възстановяването", + "errorDuringImport": "Възникна грешка при импортиране", + "modelPricing": "Ценообразуване на модела", + "modelPricingDesc": "Конфигуриране на разходни ставки за модел • Всички ставки в $/1 милион токени", + "providers": "Доставчици", + "registry": "Регистър", + "priced": "На цена", + "searchProvidersModels": "Търсете доставчици или модели...", + "showAll": "Покажи всички", + "noProvidersMatch": "Няма доставчици, отговарящи на вашето търсене.", + "howPricingWorks": "Как работи ценообразуването", + "cacheWrite": "Кеш запис", + "unsaved": "незаписан", + "resetDefaults": "Нулиране на настройките по подразбиране", + "saveProvider": "Запазване на доставчика", + "saving": "Запазва се...", + "model": "Модел", + "models": "модели", + "moreProviders": "{count} още доставчици", + "withPricing": "с конфигурирано ценообразуване", + "policiesCircuitBreakers": "Политики и прекъсвачи", + "activeIssuesDetected": "Открити са активни проблеми", + "off": "Изкл", + "resetPricingConfirm": "Нулиране на всички цени за {provider} към стойностите по подразбиране?", + "pricingDescInput": "Вход: токени, изпратени до модела", + "pricingDescOutput": "Резултат: генерирани токени", + "pricingDescCached": "Кеширано: повторно използван вход (~50% от скоростта на въвеждане)", + "pricingDescReasoning": "Разсъждение: мислещи токени (връща се към изхода)", + "pricingDescCacheWrite": "Cache Write: създаване на записи в кеша (връща се към Input)", + "pricingDescFormula": "Цена = (вход × инпут_скорост) + (изход × изходна_скорост) + (кеширана × кеширана_скорост) на милион токени.", + "pricingSettingsTitle": "Настройки на цените", + "totalModels": "Общо модели", + "active": "Активен", + "costCalculation": "Изчисляване на разходите", + "costCalculationDesc": "Разходите се изчисляват въз основа на използването на токени и ценови ставки, конфигурирани за всеки модел.", + "pricingFormat": "Формат на цените", + "pricingFormatDesc": "Всички курсове са в $/1 милион токени (долара за милион токени).", + "tokenTypes": "Видове жетони", + "inputTokenDesc": "Стандартни токени за подкана", + "outputTokenDesc": "Токени за завършване/отговор", + "cachedTokenDesc": "Кеширани токени за въвеждане (обикновено 50% от скоростта на въвеждане)", + "reasoningTokenDesc": "Специални токени за разсъждение/мислене (резервно връщане към изходна скорост)", + "cacheCreationTokenDesc": "Токени, използвани за създаване на записи в кеша (резервен към скоростта на въвеждане)", + "customPricingNote": "Можете да замените цените по подразбиране за конкретни модели. Персонализираните замени имат приоритет пред автоматично разпознатото ценообразуване.", + "editPricing": "Редактиране на цените", + "viewFullDetails": "Вижте пълните подробности" + }, + "translator": { + "title": "Преводач", + "metaTitle": "Площадка за преводачи | OmniRoute", + "metaDescription": "Отстраняване на грешки, тестване и визуализиране на преводи на API формат между доставчици", + "playgroundTitle": "Площадка за преводачи", + "playground": "Детска площадка", + "realtime": "Преводаческа дейност в реално време", + "chatTester": "Чат тестер", + "testBench": "Тестова стенда", + "liveMonitor": "Монитор на живо", + "modeDescriptionPlayground": "Поставете произволно тяло на заявка за API и вижте как OmniRoute го превежда между формати на доставчик (OpenAI ↔ Claude ↔ Gemini ↔ Responses API)", + "modeDescriptionChatTester": "Изпращайте реални заявки за чат през OmniRoute и проверявайте пълното двупосочно пътуване: въвеждане, преведена заявка, отговор на доставчика и преведен изход.", + "modeDescriptionTestBench": "Стартирайте предварително дефинирани сценарии и сравнете съвместимостта между доставчици и модели.", + "modeDescriptionLiveMonitor": "Гледайте събития за превод в реално време, докато заявките преминават през OmniRoute.", + "modeDescriptionFallback": "Отстранете грешки, тествайте и визуализирайте как OmniRoute превежда API заявки между доставчици.", + "recentTranslations": "Скорошни преводи", + "noTranslations": "Все още няма преводи", + "source": "Източник", + "target": "Цел", + "time": "време", + "model": "Модел", + "status": "Статус", + "latency": "Латентност", + "totalTranslations": "Общо преводи", + "successful": "Успешно", + "errors": "Грешки", + "avgLatency": "Средна латентност", + "millisecondsShort": "{value}ms", + "notAvailableSymbol": "—", + "liveAutoRefreshing": "На живо — Автоматично опресняване", + "paused": "На пауза", + "eventsAppearHint": "Събитията за превод се появяват тук, когато заявките преминават през OmniRoute. Използвайте някой от тези методи за генериране на събития:", + "chatTesterTab": "Раздел Тестер за чат", + "testBenchTab": "Раздел Test Bench", + "externalApiCalls": "Външни API извиквания", + "ideCliIntegrations": "IDE/CLI интеграции", + "inMemoryNote": "Забележка: Събитията се съхраняват в паметта и се нулират, когато сървърът се рестартира.", + "ok": "добре", + "errorShort": "ГРЕШКА", + "formatConverter": "Конвертор на формати", + "formatConverterDescription": "Поставете или въведете JSON тяло на заявка. Преводачът автоматично ще открие изходния формат и ще го преобразува в целевия формат. Използвайте това за отстраняване на грешки как OmniRoute превежда заявки между формати (OpenAI ↔ Claude ↔ Gemini ↔ Responses API).", + "input": "Вход", + "output": "Изход", + "auto": "Авто", + "swapFormats": "Размяна на формати", + "translateAction": "Превеждай", + "clear": "ясно", + "inputPlaceholder": "Поставете текст на заявка тук или изберете шаблон по-долу...", + "exampleTemplates": "Примерни шаблони", + "exampleTemplatesHint": "— Щракнете за зареждане", + "templateLoadHint": "Шаблонът зарежда заявката във формат {format}. Промяна на изходния формат за зареждане в различен формат.", + "compatibilityTester": "Тестер за съвместимост", + "compatibilityReport": "Доклад за съвместимост", + "testBenchDescription": "Стартирайте предварително дефинирани сценарии (обикновен чат, извикване на инструмент и т.н.), за да проверите съвместимостта на превода и доставчика. Изберете изходен формат и целеви доставчик, след което изпълнете всички тестове, за да видите процент на съвместимост. Използвайте това, за да разберете кои функции работят при различните доставчици.", + "targetProvider": "Целеви доставчик", + "runAllTests": "Изпълнете всички тестове", + "runTest": "Изпълнете тест", + "reRun": "Повторно изпълнение", + "running": "Работи...", + "passed": "премина", + "failed": "неуспешно", + "passedIconLabel": "✅ Успешно", + "chunks": "буци", + "scenarioSimpleChat": "Обикновен чат", + "scenarioToolCalling": "Извикване на инструмент", + "scenarioMultiTurn": "Многооборотен", + "scenarioThinking": "Мислене", + "scenarioSystemPrompt": "Системен ред", + "scenarioStreaming": "Поточно предаване", + "templateNames": { + "simple-chat": "Обикновен чат", + "tool-calling": "Извикване на инструмент", + "multi-turn": "Многооборотен", + "thinking": "Мислене", + "system-prompt": "Системен ред", + "streaming": "Поточно предаване" + }, + "templateDescriptions": { + "simple-chat": "Основно текстово съобщение", + "tool-calling": "Извикване на функция/инструмент", + "multi-turn": "Разговор с историята", + "thinking": "Разширено мислене/разсъждение", + "system-prompt": "Комплексни системни инструкции", + "streaming": "Заявка за поточно предаване на SSE" + }, + "templatePayloads": { + "simpleChat": { + "system": "Вие сте полезен помощник.", + "userGreeting": "здравей как си днес" + }, + "toolCalling": { + "userWeather": "Какво е времето в Сао Пауло?", + "toolDescription": "Вземете текущото време за местоположение", + "cityNameDescription": "Име на града" + }, + "multiTurn": { + "system": "Вие сте асистент по кодиране.", + "userInitial": "Напишете функция за сортиране на масив в Python.", + "assistantExample": "Ето една проста функция за сортиране:\n\n``` питон\ndef sort_array(arr):\n връща сортиран (arr)\n```", + "userFollowUp": "Сега го подредете в низходящ ред." + }, + "thinking": { + "question": "Какъв е сборът на първите 100 прости числа?" + }, + "systemPrompt": { + "systemInstruction": "Вие сте старши софтуерен инженер, специализиран в разпределени системи. Отговаряйте на въпроси сбито, като използвате най-добрите практики в индустрията. Винаги предоставяйте примери за код, когато е уместно. Форматирайте отговорите си, като използвате маркдаун.", + "question": "Как да внедря модел на прекъсвач?" + }, + "streaming": { + "prompt": "Разкажете ми кратка история за робот, който се учи да рисува." + } + }, + "openaiCompatibleLabel": "Съвместим с OpenAI", + "anthropicCompatibleLabel": "Антропно съвместим", + "noTemplateForFormat": "Няма шаблон за този формат", + "translationFailed": "Неуспешен превод: {error}", + "pipelineDebugger": "Дебъгер за тръбопровод", + "translationPipeline": "Тръбопровод за превод", + "pipelineVisualization": "Визуализация на тръбопровода", + "pipelineVisualizationHint": "Изпратете съобщение, за да видите как вашата заявка преминава през откриване → превод → обаждане на доставчик.", + "chatTesterDescription": "Изпращайте съобщения като специфичен клиентски формат и проверявайте всяка стъпка от конвейера за превод.", + "chatTesterFlow": "Клиентска заявка → Откриване на формат → Междинен OpenAI → Формат на доставчик → Отговор", + "clickStepToInspect": "Щракнете върху която и да е стъпка, за да проверите данните на този етап.", + "clientFormat": "Клиентски формат", + "provider": "Доставчик", + "modelPlaceholder": "Изберете или въведете име на модел...", + "sendMessageToSeePipeline": "Изпратете съобщение, за да видите конвейера за превод", + "chatMessageHintPrefix": "Вашето съобщение ще бъде форматирано като a", + "chatMessageHintSuffix": "заявка, преведена през тръбопровода и изпратена до избрания доставчик.", + "youWithFormat": "Вие ({format})", + "assistant": "Помощник", + "typeMessage": "Въведете съобщение...", + "send": "Изпратете", + "clientRequest": "Клиентска заявка", + "clientRequestDescription": "Основният текст на заявката, както би го изпратил вашият клиент", + "formatDetected": "Открит формат", + "formatDetectedDescription": "OmniRoute автоматично открива формата на API от структурата на заявката", + "openaiIntermediate": "OpenAI Intermediate", + "openaiIntermediateDescription": "Всички формати първо се нормализират към OpenAI формат (универсален мост)", + "providerFormat": "Формат на доставчика", + "providerFormatDescription": "Форматът OpenAI се превежда в родния формат на доставчика", + "providerResponse": "Отговор на доставчика", + "providerResponseRawDescription": "Суровият отговор от API на доставчика", + "providerResponseSseDescription": "Суровият SSE поток от API на доставчика", + "unexpectedError": "Възникна неочаквана грешка", + "error": "Грешка", + "errorMessage": "Грешка: {message}", + "requestFailed": "Неуспешна заявка", + "noTextExtracted": "(Не е извлечен текст)", + "liveMonitorDescriptionPrefix": "Показва събития за превод, докато извикванията на API протичат през OmniRoute. Събитията идват от буфера в паметта (нулира се при рестартиране). Използвайте", + "liveMonitorDescriptionSuffix": "или външни извиквания на API за генериране на събития." + }, + "usage": { + "title": "Използване", + "loggerTab": "Дървосекач", + "proxyTab": "Прокси", + "budgetManagement": "Управление на бюджета", + "budgetSaved": "Бюджетните ограничения са запазени", + "budgetSaveFailed": "Неуспешно запазване на бюджета", + "loadingBudgetData": "Данните за бюджета се зареждат...", + "noApiKeysTitle": "Няма API ключове", + "noApiKeysDescription": "Първо добавете API ключове, за да настроите бюджетни ограничения.", + "apiKey": "API ключ", + "todaysSpend": "Днешните разходи", + "thisMonth": "Този месец", + "setLimits": "Задайте граници", + "dailyLimitUsd": "Дневен лимит (USD)", + "monthlyLimitUsd": "Месечен лимит (USD)", + "warningThresholdPercent": "Предупредителен праг (%)", + "dailyLimitPlaceholder": "напр. 5.00", + "monthlyLimitPlaceholder": "напр. 50,00", + "warningThresholdPlaceholder": "80", + "saveLimits": "Запазване на ограниченията", + "budgetOk": "Бюджетът е наред — остават {remaining}", + "budgetExceeded": "Бюджетът е надвишен — заявките могат да бъдат блокирани", + "totalRequests": "Общо заявки", + "noDataYet": "Все още няма данни", + "latency": "Латентност", + "latencyP50": "p50", + "latencyP95": "стр. 95", + "latencyP99": "стр. 99", + "promptCache": "Кеш на подканите", + "systemHealth": "Здраве на системата", + "entries": "Вписвания", + "activeCount": "{count} активен", + "openCircuitBreakersDetected": "Открити са отворени прекъсвачи", + "hitRate": "Процент на попадения", + "hitsMisses": "Попадения / пропуски", + "circuitBreakers": "Автоматични прекъсвачи", + "lockedIPs": "Заключени IP адреси", + "lockoutsAutoRefreshHint": "Заключвания на ограничение на скоростта за модел • Автоматично опресняване 10s", + "lockedCount": "{count, plural, one {# locked} other {# locked}}", + "timeLeft": "Остава {time}", + "howItWorks": "Как работи", + "howItWorksSubtitle": "Научете как оценките валидират вашите LLM отговори", + "define": "Дефинирайте", + "defineStepDescription": "Създавайте тестови случаи с подкани за въвеждане и очаквани изходни критерии, като използвате стратегии като съдържа, регулярен израз или точно съвпадение.", + "run": "Бягай", + "runStepDescription": "Изпълнете тестови случаи срещу вашите LLM крайни точки чрез OmniRoute. Всеки случай се изпраща като истинска заявка за API.", + "evaluate": "Оценете", + "evaluateStepDescription": "Отговорите се сравняват с очакваните критерии. Вижте успешно/неуспешно за всеки случай с показатели за забавяне и подробна обратна връзка.", + "evalSuites": "Комплекти за оценка", + "evalSuitesHint": "Щракнете върху пакет, за да видите тестови случаи, след което стартирайте, за да оцените крайните си точки на LLM", + "evalsLoading": "Зареждат се пакетите eval...", + "noEvalSuitesFound": "Няма намерени Eval Suites", + "noEvalSuitesDescription": "Пакетите Eval могат да бъдат дефинирани чрез API или в код. Те тестват изходните данни на модела спрямо очакваните резултати, като използват стратегии като съдържа, регулярен израз, точно съвпадение и персонализирани функции.", + "columnCase": "Случай", + "columnStatus": "Статус", + "columnLatency": "Латентност", + "columnDetails": "Подробности", + "columnModel": "Модел", + "columnStrategy": "Стратегия", + "columnExpected": "Очаквано", + "statsSuites": "Апартаменти", + "statsTestCases": "Тестови случаи", + "statsModels": "Модели", + "statsCoverage": "Покритие", + "statsStrategiesCount": "{count} стратегии", + "evaluationStrategies": "Стратегии за оценка", + "modelsUnderTest": "Тествани модели", + "searchSuitesPlaceholder": "Търсене на апартаменти...", + "passSuffix": "пас", + "casesCount": "{count, plural, one {# case} other {# cases}}", + "runEval": "Стартирайте Eval", + "runningProgress": "Изпълнява се {current}/{total}...", + "passRate": "проходимост", + "summaryBreakdown": "{passed} преминат · {failed} неуспешно · {total} общо", + "passedIconLabel": "✅ Успешно", + "failedIconLabel": "❌ Неуспешно", + "detailsContains": "Съдържа: \"{term}\"", + "detailsRegex": "Регулярен израз: {pattern}", + "detailsExpected": "Очаква се: „{expected}“", + "noResultsYet": "Все още няма резултати", + "testCasesCount": "Тестови случаи ({count})", + "noTestCasesDefined": "Няма дефинирани тестови случаи", + "runEvalHint": "Щракнете върху „Run Eval“, за да изпълните всички случаи срещу вашата крайна точка на LLM. Всеки тест изпраща истинска заявка през OmniRoute.", + "notifyNoTestCases": "Няма дефинирани тестови случаи за този пакет", + "notifyAllCasesPassed": "Всички {total} случаи преминаха ✅", + "notifySomeCasesFailed": "{passed}/{total} издържан, {failed} неуспешен", + "notifyEvalRunFailed": "Изпълнението на Eval е неуспешно", + "notifyEvalTitle": "Стойност: {name}", + "modelEvals": "Моделни оценки", + "evalsHeroDescription": "Тествайте и валидирайте вашите LLM крайни точки, като стартирате предварително дефинирани пакети за оценка. Всеки пакет съдържа тестови случаи, които изпращат реални подкани чрез OmniRoute и сравняват отговорите спрямо очакваните критерии – като ви помагат да откриете регресии, да сравните модели и да гарантирате качество на отговора между доставчиците.", + "qualityValidation": "Валидиране на качеството", + "modelComparison": "Сравнение на модела", + "regressionDetection": "Откриване на регресия", + "latencyBenchmarks": "Сравнителни показатели за латентност", + "modelLockouts": "Блокировки на модела", + "noLockouts": "В момента няма заключени модели", + "activeSessions": "Активни сесии", + "noSessions": "Няма активни сесии", + "sessionsHint": "Сесиите се появяват, когато заявките преминават през проксито", + "sessionsTrackedHint": "Проследява се чрез пръстов отпечатък на заявка • Автоматично опресняване 5s", + "session": "Сесия", + "age": "Възраст", + "requests": "Заявки", + "connection": "Връзка", + "durationMillisecondsShort": "{value}ms", + "durationSecondsShort": "{value}s", + "durationMinutesShort": "{value}m", + "durationHoursShort": "{value}ч", + "reasonSeparator": " - ", + "notAvailableSymbol": "-", + "providerLimits": "Ограничения на доставчика", + "noProviders": "Няма свързани доставчици", + "connectProvidersForQuota": "Свържете се с доставчици с OAuth, за да проследите вашите ограничения на квотата и използването на API.", + "accountsCount": "{count, plural, one {# account} other {# accounts}}", + "filteredFromCount": "(филтриран от {count})", + "autoRefresh": "Автоматично опресняване", + "refreshAll": "Опресни всички", + "loadingQuotas": "Зареждане...", + "account": "акаунт", + "modelQuotas": "Моделни квоти", + "lastUsed": "Последно използвано", + "actions": "Действия", + "refreshQuota": "Опресняване на квотата", + "today": "Днес", + "tomorrow": "утре", + "dayTimeFormat": "{day}, {time}", + "inDuration": "в {duration}", + "notApplicable": "N/A", + "rawPlanWithValue": "Необработен план: {plan}", + "noPlanFromProvider": "Няма план от доставчика", + "noQuotaData": "Няма данни за квоти", + "noQuotaDataAvailable": "Няма налични данни за квота", + "noAccountsForTierFilter": "Няма намерени акаунти за филтър за ниво", + "tierAll": "Всички", + "tierEnterprise": "Предприятие", + "tierTeam": "Екип", + "tierBusiness": "Бизнес", + "tierUltra": "Ултра", + "tierPro": "Професионалист", + "tierPlus": "плюс", + "tierFree": "безплатно", + "tierUnknown": "неизвестен" + }, + "modals": { + "waitingAuth": "Изчакване на разрешение", + "verificationUrl": "URL адрес за проверка", + "yourCode": "Вашият код", + "remoteAccess": "Отдалечен достъп:", + "connectedSuccess": "Свързахте се успешно!", + "connectionFailed": "Неуспешна връзка", + "chooseAuthMethod": "Изберете своя метод за удостоверяване:", + "awsBuilderId": "ИД на AWS Builder", + "awsIamIdentity": "Център за идентичност на AWS IAM", + "googleAccount": "Google акаунт", + "githubAccount": "GitHub акаунт", + "importToken": "Импортиране на токен", + "pasteToken": "Поставете токена за опресняване от Kiro IDE.", + "awsRegion": "Регион AWS", + "autoDetecting": "Автоматично откриване на токени...", + "readingFromCache": "Четене от AWS SSO кеш", + "readingFromCursor": "Четене от базата данни на Cursor IDE", + "initializing": "Инициализира се...", + "pricingConfig": "Конфигурация на цените", + "loadingPricing": "Данните за цените се зареждат...", + "pricingRatesFormat": "Формат на цените", + "noPricingData": "Няма налични данни за цените", + "noModelsFound": "Няма намерени модели" + }, + "loggers": { + "allProviders": "Всички доставчици", + "allModels": "Всички модели", + "allAccounts": "Всички сметки", + "allApiKeys": "Всички API ключове", + "allTypes": "Всички видове", + "allLevels": "Всички нива", + "modelAZ": "Модел A-Z", + "modelZA": "Модел Z-A", + "loadingLogs": "Зареждат се регистрационни файлове...", + "loadingProxyLogs": "Прокси регистрационните файлове се зареждат...", + "noLogEntries": "Няма намерени записи в регистрационния файл", + "noPayloadData": "Няма налични данни за полезен товар за този запис в журнала.", + "proxyEvent": "Прокси събитие", + "proxy": "Прокси", + "level": "Ниво", + "directNative": "Директен (местен)", + "combo": "Комбо", + "inputTokens": "аз:", + "outputTokens": "О:" + }, + "stats": { + "usageOverview": "Преглед на употребата", + "outputTokens": "Изходни токени", + "totalCost": "Обща цена", + "usageByModel": "Използване по модел", + "usageByAccount": "Използване по акаунт", + "failedToLoad": "Неуспешно зареждане на статистика за употреба.", + "tokenHealth": "Токен Здраве", + "totalOAuth": "Общо OAuth", + "healthy": "Здрави", + "warning": "Предупреждение", + "errored": "Грешка", + "lastCheck": "Последна проверка", + "noData": "Няма данни", + "share": "Споделете", + "unableToLoad": "Системните показатели не могат да се заредят", + "product": "Продукт", + "resources": "Ресурси", + "company": "Компания" + }, + "auth": { + "welcome": "Добре дошли", + "signIn": "влезте", + "enterPassword": "Въведете паролата си, за да продължите", + "password": "Парола", + "unifiedProxy": "Unified AI API прокси", + "unifiedAiApiProxy": "Unified AI API прокси", + "unifiedAiApiProxyDesc": "Насочвайте заявки към множество доставчици на AI през една крайна точка. Вградено балансиране на натоварването, преход при срив и проследяване на използването.", + "passwordNotEnabled": "Защитата с парола не е активирана", + "loading": "Зареждане...", + "invalidPassword": "Невалидна парола", + "errorOccurredRetry": "Възникна грешка. Моля, опитайте отново.", + "configureInstance": "Нека да конфигурираме вашето копие на OmniRoute", + "runOnboardingWizard": "Стартирайте съветника за включване, за да настроите паролата си и да свържете първия си доставчик на AI.", + "startOnboarding": "Започнете Onboarding", + "secureYourInstance": "Защитете своя екземпляр", + "setPasswordDescription": "Задайте парола, за да защитите таблото си за управление и да защитите крайните си точки на API от неоторизиран достъп.", + "configurePassword": "Конфигурирайте парола", + "continue": "Продължи", + "windowWillClose": "Този прозорец ще се затвори автоматично...", + "closeTabNow": "Можете да затворите този раздел сега.", + "copyUrlManual": "Моля, копирайте URL адреса от адресната лента и го поставете в приложението.", + "accessDeniedDescription": "Нямате разрешение за достъп до този ресурс. Проверете вашия API ключ или се свържете с администратора.", + "goToDashboard": "Отидете на таблото за управление", + "featureMultiProviderTitle": "Мулти-доставчик", + "featureMultiProviderDesc": "OpenAI, Anthropic, Google и др", + "featureLoadBalancingTitle": "Балансиране на натоварването", + "featureLoadBalancingDesc": "Разпределяйте заявките интелигентно", + "featureUsageTrackingTitle": "Проследяване на използването", + "featureUsageTrackingDesc": "Наблюдавайте разходите и токените", + "resetPassword": "Нулиране на парола", + "resetDescription": "Изберете метод за възстановяване на достъпа до вашето табло за управление", + "stopServer": "Спрете сървъра OmniRoute", + "processing": "Обработва се...", + "pleaseWait": "Моля, изчакайте, докато завършим оторизацията.", + "authSuccess": "Оторизацията е успешна!", + "copyUrl": "Копирайте този URL", + "accessDenied": "Достъпът е отказан", + "methodCliTitle": "Метод 1: Нулиране на CLI", + "methodCliDescription": "Изпълнете следната команда на сървъра, където се изпълнява OmniRoute:", + "methodCliHint": "Това ще ви подкани да зададете нова парола. Първо трябва да се спре сървъра.", + "methodManualTitle": "Метод 2: Ръчно нулиране", + "methodManualDescription": "Изтрийте паролата от базата данни и задайте нова при стартиране:", + "setPasswordInYour": "Задайте нова парола във вашия", + "fileLabelSuffix": "файл:", + "newPasswordPlaceholder": "вашата_нова_парола", + "deleteSettingsFile": "Изтриване", + "orRemovePasswordHashField": "или премахнете полето passwordHash", + "restartServerWithNewPassword": "Рестартирайте сървъра - той ще използва новата парола", + "backToLogin": "Назад към Вход", + "forgotPassword": "Забравена парола?" + }, + "landing": { + "brandName": "OmniRoute", + "navigateHome": "Навигирайте до дома", + "toggleMenu": "Превключване на менюто", + "featuresLink": "Характеристики", + "docsLink": "Документи", + "github": "GitHub", + "versionLive": "v1.0 вече е на живо", + "oneEndpoint": "Една крайна точка за", + "allProviders": "Всички доставчици на AI", + "heroDescription": "AI крайна точка прокси с уеб табло за управление - JavaScript порт на CLIProxyAPI. Работи безпроблемно с Claude Code, OpenAI Codex, Cline, RooCode и други CLI инструменти.", + "getStarted": "Започнете", + "viewOnGithub": "Вижте в GitHub", + "powerfulFeatures": "Мощни функции", + "featuresSubtitle": "Всичко, от което се нуждаете, за да управлявате вашата AI инфраструктура на едно място, създадено за мащаб.", + "featureUnifiedEndpointTitle": "Унифицирана крайна точка", + "featureUnifiedEndpointDesc": "Достъп до всички доставчици чрез един стандартен URL адрес на API.", + "featureEasySetupTitle": "Лесна настройка", + "featureEasySetupDesc": "Стартирайте за минути с командата npx.", + "featureModelFallbackTitle": "Резервен модел", + "featureModelFallbackDesc": "Автоматично превключване на доставчиците при повреда или голямо забавяне.", + "featureUsageTrackingTitle": "Проследяване на използването", + "featureUsageTrackingDesc": "Детайлен анализ и мониторинг на разходите във всички модели.", + "featureOAuthApiKeysTitle": "OAuth & API ключове", + "featureOAuthApiKeysDesc": "Сигурно управлявайте идентификационните данни в един трезор.", + "featureCloudSyncTitle": "Облачно синхронизиране", + "featureCloudSyncDesc": "Незабавно синхронизирайте вашите конфигурации между устройствата.", + "featureCliSupportTitle": "CLI поддръжка", + "featureCliSupportDesc": "Работи с Claude Code, Codex, Cline, Cursor и др.", + "featureDashboardTitle": "Табло", + "featureDashboardDesc": "Визуално табло за анализ на трафика в реално време.", + "howItWorks": "Как работи OmniRoute", + "howItWorksDescription": "Данните протичат безпроблемно от вашето приложение през нашия интелигентен слой за маршрутизиране до най-добрия доставчик за работата.", + "howItWorksStep1Title": "1. CLI & SDK", + "howItWorksStep1Description": "Вашите заявки започват от любимите ви инструменти или нашия обединен SDK. Просто променете основния URL адрес.", + "howItWorksStep2Title": "2. OmniRoute Hub", + "howItWorksStep2Description": "Нашата машина анализира подканата, проверява здравето на доставчика и маршрути за най-ниска латентност или цена.", + "howItWorksStep3Title": "3. Доставчици на AI", + "howItWorksStep3Description": "Заявката се изпълнява незабавно от OpenAI, Anthropic, Gemini или други.", + "getStartedIn30Seconds": "Започнете за 30 секунди", + "getStartedDescription": "Инсталирайте OmniRoute, конфигурирайте вашите доставчици чрез уеб таблото за управление и започнете да маршрутизирате AI заявки.", + "installOmniRoute": "Инсталирайте OmniRoute", + "installStepDescription": "Изпълнете командата npx, за да стартирате сървъра незабавно", + "openDashboard": "Отворете таблото за управление", + "openDashboardStepDescription": "Конфигурирайте доставчици и API ключове чрез уеб интерфейс", + "routeRequests": "Заявки за маршрути", + "routeRequestsStepDescription": "Насочете вашите CLI инструменти към {endpoint}", + "terminal": "терминал", + "copy": "копие", + "copied": "✓ Копирано", + "startingOmniRoute": "Стартиране на OmniRoute...", + "serverRunningOnLabel": "Сървърът работи", + "dashboardLabel": "Табло", + "readyToRoute": "Готов за маршрут! ✓", + "configureProvidersNote": "📝 Конфигурирайте доставчици в таблото за управление или използвайте променливи на средата", + "dataLocation": "Местоположение на данните:", + "dataLocationMacLinux": " macOS/Linux:", + "dataLocationWindows": " Windows:", + "product": "Продукт", + "dashboardLink": "Табло", + "changelog": "Дневник на промените", + "resources": "Ресурси", + "documentation": "Документация", + "npm": "НПМ", + "legal": "Законни", + "mitLicense": "Лиценз на MIT", + "footerTagline": "Унифицираната крайна точка за генериране на AI. Свържете, маршрутизирайте и управлявайте вашите AI доставчици с лекота.", + "copyright": "© {year} OmniRoute. Всички права запазени.", + "flowToolClaudeCode": "Клод Код", + "flowToolOpenAICodex": "OpenAI Codex", + "flowToolCline": "Клайн", + "flowToolCursor": "Курсор", + "flowProviderOpenAI": "OpenAI", + "flowProviderAnthropic": "Антропен", + "flowProviderGemini": "Близнаци", + "flowProviderGithubCopilot": "Копилот на GitHub", + "interactiveDiagram": "Интерактивна диаграма, видима на работния плот", + "ctaTitle": "Готови ли сте да опростите вашата AI инфраструктура?", + "ctaDescription": "Присъединете се към разработчици, които рационализират своите AI интеграции с OmniRoute. Отворен код и безплатен за стартиране.", + "startFree": "Започнете безплатно", + "readDocumentation": "Прочетете документацията" + }, + "docs": { + "title": "Документация", + "quickStart": "Бърз старт", + "features": "Характеристики", + "supportedProviders": "Поддържани доставчици", + "supportedProvidersToc": "Доставчици", + "commonUseCases": "Обичайни случаи на употреба", + "clientCompatibility": "Съвместимост на клиента", + "apiReference": "Справка за API", + "method": "Метод", + "path": "Пътека", + "notes": "Бележки", + "modelPrefixes": "Префикси на модела", + "prefix": "Префикс", + "troubleshooting": "Отстраняване на неизправности", + "supportsChat": "Поддържа крайни точки както за чат, така и за отговори.", + "oauthAutoRefresh": "OAuth връзка с автоматично опресняване на токена.", + "fullStreaming": "Пълна поддръжка за стрийминг за всички модели.", + "docsLabel": "Документи", + "docsHeroDescription": "AI шлюз за LLM с множество доставчици. Една крайна точка за OpenAI, Anthropic, Gemini, GitHub Copilot, Claude Code, Cursor и още 20+ доставчици.", + "openDashboard": "Отворете таблото за управление", + "endpointPage": "Страница с крайна точка", + "github": "GitHub", + "reportIssue": "Докладване на проблем", + "onThisPage": "На тази страница", + "documentationVersion": "Документация - v{version}", + "quickStartStep1Title": "1. Инсталирайте и стартирайте", + "quickStartStep1Prefix": "Бягай", + "quickStartStep1Middle": "или клонирайте от GitHub и стартирайте", + "quickStartStep2Title": "2. Създайте API ключ", + "quickStartStep2Text": "Отидете на Крайна точка -> Регистрирани ключове. Генерирайте по един ключ за среда.", + "quickStartStep3Title": "3. Свържете доставчици", + "quickStartStep3Text": "Добавете акаунти на доставчик чрез влизане в OAuth, API ключ или автоматично свързване на безплатно ниво.", + "quickStartStep4Title": "4. Задайте клиентски базов URL адрес", + "quickStartStep4Prefix": "Насочете своя IDE или API клиент към", + "quickStartStep4Suffix": "Използвайте например префикс на доставчика", + "featureRoutingTitle": "Маршрутизиране с множество доставчици", + "featureRoutingText": "Насочвайте заявки към 30+ доставчици на AI чрез една крайна точка, съвместима с OpenAI. Поддържа API за чат, отговори, аудио и изображения.", + "featureCombosTitle": "Комбинации и балансиране", + "featureCombosText": "Създавайте комбинации от модели с резервни вериги и стратегии за балансиране: кръгови, приоритетни, произволни, най-малко използвани и оптимизирани по отношение на разходите.", + "featureUsageTitle": "Проследяване на използването и разходите", + "featureUsageText": "Преброяване на токени в реално време, изчисляване на разходите за доставчик/модел и подробна разбивка на използването по API ключ и акаунт.", + "featureAnalyticsTitle": "Табло за анализ", + "featureAnalyticsText": "Визуален анализ с диаграми за заявки, токени, грешки, латентност, разходи и популярност на модела във времето.", + "featureHealthTitle": "Здравен мониторинг", + "featureHealthText": "Проверки на състоянието на живо, състояние на доставчика, състояния на прекъсвачи и автоматично откриване на ограничение на скоростта с експоненциално забавяне.", + "featureCliTitle": "CLI инструменти", + "featureCliText": "Управлявайте IDE конфигурации, експортирайте/импортирайте резервни копия, откривайте профили на Codex и конфигурирайте настройки от таблото за управление.", + "featureSecurityTitle": "Сигурност и политики", + "featureSecurityText": "Удостоверяване на API ключ, IP филтриране, незабавно инжектиране, правила за домейн, управление на сесии и одитно регистриране.", + "featureCloudSyncTitle": "Облачно синхронизиране", + "featureCloudSyncText": "Синхронизирайте конфигурацията си с Cloudflare Workers за отдалечен достъп с криптирани идентификационни данни и автоматично превключване при срив.", + "providersAcrossConnectionTypes": "{count} доставчици в три типа връзка.", + "manageProviders": "Управление на доставчици", + "providersCount": "{count} доставчици", + "providerTypeFree": "Безплатно ниво", + "providerTypeOAuth": "OAuth", + "providerTypeApiKey": "API ключ", + "useCaseSingleEndpointTitle": "Единична крайна точка за много доставчици", + "useCaseSingleEndpointText": "Насочете клиентите към един основен URL адрес и маршрут по префикс на модела (например: gh/, cc/, kr/, openai/).", + "useCaseFallbackTitle": "Резервен вариант и превключване на модели с комбинации", + "useCaseFallbackText": "Създавайте комбинирани модели в таблото за управление и поддържайте конфигурацията на клиента стабилна, докато доставчиците се сменят вътрешно.", + "useCaseUsageVisibilityTitle": "Използване, цена и видимост на отстраняването на грешки", + "useCaseUsageVisibilityText": "Проследявайте токени и цена по доставчик, акаунт и API ключ в разделите Използване и Анализ.", + "clientCherryStudioTitle": "Черешово студио", + "baseUrlLabel": "Основен URL адрес", + "chatEndpointLabel": "Крайна точка за чат", + "modelRecommendationLabel": "Препоръка за модел: явен префикс", + "clientCodexTitle": "Копилотни модели на Codex / GitHub", + "clientCodexBullet1": "Използвайте идентификатори на модели с", + "clientCodexBullet2": "Автоматичен маршрут за моделите от семейство Codex", + "clientCodexBullet3": "Моделите извън Codex продължават", + "clientCursorTitle": "Курсор IDE", + "clientCursorBullet1": "Използвайте", + "clientCursorBullet1Suffix": "префикс за модели Cursor.", + "clientCursorBullet2": "OAuth връзка - влизане от страницата Доставчици.", + "clientClaudeTitle": "Клод Код / Антигравитация", + "clientClaudeBullet1Prefix": "Използвайте", + "clientClaudeBullet1Middle": "(Клод) или", + "clientClaudeBullet1Suffix": "(Антигравитация) префикс.", + "endpointChatNote": "OpenAI-съвместима крайна точка за чат (по подразбиране).", + "endpointResponsesNote": "Крайна точка на API за отговори (Кодекс, o-серия).", + "endpointModelsNote": "Модел каталог за всички свързани доставчици.", + "endpointAudioNote": "Аудио транскрипция (Deepgram, AssemblyAI).", + "endpointImagesNote": "Генериране на изображения (NanoBanana).", + "endpointRewriteChatNote": "Помощник за пренаписване за клиенти без /v1.", + "endpointRewriteResponsesNote": "Помощник за пренаписване за отговори без /v1.", + "endpointRewriteModelsNote": "Помощник за пренаписване за откриване на модел без /v1.", + "modelPrefixesDescriptionStart": "Използвайте префикса на доставчика преди името на модела, за да насочите към конкретен доставчик. Пример:", + "modelPrefixesDescriptionEnd": "маршрути към GitHub Copilot.", + "provider": "Доставчик", + "type": "Тип", + "troubleshootingModelRouting": "Ако клиентът не успее с маршрутизирането на модела, използвайте изричен доставчик/модел (например: gh/gpt-5.1-codex).", + "troubleshootingAmbiguousModels": "Ако получите двусмислени грешки в модела, изберете префикс на доставчик вместо гол ID на модела.", + "troubleshootingCodexFamily": "За модели от семейството на GitHub Codex, запазете модела като gh/; рутерът избира /отговаря автоматично.", + "troubleshootingTestConnection": "Използвайте Табло > Доставчици > Тестване на връзката, преди да тествате от IDE или външни клиенти.", + "troubleshootingCircuitBreaker": "Ако доставчикът покаже отворен прекъсвач, изчакайте охлаждането или проверете страницата Health за подробности.", + "troubleshootingOAuth": "За доставчици на OAuth, повторно удостоверяване, ако токените изтекат. Проверете индикатора за състояние на картата на доставчика." + }, + "legal": { + "privacyPolicy": "Политика за поверителност", + "termsOfService": "Условия за ползване", + "providerConfigurations": "Конфигурации на доставчика", + "apiKeys": "API ключове", + "usageLogs": "Дневници за използване", + "applicationSettings": "Настройки на приложението", + "viewExportAnalytics": "Преглед и експортиране на анализи на използването", + "clearHistory": "Изчистване на историята на използването по всяко време", + "configureRetention": "Конфигуриране на правила за съхранение на регистрационни файлове", + "backupRestore": "Архивирайте и възстановете вашата база данни", + "privacyMetadataTitle": "Политика за поверителност | OmniRoute", + "privacyMetadataDescription": "Политика за поверителност за OmniRoute AI API прокси рутер.", + "termsMetadataTitle": "Условия за ползване | OmniRoute", + "termsMetadataDescription": "Условия на услугата за OmniRoute AI API прокси рутер.", + "backToHome": "Обратно към дома", + "lastUpdated": "Последна актуализация: {date}", + "policyLastUpdatedDate": "13 февруари 2026 г", + "listSeparator": "-", + "questionsVisit": "въпроси? Посетете нашия", + "githubRepository": "GitHub хранилище", + "privacySection1Title": "1. Архитектура на местно ниво", + "privacySection1Text": "OmniRoute е проектиран като първо локално приложение. Цялата обработка и съхранение на данни се извършва изцяло на вашата машина. Няма централизиран сървър, който да събира вашата информация.", + "privacySection2Title": "2. Данни, които съхраняваме", + "privacyDataStoredIn": "Следните данни се съхраняват локално в", + "privacyDataProviderConfigurationsDesc": "URL адреси за връзка, типове доставчици и настройки за приоритет", + "privacyDataApiKeysDesc": "криптирани и съхранявани локално за удостоверяване с доставчици на AI", + "privacyDataUsageLogsDesc": "брой заявки, използване на токени, имена на модели, времеви клейма и времена за отговор", + "privacyDataApplicationSettingsDesc": "предпочитания за тема, стратегия за маршрутизиране и комбинирани конфигурации", + "privacySection3Title": "3. Без телеметрия", + "privacySection3Text": "OmniRoute не събира телеметрични данни, анализи или доклади за сривове. Никакви данни не се изпращат до нас или трета страна. Вашите модели на използване, API извиквания и конфигурации остават изцяло лични.", + "privacySection4Title": "4. Доставчици на AI трети страни", + "privacySection4Text": "Когато правите API извиквания чрез OmniRoute, вашите заявки се препращат към доставчиците на AI, които сте конфигурирали (например: OpenAI, Anthropic, Google). Тези доставчици имат свои собствени правила за поверителност, които управляват начина, по който обработват вашите данни. Моля, прегледайте:", + "privacyOpenAiPolicy": "Политика за поверителност на OpenAI", + "privacyAnthropicPolicy": "Правила за поверителност на Anthropic", + "privacyGooglePolicy": "Правила за поверителност на Google", + "privacySection5Title": "5. Облачно синхронизиране (по избор)", + "privacySection5Text": "Ако активирате незадължителната функция за синхронизиране в облака, конфигурациите на доставчика и API ключовете може да бъдат предадени към конфигурирана крайна точка в облака. Тази функция е деактивирана по подразбиране и изисква изрично включване.", + "privacySection6Title": "6. Сеч", + "privacyLoggingIntro": "Регистърите на заявките могат да бъдат конфигурирани чрез настройките на таблото за управление. Можете да:", + "privacySection7Title": "7. Вашите права", + "privacySection7TextStart": "Тъй като всички данни се съхраняват локално, вие имате пълен контрол. Можете да изтриете данните си по всяко време, като премахнете", + "privacySection7TextEnd": "директория или използване на функциите за архивиране и възстановяване на база данни в таблото за управление.", + "termsSection1Title": "1. Преглед", + "termsSection1Text": "OmniRoute е първи локален AI API прокси рутер, който работи изцяло на вашата машина. Той насочва заявки към множество доставчици на AI с балансиране на натоварването, преход при срив и проследяване на използването.", + "termsSection2Title": "2. Отговорности на потребителя", + "termsResponsibilityApiKeys": "Вие носите цялата отговорност за управлението на вашите собствени API ключове и идентификационни данни за доставчици на AI трети страни (OpenAI, Anthropic, Google и др.).", + "termsResponsibilityCompliance": "Трябва да спазвате условията за обслужване на всеки доставчик на AI, до чиито API имате достъп чрез OmniRoute.", + "termsResponsibilitySecurity": "Вие носите отговорност за сигурността на вашата локална инсталация на OmniRoute, включително задаване на парола и ограничаване на достъпа до мрежата.", + "termsSection3Title": "3. Как работи", + "termsSection3Text": "OmniRoute действа като междинен прокси. Извикванията на API, изпратени до OmniRoute, се превеждат и препращат към вашите конфигурирани доставчици на AI. OmniRoute не променя съдържанието на вашите заявки или отговори извън необходимия превод на протокола.", + "termsSection4Title": "4. Обработка на данни", + "termsDataStoredLocally": "Всички данни се съхраняват локално на вашата машина в база данни SQLite.", + "termsNoTransmission": "OmniRoute не предава никакви данни към външни сървъри, освен ако изрично не активирате функциите за синхронизиране в облак.", + "termsDataLocationText": "Регистрационни файлове за използване, API ключове и конфигурация се съхраняват в", + "termsSection5Title": "5. Отказ от отговорност", + "termsSection5Text": "OmniRoute се предоставя „както е“ без каквато и да е гаранция. Ние не носим отговорност за каквито и да било разходи, възникнали поради използване на API, прекъсвания на услугата или загуба на данни. Винаги поддържайте резервни копия на вашата конфигурация.", + "termsSection6Title": "6. Отворен код", + "termsSection6Text": "OmniRoute е софтуер с отворен код. Вие сте свободни да го инспектирате, модифицирате и разпространявате съгласно условията на неговия лиценз." + } +} diff --git a/src/i18n/messages/da.json b/src/i18n/messages/da.json new file mode 100644 index 0000000000..49e5aa8451 --- /dev/null +++ b/src/i18n/messages/da.json @@ -0,0 +1,2040 @@ +{ + "common": { + "save": "Gem", + "cancel": "Annuller", + "delete": "Slet", + "loading": "Indlæser...", + "error": "Der opstod en fejl", + "success": "Succes", + "confirm": "Er du sikker?", + "refresh": "Opdater", + "close": "Luk", + "add": "Tilføj", + "edit": "Rediger", + "search": "Søg", + "back": "Tilbage", + "next": "Næste", + "submit": "Indsend", + "reset": "Nulstil", + "copy": "Kopiér", + "copied": "Kopieret!", + "enabled": "Aktiveret", + "disabled": "Deaktiveret", + "active": "Aktiv", + "inactive": "Inaktiv", + "noData": "Ingen tilgængelige data", + "configure": "Konfigurer", + "manage": "Administrer", + "name": "Navn", + "actions": "Handlinger", + "status": "Status", + "type": "Type", + "model": "Model", + "models": "modeller", + "provider": "Udbyder", + "account": "Konto", + "time": "Tid", + "details": "Detaljer", + "created": "Oprettet", + "lastUsed": "Sidst brugt", + "loadMore": "Indlæs mere", + "noResults": "Ingen resultater fundet", + "reloadPage": "Genindlæs siden", + "connected": "Forbundet", + "disconnected": "Afbrudt", + "notConfigured": "Ikke konfigureret", + "testConnection": "Test forbindelse", + "enable": "Aktiver", + "disable": "Deaktiver", + "columns": "Kolonner", + "newest": "Nyeste", + "oldest": "Ældste", + "all": "Alle", + "none": "Ingen", + "yes": "Ja", + "no": "Nej", + "warning": "Advarsel", + "note": "Bemærk", + "free": "Gratis", + "skipToContent": "Gå til indhold" + }, + "sidebar": { + "home": "Hjem", + "dashboard": "Dashboard", + "providers": "Udbydere", + "combos": "Combos", + "usage": "Brug", + "analytics": "Analytics", + "costs": "Omkostninger", + "health": "Sundhed", + "limits": "Grænser og kvoter", + "cliTools": "CLI værktøjer", + "settings": "Indstillinger", + "translator": "Oversætter", + "docs": "Dokumenter", + "issues": "Problemer", + "endpoint": "Slutpunkt", + "apiManager": "API Manager", + "logs": "Logs", + "auditLog": "Revisionslog", + "shutdown": "Nedlukning", + "restart": "Genstart", + "shutdownConfirm": "Vil du lukke OmniRoute ned?", + "restartConfirm": "Genstart OmniRoute?", + "version": "v{version}", + "debug": "Debug", + "system": "System", + "help": "Hjælp", + "serverDisconnected": "Server afbrudt", + "serverDisconnectedMsg": "Proxyserveren er blevet stoppet eller genstarter.", + "expandSidebar": "Udvid sidebjælken", + "collapseSidebar": "Skjul sidebjælken" + }, + "header": { + "logout": "Log ud", + "language": "Sprog", + "providers": "Udbydere", + "providerDescription": "Administrer dine AI-udbyderforbindelser", + "combos": "Combos", + "comboDescription": "Modelkombinationer med fallback", + "usage": "Brug & Analytics", + "usageDescription": "Overvåg dit API-brug, tokenforbrug og anmodningslogfiler", + "analytics": "Analytics", + "analyticsDescription": "Diagrammer, tendenser og evalueringsindsigter", + "cliTools": "CLI værktøjer", + "cliToolsDescription": "Konfigurer CLI-værktøjer", + "home": "Hjem", + "homeDescription": "Velkommen til OmniRoute", + "endpoint": "Slutpunkt", + "endpointDescription": "API-endepunktskonfiguration", + "settings": "Indstillinger", + "settingsDescription": "Administrer dine præferencer", + "openaiCompatible": "OpenAI-kompatibel", + "anthropicCompatible": "Antropisk kompatibel" + }, + "home": { + "quickStart": "Hurtig start", + "quickStartDesc": "Kom i gang i 4 trin. Tilslut udbydere, rutemodeller, overvåg alt.", + "fullDocs": "Fuld dokumenter", + "step1Title": "1. Opret API-nøgle", + "step1Desc": "Gå til Endpoint -> Registrerede nøgler. Generer én nøgle pr. miljø.", + "step2Title": "2. Tilslut udbydere", + "step2Desc": "Tilføj konti i Providers. Understøtter OAuth, API Key og gratis niveauer.", + "step3Title": "3. Peg din klient", + "step3Desc": "Indstil basis-URL til {url} i din IDE- eller API-klient.", + "step4Title": "4. Overvåg & optimer", + "step4Desc": "Spor tokens, omkostninger og fejl i Request Logs og Analytics.", + "providersOverview": "Oversigt over udbydere", + "configuredOf": "{configured} konfigureret af {total} tilgængelige udbydere", + "noModelsAvailable": "Ingen tilgængelige modeller for denne udbyder.", + "configureFirst": "Konfigurer en forbindelse først i {providers}", + "configureProvider": "Konfigurer udbyder", + "modelAvailable": "{count} model tilgængelig", + "modelsAvailable": "{count} modeller tilgængelige", + "connectionsActive": "{count} forbindelse aktiv", + "connectionsActivePlural": "{count} forbindelser aktive", + "copyModelName": "Kopiér modelnavnet", + "documentation": "Dokumentation", + "healthMonitor": "Sundhedsmonitor", + "reportIssue": "Rapportér problem", + "activeError": "{active} aktiv · {errors} fejl", + "oauthLabel": "OAuth", + "apiKeyLabel": "API nøgle", + "requestsShort": "{count} req", + "providerModelsTitle": "{provider} - Modeller", + "copiedModel": "Kopieret: {model}", + "aliasLabel": "alias" + }, + "analytics": { + "title": "Analytics", + "overviewDescription": "Overvåg dine API-brugsmønstre, tokenforbrug, omkostninger og aktivitetstendenser på tværs af alle udbydere og modeller.", + "evalsDescription": "Kør evalueringspakker for at teste og validere dine LLM-endepunkter. Sammenlign modelkvalitet, detekter regressioner og benchmark-forsinkelse.", + "overview": "Oversigt", + "evals": "Evals" + }, + "apiManager": { + "title": "API nøgler", + "createKey": "Opret API-nøgle", + "key": "Nøgle", + "revokeKey": "Tilbagekald nøgle", + "revokeConfirm": "Er du sikker på, at du vil tilbagekalde denne API-nøgle?", + "noKeys": "Ingen API-nøgler endnu", + "noKeysDesc": "Opret din første API-nøgle til at godkende anmodninger til dit slutpunkt", + "keyLabel": "Nøglemærke", + "permissions": "Tilladelser", + "expiresAt": "Udløber", + "never": "Aldrig", + "revoke": "Tilbagekald", + "showKey": "Vis nøgle", + "hideKey": "Skjul nøgle", + "copyKey": "Kopiér API-nøgle", + "allModels": "Alle modeller", + "selectedModels": "Udvalgte modeller", + "readOnly": "Kun læse", + "fullAccess": "Fuld adgang", + "keyManagement": "API nøglestyring", + "keyManagementDesc": "Opret og administrer API-nøgler til godkendelse af anmodninger til dit slutpunkt", + "totalKeys": "Totalnøgler", + "restricted": "Begrænset", + "totalRequests": "Samlet antal anmodninger", + "modelsAvailable": "Modeller tilgængelige", + "registeredKeys": "Registrerede nøgler", + "keysRegistered": "{count} nøgler registreret", + "keyRegistered": "{count} nøgle registreret", + "keysSecurityNote": "Hver nøgle isolerer brugssporing og kan tilbagekaldes uafhængigt. Nøgler er maskeret efter oprettelse for sikkerhed.", + "createFirstKey": "Opret din første nøgle", + "name": "Navn", + "usage": "Brug", + "created": "Oprettet", + "actions": "Handlinger", + "reqs": "req", + "neverUsed": "Aldrig brugt", + "deleteConfirm": "Vil du slette denne API-nøgle?", + "usageTips": "Brugstips", + "tipAuth": "Brug API-nøgler i autorisationsoverskriften som bærer DIN_KEY", + "tipSecure": "Nøgler vises kun én gang under oprettelsen - gem dem sikkert", + "tipSeparate": "Opret separate nøgler til forskellige klienter eller miljøer", + "tipRestrict": "Begræns nøgler til specifikke modeller for bedre sikkerhed og omkostningskontrol", + "keyName": "Nøglenavn", + "keyNamePlaceholder": "f.eks. Produktionsnøgle, Udviklingsnøgle", + "keyNameDesc": "Vælg et beskrivende navn for at identificere denne nøgles formål", + "keyCreated": "API-nøgle oprettet", + "keyCreatedSuccess": "Nøglen blev oprettet!", + "keyCreatedNote": "Kopiér og gem denne nøgle nu – den vises ikke igen.", + "done": "Færdig", + "savePermissions": "Gem tilladelser", + "allowAll": "Tillad alle", + "restrict": "Begræns", + "allowAllInfo": "Denne nøgle kan få adgang til alle tilgængelige modeller.", + "restrictInfo": "Denne nøgle kan få adgang til {selected} af {total} modeller.", + "selected": "{count} valgt", + "all": "Alle", + "clear": "Ryd", + "searchModels": "Søg efter modeller efter navn eller udbyder...", + "noModelsFound": "Ingen modeller fundet", + "keyNameRequired": "Nøglenavn er påkrævet", + "keyNameTooLong": "Nøglenavnet skal være på højst {max} tegn", + "keyNameInvalid": "Nøglenavn kan kun indeholde bogstaver, tal, mellemrum, bindestreger og understregninger", + "invalidKeyName": "Ugyldigt nøglenavn", + "failedCreateKey": "Kunne ikke oprette nøgle", + "failedCreateKeyRetry": "Kunne ikke oprette nøgle. Prøv venligst igen.", + "invalidKeyId": "Ugyldigt nøgle-id", + "failedDeleteKey": "Nøglen kunne ikke slettes", + "failedDeleteKeyRetry": "Nøglen kunne ikke slettes. Prøv venligst igen.", + "invalidModelsSelection": "Ugyldigt valg af modeller", + "cannotSelectMoreThanModels": "Kan ikke vælge mere end {max} modeller", + "failedUpdatePermissions": "Kunne ikke opdatere tilladelser", + "failedUpdatePermissionsRetry": "Kunne ikke opdatere tilladelser. Prøv venligst igen.", + "unknownProvider": "ukendt", + "copyMaskedKey": "Kopiér maskeret nøgle", + "modelsCount": "{count, plural, one {# model} other {# models}}", + "lastUsedOn": "Sidste: {date}", + "editPermissions": "Rediger tilladelser", + "deleteKey": "Slet nøgle", + "model": "{count} model", + "models": "{count} modeller", + "permissionsTitle": "Tilladelser: {name}", + "allowAllDesc": "Denne nøgle kan få adgang til alle tilgængelige modeller.", + "restrictDesc": "Denne nøgle kan få adgang til {selectedCount} af {totalModels} modeller.", + "selectedCount": "{count} valgt" + }, + "auditLog": { + "title": "Revisionslog", + "searchPlaceholder": "Søgehandlinger...", + "action": "Handling", + "actor": "Skuespiller", + "target": "Mål", + "ipAddress": "IP-adresse", + "timestamp": "Tidsstempel", + "noEntries": "Ingen revisionsposter fundet", + "filterByAction": "Filtrer efter handling...", + "filterByActor": "Filtrer efter skuespiller...", + "filterEntriesAria": "Filtrer revisionslogposter", + "filterByActionTypeAria": "Filtrer efter handlingstype", + "filterByActorAria": "Filtrer efter skuespiller", + "refreshAuditLogAria": "Opdater revisionslog", + "tableAria": "Revisionslogposter", + "failedFetchAuditLog": "Kunne ikke hente revisionslog", + "notAvailable": "—", + "description": "Administrative handlinger og sikkerhedshændelser", + "showing": "Viser {count} poster (offset {offset})", + "previous": "Forrige" + }, + "cliTools": { + "title": "CLI værktøjer", + "noActiveProviders": "Ingen aktive udbydere", + "noActiveProvidersDesc": "Tilføj og tilslut udbydere først for at konfigurere CLI-værktøjer.", + "mapModels": "Kortmodeller", + "testConnection": "Test forbindelse", + "connectionStatus": "Forbindelsesstatus", + "configureEndpoint": "Konfigurer slutpunkt", + "instructions": "Instruktioner", + "modelMapping": "Modelkortlægning", + "baseUrl": "Basis URL", + "apiKey": "API nøgle", + "configured": "Konfigureret", + "notConfigured": "Ikke konfigureret", + "notInstalled": "Ikke installeret", + "custom": "Brugerdefineret", + "unknown": "Ukendt", + "lastSavedAt": "Sidst gemt: {date}", + "never": "Aldrig", + "justNow": "lige nu", + "minutesAgoShort": "{count}m siden", + "hoursAgoShort": "{count}t siden", + "daysAgoShort": "{count}d siden", + "monthsAgoShort": "{count}måned siden", + "yearsAgoShort": "{count}år siden", + "runtimeCheckFailed": "Kørselskontrol mislykkedes", + "yourApiKeyPlaceholder": "din-api-nøgle", + "modelPlaceholder": "udbyder/model-id", + "configurationSaved": "Konfigurationen blev gemt.", + "failedToSave": "Konfigurationen kunne ikke gemmes.", + "noApiKeysCreateOne": "Ingen API-nøgler - Opret en på Nøgler-siden", + "defaultOmnirouteKey": "sk_omniroute (standard)", + "selectModel": "Vælg Model", + "selectModelForAlias": "Vælg model til {alias}", + "selectModelForTool": "Vælg model til {tool}", + "select": "Vælg", + "clear": "Ryd", + "comingSoon": "Kommer snart", + "checkingRuntime": "Kontrollerer køretidsstatus...", + "guideOnlyIntegration": "Integration kun til guide (ingen lokal kørselstid påkrævet)", + "cliRuntimeDetected": "CLI runtime registreret og klar", + "cliFoundNotRunnable": "CLI fundet, men kan ikke køres{reason}", + "cliRuntimeNotDetected": "CLI runtime ikke fundet", + "binary": "Binær", + "configPath": "Konfigurationssti", + "configPathShort": "Konfig", + "failedCheckRuntimeStatus": "Kørselsstatus kunne ikke kontrolleres.", + "copy": "Kopiér", + "copied": "Kopieret", + "copyConfig": "Kopiér Config", + "saveConfig": "Gem konfiguration", + "selectionSaved": "Valget er gemt", + "guide": "Vejledning", + "detected": "Opdaget", + "notReady": "Ikke klar", + "active": "Aktiv", + "inactive": "Inaktiv", + "startMitm": "Start MITM", + "stopMitm": "Stop MITM", + "mitmStarted": "MITM startede med succes!", + "mitmStopped": "MITM stoppede med succes!", + "failedStart": "Kunne ikke starte MITM", + "failedStop": "Kunne ikke stoppe MITM", + "saveMappings": "Gem kortlægninger", + "mappingsSaved": "Kortlægninger gemt!", + "failedSaveMappings": "Tilknytningerne kunne ikke gemmes", + "howItWorks": "Sådan fungerer det:", + "antigravityHowWorksDesc": "Antigravity sender anmodninger til Googles slutpunkt. MITM opsnapper og omdirigerer dem til OmniRoute.", + "antigravityStep1": "1. Start MITM for at dirigere anmodninger gennem OmniRoute.", + "antigravityStep2Prefix": "2. Tilføj", + "antigravityStep2Suffix": "til din hosts-fil som 127.0.0.1.", + "antigravityStep3": "3. Åbn Antigravity og anmodninger vil blive fuldført.", + "sudoPasswordRequiredTitle": "Sudo-adgangskode påkrævet", + "sudoPasswordHint": "Administratoradgangskode er påkrævet for at ændre værtsfil- og systemproxyindstillinger.", + "enterSudoPassword": "Indtast sudo adgangskode", + "sudoPasswordRequiredError": "Sudo-adgangskode er påkrævet.", + "cancel": "Annuller", + "confirm": "Bekræft", + "settingsApplied": "Indstillinger blev anvendt!", + "failedApplySettings": "Indstillingerne kunne ikke anvendes", + "settingsReset": "Indstillinger blev nulstillet!", + "failedResetSettings": "Indstillingerne kunne ikke nulstilles", + "backupRestored": "Backup gendannet!", + "failedRestore": "Kunne ikke gendanne", + "checkingCli": "Kontrollerer {tool} CLI...", + "cliNotRunnable": "{tool} CLI installeret, men kan ikke køres", + "cliNotInstalled": "{tool} CLI ikke installeret", + "cliNotDetected": "{tool} CLI ikke fundet", + "cliDetectedReady": "{tool} CLI fundet og klar", + "cliFoundFailedHealthcheck": "{tool} CLI blev fundet, men kørselssundhedstjek mislykkedes{reason}.", + "installCliPrompt": "Installer venligst {tool} CLI for at bruge denne funktion.", + "installCodexPrompt": "Installer venligst Codex CLI for at bruge auto-apply-funktionen.", + "hide": "Skjul", + "howToInstall": "Sådan installeres", + "installationGuide": "Installationsvejledning", + "platforms": "macOS / Linux / Windows:", + "afterInstallationRun": "Kør efter installationen", + "toVerify": "at verificere.", + "current": "Nuværende", + "baseUrlPlaceholder": "https://.../v1", + "resetToDefault": "Nulstil til standard", + "providerModelPlaceholder": "udbyder/model-id", + "apply": "Ansøg", + "reset": "Nulstil", + "manualConfig": "Manuel konfiguration", + "backups": "Sikkerhedskopier", + "configBackups": "Konfigurer sikkerhedskopier", + "noBackupsYet": "Ingen sikkerhedskopier endnu. Sikkerhedskopier oprettes automatisk før hver anvendelse eller nulstilling.", + "restore": "Gendan", + "backupRestoredReloading": "Backup gendannet! Genindlæser status...", + "failedRestoreBackup": "Kunne ikke gendanne backup", + "applied": "Anvendt!", + "failed": "Mislykkedes", + "resetDone": "Nulstil!", + "omnirouteConfiguredOpenAiCompatible": "OmniRoute er konfigureret som OpenAI-kompatibel udbyder", + "provider": "Udbyder", + "model": "Model", + "providers": "Udbydere", + "auth": "Auth", + "noApiKeysAvailable": "Ingen tilgængelige API-nøgler", + "usingDefaultOmniroute": "Bruger standard: sk_omniroute", + "updateConfig": "Opdater konfiguration", + "applyConfig": "Anvend Config", + "noBackupsAvailable": "Ingen tilgængelige sikkerhedskopier.", + "profileSaved": "Profilen \"{name}\" er gemt!", + "failedSaveProfile": "Profilen kunne ikke gemmes", + "profileActivated": "Profil aktiveret!", + "failedActivateProfile": "Profilen kunne ikke aktiveres", + "profiles": "Profiler", + "savedProfiles": "Gemte profiler", + "noProfilesYet": "Ingen profiler gemt endnu. Gem den aktuelle konfiguration som en profil nedenfor.", + "activate": "Aktiver", + "deleteProfile": "Slet profil", + "profileNamePlaceholder": "Profilnavn (f.eks. personlig konto)", + "saveCurrent": "Gem nuværende", + "codexAuthNotePrefix": "Codex bruger", + "codexAuthNoteMiddle": "med", + "codexAuthNoteSuffix": "Klik på \"Anvend\" for at konfigurere automatisk.", + "claudeManualConfiguration": "Claude CLI - Manuel konfiguration", + "codexManualConfiguration": "Codex CLI - Manuel konfiguration", + "droidManualConfiguration": "Factory Droid - Manuel konfiguration", + "openClawManualConfiguration": "Åbn Claw - Manuel konfiguration", + "clineManualConfiguration": "Cline manuel konfiguration", + "kiloManualConfiguration": "Kilokode manuel konfiguration", + "toolDescriptions": { + "antigravity": "Google Antigravity IDE med MITM", + "claude": "Antropisk Claude Code CLI", + "codex": "OpenAI Codex CLI", + "droid": "Factory Droid AI Assistant", + "openclaw": "Åbn Claw AI Assistant", + "cline": "Cline AI Coding Assistant CLI", + "kilo": "Kilokode AI Assistant CLI", + "cursor": "Cursor AI Code Editor", + "continue": "Fortsæt AI Assistant" + }, + "guides": { + "cursor": { + "notes": { + "0": "Kræver Cursor Pro-konto for at bruge denne funktion.", + "1": "Markøren dirigerer anmodninger gennem sin egen server, så lokalt slutpunkt understøttes ikke. Aktiver venligst Cloud Endpoint i Indstillinger." + }, + "steps": { + "1": { + "title": "Åbn Indstillinger", + "desc": "Gå til Indstillinger -> Modeller" + }, + "2": { + "title": "Aktiver OpenAI API", + "desc": "Aktiver muligheden \"OpenAI API-nøgle\"." + }, + "3": { + "title": "Basis URL" + }, + "4": { + "title": "API nøgle" + }, + "5": { + "title": "Tilføj brugerdefineret model", + "desc": "Klik på \"Vis alle modeller\" -> \"Tilføj brugerdefineret model\"" + }, + "6": { + "title": "Vælg Model" + } + } + }, + "continue": { + "steps": { + "1": { + "title": "Åbn Config", + "desc": "Åbn Fortsæt konfigurationsfil" + }, + "2": { + "title": "API nøgle" + }, + "3": { + "title": "Vælg Model" + }, + "4": { + "title": "Tilføj Model Config", + "desc": "Tilføj følgende konfiguration til dit modelarray:" + } + } + } + } + }, + "combos": { + "title": "Combos", + "description": "Skab modelkombinationer med vægtet routing og fallback-understøttelse", + "createCombo": "Opret Combo", + "editCombo": "Rediger kombination", + "deleteCombo": "Slet Combo", + "noModels": "Ingen modeller", + "noModelsYet": "Ingen modeller tilføjet endnu", + "addModel": "Tilføj model", + "addModelToCombo": "Tilføj Model til Combo", + "routingStrategy": "Rutestrategi", + "maxRetries": "Max forsøger igen", + "timeout": "Timeout (ms)", + "healthcheck": "Sundhedstjek", + "priority": "Prioritet", + "fallback": "Fallback", + "roundRobin": "Round Robin", + "random": "Tilfældig", + "leastLatency": "Mindst latenstid", + "comboName": "Combo navn", + "comboNamePlaceholder": "min-kombi", + "deleteConfirm": "Vil du slette denne kombination?", + "noCombosYet": "Ingen kombinationer endnu", + "comboCreated": "Kombinationen blev oprettet", + "comboUpdated": "Kombinationen blev opdateret", + "comboDeleted": "Combo slettet", + "failedCreate": "Kunne ikke oprette kombination", + "failedUpdate": "Kunne ikke opdatere kombinationen", + "errorCreating": "Fejl ved oprettelse af kombination", + "errorUpdating": "Fejl ved opdatering af kombination", + "errorDeleting": "Fejl ved sletning af kombination", + "testFailed": "Testanmodning mislykkedes", + "failedToggle": "Kombinationen kunne ikke skiftes", + "testResults": "Testresultater — {name}", + "resolvedBy": "Løst af:", + "more": "+{count} mere", + "reqs": "req", + "success": "succes", + "proxyConfigured": "Proxy konfigureret", + "copyComboName": "Kopiér kombinationsnavnet", + "enableCombo": "Aktiver kombination", + "disableCombo": "Deaktiver kombination", + "testCombo": "Test combo", + "duplicate": "Duplikat", + "proxyConfig": "Proxy konfiguration", + "nameRequired": "Navn er påkrævet", + "nameInvalid": "Kun bogstaver, tal, -, _, / og . tilladt", + "nameHint": "Bogstaver, tal, -, _, / og . tilladt", + "priorityDesc": "Sekventiel fallback: prøver model 1 først, derefter 2 osv.", + "weightedDesc": "Fordeler trafik efter vægtprocent med fallback", + "roundRobinDesc": "Cirkulær fordeling: hver anmodning går til den næste model i rotation", + "randomDesc": "Ensartet tilfældig udvælgelse, derefter tilbagevenden til de resterende modeller", + "leastUsedDesc": "Vælger modellen med færrest anmodninger, balancerer belastningen over tid", + "costOptimizedDesc": "Ruter til den billigste model først baseret på priser", + "models": "Modeller", + "autoBalance": "Auto-balance", + "advancedSettings": "Avancerede indstillinger", + "retryDelay": "Forsinkelse af forsøg igen (ms)", + "concurrencyPerModel": "Samtidighed / Model", + "queueTimeout": "Timeout for kø (ms)", + "advancedHint": "Lad være tom for at bruge globale standardindstillinger. Disse tilsidesætter indstillinger for hver udbyder.", + "moveUp": "Flyt op", + "moveDown": "Flyt ned", + "removeModel": "Fjern", + "saving": "Gemmer...", + "weighted": "Vægtet", + "leastUsed": "Mindst brugt", + "costOpt": "Cost-Opt" + }, + "costs": { + "title": "Omkostninger", + "budget": "Budget", + "totalCost": "Samlede omkostninger", + "breakdown": "Omkostningsfordeling", + "noData": "Ingen omkostningsdata", + "byModel": "Efter model", + "byProvider": "Af udbyder" + }, + "endpoint": { + "title": "API-endepunkt", + "available": "Tilgængelige endepunkter", + "cloudProxy": "Cloud proxy", + "disableConfirm": "Er du sikker på, at du vil deaktivere cloud-proxy?", + "baseUrl": "Basis URL", + "apiKeyLabel": "API nøgle", + "registeredKeys": "Registrerede nøgler", + "chatCompletions": "Chatafslutninger", + "responses": "Svar", + "listModels": "Liste over modeller", + "usingCloudProxy": "Brug af Cloud Proxy", + "usingLocalServer": "Brug af lokal server", + "machineId": "Maskin-id: {id}...", + "disableCloud": "Deaktiver Cloud", + "enableCloud": "Aktiver Cloud", + "modelsAcrossEndpoints": "{models} modeller på tværs af {endpoints} slutpunkter", + "chatDesc": "Streaming og ikke-streaming chat med alle udbydere", + "embeddings": "Indlejringer", + "embeddingsDesc": "Tekstindlejringer til søge- og RAG-pipelines", + "imageGeneration": "Billedgenerering", + "imageDesc": "Generer billeder fra tekstprompter", + "rerank": "Genranger", + "rerankDesc": "Genranger dokumenter efter relevans for en forespørgsel", + "audioTranscription": "Lydtransskription", + "audioTranscriptionDesc": "Transskriber lydfiler til tekst (Whisper)", + "textToSpeech": "Tekst til tale", + "textToSpeechDesc": "Konverter tekst til naturligt klingende tale", + "moderations": "Moderationer", + "moderationsDesc": "Indholdsmoderering og sikkerhedsklassificering", + "enableCloudTitle": "Aktiver Cloud Proxy", + "whatYouGet": "Hvad du får", + "cloudBenefitAccess": "Få adgang til din API fra hvor som helst i verden", + "cloudBenefitShare": "Del nemt slutpunkt med dit team", + "cloudBenefitPorts": "Ingen grund til at åbne porte eller konfigurere firewall", + "cloudBenefitEdge": "Hurtigt globalt kantnetværk", + "cloudSessionNote": "Cloud beholder din godkendelsessession i 1 dag. Hvis den ikke bruges, slettes den automatisk.", + "cloudUnstableNote": "Cloud er i øjeblikket ustabil med Claude Code OAuth i nogle tilfælde.", + "cloudConnected": "Cloud Proxy tilsluttet!", + "connectingToCloud": "Opretter forbindelse til skyen...", + "verifyingConnection": "Bekræfter forbindelse...", + "connecting": "Opretter forbindelse...", + "verifying": "Bekræfter...", + "connected": "Forbundet!", + "disableCloudTitle": "Deaktiver Cloud Proxy", + "disableWarning": "Alle godkendelsessessioner vil blive slettet fra skyen.", + "syncingData": "Synkroniserer seneste data...", + "disablingCloud": "Deaktiverer skyen...", + "syncing": "Synkroniserer...", + "disabling": "Deaktiverer...", + "cloudConnectedVerified": "Cloud Proxy tilsluttet og verificeret!", + "connectedVerificationPending": "Forbundet — bekræftelse afventer", + "connectedVerificationPendingWithError": "Forbundet — bekræftelse afventer: {error}", + "cloudDisabledSuccess": "Cloud deaktiveret", + "syncedSuccess": "Synkroniseret med succes", + "failedDisable": "Skyen kunne ikke deaktiveres", + "failedEnable": "Skyen kunne ikke aktiveres", + "cloudRequestTimeout": "Timeout for skyanmodning", + "cloudRequestFailed": "Cloud-anmodning mislykkedes", + "cloudWorkerUnreachable": "Kunne ikke nå cloud worker. Sørg for, at skytjenesten kører (npm kør dev i /cloud).", + "connectionFailed": "Forbindelsen mislykkedes", + "syncFailed": "Kunne ikke synkronisere skydata", + "providerModelsTitle": "{provider} — Modeller", + "noModelsForProvider": "Ingen tilgængelige modeller for denne udbyder.", + "chat": "Chat", + "embedding": "Indlejring", + "image": "Billede", + "custom": "skik", + "modelsCount": "{count, plural, one {# model} other {# models}}" + }, + "health": { + "title": "Systemsundhed", + "description": "Realtidsovervågning af din OmniRoute-instans", + "healthy": "Sundt", + "degraded": "Nedbrudt", + "down": "Ned", + "uptime": "Oppetid", + "memory": "Hukommelse", + "memoryRss": "Hukommelse (RSS)", + "heap": "Dynge", + "cpu": "CPU", + "database": "Database", + "version": "version", + "lastCheck": "Sidste kontrol", + "providerHealth": "Udbyder sundhed", + "systemMetrics": "System Metrics", + "tokenHealth": "Token Health", + "refreshAll": "Opdater alle", + "checkNow": "Tjek nu", + "loadingHealth": "Indlæser sundhedsdata...", + "failedToLoad": "Kunne ikke indlæse sundhedsdata: {error}", + "retry": "Prøv igen", + "allOperational": "Alle systemer i drift", + "issuesDetected": "Systemproblemer opdaget", + "updatedAt": "Opdateret {time}", + "latency": "Latency", + "latencyP50": "p50", + "latencyP95": "s95", + "latencyP99": "s99", + "millisecondsShort": "{value}ms", + "notAvailable": "—", + "totalRequests": "Samlet antal anmodninger", + "noDataYet": "Ingen data endnu", + "promptCache": "Spørg cache", + "entries": "Indgange", + "hitRate": "Hitrate", + "hitsMisses": "Hits / Misses", + "signatureCache": "Signatur cache", + "signatureDefaults": "Standarder", + "signatureTool": "Værktøj", + "signatureFamily": "Familie", + "signatureSession": "Session", + "recovering": "Gendannelse", + "noCBData": "Ingen strømafbryderdata tilgængelige. Kom med nogle anmodninger først.", + "providerHealthStatusAria": "Udbyder sundhedsstatus", + "issuesLabel": "Problemer opdaget", + "operational": "Operationel", + "providers": "Udbydere", + "healthyCount": "{count} sund", + "nodeVersion": "Node {version}", + "failures": "{count} fejl", + "failuresPlural": "{count} fejl", + "lastFailure": "Sidst", + "rateLimitStatus": "Prisgrænsestatus", + "activeLimiters": "{count} aktiv begrænser", + "activeLimitersPlural": "{count} aktive begrænsere", + "queued": "I kø", + "queuedCount": "{count} i kø", + "running": "løb", + "runningCount": "{count} kører", + "ok": "OK", + "activeLockouts": "Aktive lockouts", + "resetConfirm": "Nulstille alle afbrydere til sund tilstand? Dette vil rydde alle fejloptællinger og gendanne alle udbydere til driftsstatus.", + "resetAllTitle": "Nulstil alle afbrydere til sund tilstand", + "resetting": "Nulstiller...", + "resetAll": "Nulstil alle", + "until": "Indtil {time}" + }, + "limits": { + "title": "Grænser og kvoter", + "rateLimit": "Satsgrænse", + "remaining": "Tilbage", + "requestsPerMinute": "Forespørgsler/min", + "tokensPerMinute": "Poletter/min", + "dailyLimit": "Daglig grænse" + }, + "logs": { + "title": "Logs", + "requestLogs": "Anmod om logs", + "proxyLogs": "Proxy logs", + "auditLog": "Revisionslog", + "console": "Konsol", + "auditLogDesc": "Administrative handlinger og sikkerhedshændelser", + "loading": "Indlæser...", + "refresh": "Opdater", + "filterByAction": "Filtrer efter handling...", + "filterByActor": "Filtrer efter skuespiller...", + "filterEntriesAria": "Filtrer revisionslogposter", + "filterByActionTypeAria": "Filtrer efter handlingstype", + "filterByActorAria": "Filtrer efter skuespiller", + "refreshAuditLogAria": "Opdater revisionslog", + "tableAria": "Revisionslogposter", + "failedFetchAuditLog": "Kunne ikke hente revisionslog", + "showing": "Viser {count} poster (offset {offset})", + "search": "Søg", + "timestamp": "Tidsstempel", + "action": "Handling", + "actor": "Skuespiller", + "target": "Mål", + "details": "Detaljer", + "ipAddress": "IP-adresse", + "notAvailable": "—", + "noEntries": "Ingen revisionslogposter fundet", + "previous": "Forrige", + "next": "Næste" + }, + "onboarding": { + "welcome": "Velkommen", + "security": "Sikkerhed", + "test": "Test", + "ready": "Klar!", + "setPassword": "Indstil adgangskode", + "addProvider": "Tilføj din første udbyder", + "getStarted": "Kom i gang", + "skip": "Spring over", + "skipWizard": "Spring guiden helt over", + "skipPassword": "Spring adgangskodeopsætning over", + "skipAndContinue": "Spring over og fortsæt", + "passwordLabel": "Adgangskode", + "confirmPassword": "Bekræft adgangskode", + "enterPassword": "Indtast adgangskode", + "confirmPasswordPlaceholder": "Bekræft adgangskode", + "passwordsMismatch": "Adgangskoder stemmer ikke overens", + "setupComplete": "Opsætning fuldført!", + "goToDashboard": "Gå til Dashboard →", + "welcomeDesc": "OmniRoute er din lokale AI API-proxy. Det dirigerer anmodninger til flere AI-udbydere med belastningsbalancering, failover og brugssporing.", + "multiProvider": "Multi-udbyder", + "usageTracking": "Brugssporing", + "apiKeyMgmt": "API Key Mgmt", + "securityDesc": "Indstil en adgangskode for at beskytte dit dashboard, eller spring over indtil videre.", + "providerDesc": "Tilslut din første AI-udbyder. Du kan tilføje flere senere.", + "apiKeyRequired": "API-nøgle (påkrævet)", + "customUrlOptional": "Tilpasset webadresse (valgfrit)", + "testDesc": "Lad os kontrollere, at din udbyderforbindelse fungerer.", + "runTest": "Kør forbindelsestest", + "testingConnection": "Tester forbindelse...", + "connectionSuccessful": "Forbindelsen lykkedes! Din udbyder er klar.", + "noProviderFound": "Ingen udbyder fundet. Du kan tilføje en fra dashboardet senere.", + "testFailed": "Test mislykkedes, men du kan konfigurere dette senere.", + "couldNotTest": "Kunne ikke teste lige nu. Du kan teste fra dashboardet.", + "doneDesc": "Du er klar! Din OmniRoute-instans er konfigureret og klar til proxy AI-anmodninger.", + "yourEndpoint": "Dit slutpunkt:", + "continue": "Fortsæt", + "retry": "Prøv igen", + "failedSetPassword": "Kunne ikke indstille adgangskoden. Prøv igen.", + "failedAddProvider": "Kunne ikke tilføje udbyder. Prøv igen.", + "connectionError": "Forbindelsesfejl. Prøv venligst igen.", + "provider": "Udbyder" + }, + "providers": { + "title": "Udbydere", + "addProvider": "Tilføj udbyder", + "editProvider": "Rediger udbyder", + "deleteProvider": "Slet udbyder", + "noProviders": "Ingen udbydere er konfigureret", + "modelAvailability": "Modeltilgængelighed", + "accounts": "Regnskaber", + "newAccount": "Ny konto", + "deleteConfirm": "Er du sikker på, at du vil slette denne udbyder?", + "testing": "Tester...", + "testConnection": "Test forbindelse", + "testSuccess": "Forbindelsen lykkedes", + "testFailed": "Forbindelsen mislykkedes", + "available": "Tilgængelig", + "cooldown": "Nedkøling", + "unavailable": "Ikke tilgængelig", + "unknown": "Ukendt", + "oauthLabel": "OAuth", + "compatibleLabel": "Kompatibel", + "chat": "Chat", + "responses": "Svar", + "messages": "Beskeder", + "oauthProviders": "OAuth-udbydere", + "freeProviders": "Gratis udbydere", + "apiKeyProviders": "API-nøgleudbydere", + "compatibleProviders": "API Key-kompatible udbydere", + "testAll": "Test alle", + "testAllOAuth": "Test alle OAuth-forbindelser", + "testAllFree": "Test alle gratis forbindelser", + "testAllApiKey": "Test alle API-nøgleforbindelser", + "testAllCompatible": "Test alle kompatible forbindelser", + "connected": "{count} Forbundet", + "errorCount": "{count} Fejl ({code})", + "errorCountNoCode": "{count} Fejl", + "noConnections": "Ingen forbindelser", + "disabled": "Deaktiveret", + "enableProvider": "Aktiver udbyder", + "disableProvider": "Deaktiver udbyder", + "testResults": "Testresultater", + "noCompatibleYet": "Ingen kompatible udbydere tilføjet endnu", + "compatibleHint": "Brug knapperne ovenfor til at tilføje OpenAI- eller Anthropic-kompatible slutpunkter", + "addOpenAICompatible": "Tilføj OpenAI-kompatibel", + "addAnthropicCompatible": "Tilføj Antropisk kompatibel", + "addNewProvider": "Tilføj ny udbyder", + "backToProviders": "Tilbage til Udbydere", + "configureNewProvider": "Konfigurer en ny AI-udbyder til brug med dine applikationer.", + "providerLabel": "Udbyder", + "selectProvider": "Vælg en udbyder", + "selectedProvider": "Udvalgt udbyder", + "authMethod": "Autentificeringsmetode", + "apiKeyLabel": "API nøgle", + "apiKeyRequired": "API-nøgle er påkrævet", + "selectProviderRequired": "Vælg venligst en udbyder", + "enterApiKey": "Indtast din API-nøgle", + "apiKeySecure": "Din API-nøgle vil blive krypteret og opbevaret sikkert.", + "oauth2Connect": "Opret forbindelse til OAuth2", + "oauth2Label": "OAuth2", + "oauth2Desc": "Tilslut din konto ved hjælp af OAuth2-godkendelse.", + "displayName": "Vist navn", + "displayNamePlaceholder": "f.eks. Production API, Dev Environment", + "displayNameHint": "Valgfrit. Et venligt navn til at identificere denne konfiguration.", + "active": "Aktiv", + "activeDescription": "Aktiver denne udbyder til brug i dine applikationer", + "cancel": "Annuller", + "createProvider": "Opret udbyder", + "failedCreate": "Kunne ikke oprette udbyder", + "errorOccurred": "Der opstod en fejl. Prøv venligst igen.", + "modelStatus": "Modelstatus", + "allModelsOperational": "Alle modeller i drift", + "modelsWithIssues": "{count} model(er) med problemer", + "allModelsNormal": "Alle modeller reagerer normalt.", + "cooldownCleared": "Nedkøling ryddet for {model}", + "failedClearCooldown": "Kunne ikke rydde nedkøling", + "loadingAvailability": "Indlæser modeltilgængelighed...", + "clearCooldown": "Ryd", + "clearing": "Rydder...", + "until": "Indtil {time}", + "providerTestFailed": "Providertest mislykkedes", + "modeTest": "{mode} Test", + "passedCount": "{count} bestået", + "failedCount": "{count} mislykkedes", + "testedCount": "{count} testet", + "millisecondsAbbr": "{value}ms", + "okShort": "OK", + "errorShort": "FEJL", + "noActiveConnectionsInGroup": "Der blev ikke fundet nogen aktive forbindelser til denne gruppe.", + "allTestsPassed": "Alle {total} tests bestået", + "testSummary": "{passed}/{total} bestået, {failed} mislykkedes", + "nameLabel": "Navn", + "prefixLabel": "Præfiks", + "baseUrlLabel": "Basis URL", + "apiTypeLabel": "API type", + "prefixHint": "Påkrævet. Unikt præfiks for modelnavne.", + "nameHint": "Påkrævet. En venlig etiket til denne node.", + "baseUrlHint": "Påkrævet. Udbyder API base URL.", + "anthropicPrefixPlaceholder": "ac-prod", + "openaiPrefixPlaceholder": "oc-prod", + "anthropicBaseUrlPlaceholder": "https://api.anthropic.com/v1", + "openaiBaseUrlPlaceholder": "https://api.openai.com/v1", + "validateConnection": "Bekræft forbindelsen", + "validating": "Validerer...", + "connectionValid": "Forbindelsen er gyldig!", + "connectionFailed": "Forbindelsen mislykkedes. Tjek URL og nøgle.", + "testKeyLabel": "Test API-nøgle", + "testKeyPlaceholder": "sk-... (kun til validering)", + "providerNotFound": "Udbyder blev ikke fundet", + "deleteConnectionConfirm": "Vil du slette denne forbindelse?", + "failedSetAlias": "Aliaset kunne ikke indstilles", + "failedSaveConnection": "Forbindelsen kunne ikke gemmes", + "failedSaveConnectionRetry": "Forbindelsen kunne ikke gemmes. Prøv venligst igen.", + "failedRetestConnection": "Forbindelsen kunne ikke gentestes", + "deleteCompatibleNodeConfirm": "Vil du slette denne {type}-kompatible node?", + "anthropicCompatibleDetails": "Antropiske kompatible detaljer", + "openaiCompatibleDetails": "OpenAI-kompatible detaljer", + "messagesApi": "Beskeder API", + "responsesApi": "Responses API", + "chatCompletions": "Chatafslutninger", + "importingModels": "Importerer...", + "importFromModels": "Importer fra /models", + "addConnectionToImport": "Tilføj en forbindelse for at aktivere import.", + "noModelsConfigured": "Ingen modeller konfigureret", + "connectionCount": "{count} forbindelse(r)", + "fetchingModels": "Henter tilgængelige modeller...", + "failedFetchModels": "Kunne ikke hente modeller", + "noModelsFound": "Ingen modeller fundet", + "importFailed": "Import mislykkedes", + "noNewModelsAdded": "Der blev ikke tilføjet nye modeller.", + "adding": "Tilføjer...", + "importingModelsTitle": "Import af modeller", + "copyModel": "Kopi model", + "removeModel": "Fjern modellen", + "rateLimitProtected": "Beskyttet", + "rateLimitUnprotected": "Ubeskyttet", + "enableRateLimitProtection": "Klik for at aktivere hastighedsgrænsebeskyttelse", + "disableRateLimitProtection": "Klik for at deaktivere satsgrænsebeskyttelse", + "productionKey": "Produktionsnøgle", + "enterNewApiKey": "Indtast ny API-nøgle", + "optional": "Valgfrit", + "anthropicCompatibleName": "Antropisk kompatibel", + "openaiCompatibleName": "OpenAI-kompatibel", + "failedImportModels": "Kunne ikke importere modeller", + "noModelsReturnedFromEndpoint": "Ingen modeller returneret fra /models slutpunkt.", + "importingModelsProgress": "Importerer {current} af {total} modeller...", + "foundModelsStartingImport": "Fundet {count} modeller. Starter import...", + "importingModelById": "Importerer {modelId}...", + "importSuccessCount": "{count, plural, one {# model} other {# models}} blev importeret med succes!", + "noNewModelsAddedExisting": "Ingen nye modeller blev tilføjet (alle findes allerede).", + "importDoneCount": "✓ Færdig! {count, plural, one {# model imported.} other {# models imported.}}", + "unexpectedErrorOccurred": "Der opstod en uventet fejl", + "connectionCountLabel": "{count, plural, one {# connection} other {# connections}}", + "messagesPath": "beskeder", + "responsesPath": "svar", + "chatCompletionsPath": "chat/afslutninger", + "add": "Tilføj", + "edit": "Rediger", + "delete": "Slet", + "anthropic": "Antropisk", + "openai": "OpenAI", + "singleConnectionPerCompatible": "Kun én forbindelse er tilladt pr. kompatibel node. Tilføj en anden node, hvis du har brug for flere forbindelser.", + "connections": "Forbindelser", + "providerProxyTitleConfigured": "Udbyder proxy: {host}", + "configured": "konfigureret", + "providerProxyConfigureHint": "Konfigurer proxy for alle forbindelser fra denne udbyder", + "providerProxy": "Udbyder proxy", + "noConnectionsYet": "Ingen forbindelser endnu", + "addFirstConnectionHint": "Tilføj din første forbindelse for at komme i gang", + "addConnection": "Tilføj forbindelse", + "availableModels": "Tilgængelige modeller", + "pageAutoRefresh": "Siden opdateres automatisk...", + "statusDisabled": "deaktiveret", + "statusConnected": "tilsluttet", + "statusRuntimeIssue": "runtime problem", + "statusAuthFailed": "godkendelse mislykkedes", + "statusRateLimited": "sats begrænset", + "statusNetworkIssue": "netværksproblem", + "statusTestUnsupported": "test ikke understøttet", + "statusUnavailable": "ikke tilgængelig", + "statusFailed": "mislykkedes", + "statusError": "fejl", + "oauthAccount": "OAuth-konto", + "errorTypeRuntime": "Lokal køretid", + "errorTypeUpstreamAuth": "Opstrøms auth", + "errorTypeMissingCredential": "Manglende legitimationsoplysninger", + "errorTypeRefreshFailed": "Opdatering mislykkedes", + "errorTypeTokenExpired": "Token er udløbet", + "errorTypeRateLimited": "Sats begrænset", + "errorTypeUpstreamUnavailable": "Upstream ikke tilgængelig", + "errorTypeNetworkError": "Netværksfejl", + "errorTypeTestUnsupported": "Test understøttes ikke", + "errorTypeUpstreamError": "Opstrøms fejl", + "proxySourceGlobal": "Globalt", + "proxySourceProvider": "Udbyder", + "proxySourceKey": "Nøgle", + "proxyConfiguredBySource": "Proxy ({source}): {host}", + "autoPriority": "Auto: {priority}", + "proxy": "Fuldmagt", + "retestAuthentication": "Gentest godkendelse", + "retest": "Gentest", + "disableConnection": "Deaktiver forbindelse", + "enableConnection": "Aktiver forbindelse", + "reauthenticateConnection": "Genautentificer denne forbindelse", + "proxyConfig": "Proxy konfiguration", + "aliasExistsAlert": "Aliaset \"{alias}\" findes allerede. Brug venligst en anden model, eller rediger eksisterende alias.", + "openRouterAnyModelHint": "OpenRouter understøtter enhver model. Tilføj modeller og opret aliaser for hurtig adgang.", + "modelIdFromOpenRouter": "Model ID (fra OpenRouter)", + "openRouterModelPlaceholder": "antropisk/claude-3-opus", + "customModels": "Brugerdefinerede modeller", + "customModelsHint": "Tilføj model-id'er, der ikke er på standardlisten. Disse vil være tilgængelige for routing.", + "modelId": "Model ID", + "customModelPlaceholder": "f.eks. gpt-4.5-turbo", + "loading": "Indlæser...", + "removeCustomModel": "Fjern brugerdefineret model", + "noCustomModels": "Ingen brugerdefinerede modeller tilføjet endnu.", + "allSuggestedAliasesExist": "Alle foreslåede aliasser findes allerede. Vælg venligst en anden model, eller fjern modstridende aliasser.", + "failedSaveCustomModel": "Kunne ikke gemme den tilpassede model", + "modelAddedSuccess": "Model {modelId} blev tilføjet", + "failedAddModelTryAgain": "Kunne ikke tilføje model. Prøv venligst igen.", + "failedSaveImportedModel": "Kunne ikke gemme importeret model til brugerdefineret database", + "failedImportModelsTryAgain": "Kunne ikke importere modeller. Prøv venligst igen.", + "failedRemoveModelFromDatabase": "Kunne ikke fjerne modellen fra databasen", + "modelRemovedSuccess": "Modellen blev fjernet", + "failedDeleteModelTryAgain": "Modellen kunne ikke slettes. Prøv venligst igen.", + "compatibleModelsDescription": "Tilføj {type}-kompatible modeller manuelt eller importer dem fra /models-slutpunktet.", + "anthropicCompatibleModelPlaceholder": "claude-3-opus-20240229", + "openaiCompatibleModelPlaceholder": "gpt-4o", + "apiKeyValidationFailed": "API-nøglevalidering mislykkedes. Tjek venligst din nøgle og prøv igen.", + "addProviderApiKeyTitle": "Tilføj {provider} API-nøgle", + "checking": "Tjekker...", + "check": "Tjek", + "valid": "Gyldig", + "invalid": "Ugyldig", + "creating": "Opretter...", + "validationChecksAnthropicCompatible": "Validering kontrollerer {provider} ved at bekræfte API-nøglen.", + "validationChecksOpenAiCompatible": "Valideringstjek {provider} via /models på din basis-URL.", + "priorityLabel": "Prioritet", + "saving": "Gemmer...", + "save": "Gem", + "editConnection": "Rediger forbindelse", + "accountName": "Kontonavn", + "email": "E-mail", + "healthCheckMinutes": "Sundhedstjek (min)", + "healthCheckHint": "Proaktivt token-opdateringsinterval. 0 = deaktiveret.", + "failedTestConnection": "Forbindelsen kunne ikke testes", + "failed": "Mislykkedes", + "leaveBlankKeepCurrentApiKey": "Lad stå tomt for at beholde den aktuelle API-nøgle.", + "editCompatibleTitle": "Rediger {type} Kompatibel", + "compatibleBaseUrlHint": "Brug basis-URL'en (der slutter på /v1) til din {type}-kompatible API.", + "apiKeyForCheck": "API-nøgle (til check)", + "compatibleProdPlaceholder": "{type} Kompatibel (Prod)" + }, + "settings": { + "title": "Indstillinger", + "general": "Generelt", + "security": "Sikkerhed", + "appearance": "Udseende", + "routing": "Routing", + "cache": "Cache", + "resilience": "Modstandsdygtighed", + "systemPrompt": "Systemprompt", + "thinkingBudget": "Tænke budget", + "proxy": "Fuldmagt", + "pricing": "Prissætning", + "storage": "Opbevaring", + "policies": "Politikker", + "ipFilter": "IP-filter", + "comboDefaults": "Combo standarder", + "fallbackChains": "Fallback kæder", + "changePassword": "Skift adgangskode", + "enablePassword": "Aktiver adgangskode", + "darkMode": "Mørk tilstand", + "lightMode": "Lys tilstand", + "systemTheme": "System tema", + "enableCache": "Aktiver cache", + "cacheTTL": "Cache TTL", + "maxCacheSize": "Max cachestørrelse", + "clearCache": "Ryd cache", + "cacheHits": "Cache hits", + "cacheMisses": "Cache misses", + "hitRate": "Hitrate", + "cacheEntries": "Cache-indtastninger", + "circuitBreaker": "Strømafbryder", + "retryPolicy": "Politik for forsøg igen", + "maxRetries": "Max forsøger igen", + "retryDelay": "Forsink igen", + "timeoutMs": "Timeout (ms)", + "enableSystemPrompt": "Aktiver systemprompt", + "systemPromptText": "Systemprompttekst", + "enableThinking": "Aktiver tænkning", + "maxThinkingTokens": "Max Thinking Tokens", + "enableProxy": "Aktiver proxy", + "proxyUrl": "Proxy-URL", + "pricingRates": "Prisformat", + "currentPricing": "Aktuel prisoversigt", + "loadingPricing": "Indlæser prisdata...", + "noPricing": "Ingen tilgængelige prisdata", + "input": "Input", + "output": "Output", + "cached": "Cachelagret", + "reasoning": "Ræsonnement", + "cacheCreation": "Oprettelse af cache", + "customPricing": "Tilpasset prisfastsættelse", + "databaseSize": "Database størrelse", + "backupDb": "Backup database", + "restoreDb": "Gendan database", + "exportData": "Eksporter data", + "importData": "Importer data", + "clearData": "Ryd alle data", + "clearDataConfirm": "Dette vil permanent slette alle data. Er du sikker?", + "enableRequestLogs": "Aktiver anmodningslogfiler", + "logRetention": "Logopbevaring", + "ipWhitelist": "IP hvidliste", + "ipBlacklist": "IP sortliste", + "addIP": "Tilføj IP", + "savedSuccessfully": "Indstillinger blev gemt", + "ai": "AI", + "advanced": "Avanceret", + "localMode": "Lokal tilstand — Alle data gemt på din maskine", + "settingsSectionsAria": "Indstillinger sektioner", + "switchThemes": "Skift mellem lyse og mørke temaer", + "themeSelectionAria": "Valg af tema", + "themeLight": "Lys", + "themeDark": "Mørk", + "themeSystem": "System", + "hideHealthLogs": "Skjul logs til sundhedstjek", + "hideHealthLogsDesc": "Når ON, skal du undertrykke [HealthCheck]-meddelelser i serverkonsollen", + "promptCache": "Spørg cache", + "flushCache": "Skyl cache", + "flushing": "Skyller...", + "size": "Størrelse", + "hits": "Hits", + "evictions": "Udsættelser", + "loadingCacheStats": "Indlæser cachestatistik...", + "globalProxy": "Global proxy", + "globalProxyDesc": "Konfigurer en global udgående proxy for alle API-kald. Individuelle udbydere, kombinationer og nøgler kan tilsidesætte dette.", + "noGlobalProxy": "Ingen global proxy konfigureret", + "globalLabel": "Globalt", + "configure": "Konfigurer", + "globalSystemPrompt": "Global System Prompt", + "systemPromptDesc": "Injiceret i alle anmodninger på proxy-niveau", + "saved": "Gemt", + "systemPromptPlaceholder": "Indtast systemprompt for at injicere i alle anmodninger...", + "systemPromptHint": "Denne prompt er sat foran systemmeddelelsen for hver anmodning. Bruges til globale instruktioner, sikkerhedsretningslinjer eller regler for svarformatering.", + "chars": "{count} tegn", + "thinkingBudgetTitle": "Tænke budget", + "thinkingBudgetDesc": "Kontroller brugen af AI-ræsonnementstoken på tværs af alle anmodninger", + "passthrough": "Gennemløb", + "passthroughDesc": "Ingen ændringer - klienten styrer tænkebudgettet", + "auto": "Auto", + "autoDesc": "Fjern al tænkekonfig - lad udbyderen bestemme", + "custom": "Brugerdefineret", + "customDesc": "Indstil et fast token-budget for alle anmodninger", + "adaptive": "Adaptiv", + "adaptiveDesc": "Skaler budget baseret på anmodningens kompleksitet", + "effortNone": "Ingen (0 tokens)", + "effortLow": "Lav (1K tokens)", + "effortMedium": "Medium (10.000 tokens)", + "effortHigh": "Høj (128K tokens)", + "tokenBudget": "Token budget", + "tokens": "tokens", + "baseEffortLevel": "Basisindsatsniveau", + "adaptiveHint": "Adaptiv tilstand skaleres fra dette basisniveau baseret på antal meddelelser, værktøjsbrug og promptlængde.", + "requireLogin": "Kræv login", + "requireLoginDesc": "Når ON, kræver dashboard adgangskode. Når OFF, adgang uden login.", + "currentPassword": "Nuværende adgangskode", + "enterCurrentPassword": "Indtast den aktuelle adgangskode", + "newPassword": "Ny adgangskode", + "enterNewPassword": "Indtast ny adgangskode", + "confirmPassword": "Bekræft ny adgangskode", + "confirmPasswordPlaceholder": "Bekræft ny adgangskode", + "passwordsNoMatch": "Adgangskoder stemmer ikke overens", + "passwordUpdated": "Adgangskoden blev opdateret", + "failedUpdatePassword": "Kunne ikke opdatere adgangskoden", + "errorOccurred": "Der opstod en fejl", + "updatePassword": "Opdater adgangskode", + "setPassword": "Indstil adgangskode", + "apiEndpointProtection": "API-endepunktsbeskyttelse", + "requireAuthModels": "Kræv API-nøgle til /models", + "requireAuthModelsDesc": "Når ON, returnerer /v1/models-slutpunktet 404 for ikke-godkendte anmodninger. Forhindrer modelopdagelse af uautoriserede brugere.", + "blockedProviders": "Blokerede udbydere", + "blockedProvidersDesc": "Skjul specifikke udbydere fra /v1/models-svaret. Blokerede udbydere vises ikke i modellister.", + "providersBlocked": "{count} udbyder(e) blokeret fra /modeller", + "blockProviderTitle": "Bloker {provider}", + "unblockProviderTitle": "Fjern blokering af {provider}", + "routingStrategy": "Rutestrategi", + "fillFirst": "Fyld først", + "fillFirstDesc": "Brug konti i prioriteret rækkefølge", + "roundRobin": "Round Robin", + "roundRobinDesc": "Gennemgå alle konti", + "p2c": "P2C", + "p2cDesc": "Vælg 2 tilfældige, brug den sundere", + "random": "Tilfældig", + "randomDesc": "Tilfældig konto hver anmodning", + "leastUsed": "Mindst brugt", + "leastUsedDesc": "Vælg den mindst brugte konto", + "costOpt": "Omkostningsopt", + "costOptDesc": "Foretrækker den billigste tilgængelige konto", + "stickyLimit": "Sticky Limit", + "stickyLimitDesc": "Opkald pr. konto før skift", + "modelAliases": "Model aliaser", + "modelAliasesDesc": "Wildcard-mønstre til omlægning af modelnavne • Brug * og ?", + "aliasPatternPlaceholder": "claude-sonnet-*", + "aliasTargetPlaceholder": "claude-sonnet-4-20250514", + "pattern": "Mønster", + "targetModel": "Målmodel", + "add": "+ Tilføj", + "session": "Session", + "sessionDetailsAria": "Session detaljer", + "status": "Status", + "authenticated": "Autentificeret", + "guest": "Gæst", + "loginTime": "Login tid", + "sessionAge": "Session Alder", + "browser": "Browser", + "clearLocalData": "Ryd lokale data", + "logout": "Log ud", + "clearLocalDataConfirm": "Vil du rydde alle lokale data? Dette vil nulstille dine præferencer.", + "unknown": "Ukendt", + "systemActor": "system", + "ipAccessControl": "IP adgangskontrol", + "ipAccessControlDesc": "Bloker eller tillad specifikke IP-adresser", + "ipModeDisabled": "Deaktiveret", + "ipModeBlacklist": "Sortliste", + "ipModeWhitelist": "Hvidliste", + "ipModeWhitelistPriority": "WL prioritet", + "addIpAddress": "Tilføj IP-adresse", + "ipAddressPlaceholder": "192.168.1.0/24 eller 10.0.*.*", + "block": "+ Bloker", + "allow": "+ Tillad", + "blocked": "Blokeret ({count})", + "allowed": "Tilladt ({count})", + "temporaryBans": "Midlertidige forbud ({count})", + "minLeft": "{min}m tilbage", + "auditLog": "Revisionslog", + "searchAuditLogs": "Søg i revisionslogfiler...", + "failedLoadAuditLog": "Kunne ikke indlæse revisionslog", + "noAuditEvents": "Ingen revisionsbegivenheder fundet", + "action": "Handling", + "actor": "Skuespiller", + "details": "Detaljer", + "time": "Tid", + "fallbackChainsTitle": "Fallback kæder", + "fallbackChainsDesc": "Definer udbyderens reserveordre pr. model", + "addChain": "+ Tilføj kæde", + "modelName": "Model navn", + "modelNamePlaceholder": "claude-sonnet-4-20250514", + "providersCommaSeparated": "Udbydere (kommasepareret, i prioriteret rækkefølge)", + "providersCommaSeparatedPlaceholder": "antropisk, openai, gemini", + "createChain": "Opret kæde", + "noFallbackChains": "Ingen Fallback-kæder", + "noFallbackChainsDesc": "Opret en kæde for at definere udbyderens reserveordre for en model.", + "loadingFallbackChains": "Indlæser reservekæder...", + "deleteChainConfirm": "Vil du slette reservekæden for \"{model}\"?", + "chainCreated": "Kæde oprettet til {model}", + "chainDeleted": "Kæde slettet for {model}", + "failedCreateChain": "Kunne ikke oprette kæde", + "failedDeleteChain": "Kæden kunne ikke slettes", + "deleteChain": "Slet kæde", + "fillModelAndProviders": "Udfyld venligst modelnavn og udbydere", + "addAtLeastOneProvider": "Tilføj mindst én udbyder", + "comboDefaultsTitle": "Combo standarder", + "globalComboConfig": "Global combo-konfiguration", + "defaultStrategy": "Standardstrategi", + "defaultStrategyDesc": "Anvendt på nye kombinationer uden eksplicit strategi", + "comboStrategyAria": "Kombinationsstrategi", + "priority": "Prioritet", + "weighted": "Vægtet", + "maxRetriesLabel": "Max forsøger igen", + "retryDelayLabel": "Forsinkelse af forsøg igen (ms)", + "timeoutLabel": "Timeout (ms)", + "healthCheck": "Sundhedstjek", + "healthCheckDesc": "Forhåndstjek udbyderens tilgængelighed", + "trackMetrics": "Spor metrics", + "trackMetricsDesc": "Optag pr-kombinationsanmodningsmetrics", + "providerOverrides": "Udbydertilsidesættelser", + "providerOverridesDesc": "Tilsidesæt timeout og genforsøg pr. udbyder. Udbyderindstillinger tilsidesætter globale standardindstillinger.", + "providerMaxRetriesAria": "{provider} maks. genforsøg", + "providerTimeoutAria": "{provider} timeout ms", + "removeProviderOverrideAria": "Fjern {provider} tilsidesættelse", + "newProviderNamePlaceholder": "f.eks. google, åben...", + "newProviderNameAria": "Nyt udbydernavn", + "retries": "forsøger igen", + "ms": "ms", + "saveComboDefaults": "Gem Combo-standarder", + "maxNestingDepth": "Maks. rededybde", + "concurrencyPerModel": "Samtidighed / Model", + "queueTimeout": "Timeout for kø (ms)", + "providerProfiles": "Udbyder profiler", + "providerProfilesDesc": "Separate indstillinger for modstandsdygtighed for OAuth (session-baserede) og API Key (målte) udbydere. OAuth-udbydere har strengere tærskler på grund af lavere takstgrænser.", + "oauthProviders": "OAuth-udbydere", + "apiKeyProviders": "API-nøgleudbydere", + "transientCooldown": "Forbigående nedkøling", + "rateLimitCooldown": "Rate Limit Cooldown", + "maxBackoffLevel": "Max Backoff Level", + "cbThreshold": "CB-tærskel", + "cbResetTime": "CB-nulstillingstid", + "rateLimiting": "Satsbegrænsende", + "rateLimitingDesc": "API-nøgleudbydere er automatisk hastighedsbegrænsede med sikre standardindstillinger. Grænser læres fra svaroverskrifter og tilpasses over tid.", + "defaultSafetyNet": "Standard sikkerhedsnet", + "rpm": "RPM", + "minGap": "Min Gap", + "maxConcurrent": "Max samtidig", + "activeLimiters": "Aktive begrænsere", + "noActiveLimiters": "Ingen aktive hastighedsbegrænsere endnu.", + "reservoir": "Reservoir", + "running": "Løb", + "queued": "I kø", + "circuitBreakers": "Strømafbrydere", + "breakerStateClosed": "Lukket", + "breakerStateOpen": "Åbn", + "breakerStateHalfOpen": "Halvåbent", + "tripped": "{count} udløste", + "healthy": "{count} sund", + "resetAll": "Nulstil alle", + "noCircuitBreakers": "Ingen afbrydere aktive endnu. De oprettes automatisk, når anmodninger strømmer gennem den kombinerede pipeline.", + "failures": "{count} fejl(er)", + "policiesLocked": "Politikker og låste identifikatorer", + "allOperational": "Alle systemer fungerer - ingen lockouts eller udløste afbrydere", + "loadingPolicies": "Indlæser politikker...", + "lockedIdentifiers": "Låste identifikatorer", + "unlockedIdentifier": "Ulåst: {identifier}", + "sinceDate": "siden {date}", + "forceUnlock": "Tving oplåsning", + "unlocking": "Låser op...", + "failedUnlock": "Kunne ikke låse op", + "failedLoadWithStatus": "Kunne ikke indlæse: {status}", + "failedLoadResilience": "Kunne ikke indlæse modstandsdygtighedsstatus", + "saveFailed": "Gem mislykkedes", + "resetFailed": "Nulstilling mislykkedes", + "loadingResilience": "Indlæser modstandsdygtighedsstatus...", + "retry": "Prøv igen", + "systemStorage": "System & Opbevaring", + "allDataLocal": "Alle data gemt lokalt på din maskine", + "databasePath": "Databasesti", + "exportDatabase": "Eksporter database", + "exportAll": "Eksporter alle (.tar.gz)", + "importDatabase": "Importer database", + "confirmDbImport": "Bekræft databaseimport", + "confirmDbImportDesc": "Dette vil erstatte alle aktuelle data med indholdet fra {file}. Der oprettes automatisk en sikkerhedskopi før importen.", + "yesImport": "Ja, import", + "lastBackup": "Sidste backup", + "noBackupYet": "Ingen backup endnu", + "backupNow": "Sikkerhedskopier nu", + "backupRestore": "Sikkerhedskopiering og gendannelse", + "viewBackups": "Se sikkerhedskopier", + "hide": "Skjul", + "backupRetentionDesc": "Database-snapshots oprettes automatisk før gendannelse og hvert 15. minut, når data ændres. Retention: 24 timer i timen + 30 daglige backups med smart rotation.", + "loadingBackups": "Indlæser sikkerhedskopier...", + "noBackupsYet": "Ingen tilgængelige sikkerhedskopier endnu. Sikkerhedskopier oprettes automatisk, når data ændres.", + "backupsAvailable": "{count} backup(r) tilgængelige", + "refresh": "Opdater", + "confirm": "bekræfte?", + "yes": "Ja", + "no": "Nej", + "restore": "Gendan", + "invalidFileType": "Ugyldig filtype. Kun .sqlite-filer accepteres.", + "exportFailed": "Eksporten mislykkedes", + "exportFailedWithError": "Eksport mislykkedes: {error}", + "fullExportFailedWithError": "Fuld eksport mislykkedes: {error}", + "backupCreated": "Sikkerhedskopiering oprettet: {file}", + "restoreSuccess": "Gendannet! {connections} forbindelser, {nodes} noder, {combos} kombinationer, {apiKeys} API nøgler.", + "importSuccess": "Database importeret! {connections} forbindelser, {nodes} noder, {combos} kombinationer, {apiKeys} API nøgler.", + "justNow": "lige nu", + "minutesAgo": "{count}m siden", + "hoursAgo": "{count}t siden", + "daysAgo": "{count}d siden", + "backupReasonManual": "manual", + "backupReasonPreRestore": "for-gendannelse", + "connectionsCount": "{count, plural, one {# connection} other {# connections}}", + "noChangesSinceBackup": "Ingen ændringer siden sidste backup", + "backupFailed": "Sikkerhedskopiering mislykkedes", + "restoreFailed": "Gendannelse mislykkedes", + "importFailed": "Import mislykkedes", + "errorDuringRestore": "Der opstod en fejl under gendannelse", + "errorDuringImport": "Der opstod en fejl under importen", + "modelPricing": "Modelpriser", + "modelPricingDesc": "Konfigurer omkostningssatser pr. model • Alle satser i $/1M tokens", + "providers": "Udbydere", + "registry": "Register", + "priced": "Prissat", + "searchProvidersModels": "Søg efter udbydere eller modeller...", + "showAll": "Vis alle", + "noProvidersMatch": "Ingen udbydere matcher din søgning.", + "howPricingWorks": "Hvordan prissætning fungerer", + "cacheWrite": "Cache skriv", + "unsaved": "ikke gemt", + "resetDefaults": "Nulstil standarder", + "saveProvider": "Gem udbyder", + "saving": "Gemmer...", + "model": "Model", + "models": "modeller", + "moreProviders": "{count} flere udbydere", + "withPricing": "med konfigureret prissætning", + "policiesCircuitBreakers": "Politikker og strømafbrydere", + "activeIssuesDetected": "Aktive problemer registreret", + "off": "Fra", + "resetPricingConfirm": "Vil du nulstille alle priser for {provider} til standardindstillingerne?", + "pricingDescInput": "Input: tokens sendt til modellen", + "pricingDescOutput": "Output: tokens genereret", + "pricingDescCached": "Cachelagret: genbrugt input (~50 % af inputhastigheden)", + "pricingDescReasoning": "Begrundelse: Tænketegn (falder tilbage til output)", + "pricingDescCacheWrite": "Cacheskrivning: oprettelse af cacheposter (falder tilbage til input)", + "pricingDescFormula": "Omkostninger = (input × input_rate) + (output × output_rate) + (cached × cached_rate) pr. million tokens.", + "pricingSettingsTitle": "Prisindstillinger", + "totalModels": "Totale modeller", + "active": "Aktiv", + "costCalculation": "Omkostningsberegning", + "costCalculationDesc": "Omkostninger beregnes baseret på token-forbrug og prissætningssatser, der er konfigureret for hver model.", + "pricingFormat": "Prisformat", + "pricingFormatDesc": "Alle priser er i $/1M tokens (dollars per million tokens).", + "tokenTypes": "Token typer", + "inputTokenDesc": "Standard prompt-tokens", + "outputTokenDesc": "Fuldførelse/svar-tokens", + "cachedTokenDesc": "Cachelagrede inputtokens (typisk 50 % af inputhastigheden)", + "reasoningTokenDesc": "Særlige ræsonnement/tænke-tokens (tilbagefald til outputhastighed)", + "cacheCreationTokenDesc": "Tokens, der bruges til at oprette cacheposter (tilbage til inputhastighed)", + "customPricingNote": "Du kan tilsidesætte standardpriser for specifikke modeller. Tilpassede tilsidesættelser har prioritet frem for automatisk registrerede priser.", + "editPricing": "Rediger prissætning", + "viewFullDetails": "Se alle detaljer" + }, + "translator": { + "title": "Oversætter", + "metaTitle": "Oversætter Legeplads | OmniRoute", + "metaDescription": "Debug, test og visualiser API-formatoversættelser mellem udbydere", + "playgroundTitle": "Oversætter legeplads", + "playground": "Legeplads", + "realtime": "Oversættelsesaktivitet i realtid", + "chatTester": "Chat tester", + "testBench": "Test bænk", + "liveMonitor": "Live Monitor", + "modeDescriptionPlayground": "Indsæt enhver API-anmodningstekst og se, hvordan OmniRoute oversætter den mellem udbyderformater (OpenAI ↔ Claude ↔ Gemini ↔ Responses API)", + "modeDescriptionChatTester": "Send rigtige chatanmodninger gennem OmniRoute og inspicer hele rundrejsen: input, oversat anmodning, udbydersvar og oversat output.", + "modeDescriptionTestBench": "Kør foruddefinerede scenarier og sammenlign kompatibilitet på tværs af udbydere og modeller.", + "modeDescriptionLiveMonitor": "Se oversættelsesbegivenheder i realtid, mens anmodninger flyder gennem OmniRoute.", + "modeDescriptionFallback": "Debug, test og visualiser, hvordan OmniRoute oversætter API-anmodninger mellem udbydere.", + "recentTranslations": "Nylige oversættelser", + "noTranslations": "Ingen oversættelser endnu", + "source": "Kilde", + "target": "Mål", + "time": "Tid", + "model": "Model", + "status": "Status", + "latency": "Latency", + "totalTranslations": "Samlede oversættelser", + "successful": "Vellykket", + "errors": "Fejl", + "avgLatency": "Gns. latens", + "millisecondsShort": "{value}ms", + "notAvailableSymbol": "—", + "liveAutoRefreshing": "Live — Automatisk opdatering", + "paused": "Pause", + "eventsAppearHint": "Oversættelsesbegivenheder vises her, når anmodninger flyder gennem OmniRoute. Brug en af disse metoder til at generere begivenheder:", + "chatTesterTab": "Fanen Chat Tester", + "testBenchTab": "Fanen Testbænk", + "externalApiCalls": "Eksterne API-kald", + "ideCliIntegrations": "IDE/CLI integrationer", + "inMemoryNote": "Bemærk: Hændelser gemmes i hukommelsen og nulstilles, når serveren genstarter.", + "ok": "OK", + "errorShort": "ERR", + "formatConverter": "Formatkonverter", + "formatConverterDescription": "Indsæt eller skriv en JSON-anmodningstekst. Oversætteren vil automatisk registrere kildeformatet og konvertere det til målformatet. Brug dette til at fejlsøge, hvordan OmniRoute oversætter anmodninger mellem formater (OpenAI ↔ Claude ↔ Gemini ↔ Responses API).", + "input": "Input", + "output": "Output", + "auto": "Auto", + "swapFormats": "Skift formater", + "translateAction": "Oversæt", + "clear": "Ryd", + "inputPlaceholder": "Indsæt en anmodningstekst her eller vælg en skabelon nedenfor...", + "exampleTemplates": "Eksempel skabeloner", + "exampleTemplatesHint": "— Klik for at indlæse", + "templateLoadHint": "Skabelonen indlæser anmodningen i formatet {format}. Skift kildeformat for at indlæse i et andet format.", + "compatibilityTester": "Kompatibilitetstester", + "compatibilityReport": "Kompatibilitetsrapport", + "testBenchDescription": "Kør foruddefinerede scenarier (simpel chat, værktøjsopkald osv.) for at bekræfte oversættelse og udbyderkompatibilitet. Vælg et kildeformat og måludbyder, og kør derefter alle test for at se en kompatibilitetsprocent. Brug dette til at finde ud af, hvilke funktioner der fungerer på tværs af udbydere.", + "targetProvider": "Måludbyder", + "runAllTests": "Kør alle tests", + "runTest": "Kør test", + "reRun": "Kør igen", + "running": "Kører...", + "passed": "bestået", + "failed": "mislykkedes", + "passedIconLabel": "✅ Bestået", + "chunks": "bidder", + "scenarioSimpleChat": "Simpel chat", + "scenarioToolCalling": "Værktøjsopkald", + "scenarioMultiTurn": "Multivending", + "scenarioThinking": "Tænker", + "scenarioSystemPrompt": "Systemprompt", + "scenarioStreaming": "Streaming", + "templateNames": { + "simple-chat": "Simpel chat", + "tool-calling": "Værktøjsopkald", + "multi-turn": "Multivending", + "thinking": "Tænker", + "system-prompt": "Systemprompt", + "streaming": "Streaming" + }, + "templateDescriptions": { + "simple-chat": "Grundlæggende tekstbesked", + "tool-calling": "Funktion/værktøjskald", + "multi-turn": "Samtale med historien", + "thinking": "Udvidet tænkning/ræsonnement", + "system-prompt": "Komplekse systeminstruktioner", + "streaming": "SSE streaming anmodning" + }, + "templatePayloads": { + "simpleChat": { + "system": "Du er en hjælpsom assistent.", + "userGreeting": "Hej! Hvordan har du det i dag?" + }, + "toolCalling": { + "userWeather": "Hvordan er vejret i São Paulo?", + "toolDescription": "Få det aktuelle vejr for en placering", + "cityNameDescription": "Byens navn" + }, + "multiTurn": { + "system": "Du er kodningsassistent.", + "userInitial": "Skriv en funktion til at sortere et array i Python.", + "assistantExample": "Her er en simpel sorteringsfunktion:\n\n``` python\ndef sort_array(arr):\n returner sorteret(arr)\n```", + "userFollowUp": "Gør det nu sorteret i faldende rækkefølge." + }, + "thinking": { + "question": "Hvad er summen af de første 100 primtal?" + }, + "systemPrompt": { + "systemInstruction": "Du er senior softwareingeniør med speciale i distribuerede systemer. Besvar spørgsmål kortfattet ved at bruge industriens bedste praksis. Angiv altid kodeeksempler, når det er relevant. Formater dine svar ved hjælp af markdown.", + "question": "Hvordan implementerer jeg et afbrydermønster?" + }, + "streaming": { + "prompt": "Fortæl mig en kort historie om en robot, der lærer at male." + } + }, + "openaiCompatibleLabel": "OpenAI-kompatibel", + "anthropicCompatibleLabel": "Antropisk kompatibel", + "noTemplateForFormat": "Ingen skabelon til dette format", + "translationFailed": "Oversættelse mislykkedes: {error}", + "pipelineDebugger": "Pipeline Debugger", + "translationPipeline": "Oversættelsesrørledning", + "pipelineVisualization": "Pipeline visualisering", + "pipelineVisualizationHint": "Send en besked for at se, hvordan din anmodning flyder gennem registrering → oversættelse → udbyderopkald.", + "chatTesterDescription": "Send beskeder som et specifikt klientformat og inspicér hvert trin i oversættelsespipelinen.", + "chatTesterFlow": "Client Request → Format Detection → OpenAI Intermediate → Provider Format → Response", + "clickStepToInspect": "Klik på et trin for at inspicere dataene på det tidspunkt.", + "clientFormat": "Klientformat", + "provider": "Udbyder", + "modelPlaceholder": "Vælg eller skriv et modelnavn...", + "sendMessageToSeePipeline": "Send en besked for at se oversættelsespipeline", + "chatMessageHintPrefix": "Din besked vil blive formateret som en", + "chatMessageHintSuffix": "anmodning, oversat gennem pipelinen og sendt til den valgte udbyder.", + "youWithFormat": "Dig ({format})", + "assistant": "Assistent", + "typeMessage": "Skriv en besked...", + "send": "Send", + "clientRequest": "Kundeanmodning", + "clientRequestDescription": "Anmodningslegemet, som din klient ville sende det", + "formatDetected": "Format fundet", + "formatDetectedDescription": "OmniRoute registrerer automatisk API-formatet fra anmodningsstrukturen", + "openaiIntermediate": "OpenAI Intermediate", + "openaiIntermediateDescription": "Alle formater normaliseres først til OpenAI-format (den universelle bro)", + "providerFormat": "Udbyder format", + "providerFormatDescription": "OpenAI-formatet er oversat til udbyderens oprindelige format", + "providerResponse": "Udbyder svar", + "providerResponseRawDescription": "Det rå svar fra udbyderens API", + "providerResponseSseDescription": "Den rå SSE-stream fra udbyderens API", + "unexpectedError": "Der opstod en uventet fejl", + "error": "Fejl", + "errorMessage": "Fejl: {message}", + "requestFailed": "Anmodningen mislykkedes", + "noTextExtracted": "(Ingen tekst udtrukket)", + "liveMonitorDescriptionPrefix": "Viser oversættelsesbegivenheder, mens API-kald flyder gennem OmniRoute. Hændelser kommer fra bufferen i hukommelsen (nulstilles ved genstart). Brug", + "liveMonitorDescriptionSuffix": ", eller eksterne API-kald for at generere hændelser." + }, + "usage": { + "title": "Brug", + "loggerTab": "Logger", + "proxyTab": "Fuldmagt", + "budgetManagement": "Budgetstyring", + "budgetSaved": "Budgetgrænser gemt", + "budgetSaveFailed": "Budgettet kunne ikke gemmes", + "loadingBudgetData": "Indlæser budgetdata...", + "noApiKeysTitle": "Ingen API-nøgler", + "noApiKeysDescription": "Tilføj API-nøgler først for at opsætte budgetgrænser.", + "apiKey": "API nøgle", + "todaysSpend": "Dagens forbrug", + "thisMonth": "Denne måned", + "setLimits": "Sæt grænser", + "dailyLimitUsd": "Daglig grænse (USD)", + "monthlyLimitUsd": "Månedlig grænse (USD)", + "warningThresholdPercent": "Advarselstærskel (%)", + "dailyLimitPlaceholder": "f.eks. 5.00", + "monthlyLimitPlaceholder": "f.eks. 50,00", + "warningThresholdPlaceholder": "80", + "saveLimits": "Gem grænser", + "budgetOk": "Budget OK — {remaining} tilbage", + "budgetExceeded": "Budget overskredet — anmodninger kan blive blokeret", + "totalRequests": "Samlet antal anmodninger", + "noDataYet": "Ingen data endnu", + "latency": "Latency", + "latencyP50": "p50", + "latencyP95": "s95", + "latencyP99": "s99", + "promptCache": "Spørg cache", + "systemHealth": "Systemsundhed", + "entries": "Indgange", + "activeCount": "{count} aktiv", + "openCircuitBreakersDetected": "Åbne afbrydere registreret", + "hitRate": "Hitrate", + "hitsMisses": "Hits / Misses", + "circuitBreakers": "Strømafbrydere", + "lockedIPs": "Låste IP'er", + "lockoutsAutoRefreshHint": "Låse for hastighedsbegrænsning pr. model • Automatisk opdatering 10s", + "lockedCount": "{count, plural, one {# locked} other {# locked}}", + "timeLeft": "{time} tilbage", + "howItWorks": "Hvordan det virker", + "howItWorksSubtitle": "Lær, hvordan evalueringer validerer dine LLM-svar", + "define": "Definer", + "defineStepDescription": "Opret testcases med inputprompter og forventede outputkriterier ved hjælp af strategier som indeholder, regex eller eksakt match.", + "run": "Løb", + "runStepDescription": "Udfør testsager mod dine LLM-endepunkter gennem OmniRoute. Hver sag sendes som en ægte API-anmodning.", + "evaluate": "Evaluer", + "evaluateStepDescription": "Svar sammenlignes med forventede kriterier. Se bestået/ikke bestået for hver sag med latency-metrics og detaljeret feedback.", + "evalSuites": "Evalueringssuiter", + "evalSuitesHint": "Klik på en suite for at se testcases, og kør derefter for at evaluere dine LLM-endepunkter", + "evalsLoading": "Indlæser eval suiter...", + "noEvalSuitesFound": "Ingen Eval-suiter fundet", + "noEvalSuitesDescription": "Eval-suiter kan defineres via API'et eller i kode. De tester modeloutput mod forventede resultater ved hjælp af strategier som indeholder, regex, eksakt match og brugerdefinerede funktioner.", + "columnCase": "Sag", + "columnStatus": "Status", + "columnLatency": "Latency", + "columnDetails": "Detaljer", + "columnModel": "Model", + "columnStrategy": "Strategi", + "columnExpected": "Forventet", + "statsSuites": "Suiter", + "statsTestCases": "Test Cases", + "statsModels": "Modeller", + "statsCoverage": "Dækning", + "statsStrategiesCount": "{count} strategier", + "evaluationStrategies": "Evalueringsstrategier", + "modelsUnderTest": "Modeller under test", + "searchSuitesPlaceholder": "Søg suiter...", + "passSuffix": "bestå", + "casesCount": "{count, plural, one {# case} other {# cases}}", + "runEval": "Kør Eval", + "runningProgress": "Kører {current}/{total}...", + "passRate": "beståelsesprocent", + "summaryBreakdown": "{passed} bestået · {failed} mislykkedes · {total} i alt", + "passedIconLabel": "✅ Bestået", + "failedIconLabel": "❌ Mislykkedes", + "detailsContains": "Indeholder: \"{term}\"", + "detailsRegex": "Regex: {pattern}", + "detailsExpected": "Forventet: \"{expected}\"", + "noResultsYet": "Ingen resultater endnu", + "testCasesCount": "Testcases ({count})", + "noTestCasesDefined": "Ingen testcases defineret", + "runEvalHint": "Klik på \"Run Eval\" for at udføre alle sager mod dit LLM-slutpunkt. Hver test sender en reel anmodning gennem OmniRoute.", + "notifyNoTestCases": "Ingen testcases defineret for denne suite", + "notifyAllCasesPassed": "Alle {total} sager bestået ✅", + "notifySomeCasesFailed": "{passed}/{total} bestået, {failed} mislykkedes", + "notifyEvalRunFailed": "Evalkørsel mislykkedes", + "notifyEvalTitle": "Eval: {name}", + "modelEvals": "Modelvurderinger", + "evalsHeroDescription": "Test og valider dine LLM-endepunkter ved at køre foruddefinerede evalueringspakker. Hver suite indeholder testcases, der sender reelle prompter gennem OmniRoute og sammenligner svar med forventede kriterier - hjælper dig med at opdage regression, sammenligne modeller og sikre svarkvalitet på tværs af udbydere.", + "qualityValidation": "Kvalitetsvalidering", + "modelComparison": "Model sammenligning", + "regressionDetection": "Regression detektion", + "latencyBenchmarks": "Latency Benchmarks", + "modelLockouts": "Model Lockouts", + "noLockouts": "Ingen modeller er låst i øjeblikket", + "activeSessions": "Aktive sessioner", + "noSessions": "Ingen aktive sessioner", + "sessionsHint": "Sessioner vises, når anmodninger strømmer gennem proxyen", + "sessionsTrackedHint": "Spores via anmodning om fingeraftryk • Automatisk opdatering 5s", + "session": "Session", + "age": "Alder", + "requests": "Forespørgsler", + "connection": "Forbindelse", + "durationMillisecondsShort": "{value}ms", + "durationSecondsShort": "{value}s", + "durationMinutesShort": "{value}m", + "durationHoursShort": "{value}h", + "reasonSeparator": " - ", + "notAvailableSymbol": "-", + "providerLimits": "Udbydergrænser", + "noProviders": "Ingen udbydere tilsluttet", + "connectProvidersForQuota": "Opret forbindelse til udbydere med OAuth for at spore dine API-kvotegrænser og brug.", + "accountsCount": "{count, plural, one {# account} other {# accounts}}", + "filteredFromCount": "(filtreret fra {count})", + "autoRefresh": "Automatisk opdatering", + "refreshAll": "Opdater alle", + "loadingQuotas": "Indlæser...", + "account": "Konto", + "modelQuotas": "Modelkvoter", + "lastUsed": "Sidst brugt", + "actions": "Handlinger", + "refreshQuota": "Opdater kvote", + "today": "I dag", + "tomorrow": "I morgen", + "dayTimeFormat": "{day}, {time}", + "inDuration": "i {duration}", + "notApplicable": "N/A", + "rawPlanWithValue": "Rå plan: {plan}", + "noPlanFromProvider": "Ingen plan fra udbyderen", + "noQuotaData": "Ingen kvotedata", + "noQuotaDataAvailable": "Ingen tilgængelige kvotedata", + "noAccountsForTierFilter": "Der blev ikke fundet nogen konti til niveaufilter", + "tierAll": "Alle", + "tierEnterprise": "Enterprise", + "tierTeam": "Team", + "tierBusiness": "Forretning", + "tierUltra": "Ultra", + "tierPro": "Pro", + "tierPlus": "Plus", + "tierFree": "Gratis", + "tierUnknown": "Ukendt" + }, + "modals": { + "waitingAuth": "Venter på autorisation", + "verificationUrl": "Bekræftelses-URL", + "yourCode": "Din kode", + "remoteAccess": "Fjernadgang:", + "connectedSuccess": "Forbundet med succes!", + "connectionFailed": "Forbindelse mislykkedes", + "chooseAuthMethod": "Vælg din godkendelsesmetode:", + "awsBuilderId": "AWS Builder ID", + "awsIamIdentity": "AWS IAM Identity Center", + "googleAccount": "Google-konto", + "githubAccount": "GitHub-konto", + "importToken": "Importer token", + "pasteToken": "Indsæt opdateringstoken fra Kiro IDE.", + "awsRegion": "AWS-regionen", + "autoDetecting": "Automatisk registrering af tokens...", + "readingFromCache": "Læser fra AWS SSO-cache", + "readingFromCursor": "Læsning fra Cursor IDE-database", + "initializing": "Initialiserer...", + "pricingConfig": "Priskonfiguration", + "loadingPricing": "Indlæser prisdata...", + "pricingRatesFormat": "Prisformat", + "noPricingData": "Ingen tilgængelige prisdata", + "noModelsFound": "Ingen modeller fundet" + }, + "loggers": { + "allProviders": "Alle udbydere", + "allModels": "Alle modeller", + "allAccounts": "Alle konti", + "allApiKeys": "Alle API-nøgler", + "allTypes": "Alle typer", + "allLevels": "Alle niveauer", + "modelAZ": "Model A-Z", + "modelZA": "Model Z-A", + "loadingLogs": "Indlæser logfiler...", + "loadingProxyLogs": "Indlæser proxylogfiler...", + "noLogEntries": "Ingen logposter fundet", + "noPayloadData": "Ingen nyttelastdata tilgængelige for denne logpost.", + "proxyEvent": "Proxy begivenhed", + "proxy": "Fuldmagt", + "level": "Niveau", + "directNative": "Direkte (native)", + "combo": "Combo", + "inputTokens": "jeg:", + "outputTokens": "O:" + }, + "stats": { + "usageOverview": "Brugsoversigt", + "outputTokens": "Output tokens", + "totalCost": "Samlede omkostninger", + "usageByModel": "Brug efter model", + "usageByAccount": "Brug efter konto", + "failedToLoad": "Kunne ikke indlæse brugsstatistikker.", + "tokenHealth": "Token Health", + "totalOAuth": "Samlet OAuth", + "healthy": "Sundt", + "warning": "Advarsel", + "errored": "Fejl", + "lastCheck": "Sidste kontrol", + "noData": "Ingen data", + "share": "Del", + "unableToLoad": "Systemmetrics kunne ikke indlæses", + "product": "Produkt", + "resources": "Ressourcer", + "company": "Selskab" + }, + "auth": { + "welcome": "Velkommen", + "signIn": "Log ind", + "enterPassword": "Indtast din adgangskode for at fortsætte", + "password": "Adgangskode", + "unifiedProxy": "Unified AI API Proxy", + "unifiedAiApiProxy": "Unified AI API Proxy", + "unifiedAiApiProxyDesc": "Rut anmodninger til flere AI-udbydere gennem et enkelt slutpunkt. Belastningsbalancering, failover og brugssporing indbygget.", + "passwordNotEnabled": "Adgangskodebeskyttelse er ikke aktiveret", + "loading": "Indlæser...", + "invalidPassword": "Ugyldig adgangskode", + "errorOccurredRetry": "Der opstod en fejl. Prøv venligst igen.", + "configureInstance": "Lad os få konfigureret din OmniRoute-instans", + "runOnboardingWizard": "Kør onboarding-guiden for at konfigurere din adgangskode og oprette forbindelse til din første AI-udbyder.", + "startOnboarding": "Start Onboarding", + "secureYourInstance": "Sikre din instans", + "setPasswordDescription": "Indstil en adgangskode for at beskytte dit dashboard og sikre dine API-endepunkter mod uautoriseret adgang.", + "configurePassword": "Konfigurer adgangskode", + "continue": "Fortsæt", + "windowWillClose": "Dette vindue lukkes automatisk...", + "closeTabNow": "Du kan lukke denne fane nu.", + "copyUrlManual": "Kopier venligst URL'en fra adresselinjen og indsæt den i applikationen.", + "accessDeniedDescription": "Du har ikke tilladelse til at få adgang til denne ressource. Tjek din API-nøgle, eller kontakt administratoren.", + "goToDashboard": "Gå til Dashboard", + "featureMultiProviderTitle": "Multi-udbyder", + "featureMultiProviderDesc": "OpenAI, Anthropic, Google og mere", + "featureLoadBalancingTitle": "Lastbalancering", + "featureLoadBalancingDesc": "Fordel anmodninger intelligent", + "featureUsageTrackingTitle": "Brugssporing", + "featureUsageTrackingDesc": "Overvåg omkostninger og tokens", + "resetPassword": "Nulstil adgangskode", + "resetDescription": "Vælg en metode til at gendanne adgangen til dit dashboard", + "stopServer": "Stop OmniRoute-serveren", + "processing": "Behandler...", + "pleaseWait": "Vent venligst, mens vi fuldfører godkendelsen.", + "authSuccess": "Godkendelse lykkedes!", + "copyUrl": "Kopiér denne URL", + "accessDenied": "Adgang nægtet", + "methodCliTitle": "Metode 1: CLI-nulstilling", + "methodCliDescription": "Kør følgende kommando på serveren, hvor OmniRoute kører:", + "methodCliHint": "Dette vil bede dig om at indstille en ny adgangskode. Serveren skal stoppes først.", + "methodManualTitle": "Metode 2: Manuel nulstilling", + "methodManualDescription": "Slet adgangskoden fra databasen og indstil en ny ved opstart:", + "setPasswordInYour": "Indstil en ny adgangskode i din", + "fileLabelSuffix": "fil:", + "newPasswordPlaceholder": "dit_nye_adgangskode", + "deleteSettingsFile": "Slet", + "orRemovePasswordHashField": "eller fjern feltet passwordHash", + "restartServerWithNewPassword": "Genstart serveren - den vil bruge den nye adgangskode", + "backToLogin": "Tilbage til Login", + "forgotPassword": "Glemt adgangskode?" + }, + "landing": { + "brandName": "OmniRoute", + "navigateHome": "Naviger til hjem", + "toggleMenu": "Skift menu", + "featuresLink": "Funktioner", + "docsLink": "Dokumenter", + "github": "GitHub", + "versionLive": "v1.0 er nu live", + "oneEndpoint": "Et slutpunkt til", + "allProviders": "Alle AI-udbydere", + "heroDescription": "AI-slutpunktsproxy med web-dashboard - En JavaScript-port af CLIProxyAPI. Fungerer problemfrit med Claude Code, OpenAI Codex, Cline, RooCode og andre CLI-værktøjer.", + "getStarted": "Kom i gang", + "viewOnGithub": "Se på GitHub", + "powerfulFeatures": "Kraftige funktioner", + "featuresSubtitle": "Alt hvad du behøver for at administrere din AI-infrastruktur på ét sted, bygget til skala.", + "featureUnifiedEndpointTitle": "Unified Endpoint", + "featureUnifiedEndpointDesc": "Få adgang til alle udbydere via en enkelt standard API-URL.", + "featureEasySetupTitle": "Nem opsætning", + "featureEasySetupDesc": "Kom i gang på få minutter med npx-kommandoen.", + "featureModelFallbackTitle": "Model Fallback", + "featureModelFallbackDesc": "Skift automatisk udbyder ved fejl eller høj latenstid.", + "featureUsageTrackingTitle": "Brugssporing", + "featureUsageTrackingDesc": "Detaljerede analyser og omkostningsovervågning på tværs af alle modeller.", + "featureOAuthApiKeysTitle": "OAuth- og API-nøgler", + "featureOAuthApiKeysDesc": "Administrer legitimationsoplysninger sikkert i én boks.", + "featureCloudSyncTitle": "Cloud Sync", + "featureCloudSyncDesc": "Synkroniser dine konfigurationer på tværs af enheder med det samme.", + "featureCliSupportTitle": "CLI support", + "featureCliSupportDesc": "Fungerer med Claude Code, Codex, Cline, Cursor og mere.", + "featureDashboardTitle": "Dashboard", + "featureDashboardDesc": "Visuelt dashboard til trafikanalyse i realtid.", + "howItWorks": "Sådan fungerer OmniRoute", + "howItWorksDescription": "Data flyder problemfrit fra din applikation gennem vores intelligente routing-lag til den bedste udbyder til jobbet.", + "howItWorksStep1Title": "1. CLI & SDK'er", + "howItWorksStep1Description": "Dine anmodninger starter fra dine yndlingsværktøjer eller vores forenede SDK. Skift blot den grundlæggende URL.", + "howItWorksStep2Title": "2. OmniRoute Hub", + "howItWorksStep2Description": "Vores motor analyserer prompten, tjekker udbyderens helbred og ruter for laveste latenstid eller omkostninger.", + "howItWorksStep3Title": "3. AI-udbydere", + "howItWorksStep3Description": "Anmodningen opfyldes af OpenAI, Anthropic, Gemini eller andre øjeblikkeligt.", + "getStartedIn30Seconds": "Kom i gang på 30 sekunder", + "getStartedDescription": "Installer OmniRoute, konfigurer dine udbydere via web-dashboard, og begynd at dirigere AI-anmodninger.", + "installOmniRoute": "Installer OmniRoute", + "installStepDescription": "Kør npx-kommandoen for at starte serveren med det samme", + "openDashboard": "Åbn Dashboard", + "openDashboardStepDescription": "Konfigurer udbydere og API-nøgler via webgrænseflade", + "routeRequests": "Ruteanmodninger", + "routeRequestsStepDescription": "Ret dine CLI-værktøjer til {endpoint}", + "terminal": "terminal", + "copy": "Kopiér", + "copied": "✓ Kopieret", + "startingOmniRoute": "Starter OmniRoute...", + "serverRunningOnLabel": "Server kører på", + "dashboardLabel": "Dashboard", + "readyToRoute": "Klar til rute! ✓", + "configureProvidersNote": "📝 Konfigurer udbydere i dashboard eller brug miljøvariabler", + "dataLocation": "Dataplacering:", + "dataLocationMacLinux": " macOS/Linux:", + "dataLocationWindows": " Windows:", + "product": "Produkt", + "dashboardLink": "Dashboard", + "changelog": "Ændringslog", + "resources": "Ressourcer", + "documentation": "Dokumentation", + "npm": "NPM", + "legal": "Juridisk", + "mitLicense": "MIT-licens", + "footerTagline": "Det forenede slutpunkt for AI-generering. Forbind, diriger og administrer dine AI-udbydere med lethed.", + "copyright": "© {year} OmniRoute. Alle rettigheder forbeholdes.", + "flowToolClaudeCode": "Claude kode", + "flowToolOpenAICodex": "OpenAI Codex", + "flowToolCline": "Cline", + "flowToolCursor": "Markør", + "flowProviderOpenAI": "OpenAI", + "flowProviderAnthropic": "Antropisk", + "flowProviderGemini": "Tvillingerne", + "flowProviderGithubCopilot": "GitHub Copilot", + "interactiveDiagram": "Interaktivt diagram synligt på skrivebordet", + "ctaTitle": "Klar til at forenkle din AI-infrastruktur?", + "ctaDescription": "Slut dig til udviklere, der strømliner deres AI-integrationer med OmniRoute. Open source og gratis at starte.", + "startFree": "Start gratis", + "readDocumentation": "Læs dokumentation" + }, + "docs": { + "title": "Dokumentation", + "quickStart": "Hurtig start", + "features": "Funktioner", + "supportedProviders": "Understøttede udbydere", + "supportedProvidersToc": "Udbydere", + "commonUseCases": "Almindelige anvendelsestilfælde", + "clientCompatibility": "Klientkompatibilitet", + "apiReference": "API-reference", + "method": "Metode", + "path": "Sti", + "notes": "Noter", + "modelPrefixes": "Modelpræfikser", + "prefix": "Præfiks", + "troubleshooting": "Fejlfinding", + "supportsChat": "Understøtter både chat- og svarendepunkter.", + "oauthAutoRefresh": "OAuth-forbindelse med automatisk token-opdatering.", + "fullStreaming": "Fuld streaming support til alle modeller.", + "docsLabel": "Dokumenter", + "docsHeroDescription": "AI-gateway til LLM'er med flere udbydere. Ét endepunkt for OpenAI, Anthropic, Gemini, GitHub Copilot, Claude Code, Cursor og mere end 20 udbydere.", + "openDashboard": "Åbn Dashboard", + "endpointPage": "Slutpunktside", + "github": "GitHub", + "reportIssue": "Rapportér problem", + "onThisPage": "På denne side", + "documentationVersion": "Dokumentation - v{version}", + "quickStartStep1Title": "1. Installer og kør", + "quickStartStep1Prefix": "Løb", + "quickStartStep1Middle": "eller klon fra GitHub og kør", + "quickStartStep2Title": "2. Opret API-nøgle", + "quickStartStep2Text": "Gå til Slutpunkt -> Registrerede nøgler. Generer én nøgle pr. miljø.", + "quickStartStep3Title": "3. Tilslut udbydere", + "quickStartStep3Text": "Tilføj udbyderkonti via OAuth-login, API-nøgle eller automatisk forbindelse med frit niveau.", + "quickStartStep4Title": "4. Indstil klientbase-URL", + "quickStartStep4Prefix": "Peg din IDE- eller API-klient til", + "quickStartStep4Suffix": "Brug for eksempel udbyderpræfiks", + "featureRoutingTitle": "Multi-Provider Routing", + "featureRoutingText": "Rut anmodninger til 30+ AI-udbydere gennem et enkelt OpenAI-kompatibelt slutpunkt. Understøtter chat, svar, lyd og billed-API'er.", + "featureCombosTitle": "Kombinationer og balancering", + "featureCombosText": "Opret modelkombinationer med fallback-kæder og balanceringsstrategier: round-robin, prioritet, tilfældig, mindst brugt og omkostningsoptimeret.", + "featureUsageTitle": "Brug og omkostningssporing", + "featureUsageText": "Tokenoptælling i realtid, omkostningsberegning pr. udbyder/model og detaljeret forbrugsopdeling efter API-nøgle og konto.", + "featureAnalyticsTitle": "Analytics Dashboard", + "featureAnalyticsText": "Visuel analyse med diagrammer for anmodninger, tokens, fejl, latens, omkostninger og modelpopularitet over tid.", + "featureHealthTitle": "Sundhedsovervågning", + "featureHealthText": "Live-sundhedstjek, udbyderstatus, strømafbrydertilstande og automatisk hastighedsgrænsedetektering med eksponentiel backoff.", + "featureCliTitle": "CLI værktøjer", + "featureCliText": "Administrer IDE-konfigurationer, eksporter/importér sikkerhedskopier, find codex-profiler og konfigurer indstillinger fra dashboardet.", + "featureSecurityTitle": "Sikkerhed og politikker", + "featureSecurityText": "API-nøglegodkendelse, IP-filtrering, promptindsprøjtningsbeskyttelse, domænepolitikker, sessionsstyring og revisionslogning.", + "featureCloudSyncTitle": "Cloud Sync", + "featureCloudSyncText": "Synkroniser din konfiguration med Cloudflare Workers for fjernadgang med krypterede legitimationsoplysninger og automatisk failover.", + "providersAcrossConnectionTypes": "{count} udbydere på tværs af tre forbindelsestyper.", + "manageProviders": "Administrer udbydere", + "providersCount": "{count} udbydere", + "providerTypeFree": "Gratis niveau", + "providerTypeOAuth": "OAuth", + "providerTypeApiKey": "API nøgle", + "useCaseSingleEndpointTitle": "Enkelt slutpunkt for mange udbydere", + "useCaseSingleEndpointText": "Peg klienter til én basis-URL og rute efter modelpræfiks (for eksempel: gh/, cc/, kr/, openai/).", + "useCaseFallbackTitle": "Fallback og modelskift med kombinationer", + "useCaseFallbackText": "Opret kombinationsmodeller i Dashboard, og hold klientkonfigurationen stabil, mens udbyderne roterer internt.", + "useCaseUsageVisibilityTitle": "Brug, omkostninger og fejlfindingssynlighed", + "useCaseUsageVisibilityText": "Spor tokens og omkostninger efter udbyder, konto og API-nøgle på fanerne Brug og Analytics.", + "clientCherryStudioTitle": "Cherry Studio", + "baseUrlLabel": "Basis URL", + "chatEndpointLabel": "Chat slutpunkt", + "modelRecommendationLabel": "Modelanbefaling: eksplicit præfiks", + "clientCodexTitle": "Codex / GitHub Copilot-modeller", + "clientCodexBullet1": "Brug model-id'er med", + "clientCodexBullet2": "Codex-familiemodeller dirigeres automatisk til", + "clientCodexBullet3": "Ikke-Codex-modeller fortsætter", + "clientCursorTitle": "Markør IDE", + "clientCursorBullet1": "Brug", + "clientCursorBullet1Suffix": "præfiks for Cursor-modeller.", + "clientCursorBullet2": "OAuth-forbindelse - log på fra siden Udbydere.", + "clientClaudeTitle": "Claude Code / Antigravity", + "clientClaudeBullet1Prefix": "Brug", + "clientClaudeBullet1Middle": "(Claude) eller", + "clientClaudeBullet1Suffix": "(antityngdekraft) præfiks.", + "endpointChatNote": "OpenAI-kompatibelt chatslutpunkt (standard).", + "endpointResponsesNote": "Responses API-endepunkt (Codex, o-serien).", + "endpointModelsNote": "Modelkatalog for alle tilsluttede udbydere.", + "endpointAudioNote": "Lydtransskription (Deepgram, AssemblyAI).", + "endpointImagesNote": "Billedgenerering (NanoBanana).", + "endpointRewriteChatNote": "Omskrivehjælper til klienter uden /v1.", + "endpointRewriteResponsesNote": "Omskriv hjælper til svar uden /v1.", + "endpointRewriteModelsNote": "Omskrivningshjælper til modelopdagelse uden /v1.", + "modelPrefixesDescriptionStart": "Brug udbyderpræfikset før modelnavnet for at rute til en bestemt udbyder. Eksempel:", + "modelPrefixesDescriptionEnd": "ruter til GitHub Copilot.", + "provider": "Udbyder", + "type": "Type", + "troubleshootingModelRouting": "Hvis klienten fejler med modelrouting, skal du bruge eksplicit udbyder/model (for eksempel: gh/gpt-5.1-codex).", + "troubleshootingAmbiguousModels": "Hvis du modtager tvetydige modelfejl, skal du vælge et udbyderpræfiks i stedet for et blottet model-id.", + "troubleshootingCodexFamily": "For GitHub Codex-familiemodeller skal du beholde modellen som gh/; routeren vælger /svar automatisk.", + "troubleshootingTestConnection": "Brug Dashboard > Udbydere > Test forbindelse, før du tester fra IDE'er eller eksterne klienter.", + "troubleshootingCircuitBreaker": "Hvis en udbyder viser en afbryder åben, skal du vente på nedkøling eller tjekke Health-siden for detaljer.", + "troubleshootingOAuth": "For OAuth-udbydere skal du godkende igen, hvis tokens udløber. Tjek udbyderkortets statusindikator." + }, + "legal": { + "privacyPolicy": "Privatlivspolitik", + "termsOfService": "Servicevilkår", + "providerConfigurations": "Udbyder konfigurationer", + "apiKeys": "API nøgler", + "usageLogs": "Brugslogs", + "applicationSettings": "Applikationsindstillinger", + "viewExportAnalytics": "Se og eksporter brugsanalyse", + "clearHistory": "Ryd brugshistorik til enhver tid", + "configureRetention": "Konfigurer logopbevaringspolitikker", + "backupRestore": "Sikkerhedskopier og gendan din database", + "privacyMetadataTitle": "Privatlivspolitik | OmniRoute", + "privacyMetadataDescription": "Privatlivspolitik for OmniRoute AI API proxy-routeren.", + "termsMetadataTitle": "Servicevilkår | OmniRoute", + "termsMetadataDescription": "Servicevilkår for OmniRoute AI API proxy-routeren.", + "backToHome": "Tilbage til hjemmet", + "lastUpdated": "Sidst opdateret: {date}", + "policyLastUpdatedDate": "13. februar 2026", + "listSeparator": "-", + "questionsVisit": "Spørgsmål? Besøg vores", + "githubRepository": "GitHub-depot", + "privacySection1Title": "1. Lokal-første arkitektur", + "privacySection1Text": "OmniRoute er designet som en lokal-først-applikation. Al databehandling og lagring foregår udelukkende på din maskine. Der er ingen centraliseret server, der indsamler dine oplysninger.", + "privacySection2Title": "2. Data vi gemmer", + "privacyDataStoredIn": "Følgende data gemmes lokalt i", + "privacyDataProviderConfigurationsDesc": "forbindelses-URL'er, udbydertyper og prioritetsindstillinger", + "privacyDataApiKeysDesc": "krypteret og gemt lokalt til godkendelse hos AI-udbydere", + "privacyDataUsageLogsDesc": "antal anmodninger, tokenbrug, modelnavne, tidsstempler og svartider", + "privacyDataApplicationSettingsDesc": "temapræferencer, routingstrategi og kombinationskonfigurationer", + "privacySection3Title": "3. Ingen telemetri", + "privacySection3Text": "OmniRoute indsamler ikke telemetri, analyser eller nedbrudsrapporter. Der sendes ingen data til os eller nogen tredjepart. Dine brugsmønstre, API-kald og konfigurationer forbliver helt private.", + "privacySection4Title": "4. Tredjeparts AI-udbydere", + "privacySection4Text": "Når du foretager API-kald gennem OmniRoute, videresendes dine anmodninger til de AI-udbydere, du har konfigureret (for eksempel: OpenAI, Anthropic, Google). Disse udbydere har deres egne privatlivspolitikker, der styrer, hvordan de håndterer dine data. Gennemgå venligst:", + "privacyOpenAiPolicy": "OpenAI Privatlivspolitik", + "privacyAnthropicPolicy": "Antropisk privatlivspolitik", + "privacyGooglePolicy": "Googles privatlivspolitik", + "privacySection5Title": "5. Cloud Sync (valgfrit)", + "privacySection5Text": "Hvis du aktiverer den valgfri cloud-synkroniseringsfunktion, kan udbyderkonfigurationer og API-nøgler overføres til et konfigureret cloud-slutpunkt. Denne funktion er deaktiveret som standard og kræver eksplicit opt-in.", + "privacySection6Title": "6. Logning", + "privacyLoggingIntro": "Anmodningslogfiler kan konfigureres via dashboardindstillingerne. Du kan:", + "privacySection7Title": "7. Dine rettigheder", + "privacySection7TextStart": "Da alle data er gemt lokalt, har du fuld kontrol. Du kan til enhver tid slette dine data ved at fjerne", + "privacySection7TextEnd": "bibliotek eller ved hjælp af databasesikkerhedskopierings- og gendannelsesfunktionerne i dashboardet.", + "termsSection1Title": "1. Oversigt", + "termsSection1Text": "OmniRoute er en lokal-første AI API proxy-router, der fungerer udelukkende på din maskine. Det dirigerer anmodninger til flere AI-udbydere med belastningsbalancering, failover og brugssporing.", + "termsSection2Title": "2. Brugeransvar", + "termsResponsibilityApiKeys": "Du er alene ansvarlig for at administrere dine egne API-nøgler og legitimationsoplysninger for tredjeparts AI-udbydere (OpenAI, Anthropic, Google osv.).", + "termsResponsibilityCompliance": "Du skal overholde servicevilkårene for hver AI-udbyder, hvis API du tilgår via OmniRoute.", + "termsResponsibilitySecurity": "Du er ansvarlig for sikkerheden af din lokale OmniRoute-installation, herunder indstilling af en adgangskode og begrænsning af netværksadgang.", + "termsSection3Title": "3. Hvordan det virker", + "termsSection3Text": "OmniRoute fungerer som en mellemmand. API-kald, der sendes til OmniRoute, oversættes og videresendes til dine konfigurerede AI-udbydere. OmniRoute ændrer ikke indholdet af dine anmodninger eller svar ud over den nødvendige protokoloversættelse.", + "termsSection4Title": "4. Datahåndtering", + "termsDataStoredLocally": "Alle data gemmes lokalt på din maskine i en SQLite-database.", + "termsNoTransmission": "OmniRoute transmitterer ingen data til eksterne servere, medmindre du udtrykkeligt aktiverer skysynkroniseringsfunktioner.", + "termsDataLocationText": "Brugslogfiler, API-nøgler og konfiguration gemmes i", + "termsSection5Title": "5. Ansvarsfraskrivelse", + "termsSection5Text": "OmniRoute leveres \"som den er\" uden garanti af nogen art. Vi er ikke ansvarlige for omkostninger, der påløber som følge af API-brug, serviceforstyrrelser eller tab af data. Vedligehold altid sikkerhedskopier af din konfiguration.", + "termsSection6Title": "6. Open Source", + "termsSection6Text": "OmniRoute er open source-software. Du kan frit inspicere, ændre og distribuere den i henhold til licensbetingelserne." + } +} diff --git a/src/i18n/messages/de.json b/src/i18n/messages/de.json new file mode 100644 index 0000000000..2bbaee6116 --- /dev/null +++ b/src/i18n/messages/de.json @@ -0,0 +1,2040 @@ +{ + "common": { + "save": "Speichern", + "cancel": "Abbrechen", + "delete": "Löschen", + "loading": "Laden...", + "error": "Es ist ein Fehler aufgetreten", + "success": "Erfolg", + "confirm": "Bist du sicher?", + "refresh": "Aktualisieren", + "close": "Schließen", + "add": "Hinzufügen", + "edit": "Bearbeiten", + "search": "Suchen", + "back": "Zurück", + "next": "Als nächstes", + "submit": "Senden", + "reset": "Zurücksetzen", + "copy": "Kopieren", + "copied": "Kopiert!", + "enabled": "Aktiviert", + "disabled": "Deaktiviert", + "active": "Aktiv", + "inactive": "Inaktiv", + "noData": "Keine Daten verfügbar", + "configure": "Konfigurieren", + "manage": "Verwalten", + "name": "Name", + "actions": "Aktionen", + "status": "Status", + "type": "Typ", + "model": "Modell", + "models": "Modelle", + "provider": "Anbieter", + "account": "Konto", + "time": "Zeit", + "details": "Einzelheiten", + "created": "Erstellt", + "lastUsed": "Zuletzt verwendet", + "loadMore": "Mehr laden", + "noResults": "Keine Ergebnisse gefunden", + "reloadPage": "Seite neu laden", + "connected": "Verbunden", + "disconnected": "Nicht verbunden", + "notConfigured": "Nicht konfiguriert", + "testConnection": "Testverbindung", + "enable": "Aktivieren", + "disable": "Deaktivieren", + "columns": "Spalten", + "newest": "Neueste", + "oldest": "Älteste", + "all": "Alle", + "none": "Keine", + "yes": "Ja", + "no": "Nein", + "warning": "Warnung", + "note": "Hinweis", + "free": "Kostenlos", + "skipToContent": "Zum Inhalt springen" + }, + "sidebar": { + "home": "Zuhause", + "dashboard": "Dashboard", + "providers": "Anbieter", + "combos": "Kombinationen", + "usage": "Nutzung", + "analytics": "Analytik", + "costs": "Kosten", + "health": "Gesundheit", + "limits": "Limits und Quoten", + "cliTools": "CLI-Tools", + "settings": "Einstellungen", + "translator": "Übersetzer", + "docs": "Dokumente", + "issues": "Probleme", + "endpoint": "Endpunkt", + "apiManager": "API-Manager", + "logs": "Protokolle", + "auditLog": "Audit-Protokoll", + "shutdown": "Herunterfahren", + "restart": "Neustart", + "shutdownConfirm": "OmniRoute herunterfahren?", + "restartConfirm": "OmniRoute neu starten?", + "version": "v{version}", + "debug": "Debuggen", + "system": "System", + "help": "Hilfe", + "serverDisconnected": "Serververbindung getrennt", + "serverDisconnectedMsg": "Der Proxyserver wurde gestoppt oder wird neu gestartet.", + "expandSidebar": "Seitenleiste erweitern", + "collapseSidebar": "Seitenleiste einklappen" + }, + "header": { + "logout": "Abmelden", + "language": "Sprache", + "providers": "Anbieter", + "providerDescription": "Verwalten Sie Ihre KI-Anbieterverbindungen", + "combos": "Kombinationen", + "comboDescription": "Modellkombinationen mit Fallback", + "usage": "Nutzung und Analyse", + "usageDescription": "Überwachen Sie Ihre API-Nutzung, den Token-Verbrauch und Ihre Anforderungsprotokolle", + "analytics": "Analysen", + "analyticsDescription": "Diagramme, Trends und Auswertungserkenntnisse", + "cliTools": "CLI-Tools", + "cliToolsDescription": "Konfigurieren Sie CLI-Tools", + "home": "Zuhause", + "homeDescription": "Willkommen bei OmniRoute", + "endpoint": "Endpunkt", + "endpointDescription": "API-Endpunktkonfiguration", + "settings": "Einstellungen", + "settingsDescription": "Verwalten Sie Ihre Präferenzen", + "openaiCompatible": "OpenAI-kompatibel", + "anthropicCompatible": "Anthropic-kompatibel" + }, + "home": { + "quickStart": "Schnellstart", + "quickStartDesc": "In 4 Schritten einsatzbereit. Anbieter anbinden, Modelle routen, alles überwachen.", + "fullDocs": "Vollständige Dokumentation", + "step1Title": "1. API-Schlüssel erstellen", + "step1Desc": "Gehen Sie zu Endpoint -> Registrierte Schlüssel. Erstellen Sie einen Schlüssel pro Umgebung.", + "step2Title": "2. Anbieter verbinden", + "step2Desc": "Fügen Sie Konten unter Providers hinzu. Unterstützt OAuth, API Key und kostenlose Stufen.", + "step3Title": "3. Client konfigurieren", + "step3Desc": "Legen Sie die Basis-URL in Ihrem IDE- oder API-Client auf {url} fest.", + "step4Title": "4. Überwachen und optimieren", + "step4Desc": "Verfolgen Sie Tokens, Kosten und Fehler in Anfrageprotokollen und Analysen.", + "providersOverview": "Anbieterübersicht", + "configuredOf": "{configured} konfiguriert von {total} verfügbaren Anbietern", + "noModelsAvailable": "Für diesen Anbieter sind keine Modelle verfügbar.", + "configureFirst": "Konfigurieren Sie zuerst eine Verbindung in {providers}", + "configureProvider": "Anbieter konfigurieren", + "modelAvailable": "{count} Modell verfügbar", + "modelsAvailable": "{count} Modelle verfügbar", + "connectionsActive": "{count} Verbindung aktiv", + "connectionsActivePlural": "{count} Verbindungen aktiv", + "copyModelName": "Modellnamen kopieren", + "documentation": "Dokumentation", + "healthMonitor": "Gesundheitsmonitor", + "reportIssue": "Problem melden", + "activeError": "{active} aktiv · {errors} Fehler", + "oauthLabel": "OAuth", + "apiKeyLabel": "API-Schlüssel", + "requestsShort": "{count} Anfr.", + "providerModelsTitle": "{provider} – Modelle", + "copiedModel": "Kopiert: {model}", + "aliasLabel": "Alias" + }, + "analytics": { + "title": "Analytik", + "overviewDescription": "Überwachen Sie Ihre API-Nutzungsmuster, Token-Verbrauch, Kosten und Aktivitätstrends bei allen Anbietern und Modellen.", + "evalsDescription": "Führen Sie Evaluierungssuiten aus, um Ihre LLM-Endpunkte zu testen und zu validieren. Vergleichen Sie die Modellqualität, erkennen Sie Regressionen und messen Sie die Latenz.", + "overview": "Übersicht", + "evals": "Bewertungen" + }, + "apiManager": { + "title": "API-Schlüssel", + "createKey": "API-Schlüssel erstellen", + "key": "Schlüssel", + "revokeKey": "Schlüssel widerrufen", + "revokeConfirm": "Sind Sie sicher, dass Sie diesen API-Schlüssel widerrufen möchten?", + "noKeys": "Noch keine API-Schlüssel", + "noKeysDesc": "Erstellen Sie Ihren ersten API-Schlüssel, um Anfragen an Ihren Endpunkt zu authentifizieren", + "keyLabel": "Schlüsseletikett", + "permissions": "Berechtigungen", + "expiresAt": "Läuft ab", + "never": "Niemals", + "revoke": "Widerrufen", + "showKey": "Schlüssel anzeigen", + "hideKey": "Schlüssel verstecken", + "copyKey": "API-Schlüssel kopieren", + "allModels": "Alle Modelle", + "selectedModels": "Ausgewählte Modelle", + "readOnly": "Nur lesen", + "fullAccess": "Voller Zugriff", + "keyManagement": "API-Schlüsselverwaltung", + "keyManagementDesc": "Erstellen und verwalten Sie API-Schlüssel zur Authentifizierung von Anfragen an Ihren Endpunkt", + "totalKeys": "Gesamtschlüssel", + "restricted": "Eingeschränkt", + "totalRequests": "Gesamtzahl der Anfragen", + "modelsAvailable": "Verfügbare Modelle", + "registeredKeys": "Registrierte Schlüssel", + "keysRegistered": "{count} Schlüssel registriert", + "keyRegistered": "{count} Schlüssel registriert", + "keysSecurityNote": "Jeder Schlüssel isoliert die Nutzungsverfolgung und kann unabhängig widerrufen werden. Aus Sicherheitsgründen werden Schlüssel nach der Erstellung maskiert.", + "createFirstKey": "Erstellen Sie Ihren ersten Schlüssel", + "name": "Name", + "usage": "Nutzung", + "created": "Erstellt", + "actions": "Aktionen", + "reqs": "Anforderungen", + "neverUsed": "Nie benutzt", + "deleteConfirm": "Diesen API-Schlüssel löschen?", + "usageTips": "Nutzungstipps", + "tipAuth": "Verwenden Sie API-Schlüssel im Authorization-Header als Bearer YOUR_KEY", + "tipSecure": "Schlüssel werden bei der Erstellung nur einmal angezeigt – bewahren Sie sie sicher auf", + "tipSeparate": "Erstellen Sie separate Schlüssel für verschiedene Clients oder Umgebungen", + "tipRestrict": "Beschränken Sie die Schlüssel auf bestimmte Modelle, um die Sicherheit und Kostenkontrolle zu verbessern", + "keyName": "Schlüsselname", + "keyNamePlaceholder": "z. B. Produktionsschlüssel, Entwicklungsschlüssel", + "keyNameDesc": "Wählen Sie einen aussagekräftigen Namen, um den Zweck dieses Schlüssels zu identifizieren", + "keyCreated": "API-Schlüssel erstellt", + "keyCreatedSuccess": "Schlüssel erfolgreich erstellt!", + "keyCreatedNote": "Kopieren und speichern Sie diesen Schlüssel jetzt – er wird nicht mehr angezeigt.", + "done": "Fertig", + "savePermissions": "Berechtigungen speichern", + "allowAll": "Alle zulassen", + "restrict": "Einschränken", + "allowAllInfo": "Mit diesem Schlüssel kann auf alle verfügbaren Modelle zugegriffen werden.", + "restrictInfo": "Dieser Schlüssel kann auf {selected} von {total} Modellen zugreifen.", + "selected": "{count} ausgewählt", + "all": "Alle", + "clear": "Klar", + "searchModels": "Modelle nach Name oder Anbieter suchen...", + "noModelsFound": "Keine Modelle gefunden", + "keyNameRequired": "Schlüsselname ist erforderlich", + "keyNameTooLong": "Der Schlüsselname darf höchstens {max} Zeichen lang sein", + "keyNameInvalid": "Der Schlüsselname darf nur Buchstaben, Zahlen, Leerzeichen, Bindestriche und Unterstriche enthalten", + "invalidKeyName": "Ungültiger Schlüsselname", + "failedCreateKey": "Schlüssel konnte nicht erstellt werden", + "failedCreateKeyRetry": "Schlüssel konnte nicht erstellt werden. Bitte versuchen Sie es erneut.", + "invalidKeyId": "Ungültige Schlüssel-ID", + "failedDeleteKey": "Schlüssel konnte nicht gelöscht werden", + "failedDeleteKeyRetry": "Schlüssel konnte nicht gelöscht werden. Bitte versuchen Sie es erneut.", + "invalidModelsSelection": "Ungültige Modellauswahl", + "cannotSelectMoreThanModels": "Es können nicht mehr als {max} Modelle ausgewählt werden", + "failedUpdatePermissions": "Die Berechtigungen konnten nicht aktualisiert werden", + "failedUpdatePermissionsRetry": "Die Berechtigungen konnten nicht aktualisiert werden. Bitte versuchen Sie es erneut.", + "unknownProvider": "unbekannt", + "copyMaskedKey": "Maskierten Schlüssel kopieren", + "modelsCount": "{count, plural, one {# model} other {# models}}", + "lastUsedOn": "Zuletzt: {date}", + "editPermissions": "Berechtigungen bearbeiten", + "deleteKey": "Schlüssel löschen", + "model": "{count} Modell", + "models": "{count} Modelle", + "permissionsTitle": "Berechtigungen: {name}", + "allowAllDesc": "Mit diesem Schlüssel kann auf alle verfügbaren Modelle zugegriffen werden.", + "restrictDesc": "Dieser Schlüssel kann auf {selectedCount} von {totalModels} Modellen zugreifen.", + "selectedCount": "{count} ausgewählt" + }, + "auditLog": { + "title": "Audit-Protokoll", + "searchPlaceholder": "Suchaktionen...", + "action": "Aktion", + "actor": "Schauspieler", + "target": "Ziel", + "ipAddress": "IP-Adresse", + "timestamp": "Zeitstempel", + "noEntries": "Keine Audit-Einträge gefunden", + "filterByAction": "Nach Aktion filtern...", + "filterByActor": "Nach Schauspieler filtern...", + "filterEntriesAria": "Audit-Log-Einträge filtern", + "filterByActionTypeAria": "Filtern Sie nach Aktionstyp", + "filterByActorAria": "Nach Schauspieler filtern", + "refreshAuditLogAria": "Audit-Protokoll aktualisieren", + "tableAria": "Audit-Log-Einträge", + "failedFetchAuditLog": "Das Audit-Protokoll konnte nicht abgerufen werden", + "notAvailable": "—", + "description": "Verwaltungsmaßnahmen und Sicherheitsereignisse", + "showing": "Zeigt {count} Einträge (Offset {offset})", + "previous": "Zurück" + }, + "cliTools": { + "title": "CLI-Tools", + "noActiveProviders": "Keine aktiven Anbieter", + "noActiveProvidersDesc": "Bitte fügen Sie zuerst Anbieter hinzu und verbinden Sie sie, um CLI-Tools zu konfigurieren.", + "mapModels": "Kartenmodelle", + "testConnection": "Testverbindung", + "connectionStatus": "Verbindungsstatus", + "configureEndpoint": "Endpunkt konfigurieren", + "instructions": "Anweisungen", + "modelMapping": "Modellzuordnung", + "baseUrl": "Basis-URL", + "apiKey": "API-Schlüssel", + "configured": "Konfiguriert", + "notConfigured": "Nicht konfiguriert", + "notInstalled": "Nicht installiert", + "custom": "Benutzerdefiniert", + "unknown": "Unbekannt", + "lastSavedAt": "Zuletzt gespeichert: {date}", + "never": "Niemals", + "justNow": "gerade jetzt", + "minutesAgoShort": "Vor {count}m", + "hoursAgoShort": "Vor {count}h", + "daysAgoShort": "Vor {count}d", + "monthsAgoShort": "Vor {count}mo", + "yearsAgoShort": "Vor {count}y", + "runtimeCheckFailed": "Laufzeitprüfung fehlgeschlagen", + "yourApiKeyPlaceholder": "Ihr-API-Schlüssel", + "modelPlaceholder": "Anbieter/Modell-ID", + "configurationSaved": "Konfiguration erfolgreich gespeichert.", + "failedToSave": "Die Konfiguration konnte nicht gespeichert werden.", + "noApiKeysCreateOne": "Keine API-Schlüssel – Erstellen Sie einen auf der Seite „Schlüssel“.", + "defaultOmnirouteKey": "sk_omniroute (Standard)", + "selectModel": "Wählen Sie Modell aus", + "selectModelForAlias": "Modell für {alias} auswählen", + "selectModelForTool": "Modell für {tool} auswählen", + "select": "Auswählen", + "clear": "Klar", + "comingSoon": "Kommt bald", + "checkingRuntime": "Laufzeitstatus wird geprüft...", + "guideOnlyIntegration": "Nur-Guide-Integration (keine lokale Laufzeit erforderlich)", + "cliRuntimeDetected": "CLI-Laufzeit erkannt und bereit", + "cliFoundNotRunnable": "CLI gefunden, aber nicht ausführbar{reason}", + "cliRuntimeNotDetected": "CLI-Laufzeit nicht erkannt", + "binary": "Binär", + "configPath": "Konfigurationspfad", + "configPathShort": "Konfig", + "failedCheckRuntimeStatus": "Der Laufzeitstatus konnte nicht überprüft werden.", + "copy": "Kopieren", + "copied": "Kopiert", + "copyConfig": "Konfiguration kopieren", + "saveConfig": "Konfiguration speichern", + "selectionSaved": "Auswahl gespeichert", + "guide": "Leitfaden", + "detected": "Erkannt", + "notReady": "Nicht bereit", + "active": "Aktiv", + "inactive": "Inaktiv", + "startMitm": "Starten Sie MITM", + "stopMitm": "Stoppen Sie MITM", + "mitmStarted": "MITM erfolgreich gestartet!", + "mitmStopped": "MITM wurde erfolgreich gestoppt!", + "failedStart": "MITM konnte nicht gestartet werden", + "failedStop": "MITM konnte nicht gestoppt werden", + "saveMappings": "Zuordnungen speichern", + "mappingsSaved": "Zuordnungen gespeichert!", + "failedSaveMappings": "Zuordnungen konnten nicht gespeichert werden", + "howItWorks": "So funktioniert es:", + "antigravityHowWorksDesc": "Antigravity sendet Anfragen an den Endpunkt von Google. MITM fängt sie ab und leitet sie an OmniRoute weiter.", + "antigravityStep1": "1. Starten Sie MITM, um Anforderungen über OmniRoute weiterzuleiten.", + "antigravityStep2Prefix": "2. Hinzufügen", + "antigravityStep2Suffix": "zu Ihrer Hosts-Datei als 127.0.0.1 hinzufügen.", + "antigravityStep3": "3. Öffnen Sie Antigravity und Anfragen werden weitergeleitet.", + "sudoPasswordRequiredTitle": "Sudo-Passwort erforderlich", + "sudoPasswordHint": "Zum Ändern der Hosts-Datei und der System-Proxy-Einstellungen ist ein Administratorkennwort erforderlich.", + "enterSudoPassword": "Geben Sie das Sudo-Passwort ein", + "sudoPasswordRequiredError": "Sudo-Passwort ist erforderlich.", + "cancel": "Abbrechen", + "confirm": "Bestätigen", + "settingsApplied": "Einstellungen erfolgreich übernommen!", + "failedApplySettings": "Die Einstellungen konnten nicht angewendet werden", + "settingsReset": "Einstellungen erfolgreich zurückgesetzt!", + "failedResetSettings": "Einstellungen konnten nicht zurückgesetzt werden", + "backupRestored": "Backup wiederhergestellt!", + "failedRestore": "Wiederherstellung fehlgeschlagen", + "checkingCli": "{tool} CLI wird überprüft...", + "cliNotRunnable": "{tool} CLI installiert, aber nicht ausführbar", + "cliNotInstalled": "{tool} CLI nicht installiert", + "cliNotDetected": "{tool} CLI nicht erkannt", + "cliDetectedReady": "{tool} CLI erkannt und bereit", + "cliFoundFailedHealthcheck": "{tool} CLI wurde gefunden, aber die Laufzeitprüfung ist fehlgeschlagen{reason}.", + "installCliPrompt": "Bitte installieren Sie {tool} CLI, um diese Funktion zu nutzen.", + "installCodexPrompt": "Bitte installieren Sie Codex CLI, um die Funktion zur automatischen Anwendung zu nutzen.", + "hide": "Verstecken", + "howToInstall": "Anleitung zur Installation", + "installationGuide": "Installationsanleitung", + "platforms": "macOS / Linux / Windows:", + "afterInstallationRun": "Nach der Installation ausführen", + "toVerify": "zu verifizieren.", + "current": "Aktuell", + "baseUrlPlaceholder": "https://.../v1", + "resetToDefault": "Auf Standard zurücksetzen", + "providerModelPlaceholder": "Anbieter/Modell-ID", + "apply": "Bewerben", + "reset": "Zurücksetzen", + "manualConfig": "Manuelle Konfiguration", + "backups": "Backups", + "configBackups": "Backups konfigurieren", + "noBackupsYet": "Noch keine Backups. Vor jedem Anwenden oder Zurücksetzen werden automatisch Sicherungen erstellt.", + "restore": "Wiederherstellen", + "backupRestoredReloading": "Backup wiederhergestellt! Status wird neu geladen...", + "failedRestoreBackup": "Sicherung konnte nicht wiederhergestellt werden", + "applied": "Beworben!", + "failed": "Fehlgeschlagen", + "resetDone": "Zurücksetzen!", + "omnirouteConfiguredOpenAiCompatible": "OmniRoute ist als OpenAI-kompatibler Anbieter konfiguriert", + "provider": "Anbieter", + "model": "Modell", + "providers": "Anbieter", + "auth": "Auth", + "noApiKeysAvailable": "Keine API-Schlüssel verfügbar", + "usingDefaultOmniroute": "Standardmäßig wird verwendet: sk_omniroute", + "updateConfig": "Konfiguration aktualisieren", + "applyConfig": "Konfiguration anwenden", + "noBackupsAvailable": "Keine Backups verfügbar.", + "profileSaved": "Profil „{name}“ gespeichert!", + "failedSaveProfile": "Profil konnte nicht gespeichert werden", + "profileActivated": "Profil aktiviert!", + "failedActivateProfile": "Profil konnte nicht aktiviert werden", + "profiles": "Profile", + "savedProfiles": "Gespeicherte Profile", + "noProfilesYet": "Noch keine Profile gespeichert. Speichern Sie die aktuelle Konfiguration unten als Profil.", + "activate": "Aktivieren", + "deleteProfile": "Profil löschen", + "profileNamePlaceholder": "Profilname (z. B. Persönliches Konto)", + "saveCurrent": "Aktuelles speichern", + "codexAuthNotePrefix": "Codex verwendet", + "codexAuthNoteMiddle": "mit", + "codexAuthNoteSuffix": "Klicken Sie auf „Übernehmen“, um die automatische Konfiguration durchzuführen.", + "claudeManualConfiguration": "Claude CLI – Manuelle Konfiguration", + "codexManualConfiguration": "Codex CLI – Manuelle Konfiguration", + "droidManualConfiguration": "Factory Droid – Manuelle Konfiguration", + "openClawManualConfiguration": "Open Claw – Manuelle Konfiguration", + "clineManualConfiguration": "Manuelle Cline-Konfiguration", + "kiloManualConfiguration": "Manuelle Konfiguration des Kilo-Codes", + "toolDescriptions": { + "antigravity": "Google Antigravity IDE mit MITM", + "claude": "Anthropic Claude Code CLI", + "codex": "OpenAI Codex-CLI", + "droid": "Fabrik-Droiden-KI-Assistent", + "openclaw": "Öffnen Sie den Klauen-KI-Assistenten", + "cline": "Cline AI Coding Assistant CLI", + "kilo": "Kilo Code AI Assistant CLI", + "cursor": "Cursor-KI-Code-Editor", + "continue": "Weiter AI Assistant" + }, + "guides": { + "cursor": { + "notes": { + "0": "Zur Nutzung dieser Funktion ist ein Cursor Pro-Konto erforderlich.", + "1": "Cursor leitet Anfragen über seinen eigenen Server weiter, daher wird ein lokaler Endpunkt nicht unterstützt. Bitte aktivieren Sie Cloud Endpoint in den Einstellungen." + }, + "steps": { + "1": { + "title": "Öffnen Sie Einstellungen", + "desc": "Gehen Sie zu Einstellungen -> Modelle" + }, + "2": { + "title": "Aktivieren Sie die OpenAI-API", + "desc": "Aktivieren Sie die Option „OpenAI-API-Schlüssel“." + }, + "3": { + "title": "Basis-URL" + }, + "4": { + "title": "API-Schlüssel" + }, + "5": { + "title": "Benutzerdefiniertes Modell hinzufügen", + "desc": "Klicken Sie auf „Alle Modelle anzeigen“ -> „Benutzerdefiniertes Modell hinzufügen“" + }, + "6": { + "title": "Wählen Sie Modell aus" + } + } + }, + "continue": { + "steps": { + "1": { + "title": "Öffnen Sie die Konfiguration", + "desc": "Öffnen Sie die Konfigurationsdatei „Fortfahren“." + }, + "2": { + "title": "API-Schlüssel" + }, + "3": { + "title": "Wählen Sie Modell aus" + }, + "4": { + "title": "Modellkonfiguration hinzufügen", + "desc": "Fügen Sie Ihrem Modellarray die folgende Konfiguration hinzu:" + } + } + } + } + }, + "combos": { + "title": "Kombinationen", + "description": "Erstellen Sie Modellkombinationen mit gewichtetem Routing und Fallback-Unterstützung", + "createCombo": "Combo erstellen", + "editCombo": "Combo bearbeiten", + "deleteCombo": "Combo löschen", + "noModels": "Keine Modelle", + "noModelsYet": "Noch keine Modelle hinzugefügt", + "addModel": "Modell hinzufügen", + "addModelToCombo": "Modell zur Combo hinzufügen", + "routingStrategy": "Routing-Strategie", + "maxRetries": "Max. Wiederholungsversuche", + "timeout": "Timeout (ms)", + "healthcheck": "Gesundheitscheck", + "priority": "Priorität", + "fallback": "Rückfall", + "roundRobin": "Round Robin", + "random": "Zufällig", + "leastLatency": "Geringste Latenz", + "comboName": "Kombinationsname", + "comboNamePlaceholder": "meine-combo", + "deleteConfirm": "Diese Combo löschen?", + "noCombosYet": "Noch keine Combos", + "comboCreated": "Combo erfolgreich erstellt", + "comboUpdated": "Combo wurde erfolgreich aktualisiert", + "comboDeleted": "Combo gelöscht", + "failedCreate": "Kombination konnte nicht erstellt werden", + "failedUpdate": "Die Kombination konnte nicht aktualisiert werden", + "errorCreating": "Fehler beim Erstellen der Combo", + "errorUpdating": "Fehler beim Aktualisieren der Combo", + "errorDeleting": "Fehler beim Löschen der Combo", + "testFailed": "Testanforderung fehlgeschlagen", + "failedToggle": "Die Kombination konnte nicht umgeschaltet werden", + "testResults": "Testergebnisse – {name}", + "resolvedBy": "Gelöst von:", + "more": "+{count} mehr", + "reqs": "Anforderungen", + "success": "Erfolg", + "proxyConfigured": "Proxy konfiguriert", + "copyComboName": "Kombinationsnamen kopieren", + "enableCombo": "Kombination aktivieren", + "disableCombo": "Combo deaktivieren", + "testCombo": "Testkombination", + "duplicate": "Duplizieren", + "proxyConfig": "Proxy-Konfiguration", + "nameRequired": "Name ist erforderlich", + "nameInvalid": "Nur Buchstaben, Zahlen, -, _, / und . erlaubt", + "nameHint": "Buchstaben, Zahlen, -, _, / und . erlaubt", + "priorityDesc": "Sequentielles Fallback: Versucht zuerst Modell 1, dann 2 usw.", + "weightedDesc": "Verteilt den Datenverkehr nach Gewichtsprozentsatz mit Fallback", + "roundRobinDesc": "Zirkuläre Verteilung: Jede Anfrage wird abwechselnd an das nächste Modell weitergeleitet", + "randomDesc": "Einheitliche Zufallsauswahl, dann Rückgriff auf verbleibende Modelle", + "leastUsedDesc": "Wählt das Modell mit den wenigsten Anfragen aus und gleicht die Last über die Zeit aus", + "costOptimizedDesc": "Leitet basierend auf dem Preis zuerst zum günstigsten Modell weiter", + "models": "Modelle", + "autoBalance": "Automatischer Ausgleich", + "advancedSettings": "Erweiterte Einstellungen", + "retryDelay": "Wiederholungsverzögerung (ms)", + "concurrencyPerModel": "Parallelität / Modell", + "queueTimeout": "Warteschlangen-Timeout (ms)", + "advancedHint": "Lassen Sie das Feld leer, um globale Standardeinstellungen zu verwenden. Diese überschreiben die Einstellungen pro Anbieter.", + "moveUp": "Bewegen Sie sich nach oben", + "moveDown": "Bewegen Sie sich nach unten", + "removeModel": "Entfernen", + "saving": "Sparen...", + "weighted": "Gewichtet", + "leastUsed": "Am wenigsten genutzt", + "costOpt": "Kosten-Opt" + }, + "costs": { + "title": "Kosten", + "budget": "Budget", + "totalCost": "Gesamtkosten", + "breakdown": "Kostenaufschlüsselung", + "noData": "Keine Kostendaten", + "byModel": "Nach Modell", + "byProvider": "Nach Anbieter" + }, + "endpoint": { + "title": "API-Endpunkt", + "available": "Verfügbare Endpunkte", + "cloudProxy": "Cloud-Proxy", + "disableConfirm": "Sind Sie sicher, dass Sie den Cloud-Proxy deaktivieren möchten?", + "baseUrl": "Basis-URL", + "apiKeyLabel": "API-Schlüssel", + "registeredKeys": "Registrierte Schlüssel", + "chatCompletions": "Chat-Abschlüsse", + "responses": "Antworten", + "listModels": "Modelle auflisten", + "usingCloudProxy": "Verwenden von Cloud Proxy", + "usingLocalServer": "Verwenden eines lokalen Servers", + "machineId": "Maschinen-ID: {id}...", + "disableCloud": "Cloud deaktivieren", + "enableCloud": "Cloud aktivieren", + "modelsAcrossEndpoints": "{models} Modelle über {endpoints} Endpunkte hinweg", + "chatDesc": "Streaming- und Nicht-Streaming-Chat mit allen Anbietern", + "embeddings": "Einbettungen", + "embeddingsDesc": "Texteinbettungen für Such- und RAG-Pipelines", + "imageGeneration": "Bilderzeugung", + "imageDesc": "Generieren Sie Bilder aus Textaufforderungen", + "rerank": "Neu einordnen", + "rerankDesc": "Ordnen Sie Dokumente nach Relevanz für eine Abfrage neu", + "audioTranscription": "Audio-Transkription", + "audioTranscriptionDesc": "Audiodateien in Text umwandeln (Flüstern)", + "textToSpeech": "Text-to-Speech", + "textToSpeechDesc": "Wandeln Sie Text in natürlich klingende Sprache um", + "moderations": "Moderationen", + "moderationsDesc": "Inhaltsmoderation und Sicherheitsklassifizierung", + "enableCloudTitle": "Aktivieren Sie Cloud Proxy", + "whatYouGet": "Was Sie bekommen werden", + "cloudBenefitAccess": "Greifen Sie von überall auf der Welt auf Ihre API zu", + "cloudBenefitShare": "Teilen Sie den Endpunkt ganz einfach mit Ihrem Team", + "cloudBenefitPorts": "Es ist nicht erforderlich, Ports zu öffnen oder eine Firewall zu konfigurieren", + "cloudBenefitEdge": "Schnelles globales Edge-Netzwerk", + "cloudSessionNote": "Cloud speichert Ihre Authentifizierungssitzung einen Tag lang. Bei Nichtverwendung wird es automatisch gelöscht.", + "cloudUnstableNote": "Cloud ist derzeit mit Claude Code OAuth in einigen Fällen instabil.", + "cloudConnected": "Cloud-Proxy verbunden!", + "connectingToCloud": "Mit der Cloud verbinden...", + "verifyingConnection": "Verbindung wird überprüft...", + "connecting": "Verbinden...", + "verifying": "Überprüfung...", + "connected": "Verbunden!", + "disableCloudTitle": "Deaktivieren Sie den Cloud-Proxy", + "disableWarning": "Alle Authentifizierungssitzungen werden aus der Cloud gelöscht.", + "syncingData": "Aktuelle Daten werden synchronisiert...", + "disablingCloud": "Cloud wird deaktiviert...", + "syncing": "Synchronisierung...", + "disabling": "Deaktivieren...", + "cloudConnectedVerified": "Cloud-Proxy verbunden und verifiziert!", + "connectedVerificationPending": "Verbunden – Verifizierung steht aus", + "connectedVerificationPendingWithError": "Verbunden – Überprüfung ausstehend: {error}", + "cloudDisabledSuccess": "Cloud erfolgreich deaktiviert", + "syncedSuccess": "Erfolgreich synchronisiert", + "failedDisable": "Die Cloud konnte nicht deaktiviert werden", + "failedEnable": "Cloud konnte nicht aktiviert werden", + "cloudRequestTimeout": "Zeitüberschreitung bei der Cloud-Anfrage", + "cloudRequestFailed": "Die Cloud-Anfrage ist fehlgeschlagen", + "cloudWorkerUnreachable": "Der Cloud-Worker konnte nicht erreicht werden. Stellen Sie sicher, dass der Cloud-Dienst ausgeführt wird (npm run dev in /cloud).", + "connectionFailed": "Verbindung fehlgeschlagen", + "syncFailed": "Cloud-Daten konnten nicht synchronisiert werden", + "providerModelsTitle": "{provider} – Modelle", + "noModelsForProvider": "Für diesen Anbieter sind keine Modelle verfügbar.", + "chat": "Chatten", + "embedding": "Einbetten", + "image": "Bild", + "custom": "Brauch", + "modelsCount": "{count, plural, one {# model} other {# models}}" + }, + "health": { + "title": "Systemgesundheit", + "description": "Echtzeitüberwachung Ihrer OmniRoute-Instanz", + "healthy": "Gesund", + "degraded": "Degradiert", + "down": "Runter", + "uptime": "Betriebszeit", + "memory": "Erinnerung", + "memoryRss": "Speicher (RSS)", + "heap": "Haufen", + "cpu": "CPU", + "database": "Datenbank", + "version": "Version", + "lastCheck": "Letzter Check", + "providerHealth": "Gesundheit des Anbieters", + "systemMetrics": "Systemmetriken", + "tokenHealth": "Token-Gesundheit", + "refreshAll": "Alle aktualisieren", + "checkNow": "Jetzt prüfen", + "loadingHealth": "Gesundheitsdaten werden geladen...", + "failedToLoad": "Gesundheitsdaten konnten nicht geladen werden: {error}", + "retry": "Versuchen Sie es noch einmal", + "allOperational": "Alle Systeme betriebsbereit", + "issuesDetected": "Systemprobleme erkannt", + "updatedAt": "Aktualisiert {time}", + "latency": "Latenz", + "latencyP50": "S. 50", + "latencyP95": "S. 95", + "latencyP99": "S. 99", + "millisecondsShort": "{value}ms", + "notAvailable": "—", + "totalRequests": "Gesamtzahl der Anfragen", + "noDataYet": "Noch keine Daten", + "promptCache": "Prompt-Cache", + "entries": "Einträge", + "hitRate": "Trefferquote", + "hitsMisses": "Treffer/Fehlschläge", + "signatureCache": "Signatur-Cache", + "signatureDefaults": "Standardeinstellungen", + "signatureTool": "Werkzeug", + "signatureFamily": "Familie", + "signatureSession": "Sitzung", + "recovering": "Genesung", + "noCBData": "Keine Leistungsschalterdaten verfügbar. Stellen Sie zunächst einige Anfragen.", + "providerHealthStatusAria": "Gesundheitsstatus des Anbieters", + "issuesLabel": "Erkannte Probleme", + "operational": "Betriebsbereit", + "providers": "Anbieter", + "healthyCount": "{count} gesund", + "nodeVersion": "Knoten {version}", + "failures": "{count} Fehler", + "failuresPlural": "{count} Fehler", + "lastFailure": "Zuletzt", + "rateLimitStatus": "Rate-Limit-Status", + "activeLimiters": "{count} aktiver Limiter", + "activeLimitersPlural": "{count} aktive Limiter", + "queued": "In der Warteschlange", + "queuedCount": "{count} in der Warteschlange", + "running": "laufen", + "runningCount": "{count} läuft", + "ok": "Okay", + "activeLockouts": "Aktive Sperren", + "resetConfirm": "Alle Leistungsschalter in den fehlerfreien Zustand zurücksetzen? Dadurch werden alle Fehlerzählungen gelöscht und alle Anbieter werden wieder in den Betriebszustand versetzt.", + "resetAllTitle": "Setzen Sie alle Leistungsschalter in den fehlerfreien Zustand zurück", + "resetting": "Zurücksetzen...", + "resetAll": "Alles zurücksetzen", + "until": "Bis {time}" + }, + "limits": { + "title": "Limits und Quoten", + "rateLimit": "Ratenbegrenzung", + "remaining": "Übrig", + "requestsPerMinute": "Anfragen/Min", + "tokensPerMinute": "Token/Min", + "dailyLimit": "Tageslimit" + }, + "logs": { + "title": "Protokolle", + "requestLogs": "Fordern Sie Protokolle an", + "proxyLogs": "Proxy-Protokolle", + "auditLog": "Audit-Protokoll", + "console": "Konsole", + "auditLogDesc": "Verwaltungsmaßnahmen und Sicherheitsereignisse", + "loading": "Laden...", + "refresh": "Aktualisieren", + "filterByAction": "Nach Aktion filtern...", + "filterByActor": "Nach Schauspieler filtern...", + "filterEntriesAria": "Audit-Log-Einträge filtern", + "filterByActionTypeAria": "Filtern Sie nach Aktionstyp", + "filterByActorAria": "Nach Schauspieler filtern", + "refreshAuditLogAria": "Audit-Protokoll aktualisieren", + "tableAria": "Audit-Log-Einträge", + "failedFetchAuditLog": "Das Audit-Protokoll konnte nicht abgerufen werden", + "showing": "Zeigt {count} Einträge (Offset {offset})", + "search": "Suchen", + "timestamp": "Zeitstempel", + "action": "Aktion", + "actor": "Schauspieler", + "target": "Ziel", + "details": "Einzelheiten", + "ipAddress": "IP-Adresse", + "notAvailable": "—", + "noEntries": "Es wurden keine Audit-Log-Einträge gefunden", + "previous": "Zurück", + "next": "Als nächstes" + }, + "onboarding": { + "welcome": "Willkommen", + "security": "Sicherheit", + "test": "Testen", + "ready": "Bereit!", + "setPassword": "Passwort festlegen", + "addProvider": "Fügen Sie Ihren ersten Anbieter hinzu", + "getStarted": "Legen Sie los", + "skip": "Überspringen", + "skipWizard": "Den Assistenten vollständig überspringen", + "skipPassword": "Passwort-Einrichtung überspringen", + "skipAndContinue": "Überspringen und fortfahren", + "passwordLabel": "Passwort", + "confirmPassword": "Passwort bestätigen", + "enterPassword": "Passwort eingeben", + "confirmPasswordPlaceholder": "Passwort bestätigen", + "passwordsMismatch": "Passwörter stimmen nicht überein", + "setupComplete": "Einrichtung abgeschlossen!", + "goToDashboard": "Gehen Sie zu Dashboard →", + "welcomeDesc": "OmniRoute ist Ihr lokaler AI-API-Proxy. Es leitet Anfragen mit Lastausgleich, Failover und Nutzungsverfolgung an mehrere KI-Anbieter weiter.", + "multiProvider": "Multi-Provider", + "usageTracking": "Nutzungsverfolgung", + "apiKeyMgmt": "API-Schlüsselverwaltung", + "securityDesc": "Legen Sie ein Passwort fest, um Ihr Dashboard zu schützen, oder überspringen Sie es zunächst.", + "providerDesc": "Verbinden Sie Ihren ersten KI-Anbieter. Sie können später weitere hinzufügen.", + "apiKeyRequired": "API-Schlüssel (erforderlich)", + "customUrlOptional": "Benutzerdefinierte URL (optional)", + "testDesc": "Lassen Sie uns überprüfen, ob Ihre Provider-Verbindung funktioniert.", + "runTest": "Führen Sie einen Verbindungstest durch", + "testingConnection": "Verbindung wird getestet...", + "connectionSuccessful": "Verbindung erfolgreich! Ihr Anbieter ist bereit.", + "noProviderFound": "Kein Anbieter gefunden. Sie können später eines über das Dashboard hinzufügen.", + "testFailed": "Der Test ist fehlgeschlagen, aber Sie können dies später konfigurieren.", + "couldNotTest": "Konnte momentan nicht testen. Sie können den Test über das Dashboard durchführen.", + "doneDesc": "Sie sind bereit! Ihre OmniRoute-Instanz ist konfiguriert und bereit, KI-Anfragen weiterzuleiten.", + "yourEndpoint": "Ihr Endpunkt:", + "continue": "Weiter", + "retry": "Versuchen Sie es noch einmal", + "failedSetPassword": "Das Passwort konnte nicht festgelegt werden. Versuchen Sie es erneut.", + "failedAddProvider": "Anbieter konnte nicht hinzugefügt werden. Versuchen Sie es erneut.", + "connectionError": "Verbindungsfehler. Bitte versuchen Sie es erneut.", + "provider": "Anbieter" + }, + "providers": { + "title": "Anbieter", + "addProvider": "Anbieter hinzufügen", + "editProvider": "Anbieter bearbeiten", + "deleteProvider": "Anbieter löschen", + "noProviders": "Keine Anbieter konfiguriert", + "modelAvailability": "Modellverfügbarkeit", + "accounts": "Konten", + "newAccount": "Neues Konto", + "deleteConfirm": "Sind Sie sicher, dass Sie diesen Anbieter löschen möchten?", + "testing": "Testen...", + "testConnection": "Testverbindung", + "testSuccess": "Verbindung erfolgreich", + "testFailed": "Verbindung fehlgeschlagen", + "available": "Verfügbar", + "cooldown": "Abklingzeit", + "unavailable": "Nicht verfügbar", + "unknown": "Unbekannt", + "oauthLabel": "OAuth", + "compatibleLabel": "Kompatibel", + "chat": "Chatten", + "responses": "Antworten", + "messages": "Nachrichten", + "oauthProviders": "OAuth-Anbieter", + "freeProviders": "Kostenlose Anbieter", + "apiKeyProviders": "API-Schlüsselanbieter", + "compatibleProviders": "Mit API-Schlüsseln kompatible Anbieter", + "testAll": "Alle testen", + "testAllOAuth": "Testen Sie alle OAuth-Verbindungen", + "testAllFree": "Testen Sie alle kostenlosen Verbindungen", + "testAllApiKey": "Testen Sie alle API-Schlüsselverbindungen", + "testAllCompatible": "Testen Sie alle kompatiblen Verbindungen", + "connected": "{count} Verbunden", + "errorCount": "{count} Fehler ({code})", + "errorCountNoCode": "{count} Fehler", + "noConnections": "Keine Verbindungen", + "disabled": "Deaktiviert", + "enableProvider": "Anbieter aktivieren", + "disableProvider": "Anbieter deaktivieren", + "testResults": "Testergebnisse", + "noCompatibleYet": "Es wurden noch keine kompatiblen Anbieter hinzugefügt", + "compatibleHint": "Verwenden Sie die Schaltflächen oben, um OpenAI- oder Anthropic-kompatible Endpunkte hinzuzufügen", + "addOpenAICompatible": "OpenAI-kompatibel hinzufügen", + "addAnthropicCompatible": "Anthropic-kompatibel hinzufügen", + "addNewProvider": "Neuen Anbieter hinzufügen", + "backToProviders": "Zurück zu Anbietern", + "configureNewProvider": "Konfigurieren Sie einen neuen KI-Anbieter zur Verwendung mit Ihren Anwendungen.", + "providerLabel": "Anbieter", + "selectProvider": "Wählen Sie einen Anbieter aus", + "selectedProvider": "Ausgewählter Anbieter", + "authMethod": "Authentifizierungsmethode", + "apiKeyLabel": "API-Schlüssel", + "apiKeyRequired": "API-Schlüssel ist erforderlich", + "selectProviderRequired": "Bitte wählen Sie einen Anbieter aus", + "enterApiKey": "Geben Sie Ihren API-Schlüssel ein", + "apiKeySecure": "Ihr API-Schlüssel wird verschlüsselt und sicher gespeichert.", + "oauth2Connect": "Verbinden Sie sich mit OAuth2", + "oauth2Label": "OAuth2", + "oauth2Desc": "Verbinden Sie Ihr Konto mithilfe der OAuth2-Authentifizierung.", + "displayName": "Anzeigename", + "displayNamePlaceholder": "z. B. Produktions-API, Entwicklungsumgebung", + "displayNameHint": "Optional. Ein benutzerfreundlicher Name zur Identifizierung dieser Konfiguration.", + "active": "Aktiv", + "activeDescription": "Aktivieren Sie diesen Anbieter für die Verwendung in Ihren Anwendungen", + "cancel": "Abbrechen", + "createProvider": "Anbieter erstellen", + "failedCreate": "Anbieter konnte nicht erstellt werden", + "errorOccurred": "Es ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.", + "modelStatus": "Modellstatus", + "allModelsOperational": "Alle Modelle betriebsbereit", + "modelsWithIssues": "{count} Modell(e) mit Problemen", + "allModelsNormal": "Alle Modelle reagieren normal.", + "cooldownCleared": "Abklingzeit für {model} gelöscht", + "failedClearCooldown": "Die Abklingzeit konnte nicht gelöscht werden", + "loadingAvailability": "Modellverfügbarkeit wird geladen...", + "clearCooldown": "Klar", + "clearing": "Löschen...", + "until": "Bis {time}", + "providerTestFailed": "Anbietertest fehlgeschlagen", + "modeTest": "{mode} Test", + "passedCount": "{count} bestanden", + "failedCount": "{count} fehlgeschlagen", + "testedCount": "{count} getestet", + "millisecondsAbbr": "{value}ms", + "okShort": "Okay", + "errorShort": "FEHLER", + "noActiveConnectionsInGroup": "Für diese Gruppe wurden keine aktiven Verbindungen gefunden.", + "allTestsPassed": "Alle {total}-Tests bestanden", + "testSummary": "{passed}/{total} bestanden, {failed} fehlgeschlagen", + "nameLabel": "Name", + "prefixLabel": "Präfix", + "baseUrlLabel": "Basis-URL", + "apiTypeLabel": "API-Typ", + "prefixHint": "Erforderlich. Eindeutiges Präfix für Modellnamen.", + "nameHint": "Erforderlich. Eine benutzerfreundliche Bezeichnung für diesen Knoten.", + "baseUrlHint": "Erforderlich. Basis-URL der Anbieter-API.", + "anthropicPrefixPlaceholder": "AC-Prod", + "openaiPrefixPlaceholder": "oc-prod", + "anthropicBaseUrlPlaceholder": "https://api.anthropic.com/v1", + "openaiBaseUrlPlaceholder": "https://api.openai.com/v1", + "validateConnection": "Verbindung validieren", + "validating": "Validierung...", + "connectionValid": "Verbindung ist gültig!", + "connectionFailed": "Verbindung fehlgeschlagen. Überprüfen Sie URL und Schlüssel.", + "testKeyLabel": "API-Schlüssel testen", + "testKeyPlaceholder": "sk-... (nur zur Validierung)", + "providerNotFound": "Anbieter nicht gefunden", + "deleteConnectionConfirm": "Diese Verbindung löschen?", + "failedSetAlias": "Alias konnte nicht festgelegt werden", + "failedSaveConnection": "Die Verbindung konnte nicht gespeichert werden", + "failedSaveConnectionRetry": "Die Verbindung konnte nicht gespeichert werden. Bitte versuchen Sie es erneut.", + "failedRetestConnection": "Die Verbindung konnte nicht erneut getestet werden", + "deleteCompatibleNodeConfirm": "Diesen {type} kompatiblen Knoten löschen?", + "anthropicCompatibleDetails": "Anthropic-kompatible Details", + "openaiCompatibleDetails": "Details zur OpenAI-Kompatibilität", + "messagesApi": "Nachrichten-API", + "responsesApi": "Antwort-API", + "chatCompletions": "Chat-Abschlüsse", + "importingModels": "Importieren...", + "importFromModels": "Import aus /models", + "addConnectionToImport": "Fügen Sie eine Verbindung hinzu, um den Import zu ermöglichen.", + "noModelsConfigured": "Keine Modelle konfiguriert", + "connectionCount": "{count} Verbindung(en)", + "fetchingModels": "Verfügbare Modelle werden abgerufen...", + "failedFetchModels": "Modelle konnten nicht abgerufen werden", + "noModelsFound": "Keine Modelle gefunden", + "importFailed": "Der Import ist fehlgeschlagen", + "noNewModelsAdded": "Es wurden keine neuen Modelle hinzugefügt.", + "adding": "Hinzufügen...", + "importingModelsTitle": "Modelle importieren", + "copyModel": "Modell kopieren", + "removeModel": "Modell entfernen", + "rateLimitProtected": "Geschützt", + "rateLimitUnprotected": "Ungeschützt", + "enableRateLimitProtection": "Klicken Sie hier, um den Ratenbegrenzungsschutz zu aktivieren", + "disableRateLimitProtection": "Klicken Sie hier, um den Ratenbegrenzungsschutz zu deaktivieren", + "productionKey": "Produktionsschlüssel", + "enterNewApiKey": "Geben Sie einen neuen API-Schlüssel ein", + "optional": "Optional", + "anthropicCompatibleName": "Anthropisch kompatibel", + "openaiCompatibleName": "OpenAI-kompatibel", + "failedImportModels": "Modelle konnten nicht importiert werden", + "noModelsReturnedFromEndpoint": "Vom /models-Endpunkt wurden keine Modelle zurückgegeben.", + "importingModelsProgress": "{current} von {total} Modellen werden importiert...", + "foundModelsStartingImport": "{count} Modelle gefunden. Import wird gestartet...", + "importingModelById": "{modelId} wird importiert...", + "importSuccessCount": "{count, plural, one {# model} other {# models}} erfolgreich importiert!", + "noNewModelsAddedExisting": "Es wurden keine neuen Modelle hinzugefügt (alle bereits vorhanden).", + "importDoneCount": "✓ Fertig! {count, plural, one {# model imported.} other {# models imported.}}", + "unexpectedErrorOccurred": "Es ist ein unerwarteter Fehler aufgetreten", + "connectionCountLabel": "{count, plural, one {# connection} other {# connections}}", + "messagesPath": "Nachrichten", + "responsesPath": "Antworten", + "chatCompletionsPath": "Chat/Abschlüsse", + "add": "Hinzufügen", + "edit": "Bearbeiten", + "delete": "Löschen", + "anthropic": "Anthropisch", + "openai": "OpenAI", + "singleConnectionPerCompatible": "Pro kompatiblem Knoten ist nur eine Verbindung zulässig. Fügen Sie einen weiteren Knoten hinzu, wenn Sie mehr Verbindungen benötigen.", + "connections": "Verbindungen", + "providerProxyTitleConfigured": "Anbieter-Proxy: {host}", + "configured": "konfiguriert", + "providerProxyConfigureHint": "Proxy für alle Verbindungen dieses Anbieters konfigurieren", + "providerProxy": "Anbieter-Proxy", + "noConnectionsYet": "Noch keine Verbindungen", + "addFirstConnectionHint": "Fügen Sie Ihre erste Verbindung hinzu, um loszulegen", + "addConnection": "Verbindung hinzufügen", + "availableModels": "Verfügbare Modelle", + "pageAutoRefresh": "Die Seite wird automatisch aktualisiert...", + "statusDisabled": "deaktiviert", + "statusConnected": "verbunden", + "statusRuntimeIssue": "Laufzeitproblem", + "statusAuthFailed": "Authentifizierung fehlgeschlagen", + "statusRateLimited": "Tarif begrenzt", + "statusNetworkIssue": "Netzwerkproblem", + "statusTestUnsupported": "Test nicht unterstützt", + "statusUnavailable": "nicht verfügbar", + "statusFailed": "gescheitert", + "statusError": "Fehler", + "oauthAccount": "OAuth-Konto", + "errorTypeRuntime": "Lokale Laufzeit", + "errorTypeUpstreamAuth": "Upstream-Authentifizierung", + "errorTypeMissingCredential": "Fehlender Ausweis", + "errorTypeRefreshFailed": "Aktualisierung fehlgeschlagen", + "errorTypeTokenExpired": "Token abgelaufen", + "errorTypeRateLimited": "Preis begrenzt", + "errorTypeUpstreamUnavailable": "Upstream nicht verfügbar", + "errorTypeNetworkError": "Netzwerkfehler", + "errorTypeTestUnsupported": "Test nicht unterstützt", + "errorTypeUpstreamError": "Upstream-Fehler", + "proxySourceGlobal": "Global", + "proxySourceProvider": "Anbieter", + "proxySourceKey": "Schlüssel", + "proxyConfiguredBySource": "Proxy ({source}): {host}", + "autoPriority": "Automatisch: {priority}", + "proxy": "Stellvertreter", + "retestAuthentication": "Authentifizierung erneut testen", + "retest": "Erneut testen", + "disableConnection": "Verbindung deaktivieren", + "enableConnection": "Verbindung aktivieren", + "reauthenticateConnection": "Authentifizieren Sie diese Verbindung erneut", + "proxyConfig": "Proxy-Konfiguration", + "aliasExistsAlert": "Alias „{alias}“ existiert bereits. Bitte verwenden Sie ein anderes Modell oder bearbeiten Sie den vorhandenen Alias.", + "openRouterAnyModelHint": "OpenRouter unterstützt jedes Modell. Fügen Sie Modelle hinzu und erstellen Sie Aliase für den schnellen Zugriff.", + "modelIdFromOpenRouter": "Modell-ID (von OpenRouter)", + "openRouterModelPlaceholder": "anthropisch/claude-3-opus", + "customModels": "Benutzerdefinierte Modelle", + "customModelsHint": "Fügen Sie Modell-IDs hinzu, die nicht in der Standardliste enthalten sind. Diese stehen für das Routing zur Verfügung.", + "modelId": "Modell-ID", + "customModelPlaceholder": "z.B. gpt-4,5-turbo", + "loading": "Laden...", + "removeCustomModel": "Benutzerdefiniertes Modell entfernen", + "noCustomModels": "Es wurden noch keine benutzerdefinierten Modelle hinzugefügt.", + "allSuggestedAliasesExist": "Alle vorgeschlagenen Aliase sind bereits vorhanden. Bitte wählen Sie ein anderes Modell oder entfernen Sie widersprüchliche Aliase.", + "failedSaveCustomModel": "Das benutzerdefinierte Modell konnte nicht gespeichert werden", + "modelAddedSuccess": "Modell {modelId} erfolgreich hinzugefügt", + "failedAddModelTryAgain": "Modell konnte nicht hinzugefügt werden. Bitte versuchen Sie es erneut.", + "failedSaveImportedModel": "Das importierte Modell konnte nicht in der benutzerdefinierten Datenbank gespeichert werden", + "failedImportModelsTryAgain": "Modelle konnten nicht importiert werden. Bitte versuchen Sie es erneut.", + "failedRemoveModelFromDatabase": "Das Modell konnte nicht aus der Datenbank entfernt werden", + "modelRemovedSuccess": "Modell erfolgreich entfernt", + "failedDeleteModelTryAgain": "Modell konnte nicht gelöscht werden. Bitte versuchen Sie es erneut.", + "compatibleModelsDescription": "Fügen Sie {type}-kompatible Modelle manuell hinzu oder importieren Sie sie vom Endpunkt /models.", + "anthropicCompatibleModelPlaceholder": "claude-3-opus-20240229", + "openaiCompatibleModelPlaceholder": "gpt-4o", + "apiKeyValidationFailed": "Die Validierung des API-Schlüssels ist fehlgeschlagen. Bitte überprüfen Sie Ihren Schlüssel und versuchen Sie es erneut.", + "addProviderApiKeyTitle": "Fügen Sie den API-Schlüssel {provider} hinzu", + "checking": "Überprüfen...", + "check": "Überprüfen", + "valid": "Gültig", + "invalid": "Ungültig", + "creating": "Erstellen...", + "validationChecksAnthropicCompatible": "Die Validierung prüft {provider} durch Überprüfung des API-Schlüssels.", + "validationChecksOpenAiCompatible": "Die Validierung prüft {provider} über /models auf Ihrer Basis-URL.", + "priorityLabel": "Priorität", + "saving": "Sparen...", + "save": "Speichern", + "editConnection": "Verbindung bearbeiten", + "accountName": "Kontoname", + "email": "E-Mail", + "healthCheckMinutes": "Gesundheitscheck (Min.)", + "healthCheckHint": "Proaktives Token-Aktualisierungsintervall. 0 = deaktiviert.", + "failedTestConnection": "Die Verbindung konnte nicht getestet werden", + "failed": "Fehlgeschlagen", + "leaveBlankKeepCurrentApiKey": "Lassen Sie das Feld leer, um den aktuellen API-Schlüssel beizubehalten.", + "editCompatibleTitle": "Bearbeiten Sie {type} kompatibel", + "compatibleBaseUrlHint": "Verwenden Sie die Basis-URL (die auf /v1 endet) für Ihre {type}-kompatible API.", + "apiKeyForCheck": "API-Schlüssel (zur Überprüfung)", + "compatibleProdPlaceholder": "{type} Kompatibel (Prod)" + }, + "settings": { + "title": "Einstellungen", + "general": "Allgemein", + "security": "Sicherheit", + "appearance": "Aussehen", + "routing": "Routenführung", + "cache": "Cache", + "resilience": "Belastbarkeit", + "systemPrompt": "Systemaufforderung", + "thinkingBudget": "Denkendes Budget", + "proxy": "Stellvertreter", + "pricing": "Preise", + "storage": "Lagerung", + "policies": "Richtlinien", + "ipFilter": "IP-Filter", + "comboDefaults": "Combo-Standardeinstellungen", + "fallbackChains": "Fallback-Ketten", + "changePassword": "Passwort ändern", + "enablePassword": "Passwort aktivieren", + "darkMode": "Dunkler Modus", + "lightMode": "Lichtmodus", + "systemTheme": "Systemthema", + "enableCache": "Cache aktivieren", + "cacheTTL": "Cache-TTL", + "maxCacheSize": "Maximale Cache-Größe", + "clearCache": "Cache leeren", + "cacheHits": "Cache-Treffer", + "cacheMisses": "Cache-Fehler", + "hitRate": "Trefferquote", + "cacheEntries": "Cache-Einträge", + "circuitBreaker": "Leistungsschalter", + "retryPolicy": "Wiederholungsrichtlinie", + "maxRetries": "Max. Wiederholungsversuche", + "retryDelay": "Wiederholungsverzögerung", + "timeoutMs": "Timeout (ms)", + "enableSystemPrompt": "Aktivieren Sie die Systemaufforderung", + "systemPromptText": "Systemaufforderungstext", + "enableThinking": "Denken aktivieren", + "maxThinkingTokens": "Max Thinking Tokens", + "enableProxy": "Proxy aktivieren", + "proxyUrl": "Proxy-URL", + "pricingRates": "Preisformat", + "currentPricing": "Aktuelle Preisübersicht", + "loadingPricing": "Preisdaten werden geladen...", + "noPricing": "Keine Preisdaten verfügbar", + "input": "Eingabe", + "output": "Ausgabe", + "cached": "Zwischengespeichert", + "reasoning": "Begründung", + "cacheCreation": "Cache-Erstellung", + "customPricing": "Individuelle Preise", + "databaseSize": "Datenbankgröße", + "backupDb": "Backup-Datenbank", + "restoreDb": "Datenbank wiederherstellen", + "exportData": "Daten exportieren", + "importData": "Daten importieren", + "clearData": "Alle Daten löschen", + "clearDataConfirm": "Dadurch werden alle Daten dauerhaft gelöscht. Bist du sicher?", + "enableRequestLogs": "Aktivieren Sie Anforderungsprotokolle", + "logRetention": "Protokollaufbewahrung", + "ipWhitelist": "IP-Whitelist", + "ipBlacklist": "IP-Blacklist", + "addIP": "IP hinzufügen", + "savedSuccessfully": "Einstellungen erfolgreich gespeichert", + "ai": "KI", + "advanced": "Fortgeschritten", + "localMode": "Lokaler Modus – Alle auf Ihrem Computer gespeicherten Daten", + "settingsSectionsAria": "Abschnitte „Einstellungen“.", + "switchThemes": "Wechseln Sie zwischen hellen und dunklen Themen", + "themeSelectionAria": "Themenauswahl", + "themeLight": "Licht", + "themeDark": "Dunkel", + "themeSystem": "System", + "hideHealthLogs": "Gesundheitsprüfungsprotokolle ausblenden", + "hideHealthLogsDesc": "Wenn diese Option aktiviert ist, werden [HealthCheck]-Meldungen in der Serverkonsole unterdrückt", + "promptCache": "Prompt-Cache", + "flushCache": "Cache leeren", + "flushing": "Spülen…", + "size": "Größe", + "hits": "Treffer", + "evictions": "Räumungen", + "loadingCacheStats": "Cache-Statistiken werden geladen…", + "globalProxy": "Globaler Proxy", + "globalProxyDesc": "Konfigurieren Sie einen globalen ausgehenden Proxy für alle API-Aufrufe. Einzelne Anbieter, Kombinationen und Schlüssel können dies außer Kraft setzen.", + "noGlobalProxy": "Kein globaler Proxy konfiguriert", + "globalLabel": "Global", + "configure": "Konfigurieren", + "globalSystemPrompt": "Globale Systemaufforderung", + "systemPromptDesc": "Wird in alle Anfragen auf Proxy-Ebene eingefügt", + "saved": "Gespeichert", + "systemPromptPlaceholder": "Geben Sie die Systemaufforderung ein, um alle Anfragen zu injizieren ...", + "systemPromptHint": "Diese Eingabeaufforderung wird der Systemnachricht jeder Anfrage vorangestellt. Wird für globale Anweisungen, Sicherheitsrichtlinien oder Antwortformatierungsregeln verwendet.", + "chars": "{count} Zeichen", + "thinkingBudgetTitle": "Denkendes Budget", + "thinkingBudgetDesc": "Kontrollieren Sie die Verwendung von KI-Begründungstoken für alle Anfragen", + "passthrough": "Passthrough", + "passthroughDesc": "Keine Änderungen – der Kunde kontrolliert das Denkbudget", + "auto": "Automatisch", + "autoDesc": "Entfernen Sie alle Denkkonfigurationen – lassen Sie den Anbieter entscheiden", + "custom": "Benutzerdefiniert", + "customDesc": "Legen Sie ein festes Token-Budget für alle Anfragen fest", + "adaptive": "Adaptiv", + "adaptiveDesc": "Skalieren Sie das Budget basierend auf der Komplexität der Anfrage", + "effortNone": "Keine (0 Token)", + "effortLow": "Niedrig (1.000 Token)", + "effortMedium": "Mittel (10.000 Token)", + "effortHigh": "Hoch (128.000 Token)", + "tokenBudget": "Token-Budget", + "tokens": "Token", + "baseEffortLevel": "Grundaufwandsstufe", + "adaptiveHint": "Der adaptive Modus skaliert ausgehend von dieser Basisebene basierend auf der Nachrichtenanzahl, der Tool-Nutzung und der Eingabeaufforderungslänge.", + "requireLogin": "Anmeldung erforderlich", + "requireLoginDesc": "Wenn aktiviert, erfordert das Dashboard ein Passwort. Wenn AUS, Zugriff ohne Anmeldung.", + "currentPassword": "Aktuelles Passwort", + "enterCurrentPassword": "Geben Sie das aktuelle Passwort ein", + "newPassword": "Neues Passwort", + "enterNewPassword": "Geben Sie ein neues Passwort ein", + "confirmPassword": "Bestätigen Sie das neue Passwort", + "confirmPasswordPlaceholder": "Bestätigen Sie das neue Passwort", + "passwordsNoMatch": "Passwörter stimmen nicht überein", + "passwordUpdated": "Passwort erfolgreich aktualisiert", + "failedUpdatePassword": "Das Passwort konnte nicht aktualisiert werden", + "errorOccurred": "Es ist ein Fehler aufgetreten", + "updatePassword": "Passwort aktualisieren", + "setPassword": "Passwort festlegen", + "apiEndpointProtection": "API-Endpunktschutz", + "requireAuthModels": "API-Schlüssel für /models erforderlich", + "requireAuthModelsDesc": "Wenn diese Option aktiviert ist, gibt der Endpunkt /v1/models für nicht authentifizierte Anforderungen 404 zurück. Verhindert die Modellerkennung durch nicht autorisierte Benutzer.", + "blockedProviders": "Gesperrte Anbieter", + "blockedProvidersDesc": "Verstecken Sie bestimmte Anbieter in der /v1/models-Antwort. Gesperrte Anbieter erscheinen nicht in den Modelllisten.", + "providersBlocked": "{count} Anbieter von /models blockiert", + "blockProviderTitle": "Blockieren Sie {provider}", + "unblockProviderTitle": "Entsperren Sie {provider}", + "routingStrategy": "Routing-Strategie", + "fillFirst": "Zuerst füllen", + "fillFirstDesc": "Verwenden Sie Konten in der Reihenfolge ihrer Priorität", + "roundRobin": "Round Robin", + "roundRobinDesc": "Gehen Sie alle Konten durch", + "p2c": "P2C", + "p2cDesc": "Wählen Sie zufällig zwei aus und verwenden Sie die gesündere", + "random": "Zufällig", + "randomDesc": "Zufälliges Konto bei jeder Anfrage", + "leastUsed": "Am wenigsten genutzt", + "leastUsedDesc": "Wählen Sie das zuletzt verwendete Konto aus", + "costOpt": "Kosten Opt", + "costOptDesc": "Bevorzugen Sie das günstigste verfügbare Konto", + "stickyLimit": "Sticky-Limit", + "stickyLimitDesc": "Anrufe pro Konto vor dem Wechsel", + "modelAliases": "Modell-Aliase", + "modelAliasesDesc": "Platzhaltermuster zum Neuzuordnen von Modellnamen • Verwenden Sie * und ?", + "aliasPatternPlaceholder": "Claude-Sonett-*", + "aliasTargetPlaceholder": "claude-sonett-4-20250514", + "pattern": "Muster", + "targetModel": "Zielmodell", + "add": "+ Hinzufügen", + "session": "Sitzung", + "sessionDetailsAria": "Sitzungsdetails", + "status": "Status", + "authenticated": "Authentifiziert", + "guest": "Gast", + "loginTime": "Anmeldezeit", + "sessionAge": "Sitzungsalter", + "browser": "Browser", + "clearLocalData": "Lokale Daten löschen", + "logout": "Abmelden", + "clearLocalDataConfirm": "Alle lokalen Daten löschen? Dadurch werden Ihre Einstellungen zurückgesetzt.", + "unknown": "Unbekannt", + "systemActor": "System", + "ipAccessControl": "IP-Zugriffskontrolle", + "ipAccessControlDesc": "Blockieren oder erlauben Sie bestimmte IP-Adressen", + "ipModeDisabled": "Deaktiviert", + "ipModeBlacklist": "Schwarze Liste", + "ipModeWhitelist": "Whitelist", + "ipModeWhitelistPriority": "WL-Priorität", + "addIpAddress": "IP-Adresse hinzufügen", + "ipAddressPlaceholder": "192.168.1.0/24 oder 10.0.*.*", + "block": "+ Blockieren", + "allow": "+ Erlauben", + "blocked": "Blockiert ({count})", + "allowed": "Erlaubt ({count})", + "temporaryBans": "Vorübergehende Sperren ({count})", + "minLeft": "{min}m übrig", + "auditLog": "Audit-Protokoll", + "searchAuditLogs": "Audit-Logs durchsuchen...", + "failedLoadAuditLog": "Das Audit-Protokoll konnte nicht geladen werden", + "noAuditEvents": "Keine Prüfereignisse gefunden", + "action": "Aktion", + "actor": "Schauspieler", + "details": "Einzelheiten", + "time": "Zeit", + "fallbackChainsTitle": "Fallback-Ketten", + "fallbackChainsDesc": "Definieren Sie die Anbieter-Fallback-Reihenfolge pro Modell", + "addChain": "+ Kette hinzufügen", + "modelName": "Modellname", + "modelNamePlaceholder": "claude-sonett-4-20250514", + "providersCommaSeparated": "Anbieter (durch Kommas getrennt, nach Priorität geordnet)", + "providersCommaSeparatedPlaceholder": "anthropisch, openai, Zwillinge", + "createChain": "Kette erstellen", + "noFallbackChains": "Keine Fallback-Ketten", + "noFallbackChainsDesc": "Erstellen Sie eine Kette, um die Anbieter-Fallback-Reihenfolge für ein Modell zu definieren.", + "loadingFallbackChains": "Fallback-Ketten werden geladen...", + "deleteChainConfirm": "Fallback-Kette für „{model}“ löschen?", + "chainCreated": "Kette für {model} erstellt", + "chainDeleted": "Kette für {model} gelöscht", + "failedCreateChain": "Kette konnte nicht erstellt werden", + "failedDeleteChain": "Kette konnte nicht gelöscht werden", + "deleteChain": "Kette löschen", + "fillModelAndProviders": "Bitte geben Sie Modellnamen und Anbieter ein", + "addAtLeastOneProvider": "Fügen Sie mindestens einen Anbieter hinzu", + "comboDefaultsTitle": "Combo-Standardeinstellungen", + "globalComboConfig": "Globale Combo-Konfiguration", + "defaultStrategy": "Standardstrategie", + "defaultStrategyDesc": "Wird auf neue Combos ohne explizite Strategie angewendet", + "comboStrategyAria": "Combo-Strategie", + "priority": "Priorität", + "weighted": "Gewichtet", + "maxRetriesLabel": "Max. Wiederholungsversuche", + "retryDelayLabel": "Wiederholungsverzögerung (ms)", + "timeoutLabel": "Timeout (ms)", + "healthCheck": "Gesundheitscheck", + "healthCheckDesc": "Überprüfen Sie vorab die Verfügbarkeit des Anbieters", + "trackMetrics": "Verfolgen Sie Metriken", + "trackMetricsDesc": "Zeichnen Sie Metriken pro Kombinationsanforderung auf", + "providerOverrides": "Anbieterüberschreibungen", + "providerOverridesDesc": "Zeitüberschreitung und Wiederholungsversuche pro Anbieter außer Kraft setzen. Anbietereinstellungen überschreiben globale Standardeinstellungen.", + "providerMaxRetriesAria": "{provider} maximale Wiederholungsversuche", + "providerTimeoutAria": "{provider} Timeout ms", + "removeProviderOverrideAria": "Entfernen Sie die {provider}-Überschreibung", + "newProviderNamePlaceholder": "z.B. Google, openai...", + "newProviderNameAria": "Neuer Anbietername", + "retries": "wiederholt", + "ms": "Frau", + "saveComboDefaults": "Combo-Standardeinstellungen speichern", + "maxNestingDepth": "Maximale Verschachtelungstiefe", + "concurrencyPerModel": "Parallelität / Modell", + "queueTimeout": "Warteschlangen-Timeout (ms)", + "providerProfiles": "Anbieterprofile", + "providerProfilesDesc": "Separate Resilienzeinstellungen für OAuth-Anbieter (sitzungsbasiert) und API-Schlüsselanbieter (gemessen). OAuth-Anbieter haben aufgrund niedrigerer Ratenlimits strengere Schwellenwerte.", + "oauthProviders": "OAuth-Anbieter", + "apiKeyProviders": "API-Schlüsselanbieter", + "transientCooldown": "Vorübergehende Abklingzeit", + "rateLimitCooldown": "Abklingzeit der Ratenbegrenzung", + "maxBackoffLevel": "Max. Backoff-Level", + "cbThreshold": "CB-Schwelle", + "cbResetTime": "CB-Resetzeit", + "rateLimiting": "Ratenbegrenzung", + "rateLimitingDesc": "API-Schlüsselanbieter unterliegen automatisch einer Ratenbegrenzung mit sicheren Standardwerten. Grenzwerte werden aus Antwortheadern gelernt und passen sich im Laufe der Zeit an.", + "defaultSafetyNet": "Standard-Sicherheitsnetz", + "rpm": "U/min", + "minGap": "Min. Lücke", + "maxConcurrent": "Maximal gleichzeitig", + "activeLimiters": "Aktive Limiter", + "noActiveLimiters": "Noch keine aktiven Ratenbegrenzer.", + "reservoir": "Stausee", + "running": "Laufen", + "queued": "In der Warteschlange", + "circuitBreakers": "Leistungsschalter", + "breakerStateClosed": "Geschlossen", + "breakerStateOpen": "Offen", + "breakerStateHalfOpen": "Halboffen", + "tripped": "{count} ausgelöst", + "healthy": "{count} gesund", + "resetAll": "Alles zurücksetzen", + "noCircuitBreakers": "Noch keine Schutzschalter aktiv. Sie werden automatisch erstellt, wenn Anforderungen die Combo-Pipeline durchlaufen.", + "failures": "{count} Fehler(e)", + "policiesLocked": "Richtlinien und gesperrte Kennungen", + "allOperational": "Alle Systeme betriebsbereit – keine Aussperrungen oder ausgelösten Leistungsschalter", + "loadingPolicies": "Richtlinien werden geladen...", + "lockedIdentifiers": "Gesperrte Kennungen", + "unlockedIdentifier": "Entsperrt: {identifier}", + "sinceDate": "seit {date}", + "forceUnlock": "Entsperren erzwingen", + "unlocking": "Entsperren...", + "failedUnlock": "Entsperren fehlgeschlagen", + "failedLoadWithStatus": "Fehler beim Laden: {status}", + "failedLoadResilience": "Ausfallsicherheitsstatus konnte nicht geladen werden", + "saveFailed": "Speichern fehlgeschlagen", + "resetFailed": "Zurücksetzen fehlgeschlagen", + "loadingResilience": "Resilienzstatus wird geladen...", + "retry": "Versuchen Sie es noch einmal", + "systemStorage": "System & Speicher", + "allDataLocal": "Alle Daten werden lokal auf Ihrem Computer gespeichert", + "databasePath": "Datenbankpfad", + "exportDatabase": "Datenbank exportieren", + "exportAll": "Alle exportieren (.tar.gz)", + "importDatabase": "Datenbank importieren", + "confirmDbImport": "Bestätigen Sie den Datenbankimport", + "confirmDbImportDesc": "Dadurch werden alle aktuellen Daten durch den Inhalt von {file} ersetzt. Vor dem Import wird automatisch ein Backup erstellt.", + "yesImport": "Ja, Import", + "lastBackup": "Letzte Sicherung", + "noBackupYet": "Noch kein Backup", + "backupNow": "Jetzt sichern", + "backupRestore": "Sichern und Wiederherstellen", + "viewBackups": "Backups anzeigen", + "hide": "Verstecken", + "backupRetentionDesc": "Datenbank-Snapshots werden automatisch vor der Wiederherstellung und alle 15 Minuten erstellt, wenn sich Daten ändern. Aufbewahrung: 24 Stunden + 30 tägliche Backups mit intelligenter Rotation.", + "loadingBackups": "Backups werden geladen...", + "noBackupsYet": "Noch keine Backups verfügbar. Bei Datenänderungen werden automatisch Backups erstellt.", + "backupsAvailable": "{count} Backup(s) verfügbar", + "refresh": "Aktualisieren", + "confirm": "Bestätigen?", + "yes": "Ja", + "no": "Nein", + "restore": "Wiederherstellen", + "invalidFileType": "Ungültiger Dateityp. Es werden nur .sqlite-Dateien akzeptiert.", + "exportFailed": "Der Export ist fehlgeschlagen", + "exportFailedWithError": "Export fehlgeschlagen: {error}", + "fullExportFailedWithError": "Vollständiger Export fehlgeschlagen: {error}", + "backupCreated": "Backup erstellt: {file}", + "restoreSuccess": "Restauriert! {connections} Verbindungen, {nodes} Knoten, {combos} Combos, {apiKeys} API-Schlüssel.", + "importSuccess": "Datenbank importiert! {connections} Verbindungen, {nodes} Knoten, {combos} Combos, {apiKeys} API-Schlüssel.", + "justNow": "gerade jetzt", + "minutesAgo": "Vor {count}m", + "hoursAgo": "Vor {count}h", + "daysAgo": "Vor {count}d", + "backupReasonManual": "Handbuch", + "backupReasonPreRestore": "vor der Wiederherstellung", + "connectionsCount": "{count, plural, one {# connection} other {# connections}}", + "noChangesSinceBackup": "Keine Änderungen seit der letzten Sicherung", + "backupFailed": "Die Sicherung ist fehlgeschlagen", + "restoreFailed": "Wiederherstellung fehlgeschlagen", + "importFailed": "Der Import ist fehlgeschlagen", + "errorDuringRestore": "Bei der Wiederherstellung ist ein Fehler aufgetreten", + "errorDuringImport": "Beim Import ist ein Fehler aufgetreten", + "modelPricing": "Modellpreise", + "modelPricingDesc": "Konfigurieren Sie die Kostensätze pro Modell. • Alle Preise in 1-Millionen-Dollar-Tokens", + "providers": "Anbieter", + "registry": "Registrierung", + "priced": "Preislich", + "searchProvidersModels": "Anbieter oder Modelle suchen...", + "showAll": "Alle anzeigen", + "noProvidersMatch": "Zu Ihrer Suche passen keine Anbieter.", + "howPricingWorks": "So funktioniert die Preisgestaltung", + "cacheWrite": "Cache-Schreiben", + "unsaved": "nicht gespeichert", + "resetDefaults": "Standardeinstellungen zurücksetzen", + "saveProvider": "Anbieter speichern", + "saving": "Sparen...", + "model": "Modell", + "models": "Modelle", + "moreProviders": "{count} weitere Anbieter", + "withPricing": "mit konfigurierter Preisgestaltung", + "policiesCircuitBreakers": "Richtlinien und Leistungsschalter", + "activeIssuesDetected": "Aktive Probleme erkannt", + "off": "Aus", + "resetPricingConfirm": "Alle Preise für {provider} auf die Standardwerte zurücksetzen?", + "pricingDescInput": "Eingabe: An das Modell gesendete Token", + "pricingDescOutput": "Ausgabe: Token generiert", + "pricingDescCached": "Zwischengespeichert: Wiederverwendete Eingabe (~50 % der Eingaberate)", + "pricingDescReasoning": "Begründung: Denktokens (greift auf Ausgabe zurück)", + "pricingDescCacheWrite": "Cache Write: Erstellen von Cache-Einträgen (fällt auf Input zurück)", + "pricingDescFormula": "Kosten = (Eingabe × Eingaberate) + (Ausgabe × Ausgaberate) + (zwischengespeichert × zwischengespeicherte_Rate) pro Million Token.", + "pricingSettingsTitle": "Preiseinstellungen", + "totalModels": "Gesamtmodelle", + "active": "Aktiv", + "costCalculation": "Kostenberechnung", + "costCalculationDesc": "Die Kosten werden basierend auf der Token-Nutzung und den für jedes Modell konfigurierten Preissätzen berechnet.", + "pricingFormat": "Preisformat", + "pricingFormatDesc": "Alle Preise sind in $/1 Mio. Token angegeben (Dollar pro Million Token).", + "tokenTypes": "Token-Typen", + "inputTokenDesc": "Standard-Prompt-Token", + "outputTokenDesc": "Abschluss-/Antworttoken", + "cachedTokenDesc": "Zwischengespeicherte Eingabetokens (typischerweise 50 % der Eingaberate)", + "reasoningTokenDesc": "Spezielle Argumentations-/Denk-Tokens (Fallback auf die Ausgaberate)", + "cacheCreationTokenDesc": "Token, die zum Erstellen von Cache-Einträgen verwendet werden (Fallback auf Eingaberate)", + "customPricingNote": "Sie können die Standardpreise für bestimmte Modelle überschreiben. Benutzerdefinierte Überschreibungen haben Vorrang vor automatisch erkannten Preisen.", + "editPricing": "Preise bearbeiten", + "viewFullDetails": "Vollständige Details anzeigen" + }, + "translator": { + "title": "Übersetzer", + "metaTitle": "Übersetzer-Spielplatz | OmniRoute", + "metaDescription": "Debuggen, testen und visualisieren Sie API-Formatübersetzungen zwischen Anbietern", + "playgroundTitle": "Übersetzerspielplatz", + "playground": "Spielplatz", + "realtime": "Echtzeit-Übersetzungsaktivität", + "chatTester": "Chat-Tester", + "testBench": "Prüfstand", + "liveMonitor": "Live-Monitor", + "modeDescriptionPlayground": "Fügen Sie einen beliebigen API-Anfragetext ein und sehen Sie, wie OmniRoute ihn zwischen Anbieterformaten übersetzt (OpenAI ↔ Claude ↔ Gemini ↔ Responses API).", + "modeDescriptionChatTester": "Senden Sie echte Chat-Anfragen über OmniRoute und überprüfen Sie den gesamten Roundtrip: Eingabe, übersetzte Anfrage, Anbieterantwort und übersetzte Ausgabe.", + "modeDescriptionTestBench": "Führen Sie vordefinierte Szenarien aus und vergleichen Sie die Kompatibilität zwischen Anbietern und Modellen.", + "modeDescriptionLiveMonitor": "Beobachten Sie Übersetzungsereignisse in Echtzeit, während Anfragen über OmniRoute eingehen.", + "modeDescriptionFallback": "Debuggen, testen und visualisieren Sie, wie OmniRoute API-Anfragen zwischen Anbietern übersetzt.", + "recentTranslations": "Aktuelle Übersetzungen", + "noTranslations": "Noch keine Übersetzungen", + "source": "Quelle", + "target": "Ziel", + "time": "Zeit", + "model": "Modell", + "status": "Status", + "latency": "Latenz", + "totalTranslations": "Gesamtübersetzungen", + "successful": "Erfolgreich", + "errors": "Fehler", + "avgLatency": "Durchschnittliche Latenz", + "millisecondsShort": "{value}ms", + "notAvailableSymbol": "—", + "liveAutoRefreshing": "Live – Automatische Aktualisierung", + "paused": "Angehalten", + "eventsAppearHint": "Übersetzungsereignisse werden hier angezeigt, wenn Anforderungen über OmniRoute fließen. Verwenden Sie eine dieser Methoden, um Ereignisse zu generieren:", + "chatTesterTab": "Registerkarte „Chat-Tester“.", + "testBenchTab": "Registerkarte „Prüfstand“.", + "externalApiCalls": "Externe API-Aufrufe", + "ideCliIntegrations": "IDE/CLI-Integrationen", + "inMemoryNote": "Hinweis: Ereignisse werden im Speicher gespeichert und beim Neustart des Servers zurückgesetzt.", + "ok": "Okay", + "errorShort": "ERR", + "formatConverter": "Formatkonverter", + "formatConverterDescription": "Fügen Sie einen JSON-Anfragetext ein oder geben Sie ihn ein. Der Übersetzer erkennt das Quellformat automatisch und konvertiert es in das Zielformat. Verwenden Sie dies, um zu debuggen, wie OmniRoute Anfragen zwischen Formaten übersetzt (OpenAI ↔ Claude ↔ Gemini ↔ Responses API).", + "input": "Eingabe", + "output": "Ausgabe", + "auto": "Automatisch", + "swapFormats": "Formate austauschen", + "translateAction": "Übersetzen", + "clear": "Klar", + "inputPlaceholder": "Fügen Sie hier einen Anfragetext ein oder wählen Sie unten eine Vorlage aus ...", + "exampleTemplates": "Beispielvorlagen", + "exampleTemplatesHint": "— Zum Laden klicken", + "templateLoadHint": "Die Vorlage lädt die Anfrage im Format {format}. Ändern Sie das Quellformat, um es in einem anderen Format zu laden.", + "compatibilityTester": "Kompatibilitätstester", + "compatibilityReport": "Kompatibilitätsbericht", + "testBenchDescription": "Führen Sie vordefinierte Szenarien aus (einfacher Chat, Tool-Aufruf usw.), um die Übersetzung und die Anbieterkompatibilität zu überprüfen. Wählen Sie ein Quellformat und einen Zielanbieter aus und führen Sie dann alle Tests durch, um einen Kompatibilitätsprozentsatz zu ermitteln. Verwenden Sie diese Funktion, um herauszufinden, welche Funktionen anbieterübergreifend funktionieren.", + "targetProvider": "Zielanbieter", + "runAllTests": "Führen Sie alle Tests aus", + "runTest": "Test ausführen", + "reRun": "Wiederholen", + "running": "Laufen...", + "passed": "bestanden", + "failed": "gescheitert", + "passedIconLabel": "✅Bestanden", + "chunks": "Brocken", + "scenarioSimpleChat": "Einfacher Chat", + "scenarioToolCalling": "Werkzeugaufruf", + "scenarioMultiTurn": "Multiturn", + "scenarioThinking": "Denken", + "scenarioSystemPrompt": "Systemaufforderung", + "scenarioStreaming": "Streaming", + "templateNames": { + "simple-chat": "Einfacher Chat", + "tool-calling": "Werkzeugaufruf", + "multi-turn": "Multiturn", + "thinking": "Denken", + "system-prompt": "Systemaufforderung", + "streaming": "Streaming" + }, + "templateDescriptions": { + "simple-chat": "Einfache Textnachricht", + "tool-calling": "Funktions-/Tool-Aufruf", + "multi-turn": "Gespräch mit der Geschichte", + "thinking": "Erweitertes Denken / Argumentieren", + "system-prompt": "Komplexe Systemanweisungen", + "streaming": "SSE-Streaming-Anfrage" + }, + "templatePayloads": { + "simpleChat": { + "system": "Sie sind ein hilfreicher Assistent.", + "userGreeting": "Hallo! Wie geht es dir heute?" + }, + "toolCalling": { + "userWeather": "Wie ist das Wetter in São Paulo?", + "toolDescription": "Erhalten Sie das aktuelle Wetter für einen Standort", + "cityNameDescription": "Stadtname" + }, + "multiTurn": { + "system": "Sie sind Codierungsassistent.", + "userInitial": "Schreiben Sie eine Funktion zum Sortieren eines Arrays in Python.", + "assistantExample": "Hier ist eine einfache Sortierfunktion:\n\n„Python\ndef sort_array(arr):\n Rückgabe sortiert(arr)\n„", + "userFollowUp": "Sortieren Sie nun in absteigender Reihenfolge." + }, + "thinking": { + "question": "Wie groß ist die Summe der ersten 100 Primzahlen?" + }, + "systemPrompt": { + "systemInstruction": "Sie sind ein leitender Softwareentwickler mit Spezialisierung auf verteilte Systeme. Beantworten Sie Fragen präzise und nutzen Sie die Best Practices der Branche. Geben Sie bei Bedarf immer Codebeispiele an. Formatieren Sie Ihre Antworten mit Markdown.", + "question": "Wie setze ich ein Schutzschaltermuster um?" + }, + "streaming": { + "prompt": "Erzählen Sie mir eine kurze Geschichte über einen Roboter, der malen lernt." + } + }, + "openaiCompatibleLabel": "OpenAI-kompatibel", + "anthropicCompatibleLabel": "Anthropisch kompatibel", + "noTemplateForFormat": "Keine Vorlage für dieses Format", + "translationFailed": "Übersetzung fehlgeschlagen: {error}", + "pipelineDebugger": "Pipeline-Debugger", + "translationPipeline": "Übersetzungspipeline", + "pipelineVisualization": "Pipeline-Visualisierung", + "pipelineVisualizationHint": "Senden Sie eine Nachricht, um zu sehen, wie Ihre Anfrage durch Erkennung → Übersetzung → Anbieteranruf verläuft.", + "chatTesterDescription": "Senden Sie Nachrichten in einem bestimmten Clientformat und überprüfen Sie jeden Schritt der Übersetzungspipeline.", + "chatTesterFlow": "Client-Anfrage → Formaterkennung → OpenAI Intermediate → Anbieterformat → Antwort", + "clickStepToInspect": "Klicken Sie auf einen beliebigen Schritt, um die Daten in dieser Phase zu überprüfen.", + "clientFormat": "Client-Format", + "provider": "Anbieter", + "modelPlaceholder": "Wählen Sie einen Modellnamen aus oder geben Sie ihn ein...", + "sendMessageToSeePipeline": "Senden Sie eine Nachricht, um die Übersetzungspipeline anzuzeigen", + "chatMessageHintPrefix": "Ihre Nachricht wird als formatiert", + "chatMessageHintSuffix": "Anfrage, übersetzt durch die Pipeline und gesendet an den ausgewählten Anbieter.", + "youWithFormat": "Sie ({format})", + "assistant": "Assistent", + "typeMessage": "Geben Sie eine Nachricht ein...", + "send": "Senden", + "clientRequest": "Kundenanfrage", + "clientRequestDescription": "Der Anfragetext, wie ihn Ihr Kunde senden würde", + "formatDetected": "Format erkannt", + "formatDetectedDescription": "OmniRoute erkennt das API-Format automatisch anhand der Anforderungsstruktur", + "openaiIntermediate": "OpenAI-Mittelstufe", + "openaiIntermediateDescription": "Alle Formate werden zunächst auf das OpenAI-Format (die universelle Brücke) normalisiert.", + "providerFormat": "Anbieterformat", + "providerFormatDescription": "Das OpenAI-Format wird in das native Format des Anbieters übersetzt", + "providerResponse": "Antwort des Anbieters", + "providerResponseRawDescription": "Die Rohantwort der Anbieter-API", + "providerResponseSseDescription": "Der rohe SSE-Stream von der Anbieter-API", + "unexpectedError": "Es ist ein unerwarteter Fehler aufgetreten", + "error": "Fehler", + "errorMessage": "Fehler: {message}", + "requestFailed": "Die Anfrage ist fehlgeschlagen", + "noTextExtracted": "(Kein Text extrahiert)", + "liveMonitorDescriptionPrefix": "Zeigt Übersetzungsereignisse an, während API-Aufrufe über OmniRoute fließen. Ereignisse kommen aus dem In-Memory-Puffer (wird beim Neustart zurückgesetzt). Benutzen", + "liveMonitorDescriptionSuffix": "oder externe API-Aufrufe zum Generieren von Ereignissen." + }, + "usage": { + "title": "Nutzung", + "loggerTab": "Logger", + "proxyTab": "Stellvertreter", + "budgetManagement": "Budgetverwaltung", + "budgetSaved": "Budgetgrenzen eingespart", + "budgetSaveFailed": "Das Budget konnte nicht gespeichert werden", + "loadingBudgetData": "Budgetdaten werden geladen...", + "noApiKeysTitle": "Keine API-Schlüssel", + "noApiKeysDescription": "Fügen Sie zunächst API-Schlüssel hinzu, um Budgetgrenzen festzulegen.", + "apiKey": "API-Schlüssel", + "todaysSpend": "Heutige Ausgaben", + "thisMonth": "Diesen Monat", + "setLimits": "Grenzen setzen", + "dailyLimitUsd": "Tageslimit (USD)", + "monthlyLimitUsd": "Monatslimit (USD)", + "warningThresholdPercent": "Warnschwelle (%)", + "dailyLimitPlaceholder": "z.B. 5.00", + "monthlyLimitPlaceholder": "z.B. 50,00", + "warningThresholdPlaceholder": "80", + "saveLimits": "Grenzen speichern", + "budgetOk": "Budget OK – {remaining} verbleibend", + "budgetExceeded": "Budget überschritten – Anfragen werden möglicherweise blockiert", + "totalRequests": "Gesamtzahl der Anfragen", + "noDataYet": "Noch keine Daten", + "latency": "Latenz", + "latencyP50": "S. 50", + "latencyP95": "S. 95", + "latencyP99": "S. 99", + "promptCache": "Prompt-Cache", + "systemHealth": "Systemgesundheit", + "entries": "Einträge", + "activeCount": "{count} aktiv", + "openCircuitBreakersDetected": "Offene Leistungsschalter erkannt", + "hitRate": "Trefferquote", + "hitsMisses": "Treffer/Fehlschläge", + "circuitBreakers": "Leistungsschalter", + "lockedIPs": "Gesperrte IPs", + "lockoutsAutoRefreshHint": "Ratenbegrenzungssperren pro Modell • Automatische Aktualisierung 10 Sekunden", + "lockedCount": "{count, plural, one {# locked} other {# locked}}", + "timeLeft": "{time} übrig", + "howItWorks": "Wie es funktioniert", + "howItWorksSubtitle": "Erfahren Sie, wie Bewertungen Ihre LLM-Antworten validieren", + "define": "Definieren", + "defineStepDescription": "Erstellen Sie Testfälle mit Eingabeaufforderungen und erwarteten Ausgabekriterien mithilfe von Strategien wie „Enthält“, „Regex“ oder „Genaue Übereinstimmung“.", + "run": "Lauf", + "runStepDescription": "Führen Sie Testfälle für Ihre LLM-Endpunkte über OmniRoute aus. Jeder Fall wird als echte API-Anfrage gesendet.", + "evaluate": "Bewerten", + "evaluateStepDescription": "Die Antworten werden mit den erwarteten Kriterien verglichen. Sehen Sie sich für jeden Fall das Bestehen/Nichtbestehen mit Latenzmetriken und detailliertem Feedback an.", + "evalSuites": "Evaluierungssuiten", + "evalSuitesHint": "Klicken Sie auf eine Suite, um Testfälle anzuzeigen, und führen Sie sie dann aus, um Ihre LLM-Endpunkte zu bewerten", + "evalsLoading": "Evaluierungssuiten werden geladen...", + "noEvalSuitesFound": "Keine Evaluierungssuiten gefunden", + "noEvalSuitesDescription": "Evaluierungssuiten können über die API oder im Code definiert werden. Sie testen Modellausgaben anhand erwarteter Ergebnisse mithilfe von Strategien wie „Contains“, „Regex“, „Exact Match“ und benutzerdefinierten Funktionen.", + "columnCase": "Fall", + "columnStatus": "Status", + "columnLatency": "Latenz", + "columnDetails": "Einzelheiten", + "columnModel": "Modell", + "columnStrategy": "Strategie", + "columnExpected": "Erwartet", + "statsSuites": "Suiten", + "statsTestCases": "Testfälle", + "statsModels": "Modelle", + "statsCoverage": "Abdeckung", + "statsStrategiesCount": "{count} Strategien", + "evaluationStrategies": "Bewertungsstrategien", + "modelsUnderTest": "Im Test befindliche Modelle", + "searchSuitesPlaceholder": "Suiten suchen...", + "passSuffix": "passieren", + "casesCount": "{count, plural, one {# case} other {# cases}}", + "runEval": "Führen Sie die Evaluierung aus", + "runningProgress": "Ausführen von {current}/{total}...", + "passRate": "Erfolgsquote", + "summaryBreakdown": "{passed} bestanden · {failed} fehlgeschlagen · {total} insgesamt", + "passedIconLabel": "✅Bestanden", + "failedIconLabel": "❌ Fehlgeschlagen", + "detailsContains": "Enthält: „{term}“", + "detailsRegex": "Regex: {pattern}", + "detailsExpected": "Erwartet: „{expected}“", + "noResultsYet": "Noch keine Ergebnisse", + "testCasesCount": "Testfälle ({count})", + "noTestCasesDefined": "Keine Testfälle definiert", + "runEvalHint": "Klicken Sie auf „Auswertung ausführen“, um alle Fälle für Ihren LLM-Endpunkt auszuführen. Jeder Test sendet eine echte Anfrage über OmniRoute.", + "notifyNoTestCases": "Für diese Suite sind keine Testfälle definiert", + "notifyAllCasesPassed": "Alle {total} Fälle bestanden ✅", + "notifySomeCasesFailed": "{passed}/{total} bestanden, {failed} fehlgeschlagen", + "notifyEvalRunFailed": "Evaluierungslauf fehlgeschlagen", + "notifyEvalTitle": "Auswertung: {name}", + "modelEvals": "Modellbewertungen", + "evalsHeroDescription": "Testen und validieren Sie Ihre LLM-Endpunkte, indem Sie vordefinierte Evaluierungssuiten ausführen. Jede Suite enthält Testfälle, die echte Eingabeaufforderungen über OmniRoute senden und Antworten mit erwarteten Kriterien vergleichen. So können Sie Regressionen erkennen, Modelle vergleichen und die Antwortqualität anbieterübergreifend sicherstellen.", + "qualityValidation": "Qualitätsvalidierung", + "modelComparison": "Modellvergleich", + "regressionDetection": "Regressionserkennung", + "latencyBenchmarks": "Latenz-Benchmarks", + "modelLockouts": "Modellsperren", + "noLockouts": "Derzeit sind keine Modelle gesperrt", + "activeSessions": "Aktive Sitzungen", + "noSessions": "Keine aktiven Sitzungen", + "sessionsHint": "Sitzungen erscheinen als Anfragen, die über den Proxy fließen", + "sessionsTrackedHint": "Verfolgt über Anforderungs-Fingerprinting • Automatische Aktualisierung 5 Sekunden", + "session": "Sitzung", + "age": "Alter", + "requests": "Anfragen", + "connection": "Verbindung", + "durationMillisecondsShort": "{value}ms", + "durationSecondsShort": "{value}s", + "durationMinutesShort": "{value}m", + "durationHoursShort": "{value}h", + "reasonSeparator": " - ", + "notAvailableSymbol": "-", + "providerLimits": "Anbieterbeschränkungen", + "noProviders": "Keine Anbieter verbunden", + "connectProvidersForQuota": "Stellen Sie über OAuth eine Verbindung zu Anbietern her, um Ihre API-Kontingentgrenzen und -Nutzung zu verfolgen.", + "accountsCount": "{count, plural, one {# account} other {# accounts}}", + "filteredFromCount": "(gefiltert aus {count})", + "autoRefresh": "Automatische Aktualisierung", + "refreshAll": "Alle aktualisieren", + "loadingQuotas": "Laden...", + "account": "Konto", + "modelQuotas": "Modellkontingente", + "lastUsed": "Zuletzt verwendet", + "actions": "Aktionen", + "refreshQuota": "Kontingent aktualisieren", + "today": "Heute", + "tomorrow": "Morgen", + "dayTimeFormat": "{day}, {time}", + "inDuration": "in {duration}", + "notApplicable": "N/A", + "rawPlanWithValue": "Rohplan: {plan}", + "noPlanFromProvider": "Kein Plan vom Anbieter", + "noQuotaData": "Keine Quotendaten", + "noQuotaDataAvailable": "Keine Quotendaten verfügbar", + "noAccountsForTierFilter": "Für den Stufenfilter wurden keine Konten gefunden", + "tierAll": "Alle", + "tierEnterprise": "Unternehmen", + "tierTeam": "Team", + "tierBusiness": "Geschäft", + "tierUltra": "Ultra", + "tierPro": "Profi", + "tierPlus": "Plus", + "tierFree": "Kostenlos", + "tierUnknown": "Unbekannt" + }, + "modals": { + "waitingAuth": "Warten auf Autorisierung", + "verificationUrl": "Verifizierungs-URL", + "yourCode": "Ihr Code", + "remoteAccess": "Fernzugriff:", + "connectedSuccess": "Erfolgreich verbunden!", + "connectionFailed": "Verbindung fehlgeschlagen", + "chooseAuthMethod": "Wählen Sie Ihre Authentifizierungsmethode:", + "awsBuilderId": "AWS Builder-ID", + "awsIamIdentity": "AWS IAM Identity Center", + "googleAccount": "Google-Konto", + "githubAccount": "GitHub-Konto", + "importToken": "Token importieren", + "pasteToken": "Aktualisierungstoken aus der Kiro-IDE einfügen.", + "awsRegion": "AWS-Region", + "autoDetecting": "Automatische Erkennung von Token...", + "readingFromCache": "Lesen aus dem AWS SSO-Cache", + "readingFromCursor": "Lesen aus der Cursor-IDE-Datenbank", + "initializing": "Initialisierung...", + "pricingConfig": "Preiskonfiguration", + "loadingPricing": "Preisdaten werden geladen...", + "pricingRatesFormat": "Preisformat", + "noPricingData": "Keine Preisdaten verfügbar", + "noModelsFound": "Keine Modelle gefunden" + }, + "loggers": { + "allProviders": "Alle Anbieter", + "allModels": "Alle Modelle", + "allAccounts": "Alle Konten", + "allApiKeys": "Alle API-Schlüssel", + "allTypes": "Alle Typen", + "allLevels": "Alle Ebenen", + "modelAZ": "Modell A-Z", + "modelZA": "Modell Z-A", + "loadingLogs": "Protokolle werden geladen...", + "loadingProxyLogs": "Proxy-Protokolle werden geladen...", + "noLogEntries": "Keine Protokolleinträge gefunden", + "noPayloadData": "Für diesen Protokolleintrag sind keine Nutzdaten verfügbar.", + "proxyEvent": "Proxy-Ereignis", + "proxy": "Stellvertreter", + "level": "Ebene", + "directNative": "Direkt (nativ)", + "combo": "Kombi", + "inputTokens": "Ich:", + "outputTokens": "O:" + }, + "stats": { + "usageOverview": "Nutzungsübersicht", + "outputTokens": "Ausgabetoken", + "totalCost": "Gesamtkosten", + "usageByModel": "Nutzung nach Modell", + "usageByAccount": "Nutzung nach Konto", + "failedToLoad": "Nutzungsstatistiken konnten nicht geladen werden.", + "tokenHealth": "Token-Gesundheit", + "totalOAuth": "Gesamt-OAuth", + "healthy": "Gesund", + "warning": "Warnung", + "errored": "Fehlerhaft", + "lastCheck": "Letzte Kontrolle", + "noData": "Keine Daten", + "share": "Teilen", + "unableToLoad": "Systemmetriken können nicht geladen werden", + "product": "Produkt", + "resources": "Ressourcen", + "company": "Unternehmen" + }, + "auth": { + "welcome": "Willkommen", + "signIn": "Melden Sie sich an", + "enterPassword": "Geben Sie Ihr Passwort ein, um fortzufahren", + "password": "Passwort", + "unifiedProxy": "Einheitlicher KI-API-Proxy", + "unifiedAiApiProxy": "Einheitlicher KI-API-Proxy", + "unifiedAiApiProxyDesc": "Leiten Sie Anfragen über einen einzigen Endpunkt an mehrere KI-Anbieter weiter. Integrierter Lastausgleich, Failover und Nutzungsverfolgung.", + "passwordNotEnabled": "Der Passwortschutz ist nicht aktiviert", + "loading": "Laden...", + "invalidPassword": "Ungültiges Passwort", + "errorOccurredRetry": "Es ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.", + "configureInstance": "Lassen Sie uns Ihre OmniRoute-Instanz konfigurieren", + "runOnboardingWizard": "Führen Sie den Onboarding-Assistenten aus, um Ihr Passwort einzurichten und Ihren ersten KI-Anbieter zu verbinden.", + "startOnboarding": "Beginnen Sie mit dem Onboarding", + "secureYourInstance": "Sichern Sie Ihre Instanz", + "setPasswordDescription": "Legen Sie ein Passwort fest, um Ihr Dashboard zu schützen und Ihre API-Endpunkte vor unbefugtem Zugriff zu schützen.", + "configurePassword": "Passwort konfigurieren", + "continue": "Weiter", + "windowWillClose": "Dieses Fenster wird automatisch geschlossen...", + "closeTabNow": "Sie können diesen Tab jetzt schließen.", + "copyUrlManual": "Kopieren Sie die URL aus der Adressleiste und fügen Sie sie in die Anwendung ein.", + "accessDeniedDescription": "Sie haben keine Berechtigung, auf diese Ressource zuzugreifen. Überprüfen Sie Ihren API-Schlüssel oder wenden Sie sich an den Administrator.", + "goToDashboard": "Gehen Sie zum Dashboard", + "featureMultiProviderTitle": "Multi-Provider", + "featureMultiProviderDesc": "OpenAI, Anthropic, Google und mehr", + "featureLoadBalancingTitle": "Lastausgleich", + "featureLoadBalancingDesc": "Verteilen Sie Anfragen intelligent", + "featureUsageTrackingTitle": "Nutzungsverfolgung", + "featureUsageTrackingDesc": "Überwachen Sie Kosten und Token", + "resetPassword": "Passwort zurücksetzen", + "resetDescription": "Wählen Sie eine Methode, um den Zugriff auf Ihr Dashboard wiederherzustellen", + "stopServer": "Stoppen Sie den OmniRoute-Server", + "processing": "Verarbeitung...", + "pleaseWait": "Bitte warten Sie, während wir die Autorisierung abschließen.", + "authSuccess": "Autorisierung erfolgreich!", + "copyUrl": "Kopieren Sie diese URL", + "accessDenied": "Zugriff verweigert", + "methodCliTitle": "Methode 1: CLI-Reset", + "methodCliDescription": "Führen Sie den folgenden Befehl auf dem Server aus, auf dem OmniRoute ausgeführt wird:", + "methodCliHint": "Dadurch werden Sie aufgefordert, ein neues Passwort festzulegen. Der Server muss zuerst gestoppt werden.", + "methodManualTitle": "Methode 2: Manuelles Zurücksetzen", + "methodManualDescription": "Löschen Sie das Passwort aus der Datenbank und legen Sie beim Start ein neues fest:", + "setPasswordInYour": "Legen Sie ein neues Passwort in Ihrer", + "fileLabelSuffix": "Datei:", + "newPasswordPlaceholder": "ihr_neues_passwort", + "deleteSettingsFile": "Löschen", + "orRemovePasswordHashField": "oder entfernen Sie das Feld „passwordHash“.", + "restartServerWithNewPassword": "Starten Sie den Server neu – er verwendet das neue Passwort", + "backToLogin": "Zurück zum Anmelden", + "forgotPassword": "Passwort vergessen?" + }, + "landing": { + "brandName": "OmniRoute", + "navigateHome": "Navigieren Sie zur Startseite", + "toggleMenu": "Menü umschalten", + "featuresLink": "Funktionen", + "docsLink": "Dokumente", + "github": "GitHub", + "versionLive": "v1.0 ist jetzt live", + "oneEndpoint": "Ein Endpunkt für", + "allProviders": "Alle KI-Anbieter", + "heroDescription": "KI-Endpunkt-Proxy mit Web-Dashboard – Eine JavaScript-Portierung von CLIProxyAPI. Funktioniert nahtlos mit Claude Code, OpenAI Codex, Cline, RooCode und anderen CLI-Tools.", + "getStarted": "Legen Sie los", + "viewOnGithub": "Auf GitHub ansehen", + "powerfulFeatures": "Leistungsstarke Funktionen", + "featuresSubtitle": "Alles, was Sie zum Verwalten Ihrer KI-Infrastruktur benötigen, an einem Ort, skalierbar.", + "featureUnifiedEndpointTitle": "Einheitlicher Endpunkt", + "featureUnifiedEndpointDesc": "Greifen Sie über eine einzige Standard-API-URL auf alle Anbieter zu.", + "featureEasySetupTitle": "Einfache Einrichtung", + "featureEasySetupDesc": "Mit dem Befehl npx können Sie in wenigen Minuten loslegen.", + "featureModelFallbackTitle": "Modell-Fallback", + "featureModelFallbackDesc": "Wechseln Sie automatisch den Anbieter bei Ausfall oder hoher Latenz.", + "featureUsageTrackingTitle": "Nutzungsverfolgung", + "featureUsageTrackingDesc": "Detaillierte Analysen und Kostenüberwachung für alle Modelle.", + "featureOAuthApiKeysTitle": "OAuth- und API-Schlüssel", + "featureOAuthApiKeysDesc": "Verwalten Sie Anmeldeinformationen sicher in einem Tresor.", + "featureCloudSyncTitle": "Cloud-Synchronisierung", + "featureCloudSyncDesc": "Synchronisieren Sie Ihre Konfigurationen sofort geräteübergreifend.", + "featureCliSupportTitle": "CLI-Unterstützung", + "featureCliSupportDesc": "Funktioniert mit Claude Code, Codex, Cline, Cursor und mehr.", + "featureDashboardTitle": "Armaturenbrett", + "featureDashboardDesc": "Visuelles Dashboard für Echtzeit-Verkehrsanalyse.", + "howItWorks": "So funktioniert OmniRoute", + "howItWorksDescription": "Die Daten fließen nahtlos von Ihrer Anwendung über unsere intelligente Routing-Ebene zum besten Anbieter für die jeweilige Aufgabe.", + "howItWorksStep1Title": "1. CLI und SDKs", + "howItWorksStep1Description": "Ihre Anfragen beginnen mit Ihren bevorzugten Tools oder unserem einheitlichen SDK. Ändern Sie einfach die Basis-URL.", + "howItWorksStep2Title": "2. OmniRoute-Hub", + "howItWorksStep2Description": "Unsere Engine analysiert die Eingabeaufforderung, überprüft den Zustand des Anbieters und leitet Routen auf niedrigste Latenz oder Kosten weiter.", + "howItWorksStep3Title": "3. KI-Anbieter", + "howItWorksStep3Description": "Die Anfrage wird von OpenAI, Anthropic, Gemini oder anderen sofort erfüllt.", + "getStartedIn30Seconds": "Beginnen Sie in 30 Sekunden", + "getStartedDescription": "Installieren Sie OmniRoute, konfigurieren Sie Ihre Anbieter über das Web-Dashboard und beginnen Sie mit der Weiterleitung von KI-Anfragen.", + "installOmniRoute": "Installieren Sie OmniRoute", + "installStepDescription": "Führen Sie den Befehl npx aus, um den Server sofort zu starten", + "openDashboard": "Öffnen Sie das Dashboard", + "openDashboardStepDescription": "Konfigurieren Sie Anbieter und API-Schlüssel über die Weboberfläche", + "routeRequests": "Routenanfragen", + "routeRequestsStepDescription": "Richten Sie Ihre CLI-Tools auf {endpoint}", + "terminal": "Terminal", + "copy": "Kopieren", + "copied": "✓ Kopiert", + "startingOmniRoute": "OmniRoute wird gestartet...", + "serverRunningOnLabel": "Server läuft weiter", + "dashboardLabel": "Armaturenbrett", + "readyToRoute": "Bereit zum Routen! ✓", + "configureProvidersNote": "📝 Konfigurieren Sie Anbieter im Dashboard oder verwenden Sie Umgebungsvariablen", + "dataLocation": "Datenspeicherort:", + "dataLocationMacLinux": " macOS/Linux:", + "dataLocationWindows": " Windows:", + "product": "Produkt", + "dashboardLink": "Armaturenbrett", + "changelog": "Änderungsprotokoll", + "resources": "Ressourcen", + "documentation": "Dokumentation", + "npm": "NPM", + "legal": "Legal", + "mitLicense": "MIT-Lizenz", + "footerTagline": "Der einheitliche Endpunkt für die KI-Generierung. Verbinden, leiten und verwalten Sie Ihre KI-Anbieter ganz einfach.", + "copyright": "© {year} OmniRoute. Alle Rechte vorbehalten.", + "flowToolClaudeCode": "Claude Code", + "flowToolOpenAICodex": "OpenAI-Codex", + "flowToolCline": "Cline", + "flowToolCursor": "Cursor", + "flowProviderOpenAI": "OpenAI", + "flowProviderAnthropic": "Anthropisch", + "flowProviderGemini": "Zwillinge", + "flowProviderGithubCopilot": "GitHub-Copilot", + "interactiveDiagram": "Interaktives Diagramm auf dem Desktop sichtbar", + "ctaTitle": "Sind Sie bereit, Ihre KI-Infrastruktur zu vereinfachen?", + "ctaDescription": "Schließen Sie sich Entwicklern an, die ihre KI-Integrationen mit OmniRoute optimieren. Open Source und kostenlos zu starten.", + "startFree": "Kostenlos starten", + "readDocumentation": "Dokumentation lesen" + }, + "docs": { + "title": "Dokumentation", + "quickStart": "Schnellstart", + "features": "Funktionen", + "supportedProviders": "Unterstützte Anbieter", + "supportedProvidersToc": "Anbieter", + "commonUseCases": "Häufige Anwendungsfälle", + "clientCompatibility": "Client-Kompatibilität", + "apiReference": "API-Referenz", + "method": "Methode", + "path": "Pfad", + "notes": "Notizen", + "modelPrefixes": "Modellpräfixe", + "prefix": "Präfix", + "troubleshooting": "Fehlerbehebung", + "supportsChat": "Unterstützt sowohl Chat- als auch Antwortendpunkte.", + "oauthAutoRefresh": "OAuth-Verbindung mit automatischer Token-Aktualisierung.", + "fullStreaming": "Volle Streaming-Unterstützung für alle Modelle.", + "docsLabel": "Dokumente", + "docsHeroDescription": "KI-Gateway für LLMs mit mehreren Anbietern. Ein Endpunkt für OpenAI, Anthropic, Gemini, GitHub Copilot, Claude Code, Cursor und über 20 weitere Anbieter.", + "openDashboard": "Öffnen Sie das Dashboard", + "endpointPage": "Endpunktseite", + "github": "GitHub", + "reportIssue": "Problem melden", + "onThisPage": "Auf dieser Seite", + "documentationVersion": "Dokumentation – v{version}", + "quickStartStep1Title": "1. Installieren und ausführen", + "quickStartStep1Prefix": "Lauf", + "quickStartStep1Middle": "oder von GitHub klonen und ausführen", + "quickStartStep2Title": "2. API-Schlüssel erstellen", + "quickStartStep2Text": "Gehen Sie zu Endpunkt -> Registrierte Schlüssel. Generieren Sie einen Schlüssel pro Umgebung.", + "quickStartStep3Title": "3. Anbieter verbinden", + "quickStartStep3Text": "Fügen Sie Anbieterkonten über OAuth-Login, API-Schlüssel oder kostenlose automatische Verbindung hinzu.", + "quickStartStep4Title": "4. Legen Sie die Client-Basis-URL fest", + "quickStartStep4Prefix": "Verweisen Sie Ihren IDE- oder API-Client auf", + "quickStartStep4Suffix": "Verwenden Sie beispielsweise das Provider-Präfix", + "featureRoutingTitle": "Multi-Provider-Routing", + "featureRoutingText": "Leiten Sie Anfragen über einen einzigen OpenAI-kompatiblen Endpunkt an über 30 KI-Anbieter weiter. Unterstützt Chat-, Antwort-, Audio- und Bild-APIs.", + "featureCombosTitle": "Combos und Balancing", + "featureCombosText": "Erstellen Sie Modellkombinationen mit Fallback-Ketten und Ausgleichsstrategien: Round-Robin, Priorität, Zufall, am wenigsten genutzt und kostenoptimiert.", + "featureUsageTitle": "Nutzungs- und Kostenverfolgung", + "featureUsageText": "Echtzeit-Token-Zählung, Kostenberechnung pro Anbieter/Modell und detaillierte Nutzungsaufschlüsselung nach API-Schlüssel und Konto.", + "featureAnalyticsTitle": "Analytics-Dashboard", + "featureAnalyticsText": "Visuelle Analysen mit Diagrammen für Anfragen, Token, Fehler, Latenz, Kosten und Modellpopularität im Zeitverlauf.", + "featureHealthTitle": "Gesundheitsüberwachung", + "featureHealthText": "Live-Zustandsprüfungen, Anbieterstatus, Leistungsschalterzustände und automatische Erkennung von Ratengrenzen mit exponentiellem Backoff.", + "featureCliTitle": "CLI-Tools", + "featureCliText": "Verwalten Sie IDE-Konfigurationen, exportieren/importieren Sie Backups, entdecken Sie Codex-Profile und konfigurieren Sie Einstellungen über das Dashboard.", + "featureSecurityTitle": "Sicherheit und Richtlinien", + "featureSecurityText": "API-Schlüsselauthentifizierung, IP-Filterung, Prompt-Injection-Guard, Domänenrichtlinien, Sitzungsverwaltung und Audit-Protokollierung.", + "featureCloudSyncTitle": "Cloud-Synchronisierung", + "featureCloudSyncText": "Synchronisieren Sie Ihre Konfiguration mit Cloudflare Workers für den Fernzugriff mit verschlüsselten Anmeldeinformationen und automatischem Failover.", + "providersAcrossConnectionTypes": "{count}-Anbieter über drei Verbindungstypen hinweg.", + "manageProviders": "Anbieter verwalten", + "providersCount": "{count} Anbieter", + "providerTypeFree": "Kostenloses Kontingent", + "providerTypeOAuth": "OAuth", + "providerTypeApiKey": "API-Schlüssel", + "useCaseSingleEndpointTitle": "Ein einziger Endpunkt für viele Anbieter", + "useCaseSingleEndpointText": "Verweisen Sie Clients auf eine Basis-URL und leiten Sie sie nach Modellpräfix weiter (z. B. gh/, cc/, kr/, openai/).", + "useCaseFallbackTitle": "Fallback und Modellwechsel mit Combos", + "useCaseFallbackText": "Erstellen Sie Kombinationsmodelle im Dashboard und halten Sie die Clientkonfiguration stabil, während die Anbieter intern rotieren.", + "useCaseUsageVisibilityTitle": "Nutzung, Kosten und Debug-Sichtbarkeit", + "useCaseUsageVisibilityText": "Verfolgen Sie Token und Kosten nach Anbieter, Konto und API-Schlüssel auf den Registerkarten „Nutzung“ und „Analyse“.", + "clientCherryStudioTitle": "Kirschstudio", + "baseUrlLabel": "Basis-URL", + "chatEndpointLabel": "Chat-Endpunkt", + "modelRecommendationLabel": "Modellempfehlung: explizites Präfix", + "clientCodexTitle": "Codex/GitHub-Copilot-Modelle", + "clientCodexBullet1": "Verwenden Sie Modell-IDs mit", + "clientCodexBullet2": "Modelle der Codex-Familie leiten automatisch zu", + "clientCodexBullet3": "Nicht-Codex-Modelle bleiben bestehen", + "clientCursorTitle": "Cursor-IDE", + "clientCursorBullet1": "Benutzen", + "clientCursorBullet1Suffix": "Präfix für Cursor-Modelle.", + "clientCursorBullet2": "OAuth-Verbindung – Anmeldung über die Anbieterseite.", + "clientClaudeTitle": "Claude Code / Antigravitation", + "clientClaudeBullet1Prefix": "Benutzen", + "clientClaudeBullet1Middle": "(Claude) oder", + "clientClaudeBullet1Suffix": "Präfix (Antigravitation).", + "endpointChatNote": "OpenAI-kompatibler Chat-Endpunkt (Standard).", + "endpointResponsesNote": "Antwort-API-Endpunkt (Codex, O-Serie).", + "endpointModelsNote": "Musterkatalog für alle angeschlossenen Anbieter.", + "endpointAudioNote": "Audiotranskription (Deepgram, AssemblyAI).", + "endpointImagesNote": "Bilderzeugung (NanoBanana).", + "endpointRewriteChatNote": "Rewrite-Helper für Clients ohne /v1.", + "endpointRewriteResponsesNote": "Hilfsprogramm für Antworten ohne /v1 umschreiben.", + "endpointRewriteModelsNote": "Hilfsprogramm für die Modellerkennung ohne /v1 umschreiben.", + "modelPrefixesDescriptionStart": "Verwenden Sie das Anbieterpräfix vor dem Modellnamen, um an einen bestimmten Anbieter weiterzuleiten. Beispiel:", + "modelPrefixesDescriptionEnd": "Routen zu GitHub Copilot.", + "provider": "Anbieter", + "type": "Typ", + "troubleshootingModelRouting": "Wenn der Client beim Modellrouting fehlschlägt, verwenden Sie einen expliziten Anbieter/ein explizites Modell (z. B. gh/gpt-5.1-codex).", + "troubleshootingAmbiguousModels": "Wenn Sie mehrdeutige Modellfehler erhalten, wählen Sie ein Anbieterpräfix anstelle einer bloßen Modell-ID.", + "troubleshootingCodexFamily": "Behalten Sie für Modelle der GitHub Codex-Familie das Modell bei gh/; Der Router wählt /responses automatisch aus.", + "troubleshootingTestConnection": "Verwenden Sie Dashboard > Anbieter > Verbindung testen, bevor Sie Tests mit IDEs oder externen Clients durchführen.", + "troubleshootingCircuitBreaker": "Wenn ein Anbieter anzeigt, dass der Leistungsschalter geöffnet ist, warten Sie auf die Abklingzeit oder schauen Sie auf der Seite „Zustand“ nach, um Einzelheiten zu erfahren.", + "troubleshootingOAuth": "Führen Sie bei OAuth-Anbietern eine erneute Authentifizierung durch, wenn die Token ablaufen. Überprüfen Sie die Statusanzeige der Anbieterkarte." + }, + "legal": { + "privacyPolicy": "Datenschutzrichtlinie", + "termsOfService": "Nutzungsbedingungen", + "providerConfigurations": "Anbieterkonfigurationen", + "apiKeys": "API-Schlüssel", + "usageLogs": "Nutzungsprotokolle", + "applicationSettings": "Anwendungseinstellungen", + "viewExportAnalytics": "Nutzungsanalysen anzeigen und exportieren", + "clearHistory": "Nutzungsverlauf jederzeit löschen", + "configureRetention": "Konfigurieren Sie Protokollaufbewahrungsrichtlinien", + "backupRestore": "Sichern Sie Ihre Datenbank und stellen Sie sie wieder her", + "privacyMetadataTitle": "Datenschutzrichtlinie | OmniRoute", + "privacyMetadataDescription": "Datenschutzrichtlinie für den OmniRoute AI API-Proxy-Router.", + "termsMetadataTitle": "Nutzungsbedingungen | OmniRoute", + "termsMetadataDescription": "Nutzungsbedingungen für den OmniRoute AI API-Proxy-Router.", + "backToHome": "Zurück nach Hause", + "lastUpdated": "Letzte Aktualisierung: {date}", + "policyLastUpdatedDate": "13. Februar 2026", + "listSeparator": "-", + "questionsVisit": "Fragen? Besuchen Sie unsere", + "githubRepository": "GitHub-Repository", + "privacySection1Title": "1. Local-First-Architektur", + "privacySection1Text": "OmniRoute ist als Local-First-Anwendung konzipiert. Die gesamte Datenverarbeitung und -speicherung erfolgt vollständig auf Ihrem Rechner. Es gibt keinen zentralen Server, der Ihre Daten sammelt.", + "privacySection2Title": "2. Von uns gespeicherte Daten", + "privacyDataStoredIn": "Die folgenden Daten werden lokal in gespeichert", + "privacyDataProviderConfigurationsDesc": "Verbindungs-URLs, Anbietertypen und Prioritätseinstellungen", + "privacyDataApiKeysDesc": "verschlüsselt und lokal gespeichert zur Authentifizierung bei KI-Anbietern", + "privacyDataUsageLogsDesc": "Anzahl der Anfragen, Token-Nutzung, Modellnamen, Zeitstempel und Antwortzeiten", + "privacyDataApplicationSettingsDesc": "Theme-Einstellungen, Routing-Strategie und Kombinationskonfigurationen", + "privacySection3Title": "3. Keine Telemetrie", + "privacySection3Text": "OmniRoute sammelt keine Telemetrie-, Analyse- oder Absturzberichte. Es werden keine Daten an uns oder Dritte übermittelt. Ihre Nutzungsmuster, API-Aufrufe und Konfigurationen bleiben vollständig privat.", + "privacySection4Title": "4. KI-Drittanbieter", + "privacySection4Text": "Wenn Sie API-Aufrufe über OmniRoute durchführen, werden Ihre Anfragen an die von Ihnen konfigurierten KI-Anbieter weitergeleitet (z. B. OpenAI, Anthropic, Google). Diese Anbieter haben eigene Datenschutzrichtlinien, die den Umgang mit Ihren Daten regeln. Bitte überprüfen Sie:", + "privacyOpenAiPolicy": "OpenAI-Datenschutzrichtlinie", + "privacyAnthropicPolicy": "Anthropic-Datenschutzrichtlinie", + "privacyGooglePolicy": "Google-Datenschutzerklärung", + "privacySection5Title": "5. Cloud-Synchronisierung (optional)", + "privacySection5Text": "Wenn Sie die optionale Cloud-Synchronisierungsfunktion aktivieren, können Anbieterkonfigurationen und API-Schlüssel an einen konfigurierten Cloud-Endpunkt übertragen werden. Diese Funktion ist standardmäßig deaktiviert und erfordert eine ausdrückliche Zustimmung.", + "privacySection6Title": "6. Protokollierung", + "privacyLoggingIntro": "Anforderungsprotokolle können über die Dashboard-Einstellungen konfiguriert werden. Sie können:", + "privacySection7Title": "7. Ihre Rechte", + "privacySection7TextStart": "Da alle Daten lokal gespeichert werden, haben Sie die volle Kontrolle. Sie können Ihre Daten jederzeit löschen, indem Sie das entfernen", + "privacySection7TextEnd": "Verzeichnis oder mithilfe der Datenbanksicherungs- und -wiederherstellungsfunktionen im Dashboard.", + "termsSection1Title": "1. Übersicht", + "termsSection1Text": "OmniRoute ist ein Local-First-AI-API-Proxy-Router, der vollständig auf Ihrem Computer ausgeführt wird. Es leitet Anfragen mit Lastausgleich, Failover und Nutzungsverfolgung an mehrere KI-Anbieter weiter.", + "termsSection2Title": "2. Verantwortlichkeiten des Benutzers", + "termsResponsibilityApiKeys": "Sie sind allein für die Verwaltung Ihrer eigenen API-Schlüssel und Anmeldeinformationen für KI-Drittanbieter (OpenAI, Anthropic, Google usw.) verantwortlich.", + "termsResponsibilityCompliance": "Sie müssen die Nutzungsbedingungen jedes KI-Anbieters einhalten, auf dessen API Sie über OmniRoute zugreifen.", + "termsResponsibilitySecurity": "Sie sind für die Sicherheit Ihrer lokalen OmniRoute-Installation verantwortlich, einschließlich der Festlegung eines Kennworts und der Einschränkung des Netzwerkzugriffs.", + "termsSection3Title": "3. Wie es funktioniert", + "termsSection3Text": "OmniRoute fungiert als zwischengeschalteter Proxy. An OmniRoute gesendete API-Aufrufe werden übersetzt und an Ihre konfigurierten KI-Anbieter weitergeleitet. OmniRoute ändert den Inhalt Ihrer Anfragen oder Antworten nicht über die erforderliche Protokollübersetzung hinaus.", + "termsSection4Title": "4. Datenverarbeitung", + "termsDataStoredLocally": "Alle Daten werden lokal auf Ihrem Computer in einer SQLite-Datenbank gespeichert.", + "termsNoTransmission": "OmniRoute überträgt keine Daten an externe Server, es sei denn, Sie aktivieren explizit Cloud-Synchronisierungsfunktionen.", + "termsDataLocationText": "Nutzungsprotokolle, API-Schlüssel und Konfiguration werden in gespeichert", + "termsSection5Title": "5. Haftungsausschluss", + "termsSection5Text": "OmniRoute wird „wie besehen“ ohne Gewährleistung jeglicher Art bereitgestellt. Wir sind nicht verantwortlich für Kosten, die durch API-Nutzung, Dienstunterbrechungen oder Datenverlust entstehen. Bewahren Sie immer Backups Ihrer Konfiguration auf.", + "termsSection6Title": "6. Open Source", + "termsSection6Text": "OmniRoute ist Open-Source-Software. Es steht Ihnen frei, es im Rahmen der Lizenzbedingungen zu prüfen, zu ändern und zu verbreiten." + } +} diff --git a/src/i18n/messages/en.json b/src/i18n/messages/en.json index 1e7ba97811..fa12288dda 100644 --- a/src/i18n/messages/en.json +++ b/src/i18n/messages/en.json @@ -192,7 +192,7 @@ "deleteConfirm": "Delete this API key?", "usageTips": "Usage Tips", "tipAuth": "Use API keys in the Authorization header as Bearer YOUR_KEY", - "tipSecure": "Keys are only shown once during creation \u2014 store them securely", + "tipSecure": "Keys are only shown once during creation — store them securely", "tipSeparate": "Create separate keys for different clients or environments", "tipRestrict": "Restrict keys to specific models for better security and cost control", "keyName": "Key Name", @@ -200,7 +200,7 @@ "keyNameDesc": "Choose a descriptive name to identify this key's purpose", "keyCreated": "API Key Created", "keyCreatedSuccess": "Key created successfully!", - "keyCreatedNote": "Copy and store this key now \u2014 it won't be shown again.", + "keyCreatedNote": "Copy and store this key now — it won't be shown again.", "done": "Done", "savePermissions": "Save Permissions", "allowAll": "Allow All", @@ -594,8 +594,8 @@ "syncing": "Syncing...", "disabling": "Disabling...", "cloudConnectedVerified": "Cloud Proxy connected and verified!", - "connectedVerificationPending": "Connected \u2014 verification pending", - "connectedVerificationPendingWithError": "Connected \u2014 verification pending: {error}", + "connectedVerificationPending": "Connected — verification pending", + "connectedVerificationPendingWithError": "Connected — verification pending: {error}", "cloudDisabledSuccess": "Cloud disabled successfully", "syncedSuccess": "Synced successfully", "failedDisable": "Failed to disable cloud", @@ -605,7 +605,7 @@ "cloudWorkerUnreachable": "Could not reach cloud worker. Make sure the cloud service is running (npm run dev in /cloud).", "connectionFailed": "Connection failed", "syncFailed": "Failed to sync cloud data", - "providerModelsTitle": "{provider} \u2014 Models", + "providerModelsTitle": "{provider} — Models", "noModelsForProvider": "No models available for this provider.", "chat": "Chat", "embedding": "Embedding", @@ -737,7 +737,7 @@ "confirmPasswordPlaceholder": "Confirm password", "passwordsMismatch": "Passwords do not match", "setupComplete": "Setup Complete!", - "goToDashboard": "Go to Dashboard \u2192", + "goToDashboard": "Go to Dashboard →", "welcomeDesc": "OmniRoute is your local AI API proxy. It routes requests to multiple AI providers with load balancing, failover, and usage tracking.", "multiProvider": "Multi-Provider", "usageTracking": "Usage Tracking", @@ -759,7 +759,8 @@ "retry": "Retry", "failedSetPassword": "Failed to set password. Try again.", "failedAddProvider": "Failed to add provider. Try again.", - "connectionError": "Connection error. Please try again." + "connectionError": "Connection error. Please try again.", + "provider": "Provider" }, "providers": { "title": "Providers", @@ -856,7 +857,7 @@ "apiTypeLabel": "API Type", "prefixHint": "Required. Unique prefix for model names.", "nameHint": "Required. A friendly label for this node.", - "baseUrlHint": "Required. \u2003Provider API base URL.", + "baseUrlHint": "Required. Provider API base URL.", "anthropicPrefixPlaceholder": "ac-prod", "openaiPrefixPlaceholder": "oc-prod", "anthropicBaseUrlPlaceholder": "https://api.anthropic.com/v1", @@ -989,7 +990,6 @@ "openaiCompatibleModelPlaceholder": "gpt-4o", "apiKeyValidationFailed": "API key validation failed. Please check your key and try again.", "addProviderApiKeyTitle": "Add {provider} API Key", - "apiKeyLabel": "API Key", "checking": "Checking...", "check": "Check", "valid": "Valid", diff --git a/src/i18n/messages/es.json b/src/i18n/messages/es.json new file mode 100644 index 0000000000..9f7474c79b --- /dev/null +++ b/src/i18n/messages/es.json @@ -0,0 +1,2040 @@ +{ + "common": { + "save": "Guardar", + "cancel": "Cancelar", + "delete": "Eliminar", + "loading": "Cargando...", + "error": "Se produjo un error", + "success": "Éxito", + "confirm": "¿Estás seguro?", + "refresh": "Actualizar", + "close": "Cerrar", + "add": "Añadir", + "edit": "Editar", + "search": "Buscar", + "back": "Atrás", + "next": "Siguiente", + "submit": "Enviar", + "reset": "Reiniciar", + "copy": "Copiar", + "copied": "¡Copiado!", + "enabled": "Habilitado", + "disabled": "Deshabilitado", + "active": "Activo", + "inactive": "Inactivo", + "noData": "No hay datos disponibles", + "configure": "Configurar", + "manage": "Administrar", + "name": "Nombre", + "actions": "Acciones", + "status": "Estado", + "type": "Tipo", + "model": "Modelo", + "models": "modelos", + "provider": "Proveedor", + "account": "Cuenta", + "time": "Hora", + "details": "Detalles", + "created": "Creado", + "lastUsed": "Usado por última vez", + "loadMore": "Cargar más", + "noResults": "No se encontraron resultados", + "reloadPage": "Recargar página", + "connected": "Conectado", + "disconnected": "desconectado", + "notConfigured": "No configurado", + "testConnection": "Conexión de prueba", + "enable": "Habilitar", + "disable": "Desactivar", + "columns": "Columnas", + "newest": "Más reciente", + "oldest": "Más antiguo", + "all": "Todos", + "none": "Ninguno", + "yes": "Sí", + "no": "No", + "warning": "Advertencia", + "note": "Nota", + "free": "Gratis", + "skipToContent": "Saltar al contenido" + }, + "sidebar": { + "home": "Inicio", + "dashboard": "Panel de control", + "providers": "Proveedores", + "combos": "Combos", + "usage": "Uso", + "analytics": "Analítica", + "costs": "Costos", + "health": "Salud", + "limits": "Límites y cuotas", + "cliTools": "Herramientas CLI", + "settings": "Configuración", + "translator": "Traductor", + "docs": "Documentación", + "issues": "Problemas", + "endpoint": "Punto final", + "apiManager": "Gestor de API", + "logs": "Registros", + "auditLog": "Registro de auditoría", + "shutdown": "Apagar", + "restart": "Reiniciar", + "shutdownConfirm": "¿Cerrar OmniRoute?", + "restartConfirm": "¿Reiniciar OmniRoute?", + "version": "v{version}", + "debug": "Depurar", + "system": "Sistema", + "help": "Ayuda", + "serverDisconnected": "Servidor desconectado", + "serverDisconnectedMsg": "El servidor proxy se ha detenido o se está reiniciando.", + "expandSidebar": "Expandir barra lateral", + "collapseSidebar": "Contraer barra lateral" + }, + "header": { + "logout": "Cerrar sesión", + "language": "Idioma", + "providers": "Proveedores", + "providerDescription": "Gestiona tus conexiones de proveedores de IA", + "combos": "Combos", + "comboDescription": "Combinaciones de modelos con fallback", + "usage": "Uso y análisis", + "usageDescription": "Supervise el uso de su API, el consumo de tokens y los registros de solicitudes", + "analytics": "Analíticas", + "analyticsDescription": "Gráficos, tendencias y conocimientos de evaluación", + "cliTools": "Herramientas CLI", + "cliToolsDescription": "Configurar herramientas CLI", + "home": "Inicio", + "homeDescription": "Bienvenido a OmniRoute", + "endpoint": "Punto final", + "endpointDescription": "Configuración del punto final API", + "settings": "Configuración", + "settingsDescription": "Gestiona tus preferencias", + "openaiCompatible": "Compatible con OpenAI", + "anthropicCompatible": "Compatible con Anthropic" + }, + "home": { + "quickStart": "Inicio rápido", + "quickStartDesc": "Empieza en 4 pasos. Conecta proveedores, enruta modelos y monitorea todo.", + "fullDocs": "Documentación completa", + "step1Title": "1. Crear clave API", + "step1Desc": "Ve a Endpoint -> Claves registradas. Genera una clave por entorno.", + "step2Title": "2. Conectar proveedores", + "step2Desc": "Agrega cuentas en Proveedores. Soporta OAuth, API Key y planes gratuitos.", + "step3Title": "3. Configura tu cliente", + "step3Desc": "Configura la URL base como {url} en tu IDE o cliente API.", + "step4Title": "4. Supervisar y optimizar", + "step4Desc": "Supervisa tokens, costos y errores en Registros y Analíticas.", + "providersOverview": "Descripción general de proveedores", + "configuredOf": "{configured} configurado de {total} proveedores disponibles", + "noModelsAvailable": "No hay modelos disponibles para este proveedor.", + "configureFirst": "Configure una conexión primero en {providers}", + "configureProvider": "Configurar proveedor", + "modelAvailable": "Modelo {count} disponible", + "modelsAvailable": "{count} modelos disponibles", + "connectionsActive": "{count} conexión activa", + "connectionsActivePlural": "{count} conexiones activas", + "copyModelName": "Copiar nombre del modelo", + "documentation": "Documentación", + "healthMonitor": "Monitor de salud", + "reportIssue": "Informar problema", + "activeError": "{active} activo · {errors} error", + "oauthLabel": "OAuth", + "apiKeyLabel": "Clave API", + "requestsShort": "{count} reqs", + "providerModelsTitle": "{provider} - Modelos", + "copiedModel": "Copiado: {model}", + "aliasLabel": "alias" + }, + "analytics": { + "title": "Analítica", + "overviewDescription": "Supervise sus patrones de uso de API, consumo de tokens, costos y tendencias de actividad en todos los proveedores y modelos.", + "evalsDescription": "Ejecute conjuntos de evaluación para probar y validar sus puntos finales de LLM. Compare la calidad del modelo, detecte regresiones y compare la latencia.", + "overview": "Descripción general", + "evals": "evaluaciones" + }, + "apiManager": { + "title": "Claves API", + "createKey": "Crear clave API", + "key": "clave", + "revokeKey": "Revocar clave", + "revokeConfirm": "¿Está seguro de que desea revocar esta clave API?", + "noKeys": "Aún no hay claves API", + "noKeysDesc": "Cree su primera clave API para autenticar solicitudes en su punto final", + "keyLabel": "Etiqueta clave", + "permissions": "Permisos", + "expiresAt": "Vence", + "never": "nunca", + "revoke": "Revocar", + "showKey": "Mostrar clave", + "hideKey": "Ocultar clave", + "copyKey": "Copiar clave API", + "allModels": "Todos los modelos", + "selectedModels": "Modelos seleccionados", + "readOnly": "Sólo lectura", + "fullAccess": "Acceso completo", + "keyManagement": "Gestión de claves API", + "keyManagementDesc": "Cree y administre claves API para autenticar solicitudes en su punto final", + "totalKeys": "Claves totales", + "restricted": "Restringido", + "totalRequests": "Solicitudes totales", + "modelsAvailable": "Modelos disponibles", + "registeredKeys": "Claves registradas", + "keysRegistered": "{count} claves registradas", + "keyRegistered": "{count} clave registrada", + "keysSecurityNote": "Cada clave aísla el seguimiento de uso y se puede revocar de forma independiente. Las claves se enmascaran después de su creación por motivos de seguridad.", + "createFirstKey": "Crea tu primera clave", + "name": "Nombre", + "usage": "Uso", + "created": "Creado", + "actions": "Acciones", + "reqs": "requisitos", + "neverUsed": "Nunca usado", + "deleteConfirm": "¿Eliminar esta clave API?", + "usageTips": "Consejos de uso", + "tipAuth": "Utilice claves API en el encabezado de Autorización como Portador YOUR_KEY", + "tipSecure": "Las claves solo se muestran una vez durante la creación: guárdelas de forma segura", + "tipSeparate": "Cree claves separadas para diferentes clientes o entornos", + "tipRestrict": "Restrinja las claves a modelos específicos para una mejor seguridad y control de costos", + "keyName": "Nombre clave", + "keyNamePlaceholder": "por ejemplo, clave de producción, clave de desarrollo", + "keyNameDesc": "Elija un nombre descriptivo para identificar el propósito de esta clave", + "keyCreated": "Clave API creada", + "keyCreatedSuccess": "¡Clave creada exitosamente!", + "keyCreatedNote": "Copie y almacene esta clave ahora; no se volverá a mostrar.", + "done": "hecho", + "savePermissions": "Guardar permisos", + "allowAll": "Permitir todo", + "restrict": "Restringir", + "allowAllInfo": "Esta clave puede acceder a todos los modelos disponibles.", + "restrictInfo": "Esta clave puede acceder a {selected} de {total} modelos.", + "selected": "{count} seleccionado", + "all": "Todos", + "clear": "Borrar", + "searchModels": "Buscar modelos por nombre o proveedor...", + "noModelsFound": "No se encontraron modelos", + "keyNameRequired": "El nombre de la clave es obligatorio", + "keyNameTooLong": "El nombre de la clave debe tener {max} caracteres o menos", + "keyNameInvalid": "El nombre de la clave solo puede contener letras, números, espacios, guiones y guiones bajos.", + "invalidKeyName": "Nombre de clave no válido", + "failedCreateKey": "No se pudo crear la clave", + "failedCreateKeyRetry": "No se pudo crear la clave. Por favor inténtalo de nuevo.", + "invalidKeyId": "ID de clave no válida", + "failedDeleteKey": "No se pudo eliminar la clave", + "failedDeleteKeyRetry": "No se pudo eliminar la clave. Por favor inténtalo de nuevo.", + "invalidModelsSelection": "Selección de modelos no válidos", + "cannotSelectMoreThanModels": "No se pueden seleccionar más de {max} modelos", + "failedUpdatePermissions": "No se pudieron actualizar los permisos", + "failedUpdatePermissionsRetry": "No se pudieron actualizar los permisos. Por favor inténtalo de nuevo.", + "unknownProvider": "desconocido", + "copyMaskedKey": "Copiar clave enmascarada", + "modelsCount": "{count, plural, one {# model} other {# models}}", + "lastUsedOn": "Último: {date}", + "editPermissions": "Editar permisos", + "deleteKey": "Eliminar clave", + "model": "{count} modelo", + "models": "{count} modelos", + "permissionsTitle": "Permisos: {name}", + "allowAllDesc": "Esta clave puede acceder a todos los modelos disponibles.", + "restrictDesc": "Esta clave puede acceder a {selectedCount} de {totalModels} modelos.", + "selectedCount": "{count} seleccionado" + }, + "auditLog": { + "title": "Registro de auditoría", + "searchPlaceholder": "Acciones de búsqueda...", + "action": "acción", + "actor": "Actor", + "target": "Objetivo", + "ipAddress": "Dirección IP", + "timestamp": "Marca de tiempo", + "noEntries": "No se encontraron entradas de auditoría", + "filterByAction": "Filtrar por acción...", + "filterByActor": "Filtrar por actor...", + "filterEntriesAria": "Filtrar entradas del registro de auditoría", + "filterByActionTypeAria": "Filtrar por tipo de acción", + "filterByActorAria": "Filtrar por actor", + "refreshAuditLogAria": "Actualizar el registro de auditoría", + "tableAria": "Entradas del registro de auditoría", + "failedFetchAuditLog": "No se pudo recuperar el registro de auditoría", + "notAvailable": "—", + "description": "Acciones administrativas y eventos de seguridad.", + "showing": "Mostrando entradas {count} (desplazamiento {offset})", + "previous": "Anterior" + }, + "cliTools": { + "title": "Herramientas CLI", + "noActiveProviders": "No hay proveedores activos", + "noActiveProvidersDesc": "Primero agregue y conecte proveedores para configurar las herramientas CLI.", + "mapModels": "Modelos de mapas", + "testConnection": "Conexión de prueba", + "connectionStatus": "Estado de conexión", + "configureEndpoint": "Configurar punto final", + "instructions": "Instrucciones", + "modelMapping": "Mapeo de modelos", + "baseUrl": "URL básica", + "apiKey": "Clave API", + "configured": "Configurado", + "notConfigured": "No configurado", + "notInstalled": "No instalado", + "custom": "personalizado", + "unknown": "Desconocido", + "lastSavedAt": "Último guardado: {date}", + "never": "nunca", + "justNow": "justo ahora", + "minutesAgoShort": "Hace {count}m", + "hoursAgoShort": "Hace {count}h", + "daysAgoShort": "Hace {count}d", + "monthsAgoShort": "hace {count} mes", + "yearsAgoShort": "Hace {count}y", + "runtimeCheckFailed": "Error en la comprobación del tiempo de ejecución", + "yourApiKeyPlaceholder": "tu-clave-api", + "modelPlaceholder": "proveedor/id-modelo", + "configurationSaved": "Configuración guardada exitosamente.", + "failedToSave": "No se pudo guardar la configuración.", + "noApiKeysCreateOne": "Sin claves API: cree una en la página Claves", + "defaultOmnirouteKey": "sk_omniroute (predeterminado)", + "selectModel": "Seleccionar modelo", + "selectModelForAlias": "Seleccione modelo para {alias}", + "selectModelForTool": "Seleccione modelo para {tool}", + "select": "Seleccionar", + "clear": "Borrar", + "comingSoon": "Próximamente", + "checkingRuntime": "Comprobando el estado del tiempo de ejecución...", + "guideOnlyIntegration": "Integración solo con guía (no se requiere tiempo de ejecución local)", + "cliRuntimeDetected": "Tiempo de ejecución de CLI detectado y listo", + "cliFoundNotRunnable": "CLI encontrada pero no ejecutable{reason}", + "cliRuntimeNotDetected": "Tiempo de ejecución CLI no detectado", + "binary": "binario", + "configPath": "Ruta de configuración", + "configPathShort": "configuración", + "failedCheckRuntimeStatus": "No se pudo verificar el estado del tiempo de ejecución.", + "copy": "Copiar", + "copied": "Copiado", + "copyConfig": "Copiar configuración", + "saveConfig": "Guardar configuración", + "selectionSaved": "Selección guardada", + "guide": "Guía", + "detected": "Detectado", + "notReady": "No listo", + "active": "Activo", + "inactive": "Inactivo", + "startMitm": "Iniciar MITM", + "stopMitm": "Detener MITM", + "mitmStarted": "¡MITM comenzó con éxito!", + "mitmStopped": "¡MITM se detuvo con éxito!", + "failedStart": "No se pudo iniciar MITM", + "failedStop": "No se pudo detener MITM", + "saveMappings": "Guardar asignaciones", + "mappingsSaved": "¡Asignaciones guardadas!", + "failedSaveMappings": "No se pudieron guardar las asignaciones", + "howItWorks": "Cómo funciona:", + "antigravityHowWorksDesc": "Antigravity envía solicitudes al punto final de Google. MITM los intercepta y los redirige a OmniRoute.", + "antigravityStep1": "1. Inicie MITM para enrutar solicitudes a través de OmniRoute.", + "antigravityStep2Prefix": "2. Agregar", + "antigravityStep2Suffix": "a su archivo de hosts como 127.0.0.1.", + "antigravityStep3": "3. Abra Antigravity y las solicitudes se enviarán por proxy.", + "sudoPasswordRequiredTitle": "Se requiere contraseña de Sudo", + "sudoPasswordHint": "Se requiere una contraseña de administrador para modificar el archivo de hosts y la configuración del proxy del sistema.", + "enterSudoPassword": "Ingrese la contraseña de sudo", + "sudoPasswordRequiredError": "Se requiere contraseña de Sudo.", + "cancel": "Cancelar", + "confirm": "Confirmar", + "settingsApplied": "¡La configuración se aplicó correctamente!", + "failedApplySettings": "No se pudo aplicar la configuración", + "settingsReset": "¡La configuración se restableció correctamente!", + "failedResetSettings": "No se pudo restablecer la configuración", + "backupRestored": "¡Copia de seguridad restaurada!", + "failedRestore": "No se pudo restaurar", + "checkingCli": "Comprobando {tool} CLI...", + "cliNotRunnable": "{tool} CLI instalada pero no ejecutable", + "cliNotInstalled": "{tool} CLI no instalado", + "cliNotDetected": "{tool} CLI no detectada", + "cliDetectedReady": "{tool} CLI detectada y lista", + "cliFoundFailedHealthcheck": "{tool} Se encontró CLI pero falló la verificación de estado del tiempo de ejecución{reason}.", + "installCliPrompt": "Instale {tool} CLI para utilizar esta función.", + "installCodexPrompt": "Instale Codex CLI para utilizar la función de aplicación automática.", + "hide": "Ocultar", + "howToInstall": "Cómo instalar", + "installationGuide": "Guía de instalación", + "platforms": "Mac OS/Linux/Windows:", + "afterInstallationRun": "Después de la instalación, ejecute", + "toVerify": "para verificar.", + "current": "Actual", + "baseUrlPlaceholder": "https://.../v1", + "resetToDefault": "Restablecer los valores predeterminados", + "providerModelPlaceholder": "proveedor/id-modelo", + "apply": "Aplicar", + "reset": "Reiniciar", + "manualConfig": "Configuración manual", + "backups": "Copias de seguridad", + "configBackups": "Configurar copias de seguridad", + "noBackupsYet": "Aún no hay copias de seguridad. Las copias de seguridad se crean automáticamente antes de cada aplicación o reinicio.", + "restore": "Restaurar", + "backupRestoredReloading": "¡Copia de seguridad restaurada! Estado de recarga...", + "failedRestoreBackup": "No se pudo restaurar la copia de seguridad", + "applied": "¡Aplicado!", + "failed": "Fallido", + "resetDone": "¡Reiniciar!", + "omnirouteConfiguredOpenAiCompatible": "OmniRoute está configurado como proveedor compatible con OpenAI", + "provider": "Proveedor", + "model": "modelo", + "providers": "Proveedores", + "auth": "autenticación", + "noApiKeysAvailable": "No hay claves API disponibles", + "usingDefaultOmniroute": "Usando por defecto: sk_omniroute", + "updateConfig": "Actualizar configuración", + "applyConfig": "Aplicar configuración", + "noBackupsAvailable": "No hay copias de seguridad disponibles.", + "profileSaved": "¡Perfil \"{name}\" guardado!", + "failedSaveProfile": "No se pudo guardar el perfil", + "profileActivated": "¡Perfil activado!", + "failedActivateProfile": "No se pudo activar el perfil", + "profiles": "Perfiles", + "savedProfiles": "Perfiles guardados", + "noProfilesYet": "Aún no se han guardado perfiles. Guarde la configuración actual como perfil a continuación.", + "activate": "Activar", + "deleteProfile": "Eliminar perfil", + "profileNamePlaceholder": "Nombre del perfil (por ejemplo, cuenta personal)", + "saveCurrent": "Guardar actual", + "codexAuthNotePrefix": "Usos del códice", + "codexAuthNoteMiddle": "con", + "codexAuthNoteSuffix": "Haga clic en \"Aplicar\" para configurar automáticamente.", + "claudeManualConfiguration": "Claude CLI - Configuración manual", + "codexManualConfiguration": "CLI del Codex: configuración manual", + "droidManualConfiguration": "Droid de fábrica - Configuración manual", + "openClawManualConfiguration": "Garra abierta - Configuración manual", + "clineManualConfiguration": "Configuración manual de línea", + "kiloManualConfiguration": "Configuración manual del código Kilo", + "toolDescriptions": { + "antigravity": "IDE antigravedad de Google con MITM", + "claude": "CLI del Código Antrópico Claude", + "codex": "CLI del Códice OpenAI", + "droid": "Asistente de IA de droide de fábrica", + "openclaw": "Asistente de IA Open Claw", + "cline": "CLI del asistente de codificación AI de Cline", + "kilo": "CLI del Asistente de Inteligencia Artificial de Kilo Code", + "cursor": "Editor de código AI del cursor", + "continue": "Continuar Asistente de IA" + }, + "guides": { + "cursor": { + "notes": { + "0": "Requiere una cuenta de Cursor Pro para utilizar esta función.", + "1": "El cursor enruta las solicitudes a través de su propio servidor, por lo que no se admite el punto final local. Habilite Cloud Endpoint en Configuración." + }, + "steps": { + "1": { + "title": "Abrir configuración", + "desc": "Vaya a Configuración -> Modelos" + }, + "2": { + "title": "Habilitar la API OpenAI", + "desc": "Habilite la opción \"Clave API OpenAI\"" + }, + "3": { + "title": "URL básica" + }, + "4": { + "title": "Clave API" + }, + "5": { + "title": "Agregar modelo personalizado", + "desc": "Haga clic en \"Ver todos los modelos\" -> \"Agregar modelo personalizado\"" + }, + "6": { + "title": "Seleccionar modelo" + } + } + }, + "continue": { + "steps": { + "1": { + "title": "Abrir configuración", + "desc": "Abrir el archivo de configuración Continuar" + }, + "2": { + "title": "Clave API" + }, + "3": { + "title": "Seleccionar modelo" + }, + "4": { + "title": "Agregar configuración de modelo", + "desc": "Agregue la siguiente configuración a su matriz de modelos:" + } + } + } + } + }, + "combos": { + "title": "combos", + "description": "Cree combinaciones de modelos con enrutamiento ponderado y soporte alternativo", + "createCombo": "Crear combinación", + "editCombo": "Editar combinación", + "deleteCombo": "Eliminar combinación", + "noModels": "Sin modelos", + "noModelsYet": "Aún no se han agregado modelos", + "addModel": "Agregar modelo", + "addModelToCombo": "Agregar modelo al combo", + "routingStrategy": "Estrategia de enrutamiento", + "maxRetries": "Reintentos máximos", + "timeout": "Tiempo de espera (ms)", + "healthcheck": "control de salud", + "priority": "Prioridad", + "fallback": "Respaldo", + "roundRobin": "Ronda Robin", + "random": "Aleatorio", + "leastLatency": "Menor latencia", + "comboName": "Nombre combinado", + "comboNamePlaceholder": "mi-combo", + "deleteConfirm": "¿Eliminar esta combinación?", + "noCombosYet": "Aún no hay combinaciones", + "comboCreated": "Combo creado exitosamente", + "comboUpdated": "Combo actualizado exitosamente", + "comboDeleted": "Combinación eliminada", + "failedCreate": "No se pudo crear el combo", + "failedUpdate": "No se pudo actualizar el combo", + "errorCreating": "Error al crear combo", + "errorUpdating": "Error al actualizar el combo", + "errorDeleting": "Error al eliminar el combo", + "testFailed": "La solicitud de prueba falló", + "failedToggle": "No se pudo alternar el combo", + "testResults": "Resultados de la prueba: {name}", + "resolvedBy": "Resuelto por:", + "more": "+{count} más", + "reqs": "requisitos", + "success": "éxito", + "proxyConfigured": "Proxy configurado", + "copyComboName": "Copiar nombre combinado", + "enableCombo": "Habilitar combinación", + "disableCombo": "Desactivar combinación", + "testCombo": "combinación de prueba", + "duplicate": "Duplicar", + "proxyConfig": "Configuración de proxy", + "nameRequired": "El nombre es obligatorio", + "nameInvalid": "Sólo letras, números, -, _, / y . permitido", + "nameHint": "Letras, números, -, _, / y . permitido", + "priorityDesc": "Retroceso secuencial: prueba primero el modelo 1, luego el 2, etc.", + "weightedDesc": "Distribuye el tráfico por porcentaje de peso con respaldo", + "roundRobinDesc": "Distribución circular: cada solicitud pasa al siguiente modelo en rotación", + "randomDesc": "Selección aleatoria uniforme y luego recurrir a los modelos restantes.", + "leastUsedDesc": "Elige el modelo con menos solicitudes y equilibra la carga a lo largo del tiempo.", + "costOptimizedDesc": "Rutas al modelo más barato primero según el precio", + "models": "Modelos", + "autoBalance": "Equilibrio automático", + "advancedSettings": "Configuración avanzada", + "retryDelay": "Retardo de reintento (ms)", + "concurrencyPerModel": "Concurrencia / Modelo", + "queueTimeout": "Tiempo de espera de cola (ms)", + "advancedHint": "Déjelo vacío para usar los valores predeterminados globales. Estos anulan la configuración por proveedor.", + "moveUp": "Subir", + "moveDown": "Bajar", + "removeModel": "Quitar", + "saving": "Guardando...", + "weighted": "ponderado", + "leastUsed": "Menos utilizado", + "costOpt": "Opción de costo" + }, + "costs": { + "title": "Costos", + "budget": "Presupuesto", + "totalCost": "Costo total", + "breakdown": "Desglose de costos", + "noData": "Sin datos de coste", + "byModel": "Por modelo", + "byProvider": "Por proveedor" + }, + "endpoint": { + "title": "Punto final API", + "available": "Puntos finales disponibles", + "cloudProxy": "Proxy en la nube", + "disableConfirm": "¿Está seguro de que desea desactivar el proxy en la nube?", + "baseUrl": "URL básica", + "apiKeyLabel": "Clave API", + "registeredKeys": "Claves registradas", + "chatCompletions": "Finalizaciones de chat", + "responses": "Respuestas", + "listModels": "Listar modelos", + "usingCloudProxy": "Usando el proxy en la nube", + "usingLocalServer": "Usando el servidor local", + "machineId": "ID de máquina: {id}...", + "disableCloud": "Deshabilitar la nube", + "enableCloud": "Habilitar la nube", + "modelsAcrossEndpoints": "{models} modelos en {endpoints} puntos finales", + "chatDesc": "Chat streaming y no streaming con todos los proveedores", + "embeddings": "Incrustaciones", + "embeddingsDesc": "Inserciones de texto para búsqueda y canales RAG", + "imageGeneration": "Generación de imágenes", + "imageDesc": "Generar imágenes a partir de mensajes de texto", + "rerank": "Reclasificar", + "rerankDesc": "Reclasificar documentos por relevancia para una consulta", + "audioTranscription": "Transcripción de audio", + "audioTranscriptionDesc": "Transcribir archivos de audio a texto (Whisper)", + "textToSpeech": "Texto a voz", + "textToSpeechDesc": "Convierta texto en voz con sonido natural", + "moderations": "Moderaciones", + "moderationsDesc": "Moderación de contenidos y clasificación de seguridad.", + "enableCloudTitle": "Habilitar proxy en la nube", + "whatYouGet": "lo que obtendrás", + "cloudBenefitAccess": "Accede a tu API desde cualquier parte del mundo", + "cloudBenefitShare": "Comparta el punto final con su equipo fácilmente", + "cloudBenefitPorts": "No es necesario abrir puertos ni configurar el firewall", + "cloudBenefitEdge": "Red de borde global rápida", + "cloudSessionNote": "Cloud mantendrá su sesión de autenticación durante 1 día. Si no se utiliza, se eliminará automáticamente.", + "cloudUnstableNote": "Actualmente, la nube es inestable con Claude Code OAuth en algunos casos.", + "cloudConnected": "¡Proxy en la nube conectado!", + "connectingToCloud": "Conectándose a la nube...", + "verifyingConnection": "Verificando conexión...", + "connecting": "Conectando...", + "verifying": "Verificando...", + "connected": "¡Conectado!", + "disableCloudTitle": "Deshabilitar el proxy en la nube", + "disableWarning": "Todas las sesiones de autenticación se eliminarán de la nube.", + "syncingData": "Sincronizando datos más recientes...", + "disablingCloud": "Deshabilitando la nube...", + "syncing": "Sincronizando...", + "disabling": "Desactivando...", + "cloudConnectedVerified": "¡Cloud Proxy conectado y verificado!", + "connectedVerificationPending": "Conectado: verificación pendiente", + "connectedVerificationPendingWithError": "Conectado - verificación pendiente: {error}", + "cloudDisabledSuccess": "Nube deshabilitada exitosamente", + "syncedSuccess": "Sincronizado exitosamente", + "failedDisable": "No se pudo desactivar la nube", + "failedEnable": "No se pudo habilitar la nube", + "cloudRequestTimeout": "Tiempo de espera de solicitud de nube", + "cloudRequestFailed": "Error en la solicitud de nube", + "cloudWorkerUnreachable": "No se pudo comunicar con el trabajador de la nube. Asegúrese de que el servicio en la nube se esté ejecutando (npm run dev en /cloud).", + "connectionFailed": "La conexión falló", + "syncFailed": "No se pudieron sincronizar los datos de la nube", + "providerModelsTitle": "{provider} — Modelos", + "noModelsForProvider": "No hay modelos disponibles para este proveedor.", + "chat": "Charla", + "embedding": "incrustar", + "image": "Imagen", + "custom": "personalizado", + "modelsCount": "{count, plural, one {# model} other {# models}}" + }, + "health": { + "title": "Estado del sistema", + "description": "Monitoreo en tiempo real de su instancia de OmniRoute", + "healthy": "saludable", + "degraded": "degradado", + "down": "abajo", + "uptime": "tiempo de actividad", + "memory": "Memoria", + "memoryRss": "Memoria (RSS)", + "heap": "montón", + "cpu": "CPU", + "database": "Base de datos", + "version": "Versión", + "lastCheck": "último cheque", + "providerHealth": "Salud del proveedor", + "systemMetrics": "Métricas del sistema", + "tokenHealth": "Salud del token", + "refreshAll": "Actualizar todo", + "checkNow": "Comprobar ahora", + "loadingHealth": "Cargando datos de salud...", + "failedToLoad": "No se pudieron cargar los datos de salud: {error}", + "retry": "Reintentar", + "allOperational": "Todos los sistemas operativos.", + "issuesDetected": "Problemas del sistema detectados", + "updatedAt": "Actualizado {time}", + "latency": "Latencia", + "latencyP50": "p50", + "latencyP95": "p95", + "latencyP99": "p99", + "millisecondsShort": "{value}ms", + "notAvailable": "—", + "totalRequests": "Solicitudes totales", + "noDataYet": "Aún no hay datos", + "promptCache": "Caché de aviso", + "entries": "Entradas", + "hitRate": "Tasa de aciertos", + "hitsMisses": "Aciertos/fallos", + "signatureCache": "Caché de firma", + "signatureDefaults": "Valores predeterminados", + "signatureTool": "Herramienta", + "signatureFamily": "familia", + "signatureSession": "Sesión", + "recovering": "Recuperando", + "noCBData": "No hay datos de disyuntores disponibles. Primero haga algunas solicitudes.", + "providerHealthStatusAria": "Estado de salud del proveedor", + "issuesLabel": "Problemas detectados", + "operational": "Operacional", + "providers": "Proveedores", + "healthyCount": "{count} saludable", + "nodeVersion": "Nodo {version}", + "failures": "{count} error", + "failuresPlural": "{count} fallas", + "lastFailure": "último", + "rateLimitStatus": "Estado del límite de tarifa", + "activeLimiters": "{count} limitador activo", + "activeLimitersPlural": "{count} limitadores activos", + "queued": "En cola", + "queuedCount": "{count} en cola", + "running": "corriendo", + "runningCount": "{count} ejecutándose", + "ok": "bien", + "activeLockouts": "Bloqueos activos", + "resetConfirm": "¿Restablecer todos los disyuntores a un estado saludable? Esto borrará todos los recuentos de fallas y restaurará todos los proveedores al estado operativo.", + "resetAllTitle": "Restablezca todos los disyuntores al estado saludable", + "resetting": "Restableciendo...", + "resetAll": "Restablecer todo", + "until": "Hasta {time}" + }, + "limits": { + "title": "Límites y cuotas", + "rateLimit": "Límite de tarifa", + "remaining": "restante", + "requestsPerMinute": "Solicitudes/min", + "tokensPerMinute": "Fichas/min", + "dailyLimit": "Límite diario" + }, + "logs": { + "title": "Registros", + "requestLogs": "Solicitar registros", + "proxyLogs": "Registros de proxy", + "auditLog": "Registro de auditoría", + "console": "Consola", + "auditLogDesc": "Acciones administrativas y eventos de seguridad.", + "loading": "Cargando...", + "refresh": "Actualizar", + "filterByAction": "Filtrar por acción...", + "filterByActor": "Filtrar por actor...", + "filterEntriesAria": "Filtrar entradas del registro de auditoría", + "filterByActionTypeAria": "Filtrar por tipo de acción", + "filterByActorAria": "Filtrar por actor", + "refreshAuditLogAria": "Actualizar el registro de auditoría", + "tableAria": "Entradas del registro de auditoría", + "failedFetchAuditLog": "No se pudo recuperar el registro de auditoría", + "showing": "Mostrando entradas {count} (desplazamiento {offset})", + "search": "Buscar", + "timestamp": "Marca de tiempo", + "action": "acción", + "actor": "Actor", + "target": "Objetivo", + "details": "Detalles", + "ipAddress": "Dirección IP", + "notAvailable": "—", + "noEntries": "No se encontraron entradas del registro de auditoría", + "previous": "Anterior", + "next": "Siguiente" + }, + "onboarding": { + "welcome": "Bienvenido", + "security": "Seguridad", + "test": "prueba", + "ready": "¡Listo!", + "setPassword": "Establecer contraseña", + "addProvider": "Añade tu primer proveedor", + "getStarted": "Empezar", + "skip": "Saltar", + "skipWizard": "Saltar asistente por completo", + "skipPassword": "Saltar configuración de contraseña", + "skipAndContinue": "Saltar y continuar", + "passwordLabel": "Contraseña", + "confirmPassword": "Confirmar contraseña", + "enterPassword": "Introduce la contraseña", + "confirmPasswordPlaceholder": "Confirmar contraseña", + "passwordsMismatch": "Las contraseñas no coinciden", + "setupComplete": "¡Configuración completa!", + "goToDashboard": "Ir al Panel →", + "welcomeDesc": "OmniRoute es su proxy API de IA local. Enruta solicitudes a múltiples proveedores de IA con equilibrio de carga, conmutación por error y seguimiento de uso.", + "multiProvider": "Multiproveedor", + "usageTracking": "Seguimiento de uso", + "apiKeyMgmt": "Gestión de claves API", + "securityDesc": "Establezca una contraseña para proteger su panel u omítala por ahora.", + "providerDesc": "Conecte su primer proveedor de IA. Puedes agregar más más tarde.", + "apiKeyRequired": "Clave API (obligatoria)", + "customUrlOptional": "URL personalizada (opcional)", + "testDesc": "Verifiquemos que la conexión de su proveedor funcione.", + "runTest": "Ejecutar prueba de conexión", + "testingConnection": "Probando conexión...", + "connectionSuccessful": "¡Conexión exitosa! Su proveedor está listo.", + "noProviderFound": "No se encontró ningún proveedor. Puede agregar uno desde el panel más tarde.", + "testFailed": "La prueba falló, pero puedes configurar esto más tarde.", + "couldNotTest": "No se pudo realizar la prueba en este momento. Puedes probar desde el panel.", + "doneDesc": "¡Estás listo! Su instancia de OmniRoute está configurada y lista para enviar solicitudes de IA.", + "yourEndpoint": "Su punto final:", + "continue": "Continuar", + "retry": "Reintentar", + "failedSetPassword": "No se pudo establecer la contraseña. Intentar otra vez.", + "failedAddProvider": "No se pudo agregar el proveedor. Intentar otra vez.", + "connectionError": "Error de conexión. Por favor inténtalo de nuevo.", + "provider": "Proveedor" + }, + "providers": { + "title": "Proveedores", + "addProvider": "Agregar proveedor", + "editProvider": "Editar proveedor", + "deleteProvider": "Eliminar proveedor", + "noProviders": "No hay proveedores configurados", + "modelAvailability": "Disponibilidad del modelo", + "accounts": "Cuentas", + "newAccount": "Nueva cuenta", + "deleteConfirm": "¿Está seguro de que desea eliminar este proveedor?", + "testing": "Probando...", + "testConnection": "Conexión de prueba", + "testSuccess": "Conexión exitosa", + "testFailed": "La conexión falló", + "available": "Disponible", + "cooldown": "Enfriamiento", + "unavailable": "No disponible", + "unknown": "Desconocido", + "oauthLabel": "OAuth", + "compatibleLabel": "compatibles", + "chat": "Charla", + "responses": "Respuestas", + "messages": "Mensajes", + "oauthProviders": "Proveedores de OAuth", + "freeProviders": "Proveedores gratuitos", + "apiKeyProviders": "Proveedores de claves API", + "compatibleProviders": "Proveedores compatibles con claves API", + "testAll": "Probar todo", + "testAllOAuth": "Pruebe todas las conexiones OAuth", + "testAllFree": "Pruebe todas las conexiones gratuitas", + "testAllApiKey": "Pruebe todas las conexiones de clave API", + "testAllCompatible": "Pruebe todas las conexiones compatibles", + "connected": "{count} Conectado", + "errorCount": "{count} Error ({code})", + "errorCountNoCode": "{count} Error", + "noConnections": "Sin conexiones", + "disabled": "Discapacitado", + "enableProvider": "Habilitar proveedor", + "disableProvider": "Deshabilitar proveedor", + "testResults": "Resultados de la prueba", + "noCompatibleYet": "Aún no se han agregado proveedores compatibles", + "compatibleHint": "Utilice los botones de arriba para agregar puntos finales compatibles con OpenAI o Anthropic", + "addOpenAICompatible": "Agregar compatibilidad con OpenAI", + "addAnthropicCompatible": "Añadir compatible antrópico", + "addNewProvider": "Agregar nuevo proveedor", + "backToProviders": "Volver a Proveedores", + "configureNewProvider": "Configure un nuevo proveedor de IA para usarlo con sus aplicaciones.", + "providerLabel": "Proveedor", + "selectProvider": "Seleccione un proveedor", + "selectedProvider": "Proveedor seleccionado", + "authMethod": "Método de autenticación", + "apiKeyLabel": "Clave API", + "apiKeyRequired": "Se requiere clave API", + "selectProviderRequired": "Por favor seleccione un proveedor", + "enterApiKey": "Ingrese su clave API", + "apiKeySecure": "Su clave API se cifrará y almacenará de forma segura.", + "oauth2Connect": "Conéctate con OAuth2", + "oauth2Label": "OAuth2", + "oauth2Desc": "Conecte su cuenta mediante la autenticación OAuth2.", + "displayName": "Nombre para mostrar", + "displayNamePlaceholder": "por ejemplo, API de producción, entorno de desarrollo", + "displayNameHint": "Opcional. Un nombre descriptivo para identificar esta configuración.", + "active": "Activo", + "activeDescription": "Habilite este proveedor para usarlo en sus aplicaciones", + "cancel": "Cancelar", + "createProvider": "Crear proveedor", + "failedCreate": "No se pudo crear el proveedor", + "errorOccurred": "Se produjo un error. Por favor inténtalo de nuevo.", + "modelStatus": "Estado del modelo", + "allModelsOperational": "Todos los modelos operativos.", + "modelsWithIssues": "{count} modelo(s) con problemas", + "allModelsNormal": "Todos los modelos están respondiendo normalmente.", + "cooldownCleared": "Tiempo de reutilización borrado para {model}", + "failedClearCooldown": "No se pudo borrar el tiempo de reutilización", + "loadingAvailability": "Cargando disponibilidad de modelos...", + "clearCooldown": "Borrar", + "clearing": "Limpiando...", + "until": "Hasta {time}", + "providerTestFailed": "La prueba del proveedor falló", + "modeTest": "{mode} Prueba", + "passedCount": "{count} pasó", + "failedCount": "{count} falló", + "testedCount": "{count} probado", + "millisecondsAbbr": "{value}ms", + "okShort": "bien", + "errorShort": "ERROR", + "noActiveConnectionsInGroup": "No se encontraron conexiones activas para este grupo.", + "allTestsPassed": "Todas las pruebas {total} pasaron", + "testSummary": "{passed}/{total} pasó, {failed} falló", + "nameLabel": "Nombre", + "prefixLabel": "Prefijo", + "baseUrlLabel": "URL básica", + "apiTypeLabel": "Tipo de API", + "prefixHint": "Requerido. Prefijo único para nombres de modelos.", + "nameHint": "Requerido. Una etiqueta amigable para este nodo.", + "baseUrlHint": "Requerido. URL base de la API del proveedor.", + "anthropicPrefixPlaceholder": "producto ac", + "openaiPrefixPlaceholder": "oc-prod", + "anthropicBaseUrlPlaceholder": "https://api.anthropic.com/v1", + "openaiBaseUrlPlaceholder": "https://api.openai.com/v1", + "validateConnection": "Validar conexión", + "validating": "Validando...", + "connectionValid": "¡La conexión es válida!", + "connectionFailed": "La conexión falló. Verifique la URL y la clave.", + "testKeyLabel": "Clave API de prueba", + "testKeyPlaceholder": "sk-... (solo para validación)", + "providerNotFound": "Proveedor no encontrado", + "deleteConnectionConfirm": "¿Eliminar esta conexión?", + "failedSetAlias": "No se pudo establecer el alias", + "failedSaveConnection": "No se pudo guardar la conexión", + "failedSaveConnectionRetry": "No se pudo guardar la conexión. Por favor inténtalo de nuevo.", + "failedRetestConnection": "No se pudo volver a probar la conexión", + "deleteCompatibleNodeConfirm": "¿Eliminar este {type} nodo compatible?", + "anthropicCompatibleDetails": "Detalles compatibles antrópicos", + "openaiCompatibleDetails": "Detalles compatibles con OpenAI", + "messagesApi": "API de mensajes", + "responsesApi": "API de respuestas", + "chatCompletions": "Finalizaciones de chat", + "importingModels": "Importando...", + "importFromModels": "Importar desde /modelos", + "addConnectionToImport": "Agregue una conexión para permitir la importación.", + "noModelsConfigured": "No hay modelos configurados", + "connectionCount": "{count} conexión(es)", + "fetchingModels": "Recuperando modelos disponibles...", + "failedFetchModels": "No se pudieron recuperar los modelos", + "noModelsFound": "No se encontraron modelos", + "importFailed": "Importación fallida", + "noNewModelsAdded": "No se agregaron nuevos modelos.", + "adding": "Añadiendo...", + "importingModelsTitle": "Importar modelos", + "copyModel": "Copiar modelo", + "removeModel": "Quitar modelo", + "rateLimitProtected": "Protegido", + "rateLimitUnprotected": "Desprotegido", + "enableRateLimitProtection": "Haga clic para habilitar la protección del límite de velocidad", + "disableRateLimitProtection": "Haga clic para desactivar la protección del límite de velocidad", + "productionKey": "Clave de producción", + "enterNewApiKey": "Ingrese la nueva clave API", + "optional": "Opcional", + "anthropicCompatibleName": "Compatible antrópico", + "openaiCompatibleName": "Compatible con OpenAI", + "failedImportModels": "No se pudieron importar modelos", + "noModelsReturnedFromEndpoint": "No se devolvieron modelos desde el punto final /models.", + "importingModelsProgress": "Importando {current} de {total} modelos...", + "foundModelsStartingImport": "Se encontraron {count} modelos. Iniciando importación...", + "importingModelById": "Importando {modelId}...", + "importSuccessCount": "¡Importado exitosamente {count, plural, one {# model} other {# models}}!", + "noNewModelsAddedExisting": "No se agregaron nuevos modelos (todos ya existen).", + "importDoneCount": "✓ ¡Listo! {count, plural, one {# model imported.} other {# models imported.}}", + "unexpectedErrorOccurred": "Ocurrió un error inesperado", + "connectionCountLabel": "{count, plural, one {# connection} other {# connections}}", + "messagesPath": "mensajes", + "responsesPath": "respuestas", + "chatCompletionsPath": "chat/finalizaciones", + "add": "Añadir", + "edit": "Editar", + "delete": "Eliminar", + "anthropic": "antrópico", + "openai": "AbiertoAI", + "singleConnectionPerCompatible": "Sólo se permite una conexión por nodo compatible. Agregue otro nodo si necesita más conexiones.", + "connections": "Conexiones", + "providerProxyTitleConfigured": "Proxy del proveedor: {host}", + "configured": "configurado", + "providerProxyConfigureHint": "Configurar proxy para todas las conexiones de este proveedor", + "providerProxy": "Proxy del proveedor", + "noConnectionsYet": "Aún no hay conexiones", + "addFirstConnectionHint": "Agregue su primera conexión para comenzar", + "addConnection": "Agregar conexión", + "availableModels": "Modelos disponibles", + "pageAutoRefresh": "La página se actualizará automáticamente...", + "statusDisabled": "discapacitado", + "statusConnected": "conectado", + "statusRuntimeIssue": "problema de tiempo de ejecución", + "statusAuthFailed": "autenticación fallida", + "statusRateLimited": "tarifa limitada", + "statusNetworkIssue": "problema de red", + "statusTestUnsupported": "prueba no compatible", + "statusUnavailable": "no disponible", + "statusFailed": "falló", + "statusError": "error", + "oauthAccount": "Cuenta OAuth", + "errorTypeRuntime": "Tiempo de ejecución local", + "errorTypeUpstreamAuth": "autenticación ascendente", + "errorTypeMissingCredential": "credencial faltante", + "errorTypeRefreshFailed": "Error al actualizar", + "errorTypeTokenExpired": "Token caducado", + "errorTypeRateLimited": "Tarifa limitada", + "errorTypeUpstreamUnavailable": "Upstream no disponible", + "errorTypeNetworkError": "error de red", + "errorTypeTestUnsupported": "Prueba no compatible", + "errorTypeUpstreamError": "Error ascendente", + "proxySourceGlobal": "Mundial", + "proxySourceProvider": "Proveedor", + "proxySourceKey": "clave", + "proxyConfiguredBySource": "Proxy ({source}): {host}", + "autoPriority": "Automático: {priority}", + "proxy": "apoderado", + "retestAuthentication": "Volver a probar la autenticación", + "retest": "Volver a probar", + "disableConnection": "Desactivar conexión", + "enableConnection": "Habilitar conexión", + "reauthenticateConnection": "Volver a autenticar esta conexión", + "proxyConfig": "Configuración de proxy", + "aliasExistsAlert": "El alias \"{alias}\" ya existe. Utilice un modelo diferente o edite el alias existente.", + "openRouterAnyModelHint": "OpenRouter admite cualquier modelo. Agregue modelos y cree alias para un acceso rápido.", + "modelIdFromOpenRouter": "ID del modelo (de OpenRouter)", + "openRouterModelPlaceholder": "antrópico/claude-3-opus", + "customModels": "Modelos personalizados", + "customModelsHint": "Agregue ID de modelo que no estén en la lista predeterminada. Estos estarán disponibles para enrutamiento.", + "modelId": "ID del modelo", + "customModelPlaceholder": "por ej. gpt-4.5-turbo", + "loading": "Cargando...", + "removeCustomModel": "Eliminar modelo personalizado", + "noCustomModels": "Aún no se han agregado modelos personalizados.", + "allSuggestedAliasesExist": "Todos los alias sugeridos ya existen. Elija un modelo diferente o elimine los alias conflictivos.", + "failedSaveCustomModel": "No se pudo guardar el modelo personalizado", + "modelAddedSuccess": "Modelo {modelId} agregado exitosamente", + "failedAddModelTryAgain": "No se pudo agregar el modelo. Por favor inténtalo de nuevo.", + "failedSaveImportedModel": "No se pudo guardar el modelo importado en la base de datos personalizada", + "failedImportModelsTryAgain": "No se pudieron importar modelos. Por favor inténtalo de nuevo.", + "failedRemoveModelFromDatabase": "No se pudo eliminar el modelo de la base de datos", + "modelRemovedSuccess": "Modelo eliminado correctamente", + "failedDeleteModelTryAgain": "No se pudo eliminar el modelo. Por favor inténtalo de nuevo.", + "compatibleModelsDescription": "Agregue modelos compatibles con {type} manualmente o impórtelos desde el punto final /models.", + "anthropicCompatibleModelPlaceholder": "claude-3-opus-20240229", + "openaiCompatibleModelPlaceholder": "gpt-4o", + "apiKeyValidationFailed": "La validación de la clave API falló. Por favor verifique su clave e inténtelo nuevamente.", + "addProviderApiKeyTitle": "Agregar clave API {provider}", + "checking": "Comprobando...", + "check": "comprobar", + "valid": "Válido", + "invalid": "Inválido", + "creating": "Creando...", + "validationChecksAnthropicCompatible": "La validación verifica {provider} verificando la clave API.", + "validationChecksOpenAiCompatible": "La validación verifica {provider} a través de /models en su URL base.", + "priorityLabel": "Prioridad", + "saving": "Guardando...", + "save": "Guardar", + "editConnection": "Editar conexión", + "accountName": "Nombre de cuenta", + "email": "Correo electrónico", + "healthCheckMinutes": "Control de salud (min)", + "healthCheckHint": "Intervalo de actualización de token proactivo. 0 = deshabilitado.", + "failedTestConnection": "No se pudo probar la conexión", + "failed": "Fallido", + "leaveBlankKeepCurrentApiKey": "Déjelo en blanco para conservar la clave API actual.", + "editCompatibleTitle": "Editar {type} Compatible", + "compatibleBaseUrlHint": "Utilice la URL base (que termina en /v1) para su API compatible con {type}.", + "apiKeyForCheck": "Clave API (para verificación)", + "compatibleProdPlaceholder": "{type} Compatible (Prod.)" + }, + "settings": { + "title": "Configuración", + "general": "generales", + "security": "Seguridad", + "appearance": "Apariencia", + "routing": "Enrutamiento", + "cache": "caché", + "resilience": "Resiliencia", + "systemPrompt": "Aviso del sistema", + "thinkingBudget": "Pensando en el presupuesto", + "proxy": "apoderado", + "pricing": "Precios", + "storage": "Almacenamiento", + "policies": "Políticas", + "ipFilter": "Filtro IP", + "comboDefaults": "Valores predeterminados combinados", + "fallbackChains": "Cadenas de respaldo", + "changePassword": "Cambiar contraseña", + "enablePassword": "Habilitar contraseña", + "darkMode": "Modo oscuro", + "lightMode": "Modo de luz", + "systemTheme": "Tema del sistema", + "enableCache": "Habilitar caché", + "cacheTTL": "TTL de caché", + "maxCacheSize": "Tamaño máximo de caché", + "clearCache": "Borrar caché", + "cacheHits": "Visitas de caché", + "cacheMisses": "Errores de caché", + "hitRate": "Tasa de aciertos", + "cacheEntries": "Entradas de caché", + "circuitBreaker": "Disyuntor", + "retryPolicy": "Política de reintento", + "maxRetries": "Reintentos máximos", + "retryDelay": "Retardo de reintento", + "timeoutMs": "Tiempo de espera (ms)", + "enableSystemPrompt": "Habilitar mensaje del sistema", + "systemPromptText": "Texto de aviso del sistema", + "enableThinking": "Habilitar el pensamiento", + "maxThinkingTokens": "Fichas de pensamiento máximo", + "enableProxy": "Habilitar proxy", + "proxyUrl": "URL de proxy", + "pricingRates": "Formato de tarifas de precios", + "currentPricing": "Resumen de precios actuales", + "loadingPricing": "Cargando datos de precios...", + "noPricing": "No hay datos de precios disponibles", + "input": "Entrada", + "output": "Salida", + "cached": "En caché", + "reasoning": "Razonamiento", + "cacheCreation": "Creación de caché", + "customPricing": "Precios personalizados", + "databaseSize": "Tamaño de la base de datos", + "backupDb": "Base de datos de respaldo", + "restoreDb": "Restaurar base de datos", + "exportData": "Exportar datos", + "importData": "Importar datos", + "clearData": "Borrar todos los datos", + "clearDataConfirm": "Esto eliminará permanentemente todos los datos. ¿Está seguro?", + "enableRequestLogs": "Habilitar registros de solicitudes", + "logRetention": "Retención de registros", + "ipWhitelist": "Lista blanca de IP", + "ipBlacklist": "Lista negra de IP", + "addIP": "Agregar IP", + "savedSuccessfully": "Configuración guardada exitosamente", + "ai": "IA", + "advanced": "Avanzado", + "localMode": "Modo local: todos los datos almacenados en su máquina", + "settingsSectionsAria": "Secciones de configuración", + "switchThemes": "Cambiar entre temas claros y oscuros", + "themeSelectionAria": "Selección de tema", + "themeLight": "Luz", + "themeDark": "oscuro", + "themeSystem": "Sistema", + "hideHealthLogs": "Ocultar registros de verificación de estado", + "hideHealthLogsDesc": "Cuando está activado, suprime los mensajes [HealthCheck] en la consola del servidor", + "promptCache": "Caché de aviso", + "flushCache": "Vaciar caché", + "flushing": "Sonrojándose…", + "size": "Tamaño", + "hits": "Visitas", + "evictions": "Desalojos", + "loadingCacheStats": "Cargando estadísticas de caché…", + "globalProxy": "Proxy global", + "globalProxyDesc": "Configure un proxy saliente global para todas las llamadas API. Los proveedores individuales, los combos y las claves pueden anular esto.", + "noGlobalProxy": "No hay ningún proxy global configurado", + "globalLabel": "Mundial", + "configure": "Configurar", + "globalSystemPrompt": "Aviso del sistema global", + "systemPromptDesc": "Inyectado en todas las solicitudes a nivel de proxy", + "saved": "Guardado", + "systemPromptPlaceholder": "Ingrese el mensaje del sistema para inyectar en todas las solicitudes...", + "systemPromptHint": "Este mensaje se antepone al mensaje del sistema de cada solicitud. Úselo para instrucciones globales, pautas de seguridad o reglas de formato de respuesta.", + "chars": "{count} caracteres", + "thinkingBudgetTitle": "Pensando en el presupuesto", + "thinkingBudgetDesc": "Controle el uso del token de razonamiento de IA en todas las solicitudes", + "passthrough": "Paso a través", + "passthroughDesc": "Sin cambios: el cliente controla el presupuesto pensando en", + "auto": "Automático", + "autoDesc": "Elimine toda configuración de pensamiento: deje que el proveedor decida", + "custom": "personalizado", + "customDesc": "Establecer un presupuesto de token fijo para todas las solicitudes", + "adaptive": "Adaptativo", + "adaptiveDesc": "Escale el presupuesto según la complejidad de la solicitud", + "effortNone": "Ninguno (0 fichas)", + "effortLow": "Bajo (1K tokens)", + "effortMedium": "Medio (10.000 tokens)", + "effortHigh": "Alto (128.000 tokens)", + "tokenBudget": "Presupuesto simbólico", + "tokens": "fichas", + "baseEffortLevel": "Nivel de esfuerzo base", + "adaptiveHint": "El modo adaptable escala desde este nivel base según el recuento de mensajes, el uso de herramientas y la duración del mensaje.", + "requireLogin": "Requerir inicio de sesión", + "requireLoginDesc": "Cuando está activado, el panel requiere contraseña. Cuando esté APAGADO, acceda sin iniciar sesión.", + "currentPassword": "Contraseña actual", + "enterCurrentPassword": "Ingrese la contraseña actual", + "newPassword": "Nueva contraseña", + "enterNewPassword": "Ingrese una nueva contraseña", + "confirmPassword": "Confirmar nueva contraseña", + "confirmPasswordPlaceholder": "Confirmar nueva contraseña", + "passwordsNoMatch": "Las contraseñas no coinciden", + "passwordUpdated": "Contraseña actualizada exitosamente", + "failedUpdatePassword": "No se pudo actualizar la contraseña", + "errorOccurred": "Se produjo un error", + "updatePassword": "Actualizar contraseña", + "setPassword": "Establecer contraseña", + "apiEndpointProtection": "Protección de terminales API", + "requireAuthModels": "Requerir clave API para /models", + "requireAuthModelsDesc": "Cuando está activado, el punto final /v1/models devuelve 404 para solicitudes no autenticadas. Impide el descubrimiento del modelo por parte de usuarios no autorizados.", + "blockedProviders": "Proveedores bloqueados", + "blockedProvidersDesc": "Oculte proveedores específicos de la respuesta /v1/models. Los proveedores bloqueados no aparecerán en los listados de modelos.", + "providersBlocked": "{count} proveedor(es) bloqueado(s) en /models", + "blockProviderTitle": "Bloquear {provider}", + "unblockProviderTitle": "Desbloquear {provider}", + "routingStrategy": "Estrategia de enrutamiento", + "fillFirst": "Llenar primero", + "fillFirstDesc": "Utilice cuentas en orden de prioridad", + "roundRobin": "Ronda Robin", + "roundRobinDesc": "Recorrer todas las cuentas", + "p2c": "P2C", + "p2cDesc": "Elige 2 al azar, usa el más saludable.", + "random": "Aleatorio", + "randomDesc": "Cuenta aleatoria cada solicitud", + "leastUsed": "Menos usado", + "leastUsedDesc": "Elija la cuenta utilizada menos recientemente", + "costOpt": "Opción de costo", + "costOptDesc": "Prefiere la cuenta más barata disponible", + "stickyLimit": "Límite fijo", + "stickyLimitDesc": "Llamadas por cuenta antes de cambiar", + "modelAliases": "Alias de modelo", + "modelAliasesDesc": "Patrones comodín para reasignar nombres de modelos • Utilice * y ?", + "aliasPatternPlaceholder": "claude-soneto-*", + "aliasTargetPlaceholder": "claude-soneto-4-20250514", + "pattern": "Patrón", + "targetModel": "Modelo objetivo", + "add": "+ Agregar", + "session": "Sesión", + "sessionDetailsAria": "Detalles de la sesión", + "status": "Estado", + "authenticated": "Autenticado", + "guest": "Invitado", + "loginTime": "Hora de inicio de sesión", + "sessionAge": "Edad de la sesión", + "browser": "Navegador", + "clearLocalData": "Borrar datos locales", + "logout": "Cerrar sesión", + "clearLocalDataConfirm": "¿Borrar todos los datos locales? Esto restablecerá sus preferencias.", + "unknown": "Desconocido", + "systemActor": "sistema", + "ipAccessControl": "Control de acceso IP", + "ipAccessControlDesc": "Bloquear o permitir direcciones IP específicas", + "ipModeDisabled": "Discapacitado", + "ipModeBlacklist": "Lista negra", + "ipModeWhitelist": "Lista blanca", + "ipModeWhitelistPriority": "Prioridad WL", + "addIpAddress": "Agregar dirección IP", + "ipAddressPlaceholder": "192.168.1.0/24 o 10.0.*.*", + "block": "+ Bloquear", + "allow": "+ Permitir", + "blocked": "Bloqueado ({count})", + "allowed": "Permitido ({count})", + "temporaryBans": "Prohibiciones temporales ({count})", + "minLeft": "{min}m restantes", + "auditLog": "Registro de auditoría", + "searchAuditLogs": "Buscar registros de auditoría...", + "failedLoadAuditLog": "No se pudo cargar el registro de auditoría", + "noAuditEvents": "No se encontraron eventos de auditoría", + "action": "acción", + "actor": "Actor", + "details": "Detalles", + "time": "tiempo", + "fallbackChainsTitle": "Cadenas de respaldo", + "fallbackChainsDesc": "Definir el orden de reserva del proveedor por modelo", + "addChain": "+ Agregar cadena", + "modelName": "Nombre del modelo", + "modelNamePlaceholder": "claude-soneto-4-20250514", + "providersCommaSeparated": "Proveedores (separados por comas, en orden de prioridad)", + "providersCommaSeparatedPlaceholder": "antrópico, openai, géminis", + "createChain": "Crear cadena", + "noFallbackChains": "Sin cadenas de respaldo", + "noFallbackChainsDesc": "Cree una cadena para definir el orden de reserva del proveedor para un modelo.", + "loadingFallbackChains": "Cargando cadenas de reserva...", + "deleteChainConfirm": "¿Eliminar la cadena alternativa para \"{model}\"?", + "chainCreated": "Cadena creada para {model}", + "chainDeleted": "Cadena eliminada para {model}", + "failedCreateChain": "No se pudo crear la cadena", + "failedDeleteChain": "No se pudo eliminar la cadena", + "deleteChain": "Eliminar cadena", + "fillModelAndProviders": "Por favor complete el nombre del modelo y los proveedores", + "addAtLeastOneProvider": "Añade al menos un proveedor", + "comboDefaultsTitle": "Valores predeterminados combinados", + "globalComboConfig": "Configuración combinada global", + "defaultStrategy": "Estrategia predeterminada", + "defaultStrategyDesc": "Aplicado a nuevos combos sin estrategia explícita.", + "comboStrategyAria": "estrategia combinada", + "priority": "Prioridad", + "weighted": "ponderado", + "maxRetriesLabel": "Reintentos máximos", + "retryDelayLabel": "Retardo de reintento (ms)", + "timeoutLabel": "Tiempo de espera (ms)", + "healthCheck": "Control de salud", + "healthCheckDesc": "Verificar previamente la disponibilidad del proveedor", + "trackMetrics": "Seguimiento de métricas", + "trackMetricsDesc": "Registre métricas de solicitudes por combo", + "providerOverrides": "Anulaciones de proveedores", + "providerOverridesDesc": "Anule el tiempo de espera y los reintentos por proveedor. La configuración del proveedor anula los valores predeterminados globales.", + "providerMaxRetriesAria": "{provider} reintentos máximos", + "providerTimeoutAria": "{provider} tiempo de espera ms", + "removeProviderOverrideAria": "Eliminar la anulación de {provider}", + "newProviderNamePlaceholder": "por ej. google, openai...", + "newProviderNameAria": "Nuevo nombre del proveedor", + "retries": "reintentos", + "ms": "señora", + "saveComboDefaults": "Guardar valores predeterminados combinados", + "maxNestingDepth": "Profundidad máxima de anidamiento", + "concurrencyPerModel": "Concurrencia / Modelo", + "queueTimeout": "Tiempo de espera de cola (ms)", + "providerProfiles": "Perfiles de proveedores", + "providerProfilesDesc": "Configuraciones de resiliencia separadas para proveedores de OAuth (basado en sesiones) y de clave API (medidas). Los proveedores de OAuth tienen umbrales más estrictos debido a límites de tarifas más bajos.", + "oauthProviders": "Proveedores de OAuth", + "apiKeyProviders": "Proveedores de claves API", + "transientCooldown": "Enfriamiento transitorio", + "rateLimitCooldown": "Enfriamiento del límite de velocidad", + "maxBackoffLevel": "Nivel máximo de retroceso", + "cbThreshold": "Umbral CB", + "cbResetTime": "Tiempo de reinicio del CB", + "rateLimiting": "Limitación de tasa", + "rateLimitingDesc": "Los proveedores de claves API tienen una velocidad limitada automáticamente con valores predeterminados seguros. Los límites se aprenden de los encabezados de respuesta y se adaptan con el tiempo.", + "defaultSafetyNet": "Red de seguridad predeterminada", + "rpm": "RPM", + "minGap": "Brecha mínima", + "maxConcurrent": "Máximo concurrente", + "activeLimiters": "Limitadores activos", + "noActiveLimiters": "Aún no hay limitadores de tarifas activos.", + "reservoir": "depósito", + "running": "corriendo", + "queued": "En cola", + "circuitBreakers": "Disyuntores", + "breakerStateClosed": "Cerrado", + "breakerStateOpen": "Abierto", + "breakerStateHalfOpen": "Medio abierto", + "tripped": "{count} se disparó", + "healthy": "{count} saludable", + "resetAll": "Restablecer todo", + "noCircuitBreakers": "Aún no hay disyuntores activos. Se crean automáticamente cuando las solicitudes fluyen a través del canal combinado.", + "failures": "{count} falla(s)", + "policiesLocked": "Políticas e identificadores bloqueados", + "allOperational": "Todos los sistemas operativos: sin bloqueos ni disyuntores disparados", + "loadingPolicies": "Cargando políticas...", + "lockedIdentifiers": "Identificadores bloqueados", + "unlockedIdentifier": "Desbloqueado: {identifier}", + "sinceDate": "desde {date}", + "forceUnlock": "Forzar desbloqueo", + "unlocking": "Desbloqueando...", + "failedUnlock": "No se pudo desbloquear", + "failedLoadWithStatus": "No se pudo cargar: {status}", + "failedLoadResilience": "No se pudo cargar el estado de resiliencia", + "saveFailed": "Error al guardar", + "resetFailed": "Error al restablecer", + "loadingResilience": "Cargando estado de resiliencia...", + "retry": "Reintentar", + "systemStorage": "Sistema y almacenamiento", + "allDataLocal": "Todos los datos almacenados localmente en su máquina", + "databasePath": "Ruta de la base de datos", + "exportDatabase": "Exportar base de datos", + "exportAll": "Exportar todo (.tar.gz)", + "importDatabase": "Importar base de datos", + "confirmDbImport": "Confirmar la importación de la base de datos", + "confirmDbImportDesc": "Esto reemplazará todos los datos actuales con el contenido de {file}. Se creará una copia de seguridad automáticamente antes de la importación.", + "yesImport": "Si, importar", + "lastBackup": "Última copia de seguridad", + "noBackupYet": "Aún no hay copia de seguridad", + "backupNow": "Copia de seguridad ahora", + "backupRestore": "Copia de seguridad y restauración", + "viewBackups": "Ver copias de seguridad", + "hide": "Ocultar", + "backupRetentionDesc": "Las instantáneas de la base de datos se crean automáticamente antes de la restauración y cada 15 minutos cuando cambian los datos. Retención: 24 horas + 30 respaldos diarios con rotación inteligente.", + "loadingBackups": "Cargando copias de seguridad...", + "noBackupsYet": "Aún no hay copias de seguridad disponibles. Las copias de seguridad se crearán automáticamente cuando cambien los datos.", + "backupsAvailable": "{count} copias de seguridad disponibles", + "refresh": "Actualizar", + "confirm": "¿Confirmar?", + "yes": "si", + "no": "No", + "restore": "Restaurar", + "invalidFileType": "Tipo de archivo no válido. Sólo se aceptan archivos .sqlite.", + "exportFailed": "Exportación fallida", + "exportFailedWithError": "Error al exportar: {error}", + "fullExportFailedWithError": "Error en la exportación completa: {error}", + "backupCreated": "Copia de seguridad creada: {file}", + "restoreSuccess": "¡Restaurado! {connections} conexiones, {nodes} nodos, {combos} combos, {apiKeys} claves API.", + "importSuccess": "¡Base de datos importada! {connections} conexiones, {nodes} nodos, {combos} combos, {apiKeys} claves API.", + "justNow": "justo ahora", + "minutesAgo": "Hace {count}m", + "hoursAgo": "Hace {count}h", + "daysAgo": "Hace {count}d", + "backupReasonManual": "manuales", + "backupReasonPreRestore": "pre-restauración", + "connectionsCount": "{count, plural, one {# connection} other {# connections}}", + "noChangesSinceBackup": "No hay cambios desde la última copia de seguridad", + "backupFailed": "Error en la copia de seguridad", + "restoreFailed": "Restauración fallida", + "importFailed": "Importación fallida", + "errorDuringRestore": "Se produjo un error durante la restauración.", + "errorDuringImport": "Se produjo un error durante la importación.", + "modelPricing": "Precios del modelo", + "modelPricingDesc": "Configurar tarifas de costo por modelo • Todas las tarifas en tokens de $/1 millón", + "providers": "Proveedores", + "registry": "Registro", + "priced": "Precio", + "searchProvidersModels": "Buscar proveedores o modelos...", + "showAll": "Mostrar todo", + "noProvidersMatch": "Ningún proveedor coincide con su búsqueda.", + "howPricingWorks": "Cómo funcionan los precios", + "cacheWrite": "Escritura en caché", + "unsaved": "no salvo", + "resetDefaults": "Restablecer valores predeterminados", + "saveProvider": "Guardar proveedor", + "saving": "Guardando...", + "model": "modelo", + "models": "modelos", + "moreProviders": "{count} más proveedores", + "withPricing": "con precios configurados", + "policiesCircuitBreakers": "Políticas y disyuntores", + "activeIssuesDetected": "Problemas activos detectados", + "off": "Apagado", + "resetPricingConfirm": "¿Restablecer todos los precios de {provider} a los valores predeterminados?", + "pricingDescInput": "Entrada: tokens enviados al modelo.", + "pricingDescOutput": "Salida: tokens generados", + "pricingDescCached": "En caché: entrada reutilizada (~50% de la tasa de entrada)", + "pricingDescReasoning": "Razonamiento: tokens de pensamiento (vuelve a Salida)", + "pricingDescCacheWrite": "Escritura de caché: creación de entradas de caché (recurre a Entrada)", + "pricingDescFormula": "Costo = (entrada × tasa_entrada) + (salida × tasa_salida) + (almacenado en caché × tasa_almacenamiento) por millón de tokens.", + "pricingSettingsTitle": "Configuración de precios", + "totalModels": "Modelos totales", + "active": "Activo", + "costCalculation": "Cálculo de costos", + "costCalculationDesc": "Los costos se calculan en función del uso de tokens y las tarifas de precios configuradas para cada modelo.", + "pricingFormat": "Formato de precios", + "pricingFormatDesc": "Todas las tarifas están en tokens de $/1 millón (dólares por millón de tokens).", + "tokenTypes": "Tipos de tokens", + "inputTokenDesc": "Fichas de aviso estándar", + "outputTokenDesc": "Fichas de finalización/respuesta", + "cachedTokenDesc": "Tokens de entrada almacenados en caché (normalmente el 50 % de la tasa de entrada)", + "reasoningTokenDesc": "Fichas especiales de razonamiento/pensamiento (retroceso a la tasa de producción)", + "cacheCreationTokenDesc": "Tokens utilizados para crear entradas de caché (retroceso a la tasa de entrada)", + "customPricingNote": "Puede anular los precios predeterminados para modelos específicos. Las anulaciones personalizadas tienen prioridad sobre los precios detectados automáticamente.", + "editPricing": "Editar precios", + "viewFullDetails": "Ver todos los detalles" + }, + "translator": { + "title": "Traductor", + "metaTitle": "Patio de juegos del traductor | OmniRuta", + "metaDescription": "Depurar, probar y visualizar traducciones de formatos API entre proveedores", + "playgroundTitle": "Patio de juegos del traductor", + "playground": "Zona de juegos", + "realtime": "Actividad de traducción en tiempo real", + "chatTester": "Probador de chat", + "testBench": "Banco de pruebas", + "liveMonitor": "Monitor en vivo", + "modeDescriptionPlayground": "Pegue cualquier cuerpo de solicitud de API y vea cómo OmniRoute lo traduce entre formatos de proveedores (OpenAI ↔ Claude ↔ Gemini ↔ API de respuestas)", + "modeDescriptionChatTester": "Envíe solicitudes de chat reales a través de OmniRoute e inspeccione el recorrido completo: entrada, solicitud traducida, respuesta del proveedor y salida traducida.", + "modeDescriptionTestBench": "Ejecute escenarios predefinidos y compare la compatibilidad entre proveedores y modelos.", + "modeDescriptionLiveMonitor": "Vea los eventos de traducción en tiempo real a medida que las solicitudes fluyen a través de OmniRoute.", + "modeDescriptionFallback": "Depure, pruebe y visualice cómo OmniRoute traduce las solicitudes de API entre proveedores.", + "recentTranslations": "Traducciones recientes", + "noTranslations": "Aún no hay traducciones", + "source": "Fuente", + "target": "Objetivo", + "time": "tiempo", + "model": "modelo", + "status": "Estado", + "latency": "Latencia", + "totalTranslations": "Traducciones totales", + "successful": "Exitoso", + "errors": "Errores", + "avgLatency": "Latencia promedio", + "millisecondsShort": "{value}ms", + "notAvailableSymbol": "—", + "liveAutoRefreshing": "En vivo: actualización automática", + "paused": "En pausa", + "eventsAppearHint": "Los eventos de traducción aparecen aquí a medida que las solicitudes fluyen a través de OmniRoute. Utilice cualquiera de estos métodos para generar eventos:", + "chatTesterTab": "Pestaña Probador de chat", + "testBenchTab": "Pestaña Banco de pruebas", + "externalApiCalls": "Llamadas API externas", + "ideCliIntegrations": "Integraciones IDE/CLI", + "inMemoryNote": "Nota: Los eventos se almacenan en la memoria y se restablecen cuando se reinicia el servidor.", + "ok": "bien", + "errorShort": "ERROR", + "formatConverter": "Convertidor de formato", + "formatConverterDescription": "Pegue o escriba un cuerpo de solicitud JSON. El traductor detectará automáticamente el formato de origen y lo convertirá al formato de destino. Utilice esto para depurar cómo OmniRoute traduce solicitudes entre formatos (OpenAI ↔ Claude ↔ Gemini ↔ API de respuestas).", + "input": "Entrada", + "output": "Salida", + "auto": "Automático", + "swapFormats": "Intercambiar formatos", + "translateAction": "Traducir", + "clear": "Borrar", + "inputPlaceholder": "Pegue el cuerpo de una solicitud aquí o seleccione una plantilla a continuación...", + "exampleTemplates": "Plantillas de ejemplo", + "exampleTemplatesHint": "— Haga clic para cargar", + "templateLoadHint": "La plantilla carga la solicitud en formato {format}. Cambie el formato de origen para cargar en un formato diferente.", + "compatibilityTester": "Probador de compatibilidad", + "compatibilityReport": "Informe de compatibilidad", + "testBenchDescription": "Ejecute escenarios predefinidos (chat simple, llamadas de herramientas, etc.) para verificar la traducción y la compatibilidad del proveedor. Seleccione un formato de origen y un proveedor de destino, luego ejecute todas las pruebas para ver un porcentaje de compatibilidad. Utilice esto para encontrar qué funciones funcionan en todos los proveedores.", + "targetProvider": "Proveedor objetivo", + "runAllTests": "Ejecutar todas las pruebas", + "runTest": "Ejecutar prueba", + "reRun": "Volver a ejecutar", + "running": "Corriendo...", + "passed": "pasó", + "failed": "falló", + "passedIconLabel": "✅ Aprobado", + "chunks": "trozos", + "scenarioSimpleChat": "Charla sencilla", + "scenarioToolCalling": "Llamada de herramientas", + "scenarioMultiTurn": "multivuelta", + "scenarioThinking": "Pensando", + "scenarioSystemPrompt": "Aviso del sistema", + "scenarioStreaming": "Transmisión", + "templateNames": { + "simple-chat": "Charla sencilla", + "tool-calling": "Llamada de herramientas", + "multi-turn": "multivuelta", + "thinking": "Pensando", + "system-prompt": "Aviso del sistema", + "streaming": "Transmisión" + }, + "templateDescriptions": { + "simple-chat": "Mensaje de texto básico", + "tool-calling": "Invocación de función/herramienta", + "multi-turn": "Conversación con la historia.", + "thinking": "Pensamiento/razonamiento extendido", + "system-prompt": "Instrucciones complejas del sistema", + "streaming": "Solicitud de transmisión SSE" + }, + "templatePayloads": { + "simpleChat": { + "system": "Eres un asistente útil.", + "userGreeting": "¡Hola! ¿Cómo estás hoy?" + }, + "toolCalling": { + "userWeather": "¿Cuál es el clima en São Paulo?", + "toolDescription": "Obtener el clima actual para una ubicación", + "cityNameDescription": "Nombre de la ciudad" + }, + "multiTurn": { + "system": "Eres un asistente de codificación.", + "userInitial": "Escriba una función para ordenar una matriz en Python.", + "assistantExample": "Aquí hay una función de clasificación simple:\n\n```pitón\ndef sort_array(arr):\n devolver ordenado(arr)\n```", + "userFollowUp": "Ahora haz que se clasifique en orden descendente." + }, + "thinking": { + "question": "¿Cuál es la suma de los primeros 100 números primos?" + }, + "systemPrompt": { + "systemInstruction": "Eres un ingeniero de software senior especializado en sistemas distribuidos. Responda preguntas de manera concisa utilizando las mejores prácticas de la industria. Proporcione siempre ejemplos de código cuando sea relevante. Formatee sus respuestas usando Markdown.", + "question": "¿Cómo implemento un patrón de disyuntor?" + }, + "streaming": { + "prompt": "Cuéntame una historia corta sobre un robot que aprende a pintar." + } + }, + "openaiCompatibleLabel": "Compatible con OpenAI", + "anthropicCompatibleLabel": "Compatible antrópico", + "noTemplateForFormat": "No hay plantilla para este formato", + "translationFailed": "Error de traducción: {error}", + "pipelineDebugger": "Depurador de canalización", + "translationPipeline": "Canal de traducción", + "pipelineVisualization": "Visualización de tuberías", + "pipelineVisualizationHint": "Envíe un mensaje para ver cómo fluye su solicitud a través de detección → traducción → llamada al proveedor.", + "chatTesterDescription": "Envíe mensajes en un formato de cliente específico e inspeccione cada paso del proceso de traducción.", + "chatTesterFlow": "Solicitud de cliente → Detección de formato → OpenAI Intermedio → Formato de proveedor → Respuesta", + "clickStepToInspect": "Haga clic en cualquier paso para inspeccionar los datos en esa etapa.", + "clientFormat": "Formato de cliente", + "provider": "Proveedor", + "modelPlaceholder": "Seleccione o escriba un nombre de modelo...", + "sendMessageToSeePipeline": "Envíe un mensaje para ver el proceso de traducción", + "chatMessageHintPrefix": "Su mensaje tendrá el formato de", + "chatMessageHintSuffix": "solicitud, traducida a través del proceso y enviada al proveedor seleccionado.", + "youWithFormat": "Tú ({format})", + "assistant": "asistente", + "typeMessage": "Escribe un mensaje...", + "send": "enviar", + "clientRequest": "Solicitud de cliente", + "clientRequestDescription": "El cuerpo de la solicitud como lo enviaría su cliente.", + "formatDetected": "Formato detectado", + "formatDetectedDescription": "OmniRoute auto-detects the API format from the request structure", + "openaiIntermediate": "Intermedio OpenAI", + "openaiIntermediateDescription": "All formats are first normalized to OpenAI format (the universal bridge)", + "providerFormat": "Formato del proveedor", + "providerFormatDescription": "OpenAI format is translated to the provider's native format", + "providerResponse": "Respuesta del proveedor", + "providerResponseRawDescription": "La respuesta cruda de la API del proveedor", + "providerResponseSseDescription": "El flujo SSE sin procesar de la API del proveedor", + "unexpectedError": "Ocurrió un error inesperado", + "error": "error", + "errorMessage": "Error: {message}", + "requestFailed": "Solicitud fallida", + "noTextExtracted": "(No se extrae texto)", + "liveMonitorDescriptionPrefix": "Shows translation events as API calls flow through OmniRoute. Events come from the in-memory buffer (resets on restart). uso", + "liveMonitorDescriptionSuffix": "o llamadas API externas para generar eventos." + }, + "usage": { + "title": "Uso", + "loggerTab": "registrador", + "proxyTab": "apoderado", + "budgetManagement": "Gestión Presupuestaria", + "budgetSaved": "Límites de presupuesto guardados", + "budgetSaveFailed": "No se pudo guardar el presupuesto", + "loadingBudgetData": "Cargando datos de presupuesto...", + "noApiKeysTitle": "Sin claves API", + "noApiKeysDescription": "Primero agregue claves API para configurar límites de presupuesto.", + "apiKey": "Clave API", + "todaysSpend": "Gasto de hoy", + "thisMonth": "este mes", + "setLimits": "Establecer límites", + "dailyLimitUsd": "Límite diario (USD)", + "monthlyLimitUsd": "Límite mensual (USD)", + "warningThresholdPercent": "Umbral de advertencia (%)", + "dailyLimitPlaceholder": "por ej. 5.00", + "monthlyLimitPlaceholder": "por ej. 50.00", + "warningThresholdPlaceholder": "80", + "saveLimits": "Guardar límites", + "budgetOk": "Presupuesto correcto: {remaining} restante", + "budgetExceeded": "Presupuesto excedido: las solicitudes pueden bloquearse", + "totalRequests": "Solicitudes totales", + "noDataYet": "Aún no hay datos", + "latency": "Latencia", + "latencyP50": "p50", + "latencyP95": "p95", + "latencyP99": "p99", + "promptCache": "Caché de aviso", + "systemHealth": "Estado del sistema", + "entries": "Entradas", + "activeCount": "{count} activo", + "openCircuitBreakersDetected": "Se detectaron disyuntores abiertos", + "hitRate": "Tasa de aciertos", + "hitsMisses": "Aciertos/fallos", + "circuitBreakers": "Disyuntores", + "lockedIPs": "IP bloqueadas", + "lockoutsAutoRefreshHint": "Bloqueos de límite de velocidad por modelo • Actualización automática 10 s", + "lockedCount": "{count, plural, one {# locked} other {# locked}}", + "timeLeft": "{time} izquierda", + "howItWorks": "Cómo funciona", + "howItWorksSubtitle": "Learn how evaluations validate your LLM responses", + "define": "Definir", + "defineStepDescription": "Create test cases with input prompts and expected output criteria using strategies like contains, regex, or exact match.", + "run": "correr", + "runStepDescription": "Execute test cases against your LLM endpoints through OmniRoute. Cada caso se envía como una solicitud API real.", + "evaluate": "evaluar", + "evaluateStepDescription": "Responses are compared against expected criteria. See pass/fail for each case with latency metrics and detailed feedback.", + "evalSuites": "Suites de evaluación", + "evalSuitesHint": "Click a suite to view test cases, then run to evaluate your LLM endpoints", + "evalsLoading": "Cargando suites de evaluación...", + "noEvalSuitesFound": "No se encontraron suites Eval", + "noEvalSuitesDescription": "Eval suites can be defined via the API or in code. They test model outputs against expected results using strategies like contains, regex, exact match, and custom functions.", + "columnCase": "caso", + "columnStatus": "Estado", + "columnLatency": "Latencia", + "columnDetails": "Detalles", + "columnModel": "modelo", + "columnStrategy": "Estrategia", + "columnExpected": "esperado", + "statsSuites": "Suites", + "statsTestCases": "Casos de prueba", + "statsModels": "Modelos", + "statsCoverage": "Cobertura", + "statsStrategiesCount": "{count} estrategias", + "evaluationStrategies": "Estrategias de evaluación", + "modelsUnderTest": "Modelos bajo prueba", + "searchSuitesPlaceholder": "Conjuntos de búsqueda...", + "passSuffix": "pasar", + "casesCount": "{count, plural, one {# case} other {# cases}}", + "runEval": "Ejecutar evaluación", + "runningProgress": "Ejecutando {current}/{total}...", + "passRate": "tasa de aprobación", + "summaryBreakdown": "{passed} aprobado · {failed} fallido · {total} total", + "passedIconLabel": "✅ Aprobado", + "failedIconLabel": "❌ Fallido", + "detailsContains": "Contiene: \"{term}\"", + "detailsRegex": "Expresión regular: {pattern}", + "detailsExpected": "Se esperaba: \"{expected}\"", + "noResultsYet": "Aún no hay resultados", + "testCasesCount": "Casos de prueba ({count})", + "noTestCasesDefined": "No hay casos de prueba definidos", + "runEvalHint": "Haga clic en \"Ejecutar evaluación\" para ejecutar todos los casos en su punto final LLM. Cada prueba envía una solicitud real a través de OmniRoute.", + "notifyNoTestCases": "No hay casos de prueba definidos para esta suite", + "notifyAllCasesPassed": "Todos los {total} casos pasados ✅", + "notifySomeCasesFailed": "{passed}/{total} pasó, {failed} falló", + "notifyEvalRunFailed": "La ejecución de evaluación falló", + "notifyEvalTitle": "Evaluación: {name}", + "modelEvals": "Evaluaciones de modelos", + "evalsHeroDescription": "Pruebe y valide sus puntos finales de LLM ejecutando conjuntos de evaluación predefinidos. Cada conjunto contiene casos de prueba que envían indicaciones reales a través de OmniRoute y comparan respuestas con criterios esperados, lo que le ayuda a detectar regresiones, comparar modelos y garantizar la calidad de las respuestas entre proveedores.", + "qualityValidation": "Validación de calidad", + "modelComparison": "Comparación de modelos", + "regressionDetection": "Detección de regresión", + "latencyBenchmarks": "Puntos de referencia de latencia", + "modelLockouts": "Bloqueos de modelos", + "noLockouts": "No hay modelos bloqueados actualmente", + "activeSessions": "Sesiones activas", + "noSessions": "No hay sesiones activas", + "sessionsHint": "Las sesiones aparecen a medida que las solicitudes fluyen a través del proxy.", + "sessionsTrackedHint": "Seguimiento mediante solicitud de huellas dactilares • Actualización automática 5s", + "session": "Sesión", + "age": "edad", + "requests": "Solicitudes", + "connection": "Conexión", + "durationMillisecondsShort": "{value}ms", + "durationSecondsShort": "{value}s", + "durationMinutesShort": "{value}m", + "durationHoursShort": "{value}h", + "reasonSeparator": " - ", + "notAvailableSymbol": "-", + "providerLimits": "Límites del proveedor", + "noProviders": "No hay proveedores conectados", + "connectProvidersForQuota": "Conéctese con proveedores con OAuth para realizar un seguimiento de los límites y el uso de su cuota de API.", + "accountsCount": "{count, plural, one {# account} other {# accounts}}", + "filteredFromCount": "(filtrado de {count})", + "autoRefresh": "Actualización automática", + "refreshAll": "Actualizar todo", + "loadingQuotas": "Cargando...", + "account": "cuenta", + "modelQuotas": "Cuotas modelo", + "lastUsed": "Usado por última vez", + "actions": "Acciones", + "refreshQuota": "Actualizar cuota", + "today": "hoy", + "tomorrow": "mañana", + "dayTimeFormat": "{day}, {time}", + "inDuration": "en {duration}", + "notApplicable": "N/A", + "rawPlanWithValue": "Plan sin formato: {plan}", + "noPlanFromProvider": "Sin plan del proveedor", + "noQuotaData": "Sin datos de cuota", + "noQuotaDataAvailable": "No hay datos de cuota disponibles", + "noAccountsForTierFilter": "No se encontraron cuentas para el filtro de niveles", + "tierAll": "Todos", + "tierEnterprise": "Empresa", + "tierTeam": "equipo", + "tierBusiness": "Negocios", + "tierUltra": "Ultra", + "tierPro": "profesional", + "tierPlus": "Más", + "tierFree": "Gratis", + "tierUnknown": "Desconocido" + }, + "modals": { + "waitingAuth": "Esperando autorización", + "verificationUrl": "URL de verificación", + "yourCode": "Tu código", + "remoteAccess": "Acceso remoto:", + "connectedSuccess": "¡Conectado exitosamente!", + "connectionFailed": "Conexión fallida", + "chooseAuthMethod": "Elija su método de autenticación:", + "awsBuilderId": "ID del creador de AWS", + "awsIamIdentity": "Centro de identidad de AWS IAM", + "googleAccount": "Cuenta de Google", + "githubAccount": "Cuenta GitHub", + "importToken": "Importar token", + "pasteToken": "Pegue el token de actualización de Kiro IDE.", + "awsRegion": "Región de AWS", + "autoDetecting": "Tokens de detección automática...", + "readingFromCache": "Lectura de la caché de AWS SSO", + "readingFromCursor": "Lectura de la base de datos Cursor IDE", + "initializing": "Inicializando...", + "pricingConfig": "Configuración de precios", + "loadingPricing": "Cargando datos de precios...", + "pricingRatesFormat": "Formato de tarifas de precios", + "noPricingData": "No hay datos de precios disponibles", + "noModelsFound": "No se encontraron modelos" + }, + "loggers": { + "allProviders": "Todos los proveedores", + "allModels": "Todos los modelos", + "allAccounts": "Todas las cuentas", + "allApiKeys": "Todas las claves API", + "allTypes": "Todos los tipos", + "allLevels": "Todos los niveles", + "modelAZ": "Modelo A-Z", + "modelZA": "Modelo Z-A", + "loadingLogs": "Cargando registros...", + "loadingProxyLogs": "Cargando registros de proxy...", + "noLogEntries": "No se encontraron entradas de registro", + "noPayloadData": "No hay datos de carga disponibles para esta entrada de registro.", + "proxyEvent": "Evento de proxy", + "proxy": "apoderado", + "level": "Nivel", + "directNative": "Directo (nativo)", + "combo": "combinado", + "inputTokens": "Yo:", + "outputTokens": "Oh:" + }, + "stats": { + "usageOverview": "Descripción general de uso", + "outputTokens": "Fichas de salida", + "totalCost": "Costo total", + "usageByModel": "Uso por modelo", + "usageByAccount": "Uso por cuenta", + "failedToLoad": "No se pudieron cargar las estadísticas de uso.", + "tokenHealth": "Salud del token", + "totalOAuth": "OAuth total", + "healthy": "saludable", + "warning": "Advertencia", + "errored": "Error", + "lastCheck": "último control", + "noData": "Sin datos", + "share": "Compartir", + "unableToLoad": "No se pueden cargar las métricas del sistema", + "product": "Producto", + "resources": "Recursos", + "company": "Empresa" + }, + "auth": { + "welcome": "Bienvenido", + "signIn": "Iniciar sesión", + "enterPassword": "Ingresa tu contraseña para continuar", + "password": "Contraseña", + "unifiedProxy": "Proxy de API de IA unificado", + "unifiedAiApiProxy": "Proxy de API de IA unificado", + "unifiedAiApiProxyDesc": "Enrute solicitudes a múltiples proveedores de IA a través de un único punto final. Equilibrio de carga, conmutación por error y seguimiento de uso integrados.", + "passwordNotEnabled": "La protección con contraseña no está habilitada", + "loading": "Cargando...", + "invalidPassword": "Contraseña no válida", + "errorOccurredRetry": "Se produjo un error. Por favor inténtalo de nuevo.", + "configureInstance": "Configuremos su instancia de OmniRoute", + "runOnboardingWizard": "Ejecuta el asistente de onboarding para configurar tu contraseña y conectar tu primer proveedor de IA.", + "startOnboarding": "Iniciar la incorporación", + "secureYourInstance": "Asegure su instancia", + "setPasswordDescription": "Establezca una contraseña para proteger su panel y proteger sus puntos finales API contra accesos no autorizados.", + "configurePassword": "Configurar contraseña", + "continue": "Continuar", + "windowWillClose": "Esta ventana se cerrará automáticamente...", + "closeTabNow": "Puedes cerrar esta pestaña ahora.", + "copyUrlManual": "Copia la URL de la barra de direcciones y pégala en la aplicación.", + "accessDeniedDescription": "No tienes permiso para acceder a este recurso. Verifique su clave API o comuníquese con el administrador.", + "goToDashboard": "Ir al panel", + "featureMultiProviderTitle": "Multiproveedor", + "featureMultiProviderDesc": "OpenAI, Anthropic, Google y más", + "featureLoadBalancingTitle": "Equilibrio de carga", + "featureLoadBalancingDesc": "Distribuya las solicitudes de forma inteligente", + "featureUsageTrackingTitle": "Seguimiento de uso", + "featureUsageTrackingDesc": "Monitorear costos y tokens", + "resetPassword": "Restablecer contraseña", + "resetDescription": "Elija un método para recuperar el acceso a su panel", + "stopServer": "Detén el servidor OmniRoute", + "processing": "Procesando...", + "pleaseWait": "Espere mientras completamos la autorización.", + "authSuccess": "¡Autorización exitosa!", + "copyUrl": "Copia esta URL", + "accessDenied": "Acceso denegado", + "methodCliTitle": "Método 1: reinicio de CLI", + "methodCliDescription": "Ejecute el siguiente comando en el servidor donde se ejecuta OmniRoute:", + "methodCliHint": "Esto le pedirá que establezca una nueva contraseña. Primero se debe detener el servidor.", + "methodManualTitle": "Método 2: reinicio manual", + "methodManualDescription": "Elimina la contraseña de la base de datos y configura una nueva al iniciar:", + "setPasswordInYour": "Define una nueva contraseña en tu", + "fileLabelSuffix": "archivo:", + "newPasswordPlaceholder": "tu_nueva_contraseña", + "deleteSettingsFile": "Eliminar", + "orRemovePasswordHashField": "o eliminar el campo contraseñaHash", + "restartServerWithNewPassword": "Reinicia el servidor; usará la nueva contraseña", + "backToLogin": "Volver a iniciar sesión", + "forgotPassword": "¿Olvidaste tu contraseña?" + }, + "landing": { + "brandName": "OmniRuta", + "navigateHome": "Navegar a casa", + "toggleMenu": "Alternar menú", + "featuresLink": "Características", + "docsLink": "Documentos", + "github": "GitHub", + "versionLive": "v1.0 ya está disponible", + "oneEndpoint": "Un punto final para", + "allProviders": "Todos los proveedores de IA", + "heroDescription": "Proxy de punto final de IA con panel web: un puerto JavaScript de CLIProxyAPI. Funciona a la perfección con Claude Code, OpenAI Codex, Cline, RooCode y otras herramientas CLI.", + "getStarted": "Empezar", + "viewOnGithub": "Ver en GitHub", + "powerfulFeatures": "Funciones potentes", + "featuresSubtitle": "Todo lo que necesita para administrar su infraestructura de IA en un solo lugar, diseñado para escalar.", + "featureUnifiedEndpointTitle": "Punto final unificado", + "featureUnifiedEndpointDesc": "Acceda a todos los proveedores a través de una única URL API estándar.", + "featureEasySetupTitle": "Fácil configuración", + "featureEasySetupDesc": "Póngase en funcionamiento en minutos con el comando npx.", + "featureModelFallbackTitle": "Modelo de reserva", + "featureModelFallbackDesc": "Cambie automáticamente de proveedor en caso de falla o alta latencia.", + "featureUsageTrackingTitle": "Seguimiento de uso", + "featureUsageTrackingDesc": "Análisis detallados y seguimiento de costes en todos los modelos.", + "featureOAuthApiKeysTitle": "Claves OAuth y API", + "featureOAuthApiKeysDesc": "Administre de forma segura las credenciales en una bóveda.", + "featureCloudSyncTitle": "Sincronización en la nube", + "featureCloudSyncDesc": "Sincronice sus configuraciones entre dispositivos al instante.", + "featureCliSupportTitle": "Soporte CLI", + "featureCliSupportDesc": "Funciona con Claude Code, Codex, Cline, Cursor y más.", + "featureDashboardTitle": "Panel de control", + "featureDashboardDesc": "Panel visual para análisis de tráfico en tiempo real.", + "howItWorks": "Cómo funciona OmniRoute", + "howItWorksDescription": "Los datos fluyen sin problemas desde su aplicación a través de nuestra capa de enrutamiento inteligente hasta el mejor proveedor para el trabajo.", + "howItWorksStep1Title": "1. CLI y SDK", + "howItWorksStep1Description": "Sus solicitudes comienzan desde sus herramientas favoritas o nuestro SDK unificado. Simplemente cambie la URL base.", + "howItWorksStep2Title": "2. Centro OmniRoute", + "howItWorksStep2Description": "Nuestro motor analiza el aviso, verifica el estado del proveedor y las rutas para obtener la latencia o el costo más bajo.", + "howItWorksStep3Title": "3. Proveedores de IA", + "howItWorksStep3Description": "OpenAI, Anthropic, Gemini u otros cumplen la solicitud al instante.", + "getStartedIn30Seconds": "Comience en 30 segundos", + "getStartedDescription": "Instale OmniRoute, configure sus proveedores a través del panel web y comience a enrutar solicitudes de IA.", + "installOmniRoute": "Instalar OmniRoute", + "installStepDescription": "Ejecute el comando npx para iniciar el servidor al instante", + "openDashboard": "Abrir panel", + "openDashboardStepDescription": "Configure proveedores y claves API a través de la interfaz web", + "routeRequests": "Solicitudes de ruta", + "routeRequestsStepDescription": "Apunte sus herramientas CLI a {endpoint}", + "terminal": "terminales", + "copy": "Copiar", + "copied": "✓ Copiado", + "startingOmniRoute": "Iniciando OmniRoute...", + "serverRunningOnLabel": "Servidor ejecutándose en", + "dashboardLabel": "Panel de control", + "readyToRoute": "¡Listo para la ruta! ✓", + "configureProvidersNote": "📝 Configure proveedores en el panel o use variables de entorno", + "dataLocation": "Ubicación de datos:", + "dataLocationMacLinux": " MacOS/Linux:", + "dataLocationWindows": " Ventanas:", + "product": "Producto", + "dashboardLink": "Panel de control", + "changelog": "Registro de cambios", + "resources": "Recursos", + "documentation": "Documentación", + "npm": "MNP", + "legal": "Legales", + "mitLicense": "Licencia MIT", + "footerTagline": "El punto final unificado para la generación de IA. Conecte, enrute y administre sus proveedores de IA con facilidad.", + "copyright": "© {year} OmniRoute. Reservados todos los derechos.", + "flowToolClaudeCode": "Código Claude", + "flowToolOpenAICodex": "Códice OpenAI", + "flowToolCline": "Clina", + "flowToolCursor": "Cursor", + "flowProviderOpenAI": "AbiertoAI", + "flowProviderAnthropic": "antrópico", + "flowProviderGemini": "Géminis", + "flowProviderGithubCopilot": "Copiloto de GitHub", + "interactiveDiagram": "Diagrama interactivo visible en el escritorio.", + "ctaTitle": "¿Listo para simplificar su infraestructura de IA?", + "ctaDescription": "Únase a los desarrolladores que están optimizando sus integraciones de IA con OmniRoute. Código abierto y gratuito para comenzar.", + "startFree": "Comience gratis", + "readDocumentation": "Leer documentación" + }, + "docs": { + "title": "Documentación", + "quickStart": "Inicio rápido", + "features": "Características", + "supportedProviders": "Proveedores compatibles", + "supportedProvidersToc": "Proveedores", + "commonUseCases": "Casos de uso comunes", + "clientCompatibility": "Compatibilidad del cliente", + "apiReference": "Referencia de API", + "method": "Método", + "path": "Camino", + "notes": "Notas", + "modelPrefixes": "Prefijos de modelo", + "prefix": "Prefijo", + "troubleshooting": "Solución de problemas", + "supportsChat": "Admite puntos finales de chat y respuestas.", + "oauthAutoRefresh": "Conexión OAuth con actualización automática de token.", + "fullStreaming": "Soporte completo de transmisión para todos los modelos.", + "docsLabel": "Documentos", + "docsHeroDescription": "Puerta de enlace de IA para LLM de múltiples proveedores. Un punto final para OpenAI, Anthropic, Gemini, GitHub Copilot, Claude Code, Cursor y más de 20 proveedores.", + "openDashboard": "Abrir panel", + "endpointPage": "Página de punto final", + "github": "GitHub", + "reportIssue": "Informar problema", + "onThisPage": "En esta página", + "documentationVersion": "Documentación: v{version}", + "quickStartStep1Title": "1. Instalar y ejecutar", + "quickStartStep1Prefix": "correr", + "quickStartStep1Middle": "o clonar desde GitHub y ejecutar", + "quickStartStep2Title": "2. Crear clave API", + "quickStartStep2Text": "Vaya a Punto final -> Claves registradas. Genere una clave por entorno.", + "quickStartStep3Title": "3. Conectar proveedores", + "quickStartStep3Text": "Agregue cuentas de proveedor mediante el inicio de sesión de OAuth, la clave API o la conexión automática de nivel gratuito.", + "quickStartStep4Title": "4. Establecer la URL de la base de clientes", + "quickStartStep4Prefix": "Apunte su cliente IDE o API a", + "quickStartStep4Suffix": "Utilice el prefijo del proveedor, por ejemplo", + "featureRoutingTitle": "Enrutamiento multiproveedor", + "featureRoutingText": "Enrute solicitudes a más de 30 proveedores de IA a través de un único punto final compatible con OpenAI. Admite API de chat, respuestas, audio e imágenes.", + "featureCombosTitle": "Combos y equilibrio", + "featureCombosText": "Cree combinaciones de modelos con cadenas de respaldo y estrategias de equilibrio: round-robin, prioridad, aleatorio, menos utilizado y de costo optimizado.", + "featureUsageTitle": "Seguimiento de uso y costos", + "featureUsageText": "Recuento de tokens en tiempo real, cálculo de costos por proveedor/modelo y desglose detallado del uso por clave API y cuenta.", + "featureAnalyticsTitle": "Panel de análisis", + "featureAnalyticsText": "Análisis visual con gráficos de solicitudes, tokens, errores, latencia, costos y popularidad del modelo a lo largo del tiempo.", + "featureHealthTitle": "Monitoreo de salud", + "featureHealthText": "Comprobaciones de estado en vivo, estado del proveedor, estados de los disyuntores y detección automática del límite de velocidad con retroceso exponencial.", + "featureCliTitle": "Herramientas CLI", + "featureCliText": "Administre configuraciones de IDE, exporte/importe copias de seguridad, descubra perfiles de códice y configure ajustes desde el panel.", + "featureSecurityTitle": "Seguridad y políticas", + "featureSecurityText": "Autenticación de clave API, filtrado de IP, protección contra inyección rápida, políticas de dominio, gestión de sesiones y registro de auditoría.", + "featureCloudSyncTitle": "Sincronización en la nube", + "featureCloudSyncText": "Sincronice su configuración con Cloudflare Workers para obtener acceso remoto con credenciales cifradas y conmutación por error automática.", + "providersAcrossConnectionTypes": "{count} proveedores en tres tipos de conexión.", + "manageProviders": "Administrar proveedores", + "providersCount": "{count} proveedores", + "providerTypeFree": "Nivel gratuito", + "providerTypeOAuth": "OAuth", + "providerTypeApiKey": "Clave API", + "useCaseSingleEndpointTitle": "Punto final único para muchos proveedores", + "useCaseSingleEndpointText": "Dirija a los clientes a una URL base y enrútelos por prefijo de modelo (por ejemplo: gh/, cc/, kr/, openai/).", + "useCaseFallbackTitle": "Retroceso y cambio de modelo con combos", + "useCaseFallbackText": "Cree modelos combinados en el Panel y mantenga estable la configuración del cliente mientras los proveedores rotan internamente.", + "useCaseUsageVisibilityTitle": "Visibilidad de uso, costo y depuración", + "useCaseUsageVisibilityText": "Realice un seguimiento de los tokens y el costo por proveedor, cuenta y clave API en las pestañas Uso y Análisis.", + "clientCherryStudioTitle": "estudio de cereza", + "baseUrlLabel": "URL básica", + "chatEndpointLabel": "Punto final del chat", + "modelRecommendationLabel": "Recomendación del modelo: prefijo explícito", + "clientCodexTitle": "Modelos de copiloto Codex/GitHub", + "clientCodexBullet1": "Utilice ID de modelo con", + "clientCodexBullet2": "Los modelos de la familia Codex se enrutan automáticamente a", + "clientCodexBullet3": "Los modelos que no pertenecen al Codex continúan", + "clientCursorTitle": "Cursor IDE", + "clientCursorBullet1": "uso", + "clientCursorBullet1Suffix": "Prefijo para modelos de cursor.", + "clientCursorBullet2": "Conexión OAuth: inicie sesión desde la página de Proveedores.", + "clientClaudeTitle": "Código Claude / Antigravedad", + "clientClaudeBullet1Prefix": "uso", + "clientClaudeBullet1Middle": "(Claude) o", + "clientClaudeBullet1Suffix": "Prefijo (antigravedad).", + "endpointChatNote": "Punto final de chat compatible con OpenAI (predeterminado).", + "endpointResponsesNote": "Punto final de API de respuestas (Codex, o-series).", + "endpointModelsNote": "Catálogo de modelos para todos los proveedores conectados.", + "endpointAudioNote": "Transcripción de audio (Deepgram, AssemblyAI).", + "endpointImagesNote": "Generación de imágenes (NanoBanana).", + "endpointRewriteChatNote": "Reescribir el asistente para clientes sin /v1.", + "endpointRewriteResponsesNote": "Reescriba el asistente para respuestas sin /v1.", + "endpointRewriteModelsNote": "Reescriba el asistente para el descubrimiento de modelos sin /v1.", + "modelPrefixesDescriptionStart": "Utilice el prefijo del proveedor antes del nombre del modelo para enrutar a un proveedor específico. Ejemplo:", + "modelPrefixesDescriptionEnd": "rutas al copiloto de GitHub.", + "provider": "Proveedor", + "type": "Tipo", + "troubleshootingModelRouting": "Si el cliente falla con el enrutamiento del modelo, utilice proveedor/modelo explícito (por ejemplo: gh/gpt-5.1-codex).", + "troubleshootingAmbiguousModels": "Si recibe errores de modelo ambiguos, elija un prefijo de proveedor en lugar de una identificación de modelo simple.", + "troubleshootingCodexFamily": "Para los modelos de la familia GitHub Codex, mantenga el modelo como gh/; El enrutador selecciona/respuestas automáticamente.", + "troubleshootingTestConnection": "Utilice Panel > Proveedores > Probar conexión antes de realizar pruebas desde IDE o clientes externos.", + "troubleshootingCircuitBreaker": "Si un proveedor muestra el disyuntor abierto, espere el tiempo de reutilización o consulte la página de Salud para obtener más detalles.", + "troubleshootingOAuth": "Para los proveedores de OAuth, vuelva a autenticarse si los tokens caducan. Verifique el indicador de estado de la tarjeta del proveedor." + }, + "legal": { + "privacyPolicy": "Política de privacidad", + "termsOfService": "Términos de servicio", + "providerConfigurations": "Configuraciones de proveedor", + "apiKeys": "Claves API", + "usageLogs": "Registros de uso", + "applicationSettings": "Configuración de la aplicación", + "viewExportAnalytics": "Ver y exportar análisis de uso", + "clearHistory": "Borrar el historial de uso en cualquier momento", + "configureRetention": "Configurar políticas de retención de registros", + "backupRestore": "Haga una copia de seguridad y restaure su base de datos", + "privacyMetadataTitle": "Política de privacidad | OmniRuta", + "privacyMetadataDescription": "Política de privacidad para el enrutador proxy API OmniRoute AI.", + "termsMetadataTitle": "Términos de servicio | OmniRuta", + "termsMetadataDescription": "Términos de servicio para el enrutador proxy API OmniRoute AI.", + "backToHome": "De vuelta a casa", + "lastUpdated": "Última actualización: {date}", + "policyLastUpdatedDate": "13 de febrero de 2026", + "listSeparator": "-", + "questionsVisit": "¿Preguntas? Visita nuestro", + "githubRepository": "repositorio de GitHub", + "privacySection1Title": "1. Arquitectura local primero", + "privacySection1Text": "OmniRoute está diseñado como una aplicación local. Todo el procesamiento y almacenamiento de datos se realiza íntegramente en su máquina. No existe un servidor centralizado que recopile su información.", + "privacySection2Title": "2. Datos que almacenamos", + "privacyDataStoredIn": "Los siguientes datos se almacenan localmente en", + "privacyDataProviderConfigurationsDesc": "URL de conexión, tipos de proveedores y configuración de prioridad", + "privacyDataApiKeysDesc": "cifrado y almacenado localmente para autenticarse con proveedores de IA", + "privacyDataUsageLogsDesc": "recuentos de solicitudes, uso de tokens, nombres de modelos, marcas de tiempo y tiempos de respuesta", + "privacyDataApplicationSettingsDesc": "preferencias de tema, estrategia de enrutamiento y configuraciones combinadas", + "privacySection3Title": "3. Sin telemetría", + "privacySection3Text": "OmniRoute no recopila telemetría, análisis ni informes de fallos. No se envían datos a nosotros ni a ningún tercero. Sus patrones de uso, llamadas API y configuraciones permanecen completamente privados.", + "privacySection4Title": "4. Proveedores de IA de terceros", + "privacySection4Text": "Cuando realiza llamadas API a través de OmniRoute, sus solicitudes se reenvían a los proveedores de IA que haya configurado (por ejemplo: OpenAI, Anthropic, Google). Estos proveedores tienen sus propias políticas de privacidad que rigen cómo manejan sus datos. Por favor revise:", + "privacyOpenAiPolicy": "Política de privacidad de OpenAI", + "privacyAnthropicPolicy": "Política de privacidad antrópica", + "privacyGooglePolicy": "Política de privacidad de Google", + "privacySection5Title": "5. Sincronización en la nube (opcional)", + "privacySection5Text": "Si habilita la función opcional de sincronización en la nube, las configuraciones del proveedor y las claves API pueden transmitirse a un punto final en la nube configurado. Esta función está deshabilitada de forma predeterminada y requiere una suscripción explícita.", + "privacySection6Title": "6. Registro", + "privacyLoggingIntro": "Los registros de solicitudes se pueden configurar a través de la configuración del panel. Puedes:", + "privacySection7Title": "7. Tus derechos", + "privacySection7TextStart": "Dado que todos los datos se almacenan localmente, usted tiene control total. Puedes eliminar tus datos en cualquier momento eliminando el", + "privacySection7TextEnd": "directorio o utilizando las funciones de copia de seguridad y restauración de la base de datos en el panel.", + "termsSection1Title": "1. Descripción general", + "termsSection1Text": "OmniRoute es un enrutador proxy API de IA local que funciona completamente en su máquina. Enruta solicitudes a múltiples proveedores de IA con equilibrio de carga, conmutación por error y seguimiento de uso.", + "termsSection2Title": "2. Responsabilidades del usuario", + "termsResponsibilityApiKeys": "Usted es el único responsable de administrar sus propias claves API y credenciales para proveedores de IA externos (OpenAI, Anthropic, Google, etc.).", + "termsResponsibilityCompliance": "Debe cumplir con los términos de servicio de cada proveedor de IA a cuya API acceda a través de OmniRoute.", + "termsResponsibilitySecurity": "Usted es responsable de la seguridad de su instalación local de OmniRoute, incluida la configuración de una contraseña y la restricción del acceso a la red.", + "termsSection3Title": "3. Cómo funciona", + "termsSection3Text": "OmniRoute actúa como proxy intermediario. Las llamadas API enviadas a OmniRoute se traducen y reenvían a sus proveedores de IA configurados. OmniRoute no modifica el contenido de sus solicitudes o respuestas más allá de la traducción del protocolo necesaria.", + "termsSection4Title": "4. Manejo de datos", + "termsDataStoredLocally": "Todos los datos se almacenan localmente en su máquina en una base de datos SQLite.", + "termsNoTransmission": "OmniRoute no transmite ningún dato a servidores externos a menos que habilite explícitamente las funciones de sincronización en la nube.", + "termsDataLocationText": "Los registros de uso, las claves API y la configuración se almacenan en", + "termsSection5Title": "5. Descargo de responsabilidad", + "termsSection5Text": "OmniRoute se proporciona \"tal cual\" sin garantía de ningún tipo. No somos responsables de los costos incurridos por el uso de API, interrupciones del servicio o pérdida de datos. Mantenga siempre copias de seguridad de su configuración.", + "termsSection6Title": "6. Código abierto", + "termsSection6Text": "OmniRoute es un software de código abierto. Usted es libre de inspeccionarlo, modificarlo y distribuirlo según los términos de su licencia." + } +} diff --git a/src/i18n/messages/fi.json b/src/i18n/messages/fi.json new file mode 100644 index 0000000000..c964b9ddec --- /dev/null +++ b/src/i18n/messages/fi.json @@ -0,0 +1,2040 @@ +{ + "common": { + "save": "Tallenna", + "cancel": "Peruuta", + "delete": "Poista", + "loading": "Ladataan...", + "error": "Tapahtui virhe", + "success": "Menestystä", + "confirm": "Oletko varma?", + "refresh": "Päivitä", + "close": "Sulje", + "add": "Lisää", + "edit": "Muokkaa", + "search": "Etsi", + "back": "Takaisin", + "next": "Seuraavaksi", + "submit": "Lähetä", + "reset": "Nollaa", + "copy": "Kopioi", + "copied": "Kopioitu!", + "enabled": "Käytössä", + "disabled": "Ei käytössä", + "active": "Aktiivinen", + "inactive": "Ei-aktiivinen", + "noData": "Tietoja ei ole saatavilla", + "configure": "Määritä", + "manage": "Hallitse", + "name": "Nimi", + "actions": "Toiminnot", + "status": "Tila", + "type": "Kirjoita", + "model": "Malli", + "models": "mallit", + "provider": "Palveluntarjoaja", + "account": "Tili", + "time": "Aika", + "details": "Yksityiskohdat", + "created": "Luotu", + "lastUsed": "Viimeksi käytetty", + "loadMore": "Lataa lisää", + "noResults": "Tuloksia ei löytynyt", + "reloadPage": "Lataa sivu uudelleen", + "connected": "Yhdistetty", + "disconnected": "Yhteys katkaistu", + "notConfigured": "Ei määritetty", + "testConnection": "Testaa yhteys", + "enable": "Ota käyttöön", + "disable": "Poista käytöstä", + "columns": "Sarakkeet", + "newest": "Uusin", + "oldest": "Vanhin", + "all": "Kaikki", + "none": "Ei mitään", + "yes": "Kyllä", + "no": "Ei", + "warning": "Varoitus", + "note": "Huom", + "free": "Ilmainen", + "skipToContent": "Siirry sisältöön" + }, + "sidebar": { + "home": "Kotiin", + "dashboard": "Kojelauta", + "providers": "Palveluntarjoajat", + "combos": "Yhdistelmät", + "usage": "Käyttö", + "analytics": "Analytics", + "costs": "Kustannukset", + "health": "Terveys", + "limits": "Rajoitukset ja kiintiöt", + "cliTools": "CLI-työkalut", + "settings": "Asetukset", + "translator": "Kääntäjä", + "docs": "Asiakirjat", + "issues": "Ongelmat", + "endpoint": "Päätepiste", + "apiManager": "API Manager", + "logs": "Lokit", + "auditLog": "Tarkastusloki", + "shutdown": "Sammutus", + "restart": "Käynnistä uudelleen", + "shutdownConfirm": "Suljetaanko OmniRoute?", + "restartConfirm": "Käynnistetäänkö OmniRoute uudelleen?", + "version": "v{version}", + "debug": "Debug", + "system": "Järjestelmä", + "help": "Apua", + "serverDisconnected": "Palvelin yhteys katkaistu", + "serverDisconnectedMsg": "Välityspalvelin on pysäytetty tai käynnistyy uudelleen.", + "expandSidebar": "Laajenna sivupalkki", + "collapseSidebar": "Tiivistä sivupalkki" + }, + "header": { + "logout": "Kirjaudu ulos", + "language": "Kieli", + "providers": "Palveluntarjoajat", + "providerDescription": "Hallinnoi AI-palveluntarjoajan yhteyksiä", + "combos": "Yhdistelmät", + "comboDescription": "Malliyhdistelmät varaosilla", + "usage": "Käyttö ja analytiikka", + "usageDescription": "Valvo API-käyttöäsi, tunnuksesi kulutusta ja pyyntölokeja", + "analytics": "Analytics", + "analyticsDescription": "Kaavioita, trendejä ja arviointitietoja", + "cliTools": "CLI-työkalut", + "cliToolsDescription": "Määritä CLI-työkalut", + "home": "Kotiin", + "homeDescription": "Tervetuloa OmniRouteen", + "endpoint": "Päätepiste", + "endpointDescription": "API-päätepisteen määritys", + "settings": "Asetukset", + "settingsDescription": "Hallinnoi asetuksiasi", + "openaiCompatible": "OpenAI-yhteensopiva", + "anthropicCompatible": "Antrooppinen yhteensopiva" + }, + "home": { + "quickStart": "Pika-aloitus", + "quickStartDesc": "Pääset liikkeelle neljässä vaiheessa. Yhdistä palveluntarjoajat, reittimallit, tarkkaile kaikkea.", + "fullDocs": "Täydelliset asiakirjat", + "step1Title": "1. Luo API-avain", + "step1Desc": "Siirry kohtaan Endpoint -> Rekisteröidyt avaimet. Luo yksi avain ympäristöä kohden.", + "step2Title": "2. Yhdistä palveluntarjoajat", + "step2Desc": "Lisää tilejä palveluun Providers. Tukee OAuthia, API-avainta ja ilmaisia tasoja.", + "step3Title": "3. Osoita asiakkaasi", + "step3Desc": "Aseta perus-URL-osoitteeksi {url} IDE- tai API-asiakkaassasi.", + "step4Title": "4. Valvo ja optimoi", + "step4Desc": "Seuraa tunnuksia, kustannuksia ja virheitä Pyyntölokeissa ja Analytics.", + "providersOverview": "Palveluntarjoajien yleiskatsaus", + "configuredOf": "{configured} määritetty {total} käytettävissä olevasta palveluntarjoajasta", + "noModelsAvailable": "Tälle tarjoajalle ei ole saatavilla malleja.", + "configureFirst": "Määritä yhteys ensin kohteessa {providers}", + "configureProvider": "Määritä Provider", + "modelAvailable": "{count} malli saatavilla", + "modelsAvailable": "{count} malleja saatavilla", + "connectionsActive": "{count} yhteys aktiivinen", + "connectionsActivePlural": "{count} yhteydet aktiivisia", + "copyModelName": "Kopioi mallin nimi", + "documentation": "Dokumentaatio", + "healthMonitor": "Terveysmittari", + "reportIssue": "Ilmoita ongelmasta", + "activeError": "{active} aktiivinen · {errors} virhe", + "oauthLabel": "OAuth", + "apiKeyLabel": "API-avain", + "requestsShort": "{count} vaatimus", + "providerModelsTitle": "{provider} - Mallit", + "copiedModel": "Kopioitu: {model}", + "aliasLabel": "alias" + }, + "analytics": { + "title": "Analytics", + "overviewDescription": "Tarkkaile sovellusliittymän käyttötapoja, tunnuksen kulutusta, kustannuksia ja toimintatrendejä kaikilla palveluntarjoajilla ja malleilla.", + "evalsDescription": "Testaa ja vahvista LLM-päätepisteesi suorittamalla arviointipaketteja. Vertaile mallin laatua, havaitse regressiot ja vertaile viivettä.", + "overview": "Yleiskatsaus", + "evals": "Evals" + }, + "apiManager": { + "title": "API-avaimet", + "createKey": "Luo API-avain", + "key": "Avain", + "revokeKey": "Peruuta avain", + "revokeConfirm": "Haluatko varmasti peruuttaa tämän API-avaimen?", + "noKeys": "Ei vielä API-avaimia", + "noKeysDesc": "Luo ensimmäinen API-avain päätepisteellesi tulevien pyyntöjen todentamiseksi", + "keyLabel": "Avaimen etiketti", + "permissions": "Käyttöoikeudet", + "expiresAt": "Vanhenee", + "never": "Ei koskaan", + "revoke": "Peruuta", + "showKey": "Näytä avain", + "hideKey": "Piilota avain", + "copyKey": "Kopioi API-avain", + "allModels": "Kaikki mallit", + "selectedModels": "Valitut mallit", + "readOnly": "Vain luku", + "fullAccess": "Täysi pääsy", + "keyManagement": "API-avainten hallinta", + "keyManagementDesc": "Luo ja hallitse API-avaimia päätepisteesi pyyntöjen todentamiseksi", + "totalKeys": "Avaimet yhteensä", + "restricted": "Rajoitettu", + "totalRequests": "Pyyntöjä yhteensä", + "modelsAvailable": "Mallit saatavilla", + "registeredKeys": "Rekisteröity avaimet", + "keysRegistered": "{count} avaimet rekisteröity", + "keyRegistered": "{count} avain rekisteröity", + "keysSecurityNote": "Jokainen avain eristää käytön seurannan ja voidaan peruuttaa itsenäisesti. Avaimet peitetään luomisen jälkeen turvallisuuden vuoksi.", + "createFirstKey": "Luo ensimmäinen avaimesi", + "name": "Nimi", + "usage": "Käyttö", + "created": "Luotu", + "actions": "Toiminnot", + "reqs": "vaatimukset", + "neverUsed": "Ei koskaan käytetty", + "deleteConfirm": "Poistetaanko tämä API-avain?", + "usageTips": "Käyttövinkkejä", + "tipAuth": "Käytä API-avaimia Authorization-otsikossa siirtotienä YOUR_KEY", + "tipSecure": "Avaimet näkyvät vain kerran luomisen aikana – säilytä ne turvallisesti", + "tipSeparate": "Luo erilliset avaimet eri asiakkaille tai ympäristöille", + "tipRestrict": "Rajoita avaimet tiettyihin malleihin parantaaksesi turvallisuutta ja kustannusten hallintaa", + "keyName": "Avaimen nimi", + "keyNamePlaceholder": "esim. tuotantoavain, kehitysavain", + "keyNameDesc": "Valitse kuvaava nimi tämän avaimen tarkoituksen tunnistamiseksi", + "keyCreated": "API-avain luotu", + "keyCreatedSuccess": "Avain luotu onnistuneesti!", + "keyCreatedNote": "Kopioi ja tallenna tämä avain nyt – sitä ei näytetä uudelleen.", + "done": "Valmis", + "savePermissions": "Tallenna käyttöoikeudet", + "allowAll": "Salli kaikki", + "restrict": "Rajoita", + "allowAllInfo": "Tällä avaimella pääsee kaikkiin saatavilla oleviin malleihin.", + "restrictInfo": "Tällä avaimella voi käyttää {selected}/{total} mallia.", + "selected": "{count} valittu", + "all": "Kaikki", + "clear": "Selkeä", + "searchModels": "Hae malleja nimen tai toimittajan mukaan...", + "noModelsFound": "Malleja ei löytynyt", + "keyNameRequired": "Avaimen nimi vaaditaan", + "keyNameTooLong": "Avaimen nimessä saa olla enintään {max} merkkiä", + "keyNameInvalid": "Avaimen nimi voi sisältää vain kirjaimia, numeroita, välilyöntejä, yhdysmerkkejä ja alaviivoja", + "invalidKeyName": "Virheellinen avaimen nimi", + "failedCreateKey": "Avaimen luominen epäonnistui", + "failedCreateKeyRetry": "Avaimen luominen epäonnistui. Yritä uudelleen.", + "invalidKeyId": "Virheellinen avaintunnus", + "failedDeleteKey": "Avaimen poistaminen epäonnistui", + "failedDeleteKeyRetry": "Avaimen poistaminen epäonnistui. Yritä uudelleen.", + "invalidModelsSelection": "Virheellinen mallivalinta", + "cannotSelectMoreThanModels": "Ei voi valita enempää kuin {max} mallia", + "failedUpdatePermissions": "Käyttöoikeuksien päivittäminen epäonnistui", + "failedUpdatePermissionsRetry": "Käyttöoikeuksien päivittäminen epäonnistui. Yritä uudelleen.", + "unknownProvider": "tuntematon", + "copyMaskedKey": "Kopioi peitetty avain", + "modelsCount": "{count, plural, one {# model} other {# models}}", + "lastUsedOn": "Viimeisin: {date}", + "editPermissions": "Muokkaa käyttöoikeuksia", + "deleteKey": "Poista avain", + "model": "{count} malli", + "models": "{count} mallit", + "permissionsTitle": "Luvat: {name}", + "allowAllDesc": "Tällä avaimella pääsee kaikkiin saatavilla oleviin malleihin.", + "restrictDesc": "Tällä avaimella voi käyttää {selectedCount}/{totalModels} mallia.", + "selectedCount": "{count} valittu" + }, + "auditLog": { + "title": "Tarkastusloki", + "searchPlaceholder": "Hakutoiminnot...", + "action": "Toiminta", + "actor": "näyttelijä", + "target": "Kohde", + "ipAddress": "IP-osoite", + "timestamp": "Aikaleima", + "noEntries": "Tarkastusmerkintöjä ei löytynyt", + "filterByAction": "Suodata toiminnon mukaan...", + "filterByActor": "Suodata näyttelijän mukaan...", + "filterEntriesAria": "Suodata tarkastuslokin merkinnät", + "filterByActionTypeAria": "Suodata toimintotyypin mukaan", + "filterByActorAria": "Suodata näyttelijän mukaan", + "refreshAuditLogAria": "Päivitä tarkastusloki", + "tableAria": "Tarkastuslokimerkinnät", + "failedFetchAuditLog": "Valvontalokin nouto epäonnistui", + "notAvailable": "—", + "description": "Hallinnolliset toimet ja turvallisuustapahtumat", + "showing": "Näytetään {count} merkintää (poikkeama {offset})", + "previous": "Edellinen" + }, + "cliTools": { + "title": "CLI-työkalut", + "noActiveProviders": "Ei aktiivisia palveluntarjoajia", + "noActiveProvidersDesc": "Lisää ja yhdistä ensin palveluntarjoajat määrittääksesi CLI-työkalut.", + "mapModels": "Karttamallit", + "testConnection": "Testaa yhteys", + "connectionStatus": "Yhteyden tila", + "configureEndpoint": "Määritä päätepiste", + "instructions": "Ohjeet", + "modelMapping": "Mallin kartoitus", + "baseUrl": "Perus-URL-osoite", + "apiKey": "API-avain", + "configured": "Määritetty", + "notConfigured": "Ei määritetty", + "notInstalled": "Ei asennettu", + "custom": "Mukautettu", + "unknown": "Tuntematon", + "lastSavedAt": "Viimeksi tallennettu: {date}", + "never": "Ei koskaan", + "justNow": "juuri nyt", + "minutesAgoShort": "{count}min sitten", + "hoursAgoShort": "{count}h sitten", + "daysAgoShort": "{count}pv sitten", + "monthsAgoShort": "{count}kk sitten", + "yearsAgoShort": "{count}v sitten", + "runtimeCheckFailed": "Ajonaikainen tarkistus epäonnistui", + "yourApiKeyPlaceholder": "sinun-api-avain", + "modelPlaceholder": "toimittaja/mallitunnus", + "configurationSaved": "Määritykset tallennettu onnistuneesti.", + "failedToSave": "Määrityksen tallentaminen epäonnistui.", + "noApiKeysCreateOne": "Ei API-avaimia – Luo yksi Avaimet-sivulla", + "defaultOmnirouteKey": "sk_omniroute (oletus)", + "selectModel": "Valitse Malli", + "selectModelForAlias": "Valitse malli kohteelle {alias}", + "selectModelForTool": "Valitse malli kohteelle {tool}", + "select": "Valitse", + "clear": "Selkeä", + "comingSoon": "Tulossa pian", + "checkingRuntime": "Tarkistetaan ajonaikaista tilaa...", + "guideOnlyIntegration": "Vain ohjeellinen integrointi (ei vaadi paikallista suoritusaikaa)", + "cliRuntimeDetected": "CLI-ajoaika havaittu ja valmis", + "cliFoundNotRunnable": "CLI löytyi, mutta ei ajettavissa{reason}", + "cliRuntimeNotDetected": "CLI-ajoaikaa ei havaittu", + "binary": "Binääri", + "configPath": "Konfigurointipolku", + "configPathShort": "Konfig", + "failedCheckRuntimeStatus": "Ajonaikaisen tilan tarkistaminen epäonnistui.", + "copy": "Kopioi", + "copied": "Kopioitu", + "copyConfig": "Kopioi kokoonpano", + "saveConfig": "Tallenna kokoonpano", + "selectionSaved": "Valinta tallennettu", + "guide": "Opas", + "detected": "Havaittu", + "notReady": "Ei valmis", + "active": "Aktiivinen", + "inactive": "Ei-aktiivinen", + "startMitm": "Käynnistä MITM", + "stopMitm": "Lopeta MITM", + "mitmStarted": "MITM alkoi onnistuneesti!", + "mitmStopped": "MITM pysähtyi onnistuneesti!", + "failedStart": "MITM:n käynnistäminen epäonnistui", + "failedStop": "MITM:n pysäyttäminen epäonnistui", + "saveMappings": "Tallenna kartoitukset", + "mappingsSaved": "Kartaukset tallennettu!", + "failedSaveMappings": "Kartoitusten tallentaminen epäonnistui", + "howItWorks": "Miten se toimii:", + "antigravityHowWorksDesc": "Antigravity lähettää pyyntöjä Googlen päätepisteeseen. MITM sieppaa ja ohjaa ne OmniRouteen.", + "antigravityStep1": "1. Käynnistä MITM reitittääksesi pyynnöt OmniRouten kautta.", + "antigravityStep2Prefix": "2. Lisää", + "antigravityStep2Suffix": "hosts-tiedostoon muodossa 127.0.0.1.", + "antigravityStep3": "3. Avaa Antigravity ja pyynnöt välitetään.", + "sudoPasswordRequiredTitle": "Sudo-salasana vaaditaan", + "sudoPasswordHint": "Järjestelmänvalvojan salasana tarvitaan hosts-tiedoston ja järjestelmän välityspalvelimen asetusten muokkaamiseen.", + "enterSudoPassword": "Anna sudo-salasana", + "sudoPasswordRequiredError": "Sudo-salasana vaaditaan.", + "cancel": "Peruuta", + "confirm": "Vahvista", + "settingsApplied": "Asetukset otettu käyttöön onnistuneesti!", + "failedApplySettings": "Asetusten käyttöönotto epäonnistui", + "settingsReset": "Asetusten nollaus onnistui!", + "failedResetSettings": "Asetusten nollaus epäonnistui", + "backupRestored": "Varmuuskopio palautettu!", + "failedRestore": "Palauttaminen epäonnistui", + "checkingCli": "Tarkistetaan {tool} CLI...", + "cliNotRunnable": "{tool} CLI asennettu, mutta ei ajettavissa", + "cliNotInstalled": "{tool} CLI:tä ei ole asennettu", + "cliNotDetected": "{tool} CLI:tä ei havaittu", + "cliDetectedReady": "{tool} CLI havaittu ja valmis", + "cliFoundFailedHealthcheck": "{tool} CLI löydettiin, mutta ajonaikainen kuntotarkastus epäonnistui{reason}.", + "installCliPrompt": "Asenna {tool} CLI käyttääksesi tätä ominaisuutta.", + "installCodexPrompt": "Asenna Codex CLI käyttääksesi automaattista käyttöönottoa.", + "hide": "Piilota", + "howToInstall": "Kuinka asentaa", + "installationGuide": "Asennusopas", + "platforms": "macOS / Linux / Windows:", + "afterInstallationRun": "Suorita asennuksen jälkeen", + "toVerify": "varmistaaksesi.", + "current": "Nykyinen", + "baseUrlPlaceholder": "https://.../v1", + "resetToDefault": "Palauta oletusarvo", + "providerModelPlaceholder": "toimittaja/mallitunnus", + "apply": "Käytä", + "reset": "Nollaa", + "manualConfig": "Manuaalinen konfigurointi", + "backups": "Varmuuskopiot", + "configBackups": "Määritysten varmuuskopiot", + "noBackupsYet": "Ei vielä varmuuskopioita. Varmuuskopiot luodaan automaattisesti ennen jokaista käyttöönottoa tai nollausta.", + "restore": "Palauta", + "backupRestoredReloading": "Varmuuskopio palautettu! Ladataan tilaa uudelleen...", + "failedRestoreBackup": "Varmuuskopion palauttaminen epäonnistui", + "applied": "Sovellettu!", + "failed": "Epäonnistui", + "resetDone": "Nollaa!", + "omnirouteConfiguredOpenAiCompatible": "OmniRoute on määritetty OpenAI-yhteensopivaksi palveluntarjoajaksi", + "provider": "Palveluntarjoaja", + "model": "Malli", + "providers": "Palveluntarjoajat", + "auth": "Tod", + "noApiKeysAvailable": "API-avaimia ei ole saatavilla", + "usingDefaultOmniroute": "Oletuksena: sk_omniroute", + "updateConfig": "Päivitä Config", + "applyConfig": "Käytä konfiguraatiota", + "noBackupsAvailable": "Varmuuskopioita ei ole saatavilla.", + "profileSaved": "Profiili \"{name}\" tallennettu!", + "failedSaveProfile": "Profiilin tallennus epäonnistui", + "profileActivated": "Profiili aktivoitu!", + "failedActivateProfile": "Profiilin aktivointi epäonnistui", + "profiles": "Profiilit", + "savedProfiles": "Tallennetut profiilit", + "noProfilesYet": "Ei vielä tallennettuja profiileja. Tallenna nykyinen konfiguraatio alla olevaksi profiiliksi.", + "activate": "Aktivoi", + "deleteProfile": "Poista profiili", + "profileNamePlaceholder": "Profiilin nimi (esim. henkilökohtainen tili)", + "saveCurrent": "Tallenna nykyinen", + "codexAuthNotePrefix": "Codex käyttää", + "codexAuthNoteMiddle": "kanssa", + "codexAuthNoteSuffix": "Napsauta \"Käytä\" määrittääksesi automaattisesti.", + "claudeManualConfiguration": "Claude CLI - Manuaalinen konfigurointi", + "codexManualConfiguration": "Codex CLI - Manuaalinen konfigurointi", + "droidManualConfiguration": "Tehdasdroidi - manuaalinen konfigurointi", + "openClawManualConfiguration": "Open Claw - Manuaalinen konfigurointi", + "clineManualConfiguration": "Cline Manuaalinen konfigurointi", + "kiloManualConfiguration": "Kilo Code Manuaalinen konfigurointi", + "toolDescriptions": { + "antigravity": "Google Antigravity IDE ja MITM", + "claude": "Antrooppinen Claude Code CLI", + "codex": "OpenAI Codex CLI", + "droid": "Tehdas Droid AI Assistant", + "openclaw": "Avaa Claw AI Assistant", + "cline": "Cline AI Coding Assistant CLI", + "kilo": "Kilo Code AI Assistant CLI", + "cursor": "Cursor AI Code Editor", + "continue": "Jatka AI Assistantia" + }, + "guides": { + "cursor": { + "notes": { + "0": "Tämän ominaisuuden käyttäminen vaatii Cursor Pro -tilin.", + "1": "Kohdistin reitittää pyynnöt oman palvelimensa kautta, joten paikallista päätepistettä ei tueta. Ota Cloud Endpoint käyttöön asetuksista." + }, + "steps": { + "1": { + "title": "Avaa Asetukset", + "desc": "Siirry kohtaan Asetukset -> Mallit" + }, + "2": { + "title": "Ota OpenAI API käyttöön", + "desc": "Ota käyttöön \"OpenAI API-avain\" -vaihtoehto" + }, + "3": { + "title": "Perus-URL-osoite" + }, + "4": { + "title": "API-avain" + }, + "5": { + "title": "Lisää mukautettu malli", + "desc": "Napsauta \"Näytä kaikki mallit\" -> \"Lisää mukautettu malli\"" + }, + "6": { + "title": "Valitse Malli" + } + } + }, + "continue": { + "steps": { + "1": { + "title": "Avaa Config", + "desc": "Avaa Jatka määritystiedosto" + }, + "2": { + "title": "API-avain" + }, + "3": { + "title": "Valitse Malli" + }, + "4": { + "title": "Lisää mallin kokoonpano", + "desc": "Lisää seuraavat kokoonpanot mallien matriisiisi:" + } + } + } + } + }, + "combos": { + "title": "Yhdistelmät", + "description": "Luo mallikomboja painotetulla reitityksellä ja varatuella", + "createCombo": "Luo yhdistelmä", + "editCombo": "Muokkaa yhdistelmää", + "deleteCombo": "Poista yhdistelmä", + "noModels": "Ei malleja", + "noModelsYet": "Malleja ei ole vielä lisätty", + "addModel": "Lisää malli", + "addModelToCombo": "Lisää malli yhdistelmään", + "routingStrategy": "Reititysstrategia", + "maxRetries": "Max Uudelleenyritykset", + "timeout": "Aikakatkaisu (ms)", + "healthcheck": "Terveystarkastus", + "priority": "Prioriteetti", + "fallback": "Varaa", + "roundRobin": "Round Robin", + "random": "Satunnainen", + "leastLatency": "Pienin latenssi", + "comboName": "Yhdistelmänimi", + "comboNamePlaceholder": "minun yhdistelmäni", + "deleteConfirm": "Poistetaanko tämä yhdistelmä?", + "noCombosYet": "Ei komboja vielä", + "comboCreated": "Yhdistelmä luotiin onnistuneesti", + "comboUpdated": "Yhdistelmän päivitys onnistui", + "comboDeleted": "Yhdistelmä poistettu", + "failedCreate": "Yhdistelmän luominen epäonnistui", + "failedUpdate": "Yhdistelmän päivittäminen epäonnistui", + "errorCreating": "Virhe yhdistelmän luomisessa", + "errorUpdating": "Virhe yhdistelmän päivityksessä", + "errorDeleting": "Virhe yhdistelmän poistamisessa", + "testFailed": "Testipyyntö epäonnistui", + "failedToggle": "Yhdistelmän vaihto epäonnistui", + "testResults": "Testitulokset – {name}", + "resolvedBy": "Ratkaisi:", + "more": "+{count} lisää", + "reqs": "vaatimukset", + "success": "menestystä", + "proxyConfigured": "Välityspalvelin määritetty", + "copyComboName": "Kopioi yhdistelmänimi", + "enableCombo": "Ota yhdistelmä käyttöön", + "disableCombo": "Poista yhdistelmä käytöstä", + "testCombo": "Testiyhdistelmä", + "duplicate": "Kopioi", + "proxyConfig": "Välityspalvelimen määritys", + "nameRequired": "Nimi vaaditaan", + "nameInvalid": "Vain kirjaimet, numerot, -, _, / ja . sallittu", + "nameHint": "Kirjaimet, numerot, -, _, / ja . sallittu", + "priorityDesc": "Peräkkäinen palautus: kokeilee ensin mallia 1, sitten 2 jne.", + "weightedDesc": "Jakaa liikenteen painoprosentin mukaan varauksella", + "roundRobinDesc": "Pyöreä jakelu: jokainen pyyntö siirtyy seuraavaan kiertoon malliin", + "randomDesc": "Yhtenäinen satunnainen valinta, sitten takaisin muihin malleihin", + "leastUsedDesc": "Valitsee mallin, jolla on vähiten pyyntöjä ja tasapainottaa kuormitusta ajan myötä", + "costOptimizedDesc": "Reitit edullisimpaan malliin ensin hinnoittelun perusteella", + "models": "Mallit", + "autoBalance": "Automaattinen tasapainotus", + "advancedSettings": "Lisäasetukset", + "retryDelay": "Uudelleenyrityksen viive (ms)", + "concurrencyPerModel": "Samanaikaisuus / malli", + "queueTimeout": "Jonon aikakatkaisu (ms)", + "advancedHint": "Jätä tyhjäksi, jos haluat käyttää yleisiä oletusasetuksia. Nämä ohittavat palveluntarjoajakohtaiset asetukset.", + "moveUp": "Siirrä ylös", + "moveDown": "Siirry alas", + "removeModel": "Poista", + "saving": "Tallennetaan...", + "weighted": "Painotettu", + "leastUsed": "Vähiten käytetty", + "costOpt": "Kustannus-opt" + }, + "costs": { + "title": "Kustannukset", + "budget": "Budjetti", + "totalCost": "Kokonaiskustannukset", + "breakdown": "Kustannusten erittely", + "noData": "Ei hintatietoja", + "byModel": "Mallin mukaan", + "byProvider": "Palveluntarjoajan toimesta" + }, + "endpoint": { + "title": "API-päätepiste", + "available": "Käytettävissä olevat päätepisteet", + "cloudProxy": "Pilvivälityspalvelin", + "disableConfirm": "Haluatko varmasti poistaa pilvivälityspalvelimen käytöstä?", + "baseUrl": "Perus-URL-osoite", + "apiKeyLabel": "API-avain", + "registeredKeys": "Rekisteröity avaimet", + "chatCompletions": "Chatin loppuun saattaminen", + "responses": "Vastaukset", + "listModels": "Listaa mallit", + "usingCloudProxy": "Cloud Proxyn käyttäminen", + "usingLocalServer": "Paikallisen palvelimen käyttö", + "machineId": "Koneen tunnus: {id}...", + "disableCloud": "Poista Cloud käytöstä", + "enableCloud": "Ota Cloud käyttöön", + "modelsAcrossEndpoints": "{models} mallit {endpoints} päätepisteen välillä", + "chatDesc": "Suoratoisto ja ei-striimaus chat kaikkien palveluntarjoajien kanssa", + "embeddings": "Upotukset", + "embeddingsDesc": "Tekstin upotukset haku- ja RAG-putkistoja varten", + "imageGeneration": "Kuvan luominen", + "imageDesc": "Luo kuvia tekstikehotteista", + "rerank": "Järjestä uudelleen", + "rerankDesc": "Järjestä asiakirjat uudelleen kyselyn osuvuuden mukaan", + "audioTranscription": "Äänen transkriptio", + "audioTranscriptionDesc": "Literoi äänitiedostot tekstiksi (kuiskaus)", + "textToSpeech": "Tekstistä puheeksi", + "textToSpeechDesc": "Muunna teksti luonnolliselta kuulostavaksi puheeksi", + "moderations": "Moderaatiot", + "moderationsDesc": "Sisällön moderointi ja turvallisuusluokitus", + "enableCloudTitle": "Ota Cloud Proxy käyttöön", + "whatYouGet": "Mitä saat", + "cloudBenefitAccess": "Käytä sovellusliittymääsi mistä päin maailmaa tahansa", + "cloudBenefitShare": "Jaa päätepiste tiimisi kanssa helposti", + "cloudBenefitPorts": "Ei tarvitse avata portteja tai määrittää palomuuria", + "cloudBenefitEdge": "Nopea maailmanlaajuinen reunaverkko", + "cloudSessionNote": "Cloud säilyttää todennusistunnon 1 päivän ajan. Jos sitä ei käytetä, se poistetaan automaattisesti.", + "cloudUnstableNote": "Pilvi on tällä hetkellä epävakaa Claude Code OAuthin kanssa joissakin tapauksissa.", + "cloudConnected": "Cloud Proxy yhdistetty!", + "connectingToCloud": "Yhdistetään pilveen...", + "verifyingConnection": "Vahvistetaan yhteyttä...", + "connecting": "Yhdistetään...", + "verifying": "Vahvistetaan...", + "connected": "Yhdistetty!", + "disableCloudTitle": "Poista Cloud Proxy käytöstä", + "disableWarning": "Kaikki todennusistunnot poistetaan pilvestä.", + "syncingData": "Synkronoidaan uusimpia tietoja...", + "disablingCloud": "Poistetaan pilvi käytöstä...", + "syncing": "Synkronoidaan...", + "disabling": "Poistetaan käytöstä...", + "cloudConnectedVerified": "Cloud Proxy yhdistetty ja vahvistettu!", + "connectedVerificationPending": "Yhdistetty — vahvistus odottaa", + "connectedVerificationPendingWithError": "Yhdistetty – vahvistus odottaa: {error}", + "cloudDisabledSuccess": "Pilvi poistettu käytöstä onnistuneesti", + "syncedSuccess": "Synkronointi onnistui", + "failedDisable": "Pilven poistaminen käytöstä epäonnistui", + "failedEnable": "Pilven käyttöönotto epäonnistui", + "cloudRequestTimeout": "Pilvipyynnön aikakatkaisu", + "cloudRequestFailed": "Pilvipyyntö epäonnistui", + "cloudWorkerUnreachable": "Pilvityöntekijää ei tavoitettu. Varmista, että pilvipalvelu on käynnissä (npm run dev in /cloud).", + "connectionFailed": "Yhteys epäonnistui", + "syncFailed": "Pilvitietojen synkronointi epäonnistui", + "providerModelsTitle": "{provider} – Mallit", + "noModelsForProvider": "Tälle tarjoajalle ei ole saatavilla malleja.", + "chat": "Chat", + "embedding": "Upottaminen", + "image": "Kuva", + "custom": "mukautettu", + "modelsCount": "{count, plural, one {# model} other {# models}}" + }, + "health": { + "title": "Järjestelmän terveys", + "description": "OmniRoute-instanssisi reaaliaikainen seuranta", + "healthy": "Terve", + "degraded": "Heikentynyt", + "down": "Alas", + "uptime": "Päällä", + "memory": "Muisti", + "memoryRss": "Muisti (RSS)", + "heap": "Kasa", + "cpu": "CPU", + "database": "Tietokanta", + "version": "Versio", + "lastCheck": "Viimeinen tarkistus", + "providerHealth": "Palveluntarjoajan terveys", + "systemMetrics": "Järjestelmän mittarit", + "tokenHealth": "Token Health", + "refreshAll": "Päivitä kaikki", + "checkNow": "Tarkista nyt", + "loadingHealth": "Ladataan terveystietoja…", + "failedToLoad": "Terveystietojen lataaminen epäonnistui: {error}", + "retry": "Yritä uudelleen", + "allOperational": "Kaikki järjestelmät toimivat", + "issuesDetected": "Järjestelmäongelmia havaittu", + "updatedAt": "Päivitetty {time}", + "latency": "Latenssi", + "latencyP50": "p50", + "latencyP95": "p95", + "latencyP99": "p99", + "millisecondsShort": "{value}ms", + "notAvailable": "—", + "totalRequests": "Pyyntöjä yhteensä", + "noDataYet": "Ei vielä dataa", + "promptCache": "Kehotusvälimuisti", + "entries": "merkinnät", + "hitRate": "Osumaprosentti", + "hitsMisses": "Osumat / Miss", + "signatureCache": "Allekirjoitusvälimuisti", + "signatureDefaults": "Oletukset", + "signatureTool": "Työkalu", + "signatureFamily": "Perhe", + "signatureSession": "Istunto", + "recovering": "Toipumassa", + "noCBData": "Katkaisijatietoja ei ole saatavilla. Tee ensin pyyntöjä.", + "providerHealthStatusAria": "Palveluntarjoajan terveydentila", + "issuesLabel": "Ongelmia havaittu", + "operational": "Toiminnassa", + "providers": "Palveluntarjoajat", + "healthyCount": "{count} terve", + "nodeVersion": "Solmu {version}", + "failures": "{count} virhe", + "failuresPlural": "{count} virheitä", + "lastFailure": "Viimeinen", + "rateLimitStatus": "Rate Limit Status", + "activeLimiters": "{count} aktiivinen rajoitin", + "activeLimitersPlural": "{count} aktiiviset rajoittimet", + "queued": "Jonossa", + "queuedCount": "{count} jonossa", + "running": "käynnissä", + "runningCount": "{count} käynnissä", + "ok": "OK", + "activeLockouts": "Aktiiviset lukitukset", + "resetConfirm": "Nollataanko kaikki katkaisijat terveeseen tilaan? Tämä tyhjentää kaikki virhemäärät ja palauttaa kaikki palveluntarjoajat toimintatilaan.", + "resetAllTitle": "Palauta kaikki katkaisijat terveeseen tilaan", + "resetting": "Nollataan...", + "resetAll": "Nollaa kaikki", + "until": "{time} asti" + }, + "limits": { + "title": "Rajoitukset ja kiintiöt", + "rateLimit": "Rate Limit", + "remaining": "Jäljellä", + "requestsPerMinute": "Pyynnöt/min", + "tokensPerMinute": "Tokenit/min", + "dailyLimit": "Päivittäinen raja" + }, + "logs": { + "title": "Lokit", + "requestLogs": "Pyydä lokit", + "proxyLogs": "Välityspalvelimen lokit", + "auditLog": "Tarkastusloki", + "console": "konsoli", + "auditLogDesc": "Hallinnolliset toimet ja turvallisuustapahtumat", + "loading": "Ladataan...", + "refresh": "Päivitä", + "filterByAction": "Suodata toiminnon mukaan...", + "filterByActor": "Suodata näyttelijän mukaan...", + "filterEntriesAria": "Suodata tarkastuslokin merkinnät", + "filterByActionTypeAria": "Suodata toimintotyypin mukaan", + "filterByActorAria": "Suodata näyttelijän mukaan", + "refreshAuditLogAria": "Päivitä tarkastusloki", + "tableAria": "Tarkastuslokimerkinnät", + "failedFetchAuditLog": "Valvontalokin nouto epäonnistui", + "showing": "Näytetään {count} merkintää (poikkeama {offset})", + "search": "Etsi", + "timestamp": "Aikaleima", + "action": "Toiminta", + "actor": "näyttelijä", + "target": "Kohde", + "details": "Yksityiskohdat", + "ipAddress": "IP-osoite", + "notAvailable": "—", + "noEntries": "Tarkastuslokimerkintöjä ei löytynyt", + "previous": "Edellinen", + "next": "Seuraavaksi" + }, + "onboarding": { + "welcome": "Tervetuloa", + "security": "Turvallisuus", + "test": "Testaa", + "ready": "Valmis!", + "setPassword": "Aseta salasana", + "addProvider": "Lisää ensimmäinen palveluntarjoajasi", + "getStarted": "Aloita", + "skip": "Ohita", + "skipWizard": "Ohita ohjattu toiminto kokonaan", + "skipPassword": "Ohita salasanan asetus", + "skipAndContinue": "Ohita ja jatka", + "passwordLabel": "Salasana", + "confirmPassword": "Vahvista salasana", + "enterPassword": "Anna salasana", + "confirmPasswordPlaceholder": "Vahvista salasana", + "passwordsMismatch": "Salasanat eivät täsmää", + "setupComplete": "Asennus valmis!", + "goToDashboard": "Siirry kohtaan Dashboard →", + "welcomeDesc": "OmniRoute on paikallinen AI API -välityspalvelin. Se reitittää pyynnöt useille tekoälypalveluntarjoajille kuormituksen tasapainottamisen, vikasietoisuuden ja käytön seurannan avulla.", + "multiProvider": "Multi-Provider", + "usageTracking": "Käytön seuranta", + "apiKeyMgmt": "API-avainhallinta", + "securityDesc": "Aseta salasana kojelautasi suojaamiseksi tai ohita toistaiseksi.", + "providerDesc": "Yhdistä ensimmäinen AI-palveluntarjoajasi. Voit lisätä myöhemmin lisää.", + "apiKeyRequired": "API-avain (pakollinen)", + "customUrlOptional": "Muokattu URL-osoite (valinnainen)", + "testDesc": "Varmistetaan, että palveluntarjoajayhteytesi toimii.", + "runTest": "Suorita yhteystesti", + "testingConnection": "Testataan yhteyttä...", + "connectionSuccessful": "Yhteys onnistui! Palveluntarjoajasi on valmis.", + "noProviderFound": "Palveluntarjoajaa ei löydy. Voit lisätä sellaisen hallintapaneelista myöhemmin.", + "testFailed": "Testi epäonnistui, mutta voit määrittää tämän myöhemmin.", + "couldNotTest": "Ei pystynyt testaamaan juuri nyt. Voit testata kojelaudalta.", + "doneDesc": "Kaikki on valmista! OmniRoute-esiintymäsi on määritetty ja valmis välittämään AI-pyyntöjä.", + "yourEndpoint": "Päätepisteesi:", + "continue": "Jatka", + "retry": "Yritä uudelleen", + "failedSetPassword": "Salasanan asettaminen epäonnistui. Yritä uudelleen.", + "failedAddProvider": "Palveluntarjoajan lisääminen epäonnistui. Yritä uudelleen.", + "connectionError": "Yhteysvirhe. Yritä uudelleen.", + "provider": "Palveluntarjoaja" + }, + "providers": { + "title": "Palveluntarjoajat", + "addProvider": "Lisää palveluntarjoaja", + "editProvider": "Muokkaa toimittajaa", + "deleteProvider": "Poista palveluntarjoaja", + "noProviders": "Palveluntarjoajia ei ole määritetty", + "modelAvailability": "Mallin saatavuus", + "accounts": "Tilit", + "newAccount": "Uusi tili", + "deleteConfirm": "Haluatko varmasti poistaa tämän palveluntarjoajan?", + "testing": "Testataan...", + "testConnection": "Testaa yhteys", + "testSuccess": "Yhteys onnistui", + "testFailed": "Yhteys epäonnistui", + "available": "Saatavilla", + "cooldown": "Jäähdytys", + "unavailable": "Ei saatavilla", + "unknown": "Tuntematon", + "oauthLabel": "OAuth", + "compatibleLabel": "Yhteensopiva", + "chat": "Chat", + "responses": "Vastaukset", + "messages": "Viestit", + "oauthProviders": "OAuth-palveluntarjoajat", + "freeProviders": "Ilmaiset palveluntarjoajat", + "apiKeyProviders": "API-avainten tarjoajat", + "compatibleProviders": "API Key -yhteensopivat palveluntarjoajat", + "testAll": "Testaa kaikki", + "testAllOAuth": "Testaa kaikki OAuth-yhteydet", + "testAllFree": "Testaa kaikki ilmaiset yhteydet", + "testAllApiKey": "Testaa kaikki API-avainyhteydet", + "testAllCompatible": "Testaa kaikki yhteensopivat liitännät", + "connected": "{count} Yhdistetty", + "errorCount": "{count} Virhe ({code})", + "errorCountNoCode": "{count} Virhe", + "noConnections": "Ei yhteyksiä", + "disabled": "Ei käytössä", + "enableProvider": "Ota palveluntarjoaja käyttöön", + "disableProvider": "Poista palveluntarjoaja käytöstä", + "testResults": "Testitulokset", + "noCompatibleYet": "Yhteensopivia palveluntarjoajia ei ole vielä lisätty", + "compatibleHint": "Käytä yllä olevia painikkeita lisätäksesi OpenAI- tai Anthropic-yhteensopivia päätepisteitä", + "addOpenAICompatible": "Lisää OpenAI-yhteensopiva", + "addAnthropicCompatible": "Lisää Anthropic Compatible", + "addNewProvider": "Lisää uusi toimittaja", + "backToProviders": "Takaisin palveluntarjoajiin", + "configureNewProvider": "Määritä uusi AI-palveluntarjoaja käytettäväksi sovelluksissasi.", + "providerLabel": "Palveluntarjoaja", + "selectProvider": "Valitse palveluntarjoaja", + "selectedProvider": "Valittu palveluntarjoaja", + "authMethod": "Todennusmenetelmä", + "apiKeyLabel": "API-avain", + "apiKeyRequired": "API-avain vaaditaan", + "selectProviderRequired": "Valitse palveluntarjoaja", + "enterApiKey": "Anna API-avaimesi", + "apiKeySecure": "API-avaimesi salataan ja tallennetaan turvallisesti.", + "oauth2Connect": "Yhdistä OAuth2:een", + "oauth2Label": "OAuth2", + "oauth2Desc": "Yhdistä tilisi OAuth2-todennusta käyttämällä.", + "displayName": "Näyttönimi", + "displayNamePlaceholder": "esim. Production API, Dev Environment", + "displayNameHint": "Valinnainen. Ystävällinen nimi tämän kokoonpanon tunnistamiseksi.", + "active": "Aktiivinen", + "activeDescription": "Ota tämä palveluntarjoaja käyttöön sovelluksissasi", + "cancel": "Peruuta", + "createProvider": "Luo palveluntarjoaja", + "failedCreate": "Palveluntarjoajan luominen epäonnistui", + "errorOccurred": "Tapahtui virhe. Yritä uudelleen.", + "modelStatus": "Mallin tila", + "allModelsOperational": "Kaikki mallit toimivat", + "modelsWithIssues": "{count} malli(t), joissa on ongelmia", + "allModelsNormal": "Kaikki mallit reagoivat normaalisti.", + "cooldownCleared": "Jäähdytys tyhjennetty kohteelle {model}", + "failedClearCooldown": "Jäähdytyksen tyhjennys epäonnistui", + "loadingAvailability": "Ladataan mallin saatavuutta...", + "clearCooldown": "Selkeä", + "clearing": "Tyhjennetään...", + "until": "{time} asti", + "providerTestFailed": "Palveluntarjoajan testi epäonnistui", + "modeTest": "{mode} Testi", + "passedCount": "{count} hyväksytty", + "failedCount": "{count} epäonnistui", + "testedCount": "{count} testattu", + "millisecondsAbbr": "{value}ms", + "okShort": "OK", + "errorShort": "VIRHE", + "noActiveConnectionsInGroup": "Tälle ryhmälle ei löytynyt aktiivisia yhteyksiä.", + "allTestsPassed": "Kaikki {total} testit läpäisty", + "testSummary": "{passed}/{total} hyväksytty, {failed} epäonnistui", + "nameLabel": "Nimi", + "prefixLabel": "Etuliite", + "baseUrlLabel": "Perus-URL-osoite", + "apiTypeLabel": "API-tyyppi", + "prefixHint": "Pakollinen. Ainutlaatuinen etuliite mallien nimille.", + "nameHint": "Pakollinen. Ystävällinen etiketti tälle solmulle.", + "baseUrlHint": "Pakollinen. Palveluntarjoajan API-perus-URL-osoite.", + "anthropicPrefixPlaceholder": "ac-prod", + "openaiPrefixPlaceholder": "oc-prod", + "anthropicBaseUrlPlaceholder": "https://api.anthropic.com/v1", + "openaiBaseUrlPlaceholder": "https://api.openai.com/v1", + "validateConnection": "Vahvista yhteys", + "validating": "Vahvistetaan...", + "connectionValid": "Yhteys on voimassa!", + "connectionFailed": "Yhteys epäonnistui. Tarkista URL-osoite ja avain.", + "testKeyLabel": "Testaa API-avain", + "testKeyPlaceholder": "sk-... (vain vahvistusta varten)", + "providerNotFound": "Palveluntarjoajaa ei löydy", + "deleteConnectionConfirm": "Poistetaanko tämä yhteys?", + "failedSetAlias": "Aliaksen asettaminen epäonnistui", + "failedSaveConnection": "Yhteyden tallentaminen epäonnistui", + "failedSaveConnectionRetry": "Yhteyden tallentaminen epäonnistui. Yritä uudelleen.", + "failedRetestConnection": "Yhteyden uudelleentestaus epäonnistui", + "deleteCompatibleNodeConfirm": "Poistetaanko tämä {type} Yhteensopiva solmu?", + "anthropicCompatibleDetails": "Anthropic-yhteensopivat yksityiskohdat", + "openaiCompatibleDetails": "OpenAI-yhteensopivat tiedot", + "messagesApi": "Viestit API", + "responsesApi": "Responses API", + "chatCompletions": "Chatin loppuun saattaminen", + "importingModels": "Tuodaan...", + "importFromModels": "Tuo / mallit", + "addConnectionToImport": "Lisää yhteys ottaaksesi tuonnin käyttöön.", + "noModelsConfigured": "Ei malleja määritetty", + "connectionCount": "{count} yhteyttä", + "fetchingModels": "Haetaan saatavilla olevia malleja...", + "failedFetchModels": "Mallien nouto epäonnistui", + "noModelsFound": "Malleja ei löytynyt", + "importFailed": "Tuonti epäonnistui", + "noNewModelsAdded": "Uusia malleja ei lisätty.", + "adding": "Lisätään...", + "importingModelsTitle": "Mallien tuonti", + "copyModel": "Kopioi malli", + "removeModel": "Poista malli", + "rateLimitProtected": "Suojattu", + "rateLimitUnprotected": "Suojaamaton", + "enableRateLimitProtection": "Ota nopeusrajoitussuoja käyttöön napsauttamalla", + "disableRateLimitProtection": "Napsauta poistaaksesi nopeusrajoituksen suojauksen", + "productionKey": "Tuotantoavain", + "enterNewApiKey": "Anna uusi API-avain", + "optional": "Valinnainen", + "anthropicCompatibleName": "Antrooppinen yhteensopiva", + "openaiCompatibleName": "OpenAI-yhteensopiva", + "failedImportModels": "Mallien tuonti epäonnistui", + "noModelsReturnedFromEndpoint": "Ei malleja palautettu /models-päätepisteestä.", + "importingModelsProgress": "Tuodaan {current}/{total} mallia...", + "foundModelsStartingImport": "Löytyi {count} mallia. Aloitetaan tuontia...", + "importingModelById": "Tuodaan {modelId}...", + "importSuccessCount": "{count, plural, one {# model} other {# models}} tuotu onnistuneesti!", + "noNewModelsAddedExisting": "Uusia malleja ei lisätty (kaikki on jo olemassa).", + "importDoneCount": "✓ Valmis! {count, plural, one {# model imported.} other {# models imported.}}", + "unexpectedErrorOccurred": "Tapahtui odottamaton virhe", + "connectionCountLabel": "{count, plural, one {# connection} other {# connections}}", + "messagesPath": "viestejä", + "responsesPath": "vastaukset", + "chatCompletionsPath": "chat / täydennykset", + "add": "Lisää", + "edit": "Muokkaa", + "delete": "Poista", + "anthropic": "Antrooppinen", + "openai": "OpenAI", + "singleConnectionPerCompatible": "Vain yksi yhteys on sallittu yhteensopivaa solmua kohden. Lisää toinen solmu, jos tarvitset lisää yhteyksiä.", + "connections": "Liitännät", + "providerProxyTitleConfigured": "Palveluntarjoajan välityspalvelin: {host}", + "configured": "määritetty", + "providerProxyConfigureHint": "Määritä välityspalvelin kaikille tämän palveluntarjoajan yhteyksille", + "providerProxy": "Palveluntarjoajan välityspalvelin", + "noConnectionsYet": "Ei yhteyksiä vielä", + "addFirstConnectionHint": "Aloita lisäämällä ensimmäinen yhteys", + "addConnection": "Lisää yhteys", + "availableModels": "Saatavilla olevat mallit", + "pageAutoRefresh": "Sivu päivittyy automaattisesti...", + "statusDisabled": "pois käytöstä", + "statusConnected": "yhdistetty", + "statusRuntimeIssue": "ajonaikainen ongelma", + "statusAuthFailed": "todennus epäonnistui", + "statusRateLimited": "hinta rajoitettu", + "statusNetworkIssue": "verkko-ongelma", + "statusTestUnsupported": "testiä ei tueta", + "statusUnavailable": "ei ole saatavilla", + "statusFailed": "epäonnistunut", + "statusError": "virhe", + "oauthAccount": "OAuth-tili", + "errorTypeRuntime": "Paikallinen suoritusaika", + "errorTypeUpstreamAuth": "Varsinainen todennus", + "errorTypeMissingCredential": "Tunnustus puuttuu", + "errorTypeRefreshFailed": "Päivitys epäonnistui", + "errorTypeTokenExpired": "Tunnus on vanhentunut", + "errorTypeRateLimited": "Hinta rajoitettu", + "errorTypeUpstreamUnavailable": "Upstream ei saatavilla", + "errorTypeNetworkError": "Verkkovirhe", + "errorTypeTestUnsupported": "Testiä ei tueta", + "errorTypeUpstreamError": "Virhe ylävirtaan", + "proxySourceGlobal": "Maailmanlaajuinen", + "proxySourceProvider": "Palveluntarjoaja", + "proxySourceKey": "Avain", + "proxyConfiguredBySource": "Välityspalvelin ({source}): {host}", + "autoPriority": "Automaattinen: {priority}", + "proxy": "Välityspalvelin", + "retestAuthentication": "Testaa todennus uudelleen", + "retest": "Testaa uudelleen", + "disableConnection": "Poista yhteys käytöstä", + "enableConnection": "Ota yhteys käyttöön", + "reauthenticateConnection": "Todenna tämä yhteys uudelleen", + "proxyConfig": "Välityspalvelimen konfigurointi", + "aliasExistsAlert": "Alias \"{alias}\" on jo olemassa. Käytä toista mallia tai muokkaa olemassa olevaa aliasta.", + "openRouterAnyModelHint": "OpenRouter tukee mitä tahansa mallia. Lisää malleja ja luo aliaksia nopeaa käyttöä varten.", + "modelIdFromOpenRouter": "Mallin tunnus (OpenRouterista)", + "openRouterModelPlaceholder": "antrooppinen/claude-3-opus", + "customModels": "Mukautetut mallit", + "customModelsHint": "Lisää mallitunnukset, jotka eivät ole oletusluettelossa. Nämä ovat käytettävissä reititystä varten.", + "modelId": "Mallin tunnus", + "customModelPlaceholder": "esim. gpt-4.5-turbo", + "loading": "Ladataan...", + "removeCustomModel": "Poista mukautettu malli", + "noCustomModels": "Mukautettuja malleja ei ole vielä lisätty.", + "allSuggestedAliasesExist": "Kaikki ehdotetut aliakset ovat jo olemassa. Valitse toinen malli tai poista ristiriitaiset aliakset.", + "failedSaveCustomModel": "Muokatun mallin tallentaminen epäonnistui", + "modelAddedSuccess": "Malli {modelId} lisättiin onnistuneesti", + "failedAddModelTryAgain": "Mallin lisääminen epäonnistui. Yritä uudelleen.", + "failedSaveImportedModel": "Tuodun mallin tallentaminen mukautettuun tietokantaan epäonnistui", + "failedImportModelsTryAgain": "Mallien tuonti epäonnistui. Yritä uudelleen.", + "failedRemoveModelFromDatabase": "Mallin poistaminen tietokannasta epäonnistui", + "modelRemovedSuccess": "Mallin poistaminen onnistui", + "failedDeleteModelTryAgain": "Mallin poistaminen epäonnistui. Yritä uudelleen.", + "compatibleModelsDescription": "Lisää {type}-yhteensopivia malleja manuaalisesti tai tuo ne /models-päätepisteestä.", + "anthropicCompatibleModelPlaceholder": "claude-3-opus-20240229", + "openaiCompatibleModelPlaceholder": "gpt-4o", + "apiKeyValidationFailed": "API-avaimen vahvistus epäonnistui. Tarkista avaimesi ja yritä uudelleen.", + "addProviderApiKeyTitle": "Lisää {provider} API-avain", + "checking": "Tarkistetaan...", + "check": "Tarkista", + "valid": "Voimassa", + "invalid": "Virheellinen", + "creating": "Luodaan...", + "validationChecksAnthropicCompatible": "Vahvistus tarkistaa {provider} vahvistamalla API-avaimen.", + "validationChecksOpenAiCompatible": "Vahvistus tarkistaa {provider} /models-osoitteen kautta perus-URL-osoitteessasi.", + "priorityLabel": "Prioriteetti", + "saving": "Tallennetaan...", + "save": "Tallenna", + "editConnection": "Muokkaa yhteyttä", + "accountName": "Tilin nimi", + "email": "Sähköposti", + "healthCheckMinutes": "Terveystarkastus (min)", + "healthCheckHint": "Ennakoiva tunnuksen päivitysväli. 0 = pois käytöstä.", + "failedTestConnection": "Yhteyden testaus epäonnistui", + "failed": "Epäonnistui", + "leaveBlankKeepCurrentApiKey": "Jätä tyhjäksi, jos haluat säilyttää nykyisen API-avaimen.", + "editCompatibleTitle": "Muokkaa {type} Yhteensopiva", + "compatibleBaseUrlHint": "Käytä perus-URL-osoitetta (päättyy /v1) {type}-yhteensopivalle API:lle.", + "apiKeyForCheck": "API-avain (tarkistusta varten)", + "compatibleProdPlaceholder": "{type} Yhteensopiva (tuote)" + }, + "settings": { + "title": "Asetukset", + "general": "Kenraali", + "security": "Turvallisuus", + "appearance": "Ulkonäkö", + "routing": "Reititys", + "cache": "Välimuisti", + "resilience": "Joustavuus", + "systemPrompt": "Järjestelmäkehote", + "thinkingBudget": "Miettivä budjetti", + "proxy": "Välityspalvelin", + "pricing": "Hinnoittelu", + "storage": "Varastointi", + "policies": "Käytännöt", + "ipFilter": "IP-suodatin", + "comboDefaults": "Yhdistelmän oletukset", + "fallbackChains": "Varaketjut", + "changePassword": "Vaihda salasana", + "enablePassword": "Ota salasana käyttöön", + "darkMode": "Tumma tila", + "lightMode": "Valotila", + "systemTheme": "Järjestelmän teema", + "enableCache": "Ota välimuisti käyttöön", + "cacheTTL": "Välimuisti TTL", + "maxCacheSize": "Välimuistin enimmäiskoko", + "clearCache": "Tyhjennä välimuisti", + "cacheHits": "Välimuistin osumia", + "cacheMisses": "Välimuisti puuttuu", + "hitRate": "Osumaprosentti", + "cacheEntries": "Välimuistin merkinnät", + "circuitBreaker": "Katkaisija", + "retryPolicy": "Yritä uudelleen -käytäntö", + "maxRetries": "Max Uudelleenyritykset", + "retryDelay": "Yritä uudelleen Viive", + "timeoutMs": "Aikakatkaisu (ms)", + "enableSystemPrompt": "Ota järjestelmäkehote käyttöön", + "systemPromptText": "Järjestelmäkehoteteksti", + "enableThinking": "Ota ajattelu käyttöön", + "maxThinkingTokens": "Max Thinking Tokens", + "enableProxy": "Ota välityspalvelin käyttöön", + "proxyUrl": "Välityspalvelimen URL-osoite", + "pricingRates": "Hinnoitteluhinnastomuoto", + "currentPricing": "Nykyisen hinnoittelun yleiskatsaus", + "loadingPricing": "Ladataan hintatietoja...", + "noPricing": "Hintatietoja ei ole saatavilla", + "input": "Syöte", + "output": "Lähtö", + "cached": "Välimuistissa", + "reasoning": "Päättely", + "cacheCreation": "Välimuistin luominen", + "customPricing": "Mukautettu hinnoittelu", + "databaseSize": "Tietokannan koko", + "backupDb": "Varmuuskopiointitietokanta", + "restoreDb": "Palauta tietokanta", + "exportData": "Vie tiedot", + "importData": "Tuo tiedot", + "clearData": "Tyhjennä kaikki tiedot", + "clearDataConfirm": "Tämä poistaa pysyvästi kaikki tiedot. Oletko varma?", + "enableRequestLogs": "Ota pyyntölokit käyttöön", + "logRetention": "Lokin säilyttäminen", + "ipWhitelist": "IP valkoinen lista", + "ipBlacklist": "IP musta lista", + "addIP": "Lisää IP", + "savedSuccessfully": "Asetukset tallennettu onnistuneesti", + "ai": "AI", + "advanced": "Edistynyt", + "localMode": "Paikallinen tila — Kaikki laitteellesi tallennetut tiedot", + "settingsSectionsAria": "Asetukset-osiot", + "switchThemes": "Vaihda vaaleiden ja tummien teemojen välillä", + "themeSelectionAria": "Teeman valinta", + "themeLight": "Kevyt", + "themeDark": "Tumma", + "themeSystem": "Järjestelmä", + "hideHealthLogs": "Piilota kuntotarkastuslokit", + "hideHealthLogsDesc": "Kun PÄÄLLÄ, estä [HealthCheck]-viestit palvelinkonsolissa", + "promptCache": "Kehotusvälimuisti", + "flushCache": "Tyhjennä välimuisti", + "flushing": "Huuhdellaan…", + "size": "Koko", + "hits": "Osumat", + "evictions": "Häädöt", + "loadingCacheStats": "Ladataan välimuistin tilastoja…", + "globalProxy": "Globaali välityspalvelin", + "globalProxyDesc": "Määritä yleinen lähtevä välityspalvelin kaikille API-kutsuille. Yksittäiset palveluntarjoajat, yhdistelmät ja avaimet voivat ohittaa tämän.", + "noGlobalProxy": "Globaalia välityspalvelinta ei ole määritetty", + "globalLabel": "Maailmanlaajuinen", + "configure": "Määritä", + "globalSystemPrompt": "Globaali järjestelmäkehote", + "systemPromptDesc": "Lisätään kaikkiin välityspalvelintason pyyntöihin", + "saved": "Tallennettu", + "systemPromptPlaceholder": "Anna järjestelmäkehote lisätäksesi kaikkiin pyyntöihin...", + "systemPromptHint": "Tämä kehote liitetään jokaisen pyynnön järjestelmäviestiin. Käytä yleisiä ohjeita, turvallisuusohjeita tai vastausten muotoilusääntöjä varten.", + "chars": "{count} merkkiä", + "thinkingBudgetTitle": "Miettivä budjetti", + "thinkingBudgetDesc": "Hallitse tekoälyn päättelytunnuksen käyttöä kaikissa pyynnöissä", + "passthrough": "Läpivienti", + "passthroughDesc": "Ei muutoksia – asiakas hallitsee ajattelubudjettia", + "auto": "Auto", + "autoDesc": "Poista kaikki ajatellut asetukset – anna palveluntarjoajan päättää", + "custom": "Mukautettu", + "customDesc": "Aseta kiinteä tunnusbudjetti kaikille pyynnöille", + "adaptive": "Mukautuva", + "adaptiveDesc": "Skaalaa budjetti pyynnön monimutkaisuuden perusteella", + "effortNone": "Ei mitään (0 merkkiä)", + "effortLow": "Matala (1 000 tokenia)", + "effortMedium": "Keskikokoinen (10 000 merkkiä)", + "effortHigh": "High (128 000 tokenia)", + "tokenBudget": "Token-budjetti", + "tokens": "rahakkeita", + "baseEffortLevel": "Perusponnistuksen taso", + "adaptiveHint": "Mukautuva tila skaalautuu tältä perustasolta viestimäärän, työkalun käytön ja kehotteen pituuden perusteella.", + "requireLogin": "Vaadi kirjautumista", + "requireLoginDesc": "Kun PÄÄLLÄ, kojelauta vaatii salasanan. Kun POIS PÄÄLTÄ, käytä ilman kirjautumista.", + "currentPassword": "Nykyinen salasana", + "enterCurrentPassword": "Anna nykyinen salasana", + "newPassword": "Uusi salasana", + "enterNewPassword": "Syötä uusi salasana", + "confirmPassword": "Vahvista uusi salasana", + "confirmPasswordPlaceholder": "Vahvista uusi salasana", + "passwordsNoMatch": "Salasanat eivät täsmää", + "passwordUpdated": "Salasana päivitetty onnistuneesti", + "failedUpdatePassword": "Salasanan päivitys epäonnistui", + "errorOccurred": "Tapahtui virhe", + "updatePassword": "Päivitä salasana", + "setPassword": "Aseta salasana", + "apiEndpointProtection": "API Endpoint Protection", + "requireAuthModels": "Vaadi API-avain /mallille", + "requireAuthModelsDesc": "Kun PÄÄLLÄ, /v1/models-päätepiste palauttaa 404 todentamattomille pyynnöille. Estää valtuuttamattomien käyttäjien mallin löytämisen.", + "blockedProviders": "Estetyt palveluntarjoajat", + "blockedProvidersDesc": "Piilota tietyt toimittajat /v1/models-vastauksesta. Estetyt palveluntarjoajat eivät näy malliluetteloissa.", + "providersBlocked": "{count} toimittaja(t) estetty /modelsista", + "blockProviderTitle": "Estä {provider}", + "unblockProviderTitle": "Kumoa esto {provider}", + "routingStrategy": "Reititysstrategia", + "fillFirst": "Täytä ensin", + "fillFirstDesc": "Käytä tilejä tärkeysjärjestyksessä", + "roundRobin": "Round Robin", + "roundRobinDesc": "Selaa kaikki tilit läpi", + "p2c": "P2C", + "p2cDesc": "Valitse 2 satunnaista, käytä terveellisempää", + "random": "Satunnainen", + "randomDesc": "Satunnainen tili jokainen pyyntö", + "leastUsed": "Vähiten käytetty", + "leastUsedDesc": "Valitse vähiten käytetty tili", + "costOpt": "Kustannusopt", + "costOptDesc": "Valitse halvin saatavilla oleva tili", + "stickyLimit": "Sticky Limit", + "stickyLimitDesc": "Puhelut tilikohtaisesti ennen vaihtamista", + "modelAliases": "Mallin aliakset", + "modelAliasesDesc": "Jokerimerkkikuviot mallien nimien yhdistämiseen • Käytä * ja ?", + "aliasPatternPlaceholder": "claude-sonett-*", + "aliasTargetPlaceholder": "claude-sonnet-4-20250514", + "pattern": "kuvio", + "targetModel": "Kohdemalli", + "add": "+ Lisää", + "session": "Istunto", + "sessionDetailsAria": "Istunnon tiedot", + "status": "Tila", + "authenticated": "Todennettu", + "guest": "Vieras", + "loginTime": "Kirjautumisaika", + "sessionAge": "Istunnon ikä", + "browser": "Selain", + "clearLocalData": "Tyhjennä paikalliset tiedot", + "logout": "Kirjaudu ulos", + "clearLocalDataConfirm": "Poistetaanko kaikki paikalliset tiedot? Tämä nollaa asetuksesi.", + "unknown": "Tuntematon", + "systemActor": "järjestelmä", + "ipAccessControl": "IP Access Control", + "ipAccessControlDesc": "Estä tai salli tietyt IP-osoitteet", + "ipModeDisabled": "Ei käytössä", + "ipModeBlacklist": "Musta lista", + "ipModeWhitelist": "Valkoinen lista", + "ipModeWhitelistPriority": "WL-prioriteetti", + "addIpAddress": "Lisää IP-osoite", + "ipAddressPlaceholder": "192.168.1.0/24 tai 10.0.*.*", + "block": "+ Estä", + "allow": "+ Salli", + "blocked": "Estetty ({count})", + "allowed": "Sallittu ({count})", + "temporaryBans": "Väliaikaiset kiellot ({count})", + "minLeft": "{min}m jäljellä", + "auditLog": "Tarkastusloki", + "searchAuditLogs": "Hae valvontalokeja...", + "failedLoadAuditLog": "Tarkastuslokin lataaminen epäonnistui", + "noAuditEvents": "Tarkastustapahtumia ei löytynyt", + "action": "Toiminta", + "actor": "näyttelijä", + "details": "Yksityiskohdat", + "time": "Aika", + "fallbackChainsTitle": "Varaketjut", + "fallbackChainsDesc": "Määritä toimittajan varatilaus mallikohtaisesti", + "addChain": "+ Lisää ketju", + "modelName": "Mallin nimi", + "modelNamePlaceholder": "claude-sonnet-4-20250514", + "providersCommaSeparated": "Palveluntarjoajat (pilkuilla erotettuna, tärkeysjärjestyksessä)", + "providersCommaSeparatedPlaceholder": "antrooppinen, openai, kaksoset", + "createChain": "Luo ketju", + "noFallbackChains": "Ei varaketjuja", + "noFallbackChainsDesc": "Luo ketju toimittajan varatilauksen määrittämiseksi mallille.", + "loadingFallbackChains": "Ladataan varaketjuja...", + "deleteChainConfirm": "Poistetaanko varaketju kohteelle \"{model}\"?", + "chainCreated": "Ketju luotu kohteelle {model}", + "chainDeleted": "Ketju poistettu {model}", + "failedCreateChain": "Ketjun luominen epäonnistui", + "failedDeleteChain": "Ketjun poistaminen epäonnistui", + "deleteChain": "Poista ketju", + "fillModelAndProviders": "Täytä mallin nimi ja toimittajat", + "addAtLeastOneProvider": "Lisää vähintään yksi palveluntarjoaja", + "comboDefaultsTitle": "Yhdistelmän oletukset", + "globalComboConfig": "Globaali yhdistelmäkokoonpano", + "defaultStrategy": "Oletusstrategia", + "defaultStrategyDesc": "Sovelletaan uusiin komboihin ilman selkeää strategiaa", + "comboStrategyAria": "Yhdistelmästrategia", + "priority": "Prioriteetti", + "weighted": "Painotettu", + "maxRetriesLabel": "Max Uudelleenyritykset", + "retryDelayLabel": "Uudelleenyrityksen viive (ms)", + "timeoutLabel": "Aikakatkaisu (ms)", + "healthCheck": "Terveystarkastus", + "healthCheckDesc": "Tarkista palveluntarjoajan saatavuus etukäteen", + "trackMetrics": "Seuraa mittareita", + "trackMetricsDesc": "Tallenna yhdistelmäkohtaiset pyyntötiedot", + "providerOverrides": "Palveluntarjoajan ohitukset", + "providerOverridesDesc": "Ohita aikakatkaisu ja yritä uudelleen palveluntarjoajan mukaan. Palveluntarjoajan asetukset ohittavat yleiset oletukset.", + "providerMaxRetriesAria": "{provider} enintään uudelleenyritystä", + "providerTimeoutAria": "{provider} aikakatkaisu ms", + "removeProviderOverrideAria": "Poista {provider} ohitus", + "newProviderNamePlaceholder": "esim. google, avaa...", + "newProviderNameAria": "Uusi palveluntarjoajan nimi", + "retries": "yrittää uudelleen", + "ms": "ms", + "saveComboDefaults": "Tallenna yhdistelmän oletusasetukset", + "maxNestingDepth": "Suurin pesintäsyvyys", + "concurrencyPerModel": "Samanaikaisuus / malli", + "queueTimeout": "Jonon aikakatkaisu (ms)", + "providerProfiles": "Palveluntarjoajan profiilit", + "providerProfilesDesc": "Erilliset joustavuusasetukset OAuth- (istuntopohjainen) ja API-avaimen (mittari) tarjoajille. OAuth-palveluntarjoajilla on tiukemmat kynnykset alhaisempien nopeusrajojen vuoksi.", + "oauthProviders": "OAuth-palveluntarjoajat", + "apiKeyProviders": "API-avainten tarjoajat", + "transientCooldown": "Ohimenevä jäähtyminen", + "rateLimitCooldown": "Rate Limit Cooldown", + "maxBackoffLevel": "Maksimitaso", + "cbThreshold": "CB-kynnys", + "cbResetTime": "CB-nollausaika", + "rateLimiting": "Rate Limiting", + "rateLimitingDesc": "API-avainten tarjoajat ovat automaattisesti nopeudeltaan rajoitettuja turvallisilla oletusasetuksilla. Rajat opitaan vastausotsikoista ja mukautuvat ajan myötä.", + "defaultSafetyNet": "Oletusturvaverkko", + "rpm": "RPM", + "minGap": "Min Gap", + "maxConcurrent": "Max Samanaikainen", + "activeLimiters": "Aktiiviset rajoittimet", + "noActiveLimiters": "Ei vielä aktiivisia nopeudenrajoittimia.", + "reservoir": "Säiliö", + "running": "Juoksemassa", + "queued": "Jonossa", + "circuitBreakers": "Katkaisijat", + "breakerStateClosed": "Suljettu", + "breakerStateOpen": "Avaa", + "breakerStateHalfOpen": "Puoliavoin", + "tripped": "{count} lauennut", + "healthy": "{count} terve", + "resetAll": "Nollaa kaikki", + "noCircuitBreakers": "Katkaisijat eivät ole vielä aktiivisia. Ne luodaan automaattisesti, kun pyynnöt kulkevat yhdistelmäputkilinjan läpi.", + "failures": "{count} virhe(ä)", + "policiesLocked": "Käytännöt ja lukitut tunnisteet", + "allOperational": "Kaikki järjestelmät toimivat – ei lukituksia tai lauenneita katkaisijoita", + "loadingPolicies": "Ladataan käytäntöjä...", + "lockedIdentifiers": "Lukitut tunnisteet", + "unlockedIdentifier": "Avattu: {identifier}", + "sinceDate": "alkaen {date}", + "forceUnlock": "Pakota lukitus", + "unlocking": "Avataan...", + "failedUnlock": "Lukituksen avaaminen epäonnistui", + "failedLoadWithStatus": "Lataus epäonnistui: {status}", + "failedLoadResilience": "Resilienssitilan lataaminen epäonnistui", + "saveFailed": "Tallennus epäonnistui", + "resetFailed": "Nollaus epäonnistui", + "loadingResilience": "Ladataan joustavuuden tilaa...", + "retry": "Yritä uudelleen", + "systemStorage": "Järjestelmä ja tallennustila", + "allDataLocal": "Kaikki tiedot on tallennettu paikallisesti koneellesi", + "databasePath": "Tietokannan polku", + "exportDatabase": "Vie tietokanta", + "exportAll": "Vie kaikki (.tar.gz)", + "importDatabase": "Tuo tietokanta", + "confirmDbImport": "Vahvista tietokannan tuonti", + "confirmDbImportDesc": "Tämä korvaa kaikki nykyiset tiedot kohteen {file} sisällöllä. Varmuuskopio luodaan automaattisesti ennen tuontia.", + "yesImport": "Kyllä, tuonti", + "lastBackup": "Viimeinen varmuuskopio", + "noBackupYet": "Ei vielä varmuuskopiota", + "backupNow": "Varmuuskopioi nyt", + "backupRestore": "Varmuuskopiointi ja palautus", + "viewBackups": "Näytä varmuuskopiot", + "hide": "Piilota", + "backupRetentionDesc": "Tietokannan tilannevedokset luodaan automaattisesti ennen palautusta ja 15 minuutin välein tietojen muuttuessa. Säilytys: 24 tunnin välein + 30 päivittäistä varmuuskopiota älykkäällä kierrolla.", + "loadingBackups": "Ladataan varmuuskopioita...", + "noBackupsYet": "Varmuuskopioita ei ole vielä saatavilla. Varmuuskopiot luodaan automaattisesti, kun tiedot muuttuvat.", + "backupsAvailable": "{count} varmuuskopio(t) saatavilla", + "refresh": "Päivitä", + "confirm": "Vahvista?", + "yes": "Kyllä", + "no": "Ei", + "restore": "Palauta", + "invalidFileType": "Virheellinen tiedostotyyppi. Vain .sqlite-tiedostot hyväksytään.", + "exportFailed": "Vienti epäonnistui", + "exportFailedWithError": "Vienti epäonnistui: {error}", + "fullExportFailedWithError": "Täysi vienti epäonnistui: {error}", + "backupCreated": "Varmuuskopio luotu: {file}", + "restoreSuccess": "Palautettu! {connections} yhteydet, {nodes} solmut, {combos} yhdistelmät, {apiKeys} API-avaimet.", + "importSuccess": "Tietokanta tuotu! {connections} yhteydet, {nodes} solmut, {combos} yhdistelmät, {apiKeys} API-avaimet.", + "justNow": "juuri nyt", + "minutesAgo": "{count}min sitten", + "hoursAgo": "{count}h sitten", + "daysAgo": "{count}pv sitten", + "backupReasonManual": "manuaalinen", + "backupReasonPreRestore": "esipalautus", + "connectionsCount": "{count, plural, one {# connection} other {# connections}}", + "noChangesSinceBackup": "Ei muutoksia edellisen varmuuskopioinnin jälkeen", + "backupFailed": "Varmuuskopiointi epäonnistui", + "restoreFailed": "Palautus epäonnistui", + "importFailed": "Tuonti epäonnistui", + "errorDuringRestore": "Palautuksen aikana tapahtui virhe", + "errorDuringImport": "Tuonnin aikana tapahtui virhe", + "modelPricing": "Mallin hinnoittelu", + "modelPricingDesc": "Määritä mallikohtaiset hintahinnat • Kaikki hinnat $/1M tunnuksissa", + "providers": "Palveluntarjoajat", + "registry": "Rekisteri", + "priced": "hinnoiteltu", + "searchProvidersModels": "Hae palveluntarjoajia tai malleja...", + "showAll": "Näytä kaikki", + "noProvidersMatch": "Yksikään palveluntarjoaja ei vastaa hakuasi.", + "howPricingWorks": "Kuinka hinnoittelu toimii", + "cacheWrite": "Välimuistin kirjoitus", + "unsaved": "tallentamaton", + "resetDefaults": "Palauta oletukset", + "saveProvider": "Tallenna palveluntarjoaja", + "saving": "Tallennetaan...", + "model": "Malli", + "models": "mallit", + "moreProviders": "{count} lisää palveluntarjoajia", + "withPricing": "hinnoittelu määritettynä", + "policiesCircuitBreakers": "Käytännöt ja katkaisijat", + "activeIssuesDetected": "Aktiivisia ongelmia havaittu", + "off": "Pois päältä", + "resetPricingConfirm": "Palautetaanko kaikki kohteen {provider} hinnat oletusasetuksiin?", + "pricingDescInput": "Syöte: mallille lähetetyt tunnukset", + "pricingDescOutput": "Tulos: luotuja merkkejä", + "pricingDescCached": "Välimuistissa: uudelleen käytetty syöttö (~50 % syöttönopeudesta)", + "pricingDescReasoning": "Päättely: ajattelumerkit (palautuu ulostuloon)", + "pricingDescCacheWrite": "Välimuistin kirjoitus: välimuistin merkintöjen luominen (palautuu syötteeseen)", + "pricingDescFormula": "Kustannukset = (syöttö × syöttönopeus) + (tuotos × lähtönopeus) + (välimuisti × välimuistin_nopeus) miljoonaa merkkiä kohden.", + "pricingSettingsTitle": "Hinnoitteluasetukset", + "totalModels": "Mallit yhteensä", + "active": "Aktiivinen", + "costCalculation": "Kustannuslaskenta", + "costCalculationDesc": "Kustannukset lasketaan kullekin mallille määritettyjen tunnuksen käytön ja hinnoittelun perusteella.", + "pricingFormat": "Hinnoittelumuoto", + "pricingFormatDesc": "Kaikki hinnat ovat $/1M tokeneita (dollaria per miljoonaa rahaketta).", + "tokenTypes": "Token-tyypit", + "inputTokenDesc": "Vakiokehotetunnukset", + "outputTokenDesc": "Täydennys-/vastaustunnukset", + "cachedTokenDesc": "Välimuistissa olevat syöttötunnukset (yleensä 50 % syöttönopeudesta)", + "reasoningTokenDesc": "Erityiset päättely-/ajattelutunnisteet (varaustulosta)", + "cacheCreationTokenDesc": "Välimuistimerkintöjen luomiseen käytetyt tunnukset (varausarvo syöttönopeuteen)", + "customPricingNote": "Voit ohittaa tiettyjen mallien oletushinnoittelun. Mukautetut ohitukset ovat etusijalla automaattisesti tunnistettuihin hinnoitteluun nähden.", + "editPricing": "Muokkaa hinnoittelua", + "viewFullDetails": "Näytä täydelliset tiedot" + }, + "translator": { + "title": "Kääntäjä", + "metaTitle": "Kääntäjä leikkikenttä | OmniRoute", + "metaDescription": "Tee virheenkorjaus, testaa ja visualisoi API-muotojen käännökset palveluntarjoajien välillä", + "playgroundTitle": "Kääntäjä leikkikenttä", + "playground": "Leikkipaikka", + "realtime": "Reaaliaikainen käännöstoiminta", + "chatTester": "Chatin testaaja", + "testBench": "Testipenkki", + "liveMonitor": "Live Monitor", + "modeDescriptionPlayground": "Liitä mikä tahansa API-pyynnön runko ja katso, kuinka OmniRoute kääntää sen toimittajamuotojen välillä (OpenAI ↔ Claude ↔ Gemini ↔ Responses API)", + "modeDescriptionChatTester": "Lähetä todellisia chat-pyyntöjä OmniRouten kautta ja tarkasta koko meno-paluu: syöttö, käännetty pyyntö, palveluntarjoajan vastaus ja käännetty tulos.", + "modeDescriptionTestBench": "Suorita ennalta määritettyjä skenaarioita ja vertaile toimittajien ja mallien yhteensopivuutta.", + "modeDescriptionLiveMonitor": "Katso käännöstapahtumia reaaliajassa, kun pyynnöt kulkevat OmniRouten kautta.", + "modeDescriptionFallback": "Tee virheenkorjaus, testaa ja visualisoi, kuinka OmniRoute kääntää API-pyynnöt palveluntarjoajien välillä.", + "recentTranslations": "Viimeaikaiset käännökset", + "noTranslations": "Ei vielä käännöksiä", + "source": "lähde", + "target": "Kohde", + "time": "Aika", + "model": "Malli", + "status": "Tila", + "latency": "Latenssi", + "totalTranslations": "Yhteensä käännöksiä", + "successful": "Onnistunut", + "errors": "Virheet", + "avgLatency": "Keskimääräinen viive", + "millisecondsShort": "{value}ms", + "notAvailableSymbol": "—", + "liveAutoRefreshing": "Live - automaattinen päivitys", + "paused": "Keskeytetty", + "eventsAppearHint": "Käännöstapahtumat näkyvät täällä, kun pyynnöt kulkevat OmniRouten kautta. Käytä mitä tahansa näistä menetelmistä tapahtumien luomiseen:", + "chatTesterTab": "Chat Tester -välilehti", + "testBenchTab": "Testipenkki-välilehti", + "externalApiCalls": "Ulkoiset API-kutsut", + "ideCliIntegrations": "IDE/CLI-integraatiot", + "inMemoryNote": "Huomautus: Tapahtumat tallennetaan muistiin ja nollataan, kun palvelin käynnistyy uudelleen.", + "ok": "OK", + "errorShort": "ERR", + "formatConverter": "Format Converter", + "formatConverterDescription": "Liitä tai kirjoita JSON-pyynnön leipäteksti. Kääntäjä tunnistaa automaattisesti lähdemuodon ja muuntaa sen kohdemuotoon. Käytä tätä virheenkorjaukseen, kuinka OmniRoute kääntää pyynnöt muotojen välillä (OpenAI ↔ Claude ↔ Gemini ↔ Responses API).", + "input": "Syöte", + "output": "Lähtö", + "auto": "Auto", + "swapFormats": "Vaihda formaatteja", + "translateAction": "Käännä", + "clear": "Selkeä", + "inputPlaceholder": "Liitä pyynnön teksti tähän tai valitse malli alta...", + "exampleTemplates": "Esimerkkimalleja", + "exampleTemplatesHint": "- Napsauta ladataksesi", + "templateLoadHint": "Malli lataa pyynnön muodossa {format}. Muuta lähdemuotoa ladataksesi eri muodossa.", + "compatibilityTester": "Yhteensopivuuden testaaja", + "compatibilityReport": "Yhteensopivuusraportti", + "testBenchDescription": "Suorita ennalta määritettyjä skenaarioita (Simple Chat, Tool Calling jne.) varmistaaksesi käännöksen ja palveluntarjoajan yhteensopivuuden. Valitse lähdemuoto ja kohdetoimittaja ja suorita sitten kaikki testit nähdäksesi yhteensopivuusprosentti. Käytä tätä selvittääksesi, mitkä ominaisuudet toimivat eri palveluntarjoajien välillä.", + "targetProvider": "Kohdetoimittaja", + "runAllTests": "Suorita kaikki testit", + "runTest": "Suorita testi", + "reRun": "Suorita uudelleen", + "running": "Juoksemassa...", + "passed": "läpäissyt", + "failed": "epäonnistunut", + "passedIconLabel": "✅ Läpäisty", + "chunks": "paloina", + "scenarioSimpleChat": "Yksinkertainen chat", + "scenarioToolCalling": "Työkalun kutsuminen", + "scenarioMultiTurn": "Monikierros", + "scenarioThinking": "Ajatteleminen", + "scenarioSystemPrompt": "Järjestelmäkehote", + "scenarioStreaming": "Suoratoisto", + "templateNames": { + "simple-chat": "Yksinkertainen chat", + "tool-calling": "Työkalun kutsuminen", + "multi-turn": "Monikierros", + "thinking": "Ajatteleminen", + "system-prompt": "Järjestelmäkehote", + "streaming": "Suoratoisto" + }, + "templateDescriptions": { + "simple-chat": "Perustekstiviesti", + "tool-calling": "Toiminnon/työkalun kutsuminen", + "multi-turn": "Keskustelua historian kanssa", + "thinking": "Laajennettu ajattelu/päättely", + "system-prompt": "Monimutkaiset järjestelmäohjeet", + "streaming": "SSE-suoratoistopyyntö" + }, + "templatePayloads": { + "simpleChat": { + "system": "Olet avulias avustaja.", + "userGreeting": "Hei! Miten voit tänään?" + }, + "toolCalling": { + "userWeather": "Millainen sää on São Paulossa?", + "toolDescription": "Hanki nykyisen sijainnin sää", + "cityNameDescription": "Kaupungin nimi" + }, + "multiTurn": { + "system": "Olet koodausassistentti.", + "userInitial": "Kirjoita funktio taulukon lajittelemiseksi Pythonissa.", + "assistantExample": "Tässä on yksinkertainen lajittelutoiminto:\n\n``` python\ndef sort_array(arr):\n palautus lajiteltuna(arr)\n```", + "userFollowUp": "Järjestä se nyt laskevaan järjestykseen." + }, + "thinking": { + "question": "Mikä on 100 ensimmäisen alkuluvun summa?" + }, + "systemPrompt": { + "systemInstruction": "Olet hajautettuihin järjestelmiin erikoistunut vanhempi ohjelmistosuunnittelija. Vastaa kysymyksiin ytimekkäästi käyttämällä alan parhaita käytäntöjä. Anna aina koodiesimerkkejä tarvittaessa. Muotoile vastauksesi käyttämällä markdownia.", + "question": "Kuinka otan käyttöön katkaisijakuvion?" + }, + "streaming": { + "prompt": "Kerro minulle lyhyt tarina robotista, joka oppii maalaamaan." + } + }, + "openaiCompatibleLabel": "OpenAI-yhteensopiva", + "anthropicCompatibleLabel": "Antrooppinen yhteensopiva", + "noTemplateForFormat": "Ei mallia tälle muodolle", + "translationFailed": "Käännös epäonnistui: {error}", + "pipelineDebugger": "Pipeline Debugger", + "translationPipeline": "Käännösputki", + "pipelineVisualization": "Putkilinjan visualisointi", + "pipelineVisualizationHint": "Lähetä viesti nähdäksesi, kuinka pyyntösi etenee tunnistuksen → käännös → palveluntarjoajan puhelun kautta.", + "chatTesterDescription": "Lähetä viestejä tietyssä asiakasmuodossa ja tarkista käännösputken jokainen vaihe.", + "chatTesterFlow": "Asiakaspyyntö → muodon tunnistus → OpenAI-välitaso → tarjoajan muoto → vastaus", + "clickStepToInspect": "Napsauta mitä tahansa vaihetta tarkistaaksesi tiedot siinä vaiheessa.", + "clientFormat": "Asiakasmuoto", + "provider": "Palveluntarjoaja", + "modelPlaceholder": "Valitse tai kirjoita mallin nimi...", + "sendMessageToSeePipeline": "Lähetä viesti nähdäksesi käännösputken", + "chatMessageHintPrefix": "Viestisi muotoillaan muodossa a", + "chatMessageHintSuffix": "pyyntö, käännetään putken kautta ja lähetetään valitulle palveluntarjoajalle.", + "youWithFormat": "Sinä ({format})", + "assistant": "Assistant", + "typeMessage": "Kirjoita viesti...", + "send": "Lähetä", + "clientRequest": "Asiakaspyyntö", + "clientRequestDescription": "Pyynnön elin sellaisena kuin asiakkaasi sen lähettäisi", + "formatDetected": "Muoto havaittu", + "formatDetectedDescription": "OmniRoute tunnistaa automaattisesti API-muodon pyyntörakenteesta", + "openaiIntermediate": "OpenAI Intermediate", + "openaiIntermediateDescription": "Kaikki muodot normalisoidaan ensin OpenAI-muotoon (yleinen silta)", + "providerFormat": "Tarjoajan muoto", + "providerFormatDescription": "OpenAI-muoto käännetään palveluntarjoajan alkuperäiseen muotoon", + "providerResponse": "Palveluntarjoajan vastaus", + "providerResponseRawDescription": "Raaka vastaus palveluntarjoajan API:lta", + "providerResponseSseDescription": "Raaka SSE-stream palveluntarjoajan sovellusliittymästä", + "unexpectedError": "Tapahtui odottamaton virhe", + "error": "Virhe", + "errorMessage": "Virhe: {message}", + "requestFailed": "Pyyntö epäonnistui", + "noTextExtracted": "(Ei tekstiä poimittu)", + "liveMonitorDescriptionPrefix": "Näyttää käännöstapahtumat, kun API-kutsut kulkevat OmniRouten kautta. Tapahtumat tulevat muistin puskurista (palautuu uudelleenkäynnistyksen yhteydessä). Käytä", + "liveMonitorDescriptionSuffix": "tai ulkoisia API-kutsuja tapahtumien luomiseksi." + }, + "usage": { + "title": "Käyttö", + "loggerTab": "Kirjaaja", + "proxyTab": "Välityspalvelin", + "budgetManagement": "Budjetin hallinta", + "budgetSaved": "Budjettirajat tallennettu", + "budgetSaveFailed": "Budjetin säästäminen epäonnistui", + "loadingBudgetData": "Ladataan budjettitietoja...", + "noApiKeysTitle": "Ei API-avaimia", + "noApiKeysDescription": "Lisää ensin API-avaimet budjettirajojen määrittämiseksi.", + "apiKey": "API-avain", + "todaysSpend": "Päivän kulutus", + "thisMonth": "Tässä kuussa", + "setLimits": "Aseta rajat", + "dailyLimitUsd": "Päivittäinen raja (USD)", + "monthlyLimitUsd": "Kuukausiraja (USD)", + "warningThresholdPercent": "Varoituskynnys (%)", + "dailyLimitPlaceholder": "esim. 5.00", + "monthlyLimitPlaceholder": "esim. 50.00", + "warningThresholdPlaceholder": "80", + "saveLimits": "Tallenna rajoitukset", + "budgetOk": "Budjetti OK – {remaining} jäljellä", + "budgetExceeded": "Budjetti ylitetty – pyynnöt voidaan estää", + "totalRequests": "Pyyntöjä yhteensä", + "noDataYet": "Ei vielä dataa", + "latency": "Latenssi", + "latencyP50": "p50", + "latencyP95": "p95", + "latencyP99": "p99", + "promptCache": "Kehotusvälimuisti", + "systemHealth": "Järjestelmän terveys", + "entries": "merkinnät", + "activeCount": "{count} aktiivinen", + "openCircuitBreakersDetected": "Katkaisijat havaittu", + "hitRate": "Osumaprosentti", + "hitsMisses": "Osumat / Miss", + "circuitBreakers": "Katkaisijat", + "lockedIPs": "Lukitut IP:t", + "lockoutsAutoRefreshHint": "Mallikohtaiset nopeusrajoitukset • Automaattinen päivitys 10s", + "lockedCount": "{count, plural, one {# locked} other {# locked}}", + "timeLeft": "{time} jäljellä", + "howItWorks": "Miten se toimii", + "howItWorksSubtitle": "Opi kuinka arvioinnit vahvistavat LLM-vastauksesi", + "define": "Määritä", + "defineStepDescription": "Luo testitapauksia, joissa on syöttökehotteita ja odotettuja tulosehtoja käyttämällä strategioita, kuten sisältää, regex tai tarkka vastaavuus.", + "run": "Juokse", + "runStepDescription": "Suorita testitapauksia LLM-päätepisteitäsi vastaan OmniRouten kautta. Jokainen tapaus lähetetään todellisena API-pyyntönä.", + "evaluate": "Arvioi", + "evaluateStepDescription": "Vastauksia verrataan odotettuihin kriteereihin. Katso kunkin tapauksen hyväksyntä/hylkäys viivemittareiden ja yksityiskohtaisen palautteen avulla.", + "evalSuites": "Arviointisviitit", + "evalSuitesHint": "Napsauta sarjaa tarkastellaksesi testitapauksia ja suorita sitten LLM-päätepisteiden arvioiminen", + "evalsLoading": "Ladataan eval-sviittejä...", + "noEvalSuitesFound": "Eval Suitesta ei löytynyt", + "noEvalSuitesDescription": "Eval-sarjat voidaan määrittää API:n kautta tai koodilla. He testaavat mallin tuloksia odotettujen tulosten kanssa käyttämällä strategioita, kuten sisältää, regex, tarkka vastaavuus ja mukautetut funktiot.", + "columnCase": "Asia", + "columnStatus": "Tila", + "columnLatency": "Latenssi", + "columnDetails": "Yksityiskohdat", + "columnModel": "Malli", + "columnStrategy": "strategia", + "columnExpected": "Odotettu", + "statsSuites": "Sviitit", + "statsTestCases": "Testitapaukset", + "statsModels": "Mallit", + "statsCoverage": "Kattavuus", + "statsStrategiesCount": "{count} strategioita", + "evaluationStrategies": "Arviointistrategiat", + "modelsUnderTest": "Mallit testattavana", + "searchSuitesPlaceholder": "Etsi sviittejä...", + "passSuffix": "pass", + "casesCount": "{count, plural, one {# case} other {# cases}}", + "runEval": "Juokse Eval", + "runningProgress": "Käynnissä {current}/{total}...", + "passRate": "läpäisyaste", + "summaryBreakdown": "{passed} hyväksytty · {failed} epäonnistui · {total} yhteensä", + "passedIconLabel": "✅ Läpäisty", + "failedIconLabel": "❌ Epäonnistui", + "detailsContains": "Sisältää: \"{term}\"", + "detailsRegex": "Regex: {pattern}", + "detailsExpected": "Odotettu: \"{expected}\"", + "noResultsYet": "Ei tuloksia vielä", + "testCasesCount": "Testitapaukset ({count})", + "noTestCasesDefined": "Testitapauksia ei ole määritelty", + "runEvalHint": "Napsauta \"Suorita Eval\" suorittaaksesi kaikki tapaukset LLM-päätepisteellesi. Jokainen testi lähettää oikean pyynnön OmniRouten kautta.", + "notifyNoTestCases": "Tälle sarjalle ei ole määritetty testitapauksia", + "notifyAllCasesPassed": "Kaikki {total} tapausta ohitettu ✅", + "notifySomeCasesFailed": "{passed}/{total} hyväksytty, {failed} epäonnistui", + "notifyEvalRunFailed": "Eval-juoksu epäonnistui", + "notifyEvalTitle": "Arvosana: {name}", + "modelEvals": "Mallin arvioinnit", + "evalsHeroDescription": "Testaa ja vahvista LLM-päätepisteesi suorittamalla ennalta määritettyjä arviointipaketteja. Jokainen sarja sisältää testitapauksia, jotka lähettävät todellisia kehotteita OmniRouten kautta ja vertaavat vastauksia odotettuihin kriteereihin – auttaen sinua havaitsemaan regressioita, vertailla malleja ja varmistamaan vastausten laadun eri tarjoajien välillä.", + "qualityValidation": "Laadun validointi", + "modelComparison": "Mallin vertailu", + "regressionDetection": "Regression havaitseminen", + "latencyBenchmarks": "Viiveen vertailuarvot", + "modelLockouts": "Mallin lukitukset", + "noLockouts": "Tällä hetkellä ei ole lukittuja malleja", + "activeSessions": "Aktiiviset istunnot", + "noSessions": "Ei aktiivisia istuntoja", + "sessionsHint": "Istunnot näkyvät välityspalvelimen kautta kulkevien pyyntöjen aikana", + "sessionsTrackedHint": "Seurataan sormenjälkien pyytämisellä • Automaattinen päivitys 5s", + "session": "Istunto", + "age": "Ikä", + "requests": "Pyynnöt", + "connection": "Yhteys", + "durationMillisecondsShort": "{value}ms", + "durationSecondsShort": "{value}s", + "durationMinutesShort": "{value}m", + "durationHoursShort": "{value}h", + "reasonSeparator": " - ", + "notAvailableSymbol": "-", + "providerLimits": "Palveluntarjoajan rajoitukset", + "noProviders": "Ei yhdistettyjä palveluntarjoajia", + "connectProvidersForQuota": "Muodosta yhteys palveluntarjoajiin OAuthin avulla seurataksesi API-kiintiörajoja ja käyttöä.", + "accountsCount": "{count, plural, one {# account} other {# accounts}}", + "filteredFromCount": "(suodatettu kohteesta {count})", + "autoRefresh": "Automaattinen päivitys", + "refreshAll": "Päivitä kaikki", + "loadingQuotas": "Ladataan...", + "account": "Tili", + "modelQuotas": "Mallikiintiöt", + "lastUsed": "Viimeksi käytetty", + "actions": "Toiminnot", + "refreshQuota": "Päivitä kiintiö", + "today": "Tänään", + "tomorrow": "Huomenna", + "dayTimeFormat": "{day}, {time}", + "inDuration": "kohteessa {duration}", + "notApplicable": "Ei käytössä", + "rawPlanWithValue": "Raakasuunnitelma: {plan}", + "noPlanFromProvider": "Ei suunnitelmaa palveluntarjoajalta", + "noQuotaData": "Ei kiintiötietoja", + "noQuotaDataAvailable": "Kiintiötietoja ei ole saatavilla", + "noAccountsForTierFilter": "Tasosuodattimelle ei löytynyt tilejä", + "tierAll": "Kaikki", + "tierEnterprise": "Yritys", + "tierTeam": "Joukkue", + "tierBusiness": "Business", + "tierUltra": "Ultra", + "tierPro": "Pro", + "tierPlus": "Plus", + "tierFree": "Ilmainen", + "tierUnknown": "Tuntematon" + }, + "modals": { + "waitingAuth": "Odotetaan valtuutusta", + "verificationUrl": "Vahvistus-URL", + "yourCode": "Koodisi", + "remoteAccess": "Etäkäyttö:", + "connectedSuccess": "Yhdistetty onnistuneesti!", + "connectionFailed": "Yhteys epäonnistui", + "chooseAuthMethod": "Valitse todennustapasi:", + "awsBuilderId": "AWS Builder ID", + "awsIamIdentity": "AWS IAM Identity Center", + "googleAccount": "Google-tili", + "githubAccount": "GitHub-tili", + "importToken": "Tuo tunnus", + "pasteToken": "Liitä päivitystunnus Kiro IDE:stä.", + "awsRegion": "AWS-alue", + "autoDetecting": "Tunnistetaan automaattisesti...", + "readingFromCache": "Lukee AWS SSO -välimuistista", + "readingFromCursor": "Lukeminen Cursor IDE -tietokannasta", + "initializing": "Alustetaan...", + "pricingConfig": "Hinnoitteluasetukset", + "loadingPricing": "Ladataan hintatietoja...", + "pricingRatesFormat": "Hinnoitteluhinnastomuoto", + "noPricingData": "Hintatietoja ei ole saatavilla", + "noModelsFound": "Malleja ei löytynyt" + }, + "loggers": { + "allProviders": "Kaikki palveluntarjoajat", + "allModels": "Kaikki mallit", + "allAccounts": "Kaikki tilit", + "allApiKeys": "Kaikki API-avaimet", + "allTypes": "Kaikki tyypit", + "allLevels": "Kaikki tasot", + "modelAZ": "Malli A-Z", + "modelZA": "Malli Z-A", + "loadingLogs": "Ladataan lokeja...", + "loadingProxyLogs": "Ladataan välityspalvelimen lokeja...", + "noLogEntries": "Lokimerkintöjä ei löytynyt", + "noPayloadData": "Tälle lokimerkinnälle ei ole saatavilla hyötykuormatietoja.", + "proxyEvent": "Välityspalvelintapahtuma", + "proxy": "Välityspalvelin", + "level": "Taso", + "directNative": "Suora (natiivi)", + "combo": "Yhdistelmä", + "inputTokens": "Minä:", + "outputTokens": "O:" + }, + "stats": { + "usageOverview": "Käyttökatsaus", + "outputTokens": "Tulostustunnukset", + "totalCost": "Kokonaiskustannukset", + "usageByModel": "Käyttö mallin mukaan", + "usageByAccount": "Käyttö tilikohtaisesti", + "failedToLoad": "Käyttötilastojen lataaminen epäonnistui.", + "tokenHealth": "Token Health", + "totalOAuth": "Yhteensä OAuth", + "healthy": "Terve", + "warning": "Varoitus", + "errored": "Virheellinen", + "lastCheck": "Viimeinen tarkistus", + "noData": "Ei dataa", + "share": "Jaa", + "unableToLoad": "Järjestelmän mittareita ei voi ladata", + "product": "Tuote", + "resources": "Resurssit", + "company": "Yritys" + }, + "auth": { + "welcome": "Tervetuloa", + "signIn": "Kirjaudu sisään", + "enterPassword": "Anna salasanasi jatkaaksesi", + "password": "Salasana", + "unifiedProxy": "Unified AI API Proxy", + "unifiedAiApiProxy": "Unified AI API Proxy", + "unifiedAiApiProxyDesc": "Reititä pyynnöt useille tekoälypalveluntarjoajille yhden päätepisteen kautta. Kuormituksen tasapainotus, vikasieto ja käytön seuranta sisäänrakennettu.", + "passwordNotEnabled": "Salasanasuojaus ei ole käytössä", + "loading": "Ladataan...", + "invalidPassword": "Virheellinen salasana", + "errorOccurredRetry": "Tapahtui virhe. Yritä uudelleen.", + "configureInstance": "Määritetään OmniRoute-esiintymäsi", + "runOnboardingWizard": "Määritä salasanasi ja yhdistä ensimmäinen tekoälypalveluntarjoajasi suorittamalla ohjattu käyttöönottotoiminto.", + "startOnboarding": "Aloita perehtyminen", + "secureYourInstance": "Suojaa tapauksesi", + "setPasswordDescription": "Aseta salasana suojataksesi kojelautaasi ja suojataksesi API-päätepisteesi luvattomalta käytöltä.", + "configurePassword": "Määritä salasana", + "continue": "Jatka", + "windowWillClose": "Tämä ikkuna sulkeutuu automaattisesti...", + "closeTabNow": "Voit sulkea tämän välilehden nyt.", + "copyUrlManual": "Kopioi URL-osoite osoitepalkista ja liitä se sovellukseen.", + "accessDeniedDescription": "Sinulla ei ole lupaa käyttää tätä resurssia. Tarkista API-avaimesi tai ota yhteyttä järjestelmänvalvojaan.", + "goToDashboard": "Siirry Dashboardiin", + "featureMultiProviderTitle": "Multi-Provider", + "featureMultiProviderDesc": "OpenAI, Anthropic, Google ja paljon muuta", + "featureLoadBalancingTitle": "Kuorman tasapainotus", + "featureLoadBalancingDesc": "Jaa pyynnöt älykkäästi", + "featureUsageTrackingTitle": "Käytön seuranta", + "featureUsageTrackingDesc": "Valvo kustannuksia ja tokeneja", + "resetPassword": "Palauta salasana", + "resetDescription": "Valitse menetelmä hallintapaneelin käyttöoikeuden palauttamiseksi", + "stopServer": "Pysäytä OmniRoute-palvelin", + "processing": "Käsitellään...", + "pleaseWait": "Odota, kun saamme valtuutuksen valmiiksi.", + "authSuccess": "Valtuutus onnistui!", + "copyUrl": "Kopioi tämä URL-osoite", + "accessDenied": "Pääsy kielletty", + "methodCliTitle": "Tapa 1: CLI-nollaus", + "methodCliDescription": "Suorita seuraava komento palvelimella, jossa OmniRoute on käynnissä:", + "methodCliHint": "Tämä kehottaa sinua asettamaan uuden salasanan. Palvelin on ensin pysäytettävä.", + "methodManualTitle": "Tapa 2: Manuaalinen nollaus", + "methodManualDescription": "Poista salasana tietokannasta ja aseta uusi salasana käynnistyksen yhteydessä:", + "setPasswordInYour": "Aseta uusi salasana omaan", + "fileLabelSuffix": "tiedosto:", + "newPasswordPlaceholder": "your_new_password", + "deleteSettingsFile": "Poista", + "orRemovePasswordHashField": "tai poista salasanaHash-kenttä", + "restartServerWithNewPassword": "Käynnistä palvelin uudelleen - se käyttää uutta salasanaa", + "backToLogin": "Takaisin kirjautumiseen", + "forgotPassword": "Unohditko salasanan?" + }, + "landing": { + "brandName": "OmniRoute", + "navigateHome": "Navigoi kotiin", + "toggleMenu": "Vaihda valikkoa", + "featuresLink": "Ominaisuudet", + "docsLink": "Asiakirjat", + "github": "GitHub", + "versionLive": "v1.0 on nyt julkaistu", + "oneEndpoint": "Yksi päätepiste", + "allProviders": "Kaikki AI-palveluntarjoajat", + "heroDescription": "AI-päätepisteen välityspalvelin web-hallintapaneelilla – CLIProxyAPI:n JavaScript-portti. Toimii saumattomasti Claude Coden, OpenAI Codexin, Clinen, RooCoden ja muiden CLI-työkalujen kanssa.", + "getStarted": "Aloita", + "viewOnGithub": "Katso GitHubissa", + "powerfulFeatures": "Tehokkaat ominaisuudet", + "featuresSubtitle": "Kaikki mitä tarvitset AI-infrastruktuurin hallintaan yhdessä paikassa, mittakaavassa rakennettu.", + "featureUnifiedEndpointTitle": "Yhtenäinen päätepiste", + "featureUnifiedEndpointDesc": "Pääset kaikkiin palveluntarjoajiin yhden standardin API-URL-osoitteen kautta.", + "featureEasySetupTitle": "Helppo asennus", + "featureEasySetupDesc": "Pääset käyntiin muutamassa minuutissa npx-komennolla.", + "featureModelFallbackTitle": "Mallin takaisku", + "featureModelFallbackDesc": "Vaihda automaattisesti palveluntarjoajaa vikatilanteen tai korkean viiveen sattuessa.", + "featureUsageTrackingTitle": "Käytön seuranta", + "featureUsageTrackingDesc": "Yksityiskohtainen analytiikka ja kustannusseuranta kaikissa malleissa.", + "featureOAuthApiKeysTitle": "OAuth- ja API-avaimet", + "featureOAuthApiKeysDesc": "Hallitse tunnistetietoja turvallisesti yhdessä holvissa.", + "featureCloudSyncTitle": "Cloud Sync", + "featureCloudSyncDesc": "Synkronoi määritykset eri laitteiden välillä välittömästi.", + "featureCliSupportTitle": "CLI-tuki", + "featureCliSupportDesc": "Toimii Claude Coden, Codexin, Clinen, Cursorin ja muiden kanssa.", + "featureDashboardTitle": "Kojelauta", + "featureDashboardDesc": "Visuaalinen kojelauta reaaliaikaista liikenneanalyysiä varten.", + "howItWorks": "Kuinka OmniRoute toimii", + "howItWorksDescription": "Tiedot kulkevat saumattomasti sovelluksestasi älykkään reitityskerroksen kautta työsi parhaalle toimittajalle.", + "howItWorksStep1Title": "1. CLI ja SDK:t", + "howItWorksStep1Description": "Pyyntösi alkavat suosikkityökaluistasi tai yhdistetystä SDK:sta. Vaihda vain perus-URL-osoite.", + "howItWorksStep2Title": "2. OmniRoute Hub", + "howItWorksStep2Description": "Moottorimme analysoi kehotteen, tarkistaa palveluntarjoajan kunnon ja reitit pienimmän viiveen tai kustannusten varalta.", + "howItWorksStep3Title": "3. AI-palveluntarjoajat", + "howItWorksStep3Description": "OpenAI, Anthropic, Gemini tai muut täyttävät pyynnön välittömästi.", + "getStartedIn30Seconds": "Aloita 30 sekunnissa", + "getStartedDescription": "Asenna OmniRoute, määritä palveluntarjoajasi web-hallintapaneelin kautta ja aloita AI-pyyntöjen reitittäminen.", + "installOmniRoute": "Asenna OmniRoute", + "installStepDescription": "Suorita npx-komento käynnistääksesi palvelimen välittömästi", + "openDashboard": "Avaa Dashboard", + "openDashboardStepDescription": "Määritä palveluntarjoajat ja API-avaimet verkkokäyttöliittymän kautta", + "routeRequests": "Reittipyynnöt", + "routeRequestsStepDescription": "Osoita CLI-työkalusi osoitteeseen {endpoint}", + "terminal": "terminaali", + "copy": "Kopioi", + "copied": "✓ Kopioitu", + "startingOmniRoute": "OmniRoute aloitetaan...", + "serverRunningOnLabel": "Palvelin käynnissä", + "dashboardLabel": "Kojelauta", + "readyToRoute": "Valmiina reittiin! ✓", + "configureProvidersNote": "📝 Määritä palveluntarjoajat kojelaudassa tai käytä ympäristömuuttujia", + "dataLocation": "Tietojen sijainti:", + "dataLocationMacLinux": " macOS/Linux:", + "dataLocationWindows": " Windows:", + "product": "Tuote", + "dashboardLink": "Kojelauta", + "changelog": "Muutosloki", + "resources": "Resurssit", + "documentation": "Dokumentaatio", + "npm": "NPM", + "legal": "Laillinen", + "mitLicense": "MIT-lisenssi", + "footerTagline": "Tekoälyn sukupolven yhtenäinen päätepiste. Yhdistä, reititä ja hallitse tekoälypalveluntarjoajiasi helposti.", + "copyright": "© {year} OmniRoute. Kaikki oikeudet pidätetään.", + "flowToolClaudeCode": "Claude Code", + "flowToolOpenAICodex": "OpenAI Codex", + "flowToolCline": "Cline", + "flowToolCursor": "Kursori", + "flowProviderOpenAI": "OpenAI", + "flowProviderAnthropic": "Antrooppinen", + "flowProviderGemini": "Kaksoset", + "flowProviderGithubCopilot": "GitHub Copilot", + "interactiveDiagram": "Interaktiivinen kaavio näkyy työpöydällä", + "ctaTitle": "Oletko valmis yksinkertaistamaan tekoäly-infrastruktuuriasi?", + "ctaDescription": "Liity kehittäjien joukkoon, jotka virtaviivaistavat tekoälyintegraatiotaan OmniRouten avulla. Avoin lähdekoodi ja ilmainen aloittaa.", + "startFree": "Aloita ilmaiseksi", + "readDocumentation": "Lue dokumentaatio" + }, + "docs": { + "title": "Dokumentaatio", + "quickStart": "Pika-aloitus", + "features": "Ominaisuudet", + "supportedProviders": "Tuetut palveluntarjoajat", + "supportedProvidersToc": "Palveluntarjoajat", + "commonUseCases": "Yleiset käyttötapaukset", + "clientCompatibility": "Asiakasyhteensopivuus", + "apiReference": "API-viite", + "method": "menetelmä", + "path": "Polku", + "notes": "Huomautuksia", + "modelPrefixes": "Mallin etuliitteet", + "prefix": "Etuliite", + "troubleshooting": "Vianetsintä", + "supportsChat": "Tukee sekä chat- että vastauspäätepisteitä.", + "oauthAutoRefresh": "OAuth-yhteys automaattisella tunnuksen päivityksellä.", + "fullStreaming": "Täysi suoratoistotuki kaikille malleille.", + "docsLabel": "Asiakirjat", + "docsHeroDescription": "Tekoälyyhdyskäytävä usean palveluntarjoajan LLM:ille. Yksi päätepiste OpenAI:lle, Anthropicille, Geminille, GitHub Copilotille, Claude Codelle, Cursorille ja yli 20 muulle palveluntarjoajalle.", + "openDashboard": "Avaa Dashboard", + "endpointPage": "Päätepistesivu", + "github": "GitHub", + "reportIssue": "Ilmoita ongelmasta", + "onThisPage": "Tällä sivulla", + "documentationVersion": "Dokumentaatio - v{version}", + "quickStartStep1Title": "1. Asenna ja suorita", + "quickStartStep1Prefix": "Juokse", + "quickStartStep1Middle": "tai kloonaa GitHubista ja aja", + "quickStartStep2Title": "2. Luo API-avain", + "quickStartStep2Text": "Siirry kohtaan Päätepiste -> Rekisteröidyt avaimet. Luo yksi avain ympäristöä kohden.", + "quickStartStep3Title": "3. Yhdistä palveluntarjoajat", + "quickStartStep3Text": "Lisää palveluntarjoajan tilejä OAuth-kirjautumisen, API-avaimen tai vapaan tason automaattisen yhteyden avulla.", + "quickStartStep4Title": "4. Aseta asiakaskannan URL-osoite", + "quickStartStep4Prefix": "Osoita IDE- tai API-asiakkaasi", + "quickStartStep4Suffix": "Käytä esimerkiksi palveluntarjoajan etuliitettä", + "featureRoutingTitle": "Usean palveluntarjoajan reititys", + "featureRoutingText": "Reititä pyynnöt yli 30 tekoälypalveluntarjoajalle yhden OpenAI-yhteensopivan päätepisteen kautta. Tukee chat-, vastaus-, ääni- ja kuvasovellusliittymiä.", + "featureCombosTitle": "Yhdistelmät ja tasapainotus", + "featureCombosText": "Luo mallikomboja varaketjuilla ja tasapainotusstrategioilla: round-robin, prioriteetti, satunnainen, vähiten käytetty ja kustannusoptimoitu.", + "featureUsageTitle": "Käytön ja kustannusten seuranta", + "featureUsageText": "Reaaliaikainen tunnuksen laskenta, kustannuslaskenta palveluntarjoaja-/mallikohtaisesti ja yksityiskohtainen käyttöerittely API-avaimen ja tilin mukaan.", + "featureAnalyticsTitle": "Analyticsin hallintapaneeli", + "featureAnalyticsText": "Visuaalinen analytiikka, jossa on kaavioita pyynnöistä, tunnuksista, virheistä, viiveestä, kustannuksista ja mallin suosiosta ajan mittaan.", + "featureHealthTitle": "Terveyden seuranta", + "featureHealthText": "Live-terveystarkastukset, palveluntarjoajan tila, katkaisijatilat ja automaattinen nopeusrajan tunnistus eksponentiaalisella perääntymisellä.", + "featureCliTitle": "CLI-työkalut", + "featureCliText": "Hallitse IDE-määrityksiä, vie/tuo varmuuskopioita, etsi koodeksiprofiileja ja määritä asetuksia kojelaudalta.", + "featureSecurityTitle": "Turvallisuus ja käytännöt", + "featureSecurityText": "API-avaimen todennus, IP-suodatus, pikasyöttösuoja, toimialueen käytännöt, istunnon hallinta ja tarkastusloki.", + "featureCloudSyncTitle": "Cloud Sync", + "featureCloudSyncText": "Synkronoi kokoonpanosi Cloudflare Workersin kanssa, jotta voit käyttää etäkäyttöä salatuilla tunnistetiedoilla ja automaattisella virheensiirrolla.", + "providersAcrossConnectionTypes": "{count} palveluntarjoajia kolmessa yhteystyypissä.", + "manageProviders": "Hallinnoi palveluntarjoajia", + "providersCount": "{count} palveluntarjoajat", + "providerTypeFree": "Ilmainen taso", + "providerTypeOAuth": "OAuth", + "providerTypeApiKey": "API-avain", + "useCaseSingleEndpointTitle": "Yksi päätepiste useille palveluntarjoajille", + "useCaseSingleEndpointText": "Osoita asiakkaat yhteen perus-URL-osoitteeseen ja reititä mallien etuliite (esimerkiksi: gh/, cc/, kr/, openai/).", + "useCaseFallbackTitle": "Vara- ja mallinvaihto komboilla", + "useCaseFallbackText": "Luo yhdistelmämalleja Dashboardissa ja pidä asiakkaan kokoonpano vakaana, kun toimittajat vaihtuvat sisäisesti.", + "useCaseUsageVisibilityTitle": "Käyttö, hinta ja virheenkorjauksen näkyvyys", + "useCaseUsageVisibilityText": "Seuraa tunnuksia ja kustannuksia palveluntarjoajan, tilin ja API-avaimen mukaan Käyttö- ja Analytics-välilehdillä.", + "clientCherryStudioTitle": "Cherry Studio", + "baseUrlLabel": "Perus-URL-osoite", + "chatEndpointLabel": "Keskustelun päätepiste", + "modelRecommendationLabel": "Mallisuositus: selkeä etuliite", + "clientCodexTitle": "Codex / GitHub Copilot -mallit", + "clientCodexBullet1": "Käytä mallitunnuksia kanssa", + "clientCodexBullet2": "Codex-perheen mallit reitittävät automaattisesti kohteeseen", + "clientCodexBullet3": "Ei-Codex-mallit jatkavat toimintaansa", + "clientCursorTitle": "Kohdistin IDE", + "clientCursorBullet1": "Käytä", + "clientCursorBullet1Suffix": "etuliite kohdistinmalleille.", + "clientCursorBullet2": "OAuth-yhteys - kirjaudu sisään Palveluntarjoajat-sivulta.", + "clientClaudeTitle": "Claude Code / Antigravitaatio", + "clientClaudeBullet1Prefix": "Käytä", + "clientClaudeBullet1Middle": "(Claude) tai", + "clientClaudeBullet1Suffix": "(Antigravity) etuliite.", + "endpointChatNote": "OpenAI-yhteensopiva chat-päätepiste (oletus).", + "endpointResponsesNote": "Responses API-päätepiste (Codex, o-sarja).", + "endpointModelsNote": "Malliluettelo kaikille liitetyille palveluntarjoajille.", + "endpointAudioNote": "Äänen transkriptio (Deepgram, AssemblyAI).", + "endpointImagesNote": "Kuvan luominen (NanoBanana).", + "endpointRewriteChatNote": "Uudelleenkirjoitusapuohjelma asiakkaille ilman /v1.", + "endpointRewriteResponsesNote": "Uudelleenkirjoitusapuohjelma vastauksille ilman /v1.", + "endpointRewriteModelsNote": "Uudelleenkirjoitusapuohjelma mallin etsinnässä ilman /v1:tä.", + "modelPrefixesDescriptionStart": "Käytä toimittajan etuliitettä ennen mallin nimeä reitittääksesi tietylle toimittajalle. Esimerkki:", + "modelPrefixesDescriptionEnd": "reitit GitHub Copilotiin.", + "provider": "Palveluntarjoaja", + "type": "Kirjoita", + "troubleshootingModelRouting": "Jos asiakas epäonnistuu mallin reitityksessä, käytä nimenomaista tarjoaja/malli (esimerkiksi: gh/gpt-5.1-codex).", + "troubleshootingAmbiguousModels": "Jos saat epäselviä mallivirheitä, valitse toimittajan etuliite paljaan mallitunnuksen sijaan.", + "troubleshootingCodexFamily": "Säilytä GitHub Codex -perheen mallien mallina muodossa gh/; reititin valitsee / vastaa automaattisesti.", + "troubleshootingTestConnection": "Käytä Dashboard > Providers > Test Connection ennen testaamista IDE:istä tai ulkoisista asiakkaista.", + "troubleshootingCircuitBreaker": "Jos palveluntarjoaja näyttää katkaisijan auki, odota jäähtymistä tai katso lisätietoja Terveys-sivulta.", + "troubleshootingOAuth": "OAuth-palveluntarjoajat todenna uudelleen, jos tunnukset vanhenevat. Tarkista palveluntarjoajan kortin tilailmaisin." + }, + "legal": { + "privacyPolicy": "Tietosuojakäytäntö", + "termsOfService": "Palveluehdot", + "providerConfigurations": "Palveluntarjoajan määritykset", + "apiKeys": "API-avaimet", + "usageLogs": "Käyttölokit", + "applicationSettings": "Sovellusasetukset", + "viewExportAnalytics": "Tarkastele ja vie käyttöanalytiikkaa", + "clearHistory": "Tyhjennä käyttöhistoria milloin tahansa", + "configureRetention": "Määritä lokin säilytyskäytännöt", + "backupRestore": "Varmuuskopioi ja palauta tietokanta", + "privacyMetadataTitle": "Tietosuojakäytäntö | OmniRoute", + "privacyMetadataDescription": "OmniRoute AI API -välityspalvelimen reitittimen tietosuojakäytäntö.", + "termsMetadataTitle": "Palveluehdot | OmniRoute", + "termsMetadataDescription": "OmniRoute AI API -välityspalvelimen reitittimen käyttöehdot.", + "backToHome": "Takaisin kotiin", + "lastUpdated": "Viimeksi päivitetty: {date}", + "policyLastUpdatedDate": "13. helmikuuta 2026", + "listSeparator": "-", + "questionsVisit": "Kysymyksiä? Vieraile meillä", + "githubRepository": "GitHub-arkisto", + "privacySection1Title": "1. Local-First Architecture", + "privacySection1Text": "OmniRoute on suunniteltu paikalliseksi sovellukseksi. Kaikki tietojen käsittely ja tallennus tapahtuu kokonaan koneessasi. Ei ole keskitettyä palvelinta, joka kerää tietojasi.", + "privacySection2Title": "2. Tallentamamme tiedot", + "privacyDataStoredIn": "Seuraavat tiedot on tallennettu paikallisesti", + "privacyDataProviderConfigurationsDesc": "yhteyden URL-osoitteet, palveluntarjoajan tyypit ja prioriteettiasetukset", + "privacyDataApiKeysDesc": "salattu ja tallennettu paikallisesti AI-palveluntarjoajien todennusta varten", + "privacyDataUsageLogsDesc": "pyyntöjen määrät, tunnuksen käyttö, mallien nimet, aikaleimat ja vastausajat", + "privacyDataApplicationSettingsDesc": "teemaasetukset, reititysstrategia ja yhdistelmäkokoonpanot", + "privacySection3Title": "3. Ei telemetriaa", + "privacySection3Text": "OmniRoute ei kerää telemetria-, analytiikka- tai virheraportteja. Tietoja ei lähetetä meille tai millekään kolmannelle osapuolelle. Käyttömallisi, API-kutsusi ja kokoonpanosi pysyvät täysin yksityisinä.", + "privacySection4Title": "4. Kolmannen osapuolen tekoälypalveluntarjoajat", + "privacySection4Text": "Kun soitat API-kutsuja OmniRouten kautta, pyyntösi välitetään määrittämillesi tekoälypalveluntarjoajille (esimerkiksi OpenAI, Anthropic, Google). Näillä palveluntarjoajilla on omat tietosuojakäytäntönsä, jotka säätelevät, kuinka he käsittelevät tietojasi. Tarkista:", + "privacyOpenAiPolicy": "OpenAI:n tietosuojakäytäntö", + "privacyAnthropicPolicy": "Antrooppinen tietosuojakäytäntö", + "privacyGooglePolicy": "Googlen tietosuojakäytäntö", + "privacySection5Title": "5. Cloud Sync (valinnainen)", + "privacySection5Text": "Jos otat valinnaisen pilvisynkronointiominaisuuden käyttöön, palveluntarjoajan määritykset ja API-avaimet voidaan lähettää määritettyyn pilvipäätepisteeseen. Tämä ominaisuus on oletuksena pois käytöstä ja vaatii nimenomaisen osallistumisen.", + "privacySection6Title": "6. Kirjautuminen", + "privacyLoggingIntro": "Pyyntölokit voidaan määrittää kojelaudan asetuksista. Voit:", + "privacySection7Title": "7. Sinun oikeutesi", + "privacySection7TextStart": "Koska kaikki tiedot tallennetaan paikallisesti, sinulla on täysi hallinta. Voit poistaa tietosi milloin tahansa poistamalla", + "privacySection7TextEnd": "hakemistosta tai käyttämällä tietokannan varmuuskopiointi- ja palautustoimintoja kojelaudassa.", + "termsSection1Title": "1. Yleiskatsaus", + "termsSection1Text": "OmniRoute on paikallinen ensimmäinen AI API -välityspalvelin, joka toimii kokonaan koneessasi. Se reitittää pyynnöt useille tekoälypalveluntarjoajille kuormituksen tasapainottamisen, vikasietoisuuden ja käytön seurannan avulla.", + "termsSection2Title": "2. Käyttäjän velvollisuudet", + "termsResponsibilityApiKeys": "Olet yksin vastuussa omien API-avainten ja valtuustietojen hallinnasta kolmannen osapuolen AI-palveluntarjoajille (OpenAI, Anthropic, Google jne.).", + "termsResponsibilityCompliance": "Sinun on noudatettava jokaisen tekoälyn palveluntarjoajan, jonka API:ta käytät OmniRouten kautta, käyttöehtoja.", + "termsResponsibilitySecurity": "Olet vastuussa paikallisen OmniRoute-asennuksesi turvallisuudesta, mukaan lukien salasanan asettamisesta ja verkkoon pääsyn rajoittamisesta.", + "termsSection3Title": "3. Kuinka se toimii", + "termsSection3Text": "OmniRoute toimii välittäjänä. OmniRouteen lähetetyt API-kutsut käännetään ja välitetään määritetyille tekoälypalveluntarjoajille. OmniRoute ei muuta pyyntöjesi tai vastaustesi sisältöä tarvittavan protokollan käännöksen lisäksi.", + "termsSection4Title": "4. Tietojen käsittely", + "termsDataStoredLocally": "Kaikki tiedot tallennetaan paikallisesti koneellesi SQLite-tietokantaan.", + "termsNoTransmission": "OmniRoute ei lähetä mitään tietoja ulkoisille palvelimille, ellet ota pilvisynkronointiominaisuuksia erikseen käyttöön.", + "termsDataLocationText": "Käyttölokit, API-avaimet ja määritykset tallennetaan", + "termsSection5Title": "5. Vastuuvapauslauseke", + "termsSection5Text": "OmniRoute toimitetaan \"sellaisenaan\" ilman minkäänlaista takuuta. Emme ole vastuussa kustannuksista, jotka aiheutuvat API:n käytöstä, palveluhäiriöistä tai tietojen katoamisesta. Pidä aina varmuuskopiot asetuksistasi.", + "termsSection6Title": "6. Avoin lähdekoodi", + "termsSection6Text": "OmniRoute on avoimen lähdekoodin ohjelmisto. Voit vapaasti tarkastaa, muokata ja jakaa sitä sen lisenssiehtojen mukaisesti." + } +} diff --git a/src/shared/components/LanguageSelector.tsx b/src/shared/components/LanguageSelector.tsx index 416f43db21..12f9ba1c58 100644 --- a/src/shared/components/LanguageSelector.tsx +++ b/src/shared/components/LanguageSelector.tsx @@ -65,7 +65,7 @@ export default function LanguageSelector() { {/* Dropdown */} {open && ( - + {LANGUAGES.map((lang) => (