diff --git a/.i18nrc.js b/.i18nrc.js
index 0904d3bc..a48b5810 100644
--- a/.i18nrc.js
+++ b/.i18nrc.js
@@ -5,6 +5,7 @@ module.exports = defineConfig({
entryLocale: 'zh-CN',
output: 'locales',
outputLocales: [
+ 'ar',
'zh-TW',
'en-US',
'ru-RU',
diff --git a/locales/ar/chat.json b/locales/ar/chat.json
new file mode 100644
index 00000000..6367e3d7
--- /dev/null
+++ b/locales/ar/chat.json
@@ -0,0 +1,96 @@
+{
+ "agentDefaultMessage": "مرحبًا، أنا **{{name}}**، يمكنك البدء في الدردشة معي على الفور، أو يمكنك الانتقال إلى [إعدادات المساعد](/chat/settings#session={{id}}) لتحسين معلوماتي.",
+ "agentDefaultMessageWithSystemRole": "مرحبًا، أنا **{{name}}**، {{systemRole}}، دعنا نبدأ الدردشة!",
+ "backToBottom": "العودة إلى الأسفل",
+ "clearCurrentMessages": "مسح رسائل الجلسة الحالية",
+ "confirmClearCurrentMessages": "سيتم مسح رسائل الجلسة الحالية قريبًا، وبمجرد المسح لن يمكن استعادتها، يرجى تأكيد الإجراء الخاص بك",
+ "confirmRemoveSessionItemAlert": "سيتم حذف هذا المساعد قريبًا، وبمجرد الحذف لن يمكن استعادته، يرجى تأكيد الإجراء الخاص بك",
+ "defaultAgent": "المساعد الافتراضي",
+ "defaultSession": "المساعد الافتراضي",
+ "duplicateTitle": "{{title}} نسخة",
+ "historyRange": "نطاق التاريخ",
+ "inbox": {
+ "defaultMessage": "مرحبًا، أنا مساعدك الذكي، يمكنك أن تسألني أي شيء وسأحاول الإجابة عليك. إذا كنت بحاجة إلى مساعد أكثر احترافية أو مخصصة، يمكنك النقر على `+` لإنشاء مساعد مخصص",
+ "desc": "قم بتشغيل مجموعة الدماغ وأشعل شرارة التفكير. مساعدك الذكي، هنا حيث يمكنك التواصل بكل شيء",
+ "title": "دردشة عشوائية"
+ },
+ "input": {
+ "onlyAdd": "إضافة الرسالة فقط",
+ "send": "إرسال",
+ "sendWithCmdEnter": "اضغط {{meta}} + Enter للإرسال",
+ "sendWithEnter": "اضغط Enter للإرسال",
+ "stop": "توقف",
+ "warp": "تغيير السطر"
+ },
+ "messageAction": {
+ "delAndRegenerate": "حذف وإعادة الإنشاء",
+ "regenerate": "إعادة الإنشاء"
+ },
+ "newAgent": "مساعد جديد",
+ "noDescription": "لا توجد وصف",
+ "pin": "تثبيت",
+ "pinOff": "إلغاء التثبيت",
+ "regenerate": "إعادة الإنشاء",
+ "roleAndArchive": "الدور والأرشيف",
+ "searchAgentPlaceholder": "البحث عن مساعد ومحادثة...",
+ "sendPlaceholder": "أدخل محتوى الدردشة...",
+ "sessionList": "قائمة المساعدين",
+ "shareModal": {
+ "download": "تحميل اللقطة",
+ "imageType": "نوع الصورة",
+ "screenshot": "لقطة شاشة",
+ "settings": "إعدادات التصدير",
+ "shareToShareGPT": "إنشاء رابط مشاركة ShareGPT",
+ "withBackground": "تضمين صورة الخلفية",
+ "withFooter": "تضمين تذييل",
+ "withPluginInfo": "تضمين معلومات البرنامج المساعد",
+ "withSystemRole": "تضمين دور المساعد"
+ },
+ "stt": {
+ "action": "إدخال صوتي",
+ "loading": "جارٍ التعرف...",
+ "prettifying": "جارٍ التجميل..."
+ },
+ "temp": "مؤقت",
+ "tokenDetail": "إعداد الدور: {{systemRoleToken}} · رسائل الجلسة: {{chatsToken}} · إعداد الأدوات: {{toolsToken}}",
+ "tokenTag": {
+ "overload": "تجاوز الحد",
+ "remained": "متبقي",
+ "used": "مستخدم"
+ },
+ "topic": {
+ "actions": {
+ "autoRename": "إعادة تسمية ذكية",
+ "duplicate": "إنشاء نسخة",
+ "export": "تصدير الموضوع"
+ },
+ "confirmRemoveAll": "سيتم حذف جميع المواضيع قريبًا، وبمجرد الحذف لن يمكن استعادتها، يرجى التحلي بالحذر.",
+ "confirmRemoveTopic": "سيتم حذف هذا الموضوع قريبًا، وبمجرد الحذف لن يمكن استعادته، يرجى التحلي بالحذر.",
+ "confirmRemoveUnstarred": "سيتم حذف المواضيع غير المحفوظة قريبًا، وبمجرد الحذف لن يمكن استعادتها، يرجى التحلي بالحذر.",
+ "defaultTitle": "الموضوع الافتراضي",
+ "guide": {
+ "desc": "انقر فوق زر الإرسال الأيسر لحفظ الجلسة الحالية كموضوع تاريخي وبدء جلسة جديدة",
+ "title": "قائمة المواضيع"
+ },
+ "openNewTopic": "فتح موضوع جديد",
+ "removeAll": "حذف جميع المواضيع",
+ "removeUnstarred": "حذف المواضيع غير المحفوظة",
+ "saveCurrentMessages": "حفظ الجلسة الحالية كموضوع",
+ "searchPlaceholder": "البحث في المواضيع...",
+ "title": "الموضوع"
+ },
+ "translate": {
+ "action": "ترجمة",
+ "clear": "مسح الترجمة"
+ },
+ "tts": {
+ "action": "قراءة صوتية",
+ "clear": "مسح الصوت"
+ },
+ "updateAgent": "تحديث معلومات المساعد",
+ "upload": {
+ "actionTooltip": "تحميل الصورة",
+ "dragDesc": "اسحب الملفات إلى هنا، يدعم تحميل عدة صور. اضغط على Shift لإرسال الصور مباشرة",
+ "dragTitle": "تحميل الصورة"
+ }
+}
diff --git a/locales/ar/common.json b/locales/ar/common.json
new file mode 100644
index 00000000..ad94e122
--- /dev/null
+++ b/locales/ar/common.json
@@ -0,0 +1,114 @@
+{
+ "about": "حول",
+ "advanceSettings": "إعدادات متقدمة",
+ "agentMaxToken": "أقصى طول للجلسة",
+ "agentModel": "النموذج",
+ "agentProfile": "ملف المساعد",
+ "appInitializing": "جاري تهيئة LobeChat، يرجى الانتظار ...",
+ "archive": "أرشيف",
+ "autoGenerate": "توليد تلقائي",
+ "autoGenerateTooltip": "إكمال تلقائي بناءً على الكلمات المقترحة لوصف المساعد",
+ "cancel": "إلغاء",
+ "changelog": "سجل التغييرات",
+ "close": "إغلاق",
+ "confirmRemoveSessionItemAlert": "سيتم حذف هذا المساعد قريبًا، وبمجرد الحذف لن يمكن استعادته، يرجى تأكيد الإجراء",
+ "copy": "نسخ",
+ "copySuccess": "تم النسخ بنجاح",
+ "defaultAgent": "مساعد افتراضي",
+ "defaultSession": "جلسة افتراضية",
+ "delete": "حذف",
+ "duplicate": "إنشاء نسخة",
+ "edit": "تحرير",
+ "export": "تصدير الإعدادات",
+ "exportType": {
+ "agent": "تصدير إعدادات المساعد",
+ "agentWithMessage": "تصدير المساعد والرسائل",
+ "all": "تصدير الإعدادات العامة وجميع بيانات المساعد",
+ "allAgent": "تصدير جميع إعدادات المساعد",
+ "allAgentWithMessage": "تصدير جميع المساعدين والرسائل",
+ "globalSetting": "تصدير الإعدادات العامة"
+ },
+ "feedback": "تقديم ملاحظات",
+ "historyRange": "نطاق التاريخ",
+ "import": "استيراد الإعدادات",
+ "importModal": {
+ "finish": {
+ "onlySettings": "تم استيراد إعدادات النظام بنجاح",
+ "start": "ابدأ الاستخدام",
+ "subTitle": "تم استيراد البيانات بنجاح، وقت الاستيراد {{duration}} ثانية. تفاصيل الاستيراد كالتالي:",
+ "title": "اكتمال عملية الاستيراد"
+ },
+ "loading": "جاري استيراد البيانات، يرجى الانتظار...",
+ "result": {
+ "added": "تمت الإضافة بنجاح",
+ "errors": "حدثت أخطاء أثناء الاستيراد",
+ "messages": "الرسائل",
+ "sessions": "الجلسات",
+ "skips": "التخطيات",
+ "topics": "المواضيع",
+ "type": "نوع البيانات"
+ },
+ "title": "استيراد البيانات"
+ },
+ "lang": {
+ "bn": "البنغالية",
+ "cs-CZ": "التشيكية",
+ "da-DK": "الدنماركية",
+ "de-DE": "الألمانية",
+ "el-GR": "اليونانية",
+ "en": "الإنجليزية",
+ "en-US": "الإنجليزية",
+ "es-ES": "الإسبانية",
+ "fi-FI": "الفنلندية",
+ "fr-FR": "الفرنسية",
+ "hi-IN": "الهندية",
+ "hu-HU": "الهنغارية",
+ "id-ID": "الإندونيسية",
+ "it-IT": "الإيطالية",
+ "ja-JP": "اليابانية",
+ "ko-KR": "الكورية",
+ "nl-NL": "الهولندية",
+ "no-NO": "النرويجية",
+ "pl-PL": "البولندية",
+ "pt-BR": "البرتغالية",
+ "pt-PT": "البرتغالية",
+ "ro-RO": "الرومانية",
+ "ru-RU": "الروسية",
+ "sk-SK": "السلوفاكية",
+ "sr-RS": "الصربية",
+ "sv-SE": "السويدية",
+ "th-TH": "التايلاندية",
+ "tr-TR": "التركية",
+ "uk-UA": "الأوكرانية",
+ "vi-VN": "الفيتنامية",
+ "zh": "الصينية المبسطة",
+ "zh-CN": "الصينية المبسطة",
+ "zh-TW": "الصينية التقليدية"
+ },
+ "layoutInitializing": "جاري تحميل التخطيط...",
+ "noDescription": "لا توجد وصف",
+ "ok": "موافق",
+ "password": "كلمة المرور",
+ "pin": "تثبيت في الأعلى",
+ "pinOff": "إلغاء التثبيت",
+ "regenerate": "إعادة توليد",
+ "rename": "إعادة تسمية",
+ "reset": "إعادة تعيين",
+ "retry": "إعادة المحاولة",
+ "send": "إرسال",
+ "setting": "الإعدادات",
+ "share": "مشاركة",
+ "stop": "إيقاف",
+ "tab": {
+ "chat": "الدردشة",
+ "market": "الاكتشاف",
+ "setting": "الإعدادات"
+ },
+ "temp": "مؤقت",
+ "updateAgent": "تحديث معلومات الوكيل",
+ "upgradeVersion": {
+ "action": "ترقية",
+ "hasNew": "يوجد تحديث متاح",
+ "newVersion": "هناك إصدار جديد متاح: {{version}}"
+ }
+}
diff --git a/locales/ar/error.json b/locales/ar/error.json
new file mode 100644
index 00000000..d4933c2f
--- /dev/null
+++ b/locales/ar/error.json
@@ -0,0 +1,72 @@
+{
+ "pluginSettings": {
+ "desc": "أكمل الإعدادات التالية لبدء استخدام هذا المكون الإضافي",
+ "title": "تكوين مكون الإضافة {{name}}"
+ },
+ "response": {
+ "400": "عذرًا، الخادم غير قادر على فهم طلبك، يرجى التحقق من صحة معلمات الطلب الخاصة بك",
+ "401": "عذرًا، رفض الخادم طلبك، قد يكون بسبب صلاحياتك غير الكافية أو عدم تقديم التحقق من الهوية الصالحة",
+ "403": "عذرًا، رفض الخادم طلبك، ليس لديك إذن للوصول إلى هذا المحتوى",
+ "404": "عذرًا، الخادم لا يمكنه العثور على الصفحة أو المورد المطلوب، يرجى التحقق من صحة عنوان URL الخاص بك",
+ "405": "عذرًا، الخادم لا يدعم طريقة الطلب المستخدمة، يرجى التحقق من صحة طريقة الطلب الخاصة بك",
+ "406": "عذرًا، الخادم غير قادر على استكمال الطلب وفقًا لخصائص المحتوى التي طلبتها",
+ "407": "عذرًا، تحتاج إلى مصادقة الوكيل لمتابعة هذا الطلب",
+ "408": "عذرًا، تجاوز الخادم الوقت المحدد في انتظار الطلب، يرجى التحقق من اتصالك بالشبكة والمحاولة مرة أخرى",
+ "409": "عذرًا، يوجد تضارب في الطلب الذي لا يمكن معالجته، قد يكون بسبب عدم توافق حالة المورد مع الطلب",
+ "410": "عذرًا، تمت إزالة المورد الذي طلبته بشكل دائم ولا يمكن العثور عليه",
+ "411": "عذرًا، الخادم غير قادر على معالجة الطلب الذي لا يحتوي على طول محتوى صالح",
+ "412": "عذرًا، لم يتم تلبية شروط الخادم الجانبية لطلبك ولا يمكن استكمال الطلب",
+ "413": "عذرًا، حجم بيانات طلبك كبير جدًا والخادم غير قادر على معالجته",
+ "414": "عذرًا، طول عنوان URI الخاص بطلبك كبير جدًا والخادم غير قادر على معالجته",
+ "415": "عذرًا، الخادم غير قادر على معالجة تنسيق الوسائط المرفقة بالطلب",
+ "416": "عذرًا، الخادم غير قادر على تلبية نطاق الطلب الذي قدمته",
+ "417": "عذرًا، الخادم غير قادر على تلبية قيم توقعاتك",
+ "422": "عذرًا، الطلب لديه تنسيق صحيح، ولكن بسبب وجود أخطاء دلالية، لا يمكن الاستجابة",
+ "423": "عذرًا، تم قفل المورد الذي طلبته",
+ "424": "عذرًا، بسبب فشل الطلب السابق، لا يمكن استكمال الطلب الحالي",
+ "426": "عذرًا، يتطلب الخادم ترقية عميلك إلى إصدار بروتوكول أعلى",
+ "428": "عذرًا، يتطلب الخادم شروطًا مسبقة، ويجب أن يحتوي طلبك على رؤوس الشروط الصحيحة",
+ "429": "عذرًا، طلبك كثير جدًا والخادم متعب قليلاً، يرجى المحاولة مرة أخرى لاحقًا",
+ "431": "عذرًا، حقول رأس الطلب الخاصة بك كبيرة جدًا والخادم غير قادر على معالجتها",
+ "451": "عذرًا، بسبب الأسباب القانونية، يرفض الخادم توفير هذا المورد",
+ "500": "عذرًا، يبدو أن الخادم واجه بعض الصعوبات ولا يمكنه حاليًا استكمال طلبك، يرجى المحاولة مرة أخرى لاحقًا",
+ "502": "عذرًا، يبدو أن الخادم قد ضل الطريق ولا يمكنه حاليًا تقديم الخدمة، يرجى المحاولة مرة أخرى لاحقًا",
+ "503": "عذرًا، الخادم غير قادر حاليًا على معالجة طلبك، قد يكون بسبب الحمل الزائد أو الصيانة الجارية، يرجى المحاولة مرة أخرى لاحقًا",
+ "504": "عذرًا، الخادم لم ينتظر ردًا من الخادم الأصلي، يرجى المحاولة مرة أخرى لاحقًا",
+ "InvalidAccessCode": "كلمة المرور غير صحيحة أو فارغة، يرجى إدخال كلمة مرور الوصول الصحيحة أو إضافة مفتاح API الخاص بك",
+ "NoAPIKey": "مفتاح API الخاص بـ OpenAI فارغ، يرجى إضافة مفتاح API الخاص بـ OpenAI",
+ "OpenAIBizError": "حدث خطأ في طلب خدمة OpenAI، يرجى التحقق من المعلومات أدناه وإعادة المحاولة",
+ "PluginApiNotFound": "عذرًا، لا يوجد API للإضافة في وصف الإضافة، يرجى التحقق من تطابق طريقة الطلب الخاصة بك مع API الوصف",
+ "PluginApiParamsError": "عذرًا، فشلت التحقق من صحة معلمات الطلب للإضافة، يرجى التحقق من تطابق المعلمات مع معلومات الوصف",
+ "PluginGatewayError": "عذرًا، حدث خطأ في بوابة الإضافة، يرجى التحقق من تكوين بوابة الإضافة",
+ "PluginManifestInvalid": "عذرًا، فشلت التحقق من صحة وصف الإضافة، يرجى التحقق من تنسيق وصف الإضافة",
+ "PluginManifestNotFound": "عذرًا، لم يتم العثور على وصف الإضافة (manifest.json) في الخادم، يرجى التحقق من صحة عنوان ملف وصف الإضافة",
+ "PluginMarketIndexInvalid": "عذرًا، فشلت التحقق من صحة فهرس الإضافات، يرجى التحقق من تنسيق ملف الفهرس",
+ "PluginMarketIndexNotFound": "عذرًا، لم يتم العثور على فهرس الإضافات في الخادم، يرجى التحقق من صحة عنوان الفهرس",
+ "PluginMetaInvalid": "عذرًا، فشلت التحقق من صحة بيانات الإضافة، يرجى التحقق من تنسيق بيانات الإضافة",
+ "PluginMetaNotFound": "عذرًا، لم يتم العثور على معلومات تكوين الإضافة في الفهرس",
+ "PluginOpenApiInitError": "عذرًا، فشل تهيئة عميل OpenAPI، يرجى التحقق من معلومات تكوين OpenAPI",
+ "PluginServerError": "خطأ في استجابة الخادم لطلب الإضافة، يرجى التحقق من ملف وصف الإضافة وتكوين الإضافة وتنفيذ الخادم وفقًا لمعلومات الخطأ أدناه",
+ "PluginSettingsInvalid": "تحتاج هذه الإضافة إلى تكوين صحيح قبل الاستخدام، يرجى التحقق من صحة تكوينك"
+ },
+ "stt": {
+ "responseError": "فشل طلب الخدمة، يرجى التحقق من الإعدادات أو إعادة المحاولة"
+ },
+ "tts": {
+ "responseError": "فشل طلب الخدمة، يرجى التحقق من الإعدادات أو إعادة المحاولة"
+ },
+ "unlock": {
+ "apikey": {
+ "addProxyUrl": "إضافة عنوان الوكيل لـ OpenAI (اختياري)",
+ "description": "قم بإدخال مفتاح OpenAI API الخاص بك لبدء الجلسة. لن يتم تسجيل مفتاح الخاص بك من قبل التطبيق",
+ "title": "استخدام مفتاح API مخصص"
+ },
+ "closeMessage": "إغلاق الرسالة",
+ "confirm": "تأكيد وإعادة المحاولة",
+ "password": {
+ "description": "قام المسؤول بتشفير التطبيق، قم بإدخال كلمة مرور التطبيق لفتح التطبيق. يتعين إدخال كلمة المرور مرة واحدة فقط",
+ "placeholder": "الرجاء إدخال كلمة المرور",
+ "title": "إدخال كلمة المرور لفتح التطبيق"
+ }
+ }
+}
diff --git a/locales/ar/market.json b/locales/ar/market.json
new file mode 100644
index 00000000..db0a9d40
--- /dev/null
+++ b/locales/ar/market.json
@@ -0,0 +1,30 @@
+{
+ "addAgent": "إضافة وكيل",
+ "guide": {
+ "func1": {
+ "desc1": "في نافذة الدردشة، انتقل إلى صفحة إعدادات الوكيل التي ترغب في تقديمها من الزاوية اليمنى العلوية.",
+ "desc2": "انقر فوق زر تقديم إلى سوق الوكلاء في الزاوية اليمنى العلوية.",
+ "tag": "الطريقة الأولى",
+ "title": "تقديم عبر LobeChat"
+ },
+ "func2": {
+ "button": "انتقل إلى مستودع وكلاء Github",
+ "desc": "إذا كنت ترغب في إضافة الوكيل إلى الفهرس، يرجى استخدام agent-template.json أو agent-template-full.json لإنشاء إدخال في دليل plugins، وكتابة وصف موجز ووضع علامات بشكل مناسب، ثم إنشاء طلب سحب.",
+ "tag": "الطريقة الثانية",
+ "title": "تقديم عبر Github"
+ }
+ },
+ "search": {
+ "placeholder": "ابحث عن اسم الوكيل أو وصفه أو كلمات رئيسية..."
+ },
+ "sidebar": {
+ "comment": "منطقة النقاش",
+ "prompt": "كلمة تلميح",
+ "title": "تفاصيل الوكيل"
+ },
+ "submitAgent": "تقديم الوكيل",
+ "title": {
+ "allAgents": "جميع الوكلاء",
+ "recentSubmits": "الإضافات الأخيرة"
+ }
+}
diff --git a/locales/ar/migration.json b/locales/ar/migration.json
new file mode 100644
index 00000000..281c08be
--- /dev/null
+++ b/locales/ar/migration.json
@@ -0,0 +1,45 @@
+{
+ "dbV1": {
+ "action": {
+ "clearDB": "مسح البيانات المحلية",
+ "downloadBackup": "تنزيل نسخة احتياطية للبيانات",
+ "reUpgrade": "إعادة الترقية",
+ "start": "ابدأ الاستخدام",
+ "upgrade": "ترقية فورية"
+ },
+ "clear": {
+ "confirm": "سيتم مسح البيانات المحلية (دون تأثير على الإعدادات العامة)، يرجى التأكد من تنزيل نسخة احتياطية للبيانات."
+ },
+ "description": "في الإصدار الجديد، تم تحقيق قفزة هائلة في تخزين بيانات LobeChat. لذا نحتاج إلى ترقية البيانات القديمة لتوفير تجربة استخدام أفضل لك.",
+ "features": {
+ "capability": {
+ "desc": "بناءً على تقنية IndexedDB، يمكنها استيعاب رسائل المحادثات طوال حياتك",
+ "title": "سعة كبيرة"
+ },
+ "performance": {
+ "desc": "ملايين الرسائل مفهرسة تلقائيًا، استجابة فورية للاستعلامات بالميلي ثانية",
+ "title": "أداء عالي"
+ },
+ "use": {
+ "desc": "دعم البحث في العناوين والوصف والعلامات ومحتوى الرسائل وحتى النصوص المترجمة، مما يعزز كفاءة البحث اليومي بشكل كبير",
+ "title": "أكثر سهولة في الاستخدام"
+ }
+ },
+ "title": "تطور بيانات LobeChat",
+ "upgrade": {
+ "error": {
+ "subTitle": "نأسف جدًا، حدث استثناء أثناء عملية ترقية قاعدة البيانات. يرجى تجربة الحلول التالية: أ. مسح البيانات المحلية ثم إعادة استيراد بيانات النسخ الاحتياطي؛ ب. انقر على زر \"إعادة الترقية\".
إذا استمرت المشكلة، يرجى <1>تقديم مشكلتك1>، سنقوم بمساعدتك في أقرب وقت ممكن",
+ "title": "فشل ترقية قاعدة البيانات"
+ },
+ "success": {
+ "subTitle": "تم ترقية قاعدة بيانات LobeChat إلى أحدث إصدار، ابدأ التجربة الآن",
+ "title": "نجاح ترقية قاعدة البيانات"
+ }
+ },
+ "upgradeTip": "من المتوقع أن تستغرق عملية الترقية حوالي 10-20 ثانية، يرجى عدم إغلاق LobeChat خلال عملية الترقية"
+ },
+ "migrateError": {
+ "missVersion": "البيانات المستوردة تفتقد رقم الإصدار، يرجى التحقق من الملف وإعادة المحاولة",
+ "noMigration": "لم يتم العثور على خطة هجرة تتوافق مع الإصدار الحالي، يرجى التحقق من رقم الإصدار وإعادة المحاولة. إذا استمرت المشكلة، يرجى تقديم ملاحظاتك"
+ }
+}
diff --git a/locales/ar/plugin.json b/locales/ar/plugin.json
new file mode 100644
index 00000000..62b75c38
--- /dev/null
+++ b/locales/ar/plugin.json
@@ -0,0 +1,166 @@
+{
+ "debug": {
+ "arguments": "متغيرات الاستدعاء",
+ "function_call": "استدعاء الدالة",
+ "off": "إيقاف التصحيح",
+ "on": "عرض معلومات استدعاء البرنامج المساعد",
+ "response": "الرد"
+ },
+ "detailModal": {
+ "info": {
+ "description": "وصف واجهة برمجة التطبيقات",
+ "name": "اسم واجهة برمجة التطبيقات"
+ },
+ "tabs": {
+ "info": "قدرات البرنامج المساعد",
+ "manifest": "ملف التثبيت",
+ "settings": "الإعدادات"
+ },
+ "title": "تفاصيل البرنامج المساعد"
+ },
+ "dev": {
+ "confirmDeleteDevPlugin": "سيتم حذف البرنامج المساعد المحلي، وبمجرد الحذف لن يمكن استعادته، هل ترغب في حذف هذا البرنامج المساعد؟",
+ "customParams": {
+ "useProxy": {
+ "label": "تثبيت عبر الوكيل (في حالة حدوث أخطاء الوصول عبر النطاقات المتقاطعة، يمكنك تجربة تفعيل هذا الخيار ثم إعادة التثبيت)"
+ }
+ },
+ "deleteSuccess": "تم حذف البرنامج المساعد بنجاح",
+ "manifest": {
+ "identifier": {
+ "desc": "العلامة المميزة للبرنامج المساعد",
+ "label": "المعرف"
+ },
+ "mode": {
+ "local": "تكوين بصري",
+ "local-tooltip": "غير مدعوم مؤقتًا",
+ "url": "رابط عبر الإنترنت"
+ },
+ "name": {
+ "desc": "عنوان البرنامج المساعد",
+ "label": "العنوان",
+ "placeholder": "محرك البحث"
+ }
+ },
+ "meta": {
+ "author": {
+ "desc": "مؤلف البرنامج المساعد",
+ "label": "المؤلف"
+ },
+ "avatar": {
+ "desc": "رمز البرنامج المساعد، يمكن استخدام الرموز التعبيرية أو روابط URL",
+ "label": "الرمز"
+ },
+ "description": {
+ "desc": "وصف البرنامج المساعد",
+ "label": "الوصف",
+ "placeholder": "البحث في محركات البحث للحصول على المعلومات"
+ },
+ "formFieldRequired": "هذا الحقل مطلوب",
+ "homepage": {
+ "desc": "صفحة البداية للبرنامج المساعد",
+ "label": "الصفحة الرئيسية"
+ },
+ "identifier": {
+ "desc": "العلامة المميزة للبرنامج المساعد، سيتم التعرف عليها تلقائيًا من خلال الملف التعريفي",
+ "errorDuplicate": "تكرار العلامة المميزة مع برنامج مساعد موجود، يرجى تعديل العلامة المميزة",
+ "label": "المعرف",
+ "pattenErrorMessage": "يمكن إدخال الأحرف الإنجليزية والأرقام والرمزين - و_ فقط"
+ },
+ "manifest": {
+ "desc": "سيقوم LobeChat بتثبيت البرنامج المساعد من خلال هذا الرابط",
+ "label": "ملف وصف البرنامج المساعد (Manifest) URL",
+ "preview": "معاينة الملف التعريفي",
+ "refresh": "تحديث"
+ },
+ "title": {
+ "desc": "عنوان البرنامج المساعد",
+ "label": "العنوان",
+ "placeholder": "محرك البحث"
+ }
+ },
+ "metaConfig": "تكوين معلومات البرنامج المساعد",
+ "modalDesc": "بعد إضافة البرنامج المساعد المخصص، يمكن استخدامه للتحقق من تطوير البرنامج المساعد، كما يمكن استخدامه مباشرة في الدردشة. للحصول على معلومات حول تطوير البرنامج المساعد، يرجى الرجوع إلى <1>وثائق التطوير↗>",
+ "openai": {
+ "importUrl": "استيراد من رابط URL",
+ "schema": "مخطط"
+ },
+ "preview": {
+ "card": "معاينة عرض البرنامج المساعد",
+ "desc": "معاينة وصف البرنامج المساعد",
+ "title": "معاينة اسم البرنامج المساعد"
+ },
+ "save": "تثبيت البرنامج المساعد",
+ "saveSuccess": "تم حفظ إعدادات البرنامج المساعد بنجاح",
+ "tabs": {
+ "manifest": "قائمة وصف الوظائف (Manifest)",
+ "meta": "معلومات البرنامج المساعد"
+ },
+ "title": {
+ "create": "إضافة برنامج مساعد مخصص",
+ "edit": "تحرير برنامج مساعد مخصص"
+ },
+ "type": {
+ "lobe": "برنامج مساعد LobeChat",
+ "openai": "برنامج مساعد OpenAI"
+ },
+ "update": "تحديث",
+ "updateSuccess": "تم تحديث إعدادات البرنامج المساعد بنجاح"
+ },
+ "error": {
+ "fetchError": "فشل طلب الرابط المعطى للملف، يرجى التأكد من صحة الرابط والسماح بالوصول عبر النطاقات المختلفة",
+ "installError": "فشل تثبيت الإضافة {{name}}",
+ "manifestInvalid": "الملف غير مطابق للمواصفات، نتيجة التحقق: \n\n {{error}}",
+ "noManifest": "ملف الوصف غير موجود",
+ "openAPIInvalid": "فشل تحليل OpenAPI، الخطأ: \n\n {{error}}",
+ "reinstallError": "فشل تحديث الإضافة {{name}}",
+ "urlError": "الرابط لا يعيد محتوى بتنسيق JSON، يرجى التأكد من صحة الرابط"
+ },
+ "list": {
+ "item": {
+ "deprecated.title": "مهجور",
+ "local.config": "التكوين",
+ "local.title": "مخصص"
+ }
+ },
+ "loading": {
+ "content": "جاري استدعاء الإضافة...",
+ "plugin": "جاري تشغيل الإضافة..."
+ },
+ "pluginList": "قائمة الإضافات",
+ "plugins": {
+ "loading": "جاري فحص الأدوات...",
+ "unknown": "أداة غير معروفة"
+ },
+ "setting": "إعدادات الإضافة",
+ "settings": {
+ "indexUrl": {
+ "title": "فهرس السوق",
+ "tooltip": "غير مدعوم حاليا للتحرير عبر الإنترنت، يرجى ضبطه عند نشر المتغيرات البيئية"
+ },
+ "modalDesc": "بعد ضبط عنوان سوق الإضافات، يمكن استخدام سوق الإضافات المخصص",
+ "title": "ضبط سوق الإضافات"
+ },
+ "store": {
+ "actions": {
+ "confirmUninstall": "سيتم إلغاء تثبيت الإضافة، وسيتم مسح تكوين الإضافة، يرجى تأكيد العملية",
+ "detail": "التفاصيل",
+ "install": "تثبيت",
+ "manifest": "تحرير ملف التثبيت",
+ "settings": "الإعدادات",
+ "uninstall": "إلغاء التثبيت"
+ },
+ "communityPlugin": "مجتمع ثالث",
+ "customPlugin": "مخصص",
+ "empty": "لا توجد إضافات مثبتة حاليا",
+ "installAllPlugins": "تثبيت الكل",
+ "networkError": "فشل الحصول على متجر الإضافات، يرجى التحقق من الاتصال بالشبكة وإعادة المحاولة",
+ "placeholder": "ابحث عن اسم الإضافة أو الكلمات الرئيسية...",
+ "releasedAt": "صدر في {{createdAt}}",
+ "tabs": {
+ "all": "الكل",
+ "installed": "مثبتة"
+ },
+ "title": "متجر الإضافات"
+ }
+}
diff --git a/locales/ar/setting.json b/locales/ar/setting.json
new file mode 100644
index 00000000..2741a4bc
--- /dev/null
+++ b/locales/ar/setting.json
@@ -0,0 +1,306 @@
+{
+ "danger": {
+ "clear": {
+ "action": "مسح الآن",
+ "confirm": "هل تؤكد مسح جميع بيانات المحادثات؟",
+ "desc": "سيتم مسح جميع بيانات الجلسة بما في ذلك المساعد والملفات والرسائل والإضافات",
+ "success": "تم مسح جميع رسائل الجلسة",
+ "title": "مسح جميع رسائل الجلسة"
+ },
+ "reset": {
+ "action": "إعادة تعيين الآن",
+ "confirm": "هل تؤكد إعادة تعيين جميع الإعدادات؟",
+ "currentVersion": "الإصدار الحالي",
+ "desc": "إعادة تعيين جميع عناصر الإعدادات إلى القيم الافتراضية",
+ "title": "إعادة تعيين جميع الإعدادات"
+ }
+ },
+ "header": {
+ "global": "إعدادات عامة",
+ "session": "إعدادات الجلسة",
+ "sessionWithName": "إعدادات الجلسة · {{name}}"
+ },
+ "llm": {
+ "AzureOpenAI": {
+ "endpoint": {
+ "desc": "يمكن العثور على هذه القيمة في قسم 'المفتاح والنقطة النهائية' عند التحقق من الموارد في بوابة Azure",
+ "placeholder": "https://docs-test-001.openai.azure.com",
+ "title": "عنوان واجهة برمجة التطبيقات لـ Azure"
+ },
+ "models": {
+ "desc": "النماذج المدعومة",
+ "title": "قائمة النماذج"
+ },
+ "title": "إعدادات Azure OpenAI",
+ "token": {
+ "desc": "يمكن العثور على هذه القيمة في قسم 'المفتاح والنقطة النهائية' عند التحقق من الموارد في بوابة Azure. يمكن استخدام KEY1 أو KEY2",
+ "placeholder": "مفتاح واجهة برمجة التطبيقات لـ Azure",
+ "title": "مفتاح واجهة برمجة التطبيقات"
+ }
+ },
+ "OpenAI": {
+ "azureApiVersion": {
+ "desc": "إصدار واجهة برمجة التطبيقات لـ Azure، يتبع تنسيق YYYY-MM-DD، اطلع على [أحدث الإصدارات](https://learn.microsoft.com/zh-cn/azure/ai-services/openai/reference#chat-completions)",
+ "fetch": "الحصول على القائمة",
+ "title": "إصدار واجهة برمجة التطبيقات لـ Azure"
+ },
+ "check": {
+ "button": "فحص",
+ "desc": "اختبار مفتاح واجهة البرمجة التطبيقية وعنوان الوكيل للتأكد من ملئهما بشكل صحيح",
+ "pass": "تم الفحص بنجاح",
+ "title": "فحص الاتصال"
+ },
+ "customModelName": {
+ "desc": "إضافة نموذج مخصص، يمكن استخدام فاصلة (,) للنماذج المتعددة",
+ "placeholder": "نموذج1،نموذج2،نموذج3",
+ "title": "اسم النموذج المخصص"
+ },
+ "endpoint": {
+ "desc": "بالإضافة إلى العنوان الافتراضي، يجب أن يتضمن http(s)://",
+ "placeholder": "https://api.openai.com/v1",
+ "title": "عنوان وكيل الواجهة"
+ },
+ "models": {
+ "count": "يدعم {{count}} نموذج",
+ "desc": "النماذج المدعومة",
+ "fetch": "الحصول على قائمة النماذج",
+ "notSupport": "Azure OpenAI غير مدعوم حالياً لعرض قائمة النماذج",
+ "notSupportTip": "يجب عليك التأكد بنفسك من تطابق اسم النموذج مع اسم النشر",
+ "refetch": "الحصول على قائمة النماذج مرة أخرى",
+ "title": "قائمة النماذج"
+ },
+ "title": "إعدادات OpenAI",
+ "token": {
+ "desc": "استخدام مفتاح OpenAI الخاص بك",
+ "placeholder": "مفتاح واجهة برمجة التطبيقات لـ OpenAI",
+ "title": "مفتاح واجهة برمجة التطبيقات"
+ },
+ "useAzure": {
+ "desc": "استخدام خدمة OpenAI المقدمة من Azure",
+ "fetch": "الحصول على القائمة",
+ "serverConfig": "المسؤول قام بتكوين خدمة Azure OpenAI على الخادم، ويتم منع التبديل",
+ "title": "استخدام Azure OpenAI"
+ }
+ },
+ "waitingForMore": "يتم <1>التخطيط لتوفير1> المزيد من النماذج، ترقبوا المزيد ✨"
+ },
+ "plugin": {
+ "addTooltip": "إضافة البرنامج المساعد",
+ "clearDeprecated": "مسح البرامج المساعدة الغير صالحة",
+ "empty": "لا توجد برامج مساعدة مثبتة حاليًا، نرحب بك لزيارة <1>متجر البرامج المساعدة1> للاستكشاف",
+ "installStatus": {
+ "deprecated": "تم إلغاء التثبيت"
+ },
+ "settings": {
+ "hint": "يرجى ملء الإعدادات التالية وفقًا للوصف",
+ "title": "إعدادات البرنامج المساعد {{id}}",
+ "tooltip": "إعدادات البرنامج المساعد"
+ },
+ "store": "متجر البرامج المساعد"
+ },
+ "settingAgent": {
+ "avatar": {
+ "title": "الصورة الرمزية"
+ },
+ "backgroundColor": {
+ "title": "لون الخلفية"
+ },
+ "description": {
+ "placeholder": "الرجاء إدخال وصف المساعد",
+ "title": "وصف المساعد"
+ },
+ "name": {
+ "placeholder": "الرجاء إدخال اسم المساعد",
+ "title": "الاسم"
+ },
+ "prompt": {
+ "placeholder": "الرجاء إدخال كلمة الإشارة للشخصية",
+ "title": "ضبط الشخصية"
+ },
+ "tag": {
+ "placeholder": "الرجاء إدخال العلامة",
+ "title": "العلامة"
+ },
+ "title": "معلومات المساعد"
+ },
+ "settingChat": {
+ "autoCreateTopicThreshold": {
+ "desc": "عند تجاوز عدد الرسائل الحالي هذا القيمة، سيتم إنشاء موضوع تلقائيًا",
+ "title": "عتبة إنشاء الموضوع التلقائي"
+ },
+ "chatStyleType": {
+ "title": "نوع نافذة الدردشة",
+ "type": {
+ "chat": "نمط المحادثة",
+ "docs": "نمط الوثائق"
+ }
+ },
+ "compressThreshold": {
+ "desc": "عندما يتجاوز عدد الرسائل التاريخية غير المضغوطة هذه القيمة، سيتم ضغطها",
+ "title": "عتبة ضغط طول الرسائل التاريخية"
+ },
+ "enableAutoCreateTopic": {
+ "desc": "هل يجب إنشاء موضوع تلقائيًا أثناء الدردشة، يسري ذلك فقط في المواضيع المؤقتة",
+ "title": "تمكين إنشاء الموضوع تلقائيًا"
+ },
+ "enableCompressThreshold": {
+ "title": "هل تريد تمكين عتبة ضغط طول الرسائل التاريخية"
+ },
+ "enableHistoryCount": {
+ "alias": "غير محدود",
+ "limited": "يحتوي فقط على {{number}} رسالة محادثة",
+ "title": "تحديد عدد الرسائل التاريخية",
+ "unlimited": "غير محدود"
+ },
+ "historyCount": {
+ "desc": "عدد الرسائل التي يتم إرفاقها في كل طلب (تشمل الأسئلة والأجوبة الجديدة. يُحسب كل سؤال وجواب كرسالة واحدة)",
+ "title": "عدد الرسائل المرفقة"
+ },
+ "inputTemplate": {
+ "desc": "سيتم ملء أحدث رسالة من المستخدم في هذا القالب",
+ "placeholder": "القالب المُعالج مسبقًا {{text}} سيتم استبداله بالمعلومات المُدخلة في الوقت الحقيقي",
+ "title": "معالجة مُدخلات المستخدم"
+ },
+ "title": "إعدادات الدردشة"
+ },
+ "settingModel": {
+ "enableMaxTokens": {
+ "title": "تمكين الحد الأقصى للردود"
+ },
+ "frequencyPenalty": {
+ "desc": "كلما زادت القيمة، زاد احتمال تقليل تكرار الكلمات",
+ "title": "عقوبة التكرار"
+ },
+ "maxTokens": {
+ "desc": "عدد الرموز الأقصى المستخدمة في التفاعل الواحد",
+ "title": "الحد الأقصى للردود"
+ },
+ "model": {
+ "desc": "نموذج ChatGPT",
+ "list": {
+ "gpt-3.5-turbo": "GPT 3.5",
+ "gpt-3.5-turbo-16k": "GPT 3.5 (16K)",
+ "gpt-4": "GPT 4",
+ "gpt-4-32k": "GPT 4 (32K)"
+ },
+ "title": "النموذج"
+ },
+ "presencePenalty": {
+ "desc": "كلما زادت القيمة، زاد احتمال التوسع في مواضيع جديدة",
+ "title": "جديد الحديث"
+ },
+ "temperature": {
+ "desc": "كلما زادت القيمة، زادت الردود عشوائية أكثر",
+ "title": "التباين",
+ "titleWithValue": "التباين {{value}}"
+ },
+ "title": "إعدادات النموذج",
+ "topP": {
+ "desc": "مشابه للتباين ولكن لا يجب تغييره مع التباين",
+ "title": "العينة الأساسية"
+ }
+ },
+ "settingPlugin": {
+ "title": "قائمة الإضافات"
+ },
+ "settingSystem": {
+ "accessCode": {
+ "desc": "قام المسؤول بتمكين الوصول المشفر",
+ "placeholder": "الرجاء إدخال كلمة المرور",
+ "title": "كلمة المرور"
+ },
+ "title": "إعدادات النظام"
+ },
+ "settingTTS": {
+ "openai": {
+ "sttModel": "نموذج تحويل النص إلى كلام من OpenAI",
+ "ttsModel": "نموذج توليد الكلام من OpenAI"
+ },
+ "showAllLocaleVoice": {
+ "desc": "إذا تم إيقافه، سيتم عرض مصادر الصوت الخاصة باللغة الحالية فقط",
+ "title": "عرض جميع مصادر الصوت للغات"
+ },
+ "stt": "إعدادات التحويل من الصوت إلى نص",
+ "sttAutoStop": {
+ "desc": "عند الإيقاف، لن يتم إيقاف تحويل الصوت إلى نص تلقائيًا، وسيتطلب الأمر النقر على زر الإيقاف يدويًا",
+ "title": "إيقاف تحويل الصوت إلى نص تلقائيًا"
+ },
+ "sttLocale": {
+ "desc": "لغة الصوت المدخلة، يمكن أن يساعد هذا الخيار في زيادة دقة تحويل الصوت إلى نص",
+ "title": "لغة تحويل الصوت إلى نص"
+ },
+ "sttService": {
+ "desc": "حيث يكون المتصفح هو خدمة التحويل الصوتي الأصلية",
+ "title": "خدمة تحويل الصوت إلى نص"
+ },
+ "title": "خدمة الصوت",
+ "tts": "إعدادات توليد الكلام",
+ "ttsService": {
+ "desc": "إذا كنت تستخدم خدمة توليد الكلام من OpenAI، يجب التأكد من تمكين خدمة نموذج OpenAI",
+ "title": "خدمة توليد الكلام"
+ },
+ "voice": {
+ "desc": "حدد صوتًا للمساعد الحالي، تختلف مصادر الصوت المدعومة بحسب خدمة توليد الكلام",
+ "preview": "معاينة الصوت",
+ "title": "مصدر توليد الكلام"
+ }
+ },
+ "settingTheme": {
+ "avatar": {
+ "title": "الصورة الرمزية"
+ },
+ "fontSize": {
+ "desc": "حجم الخط لمحتوى المحادثة",
+ "marks": {
+ "large": "كبير",
+ "normal": "عادي",
+ "small": "صغير"
+ },
+ "title": "حجم الخط"
+ },
+ "lang": {
+ "autoMode": "متابعة النظام",
+ "title": "اللغة"
+ },
+ "neutralColor": {
+ "desc": "تخصيص درجات اللون الرمادي للاتجاهات المختلفة",
+ "title": "اللون الأحادي"
+ },
+ "primaryColor": {
+ "desc": "تخصيص لون السمة الرئيسي",
+ "title": "لون السمة"
+ },
+ "themeMode": {
+ "auto": "تلقائي",
+ "dark": "داكن",
+ "light": "فاتح",
+ "title": "السمة"
+ },
+ "title": "إعدادات السمة"
+ },
+ "submitAgentModal": {
+ "button": "تقديم المساعد",
+ "identifier": "معرف المساعد",
+ "metaMiss": "يرجى استكمال معلومات المساعد قبل التقديم، يجب أن تتضمن الاسم والوصف والعلامة",
+ "placeholder": "الرجاء إدخال معرف المساعد، يجب أن يكون فريدًا، مثل تطوير الويب",
+ "tooltips": "مشاركة في سوق المساعدين"
+ },
+ "tab": {
+ "agent": "المساعد الافتراضي",
+ "common": "إعدادات عامة",
+ "llm": "نموذج اللغة",
+ "tts": "خدمة الكلام"
+ },
+ "tools": {
+ "builtins": {
+ "groupName": "الامتدادات المدمجة"
+ },
+ "plugins": {
+ "enabled": "ممكّنة {{num}}",
+ "groupName": "الإضافات",
+ "noEnabled": "لا توجد إضافات ممكّنة حاليًا",
+ "store": "متجر الإضافات"
+ },
+ "title": "أدوات الامتداد"
+ }
+}
diff --git a/locales/ar/tool.json b/locales/ar/tool.json
new file mode 100644
index 00000000..a322c401
--- /dev/null
+++ b/locales/ar/tool.json
@@ -0,0 +1,9 @@
+{
+ "dalle": {
+ "autoGenerate": "توليد تلقائي",
+ "downloading": "صلاحية روابط الصور المُولَّدة بواسطة DallE3 تدوم ساعة واحدة فقط، يتم تحميل الصور إلى الجهاز المحلي...",
+ "generate": "توليد",
+ "generating": "جارٍ التوليد...",
+ "images": "الصور:"
+ }
+}
diff --git a/locales/ar/welcome.json b/locales/ar/welcome.json
new file mode 100644
index 00000000..fbe2d2af
--- /dev/null
+++ b/locales/ar/welcome.json
@@ -0,0 +1,14 @@
+{
+ "button": {
+ "import": "استيراد التكوين",
+ "start": "ابدأ الآن"
+ },
+ "header": "مرحبًا بكم في الاستخدام",
+ "pickAgent": "أو اختيار قالب مساعد من القائمة التالية",
+ "skip": "تخطى الإنشاء",
+ "slogan": {
+ "desc1": "قم بتشغيل عقلك الجماعي وأشعل شرارة التفكير. مساعدك الذكي، دائمًا موجود.",
+ "desc2": "أنشئ مساعدك الأول ولنبدأ!",
+ "title": "امنح نفسك عقلاً أذكى"
+ }
+}
diff --git a/package.json b/package.json
index 2ffbeb76..d086d086 100644
--- a/package.json
+++ b/package.json
@@ -117,6 +117,7 @@
"remark": "^14",
"remark-gfm": "^3",
"remark-html": "^15",
+ "rtl-detect": "^1.1.2",
"semver": "^7",
"sharp": "0.33.1",
"swr": "^2",
@@ -148,6 +149,7 @@
"@types/node": "^20",
"@types/react": "^18",
"@types/react-dom": "^18",
+ "@types/rtl-detect": "^1.0.3",
"@types/semver": "^7",
"@types/systemjs": "^6",
"@types/ua-parser-js": "^0.7",
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index 16eda62b..071d2450 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -1,6 +1,7 @@
import { Viewport } from 'next';
import { cookies } from 'next/headers';
import { PropsWithChildren } from 'react';
+import { isRtlLang } from 'rtl-detect';
import Analytics from '@/components/Analytics';
import { DEFAULT_LANG, LOBE_LOCALE_COOKIE } from '@/const/locale';
@@ -20,9 +21,9 @@ const RootLayout = ({ children }: PropsWithChildren) => {
const neutralColor = cookieStore.get(LOBE_THEME_NEUTRAL_COLOR);
const primaryColor = cookieStore.get(LOBE_THEME_PRIMARY_COLOR);
const lang = cookieStore.get(LOBE_LOCALE_COOKIE);
-
+ const direction = isRtlLang(lang?.value || DEFAULT_LANG) ? 'rtl' : 'ltr';
return (
-
+