From 9eb71a81a3a0f20edb85acf00dedc867ee264e5b Mon Sep 17 00:00:00 2001 From: qbit-mirror-bot Date: Wed, 1 Jul 2026 10:53:10 +0000 Subject: [PATCH] =?UTF-8?q?feat(i18n):=20add=2011=20new=20languages=20?= =?UTF-8?q?=E2=80=94=20Korean,=20German,=20Spanish,=20French,=20Portuguese?= =?UTF-8?q?-BR,=20Arabic,=20Hindi,=20Thai,=20Vietnamese,=20Italian,=20Russ?= =?UTF-8?q?ian?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/desktop/src/i18n/ar.ts | 953 +++++++++++++++++++++++++++++ apps/desktop/src/i18n/catalog.ts | 24 +- apps/desktop/src/i18n/de.ts | 953 +++++++++++++++++++++++++++++ apps/desktop/src/i18n/es.ts | 953 +++++++++++++++++++++++++++++ apps/desktop/src/i18n/fr.ts | 953 +++++++++++++++++++++++++++++ apps/desktop/src/i18n/hi.ts | 953 +++++++++++++++++++++++++++++ apps/desktop/src/i18n/it.ts | 953 +++++++++++++++++++++++++++++ apps/desktop/src/i18n/ko.ts | 953 +++++++++++++++++++++++++++++ apps/desktop/src/i18n/languages.ts | 112 +++- apps/desktop/src/i18n/pt-br.ts | 953 +++++++++++++++++++++++++++++ apps/desktop/src/i18n/ru.ts | 953 +++++++++++++++++++++++++++++ apps/desktop/src/i18n/th.ts | 953 +++++++++++++++++++++++++++++ apps/desktop/src/i18n/types.ts | 2 +- apps/desktop/src/i18n/vi.ts | 953 +++++++++++++++++++++++++++++ 14 files changed, 10618 insertions(+), 3 deletions(-) create mode 100644 apps/desktop/src/i18n/ar.ts create mode 100644 apps/desktop/src/i18n/de.ts create mode 100644 apps/desktop/src/i18n/es.ts create mode 100644 apps/desktop/src/i18n/fr.ts create mode 100644 apps/desktop/src/i18n/hi.ts create mode 100644 apps/desktop/src/i18n/it.ts create mode 100644 apps/desktop/src/i18n/ko.ts create mode 100644 apps/desktop/src/i18n/pt-br.ts create mode 100644 apps/desktop/src/i18n/ru.ts create mode 100644 apps/desktop/src/i18n/th.ts create mode 100644 apps/desktop/src/i18n/vi.ts diff --git a/apps/desktop/src/i18n/ar.ts b/apps/desktop/src/i18n/ar.ts new file mode 100644 index 000000000000..91e4def18b0a --- /dev/null +++ b/apps/desktop/src/i18n/ar.ts @@ -0,0 +1,953 @@ +import { defineLocale } from './define-locale' + +export const ar = defineLocale( +{ + appearance: { + title: 'المظهر', + description: 'هذه إعدادات عرض خاصة بسطح المكتب. يتحكم الوضع في السطوع؛ ويتحكم السمة في لوحة الألوان وتصميم سطح المحادثة.', + colorMode: 'وضع الألوان', + colorModeDesc: 'اختر وضعًا ثابتًا أو دع Hermes يتبع إعداد النظام.', + theme: { + nous: 'Nous', + nousDesc: 'ألوان محايدة زجاجية مع لمسات Nous الزرقاء', + midnight: 'منتصف الليل', + midnightDesc: 'أزرق بنفسجي عميق مع لمسات باردة', + ember: 'جمرة', + emberDesc: 'قرمزي وبرونزي دافئ — أجواء الحدادة', + mono: 'أحادي', + monoDesc: 'تدرج رمادي نظيف — بسيط ومركز', + cyberpunk: 'سايبربانك', + cyberpunkDesc: 'أخضر نيون على أسود — طرفية ماتركس', + slate: 'أردوازي', + slateDesc: 'أزرق أردوازي بارد — سمة مطور مركزة', + }, + themeDesc: 'اختر لوحة ألوان لسطح المحادثة وألوان الواجهة.', + mode: { + light: 'فاتح', + lightDesc: 'أسطح مكتب مشرقة', + dark: 'داكن', + darkDesc: 'مساحة عمل منخفضة الوهج', + system: 'النظام', + systemDesc: 'اتبع مظهر نظام التشغيل', + }, + language: 'اللغة', + languageDesc: 'اختر لغة الواجهة أو دع Hermes يتبع إعداد النظام.', + toolCallDisplay: 'عرض استدعاءات الأدوات', + toolCallDisplayDesc: 'منتج يخفي حمولات الأدوات الخام؛ تقني يعرض الإدخال/الإخراج الكامل.', + toolViewProduct: 'منتج', + toolViewTechnical: 'تقني', + toolViewProductDesc: 'نشاط أدوات سهل القراءة مع ملخصات موجزة.', + toolViewTechnicalDesc: 'تضمين وسائط/نتائج الأدوات الخام والتفاصيل منخفضة المستوى.', + }, + settings: { + title: 'الإعدادات', + appearance: 'المظهر', + model: 'النموذج', + gateway: 'البوابة', + sessions: 'الجلسات', + tools: 'الأدوات والمهارات', + section: { + chat: 'المحادثة', + workspace: 'مساحة العمل', + safety: 'الأمان', + memory: 'الذاكرة والسياق', + voice: 'الصوت', + advanced: 'متقدم', + }, + mcp: 'خوادم MCP', + config: 'التهيئة', + keys: 'مفاتيح API', + about: 'حول', + closeSettings: 'إغلاق الإعدادات', + archivedChats: 'المحادثات المؤرشفة', + exportConfig: 'تصدير التهيئة', + importConfig: 'استيراد التهيئة', + resetDefaults: 'إعادة التعيين إلى الإعدادات الافتراضية', + llmProviders: 'مزودو LLM', + searchPlaceholder: { + about: 'حول Hermes Desktop', + config: 'البحث في الإعدادات…', + gateway: 'اتصال البوابة…', + keys: 'البحث عن مفاتيح API…', + mcp: 'البحث عن خوادم MCP…', + sessions: 'البحث عن الجلسات المؤرشفة…', + }, + }, + chat: { + placeholder: 'اسألني أي شيء…', + send: 'إرسال', + stop: 'إيقاف', + thinking: 'جاري التفكير…', + noSession: 'لا توجد جلسة نشطة. ابدأ محادثة جديدة.', + loadingSession: 'جاري تحميل الجلسة', + loadingResponse: 'Hermes يحمّل ردًا', + branchInNewChat: 'تفرع في محادثة جديدة', + readAloud: 'قراءة بصوت عالٍ', + preparingAudio: 'جاري تحضير الصوت...', + stopReading: 'إيقاف القراءة', + editMessage: 'تحرير الرسالة', + editableCheckpoint: 'نقطة حفظ قابلة للتحرير', + restoreCheckpoint: 'استعادة نقطة الحفظ', + goForward: 'تقدم للأمام', + restorePrevCheckpoint: 'استعادة نقطة الحفظ السابقة', + restoreNextCheckpoint: 'استعادة نقطة الحفظ التالية', + composerTip: 'نصيحة: اكتب @ للإشارة إلى الملفات مباشرة.', + reconnecting: 'جاري إعادة الاتصال بـ Hermes…', + }, + commandCenter: { + title: 'مركز الأوامر', + noSessions: 'لا توجد جلسات بعد.', + loadingStatus: 'جاري تحميل الحالة…', + recentLogs: 'السجلات الحديثة', + dailyTokens: 'الرموز اليومية', + noActivity: 'لا يوجد نشاط يومي.', + noModelUsage: 'لا يوجد استخدام للنماذج بعد.', + noSkillActivity: 'لا يوجد نشاط مهارات بعد.', + sessionsPanel: 'لوحة الجلسات', + systemPanel: 'لوحة النظام', + usagePanel: 'لوحة الاستخدام', + navigate: 'تنقل', + noMatchingResults: 'لم يتم العثور على نتائج مطابقة.', + noSessionsYet: 'لا توجد جلسات بعد.', + unpinSession: 'إلغاء تثبيت الجلسة', + pinSession: 'تثبيت الجلسة', + exportSession: 'تصدير الجلسة', + deleteSession: 'حذف الجلسة', + gatewayRunning: 'بوابة المراسلة قيد التشغيل', + gatewayStopped: 'بوابة المراسلة متوقفة', + restartMsg: 'إعادة تشغيل المراسلة', + updateHermes: 'تحديث Hermes', + noLogsLoaded: 'لم يتم تحميل سجلات بعد.', + closeLabel: 'إغلاق مركز الأوامر', + searchPlaceholder: 'البحث عن جلسات، عروض، وإجراءات', + statSessions: 'جلسات', + statApiCalls: 'استدعاءات API', + statTokens: 'الرموز دخول/خروج', + statEstCost: 'التكلفة المقدرة', + cost => `الفعلي ${cost}`, + loadingUsage: 'جاري تحميل الاستخدام...', + count => `لا يوجد استخدام في آخر ${count} أيام.`, + retry: 'إعادة المحاولة', + tokenInput: 'دخل', + tokenOutput: 'خرج', + noDailyActivity: 'لا يوجد نشاط يومي.', + topModels: 'أفضل النماذج', + topSkills: 'أفضل المهارات', + actionsLabel: 'إجراءات', + systemRunning: 'قيد التشغيل', + systemDone: 'تم', + systemFailed: 'فشل', + open: 'فتح مركز الأوامر', + close: 'إغلاق مركز الأوامر', + }, + common: { + loading: 'جاري التحميل…', + save: 'حفظ', + cancel: 'إلغاء', + close: 'إغلاق', + delete: 'حذف', + confirm: 'تأكيد', + search: 'بحث…', + clearSearch: 'مسح البحث', + copy: 'نسخ', + refresh: 'تحديث', + moreActions: 'المزيد من الإجراءات', + tryAgain: 'حاول مرة أخرى', + }, + onboarding: { + welcome: 'مرحبًا بك في Hermes', + getStarted: 'ابدأ باختيار مزود ونموذج.', + skip: 'تخطي', + continue: 'متابعة', + finish: 'إنهاء', + setupTitle: 'لنقم بإعداد Hermes Agent', + setupDesc: 'اربط مزود نماذج لبدء الدردشة. معظم الخيارات تحتاج نقرة واحدة.', + preparing: 'جاري تشغيل Hermes…', + installing: 'Hermes يُكمل التثبيت. يستغرق هذا عادة أقل من دقيقة في أول تشغيل.', + lookingUp: 'جاري البحث عن المزودين...', + otherProviders: 'مزودون آخرون', + collapse: 'طي', + iHaveKey: 'لدي مفتاح API', + recommended: 'موصى به', + connected: 'متصل', + backToSignIn: 'العودة إلى تسجيل الدخول', + getKey: 'احصل على مفتاح', + pasteKey: 'ألصق مفتاح API', + connect: 'اتصال', + connecting: 'جاري الاتصال', + copyCode: 'نسخ', + startSignIn: 'بدء تسجيل الدخول لـ', + verifyingCode: 'جاري التحقق من الرمز مع', + pickingModel: 'متصل. جاري اختيار نموذج افتراضي...', + signInFailed: 'فشل تسجيل الدخول. حاول مرة أخرى.', + pickDifferent: 'اختر مزودًا مختلفًا', + signInTitle: 'تسجيل الدخول باستخدام', + step1: 'فتحنا', + step1End: 'في متصفحك.', + step2: 'امنح Hermes الصلاحية هناك.', + step3: 'انسخ رمز التفويض وألصقه أدناه.', + pasteCode: 'ألصق رمز التفويض', + reopenAuth: 'إعادة فتح صفحة التفويض', + cancel: 'إلغاء', + browserDesc: 'فتحنا', + browserDescEnd: 'في متصفحك. امنح Hermes الصلاحية هناك وستتصل تلقائيًا — لا حاجة للنسخ أو اللصق.', + waitingAuth: 'في انتظار منحك الصلاحية...', + reopenSignIn: 'إعادة فتح صفحة تسجيل الدخول', + externalDesc: 'يسجل الدخول من خلال CLI الخاص به. شغّل هذا الأمر في الطرفية، ثم عد واختر "لقد سجلت الدخول":', + iSignedIn: 'لقد سجلت الدخول', + enterCode: 'فتحنا', + enterCodeEnd: 'في متصفحك. أدخل هذا الرمز هناك:', + reopenVerification: 'إعادة فتح صفحة التحقق', + defaultModel: 'النموذج الافتراضي', + freeTier: 'الطبقة المجانية', + pro: 'Pro', + change: 'تغيير', + startChatting: 'ابدأ الدردشة', + docs: 'الوثائق', + close: 'إغلاق', + savingError: 'تعذر حفظ بيانات الاعتماد.', + openRouter: 'OpenRouter', + }, + file: { + browser: 'متصفح الملفات', + noFiles: 'لا توجد ملفات بعد.', + }, + terminal: { + title: 'الطرفية', + newTab: 'تبويب جديد', + closeTab: 'إغلاق التبويب', + }, + skills: { + title: 'المهارات', + search: 'البحث عن مهارات…', + noResults: 'لم يتم العثور على مهارات.', + tools: 'المهارات والأدوات', + }, + profiles: { + title: 'الملفات الشخصية', + noProfilesYet: 'لا توجد ملفات شخصية بعد.', + selectProfile: 'اختر ملفًا شخصيًا لعرض تفاصيله.', + deleteProfile: 'حذف الملف الشخصي؟', + soulMd: 'SOUL.md', + unsavedChanges: 'تغييرات غير محفوظة', + newProfile: 'ملف شخصي جديد', + cloneFromDefault: 'نسخ من الافتراضي', + renameProfile: 'إعادة تسمية الملف الشخصي', + }, + cron: { + title: 'مهام Cron', + noJobs: 'لا توجد مهام مجدولة.', + deleteCronJob: 'حذف مهمة Cron؟', + optional: 'اختياري', + label: 'Cron', + open: 'فتح مهام cron', + }, + messaging: { + title: 'المراسلة', + recommended: 'موصى به', + recommendedTelegram: 'موصى به. معرّفات رقمية مفصولة بفواصل من @userinfobot. بدون هذا، يمكن لأي شخص مراسلة بوتك.', + recommendedDiscord: 'موصى به. معرّفات مستخدم Discord مفصولة بفواصل.', + recommendedSlack: 'موصى به. معرّفات مستخدم Slack مفصولة بفواصل.', + recommendedMattermost: 'موصى به. معرّفات مستخدم Mattermost مفصولة بفواصل.', + recommendedMatrix: 'موصى به. معرّفات مستخدم مفصولة بفواصل بصيغة @user:server.', + recommendedSignal: 'موصى به. معرّفات Signal مفصولة بفواصل.', + recommendedWhatsApp: 'موصى به. أرقام هواتف أو معرّفات WhatsApp مفصولة بفواصل.', + gatewayStopped: 'بوابة المراسلة متوقفة', + getCredentials: 'احصل على بيانات الاعتماد', + required: 'مطلوب', + unsavedChanges: 'تغييرات غير محفوظة', + saved: 'تم الحفظ', + }, + about: { + version: 'الإصدار', + checkUpdates: 'التحقق من التحديثات', + upToDate: 'Hermes محدث.', + updateAvailable: 'يتوفر تحديث.', + license: 'رخصة MIT', + hermesDesktop: 'Hermes Desktop', + versionUnavailable: 'الإصدار غير متاح', + updates: 'التحديثات', + checkNow: 'تحقق الآن', + checking: 'جاري التحقق…', + seeWhatsNew: 'اطلع على الجديد', + releaseNotes: 'ملاحظات الإصدار', + autoUpdates: 'التحديثات التلقائية', + autoUpdatesDesc: 'يتحقق Hermes من التحديثات تلقائيًا في الخلفية ويخبرك عند توفر تحديث.', + selfUpdateUnsupported: 'لا يمكن لهذا الإصدار تحديث نفسه من داخل التطبيق.', + cannotReachServer: 'تعذر الوصول إلى خادم التحديثات.', + installingUpdate: 'يتم تثبيت تحديث حاليًا.', + count => `يتوفر تحديث جديد (يشمل ${count} تغيير).`, + count => `يتوفر تحديث جديد (يشمل ${count} تغييرات).`, + onLatest: 'أنت تستخدم أحدث إصدار.', + tapCheckNow: 'اضغط "تحقق الآن" للبحث عن تحديثات.', + time => `آخر فحص ${time}`, + justNow: 'الآن', + never: 'أبدًا', + count => `قبل ${count} دقيقة`, + count => `قبل ${count} ساعة`, + count => `قبل ${count} يوم`, + (branch, sha) => `فرع ${branch} · إيداع ${sha}`, + }, + keys: { + title: 'مفاتيح API', + noKeys: 'لم يتم تكوين مفاتيح API.', + addKey: 'إضافة مفتاح', + loading: 'جاري تحميل مفاتيح API وبيانات الاعتماد…', + docs: 'الوثائق', + openDocs: 'فتح وثائق المزود', + hideValue: 'إخفاء القيمة', + revealValue: 'إظهار القيمة', + set: 'مُعيّن', + notSet: 'غير مُعيّن', + replace: 'استبدال', + replaceValue: 'استبدال القيمة الحالية', + enterValue: 'أدخل القيمة', + saving: 'جاري الحفظ', + save: 'حفظ', + cancel: 'إلغاء', + clearValue: 'مسح القيمة', + (count, total) => `تم تكوين ${count} من ${total}`, + (count, total) => `تم تعيين ${count} من ${total}`, + count => `تم تعيين ${count}`, + count => `${count} مفاتيح`, + otherProviders: 'مزودون آخرون', + categoryTools: 'الأدوات', + categoryMessaging: 'المراسلة', + categorySettings: 'الإعدادات', + openProviderDocs: 'فتح وثائق المزود', + showAdvanced: 'إظهار المتقدم', + loadFailed: 'فشل تحميل مفاتيح API', + credentialSaved: 'تم حفظ بيانات الاعتماد', + credentialRemoved: 'تمت إزالة بيانات الاعتماد', + }, + config: { + title: 'التهيئة', + edit: 'تحرير التهيئة', + reload: 'إعادة تحميل التهيئة', + notSet: 'غير مُعيّن', + commaSeparated: 'قيم مفصولة بفواصل', + on: 'تشغيل', + off: 'إيقاف', + none: 'لا شيء', + emptyOption: '(لا شيء)', + loading: 'جاري تحميل تهيئة Hermes…', + noMatching: 'لا توجد إعدادات مطابقة', + noMatchingDesc: 'جرّب مصطلح بحث مختلف أو اختر قسمًا آخر.', + count => `${count} نتيجة`, + count => `${count} نتائج`, + saving: 'جاري الحفظ…', + label: { + defaultModel: 'النموذج الافتراضي', + contextWindow: 'نافذة السياق', + fallbackModels: 'النماذج الاحتياطية', + enabledToolsets: 'مجموعات الأدوات المفعلة', + timezone: 'المنطقة الزمنية', + personality: 'الشخصية', + reasoningBlocks: 'كتل الاستدلال', + maxAgentSteps: 'الحد الأقصى لخطوات الوكيل', + imageAttachments: 'مرفقات الصور', + workingDirectory: 'دليل العمل', + executionBackend: 'خلفية التنفيذ', + commandTimeout: 'مهلة الأوامر', + persistentShell: 'طرفية مستمرة', + envPassthrough: 'تمرير متغيرات البيئة', + fileReadLimit: 'حد قراءة الملفات', + terminalOutputLimit: 'حد مخرجات الطرفية', + filePageLimit: 'حد صفحات الملفات', + lineLengthLimit: 'حد طول السطر', + codeExecutionMode: 'وضع تنفيذ الكود', + approvalMode: 'وضع الموافقة', + approvalTimeout: 'مهلة الموافقة', + confirmMcpReloads: 'تأكيد إعادة تحميل MCP', + commandAllowlist: 'قائمة الأوامر المسموحة', + redactSecrets: 'حجب الأسرار', + allowPrivateUrls: 'السماح بالروابط الخاصة', + browserPrivateUrls: 'تصفح الروابط الخاصة', + localBrowserForPrivateUrls: 'متصفح محلي للروابط الخاصة', + fileCheckpoints: 'نقاط حفظ الملفات', + checkpointLimit: 'حد نقاط الحفظ', + voiceShortcut: 'اختصار الصوت', + maxRecordingLength: 'الحد الأقصى للتسجيل', + readResponsesAloud: 'قراءة الردود بصوت عالٍ', + speechToText: 'تحويل الكلام إلى نص', + speechToTextProvider: 'مزود تحويل الكلام إلى نص', + localTranscriptionModel: 'نموذج النسخ المحلي', + transcriptionLanguage: 'لغة النسخ', + elevenlabsSttModel: 'نموذج ElevenLabs STT', + elevenlabsLanguage: 'لغة ElevenLabs', + tagAudioEvents: 'وسم الأحداث الصوتية', + speakerDiarization: 'تمييز المتحدثين', + textToSpeechProvider: 'مزود تحويل النص إلى كلام', + edgeVoice: 'صوت Edge', + openaiTtsModel: 'نموذج OpenAI TTS', + openaiVoice: 'صوت OpenAI', + elevenlabsVoice: 'صوت ElevenLabs', + elevenlabsModel: 'نموذج ElevenLabs', + persistentMemory: 'ذاكرة دائمة', + userProfile: 'ملف المستخدم', + memoryBudget: 'ميزانية الذاكرة', + profileBudget: 'ميزانية الملف الشخصي', + memoryProvider: 'مزود الذاكرة', + contextEngine: 'محرك السياق', + autoCompression: 'الضغط التلقائي', + compressionThreshold: 'عتبة الضغط', + compressionTarget: 'هدف الضغط', + protectedRecentMessages: 'الرسائل الحديثة المحمية', + apiRetries: 'إعادة محاولات API', + serviceTier: 'مستوى الخدمة', + toolUseEnforcement: 'فرض استخدام الأدوات', + subagentModel: 'نموذج الوكيل الفرعي', + subagentProvider: 'مزود الوكيل الفرعي', + subagentTurnLimit: 'حد أدوار الوكيل الفرعي', + parallelSubagents: 'الوكلاء الفرعيون المتوازيون', + subagentTimeout: 'مهلة الوكيل الفرعي', + subagentReasoningEffort: 'جهد استدلال الوكيل الفرعي', + }, + desc: { + defaultModel: 'يُستخدم للمحادثات الجديدة ما لم تختر نموذجًا مختلفًا في المحرر.', + contextWindow: 'اتركه 0 لاستخدام نافذة السياق المكتشفة للنموذج المحدد.', + fallbackModels: 'إدخالات مزود:نموذج احتياطية للتجربة إذا فشل النموذج الافتراضي.', + personality: 'نمط المساعد الافتراضي للجلسات الجديدة.', + timezone: 'يُستخدم عندما يحتاج Hermes إلى سياق التوقيت المحلي. الفراغ يستخدم المنطقة الزمنية للنظام.', + reasoningBlocks: 'إظهار أقسام الاستدلال عندما توفرها الخلفية.', + imageAttachments: 'يتحكم في كيفية إرسال مرفقات الصور إلى النموذج.', + workingDirectory: 'مجلد المشروع الافتراضي لعمل الأدوات والطرفية.', + codeExecutionMode: 'مدى صرامة نطاق تنفيذ الكود على المشروع الحالي.', + persistentShell: 'الحفاظ على حالة الطرفية بين الأوامر عندما تدعمها الخلفية.', + envPassthrough: 'متغيرات البيئة لتمريرها إلى تنفيذ الأدوات.', + fileReadLimit: 'الحد الأقصى للأحرف التي يمكن لـ Hermes قراءتها من طلب ملف واحد.', + approvalMode: 'كيفية تعامل Hermes مع الأوامر التي تحتاج موافقة صريحة.', + approvalTimeout: 'مدة انتظار مطالبات الموافقة قبل انتهاء المهلة.', + redactSecrets: 'إخفاء الأسرار المكتشفة من المحتوى المرئي للنموذج عندما يكون ممكنًا.', + fileCheckpoints: 'إنشاء نسخ احتياطية للتراجع قبل تعديلات الملفات.', + persistentMemory: 'حفظ ذكريات دائمة يمكن أن تساعد الجلسات المستقبلية.', + userProfile: 'الاحتفاظ بملف مضغوط لتفضيلات المستخدم.', + contextEngine: 'استراتيجية إدارة المحادثات الطويلة بالقرب من حد السياق.', + autoCompression: 'تلخيص السياق الأقدم عندما تصبح المحادثات كبيرة.', + readResponsesAloud: 'نطق ردود المساعد تلقائيًا.', + speechToText: 'تفعيل النسخ الصوتي المحلي أو عبر مزود.', + elevenlabsLanguage: 'رمز لغة ISO-639-3 اختياري. الفراغ يسمح لـ ElevenLabs بالكشف التلقائي.', + maxAgentSteps: 'الحد الأعلى لأدوار استدعاء الأدوات قبل أن يوقف Hermes التشغيل.', + }, + }, + gateway: { + title: 'البوابة', + start: 'تشغيل البوابة', + stop: 'إيقاف البوابة', + restart: 'إعادة تشغيل البوابة', + running: 'قيد التشغيل', + stopped: 'متوقفة', + loading: 'جاري تحميل إعدادات البوابة…', + unavailable: 'إعدادات البوابة غير متاحة', + unavailableDesc: 'لا يكشف جسر IPC لسطح المكتب عن إعدادات البوابة.', + connection: 'اتصال البوابة', + envOverride: 'تجاوز بيئي', + desc: 'يشغل Hermes Desktop بوابته المحلية افتراضيًا. استخدم بوابة بعيدة عندما تريد من هذا التطبيق التحكم في خلفية Hermes قيد التشغيل على جهاز آخر أو خلف وكيل موثوق.', + envOverrideTitle: 'متغيرات البيئة تتحكم في جلسة سطح المكتب هذه.', + (urlVar, tokenVar) => `ألغِ تعيين ${urlVar} و ${tokenVar} لاستخدام الإعداد المحفوظ أدناه.`, + localTitle: 'بوابة محلية', + localDesc: 'تشغيل خلفية Hermes خاصة على localhost. هذا هو الإعداد الافتراضي ويعمل دون اتصال.', + remoteTitle: 'بوابة بعيدة', + remoteDesc: 'ربط واجهة سطح المكتب هذه بخلفية Hermes بعيدة باستخدام رمز الجلسة الخاص بها.', + remoteUrl: 'الرابط البعيد', + remoteUrlDesc: 'الرابط الأساسي للوحة التحكم البعيدة. بادئات المسار مدعومة، مثل /hermes.', + remoteUrlPlaceholder: 'https://gateway.example.com/hermes', + sessionToken: 'رمز الجلسة', + sessionTokenDesc: 'رمز جلسة لوحة التحكم المستخدم للوصول عبر REST و WebSocket. اتركه فارغًا للإبقاء على الرمز المحفوظ.', + sessionTokenPlaceholder: 'ألصق رمز الجلسة', + preview => `رمز موجود ${preview}`, + tokenSaved: 'محفوظ', + testRemote: 'اختبار البعيد', + saveRestart: 'حفظ لإعادة التشغيل التالية', + saveReconnect: 'حفظ وإعادة الاتصال', + diagnostics: 'التشخيص', + diagnosticsDesc: 'إظهار desktop.log في مدير الملفات — مفيد عند فشل تشغيل البوابة.', + openLogs: 'فتح السجلات', + connected: 'متصل', + connecting: 'جاري الاتصال', + disconnected: 'غير متصل', + inferenceReady: 'الاستدلال جاهز', + inferenceNotReady: 'الاستدلال غير جاهز', + checkingInference: 'جاري التحقق من الاستدلال', + openSystemPanel: 'فتح لوحة النظام', + connectionLabel: 'الاتصال:', + recentActivity: 'النشاط الحديث', + viewAllLogs: 'عرض جميع السجلات →', + messagingPlatforms: 'منصات المراسلة', + label: 'البوابة', + inferenceStatus: 'حالة استدلال البوابة', + enterUrlFirst: 'أدخل رابطًا بعيدًا ورمز جلسة قبل التبديل', + enterUrlFirstTest: 'أدخل رابطًا بعيدًا ورمز جلسة قبل الاختبار', + }, + sessions: { + title: 'الجلسات', + search: 'البحث عن جلسات…', + noResults: 'لم يتم العثور على جلسات.', + export: 'تصدير', + delete: 'حذف الجلسة', + loading: 'جاري التحميل…', + defaultProjectDir: 'دليل المشروع الافتراضي', + defaultProjectDirDesc: 'تبدأ الجلسات الجديدة في هذا المجلد ما لم تختر مجلدًا آخر. اتركه فارغًا لاستخدام الدليل الرئيسي.', + fallback => `الافتراضي هو ${fallback}.`, + notSet: 'غير مُعيّن', + change: 'تغيير', + choose: 'اختيار', + clear: 'مسح', + archivedTitle: 'الجلسات المؤرشفة', + archivedDesc: 'المحادثات المؤرشفة مخفية من الشريط الجانبي لكنها تحتفظ بجميع رسائلها. اضغط Ctrl/⌘ مع النقر على محادثة في الشريط الجانبي لأرشفتها.', + nothingArchived: 'لا شيء مؤرشَف', + noSearchMatch: 'لا توجد محادثات مؤرشفة تطابق بحثك.', + archiveToHide: 'أرشِف محادثة لإخفائها هنا.', + unarchive: 'إلغاء الأرشفة', + deletePermanently: 'حذف نهائي', + count => `${count} رسائل`, + new: 'جلسة جديدة', + running: 'الجلسة قيد التشغيل', + actions: 'إجراءات الجلسة', + reorder: 'إعادة ترتيب', + pin: 'تثبيت', + unpin: 'إلغاء التثبيت', + copyId: 'نسخ المعرّف', + rename: 'إعادة تسمية', + archive: 'أرشفة', + renameDialog: 'إعادة تسمية الجلسة', + renameDesc: 'أعطِ هذه المحادثة عنوانًا مميزًا. اتركه فارغًا للمسح.', + untitled: 'جلسة بدون عنوان', + renamed: 'تمت إعادة التسمية', + renameFailed: 'فشلت إعادة التسمية', + pinned: 'مُثبّت', + results: 'النتائج', + allPinned: 'كل ما هنا مُثبّت. ألغِ تثبيت محادثة لإظهارها في الحديثة.', + pinHint: 'Shift + نقرة لتثبيت محادثة · سحب لإعادة الترتيب', + loadMore: 'تحميل المزيد', + noWorkspace: 'بدون مساحة عمل', + ungroup: 'إظهار الجلسات كقائمة واحدة', + groupByWorkspace: 'تجميع الجلسات حسب مساحة العمل', + loadStep: 'تحميل', + moreLabel: 'المزيد', + nothingArchivedTitle: 'لا شيء مؤرشَف', + deletePermanentlyTitle: 'حذف نهائي', + defaultProjectDirTitle: 'دليل المشروع الافتراضي', + loadingArchived: 'جاري تحميل الجلسات المؤرشفة…', + restored: 'تمت الاستعادة', + projectDirUpdated: 'تم تحديث دليل المشروع الافتراضي', + loadFailed: 'تعذر تحميل الجلسات المؤرشفة', + unarchiveFailed: 'فشل إلغاء الأرشفة', + deleteFailed: 'فشل الحذف', + archiveHint: 'أرشِف محادثة لإخفائها هنا.', + updateDirFailed: 'تعذر تحديث الدليل الافتراضي', + clearDirFailed: 'تعذر مسح الدليل الافتراضي', + }, + mcp: { + title: 'خوادم MCP', + addServer: 'إضافة خادم', + noServers: 'لم يتم تكوين خوادم MCP.', + loading: 'جاري تحميل خوادم MCP…', + servers: 'خوادم MCP', + count => `تم تكوين ${count}`, + newServer: 'خادم جديد', + reloadMCP: 'إعادة تحميل MCP', + reloading: 'جاري إعادة التحميل...', + noServersDesc: 'أضف خادم stdio أو HTTP لعرض أدوات MCP.', + name: 'الاسم', + namePlaceholder: 'filesystem', + serverJSON: 'JSON الخادم', + editServer: 'تحرير الخادم', + saveServer: 'حفظ الخادم', + saving: 'جاري الحفظ...', + remove: 'إزالة', + disabled: 'معطل', + nameRequired: 'الاسم مطلوب', + nameRequiredDesc: 'أعطِ خادم MCP هذا مفتاح تهيئة.', + invalidJson: 'يجب أن تكون تهيئة الخادم كائن JSON', + invalidJsonDesc: 'JSON MCP غير صالح', + saved: 'تم حفظ خادم MCP', + name => `${name} يُطبق بعد إعادة تحميل MCP.`, + saveFailed: 'فشل الحفظ', + removeFailed: 'فشلت الإزالة', + gatewayUnavailable: 'البوابة غير متاحة', + gatewayUnavailableDesc: 'أعد توصيل البوابة قبل إعادة تحميل MCP.', + reloadedTitle: 'تم إعادة تحميل أدوات MCP', + reloadedDesc: 'مخططات الأدوات الجديدة تُطبق على الأدوار الجديدة.', + reloadFailed: 'فشلت إعادة تحميل MCP', + giveConfigKey: 'أعطِ خادم MCP هذا مفتاح تهيئة.', + reconnectGateway: 'أعد توصيل البوابة قبل إعادة تحميل MCP.', + newSchemas: 'مخططات الأدوات الجديدة تُطبق على الأدوار الجديدة.', + loadingServers: 'جاري تحميل خوادم MCP...', + serverName: 'الاسم', + serversTitle: 'خوادم MCP', + noServersTitle: 'لا توجد خوادم MCP', + failedToLoad: 'فشل تحميل تهيئة MCP', + invalidJsonShort: 'JSON MCP غير صالح', + serverSaved: 'تم حفظ خادم MCP', + toolsReloaded: 'تم إعادة تحميل أدوات MCP', + emptyDesc: 'أضف خادم stdio أو HTTP لعرض أدوات MCP.', + }, + tools: { + title: 'الأدوات والمهارات', + noTools: 'لا توجد أدوات متاحة.', + }, + nav: { + home: 'الرئيسية', + chat: 'المحادثة', + settings: 'الإعدادات', + files: 'الملفات', + terminal: 'الطرفية', + }, + header: { + search: 'ابحث أو اكتب أمرًا…', + }, + model: { + auxTask: { + vision: 'الرؤية', + visionHint: 'تحليل الصور', + web_extract: 'استخراج الويب', + web_extractHint: 'تلخيص الصفحات', + compression: 'الضغط', + compressionHint: 'ضغط السياق', + session_search: 'بحث الجلسات', + session_searchHint: 'استعلامات الاستدعاء', + skills_hub: 'مركز المهارات', + skills_hubHint: 'بحث المهارات', + approval: 'الموافقة', + approvalHint: 'موافقة تلقائية ذكية', + mcp: 'MCP', + mcpHint: 'توجيه أدوات MCP', + title_generation: 'توليد العناوين', + title_generationHint: 'عناوين الجلسات', + curator: 'المنسق', + curatorHint: 'مراجعة استخدام المهارات', + }, + mainModel: 'النموذج الرئيسي', + mainDesc: 'ينطبق على الجلسات الجديدة. استخدم منتقي النماذج في المحرر للتبديل السريع للمحادثة النشطة.', + providerPlaceholder: 'المزود', + modelPlaceholder: 'النموذج', + apply: 'تطبيق', + applying: 'جاري التطبيق…', + auxiliaryModels: 'النماذج المساعدة', + auxiliaryDesc: 'تعمل المهام المساعدة على النموذج الرئيسي افتراضيًا. عيّن نموذجًا مخصصًا لأي مهمة للتجاوز.', + resetAllToMain: 'إعادة تعيين الكل إلى الرئيسي', + setToMain: 'تعيين إلى الرئيسي', + change: 'تغيير', + cancel: 'إلغاء', + autoUseMain: 'تلقائي · استخدام النموذج الرئيسي', + providerDefault: '(افتراضي المزود)', + loading: 'جاري تحميل تهيئة النموذج…', + options: 'خيارات', + thinking: 'التفكير', + fast: 'سريع', + effort: 'الجهد', + noOptions: 'لا توجد خيارات لهذا النموذج', + optionUpdateFailed: 'فشل تحديث خيار النموذج', + fastModeUpdateFailed: 'فشل تحديث الوضع السريع', + effortMinimal: 'أدنى', + effortLow: 'منخفض', + effortMedium: 'متوسط', + effortHigh: 'عالي', + effortMax: 'أقصى', + switch: 'تبديل النموذج', + unknown: '(غير معروف)', + filterPlaceholder: 'تصفية المزودين والنماذج...', + persistGlobal: 'حفظ بشكل عام', + persistGlobalSession: 'حفظ بشكل عام (وإلا لهذه الجلسة فقط)', + couldNotLoad: 'تعذر تحميل النماذج', + proLockedDesc: 'النماذج Pro تحتاج اشتراك Nous مدفوع.', + priceTooltip: 'سعر الإدخال / الإخراج لكل مليون رمز', + freePrice: 'مجاني', + currentLabel: 'الحالي:', + addProviderBtn: 'إضافة مزود', + }, + updates: { + checking: 'جاري التحقق من التحديثات…', + available: 'يتوفر تحديث', + downloading: 'جاري التنزيل…', + installing: 'جاري التثبيت…', + restart: 'أعد التشغيل للتحديث', + stageGettingReady: 'جاري الاستعداد…', + stageDownloading: 'جاري التنزيل…', + stageAlmostThere: 'أوشكنا على الانتهاء…', + stageFinishingUp: 'جاري الإنهاء…', + stageRestarting: 'جاري إعادة تشغيل Hermes…', + stageManual: 'حدّث من الطرفية', + stageError: 'توقف التحديث مؤقتًا', + updatingHermes: 'جاري تحديث Hermes…', + lookingForUpdates: 'جاري البحث عن تحديثات…', + couldntCheck: 'تعذر التحقق من التحديثات', + updateNotAvailable: 'التحديث غير متاح', + checkConnection: 'تحقق من اتصالك وحاول مرة أخرى.', + onLatest: 'أنت تستخدم أحدث إصدار.', + allSet: 'كل شيء جاهز', + newUpdateAvailable: 'يتوفر تحديث جديد', + readyToInstall: 'إصدار جديد من Hermes جاهز للتثبيت.', + updateNow: 'حدّث الآن', + maybeLater: 'ربما لاحقًا', + count => `+ ${count} تغيير إضافي مضمن.`, + count => `+ ${count} تغييرات إضافية مضمنة.`, + updateFromTerminal: 'حدّث من الطرفية', + terminalDesc: 'لقد ثبّت Hermes من سطر الأوامر، لذا تعمل التحديثات هناك أيضًا. ألصق هذا في الطرفية:', + copied: 'تم النسخ', + copy: 'نسخ', + pickupNewVersion: 'سيتبنى Hermes الإصدار الجديد عند تشغيله في المرة القادمة.', + done: 'تم', + updaterDesc: 'سيتولى مُحدِّث Hermes المهمة في نافذته الخاصة وسيعيد فتح Hermes عند الانتهاء.', + closeToApply: 'سيُغلق Hermes لتطبيق التحديث.', + updateDidntFinish: 'لم يكتمل التحديث', + nothingLost: 'لا تقلق — لم يُفقد شيء. يمكنك المحاولة مرة أخرى الآن.', + notNow: 'ليس الآن', + }, + errors: { + generic: 'حدث خطأ ما.', + notFound: 'الصفحة غير موجودة.', + noPermission: 'ليس لديك صلاحية الوصول إلى هذا.', + somethingBroke: 'حدث عطل في الواجهة', + viewCrashedDesc: 'واجهت الواجهة خطأ غير متوقع. محادثاتك وإعداداتك آمنة - حاول مرة أخرى، أو أعد تحميل النافذة.', + noProviders: 'لا يوجد مزودون مصرح لهم.', + }, + tool: { + toolCall: 'استدعاء أداة', + result: 'النتيجة', + error: 'خطأ', + timeout: 'انتهت المهلة', + cancelled: 'مُلغى', + running: 'قيد التشغيل', + recovered: 'تم الاسترداد', + done: 'تم', + output: 'مخرجات الأداة', + searchResults: 'نتائج البحث', + rawResponse: 'الرد الخام', + stdout: 'stdout', + stderr: 'stderr', + copyActivity: 'نسخ النشاط', + recoveredAfter: 'تم الاسترداد بعد خطوة فاشلة واحدة', + count => `تم الاسترداد بعد ${count} خطوات فاشلة`, + oneStepFailed: 'فشلت خطوة واحدة', + count => `فشلت ${count} خطوات`, + }, + composer: { + startingHermes: 'جاري تشغيل Hermes...', + sendFollowUp: 'إرسال متابعة', + message: 'رسالة', + editingQueued: 'تحرير الدور المُنتظر في المحرر', + attach: 'إرفاق', + files: 'ملفات…', + folder: 'مجلد…', + images: 'صور…', + pasteImage: 'لصق صورة', + url: 'رابط…', + promptSnippets: 'مقتطفات التوجيه', + promptSnippetsDesc: 'اختر توجيهًا بدائيًا لإدراجه في المحرر.', + voiceStart: 'بدء محادثة صوتية', + queue: 'وضع الرسالة في الطابور', + speaking: 'يتحدث', + transcribing: 'جاري النسخ', + muted: 'مكتوم', + listening: 'يستمع', + unmuteMic: 'إلغاء كتم الميكروفون', + muteMic: 'كتم الميكروفون', + stopListening: 'إيقاف الاستماع والإرسال', + endVoice: 'إنهاء المحادثة الصوتية', + end: 'إنهاء', + stopDictation: 'إيقاف الإملاء', + transcribingDictation: 'جاري نسخ الإملاء', + voiceDictation: 'الإملاء الصوتي', + addContext: 'إضافة سياق', + }, + models: { + title: 'النماذج', + search: 'البحث عن نماذج', + addProvider: 'إضافة مزود…', + }, + install: { + title: 'يحتاج Hermes إلى تثبيت لمرة واحدة', + desc: 'التثبيت التلقائي لأول تشغيل غير متاح على', + descEnd: 'بعد. افتح الطرفية وشغّل الأمر أدناه، ثم أعد تشغيل هذا التطبيق. سيتخطى التشغيل اللاحق هذه الخطوة.', + installCommand: 'أمر التثبيت', + copyCommand: 'نسخ الأمر', + viewDocs: 'عرض وثائق التثبيت', + willInstallTo: 'سيتم التثبيت في', + iRanIt: 'لقد شغلته -- أعد المحاولة', + failed: 'فشل التثبيت', + settingUp: 'جاري إعداد Hermes Agent', + finishingUp: 'جاري الإنهاء', + failedDesc: 'فشلت إحدى خطوات التثبيت. على Windows، قد يحدث هذا إذا كان هناك مثيل آخر من Hermes CLI أو سطح المكتب قيد التشغيل. أوقف أي مثيلات Hermes قيد التشغيل، ثم أعد المحاولة. راجع التفاصيل أدناه أو سجل سطح المكتب للنص الكامل.', + setupDesc: 'هذا إعداد لمرة واحدة. يقوم مثبّت Hermes بتنزيل التبعيات وتهيئة جهازك. ستتخطى عمليات التشغيل اللاحقة هذه الخطوة.', + fetchingManifest: 'جاري جلب بيان التثبيت...', + error: 'خطأ', + showOutput: 'إظهار مخرجات التثبيت', + hideOutput: 'إخفاء مخرجات التثبيت', + noOutput: 'لا توجد مخرجات بعد.', + cancelInstall: 'إلغاء التثبيت', + cancelling: 'جاري الإلغاء...', + copyOutput: 'نسخ المخرجات', + copied: 'تم النسخ!', + reloadRetry: 'إعادة تحميل وإعادة المحاولة', + saveLogs: 'تم حفظ النص الكامل في', + stepsComplete: 'الخطوات مكتملة', + nowLabel: 'الآن', + line: 'سطر', + lines: 'أسطر', + }, + previewConsole: { + resizeLabel: 'تغيير حجم طرفية المعاينة', + noMessages: 'لا توجد رسائل طرفية بعد.', + }, + boot: { + ipcUnavailable: 'جسر IPC لسطح المكتب غير متاح.', + backendExited: 'عملية Hermes الخلفية خرجت أثناء بدء التشغيل.', + backendStoppedTitle: 'توقفت الخلفية', + backendStoppedMessage: 'عملية Hermes الخلفية خرجت.', + startingConnection: 'بدء اتصال سطح المكتب', + connectingGateway: 'توصيل بوابة سطح المكتب الحية', + loadingConfig: 'تحميل إعدادات Hermes', + loadingSessions: 'تحميل الجلسات الحديثة', + desktopBootFailed: 'فشل تشغيل سطح المكتب', + couldNotStart: 'تعذر تشغيل Hermes', + recoveryDesc: 'البوابة الخلفية لم تعمل. جرب إحدى خطوات الاسترداد أدناه — لا شيء هنا يحذف محادثاتك أو إعداداتك.', + retry: 'إعادة المحاولة', + repairInstall: 'إصلاح التثبيت', + useLocalGateway: 'استخدام بوابة محلية', + openLogs: 'فتح السجلات', + repairHint: 'الإصلاح يعيد تشغيل المثبت وقد يستغرق بضع دقائق على جهاز جديد.', + showLogs: 'إظهار السجلات الحديثة', + hideLogs: 'إخفاء السجلات الحديثة', + }, + urlDialog: { + title: 'إرفاق رابط', + description: 'سيجلب Hermes الصفحة ويضمّنها كسياق لهذا الدور.', + placeholder: 'https://example.com/post', + hint: 'أدرج الرابط الكامل، مثل', + attach: 'إرفاق', + }, + titlebar: { + hideSidebar: 'إخفاء الشريط الجانبي', + showSidebar: 'إظهار الشريط الجانبي', + search: 'بحث', + searchTitle: 'البحث عن جلسات، عروض، وإجراءات', + hideRightSidebar: 'إخفاء الشريط الجانبي الأيمن', + showRightSidebar: 'إظهار الشريط الجانبي الأيمن', + unmuteHaptics: 'إلغاء كتم الاهتزازات', + muteHaptics: 'كتم الاهتزازات', + openSettings: 'فتح الإعدادات', + profiles: 'الملفات الشخصية', + profilesDesc: 'بيئات Hermes متقدمة لشخصيات وتكوينات ومهارات وSOUL.md منفصلة.', + manageProfiles: 'إدارة الملفات الشخصية', + language: 'اللغة', + languageDesc: 'اختر لغة عرض للواجهة.', + }, + pagination: { + ariaLabel: 'ترقيم الصفحات', + prevAria: 'الذهاب إلى الصفحة السابقة', + prev: 'السابق', + nextAria: 'الذهاب إلى الصفحة التالية', + next: 'التالي', + }, + bootstrap: { + pending: 'معلق', + running: 'جاري التثبيت', + done: 'تم', + skipped: 'تم التخطي', + failed: 'فشل', + }, + sidebar: { + sheetTitle: 'الشريط الجانبي', + sheetDesc: 'يعرض الشريط الجانبي للجوال.', + toggle: 'تبديل الشريط الجانبي', + }, + clarify: { + hermesIsAsking: 'Hermes يسأل', + loadingQuestion: 'جاري تحميل السؤال…', + otherTypeAnswer: 'أخرى (اكتب إجابتك)', + placeholderAnswer: 'اكتب إجابتك…', + cmdEnterToSend: '⌘/Ctrl + Enter للإرسال', + back: 'رجوع', + skip: 'تخطي', + couldNotSend: 'تعذر إرسال رد التوضيح', + n => `١–${n} للاختيار`, + }, + intro: { + fallback1h: 'ماذا نحرك اليوم؟', + fallback1b: 'أرسل خطأ أو فرعًا أو خطة أو فكرة أولية. سأفحص المستودع وأحولها إلى الخطوة الملموسة التالية.', + fallback2h: 'ما الذي يشغل بالك؟', + fallback2b: 'أحضر الكود أو السؤال أو الجزء العالق. سأقرأ الغرفة قبل إجراء التغييرات.', + fallback3h: 'ما الذي يجب أن ينظر إليه Hermes؟', + fallback3b: 'أرسل المهمة أو المسار الفاشل أو الخطة غير المكتملة. سأساعد في تحويلها إلى عمل.', + fallback4h: 'من أين نبدأ؟', + fallback4b: 'أحضر المشكلة أو الهدف أو الملف. سأفحص أولاً وأبقي الخطوة التالية ملموسة.', + fallback5h: 'ما الذي يحتاج اهتمامًا؟', + fallback5b: 'أرسل السياق الذي لديك. سأساعد في ترتيبه إلى خطة أو إصلاح.', + personality: { + label => `وضع ${label} قيد التشغيل. على ماذا نعمل؟`, + body1: 'أرسل المهمة أو الملف أو الفكرة الأولية. سأستخدم صوتك المُعد وأبقي العمل مرتبطًا بهذا المستودع.', + label => `ما الذي يحتاج ${label} Hermes رؤيته؟`, + body2: 'أحضر السياق أو الجزء العالق. سأتكيف مع شخصيتك المُعدة.', + label => `وضع ${label} جاهز.`, + body3: 'أرسل المشكلة أو الملف أو الفكرة. سأتبع الشخصية التي قمت بتهيئتها.', + label => `ما الذي يجب أن يعالجه ${label} Hermes؟`, + body4: 'ضع المهمة هنا. سأبقي العمل مرتبطًا بالمستودع.', + heading5: 'من أين نبدأ؟', + label => `أعطني السياق وسأجيب في وضع ${label}.`, + }, + brand: 'HERMES AGENT', + }, + artifacts: { + noArtifactsFound: 'لم يتم العثور على مُخرجات', + }, + agents: { + spawnTree: 'شجرة التفريخ', + liveSubagentActivity: 'نشاط الوكيل الفرعي المباشر للدور الحالي.', + noLiveSubagents: 'لا يوجد وكلاء فرعيون مباشرون', + files: 'ملفات', + label: 'الوكلاء', + open: 'فتح الوكلاء', + close: 'إغلاق الوكلاء', + subagent: 'وكيل فرعي', + subagents: 'وكلاء فرعيون', + failed: 'فشل', + running: 'قيد التشغيل', + }, + provider: { + desc: { + nousPortal: 'تجاوز الرابط الأساسي لبوابة Nous', + openRouter: 'مفتاح OpenRouter API (للرؤية ومساعدي كشط الويب و MoA)', + google: 'مفتاح Google AI Studio API (يُعرف أيضًا كـ GEMINI_API_KEY)', + gemini: 'معرّف مشروع GCP لطبقات Gemini المدفوعة (الطبقة المجانية تُجهّز تلقائيًا)', + anthropic: 'مفتاح Anthropic API', + deepseek: 'رابط DeepSeek API الأساسي المخصص (متقدم)', + xai: 'تجاوز الرابط الأساسي لـ xAI', + huggingface: 'تجاوز الرابط الأساسي لـ Hugging Face Inference Providers', + kimi: 'مفتاح Kimi / Moonshot China API', + minimax: 'تجاوز الرابط الأساسي لـ MiniMax (الصين)', + minimaxCn: 'مفتاح MiniMax China API', + dashscope: 'رابط DashScope أساسي مخصص (الافتراضي: نقطة نهاية coding-intl المتوافقة مع OpenAI)', + glm: 'مفتاح GLM API (Z.AI)', + nvidia: 'تجاوز الرابط الأساسي لـ NVIDIA NIM (مثل http://localhost:8000/v1 لـ NIM المحلي)', + opencodeGo: 'مفتاح OpenCode Go API', + opencodeZen: 'مفتاح OpenCode Zen API', + xiaomi: 'تجاوز الرابط الأساسي لـ Xiaomi MiMo (الافتراضي: https://api.xiaomimimo.com/v1)', + kiloCode: 'مفتاح Kilo Code API', + aiGateway: 'مفتاح AI Gateway API (Vercel AI Gateway)', + browserbase: 'BROWSERBASE_API_KEY', + elevenLabs: 'مفتاح ElevenLabs API', + openai: 'مفتاح OpenAI API (لمعالجة الصوت عبر الوكيل)', + mistral: 'مفتاح Mistral API (لـ STT/TTS)', + groq: 'مفتاح Groq API (لـ STT)', + tavily: 'TAVILY_API_KEY', + firecrawl: 'رابط Firecrawl API للحالات المستضافة ذاتيًا (اختياري)', + fal: 'FAL_KEY', + nous: 'تجاوز الرابط الأساسي لبوابة Nous', + openrouter: 'مفتاح OpenRouter API (للرؤية ومساعدي كشط الويب و MoA)', + lmstudio: 'تجاوز الرابط الأساسي لـ Z.AI / GLM', + zai: 'رابط Azure Foundry الأساسي (اضبط عبر \'hermes model\' لتهيئة خاصة بنقطة النهاية)', + stepfun: 'تجاوز الرابط الأساسي لـ StepFun Step Plan', + arcee: 'تجاوز الرابط الأساسي لـ Arcee AI', + gmi: 'تجاوز الرابط الأساسي لـ GMI Cloud', + qwenportal: 'تجاوز الرابط الأساسي لبوابة Qwen (الافتراضي: https://portal.qwen.ai/v1)', + opencodego: 'تجاوز الرابط الأساسي لـ OpenCode Go', + ollamacloud: 'تجاوز الرابط الأساسي لـ Ollama Cloud (الافتراضي: https://ollama.com/v1)', + awsbedrock: 'ملف AWS المسمى لمصادقة Bedrock (من ~/.aws/credentials)', + exa: 'مفتاح Exa API للبحث واستخراج المحتوى المدعوم بالذكاء الاصطناعي', + parallel: 'مفتاح Parallel API للبحث والاستخراج المدعوم بالذكاء الاصطناعي', + }, + }, +} +) diff --git a/apps/desktop/src/i18n/catalog.ts b/apps/desktop/src/i18n/catalog.ts index 19556cb45c49..2af7cb04d1a6 100644 --- a/apps/desktop/src/i18n/catalog.ts +++ b/apps/desktop/src/i18n/catalog.ts @@ -1,6 +1,17 @@ +import { ar } from './ar' +import { de } from './de' import { en } from './en' +import { es } from './es' +import { fr } from './fr' +import { hi } from './hi' +import { it } from './it' import { ja } from './ja' +import { ko } from './ko' +import { ptbr } from './pt-br' +import { ru } from './ru' +import { th } from './th' import type { Locale, Translations } from './types' +import { vi } from './vi' import { zh } from './zh' import { zhHant } from './zh-hant' @@ -8,5 +19,16 @@ export const TRANSLATIONS: Record = { en, zh, 'zh-hant': zhHant, - ja + ja, + ko, + de, + es, + fr, + 'pt-br': ptbr, + ar, + hi, + th, + vi, + it, + ru } diff --git a/apps/desktop/src/i18n/de.ts b/apps/desktop/src/i18n/de.ts new file mode 100644 index 000000000000..d9383d0ddbd3 --- /dev/null +++ b/apps/desktop/src/i18n/de.ts @@ -0,0 +1,953 @@ +import { defineLocale } from './define-locale' + +export const de = defineLocale( +{ + appearance: { + title: 'Erscheinungsbild', + description: 'Dies sind Desktop-spezifische Anzeigeeinstellungen. Der Modus steuert die Helligkeit; das Design steuert die Akzentpalette und das Chat-Design.', + colorMode: 'Farbmodus', + colorModeDesc: 'Wähle einen festen Modus oder lass Hermes deiner Systemeinstellung folgen.', + theme: { + nous: 'Nous', + nousDesc: 'Glas-Neutraltöne mit Nous-Blau-Akzenten', + midnight: 'Mitternacht', + midnightDesc: 'Tiefes Blauviolett mit kühlen Akzenten', + ember: 'Glut', + emberDesc: 'Warmes Karminrot und Bronze – Schmiede-Vibes', + mono: 'Mono', + monoDesc: 'Klares Graustufen-Design – minimalistisch und fokussiert', + cyberpunk: 'Cyberpunk', + cyberpunkDesc: 'Neon-Grün auf Schwarz – Matrix-Terminal', + slate: 'Schiefer', + slateDesc: 'Kühles Schieferblau – fokussiertes Entwickler-Design', + }, + themeDesc: 'Wähle eine Farbpalette für die Chat-Oberfläche und die Akzente.', + mode: { + light: 'Hell', + lightDesc: 'Helle Desktop-Oberflächen', + dark: 'Dunkel', + darkDesc: 'Blendarme Arbeitsumgebung', + system: 'System', + systemDesc: 'Systemeinstellung übernehmen', + }, + language: 'Sprache', + languageDesc: 'Wähle die UI-Sprache oder lass Hermes deiner Systemeinstellung folgen.', + toolCallDisplay: 'Tool-Aufruf-Anzeige', + toolCallDisplayDesc: 'Produkt blendet rohe Tool-Daten aus; Technisch zeigt vollständige Ein-/Ausgabe.', + toolViewProduct: 'Produkt', + toolViewTechnical: 'Technisch', + toolViewProductDesc: 'Menschenfreundliche Tool-Aktivität mit kurzen Zusammenfassungen.', + toolViewTechnicalDesc: 'Rohe Tool-Argumente/Ergebnisse und Details auf niedriger Ebene einbeziehen.', + }, + settings: { + title: 'Einstellungen', + appearance: 'Erscheinungsbild', + model: 'Modell', + gateway: 'Gateway', + sessions: 'Sitzungen', + tools: 'Tools & Skills', + section: { + chat: 'Chat', + workspace: 'Arbeitsbereich', + safety: 'Sicherheit', + memory: 'Speicher & Kontext', + voice: 'Sprache', + advanced: 'Erweitert', + }, + mcp: 'MCP-Server', + config: 'Konfiguration', + keys: 'API-Schlüssel', + about: 'Über', + closeSettings: 'Einstellungen schließen', + archivedChats: 'Archivierte Chats', + exportConfig: 'Konfiguration exportieren', + importConfig: 'Konfiguration importieren', + resetDefaults: 'Auf Standard zurücksetzen', + llmProviders: 'LLM-Anbieter', + searchPlaceholder: { + about: 'Über Hermes Desktop', + config: 'Einstellungen durchsuchen…', + gateway: 'Gateway-Verbindung…', + keys: 'API-Schlüssel durchsuchen…', + mcp: 'MCP-Server durchsuchen…', + sessions: 'Archivierte Sitzungen durchsuchen…', + }, + }, + chat: { + placeholder: 'Frag mich etwas…', + send: 'Senden', + stop: 'Stopp', + thinking: 'Denkt nach…', + noSession: 'Keine aktive Sitzung. Starte eine neue Unterhaltung.', + loadingSession: 'Lade Sitzung', + loadingResponse: 'Hermes lädt eine Antwort', + branchInNewChat: 'In neuem Chat abzweigen', + readAloud: 'Vorlesen', + preparingAudio: 'Bereite Audio vor...', + stopReading: 'Vorlesen beenden', + editMessage: 'Nachricht bearbeiten', + editableCheckpoint: 'Bearbeitbarer Checkpoint', + restoreCheckpoint: 'Checkpoint wiederherstellen', + goForward: 'Vorwärts', + restorePrevCheckpoint: 'Vorherigen Checkpoint wiederherstellen', + restoreNextCheckpoint: 'Nächsten Checkpoint wiederherstellen', + composerTip: 'Tipp: Gib @ ein, um Dateien inline zu referenzieren.', + reconnecting: 'Verbinde erneut mit Hermes…', + }, + commandCenter: { + title: 'Kommandozentrale', + noSessions: 'Noch keine Sitzungen.', + loadingStatus: 'Lade Status…', + recentLogs: 'Aktuelle Logs', + dailyTokens: 'Tägliche Token', + noActivity: 'Keine tägliche Aktivität.', + noModelUsage: 'Noch keine Modellnutzung.', + noSkillActivity: 'Noch keine Skill-Aktivität.', + sessionsPanel: 'Sitzungs-Panel', + systemPanel: 'System-Panel', + usagePanel: 'Nutzungs-Panel', + navigate: 'Navigieren', + noMatchingResults: 'Keine passenden Ergebnisse gefunden.', + noSessionsYet: 'Noch keine Sitzungen.', + unpinSession: 'Sitzung lösen', + pinSession: 'Sitzung anheften', + exportSession: 'Sitzung exportieren', + deleteSession: 'Sitzung löschen', + gatewayRunning: 'Messaging-Gateway läuft', + gatewayStopped: 'Messaging-Gateway gestoppt', + restartMsg: 'Messaging neustarten', + updateHermes: 'Hermes aktualisieren', + noLogsLoaded: 'Noch keine Logs geladen.', + closeLabel: 'Kommandozentrale schließen', + searchPlaceholder: 'Sitzungen, Ansichten und Aktionen durchsuchen', + statSessions: 'Sitzungen', + statApiCalls: 'API-Aufrufe', + statTokens: 'Token ein/aus', + statEstCost: 'Gesch. Kosten', + cost => `tatsächlich ${cost}`, + loadingUsage: 'Lade Nutzung...', + count => `Keine Nutzung in den letzten ${count} Tagen.`, + retry: 'Wiederholen', + tokenInput: 'Eingabe', + tokenOutput: 'Ausgabe', + noDailyActivity: 'Keine tägliche Aktivität.', + topModels: 'Top-Modelle', + topSkills: 'Top-Skills', + actionsLabel: 'Aktionen', + systemRunning: 'läuft', + systemDone: 'fertig', + systemFailed: 'fehlgeschlagen', + open: 'Kommandozentrale öffnen', + close: 'Kommandozentrale schließen', + }, + common: { + loading: 'Lädt…', + save: 'Speichern', + cancel: 'Abbrechen', + close: 'Schließen', + delete: 'Löschen', + confirm: 'Bestätigen', + search: 'Suchen…', + clearSearch: 'Suche löschen', + copy: 'Kopieren', + refresh: 'Aktualisieren', + moreActions: 'Weitere Aktionen', + tryAgain: 'Erneut versuchen', + }, + onboarding: { + welcome: 'Willkommen bei Hermes', + getStarted: 'Wähle einen Anbieter und ein Modell, um loszulegen.', + skip: 'Überspringen', + continue: 'Weiter', + finish: 'Fertig', + setupTitle: 'Lass uns Hermes Agent einrichten', + setupDesc: 'Verbinde einen Modellanbieter, um zu chatten. Die meisten Optionen brauchen nur einen Klick.', + preparing: 'Starte Hermes…', + installing: 'Hermes schließt die Installation ab. Das dauert beim ersten Start normalerweise unter einer Minute.', + lookingUp: 'Suche nach Anbietern...', + otherProviders: 'Andere Anbieter', + collapse: 'Einklappen', + iHaveKey: 'Ich habe einen API-Schlüssel', + recommended: 'Empfohlen', + connected: 'Verbunden', + backToSignIn: 'Zurück zur Anmeldung', + getKey: 'Schlüssel besorgen', + pasteKey: 'API-Schlüssel einfügen', + connect: 'Verbinden', + connecting: 'Verbinde', + copyCode: 'Kopieren', + startSignIn: 'Starte Anmeldung für', + verifyingCode: 'Überprüfe deinen Code mit', + pickingModel: 'verbunden. Wähle ein Standardmodell...', + signInFailed: 'Anmeldung fehlgeschlagen. Erneut versuchen.', + pickDifferent: 'Anderen Anbieter wählen', + signInTitle: 'Anmelden mit', + step1: 'Wir haben', + step1End: 'in deinem Browser geöffnet.', + step2: 'Autorisiere Hermes dort.', + step3: 'Kopiere den Autorisierungscode und füge ihn unten ein.', + pasteCode: 'Autorisierungscode einfügen', + reopenAuth: 'Autorisierungsseite erneut öffnen', + cancel: 'Abbrechen', + browserDesc: 'Wir haben', + browserDescEnd: 'in deinem Browser geöffnet. Autorisiere Hermes dort und du wirst automatisch verbunden – nichts zum Kopieren oder Einfügen.', + waitingAuth: 'Warte auf deine Autorisierung...', + reopenSignIn: 'Anmeldeseite erneut öffnen', + externalDesc: 'meldet sich über die eigene CLI an. Führe diesen Befehl im Terminal aus, komm zurück und wähle „Ich habe mich angemeldet":', + iSignedIn: 'Ich habe mich angemeldet', + enterCode: 'Wir haben', + enterCodeEnd: 'in deinem Browser geöffnet. Gib diesen Code dort ein:', + reopenVerification: 'Verifizierungsseite erneut öffnen', + defaultModel: 'Standardmodell', + freeTier: 'Kostenlos', + pro: 'Pro', + change: 'Ändern', + startChatting: 'Chat starten', + docs: 'Dokumentation', + close: 'Schließen', + savingError: 'Zugangsdaten konnten nicht gespeichert werden.', + openRouter: 'OpenRouter', + }, + file: { + browser: 'Dateibrowser', + noFiles: 'Noch keine Dateien.', + }, + terminal: { + title: 'Terminal', + newTab: 'Neuer Tab', + closeTab: 'Tab schließen', + }, + skills: { + title: 'Skills', + search: 'Skills durchsuchen…', + noResults: 'Keine Skills gefunden.', + tools: 'Skills & Tools', + }, + profiles: { + title: 'Profile', + noProfilesYet: 'Noch keine Profile.', + selectProfile: 'Wähle ein Profil, um Details anzuzeigen.', + deleteProfile: 'Profil löschen?', + soulMd: 'SOUL.md', + unsavedChanges: 'Ungespeicherte Änderungen', + newProfile: 'Neues Profil', + cloneFromDefault: 'Von Standard kopieren', + renameProfile: 'Profil umbenennen', + }, + cron: { + title: 'Cron-Jobs', + noJobs: 'Keine geplanten Jobs.', + deleteCronJob: 'Cron-Job löschen?', + optional: 'Optional', + label: 'Cron', + open: 'Cron-Jobs öffnen', + }, + messaging: { + title: 'Messaging', + recommended: 'Empfohlen', + recommendedTelegram: 'Empfohlen. Kommagetrennte numerische IDs von @userinfobot. Ohne dies kann jeder deinem Bot eine DM schicken.', + recommendedDiscord: 'Empfohlen. Kommagetrennte Discord-Benutzer-IDs.', + recommendedSlack: 'Empfohlen. Kommagetrennte Slack-Benutzer-IDs.', + recommendedMattermost: 'Empfohlen. Kommagetrennte Mattermost-Benutzer-IDs.', + recommendedMatrix: 'Empfohlen. Kommagetrennte Benutzer-IDs im Format @benutzer:server.', + recommendedSignal: 'Empfohlen. Kommagetrennte Signal-Identifikatoren.', + recommendedWhatsApp: 'Empfohlen. Kommagetrennte Telefonnummern oder WhatsApp-IDs.', + gatewayStopped: 'Messaging-Gateway gestoppt', + getCredentials: 'Zugangsdaten besorgen', + required: 'Erforderlich', + unsavedChanges: 'Ungespeicherte Änderungen', + saved: 'Gespeichert', + }, + about: { + version: 'Version', + checkUpdates: 'Nach Updates suchen', + upToDate: 'Hermes ist auf dem neuesten Stand.', + updateAvailable: 'Ein Update ist verfügbar.', + license: 'MIT-Lizenz', + hermesDesktop: 'Hermes Desktop', + versionUnavailable: 'Version nicht verfügbar', + updates: 'Updates', + checkNow: 'Jetzt prüfen', + checking: 'Prüfe…', + seeWhatsNew: 'Neuigkeiten anzeigen', + releaseNotes: 'Versionshinweise', + autoUpdates: 'Automatische Updates', + autoUpdatesDesc: 'Hermes prüft automatisch im Hintergrund nach Updates und benachrichtigt dich, wenn eins bereit ist.', + selfUpdateUnsupported: 'Dieser Build kann sich nicht selbst aus der App heraus aktualisieren.', + cannotReachServer: 'Der Update-Server konnte nicht erreicht werden.', + installingUpdate: 'Ein Update wird gerade installiert.', + count => `Ein neues Update ist bereit (${count} Änderung enthalten).`, + count => `Ein neues Update ist bereit (${count} Änderungen enthalten).`, + onLatest: 'Du bist auf der neuesten Version.', + tapCheckNow: 'Tippe auf „Jetzt prüfen", um nach Updates zu suchen.', + time => `Zuletzt geprüft ${time}`, + justNow: 'gerade eben', + never: 'nie', + count => `vor ${count} Min.`, + count => `vor ${count} Std.`, + count => `vor ${count} Tagen`, + (branch, sha) => `Branch ${branch} · Commit ${sha}`, + }, + keys: { + title: 'API-Schlüssel', + noKeys: 'Keine API-Schlüssel konfiguriert.', + addKey: 'Schlüssel hinzufügen', + loading: 'Lade API-Schlüssel und Zugangsdaten…', + docs: 'Dokumentation', + openDocs: 'Anbieter-Dokumentation öffnen', + hideValue: 'Wert verbergen', + revealValue: 'Wert anzeigen', + set: 'Gesetzt', + notSet: 'Nicht gesetzt', + replace: 'Ersetzen', + replaceValue: 'Aktuellen Wert ersetzen', + enterValue: 'Wert eingeben', + saving: 'Speichern', + save: 'Speichern', + cancel: 'Abbrechen', + clearValue: 'Wert löschen', + (count, total) => `${count} von ${total} konfiguriert`, + (count, total) => `${count} von ${total} gesetzt`, + count => `${count} gesetzt`, + count => `${count} Schlüssel`, + otherProviders: 'Andere Anbieter', + categoryTools: 'Tools', + categoryMessaging: 'Messaging', + categorySettings: 'Einstellungen', + openProviderDocs: 'Anbieter-Dokumentation öffnen', + showAdvanced: 'Erweitert anzeigen', + loadFailed: 'API-Schlüssel konnten nicht geladen werden', + credentialSaved: 'Zugangsdaten gespeichert', + credentialRemoved: 'Zugangsdaten entfernt', + }, + config: { + title: 'Konfiguration', + edit: 'Konfiguration bearbeiten', + reload: 'Konfiguration neu laden', + notSet: 'Nicht gesetzt', + commaSeparated: 'kommagetrennte Werte', + on: 'An', + off: 'Aus', + none: 'Keine', + emptyOption: '(keine)', + loading: 'Lade Hermes-Konfiguration…', + noMatching: 'Keine passenden Einstellungen', + noMatchingDesc: 'Versuche einen anderen Suchbegriff oder wähle einen anderen Bereich.', + count => `${count} Ergebnis`, + count => `${count} Ergebnisse`, + saving: 'Speichere…', + label: { + defaultModel: 'Standardmodell', + contextWindow: 'Kontextfenster', + fallbackModels: 'Fallback-Modelle', + enabledToolsets: 'Aktivierte Toolsets', + timezone: 'Zeitzone', + personality: 'Persönlichkeit', + reasoningBlocks: 'Reasoning-Blöcke', + maxAgentSteps: 'Max. Agent-Schritte', + imageAttachments: 'Bildanhänge', + workingDirectory: 'Arbeitsverzeichnis', + executionBackend: 'Ausführungs-Backend', + commandTimeout: 'Befehls-Timeout', + persistentShell: 'Persistente Shell', + envPassthrough: 'Umgebungsvariablen-Durchleitung', + fileReadLimit: 'Datei-Lese-Limit', + terminalOutputLimit: 'Terminal-Ausgabe-Limit', + filePageLimit: 'Datei-Seiten-Limit', + lineLengthLimit: 'Zeilenlängen-Limit', + codeExecutionMode: 'Code-Ausführungsmodus', + approvalMode: 'Genehmigungsmodus', + approvalTimeout: 'Genehmigungs-Timeout', + confirmMcpReloads: 'MCP-Neuladen bestätigen', + commandAllowlist: 'Befehls-Allowlist', + redactSecrets: 'Geheimnisse schwärzen', + allowPrivateUrls: 'Private URLs erlauben', + browserPrivateUrls: 'Browser für private URLs', + localBrowserForPrivateUrls: 'Lokaler Browser für private URLs', + fileCheckpoints: 'Datei-Checkpoints', + checkpointLimit: 'Checkpoint-Limit', + voiceShortcut: 'Sprach-Shortcut', + maxRecordingLength: 'Max. Aufnahmelänge', + readResponsesAloud: 'Antworten vorlesen', + speechToText: 'Sprache-zu-Text', + speechToTextProvider: 'Sprache-zu-Text-Anbieter', + localTranscriptionModel: 'Lokales Transkriptionsmodell', + transcriptionLanguage: 'Transkriptionssprache', + elevenlabsSttModel: 'ElevenLabs-STT-Modell', + elevenlabsLanguage: 'ElevenLabs-Sprache', + tagAudioEvents: 'Audio-Ereignisse taggen', + speakerDiarization: 'Sprecher-Diarisierung', + textToSpeechProvider: 'Text-zu-Sprache-Anbieter', + edgeVoice: 'Edge-Stimme', + openaiTtsModel: 'OpenAI-TTS-Modell', + openaiVoice: 'OpenAI-Stimme', + elevenlabsVoice: 'ElevenLabs-Stimme', + elevenlabsModel: 'ElevenLabs-Modell', + persistentMemory: 'Persistenter Speicher', + userProfile: 'Benutzerprofil', + memoryBudget: 'Speicher-Budget', + profileBudget: 'Profil-Budget', + memoryProvider: 'Speicher-Anbieter', + contextEngine: 'Kontext-Engine', + autoCompression: 'Auto-Kompression', + compressionThreshold: 'Kompressions-Schwelle', + compressionTarget: 'Kompressions-Ziel', + protectedRecentMessages: 'Geschützte aktuelle Nachrichten', + apiRetries: 'API-Wiederholungen', + serviceTier: 'Service-Stufe', + toolUseEnforcement: 'Tool-Nutzungs-Erzwingung', + subagentModel: 'Subagent-Modell', + subagentProvider: 'Subagent-Anbieter', + subagentTurnLimit: 'Subagent-Turn-Limit', + parallelSubagents: 'Parallele Subagents', + subagentTimeout: 'Subagent-Timeout', + subagentReasoningEffort: 'Subagent-Reasoning-Aufwand', + }, + desc: { + defaultModel: 'Wird für neue Chats verwendet, es sei denn, du wählst ein anderes Modell im Composer.', + contextWindow: 'Auf 0 lassen, um das erkannte Kontextfenster des ausgewählten Modells zu verwenden.', + fallbackModels: 'Backup-Anbieter:Modell-Einträge, die versucht werden, wenn das Standardmodell ausfällt.', + personality: 'Standard-Assistentenstil für neue Sitzungen.', + timezone: 'Wird verwendet, wenn Hermes lokalen Zeitkontext benötigt. Leer lassen für System-Zeitzone.', + reasoningBlocks: 'Reasoning-Abschnitte anzeigen, wenn das Backend sie bereitstellt.', + imageAttachments: 'Steuert, wie Bildanhänge an das Modell gesendet werden.', + workingDirectory: 'Standard-Projektordner für Tool- und Terminal-Arbeit.', + codeExecutionMode: 'Wie strikt die Code-Ausführung auf das aktuelle Projekt beschränkt ist.', + persistentShell: 'Shell-Zustand zwischen Befehlen beibehalten, wenn das Backend dies unterstützt.', + envPassthrough: 'Umgebungsvariablen, die an die Tool-Ausführung durchgereicht werden.', + fileReadLimit: 'Maximale Zeichen, die Hermes aus einer Dateianfrage lesen kann.', + approvalMode: 'Wie Hermes Befehle behandelt, die explizite Genehmigung erfordern.', + approvalTimeout: 'Wie lange Genehmigungsaufforderungen warten, bevor sie ablaufen.', + redactSecrets: 'Erkannte Geheimnisse nach Möglichkeit vor modellsichtbaren Inhalten verbergen.', + fileCheckpoints: 'Rollback-Snapshots vor Dateibearbeitungen erstellen.', + persistentMemory: 'Dauerhafte Erinnerungen speichern, die zukünftigen Sitzungen helfen können.', + userProfile: 'Ein kompaktes Profil der Benutzereinstellungen pflegen.', + contextEngine: 'Strategie zur Verwaltung langer Unterhaltungen nahe dem Kontextlimit.', + autoCompression: 'Älteren Kontext zusammenfassen, wenn Unterhaltungen groß werden.', + readResponsesAloud: 'Assistentenantworten automatisch vorlesen.', + speechToText: 'Lokale oder anbieter-gestützte Sprach-Transkription aktivieren.', + elevenlabsLanguage: 'Optionaler ISO-639-3-Sprachcode. Leer lassen für Auto-Erkennung durch ElevenLabs.', + maxAgentSteps: 'Obergrenze für Tool-Aufruf-Turns, bevor Hermes einen Lauf stoppt.', + }, + }, + gateway: { + title: 'Gateway', + start: 'Gateway starten', + stop: 'Gateway stoppen', + restart: 'Gateway neustarten', + running: 'Läuft', + stopped: 'Gestoppt', + loading: 'Lade Gateway-Einstellungen…', + unavailable: 'Gateway-Einstellungen nicht verfügbar', + unavailableDesc: 'Die Desktop-IPC-Brücke stellt keine Gateway-Einstellungen bereit.', + connection: 'Gateway-Verbindung', + envOverride: 'env-Override', + desc: 'Hermes Desktop startet standardmäßig ein eigenes lokales Gateway. Verwende ein Remote-Gateway, wenn diese App ein bereits laufendes Hermes-Backend auf einem anderen Rechner oder hinter einem vertrauenswürdigen Proxy steuern soll.', + envOverrideTitle: 'Umgebungsvariablen steuern diese Desktop-Sitzung.', + (urlVar, tokenVar) => `Entferne ${urlVar} und ${tokenVar}, um die gespeicherte Einstellung unten zu verwenden.`, + localTitle: 'Lokales Gateway', + localDesc: 'Starte ein privates Hermes-Backend auf localhost. Dies ist die Standardeinstellung und funktioniert offline.', + remoteTitle: 'Remote-Gateway', + remoteDesc: 'Verbinde diese Desktop-Oberfläche mit einem entfernten Hermes-Backend über dessen Sitzungs-Token.', + remoteUrl: 'Remote-URL', + remoteUrlDesc: 'Basis-URL für das Remote-Dashboard-Backend. Pfad-Präfixe werden unterstützt, z.B. /hermes.', + remoteUrlPlaceholder: 'https://gateway.example.com/hermes', + sessionToken: 'Sitzungs-Token', + sessionTokenDesc: 'Der Dashboard-Sitzungs-Token für REST- und WebSocket-Zugriff. Leer lassen, um den gespeicherten Token beizubehalten.', + sessionTokenPlaceholder: 'Sitzungs-Token einfügen', + preview => `Vorhandener Token ${preview}`, + tokenSaved: 'gespeichert', + testRemote: 'Remote testen', + saveRestart: 'Für nächsten Neustart speichern', + saveReconnect: 'Speichern und neu verbinden', + diagnostics: 'Diagnose', + diagnosticsDesc: 'desktop.log im Dateimanager anzeigen – nützlich, wenn das Gateway nicht startet.', + openLogs: 'Logs öffnen', + connected: 'Verbunden', + connecting: 'Verbinde', + disconnected: 'Getrennt', + inferenceReady: 'Inferenz bereit', + inferenceNotReady: 'Inferenz nicht bereit', + checkingInference: 'Prüfe Inferenz', + openSystemPanel: 'System-Panel öffnen', + connectionLabel: 'Verbindung:', + recentActivity: 'Aktuelle Aktivität', + viewAllLogs: 'Alle Logs anzeigen →', + messagingPlatforms: 'Messaging-Plattformen', + label: 'Gateway', + inferenceStatus: 'Gateway-Inferenzstatus', + enterUrlFirst: 'Gib zuerst eine Remote-URL und einen Sitzungs-Token ein, bevor du wechselst', + enterUrlFirstTest: 'Gib zuerst eine Remote-URL und einen Sitzungs-Token ein, bevor du testest', + }, + sessions: { + title: 'Sitzungen', + search: 'Sitzungen durchsuchen…', + noResults: 'Keine Sitzungen gefunden.', + export: 'Exportieren', + delete: 'Sitzung löschen', + loading: 'Lädt…', + defaultProjectDir: 'Standard-Projektverzeichnis', + defaultProjectDirDesc: 'Neue Sitzungen starten in diesem Ordner, sofern du keinen anderen wählst. Leer lassen, um dein Home-Verzeichnis zu verwenden.', + fallback => `Standard: ${fallback}.`, + notSet: 'Nicht gesetzt', + change: 'Ändern', + choose: 'Auswählen', + clear: 'Löschen', + archivedTitle: 'Archivierte Sitzungen', + archivedDesc: 'Archivierte Chats sind in der Seitenleiste ausgeblendet, behalten aber alle Nachrichten. Strg/⌘-Klick auf einen Chat in der Seitenleiste, um ihn zu archivieren.', + nothingArchived: 'Nichts archiviert', + noSearchMatch: 'Keine archivierten Chats entsprechen deiner Suche.', + archiveToHide: 'Archiviere einen Chat, um ihn hier auszublenden.', + unarchive: 'Archivierung aufheben', + deletePermanently: 'Endgültig löschen', + count => `${count} Nachrichten`, + new: 'Neue Sitzung', + running: 'Sitzung läuft', + actions: 'Sitzungsaktionen', + reorder: 'Neu anordnen', + pin: 'Anheften', + unpin: 'Lösen', + copyId: 'ID kopieren', + rename: 'Umbenennen', + archive: 'Archivieren', + renameDialog: 'Sitzung umbenennen', + renameDesc: 'Gib diesem Chat einen einprägsamen Titel. Leer lassen zum Löschen.', + untitled: 'Unbenannte Sitzung', + renamed: 'Umbenannt', + renameFailed: 'Umbenennung fehlgeschlagen', + pinned: 'Angeheftet', + results: 'Ergebnisse', + allPinned: 'Alles hier ist angeheftet. Löse einen Chat, um ihn in den letzten anzuzeigen.', + pinHint: 'Shift-Klick auf einen Chat zum Anheften · Ziehen zum Neuanordnen', + loadMore: 'Mehr laden', + noWorkspace: 'Kein Arbeitsbereich', + ungroup: 'Sitzungen als einzelne Liste anzeigen', + groupByWorkspace: 'Sitzungen nach Arbeitsbereich gruppieren', + loadStep: 'Laden', + moreLabel: 'mehr', + nothingArchivedTitle: 'Nichts archiviert', + deletePermanentlyTitle: 'Endgültig löschen', + defaultProjectDirTitle: 'Standard-Projektverzeichnis', + loadingArchived: 'Lade archivierte Sitzungen…', + restored: 'Wiederhergestellt', + projectDirUpdated: 'Standard-Projektverzeichnis aktualisiert', + loadFailed: 'Archivierte Sitzungen konnten nicht geladen werden', + unarchiveFailed: 'Archivierung aufheben fehlgeschlagen', + deleteFailed: 'Löschen fehlgeschlagen', + archiveHint: 'Archiviere einen Chat, um ihn hier auszublenden.', + updateDirFailed: 'Standardverzeichnis konnte nicht aktualisiert werden', + clearDirFailed: 'Standardverzeichnis konnte nicht gelöscht werden', + }, + mcp: { + title: 'MCP-Server', + addServer: 'Server hinzufügen', + noServers: 'Keine MCP-Server konfiguriert.', + loading: 'Lade MCP-Server…', + servers: 'MCP-Server', + count => `${count} konfiguriert`, + newServer: 'Neuer Server', + reloadMCP: 'MCP neu laden', + reloading: 'Lade neu...', + noServersDesc: 'Füge einen STDIO- oder HTTP-Server hinzu, um MCP-Tools bereitzustellen.', + name: 'Name', + namePlaceholder: 'dateisystem', + serverJSON: 'Server-JSON', + editServer: 'Server bearbeiten', + saveServer: 'Server speichern', + saving: 'Speichere...', + remove: 'Entfernen', + disabled: 'deaktiviert', + nameRequired: 'Name erforderlich', + nameRequiredDesc: 'Gib diesem MCP-Server einen Konfigurationsschlüssel.', + invalidJson: 'Server-Konfiguration muss ein JSON-Objekt sein', + invalidJsonDesc: 'Ungültiges MCP-JSON', + saved: 'MCP-Server gespeichert', + name => `${name} wird nach MCP-Neuladen wirksam.`, + saveFailed: 'Speichern fehlgeschlagen', + removeFailed: 'Entfernen fehlgeschlagen', + gatewayUnavailable: 'Gateway nicht verfügbar', + gatewayUnavailableDesc: 'Verbinde das Gateway erneut, bevor du MCP neu lädst.', + reloadedTitle: 'MCP-Tools neu geladen', + reloadedDesc: 'Neue Tool-Schemas gelten für neue Turns.', + reloadFailed: 'MCP-Neuladen fehlgeschlagen', + giveConfigKey: 'Gib diesem MCP-Server einen Konfigurationsschlüssel.', + reconnectGateway: 'Verbinde das Gateway erneut, bevor du MCP neu lädst.', + newSchemas: 'Neue Tool-Schemas gelten für neue Turns.', + loadingServers: 'Lade MCP-Server...', + serverName: 'Name', + serversTitle: 'MCP-Server', + noServersTitle: 'Keine MCP-Server', + failedToLoad: 'MCP-Konfiguration konnte nicht geladen werden', + invalidJsonShort: 'Ungültiges MCP-JSON', + serverSaved: 'MCP-Server gespeichert', + toolsReloaded: 'MCP-Tools neu geladen', + emptyDesc: 'Füge einen STDIO- oder HTTP-Server hinzu, um MCP-Tools bereitzustellen.', + }, + tools: { + title: 'Tools & Skills', + noTools: 'Keine Tools verfügbar.', + }, + nav: { + home: 'Start', + chat: 'Chat', + settings: 'Einstellungen', + files: 'Dateien', + terminal: 'Terminal', + }, + header: { + search: 'Suchen oder Befehl eingeben…', + }, + model: { + auxTask: { + vision: 'Vision', + visionHint: 'Bildanalyse', + web_extract: 'Web-Extrakt', + web_extractHint: 'Seitenzusammenfassung', + compression: 'Kompression', + compressionHint: 'Kontext-Verdichtung', + session_search: 'Sitzungssuche', + session_searchHint: 'Suchanfragen', + skills_hub: 'Skills-Hub', + skills_hubHint: 'Skill-Suche', + approval: 'Genehmigung', + approvalHint: 'Intelligente Auto-Genehmigung', + mcp: 'MCP', + mcpHint: 'MCP-Tool-Routing', + title_generation: 'Titelgenerierung', + title_generationHint: 'Sitzungstitel', + curator: 'Kurator', + curatorHint: 'Skill-Nutzungs-Überprüfung', + }, + mainModel: 'Hauptmodell', + mainDesc: 'Gilt für neue Sitzungen. Verwende die Modellauswahl im Composer, um das aktive Modell zu wechseln.', + providerPlaceholder: 'Anbieter', + modelPlaceholder: 'Modell', + apply: 'Anwenden', + applying: 'Wende an…', + auxiliaryModels: 'Hilfsmodelle', + auxiliaryDesc: 'Hilfsaufgaben laufen standardmäßig mit dem Hauptmodell. Weise einer Aufgabe ein eigenes Modell zu, um dies zu überschreiben.', + resetAllToMain: 'Alle auf Hauptmodell zurücksetzen', + setToMain: 'Auf Hauptmodell setzen', + change: 'Ändern', + cancel: 'Abbrechen', + autoUseMain: 'auto · Hauptmodell verwenden', + providerDefault: '(Anbieter-Standard)', + loading: 'Lade Modellkonfiguration…', + options: 'Optionen', + thinking: 'Nachdenken', + fast: 'Schnell', + effort: 'Aufwand', + noOptions: 'Keine Optionen für dieses Modell', + optionUpdateFailed: 'Modelloption-Update fehlgeschlagen', + fastModeUpdateFailed: 'Schnellmodus-Update fehlgeschlagen', + effortMinimal: 'Minimal', + effortLow: 'Niedrig', + effortMedium: 'Mittel', + effortHigh: 'Hoch', + effortMax: 'Maximal', + switch: 'Modell wechseln', + unknown: '(unbekannt)', + filterPlaceholder: 'Anbieter und Modelle filtern...', + persistGlobal: 'Global speichern', + persistGlobalSession: 'Global speichern (sonst nur diese Sitzung)', + couldNotLoad: 'Modelle konnten nicht geladen werden', + proLockedDesc: 'Pro-Modelle benötigen ein kostenpflichtiges Nous-Abonnement.', + priceTooltip: 'Eingabe-/Ausgabepreis pro Million Token', + freePrice: 'Kostenlos', + currentLabel: 'aktuell:', + addProviderBtn: 'Anbieter hinzufügen', + }, + updates: { + checking: 'Suche nach Updates…', + available: 'Update verfügbar', + downloading: 'Lade herunter…', + installing: 'Installiere…', + restart: 'Neustarten zum Aktualisieren', + stageGettingReady: 'Vorbereitung…', + stageDownloading: 'Herunterladen…', + stageAlmostThere: 'Fast geschafft…', + stageFinishingUp: 'Abschluss…', + stageRestarting: 'Starte Hermes neu…', + stageManual: 'Update über dein Terminal', + stageError: 'Update pausiert', + updatingHermes: 'Aktualisiere Hermes…', + lookingForUpdates: 'Suche nach Updates…', + couldntCheck: 'Konnte nicht nach Updates suchen', + updateNotAvailable: 'Update nicht verfügbar', + checkConnection: 'Überprüfe deine Verbindung und versuche es erneut.', + onLatest: 'Du verwendest die neueste Version.', + allSet: 'Alles bereit', + newUpdateAvailable: 'Neues Update verfügbar', + readyToInstall: 'Eine neue Version von Hermes ist zur Installation bereit.', + updateNow: 'Jetzt aktualisieren', + maybeLater: 'Vielleicht später', + count => `+ ${count} weitere Änderung enthalten.`, + count => `+ ${count} weitere Änderungen enthalten.`, + updateFromTerminal: 'Update über dein Terminal', + terminalDesc: 'Du hast Hermes von der Kommandozeile installiert, daher laufen Updates auch dort. Füge dies in dein Terminal ein:', + copied: 'Kopiert', + copy: 'Kopieren', + pickupNewVersion: 'Hermes übernimmt die neue Version beim nächsten Start.', + done: 'Fertig', + updaterDesc: 'Der Hermes-Updater übernimmt in einem eigenen Fenster und öffnet Hermes erneut, wenn er fertig ist.', + closeToApply: 'Hermes wird geschlossen, um das Update anzuwenden.', + updateDidntFinish: 'Update wurde nicht abgeschlossen', + nothingLost: 'Keine Sorge – nichts ist verloren. Du kannst es jetzt erneut versuchen.', + notNow: 'Nicht jetzt', + }, + errors: { + generic: 'Etwas ist schiefgelaufen.', + notFound: 'Seite nicht gefunden.', + noPermission: 'Du hast keine Berechtigung, darauf zuzugreifen.', + somethingBroke: 'Etwas ist in der Oberfläche kaputtgegangen', + viewCrashedDesc: 'Die Ansicht hat einen unerwarteten Fehler gefunden. Deine Chats und Einstellungen sind sicher – versuche es erneut oder lade das Fenster neu.', + noProviders: 'Keine authentifizierten Anbieter.', + }, + tool: { + toolCall: 'Tool-Aufruf', + result: 'Ergebnis', + error: 'Fehler', + timeout: 'Zeitüberschreitung', + cancelled: 'Abgebrochen', + running: 'Läuft', + recovered: 'Wiederhergestellt', + done: 'Fertig', + output: 'Tool-Ausgabe', + searchResults: 'Suchergebnisse', + rawResponse: 'Rohantwort', + stdout: 'Standardausgabe', + stderr: 'Standardfehlerausgabe', + copyActivity: 'Aktivität kopieren', + recoveredAfter: 'Nach 1 fehlgeschlagenen Schritt wiederhergestellt', + count => `Nach ${count} fehlgeschlagenen Schritten wiederhergestellt`, + oneStepFailed: '1 Schritt fehlgeschlagen', + count => `${count} Schritte fehlgeschlagen`, + }, + composer: { + startingHermes: 'Starte Hermes...', + sendFollowUp: 'Nachfrage senden', + message: 'Nachricht', + editingQueued: 'Bearbeite wartenden Turn im Composer', + attach: 'Anhängen', + files: 'Dateien…', + folder: 'Ordner…', + images: 'Bilder…', + pasteImage: 'Bild einfügen', + url: 'URL…', + promptSnippets: 'Prompt-Schnipsel', + promptSnippetsDesc: 'Wähle einen Starter-Prompt zum Einfügen in den Composer.', + voiceStart: 'Sprachunterhaltung starten', + queue: 'Nachricht in Warteschlange', + speaking: 'Spricht', + transcribing: 'Transkribiert', + muted: 'Stummgeschaltet', + listening: 'Hört zu', + unmuteMic: 'Mikrofon einschalten', + muteMic: 'Mikrofon stummschalten', + stopListening: 'Zuhören beenden und senden', + endVoice: 'Sprachunterhaltung beenden', + end: 'Beenden', + stopDictation: 'Diktat beenden', + transcribingDictation: 'Transkribiere Diktat', + voiceDictation: 'Sprachdiktat', + addContext: 'Kontext hinzufügen', + }, + models: { + title: 'Modelle', + search: 'Modelle durchsuchen', + addProvider: 'Anbieter hinzufügen…', + }, + install: { + title: 'Hermes benötigt eine einmalige Installation', + desc: 'Automatische Erstinstallation ist nicht verfügbar auf', + descEnd: 'noch. Öffne das Terminal und führe den folgenden Befehl aus, dann starte die App neu. Nachfolgende Starts überspringen diesen Schritt.', + installCommand: 'Installationsbefehl', + copyCommand: 'Befehl kopieren', + viewDocs: 'Installationsdokumentation anzeigen', + willInstallTo: 'Wird installiert nach', + iRanIt: 'Ich habe es ausgeführt – erneut versuchen', + failed: 'Installation fehlgeschlagen', + settingUp: 'Richte Hermes Agent ein', + finishingUp: 'Fertigstellung', + failedDesc: 'Einer der Installationsschritte ist fehlgeschlagen. Unter Windows kann das passieren, wenn eine andere Hermes-CLI- oder Desktop-Instanz läuft. Beende alle laufenden Hermes-Instanzen und versuche es erneut. Details unten oder im Desktop-Log für das vollständige Protokoll.', + setupDesc: 'Dies ist eine einmalige Einrichtung. Der Hermes-Installer lädt Abhängigkeiten herunter und konfiguriert deinen Rechner. Nachfolgende Starts überspringen diesen Schritt.', + fetchingManifest: 'Lade Installations-Manifest...', + error: 'Fehler', + showOutput: 'Installer-Ausgabe anzeigen', + hideOutput: 'Installer-Ausgabe ausblenden', + noOutput: 'Noch keine Ausgabe.', + cancelInstall: 'Installation abbrechen', + cancelling: 'Breche ab...', + copyOutput: 'Ausgabe kopieren', + copied: 'Kopiert!', + reloadRetry: 'Neu laden und erneut versuchen', + saveLogs: 'Vollständiges Protokoll gespeichert unter', + stepsComplete: 'Schritte abgeschlossen', + nowLabel: 'jetzt', + line: 'Zeile', + lines: 'Zeilen', + }, + previewConsole: { + resizeLabel: 'Vorschau-Konsole skalieren', + noMessages: 'Noch keine Konsolen-Nachrichten.', + }, + boot: { + ipcUnavailable: 'Desktop-IPC-Brücke ist nicht verfügbar.', + backendExited: 'Hermes-Hintergrundprozess wurde während des Starts beendet.', + backendStoppedTitle: 'Backend gestoppt', + backendStoppedMessage: 'Hermes-Hintergrundprozess wurde beendet.', + startingConnection: 'Starte Desktop-Verbindung', + connectingGateway: 'Verbinde Live-Desktop-Gateway', + loadingConfig: 'Lade Hermes-Einstellungen', + loadingSessions: 'Lade letzte Sitzungen', + desktopBootFailed: 'Desktop-Start fehlgeschlagen', + couldNotStart: 'Hermes konnte nicht starten', + recoveryDesc: 'Das Hintergrund-Gateway ist nicht gestartet. Versuche einen der Wiederherstellungsschritte unten – nichts hier löscht deine Chats oder Einstellungen.', + retry: 'Wiederholen', + repairInstall: 'Installation reparieren', + useLocalGateway: 'Lokales Gateway verwenden', + openLogs: 'Logs öffnen', + repairHint: 'Reparieren führt den Installer erneut aus und kann auf einem frischen Rechner einige Minuten dauern.', + showLogs: 'Aktuelle Logs anzeigen', + hideLogs: 'Aktuelle Logs ausblenden', + }, + urlDialog: { + title: 'URL anhängen', + description: 'Hermes ruft die Seite ab und fügt sie als Kontext für diesen Turn hinzu.', + placeholder: 'https://example.com/post', + hint: 'Gib die vollständige URL ein, z.B.', + attach: 'Anhängen', + }, + titlebar: { + hideSidebar: 'Seitenleiste ausblenden', + showSidebar: 'Seitenleiste anzeigen', + search: 'Suchen', + searchTitle: 'Sitzungen, Ansichten und Aktionen durchsuchen', + hideRightSidebar: 'Rechte Seitenleiste ausblenden', + showRightSidebar: 'Rechte Seitenleiste anzeigen', + unmuteHaptics: 'Haptik einschalten', + muteHaptics: 'Haptik ausschalten', + openSettings: 'Einstellungen öffnen', + profiles: 'Profile', + profilesDesc: 'Erweiterte Hermes-Umgebungen für separate Personas, Konfiguration, Skills und SOUL.md.', + manageProfiles: 'Profile verwalten', + language: 'Sprache', + languageDesc: 'Wähle eine Anzeigesprache für die Oberfläche.', + }, + pagination: { + ariaLabel: 'Seitennummerierung', + prevAria: 'Zur vorherigen Seite', + prev: 'Zurück', + nextAria: 'Zur nächsten Seite', + next: 'Weiter', + }, + bootstrap: { + pending: 'Ausstehend', + running: 'Installiere', + done: 'Fertig', + skipped: 'Übersprungen', + failed: 'Fehlgeschlagen', + }, + sidebar: { + sheetTitle: 'Seitenleiste', + sheetDesc: 'Zeigt die mobile Seitenleiste an.', + toggle: 'Seitenleiste umschalten', + }, + clarify: { + hermesIsAsking: 'Hermes fragt', + loadingQuestion: 'Lade Frage…', + otherTypeAnswer: 'Anderes (Antwort eingeben)', + placeholderAnswer: 'Antwort eingeben…', + cmdEnterToSend: '⌘/Strg + Enter zum Senden', + back: 'Zurück', + skip: 'Überspringen', + couldNotSend: 'Konnte Klärungsantwort nicht senden', + n => `1–${n} zum Auswählen`, + }, + intro: { + fallback1h: 'Was bewegen wir heute?', + fallback1b: 'Schick einen Bug, Branch, Plan oder eine grobe Idee. Ich schaue mir das Repo an und mache den nächsten konkreten Schritt daraus.', + fallback2h: 'Was beschäftigt dich?', + fallback2b: 'Bring den Code, die Frage oder den hängenden Teil. Ich lese die Lage, bevor ich Änderungen mache.', + fallback3h: 'Was soll Hermes sich ansehen?', + fallback3b: 'Schick die Aufgabe, den fehlerhaften Pfad oder den halbfertigen Plan. Ich helfe, es in die Tat umzusetzen.', + fallback4h: 'Wo sollen wir anfangen?', + fallback4b: 'Bring das Problem, Ziel oder die Datei. Ich schaue es mir zuerst an und halte den nächsten Schritt konkret.', + fallback5h: 'Was braucht Aufmerksamkeit?', + fallback5b: 'Schick den Kontext, den du hast. Ich helfe, ihn in einen Plan oder eine Lösung zu sortieren.', + personality: { + label => `${label}-Modus ist an. Woran sollen wir arbeiten?`, + body1: 'Schick die Aufgabe, Datei oder grobe Idee. Ich verwende deine konfigurierte Stimme und halte die Arbeit in diesem Repo verankert.', + label => `Was muss ${label} Hermes sehen?`, + body2: 'Bring den Kontext oder den hängenden Teil. Ich passe mich deiner konfigurierten Persönlichkeit an.', + label => `${label}-Modus ist bereit.`, + body3: 'Schick das Problem, die Datei oder Idee. Ich folge der von dir konfigurierten Persönlichkeit.', + label => `Was soll ${label} Hermes angehen?`, + body4: 'Wirf die Aufgabe hier rein. Ich halte die Arbeit im Repo verankert.', + heading5: 'Wo sollen wir beginnen?', + label => `Gib mir den Kontext und ich antworte im ${label}-Modus.`, + }, + brand: 'HERMES AGENT', + }, + artifacts: { + noArtifactsFound: 'Keine Artefakte gefunden', + }, + agents: { + spawnTree: 'Spawn-Baum', + liveSubagentActivity: 'Live-Subagent-Aktivität für den aktuellen Turn.', + noLiveSubagents: 'Keine Live-Subagents', + files: 'Dateien', + label: 'Agents', + open: 'Agents öffnen', + close: 'Agents schließen', + subagent: 'Subagent', + subagents: 'Subagents', + failed: 'fehlgeschlagen', + running: 'läuft', + }, + provider: { + desc: { + nousPortal: 'Nous Portal Basis-URL-Override', + openRouter: 'OpenRouter API-Schlüssel (für Vision, Web-Scraping-Helfer und MoA)', + google: 'Google AI Studio API-Schlüssel (auch als GEMINI_API_KEY erkannt)', + gemini: 'GCP-Projekt-ID für kostenpflichtige Gemini-Tiers (Free-Tier wird automatisch bereitgestellt)', + anthropic: 'Anthropic API-Schlüssel', + deepseek: 'Benutzerdefinierte DeepSeek API-Basis-URL (erweitert)', + xai: 'xAI Basis-URL-Override', + huggingface: 'Hugging Face Inference Providers Basis-URL-Override', + kimi: 'Kimi / Moonshot China API-Schlüssel', + minimax: 'MiniMax (China) Basis-URL-Override', + minimaxCn: 'MiniMax China API-Schlüssel', + dashscope: 'Benutzerdefinierte DashScope Basis-URL (Standard: coding-intl OpenAI-kompatibler Endpunkt)', + glm: 'GLM API-Schlüssel (Z.AI)', + nvidia: 'NVIDIA NIM Basis-URL-Override (z.B. http://localhost:8000/v1 für lokales NIM)', + opencodeGo: 'OpenCode Go API-Schlüssel', + opencodeZen: 'OpenCode Zen API-Schlüssel', + xiaomi: 'Xiaomi MiMo Basis-URL-Override (Standard: https://api.xiaomimimo.com/v1)', + kiloCode: 'Kilo Code API-Schlüssel', + aiGateway: 'AI Gateway API-Schlüssel (Vercel AI Gateway)', + browserbase: 'BROWSERBASE_API_KEY', + elevenLabs: 'ElevenLabs API-Schlüssel', + openai: 'OpenAI API-Schlüssel (für Sprachverarbeitung via Proxy)', + mistral: 'Mistral API-Schlüssel (für STT/TTS)', + groq: 'Groq API-Schlüssel (für STT)', + tavily: 'TAVILY_API_KEY', + firecrawl: 'Firecrawl API-URL für selbst gehostete Instanzen (optional)', + fal: 'FAL_KEY', + nous: 'Nous Portal Basis-URL-Override', + openrouter: 'OpenRouter API-Schlüssel (für Vision, Web-Scraping-Helfer und MoA)', + lmstudio: 'Z.AI / GLM Basis-URL-Override', + zai: 'Azure Foundry Basis-URL (über \'hermes model\' für endpunktspezifische Konfiguration setzen)', + stepfun: 'StepFun Step Plan Basis-URL-Override', + arcee: 'Arcee AI Basis-URL-Override', + gmi: 'GMI Cloud Basis-URL-Override', + qwenportal: 'Qwen Portal Basis-URL-Override (Standard: https://portal.qwen.ai/v1)', + opencodego: 'OpenCode Go Basis-URL-Override', + ollamacloud: 'Ollama Cloud Basis-URL-Override (Standard: https://ollama.com/v1)', + awsbedrock: 'AWS Named Profile für Bedrock-Authentifizierung (aus ~/.aws/credentials)', + exa: 'Exa API-Schlüssel für KI-native Websuche und Inhalte', + parallel: 'Parallel API-Schlüssel für KI-native Websuche und Extraktion', + }, + }, +} +) diff --git a/apps/desktop/src/i18n/es.ts b/apps/desktop/src/i18n/es.ts new file mode 100644 index 000000000000..61e31cc14986 --- /dev/null +++ b/apps/desktop/src/i18n/es.ts @@ -0,0 +1,953 @@ +import { defineLocale } from './define-locale' + +export const es = defineLocale( +{ + appearance: { + title: 'Apariencia', + description: 'Preferencias de visualización exclusivas del escritorio. El modo controla el brillo; el tema controla la paleta de acentos y el estilo de la superficie de chat.', + colorMode: 'Modo de color', + colorModeDesc: 'Elige un modo fijo o deja que Hermes siga la configuración de tu sistema.', + theme: { + nous: 'Nous', + nousDesc: 'Neutros cristal con acentos azul Nous', + midnight: 'Medianoche', + midnightDesc: 'Azul violeta profundo con acentos fríos', + ember: 'Ascua', + emberDesc: 'Carmesí cálido y bronce — ambiente de forja', + mono: 'Mono', + monoDesc: 'Escala de grises limpia — minimalista y enfocado', + cyberpunk: 'Cyberpunk', + cyberpunkDesc: 'Verde neón sobre negro — terminal matrix', + slate: 'Pizarra', + slateDesc: 'Azul pizarra frío — tema enfocado para desarrolladores', + }, + themeDesc: 'Elige una paleta de colores para la superficie de chat y los acentos de la interfaz.', + mode: { + light: 'Claro', + lightDesc: 'Superficies de escritorio brillantes', + dark: 'Oscuro', + darkDesc: 'Espacio de trabajo de bajo deslumbramiento', + system: 'Sistema', + systemDesc: 'Seguir la apariencia del SO', + }, + language: 'Idioma', + languageDesc: 'Elige el idioma de la interfaz o deja que Hermes siga la configuración de tu sistema.', + toolCallDisplay: 'Visualización de llamadas a herramientas', + toolCallDisplayDesc: 'Producto oculta los datos sin procesar de las herramientas; Técnico muestra entrada/salida completa.', + toolViewProduct: 'Producto', + toolViewTechnical: 'Técnico', + toolViewProductDesc: 'Actividad de herramientas amigable con resúmenes concisos.', + toolViewTechnicalDesc: 'Incluir argumentos/resultados sin procesar y detalles de bajo nivel.', + }, + settings: { + title: 'Configuración', + appearance: 'Apariencia', + model: 'Modelo', + gateway: 'Gateway', + sessions: 'Sesiones', + tools: 'Herramientas y skills', + section: { + chat: 'Chat', + workspace: 'Espacio de trabajo', + safety: 'Seguridad', + memory: 'Memoria y contexto', + voice: 'Voz', + advanced: 'Avanzado', + }, + mcp: 'Servidores MCP', + config: 'Configuración', + keys: 'Claves API', + about: 'Acerca de', + closeSettings: 'Cerrar configuración', + archivedChats: 'Chats archivados', + exportConfig: 'Exportar configuración', + importConfig: 'Importar configuración', + resetDefaults: 'Restablecer valores predeterminados', + llmProviders: 'Proveedores LLM', + searchPlaceholder: { + about: 'Acerca de Hermes Desktop', + config: 'Buscar ajustes…', + gateway: 'Conexión del Gateway…', + keys: 'Buscar claves API…', + mcp: 'Buscar servidores MCP…', + sessions: 'Buscar sesiones archivadas…', + }, + }, + chat: { + placeholder: 'Pregúntame lo que sea…', + send: 'Enviar', + stop: 'Detener', + thinking: 'Pensando…', + noSession: 'Sin sesión activa. Inicia una nueva conversación.', + loadingSession: 'Cargando sesión', + loadingResponse: 'Hermes está cargando una respuesta', + branchInNewChat: 'Ramificar en nuevo chat', + readAloud: 'Leer en voz alta', + preparingAudio: 'Preparando audio...', + stopReading: 'Dejar de leer', + editMessage: 'Editar mensaje', + editableCheckpoint: 'Punto de control editable', + restoreCheckpoint: 'Restaurar punto de control', + goForward: 'Avanzar', + restorePrevCheckpoint: 'Restaurar punto de control anterior', + restoreNextCheckpoint: 'Restaurar punto de control siguiente', + composerTip: 'Consejo: escribe @ para referenciar archivos en línea.', + reconnecting: 'Reconectando con Hermes…', + }, + commandCenter: { + title: 'Centro de mando', + noSessions: 'Aún no hay sesiones.', + loadingStatus: 'Cargando estado…', + recentLogs: 'Registros recientes', + dailyTokens: 'Tokens diarios', + noActivity: 'Sin actividad diaria.', + noModelUsage: 'Aún no hay uso de modelos.', + noSkillActivity: 'Aún no hay actividad de skills.', + sessionsPanel: 'Panel de sesiones', + systemPanel: 'Panel del sistema', + usagePanel: 'Panel de uso', + navigate: 'Navegar', + noMatchingResults: 'No se encontraron resultados coincidentes.', + noSessionsYet: 'Aún no hay sesiones.', + unpinSession: 'Desfijar sesión', + pinSession: 'Fijar sesión', + exportSession: 'Exportar sesión', + deleteSession: 'Eliminar sesión', + gatewayRunning: 'Gateway de mensajería en ejecución', + gatewayStopped: 'Gateway de mensajería detenido', + restartMsg: 'Reiniciar mensajería', + updateHermes: 'Actualizar Hermes', + noLogsLoaded: 'Aún no se han cargado registros.', + closeLabel: 'Cerrar centro de mando', + searchPlaceholder: 'Buscar sesiones, vistas y acciones', + statSessions: 'Sesiones', + statApiCalls: 'Llamadas API', + statTokens: 'Tokens entrada/salida', + statEstCost: 'Coste est.', + cost => `real ${cost}`, + loadingUsage: 'Cargando uso...', + count => `Sin uso en los últimos ${count} días.`, + retry: 'Reintentar', + tokenInput: 'entrada', + tokenOutput: 'salida', + noDailyActivity: 'Sin actividad diaria.', + topModels: 'Modelos principales', + topSkills: 'Skills principales', + actionsLabel: 'acciones', + systemRunning: 'en ejecución', + systemDone: 'hecho', + systemFailed: 'fallido', + open: 'Abrir centro de mando', + close: 'Cerrar centro de mando', + }, + common: { + loading: 'Cargando…', + save: 'Guardar', + cancel: 'Cancelar', + close: 'Cerrar', + delete: 'Eliminar', + confirm: 'Confirmar', + search: 'Buscar…', + clearSearch: 'Limpiar búsqueda', + copy: 'Copiar', + refresh: 'Actualizar', + moreActions: 'Más acciones', + tryAgain: 'Intentar de nuevo', + }, + onboarding: { + welcome: 'Bienvenido a Hermes', + getStarted: 'Comienza eligiendo un proveedor y un modelo.', + skip: 'Saltar', + continue: 'Continuar', + finish: 'Finalizar', + setupTitle: 'Vamos a configurar Hermes Agent', + setupDesc: 'Conecta un proveedor de modelos para empezar a chatear. La mayoría de opciones son con un solo clic.', + preparing: 'Iniciando Hermes…', + installing: 'Hermes está terminando la instalación. Esto suele tardar menos de un minuto en la primera ejecución.', + lookingUp: 'Buscando proveedores...', + otherProviders: 'Otros proveedores', + collapse: 'Contraer', + iHaveKey: 'Tengo una clave API', + recommended: 'Recomendado', + connected: 'Conectado', + backToSignIn: 'Volver a inicio de sesión', + getKey: 'Obtener clave', + pasteKey: 'Pegar clave API', + connect: 'Conectar', + connecting: 'Conectando', + copyCode: 'Copiar', + startSignIn: 'Iniciando sesión para', + verifyingCode: 'Verificando tu código con', + pickingModel: 'conectado. Eligiendo un modelo predeterminado...', + signInFailed: 'Error al iniciar sesión. Inténtalo de nuevo.', + pickDifferent: 'Elegir otro proveedor', + signInTitle: 'Iniciar sesión con', + step1: 'Hemos abierto', + step1End: 'en tu navegador.', + step2: 'Autoriza a Hermes allí.', + step3: 'Copia el código de autorización y pégalo abajo.', + pasteCode: 'Pegar código de autorización', + reopenAuth: 'Reabrir página de autorización', + cancel: 'Cancelar', + browserDesc: 'Hemos abierto', + browserDescEnd: 'en tu navegador. Autoriza a Hermes allí y te conectarás automáticamente — sin copiar ni pegar nada.', + waitingAuth: 'Esperando a que autorices...', + reopenSignIn: 'Reabrir página de inicio de sesión', + externalDesc: 'inicia sesión a través de su propia CLI. Ejecuta este comando en una terminal, luego vuelve y elige "Ya he iniciado sesión":', + iSignedIn: 'Ya he iniciado sesión', + enterCode: 'Hemos abierto', + enterCodeEnd: 'en tu navegador. Introduce este código allí:', + reopenVerification: 'Reabrir página de verificación', + defaultModel: 'Modelo predeterminado', + freeTier: 'Nivel gratuito', + pro: 'Pro', + change: 'Cambiar', + startChatting: 'Empezar a chatear', + docs: 'docs', + close: 'Cerrar', + savingError: 'No se pudo guardar la credencial.', + openRouter: 'OpenRouter', + }, + file: { + browser: 'Explorador de archivos', + noFiles: 'Aún no hay archivos.', + }, + terminal: { + title: 'Terminal', + newTab: 'Nueva pestaña', + closeTab: 'Cerrar pestaña', + }, + skills: { + title: 'Skills', + search: 'Buscar skills…', + noResults: 'No se encontraron skills.', + tools: 'Skills y herramientas', + }, + profiles: { + title: 'Perfiles', + noProfilesYet: 'Aún no hay perfiles.', + selectProfile: 'Selecciona un perfil para ver sus detalles.', + deleteProfile: '¿Eliminar perfil?', + soulMd: 'SOUL.md', + unsavedChanges: 'Cambios sin guardar', + newProfile: 'Nuevo perfil', + cloneFromDefault: 'Clonar desde predeterminado', + renameProfile: 'Renombrar perfil', + }, + cron: { + title: 'Tareas Cron', + noJobs: 'Sin tareas programadas.', + deleteCronJob: '¿Eliminar tarea cron?', + optional: 'Opcional', + label: 'Cron', + open: 'Abrir tareas cron', + }, + messaging: { + title: 'Mensajería', + recommended: 'Recomendado', + recommendedTelegram: 'Recomendado. IDs numéricos separados por comas de @userinfobot. Sin esto, cualquiera puede enviar MD a tu bot.', + recommendedDiscord: 'Recomendado. IDs de usuario de Discord separados por comas.', + recommendedSlack: 'Recomendado. IDs de usuario de Slack separados por comas.', + recommendedMattermost: 'Recomendado. IDs de usuario de Mattermost separados por comas.', + recommendedMatrix: 'Recomendado. IDs de usuario separados por comas en formato @usuario:servidor.', + recommendedSignal: 'Recomendado. Identificadores de Signal separados por comas.', + recommendedWhatsApp: 'Recomendado. Números de teléfono o IDs de WhatsApp separados por comas.', + gatewayStopped: 'Gateway de mensajería detenido', + getCredentials: 'Obtén tus credenciales', + required: 'Obligatorio', + unsavedChanges: 'Cambios sin guardar', + saved: 'Guardado', + }, + about: { + version: 'Versión', + checkUpdates: 'Buscar actualizaciones', + upToDate: 'Hermes está actualizado.', + updateAvailable: 'Hay una actualización disponible.', + license: 'Licencia MIT', + hermesDesktop: 'Hermes Desktop', + versionUnavailable: 'Versión no disponible', + updates: 'Actualizaciones', + checkNow: 'Comprobar ahora', + checking: 'Comprobando…', + seeWhatsNew: 'Ver novedades', + releaseNotes: 'Notas de la versión', + autoUpdates: 'Actualizaciones automáticas', + autoUpdatesDesc: 'Hermes busca actualizaciones automáticamente en segundo plano y te avisa cuando hay una disponible.', + selfUpdateUnsupported: 'Esta versión no puede actualizarse desde dentro de la aplicación.', + cannotReachServer: 'No pudimos contactar con el servidor de actualizaciones.', + installingUpdate: 'Se está instalando una actualización.', + count => `Hay una nueva actualización lista (${count} cambio incluido).`, + count => `Hay una nueva actualización lista (${count} cambios incluidos).`, + onLatest: 'Estás en la última versión.', + tapCheckNow: 'Pulsa "Comprobar ahora" para buscar actualizaciones.', + time => `Última comprobación ${time}`, + justNow: 'justo ahora', + never: 'nunca', + count => `hace ${count} min`, + count => `hace ${count} horas`, + count => `hace ${count} días`, + (branch, sha) => `Rama ${branch} · Commit ${sha}`, + }, + keys: { + title: 'Claves API', + noKeys: 'No hay claves API configuradas.', + addKey: 'Añadir clave', + loading: 'Cargando claves API y credenciales…', + docs: 'Docs', + openDocs: 'Abrir documentación del proveedor', + hideValue: 'Ocultar valor', + revealValue: 'Mostrar valor', + set: 'Establecer', + notSet: 'No establecido', + replace: 'Reemplazar', + replaceValue: 'Reemplazar valor actual', + enterValue: 'Introducir valor', + saving: 'Guardando', + save: 'Guardar', + cancel: 'Cancelar', + clearValue: 'Limpiar valor', + (count, total) => `${count} de ${total} configuradas`, + (count, total) => `${count} de ${total} establecidas`, + count => `${count} establecidas`, + count => `${count} claves`, + otherProviders: 'Otros proveedores', + categoryTools: 'Herramientas', + categoryMessaging: 'Mensajería', + categorySettings: 'Configuración', + openProviderDocs: 'Abrir documentación del proveedor', + showAdvanced: 'Mostrar avanzado', + loadFailed: 'Error al cargar las claves API', + credentialSaved: 'Credencial guardada', + credentialRemoved: 'Credencial eliminada', + }, + config: { + title: 'Configuración', + edit: 'Editar configuración', + reload: 'Recargar configuración', + notSet: 'No establecido', + commaSeparated: 'valores separados por comas', + on: 'Activado', + off: 'Desactivado', + none: 'Ninguno', + emptyOption: '(ninguno)', + loading: 'Cargando configuración de Hermes…', + noMatching: 'Sin ajustes coincidentes', + noMatchingDesc: 'Prueba con otro término de búsqueda o elige otra sección.', + count => `${count} resultado`, + count => `${count} resultados`, + saving: 'Guardando…', + label: { + defaultModel: 'Modelo predeterminado', + contextWindow: 'Ventana de contexto', + fallbackModels: 'Modelos de respaldo', + enabledToolsets: 'Conjuntos de herramientas activados', + timezone: 'Zona horaria', + personality: 'Personalidad', + reasoningBlocks: 'Bloques de razonamiento', + maxAgentSteps: 'Pasos máx. del agente', + imageAttachments: 'Adjuntos de imagen', + workingDirectory: 'Directorio de trabajo', + executionBackend: 'Backend de ejecución', + commandTimeout: 'Tiempo de espera de comandos', + persistentShell: 'Shell persistente', + envPassthrough: 'Paso de variables de entorno', + fileReadLimit: 'Límite de lectura de archivos', + terminalOutputLimit: 'Límite de salida de terminal', + filePageLimit: 'Límite de página de archivo', + lineLengthLimit: 'Límite de longitud de línea', + codeExecutionMode: 'Modo de ejecución de código', + approvalMode: 'Modo de aprobación', + approvalTimeout: 'Tiempo de espera de aprobación', + confirmMcpReloads: 'Confirmar recargas MCP', + commandAllowlist: 'Lista blanca de comandos', + redactSecrets: 'Ocultar secretos', + allowPrivateUrls: 'Permitir URLs privadas', + browserPrivateUrls: 'URLs privadas del navegador', + localBrowserForPrivateUrls: 'Navegador local para URLs privadas', + fileCheckpoints: 'Puntos de control de archivos', + checkpointLimit: 'Límite de puntos de control', + voiceShortcut: 'Atajo de voz', + maxRecordingLength: 'Duración máx. de grabación', + readResponsesAloud: 'Leer respuestas en voz alta', + speechToText: 'Voz a texto', + speechToTextProvider: 'Proveedor de voz a texto', + localTranscriptionModel: 'Modelo de transcripción local', + transcriptionLanguage: 'Idioma de transcripción', + elevenlabsSttModel: 'Modelo STT de ElevenLabs', + elevenlabsLanguage: 'Idioma de ElevenLabs', + tagAudioEvents: 'Etiquetar eventos de audio', + speakerDiarization: 'Diarización de hablantes', + textToSpeechProvider: 'Proveedor de texto a voz', + edgeVoice: 'Voz de Edge', + openaiTtsModel: 'Modelo TTS de OpenAI', + openaiVoice: 'Voz de OpenAI', + elevenlabsVoice: 'Voz de ElevenLabs', + elevenlabsModel: 'Modelo de ElevenLabs', + persistentMemory: 'Memoria persistente', + userProfile: 'Perfil de usuario', + memoryBudget: 'Presupuesto de memoria', + profileBudget: 'Presupuesto de perfil', + memoryProvider: 'Proveedor de memoria', + contextEngine: 'Motor de contexto', + autoCompression: 'Compresión automática', + compressionThreshold: 'Umbral de compresión', + compressionTarget: 'Objetivo de compresión', + protectedRecentMessages: 'Mensajes recientes protegidos', + apiRetries: 'Reintentos de API', + serviceTier: 'Nivel de servicio', + toolUseEnforcement: 'Obligación de uso de herramientas', + subagentModel: 'Modelo de subagente', + subagentProvider: 'Proveedor de subagente', + subagentTurnLimit: 'Límite de turnos de subagente', + parallelSubagents: 'Subagentes paralelos', + subagentTimeout: 'Tiempo de espera de subagente', + subagentReasoningEffort: 'Esfuerzo de razonamiento del subagente', + }, + desc: { + defaultModel: 'Usado para nuevos chats a menos que elijas otro modelo en el compositor.', + contextWindow: 'Deja en 0 para usar la ventana de contexto detectada del modelo seleccionado.', + fallbackModels: 'Entradas proveedor:modelo de respaldo a probar si el modelo predeterminado falla.', + personality: 'Estilo de asistente predeterminado para nuevas sesiones.', + timezone: 'Usado cuando Hermes necesita contexto de hora local. En blanco usa la zona horaria del sistema.', + reasoningBlocks: 'Mostrar secciones de razonamiento cuando el backend las proporcione.', + imageAttachments: 'Controla cómo se envían los adjuntos de imagen al modelo.', + workingDirectory: 'Carpeta de proyecto predeterminada para trabajo con herramientas y terminal.', + codeExecutionMode: 'Con qué rigor se limita la ejecución de código al proyecto actual.', + persistentShell: 'Mantener el estado del shell entre comandos cuando el backend lo soporte.', + envPassthrough: 'Variables de entorno a pasar a la ejecución de herramientas.', + fileReadLimit: 'Máximo de caracteres que Hermes puede leer de una solicitud de archivo.', + approvalMode: 'Cómo maneja Hermes los comandos que necesitan aprobación explícita.', + approvalTimeout: 'Cuánto tiempo esperan las solicitudes de aprobación antes de agotarse.', + redactSecrets: 'Ocultar secretos detectados del contenido visible para el modelo cuando sea posible.', + fileCheckpoints: 'Crear instantáneas de reversión antes de editar archivos.', + persistentMemory: 'Guardar recuerdos duraderos que puedan ayudar en futuras sesiones.', + userProfile: 'Mantener un perfil compacto de preferencias de usuario.', + contextEngine: 'Estrategia para gestionar conversaciones largas cerca del límite de contexto.', + autoCompression: 'Resumir contexto antiguo cuando las conversaciones crecen mucho.', + readResponsesAloud: 'Leer automáticamente las respuestas del asistente en voz alta.', + speechToText: 'Activar transcripción de voz local o mediante proveedor.', + elevenlabsLanguage: 'Código de idioma ISO-639-3 opcional. En blanco deja que ElevenLabs lo detecte automáticamente.', + maxAgentSteps: 'Límite superior de turnos de llamadas a herramientas antes de que Hermes detenga una ejecución.', + }, + }, + gateway: { + title: 'Gateway', + start: 'Iniciar Gateway', + stop: 'Detener Gateway', + restart: 'Reiniciar Gateway', + running: 'En ejecución', + stopped: 'Detenido', + loading: 'Cargando configuración del Gateway…', + unavailable: 'Configuración del Gateway no disponible', + unavailableDesc: 'El puente IPC de escritorio no expone la configuración del Gateway.', + connection: 'Conexión del Gateway', + envOverride: 'anulación por variable de entorno', + desc: 'Hermes Desktop inicia su propio Gateway local por defecto. Usa un Gateway remoto cuando quieras que esta app controle un backend de Hermes ya en ejecución en otra máquina o detrás de un proxy de confianza.', + envOverrideTitle: 'Las variables de entorno están controlando esta sesión de escritorio.', + (urlVar, tokenVar) => `Desactiva ${urlVar} y ${tokenVar} para usar la configuración guardada abajo.`, + localTitle: 'Gateway local', + localDesc: 'Inicia un backend privado de Hermes en localhost. Es la opción por defecto y funciona sin conexión.', + remoteTitle: 'Gateway remoto', + remoteDesc: 'Conecta este shell de escritorio a un backend remoto de Hermes usando su token de sesión.', + remoteUrl: 'URL remota', + remoteUrlDesc: 'URL base del backend del panel remoto. Se admiten prefijos de ruta, por ejemplo /hermes.', + remoteUrlPlaceholder: 'https://gateway.ejemplo.com/hermes', + sessionToken: 'Token de sesión', + sessionTokenDesc: 'Token de sesión del panel usado para acceso REST y WebSocket. Déjalo en blanco para conservar el token guardado.', + sessionTokenPlaceholder: 'Pega el token de sesión', + preview => `Token existente ${preview}`, + tokenSaved: 'guardado', + testRemote: 'Probar remoto', + saveRestart: 'Guardar para el próximo reinicio', + saveReconnect: 'Guardar y reconectar', + diagnostics: 'Diagnóstico', + diagnosticsDesc: 'Mostrar desktop.log en tu gestor de archivos — útil cuando el Gateway no puede iniciarse.', + openLogs: 'Abrir registros', + connected: 'Conectado', + connecting: 'Conectando', + disconnected: 'Desconectado', + inferenceReady: 'Inferencia lista', + inferenceNotReady: 'Inferencia no lista', + checkingInference: 'Comprobando inferencia', + openSystemPanel: 'Abrir panel del sistema', + connectionLabel: 'Conexión:', + recentActivity: 'Actividad reciente', + viewAllLogs: 'Ver todos los registros →', + messagingPlatforms: 'Plataformas de mensajería', + label: 'Gateway', + inferenceStatus: 'Estado de inferencia del Gateway', + enterUrlFirst: 'Introduce una URL remota y un token de sesión antes de cambiar', + enterUrlFirstTest: 'Introduce una URL remota y un token de sesión antes de probar', + }, + sessions: { + title: 'Sesiones', + search: 'Buscar sesiones…', + noResults: 'No se encontraron sesiones.', + export: 'Exportar', + delete: 'Eliminar sesión', + loading: 'Cargando…', + defaultProjectDir: 'Directorio de proyecto predeterminado', + defaultProjectDirDesc: 'Las sesiones nuevas comienzan en esta carpeta a menos que elijas otra. Déjalo sin configurar para usar tu directorio personal.', + fallback => `Por defecto ${fallback}.`, + notSet: 'No establecido', + change: 'Cambiar', + choose: 'Elegir', + clear: 'Limpiar', + archivedTitle: 'Sesiones archivadas', + archivedDesc: 'Los chats archivados se ocultan de la barra lateral pero conservan todos sus mensajes. Haz Ctrl/⌘-clic en un chat de la barra lateral para archivarlo.', + nothingArchived: 'Nada archivado', + noSearchMatch: 'Ningún chat archivado coincide con tu búsqueda.', + archiveToHide: 'Archiva un chat para ocultarlo aquí.', + unarchive: 'Desarchivar', + deletePermanently: 'Eliminar permanentemente', + count => `${count} mensajes`, + new: 'Nueva sesión', + running: 'Sesión en curso', + actions: 'Acciones de sesión', + reorder: 'Reordenar', + pin: 'Fijar', + unpin: 'Desfijar', + copyId: 'Copiar ID', + rename: 'Renombrar', + archive: 'Archivar', + renameDialog: 'Renombrar sesión', + renameDesc: 'Dale a este chat un título fácil de recordar. Déjalo vacío para limpiar.', + untitled: 'Sesión sin título', + renamed: 'Renombrada', + renameFailed: 'Error al renombrar', + pinned: 'Fijada', + results: 'Resultados', + allPinned: 'Todo aquí está fijado. Desfija un chat para mostrarlo en recientes.', + pinHint: 'Mayús-clic para fijar un chat · arrastra para reordenar', + loadMore: 'Cargar más', + noWorkspace: 'Sin espacio de trabajo', + ungroup: 'Mostrar sesiones como lista única', + groupByWorkspace: 'Agrupar sesiones por espacio de trabajo', + loadStep: 'Cargar', + moreLabel: 'más', + nothingArchivedTitle: 'Nada archivado', + deletePermanentlyTitle: 'Eliminar permanentemente', + defaultProjectDirTitle: 'Directorio de proyecto predeterminado', + loadingArchived: 'Cargando sesiones archivadas…', + restored: 'Restaurada', + projectDirUpdated: 'Directorio de proyecto predeterminado actualizado', + loadFailed: 'No se pudieron cargar las sesiones archivadas', + unarchiveFailed: 'Error al desarchivar', + deleteFailed: 'Error al eliminar', + archiveHint: 'Archiva un chat para ocultarlo aquí.', + updateDirFailed: 'No se pudo actualizar el directorio predeterminado', + clearDirFailed: 'No se pudo limpiar el directorio predeterminado', + }, + mcp: { + title: 'Servidores MCP', + addServer: 'Añadir servidor', + noServers: 'No hay servidores MCP configurados.', + loading: 'Cargando servidores MCP…', + servers: 'Servidores MCP', + count => `${count} configurados`, + newServer: 'Nuevo servidor', + reloadMCP: 'Recargar MCP', + reloading: 'Recargando...', + noServersDesc: 'Añade un servidor STDIO o HTTP para exponer herramientas MCP.', + name: 'Nombre', + namePlaceholder: 'sistema-de-archivos', + serverJSON: 'JSON del servidor', + editServer: 'Editar servidor', + saveServer: 'Guardar servidor', + saving: 'Guardando...', + remove: 'Eliminar', + disabled: 'desactivado', + nameRequired: 'Nombre obligatorio', + nameRequiredDesc: 'Asigna una clave de configuración a este servidor MCP.', + invalidJson: 'La configuración del servidor debe ser un objeto JSON', + invalidJsonDesc: 'JSON MCP no válido', + saved: 'Servidor MCP guardado', + name => `${name} se aplica después de recargar MCP.`, + saveFailed: 'Error al guardar', + removeFailed: 'Error al eliminar', + gatewayUnavailable: 'Gateway no disponible', + gatewayUnavailableDesc: 'Reconecta el Gateway antes de recargar MCP.', + reloadedTitle: 'Herramientas MCP recargadas', + reloadedDesc: 'Los nuevos esquemas de herramientas se aplican a nuevos turnos.', + reloadFailed: 'Error al recargar MCP', + giveConfigKey: 'Asigna una clave de configuración a este servidor MCP.', + reconnectGateway: 'Reconecta el Gateway antes de recargar MCP.', + newSchemas: 'Los nuevos esquemas de herramientas se aplican a nuevos turnos.', + loadingServers: 'Cargando servidores MCP...', + serverName: 'Nombre', + serversTitle: 'Servidores MCP', + noServersTitle: 'Sin servidores MCP', + failedToLoad: 'Error al cargar la configuración MCP', + invalidJsonShort: 'JSON MCP no válido', + serverSaved: 'Servidor MCP guardado', + toolsReloaded: 'Herramientas MCP recargadas', + emptyDesc: 'Añade un servidor STDIO o HTTP para exponer herramientas MCP.', + }, + tools: { + title: 'Herramientas y skills', + noTools: 'No hay herramientas disponibles.', + }, + nav: { + home: 'Inicio', + chat: 'Chat', + settings: 'Configuración', + files: 'Archivos', + terminal: 'Terminal', + }, + header: { + search: 'Buscar o escribir un comando…', + }, + model: { + auxTask: { + vision: 'Visión', + visionHint: 'Análisis de imágenes', + web_extract: 'Extracción web', + web_extractHint: 'Resumen de páginas', + compression: 'Compresión', + compressionHint: 'Compactación de contexto', + session_search: 'Búsqueda de sesiones', + session_searchHint: 'Consultas de recuperación', + skills_hub: 'Hub de skills', + skills_hubHint: 'Búsqueda de skills', + approval: 'Aprobación', + approvalHint: 'Auto-aprobación inteligente', + mcp: 'MCP', + mcpHint: 'Enrutamiento de herramientas MCP', + title_generation: 'Generación de títulos', + title_generationHint: 'Títulos de sesión', + curator: 'Curador', + curatorHint: 'Revisión de uso de skills', + }, + mainModel: 'Modelo principal', + mainDesc: 'Se aplica a sesiones nuevas. Usa el selector de modelos en el compositor para cambiar el chat activo sobre la marcha.', + providerPlaceholder: 'Proveedor', + modelPlaceholder: 'Modelo', + apply: 'Aplicar', + applying: 'Aplicando…', + auxiliaryModels: 'Modelos auxiliares', + auxiliaryDesc: 'Las tareas auxiliares se ejecutan en el modelo principal por defecto. Asigna un modelo dedicado a cualquier tarea para anularlo.', + resetAllToMain: 'Restablecer todo al principal', + setToMain: 'Usar modelo principal', + change: 'Cambiar', + cancel: 'Cancelar', + autoUseMain: 'auto · usar modelo principal', + providerDefault: '(predeterminado del proveedor)', + loading: 'Cargando configuración del modelo…', + options: 'Opciones', + thinking: 'Pensamiento', + fast: 'Rápido', + effort: 'Esfuerzo', + noOptions: 'Sin opciones para este modelo', + optionUpdateFailed: 'Error al actualizar la opción del modelo', + fastModeUpdateFailed: 'Error al actualizar el modo rápido', + effortMinimal: 'Mínimo', + effortLow: 'Bajo', + effortMedium: 'Medio', + effortHigh: 'Alto', + effortMax: 'Máximo', + switch: 'Cambiar modelo', + unknown: '(desconocido)', + filterPlaceholder: 'Filtrar proveedores y modelos...', + persistGlobal: 'Persistir globalmente', + persistGlobalSession: 'Persistir globalmente (de lo contrario solo esta sesión)', + couldNotLoad: 'No se pudieron cargar los modelos', + proLockedDesc: 'Los modelos Pro requieren una suscripción de pago de Nous.', + priceTooltip: 'Precio de entrada/salida por millón de tokens', + freePrice: 'Gratis', + currentLabel: 'actual:', + addProviderBtn: 'Añadir proveedor', + }, + updates: { + checking: 'Buscando actualizaciones…', + available: 'Actualización disponible', + downloading: 'Descargando…', + installing: 'Instalando…', + restart: 'Reiniciar para actualizar', + stageGettingReady: 'Preparando…', + stageDownloading: 'Descargando…', + stageAlmostThere: 'Ya casi…', + stageFinishingUp: 'Terminando…', + stageRestarting: 'Reiniciando Hermes…', + stageManual: 'Actualizar desde tu terminal', + stageError: 'Actualización pausada', + updatingHermes: 'Actualizando Hermes…', + lookingForUpdates: 'Buscando actualizaciones…', + couldntCheck: 'No se pudo buscar actualizaciones', + updateNotAvailable: 'Actualización no disponible', + checkConnection: 'Comprueba tu conexión e inténtalo de nuevo.', + onLatest: 'Estás ejecutando la última versión.', + allSet: 'Todo listo', + newUpdateAvailable: 'Nueva actualización disponible', + readyToInstall: 'Una nueva versión de Hermes está lista para instalar.', + updateNow: 'Actualizar ahora', + maybeLater: 'Quizás más tarde', + count => `+ ${count} cambio más incluido.`, + count => `+ ${count} cambios más incluidos.`, + updateFromTerminal: 'Actualizar desde tu terminal', + terminalDesc: 'Instalaste Hermes desde la línea de comandos, así que las actualizaciones también se ejecutan allí. Pega esto en tu terminal:', + copied: 'Copiado', + copy: 'Copiar', + pickupNewVersion: 'Hermes detectará la nueva versión la próxima vez que lo inicies.', + done: 'Hecho', + updaterDesc: 'El actualizador de Hermes tomará el control en su propia ventana y reabrirá Hermes cuando termine.', + closeToApply: 'Hermes se cerrará para aplicar la actualización.', + updateDidntFinish: 'La actualización no terminó', + nothingLost: 'No te preocupes — no se ha perdido nada. Puedes intentarlo de nuevo ahora.', + notNow: 'Ahora no', + }, + errors: { + generic: 'Algo salió mal.', + notFound: 'Página no encontrada.', + noPermission: 'No tienes permiso para acceder a esto.', + somethingBroke: 'Algo se rompió en la interfaz', + viewCrashedDesc: 'La vista encontró un error inesperado. Tus chats y configuraciones están a salvo — inténtalo de nuevo o recarga la ventana.', + noProviders: 'No hay proveedores autenticados.', + }, + tool: { + toolCall: 'Llamada a herramienta', + result: 'Resultado', + error: 'Error', + timeout: 'Tiempo agotado', + cancelled: 'Cancelado', + running: 'En ejecución', + recovered: 'Recuperado', + done: 'Hecho', + output: 'Salida de la herramienta', + searchResults: 'Resultados de búsqueda', + rawResponse: 'Respuesta sin procesar', + stdout: 'salida estándar', + stderr: 'error estándar', + copyActivity: 'Copiar actividad', + recoveredAfter: 'Recuperado después de 1 paso fallido', + count => `Recuperado después de ${count} pasos fallidos`, + oneStepFailed: '1 paso fallido', + count => `${count} pasos fallidos`, + }, + composer: { + startingHermes: 'Iniciando Hermes...', + sendFollowUp: 'Enviar seguimiento', + message: 'Mensaje', + editingQueued: 'Editando turno en cola en el compositor', + attach: 'Adjuntar', + files: 'Archivos…', + folder: 'Carpeta…', + images: 'Imágenes…', + pasteImage: 'Pegar imagen', + url: 'URL…', + promptSnippets: 'Fragmentos de prompt', + promptSnippetsDesc: 'Elige un prompt de inicio para colocarlo en el compositor.', + voiceStart: 'Iniciar conversación por voz', + queue: 'Poner en cola', + speaking: 'Hablando', + transcribing: 'Transcribiendo', + muted: 'Silenciado', + listening: 'Escuchando', + unmuteMic: 'Activar micrófono', + muteMic: 'Silenciar micrófono', + stopListening: 'Dejar de escuchar y enviar', + endVoice: 'Finalizar conversación por voz', + end: 'Finalizar', + stopDictation: 'Detener dictado', + transcribingDictation: 'Transcribiendo dictado', + voiceDictation: 'Dictado por voz', + addContext: 'Añadir contexto', + }, + models: { + title: 'Modelos', + search: 'Buscar modelos', + addProvider: 'Añadir proveedor…', + }, + install: { + title: 'Hermes necesita una instalación única', + desc: 'La instalación automática de primer inicio no está disponible en', + descEnd: 'todavía. Abre Terminal y ejecuta el comando de abajo, luego vuelve a iniciar esta aplicación. Los siguientes inicios omitirán este paso.', + installCommand: 'Comando de instalación', + copyCommand: 'Copiar comando', + viewDocs: 'Ver documentación de instalación', + willInstallTo: 'Se instalará en', + iRanIt: 'Ya lo ejecuté -- reintentar', + failed: 'Instalación fallida', + settingUp: 'Configurando Hermes Agent', + finishingUp: 'Terminando', + failedDesc: 'Uno de los pasos de instalación falló. En Windows, esto puede ocurrir si otra instancia de Hermes CLI o de escritorio está en ejecución. Detén todas las instancias de Hermes en ejecución y reintenta. Revisa los detalles abajo o el registro de escritorio para ver la transcripción completa.', + setupDesc: 'Esta es una configuración única. El instalador de Hermes está descargando dependencias y configurando tu máquina. Los siguientes inicios omitirán este paso.', + fetchingManifest: 'Obteniendo manifiesto del instalador...', + error: 'Error', + showOutput: 'Mostrar salida del instalador', + hideOutput: 'Ocultar salida del instalador', + noOutput: 'Aún no hay salida.', + cancelInstall: 'Cancelar instalación', + cancelling: 'Cancelando...', + copyOutput: 'Copiar salida', + copied: '¡Copiado!', + reloadRetry: 'Recargar y reintentar', + saveLogs: 'Transcripción completa guardada en', + stepsComplete: 'pasos completados', + nowLabel: 'ahora', + line: 'línea', + lines: 'líneas', + }, + previewConsole: { + resizeLabel: 'Redimensionar consola de vista previa', + noMessages: 'Aún no hay mensajes en la consola.', + }, + boot: { + ipcUnavailable: 'El puente IPC de escritorio no está disponible.', + backendExited: 'El proceso en segundo plano de Hermes terminó durante el inicio.', + backendStoppedTitle: 'Backend detenido', + backendStoppedMessage: 'El proceso en segundo plano de Hermes terminó.', + startingConnection: 'Iniciando conexión de escritorio', + connectingGateway: 'Conectando Gateway de escritorio en vivo', + loadingConfig: 'Cargando configuración de Hermes', + loadingSessions: 'Cargando sesiones recientes', + desktopBootFailed: 'Error al iniciar el escritorio', + couldNotStart: 'Hermes no pudo iniciarse', + recoveryDesc: 'El Gateway en segundo plano no se inició. Prueba uno de los pasos de recuperación de abajo — nada de esto elimina tus chats o configuraciones.', + retry: 'Reintentar', + repairInstall: 'Reparar instalación', + useLocalGateway: 'Usar Gateway local', + openLogs: 'Abrir registros', + repairHint: 'La reparación vuelve a ejecutar el instalador y puede tardar unos minutos en una máquina nueva.', + showLogs: 'Mostrar registros recientes', + hideLogs: 'Ocultar registros recientes', + }, + urlDialog: { + title: 'Adjuntar una URL', + description: 'Hermes obtendrá la página y la incluirá como contexto para este turno.', + placeholder: 'https://ejemplo.com/articulo', + hint: 'Incluye la URL completa, p.ej.', + attach: 'Adjuntar', + }, + titlebar: { + hideSidebar: 'Ocultar barra lateral', + showSidebar: 'Mostrar barra lateral', + search: 'Buscar', + searchTitle: 'Buscar sesiones, vistas y acciones', + hideRightSidebar: 'Ocultar barra lateral derecha', + showRightSidebar: 'Mostrar barra lateral derecha', + unmuteHaptics: 'Activar hápticos', + muteHaptics: 'Silenciar hápticos', + openSettings: 'Abrir configuración', + profiles: 'Perfiles', + profilesDesc: 'Entornos avanzados de Hermes para personas, configuración, skills y SOUL.md separados.', + manageProfiles: 'Gestionar perfiles', + language: 'Idioma', + languageDesc: 'Elige un idioma para la interfaz.', + }, + pagination: { + ariaLabel: 'paginación', + prevAria: 'Ir a la página anterior', + prev: 'Anterior', + nextAria: 'Ir a la página siguiente', + next: 'Siguiente', + }, + bootstrap: { + pending: 'Pendiente', + running: 'Instalando', + done: 'Hecho', + skipped: 'Omitido', + failed: 'Fallido', + }, + sidebar: { + sheetTitle: 'Barra lateral', + sheetDesc: 'Muestra la barra lateral en móvil.', + toggle: 'Alternar barra lateral', + }, + clarify: { + hermesIsAsking: 'Hermes está preguntando', + loadingQuestion: 'Cargando pregunta…', + otherTypeAnswer: 'Otro (escribe tu respuesta)', + placeholderAnswer: 'Escribe tu respuesta…', + cmdEnterToSend: '⌘/Ctrl + Enter para enviar', + back: 'Atrás', + skip: 'Saltar', + couldNotSend: 'No se pudo enviar la respuesta de aclaración', + n => `1–${n} para elegir`, + }, + intro: { + fallback1h: '¿Qué vamos a mover hoy?', + fallback1b: 'Envía un bug, rama, plan o idea aproximada. Inspeccionaré el repositorio y lo convertiré en el siguiente paso concreto.', + fallback2h: '¿Qué tienes en mente?', + fallback2b: 'Trae el código, la pregunta o la parte bloqueada. Leeré la situación antes de hacer cambios.', + fallback3h: '¿Qué debería mirar Hermes?', + fallback3b: 'Envía la tarea, la ruta fallida o el plan a medias. Te ayudaré a convertirlo en acción.', + fallback4h: '¿Por dónde empezamos?', + fallback4b: 'Trae el problema, el objetivo o el archivo. Inspeccionaré primero y mantendré el siguiente paso concreto.', + fallback5h: '¿Qué necesita atención?', + fallback5b: 'Envía el contexto que tengas. Te ayudaré a convertirlo en un plan o una solución.', + personality: { + label => `El modo ${label} está activado. ¿En qué deberíamos trabajar?`, + body1: 'Envía la tarea, archivo o idea aproximada. Usaré tu voz configurada y mantendré el trabajo basado en este repositorio.', + label => `¿Qué necesita ver ${label} Hermes?`, + body2: 'Trae el contexto o la parte bloqueada. Me adaptaré a tu personalidad configurada.', + label => `El modo ${label} está listo.`, + body3: 'Envía el problema, archivo o idea. Seguiré la personalidad que has configurado.', + label => `¿Qué debería abordar ${label} Hermes?`, + body4: 'Deja la tarea aquí. Mantendré el trabajo basado en el repositorio.', + heading5: '¿Por dónde comenzamos?', + label => `Dame el contexto y responderé en modo ${label}.`, + }, + brand: 'HERMES AGENT', + }, + artifacts: { + noArtifactsFound: 'No se encontraron artefactos', + }, + agents: { + spawnTree: 'Árbol de agentes', + liveSubagentActivity: 'Actividad en vivo de subagentes para el turno actual.', + noLiveSubagents: 'Sin subagentes activos', + files: 'Archivos', + label: 'Agentes', + open: 'Abrir agentes', + close: 'Cerrar agentes', + subagent: 'subagente', + subagents: 'subagentes', + failed: 'fallido', + running: 'en ejecución', + }, + provider: { + desc: { + nousPortal: 'Anulación de URL base del Portal Nous', + openRouter: 'Clave API de OpenRouter (para visión, ayudantes de extracción web y MoA)', + google: 'Clave API de Google AI Studio (también reconocida como GEMINI_API_KEY)', + gemini: 'ID de proyecto GCP para niveles Gemini de pago (el nivel gratuito se aprovisiona automáticamente)', + anthropic: 'Clave API de Anthropic', + deepseek: 'URL base personalizada de la API de DeepSeek (avanzado)', + xai: 'Anulación de URL base de xAI', + huggingface: 'Anulación de URL base de Hugging Face Inference Providers', + kimi: 'Clave API de Kimi / Moonshot China', + minimax: 'Anulación de URL base de MiniMax (China)', + minimaxCn: 'Clave API de MiniMax China', + dashscope: 'URL base personalizada de DashScope (predeterminado: endpoint compatible con OpenAI coding-intl)', + glm: 'Clave API de GLM (Z.AI)', + nvidia: 'Anulación de URL base de NVIDIA NIM (p.ej. http://localhost:8000/v1 para NIM local)', + opencodeGo: 'Clave API de OpenCode Go', + opencodeZen: 'Clave API de OpenCode Zen', + xiaomi: 'Anulación de URL base de Xiaomi MiMo (predeterminado: https://api.xiaomimimo.com/v1)', + kiloCode: 'Clave API de Kilo Code', + aiGateway: 'Clave API de AI Gateway (Vercel AI Gateway)', + browserbase: 'BROWSERBASE_API_KEY', + elevenLabs: 'Clave API de ElevenLabs', + openai: 'Clave API de OpenAI (para procesamiento de voz mediante proxy)', + mistral: 'Clave API de Mistral (para STT/TTS)', + groq: 'Clave API de Groq (para STT)', + tavily: 'TAVILY_API_KEY', + firecrawl: 'URL de API de Firecrawl para instancias autoalojadas (opcional)', + fal: 'FAL_KEY', + nous: 'Anulación de URL base del Portal Nous', + openrouter: 'Clave API de OpenRouter (para visión, ayudantes de extracción web y MoA)', + lmstudio: 'Anulación de URL base de Z.AI / GLM', + zai: 'URL base de Azure Foundry (configurar mediante \'hermes model\' para configuración específica de endpoint)', + stepfun: 'Anulación de URL base de StepFun Step Plan', + arcee: 'Anulación de URL base de Arcee AI', + gmi: 'Anulación de URL base de GMI Cloud', + qwenportal: 'Anulación de URL base de Qwen Portal (predeterminado: https://portal.qwen.ai/v1)', + opencodego: 'Anulación de URL base de OpenCode Go', + ollamacloud: 'Anulación de URL base de Ollama Cloud (predeterminado: https://ollama.com/v1)', + awsbedrock: 'Perfil nombrado de AWS para autenticación Bedrock (de ~/.aws/credentials)', + exa: 'Clave API de Exa para búsqueda web y contenidos con IA nativa', + parallel: 'Clave API de Parallel para búsqueda web y extracción con IA nativa', + }, + }, +} +) diff --git a/apps/desktop/src/i18n/fr.ts b/apps/desktop/src/i18n/fr.ts new file mode 100644 index 000000000000..6efde3cb2ab8 --- /dev/null +++ b/apps/desktop/src/i18n/fr.ts @@ -0,0 +1,953 @@ +import { defineLocale } from './define-locale' + +export const fr = defineLocale( +{ + appearance: { + title: 'Apparence', + description: 'Préférences d\'affichage propres au bureau. Le mode contrôle la luminosité ; le thème contrôle la palette d\'accent et le style de la surface de discussion.', + colorMode: 'Mode de couleur', + colorModeDesc: 'Choisis un mode fixe ou laisse Hermes suivre le réglage de ton système.', + theme: { + nous: 'Nous', + nousDesc: 'Neutres vitreux avec accents bleus Nous', + midnight: 'Minuit', + midnightDesc: 'Bleu-violet profond avec accents froids', + ember: 'Braise', + emberDesc: 'Cramoisi et bronze chauds — ambiance forge', + mono: 'Mono', + monoDesc: 'Niveaux de gris épurés — minimal et concentré', + cyberpunk: 'Cyberpunk', + cyberpunkDesc: 'Vert néon sur noir — terminal matrix', + slate: 'Ardoise', + slateDesc: 'Bleu ardoise froid — thème développeur concentré', + }, + themeDesc: 'Choisis une palette de couleurs pour la surface de discussion et les accents de l\'interface.', + mode: { + light: 'Clair', + lightDesc: 'Surfaces de bureau lumineuses', + dark: 'Sombre', + darkDesc: 'Espace de travail sans éblouissement', + system: 'Système', + systemDesc: 'Suivre l\'apparence du système', + }, + language: 'Langue', + languageDesc: 'Choisis la langue de l\'interface ou laisse Hermes suivre le réglage de ton système.', + toolCallDisplay: 'Affichage des appels d\'outils', + toolCallDisplayDesc: 'Produit masque les données brutes des outils ; Technique affiche tout.', + toolViewProduct: 'Produit', + toolViewTechnical: 'Technique', + toolViewProductDesc: 'Activité des outils lisible avec résumés concis.', + toolViewTechnicalDesc: 'Inclure les arguments/résultats bruts et les détails de bas niveau.', + }, + settings: { + title: 'Paramètres', + appearance: 'Apparence', + model: 'Modèle', + gateway: 'Passerelle', + sessions: 'Sessions', + tools: 'Outils & Skills', + section: { + chat: 'Discussion', + workspace: 'Espace de travail', + safety: 'Sécurité', + memory: 'Mémoire & Contexte', + voice: 'Voix', + advanced: 'Avancé', + }, + mcp: 'Serveurs MCP', + config: 'Configuration', + keys: 'Clés API', + about: 'À propos', + closeSettings: 'Fermer les paramètres', + archivedChats: 'Discussions archivées', + exportConfig: 'Exporter la configuration', + importConfig: 'Importer la configuration', + resetDefaults: 'Réinitialiser par défaut', + llmProviders: 'Fournisseurs LLM', + searchPlaceholder: { + about: 'À propos d\'Hermes Desktop', + config: 'Rechercher dans les paramètres…', + gateway: 'Connexion à la passerelle…', + keys: 'Rechercher des clés API…', + mcp: 'Rechercher des serveurs MCP…', + sessions: 'Rechercher des sessions archivées…', + }, + }, + chat: { + placeholder: 'Pose-moi une question…', + send: 'Envoyer', + stop: 'Arrêter', + thinking: 'Réflexion…', + noSession: 'Aucune session active. Lance une nouvelle conversation.', + loadingSession: 'Chargement de la session', + loadingResponse: 'Hermes charge une réponse', + branchInNewChat: 'Brancher dans une nouvelle discussion', + readAloud: 'Lire à voix haute', + preparingAudio: 'Préparation de l\'audio...', + stopReading: 'Arrêter la lecture', + editMessage: 'Modifier le message', + editableCheckpoint: 'Point de contrôle modifiable', + restoreCheckpoint: 'Restaurer le point de contrôle', + goForward: 'Avancer', + restorePrevCheckpoint: 'Restaurer le point de contrôle précédent', + restoreNextCheckpoint: 'Restaurer le point de contrôle suivant', + composerTip: 'Astuce : tape @ pour référencer des fichiers en ligne.', + reconnecting: 'Reconnexion à Hermes…', + }, + commandCenter: { + title: 'Centre de commande', + noSessions: 'Aucune session pour le moment.', + loadingStatus: 'Chargement du statut…', + recentLogs: 'Logs récents', + dailyTokens: 'Tokens quotidiens', + noActivity: 'Aucune activité quotidienne.', + noModelUsage: 'Aucune utilisation de modèle pour le moment.', + noSkillActivity: 'Aucune activité de skill pour le moment.', + sessionsPanel: 'Panneau des sessions', + systemPanel: 'Panneau système', + usagePanel: 'Panneau d\'utilisation', + navigate: 'Naviguer', + noMatchingResults: 'Aucun résultat correspondant trouvé.', + noSessionsYet: 'Aucune session pour le moment.', + unpinSession: 'Désépingler la session', + pinSession: 'Épingler la session', + exportSession: 'Exporter la session', + deleteSession: 'Supprimer la session', + gatewayRunning: 'Passerelle de messagerie en cours', + gatewayStopped: 'Passerelle de messagerie arrêtée', + restartMsg: 'Redémarrer la messagerie', + updateHermes: 'Mettre à jour Hermes', + noLogsLoaded: 'Aucun log chargé pour le moment.', + closeLabel: 'Fermer le centre de commande', + searchPlaceholder: 'Rechercher des sessions, vues et actions', + statSessions: 'Sessions', + statApiCalls: 'Appels API', + statTokens: 'Tokens entrée/sortie', + statEstCost: 'Coût estimé', + cost => `réel ${cost}`, + loadingUsage: 'Chargement de l\'utilisation...', + count => `Aucune utilisation dans les ${count} derniers jours.`, + retry: 'Réessayer', + tokenInput: 'entrée', + tokenOutput: 'sortie', + noDailyActivity: 'Aucune activité quotidienne.', + topModels: 'Modèles principaux', + topSkills: 'Skills principaux', + actionsLabel: 'actions', + systemRunning: 'en cours', + systemDone: 'terminé', + systemFailed: 'échoué', + open: 'Ouvrir le Centre de commande', + close: 'Fermer le Centre de commande', + }, + common: { + loading: 'Chargement…', + save: 'Enregistrer', + cancel: 'Annuler', + close: 'Fermer', + delete: 'Supprimer', + confirm: 'Confirmer', + search: 'Rechercher…', + clearSearch: 'Effacer la recherche', + copy: 'Copier', + refresh: 'Actualiser', + moreActions: 'Plus d\'actions', + tryAgain: 'Réessayer', + }, + onboarding: { + welcome: 'Bienvenue sur Hermes', + getStarted: 'Commence par choisir un fournisseur et un modèle.', + skip: 'Passer', + continue: 'Continuer', + finish: 'Terminer', + setupTitle: 'Configurons Hermes Agent ensemble', + setupDesc: 'Connecte un fournisseur de modèle pour commencer à discuter. La plupart des options se font en un clic.', + preparing: 'Démarrage d\'Hermes…', + installing: 'Hermes termine l\'installation. Cela prend généralement moins d\'une minute au premier lancement.', + lookingUp: 'Recherche des fournisseurs...', + otherProviders: 'Autres fournisseurs', + collapse: 'Réduire', + iHaveKey: 'J\'ai une clé API', + recommended: 'Recommandé', + connected: 'Connecté', + backToSignIn: 'Retour à la connexion', + getKey: 'Obtenir une clé', + pasteKey: 'Coller la clé API', + connect: 'Se connecter', + connecting: 'Connexion en cours', + copyCode: 'Copier', + startSignIn: 'Démarrage de la connexion pour', + verifyingCode: 'Vérification de ton code avec', + pickingModel: 'connecté. Sélection d\'un modèle par défaut...', + signInFailed: 'Échec de la connexion. Réessaie.', + pickDifferent: 'Choisir un autre fournisseur', + signInTitle: 'Se connecter avec', + step1: 'Nous avons ouvert', + step1End: 'dans ton navigateur.', + step2: 'Autorise Hermes sur cette page.', + step3: 'Copie le code d\'autorisation et colle-le ci-dessous.', + pasteCode: 'Coller le code d\'autorisation', + reopenAuth: 'Rouvrir la page d\'autorisation', + cancel: 'Annuler', + browserDesc: 'Nous avons ouvert', + browserDescEnd: 'dans ton navigateur. Autorise Hermes sur cette page et tu seras connecté automatiquement — rien à copier ni coller.', + waitingAuth: 'En attente de ton autorisation...', + reopenSignIn: 'Rouvrir la page de connexion', + externalDesc: 'se connecte via son propre CLI. Exécute cette commande dans un terminal, puis reviens et choisis « Je me suis connecté » :', + iSignedIn: 'Je me suis connecté', + enterCode: 'Nous avons ouvert', + enterCodeEnd: 'dans ton navigateur. Saisis ce code sur cette page :', + reopenVerification: 'Rouvrir la page de vérification', + defaultModel: 'Modèle par défaut', + freeTier: 'Niveau gratuit', + pro: 'Pro', + change: 'Modifier', + startChatting: 'Commencer à discuter', + docs: 'docs', + close: 'Fermer', + savingError: 'Impossible d\'enregistrer l\'identifiant.', + openRouter: 'OpenRouter', + }, + file: { + browser: 'Explorateur de fichiers', + noFiles: 'Aucun fichier pour le moment.', + }, + terminal: { + title: 'Terminal', + newTab: 'Nouvel onglet', + closeTab: 'Fermer l\'onglet', + }, + skills: { + title: 'Skills', + search: 'Rechercher des skills…', + noResults: 'Aucun skill trouvé.', + tools: 'Skills & Outils', + }, + profiles: { + title: 'Profils', + noProfilesYet: 'Aucun profil pour le moment.', + selectProfile: 'Sélectionne un profil pour voir ses détails.', + deleteProfile: 'Supprimer le profil ?', + soulMd: 'SOUL.md', + unsavedChanges: 'Modifications non enregistrées', + newProfile: 'Nouveau profil', + cloneFromDefault: 'Cloner depuis le profil par défaut', + renameProfile: 'Renommer le profil', + }, + cron: { + title: 'Tâches Cron', + noJobs: 'Aucune tâche planifiée.', + deleteCronJob: 'Supprimer la tâche cron ?', + optional: 'Optionnel', + label: 'Cron', + open: 'Ouvrir les tâches cron', + }, + messaging: { + title: 'Messagerie', + recommended: 'Recommandé', + recommendedTelegram: 'Recommandé. IDs numériques séparés par des virgules depuis @userinfobot. Sans cela, n\'importe qui peut DM ton bot.', + recommendedDiscord: 'Recommandé. IDs utilisateur Discord séparés par des virgules.', + recommendedSlack: 'Recommandé. IDs utilisateur Slack séparés par des virgules.', + recommendedMattermost: 'Recommandé. IDs utilisateur Mattermost séparés par des virgules.', + recommendedMatrix: 'Recommandé. IDs utilisateur séparés par des virgules au format @utilisateur:serveur.', + recommendedSignal: 'Recommandé. Identifiants Signal séparés par des virgules.', + recommendedWhatsApp: 'Recommandé. Numéros de téléphone ou IDs WhatsApp séparés par des virgules.', + gatewayStopped: 'Passerelle de messagerie arrêtée', + getCredentials: 'Obtenir tes identifiants', + required: 'Requis', + unsavedChanges: 'Modifications non enregistrées', + saved: 'Enregistré', + }, + about: { + version: 'Version', + checkUpdates: 'Vérifier les mises à jour', + upToDate: 'Hermes est à jour.', + updateAvailable: 'Une mise à jour est disponible.', + license: 'Licence MIT', + hermesDesktop: 'Hermes Desktop', + versionUnavailable: 'Version indisponible', + updates: 'Mises à jour', + checkNow: 'Vérifier maintenant', + checking: 'Vérification…', + seeWhatsNew: 'Voir les nouveautés', + releaseNotes: 'Notes de version', + autoUpdates: 'Mises à jour automatiques', + autoUpdatesDesc: 'Hermes vérifie les mises à jour automatiquement en arrière-plan et te prévient quand une mise à jour est prête.', + selfUpdateUnsupported: 'Cette version ne peut pas se mettre à jour depuis l\'application.', + cannotReachServer: 'Impossible de joindre le serveur de mises à jour.', + installingUpdate: 'Une mise à jour est en cours d\'installation.', + count => `Une nouvelle mise à jour est prête (${count} modification incluse).`, + count => `Une nouvelle mise à jour est prête (${count} modifications incluses).`, + onLatest: 'Tu utilises la dernière version.', + tapCheckNow: 'Clique sur « Vérifier maintenant » pour chercher des mises à jour.', + time => `Dernière vérification ${time}`, + justNow: 'à l\'instant', + never: 'jamais', + count => `il y a ${count} min`, + count => `il y a ${count} heures`, + count => `il y a ${count} jours`, + (branch, sha) => `Branche ${branch} · Commit ${sha}`, + }, + keys: { + title: 'Clés API', + noKeys: 'Aucune clé API configurée.', + addKey: 'Ajouter une clé', + loading: 'Chargement des clés API et identifiants…', + docs: 'Docs', + openDocs: 'Ouvrir la documentation du fournisseur', + hideValue: 'Masquer la valeur', + revealValue: 'Afficher la valeur', + set: 'Définie', + notSet: 'Non définie', + replace: 'Remplacer', + replaceValue: 'Remplacer la valeur actuelle', + enterValue: 'Saisir la valeur', + saving: 'Enregistrement', + save: 'Enregistrer', + cancel: 'Annuler', + clearValue: 'Effacer la valeur', + (count, total) => `${count} sur ${total} configurées`, + (count, total) => `${count} sur ${total} définies`, + count => `${count} définies`, + count => `${count} clés`, + otherProviders: 'Autres fournisseurs', + categoryTools: 'Outils', + categoryMessaging: 'Messagerie', + categorySettings: 'Paramètres', + openProviderDocs: 'Ouvrir la documentation du fournisseur', + showAdvanced: 'Afficher les options avancées', + loadFailed: 'Échec du chargement des clés API', + credentialSaved: 'Identifiant enregistré', + credentialRemoved: 'Identifiant supprimé', + }, + config: { + title: 'Configuration', + edit: 'Modifier la configuration', + reload: 'Recharger la configuration', + notSet: 'Non défini', + commaSeparated: 'valeurs séparées par des virgules', + on: 'Activé', + off: 'Désactivé', + none: 'Aucun', + emptyOption: '(aucun)', + loading: 'Chargement de la configuration Hermes…', + noMatching: 'Aucun paramètre correspondant', + noMatchingDesc: 'Essaie un autre terme de recherche ou choisis une autre section.', + count => `${count} résultat`, + count => `${count} résultats`, + saving: 'Enregistrement…', + label: { + defaultModel: 'Modèle par défaut', + contextWindow: 'Fenêtre de contexte', + fallbackModels: 'Modèles de secours', + enabledToolsets: 'Outils activés', + timezone: 'Fuseau horaire', + personality: 'Personnalité', + reasoningBlocks: 'Blocs de raisonnement', + maxAgentSteps: 'Étapes max de l\'agent', + imageAttachments: 'Pièces jointes image', + workingDirectory: 'Répertoire de travail', + executionBackend: 'Backend d\'exécution', + commandTimeout: 'Délai d\'expiration des commandes', + persistentShell: 'Shell persistant', + envPassthrough: 'Passage des variables d\'env', + fileReadLimit: 'Limite de lecture de fichier', + terminalOutputLimit: 'Limite de sortie du terminal', + filePageLimit: 'Limite de page de fichier', + lineLengthLimit: 'Limite de longueur de ligne', + codeExecutionMode: 'Mode d\'exécution de code', + approvalMode: 'Mode d\'approbation', + approvalTimeout: 'Délai d\'expiration d\'approbation', + confirmMcpReloads: 'Confirmer les rechargements MCP', + commandAllowlist: 'Liste blanche de commandes', + redactSecrets: 'Masquer les secrets', + allowPrivateUrls: 'Autoriser les URLs privées', + browserPrivateUrls: 'URLs privées du navigateur', + localBrowserForPrivateUrls: 'Navigateur local pour URLs privées', + fileCheckpoints: 'Points de contrôle de fichiers', + checkpointLimit: 'Limite de points de contrôle', + voiceShortcut: 'Raccourci vocal', + maxRecordingLength: 'Durée max d\'enregistrement', + readResponsesAloud: 'Lire les réponses à voix haute', + speechToText: 'Reconnaissance vocale', + speechToTextProvider: 'Fournisseur de reconnaissance vocale', + localTranscriptionModel: 'Modèle de transcription local', + transcriptionLanguage: 'Langue de transcription', + elevenlabsSttModel: 'Modèle STT ElevenLabs', + elevenlabsLanguage: 'Langue ElevenLabs', + tagAudioEvents: 'Baliser les événements audio', + speakerDiarization: 'Diarisation des locuteurs', + textToSpeechProvider: 'Fournisseur de synthèse vocale', + edgeVoice: 'Voix Edge', + openaiTtsModel: 'Modèle TTS OpenAI', + openaiVoice: 'Voix OpenAI', + elevenlabsVoice: 'Voix ElevenLabs', + elevenlabsModel: 'Modèle ElevenLabs', + persistentMemory: 'Mémoire persistante', + userProfile: 'Profil utilisateur', + memoryBudget: 'Budget mémoire', + profileBudget: 'Budget du profil', + memoryProvider: 'Fournisseur de mémoire', + contextEngine: 'Moteur de contexte', + autoCompression: 'Compression automatique', + compressionThreshold: 'Seuil de compression', + compressionTarget: 'Cible de compression', + protectedRecentMessages: 'Messages récents protégés', + apiRetries: 'Tentatives API', + serviceTier: 'Niveau de service', + toolUseEnforcement: 'Obligation d\'utilisation d\'outils', + subagentModel: 'Modèle des sous-agents', + subagentProvider: 'Fournisseur des sous-agents', + subagentTurnLimit: 'Limite de tours des sous-agents', + parallelSubagents: 'Sous-agents parallèles', + subagentTimeout: 'Délai d\'expiration des sous-agents', + subagentReasoningEffort: 'Effort de raisonnement des sous-agents', + }, + desc: { + defaultModel: 'Utilisé pour les nouvelles discussions sauf si tu choisis un autre modèle dans l\'éditeur.', + contextWindow: 'Laisser à 0 pour utiliser la fenêtre de contexte détectée du modèle sélectionné.', + fallbackModels: 'Entrées fournisseur:modèle de secours à essayer si le modèle par défaut échoue.', + personality: 'Style d\'assistant par défaut pour les nouvelles sessions.', + timezone: 'Utilisé quand Hermes a besoin de contexte de temps local. Vide utilise le fuseau horaire du système.', + reasoningBlocks: 'Afficher les sections de raisonnement quand le backend les fournit.', + imageAttachments: 'Contrôle comment les pièces jointes image sont envoyées au modèle.', + workingDirectory: 'Dossier de projet par défaut pour le travail des outils et du terminal.', + codeExecutionMode: 'À quel point l\'exécution de code est limitée au projet actuel.', + persistentShell: 'Conserver l\'état du shell entre les commandes quand le backend le supporte.', + envPassthrough: 'Variables d\'environnement à transmettre lors de l\'exécution des outils.', + fileReadLimit: 'Nombre maximum de caractères qu\'Hermes peut lire dans une seule demande de fichier.', + approvalMode: 'Comment Hermes gère les commandes qui nécessitent une approbation explicite.', + approvalTimeout: 'Durée d\'attente des demandes d\'approbation avant expiration.', + redactSecrets: 'Masquer les secrets détectés du contenu visible par le modèle lorsque c\'est possible.', + fileCheckpoints: 'Créer des sauvegardes de restauration avant les modifications de fichiers.', + persistentMemory: 'Enregistrer des souvenirs durables qui peuvent aider les sessions futures.', + userProfile: 'Maintenir un profil compact des préférences utilisateur.', + contextEngine: 'Stratégie pour gérer les longues conversations proches de la limite de contexte.', + autoCompression: 'Résumer le contexte plus ancien quand les conversations deviennent volumineuses.', + readResponsesAloud: 'Lire automatiquement les réponses de l\'assistant à voix haute.', + speechToText: 'Activer la transcription vocale locale ou via un fournisseur.', + elevenlabsLanguage: 'Code de langue ISO-639-3 optionnel. Vide laisse ElevenLabs détecter automatiquement.', + maxAgentSteps: 'Limite supérieure de tours d\'appel d\'outils avant qu\'Hermes n\'arrête une exécution.', + }, + }, + gateway: { + title: 'Passerelle', + start: 'Démarrer la passerelle', + stop: 'Arrêter la passerelle', + restart: 'Redémarrer la passerelle', + running: 'En cours', + stopped: 'Arrêtée', + loading: 'Chargement des paramètres de la passerelle…', + unavailable: 'Paramètres de la passerelle indisponibles', + unavailableDesc: 'Le pont IPC du bureau n\'expose pas les paramètres de la passerelle.', + connection: 'Connexion à la passerelle', + envOverride: 'surcharge par variable d\'env', + desc: 'Hermes Desktop démarre sa propre passerelle locale par défaut. Utilise une passerelle distante quand tu veux que cette application contrôle un backend Hermes déjà en cours d\'exécution sur une autre machine ou derrière un proxy de confiance.', + envOverrideTitle: 'Des variables d\'environnement contrôlent cette session bureau.', + (urlVar, tokenVar) => `Désactive ${urlVar} et ${tokenVar} pour utiliser le paramètre enregistré ci-dessous.`, + localTitle: 'Passerelle locale', + localDesc: 'Démarre un backend Hermes privé sur localhost. C\'est le mode par défaut et cela fonctionne hors ligne.', + remoteTitle: 'Passerelle distante', + remoteDesc: 'Connecte cette interface bureau à un backend Hermes distant en utilisant son jeton de session.', + remoteUrl: 'URL distante', + remoteUrlDesc: 'URL de base du backend du tableau de bord distant. Les préfixes de chemin sont supportés, par exemple /hermes.', + remoteUrlPlaceholder: 'https://passerelle.exemple.com/hermes', + sessionToken: 'Jeton de session', + sessionTokenDesc: 'Le jeton de session du tableau de bord utilisé pour l\'accès REST et WebSocket. Laisse vide pour conserver le jeton enregistré.', + sessionTokenPlaceholder: 'Coller le jeton de session', + preview => `Jeton existant ${preview}`, + tokenSaved: 'enregistré', + testRemote: 'Tester la connexion distante', + saveRestart: 'Enregistrer pour le prochain redémarrage', + saveReconnect: 'Enregistrer et reconnecter', + diagnostics: 'Diagnostics', + diagnosticsDesc: 'Affiche desktop.log dans ton gestionnaire de fichiers — utile quand la passerelle ne démarre pas.', + openLogs: 'Ouvrir les logs', + connected: 'Connecté', + connecting: 'Connexion en cours', + disconnected: 'Déconnecté', + inferenceReady: 'Inférence prête', + inferenceNotReady: 'Inférence non prête', + checkingInference: 'Vérification de l\'inférence', + openSystemPanel: 'Ouvrir le panneau système', + connectionLabel: 'Connexion :', + recentActivity: 'Activité récente', + viewAllLogs: 'Voir tous les logs →', + messagingPlatforms: 'Plateformes de messagerie', + label: 'Passerelle', + inferenceStatus: 'Statut d\'inférence de la passerelle', + enterUrlFirst: 'Saisis une URL distante et un jeton de session avant de changer', + enterUrlFirstTest: 'Saisis une URL distante et un jeton de session avant de tester', + }, + sessions: { + title: 'Sessions', + search: 'Rechercher des sessions…', + noResults: 'Aucune session trouvée.', + export: 'Exporter', + delete: 'Supprimer la session', + loading: 'Chargement…', + defaultProjectDir: 'Dossier de projet par défaut', + defaultProjectDirDesc: 'Les nouvelles sessions démarrent dans ce dossier sauf si tu en choisis un autre. Laisse vide pour utiliser ton dossier personnel.', + fallback => `Par défaut : ${fallback}.`, + notSet: 'Non défini', + change: 'Modifier', + choose: 'Choisir', + clear: 'Effacer', + archivedTitle: 'Sessions archivées', + archivedDesc: 'Les discussions archivées sont masquées de la barre latérale mais conservent tous leurs messages. Ctrl/⌘-clic sur une discussion dans la barre latérale pour l\'archiver.', + nothingArchived: 'Rien d\'archivé', + noSearchMatch: 'Aucune discussion archivée ne correspond à ta recherche.', + archiveToHide: 'Archive une discussion pour la masquer ici.', + unarchive: 'Désarchiver', + deletePermanently: 'Supprimer définitivement', + count => `${count} messages`, + new: 'Nouvelle session', + running: 'Session en cours', + actions: 'Actions de session', + reorder: 'Réorganiser', + pin: 'Épingler', + unpin: 'Désépingler', + copyId: 'Copier l\'ID', + rename: 'Renommer', + archive: 'Archiver', + renameDialog: 'Renommer la session', + renameDesc: 'Donne un titre mémorable à cette discussion. Laisse vide pour effacer.', + untitled: 'Session sans titre', + renamed: 'Renommée', + renameFailed: 'Échec du renommage', + pinned: 'Épinglée', + results: 'Résultats', + allPinned: 'Tout ici est épinglé. Désépingle une discussion pour l\'afficher dans les récentes.', + pinHint: 'Shift-clic sur une discussion pour épingler · glisser pour réorganiser', + loadMore: 'Charger plus', + noWorkspace: 'Aucun espace de travail', + ungroup: 'Afficher les sessions en liste unique', + groupByWorkspace: 'Grouper les sessions par espace de travail', + loadStep: 'Charger', + moreLabel: 'plus', + nothingArchivedTitle: 'Rien d\'archivé', + deletePermanentlyTitle: 'Supprimer définitivement', + defaultProjectDirTitle: 'Dossier de projet par défaut', + loadingArchived: 'Chargement des sessions archivées…', + restored: 'Restaurée', + projectDirUpdated: 'Dossier de projet par défaut mis à jour', + loadFailed: 'Impossible de charger les sessions archivées', + unarchiveFailed: 'Échec de la désarchivage', + deleteFailed: 'Échec de la suppression', + archiveHint: 'Archive une discussion pour la masquer ici.', + updateDirFailed: 'Impossible de mettre à jour le dossier par défaut', + clearDirFailed: 'Impossible d\'effacer le dossier par défaut', + }, + mcp: { + title: 'Serveurs MCP', + addServer: 'Ajouter un serveur', + noServers: 'Aucun serveur MCP configuré.', + loading: 'Chargement des serveurs MCP…', + servers: 'Serveurs MCP', + count => `${count} configurés`, + newServer: 'Nouveau serveur', + reloadMCP: 'Recharger MCP', + reloading: 'Rechargement...', + noServersDesc: 'Ajoute un serveur stdio ou HTTP pour exposer des outils MCP.', + name: 'Nom', + namePlaceholder: 'systeme-de-fichiers', + serverJSON: 'JSON du serveur', + editServer: 'Modifier le serveur', + saveServer: 'Enregistrer le serveur', + saving: 'Enregistrement...', + remove: 'Supprimer', + disabled: 'désactivé', + nameRequired: 'Nom requis', + nameRequiredDesc: 'Donne une clé de configuration à ce serveur MCP.', + invalidJson: 'La configuration du serveur doit être un objet JSON', + invalidJsonDesc: 'JSON MCP invalide', + saved: 'Serveur MCP enregistré', + name => `${name} s'applique après rechargement MCP.`, + saveFailed: 'Échec de l\'enregistrement', + removeFailed: 'Échec de la suppression', + gatewayUnavailable: 'Passerelle indisponible', + gatewayUnavailableDesc: 'Reconnecte la passerelle avant de recharger MCP.', + reloadedTitle: 'Outils MCP rechargés', + reloadedDesc: 'Les nouveaux schémas d\'outils s\'appliquent aux nouveaux tours.', + reloadFailed: 'Échec du rechargement MCP', + giveConfigKey: 'Donne une clé de configuration à ce serveur MCP.', + reconnectGateway: 'Reconnecte la passerelle avant de recharger MCP.', + newSchemas: 'Les nouveaux schémas d\'outils s\'appliquent aux nouveaux tours.', + loadingServers: 'Chargement des serveurs MCP...', + serverName: 'Nom', + serversTitle: 'Serveurs MCP', + noServersTitle: 'Aucun serveur MCP', + failedToLoad: 'Échec du chargement de la configuration MCP', + invalidJsonShort: 'JSON MCP invalide', + serverSaved: 'Serveur MCP enregistré', + toolsReloaded: 'Outils MCP rechargés', + emptyDesc: 'Ajoute un serveur stdio ou HTTP pour exposer des outils MCP.', + }, + tools: { + title: 'Outils & Skills', + noTools: 'Aucun outil disponible.', + }, + nav: { + home: 'Accueil', + chat: 'Discussion', + settings: 'Paramètres', + files: 'Fichiers', + terminal: 'Terminal', + }, + header: { + search: 'Rechercher ou taper une commande…', + }, + model: { + auxTask: { + vision: 'Vision', + visionHint: 'Analyse d\'images', + web_extract: 'Extraction web', + web_extractHint: 'Résumé de page', + compression: 'Compression', + compressionHint: 'Compactage du contexte', + session_search: 'Recherche de sessions', + session_searchHint: 'Requêtes de rappel', + skills_hub: 'Hub de skills', + skills_hubHint: 'Recherche de skills', + approval: 'Approbation', + approvalHint: 'Approbation auto intelligente', + mcp: 'MCP', + mcpHint: 'Routage d\'outils MCP', + title_generation: 'Génération de titre', + title_generationHint: 'Titres de session', + curator: 'Curateur', + curatorHint: 'Revue d\'utilisation des skills', + }, + mainModel: 'Modèle principal', + mainDesc: 'S\'applique aux nouvelles sessions. Utilise le sélecteur de modèle dans l\'éditeur pour changer à chaud la discussion active.', + providerPlaceholder: 'Fournisseur', + modelPlaceholder: 'Modèle', + apply: 'Appliquer', + applying: 'Application…', + auxiliaryModels: 'Modèles auxiliaires', + auxiliaryDesc: 'Les tâches auxiliaires utilisent le modèle principal par défaut. Attribue un modèle dédié à une tâche pour le remplacer.', + resetAllToMain: 'Tout réinitialiser au modèle principal', + setToMain: 'Définir sur le modèle principal', + change: 'Modifier', + cancel: 'Annuler', + autoUseMain: 'auto · utiliser le modèle principal', + providerDefault: '(défaut du fournisseur)', + loading: 'Chargement de la configuration du modèle…', + options: 'Options', + thinking: 'Réflexion', + fast: 'Rapide', + effort: 'Effort', + noOptions: 'Aucune option pour ce modèle', + optionUpdateFailed: 'Échec de la mise à jour de l\'option du modèle', + fastModeUpdateFailed: 'Échec de la mise à jour du mode rapide', + effortMinimal: 'Minimal', + effortLow: 'Faible', + effortMedium: 'Moyen', + effortHigh: 'Élevé', + effortMax: 'Max', + switch: 'Changer de modèle', + unknown: '(inconnu)', + filterPlaceholder: 'Filtrer les fournisseurs et modèles...', + persistGlobal: 'Persister globalement', + persistGlobalSession: 'Persister globalement (sinon cette session uniquement)', + couldNotLoad: 'Impossible de charger les modèles', + proLockedDesc: 'Les modèles Pro nécessitent un abonnement Nous payant.', + priceTooltip: 'Prix entrée / sortie par million de tokens', + freePrice: 'Gratuit', + currentLabel: 'actuel :', + addProviderBtn: 'Ajouter un fournisseur', + }, + updates: { + checking: 'Vérification des mises à jour…', + available: 'Mise à jour disponible', + downloading: 'Téléchargement…', + installing: 'Installation…', + restart: 'Redémarrer pour mettre à jour', + stageGettingReady: 'Préparation…', + stageDownloading: 'Téléchargement…', + stageAlmostThere: 'Presque terminé…', + stageFinishingUp: 'Finalisation…', + stageRestarting: 'Redémarrage d\'Hermes…', + stageManual: 'Mettre à jour depuis ton terminal', + stageError: 'Mise à jour en pause', + updatingHermes: 'Mise à jour d\'Hermes…', + lookingForUpdates: 'Recherche de mises à jour…', + couldntCheck: 'Impossible de vérifier les mises à jour', + updateNotAvailable: 'Mise à jour non disponible', + checkConnection: 'Vérifie ta connexion et réessaie.', + onLatest: 'Tu utilises la dernière version.', + allSet: 'Tout est bon', + newUpdateAvailable: 'Nouvelle mise à jour disponible', + readyToInstall: 'Une nouvelle version d\'Hermes est prête à être installée.', + updateNow: 'Mettre à jour maintenant', + maybeLater: 'Peut-être plus tard', + count => `+ ${count} modification supplémentaire incluse.`, + count => `+ ${count} modifications supplémentaires incluses.`, + updateFromTerminal: 'Mettre à jour depuis ton terminal', + terminalDesc: 'Tu as installé Hermes depuis la ligne de commande, donc les mises à jour s\'exécutent aussi là-bas. Colle ceci dans ton terminal :', + copied: 'Copié', + copy: 'Copier', + pickupNewVersion: 'Hermes prendra la nouvelle version au prochain lancement.', + done: 'Terminé', + updaterDesc: 'L\'outil de mise à jour Hermes prendra le relais dans sa propre fenêtre et rouvrira Hermes une fois terminé.', + closeToApply: 'Hermes va se fermer pour appliquer la mise à jour.', + updateDidntFinish: 'La mise à jour ne s\'est pas terminée', + nothingLost: 'Pas d\'inquiétude — rien n\'a été perdu. Tu peux réessayer maintenant.', + notNow: 'Pas maintenant', + }, + errors: { + generic: 'Une erreur s\'est produite.', + notFound: 'Page introuvable.', + noPermission: 'Tu n\'as pas la permission d\'accéder à ceci.', + somethingBroke: 'Quelque chose a cassé dans l\'interface', + viewCrashedDesc: 'La vue a rencontré une erreur inattendue. Tes discussions et paramètres sont en sécurité — réessaie ou recharge la fenêtre.', + noProviders: 'Aucun fournisseur authentifié.', + }, + tool: { + toolCall: 'Appel d\'outil', + result: 'Résultat', + error: 'Erreur', + timeout: 'Expiré', + cancelled: 'Annulé', + running: 'En cours', + recovered: 'Récupéré', + done: 'Terminé', + output: 'Sortie de l\'outil', + searchResults: 'Résultats de recherche', + rawResponse: 'Réponse brute', + stdout: 'sortie standard', + stderr: 'erreur standard', + copyActivity: 'Copier l\'activité', + recoveredAfter: 'Récupéré après 1 étape échouée', + count => `Récupéré après ${count} étapes échouées`, + oneStepFailed: '1 étape a échoué', + count => `${count} étapes ont échoué`, + }, + composer: { + startingHermes: 'Démarrage d\'Hermes...', + sendFollowUp: 'Envoyer un suivi', + message: 'Message', + editingQueued: 'Édition du tour en attente dans l\'éditeur', + attach: 'Joindre', + files: 'Fichiers…', + folder: 'Dossier…', + images: 'Images…', + pasteImage: 'Coller une image', + url: 'URL…', + promptSnippets: 'Extraits de prompt', + promptSnippetsDesc: 'Choisis un prompt de démarrage à déposer dans l\'éditeur.', + voiceStart: 'Démarrer une conversation vocale', + queue: 'Mettre en file d\'attente', + speaking: 'En train de parler', + transcribing: 'Transcription en cours', + muted: 'Micro coupé', + listening: 'À l\'écoute', + unmuteMic: 'Réactiver le micro', + muteMic: 'Couper le micro', + stopListening: 'Arrêter l\'écoute et envoyer', + endVoice: 'Terminer la conversation vocale', + end: 'Terminer', + stopDictation: 'Arrêter la dictée', + transcribingDictation: 'Transcription de la dictée', + voiceDictation: 'Dictée vocale', + addContext: 'Ajouter du contexte', + }, + models: { + title: 'Modèles', + search: 'Rechercher des modèles', + addProvider: 'Ajouter un fournisseur…', + }, + install: { + title: 'Hermes a besoin d\'une installation unique', + desc: 'L\'installation automatique au premier lancement n\'est pas disponible sur', + descEnd: 'pour le moment. Ouvre Terminal et exécute la commande ci-dessous, puis relance cette application. Les lancements suivants passeront cette étape.', + installCommand: 'Commande d\'installation', + copyCommand: 'Copier la commande', + viewDocs: 'Voir la documentation d\'installation', + willInstallTo: 'Sera installé dans', + iRanIt: 'Je l\'ai exécutée — réessayer', + failed: 'Échec de l\'installation', + settingUp: 'Configuration d\'Hermes Agent', + finishingUp: 'Finalisation', + failedDesc: 'Une des étapes d\'installation a échoué. Sur Windows, cela peut arriver si une autre instance du CLI ou du bureau Hermes est en cours d\'exécution. Arrête toutes les instances Hermes en cours, puis réessaie. Consulte les détails ci-dessous ou le log du bureau pour la transcription complète.', + setupDesc: 'Il s\'agit d\'une configuration unique. L\'installateur Hermes télécharge les dépendances et configure ta machine. Les lancements suivants passeront cette étape.', + fetchingManifest: 'Récupération du manifeste d\'installation...', + error: 'Erreur', + showOutput: 'Afficher la sortie de l\'installateur', + hideOutput: 'Masquer la sortie de l\'installateur', + noOutput: 'Aucune sortie pour le moment.', + cancelInstall: 'Annuler l\'installation', + cancelling: 'Annulation...', + copyOutput: 'Copier la sortie', + copied: 'Copié !', + reloadRetry: 'Recharger et réessayer', + saveLogs: 'Transcription complète enregistrée dans', + stepsComplete: 'étapes terminées', + nowLabel: 'maintenant', + line: 'ligne', + lines: 'lignes', + }, + previewConsole: { + resizeLabel: 'Redimensionner la console d\'aperçu', + noMessages: 'Aucun message console pour le moment.', + }, + boot: { + ipcUnavailable: 'Le pont IPC du bureau est indisponible.', + backendExited: 'Le processus en arrière-plan d\'Hermes s\'est arrêté pendant le démarrage.', + backendStoppedTitle: 'Backend arrêté', + backendStoppedMessage: 'Le processus en arrière-plan d\'Hermes s\'est arrêté.', + startingConnection: 'Démarrage de la connexion bureau', + connectingGateway: 'Connexion à la passerelle bureau en direct', + loadingConfig: 'Chargement des paramètres Hermes', + loadingSessions: 'Chargement des sessions récentes', + desktopBootFailed: 'Échec du démarrage du bureau', + couldNotStart: 'Hermes n\'a pas pu démarrer', + recoveryDesc: 'La passerelle en arrière-plan ne s\'est pas lancée. Essaie une des étapes de récupération ci-dessous — rien ici ne supprime tes discussions ou paramètres.', + retry: 'Réessayer', + repairInstall: 'Réparer l\'installation', + useLocalGateway: 'Utiliser la passerelle locale', + openLogs: 'Ouvrir les logs', + repairHint: 'La réparation réexécute l\'installateur et peut prendre quelques minutes sur une machine neuve.', + showLogs: 'Afficher les logs récents', + hideLogs: 'Masquer les logs récents', + }, + urlDialog: { + title: 'Joindre une URL', + description: 'Hermes va récupérer la page et l\'inclure comme contexte pour ce tour.', + placeholder: 'https://exemple.com/article', + hint: 'Inclus l\'URL complète, par ex.', + attach: 'Joindre', + }, + titlebar: { + hideSidebar: 'Masquer la barre latérale', + showSidebar: 'Afficher la barre latérale', + search: 'Rechercher', + searchTitle: 'Rechercher des sessions, vues et actions', + hideRightSidebar: 'Masquer la barre latérale droite', + showRightSidebar: 'Afficher la barre latérale droite', + unmuteHaptics: 'Réactiver le retour haptique', + muteHaptics: 'Couper le retour haptique', + openSettings: 'Ouvrir les paramètres', + profiles: 'Profils', + profilesDesc: 'Environnements Hermes avancés pour des personas, configurations, skills et SOUL.md séparés.', + manageProfiles: 'Gérer les profils', + language: 'Langue', + languageDesc: 'Choisissez une langue d\'affichage pour l\'interface.', + }, + pagination: { + ariaLabel: 'pagination', + prevAria: 'Aller à la page précédente', + prev: 'Précédent', + nextAria: 'Aller à la page suivante', + next: 'Suivant', + }, + bootstrap: { + pending: 'En attente', + running: 'Installation en cours', + done: 'Terminé', + skipped: 'Ignoré', + failed: 'Échoué', + }, + sidebar: { + sheetTitle: 'Barre latérale', + sheetDesc: 'Affiche la barre latérale mobile.', + toggle: 'Basculer la barre latérale', + }, + clarify: { + hermesIsAsking: 'Hermes demande', + loadingQuestion: 'Chargement de la question…', + otherTypeAnswer: 'Autre (tape ta réponse)', + placeholderAnswer: 'Tape ta réponse…', + cmdEnterToSend: '⌘/Ctrl + Entrée pour envoyer', + back: 'Retour', + skip: 'Passer', + couldNotSend: 'Impossible d\'envoyer la réponse de clarification', + n => `1–${n} pour choisir`, + }, + intro: { + fallback1h: 'Qu\'est-ce qu\'on fait avancer aujourd\'hui ?', + fallback1b: 'Envoie un bug, une branche, un plan ou une idée approximative. Je vais inspecter le dépôt et en faire la prochaine étape concrète.', + fallback2h: 'Qu\'est-ce qui te préoccupe ?', + fallback2b: 'Apporte le code, la question ou le point bloquant. Je lirai le contexte avant de faire des modifications.', + fallback3h: 'Qu\'est-ce qu\'Hermes devrait examiner ?', + fallback3b: 'Envoie la tâche, le chemin qui échoue ou le plan à moitié formé. Je t\'aiderai à le transformer en action.', + fallback4h: 'Par où commencer ?', + fallback4b: 'Apporte le problème, l\'objectif ou le fichier. J\'inspecterai d\'abord et garderai la prochaine étape concrète.', + fallback5h: 'Qu\'est-ce qui a besoin d\'attention ?', + fallback5b: 'Envoie le contexte que tu as. Je t\'aiderai à en faire un plan ou une correction.', + personality: { + label => `Le mode ${label} est activé. Sur quoi doit-on travailler ?`, + body1: 'Envoie la tâche, le fichier ou l\'idée approximative. J\'utiliserai ta voix configurée et garderai le travail ancré dans ce dépôt.', + label => `Qu'est-ce que ${label} Hermes doit voir ?`, + body2: 'Apporte le contexte ou le point bloquant. Je m\'adapterai à ta personnalité configurée.', + label => `Le mode ${label} est prêt.`, + body3: 'Envoie le problème, le fichier ou l\'idée. Je suivrai la personnalité que tu as configurée.', + label => `Qu'est-ce que ${label} Hermes doit attaquer ?`, + body4: 'Dépose la tâche ici. Je garderai le travail ancré dans le dépôt.', + heading5: 'Par où commencer ?', + label => `Donne-moi le contexte et je répondrai en mode ${label}.`, + }, + brand: 'HERMES AGENT', + }, + artifacts: { + noArtifactsFound: 'Aucun artefact trouvé', + }, + agents: { + spawnTree: 'Arbre de spawn', + liveSubagentActivity: 'Activité des sous-agents en direct pour le tour actuel.', + noLiveSubagents: 'Aucun sous-agent actif', + files: 'Fichiers', + label: 'Agents', + open: 'Ouvrir les agents', + close: 'Fermer les agents', + subagent: 'sous-agent', + subagents: 'sous-agents', + failed: 'échoué', + running: 'en cours', + }, + provider: { + desc: { + nousPortal: 'Surcharge de l\'URL de base du portail Nous', + openRouter: 'Clé API OpenRouter (pour les assistants de vision, de scraping web et MoA)', + google: 'Clé API Google AI Studio (également reconnue comme GEMINI_API_KEY)', + gemini: 'ID de projet GCP pour les niveaux Gemini payants (le niveau gratuit s\'approvisionne automatiquement)', + anthropic: 'Clé API Anthropic', + deepseek: 'URL de base personnalisée de l\'API DeepSeek (avancé)', + xai: 'Surcharge de l\'URL de base xAI', + huggingface: 'Surcharge de l\'URL de base Hugging Face Inference Providers', + kimi: 'Clé API Kimi / Moonshot Chine', + minimax: 'Surcharge de l\'URL de base MiniMax (Chine)', + minimaxCn: 'Clé API MiniMax Chine', + dashscope: 'URL de base DashScope personnalisée (défaut : endpoint OpenAI-compat coding-intl)', + glm: 'Clé API GLM (Z.AI)', + nvidia: 'Surcharge de l\'URL de base NVIDIA NIM (ex. http://localhost:8000/v1 pour NIM local)', + opencodeGo: 'Clé API OpenCode Go', + opencodeZen: 'Clé API OpenCode Zen', + xiaomi: 'Surcharge de l\'URL de base Xiaomi MiMo (défaut : https://api.xiaomimimo.com/v1)', + kiloCode: 'Clé API Kilo Code', + aiGateway: 'Clé API AI Gateway (Vercel AI Gateway)', + browserbase: 'BROWSERBASE_API_KEY', + elevenLabs: 'Clé API ElevenLabs', + openai: 'Clé API OpenAI (pour le traitement vocal via proxy)', + mistral: 'Clé API Mistral (pour STT/TTS)', + groq: 'Clé API Groq (pour STT)', + tavily: 'TAVILY_API_KEY', + firecrawl: 'URL de l\'API Firecrawl pour les instances auto-hébergées (optionnel)', + fal: 'FAL_KEY', + nous: 'Surcharge de l\'URL de base du portail Nous', + openrouter: 'Clé API OpenRouter (pour les assistants de vision, de scraping web et MoA)', + lmstudio: 'Surcharge de l\'URL de base Z.AI / GLM', + zai: 'URL de base Azure Foundry (définie via \'hermes model\' pour une configuration spécifique à l\'endpoint)', + stepfun: 'Surcharge de l\'URL de base StepFun Step Plan', + arcee: 'Surcharge de l\'URL de base Arcee AI', + gmi: 'Surcharge de l\'URL de base GMI Cloud', + qwenportal: 'Surcharge de l\'URL de base Qwen Portal (défaut : https://portal.qwen.ai/v1)', + opencodego: 'Surcharge de l\'URL de base OpenCode Go', + ollamacloud: 'Surcharge de l\'URL de base Ollama Cloud (défaut : https://ollama.com/v1)', + awsbedrock: 'Profil nommé AWS pour l\'authentification Bedrock (depuis ~/.aws/credentials)', + exa: 'Clé API Exa pour la recherche web et l\'extraction de contenu IA', + parallel: 'Clé API Parallel pour la recherche web et l\'extraction IA', + }, + }, +} +) diff --git a/apps/desktop/src/i18n/hi.ts b/apps/desktop/src/i18n/hi.ts new file mode 100644 index 000000000000..7151fe0bb590 --- /dev/null +++ b/apps/desktop/src/i18n/hi.ts @@ -0,0 +1,953 @@ +import { defineLocale } from './define-locale' + +export const hi = defineLocale( +{ + appearance: { + title: 'दिखावट', + description: 'ये केवल डेस्कटॉप प्रदर्शन प्राथमिकताएँ हैं। मोड चमक को नियंत्रित करता है; थीम एक्सेंट पैलेट और चैट सतह की स्टाइलिंग को नियंत्रित करती है।', + colorMode: 'रंग मोड', + colorModeDesc: 'एक निश्चित मोड चुनें या Hermes को आपकी सिस्टम सेटिंग का अनुसरण करने दें।', + theme: { + nous: 'Nous', + nousDesc: 'Nous नीले एक्सेंट के साथ ग्लास न्यूट्रल', + midnight: 'मिडनाइट', + midnightDesc: 'ठंडे एक्सेंट के साथ गहरा नीला-बैंगनी', + ember: 'एम्बर', + emberDesc: 'गर्म क्रिमसन और कांस्य — फोर्ज जैसा अनुभव', + mono: 'मोनो', + monoDesc: 'साफ ग्रेस्केल — न्यूनतम और केंद्रित', + cyberpunk: 'साइबरपंक', + cyberpunkDesc: 'काले पर नीयन हरा — मैट्रिक्स टर्मिनल', + slate: 'स्लेट', + slateDesc: 'ठंडा स्लेट नीला — डेवलपर के लिए केंद्रित थीम', + }, + themeDesc: 'चैट सतह और इंटरफ़ेस एक्सेंट के लिए रंग पैलेट चुनें।', + mode: { + light: 'लाइट', + lightDesc: 'चमकदार डेस्कटॉप सतह', + dark: 'डार्क', + darkDesc: 'कम चमक वाला कार्यक्षेत्र', + system: 'सिस्टम', + systemDesc: 'OS की दिखावट का अनुसरण करें', + }, + language: 'भाषा', + languageDesc: 'UI भाषा चुनें या Hermes को आपकी सिस्टम सेटिंग का अनुसरण करने दें।', + toolCallDisplay: 'टूल कॉल प्रदर्शन', + toolCallDisplayDesc: 'Product कच्चे टूल पेलोड को छिपाता है; Technical पूर्ण इनपुट/आउटपुट दिखाता है।', + toolViewProduct: 'Product', + toolViewTechnical: 'Technical', + toolViewProductDesc: 'संक्षिप्त सारांश के साथ मानव-अनुकूल टूल गतिविधि।', + toolViewTechnicalDesc: 'कच्चे टूल आर्ग और परिणाम और निम्न-स्तरीय विवरण शामिल करें।', + }, + settings: { + title: 'सेटिंग्स', + appearance: 'दिखावट', + model: 'मॉडल', + gateway: 'गेटवे', + sessions: 'सत्र', + tools: 'टूल्स और स्किल्स', + section: { + chat: 'चैट', + workspace: 'कार्यक्षेत्र', + safety: 'सुरक्षा', + memory: 'मेमोरी और संदर्भ', + voice: 'आवाज़', + advanced: 'उन्नत', + }, + mcp: 'MCP सर्वर', + config: 'कॉन्फ़िग', + keys: 'API कुंजियाँ', + about: 'के बारे में', + closeSettings: 'सेटिंग्स बंद करें', + archivedChats: 'संग्रहीत चैट', + exportConfig: 'कॉन्फ़िग निर्यात करें', + importConfig: 'कॉन्फ़िग आयात करें', + resetDefaults: 'डिफ़ॉल्ट पर रीसेट करें', + llmProviders: 'LLM प्रदाता', + searchPlaceholder: { + about: 'Hermes Desktop के बारे में', + config: 'सेटिंग्स खोजें…', + gateway: 'गेटवे कनेक्शन…', + keys: 'API कुंजियाँ खोजें…', + mcp: 'MCP सर्वर खोजें…', + sessions: 'संग्रहीत सत्र खोजें…', + }, + }, + chat: { + placeholder: 'मुझसे कुछ भी पूछें…', + send: 'भेजें', + stop: 'रोकें', + thinking: 'सोच रहा है…', + noSession: 'कोई सक्रिय सत्र नहीं। नई बातचीत शुरू करें।', + loadingSession: 'सत्र लोड हो रहा है', + loadingResponse: 'Hermes प्रतिक्रिया लोड कर रहा है', + branchInNewChat: 'नई चैट में शाखा बनाएँ', + readAloud: 'ज़ोर से पढ़ें', + preparingAudio: 'ऑडियो तैयार हो रहा है...', + stopReading: 'पढ़ना बंद करें', + editMessage: 'संदेश संपादित करें', + editableCheckpoint: 'संपादन योग्य चेकपॉइंट', + restoreCheckpoint: 'चेकपॉइंट पुनर्स्थापित करें', + goForward: 'आगे बढ़ें', + restorePrevCheckpoint: 'पिछला चेकपॉइंट पुनर्स्थापित करें', + restoreNextCheckpoint: 'अगला चेकपॉइंट पुनर्स्थापित करें', + composerTip: 'सुझाव: फ़ाइलों को इनलाइन संदर्भित करने के लिए @ टाइप करें।', + reconnecting: 'Hermes से पुनः कनेक्ट हो रहा है…', + }, + commandCenter: { + title: 'कमांड सेंटर', + noSessions: 'अभी तक कोई सत्र नहीं।', + loadingStatus: 'स्थिति लोड हो रही है…', + recentLogs: 'हाल के लॉग', + dailyTokens: 'दैनिक टोकन', + noActivity: 'कोई दैनिक गतिविधि नहीं।', + noModelUsage: 'अभी तक कोई मॉडल उपयोग नहीं।', + noSkillActivity: 'अभी तक कोई स्किल गतिविधि नहीं।', + sessionsPanel: 'सत्र पैनल', + systemPanel: 'सिस्टम पैनल', + usagePanel: 'उपयोग पैनल', + navigate: 'नेविगेट करें', + noMatchingResults: 'कोई मेल खाता परिणाम नहीं मिला।', + noSessionsYet: 'अभी तक कोई सत्र नहीं।', + unpinSession: 'सत्र अनपिन करें', + pinSession: 'सत्र पिन करें', + exportSession: 'सत्र निर्यात करें', + deleteSession: 'सत्र हटाएँ', + gatewayRunning: 'मैसेजिंग गेटवे चल रहा है', + gatewayStopped: 'मैसेजिंग गेटवे रुका हुआ', + restartMsg: 'मैसेजिंग पुनः आरंभ करें', + updateHermes: 'Hermes अपडेट करें', + noLogsLoaded: 'अभी तक कोई लॉग लोड नहीं।', + closeLabel: 'कमांड सेंटर बंद करें', + searchPlaceholder: 'सत्र, व्यू और कार्रवाइयाँ खोजें', + statSessions: 'सत्र', + statApiCalls: 'API कॉल', + statTokens: 'टोकन इन/आउट', + statEstCost: 'अनुमानित लागत', + cost => `वास्तविक ${cost}`, + loadingUsage: 'उपयोग लोड हो रहा है...', + count => `पिछले ${count} दिनों में कोई उपयोग नहीं।`, + retry: 'पुनः प्रयास करें', + tokenInput: 'इनपुट', + tokenOutput: 'आउटपुट', + noDailyActivity: 'कोई दैनिक गतिविधि नहीं।', + topModels: 'शीर्ष मॉडल', + topSkills: 'शीर्ष स्किल्स', + actionsLabel: 'कार्रवाइयाँ', + systemRunning: 'चल रहा है', + systemDone: 'पूर्ण', + systemFailed: 'विफल', + open: 'कमांड सेंटर खोलें', + close: 'कमांड सेंटर बंद करें', + }, + common: { + loading: 'लोड हो रहा है…', + save: 'सहेजें', + cancel: 'रद्द करें', + close: 'बंद करें', + delete: 'हटाएँ', + confirm: 'पुष्टि करें', + search: 'खोजें…', + clearSearch: 'खोज साफ़ करें', + copy: 'कॉपी करें', + refresh: 'ताज़ा करें', + moreActions: 'अधिक कार्रवाइयाँ', + tryAgain: 'पुनः प्रयास करें', + }, + onboarding: { + welcome: 'Hermes में आपका स्वागत है', + getStarted: 'प्रदाता और मॉडल चुनकर शुरुआत करें।', + skip: 'छोड़ें', + continue: 'जारी रखें', + finish: 'समाप्त करें', + setupTitle: 'आइए आपको Hermes Agent के साथ सेटअप करें', + setupDesc: 'चैटिंग शुरू करने के लिए मॉडल प्रदाता कनेक्ट करें। अधिकांश विकल्प एक क्लिक में हो जाते हैं।', + preparing: 'Hermes शुरू हो रहा है…', + installing: 'Hermes इंस्टॉल पूरा कर रहा है। पहली बार चलने पर आमतौर पर एक मिनट से कम लगता है।', + lookingUp: 'प्रदाताओं की खोज हो रही है...', + otherProviders: 'अन्य प्रदाता', + collapse: 'संकुचित करें', + iHaveKey: 'मेरे पास API कुंजी है', + recommended: 'अनुशंसित', + connected: 'कनेक्टेड', + backToSignIn: 'साइन इन पर वापस जाएँ', + getKey: 'कुंजी प्राप्त करें', + pasteKey: 'API कुंजी पेस्ट करें', + connect: 'कनेक्ट करें', + connecting: 'कनेक्ट हो रहा है', + copyCode: 'कॉपी करें', + startSignIn: 'के लिए साइन इन शुरू हो रहा है', + verifyingCode: 'के साथ आपका कोड सत्यापित हो रहा है', + pickingModel: 'कनेक्टेड। डिफ़ॉल्ट मॉडल चुना जा रहा है...', + signInFailed: 'साइन इन विफल। पुनः प्रयास करें।', + pickDifferent: 'कोई अन्य प्रदाता चुनें', + signInTitle: 'के साथ साइन इन करें', + step1: 'हमने खोला', + step1End: 'आपके ब्राउज़र में।', + step2: 'वहाँ Hermes को अधिकृत करें।', + step3: 'प्राधिकरण कोड कॉपी करें और नीचे पेस्ट करें।', + pasteCode: 'प्राधिकरण कोड पेस्ट करें', + reopenAuth: 'प्राधिकरण पृष्ठ पुनः खोलें', + cancel: 'रद्द करें', + browserDesc: 'हमने खोला', + browserDescEnd: 'आपके ब्राउज़र में। वहाँ Hermes को अधिकृत करें और आप स्वचालित रूप से कनेक्ट हो जाएँगे — कॉपी या पेस्ट करने की ज़रूरत नहीं।', + waitingAuth: 'आपके अधिकृत करने की प्रतीक्षा हो रही है...', + reopenSignIn: 'साइन इन पृष्ठ पुनः खोलें', + externalDesc: 'अपने CLI के माध्यम से साइन इन करता है। टर्मिनल में यह कमांड चलाएँ, फिर वापस आकर "मैंने साइन इन कर लिया" चुनें:', + iSignedIn: 'मैंने साइन इन कर लिया', + enterCode: 'हमने खोला', + enterCodeEnd: 'आपके ब्राउज़र में। वहाँ यह कोड दर्ज करें:', + reopenVerification: 'सत्यापन पृष्ठ पुनः खोलें', + defaultModel: 'डिफ़ॉल्ट मॉडल', + freeTier: 'मुफ़्त स्तर', + pro: 'प्रो', + change: 'बदलें', + startChatting: 'चैटिंग शुरू करें', + docs: 'दस्तावेज़', + close: 'बंद करें', + savingError: 'क्रेडेंशियल सहेज नहीं सका।', + openRouter: 'OpenRouter', + }, + file: { + browser: 'फ़ाइल ब्राउज़र', + noFiles: 'अभी तक कोई फ़ाइल नहीं।', + }, + terminal: { + title: 'टर्मिनल', + newTab: 'नया टैब', + closeTab: 'टैब बंद करें', + }, + skills: { + title: 'स्किल्स', + search: 'स्किल्स खोजें…', + noResults: 'कोई स्किल नहीं मिली।', + tools: 'स्किल्स और टूल्स', + }, + profiles: { + title: 'प्रोफ़ाइल', + noProfilesYet: 'अभी तक कोई प्रोफ़ाइल नहीं।', + selectProfile: 'विवरण देखने के लिए प्रोफ़ाइल चुनें।', + deleteProfile: 'प्रोफ़ाइल हटाएँ?', + soulMd: 'SOUL.md', + unsavedChanges: 'सहेजे न गए बदलाव', + newProfile: 'नई प्रोफ़ाइल', + cloneFromDefault: 'डिफ़ॉल्ट से क्लोन करें', + renameProfile: 'प्रोफ़ाइल का नाम बदलें', + }, + cron: { + title: 'क्रॉन जॉब्स', + noJobs: 'कोई निर्धारित जॉब नहीं।', + deleteCronJob: 'क्रॉन जॉब हटाएँ?', + optional: 'वैकल्पिक', + label: 'क्रॉन', + open: 'क्रॉन जॉब्स खोलें', + }, + messaging: { + title: 'मैसेजिंग', + recommended: 'अनुशंसित', + recommendedTelegram: 'अनुशंसित। @userinfobot से अल्पविराम से अलग संख्यात्मक ID। इसके बिना, कोई भी आपके बॉट को DM कर सकता है।', + recommendedDiscord: 'अनुशंसित। अल्पविराम से अलग Discord उपयोगकर्ता ID।', + recommendedSlack: 'अनुशंसित। अल्पविराम से अलग Slack उपयोगकर्ता ID।', + recommendedMattermost: 'अनुशंसित। अल्पविराम से अलग Mattermost उपयोगकर्ता ID।', + recommendedMatrix: 'अनुशंसित। @user:server प्रारूप में अल्पविराम से अलग उपयोगकर्ता ID।', + recommendedSignal: 'अनुशंसित। अल्पविराम से अलग Signal पहचानकर्ता।', + recommendedWhatsApp: 'अनुशंसित। अल्पविराम से अलग फ़ोन नंबर या WhatsApp ID।', + gatewayStopped: 'मैसेजिंग गेटवे रुका हुआ', + getCredentials: 'अपने क्रेडेंशियल प्राप्त करें', + required: 'आवश्यक', + unsavedChanges: 'सहेजे न गए बदलाव', + saved: 'सहेजा गया', + }, + about: { + version: 'संस्करण', + checkUpdates: 'अपडेट जाँचें', + upToDate: 'Hermes नवीनतम संस्करण पर है।', + updateAvailable: 'एक अपडेट उपलब्ध है।', + license: 'MIT लाइसेंस', + hermesDesktop: 'Hermes Desktop', + versionUnavailable: 'संस्करण अनुपलब्ध', + updates: 'अपडेट', + checkNow: 'अभी जाँचें', + checking: 'जाँच हो रही है…', + seeWhatsNew: 'देखें नया क्या है', + releaseNotes: 'रिलीज़ नोट्स', + autoUpdates: 'स्वचालित अपडेट', + autoUpdatesDesc: 'Hermes पृष्ठभूमि में स्वचालित रूप से अपडेट की जाँच करता है और जब कोई तैयार होता है तो आपको सूचित करता है।', + selfUpdateUnsupported: 'यह बिल्ड ऐप के भीतर से खुद को अपडेट नहीं कर सकता।', + cannotReachServer: 'हम अपडेट सर्वर तक नहीं पहुँच सके।', + installingUpdate: 'अभी एक अपडेट इंस्टॉल हो रहा है।', + count => `एक नया अपडेट तैयार है (${count} बदलाव शामिल)।`, + count => `एक नया अपडेट तैयार है (${count} बदलाव शामिल)।`, + onLatest: 'आप नवीनतम संस्करण पर हैं।', + tapCheckNow: 'अपडेट खोजने के लिए "अभी जाँचें" पर टैप करें।', + time => `अंतिम जाँच ${time}`, + justNow: 'अभी-अभी', + never: 'कभी नहीं', + count => `${count} मिनट पहले`, + count => `${count} घंटे पहले`, + count => `${count} दिन पहले`, + (branch, sha) => `शाखा ${branch} · कमिट ${sha}`, + }, + keys: { + title: 'API कुंजियाँ', + noKeys: 'कोई API कुंजी कॉन्फ़िगर नहीं की गई।', + addKey: 'कुंजी जोड़ें', + loading: 'API कुंजियाँ और क्रेडेंशियल लोड हो रहे हैं…', + docs: 'दस्तावेज़', + openDocs: 'प्रदाता दस्तावेज़ खोलें', + hideValue: 'मान छिपाएँ', + revealValue: 'मान दिखाएँ', + set: 'सेट', + notSet: 'सेट नहीं', + replace: 'बदलें', + replaceValue: 'वर्तमान मान बदलें', + enterValue: 'मान दर्ज करें', + saving: 'सहेजा जा रहा है', + save: 'सहेजें', + cancel: 'रद्द करें', + clearValue: 'मान हटाएँ', + (count, total) => `${count} में से ${total} कॉन्फ़िगर`, + (count, total) => `${count} में से ${total} सेट`, + count => `${count} सेट`, + count => `${count} कुंजियाँ`, + otherProviders: 'अन्य प्रदाता', + categoryTools: 'टूल्स', + categoryMessaging: 'मैसेजिंग', + categorySettings: 'सेटिंग्स', + openProviderDocs: 'प्रदाता दस्तावेज़ खोलें', + showAdvanced: 'उन्नत दिखाएँ', + loadFailed: 'API कुंजियाँ लोड करने में विफल', + credentialSaved: 'क्रेडेंशियल सहेजा गया', + credentialRemoved: 'क्रेडेंशियल हटाया गया', + }, + config: { + title: 'कॉन्फ़िगरेशन', + edit: 'कॉन्फ़िग संपादित करें', + reload: 'कॉन्फ़िग पुनः लोड करें', + notSet: 'सेट नहीं', + commaSeparated: 'अल्पविराम से अलग किए गए मान', + on: 'चालू', + off: 'बंद', + none: 'कोई नहीं', + emptyOption: '(कोई नहीं)', + loading: 'Hermes कॉन्फ़िगरेशन लोड हो रहा है…', + noMatching: 'कोई मेल खाती सेटिंग नहीं', + noMatchingDesc: 'कोई अन्य खोज शब्द आज़माएँ या कोई अन्य अनुभाग चुनें।', + count => `${count} परिणाम`, + count => `${count} परिणाम`, + saving: 'सहेजा जा रहा है…', + label: { + defaultModel: 'डिफ़ॉल्ट मॉडल', + contextWindow: 'संदर्भ विंडो', + fallbackModels: 'फ़ॉलबैक मॉडल', + enabledToolsets: 'सक्षम टूलसेट', + timezone: 'समय क्षेत्र', + personality: 'व्यक्तित्व', + reasoningBlocks: 'तर्क ब्लॉक', + maxAgentSteps: 'अधिकतम एजेंट चरण', + imageAttachments: 'छवि संलग्नक', + workingDirectory: 'कार्य निर्देशिका', + executionBackend: 'निष्पादन बैकएंड', + commandTimeout: 'कमांड समय सीमा', + persistentShell: 'स्थायी शेल', + envPassthrough: 'एनवायरनमेंट पासथ्रू', + fileReadLimit: 'फ़ाइल पढ़ने की सीमा', + terminalOutputLimit: 'टर्मिनल आउटपुट सीमा', + filePageLimit: 'फ़ाइल पृष्ठ सीमा', + lineLengthLimit: 'पंक्ति लंबाई सीमा', + codeExecutionMode: 'कोड निष्पादन मोड', + approvalMode: 'अनुमोदन मोड', + approvalTimeout: 'अनुमोदन समय सीमा', + confirmMcpReloads: 'MCP पुनः लोड की पुष्टि करें', + commandAllowlist: 'कमांड अनुमति सूची', + redactSecrets: 'गुप्त जानकारी छिपाएँ', + allowPrivateUrls: 'निजी URL की अनुमति दें', + browserPrivateUrls: 'ब्राउज़र निजी URL', + localBrowserForPrivateUrls: 'निजी URL के लिए स्थानीय ब्राउज़र', + fileCheckpoints: 'फ़ाइल चेकपॉइंट्स', + checkpointLimit: 'चेकपॉइंट सीमा', + voiceShortcut: 'ध्वनि शॉर्टकट', + maxRecordingLength: 'अधिकतम रिकॉर्डिंग लंबाई', + readResponsesAloud: 'प्रतिक्रियाएँ ज़ोर से पढ़ें', + speechToText: 'स्पीच टू टेक्स्ट', + speechToTextProvider: 'स्पीच-टू-टेक्स्ट प्रदाता', + localTranscriptionModel: 'स्थानीय ट्रांसक्रिप्शन मॉडल', + transcriptionLanguage: 'ट्रांसक्रिप्शन भाषा', + elevenlabsSttModel: 'ElevenLabs STT मॉडल', + elevenlabsLanguage: 'ElevenLabs भाषा', + tagAudioEvents: 'ऑडियो इवेंट टैग करें', + speakerDiarization: 'वक्ता डायराइज़ेशन', + textToSpeechProvider: 'टेक्स्ट-टू-स्पीच प्रदाता', + edgeVoice: 'Edge आवाज़', + openaiTtsModel: 'OpenAI TTS मॉडल', + openaiVoice: 'OpenAI आवाज़', + elevenlabsVoice: 'ElevenLabs आवाज़', + elevenlabsModel: 'ElevenLabs मॉडल', + persistentMemory: 'स्थायी मेमोरी', + userProfile: 'उपयोगकर्ता प्रोफ़ाइल', + memoryBudget: 'मेमोरी बजट', + profileBudget: 'प्रोफ़ाइल बजट', + memoryProvider: 'मेमोरी प्रदाता', + contextEngine: 'संदर्भ इंजन', + autoCompression: 'ऑटो-संपीड़न', + compressionThreshold: 'संपीड़न सीमा', + compressionTarget: 'संपीड़न लक्ष्य', + protectedRecentMessages: 'संरक्षित हालिया संदेश', + apiRetries: 'API पुनर्प्रयास', + serviceTier: 'सेवा स्तर', + toolUseEnforcement: 'टूल-उपयोग प्रवर्तन', + subagentModel: 'सबएजेंट मॉडल', + subagentProvider: 'सबएजेंट प्रदाता', + subagentTurnLimit: 'सबएजेंट टर्न सीमा', + parallelSubagents: 'समानांतर सबएजेंट', + subagentTimeout: 'सबएजेंट समय सीमा', + subagentReasoningEffort: 'सबएजेंट तर्क प्रयास', + }, + desc: { + defaultModel: 'नई चैट के लिए उपयोग किया जाता है जब तक आप कंपोज़र में कोई अन्य मॉडल न चुनें।', + contextWindow: 'चयनित मॉडल की पहचानी गई संदर्भ विंडो का उपयोग करने के लिए 0 पर छोड़ें।', + fallbackModels: 'यदि डिफ़ॉल्ट मॉडल विफल हो जाए तो प्रयास करने के लिए बैकअप provider:model प्रविष्टियाँ।', + personality: 'नए सत्रों के लिए डिफ़ॉल्ट सहायक शैली।', + timezone: 'जब Hermes को स्थानीय समय संदर्भ की आवश्यकता हो तब उपयोग किया जाता है। खाली छोड़ने पर सिस्टम समय क्षेत्र का उपयोग होता है।', + reasoningBlocks: 'जब बैकएंड प्रदान करे तब तर्क अनुभाग दिखाएँ।', + imageAttachments: 'नियंत्रित करता है कि छवि संलग्नक मॉडल को कैसे भेजे जाएँ।', + workingDirectory: 'टूल और टर्मिनल कार्य के लिए डिफ़ॉल्ट प्रोजेक्ट फ़ोल्डर।', + codeExecutionMode: 'कोड निष्पादन वर्तमान प्रोजेक्ट तक कितनी सख्ती से सीमित है।', + persistentShell: 'जब बैकएंड समर्थन करे तब कमांड के बीच शेल स्थिति बनाए रखें।', + envPassthrough: 'टूल निष्पादन में पास करने के लिए एनवायरनमेंट वेरिएबल।', + fileReadLimit: 'अधिकतम अक्षर जो Hermes एक फ़ाइल अनुरोध से पढ़ सकता है।', + approvalMode: 'Hermes उन कमांड को कैसे संभालता है जिन्हें स्पष्ट अनुमोदन की आवश्यकता होती है।', + approvalTimeout: 'अनुमोदन प्रॉम्प्ट समय समाप्त होने से पहले कितनी देर प्रतीक्षा करते हैं।', + redactSecrets: 'जब संभव हो तो मॉडल-दृश्य सामग्री से पहचाने गए गुप्त डेटा को छिपाएँ।', + fileCheckpoints: 'फ़ाइल संपादन से पहले रोलबैक स्नैपशॉट बनाएँ।', + persistentMemory: 'स्थायी यादें सहेजें जो भविष्य के सत्रों में मदद कर सकती हैं।', + userProfile: 'उपयोगकर्ता प्राथमिकताओं की एक संक्षिप्त प्रोफ़ाइल बनाए रखें।', + contextEngine: 'संदर्भ सीमा के निकट लंबी बातचीत प्रबंधित करने की रणनीति।', + autoCompression: 'जब बातचीत बड़ी हो जाए तो पुराने संदर्भ का सारांश बनाएँ।', + readResponsesAloud: 'सहायक प्रतिक्रियाएँ स्वचालित रूप से बोलें।', + speechToText: 'स्थानीय या प्रदाता-समर्थित स्पीच ट्रांसक्रिप्शन सक्षम करें।', + elevenlabsLanguage: 'वैकल्पिक ISO-639-3 भाषा कोड। खाली छोड़ने पर ElevenLabs ऑटो-डिटेक्ट करता है।', + maxAgentSteps: 'Hermes के रन रोकने से पहले टूल-कॉलिंग टर्न की ऊपरी सीमा।', + }, + }, + gateway: { + title: 'गेटवे', + start: 'गेटवे शुरू करें', + stop: 'गेटवे रोकें', + restart: 'गेटवे पुनः आरंभ करें', + running: 'चल रहा है', + stopped: 'रुका हुआ', + loading: 'गेटवे सेटिंग्स लोड हो रही हैं…', + unavailable: 'गेटवे सेटिंग्स अनुपलब्ध', + unavailableDesc: 'डेस्कटॉप IPC ब्रिज गेटवे सेटिंग्स प्रदान नहीं करता।', + connection: 'गेटवे कनेक्शन', + envOverride: 'env ओवरराइड', + desc: 'Hermes Desktop डिफ़ॉल्ट रूप से अपना स्थानीय गेटवे शुरू करता है। जब आप चाहते हैं कि यह ऐप किसी अन्य मशीन या विश्वसनीय प्रॉक्सी के पीछे पहले से चल रहे Hermes बैकएंड को नियंत्रित करे तो रिमोट गेटवे का उपयोग करें।', + envOverrideTitle: 'एनवायरनमेंट वेरिएबल इस डेस्कटॉप सत्र को नियंत्रित कर रहे हैं।', + (urlVar, tokenVar) => `नीचे सहेजी गई सेटिंग का उपयोग करने के लिए ${urlVar} और ${tokenVar} को अनसेट करें।`, + localTitle: 'स्थानीय गेटवे', + localDesc: 'लोकलहोस्ट पर एक निजी Hermes बैकएंड शुरू करें। यह डिफ़ॉल्ट है और ऑफ़लाइन काम करता है।', + remoteTitle: 'रिमोट गेटवे', + remoteDesc: 'इस डेस्कटॉप शेल को सत्र टोकन का उपयोग करके रिमोट Hermes बैकएंड से कनेक्ट करें।', + remoteUrl: 'रिमोट URL', + remoteUrlDesc: 'रिमोट डैशबोर्ड बैकएंड के लिए बेस URL। पथ उपसर्ग समर्थित हैं, उदाहरण के लिए /hermes।', + remoteUrlPlaceholder: 'https://gateway.example.com/hermes', + sessionToken: 'सत्र टोकन', + sessionTokenDesc: 'REST और WebSocket एक्सेस के लिए उपयोग किया जाने वाला डैशबोर्ड सत्र टोकन। सहेजे गए टोकन को रखने के लिए खाली छोड़ें।', + sessionTokenPlaceholder: 'सत्र टोकन पेस्ट करें', + preview => `मौजूदा टोकन ${preview}`, + tokenSaved: 'सहेजा गया', + testRemote: 'रिमोट परीक्षण करें', + saveRestart: 'अगले पुनः आरंभ के लिए सहेजें', + saveReconnect: 'सहेजें और पुनः कनेक्ट करें', + diagnostics: 'निदान', + diagnosticsDesc: 'अपने फ़ाइल प्रबंधक में desktop.log दिखाएँ — जब गेटवे शुरू होने में विफल रहता है तो उपयोगी।', + openLogs: 'लॉग खोलें', + connected: 'कनेक्टेड', + connecting: 'कनेक्ट हो रहा है', + disconnected: 'डिस्कनेक्टेड', + inferenceReady: 'इन्फ़रेंस तैयार', + inferenceNotReady: 'इन्फ़रेंस तैयार नहीं', + checkingInference: 'इन्फ़रेंस जाँच हो रही है', + openSystemPanel: 'सिस्टम पैनल खोलें', + connectionLabel: 'कनेक्शन:', + recentActivity: 'हाल की गतिविधि', + viewAllLogs: 'सभी लॉग देखें →', + messagingPlatforms: 'मैसेजिंग प्लेटफ़ॉर्म', + label: 'गेटवे', + inferenceStatus: 'गेटवे इन्फ़रेंस स्थिति', + enterUrlFirst: 'स्विच करने से पहले रिमोट URL और सत्र टोकन दर्ज करें', + enterUrlFirstTest: 'परीक्षण करने से पहले रिमोट URL और सत्र टोकन दर्ज करें', + }, + sessions: { + title: 'सत्र', + search: 'सत्र खोजें…', + noResults: 'कोई सत्र नहीं मिला।', + export: 'निर्यात करें', + delete: 'सत्र हटाएँ', + loading: 'लोड हो रहा है…', + defaultProjectDir: 'डिफ़ॉल्ट प्रोजेक्ट निर्देशिका', + defaultProjectDirDesc: 'नए सत्र इस फ़ोल्डर में शुरू होते हैं जब तक आप कोई अन्य न चुनें। अपनी होम निर्देशिका का उपयोग करने के लिए इसे खाली छोड़ें।', + fallback => `डिफ़ॉल्ट ${fallback} है।`, + notSet: 'सेट नहीं', + change: 'बदलें', + choose: 'चुनें', + clear: 'हटाएँ', + archivedTitle: 'संग्रहीत सत्र', + archivedDesc: 'संग्रहीत चैट साइडबार से छिपी रहती हैं लेकिन उनके सभी संदेश सुरक्षित रहते हैं। साइडबार में किसी चैट को Ctrl/⌘-क्लिक करके संग्रहीत करें।', + nothingArchived: 'कुछ भी संग्रहीत नहीं', + noSearchMatch: 'आपकी खोज से मेल खाती कोई संग्रहीत चैट नहीं।', + archiveToHide: 'यहाँ छिपाने के लिए चैट को संग्रहीत करें।', + unarchive: 'अनआर्काइव करें', + deletePermanently: 'स्थायी रूप से हटाएँ', + count => `${count} संदेश`, + new: 'नया सत्र', + running: 'सत्र चल रहा है', + actions: 'सत्र कार्रवाइयाँ', + reorder: 'पुनर्क्रमित करें', + pin: 'पिन करें', + unpin: 'अनपिन करें', + copyId: 'ID कॉपी करें', + rename: 'नाम बदलें', + archive: 'संग्रहीत करें', + renameDialog: 'सत्र का नाम बदलें', + renameDesc: 'इस चैट को एक यादगार शीर्षक दें। हटाने के लिए खाली छोड़ें।', + untitled: 'शीर्षकहीन सत्र', + renamed: 'नाम बदला गया', + renameFailed: 'नाम बदलना विफल', + pinned: 'पिन किया गया', + results: 'परिणाम', + allPinned: 'यहाँ सब कुछ पिन किया गया है। हालिया में दिखाने के लिए चैट को अनपिन करें।', + pinHint: 'पिन करने के लिए Shift-क्लिक करें · पुनर्क्रमित करने के लिए खींचें', + loadMore: 'और लोड करें', + noWorkspace: 'कोई कार्यक्षेत्र नहीं', + ungroup: 'सत्रों को एकल सूची में दिखाएँ', + groupByWorkspace: 'सत्रों को कार्यक्षेत्र के अनुसार समूहित करें', + loadStep: 'लोड करें', + moreLabel: 'और', + nothingArchivedTitle: 'कुछ भी संग्रहीत नहीं', + deletePermanentlyTitle: 'स्थायी रूप से हटाएँ', + defaultProjectDirTitle: 'डिफ़ॉल्ट प्रोजेक्ट निर्देशिका', + loadingArchived: 'संग्रहीत सत्र लोड हो रहे हैं…', + restored: 'पुनर्स्थापित', + projectDirUpdated: 'डिफ़ॉल्ट प्रोजेक्ट निर्देशिका अपडेट की गई', + loadFailed: 'संग्रहीत सत्र लोड नहीं कर सका', + unarchiveFailed: 'अनआर्काइव विफल', + deleteFailed: 'हटाना विफल', + archiveHint: 'यहाँ छिपाने के लिए चैट को संग्रहीत करें।', + updateDirFailed: 'डिफ़ॉल्ट निर्देशिका अपडेट नहीं कर सका', + clearDirFailed: 'डिफ़ॉल्ट निर्देशिका साफ़ नहीं कर सका', + }, + mcp: { + title: 'MCP सर्वर', + addServer: 'सर्वर जोड़ें', + noServers: 'कोई MCP सर्वर कॉन्फ़िगर नहीं।', + loading: 'MCP सर्वर लोड हो रहे हैं…', + servers: 'MCP सर्वर', + count => `${count} कॉन्फ़िगर`, + newServer: 'नया सर्वर', + reloadMCP: 'MCP पुनः लोड करें', + reloading: 'पुनः लोड हो रहा है...', + noServersDesc: 'MCP टूल्स प्रदान करने के लिए stdio या HTTP सर्वर जोड़ें।', + name: 'नाम', + namePlaceholder: 'filesystem', + serverJSON: 'सर्वर JSON', + editServer: 'सर्वर संपादित करें', + saveServer: 'सर्वर सहेजें', + saving: 'सहेजा जा रहा है...', + remove: 'हटाएँ', + disabled: 'अक्षम', + nameRequired: 'नाम आवश्यक है', + nameRequiredDesc: 'इस MCP सर्वर को एक कॉन्फ़िग कुंजी दें।', + invalidJson: 'सर्वर कॉन्फ़िग एक JSON ऑब्जेक्ट होना चाहिए', + invalidJsonDesc: 'अमान्य MCP JSON', + saved: 'MCP सर्वर सहेजा गया', + name => `${name} MCP पुनः लोड के बाद लागू होता है।`, + saveFailed: 'सहेजना विफल', + removeFailed: 'हटाना विफल', + gatewayUnavailable: 'गेटवे अनुपलब्ध', + gatewayUnavailableDesc: 'MCP पुनः लोड करने से पहले गेटवे को पुनः कनेक्ट करें।', + reloadedTitle: 'MCP टूल्स पुनः लोड हो गए', + reloadedDesc: 'नए टूल स्कीमा नए टर्न पर लागू होते हैं।', + reloadFailed: 'MCP पुनः लोड विफल', + giveConfigKey: 'इस MCP सर्वर को एक कॉन्फ़िग कुंजी दें।', + reconnectGateway: 'MCP पुनः लोड करने से पहले गेटवे को पुनः कनेक्ट करें।', + newSchemas: 'नए टूल स्कीमा नए टर्न पर लागू होते हैं।', + loadingServers: 'MCP सर्वर लोड हो रहे हैं...', + serverName: 'नाम', + serversTitle: 'MCP सर्वर', + noServersTitle: 'कोई MCP सर्वर नहीं', + failedToLoad: 'MCP कॉन्फ़िग लोड करने में विफल', + invalidJsonShort: 'अमान्य MCP JSON', + serverSaved: 'MCP सर्वर सहेजा गया', + toolsReloaded: 'MCP टूल्स पुनः लोड हो गए', + emptyDesc: 'MCP टूल्स प्रदान करने के लिए stdio या HTTP सर्वर जोड़ें।', + }, + tools: { + title: 'टूल्स और स्किल्स', + noTools: 'कोई टूल उपलब्ध नहीं।', + }, + nav: { + home: 'होम', + chat: 'चैट', + settings: 'सेटिंग्स', + files: 'फ़ाइलें', + terminal: 'टर्मिनल', + }, + header: { + search: 'खोजें या कमांड टाइप करें…', + }, + model: { + auxTask: { + vision: 'विज़न', + visionHint: 'छवि विश्लेषण', + web_extract: 'वेब एक्सट्रैक्ट', + web_extractHint: 'पृष्ठ सारांश', + compression: 'संपीड़न', + compressionHint: 'संदर्भ संकुचन', + session_search: 'सत्र खोज', + session_searchHint: 'स्मरण क्वेरी', + skills_hub: 'स्किल्स हब', + skills_hubHint: 'स्किल खोज', + approval: 'अनुमोदन', + approvalHint: 'स्मार्ट ऑटो-अप्रूव', + mcp: 'MCP', + mcpHint: 'MCP टूल रूटिंग', + title_generation: 'शीर्षक निर्माण', + title_generationHint: 'सत्र शीर्षक', + curator: 'क्यूरेटर', + curatorHint: 'स्किल-उपयोग समीक्षा', + }, + mainModel: 'मुख्य मॉडल', + mainDesc: 'नए सत्रों पर लागू होता है। सक्रिय चैट को तुरंत बदलने के लिए कंपोज़र में मॉडल पिकर का उपयोग करें।', + providerPlaceholder: 'प्रदाता', + modelPlaceholder: 'मॉडल', + apply: 'लागू करें', + applying: 'लागू हो रहा है…', + auxiliaryModels: 'सहायक मॉडल', + auxiliaryDesc: 'सहायक कार्य डिफ़ॉल्ट रूप से मुख्य मॉडल पर चलते हैं। ओवरराइड करने के लिए किसी कार्य को समर्पित मॉडल असाइन करें।', + resetAllToMain: 'सभी को मुख्य पर रीसेट करें', + setToMain: 'मुख्य पर सेट करें', + change: 'बदलें', + cancel: 'रद्द करें', + autoUseMain: 'ऑटो · मुख्य मॉडल का उपयोग करें', + providerDefault: '(प्रदाता डिफ़ॉल्ट)', + loading: 'मॉडल कॉन्फ़िगरेशन लोड हो रहा है…', + options: 'विकल्प', + thinking: 'चिंतन', + fast: 'तेज़', + effort: 'प्रयास', + noOptions: 'इस मॉडल के लिए कोई विकल्प नहीं', + optionUpdateFailed: 'मॉडल विकल्प अपडेट विफल', + fastModeUpdateFailed: 'फ़ास्ट मोड अपडेट विफल', + effortMinimal: 'न्यूनतम', + effortLow: 'कम', + effortMedium: 'मध्यम', + effortHigh: 'उच्च', + effortMax: 'अधिकतम', + switch: 'मॉडल बदलें', + unknown: '(अज्ञात)', + filterPlaceholder: 'प्रदाता और मॉडल फ़िल्टर करें...', + persistGlobal: 'वैश्विक रूप से स्थायी करें', + persistGlobalSession: 'वैश्विक रूप से स्थायी करें (अन्यथा केवल यह सत्र)', + couldNotLoad: 'मॉडल लोड नहीं कर सका', + proLockedDesc: 'प्रो मॉडल के लिए सशुल्क Nous सदस्यता आवश्यक है।', + priceTooltip: 'प्रति मिलियन टोकन इनपुट / आउटपुट मूल्य', + freePrice: 'मुफ़्त', + currentLabel: 'वर्तमान:', + addProviderBtn: 'प्रदाता जोड़ें', + }, + updates: { + checking: 'अपडेट की जाँच हो रही है…', + available: 'अपडेट उपलब्ध', + downloading: 'डाउनलोड हो रहा है…', + installing: 'इंस्टॉल हो रहा है…', + restart: 'अपडेट करने के लिए पुनः आरंभ करें', + stageGettingReady: 'तैयार हो रहा है…', + stageDownloading: 'डाउनलोड हो रहा है…', + stageAlmostThere: 'बस होने ही वाला है…', + stageFinishingUp: 'समाप्त हो रहा है…', + stageRestarting: 'Hermes पुनः आरंभ हो रहा है…', + stageManual: 'अपने टर्मिनल से अपडेट करें', + stageError: 'अपडेट रुक गया', + updatingHermes: 'Hermes अपडेट हो रहा है…', + lookingForUpdates: 'अपडेट खोजे जा रहे हैं…', + couldntCheck: 'अपडेट की जाँच नहीं कर सका', + updateNotAvailable: 'अपडेट उपलब्ध नहीं', + checkConnection: 'अपना कनेक्शन जाँचें और पुनः प्रयास करें।', + onLatest: 'आप नवीनतम संस्करण चला रहे हैं।', + allSet: 'आप पूरी तरह तैयार हैं', + newUpdateAvailable: 'नया अपडेट उपलब्ध', + readyToInstall: 'Hermes का एक नया संस्करण इंस्टॉल करने के लिए तैयार है।', + updateNow: 'अभी अपडेट करें', + maybeLater: 'शायद बाद में', + count => `+ ${count} और बदलाव शामिल।`, + count => `+ ${count} और बदलाव शामिल।`, + updateFromTerminal: 'अपने टर्मिनल से अपडेट करें', + terminalDesc: 'आपने Hermes को कमांड लाइन से इंस्टॉल किया था, इसलिए अपडेट भी वहीं चलते हैं। इसे अपने टर्मिनल में पेस्ट करें:', + copied: 'कॉपी हो गया', + copy: 'कॉपी करें', + pickupNewVersion: 'अगली बार लॉन्च करने पर Hermes नया संस्करण ले लेगा।', + done: 'पूर्ण', + updaterDesc: 'Hermes अपडेटर अपनी विंडो में कार्यभार संभालेगा और समाप्त होने पर Hermes को पुनः खोलेगा।', + closeToApply: 'अपडेट लागू करने के लिए Hermes बंद हो जाएगा।', + updateDidntFinish: 'अपडेट पूरा नहीं हुआ', + nothingLost: 'चिंता न करें — कुछ भी खोया नहीं। आप अभी पुनः प्रयास कर सकते हैं।', + notNow: 'अभी नहीं', + }, + errors: { + generic: 'कुछ गलत हो गया।', + notFound: 'पृष्ठ नहीं मिला।', + noPermission: 'आपके पास इसे एक्सेस करने की अनुमति नहीं है।', + somethingBroke: 'इंटरफ़ेस में कुछ टूट गया', + viewCrashedDesc: 'व्यू में एक अप्रत्याशित त्रुटि आई। आपकी चैट और सेटिंग्स सुरक्षित हैं - पुनः प्रयास करें, या विंडो को पुनः लोड करें।', + noProviders: 'कोई प्रमाणित प्रदाता नहीं।', + }, + tool: { + toolCall: 'टूल कॉल', + result: 'परिणाम', + error: 'त्रुटि', + timeout: 'समय समाप्त', + cancelled: 'रद्द किया गया', + running: 'चल रहा है', + recovered: 'पुनर्प्राप्त', + done: 'पूर्ण', + output: 'टूल आउटपुट', + searchResults: 'खोज परिणाम', + rawResponse: 'कच्ची प्रतिक्रिया', + stdout: 'stdout', + stderr: 'stderr', + copyActivity: 'गतिविधि कॉपी करें', + recoveredAfter: '1 विफल चरण के बाद पुनर्प्राप्त', + count => `${count} विफल चरणों के बाद पुनर्प्राप्त`, + oneStepFailed: '1 चरण विफल', + count => `${count} चरण विफल`, + }, + composer: { + startingHermes: 'Hermes शुरू हो रहा है...', + sendFollowUp: 'अनुवर्ती भेजें', + message: 'संदेश', + editingQueued: 'कंपोज़र में कतारबद्ध टर्न संपादित हो रहा है', + attach: 'संलग्न करें', + files: 'फ़ाइलें…', + folder: 'फ़ोल्डर…', + images: 'छवियाँ…', + pasteImage: 'छवि पेस्ट करें', + url: 'URL…', + promptSnippets: 'प्रॉम्प्ट स्निपेट्स', + promptSnippetsDesc: 'कंपोज़र में डालने के लिए एक स्टार्टर प्रॉम्प्ट चुनें।', + voiceStart: 'ध्वनि वार्तालाप शुरू करें', + queue: 'संदेश कतारबद्ध करें', + speaking: 'बोल रहा है', + transcribing: 'ट्रांसक्राइब हो रहा है', + muted: 'म्यूट', + listening: 'सुन रहा है', + unmuteMic: 'माइक्रोफ़ोन अनम्यूट करें', + muteMic: 'माइक्रोफ़ोन म्यूट करें', + stopListening: 'सुनना बंद करें और भेजें', + endVoice: 'ध्वनि वार्तालाप समाप्त करें', + end: 'समाप्त', + stopDictation: 'डिक्टेशन बंद करें', + transcribingDictation: 'डिक्टेशन ट्रांसक्राइब हो रहा है', + voiceDictation: 'ध्वनि डिक्टेशन', + addContext: 'संदर्भ जोड़ें', + }, + models: { + title: 'मॉडल', + search: 'मॉडल खोजें', + addProvider: 'प्रदाता जोड़ें…', + }, + install: { + title: 'Hermes को एक बार इंस्टॉल करने की आवश्यकता है', + desc: 'स्वचालित पहली-लॉन्च इंस्टॉल अभी उपलब्ध नहीं है', + descEnd: 'पर। टर्मिनल खोलें और नीचे दिया गया कमांड चलाएँ, फिर इस ऐप को पुनः लॉन्च करें। बाद के लॉन्च इस चरण को छोड़ देंगे।', + installCommand: 'इंस्टॉल कमांड', + copyCommand: 'कमांड कॉपी करें', + viewDocs: 'इंस्टॉल दस्तावेज़ देखें', + willInstallTo: 'यहाँ इंस्टॉल होगा', + iRanIt: 'मैंने इसे चला लिया -- पुनः प्रयास करें', + failed: 'इंस्टॉलेशन विफल', + settingUp: 'Hermes Agent सेटअप हो रहा है', + finishingUp: 'समाप्त हो रहा है', + failedDesc: 'इंस्टॉल चरणों में से एक विफल रहा। Windows पर, ऐसा तब हो सकता है जब कोई अन्य Hermes CLI या डेस्कटॉप इंस्टेंस चल रहा हो। किसी भी चल रहे Hermes इंस्टेंस को रोकें, फिर पुनः प्रयास करें। पूर्ण ट्रांसक्रिप्ट के लिए नीचे विवरण या डेस्कटॉप लॉग देखें।', + setupDesc: 'यह एक बार का सेटअप है। Hermes इंस्टॉलर निर्भरताएँ डाउनलोड कर रहा है और आपकी मशीन को कॉन्फ़िगर कर रहा है। बाद के लॉन्च इस चरण को छोड़ देंगे।', + fetchingManifest: 'इंस्टॉलर मैनिफ़ेस्ट प्राप्त हो रहा है...', + error: 'त्रुटि', + showOutput: 'इंस्टॉलर आउटपुट दिखाएँ', + hideOutput: 'इंस्टॉलर आउटपुट छिपाएँ', + noOutput: 'अभी तक कोई आउटपुट नहीं।', + cancelInstall: 'इंस्टॉल रद्द करें', + cancelling: 'रद्द हो रहा है...', + copyOutput: 'आउटपुट कॉपी करें', + copied: 'कॉपी हो गया!', + reloadRetry: 'पुनः लोड करें और पुनः प्रयास करें', + saveLogs: 'पूर्ण ट्रांसक्रिप्ट यहाँ सहेजा गया', + stepsComplete: 'चरण पूर्ण', + nowLabel: 'अभी', + line: 'पंक्ति', + lines: 'पंक्तियाँ', + }, + previewConsole: { + resizeLabel: 'प्रीव्यू कंसोल का आकार बदलें', + noMessages: 'अभी तक कोई कंसोल संदेश नहीं।', + }, + boot: { + ipcUnavailable: 'डेस्कटॉप IPC ब्रिज अनुपलब्ध है।', + backendExited: 'स्टार्टअप के दौरान Hermes पृष्ठभूमि प्रक्रिया समाप्त हो गई।', + backendStoppedTitle: 'बैकएंड रुक गया', + backendStoppedMessage: 'Hermes पृष्ठभूमि प्रक्रिया समाप्त हो गई।', + startingConnection: 'डेस्कटॉप कनेक्शन शुरू हो रहा है', + connectingGateway: 'लाइव डेस्कटॉप गेटवे से कनेक्ट हो रहा है', + loadingConfig: 'Hermes सेटिंग्स लोड हो रही हैं', + loadingSessions: 'हाल के सत्र लोड हो रहे हैं', + desktopBootFailed: 'डेस्कटॉप बूट विफल', + couldNotStart: 'Hermes शुरू नहीं हो सका', + recoveryDesc: 'पृष्ठभूमि गेटवे शुरू नहीं हुआ। नीचे दिए गए पुनर्प्राप्ति चरणों में से एक आज़माएँ — यहाँ कुछ भी आपकी चैट या सेटिंग्स को नहीं हटाता।', + retry: 'पुनः प्रयास करें', + repairInstall: 'इंस्टॉल मरम्मत करें', + useLocalGateway: 'स्थानीय गेटवे का उपयोग करें', + openLogs: 'लॉग खोलें', + repairHint: 'मरम्मत इंस्टॉलर को पुनः चलाती है और नई मशीन पर कुछ मिनट लग सकते हैं।', + showLogs: 'हाल के लॉग दिखाएँ', + hideLogs: 'हाल के लॉग छिपाएँ', + }, + urlDialog: { + title: 'URL संलग्न करें', + description: 'Hermes पृष्ठ प्राप्त करेगा और इसे इस टर्न के लिए संदर्भ के रूप में शामिल करेगा।', + placeholder: 'https://example.com/post', + hint: 'पूर्ण URL शामिल करें, जैसे', + attach: 'संलग्न करें', + }, + titlebar: { + hideSidebar: 'साइडबार छिपाएँ', + showSidebar: 'साइडबार दिखाएँ', + search: 'खोजें', + searchTitle: 'सत्र, व्यू और कार्रवाइयाँ खोजें', + hideRightSidebar: 'दायाँ साइडबार छिपाएँ', + showRightSidebar: 'दायाँ साइडबार दिखाएँ', + unmuteHaptics: 'हैप्टिक्स अनम्यूट करें', + muteHaptics: 'हैप्टिक्स म्यूट करें', + openSettings: 'सेटिंग्स खोलें', + profiles: 'प्रोफ़ाइल', + profilesDesc: 'अलग-अलग व्यक्तित्व, कॉन्फ़िग, स्किल्स और SOUL.md के लिए उन्नत Hermes वातावरण।', + manageProfiles: 'प्रोफ़ाइल प्रबंधित करें', + language: 'भाषा', + languageDesc: 'इंटरफ़ेस के लिए प्रदर्शन भाषा चुनें।', + }, + pagination: { + ariaLabel: 'पृष्ठांकन', + prevAria: 'पिछले पृष्ठ पर जाएँ', + prev: 'पिछला', + nextAria: 'अगले पृष्ठ पर जाएँ', + next: 'अगला', + }, + bootstrap: { + pending: 'लंबित', + running: 'इंस्टॉल हो रहा है', + done: 'पूर्ण', + skipped: 'छोड़ा गया', + failed: 'विफल', + }, + sidebar: { + sheetTitle: 'साइडबार', + sheetDesc: 'मोबाइल साइडबार प्रदर्शित करता है।', + toggle: 'साइडबार टॉगल करें', + }, + clarify: { + hermesIsAsking: 'Hermes पूछ रहा है', + loadingQuestion: 'प्रश्न लोड हो रहा है…', + otherTypeAnswer: 'अन्य (अपना उत्तर टाइप करें)', + placeholderAnswer: 'अपना उत्तर टाइप करें…', + cmdEnterToSend: 'भेजने के लिए ⌘/Ctrl + Enter', + back: 'वापस', + skip: 'छोड़ें', + couldNotSend: 'स्पष्टीकरण प्रतिक्रिया नहीं भेज सका', + n => `चुनने के लिए 1–${n}`, + }, + intro: { + fallback1h: 'आज हम क्या आगे बढ़ा रहे हैं?', + fallback1b: 'बग, शाखा, योजना या मोटा विचार भेजें। मैं रिपो की जाँच करूँगा और इसे अगले ठोस कदम में बदलूँगा।', + fallback2h: 'आपके दिमाग में क्या है?', + fallback2b: 'कोड, प्रश्न या अटका हुआ भाग लाएँ। बदलाव करने से पहले मैं स्थिति समझूँगा।', + fallback3h: 'Hermes को क्या देखना चाहिए?', + fallback3b: 'कार्य, विफल पथ या अधूरी योजना भेजें। मैं इसे कार्रवाई में बदलने में मदद करूँगा।', + fallback4h: 'हमें कहाँ से शुरू करना चाहिए?', + fallback4b: 'समस्या, लक्ष्य या फ़ाइल लाएँ। मैं पहले जाँच करूँगा और अगला कदम ठोस रखूँगा।', + fallback5h: 'किस पर ध्यान देने की ज़रूरत है?', + fallback5b: 'आपके पास जो संदर्भ है वह भेजें। मैं इसे योजना या समाधान में बदलने में मदद करूँगा।', + personality: { + label => `${label} मोड चालू है। हमें किस पर काम करना चाहिए?`, + body1: 'कार्य, फ़ाइल या मोटा विचार भेजें। मैं आपकी कॉन्फ़िगर की गई आवाज़ का उपयोग करूँगा और काम को इस रिपो में आधारित रखूँगा।', + label => `${label} Hermes को क्या देखना चाहिए?`, + body2: 'संदर्भ या अटका हुआ भाग लाएँ। मैं आपके कॉन्फ़िगर किए गए व्यक्तित्व के अनुसार ढल जाऊँगा।', + label => `${label} मोड तैयार है।`, + body3: 'समस्या, फ़ाइल या विचार भेजें। मैं आपके कॉन्फ़िगर किए गए व्यक्तित्व का अनुसरण करूँगा।', + label => `${label} Hermes को क्या निपटाना चाहिए?`, + body4: 'कार्य यहाँ डालें। मैं काम को रिपो में आधारित रखूँगा।', + heading5: 'हमें कहाँ से शुरू करना चाहिए?', + label => `मुझे संदर्भ दें और मैं ${label} मोड में उत्तर दूँगा।`, + }, + brand: 'HERMES AGENT', + }, + artifacts: { + noArtifactsFound: 'कोई आर्टिफ़ैक्ट नहीं मिला', + }, + agents: { + spawnTree: 'स्पॉन ट्री', + liveSubagentActivity: 'वर्तमान टर्न के लिए लाइव सबएजेंट गतिविधि।', + noLiveSubagents: 'कोई लाइव सबएजेंट नहीं', + files: 'फ़ाइलें', + label: 'एजेंट', + open: 'एजेंट खोलें', + close: 'एजेंट बंद करें', + subagent: 'सबएजेंट', + subagents: 'सबएजेंट', + failed: 'विफल', + running: 'चल रहा है', + }, + provider: { + desc: { + nousPortal: 'Nous Portal बेस URL ओवरराइड', + openRouter: 'OpenRouter API कुंजी (विज़न, वेब स्क्रैपिंग सहायक और MoA के लिए)', + google: 'Google AI Studio API कुंजी (GEMINI_API_KEY के रूप में भी पहचानी जाती है)', + gemini: 'सशुल्क Gemini स्तरों के लिए GCP प्रोजेक्ट ID (मुफ़्त स्तर ऑटो-प्रोविज़न होता है)', + anthropic: 'Anthropic API कुंजी', + deepseek: 'कस्टम DeepSeek API बेस URL (उन्नत)', + xai: 'xAI बेस URL ओवरराइड', + huggingface: 'Hugging Face Inference Providers बेस URL ओवरराइड', + kimi: 'Kimi / Moonshot China API कुंजी', + minimax: 'MiniMax (China) बेस URL ओवरराइड', + minimaxCn: 'MiniMax China API कुंजी', + dashscope: 'कस्टम DashScope बेस URL (डिफ़ॉल्ट: coding-intl OpenAI-संगत एंडपॉइंट)', + glm: 'GLM API कुंजी (Z.AI)', + nvidia: 'NVIDIA NIM बेस URL ओवरराइड (जैसे स्थानीय NIM के लिए http://localhost:8000/v1)', + opencodeGo: 'OpenCode Go API कुंजी', + opencodeZen: 'OpenCode Zen API कुंजी', + xiaomi: 'Xiaomi MiMo बेस URL ओवरराइड (डिफ़ॉल्ट: https://api.xiaomimimo.com/v1)', + kiloCode: 'Kilo Code API कुंजी', + aiGateway: 'AI Gateway API कुंजी (Vercel AI Gateway)', + browserbase: 'BROWSERBASE_API_KEY', + elevenLabs: 'ElevenLabs API कुंजी', + openai: 'OpenAI API कुंजी (प्रॉक्सी के माध्यम से ध्वनि प्रसंस्करण के लिए)', + mistral: 'Mistral API कुंजी (STT/TTS के लिए)', + groq: 'Groq API कुंजी (STT के लिए)', + tavily: 'TAVILY_API_KEY', + firecrawl: 'स्व-होस्टेड इंस्टेंस के लिए Firecrawl API URL (वैकल्पिक)', + fal: 'FAL_KEY', + nous: 'Nous Portal बेस URL ओवरराइड', + openrouter: 'OpenRouter API कुंजी (विज़न, वेब स्क्रैपिंग सहायक और MoA के लिए)', + lmstudio: 'Z.AI / GLM बेस URL ओवरराइड', + zai: 'Azure Foundry बेस URL (एंडपॉइंट-विशिष्ट कॉन्फ़िग के लिए \'hermes model\' के माध्यम से सेट करें)', + stepfun: 'StepFun Step Plan बेस URL ओवरराइड', + arcee: 'Arcee AI बेस URL ओवरराइड', + gmi: 'GMI Cloud बेस URL ओवरराइड', + qwenportal: 'Qwen Portal बेस URL ओवरराइड (डिफ़ॉल्ट: https://portal.qwen.ai/v1)', + opencodego: 'OpenCode Go बेस URL ओवरराइड', + ollamacloud: 'Ollama Cloud बेस URL ओवरराइड (डिफ़ॉल्ट: https://ollama.com/v1)', + awsbedrock: 'Bedrock प्रमाणीकरण के लिए AWS नामित प्रोफ़ाइल (~/.aws/credentials से)', + exa: 'AI-नेटिव वेब खोज और सामग्री के लिए Exa API कुंजी', + parallel: 'AI-नेटिव वेब खोज और एक्सट्रैक्ट के लिए Parallel API कुंजी', + }, + }, +} +) diff --git a/apps/desktop/src/i18n/it.ts b/apps/desktop/src/i18n/it.ts new file mode 100644 index 000000000000..f9d4471e2563 --- /dev/null +++ b/apps/desktop/src/i18n/it.ts @@ -0,0 +1,953 @@ +import { defineLocale } from './define-locale' + +export const it = defineLocale( +{ + appearance: { + title: 'Aspetto', + description: 'Queste sono preferenze di visualizzazione solo desktop. La modalità controlla la luminosità; il tema controlla la tavolozza degli accenti e lo stile della superficie di chat.', + colorMode: 'Modalità Colore', + colorModeDesc: 'Scegli una modalità fissa o lascia che Hermes segua l\'impostazione di sistema.', + theme: { + nous: 'Nous', + nousDesc: 'Neutrali trasparenti con accenti blu Nous', + midnight: 'Mezzanotte', + midnightDesc: 'Blu-viola profondo con accenti freddi', + ember: 'Brace', + emberDesc: 'Cremisi e bronzo caldi — atmosfera da fucina', + mono: 'Mono', + monoDesc: 'Scala di grigi pulita — minimale e focalizzato', + cyberpunk: 'Cyberpunk', + cyberpunkDesc: 'Verde neon su nero — terminale matrix', + slate: 'Ardesia', + slateDesc: 'Blu ardesia freddo — tema focalizzato per sviluppatori', + }, + themeDesc: 'Scegli una tavolozza di colori per la superficie di chat e gli accenti dell\'interfaccia.', + mode: { + light: 'Chiaro', + lightDesc: 'Superfici desktop luminose', + dark: 'Scuro', + darkDesc: 'Ambiente di lavoro a basso abbagliamento', + system: 'Sistema', + systemDesc: 'Segui l\'aspetto del sistema operativo', + }, + language: 'Lingua', + languageDesc: 'Scegli la lingua dell\'interfaccia o lascia che Hermes segua l\'impostazione di sistema.', + toolCallDisplay: 'Visualizzazione Chiamate Strumento', + toolCallDisplayDesc: 'Prodotto nasconde i payload grezzi; Tecnico mostra input/output completi.', + toolViewProduct: 'Prodotto', + toolViewTechnical: 'Tecnico', + toolViewProductDesc: 'Attività strumento leggibile con riassunti concisi.', + toolViewTechnicalDesc: 'Includi argomenti/risultati grezzi e dettagli di basso livello.', + }, + settings: { + title: 'Impostazioni', + appearance: 'Aspetto', + model: 'Modello', + gateway: 'Gateway', + sessions: 'Sessioni', + tools: 'Strumenti e Competenze', + section: { + chat: 'Chat', + workspace: 'Area di lavoro', + safety: 'Sicurezza', + memory: 'Memoria e Contesto', + voice: 'Voce', + advanced: 'Avanzate', + }, + mcp: 'Server MCP', + config: 'Configurazione', + keys: 'Chiavi API', + about: 'Informazioni', + closeSettings: 'Chiudi impostazioni', + archivedChats: 'Chat Archiviate', + exportConfig: 'Esporta configurazione', + importConfig: 'Importa configurazione', + resetDefaults: 'Ripristina predefiniti', + llmProviders: 'Provider LLM', + searchPlaceholder: { + about: 'Informazioni su Hermes Desktop', + config: 'Cerca impostazioni…', + gateway: 'Connessione gateway…', + keys: 'Cerca chiavi API…', + mcp: 'Cerca server MCP…', + sessions: 'Cerca sessioni archiviate…', + }, + }, + chat: { + placeholder: 'Chiedimi qualsiasi cosa…', + send: 'Invia', + stop: 'Ferma', + thinking: 'Pensando…', + noSession: 'Nessuna sessione attiva. Avvia una nuova conversazione.', + composerTip: 'Suggerimento: digita @ per riferire file inline.', + loadingSession: 'Caricamento sessione', + loadingResponse: 'Hermes sta caricando una risposta', + branchInNewChat: 'Dirama in nuova chat', + readAloud: 'Leggi ad alta voce', + preparingAudio: 'Preparazione audio...', + stopReading: 'Ferma lettura', + editMessage: 'Modifica messaggio', + editableCheckpoint: 'Checkpoint modificabile', + restoreCheckpoint: 'Ripristina checkpoint', + goForward: 'Vai avanti', + restorePrevCheckpoint: 'Ripristina checkpoint precedente', + restoreNextCheckpoint: 'Ripristina checkpoint successivo', + reconnecting: 'Riconnessione a Hermes…', + }, + commandCenter: { + title: 'Centro Comandi', + noSessions: 'Nessuna sessione ancora.', + loadingStatus: 'Caricamento stato…', + recentLogs: 'Log recenti', + dailyTokens: 'Token giornalieri', + noActivity: 'Nessuna attività giornaliera.', + noModelUsage: 'Nessun utilizzo modello ancora.', + noSkillActivity: 'Nessuna attività competenze ancora.', + sessionsPanel: 'Pannello sessioni', + systemPanel: 'Pannello sistema', + usagePanel: 'Pannello utilizzo', + navigate: 'Naviga', + noMatchingResults: 'Nessun risultato corrispondente.', + noSessionsYet: 'Nessuna sessione ancora.', + unpinSession: 'Rimuovi sessione', + pinSession: 'Fissa sessione', + exportSession: 'Esporta sessione', + deleteSession: 'Elimina sessione', + gatewayRunning: 'Gateway messaggistica in esecuzione', + gatewayStopped: 'Gateway messaggistica fermo', + restartMsg: 'Riavvia messaggistica', + updateHermes: 'Aggiorna Hermes', + noLogsLoaded: 'Nessun log caricato ancora.', + closeLabel: 'Chiudi centro comandi', + searchPlaceholder: 'Cerca sessioni, viste e azioni', + statSessions: 'Sessioni', + statApiCalls: 'Chiamate API', + statTokens: 'Token in/out', + statEstCost: 'Costo stimato', + cost => `effettivo ${cost}`, + loadingUsage: 'Caricamento utilizzo...', + count => `Nessun utilizzo negli ultimi ${count} giorni.`, + retry: 'Riprova', + tokenInput: 'input', + tokenOutput: 'output', + noDailyActivity: 'Nessuna attività giornaliera.', + topModels: 'Modelli principali', + topSkills: 'Competenze principali', + actionsLabel: 'azioni', + systemRunning: 'in esecuzione', + systemDone: 'completato', + systemFailed: 'fallito', + open: 'Apri Centro Comandi', + close: 'Chiudi Centro Comandi', + }, + common: { + loading: 'Caricamento…', + save: 'Salva', + cancel: 'Annulla', + close: 'Chiudi', + delete: 'Elimina', + confirm: 'Conferma', + search: 'Cerca…', + clearSearch: 'Pulisci ricerca', + copy: 'Copia', + refresh: 'Aggiorna', + moreActions: 'Altre azioni', + tryAgain: 'Riprova', + }, + onboarding: { + welcome: 'Benvenuto in Hermes', + getStarted: 'Inizia scegliendo un provider e un modello.', + skip: 'Salta', + continue: 'Continua', + finish: 'Fine', + setupTitle: 'Configuriamo Hermes Agent', + setupDesc: 'Collega un provider di modelli per iniziare a chattare. La maggior parte delle opzioni richiede un clic.', + preparing: 'Avvio di Hermes…', + installing: 'Hermes sta completando l\'installazione. Di solito richiede meno di un minuto al primo avvio.', + lookingUp: 'Ricerca provider...', + otherProviders: 'Altri provider', + collapse: 'Comprimi', + iHaveKey: 'Ho una chiave API', + recommended: 'Consigliato', + connected: 'Connesso', + backToSignIn: 'Torna all\'accesso', + getKey: 'Ottieni una chiave', + pasteKey: 'Incolla chiave API', + connect: 'Connetti', + connecting: 'Connessione in corso', + copyCode: 'Copia', + startSignIn: 'Avvio accesso per', + verifyingCode: 'Verifica del tuo codice con', + pickingModel: 'connesso. Scelta del modello predefinito...', + signInFailed: 'Accesso fallito. Riprova.', + pickDifferent: 'Scegli un altro provider', + signInTitle: 'Accedi con', + step1: 'Abbiamo aperto', + step1End: 'nel tuo browser.', + step2: 'Autorizza Hermes lì.', + step3: 'Copia il codice di autorizzazione e incollalo qui sotto.', + pasteCode: 'Incolla codice di autorizzazione', + reopenAuth: 'Riapri pagina di autorizzazione', + cancel: 'Annulla', + browserDesc: 'Abbiamo aperto', + browserDescEnd: 'nel tuo browser. Autorizza Hermes lì e sarai connesso automaticamente — nulla da copiare o incollare.', + waitingAuth: 'In attesa della tua autorizzazione...', + reopenSignIn: 'Riapri pagina di accesso', + externalDesc: 'effettua l\'accesso tramite la propria CLI. Esegui questo comando in un terminale, poi torna e scegli "Ho effettuato l\'accesso":', + iSignedIn: 'Ho effettuato l\'accesso', + enterCode: 'Abbiamo aperto', + enterCodeEnd: 'nel tuo browser. Inserisci questo codice lì:', + reopenVerification: 'Riapri pagina di verifica', + defaultModel: 'Modello predefinito', + freeTier: 'Piano gratuito', + pro: 'Pro', + change: 'Cambia', + startChatting: 'Inizia a chattare', + docs: 'documentazione', + close: 'Chiudi', + savingError: 'Impossibile salvare la credenziale.', + openRouter: 'OpenRouter', + }, + file: { + browser: 'Browser File', + noFiles: 'Nessun file ancora.', + }, + terminal: { + title: 'Terminale', + newTab: 'Nuova Scheda', + closeTab: 'Chiudi Scheda', + }, + skills: { + title: 'Competenze', + search: 'Cerca competenze…', + noResults: 'Nessuna competenza trovata.', + tools: 'Competenze e Strumenti', + }, + profiles: { + title: 'Profili', + noProfilesYet: 'Nessun profilo ancora.', + selectProfile: 'Seleziona un profilo per visualizzarne i dettagli.', + deleteProfile: 'Eliminare profilo?', + soulMd: 'SOUL.md', + unsavedChanges: 'Modifiche non salvate', + newProfile: 'Nuovo profilo', + cloneFromDefault: 'Clona dal predefinito', + renameProfile: 'Rinomina profilo', + }, + cron: { + title: 'Cron Job', + noJobs: 'Nessun job pianificato.', + deleteCronJob: 'Eliminare cron job?', + optional: 'Opzionale', + label: 'Cron', + open: 'Apri cron job', + }, + messaging: { + title: 'Messaggistica', + recommended: 'Consigliato', + recommendedTelegram: 'Consigliato. ID numerici separati da virgola da @userinfobot. Senza questo, chiunque può inviare DM al tuo bot.', + recommendedDiscord: 'Consigliato. ID utente Discord separati da virgola.', + recommendedSlack: 'Consigliato. ID utente Slack separati da virgola.', + recommendedMattermost: 'Consigliato. ID utente Mattermost separati da virgola.', + recommendedMatrix: 'Consigliato. ID utente separati da virgola in formato @utente:server.', + recommendedSignal: 'Consigliato. Identificatori Signal separati da virgola.', + recommendedWhatsApp: 'Consigliato. Numeri di telefono o ID WhatsApp separati da virgola.', + gatewayStopped: 'Gateway messaggistica fermo', + getCredentials: 'Ottieni le tue credenziali', + required: 'Obbligatorio', + unsavedChanges: 'Modifiche non salvate', + saved: 'Salvato', + }, + about: { + version: 'Versione', + checkUpdates: 'Verifica aggiornamenti', + upToDate: 'Hermes è aggiornato.', + updateAvailable: 'È disponibile un aggiornamento.', + license: 'Licenza MIT', + hermesDesktop: 'Hermes Desktop', + versionUnavailable: 'Versione non disponibile', + updates: 'Aggiornamenti', + checkNow: 'Verifica ora', + checking: 'Verifica in corso…', + seeWhatsNew: 'Vedi le novità', + releaseNotes: 'Note di rilascio', + autoUpdates: 'Aggiornamenti automatici', + autoUpdatesDesc: 'Hermes verifica automaticamente gli aggiornamenti in background e ti avvisa quando uno è pronto.', + selfUpdateUnsupported: 'Questa build non può aggiornarsi dall\'interno dell\'app.', + cannotReachServer: 'Impossibile raggiungere il server degli aggiornamenti.', + installingUpdate: 'Un aggiornamento è in fase di installazione.', + count => `Un nuovo aggiornamento è pronto (${count} modifica inclusa).`, + count => `Un nuovo aggiornamento è pronto (${count} modifiche incluse).`, + onLatest: 'Stai usando l\'ultima versione.', + tapCheckNow: 'Tocca "Verifica ora" per cercare aggiornamenti.', + time => `Ultima verifica ${time}`, + justNow: 'proprio ora', + never: 'mai', + count => `${count} min fa`, + count => `${count} ore fa`, + count => `${count} giorni fa`, + (branch, sha) => `Branch ${branch} · Commit ${sha}`, + }, + keys: { + title: 'Chiavi API', + noKeys: 'Nessuna chiave API configurata.', + addKey: 'Aggiungi Chiave', + loading: 'Caricamento chiavi API e credenziali…', + docs: 'Documentazione', + openDocs: 'Apri documentazione provider', + hideValue: 'Nascondi valore', + revealValue: 'Mostra valore', + set: 'Imposta', + notSet: 'Non impostata', + replace: 'Sostituisci', + replaceValue: 'Sostituisci valore attuale', + enterValue: 'Inserisci valore', + saving: 'Salvataggio', + save: 'Salva', + cancel: 'Annulla', + clearValue: 'Cancella valore', + (count, total) => `${count} di ${total} configurate`, + (count, total) => `${count} di ${total} impostate`, + count => `${count} impostate`, + count => `${count} chiavi`, + otherProviders: 'Altri provider', + categoryTools: 'Strumenti', + categoryMessaging: 'Messaggistica', + categorySettings: 'Impostazioni', + showAdvanced: 'Mostra avanzate', + loadFailed: 'Caricamento chiavi API fallito', + credentialSaved: 'Credenziale salvata', + credentialRemoved: 'Credenziale rimossa', + openProviderDocs: 'Apri documentazione provider', + }, + config: { + title: 'Configurazione', + edit: 'Modifica Configurazione', + reload: 'Ricarica Configurazione', + notSet: 'Non impostato', + commaSeparated: 'valori separati da virgola', + on: 'Attivo', + off: 'Disattivo', + none: 'Nessuno', + emptyOption: '(nessuno)', + loading: 'Caricamento configurazione Hermes…', + noMatching: 'Nessuna impostazione corrispondente', + noMatchingDesc: 'Prova un termine di ricerca diverso o scegli un\'altra sezione.', + count => `${count} risultato`, + count => `${count} risultati`, + saving: 'Salvataggio…', + label: { + defaultModel: 'Modello Predefinito', + contextWindow: 'Finestra di Contesto', + fallbackModels: 'Modelli di Fallback', + enabledToolsets: 'Strumenti Abilitati', + timezone: 'Fuso Orario', + personality: 'Personalità', + reasoningBlocks: 'Blocchi di Ragionamento', + maxAgentSteps: 'Passi Massimi Agente', + imageAttachments: 'Allegati Immagine', + workingDirectory: 'Directory di Lavoro', + executionBackend: 'Backend di Esecuzione', + commandTimeout: 'Timeout Comandi', + persistentShell: 'Shell Persistente', + envPassthrough: 'Passaggio Variabili d\'Ambiente', + fileReadLimit: 'Limite Lettura File', + terminalOutputLimit: 'Limite Output Terminale', + filePageLimit: 'Limite Pagine File', + lineLengthLimit: 'Limite Lunghezza Righe', + codeExecutionMode: 'Modalità Esecuzione Codice', + approvalMode: 'Modalità Approvazione', + approvalTimeout: 'Timeout Approvazione', + confirmMcpReloads: 'Conferma Ricarica MCP', + commandAllowlist: 'Lista Comandi Consentiti', + redactSecrets: 'Oscura Segreti', + allowPrivateUrls: 'Consenti URL Privati', + browserPrivateUrls: 'Browser URL Privati', + localBrowserForPrivateUrls: 'Browser Locale per URL Privati', + fileCheckpoints: 'Checkpoint File', + checkpointLimit: 'Limite Checkpoint', + voiceShortcut: 'Scorciatoia Voce', + maxRecordingLength: 'Durata Massima Registrazione', + readResponsesAloud: 'Leggi Risposte ad Alta Voce', + speechToText: 'Riconoscimento Vocale', + speechToTextProvider: 'Provider Riconoscimento Vocale', + localTranscriptionModel: 'Modello Trascrizione Locale', + transcriptionLanguage: 'Lingua Trascrizione', + elevenlabsSttModel: 'Modello STT ElevenLabs', + elevenlabsLanguage: 'Lingua ElevenLabs', + tagAudioEvents: 'Etichetta Eventi Audio', + speakerDiarization: 'Diarizzazione Parlatori', + textToSpeechProvider: 'Provider Sintesi Vocale', + edgeVoice: 'Voce Edge', + openaiTtsModel: 'Modello TTS OpenAI', + openaiVoice: 'Voce OpenAI', + elevenlabsVoice: 'Voce ElevenLabs', + elevenlabsModel: 'Modello ElevenLabs', + persistentMemory: 'Memoria Persistente', + userProfile: 'Profilo Utente', + memoryBudget: 'Budget Memoria', + profileBudget: 'Budget Profilo', + memoryProvider: 'Provider Memoria', + contextEngine: 'Motore di Contesto', + autoCompression: 'Compressione Automatica', + compressionThreshold: 'Soglia Compressione', + compressionTarget: 'Obiettivo Compressione', + protectedRecentMessages: 'Messaggi Recenti Protetti', + apiRetries: 'Tentativi API', + serviceTier: 'Livello Servizio', + toolUseEnforcement: 'Obbligo Uso Strumenti', + subagentModel: 'Modello Subagente', + subagentProvider: 'Provider Subagente', + subagentTurnLimit: 'Limite Turni Subagente', + parallelSubagents: 'Subagenti Paralleli', + subagentTimeout: 'Timeout Subagente', + subagentReasoningEffort: 'Sforzo Ragionamento Subagente', + }, + desc: { + defaultModel: 'Usato per nuove chat a meno che non si scelga un modello diverso nel compositore.', + contextWindow: 'Lascia a 0 per usare la finestra di contesto rilevata del modello selezionato.', + fallbackModels: 'Voci provider:modello di backup da provare se il modello predefinito fallisce.', + personality: 'Stile predefinito dell\'assistente per le nuove sessioni.', + timezone: 'Usato quando Hermes ha bisogno del contesto orario locale. Vuoto usa il fuso orario di sistema.', + reasoningBlocks: 'Mostra le sezioni di ragionamento quando il backend le fornisce.', + imageAttachments: 'Controlla come gli allegati immagine vengono inviati al modello.', + workingDirectory: 'Cartella di progetto predefinita per il lavoro con strumenti e terminale.', + codeExecutionMode: 'Quanto rigorosamente l\'esecuzione del codice è limitata al progetto corrente.', + persistentShell: 'Mantieni lo stato della shell tra i comandi quando il backend lo supporta.', + envPassthrough: 'Variabili d\'ambiente da passare all\'esecuzione degli strumenti.', + fileReadLimit: 'Caratteri massimi che Hermes può leggere da una richiesta di file.', + approvalMode: 'Come Hermes gestisce i comandi che richiedono approvazione esplicita.', + approvalTimeout: 'Quanto tempo attendono i prompt di approvazione prima di scadere.', + redactSecrets: 'Nascondi i segreti rilevati dal contenuto visibile al modello quando possibile.', + fileCheckpoints: 'Crea snapshot di ripristino prima delle modifiche ai file.', + persistentMemory: 'Salva memorie durevoli che possono aiutare le sessioni future.', + userProfile: 'Mantieni un profilo compatto delle preferenze utente.', + contextEngine: 'Strategia per gestire conversazioni lunghe vicino al limite di contesto.', + autoCompression: 'Riassumi il contesto più vecchio quando le conversazioni diventano grandi.', + readResponsesAloud: 'Leggi automaticamente le risposte dell\'assistente ad alta voce.', + speechToText: 'Abilita la trascrizione vocale locale o tramite provider.', + elevenlabsLanguage: 'Codice lingua ISO-639-3 opzionale. Vuoto lascia che ElevenLabs rilevi automaticamente.', + maxAgentSteps: 'Limite superiore per i turni di chiamata strumenti prima che Hermes interrompa un\'esecuzione.', + }, + }, + gateway: { + title: 'Gateway', + start: 'Avvia Gateway', + stop: 'Ferma Gateway', + restart: 'Riavvia Gateway', + running: 'In esecuzione', + stopped: 'Fermo', + loading: 'Caricamento impostazioni gateway…', + unavailable: 'Impostazioni gateway non disponibili', + unavailableDesc: 'Il bridge IPC desktop non espone le impostazioni del gateway.', + connection: 'Connessione Gateway', + envOverride: 'sovrascrittura env', + desc: 'Hermes Desktop avvia il proprio gateway locale per impostazione predefinita. Usa un gateway remoto quando vuoi che questa app controlli un backend Hermes già in esecuzione su un\'altra macchina o dietro un proxy affidabile.', + envOverrideTitle: 'Le variabili d\'ambiente stanno controllando questa sessione desktop.', + (urlVar, tokenVar) => `Rimuovi ${urlVar} e ${tokenVar} per usare l'impostazione salvata qui sotto.`, + localTitle: 'Gateway locale', + localDesc: 'Avvia un backend Hermes privato su localhost. Questa è l\'impostazione predefinita e funziona offline.', + remoteTitle: 'Gateway remoto', + remoteDesc: 'Collega questa shell desktop a un backend Hermes remoto usando il suo token di sessione.', + remoteUrl: 'URL Remoto', + remoteUrlDesc: 'URL base per il backend dashboard remoto. I prefissi di percorso sono supportati, ad esempio /hermes.', + remoteUrlPlaceholder: 'https://gateway.example.com/hermes', + sessionToken: 'Token di sessione', + sessionTokenDesc: 'Il token di sessione dashboard usato per l\'accesso REST e WebSocket. Lascia vuoto per mantenere il token salvato.', + sessionTokenPlaceholder: 'Incolla token di sessione', + preview => `Token esistente ${preview}`, + tokenSaved: 'salvato', + testRemote: 'Test remoto', + saveRestart: 'Salva per il prossimo riavvio', + saveReconnect: 'Salva e riconnetti', + diagnostics: 'Diagnostica', + diagnosticsDesc: 'Mostra desktop.log nel tuo file manager — utile quando il gateway non si avvia.', + openLogs: 'Apri log', + connected: 'Connesso', + connecting: 'Connessione in corso', + disconnected: 'Disconnesso', + inferenceReady: 'Inferenza pronta', + inferenceNotReady: 'Inferenza non pronta', + checkingInference: 'Verifica inferenza', + openSystemPanel: 'Apri pannello di sistema', + connectionLabel: 'Connessione:', + recentActivity: 'Attività recente', + viewAllLogs: 'Vedi tutti i log →', + messagingPlatforms: 'Piattaforme di messaggistica', + enterUrlFirst: 'Inserisci un URL remoto e un token di sessione prima di cambiare', + enterUrlFirstTest: 'Inserisci un URL remoto e un token di sessione prima di testare', + label: 'Gateway', + inferenceStatus: 'Stato inferenza gateway', + }, + sessions: { + title: 'Sessioni', + search: 'Cerca sessioni…', + noResults: 'Nessuna sessione trovata.', + export: 'Esporta', + delete: 'Elimina Sessione', + loading: 'Caricamento…', + defaultProjectDir: 'Directory di progetto predefinita', + defaultProjectDirDesc: 'Le nuove sessioni iniziano in questa cartella a meno che non ne scelga un\'altra. Lascia vuoto per usare la tua home directory.', + fallback => `Predefinito: ${fallback}.`, + notSet: 'Non impostata', + change: 'Cambia', + choose: 'Scegli', + clear: 'Pulisci', + archivedTitle: 'Sessioni archiviate', + archivedDesc: 'Le chat archiviate sono nascoste dalla barra laterale ma conservano tutti i messaggi. Ctrl/⌘-clic su una chat nella barra laterale per archiviarla.', + nothingArchived: 'Niente archiviato', + noSearchMatch: 'Nessuna chat archiviata corrisponde alla ricerca.', + archiveToHide: 'Archivia una chat per nasconderla qui.', + unarchive: 'Disarchivia', + deletePermanently: 'Elimina definitivamente', + count => `${count} messaggi`, + new: 'Nuova sessione', + running: 'Sessione in esecuzione', + actions: 'Azioni sessione', + reorder: 'Riordina', + pin: 'Fissa', + unpin: 'Rimuovi', + copyId: 'Copia ID', + rename: 'Rinomina', + archive: 'Archivia', + renameDialog: 'Rinomina sessione', + renameDesc: 'Dai a questa chat un titolo memorabile. Lascia vuoto per cancellare.', + untitled: 'Sessione senza titolo', + renamed: 'Rinominata', + renameFailed: 'Rinomina fallita', + pinned: 'Fissata', + results: 'Risultati', + allPinned: 'Tutto qui è fissato. Rimuovi una chat per mostrarla nei recenti.', + pinHint: 'Shift-clic per fissare · trascina per riordinare', + loadMore: 'Carica altro', + noWorkspace: 'Nessuna area di lavoro', + ungroup: 'Mostra sessioni come lista unica', + groupByWorkspace: 'Raggruppa sessioni per area di lavoro', + loadStep: 'Carica', + moreLabel: 'altro', + nothingArchivedTitle: 'Niente archiviato', + deletePermanentlyTitle: 'Elimina definitivamente', + defaultProjectDirTitle: 'Directory di progetto predefinita', + loadingArchived: 'Caricamento sessioni archiviate…', + restored: 'Ripristinata', + projectDirUpdated: 'Directory di progetto predefinita aggiornata', + loadFailed: 'Impossibile caricare le sessioni archiviate', + unarchiveFailed: 'Disarchiviazione fallita', + deleteFailed: 'Eliminazione fallita', + archiveHint: 'Archivia una chat per nasconderla qui.', + updateDirFailed: 'Impossibile aggiornare la directory predefinita', + clearDirFailed: 'Impossibile cancellare la directory predefinita', + }, + mcp: { + title: 'Server MCP', + addServer: 'Aggiungi Server', + noServers: 'Nessun server MCP configurato.', + loading: 'Caricamento server MCP…', + servers: 'Server MCP', + count => `${count} configurati`, + newServer: 'Nuovo server', + reloadMCP: 'Ricarica MCP', + reloading: 'Ricaricamento...', + noServersDesc: 'Aggiungi un server stdio o HTTP per esporre strumenti MCP.', + name: 'Nome', + namePlaceholder: 'filesystem', + serverJSON: 'JSON Server', + editServer: 'Modifica server', + saveServer: 'Salva server', + saving: 'Salvataggio...', + remove: 'Rimuovi', + disabled: 'disabilitato', + nameRequired: 'Nome obbligatorio', + nameRequiredDesc: 'Assegna una chiave di configurazione a questo server MCP.', + invalidJson: 'La configurazione del server deve essere un oggetto JSON', + invalidJsonDesc: 'JSON MCP non valido', + saved: 'Server MCP salvato', + name => `${name} si applica dopo il ricaricamento MCP.`, + saveFailed: 'Salvataggio fallito', + removeFailed: 'Rimozione fallita', + gatewayUnavailable: 'Gateway non disponibile', + gatewayUnavailableDesc: 'Riconnetti il gateway prima di ricaricare MCP.', + reloadedTitle: 'Strumenti MCP ricaricati', + reloadedDesc: 'I nuovi schemi strumento si applicano ai nuovi turni.', + reloadFailed: 'Ricarica MCP fallita', + giveConfigKey: 'Assegna una chiave di configurazione a questo server MCP.', + reconnectGateway: 'Riconnetti il gateway prima di ricaricare MCP.', + newSchemas: 'I nuovi schemi strumento si applicano ai nuovi turni.', + loadingServers: 'Caricamento server MCP...', + serverName: 'Nome', + serversTitle: 'Server MCP', + noServersTitle: 'Nessun server MCP', + failedToLoad: 'Caricamento configurazione MCP fallito', + invalidJsonShort: 'JSON MCP non valido', + serverSaved: 'Server MCP salvato', + toolsReloaded: 'Strumenti MCP ricaricati', + emptyDesc: 'Aggiungi un server stdio o HTTP per esporre strumenti MCP.', + }, + tools: { + title: 'Strumenti e Competenze', + noTools: 'Nessuno strumento disponibile.', + }, + nav: { + home: 'Home', + chat: 'Chat', + settings: 'Impostazioni', + files: 'File', + terminal: 'Terminale', + }, + header: { + search: 'Cerca o digita un comando…', + }, + model: { + auxTask: { + vision: 'Visione', + visionHint: 'Analisi immagini', + web_extract: 'Estrazione web', + web_extractHint: 'Riassunto pagine', + compression: 'Compressione', + compressionHint: 'Compattazione contesto', + session_search: 'Ricerca sessioni', + session_searchHint: 'Query di richiamo', + skills_hub: 'Hub competenze', + skills_hubHint: 'Ricerca competenze', + approval: 'Approvazione', + approvalHint: 'Auto-approvazione intelligente', + mcp: 'MCP', + mcpHint: 'Routing strumenti MCP', + title_generation: 'Generazione titoli', + title_generationHint: 'Titoli sessione', + curator: 'Curatore', + curatorHint: 'Revisione uso competenze', + }, + mainModel: 'Modello principale', + mainDesc: 'Si applica alle nuove sessioni. Usa il selettore modello nel compositore per cambiare al volo la chat attiva.', + providerPlaceholder: 'Provider', + modelPlaceholder: 'Modello', + apply: 'Applica', + applying: 'Applicazione…', + auxiliaryModels: 'Modelli ausiliari', + auxiliaryDesc: 'Le attività ausiliarie usano il modello principale per impostazione predefinita. Assegna un modello dedicato a qualsiasi attività per sovrascrivere.', + resetAllToMain: 'Reimposta tutto al principale', + setToMain: 'Imposta al principale', + change: 'Cambia', + cancel: 'Annulla', + autoUseMain: 'auto · usa modello principale', + providerDefault: '(predefinito provider)', + loading: 'Caricamento configurazione modello…', + options: 'Opzioni', + thinking: 'Ragionamento', + fast: 'Veloce', + effort: 'Sforzo', + noOptions: 'Nessuna opzione per questo modello', + optionUpdateFailed: 'Aggiornamento opzione modello fallito', + fastModeUpdateFailed: 'Aggiornamento modalità veloce fallito', + effortMinimal: 'Minimo', + effortLow: 'Basso', + effortMedium: 'Medio', + effortHigh: 'Alto', + effortMax: 'Massimo', + switch: 'Cambia modello', + unknown: '(sconosciuto)', + filterPlaceholder: 'Filtra provider e modelli...', + persistGlobal: 'Rendi globale', + persistGlobalSession: 'Rendi globale (altrimenti solo questa sessione)', + couldNotLoad: 'Impossibile caricare i modelli', + proLockedDesc: 'I modelli Pro richiedono un abbonamento Nous a pagamento.', + priceTooltip: 'Prezzo input/output per milione di token', + freePrice: 'Gratuito', + currentLabel: 'attuale:', + addProviderBtn: 'Aggiungi provider', + }, + models: { + title: 'Modelli', + search: 'Cerca modelli', + addProvider: 'Aggiungi provider…', + }, + updates: { + checking: 'Verifica aggiornamenti…', + available: 'Aggiornamento disponibile', + downloading: 'Download in corso…', + installing: 'Installazione in corso…', + restart: 'Riavvia per aggiornare', + stageGettingReady: 'Preparazione…', + stageDownloading: 'Download in corso…', + stageAlmostThere: 'Quasi pronto…', + stageFinishingUp: 'Completamento…', + stageRestarting: 'Riavvio di Hermes…', + stageManual: 'Aggiorna dal tuo terminale', + stageError: 'Aggiornamento in pausa', + updatingHermes: 'Aggiornamento di Hermes…', + lookingForUpdates: 'Ricerca aggiornamenti…', + couldntCheck: 'Impossibile verificare gli aggiornamenti', + updateNotAvailable: 'Aggiornamento non disponibile', + checkConnection: 'Verifica la tua connessione e riprova.', + onLatest: 'Stai usando l\'ultima versione.', + allSet: 'Tutto a posto', + newUpdateAvailable: 'Nuovo aggiornamento disponibile', + readyToInstall: 'Una nuova versione di Hermes è pronta per l\'installazione.', + updateNow: 'Aggiorna ora', + maybeLater: 'Forse più tardi', + count => `+ ${count} altra modifica inclusa.`, + count => `+ ${count} altre modifiche incluse.`, + updateFromTerminal: 'Aggiorna dal tuo terminale', + terminalDesc: 'Hai installato Hermes dalla riga di comando, quindi anche gli aggiornamenti vengono eseguiti lì. Incolla questo nel tuo terminale:', + copied: 'Copiato', + copy: 'Copia', + pickupNewVersion: 'Hermes rileverà la nuova versione al prossimo avvio.', + done: 'Fatto', + updaterDesc: 'L\'aggiornatore di Hermes prenderà il controllo nella sua finestra e riaprirà Hermes al termine.', + closeToApply: 'Hermes si chiuderà per applicare l\'aggiornamento.', + updateDidntFinish: 'L\'aggiornamento non è stato completato', + nothingLost: 'Nessun problema — non è stato perso nulla. Puoi riprovare ora.', + notNow: 'Non ora', + }, + errors: { + generic: 'Qualcosa è andato storto.', + notFound: 'Pagina non trovata.', + noPermission: 'Non hai il permesso di accedere a questo.', + somethingBroke: 'Qualcosa si è rotto nell\'interfaccia', + viewCrashedDesc: 'La vista ha incontrato un errore imprevisto. Le tue chat e impostazioni sono al sicuro - riprova o ricarica la finestra.', + noProviders: 'Nessun provider autenticato.', + }, + tool: { + toolCall: 'Chiamata Strumento', + result: 'Risultato', + error: 'Errore', + timeout: 'Scaduto', + cancelled: 'Annullato', + running: 'In esecuzione', + recovered: 'Ripristinato', + done: 'Completato', + output: 'Output strumento', + searchResults: 'Risultati ricerca', + rawResponse: 'Risposta grezza', + stdout: 'stdout', + stderr: 'stderr', + copyActivity: 'Copia attività', + recoveredAfter: 'Ripristinato dopo 1 passo fallito', + count => `Ripristinato dopo ${count} passi falliti`, + oneStepFailed: '1 passo fallito', + count => `${count} passi falliti`, + }, + composer: { + startingHermes: 'Avvio di Hermes...', + sendFollowUp: 'Invia seguito', + message: 'Messaggio', + editingQueued: 'Modifica turno in coda nel compositore', + attach: 'Allega', + files: 'File…', + folder: 'Cartella…', + images: 'Immagini…', + pasteImage: 'Incolla immagine', + url: 'URL…', + promptSnippets: 'Frammenti prompt', + promptSnippetsDesc: 'Scegli un prompt iniziale da inserire nel compositore.', + voiceStart: 'Avvia conversazione vocale', + queue: 'Accoda messaggio', + speaking: 'In riproduzione', + transcribing: 'Trascrizione in corso', + muted: 'Muto', + listening: 'In ascolto', + unmuteMic: 'Riattiva microfono', + muteMic: 'Disattiva microfono', + stopListening: 'Ferma ascolto e invia', + endVoice: 'Termina conversazione vocale', + end: 'Fine', + stopDictation: 'Ferma dettatura', + transcribingDictation: 'Trascrizione dettatura in corso', + voiceDictation: 'Dettatura vocale', + addContext: 'Aggiungi contesto', + }, + previewConsole: { + resizeLabel: 'Ridimensiona console anteprima', + noMessages: 'Nessun messaggio console ancora.', + }, + urlDialog: { + title: 'Allega un URL', + description: 'Hermes recupererà la pagina e la includerà come contesto per questo turno.', + placeholder: 'https://esempio.com/articolo', + hint: 'Includi l\'URL completo, ad es.', + attach: 'Allega', + }, + boot: { + ipcUnavailable: 'Il bridge IPC desktop non è disponibile.', + backendExited: 'Il processo in background di Hermes è terminato durante l\'avvio.', + backendStoppedTitle: 'Backend fermo', + backendStoppedMessage: 'Il processo in background di Hermes è terminato.', + startingConnection: 'Avvio connessione desktop', + connectingGateway: 'Connessione gateway desktop attivo', + loadingConfig: 'Caricamento impostazioni Hermes', + loadingSessions: 'Caricamento sessioni recenti', + desktopBootFailed: 'Avvio desktop fallito', + couldNotStart: 'Hermes non è riuscito ad avviarsi', + recoveryDesc: 'Il gateway in background non si è avviato. Prova una delle seguenti procedure di ripristino — nulla qui elimina le tue chat o impostazioni.', + retry: 'Riprova', + repairInstall: 'Ripara installazione', + useLocalGateway: 'Usa gateway locale', + openLogs: 'Apri log', + repairHint: 'La riparazione riesegue il programma di installazione e può richiedere alcuni minuti su una macchina nuova.', + showLogs: 'Mostra log recenti', + hideLogs: 'Nascondi log recenti', + }, + bootstrap: { + pending: 'In attesa', + running: 'Installazione in corso', + done: 'Completato', + skipped: 'Saltato', + failed: 'Fallito', + }, + install: { + title: 'Hermes richiede un\'installazione unica', + desc: 'L\'installazione automatica al primo avvio non è disponibile su', + descEnd: 'ancora. Apri Terminale ed esegui il comando qui sotto, poi riavvia questa app. Gli avvii successivi salteranno questo passaggio.', + installCommand: 'Comando di installazione', + copyCommand: 'Copia comando', + viewDocs: 'Visualizza documentazione installazione', + willInstallTo: 'Verrà installato in', + iRanIt: 'L\'ho eseguito -- riprova', + failed: 'Installazione fallita', + settingUp: 'Configurazione di Hermes Agent', + finishingUp: 'Completamento', + failedDesc: 'Uno dei passaggi di installazione è fallito. Su Windows, questo può accadere se un\'altra CLI Hermes o istanza desktop è in esecuzione. Ferma tutte le istanze Hermes in esecuzione, poi riprova. Controlla i dettagli qui sotto o il log desktop per la trascrizione completa.', + setupDesc: 'Questa è una configurazione unica. Il programma di installazione di Hermes sta scaricando le dipendenze e configurando la tua macchina. Gli avvii successivi salteranno questo passaggio.', + fetchingManifest: 'Recupero manifesto di installazione...', + error: 'Errore', + showOutput: 'Mostra output installazione', + hideOutput: 'Nascondi output installazione', + noOutput: 'Nessun output ancora.', + cancelInstall: 'Annulla installazione', + cancelling: 'Annullamento...', + copyOutput: 'Copia output', + copied: 'Copiato!', + reloadRetry: 'Ricarica e riprova', + saveLogs: 'Trascrizione completa salvata in', + stepsComplete: 'passi completati', + nowLabel: 'ora', + line: 'riga', + lines: 'righe', + }, + titlebar: { + hideSidebar: 'Nascondi barra laterale', + showSidebar: 'Mostra barra laterale', + search: 'Cerca', + searchTitle: 'Cerca sessioni, viste e azioni', + hideRightSidebar: 'Nascondi barra laterale destra', + showRightSidebar: 'Mostra barra laterale destra', + unmuteHaptics: 'Riattiva feedback tattile', + muteHaptics: 'Disattiva feedback tattile', + openSettings: 'Apri impostazioni', + profiles: 'Profili', + profilesDesc: 'Ambienti Hermes avanzati per persone, configurazioni, competenze e SOUL.md separati.', + manageProfiles: 'Gestisci profili', + language: 'Lingua', + languageDesc: 'Scegli una lingua di visualizzazione per l\'interfaccia.', + }, + sidebar: { + sheetTitle: 'Barra laterale', + sheetDesc: 'Mostra la barra laterale mobile.', + toggle: 'Attiva/Disattiva Barra Laterale', + }, + clarify: { + hermesIsAsking: 'Hermes sta chiedendo', + loadingQuestion: 'Caricamento domanda…', + otherTypeAnswer: 'Altro (digita la risposta)', + placeholderAnswer: 'Digita la tua risposta…', + cmdEnterToSend: '⌘/Ctrl + Invio per inviare', + back: 'Indietro', + skip: 'Salta', + couldNotSend: 'Impossibile inviare la risposta di chiarimento', + n => `1–${n} per scegliere`, + }, + pagination: { + ariaLabel: 'paginazione', + prevAria: 'Vai alla pagina precedente', + prev: 'Prec', + nextAria: 'Vai alla pagina successiva', + next: 'Succ', + }, + intro: { + fallback1h: 'Cosa muoviamo oggi?', + fallback1b: 'Inviami un bug, branch, piano o idea approssimativa. Ispezionerò il repository e lo trasformerò nel prossimo passo concreto.', + fallback2h: 'A cosa stai pensando?', + fallback2b: 'Porta il codice, la domanda o la parte bloccata. Leggerò la stanza prima di fare modifiche.', + fallback3h: 'Cosa dovrebbe guardare Hermes?', + fallback3b: 'Inviami il compito, il percorso fallito o il piano a metà. Ti aiuterò a trasformarlo in azione.', + fallback4h: 'Da dove iniziamo?', + fallback4b: 'Porta il problema, l\'obiettivo o il file. Ispezionerò prima e manterrò il prossimo passo concreto.', + fallback5h: 'Cosa richiede attenzione?', + fallback5b: 'Inviami il contesto che hai. Ti aiuterò a organizzarlo in un piano o una correzione.', + personality: { + label => `La modalità ${label} è attiva. Su cosa dovremmo lavorare?`, + body1: 'Inviami il compito, il file o l\'idea approssimativa. Userò la tua voce configurata e manterrò il lavoro ancorato a questo repository.', + label => `Cosa deve vedere ${label} Hermes?`, + body2: 'Porta il contesto o la parte bloccata. Mi adatterò alla tua personalità configurata.', + label => `La modalità ${label} è pronta.`, + body3: 'Inviami il problema, il file o l\'idea. Seguirò la personalità che hai configurato.', + label => `Cosa dovrebbe affrontare ${label} Hermes?`, + body4: 'Lascia il compito qui. Manterrò il lavoro ancorato al repository.', + heading5: 'Da dove iniziamo?', + label => `Dammi il contesto e risponderò in modalità ${label}.`, + }, + brand: 'HERMES AGENT', + }, + artifacts: { + noArtifactsFound: 'Nessun artefatto trovato', + }, + agents: { + spawnTree: 'Albero di generazione', + liveSubagentActivity: 'Attività subagenti in tempo reale per il turno corrente.', + noLiveSubagents: 'Nessun subagente attivo', + files: 'File', + label: 'Agenti', + open: 'Apri agenti', + close: 'Chiudi agenti', + subagent: 'subagente', + subagents: 'subagenti', + failed: 'fallito', + running: 'in esecuzione', + }, + provider: { + desc: { + nousPortal: 'Override URL base Nous Portal', + openRouter: 'Chiave API OpenRouter (per visione, helper web scraping e MoA)', + google: 'Chiave API Google AI Studio (riconosciuta anche come GEMINI_API_KEY)', + gemini: 'ID progetto GCP per piani Gemini a pagamento (il piano gratuito si auto-provvigiona)', + anthropic: 'Chiave API Anthropic', + deepseek: 'URL base API DeepSeek personalizzato (avanzato)', + xai: 'Override URL base xAI', + huggingface: 'Override URL base Hugging Face Inference Providers', + kimi: 'Chiave API Kimi / Moonshot Cina', + minimax: 'Override URL base MiniMax (Cina)', + minimaxCn: 'Chiave API MiniMax Cina', + dashscope: 'URL base DashScope personalizzato (predefinito: endpoint compatibile OpenAI coding-intl)', + glm: 'Chiave API GLM (Z.AI)', + nvidia: 'Override URL base NVIDIA NIM (es. http://localhost:8000/v1 per NIM locale)', + opencodeGo: 'Chiave API OpenCode Go', + opencodeZen: 'Chiave API OpenCode Zen', + xiaomi: 'Override URL base Xiaomi MiMo (predefinito: https://api.xiaomimimo.com/v1)', + kiloCode: 'Chiave API Kilo Code', + aiGateway: 'Chiave API AI Gateway (Vercel AI Gateway)', + browserbase: 'BROWSERBASE_API_KEY', + elevenLabs: 'Chiave API ElevenLabs', + openai: 'Chiave API OpenAI (per elaborazione vocale tramite proxy)', + mistral: 'Chiave API Mistral (per STT/TTS)', + groq: 'Chiave API Groq (per STT)', + tavily: 'TAVILY_API_KEY', + firecrawl: 'URL API Firecrawl per istanze self-hosted (opzionale)', + fal: 'FAL_KEY', + nous: 'Override URL base Nous Portal', + openrouter: 'Chiave API OpenRouter (per visione, helper web scraping e MoA)', + lmstudio: 'Override URL base Z.AI / GLM', + zai: 'URL base Azure Foundry (imposta tramite \'hermes model\' per configurazione specifica endpoint)', + stepfun: 'Override URL base StepFun Step Plan', + arcee: 'Override URL base Arcee AI', + gmi: 'Override URL base GMI Cloud', + qwenportal: 'Override URL base Qwen Portal (predefinito: https://portal.qwen.ai/v1)', + opencodego: 'Override URL base OpenCode Go', + ollamacloud: 'Override URL base Ollama Cloud (predefinito: https://ollama.com/v1)', + awsbedrock: 'Profilo AWS nominato per autenticazione Bedrock (da ~/.aws/credentials)', + exa: 'Chiave API Exa per ricerca web e contenuti AI-nativi', + parallel: 'Chiave API Parallel per ricerca web ed estrazione AI-nativi', + }, + }, +} +) diff --git a/apps/desktop/src/i18n/ko.ts b/apps/desktop/src/i18n/ko.ts new file mode 100644 index 000000000000..6dbdde1db973 --- /dev/null +++ b/apps/desktop/src/i18n/ko.ts @@ -0,0 +1,953 @@ +import { defineLocale } from './define-locale' + +export const ko = defineLocale( +{ + appearance: { + title: '외관', + description: '데스크톱 전용 디스플레이 설정입니다. 모드는 밝기를 제어하고, 테마는 악센트 팔레트와 채팅 화면 스타일을 제어합니다.', + colorMode: '색상 모드', + colorModeDesc: '고정 모드를 선택하거나 시스템 설정을 따르도록 합니다.', + theme: { + nous: 'Nous', + nousDesc: '글라스 뉴트럴 톤에 Nous 블루 악센트', + midnight: '미드나잇', + midnightDesc: '깊은 블루-바이올렛과 시원한 악센트', + ember: '엠버', + emberDesc: '따뜻한 크림슨과 브론즈 - 대장간 분위기', + mono: '모노', + monoDesc: '깔끔한 그레이스케일 - 미니멀하고 집중도 높은', + cyberpunk: '사이버펑크', + cyberpunkDesc: '검은 바탕에 네온 그린 - 매트릭스 터미널', + slate: '슬레이트', + slateDesc: '차분한 슬레이트 블루 - 개발자 집중 테마', + }, + themeDesc: '채팅 화면과 인터페이스 악센트에 사용할 색상 팔레트를 선택하세요.', + mode: { + light: '라이트', + lightDesc: '밝은 데스크톱 화면', + dark: '다크', + darkDesc: '눈부심이 적은 작업 공간', + system: '시스템', + systemDesc: 'OS 설정을 따릅니다', + }, + language: '언어', + languageDesc: 'UI 언어를 선택하거나 시스템 설정을 따릅니다.', + toolCallDisplay: '도구 호출 표시', + toolCallDisplayDesc: 'Product는 원시 도구 페이로드를 숨기고, Technical은 전체 입출력을 표시합니다.', + toolViewProduct: '프로덕트', + toolViewTechnical: '테크니컬', + toolViewProductDesc: '간결한 요약으로 사람 친화적인 도구 활동을 표시합니다.', + toolViewTechnicalDesc: '원시 도구 인자/결과와 저수준 세부 정보를 포함합니다.', + }, + settings: { + title: '설정', + appearance: '외관', + model: '모델', + gateway: '게이트웨이', + sessions: '세션', + tools: '도구 & 스킬', + section: { + chat: '채팅', + workspace: '작업 공간', + safety: '안전', + memory: '메모리 & 컨텍스트', + voice: '음성', + advanced: '고급', + }, + mcp: 'MCP 서버', + config: '설정', + keys: 'API 키', + about: '정보', + closeSettings: '설정 닫기', + archivedChats: '보관된 채팅', + exportConfig: '설정 내보내기', + importConfig: '설정 가져오기', + resetDefaults: '기본값으로 초기화', + llmProviders: 'LLM 제공자', + searchPlaceholder: { + about: 'Hermes Desktop 정보', + config: '설정 검색…', + gateway: '게이트웨이 연결…', + keys: 'API 키 검색…', + mcp: 'MCP 서버 검색…', + sessions: '보관된 세션 검색…', + }, + }, + chat: { + placeholder: '무엇이든 물어보세요…', + send: '보내기', + stop: '중지', + thinking: '생각 중…', + noSession: '활성 세션이 없습니다. 새 대화를 시작하세요.', + loadingSession: '세션 로딩 중', + loadingResponse: 'Hermes가 응답을 불러오는 중', + branchInNewChat: '새 채팅에서 분기', + readAloud: '소리내어 읽기', + preparingAudio: '오디오 준비 중...', + stopReading: '읽기 중지', + editMessage: '메시지 편집', + editableCheckpoint: '편집 가능한 체크포인트', + restoreCheckpoint: '체크포인트 복원', + goForward: '앞으로 가기', + restorePrevCheckpoint: '이전 체크포인트 복원', + restoreNextCheckpoint: '다음 체크포인트 복원', + composerTip: '팁: @를 입력하여 파일을 인라인으로 참조하세요.', + reconnecting: 'Hermes에 재연결 중…', + }, + commandCenter: { + title: '커맨드 센터', + noSessions: '아직 세션이 없습니다.', + loadingStatus: '상태 로딩 중…', + recentLogs: '최근 로그', + dailyTokens: '일일 토큰', + noActivity: '일일 활동이 없습니다.', + noModelUsage: '아직 모델 사용 내역이 없습니다.', + noSkillActivity: '아직 스킬 활동이 없습니다.', + sessionsPanel: '세션 패널', + systemPanel: '시스템 패널', + usagePanel: '사용량 패널', + navigate: '이동', + noMatchingResults: '일치하는 결과를 찾을 수 없습니다.', + noSessionsYet: '아직 세션이 없습니다.', + unpinSession: '세션 고정 해제', + pinSession: '세션 고정', + exportSession: '세션 내보내기', + deleteSession: '세션 삭제', + gatewayRunning: '메시징 게이트웨이 실행 중', + gatewayStopped: '메시징 게이트웨이 중지됨', + restartMsg: '메시징 재시작', + updateHermes: 'Hermes 업데이트', + noLogsLoaded: '아직 로그가 로드되지 않았습니다.', + closeLabel: '커맨드 센터 닫기', + searchPlaceholder: '세션, 뷰, 작업 검색', + statSessions: '세션', + statApiCalls: 'API 호출', + statTokens: '토큰 입/출력', + statEstCost: '예상 비용', + cost => `실제 비용 ${cost}`, + loadingUsage: '사용량 로딩 중...', + count => `지난 ${count}일 동안 사용 내역이 없습니다.`, + retry: '재시도', + tokenInput: '입력', + tokenOutput: '출력', + noDailyActivity: '일일 활동이 없습니다.', + topModels: '인기 모델', + topSkills: '인기 스킬', + actionsLabel: '작업', + systemRunning: '실행 중', + systemDone: '완료', + systemFailed: '실패', + open: '커맨드 센터 열기', + close: '커맨드 센터 닫기', + }, + common: { + loading: '로딩 중…', + save: '저장', + cancel: '취소', + close: '닫기', + delete: '삭제', + confirm: '확인', + search: '검색…', + clearSearch: '검색 지우기', + copy: '복사', + refresh: '새로고침', + moreActions: '더 많은 작업', + tryAgain: '다시 시도', + }, + onboarding: { + welcome: 'Hermes에 오신 것을 환영합니다', + getStarted: '제공자와 모델을 선택하여 시작하세요.', + skip: '건너뛰기', + continue: '계속', + finish: '완료', + setupTitle: 'Hermes Agent 설정을 시작합니다', + setupDesc: '모델 제공자를 연결하여 채팅을 시작하세요. 대부분 클릭 한 번으로 가능합니다.', + preparing: 'Hermes 시작 중…', + installing: 'Hermes 설치를 마무리 중입니다. 처음 실행 시 보통 1분 이내에 완료됩니다.', + lookingUp: '제공자 조회 중...', + otherProviders: '기타 제공자', + collapse: '접기', + iHaveKey: 'API 키가 있습니다', + recommended: '추천', + connected: '연결됨', + backToSignIn: '로그인으로 돌아가기', + getKey: '키 받기', + pasteKey: 'API 키 붙여넣기', + connect: '연결', + connecting: '연결 중', + copyCode: '복사', + startSignIn: '로그인 시작 중:', + verifyingCode: '코드 확인 중:', + pickingModel: '연결됨. 기본 모델 선택 중...', + signInFailed: '로그인 실패. 다시 시도하세요.', + pickDifferent: '다른 제공자 선택', + signInTitle: '로그인:', + step1: '브라우저에서', + step1End: '페이지를 열었습니다.', + step2: '해당 페이지에서 Hermes를 인증하세요.', + step3: '인증 코드를 복사하여 아래에 붙여넣으세요.', + pasteCode: '인증 코드 붙여넣기', + reopenAuth: '인증 페이지 다시 열기', + cancel: '취소', + browserDesc: '브라우저에서', + browserDescEnd: '페이지를 열었습니다. 해당 페이지에서 Hermes를 인증하면 자동으로 연결됩니다 — 복사하거나 붙여넣을 필요가 없습니다.', + waitingAuth: '인증을 기다리는 중...', + reopenSignIn: '로그인 페이지 다시 열기', + externalDesc: '자체 CLI를 통해 로그인합니다. 터미널에서 이 명령어를 실행한 후 돌아와서 "로그인 완료"를 선택하세요:', + iSignedIn: '로그인 완료', + enterCode: '브라우저에서', + enterCodeEnd: '페이지를 열었습니다. 이 코드를 입력하세요:', + reopenVerification: '확인 페이지 다시 열기', + defaultModel: '기본 모델', + freeTier: '무료 등급', + pro: '프로', + change: '변경', + startChatting: '채팅 시작', + docs: '문서', + close: '닫기', + savingError: '자격 증명을 저장할 수 없습니다.', + openRouter: 'OpenRouter', + }, + file: { + browser: '파일 브라우저', + noFiles: '아직 파일이 없습니다.', + }, + terminal: { + title: '터미널', + newTab: '새 탭', + closeTab: '탭 닫기', + }, + skills: { + title: '스킬', + search: '스킬 검색…', + noResults: '스킬을 찾을 수 없습니다.', + tools: '스킬 & 도구', + }, + profiles: { + title: '프로필', + noProfilesYet: '아직 프로필이 없습니다.', + selectProfile: '세부 정보를 보려면 프로필을 선택하세요.', + deleteProfile: '프로필을 삭제할까요?', + soulMd: 'SOUL.md', + unsavedChanges: '저장되지 않은 변경사항', + newProfile: '새 프로필', + cloneFromDefault: '기본값에서 복제', + renameProfile: '프로필 이름 변경', + }, + cron: { + title: '크론 작업', + noJobs: '예약된 작업이 없습니다.', + deleteCronJob: '크론 작업을 삭제할까요?', + optional: '선택 사항', + label: '크론', + open: '크론 작업 열기', + }, + messaging: { + title: '메시징', + recommended: '권장', + recommendedTelegram: '권장. @userinfobot에서 얻은 쉼표로 구분된 숫자 ID입니다. 설정하지 않으면 누구나 봇에 DM을 보낼 수 있습니다.', + recommendedDiscord: '권장. 쉼표로 구분된 Discord 사용자 ID입니다.', + recommendedSlack: '권장. 쉼표로 구분된 Slack 사용자 ID입니다.', + recommendedMattermost: '권장. 쉼표로 구분된 Mattermost 사용자 ID입니다.', + recommendedMatrix: '권장. @user:server 형식의 쉼표로 구분된 사용자 ID입니다.', + recommendedSignal: '권장. 쉼표로 구분된 Signal 식별자입니다.', + recommendedWhatsApp: '권장. 쉼표로 구분된 전화번호 또는 WhatsApp ID입니다.', + gatewayStopped: '메시징 게이트웨이 중지됨', + getCredentials: '자격 증명 가져오기', + required: '필수', + unsavedChanges: '저장되지 않은 변경사항', + saved: '저장됨', + }, + about: { + version: '버전', + checkUpdates: '업데이트 확인', + upToDate: '최신 버전입니다.', + updateAvailable: '업데이트가 있습니다.', + license: 'MIT 라이선스', + hermesDesktop: 'Hermes Desktop', + versionUnavailable: '버전 정보 없음', + updates: '업데이트', + checkNow: '지금 확인', + checking: '확인 중…', + seeWhatsNew: '새로운 기능 보기', + releaseNotes: '릴리스 노트', + autoUpdates: '자동 업데이트', + autoUpdatesDesc: 'Hermes가 백그라운드에서 자동으로 업데이트를 확인하고 준비되면 알려드립니다.', + selfUpdateUnsupported: '이 빌드는 앱 내에서 자체 업데이트할 수 없습니다.', + cannotReachServer: '업데이트 서버에 연결할 수 없습니다.', + installingUpdate: '현재 업데이트를 설치 중입니다.', + count => `새 업데이트가 준비되었습니다 (${count}개 변경사항 포함).`, + count => `새 업데이트가 준비되었습니다 (${count}개 변경사항 포함).`, + onLatest: '최신 버전을 사용 중입니다.', + tapCheckNow: '업데이트를 확인하려면 "지금 확인"을 누르세요.', + time => `마지막 확인: ${time}`, + justNow: '방금 전', + never: '확인 안 함', + count => `${count}분 전`, + count => `${count}시간 전`, + count => `${count}일 전`, + (branch, sha) => `브랜치 ${branch} · 커밋 ${sha}`, + }, + keys: { + title: 'API 키', + noKeys: '설정된 API 키가 없습니다.', + addKey: '키 추가', + loading: 'API 키 및 자격 증명 로딩 중…', + docs: '문서', + openDocs: '제공자 문서 열기', + hideValue: '값 숨기기', + revealValue: '값 보기', + set: '설정됨', + notSet: '미설정', + replace: '교체', + replaceValue: '현재 값 교체', + enterValue: '값 입력', + saving: '저장 중', + save: '저장', + cancel: '취소', + clearValue: '값 지우기', + (total, count) => `${total}개 중 ${count}개 설정됨`, + (total, count) => `${total}개 중 ${count}개 설정됨`, + count => `${count}개 설정됨`, + count => `${count}개 키`, + otherProviders: '기타 제공자', + categoryTools: '도구', + categoryMessaging: '메시징', + categorySettings: '설정', + openProviderDocs: '제공자 문서 열기', + showAdvanced: '고급 설정 보기', + loadFailed: 'API 키 로딩 실패', + credentialSaved: '자격 증명 저장 완료', + credentialRemoved: '자격 증명 제거 완료', + }, + config: { + title: '설정', + edit: '설정 편집', + reload: '설정 다시 불러오기', + notSet: '미설정', + commaSeparated: '쉼표로 구분된 값', + on: '켜기', + off: '끄기', + none: '없음', + emptyOption: '(없음)', + loading: 'Hermes 설정 로딩 중…', + noMatching: '일치하는 설정이 없습니다', + noMatchingDesc: '다른 검색어를 시도하거나 다른 섹션을 선택하세요.', + count => `${count}개 결과`, + count => `${count}개 결과`, + saving: '저장 중…', + label: { + defaultModel: '기본 모델', + contextWindow: '컨텍스트 창', + fallbackModels: '대체 모델', + enabledToolsets: '활성화된 도구 세트', + timezone: '시간대', + personality: '페르소나', + reasoningBlocks: '추론 블록', + maxAgentSteps: '최대 에이전트 단계', + imageAttachments: '이미지 첨부', + workingDirectory: '작업 디렉터리', + executionBackend: '실행 백엔드', + commandTimeout: '명령어 시간 초과', + persistentShell: '영구 셸', + envPassthrough: '환경 변수 전달', + fileReadLimit: '파일 읽기 제한', + terminalOutputLimit: '터미널 출력 제한', + filePageLimit: '파일 페이지 제한', + lineLengthLimit: '줄 길이 제한', + codeExecutionMode: '코드 실행 모드', + approvalMode: '승인 모드', + approvalTimeout: '승인 시간 초과', + confirmMcpReloads: 'MCP 다시 불러오기 확인', + commandAllowlist: '명령어 허용 목록', + redactSecrets: '비밀 정보 가리기', + allowPrivateUrls: '비공개 URL 허용', + browserPrivateUrls: '브라우저 비공개 URL', + localBrowserForPrivateUrls: '비공개 URL용 로컬 브라우저', + fileCheckpoints: '파일 체크포인트', + checkpointLimit: '체크포인트 제한', + voiceShortcut: '음성 단축키', + maxRecordingLength: '최대 녹음 길이', + readResponsesAloud: '응답 소리내어 읽기', + speechToText: '음성-텍스트 변환', + speechToTextProvider: '음성-텍스트 변환 제공자', + localTranscriptionModel: '로컬 변환 모델', + transcriptionLanguage: '변환 언어', + elevenlabsSttModel: 'ElevenLabs STT 모델', + elevenlabsLanguage: 'ElevenLabs 언어', + tagAudioEvents: '오디오 이벤트 태그', + speakerDiarization: '화자 분리', + textToSpeechProvider: '텍스트-음성 변환 제공자', + edgeVoice: 'Edge 음성', + openaiTtsModel: 'OpenAI TTS 모델', + openaiVoice: 'OpenAI 음성', + elevenlabsVoice: 'ElevenLabs 음성', + elevenlabsModel: 'ElevenLabs 모델', + persistentMemory: '영구 메모리', + userProfile: '사용자 프로필', + memoryBudget: '메모리 예산', + profileBudget: '프로필 예산', + memoryProvider: '메모리 제공자', + contextEngine: '컨텍스트 엔진', + autoCompression: '자동 압축', + compressionThreshold: '압축 임계값', + compressionTarget: '압축 대상', + protectedRecentMessages: '보호된 최근 메시지', + apiRetries: 'API 재시도', + serviceTier: '서비스 등급', + toolUseEnforcement: '도구 사용 강제', + subagentModel: '서브에이전트 모델', + subagentProvider: '서브에이전트 제공자', + subagentTurnLimit: '서브에이전트 턴 제한', + parallelSubagents: '병렬 서브에이전트', + subagentTimeout: '서브에이전트 시간 초과', + subagentReasoningEffort: '서브에이전트 추론 노력', + }, + desc: { + defaultModel: '컴포저에서 다른 모델을 선택하지 않으면 새 채팅에 사용됩니다.', + contextWindow: '선택한 모델의 감지된 컨텍스트 창을 사용하려면 0으로 두세요.', + fallbackModels: '기본 모델이 실패할 경우 시도할 백업 provider:model 항목입니다.', + personality: '새 세션의 기본 어시스턴트 스타일입니다.', + timezone: 'Hermes가 현지 시간 컨텍스트가 필요할 때 사용됩니다. 비워두면 시스템 시간대를 사용합니다.', + reasoningBlocks: '백엔드가 추론 섹션을 제공할 때 표시합니다.', + imageAttachments: '이미지 첨부 파일이 모델로 전송되는 방식을 제어합니다.', + workingDirectory: '도구 및 터미널 작업을 위한 기본 프로젝트 폴더입니다.', + codeExecutionMode: '코드 실행이 현재 프로젝트로 얼마나 엄격하게 범위가 지정되는지 설정합니다.', + persistentShell: '백엔드가 지원할 때 명령어 간에 셸 상태를 유지합니다.', + envPassthrough: '도구 실행에 전달할 환경 변수입니다.', + fileReadLimit: 'Hermes가 한 번의 파일 요청에서 읽을 수 있는 최대 문자 수입니다.', + approvalMode: '명시적 승인이 필요한 명령어를 Hermes가 처리하는 방식입니다.', + approvalTimeout: '승인 프롬프트가 시간 초과되기까지 기다리는 시간입니다.', + redactSecrets: '가능한 경우 모델에 표시되는 콘텐츠에서 감지된 비밀 정보를 숨깁니다.', + fileCheckpoints: '파일 편집 전에 롤백 스냅샷을 생성합니다.', + persistentMemory: '향후 세션에 도움이 될 수 있는 지속적인 메모리를 저장합니다.', + userProfile: '사용자 선호도의 간결한 프로필을 유지합니다.', + contextEngine: '컨텍스트 제한 근처에서 긴 대화를 관리하기 위한 전략입니다.', + autoCompression: '대화가 길어지면 이전 컨텍스트를 요약합니다.', + readResponsesAloud: '어시스턴트 응답을 자동으로 소리내어 읽습니다.', + speechToText: '로컬 또는 제공자 지원 음성 변환을 활성화합니다.', + elevenlabsLanguage: '선택적 ISO-639-3 언어 코드입니다. 비워두면 ElevenLabs가 자동 감지합니다.', + maxAgentSteps: 'Hermes가 실행을 중지하기 전 도구 호출 턴의 상한입니다.', + }, + }, + gateway: { + title: '게이트웨이', + start: '게이트웨이 시작', + stop: '게이트웨이 중지', + restart: '게이트웨이 재시작', + running: '실행 중', + stopped: '중지됨', + loading: '게이트웨이 설정 로딩 중…', + unavailable: '게이트웨이 설정을 사용할 수 없습니다', + unavailableDesc: '데스크톱 IPC 브릿지가 게이트웨이 설정을 노출하지 않습니다.', + connection: '게이트웨이 연결', + envOverride: '환경 변수 오버라이드', + desc: 'Hermes Desktop은 기본적으로 자체 로컬 게이트웨이를 시작합니다. 다른 머신이나 신뢰할 수 있는 프록시 뒤에서 이미 실행 중인 Hermes 백엔드를 이 앱으로 제어하려면 원격 게이트웨이를 사용하세요.', + envOverrideTitle: '환경 변수가 이 데스크톱 세션을 제어하고 있습니다.', + (urlVar, tokenVar) => `아래 저장된 설정을 사용하려면 ${urlVar}와 ${tokenVar}를 해제하세요.`, + localTitle: '로컬 게이트웨이', + localDesc: 'localhost에 비공개 Hermes 백엔드를 시작합니다. 기본값이며 오프라인에서도 작동합니다.', + remoteTitle: '원격 게이트웨이', + remoteDesc: '세션 토큰을 사용하여 이 데스크톱 셸을 원격 Hermes 백엔드에 연결합니다.', + remoteUrl: '원격 URL', + remoteUrlDesc: '원격 대시보드 백엔드의 기본 URL입니다. /hermes와 같은 경로 접두사를 지원합니다.', + remoteUrlPlaceholder: 'https://gateway.example.com/hermes', + sessionToken: '세션 토큰', + sessionTokenDesc: 'REST 및 WebSocket 접근에 사용되는 대시보드 세션 토큰입니다. 저장된 토큰을 유지하려면 빈 칸으로 두세요.', + sessionTokenPlaceholder: '세션 토큰 붙여넣기', + preview => `기존 토큰 ${preview}`, + tokenSaved: '저장됨', + testRemote: '원격 테스트', + saveRestart: '다음 재시작에 저장', + saveReconnect: '저장 후 재연결', + diagnostics: '진단', + diagnosticsDesc: '파일 관리자에서 desktop.log를 확인하세요 — 게이트웨이 시작 실패 시 유용합니다.', + openLogs: '로그 열기', + connected: '연결됨', + connecting: '연결 중', + disconnected: '연결 끊김', + inferenceReady: '추론 준비 완료', + inferenceNotReady: '추론 준비 안 됨', + checkingInference: '추론 확인 중', + openSystemPanel: '시스템 패널 열기', + connectionLabel: '연결:', + recentActivity: '최근 활동', + viewAllLogs: '모든 로그 보기 →', + messagingPlatforms: '메시징 플랫폼', + label: '게이트웨이', + inferenceStatus: '게이트웨이 추론 상태', + enterUrlFirst: '전환하기 전에 원격 URL과 세션 토큰을 입력하세요', + enterUrlFirstTest: '테스트하기 전에 원격 URL과 세션 토큰을 입력하세요', + }, + sessions: { + title: '세션', + search: '세션 검색…', + noResults: '세션을 찾을 수 없습니다.', + export: '내보내기', + delete: '세션 삭제', + loading: '로딩 중…', + defaultProjectDir: '기본 프로젝트 디렉터리', + defaultProjectDirDesc: '다른 폴더를 선택하지 않으면 새 세션이 이 폴더에서 시작됩니다. 설정하지 않으면 홈 디렉터리를 사용합니다.', + fallback => `기본값: ${fallback}.`, + notSet: '미설정', + change: '변경', + choose: '선택', + clear: '지우기', + archivedTitle: '보관된 세션', + archivedDesc: '보관된 채팅은 사이드바에서 숨겨지지만 모든 메시지는 유지됩니다. 사이드바에서 채팅을 Ctrl/⌘-클릭하여 보관하세요.', + nothingArchived: '보관된 항목 없음', + noSearchMatch: '검색과 일치하는 보관된 채팅이 없습니다.', + archiveToHide: '채팅을 보관하여 여기에 숨기세요.', + unarchive: '보관 해제', + deletePermanently: '영구 삭제', + count => `메시지 ${count}개`, + new: '새 세션', + running: '세션 실행 중', + actions: '세션 작업', + reorder: '순서 변경', + pin: '고정', + unpin: '고정 해제', + copyId: 'ID 복사', + rename: '이름 변경', + archive: '보관', + renameDialog: '세션 이름 변경', + renameDesc: '이 채팅에 기억하기 쉬운 제목을 지정하세요. 비우면 제목이 지워집니다.', + untitled: '제목 없음', + renamed: '이름 변경됨', + renameFailed: '이름 변경 실패', + pinned: '고정됨', + results: '결과', + allPinned: '여기 모든 항목이 고정되었습니다. 최근 항목에 표시하려면 채팅 고정을 해제하세요.', + pinHint: 'Shift-클릭으로 채팅 고정 · 드래그로 순서 변경', + loadMore: '더 보기', + noWorkspace: '작업 공간 없음', + ungroup: '세션을 단일 목록으로 표시', + groupByWorkspace: '작업 공간별로 세션 그룹화', + loadStep: '불러오기', + moreLabel: '더 보기', + nothingArchivedTitle: '보관된 항목 없음', + deletePermanentlyTitle: '영구 삭제', + defaultProjectDirTitle: '기본 프로젝트 디렉터리', + loadingArchived: '보관된 세션 로딩 중…', + restored: '복원됨', + projectDirUpdated: '기본 프로젝트 디렉터리 업데이트됨', + loadFailed: '보관된 세션을 불러올 수 없습니다', + unarchiveFailed: '보관 해제 실패', + deleteFailed: '삭제 실패', + archiveHint: '채팅을 보관하여 여기에 숨기세요.', + updateDirFailed: '기본 디렉터리를 업데이트할 수 없습니다', + clearDirFailed: '기본 디렉터리를 지울 수 없습니다', + }, + mcp: { + title: 'MCP 서버', + addServer: '서버 추가', + noServers: '설정된 MCP 서버가 없습니다.', + loading: 'MCP 서버 로딩 중…', + servers: 'MCP 서버', + count => `${count}개 설정됨`, + newServer: '새 서버', + reloadMCP: 'MCP 다시 불러오기', + reloading: '다시 불러오는 중...', + noServersDesc: 'stdio 또는 HTTP 서버를 추가하여 MCP 도구를 노출하세요.', + name: '이름', + namePlaceholder: 'filesystem', + serverJSON: '서버 JSON', + editServer: '서버 편집', + saveServer: '서버 저장', + saving: '저장 중...', + remove: '제거', + disabled: '비활성화됨', + nameRequired: '이름 필수', + nameRequiredDesc: '이 MCP 서버에 설정 키를 지정하세요.', + invalidJson: '서버 설정은 JSON 객체여야 합니다', + invalidJsonDesc: '유효하지 않은 MCP JSON', + saved: 'MCP 서버 저장 완료', + name => `${name}은(는) MCP 다시 불러오기 후 적용됩니다.`, + saveFailed: '저장 실패', + removeFailed: '제거 실패', + gatewayUnavailable: '게이트웨이를 사용할 수 없음', + gatewayUnavailableDesc: 'MCP를 다시 불러오기 전에 게이트웨이를 다시 연결하세요.', + reloadedTitle: 'MCP 도구 다시 불러오기 완료', + reloadedDesc: '새 도구 스키마가 새 턴에 적용됩니다.', + reloadFailed: 'MCP 다시 불러오기 실패', + giveConfigKey: '이 MCP 서버에 설정 키를 지정하세요.', + reconnectGateway: 'MCP를 다시 불러오기 전에 게이트웨이를 다시 연결하세요.', + newSchemas: '새 도구 스키마가 새 턴에 적용됩니다.', + loadingServers: 'MCP 서버 로딩 중...', + serverName: '이름', + serversTitle: 'MCP 서버', + noServersTitle: 'MCP 서버 없음', + failedToLoad: 'MCP 설정 로딩 실패', + invalidJsonShort: '유효하지 않은 MCP JSON', + serverSaved: 'MCP 서버 저장 완료', + toolsReloaded: 'MCP 도구 다시 불러오기 완료', + emptyDesc: 'stdio 또는 HTTP 서버를 추가하여 MCP 도구를 노출하세요.', + }, + tools: { + title: '도구 & 스킬', + noTools: '사용 가능한 도구가 없습니다.', + }, + nav: { + home: '홈', + chat: '채팅', + settings: '설정', + files: '파일', + terminal: '터미널', + }, + header: { + search: '검색 또는 명령어 입력…', + }, + model: { + auxTask: { + vision: '비전', + visionHint: '이미지 분석', + web_extract: '웹 추출', + web_extractHint: '페이지 요약', + compression: '압축', + compressionHint: '컨텍스트 압축', + session_search: '세션 검색', + session_searchHint: '리콜 쿼리', + skills_hub: '스킬 허브', + skills_hubHint: '스킬 검색', + approval: '승인', + approvalHint: '스마트 자동 승인', + mcp: 'MCP', + mcpHint: 'MCP 도구 라우팅', + title_generation: '제목 생성', + title_generationHint: '세션 제목', + curator: '큐레이터', + curatorHint: '스킬 사용 검토', + }, + mainModel: '메인 모델', + mainDesc: '새 세션에 적용됩니다. 컴포저의 모델 선택기를 사용하여 활성 채팅을 즉시 전환할 수 있습니다.', + providerPlaceholder: '제공자', + modelPlaceholder: '모델', + apply: '적용', + applying: '적용 중…', + auxiliaryModels: '보조 모델', + auxiliaryDesc: '도우미 작업은 기본적으로 메인 모델에서 실행됩니다. 특정 작업에 전용 모델을 할당하여 오버라이드할 수 있습니다.', + resetAllToMain: '모두 메인으로 초기화', + setToMain: '메인으로 설정', + change: '변경', + cancel: '취소', + autoUseMain: '자동 · 메인 모델 사용', + providerDefault: '(제공자 기본값)', + loading: '모델 설정 로딩 중…', + options: '옵션', + thinking: '생각', + fast: '빠른 모드', + effort: '노력', + noOptions: '이 모델에 대한 옵션 없음', + optionUpdateFailed: '모델 옵션 업데이트 실패', + fastModeUpdateFailed: '빠른 모드 업데이트 실패', + effortMinimal: '최소', + effortLow: '낮음', + effortMedium: '중간', + effortHigh: '높음', + effortMax: '최대', + switch: '모델 전환', + unknown: '(알 수 없음)', + filterPlaceholder: '제공자 및 모델 필터...', + persistGlobal: '전역으로 유지', + persistGlobalSession: '전역으로 유지 (그렇지 않으면 이 세션에만 적용)', + couldNotLoad: '모델을 불러올 수 없습니다', + proLockedDesc: 'Pro 모델은 유료 Nous 구독이 필요합니다.', + priceTooltip: '백만 토큰당 입력 / 출력 가격', + freePrice: '무료', + currentLabel: '현재:', + addProviderBtn: '제공자 추가', + }, + updates: { + checking: '업데이트 확인 중…', + available: '업데이트 있음', + downloading: '다운로드 중…', + installing: '설치 중…', + restart: '재시작하여 업데이트', + stageGettingReady: '준비 중…', + stageDownloading: '다운로드 중…', + stageAlmostThere: '거의 완료…', + stageFinishingUp: '마무리 중…', + stageRestarting: 'Hermes 재시작 중…', + stageManual: '터미널에서 업데이트', + stageError: '업데이트 일시 중지', + updatingHermes: 'Hermes 업데이트 중…', + lookingForUpdates: '업데이트 확인 중…', + couldntCheck: '업데이트를 확인할 수 없습니다', + updateNotAvailable: '사용 가능한 업데이트 없음', + checkConnection: '연결을 확인하고 다시 시도하세요.', + onLatest: '최신 버전을 실행 중입니다.', + allSet: '모두 준비 완료', + newUpdateAvailable: '새 업데이트 있음', + readyToInstall: '새 버전의 Hermes를 설치할 준비가 되었습니다.', + updateNow: '지금 업데이트', + maybeLater: '나중에', + count => `+ ${count}개 변경사항 추가 포함.`, + count => `+ ${count}개 변경사항 추가 포함.`, + updateFromTerminal: '터미널에서 업데이트', + terminalDesc: '명령줄에서 Hermes를 설치했으므로 업데이트도 터미널에서 실행됩니다. 터미널에 다음을 붙여넣으세요:', + copied: '복사됨', + copy: '복사', + pickupNewVersion: '다음에 Hermes를 실행할 때 새 버전이 적용됩니다.', + done: '완료', + updaterDesc: 'Hermes 업데이터가 자체 창에서 실행되고 완료되면 Hermes를 다시 엽니다.', + closeToApply: '업데이트를 적용하기 위해 Hermes가 종료됩니다.', + updateDidntFinish: '업데이트가 완료되지 않았습니다', + nothingLost: '걱정 마세요 — 아무것도 손실되지 않았습니다. 지금 다시 시도할 수 있습니다.', + notNow: '나중에', + }, + errors: { + generic: '문제가 발생했습니다.', + notFound: '페이지를 찾을 수 없습니다.', + noPermission: '이 페이지에 접근할 권한이 없습니다.', + somethingBroke: '인터페이스에 문제가 발생했습니다', + viewCrashedDesc: '뷰에서 예상치 못한 오류가 발생했습니다. 채팅과 설정은 안전합니다 - 다시 시도하거나 창을 새로고침하세요.', + noProviders: '인증된 제공자가 없습니다.', + }, + tool: { + toolCall: '도구 호출', + result: '결과', + error: '오류', + timeout: '시간 초과', + cancelled: '취소됨', + running: '실행 중', + recovered: '복구됨', + done: '완료', + output: '도구 출력', + searchResults: '검색 결과', + rawResponse: '원시 응답', + stdout: '표준 출력', + stderr: '표준 에러', + copyActivity: '활동 복사', + recoveredAfter: '1회 실패 후 복구됨', + count => `${count}회 실패 후 복구됨`, + oneStepFailed: '1단계 실패', + count => `${count}단계 실패`, + }, + composer: { + startingHermes: 'Hermes 시작 중...', + sendFollowUp: '후속 메시지 보내기', + message: '메시지', + editingQueued: '컴포저에서 대기 중인 턴 편집 중', + attach: '첨부', + files: '파일…', + folder: '폴더…', + images: '이미지…', + pasteImage: '이미지 붙여넣기', + url: 'URL…', + promptSnippets: '프롬프트 스니펫', + promptSnippetsDesc: '컴포저에 넣을 시작 프롬프트를 선택하세요.', + voiceStart: '음성 대화 시작', + queue: '메시지 대기열', + speaking: '말하는 중', + transcribing: '텍스트 변환 중', + muted: '음소거됨', + listening: '듣는 중', + unmuteMic: '마이크 음소거 해제', + muteMic: '마이크 음소거', + stopListening: '듣기 중지하고 보내기', + endVoice: '음성 대화 종료', + end: '종료', + stopDictation: '받아쓰기 중지', + transcribingDictation: '받아쓰기 변환 중', + voiceDictation: '음성 받아쓰기', + addContext: '컨텍스트 추가', + }, + models: { + title: '모델', + search: '모델 검색', + addProvider: '제공자 추가…', + }, + install: { + title: 'Hermes 일회성 설치 필요', + desc: '자동 최초 실행 설치는', + descEnd: '에서 아직 지원되지 않습니다. 터미널을 열고 아래 명령어를 실행한 후 이 앱을 다시 실행하세요. 이후 실행에서는 이 단계를 건너뜁니다.', + installCommand: '설치 명령어', + copyCommand: '명령어 복사', + viewDocs: '설치 문서 보기', + willInstallTo: '설치 경로:', + iRanIt: '실행했습니다 -- 다시 시도', + failed: '설치 실패', + settingUp: 'Hermes Agent 설정 중', + finishingUp: '마무리 중', + failedDesc: '설치 단계 중 하나가 실패했습니다. Windows에서는 다른 Hermes CLI 또는 데스크톱 인스턴스가 실행 중일 때 발생할 수 있습니다. 실행 중인 모든 Hermes 인스턴스를 중지한 후 다시 시도하세요. 자세한 내용은 아래 세부 정보나 데스크톱 로그를 확인하세요.', + setupDesc: '일회성 설정입니다. Hermes 설치 프로그램이 의존성을 다운로드하고 머신을 구성합니다. 이후 실행에서는 이 단계를 건너뜁니다.', + fetchingManifest: '설치 매니페스트 가져오는 중...', + error: '오류', + showOutput: '설치 출력 보기', + hideOutput: '설치 출력 숨기기', + noOutput: '아직 출력이 없습니다.', + cancelInstall: '설치 취소', + cancelling: '취소 중...', + copyOutput: '출력 복사', + copied: '복사됨!', + reloadRetry: '새로고침 후 다시 시도', + saveLogs: '전체 기록 저장 위치:', + stepsComplete: '단계 완료', + nowLabel: '지금', + line: '줄', + lines: '줄', + }, + previewConsole: { + resizeLabel: '미리보기 콘솔 크기 조정', + noMessages: '아직 콘솔 메시지가 없습니다.', + }, + boot: { + ipcUnavailable: '데스크톱 IPC 브릿지를 사용할 수 없습니다.', + backendExited: '시작 중에 Hermes 백그라운드 프로세스가 종료되었습니다.', + backendStoppedTitle: '백엔드 중지됨', + backendStoppedMessage: 'Hermes 백그라운드 프로세스가 종료되었습니다.', + startingConnection: '데스크톱 연결 시작 중', + connectingGateway: '라이브 데스크톱 게이트웨이 연결 중', + loadingConfig: 'Hermes 설정 로딩 중', + loadingSessions: '최근 세션 로딩 중', + desktopBootFailed: '데스크톱 부팅 실패', + couldNotStart: 'Hermes를 시작할 수 없습니다', + recoveryDesc: '백그라운드 게이트웨이가 시작되지 않았습니다. 아래 복구 단계 중 하나를 시도하세요 — 채팅이나 설정이 삭제되지는 않습니다.', + retry: '재시도', + repairInstall: '설치 복구', + useLocalGateway: '로컬 게이트웨이 사용', + openLogs: '로그 열기', + repairHint: '복구는 설치 프로그램을 다시 실행하며 새 머신에서는 몇 분 정도 걸릴 수 있습니다.', + showLogs: '최근 로그 보기', + hideLogs: '최근 로그 숨기기', + }, + urlDialog: { + title: 'URL 첨부', + description: 'Hermes가 페이지를 가져와서 이 턴의 컨텍스트로 포함합니다.', + placeholder: 'https://example.com/post', + hint: '전체 URL을 포함하세요, 예:', + attach: '첨부', + }, + titlebar: { + hideSidebar: '사이드바 숨기기', + showSidebar: '사이드바 보기', + search: '검색', + searchTitle: '세션, 뷰, 작업 검색', + hideRightSidebar: '오른쪽 사이드바 숨기기', + showRightSidebar: '오른쪽 사이드바 보기', + unmuteHaptics: '햅틱 켜기', + muteHaptics: '햅틱 끄기', + openSettings: '설정 열기', + profiles: '프로필', + profilesDesc: '별도의 페르소나, 설정, 스킬, SOUL.md를 위한 고급 Hermes 환경입니다.', + manageProfiles: '프로필 관리', + language: '언어', + languageDesc: '인터페이스의 표시 언어를 선택하세요.', + }, + pagination: { + ariaLabel: '페이지네이션', + prevAria: '이전 페이지로 이동', + prev: '이전', + nextAria: '다음 페이지로 이동', + next: '다음', + }, + bootstrap: { + pending: '대기 중', + running: '설치 중', + done: '완료', + skipped: '건너뜀', + failed: '실패', + }, + sidebar: { + sheetTitle: '사이드바', + sheetDesc: '모바일 사이드바를 표시합니다.', + toggle: '사이드바 전환', + }, + clarify: { + hermesIsAsking: 'Hermes 질문', + loadingQuestion: '질문 로딩 중…', + otherTypeAnswer: '기타 (직접 입력)', + placeholderAnswer: '답변 입력…', + cmdEnterToSend: '⌘/Ctrl + Enter로 보내기', + back: '뒤로', + skip: '건너뛰기', + couldNotSend: '명확화 응답을 보낼 수 없습니다', + n => `1–${n} 선택`, + }, + intro: { + fallback1h: '오늘은 무엇을 진행할까요?', + fallback1b: '버그, 브랜치, 계획 또는 대략적인 아이디어를 보내주세요. 저장소를 검사하고 다음 구체적인 단계로 전환하겠습니다.', + fallback2h: '무슨 생각을 하고 계신가요?', + fallback2b: '코드, 질문 또는 막힌 부분을 가져와 주세요. 변경하기 전에 상황을 파악하겠습니다.', + fallback3h: 'Hermes가 무엇을 살펴볼까요?', + fallback3b: '작업, 실패 경로 또는 미완성 계획을 보내주세요. 실행 가능하게 전환하도록 도와드리겠습니다.', + fallback4h: '어디서부터 시작할까요?', + fallback4b: '문제, 목표 또는 파일을 가져와 주세요. 먼저 검사하고 다음 단계를 구체적으로 유지하겠습니다.', + fallback5h: '어디에 주의가 필요한가요?', + fallback5b: '가지고 계신 컨텍스트를 보내주세요. 계획이나 수정으로 정리해 드리겠습니다.', + personality: { + label => `${label} 모드가 켜져 있습니다. 무엇을 작업할까요?`, + body1: '작업, 파일 또는 대략적인 아이디어를 보내주세요. 설정된 음성을 사용하고 작업을 이 저장소에 기반하여 진행하겠습니다.', + label => `${label} Hermes가 무엇을 봐야 할까요?`, + body2: '컨텍스트나 막힌 부분을 가져와 주세요. 설정된 페르소나에 맞춰 조정하겠습니다.', + label => `${label} 모드 준비 완료.`, + body3: '문제, 파일 또는 아이디어를 보내주세요. 설정된 페르소나를 따르겠습니다.', + label => `${label} Hermes가 무엇을 처리할까요?`, + body4: '작업을 여기에 남겨주세요. 저장소에 기반하여 작업을 진행하겠습니다.', + heading5: '어디서부터 시작할까요?', + label => `컨텍스트를 제공해 주시면 ${label} 모드로 답변하겠습니다.`, + }, + brand: 'HERMES AGENT', + }, + artifacts: { + noArtifactsFound: '아티팩트를 찾을 수 없습니다', + }, + agents: { + spawnTree: '트리 생성', + liveSubagentActivity: '현재 턴의 라이브 서브에이전트 활동입니다.', + noLiveSubagents: '라이브 서브에이전트 없음', + files: '파일', + label: '에이전트', + open: '에이전트 열기', + close: '에이전트 닫기', + subagent: '서브에이전트', + subagents: '서브에이전트', + failed: '실패', + running: '실행 중', + }, + provider: { + desc: { + nousPortal: 'Nous Portal 기본 URL 오버라이드', + openRouter: 'OpenRouter API 키 (비전, 웹 스크래핑 도우미, MoA용)', + google: 'Google AI Studio API 키 (GEMINI_API_KEY로도 인식됨)', + gemini: '유료 Gemini 등급용 GCP 프로젝트 ID (무료 등급은 자동 프로비저닝)', + anthropic: 'Anthropic API 키', + deepseek: '커스텀 DeepSeek API 기본 URL (고급)', + xai: 'xAI 기본 URL 오버라이드', + huggingface: 'Hugging Face Inference Providers 기본 URL 오버라이드', + kimi: 'Kimi / Moonshot China API 키', + minimax: 'MiniMax (중국) 기본 URL 오버라이드', + minimaxCn: 'MiniMax China API 키', + dashscope: '커스텀 DashScope 기본 URL (기본값: coding-intl OpenAI 호환 엔드포인트)', + glm: 'GLM API 키 (Z.AI)', + nvidia: 'NVIDIA NIM 기본 URL 오버라이드 (예: 로컬 NIM용 http://localhost:8000/v1)', + opencodeGo: 'OpenCode Go API 키', + opencodeZen: 'OpenCode Zen API 키', + xiaomi: 'Xiaomi MiMo 기본 URL 오버라이드 (기본값: https://api.xiaomimimo.com/v1)', + kiloCode: 'Kilo Code API 키', + aiGateway: 'AI Gateway API 키 (Vercel AI Gateway)', + browserbase: 'BROWSERBASE_API_KEY', + elevenLabs: 'ElevenLabs API 키', + openai: 'OpenAI API 키 (프록시를 통한 음성 처리용)', + mistral: 'Mistral API 키 (STT/TTS용)', + groq: 'Groq API 키 (STT용)', + tavily: 'TAVILY_API_KEY', + firecrawl: '자체 호스팅 인스턴스용 Firecrawl API URL (선택 사항)', + fal: 'FAL_KEY', + nous: 'Nous Portal 기본 URL 오버라이드', + openrouter: 'OpenRouter API 키 (비전, 웹 스크래핑 도우미, MoA용)', + lmstudio: 'Z.AI / GLM 기본 URL 오버라이드', + zai: 'Azure Foundry 기본 URL (\'hermes model\'을 통해 엔드포인트별 설정)', + stepfun: 'StepFun Step Plan 기본 URL 오버라이드', + arcee: 'Arcee AI 기본 URL 오버라이드', + gmi: 'GMI Cloud 기본 URL 오버라이드', + qwenportal: 'Qwen Portal 기본 URL 오버라이드 (기본값: https://portal.qwen.ai/v1)', + opencodego: 'OpenCode Go 기본 URL 오버라이드', + ollamacloud: 'Ollama Cloud 기본 URL 오버라이드 (기본값: https://ollama.com/v1)', + awsbedrock: 'Bedrock 인증용 AWS 명명된 프로필 (~/.aws/credentials에서)', + exa: 'AI 네이티브 웹 검색 및 콘텐츠용 Exa API 키', + parallel: 'AI 네이티브 웹 검색 및 추출용 Parallel API 키', + }, + }, +} +) diff --git a/apps/desktop/src/i18n/languages.ts b/apps/desktop/src/i18n/languages.ts index 5b4990f49706..328e798c0ba8 100644 --- a/apps/desktop/src/i18n/languages.ts +++ b/apps/desktop/src/i18n/languages.ts @@ -26,6 +26,72 @@ export const LOCALE_OPTIONS = [ name: '日本語', englishName: 'Japanese', configValue: 'ja' + }, + { + id: 'ko', + name: '한국어', + englishName: 'Korean', + configValue: 'ko' + }, + { + id: 'de', + name: 'Deutsch', + englishName: 'German', + configValue: 'de' + }, + { + id: 'es', + name: 'Español', + englishName: 'Spanish', + configValue: 'es' + }, + { + id: 'fr', + name: 'Français', + englishName: 'French', + configValue: 'fr' + }, + { + id: 'pt-br', + name: 'Português (Brasil)', + englishName: 'Portuguese (Brazil)', + configValue: 'pt-br' + }, + { + id: 'ar', + name: 'العربية', + englishName: 'Arabic', + configValue: 'ar' + }, + { + id: 'hi', + name: 'हिन्दी', + englishName: 'Hindi', + configValue: 'hi' + }, + { + id: 'th', + name: 'ภาษาไทย', + englishName: 'Thai', + configValue: 'th' + }, + { + id: 'vi', + name: 'Tiếng Việt', + englishName: 'Vietnamese', + configValue: 'vi' + }, + { + id: 'it', + name: 'Italiano', + englishName: 'Italian', + configValue: 'it' + }, + { + id: 'ru', + name: 'Русский', + englishName: 'Russian', + configValue: 'ru' } ] as const satisfies readonly { configValue: string; englishName: string; id: Locale; name: string }[] @@ -62,7 +128,51 @@ const LOCALE_ALIASES: Record = { zh_hant_hk: 'zh-hant', ja: 'ja', 'ja-jp': 'ja', - ja_jp: 'ja' + ja_jp: 'ja', + ko: 'ko', + 'ko-kr': 'ko', + ko_kr: 'ko', + de: 'de', + 'de-de': 'de', + de_de: 'de', + 'de-at': 'de', + 'de-ch': 'de', + es: 'es', + 'es-es': 'es', + es_es: 'es', + 'es-mx': 'es', + 'es-ar': 'es', + fr: 'fr', + 'fr-fr': 'fr', + fr_fr: 'fr', + 'fr-ca': 'fr', + 'fr-ch': 'fr', + 'fr-be': 'fr', + 'pt-br': 'pt-br', + pt_br: 'pt-br', + 'pt-pt': 'pt-br', + pt_pt: 'pt-br', + ar: 'ar', + 'ar-sa': 'ar', + ar_sa: 'ar', + 'ar-eg': 'ar', + 'ar-ae': 'ar', + hi: 'hi', + 'hi-in': 'hi', + hi_in: 'hi', + th: 'th', + 'th-th': 'th', + th_th: 'th', + vi: 'vi', + 'vi-vn': 'vi', + vi_vn: 'vi', + it: 'it', + 'it-it': 'it', + it_it: 'it', + 'it-ch': 'it', + ru: 'ru', + 'ru-ru': 'ru', + ru_ru: 'ru' } export function isLocale(value: unknown): value is Locale { diff --git a/apps/desktop/src/i18n/pt-br.ts b/apps/desktop/src/i18n/pt-br.ts new file mode 100644 index 000000000000..6b765e1bc0d4 --- /dev/null +++ b/apps/desktop/src/i18n/pt-br.ts @@ -0,0 +1,953 @@ +import { defineLocale } from './define-locale' + +export const ptbr = defineLocale( +{ + appearance: { + title: 'Aparência', + description: 'Preferências de exibição exclusivas do desktop. O modo controla o brilho; o tema controla a paleta de acentos e o estilo da superfície de chat.', + colorMode: 'Modo de Cor', + colorModeDesc: 'Escolha um modo fixo ou deixe o Hermes seguir a configuração do seu sistema.', + theme: { + nous: 'Nous', + nousDesc: 'Neutros vítreos com acentos azul Nous', + midnight: 'Meia-Noite', + midnightDesc: 'Azul-violeta profundo com acentos frios', + ember: 'Brasa', + emberDesc: 'Carmim e bronze quentes — vibração de forja', + mono: 'Mono', + monoDesc: 'Escala de cinza limpa — minimalista e focada', + cyberpunk: 'Cyberpunk', + cyberpunkDesc: 'Verde neon no preto — terminal matrix', + slate: 'Ardósia', + slateDesc: 'Azul ardósia frio — tema focado para desenvolvedores', + }, + themeDesc: 'Escolha uma paleta de cores para a superfície de chat e os acentos da interface.', + mode: { + light: 'Claro', + lightDesc: 'Superfícies de desktop brilhantes', + dark: 'Escuro', + darkDesc: 'Espaço de trabalho com baixo brilho', + system: 'Sistema', + systemDesc: 'Seguir a aparência do sistema', + }, + language: 'Idioma', + languageDesc: 'Escolha o idioma da interface ou deixe o Hermes seguir a configuração do seu sistema.', + toolCallDisplay: 'Exibição de Chamadas de Ferramenta', + toolCallDisplayDesc: 'Produto oculta payloads brutos de ferramentas; Técnico mostra entrada/saída completa.', + toolViewProduct: 'Produto', + toolViewTechnical: 'Técnico', + toolViewProductDesc: 'Atividade de ferramenta amigável com resumos concisos.', + toolViewTechnicalDesc: 'Incluir argumentos/resultados brutos e detalhes de baixo nível.', + }, + settings: { + title: 'Configurações', + appearance: 'Aparência', + model: 'Modelo', + gateway: 'Gateway', + sessions: 'Sessões', + tools: 'Ferramentas e Skills', + section: { + chat: 'Chat', + workspace: 'Espaço de Trabalho', + safety: 'Segurança', + memory: 'Memória e Contexto', + voice: 'Voz', + advanced: 'Avançado', + }, + mcp: 'Servidores MCP', + config: 'Config', + keys: 'Chaves de API', + about: 'Sobre', + closeSettings: 'Fechar configurações', + archivedChats: 'Chats Arquivados', + exportConfig: 'Exportar config', + importConfig: 'Importar config', + resetDefaults: 'Restaurar padrões', + llmProviders: 'Provedores LLM', + searchPlaceholder: { + about: 'Sobre o Hermes Desktop', + config: 'Pesquisar configurações…', + gateway: 'Conexão gateway…', + keys: 'Pesquisar chaves de API…', + mcp: 'Pesquisar servidores MCP…', + sessions: 'Pesquisar sessões arquivadas…', + }, + }, + chat: { + placeholder: 'Pergunte-me qualquer coisa…', + send: 'Enviar', + stop: 'Parar', + thinking: 'Pensando…', + noSession: 'Nenhuma sessão ativa. Inicie uma nova conversa.', + loadingSession: 'Carregando sessão', + loadingResponse: 'Hermes está carregando uma resposta', + branchInNewChat: 'Ramificar em novo chat', + readAloud: 'Ler em voz alta', + preparingAudio: 'Preparando áudio...', + stopReading: 'Parar leitura', + editMessage: 'Editar mensagem', + editableCheckpoint: 'Ponto de verificação editável', + restoreCheckpoint: 'Restaurar ponto de verificação', + goForward: 'Avançar', + restorePrevCheckpoint: 'Restaurar ponto de verificação anterior', + restoreNextCheckpoint: 'Restaurar próximo ponto de verificação', + composerTip: 'Dica: digite @ para referenciar arquivos inline.', + reconnecting: 'Reconectando ao Hermes…', + }, + commandCenter: { + title: 'Central de Comandos', + noSessions: 'Nenhuma sessão ainda.', + loadingStatus: 'Carregando status…', + recentLogs: 'Registros recentes', + dailyTokens: 'Tokens diários', + noActivity: 'Nenhuma atividade diária.', + noModelUsage: 'Nenhum uso de modelo ainda.', + noSkillActivity: 'Nenhuma atividade de skill ainda.', + sessionsPanel: 'Painel de sessões', + systemPanel: 'Painel do sistema', + usagePanel: 'Painel de uso', + navigate: 'Navegar', + noMatchingResults: 'Nenhum resultado correspondente encontrado.', + noSessionsYet: 'Nenhuma sessão ainda.', + unpinSession: 'Desafixar sessão', + pinSession: 'Fixar sessão', + exportSession: 'Exportar sessão', + deleteSession: 'Excluir sessão', + gatewayRunning: 'Gateway de mensageria em execução', + gatewayStopped: 'Gateway de mensageria parado', + restartMsg: 'Reiniciar mensageria', + updateHermes: 'Atualizar Hermes', + noLogsLoaded: 'Nenhum log carregado ainda.', + closeLabel: 'Fechar central de comandos', + searchPlaceholder: 'Pesquisar sessões, visualizações e ações', + statSessions: 'Sessões', + statApiCalls: 'Chamadas de API', + statTokens: 'Tokens in/out', + statEstCost: 'Custo est.', + cost => `real ${cost}`, + loadingUsage: 'Carregando uso...', + count => `Nenhum uso nos últimos ${count} dias.`, + retry: 'Tentar novamente', + tokenInput: 'entrada', + tokenOutput: 'saída', + noDailyActivity: 'Nenhuma atividade diária.', + topModels: 'Principais modelos', + topSkills: 'Principais skills', + actionsLabel: 'ações', + systemRunning: 'executando', + systemDone: 'concluído', + systemFailed: 'falhou', + open: 'Abrir Central de Comandos', + close: 'Fechar Central de Comandos', + }, + common: { + loading: 'Carregando…', + save: 'Salvar', + cancel: 'Cancelar', + close: 'Fechar', + delete: 'Excluir', + confirm: 'Confirmar', + search: 'Pesquisar…', + clearSearch: 'Limpar pesquisa', + copy: 'Copiar', + refresh: 'Atualizar', + moreActions: 'Mais ações', + tryAgain: 'Tentar novamente', + }, + onboarding: { + welcome: 'Bem-vindo ao Hermes', + getStarted: 'Comece escolhendo um provedor e modelo.', + skip: 'Pular', + continue: 'Continuar', + finish: 'Concluir', + setupTitle: 'Vamos configurar seu Hermes Agent', + setupDesc: 'Conecte um provedor de modelo para começar a conversar. A maioria das opções leva um clique.', + preparing: 'Iniciando Hermes…', + installing: 'Hermes está finalizando a instalação. Isso geralmente leva menos de um minuto na primeira execução.', + lookingUp: 'Procurando provedores...', + otherProviders: 'Outros provedores', + collapse: 'Recolher', + iHaveKey: 'Tenho uma chave de API', + recommended: 'Recomendado', + connected: 'Conectado', + backToSignIn: 'Voltar ao login', + getKey: 'Obter uma chave', + pasteKey: 'Colar chave de API', + connect: 'Conectar', + connecting: 'Conectando', + copyCode: 'Copiar', + startSignIn: 'Iniciando login para', + verifyingCode: 'Verificando seu código com', + pickingModel: 'conectado. Escolhendo um modelo padrão...', + signInFailed: 'Falha no login. Tente novamente.', + pickDifferent: 'Escolher um provedor diferente', + signInTitle: 'Entrar com', + step1: 'Abrimos', + step1End: 'em seu navegador.', + step2: 'Autorize o Hermes lá.', + step3: 'Copie o código de autorização e cole abaixo.', + pasteCode: 'Colar código de autorização', + reopenAuth: 'Reabrir página de autorização', + cancel: 'Cancelar', + browserDesc: 'Abrimos', + browserDescEnd: 'em seu navegador. Autorize o Hermes lá e você será conectado automaticamente — nada para copiar ou colar.', + waitingAuth: 'Aguardando sua autorização...', + reopenSignIn: 'Reabrir página de login', + externalDesc: 'faz login através de seu próprio CLI. Execute este comando em um terminal, depois volte e escolha "Entrei":', + iSignedIn: 'Entrei', + enterCode: 'Abrimos', + enterCodeEnd: 'em seu navegador. Insira este código lá:', + reopenVerification: 'Reabrir página de verificação', + defaultModel: 'Modelo padrão', + freeTier: 'Gratuito', + pro: 'Pro', + change: 'Alterar', + startChatting: 'Começar a conversar', + docs: 'docs', + close: 'Fechar', + savingError: 'Não foi possível salvar a credencial.', + openRouter: 'OpenRouter', + }, + file: { + browser: 'Navegador de Arquivos', + noFiles: 'Nenhum arquivo ainda.', + }, + terminal: { + title: 'Terminal', + newTab: 'Nova Guia', + closeTab: 'Fechar Guia', + }, + skills: { + title: 'Skills', + search: 'Pesquisar skills…', + noResults: 'Nenhuma skill encontrada.', + tools: 'Skills e Ferramentas', + }, + profiles: { + title: 'Perfis', + noProfilesYet: 'Nenhum perfil ainda.', + selectProfile: 'Selecione um perfil para ver seus detalhes.', + deleteProfile: 'Excluir perfil?', + soulMd: 'SOUL.md', + unsavedChanges: 'Alterações não salvas', + newProfile: 'Novo perfil', + cloneFromDefault: 'Clonar do padrão', + renameProfile: 'Renomear perfil', + }, + cron: { + title: 'Tarefas Agendadas', + noJobs: 'Nenhuma tarefa agendada.', + deleteCronJob: 'Excluir tarefa agendada?', + optional: 'Opcional', + label: 'Cron', + open: 'Abrir tarefas agendadas', + }, + messaging: { + title: 'Mensageria', + recommended: 'Recomendado', + recommendedTelegram: 'Recomendado. IDs numéricos separados por vírgula do @userinfobot. Sem isso, qualquer um pode enviar DM para seu bot.', + recommendedDiscord: 'Recomendado. IDs de usuário Discord separados por vírgula.', + recommendedSlack: 'Recomendado. IDs de usuário Slack separados por vírgula.', + recommendedMattermost: 'Recomendado. IDs de usuário Mattermost separados por vírgula.', + recommendedMatrix: 'Recomendado. IDs de usuário no formato @usuario:servidor separados por vírgula.', + recommendedSignal: 'Recomendado. Identificadores Signal separados por vírgula.', + recommendedWhatsApp: 'Recomendado. Números de telefone ou IDs WhatsApp separados por vírgula.', + gatewayStopped: 'Gateway de mensageria parado', + getCredentials: 'Obter suas credenciais', + required: 'Obrigatório', + unsavedChanges: 'Alterações não salvas', + saved: 'Salvo', + }, + about: { + version: 'Versão', + checkUpdates: 'Verificar Atualizações', + upToDate: 'O Hermes está atualizado.', + updateAvailable: 'Uma atualização está disponível.', + license: 'Licença MIT', + hermesDesktop: 'Hermes Desktop', + versionUnavailable: 'Versão indisponível', + updates: 'Atualizações', + checkNow: 'Verificar agora', + checking: 'Verificando…', + seeWhatsNew: 'Veja as novidades', + releaseNotes: 'Notas de versão', + autoUpdates: 'Atualizações automáticas', + autoUpdatesDesc: 'O Hermes verifica automaticamente por atualizações em segundo plano e avisa quando uma está pronta.', + selfUpdateUnsupported: 'Esta compilação não pode se atualizar de dentro do aplicativo.', + cannotReachServer: 'Não foi possível alcançar o servidor de atualizações.', + installingUpdate: 'Uma atualização está sendo instalada.', + count => `Uma nova atualização está pronta (${count} alteração incluída).`, + count => `Uma nova atualização está pronta (${count} alterações incluídas).`, + onLatest: 'Você está na versão mais recente.', + tapCheckNow: 'Toque em "Verificar agora" para procurar atualizações.', + time => `Última verificação ${time}`, + justNow: 'agora mesmo', + never: 'nunca', + count => `${count} min atrás`, + count => `${count} horas atrás`, + count => `${count} dias atrás`, + (branch, sha) => `Branch ${branch} · Commit ${sha}`, + }, + keys: { + title: 'Chaves de API', + noKeys: 'Nenhuma chave de API configurada.', + addKey: 'Adicionar Chave', + loading: 'Carregando chaves de API e credenciais…', + docs: 'Docs', + openDocs: 'Abrir documentação do provedor', + hideValue: 'Ocultar valor', + revealValue: 'Revelar valor', + set: 'Definir', + notSet: 'Não definido', + replace: 'Substituir', + replaceValue: 'Substituir valor atual', + enterValue: 'Inserir valor', + saving: 'Salvando', + save: 'Salvar', + cancel: 'Cancelar', + clearValue: 'Limpar valor', + (count, total) => `${count} de ${total} configurados`, + (count, total) => `${count} de ${total} definidos`, + count => `${count} definidos`, + count => `${count} chaves`, + otherProviders: 'Outros provedores', + categoryTools: 'Ferramentas', + categoryMessaging: 'Mensageria', + categorySettings: 'Configurações', + openProviderDocs: 'Abrir documentação do provedor', + showAdvanced: 'Mostrar avançado', + loadFailed: 'Falha ao carregar chaves de API', + credentialSaved: 'Credencial salva', + credentialRemoved: 'Credencial removida', + }, + config: { + title: 'Configuração', + edit: 'Editar Config', + reload: 'Recarregar Config', + notSet: 'Não definido', + commaSeparated: 'valores separados por vírgula', + on: 'Ligado', + off: 'Desligado', + none: 'Nenhum', + emptyOption: '(nenhum)', + loading: 'Carregando configuração do Hermes…', + noMatching: 'Nenhuma configuração correspondente', + noMatchingDesc: 'Tente um termo de pesquisa diferente ou escolha outra seção.', + count => `${count} resultado`, + count => `${count} resultados`, + saving: 'Salvando…', + label: { + defaultModel: 'Modelo Padrão', + contextWindow: 'Janela de Contexto', + fallbackModels: 'Modelos de Reserva', + enabledToolsets: 'Conjuntos de Ferramentas Ativados', + timezone: 'Fuso Horário', + personality: 'Personalidade', + reasoningBlocks: 'Blocos de Raciocínio', + maxAgentSteps: 'Máx. de Passos do Agente', + imageAttachments: 'Anexos de Imagem', + workingDirectory: 'Diretório de Trabalho', + executionBackend: 'Backend de Execução', + commandTimeout: 'Timeout de Comando', + persistentShell: 'Shell Persistente', + envPassthrough: 'Passagem de Variáveis de Ambiente', + fileReadLimit: 'Limite de Leitura de Arquivos', + terminalOutputLimit: 'Limite de Saída do Terminal', + filePageLimit: 'Limite de Páginas de Arquivo', + lineLengthLimit: 'Limite de Comprimento de Linha', + codeExecutionMode: 'Modo de Execução de Código', + approvalMode: 'Modo de Aprovação', + approvalTimeout: 'Timeout de Aprovação', + confirmMcpReloads: 'Confirmar Recarregamentos MCP', + commandAllowlist: 'Lista de Permissões de Comandos', + redactSecrets: 'Ocultar Segredos', + allowPrivateUrls: 'Permitir URLs Privadas', + browserPrivateUrls: 'URLs Privadas do Navegador', + localBrowserForPrivateUrls: 'Navegador Local para URLs Privadas', + fileCheckpoints: 'Pontos de Verificação de Arquivos', + checkpointLimit: 'Limite de Pontos de Verificação', + voiceShortcut: 'Atalho de Voz', + maxRecordingLength: 'Duração Máx. de Gravação', + readResponsesAloud: 'Ler Respostas em Voz Alta', + speechToText: 'Fala para Texto', + speechToTextProvider: 'Provedor de Fala para Texto', + localTranscriptionModel: 'Modelo de Transcrição Local', + transcriptionLanguage: 'Idioma de Transcrição', + elevenlabsSttModel: 'Modelo STT ElevenLabs', + elevenlabsLanguage: 'Idioma ElevenLabs', + tagAudioEvents: 'Marcar Eventos de Áudio', + speakerDiarization: 'Diarização de Locutor', + textToSpeechProvider: 'Provedor de Texto para Fala', + edgeVoice: 'Voz Edge', + openaiTtsModel: 'Modelo TTS OpenAI', + openaiVoice: 'Voz OpenAI', + elevenlabsVoice: 'Voz ElevenLabs', + elevenlabsModel: 'Modelo ElevenLabs', + persistentMemory: 'Memória Persistente', + userProfile: 'Perfil de Usuário', + memoryBudget: 'Orçamento de Memória', + profileBudget: 'Orçamento de Perfil', + memoryProvider: 'Provedor de Memória', + contextEngine: 'Mecanismo de Contexto', + autoCompression: 'Compressão Automática', + compressionThreshold: 'Limiar de Compressão', + compressionTarget: 'Alvo de Compressão', + protectedRecentMessages: 'Mensagens Recentes Protegidas', + apiRetries: 'Tentativas de API', + serviceTier: 'Nível de Serviço', + toolUseEnforcement: 'Imposição de Uso de Ferramentas', + subagentModel: 'Modelo do Subagente', + subagentProvider: 'Provedor do Subagente', + subagentTurnLimit: 'Limite de Turnos do Subagente', + parallelSubagents: 'Subagentes Paralelos', + subagentTimeout: 'Timeout do Subagente', + subagentReasoningEffort: 'Esforço de Raciocínio do Subagente', + }, + desc: { + defaultModel: 'Usado para novos chats a menos que você escolha um modelo diferente no composer.', + contextWindow: 'Deixe em 0 para usar a janela de contexto detectada do modelo selecionado.', + fallbackModels: 'Entradas provedor:modelo de reserva para tentar se o modelo padrão falhar.', + personality: 'Estilo de assistente padrão para novas sessões.', + timezone: 'Usado quando Hermes precisa de contexto de hora local. Vazio usa o fuso horário do sistema.', + reasoningBlocks: 'Mostrar seções de raciocínio quando o backend as fornece.', + imageAttachments: 'Controla como anexos de imagem são enviados ao modelo.', + workingDirectory: 'Pasta de projeto padrão para trabalho com ferramentas e terminal.', + codeExecutionMode: 'Quão estritamente a execução de código é limitada ao projeto atual.', + persistentShell: 'Manter estado do shell entre comandos quando o backend suporta.', + envPassthrough: 'Variáveis de ambiente para passar para a execução de ferramentas.', + fileReadLimit: 'Máximo de caracteres que Hermes pode ler de uma solicitação de arquivo.', + approvalMode: 'Como Hermes lida com comandos que precisam de aprovação explícita.', + approvalTimeout: 'Quanto tempo os prompts de aprovação esperam antes de expirar.', + redactSecrets: 'Ocultar segredos detectados do conteúdo visível ao modelo quando possível.', + fileCheckpoints: 'Criar snapshots de reversão antes de edições de arquivos.', + persistentMemory: 'Salvar memórias duráveis que podem ajudar sessões futuras.', + userProfile: 'Manter um perfil compacto de preferências do usuário.', + contextEngine: 'Estratégia para gerenciar conversas longas perto do limite de contexto.', + autoCompression: 'Resumir contexto mais antigo quando as conversas ficam grandes.', + readResponsesAloud: 'Falar respostas do assistente automaticamente.', + speechToText: 'Habilitar transcrição de fala local ou baseada em provedor.', + elevenlabsLanguage: 'Código de idioma ISO-639-3 opcional. Vazio deixa o ElevenLabs detectar automaticamente.', + maxAgentSteps: 'Limite superior para turnos de chamada de ferramentas antes do Hermes parar uma execução.', + }, + }, + gateway: { + title: 'Gateway', + start: 'Iniciar Gateway', + stop: 'Parar Gateway', + restart: 'Reiniciar Gateway', + running: 'Executando', + stopped: 'Parado', + loading: 'Carregando configurações do gateway…', + unavailable: 'Configurações do gateway indisponíveis', + unavailableDesc: 'A bridge IPC do desktop não expõe configurações do gateway.', + connection: 'Conexão Gateway', + envOverride: 'substituído por env', + desc: 'O Hermes Desktop inicia seu próprio gateway local por padrão. Use um gateway remoto quando quiser que este aplicativo controle um backend Hermes já em execução em outra máquina ou atrás de um proxy confiável.', + envOverrideTitle: 'Variáveis de ambiente estão controlando esta sessão desktop.', + (urlVar, tokenVar) => `Remova ${urlVar} e ${tokenVar} para usar a configuração salva abaixo.`, + localTitle: 'Gateway local', + localDesc: 'Iniciar um backend Hermes privado no localhost. Este é o padrão e funciona offline.', + remoteTitle: 'Gateway remoto', + remoteDesc: 'Conectar este shell desktop a um backend Hermes remoto usando seu token de sessão.', + remoteUrl: 'URL Remota', + remoteUrlDesc: 'URL base para o backend do dashboard remoto. Prefixos de caminho são suportados, por exemplo /hermes.', + remoteUrlPlaceholder: 'https://gateway.exemplo.com/hermes', + sessionToken: 'Token de sessão', + sessionTokenDesc: 'O token de sessão do dashboard usado para acesso REST e WebSocket. Deixe em branco para manter o token salvo.', + sessionTokenPlaceholder: 'Cole o token de sessão', + preview => `Token existente ${preview}`, + tokenSaved: 'salvo', + testRemote: 'Testar remoto', + saveRestart: 'Salvar para próxima reinicialização', + saveReconnect: 'Salvar e reconectar', + diagnostics: 'Diagnósticos', + diagnosticsDesc: 'Revelar desktop.log no gerenciador de arquivos — útil quando o gateway falha ao iniciar.', + openLogs: 'Abrir logs', + connected: 'Conectado', + connecting: 'Conectando', + disconnected: 'Desconectado', + inferenceReady: 'Inferência pronta', + inferenceNotReady: 'Inferência não pronta', + checkingInference: 'Verificando inferência', + openSystemPanel: 'Abrir painel do sistema', + connectionLabel: 'Conexão:', + recentActivity: 'Atividade recente', + viewAllLogs: 'Ver todos os logs →', + messagingPlatforms: 'Plataformas de mensageria', + label: 'Gateway', + inferenceStatus: 'Status de inferência do gateway', + enterUrlFirst: 'Insira uma URL remota e token de sessão antes de trocar', + enterUrlFirstTest: 'Insira uma URL remota e token de sessão antes de testar', + }, + sessions: { + title: 'Sessões', + search: 'Pesquisar sessões…', + noResults: 'Nenhuma sessão encontrada.', + export: 'Exportar', + delete: 'Excluir Sessão', + loading: 'Carregando…', + defaultProjectDir: 'Diretório de projeto padrão', + defaultProjectDirDesc: 'Novas sessões iniciam nesta pasta a menos que você escolha outra. Deixe vazio para usar seu diretório home.', + fallback => `Padrão para ${fallback}.`, + notSet: 'Não definido', + change: 'Alterar', + choose: 'Escolher', + clear: 'Limpar', + archivedTitle: 'Sessões arquivadas', + archivedDesc: 'Chats arquivados ficam ocultos da barra lateral, mas mantêm todas as mensagens. Ctrl/⌘-clique em um chat na barra lateral para arquivá-lo.', + nothingArchived: 'Nada arquivado', + noSearchMatch: 'Nenhum chat arquivado corresponde à sua pesquisa.', + archiveToHide: 'Arquive um chat para ocultá-lo aqui.', + unarchive: 'Desarquivar', + deletePermanently: 'Excluir permanentemente', + count => `${count} mensagens`, + new: 'Nova sessão', + running: 'Sessão em execução', + actions: 'Ações da sessão', + reorder: 'Reordenar', + pin: 'Fixar', + unpin: 'Desafixar', + copyId: 'Copiar ID', + rename: 'Renomear', + archive: 'Arquivar', + renameDialog: 'Renomear sessão', + renameDesc: 'Dê a este chat um título memorável. Deixe vazio para limpar.', + untitled: 'Sessão sem título', + renamed: 'Renomeado', + renameFailed: 'Falha ao renomear', + pinned: 'Fixado', + results: 'Resultados', + allPinned: 'Tudo aqui está fixado. Desafixe um chat para mostrá-lo nos recentes.', + pinHint: 'Shift+clique em um chat para fixar · arraste para reordenar', + loadMore: 'Carregar mais', + noWorkspace: 'Sem espaço de trabalho', + ungroup: 'Mostrar sessões como uma única lista', + groupByWorkspace: 'Agrupar sessões por espaço de trabalho', + loadStep: 'Carregar', + moreLabel: 'mais', + nothingArchivedTitle: 'Nada arquivado', + deletePermanentlyTitle: 'Excluir permanentemente', + defaultProjectDirTitle: 'Diretório de projeto padrão', + loadingArchived: 'Carregando sessões arquivadas…', + restored: 'Restaurado', + projectDirUpdated: 'Diretório de projeto padrão atualizado', + loadFailed: 'Não foi possível carregar sessões arquivadas', + unarchiveFailed: 'Falha ao desarquivar', + deleteFailed: 'Falha ao excluir', + archiveHint: 'Arquive um chat para ocultá-lo aqui.', + updateDirFailed: 'Não foi possível atualizar o diretório padrão', + clearDirFailed: 'Não foi possível limpar o diretório padrão', + }, + mcp: { + title: 'Servidores MCP', + addServer: 'Adicionar Servidor', + noServers: 'Nenhum servidor MCP configurado.', + loading: 'Carregando servidores MCP…', + servers: 'Servidores MCP', + count => `${count} configurados`, + newServer: 'Novo servidor', + reloadMCP: 'Recarregar MCP', + reloading: 'Recarregando...', + noServersDesc: 'Adicione um servidor stdio ou HTTP para expor ferramentas MCP.', + name: 'Nome', + namePlaceholder: 'filesystem', + serverJSON: 'JSON do Servidor', + editServer: 'Editar servidor', + saveServer: 'Salvar servidor', + saving: 'Salvando...', + remove: 'Remover', + disabled: 'desativado', + nameRequired: 'Nome obrigatório', + nameRequiredDesc: 'Dê a este servidor MCP uma chave de configuração.', + invalidJson: 'A configuração do servidor deve ser um objeto JSON', + invalidJsonDesc: 'JSON MCP inválido', + saved: 'Servidor MCP salvo', + name => `${name} é aplicado após recarregar MCP.`, + saveFailed: 'Falha ao salvar', + removeFailed: 'Falha ao remover', + gatewayUnavailable: 'Gateway indisponível', + gatewayUnavailableDesc: 'Reconecte o gateway antes de recarregar MCP.', + reloadedTitle: 'Ferramentas MCP recarregadas', + reloadedDesc: 'Novos schemas de ferramentas se aplicam a novos turnos.', + reloadFailed: 'Falha ao recarregar MCP', + giveConfigKey: 'Dê a este servidor MCP uma chave de configuração.', + reconnectGateway: 'Reconecte o gateway antes de recarregar MCP.', + newSchemas: 'Novos schemas de ferramentas se aplicam a novos turnos.', + loadingServers: 'Carregando servidores MCP...', + serverName: 'Nome', + serversTitle: 'Servidores MCP', + noServersTitle: 'Nenhum servidor MCP', + failedToLoad: 'Falha ao carregar configuração MCP', + invalidJsonShort: 'JSON MCP inválido', + serverSaved: 'Servidor MCP salvo', + toolsReloaded: 'Ferramentas MCP recarregadas', + emptyDesc: 'Adicione um servidor stdio ou HTTP para expor ferramentas MCP.', + }, + tools: { + title: 'Ferramentas e Skills', + noTools: 'Nenhuma ferramenta disponível.', + }, + nav: { + home: 'Início', + chat: 'Chat', + settings: 'Configurações', + files: 'Arquivos', + terminal: 'Terminal', + }, + header: { + search: 'Pesquise ou digite um comando…', + }, + model: { + auxTask: { + vision: 'Visão', + visionHint: 'Análise de imagem', + web_extract: 'Extração web', + web_extractHint: 'Resumo de página', + compression: 'Compressão', + compressionHint: 'Compactação de contexto', + session_search: 'Pesquisa de sessão', + session_searchHint: 'Consultas de recall', + skills_hub: 'Central de skills', + skills_hubHint: 'Pesquisa de skills', + approval: 'Aprovação', + approvalHint: 'Aprovação automática inteligente', + mcp: 'MCP', + mcpHint: 'Roteamento de ferramentas MCP', + title_generation: 'Geração de título', + title_generationHint: 'Títulos de sessão', + curator: 'Curador', + curatorHint: 'Revisão de uso de skills', + }, + mainModel: 'Modelo principal', + mainDesc: 'Aplica-se a novas sessões. Use o seletor de modelo no composer para trocar o chat ativo.', + providerPlaceholder: 'Provedor', + modelPlaceholder: 'Modelo', + apply: 'Aplicar', + applying: 'Aplicando…', + auxiliaryModels: 'Modelos auxiliares', + auxiliaryDesc: 'Tarefas auxiliares usam o modelo principal por padrão. Atribua um modelo dedicado a qualquer tarefa para substituir.', + resetAllToMain: 'Redefinir todos para principal', + setToMain: 'Definir como principal', + change: 'Alterar', + cancel: 'Cancelar', + autoUseMain: 'auto · usar modelo principal', + providerDefault: '(padrão do provedor)', + loading: 'Carregando configuração do modelo…', + options: 'Opções', + thinking: 'Pensamento', + fast: 'Rápido', + effort: 'Esforço', + noOptions: 'Nenhuma opção para este modelo', + optionUpdateFailed: 'Falha ao atualizar opção do modelo', + fastModeUpdateFailed: 'Falha ao atualizar modo rápido', + effortMinimal: 'Mínimo', + effortLow: 'Baixo', + effortMedium: 'Médio', + effortHigh: 'Alto', + effortMax: 'Máximo', + switch: 'Trocar modelo', + unknown: '(desconhecido)', + filterPlaceholder: 'Filtrar provedores e modelos...', + persistGlobal: 'Persistir globalmente', + persistGlobalSession: 'Persistir globalmente (caso contrário apenas nesta sessão)', + couldNotLoad: 'Não foi possível carregar modelos', + proLockedDesc: 'Modelos Pro precisam de uma assinatura Nous paga.', + priceTooltip: 'Preço de entrada/saída por milhão de tokens', + freePrice: 'Grátis', + currentLabel: 'atual:', + addProviderBtn: 'Adicionar provedor', + }, + updates: { + checking: 'Verificando atualizações…', + available: 'Atualização disponível', + downloading: 'Baixando…', + installing: 'Instalando…', + restart: 'Reiniciar para atualizar', + stageGettingReady: 'Preparando…', + stageDownloading: 'Baixando…', + stageAlmostThere: 'Quase lá…', + stageFinishingUp: 'Finalizando…', + stageRestarting: 'Reiniciando Hermes…', + stageManual: 'Atualizar pelo terminal', + stageError: 'Atualização pausada', + updatingHermes: 'Atualizando Hermes…', + lookingForUpdates: 'Procurando atualizações…', + couldntCheck: 'Não foi possível verificar atualizações', + updateNotAvailable: 'Atualização não disponível', + checkConnection: 'Verifique sua conexão e tente novamente.', + onLatest: 'Você está executando a versão mais recente.', + allSet: 'Tudo pronto', + newUpdateAvailable: 'Nova atualização disponível', + readyToInstall: 'Uma nova versão do Hermes está pronta para instalar.', + updateNow: 'Atualizar agora', + maybeLater: 'Talvez depois', + count => `+ ${count} alteração adicional incluída.`, + count => `+ ${count} alterações adicionais incluídas.`, + updateFromTerminal: 'Atualizar pelo terminal', + terminalDesc: 'Você instalou o Hermes pela linha de comando, então as atualizações também funcionam lá. Cole isto no seu terminal:', + copied: 'Copiado', + copy: 'Copiar', + pickupNewVersion: 'O Hermes usará a nova versão na próxima vez que você o iniciar.', + done: 'Concluído', + updaterDesc: 'O atualizador do Hermes assumirá em sua própria janela e reabrirá o Hermes quando terminar.', + closeToApply: 'O Hermes fechará para aplicar a atualização.', + updateDidntFinish: 'A atualização não foi concluída', + nothingLost: 'Sem problemas — nada foi perdido. Você pode tentar novamente agora.', + notNow: 'Agora não', + }, + errors: { + generic: 'Algo deu errado.', + notFound: 'Página não encontrada.', + noPermission: 'Você não tem permissão para acessar isto.', + somethingBroke: 'Algo quebrou na interface', + viewCrashedDesc: 'A visão encontrou um erro inesperado. Seus chats e configurações estão seguros - tente novamente ou recarregue a janela.', + noProviders: 'Nenhum provedor autenticado.', + }, + tool: { + toolCall: 'Chamada de Ferramenta', + result: 'Resultado', + error: 'Erro', + timeout: 'Tempo esgotado', + cancelled: 'Cancelado', + running: 'Executando', + recovered: 'Recuperado', + done: 'Concluído', + output: 'Saída da ferramenta', + searchResults: 'Resultados da pesquisa', + rawResponse: 'Resposta bruta', + stdout: 'stdout', + stderr: 'stderr', + copyActivity: 'Copiar atividade', + recoveredAfter: 'Recuperado após 1 etapa falha', + count => `Recuperado após ${count} etapas falhas`, + oneStepFailed: '1 etapa falhou', + count => `${count} etapas falharam`, + }, + composer: { + startingHermes: 'Iniciando Hermes...', + sendFollowUp: 'Enviar continuação', + message: 'Mensagem', + editingQueued: 'Editando turno na fila no composer', + attach: 'Anexar', + files: 'Arquivos…', + folder: 'Pasta…', + images: 'Imagens…', + pasteImage: 'Colar imagem', + url: 'URL…', + promptSnippets: 'Trechos de prompt', + promptSnippetsDesc: 'Escolha um prompt inicial para inserir no composer.', + voiceStart: 'Iniciar conversa por voz', + queue: 'Enfileirar mensagem', + speaking: 'Falando', + transcribing: 'Transcrevendo', + muted: 'Silenciado', + listening: 'Ouvindo', + unmuteMic: 'Ativar microfone', + muteMic: 'Silenciar microfone', + stopListening: 'Parar de ouvir e enviar', + endVoice: 'Encerrar conversa por voz', + end: 'Encerrar', + stopDictation: 'Parar ditado', + transcribingDictation: 'Transcrevendo ditado', + voiceDictation: 'Ditado por voz', + addContext: 'Adicionar contexto', + }, + models: { + title: 'Modelos', + search: 'Pesquisar modelos', + addProvider: 'Adicionar provedor…', + }, + install: { + title: 'Hermes precisa de uma instalação única', + desc: 'Instalação automatizada na primeira execução não está disponível no', + descEnd: 'ainda. Abra o Terminal e execute o comando abaixo, depois reabra este aplicativo. Inicializações subsequentes pularão esta etapa.', + installCommand: 'Comando de instalação', + copyCommand: 'Copiar comando', + viewDocs: 'Ver docs de instalação', + willInstallTo: 'Será instalado em', + iRanIt: 'Eu executei — tentar novamente', + failed: 'Falha na instalação', + settingUp: 'Configurando Hermes Agent', + finishingUp: 'Finalizando', + failedDesc: 'Uma das etapas de instalação falhou. No Windows, isso pode acontecer se outra instância do Hermes CLI ou desktop estiver em execução. Pare qualquer instância do Hermes em execução e tente novamente. Verifique os detalhes abaixo ou o log do desktop para o transcript completo.', + setupDesc: 'Esta é uma configuração única. O instalador do Hermes está baixando dependências e configurando sua máquina. Inicializações subsequentes pularão esta etapa.', + fetchingManifest: 'Buscando manifesto do instalador...', + error: 'Erro', + showOutput: 'Mostrar saída do instalador', + hideOutput: 'Ocultar saída do instalador', + noOutput: 'Nenhuma saída ainda.', + cancelInstall: 'Cancelar instalação', + cancelling: 'Cancelando...', + copyOutput: 'Copiar saída', + copied: 'Copiado!', + reloadRetry: 'Recarregar e tentar novamente', + saveLogs: 'Transcript completo salvo em', + stepsComplete: 'etapas concluídas', + nowLabel: 'agora', + line: 'linha', + lines: 'linhas', + }, + previewConsole: { + resizeLabel: 'Redimensionar console de pré-visualização', + noMessages: 'Nenhuma mensagem no console ainda.', + }, + boot: { + ipcUnavailable: 'Bridge IPC do Desktop indisponível.', + backendExited: 'O processo em segundo plano do Hermes saiu durante a inicialização.', + backendStoppedTitle: 'Backend parado', + backendStoppedMessage: 'O processo em segundo plano do Hermes saiu.', + startingConnection: 'Iniciando conexão desktop', + connectingGateway: 'Conectando gateway desktop ativo', + loadingConfig: 'Carregando configurações do Hermes', + loadingSessions: 'Carregando sessões recentes', + desktopBootFailed: 'Falha na inicialização do desktop', + couldNotStart: 'Hermes não pôde iniciar', + recoveryDesc: 'O gateway em segundo plano não subiu. Tente uma das etapas de recuperação abaixo — nada aqui exclui seus chats ou configurações.', + retry: 'Tentar novamente', + repairInstall: 'Reparar instalação', + useLocalGateway: 'Usar gateway local', + openLogs: 'Abrir logs', + repairHint: 'Reparar executa o instalador novamente e pode levar alguns minutos em uma máquina nova.', + showLogs: 'Mostrar logs recentes', + hideLogs: 'Ocultar logs recentes', + }, + urlDialog: { + title: 'Anexar uma URL', + description: 'Hermes buscará a página e a incluirá como contexto para este turno.', + placeholder: 'https://exemplo.com/post', + hint: 'Inclua a URL completa, ex.', + attach: 'Anexar', + }, + titlebar: { + hideSidebar: 'Ocultar barra lateral', + showSidebar: 'Mostrar barra lateral', + search: 'Pesquisar', + searchTitle: 'Pesquisar sessões, visualizações e ações', + hideRightSidebar: 'Ocultar barra lateral direita', + showRightSidebar: 'Mostrar barra lateral direita', + unmuteHaptics: 'Ativar resposta tátil', + muteHaptics: 'Desativar resposta tátil', + openSettings: 'Abrir configurações', + profiles: 'Perfis', + profilesDesc: 'Ambientes Hermes avançados para personas, config, skills e SOUL.md separados.', + manageProfiles: 'Gerenciar perfis', + language: 'Idioma', + languageDesc: 'Escolha um idioma de exibição para a interface.', + }, + pagination: { + ariaLabel: 'paginação', + prevAria: 'Ir para página anterior', + prev: 'Anterior', + nextAria: 'Ir para próxima página', + next: 'Próximo', + }, + bootstrap: { + pending: 'Pendente', + running: 'Instalando', + done: 'Concluído', + skipped: 'Pulado', + failed: 'Falhou', + }, + sidebar: { + sheetTitle: 'Barra lateral', + sheetDesc: 'Exibe a barra lateral móvel.', + toggle: 'Alternar Barra Lateral', + }, + clarify: { + hermesIsAsking: 'Hermes está perguntando', + loadingQuestion: 'Carregando pergunta…', + otherTypeAnswer: 'Outro (digite sua resposta)', + placeholderAnswer: 'Digite sua resposta…', + cmdEnterToSend: '⌘/Ctrl + Enter para enviar', + back: 'Voltar', + skip: 'Pular', + couldNotSend: 'Não foi possível enviar resposta de esclarecimento', + n => `1–${n} para escolher`, + }, + intro: { + fallback1h: 'O que vamos mover hoje?', + fallback1b: 'Envie um bug, branch, plano ou ideia. Vou inspecionar o repositório e transformar no próximo passo concreto.', + fallback2h: 'O que está na sua mente?', + fallback2b: 'Traga o código, a pergunta ou a parte travada. Vou ler o cenário antes de fazer alterações.', + fallback3h: 'O que o Hermes deve analisar?', + fallback3b: 'Envie a tarefa, caminho com falha ou plano incompleto. Vou ajudar a transformar em ação.', + fallback4h: 'Por onde devemos começar?', + fallback4b: 'Traga o problema, objetivo ou arquivo. Vou inspecionar primeiro e manter o próximo passo concreto.', + fallback5h: 'O que precisa de atenção?', + fallback5b: 'Envie o contexto que você tem. Vou ajudar a organizar em um plano ou correção.', + personality: { + label => `Modo ${label} está ativo. No que devemos trabalhar?`, + body1: 'Envie a tarefa, arquivo ou ideia. Usarei sua voz configurada e manterei o trabalho fundamentado neste repositório.', + label => `O que o Hermes ${label} precisa ver?`, + body2: 'Traga o contexto ou a parte travada. Vou me adaptar à personalidade configurada.', + label => `Modo ${label} está pronto.`, + body3: 'Envie o problema, arquivo ou ideia. Seguirei a personalidade que você configurou.', + label => `O que o Hermes ${label} deve enfrentar?`, + body4: 'Lance a tarefa aqui. Manterei o trabalho fundamentado no repositório.', + heading5: 'Por onde começamos?', + label => `Me dê o contexto e responderei no modo ${label}.`, + }, + brand: 'HERMES AGENT', + }, + artifacts: { + noArtifactsFound: 'Nenhum artefato encontrado', + }, + agents: { + spawnTree: 'Árvore de spawn', + liveSubagentActivity: 'Atividade de subagentes ativos para o turno atual.', + noLiveSubagents: 'Nenhum subagente ativo', + files: 'Arquivos', + label: 'Agentes', + open: 'Abrir agentes', + close: 'Fechar agentes', + subagent: 'subagente', + subagents: 'subagentes', + failed: 'falhou', + running: 'executando', + }, + provider: { + desc: { + nousPortal: 'Substituição da URL base do Nous Portal', + openRouter: 'Chave de API do OpenRouter (para visão, auxiliares de scraping web e MoA)', + google: 'Chave de API do Google AI Studio (também reconhecida como GEMINI_API_KEY)', + gemini: 'ID do projeto GCP para tiers Gemini pagos (tier gratuito aprovisiona automaticamente)', + anthropic: 'Chave de API Anthropic', + deepseek: 'URL base personalizada da API DeepSeek (avançado)', + xai: 'Substituição da URL base xAI', + huggingface: 'Substituição da URL base do Hugging Face Inference Providers', + kimi: 'Chave de API Kimi / Moonshot China', + minimax: 'Substituição da URL base MiniMax (China)', + minimaxCn: 'Chave de API MiniMax China', + dashscope: 'URL base DashScope personalizada (padrão: endpoint compatível com OpenAI coding-intl)', + glm: 'Chave de API GLM (Z.AI)', + nvidia: 'Substituição da URL base NVIDIA NIM (ex. http://localhost:8000/v1 para NIM local)', + opencodeGo: 'Chave de API OpenCode Go', + opencodeZen: 'Chave de API OpenCode Zen', + xiaomi: 'Substituição da URL base Xiaomi MiMo (padrão: https://api.xiaomimimo.com/v1)', + kiloCode: 'Chave de API Kilo Code', + aiGateway: 'Chave de API AI Gateway (Vercel AI Gateway)', + browserbase: 'BROWSERBASE_API_KEY', + elevenLabs: 'Chave de API ElevenLabs', + openai: 'Chave de API OpenAI (para processamento de voz via proxy)', + mistral: 'Chave de API Mistral (para STT/TTS)', + groq: 'Chave de API Groq (para STT)', + tavily: 'TAVILY_API_KEY', + firecrawl: 'URL da API Firecrawl para instâncias auto-hospedadas (opcional)', + fal: 'FAL_KEY', + nous: 'Substituição da URL base do Nous Portal', + openrouter: 'Chave de API OpenRouter (para visão, auxiliares de scraping web e MoA)', + lmstudio: 'Substituição da URL base Z.AI / GLM', + zai: 'URL base do Azure Foundry (definida via \'hermes model\' para config específica de endpoint)', + stepfun: 'Substituição da URL base StepFun Step Plan', + arcee: 'Substituição da URL base Arcee AI', + gmi: 'Substituição da URL base GMI Cloud', + qwenportal: 'Substituição da URL base do Qwen Portal (padrão: https://portal.qwen.ai/v1)', + opencodego: 'Substituição da URL base OpenCode Go', + ollamacloud: 'Substituição da URL base Ollama Cloud (padrão: https://ollama.com/v1)', + awsbedrock: 'Perfil nomeado AWS para autenticação Bedrock (de ~/.aws/credentials)', + exa: 'Chave de API Exa para pesquisa web e conteúdo nativa de IA', + parallel: 'Chave de API Parallel para pesquisa web e extração nativa de IA', + }, + }, +} +) diff --git a/apps/desktop/src/i18n/ru.ts b/apps/desktop/src/i18n/ru.ts new file mode 100644 index 000000000000..1fa10d55c66e --- /dev/null +++ b/apps/desktop/src/i18n/ru.ts @@ -0,0 +1,953 @@ +import { defineLocale } from './define-locale' + +export const ru = defineLocale( +{ + appearance: { + title: 'Оформление', + description: 'Настройки отображения только для десктопа. Режим управляет яркостью; тема управляет палитрой акцентов и стилем чата.', + colorMode: 'Цветовой режим', + colorModeDesc: 'Выберите фиксированный режим или позвольте Hermes следовать системной настройке.', + theme: { + nous: 'Nous', + nousDesc: 'Стеклянные нейтральные тона с синими акцентами Nous', + midnight: 'Полночь', + midnightDesc: 'Глубокий сине-фиолетовый с холодными акцентами', + ember: 'Угли', + emberDesc: 'Тёплый малиновый и бронзовый — атмосфера кузницы', + mono: 'Моно', + monoDesc: 'Чистые оттенки серого — минимализм и фокус', + cyberpunk: 'Киберпанк', + cyberpunkDesc: 'Неоновый зелёный на чёрном — терминал матрицы', + slate: 'Сланец', + slateDesc: 'Холодный сине-серый — тема для разработчиков', + }, + themeDesc: 'Выберите цветовую палитру для чата и акцентов интерфейса.', + mode: { + light: 'Светлая', + lightDesc: 'Светлые поверхности рабочего стола', + dark: 'Тёмная', + darkDesc: 'Рабочее пространство без бликов', + system: 'Системная', + systemDesc: 'Следовать оформлению ОС', + }, + language: 'Язык', + languageDesc: 'Выберите язык интерфейса или позвольте Hermes следовать системным настройкам.', + toolCallDisplay: 'Отображение вызовов инструментов', + toolCallDisplayDesc: 'Продуктовый скрывает сырые данные; Технический показывает полный ввод/вывод.', + toolViewProduct: 'Продуктовый', + toolViewTechnical: 'Технический', + toolViewProductDesc: 'Дружелюбная активность инструментов с краткими сводками.', + toolViewTechnicalDesc: 'Включать сырые аргументы/результаты и низкоуровневые детали.', + }, + settings: { + title: 'Настройки', + appearance: 'Оформление', + model: 'Модель', + gateway: 'Шлюз', + sessions: 'Сессии', + tools: 'Инструменты и навыки', + section: { + chat: 'Чат', + workspace: 'Рабочая область', + safety: 'Безопасность', + memory: 'Память и контекст', + voice: 'Голос', + advanced: 'Дополнительно', + }, + mcp: 'Серверы MCP', + config: 'Конфигурация', + keys: 'Ключи API', + about: 'О программе', + closeSettings: 'Закрыть настройки', + archivedChats: 'Архивные чаты', + exportConfig: 'Экспорт конфигурации', + importConfig: 'Импорт конфигурации', + resetDefaults: 'Сбросить настройки', + llmProviders: 'LLM-провайдеры', + searchPlaceholder: { + about: 'О Hermes Desktop', + config: 'Поиск настроек…', + gateway: 'Подключение к шлюзу…', + keys: 'Поиск ключей API…', + mcp: 'Поиск серверов MCP…', + sessions: 'Поиск архивных сессий…', + }, + }, + chat: { + placeholder: 'Спросите о чём угодно…', + send: 'Отправить', + stop: 'Остановить', + thinking: 'Думаю…', + noSession: 'Нет активной сессии. Начните новый разговор.', + loadingSession: 'Загрузка сессии', + loadingResponse: 'Hermes загружает ответ', + branchInNewChat: 'Ответвить в новый чат', + readAloud: 'Прочитать вслух', + preparingAudio: 'Подготовка аудио...', + stopReading: 'Остановить чтение', + editMessage: 'Редактировать сообщение', + editableCheckpoint: 'Редактируемая точка сохранения', + restoreCheckpoint: 'Восстановить точку', + goForward: 'Вперёд', + restorePrevCheckpoint: 'Восстановить предыдущую точку', + restoreNextCheckpoint: 'Восстановить следующую точку', + composerTip: 'Совет: введите @ для ссылки на файлы.', + reconnecting: 'Переподключение к Hermes…', + }, + commandCenter: { + title: 'Командный центр', + noSessions: 'Сессий пока нет.', + loadingStatus: 'Загрузка статуса…', + recentLogs: 'Последние логи', + dailyTokens: 'Токены за день', + noActivity: 'Нет активности за день.', + noModelUsage: 'Использования моделей пока нет.', + noSkillActivity: 'Активности навыков пока нет.', + sessionsPanel: 'Панель сессий', + systemPanel: 'Системная панель', + usagePanel: 'Панель использования', + navigate: 'Навигация', + noMatchingResults: 'Совпадений не найдено.', + noSessionsYet: 'Сессий пока нет.', + unpinSession: 'Открепить сессию', + pinSession: 'Закрепить сессию', + exportSession: 'Экспортировать сессию', + deleteSession: 'Удалить сессию', + gatewayRunning: 'Шлюз мессенджеров работает', + gatewayStopped: 'Шлюз мессенджеров остановлен', + restartMsg: 'Перезапустить мессенджеры', + updateHermes: 'Обновить Hermes', + noLogsLoaded: 'Логи ещё не загружены.', + closeLabel: 'Закрыть командный центр', + searchPlaceholder: 'Поиск сессий, представлений и действий', + statSessions: 'Сессии', + statApiCalls: 'Вызовы API', + statTokens: 'Токены вх/исх', + statEstCost: 'Примерная стоимость', + cost => `факт. ${cost}`, + loadingUsage: 'Загрузка использования...', + count => `Нет использования за последние ${count} дн.`, + retry: 'Повторить', + tokenInput: 'вход', + tokenOutput: 'выход', + noDailyActivity: 'Нет активности за день.', + topModels: 'Топ моделей', + topSkills: 'Топ навыков', + actionsLabel: 'действия', + systemRunning: 'работает', + systemDone: 'завершено', + systemFailed: 'ошибка', + open: 'Открыть командный центр', + close: 'Закрыть командный центр', + }, + common: { + loading: 'Загрузка…', + save: 'Сохранить', + cancel: 'Отмена', + close: 'Закрыть', + delete: 'Удалить', + confirm: 'Подтвердить', + search: 'Поиск…', + clearSearch: 'Очистить поиск', + copy: 'Копировать', + refresh: 'Обновить', + moreActions: 'Ещё действия', + tryAgain: 'Попробовать снова', + }, + onboarding: { + welcome: 'Добро пожаловать в Hermes', + getStarted: 'Начните с выбора провайдера и модели.', + skip: 'Пропустить', + continue: 'Продолжить', + finish: 'Завершить', + setupTitle: 'Давайте настроим Hermes Agent', + setupDesc: 'Подключите модельного провайдера, чтобы начать общение. Большинство вариантов в один клик.', + preparing: 'Запуск Hermes…', + installing: 'Hermes завершает установку. Обычно это занимает меньше минуты при первом запуске.', + lookingUp: 'Поиск провайдеров...', + otherProviders: 'Другие провайдеры', + collapse: 'Свернуть', + iHaveKey: 'У меня есть ключ API', + recommended: 'Рекомендовано', + connected: 'Подключено', + backToSignIn: 'Вернуться ко входу', + getKey: 'Получить ключ', + pasteKey: 'Вставить ключ API', + connect: 'Подключить', + connecting: 'Подключение', + copyCode: 'Копировать', + startSignIn: 'Запуск входа для', + verifyingCode: 'Проверка кода через', + pickingModel: 'подключено. Выбор модели по умолчанию...', + signInFailed: 'Вход не удался. Попробуйте снова.', + pickDifferent: 'Выбрать другого провайдера', + signInTitle: 'Войти через', + step1: 'Мы открыли', + step1End: 'в вашем браузере.', + step2: 'Авторизуйте Hermes там.', + step3: 'Скопируйте код авторизации и вставьте его ниже.', + pasteCode: 'Вставить код авторизации', + reopenAuth: 'Открыть страницу авторизации снова', + cancel: 'Отмена', + browserDesc: 'Мы открыли', + browserDescEnd: 'в вашем браузере. Авторизуйте Hermes там, и вы подключитесь автоматически — ничего копировать не нужно.', + waitingAuth: 'Ожидание авторизации...', + reopenSignIn: 'Открыть страницу входа снова', + externalDesc: 'выполняет вход через свой CLI. Запустите эту команду в терминале, затем вернитесь и выберите «Я вошёл»:', + iSignedIn: 'Я вошёл', + enterCode: 'Мы открыли', + enterCodeEnd: 'в вашем браузере. Введите этот код там:', + reopenVerification: 'Открыть страницу проверки снова', + defaultModel: 'Модель по умолчанию', + freeTier: 'Бесплатный тариф', + pro: 'Pro', + change: 'Изменить', + startChatting: 'Начать общение', + docs: 'документация', + close: 'Закрыть', + savingError: 'Не удалось сохранить учётные данные.', + openRouter: 'OpenRouter', + }, + file: { + browser: 'Файловый браузер', + noFiles: 'Файлов пока нет.', + }, + terminal: { + title: 'Терминал', + newTab: 'Новая вкладка', + closeTab: 'Закрыть вкладку', + }, + skills: { + title: 'Навыки', + search: 'Поиск навыков…', + noResults: 'Навыки не найдены.', + tools: 'Навыки и инструменты', + }, + profiles: { + title: 'Профили', + noProfilesYet: 'Профилей пока нет.', + selectProfile: 'Выберите профиль для просмотра деталей.', + deleteProfile: 'Удалить профиль?', + soulMd: 'SOUL.md', + unsavedChanges: 'Несохранённые изменения', + newProfile: 'Новый профиль', + cloneFromDefault: 'Клонировать из стандартного', + renameProfile: 'Переименовать профиль', + }, + cron: { + title: 'Задачи Cron', + noJobs: 'Нет запланированных задач.', + deleteCronJob: 'Удалить задачу cron?', + optional: 'Необязательно', + label: 'Cron', + open: 'Открыть задачи cron', + }, + messaging: { + title: 'Мессенджеры', + recommended: 'Рекомендовано', + recommendedTelegram: 'Рекомендовано. Числовые ID через запятую из @userinfobot. Без этого любой может написать боту.', + recommendedDiscord: 'Рекомендовано. ID пользователей Discord через запятую.', + recommendedSlack: 'Рекомендовано. ID пользователей Slack через запятую.', + recommendedMattermost: 'Рекомендовано. ID пользователей Mattermost через запятую.', + recommendedMatrix: 'Рекомендовано. ID пользователей через запятую в формате @user:server.', + recommendedSignal: 'Рекомендовано. Идентификаторы Signal через запятую.', + recommendedWhatsApp: 'Рекомендовано. Номера телефонов или ID WhatsApp через запятую.', + gatewayStopped: 'Шлюз мессенджеров остановлен', + getCredentials: 'Получить учётные данные', + required: 'Обязательно', + unsavedChanges: 'Несохранённые изменения', + saved: 'Сохранено', + }, + about: { + version: 'Версия', + checkUpdates: 'Проверить обновления', + upToDate: 'Hermes обновлён до последней версии.', + updateAvailable: 'Доступно обновление.', + license: 'Лицензия MIT', + hermesDesktop: 'Hermes Desktop', + versionUnavailable: 'Версия недоступна', + updates: 'Обновления', + checkNow: 'Проверить сейчас', + checking: 'Проверка…', + seeWhatsNew: 'Что нового', + releaseNotes: 'Примечания к выпуску', + autoUpdates: 'Автоматические обновления', + autoUpdatesDesc: 'Hermes автоматически проверяет обновления в фоне и сообщает, когда новое готово.', + selfUpdateUnsupported: 'Эта сборка не может обновляться изнутри приложения.', + cannotReachServer: 'Не удалось связаться с сервером обновлений.', + installingUpdate: 'Обновление устанавливается.', + count => `Доступно новое обновление (включено ${count} изменение).`, + count => `Доступно новое обновление (включено ${count} изменений).`, + onLatest: 'У вас последняя версия.', + tapCheckNow: 'Нажмите «Проверить сейчас» для поиска обновлений.', + time => `Последняя проверка ${time}`, + justNow: 'только что', + never: 'никогда', + count => `${count} мин. назад`, + count => `${count} ч. назад`, + count => `${count} дн. назад`, + (branch, sha) => `Ветка ${branch} · Коммит ${sha}`, + }, + keys: { + title: 'Ключи API', + noKeys: 'Ключи API не настроены.', + addKey: 'Добавить ключ', + loading: 'Загрузка ключей API и учётных данных…', + docs: 'Документация', + openDocs: 'Открыть документацию провайдера', + hideValue: 'Скрыть значение', + revealValue: 'Показать значение', + set: 'Задано', + notSet: 'Не задано', + replace: 'Заменить', + replaceValue: 'Заменить текущее значение', + enterValue: 'Введите значение', + saving: 'Сохранение', + save: 'Сохранить', + cancel: 'Отмена', + clearValue: 'Очистить значение', + (count, total) => `Настроено ${count} из ${total}`, + (count, total) => `Задано ${count} из ${total}`, + count => `Задано: ${count}`, + count => `Ключей: ${count}`, + otherProviders: 'Другие провайдеры', + categoryTools: 'Инструменты', + categoryMessaging: 'Мессенджеры', + categorySettings: 'Настройки', + openProviderDocs: 'Открыть документацию провайдера', + showAdvanced: 'Показать дополнительные', + loadFailed: 'Не удалось загрузить ключи API', + credentialSaved: 'Учётные данные сохранены', + credentialRemoved: 'Учётные данные удалены', + }, + config: { + title: 'Конфигурация', + edit: 'Редактировать', + reload: 'Перезагрузить', + notSet: 'Не задано', + commaSeparated: 'значения через запятую', + on: 'Вкл', + off: 'Выкл', + none: 'Нет', + emptyOption: '(нет)', + loading: 'Загрузка конфигурации Hermes…', + noMatching: 'Нет подходящих настроек', + noMatchingDesc: 'Попробуйте другой поисковый запрос или выберите другой раздел.', + count => `${count} результат`, + count => `${count} результатов`, + saving: 'Сохранение…', + label: { + defaultModel: 'Модель по умолчанию', + contextWindow: 'Контекстное окно', + fallbackModels: 'Резервные модели', + enabledToolsets: 'Включённые наборы инструментов', + timezone: 'Часовой пояс', + personality: 'Личность', + reasoningBlocks: 'Блоки рассуждений', + maxAgentSteps: 'Макс. шагов агента', + imageAttachments: 'Вложения изображений', + workingDirectory: 'Рабочая директория', + executionBackend: 'Бэкенд выполнения', + commandTimeout: 'Таймаут команд', + persistentShell: 'Постоянная оболочка', + envPassthrough: 'Проброс переменных окружения', + fileReadLimit: 'Лимит чтения файлов', + terminalOutputLimit: 'Лимит вывода терминала', + filePageLimit: 'Лимит страниц файла', + lineLengthLimit: 'Лимит длины строки', + codeExecutionMode: 'Режим выполнения кода', + approvalMode: 'Режим одобрения', + approvalTimeout: 'Таймаут одобрения', + confirmMcpReloads: 'Подтверждать перезагрузку MCP', + commandAllowlist: 'Белый список команд', + redactSecrets: 'Скрывать секреты', + allowPrivateUrls: 'Разрешить приватные URL', + browserPrivateUrls: 'Браузер для приватных URL', + localBrowserForPrivateUrls: 'Локальный браузер для приватных URL', + fileCheckpoints: 'Контрольные точки файлов', + checkpointLimit: 'Лимит контрольных точек', + voiceShortcut: 'Голосовая комбинация', + maxRecordingLength: 'Макс. длина записи', + readResponsesAloud: 'Читать ответы вслух', + speechToText: 'Распознавание речи', + speechToTextProvider: 'Провайдер распознавания речи', + localTranscriptionModel: 'Локальная модель транскрипции', + transcriptionLanguage: 'Язык транскрипции', + elevenlabsSttModel: 'Модель STT ElevenLabs', + elevenlabsLanguage: 'Язык ElevenLabs', + tagAudioEvents: 'Метки аудиособытий', + speakerDiarization: 'Диаризация спикеров', + textToSpeechProvider: 'Провайдер синтеза речи', + edgeVoice: 'Голос Edge', + openaiTtsModel: 'Модель TTS OpenAI', + openaiVoice: 'Голос OpenAI', + elevenlabsVoice: 'Голос ElevenLabs', + elevenlabsModel: 'Модель ElevenLabs', + persistentMemory: 'Постоянная память', + userProfile: 'Профиль пользователя', + memoryBudget: 'Бюджет памяти', + profileBudget: 'Бюджет профиля', + memoryProvider: 'Провайдер памяти', + contextEngine: 'Движок контекста', + autoCompression: 'Автосжатие', + compressionThreshold: 'Порог сжатия', + compressionTarget: 'Цель сжатия', + protectedRecentMessages: 'Защищённые последние сообщения', + apiRetries: 'Повторы API', + serviceTier: 'Уровень обслуживания', + toolUseEnforcement: 'Принуждение использования инструментов', + subagentModel: 'Модель субагента', + subagentProvider: 'Провайдер субагента', + subagentTurnLimit: 'Лимит ходов субагента', + parallelSubagents: 'Параллельные субагенты', + subagentTimeout: 'Таймаут субагента', + subagentReasoningEffort: 'Усилие рассуждения субагента', + }, + desc: { + defaultModel: 'Используется для новых чатов, если не выбрана другая модель в композере.', + contextWindow: 'Оставьте 0 для использования контекстного окна выбранной модели.', + fallbackModels: 'Резервные записи провайдер:модель на случай сбоя основной модели.', + personality: 'Стиль ассистента по умолчанию для новых сессий.', + timezone: 'Используется, когда Hermes нужен контекст местного времени. Пустое значение — системный пояс.', + reasoningBlocks: 'Показывать разделы рассуждений, когда бэкенд их предоставляет.', + imageAttachments: 'Управляет отправкой вложений изображений модели.', + workingDirectory: 'Папка проекта по умолчанию для работы инструментов и терминала.', + codeExecutionMode: 'Насколько строго выполнение кода ограничено текущим проектом.', + persistentShell: 'Сохранять состояние оболочки между командами, если бэкенд поддерживает.', + envPassthrough: 'Переменные окружения для передачи в выполнение инструментов.', + fileReadLimit: 'Максимальное количество символов, которое Hermes может прочитать из одного файла.', + approvalMode: 'Как Hermes обрабатывает команды, требующие явного одобрения.', + approvalTimeout: 'Как долго запросы одобрения ждут перед таймаутом.', + redactSecrets: 'Скрывать обнаруженные секреты от видимого модели контента, когда возможно.', + fileCheckpoints: 'Создавать снимки отката перед редактированием файлов.', + persistentMemory: 'Сохранять долговременные воспоминания, помогающие будущим сессиям.', + userProfile: 'Поддерживать компактный профиль пользовательских предпочтений.', + contextEngine: 'Стратегия управления длинными разговорами вблизи лимита контекста.', + autoCompression: 'Суммаризировать старый контекст при разрастании разговоров.', + readResponsesAloud: 'Автоматически озвучивать ответы ассистента.', + speechToText: 'Включить локальную или провайдерскую транскрипцию речи.', + elevenlabsLanguage: 'Необязательный код языка ISO-639-3. Пустое значение — автоопределение ElevenLabs.', + maxAgentSteps: 'Верхняя граница ходов вызова инструментов до остановки Hermes.', + }, + }, + gateway: { + title: 'Шлюз', + start: 'Запустить шлюз', + stop: 'Остановить шлюз', + restart: 'Перезапустить шлюз', + running: 'Работает', + stopped: 'Остановлен', + loading: 'Загрузка настроек шлюза…', + unavailable: 'Настройки шлюза недоступны', + unavailableDesc: 'Мост IPC десктопа не предоставляет настройки шлюза.', + connection: 'Подключение к шлюзу', + envOverride: 'переопределение через env', + desc: 'Hermes Desktop по умолчанию запускает собственный локальный шлюз. Используйте удалённый шлюз, если хотите, чтобы приложение управляло уже запущенным бэкендом Hermes на другой машине или за доверенным прокси.', + envOverrideTitle: 'Переменные окружения управляют этой десктоп-сессией.', + (urlVar, tokenVar) => `Сбросьте ${urlVar} и ${tokenVar}, чтобы использовать сохранённые настройки ниже.`, + localTitle: 'Локальный шлюз', + localDesc: 'Запустить приватный бэкенд Hermes на localhost. Это поведение по умолчанию, работает офлайн.', + remoteTitle: 'Удалённый шлюз', + remoteDesc: 'Подключить эту десктоп-оболочку к удалённому бэкенду Hermes по токену сессии.', + remoteUrl: 'Удалённый URL', + remoteUrlDesc: 'Базовый URL удалённого бэкенда. Поддерживаются префиксы пути, например /hermes.', + remoteUrlPlaceholder: 'https://gateway.example.com/hermes', + sessionToken: 'Токен сессии', + sessionTokenDesc: 'Токен сессии панели управления для доступа REST и WebSocket. Оставьте пустым, чтобы сохранить существующий токен.', + sessionTokenPlaceholder: 'Вставьте токен сессии', + preview => `Существующий токен ${preview}`, + tokenSaved: 'сохранён', + testRemote: 'Проверить удалённый', + saveRestart: 'Сохранить для следующего запуска', + saveReconnect: 'Сохранить и переподключиться', + diagnostics: 'Диагностика', + diagnosticsDesc: 'Показать desktop.log в файловом менеджере — полезно, когда шлюз не запускается.', + openLogs: 'Открыть логи', + connected: 'Подключено', + connecting: 'Подключение', + disconnected: 'Отключено', + inferenceReady: 'Инференс готов', + inferenceNotReady: 'Инференс не готов', + checkingInference: 'Проверка инференса', + openSystemPanel: 'Открыть системную панель', + connectionLabel: 'Подключение:', + recentActivity: 'Недавняя активность', + viewAllLogs: 'Все логи →', + messagingPlatforms: 'Платформы мессенджеров', + label: 'Шлюз', + inferenceStatus: 'Статус инференса шлюза', + enterUrlFirst: 'Введите удалённый URL и токен сессии перед переключением', + enterUrlFirstTest: 'Введите удалённый URL и токен сессии перед проверкой', + }, + sessions: { + title: 'Сессии', + search: 'Поиск сессий…', + noResults: 'Сессии не найдены.', + export: 'Экспорт', + delete: 'Удалить сессию', + loading: 'Загрузка…', + defaultProjectDir: 'Папка проектов по умолчанию', + defaultProjectDirDesc: 'Новые сессии начинаются в этой папке, если не выбрана другая. Оставьте пустым для домашней директории.', + fallback => `По умолчанию ${fallback}.`, + notSet: 'Не задано', + change: 'Изменить', + choose: 'Выбрать', + clear: 'Очистить', + archivedTitle: 'Архивные сессии', + archivedDesc: 'Архивные чаты скрыты из боковой панели, но сохраняют все сообщения. Ctrl/⌘-клик по чату в панели архивирует его.', + nothingArchived: 'Ничего не архивировано', + noSearchMatch: 'Нет архивных чатов по вашему запросу.', + archiveToHide: 'Архивируйте чат, чтобы скрыть его здесь.', + unarchive: 'Разархивировать', + deletePermanently: 'Удалить навсегда', + count => `Сообщений: ${count}`, + new: 'Новая сессия', + running: 'Сессия выполняется', + actions: 'Действия с сессией', + reorder: 'Переупорядочить', + pin: 'Закрепить', + unpin: 'Открепить', + copyId: 'Копировать ID', + rename: 'Переименовать', + archive: 'Архивировать', + renameDialog: 'Переименовать сессию', + renameDesc: 'Дайте чату запоминающееся название. Оставьте пустым для сброса.', + untitled: 'Безымянная сессия', + renamed: 'Переименовано', + renameFailed: 'Не удалось переименовать', + pinned: 'Закреплено', + results: 'Результаты', + allPinned: 'Здесь всё закреплено. Открепите чат, чтобы показать его в недавних.', + pinHint: 'Shift-клик для закрепления · перетаскивание для порядка', + loadMore: 'Загрузить ещё', + noWorkspace: 'Нет рабочей области', + ungroup: 'Показать сессии одним списком', + groupByWorkspace: 'Группировать по рабочим областям', + loadStep: 'Загрузить', + moreLabel: 'ещё', + nothingArchivedTitle: 'Ничего не архивировано', + deletePermanentlyTitle: 'Удалить навсегда', + defaultProjectDirTitle: 'Папка проектов по умолчанию', + loadingArchived: 'Загрузка архивных сессий…', + restored: 'Восстановлено', + projectDirUpdated: 'Папка проектов по умолчанию обновлена', + loadFailed: 'Не удалось загрузить архивные сессии', + unarchiveFailed: 'Не удалось разархивировать', + deleteFailed: 'Не удалось удалить', + archiveHint: 'Архивируйте чат, чтобы скрыть его здесь.', + updateDirFailed: 'Не удалось обновить директорию по умолчанию', + clearDirFailed: 'Не удалось очистить директорию по умолчанию', + }, + mcp: { + title: 'Серверы MCP', + addServer: 'Добавить сервер', + noServers: 'Серверы MCP не настроены.', + loading: 'Загрузка серверов MCP…', + servers: 'Серверы MCP', + count => `Настроено: ${count}`, + newServer: 'Новый сервер', + reloadMCP: 'Перезагрузить MCP', + reloading: 'Перезагрузка...', + noServersDesc: 'Добавьте сервер stdio или HTTP для предоставления инструментов MCP.', + name: 'Имя', + namePlaceholder: 'filesystem', + serverJSON: 'JSON сервера', + editServer: 'Редактировать сервер', + saveServer: 'Сохранить сервер', + saving: 'Сохранение...', + remove: 'Удалить', + disabled: 'отключён', + nameRequired: 'Требуется имя', + nameRequiredDesc: 'Укажите конфигурационный ключ для сервера MCP.', + invalidJson: 'Конфигурация сервера должна быть JSON-объектом', + invalidJsonDesc: 'Некорректный JSON MCP', + saved: 'Сервер MCP сохранён', + name => `${name} применится после перезагрузки MCP.`, + saveFailed: 'Не удалось сохранить', + removeFailed: 'Не удалось удалить', + gatewayUnavailable: 'Шлюз недоступен', + gatewayUnavailableDesc: 'Подключите шлюз перед перезагрузкой MCP.', + reloadedTitle: 'Инструменты MCP перезагружены', + reloadedDesc: 'Новые схемы инструментов применяются к новым запросам.', + reloadFailed: 'Перезагрузка MCP не удалась', + giveConfigKey: 'Укажите конфигурационный ключ для сервера MCP.', + reconnectGateway: 'Подключите шлюз перед перезагрузкой MCP.', + newSchemas: 'Новые схемы инструментов применяются к новым запросам.', + loadingServers: 'Загрузка серверов MCP...', + serverName: 'Имя', + serversTitle: 'Серверы MCP', + noServersTitle: 'Нет серверов MCP', + failedToLoad: 'Не удалось загрузить конфигурацию MCP', + invalidJsonShort: 'Некорректный JSON MCP', + serverSaved: 'Сервер MCP сохранён', + toolsReloaded: 'Инструменты MCP перезагружены', + emptyDesc: 'Добавьте сервер stdio или HTTP для предоставления инструментов MCP.', + }, + tools: { + title: 'Инструменты и навыки', + noTools: 'Нет доступных инструментов.', + }, + nav: { + home: 'Главная', + chat: 'Чат', + settings: 'Настройки', + files: 'Файлы', + terminal: 'Терминал', + }, + header: { + search: 'Поиск или ввод команды…', + }, + model: { + auxTask: { + vision: 'Зрение', + visionHint: 'Анализ изображений', + web_extract: 'Извлечение из веба', + web_extractHint: 'Суммаризация страниц', + compression: 'Сжатие', + compressionHint: 'Уплотнение контекста', + session_search: 'Поиск по сессиям', + session_searchHint: 'Запросы поиска', + skills_hub: 'Хаб навыков', + skills_hubHint: 'Поиск навыков', + approval: 'Одобрение', + approvalHint: 'Умное автоодобрение', + mcp: 'MCP', + mcpHint: 'Маршрутизация инструментов MCP', + title_generation: 'Генерация заголовков', + title_generationHint: 'Заголовки сессий', + curator: 'Куратор', + curatorHint: 'Обзор использования навыков', + }, + mainModel: 'Основная модель', + mainDesc: 'Применяется к новым сессиям. Используйте выбор модели в композере для смены в активном чате.', + providerPlaceholder: 'Провайдер', + modelPlaceholder: 'Модель', + apply: 'Применить', + applying: 'Применение…', + auxiliaryModels: 'Вспомогательные модели', + auxiliaryDesc: 'Вспомогательные задачи по умолчанию используют основную модель. Назначьте отдельную модель для переопределения.', + resetAllToMain: 'Сбросить всё на основную', + setToMain: 'Назначить основную', + change: 'Изменить', + cancel: 'Отмена', + autoUseMain: 'авто · основная модель', + providerDefault: '(по умолчанию провайдера)', + loading: 'Загрузка конфигурации модели…', + options: 'Параметры', + thinking: 'Размышление', + fast: 'Быстрый', + effort: 'Усилие', + noOptions: 'Нет параметров для этой модели', + optionUpdateFailed: 'Не удалось обновить параметр модели', + fastModeUpdateFailed: 'Не удалось обновить быстрый режим', + effortMinimal: 'Минимальное', + effortLow: 'Низкое', + effortMedium: 'Среднее', + effortHigh: 'Высокое', + effortMax: 'Максимальное', + switch: 'Сменить модель', + unknown: '(неизвестно)', + filterPlaceholder: 'Фильтр провайдеров и моделей...', + persistGlobal: 'Сохранить глобально', + persistGlobalSession: 'Сохранить глобально (иначе только для этой сессии)', + couldNotLoad: 'Не удалось загрузить модели', + proLockedDesc: 'Pro-модели требуют платной подписки Nous.', + priceTooltip: 'Цена ввода / вывода за миллион токенов', + freePrice: 'Бесплатно', + currentLabel: 'текущая:', + addProviderBtn: 'Добавить провайдера', + }, + updates: { + checking: 'Проверка обновлений…', + available: 'Доступно обновление', + downloading: 'Загрузка…', + installing: 'Установка…', + restart: 'Перезапустить для обновления', + stageGettingReady: 'Подготовка…', + stageDownloading: 'Загрузка…', + stageAlmostThere: 'Почти готово…', + stageFinishingUp: 'Завершение…', + stageRestarting: 'Перезапуск Hermes…', + stageManual: 'Обновление из терминала', + stageError: 'Обновление приостановлено', + updatingHermes: 'Обновление Hermes…', + lookingForUpdates: 'Поиск обновлений…', + couldntCheck: 'Не удалось проверить обновления', + updateNotAvailable: 'Обновление недоступно', + checkConnection: 'Проверьте подключение и попробуйте снова.', + onLatest: 'У вас последняя версия.', + allSet: 'Всё готово', + newUpdateAvailable: 'Доступно новое обновление', + readyToInstall: 'Новая версия Hermes готова к установке.', + updateNow: 'Обновить сейчас', + maybeLater: 'Возможно позже', + count => `+ ещё ${count} изменение.`, + count => `+ ещё ${count} изменений.`, + updateFromTerminal: 'Обновление из терминала', + terminalDesc: 'Вы установили Hermes из командной строки, поэтому обновления выполняются там же. Вставьте это в терминал:', + copied: 'Скопировано', + copy: 'Копировать', + pickupNewVersion: 'Hermes подхватит новую версию при следующем запуске.', + done: 'Готово', + updaterDesc: 'Установщик Hermes продолжит в собственном окне и перезапустит Hermes по завершении.', + closeToApply: 'Hermes закроется для применения обновления.', + updateDidntFinish: 'Обновление не завершилось', + nothingLost: 'Не беспокойтесь — ничего не потеряно. Можете попробовать снова сейчас.', + notNow: 'Не сейчас', + }, + errors: { + generic: 'Что-то пошло не так.', + notFound: 'Страница не найдена.', + noPermission: 'У вас нет доступа к этому.', + somethingBroke: 'Что-то сломалось в интерфейсе', + viewCrashedDesc: 'Представление столкнулось с неожиданной ошибкой. Ваши чаты и настройки в безопасности — попробуйте снова или перезагрузите окно.', + noProviders: 'Нет аутентифицированных провайдеров.', + }, + tool: { + toolCall: 'Вызов инструмента', + result: 'Результат', + error: 'Ошибка', + timeout: 'Таймаут', + cancelled: 'Отменено', + running: 'Выполняется', + recovered: 'Восстановлено', + done: 'Готово', + output: 'Вывод инструмента', + searchResults: 'Результаты поиска', + rawResponse: 'Сырой ответ', + stdout: 'stdout', + stderr: 'stderr', + copyActivity: 'Копировать активность', + recoveredAfter: 'Восстановлено после 1 неудачного шага', + count => `Восстановлено после ${count} неудачных шагов`, + oneStepFailed: '1 шаг не удался', + count => `${count} шагов не удалось`, + }, + composer: { + startingHermes: 'Запуск Hermes...', + sendFollowUp: 'Отправить продолжение', + message: 'Сообщение', + editingQueued: 'Редактирование очереди в композере', + attach: 'Прикрепить', + files: 'Файлы…', + folder: 'Папка…', + images: 'Изображения…', + pasteImage: 'Вставить изображение', + url: 'URL…', + promptSnippets: 'Фрагменты подсказок', + promptSnippetsDesc: 'Выберите готовую подсказку для вставки в композер.', + voiceStart: 'Начать голосовой разговор', + queue: 'Поставить в очередь', + speaking: 'Говорит', + transcribing: 'Расшифровка', + muted: 'Микрофон выкл.', + listening: 'Слушаю', + unmuteMic: 'Включить микрофон', + muteMic: 'Выключить микрофон', + stopListening: 'Остановить прослушивание и отправить', + endVoice: 'Завершить голосовой разговор', + end: 'Завершить', + stopDictation: 'Остановить диктовку', + transcribingDictation: 'Расшифровка диктовки', + voiceDictation: 'Голосовая диктовка', + addContext: 'Добавить контекст', + }, + models: { + title: 'Модели', + search: 'Поиск моделей', + addProvider: 'Добавить провайдера…', + }, + install: { + title: 'Hermes требуется однократная установка', + desc: 'Автоматическая установка при первом запуске недоступна на', + descEnd: 'пока. Откройте терминал и выполните команду ниже, затем перезапустите приложение. При последующих запусках этот шаг пропускается.', + installCommand: 'Команда установки', + copyCommand: 'Копировать команду', + viewDocs: 'Документация по установке', + willInstallTo: 'Будет установлено в', + iRanIt: 'Я выполнил — повторить', + failed: 'Установка не удалась', + settingUp: 'Настройка Hermes Agent', + finishingUp: 'Завершение', + failedDesc: 'Один из шагов установки не удался. В Windows это может произойти, если запущен другой экземпляр Hermes CLI или десктопа. Остановите все запущенные экземпляры Hermes, затем повторите. Подробности ниже или в журнале десктопа.', + setupDesc: 'Это однократная настройка. Установщик Hermes загружает зависимости и настраивает машину. При последующих запусках этот шаг пропускается.', + fetchingManifest: 'Получение манифеста установщика...', + error: 'Ошибка', + showOutput: 'Показать вывод установщика', + hideOutput: 'Скрыть вывод установщика', + noOutput: 'Вывода пока нет.', + cancelInstall: 'Отменить установку', + cancelling: 'Отмена...', + copyOutput: 'Копировать вывод', + copied: 'Скопировано!', + reloadRetry: 'Перезагрузить и повторить', + saveLogs: 'Полный журнал сохранён в', + stepsComplete: 'шагов выполнено', + nowLabel: 'сейчас', + line: 'строка', + lines: 'строк', + }, + previewConsole: { + resizeLabel: 'Изменить размер консоли предпросмотра', + noMessages: 'Сообщений консоли пока нет.', + }, + boot: { + ipcUnavailable: 'Мост IPC десктопа недоступен.', + backendExited: 'Фоновый процесс Hermes завершился во время запуска.', + backendStoppedTitle: 'Бэкенд остановлен', + backendStoppedMessage: 'Фоновый процесс Hermes завершился.', + startingConnection: 'Запуск подключения десктопа', + connectingGateway: 'Подключение живого шлюза десктопа', + loadingConfig: 'Загрузка настроек Hermes', + loadingSessions: 'Загрузка последних сессий', + desktopBootFailed: 'Загрузка десктопа не удалась', + couldNotStart: 'Hermes не удалось запустить', + recoveryDesc: 'Фоновый шлюз не запустился. Попробуйте один из шагов восстановления ниже — ничего здесь не удаляет ваши чаты или настройки.', + retry: 'Повторить', + repairInstall: 'Восстановить установку', + useLocalGateway: 'Использовать локальный шлюз', + openLogs: 'Открыть логи', + repairHint: 'Восстановление перезапускает установщик и может занять несколько минут на новой машине.', + showLogs: 'Показать последние логи', + hideLogs: 'Скрыть последние логи', + }, + urlDialog: { + title: 'Прикрепить URL', + description: 'Hermes загрузит страницу и включит её как контекст для этого запроса.', + placeholder: 'https://example.com/post', + hint: 'Укажите полный URL, например', + attach: 'Прикрепить', + }, + titlebar: { + hideSidebar: 'Скрыть боковую панель', + showSidebar: 'Показать боковую панель', + search: 'Поиск', + searchTitle: 'Поиск сессий, представлений и действий', + hideRightSidebar: 'Скрыть правую панель', + showRightSidebar: 'Показать правую панель', + unmuteHaptics: 'Включить тактильный отклик', + muteHaptics: 'Отключить тактильный отклик', + openSettings: 'Открыть настройки', + profiles: 'Профили', + profilesDesc: 'Продвинутые окружения Hermes для отдельных персон, конфигураций, навыков и SOUL.md.', + manageProfiles: 'Управление профилями', + language: 'Язык', + languageDesc: 'Выберите язык отображения интерфейса.', + }, + pagination: { + ariaLabel: 'пагинация', + prevAria: 'На предыдущую страницу', + prev: 'Назад', + nextAria: 'На следующую страницу', + next: 'Вперёд', + }, + bootstrap: { + pending: 'Ожидание', + running: 'Установка', + done: 'Готово', + skipped: 'Пропущено', + failed: 'Ошибка', + }, + sidebar: { + sheetTitle: 'Боковая панель', + sheetDesc: 'Отображает мобильную боковую панель.', + toggle: 'Переключить боковую панель', + }, + clarify: { + hermesIsAsking: 'Hermes спрашивает', + loadingQuestion: 'Загрузка вопроса…', + otherTypeAnswer: 'Другое (введите ответ)', + placeholderAnswer: 'Введите ответ…', + cmdEnterToSend: '⌘/Ctrl + Enter для отправки', + back: 'Назад', + skip: 'Пропустить', + couldNotSend: 'Не удалось отправить уточняющий ответ', + n => `1–${n} для выбора`, + }, + intro: { + fallback1h: 'Что двигаем сегодня?', + fallback1b: 'Отправьте баг, ветку, план или черновую идею. Я осмотрю репозиторий и превращу в следующий конкретный шаг.', + fallback2h: 'Что у вас на уме?', + fallback2b: 'Принесите код, вопрос или застрявшую часть. Я ознакомлюсь перед тем, как вносить изменения.', + fallback3h: 'На что Hermes должен посмотреть?', + fallback3b: 'Отправьте задачу, падающий путь или полуготовый план. Я помогу превратить в действие.', + fallback4h: 'С чего начнём?', + fallback4b: 'Принесите проблему, цель или файл. Я сперва осмотрюсь и сделаю следующий шаг конкретным.', + fallback5h: 'Что требует внимания?', + fallback5b: 'Отправьте имеющийся контекст. Я помогу превратить его в план или исправление.', + personality: { + label => `Режим ${label} включён. Над чем будем работать?`, + body1: 'Отправьте задачу, файл или черновую идею. Я буду использовать настроенный голос и привяжу работу к этому репозиторию.', + label => `Что ${label} Hermes нужно увидеть?`, + body2: 'Принесите контекст или застрявшую часть. Я адаптируюсь к настроенной личности.', + label => `Режим ${label} готов.`, + body3: 'Отправьте проблему, файл или идею. Я последую настроенной личности.', + label => `За что ${label} Hermes возьмётся?`, + body4: 'Оставьте задачу здесь. Я привяжу работу к репозиторию.', + heading5: 'С чего начнём?', + label => `Дайте мне контекст, и я отвечу в режиме ${label}.`, + }, + brand: 'HERMES AGENT', + }, + artifacts: { + noArtifactsFound: 'Артефакты не найдены', + }, + agents: { + spawnTree: 'Дерево порождения', + liveSubagentActivity: 'Активность субагентов в реальном времени для текущего хода.', + noLiveSubagents: 'Нет активных субагентов', + files: 'Файлы', + label: 'Агенты', + open: 'Открыть агентов', + close: 'Закрыть агентов', + subagent: 'субагент', + subagents: 'субагентов', + failed: 'ошибка', + running: 'выполняется', + }, + provider: { + desc: { + nousPortal: 'Переопределение базового URL портала Nous', + openRouter: 'Ключ API OpenRouter (для зрения, помощников веб-скрапинга и MoA)', + google: 'Ключ API Google AI Studio (также распознаётся как GEMINI_API_KEY)', + gemini: 'ID проекта GCP для платных тарифов Gemini (бесплатный тариф настраивается автоматически)', + anthropic: 'Ключ API Anthropic', + deepseek: 'Пользовательский базовый URL DeepSeek API (дополнительно)', + xai: 'Переопределение базового URL xAI', + huggingface: 'Переопределение базового URL Hugging Face Inference Providers', + kimi: 'Ключ API Kimi / Moonshot China', + minimax: 'Переопределение базового URL MiniMax (Китай)', + minimaxCn: 'Ключ API MiniMax China', + dashscope: 'Пользовательский базовый URL DashScope (по умолчанию: coding-intl OpenAI-совместимая точка)', + glm: 'Ключ API GLM (Z.AI)', + nvidia: 'Переопределение базового URL NVIDIA NIM (например, http://localhost:8000/v1 для локального NIM)', + opencodeGo: 'Ключ API OpenCode Go', + opencodeZen: 'Ключ API OpenCode Zen', + xiaomi: 'Переопределение базового URL Xiaomi MiMo (по умолчанию: https://api.xiaomimimo.com/v1)', + kiloCode: 'Ключ API Kilo Code', + aiGateway: 'Ключ API AI Gateway (Vercel AI Gateway)', + browserbase: 'BROWSERBASE_API_KEY', + elevenLabs: 'Ключ API ElevenLabs', + openai: 'Ключ API OpenAI (для обработки голоса через прокси)', + mistral: 'Ключ API Mistral (для STT/TTS)', + groq: 'Ключ API Groq (для STT)', + tavily: 'TAVILY_API_KEY', + firecrawl: 'URL Firecrawl API для собственных экземпляров (необязательно)', + fal: 'FAL_KEY', + nous: 'Переопределение базового URL портала Nous', + openrouter: 'Ключ API OpenRouter (для зрения, помощников веб-скрапинга и MoA)', + lmstudio: 'Переопределение базового URL Z.AI / GLM', + zai: 'Базовый URL Azure Foundry (задаётся через \'hermes model\' для конфигурации точки)', + stepfun: 'Переопределение базового URL StepFun Step Plan', + arcee: 'Переопределение базового URL Arcee AI', + gmi: 'Переопределение базового URL GMI Cloud', + qwenportal: 'Переопределение базового URL Qwen Portal (по умолчанию: https://portal.qwen.ai/v1)', + opencodego: 'Переопределение базового URL OpenCode Go', + ollamacloud: 'Переопределение базового URL Ollama Cloud (по умолчанию: https://ollama.com/v1)', + awsbedrock: 'Именованный профиль AWS для аутентификации Bedrock (из ~/.aws/credentials)', + exa: 'Ключ API Exa для AI-поиска и содержимого', + parallel: 'Ключ API Parallel для AI-поиска и извлечения', + }, + }, +} +) diff --git a/apps/desktop/src/i18n/th.ts b/apps/desktop/src/i18n/th.ts new file mode 100644 index 000000000000..1248fbb5a467 --- /dev/null +++ b/apps/desktop/src/i18n/th.ts @@ -0,0 +1,953 @@ +import { defineLocale } from './define-locale' + +export const th = defineLocale( +{ + appearance: { + title: 'ลักษณะที่ปรากฏ', + description: 'การตั้งค่าการแสดงผลเฉพาะเดสก์ท็อป โหมดควบคุมความสว่าง; ธีมควบคุมพาเลทสีและสไตล์พื้นผิวแชท', + colorMode: 'โหมดสี', + colorModeDesc: 'เลือกโหมดคงที่หรือให้ Hermes ตามการตั้งค่าระบบของคุณ', + theme: { + nous: 'Nous', + nousDesc: 'โทนกลางแบบกระจกพร้อมการเน้นสีน้ำเงิน Nous', + midnight: 'เที่ยงคืน', + midnightDesc: 'น้ำเงิน-ม่วงเข้มพร้อมการเน้นสีโทนเย็น', + ember: 'ถ่านคุ', + emberDesc: 'สีแดงเข้มอบอุ่นและสีบรอนซ์ — บรรยากาศโรงตีเหล็ก', + mono: 'โมโน', + monoDesc: 'โทนเทาสะอาด — เรียบง่ายและมีสมาธิ', + cyberpunk: 'ไซเบอร์พังค์', + cyberpunkDesc: 'เขียวนีออนบนพื้นดำ — เทอร์มินัลเมทริกซ์', + slate: 'สเลท', + slateDesc: 'น้ำเงินสเลทโทนเย็น — ธีมสำหรับนักพัฒนาที่มีสมาธิ', + }, + themeDesc: 'เลือกพาเลทสีสำหรับพื้นผิวแชทและการเน้นสีอินเทอร์เฟซ', + mode: { + light: 'สว่าง', + lightDesc: 'พื้นผิวเดสก์ท็อปสว่าง', + dark: 'มืด', + darkDesc: 'พื้นที่ทำงานลดแสงสะท้อน', + system: 'ระบบ', + systemDesc: 'ตามลักษณะระบบปฏิบัติการ', + }, + language: 'ภาษา', + languageDesc: 'เลือกภาษาของอินเทอร์เฟซหรือให้ Hermes ตามการตั้งค่าระบบของคุณ', + toolCallDisplay: 'การแสดงการเรียกใช้เครื่องมือ', + toolCallDisplayDesc: 'โหมดผลิตภัณฑ์ซ่อนข้อมูลเครื่องมือดิบ; โหมดเทคนิคแสดงอินพุต/เอาต์พุตเต็มรูปแบบ', + toolViewProduct: 'ผลิตภัณฑ์', + toolViewTechnical: 'เทคนิค', + toolViewProductDesc: 'กิจกรรมเครื่องมือที่เข้าใจง่ายพร้อมสรุปที่กระชับ', + toolViewTechnicalDesc: 'รวมอาร์กิวเมนต์/ผลลัพธ์เครื่องมือดิบและรายละเอียดระดับต่ำ', + }, + settings: { + title: 'การตั้งค่า', + appearance: 'ลักษณะที่ปรากฏ', + model: 'โมเดล', + gateway: 'เกตเวย์', + sessions: 'เซสชัน', + tools: 'เครื่องมือและทักษะ', + section: { + chat: 'แชท', + workspace: 'พื้นที่ทำงาน', + safety: 'ความปลอดภัย', + memory: 'หน่วยความจำและบริบท', + voice: 'เสียง', + advanced: 'ขั้นสูง', + }, + mcp: 'เซิร์ฟเวอร์ MCP', + config: 'การกำหนดค่า', + keys: 'คีย์ API', + about: 'เกี่ยวกับ', + closeSettings: 'ปิดการตั้งค่า', + archivedChats: 'แชทที่เก็บถาวร', + exportConfig: 'ส่งออกการกำหนดค่า', + importConfig: 'นำเข้าการกำหนดค่า', + resetDefaults: 'รีเซ็ตเป็นค่าเริ่มต้น', + llmProviders: 'ผู้ให้บริการ LLM', + searchPlaceholder: { + about: 'เกี่ยวกับ Hermes Desktop', + config: 'ค้นหาการตั้งค่า…', + gateway: 'การเชื่อมต่อเกตเวย์…', + keys: 'ค้นหาคีย์ API…', + mcp: 'ค้นหาเซิร์ฟเวอร์ MCP…', + sessions: 'ค้นหาเซสชันที่เก็บถาวร…', + }, + }, + chat: { + placeholder: 'ถามอะไรก็ได้…', + send: 'ส่ง', + stop: 'หยุด', + thinking: 'กำลังคิด…', + noSession: 'ไม่มีเซสชันที่ใช้งานอยู่ เริ่มการสนทนาใหม่', + loadingSession: 'กำลังโหลดเซสชัน', + loadingResponse: 'Hermes กำลังโหลดการตอบกลับ', + branchInNewChat: 'แยกสาขาในแชทใหม่', + readAloud: 'อ่านออกเสียง', + preparingAudio: 'กำลังเตรียมเสียง...', + stopReading: 'หยุดอ่าน', + editMessage: 'แก้ไขข้อความ', + editableCheckpoint: 'จุดตรวจที่แก้ไขได้', + restoreCheckpoint: 'กู้คืนจุดตรวจ', + goForward: 'ไปข้างหน้า', + restorePrevCheckpoint: 'กู้คืนจุดตรวจก่อนหน้า', + restoreNextCheckpoint: 'กู้คืนจุดตรวจถัดไป', + composerTip: 'เคล็ดลับ: พิมพ์ @ เพื่ออ้างอิงไฟล์ในบรรทัด', + reconnecting: 'กำลังเชื่อมต่อกับ Hermes ใหม่…', + }, + commandCenter: { + title: 'ศูนย์บัญชาการ', + noSessions: 'ยังไม่มีเซสชัน', + loadingStatus: 'กำลังโหลดสถานะ…', + recentLogs: 'บันทึกล่าสุด', + dailyTokens: 'โทเค็นรายวัน', + noActivity: 'ไม่มีกิจกรรมรายวัน', + noModelUsage: 'ยังไม่มีการใช้งานโมเดล', + noSkillActivity: 'ยังไม่มีกิจกรรมทักษะ', + sessionsPanel: 'แผงเซสชัน', + systemPanel: 'แผงระบบ', + usagePanel: 'แผงการใช้งาน', + navigate: 'นำทาง', + noMatchingResults: 'ไม่พบผลลัพธ์ที่ตรงกัน', + noSessionsYet: 'ยังไม่มีเซสชัน', + unpinSession: 'ถอนหมุดเซสชัน', + pinSession: 'ปักหมุดเซสชัน', + exportSession: 'ส่งออกเซสชัน', + deleteSession: 'ลบเซสชัน', + gatewayRunning: 'เกตเวย์การส่งข้อความกำลังทำงาน', + gatewayStopped: 'เกตเวย์การส่งข้อความหยุดทำงาน', + restartMsg: 'รีสตาร์ทการส่งข้อความ', + updateHermes: 'อัปเดต Hermes', + noLogsLoaded: 'ยังไม่ได้โหลดบันทึก', + closeLabel: 'ปิดศูนย์บัญชาการ', + searchPlaceholder: 'ค้นหาเซสชัน มุมมอง และการดำเนินการ', + statSessions: 'เซสชัน', + statApiCalls: 'การเรียก API', + statTokens: 'โทเค็นเข้า/ออก', + statEstCost: 'ค่าใช้จ่ายโดยประมาณ', + cost => `จริง ${cost}`, + loadingUsage: 'กำลังโหลดการใช้งาน...', + count => `ไม่มีการใช้งานใน ${count} วันที่ผ่านมา`, + retry: 'ลองใหม่', + tokenInput: 'เข้า', + tokenOutput: 'ออก', + noDailyActivity: 'ไม่มีกิจกรรมรายวัน', + topModels: 'โมเดลยอดนิยม', + topSkills: 'ทักษะยอดนิยม', + actionsLabel: 'การดำเนินการ', + systemRunning: 'กำลังทำงาน', + systemDone: 'เสร็จสิ้น', + systemFailed: 'ล้มเหลว', + open: 'เปิดศูนย์บัญชาการ', + close: 'ปิดศูนย์บัญชาการ', + }, + common: { + loading: 'กำลังโหลด…', + save: 'บันทึก', + cancel: 'ยกเลิก', + close: 'ปิด', + delete: 'ลบ', + confirm: 'ยืนยัน', + search: 'ค้นหา…', + clearSearch: 'ล้างการค้นหา', + copy: 'คัดลอก', + refresh: 'รีเฟรช', + moreActions: 'การดำเนินการเพิ่มเติม', + tryAgain: 'ลองอีกครั้ง', + }, + onboarding: { + welcome: 'ยินดีต้อนรับสู่ Hermes', + getStarted: 'เริ่มต้นด้วยการเลือกผู้ให้บริการและโมเดล', + skip: 'ข้าม', + continue: 'ดำเนินการต่อ', + finish: 'เสร็จสิ้น', + setupTitle: 'มาตั้งค่า Hermes Agent ให้คุณกัน', + setupDesc: 'เชื่อมต่อผู้ให้บริการโมเดลเพื่อเริ่มแชท ตัวเลือกส่วนใหญ่ใช้เพียงคลิกเดียว', + preparing: 'กำลังเริ่ม Hermes…', + installing: 'Hermes กำลังติดตั้งให้เสร็จสิ้น โดยปกติใช้เวลาไม่ถึงหนึ่งนาทีในการรันครั้งแรก', + lookingUp: 'กำลังค้นหาผู้ให้บริการ...', + otherProviders: 'ผู้ให้บริการอื่นๆ', + collapse: 'ย่อ', + iHaveKey: 'ฉันมีคีย์ API', + recommended: 'แนะนำ', + connected: 'เชื่อมต่อแล้ว', + backToSignIn: 'กลับไปที่การลงชื่อเข้าใช้', + getKey: 'รับคีย์', + pasteKey: 'วางคีย์ API', + connect: 'เชื่อมต่อ', + connecting: 'กำลังเชื่อมต่อ', + copyCode: 'คัดลอก', + startSignIn: 'กำลังเริ่มการลงชื่อเข้าใช้สำหรับ', + verifyingCode: 'กำลังตรวจสอบรหัสของคุณกับ', + pickingModel: 'เชื่อมต่อแล้ว กำลังเลือกโมเดลเริ่มต้น...', + signInFailed: 'การลงชื่อเข้าใช้ล้มเหลว ลองอีกครั้ง', + pickDifferent: 'เลือกผู้ให้บริการอื่น', + signInTitle: 'ลงชื่อเข้าใช้ด้วย', + step1: 'เราเปิด', + step1End: 'ในเบราว์เซอร์ของคุณ', + step2: 'อนุญาต Hermes ที่นั่น', + step3: 'คัดลอกรหัสการอนุญาตและวางด้านล่าง', + pasteCode: 'วางรหัสการอนุญาต', + reopenAuth: 'เปิดหน้าการอนุญาตอีกครั้ง', + cancel: 'ยกเลิก', + browserDesc: 'เราเปิด', + browserDescEnd: 'ในเบราว์เซอร์ของคุณ อนุญาต Hermes ที่นั่นแล้วคุณจะเชื่อมต่อโดยอัตโนมัติ — ไม่ต้องคัดลอกหรือวางอะไร', + waitingAuth: 'กำลังรอให้คุณอนุญาต...', + reopenSignIn: 'เปิดหน้าลงชื่อเข้าใช้อีกครั้ง', + externalDesc: 'ลงชื่อเข้าใช้ผ่าน CLI ของตัวเอง รันคำสั่งนี้ในเทอร์มินัล แล้วกลับมาและเลือก "ฉันลงชื่อเข้าใช้แล้ว":', + iSignedIn: 'ฉันลงชื่อเข้าใช้แล้ว', + enterCode: 'เราเปิด', + enterCodeEnd: 'ในเบราว์เซอร์ของคุณ ป้อนรหัสนี้ที่นั่น:', + reopenVerification: 'เปิดหน้าการยืนยันอีกครั้ง', + defaultModel: 'โมเดลเริ่มต้น', + freeTier: 'ระดับฟรี', + pro: 'Pro', + change: 'เปลี่ยน', + startChatting: 'เริ่มแชท', + docs: 'เอกสาร', + close: 'ปิด', + savingError: 'ไม่สามารถบันทึกข้อมูลรับรอง', + openRouter: 'OpenRouter', + }, + file: { + browser: 'เรียกดูไฟล์', + noFiles: 'ยังไม่มีไฟล์', + }, + terminal: { + title: 'เทอร์มินัล', + newTab: 'แท็บใหม่', + closeTab: 'ปิดแท็บ', + }, + skills: { + title: 'ทักษะ', + search: 'ค้นหาทักษะ…', + noResults: 'ไม่พบทักษะ', + tools: 'ทักษะและเครื่องมือ', + }, + profiles: { + title: 'โปรไฟล์', + noProfilesYet: 'ยังไม่มีโปรไฟล์', + selectProfile: 'เลือกโปรไฟล์เพื่อดูรายละเอียด', + deleteProfile: 'ลบโปรไฟล์?', + soulMd: 'SOUL.md', + unsavedChanges: 'การเปลี่ยนแปลงที่ยังไม่ได้บันทึก', + newProfile: 'โปรไฟล์ใหม่', + cloneFromDefault: 'โคลนจากค่าเริ่มต้น', + renameProfile: 'เปลี่ยนชื่อโปรไฟล์', + }, + cron: { + title: 'งาน Cron', + noJobs: 'ไม่มีงานที่กำหนดเวลา', + deleteCronJob: 'ลบงาน cron?', + optional: 'ไม่บังคับ', + label: 'Cron', + open: 'เปิดงาน cron', + }, + messaging: { + title: 'การส่งข้อความ', + recommended: 'แนะนำ', + recommendedTelegram: 'แนะนำ ID ตัวเลขที่คั่นด้วยจุลภาคจาก @userinfobot หากไม่มีสิ่งนี้ ใครก็ตามสามารถส่งข้อความตรงถึงบอทของคุณได้', + recommendedDiscord: 'แนะนำ ID ผู้ใช้ Discord ที่คั่นด้วยจุลภาค', + recommendedSlack: 'แนะนำ ID ผู้ใช้ Slack ที่คั่นด้วยจุลภาค', + recommendedMattermost: 'แนะนำ ID ผู้ใช้ Mattermost ที่คั่นด้วยจุลภาค', + recommendedMatrix: 'แนะนำ ID ผู้ใช้ที่คั่นด้วยจุลภาคในรูปแบบ @user:server', + recommendedSignal: 'แนะนำตัวระบุ Signal ที่คั่นด้วยจุลภาค', + recommendedWhatsApp: 'แนะนำหมายเลขโทรศัพท์หรือ ID WhatsApp ที่คั่นด้วยจุลภาค', + gatewayStopped: 'เกตเวย์การส่งข้อความหยุดทำงาน', + getCredentials: 'รับข้อมูลรับรองของคุณ', + required: 'จำเป็น', + unsavedChanges: 'การเปลี่ยนแปลงที่ยังไม่ได้บันทึก', + saved: 'บันทึกแล้ว', + }, + about: { + version: 'เวอร์ชัน', + checkUpdates: 'ตรวจสอบอัปเดต', + upToDate: 'Hermes เป็นเวอร์ชันล่าสุดแล้ว', + updateAvailable: 'มีอัปเดตพร้อมใช้งาน', + license: 'สัญญาอนุญาต MIT', + hermesDesktop: 'Hermes Desktop', + versionUnavailable: 'ไม่สามารถแสดงเวอร์ชันได้', + updates: 'อัปเดต', + checkNow: 'ตรวจสอบตอนนี้', + checking: 'กำลังตรวจสอบ…', + seeWhatsNew: 'ดูว่ามีอะไรใหม่', + releaseNotes: 'บันทึกประจำรุ่น', + autoUpdates: 'อัปเดตอัตโนมัติ', + autoUpdatesDesc: 'Hermes ตรวจสอบอัปเดตโดยอัตโนมัติในพื้นหลังและแจ้งให้คุณทราบเมื่อพร้อมใช้งาน', + selfUpdateUnsupported: 'รุ่นนี้ไม่สามารถอัปเดตตัวเองจากภายในแอปได้', + cannotReachServer: 'ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์อัปเดตได้', + installingUpdate: 'กำลังติดตั้งอัปเดต', + count => `มีอัปเดตใหม่พร้อมใช้งาน (รวม ${count} การเปลี่ยนแปลง)`, + count => `มีอัปเดตใหม่พร้อมใช้งาน (รวม ${count} การเปลี่ยนแปลง)`, + onLatest: 'คุณใช้เวอร์ชันล่าสุดอยู่', + tapCheckNow: 'แตะ "ตรวจสอบตอนนี้" เพื่อค้นหาอัปเดต', + time => `ตรวจสอบล่าสุด ${time}`, + justNow: 'เมื่อสักครู่', + never: 'ไม่เคย', + count => `${count} นาทีที่แล้ว`, + count => `${count} ชั่วโมงที่แล้ว`, + count => `${count} วันที่แล้ว`, + (branch, sha) => `สาขา ${branch} · คอมมิต ${sha}`, + }, + keys: { + title: 'คีย์ API', + noKeys: 'ยังไม่ได้กำหนดค่าคีย์ API', + addKey: 'เพิ่มคีย์', + loading: 'กำลังโหลดคีย์ API และข้อมูลรับรอง…', + docs: 'เอกสาร', + openDocs: 'เปิดเอกสารผู้ให้บริการ', + hideValue: 'ซ่อนค่า', + revealValue: 'แสดงค่า', + set: 'ตั้งค่าแล้ว', + notSet: 'ยังไม่ได้ตั้งค่า', + replace: 'แทนที่', + replaceValue: 'แทนที่ค่าปัจจุบัน', + enterValue: 'ป้อนค่า', + saving: 'กำลังบันทึก', + save: 'บันทึก', + cancel: 'ยกเลิก', + clearValue: 'ล้างค่า', + (count, total) => `กำหนดค่าแล้ว ${count} จาก ${total}`, + (count, total) => `ตั้งค่าแล้ว ${count} จาก ${total}`, + count => `ตั้งค่าแล้ว ${count} รายการ`, + count => `${count} คีย์`, + otherProviders: 'ผู้ให้บริการอื่นๆ', + categoryTools: 'เครื่องมือ', + categoryMessaging: 'การส่งข้อความ', + categorySettings: 'การตั้งค่า', + openProviderDocs: 'เปิดเอกสารผู้ให้บริการ', + showAdvanced: 'แสดงขั้นสูง', + loadFailed: 'การโหลดคีย์ API ล้มเหลว', + credentialSaved: 'บันทึกข้อมูลรับรองแล้ว', + credentialRemoved: 'ลบข้อมูลรับรองแล้ว', + }, + config: { + title: 'การกำหนดค่า', + edit: 'แก้ไขการกำหนดค่า', + reload: 'โหลดการกำหนดค่าใหม่', + notSet: 'ยังไม่ได้ตั้งค่า', + commaSeparated: 'ค่าที่คั่นด้วยจุลภาค', + on: 'เปิด', + off: 'ปิด', + none: 'ไม่มี', + emptyOption: '(ไม่มี)', + loading: 'กำลังโหลดการกำหนดค่า Hermes…', + noMatching: 'ไม่พบการตั้งค่าที่ตรงกัน', + noMatchingDesc: 'ลองใช้คำค้นหาอื่นหรือเลือกส่วนอื่น', + count => `${count} ผลลัพธ์`, + count => `${count} ผลลัพธ์`, + saving: 'กำลังบันทึก…', + label: { + defaultModel: 'โมเดลเริ่มต้น', + contextWindow: 'หน้าต่างบริบท', + fallbackModels: 'โมเดลสำรอง', + enabledToolsets: 'ชุดเครื่องมือที่เปิดใช้งาน', + timezone: 'เขตเวลา', + personality: 'บุคลิกภาพ', + reasoningBlocks: 'บล็อกการให้เหตุผล', + maxAgentSteps: 'ขั้นตอนเอเจนต์สูงสุด', + imageAttachments: 'การแนบรูปภาพ', + workingDirectory: 'ไดเรกทอรีทำงาน', + executionBackend: 'แบ็กเอนด์การดำเนินการ', + commandTimeout: 'หมดเวลาคำสั่ง', + persistentShell: 'เชลล์ถาวร', + envPassthrough: 'การส่งผ่านสภาพแวดล้อม', + fileReadLimit: 'ขีดจำกัดการอ่านไฟล์', + terminalOutputLimit: 'ขีดจำกัดผลลัพธ์เทอร์มินัล', + filePageLimit: 'ขีดจำกัดหน้าไฟล์', + lineLengthLimit: 'ขีดจำกัดความยาวบรรทัด', + codeExecutionMode: 'โหมดการดำเนินการโค้ด', + approvalMode: 'โหมดการอนุมัติ', + approvalTimeout: 'หมดเวลาการอนุมัติ', + confirmMcpReloads: 'ยืนยันการโหลด MCP ใหม่', + commandAllowlist: 'รายการอนุญาตคำสั่ง', + redactSecrets: 'ปกปิดความลับ', + allowPrivateUrls: 'อนุญาต URL ส่วนตัว', + browserPrivateUrls: 'URL ส่วนตัวของเบราว์เซอร์', + localBrowserForPrivateUrls: 'เบราว์เซอร์ท้องถิ่นสำหรับ URL ส่วนตัว', + fileCheckpoints: 'จุดตรวจไฟล์', + checkpointLimit: 'ขีดจำกัดจุดตรวจ', + voiceShortcut: 'ทางลัดเสียง', + maxRecordingLength: 'ความยาวการบันทึกสูงสุด', + readResponsesAloud: 'อ่านการตอบกลับออกเสียง', + speechToText: 'เสียงเป็นข้อความ', + speechToTextProvider: 'ผู้ให้บริการเสียงเป็นข้อความ', + localTranscriptionModel: 'โมเดลการถอดความท้องถิ่น', + transcriptionLanguage: 'ภาษาการถอดความ', + elevenlabsSttModel: 'โมเดล STT ของ ElevenLabs', + elevenlabsLanguage: 'ภาษา ElevenLabs', + tagAudioEvents: 'แท็กเหตุการณ์เสียง', + speakerDiarization: 'การแยกผู้พูด', + textToSpeechProvider: 'ผู้ให้บริการข้อความเป็นเสียง', + edgeVoice: 'เสียง Edge', + openaiTtsModel: 'โมเดล TTS ของ OpenAI', + openaiVoice: 'เสียง OpenAI', + elevenlabsVoice: 'เสียง ElevenLabs', + elevenlabsModel: 'โมเดล ElevenLabs', + persistentMemory: 'หน่วยความจำถาวร', + userProfile: 'โปรไฟล์ผู้ใช้', + memoryBudget: 'งบประมาณหน่วยความจำ', + profileBudget: 'งบประมาณโปรไฟล์', + memoryProvider: 'ผู้ให้บริการหน่วยความจำ', + contextEngine: 'เอ็นจินบริบท', + autoCompression: 'การบีบอัดอัตโนมัติ', + compressionThreshold: 'เกณฑ์การบีบอัด', + compressionTarget: 'เป้าหมายการบีบอัด', + protectedRecentMessages: 'ข้อความล่าสุดที่ได้รับการป้องกัน', + apiRetries: 'การลอง API ใหม่', + serviceTier: 'ระดับบริการ', + toolUseEnforcement: 'การบังคับใช้เครื่องมือ', + subagentModel: 'โมเดลซับเอเจนต์', + subagentProvider: 'ผู้ให้บริการซับเอเจนต์', + subagentTurnLimit: 'ขีดจำกัดเทิร์นซับเอเจนต์', + parallelSubagents: 'ซับเอเจนต์คู่ขนาน', + subagentTimeout: 'หมดเวลาซับเอเจนต์', + subagentReasoningEffort: 'ความพยายามในการให้เหตุผลของซับเอเจนต์', + }, + desc: { + defaultModel: 'ใช้สำหรับแชทใหม่เว้นแต่คุณเลือกโมเดลอื่นในตัวเขียน', + contextWindow: 'ปล่อยเป็น 0 เพื่อใช้หน้าต่างบริบทที่ตรวจพบของโมเดลที่เลือก', + fallbackModels: 'รายการผู้ให้บริการสำรอง:โมเดลที่จะลองหากโมเดลเริ่มต้นล้มเหลว', + personality: 'สไตล์ผู้ช่วยเริ่มต้นสำหรับเซสชันใหม่', + timezone: 'ใช้เมื่อ Hermes ต้องการบริบทเวลาท้องถิ่น เว้นว่างไว้เพื่อใช้เขตเวลาของระบบ', + reasoningBlocks: 'แสดงส่วนการให้เหตุผลเมื่อแบ็กเอนด์ให้มา', + imageAttachments: 'ควบคุมวิธีการส่งการแนบรูปภาพไปยังโมเดล', + workingDirectory: 'โฟลเดอร์โปรเจกต์เริ่มต้นสำหรับงานเครื่องมือและเทอร์มินัล', + codeExecutionMode: 'ความเข้มงวดในการกำหนดขอบเขตการดำเนินการโค้ดกับโปรเจกต์ปัจจุบัน', + persistentShell: 'เก็บสถานะเชลล์ระหว่างคำสั่งเมื่อแบ็กเอนด์รองรับ', + envPassthrough: 'ตัวแปรสภาพแวดล้อมที่จะส่งผ่านไปยังการดำเนินการเครื่องมือ', + fileReadLimit: 'จำนวนอักขระสูงสุดที่ Hermes สามารถอ่านจากคำขอไฟล์หนึ่งครั้ง', + approvalMode: 'วิธีที่ Hermes จัดการคำสั่งที่ต้องการการอนุมัติอย่างชัดแจ้ง', + approvalTimeout: 'ระยะเวลาที่พร้อมต์การอนุมัติรอก่อนหมดเวลา', + redactSecrets: 'ซ่อนความลับที่ตรวจพบจากเนื้อหาที่โมเดลมองเห็นเมื่อเป็นไปได้', + fileCheckpoints: 'สร้างสแนปชอตย้อนกลับก่อนการแก้ไขไฟล์', + persistentMemory: 'บันทึกหน่วยความจำที่คงทนซึ่งสามารถช่วยเซสชันในอนาคต', + userProfile: 'รักษาโปรไฟล์ขนาดกะทัดรัดของการตั้งค่าผู้ใช้', + contextEngine: 'กลยุทธ์สำหรับจัดการการสนทนาที่ยาวใกล้ขีดจำกัดบริบท', + autoCompression: 'สรุปบริบทเก่าเมื่อการสนทนามีขนาดใหญ่', + readResponsesAloud: 'พูดการตอบกลับของผู้ช่วยโดยอัตโนมัติ', + speechToText: 'เปิดใช้งานการถอดเสียงแบบท้องถิ่นหรือผ่านผู้ให้บริการ', + elevenlabsLanguage: 'รหัสภาษา ISO-639-3 ที่เป็นทางเลือก เว้นว่างไว้เพื่อให้ ElevenLabs ตรวจจับอัตโนมัติ', + maxAgentSteps: 'ขอบเขตสูงสุดสำหรับเทิร์นการเรียกใช้เครื่องมือก่อนที่ Hermes จะหยุดการรัน', + }, + }, + gateway: { + title: 'เกตเวย์', + start: 'เริ่มเกตเวย์', + stop: 'หยุดเกตเวย์', + restart: 'รีสตาร์ทเกตเวย์', + running: 'กำลังทำงาน', + stopped: 'หยุดแล้ว', + loading: 'กำลังโหลดการตั้งค่าเกตเวย์…', + unavailable: 'ไม่สามารถเข้าถึงการตั้งค่าเกตเวย์', + unavailableDesc: 'บริดจ์ IPC ของเดสก์ท็อปไม่เปิดเผยการตั้งค่าเกตเวย์', + connection: 'การเชื่อมต่อเกตเวย์', + envOverride: 'การแทนที่ด้วยตัวแปรสภาพแวดล้อม', + desc: 'Hermes Desktop เริ่มเกตเวย์ท้องถิ่นของตัวเองตามค่าเริ่มต้น ใช้เกตเวย์ระยะไกลเมื่อคุณต้องการให้แอปนี้ควบคุมแบ็กเอนด์ Hermes ที่ทำงานอยู่แล้วบนเครื่องอื่นหรือหลังพร็อกซีที่เชื่อถือได้', + envOverrideTitle: 'ตัวแปรสภาพแวดล้อมกำลังควบคุมเซสชันเดสก์ท็อปนี้', + (urlVar, tokenVar) => `ยกเลิกการตั้งค่า ${urlVar} และ ${tokenVar} เพื่อใช้การตั้งค่าที่บันทึกไว้ด้านล่าง`, + localTitle: 'เกตเวย์ท้องถิ่น', + localDesc: 'เริ่มแบ็กเอนด์ Hermes ส่วนตัวบน localhost นี่คือค่าเริ่มต้นและทำงานแบบออฟไลน์ได้', + remoteTitle: 'เกตเวย์ระยะไกล', + remoteDesc: 'เชื่อมต่อเชลล์เดสก์ท็อปนี้กับแบ็กเอนด์ Hermes ระยะไกลโดยใช้โทเค็นเซสชัน', + remoteUrl: 'URL ระยะไกล', + remoteUrlDesc: 'URL ฐานสำหรับแบ็กเอนด์แดชบอร์ดระยะไกล รองรับคำนำหน้าเส้นทาง เช่น /hermes', + remoteUrlPlaceholder: 'https://gateway.example.com/hermes', + sessionToken: 'โทเค็นเซสชัน', + sessionTokenDesc: 'โทเค็นเซสชันแดชบอร์ดที่ใช้สำหรับการเข้าถึง REST และ WebSocket เว้นว่างไว้เพื่อเก็บโทเค็นที่บันทึกไว้', + sessionTokenPlaceholder: 'วางโทเค็นเซสชัน', + preview => `โทเค็นที่มีอยู่ ${preview}`, + tokenSaved: 'บันทึกแล้ว', + testRemote: 'ทดสอบระยะไกล', + saveRestart: 'บันทึกสำหรับการรีสตาร์ทครั้งถัดไป', + saveReconnect: 'บันทึกและเชื่อมต่อใหม่', + diagnostics: 'การวินิจฉัย', + diagnosticsDesc: 'แสดง desktop.log ในตัวจัดการไฟล์ของคุณ — มีประโยชน์เมื่อเกตเวย์ไม่สามารถเริ่มทำงานได้', + openLogs: 'เปิดบันทึก', + connected: 'เชื่อมต่อแล้ว', + connecting: 'กำลังเชื่อมต่อ', + disconnected: 'ตัดการเชื่อมต่อแล้ว', + inferenceReady: 'การอนุมานพร้อมแล้ว', + inferenceNotReady: 'การอนุมานยังไม่พร้อม', + checkingInference: 'กำลังตรวจสอบการอนุมาน', + openSystemPanel: 'เปิดแผงระบบ', + connectionLabel: 'การเชื่อมต่อ:', + recentActivity: 'กิจกรรมล่าสุด', + viewAllLogs: 'ดูบันทึกทั้งหมด →', + messagingPlatforms: 'แพลตฟอร์มการส่งข้อความ', + label: 'เกตเวย์', + inferenceStatus: 'สถานะการอนุมานเกตเวย์', + enterUrlFirst: 'ป้อน URL ระยะไกลและโทเค็นเซสชันก่อนสลับ', + enterUrlFirstTest: 'ป้อน URL ระยะไกลและโทเค็นเซสชันก่อนทดสอบ', + }, + sessions: { + title: 'เซสชัน', + search: 'ค้นหาเซสชัน…', + noResults: 'ไม่พบเซสชัน', + export: 'ส่งออก', + delete: 'ลบเซสชัน', + loading: 'กำลังโหลด…', + defaultProjectDir: 'ไดเรกทอรีโปรเจกต์เริ่มต้น', + defaultProjectDirDesc: 'เซสชันใหม่จะเริ่มในโฟลเดอร์นี้เว้นแต่คุณจะเลือกอื่น ปล่อยว่างไว้เพื่อใช้ไดเรกทอรีบ้านของคุณ', + fallback => `ค่าเริ่มต้นคือ ${fallback}`, + notSet: 'ยังไม่ได้ตั้งค่า', + change: 'เปลี่ยน', + choose: 'เลือก', + clear: 'ล้าง', + archivedTitle: 'เซสชันที่เก็บถาวร', + archivedDesc: 'แชทที่เก็บถาวรถูกซ่อนจากแถบด้านข้างแต่เก็บข้อความทั้งหมดไว้ Ctrl/⌘-คลิกแชทในแถบด้านข้างเพื่อเก็บถาวร', + nothingArchived: 'ไม่มีรายการที่เก็บถาวร', + noSearchMatch: 'ไม่มีแชทที่เก็บถาวรตรงกับการค้นหาของคุณ', + archiveToHide: 'เก็บถาวรแชทเพื่อซ่อนไว้ที่นี่', + unarchive: 'ยกเลิกการเก็บถาวร', + deletePermanently: 'ลบถาวร', + count => `${count} ข้อความ`, + new: 'เซสชันใหม่', + running: 'เซสชันกำลังทำงาน', + actions: 'การดำเนินการเซสชัน', + reorder: 'จัดเรียงใหม่', + pin: 'ปักหมุด', + unpin: 'ถอนหมุด', + copyId: 'คัดลอก ID', + rename: 'เปลี่ยนชื่อ', + archive: 'เก็บถาวร', + renameDialog: 'เปลี่ยนชื่อเซสชัน', + renameDesc: 'ตั้งชื่อแชทนี้ให้น่าจดจำ เว้นว่างไว้เพื่อล้าง', + untitled: 'เซสชันไม่มีชื่อ', + renamed: 'เปลี่ยนชื่อแล้ว', + renameFailed: 'การเปลี่ยนชื่อล้มเหลว', + pinned: 'ปักหมุดแล้ว', + results: 'ผลลัพธ์', + allPinned: 'ทุกรายการที่นี่ถูกปักหมุด ถอนหมุดแชทเพื่อแสดงในรายการล่าสุด', + pinHint: 'Shift-คลิกแชทเพื่อปักหมุด · ลากเพื่อจัดเรียงใหม่', + loadMore: 'โหลดเพิ่มเติม', + noWorkspace: 'ไม่มีพื้นที่ทำงาน', + ungroup: 'แสดงเซสชันเป็นรายการเดียว', + groupByWorkspace: 'จัดกลุ่มเซสชันตามพื้นที่ทำงาน', + loadStep: 'โหลด', + moreLabel: 'เพิ่มเติม', + nothingArchivedTitle: 'ไม่มีรายการที่เก็บถาวร', + deletePermanentlyTitle: 'ลบถาวร', + defaultProjectDirTitle: 'ไดเรกทอรีโปรเจกต์เริ่มต้น', + loadingArchived: 'กำลังโหลดเซสชันที่เก็บถาวร…', + restored: 'กู้คืนแล้ว', + projectDirUpdated: 'อัปเดตไดเรกทอรีโปรเจกต์เริ่มต้นแล้ว', + loadFailed: 'ไม่สามารถโหลดเซสชันที่เก็บถาวร', + unarchiveFailed: 'การยกเลิกการเก็บถาวรล้มเหลว', + deleteFailed: 'การลบล้มเหลว', + archiveHint: 'เก็บถาวรแชทเพื่อซ่อนไว้ที่นี่', + updateDirFailed: 'ไม่สามารถอัปเดตไดเรกทอรีเริ่มต้น', + clearDirFailed: 'ไม่สามารถล้างไดเรกทอรีเริ่มต้น', + }, + mcp: { + title: 'เซิร์ฟเวอร์ MCP', + addServer: 'เพิ่มเซิร์ฟเวอร์', + noServers: 'ยังไม่ได้กำหนดค่าเซิร์ฟเวอร์ MCP', + loading: 'กำลังโหลดเซิร์ฟเวอร์ MCP…', + servers: 'เซิร์ฟเวอร์ MCP', + count => `กำหนดค่าแล้ว ${count} รายการ`, + newServer: 'เซิร์ฟเวอร์ใหม่', + reloadMCP: 'โหลด MCP ใหม่', + reloading: 'กำลังโหลดใหม่...', + noServersDesc: 'เพิ่มเซิร์ฟเวอร์ stdio หรือ HTTP เพื่อแสดงเครื่องมือ MCP', + name: 'ชื่อ', + namePlaceholder: 'filesystem', + serverJSON: 'JSON ของเซิร์ฟเวอร์', + editServer: 'แก้ไขเซิร์ฟเวอร์', + saveServer: 'บันทึกเซิร์ฟเวอร์', + saving: 'กำลังบันทึก...', + remove: 'ลบออก', + disabled: 'ปิดใช้งาน', + nameRequired: 'ต้องระบุชื่อ', + nameRequiredDesc: 'กำหนดคีย์การกำหนดค่าให้กับเซิร์ฟเวอร์ MCP นี้', + invalidJson: 'การกำหนดค่าเซิร์ฟเวอร์ต้องเป็นออบเจกต์ JSON', + invalidJsonDesc: 'JSON MCP ไม่ถูกต้อง', + saved: 'บันทึกเซิร์ฟเวอร์ MCP แล้ว', + name => `${name} มีผลหลังจากการโหลด MCP ใหม่`, + saveFailed: 'การบันทึกล้มเหลว', + removeFailed: 'การลบล้มเหลว', + gatewayUnavailable: 'เกตเวย์ไม่พร้อมใช้งาน', + gatewayUnavailableDesc: 'เชื่อมต่อเกตเวย์ใหม่ก่อนโหลด MCP ใหม่', + reloadedTitle: 'โหลดเครื่องมือ MCP ใหม่แล้ว', + reloadedDesc: 'สคีมาเครื่องมือใหม่มีผลกับเทิร์นใหม่', + reloadFailed: 'การโหลด MCP ใหม่ล้มเหลว', + giveConfigKey: 'กำหนดคีย์การกำหนดค่าให้กับเซิร์ฟเวอร์ MCP นี้', + reconnectGateway: 'เชื่อมต่อเกตเวย์ใหม่ก่อนโหลด MCP ใหม่', + newSchemas: 'สคีมาเครื่องมือใหม่มีผลกับเทิร์นใหม่', + loadingServers: 'กำลังโหลดเซิร์ฟเวอร์ MCP...', + serverName: 'ชื่อ', + serversTitle: 'เซิร์ฟเวอร์ MCP', + noServersTitle: 'ไม่มีเซิร์ฟเวอร์ MCP', + failedToLoad: 'การโหลดการกำหนดค่า MCP ล้มเหลว', + invalidJsonShort: 'JSON MCP ไม่ถูกต้อง', + serverSaved: 'บันทึกเซิร์ฟเวอร์ MCP แล้ว', + toolsReloaded: 'โหลดเครื่องมือ MCP ใหม่แล้ว', + emptyDesc: 'เพิ่มเซิร์ฟเวอร์ stdio หรือ HTTP เพื่อแสดงเครื่องมือ MCP', + }, + tools: { + title: 'เครื่องมือและทักษะ', + noTools: 'ไม่มีเครื่องมือที่พร้อมใช้งาน', + }, + nav: { + home: 'หน้าแรก', + chat: 'แชท', + settings: 'การตั้งค่า', + files: 'ไฟล์', + terminal: 'เทอร์มินัล', + }, + header: { + search: 'ค้นหาหรือพิมพ์คำสั่ง…', + }, + model: { + auxTask: { + vision: 'การมองเห็น', + visionHint: 'การวิเคราะห์ภาพ', + web_extract: 'สกัดเว็บ', + web_extractHint: 'การสรุปหน้าเว็บ', + compression: 'การบีบอัด', + compressionHint: 'การกระชับบริบท', + session_search: 'ค้นหาเซสชัน', + session_searchHint: 'คำค้นหาการเรียกคืน', + skills_hub: 'ศูนย์รวมทักษะ', + skills_hubHint: 'ค้นหาทักษะ', + approval: 'การอนุมัติ', + approvalHint: 'อนุมัติอัตโนมัติอัจฉริยะ', + mcp: 'MCP', + mcpHint: 'การจัดเส้นทางเครื่องมือ MCP', + title_generation: 'สร้างชื่อเรื่อง', + title_generationHint: 'ชื่อเซสชัน', + curator: 'ผู้คัดสรร', + curatorHint: 'การตรวจสอบการใช้ทักษะ', + }, + mainModel: 'โมเดลหลัก', + mainDesc: 'ใช้กับเซสชันใหม่ ใช้ตัวเลือกโมเดลในตัวเขียนเพื่อสลับแชทที่ใช้งานอยู่', + providerPlaceholder: 'ผู้ให้บริการ', + modelPlaceholder: 'โมเดล', + apply: 'ใช้', + applying: 'กำลังใช้…', + auxiliaryModels: 'โมเดลเสริม', + auxiliaryDesc: 'งานผู้ช่วยทำงานบนโมเดลหลักตามค่าเริ่มต้น กำหนดโมเดลเฉพาะให้กับงานใดๆ เพื่อแทนที่', + resetAllToMain: 'รีเซ็ตทั้งหมดเป็นหลัก', + setToMain: 'ตั้งเป็นหลัก', + change: 'เปลี่ยน', + cancel: 'ยกเลิก', + autoUseMain: 'อัตโนมัติ · ใช้โมเดลหลัก', + providerDefault: '(ค่าเริ่มต้นของผู้ให้บริการ)', + loading: 'กำลังโหลดการกำหนดค่าโมเดล…', + options: 'ตัวเลือก', + thinking: 'การคิด', + fast: 'เร็ว', + effort: 'ความพยายาม', + noOptions: 'ไม่มีตัวเลือกสำหรับโมเดลนี้', + optionUpdateFailed: 'การอัปเดตตัวเลือกโมเดลล้มเหลว', + fastModeUpdateFailed: 'การอัปเดตโหมดเร็วล้มเหลว', + effortMinimal: 'น้อยที่สุด', + effortLow: 'ต่ำ', + effortMedium: 'ปานกลาง', + effortHigh: 'สูง', + effortMax: 'สูงสุด', + switch: 'สลับโมเดล', + unknown: '(ไม่ทราบ)', + filterPlaceholder: 'กรองผู้ให้บริการและโมเดล...', + persistGlobal: 'คงอยู่ทั่วโลก', + persistGlobalSession: 'คงอยู่ทั่วโลก (มิฉะนั้นเฉพาะเซสชันนี้)', + couldNotLoad: 'ไม่สามารถโหลดโมเดล', + proLockedDesc: 'โมเดล Pro ต้องการการสมัครสมาชิก Nous แบบชำระเงิน', + priceTooltip: 'ราคาอินพุต / เอาต์พุตต่อล้านโทเค็น', + freePrice: 'ฟรี', + currentLabel: 'ปัจจุบัน:', + addProviderBtn: 'เพิ่มผู้ให้บริการ', + }, + updates: { + checking: 'กำลังตรวจสอบอัปเดต…', + available: 'มีอัปเดตพร้อมใช้งาน', + downloading: 'กำลังดาวน์โหลด…', + installing: 'กำลังติดตั้ง…', + restart: 'รีสตาร์ทเพื่ออัปเดต', + stageGettingReady: 'กำลังเตรียมพร้อม…', + stageDownloading: 'กำลังดาวน์โหลด…', + stageAlmostThere: 'เกือบถึงแล้ว…', + stageFinishingUp: 'กำลังดำเนินการให้เสร็จ…', + stageRestarting: 'กำลังรีสตาร์ท Hermes…', + stageManual: 'อัปเดตจากเทอร์มินัลของคุณ', + stageError: 'การอัปเดตหยุดชั่วคราว', + updatingHermes: 'กำลังอัปเดต Hermes…', + lookingForUpdates: 'กำลังค้นหาอัปเดต…', + couldntCheck: 'ไม่สามารถตรวจสอบอัปเดตได้', + updateNotAvailable: 'ไม่มีอัปเดต', + checkConnection: 'ตรวจสอบการเชื่อมต่อของคุณแล้วลองอีกครั้ง', + onLatest: 'คุณใช้เวอร์ชันล่าสุดอยู่', + allSet: 'คุณพร้อมแล้ว', + newUpdateAvailable: 'มีอัปเดตใหม่พร้อมใช้งาน', + readyToInstall: 'Hermes เวอร์ชันใหม่พร้อมติดตั้งแล้ว', + updateNow: 'อัปเดตตอนนี้', + maybeLater: 'ไว้ทีหลัง', + count => `รวมการเปลี่ยนแปลงอีก + ${count} รายการ`, + count => `รวมการเปลี่ยนแปลงอีก + ${count} รายการ`, + updateFromTerminal: 'อัปเดตจากเทอร์มินัลของคุณ', + terminalDesc: 'คุณติดตั้ง Hermes จากบรรทัดคำสั่ง ดังนั้นการอัปเดตก็ทำงานที่นั่นด้วย วางสิ่งนี้ในเทอร์มินัลของคุณ:', + copied: 'คัดลอกแล้ว', + copy: 'คัดลอก', + pickupNewVersion: 'Hermes จะรับเวอร์ชันใหม่ในครั้งถัดไปที่คุณเปิด', + done: 'เสร็จสิ้น', + updaterDesc: 'ตัวอัปเดต Hermes จะ接管ในหน้าต่างของตัวเองและเปิด Hermes อีกครั้งเมื่อเสร็จสิ้น', + closeToApply: 'Hermes จะปิดเพื่อใช้การอัปเดต', + updateDidntFinish: 'การอัปเดตไม่เสร็จสมบูรณ์', + nothingLost: 'ไม่ต้องกังวล — ไม่มีอะไรสูญหาย คุณสามารถลองอีกครั้งตอนนี้', + notNow: 'ไม่ใช่ตอนนี้', + }, + errors: { + generic: 'เกิดข้อผิดพลาดบางอย่าง', + notFound: 'ไม่พบหน้า', + noPermission: 'คุณไม่มีสิทธิ์เข้าถึงรายการนี้', + somethingBroke: 'มีบางอย่างเสียหายในอินเทอร์เฟซ', + viewCrashedDesc: 'มุมมองพบข้อผิดพลาดที่ไม่คาดคิด แชทและการตั้งค่าของคุณปลอดภัย - ลองอีกครั้งหรือโหลดหน้าต่างใหม่', + noProviders: 'ไม่มีผู้ให้บริการที่ตรวจสอบสิทธิ์แล้ว', + }, + tool: { + toolCall: 'การเรียกใช้เครื่องมือ', + result: 'ผลลัพธ์', + error: 'ข้อผิดพลาด', + timeout: 'หมดเวลา', + cancelled: 'ยกเลิกแล้ว', + running: 'กำลังทำงาน', + recovered: 'กู้คืนแล้ว', + done: 'เสร็จสิ้น', + output: 'ผลลัพธ์ของเครื่องมือ', + searchResults: 'ผลการค้นหา', + rawResponse: 'การตอบกลับดิบ', + stdout: 'stdout', + stderr: 'stderr', + copyActivity: 'คัดลอกกิจกรรม', + recoveredAfter: 'กู้คืนหลังจาก 1 ขั้นตอนที่ล้มเหลว', + count => `กู้คืนหลังจาก ${count} ขั้นตอนที่ล้มเหลว`, + oneStepFailed: '1 ขั้นตอนล้มเหลว', + count => `${count} ขั้นตอนล้มเหลว`, + }, + composer: { + startingHermes: 'กำลังเริ่ม Hermes...', + sendFollowUp: 'ส่งข้อความติดตาม', + message: 'ข้อความ', + editingQueued: 'กำลังแก้ไขเทิร์นที่เข้าคิวในตัวเขียน', + attach: 'แนบ', + files: 'ไฟล์…', + folder: 'โฟลเดอร์…', + images: 'รูปภาพ…', + pasteImage: 'วางรูปภาพ', + url: 'URL…', + promptSnippets: 'ตัวอย่างพรอมต์', + promptSnippetsDesc: 'เลือกพรอมต์เริ่มต้นเพื่อวางในตัวเขียน', + voiceStart: 'เริ่มการสนทนาด้วยเสียง', + queue: 'เข้าคิวข้อความ', + speaking: 'กำลังพูด', + transcribing: 'กำลังถอดความ', + muted: 'ปิดเสียง', + listening: 'กำลังฟัง', + unmuteMic: 'เปิดเสียงไมโครโฟน', + muteMic: 'ปิดเสียงไมโครโฟน', + stopListening: 'หยุดฟังและส่ง', + endVoice: 'สิ้นสุดการสนทนาด้วยเสียง', + end: 'สิ้นสุด', + stopDictation: 'หยุดการเขียนตามคำบอก', + transcribingDictation: 'กำลังถอดความการเขียนตามคำบอก', + voiceDictation: 'การเขียนตามคำบอกด้วยเสียง', + addContext: 'เพิ่มบริบท', + }, + models: { + title: 'โมเดล', + search: 'ค้นหาโมเดล', + addProvider: 'เพิ่มผู้ให้บริการ…', + }, + install: { + title: 'Hermes ต้องการการติดตั้งครั้งเดียว', + desc: 'การติดตั้งอัตโนมัติเมื่อเริ่มครั้งแรกไม่พร้อมใช้งานบน', + descEnd: 'ยัง เปิดเทอร์มินัลและรันคำสั่งด้านล่าง แล้วเปิดแอปนี้อีกครั้ง การเปิดครั้งถัดไปจะข้ามขั้นตอนนี้', + installCommand: 'คำสั่งติดตั้ง', + copyCommand: 'คัดลอกคำสั่ง', + viewDocs: 'ดูเอกสารการติดตั้ง', + willInstallTo: 'จะติดตั้งไปที่', + iRanIt: 'ฉันรันแล้ว -- ลองใหม่', + failed: 'การติดตั้งล้มเหลว', + settingUp: 'กำลังตั้งค่า Hermes Agent', + finishingUp: 'กำลังดำเนินการให้เสร็จ', + failedDesc: 'ขั้นตอนการติดตั้งขั้นตอนหนึ่งล้มเหลว บน Windows อาจเกิดขึ้นหากมีอินสแตนซ์ Hermes CLI หรือเดสก์ท็อปอื่นทำงานอยู่ หยุดอินสแตนซ์ Hermes ที่ทำงานอยู่ทั้งหมดแล้วลองใหม่ ตรวจสอบรายละเอียดด้านล่างหรือบันทึกเดสก์ท็อปสำหรับบันทึกฉบับเต็ม', + setupDesc: 'นี่คือการตั้งค่าครั้งเดียว ตัวติดตั้ง Hermes กำลังดาวน์โหลดการพึ่งพาและกำหนดค่าเครื่องของคุณ การเปิดครั้งถัดไปจะข้ามขั้นตอนนี้', + fetchingManifest: 'กำลังดึงข้อมูล manifest ของตัวติดตั้ง...', + error: 'ข้อผิดพลาด', + showOutput: 'แสดงผลลัพธ์ของตัวติดตั้ง', + hideOutput: 'ซ่อนผลลัพธ์ของตัวติดตั้ง', + noOutput: 'ยังไม่มีผลลัพธ์', + cancelInstall: 'ยกเลิกการติดตั้ง', + cancelling: 'กำลังยกเลิก...', + copyOutput: 'คัดลอกผลลัพธ์', + copied: 'คัดลอกแล้ว!', + reloadRetry: 'โหลดใหม่และลองอีกครั้ง', + saveLogs: 'บันทึกฉบับเต็มถูกบันทึกไปที่', + stepsComplete: 'ขั้นตอนเสร็จสมบูรณ์', + nowLabel: 'ตอนนี้', + line: 'บรรทัด', + lines: 'บรรทัด', + }, + previewConsole: { + resizeLabel: 'ปรับขนาดคอนโซลตัวอย่าง', + noMessages: 'ยังไม่มีข้อความคอนโซล', + }, + boot: { + ipcUnavailable: 'บริดจ์ IPC ของเดสก์ท็อปไม่พร้อมใช้งาน', + backendExited: 'กระบวนการพื้นหลัง Hermes ออกระหว่างการเริ่มต้น', + backendStoppedTitle: 'แบ็กเอนด์หยุดทำงาน', + backendStoppedMessage: 'กระบวนการพื้นหลัง Hermes ออก', + startingConnection: 'กำลังเริ่มการเชื่อมต่อเดสก์ท็อป', + connectingGateway: 'กำลังเชื่อมต่อเกตเวย์เดสก์ท็อปสด', + loadingConfig: 'กำลังโหลดการตั้งค่า Hermes', + loadingSessions: 'กำลังโหลดเซสชันล่าสุด', + desktopBootFailed: 'การบูตเดสก์ท็อปล้มเหลว', + couldNotStart: 'Hermes ไม่สามารถเริ่มทำงานได้', + recoveryDesc: 'เกตเวย์พื้นหลังไม่เริ่มทำงาน ลองขั้นตอนการกู้คืนด้านล่าง — ไม่มีสิ่งใดที่นี่ลบแชทหรือการตั้งค่าของคุณ', + retry: 'ลองใหม่', + repairInstall: 'ซ่อมแซมการติดตั้ง', + useLocalGateway: 'ใช้เกตเวย์ท้องถิ่น', + openLogs: 'เปิดบันทึก', + repairHint: 'การซ่อมแซมทำงานตัวติดตั้งอีกครั้งและอาจใช้เวลาสองสามนาทีบนเครื่องใหม่', + showLogs: 'แสดงบันทึกล่าสุด', + hideLogs: 'ซ่อนบันทึกล่าสุด', + }, + urlDialog: { + title: 'แนบ URL', + description: 'Hermes จะดึงหน้าเว็บและรวมเป็นบริบทสำหรับเทิร์นนี้', + placeholder: 'https://example.com/post', + hint: 'รวม URL เต็ม เช่น', + attach: 'แนบ', + }, + titlebar: { + hideSidebar: 'ซ่อนแถบด้านข้าง', + showSidebar: 'แสดงแถบด้านข้าง', + search: 'ค้นหา', + searchTitle: 'ค้นหาเซสชัน มุมมอง และการดำเนินการ', + hideRightSidebar: 'ซ่อนแถบด้านข้างขวา', + showRightSidebar: 'แสดงแถบด้านข้างขวา', + unmuteHaptics: 'เปิดเสียงสัมผัส', + muteHaptics: 'ปิดเสียงสัมผัส', + openSettings: 'เปิดการตั้งค่า', + profiles: 'โปรไฟล์', + profilesDesc: 'สภาพแวดล้อม Hermes ขั้นสูงสำหรับบุคคล การกำหนดค่า ทักษะ และ SOUL.md แยกต่างหาก', + manageProfiles: 'จัดการโปรไฟล์', + language: 'ภาษา', + languageDesc: 'เลือกภาษาแสดงผลสำหรับอินเทอร์เฟซ', + }, + pagination: { + ariaLabel: 'การแบ่งหน้า', + prevAria: 'ไปที่หน้าก่อนหน้า', + prev: 'ก่อนหน้า', + nextAria: 'ไปที่หน้าถัดไป', + next: 'ถัดไป', + }, + bootstrap: { + pending: 'รอดำเนินการ', + running: 'กำลังติดตั้ง', + done: 'เสร็จสิ้น', + skipped: 'ข้ามแล้ว', + failed: 'ล้มเหลว', + }, + sidebar: { + sheetTitle: 'แถบด้านข้าง', + sheetDesc: 'แสดงแถบด้านข้างมือถือ', + toggle: 'สลับแถบด้านข้าง', + }, + clarify: { + hermesIsAsking: 'Hermes กำลังถาม', + loadingQuestion: 'กำลังโหลดคำถาม…', + otherTypeAnswer: 'อื่นๆ (พิมพ์คำตอบของคุณ)', + placeholderAnswer: 'พิมพ์คำตอบของคุณ…', + cmdEnterToSend: '⌘/Ctrl + Enter เพื่อส่ง', + back: 'กลับ', + skip: 'ข้าม', + couldNotSend: 'ไม่สามารถส่งการตอบกลับการชี้แจง', + n => `1–${n} เพื่อเลือก`, + }, + intro: { + fallback1h: 'วันนี้เราจะย้ายอะไร?', + fallback1b: 'ส่งบั๊ก สาขา แผน หรือไอเดียคร่าวๆ ฉันจะตรวจสอบรีโปและเปลี่ยนเป็นขั้นตอนถัดไปที่เป็นรูปธรรม', + fallback2h: 'คุณคิดอะไรอยู่?', + fallback2b: 'นำโค้ด คำถาม หรือส่วนที่ติดขัดมา ฉันจะอ่านสถานการณ์ก่อนทำการเปลี่ยนแปลง', + fallback3h: 'Hermes ควรดูอะไร?', + fallback3b: 'ส่งงาน เส้นทางที่ล้มเหลว หรือแผนที่ยังไม่สมบูรณ์ ฉันจะช่วยเปลี่ยนเป็นการดำเนินการ', + fallback4h: 'เราควรเริ่มที่ไหน?', + fallback4b: 'นำปัญหา เป้าหมาย หรือไฟล์มา ฉันจะตรวจสอบก่อนและทำให้ขั้นตอนถัดไปเป็นรูปธรรม', + fallback5h: 'อะไรต้องการความสนใจ?', + fallback5b: 'ส่งบริบทที่คุณมี ฉันจะช่วยจัดเรียงเป็นแผนหรือการแก้ไข', + personality: { + label => `โหมด ${label} เปิดอยู่ เราควรทำงานอะไร?`, + body1: 'ส่งงาน ไฟล์ หรือไอเดียคร่าวๆ ฉันจะใช้เสียงที่คุณกำหนดค่าและทำให้งานยึดกับรีโปนี้', + label => `${label} Hermes ต้องเห็นอะไร?`, + body2: 'นำบริบทหรือส่วนที่ติดขัดมา ฉันจะปรับตามบุคลิกที่คุณกำหนดค่า', + label => `โหมด ${label} พร้อมแล้ว`, + body3: 'ส่งปัญหา ไฟล์ หรือไอเดีย ฉันจะทำตามบุคลิกที่คุณกำหนดค่า', + label => `${label} Hermes ควรจัดการอะไร?`, + body4: 'วางงานที่นี่ ฉันจะทำให้งานยึดกับรีโป', + heading5: 'เราควรเริ่มที่ไหน?', + label => `ให้บริบทกับฉันแล้วฉันจะตอบในโหมด ${label}`, + }, + brand: 'HERMES AGENT', + }, + artifacts: { + noArtifactsFound: 'ไม่พบสิ่งประดิษฐ์', + }, + agents: { + spawnTree: 'ต้นไม้การสร้าง', + liveSubagentActivity: 'กิจกรรมซับเอเจนต์สดสำหรับเทิร์นปัจจุบัน', + noLiveSubagents: 'ไม่มีซับเอเจนต์สด', + files: 'ไฟล์', + label: 'เอเจนต์', + open: 'เปิดเอเจนต์', + close: 'ปิดเอเจนต์', + subagent: 'ซับเอเจนต์', + subagents: 'ซับเอเจนต์', + failed: 'ล้มเหลว', + running: 'กำลังทำงาน', + }, + provider: { + desc: { + nousPortal: 'การแทนที่ URL ฐาน Nous Portal', + openRouter: 'คีย์ API OpenRouter (สำหรับการมองเห็น ตัวช่วยการขูดเว็บ และ MoA)', + google: 'คีย์ API Google AI Studio (รู้จักในชื่อ GEMINI_API_KEY ด้วย)', + gemini: 'ID โปรเจกต์ GCP สำหรับระดับ Gemini แบบชำระเงิน (ระดับฟรีจัดเตรียมให้อัตโนมัติ)', + anthropic: 'คีย์ API Anthropic', + deepseek: 'URL ฐาน DeepSeek API แบบกำหนดเอง (ขั้นสูง)', + xai: 'การแทนที่ URL ฐาน xAI', + huggingface: 'การแทนที่ URL ฐาน Hugging Face Inference Providers', + kimi: 'คีย์ API Kimi / Moonshot China', + minimax: 'การแทนที่ URL ฐาน MiniMax (จีน)', + minimaxCn: 'คีย์ API MiniMax China', + dashscope: 'URL ฐาน DashScope แบบกำหนดเอง (ค่าเริ่มต้น: ปลายทาง coding-intl ที่เข้ากันได้กับ OpenAI)', + glm: 'คีย์ API GLM (Z.AI)', + nvidia: 'การแทนที่ URL ฐาน NVIDIA NIM (เช่น http://localhost:8000/v1 สำหรับ NIM ท้องถิ่น)', + opencodeGo: 'คีย์ API OpenCode Go', + opencodeZen: 'คีย์ API OpenCode Zen', + xiaomi: 'การแทนที่ URL ฐาน Xiaomi MiMo (ค่าเริ่มต้น: https://api.xiaomimimo.com/v1)', + kiloCode: 'คีย์ API Kilo Code', + aiGateway: 'คีย์ API AI Gateway (Vercel AI Gateway)', + browserbase: 'BROWSERBASE_API_KEY', + elevenLabs: 'คีย์ API ElevenLabs', + openai: 'คีย์ API OpenAI (สำหรับการประมวลผลเสียงผ่านพร็อกซี)', + mistral: 'คีย์ API Mistral (สำหรับ STT/TTS)', + groq: 'คีย์ API Groq (สำหรับ STT)', + tavily: 'TAVILY_API_KEY', + firecrawl: 'URL Firecrawl API สำหรับอินสแตนซ์ที่โฮสต์เอง (ไม่บังคับ)', + fal: 'FAL_KEY', + nous: 'การแทนที่ URL ฐาน Nous Portal', + openrouter: 'คีย์ API OpenRouter (สำหรับการมองเห็น ตัวช่วยการขูดเว็บ และ MoA)', + lmstudio: 'การแทนที่ URL ฐาน Z.AI / GLM', + zai: 'URL ฐาน Azure Foundry (ตั้งค่าผ่าน \'hermes model\' สำหรับการกำหนดค่าเฉพาะปลายทาง)', + stepfun: 'การแทนที่ URL ฐาน StepFun Step Plan', + arcee: 'การแทนที่ URL ฐาน Arcee AI', + gmi: 'การแทนที่ URL ฐาน GMI Cloud', + qwenportal: 'การแทนที่ URL ฐาน Qwen Portal (ค่าเริ่มต้น: https://portal.qwen.ai/v1)', + opencodego: 'การแทนที่ URL ฐาน OpenCode Go', + ollamacloud: 'การแทนที่ URL ฐาน Ollama Cloud (ค่าเริ่มต้น: https://ollama.com/v1)', + awsbedrock: 'โปรไฟล์ที่มีชื่อ AWS สำหรับการตรวจสอบสิทธิ์ Bedrock (จาก ~/.aws/credentials)', + exa: 'คีย์ API Exa สำหรับการค้นหาเว็บและเนื้อหาที่เน้น AI', + parallel: 'คีย์ API Parallel สำหรับการค้นหาเว็บและสกัดที่เน้น AI', + }, + }, +} +) diff --git a/apps/desktop/src/i18n/types.ts b/apps/desktop/src/i18n/types.ts index dd3a176a07e7..141857e558e5 100644 --- a/apps/desktop/src/i18n/types.ts +++ b/apps/desktop/src/i18n/types.ts @@ -5,7 +5,7 @@ // partial locales should use `defineLocale()` so missing desktop-only strings // fall back to English while new keys remain type-checked. -export type Locale = 'en' | 'zh' | 'zh-hant' | 'ja' +export type Locale = 'en' | 'zh' | 'zh-hant' | 'ja' | 'ko' | 'de' | 'es' | 'fr' | 'pt-br' | 'ar' | 'hi' | 'th' | 'vi' | 'it' | 'ru' export type ToolTitleKey = | 'browser_click' diff --git a/apps/desktop/src/i18n/vi.ts b/apps/desktop/src/i18n/vi.ts new file mode 100644 index 000000000000..237a8efe4a0c --- /dev/null +++ b/apps/desktop/src/i18n/vi.ts @@ -0,0 +1,953 @@ +import { defineLocale } from './define-locale' + +export const vi = defineLocale( +{ + appearance: { + title: 'Giao diện', + description: 'Đây là các tùy chọn hiển thị chỉ dành cho desktop. Chế độ màu điều khiển độ sáng; chủ đề điều khiển bảng màu nhấn và kiểu dáng bề mặt trò chuyện.', + colorMode: 'Chế độ màu', + colorModeDesc: 'Chọn chế độ cố định hoặc để Hermes theo cài đặt hệ thống của bạn.', + theme: { + nous: 'Nous', + nousDesc: 'Tông trung tính kính với điểm nhấn xanh Nous', + midnight: 'Nửa đêm', + midnightDesc: 'Xanh tím đậm với điểm nhấn lạnh', + ember: 'Than hồng', + emberDesc: 'Đỏ thẫm và đồng ấm áp — phong cách lò rèn', + mono: 'Đơn sắc', + monoDesc: 'Thang xám sạch sẽ — tối giản và tập trung', + cyberpunk: 'Cyberpunk', + cyberpunkDesc: 'Xanh neon trên nền đen — terminal ma trận', + slate: 'Đá phiến', + slateDesc: 'Xanh đá phiến mát — chủ đề lập trình tập trung', + }, + themeDesc: 'Chọn bảng màu cho bề mặt trò chuyện và màu nhấn giao diện.', + mode: { + light: 'Sáng', + lightDesc: 'Bề mặt desktop sáng', + dark: 'Tối', + darkDesc: 'Không gian làm việc giảm chói', + system: 'Hệ thống', + systemDesc: 'Theo giao diện hệ điều hành', + }, + language: 'Ngôn ngữ', + languageDesc: 'Chọn ngôn ngữ giao diện hoặc để Hermes theo cài đặt hệ thống của bạn.', + toolCallDisplay: 'Hiển thị gọi công cụ', + toolCallDisplayDesc: 'Chế độ Sản phẩm ẩn tải trọng công cụ thô; Kỹ thuật hiển thị đầy đủ đầu vào/đầu ra.', + toolViewProduct: 'Sản phẩm', + toolViewTechnical: 'Kỹ thuật', + toolViewProductDesc: 'Hoạt động công cụ thân thiện với người dùng, tóm tắt ngắn gọn.', + toolViewTechnicalDesc: 'Bao gồm tham số/kết quả công cụ thô và chi tiết cấp thấp.', + }, + settings: { + title: 'Cài đặt', + appearance: 'Giao diện', + model: 'Mô hình', + gateway: 'Cổng kết nối', + sessions: 'Phiên', + tools: 'Công cụ & Kỹ năng', + section: { + chat: 'Trò chuyện', + workspace: 'Không gian làm việc', + safety: 'An toàn', + memory: 'Bộ nhớ & Ngữ cảnh', + voice: 'Giọng nói', + advanced: 'Nâng cao', + }, + mcp: 'Máy chủ MCP', + config: 'Cấu hình', + keys: 'Khóa API', + about: 'Giới thiệu', + closeSettings: 'Đóng cài đặt', + archivedChats: 'Trò chuyện đã lưu trữ', + exportConfig: 'Xuất cấu hình', + importConfig: 'Nhập cấu hình', + resetDefaults: 'Đặt lại mặc định', + llmProviders: 'Nhà cung cấp LLM', + searchPlaceholder: { + about: 'Giới thiệu về Hermes Desktop', + config: 'Tìm cài đặt…', + gateway: 'Kết nối cổng…', + keys: 'Tìm khóa API…', + mcp: 'Tìm máy chủ MCP…', + sessions: 'Tìm phiên đã lưu trữ…', + }, + }, + chat: { + placeholder: 'Hỏi tôi bất cứ điều gì…', + send: 'Gửi', + stop: 'Dừng', + thinking: 'Đang suy nghĩ…', + noSession: 'Không có phiên hoạt động. Bắt đầu cuộc trò chuyện mới.', + loadingSession: 'Đang tải phiên', + loadingResponse: 'Hermes đang tải phản hồi', + branchInNewChat: 'Phân nhánh trong trò chuyện mới', + readAloud: 'Đọc to', + preparingAudio: 'Đang chuẩn bị âm thanh...', + stopReading: 'Dừng đọc', + editMessage: 'Sửa tin nhắn', + editableCheckpoint: 'Điểm kiểm tra có thể sửa', + restoreCheckpoint: 'Khôi phục điểm kiểm tra', + goForward: 'Tiến tới', + restorePrevCheckpoint: 'Khôi phục điểm kiểm tra trước', + restoreNextCheckpoint: 'Khôi phục điểm kiểm tra sau', + composerTip: 'Mẹo: gõ @ để tham chiếu tệp trực tiếp.', + reconnecting: 'Đang kết nối lại với Hermes…', + }, + commandCenter: { + title: 'Trung tâm điều khiển', + noSessions: 'Chưa có phiên nào.', + loadingStatus: 'Đang tải trạng thái…', + recentLogs: 'Nhật ký gần đây', + dailyTokens: 'Token hôm nay', + noActivity: 'Không có hoạt động hôm nay.', + noModelUsage: 'Chưa có sử dụng mô hình nào.', + noSkillActivity: 'Chưa có hoạt động kỹ năng nào.', + sessionsPanel: 'Bảng phiên', + systemPanel: 'Bảng hệ thống', + usagePanel: 'Bảng sử dụng', + navigate: 'Điều hướng', + noMatchingResults: 'Không tìm thấy kết quả phù hợp.', + noSessionsYet: 'Chưa có phiên nào.', + unpinSession: 'Bỏ ghim phiên', + pinSession: 'Ghim phiên', + exportSession: 'Xuất phiên', + deleteSession: 'Xóa phiên', + gatewayRunning: 'Cổng nhắn tin đang chạy', + gatewayStopped: 'Cổng nhắn tin đã dừng', + restartMsg: 'Khởi động lại nhắn tin', + updateHermes: 'Cập nhật Hermes', + noLogsLoaded: 'Chưa tải nhật ký nào.', + closeLabel: 'Đóng trung tâm điều khiển', + searchPlaceholder: 'Tìm phiên, chế độ xem và hành động', + statSessions: 'Phiên', + statApiCalls: 'Lần gọi API', + statTokens: 'Token vào/ra', + statEstCost: 'Chi phí ước tính', + cost => `thực tế ${cost}`, + loadingUsage: 'Đang tải dữ liệu sử dụng...', + count => `Không có sử dụng trong ${count} ngày qua.`, + retry: 'Thử lại', + tokenInput: 'đầu vào', + tokenOutput: 'đầu ra', + noDailyActivity: 'Không có hoạt động hôm nay.', + topModels: 'Mô hình hàng đầu', + topSkills: 'Kỹ năng hàng đầu', + actionsLabel: 'hành động', + systemRunning: 'đang chạy', + systemDone: 'xong', + systemFailed: 'thất bại', + open: 'Mở Trung tâm điều khiển', + close: 'Đóng Trung tâm điều khiển', + }, + common: { + loading: 'Đang tải…', + save: 'Lưu', + cancel: 'Hủy', + close: 'Đóng', + delete: 'Xóa', + confirm: 'Xác nhận', + search: 'Tìm kiếm…', + clearSearch: 'Xóa tìm kiếm', + copy: 'Sao chép', + refresh: 'Làm mới', + moreActions: 'Thêm hành động', + tryAgain: 'Thử lại', + }, + onboarding: { + welcome: 'Chào mừng đến với Hermes', + getStarted: 'Bắt đầu bằng cách chọn nhà cung cấp và mô hình.', + skip: 'Bỏ qua', + continue: 'Tiếp tục', + finish: 'Hoàn tất', + setupTitle: 'Hãy thiết lập Hermes Agent cho bạn', + setupDesc: 'Kết nối nhà cung cấp mô hình để bắt đầu trò chuyện. Hầu hết chỉ cần một lần nhấp.', + preparing: 'Đang khởi động Hermes…', + installing: 'Hermes đang hoàn tất cài đặt. Lần đầu thường mất dưới một phút.', + lookingUp: 'Đang tra cứu nhà cung cấp...', + otherProviders: 'Nhà cung cấp khác', + collapse: 'Thu gọn', + iHaveKey: 'Tôi có khóa API', + recommended: 'Được đề xuất', + connected: 'Đã kết nối', + backToSignIn: 'Quay lại đăng nhập', + getKey: 'Lấy khóa', + pasteKey: 'Dán khóa API', + connect: 'Kết nối', + connecting: 'Đang kết nối', + copyCode: 'Sao chép', + startSignIn: 'Đang bắt đầu đăng nhập cho', + verifyingCode: 'Đang xác minh mã của bạn với', + pickingModel: 'đã kết nối. Đang chọn mô hình mặc định...', + signInFailed: 'Đăng nhập thất bại. Thử lại.', + pickDifferent: 'Chọn nhà cung cấp khác', + signInTitle: 'Đăng nhập với', + step1: 'Chúng tôi đã mở', + step1End: 'trong trình duyệt của bạn.', + step2: 'Ủy quyền cho Hermes tại đó.', + step3: 'Sao chép mã ủy quyền và dán vào bên dưới.', + pasteCode: 'Dán mã ủy quyền', + reopenAuth: 'Mở lại trang ủy quyền', + cancel: 'Hủy', + browserDesc: 'Chúng tôi đã mở', + browserDescEnd: 'trong trình duyệt của bạn. Ủy quyền cho Hermes tại đó và bạn sẽ được kết nối tự động — không cần sao chép hay dán gì cả.', + waitingAuth: 'Đang chờ bạn ủy quyền...', + reopenSignIn: 'Mở lại trang đăng nhập', + externalDesc: 'đăng nhập qua CLI riêng. Chạy lệnh này trong terminal, sau đó quay lại và chọn "Tôi đã đăng nhập":', + iSignedIn: 'Tôi đã đăng nhập', + enterCode: 'Chúng tôi đã mở', + enterCodeEnd: 'trong trình duyệt của bạn. Nhập mã này tại đó:', + reopenVerification: 'Mở lại trang xác minh', + defaultModel: 'Mô hình mặc định', + freeTier: 'Gói miễn phí', + pro: 'Pro', + change: 'Thay đổi', + startChatting: 'Bắt đầu trò chuyện', + docs: 'tài liệu', + close: 'Đóng', + savingError: 'Không thể lưu thông tin xác thực.', + openRouter: 'OpenRouter', + }, + file: { + browser: 'Trình duyệt tệp', + noFiles: 'Chưa có tệp nào.', + }, + terminal: { + title: 'Terminal', + newTab: 'Tab mới', + closeTab: 'Đóng tab', + }, + skills: { + title: 'Kỹ năng', + search: 'Tìm kỹ năng…', + noResults: 'Không tìm thấy kỹ năng nào.', + tools: 'Kỹ năng & Công cụ', + }, + profiles: { + title: 'Hồ sơ', + noProfilesYet: 'Chưa có hồ sơ nào.', + selectProfile: 'Chọn hồ sơ để xem chi tiết.', + deleteProfile: 'Xóa hồ sơ?', + soulMd: 'SOUL.md', + unsavedChanges: 'Thay đổi chưa lưu', + newProfile: 'Hồ sơ mới', + cloneFromDefault: 'Sao chép từ mặc định', + renameProfile: 'Đổi tên hồ sơ', + }, + cron: { + title: 'Công việc định kỳ', + noJobs: 'Không có công việc định kỳ nào.', + deleteCronJob: 'Xóa công việc định kỳ?', + optional: 'Tùy chọn', + label: 'Định kỳ', + open: 'Mở công việc định kỳ', + }, + messaging: { + title: 'Nhắn tin', + recommended: 'Được đề xuất', + recommendedTelegram: 'Được đề xuất. ID số phân cách bằng dấu phẩy từ @userinfobot. Nếu không có, bất kỳ ai cũng có thể nhắn tin cho bot của bạn.', + recommendedDiscord: 'Được đề xuất. ID người dùng Discord phân cách bằng dấu phẩy.', + recommendedSlack: 'Được đề xuất. ID người dùng Slack phân cách bằng dấu phẩy.', + recommendedMattermost: 'Được đề xuất. ID người dùng Mattermost phân cách bằng dấu phẩy.', + recommendedMatrix: 'Được đề xuất. ID người dùng phân cách bằng dấu phẩy theo định dạng @user:server.', + recommendedSignal: 'Được đề xuất. Định danh Signal phân cách bằng dấu phẩy.', + recommendedWhatsApp: 'Được đề xuất. Số điện thoại hoặc ID WhatsApp phân cách bằng dấu phẩy.', + gatewayStopped: 'Cổng nhắn tin đã dừng', + getCredentials: 'Lấy thông tin xác thực của bạn', + required: 'Bắt buộc', + unsavedChanges: 'Thay đổi chưa lưu', + saved: 'Đã lưu', + }, + about: { + version: 'Phiên bản', + checkUpdates: 'Kiểm tra cập nhật', + upToDate: 'Hermes đã là phiên bản mới nhất.', + updateAvailable: 'Có bản cập nhật mới.', + license: 'Giấy phép MIT', + hermesDesktop: 'Hermes Desktop', + versionUnavailable: 'Không có thông tin phiên bản', + updates: 'Cập nhật', + checkNow: 'Kiểm tra ngay', + checking: 'Đang kiểm tra…', + seeWhatsNew: 'Xem có gì mới', + releaseNotes: 'Ghi chú phát hành', + autoUpdates: 'Cập nhật tự động', + autoUpdatesDesc: 'Hermes tự động kiểm tra cập nhật trong nền và thông báo khi có bản mới sẵn sàng.', + selfUpdateUnsupported: 'Bản dựng này không thể tự cập nhật từ bên trong ứng dụng.', + cannotReachServer: 'Không thể kết nối đến máy chủ cập nhật.', + installingUpdate: 'Đang cài đặt bản cập nhật.', + count => `Đã có bản cập nhật mới (bao gồm ${count} thay đổi).`, + count => `Đã có bản cập nhật mới (bao gồm ${count} thay đổi).`, + onLatest: 'Bạn đang dùng phiên bản mới nhất.', + tapCheckNow: 'Nhấn "Kiểm tra ngay" để tìm bản cập nhật.', + time => `Kiểm tra lần cuối ${time}`, + justNow: 'vừa xong', + never: 'chưa bao giờ', + count => `${count} phút trước`, + count => `${count} giờ trước`, + count => `${count} ngày trước`, + (branch, sha) => `Nhánh ${branch} · Commit ${sha}`, + }, + keys: { + title: 'Khóa API', + noKeys: 'Chưa cấu hình khóa API nào.', + addKey: 'Thêm khóa', + loading: 'Đang tải khóa API và thông tin xác thực…', + docs: 'Tài liệu', + openDocs: 'Mở tài liệu nhà cung cấp', + hideValue: 'Ẩn giá trị', + revealValue: 'Hiện giá trị', + set: 'Đã đặt', + notSet: 'Chưa đặt', + replace: 'Thay thế', + replaceValue: 'Thay thế giá trị hiện tại', + enterValue: 'Nhập giá trị', + saving: 'Đang lưu', + save: 'Lưu', + cancel: 'Hủy', + clearValue: 'Xóa giá trị', + (count, total) => `Đã cấu hình ${count}/${total}`, + (count, total) => `Đã đặt ${count}/${total}`, + count => `Đã đặt ${count}`, + count => `${count} khóa`, + otherProviders: 'Nhà cung cấp khác', + categoryTools: 'Công cụ', + categoryMessaging: 'Nhắn tin', + categorySettings: 'Cài đặt', + openProviderDocs: 'Mở tài liệu nhà cung cấp', + showAdvanced: 'Hiện nâng cao', + loadFailed: 'Không thể tải khóa API', + credentialSaved: 'Đã lưu thông tin xác thực', + credentialRemoved: 'Đã xóa thông tin xác thực', + }, + config: { + title: 'Cấu hình', + edit: 'Chỉnh sửa cấu hình', + reload: 'Tải lại cấu hình', + notSet: 'Chưa đặt', + commaSeparated: 'giá trị phân cách bằng dấu phẩy', + on: 'Bật', + off: 'Tắt', + none: 'Không có', + emptyOption: '(không có)', + loading: 'Đang tải cấu hình Hermes…', + noMatching: 'Không có cài đặt phù hợp', + noMatchingDesc: 'Thử từ khóa tìm kiếm khác hoặc chọn mục khác.', + count => `${count} kết quả`, + count => `${count} kết quả`, + saving: 'Đang lưu…', + label: { + defaultModel: 'Mô hình mặc định', + contextWindow: 'Cửa sổ ngữ cảnh', + fallbackModels: 'Mô hình dự phòng', + enabledToolsets: 'Bộ công cụ đã bật', + timezone: 'Múi giờ', + personality: 'Tính cách', + reasoningBlocks: 'Khối suy luận', + maxAgentSteps: 'Số bước tác tử tối đa', + imageAttachments: 'Đính kèm hình ảnh', + workingDirectory: 'Thư mục làm việc', + executionBackend: 'Backend thực thi', + commandTimeout: 'Thời gian chờ lệnh', + persistentShell: 'Shell duy trì', + envPassthrough: 'Chuyển tiếp biến môi trường', + fileReadLimit: 'Giới hạn đọc tệp', + terminalOutputLimit: 'Giới hạn đầu ra terminal', + filePageLimit: 'Giới hạn trang tệp', + lineLengthLimit: 'Giới hạn độ dài dòng', + codeExecutionMode: 'Chế độ thực thi mã', + approvalMode: 'Chế độ phê duyệt', + approvalTimeout: 'Thời gian chờ phê duyệt', + confirmMcpReloads: 'Xác nhận tải lại MCP', + commandAllowlist: 'Danh sách lệnh cho phép', + redactSecrets: 'Ẩn bí mật', + allowPrivateUrls: 'Cho phép URL riêng tư', + browserPrivateUrls: 'URL riêng tư trình duyệt', + localBrowserForPrivateUrls: 'Trình duyệt cục bộ cho URL riêng tư', + fileCheckpoints: 'Điểm kiểm tra tệp', + checkpointLimit: 'Giới hạn điểm kiểm tra', + voiceShortcut: 'Phím tắt giọng nói', + maxRecordingLength: 'Độ dài ghi âm tối đa', + readResponsesAloud: 'Đọc to phản hồi', + speechToText: 'Chuyển lời nói thành văn bản', + speechToTextProvider: 'Nhà cung cấp chuyển lời nói', + localTranscriptionModel: 'Mô hình chuyển lời cục bộ', + transcriptionLanguage: 'Ngôn ngữ chuyển lời', + elevenlabsSttModel: 'Mô hình STT ElevenLabs', + elevenlabsLanguage: 'Ngôn ngữ ElevenLabs', + tagAudioEvents: 'Gắn thẻ sự kiện âm thanh', + speakerDiarization: 'Phân biệt người nói', + textToSpeechProvider: 'Nhà cung cấp văn bản thành giọng nói', + edgeVoice: 'Giọng Edge', + openaiTtsModel: 'Mô hình TTS OpenAI', + openaiVoice: 'Giọng OpenAI', + elevenlabsVoice: 'Giọng ElevenLabs', + elevenlabsModel: 'Mô hình ElevenLabs', + persistentMemory: 'Bộ nhớ duy trì', + userProfile: 'Hồ sơ người dùng', + memoryBudget: 'Ngân sách bộ nhớ', + profileBudget: 'Ngân sách hồ sơ', + memoryProvider: 'Nhà cung cấp bộ nhớ', + contextEngine: 'Cơ chế ngữ cảnh', + autoCompression: 'Tự động nén', + compressionThreshold: 'Ngưỡng nén', + compressionTarget: 'Mục tiêu nén', + protectedRecentMessages: 'Tin nhắn gần đây được bảo vệ', + apiRetries: 'Số lần thử lại API', + serviceTier: 'Cấp dịch vụ', + toolUseEnforcement: 'Thực thi sử dụng công cụ', + subagentModel: 'Mô hình tác tử phụ', + subagentProvider: 'Nhà cung cấp tác tử phụ', + subagentTurnLimit: 'Giới hạn lượt tác tử phụ', + parallelSubagents: 'Tác tử phụ song song', + subagentTimeout: 'Thời gian chờ tác tử phụ', + subagentReasoningEffort: 'Nỗ lực suy luận tác tử phụ', + }, + desc: { + defaultModel: 'Dùng cho trò chuyện mới trừ khi bạn chọn mô hình khác trong khung soạn.', + contextWindow: 'Để 0 để dùng cửa sổ ngữ cảnh được phát hiện của mô hình đã chọn.', + fallbackModels: 'Các mục nhà cung cấp:mô hình dự phòng để thử nếu mô hình mặc định thất bại.', + personality: 'Phong cách trợ lý mặc định cho phiên mới.', + timezone: 'Dùng khi Hermes cần ngữ cảnh thời gian địa phương. Để trống dùng múi giờ hệ thống.', + reasoningBlocks: 'Hiện các phần suy luận khi backend cung cấp.', + imageAttachments: 'Kiểm soát cách đính kèm hình ảnh được gửi đến mô hình.', + workingDirectory: 'Thư mục dự án mặc định cho công việc công cụ và terminal.', + codeExecutionMode: 'Mức độ giới hạn phạm vi thực thi mã trong dự án hiện tại.', + persistentShell: 'Giữ trạng thái shell giữa các lệnh khi backend hỗ trợ.', + envPassthrough: 'Biến môi trường cần chuyển tiếp vào quá trình thực thi công cụ.', + fileReadLimit: 'Số ký tự tối đa Hermes có thể đọc từ một yêu cầu tệp.', + approvalMode: 'Cách Hermes xử lý các lệnh cần phê duyệt rõ ràng.', + approvalTimeout: 'Thời gian chờ lời nhắc phê duyệt trước khi hết hạn.', + redactSecrets: 'Ẩn bí mật bị phát hiện khỏi nội dung hiển thị cho mô hình khi có thể.', + fileCheckpoints: 'Tạo ảnh chụp khôi phục trước khi chỉnh sửa tệp.', + persistentMemory: 'Lưu ký ức bền vững có thể giúp ích cho các phiên sau.', + userProfile: 'Duy trì hồ sơ gọn nhẹ về tùy chọn người dùng.', + contextEngine: 'Chiến lược quản lý hội thoại dài gần giới hạn ngữ cảnh.', + autoCompression: 'Tóm tắt ngữ cảnh cũ khi hội thoại trở nên lớn.', + readResponsesAloud: 'Tự động đọc to phản hồi của trợ lý.', + speechToText: 'Bật chuyển lời nói cục bộ hoặc qua nhà cung cấp.', + elevenlabsLanguage: 'Mã ngôn ngữ ISO-639-3 tùy chọn. Để trống để ElevenLabs tự động phát hiện.', + maxAgentSteps: 'Giới hạn trên cho số lượt gọi công cụ trước khi Hermes dừng một lần chạy.', + }, + }, + gateway: { + title: 'Cổng kết nối', + start: 'Khởi động cổng', + stop: 'Dừng cổng', + restart: 'Khởi động lại cổng', + running: 'Đang chạy', + stopped: 'Đã dừng', + loading: 'Đang tải cài đặt cổng…', + unavailable: 'Không có cài đặt cổng', + unavailableDesc: 'Cầu nối IPC desktop không hiển thị cài đặt cổng.', + connection: 'Kết nối cổng', + envOverride: 'ghi đè biến môi trường', + desc: 'Hermes Desktop tự khởi động cổng cục bộ riêng theo mặc định. Dùng cổng từ xa khi bạn muốn ứng dụng này điều khiển một backend Hermes đang chạy trên máy khác hoặc sau proxy tin cậy.', + envOverrideTitle: 'Biến môi trường đang điều khiển phiên desktop này.', + (urlVar, tokenVar) => `Bỏ đặt ${urlVar} và ${tokenVar} để dùng cài đặt đã lưu bên dưới.`, + localTitle: 'Cổng cục bộ', + localDesc: 'Khởi động backend Hermes riêng trên localhost. Đây là mặc định và hoạt động ngoại tuyến.', + remoteTitle: 'Cổng từ xa', + remoteDesc: 'Kết nối shell desktop này đến backend Hermes từ xa bằng token phiên của nó.', + remoteUrl: 'URL từ xa', + remoteUrlDesc: 'URL cơ sở cho backend bảng điều khiển từ xa. Hỗ trợ tiền tố đường dẫn, ví dụ /hermes.', + remoteUrlPlaceholder: 'https://gateway.example.com/hermes', + sessionToken: 'Token phiên', + sessionTokenDesc: 'Token phiên bảng điều khiển dùng cho truy cập REST và WebSocket. Để trống để giữ token đã lưu.', + sessionTokenPlaceholder: 'Dán token phiên', + preview => `Token hiện tại ${preview}`, + tokenSaved: 'đã lưu', + testRemote: 'Kiểm tra từ xa', + saveRestart: 'Lưu cho lần khởi động lại sau', + saveReconnect: 'Lưu và kết nối lại', + diagnostics: 'Chẩn đoán', + diagnosticsDesc: 'Hiện desktop.log trong trình quản lý tệp — hữu ích khi cổng không khởi động được.', + openLogs: 'Mở nhật ký', + connected: 'Đã kết nối', + connecting: 'Đang kết nối', + disconnected: 'Đã ngắt kết nối', + inferenceReady: 'Suy luận sẵn sàng', + inferenceNotReady: 'Suy luận chưa sẵn sàng', + checkingInference: 'Đang kiểm tra suy luận', + openSystemPanel: 'Mở bảng hệ thống', + connectionLabel: 'Kết nối:', + recentActivity: 'Hoạt động gần đây', + viewAllLogs: 'Xem tất cả nhật ký →', + messagingPlatforms: 'Nền tảng nhắn tin', + label: 'Cổng kết nối', + inferenceStatus: 'Trạng thái suy luận cổng', + enterUrlFirst: 'Nhập URL từ xa và token phiên trước khi chuyển đổi', + enterUrlFirstTest: 'Nhập URL từ xa và token phiên trước khi kiểm tra', + }, + sessions: { + title: 'Phiên', + search: 'Tìm phiên…', + noResults: 'Không tìm thấy phiên nào.', + export: 'Xuất', + delete: 'Xóa phiên', + loading: 'Đang tải…', + defaultProjectDir: 'Thư mục dự án mặc định', + defaultProjectDirDesc: 'Phiên mới bắt đầu trong thư mục này trừ khi bạn chọn thư mục khác. Để trống để dùng thư mục chính.', + fallback => `Mặc định là ${fallback}.`, + notSet: 'Chưa đặt', + change: 'Thay đổi', + choose: 'Chọn', + clear: 'Xóa', + archivedTitle: 'Phiên đã lưu trữ', + archivedDesc: 'Trò chuyện đã lưu trữ bị ẩn khỏi thanh bên nhưng giữ lại tất cả tin nhắn. Ctrl/⌘-nhấp vào trò chuyện trong thanh bên để lưu trữ.', + nothingArchived: 'Không có gì được lưu trữ', + noSearchMatch: 'Không có trò chuyện đã lưu trữ nào khớp với tìm kiếm.', + archiveToHide: 'Lưu trữ trò chuyện để ẩn ở đây.', + unarchive: 'Bỏ lưu trữ', + deletePermanently: 'Xóa vĩnh viễn', + count => `${count} tin nhắn`, + new: 'Phiên mới', + running: 'Phiên đang chạy', + actions: 'Hành động phiên', + reorder: 'Sắp xếp lại', + pin: 'Ghim', + unpin: 'Bỏ ghim', + copyId: 'Sao chép ID', + rename: 'Đổi tên', + archive: 'Lưu trữ', + renameDialog: 'Đổi tên phiên', + renameDesc: 'Đặt tiêu đề dễ nhớ cho trò chuyện này. Để trống để xóa.', + untitled: 'Phiên không tên', + renamed: 'Đã đổi tên', + renameFailed: 'Đổi tên thất bại', + pinned: 'Đã ghim', + results: 'Kết quả', + allPinned: 'Mọi thứ ở đây đều được ghim. Bỏ ghim trò chuyện để hiện trong mục gần đây.', + pinHint: 'Shift-nhấp để ghim · kéo để sắp xếp lại', + loadMore: 'Tải thêm', + noWorkspace: 'Không có không gian làm việc', + ungroup: 'Hiện phiên dưới dạng danh sách đơn', + groupByWorkspace: 'Nhóm phiên theo không gian làm việc', + loadStep: 'Tải', + moreLabel: 'thêm', + nothingArchivedTitle: 'Không có gì được lưu trữ', + deletePermanentlyTitle: 'Xóa vĩnh viễn', + defaultProjectDirTitle: 'Thư mục dự án mặc định', + loadingArchived: 'Đang tải phiên đã lưu trữ…', + restored: 'Đã khôi phục', + projectDirUpdated: 'Đã cập nhật thư mục dự án mặc định', + loadFailed: 'Không thể tải phiên đã lưu trữ', + unarchiveFailed: 'Bỏ lưu trữ thất bại', + deleteFailed: 'Xóa thất bại', + archiveHint: 'Lưu trữ trò chuyện để ẩn ở đây.', + updateDirFailed: 'Không thể cập nhật thư mục mặc định', + clearDirFailed: 'Không thể xóa thư mục mặc định', + }, + mcp: { + title: 'Máy chủ MCP', + addServer: 'Thêm máy chủ', + noServers: 'Chưa cấu hình máy chủ MCP nào.', + loading: 'Đang tải máy chủ MCP…', + servers: 'Máy chủ MCP', + count => `Đã cấu hình ${count}`, + newServer: 'Máy chủ mới', + reloadMCP: 'Tải lại MCP', + reloading: 'Đang tải lại...', + noServersDesc: 'Thêm máy chủ stdio hoặc HTTP để hiển thị công cụ MCP.', + name: 'Tên', + namePlaceholder: 'hệ thống tệp', + serverJSON: 'JSON máy chủ', + editServer: 'Sửa máy chủ', + saveServer: 'Lưu máy chủ', + saving: 'Đang lưu...', + remove: 'Xóa', + disabled: 'đã tắt', + nameRequired: 'Cần nhập tên', + nameRequiredDesc: 'Đặt khóa cấu hình cho máy chủ MCP này.', + invalidJson: 'Cấu hình máy chủ phải là đối tượng JSON', + invalidJsonDesc: 'JSON MCP không hợp lệ', + saved: 'Đã lưu máy chủ MCP', + name => `${name} sẽ có hiệu lực sau khi tải lại MCP.`, + saveFailed: 'Lưu thất bại', + removeFailed: 'Xóa thất bại', + gatewayUnavailable: 'Cổng không khả dụng', + gatewayUnavailableDesc: 'Kết nối lại cổng trước khi tải lại MCP.', + reloadedTitle: 'Đã tải lại công cụ MCP', + reloadedDesc: 'Lược đồ công cụ mới sẽ áp dụng cho các lượt mới.', + reloadFailed: 'Tải lại MCP thất bại', + giveConfigKey: 'Đặt khóa cấu hình cho máy chủ MCP này.', + reconnectGateway: 'Kết nối lại cổng trước khi tải lại MCP.', + newSchemas: 'Lược đồ công cụ mới sẽ áp dụng cho các lượt mới.', + loadingServers: 'Đang tải máy chủ MCP...', + serverName: 'Tên', + serversTitle: 'Máy chủ MCP', + noServersTitle: 'Không có máy chủ MCP', + failedToLoad: 'Không thể tải cấu hình MCP', + invalidJsonShort: 'JSON MCP không hợp lệ', + serverSaved: 'Đã lưu máy chủ MCP', + toolsReloaded: 'Đã tải lại công cụ MCP', + emptyDesc: 'Thêm máy chủ stdio hoặc HTTP để hiển thị công cụ MCP.', + }, + tools: { + title: 'Công cụ & Kỹ năng', + noTools: 'Không có công cụ nào khả dụng.', + }, + nav: { + home: 'Trang chủ', + chat: 'Trò chuyện', + settings: 'Cài đặt', + files: 'Tệp', + terminal: 'Terminal', + }, + header: { + search: 'Tìm kiếm hoặc nhập lệnh…', + }, + model: { + auxTask: { + vision: 'Thị giác', + visionHint: 'Phân tích hình ảnh', + web_extract: 'Trích xuất web', + web_extractHint: 'Tóm tắt trang', + compression: 'Nén', + compressionHint: 'Thu gọn ngữ cảnh', + session_search: 'Tìm phiên', + session_searchHint: 'Truy vấn gợi nhớ', + skills_hub: 'Trung tâm kỹ năng', + skills_hubHint: 'Tìm kỹ năng', + approval: 'Phê duyệt', + approvalHint: 'Tự động phê duyệt thông minh', + mcp: 'MCP', + mcpHint: 'Định tuyến công cụ MCP', + title_generation: 'Tạo tiêu đề', + title_generationHint: 'Tiêu đề phiên', + curator: 'Giám tuyển', + curatorHint: 'Đánh giá sử dụng kỹ năng', + }, + mainModel: 'Mô hình chính', + mainDesc: 'Áp dụng cho phiên mới. Dùng bộ chọn mô hình trong khung soạn để đổi nhanh cho trò chuyện hiện tại.', + providerPlaceholder: 'Nhà cung cấp', + modelPlaceholder: 'Mô hình', + apply: 'Áp dụng', + applying: 'Đang áp dụng…', + auxiliaryModels: 'Mô hình phụ trợ', + auxiliaryDesc: 'Các tác vụ phụ mặc định dùng mô hình chính. Gán mô hình riêng cho bất kỳ tác vụ nào để ghi đè.', + resetAllToMain: 'Đặt lại tất cả về chính', + setToMain: 'Đặt về chính', + change: 'Thay đổi', + cancel: 'Hủy', + autoUseMain: 'tự động · dùng mô hình chính', + providerDefault: '(mặc định nhà cung cấp)', + loading: 'Đang tải cấu hình mô hình…', + options: 'Tùy chọn', + thinking: 'Suy nghĩ', + fast: 'Nhanh', + effort: 'Nỗ lực', + noOptions: 'Không có tùy chọn cho mô hình này', + optionUpdateFailed: 'Cập nhật tùy chọn mô hình thất bại', + fastModeUpdateFailed: 'Cập nhật chế độ nhanh thất bại', + effortMinimal: 'Tối thiểu', + effortLow: 'Thấp', + effortMedium: 'Trung bình', + effortHigh: 'Cao', + effortMax: 'Tối đa', + switch: 'Đổi mô hình', + unknown: '(không xác định)', + filterPlaceholder: 'Lọc nhà cung cấp và mô hình...', + persistGlobal: 'Lưu toàn cục', + persistGlobalSession: 'Lưu toàn cục (nếu không chỉ cho phiên này)', + couldNotLoad: 'Không thể tải mô hình', + proLockedDesc: 'Mô hình Pro cần đăng ký Nous trả phí.', + priceTooltip: 'Giá đầu vào / đầu ra trên một triệu token', + freePrice: 'Miễn phí', + currentLabel: 'hiện tại:', + addProviderBtn: 'Thêm nhà cung cấp', + }, + updates: { + checking: 'Đang kiểm tra cập nhật…', + available: 'Có bản cập nhật', + downloading: 'Đang tải xuống…', + installing: 'Đang cài đặt…', + restart: 'Khởi động lại để cập nhật', + stageGettingReady: 'Đang chuẩn bị…', + stageDownloading: 'Đang tải xuống…', + stageAlmostThere: 'Sắp xong…', + stageFinishingUp: 'Đang hoàn tất…', + stageRestarting: 'Đang khởi động lại Hermes…', + stageManual: 'Cập nhật từ terminal của bạn', + stageError: 'Cập nhật bị tạm dừng', + updatingHermes: 'Đang cập nhật Hermes…', + lookingForUpdates: 'Đang tìm bản cập nhật…', + couldntCheck: 'Không thể kiểm tra cập nhật', + updateNotAvailable: 'Không có bản cập nhật', + checkConnection: 'Kiểm tra kết nối và thử lại.', + onLatest: 'Bạn đang chạy phiên bản mới nhất.', + allSet: 'Bạn đã sẵn sàng', + newUpdateAvailable: 'Có bản cập nhật mới', + readyToInstall: 'Phiên bản Hermes mới đã sẵn sàng để cài đặt.', + updateNow: 'Cập nhật ngay', + maybeLater: 'Để sau', + count => `+ ${count} thay đổi nữa được bao gồm.`, + count => `+ ${count} thay đổi nữa được bao gồm.`, + updateFromTerminal: 'Cập nhật từ terminal của bạn', + terminalDesc: 'Bạn đã cài đặt Hermes từ dòng lệnh, nên cập nhật cũng chạy ở đó. Dán lệnh này vào terminal của bạn:', + copied: 'Đã sao chép', + copy: 'Sao chép', + pickupNewVersion: 'Hermes sẽ nhận phiên bản mới vào lần khởi chạy tiếp theo.', + done: 'Xong', + updaterDesc: 'Trình cập nhật Hermes sẽ tiếp quản trong cửa sổ riêng và mở lại Hermes khi hoàn tất.', + closeToApply: 'Hermes sẽ đóng để áp dụng bản cập nhật.', + updateDidntFinish: 'Cập nhật chưa hoàn tất', + nothingLost: 'Đừng lo — không mất gì cả. Bạn có thể thử lại ngay bây giờ.', + notNow: 'Không phải bây giờ', + }, + errors: { + generic: 'Đã xảy ra lỗi.', + notFound: 'Không tìm thấy trang.', + noPermission: 'Bạn không có quyền truy cập vào đây.', + somethingBroke: 'Có lỗi trong giao diện', + viewCrashedDesc: 'Giao diện gặp lỗi không mong đợi. Trò chuyện và cài đặt của bạn vẫn an toàn - thử lại, hoặc tải lại cửa sổ.', + noProviders: 'Không có nhà cung cấp nào được xác thực.', + }, + tool: { + toolCall: 'Gọi công cụ', + result: 'Kết quả', + error: 'Lỗi', + timeout: 'Hết thời gian', + cancelled: 'Đã hủy', + running: 'Đang chạy', + recovered: 'Đã khôi phục', + done: 'Xong', + output: 'Đầu ra công cụ', + searchResults: 'Kết quả tìm kiếm', + rawResponse: 'Phản hồi thô', + stdout: 'stdout', + stderr: 'stderr', + copyActivity: 'Sao chép hoạt động', + recoveredAfter: 'Đã khôi phục sau 1 bước thất bại', + count => `Đã khôi phục sau ${count} bước thất bại`, + oneStepFailed: '1 bước thất bại', + count => `${count} bước thất bại`, + }, + composer: { + startingHermes: 'Đang khởi động Hermes...', + sendFollowUp: 'Gửi tiếp', + message: 'Tin nhắn', + editingQueued: 'Đang sửa lượt đã xếp hàng trong khung soạn', + attach: 'Đính kèm', + files: 'Tệp…', + folder: 'Thư mục…', + images: 'Hình ảnh…', + pasteImage: 'Dán hình ảnh', + url: 'URL…', + promptSnippets: 'Đoạn nhắc', + promptSnippetsDesc: 'Chọn một lời nhắc khởi đầu để thả vào khung soạn.', + voiceStart: 'Bắt đầu trò chuyện giọng nói', + queue: 'Xếp hàng tin nhắn', + speaking: 'Đang nói', + transcribing: 'Đang chuyển lời', + muted: 'Đã tắt tiếng', + listening: 'Đang nghe', + unmuteMic: 'Bật mic', + muteMic: 'Tắt mic', + stopListening: 'Dừng nghe và gửi', + endVoice: 'Kết thúc trò chuyện giọng nói', + end: 'Kết thúc', + stopDictation: 'Dừng đọc chính tả', + transcribingDictation: 'Đang chuyển lời đọc chính tả', + voiceDictation: 'Đọc chính tả bằng giọng nói', + addContext: 'Thêm ngữ cảnh', + }, + models: { + title: 'Mô hình', + search: 'Tìm mô hình', + addProvider: 'Thêm nhà cung cấp…', + }, + install: { + title: 'Hermes cần cài đặt một lần', + desc: 'Cài đặt tự động lần đầu chưa khả dụng trên', + descEnd: '. Mở Terminal và chạy lệnh bên dưới, sau đó khởi chạy lại ứng dụng này. Các lần sau sẽ bỏ qua bước này.', + installCommand: 'Lệnh cài đặt', + copyCommand: 'Sao chép lệnh', + viewDocs: 'Xem tài liệu cài đặt', + willInstallTo: 'Sẽ cài đặt vào', + iRanIt: 'Tôi đã chạy -- thử lại', + failed: 'Cài đặt thất bại', + settingUp: 'Đang thiết lập Hermes Agent', + finishingUp: 'Đang hoàn tất', + failedDesc: 'Một trong các bước cài đặt thất bại. Trên Windows, điều này có thể xảy ra nếu một phiên bản Hermes CLI hoặc desktop khác đang chạy. Dừng tất cả phiên bản Hermes đang chạy, sau đó thử lại. Kiểm tra chi tiết bên dưới hoặc nhật ký desktop để xem bản ghi đầy đủ.', + setupDesc: 'Đây là thiết lập một lần. Trình cài đặt Hermes đang tải các phụ thuộc và cấu hình máy của bạn. Các lần khởi chạy sau sẽ bỏ qua bước này.', + fetchingManifest: 'Đang tải tệp kê khai cài đặt...', + error: 'Lỗi', + showOutput: 'Hiện đầu ra cài đặt', + hideOutput: 'Ẩn đầu ra cài đặt', + noOutput: 'Chưa có đầu ra.', + cancelInstall: 'Hủy cài đặt', + cancelling: 'Đang hủy...', + copyOutput: 'Sao chép đầu ra', + copied: 'Đã sao chép!', + reloadRetry: 'Tải lại và thử lại', + saveLogs: 'Bản ghi đầy đủ đã lưu vào', + stepsComplete: 'bước đã hoàn thành', + nowLabel: 'bây giờ', + line: 'dòng', + lines: 'dòng', + }, + previewConsole: { + resizeLabel: 'Đổi kích thước bảng điều khiển xem trước', + noMessages: 'Chưa có tin nhắn bảng điều khiển nào.', + }, + boot: { + ipcUnavailable: 'Cầu nối IPC desktop không khả dụng.', + backendExited: 'Tiến trình nền Hermes đã thoát trong khi khởi động.', + backendStoppedTitle: 'Backend đã dừng', + backendStoppedMessage: 'Tiến trình nền Hermes đã thoát.', + startingConnection: 'Đang khởi động kết nối desktop', + connectingGateway: 'Đang kết nối cổng desktop trực tiếp', + loadingConfig: 'Đang tải cài đặt Hermes', + loadingSessions: 'Đang tải phiên gần đây', + desktopBootFailed: 'Khởi động desktop thất bại', + couldNotStart: 'Hermes không thể khởi động', + recoveryDesc: 'Cổng nền không khởi động được. Thử một trong các bước khôi phục bên dưới — không có gì ở đây xóa trò chuyện hoặc cài đặt của bạn.', + retry: 'Thử lại', + repairInstall: 'Sửa cài đặt', + useLocalGateway: 'Dùng cổng cục bộ', + openLogs: 'Mở nhật ký', + repairHint: 'Sửa chạy lại trình cài đặt và có thể mất vài phút trên máy mới.', + showLogs: 'Hiện nhật ký gần đây', + hideLogs: 'Ẩn nhật ký gần đây', + }, + urlDialog: { + title: 'Đính kèm URL', + description: 'Hermes sẽ tải trang và đưa vào làm ngữ cảnh cho lượt này.', + placeholder: 'https://example.com/bai-viet', + hint: 'Bao gồm URL đầy đủ, ví dụ:', + attach: 'Đính kèm', + }, + titlebar: { + hideSidebar: 'Ẩn thanh bên', + showSidebar: 'Hiện thanh bên', + search: 'Tìm kiếm', + searchTitle: 'Tìm phiên, chế độ xem và hành động', + hideRightSidebar: 'Ẩn thanh bên phải', + showRightSidebar: 'Hiện thanh bên phải', + unmuteHaptics: 'Bật phản hồi rung', + muteHaptics: 'Tắt phản hồi rung', + openSettings: 'Mở cài đặt', + profiles: 'Hồ sơ', + profilesDesc: 'Môi trường Hermes nâng cao cho các nhân vật, cấu hình, kỹ năng và SOUL.md riêng biệt.', + manageProfiles: 'Quản lý hồ sơ', + language: 'Ngôn ngữ', + languageDesc: 'Chọn ngôn ngữ hiển thị cho giao diện.', + }, + pagination: { + ariaLabel: 'phân trang', + prevAria: 'Đi đến trang trước', + prev: 'Trước', + nextAria: 'Đi đến trang sau', + next: 'Sau', + }, + bootstrap: { + pending: 'Đang chờ', + running: 'Đang cài đặt', + done: 'Xong', + skipped: 'Đã bỏ qua', + failed: 'Thất bại', + }, + sidebar: { + sheetTitle: 'Thanh bên', + sheetDesc: 'Hiển thị thanh bên trên di động.', + toggle: 'Chuyển đổi thanh bên', + }, + clarify: { + hermesIsAsking: 'Hermes đang hỏi', + loadingQuestion: 'Đang tải câu hỏi…', + otherTypeAnswer: 'Khác (nhập câu trả lời của bạn)', + placeholderAnswer: 'Nhập câu trả lời của bạn…', + cmdEnterToSend: '⌘/Ctrl + Enter để gửi', + back: 'Quay lại', + skip: 'Bỏ qua', + couldNotSend: 'Không thể gửi phản hồi làm rõ', + n => `1–${n} để chọn`, + }, + intro: { + fallback1h: 'Hôm nay chúng ta làm gì?', + fallback1b: 'Gửi lỗi, nhánh, kế hoạch hoặc ý tưởng thô. Tôi sẽ kiểm tra repo và biến nó thành bước cụ thể tiếp theo.', + fallback2h: 'Bạn đang nghĩ gì?', + fallback2b: 'Mang mã, câu hỏi hoặc phần bế tắc đến đây. Tôi sẽ đọc tình hình trước khi thực hiện thay đổi.', + fallback3h: 'Hermes nên xem gì?', + fallback3b: 'Gửi tác vụ, đường dẫn thất bại hoặc kế hoạch dang dở. Tôi sẽ giúp biến nó thành hành động.', + fallback4h: 'Chúng ta bắt đầu từ đâu?', + fallback4b: 'Mang vấn đề, mục tiêu hoặc tệp đến đây. Tôi sẽ kiểm tra trước và giữ bước tiếp theo cụ thể.', + fallback5h: 'Điều gì cần chú ý?', + fallback5b: 'Gửi ngữ cảnh bạn có. Tôi sẽ giúp sắp xếp thành kế hoạch hoặc bản sửa.', + personality: { + label => `Chế độ ${label} đang bật. Chúng ta nên làm gì?`, + body1: 'Gửi tác vụ, tệp hoặc ý tưởng thô. Tôi sẽ dùng giọng điệu đã cấu hình và giữ công việc gắn với repo này.', + label => `${label} Hermes cần xem gì?`, + body2: 'Mang ngữ cảnh hoặc phần bế tắc đến đây. Tôi sẽ thích ứng với tính cách đã cấu hình của bạn.', + label => `Chế độ ${label} đã sẵn sàng.`, + body3: 'Gửi vấn đề, tệp hoặc ý tưởng. Tôi sẽ theo tính cách bạn đã cấu hình.', + label => `${label} Hermes nên giải quyết gì?`, + body4: 'Thả tác vụ vào đây. Tôi sẽ giữ công việc gắn với repo.', + heading5: 'Chúng ta bắt đầu từ đâu?', + label => `Đưa tôi ngữ cảnh và tôi sẽ trả lời ở chế độ ${label}.`, + }, + brand: 'HERMES AGENT', + }, + artifacts: { + noArtifactsFound: 'Không tìm thấy tạo phẩm nào', + }, + agents: { + spawnTree: 'Cây phân nhánh', + liveSubagentActivity: 'Hoạt động subagent trực tiếp cho lượt hiện tại.', + noLiveSubagents: 'Không có subagent trực tiếp', + files: 'Tệp', + label: 'Tác tử', + open: 'Mở tác tử', + close: 'Đóng tác tử', + subagent: 'tác tử phụ', + subagents: 'tác tử phụ', + failed: 'thất bại', + running: 'đang chạy', + }, + provider: { + desc: { + nousPortal: 'Ghi đè URL cơ sở Cổng Nous', + openRouter: 'Khóa API OpenRouter (cho thị giác, trợ lý trích xuất web và MoA)', + google: 'Khóa API Google AI Studio (cũng được nhận dạng là GEMINI_API_KEY)', + gemini: 'ID dự án GCP cho các gói Gemini trả phí (gói miễn phí tự động cấp)', + anthropic: 'Khóa API Anthropic', + deepseek: 'URL cơ sở API DeepSeek tùy chỉnh (nâng cao)', + xai: 'Ghi đè URL cơ sở xAI', + huggingface: 'Ghi đè URL cơ sở Nhà cung cấp suy luận Hugging Face', + kimi: 'Khóa API Kimi / Moonshot Trung Quốc', + minimax: 'Ghi đè URL cơ sở MiniMax (Trung Quốc)', + minimaxCn: 'Khóa API MiniMax Trung Quốc', + dashscope: 'URL cơ sở DashScope tùy chỉnh (mặc định: điểm cuối tương thích OpenAI coding-intl)', + glm: 'Khóa API GLM (Z.AI)', + nvidia: 'Ghi đè URL cơ sở NVIDIA NIM (vd: http://localhost:8000/v1 cho NIM cục bộ)', + opencodeGo: 'Khóa API OpenCode Go', + opencodeZen: 'Khóa API OpenCode Zen', + xiaomi: 'Ghi đè URL cơ sở Xiaomi MiMo (mặc định: https://api.xiaomimimo.com/v1)', + kiloCode: 'Khóa API Kilo Code', + aiGateway: 'Khóa API AI Gateway (Vercel AI Gateway)', + browserbase: 'BROWSERBASE_API_KEY', + elevenLabs: 'Khóa API ElevenLabs', + openai: 'Khóa API OpenAI (cho xử lý giọng nói qua proxy)', + mistral: 'Khóa API Mistral (cho STT/TTS)', + groq: 'Khóa API Groq (cho STT)', + tavily: 'TAVILY_API_KEY', + firecrawl: 'URL API Firecrawl cho phiên bản tự lưu trữ (tùy chọn)', + fal: 'FAL_KEY', + nous: 'Ghi đè URL cơ sở Cổng Nous', + openrouter: 'Khóa API OpenRouter (cho thị giác, trợ lý trích xuất web và MoA)', + lmstudio: 'Ghi đè URL cơ sở Z.AI / GLM', + zai: 'URL cơ sở Azure Foundry (đặt qua \'hermes model\' cho cấu hình điểm cuối cụ thể)', + stepfun: 'Ghi đè URL cơ sở StepFun Step Plan', + arcee: 'Ghi đè URL cơ sở Arcee AI', + gmi: 'Ghi đè URL cơ sở GMI Cloud', + qwenportal: 'Ghi đè URL cơ sở Cổng Qwen (mặc định: https://portal.qwen.ai/v1)', + opencodego: 'Ghi đè URL cơ sở OpenCode Go', + ollamacloud: 'Ghi đè URL cơ sở Ollama Cloud (mặc định: https://ollama.com/v1)', + awsbedrock: 'Hồ sơ AWS được đặt tên cho xác thực Bedrock (từ ~/.aws/credentials)', + exa: 'Khóa API Exa cho tìm kiếm web và nội dung AI', + parallel: 'Khóa API Parallel cho tìm kiếm và trích xuất web AI', + }, + }, +} +)