Browse Source

Add support for i18n Farsi language (fa-IR) (#7044)

Sadegh Ghanbari Shohani 8 months ago
parent
commit
ffa992acf7

+ 1 - 0
api/constants/languages.py

@@ -16,6 +16,7 @@ language_timezone_mapping = {
     'pl-PL': 'Europe/Warsaw',
     'hi-IN': 'Asia/Kolkata',
     'tr-TR': 'Europe/Istanbul',
+    'fa-IR': 'Asia/Tehran',
 }
 
 languages = list(language_timezone_mapping.keys())

+ 87 - 0
web/i18n/fa-IR/app-annotation.ts

@@ -0,0 +1,87 @@
+const translation = {
+  title: 'یادداشت‌ها',
+  name: 'پاسخ یادداشت',
+  editBy: 'پاسخ ویرایش شده توسط {{author}}',
+  noData: {
+    title: 'بدون یادداشت',
+    description: 'شما می‌توانید یادداشت‌ها را در حین اشکال‌زدایی برنامه ویرایش کنید یا یادداشت‌ها را به صورت انبوه در اینجا برای پاسخگویی با کیفیت بالا وارد کنید.',
+  },
+  table: {
+    header: {
+      question: 'سوال',
+      answer: 'پاسخ',
+      createdAt: 'ایجاد شده در',
+      hits: 'بازدیدها',
+      actions: 'اقدامات',
+      addAnnotation: 'افزودن یادداشت',
+      bulkImport: 'واردات انبوه',
+      bulkExport: 'صادرات انبوه',
+      clearAll: 'پاک کردن همه یادداشت‌ها',
+    },
+  },
+  editModal: {
+    title: 'ویرایش پاسخ یادداشت',
+    queryName: 'پرسش کاربر',
+    answerName: 'ربات داستان‌سرا',
+    yourAnswer: 'پاسخ شما',
+    answerPlaceholder: 'پاسخ خود را اینجا بنویسید',
+    yourQuery: 'پرسش شما',
+    queryPlaceholder: 'پرسش خود را اینجا بنویسید',
+    removeThisCache: 'حذف این یادداشت',
+    createdAt: 'ایجاد شده در',
+  },
+  addModal: {
+    title: 'افزودن پاسخ یادداشت',
+    queryName: 'سوال',
+    answerName: 'پاسخ',
+    answerPlaceholder: 'پاسخ را اینجا بنویسید',
+    queryPlaceholder: 'پرسش را اینجا بنویسید',
+    createNext: 'افزودن پاسخ یادداشت‌شده دیگر',
+  },
+  batchModal: {
+    title: 'واردات انبوه',
+    csvUploadTitle: 'فایل CSV خود را اینجا بکشید و رها کنید، یا ',
+    browse: 'مرور کنید',
+    tip: 'فایل CSV باید از ساختار زیر پیروی کند:',
+    question: 'سوال',
+    answer: 'پاسخ',
+    contentTitle: 'محتوای تکه',
+    content: 'محتوا',
+    template: 'الگو را از اینجا دانلود کنید',
+    cancel: 'لغو',
+    run: 'اجرای دسته‌ای',
+    runError: 'اجرای دسته‌ای ناموفق بود',
+    processing: 'در حال پردازش دسته‌ای',
+    completed: 'واردات تکمیل شد',
+    error: 'خطای واردات',
+    ok: 'تایید',
+  },
+  errorMessage: {
+    answerRequired: 'پاسخ الزامی است',
+    queryRequired: 'سوال الزامی است',
+  },
+  viewModal: {
+    annotatedResponse: 'پاسخ یادداشت‌شده',
+    hitHistory: 'تاریخچه بازدید',
+    hit: 'بازدید',
+    hits: 'بازدیدها',
+    noHitHistory: 'بدون تاریخچه بازدید',
+  },
+  hitHistoryTable: {
+    query: 'پرسش',
+    match: 'تطابق',
+    response: 'پاسخ',
+    source: 'منبع',
+    score: 'امتیاز',
+    time: 'زمان',
+  },
+  initSetup: {
+    title: 'راه‌اندازی اولیه پاسخ یادداشت',
+    configTitle: 'تنظیمات پاسخ یادداشت',
+    confirmBtn: 'ذخیره و فعال‌سازی',
+    configConfirmBtn: 'ذخیره',
+  },
+  embeddingModelSwitchTip: 'مدل برداری‌سازی متن یادداشت، تغییر مدل‌ها باعث جاسازی مجدد خواهد شد و هزینه‌های اضافی به همراه خواهد داشت.',
+}
+
+export default translation

+ 83 - 0
web/i18n/fa-IR/app-api.ts

@@ -0,0 +1,83 @@
+const translation = {
+  apiServer: 'سرور API',
+  apiKey: 'کلید API',
+  status: 'وضعیت',
+  disabled: 'غیرفعال',
+  ok: 'در سرویس',
+  copy: 'کپی',
+  copied: 'کپی شد',
+  play: 'پخش',
+  pause: 'مکث',
+  playing: 'در حال پخش',
+  loading: 'در حال بارگذاری',
+  merMaind: {
+    rerender: 'بازسازی مجدد',
+  },
+  never: 'هرگز',
+  apiKeyModal: {
+    apiSecretKey: 'کلید مخفی API',
+    apiSecretKeyTips: 'برای جلوگیری از سوء استفاده از API، از کلید API خود محافظت کنید. از استفاده از آن به صورت متن ساده در کد فرانت‌اند خودداری کنید. :)',
+    createNewSecretKey: 'ایجاد کلید مخفی جدید',
+    secretKey: 'کلید مخفی',
+    created: 'ایجاد شده',
+    lastUsed: 'آخرین استفاده',
+    generateTips: 'این کلید را در مکانی امن و قابل دسترس نگه دارید.',
+  },
+  actionMsg: {
+    deleteConfirmTitle: 'این کلید مخفی حذف شود؟',
+    deleteConfirmTips: 'این عمل قابل بازگشت نیست.',
+    ok: 'تایید',
+  },
+  completionMode: {
+    title: 'API برنامه تکمیل',
+    info: 'برای تولید متن با کیفیت بالا، مانند مقالات، خلاصه‌ها و ترجمه‌ها، از API پیام‌های تکمیلی با ورودی کاربر استفاده کنید. تولید متن به پارامترهای مدل و قالب‌های پرامپت تنظیم شده در مهندسی پرامپت Dify بستگی دارد.',
+    createCompletionApi: 'ایجاد پیام تکمیلی',
+    createCompletionApiTip: 'یک پیام تکمیلی برای پشتیبانی از حالت سوال و جواب ایجاد کنید.',
+    inputsTips: '(اختیاری) فیلدهای ورودی کاربر را به صورت جفت‌های کلید-مقدار ارائه دهید که با متغیرهای موجود در مهندسی پرامپت مطابقت دارند. کلید نام متغیر است و مقدار، مقدار پارامتر است. اگر نوع فیلد انتخابی باشد، مقدار ارسال شده باید یکی از گزینه‌های از پیش تعیین شده باشد.',
+    queryTips: 'محتوای متن ورودی کاربر.',
+    blocking: 'نوع مسدودکننده، منتظر اتمام اجرا و بازگشت نتایج. (درخواست‌ها ممکن است در صورت طولانی بودن فرآیند قطع شوند)',
+    streaming: 'بازگشت جریانی. پیاده‌سازی بازگشت جریانی بر اساس SSE (رویدادهای ارسالی سرور).',
+    messageFeedbackApi: 'بازخورد پیام (لایک)',
+    messageFeedbackApiTip: 'پیام‌های دریافتی را از طرف کاربران نهایی با لایک یا دیسلایک ارزیابی کنید. این داده‌ها در صفحه گزارش‌ها و یادداشت‌ها قابل مشاهده هستند و برای تنظیم دقیق مدل در آینده استفاده می‌شوند.',
+    messageIDTip: 'شناسه پیام',
+    ratingTip: 'لایک یا دیسلایک، null برای لغو',
+    parametersApi: 'دریافت اطلاعات پارامترهای برنامه',
+    parametersApiTip: 'بازیابی پارامترهای ورودی پیکربندی شده، شامل نام‌های متغیر، نام‌های فیلد، انواع و مقادیر پیش‌فرض. معمولاً برای نمایش این فیلدها در یک فرم یا پر کردن مقادیر پیش‌فرض پس از بارگیری کلاینت استفاده می‌شود.',
+  },
+  chatMode: {
+    title: 'API برنامه چت',
+    info: 'برای برنامه‌های مکالمه‌ای چندمنظوره با استفاده از فرمت سوال و جواب، API پیام‌های چت را برای شروع گفتگو فراخوانی کنید. با ارسال شناسه مکالمه بازگشتی، گفتگوهای مداوم را حفظ کنید. پارامترهای پاسخ و قالب‌ها به تنظیمات مهندسی پرامپت Dify بستگی دارند.',
+    createChatApi: 'ایجاد پیام چت',
+    createChatApiTip: 'یک پیام مکالمه جدید ایجاد کنید یا یک گفتگوی موجود را ادامه دهید.',
+    inputsTips: '(اختیاری) فیلدهای ورودی کاربر را به صورت جفت‌های کلید-مقدار ارائه دهید که با متغیرهای موجود در مهندسی پرامپت مطابقت دارند. کلید نام متغیر است و مقدار، مقدار پارامتر است. اگر نوع فیلد انتخابی باشد، مقدار ارسال شده باید یکی از گزینه‌های از پیش تعیین شده باشد.',
+    queryTips: 'محتوای ورودی/سوال کاربر',
+    blocking: 'نوع مسدودکننده، منتظر اتمام اجرا و بازگشت نتایج. (درخواست‌ها ممکن است در صورت طولانی بودن فرآیند قطع شوند)',
+    streaming: 'بازگشت جریانی. پیاده‌سازی بازگشت جریانی بر اساس SSE (رویدادهای ارسالی سرور).',
+    conversationIdTip: '(اختیاری) شناسه مکالمه: برای اولین مکالمه خالی بگذارید؛ برای ادامه گفتگو، شناسه مکالمه را از متن ارسال کنید.',
+    messageFeedbackApi: 'بازخورد کاربر نهایی پیام، لایک',
+    messageFeedbackApiTip: 'پیام‌های دریافتی را از طرف کاربران نهایی با لایک یا دیسلایک ارزیابی کنید. این داده‌ها در صفحه گزارش‌ها و یادداشت‌ها قابل مشاهده هستند و برای تنظیم دقیق مدل در آینده استفاده می‌شوند.',
+    messageIDTip: 'شناسه پیام',
+    ratingTip: 'لایک یا دیسلایک، null برای لغو',
+    chatMsgHistoryApi: 'دریافت تاریخچه پیام‌های چت',
+    chatMsgHistoryApiTip: 'صفحه اول آخرین `limit` پیام را به صورت معکوس برمی‌گرداند.',
+    chatMsgHistoryConversationIdTip: 'شناسه مکالمه',
+    chatMsgHistoryFirstId: 'شناسه اولین رکورد چت در صفحه فعلی. پیش‌فرض هیچ است.',
+    chatMsgHistoryLimit: 'تعداد چت‌هایی که در یک درخواست برگردانده می‌شوند',
+    conversationsListApi: 'دریافت لیست مکالمات',
+    conversationsListApiTip: 'لیست جلسات کاربر فعلی را دریافت می‌کند. به طور پیش‌فرض، 20 جلسه آخر برگردانده می‌شود.',
+    conversationsListFirstIdTip: 'شناسه آخرین رکورد در صفحه فعلی، پیش‌فرض هیچ.',
+    conversationsListLimitTip: 'تعداد چت‌هایی که در یک درخواست برگردانده می‌شوند',
+    conversationRenamingApi: 'تغییر نام مکالمه',
+    conversationRenamingApiTip: 'تغییر نام مکالمات؛ نام در رابط‌های کاربری چند جلسه‌ای نمایش داده می‌شود.',
+    conversationRenamingNameTip: 'نام جدید',
+    parametersApi: 'دریافت اطلاعات پارامترهای برنامه',
+    parametersApiTip: 'بازیابی پارامترهای ورودی پیکربندی شده، شامل نام‌های متغیر، نام‌های فیلد، انواع و مقادیر پیش‌فرض. معمولاً برای نمایش این فیلدها در یک فرم یا پر کردن مقادیر پیش‌فرض پس از بارگیری کلاینت استفاده می‌شود.',
+  },
+  develop: {
+    requestBody: 'بدنه درخواست',
+    pathParams: 'پارامترهای مسیر',
+    query: 'پرس‌وجو',
+  },
+}
+
+export default translation

+ 455 - 0
web/i18n/fa-IR/app-debug.ts

@@ -0,0 +1,455 @@
+const translation = {
+  pageTitle: {
+    line1: 'پرومپت',
+    line2: 'مهندسی',
+  },
+  orchestrate: 'هماهنگ کردن',
+  promptMode: {
+    simple: 'برای ویرایش کل پرومپت به حالت کارشناس بروید',
+    advanced: 'حالت کارشناس',
+    switchBack: 'بازگشت',
+    advancedWarning: {
+      title: 'شما به حالت کارشناس رفته‌اید، و پس از تغییر پرومپت، نمی‌توانید به حالت ساده برگردید.',
+      description: 'در حالت کارشناس، می‌توانید کل پرومپت را ویرایش کنید.',
+      learnMore: 'بیشتر بدانید',
+      ok: 'باشه',
+    },
+    operation: {
+      addMessage: 'اضافه کردن پیام',
+    },
+    contextMissing: 'مولفه زمینه‌ای از دست رفته است، اثر بخشی پرومپت ممکن است خوب نباشد.',
+  },
+  operation: {
+    applyConfig: 'انتشار',
+    resetConfig: 'تنظیم مجدد',
+    debugConfig: 'دیباگ',
+    addFeature: 'اضافه کردن ویژگی',
+    automatic: 'تولید کردن',
+    stopResponding: 'توقف پاسخ‌دهی',
+    agree: 'پسندیدن',
+    disagree: 'نپسندیدن',
+    cancelAgree: 'لغو پسندیدن',
+    cancelDisagree: 'لغو نپسندیدن',
+    userAction: 'عمل کاربر',
+  },
+  notSetAPIKey: {
+    title: 'کلید ارائه‌دهنده LLM تنظیم نشده است',
+    trailFinished: 'آزمایش تمام شد',
+    description: 'کلید ارائه‌دهنده LLM تنظیم نشده است و باید قبل از دیباگ تنظیم شود.',
+    settingBtn: 'به تنظیمات بروید',
+  },
+  trailUseGPT4Info: {
+    title: 'در حال حاضر پشتیبانی نمی‌شود gpt-4',
+    description: 'برای استفاده از gpt-4، لطفاً کلید API را تنظیم کنید.',
+  },
+  feature: {
+    groupChat: {
+      title: 'تقویت گفتگو',
+      description: 'افزودن تنظیمات پیش از گفتگو برای برنامه‌ها می‌تواند تجربه کاربری را بهبود بخشد.',
+    },
+    groupExperience: {
+      title: 'تقویت تجربه',
+    },
+    conversationOpener: {
+      title: 'شروع‌کننده گفتگو',
+      description: 'در یک برنامه چت، اولین جمله‌ای که AI فعالانه با کاربر صحبت می‌کند، معمولاً به عنوان خوشامدگویی استفاده می‌شود.',
+    },
+    suggestedQuestionsAfterAnswer: {
+      title: 'پیگیری',
+      description: 'تنظیم پیشنهاد سوالات بعدی می‌تواند به کاربران یک چت بهتر ارائه دهد.',
+      resDes: '3 پیشنهاد برای سوال بعدی کاربر.',
+      tryToAsk: 'سعی کنید بپرسید',
+    },
+    moreLikeThis: {
+      title: 'بیشتر از این',
+      description: 'تولید چندین متن به طور همزمان، و سپس ویرایش و ادامه تولید',
+      generateNumTip: 'تعداد تولید هر بار',
+      tip: 'استفاده از این ویژگی هزینه‌های اضافی توکن‌ها را به همراه دارد',
+    },
+    speechToText: {
+      title: 'تبدیل گفتار به متن',
+      description: 'پس از فعال شدن، می‌توانید از ورودی صوتی استفاده کنید.',
+      resDes: 'ورودی صوتی فعال شده است',
+    },
+    textToSpeech: {
+      title: 'تبدیل متن به گفتار',
+      description: 'پس از فعال شدن، متن می‌تواند به گفتار تبدیل شود.',
+      resDes: 'تبدیل متن به صدا فعال شده است',
+    },
+    citation: {
+      title: 'ارجاعات و استنادات',
+      description: 'پس از فعال شدن، سند منبع و بخش استناد شده از محتوای تولید شده را نشان می‌دهد.',
+      resDes: 'ارجاعات و استنادات فعال شده است',
+    },
+    annotation: {
+      title: 'پاسخ حاشیه‌نویسی',
+      description: 'می‌توانید پاسخ‌های با کیفیت بالا را به صورت دستی به حافظه کش اضافه کنید تا با سوالات مشابه کاربران تطبیق یابد.',
+      resDes: 'پاسخ حاشیه‌نویسی فعال شده است',
+      scoreThreshold: {
+        title: 'آستانه امتیاز',
+        description: 'Used to set the similarity threshold for annotation reply.',
+        easyMatch: 'تطابق آسان',
+        accurateMatch: 'تطابق دقیق',
+      },
+      matchVariable: {
+        title: 'تغییر متغیر',
+        choosePlaceholder: 'انتخاب متغیر تغییر',
+      },
+      cacheManagement: 'حاشیه نویسی',
+      cached: 'حاشیه نویسی شده',
+      remove: 'حذف',
+      removeConfirm: 'این حاشیه نویسی را حذف کنید؟',
+      add: 'افزودن حاشیه نویسی',
+      edit: 'ویرایش حاشیه نویسی',
+    },
+    dataSet: {
+      title: 'زمینه',
+      noData: 'شما می‌توانید دانش را به عنوان زمینه وارد کنید',
+      words: 'کلمات',
+      textBlocks: 'بلوک‌های متن',
+      selectTitle: 'انتخاب دانش مرجع',
+      selected: 'دانش انتخاب شده',
+      noDataSet: 'هیچ دانشی یافت نشد',
+      toCreate: 'برای ایجاد بروید',
+      notSupportSelectMulti: 'در حال حاضر فقط یک دانش پشتیبانی می‌شود',
+      queryVariable: {
+        title: 'متغیر پرس و جو',
+        tip: 'این متغیر به عنوان ورودی پرس و جو برای بازیابی زمینه استفاده خواهد شد و اطلاعات زمینه مرتبط با ورودی این متغیر را به دست می‌آورد.',
+        choosePlaceholder: 'انتخاب متغیر پرس و جو',
+        noVar: 'بدون متغیر',
+        noVarTip: 'لطفاً متغیری را در بخش متغیرها ایجاد کنید',
+        unableToQueryDataSet: 'عدم امکان پرس و جو از دانش',
+        unableToQueryDataSetTip: 'پرس و جوی موفقیت آمیز دانش ممکن نیست، لطفاً یک متغیر پرس و جو زمینه را در بخش زمینه انتخاب کنید.',
+        ok: 'باشه',
+        contextVarNotEmpty: 'متغیر پرس و جو زمینه نمی‌تواند خالی باشد',
+        deleteContextVarTitle: 'متغیر "{{varName}}" را حذف کنید؟',
+        deleteContextVarTip: 'این متغیر به عنوان متغیر پرس و جو زمینه تنظیم شده است و حذف آن بر استفاده عادی از دانش تأثیر می‌گذارد. اگر هنوز نیاز به حذف دارید، لطفاً آن را در بخش زمینه دوباره انتخاب کنید.',
+      },
+    },
+    tools: {
+      title: 'ابزارها',
+      tips: 'ابزارها یک روش استاندارد برای فراخوانی API فراهم می‌کنند و ورودی کاربر یا متغیرها را به عنوان پارامترهای درخواست برای پرس و جو داده‌های خارجی به عنوان زمینه می‌گیرند.',
+      toolsInUse: '{{count}} ابزار در حال استفاده',
+      modal: {
+        title: 'ابزار',
+        toolType: {
+          title: 'نوع ابزار',
+          placeholder: 'لطفاً نوع ابزار را انتخاب کنید',
+        },
+        name: {
+          title: 'نام',
+          placeholder: 'لطفاً نام را وارد کنید',
+        },
+        variableName: {
+          title: 'نام متغیر',
+          placeholder: 'لطفاً نام متغیر را وارد کنید',
+        },
+      },
+    },
+    conversationHistory: {
+      title: 'تاریخچه مکالمه',
+      description: 'تنظیم پیشوند نام‌ها برای نقش‌های مکالمه',
+      tip: 'تاریخچه مکالمه فعال نشده است، لطفاً <histories> را در فراخوانی بالا اضافه کنید.',
+      learnMore: 'بیشتر بدانید',
+      editModal: {
+        title: 'ویرایش نام نقش‌های مکالمه',
+        userPrefix: 'پیشوند کاربر',
+        assistantPrefix: 'پیشوند دستیار',
+      },
+    },
+    toolbox: {
+      title: 'جعبه ابزار',
+    },
+    moderation: {
+      title: 'مدیریت محتوا',
+      description: 'خروجی مدل را با استفاده از API مدیریت یا نگهداری فهرست کلمات حساس امن کنید.',
+      allEnabled: 'محتوای ورودی/خروجی فعال شده',
+      inputEnabled: 'محتوای ورودی فعال شده',
+      outputEnabled: 'محتوای خروجی فعال شده',
+      modal: {
+        title: 'تنظیمات مدیریت محتوا',
+        provider: {
+          title: 'ارائه دهنده',
+          openai: 'مدیریت OpenAI',
+          openaiTip: {
+            prefix: 'مدیریت OpenAI نیاز به کلید API OpenAI دارد که در ',
+            suffix: ' تنظیم شده باشد.',
+          },
+          keywords: 'کلمات کلیدی',
+        },
+        keywords: {
+          tip: 'هر خط یک کلمه، با شکست خطوط جدا شده. حداکثر 100 کاراکتر در هر خط.',
+          placeholder: 'هر خط یک کلمه، با شکست خطوط جدا شده',
+          line: 'خط',
+        },
+        content: {
+          input: 'مدیریت محتوای ورودی',
+          output: 'مدیریت محتوای خروجی',
+          preset: 'پاسخ‌های پیش فرض',
+          placeholder: 'محتوای پاسخ‌های پیش فرض در اینجا',
+          condition: 'مدیریت محتوای ورودی و خروجی حداقل یک مورد فعال شده است',
+          fromApi: 'پاسخ‌های پیش فرض از API برگردانده می‌شود',
+          errorMessage: 'پاسخ‌های پیش فرض نمی‌تواند خالی باشد',
+          supportMarkdown: 'پشتیبانی از Markdown',
+        },
+        openaiNotConfig: {
+          before: 'مدیریت OpenAI نیاز به کلید API OpenAI دارد که در',
+          after: '',
+        },
+      },
+    },
+    generate: {
+      title: 'تولید کننده دستورالعمل',
+      description: 'تولید کننده دستورالعمل از مدل تنظیم شده برای بهینه سازی دستورالعمل‌ها برای کیفیت بالاتر و ساختار بهتر استفاده می‌کند. لطفاً دستورالعمل‌های واضح و دقیقی بنویسید.',
+      tryIt: 'امتحان کنید',
+      instruction: 'دستورالعمل‌ها',
+      instructionPlaceHolder: 'دستورالعمل‌های واضح و خاصی بنویسید.',
+      generate: 'تولید',
+      resTitle: 'دستورالعمل تولید شده',
+      noDataLine1: 'موارد استفاده خود را در سمت چپ توصیف کنید،',
+      noDataLine2: 'پیش‌نمایش ارکستراسیون در اینجا نشان داده خواهد شد.',
+      apply: 'اعمال',
+      loading: 'در حال ارکستراسیون برنامه برای شما...',
+      overwriteTitle: 'آیا تنظیمات موجود را لغو می‌کنید؟',
+      overwriteMessage: 'اعمال این دستورالعمل تنظیمات موجود را لغو خواهد کرد.',
+      template: {
+        pythonDebugger: {
+          name: 'اشکال‌زدای پایتون',
+          instruction: 'یک بات که می‌تواند بر اساس دستورالعمل شما کد تولید و اشکال‌زدایی کند',
+        },
+        translation: {
+          name: 'ترجمه',
+          instruction: 'یک مترجم که می‌تواند چندین زبان را ترجمه کند',
+        },
+        professionalAnalyst: {
+          name: 'تحلیلگر حرفه‌ای',
+          instruction: 'استخراج بینش‌ها، شناسایی ریسک و خلاصه‌سازی اطلاعات کلیدی از گزارش‌های طولانی به یک یادداشت کوتاه',
+        },
+        excelFormulaExpert: {
+          name: 'کارشناس فرمول اکسل',
+          instruction: 'یک چت‌بات که می‌تواند به کاربران مبتدی کمک کند فرمول‌های اکسل را بر اساس دستورالعمل‌های کاربر درک، استفاده و ایجاد کنند',
+        },
+        travelPlanning: {
+          name: 'برنامه‌ریزی سفر',
+          instruction: 'دستیار برنامه‌ریزی سفر یک ابزار هوشمند است که به کاربران کمک می‌کند سفرهای خود را به راحتی برنامه‌ریزی کنند',
+        },
+        SQLSorcerer: {
+          name: 'جادوگر SQL',
+          instruction: 'تبدیل زبان روزمره به پرس و جوهای SQL',
+        },
+        GitGud: {
+          name: 'Git gud',
+          instruction: 'تولید دستورات مناسب Git بر اساس اقدامات توصیف شده توسط کاربر در کنترل نسخه',
+        },
+        meetingTakeaways: {
+          name: 'نتایج جلسات',
+          instruction: 'خلاصه‌سازی جلسات به صورت مختصر شامل موضوعات بحث، نکات کلیدی و موارد اقدام',
+        },
+        writingsPolisher: {
+          name: 'پولیش‌گر نوشته‌ها',
+          instruction: 'استفاده از تکنیک‌های ویرایش پیشرفته برای بهبود نوشته‌های شما',
+        },
+      },
+    },
+    resetConfig: {
+      title: 'بازنشانی تأیید می‌شود؟',
+      message: 'بازنشانی تغییرات را لغو کرده و تنظیمات منتشر شده آخر را بازیابی می‌کند.',
+    },
+    errorMessage: {
+      nameOfKeyRequired: 'نام کلید: {{key}} مورد نیاز است',
+      valueOfVarRequired: 'مقدار {{key}} نمی‌تواند خالی باشد',
+      queryRequired: 'متن درخواست مورد نیاز است.',
+      waitForResponse: 'لطفاً منتظر پاسخ به پیام قبلی بمانید.',
+      waitForBatchResponse: 'لطفاً منتظر پاسخ به کار دسته‌ای بمانید.',
+      notSelectModel: 'لطفاً یک مدل را انتخاب کنید',
+      waitForImgUpload: 'لطفاً منتظر بارگذاری تصویر بمانید',
+    },
+    chatSubTitle: 'دستورالعمل‌ها',
+    completionSubTitle: 'پیشوند پرس و جو',
+    promptTip: 'دستورالعمل‌ها و محدودیت‌ها پاسخ‌های AI را هدایت می‌کنند. متغیرهایی مانند {{input}} را درج کنید. این دستورالعمل برای کاربران قابل مشاهده نخواهد بود.',
+    formattingChangedTitle: 'قالب‌بندی تغییر کرد',
+    formattingChangedText: 'تغییر قالب‌بندی منطقه اشکال‌زدایی را بازنشانی خواهد کرد، آیا مطمئن هستید؟',
+    variableTitle: 'متغیرها',
+    variableTip: 'کاربران متغیرها را در فرم پر می‌کنند و به طور خودکار متغیرها را در دستورالعمل‌ها جایگزین می‌کنند.',
+    notSetVar: 'متغیرها به کاربران اجازه می‌دهند که کلمات پرس و جو یا جملات ابتدایی را هنگام پر کردن فرم معرفی کنند. شما می‌توانید سعی کنید "{{input}}" را در کلمات پرس و جو وارد کنید.',
+    autoAddVar: 'متغیرهای تعریف نشده‌ای که در پیش‌پرسش ذکر شده‌اند، آیا می‌خواهید آنها را به فرم ورودی کاربر اضافه کنید؟',
+    variableTable: {
+      key: 'کلید متغیر',
+      name: 'نام فیلد ورودی کاربر',
+      optional: 'اختیاری',
+      type: 'نوع ورودی',
+      action: 'اقدامات',
+      typeString: 'رشته',
+      typeSelect: 'انتخاب',
+    },
+    varKeyError: {
+      canNoBeEmpty: 'کلید متغیر نمی‌تواند خالی باشد',
+      tooLong: 'کلید متغیر: {{key}} طولانی است. نمی‌تواند بیش از 30 کاراکتر باشد',
+      notValid: 'کلید متغیر: {{key}} نامعتبر است. فقط می‌تواند شامل حروف، اعداد و زیرخط باشد',
+      notStartWithNumber: 'کلید متغیر: {{key}} نمی‌تواند با عدد شروع شود',
+      keyAlreadyExists: 'کلید متغیر: :{{key}} از قبل وجود دارد',
+    },
+    otherError: {
+      promptNoBeEmpty: 'پرس و جو نمی‌تواند خالی باشد',
+      historyNoBeEmpty: 'تاریخچه مکالمه باید در پرس و جو تنظیم شود',
+      queryNoBeEmpty: 'پرس و جو باید در پرس و جو تنظیم شود',
+    },
+    variableConig: {
+      'addModalTitle': 'افزودن فیلد ورودی',
+      'editModalTitle': 'ویرایش فیلد ورودی',
+      'description': 'تنظیم برای متغیر {{varName}}',
+      'fieldType': 'نوع فیلد',
+      'string': 'متن کوتاه',
+      'text-input': 'متن کوتاه',
+      'paragraph': 'پاراگراف',
+      'select': 'انتخاب',
+      'number': 'عدد',
+      'notSet': 'تنظیم نشده، سعی کنید {{input}} را در پرس و جو وارد کنید',
+      'stringTitle': 'گزینه‌های جعبه متن فرم',
+      'maxLength': 'حداکثر طول',
+      'options': 'گزینه‌ها',
+      'addOption': 'افزودن گزینه',
+      'apiBasedVar': 'متغیر مبتنی بر API',
+      'varName': 'نام متغیر',
+      'labelName': 'نام برچسب',
+      'inputPlaceholder': 'لطفاً وارد کنید',
+      'content': 'محتوا',
+      'required': 'مورد نیاز',
+      'errorMsg': {
+        varNameRequired: 'نام متغیر مورد نیاز است',
+        labelNameRequired: 'نام برچسب مورد نیاز است',
+        varNameCanBeRepeat: 'نام متغیر نمی‌تواند تکراری باشد',
+        atLeastOneOption: 'حداقل یک گزینه مورد نیاز است',
+        optionRepeat: 'گزینه‌های تکراری وجود دارد',
+      },
+    },
+    vision: {
+      name: 'بینایی',
+      description: 'فعال کردن بینایی به مدل اجازه می‌دهد تصاویر را دریافت کند و به سوالات مربوط به آنها پاسخ دهد.',
+      settings: 'تنظیمات',
+      visionSettings: {
+        title: 'تنظیمات بینایی',
+        resolution: 'وضوح',
+        resolutionTooltip: `وضوح پایین به مدل اجازه می‌دهد نسخه 512x512 کم‌وضوح تصویر را دریافت کند و تصویر را با بودجه 65 توکن نمایش دهد. این به API اجازه می‌دهد پاسخ‌های سریع‌تری بدهد و توکن‌های ورودی کمتری برای موارد استفاده که نیاز به جزئیات بالا ندارند مصرف کند.
+          \n
+          وضوح بالا ابتدا به مدل اجازه می‌دهد تصویر کم‌وضوح را ببیند و سپس قطعات جزئیات تصویر ورودی را به عنوان مربع‌های 512px ایجاد کند. هر کدام از قطعات جزئیات از بودجه توکن دو برابر استفاده می‌کنند که در مجموع 129 توکن است.`,
+        high: 'بالا',
+        low: 'پایین',
+        uploadMethod: 'روش بارگذاری',
+        both: 'هر دو',
+        localUpload: 'بارگذاری محلی',
+        url: 'URL',
+        uploadLimit: 'محدودیت بارگذاری',
+      },
+    },
+    voice: {
+      name: 'صدا',
+      defaultDisplay: 'صدا پیش فرض',
+      description: 'تنظیمات تبدیل متن به گفتار',
+      settings: 'تنظیمات',
+      voiceSettings: {
+        title: 'تنظیمات صدا',
+        language: 'زبان',
+        resolutionTooltip: 'پشتیبانی از زبان صدای تبدیل متن به گفتار.',
+        voice: 'صدا',
+        autoPlay: 'پخش خودکار',
+        autoPlayEnabled: 'روشن کردن',
+        autoPlayDisabled: 'خاموش کردن',
+      },
+    },
+    openingStatement: {
+      title: 'شروع مکالمه',
+      add: 'افزودن',
+      writeOpener: 'نوشتن آغازگر',
+      placeholder: 'پیام آغازگر خود را اینجا بنویسید، می‌توانید از متغیرها استفاده کنید، سعی کنید {{variable}} را تایپ کنید.',
+      openingQuestion: 'سوالات آغازین',
+      noDataPlaceHolder: 'شروع مکالمه با کاربر می‌تواند به AI کمک کند تا ارتباط نزدیک‌تری با آنها برقرار کند.',
+      varTip: 'می‌توانید از متغیرها استفاده کنید، سعی کنید {{variable}} را تایپ کنید',
+      tooShort: 'حداقل 20 کلمه از پرسش اولیه برای تولید نظرات آغازین مکالمه مورد نیاز است.',
+      notIncludeKey: 'پرسش اولیه شامل متغیر: {{key}} نمی‌شود. لطفاً آن را به پرسش اولیه اضافه کنید.',
+    },
+    modelConfig: {
+      model: 'مدل',
+      setTone: 'تنظیم لحن پاسخ‌ها',
+      title: 'مدل و پارامترها',
+      modeType: {
+        chat: 'چت',
+        completion: 'تکمیل',
+      },
+    },
+    inputs: {
+      title: 'اشکال‌زدایی و پیش‌نمایش',
+      noPrompt: 'سعی کنید پرسش‌هایی را در ورودی پیش‌پرسش بنویسید',
+      userInputField: 'فیلد ورودی کاربر',
+      noVar: 'مقدار متغیر را پر کنید، که به طور خودکار در کلمات پرس و جو در هر بار شروع یک جلسه جدید جایگزین می‌شود.',
+      chatVarTip: 'مقدار متغیر را پر کنید، که به طور خودکار در کلمات پرس و جو در هر بار شروع یک جلسه جدید جایگزین می‌شود',
+      completionVarTip: 'مقدار متغیر را پر کنید، که به طور خودکار در کلمات پرس و جو در هر بار ارسال سوال جایگزین می‌شود.',
+      previewTitle: 'پیش‌نمایش پرس و جو',
+      queryTitle: 'محتوای پرس و جو',
+      queryPlaceholder: 'لطفاً متن درخواست را وارد کنید.',
+      run: 'اجرا',
+    },
+    result: 'متن خروجی',
+    datasetConfig: {
+      settingTitle: 'تنظیمات بازیابی',
+      knowledgeTip: 'روی دکمه "+" کلیک کنید تا دانش اضافه شود',
+      retrieveOneWay: {
+        title: 'بازیابی N به 1',
+        description: 'بر اساس نیت کاربر و توصیفات دانش، عامل بهترین دانش را برای پرس و جو به طور خودکار انتخاب می‌کند. بهترین برای برنامه‌هایی با دانش محدود و مشخص.',
+      },
+      retrieveMultiWay: {
+        title: 'بازیابی چند مسیره',
+        description: 'بر اساس نیت کاربر، از تمام دانش پرس و جو می‌کند، متن‌های مرتبط از منابع چندگانه بازیابی می‌کند و بهترین نتایج مطابقت با پرس و جوی کاربر را پس از مرتب‌سازی مجدد انتخاب می‌کند.',
+      },
+      rerankModelRequired: 'مدل مرتب‌سازی مجدد مورد نیاز است',
+      params: 'پارامترها',
+      top_k: 'Top K',
+      top_kTip: 'برای فیلتر کردن تکه‌هایی که بیشترین شباهت به سوالات کاربر دارند استفاده می‌شود. سیستم همچنین به طور دینامیک مقدار Top K را بر اساس max_tokens مدل انتخاب شده تنظیم می‌کند.',
+      score_threshold: 'آستانه نمره',
+      score_thresholdTip: 'برای تنظیم آستانه شباهت برای فیلتر کردن تکه‌ها استفاده می‌شود.',
+      retrieveChangeTip: 'تغییر حالت شاخص و حالت بازیابی ممکن است بر برنامه‌های مرتبط با این دانش تأثیر بگذارد.',
+    },
+    debugAsSingleModel: 'اشکال‌زدایی به عنوان مدل تک',
+    debugAsMultipleModel: 'اشکال‌زدایی به عنوان مدل چندگانه',
+    duplicateModel: 'تکراری',
+    publishAs: 'انتشار به عنوان',
+    assistantType: {
+      name: 'نوع دستیار',
+      chatAssistant: {
+        name: 'دستیار پایه',
+        description: 'ساخت دستیار مبتنی بر چت با استفاده از مدل زبان بزرگ',
+      },
+      agentAssistant: {
+        name: 'دستیار عامل',
+        description: 'ساخت یک عامل هوشمند که می‌تواند ابزارها را به طور خودکار برای تکمیل وظایف انتخاب کند',
+      },
+    },
+    agent: {
+      agentMode: 'حالت عامل',
+      agentModeDes: 'تنظیم نوع حالت استنتاج برای عامل',
+      agentModeType: {
+        ReACT: 'ReAct',
+        functionCall: 'فراخوانی تابع',
+      },
+      setting: {
+        name: 'تنظیمات عامل',
+        description: 'تنظیمات دستیار عامل به شما اجازه می‌دهد حالت عامل و ویژگی‌های پیشرفته مانند پرسش‌های ساخته شده را تنظیم کنید، فقط در نوع عامل موجود است.',
+        maximumIterations: {
+          name: 'حداکثر تکرارها',
+          description: 'محدود کردن تعداد تکرارهایی که دستیار عامل می‌تواند اجرا کند',
+        },
+      },
+      buildInPrompt: 'پرسش‌های ساخته شده',
+      firstPrompt: 'اولین پرسش',
+      nextIteration: 'تکرار بعدی',
+      promptPlaceholder: 'پرسش خود را اینجا بنویسید',
+      tools: {
+        name: 'ابزارها',
+        description: 'استفاده از ابزارها می‌تواند قابلیت‌های LLM را گسترش دهد، مانند جستجو در اینترنت یا انجام محاسبات علمی',
+        enabled: 'فعال',
+      },
+    },
+  },
+}
+
+export default translation

+ 91 - 0
web/i18n/fa-IR/app-log.ts

@@ -0,0 +1,91 @@
+const translation = {
+  title: 'لاگ‌ها',
+  description: 'لاگ‌ها وضعیت اجرایی برنامه را ثبت می‌کنند، شامل ورودی‌های کاربر و پاسخ‌های هوش مصنوعی.',
+  dateTimeFormat: 'MM/DD/YYYY hh:mm A',
+  table: {
+    header: {
+      time: 'زمان',
+      endUser: 'کاربر نهایی',
+      input: 'ورودی',
+      output: 'خروجی',
+      summary: 'عنوان',
+      messageCount: 'تعداد پیام',
+      userRate: 'امتیاز کاربر',
+      adminRate: 'امتیاز اپراتور',
+      startTime: 'زمان شروع',
+      status: 'وضعیت',
+      runtime: 'زمان اجرا',
+      tokens: 'توکن‌ها',
+      user: 'کاربر نهایی',
+      version: 'نسخه',
+    },
+    pagination: {
+      previous: 'قبلی',
+      next: 'بعدی',
+    },
+    empty: {
+      noChat: 'هنوز مکالمه‌ای وجود ندارد',
+      noOutput: 'خروجی وجود ندارد',
+      element: {
+        title: 'کسی هست؟',
+        content: 'در اینجا تعاملات بین کاربران نهایی و برنامه‌های هوش مصنوعی را مشاهده و حاشیه‌نویسی کنید تا دقت هوش مصنوعی بهبود یابد. می‌توانید <shareLink>به اشتراک بگذارید</shareLink> یا <testLink>برنامه وب را تست کنید</testLink> و سپس به این صفحه برگردید.',
+      },
+    },
+  },
+  detail: {
+    time: 'زمان',
+    conversationId: 'شناسه مکالمه',
+    promptTemplate: 'قالب درخواست',
+    promptTemplateBeforeChat: 'قالب درخواست قبل از چت · به عنوان پیام سیستمی',
+    annotationTip: 'بهبودها توسط {{user}} علامت‌گذاری شده است',
+    timeConsuming: '',
+    second: 'ثانیه',
+    tokenCost: 'توکن مصرفی',
+    loading: 'در حال بارگذاری',
+    operation: {
+      like: 'پسندیدن',
+      dislike: 'نپسندیدن',
+      addAnnotation: 'اضافه کردن بهبود',
+      editAnnotation: 'ویرایش بهبود',
+      annotationPlaceholder: 'پاسخ مورد انتظاری که می‌خواهید هوش مصنوعی بدهد را وارد کنید، که می‌تواند برای بهبود مدل و کیفیت تولید متن در آینده استفاده شود.',
+    },
+    variables: 'متغیرها',
+    uploadImages: 'تصاویر آپلود شده',
+  },
+  filter: {
+    period: {
+      today: 'امروز',
+      last7days: '7 روز گذشته',
+      last4weeks: '4 هفته گذشته',
+      last3months: '3 ماه گذشته',
+      last12months: '12 ماه گذشته',
+      monthToDate: 'از ابتدای ماه تاکنون',
+      quarterToDate: 'از ابتدای فصل تاکنون',
+      yearToDate: 'از ابتدای سال تاکنون',
+      allTime: 'همه زمان‌ها',
+    },
+    annotation: {
+      all: 'همه',
+      annotated: 'بهبودهای حاشیه‌نویسی شده ({{count}} آیتم)',
+      not_annotated: 'حاشیه‌نویسی نشده',
+    },
+  },
+  workflowTitle: 'لاگ‌های جریان کاری',
+  workflowSubtitle: 'لاگ عملیات خودکار را ثبت کرده است.',
+  runDetail: {
+    title: 'لاگ مکالمه',
+    workflowTitle: 'جزئیات لاگ',
+  },
+  promptLog: 'لاگ درخواست',
+  agentLog: 'لاگ عامل',
+  viewLog: 'مشاهده لاگ',
+  agentLogDetail: {
+    agentMode: 'حالت عامل',
+    toolUsed: 'ابزار استفاده شده',
+    iterations: 'تکرارها',
+    iteration: 'تکرار',
+    finalProcessing: 'پردازش نهایی',
+  },
+}
+
+export default translation

+ 156 - 0
web/i18n/fa-IR/app-overview.ts

@@ -0,0 +1,156 @@
+const translation = {
+  welcome: {
+    firstStepTip: 'برای شروع،',
+    enterKeyTip: 'کلید API خود را در زیر وارد کنید',
+    getKeyTip: 'کلید API خود را از داشبورد OpenAI دریافت کنید',
+    placeholder: 'کلید API خود را وارد کنید (مثلاً sk-xxxx)',
+  },
+  apiKeyInfo: {
+    cloud: {
+      trial: {
+        title: 'شما از سهمیه آزمایشی {{providerName}} استفاده می‌کنید.',
+        description: 'سهمیه آزمایشی برای اهداف تست شما ارائه شده است. قبل از اینکه سهمیه آزمایشی تمام شود، لطفاً ارائه‌دهنده مدل خود را تنظیم کنید یا سهمیه اضافی خریداری کنید.',
+      },
+      exhausted: {
+        title: 'سهمیه آزمایشی شما تمام شده است، لطفاً کلید API خود را تنظیم کنید.',
+        description: 'شما سهمیه آزمایشی خود را مصرف کرده‌اید. لطفاً ارائه‌دهنده مدل خود را تنظیم کنید یا سهمیه اضافی خریداری کنید.',
+      },
+    },
+    selfHost: {
+      title: {
+        row1: 'برای شروع،',
+        row2: 'ابتدا ارائه‌دهنده مدل خود را تنظیم کنید.',
+      },
+    },
+    callTimes: 'تعداد تماس‌ها',
+    usedToken: 'توکن‌های مصرف‌شده',
+    setAPIBtn: 'برو به تنظیمات ارائه‌دهنده مدل',
+    tryCloud: 'یا نسخه ابری Dify با سهمیه رایگان را امتحان کنید',
+  },
+  overview: {
+    title: 'نمای کلی',
+    appInfo: {
+      explanation: 'برنامه وب AI آماده به کار',
+      accessibleAddress: 'آدرس عمومی',
+      preview: 'پیش‌نمایش',
+      regenerate: 'تولید مجدد',
+      regenerateNotice: 'آیا می‌خواهید آدرس عمومی را دوباره تولید کنید؟',
+      preUseReminder: 'لطفاً قبل از ادامه، WebApp را فعال کنید.',
+      settings: {
+        entry: 'تنظیمات',
+        title: 'تنظیمات WebApp',
+        webName: 'نام WebApp',
+        webDesc: 'توضیحات WebApp',
+        webDescTip: 'این متن در سمت مشتری نمایش داده می‌شود و راهنمایی‌های اولیه در مورد نحوه استفاده از برنامه را ارائه می‌دهد',
+        webDescPlaceholder: 'توضیحات WebApp را وارد کنید',
+        language: 'زبان',
+        workflow: {
+          title: 'مراحل کاری',
+          show: 'نمایش',
+          hide: 'مخفی کردن',
+        },
+        chatColorTheme: 'تم رنگی چت',
+        chatColorThemeDesc: 'تم رنگی چت‌بات را تنظیم کنید',
+        chatColorThemeInverted: 'معکوس',
+        invalidHexMessage: 'مقدار هگز نامعتبر',
+        more: {
+          entry: 'نمایش تنظیمات بیشتر',
+          copyright: 'حق نسخه‌برداری',
+          copyRightPlaceholder: 'نام نویسنده یا سازمان را وارد کنید',
+          privacyPolicy: 'سیاست حفظ حریم خصوصی',
+          privacyPolicyPlaceholder: 'لینک سیاست حفظ حریم خصوصی را وارد کنید',
+          privacyPolicyTip: 'به بازدیدکنندگان کمک می‌کند تا بفهمند برنامه چه داده‌هایی را جمع‌آوری می‌کند، به سیاست حفظ حریم خصوصی Dify نگاه کنید <privacyPolicyLink>Privacy Policy</privacyPolicyLink>.',
+          customDisclaimer: 'سلب مسئولیت سفارشی',
+          customDisclaimerPlaceholder: 'متن سلب مسئولیت سفارشی را وارد کنید',
+          customDisclaimerTip: 'متن سلب مسئولیت سفارشی در سمت مشتری نمایش داده می‌شود و اطلاعات بیشتری درباره برنامه ارائه می‌دهد',
+        },
+      },
+      embedded: {
+        entry: 'جاسازی شده',
+        title: 'جاسازی در وب‌سایت',
+        explanation: 'روش‌های جاسازی برنامه چت در وب‌سایت خود را انتخاب کنید',
+        iframe: 'برای افزودن برنامه چت در هرجای وب‌سایت خود، این iframe را به کد HTML خود اضافه کنید.',
+        scripts: 'برای افزودن برنامه چت به گوشه پایین سمت راست وب‌سایت خود، این کد را به HTML خود اضافه کنید.',
+        chromePlugin: 'نصب افزونه Chrome Chatbot Dify',
+        copied: 'کپی شد',
+        copy: 'کپی',
+      },
+      qrcode: {
+        title: 'کد QR لینک',
+        scan: 'اسکن برای اشتراک‌گذاری',
+        download: 'دانلود کد QR',
+      },
+      customize: {
+        way: 'راه',
+        entry: 'سفارشی‌سازی',
+        title: 'سفارشی‌سازی WebApp AI',
+        explanation: 'شما می‌توانید ظاهر جلویی برنامه وب را برای برآوردن نیازهای سناریو و سبک خود سفارشی کنید.',
+        way1: {
+          name: 'کلاینت را شاخه کنید، آن را تغییر دهید و در Vercel مستقر کنید (توصیه می‌شود)',
+          step1: 'کلاینت را شاخه کنید و آن را تغییر دهید',
+          step1Tip: 'برای شاخه کردن کد منبع به حساب GitHub خود و تغییر کد اینجا کلیک کنید',
+          step1Operation: 'Dify-WebClient',
+          step2: 'استقرار در Vercel',
+          step2Tip: 'برای وارد کردن مخزن به Vercel و استقرار اینجا کلیک کنید',
+          step2Operation: 'وارد کردن مخزن',
+          step3: 'پیکربندی متغیرهای محیطی',
+          step3Tip: 'متغیرهای محیطی زیر را در Vercel اضافه کنید',
+        },
+        way2: {
+          name: 'نوشتن کد سمت کلاینت برای فراخوانی API و استقرار آن بر روی سرور',
+          operation: 'مستندات',
+        },
+      },
+    },
+    apiInfo: {
+      title: 'API سرویس بک‌اند',
+      explanation: 'به راحتی در برنامه خود یکپارچه می‌شود',
+      accessibleAddress: 'نقطه پایانی سرویس API',
+      doc: 'مرجع API',
+    },
+    status: {
+      running: 'در حال سرویس‌دهی',
+      disable: 'غیرفعال',
+    },
+  },
+  analysis: {
+    title: 'تحلیل',
+    ms: 'میلی‌ثانیه',
+    tokenPS: 'توکن/ثانیه',
+    totalMessages: {
+      title: 'کل پیام‌ها',
+      explanation: 'تعداد تعاملات روزانه با AI؛ مهندسی/اشکال‌زدایی دستورات مستثنی هستند.',
+    },
+    activeUsers: {
+      title: 'کاربران فعال',
+      explanation: 'کاربران منحصر به فردی که در پرسش و پاسخ با AI شرکت می‌کنند؛ مهندسی/اشکال‌زدایی دستورات مستثنی هستند.',
+    },
+    tokenUsage: {
+      title: 'استفاده از توکن',
+      explanation: 'مصرف روزانه توکن‌های مدل زبان برای برنامه را نشان می‌دهد، که برای کنترل هزینه‌ها مفید است.',
+      consumed: 'مصرف‌شده',
+    },
+    avgSessionInteractions: {
+      title: 'میانگین تعاملات جلسه',
+      explanation: 'تعداد تعاملات پیوسته کاربر-AI؛ برای برنامه‌های مبتنی بر گفتگو.',
+    },
+    avgUserInteractions: {
+      title: 'میانگین تعاملات کاربران',
+      explanation: 'تکرار استفاده روزانه کاربران را نشان می‌دهد. این معیار چسبندگی کاربران را نشان می‌دهد.',
+    },
+    userSatisfactionRate: {
+      title: 'نرخ رضایت کاربران',
+      explanation: 'تعداد لایک‌ها به ازای هر ۱۰۰۰ پیام. این نشان‌دهنده نسبت پاسخ‌هایی است که کاربران به شدت رضایت دارند.',
+    },
+    avgResponseTime: {
+      title: 'میانگین زمان پاسخ',
+      explanation: 'زمان (میلی‌ثانیه) برای پردازش/پاسخ AI؛ برای برنامه‌های مبتنی بر متن.',
+    },
+    tps: {
+      title: 'سرعت خروجی توکن',
+      explanation: 'عملکرد مدل زبان بزرگ را اندازه‌گیری می‌کند. سرعت خروجی توکن‌های مدل زبان بزرگ از آغاز درخواست تا تکمیل خروجی را بشمارید.',
+    },
+  },
+}
+
+export default translation

+ 130 - 0
web/i18n/fa-IR/app.ts

@@ -0,0 +1,130 @@
+const translation = {
+  createApp: 'ایجاد برنامه',
+  types: {
+    all: 'همه',
+    chatbot: 'چت‌بات',
+    agent: 'نماینده',
+    workflow: 'گردش کار',
+    completion: 'تکمیل',
+  },
+  duplicate: 'تکرار',
+  duplicateTitle: 'تکرار برنامه',
+  export: 'صادر کردن DSL',
+  exportFailed: 'صادر کردن DSL ناموفق بود.',
+  importDSL: 'وارد کردن فایل DSL',
+  createFromConfigFile: 'ایجاد از فایل DSL',
+  importFromDSL: 'وارد کردن از DSL',
+  importFromDSLFile: 'از فایل DSL',
+  importFromDSLUrl: 'از URL',
+  importFromDSLUrlPlaceholder: 'لینک DSL را اینجا بچسبانید',
+  deleteAppConfirmTitle: 'آیا این برنامه حذف شود؟',
+  deleteAppConfirmContent:
+    'حذف برنامه غیرقابل برگشت است. کاربران دیگر قادر به دسترسی به برنامه شما نخواهند بود و تمام تنظیمات و گزارشات درخواست‌ها به صورت دائم حذف خواهند شد.',
+  appDeleted: 'برنامه حذف شد',
+  appDeleteFailed: 'حذف برنامه ناموفق بود',
+  join: 'پیوستن به جامعه',
+  communityIntro:
+    'در کانال‌های مختلف با اعضای تیم، مشارکت‌کنندگان و توسعه‌دهندگان بحث کنید.',
+  roadmap: 'نقشه راه ما را ببینید',
+  newApp: {
+    startFromBlank: 'ایجاد از خالی',
+    startFromTemplate: 'ایجاد از قالب',
+    captionAppType: 'چه نوع برنامه‌ای می‌خواهید ایجاد کنید؟',
+    chatbotDescription: 'ساخت برنامه‌ای مبتنی بر چت. این برنامه از قالب پرسش و پاسخ استفاده می‌کند و امکان چندین دور مکالمه مداوم را فراهم می‌کند.',
+    completionDescription: 'ساخت برنامه‌ای که متن با کیفیت بالا بر اساس درخواست‌ها تولید می‌کند، مانند تولید مقالات، خلاصه‌ها، ترجمه‌ها و بیشتر.',
+    completionWarning: 'این نوع برنامه دیگر پشتیبانی نمی‌شود.',
+    agentDescription: 'ساخت نماینده هوشمند که می‌تواند ابزارها را برای انجام وظایف به طور خودمختار انتخاب کند',
+    workflowDescription: 'ساخت برنامه‌ای که متن با کیفیت بالا بر اساس گردش کار با درجه بالای سفارشی‌سازی تولید می‌کند. مناسب برای کاربران با تجربه.',
+    workflowWarning: 'در حال حاضر در نسخه بتا',
+    chatbotType: 'روش سازماندهی چت‌بات',
+    basic: 'اساسی',
+    basicTip: 'برای مبتدیان، می‌توان بعداً به Chatflow تغییر داد',
+    basicFor: 'برای مبتدیان',
+    basicDescription: 'سازماندهی اساسی به شما اجازه می‌دهد تا یک برنامه چت‌بات را با تنظیمات ساده و بدون امکان تغییر درخواست‌های داخلی سازماندهی کنید. مناسب برای مبتدیان است.',
+    advanced: 'Chatflow',
+    advancedFor: 'برای کاربران پیشرفته',
+    advancedDescription: 'سازماندهی گردش کار، چت‌بات‌ها را به صورت گردش کار سازماندهی می‌کند و درجه بالایی از سفارشی‌سازی، از جمله امکان ویرایش درخواست‌های داخلی را فراهم می‌کند. مناسب برای کاربران با تجربه است.',
+    captionName: 'آیکون و نام برنامه',
+    appNamePlaceholder: 'به برنامه خود یک نام بدهید',
+    captionDescription: 'توضیحات',
+    appDescriptionPlaceholder: 'توضیحات برنامه را وارد کنید',
+    useTemplate: 'استفاده از این قالب',
+    previewDemo: 'پیش‌نمایش دمو',
+    chatApp: 'دستیار',
+    chatAppIntro:
+      'می‌خواهم یک برنامه مبتنی بر چت بسازم. این برنامه از قالب پرسش و پاسخ استفاده می‌کند و امکان چندین دور مکالمه مداوم را فراهم می‌کند.',
+    agentAssistant: 'دستیار نماینده جدید',
+    completeApp: 'تولید کننده متن',
+    completeAppIntro:
+      'می‌خواهم برنامه‌ای بسازم که متن با کیفیت بالا بر اساس درخواست‌ها تولید کند، مانند تولید مقالات، خلاصه‌ها، ترجمه‌ها و بیشتر.',
+    showTemplates: 'می‌خواهم از یک قالب انتخاب کنم',
+    hideTemplates: 'بازگشت به انتخاب حالت',
+    Create: 'ایجاد',
+    Cancel: 'لغو',
+    nameNotEmpty: 'نام نمی‌تواند خالی باشد',
+    appTemplateNotSelected: 'لطفاً یک قالب انتخاب کنید',
+    appTypeRequired: 'لطفاً نوع برنامه را انتخاب کنید',
+    appCreated: 'برنامه ایجاد شد',
+    appCreateFailed: 'ایجاد برنامه ناموفق بود',
+  },
+  editApp: 'ویرایش اطلاعات',
+  editAppTitle: 'ویرایش اطلاعات برنامه',
+  editDone: 'اطلاعات برنامه به‌روزرسانی شد',
+  editFailed: 'به‌روزرسانی اطلاعات برنامه ناموفق بود',
+  emoji: {
+    ok: 'باشه',
+    cancel: 'لغو',
+  },
+  switch: 'تغییر به سازماندهی گردش کار',
+  switchTipStart: 'یک نسخه جدید از برنامه برای شما ایجاد خواهد شد و نسخه جدید به سازماندهی گردش کار تغییر خواهد کرد. نسخه جدید ',
+  switchTip: 'اجازه نمی‌دهد',
+  switchTipEnd: ' تغییر به سازماندهی اساسی بازگردد.',
+  switchLabel: 'نسخه برنامه که ایجاد می‌شود',
+  removeOriginal: 'حذف برنامه اصلی',
+  switchStart: 'شروع تغییر',
+  typeSelector: {
+    all: 'همه انواع',
+    chatbot: 'چت‌بات',
+    agent: 'نماینده',
+    workflow: 'گردش کار',
+    completion: 'تکمیل',
+  },
+  tracing: {
+    title: 'ردیابی عملکرد برنامه',
+    description: 'پیکربندی ارائه‌دهنده شخص ثالث LLMOps و ردیابی عملکرد برنامه.',
+    config: 'پیکربندی',
+    collapse: 'بستن',
+    expand: 'باز کردن',
+    tracing: 'ردیابی',
+    disabled: 'غیرفعال',
+    disabledTip: 'لطفاً ابتدا ارائه‌دهنده را پیکربندی کنید',
+    enabled: 'در حال خدمت',
+    tracingDescription: 'ثبت کامل متن اجرای برنامه، از جمله تماس‌های LLM، متن، درخواست‌های HTTP و بیشتر، به یک پلتفرم ردیابی شخص ثالث.',
+    configProviderTitle: {
+      configured: 'پیکربندی شده',
+      notConfigured: 'برای فعال‌سازی ردیابی ارائه‌دهنده را پیکربندی کنید',
+      moreProvider: 'ارائه‌دهندگان بیشتر',
+    },
+    langsmith: {
+      title: 'LangSmith',
+      description: 'یک پلتفرم همه‌کاره برای هر مرحله از چرخه عمر برنامه‌های مبتنی بر LLM.',
+    },
+    langfuse: {
+      title: 'Langfuse',
+      description: 'ردیابی، ارزیابی، مدیریت درخواست‌ها و معیارها برای رفع اشکال و بهبود برنامه LLM شما.',
+    },
+    inUse: 'در حال استفاده',
+    configProvider: {
+      title: 'پیکربندی',
+      placeholder: 'کلید {{key}} خود را وارد کنید',
+      project: 'پروژه',
+      publicKey: 'کلید عمومی',
+      secretKey: 'کلید محرمانه',
+      viewDocsLink: 'مشاهده مستندات {{key}}',
+      removeConfirmTitle: 'حذف پیکربندی {{key}}؟',
+      removeConfirmContent: 'پیکربندی فعلی در حال استفاده است، حذف آن ویژگی ردیابی را غیرفعال خواهد کرد.',
+    },
+  },
+}
+
+export default translation

+ 118 - 0
web/i18n/fa-IR/billing.ts

@@ -0,0 +1,118 @@
+const translation = {
+  currentPlan: 'طرح فعلی',
+  upgradeBtn: {
+    plain: 'ارتقاء طرح',
+    encourage: 'هم اکنون ارتقاء دهید',
+    encourageShort: 'ارتقاء دهید',
+  },
+  viewBilling: 'مدیریت صورتحساب‌ها و اشتراک‌ها',
+  buyPermissionDeniedTip: 'لطفاً با مدیر سازمان خود تماس بگیرید تا اشتراک تهیه کنید',
+  plansCommon: {
+    title: 'یک طرح مناسب برای خود انتخاب کنید',
+    yearlyTip: 'با اشتراک سالانه 2 ماه رایگان دریافت کنید!',
+    mostPopular: 'محبوب‌ترین',
+    planRange: {
+      monthly: 'ماهانه',
+      yearly: 'سالانه',
+    },
+    month: 'ماه',
+    year: 'سال',
+    save: 'صرفه‌جویی کنید ',
+    free: 'رایگان',
+    currentPlan: 'طرح فعلی',
+    contractSales: 'تماس با فروش',
+    contractOwner: 'تماس با مدیر تیم',
+    startForFree: 'رایگان شروع کنید',
+    getStartedWith: 'شروع کنید با ',
+    contactSales: 'تماس با فروش',
+    talkToSales: 'صحبت با فروش',
+    modelProviders: 'ارائه‌دهندگان مدل',
+    teamMembers: 'اعضای تیم',
+    annotationQuota: 'سهمیه حاشیه‌نویسی',
+    buildApps: 'ساخت اپلیکیشن‌ها',
+    vectorSpace: 'فضای وکتور',
+    vectorSpaceBillingTooltip: 'هر 1 مگابایت می‌تواند حدود 1.2 میلیون کاراکتر از داده‌های وکتور شده را ذخیره کند (براساس تخمین با استفاده از OpenAI Embeddings، متفاوت بر اساس مدل‌ها).',
+    vectorSpaceTooltip: 'فضای وکتور سیستم حافظه بلند مدت است که برای درک داده‌های شما توسط LLM‌ها مورد نیاز است.',
+    documentsUploadQuota: 'سهمیه بارگذاری مستندات',
+    documentProcessingPriority: 'اولویت پردازش مستندات',
+    documentProcessingPriorityTip: 'برای اولویت پردازش بالاتر مستندات، لطفاً طرح خود را ارتقاء دهید.',
+    documentProcessingPriorityUpgrade: 'داده‌های بیشتری را با دقت بالاتر و سرعت بیشتر پردازش کنید.',
+    priority: {
+      'standard': 'استاندارد',
+      'priority': 'اولویت',
+      'top-priority': 'اولویت بالا',
+    },
+    logsHistory: 'تاریخچه گزارشات',
+    customTools: 'ابزارهای سفارشی',
+    unavailable: 'غیرقابل دسترس',
+    days: 'روز',
+    unlimited: 'نامحدود',
+    support: 'پشتیبانی',
+    supportItems: {
+      communityForums: 'انجمن‌های اجتماعی',
+      emailSupport: 'پشتیبانی ایمیل',
+      priorityEmail: 'پشتیبانی ایمیل و چت با اولویت',
+      logoChange: 'تغییر لوگو',
+      SSOAuthentication: 'تأیید هویت SSO',
+      personalizedSupport: 'پشتیبانی شخصی‌سازی شده',
+      dedicatedAPISupport: 'پشتیبانی API اختصاصی',
+      customIntegration: 'یکپارچه‌سازی و پشتیبانی سفارشی',
+      ragAPIRequest: 'درخواست‌های API RAG',
+      bulkUpload: 'بارگذاری دسته‌ای مستندات',
+      agentMode: 'حالت Agent',
+      workflow: 'جریان کار',
+      llmLoadingBalancing: 'توزیع بار LLM',
+      llmLoadingBalancingTooltip: 'اضافه کردن چندین کلید API به مدل‌ها، به طور مؤثر از محدودیت‌های نرخ API عبور می‌کند.',
+    },
+    comingSoon: 'به زودی',
+    member: 'عضو',
+    memberAfter: 'عضو',
+    messageRequest: {
+      title: 'اعتبارات پیام',
+      tooltip: 'سهمیه‌های فراخوانی پیام برای طرح‌های مختلف با استفاده از مدل‌های OpenAI (به جز gpt4). پیام‌های بیش از حد محدودیت از کلید API OpenAI شما استفاده می‌کنند.',
+    },
+    annotatedResponse: {
+      title: 'محدودیت‌های سهمیه حاشیه‌نویسی',
+      tooltip: 'ویرایش دستی و حاشیه‌نویسی پاسخ‌ها، قابلیت‌های پرسش و پاسخ با کیفیت بالا و قابل تنظیم برای اپلیکیشن‌ها را فراهم می‌کند. (فقط در اپلیکیشن‌های چت اعمال می‌شود)',
+    },
+    ragAPIRequestTooltip: 'به تعداد درخواست‌های API که فقط قابلیت‌های پردازش پایگاه دانش Dify را فراخوانی می‌کنند اشاره دارد.',
+    receiptInfo: 'فقط صاحب تیم و مدیر تیم می‌توانند اشتراک تهیه کنند و اطلاعات صورتحساب را مشاهده کنند',
+  },
+  plans: {
+    sandbox: {
+      name: 'محیط آزمایشی',
+      description: '200 بار آزمایش رایگان GPT',
+      includesTitle: 'شامل:',
+    },
+    professional: {
+      name: 'حرفه‌ای',
+      description: 'برای افراد و تیم‌های کوچک برای باز کردن قدرت بیشتر به طور مقرون به صرفه.',
+      includesTitle: 'همه چیز در طرح رایگان، به علاوه:',
+    },
+    team: {
+      name: 'تیم',
+      description: 'همکاری بدون محدودیت و لذت بردن از عملکرد برتر.',
+      includesTitle: 'همه چیز در طرح حرفه‌ای، به علاوه:',
+    },
+    enterprise: {
+      name: 'سازمانی',
+      description: 'دریافت کامل‌ترین قابلیت‌ها و پشتیبانی برای سیستم‌های بزرگ و بحرانی.',
+      includesTitle: 'همه چیز در طرح تیم، به علاوه:',
+    },
+  },
+  vectorSpace: {
+    fullTip: 'فضای وکتور پر است.',
+    fullSolution: 'طرح خود را ارتقاء دهید تا فضای بیشتری دریافت کنید.',
+  },
+  apps: {
+    fullTipLine1: 'طرح خود را ارتقاء دهید تا',
+    fullTipLine2: 'اپلیکیشن‌های بیشتری بسازید.',
+  },
+  annotatedResponse: {
+    fullTipLine1: 'طرح خود را ارتقاء دهید تا',
+    fullTipLine2: 'مکالمات بیشتری را حاشیه‌نویسی کنید.',
+    quotaTitle: 'سهمیه پاسخ حاشیه‌نویسی',
+  },
+}
+
+export default translation

+ 572 - 0
web/i18n/fa-IR/common.ts

@@ -0,0 +1,572 @@
+const translation = {
+  api: {
+    success: 'موفقیت',
+    actionSuccess: 'عملیات موفق',
+    saved: 'ذخیره شد',
+    create: 'ایجاد شد',
+    remove: 'حذف شد',
+  },
+  operation: {
+    create: 'ایجاد',
+    confirm: 'تایید',
+    cancel: 'لغو',
+    clear: 'پاک کردن',
+    save: 'ذخیره',
+    saveAndEnable: 'ذخیره و فعال سازی',
+    edit: 'ویرایش',
+    add: 'افزودن',
+    added: 'اضافه شد',
+    refresh: 'شروع مجدد',
+    reset: 'بازنشانی',
+    search: 'جستجو',
+    change: 'تغییر',
+    remove: 'حذف',
+    send: 'ارسال',
+    copy: 'کپی',
+    lineBreak: 'خط جدید',
+    sure: 'مطمئن هستم',
+    download: 'دانلود',
+    delete: 'حذف',
+    settings: 'تنظیمات',
+    setup: 'راه اندازی',
+    getForFree: 'دریافت رایگان',
+    reload: 'بارگذاری مجدد',
+    ok: 'تایید',
+    log: 'گزارش',
+    learnMore: 'اطلاعات بیشتر',
+    params: 'پارامترها',
+    duplicate: 'تکرار',
+    rename: 'تغییر نام',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} الزامی است',
+    urlError: 'آدرس باید با http:// یا https:// شروع شود',
+  },
+  placeholder: {
+    input: 'لطفا وارد کنید',
+    select: 'لطفا انتخاب کنید',
+  },
+  voice: {
+    language: {
+      zhHans: 'چینی',
+      zhHant: 'چینی سنتی',
+      enUS: 'انگلیسی',
+      deDE: 'آلمانی',
+      frFR: 'فرانسوی',
+      esES: 'اسپانیایی',
+      itIT: 'ایتالیایی',
+      thTH: 'تایلندی',
+      idID: 'اندونزیایی',
+      jaJP: 'ژاپنی',
+      koKR: 'کره‌ای',
+      ptBR: 'پرتغالی',
+      ruRU: 'روسی',
+      ukUA: 'اوکراینی',
+      viVN: 'ویتنامی',
+      plPL: 'لهستانی',
+    },
+  },
+  unit: {
+    char: 'کاراکتر',
+  },
+  actionMsg: {
+    noModification: 'در حال حاضر تغییری وجود ندارد.',
+    modifiedSuccessfully: 'با موفقیت تغییر یافت',
+    modifiedUnsuccessfully: 'تغییر ناموفق بود',
+    copySuccessfully: 'با موفقیت کپی شد',
+    paySucceeded: 'پرداخت موفق',
+    payCancelled: 'پرداخت لغو شد',
+    generatedSuccessfully: 'با موفقیت تولید شد',
+    generatedUnsuccessfully: 'تولید ناموفق بود',
+  },
+  model: {
+    params: {
+      temperature: 'دما',
+      temperatureTip:
+        'تصادفی بودن را کنترل می‌کند: کاهش آن منجر به تکمیل‌های کمتر تصادفی می‌شود. با نزدیک شدن دما به صفر، مدل قطعی و تکراری می‌شود.',
+      top_p: 'بالاترین P',
+      top_pTip:
+        'تنوع را از طریق نمونه‌گیری هسته کنترل می‌کند: 0.5 به این معنی است که نیمی از همه گزینه‌های وزن‌دار احتمالی در نظر گرفته می‌شوند.',
+      presence_penalty: 'جریمه حضور',
+      presence_penaltyTip:
+        'چقدر توکن‌های جدید را بر اساس اینکه آیا در متن تاکنون ظاهر شده‌اند جریمه کنیم.\nاحتمال مدل برای صحبت در مورد موضوعات جدید را افزایش می‌دهد.',
+      frequency_penalty: 'جریمه تکرار',
+      frequency_penaltyTip:
+        'چقدر توکن‌های جدید را بر اساس فراوانی موجود آنها در متن تاکنون جریمه کنیم.\nاحتمال تکرار دقیق همان خط توسط مدل را کاهش می‌دهد.',
+      max_tokens: 'حداکثر توکن',
+      max_tokensTip:
+        'برای محدود کردن حداکثر طول پاسخ، در توکن‌ها استفاده می‌شود. \nمقادیر بزرگتر ممکن است فضای باقیمانده برای کلمات راهنما، گزارش‌های چت و دانش را محدود کند. \nتوصیه می‌شود آن را کمتر از دو سوم تنظیم کنید\ngpt-4-1106-preview، gpt-4-vision-preview حداکثر توکن (ورودی 128k خروجی 4k)',
+      maxTokenSettingTip: 'تنظیم حداکثر توکن شما بالاست، که ممکن است فضا را برای راهنماها، پرس و جوها و داده‌ها محدود کند. در نظر بگیرید آن را زیر 2/3 تنظیم کنید.',
+      setToCurrentModelMaxTokenTip: 'حداکثر توکن به 80٪ حداکثر توکن مدل فعلی {{maxToken}} به‌روزرسانی شد.',
+      stop_sequences: 'توالی‌های توقف',
+      stop_sequencesTip: 'حداکثر چهار توالی که API تولید توکن‌های بیشتر را متوقف می‌کند. متن برگردانده شده شامل توالی توقف نخواهد بود.',
+      stop_sequencesPlaceholder: 'توالی را وارد کنید و Tab را فشار دهید',
+    },
+    tone: {
+      Creative: 'خلاقانه',
+      Balanced: 'متعادل',
+      Precise: 'دقیق',
+      Custom: 'سفارشی',
+    },
+    addMoreModel: 'برای افزودن مدل‌های بیشتر به تنظیمات بروید',
+  },
+  menus: {
+    status: 'بتا',
+    explore: 'کاوش',
+    apps: 'استودیو',
+    plugins: 'افزونه‌ها',
+    pluginsTips: 'افزونه‌های شخص ثالث را ادغام کنید یا افزونه‌های هوش مصنوعی سازگار با ChatGPT ایجاد کنید.',
+    datasets: 'دانش',
+    datasetsTips: 'به زودی: داده‌های متنی خود را وارد کنید یا از طریق Webhook داده‌ها را در زمان واقعی برای بهبود زمینه LLM بنویسید.',
+    newApp: 'برنامه جدید',
+    newDataset: 'ایجاد دانش',
+    tools: 'ابزارها',
+  },
+  userProfile: {
+    settings: 'تنظیمات',
+    emailSupport: 'پشتیبانی ایمیل',
+    workspace: 'فضای کاری',
+    createWorkspace: 'ایجاد فضای کاری',
+    helpCenter: 'راهنما',
+    roadmapAndFeedback: 'بازخورد',
+    community: 'انجمن',
+    about: 'درباره',
+    logout: 'خروج',
+  },
+  settings: {
+    accountGroup: 'حساب کاربری',
+    workplaceGroup: 'فضای کاری',
+    account: 'حساب من',
+    members: 'اعضا',
+    billing: 'صورتحساب',
+    integrations: 'ادغام‌ها',
+    language: 'زبان',
+    provider: 'ارائه دهنده مدل',
+    dataSource: 'منبع داده',
+    plugin: 'افزونه‌ها',
+    apiBasedExtension: 'توسعه مبتنی بر API',
+  },
+  account: {
+    avatar: 'آواتار',
+    name: 'نام',
+    email: 'ایمیل',
+    password: 'رمز عبور',
+    passwordTip: 'اگر نمی‌خواهید از کدهای ورود موقت استفاده کنید، می‌توانید یک رمز عبور دائمی تنظیم کنید',
+    setPassword: 'تنظیم رمز عبور',
+    resetPassword: 'بازنشانی رمز عبور',
+    currentPassword: 'رمز عبور فعلی',
+    newPassword: 'رمز عبور جدید',
+    confirmPassword: 'تأیید رمز عبور',
+    notEqual: 'دو رمز عبور متفاوت هستند.',
+    langGeniusAccount: 'حساب Dify',
+    langGeniusAccountTip: 'حساب Dify شما و داده‌های کاربری مرتبط.',
+    editName: 'ویرایش نام',
+    showAppLength: 'نمایش {{length}} برنامه',
+    delete: 'حذف حساب کاربری',
+    deleteTip: 'حذف حساب کاربری شما تمام داده‌های شما را به طور دائمی پاک می‌کند و قابل بازیابی نیست.',
+    deleteConfirmTip: 'برای تأیید، لطفاً موارد زیر را از ایمیل ثبت‌نام شده خود به این آدرس ارسال کنید ',
+  },
+  members: {
+    team: 'تیم',
+    invite: 'افزودن',
+    name: 'نام',
+    lastActive: 'آخرین فعالیت',
+    role: 'نقش‌ها',
+    pending: 'در انتظار...',
+    owner: 'مالک',
+    admin: 'مدیر',
+    adminTip: 'می‌تواند برنامه‌ها را بسازد و تنظیمات تیم را مدیریت کند',
+    normal: 'عادی',
+    normalTip: 'فقط می‌تواند از برنامه‌ها استفاده کند، نمی‌تواند برنامه بسازد',
+    builder: 'سازنده',
+    builderTip: 'می‌تواند برنامه‌های خود را بسازد و ویرایش کند',
+    editor: 'ویرایشگر',
+    editorTip: 'می‌تواند برنامه‌ها را بسازد و ویرایش کند',
+    datasetOperator: 'مدیر دانش',
+    datasetOperatorTip: 'فقط می‌تواند پایگاه دانش را مدیریت کند',
+    inviteTeamMember: 'افزودن عضو تیم',
+    inviteTeamMemberTip: 'آنها می‌توانند پس از ورود به سیستم، مستقیماً به داده‌های تیم شما دسترسی پیدا کنند.',
+    email: 'ایمیل',
+    emailInvalid: 'فرمت ایمیل نامعتبر است',
+    emailPlaceholder: 'لطفاً ایمیل‌ها را وارد کنید',
+    sendInvite: 'ارسال دعوت',
+    invitedAsRole: 'به عنوان کاربر {{role}} دعوت شده',
+    invitationSent: 'دعوت‌نامه ارسال شد',
+    invitationSentTip: 'دعوت‌نامه ارسال شد و آنها می‌توانند وارد Dify شوند تا به داده‌های تیم شما دسترسی پیدا کنند.',
+    invitationLink: 'لینک دعوت',
+    failedinvitationEmails: 'کاربران زیر با موفقیت دعوت نشدند',
+    ok: 'تایید',
+    removeFromTeam: 'حذف از تیم',
+    removeFromTeamTip: 'دسترسی تیم را حذف می‌کند',
+    setAdmin: 'تنظیم به عنوان مدیر',
+    setMember: 'تنظیم به عنوان عضو عادی',
+    setBuilder: 'تنظیم به عنوان سازنده',
+    setEditor: 'تنظیم به عنوان ویرایشگر',
+    disinvite: 'لغو دعوت',
+    deleteMember: 'حذف عضو',
+    you: '(شما)',
+  },
+  integrations: {
+    connected: 'متصل شده',
+    google: 'گوگل',
+    googleAccount: 'ورود با حساب گوگل',
+    github: 'گیت‌هاب',
+    githubAccount: 'ورود با حساب گیت‌هاب',
+    connect: 'اتصال',
+  },
+  language: {
+    displayLanguage: 'زبان نمایش',
+    timezone: 'منطقه زمانی',
+  },
+  provider: {
+    apiKey: 'کلید API',
+    enterYourKey: 'کلید API خود را اینجا وارد کنید',
+    invalidKey: 'کلید API OpenAI نامعتبر است',
+    validatedError: 'اعتبارسنجی ناموفق بود: ',
+    validating: 'در حال اعتبارسنجی کلید...',
+    saveFailed: 'ذخیره کلید API ناموفق بود',
+    apiKeyExceedBill: 'این کلید API سهمیه موجود ندارد، لطفاً بخوانید',
+    addKey: 'افزودن کلید',
+    comingSoon: 'به زودی',
+    editKey: 'ویرایش',
+    invalidApiKey: 'کلید API نامعتبر',
+    azure: {
+      apiBase: 'پایه API',
+      apiBasePlaceholder: 'آدرس پایه API نقطه پایانی Azure OpenAI شما.',
+      apiKey: 'کلید API',
+      apiKeyPlaceholder: 'کلید API خود را اینجا وارد کنید',
+      helpTip: 'آشنایی با سرویس Azure OpenAI',
+    },
+    openaiHosted: {
+      openaiHosted: 'OpenAI میزبانی شده',
+      onTrial: 'در حال آزمایش',
+      exhausted: 'سهمیه تمام شده',
+      desc: 'سرویس میزبانی OpenAI ارائه شده توسط Dify به شما اجازه می‌دهد از مدل‌هایی مانند GPT-3.5 استفاده کنید. قبل از اتمام سهمیه آزمایشی خود، باید سایر ارائه‌دهندگان مدل را تنظیم کنید.',
+      callTimes: 'تعداد فراخوانی',
+      usedUp: 'سهمیه آزمایشی تمام شده است. ارائه‌دهنده مدل خود را اضافه کنید.',
+      useYourModel: 'در حال حاضر از ارائه‌دهنده مدل خود استفاده می‌کنید.',
+      close: 'بستن',
+    },
+    anthropicHosted: {
+      anthropicHosted: 'Anthropic Claude',
+      onTrial: 'در حال آزمایش',
+      exhausted: 'سهمیه تمام شده',
+      desc: 'مدل قدرتمند که در طیف گسترده‌ای از وظایف از گفتگوی پیشرفته و تولید محتوای خلاقانه تا دستورالعمل‌های دقیق عالی عمل می‌کند.',
+      callTimes: 'تعداد فراخوانی',
+      usedUp: 'سهمیه آزمایشی تمام شده است. ارائه‌دهنده مدل خود را اضافه کنید.',
+      useYourModel: 'در حال حاضر از ارائه‌دهنده مدل خود استفاده می‌کنید.',
+      close: 'بستن',
+    },
+    anthropic: {
+      using: 'قابلیت تعبیه از این استفاده می‌کند',
+      enableTip: 'برای فعال‌سازی مدل Anthropic، ابتدا باید به OpenAI یا سرویس Azure OpenAI متصل شوید.',
+      notEnabled: 'فعال نشده',
+      keyFrom: 'کلید API خود را از Anthropic دریافت کنید',
+    },
+    encrypted: {
+      front: 'کلید API شما با استفاده از فناوری',
+      back: ' رمزگذاری و ذخیره خواهد شد.',
+    },
+  },
+  modelProvider: {
+    notConfigured: 'مدل سیستم هنوز به طور کامل پیکربندی نشده است و برخی از عملکردها ممکن است در دسترس نباشند.',
+    systemModelSettings: 'تنظیمات مدل سیستم',
+    systemModelSettingsLink: 'چرا تنظیم مدل سیستم ضروری است؟',
+    selectModel: 'مدل خود را انتخاب کنید',
+    setupModelFirst: 'لطفاً ابتدا مدل خود را تنظیم کنید',
+    systemReasoningModel: {
+      key: 'مدل استدلال سیستم',
+      tip: 'مدل استنتاج پیش‌فرض را برای ایجاد برنامه‌ها تنظیم کنید. ویژگی‌هایی مانند تولید نام گفتگو و پیشنهاد سوال بعدی نیز از مدل استنتاج پیش‌فرض استفاده خواهند کرد.',
+    },
+    embeddingModel: {
+      key: 'مدل تعبیه',
+      tip: 'مدل پیش‌فرض را برای پردازش تعبیه اسناد دانش تنظیم کنید. هر دو بازیابی و وارد کردن دانش از این مدل تعبیه برای پردازش برداری استفاده می‌کنند. تغییر باعث ناسازگاری بُعد برداری بین دانش وارد شده و سوال می‌شود که منجر به شکست بازیابی می‌شود. برای جلوگیری از شکست بازیابی، لطفاً این مدل را به دلخواه تغییر ندهید.',
+      required: 'مدل تعبیه الزامی است',
+    },
+    speechToTextModel: {
+      key: 'مدل تبدیل گفتار به متن',
+      tip: 'مدل پیش‌فرض را برای ورودی گفتار به متن در مکالمه تنظیم کنید.',
+    },
+    ttsModel: {
+      key: 'مدل تبدیل متن به گفتار',
+      tip: 'مدل پیش‌فرض را برای ورودی متن به گفتار در مکالمه تنظیم کنید.',
+    },
+    rerankModel: {
+      key: 'مدل رتبه‌بندی مجدد',
+      tip: 'مدل رتبه‌بندی مجدد، لیست اسناد کاندید را بر اساس تطابق معنایی با پرسش کاربر مرتب می‌کند و نتایج رتبه‌بندی معنایی را بهبود می‌بخشد',
+    },
+    apiKey: 'کلید API',
+    quota: 'سهمیه',
+    searchModel: 'جستجوی مدل',
+    noModelFound: 'هیچ مدلی برای {{model}} یافت نشد',
+    models: 'مدل‌ها',
+    showMoreModelProvider: 'نمایش ارائه‌دهندگان مدل بیشتر',
+    selector: {
+      tip: 'این مدل حذف شده است. لطفاً یک مدل اضافه کنید یا مدل دیگری را انتخاب کنید.',
+      emptyTip: 'هیچ مدل موجودی وجود ندارد',
+      emptySetting: 'لطفاً به تنظیمات بروید تا پیکربندی کنید',
+      rerankTip: 'لطفاً مدل رتبه‌بندی مجدد را تنظیم کنید',
+    },
+    card: {
+      quota: 'سهمیه',
+      onTrial: 'در حال آزمایش',
+      paid: 'پرداخت شده',
+      quotaExhausted: 'سهمیه تمام شده',
+      callTimes: 'تعداد فراخوانی',
+      tokens: 'توکن‌ها',
+      buyQuota: 'خرید سهمیه',
+      priorityUse: 'استفاده با اولویت',
+      removeKey: 'حذف کلید API',
+      tip: 'اولویت به سهمیه پرداخت شده داده می‌شود. سهمیه آزمایشی پس از اتمام سهمیه پرداخت شده استفاده خواهد شد.',
+    },
+    item: {
+      deleteDesc: '{{modelName}} به عنوان مدل‌های استدلال سیستم استفاده می‌شوند. برخی از عملکردها پس از حذف در دسترس نخواهند بود. لطفاً تأیید کنید.',
+      freeQuota: 'سهمیه رایگان',
+    },
+    addApiKey: 'کلید API خود را اضافه کنید',
+    invalidApiKey: 'کلید API نامعتبر',
+    encrypted: {
+      front: 'کلید API شما با استفاده از فناوری',
+      back: ' رمزگذاری و ذخیره خواهد شد.',
+    },
+    freeQuota: {
+      howToEarn: 'چگونه کسب کنیم',
+    },
+    addMoreModelProvider: 'افزودن ارائه‌دهنده مدل بیشتر',
+    addModel: 'افزودن مدل',
+    modelsNum: '{{num}} مدل',
+    showModels: 'نمایش مدل‌ها',
+    showModelsNum: 'نمایش {{num}} مدل',
+    collapse: 'جمع کردن',
+    config: 'پیکربندی',
+    modelAndParameters: 'مدل و پارامترها',
+    model: 'مدل',
+    featureSupported: '{{feature}} پشتیبانی می‌شود',
+    callTimes: 'تعداد فراخوانی',
+    credits: 'اعتبار پیام',
+    buyQuota: 'خرید سهمیه',
+    getFreeTokens: 'دریافت توکن‌های رایگان',
+    priorityUsing: 'استفاده با اولویت',
+    deprecated: 'منسوخ شده',
+    confirmDelete: 'تأیید حذف؟',
+    quotaTip: 'توکن‌های رایگان باقی‌مانده در دسترس',
+    loadPresets: 'بارگیری تنظیمات از پیش تعیین شده',
+    parameters: 'پارامترها',
+    loadBalancing: 'تعادل بار',
+    loadBalancingDescription: 'کاهش فشار با چندین مجموعه اعتبارنامه.',
+    loadBalancingHeadline: 'تعادل بار',
+    configLoadBalancing: 'پیکربندی تعادل بار',
+    modelHasBeenDeprecated: 'این مدل منسوخ شده است',
+    providerManaged: 'مدیریت شده توسط ارائه‌دهنده',
+    providerManagedDescription: 'استفاده از مجموعه واحد اعتبارنامه ارائه شده توسط ارائه‌دهنده مدل.',
+    defaultConfig: 'پیکربندی پیش‌فرض',
+    apiKeyStatusNormal: 'وضعیت کلید API عادی است',
+    apiKeyRateLimit: 'محدودیت نرخ به دست آمد، پس از {{seconds}} ثانیه در دسترس خواهد بود',
+    addConfig: 'افزودن پیکربندی',
+    editConfig: 'ویرایش پیکربندی',
+    loadBalancingLeastKeyWarning: 'برای فعال کردن تعادل بار، حداقل 2 کلید باید فعال باشند.',
+    loadBalancingInfo: 'به طور پیش‌فرض، تعادل بار از استراتژی Round-robin استفاده می‌کند. اگر محدودیت نرخ فعال شود، یک دوره خنک شدن 1 دقیقه‌ای اعمال خواهد شد.',
+    upgradeForLoadBalancing: 'برای فعال کردن تعادل بار، طرح خود را ارتقا دهید.',
+  },
+  dataSource: {
+    add: 'افزودن منبع داده',
+    connect: 'اتصال',
+    configure: 'پیکربندی',
+    notion: {
+      title: 'نوشن',
+      description: 'استفاده از نوشن به عنوان منبع داده برای دانش.',
+      connectedWorkspace: 'فضای کاری متصل',
+      addWorkspace: 'افزودن فضای کاری',
+      connected: 'متصل شده',
+      disconnected: 'قطع شده',
+      changeAuthorizedPages: 'تغییر صفحات مجاز',
+      pagesAuthorized: 'صفحات مجاز',
+      sync: 'همگام‌سازی',
+      remove: 'حذف',
+      selector: {
+        pageSelected: 'صفحات انتخاب شده',
+        searchPages: 'جستجوی صفحات...',
+        noSearchResult: 'نتیجه جستجویی یافت نشد',
+        addPages: 'افزودن صفحات',
+        preview: 'پیش‌نمایش',
+      },
+    },
+    website: {
+      title: 'وب‌سایت',
+      description: 'وارد کردن محتوا از وب‌سایت‌ها با استفاده از خزنده وب.',
+      with: 'با',
+      configuredCrawlers: 'خزنده‌های پیکربندی شده',
+      active: 'فعال',
+      inactive: 'غیرفعال',
+    },
+  },
+  plugin: {
+    serpapi: {
+      apiKey: 'کلید API',
+      apiKeyPlaceholder: 'کلید API خود را وارد کنید',
+      keyFrom: 'کلید SerpAPI خود را از صفحه حساب SerpAPI دریافت کنید',
+    },
+  },
+  apiBasedExtension: {
+    title: 'افزونه‌های مبتنی بر API مدیریت متمرکز API را فراهم می‌کنند و پیکربندی را برای استفاده آسان در برنامه‌های Dify ساده می‌کنند.',
+    link: 'نحوه توسعه افزونه API خود را بیاموزید.',
+    linkUrl: 'https://docs.dify.ai/features/extension/api_based_extension',
+    add: 'افزودن افزونه API',
+    selector: {
+      title: 'افزونه API',
+      placeholder: 'لطفاً افزونه API را انتخاب کنید',
+      manage: 'مدیریت افزونه API',
+    },
+    modal: {
+      title: 'افزودن افزونه API',
+      editTitle: 'ویرایش افزونه API',
+      name: {
+        title: 'نام',
+        placeholder: 'لطفاً نام را وارد کنید',
+      },
+      apiEndpoint: {
+        title: 'نقطه پایانی API',
+        placeholder: 'لطفاً نقطه پایانی API را وارد کنید',
+      },
+      apiKey: {
+        title: 'کلید API',
+        placeholder: 'لطفاً کلید API را وارد کنید',
+        lengthError: 'طول کلید API نمی‌تواند کمتر از ۵ کاراکتر باشد',
+      },
+    },
+    type: 'نوع',
+  },
+  about: {
+    changeLog: 'تغییرات',
+    updateNow: 'به‌روزرسانی اکنون',
+    nowAvailable: 'Dify {{version}} اکنون در دسترس است.',
+    latestAvailable: 'Dify {{version}} آخرین نسخه در دسترس است.',
+  },
+  appMenus: {
+    overview: 'نظارت',
+    promptEng: 'هماهنگ‌سازی',
+    apiAccess: 'دسترسی API',
+    logAndAnn: 'گزارش‌ها و اعلانات',
+    logs: 'گزارش‌ها',
+  },
+  environment: {
+    testing: 'آزمایشی',
+    development: 'توسعه',
+  },
+  appModes: {
+    completionApp: 'تولیدکننده متن',
+    chatApp: 'برنامه چت',
+  },
+  datasetMenus: {
+    documents: 'اسناد',
+    hitTesting: 'آزمایش بازیابی',
+    settings: 'تنظیمات',
+    emptyTip: 'دانش مرتبط نشده است، لطفاً به برنامه یا افزونه بروید تا ارتباط را کامل کنید.',
+    viewDoc: 'مشاهده مستندات',
+    relatedApp: 'برنامه‌های مرتبط',
+  },
+  voiceInput: {
+    speaking: 'اکنون صحبت کنید...',
+    converting: 'در حال تبدیل به متن...',
+    notAllow: 'میکروفون مجاز نیست',
+  },
+  modelName: {
+    'gpt-3.5-turbo': 'جی‌پی‌تی-۳.۵-توربو',
+    'gpt-3.5-turbo-16k': 'جی‌پی‌تی-۳.۵-توربو-۱۶کا',
+    'gpt-4': 'جی‌پی‌تی-۴',
+    'gpt-4-32k': 'جی‌پی‌تی-۴-۳۲کا',
+    'text-davinci-003': 'متن-داوینچی-۰۰۳',
+    'text-embedding-ada-002': 'متن-تعبیه-آدا-۰۰۲',
+    'whisper-1': 'ویسپر-۱',
+    'claude-instant-1': 'کلاود-فوری',
+    'claude-2': 'کلاود-۲',
+  },
+  chat: {
+    renameConversation: 'تغییر نام مکالمه',
+    conversationName: 'نام مکالمه',
+    conversationNamePlaceholder: 'لطفاً نام مکالمه را وارد کنید',
+    conversationNameCanNotEmpty: 'نام مکالمه الزامی است',
+    citation: {
+      title: 'استنادها',
+      linkToDataset: 'پیوند به دانش',
+      characters: 'کاراکترها:',
+      hitCount: 'تعداد بازیابی:',
+      vectorHash: 'هش بردار:',
+      hitScore: 'امتیاز بازیابی:',
+    },
+  },
+  promptEditor: {
+    placeholder: 'دستور خود را اینجا بنویسید، «{» را وارد کنید تا یک متغیر درج کنید، «/» را وارد کنید تا یک بلوک محتوای دستور درج کنید',
+    context: {
+      item: {
+        title: 'زمینه',
+        desc: 'درج الگوی زمینه',
+      },
+      modal: {
+        title: '{{num}} دانش در زمینه',
+        add: 'افزودن زمینه',
+        footer: 'شما می‌توانید زمینه‌ها را در بخش زمینه در زیر مدیریت کنید.',
+      },
+    },
+    history: {
+      item: {
+        title: 'تاریخچه مکالمه',
+        desc: 'درج الگوی پیام تاریخی',
+      },
+      modal: {
+        title: 'مثال',
+        user: 'سلام',
+        assistant: 'سلام! چطور می‌توانم امروز به شما کمک کنم؟',
+        edit: 'ویرایش نام‌های نقش مکالمه',
+      },
+    },
+    variable: {
+      item: {
+        title: 'متغیرها و ابزارهای خارجی',
+        desc: 'درج متغیرها و ابزارهای خارجی',
+      },
+      outputToolDisabledItem: {
+        title: 'متغیرها',
+        desc: 'درج متغیرها',
+      },
+      modal: {
+        add: 'متغیر جدید',
+        addTool: 'ابزار جدید',
+      },
+    },
+    query: {
+      item: {
+        title: 'پرس‌وجو',
+        desc: 'درج الگوی پرس‌وجوی کاربر',
+      },
+    },
+    existed: 'در حال حاضر در دستور وجود دارد',
+  },
+  imageUploader: {
+    uploadFromComputer: 'بارگذاری از کامپیوتر',
+    uploadFromComputerReadError: 'خواندن تصویر ناموفق بود، لطفاً دوباره تلاش کنید.',
+    uploadFromComputerUploadError: 'بارگذاری تصویر ناموفق بود، لطفاً دوباره بارگذاری کنید.',
+    uploadFromComputerLimit: 'بارگذاری تصاویر نمی‌تواند از {{size}} مگابایت بیشتر باشد',
+    pasteImageLink: 'پیوند تصویر را بچسبانید',
+    pasteImageLinkInputPlaceholder: 'پیوند تصویر را اینجا بچسبانید',
+    pasteImageLinkInvalid: 'پیوند تصویر نامعتبر',
+    imageUpload: 'بارگذاری تصویر',
+  },
+  tag: {
+    placeholder: 'همه برچسب‌ها',
+    addNew: 'افزودن برچسب جدید',
+    noTag: 'بدون برچسب',
+    noTagYet: 'هنوز برچسبی وجود ندارد',
+    addTag: 'افزودن برچسب‌ها',
+    editTag: 'ویرایش برچسب‌ها',
+    manageTags: 'مدیریت برچسب‌ها',
+    selectorPlaceholder: 'برای جستجو یا ایجاد تایپ کنید',
+    create: 'ایجاد',
+    delete: 'حذف برچسب',
+    deleteTip: 'برچسب در حال استفاده است، آیا آن را حذف می‌کنید؟',
+    created: 'برچسب با موفقیت ایجاد شد',
+    failed: 'ایجاد برچسب ناموفق بود',
+  },
+}
+
+export default translation

