From 28fa6a48d159657b778d8790d39e72369c6bada2 Mon Sep 17 00:00:00 2001 From: SKJ Date: Mon, 3 Feb 2025 07:56:18 +0000 Subject: [PATCH 1/2] Add Arabic translations and support for Arabic language in i18n configuration --- app/frontend/src/i18n/config.ts | 8 +- app/frontend/src/locales/ar/translation.json | 140 +++++++++++++++++++ 2 files changed, 147 insertions(+), 1 deletion(-) create mode 100644 app/frontend/src/locales/ar/translation.json diff --git a/app/frontend/src/i18n/config.ts b/app/frontend/src/i18n/config.ts index daf1beb341..f035036db2 100644 --- a/app/frontend/src/i18n/config.ts +++ b/app/frontend/src/i18n/config.ts @@ -11,6 +11,7 @@ import jaTranslation from "../locales/ja/translation.json"; import nlTranslation from "../locales/nl/translation.json"; import ptBRTranslation from "../locales/ptBR/translation.json"; import trTranslation from "../locales/tr/translation.json"; +import arTranslation from "../locales/ar/translation.json"; export const supportedLngs: { [key: string]: { name: string; locale: string } } = { da: { @@ -44,6 +45,10 @@ export const supportedLngs: { [key: string]: { name: string; locale: string } } tr: { name: "Türkçe", locale: "tr-TR" + }, + ar: { + name: "العربية", + locale: "ar-AR" } }; @@ -62,7 +67,8 @@ i18next ja: { translation: jaTranslation }, nl: { translation: nlTranslation }, ptBR: { translation: ptBRTranslation }, - tr: { translation: trTranslation } + tr: { translation: trTranslation }, + ar: { translation: arTranslation } }, fallbackLng: "en", supportedLngs: Object.keys(supportedLngs), diff --git a/app/frontend/src/locales/ar/translation.json b/app/frontend/src/locales/ar/translation.json new file mode 100644 index 0000000000..a81fbf025e --- /dev/null +++ b/app/frontend/src/locales/ar/translation.json @@ -0,0 +1,140 @@ +{ + "pageTitle": "أزور أوبن أي آي + بحث الذكاء الاصطناعي", + "headerTitle": "أزور أوبن أي آي + بحث الذكاء الاصطناعي", + "chat": "دردشة", + "qa": "اطرح سؤالاً", + "login": "تسجيل الدخول", + "logout": "تسجيل الخروج", + "clearChat": "مسح الدردشة", + "history": { + "chatHistory": "سجل الدردشة", + "openChatHistory": "فتح سجل الدردشة", + "noHistory": "لا يوجد سجل دردشة", + "deleteModalTitle": "حذف سجل الدردشة", + "deleteModalDescription": "لا يمكن التراجع عن هذا الإجراء. هل تريد حذف سجل الدردشة؟", + "deleteLabel": "حذف", + "cancelLabel": "إلغاء", + "today": "اليوم", + "yesterday": "أمس", + "last7days": "آخر 7 أيام", + "last30days": "آخر 30 يومًا" + }, + "upload": { + "fileLabel": "رفع ملف:", + "uploadedFilesLabel": "الملفات المرفوعة سابقاً:", + "noFilesUploaded": "لم يتم رفع أي ملفات بعد", + "loading": "جار التحميل...", + "manageFileUploads": "إدارة رفع الملفات", + "uploadingFiles": "جاري رفع الملفات...", + "uploadedFileError": "خطأ في رفع الملف - يرجى المحاولة مرة أخرى أو الاتصال بالمسؤول.", + "deleteFile": "حذف الملف", + "deletingFile": "جار حذف الملف...", + "errorDeleting": "خطأ في الحذف.", + "fileDeleted": "تم حذف الملف" + }, + "developerSettings": "إعدادات المطور", + "chatEmptyStateTitle": "دردش مع بياناتك", + "chatEmptyStateSubtitle": "اطرح أي سؤال أو جرب مثالاً", + "defaultExamples": { + "1": "ما الذي يتضمنه خطة Northwind Health Plus الخاصة بي والذي لا يتضمنه الخطة القياسية؟", + "2": "ماذا يحدث خلال تقييم الأداء؟", + "3": "ما الذي يقوم به مدير المنتج؟", + "placeholder": "اكتب سؤالاً جديداً (مثلاً: هل تغطي خطتي فحوصات العين السنوية؟)" + }, + "askTitle": "اطرح على بياناتك", + "gpt4vExamples": { + "1": "قارن بين تأثير أسعار الفائدة والناتج المحلي الإجمالي في الأسواق المالية.", + "2": "ما هو الاتجاه المتوقع لمؤشر S&P 500 خلال السنوات الخمس القادمة؟ قارن ذلك بالأداء السابق للمؤشر.", + "3": "هل يمكنك تحديد أي علاقة بين أسعار النفط واتجاهات سوق الأسهم؟", + "placeholder": "مثال: هل تغطي خطتي فحوصات العين السنوية؟" + }, + "generatingAnswer": "جاري توليد الإجابة", + "citationWithColon": "الاقتباس:", + "followupQuestions": "أسئلة متابعة:", + "tooltips": { + "submitQuestion": "إرسال السؤال", + "askWithVoice": "اطرح السؤال بالصوت", + "stopRecording": "إيقاف تسجيل السؤال", + "showThoughtProcess": "عرض مسار التفكير", + "showSupportingContent": "عرض المحتوى الداعم", + "speakAnswer": "نطق الإجابة", + "info": "معلومات", + "save": "حفظ", + "copy": "نسخ", + "copied": "تم النسخ!" + }, + "headerTexts": { + "thoughtProcess": "مسار التفكير", + "supportingContent": "المحتوى الداعم", + "citation": "الاقتباس" + }, + "labels": { + "toggleMenu": "تبديل القائمة", + "languagePicker": "اختر لغتك", + "headerText": "تكوين توليد الإجابة", + "closeButton": "إغلاق", + "promptTemplate": "تجاوز قالب التعليمات", + "temperature": "درجة الحرارة", + "seed": "البذرة", + "minimumSearchScore": "الحد الأدنى لنقاط البحث", + "minimumRerankerScore": "الحد الأدنى لنقاط إعادة الترتيب", + "retrieveCount": "استرجاع هذا العدد من نتائج البحث:", + "includeCategory": "تضمين الفئة", + "includeCategoryOptions": { + "all": "الكل" + }, + "excludeCategory": "استبعاد الفئة", + "useSemanticRanker": "استخدام مصنف دلالي للاسترجاع", + "useSemanticCaptions": "استخدام التسميات الدلالية", + "useSuggestFollowupQuestions": "اقتراح أسئلة متابعة", + "useGPT4V": "استخدام نموذج رؤية GPT", + "gpt4VInput": { + "label": "مدخلات نموذج رؤية GPT", + "options": { + "textAndImages": "صور ونصوص", + "images": "صور", + "texts": "نصوص" + } + }, + "retrievalMode": { + "label": "وضع الاسترجاع", + "options": { + "hybrid": "المتجهات + النص (هجين)", + "vectors": "المتجهات", + "texts": "النصوص" + } + }, + "vector": { + "label": "حقول المتجهات (بحث متعدد الاستعلامات)", + "options": { + "embedding": "تضمينات النص", + "imageEmbedding": "تضمينات الصور", + "both": "تضمينات النص والصورة" + } + }, + "useOidSecurityFilter": "استخدام مرشح أمان OID", + "useGroupsSecurityFilter": "استخدام مرشح أمان المجموعات", + "shouldStream": "بث استجابات إكمال الدردشة" + }, + "helpTexts": { + "promptTemplate": "يتجاوز القالب المستخدم لتوليد الإجابة استناداً إلى السؤال ونتائج البحث. لإضافة إلى القالب الحالي بدلاً من استبداله بالكامل، ابدأ نصك بـ '>>>'.", + "temperature": "يضبط درجة حرارة الطلب للنموذج اللغوي الذي يولد الإجابة. درجات الحرارة الأعلى تؤدي إلى إجابات أكثر إبداعاً، لكنها قد تكون أقل واقعية.", + "seed": "يضبط قيمة بذرة لتحسين قابلية تكرار استجابات النموذج. يمكن أن تكون البذرة أي رقم صحيح.", + "searchScore": "يضبط الحد الأدنى للنقاط لنتائج البحث القادمة من بحث Azure AI. يعتمد نطاق النقاط على ما إذا كنت تستخدم الوضع الهجين (افتراضي)، المتجهات فقط، أو النصوص فقط.", + "rerankerScore": "يضبط الحد الأدنى للنقاط لنتائج البحث القادمة من معيد الترتيب الدلالي. تتراوح النقاط دائماً بين 0-4. كلما ارتفعت النقاط، زادت الصلة الدلالية للنتيجة بالسؤال.", + "retrieveNumber": "يضبط عدد نتائج البحث التي سيتم استرجاعها من بحث Azure AI. قد تزيد النتائج الإضافية من احتمالية العثور على الإجابة الصحيحة، لكنها قد تؤدي إلى تشتت النموذج.", + "includeCategory": "يحدد فئة لتضمينها في نتائج البحث. لا توجد فئات مستخدمة في مجموعة البيانات الافتراضية.", + "excludeCategory": "يحدد فئة لاستبعادها من نتائج البحث. لا توجد فئات مستخدمة في مجموعة البيانات الافتراضية.", + "useSemanticReranker": "يُمكّن مصنف البحث الدلالي من Azure AI، وهو نموذج يعيد ترتيب نتائج البحث بناءً على التشابه الدلالي مع استعلام المستخدم.", + "useSemanticCaptions": "يرسل تسميات دلالية إلى النموذج اللغوي بدلاً من نتيجة البحث الكاملة. يتم استخراج التسمية الدلالية من نتيجة البحث أثناء عملية الترتيب الدلالي.", + "suggestFollowupQuestions": "يطلب من النموذج اللغوي اقتراح أسئلة متابعة بناءً على استعلام المستخدم.", + "useGPT4Vision": "يستخدم GPT-4-Turbo مع الرؤية لتوليد إجابات استناداً إلى الصور والنصوص من الفهرس.", + "vectorFields": "يحدد حقول التضمين التي سيتم البحث فيها في فهرس بحث Azure AI، سواء كانت تضمينات 'الصور والنصوص' أو 'الصور' فقط أو 'النصوص' فقط.", + "gpt4VisionInputs": "يضبط ما سيتم إرساله إلى نموذج الرؤية. 'الصور والنصوص' يرسل الصور والنصوص معاً إلى النموذج، 'الصور' يرسل الصور فقط، و 'النصوص' يرسل النصوص فقط.", + "retrievalMode": "يضبط وضع الاسترجاع لاستعلام بحث Azure AI. يستخدم 'المتجهات + النص (هجين)' مزيجاً من البحث بالمتجهات والبحث النصي الكامل، بينما يستخدم 'المتجهات' البحث بالمتجهات فقط، و'النص' يستخدم البحث النصي الكامل فقط. الوضع الهجين هو الأمثل عمومًا.", + "streamChat": "يبث الاستجابة بشكل مستمر إلى واجهة الدردشة أثناء توليدها.", + "useOidSecurityFilter": "تصفية نتائج البحث بناءً على معرف OID للمستخدم المصادق عليه.", + "useGroupsSecurityFilter": "تصفية نتائج البحث بناءً على مجموعات المستخدم المصادق عليه." + } + } + \ No newline at end of file From c684ded0bcf79be6a98ff3a581ae0f8c0a919407 Mon Sep 17 00:00:00 2001 From: SKJ Date: Mon, 3 Feb 2025 08:03:55 +0000 Subject: [PATCH 2/2] Update language picker documentation to include Arabic support --- docs/deploy_features.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/deploy_features.md b/docs/deploy_features.md index 7c5f2a4038..987d9f3b5c 100644 --- a/docs/deploy_features.md +++ b/docs/deploy_features.md @@ -197,7 +197,7 @@ When both the browser-stored and Cosmos DB options are enabled, Cosmos DB will t ## Enabling language picker -You can optionally enable the language picker to allow users to switch between different languages. Currently, it supports English, Spanish, French, and Japanese. +You can optionally enable the language picker to allow users to switch between different languages. Currently, it supports English, Spanish, French, Japanese and Arabic. To add support for additional languages, create new locale files and update `app/frontend/src/i18n/config.ts` accordingly. To enable language picker, run: