diff --git a/README.md b/README.md
index bda071a86d..e3c89bc6ad 100644
--- a/README.md
+++ b/README.md
@@ -13,6 +13,7 @@
+
diff --git a/README_ar.md b/README_ar.md
new file mode 100644
index 0000000000..d2e3f062c5
--- /dev/null
+++ b/README_ar.md
@@ -0,0 +1,412 @@
+
:80`.
+
+تتطلب تحديثات التكوينات المذكورة أعلاه إعادة تشغيل جميع الحاويات لتصبح سارية المفعول:
+
+> ```bash
+> $ docker compose -f docker-compose.yml up -d
+> ```
+
+### تبديل محرك المستندات من Elasticsearch إلى Infinity
+
+RAGFlow يستخدم Elasticsearch بشكل افتراضي لتخزين النص الكامل والمتجهات. للتبديل إلى [Infinity](https://github.com/infiniflow/infinity/)، اتبع الخطوات التالية:
+
+1. إيقاف كافة الحاويات قيد التشغيل:
+
+ ```bash
+ $ docker compose -f docker/docker-compose.yml down -v
+ ```
+
+> [!WARNING]
+> `-v` سوف يحذف docker وحدات تخزين الحاوية، وسيتم مسح البيانات الموجودة.
+
+2. اضبط `DOC_ENGINE` في **docker/.env** على `infinity`.
+3. ابدأ الحاويات:
+
+ ```bash
+ $ docker compose -f docker-compose.yml up -d
+ ```
+
+> [!WARNING]
+> التبديل إلى Infinity على جهاز Linux/arm64 غير مدعوم رسميًا بعد.
+
+## 🔧 أنشئ صورة Docker
+
+يبلغ حجم هذه الصورة حوالي 2 غيغابايت وتعتمد على خدمات LLM وembedding الخارجية.
+
+```bash
+git clone https://github.com/infiniflow/ragflow.git
+cd ragflow/
+docker build --platform linux/amd64 -f Dockerfile -t infiniflow/ragflow:nightly .
+```
+
+أو إذا كنت خلف وكيل، فيمكنك تمرير وسيطات الوكيل:
+
+```bash
+docker build --platform linux/amd64 \
+ --build-arg http_proxy=http://YOUR_PROXY:PORT \
+ --build-arg https_proxy=http://YOUR_PROXY:PORT \
+ -f Dockerfile -t infiniflow/ragflow:nightly .
+```
+
+## 🔨 إطلاق الخدمة من المصدر للتطوير
+
+1. قم بتثبيت `uv` و`pre-commit`، أو قم بتخطي هذه الخطوة إذا كانا مثبتين بالفعل:
+
+ ```bash
+ pipx install uv pre-commit
+ ```
+2. استنساخ الكود المصدري وتثبيت تبعيات بايثون:
+
+ ```bash
+ git clone https://github.com/infiniflow/ragflow.git
+ cd ragflow/
+ uv sync --python 3.12 # install RAGFlow dependent python modules
+ uv run download_deps.py
+ pre-commit install
+ ```
+3. قم بتشغيل الخدمات التابعة (MinIO وElasticsearch وRedis وMySQL) باستخدام Docker Compose:
+
+ ```bash
+ docker compose -f docker/docker-compose-base.yml up -d
+ ```
+
+ أضف السطر التالي إلى `/etc/hosts` لحل كافة المضيفين المحددين في **docker/.env** إلى `127.0.0.1`:
+
+ ```
+ 127.0.0.1 es01 infinity mysql minio redis sandbox-executor-manager
+ ```
+4. إذا لم تتمكن من الوصول إلى HuggingFace، فقم بتعيين متغير البيئة `HF_ENDPOINT` لاستخدام موقع مرآة:
+
+ ```bash
+ export HF_ENDPOINT=https://hf-mirror.com
+ ```
+5. إذا كان نظام التشغيل لديك لا يحتوي على jemalloc، فيرجى تثبيته على النحو التالي:
+
+ ```bash
+ # Ubuntu
+ sudo apt-get install libjemalloc-dev
+ # CentOS
+ sudo yum install jemalloc
+ # OpenSUSE
+ sudo zypper install jemalloc
+ # macOS
+ sudo brew install jemalloc
+ ```
+6. إطلاق الخدمة الخلفية:
+
+ ```bash
+ source .venv/bin/activate
+ export PYTHONPATH=$(pwd)
+ bash docker/launch_backend_service.sh
+ ```
+7. تثبيت تبعيات الواجهة الأمامية:
+
+ ```bash
+ cd web
+ npm install
+ ```
+8. إطلاق خدمة الواجهة الأمامية:
+
+ ```bash
+ npm run dev
+ ```
+
+ _النتيجة التالية تؤكد الإطلاق الناجح للنظام:_
+
+ 
+9. أوقف خدمة الواجهة الأمامية والخلفية RAGFlow بعد اكتمال التطوير:
+
+ ```bash
+ pkill -f "ragflow_server.py|task_executor.py"
+ ```
+
+## 📚 التوثيق
+
+- [البدء السريع](https://ragflow.io/docs/dev/)
+- [التكوين](https://ragflow.io/docs/dev/configurations)
+- [ملاحظات الإصدار](https://ragflow.io/docs/dev/release_notes)
+- [أدلة المستخدم](https://ragflow.io/docs/dev/category/guides)
+- [أدلة المطورين](https://ragflow.io/docs/dev/category/developers)
+- [المراجع](https://ragflow.io/docs/dev/category/references)
+- [الأسئلة الشائعة](https://ragflow.io/docs/dev/faq)
+
+## 📜 Roadmap
+
+راجع [RAGFlow Roadmap 2026](https://github.com/infiniflow/ragflow/issues/12241)
+
+## 🏄 المجتمع
+
+- [Discord](https://discord.gg/NjYzJD3GM3)
+- [Twitter](https://twitter.com/infiniflowai)
+- [مناقشات جيثب](https://github.com/orgs/infiniflow/discussions)
+
+## 🙌 المساهمة
+
+RAGFlow يزدهر من خلال التعاون مفتوح المصدر. وبهذه الروح، فإننا نحتضن المساهمات المتنوعة من المجتمع.
+إذا كنت ترغب في أن تكون جزءًا، فراجع [إرشادات المساهمة](https://ragflow.io/docs/dev/contributing) أولاً.
diff --git a/README_fr.md b/README_fr.md
index 4f311df0a0..3f8555edf6 100644
--- a/README_fr.md
+++ b/README_fr.md
@@ -13,6 +13,7 @@
+
diff --git a/README_id.md b/README_id.md
index c1954dc556..8a7d2715f7 100644
--- a/README_id.md
+++ b/README_id.md
@@ -13,6 +13,7 @@
+
diff --git a/README_ja.md b/README_ja.md
index 9a0538809c..03f6a5b477 100644
--- a/README_ja.md
+++ b/README_ja.md
@@ -13,6 +13,7 @@
+
diff --git a/README_ko.md b/README_ko.md
index 79703a62d6..55a03b2919 100644
--- a/README_ko.md
+++ b/README_ko.md
@@ -13,6 +13,7 @@
+
diff --git a/README_pt_br.md b/README_pt_br.md
index 8e75e8cb03..0d162ca672 100644
--- a/README_pt_br.md
+++ b/README_pt_br.md
@@ -13,6 +13,7 @@
+
diff --git a/README_tzh.md b/README_tzh.md
index 1b1508bee9..e7b21fe53e 100644
--- a/README_tzh.md
+++ b/README_tzh.md
@@ -13,6 +13,7 @@
+
diff --git a/README_zh.md b/README_zh.md
index 99a65cdd46..ef64dc1786 100644
--- a/README_zh.md
+++ b/README_zh.md
@@ -13,6 +13,7 @@
+
diff --git a/web/src/app.tsx b/web/src/app.tsx
index 8a0fc46f6b..4d84b8b3bb 100644
--- a/web/src/app.tsx
+++ b/web/src/app.tsx
@@ -1,10 +1,11 @@
import { Toaster as Sonner } from '@/components/ui/sonner';
import { Toaster } from '@/components/ui/toaster';
-import i18n from '@/locales/config';
+import i18n, { changeLanguageAsync } from '@/locales/config';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { configResponsive } from 'ahooks';
import { App, ConfigProvider, ConfigProviderProps, theme } from 'antd';
import pt_BR from 'antd/lib/locale/pt_BR';
+import arEG from 'antd/locale/ar_EG';
import deDE from 'antd/locale/de_DE';
import enUS from 'antd/locale/en_US';
import ru_RU from 'antd/locale/ru_RU';
@@ -54,6 +55,7 @@ const AntLanguageMap = {
vi: vi_VN,
'pt-BR': pt_BR,
de: deDE,
+ ar: arEG,
};
if (process.env.NODE_ENV === 'development') {
@@ -85,6 +87,12 @@ function Root({ children }: React.PropsWithChildren) {
const { theme: themeragflow } = useTheme();
const getLocale = (lng: string) =>
AntLanguageMap[lng as keyof typeof AntLanguageMap] ?? enUS;
+ const updateDocumentLocale = (lng: string) => {
+ document.documentElement.lang = lng;
+ document.documentElement.dir = lng.toLowerCase().startsWith('ar')
+ ? 'rtl'
+ : 'ltr';
+ };
const [locale, setLocal] = useState(getLocale(storage.getLanguage()));
@@ -92,9 +100,10 @@ function Root({ children }: React.PropsWithChildren) {
const handleLanguageChanged = (lng: string) => {
storage.setLanguage(lng);
setLocal(getLocale(lng));
- document.documentElement.lang = lng;
+ updateDocumentLocale(lng);
};
+ updateDocumentLocale(storage.getLanguage() || i18n.language || 'en');
i18n.on('languageChanged', handleLanguageChanged);
return () => {
@@ -130,7 +139,7 @@ const RootProvider = ({ children }: React.PropsWithChildren) => {
useEffect(() => {
const lng = storage.getLanguage();
if (lng) {
- i18n.changeLanguage(lng);
+ void changeLanguageAsync(lng);
}
}, []);
diff --git a/web/src/components/empty/constant.tsx b/web/src/components/empty/constant.tsx
index 811c27a5b6..641920041d 100644
--- a/web/src/components/empty/constant.tsx
+++ b/web/src/components/empty/constant.tsx
@@ -1,4 +1,3 @@
-import { t } from 'i18next';
import { HomeIcon } from '../svg-icon';
export enum EmptyType {
@@ -17,27 +16,27 @@ export enum EmptyCardType {
export const EmptyCardData = {
[EmptyCardType.Agent]: {
icon: ,
- title: t('empty.agentTitle'),
- notFound: t('empty.notFoundAgent'),
+ titleKey: 'empty.agentTitle',
+ notFoundKey: 'empty.notFoundAgent',
},
[EmptyCardType.Dataset]: {
icon: ,
- title: t('empty.datasetTitle'),
- notFound: t('empty.notFoundDataset'),
+ titleKey: 'empty.datasetTitle',
+ notFoundKey: 'empty.notFoundDataset',
},
[EmptyCardType.Chat]: {
icon: ,
- title: t('empty.chatTitle'),
- notFound: t('empty.notFoundChat'),
+ titleKey: 'empty.chatTitle',
+ notFoundKey: 'empty.notFoundChat',
},
[EmptyCardType.Search]: {
icon: ,
- title: t('empty.searchTitle'),
- notFound: t('empty.notFoundSearch'),
+ titleKey: 'empty.searchTitle',
+ notFoundKey: 'empty.notFoundSearch',
},
[EmptyCardType.Memory]: {
icon: ,
- title: t('empty.memoryTitle'),
- notFound: t('empty.notFoundMemory'),
+ titleKey: 'empty.memoryTitle',
+ notFoundKey: 'empty.notFoundMemory',
},
};
diff --git a/web/src/components/empty/empty.tsx b/web/src/components/empty/empty.tsx
index c6f6f1f6c9..fbb97506f6 100644
--- a/web/src/components/empty/empty.tsx
+++ b/web/src/components/empty/empty.tsx
@@ -4,6 +4,7 @@ import { useIsDarkTheme } from '../theme-provider';
import { Plus } from 'lucide-react';
import { useMemo } from 'react';
+import { useTranslation } from 'react-i18next';
import SvgIcon from '../svg-icon';
import { EmptyCardData, EmptyCardType, EmptyType } from './constant';
import { EmptyCardProps, EmptyProps } from './interface';
@@ -82,8 +83,13 @@ export const EmptyAppCard = (props: {
testId?: string;
}) => {
const { type, showIcon, className, isSearch, children, testId } = props;
+ const { t } = useTranslation();
let defaultClass = '';
let style = {};
+ const cardData = EmptyCardData[type];
+ const title = t(cardData.titleKey);
+ const notFound = t(cardData.notFoundKey);
+
switch (props.size) {
case 'small':
style = { width: '256px' };
@@ -100,10 +106,8 @@ export const EmptyAppCard = (props: {
return (
{children}
-
+
));
DropdownMenuSubTrigger.displayName =
@@ -85,7 +85,7 @@ const DropdownMenuItem = React.forwardRef<
ref={ref}
className={cn(
'relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',
- inset && 'pl-8',
+ inset && 'ps-8',
justifyBetween && 'flex justify-between',
className,
)}
@@ -101,13 +101,13 @@ const DropdownMenuCheckboxItem = React.forwardRef<
-
+
@@ -125,12 +125,12 @@ const DropdownMenuRadioItem = React.forwardRef<
-
+
@@ -150,7 +150,7 @@ const DropdownMenuLabel = React.forwardRef<
ref={ref}
className={cn(
'px-2 py-1.5 text-sm font-semibold',
- inset && 'pl-8',
+ inset && 'ps-8',
className,
)}
{...props}
@@ -176,7 +176,7 @@ const DropdownMenuShortcut = ({
}: React.HTMLAttributes) => {
return (
);
diff --git a/web/src/components/ui/input.tsx b/web/src/components/ui/input.tsx
index a84828d519..f742b0256d 100644
--- a/web/src/components/ui/input.tsx
+++ b/web/src/components/ui/input.tsx
@@ -80,8 +80,9 @@ const Input = React.forwardRef(
className,
)}
style={{
- paddingLeft: !!prefix && prefixWidth ? `${prefixWidth}px` : '',
- paddingRight: isPasswordInput
+ paddingInlineStart:
+ !!prefix && prefixWidth ? `${prefixWidth}px` : '',
+ paddingInlineEnd: isPasswordInput
? '40px'
: !!suffix
? `${suffixWidth}px`
@@ -109,7 +110,7 @@ const Input = React.forwardRef(
{prefix && (
{prefix}
@@ -118,8 +119,8 @@ const Input = React.forwardRef(
{suffix && (
{suffix}
@@ -130,7 +131,7 @@ const Input = React.forwardRef(
type="button"
className="
p-2 text-text-secondary
- absolute border-0 right-1 top-[50%] translate-y-[-50%]
+ absolute border-0 end-1 top-[50%] translate-y-[-50%]
dark:peer-autofill/input:text-text-secondary-inverse
dark:peer-autofill/input:hover:text-text-primary-inverse
dark:peer-autofill/input:focus-visible:text-text-primary-inverse
@@ -165,7 +166,7 @@ const SearchInput = (props: InputProps) => {
}
+ prefix={ }
/>
);
};
diff --git a/web/src/components/ui/modal/modal.tsx b/web/src/components/ui/modal/modal.tsx
index 6e8883ed0d..4003f49783 100644
--- a/web/src/components/ui/modal/modal.tsx
+++ b/web/src/components/ui/modal/modal.tsx
@@ -164,7 +164,7 @@ const Modal: ModalType = ({
)}
>
{confirmLoading && (
-
+
)}
{okText ?? t('modal.okText')}
@@ -253,7 +253,7 @@ const Modal: ModalType = ({
{closeIcon}
diff --git a/web/src/components/ui/select.tsx b/web/src/components/ui/select.tsx
index f88208702f..b4bd825ab7 100644
--- a/web/src/components/ui/select.tsx
+++ b/web/src/components/ui/select.tsx
@@ -129,7 +129,7 @@ const SelectLabel = React.forwardRef<
>(({ className, ...props }, ref) => (
));
@@ -142,13 +142,13 @@ const SelectItem = React.forwardRef<
-
+
diff --git a/web/src/components/ui/sheet.tsx b/web/src/components/ui/sheet.tsx
index 7ac191fefc..56a1b029d2 100644
--- a/web/src/components/ui/sheet.tsx
+++ b/web/src/components/ui/sheet.tsx
@@ -50,7 +50,8 @@ const sheetVariants = cva(
);
interface SheetContentProps
- extends React.ComponentPropsWithoutRef,
+ extends
+ React.ComponentPropsWithoutRef,
VariantProps {
closeIcon?: boolean;
}
@@ -72,7 +73,7 @@ const SheetContent = React.forwardRef<
>
{children}
{closeIcon ? (
-
+
Close
diff --git a/web/src/constants/common.ts b/web/src/constants/common.ts
index 4ef093b996..f988d535f4 100644
--- a/web/src/constants/common.ts
+++ b/web/src/constants/common.ts
@@ -46,7 +46,7 @@ export const LanguageList = [
'Chinese',
'Traditional Chinese',
'Russian',
- 'Indonesia',
+ 'Indonesian',
'Spanish',
'Vietnamese',
'Japanese',
@@ -55,12 +55,14 @@ export const LanguageList = [
'French',
'Italian',
'Bulgarian',
+ 'Arabic',
];
export const LanguageMap = {
English: 'English',
Chinese: '简体中文',
'Traditional Chinese': '繁體中文',
Russian: 'Русский',
+ Indonesian: 'Bahasa Indonesia',
Indonesia: 'Indonesia',
Spanish: 'Español',
Vietnamese: 'Tiếng việt',
@@ -70,6 +72,7 @@ export const LanguageMap = {
French: 'Français',
Italian: 'Italiano',
Bulgarian: 'Български',
+ Arabic: 'العربية',
};
export enum LanguageAbbreviation {
@@ -86,6 +89,7 @@ export enum LanguageAbbreviation {
Fr = 'fr',
It = 'it',
Bg = 'bg',
+ Ar = 'ar',
}
export const LanguageAbbreviationMap = {
@@ -93,7 +97,7 @@ export const LanguageAbbreviationMap = {
[LanguageAbbreviation.Zh]: '简体中文',
[LanguageAbbreviation.ZhTraditional]: '繁體中文',
[LanguageAbbreviation.Ru]: 'Русский',
- [LanguageAbbreviation.Id]: 'Indonesia',
+ [LanguageAbbreviation.Id]: 'Bahasa Indonesia',
[LanguageAbbreviation.Es]: 'Español',
[LanguageAbbreviation.Vi]: 'Tiếng việt',
[LanguageAbbreviation.Ja]: '日本語',
@@ -102,6 +106,7 @@ export const LanguageAbbreviationMap = {
[LanguageAbbreviation.Fr]: 'Français',
[LanguageAbbreviation.It]: 'Italiano',
[LanguageAbbreviation.Bg]: 'Български',
+ [LanguageAbbreviation.Ar]: 'العربية',
};
export const LanguageTranslationMap = {
@@ -110,11 +115,14 @@ export const LanguageTranslationMap = {
'Traditional Chinese': 'zh-TRADITIONAL',
Russian: 'ru',
Indonesian: 'id',
+ Indonesia: 'id',
Spanish: 'es',
Vietnamese: 'vi',
Japanese: 'ja',
Korean: 'ko',
- 'Portuguese BR': 'pt-br',
+ 'Portuguese BR': 'pt-BR',
+ 'pt-br': 'pt-BR',
+ 'pt-BR': 'pt-BR',
German: 'de',
French: 'fr',
Italian: 'it',
@@ -126,6 +134,7 @@ export const LanguageTranslationMap = {
Hindi: 'hi',
Ukrainian: 'uk',
Bulgarian: 'bg',
+ Arabic: 'ar',
};
export enum FileMimeType {
diff --git a/web/src/hooks/use-user-setting-request.tsx b/web/src/hooks/use-user-setting-request.tsx
index e930fb36e2..5c4ff7ea4d 100644
--- a/web/src/hooks/use-user-setting-request.tsx
+++ b/web/src/hooks/use-user-setting-request.tsx
@@ -60,7 +60,9 @@ export const useFetchUserInfo = (): ResponseGetType => {
LanguageTranslationMap[
data.data.language as keyof typeof LanguageTranslationMap
];
- await changeLanguageAsync(targetLng);
+ if (targetLng) {
+ await changeLanguageAsync(targetLng);
+ }
}
return data?.data ?? {};
},
@@ -118,42 +120,58 @@ export const useFetchTenantInfo = (
return { data, loading };
};
-const DEFAULT_PARSERS = [
- { value: 'naive', label: 'General' },
- { value: 'qa', label: 'Q&A' },
- { value: 'resume', label: 'Resume' },
- { value: 'manual', label: 'Manual' },
- { value: 'table', label: 'Table' },
- { value: 'paper', label: 'Paper' },
- { value: 'book', label: 'Book' },
- { value: 'laws', label: 'Laws' },
- { value: 'presentation', label: 'Presentation' },
- { value: 'picture', label: 'Picture' },
- { value: 'one', label: 'One' },
- { value: 'audio', label: 'Audio' },
- { value: 'email', label: 'Email' },
- { value: 'tag', label: 'Tag' },
-];
-
export const useSelectParserList = (): Array<{
value: string;
label: string;
}> => {
const { data: tenantInfo } = useFetchTenantInfo(true);
+ const { t, i18n } = useTranslation();
+
+ const defaultParsers = useMemo(
+ () => [
+ { value: 'naive', label: t('knowledgeConfiguration.parserLabel.naive') },
+ { value: 'qa', label: t('knowledgeConfiguration.parserLabel.qa') },
+ {
+ value: 'resume',
+ label: t('knowledgeConfiguration.parserLabel.resume'),
+ },
+ {
+ value: 'manual',
+ label: t('knowledgeConfiguration.parserLabel.manual'),
+ },
+ { value: 'table', label: t('knowledgeConfiguration.parserLabel.table') },
+ { value: 'paper', label: t('knowledgeConfiguration.parserLabel.paper') },
+ { value: 'book', label: t('knowledgeConfiguration.parserLabel.book') },
+ { value: 'laws', label: t('knowledgeConfiguration.parserLabel.laws') },
+ {
+ value: 'presentation',
+ label: t('knowledgeConfiguration.parserLabel.presentation'),
+ },
+ {
+ value: 'picture',
+ label: t('knowledgeConfiguration.parserLabel.picture'),
+ },
+ { value: 'one', label: t('knowledgeConfiguration.parserLabel.one') },
+ { value: 'audio', label: t('knowledgeConfiguration.parserLabel.audio') },
+ { value: 'email', label: t('knowledgeConfiguration.parserLabel.email') },
+ { value: 'tag', label: t('knowledgeConfiguration.parserLabel.tag') },
+ ],
+ [i18n.language, t],
+ );
const parserList = useMemo(() => {
const parserArray: Array = tenantInfo?.parser_ids?.split(',') ?? [];
const filteredArray = parserArray.filter((x) => x.trim() !== '');
if (filteredArray.length === 0) {
- return DEFAULT_PARSERS;
+ return defaultParsers;
}
return filteredArray.map((x) => {
const arr = x.split(':');
return { value: arr[0], label: arr[1] };
});
- }, [tenantInfo]);
+ }, [tenantInfo, defaultParsers]);
return parserList;
};
diff --git a/web/src/locales/BULGARIAN_LANGUAGE_CHANGES.md b/web/src/locales/BULGARIAN_LANGUAGE_CHANGES.md
deleted file mode 100644
index 3852bae9eb..0000000000
--- a/web/src/locales/BULGARIAN_LANGUAGE_CHANGES.md
+++ /dev/null
@@ -1,54 +0,0 @@
-# Add Bulgarian Language Support
-
-**Repository:** https://github.com/trifonnt/ragflow
-
-## Overview
-
-Added Bulgarian (`bg` / `Български`) as the 13th supported UI language in RAGFlow.
-
-## Changed Files
-
-### `web/src/constants/common.ts`
-
-Registered Bulgarian in all 5 language data structures:
-
-- **`LanguageList`** — Added `'Bulgarian'` to the array of available languages
-- **`LanguageMap`** — Added `Bulgarian: 'Български'` mapping English name to native name
-- **`LanguageAbbreviation`** enum — Added `Bg = 'bg'` using ISO 639-1 code
-- **`LanguageAbbreviationMap`** — Added `[LanguageAbbreviation.Bg]: 'Български'` for the language selector display
-- **`LanguageTranslationMap`** — Added `Bulgarian: 'bg'` for language code resolution
-
-### `web/src/locales/config.ts`
-
-Added a lazy-loading dynamic import entry for the Bulgarian locale file:
-
-```typescript
-[LanguageAbbreviation.Bg]: () => import('./bg'),
-```
-
-This ensures the Bulgarian translation bundle is only loaded on demand when a user selects it.
-
-### `web/src/locales/bg.ts` (new file)
-
-Created the full Bulgarian translation file containing all 26 sections and 2001 translation keys, matching the English source (`en.ts`) exactly:
-
-`common`, `login`, `header`, `memories`, `memory`, `knowledgeList`, `knowledgeDetails`, `knowledgeConfiguration`, `chunk`, `chat`, `setting`, `message`, `fileManager`, `flow`, `llmTools`, `modal`, `mcp`, `search`, `language`, `pagination`, `dataflowParser`, `datasetOverview`, `deleteModal`, `empty`, `admin`, `explore`
-
-All interpolation placeholders (`{{variable}}`), HTML tags, and technical terms (model names, URLs, API references) are preserved as-is.
-
-### `deepdoc/parser/mineru_parser.py`
-
-Added Bulgarian to the `LANGUAGE_TO_MINERU_MAP` dictionary for OCR/PDF parser language support:
-
-```python
-'Bulgarian': 'cyrillic',
-```
-
-Bulgarian uses the Cyrillic script, so the `'cyrillic'` MinerU language code is used.
-
-## How It Works
-
-- The language selector in the header automatically picks up the new entry from `LanguageList` and `LanguageMap`
-- When a user selects "Български", `changeLanguageAsync('bg')` lazy-loads `bg.ts` and switches the UI
-- The user's preference is saved to the database and localStorage for persistence across sessions
-- `supportedLngs` in i18next is derived from `Object.values(LanguageAbbreviation)`, so adding `Bg` to the enum automatically registers it
diff --git a/web/src/locales/ar.ts b/web/src/locales/ar.ts
new file mode 100644
index 0000000000..5e9a8b387c
--- /dev/null
+++ b/web/src/locales/ar.ts
@@ -0,0 +1,2527 @@
+export default {
+ translation: {
+ common: {
+ confirm: 'تأكيد',
+ back: 'رجوع',
+ noResults: 'لا توجد نتائج',
+ selectPlaceholder: 'اختر قيمة',
+ selectAll: 'تحديد الكل',
+ delete: 'حذف',
+ deleteModalTitle: 'هل أنت متأكد من الحذف؟',
+ deleteThem: 'هل أنت متأكد من حذفها؟',
+ ok: 'موافق',
+ cancel: 'إلغاء',
+ yes: 'نعم',
+ no: 'لا',
+ total: 'الإجمالي',
+ rename: 'إعادة تسمية',
+ name: 'الاسم',
+ save: 'حفظ',
+ namePlaceholder: 'يرجى إدخال الاسم',
+ next: 'التالي',
+ create: 'إنشاء',
+ edit: 'تعديل',
+ upload: 'رفع',
+ english: 'الإنجليزية',
+ portugueseBr: 'البرتغالية (البرازيل)',
+ chinese: 'الصينية المبسطة',
+ traditionalChinese: 'الصينية التقليدية',
+ russian: 'الروسية',
+ indonesian: 'الإندونيسية',
+ indonesia: 'الإندونيسية',
+ spanish: 'الإسبانية',
+ vietnamese: 'الفيتنامية',
+ japanese: 'اليابانية',
+ german: 'الألمانية',
+ french: 'الفرنسية',
+ italian: 'الإيطالية',
+ bulgarian: 'البلغارية',
+ arabic: 'العربية',
+ language: 'اللغة',
+ languageMessage: 'يرجى إدخال لغتك!',
+ languagePlaceholder: 'اختر لغتك',
+ copy: 'نسخ',
+ copied: 'تم النسخ',
+ comingSoon: 'قريبًا',
+ download: 'تنزيل',
+ close: 'إغلاق',
+ preview: 'معاينة',
+ move: 'نقل',
+ warn: 'تحذير',
+ action: 'إجراء',
+ s: 'س',
+ pleaseSelect: 'يرجى الاختيار',
+ pleaseInput: 'يرجى الإدخال',
+ submit: 'إرسال',
+ clear: 'مسح',
+ embedIntoSite: 'تضمين في صفحة الويب',
+ openInNewTab: 'الدردشة في علامة تبويب جديدة',
+ previousPage: 'سابق',
+ nextPage: 'التالي',
+ add: 'يضيف',
+ remove: 'يزيل',
+ search: 'بحث',
+ noDataFound: 'لم يتم العثور على بيانات.',
+ noData: 'لا توجد بيانات',
+ promptPlaceholder: 'الرجاء إدخال أو استخدام / لإدراج المتغيرات بسرعة.',
+ mcp: {
+ namePlaceholder: 'خادم MCP الخاص بي',
+ nameRequired:
+ 'يجب أن يتراوح طوله من 1 إلى 64 حرفًا ويمكن أن يحتوي فقط على أحرف وأرقام وواصلات وشرطات سفلية.',
+ urlPlaceholder: 'https://api.example.com/v1/mcp',
+ tokenPlaceholder: 'على سبيل المثال eyJhbGciOiJIUzI1Ni...',
+ },
+ selected: 'محدد',
+ seeAll: 'عرض الكل',
+ },
+ login: {
+ loginTitle: 'سجّل الدخول إلى حسابك',
+ signUpTitle: 'إنشاء حساب',
+ login: 'تسجيل الدخول',
+ signUp: 'إنشاء حساب',
+ loginDescription: 'نحن متحمسون جدًا لرؤيتك مرة أخرى!',
+ registerDescription: 'سعيد لوجودك على متن الطائرة!',
+ emailLabel: 'البريد الإلكتروني',
+ emailPlaceholder: 'يرجى إدخال البريد الإلكتروني',
+ passwordLabel: 'كلمة المرور',
+ passwordPlaceholder: 'يرجى إدخال كلمة المرور',
+ rememberMe: 'تذكرنى',
+ signInTip: 'ليس لديك حساب؟',
+ signUpTip: 'هل لديك حساب بالفعل؟',
+ nicknameLabel: 'الاسم المستعار',
+ nicknamePlaceholder: 'يرجى إدخال الاسم المستعار',
+ register: 'إنشاء حساب',
+ continue: 'يكمل',
+ title: 'محرك RAG رائد لسياق LLM',
+ start: 'دعونا نبدأ',
+ description:
+ 'قم بالتسجيل مجانًا لاستكشاف أفضل تقنيات RAG. قم بإنشاء قواعد المعرفة والذكاء الاصطناعي لتمكين أعمالك.',
+ review: 'من أكثر من 500 تعليق',
+ seeAll: 'شاهد الكل',
+ },
+ header: {
+ knowledgeBase: 'مجموعة البيانات',
+ chat: 'الدردشة',
+ register: 'تسجيل',
+ signin: 'تسجيل الدخول',
+ home: 'الرئيسية',
+ setting: 'إعدادات المستخدم',
+ logout: 'تسجيل الخروج',
+ fileManager: 'الملفات',
+ flow: 'الوكيل',
+ search: 'البحث',
+ welcome: 'مرحبا بكم في',
+ dataset: 'مجموعة البيانات',
+ memories: 'الذاكرة',
+ },
+ memories: {
+ llmTooltip:
+ 'يقوم بتحليل محتوى المحادثة، واستخراج المعلومات الأساسية، وإنشاء ملخصات الذاكرة المنظمة.',
+ embeddingModelTooltip:
+ 'تحويل النص إلى متجهات رقمية للبحث عن تشابه المعنى واسترجاع الذاكرة.',
+ embeddingModelError: 'نوع الذاكرة مطلوب ولا يمكن حذف "الخام".',
+ memoryTypeTooltip:
+ 'Raw: محتوى الحوار الأولي بين المستخدم والوكيل (مطلوب افتراضيًا).\nالذاكرة الدلالية: المعرفة العامة والحقائق حول المستخدم والعالم.\nالذاكرة العرضية: سجلات مختومة بالوقت لأحداث وتجارب محددة.\nالذاكرة الإجرائية: المهارات والعادات والإجراءات الآلية المكتسبة.',
+ raw: 'خام',
+ semantic: 'دلالي',
+ episodic: 'عرضي',
+ procedural: 'إجرائي',
+ editName: 'تعديل الاسم',
+ memory: 'ذاكرة',
+ createMemory: 'إنشاء الذاكرة',
+ name: 'اسم',
+ memoryNamePlaceholder: 'اسم الذاكرة',
+ memoryType: 'نوع الذاكرة',
+ embeddingModel: 'نموذج التضمين',
+ selectModel: 'حدد النموذج',
+ llm: 'ماجستير',
+ delMemoryWarn:
+ 'بعد الحذف، سيتم حذف كافة الرسائل الموجودة في هذه الذاكرة ولا يمكن للوكلاء استردادها.',
+ },
+ memory: {
+ taskLogDialog: {
+ title: 'ذاكرة',
+ startTime: 'وقت البدء',
+ status: 'حالة',
+ details: 'تفاصيل',
+ success: 'نجاح',
+ running: 'جري',
+ failed: 'فشل',
+ },
+ messages: {
+ forget: 'ينسى',
+ forgetMessageTip: 'هل أنت متأكد أنك تريد أن تنسى؟',
+ messageDescription:
+ 'يتم تكوين استخراج الذاكرة باستخدام المطالبات ودرجة الحرارة من الإعدادات المتقدمة.',
+ copied: 'منسوخ!',
+ contentEmbed: 'تضمين المحتوى',
+ content: 'محتوى',
+ delMessageWarn:
+ 'بعد النسيان، لن يتم استرداد هذه الرسالة من قبل الوكلاء.',
+ forgetMessage: 'ننسى الرسالة',
+ sessionId: 'معرف الجلسة',
+ agent: 'عامل',
+ type: 'يكتب',
+ validDate: 'تاريخ صالح',
+ forgetAt: 'ننسى في',
+ source: 'مصدر',
+ enable: 'يُمكَِن',
+ action: 'فعل',
+ },
+ config: {
+ memorySizeTooltip:
+ 'حسابات محتوى كل رسالة + ناقل التضمين الخاص بها (≈ المحتوى + الأبعاد × 8 بايت).\nمثال: رسالة بحجم 1 كيلو بايت مع تضمين 1024-dim تستخدم حوالي 9 كيلو بايت. يحتوي الحد الافتراضي البالغ 5 ميغابايت على 500 رسالة تقريبًا.',
+ avatar: 'الصورة الرمزية',
+ description: 'وصف',
+ memorySize: 'حجم الذاكرة',
+ advancedSettings: 'الإعدادات المتقدمة',
+ permission: 'إذن',
+ onlyMe: 'أنا فقط',
+ team: 'فريق',
+ storageType: 'نوع التخزين',
+ storageTypePlaceholder: 'الرجاء تحديد نوع التخزين',
+ forgetPolicy: 'ننسى السياسة',
+ temperature: 'درجة حرارة',
+ systemPrompt: 'موجه النظام',
+ systemPromptPlaceholder: 'الرجاء إدخال موجه النظام',
+ userPrompt: 'موجه المستخدم',
+ userPromptPlaceholder: 'الرجاء إدخال موجه المستخدم',
+ },
+ sideBar: {
+ messages: 'رسائل',
+ configuration: 'إعدادات',
+ },
+ },
+ knowledgeList: {
+ welcome: 'مرحبًا بعودتك',
+ description: 'ما هي قواعد المعرفة التي ستستخدمها اليوم؟',
+ createKnowledgeBase: 'إنشاء مجموعة بيانات',
+ name: 'الاسم',
+ namePlaceholder: 'يرجى إدخال الاسم.',
+ doc: 'المستندات',
+ searchKnowledgePlaceholder: 'يبحث',
+ noMoreData: 'هذا كل شيء. لا شيء أكثر.',
+ parserRequired: 'طريقة التقسيم مطلوبة',
+ },
+ knowledgeDetails: {
+ metadata: {
+ fields: 'الحقول',
+ selectFiles: 'الملفات {{count}} المحددة',
+ type: 'يكتب',
+ fieldNameInvalid:
+ 'يمكن أن يحتوي اسم الحقل على أحرف أو شرطات سفلية فقط.',
+ builtIn: 'مدمج',
+ generation: 'جيل',
+ toMetadataSetting: 'إعدادات الجيل',
+ toMetadataSettingTip: 'قم بتعيين بيانات التعريف التلقائية في التكوين.',
+ descriptionTip:
+ 'قدم أوصافًا أو أمثلة لتوجيه قيم استخراج LLM لهذا الحقل. إذا تركت فارغة، وسوف تعتمد على اسم الحقل.',
+ restrictDefinedValuesTip:
+ 'وضع التعداد: يقيد استخراج LLM لمطابقة القيم المحددة مسبقًا فقط. تحديد القيم أدناه.',
+ valueExists:
+ 'القيمة موجودة بالفعل. أكد على دمج التكرارات ودمج كافة الملفات المرتبطة بها.',
+ fieldNameExists:
+ 'اسم الحقل موجود بالفعل. أكد على دمج التكرارات ودمج كافة الملفات المرتبطة بها.',
+ valueSingleExists: 'القيمة موجودة بالفعل. تأكيد لدمج التكرارات.',
+ fieldSingleNameExists: 'اسم الحقل موجود بالفعل. تأكيد لدمج التكرارات.',
+ fieldExists: 'الحقل موجود بالفعل.',
+ fieldSetting: 'إعدادات المجال',
+ changesAffectNewParses: 'تؤثر التغييرات على التحليلات الجديدة فقط.',
+ restrictDefinedValues: 'يقتصر على القيم المحددة',
+ metadataGenerationSettings: 'إعدادات توليد البيانات التعريفية',
+ manageMetadata: 'إدارة البيانات الوصفية',
+ metadata: 'البيانات الوصفية',
+ values: 'قيم',
+ value: 'قيمة',
+ action: 'فعل',
+ field: 'مجال',
+ description: 'وصف',
+ fieldName: 'اسم الحقل',
+ editMetadata: 'تحرير البيانات الوصفية',
+ addMetadata: 'إضافة البيانات الوصفية',
+ deleteWarn: 'ستتم إزالة {{field}} من كافة الملفات المرتبطة',
+ deleteManageFieldAllWarn:
+ 'سيتم حذف هذا الحقل وجميع القيم المقابلة له من جميع الملفات المرتبطة به.',
+ deleteManageValueAllWarn:
+ 'سيتم حذف هذه القيمة من كافة الملفات المرتبطة.',
+ deleteManageFieldSingleWarn:
+ 'سيتم حذف هذا الحقل وجميع القيم المقابلة له من هذه الملفات.',
+ deleteManageValueSingleWarn: 'سيتم حذف هذه القيمة من هذه الملفات.',
+ deleteSettingFieldWarn:
+ 'سيتم حذف هذا الحقل؛ لن تتأثر البيانات الوصفية الموجودة.',
+ deleteSettingValueWarn:
+ 'سيتم حذف هذه القيمة؛ لن تتأثر البيانات الوصفية الموجودة.',
+ },
+ redoAll: 'مسح القطع الموجودة',
+ applyAutoMetadataSettings: 'تطبيق إعدادات البيانات التعريفية العامة',
+ parseFileTip: 'هل أنت متأكد من التحليل؟',
+ parseFile: 'تحليل الملف',
+ emptyMetadata: 'لا توجد بيانات وصفية',
+ metadataField: 'حقل البيانات الوصفية',
+ systemAttribute: 'سمة النظام',
+ localUpload: 'تحميل محلي',
+ fileSize: 'حجم الملف',
+ fileType: 'نوع الملف',
+ uploadedBy: 'تم الرفع بواسطة',
+ notGenerated: 'لم يتم إنشاؤها',
+ generatedOn: 'تم الإنشاء بتاريخ',
+ subbarFiles: 'الملفات',
+ generateKnowledgeGraph:
+ 'سيؤدي هذا إلى استخراج الكيانات والعلاقات من جميع مستنداتك في مجموعة البيانات هذه. قد تستغرق العملية بعض الوقت حتى تكتمل.',
+ generateRaptor:
+ 'ينفذ تجميعًا متكررًا وتلخيصًا لأجزاء المستندات لإنشاء بنية شجرة هرمية، مما يتيح استرجاعًا أكثر وعيًا بالسياق عبر المستندات الطويلة.',
+ generate: 'يولد',
+ raptor: 'رابتور',
+ processingType: 'نوع المعالجة',
+ dataPipeline: 'تبديل أو تكوين مسار الابتلاع.',
+ operations: 'العمليات',
+ taskId: 'معرف المهمة',
+ duration: 'مدة',
+ details: 'تفاصيل',
+ status: 'حالة',
+ task: 'مهمة',
+ startDate: 'تاريخ البدء',
+ source: 'مصدر',
+ fileName: 'اسم الملف',
+ datasetLogs: 'مجموعة البيانات',
+ fileLogs: 'ملف',
+ overview: 'سجلات',
+ success: 'نجاح',
+ failed: 'فشل',
+ completed: 'مكتمل',
+ datasetLog: 'سجل مجموعة البيانات',
+ created: 'مخلوق',
+ learnMore: 'مقدمة خط أنابيب مدمج',
+ general: 'عام',
+ chunkMethodTab: 'طريقة القطعة',
+ testResults: 'نتائج',
+ testSetting: 'جلسة',
+ retrievalTesting: 'اختبار الاسترجاع',
+ retrievalTestingDescription:
+ 'قم بإجراء اختبار استرجاع للتحقق مما إذا كان RAGFlow يمكنه استرداد المحتوى المقصود لـ LLM.',
+ Parse: 'تحليل',
+ dataset: 'مجموعة البيانات',
+ testing: 'اختبار الاسترجاع',
+ files: 'ملفات',
+ configuration: 'إعدادات',
+ knowledgeGraph: 'الرسم البياني المعرفي',
+ name: 'اسم',
+ namePlaceholder: 'الرجاء إدخال الاسم!',
+ doc: 'المستندات',
+ datasetDescription:
+ 'يرجى الانتظار حتى تكتمل عملية تحليل الملفات قبل بدء محادثة مدعومة بالذكاء الاصطناعي.',
+ addFile: 'إضافة ملف',
+ searchFiles: 'ابحث في ملفاتك',
+ localFiles: 'الملفات المحلية',
+ emptyFiles: 'إنشاء ملف فارغ',
+ webCrawl: 'الزحف على شبكة الإنترنت',
+ chunkNumber: 'قطع',
+ uploadDate: 'تاريخ التحميل',
+ chunkMethod: 'طريقة التقطيع',
+ enabled: 'يُمكَِن',
+ disabled: 'إبطال',
+ action: 'فعل',
+ parsingStatus: 'حالة التحليل',
+ parsingStatusTip:
+ 'يختلف وقت تحليل المستند بناءً على عدة عوامل. سيؤدي تمكين الميزات مثل الرسم البياني المعرفي أو RAPTOR أو الاستخراج التلقائي للأسئلة أو الاستخراج التلقائي للكلمات الرئيسية إلى زيادة وقت المعالجة بشكل كبير. إذا توقف شريط التقدم، فيرجى الرجوع إلى هذين السؤالين الشائعين: https://ragflow.io/docs/dev/faq#why-does-my-document-parsing-stall-at-under-one-percent.',
+ processBeginAt: 'تبدأ في',
+ processDuration: 'مدة',
+ progressMsg: 'تقدم',
+ noTestResultsForRuned:
+ 'لم يتم العثور على نتائج ذات صلة. حاول تعديل الاستعلام أو المعلمات.',
+ noTestResultsForNotRuned:
+ 'لم يتم إجراء أي اختبار حتى الآن. سوف تظهر النتائج هنا.',
+ testingDescription:
+ 'قم بإجراء اختبار استرجاع للتحقق مما إذا كان RAGFlow يمكنه استرداد المحتوى المقصود لـ LLM. إذا قمت بتعديل الإعدادات الافتراضية، مثل وزن تشابه الكلمة الرئيسية أو حد التشابه، لتحقيق النتائج المثلى، فاعلم أن هذه التغييرات لن يتم حفظها تلقائيًا. يجب عليك تطبيقها على إعدادات مساعد الدردشة أو إعدادات مكون وكيل الاسترداد.',
+ similarityThreshold: 'عتبة التشابه',
+ similarityThresholdTip:
+ 'يستخدم RAGFlow إما مزيجًا من تشابه الكلمات الرئيسية المرجحة وتشابه جيب التمام المتجه المرجح، أو مزيجًا من تشابه الكلمات الرئيسية المرجحة ودرجة إعادة الترتيب المرجحة أثناء الاسترجاع. تحدد هذه المعلمة الحد الأدنى لأوجه التشابه بين استعلام المستخدم والقطع. سيتم استبعاد أي قطعة ذات درجة تشابه أقل من هذا الحد من النتائج. افتراضيًا، يتم تعيين العتبة على 0.2. وهذا يعني أنه سيتم استرداد الأجزاء ذات درجة التشابه الهجين 20 أو أعلى فقط.',
+ vectorSimilarityWeight: 'ناقل تشابه الوزن',
+ vectorSimilarityWeightTip:
+ 'يؤدي هذا إلى تعيين وزن تشابه الكلمات الرئيسية في درجة التشابه المجمعة، إما المستخدمة مع تشابه جيب التمام المتجه أو مع درجة إعادة الترتيب. مجموع الوزنين يجب أن يساوي 1.0.',
+ keywordSimilarityWeight: 'وزن تشابه الكلمات الرئيسية',
+ keywordSimilarityWeightTip:
+ 'يؤدي هذا إلى تعيين وزن تشابه الكلمات الرئيسية في درجة التشابه المجمعة، إما المستخدمة مع تشابه جيب التمام المتجه أو مع درجة إعادة الترتيب. مجموع الوزنين يجب أن يساوي 1.0.',
+ testText: 'نص الاختبار',
+ testTextPlaceholder: 'أدخل سؤالك هنا!',
+ testingLabel: 'يجري',
+ similarity: 'التشابه الهجين',
+ termSimilarity: 'تشابه المصطلح',
+ vectorSimilarity: 'تشابه المتجهات',
+ hits: 'الزيارات',
+ view: 'منظر',
+ filesSelected: 'الملفات المحددة',
+ upload: 'رفع',
+ run: 'تحليل',
+ runningStatus0: 'قيد الانتظار',
+ runningStatus1: 'تحليل',
+ runningStatus2: 'تم الإلغاء',
+ runningStatus3: 'نجاح',
+ runningStatus4: 'يفشل',
+ pageRanges: 'نطاقات الصفحات',
+ pageRangesTip:
+ 'نطاق الصفحات التي سيتم تحليلها؛ لن تتم معالجة الصفحات التي تقع خارج هذا النطاق.',
+ fromPlaceholder: 'من',
+ fromMessage: 'رقم صفحة البداية مفقود',
+ toPlaceholder: 'ل',
+ toMessage: 'رقم صفحة النهاية مفقود (مستبعد)',
+ layoutRecognize: 'محلل قوات الدفاع الشعبي',
+ layoutRecognizeTip:
+ 'استخدم نموذجًا مرئيًا لتحليل تخطيط PDF لتحديد موقع عناوين المستندات وكتل النص والصور والجداول بشكل فعال. إذا تم اختيار الخيار البسيط، فسيتم استرداد النص العادي فقط في ملف PDF. يرجى ملاحظة أن هذا الخيار يعمل حاليًا فقط مع مستندات PDF.',
+ taskPageSize: 'حجم صفحة المهمة',
+ taskPageSizeMessage: 'الرجاء إدخال حجم صفحة المهمة الخاصة بك!',
+ taskPageSizeTip:
+ 'أثناء التعرف على التخطيط، يتم تقسيم ملف PDF إلى أجزاء ومعالجته بالتوازي لزيادة سرعة المعالجة. تحدد هذه المعلمة حجم كل قطعة. يقلل حجم القطعة الأكبر من احتمالية تقسيم النص المستمر بين الصفحات.',
+ addPage: 'إضافة صفحة',
+ greaterThan: 'يجب أن تكون القيمة الحالية أكبر من!',
+ greaterThanPrevious: 'يجب أن تكون القيمة الحالية أكبر من السابقة!',
+ selectFiles: 'حدد الملفات',
+ changeSpecificCategory: 'تغيير فئة معينة',
+ uploadTitle: 'قم بسحب وإسقاط ملفك هنا للتحميل',
+ uploadDescription:
+ 'يدعم تحميل ملف واحد أو دفعي. بالنسبة إلى RAGFlow المنشور محليًا: يبلغ الحد الإجمالي لحجم الملف لكل عملية تحميل 1 جيجابايت، مع حد تحميل دفعة يبلغ 32 ملفًا. لا يوجد حد أقصى لإجمالي عدد الملفات لكل حساب. بالنسبة إلى demo.ragflow.io، يبلغ الحد الأقصى لحجم الملف الإجمالي لكل عملية تحميل 10 ميجابايت، على ألا يتجاوز كل ملف 10 ميجابايت وبحد أقصى 128 ملفًا لكل حساب.',
+ chunk: 'قطعة',
+ bulk: 'حجم كبير',
+ cancel: 'يلغي',
+ close: 'يغلق',
+ rerankModel: 'إعادة ترتيب النموذج',
+ rerankPlaceholder: 'الرجاء التحديد',
+ rerankTip:
+ 'خياري. إذا تركت فارغة، فسوف يستخدم RAGFlow مجموعة من تشابه الكلمات الرئيسية الموزونة وتشابه جيب التمام المتجه الموزون؛ إذا تم تحديد نموذج إعادة الترتيب، فستحل درجة إعادة الترتيب المرجحة محل تشابه جيب تمام المتجه المرجح. يرجى العلم أن استخدام نموذج إعادة الترتيب سيؤدي إلى زيادة وقت استجابة النظام بشكل كبير. إذا كنت ترغب في استخدام نموذج إعادة الترتيب، فتأكد من استخدام أداة إعادة ترتيب SaaS؛ إذا كنت تفضل نموذج إعادة الترتيب المنشور محليًا، فتأكد من بدء تشغيل RAGFlow باستخدام docker-compose-gpu.yml.',
+ topK: 'توب ك',
+ topKTip:
+ 'يستخدم هذا الإعداد مع نموذج إعادة الترتيب، ويحدد عدد مجموعات النص التي سيتم إرسالها إلى نموذج إعادة الترتيب المحدد.',
+ delimiter: 'محدد للنص',
+ delimiterTip:
+ 'يمكن أن يتكون المحدد أو الفاصل من حرف خاص واحد أو عدة أحرف. إذا كانت هناك أحرف متعددة، فتأكد من أنها محاطة بعلامات التحديد الخلفية (``). على سبيل المثال، إذا قمت بتكوين المحددات الخاصة بك على النحو التالي: \\n`##`;، فسيتم فصل النصوص الخاصة بك عند فواصل الأسطر ورموز التجزئة المزدوجة (##) والفواصل المنقوطة.',
+ enableChildrenDelimiter: 'يتم استخدام قطعة الطفل للاسترجاع',
+ childrenDelimiter: 'محدد للنص',
+ childrenDelimiterTip:
+ 'يمكن أن يتكون المحدد أو الفاصل من حرف خاص واحد أو عدة أحرف. إذا كانت هناك أحرف متعددة، فتأكد من أنها محاطة بعلامات التحديد الخلفية (``). على سبيل المثال، إذا قمت بتكوين المحددات الخاصة بك على النحو التالي: \\n`##`;، فسيتم فصل النصوص الخاصة بك عند فواصل الأسطر ورموز التجزئة المزدوجة (##) والفواصل المنقوطة.',
+ html4excel: 'إكسل إلى HTML',
+ html4excelTip:
+ 'استخدم مع طريقة التقطيع العامة. عند التعطيل، سيتم تحليل جداول البيانات (XLSX أو XLS(Excel 97-2003)) الموجودة في قاعدة المعرفة إلى أزواج قيمة المفتاح. عند التمكين، سيتم تحليلها إلى جداول HTML، مع تقسيم كل 12 صفًا إذا كان الجدول الأصلي يحتوي على أكثر من 12 صفًا. راجع https://ragflow.io/docs/dev/enable_excel2html للحصول على التفاصيل.',
+ autoKeywords: 'الكلمة الرئيسية التلقائية',
+ autoKeywordsTip:
+ 'قم باستخراج الكلمات الرئيسية N تلقائيًا لكل مجموعة لزيادة تصنيفها للاستعلامات التي تحتوي على تلك الكلمات الرئيسية. انتبه إلى أنه سيتم استهلاك الرموز المميزة الإضافية بواسطة نموذج الفهرسة المحدد في "التكوين". يمكنك التحقق من الكلمات الأساسية المضافة أو تحديثها لمقطع من قائمة المقاطع. للحصول على التفاصيل، راجع https://ragflow.io/docs/dev/autokeyword_autoquestion.',
+ autoQuestions: 'سؤال تلقائي',
+ autoQuestionsTip:
+ 'قم باستخراج الأسئلة N تلقائيًا لكل مجموعة لزيادة تصنيفها للاستعلامات التي تحتوي على تلك الأسئلة. يمكنك التحقق من الأسئلة المضافة أو تحديثها لمقطع من قائمة المقاطع. لن تعطل هذه الميزة عملية التقسيم في حالة حدوث خطأ، إلا أنها قد تضيف نتيجة فارغة إلى المقطع الأصلي. انتبه إلى أنه سيتم استهلاك الرموز المميزة الإضافية بواسطة نموذج الفهرسة المحدد في "التكوين". للحصول على التفاصيل، راجع https://ragflow.io/docs/dev/autokeyword_autoquestion.',
+ redo: 'هل تريد مسح قطع {{chunkNum}} الموجودة؟',
+ setMetaData: 'تعيين البيانات الوصفية',
+ pleaseInputJson: 'الرجاء إدخال JSON',
+ documentMetaTips:
+ ' البيانات التعريفية بتنسيق Json (غير قابلة للبحث). ستتم إضافته إلى المطالبة بـ LLM إذا تم تضمين أي أجزاء من هذا المستند في المطالبة.
\nأمثلة:
\n البيانات الوصفية هي: \n\n {\n "المؤلف": "أليكس داوسون"،\n "التاريخ": "12-11-2024"\n }\n \nستكون المطالبة: \nالمستند: the_name_of_document
\n المؤلف: أليكس داوسون
\nالتاريخ: 12-11-2024
\n الأجزاء ذات الصلة على النحو التالي:
\n\n هذا هو محتوى القطعة.... \n هذا هو محتوى القطعة.... \n ',
+ metaData: 'بيانات التعريف',
+ deleteDocumentConfirmContent:
+ 'الوثيقة مرتبطة بالرسم البياني المعرفي. بعد الحذف، سيتم حذف معلومات العقدة والعلاقة ذات الصلة، ولكن لن يتم تحديث الرسم البياني على الفور. يتم تنفيذ إجراء تحديث الرسم البياني أثناء عملية تحليل المستند الجديد الذي يحمل مهمة استخراج الرسم البياني المعرفي.',
+ plainText: 'ساذج',
+ reRankModelWaring: 'يستغرق نموذج إعادة التصنيف وقتًا طويلاً للغاية.',
+ },
+ knowledgeConfiguration: {
+ globalIndexModelTip:
+ 'يستخدم لإنشاء الرسوم البيانية المعرفية و RAPTOR وبيانات التعريف التلقائية والكلمات الرئيسية التلقائية والسؤال التلقائي. سيؤثر أداء النموذج على جودة التوليد.',
+ globalIndexModel: 'نموذج الفهرسة',
+ settings: 'إعدادات',
+ autoMetadataTip:
+ 'إنشاء بيانات التعريف تلقائيًا. ينطبق على الملفات الجديدة أثناء التحليل. تتطلب الملفات الموجودة إعادة التحليل للتحديث (تظل الأجزاء محفوظة). انتبه إلى أنه سيتم استهلاك الرموز المميزة الإضافية بواسطة نموذج الفهرسة المحدد في "التكوين".',
+ imageTableContextWindow: 'نافذة سياق الصورة والجدول',
+ imageTableContextWindowTip:
+ 'يلتقط رموز N المميزة للنص أعلى وأسفل الصورة والجدول لتوفير سياق خلفية أكثر ثراءً.',
+ autoMetadata: 'البيانات الوصفية التلقائية',
+ mineruOptions: 'خيارات مينرو',
+ mineruParseMethod: 'طريقة التحليل',
+ mineruParseMethodTip:
+ 'طريقة تحليل ملف PDF: تلقائي (الاكتشاف التلقائي)، txt (استخراج النص)، ocr (التعرف البصري على الأحرف)',
+ mineruFormulaEnable: 'التعرف على الصيغة',
+ mineruFormulaEnableTip:
+ 'تمكين التعرف على الصيغة. ملاحظة: قد لا يعمل هذا بشكل صحيح مع المستندات السيريلية.',
+ mineruTableEnable: 'التعرف على الجدول',
+ mineruTableEnableTip: 'تمكين التعرف على الجدول واستخراجه.',
+ paddleocrOptions: 'خيارات PaddleOCR',
+ paddleocrApiUrl: 'عنوان URL لواجهة برمجة تطبيقات PaddleOCR',
+ paddleocrApiUrlTip:
+ 'عنوان URL لنقطة نهاية واجهة برمجة التطبيقات لخدمة PaddleOCR',
+ paddleocrApiUrlPlaceholder:
+ 'على سبيل المثال https://paddleocr-server.com/layout-parsing',
+ paddleocrAccessToken: 'رمز الوصول إلى استوديو الذكاء الاصطناعي',
+ paddleocrAccessTokenTip: 'رمز الوصول إلى PaddleOCR API (اختياري)',
+ paddleocrAccessTokenPlaceholder: 'رمز AI Studio الخاص بك (اختياري)',
+ paddleocrAlgorithm: 'خوارزمية PaddleOCR',
+ paddleocrAlgorithmTip: 'الخوارزمية المستخدمة لتحليل PaddleOCR',
+ paddleocrSelectAlgorithm: 'حدد الخوارزمية',
+ paddleocrModelNamePlaceholder: 'على سبيل المثال paddleocr-من-env-1',
+ overlappedPercent: 'النسبة المئوية المتداخلة (%)',
+ generationScopeTip:
+ 'يحدد ما إذا كان سيتم إنشاء RAPTOR لمجموعة البيانات بأكملها أو لملف واحد.',
+ scopeDataset: 'مجموعة البيانات',
+ generationScope: 'نطاق الجيل',
+ scopeSingleFile: 'ملف واحد',
+ autoParse: 'تحليل تلقائي',
+ rebuildTip:
+ 'إعادة تنزيل الملفات من مصدر البيانات المرتبط وتحليلها مرة أخرى.',
+ baseInfo: 'أساسي',
+ globalIndex: 'المؤشر العالمي',
+ dataSource: 'مصدر البيانات',
+ linkSourceSetTip: 'إدارة ربط مصدر البيانات بمجموعة البيانات هذه',
+ linkDataSource: 'ربط مصدر البيانات',
+ tocExtraction: 'فهرس الصفحة',
+ tocExtractionTip:
+ 'بالنسبة للقطع الموجودة، قم بإنشاء جدول محتويات هرمي (دليل واحد لكل ملف). أثناء الاستعلامات، عند تنشيط "تحسين الدليل"، سيستخدم النظام نموذجًا كبيرًا لتحديد عناصر الدليل ذات الصلة بسؤال المستخدم، وبالتالي تحديد الأجزاء ذات الصلة.',
+ deleteGenerateModalContent:
+ "حذف النتائج {{type}} التي تم إنشاؤها\n سيؤدي إلى إزالة جميع الكيانات والعلاقات المشتقة من مجموعة البيانات هذه.\n ستبقى ملفاتك الأصلية سليمة.
\n \n هل تريد الاستمرار؟",
+ extractRaptor: 'استخراج رابتور',
+ extractKnowledgeGraph: 'استخراج الرسم البياني المعرفة',
+ filterPlaceholder: 'يرجى إدخال عامل التصفية',
+ fileFilterTip: '',
+ fileFilter: 'مرشح الملف',
+ setDefaultTip: '',
+ setDefault: 'تعيين كافتراضي',
+ editLinkDataPipeline: 'تعديل مسار الابتلاع',
+ linkPipelineSetTip:
+ 'إدارة ربط خط أنابيب الاستيعاب مع مجموعة البيانات هذه',
+ default: 'تقصير',
+ dataPipeline: 'تبديل أو تكوين مسار الابتلاع.',
+ linkDataPipeline: 'ربط خط أنابيب استيعاب',
+ enableAutoGenerate: 'تمكين الإنشاء التلقائي',
+ teamPlaceholder: 'الرجاء اختيار فريق.',
+ dataFlowPlaceholder: 'الرجاء تحديد خط أنابيب.',
+ buildItFromScratch: 'بنائها من الصفر',
+ dataFlow: 'خط أنابيب',
+ parseType: 'نوع التحليل',
+ manualSetup: 'اختر خط الأنابيب',
+ builtIn: 'مدمج',
+ titleDescription:
+ 'قم بتحديث تكوين الذاكرة لديك هنا، وخاصة LLM والمطالبات.',
+ name: 'اسم قاعدة المعرفة',
+ photo: 'صورة قاعدة المعرفة',
+ photoTip: 'يمكنك تحميل صورة يصل حجمها إلى 4 ميجابايت.',
+ description: 'وصف',
+ language: 'لغة المستند',
+ languageMessage: 'يرجى إدخال لغتك!',
+ languagePlaceholder: 'يرجى اختيار لغة المستند',
+ permissions: 'الأذونات',
+ embeddingModel: 'نموذج التضمين',
+ chunkTokenNumber: 'حجم القطعة الموصى بها',
+ chunkTokenNumberMessage: 'مطلوب رقم الرمز المميز للنص',
+ embeddingModelTip:
+ 'نموذج التضمين الافتراضي الذي تستخدمه قاعدة المعرفة. بمجرد أن تحتوي قاعدة المعرفة على أجزاء، عند تبديل نموذج التضمين، يقوم النظام بشكل عشوائي باختبار بعض القطع للتحقق من التوافق، ويعيد دمجها مع نموذج التضمين الجديد، ويحسب تشابه جيب التمام بين المتجهات الجديدة والقديمة. يُسمح بالتبديل فقط عندما يكون متوسط تشابه العينة ≥ 0.9. بخلاف ذلك، يجب عليك حذف كافة الأجزاء الموجودة في قاعدة المعرفة قبل أن تتمكن من تغييرها.',
+ permissionsTip:
+ 'إذا تم تعيينه على "فريق"، فسيتمكن جميع أعضاء فريقك من إدارة قاعدة المعرفة.',
+ chunkTokenNumberTip:
+ 'إنه يعين نوعًا ما عتبة الرمز المميز لإنشاء قطعة. سيتم دمج المقطع الذي يحتوي على عدد أقل من الرموز المميزة من هذا الحد مع المقاطع التالية حتى يتجاوز عدد الرموز المميزة الحد، وعند هذه النقطة يتم إنشاء القطعة. لا يتم إنشاء أي قطعة جديدة ما لم تتم مواجهة محدد، حتى لو تم تجاوز الحد.',
+ chunkMethod: 'طريقة التقطيع',
+ chunkMethodTip: 'عرض النصائح على اليمين.',
+ upload: 'رفع',
+ english: 'إنجليزي',
+ chinese: 'الصينية',
+ portugueseBr: 'البرتغالية (البرازيل)',
+ embeddingModelPlaceholder: 'الرجاء تحديد نموذج التضمين.',
+ chunkMethodPlaceholder: 'يرجى اختيار طريقة التقسيم.',
+ parserLabel: {
+ naive: 'عام',
+ qa: 'سؤال وجواب',
+ resume: 'سيرة ذاتية',
+ manual: 'دليل',
+ table: 'جدول',
+ paper: 'ورقة بحثية',
+ book: 'كتاب',
+ laws: 'قوانين',
+ presentation: 'عرض تقديمي',
+ picture: 'صورة',
+ one: 'واحد',
+ audio: 'صوت',
+ email: 'بريد إلكتروني',
+ tag: 'وسم',
+ },
+ save: 'يحفظ',
+ me: 'أنا فقط',
+ team: 'فريق',
+ cancel: 'يلغي',
+ methodTitle: 'وصف طريقة القطع',
+ methodExamples: 'أمثلة',
+ methodExamplesDescription: 'يتم توفير لقطات الشاشة التالية للتوضيح.',
+ dialogueExamplesTitle: 'منظر',
+ methodEmpty: 'سيعرض هذا شرحًا مرئيًا لفئات قاعدة المعرفة',
+ book: '
تنسيقات الملفات المدعومة هي DOCX ، PDF ، TXT .
\n لكل كتاب بصيغة PDF، يرجى تعيين نطاقات الصفحات لإزالة المعلومات غير المرغوب فيها وتقليل وقت التحليل.
',
+ laws: 'تنسيقات الملفات المدعومة هي DOCX ، PDF ، TXT .
\n عادةً ما تتبع المستندات القانونية تنسيقًا صارمًا للكتابة. نستخدم ميزة النص لتحديد نقطة الانقسام.\n
\n تحتوي القطعة على دقة تتفق مع "المادة"، مما يضمن تضمين كل نصوص المستوى العلوي في المجموعة.\n
',
+ manual:
+ ' يتم دعم PDF فقط.
\n نحن نفترض أن الدليل يحتوي على هيكل قسم هرمي، باستخدام عناوين الأقسام الأدنى كوحدة أساسية لتقطيع المستندات. ولذلك، لن يتم فصل الأشكال والجداول الموجودة في نفس القسم، مما قد يؤدي إلى أحجام قطع أكبر.\n
',
+ naive:
+ 'تنسيقات الملفات المدعومة هي MD، MDX، DOCX، XLSX، XLS (Excel 97-2003)، PPTX، PDF، TXT، JPEG، JPG، PNG، TIF، GIF، CSV، JSON، EML، HTML .
\n تقوم هذه الطريقة بتقطيع الملفات باستخدام طريقة "ساذجة":
\n \n
استخدم نموذج اكتشاف الرؤية لتقسيم النصوص إلى أجزاء أصغر. \n ثم، قم بدمج المقاطع المتجاورة حتى يتجاوز عدد الرموز المميزة الحد المحدد بواسطة "رقم القطعة المميزة للنص"، وعند هذه النقطة يتم إنشاء القطعة. ',
+ paper:
+ ' يتم دعم ملف PDF فقط.
\n سيتم تقسيم الأوراق حسب القسم، مثل الملخص، 1.1، 1.2 .
\n يمكّن هذا النهج LLM من تلخيص الورقة بشكل أكثر فعالية وتقديم استجابات أكثر شمولاً ومفهومة.\n ومع ذلك، فإنه يزيد أيضًا من سياق محادثات الذكاء الاصطناعي ويضيف إلى التكلفة الحسابية لماجستير القانون. لذا، أثناء المحادثة، فكر في تقليل قيمة "topN ".
',
+ presentation:
+ 'تنسيقات الملفات المدعومة هي PDF ، PPTX .
\n يتم التعامل مع كل صفحة في الشرائح على أنها جزء، مع تخزين صورتها المصغرة.
\n يتم تطبيق طريقة التجزئة هذه تلقائيًا على جميع ملفات PPT التي تم تحميلها، لذلك لا تحتاج إلى تحديدها يدويًا.
',
+ qa: '\n تدعم طريقة التقطيع هذه XLSX وCSV/TXT تنسيقات الملفات.\n
\n \n إذا كان الملف بتنسيق XLSX أو XLS (Excel 97-2003) ، فيجب أن يحتوي على عمودين بدون رؤوس: أحدهما للأسئلة والآخر للإجابات، بحيث يسبق عمود السؤال عمود الإجابة. أوراق متعددة هي\n مقبول، بشرط أن تكون الأعمدة منظمة بشكل صحيح.\n \n \n إذا كان الملف بتنسيق CSV/TXT ، فيجب أن يكون مشفرًا بـ UTF-8 باستخدام TAB كمحدد لفصل الأسئلة والأجوبة.\n \n \n \n سيتم تجاهل أسطر النصوص التي لا تتبع القواعد المذكورة أعلاه، و\n سيتم اعتبار كل زوج من الأسئلة والأجوبة جزءًا مميزًا.\n \n
',
+ resume:
+ 'تنسيقات الملفات المدعومة هي DOCX ، PDF ، TXT .\n
\n يتم تحليل السيرة الذاتية بمختلف أشكالها وتنظيمها في بيانات منظمة لتسهيل البحث عن المرشحين للقائمين بالتوظيف.\n
',
+ table:
+ "تنسيقات الملفات المدعومة هي XLSX وCSV/TXT .
\n فيما يلي بعض المتطلبات الأساسية والنصائح:\n
",
+ picture:
+ 'يتم دعم ملفات الصور، وسيتوفر دعم الفيديو قريبًا.
\n تستخدم هذه الطريقة نموذج التعرف الضوئي على الحروف (OCR) لاستخراج النصوص من الصور.\n
\n إذا تم اعتبار النص المستخرج بواسطة نموذج التعرف الضوئي على الحروف (OCR) غير كافٍ، فسيتم استخدام LLM مرئي محدد لتقديم وصف للصورة.\n
',
+ one: 'تنسيقات الملفات المدعومة هي DOCX، XLSX، XLS (Excel 97-2003)، PDF، TXT .\n
\n تتعامل هذه الطريقة مع كل مستند في مجمله كقطعة.\n
\n ينطبق ذلك عندما تطلب من LLM تلخيص المستند بأكمله، بشرط أن يتمكن من التعامل مع هذا القدر من طول السياق.\n
',
+ knowledgeGraph:
+ 'تنسيقات الملفات المدعومة هي DOCX، EXCEL، PPT، IMAGE، PDF، TXT، MD، JSON، EML \n\n
يقوم هذا الأسلوب بتقطيع الملفات باستخدام الطريقة "الساذجة"/"العامة". فهو يقسم المستند إلى أجزاء ثم يجمع الأجزاء المتجاورة حتى يتجاوز عدد الرموز المميزة الحد المحدد بواسطة "رقم القطعة المميزة للنص"، وعند هذه النقطة يتم إنشاء القطعة.
\n يتم بعد ذلك تغذية الأجزاء إلى LLM لاستخراج الكيانات والعلاقات من أجل رسم بياني معرفي وخريطة ذهنية.
\nتأكد من تعيين أنواع الكيانات .
',
+ tag: ' تعمل قاعدة المعرفة التي تستخدم طريقة التقطيع "Tag" كمجموعة علامات. تستخدمها قواعد المعرفة الأخرى لوضع علامات على الأجزاء الخاصة بها، ويتم أيضًا وضع علامات على الاستعلامات الخاصة بقواعد المعرفة هذه باستخدام مجموعة العلامات هذه.
\n ستشارك مجموعة العلامات NOT بشكل مباشر في عملية إنشاء الاسترجاع المعزز (RAG).
\nكل جزء في قاعدة المعرفة هذه عبارة عن زوج مستقل من علامات الوصف.
\n تتضمن تنسيقات الملفات المدعومة XLSX وCSV/TXT :
\nإذا كان الملف بتنسيق XLSX ، فيجب أن يحتوي على عمودين بدون رؤوس: أحدهما لأوصاف العلامات والآخر لأسماء العلامات، مع عمود الوصف الذي يسبق عمود العلامة. يُقبل تعدد الأوراق، بشرط أن تكون الأعمدة منظمة بشكل صحيح.
\nإذا كان الملف بتنسيق CSV/TXT ، فيجب أن يكون مشفرًا بـ UTF-8 باستخدام TAB كمحدد لفصل الأوصاف والعلامات.
\nفي عمود العلامات، يتم استخدام comma لفصل العلامات.
\n سيتم تجاهل سطور النصوص التي لا تتبع القواعد المذكورة أعلاه. ',
+ useRaptor: 'رابتور',
+ useRaptorTip:
+ 'يمكن استخدام RAPTOR لمهام الإجابة على الأسئلة متعددة القفزات. انتقل إلى صفحة الملفات، وانقر فوق إنشاء > RAPTOR لتمكينه. راجع https://ragflow.io/docs/dev/enable_raptor للحصول على التفاصيل.',
+ prompt: 'اِسْتَدْعَى',
+ promptTip:
+ 'استخدم موجه النظام لوصف مهمة LLM، وتحديد كيفية الاستجابة لها، وتحديد المتطلبات المتنوعة الأخرى. غالبًا ما يتم استخدام موجه النظام جنبًا إلى جنب مع المفاتيح (المتغيرات)، والتي تعمل كمدخلات بيانات متنوعة لـ LLM. استخدم شرطة مائلة للأمام `/` أو الزر (x) لإظهار المفاتيح المطلوب استخدامها.',
+ promptMessage: 'مطلوب موجه',
+ promptText:
+ 'يرجى تلخيص الفقرات التالية. كن حذرا مع الأرقام، لا تختلق الأمور. الفقرات على النحو التالي:\n {cluster_content}\nما ورد أعلاه هو المحتوى الذي تحتاج إلى تلخيصه.',
+ maxToken: 'رمز ماكس',
+ maxTokenTip: 'الحد الأقصى لعدد الرموز المميزة لكل مقطع ملخص تم إنشاؤه.',
+ maxTokenMessage: 'مطلوب الحد الأقصى للرمز المميز',
+ threshold: 'عتبة',
+ thresholdTip:
+ 'في RAPTOR، يتم تجميع القطع حسب تشابهها الدلالي. تحدد معلمة Threshold الحد الأدنى من التشابه المطلوب لتجميع القطع معًا. العتبة الأعلى تعني قطعًا أقل في كل مجموعة، بينما تعني العتبة الأقل عددًا أكبر.',
+ thresholdMessage: 'العتبة مطلوبة',
+ maxCluster: 'ماكس الكتلة',
+ maxClusterTip: 'الحد الأقصى لعدد المجموعات التي سيتم إنشاؤها.',
+ maxClusterMessage: 'مطلوب مجموعة ماكس',
+ randomSeed: 'بذرة عشوائية',
+ randomSeedMessage: 'مطلوب بذور عشوائية',
+ entityTypes: 'أنواع الكيانات',
+ vietnamese: 'الفيتنامية',
+ pageRank: 'رتبة الصفحة',
+ pageRankTip:
+ 'يمكنك تعيين درجة أعلى لتصنيف الصفحات لقواعد معرفية محددة أثناء الاسترجاع. تتم إضافة النتيجة المقابلة إلى درجات التشابه الهجينة للأجزاء المستردة من قواعد المعرفة هذه، مما يؤدي إلى زيادة ترتيبها. راجع https://ragflow.io/docs/dev/set_page_rank للحصول على التفاصيل.',
+ tagName: 'علامة',
+ frequency: 'تكرار',
+ searchTags: 'علامات البحث',
+ tagCloud: 'سحاب',
+ tagTable: 'طاولة',
+ tagSet: 'مجموعات العلامات',
+ tagSetTip:
+ ' حدد قاعدة معرفية واحدة أو عدة قواعد لوضع علامات تلقائية على الأجزاء في قاعدة المعرفة الخاصة بك. راجع https://ragflow.io/docs/dev/use_tag_sets للحصول على التفاصيل.
\n سيتم أيضًا وضع علامة على استعلام المستخدم تلقائيًا.
\nتعمل ميزة وضع العلامات التلقائي هذه على تحسين عملية الاسترجاع عن طريق إضافة طبقة أخرى من المعرفة الخاصة بالمجال إلى مجموعة البيانات الموجودة.\nالفرق بين العلامة التلقائية والكلمة الرئيسية التلقائية:
\n\n قاعدة معارف العلامة هي مجموعة قريبة محددة من قبل المستخدم، في حين يمكن اعتبار الكلمات الأساسية المستخرجة بواسطة LLM مجموعة مفتوحة. \n يجب عليك تحميل مجموعات العلامات بتنسيقات محددة قبل تشغيل ميزة وضع العلامات التلقائي. \n تعتمد ميزة الكلمات الأساسية التلقائية على LLM وتستهلك عددًا كبيرًا من الرموز المميزة. \n ',
+ topnTags: 'علامات Top-N',
+ tags: 'العلامات',
+ addTag: 'إضافة علامة',
+ useGraphRag: 'الرسم البياني المعرفي',
+ useGraphRagTip:
+ 'قم بإنشاء رسم بياني معرفي على أجزاء ملف من قاعدة المعرفة الحالية لتحسين الإجابة على الأسئلة متعددة القفزات التي تتضمن منطقًا متداخلاً. راجع https://ragflow.io/docs/dev/construct_knowledge_graph للحصول على التفاصيل.',
+ graphRagMethod: 'طريقة',
+ graphRagMethodTip:
+ 'Light: (افتراضي) استخدم المطالبات المقدمة من github.com/HKUDS/LightRAG لاستخراج الكيانات والعلاقات. يستهلك هذا الخيار عددًا أقل من الرموز المميزة، وذاكرة أقل، وموارد حسابية أقل.\n عام: استخدم المطالبات المقدمة من github.com/microsoft/graphrag لاستخراج الكيانات والعلاقات',
+ resolution: 'قرار الكيان',
+ resolutionTip:
+ 'مفتاح إلغاء البيانات المكررة للكيان. عند التمكين، سيجمع LLM بين الكيانات المتشابهة - على سبيل المثال، "2025" و"عام 2025"، أو "تكنولوجيا المعلومات" و"تكنولوجيا المعلومات" - لإنشاء رسم بياني أكثر دقة',
+ community: 'تقارير المجتمع',
+ communityTip:
+ 'في الرسم البياني المعرفي، المجتمع عبارة عن مجموعة من الكيانات المرتبطة بالعلاقات. يمكنك أن تطلب من LLM إنشاء ملخص لكل مجتمع، وهو ما يُعرف باسم تقرير المجتمع. انظر هنا لمزيد من المعلومات: https://www.microsoft.com/en-us/research/blog/graphrag-improving-global-search-via-dynamic-community-selection/',
+ theDocumentBeingParsedCannotBeDeleted:
+ 'لا يمكن حذف المستند الذي يتم تحليله',
+ lastWeek: 'من الاسبوع الماضي',
+ },
+ chunk: {
+ type: 'يكتب',
+ docType: {
+ image: 'صورة',
+ table: 'طاولة',
+ text: 'نص',
+ },
+ chunk: 'قطعة',
+ bulk: 'حجم كبير',
+ selectAll: 'حدد الكل',
+ enabledSelected: 'تمكين المحدد',
+ disabledSelected: 'تعطيل المحدد',
+ deleteSelected: 'حذف المحدد',
+ search: 'يبحث',
+ all: 'الجميع',
+ enabled: 'ممكّن',
+ disabled: 'عاجز',
+ keyword: 'الكلمة الرئيسية',
+ image: 'صورة',
+ imageUploaderTitle: 'قم بتحميل صورة جديدة لتحديث قطعة الصورة هذه',
+ function: 'وظيفة',
+ chunkMessage: 'الرجاء إدخال القيمة!',
+ full: 'النص الكامل',
+ ellipse: 'القطع الناقص',
+ graph: 'الرسم البياني المعرفي',
+ mind: 'خريطة ذهنية',
+ question: 'سؤال',
+ questionTip: 'إذا كانت هناك أسئلة معينة، فسيتم تضمين الجزء بناءً عليها.',
+ chunkResult: 'نتيجة القطعة',
+ chunkResultTip: 'عرض المقاطع المقسمة المستخدمة للتضمين والاسترجاع.',
+ enable: 'يُمكَِن',
+ disable: 'إبطال',
+ delete: 'يمسح',
+ },
+ chat: {
+ messagePlaceholder: 'اكتب رسالتك هنا...',
+ exit: 'مخرج',
+ multipleModels: 'نماذج متعددة',
+ applyModelConfigs: 'تطبيق تكوينات النموذج',
+ conversations: 'المحادثات',
+ chatApps: 'تطبيقات الدردشة',
+ newConversation: 'محادثة جديدة',
+ createAssistant: 'إنشاء مساعد',
+ assistantSetting: 'إعدادات المساعد',
+ promptEngine: 'محرك سريع',
+ modelSetting: 'إعدادات النموذج',
+ chat: 'محادثة',
+ newChat: 'دردشة جديدة',
+ send: 'يرسل',
+ sendPlaceholder: 'مراسلة المساعد...',
+ chatConfiguration: 'تكوين الدردشة',
+ chatConfigurationDescription:
+ 'قم بإعداد مساعد دردشة لمجموعات البيانات المحددة (قواعد المعرفة) هنا! 💕',
+ assistantName: 'اسم المساعد',
+ assistantNameMessage: 'اسم المساعد مطلوب',
+ namePlaceholder: 'على سبيل المثال استئناف جارفيس',
+ assistantAvatar: 'الصورة الرمزية مساعد',
+ language: 'لغة',
+ emptyResponse: 'رد فارغ',
+ emptyResponseTip:
+ 'قم بتعيين هذا كرد إذا لم يتم استرداد أي نتائج من قواعد المعرفة لاستعلامك، أو اترك هذا الحقل فارغًا للسماح لـ LLM بالارتجال عندما لا يتم العثور على أي شيء.',
+ emptyResponseMessage:
+ 'سيتم تشغيل الاستجابة الفارغة عندما لا يتم استرداد أي شيء ذي صلة من قواعد المعرفة. يجب عليك مسح حقل "الاستجابة الفارغة" إذا لم يتم تحديد قاعدة معرفية.',
+ setAnOpener: 'تحية افتتاحية',
+ setAnOpenerInitial: 'أهلاً! أنا مساعدك. ما الذي يمكنني أن أفعله من أجلك؟',
+ setAnOpenerTip: 'تعيين تحية افتتاحية للمستخدمين.',
+ knowledgeBases: 'مجموعات البيانات',
+ knowledgeBasesMessage: 'الرجاء التحديد',
+ knowledgeBasesTip:
+ 'حدد مجموعات البيانات المراد ربطها بمساعد الدردشة هذا. لن تظهر قاعدة المعرفة الفارغة في القائمة المنسدلة.',
+ system: 'موجه النظام',
+ systemInitialValue:
+ 'أنت مساعد ذكي. وظيفتك الأساسية هي الإجابة على الأسئلة بناءً على قاعدة المعرفة المقدمة بشكل صارم.\n\n ** القواعد الأساسية: **\n - يجب أن تكون إجابتك مستمدة **فقط** من قاعدة المعرفة هذه: `{knowledge}`.\n - **عند توفر المعلومات**: قم بتلخيص المحتوى لتقديم إجابة مفصلة.\n - **عندما لا تكون المعلومات متاحة**: يجب أن يحتوي ردك على هذه الجملة بالضبط: "الإجابة التي تبحث عنها غير موجودة في قاعدة المعرفة!"\n - **فكر دائمًا** في سجل المحادثة بأكمله.',
+ systemMessage: 'يرجى الإدخال!',
+ systemTip:
+ 'مطالباتك أو تعليماتك الخاصة بـ LLM، بما في ذلك على سبيل المثال لا الحصر دورها والطول المطلوب ونبرة ولغة إجاباتها. إذا كان النموذج الخاص بك يتمتع بدعم أصلي للاستدلال، فيمكنك إضافة //no_thinking لإضافة المطالبة لإيقاف الاستدلال.',
+ topN: 'أعلى ن',
+ topNTip:
+ 'لن يتم إرسال جميع الأجزاء ذات درجة التشابه أعلى من "عتبة التشابه" إلى LLM. يؤدي هذا إلى تحديد قطع "Top N" من القطع المستردة.',
+ variable: 'عامل',
+ variableTip:
+ 'عند استخدامها مع واجهات برمجة تطبيقات إدارة مساعد الدردشة الخاصة بـ RAGFlow، يمكن للمتغيرات أن تساعد في تطوير إستراتيجيات موجهة للنظام أكثر مرونة. سيتم استخدام المتغيرات المحددة بواسطة "موجه النظام" كجزء من المطالبات الخاصة بـ LLM. {knowledge} هو متغير خاص محجوز يمثل الأجزاء المستردة من قاعدة (قواعد) المعرفة المحددة، ويجب وضع جميع المتغيرات بين قوسين متعرجين {} في "موجه النظام". راجع https://ragflow.io/docs/dev/set_chat_variables للحصول على التفاصيل.',
+ add: 'يضيف',
+ key: 'مفتاح',
+ optional: 'خياري',
+ operation: 'عملية',
+ model: 'نموذج',
+ modelTip: 'نموذج دردشة لغة كبيرة',
+ modelMessage: 'الرجاء التحديد!',
+ modelEnabledTools: 'الأدوات الممكّنة',
+ modelEnabledToolsTip:
+ 'الرجاء تحديد أداة واحدة أو أكثر لاستخدامها في نموذج الدردشة. لا يؤثر ذلك على النماذج التي لا تدعم استدعاء الأداة.',
+ freedom: 'إِبداع',
+ improvise: 'ارتجل',
+ precise: 'دقيق',
+ balance: 'توازن',
+ custom: 'مخصص',
+ freedomTip:
+ 'اختصار لإعدادات "درجة الحرارة"، و"Top P"، و"عقوبة الحضور"، و"عقوبة التردد"، للإشارة إلى مستوى حرية النموذج. تحتوي هذه المعلمة على ثلاثة خيارات: حدد "ارتجال" لإنتاج استجابات أكثر إبداعًا؛ حدد "دقيق" (افتراضي) لإنتاج ردود أكثر تحفظًا؛ "التوازن" هو حل وسط بين "الارتجال" و"الدقة".',
+ temperature: 'درجة حرارة',
+ temperatureMessage: 'درجة الحرارة مطلوبة',
+ temperatureTip:
+ 'تتحكم هذه المعلمة في عشوائية تنبؤات النموذج. تؤدي درجة الحرارة المنخفضة إلى استجابات أكثر تحفظًا، في حين تؤدي درجة الحرارة المرتفعة إلى استجابات أكثر إبداعًا وتنوعًا.',
+ topP: 'أعلى ص',
+ topPMessage: 'مطلوب أعلى P',
+ topPTip:
+ 'تُعرف هذه المعلمة أيضًا باسم "أخذ العينات النووية"، وتحدد عتبة لاختيار مجموعة أصغر من الكلمات الأكثر احتمالية لأخذ عينة منها، مما يؤدي إلى قطع الكلمات الأقل احتمالًا.',
+ presencePenalty: 'عقوبة الحضور',
+ presencePenaltyMessage: 'مطلوب عقوبة الحضور',
+ presencePenaltyTip:
+ 'وهذا لا يشجع النموذج على تكرار نفس المعلومات عن طريق معاقبة الكلمات التي ظهرت بالفعل في المحادثة.',
+ frequencyPenalty: 'عقوبة التردد',
+ frequencyPenaltyMessage: 'مطلوب عقوبة التردد',
+ frequencyPenaltyTip:
+ 'وعلى غرار عقوبة الحضور، فإن هذا يقلل من ميل النموذج إلى تكرار نفس الكلمات بشكل متكرر.',
+ maxTokens: 'الرموز القصوى',
+ maxTokensMessage: 'مطلوب الحد الأقصى من الرموز',
+ maxTokensTip:
+ 'الحد الأقصى لحجم سياق النموذج؛ ستتسبب القيمة غير الصالحة أو غير الصحيحة في حدوث خطأ. الافتراضي هو 512.',
+ maxTokensInvalidMessage: 'الرجاء إدخال رقم صالح لرموز الحد الأقصى.',
+ maxTokensMinMessage: 'لا يمكن أن يكون الحد الأقصى للرموز أقل من 0.',
+ quote: 'عرض الاقتباس',
+ quoteTip: 'ما إذا كان سيتم عرض النص الأصلي كمرجع.',
+ selfRag: 'خرقة ذاتية',
+ selfRagTip: 'يرجى الرجوع إلى: https://huggingface.co/papers/2310.11511',
+ overview: 'معرف الدردشة',
+ pv: 'عدد الرسائل',
+ uv: 'رقم المستخدم النشط',
+ speed: 'سرعة إخراج الرمز',
+ tokens: 'استهلك الرقم المميز',
+ round: 'رقم تفاعل الجلسة',
+ thumbUp: 'رضا العملاء',
+ preview: 'معاينة',
+ embedded: 'مغروس',
+ serviceApiEndpoint: 'نقطة نهاية واجهة برمجة تطبيقات الخدمة',
+ apiKey: 'مفتاح واجهة برمجة التطبيقات',
+ apiReference: 'وثائق API',
+ dateRange: 'النطاق الزمني:',
+ backendServiceApi: 'خادم API',
+ createNewKey: 'إنشاء مفتاح جديد',
+ created: 'مخلوق',
+ action: 'فعل',
+ embedModalTitle: 'تضمين في صفحة الويب',
+ comingSoon: 'قريباً',
+ fullScreenTitle: 'تضمين كامل',
+ fullScreenDescription:
+ 'قم بتضمين إطار iframe التالي في موقع الويب الخاص بك في الموقع المطلوب',
+ partialTitle: 'تضمين جزئي',
+ extensionTitle: 'ملحق كروم',
+ tokenError: 'الرجاء إنشاء مفتاح API أولاً.',
+ betaError:
+ 'يرجى الحصول على مفتاح RAGFlow API من صفحة إعدادات النظام أولاً.',
+ searching: 'جارٍ البحث...',
+ parsing: 'إعراب',
+ uploading: 'جارٍ التحميل',
+ uploadFailed: 'فشل التحميل',
+ regenerate: 'تجديد',
+ read: 'قراءة المحتوى',
+ tts: 'تحويل النص إلى كلام',
+ ttsTip:
+ 'تأكد من تحديد نموذج TTS في صفحة الإعدادات قبل تمكين هذا التبديل لتشغيل النص كصوت.',
+ relatedQuestion: 'سؤال ذو صلة',
+ answerTitle: 'ر',
+ multiTurn: 'متعدد بدوره الأمثل',
+ multiTurnTip:
+ 'يؤدي هذا إلى تحسين استعلامات المستخدم باستخدام السياق في محادثة متعددة الجولات. عند تمكينه، سوف يستهلك رموز LLM إضافية.',
+ howUseId: 'كيفية استخدام معرف الدردشة؟',
+ description: 'وصف المساعد',
+ descriptionPlaceholder: 'على سبيل المثال مساعد الدردشة للسيرة الذاتية.',
+ useKnowledgeGraph: 'استخدام الرسم البياني المعرفة',
+ useKnowledgeGraphTip:
+ 'ما إذا كان سيتم استخدام الرسم البياني (الرسومات) المعرفية في قاعدة (قواعد) المعرفة المحددة أثناء الاسترداد للإجابة على الأسئلة متعددة القفزات. عند التمكين، قد يتضمن ذلك عمليات بحث متكررة عبر أجزاء تقرير الكيان والعلاقة والمجتمع، مما يؤدي إلى زيادة وقت الاسترجاع بشكل كبير.',
+ keyword: 'تحليل الكلمات الرئيسية',
+ keywordTip:
+ 'استخدم LLM لتحليل أسئلة المستخدم، واستخراج الكلمات الرئيسية التي سيتم التأكيد عليها أثناء حساب الصلة. يعمل بشكل جيد مع الاستفسارات الطويلة ولكنه سيزيد من وقت الاستجابة.',
+ languageTip:
+ 'يسمح بإعادة كتابة الجملة باللغة المحددة أو الإعداد الافتراضي للسؤال الأخير إذا لم يتم تحديده.',
+ avatarHidden: 'إخفاء الصورة الرمزية',
+ locale: 'لغة',
+ selectLanguage: 'اختر لغة',
+ reasoning: 'المنطق',
+ reasoningTip:
+ 'ما إذا كان سيتم تمكين سير عمل الاستدلال أثناء الإجابة على الأسئلة، كما هو موضح في نماذج مثل Deepseek-R1 أو OpenAI o1. عند تمكينه، يسمح هذا للنموذج بالوصول إلى المعرفة الخارجية ومعالجة الأسئلة المعقدة بطريقة خطوة بخطوة، مع الاستفادة من تقنيات مثل تفكير سلسلة الأفكار. يعزز هذا النهج قدرة النموذج على تقديم استجابات دقيقة عن طريق تقسيم المشكلات إلى خطوات يمكن التحكم فيها، وتحسين الأداء في المهام التي تتطلب تفكيرًا منطقيًا وتفكيرًا متعدد الخطوات.',
+ tavilyApiKeyTip:
+ 'إذا تم تعيين مفتاح API بشكل صحيح هنا، فسيتم استخدام عمليات البحث على الويب المستندة إلى Tavily لتكملة استرجاع قاعدة المعرفة.',
+ tavilyApiKeyMessage: 'الرجاء إدخال مفتاح Tavily API الخاص بك',
+ tavilyApiKeyHelp: 'كيفية الحصول عليه؟',
+ crossLanguage: 'البحث عبر اللغات',
+ crossLanguageTip:
+ 'حدد لغة واحدة أو أكثر للبحث بين اللغات. إذا لم يتم تحديد أي لغة، فسيقوم النظام بالبحث باستخدام الاستعلام الأصلي.',
+ createChat: 'إنشاء دردشة',
+ metadata: 'بيانات التعريف',
+ metadataTip:
+ 'تصفية البيانات التعريفية هي عملية استخدام سمات البيانات التعريفية (مثل العلامات أو الفئات أو أذونات الوصول) لتحسين عملية استرجاع المعلومات ذات الصلة داخل النظام والتحكم فيها.',
+ conditions: 'شروط',
+ metadataKeys: 'العناصر القابلة للتصفية',
+ addCondition: 'إضافة شرط',
+ meta: {
+ disabled: 'عاجز',
+ auto: 'تلقائي',
+ manual: 'يدوي',
+ semi_auto: 'شبه تلقائي',
+ },
+ cancel: 'يلغي',
+ chatSetting: 'إعداد الدردشة',
+ tocEnhance: 'فهرس الصفحة',
+ tocEnhanceTip:
+ 'أثناء تحليل المستند، تم إنشاء معلومات جدول المحتويات (راجع خيار "تمكين استخراج جدول المحتويات" في الطريقة العامة). يسمح هذا للنموذج الكبير بإرجاع عناصر جدول المحتويات ذات الصلة باستعلام المستخدم، وبالتالي استخدام هذه العناصر لاسترداد الأجزاء ذات الصلة وتطبيق الترجيح على هذه القطع أثناء عملية الفرز. يحاكي هذا الأسلوب سلوك الإنسان في البحث عن المعلومات في الكتب.',
+ batchDeleteSessions: 'حذف دفعة',
+ deleteSelectedConfirm: 'هل تريد حذف الجلسة (الجلسات) {{count}} المحددة؟',
+ },
+ setting: {
+ Verify: 'يؤكد',
+ keyValid: 'مفتاح API الخاص بك صالح.',
+ keyInvalid: 'مفتاح API الخاص بك غير صالح.',
+ deleteModel: 'حذف النموذج',
+ bedrockCredentialsHint:
+ 'نصيحة: اترك مفتاح الوصول / المفتاح السري فارغًا لاستخدام مصادقة AWS IAM.',
+ awsAuthModeAccessKeySecret: 'مفتاح الوصول',
+ awsAuthModeIamRole: 'دور IAM',
+ awsAuthModeAssumeRole: 'تفترض الدور',
+ awsAccessKeyId: 'معرف مفتاح الوصول إلى AWS',
+ awsSecretAccessKey: 'مفتاح الوصول السري لـ AWS',
+ awsRoleArn: 'دور AWS ARN',
+ awsRoleArnMessage: 'الرجاء إدخال ARN لدور AWS',
+ awsAssumeRoleTip:
+ 'إذا حددت هذا الوضع، فسيتولى مثيل Amazon EC2 دوره الحالي للوصول إلى خدمات AWS. لا توجد بيانات اعتماد إضافية مطلوبة.',
+ modelEmptyTip:
+ 'لا توجد نماذج متاحة. الرجاء إضافة نماذج من اللوحة الموجودة على اليمين.',
+ sourceEmptyTip:
+ 'لم تتم إضافة أي مصادر بيانات حتى الآن. اختر واحدة أدناه للاتصال.',
+ seconds: 'ثواني',
+ minutes: 'دقائق',
+ edit: 'يحرر',
+ cropTip:
+ 'اسحب منطقة التحديد لاختيار موضع اقتصاص الصورة، ثم قم بالتمرير للتكبير/التصغير',
+ cropImage: 'صورة المحاصيل',
+ selectModelPlaceholder: 'حدد النموذج',
+ configureModelTitle: 'تكوين النموذج',
+ connectorNameTip: 'اسم وصفي للموصل',
+ confluenceIsCloudTip:
+ 'تحقق مما إذا كان هذا هو مثيل Confluence Cloud، قم بإلغاء تحديد Confluence Server/Data Center',
+ confluenceWikiBaseUrlTip:
+ 'عنوان URL الأساسي لمثيل Confluence الخاص بك (على سبيل المثال، https://your-domain.atlassian.net/wiki)',
+ confluenceSpaceKeyTip:
+ 'اختياري: حدد مفتاح مسافة لتقييد المزامنة بمساحة معينة. اتركه فارغًا لمزامنة جميع المساحات التي يمكن الوصول إليها. بالنسبة للمسافات المتعددة، افصل بينها بفواصل (على سبيل المثال، DEV،DOCS،HR)',
+ s3PrefixTip:
+ 'حدد مسار المجلد داخل مجموعة S3 الخاصة بك لجلب الملفات منه.\nمثال: عام/v2/',
+ S3CompatibleEndpointUrlTip:
+ 'مطلوب لصندوق تخزين متوافق مع S3. حدد عنوان URL لنقطة النهاية المتوافقة مع S3.\nمثال: https://fsn1.your-objectstorage.com',
+ S3CompatibleAddressingStyleTip:
+ 'مطلوب لصندوق تخزين متوافق مع S3. حدد نمط العنونة المتوافق مع S3.\nمثال: النمط المستضاف الافتراضي',
+ addDataSourceModalTitle: 'قم بإنشاء موصل {{name}} الخاص بك',
+ deleteSourceModalTitle: 'حذف مصدر البيانات',
+ deleteSourceModalContent:
+ 'هل أنت متأكد من أنك تريد حذف رابط مصدر البيانات هذا؟
',
+ deleteSourceModalConfirmText: 'يتأكد',
+ errorMsg: 'رسالة خطأ',
+ newDocs: 'مستندات جديدة',
+ timeStarted: 'بدأ الوقت',
+ log: 'سجل',
+ confluenceDescription:
+ 'قم بدمج مساحة عمل Confluence الخاصة بك للبحث في الوثائق.',
+ s3Description:
+ 'اتصل بحاوية AWS S3 الخاصة بك لاستيراد الملفات المخزنة ومزامنتها.',
+ google_cloud_storageDescription:
+ 'قم بتوصيل مجموعة Google Cloud Storage لاستيراد الملفات ومزامنتها.',
+ r2Description:
+ 'قم بتوصيل مجموعة Cloudflare R2 الخاصة بك لاستيراد الملفات ومزامنتها.',
+ oci_storageDescription:
+ 'قم بتوصيل حاوية Oracle Cloud Object Storage لاستيراد الملفات ومزامنتها.',
+ discordDescription:
+ 'قم بربط خادم Discord الخاص بك للوصول إلى بيانات الدردشة وتحليلها.',
+ notionDescription:
+ 'مزامنة الصفحات وقواعد البيانات من Notion لاسترجاع المعرفة.',
+ google_driveDescription:
+ 'قم بتوصيل Google Drive الخاص بك عبر OAuth وقم بمزامنة مجلدات أو محركات أقراص محددة.',
+ gmailDescription:
+ 'قم بتوصيل Gmail الخاص بك عبر OAuth لمزامنة رسائل البريد الإلكتروني.',
+ webdavDescription: 'اتصل بخوادم WebDAV لمزامنة الملفات.',
+ webdavRemotePathTip:
+ 'اختياري: حدد مسار المجلد على خادم WebDAV (على سبيل المثال، /Documents). اتركه فارغًا للمزامنة من الجذر.',
+ google_driveTokenTip:
+ 'قم بتحميل رمز OAuth المميز JSON الذي تم إنشاؤه من مساعد OAuth أو Google Cloud Console. يمكنك أيضًا تحميل Client_secret JSON من تطبيق "مثبت" أو "ويب". إذا كانت هذه هي المزامنة الأولى لك، فسيتم فتح نافذة متصفح لإكمال موافقة OAuth. إذا كان JSON يحتوي بالفعل على رمز تحديث، فسيتم إعادة استخدامه تلقائيًا.',
+ google_drivePrimaryAdminTip:
+ 'عنوان البريد الإلكتروني الذي يمكنه الوصول إلى محتوى Drive الذي تتم مزامنته',
+ zendeskDescription:
+ 'قم بتوصيل Zendesk الخاص بك لمزامنة التذاكر والمقالات والمحتويات الأخرى.',
+ google_driveMyDriveEmailsTip:
+ 'رسائل البريد الإلكتروني المفصولة بفواصل والتي يجب فهرسة محتويات "ملفاتي" (بما في ذلك المسؤول الأساسي).',
+ google_driveSharedFoldersTip:
+ 'روابط مجلد Google Drive مفصولة بفواصل للزحف.',
+ gmailPrimaryAdminTip:
+ 'البريد الإلكتروني الأساسي للمشرف مع إمكانية الوصول إلى Gmail / Workspace، يُستخدم لتعداد مستخدمي المجال وكحساب المزامنة الافتراضي.',
+ gmailTokenTip:
+ 'قم بتحميل OAuth JSON الذي تم إنشاؤه من Google Console. إذا كان يحتوي فقط على بيانات اعتماد العميل، فقم بتشغيل التحقق المستند إلى المتصفح مرة واحدة لسك رموز التحديث طويلة الأمد.',
+ dropboxDescription:
+ 'قم بتوصيل Dropbox الخاص بك لمزامنة الملفات والمجلدات من الحساب المختار.',
+ bitbucketDescription:
+ 'قم بتوصيل Bitbucket لمزامنة محتوى العلاقات العامة.',
+ bitbucketTopWorkspaceTip:
+ 'مساحة عمل Bitbucket المراد فهرستها (على سبيل المثال، "atlassian" من https://bitbucket.org/atlassian/workspace ).',
+ bitbucketRepositorySlugsTip:
+ 'البزاقات المستودعية المفصولة بفواصل. على سبيل المثال، الريبو واحد، الريبو اثنين',
+ bitbucketProjectsTip:
+ 'مفاتيح المشروع مفصولة بفواصل. على سبيل المثال، PROJ1، PROJ2',
+ bitbucketWorkspaceTip:
+ 'سيقوم هذا الرابط بفهرسة كافة المستودعات الموجودة في مساحة العمل.',
+ boxDescription: 'قم بتوصيل محرك Box الخاص بك لمزامنة الملفات والمجلدات.',
+ githubDescription:
+ 'قم بتوصيل GitHub لمزامنة طلبات السحب ومشكلات الاسترجاع.',
+ airtableDescription:
+ 'اتصل بـ Airtable وقم بمزامنة الملفات من جدول محدد ضمن مساحة عمل محددة.',
+ gitlabDescription:
+ 'قم بتوصيل GitLab لمزامنة المستودعات والمشكلات وطلبات الدمج والوثائق ذات الصلة.',
+ asanaDescription: 'اتصل بـ Asana وقم بمزامنة الملفات من مساحة عمل محددة.',
+ imapDescription:
+ 'اتصل بصندوق بريد IMAP الخاص بك لمزامنة رسائل البريد الإلكتروني لاسترجاع المعرفة.',
+ dropboxAccessTokenTip:
+ 'قم بإنشاء رمز وصول طويل الأمد في Dropbox App Console باستخدام نطاقات files.metadata.read وfiles.content.read وsharing.read.',
+ moodleDescription:
+ 'اتصل بنظام Moodle LMS الخاص بك لمزامنة محتوى الدورة والمنتديات والموارد.',
+ moodleUrlTip:
+ 'عنوان URL الأساسي لمثيل Moodle الخاص بك (على سبيل المثال، https://moodle.university.edu). لا تقم بتضمين /webservice أو /login.',
+ moodleTokenTip:
+ 'أنشئ رمزًا مميزًا لخدمة الويب في Moodle: انتقل إلى إدارة الموقع ← الخادم ← خدمات الويب ← إدارة الرموز المميزة. يجب أن يكون المستخدم مسجلاً في المقررات الدراسية التي تريد مزامنتها.',
+ seafileDescription:
+ 'اتصل بخادم SeaFile الخاص بك لمزامنة الملفات والمستندات من مكتباتك.',
+ seafileUrlTip:
+ 'عنوان URL الكامل لخادم SeaFile الخاص بك بما في ذلك البروتوكول. مثال: https://seafile.example.com - لا تقم بتضمين شرطة مائلة زائدة أو أي مسار بعد المجال.',
+ seafileAccountScopeTip:
+ 'مزامنة جميع المكتبات المرئية لرمز واجهة برمجة تطبيقات الحساب أدناه.',
+ seafileTokenPanelHeading: 'قم بتوفير إحدى طرق المصادقة التالية:',
+ seafileTokenPanelAccountBullet: '- يمنح الوصول إلى جميع مكتباتك.',
+ seafileTokenPanelLibraryBullet: '— مُخصص لمكتبة واحدة فقط (أكثر أمانًا).',
+ seafileValidationAccountTokenRequired:
+ 'رمز واجهة برمجة التطبيقات للحساب مطلوب لنطاق الحساب بالكامل',
+ seafileValidationTokenRequired: 'قم بتوفير رمز API للحساب أو رمز المكتبة',
+ seafileValidationLibraryIdRequired: 'معرف المكتبة مطلوب',
+ seafileValidationDirectoryPathRequired: 'مسار الدليل مطلوب',
+ seafileSyncScopeTip:
+ 'يتحكم في ما تتم مزامنته: (1) الحساب بالكامل - يقوم بمزامنة جميع المكتبات التي يمكن لرمزك الوصول إليها. يتطلب رمز API للحساب. (2) مكتبة واحدة - مزامنة جميع الملفات داخل مكتبة واحدة محددة. يتطلب معرف المكتبة وإما رمز API للحساب أو رمز API للمكتبة. (3) الدليل المحدد - يقوم بمزامنة الملفات فقط داخل مجلد معين داخل المكتبة. يتطلب معرف المكتبة، ومسار المجلد داخل تلك المكتبة، وإما رمز واجهة برمجة تطبيقات الحساب أو رمز واجهة برمجة تطبيقات المكتبة.',
+ seafileTokenTip:
+ 'رمز SeaFile API الخاص بك على مستوى الحساب. يمنح الوصول إلى جميع المكتبات المرئية لحسابك. مطلوب عندما يكون نطاق المزامنة هو "الحساب بالكامل". بالنسبة إلى "المكتبة الفردية" أو "الدليل المحدد"، يمكنك استخدام هذا الرمز المميز أو رمز Library API المميز بدلاً من ذلك.',
+ seafileRepoTokenTip:
+ 'رمز واجهة برمجة التطبيقات (API) على مستوى المكتبة والذي يمنح الوصول إلى مكتبة واحدة محددة فقط. يمكن استخدامه بدلاً من رمز واجهة برمجة تطبيقات الحساب لنطاقات مزامنة "المكتبة الفردية" و"الدليل المحدد".',
+ seafileRepoIdTip:
+ 'المعرف الفريد (UUID) لمكتبة SeaFile التي تريد مزامنتها. يمكنك العثور عليه في شريط عنوان المتصفح الخاص بك عند فتح المكتبة في واجهة الويب SeaFile. مثال: 7a9e1b3c-4d5f-6a7b-8c9d-0e1f2a3b4c5d. مطلوب عندما يكون نطاق المزامنة هو "مكتبة واحدة" أو "دليل محدد".',
+ seafileSyncPathTip:
+ 'المسار المطلق للمجلد المطلوب مزامنته داخل المكتبة المحددة بواسطة معرف المكتبة أعلاه. يجب أن تبدأ بشرطة مائلة للأمام. سيتم تضمين كافة الملفات والمجلدات الفرعية ضمن هذا المسار بشكل متكرر. مثال: /المستندات/التقارير. هام: يجب أن يكون المجلد موجودًا داخل المكتبة المحددة. المسارات خارج المكتبة غير مدعومة. يتم استخدامه فقط عندما يكون نطاق المزامنة هو "دليل محدد".',
+ seafileIncludeSharedTip:
+ 'عند التمكين، يتم تضمين المكتبات التي شاركها المستخدمون الآخرون معك في المزامنة. عند التعطيل، تتم مزامنة المكتبات المملوكة لحسابك فقط. ينطبق فقط عندما يكون نطاق المزامنة هو "الحساب بالكامل".',
+ seafileBatchSizeTip:
+ 'عدد المستندات التي تمت معالجتها وإرجاعها لكل دفعة أثناء المزامنة. تستخدم القيمة الأصغر ذاكرة أقل ولكنها قد تكون أبطأ بشكل عام. الافتراضي: 100.',
+ jiraDescription:
+ 'قم بتوصيل مساحة عمل Jira الخاصة بك لمزامنة المشكلات والتعليقات والمرفقات.',
+ jiraBaseUrlTip:
+ 'عنوان URL الأساسي لموقع Jira الخاص بك (على سبيل المثال، https://your-domain.atlassian.net).',
+ jiraProjectKeyTip:
+ 'اختياري: تقييد المزامنة بمفتاح مشروع واحد (على سبيل المثال، ENG).',
+ jiraJqlTip:
+ 'مرشح JQL اختياري. اتركه فارغًا للاعتماد على مرشحات المشروع/الوقت.',
+ jiraBatchSizeTip: 'الحد الأقصى لعدد الإصدارات المطلوبة من Jira لكل دفعة.',
+ jiraCommentsTip:
+ 'قم بتضمين تعليقات Jira في مستند تخفيض السعر الذي تم إنشاؤه.',
+ jiraAttachmentsTip: 'قم بتنزيل المرفقات كمستندات منفصلة أثناء المزامنة.',
+ jiraAttachmentSizeTip:
+ 'سيتم تخطي المرفقات الأكبر من هذا العدد من البايتات.',
+ jiraLabelsTip: 'التسميات التي يجب تخطيها أثناء الفهرسة (مفصولة بفواصل).',
+ jiraBlacklistTip:
+ 'سيتم تجاهل التعليقات التي يتطابق بريد مؤلفها الإلكتروني مع هذه الإدخالات.',
+ jiraScopedTokenTip:
+ 'قم بتمكين هذا عند استخدام رموز Atlassian المميزة (api.atlassian.com).',
+ jiraEmailTip:
+ 'البريد الإلكتروني المرتبط بحساب Jira/الرمز المميز لواجهة برمجة التطبيقات.',
+ jiraTokenTip:
+ 'رمز API المميز الذي تم إنشاؤه من https://id.atlassian.com/manage-profile/security/api-tokens.',
+ jiraPasswordTip: 'كلمة مرور اختيارية لبيئات Jira Server/Data Center.',
+ mysqlDescription:
+ 'اتصل بقاعدة بيانات MySQL لمزامنة البيانات من الجداول باستخدام استعلامات SQL.',
+ mysqlQueryTip:
+ 'استعلام SQL لاستخراج البيانات من قاعدة البيانات الخاصة بك (على سبيل المثال، SELECT * FROM Products WHERE Status = "active").',
+ mysqlContentColumnsTip:
+ 'أسماء الأعمدة المفصولة بفواصل والتي سيتم دمج قيمها كمحتوى مستند لتوجيهها.',
+ mysqlMetadataColumnsTip:
+ 'أسماء أعمدة مفصولة بفواصل لتخزينها كبيانات تعريف للمستند (غير متجهة، ولكنها قابلة للبحث).',
+ mysqlIdColumnTip:
+ 'العمود المطلوب استخدامه كمعرف مستند فريد. إذا لم يتم تحديده، سيتم استخدام تجزئة المحتوى.',
+ mysqlTimestampColumnTip:
+ 'عمود التاريخ والوقت/الطابع الزمني للمزامنة المتزايدة. سيتم جلب الصفوف التي تم تعديلها بعد آخر مزامنة فقط.',
+ postgresqlDescription:
+ 'اتصل بقاعدة بيانات PostgreSQL لمزامنة البيانات من الجداول باستخدام استعلامات SQL.',
+ postgresqlQueryTip:
+ "استعلام SQL لاستخراج البيانات من قاعدة البيانات الخاصة بك (على سبيل المثال، SELECT * FROM Products WHERE Status = 'active').",
+ postgresqlContentColumnsTip:
+ 'أسماء الأعمدة المفصولة بفواصل والتي سيتم دمج قيمها كمحتوى مستند لتوجيهها.',
+ postgresqlMetadataColumnsTip:
+ 'أسماء أعمدة مفصولة بفواصل لتخزينها كبيانات تعريف للمستند (غير متجهة، ولكنها قابلة للبحث).',
+ postgresqlIdColumnTip:
+ 'العمود المطلوب استخدامه كمعرف مستند فريد. إذا لم يتم تحديده، سيتم استخدام تجزئة المحتوى.',
+ postgresqlTimestampColumnTip:
+ 'عمود التاريخ والوقت/الطابع الزمني للمزامنة المتزايدة. سيتم جلب الصفوف التي تم تعديلها بعد آخر مزامنة فقط.',
+ availableSourcesDescription: 'حدد مصدر بيانات لإضافته',
+ availableSources: 'المصادر المتاحة',
+ datasourceDescription: 'إدارة مصدر البيانات والاتصالات الخاصة بك',
+ save: 'يحفظ',
+ search: 'يبحث',
+ availableModels: 'النماذج المتاحة',
+ profile: 'حساب تعريفي',
+ avatar: 'الصورة الرمزية',
+ avatarTip: 'سيتم عرض هذا في ملفك الشخصي.',
+ profileDescription: 'قم بتحديث صورتك وتفاصيلك الشخصية هنا.',
+ maxTokens: 'الرموز القصوى',
+ maxTokensMessage: 'مطلوب الحد الأقصى من الرموز',
+ maxTokensTip:
+ 'الحد الأقصى لحجم سياق النموذج؛ ستتسبب القيمة غير الصالحة أو غير الصحيحة في حدوث خطأ. الافتراضي هو 512.',
+ maxTokensInvalidMessage: 'الرجاء إدخال رقم صالح لرموز الحد الأقصى.',
+ maxTokensMinMessage: 'لا يمكن أن يكون الحد الأقصى للرموز أقل من 0.',
+ password: 'كلمة المرور',
+ passwordDescription:
+ 'الرجاء إدخال كلمة المرور الحالية لتغيير كلمة المرور الخاصة بك.',
+ model: 'مقدمي النماذج',
+ systemModelDescription: 'يرجى إكمال هذه الإعدادات قبل البدء',
+ dataSources: 'مصادر البيانات',
+ team: 'فريق',
+ system: 'نظام',
+ logout: 'تسجيل الخروج',
+ api: 'واجهة برمجة التطبيقات',
+ username: 'اسم',
+ usernameMessage: 'الرجاء إدخال اسم المستخدم الخاص بك!',
+ photo: 'صورتك',
+ photoDescription: 'سيتم عرض هذا في ملفك الشخصي.',
+ colorSchema: 'مخطط اللون',
+ colorSchemaMessage: 'الرجاء تحديد مخطط الألوان الخاص بك!',
+ colorSchemaPlaceholder: 'حدد مخطط الألوان الخاص بك',
+ bright: 'ساطع',
+ dark: 'مظلم',
+ timezone: 'المنطقة الزمنية',
+ timezoneMessage: 'الرجاء إدخال المنطقة الزمنية الخاصة بك!',
+ timezonePlaceholder: 'حدد منطقتك الزمنية',
+ email: 'بريد إلكتروني',
+ emailDescription: 'بمجرد التسجيل، لا يمكن تغيير البريد الإلكتروني.',
+ currentPassword: 'كلمة المرور الحالية',
+ currentPasswordMessage: 'الرجاء إدخال كلمة المرور الخاصة بك!',
+ newPassword: 'كلمة المرور الجديدة',
+ changePassword: 'تغيير كلمة المرور',
+ newPasswordMessage: 'الرجاء إدخال كلمة المرور الخاصة بك!',
+ newPasswordDescription: 'يجب أن تكون كلمة المرور الجديدة أكثر من 8 أحرف.',
+ confirmPassword: 'تأكيد كلمة المرور الجديدة',
+ confirmPasswordMessage: 'يرجى تأكيد كلمة المرور الخاصة بك!',
+ confirmPasswordNonMatchMessage:
+ 'كلمة المرور الجديدة التي أدخلتها غير متطابقة!',
+ cancel: 'يلغي',
+ addedModels: 'النماذج المضافة',
+ modelsToBeAdded: 'النماذج المراد إضافتها',
+ addTheModel: 'يضيف',
+ apiKey: 'مفتاح API',
+ apiKeyMessage: 'الرجاء إدخال مفتاح API',
+ apiKeyTip: 'يمكن الحصول على مفتاح API عن طريق تسجيل مورد LLM المقابل.',
+ showMoreModels: 'عرض النماذج',
+ hideModels: 'إخفاء النماذج',
+ baseUrl: 'عنوان URL الأساسي',
+ baseUrlTip:
+ 'إذا كان مفتاح API الخاص بك من OpenAI، فما عليك سوى تجاهله. سيعطي أي مقدمي خدمة وسيطين آخرين عنوان URL الأساسي هذا مع مفتاح واجهة برمجة التطبيقات (API).',
+ tongyiBaseUrlTip:
+ 'بالنسبة للمستخدمين الصينيين، لا حاجة لملء أو استخدام https://dashscope.aliyuncs.com/compatible-mode/v1. للمستخدمين الدوليين، استخدم https://dashscope-intl.aliyuncs.com/compatible-mode/v1',
+ tongyiBaseUrlPlaceholder:
+ '(للمستخدمين الدوليين فقط، يرجى الاطلاع على النصيحة)',
+ minimaxBaseUrlTip:
+ 'للمستخدمين الدوليين فقط: استخدم https://api.minimax.io/v1',
+ minimaxBaseUrlPlaceholder:
+ '(للمستخدمين الدوليين فقط، املأ https://api.minimax.io/v1)',
+ modify: 'يُعدِّل',
+ systemModelSettings: 'تعيين النماذج الافتراضية',
+ chatModel: 'ماجستير',
+ chatModelTip: 'LLM الافتراضي لكل قاعدة معرفية تم إنشاؤها حديثًا.',
+ embeddingModel: 'التضمين',
+ embeddingModelTip:
+ 'نموذج التضمين الافتراضي لكل قاعدة معرفية تم إنشاؤها حديثًا. إذا لم تتمكن من العثور على نموذج التضمين من القائمة المنسدلة، فتحقق مما إذا كنت تستخدم إصدار RAGFlow النحيف (الذي لا يتضمن نماذج التضمين) أو تحقق من https://ragflow.io/docs/dev/supported_models لمعرفة ما إذا كان موفر النموذج الخاص بك يدعم هذا النموذج.',
+ img2txtModel: 'VLM',
+ img2txtModelTip:
+ 'VLM الافتراضي لكل قاعدة معارف تم إنشاؤها حديثًا. وهو يصف صورة أو مقطع فيديو. إذا لم تتمكن من العثور على نموذج من القائمة المنسدلة، فراجع https://ragflow.io/docs/dev/supported_models لمعرفة ما إذا كان موفر النموذج الخاص بك يدعم هذا النموذج.',
+ sequence2txtModel: 'ASR',
+ sequence2txtModelTip:
+ 'نموذج ASR الافتراضي لكل مجموعة بيانات تم إنشاؤها حديثًا. استخدم هذا النموذج لترجمة الأصوات إلى النص المقابل.',
+ rerankModel: 'إعادة الترتيب',
+ rerankModelTip:
+ 'نموذج إعادة الترتيب الافتراضي لإعادة ترتيب القطع. إذا لم تتمكن من العثور على نموذج من القائمة المنسدلة، فراجع https://ragflow.io/docs/dev/supported_models لمعرفة ما إذا كان موفر النموذج الخاص بك يدعم هذا النموذج.',
+ ttsModel: 'تحويل النص إلى كلام',
+ ttsModelTip:
+ 'النموذج الافتراضي لتحويل النص إلى كلام. إذا لم تتمكن من العثور على نموذج من القائمة المنسدلة، فراجع https://ragflow.io/docs/dev/supported_models لمعرفة ما إذا كان موفر النموذج الخاص بك يدعم هذا النموذج.',
+ workspace: 'مساحة العمل',
+ upgrade: 'يرقي',
+ addLlmTitle: 'أضف ماجستير',
+ editLlmTitle: 'تحرير {{name}} النموذج',
+ editModel: 'تحرير النموذج',
+ modelName: 'اسم النموذج',
+ modelID: 'معرف النموذج',
+ modelUid: 'المعرف الفريد للنموذج',
+ modelNameMessage: 'الرجاء إدخال اسم النموذج الخاص بك!',
+ modelType: 'نوع النموذج',
+ modelTypeMessage: 'الرجاء إدخال نوع النموذج الخاص بك!',
+ addLlmBaseUrl: 'عنوان URL الأساسي',
+ baseUrlNameMessage: 'الرجاء إدخال عنوان URL الأساسي الخاص بك!',
+ paddleocr: {
+ apiUrl: 'عنوان URL لواجهة برمجة تطبيقات PaddleOCR',
+ apiUrlPlaceholder:
+ 'على سبيل المثال: https://paddleocr-server.com/layout-parsing',
+ accessToken: 'رمز الوصول إلى استوديو الذكاء الاصطناعي',
+ accessTokenPlaceholder: 'رمز AI Studio الخاص بك (اختياري)',
+ algorithm: 'خوارزمية PaddleOCR',
+ selectAlgorithm: 'حدد الخوارزمية',
+ modelNamePlaceholder: 'على سبيل المثال: paddleocr-from-env-1',
+ modelNameRequired: 'اسم النموذج مطلوب',
+ apiUrlRequired: 'مطلوب عنوان URL لواجهة برمجة تطبيقات PaddleOCR',
+ },
+ vision: 'هل يدعم الرؤية؟',
+ ollamaLink: 'كيفية دمج {{name}}',
+ FishAudioLink: 'كيفية استخدام فيش اوديو',
+ TencentCloudLink: 'كيفية استخدام TencentCloud ASR',
+ volcModelNameMessage: 'الرجاء إدخال اسم النموذج الخاص بك!',
+ addEndpointID: 'معرف نقطة النهاية للنموذج',
+ endpointIDMessage: 'يرجى إدخال معرف نقطة النهاية الخاص بك للنموذج',
+ addArkApiKey: 'فولك ARK_API_KEY',
+ ArkApiKeyMessage: 'الرجاء إدخال ARK_API_KEY الخاص بك',
+ bedrockModelNameMessage: 'الرجاء إدخال اسم النموذج الخاص بك!',
+ addBedrockEngineAK: 'مفتاح الوصول',
+ bedrockAKMessage: 'الرجاء إدخال مفتاح الوصول الخاص بك',
+ addBedrockSK: 'المفتاح السري',
+ bedrockSKMessage: 'الرجاء إدخال المفتاح السري الخاص بك',
+ bedrockRegion: 'منطقة أوس',
+ bedrockRegionMessage: 'الرجاء التحديد!',
+ 'us-east-2': 'شرق الولايات المتحدة (أوهايو)',
+ 'us-east-1': 'شرق الولايات المتحدة (شمال فرجينيا)',
+ 'us-west-1': 'غرب الولايات المتحدة (شمال كاليفورنيا)',
+ 'us-west-2': 'غرب الولايات المتحدة (أوريغون)',
+ 'af-south-1': 'أفريقيا (كيب تاون)',
+ 'ap-east-1': 'آسيا والمحيط الهادئ (هونج كونج)',
+ 'ap-south-2': 'آسيا والمحيط الهادئ (حيدر أباد)',
+ 'ap-southeast-3': 'آسيا والمحيط الهادئ (جاكرتا)',
+ 'ap-southeast-5': 'آسيا والمحيط الهادئ (ماليزيا)',
+ 'ap-southeast-4': 'آسيا والمحيط الهادئ (ملبورن)',
+ 'ap-south-1': 'آسيا والمحيط الهادئ (مومباي)',
+ 'ap-northeast-3': 'آسيا والمحيط الهادئ (أوساكا)',
+ 'ap-northeast-2': 'آسيا والمحيط الهادئ (سيول)',
+ 'ap-southeast-1': 'آسيا والمحيط الهادئ (سنغافورة)',
+ 'ap-southeast-2': 'آسيا والمحيط الهادئ (سيدني)',
+ 'ap-east-2': 'آسيا والمحيط الهادئ (تايبيه)',
+ 'ap-southeast-7': 'آسيا والمحيط الهادئ (تايلاند)',
+ 'ap-northeast-1': 'آسيا والمحيط الهادئ (طوكيو)',
+ 'ca-central-1': 'كندا (الوسطى)',
+ 'ca-west-1': 'كندا الغربية (كالجاري)',
+ 'eu-central-1': 'أوروبا (فرانكفورت)',
+ 'eu-west-1': 'أوروبا (أيرلندا)',
+ 'eu-west-2': 'أوروبا (لندن)',
+ 'eu-south-1': 'أوروبا (ميلانو)',
+ 'eu-west-3': 'أوروبا (باريس)',
+ 'eu-south-2': 'أوروبا (إسبانيا)',
+ 'eu-north-1': 'أوروبا (ستوكهولم)',
+ 'eu-central-2': 'أوروبا (زيورخ)',
+ 'il-central-1': 'إسرائيل (تل أبيب)',
+ 'mx-central-1': 'المكسيك (الوسطى)',
+ 'me-south-1': 'الشرق الأوسط (البحرين)',
+ 'me-central-1': 'الشرق الأوسط (الإمارات العربية المتحدة)',
+ 'sa-east-1': 'أمريكا الجنوبية (ساو باولو)',
+ 'us-gov-east-1': 'AWS GovCloud (شرق الولايات المتحدة)',
+ 'us-gov-west-1': 'AWS GovCloud (غرب الولايات المتحدة)',
+ addTencentCloudSID: 'معرف TencentCloud السري',
+ TencentCloudSIDMessage: 'الرجاء إدخال معرفك السري',
+ addTencentCloudSK: 'المفتاح السري TencentCloud',
+ TencentCloudSKMessage: 'الرجاء إدخال المفتاح السري الخاص بك',
+ SparkModelNameMessage: 'الرجاء تحديد طراز سبارك',
+ addSparkAPIPassword: 'سبارك API كلمة المرور',
+ SparkAPIPasswordMessage: 'يرجى إدخال كلمة مرور API الخاصة بك',
+ addSparkAPPID: 'معرف تطبيق سبارك',
+ SparkAPPIDMessage: 'يرجى إدخال معرف التطبيق الخاص بك',
+ addSparkAPISecret: 'سبارك API Secret',
+ SparkAPISecretMessage: 'يرجى إدخال APISecret الخاص بك',
+ addSparkAPIKey: 'سبارك APIKey',
+ SparkAPIKeyMessage: 'الرجاء إدخال APIKey الخاص بك',
+ yiyanModelNameMessage: 'الرجاء إدخال اسم النموذج',
+ addyiyanAK: 'مفتاح واجهة برمجة التطبيقات yiyan',
+ yiyanAKMessage: 'الرجاء إدخال مفتاح API الخاص بك',
+ addyiyanSK: 'مفتاح ييان السري',
+ yiyanSKMessage: 'الرجاء إدخال المفتاح السري الخاص بك',
+ FishAudioModelNameMessage: 'يرجى إعطاء اسم لنموذج تركيب الكلام الخاص بك',
+ addFishAudioAK: 'مفتاح واجهة برمجة تطبيقات الصوت للأسماك',
+ addFishAudioAKMessage: 'الرجاء إدخال مفتاح API الخاص بك',
+ addFishAudioRefID: 'معرف مرجع FishAudio',
+ addFishAudioRefIDMessage:
+ 'الرجاء إدخال المعرف المرجعي (اتركه فارغًا لاستخدام النموذج الافتراضي).',
+ GoogleModelIDMessage: 'الرجاء إدخال معرف النموذج الخاص بك!',
+ addGoogleProjectID: 'معرف المشروع',
+ GoogleProjectIDMessage: 'الرجاء إدخال معرف المشروع الخاص بك',
+ addGoogleServiceAccountKey:
+ 'مفتاح حساب الخدمة (اتركه فارغًا إذا كنت تستخدم بيانات اعتماد التطبيق الافتراضية)',
+ GoogleServiceAccountKeyMessage:
+ 'يرجى إدخال مفتاح حساب خدمة Google Cloud بتنسيق base64',
+ addGoogleRegion: 'منطقة جوجل السحابية',
+ GoogleRegionMessage: 'الرجاء إدخال منطقة Google Cloud',
+ modelProvidersWarn:
+ 'يرجى إضافة نموذج التضمين وLLM في Settings > موفري النماذج أولاً. ثم قم بتعيينها في "تعيين النماذج الافتراضية".',
+ apiVersion: 'إصدار واجهة برمجة التطبيقات',
+ apiVersionMessage: 'الرجاء إدخال إصدار API',
+ add: 'يضيف',
+ updateDate: 'تاريخ',
+ role: 'ولاية',
+ invite: 'دعوة عضو',
+ agree: 'يقبل',
+ refuse: 'انخفاض',
+ teamMembers: 'أعضاء الفريق',
+ joinedTeams: 'انضمت للفرق',
+ sureDelete: 'هل أنت متأكد من إزالة هذا العضو؟',
+ quit: 'يترك',
+ sureQuit: 'هل أنت متأكد أنك تريد ترك الفريق الذي انضممت إليه؟',
+ secretKey: 'المفتاح السري',
+ publicKey: 'المفتاح العام',
+ secretKeyMessage: 'الرجاء إدخال المفتاح السري',
+ publicKeyMessage: 'الرجاء إدخال المفتاح العام',
+ hostMessage: 'الرجاء إدخال المضيف',
+ configuration: 'إعدادات',
+ langfuseDescription:
+ 'التتبعات والتقييمات والإدارة السريعة والمقاييس لتصحيح أخطاء تطبيق LLM وتحسينه.',
+ viewLangfuseSDocumentation: 'عرض وثائق لانجفيوز',
+ view: 'منظر',
+ modelsToBeAddedTooltip:
+ 'إذا لم يكن موفر النموذج الخاص بك مدرجًا ولكنه يدعي أنه "متوافق مع OpenAI"، فحدد البطاقة المتوافقة مع OpenAI-API لإضافة النموذج (النماذج) ذات الصلة.',
+ mcp: 'العملية التشاورية المتعددة الأطراف',
+ mineru: {
+ modelNameRequired: 'اسم النموذج مطلوب',
+ apiServerRequired: 'مطلوب تكوين خادم MinerU API',
+ serverUrlBackendLimit:
+ 'عنوان URL لخادم MinerU متاح فقط للواجهة الخلفية لعميل HTTP',
+ apiserver: 'تكوين خادم MinerU API',
+ outputDir: 'مسار دليل إخراج MinerU',
+ backend: 'نوع الواجهة الخلفية لمعالجة MinerU',
+ serverUrl: 'عنوان URL لخادم MinerU',
+ deleteOutput: 'حذف ملفات الإخراج بعد المعالجة',
+ selectBackend: 'حدد المعالجة الخلفية',
+ backendOptions: {
+ pipeline: 'معالجة خطوط الأنابيب القياسية',
+ vlmTransformers: 'نموذج لغة الرؤية مع المحولات',
+ vlmVllmEngine: 'نموذج لغة الرؤية مع محرك vLLM',
+ vlmHttpClient: 'نموذج لغة الرؤية عبر عميل HTTP',
+ vlmMlxEngine: 'نموذج لغة الرؤية مع محرك MLX',
+ vlmVllmAsyncEngine: 'نموذج لغة الرؤية مع محرك vLLM Async (تجريبي)',
+ vlmLmdeployEngine: 'نموذج لغة الرؤية مع محرك LMDeploy (تجريبي)',
+ },
+ },
+ modelTypes: {
+ chat: 'محادثة',
+ embedding: 'التضمين',
+ rerank: 'إعادة الترتيب',
+ sequence2text: 'تسلسل2نص',
+ tts: 'تحويل النص إلى كلام',
+ image2text: 'التعرف الضوئي على الحروف',
+ speech2text: 'ASR',
+ },
+ showToc: 'عرض المحتوى',
+ hideToc: 'إخفاء المحتوى',
+ },
+ message: {
+ '200': 'يقوم الخادم بإرجاع البيانات المطلوبة بنجاح.',
+ '201': 'إنشاء أو تعديل البيانات بنجاح.',
+ '202': 'تم وضع الطلب في قائمة الانتظار في الخلفية (مهمة غير متزامنة).',
+ '204': 'تم حذف البيانات بنجاح.',
+ '400': 'حدث خطأ في الطلب الصادر، ولم ينشئ الخادم البيانات أو يعدلها.',
+ '401': 'الرجاء تسجيل الدخول مرة أخرى.',
+ '403': 'مسموح للمستخدم، ولكن الوصول محظور.',
+ '404': 'تم تقديم طلب لسجل غير موجود، ولم يقم الخادم بتنفيذ العملية.',
+ '406': 'التنسيق المطلوب غير متوفر.',
+ '410': 'تم حذف المورد المطلوب نهائيًا ولن يكون متاحًا مرة أخرى.',
+ '413': 'الحجم الإجمالي للملفات التي تم تحميلها مرة واحدة كبير جدًا.',
+ '422': 'عند إنشاء كائن، حدث خطأ في التحقق من الصحة.',
+ '500': 'حدث خطأ في الخادم، يرجى التحقق من الخادم.',
+ '502': 'خطأ في البوابة.',
+ '503': 'الخدمة غير متاحة والخادم محمل بشكل زائد مؤقتًا أو يخضع للصيانة.',
+ '504': 'مهلة البوابة.',
+ registered: 'مسجل!',
+ logout: 'تسجيل الخروج',
+ logged: 'تسجيل!',
+ pleaseSelectChunk: 'الرجاء تحديد قطعة!',
+ registerDisabled: 'تم تعطيل تسجيل المستخدم',
+ modified: 'معدل',
+ created: 'مخلوق',
+ deleted: 'تم الحذف',
+ renamed: 'تمت إعادة تسميته',
+ operated: 'تعمل',
+ updated: 'تم التحديث',
+ uploaded: 'تم الرفع',
+ requestError: 'خطأ في الطلب',
+ networkAnomalyDescription: 'هناك خلل في شبكتك ولا يمكنك الاتصال بالخادم.',
+ networkAnomaly: 'شذوذ الشبكة',
+ hint: 'تَلمِيح',
+ },
+ fileManager: {
+ files: 'ملفات',
+ name: 'اسم',
+ uploadDate: 'تاريخ التحميل',
+ knowledgeBase: 'مجموعة البيانات',
+ size: 'مقاس',
+ action: 'فعل',
+ addToKnowledge: 'رابط لمجموعة البيانات',
+ pleaseSelect: 'الرجاء التحديد',
+ newFolder: 'مجلد جديد',
+ file: 'ملف',
+ uploadFile: 'رفع ملف',
+ parseOnCreation: 'تحليل على الخلق',
+ directory: 'دليل',
+ uploadTitle: 'قم بسحب وإسقاط ملفك هنا للتحميل',
+ uploadDescription:
+ 'يدعم تحميل ملف واحد أو دفعي. بالنسبة إلى RAGFlow المنشور محليًا: يبلغ الحد الإجمالي لحجم الملف لكل عملية تحميل 1 جيجابايت، مع حد تحميل دفعة يبلغ 32 ملفًا. لا يوجد حد أقصى لإجمالي عدد الملفات لكل حساب. بالنسبة إلى demo.ragflow.io، يبلغ الحد الأقصى لحجم الملف الإجمالي لكل عملية تحميل 10 ميجابايت، على ألا يتجاوز كل ملف 10 ميجابايت وبحد أقصى 128 ملفًا لكل حساب.',
+ local: 'التحميلات المحلية',
+ s3: 'تحميلات S3',
+ preview: 'معاينة',
+ fileError: 'خطأ في الملف',
+ uploadLimit:
+ 'يجب ألا يتجاوز حجم كل ملف 10 ميجابايت، ويجب ألا يتجاوز إجمالي عدد الملفات 128.',
+ destinationFolder: 'المجلد الوجهة',
+ pleaseUploadAtLeastOneFile: 'يرجى تحميل ملف واحد على الأقل',
+ },
+ flow: {
+ preprocess: {
+ preprocess: 'المعالجة المسبقة',
+ mainContent: 'المحتوى الرئيسي',
+ abstract: 'خلاصة',
+ author: 'مؤلف',
+ sectionTitle: 'عنوان القسم',
+ },
+ autoPlay: 'تشغيل الصوت تلقائيًا',
+ downloadFileTypeTip: 'نوع الملف المراد تنزيله',
+ downloadFileType: 'تنزيل نوع الملف',
+ formatTypeError: 'خطأ في التنسيق أو الكتابة',
+ variableNameMessage:
+ 'يمكن أن يحتوي اسم المتغير فقط على أحرف وشرطات سفلية وأرقام',
+ variableDescription: 'وصف متغير',
+ defaultValue: 'القيمة الافتراضية',
+ conversationVariable: 'متغير المحادثة',
+ recommended: 'مُستَحسَن',
+ customerSupport: 'دعم العملاء',
+ marketing: 'تسويق',
+ consumerApp: 'التطبيق المستهلك',
+ other: 'آخر',
+ ingestionPipeline: 'خط أنابيب الابتلاع',
+ agents: 'الوكلاء',
+ days: 'أيام',
+ beginInput: 'ابدأ الإدخال',
+ ref: 'عامل',
+ stockCode: 'رمز المخزون',
+ apiKeyPlaceholder:
+ 'YOUR_API_KEY (تم الحصول عليه من https://serpapi.com/manage-api-key)',
+ flowStart: 'يبدأ',
+ flowNum: 'ن',
+ test: 'امتحان',
+ extractDepth: 'استخراج العمق',
+ format: 'شكل',
+ basic: 'أساسي',
+ advanced: 'متقدم',
+ general: 'عام',
+ searchDepth: 'عمق البحث',
+ tavilyTopic: 'موضوع تافيلي',
+ maxResults: 'النتائج القصوى',
+ includeAnswer: 'تضمين الإجابة',
+ includeRawContent: 'قم بتضمين المحتوى الخام',
+ includeImages: 'تضمين الصور',
+ includeImageDescriptions: 'تضمين أوصاف الصور',
+ includeDomains: 'تضمين المجالات',
+ ExcludeDomains: 'استبعاد المجالات',
+ Days: 'أيام',
+ comma: 'فاصلة',
+ semicolon: 'فاصلة منقوطة',
+ period: 'فترة',
+ lineBreak: 'فاصل سطر',
+ tab: 'فاتورة غير مدفوعة',
+ space: 'فضاء',
+ delimiters: 'المحددات',
+ enableChildrenDelimiters: 'يتم استخدام قطعة الطفل للاسترجاع',
+ merge: 'دمج',
+ split: 'ينقسم',
+ script: 'البرنامج النصي',
+ iterationItemDescription:
+ 'وهو يمثل العنصر الحالي في التكرار، والذي يمكن الرجوع إليه ومعالجته في الخطوات اللاحقة.',
+ guidingQuestion: 'سؤال إرشادي',
+ onFailure: 'على الفشل',
+ userPromptDefaultValue: 'هذا هو الطلب الذي يجب عليك إرساله إلى الوكيل.',
+ search: 'يبحث',
+ communication: 'تواصل',
+ developer: 'المطور',
+ typeCommandORsearch: 'اكتب أمرًا أو ابحث...',
+ builtIn: 'مدمج',
+ ExceptionDefaultValue: 'استثناء القيمة الافتراضية',
+ exceptionMethod: 'طريقة الاستثناء',
+ maxRounds: 'أقصى جولات الانعكاس',
+ delayAfterError: 'التأخير بعد الخطأ',
+ maxRetries: 'ماكس جولات إعادة المحاولة',
+ advancedSettings: 'الإعدادات المتقدمة',
+ addTools: 'أضف الأدوات',
+ sysPromptDefaultValue:
+ '\n أنت مساعد مفيد، مساعد AI متخصص في حل المشكلات للمستخدم.\n إذا تم توفير مجال معين، فقم بتكييف خبرتك مع هذا المجال؛ خلاف ذلك، تعمل كأخصائي.\n \n \n 1. فهم طلب المستخدم.\n 2. قم بتحليلها إلى مهام فرعية منطقية.\n 3. قم بتنفيذ كل مهمة فرعية خطوة بخطوة، مع التفكير بشفافية.\n 4. التحقق من الدقة والاتساق.\n 5. تلخيص النتيجة النهائية بوضوح.\n ',
+ singleLineText: 'نص من سطر واحد',
+ multimodalModels: 'نماذج متعددة الوسائط',
+ textOnlyModels: 'نماذج نصية فقط',
+ allModels: 'جميع الموديلات',
+ codeExecDescription: 'اكتب منطق Python أو Javascript المخصص الخاص بك.',
+ stringTransformDescription:
+ 'يعدل محتوى النص. يدعم حاليًا: تقسيم النص أو تسلسله.',
+ foundation: 'مؤسسة',
+ tools: 'أدوات',
+ dataManipulation: 'التلاعب بالبيانات',
+ flow: 'تدفق',
+ dialog: 'حوار',
+ cite: 'استشهد',
+ citeTip: 'citeTip',
+ name: 'اسم',
+ nameMessage: 'الرجاء إدخال الاسم',
+ description: 'وصف',
+ descriptionMessage: 'هذا وكيل لمهمة محددة.',
+ examples: 'أمثلة',
+ to: 'ل',
+ msg: 'رسائل',
+ msgTip:
+ 'قم بإخراج المحتوى المتغير للمكون الرئيسي أو النص الذي أدخلته بنفسك.',
+ messagePlaceholder:
+ 'الرجاء إدخال محتوى رسالتك، استخدم "/" لإدراج المتغيرات بسرعة.',
+ messageMsg: 'الرجاء إدخال الرسالة أو حذف هذا الحقل.',
+ addField: 'إضافة خيار',
+ addMessage: 'أضف رسالة',
+ loop: 'حلقة',
+ loopDescription:
+ 'الحلقة هي الحد الأعلى لعدد حلقات المكون الحالي، عندما يتجاوز عدد الحلقات قيمة الحلقة، فهذا يعني أن المكون لا يمكنه إكمال المهمة الحالية، يرجى إعادة تحسين الوكيل',
+ exitLoop: 'حلقة الخروج',
+ exitLoopDescription:
+ 'أي ما يعادل "كسر". لا تحتوي هذه العقدة على عناصر تكوين. عندما يصل جسم الحلقة إلى هذه العقدة، تنتهي الحلقة.',
+ loopVariables: 'متغيرات الحلقة',
+ maximumLoopCount: 'الحد الأقصى لعدد الحلقات',
+ loopTerminationCondition: 'حالة إنهاء الحلقة',
+ yes: 'نعم',
+ no: 'لا',
+ key: 'مفتاح',
+ componentId: 'معرف المكون',
+ add: 'يضيف',
+ operation: 'عملية',
+ run: 'يجري',
+ save: 'يحفظ',
+ title: 'بطاقة تعريف:',
+ beginDescription: 'هذا هو المكان الذي يبدأ فيه التدفق.',
+ answerDescription:
+ 'مكون يعمل كواجهة بين الإنسان والروبوت، حيث يتلقى مدخلات المستخدم ويعرض استجابات الوكيل.',
+ retrievalDescription:
+ 'مكون يقوم باسترداد المعلومات من قواعد المعرفة المحددة (مجموعات البيانات). تأكد من أن قواعد المعرفة التي تحددها تستخدم نفس نموذج التضمين.',
+ generateDescription:
+ 'مكون يطالب LLM بإنشاء استجابات. تأكد من ضبط المطالبة بشكل صحيح.',
+ categorizeDescription:
+ 'مكون يستخدم LLM لتصنيف مدخلات المستخدم إلى فئات محددة مسبقًا. تأكد من تحديد الاسم والوصف والأمثلة لكل فئة، بالإضافة إلى المكون التالي المقابل.',
+ relevantDescription:
+ 'مكون يستخدم LLM لتقييم ما إذا كانت المخرجات الأولية ذات صلة بأحدث استعلام للمستخدم. تأكد من تحديد المكون التالي لكل نتيجة للحكم.',
+ rewriteQuestionDescription:
+ 'مكون يقوم بإعادة كتابة استعلام مستخدم من مكون التفاعل، استنادًا إلى سياق مربعات الحوار السابقة.',
+ messageDescription:
+ 'يقوم هذا المكون بإرجاع مخرجات البيانات النهائية لسير العمل بالإضافة إلى محتوى الرسالة المحددة مسبقًا.',
+ keywordDescription:
+ 'مكون يقوم باسترداد أفضل نتائج بحث N من مدخلات المستخدم. تأكد من ضبط قيمة TopN بشكل صحيح قبل الاستخدام.',
+ switchDescription:
+ 'مكون يقوم بتقييم الظروف بناءً على مخرجات المكونات السابقة ويوجه تدفق التنفيذ وفقًا لذلك. فهو يسمح بمنطق فرعي معقد من خلال تحديد الحالات وتحديد الإجراءات لكل حالة أو الإجراء الافتراضي في حالة عدم استيفاء أي شروط.',
+ wikipediaDescription:
+ 'مكون يبحث من wikipedia.org، باستخدام TopN لتحديد عدد نتائج البحث. وهو يكمل قواعد المعرفة الموجودة.',
+ promptText:
+ 'يرجى تلخيص الفقرات التالية. كن حذرا مع الأرقام، لا تختلق الأمور. الفقرات على النحو التالي:\n {input}\n ما ورد أعلاه هو المحتوى الذي تحتاج إلى تلخيصه.',
+ createGraph: 'إنشاء وكيل',
+ createFromTemplates: 'إنشاء من القالب',
+ retrieval: 'استرجاع',
+ generate: 'يولد',
+ answer: 'يتفاعل',
+ categorize: 'تصنيف',
+ rewriteQuestion: 'أعد الكتابة',
+ rewrite: 'أعد الكتابة',
+ begin: 'يبدأ',
+ message: 'رسالة',
+ blank: 'فارغ',
+ createFromNothing: 'قم بإنشاء وكيلك من الصفر',
+ addItem: 'إضافة عنصر',
+ addSubItem: 'إضافة عنصر فرعي',
+ nameRequiredMsg: 'الاسم مطلوب',
+ nameRepeatedMsg: 'لا يمكن تكرار الاسم',
+ keywordExtract: 'الكلمة الرئيسية',
+ keywordExtractDescription:
+ 'مكون يقوم باستخراج الكلمات الأساسية من استعلام المستخدم، مع تحديد Top N لعدد الكلمات الأساسية المطلوب استخراجها.',
+ baidu: 'بايدو',
+ baiduDescription:
+ 'مكون يبحث من موقع baidu.com، باستخدام TopN لتحديد عدد نتائج البحث. وهو يكمل قواعد المعرفة الموجودة.',
+ duckDuckGo: 'دك دك جو',
+ duckDuckGoDescription:
+ 'مكون يقوم بالبحث من موقع duckduckgo.com، مما يسمح لك بتحديد عدد نتائج البحث باستخدام TopN. وهو يكمل قواعد المعرفة الموجودة.',
+ searXNG: 'احرق XNG',
+ searXNGDescription:
+ 'مكون يبحث عبر عنوان URL لمثيل SearXNG المقدم. حدد TopN وعنوان URL للمثيل.',
+ pdfGenerator: 'مولد المستندات',
+ pDFGenerator: 'مولد المستندات',
+ pdfGeneratorDescription:
+ 'مكون يقوم بإنشاء المستندات (PDF، DOCX، TXT) من محتوى بتنسيق تخفيض السعر مع تصميم وصور وجداول قابلة للتخصيص. يدعم: **غامق**، *مائل*، # عناوين، - قوائم، جداول مع | بناء الجملة.',
+ pDFGeneratorDescription:
+ 'مكون يقوم بإنشاء المستندات (PDF، DOCX، TXT) من محتوى بتنسيق تخفيض السعر مع تصميم وصور وجداول قابلة للتخصيص. يدعم: **غامق**، *مائل*، # عناوين، - قوائم، جداول مع | بناء الجملة.',
+ subtitle: 'الترجمة',
+ logoImage: 'صورة الشعار',
+ logoPosition: 'موقف الشعار',
+ logoWidth: 'عرض الشعار',
+ logoHeight: 'ارتفاع الشعار',
+ fontFamily: 'عائلة الخطوط',
+ fontSize: 'حجم الخط',
+ titleFontSize: 'حجم خط العنوان',
+ pageSize: 'حجم الصفحة',
+ orientation: 'توجيه',
+ marginTop: 'أعلى الهامش',
+ marginBottom: 'الهامش السفلي',
+ filename: 'اسم الملف',
+ outputDirectory: 'دليل الإخراج',
+ addPageNumbers: 'إضافة أرقام الصفحات',
+ addTimestamp: 'إضافة الطابع الزمني',
+ watermarkText: 'نص العلامة المائية',
+ channel: 'قناة',
+ channelTip: 'قم بإجراء بحث عن النص أو البحث عن الأخبار على مدخلات المكون',
+ text: 'نص',
+ news: 'أخبار',
+ messageHistoryWindowSize: 'حجم نافذة الرسالة',
+ messageHistoryWindowSizeTip:
+ 'حجم نافذة سجل المحادثة المرئي لـ LLM. الأكبر هو الأفضل، ولكن ضع في اعتبارك الحد الأقصى لعدد الرموز المميزة لـ LLM.',
+ wikipedia: 'ويكيبيديا',
+ pubMed: 'مجلات',
+ pubMedDescription:
+ 'مكون يبحث من https://pubmed.ncbi.nlm.nih.gov/، مما يسمح لك بتحديد عدد نتائج البحث باستخدام TopN. وهو يكمل قواعد المعرفة الموجودة.',
+ email: 'بريد إلكتروني',
+ emailTip:
+ 'البريد الإلكتروني هو حقل مطلوب. يجب عليك إدخال عنوان البريد الإلكتروني هنا.',
+ arXiv: 'أركايف',
+ arXivDescription:
+ 'مكون يبحث من https://arxiv.org/، مما يسمح لك بتحديد عدد نتائج البحث باستخدام TopN. وهو يكمل قواعد المعرفة الموجودة.',
+ sortBy: 'الترتيب حسب',
+ submittedDate: 'تاريخ التقديم',
+ lastUpdatedDate: 'تاريخ آخر تحديث',
+ relevance: 'الصلة',
+ google: 'جوجل',
+ googleDescription:
+ 'مكون يبحث من https://www.google.com/، مما يسمح لك بتحديد عدد نتائج البحث باستخدام TopN. وهو يكمل قواعد المعرفة الموجودة. يرجى ملاحظة أن هذا يتطلب مفتاح API من serpapi.com.',
+ bing: 'بنج',
+ bingDescription:
+ 'مكون يقوم بالبحث من https://www.bing.com/، مما يسمح لك بتحديد عدد نتائج البحث باستخدام TopN. وهو يكمل قواعد المعرفة الموجودة. يرجى ملاحظة أن هذا يتطلب مفتاح API من microsoft.com.',
+ apiKey: 'مفتاح واجهة برمجة التطبيقات',
+ country: 'البلد والمنطقة',
+ language: 'لغة',
+ googleScholar: 'جوجل الباحث العلمي',
+ googleScholarDescription:
+ 'مكون يبحث في https://scholar.google.com/. يمكنك استخدام Top N لتحديد عدد نتائج البحث.',
+ yearLow: 'سنة منخفضة',
+ yearHigh: 'ارتفاع السنة',
+ patents: 'براءات الاختراع',
+ data: 'بيانات',
+ deepL: 'ديب إل',
+ deepLDescription:
+ 'مكون يحصل على ترجمات أكثر تخصصًا من https://www.deepl.com/.',
+ authKey: 'مفتاح المصادقة',
+ sourceLang: 'لغة المصدر',
+ targetLang: 'اللغة المستهدفة',
+ gitHub: 'جيثب',
+ gitHubDescription:
+ 'مكون يبحث عن المستودعات من https://github.com/. يمكنك استخدام Top N لتحديد عدد نتائج البحث.',
+ baiduFanyi: 'بايدوفاني',
+ baiduFanyiDescription:
+ 'مكون يحصل على ترجمات متخصصة من https://fanyi.baidu.com/.',
+ appid: 'معرف التطبيق',
+ secretKey: 'المفتاح السري',
+ domain: 'اِختِصاص',
+ transType: 'نوع الترجمة',
+ baiduSecretKeyOptions: {
+ translate: 'ترجمة عامة',
+ fieldtranslate: 'الترجمة الميدانية',
+ },
+ baiduDomainOptions: {
+ it: 'تكنولوجيا المعلومات',
+ finance: 'المالية والاقتصادية',
+ machinery: 'تصنيع الآلات',
+ senimed: 'الطب الحيوي',
+ novel: 'الأدب على الانترنت',
+ academic: 'ورقة أكاديمية',
+ aerospace: 'الفضاء الجوي',
+ wiki: 'العلوم الإنسانية والاجتماعية',
+ news: 'الأخبار والمعلومات',
+ law: 'القوانين واللوائح',
+ contract: 'عقد',
+ },
+ baiduSourceLangOptions: {
+ auto: 'الكشف التلقائي',
+ zh: 'الصينية',
+ en: 'إنجليزي',
+ yue: 'الكانتونية',
+ wyw: 'الصينية الكلاسيكية',
+ jp: 'اليابانية',
+ kor: 'كوري',
+ fra: 'فرنسي',
+ spa: 'الأسبانية',
+ th: 'التايلاندية',
+ ara: 'عربي',
+ ru: 'الروسية',
+ pt: 'البرتغالية',
+ de: 'الألمانية',
+ it: 'ايطالي',
+ el: 'اليونانية',
+ nl: 'هولندي',
+ pl: 'بولندي',
+ bul: 'البلغارية',
+ est: 'الإستونية',
+ dan: 'دانماركي',
+ fin: 'الفنلندية',
+ cs: 'التشيكية',
+ rom: 'روماني',
+ slo: 'السلوفينية',
+ swe: 'السويدية',
+ hu: 'المجرية',
+ cht: 'الصينية التقليدية',
+ vie: 'الفيتنامية',
+ },
+ qWeather: 'QWeather',
+ qWeatherDescription:
+ 'مكون يقوم باسترداد معلومات الطقس، مثل درجة الحرارة وجودة الهواء، من https://www.qweather.com/.',
+ lang: 'لغة',
+ type: 'يكتب',
+ webApiKey: 'مفتاح واجهة برمجة تطبيقات الويب',
+ userType: 'نوع المستخدم',
+ timePeriod: 'الفترة الزمنية',
+ qWeatherLangOptions: {
+ zh: 'الصينية المبسطة',
+ 'zh-hant': 'الصينية التقليدية',
+ en: 'إنجليزي',
+ de: 'الألمانية',
+ es: 'الأسبانية',
+ fr: 'فرنسي',
+ it: 'ايطالي',
+ ja: 'اليابانية',
+ ko: 'كوري',
+ ru: 'الروسية',
+ hi: 'الهندية',
+ th: 'التايلاندية',
+ ar: 'عربي',
+ pt: 'البرتغالية',
+ bn: 'البنغالية',
+ ms: 'لغة الملايو',
+ nl: 'هولندي',
+ el: 'اليونانية',
+ la: 'اللاتينية',
+ sv: 'السويدية',
+ id: 'الاندونيسية',
+ pl: 'بولندي',
+ tr: 'تركي',
+ cs: 'التشيكية',
+ et: 'الإستونية',
+ vi: 'الفيتنامية',
+ fil: 'فلبينية',
+ fi: 'الفنلندية',
+ he: 'العبرية',
+ is: 'الأيسلندية',
+ nb: 'النرويجية',
+ },
+ qWeatherTypeOptions: {
+ weather: 'توقعات الطقس',
+ indices: 'مؤشر الحياة الجوية',
+ airquality: 'جودة الهواء',
+ },
+ qWeatherUserTypeOptions: {
+ free: 'مشترك مجاني',
+ paid: 'المشترك المدفوع',
+ },
+ qWeatherTimePeriodOptions: {
+ now: 'الآن',
+ '3d': '3 أيام',
+ '7d': '7 أيام',
+ '10d': '10 أيام',
+ '15d': '12 يوما',
+ '30d': '30 يوما',
+ },
+ publish: 'واجهة برمجة التطبيقات',
+ exeSQL: 'تنفيذ SQL',
+ exeSQLDescription:
+ 'مكون يقوم بتنفيذ استعلامات SQL على قاعدة بيانات علائقية، ويدعم الاستعلام من MySQL، أو PostgreSQL، أو MariaDB.',
+ dbType: 'نوع قاعدة البيانات',
+ database: 'قاعدة البيانات',
+ username: 'اسم المستخدم',
+ host: 'يستضيف',
+ port: 'ميناء',
+ password: 'كلمة المرور',
+ switch: 'يُحوّل',
+ logicalOperator: 'عامل منطقي',
+ switchOperatorOptions: {
+ equal: 'يساوي',
+ notEqual: 'لا يساوي',
+ gt: 'أعظم من',
+ ge: 'أكبر على قدم المساواة',
+ lt: 'أقل من',
+ le: 'أقل مساواة',
+ contains: 'يتضمن',
+ notContains: 'لا يحتوي',
+ startWith: 'يبدأ ب',
+ endWith: 'ينتهي ب',
+ empty: 'فارغ',
+ notEmpty: 'ليست فارغة',
+ in: 'في',
+ notIn: 'ليس في',
+ is: 'يكون',
+ isNot: 'ليس كذلك',
+ },
+ switchLogicOperatorOptions: {
+ and: 'و',
+ or: 'أو',
+ },
+ operator: 'المشغل',
+ value: 'قيمة',
+ useTemplate: 'يستخدم',
+ wenCai: 'وينكاي',
+ queryType: 'نوع الاستعلام',
+ wenCaiDescription:
+ 'مكون يحصل على المعلومات المالية، بما في ذلك أسعار الأسهم وأخبار التمويل، من مجموعة واسعة من المواقع المالية.',
+ wenCaiQueryTypeOptions: {
+ stock: 'مخزون',
+ zhishu: 'فِهرِس',
+ fund: 'تمويل',
+ hkstock: 'أسهم هونج كونج',
+ usstock: 'سوق الأوراق المالية الأمريكية',
+ threeboard: 'سوق OTC الجديد',
+ conbond: 'السندات القابلة للتحويل',
+ insurance: 'تأمين',
+ futures: 'العقود الآجلة',
+ lccp: 'التمويل',
+ foreign_exchange: 'العملة الأجنبية',
+ },
+ akShare: 'أكشير',
+ akShareDescription:
+ 'مكون يحصل على أخبار الأسهم من https://www.eastmoney.com/.',
+ yahooFinance: 'ياهوفاينانس',
+ yahooFinanceDescription:
+ 'مكون يقوم بالاستعلام عن معلومات حول شركة يتم تداول أسهمها بشكل عام باستخدام رمز المؤشر الخاص بها.',
+ crawler: 'زاحف الويب',
+ crawlerDescription:
+ 'مكون يقوم بالزحف إلى كود مصدر HTML من عنوان URL محدد.',
+ proxy: 'الوكيل',
+ crawlerResultOptions: {
+ html: 'أتش تي أم أل',
+ markdown: 'تخفيض السعر',
+ content: 'محتوى',
+ },
+ extractType: 'نوع الاستخراج',
+ info: 'معلومات',
+ history: 'تاريخ',
+ financials: 'المالية',
+ balanceSheet: 'الميزانية العمومية',
+ cashFlowStatement: 'بيان التدفق النقدي',
+ jin10: 'جين10',
+ jin10Description:
+ 'مكون يقوم باسترداد المعلومات المالية من منصة Jin10 المفتوحة، بما في ذلك تحديثات الأخبار والتقويمات وعروض الأسعار والمراجع.',
+ flashType: 'نوع الفلاش',
+ filter: 'فلتر',
+ contain: 'يحتوي',
+ calendarType: 'نوع التقويم',
+ calendarDatashape: 'شكل بيانات التقويم',
+ symbolsDatatype: 'نوع بيانات الرموز',
+ symbolsType: 'نوع الرموز',
+ jin10TypeOptions: {
+ flash: 'أخبار سريعة',
+ calendar: 'تقويم',
+ symbols: 'يقتبس',
+ news: 'مرجع',
+ },
+ jin10FlashTypeOptions: {
+ '1': 'أخبار السوق',
+ '2': 'أخبار العقود الآجلة',
+ '3': 'أخبار الولايات المتحدة وهونج كونج',
+ '4': 'أ-مشاركة الأخبار',
+ '5': 'أخبار السلع والفوركس',
+ },
+ jin10CalendarTypeOptions: {
+ cj: 'تقويم بيانات الاقتصاد الكلي',
+ qh: 'تقويم العقود الآجلة',
+ hk: 'تقويم سوق الأوراق المالية في هونج كونج',
+ us: 'تقويم سوق الأسهم الأمريكية',
+ },
+ jin10CalendarDatashapeOptions: {
+ data: 'بيانات',
+ event: 'حدث',
+ holiday: 'عطلة',
+ },
+ jin10SymbolsTypeOptions: {
+ GOODS: 'اقتباسات السلع',
+ FOREX: 'اقتباسات الفوركس',
+ FUTURE: 'أسعار السوق الدولية',
+ CRYPTO: 'اقتباسات العملة المشفرة',
+ },
+ jin10SymbolsDatatypeOptions: {
+ symbols: 'قائمة السلع',
+ quotes: 'أحدث أسعار السوق',
+ },
+ concentrator: 'المكثف',
+ concentratorDescription:
+ 'مكون يتلقى الإخراج من المكون الرئيسي ويمرره كمدخل إلى المكونات النهائية.',
+ tuShare: 'توشير',
+ tuShareDescription:
+ 'مكون يحصل على ملخصات الأخبار المالية من المواقع المالية الرئيسية، ويساعد الصناعة والبحث الكمي.',
+ tuShareSrcOptions: {
+ sina: 'سينا',
+ wallstreetcn: 'wallstreetcn',
+ '10jqka': 'تدفق مستقيم',
+ eastmoney: 'إيستموني',
+ yuncaijing: 'يونكايجينغ',
+ fenghuang: 'فنغهوانغ',
+ jinrongjie: 'جي آر جيه',
+ },
+ token: 'رمز مميز',
+ src: 'مصدر',
+ startDate: 'تاريخ البدء',
+ endDate: 'تاريخ الانتهاء',
+ keyword: 'الكلمة الرئيسية',
+ note: 'ملحوظة',
+ noteDescription: 'ملحوظة',
+ notePlaceholder: 'الرجاء إدخال ملاحظة',
+ invoke: 'طلب HTTP',
+ invokeDescription:
+ 'مكون قادر على استدعاء الخدمات عن بعد، باستخدام مخرجات أو ثوابت المكونات الأخرى كمدخلات.',
+ url: 'عنوان URL',
+ method: 'طريقة',
+ timeout: 'نفذ الوقت',
+ headers: 'الرؤوس',
+ cleanHtml: 'HTML نظيف',
+ cleanHtmlTip:
+ 'إذا كان الرد بتنسيق HTML وكان المحتوى الأساسي مطلوبًا فقط، فيرجى تشغيله.',
+ invalidUrl:
+ 'يجب أن يكون عنوان URL صالحًا أو عنوان URL يحتوي على عناصر نائبة متغيرة بالتنسيق {variable_name} أو {component@variable}',
+ reference: 'مرجع',
+ input: 'مدخل',
+ output: 'الإخراج',
+ parameter: 'المعلمة',
+ howUseId: 'كيفية استخدام معرف الوكيل؟',
+ content: 'محتوى',
+ operationResults: 'نتائج العملية',
+ autosaved: 'تم الحفظ تلقائيًا',
+ optional: 'خياري',
+ pasteFileLink: 'الصق رابط الملف',
+ testRun: 'تشغيل تجريبي',
+ template: 'نموذج',
+ templateDescription:
+ 'مكون يقوم بتنسيق مخرجات المكونات الأخرى.1. يدعم قوالب Jinja2، سيقوم أولاً بتحويل الإدخال إلى كائن ثم عرض القالب، 2. يحتفظ في نفس الوقت بالطريقة الأصلية لاستخدام استبدال السلسلة {parameter}',
+ emailComponent: 'بريد إلكتروني',
+ emailDescription: 'إرسال بريد إلكتروني إلى عنوان محدد.',
+ smtpServer: 'مضيف SMTP',
+ smtpPort: 'منفذ SMTP',
+ senderEmail: 'من عنوان البريد الإلكتروني',
+ smtpUsername: 'اسم مستخدم تسجيل الدخول SMTP',
+ authCode: 'كلمة مرور SMTP / كلمة مرور التطبيق',
+ senderName: 'من اسم العرض',
+ toEmail: 'البريد الإلكتروني للمستلم',
+ ccEmail: 'البريد الإلكتروني CC',
+ emailSubject: 'موضوع',
+ emailContent: 'محتوى',
+ smtpServerRequired: 'الرجاء إدخال عنوان خادم SMTP',
+ senderEmailRequired: 'الرجاء إدخال البريد الإلكتروني للمرسل',
+ authCodeRequired: 'الرجاء إدخال رمز التفويض',
+ toEmailRequired: 'الرجاء إدخال البريد الإلكتروني للمستلم',
+ emailContentRequired: 'الرجاء إدخال محتوى البريد الإلكتروني',
+ emailSentSuccess: 'تم إرسال البريد الإلكتروني بنجاح',
+ emailSentFailed: 'فشل في إرسال البريد الإلكتروني',
+ dynamicParameters: 'المعلمات الديناميكية',
+ jsonFormatTip: 'يجب أن يوفر المكون الرئيسي سلسلة JSON بالتنسيق التالي:',
+ toEmailTip: 'to_email: البريد الإلكتروني للمستلم (مطلوب)',
+ ccEmailTip: 'cc_email: البريد الإلكتروني CC (اختياري)',
+ subjectTip: 'الموضوع: موضوع البريد الإلكتروني (اختياري)',
+ contentTip: 'المحتوى: محتوى البريد الإلكتروني (اختياري)',
+ jsonUploadTypeErrorMessage: 'يرجى تحميل ملف json',
+ jsonUploadContentErrorMessage: 'خطأ في ملف json',
+ iteration: 'التكرار',
+ iterationDescription:
+ 'مكون متكرر يتكرر عبر مصفوفة إدخال وينفذ منطقًا محددًا لكل عنصر.',
+ delimiterTip:
+ 'يتم استخدام هذا المحدد لتقسيم نص الإدخال إلى عدة أجزاء نصية سيتم تنفيذ صدى لها كعنصر إدخال لكل تكرار.',
+ delimiterOptions: {
+ comma: 'فاصلة',
+ lineBreak: 'فاصل سطر',
+ tab: 'فاتورة غير مدفوعة',
+ underline: 'تسطير',
+ diagonal: 'شرطة مائلة للأمام',
+ minus: 'اندفاعة',
+ semicolon: 'فاصلة منقوطة',
+ },
+ addVariable: 'إضافة متغير',
+ variableSettings: 'إعدادات متغيرة',
+ systemPrompt: 'موجه النظام',
+ userPrompt: 'موجه المستخدم',
+ tocDataSource: 'مصدر البيانات',
+ addCategory: 'أضف فئة',
+ categoryName: 'اسم الفئة',
+ nextStep: 'الخطوة التالية',
+ variableExtractDescription:
+ 'استخراج معلومات المستخدم إلى متغير عام طوال المحادثة',
+ variableExtract: 'المتغيرات',
+ variables: 'المتغيرات',
+ variablesTip:
+ 'قم بتعيين متغير مفتاح json الواضح بقيمة فارغة. على سبيل المثال\n {\n "رمز المستخدم":":"،\n "رقم الهاتف:""\n }',
+ datatype: 'نوع الألغام لطلب HTTP',
+ insertVariableTip: 'أدخل / أدخل المتغيرات',
+ historyVersion: 'تاريخ الإصدار',
+ version: {
+ created: 'مخلوق',
+ details: 'تفاصيل الإصدار',
+ dsl: 'دي اس ال',
+ download: 'تحميل',
+ version: 'إصدار',
+ select: 'لم يتم تحديد أي إصدار',
+ },
+ setting: 'إعدادات',
+ settings: {
+ agentSetting: 'إعدادات الوكيل',
+ title: 'عنوان',
+ description: 'وصف',
+ upload: 'رفع',
+ photo: 'صورة',
+ permissions: 'الأذونات',
+ permissionsTip: 'يمكنك تعيين أذونات أعضاء الفريق هنا.',
+ me: 'أنا',
+ team: 'فريق',
+ },
+ noMoreData: 'لا مزيد من البيانات',
+ searchAgentPlaceholder: 'وكيل البحث',
+ footer: {
+ profile: 'جميع الحقوق محفوظة @ رد فعل',
+ },
+ layout: {
+ file: 'ملف',
+ knowledge: 'معرفة',
+ chat: 'محادثة',
+ },
+ prompt: 'اِسْتَدْعَى',
+ promptTip:
+ 'استخدم موجه النظام لوصف مهمة LLM، وتحديد كيفية الاستجابة لها، وتحديد المتطلبات المتنوعة الأخرى. غالبًا ما يتم استخدام موجه النظام جنبًا إلى جنب مع المفاتيح (المتغيرات)، والتي تعمل كمدخلات بيانات متنوعة لـ LLM. استخدم شرطة مائلة للأمام `/` أو الزر (x) لإظهار المفاتيح المطلوب استخدامها.',
+ promptMessage: 'مطلوب موجه',
+ infor: 'تشغيل المعلومات',
+ knowledgeBasesTip:
+ 'حدد قواعد المعرفة لربطها بمساعد الدردشة هذا، أو اختر المتغيرات التي تحتوي على معرفات قاعدة المعرفة أدناه.',
+ knowledgeBaseVars: 'متغيرات قاعدة المعرفة',
+ code: 'شفرة',
+ codeDescription: 'يسمح للمطورين بكتابة منطق بايثون مخصص.',
+ dataOperations: 'عمليات البيانات',
+ dataOperationsDescription: 'تنفيذ عمليات مختلفة على كائن البيانات.',
+ listOperations: 'عمليات القائمة',
+ listOperationsDescription: 'تنفيذ العمليات على القائمة.',
+ variableAssigner: 'المسند المتغير',
+ variableAssignerDescription:
+ 'ينفذ هذا المكون العمليات على كائنات البيانات، بما في ذلك استخراج المفاتيح والقيم وتصفيتها وتحريرها في البيانات.',
+ variableAggregator: 'مجمع متغير',
+ variableAggregatorDescription:
+ 'تقوم هذه العملية بتجميع المتغيرات من فروع متعددة في متغير واحد لتحقيق التكوين الموحد للعقد النهائية.',
+ inputVariables: 'متغيرات الإدخال',
+ runningHintText: 'قيد التشغيل...🕞',
+ openingSwitch: 'مفتاح الفتح',
+ openingCopy: 'تحية افتتاحية',
+ openingSwitchTip: 'سيرى المستخدمون رسالة الترحيب هذه في البداية.',
+ modeTip: 'يحدد الوضع كيفية بدء سير العمل.',
+ mode: 'وضع',
+ conversational: 'محادثة',
+ task: 'مهمة',
+ beginInputTip:
+ 'يمكن الوصول إلى معلمات الإدخال المحددة هنا من خلال المكونات الموجودة في سير العمل النهائي.',
+ query: 'متغيرات الاستعلام',
+ switchPromptMessage:
+ 'سوف تتغير الكلمات السريعة. يرجى تأكيد ما إذا كنت تريد تجاهل كلمات المطالبة الموجودة؟',
+ queryRequired: 'الاستعلام مطلوب',
+ queryTip: 'حدد المتغير الذي تريد استخدامه',
+ agent: 'عامل',
+ addAgent: 'إضافة وكيل',
+ agentDescription:
+ 'يبني مكونات الوكيل المجهزة بالاستدلال واستخدام الأدوات والتعاون متعدد الوكلاء.',
+ maxRecords: 'سجلات ماكس',
+ createAgent: 'تدفق الوكيل',
+ stringTransform: 'معالجة النص',
+ userFillUp: 'انتظر الرد',
+ userFillUpDescription:
+ 'يوقف سير العمل مؤقتًا وينتظر رسالة المستخدم قبل المتابعة.',
+ codeExec: 'شفرة',
+ tavilySearch: 'بحث تافيلي',
+ tavilySearchDescription: 'نتائج البحث عبر خدمة Tavily.',
+ tavilyExtract: 'استخراج تافيلي',
+ tavilyExtractDescription: 'استخراج تافيلي',
+ log: 'سجل',
+ management: 'إدارة',
+ import: 'يستورد',
+ export: 'يصدّر',
+ seconds: 'ثواني',
+ subject: 'موضوع',
+ tag: 'علامة',
+ tagPlaceholder: 'الرجاء إدخال العلامة',
+ descriptionPlaceholder: 'الرجاء إدخال الوصف',
+ line: 'نص من سطر واحد',
+ paragraph: 'نص الفقرة',
+ options: 'خيارات المنسدلة',
+ file: 'تحميل الملف',
+ integer: 'رقم',
+ boolean: 'منطقية',
+ logTimeline: {
+ begin: 'جاهز للبدء',
+ agent: 'الوكيل يفكر',
+ userFillUp: 'في انتظاركم',
+ retrieval: 'البحث عن المعرفة',
+ message: 'يقول الوكيل',
+ awaitResponse: 'في انتظاركم',
+ switch: 'اختيار المسار الأفضل',
+ iteration: 'معالجة الدفعات',
+ categorize: 'معلومات التصنيف',
+ code: 'تشغيل برنامج نصي سريع',
+ textProcessing: 'ترتيب النص',
+ tavilySearch: 'البحث في الويب',
+ tavilyExtract: 'قراءة الصفحة',
+ exeSQL: 'الاستعلام عن قاعدة البيانات',
+ google: 'البحث في الويب',
+ wikipedia: 'البحث في ويكيبيديا',
+ googleScholar: 'البحث الأكاديمي',
+ gitHub: 'البحث على جيثب',
+ email: 'إرسال البريد الإلكتروني',
+ httpRequest: 'استدعاء API',
+ wenCai: 'الاستعلام عن البيانات المالية',
+ },
+ goto: 'فرع فاشل',
+ comment: 'القيمة الافتراضية',
+ sqlStatement: 'بيان SQL',
+ sqlStatementTip:
+ 'اكتب استعلام SQL الخاص بك هنا. يمكنك استخدام المتغيرات أو SQL الخام أو مزجهما باستخدام بناء الجملة المتغير.',
+ frameworkPrompts: 'نطاق',
+ release: 'نشر',
+ createFromBlank: 'إنشاء من الفراغ',
+ createFromTemplate: 'إنشاء من القالب',
+ importJsonFile: 'استيراد ملف JSON',
+ ceateAgent: 'تدفق الوكيل',
+ createPipeline: 'خط أنابيب الابتلاع',
+ chooseAgentType: 'اختر نوع الوكيل',
+ parser: 'محلل',
+ parserDescription:
+ 'يستخرج النص الخام والبنية من الملفات للمعالجة النهائية.',
+ tokenizer: 'مفهرس',
+ tokenizerRequired: 'الرجاء إضافة عقدة المفهرس أولاً',
+ tokenizerDescription:
+ 'يحول النص إلى بنية البيانات المطلوبة (على سبيل المثال، التضمينات المتجهة لبحث التضمين) اعتمادًا على طريقة البحث المختارة.',
+ splitter: 'رمز مميز',
+ splitterDescription:
+ 'قم بتقسيم النص إلى أجزاء حسب طول الرمز المميز باستخدام محددات وتداخلات اختيارية.',
+ hierarchicalMergerDescription:
+ 'قم بتقسيم المستندات إلى أقسام حسب التسلسل الهرمي للعناوين باستخدام قواعد regex للتحكم بشكل أفضل.',
+ hierarchicalMerger: 'عنوان',
+ extractor: 'محول',
+ extractorDescription:
+ 'استخدم LLM لاستخراج الرؤى المنظمة من أجزاء المستند، مثل الملخصات والتصنيفات وما إلى ذلك.',
+ outputFormat: 'تنسيق الإخراج',
+ fileFormats: 'نوع الملف',
+ fileFormatOptions: {
+ pdf: 'قوات الدفاع الشعبي',
+ spreadsheet: 'جدول البيانات',
+ image: 'صورة',
+ email: 'بريد إلكتروني',
+ 'text&markdown': 'النص والترميز',
+ word: 'كلمة',
+ slides: 'PPTX',
+ audio: 'صوتي',
+ video: 'فيديو',
+ },
+ fields: 'مجال',
+ addParser: 'إضافة محلل',
+ hierarchy: 'تَسَلسُل',
+ regularExpressions: 'التعبيرات العادية',
+ overlappedPercent: 'النسبة المئوية المتداخلة (%)',
+ searchMethod: 'طريقة البحث',
+ searchMethodTip:
+ 'يحدد كيفية البحث في المحتوى — من خلال النص الكامل، أو التضمين، أو كليهما.\nسيقوم المفهرس بتخزين المحتوى في هياكل البيانات المقابلة للطرق المحددة.',
+ parserMethod: 'محلل قوات الدفاع الشعبي',
+ tableResultType: 'نوع نتيجة الجدول',
+ markdownImageResponseType: 'نوع استجابة الصورة Markdown',
+ systemPromptPlaceholder:
+ 'أدخل موجه النظام لتحليل الصور، إذا كان فارغًا، فسيتم استخدام القيمة الافتراضية للنظام',
+ exportJson: 'تصدير JSON',
+ viewResult: 'عرض النتيجة',
+ running: 'جري',
+ summary: 'ملخص',
+ keywords: 'الكلمات الرئيسية',
+ questions: 'أسئلة',
+ metadata: 'البيانات الوصفية',
+ toc: 'فهرس الصفحة',
+ fieldName: 'وجهة النتيجة',
+ prompts: {
+ system: {
+ keywords:
+ 'الدور\nأنت محلل النص.\n\nالمهمة\nقم باستخراج الكلمات الرئيسية/العبارات الأكثر أهمية في جزء معين من محتوى النص.\n\nالمتطلبات\n- تلخيص محتوى النص، وإعطاء أهم 5 كلمات رئيسية / عبارات مهمة.\n- يجب أن تكون الكلمات الرئيسية بنفس لغة محتوى النص المحدد.\n- يتم الفصل بين الكلمات الرئيسية بفاصلة باللغة الإنجليزية.\n- الكلمات الرئيسية الإخراج فقط.',
+ questions:
+ 'الدور\nأنت محلل النص.\n\nالمهمة\nاقترح 3 أسئلة حول جزء معين من محتوى النص.\n\nالمتطلبات\n- فهم وتلخيص محتوى النص، واقتراح أهم 3 أسئلة مهمة.\n- يجب ألا تكون للأسئلة معاني متداخلة.\n- يجب أن تغطي الأسئلة المحتوى الرئيسي للنص قدر الإمكان.\n- يجب أن تكون الأسئلة بنفس لغة محتوى النص المحدد.\n- سؤال واحد في كل سطر.\n- أسئلة الإخراج فقط.',
+ summary:
+ 'بمثابة ملخص دقيق. مهمتك هي إنشاء ملخص للمحتوى المقدم يكون موجزًا ومطابقًا للأصل.\n\nالتعليمات الرئيسية:\n1. الدقة: اعتمد الملخص بدقة على المعلومات المقدمة. لا تقدم أي حقائق أو استنتاجات أو تفسيرات جديدة لم يتم ذكرها صراحة.\n2. اللغة: اكتب الملخص بنفس لغة النص المصدر.\n3. الموضوعية: اعرض النقاط الرئيسية دون تحيز، مع الحفاظ على القصد الأصلي ونبرة المحتوى. لا تكتب افتتاحيات.\n4. الإيجاز: التركيز على أهم الأفكار، مع حذف التفاصيل الصغيرة والزغب.',
+ metadata:
+ 'استخراج المعلومات المنظمة الهامة من المحتوى المحدد. قم بإخراج سلسلة JSON صالحة فقط بدون نص إضافي. إذا لم يتم العثور على معلومات منظمة مهمة، فأخرج كائن JSON فارغًا: {}.\n\nقد تتضمن المعلومات المنظمة الهامة ما يلي: الأسماء أو التواريخ أو المواقع أو الأحداث أو الحقائق الأساسية أو البيانات الرقمية أو غيرها من الكيانات القابلة للاستخراج.',
+ toc: '',
+ },
+ user: {
+ keywords: 'محتوى النص\n[أدخل النص هنا]',
+ questions: 'محتوى النص\n[أدخل النص هنا]',
+ summary: 'نص للتلخيص:\n[أدخل النص هنا]',
+ metadata: 'المحتوى: [أدخل المحتوى هنا]',
+ toc: '[أدخل النص هنا]',
+ },
+ },
+ cancel: 'يلغي',
+ swicthPromptMessage:
+ 'سوف تتغير الكلمة السريعة. يرجى تأكيد ما إذا كان سيتم التخلي عن كلمة المطالبة الحالية؟',
+ tokenizerSearchMethodOptions: {
+ full_text: 'النص الكامل',
+ embedding: 'التضمين',
+ },
+ filenameEmbeddingWeight: 'اسم الملف الذي يتضمن الوزن',
+ tokenizerFieldsOptions: {
+ text: 'النص المعالج',
+ keywords: 'الكلمات الرئيسية',
+ questions: 'أسئلة',
+ summary: 'السياق المعزز',
+ },
+ imageParseMethodOptions: {
+ ocr: 'التعرف الضوئي على الحروف',
+ },
+ structuredOutput: {
+ configuration: 'إعدادات',
+ structuredOutput: 'إخراج منظم',
+ },
+ operations: 'العمليات',
+ operationsOptions: {
+ selectKeys: 'حدد المفاتيح',
+ literalEval: 'التقييم الحرفي',
+ combine: 'يجمع',
+ filterValues: 'قيم التصفية',
+ appendOrUpdate: 'إلحاق أو تحديث',
+ removeKeys: 'إزالة المفاتيح',
+ renameKeys: 'إعادة تسمية المفاتيح',
+ },
+ ListOperationsOptions: {
+ topN: 'أعلى ن',
+ head: 'رأس',
+ tail: 'ذيل',
+ sort: 'نوع',
+ filter: 'فلتر',
+ dropDuplicates: 'إسقاط التكرارات',
+ },
+ sortMethod: 'طريقة الفرز',
+ SortMethodOptions: {
+ asc: 'تصاعدي',
+ desc: 'تنازلي',
+ },
+ variableAssignerLogicalOperatorOptions: {
+ overwrite: 'الكتابة فوقها',
+ clear: 'واضح',
+ set: 'تعيين',
+ add: 'يضيف',
+ subtract: 'طرح',
+ multiply: 'ضاعف',
+ divide: 'قسمة',
+ append: 'إلحاق',
+ extend: 'يمتد',
+ removeFirst: 'إزالة أولا',
+ removeLast: 'إزالة الأخير',
+ },
+ webhook: {
+ name: 'خطاف ويب',
+ methods: 'طُرق',
+ contentTypes: 'أنواع المحتوى',
+ security: 'حماية',
+ schema: 'مخطط',
+ response: 'إجابة',
+ executionMode: 'وضع التنفيذ',
+ executionModeTip:
+ 'الاستجابة المقبولة: يقوم النظام بإرجاع الإقرار فورًا بعد التحقق من صحة الطلب، بينما يستمر سير العمل في التنفيذ بشكل غير متزامن في الخلفية. / الاستجابة النهائية: يقوم النظام بإرجاع الاستجابة فقط بعد اكتمال تنفيذ سير العمل.',
+ authMethods: 'طرق المصادقة',
+ authType: 'نوع المصادقة',
+ limit: 'طلب الحد من التردد',
+ per: 'الفترة الزمنية',
+ maxBodySize: 'الحد الأقصى لحجم الجسم',
+ ipWhitelist: 'القائمة البيضاء للملكية الفكرية',
+ tokenHeader: 'رأس الرمز المميز',
+ tokenValue: 'قيمة الرمز المميز',
+ username: 'اسم المستخدم',
+ password: 'كلمة المرور',
+ algorithm: 'خوارزمية',
+ secret: 'سر',
+ issuer: 'المصدر',
+ audience: 'جمهور',
+ requiredClaims: 'المطالبات المطلوبة',
+ header: 'رأس',
+ status: 'حالة',
+ headersTemplate: 'قالب الرؤوس',
+ bodyTemplate: 'قالب الجسم',
+ basic: 'أساسي',
+ bearer: 'حامل',
+ apiKey: 'مفتاح واجهة برمجة التطبيقات',
+ queryParameters: 'معلمات الاستعلام',
+ headerParameters: 'معلمات الرأس',
+ requestBodyParameters: 'طلب معلمات الجسم',
+ immediately: 'استجابة مقبولة',
+ streaming: 'الرد النهائي',
+ overview: 'ملخص',
+ logs: 'سجلات',
+ agentStatus: 'حالة الوكيل:',
+ },
+ saveToMemory: 'حفظ في الذاكرة',
+ retrievalFrom: 'الاسترجاع من',
+ },
+ llmTools: {
+ bad_calculator: {
+ name: 'آلة حاسبة',
+ description: 'أداة لحساب مجموع رقمين (سوف تعطي إجابة خاطئة)',
+ params: {
+ a: 'الرقم الأول',
+ b: 'الرقم الثاني',
+ },
+ },
+ },
+ modal: {
+ okText: 'يتأكد',
+ cancelText: 'يلغي',
+ },
+ mcp: {
+ export: 'يصدّر',
+ import: 'يستورد',
+ url: 'عنوان URL',
+ serverType: 'نوع الخادم',
+ addMCP: 'أضف MCP',
+ editMCP: 'تحرير MCP',
+ toolsAvailable: 'الأدوات المتاحة',
+ mcpServers: 'خوادم MCP',
+ mcpServer: 'خادم MCP',
+ customizeTheListOfMcpServers: 'تخصيص قائمة خوادم MCP',
+ cachedTools: 'الأدوات المخزنة مؤقتًا',
+ bulkManage: 'إدارة بالجملة',
+ exitBulkManage: 'الخروج من الإدارة المجمعة',
+ selected: 'مختارة',
+ },
+ search: {
+ searchApps: 'تطبيقات البحث',
+ createSearch: 'إنشاء بحث',
+ searchGreeting: 'كيف يمكنني مساعدتك اليوم?',
+ profile: 'إخفاء الملف الشخصي',
+ locale: 'لغة',
+ embedCode: 'تضمين التعليمات البرمجية',
+ id: 'بطاقة تعريف',
+ copySuccess: 'نسخ النجاح',
+ welcomeBack: 'مرحبًا بعودتك',
+ searchSettings: 'إعدادات البحث',
+ name: 'اسم',
+ avatar: 'الصورة الرمزية',
+ description: 'وصف',
+ datasets: 'مجموعات البيانات',
+ rerankModel: 'إعادة ترتيب النموذج',
+ AISummary: 'ملخص الذكاء الاصطناعي',
+ enableWebSearch: 'تمكين البحث على شبكة الإنترنت',
+ enableRelatedSearch: 'تمكين البحث ذات الصلة',
+ showQueryMindmap: 'إظهار الخريطة الذهنية للاستعلام',
+ embedApp: 'تضمين التطبيق',
+ relatedSearch: 'البحث ذات الصلة',
+ descriptionValue: 'أنت مساعد ذكي.',
+ okText: 'يحفظ',
+ cancelText: 'يلغي',
+ chooseDataset: 'الرجاء تحديد مجموعة البيانات أولا',
+ },
+ language: {
+ english: 'الإنجليزية',
+ chinese: 'الصينية',
+ spanish: 'الإسبانية',
+ french: 'الفرنسية',
+ german: 'الألمانية',
+ japanese: 'اليابانية',
+ korean: 'الكورية',
+ vietnamese: 'الفيتنامية',
+ russian: 'الروسية',
+ bulgarian: 'البلغارية',
+ arabic: 'العربية',
+ },
+ pagination: {
+ total: 'الإجمالي {{total}}',
+ page: '{{page}} /الصفحة',
+ },
+ dataflowParser: {
+ result: 'نتيجة',
+ parseSummary: 'ملخص التحليل',
+ parseSummaryTip: 'المحلل اللغوي: DeepDoc',
+ parserMethod: 'طريقة المحلل اللغوي',
+ outputFormat: 'تنسيق الإخراج',
+ rerunFromCurrentStep: 'أعد التشغيل من الخطوة الحالية',
+ rerunFromCurrentStepTip: 'تم اكتشاف التغييرات. انقر لإعادة التشغيل.',
+ confirmRerun: 'تأكيد عملية إعادة التشغيل',
+ confirmRerunModalContent:
+ '\n أنت على وشك إعادة تشغيل العملية بدءًا من خطوة {{step}} .\n
\n هذا سوف:
\n \n • قم باستبدال النتائج الموجودة من الخطوة الحالية فصاعدًا \n • قم بإنشاء إدخال سجل جديد للتتبع \n • ستبقى الخطوات السابقة دون تغيير \n ',
+ changeStepModalTitle: 'تحذير من مفتاح الخطوة',
+ changeStepModalContent:
+ 'أنت تقوم حاليًا بتحرير نتائج هذه المرحلة.
\n إذا قمت بالتبديل إلى مرحلة لاحقة، فسيتم فقدان التغييرات.
\n للاحتفاظ بها، يرجى النقر فوق "إعادة تشغيل" لإعادة تشغيل المرحلة الحالية.
',
+ changeStepModalConfirmText: 'التبديل على أي حال',
+ changeStepModalCancelText: 'يلغي',
+ unlinkPipelineModalTitle: 'إلغاء ربط قناة العرض',
+ unlinkPipelineModalConfirmText: 'إلغاء الارتباط',
+ unlinkPipelineModalContent:
+ 'بمجرد إلغاء الارتباط، لن تكون مجموعة البيانات هذه متصلة بمسار الاستيعاب الحالي.
\n ستستمر الملفات التي تم تحليلها بالفعل حتى اكتمالها
\n لن تتم معالجة الملفات التي لم يتم تحليلها بعد
\n هل أنت متأكد من رغبتك في المتابعة؟
',
+ unlinkSourceModalTitle: 'إلغاء ربط مصدر البيانات',
+ unlinkSourceModalContent:
+ 'هل أنت متأكد من إلغاء ربط مصدر البيانات هذا ?
',
+ unlinkSourceModalConfirmText: 'إلغاء الارتباط',
+ },
+ datasetOverview: {
+ downloadTip: 'الملفات التي يتم تنزيلها من مصادر البيانات.',
+ processingTip: 'الملفات التي تتم معالجتها عن طريق مسار الاستيعاب.',
+ totalFiles: 'إجمالي الملفات',
+ downloading: 'جارٍ التنزيل',
+ downloadSuccessTip: 'إجمالي التنزيلات الناجحة',
+ downloadFailedTip: 'إجمالي التنزيلات الفاشلة',
+ processingSuccessTip: 'إجمالي الملفات التي تمت معالجتها بنجاح',
+ processingFailedTip: 'إجمالي العمليات الفاشلة',
+ processing: 'يعالج',
+ noData: 'لا يوجد سجل حتى الآن',
+ },
+ deleteModal: {
+ delAgent: 'حذف الوكيل',
+ delDataset: 'حذف مجموعة البيانات',
+ delSearch: 'حذف البحث',
+ delFile: 'حذف الملف',
+ delFiles: 'حذف الملفات',
+ delFilesContent: 'الملفات {{count}} المحددة',
+ delChat: 'حذف الدردشة',
+ delMember: 'حذف العضو',
+ delMemory: 'حذف الذاكرة',
+ },
+ empty: {
+ noMCP: 'لا تتوفر خوادم MCP',
+ agentTitle: 'لم يتم إنشاء تطبيق وكيل حتى الآن',
+ notFoundAgent: 'لم يتم العثور على تطبيق الوكيل',
+ datasetTitle: 'لم يتم إنشاء مجموعة بيانات حتى الآن',
+ notFoundDataset: 'لم يتم العثور على مجموعة البيانات',
+ chatTitle: 'لم يتم إنشاء تطبيق دردشة بعد',
+ notFoundChat: 'لم يتم العثور على تطبيق الدردشة',
+ searchTitle: 'لم يتم إنشاء تطبيق بحث حتى الآن',
+ notFoundSearch: 'لم يتم العثور على تطبيق البحث',
+ memoryTitle: 'لم يتم إنشاء ذاكرة بعد',
+ notFoundMemory: 'لم يتم العثور على الذاكرة',
+ addNow: 'أضف الآن',
+ },
+ admin: {
+ loginTitle: 'وحدة تحكم المشرف',
+ title: 'راج فلو',
+ confirm: 'يتأكد',
+ close: 'يغلق',
+ yes: 'نعم',
+ no: 'لا',
+ delete: 'يمسح',
+ cancel: 'يلغي',
+ reset: 'إعادة ضبط',
+ import: 'يستورد',
+ description: 'وصف',
+ noDescription: 'لا يوجد وصف',
+ resourceType: {
+ dataset: 'مجموعة البيانات',
+ chat: 'محادثة',
+ agent: 'عامل',
+ search: 'يبحث',
+ file: 'ملف',
+ team: 'فريق',
+ memory: 'ذاكرة',
+ },
+ permissionType: {
+ enable: 'يُمكَِن',
+ read: 'يقرأ',
+ write: 'يكتب',
+ share: 'يشارك',
+ },
+ serviceStatus: 'حالة الخدمة',
+ userManagement: 'إدارة المستخدم',
+ sandboxSettings: 'إعدادات وضع الحماية',
+ registrationWhitelist: 'القائمة البيضاء للتسجيل',
+ roles: 'الأدوار',
+ monitoring: 'يراقب',
+ sandboxSettingsPage: {
+ description:
+ 'قم بتكوين موفر وضع الحماية لتنفيذ التعليمات البرمجية. يتم استخدام صندوق الحماية بواسطة مكون التعليمات البرمجية في الوكلاء.',
+ providerSelection: 'اختيار المزود',
+ providerSelectionDescription:
+ 'اختر موفر وضع الحماية لتنفيذ التعليمات البرمجية',
+ namedProviderConfiguration: '{{name}} التكوين',
+ namedProviderConfigurationDescription:
+ 'قم بتكوين إعدادات الاتصال لـ {{name}}.',
+ saveConfiguration: 'حفظ التكوين',
+ saving: 'توفير...',
+ testConnectionResultModal: {
+ title: 'نتيجة اختبار الاتصال',
+ testing: 'جارٍ اختبار الاتصال بموفر وضع الحماية...',
+ success: 'تم الاتصال بنجاح بموفر وضع الحماية',
+ failed: 'فشل الاتصال بموفر وضع الحماية',
+ exitCode: 'رمز الخروج',
+ executionTime: 'وقت التنفيذ',
+ stdout: 'الإخراج القياسي',
+ stderr: 'خطأ في الإخراج/تتبع المكدس',
+ },
+ testConnection: 'اتصال الاختبار',
+ testing: 'اختبار...',
+ },
+ selectFile: 'حدد الملف',
+ noFileSelected: 'لم يتم تحديد أي ملف',
+ back: 'خلف',
+ active: 'نشيط',
+ inactive: 'غير نشط',
+ enable: 'يُمكَِن',
+ disable: 'إبطال',
+ all: 'الجميع',
+ actions: 'الإجراءات',
+ newUser: 'مستخدم جديد',
+ email: 'بريد إلكتروني',
+ name: 'اسم',
+ nickname: 'كنية',
+ status: 'حالة',
+ id: 'بطاقة تعريف',
+ serviceType: 'نوع الخدمة',
+ host: 'يستضيف',
+ port: 'ميناء',
+ role: 'دور',
+ user: 'مستخدم',
+ userType: 'نوع المستخدم',
+ superuser: 'المستخدم المتميز',
+ normalUser: 'طبيعي',
+ createTime: 'خلق الوقت',
+ lastLoginTime: 'آخر وقت لتسجيل الدخول',
+ lastUpdateTime: 'وقت التحديث الأخير',
+ isAnonymous: 'مجهول',
+ isSuperuser: 'هو المستخدم الخارق',
+ deleteUser: 'حذف المستخدم',
+ deleteUserConfirmation: 'هل أنت متأكد أنك تريد حذف هذا المستخدم؟',
+ createNewUser: 'إنشاء مستخدم جديد',
+ changePassword: 'تغيير كلمة المرور',
+ newPassword: 'كلمة المرور الجديدة',
+ confirmNewPassword: 'تأكيد كلمة المرور الجديدة',
+ password: 'كلمة المرور',
+ confirmPassword: 'تأكيد كلمة المرور',
+ invalidEmail: 'الرجاء إدخال عنوان بريد إلكتروني صالح!',
+ passwordRequired: 'الرجاء إدخال كلمة المرور الخاصة بك!',
+ passwordMinLength: 'كلمة المرور يجب أن تكون أكثر من 8 أحرف.',
+ confirmPasswordRequired: 'يرجى تأكيد كلمة المرور الخاصة بك!',
+ confirmPasswordDoNotMatch: 'كلمة المرور التي أدخلتها غير متطابقة!',
+ read: 'يقرأ',
+ write: 'يكتب',
+ share: 'يشارك',
+ create: 'يخلق',
+ extraInfo: 'معلومات اضافية',
+ serviceDetail: 'خدمة {{name}} التفاصيل',
+ taskExecutorDetail: 'تفاصيل منفذ المهمة',
+ whitelistManagement: 'إدارة القائمة البيضاء',
+ exportAsExcel: 'تصدير اكسل',
+ importFromExcel: 'استيراد اكسل',
+ createEmail: 'إنشاء البريد الإلكتروني',
+ deleteEmail: 'حذف البريد الإلكتروني',
+ editEmail: 'تحرير البريد الإلكتروني',
+ deleteWhitelistEmailConfirmation:
+ 'هل أنت متأكد أنك تريد حذف هذا البريد الإلكتروني من القائمة البيضاء؟ لا يمكن التراجع عن هذا الإجراء.',
+ importWhitelist: 'استيراد القائمة البيضاء (اكسل)',
+ importSelectExcelFile: 'ملف اكسل (.xlsx)',
+ importOverwriteExistingEmails:
+ 'الكتابة فوق رسائل البريد الإلكتروني الموجودة',
+ importInvalidExcelFile: 'الرجاء تحديد ملف Excel صالح',
+ importFileRequired: 'الرجاء تحديد ملف لاستيراده',
+ importFileTips:
+ 'يجب أن يحتوي الملف على عمود رأس واحد يسمى email.',
+ chunkNum: 'قطع',
+ docNum: 'وثائق',
+ tokenNum: 'الرموز المستخدمة',
+ language: 'لغة',
+ createDate: 'تاريخ الإنشاء',
+ updateDate: 'تاريخ التحديث',
+ permission: 'إذن',
+ agentTitle: 'عنوان الوكيل',
+ canvasCategory: 'فئة قماش',
+ newRole: 'دور جديد',
+ addNewRole: 'إضافة دور جديد',
+ roleName: 'اسم الدور',
+ roleNameRequired: 'اسم الدور مطلوب',
+ resources: 'موارد',
+ editRoleDescription: 'تحرير وصف الدور',
+ deleteRole: 'حذف الدور',
+ deleteRoleConfirmation:
+ 'هل أنت متأكد أنك تريد حذف هذا الدور؟ لا يمكن التراجع عن هذا الإجراء.',
+ alive: 'على قيد الحياة',
+ timeout: 'نفذ الوقت',
+ fail: 'يفشل',
+ },
+ explore: {
+ title: 'يطلق',
+ canvasList: 'قائمة قماش',
+ sessions: 'الجلسات',
+ newSession: 'جلسة جديدة',
+ newSessionLabel: 'ابدأ محادثة جديدة',
+ deleteSession: 'حذف الجلسة',
+ searchCanvas: 'لوحة بحث...',
+ searchSessions: 'جلسات البحث...',
+ noCanvasSelected: 'الرجاء تحديد لوحة قماشية',
+ noSessionSelected: 'الرجاء تحديد جلسة أو إنشاء جلسة جديدة',
+ noSessionsFound: 'لم يتم العثور على جلسات',
+ createFirstSession: 'قم بإنشاء جلستك الأولى',
+ noCanvasFound: 'لم يتم العثور على قماش',
+ deleteSelectedConfirm:
+ 'هل أنت متأكد أنك تريد حذف {{count}} الجلسة (الجلسات)؟',
+ batchDeleteSessions: 'حذف الجلسات',
+ },
+ },
+};
diff --git a/web/src/locales/config.ts b/web/src/locales/config.ts
index f40baaddbb..73469dcaab 100644
--- a/web/src/locales/config.ts
+++ b/web/src/locales/config.ts
@@ -20,6 +20,15 @@ const languageImports: Record Promise<{ default: any }>> = {
[LanguageAbbreviation.Fr]: () => import('./fr'),
[LanguageAbbreviation.It]: () => import('./it'),
[LanguageAbbreviation.Bg]: () => import('./bg'),
+ [LanguageAbbreviation.Ar]: () => import('./ar'),
+};
+
+const languageAliases: Record = {
+ 'pt-br': LanguageAbbreviation.PtBr,
+};
+
+const normalizeLanguageCode = (lng: string): string => {
+ return languageAliases[lng] ?? lng;
};
const enFlattened = flattenObject(translation_en);
@@ -49,11 +58,13 @@ i18n
});
export const loadLanguageAsync = async (lng: string): Promise => {
- if (i18n.hasResourceBundle(lng, 'translation')) {
+ const normalizedLng = normalizeLanguageCode(lng);
+
+ if (i18n.hasResourceBundle(normalizedLng, 'translation')) {
return;
}
- const importFn = languageImports[lng];
+ const importFn = languageImports[normalizedLng];
if (!importFn) {
console.warn(`Language ${lng} is not supported for lazy loading`);
return;
@@ -62,7 +73,7 @@ export const loadLanguageAsync = async (lng: string): Promise => {
try {
const module = await importFn();
const translationData = module.default?.translation || module.default;
- i18n.addResourceBundle(lng, 'translation', translationData);
+ i18n.addResourceBundle(normalizedLng, 'translation', translationData);
const flattened = flattenObject({ translation: translationData });
translationTable.push(flattened);
@@ -72,16 +83,22 @@ export const loadLanguageAsync = async (lng: string): Promise => {
};
export const changeLanguageAsync = async (lng: string): Promise => {
- if (lng !== 'en' && !i18n.hasResourceBundle(lng, 'translation')) {
- await loadLanguageAsync(lng);
+ const normalizedLng = normalizeLanguageCode(lng);
+ if (
+ normalizedLng !== LanguageAbbreviation.En &&
+ !i18n.hasResourceBundle(normalizedLng, 'translation')
+ ) {
+ await loadLanguageAsync(normalizedLng);
}
- await i18n.changeLanguage(lng);
+ await i18n.changeLanguage(normalizedLng);
};
export const initLanguage = async (): Promise => {
- const currentLng = i18n.language || localStorage.getItem('lng') || 'en';
+ const currentLng = normalizeLanguageCode(
+ i18n.language || localStorage.getItem('lng') || LanguageAbbreviation.En,
+ );
- if (currentLng !== 'en' && languageImports[currentLng]) {
+ if (currentLng !== LanguageAbbreviation.En && languageImports[currentLng]) {
await loadLanguageAsync(currentLng);
await i18n.changeLanguage(currentLng);
}
diff --git a/web/src/locales/en.ts b/web/src/locales/en.ts
index 5117713a29..2dc113b951 100644
--- a/web/src/locales/en.ts
+++ b/web/src/locales/en.ts
@@ -27,7 +27,16 @@ export default {
chinese: 'Simplified Chinese',
traditionalChinese: 'Traditional Chinese',
russian: 'Russian',
+ indonesian: 'Indonesian',
+ indonesia: 'Indonesian',
+ spanish: 'Spanish',
+ vietnamese: 'Vietnamese',
+ japanese: 'Japanese',
+ german: 'German',
+ french: 'French',
+ italian: 'Italian',
bulgarian: 'Bulgarian',
+ arabic: 'Arabic',
language: 'Language',
languageMessage: 'Please input your language!',
languagePlaceholder: 'select your language',
@@ -529,6 +538,22 @@ Example: A 1 KB message with 1024-dim embedding uses ~9 KB. The 5 MB default lim
portugueseBr: 'Portuguese (Brazil)',
embeddingModelPlaceholder: 'Please select a embedding model.',
chunkMethodPlaceholder: 'Please select a chunking method.',
+ parserLabel: {
+ naive: 'General',
+ qa: 'Q&A',
+ resume: 'Resume',
+ manual: 'Manual',
+ table: 'Table',
+ paper: 'Paper',
+ book: 'Book',
+ laws: 'Laws',
+ presentation: 'Presentation',
+ picture: 'Picture',
+ one: 'One',
+ audio: 'Audio',
+ email: 'Email',
+ tag: 'Tag',
+ },
save: 'Save',
me: 'Only me',
team: 'Team',
diff --git a/web/src/pages/dataset/components/metedata/manage-modal.tsx b/web/src/pages/dataset/components/metedata/manage-modal.tsx
index 99302d309a..3fb8fca812 100644
--- a/web/src/pages/dataset/components/metedata/manage-modal.tsx
+++ b/web/src/pages/dataset/components/metedata/manage-modal.tsx
@@ -426,7 +426,7 @@ export const ManageMetadataModal = (props: IManageModalProps) => {
{t('knowledgeDetails.metadata.description')}
-
+
{t('knowledgeDetails.metadata.action')}
@@ -451,7 +451,7 @@ export const ManageMetadataModal = (props: IManageModalProps) => {
{row.description}
-
+
{
@@ -539,7 +539,7 @@ export const ManageMetadataModal = (props: IManageModalProps) => {
)}
{metadataType === MetadataType.Manage && (
-
+
{t('knowledgeDetails.metadata.toMetadataSettingTip')}
)}
diff --git a/web/src/pages/dataset/dataset/index.tsx b/web/src/pages/dataset/dataset/index.tsx
index 51651e7f26..8f9b41e252 100644
--- a/web/src/pages/dataset/dataset/index.tsx
+++ b/web/src/pages/dataset/dataset/index.tsx
@@ -142,7 +142,7 @@ export default function Dataset() {
)}
{manageMetadataVisible && (
diff --git a/web/src/pages/memory/memory-message/index.tsx b/web/src/pages/memory/memory-message/index.tsx
index 62e27678d3..6ca98f987d 100644
--- a/web/src/pages/memory/memory-message/index.tsx
+++ b/web/src/pages/memory/memory-message/index.tsx
@@ -19,7 +19,7 @@ export default function MemoryMessage() {
return (
{openSetting && (
}
-
+
{
@@ -145,7 +145,7 @@ export default function SearchPage() {
{!isSearching && (
-
+
{
type: FormFieldType.Number,
required: false,
render: (fieldProps: FormFieldConfig) => (
-
-
-
- {t('setting.minutes')}
-
+
+
+ {t('setting.minutes')}
+
+ }
+ />
{
hidden: true,
render: (fieldProps: FormFieldConfig) => {
return (
-
-
-
- hours
-
+
+ hours
+ }
+ />
);
},
@@ -109,11 +117,16 @@ const SourceDetailPage = () => {
type: FormFieldType.Number,
required: false,
render: (fieldProps: FormFieldConfig) => (
-
-
-
- {t('setting.seconds')}
-
+
+
+ {t('setting.seconds')}
+
+ }
+ />
),
},
diff --git a/web/src/pages/user-setting/setting-locale/translation-table.tsx b/web/src/pages/user-setting/setting-locale/translation-table.tsx
index 923855b6ab..34c2c13494 100644
--- a/web/src/pages/user-setting/setting-locale/translation-table.tsx
+++ b/web/src/pages/user-setting/setting-locale/translation-table.tsx
@@ -120,11 +120,11 @@ const TranslationTable: React.FC
= ({
const sortOrder = colState?.sortOrder;
if (sortOrder === 'asc') {
- return ;
+ return ;
} else if (sortOrder === 'desc') {
- return ;
+ return ;
} else {
- return ;
+ return ;
}
};
@@ -140,7 +140,7 @@ const TranslationTable: React.FC = ({
handleSort('key')}
>
@@ -202,7 +202,7 @@ const TranslationTable: React.FC
= ({
{paginatedData.length > 0 ? (
paginatedData.map((record) => (
-
+
{record.key}
{languages.map((lang) => (
diff --git a/web/src/pages/user-setting/setting-model/modal/verify-button/index.tsx b/web/src/pages/user-setting/setting-model/modal/verify-button/index.tsx
index b64930cef0..0720c83fec 100644
--- a/web/src/pages/user-setting/setting-model/modal/verify-button/index.tsx
+++ b/web/src/pages/user-setting/setting-model/modal/verify-button/index.tsx
@@ -19,7 +19,10 @@ const VerifyButton: React.FC = ({
isAbsolute = true,
params,
}) => {
- const { t } = useTranslate('setting');
+ const { t, i18n } = useTranslate('setting');
+ const isArabic = (i18n.resolvedLanguage || i18n.language || '')
+ .toLowerCase()
+ .startsWith('ar');
const [isVerifying, setIsVerifying] = useState(false);
const [verifyResult, setVerifyResult] = useState(null);
const form = useFormContext();
@@ -78,7 +81,7 @@ const VerifyButton: React.FC = ({
className={cn(
!isAbsolute || (verifyResult && verifyResult.isValid === false)
? 'flex flex-col gap-5 w-full '
- : 'absolute left-6 bottom-6 z-[100]',
+ : `absolute bottom-6 z-[100] ${isArabic ? 'right-6' : 'left-6'}`,
)}
>