+ 30 - 0
web/i18n/fa-IR/custom.ts

@@ -0,0 +1,30 @@
+const translation = {
+  custom: 'سفارشی سازی',
+  upgradeTip: {
+    prefix: 'طرح خود را ارتقا دهید به',
+    suffix: 'تا برند خود را سفارشی کنید.',
+  },
+  webapp: {
+    title: 'سفارشی سازی برند وب اپ',
+    removeBrand: 'حذف "Powered by Dify"',
+    changeLogo: 'تغییر تصویر برند "Powered by"',
+    changeLogoTip: 'فرمت SVG یا PNG با حداقل اندازه 40x40px',
+  },
+  app: {
+    title: 'سفارشی سازی برند هدر اپلیکیشن',
+    changeLogoTip: 'فرمت SVG یا PNG با حداقل اندازه 80x80px',
+  },
+  upload: 'بارگذاری',
+  uploading: 'در حال بارگذاری',
+  uploadedFail: 'بارگذاری تصویر ناموفق بود، لطفاً دوباره بارگذاری کنید.',
+  change: 'تغییر',
+  apply: 'اعمال',
+  restore: 'بازگرداندن به پیشفرضها',
+  customize: {
+    contactUs: ' با ما تماس بگیرید ',
+    prefix: 'برای سفارشیسازی لوگوی برند در اپلیکیشن، لطفاً',
+    suffix: 'برای ارتقا به نسخه Enterprise.',
+  },
+}
+
+export default translation

