Feat/arabic language support (#13516)

### What problem does this PR solve?

This PR implements comprehensive Arabic language support for the RAGFlow
application. The changes include:
- Complete Arabic translation of all UI text elements in the web
interface
- RTL (right-to-left) layout support for Arabic content
- Localization updates for all supported languages (ar, bg, de, en, es,
fr, id, it, ja, pt-br, ru, vi, zh-traditional, zh)
- UI component adjustments to properly display Arabic text and support
RTL layout

The implementation ensures that Arabic-speaking users can fully interact
with the application in their native language with proper text rendering
and layout direction.

### Type of change

- [x] New Feature (non-breaking change which adds functionality)

<img width="2866" height="1617" alt="image"
src="https://github.com/user-attachments/assets/f2751b34-1b65-4867-b81d-a1068c17b9b7"
/>

---------

Co-authored-by: Yingfeng <yingfeng.zhang@gmail.com>
This commit is contained in:
Attili-sys
2026-03-11 10:06:07 +03:00
committed by GitHub
parent 9ca2bac984
commit 6afd13ff29
28 changed files with 254 additions and 171 deletions

View File

@ -19,6 +19,8 @@ import localeData from 'dayjs/plugin/localeData';
import weekOfYear from 'dayjs/plugin/weekOfYear';
import weekYear from 'dayjs/plugin/weekYear';
import weekday from 'dayjs/plugin/weekday';
import 'dayjs/locale/ar';
import 'dayjs/locale/zh-cn';
import React, { useEffect, useState } from 'react';
import { RouterProvider } from 'react-router';
import { ThemeProvider, useTheme } from './components/theme-provider';
@ -88,9 +90,8 @@ function Root({ children }: React.PropsWithChildren) {
AntLanguageMap[lng as keyof typeof AntLanguageMap] ?? enUS;
const updateDocumentLocale = (lng: string) => {
document.documentElement.lang = lng;
document.documentElement.dir = lng.toLowerCase().startsWith('ar')
? 'rtl'
: 'ltr';
document.documentElement.dir = 'ltr';
dayjs.locale(lng === 'zh' ? 'zh-cn' : lng);
};
const [locale, setLocal] = useState<Locale>(getLocale(storage.getLanguage()));
@ -123,6 +124,7 @@ function Root({ children }: React.PropsWithChildren) {
: theme.defaultAlgorithm,
}}
locale={locale}
direction={'ltr'}
>
{children}

View File

@ -10,7 +10,7 @@
.chartLabel {
display: inline-block;
padding-left: 60px;
padding-inline-start: 60px;
padding-bottom: 20px;
}
.apiLinkText {

View File

@ -20,6 +20,7 @@ const Languages = [
'Japanese',
'Korean',
'Vietnamese',
'Arabic',
];
export const crossLanguageOptions = Languages.map((x) => ({

View File

@ -1,5 +1,5 @@
.messageInputWrapper {
margin-right: 20px;
margin-inline-end: 20px;
padding: '0px 0px 10px 0px';
border: 1px solid #d9d9d9;
&:hover {
@ -8,8 +8,8 @@
}
border-radius: 8px;
:global(.ant-input-affix-wrapper) {
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
border-end-end-radius: 0;
border-end-start-radius: 0;
}
}
@ -31,7 +31,7 @@
}
.deleteIcon {
position: absolute;
right: -4px;
inset-inline-end: -4px;
top: -4px;
color: #d92d20;
}

View File

@ -36,7 +36,7 @@
word-break: break-word;
:global(section.think) {
color: rgb(166, 166, 166);
border-left-color: rgb(78, 78, 86);
border-inline-start-color: rgb(78, 78, 86);
}
}
@ -57,9 +57,9 @@
}
.messageItemLeft {
text-align: left;
text-align: start;
}
.messageItemRight {
text-align: right;
text-align: end;
}

View File

@ -39,7 +39,7 @@
word-break: break-word;
:global(section.think) {
color: rgb(166, 166, 166);
border-left-color: rgb(78, 78, 86);
border-inline-start-color: rgb(78, 78, 86);
}
// RTL Support
@ -47,13 +47,13 @@
text-align: right;
:global(section.think) {
border-left-color: transparent;
border-right-color: rgb(78, 78, 86);
border-right-width: 2px;
border-right-style: solid;
border-left: none;
padding-left: 0;
padding-right: 10px;
border-inline-start-color: transparent;
border-inline-end-color: rgb(78, 78, 86);
border-inline-end-width: 2px;
border-inline-end-style: solid;
border-inline-start: none;
padding-inline-start: 0;
padding-inline-end: 10px;
}
}
}
@ -79,9 +79,9 @@
}
.messageItemLeft {
text-align: left;
text-align: start;
}
.messageItemRight {
text-align: right;
text-align: end;
}

View File

