From f1214f314dbe34db8181c11b27bb0367bd16b798 Mon Sep 17 00:00:00 2001 From: Ased Mammad Date: Tue, 6 Aug 2024 11:49:36 +0330 Subject: [PATCH] i18n: Add persian (farsi) --- src/assets/locale/fa/chrome.json | 13 ++ src/assets/locale/fa/common.json | 88 +++++++ src/assets/locale/fa/knowledge.json | 43 ++++ src/assets/locale/fa/option.json | 12 + src/assets/locale/fa/playground.json | 29 +++ src/assets/locale/fa/settings.json | 328 +++++++++++++++++++++++++++ src/assets/locale/fa/sidepanel.json | 7 + src/entries/options/App.tsx | 9 + src/entries/sidepanel/App.tsx | 8 + src/i18n/index.ts | 5 +- src/i18n/lang/fa.ts | 17 ++ src/i18n/support-language.ts | 4 + src/public/_locales/fa/messages.json | 14 ++ 13 files changed, 576 insertions(+), 1 deletion(-) create mode 100644 src/assets/locale/fa/chrome.json create mode 100644 src/assets/locale/fa/common.json create mode 100644 src/assets/locale/fa/knowledge.json create mode 100644 src/assets/locale/fa/option.json create mode 100644 src/assets/locale/fa/playground.json create mode 100644 src/assets/locale/fa/settings.json create mode 100644 src/assets/locale/fa/sidepanel.json create mode 100644 src/i18n/lang/fa.ts create mode 100644 src/public/_locales/fa/messages.json diff --git a/src/assets/locale/fa/chrome.json b/src/assets/locale/fa/chrome.json new file mode 100644 index 0000000..307388b --- /dev/null +++ b/src/assets/locale/fa/chrome.json @@ -0,0 +1,13 @@ +{ + "heading": "تنظیمات AI کروم", + "status": { + "label": "فعال یا غیر فعال کردن پشتیبانی از AI کروم" + }, + "error": { + "browser_not_supported": "این نسخه از کروم توسط مدل Gemini Nano پشتیبانی نمی شود. لطفا به نسخه ۱۲۷ یا بالاتر به روزرسانی کنید.", + "ai_not_supported": "تنظیم chrome://flags/#prompt-api-for-gemini-nano فعال نشده است. لطفا فعالش کنید..", + "ai_not_ready": "Gemini Nano هنوز آماده نیست; تنظیمات کروم را مجددا بررسی کنید.", + "internal_error": "یک خطای داخلی رخ داد. لطفا بعدا مجددا تلاش نمایید." + }, + "errorDescription": "برای استفاده از AI کروم، به نسخه مرورگر بالاتر از ۱۲۷ احتیاج دارید که اکنون در کانال های Dev و Canary در دسترس است. بعد از دریافت نسخه پشتیبانی شده این گام ها را دنبال کنید: \n\n۱. به `chrome://flags/#prompt-api-for-gemini-nano` بروید و \"Enable\" را انتخاب کنید.\n۲. به `chrome://flags/#optimization-guide-on-device-model` بروید و \"EnabledBypassPrefRequirement\" را انتخاب کنید.\n۳. به `chrome://components` بروید و \"Optimization Guide On Device Model\" را جستجو کنید، بر روی \"Check for Update\" کلیک کنید. این کار مدل را دریافت خواهد کرد. اگر این تنظیمات را نمی بینید، گام های ۱ و ۲ را تکرار و مرورگر را مجددا اجرا کنید." +} diff --git a/src/assets/locale/fa/common.json b/src/assets/locale/fa/common.json new file mode 100644 index 0000000..3c02c21 --- /dev/null +++ b/src/assets/locale/fa/common.json @@ -0,0 +1,88 @@ +{ + "pageAssist": "دستیار صفحه", + "selectAModel": "یک مدل انتخاب کنید", + "save": "ذخیره", + "saved": "ذخیره شد", + "cancel": "لغو", + "retry": "تلاش مجدد", + "share": { + "tooltip": { + "share": "اشتراک گذاری" + }, + "modal": { + "title": "اشتراک گذاری لینک به گپ" + }, + "form": { + "defaultValue": { + "name": "ناشناس", + "title": "گپ بی نام" + }, + "title": { + "label": "عنوان گپ", + "placeholder": "عنوان گپ را وارد کنید", + "required": "وارد کردن عنوان چت الزامی است" + }, + "name": { + "label": "نام شما", + "placeholder": "نام خود را وارد کنید", + "required": "وارد کردن نام الزامی است" + }, + "btn": { + "save": "ایجاد لینک", + "saving": "در حال ایجاد لینک..." + } + }, + "notification": { + "successGenerate": "پیوند در کلیپ بورد کپی شد", + "failGenerate": "پیوند ایجاد نشد" + } + }, + "copyToClipboard": "کپی به کلیپ بورد", + "webSearch": "جستجوی وب", + "regenerate": "ایجاد مجدد", + "edit": "ویرایش", + "saveAndSubmit": "ذخیره و ارسال", + "editMessage": { + "placeholder": "یک پیام وارد کنید..." + }, + "submit": "ارسال", + "noData": "اطلاعاتی وجود ندارد", + "noHistory": "تاریخچه گپ وجود ندارد", + "chatWithCurrentPage": "گپ زدن با این صفحه", + "beta": "بتا", + "tts": "بلند بخوان", + "currentChatModelSettings": "تنظیمات مدل گپ فعلی", + "modelSettings": { + "label": "تنظیمات مدل", + "description": "گزینه های مدل را به صورت کلی برای همه گپ ها تنظیم کنید", + "form": { + "keepAlive": { + "label": "Keep Alive", + "help": "کنترل می کند که چه مدت مدل پس از درخواست در حافظه باقی می ماند (پیش فرض: 5 دقیقه)", + "placeholder": "مدت زمان Keep Alive را وارد کنید (مثلا 5m, 10m, 1h)" + }, + "temperature": { + "label": "Temperature", + "placeholder": "مقدار Temperature را وارد کنید (مثلا 0.7, 1.0)" + }, + "numCtx": { + "label": "Number of Contexts", + "placeholder": "مقدار Number of Contexts را وارد کنید (پیش فرض: 2048)" + }, + "seed": { + "label": "Seed", + "placeholder": "مقدار Seed را وارد کنید (e.g. 1234)", + "help": "تکرارپذیری خروجی مدل" + }, + "topK": { + "label": "Top K", + "placeholder": "مقدار Top K را وارد کنید (مثلا 40, 100)" + }, + "topP": { + "label": "Top P", + "placeholder": "مقدار Top P را وارد کنید (مثلا 0.9, 0.95)" + } + }, + "advanced": "تنظیمات بیشتر مدل" + } +} diff --git a/src/assets/locale/fa/knowledge.json b/src/assets/locale/fa/knowledge.json new file mode 100644 index 0000000..c955226 --- /dev/null +++ b/src/assets/locale/fa/knowledge.json @@ -0,0 +1,43 @@ +{ + "addBtn": "افزودن دانش جدید", + "columns": { + "title": "عنوان", + "status": "وضعیت", + "embeddings": "مدل جاسازی", + "createdAt": "ایجاد شده در", + "action": "اقدامات" + }, + "expandedColumns": { + "name": "نام" + }, + "tooltip": { + "delete": "حذف" + }, + "confirm": { + "delete": "آیا مطمئن هستید که می خواهید این دانش را حذف کنید؟" + }, + "deleteSuccess": "دانش با موفقیت حذف شد", + "status": { + "pending": "انتظار", + "finished": "تمام", + "processing": "در حال پردازش", + "failed": "ناموفق" + }, + "addKnowledge": "دانش را اضافه کنید", + "form": { + "title": { + "label": "عنوان دانش", + "placeholder": "عنوان دانش را وارد کنید", + "required": "وارد کردن عنوان دانش الزامی است" + }, + "uploadFile": { + "label": "آپلود فایل", + "uploadText": "یک فایل را در اینجا بکشید و رها کنید یا برای آپلود کلیک کنید", + "uploadHint": "انواع فایل های پشتیبانی شده: .pdf, .csv, .txt, .md, .docx", + "required": "وارد کردن فایل مورد نیاز است" + }, + "submit": "ارسال", + "success": "دانش با موفقیت اضافه شد" + }, + "noEmbeddingModel": "لطفا ابتدا یک مدل جاسازی را از صفحه تنظیمات RAG اضافه کنید" +} diff --git a/src/assets/locale/fa/option.json b/src/assets/locale/fa/option.json new file mode 100644 index 0000000..9188710 --- /dev/null +++ b/src/assets/locale/fa/option.json @@ -0,0 +1,12 @@ +{ + "newChat": "گپ جدید", + "selectAPrompt": "یک پرامپت را انتخاب کنید", + "githubRepository": "مخزن GitHub", + "settings": "تنظیمات", + "sidebarTitle": "تاریخچه گپ", + "error": "خطا", + "somethingWentWrong": "مشکلی پیش آمد", + "validationSelectModel": "لطفا یک مدل را برای ادامه انتخاب کنید", + "deleteHistoryConfirmation": "آیا مطمئن هستید که می خواهید این تاریخچه را حذف کنید؟", + "editHistoryTitle": "یک عنوان جدید وارد کنید" +} diff --git a/src/assets/locale/fa/playground.json b/src/assets/locale/fa/playground.json new file mode 100644 index 0000000..e9161a7 --- /dev/null +++ b/src/assets/locale/fa/playground.json @@ -0,0 +1,29 @@ +{ + "ollamaState": { + "searching": "در حال جستجوی Ollama شما 🦙", + "running": "Ollama در حال اجرا است 🦙", + "notRunning": "امکان اتصال به Ollama وجود ندارد 🦙", + "connectionError": "به نظر می رسد که خطای اتصال دارید. لطفا برای عیب یابی به این مستندات مراجعه کنید." + }, + "formError": { + "noModel": "لطفا یک مدل را انتخاب کنید", + "noEmbeddingModel": "لطفا یک مدل جاسازی در صفحه تنظیمات > RAG تنظیم کنید" + }, + "form": { + "textarea": { + "placeholder": "یک پیام تایپ کنید..." + }, + "webSearch": { + "on": "روشن", + "off": "خاموش" + } + }, + "tooltip": { + "searchInternet": "جستجوی اینترنت", + "speechToText": "گفتار به متن", + "uploadImage": "آپلود تصویر", + "stopStreaming": "توقف Streaming", + "knowledge": "دانش" + }, + "sendWhenEnter": "با فشار دادن Enter ارسال شود" +} diff --git a/src/assets/locale/fa/settings.json b/src/assets/locale/fa/settings.json new file mode 100644 index 0000000..0cbafdc --- /dev/null +++ b/src/assets/locale/fa/settings.json @@ -0,0 +1,328 @@ +{ + "generalSettings": { + "title": "تنظیمات عمومی", + "settings": { + "heading": "تنظیمات رابط کاربری وب", + "speechRecognitionLang": { + "label": "زبان تشخیص گفتار", + "placeholder": "یک زبان را انتخاب کنید" + }, + "language": { + "label": "زبان", + "placeholder": "یک زبان را انتخاب کنید" + }, + "darkMode": { + "label": "تغییر تم", + "options": { + "light": "روشن", + "dark": "تیره" + } + }, + "copilotResumeLastChat": { + "label": "آخرین گفتگو را هنگام باز کردن SidePanel (Copilot) از سر بگیر" + }, + "hideCurrentChatModelSettings": { + "label": "مخفی کردن تنظیمات مدل گپ فعلی را" + }, + "restoreLastChatModel": { + "label": "بازیابی آخرین مدل استفاده شده برای گپ‌های قبلی" + }, + "sendNotificationAfterIndexing": { + "label": "ارسال نوتیفیکیشن پس از اتمام پردازش پایگاه دانش" + } + }, + "sidepanelRag": { + "heading": "تنظیمات گپ Copilot با وب سایت", + "ragEnabled": { + "label": "چت با وب سایت با استفاده از بردارهای جاسازی" + }, + "maxWebsiteContext": { + "label": "اندازه محتوای وب سایت حالت عادی", + "placeholder": "اندازه محتوا (پیش فرض 4028)" + } + }, + "webSearch": { + "heading": "مدیریت جستجوی وب", + "searchMode": { + "label": "انجام جستجوی ساده اینترنتی" + }, + "provider": { + "label": "موتور جستجو", + "placeholder": "یک موتور جستجو را انتخاب کنید" + }, + "totalSearchResults": { + "label": "مجموع نتایج جستجو", + "placeholder": "کل نتایج جستجو را وارد کنید" + }, + "visitSpecificWebsite": { + "label": "مراجعه به وب سایت ذکر شده در پیام" + } + }, + "system": { + "heading": "تنظیمات سیستم", + "deleteChatHistory": { + "label": "حذف تاریخچه گفتگو", + "button": "حذف", + "confirm": "آیا مطمئن هستید که می خواهید تاریخچه گفتگوهای خود را حذف کنید؟ این عمل قابل برگشت نیست." + }, + "export": { + "label": "تاریخچه گپ، پایگاه دانش و پرامپت‌ها را اکسپورت کنید", + "button": "اکسپورت داده‌ها", + "success": "موفقیت در اکسپورت" + }, + "import": { + "label": "تاریخچه گپ، پایگاه دانش و پرامپت‌ها را ایمپورت کنید", + "button": "ایمپورت داده‌ها", + "success": "موفقیت در ایمپورت", + "error": "خطا در ایمپورت" + } + }, + "tts": { + "heading": "تنظیمات تبدیل متن به گفتار", + "ttsEnabled": { + "label": "فعال کردن تبدیل متن به گفتار" + }, + "ttsProvider": { + "label": "ارائه دهنده تبدیل متن به گفتار", + "placeholder": "یک ارائه دهنده را انتخاب کنید" + }, + "ttsVoice": { + "label": "صدای تبدیل متن به گفتار", + "placeholder": "صدا را انتخاب کنید" + }, + "ssmlEnabled": { + "label": "فعال کردن SSML (Speech Synthesis Markup Language)" + } + } + }, + "manageModels": { + "title": "مدیریت مدل‌ها", + "addBtn": "افزودن مدل جدید", + "columns": { + "name": "نام", + "digest": "هضم", + "modifiedAt": "اصلاح شده در", + "size": "اندازه", + "actions": "اقدامات" + }, + "expandedColumns": { + "parentModel": "مدل والد", + "format": "فرمت", + "family": "خانواده", + "parameterSize": "اندازه پارامترها", + "quantizationLevel": "سطح کوانتیزاسیون" + }, + "tooltip": { + "delete": "حذف مدل", + "repull": "دریافت دوباره مدل" + }, + "confirm": { + "delete": "آیا مطمئن هستید که می خواهید این مدل را حذف کنید؟", + "repull": "آیا مطمئن هستید که می خواهید این مدل را دوباره دریافت کنید؟" + }, + "modal": { + "title": "افزودن مدل جدید", + "placeholder": "نام مدل را وارد کنید", + "pull": "دریافت مدل" + }, + "notification": { + "pullModel": "در حال دریافت مدل", + "pullModelDescription": "در حال دریافت مدل {{modelName}}. برای جزئیات بیشتر، آیکون افزونه را بررسی کنید.", + "success": "موفقیت", + "error": "خطا", + "successDescription": "مدل با موفقیت دریافت شد", + "successDeleteDescription": "مدل با موفقیت حذف شد", + "someError": "مشکلی پیش آمد. لطفا بعدا دوباره امتحان کنید" + } + }, + "managePrompts": { + "title": "مدیریت پرامپت‌ها", + "addBtn": "اضافه کردن پرامپت جدید", + "option1": "عادی", + "option2": "RAG", + "questionPrompt": "سوال پرامپت", + "columns": { + "title": "عنولن", + "prompt": "پرامپت", + "type": "نوع پرامپت", + "actions": "اقدامات" + }, + "systemPrompt": "پرامپت سیستم ", + "quickPrompt": "پرامپت سریع", + "tooltip": { + "delete": "پاک کردن پرامپت", + "edit": "ویرایش پرامپت" + }, + "confirm": { + "delete": "آیا مطمئن هستید که می خواهید این پرامپت را حذف کنید؟ این عمل قابل برگشت نیست." + }, + "modal": { + "addTitle": "اضافه کردن پرامپت جدید", + "editTitle": "ویرایش پرامپت" + }, + "form": { + "title": { + "label": "عنوان", + "placeholder": "پرامپت عالی من", + "required": "لطفا یک عنوان وارد کنید" + }, + "prompt": { + "label": "پرامپت", + "placeholder": "پرامپت وارد کنید", + "required": "لطفا یک پرامپت وارد کنید", + "help": "می توانید از {key} به عنوان متغیر در درخواست خود استفاده کنید." + }, + "isSystem": { + "label": "یک پرامپت سیستمی باشد" + }, + "btnSave": { + "saving": "در حال اضافه کردن پرامپت...", + "save": "اضافه کردن پرامپت" + }, + "btnEdit": { + "saving": "در حال به روزرسانی پرامپت...", + "save": "به روزرسانی پرامپت" + } + }, + "notification": { + "addSuccess": "پرامپت اضافه شد", + "addSuccessDesc": "پرامپت با موفقیت اضافه شد", + "error": "خطا", + "someError": "مشکلی پیش آمد. لطفا بعدا دوباره امتحان کنید", + "updatedSuccess": "پرامپت به روز شد", + "updatedSuccessDesc": "پرامپت با موفقیت به روز شد", + "deletedSuccess": "پرامپت حذف شد", + "deletedSuccessDesc": "پرامپت با موفقیت حذف شد" + } + }, + "manageShare": { + "title": "مدیریت اشتراک گذاری", + "heading": "پیکربندی URL اشتراک گذاری صفحه", + "form": { + "url": { + "label": "آدرس اشتراک گذاری صفحه", + "placeholder": "URL اشتراک گذاری صفحه را وارد کنید", + "required": "لطفا URL اشتراک گذاری صفحه خود را وارد کنید!", + "help": "به دلایل حفظ حریم خصوصی، می توانید اشتراک گذاری صفحه را خودتان میزبانی کنید و URL را در اینجا ارائه دهید. بیشتر بدانید." + } + }, + "webshare": { + "heading": "اشتراک گذاری وب", + "columns": { + "title": "عنوان", + "url": "URL", + "actions": "اقدامات" + }, + "tooltip": { + "delete": "حذف اشتراک گذاری" + }, + "confirm": { + "delete": "آیا مطمئن هستید که می خواهید این اشتراک گذاری را حذف کنید؟ این عمل قابل برگشت نیست." + }, + "label": "مدیریت اشتراک گذاری صفحه", + "description": "ویژگی اشتراک گذاری صفحه را فعال یا غیرفعال کنید" + }, + "notification": { + "pageShareSuccess": "URL اشتراک گذاری صفحه با موفقیت به روز شد", + "someError": "مشکلی پیش آمد. لطفا بعدا دوباره امتحان کنید", + "webShareDeleteSuccess": "اشتراک گذاری وب با موفقیت حذف شد" + } + }, + "ollamaSettings": { + "title": "تنظیمات Ollama", + "heading": "پیکربندی Ollama", + "settings": { + "ollamaUrl": { + "label": "آدرس Ollama", + "placeholder": "URL Ollama را وارد کنید" + }, + "advanced": { + "label": "پیکربندی پیشرفته URL Ollama", + "urlRewriteEnabled": { + "label": "URL مبدا سفارشی را فعال یا غیرفعال کنید" + }, + "rewriteUrl": { + "label": "URL مبدا سفارشی", + "placeholder": "URL مبدا سفارشی را وارد کنید" + }, + "headers": { + "label": "هدرهای سفارشی", + "add": "افزودن هدر", + "key": { + "label": "کلید هدر", + "placeholder": "Authorization" + }, + "value": { + "label": "مقدار هدر", + "placeholder": "Bearer token" + } + }, + "help": "اگر با Ollama در Page Assist مشکل اتصال دارید، می توانید یک URL اصلی سفارشی پیکربندی کنید. برای کسب اطلاعات بیشتر در مورد پیکربندی، اینجا را کلیک کنید." + } + } + }, + "manageSearch": { + "title": "مدیریت جستجوی وب", + "heading": "پیکربندی جستجوی وب" + }, + "about": { + "title": "درباره", + "heading": "درباره", + "chromeVersion": "نسخه دستیار صفحه", + "ollamaVersion": "نسخه Ollama", + "support": "شما می توانید با کمک مالی یا حمایت مالی از طریق پلتفرم های زیر از پروژه Page Assist حمایت کنید:", + "koFi": "پشتیبانی در Ko-fi", + "githubSponsor": "حمایت مالی در GitHub", + "githubRepo": "مخزن GitHub" + }, + "manageKnowledge": { + "title": "مدیریت دانش", + "heading": "پیکربندی پایگاه دانش" + }, + "rag": { + "title": "تنظیمات RAG", + "ragSettings": { + "label": "تنظیمات RAG", + "model": { + "label": "مدل جاسازی", + "required": "لطفا یک مدل را انتخاب کنید", + "help": "به شدت توصیه می شود از مدل های جاسازی مانند `nomic-embed-text` استفاده کنید.", + "placeholder": "یک مدل را انتخاب کنید" + }, + "chunkSize": { + "label": "اندازه تکه", + "placeholder": "اندازه تکه را وارد کنید", + "required": "لطفا اندازه تکه را وارد کنید" + }, + "chunkOverlap": { + "label": "همپوشانی تکه", + "placeholder": "داخل تکه همپوشانی شوید", + "required": "لطفا یک همپوشانی تکه ای وارد کنید" + }, + "totalFilePerKB": { + "label": "محدودیت فایل پیش فرض پایگاه دانش", + "placeholder": "محدودیت فایل پیش فرض را وارد کنید (به عنوان مثال، 10)", + "required": "لطفا محدودیت پیش فرض فایل را وارد کنید" + } + }, + "prompt": { + "label": "پیکربندی پرامپت RAG", + "option1": "عادی", + "option2": "وب", + "alert": "پیکربندی اعلان سیستم در اینجا منسوخ شده است. لطفا از بخش مدیریت پرامپت‌ها برای افزودن یا ویرایش درخواست‌ها استفاده کنید. این بخش در نسخه بعدی حذف خواهد شد", + "systemPrompt": "پرامپت سیستم", + "systemPromptPlaceholder": "پرامپت سیستم را وارد کنید", + "webSearchPrompt": "پرامپت جستجوی وب", + "webSearchPromptHelp": "«{search_results}» را از پرامپت حذف نکنید.", + "webSearchPromptError": "لطفا یک پرامپت جستجوی وب وارد کنید", + "webSearchPromptPlaceholder": "پرامپت جستجوی وب را وارد کنید", + "webSearchFollowUpPrompt": "پرامپت پیگیری جستجوی وب", + "webSearchFollowUpPromptHelp": "«{chat_history}» و «{question}» را از پرامپت حذف نکنید.", + "webSearchFollowUpPromptError": "لطفا پرامپت پیگیری جستجوی وب خود را وارد کنید!", + "webSearchFollowUpPromptPlaceholder": "پرامپت پیگیری جستجوی وب شما" + } + }, + "chromeAiSettings": { + "title": "تنظیمات هوش مصنوعی کروم" + } +} diff --git a/src/assets/locale/fa/sidepanel.json b/src/assets/locale/fa/sidepanel.json new file mode 100644 index 0000000..8ef8579 --- /dev/null +++ b/src/assets/locale/fa/sidepanel.json @@ -0,0 +1,7 @@ +{ + "tooltip": { + "embed": "ممکن است چند دقیقه طول بکشد تا صفحه جاسازی شود. لطفاً منتظر بمانید...", + "clear": "پاک کردن تاریخچه گپ", + "history": "تاریخچه گپ" + } +} diff --git a/src/entries/options/App.tsx b/src/entries/options/App.tsx index 620b183..b385df8 100644 --- a/src/entries/options/App.tsx +++ b/src/entries/options/App.tsx @@ -1,5 +1,6 @@ import { QueryClient, QueryClientProvider } from "@tanstack/react-query" import { MemoryRouter } from "react-router-dom" +import { useEffect } from "react" const queryClient = new QueryClient() import { ConfigProvider, Empty, theme } from "antd" import { StyleProvider } from "@ant-design/cssinjs" @@ -12,6 +13,14 @@ import { PageAssistProvider } from "@/components/Common/PageAssistProvider" function IndexOption() { const { mode } = useDarkMode() const { t, i18n } = useTranslation() + + useEffect(() => { + if (i18n.resolvedLanguage) { + document.documentElement.lang = i18n.resolvedLanguage; + document.documentElement.dir = i18n.dir(i18n.resolvedLanguage); + } + }, [i18n, i18n.resolvedLanguage]); + return ( { + if (i18n.resolvedLanguage) { + document.documentElement.lang = i18n.resolvedLanguage; + document.documentElement.dir = i18n.dir(i18n.resolvedLanguage); + } + }, [i18n, i18n.resolvedLanguage]); + return (