+ 161 - 0
web/i18n/fa-IR/dataset-creation.ts

@@ -0,0 +1,161 @@
+const translation = {
+  steps: {
+    header: {
+      creation: 'ایجاد دانش',
+      update: 'افزودن داده',
+    },
+    one: 'انتخاب منبع داده',
+    two: 'پیشپردازش و پاکسازی متن',
+    three: 'اجرا و پایان',
+  },
+  error: {
+    unavailable: 'این دانش در دسترس نیست',
+  },
+  firecrawl: {
+    configFirecrawl: 'پیکربندی fireFirecrawl',
+    apiKeyPlaceholder: 'کلید API از firecrawl.dev',
+    getApiKeyLinkText: 'کلید API خود را از firecrawl.dev دریافت کنید',
+  },
+  stepOne: {
+    filePreview: 'پیشنمایش فایل',
+    pagePreview: 'پیشنمایش صفحه',
+    dataSourceType: {
+      file: 'وارد کردن از فایل',
+      notion: 'همگامسازی از Notion',
+      web: 'همگامسازی از وبسایت',
+    },
+    uploader: {
+      title: 'بارگذاری فایل',
+      button: 'کشیدن و رها کردن فایل، یا',
+      browse: 'مرور',
+      tip: 'پشتیبانی از {{supportTypes}}. حداکثر {{size}}MB هر کدام.',
+      validation: {
+        typeError: 'نوع فایل پشتیبانی نمیشود',
+        size: 'فایل خیلی بزرگ است. حداکثر {{size}}MB',
+        count: 'چندین فایل پشتیبانی نمیشود',
+        filesNumber: 'شما به حد مجاز بارگذاری دستهای {{filesNumber}} رسیدهاید.',
+      },
+      cancel: 'لغو',
+      change: 'تغییر',
+      failed: 'بارگذاری ناموفق بود',
+    },
+    notionSyncTitle: 'Notion متصل نیست',
+    notionSyncTip: 'برای همگامسازی با Notion، ابتدا باید اتصال به Notion برقرار شود.',
+    connect: 'رفتن به اتصال',
+    button: 'بعدی',
+    emptyDatasetCreation: 'میخواهم یک دانش خالی ایجاد کنم',
+    modal: {
+      title: 'ایجاد یک دانش خالی',
+      tip: 'یک دانش خالی هیچ سندی نخواهد داشت و شما میتوانید هر زمان اسناد را بارگذاری کنید.',
+      input: 'نام دانش',
+      placeholder: 'لطفاً وارد کنید',
+      nameNotEmpty: 'نام نمیتواند خالی باشد',
+      nameLengthInvaild: 'نام باید بین 1 تا 40 کاراکتر باشد',
+      cancelButton: 'لغو',
+      confirmButton: 'ایجاد',
+      failed: 'ایجاد ناموفق بود',
+    },
+    website: {
+      fireCrawlNotConfigured: 'Firecrawl پیکربندی نشده است',
+      fireCrawlNotConfiguredDescription: 'برای استفاده از Firecrawl با کلید API پیکربندی کنید.',
+      configure: 'پیکربندی',
+      run: 'اجرا',
+      firecrawlTitle: 'استخراج محتوای وب با fireFirecrawl',
+      firecrawlDoc: 'مستندات Firecrawl',
+      firecrawlDocLink: '<a href="https://docs.dify.ai/guides/knowledge-base/sync-from-website">https://docs.dify.ai/guides/knowledge-base/sync-from-website</a>',
+      options: 'گزینهها',
+      crawlSubPage: 'خزش صفحات فرعی',
+      limit: 'محدودیت',
+      maxDepth: 'حداکثر عمق',
+      excludePaths: 'مسیرهای مستثنی',
+      includeOnlyPaths: 'فقط مسیرهای شامل',
+      extractOnlyMainContent: 'فقط محتوای اصلی را استخراج کنید (بدون هدرها، ناوبریها، پاورقیها و غیره)',
+      exceptionErrorTitle: 'یک استثنا در حین اجرای کار Firecrawl رخ داد:',
+      unknownError: 'خطای ناشناخته',
+      totalPageScraped: 'کل صفحات خراشیده شده:',
+      selectAll: 'انتخاب همه',
+      resetAll: 'بازنشانی همه',
+      scrapTimeInfo: 'در مجموع {{total}} صفحه در {{time}} ثانیه خراشیده شد',
+      preview: 'پیشنمایش',
+      maxDepthTooltip: 'حداکثر عمق برای خزش نسبت به URL وارد شده. عمق 0 فقط صفحه URL وارد شده را خراش میدهد، عمق 1 URL و همه چیز بعد از URL وارد شده + یک / را خراش میدهد، و غیره.',
+    },
+  },
+  stepTwo: {
+    segmentation: 'تنظیمات بخشبندی',
+    auto: 'خودکار',
+    autoDescription: 'به طور خودکار قوانین بخشبندی و پیشپردازش را تنظیم کنید. به کاربران ناآشنا توصیه میشود این گزینه را انتخاب کنند.',
+    custom: 'سفارشی',
+    customDescription: 'قوانین بخشبندی، طول بخشها و قوانین پیشپردازش را سفارشی کنید، و غیره.',
+    separator: 'شناسه بخش',
+    separatorPlaceholder: 'برای مثال، خط جدید (\\\\n) یا جداکننده خاص (مانند "***")',
+    maxLength: 'حداکثر طول بخش',
+    overlap: 'همپوشانی بخش',
+    overlapTip: 'تنظیم همپوشانی بخش میتواند ارتباط معنایی بین آنها را حفظ کند و اثر بازیابی را افزایش دهد. توصیه میشود 10%-25% از حداکثر اندازه بخش تنظیم شود.',
+    overlapCheck: 'همپوشانی بخش نباید بزرگتر از طول حداکثر بخش باشد',
+    rules: 'قوانین پیشپردازش متن',
+    removeExtraSpaces: 'جایگزینی فضاهای متوالی، خطوط جدید و تبها',
+    removeUrlEmails: 'حذف همه URLها و آدرسهای ایمیل',
+    removeStopwords: 'حذف کلمات توقف مانند "a"، "an"، "the"',
+    preview: 'تأیید و پیشنمایش',
+    reset: 'بازنشانی',
+    indexMode: 'حالت شاخص',
+    qualified: 'کیفیت بالا',
+    recommend: 'توصیه شده',
+    qualifiedTip: 'رابط جاسازی سیستم پیشفرض را برای پردازش فراخوانی کنید تا دقت بالاتری هنگام پرسش کاربران فراهم شود.',
+    warning: 'لطفاً ابتدا کلید API ارائهدهنده مدل را تنظیم کنید.',
+    click: 'رفتن به تنظیمات',
+    economical: 'اقتصادی',
+    economicalTip: 'از موتورهای برداری آفلاین، شاخصهای کلیدواژه و غیره استفاده کنید تا دقت را بدون صرف توکنها کاهش دهید',
+    QATitle: 'بخشبندی در قالب پرسش و پاسخ',
+    QATip: 'فعال کردن این گزینه توکنهای بیشتری مصرف خواهد کرد',
+    QALanguage: 'بخشبندی با استفاده از',
+    emstimateCost: 'برآورد',
+    emstimateSegment: 'بخشهای برآورد شده',
+    segmentCount: 'بخشها',
+    calculating: 'در حال محاسبه...',
+    fileSource: 'پیشپردازش اسناد',
+    notionSource: 'پیشپردازش صفحات',
+    websiteSource: 'پیشپردازش وبسایت',
+    other: 'و سایر',
+    fileUnit: ' فایلها',
+    notionUnit: ' صفحات',
+    webpageUnit: ' صفحات',
+    previousStep: 'مرحله قبلی',
+    nextStep: 'ذخیره و پردازش',
+    save: 'ذخیره و پردازش',
+    cancel: 'لغو',
+    sideTipTitle: 'چرا بخشبندی و پیشپردازش؟',
+    sideTipP1: 'هنگام پردازش دادههای متنی، بخشبندی و پاکسازی دو مرحله مهم پیشپردازش هستند.',
+    sideTipP2: 'بخشبندی متن طولانی را به پاراگرافها تقسیم میکند تا مدلها بهتر بتوانند آن را درک کنند. این کیفیت و ارتباط نتایج مدل را بهبود میبخشد.',
+    sideTipP3: 'پاکسازی کاراکترها و فرمتهای غیرضروری را حذف میکند و دانش را پاکتر و آسانتر برای تجزیه میکند.',
+    sideTipP4: 'بخشبندی و پاکسازی مناسب عملکرد مدل را بهبود میبخشد و نتایج دقیقتر و ارزشمندتری ارائه میدهد.',
+    previewTitle: 'پیشنمایش',
+    previewTitleButton: 'پیشنمایش',
+    previewButton: 'تغییر به قالب پرسش و پاسخ',
+    previewSwitchTipStart: 'پیشنمایش بخش فعلی در قالب متن است، تغییر به پیشنمایش قالب پرسش و پاسخ',
+    previewSwitchTipEnd: ' توکنهای اضافی مصرف خواهد کرد',
+    characters: 'کاراکترها',
+    indexSettedTip: 'برای تغییر روش شاخص، لطفاً به',
+    retrivalSettedTip: 'برای تغییر روش شاخص، لطفاً به',
+    datasetSettingLink: 'تنظیمات دانش بروید.',
+  },
+  stepThree: {
+    creationTitle: ' دانش ایجاد شد',
+    creationContent: 'ما به طور خودکار نام دانش را تعیین کردیم، شما میتوانید هر زمان آن را تغییر دهید',
+    label: 'نام دانش',
+    additionTitle: ' سند بارگذاری شد',
+    additionP1: 'سند به دانش بارگذاری شده است',
+    additionP2: '، میتوانید آن را در لیست اسناد دانش پیدا کنید.',
+    stop: 'توقف پردازش',
+    resume: 'ادامه پردازش',
+    navTo: 'رفتن به سند',
+    sideTipTitle: 'بعدی چیست',
+    sideTipContent: 'پس از اتمام فهرستبندی سند، دانش میتواند به عنوان زمینه در برنامه یکپارچه شود، میتوانید تنظیمات زمینه را در صفحه ارکستراسیون درخواست پیدا کنید. همچنین میتوانید آن را به عنوان یک افزونه فهرستبندی مستقل ChatGPT برای انتشار ایجاد کنید.',
+    modelTitle: 'آیا مطمئن هستید که میخواهید جاسازی را متوقف کنید؟',
+    modelContent: 'اگر نیاز به ادامه پردازش بعداً دارید، از جایی که متوقف شدهاید ادامه خواهید داد.',
+    modelButtonConfirm: 'تأیید',
+    modelButtonCancel: 'لغو',
+  },
+}
+
+export default translation

