From ad1d5af7492337d780e4104024298f3d536acc08 Mon Sep 17 00:00:00 2001 From: SandObserver <260779319+SandObserver@users.noreply.github.com> Date: Thu, 15 Oct 2026 21:41:04 -0400 Subject: [PATCH] Use everyday Persian wording and drop Arabic marks from Persian text --- ui/i18n/fa.json | 172 +++++++++++------------ ui/test/i18n-coverage.test.mjs | 22 ++- ui/widgets/backup/i18n/fa.json | 12 +- ui/widgets/books/i18n/fa.json | 6 +- ui/widgets/clock/i18n/fa.json | 8 +- ui/widgets/connections/i18n/fa.json | 18 +-- ui/widgets/dashboard-switch/i18n/fa.json | 10 +- ui/widgets/disk-health/i18n/fa.json | 14 +- ui/widgets/dns/i18n/fa.json | 10 +- ui/widgets/github/i18n/fa.json | 18 +-- ui/widgets/nowplaying/i18n/fa.json | 6 +- ui/widgets/system-summary/i18n/fa.json | 30 ++-- ui/widgets/weather/i18n/fa.json | 4 +- 13 files changed, 175 insertions(+), 155 deletions(-) diff --git a/ui/i18n/fa.json b/ui/i18n/fa.json index 33792833..76052143 100644 --- a/ui/i18n/fa.json +++ b/ui/i18n/fa.json @@ -5,7 +5,7 @@ }, "nav": { "general": "عمومی", - "appearance": "ظاهری", + "appearance": "ظاهر", "dashboard": "داشبورد", "about": "درباره", "sections": "بخش‌های تنظیمات", @@ -27,7 +27,7 @@ "hidePassword": "پنهان کردن رمز عبور", "edit": "ویرایش", "color": "رنگ", - "create": "ساختن", + "create": "ساخت", "chooseFiles": "انتخاب فایل‌ها", "configured": "تنظیم‌شده", "notSet": "تنظیم نشده", @@ -46,19 +46,19 @@ "allowedHostsTip": "تا وقتی رمز عبوری تعیین نشده، Stackyard فقط در آدرس‌های IP، نام‌های محلی مانند nas یا nas.local و آدرس‌های این فهرست پاسخ می‌دهد. آن‌ها را با ویرگول جدا کنید.", "monitoring": "نظارت", "loggingLevel": "سطح گزارش", - "dockerHealth": "بررسی سلامت کانتینرهای داکر", + "dockerHealth": "بررسی سلامت کانتینرهای Docker", "hideHealthy": "پنهان کردن وضعیت سلامت", "socketUrl": "آدرس سوکت", "loggingTip": "با تنظیم روی «خطاها» تنها هشدارها و خطاها ثبت می‌شوند. رویدادهای امنیتی همیشه ثبت می‌شوند.", - "socketTip": "از آدرس یک کانتینر پراکسی سوکت استفاده کنید، نه خود سوکت داکر. نامی مانند http://socket-proxy:2375 تنها زمانی کار می‌کند که این کانتینر و پراکسی در یک شبکه داکر باشند؛ آدرس آی‌پی تنها زمانی کار می‌کند که پراکسی درگاه خود را فراتر از لوپ‌بک میزبان منتشر کند.", + "socketTip": "از آدرس یک کانتینر پراکسی سوکت استفاده کنید، نه خود سوکت Docker. نامی مانند http://socket-proxy:2375 فقط زمانی کار می‌کند که این کانتینر و پراکسی در یک شبکه Docker باشند؛ آدرس IP فقط زمانی کار می‌کند که پراکسی درگاه خود را بیرون از لوپ‌بک میزبان منتشر کند.", "security": "امنیت", - "signOutEverywhereTip": "همهٔ مرورگرها و دستگاه‌ها، از جمله همین دستگاه، خارج می‌شوند. اگر گمان می‌کنید نشستی باز مانده یا لو رفته است از آن استفاده کنید. رمز عبور شما تغییر نمی‌کند.", + "signOutEverywhereTip": "از حساب همه مرورگرها و دستگاه‌ها، از جمله همین دستگاه، خارج می‌شوید. اگر فکر می‌کنید نشستی باز مانده یا لو رفته است، از آن استفاده کنید. رمز عبور شما تغییر نمی‌کند.", "signOutEverywhereBtn": "خروج از همه", - "signOutEverywhere": "خروج از همهٔ دستگاه‌ها", + "signOutEverywhere": "خروج از همه دستگاه‌ها", "passwordProtection": "محافظت با رمز عبور", "password": "رمز عبور", "currentPassword": "رمز عبور فعلی", - "passwordTip": "برای حفظ رمز عبور فعلی، این قسمت را خالی بگذارید. حداقل ۸ نویسه. برای محافظت قوی‌تر، قرار دادن داشبورد پشت یک پراکسی احراز هویت اختصاصی را در نظر بگیرید. این رمز عبور داخلی یک محافظ سبک است، نه یک لایه کامل احراز هویت.", + "passwordTip": "برای حفظ رمز عبور فعلی، این قسمت را خالی بگذارید. حداقل ۸ کاراکتر. برای محافظت قوی‌تر، قرار دادن داشبورد پشت یک پراکسی احراز هویت اختصاصی را در نظر بگیرید. این رمز عبور داخلی یک محافظ سبک است، نه یک لایه کامل احراز هویت.", "backup": "پشتیبان‌گیری", "importExport": "وارد کردن / خروجی گرفتن", "signOut": "خروج از حساب", @@ -67,7 +67,7 @@ "logDebug": "اشکال‌زدایی", "logInfo": "اطلاعات", "logError": "خطاها", - "passwordPh": "رمز عبور جدید (حداقل ۸ نویسه)", + "passwordPh": "رمز عبور جدید (حداقل ۸ کاراکتر)", "showSettingsAria": "نمایش تنظیمات در داشبورد", "hideSettingsAria": "پنهان کردن تنظیمات در داشبورد", "importJson": "وارد کردن JSON پیکربندی", @@ -83,18 +83,18 @@ "typeToSearch": "جستجو با تایپ", "typeToSearchTip": "تایپ هر حرف در هر جای داشبورد، جستجو را باز می‌کند. اگر جستجو ناخواسته باز می‌شود، برای مثال هنگام کنترل صوتی، این گزینه را خاموش کنید.", "displayMode": "حالت نمایش", - "displayModeTip": "ظاهر داشبورد و صفحه‌های تنظیمات را تعیین می‌کند. در همین مرورگر ذخیره می‌شود، فقط روی همین دستگاه اعمال می‌شود و بی‌درنگ اثر می‌گذارد.", + "displayModeTip": "ظاهر داشبورد و صفحه‌های تنظیمات را تعیین می‌کند. در همین مرورگر ذخیره می‌شود، فقط روی همین دستگاه اعمال می‌شود و بلافاصله اثر می‌گذارد.", "displaySystem": "پیش‌فرض سیستم", "displayLight": "روشن", "displayDark": "تیره", "wallpaper": "تصویر زمینه", "source": "منبع", "unsplashKey": "کلید API", - "collectionId": "شناسهٔ مجموعه", + "collectionId": "شناسه مجموعه", "imageUrl": "آدرس تصویر", "color": "رنگ", "brightness": "روشنایی", - "collectionTip": "برای تصاویر تصادفی، شناسهٔ مجموعه را خالی بگذارید.", + "collectionTip": "برای تصاویر تصادفی، شناسه مجموعه را خالی بگذارید.", "sourceUnsplash": "Unsplash", "sourceUrl": "تصویر", "sourceColor": "رنگ یکدست", @@ -102,14 +102,14 @@ "image": "تصویر", "noImage": "بدون تصویر", "fit": "اندازه", - "fitFill": "پرکردن", + "fitFill": "پر کردن", "fitContain": "جا دادن", "uploading": "در حال بارگذاری…", "imageTip": "تصویرهای بارگذاری‌شده و پیوندشده روی همین سرور ذخیره و از همان‌جا ارائه می‌شوند.", "customColor": "رنگ دلخواه", "colorCode": "کد رنگ", "colorCodePh": "#rrggbb یا هر رنگ CSS", - "hue": "فام", + "hue": "رنگ‌مایه", "saturation": "اشباع" }, "about": { @@ -127,7 +127,7 @@ "filterApps": "برنامه‌ها", "filterWidgets": "ویجت‌ها", "filterFolders": "پوشه‌ها", - "filterByType": "پالایش بر پایهٔ نوع" + "filterByType": "فیلتر بر اساس نوع" }, "type": { "addNew": "افزودن جدید", @@ -148,9 +148,9 @@ "moveTo": "انتقال «{name}» به پوشه", "addApp": "افزودن برنامه به پوشه", "none": "بدون پوشه", - "allInFolder": "همهٔ برنامه‌ها از پیش در این پوشه هستند.", - "createNew": "ساخت پوشه تازه", - "expandAria": "باز کردن پوشه {name}", + "allInFolder": "همه برنامه‌ها از قبل در این پوشه هستند.", + "createNew": "ساخت پوشه جدید", + "expandAria": "بازکردن پوشه {name}", "collapseAria": "بستن پوشه {name}", "appsCount_one": "{count} برنامه", "appsCount_other": "{count} برنامه" @@ -171,7 +171,7 @@ "iconResults": "پیشنهادهای آیکون", "iconResultCount_one": "{count} آیکون پیدا شد", "iconResultCount_other": "{count} آیکون پیدا شد", - "iconVariant": "گونه", + "iconVariant": "حالت", "iconVariantBase": "پیش‌فرض", "iconVariantLight": "روشن", "iconVariantDark": "تیره", @@ -179,7 +179,7 @@ "dockFull": "داک پر است ({max}/{max}). ابتدا یک برنامه را حذف کنید.", "badge": "نشان", "healthCheck": "بررسی سلامت", - "healthGlobalOff": "بررسی کانتینر به روشن‌بودن بررسی سلامت کانتینرهای داکر در عمومی نیاز دارد. بررسی آدرس اینترنتی بدون آن هم کار می‌کند.", + "healthGlobalOff": "برای بررسی کانتینر، «بررسی سلامت کانتینرهای Docker» باید در بخش «عمومی» روشن باشد. بررسی آدرس بدون آن هم کار می‌کند.", "type": "نوع", "container": "کانتینر", "ping": "پینگ", @@ -189,36 +189,36 @@ "test": "تست", "fixedLabel": "برچسب ثابت", "labelText": "متن برچسب", - "labelPh": "مثلاً Backup", + "labelPh": "مثلا Backup", "liveActivity": "فعالیت زنده", "apiUrl": "آدرس API", "apiUrlPh": "http://container-name:port/api/v2", "fetch": "دریافت", "value": "مقدار", "authentication": "احراز هویت", - "addToHeader": "افزودن به سربرگ", + "addToHeader": "افزودن به هدر", "unit": "واحد", - "unitPh": "مثلاً GB", + "unitPh": "مثلا GB", "badgeMin": "نمایش از", - "badgeMinPh": "مثلاً ۵", - "combineValues": "نمایش به‌صورت یک نشان واحد", - "combineTip": "مقادیر همهٔ برچسب‌ها با هم جمع و به‌صورت یک عدد نمایش داده می‌شود. برای نمایش یک برچسب در هر لحظه، این گزینه را خاموش کنید؛ نمایش از بالاترین برچسب فهرست که مقداری برای گزارش دارد آغاز می‌شود.", + "badgeMinPh": "مثلا ۵", + "combineValues": "نمایش در یک نشان", + "combineTip": "مقادیر همه برچسب‌ها با هم جمع و به‌صورت یک عدد نمایش داده می‌شود. برای نمایش یک برچسب در هر لحظه، این گزینه را خاموش کنید؛ نمایش از بالاترین برچسب فهرست که مقداری برای گزارش دارد آغاز می‌شود.", "labelN": "برچسب {n}", "moveUp": "انتقال برچسب به بالا", "moveDown": "انتقال برچسب به پایین", "optional": "اختیاری", "addLabel": "افزودن برچسب", "removeLabel": "حذف برچسب", - "labelValueTaken": "این مقدار پیش‌تر در برچسب دیگری استفاده شده است.", - "noValuesLeft": "هر مقدار دریافت‌شده از پیش یک برچسب دارد.", + "labelValueTaken": "این مقدار قبلا در برچسب دیگری استفاده شده است.", + "noValuesLeft": "هر مقدار دریافت‌شده از قبل یک برچسب دارد.", "labelMax_one": "هر نشان حداکثر {count} برچسب نمایش می‌دهد.", "labelMax_other": "هر نشان حداکثر {count} برچسب نمایش می‌دهد.", - "labelOrderTip": "نشان، نخستین برچسب این فهرست را که به آستانه‌اش می‌رسد نمایش می‌دهد. برای تغییر ترتیب بکشید.", + "labelOrderTip": "نشان، اولین برچسب این فهرست را که به آستانه‌اش برسد نمایش می‌دهد. برای تغییر ترتیب بکشید.", "labelsSaved_one": "{count} برچسب ذخیره شد", "labelsSaved_other": "{count} برچسب ذخیره شد", "poll": "بررسی دوره‌ای", - "allowSelfSigned": "مجاز بودن گواهی خودامضا", - "selfSignedTip": "صرف‌نظر کردن از تأیید TLS برای آدرس‌های این برنامه. این کار ناامن است و فقط زمانی باید انجام شود که ریسک‌های آن را کاملاً درک کرده‌اید.", + "allowSelfSigned": "پذیرش گواهی خودامضا", + "selfSignedTip": "صرف‌نظر کردن از تایید TLS برای آدرس‌های این برنامه. این کار ناامن است و فقط زمانی باید انجام شود که ریسک‌های آن را کاملا درک کرده‌اید.", "dockPill": "داک", "healthPill": "سلامت", "badgePill": "نشان", @@ -234,7 +234,7 @@ "headerKeyPh": "کلید", "addToUrl": "افزودن به آدرس", "queryParams": "(پارامترهای پرس‌وجو)", - "secretTip": "ذخیرهٔ این مقدار به‌عنوان اعتبارنامه: پس از ذخیره پنهان می‌شود و هرگز خروجی گرفته نمی‌شود. برداشتن تیک، مقدار ذخیره‌شده را پاک می‌کند.", + "secretTip": "ذخیره این مقدار به‌عنوان اعتبارنامه: پس از ذخیره پنهان می‌شود و هرگز خروجی گرفته نمی‌شود. برداشتن تیک، مقدار ذخیره‌شده را پاک می‌کند.", "reachable": "در دسترس ({status})", "httpError": "خطای HTTP {status}", "connectedNoValues": "متصل شد، هیچ مقدار عددی یافت نشد", @@ -245,48 +245,48 @@ }, "adminError": { "sessionExpired": "نشست شما منقضی شده است. برای ادامه دوباره وارد شوید.", - "authRequired": "احراز هویت لازم است. کلید «احراز هویت» زیر را روشن کنید و کلید API خود را وارد کنید.", + "authRequired": "احراز هویت لازم است. گزینه «احراز هویت» را در پایین روشن کنید و کلید API خود را وارد کنید.", "unreachable": "این آدرس از داخل Docker در دسترس نیست. نام کانتینر را امتحان کنید.", "privateAddress": "بیشتر سرویس‌های هوم‌لب روی IP خصوصی قرار دارند. ALLOW_PRIVATE_IPS=true را تنظیم کنید و کانتینر را دوباره راه‌اندازی کنید.", - "retype": "این پیکربندی پس از ذخیره تغییر کرده است، بنابراین اعتبارنامهٔ ذخیره‌شده استفاده نشد. برای آزمودن این تنظیمات، اعتبارنامه را وارد کنید.", + "retype": "این پیکربندی پس از ذخیره تغییر کرده است، بنابراین اعتبارنامه ذخیره‌شده استفاده نشد. برای تست این تنظیمات، اعتبارنامه را وارد کنید.", "redirect": "این آدرس با یک تغییر مسیر پاسخ داد (HTTP {status}). آدرسی را که به آن اشاره می‌کند وارد کنید.", "responseTooLarge": "پاسخ سرویس بزرگ‌تر از آن است که کامل خوانده شود. از مسیری در API استفاده کنید که داده کمتری برمی‌گرداند.", - "tlsIgnored": "گواهی قابل تأیید نبود. پذیرش گواهی خودامضا فقط برای آدرس‌های شبکهٔ خودتان کاربرد دارد، پس اینجا استفاده نشد.", - "tlsUntrusted": "گواهی این سرویس قابل تأیید نبود.", + "tlsIgnored": "گواهی قابل تایید نبود. پذیرش گواهی خودامضا فقط برای آدرس‌های شبکه خودتان کاربرد دارد، پس اینجا استفاده نشد.", + "tlsUntrusted": "گواهی این سرویس قابل تایید نبود.", "genericBlocked": "درخواست مسدود شد.", "genericUpstream": "سرویس خطا برگرداند.", "genericInvalid": "درخواست معتبر نبود.", "genericInternal": "مشکلی پیش آمد.", "statusNotFound": "سرویس پاسخ داد، اما چیزی در آن آدرس نیست (HTTP {status}).", "statusMethod": "سرویس آن روش درخواست را نپذیرفت (HTTP {status}).", - "statusProxyAuth": "یک پروکسی در مسیر به اعتبارنامه نیاز دارد (HTTP {status}).", + "statusProxyAuth": "یک پراکسی در مسیر به اعتبارنامه نیاز دارد (HTTP {status}).", "statusServer": "سرویس خطای داخلی گزارش کرد (HTTP {status}).", "statusOther": "سرویس با خطا پاسخ داد (HTTP {status}).", - "readOnly": "ذخیره کردن در نسخهٔ نمایشی آنلاین غیرفعال است.", + "readOnly": "ذخیره کردن در نسخه نمایشی آنلاین غیرفعال است.", "fileType": "این نوع فایل پشتیبانی نمی‌شود.", "invalidUrl": "این یک آدرس http یا https معتبر نیست.", "socketRefused": "پراکسی سوکت درخواست را رد کرد.", - "notSocketProxy": "چیزی در آن آدرس پاسخ داد، اما پراکسی سوکت داکر نیست.", + "notSocketProxy": "چیزی در آن آدرس پاسخ داد، اما پراکسی سوکت Docker نیست.", "noConnection": "اتصال برقرار نشد.", - "duplicateId": "دو مورد شناسهٔ یکسان {id} دارند. هر مورد به شناسهٔ خودش نیاز دارد.", - "missingChildren": "پوشهٔ {id} به مواردی اشاره می‌کند که در فایل نیستند.", - "badChildren": "پوشهٔ {id} محتوایش را به شکلی فهرست کرده که Stackyard نمی‌تواند بخواند.", + "duplicateId": "دو مورد شناسه یکسان {id} دارند. هر مورد به شناسه خودش نیاز دارد.", + "missingChildren": "پوشه {id} به مواردی اشاره می‌کند که در فایل نیستند.", + "badChildren": "پوشه {id} محتوایش را به شکلی فهرست کرده که Stackyard نمی‌تواند بخواند.", "unsafeLink": "مورد {id} پیوندی دارد که مجاز نیست. پیوندها باید از http یا https استفاده کنند.", "refused": "میزبان اتصال را رد کرد. درگاه را بررسی کنید.", "hostNotFound": "نام میزبان پیدا نشد.", "hostUnreachable": "میزبان در شبکه در دسترس نیست.", "connectionReset": "سرویس پیش از پاسخ دادن اتصال را بست.", "notHttp": "سرویس با HTTP پاسخ نداد. http یا https و درگاه را بررسی کنید.", - "selfSigned": "این سرویس از گواهی خودامضا استفاده می‌کند. برای پذیرفتن آن، «مجاز بودن گواهی خودامضا» را روشن کنید.", - "selfSignedPublic": "این سرویس از گواهی خودامضا استفاده می‌کند. پذیرش گواهی خودامضا فقط برای آدرس‌های شبکهٔ خودتان کاربرد دارد.", + "selfSigned": "این سرویس از گواهی خودامضا استفاده می‌کند. برای پذیرفتن آن، «پذیرش گواهی خودامضا» را روشن کنید.", + "selfSignedPublic": "این سرویس از گواهی خودامضا استفاده می‌کند. پذیرش گواهی خودامضا فقط برای آدرس‌های شبکه خودتان کاربرد دارد.", "tlsExpired": "گواهی این سرویس منقضی شده است.", "timedOut": "سرویس به‌موقع پاسخ نداد.", - "demoOutbound": "بررسی‌ها در نسخهٔ نمایشی آنلاین غیرفعال‌اند." + "demoOutbound": "بررسی‌ها در نسخه نمایشی آنلاین غیرفعال‌اند." }, "home": { "search": "جستجو", "searchPh": "جستجو…", - "homeScreen": "صفحهٔ خانه", + "homeScreen": "صفحه اصلی", "dock": "داک", "searchDialog": "جستجو", "searchInput": "جستجوی برنامه‌ها و پوشه‌ها", @@ -304,20 +304,20 @@ "opensSettings": "تنظیمات را باز می‌کند", "loadFailed": "پیکربندی داشبورد بارگذاری نشد.", "emptyTitle": "داشبورد شما خالی است", - "emptyBody": "برای ساختن صفحهٔ خانه، برنامه‌ها، پوشه‌ها و ویجت‌های خود را اضافه کنید.", - "emptyAction": "باز کردن تنظیمات", - "emptyImportLink": "وارد کردن نسخهٔ پشتیبان یا پیکربندی Homepage یا Dashy" + "emptyBody": "برای ساختن صفحه اصلی، برنامه‌ها، پوشه‌ها و ویجت‌های خود را اضافه کنید.", + "emptyAction": "بازکردن تنظیمات", + "emptyImportLink": "وارد کردن نسخه پشتیبان یا پیکربندی Homepage یا Dashy" }, "configRecovery": { "title": "Stackyard نمی‌تواند از فایل تنظیمات خود استفاده کند", "whyCorrupt": "فایل تنظیمات {file} آسیب دیده است و دیگر تنظیمات معتبری ندارد.", - "whyUnreadable": "فایل تنظیمات {file} وجود دارد، اما Stackyard اجازهٔ خواندن آن را ندارد.", + "whyUnreadable": "فایل تنظیمات {file} وجود دارد، اما Stackyard اجازه خواندن آن را ندارد.", "locked": "چیزی تغییر نکرد یا حذف نشد. ورود و ذخیره تا وقتی فایل درست شود غیرفعال می‌مانند تا کسی نتواند تنظیمات یا رمز عبور شما را جایگزین کند.", "stepsTitle": "برای رفع مشکل، روی سرور", - "stepRepairBackup": "در پوشهٔ داده، نسخهٔ پشتیبان {backup} را باز کنید. خطا را برطرف کنید و آن را با نام {file} ذخیره کنید.", - "stepRepair": "در پوشهٔ داده، {file} را باز کنید و خطا را برطرف کنید.", + "stepRepairBackup": "در پوشه داده، نسخه پشتیبان {backup} را باز کنید. خطا را برطرف کنید و آن را با نام {file} ذخیره کنید.", + "stepRepair": "در پوشه داده، {file} را باز کنید و خطا را برطرف کنید.", "stepExport": "یا {file} را با فایلی جایگزین کنید که با خروجی ذخیره کرده‌اید. خروجی رمز عبور ندارد. بلافاصله در تنظیمات دوباره یک رمز عبور تعیین کنید.", - "stepPermissions": "به کاربر کانتینر اجازهٔ خواندن و نوشتن {file} را در پوشهٔ داده بدهید.", + "stepPermissions": "به کاربر کانتینر اجازه خواندن و نوشتن {file} را در پوشه داده بدهید.", "stepStartOver": "برای شروع دوباره بدون هیچ تنظیمی، {file} را حذف کنید. پس از آن راه‌اندازی اولیه اجرا می‌شود.", "stepCheck": "روی «بررسی دوباره» بزنید.", "checkAgain": "بررسی دوباره", @@ -328,9 +328,9 @@ "hostBlock": { "title": "Stackyard در این آدرس پاسخ نمی‌دهد", "why": "رمز عبوری تعیین نشده است، بنابراین Stackyard فقط در آدرس‌های IP، نام‌های محلی و آدرس‌هایی که مجاز کرده‌اید پاسخ می‌دهد. {host} جزو آن‌ها نیست.", - "safe": "این کار نمی‌گذارد صفحه‌های سایت‌های دیگر آدرس خود را به Stackyard برگردانند و تنظیمات شما را تغییر دهند.", + "safe": "این کار نمی‌گذارد سایت‌های دیگر آدرس خود را به Stackyard وصل کنند و تنظیمات شما را تغییر دهند.", "stepsTitle": "برای رفع مشکل", - "stepOpen": "Stackyard را با آدرس IP آن یا با آدرسی که قبلاً مجاز کرده‌اید باز کنید.", + "stepOpen": "Stackyard را با آدرس IP آن یا با آدرسی که قبلا مجاز کرده‌اید باز کنید.", "stepAllow": "در تنظیمات، بخش عمومی، {host} را به آدرس‌های مجاز اضافه و ذخیره کنید.", "stepPassword": "یا در تنظیمات یک رمز عبور تعیین کنید. با رمز عبور، Stackyard در هر آدرس پاسخ می‌دهد.", "stillBlocked": "این آدرس هنوز مجاز نیست." @@ -339,7 +339,7 @@ "saved": "ذخیره شد", "saveFailed": "ذخیره ناموفق بود: {err}", "allowedHostInvalid": "آدرس معتبر نیست: {host}", - "allowedHostsKeepCurrent": "{host} را در آدرس‌های مجاز نگه دارید، وگرنه این صفحه دیگر کار نمی‌کند. برای حذف آن از آدرس دیگری استفاده کنید.", + "allowedHostsKeepCurrent": "آدرس {host} را در آدرس‌های مجاز نگه دارید، وگرنه این صفحه دیگر کار نمی‌کند. برای حذف آن، از آدرس دیگری استفاده کنید.", "allowedHostsTooMany": "تعداد آدرس‌ها بیش از حد است. حداکثر {max} آدرس مجاز است.", "colorInvalid": "این یک رنگ نیست. از #rrggbb یا نام رنگ CSS استفاده کنید.", "imported": "وارد شد", @@ -351,22 +351,22 @@ "currentPasswordWrong": "رمز عبور فعلی نادرست است.", "passwordChangedElsewhere": "رمز عبور در جای دیگری تغییر کرده است. صفحه را دوباره بارگذاری کنید و دوباره امتحان کنید.", "dashboardChangedElsewhere": "داشبورد در جای دیگری تغییر کرده است. صفحه را دوباره بارگذاری کنید و دوباره امتحان کنید.", - "tooManyAttempts": "تلاش‌های بیش از حد. بعداً دوباره امتحان کنید.", - "sessionsRevoked": "همهٔ دستگاه‌ها خارج شدند.", + "tooManyAttempts": "تعداد تلاش‌ها بیش از حد است. بعدا دوباره امتحان کنید.", + "sessionsRevoked": "همه دستگاه‌ها از حساب خارج شدند.", "authNeedsPassword": "پیش از فعال‌سازی احراز هویت، یک رمز عبور تعیین کنید.", "importForeignDone": "وارد کردن پایان یافت. برنامه‌ها: {apps}. پوشه‌ها: {folders}.", "importForeignNothing": "در این فایل‌ها چیزی برای وارد کردن نیست.", - "importYamlUnsupported": "{file}: خط {line} از YAML استفاده می‌کند که وارد کردن نمی‌تواند آن را بخواند.", - "importUnknownFormat": "{file} پیکربندی gethomepage یا Dashy نیست.", - "importTooLarge": "{file} برای وارد کردن بیش از حد مورد دارد.", - "secretsWithheld": "اعتبارنامه را دوباره وارد کنید برای: {items}. نگه داشته نشد، چون درخواستِ مربوط به آن تغییر کرده است.", - "socketUrlMissing": "آدرس پراکسی سوکت را وارد کنید یا پایش داکر را خاموش کنید.", + "importYamlUnsupported": "فایل {file}: YAML در خط {line} قابل خواندن نیست.", + "importUnknownFormat": "فایل {file} پیکربندی gethomepage یا Dashy نیست.", + "importTooLarge": "فایل {file} موارد زیادی برای وارد کردن دارد.", + "secretsWithheld": "اعتبارنامه این موارد را دوباره وارد کنید: {items}. چون درخواست مربوط به آن تغییر کرده، نگه داشته نشد.", + "socketUrlMissing": "آدرس پراکسی سوکت را وارد کنید یا نظارت Docker را خاموش کنید.", "socketUrlBad": "پراکسی سوکت ذخیره نشد: {reason}", "socketUrlUnverified": "ذخیره شد، اما پراکسی سوکت پاسخ نداد: {reason}", - "socketHintSharedNetwork": "این نام را داکر تنها برای کانتینرهایی که در یک شبکه مشترک هستند پاسخ می‌دهد. هر دو را در یک شبکه بگذارید یا از آدرسی استفاده کنید که پراکسی منتشر می‌کند.", - "socketHintPublishPort": "هیچ پاسخی از آن آدرس نیامد. پراکسی سوکتی که روی لوپ‌بک میزبان منتشر شده از درون کانتینر در دسترس نیست؛ آن را روی آدرس پل داکر منتشر کنید یا هر دو کانتینر را در یک شبکه مشترک بگذارید و از نام پراکسی استفاده کنید.", + "socketHintSharedNetwork": "این نام را Docker فقط برای کانتینرهایی پاسخ می‌دهد که در یک شبکه مشترک هستند. هر دو را در یک شبکه بگذارید یا از آدرسی استفاده کنید که پراکسی منتشر می‌کند.", + "socketHintPublishPort": "هیچ پاسخی از آن آدرس نیامد. پراکسی سوکتی که روی لوپ‌بک میزبان منتشر شده، از داخل کانتینر در دسترس نیست؛ آن را روی آدرس پل Docker منتشر کنید یا هر دو کانتینر را در یک شبکه مشترک بگذارید و از نام پراکسی استفاده کنید.", "wallpaperStored": "تصویر زمینه روی این سرور ذخیره شد.", - "wallpaperFailed": "تصویر زمینه ناموفق بود: {err}", + "wallpaperFailed": "تنظیم تصویر زمینه ناموفق بود: {err}", "wallpaperUnavailable": "تصویر زمینه بارگذاری نشد.", "imageTooLarge": "این تصویر برای سرور بیش از حد بزرگ است.", "updated": "به‌روزرسانی شد", @@ -376,25 +376,25 @@ "nameRequired": "نام لازم است", "fieldRequired": "{field} لازم است", "configLoadFailed": "پیکربندی بارگذاری نشد. آیا کانتینر API در حال اجراست؟ ({err})", - "uploaded": "{name} بارگذاری شد", + "uploaded": "فایل {name} بارگذاری شد", "uploadFailed": "بارگذاری ناموفق بود: {err}", "importNotStackyard": "این فایل خروجی Stackyard نیست.", - "importIdTaken": "{name} از قبل در داشبورد هست. صفحه را دوباره بارگذاری کنید و دوباره وارد کنید." + "importIdTaken": "مورد {name} از قبل در داشبورد هست. صفحه را دوباره بارگذاری کنید و بعد وارد کنید." }, "confirm": { "deleteFolder": "پوشه «{name}» حذف شود؟ برنامه‌های داخل آن حذف نخواهند شد.", - "revokeSessions": "از همهٔ دستگاه‌ها، از جمله همین دستگاه، خارج شوم؟", - "clearPassword": "محافظت با رمز عبور خاموش شود؟ رمز عبور ذخیره‌شده حذف می‌شود، بنابراین روشن کردن دوباره به رمز تازه‌ای نیاز دارد.", + "revokeSessions": "همه دستگاه‌ها، از جمله همین دستگاه، از حساب خارج شوند؟", + "clearPassword": "محافظت با رمز عبور خاموش شود؟ رمز عبور ذخیره‌شده حذف می‌شود، بنابراین روشن کردن دوباره به رمز جدیدی نیاز دارد.", "changePassword": "برای تغییر رمز عبور، رمز عبور فعلی را وارد کنید.", "remove": "«{name}» حذف شود؟" }, "list": { - "empty": "هنوز برنامه‌ای وجود ندارد. روی +افزودن کلیک کنید.", + "empty": "هنوز برنامه‌ای وجود ندارد. روی «+ افزودن» کلیک کنید.", "noMatches": "نتیجه‌ای یافت نشد." }, "import": { - "confirm_one": "{count} مورد وارد شود؟ {added} افزوده، {updated} به‌روزرسانی، {deleted} حذف.", - "confirm_other": "{count} مورد وارد شود؟ {added} افزوده، {updated} به‌روزرسانی، {deleted} حذف.", + "confirm_one": "{count} مورد وارد شود؟ {added} مورد اضافه، {updated} مورد به‌روزرسانی و {deleted} مورد حذف می‌شود.", + "confirm_other": "{count} مورد وارد شود؟ {added} مورد اضافه، {updated} مورد به‌روزرسانی و {deleted} مورد حذف می‌شود.", "confirmTitle": "وارد کردن پیکربندی", "settingsToo": "تنظیمات با تنظیمات فایل جایگزین می‌شود." }, @@ -422,14 +422,14 @@ "title": "رمز عبوری برای داشبورد تنظیم شود؟", "sub": "اختیاری. بدون آن، هر کسی که به این داشبورد دسترسی داشته باشد می‌تواند از آن استفاده کند و آن را پیکربندی کند. این جایگزین یک سرویس احراز هویت اختصاصی نیست.", "newPassword": "رمز عبور جدید", - "skip": "رد کردن", + "skip": "رد شدن", "set": "تنظیم", "failed": "تنظیم رمز عبور ممکن نشد.", "confirmPassword": "تکرار رمز عبور", "mismatch": "رمزهای عبور یکسان نیستند." }, "pwStrength": { - "tooShort": "خیلی کوتاه است، حداقل ۸ نویسه", + "tooShort": "خیلی کوتاه است، حداقل ۸ کاراکتر", "weak": "ضعیف", "fair": "متوسط", "good": "خوب", @@ -439,7 +439,7 @@ "loading": "در حال بارگذاری", "noData": "داده‌ای نیست", "justNow": "همین حالا", - "errNetwork": "دور از دسترس", + "errNetwork": "در دسترس نیست", "errTimeout": "زمان تمام شد", "errAuth": "کلید رد شد", "errBlocked": "درخواست مسدود شد", @@ -449,21 +449,21 @@ }, "widgetCfg": { "unavailable": "تنظیمات در دسترس نیست", - "unavailableTip": "تعریف این ویجت ({type}) بارگذاری نشد، بنابراین تنظیمات آن قابل نمایش یا ویرایش نیست. این تنظیمات روی سرور نگهداری می‌شوند و ذخیره‌کردن آن‌ها را تغییر نمی‌دهد.", + "unavailableTip": "تعریف این ویجت ({type}) بارگذاری نشد، بنابراین تنظیمات آن قابل نمایش یا ویرایش نیست. این تنظیمات روی سرور نگهداری می‌شوند و ذخیره کردن آن‌ها را تغییر نمی‌دهد.", "refused_one": "‏{count} ویجت بارگذاری نشد، بنابراین در فهرست زیر نیست.", "refused_other": "‏{count} ویجت بارگذاری نشدند، بنابراین در فهرست زیر نیستند.", "name": "نام", "type": "نوع ویجت", "typeCustom": "دلخواه", - "typeCustomDesc": "هر صفحهٔ وبی را که می‌خواهید نمایش دهید.", + "typeCustomDesc": "هر صفحه وبی را که می‌خواهید نمایش دهید.", "namePh": "ویجت من", "editName": "ویرایش نام", "size": "اندازه", "iframeTip": "این آدرس به‌صورت آی‌فریم در داشبورد جاسازی می‌شود.", "advanced": "پیشرفته", - "replaceSecret": "برای جایگزینی، مقدار تازه وارد کنید", - "newValueSet": "مقدار تازه ثبت شد", - "storedSecretHint": "یک مقدار ذخیره شده است. برای جایگزینی مقدار تازه وارد کنید یا برای نگه داشتن آن، خالی بگذارید.", + "replaceSecret": "برای جایگزینی، مقدار جدید وارد کنید", + "newValueSet": "مقدار جدید ثبت شد", + "storedSecretHint": "یک مقدار ذخیره شده است. برای جایگزینی مقدار جدید وارد کنید یا برای نگه داشتن آن، خالی بگذارید.", "fetch": "دریافت", "fetching": "در حال دریافت…", "remove": "حذف", @@ -475,9 +475,9 @@ "referrerPolicy": "سیاست ارجاع‌دهنده", "referrerDefault": "پیش‌فرض", "allowFeaturePolicy": "اجازه (سیاست قابلیت‌ها)", - "allowFullscreen": "اجازهٔ تمام‌صفحه", - "refreshInterval": "بازهٔ به‌روزرسانی", - "refreshPh": "مثلاً ۲۰۰۰", + "allowFullscreen": "اجازه تمام‌صفحه", + "refreshInterval": "فاصله به‌روزرسانی", + "refreshPh": "مثلا ۲۰۰۰", "meta": "ویجت {type} · {size}", "sizeSmall": "کوچک", "sizeMedium": "متوسط", @@ -490,7 +490,7 @@ }, "importForeign": { "title": "وارد کردن از داشبورد دیگر", - "lead": "آنچه از پیش در داشبورد دارید تغییر نمی‌کند.", + "lead": "چیزهایی که از قبل در داشبورد دارید تغییر نمی‌کنند.", "willAdd": "برنامه‌هایی که افزوده می‌شوند", "willCreate": "پوشه‌هایی که ساخته می‌شوند", "changed": "با تغییر وارد شد", @@ -500,7 +500,7 @@ "skipNoHref": "بدون پیوند", "skipUnsafeHref": "طرح پیوند پشتیبانی‌نشده", "skipPlaceholderHref": "پیوند به متغیری نیاز دارد که فقط داشبورد دیگر آن را می‌داند", - "noteIcon": "نماد کنار گذاشته شد: {detail}", + "noteIcon": "آیکون کنار گذاشته شد: {detail}", "notePing": "پینگ ICMP کنار گذاشته شد: {detail}", "noteSchemeAdded": "http:// به پیوند افزوده شد: {detail}", "noteHealthUrl": "آدرس بررسی سلامت کنار گذاشته شد، آدرس وب کامل نیست: {detail}", @@ -517,7 +517,7 @@ "skipRelativeHref": "پیوند آدرس ندارد، فقط یک مسیر", "skipUnreadable": "این ورودی ساختاری ندارد که قالب فایل بپذیرد", "skipUnparsable": "خط {detail} خوانده نشد", - "monitors": "· {url} را می‌پاید" + "monitors": "· بررسی {url}" }, "login": { "subtitle": "برای ادامه وارد شوید", diff --git a/ui/test/i18n-coverage.test.mjs b/ui/test/i18n-coverage.test.mjs index c3676691..8f39e5e7 100644 --- a/ui/test/i18n-coverage.test.mjs +++ b/ui/test/i18n-coverage.test.mjs @@ -139,12 +139,17 @@ const REJECTED = { ['سامانه', 'سیستم'], ['پیش‌تخته', 'داشبورد'], ['پساکند', 'ذخیره'], - ['کاراکتر', 'نویسه'], + ['نویسه', 'کاراکتر'], ['پورت', 'درگاه'], ['یکا', 'واحد'], ['جست‌وجو', 'جستجو'], ['حافظه‌شده', 'کش‌شده'], ['بارگیری', 'بارگذاری'], + ['پالایش', 'فیلتر'], + ['پالایه', 'فیلتر'], + ['سربرگ', 'هدر'], + ['پروکسی', 'پراکسی'], + ['نمایه', 'پروفایل'], /* Product names stay in Latin, as the English catalogue writes them. */ ['ترونس', 'TrueNAS'], ['آنرید', 'Unraid'], @@ -152,6 +157,7 @@ const REJECTED = { ['امبی', 'Emby'], ['آنسپلش', 'Unsplash'], ['گیت‌هاب', 'GitHub'], + ['داکر', 'Docker'], ], /* Abzeichen is a pinned badge or a medal. The reference locales use Badge 26 times and Abzeichen never. Bezeichnung is what the rest of the catalogue @@ -195,6 +201,20 @@ for (const [file, pairs] of Object.entries(REJECTED)) { }); } +/* Persian is written without Arabic marks or letters: no ezafe هٔ, tanvin, + short vowels, hamza on alef, or Arabic ي ك ة ى ؤ and digits. */ +const ARABIC_MARKS = /[\u0654\u06C0\u064B-\u0652\u0670\u0623\u0625\u064A\u0643\u0629\u0649\u0624\u0660-\u0669]/u; + +test('fa.json uses no Arabic marks or letters', () => { + const found = []; + for (const [name, catalogue] of [['fa.json', read('fa.json')], ...widgetCatalogues('fa.json')]) { + for (const [key, value] of flat(catalogue)) { + if (ARABIC_MARKS.test(String(value))) found.push(`${name} ${key}: ${value}`); + } + } + assert.deepEqual(found, [], `Arabic marks or letters in Persian text:\n ${found.join('\n ')}`); +}); + /* ── English left inside a non-Latin catalogue ────────────────────────────── */ /* A machine translation that skips a word leaves it in English, which a scan diff --git a/ui/widgets/backup/i18n/fa.json b/ui/widgets/backup/i18n/fa.json index 0b42ce99..1d9fb8a3 100644 --- a/ui/widgets/backup/i18n/fa.json +++ b/ui/widgets/backup/i18n/fa.json @@ -11,10 +11,10 @@ "slots.dupPass.label": "رمز عبور", "slots.jobId.label": "کار", "slots.jobId.hint": "آدرس و رمز عبور را بالا وارد کنید، سپس کارها را بارگذاری کنید.", - "slots.dupHref.label": "آدرس کلیک", + "slots.dupHref.label": "آدرس پیوند", "slots.dupHref.placeholder": "http://duplicati:8200", - "slots.dupHref.hint": "آدرسی که مرورگرتان برای این سرویس به کار می‌برد. خالی بگذارید تا آدرس بالا به کار رود، اگر مرورگرتان به آن دسترسی دارد.", - "slots.dupPollSec.label": "فاصلهٔ بررسی (ثانیه)", + "slots.dupHref.hint": "آدرسی که مرورگرتان برای این سرویس استفاده می‌کند. اگر مرورگرتان به آدرس بالا دسترسی دارد، خالی بگذارید.", + "slots.dupPollSec.label": "فاصله بررسی (ثانیه)", "slots.kopiaUrl.label": "آدرس", "slots.kopiaUrl.placeholder": "http://kopia:51515", "slots.kopiaUser.label": "نام کاربری", @@ -22,12 +22,12 @@ "slots.kopiaPass.label": "رمز عبور", "slots.jobId.label.kopia": "منبع", "slots.jobId.hint.kopia": "آدرس و اطلاعات ورود را بالا وارد کنید، سپس منابع را بارگذاری کنید.", - "slots.kopiaHref.label": "آدرس کلیک", + "slots.kopiaHref.label": "آدرس پیوند", "slots.kopiaHref.placeholder": "http://kopia:51515", - "slots.kopiaHref.hint": "آدرسی که مرورگرتان برای این سرویس به کار می‌برد. خالی بگذارید تا آدرس بالا به کار رود، اگر مرورگرتان به آن دسترسی دارد.", + "slots.kopiaHref.hint": "آدرسی که مرورگرتان برای این سرویس استفاده می‌کند. اگر مرورگرتان به آدرس بالا دسترسی دارد، خالی بگذارید.", "slots.customName.label": "نام نمایشی", "slots.customName.placeholder": "روی کارت نمایش داده می‌شود", - "ui.haikus": "اعتماد کن،|اما راستی‌آزمایی.\nپشتیبان بگیر|یا پشیمان شو.\nهیچ چیز|همیشگی نیست.\nاجرای شبانه.|آرامش صبح.|داده زنده است.\nاول پشتیبان.|بعد حذف.|بهتر بخواب.\nگزارش‌ها سبز.|قهوه گرم.|همه‌چیز خوب.\nامید|راهبرد نیست.\nامنش نگه دار.\nمنتظر|ناگهانی باش.\nنگرانی کاری نمی‌کند.|پشتیبان خوب|می‌کند.\nزود آماده شو.|کم هراسان شو.|لبخند بزن.", + "ui.haikus": "اعتماد کن،|اما بررسی هم بکن.\nپشتیبان بگیر|یا پشیمان شو.\nهیچ‌چیز|همیشگی نیست.\nاجرای شبانه.|آرامش صبح.|داده زنده است.\nاول پشتیبان.|بعد حذف.|بهتر بخواب.\nگزارش‌ها سبز.|قهوه گرم.|همه‌چیز خوب.\nامید|راهبرد نیست.\nامنش نگه دار.\nمنتظر|غیرمنتظره‌ها باش.\nنگرانی کاری نمی‌کند.|پشتیبان خوب|می‌کند.\nزود آماده شو.|کمتر بترس.|لبخند بزن.", "ui.backupStatus": "وضعیت پشتیبان‌گیری", "ui.running": "در حال اجرا", "ui.unknown": "نامشخص", diff --git a/ui/widgets/books/i18n/fa.json b/ui/widgets/books/i18n/fa.json index 47ecae3a..41ee7a02 100644 --- a/ui/widgets/books/i18n/fa.json +++ b/ui/widgets/books/i18n/fa.json @@ -8,7 +8,7 @@ "absUrl.label": "آدرس Audiobookshelf", "absUrl.placeholder": "http://host:13378", "absKey.label": "کلید API", - "absKey.hint": "Settings → API Keys (نسخهٔ 2.26 به بعد)، یا توکن حساب شما.", + "absKey.hint": "Settings → API Keys (نسخه 2.26 به بعد)، یا توکن حساب شما.", "komgaUrl.label": "آدرس Komga", "komgaUrl.placeholder": "http://host:25600", "komgaKey.label": "کلید API", @@ -27,9 +27,9 @@ "source.opt.list": "فهرست سفارشی", "listId.label": "فهرست", "listId.hint": "آدرس و کلید را بالا وارد کنید، سپس دریافت را بزنید تا مجموعه‌ها و فهرست‌های خواندن بارگذاری شوند.", - "href.label": "آدرس کلیک (اختیاری)", + "href.label": "آدرس پیوند (اختیاری)", "href.placeholder": "https://…", - "href.hint": "آدرسی که مرورگرتان برای این سرویس به کار می‌برد. خالی بگذارید تا آدرس بالا به کار رود، اگر مرورگرتان به آن دسترسی دارد.", + "href.hint": "آدرسی که مرورگرتان برای این سرویس استفاده می‌کند. اگر مرورگرتان به آدرس بالا دسترسی دارد، خالی بگذارید.", "ui.reading": "در حال خواندن", "ui.srcRecently": "به‌تازگی افزوده‌شده", "ui.srcUnread": "در دست خواندن", diff --git a/ui/widgets/clock/i18n/fa.json b/ui/widgets/clock/i18n/fa.json index ea4571d4..724d5332 100644 --- a/ui/widgets/clock/i18n/fa.json +++ b/ui/widgets/clock/i18n/fa.json @@ -1,14 +1,14 @@ { "widget.label": "ساعت", - "widget.description": "ساعت و تاریخ را در هر منطقهٔ زمانی نمایش دهید.", + "widget.description": "ساعت و تاریخ را در هر منطقه زمانی نمایش دهید.", "view.digital.label": "دیجیتال", "view.analog.label": "عقربه‌ای", "clockStyle.label": "سبک", "clockStyle.opt.digital": "دیجیتال", "clockStyle.opt.analog": "عقربه‌ای", - "clockTimezone.label": "منطقهٔ زمانی", + "clockTimezone.label": "منطقه زمانی", "clockTimezone.placeholder": "Asia/Tehran", - "clockTimezone.hint": "نام منطقهٔ زمانی IANA. برای زمان محلی مرورگر خالی بگذارید.", + "clockTimezone.hint": "نام منطقه زمانی IANA. برای زمان محلی مرورگر خالی بگذارید.", "clockShowDate.label": "نمایش تاریخ", - "ui.unknownZone": "منطقهٔ زمانی ناشناخته" + "ui.unknownZone": "منطقه زمانی ناشناخته" } diff --git a/ui/widgets/connections/i18n/fa.json b/ui/widgets/connections/i18n/fa.json index 702bbc24..e61ea87b 100644 --- a/ui/widgets/connections/i18n/fa.json +++ b/ui/widgets/connections/i18n/fa.json @@ -21,7 +21,7 @@ "vpn.href.label": "آدرس کلیک", "vpn.href.placeholder": "http://your-server:8000", "vpn.showIp.label": "نمایش آدرس IP", - "vpn.showIp.hint": "برای هر کسی که داشبورد را می‌بیند نمایان است. وقتی تونل قطع است، این آدرس خانهٔ شماست.", + "vpn.showIp.hint": "برای هر کسی که داشبورد را می‌بیند نمایان است. وقتی تونل قطع است، این آدرس خانه شماست.", "vpn.color.label": "رنگ نقطه", "services.label": "سرویس", "services.type.label": "سرویس", @@ -34,7 +34,7 @@ "services.name.placeholder": "نام", "services.url.label": "آدرس سرور کنترل", "services.url.placeholder": "gluetun:8000", - "services.url.label.conduit": "آدرس سنجه‌ها", + "services.url.label.conduit": "آدرس متریک‌ها", "services.url.placeholder.conduit": "conduit:9090", "services.url.label.netbird": "آدرس API مدیریت", "services.url.placeholder.netbird": "netbird:33073", @@ -44,12 +44,12 @@ "services.url.placeholder.umami": "umami:3000", "services.token.label": "توکن دسترسی", "services.token.placeholder": "NetBird PAT", - "services.siteId.label": "شناسهٔ سایت (دامنه)", + "services.siteId.label": "شناسه سایت (دامنه)", "services.siteId.placeholder": "example.com", "services.apiKey.label": "کلید API آمار", "services.apiKey.label.umami": "کلید API", - "services.apiKey.hint.umami": "از Umami نسخه ۳.۴.۰ به بعد. برای ورود با نام کاربری و رمز عبور، خالی بگذارید.", - "services.websiteId.label": "شناسهٔ وب‌سایت", + "services.apiKey.hint.umami": "از Umami نسخه 3.4.0 به بعد. برای ورود با نام کاربری و رمز عبور، خالی بگذارید.", + "services.websiteId.label": "شناسه وب‌سایت", "services.websiteId.placeholder": "8dc7… (UUID)", "services.username.label": "نام کاربری", "services.username.placeholder": "admin", @@ -57,7 +57,7 @@ "services.adminUrl.label": "آدرس پنل مدیریت", "services.adminUrl.placeholder": "http://your-server:3002", "services.color.label": "رنگ نقطه", - "href.label": "آدرس کلیک", + "href.label": "آدرس پیوند", "href.placeholder": "https://…", "showLegend.label": "نمایش راهنما", "showLegend.hint": "کلید سرویس‌ها در پایین نقشه.", @@ -76,11 +76,11 @@ "ui.peersOnline_other": "{count} آنلاین", "ui.peersLabel": "همتایان", "ui.online": "آنلاین", - "ui.mesh": "شبکهٔ مش", + "ui.mesh": "شبکه مش", "ui.noData": "داده‌ای نیست", - "ui.worldMap": "نقشهٔ جهانی اتصال‌ها", + "ui.worldMap": "نقشه جهانی اتصال‌ها", "ui.service": "سرویس", "ui.users": "کاربران", - "ui.openAdmin": "باز کردن مدیریت", + "ui.openAdmin": "بازکردن مدیریت", "ui.more": "+{n} مورد دیگر" } diff --git a/ui/widgets/dashboard-switch/i18n/fa.json b/ui/widgets/dashboard-switch/i18n/fa.json index b5257a11..78764a0b 100644 --- a/ui/widgets/dashboard-switch/i18n/fa.json +++ b/ui/widgets/dashboard-switch/i18n/fa.json @@ -4,13 +4,13 @@ "keychains.label": "جاکلیدی", "keychains.hint": "رنگ آویز را روی خودکار بگذارید تا از آدرس داشبورد گرفته شود.", "keychains.name.label": "نام", - "keychains.name.placeholder": "مثلاً اتاق نشیمن", + "keychains.name.placeholder": "مثلا اتاق نشیمن", "keychains.url.label": "آدرس داشبورد", "keychains.url.placeholder": "http://host:port", "keychains.color.label": "رنگ آویز", "keychains.color.opt.default": "خودکار", - "keychains.color.opt.teal": "فیروزه‌ای", - "keychains.color.opt.cyan": "آبی روشن", + "keychains.color.opt.teal": "سبزآبی", + "keychains.color.opt.cyan": "فیروزه‌ای", "keychains.color.opt.orange": "نارنجی", "keychains.color.opt.pink": "صورتی", "keychains.color.opt.purple": "بنفش", @@ -19,8 +19,8 @@ "keychains.color.opt.blue": "آبی", "openIn.label": "باز شود در", "openIn.opt.same": "همین زبانه", - "openIn.opt.new": "زبانهٔ جدید", - "ui.switcher": "تعویض‌کنندهٔ داشبورد", + "openIn.opt.new": "زبانه جدید", + "ui.switcher": "تعویض‌کننده داشبورد", "ui.empty": "در تنظیمات یک داشبورد اضافه کنید", "ui.switchTo": "رفتن به {name}" } diff --git a/ui/widgets/disk-health/i18n/fa.json b/ui/widgets/disk-health/i18n/fa.json index 8432a831..3a58b429 100644 --- a/ui/widgets/disk-health/i18n/fa.json +++ b/ui/widgets/disk-health/i18n/fa.json @@ -1,32 +1,32 @@ { "widget.label": "سلامت دیسک", - "widget.description": "سلامت همهٔ دیسک‌های سرورتان را بررسی کنید.", + "widget.description": "سلامت همه دیسک‌های سرورتان را بررسی کنید.", "diskProvider.label": "منبع", "diskProvider.opt.scrutiny": "Scrutiny", "diskProvider.opt.truenas": "TrueNAS", "scrutinyUrl.label": "آدرس Scrutiny", "scrutinyUrl.placeholder": "scrutiny:8080", - "scrutinyHref.label": "آدرس کلیک", + "scrutinyHref.label": "آدرس پیوند", "scrutinyHref.placeholder": "http://your-server:8080", - "scrutinyHref.hint": "آدرسی که مرورگرتان برای این سرویس به کار می‌برد. خالی بگذارید تا آدرس بالا به کار رود، اگر مرورگرتان به آن دسترسی دارد.", + "scrutinyHref.hint": "آدرسی که مرورگرتان برای این سرویس استفاده می‌کند. اگر مرورگرتان به آدرس بالا دسترسی دارد، خالی بگذارید.", "truenasUrl.label": "آدرس TrueNAS", "truenasUrl.placeholder": "truenas.local", "truenasKey.label": "کلید API TrueNAS", - "truenasHref.label": "آدرس کلیک", + "truenasHref.label": "آدرس پیوند", "truenasHref.placeholder": "http://truenas.local", - "truenasHref.hint": "آدرسی که مرورگرتان برای این سرویس به کار می‌برد. خالی بگذارید تا آدرس بالا به کار رود، اگر مرورگرتان به آن دسترسی دارد.", + "truenasHref.hint": "آدرسی که مرورگرتان برای این سرویس استفاده می‌کند. اگر مرورگرتان به آدرس بالا دسترسی دارد، خالی بگذارید.", "bays.label": "محفظه‌ها", "bays.rowLabel": "محفظه", "bays.fetchLabel": "دریافت دیسک‌ها", "bays.hint": "آدرس را بالا وارد کنید، سپس فهرست را بارگذاری کرده و هر محفظه را تخصیص دهید.", "ui.diskHealth": "سلامت دیسک", - "ui.noSmart": "دادهٔ SMART نیست", + "ui.noSmart": "داده SMART نیست", "ui.healthy": "سالم", "ui.failed": "خراب", "ui.bay": "محفظه {n}", "ui.bayEmpty": "محفظه {n}: خالی", "ui.baysFailed_one": "محفظه {list} خراب است", "ui.baysFailed_other": "محفظه‌های {list} خراب‌اند", - "ui.noDrives": "هیچ درایوی گزارش نشد", + "ui.noDrives": "هیچ دیسکی گزارش نشد", "ui.notReporting": "گزارش نمی‌دهد" } diff --git a/ui/widgets/dns/i18n/fa.json b/ui/widgets/dns/i18n/fa.json index 155a3d44..a5a0119c 100644 --- a/ui/widgets/dns/i18n/fa.json +++ b/ui/widgets/dns/i18n/fa.json @@ -5,8 +5,8 @@ "dnsUrl.label": "آدرس سرور", "dnsUrl.placeholder": "dns-host:80", "dnsUrl.hint": "نام کانتینر و درگاه، یا یک آدرس کامل.", - "dnsHref.label": "آدرس کلیک", - "dnsHref.hint": "آدرسی که مرورگرتان برای این سرویس به کار می‌برد. خالی بگذارید تا آدرس بالا به کار رود، اگر مرورگرتان به آن دسترسی دارد.", + "dnsHref.label": "آدرس پیوند", + "dnsHref.hint": "آدرسی که مرورگرتان برای این سرویس استفاده می‌کند. اگر مرورگرتان به آدرس بالا دسترسی دارد، خالی بگذارید.", "dnsUser.label": "نام کاربری", "dnsPass.label": "رمز عبور", "dnsPiholePassword.label": "رمز عبور Pi-hole", @@ -15,11 +15,11 @@ "dnsTechnitiumToken.hint": "توکن API مربوط به Technitium (Administration → Sessions → Create Token).", "dnsNextdnsApiKey.label": "کلید API", "dnsNextdnsApiKey.hint": "از my.nextdns.io → Account → API.", - "dnsNextdnsProfile.label": "شناسهٔ پروفایل", + "dnsNextdnsProfile.label": "شناسه پروفایل", "dnsNextdnsProfile.placeholder": "abc123", - "dnsNextdnsProfile.hint": "شناسهٔ پروفایل یا پیکربندی (همان شناسهٔ کوتاه در تنظیمات NextDNS شما).", + "dnsNextdnsProfile.hint": "شناسه پروفایل یا پیکربندی (همان شناسه کوتاه در تنظیمات NextDNS شما).", "ui.queriesBlocked": "درخواست‌های مسدودشده", - "ui.aria": "پالایش DNS", + "ui.aria": "فیلتر DNS", "ui.allowed": "مجاز", "ui.cached": "کش‌شده", "ui.blocked": "مسدود", diff --git a/ui/widgets/github/i18n/fa.json b/ui/widgets/github/i18n/fa.json index 07abf155..aa463939 100644 --- a/ui/widgets/github/i18n/fa.json +++ b/ui/widgets/github/i18n/fa.json @@ -9,19 +9,19 @@ "githubUser.label": "نام کاربری GitHub", "githubUser.placeholder": "octocat", "githubToken.label": "توکن دسترسی شخصی", - "githubToken.hint": "توکن کلاسیک با دسترسی repo و read:user (یا توکن دقیق با همان سطح خواندن). فقط همین ویجت از آن استفاده می‌کند.", - "githubHref.label": "آدرس کلیک", - "githubHref.hint": "جایی که با کلیک روی ویجت باز می‌شود. برای باز شدن نمایهٔ GitHub خالی بگذارید.", - "githubPrFilters.label": "پالایه‌های درخواست ادغام", - "githubPrFilters.hint": "کدام درخواست‌های باز نمایش داده شوند. چند پالایه با هم ترکیب می‌شوند.", + "githubToken.hint": "توکن کلاسیک با دسترسی repo و read:user (یا توکن fine-grained با همان دسترسی خواندن). فقط همین ویجت از آن استفاده می‌کند.", + "githubHref.label": "آدرس پیوند", + "githubHref.hint": "جایی که با کلیک روی ویجت باز می‌شود. برای بازشدن پروفایل GitHub خالی بگذارید.", + "githubPrFilters.label": "فیلترهای درخواست ادغام", + "githubPrFilters.hint": "کدام درخواست‌های ادغام باز نمایش داده شوند. چند فیلتر با هم ترکیب می‌شوند.", "githubPrFilters.opt.created": "ساخته‌شده", "githubPrFilters.opt.assigned": "واگذارشده", - "githubPrFilters.opt.mentioned": "نام‌برده‌شده", + "githubPrFilters.opt.mentioned": "منشن‌شده", "githubPrFilters.opt.review-requested": "درخواست بازبینی", "ui.prAria": "درخواست‌های ادغام GitHub", "ui.pullRequests": "درخواست‌های ادغام", - "ui.lastYear": "سال گذشته", + "ui.lastYear": "یک سال اخیر", "ui.noPrs": "درخواست ادغام بازی نیست", - "ui.contributionsAria": "مشارکت‌های GitHub: {total} در سال گذشته", - "ui.viewAll": "مشاهدهٔ همه" + "ui.contributionsAria": "مشارکت‌های GitHub: {total} در یک سال اخیر", + "ui.viewAll": "مشاهده همه" } diff --git a/ui/widgets/nowplaying/i18n/fa.json b/ui/widgets/nowplaying/i18n/fa.json index bb0f1b73..d47a7158 100644 --- a/ui/widgets/nowplaying/i18n/fa.json +++ b/ui/widgets/nowplaying/i18n/fa.json @@ -8,7 +8,7 @@ "provider.opt.navidrome": "Navidrome", "plexUrl.label": "آدرس سرور Plex", "plexUrl.placeholder": "http://host:32400", - "plexUrl.hint": "سرور رسانهٔ Plex شما (درگاه پیش‌فرض 32400).", + "plexUrl.hint": "سرور رسانه Plex شما (درگاه پیش‌فرض 32400).", "plexToken.label": "توکن Plex (X-Plex-Token)", "jellyfinUrl.label": "آدرس Jellyfin", "jellyfinUrl.placeholder": "http://host:8096", @@ -20,9 +20,9 @@ "navidromeUrl.placeholder": "http://host:4533", "navidromeUser.label": "نام کاربری", "navidromePassword.label": "رمز عبور", - "href.label": "آدرس کلیک (اختیاری)", + "href.label": "آدرس پیوند (اختیاری)", "href.placeholder": "https://…", - "href.hint": "آدرسی که مرورگرتان برای این سرویس به کار می‌برد. خالی بگذارید تا آدرس بالا به کار رود، اگر مرورگرتان به آن دسترسی دارد.", + "href.hint": "آدرسی که مرورگرتان برای این سرویس استفاده می‌کند. اگر مرورگرتان به آدرس بالا دسترسی دارد، خالی بگذارید.", "ui.nothingPlaying": "چیزی پخش نمی‌شود", "ui.describeTitle": "در حال پخش: {title}", "ui.describeSubtitle": "{text}، {subtitle}", diff --git a/ui/widgets/system-summary/i18n/fa.json b/ui/widgets/system-summary/i18n/fa.json index 48ef9c7d..355dd9a0 100644 --- a/ui/widgets/system-summary/i18n/fa.json +++ b/ui/widgets/system-summary/i18n/fa.json @@ -1,6 +1,6 @@ { - "widget.label": "خلاصهٔ سیستم", - "widget.description": "پردازنده، حافظه، دیسک و شبکهٔ سرورتان را زیر نظر بگیرید.", + "widget.label": "خلاصه سیستم", + "widget.description": "پردازنده، حافظه، دیسک و شبکه سرورتان را زیر نظر بگیرید.", "statProvider.label": "منبع", "statProvider.opt.system": "همین دستگاه", "statProvider.opt.glances": "Glances", @@ -26,43 +26,43 @@ "refresh.opt.30": "۳۰ ثانیه", "refresh.opt.60": "۱ دقیقه", "refresh.hint": "ممکن است منبع راه دور کمتر از این به‌روز شود.", - "href.label": "آدرس کلیک", + "href.label": "آدرس پیوند", "href.placeholder": "https://…", - "href.hint": "آدرسی که مرورگرتان برای این سرویس به کار می‌برد. خالی بگذارید تا آدرس بالا به کار رود، اگر مرورگرتان به آن دسترسی دارد.", + "href.hint": "آدرسی که مرورگرتان برای این سرویس استفاده می‌کند. اگر مرورگرتان به آدرس بالا دسترسی دارد، خالی بگذارید.", "slots.label": "جایگاه", "slots.type.label": "منبع سیستم", "slots.type.opt.cpu": "CPU", "slots.type.opt.ram": "RAM", "slots.type.opt.temp": "دما", - "slots.type.opt.disk": "نقطهٔ اتصال دیسک", + "slots.type.opt.disk": "نقطه اتصال دیسک", "slots.type.opt.iowait": "انتظار ورودی/خروجی", "slots.type.opt.procs": "فرایندها", "row.disk": "دیسک", "sr.diskSize": "{used} از {total}", - "slots.primary.label": "نخستین مسیر اتصال", + "slots.primary.label": "مسیر اتصال اول", "slots.primary.placeholder": "/", - "slots.secondary.label": "دومین مسیر اتصال", + "slots.secondary.label": "مسیر اتصال دوم", "slots.secondary.placeholder": "/mnt/data", - "slots.fsPrimary.label": "نخستین سیستم فایل", + "slots.fsPrimary.label": "سیستم فایل اول", "slots.fsPrimary.placeholder": "root", - "slots.fsSecondary.label": "دومین سیستم فایل", + "slots.fsSecondary.label": "سیستم فایل دوم", "slots.fsSecondary.placeholder": "media", - "slots.sharePrimary.label": "نخستین اشتراک", + "slots.sharePrimary.label": "اشتراک اول", "slots.sharePrimary.placeholder": "media", - "slots.shareSecondary.label": "دومین اشتراک", + "slots.shareSecondary.label": "اشتراک دوم", "slots.shareSecondary.placeholder": "appdata", "slots.share.hint": "برای کل آرایه خالی بگذارید.", - "slots.thermalZone.label": "ناحیهٔ حرارتی", + "slots.thermalZone.label": "ناحیه حرارتی", "slots.sensor.label": "حسگر", "slots.sensor.hint": "آدرس بالا را وارد کنید، سپس فهرست را بارگذاری کنید.", "slots.color.label": "رنگ", - "slots.beszelHint": "Beszel شمار فرایندها را گزارش نمی‌کند.", - "slots.unraidHint": "Unraid زمان انتظار ورودی/خروجی و شمار فرایندها را گزارش نمی‌کند.", + "slots.beszelHint": "Beszel تعداد فرایندها را گزارش نمی‌کند.", + "slots.unraidHint": "Unraid زمان انتظار ورودی/خروجی و تعداد فرایندها را گزارش نمی‌کند.", "network.label": "شبکه", "network.enabled.label": "نمایش ردیف شبکه", "network.mode.label": "حالت", "network.mode.opt.speed": "سرعت", - "network.mode.opt.throughput": "گذردهی", + "network.mode.opt.throughput": "ترافیک", "network.mode.opt.uptime": "زمان کارکرد", "network.interface.label": "رابط شبکه", "network.interface.hint": "اتصال بالا را کامل کنید، سپس فهرست را بارگذاری کنید.", diff --git a/ui/widgets/weather/i18n/fa.json b/ui/widgets/weather/i18n/fa.json index 9caed26e..2fd8d0ce 100644 --- a/ui/widgets/weather/i18n/fa.json +++ b/ui/widgets/weather/i18n/fa.json @@ -7,7 +7,7 @@ "owKey.label": "کلید API", "owKey.hint": "کلید رایگان را از openweathermap.org بگیرید. فعال شدن کلید تازه ممکن است چند ساعت طول بکشد.", "cityQuery.label": "جستجو", - "cityQuery.placeholder": "مثلاً تهران", + "cityQuery.placeholder": "مثلا تهران", "city.label": "موقعیت", "city.hint": "نام شهری را بالا بنویسید، سپس دریافت را بزنید و مورد درست را انتخاب کنید.", "units.label": "واحد", @@ -17,7 +17,7 @@ "href.label": "آدرس پیوند", "href.placeholder": "https://…", "ui.clear": "صاف", - "ui.mostlyClear": "عمدتاً صاف", + "ui.mostlyClear": "عمدتا صاف", "ui.partlyCloudy": "نیمه‌ابری", "ui.cloudy": "ابری", "ui.fog": "مه",