From a325ef915d46d317b14b79836988ccbc8da84fce Mon Sep 17 00:00:00 2001 From: Ayman Mustafa <84941140+MEClouds@users.noreply.github.com> Date: Mon, 15 Jan 2024 18:27:24 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=20adding=20Arabic=20Language?= =?UTF-8?q?=20Support=20(#1049)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * :globe_with_meridians: feat(lang): Add Arabic language support * :globe_with_meridians: feat(lang): Add Arabic to LocaleOptions & fix RTL direction * :globe_with_meridians: feat(lang): Add Arabic to LocaleOptions & fix RTL direction * :art: style(lang): Improve RTL support and use native Arabic label --- .i18nrc.js | 1 + locales/ar/chat.json | 96 +++++++++++ locales/ar/common.json | 114 +++++++++++++ locales/ar/error.json | 72 ++++++++ locales/ar/market.json | 30 ++++ locales/ar/migration.json | 45 +++++ locales/ar/plugin.json | 166 ++++++++++++++++++ locales/ar/setting.json | 306 ++++++++++++++++++++++++++++++++++ locales/ar/tool.json | 9 + locales/ar/welcome.json | 14 ++ package.json | 2 + src/app/layout.tsx | 5 +- src/locales/create.ts | 9 +- src/locales/default/common.ts | 1 + src/locales/resources.ts | 5 + 15 files changed, 872 insertions(+), 3 deletions(-) create mode 100644 locales/ar/chat.json create mode 100644 locales/ar/common.json create mode 100644 locales/ar/error.json create mode 100644 locales/ar/market.json create mode 100644 locales/ar/migration.json create mode 100644 locales/ar/plugin.json create mode 100644 locales/ar/setting.json create mode 100644 locales/ar/tool.json create mode 100644 locales/ar/welcome.json 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>تقديم مشكلتك، سنقوم بمساعدتك في أقرب وقت ممكن", + "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>التخطيط لتوفير المزيد من النماذج، ترقبوا المزيد ✨" + }, + "plugin": { + "addTooltip": "إضافة البرنامج المساعد", + "clearDeprecated": "مسح البرامج المساعدة الغير صالحة", + "empty": "لا توجد برامج مساعدة مثبتة حاليًا، نرحب بك لزيارة <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 ( - + { return import(`@/../locales/${normalizeLocale(lng)}/${ns}.json`); }), ); - + // Dynamically set HTML direction on language change + instance.on('languageChanged', (lng) => { + if (typeof window !== 'undefined') { + const direction = isRtlLang(lng) ? 'rtl' : 'ltr'; + document.documentElement.dir = direction; + } + }); return { init: () => instance.init({ diff --git a/src/locales/default/common.ts b/src/locales/default/common.ts index 3d13d553..6fc7b796 100644 --- a/src/locales/default/common.ts +++ b/src/locales/default/common.ts @@ -51,6 +51,7 @@ export default { title: '导入数据', }, lang: { + 'ar': '阿拉伯语', 'bn': '孟加拉语', 'cs-CZ': '捷克语', 'da-DK': '丹麦语', diff --git a/src/locales/resources.ts b/src/locales/resources.ts index 640162dc..fa496213 100644 --- a/src/locales/resources.ts +++ b/src/locales/resources.ts @@ -1,6 +1,7 @@ import resources from './default'; export const locales = [ + 'ar', 'de-DE', 'en-US', 'es-ES', @@ -41,6 +42,10 @@ type LocaleOptions = { }[]; export const localeOptions: LocaleOptions = [ + { + label: 'العربية', + value: 'ar', + }, { label: '简体中文', value: 'zh-CN',