+ 351 - 0
web/i18n/fa-IR/dataset-documents.ts

@@ -0,0 +1,351 @@
+const translation = {
+  list: {
+    title: 'اسناد',
+    desc: 'تمامی فایل‌های دانش در اینجا نمایش داده می‌شوند و کل دانش می‌تواند به ارجاعات Dify متصل شود یا از طریق افزونه چت ایندکس شود.',
+    addFile: 'اضافه کردن فایل',
+    addPages: 'اضافه کردن صفحات',
+    addUrl: 'اضافه کردن URL',
+    table: {
+      header: {
+        fileName: 'نام فایل',
+        words: 'کلمات',
+        hitCount: 'تعداد بازیابی',
+        uploadTime: 'زمان بارگذاری',
+        status: 'وضعیت',
+        action: 'اقدام',
+      },
+      rename: 'تغییر نام',
+      name: 'نام',
+    },
+    action: {
+      uploadFile: 'بارگذاری فایل جدید',
+      settings: 'تنظیمات بخش‌بندی',
+      addButton: 'اضافه کردن قطعه',
+      add: 'اضافه کردن یک قطعه',
+      batchAdd: 'افزودن گروهی',
+      archive: 'بایگانی',
+      unarchive: 'خارج کردن از بایگانی',
+      delete: 'حذف',
+      enableWarning: 'فایل بایگانی شده نمی‌تواند فعال شود',
+      sync: 'همگام‌سازی',
+    },
+    index: {
+      enable: 'فعال کردن',
+      disable: 'غیرفعال کردن',
+      all: 'همه',
+      enableTip: 'فایل می‌تواند ایندکس شود',
+      disableTip: 'فایل نمی‌تواند ایندکس شود',
+    },
+    status: {
+      queuing: 'در صف',
+      indexing: 'ایندکس‌سازی',
+      paused: 'متوقف شده',
+      error: 'خطا',
+      available: 'موجود',
+      enabled: 'فعال شده',
+      disabled: 'غیرفعال شده',
+      archived: 'بایگانی شده',
+    },
+    empty: {
+      title: 'هنوز هیچ سندی وجود ندارد',
+      upload: {
+        tip: 'شما می‌توانید فایل‌ها را بارگذاری کنید، از وب‌سایت همگام‌سازی کنید، یا از برنامه‌های وبی مانند Notion، GitHub و غیره.',
+      },
+      sync: {
+        tip: 'Dify به‌طور دوره‌ای فایل‌ها را از Notion شما دانلود و پردازش را کامل می‌کند.',
+      },
+    },
+    delete: {
+      title: 'آیا مطمئن هستید که حذف شود؟',
+      content: 'اگر بعداً نیاز به ادامه پردازش داشتید، از همان جایی که مانده بودید ادامه می‌دهید',
+    },
+    batchModal: {
+      title: 'افزودن گروهی قطعات',
+      csvUploadTitle: 'فایل CSV خود را اینجا بکشید و رها کنید، یا ',
+      browse: 'مرور کنید',
+      tip: 'فایل CSV باید به ساختار زیر مطابقت داشته باشد:',
+      question: 'سؤال',
+      answer: 'پاسخ',
+      contentTitle: 'محتوای قطعه',
+      content: 'محتوا',
+      template: 'الگو را از اینجا دانلود کنید',
+      cancel: 'لغو',
+      run: 'اجرای گروهی',
+      runError: 'اجرای گروهی ناموفق بود',
+      processing: 'در حال پردازش گروهی',
+      completed: 'واردات کامل شد',
+      error: 'خطای واردات',
+      ok: 'تأیید',
+    },
+  },
+  metadata: {
+    title: 'اطلاعات متا',
+    desc: 'برچسب‌گذاری متادیتا برای اسناد به هوش مصنوعی اجازه می‌دهد تا به موقع به آن‌ها دسترسی پیدا کند و منبع ارجاعات را برای کاربران آشکار کند.',
+    dateTimeFormat: 'D MMMM YYYY hh:mm A',
+    docTypeSelectTitle: 'لطفاً یک نوع سند را انتخاب کنید',
+    docTypeChangeTitle: 'تغییر نوع سند',
+    docTypeSelectWarning: 'اگر نوع سند تغییر کند، متادیتای پر شده فعلی دیگر حفظ نخواهد شد',
+    firstMetaAction: 'بزن بریم',
+    placeholder: {
+      add: 'اضافه کردن ',
+      select: 'انتخاب ',
+    },
+    source: {
+      upload_file: 'بارگذاری فایل',
+      notion: 'همگام‌سازی از Notion',
+      github: 'همگام‌سازی از Github',
+    },
+    type: {
+      book: 'کتاب',
+      webPage: 'صفحه وب',
+      paper: 'مقاله',
+      socialMediaPost: 'پست شبکه‌های اجتماعی',
+      personalDocument: 'سند شخصی',
+      businessDocument: 'سند تجاری',
+      IMChat: 'چت IM',
+      wikipediaEntry: 'ورودی ویکی‌پدیا',
+      notion: 'همگام‌سازی از Notion',
+      github: 'همگام‌سازی از Github',
+      technicalParameters: 'پارامترهای فنی',
+    },
+    field: {
+      processRule: {
+        processDoc: 'پردازش سند',
+        segmentRule: 'قانون قطعه‌بندی',
+        segmentLength: 'طول قطعات',
+        processClean: 'تمیز کردن پردازش متن',
+      },
+      book: {
+        title: 'عنوان',
+        language: 'زبان',
+        author: 'نویسنده',
+        publisher: 'ناشر',
+        publicationDate: 'تاریخ انتشار',
+        ISBN: 'ISBN',
+        category: 'دسته‌بندی',
+      },
+      webPage: {
+        title: 'عنوان',
+        url: 'URL',
+        language: 'زبان',
+        authorPublisher: 'نویسنده/ناشر',
+        publishDate: 'تاریخ انتشار',
+        topicsKeywords: 'موضوعات/کلیدواژه‌ها',
+        description: 'توضیحات',
+      },
+      paper: {
+        title: 'عنوان',
+        language: 'زبان',
+        author: 'نویسنده',
+        publishDate: 'تاریخ انتشار',
+        journalConferenceName: 'نام ژورنال/کنفرانس',
+        volumeIssuePage: 'جلد/شماره/صفحه',
+        DOI: 'DOI',
+        topicsKeywords: 'موضوعات/کلیدواژه‌ها',
+        abstract: 'چکیده',
+      },
+      socialMediaPost: {
+        platform: 'پلتفرم',
+        authorUsername: 'نویسنده/نام کاربری',
+        publishDate: 'تاریخ انتشار',
+        postURL: 'URL پست',
+        topicsTags: 'موضوعات/برچسب‌ها',
+      },
+      personalDocument: {
+        title: 'عنوان',
+        author: 'نویسنده',
+        creationDate: 'تاریخ ایجاد',
+        lastModifiedDate: 'تاریخ آخرین ویرایش',
+        documentType: 'نوع سند',
+        tagsCategory: 'برچسب‌ها/دسته‌بندی',
+      },
+      businessDocument: {
+        title: 'عنوان',
+        author: 'نویسنده',
+        creationDate: 'تاریخ ایجاد',
+        lastModifiedDate: 'تاریخ آخرین ویرایش',
+        documentType: 'نوع سند',
+        departmentTeam: 'دپارتمان/تیم',
+      },
+      IMChat: {
+        chatPlatform: 'پلتفرم چت',
+        chatPartiesGroupName: 'طرفین چت/نام گروه',
+        participants: 'شرکت‌کنندگان',
+        startDate: 'تاریخ شروع',
+        endDate: 'تاریخ پایان',
+        topicsKeywords: 'موضوعات/کلیدواژه‌ها',
+        fileType: 'نوع فایل',
+      },
+      wikipediaEntry: {
+        title: 'عنوان',
+        language: 'زبان',
+        webpageURL: 'URL صفحه وب',
+        editorContributor: 'ویرایشگر/همکار',
+        lastEditDate: 'تاریخ آخرین ویرایش',
+        summaryIntroduction: 'خلاصه/مقدمه',
+      },
+      notion: {
+        title: 'عنوان',
+        language: 'زبان',
+        author: 'نویسنده',
+        createdTime: 'زمان ایجاد',
+        lastModifiedTime: 'زمان آخرین ویرایش',
+        url: 'URL',
+        tag: 'برچسب',
+        description: 'توضیحات',
+      },
+      github: {
+        repoName: 'نام مخزن',
+        repoDesc: 'توضیحات مخزن',
+        repoOwner: 'مالک مخزن',
+        fileName: 'نام فایل',
+        filePath: 'مسیر فایل',
+        programmingLang: 'زبان برنامه‌نویسی',
+        url: 'URL',
+        license: 'مجوز',
+        lastCommitTime: 'زمان آخرین کامیت',
+        lastCommitAuthor: 'نویسنده آخرین کامیت',
+      },
+      originInfo: {
+        originalFilename: 'نام فایل اصلی',
+        originalFileSize: 'اندازه فایل اصلی',
+        uploadDate: 'تاریخ بارگذاری',
+        lastUpdateDate: 'تاریخ آخرین بروزرسانی',
+        source: 'منبع',
+      },
+      technicalParameters: {
+        segmentSpecification: 'مشخصات قطعات',
+        segmentLength: 'طول قطعات',
+        avgParagraphLength: 'طول متوسط پاراگراف',
+        paragraphs: 'پاراگراف‌ها',
+        hitCount: 'تعداد بازیابی',
+        embeddingTime: 'زمان جاسازی',
+        embeddedSpend: 'هزینه جاسازی',
+      },
+    },
+    languageMap: {
+      zh: 'چینی',
+      en: 'انگلیسی',
+      es: 'اسپانیایی',
+      fr: 'فرانسوی',
+      de: 'آلمانی',
+      ja: 'ژاپنی',
+      ko: 'کره‌ای',
+      ru: 'روسی',
+      ar: 'عربی',
+      pt: 'پرتغالی',
+      it: 'ایتالیایی',
+      nl: 'هلندی',
+      pl: 'لهستانی',
+      sv: 'سوئدی',
+      tr: 'ترکی',
+      he: 'عبری',
+      hi: 'هندی',
+      da: 'دانمارکی',
+      fi: 'فنلاندی',
+      no: 'نروژی',
+      hu: 'مجاری',
+      el: 'یونانی',
+      cs: 'چکی',
+      th: 'تایلندی',
+      id: 'اندونزیایی',
+    },
+    categoryMap: {
+      book: {
+        fiction: 'داستان',
+        biography: 'زندگی‌نامه',
+        history: 'تاریخ',
+        science: 'علم',
+        technology: 'فناوری',
+        education: 'آموزش',
+        philosophy: 'فلسفه',
+        religion: 'دین',
+        socialSciences: 'علوم اجتماعی',
+        art: 'هنر',
+        travel: 'سفر',
+        health: 'سلامت',
+        selfHelp: 'خودیاری',
+        businessEconomics: 'اقتصاد کسب‌وکار',
+        cooking: 'آشپزی',
+        childrenYoungAdults: 'کودکان و نوجوانان',
+        comicsGraphicNovels: 'کمیک‌ها و رمان‌های گرافیکی',
+        poetry: 'شعر',
+        drama: 'نمایشنامه',
+        other: 'دیگر',
+      },
+      personalDoc: {
+        notes: 'یادداشت‌ها',
+        blogDraft: 'پیش‌نویس وبلاگ',
+        diary: 'دفتر خاطرات',
+        researchReport: 'گزارش پژوهش',
+        bookExcerpt: 'گزیده کتاب',
+        schedule: 'برنامه‌ریزی',
+        list: 'فهرست',
+        projectOverview: 'نمای کلی پروژه',
+        photoCollection: 'مجموعه عکس',
+        creativeWriting: 'نوشته خلاقانه',
+        codeSnippet: 'قطعه کد',
+        designDraft: 'پیش‌نویس طراحی',
+        personalResume: 'رزومه شخصی',
+        other: 'دیگر',
+      },
+      businessDoc: {
+        meetingMinutes: 'صورتجلسه',
+        researchReport: 'گزارش پژوهش',
+        proposal: 'پیشنهاد',
+        employeeHandbook: 'راهنمای کارمند',
+        trainingMaterials: 'مواد آموزشی',
+        requirementsDocument: 'سند نیازمندی‌ها',
+        designDocument: 'سند طراحی',
+        productSpecification: 'مشخصات محصول',
+        financialReport: 'گزارش مالی',
+        marketAnalysis: 'تحلیل بازار',
+        projectPlan: 'طرح پروژه',
+        teamStructure: 'ساختار تیم',
+        policiesProcedures: 'سیاست‌ها و رویه‌ها',
+        contractsAgreements: 'قراردادها و توافق‌نامه‌ها',
+        emailCorrespondence: 'مکاتبات ایمیلی',
+        other: 'دیگر',
+      },
+    },
+  },
+  embedding: {
+    processing: 'در حال پردازش جاسازی...',
+    paused: 'جاسازی متوقف شده',
+    completed: 'جاسازی کامل شد',
+    error: 'خطای جاسازی',
+    docName: 'پیش‌پردازش سند',
+    mode: 'قانون بخش‌بندی',
+    segmentLength: 'طول قطعات',
+    textCleaning: 'پیش‌تعریف و تمیز کردن متن',
+    segments: 'پاراگراف‌ها',
+    highQuality: 'حالت با کیفیت بالا',
+    economy: 'حالت اقتصادی',
+    estimate: 'مصرف تخمینی',
+    stop: 'توقف پردازش',
+    resume: 'ادامه پردازش',
+    automatic: 'خودکار',
+    custom: 'سفارشی',
+    previewTip: 'پیش‌نمایش پاراگراف پس از اتمام جاسازی در دسترس خواهد بود',
+  },
+  segment: {
+    paragraphs: 'پاراگراف‌ها',
+    keywords: 'کلیدواژه‌ها',
+    addKeyWord: 'اضافه کردن کلیدواژه',
+    keywordError: 'حداکثر طول کلیدواژه ۲۰ کاراکتر است',
+    characters: 'کاراکترها',
+    hitCount: 'تعداد بازیابی',
+    vectorHash: 'هش برداری: ',
+    questionPlaceholder: 'سؤال را اینجا اضافه کنید',
+    questionEmpty: 'سؤال نمی‌تواند خالی باشد',
+    answerPlaceholder: 'پاسخ را اینجا اضافه کنید',
+    answerEmpty: 'پاسخ نمی‌تواند خالی باشد',
+    contentPlaceholder: 'محتوا را اینجا اضافه کنید',
+    contentEmpty: 'محتوا نمی‌تواند خالی باشد',
+    newTextSegment: 'قطعه متن جدید',
+    newQaSegment: 'قطعه پرسش و پاسخ جدید',
+    delete: 'حذف این قطعه؟',
+  },
+}
+
+export default translation