@ -132,9 +132,9 @@ export default {
name: 'اسم',
memoryNamePlaceholder: 'اسم الذاكرة',
memoryType: 'نوع الذاكرة',
embeddingModel: 'نموذج التضمين',
embeddingModel: 'نموذج Embedding',
selectModel: 'حدد النموذج',
llm: 'ماجستير',
llm: 'LLM',
delMemoryWarn:
'بعد الحذف، سيتم حذف كافة الرسائل الموجودة في هذه الذاكرة ولا يمكن للوكلاء استردادها.',
},
@ -170,7 +170,7 @@ export default {
},
config: {
memorySizeTooltip:
'حسابات محتوى كل رسالة + ناقل التضمين الخاص بها (≈ المحتوى + الأبعاد × 8 بايت).\nمثال: رسالة بحجم 1 كيلو بايت مع تضمين 1024-dim تستخدم حوالي 9 كيلو بايت. يحتوي الحد الافتراضي البالغ 5 ميغابايت على 500 رسالة تقريبًا.',
'حسابات محتوى كل رسالة + ناقل Embedding الخاص بها (≈ المحتوى + الأبعاد × 8 بايت).\nمثال: رسالة بحجم 1 كيلو بايت مع Embedding 1024-dim تستخدم حوالي 9 كيلو بايت. يحتوي الحد الافتراضي البالغ 5 ميغابايت على 500 رسالة تقريبًا.',
avatar: 'الصورة الرمزية',
description: 'وصف',
memorySize: 'حجم الذاكرة',
@ -206,7 +206,7 @@ export default {
knowledgeDetails: {
metadata: {
fields: 'الحقول',
selectFiles: 'الملفات {{count}} المحددة',
selectFiles: 'الملفات المحددة ({{count}})',
type: 'يكتب',
fieldNameInvalid:
'يمكن أن يحتوي اسم الحقل على أحرف أو شرطات سفلية فقط.',
@ -407,7 +407,7 @@ export default {
autoQuestions: 'سؤال تلقائي',
autoQuestionsTip:
'قم باستخراج الأسئلة N تلقائيًا لكل مجموعة لزيادة تصنيفها للاستعلامات التي تحتوي على تلك الأسئلة. يمكنك التحقق من الأسئلة المضافة أو تحديثها لمقطع من قائمة المقاطع. لن تعطل هذه الميزة عملية التقسيم في حالة حدوث خطأ، إلا أنها قد تضيف نتيجة فارغة إلى المقطع الأصلي. انتبه إلى أنه سيتم استهلاك الرموز المميزة الإضافية بواسطة نموذج الفهرسة المحدد في "التكوين". للحصول على التفاصيل، راجع https://ragflow.io/docs/dev/autokeyword_autoquestion.',
redo: 'هل تريد مسح قطع {{chunkNum}} الموجودة؟',
redo: 'هل تريد مسح القطع الموجودة ({{chunkNum}})؟',
setMetaData: 'تعيين البيانات الوصفية',
pleaseInputJson: 'الرجاء إدخال JSON',
documentMetaTips:
@ -501,11 +501,11 @@ export default {
languageMessage: 'يرجى إدخال لغتك!',
languagePlaceholder: 'يرجى اختيار لغة المستند',
permissions: 'الأذونات',
embeddingModel: 'نموذج التضمين',
embeddingModel: 'نموذج Embedding',
chunkTokenNumber: 'حجم القطعة الموصى بها',
chunkTokenNumberMessage: 'مطلوب رقم الرمز المميز للنص',
embeddingModelTip:
'نموذج التضمين الافتراضي الذي تستخدمه قاعدة المعرفة. بمجرد أن تحتوي قاعدة المعرفة على أجزاء، عند تبديل نموذج التضمين، يقوم النظام بشكل عشوائي باختبار بعض القطع للتحقق من التوافق، ويعيد دمجها مع نموذج التضمين الجديد، ويحسب تشابه جيب التمام بين المتجهات الجديدة والقديمة. يُسمح بالتبديل فقط عندما يكون متوسط ​​تشابه العينة ≥ 0.9. بخلاف ذلك، يجب عليك حذف كافة الأجزاء الموجودة في قاعدة المعرفة قبل أن تتمكن من تغييرها.',
'نموذج Embedding الافتراضي الذي تستخدمه قاعدة المعرفة. بمجرد أن تحتوي قاعدة المعرفة على أجزاء، عند تبديل نموذج Embedding، يقوم النظام بشكل عشوائي باختبار بعض القطع للتحقق من التوافق، ويعيد دمجها مع نموذج Embedding الجديد، ويحسب تشابه جيب التمام بين المتجهات الجديدة والقديمة. يُسمح بالتبديل فقط عندما يكون متوسط ​​تشابه العينة ≥ 0.9. بخلاف ذلك، يجب عليك حذف كافة الأجزاء الموجودة في قاعدة المعرفة قبل أن تتمكن من تغييرها.',
permissionsTip:
'إذا تم تعيينه على "فريق"، فسيتمكن جميع أعضاء فريقك من إدارة قاعدة المعرفة.',
chunkTokenNumberTip:
@ -516,7 +516,7 @@ export default {
english: 'إنجليزي',
chinese: 'الصينية',
portugueseBr: 'البرتغالية (البرازيل)',
embeddingModelPlaceholder: 'الرجاء تحديد نموذج التضمين.',
embeddingModelPlaceholder: 'الرجاء تحديد نموذج Embedding.',
chunkMethodPlaceholder: 'يرجى اختيار طريقة التقسيم.',
parserLabel: {
naive: 'عام',
@ -550,14 +550,14 @@ export default {
naive:
'<p>تنسيقات الملفات المدعومة هي <b>MD، MDX، DOCX، XLSX، XLS (Excel 97-2003)، PPTX، PDF، TXT، JPEG، JPG، PNG، TIF، GIF، CSV، JSON، EML، HTML</b>.</p>\n <p> تقوم هذه الطريقة بتقطيع الملفات باستخدام طريقة "ساذجة": </p>\n <p>\n <li> استخدم نموذج اكتشاف الرؤية لتقسيم النصوص إلى أجزاء أصغر.</li>\n <li>ثم، قم بدمج المقاطع المتجاورة حتى يتجاوز عدد الرموز المميزة الحد المحدد بواسطة "رقم القطعة المميزة للنص"، وعند هذه النقطة يتم إنشاء القطعة.</li></p>',
paper:
'<p> يتم دعم ملف <b>PDF</b> فقط.</p><p>\n سيتم تقسيم الأوراق حسب القسم، مثل <i>الملخص، 1.1، 1.2</i>. </p><p>\n يمكّن هذا النهج LLM من تلخيص الورقة بشكل أكثر فعالية وتقديم استجابات أكثر شمولاً ومفهومة.\n ومع ذلك، فإنه يزيد أيضًا من سياق محادثات الذكاء الاصطناعي ويضيف إلى التكلفة الحسابية لماجستير القانون. لذا، أثناء المحادثة، فكر في تقليل قيمة "<b>topN</b>".</p>',
'<p> يتم دعم ملف <b>PDF</b> فقط.</p><p>\n سيتم تقسيم الأوراق حسب القسم، مثل <i>الملخص، 1.1، 1.2</i>. </p><p>\n يمكّن هذا النهج LLM من تلخيص الورقة بشكل أكثر فعالية وتقديم استجابات أكثر شمولاً ومفهومة.\n ومع ذلك، فإنه يزيد أيضًا من سياق محادثات الذكاء الاصطناعي ويضيف إلى التكلفة الحسابية لـ LLM. لذا، أثناء المحادثة، فكر في تقليل قيمة "<b>topN</b>".</p>',
presentation:
'<p>تنسيقات الملفات المدعومة هي <b>PDF</b>، <b>PPTX</b>.</p><p>\n يتم التعامل مع كل صفحة في الشرائح على أنها جزء، مع تخزين صورتها المصغرة.</p><p>\n <i> يتم تطبيق طريقة التجزئة هذه تلقائيًا على جميع ملفات PPT التي تم تحميلها، لذلك لا تحتاج إلى تحديدها يدويًا.</i></p>',
qa: '<p>\n تدعم طريقة التقطيع هذه <b>XLSX</b> و<b>CSV/TXT</b> تنسيقات الملفات.\n </p>\n <li>\n إذا كان الملف بتنسيق <b>XLSX</b> أو <b>XLS (Excel 97-2003)</b>، فيجب أن يحتوي على عمودين بدون رؤوس: أحدهما للأسئلة والآخر للإجابات، بحيث يسبق عمود السؤال عمود الإجابة. أوراق متعددة هي\n مقبول، بشرط أن تكون الأعمدة منظمة بشكل صحيح.\n </li>\n <li>\n إذا كان الملف بتنسيق <b>CSV/TXT</b>، فيجب أن يكون مشفرًا بـ UTF-8 باستخدام TAB كمحدد لفصل الأسئلة والأجوبة.\n </li>\n <p>\n <i>\n سيتم تجاهل أسطر النصوص التي لا تتبع القواعد المذكورة أعلاه، و\n سيتم اعتبار كل زوج من الأسئلة والأجوبة جزءًا مميزًا.\n </i>\n </p>',
resume:
'<p>تنسيقات الملفات المدعومة هي <b>DOCX</b>، <b>PDF</b>، <b>TXT</b>.\n </p><p>\n يتم تحليل السيرة الذاتية بمختلف أشكالها وتنظيمها في بيانات منظمة لتسهيل البحث عن المرشحين للقائمين بالتوظيف.\n </p>',
table:
"<p>تنسيقات الملفات المدعومة هي <b>XLSX</b> و<b>CSV/TXT</b>.</p><p>\n فيما يلي بعض المتطلبات الأساسية والنصائح:\n <ul>\n <li>بالنسبة لملف CSV أو TXT، يجب أن يكون المحدد بين الأعمدة هو <em><b>TAB</b></em>.</li>\n <li>يجب أن يكون الصف الأول عبارة عن رؤوس أعمدة.</li>\n <li> يجب أن تكون رؤوس الأعمدة مصطلحات ذات معنى للمساعدة في فهم ماجستير إدارة الأعمال الخاص بك.\n من الممارسات الجيدة وضع المرادفات جنبًا إلى جنب مفصولة بشرطة مائلة <i>'/'</i> وتعداد القيم باستخدام الأقواس، على سبيل المثال: <i>'الجنس/الجنس (ذكر، أنثى)'</i>.<p>\n فيما يلي بعض الأمثلة على الرؤوس:<ol>\n <li>المورد/البائع<b>'TAB'</b>اللون (أصفر، أزرق، بني)<b>'TAB'</b>الجنس/الجنس (ذكر، أنثى)<b>'TAB'</b>الحجم (M، L، XL، XXL)</li>\n </ol>\n </p>\n </li>\n <li>سيتم التعامل مع كل صف في الجدول كقطعة.</li>\n </ul>",
"<p>تنسيقات الملفات المدعومة هي <b>XLSX</b> و<b>CSV/TXT</b>.</p><p>\n فيما يلي بعض المتطلبات الأساسية والنصائح:\n <ul>\n <li>بالنسبة لملف CSV أو TXT، يجب أن يكون المحدد بين الأعمدة هو <em><b>TAB</b></em>.</li>\n <li>يجب أن يكون الصف الأول عبارة عن رؤوس أعمدة.</li>\n <li> يجب أن تكون رؤوس الأعمدة مصطلحات ذات معنى للمساعدة في فهم LLM الخاص بك.\n من الممارسات الجيدة وضع المرادفات جنبًا إلى جنب مفصولة بشرطة مائلة <i>'/'</i> وتعداد القيم باستخدام الأقواس، على سبيل المثال: <i>'الجنس/الجنس (ذكر، أنثى)'</i>.<p>\n فيما يلي بعض الأمثلة على الرؤوس:<ol>\n <li>المورد/البائع<b>'TAB'</b>اللون (أصفر، أزرق، بني)<b>'TAB'</b>الجنس/الجنس (ذكر، أنثى)<b>'TAB'</b>الحجم (M، L، XL، XXL)</li>\n </ol>\n </p>\n </li>\n <li>سيتم التعامل مع كل صف في الجدول كقطعة.</li>\n </ul>",
picture:
'<p>يتم دعم ملفات الصور، وسيتوفر دعم الفيديو قريبًا.</p><p>\n تستخدم هذه الطريقة نموذج التعرف الضوئي على الحروف (OCR) لاستخراج النصوص من الصور.\n </p><p>\n إذا تم اعتبار النص المستخرج بواسطة نموذج التعرف الضوئي على الحروف (OCR) غير كافٍ، فسيتم استخدام LLM مرئي محدد لتقديم وصف للصورة.\n </p>',
one: '<p>تنسيقات الملفات المدعومة هي <b>DOCX، XLSX، XLS (Excel 97-2003)، PDF، TXT</b>.\n </p><p>\n تتعامل هذه الطريقة مع كل مستند في مجمله كقطعة.\n </p><p>\n ينطبق ذلك عندما تطلب من LLM تلخيص المستند بأكمله، بشرط أن يتمكن من التعامل مع هذا القدر من طول السياق.\n </p>',
@ -826,7 +826,7 @@ export default {
tocEnhanceTip:
'أثناء تحليل المستند، تم إنشاء معلومات جدول المحتويات (راجع خيار "تمكين استخراج جدول المحتويات" في الطريقة العامة). يسمح هذا للنموذج الكبير بإرجاع عناصر جدول المحتويات ذات الصلة باستعلام المستخدم، وبالتالي استخدام هذه العناصر لاسترداد الأجزاء ذات الصلة وتطبيق الترجيح على هذه القطع أثناء عملية الفرز. يحاكي هذا الأسلوب سلوك الإنسان في البحث عن المعلومات في الكتب.',
batchDeleteSessions: 'حذف دفعة',
deleteSelectedConfirm: 'هل تريد حذف الجلسة (الجلسات) {{count}} المحددة؟',
deleteSelectedConfirm: 'هل تريد حذف الجلسة/الجلسات المحددة ({{count}})؟',
},
setting: {
Verify: 'يؤكد',
@ -869,7 +869,7 @@ export default {
'مطلوب لصندوق تخزين متوافق مع S3. حدد عنوان URL لنقطة النهاية المتوافقة مع S3.\nمثال: https://fsn1.your-objectstorage.com',
S3CompatibleAddressingStyleTip:
'مطلوب لصندوق تخزين متوافق مع S3. حدد نمط العنونة المتوافق مع S3.\nمثال: النمط المستضاف الافتراضي',
addDataSourceModalTitle: 'قم بإنشاء موصل {{name}} الخاص بك',
addDataSourceModalTitle: 'إضافة موصل {{name}}',
deleteSourceModalTitle: 'حذف مصدر البيانات',
deleteSourceModalContent:
'<p>هل أنت متأكد من أنك تريد حذف رابط مصدر البيانات هذا؟</p>',
@ -879,146 +879,149 @@ export default {
timeStarted: 'بدأ الوقت',
log: 'سجل',
confluenceDescription:
'قم بدمج مساحة عمل Confluence الخاصة بك للبحث في الوثائق.',
'Integrate your Confluence workspace to search documentation.',
s3Description:
'اتصل بحاوية AWS S3 الخاصة بك لاستيراد الملفات المخزنة ومزامنتها.',
'Connect to your AWS S3 bucket to import and sync stored files.',
google_cloud_storageDescription:
'قم بتوصيل مجموعة Google Cloud Storage لاستيراد الملفات ومزامنتها.',
'Connect your Google Cloud Storage bucket to import and sync files.',
r2Description:
'قم بتوصيل مجموعة Cloudflare R2 الخاصة بك لاستيراد الملفات ومزامنتها.',
'Connect your Cloudflare R2 bucket to import and sync files.',
oci_storageDescription:
'قم بتوصيل حاوية Oracle Cloud Object Storage لاستيراد الملفات ومزامنتها.',
'Connect your Oracle Cloud Object Storage bucket to import and sync files.',
discordDescription:
'قم بربط خادم Discord الخاص بك للوصول إلى بيانات الدردشة وتحليلها.',
'Link your Discord server to access and analyze chat data.',
notionDescription:
'مزامنة الصفحات وقواعد البيانات من Notion لاسترجاع المعرفة.',
'Sync pages and databases from Notion for knowledge retrieval.',
google_driveDescription:
'قم بتوصيل Google Drive الخاص بك عبر OAuth وقم بمزامنة مجلدات أو محركات أقراص محددة.',
gmailDescription:
'قم بتوصيل Gmail الخاص بك عبر OAuth لمزامنة رسائل البريد الإلكتروني.',
webdavDescription: 'اتصل بخوادم WebDAV لمزامنة الملفات.',
'Connect your Google Drive via OAuth and sync specific folders or drives.',
gmailDescription: 'Connect your Gmail via OAuth to sync emails.',
webdavDescription: 'Connect to WebDAV servers to sync files.',
webdavRemotePathTip:
'اختياري: حدد مسار المجلد على خادم WebDAV (على سبيل المثال، /Documents). اتركه فارغًا للمزامنة من الجذر.',
'Optional: Specify a folder path on the WebDAV server (e.g., /Documents). Leave empty to sync from root.',
google_driveTokenTip:
'قم بتحميل رمز OAuth المميز JSON الذي تم إنشاؤه من مساعد OAuth أو Google Cloud Console. يمكنك أيضًا تحميل Client_secret JSON من تطبيق "مثبت" أو "ويب". إذا كانت هذه هي المزامنة الأولى لك، فسيتم فتح نافذة متصفح لإكمال موافقة OAuth. إذا كان JSON يحتوي بالفعل على رمز تحديث، فسيتم إعادة استخدامه تلقائيًا.',
'Upload the OAuth token JSON generated from the OAuth helper or Google Cloud Console. You may also upload a client_secret JSON from an "installed" or "web" application. If this is your first sync, a browser window will open to complete the OAuth consent. If the JSON already contains a refresh token, it will be reused automatically.',
google_drivePrimaryAdminTip:
'عنوان البريد الإلكتروني الذي يمكنه الوصول إلى محتوى Drive الذي تتم مزامنته',
'Email address that has access to the Drive content being synced',
zendeskDescription:
'قم بتوصيل Zendesk الخاص بك لمزامنة التذاكر والمقالات والمحتويات الأخرى.',
'Connect your Zendesk to sync tickets, articles, and other content.',
google_driveMyDriveEmailsTip:
'رسائل البريد الإلكتروني المفصولة بفواصل والتي يجب فهرسة محتويات "ملفاتي" (بما في ذلك المسؤول الأساسي).',
'Comma-separated emails whose "My Drive" contents should be indexed (include the primary admin).',
google_driveSharedFoldersTip:
'روابط مجلد Google Drive مفصولة بفواصل للزحف.',
'Comma-separated Google Drive folder links to crawl.',
gmailPrimaryAdminTip:
'البريد الإلكتروني الأساسي للمشرف مع إمكانية الوصول إلى Gmail / Workspace، يُستخدم لتعداد مستخدمي المجال وكحساب المزامنة الافتراضي.',
'Primary admin email with Gmail / Workspace access, used to enumerate domain users and as the default sync account.',
gmailTokenTip:
'قم بتحميل OAuth JSON الذي تم إنشاؤه من Google Console. إذا كان يحتوي فقط على بيانات اعتماد العميل، فقم بتشغيل التحقق المستند إلى المتصفح مرة واحدة لسك رموز التحديث طويلة الأمد.',
'Upload the OAuth JSON generated from Google Console. If it only contains client credentials, run the browser-based verification once to mint long-lived refresh tokens.',
dropboxDescription:
'قم بتوصيل Dropbox الخاص بك لمزامنة الملفات والمجلدات من الحساب المختار.',
bitbucketDescription:
'قم بتوصيل Bitbucket لمزامنة محتوى العلاقات العامة.',
'Connect your Dropbox to sync files and folders from a chosen account.',
bitbucketDescription: 'Connect Bitbucket to sync PR content.',
bitbucketTopWorkspaceTip:
'مساحة عمل Bitbucket المراد فهرستها (على سبيل المثال، "atlassian" من https://bitbucket.org/atlassian/workspace ).',
'The Bitbucket workspace to index (e.g., "atlassian" from https://bitbucket.org/atlassian/workspace ).',
bitbucketRepositorySlugsTip:
'البزاقات المستودعية المفصولة بفواصل. على سبيل المثال، الريبو واحد، الريبو اثنين',
bitbucketProjectsTip:
'مفاتيح المشروع مفصولة بفواصل. على سبيل المثال، PROJ1، PROJ2',
'Comma separated repository slugs. E.g., repo-one,repo-two',
bitbucketProjectsTip: 'Comma separated project keys. E.g., PROJ1,PROJ2',
bitbucketWorkspaceTip:
'سيقوم هذا الرابط بفهرسة كافة المستودعات الموجودة في مساحة العمل.',
boxDescription: 'قم بتوصيل محرك Box الخاص بك لمزامنة الملفات والمجلدات.',
'This connector will index all repositories in the workspace.',
boxDescription: 'Connect your Box drive to sync files and folders.',
githubDescription:
'قم بتوصيل GitHub لمزامنة طلبات السحب ومشكلات الاسترجاع.',
'Connect GitHub to sync pull requests and issues for retrieval.',
airtableDescription:
'اتصل بـ Airtable وقم بمزامنة الملفات من جدول محدد ضمن مساحة عمل محددة.',
'Connect to Airtable and synchronize files from a specified table within a designated workspace.',
gitlabDescription:
'قم بتوصيل GitLab لمزامنة المستودعات والمشكلات وطلبات الدمج والوثائق ذات الصلة.',
asanaDescription: 'اتصل بـ Asana وقم بمزامنة الملفات من مساحة عمل محددة.',
'Connect GitLab to sync repositories, issues, merge requests, and related documentation.',
asanaDescription:
'Connect to Asana and synchronize files from a specified workspace.',
imapDescription:
'اتصل بصندوق بريد IMAP الخاص بك لمزامنة رسائل البريد الإلكتروني لاسترجاع المعرفة.',
'Connect to your IMAP mailbox to sync emails for knowledge retrieval.',
dropboxAccessTokenTip:
'قم بإنشاء رمز وصول طويل الأمد في Dropbox App Console باستخدام نطاقات files.metadata.read وfiles.content.read وsharing.read.',
'Generate a long-lived access token in the Dropbox App Console with files.metadata.read, files.content.read, and sharing.read scopes.',
moodleDescription:
'اتصل بنظام Moodle LMS الخاص بك لمزامنة محتوى الدورة والمنتديات والموارد.',
'Connect to your Moodle LMS to sync course content, forums, and resources.',
moodleUrlTip:
'عنوان URL الأساسي لمثيل Moodle الخاص بك (على سبيل المثال، https://moodle.university.edu). لا تقم بتضمين /webservice أو /login.',
'The base URL of your Moodle instance (e.g., https://moodle.university.edu). Do not include /webservice or /login.',
moodleTokenTip:
'أنشئ رمزًا مميزًا لخدمة الويب في Moodle: انتقل إلى إدارة الموقع ← الخادم ← خدمات الويب ← إدارة الرموز المميزة. يجب أن يكون المستخدم مسجلاً في المقررات الدراسية التي تريد مزامنتها.',
'Generate a web service token in Moodle: Go to Site administration → Server → Web services → Manage tokens. The user must be enrolled in the courses you want to sync.',
seafileDescription:
'اتصل بخادم SeaFile الخاص بك لمزامنة الملفات والمستندات من مكتباتك.',
'Connect to your SeaFile server to synchronise files and documents from your libraries.',
seafileUrlTip:
'عنوان URL الكامل لخادم SeaFile الخاص بك بما في ذلك البروتوكول. مثال: https://seafile.example.com - لا تقم بتضمين شرطة مائلة زائدة أو أي مسار بعد المجال.',
'The full URL of your SeaFile server including the protocol. Example: https://seafile.example.com - Do not include a trailing slash or any path after the domain.',
seafileAccountScopeTip:
'مزامنة جميع المكتبات المرئية لرمز واجهة برمجة تطبيقات الحساب أدناه.',
seafileTokenPanelHeading: 'قم بتوفير إحدى طرق المصادقة التالية:',
seafileTokenPanelAccountBullet: '- يمنح الوصول إلى جميع مكتباتك.',
seafileTokenPanelLibraryBullet: '— مُخصص لمكتبة واحدة فقط (أكثر أمانًا).',
'Syncs all libraries visible to the Account API Token below.',
seafileTokenPanelHeading: 'Provide one of these authentication methods:',
seafileTokenPanelAccountBullet: '- grants access to all your libraries.',
seafileTokenPanelLibraryBullet:
'— scoped to a single library only (more secure).',
seafileValidationAccountTokenRequired:
'رمز واجهة برمجة التطبيقات للحساب مطلوب لنطاق الحساب بالكامل',
seafileValidationTokenRequired: 'قم بتوفير رمز API للحساب أو رمز المكتبة',
seafileValidationLibraryIdRequired: 'معرف المكتبة مطلوب',
seafileValidationDirectoryPathRequired: 'مسار الدليل مطلوب',
'Account API Token is required for Entire Account scope',
seafileValidationTokenRequired:
'Provide either an Account API Token or a Library Token',
seafileValidationLibraryIdRequired: 'Library ID is required',
seafileValidationDirectoryPathRequired: 'Directory Path is required',
seafileSyncScopeTip:
'يتحكم في ما تتم مزامنته: (1) الحساب بالكامل - يقوم بمزامنة جميع المكتبات التي يمكن لرمزك الوصول إليها. يتطلب رمز API للحساب. (2) مكتبة واحدة - مزامنة جميع الملفات داخل مكتبة واحدة محددة. يتطلب معرف المكتبة وإما رمز API للحساب أو رمز API للمكتبة. (3) الدليل المحدد - يقوم بمزامنة الملفات فقط داخل مجلد معين داخل المكتبة. يتطلب معرف المكتبة، ومسار المجلد داخل تلك المكتبة، وإما رمز واجهة برمجة تطبيقات الحساب أو رمز واجهة برمجة تطبيقات المكتبة.',
'Controls what gets synchronised: (1) Entire Account - Syncs all libraries your token has access to. Requires an Account API Token. (2) Single Library - Syncs all files within one specific library. Requires the Library ID and either an Account API Token or a Library API Token. (3) Specific Directory - Syncs only files within a specific folder inside a library. Requires the Library ID, the folder path within that library, and either an Account API Token or a Library API Token.',
seafileTokenTip:
'رمز SeaFile API الخاص بك على مستوى الحساب. يمنح الوصول إلى جميع المكتبات المرئية لحسابك. مطلوب عندما يكون نطاق المزامنة هو "الحساب بالكامل". بالنسبة إلى "المكتبة الفردية" أو "الدليل المحدد"، يمكنك استخدام هذا الرمز المميز أو رمز Library API المميز بدلاً من ذلك.',
'Your account-level SeaFile API token. Grants access to all libraries visible to your account. Required when sync scope is "Entire Account". For "Single Library" or "Specific Directory" you can use this token or a Library API Token instead.',
seafileRepoTokenTip:
'رمز واجهة برمجة التطبيقات (API) على مستوى المكتبة والذي يمنح الوصول إلى مكتبة واحدة محددة فقط. يمكن استخدامه بدلاً من رمز واجهة برمجة تطبيقات الحساب لنطاقات مزامنة "المكتبة الفردية" و"الدليل المحدد".',
'A library-scoped API token that only grants access to one specific library. Can be used instead of the Account API Token for "Single Library" and "Specific Directory" sync scopes.',
seafileRepoIdTip:
'المعرف الفريد (UUID) لمكتبة SeaFile التي تريد مزامنتها. يمكنك العثور عليه في شريط عنوان المتصفح الخاص بك عند فتح المكتبة في واجهة الويب SeaFile. مثال: 7a9e1b3c-4d5f-6a7b-8c9d-0e1f2a3b4c5d. مطلوب عندما يكون نطاق المزامنة هو "مكتبة واحدة" أو "دليل محدد".',
'The unique identifier (UUID) of the SeaFile library you want to synchronise. You can find it in your browser address bar when you open the library in the SeaFile web interface. Example: 7a9e1b3c-4d5f-6a7b-8c9d-0e1f2a3b4c5d. Required when sync scope is "Single Library" or "Specific Directory".',
seafileSyncPathTip:
'المسار المطلق للمجلد المطلوب مزامنته داخل المكتبة المحددة بواسطة معرف المكتبة أعلاه. يجب أن تبدأ بشرطة مائلة للأمام. سيتم تضمين كافة الملفات والمجلدات الفرعية ضمن هذا المسار بشكل متكرر. مثال: /المستندات/التقارير. هام: يجب أن يكون المجلد موجودًا داخل المكتبة المحددة. المسارات خارج المكتبة غير مدعومة. يتم استخدامه فقط عندما يكون نطاق المزامنة هو "دليل محدد".',
'The absolute path of the folder to synchronise within the library specified by the Library ID above. Must start with a forward slash. All files and subfolders under this path will be included recursively. Example: /Documents/Reports. Important: The folder must exist inside the specified library. Paths outside the library are not supported. Only used when sync scope is "Specific Directory".',
seafileIncludeSharedTip:
'عند التمكين، يتم تضمين المكتبات التي شاركها المستخدمون الآخرون معك في المزامنة. عند التعطيل، تتم مزامنة المكتبات المملوكة لحسابك فقط. ينطبق فقط عندما يكون نطاق المزامنة هو "الحساب بالكامل".',
'When enabled, libraries that other users have shared with you are included in the synchronisation. When disabled, only libraries owned by your account are synchronised. Only applies when sync scope is "Entire Account".',
seafileBatchSizeTip:
'عدد المستندات التي تمت معالجتها وإرجاعها لكل دفعة أثناء المزامنة. تستخدم القيمة الأصغر ذاكرة أقل ولكنها قد تكون أبطأ بشكل عام. الافتراضي: 100.',
'The number of documents processed and returned per batch during synchronisation. A smaller value uses less memory but may be slower overall. Default: 100.',
jiraDescription:
'قم بتوصيل مساحة عمل Jira الخاصة بك لمزامنة المشكلات والتعليقات والمرفقات.',
'Connect your Jira workspace to sync issues, comments, and attachments.',
jiraBaseUrlTip:
'عنوان URL الأساسي لموقع Jira الخاص بك (على سبيل المثال، https://your-domain.atlassian.net).',
'Base URL of your Jira site (e.g., https://your-domain.atlassian.net).',
jiraProjectKeyTip:
'اختياري: تقييد المزامنة بمفتاح مشروع واحد (على سبيل المثال، ENG).',
'Optional: limit syncing to a single project key (e.g., ENG).',
jiraJqlTip:
'مرشح JQL اختياري. اتركه فارغًا للاعتماد على مرشحات المشروع/الوقت.',
jiraBatchSizeTip: 'الحد الأقصى لعدد الإصدارات المطلوبة من Jira لكل دفعة.',
'Optional JQL filter. Leave blank to rely on project/time filters.',
jiraBatchSizeTip:
'Maximum number of issues requested from Jira per batch.',
jiraCommentsTip:
'قم بتضمين تعليقات Jira في مستند تخفيض السعر الذي تم إنشاؤه.',
jiraAttachmentsTip: 'قم بتنزيل المرفقات كمستندات منفصلة أثناء المزامنة.',
'Include Jira comments in the generated markdown document.',
jiraAttachmentsTip:
'Download attachments as separate documents during sync.',
jiraAttachmentSizeTip:
'سيتم تخطي المرفقات الأكبر من هذا العدد من البايتات.',
jiraLabelsTip: 'التسميات التي يجب تخطيها أثناء الفهرسة (مفصولة بفواصل).',
'Attachments larger than this number of bytes will be skipped.',
jiraLabelsTip:
'Labels that should be skipped while indexing (comma separated).',
jiraBlacklistTip:
'سيتم تجاهل التعليقات التي يتطابق بريد مؤلفها الإلكتروني مع هذه الإدخالات.',
'Comments whose author email matches these entries will be ignored.',
jiraScopedTokenTip:
'قم بتمكين هذا عند استخدام رموز Atlassian المميزة (api.atlassian.com).',
jiraEmailTip:
'البريد الإلكتروني المرتبط بحساب Jira/الرمز المميز لواجهة برمجة التطبيقات.',
'Enable this when using scoped Atlassian tokens (api.atlassian.com).',
jiraEmailTip: 'Email associated with the Jira account/API token.',
jiraTokenTip:
'رمز API المميز الذي تم إنشاؤه من https://id.atlassian.com/manage-profile/security/api-tokens.',
jiraPasswordTip: 'كلمة مرور اختيارية لبيئات Jira Server/Data Center.',
'API token generated from https://id.atlassian.com/manage-profile/security/api-tokens.',
jiraPasswordTip:
'Optional password for Jira Server/Data Center environments.',
mysqlDescription:
'اتصل بقاعدة بيانات MySQL لمزامنة البيانات من الجداول باستخدام استعلامات SQL.',
'Connect to MySQL database to sync data from tables using SQL queries.',
mysqlQueryTip:
'استعلام SQL لاستخراج البيانات من قاعدة البيانات الخاصة بك (على سبيل المثال، SELECT * FROM Products WHERE Status = "active").',
'SQL query to extract data from your database (e.g., SELECT * FROM products WHERE status = "active").',
mysqlContentColumnsTip:
'أسماء الأعمدة المفصولة بفواصل والتي سيتم دمج قيمها كمحتوى مستند لتوجيهها.',
'Comma-separated column names whose values will be combined as document content for vectorization.',
mysqlMetadataColumnsTip:
'أسماء أعمدة مفصولة بفواصل لتخزينها كبيانات تعريف للمستند (غير متجهة، ولكنها قابلة للبحث).',
'Comma-separated column names to store as document metadata (not vectorized, but searchable).',
mysqlIdColumnTip:
'العمود المطلوب استخدامه كمعرف مستند فريد. إذا لم يتم تحديده، سيتم استخدام تجزئة المحتوى.',
'Column to use as unique document ID. If not specified, a hash of the content will be used.',
mysqlTimestampColumnTip:
'عمود التاريخ والوقت/الطابع الزمني للمزامنة المتزايدة. سيتم جلب الصفوف التي تم تعديلها بعد آخر مزامنة فقط.',
'Datetime/timestamp column for incremental sync. Only rows modified after the last sync will be fetched.',
postgresqlDescription:
'اتصل بقاعدة بيانات PostgreSQL لمزامنة البيانات من الجداول باستخدام استعلامات SQL.',
'Connect to PostgreSQL database to sync data from tables using SQL queries.',
postgresqlQueryTip:
"استعلام SQL لاستخراج البيانات من قاعدة البيانات الخاصة بك (على سبيل المثال، SELECT * FROM Products WHERE Status = 'active').",
"SQL query to extract data from your database (e.g., SELECT * FROM products WHERE status = 'active').",
postgresqlContentColumnsTip:
'أسماء الأعمدة المفصولة بفواصل والتي سيتم دمج قيمها كمحتوى مستند لتوجيهها.',
'Comma-separated column names whose values will be combined as document content for vectorization.',
postgresqlMetadataColumnsTip:
'أسماء أعمدة مفصولة بفواصل لتخزينها كبيانات تعريف للمستند (غير متجهة، ولكنها قابلة للبحث).',
'Comma-separated column names to store as document metadata (not vectorized, but searchable).',
postgresqlIdColumnTip:
'العمود المطلوب استخدامه كمعرف مستند فريد. إذا لم يتم تحديده، سيتم استخدام تجزئة المحتوى.',
'Column to use as unique document ID. If not specified, a hash of the content will be used.',
postgresqlTimestampColumnTip:
'عمود التاريخ والوقت/الطابع الزمني للمزامنة المتزايدة. سيتم جلب الصفوف التي تم تعديلها بعد آخر مزامنة فقط.',
'Datetime/timestamp column for incremental sync. Only rows modified after the last sync will be fetched.',
availableSourcesDescription: 'حدد مصدر بيانات لإضافته',
availableSources: 'المصادر المتاحة',
datasourceDescription: 'إدارة مصدر البيانات والاتصالات الخاصة بك',
@ -1091,7 +1094,7 @@ export default {
'(للمستخدمين الدوليين فقط، املأ https://api.minimax.io/v1)',
modify: 'يُعدِّل',
systemModelSettings: 'تعيين النماذج الافتراضية',
chatModel: 'ماجستير',
chatModel: 'LLM',
chatModelTip: 'LLM الافتراضي لكل قاعدة معرفية تم إنشاؤها حديثًا.',
embeddingModel: 'التضمين',
embeddingModelTip:
@ -1110,8 +1113,8 @@ export default {
'النموذج الافتراضي لتحويل النص إلى كلام. إذا لم تتمكن من العثور على نموذج من القائمة المنسدلة، فراجع https://ragflow.io/docs/dev/supported_models لمعرفة ما إذا كان موفر النموذج الخاص بك يدعم هذا النموذج.',
workspace: 'مساحة العمل',
upgrade: 'يرقي',
addLlmTitle: 'أضف ماجستير',
editLlmTitle: 'تحرير {{name}} النموذج',
addLlmTitle: 'أضف LLM',
editLlmTitle: 'تحرير النموذج {{name}}',
editModel: 'تحرير النموذج',
modelName: 'اسم النموذج',
modelID: 'معرف النموذج',
@ -2342,7 +2345,7 @@ export default {
delSearch: 'حذف البحث',
delFile: 'حذف الملف',
delFiles: 'حذف الملفات',
delFilesContent: 'الملفات {{count}} المحددة',
delFilesContent: 'الملفات المحددة ({{count}})',
delChat: 'حذف الدردشة',
delMember: 'حذف العضو',
delMemory: 'حذف الذاكرة',
@ -2401,7 +2404,7 @@ export default {
providerSelection: 'اختيار المزود',
providerSelectionDescription:
'اختر موفر وضع الحماية لتنفيذ التعليمات البرمجية',
namedProviderConfiguration: '{{name}} التكوين',
namedProviderConfiguration: 'تكوين {{name}}',
namedProviderConfigurationDescription:
'قم بتكوين إعدادات الاتصال لـ {{name}}.',
saveConfiguration: 'حفظ التكوين',
@ -2465,7 +2468,7 @@ export default {
share: 'يشارك',
create: 'يخلق',
extraInfo: 'معلومات اضافية',
serviceDetail: 'خدمة {{name}} التفاصيل',
serviceDetail: 'تفاصيل الخدمة {{name}}',
taskExecutorDetail: 'تفاصيل منفذ المهمة',
whitelistManagement: 'إدارة القائمة البيضاء',
exportAsExcel: 'تصدير اكسل',
@ -2520,7 +2523,7 @@ export default {
createFirstSession: 'قم بإنشاء جلستك الأولى',
noCanvasFound: 'لم يتم العثور على قماش',
deleteSelectedConfirm:
'هل أنت متأكد أنك تريد حذف {{count}} الجلسة (الجلسات)؟',
'هل أنت متأكد أنك تريد حذف الجلسة/الجلسات ({{count}})؟',
batchDeleteSessions: 'حذف الجلسات',
},
},

View File

@ -28,6 +28,7 @@ export default {
traditionalChinese: 'Традиционен китайски',
russian: 'Руски',
bulgarian: 'Български',
arabic: 'Арабски',
language: 'Език',
languageMessage: 'Моля, въведете вашия език!',
languagePlaceholder: 'изберете вашия език',
@ -2380,6 +2381,7 @@ Important structured information may include: names, dates, locations, events, k
vietnamese: 'Виетнамски',
russian: 'Руски',
bulgarian: 'Български',
arabic: 'Арабски',
},
pagination: {
total: 'Общо {{total}}',

View File

@ -29,6 +29,7 @@ export default {
traditionalChinese: 'Traditionelles Chinesisch',
russian: 'Russisch',
bulgarian: 'Bulgarisch',
arabic: 'Arabisch',
german: 'Deutsch',
language: 'Sprache',
languageMessage: 'Bitte geben Sie Ihre Sprache ein!',
@ -2439,6 +2440,7 @@ Wichtige strukturierte Informationen können sein: Namen, Daten, Orte, Ereigniss
vietnamese: 'Vietnamesisch',
russian: 'Russisch',
bulgarian: 'Bulgarisch',
arabic: 'Arabisch',
},
pagination: {
total: 'Gesamt {{total}}',

View File

@ -2478,6 +2478,7 @@ Important structured information may include: names, dates, locations, events, k
vietnamese: 'Vietnamese',
russian: 'Russian',
bulgarian: 'Bulgarian',
arabic: 'Arabic',
},
pagination: {
total: 'Total {{total}}',

View File

@ -20,6 +20,7 @@ export default {
chinese: 'Chino simplificado',
traditionalChinese: 'Chino tradicional',
bulgarian: 'Búlgaro',
arabic: 'Árabe',
language: 'Idioma',
languageMessage: '¡Por favor ingresa tu idioma!',
languagePlaceholder: 'Selecciona tu idioma',
@ -936,5 +937,12 @@ export default {
knowledge: 'Conocimiento',
chat: 'Chat',
},
language: {
english: 'Ingles',
chinese: 'Chino',
russian: 'Ruso',
bulgarian: 'Búlgaro',
arabic: 'Árabe',
},
},
};

View File

@ -20,6 +20,7 @@ export default {
chinese: 'Chinois simplifié',
traditionalChinese: 'Chinois traditionnel',
bulgarian: 'Bulgare',
arabic: 'Arabe',
language: 'Langue',
languageMessage: 'Veuillez saisir votre langue !',
languagePlaceholder: 'Sélectionnez votre langue',
@ -41,6 +42,7 @@ export default {
previousPage: 'Précédent',
nextPage: 'Suivant',
add: 'Ajouter',
arabic: 'Arabe',
promptPlaceholder:
'Veuillez saisir ou utilisez / pour insérer rapidement des variables.',
},
@ -477,6 +479,13 @@ export default {
crossLanguage: 'Recherche inter-langues',
crossLanguageTip: `Sélectionnez une ou plusieurs langues pour la recherche inter-langues. Si aucune langue nest sélectionnée, le système recherche avec la requête originale.`,
},
language: {
english: 'Anglais',
chinese: 'Chinois',
russian: 'Russe',
bulgarian: 'Bulgare',
arabic: 'Arabe',
},
setting: {
profile: 'Profil',
avatar: 'Avatar',
@ -681,7 +690,7 @@ export default {
'Si votre fournisseur de modèle n\'est pas listé mais prétend être "compatible OpenAI", sélectionnez la carte compatible OpenAI-API pour ajouter le(s) modèle(s) pertinent(s).',
mcp: 'MCP',
dingtalkAITableDescription:
'Connectez-vous à Dingtalk AI Table et synchronisez les enregistrements d\'une table spécifiée.',
"Connectez-vous à Dingtalk AI Table et synchronisez les enregistrements d'une table spécifiée.",
},
message: {
registered: 'Enregistré !',

View File

@ -20,6 +20,7 @@ export default {
chinese: 'Cina',
traditionalChinese: 'Cina Tradisional',
bulgarian: 'Bulgaria',
arabic: 'Arab',
language: 'Bahasa',
languageMessage: 'Silakan masukkan bahasa Anda!',
languagePlaceholder: 'Pilih bahasa Anda',
@ -139,7 +140,7 @@ export default {
toMessage: 'Nomor halaman akhir hilang (tidak termasuk)',
layoutRecognize: 'Pengenalan tata letak',
layoutRecognizeTip:
'Gunakan model visual untuk analisis tata letak untuk lebih mengidentifikasi struktur dokumen, menemukan di mana judul, blok teks, gambar, dan tabel berada. Tanpa fitur ini, hanya teks biasa dari PDF yang dapat diperoleh. Untuk informasi lebih lanjut, lihat https://ragflow.io/docs/dev/select_pdf_parser.',
'Gunakan model visual untuk analisis tata letak untuk lebih mengidentifikasi struktur dokumen, menemukan di mana judul, blok teks, gambar, and tabel berada. Tanpa fitur ini, hanya teks biasa dari PDF yang dapat diperoleh. Untuk informasi lebih lanjut, lihat https://ragflow.io/docs/dev/select_pdf_parser.',
taskPageSize: 'Ukuran halaman tugas',
taskPageSizeMessage: 'Silakan masukkan ukuran halaman tugas Anda!',
taskPageSizeTip: `Jika menggunakan pengenalan tata letak, file PDF akan dibagi menjadi kelompok berturut-turut. Analisis tata letak akan dilakukan secara paralel antar kelompok untuk meningkatkan kecepatan pemrosesan. 'Ukuran halaman tugas' menentukan ukuran kelompok. Semakin besar ukuran halaman, semakin kecil kemungkinan teks berkelanjutan antara halaman dibagi menjadi potongan yang berbeda.`,
@ -284,15 +285,15 @@ export default {
</p><p>
Untuk dokumen, akan diperlakukan sebagai potongan utuh, tidak ada pemisahan sama sekali.
</p><p>
Jika Anda ingin merangkum sesuatu yang membutuhkan semua konteks dari sebuah artikel dan panjang konteks LLM yang dipilih mencakup panjang dokumen, Anda dapat mencoba metode ini.
Jika Anda ingin merangkum sesuatu yang membutuhkan semua konteks dari sebuah artikel and panjang konteks LLM yang dipilih mencakup panjang dokumen, Anda dapat mencoba metode ini.
</p>`,
knowledgeGraph: `<p>Format file yang didukung adalah <b>DOCX, EXCEL, PPT, IMAGE, PDF, TXT, MD, JSON, EML</b>
<p>Setelah file dipotong, digunakan potongan untuk mengekstrak grafik pengetahuan dan peta pikiran dari seluruh dokumen. Metode ini menerapkan cara naif untuk memotong file:
Teks berturut-turut akan dipotong menjadi potongan masing-masing yang berjumlah sekitar 512 token.</p>
<p>Selanjutnya, potongan akan dikirim ke LLM untuk mengekstrak node dan hubungan dari grafik pengetahuan, dan peta pikiran.</p>
Perhatikan jenis entitas yang perlu Anda tentukan.</p>`,
<p>Setelah file dipotong, digunakan potongan untuk mengekstrak grafik pengetahuan dan peta pikiran dari seluruh dokumen. Metode ini menerapkan cara naif untuk memotong file:
Teks berturut-turut akan dipotong menjadi potongan masing-masing yang berjumlah sekitar 512 token.</p>
<p>Selanjutnya, potongan akan dikirim ke LLM untuk mengekstrak node dan hubungan dari grafik pengetahuan, dan peta pikiran.</p>
Perhatikan jenis entitas yang perlu Anda tentukan.</p>`,
useRaptor: 'Gunakan RAPTOR untuk meningkatkan pengambilan',
useRaptorTip:
'Aktifkan RAPTOR untuk tugas tanya jawab multi-langkah. Lihat https://ragflow.io/docs/dev/enable_raptor untuk informasi lebih lanjut.',
@ -384,7 +385,7 @@ export default {
Di atas adalah basis pengetahuan.`,
systemMessage: 'Silakan masukkan!',
systemTip:
'Instruksi yang perlu diikuti LLM saat menjawab pertanyaan, seperti desain karakter, panjang jawaban, dan bahasa jawaban, dll. Jika model Anda memiliki dukungan bawaan untuk penalaran, Anda dapat menambahkan //no_thinking ke prompt untuk menghentikan penalaran.',
'Instruksi yang perlu diikuti LLM saat menjawab pertanyaan, seperti desain karakter, panjang jawaban, and bahasa jawaban, dll. Jika model Anda memiliki dukungan bawaan untuk penalaran, Anda dapat menambahkan //no_thinking ke prompt untuk menghentikan penalaran.',
topN: 'Top N',
topNTip: `Tidak semua potongan yang skor kesamaannya di atas 'ambang kesamaan' akan diberikan ke LLM. LLM hanya dapat melihat potongan 'Top N' ini.`,
variable: 'Variabel',
@ -400,6 +401,7 @@ export default {
improvise: 'Improvisasi',
precise: 'Tepat',
balance: 'Seimbang',
custom: 'Custom',
freedomTip: `'Tepat' berarti LLM akan berhati-hati dan menjawab pertanyaan Anda dengan hati-hati. 'Improvisasi' berarti Anda ingin LLM berbicara banyak dan bebas. 'Seimbang' adalah antara berhati-hati dan bebas.`,
temperature: 'Temperatur',
temperatureMessage: 'Temperatur diperlukan',
@ -667,6 +669,17 @@ export default {
'Silakan tambahkan model embedding dan LLM di <b>Pengaturan > Penyedia Model</b> terlebih dahulu. Kemudian, atur keduanya di "Atur model default".',
apiVersion: 'Versi API',
apiVersionMessage: 'Silakan masukkan versi API',
add: 'Tambah',
updateDate: 'Tanggal diperbarui',
role: 'Peran',
invite: 'Undang',
agree: 'Setuju',
refuse: 'Tolak',
teamMembers: 'Anggota tim',
joinedTeams: 'Tim yang diikuti',
sureDelete: 'Apakah Anda yakin ingin menghapus anggota ini?',
quit: 'Keluar',
sureQuit: 'Apakah Anda yakin ingin keluar dari tim yang Anda ikuti?',
modelsToBeAddedTooltip:
'Jika penyedia model Anda tidak tercantum tetapi mengklaim kompatibel dengan OpenAI, pilih kartu OpenAI-API-compatible untuk menambahkan model yang relevan.',
dingtalkAITableDescription:
@ -910,7 +923,7 @@ export default {
dan: 'Denmark',
fin: 'Finlandia',
cs: 'Ceko',
rom: 'Rumania',
rom: 'Rumano',
slo: 'Slovenia',
swe: 'Swedia',
hu: 'Hungaria',
@ -1027,7 +1040,7 @@ export default {
},
akShare: 'AkShare',
akShareDescription:
'Komponen ini dapat digunakan untuk mendapatkan ringkasan berita keuangan dari situs web keuangan utama, membantu penelitian industri dan kuantitatif.',
'Este componente se puede usar para obtener información de noticias para la acción correspondiente del sitio web de Eastmoney.',
yahooFinance: 'YahooFinance',
yahooFinanceDescription:
'Komponen ini menanyakan informasi tentang perusahaan berdasarkan simbol ticker yang diberikan.',
@ -1082,14 +1095,14 @@ export default {
},
concentrator: 'Konsentrator',
concentratorDescription:
'Komponen yang menerima output dari komponen hulu dan meneruskannya sebagai input ke komponen hilir.',
'Un componente que recibe la salida del componente anterior y la pasa como entrada a los componentes posteriores.',
tuShare: 'TuShare',
tuShareDescription:
'Komponen ini dapat digunakan untuk mendapatkan ringkasan berita keuangan dari situs web keuangan utama, membantu penelitian industri dan kuantitatif.',
'Este componente se puede usar para obtener breves noticias financieras de sitios web financieros de referencia, lo que ayuda a la investigación industrial y cuantitativa.',
tuShareSrcOptions: {
sina: 'Sina',
wallstreetcn: 'wallstreetcn',
'10jqka': 'Flush langsung',
'10jqka': 'Flush recto',
eastmoney: 'Eastmoney',
yuncaijing: 'YUNCAIJING',
fenghuang: 'FENGHUANG',
@ -1103,6 +1116,7 @@ export default {
note: 'Catatan',
noteDescription: 'Catatan',
notePlaceholder: 'Silakan masukkan catatan',
runningHintText: 'sedang berjalan...🕞',
invoke: 'Permintaan HTTP',
invokeDescription:
@ -1121,15 +1135,16 @@ export default {
promptTip:
'Gunakan prompt sistem untuk menjelaskan tugas untuk LLM, tentukan bagaimana harus merespons, dan menguraikan persyaratan lainnya. Prompt sistem sering digunakan bersama dengan kunci (variabel), yang berfungsi sebagai berbagai input data untuk LLM. Gunakan garis miring `/` atau tombol (x) untuk menampilkan kunci yang digunakan.',
promptMessage: 'Prompt diperlukan',
runningHintText: 'sedang berjalan...🕞',
},
footer: {
profile: 'Semua hak dilindungi @ React',
},
layout: {
file: 'file',
knowledge: 'pengetahuan',
chat: 'obrolan',
language: {
english: 'Inggris',
chinese: 'Cina',
russian: 'Rusia',
bulgarian: 'Bulgaria',
arabic: 'Arab',
},
},
};

View File

@ -28,6 +28,7 @@ export default {
traditionalChinese: 'Cinese tradizionale',
russian: 'Russo',
bulgarian: 'Bulgaro',
arabic: 'Arabo',
italian: 'Italiano',
german: 'Tedesco',
french: 'Francese',
@ -1198,6 +1199,7 @@ Quanto sopra è il contenuto che devi riassumere.`,
vietnamese: 'Vietnamita',
russian: 'Russo',
bulgarian: 'Bulgaro',
arabic: 'Arabo',
},
pagination: {
total: 'Totale {{total}}',

View File

@ -20,6 +20,7 @@ export default {
chinese: '中国語(簡体字)',
traditionalChinese: '中国語(繁体字)',
bulgarian: 'ブルガリア語',
arabic: 'アラビア語',
language: '言語',
languageMessage: 'あなたの言語を入力してください!',
languagePlaceholder: 'あなたの言語を選択してください',
@ -1200,5 +1201,12 @@ export default {
knowledge: 'ナレッジ',
chat: 'チャット',
},
language: {
english: '英語',
chinese: '中国語',
russian: 'ロシア語',
bulgarian: 'ブルガリア語',
arabic: 'アラビア語',
},
},
};

View File

@ -19,6 +19,7 @@ export default {
chinese: 'Chinês Simplificado',
traditionalChinese: 'Chinês Tradicional',
bulgarian: 'Búlgaro',
arabic: 'Árabe',
language: 'Idioma',
languageMessage: 'Por favor, insira seu idioma!',
languagePlaceholder: 'selecione seu idioma',
@ -1200,5 +1201,12 @@ export default {
knowledge: 'conhecimento',
chat: 'bate-papo',
},
language: {
english: 'Inglês',
chinese: 'Chinês',
russian: 'Russo',
bulgarian: 'Búlgaro',
arabic: 'Árabe',
},
},
};

View File

@ -27,6 +27,7 @@ export default {
traditionalChinese: 'Китайский традиционный',
russian: 'Русский',
bulgarian: 'Болгарский',
arabic: 'Арабский',
language: 'Язык',
languageMessage: 'Пожалуйста, укажите ваш язык!',
languagePlaceholder: 'выберите ваш язык',
@ -2044,6 +2045,7 @@ export default {
vietnamese: 'Вьетнамский',
russian: 'Русский',
bulgarian: 'Болгарский',
arabic: 'Арабский',
},
pagination: {
total: 'Всего {{total}}',

View File

@ -19,6 +19,7 @@ export default {
chinese: 'Tiếng Trung giản thể',
traditionalChinese: 'Tiếng Trung phồn thể',
bulgarian: 'Tiếng Bulgaria',
arabic: 'Tiếng Ả Rập',
language: 'Ngôn ngữ',
languageMessage: 'Vui lòng chọn ngôn ngữ của bạn!',
languagePlaceholder: 'chọn ngôn ngữ của bạn',
@ -1248,5 +1249,12 @@ export default {
knowledge: 'kiến thức',
chat: 'trò chuyện',
},
language: {
english: 'Tiếng Anh',
chinese: 'Tiếng Trung',
russian: 'Tiếng Nga',
bulgarian: 'Tiếng Bulgaria',
arabic: 'Tiếng Ả Rập',
},
},
};

View File

@ -19,6 +19,7 @@ export default {
chinese: '簡體中文',
traditionalChinese: '繁體中文',
bulgarian: '保加利亞語',
arabic: '阿拉伯語',
language: '語言',
languageMessage: '請輸入語言',
languagePlaceholder: '請選擇語言',
@ -563,8 +564,7 @@ export default {
avatar: '头像',
avatarTip: '這會在你的個人主頁展示',
profileDescription: '在此更新您的照片和個人詳細信息。',
dingtalkAITableDescription:
'連接釘釘AI表格同步指定表格中的記錄。',
dingtalkAITableDescription: '連接釘釘AI表格同步指定表格中的記錄。',
gitlabDescription:
'連接 GitLab同步儲存庫、Issue、合併請求MR及相關文件內容。',
bedrockCredentialsHint:
@ -1281,6 +1281,13 @@ export default {
knowledge: '知識',
chat: '聊天',
},
language: {
english: '英語',
chinese: '簡體中文',
russian: '俄語',
bulgarian: '保加利亞語',
arabic: '阿拉伯語',
},
modal: {
okText: '確認',
cancelText: '取消',

View File

@ -27,6 +27,7 @@ export default {
chinese: '简体中文',
traditionalChinese: '繁体中文',
bulgarian: '保加利亚语',
arabic: '阿拉伯语',
language: '语言',
languageMessage: '请输入语言',
languagePlaceholder: '请选择语言',
@ -2143,6 +2144,7 @@ Tokenizer 会根据所选方式将内容存储为对应的数据结构。`,
korean: '韩语',
vietnamese: '越南语',
bulgarian: '保加利亚语',
arabic: '阿拉伯语',
},
pagination: {
total: '总共 {{total}} 条',

View File

@ -8,7 +8,7 @@
border: none;
display: block;
padding: 0.5em;
text-align: left;
text-align: start;
width: 100%;
}

View File

@ -19,7 +19,7 @@
.categorizeAnchorPointText {
position: absolute;
top: -4px;
left: 8px;
inset-inline-start: 8px;
white-space: nowrap;
}
}
@ -33,8 +33,8 @@
.selectedIterationNode {
border-bottom: 1.5px solid rgb(59, 118, 244);
border-left: 1.5px solid rgb(59, 118, 244);
border-right: 1.5px solid rgb(59, 118, 244);
border-inline-start: 1.5px solid rgb(59, 118, 244);
border-inline-end: 1.5px solid rgb(59, 118, 244);
}
.iterationHeader {
@ -43,8 +43,8 @@
.selectedHeader {
border-top: 1.9px solid rgb(59, 118, 244);
border-left: 1.9px solid rgb(59, 118, 244);
border-right: 1.9px solid rgb(59, 118, 244);
border-inline-start: 1.9px solid rgb(59, 118, 244);
border-inline-end: 1.9px solid rgb(59, 118, 244);
}
.handle {
@ -88,7 +88,7 @@
.categorizeAnchorPointText {
position: absolute;
top: -4px;
left: 8px;
inset-inline-start: 8px;
white-space: nowrap;
}
.relevantSourceLabel {
@ -108,22 +108,22 @@
background-color: #edfcff;
font-size: 12px;
padding: 6px 6px 4px;
border-top-left-radius: 10px;
border-top-right-radius: 10px;
border-start-start-radius: 10px;
border-start-end-radius: 10px;
}
.noteTitleDark {
background-color: #edfcff;
font-size: 12px;
padding: 6px 6px 4px;
border-top-left-radius: 10px;
border-top-right-radius: 10px;
border-start-start-radius: 10px;
border-start-end-radius: 10px;
}
.noteForm {
margin-top: 4px;
height: calc(100% - 50px);
}
.noteName {
padding: 0px 4px;
padding-inline: 4px;
}
.noteTextarea {
resize: none;
@ -139,8 +139,8 @@
.iterationNode {
.commonNodeShadow();
border-bottom-left-radius: 10px;
border-bottom-right-radius: 10px;
border-end-start-radius: 10px;
border-end-end-radius: 10px;
}
.nodeText {
@ -183,7 +183,7 @@
}
.relevantLabel {
text-align: right;
text-align: end;
}
.knowledgeNodeName {
@ -246,7 +246,7 @@
.expandIcon {
position: absolute;
right: 8px;
inset-inline-end: 8px;
top: 50%;
transform: translateY(-50%);
color: #666;

View File

@ -25,7 +25,7 @@
.pageContent {
flex: 1;
width: 100%;
padding-right: 12px;
padding-inline-end: 12px;
overflow-y: auto;
.spin {
@ -50,7 +50,7 @@
.pageFooter {
padding-top: 10px;
padding-right: 10px;
padding-inline-end: 10px;
height: 32px;
}
}
@ -77,7 +77,7 @@
height: 20px;
.text {
margin-left: 10px;
margin-inline-start: 10px;
}
}
}

View File

@ -25,7 +25,7 @@
.pageContent {
flex: 1;
width: 100%;
padding-right: 12px;
padding-inline-end: 12px;
overflow-y: auto;
.spin {
@ -50,7 +50,7 @@
.pageFooter {
padding-top: 10px;
padding-right: 10px;
padding-inline-end: 10px;
height: 32px;
}
}
@ -77,7 +77,7 @@
height: 20px;
.text {
margin-left: 10px;
margin-inline-start: 10px;
}
}
}

View File

@ -40,9 +40,12 @@ export function Banner() {
}
export function NextBanner() {
const { t } = useTranslation();
const { t, i18n } = useTranslation();
return (
<h1 className="text-5xl leading-normal">
<h1
className="text-5xl leading-normal text-left"
dir={i18n.language?.startsWith('ar') ? 'rtl' : 'ltr'}
>
<span className="font-semibold text-text-primary">
{t('header.welcome')}{' '}
</span>

View File

@ -4,7 +4,7 @@
content: '';
position: absolute;
top: 0;
left: 0;
inset-inline-start: 0;
width: 100%;
height: 100%;
stroke-dasharray: 660;

View File

@ -1,11 +1,11 @@
.selectFilesCollapse {
:global(.ant-collapse-header) {
padding-left: 22px;
padding-inline-start: 22px;
}
margin-bottom: 32px;
overflow-y: auto;
}
.selectFilesTitle {
padding-right: 10px;
padding-inline-end: 10px;
}

View File

@ -1,7 +1,7 @@
.modelContainer {
width: 100%;
.factoryOperationWrapper {
text-align: right;
text-align: end;
}
.llmList {
padding-top: 10px;