+ 28 - 0
web/i18n/fa-IR/dataset-hit-testing.ts

@@ -0,0 +1,28 @@
+const translation = {
+  title: 'آزمون بازیابی',
+  desc: 'آزمون اثرگذاری دانش بر اساس متن پرسش داده شده.',
+  dateTimeFormat: 'MM/DD/YYYY hh:mm A',
+  recents: 'اخیرها',
+  table: {
+    header: {
+      source: 'منبع',
+      text: 'متن',
+      time: 'زمان',
+    },
+  },
+  input: {
+    title: 'متن منبع',
+    placeholder: 'لطفاً یک متن وارد کنید، یک جمله کوتاه خبری توصیه می‌شود.',
+    countWarning: 'تا ۲۰۰ کاراکتر.',
+    indexWarning: 'فقط دانش با کیفیت بالا.',
+    testing: 'در حال آزمون',
+  },
+  hit: {
+    title: 'پاراگراف‌های بازیابی',
+    emptyTip: 'نتایج آزمون بازیابی اینجا نمایش داده می‌شوند',
+  },
+  noRecentTip: 'اینجا نتیجه پرسش اخیر وجود ندارد',
+  viewChart: 'مشاهده نمودار بُرداری',
+}
+
+export default translation

+ 35 - 0
web/i18n/fa-IR/dataset-settings.ts

@@ -0,0 +1,35 @@
+const translation = {
+  title: 'تنظیمات دانش',
+  desc: 'اینجا می‌توانید ویژگی‌ها و روش‌های کاری دانش را تغییر دهید.',
+  form: {
+    name: 'نام دانش',
+    namePlaceholder: 'لطفاً نام دانش را وارد کنید',
+    nameError: 'نام نمی‌تواند خالی باشد',
+    desc: 'توضیحات دانش',
+    descInfo: 'لطفاً یک توضیح متنی واضح بنویسید تا محتوای دانش را مشخص کند. این توضیحات به عنوان مبنایی برای تطبیق هنگام انتخاب از چندین دانش برای استنتاج استفاده خواهد شد.',
+    descPlaceholder: 'توضیح دهید که در این دانش چه چیزی وجود دارد. توضیحات دقیق به هوش مصنوعی اجازه می‌دهد تا به موقع به محتوای دانش دسترسی پیدا کند. اگر خالی باشد، دیفی از استراتژی پیش‌فرض استفاده خواهد کرد.',
+    descWrite: 'یاد بگیرید چگونه یک توضیح دانش خوب بنویسید.',
+    permissions: 'مجوزها',
+    permissionsOnlyMe: 'فقط من',
+    permissionsAllMember: 'تمام اعضای تیم',
+    permissionsInvitedMembers: 'برخی از اعضای تیم',
+    me: '(شما)',
+    indexMethod: 'روش نمایه‌سازی',
+    indexMethodHighQuality: 'کیفیت بالا',
+    indexMethodHighQualityTip: 'مدل تعبیه را برای پردازش فراخوانی کنید تا دقت بالاتری هنگام جستجوی کاربران فراهم شود.',
+    indexMethodEconomy: 'اقتصادی',
+    indexMethodEconomyTip: 'استفاده از موتورهای برداری آفلاین، شاخص‌های کلمات کلیدی و غیره برای کاهش دقت بدون صرف توکن‌ها',
+    embeddingModel: 'مدل تعبیه',
+    embeddingModelTip: 'برای تغییر مدل تعبیه، لطفاً به ',
+    embeddingModelTipLink: 'تنظیمات',
+    retrievalSetting: {
+      title: 'تنظیمات بازیابی',
+      learnMore: 'بیشتر بدانید',
+      description: ' درباره روش بازیابی.',
+      longDescription: ' درباره روش بازیابی، می‌توانید در هر زمانی در تنظیمات دانش این را تغییر دهید.',
+    },
+    save: 'ذخیره',
+  },
+}
+
+export default translation

+ 76 - 0
web/i18n/fa-IR/dataset.ts

@@ -0,0 +1,76 @@
+const translation = {
+  knowledge: 'دانش',
+  documentCount: ' سند',
+  wordCount: ' هزار کلمه',
+  appCount: ' برنامه‌های متصل',
+  createDataset: 'ایجاد دانش',
+  createDatasetIntro: 'داده‌های متنی خود را وارد کنید یا از طریق Webhook در زمان واقعی برای بهبود زمینه LLM بنویسید.',
+  deleteDatasetConfirmTitle: 'حذف این دانش؟',
+  deleteDatasetConfirmContent:
+    'حذف دانش غیر قابل برگشت است. کاربران دیگر نمی‌توانند به دانش شما دسترسی پیدا کنند و تمام تنظیمات درخواست و گزارش‌ها به طور دائم حذف خواهند شد.',
+  datasetUsedByApp: 'دانش توسط برخی برنامه‌ها استفاده می‌شود. برنامه‌ها دیگر نمی‌توانند از این دانش استفاده کنند و تمام تنظیمات درخواست و گزارش‌ها به طور دائم حذف خواهند شد.',
+  datasetDeleted: 'دانش حذف شد',
+  datasetDeleteFailed: 'حذف دانش ناموفق بود',
+  didYouKnow: 'آیا می‌دانستید؟',
+  intro1: 'دانش می‌تواند در برنامه Dify ',
+  intro2: 'به عنوان یک زمینه',
+  intro3: 'ادغام شود',
+  intro4: 'یا می‌تواند ',
+  intro5: 'به عنوان یک افزونه مستقل ChatGPT برای انتشار',
+  intro6: 'ایجاد شود',
+  unavailable: 'در دسترس نیست',
+  unavailableTip: 'مدل جاسازی در دسترس نیست، نیاز است مدل جاسازی پیش‌فرض پیکربندی شود',
+  datasets: 'دانش',
+  datasetsApi: 'دسترسی API',
+  retrieval: {
+    semantic_search: {
+      title: 'جستجوی برداری',
+      description: 'تولید جاسازی‌های جستجو و جستجوی بخش متنی که بیشترین شباهت را به نمایش برداری آن دارد.',
+    },
+    full_text_search: {
+      title: 'جستجوی متن کامل',
+      description: 'فهرست کردن تمام اصطلاحات در سند، به کاربران اجازه می‌دهد هر اصطلاحی را جستجو کنند و بخش متنی مربوط به آن اصطلاحات را بازیابی کنند.',
+    },
+    hybrid_search: {
+      title: 'جستجوی هیبریدی',
+      description: 'جستجوی متن کامل و برداری را همزمان اجرا می‌کند، دوباره رتبه‌بندی می‌کند تا بهترین تطابق برای درخواست کاربر انتخاب شود. کاربران می‌توانند وزن‌ها را تنظیم کنند یا به یک مدل دوباره رتبه‌بندی تنظیم کنند.',
+      recommend: 'توصیه',
+    },
+    invertedIndex: {
+      title: 'فهرست معکوس',
+      description: 'فهرست معکوس یک ساختار برای بازیابی کارآمد است. توسط اصطلاحات سازماندهی شده، هر اصطلاح به اسناد یا صفحات وب حاوی آن اشاره می‌کند.',
+    },
+    change: 'تغییر',
+    changeRetrievalMethod: 'تغییر روش بازیابی',
+  },
+  docsFailedNotice: 'اسناد نتوانستند فهرست‌بندی شوند',
+  retry: 'تلاش مجدد',
+  indexingTechnique: {
+    high_quality: 'HQ',
+    economy: 'ECO',
+  },
+  indexingMethod: {
+    semantic_search: 'برداری',
+    full_text_search: 'متن کامل',
+    hybrid_search: 'هیبریدی',
+    invertedIndex: 'معکوس',
+  },
+  mixtureHighQualityAndEconomicTip: 'مدل دوباره رتبه‌بندی برای ترکیب پایگاه‌های دانش با کیفیت بالا و اقتصادی لازم است.',
+  inconsistentEmbeddingModelTip: 'مدل دوباره رتبه‌بندی لازم است اگر مدل‌های جاسازی پایگاه‌های دانش انتخابی ناسازگار باشند.',
+  retrievalSettings: 'تنظیمات بازیابی',
+  rerankSettings: 'تنظیمات دوباره رتبه‌بندی',
+  weightedScore: {
+    title: 'امتیاز وزنی',
+    description: 'با تنظیم وزن‌های اختصاص داده شده، این استراتژی دوباره رتبه‌بندی تعیین می‌کند که آیا اولویت با تطابق معنایی یا کلمات کلیدی است.',
+    semanticFirst: 'اولویت معنایی',
+    keywordFirst: 'اولویت کلمه کلیدی',
+    customized: 'سفارشی‌سازی شده',
+    semantic: 'معنایی',
+    keyword: 'کلمه کلیدی',
+  },
+  nTo1RetrievalLegacy: 'بازیابی N-to-1 از سپتامبر به طور رسمی منسوخ خواهد شد. توصیه می‌شود از بازیابی چند مسیر جدید استفاده کنید تا نتایج بهتری بدست آورید.',
+  nTo1RetrievalLegacyLink: 'بیشتر بدانید',
+  nTo1RetrievalLegacyLinkText: ' بازیابی N-to-1 از سپتامبر به طور رسمی منسوخ خواهد شد.',
+}
+
+export default translation

+ 41 - 0
web/i18n/fa-IR/explore.ts

@@ -0,0 +1,41 @@
+const translation = {
+  title: 'کاوش',
+  sidebar: {
+    discovery: 'کشف',
+    chat: 'چت',
+    workspace: 'فضای کاری',
+    action: {
+      pin: 'سنجاق کردن',
+      unpin: 'برداشتن سنجاق',
+      rename: 'تغییر نام',
+      delete: 'حذف',
+    },
+    delete: {
+      title: 'حذف برنامه',
+      content: 'آیا مطمئن هستید که می‌خواهید این برنامه را حذف کنید؟',
+    },
+  },
+  apps: {
+    title: 'کاوش برنامه‌ها توسط دیفی',
+    description: 'از این برنامه‌های قالبی بلافاصله استفاده کنید یا برنامه‌های خود را بر اساس این قالب‌ها سفارشی کنید.',
+    allCategories: 'پیشنهاد شده',
+  },
+  appCard: {
+    addToWorkspace: 'افزودن به فضای کاری',
+    customize: 'سفارشی کردن',
+  },
+  appCustomize: {
+    title: 'ایجاد برنامه از {{name}}',
+    subTitle: 'آیکون و نام برنامه',
+    nameRequired: 'نام برنامه الزامی است',
+  },
+  category: {
+    Assistant: 'دستیار',
+    Writing: 'نوشتن',
+    Translate: 'ترجمه',
+    Programming: 'برنامه‌نویسی',
+    HR: 'منابع انسانی',
+  },
+}
+
+export default translation

+ 4 - 0
web/i18n/fa-IR/layout.ts

@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation

+ 75 - 0
web/i18n/fa-IR/login.ts

@@ -0,0 +1,75 @@
+const translation = {
+  pageTitle: 'هی، بیایید شروع کنیم!👋',
+  welcome: 'به Dify خوش آمدید، لطفا برای ادامه وارد شوید.',
+  email: 'آدرس ایمیل',
+  emailPlaceholder: 'ایمیل شما',
+  password: 'رمز عبور',
+  passwordPlaceholder: 'رمز عبور شما',
+  name: 'نام کاربری',
+  namePlaceholder: 'نام کاربری شما',
+  forget: 'رمز عبور خود را فراموش کرده‌اید؟',
+  signBtn: 'ورود',
+  sso: 'ادامه با SSO',
+  installBtn: 'راه‌اندازی',
+  setAdminAccount: 'راه‌اندازی حساب مدیر',
+  setAdminAccountDesc: 'بیشترین امتیازات برای حساب مدیر، که می‌تواند برای ایجاد برنامه‌ها و مدیریت ارائه‌دهندگان LLM و غیره استفاده شود.',
+  createAndSignIn: 'ایجاد و ورود',
+  oneMoreStep: 'یک مرحله دیگر',
+  createSample: 'بر اساس این اطلاعات، ما برای شما یک نمونه برنامه ایجاد خواهیم کرد',
+  invitationCode: 'کد دعوت',
+  invitationCodePlaceholder: 'کد دعوت شما',
+  interfaceLanguage: 'زبان رابط کاربری',
+  timezone: 'منطقه زمانی',
+  go: 'برو به Dify',
+  sendUsMail: 'ایمیل معرفی خود را برای ما ارسال کنید، و ما درخواست دعوت را بررسی خواهیم کرد.',
+  acceptPP: 'من سیاست حفظ حریم خصوصی را خوانده و قبول می‌کنم',
+  reset: 'لطفاً برای بازنشانی رمز عبور خود دستور زیر را اجرا کنید',
+  withGitHub: 'ادامه با GitHub',
+  withGoogle: 'ادامه با Google',
+  rightTitle: 'پتانسیل کامل LLM را باز کنید',
+  rightDesc: 'به راحتی برنامه‌های AI با ظاهری جذاب، قابل اجرا و بهبود پذیر ایجاد کنید.',
+  tos: 'شرایط خدمات',
+  pp: 'سیاست حفظ حریم خصوصی',
+  tosDesc: 'با ثبت نام، شما با شرایط ما موافقت می‌کنید',
+  goToInit: 'اگر حساب را اولیه نکرده‌اید، لطفاً به صفحه اولیه‌سازی بروید',
+  donthave: 'ندارید؟',
+  invalidInvitationCode: 'کد دعوت نامعتبر است',
+  accountAlreadyInited: 'حساب قبلاً اولیه شده است',
+  forgotPassword: 'رمز عبور خود را فراموش کرده‌اید؟',
+  resetLinkSent: 'لینک بازنشانی ارسال شد',
+  sendResetLink: 'ارسال لینک بازنشانی',
+  backToSignIn: 'بازگشت به ورود',
+  forgotPasswordDesc: 'لطفاً آدرس ایمیل خود را وارد کنید تا رمز عبور خود را بازنشانی کنید. ما یک ایمیل با دستورالعمل‌های بازنشانی برای شما ارسال خواهیم کرد.',
+  checkEmailForResetLink: 'لطفاً ایمیل خود را برای لینک بازنشانی رمز عبور بررسی کنید. اگر در عرض چند دقیقه ظاهر نشد، پوشه اسپم خود را بررسی کنید.',
+  passwordChanged: 'اکنون وارد شوید',
+  changePassword: 'تغییر رمز عبور',
+  changePasswordTip: 'لطفاً یک رمز عبور جدید برای حساب خود وارد کنید',
+  invalidToken: 'توکن نامعتبر یا منقضی شده است',
+  confirmPassword: 'تایید رمز عبور',
+  confirmPasswordPlaceholder: 'رمز عبور جدید خود را تایید کنید',
+  passwordChangedTip: 'رمز عبور شما با موفقیت تغییر یافت',
+  error: {
+    emailEmpty: 'آدرس ایمیل لازم است',
+    emailInValid: 'لطفاً یک آدرس ایمیل معتبر وارد کنید',
+    nameEmpty: 'نام لازم است',
+    passwordEmpty: 'رمز عبور لازم است',
+    passwordLengthInValid: 'رمز عبور باید حداقل ۸ کاراکتر باشد',
+    passwordInvalid: 'رمز عبور باید شامل حروف و اعداد باشد و طول آن بیشتر از ۸ کاراکتر باشد',
+  },
+  license: {
+    tip: 'قبل از شروع Dify Community Edition، GitHub را بخوانید',
+    link: 'مجوز منبع باز',
+  },
+  join: 'عضویت',
+  joinTipStart: 'شما را دعوت می‌کنیم به',
+  joinTipEnd: 'تیم در Dify',
+  invalid: 'لینک منقضی شده است',
+  explore: 'کاوش Dify',
+  activatedTipStart: 'شما به',
+  activatedTipEnd: 'تیم پیوسته‌اید',
+  activated: 'اکنون وارد شوید',
+  adminInitPassword: 'رمز عبور اولیه مدیر',
+  validate: 'اعتبارسنجی',
+}
+
+export default translation

+ 4 - 0
web/i18n/fa-IR/register.ts

@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation

+ 29 - 0
web/i18n/fa-IR/run-log.ts

@@ -0,0 +1,29 @@
+const translation = {
+  input: 'ورودی',
+  result: 'نتیجه',
+  detail: 'جزئیات',
+  tracing: 'ردیابی',
+  resultPanel: {
+    status: 'وضعیت',
+    time: 'زمان گذشته',
+    tokens: 'کل توکن‌ها',
+  },
+  meta: {
+    title: 'فراداده',
+    status: 'وضعیت',
+    version: 'نسخه',
+    executor: 'اجراکننده',
+    startTime: 'زمان شروع',
+    time: 'زمان گذشته',
+    tokens: 'کل توکن‌ها',
+    steps: 'گام‌های اجرا',
+  },
+  resultEmpty: {
+    title: 'این اجرا فقط خروجی به فرمت JSON دارد،',
+    tipLeft: 'لطفاً به ',
+    link: 'پنل جزئیات',
+    tipRight: ' بروید و آن را مشاهده کنید.',
+  },
+}
+
+export default translation

+ 70 - 0
web/i18n/fa-IR/share-app.ts

@@ -0,0 +1,70 @@
+const translation = {
+  common: {
+    welcome: '',
+    appUnavailable: 'اپ در دسترس نیست',
+    appUnkonwError: 'اپ در دسترس نیست',
+  },
+  chat: {
+    newChat: 'چت جدید',
+    pinnedTitle: 'پین شده',
+    unpinnedTitle: 'چت‌ها',
+    newChatDefaultName: 'مکالمه جدید',
+    resetChat: 'بازنشانی مکالمه',
+    powerBy: 'قدرت‌گرفته از',
+    prompt: 'پیشنهاد',
+    privatePromptConfigTitle: 'تنظیمات مکالمه',
+    publicPromptConfigTitle: 'پیشنهاد اولیه',
+    configStatusDes: 'قبل از شروع، می‌توانید تنظیمات مکالمه را تغییر دهید',
+    configDisabled: 'تنظیمات جلسه قبلی برای این جلسه استفاده شده است.',
+    startChat: 'شروع چت',
+    privacyPolicyLeft: 'لطفاً ',
+    privacyPolicyMiddle: 'سیاست حریم خصوصی',
+    privacyPolicyRight: ' ارائه شده توسط توسعه‌دهنده اپ را بخوانید.',
+    deleteConversation: {
+      title: 'حذف مکالمه',
+      content: 'آیا مطمئن هستید که می‌خواهید این مکالمه را حذف کنید؟',
+    },
+    tryToSolve: 'سعی کنید حل کنید',
+    temporarySystemIssue: 'ببخشید، مشکل موقت سیستمی.',
+  },
+  generation: {
+    tabs: {
+      create: 'یک‌بار اجرا کن',
+      batch: 'اجرا به صورت گروهی',
+      saved: 'ذخیره شده',
+    },
+    savedNoData: {
+      title: 'شما هنوز نتیجه‌ای ذخیره نکرده‌اید!',
+      description: 'شروع به تولید محتوا کنید و نتایج ذخیره شده خود را اینجا پیدا کنید.',
+      startCreateContent: 'شروع به تولید محتوا',
+    },
+    title: 'تکمیل هوش مصنوعی',
+    queryTitle: 'محتوای درخواست',
+    completionResult: 'نتیجه تکمیل',
+    queryPlaceholder: 'محتوای درخواست خود را بنویسید...',
+    run: 'اجرا',
+    copy: 'کپی',
+    resultTitle: 'تکمیل هوش مصنوعی',
+    noData: 'هوش مصنوعی آنچه را که می‌خواهید اینجا به شما می‌دهد.',
+    csvUploadTitle: 'فایل CSV خود را اینجا بکشید و رها کنید، یا ',
+    browse: 'جستجو',
+    csvStructureTitle: 'فایل CSV باید با ساختار زیر مطابقت داشته باشد:',
+    downloadTemplate: 'الگو را اینجا دانلود کنید',
+    field: 'فیلد',
+    batchFailed: {
+      info: '{{num}} اجرای ناموفق',
+      retry: 'تلاش مجدد',
+      outputPlaceholder: 'محتوای خروجی وجود ندارد',
+    },
+    errorMsg: {
+      empty: 'لطفاً محتوا را در فایل بارگذاری شده وارد کنید.',
+      fileStructNotMatch: 'فایل CSV بارگذاری شده با ساختار مطابقت ندارد.',
+      emptyLine: 'ردیف {{rowIndex}} خالی است',
+      invalidLine: 'ردیف {{rowIndex}}: مقدار {{varName}} نمی‌تواند خالی باشد',
+      moreThanMaxLengthLine: 'ردیف {{rowIndex}}: مقدار {{varName}} نمی‌تواند بیشتر از {{maxLength}} کاراکتر باشد',
+      atLeastOne: 'لطفاً حداقل یک ردیف در فایل بارگذاری شده وارد کنید.',
+    },
+  },
+}
+
+export default translation

+ 153 - 0
web/i18n/fa-IR/tools.ts

@@ -0,0 +1,153 @@
+const translation = {
+  title: 'ابزارها',
+  createCustomTool: 'ایجاد ابزار سفارشی',
+  customToolTip: 'بیشتر در مورد ابزارهای سفارشی Dify بیاموزید',
+  type: {
+    all: 'همه',
+    builtIn: 'سفارشی شده',
+    custom: 'سفارشی',
+    workflow: 'جریان کار',
+  },
+  contribute: {
+    line1: 'من علاقه‌مند به ',
+    line2: 'مشارکت در ابزارهای Dify هستم.',
+    viewGuide: 'مشاهده راهنما',
+  },
+  author: 'توسط',
+  auth: {
+    unauthorized: 'برای مجوز دادن',
+    authorized: 'مجوز داده شده',
+    setup: 'تنظیم مجوز برای استفاده',
+    setupModalTitle: 'تنظیم مجوز',
+    setupModalTitleDescription: 'پس از پیکربندی اعتبارنامه‌ها، همه اعضای موجود در فضای کاری می‌توانند از این ابزار هنگام هماهنگی برنامه‌ها استفاده کنند.',
+  },
+  includeToolNum: '{{num}} ابزار شامل شد',
+  addTool: 'افزودن ابزار',
+  addToolModal: {
+    type: 'نوع',
+    category: 'دسته‌بندی',
+    add: 'افزودن',
+    added: 'افزوده شد',
+    manageInTools: 'مدیریت در ابزارها',
+    emptyTitle: 'هیچ ابزار جریان کاری در دسترس نیست',
+    emptyTip: 'به "جریان کاری -> انتشار به عنوان ابزار" بروید',
+  },
+  createTool: {
+    title: 'ایجاد ابزار سفارشی',
+    editAction: 'پیکربندی',
+    editTitle: 'ویرایش ابزار سفارشی',
+    name: 'نام',
+    toolNamePlaceHolder: 'نام ابزار را وارد کنید',
+    nameForToolCall: 'نام فراخوانی ابزار',
+    nameForToolCallPlaceHolder: 'برای شناسایی ماشین، مانند getCurrentWeather، list_pets',
+    nameForToolCallTip: 'فقط اعداد، حروف و خط زیر پشتیبانی می‌شود.',
+    description: 'توضیحات',
+    descriptionPlaceholder: 'توضیحات مختصر در مورد هدف ابزار، مثلاً، گرفتن دما برای یک مکان خاص.',
+    schema: 'طرح',
+    schemaPlaceHolder: 'طرح OpenAPI خود را اینجا وارد کنید',
+    viewSchemaSpec: 'مشاهده مشخصات OpenAPI-Swagger',
+    importFromUrl: 'وارد کردن از URL',
+    importFromUrlPlaceHolder: 'https://...',
+    urlError: 'لطفاً یک URL معتبر وارد کنید',
+    examples: 'مثال‌ها',
+    exampleOptions: {
+      json: 'آب و هوا (JSON)',
+      yaml: 'فروشگاه حیوانات خانگی (YAML)',
+      blankTemplate: 'الگوی خالی',
+    },
+    availableTools: {
+      title: 'ابزارهای موجود',
+      name: 'نام',
+      description: 'توضیحات',
+      method: 'روش',
+      path: 'مسیر',
+      action: 'عملیات',
+      test: 'آزمایش',
+    },
+    authMethod: {
+      title: 'روش مجوز',
+      type: 'نوع مجوز',
+      keyTooltip: 'کلید Http Header، می‌توانید آن را با "Authorization" ترک کنید اگر نمی‌دانید چیست یا آن را به یک مقدار سفارشی تنظیم کنید',
+      types: {
+        none: 'هیچ',
+        api_key: 'کلید API',
+        apiKeyPlaceholder: 'نام هدر HTTP برای کلید API',
+        apiValuePlaceholder: 'کلید API را وارد کنید',
+      },
+      key: 'کلید',
+      value: 'مقدار',
+    },
+    authHeaderPrefix: {
+      title: 'نوع مجوز',
+      types: {
+        basic: 'پایه',
+        bearer: 'Bearer',
+        custom: 'سفارشی',
+      },
+    },
+    privacyPolicy: 'سیاست حفظ حریم خصوصی',
+    privacyPolicyPlaceholder: 'لطفاً سیاست حفظ حریم خصوصی را وارد کنید',
+    toolInput: {
+      title: 'ورودی ابزار',
+      name: 'نام',
+      required: 'الزامی',
+      method: 'روش',
+      methodSetting: 'تنظیم',
+      methodSettingTip: 'کاربر پیکربندی ابزار را پر می‌کند',
+      methodParameter: 'پارامتر',
+      methodParameterTip: 'LLM در طول استنباط پر می‌کند',
+      label: 'برچسب‌ها',
+      labelPlaceholder: 'برچسب‌ها را انتخاب کنید (اختیاری)',
+      description: 'توضیحات',
+      descriptionPlaceholder: 'توضیحات معنی پارامتر',
+    },
+    customDisclaimer: 'توجهیه سفارشی',
+    customDisclaimerPlaceholder: 'لطفاً توجهیه سفارشی را وارد کنید',
+    confirmTitle: 'آیا می‌خواهید ذخیره کنید؟',
+    confirmTip: 'برنامه‌هایی که از این ابزار استفاده می‌کنند تحت تأثیر قرار خواهند گرفت',
+    deleteToolConfirmTitle: 'آیا این ابزار را حذف کنید؟',
+    deleteToolConfirmContent: 'حذف ابزار غیرقابل بازگشت است. کاربران دیگر قادر به دسترسی به ابزار شما نخواهند بود.',
+  },
+  test: {
+    title: 'آزمایش',
+    parametersValue: 'پارامترها و مقدار',
+    parameters: 'پارامترها',
+    value: 'مقدار',
+    testResult: 'نتایج آزمایش',
+    testResultPlaceholder: 'نتیجه آزمایش در اینجا نمایش داده می‌شود',
+  },
+  thought: {
+    using: 'در حال استفاده',
+    used: 'استفاده شده',
+    requestTitle: 'درخواست به',
+    responseTitle: 'پاسخ از',
+  },
+  setBuiltInTools: {
+    info: 'اطلاعات',
+    setting: 'تنظیمات',
+    toolDescription: 'توضیحات ابزار',
+    parameters: 'پارامترها',
+    string: 'رشته',
+    number: 'عدد',
+    required: 'الزامی',
+    infoAndSetting: 'اطلاعات و تنظیمات',
+  },
+  noCustomTool: {
+    title: 'ابزار سفارشی وجود ندارد!',
+    content: 'ابزارهای سفارشی خود را در اینجا اضافه و مدیریت کنید تا برنامه‌های هوش مصنوعی بسازید.',
+    createTool: 'ایجاد ابزار',
+  },
+  noSearchRes: {
+    title: 'متأسفیم، نتیجه‌ای پیدا نشد!',
+    content: 'ما نتوانستیم ابزارهایی که با جستجوی شما مطابقت داشته باشد پیدا کنیم.',
+    reset: 'بازنشانی جستجو',
+  },
+  builtInPromptTitle: 'پرامپت',
+  toolRemoved: 'ابزار حذف شد',
+  notAuthorized: 'ابزار مجوز ندارد',
+  howToGet: 'چگونه دریافت کنید',
+  openInStudio: 'باز کردن در استودیو',
+  toolNameUsageTip: 'نام فراخوانی ابزار برای استدلال و پرامپت‌های عامل',
+}
+
+export default translation

+ 498 - 0
web/i18n/fa-IR/workflow.ts

@@ -0,0 +1,498 @@
+const translation = {
+  common: {
+    undo: 'بازگشت',
+    redo: 'پیشرفت',
+    editing: 'ویرایش',
+    autoSaved: 'ذخیره خودکار',
+    unpublished: 'منتشر نشده',
+    published: 'منتشر شده',
+    publish: 'انتشار',
+    update: 'به‌روزرسانی',
+    run: 'اجرا',
+    running: 'در حال اجرا',
+    inRunMode: 'در حالت اجرا',
+    inPreview: 'در پیش‌نمایش',
+    inPreviewMode: 'در حالت پیش‌نمایش',
+    preview: 'پیش‌نمایش',
+    viewRunHistory: 'مشاهده تاریخچه اجرا',
+    runHistory: 'تاریخچه اجرا',
+    goBackToEdit: 'بازگشت به ویرایشگر',
+    conversationLog: 'گزارش مکالمات',
+    features: 'ویژگی‌ها',
+    debugAndPreview: 'پیش‌نمایش',
+    restart: 'راه‌اندازی مجدد',
+    currentDraft: 'پیش‌نویس فعلی',
+    currentDraftUnpublished: 'پیش‌نویس فعلی منتشر نشده',
+    latestPublished: 'آخرین نسخه منتشر شده',
+    publishedAt: 'منتشر شده',
+    restore: 'بازیابی',
+    runApp: 'اجرای اپلیکیشن',
+    batchRunApp: 'اجرای دسته‌ای اپلیکیشن',
+    accessAPIReference: 'دسترسی به مستندات API',
+    embedIntoSite: 'درج در سایت',
+    addTitle: 'افزودن عنوان...',
+    addDescription: 'افزودن توضیحات...',
+    noVar: 'هیچ متغیری',
+    searchVar: 'جستجوی متغیر',
+    variableNamePlaceholder: 'نام متغیر',
+    setVarValuePlaceholder: 'تنظیم متغیر',
+    needConnecttip: 'این مرحله به هیچ چیزی متصل نیست',
+    maxTreeDepth: 'حداکثر عمق {{depth}} نود در هر شاخه',
+    needEndNode: 'بلوک پایان باید اضافه شود',
+    needAnswerNode: 'بلوک پاسخ باید اضافه شود',
+    workflowProcess: 'فرآیند جریان کار',
+    notRunning: 'هنوز در حال اجرا نیست',
+    previewPlaceholder: 'محتوا را در کادر زیر وارد کنید تا اشکال‌زدایی چت‌بات را شروع کنید',
+    effectVarConfirm: {
+      title: 'حذف متغیر',
+      content: 'متغیر در نودهای دیگر استفاده شده است. آیا همچنان می‌خواهید آن را حذف کنید؟',
+    },
+    insertVarTip: 'برای درج سریع کلید \'/\' را فشار دهید',
+    processData: 'پردازش داده‌ها',
+    input: 'ورودی',
+    output: 'خروجی',
+    jinjaEditorPlaceholder: 'برای درج متغیر \'/\' یا \'{\' را تایپ کنید',
+    viewOnly: 'فقط مشاهده',
+    showRunHistory: 'نمایش تاریخچه اجرا',
+    enableJinja: 'فعال‌سازی پشتیبانی از الگوهای Jinja',
+    learnMore: 'اطلاعات بیشتر',
+    copy: 'کپی',
+    duplicate: 'تکرار',
+    addBlock: 'افزودن بلوک',
+    pasteHere: 'چسباندن اینجا',
+    pointerMode: 'حالت اشاره‌گر',
+    handMode: 'حالت دست',
+    model: 'مدل',
+    workflowAsTool: 'جریان کار به عنوان ابزار',
+    configureRequired: 'پیکربندی مورد نیاز',
+    configure: 'پیکربندی',
+    manageInTools: 'مدیریت در ابزارها',
+    workflowAsToolTip: 'پیکربندی ابزار پس از به‌روزرسانی جریان کار مورد نیاز است.',
+    viewDetailInTracingPanel: 'مشاهده جزئیات',
+    syncingData: 'همگام‌سازی داده‌ها، فقط چند ثانیه',
+    importDSL: 'وارد کردن DSL',
+    importDSLTip: 'پیش‌نویس فعلی بر روی هم نوشته خواهد شد. قبل از وارد کردن، جریان کار را به عنوان نسخه پشتیبان صادر کنید.',
+    backupCurrentDraft: 'پشتیبان‌گیری از پیش‌نویس فعلی',
+    chooseDSL: 'انتخاب فایل DSL(yml)',
+    overwriteAndImport: 'بازنویسی و وارد کردن',
+    importFailure: 'خطا در وارد کردن',
+    importSuccess: 'وارد کردن موفقیت‌آمیز',
+  },
+  env: {
+    envPanelTitle: 'متغیرهای محیطی',
+    envDescription: 'متغیرهای محیطی می‌توانند برای ذخیره اطلاعات خصوصی و اعتبارنامه‌ها استفاده شوند. آنها فقط خواندنی هستند و می‌توانند در حین صادر کردن از فایل DSL جدا شوند.',
+    envPanelButton: 'افزودن متغیر',
+    modal: {
+      title: 'افزودن متغیر محیطی',
+      editTitle: 'ویرایش متغیر محیطی',
+      type: 'نوع',
+      name: 'نام',
+      namePlaceholder: 'نام متغیر',
+      value: 'مقدار',
+      valuePlaceholder: 'مقدار متغیر',
+      secretTip: 'برای تعریف اطلاعات حساس یا داده‌ها، با تنظیمات DSL برای جلوگیری از نشت پیکربندی شده است.',
+    },
+    export: {
+      title: 'آیا متغیرهای محیطی مخفی را صادر کنید؟',
+      checkbox: 'صادر کردن مقادیر مخفی',
+      ignore: 'صادر کردن DSL',
+      export: 'صادر کردن DSL با مقادیر مخفی',
+    },
+  },
+  changeHistory: {
+    title: 'تاریخچه تغییرات',
+    placeholder: 'هنوز تغییری ایجاد نکردید',
+    clearHistory: 'پاک کردن تاریخچه',
+    hint: 'راهنما',
+    hintText: 'عملیات ویرایش شما در تاریخچه تغییرات پیگیری می‌شود که برای مدت این جلسه بر روی دستگاه شما ذخیره می‌شود. این تاریخچه هنگام خروج از ویرایشگر پاک خواهد شد.',
+    stepBackward_one: '{{count}} قدم به عقب',
+    stepBackward_other: '{{count}} قدم به عقب',
+    stepForward_one: '{{count}} قدم به جلو',
+    stepForward_other: '{{count}} قدم به جلو',
+    sessionStart: 'شروع جلسه',
+    currentState: 'وضعیت کنونی',
+    nodeTitleChange: 'عنوان بلوک تغییر کرده است',
+    nodeDescriptionChange: 'توضیحات بلوک تغییر کرده است',
+    nodeDragStop: 'بلوک جابجا شده است',
+    nodeChange: 'بلوک تغییر کرده است',
+    nodeConnect: 'بلوک متصل شده است',
+    nodePaste: 'بلوک چسبانده شده است',
+    nodeDelete: 'بلوک حذف شده است',
+    nodeAdd: 'بلوک اضافه شده است',
+    nodeResize: 'اندازه بلوک تغییر کرده است',
+    noteAdd: 'یادداشت اضافه شده است',
+    noteChange: 'یادداشت تغییر کرده است',
+    noteDelete: 'یادداشت حذف شده است',
+    edgeDelete: 'بلوک قطع شده است',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} الزامی است',
+    authRequired: 'احراز هویت ضروری است',
+    invalidJson: '{{field}} JSON معتبر نیست',
+    fields: {
+      variable: 'نام متغیر',
+      variableValue: 'مقدار متغیر',
+      code: 'کد',
+      model: 'مدل',
+      rerankModel: 'مدل مجدد رتبه‌بندی',
+    },
+    invalidVariable: 'متغیر نامعتبر',
+  },
+  singleRun: {
+    testRun: 'اجرای آزمایشی',
+    startRun: 'شروع اجرا',
+    running: 'در حال اجرا',
+    testRunIteration: 'تکرار اجرای آزمایشی',
+    back: 'بازگشت',
+    iteration: 'تکرار',
+  },
+  tabs: {
+    'searchBlock': 'جستجوی بلوک',
+    'blocks': 'بلوک‌ها',
+    'tools': 'ابزارها',
+    'allTool': 'همه',
+    'builtInTool': 'درون‌ساخت',
+    'customTool': 'سفارشی',
+    'workflowTool': 'جریان کار',
+    'question-understand': 'درک سوال',
+    'logic': 'منطق',
+    'transform': 'تبدیل',
+    'utilities': 'ابزارهای کاربردی',
+    'noResult': 'نتیجه‌ای پیدا نشد',
+  },
+  blocks: {
+    'start': 'شروع',
+    'end': 'پایان',
+    'answer': 'پاسخ',
+    'llm': 'مدل زبان بزرگ',
+    'knowledge-retrieval': 'استخراج دانش',
+    'question-classifier': 'دسته‌بندی سوالات',
+    'if-else': 'IF/ELSE',
+    'code': 'کد',
+    'template-transform': 'الگو',
+    'http-request': 'درخواست HTTP',
+    'variable-assigner': 'تخصیص‌دهنده متغیر',
+    'variable-aggregator': 'تجمع‌دهنده متغیر',
+    'iteration-start': 'شروع تکرار',
+    'iteration': 'تکرار',
+    'parameter-extractor': 'استخراج‌کننده پارامتر',
+  },
+  blocksAbout: {
+    'start': 'پارامترهای اولیه برای راه‌اندازی جریان کار را تعریف کنید',
+    'end': 'پایان و نوع نتیجه یک جریان کار را تعریف کنید',
+    'answer': 'محتوای پاسخ مکالمه چت را تعریف کنید',
+    'llm': 'استفاده از مدل‌های زبان بزرگ برای پاسخ به سوالات یا پردازش زبان طبیعی',
+    'knowledge-retrieval': 'اجازه می‌دهد تا محتوای متنی مرتبط با سوالات کاربر از دانش استخراج شود',
+    'question-classifier': 'شرایط دسته‌بندی سوالات کاربر را تعریف کنید، مدل زبان بزرگ می‌تواند بر اساس توضیحات دسته‌بندی، نحوه پیشرفت مکالمه را تعریف کند',
+    'if-else': 'اجازه می‌دهد تا جریان کار به دو شاخه بر اساس شرایط if/else تقسیم شود',
+    'code': 'اجرای یک قطعه کد Python یا NodeJS برای پیاده‌سازی منطق سفارشی',
+    'template-transform': 'تبدیل داده‌ها به رشته با استفاده از سینتاکس الگوهای Jinja',
+    'http-request': 'اجازه می‌دهد تا درخواست‌های سرور از طریق پروتکل HTTP ارسال شوند',
+    'variable-assigner': 'تجمع متغیرهای چند شاخه‌ای به یک متغیر واحد برای پیکربندی یکپارچه نودهای پایین‌دستی.',
+    'variable-aggregator': 'تجمع متغیرهای چند شاخه‌ای به یک متغیر واحد برای پیکربندی یکپارچه نودهای پایین‌دستی.',
+    'iteration': 'اجرای چندین مرحله روی یک شیء لیست تا همه نتایج خروجی داده شوند.',
+    'parameter-extractor': 'استفاده از مدل زبان بزرگ برای استخراج پارامترهای ساختاری از زبان طبیعی برای فراخوانی ابزارها یا درخواست‌های HTTP.',
+  },
+  operator: {
+    zoomIn: 'بزرگ‌نمایی',
+    zoomOut: 'کوچک‌نمایی',
+    zoomTo50: 'بزرگ‌نمایی به 50%',
+    zoomTo100: 'بزرگ‌نمایی به 100%',
+    zoomToFit: 'تناسب با اندازه',
+  },
+  panel: {
+    userInputField: 'فیلد ورودی کاربر',
+    changeBlock: 'تغییر بلوک',
+    helpLink: 'لینک کمک',
+    about: 'درباره',
+    createdBy: 'ساخته شده توسط',
+    nextStep: 'مرحله بعدی',
+    addNextStep: 'افزودن بلوک بعدی به این جریان کار',
+    selectNextStep: 'انتخاب بلوک بعدی',
+    runThisStep: 'اجرا کردن این مرحله',
+    checklist: 'چک‌لیست',
+    checklistTip: 'اطمینان حاصل کنید که همه مسائل قبل از انتشار حل شده‌اند',
+    checklistResolved: 'تمام مسائل حل شده‌اند',
+    organizeBlocks: 'سازماندهی بلوک‌ها',
+    change: 'تغییر',
+  },
+  nodes: {
+    common: {
+      outputVars: 'متغیرهای خروجی',
+      insertVarTip: 'درج متغیر',
+      memory: {
+        memory: 'حافظه',
+        memoryTip: 'تنظیمات حافظه چت',
+        windowSize: 'اندازه پنجره',
+        conversationRoleName: 'نام نقش مکالمه',
+        user: 'پیشوند کاربر',
+        assistant: 'پیشوند دستیار',
+      },
+      memories: {
+        title: 'حافظه‌ها',
+        tip: 'حافظه چت',
+        builtIn: 'درون‌ساخت',
+      },
+    },
+    start: {
+      required: 'الزامی',
+      inputField: 'فیلد ورودی',
+      builtInVar: 'متغیرهای درون‌ساخت',
+      outputVars: {
+        query: 'ورودی کاربر',
+        memories: {
+          des: 'تاریخچه مکالمات',
+          type: 'نوع پیام',
+          content: 'محتوای پیام',
+        },
+        files: 'لیست فایل‌ها',
+      },
+      noVarTip: 'ورودی‌هایی را که می‌توان در جریان کار استفاده کرد، تنظیم کنید',
+    },
+    end: {
+      outputs: 'خروجی‌ها',
+      output: {
+        type: 'نوع خروجی',
+        variable: 'متغیر خروجی',
+      },
+      type: {
+        'none': 'هیچ',
+        'plain-text': 'متن ساده',
+        'structured': 'ساختاری',
+      },
+    },
+    answer: {
+      answer: 'پاسخ',
+      outputVars: 'متغیرهای خروجی',
+    },
+    llm: {
+      model: 'مدل',
+      variables: 'متغیرها',
+      context: 'متن',
+      contextTooltip: 'می‌توانید دانش را به عنوان متن وارد کنید',
+      notSetContextInPromptTip: 'برای فعال کردن ویژگی متن، لطفاً متغیر متن را در PROMPT پر کنید.',
+      prompt: 'پیشنهاد',
+      roleDescription: {
+        system: 'دستورات سطح بالا برای مکالمه را ارائه دهید',
+        user: 'دستورات، پرسش‌ها، یا هر ورودی متنی را به مدل ارائه دهید',
+        assistant: 'پاسخ‌های مدل بر اساس پیام‌های کاربر',
+      },
+      addMessage: 'افزودن پیام',
+      vision: 'بینایی',
+      files: 'فایل‌ها',
+      resolution: {
+        name: 'وضوح',
+        high: 'بالا',
+        low: 'پایین',
+      },
+      outputVars: {
+        output: 'تولید محتوا',
+        usage: 'اطلاعات استفاده از مدل',
+      },
+      singleRun: {
+        variable: 'متغیر',
+      },
+      sysQueryInUser: 'sys.query در پیام کاربر ضروری است',
+    },
+    knowledgeRetrieval: {
+      queryVariable: 'متغیر جستجو',
+      knowledge: 'دانش',
+      outputVars: {
+        output: 'داده‌های تقسیم‌بندی شده بازیابی',
+        content: 'محتوای تقسیم‌بندی شده',
+        title: 'عنوان تقسیم‌بندی شده',
+        icon: 'آیکون تقسیم‌بندی شده',
+        url: 'URL تقسیم‌بندی شده',
+        metadata: 'سایر متاداده‌ها',
+      },
+    },
+    http: {
+      inputVars: 'متغیرهای ورودی',
+      api: 'API',
+      apiPlaceholder: 'URL را وارد کنید، برای درج متغیر \' / \' را تایپ کنید',
+      notStartWithHttp: 'API باید با http:// یا https:// شروع شود',
+      key: 'کلید',
+      value: 'مقدار',
+      bulkEdit: 'ویرایش دسته‌ای',
+      keyValueEdit: 'ویرایش کلید-مقدار',
+      headers: 'هدرها',
+      params: 'پارامترها',
+      body: 'بدن',
+      outputVars: {
+        body: 'محتوای پاسخ',
+        statusCode: 'کد وضعیت پاسخ',
+        headers: 'فهرست هدر پاسخ JSON',
+        files: 'لیست فایل‌ها',
+      },
+      authorization: {
+        'authorization': 'احراز هویت',
+        'authorizationType': 'نوع احراز هویت',
+        'no-auth': 'هیچ',
+        'api-key': 'کلید API',
+        'auth-type': 'نوع احراز هویت',
+        'basic': 'پایه',
+        'bearer': 'دارنده',
+        'custom': 'سفارشی',
+        'api-key-title': 'کلید API',
+        'header': 'هدر',
+      },
+      insertVarPlaceholder: 'برای درج متغیر \'/\' را تایپ کنید',
+      timeout: {
+        title: 'زمان‌توقف',
+        connectLabel: 'زمان‌توقف اتصال',
+        connectPlaceholder: 'زمان‌توقف اتصال را به ثانیه وارد کنید',
+        readLabel: 'زمان‌توقف خواندن',
+        readPlaceholder: 'زمان‌توقف خواندن را به ثانیه وارد کنید',
+        writeLabel: 'زمان‌توقف نوشتن',
+        writePlaceholder: 'زمان‌توقف نوشتن را به ثانیه وارد کنید',
+      },
+    },
+    code: {
+      inputVars: 'متغیرهای ورودی',
+      outputVars: 'متغیرهای خروجی',
+      advancedDependencies: 'وابستگی‌های پیشرفته',
+      advancedDependenciesTip: 'برخی وابستگی‌های پیش‌بارگذاری شده که زمان بیشتری برای مصرف نیاز دارند یا به طور پیش‌فرض در اینجا موجود نیستند، اضافه کنید',
+      searchDependencies: 'جستجوی وابستگی‌ها',
+    },
+    templateTransform: {
+      inputVars: 'متغیرهای ورودی',
+      code: 'کد',
+      codeSupportTip: 'فقط Jinja2 را پشتیبانی می‌کند',
+      outputVars: {
+        output: 'محتوای تبدیل‌شده',
+      },
+    },
+    ifElse: {
+      if: 'اگر',
+      else: 'در غیر این صورت',
+      elseDescription: 'برای تعریف منطق که باید زمانی که شرط if برآورده نشود، اجرا شود.',
+      and: 'و',
+      or: 'یا',
+      operator: 'عملگر',
+      notSetVariable: 'لطفاً ابتدا متغیر را تنظیم کنید',
+      comparisonOperator: {
+        'contains': 'شامل',
+        'not contains': 'شامل نمی‌شود',
+        'start with': 'شروع با',
+        'end with': 'پایان با',
+        'is': 'است',
+        'is not': 'نیست',
+        'empty': 'خالی است',
+        'not empty': 'خالی نیست',
+        'null': 'خالی',
+        'not null': 'خالی نیست',
+      },
+      enterValue: 'مقدار را وارد کنید',
+      addCondition: 'افزودن شرط',
+      conditionNotSetup: 'شرط تنظیم نشده است',
+      selectVariable: 'متغیر را انتخاب کنید...',
+    },
+    variableAssigner: {
+      title: 'تخصیص متغیرها',
+      outputType: 'نوع خروجی',
+      varNotSet: 'متغیر تنظیم نشده است',
+      noVarTip: 'متغیرهایی را که باید اختصاص داده شوند اضافه کنید',
+      type: {
+        string: 'رشته',
+        number: 'عدد',
+        object: 'شیء',
+        array: 'آرایه',
+      },
+      aggregationGroup: 'گروه تجمع',
+      aggregationGroupTip: 'فعال کردن این ویژگی اجازه می‌دهد تا تجمع‌کننده متغیرها چندین مجموعه متغیر را تجمیع کند.',
+      addGroup: 'افزودن گروه',
+      outputVars: {
+        varDescribe: '{{groupName}} خروجی',
+      },
+      setAssignVariable: 'تعیین متغیر تخصیص یافته',
+    },
+    tool: {
+      toAuthorize: 'برای مجوز دادن',
+      inputVars: 'متغیرهای ورودی',
+      outputVars: {
+        text: 'محتوای تولید شده توسط ابزار',
+        files: {
+          title: 'فایل‌های تولید شده توسط ابزار',
+          type: 'نوع پشتیبانی. در حال حاضر فقط تصاویر پشتیبانی می‌شود',
+          transfer_method: 'روش انتقال. مقدار آن remote_url یا local_file است',
+          url: 'URL تصویر',
+          upload_file_id: 'شناسه فایل آپلود شده',
+        },
+        json: 'json تولید شده توسط ابزار',
+      },
+    },
+    questionClassifiers: {
+      model: 'مدل',
+      inputVars: 'متغیرهای ورودی',
+      outputVars: {
+        className: 'نام کلاس',
+      },
+      class: 'کلاس',
+      classNamePlaceholder: 'نام کلاس خود را بنویسید',
+      advancedSetting: 'تنظیمات پیشرفته',
+      topicName: 'نام موضوع',
+      topicPlaceholder: 'نام موضوع خود را بنویسید',
+      addClass: 'افزودن کلاس',
+      instruction: 'دستورالعمل',
+      instructionTip: 'دستورالعمل‌های اضافی را برای کمک به دسته‌بند سوالات برای درک بهتر نحوه دسته‌بندی سوالات وارد کنید.',
+      instructionPlaceholder: 'دستورالعمل خود را بنویسید',
+    },
+    parameterExtractor: {
+      inputVar: 'متغیر ورودی',
+      extractParameters: 'استخراج پارامترها',
+      importFromTool: 'وارد کردن از ابزارها',
+      addExtractParameter: 'افزودن پارامتر استخراج شده',
+      addExtractParameterContent: {
+        name: 'نام',
+        namePlaceholder: 'نام پارامتر استخراج شده',
+        type: 'نوع',
+        typePlaceholder: 'نوع پارامتر استخراج شده',
+        description: 'توضیحات',
+        descriptionPlaceholder: 'توضیحات پارامتر استخراج شده',
+        required: 'الزامی',
+        requiredContent: 'الزامی فقط به عنوان مرجع برای استنتاج مدل استفاده می‌شود و برای اعتبارسنجی اجباری خروجی پارامتر نیست.',
+      },
+      extractParametersNotSet: 'پارامترهای استخراج شده تنظیم نشده‌اند',
+      instruction: 'دستورالعمل',
+      instructionTip: 'دستورالعمل‌های اضافی را برای کمک به استخراج‌کننده پارامتر برای درک نحوه استخراج پارامترها وارد کنید.',
+      advancedSetting: 'تنظیمات پیشرفته',
+      reasoningMode: 'حالت استدلال',
+      reasoningModeTip: 'می‌توانید حالت استدلال مناسب را بر اساس توانایی مدل برای پاسخ به دستورات برای فراخوانی عملکردها یا پیشنهادات انتخاب کنید.',
+      isSuccess: 'موفقیت‌آمیز است. در صورت موفقیت مقدار 1 و در صورت شکست مقدار 0 است.',
+      errorReason: 'دلیل خطا',
+    },
+    iteration: {
+      deleteTitle: 'حذف نود تکرار؟',
+      deleteDesc: 'حذف نود تکرار باعث حذف تمام نودهای فرزند خواهد شد',
+      input: 'ورودی',
+      output: 'متغیرهای خروجی',
+      iteration_one: '{{count}} تکرار',
+      iteration_other: '{{count}} تکرارها',
+      currentIteration: 'تکرار فعلی',
+    },
+    note: {
+      addNote: 'افزودن یادداشت',
+      editor: {
+        placeholder: 'یادداشت خود را بنویسید...',
+        small: 'کوچک',
+        medium: 'متوسط',
+        large: 'بزرگ',
+        bold: 'پررنگ',
+        italic: 'ایتالیک',
+        strikethrough: 'خط‌خورده',
+        link: 'لینک',
+        openLink: 'باز کردن',
+        unlink: 'حذف لینک',
+        enterUrl: 'URL را وارد کنید...',
+        invalidUrl: 'URL نامعتبر',
+        bulletList: 'فهرست گلوله‌ای',
+        showAuthor: 'نمایش نویسنده',
+      },
+    },
+  },
+  tracing: {
+    stopBy: 'متوقف شده توسط {{user}}',
+  },
+}
+
+export default translation

+ 4 - 0
web/i18n/language.ts

@@ -23,6 +23,7 @@ export type I18nText = {
   'ro-RO': string
   'pl-PL': string
   'hi-IN': string
+  'fa-IR': string
 }
 
 export const languages = data.languages
@@ -50,6 +51,7 @@ export const NOTICE_I18N = {
     uk_UA: 'Важливе повідомлення',
     vi_VN: 'Thông báo quan trọng',
     it_IT: 'Avviso Importante',
+    fa_IR: 'هشدار مهم',
   },
   desc: {
     en_US:
@@ -76,6 +78,8 @@ export const NOTICE_I18N = {
       'Hệ thống của chúng tôi sẽ ngừng hoạt động từ 19:00 đến 24:00 UTC vào ngày 28 tháng 8 để nâng cấp. Nếu có thắc mắc, vui lòng liên hệ với nhóm hỗ trợ của chúng tôi (support@dify.ai). Chúng tôi đánh giá cao sự kiên nhẫn của bạn.',
     tr_TR:
       'Sistemimiz, 28 Ağustos\'ta 19:00 ile 24:00 UTC saatleri arasında güncelleme nedeniyle kullanılamayacaktır. Sorularınız için lütfen destek ekibimizle iletişime geçin (support@dify.ai). Sabrınız için teşekkür ederiz.',
+    fa_IR:
+      'سیستم ما از ساعت 19:00 تا 24:00 UTC در تاریخ 28 اوت برای ارتقاء در دسترس نخواهد بود. برای سؤالات، لطفاً با تیم پشتیبانی ما (support@dify.ai) تماس بگیرید. ما برای صبر شما ارزش قائلیم.',
   },
   href: '#',
 }

+ 7 - 0
web/i18n/languages.json

@@ -132,6 +132,13 @@
       "prompt_name": "Türkçe",
       "example": "Selam!",
       "supported": "true"
+    },
+    {
+      "value": "fa-IR",
+      "name": "Farsi (Iran)",
+      "prompt_name": "Farsi",
+      "example": "سلام, دیفای!",
+      "supported": true
     }
   ]
 }