Files
cloud-host/frontend/src/i18n/dictionaries/fa.ts
T
keyhan f89c3de826 feat(landing): glass header nav with side drawer + blog section
- Header: full glassmorphism navigation (services, pricing, estimator, learn,
  blog). Desktop shows an inline glass pill; mobile opens a side drawer that
  slides in from the inline-start edge (right in RTL, left in LTR) over a
  blurred backdrop.
- Nav links smooth-scroll via the shared Lenis instance (exposed through
  scroll-store: setLenis/scrollToId), with an 80px offset under the header.
- "Learn" links to the existing how-it-works steps (id="learn"); add a
  lightweight Blog teaser section (id="blog", "coming soon" cards).
- i18n: fa/en strings for nav and blog.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 11:36:27 +03:30

1712 lines
107 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Persian (fa-IR) dictionary — the source of truth for the app's copy.
// The `Dictionary` type is derived from this object; en.ts must match its shape.
const fa = {
common: {
appName: 'ابربان',
login: 'ورود',
register: 'ثبت‌نام',
logout: 'خروج',
signOut: 'خروج از حساب',
dashboard: 'داشبورد',
backHome: 'بازگشت به خانه',
loading: 'در حال بارگذاری…',
save: 'ذخیره',
cancel: 'انصراف',
delete: 'حذف',
edit: 'ویرایش',
create: 'ایجاد',
back: 'بازگشت',
search: 'جستجو',
confirm: 'تأیید',
close: 'بستن',
yes: 'بله',
no: 'خیر',
currency: 'تومان',
currencyShort: 'ت',
},
errors: {
generic: 'مشکلی پیش آمد. لطفاً دوباره تلاش کنید.',
network: 'ارتباط با سرور برقرار نشد. اتصال اینترنت خود را بررسی کنید.',
timeout: 'پاسخ سرور بیش از حد طول کشید. لطفاً دوباره تلاش کنید.',
unauthorized: 'نشست شما منقضی شده است. لطفاً دوباره وارد شوید.',
forbidden: 'شما اجازهٔ انجام این کار را ندارید.',
notFound: 'مورد درخواستی پیدا نشد.',
conflict: 'این عملیات با وضعیت فعلی تداخل دارد. صفحه را تازه کنید و دوباره تلاش کنید.',
validation: 'اطلاعات واردشده درست نیست. لطفاً ورودی‌ها را بررسی کنید.',
rateLimit: 'تعداد درخواست‌ها زیاد است. کمی صبر کنید و دوباره تلاش کنید.',
server: 'خطایی در سرور رخ داد. لطفاً کمی بعد دوباره تلاش کنید.',
},
language: {
label: 'زبان',
},
meta: {
title: 'ابربان | زیرساخت ابری، در کنترل تو',
description:
'ابربان؛ پلتفرم ابریِ خودسرویس روی کوبرنتیز. اپ خود را در چند ثانیه منتشر کن — دیتابیس مدیریت‌شده، دامنهٔ اختصاصی، SSL خودکار و لاگ زنده.',
},
roles: {
admin: 'مدیر',
technical: 'فنی',
sales: 'فروش',
},
landing: {
badge: 'پلتفرم ابریِ خودسرویس',
nav: {
services: 'سرویس‌ها',
pricing: 'قیمت‌گذاری',
estimator: 'تخمین هزینه',
learn: 'آموزش',
blog: 'بلاگ',
menu: 'منو',
},
hero: {
title: 'ابربان',
tagline: 'زیرساخت ابری، در کنترل تو',
subtitle:
'اپلیکیشنت را در چند ثانیه روی کوبرنتیز منتشر کن — بدون دردسر سرور، بدون پیچیدگیِ DevOps.',
ctaPrimary: 'رایگان شروع کن',
ctaSecondary: 'ورود',
scrollHint: 'به دلِ ابرها بزن',
},
services: {
title: 'سرویس‌های پلتفرم',
subtitle: 'هرچه برای ساخت و اجرای محصولت لازم داری، یک‌جا.',
comingSoon: 'به‌زودی',
explore: 'برای مشاهده کلیک کن',
paas: {
label: 'PaaS',
name: 'پلتفرم به‌عنوان سرویس',
desc: 'اپلیکیشنت را مستقیم از کد روی کوبرنتیز منتشر کن — بیلد و انتشار خودکار.',
},
dbaas: {
label: 'DBaaS',
name: 'دیتابیس به‌عنوان سرویس',
desc: 'دیتابیس‌های مدیریت‌شده و پایدار، آماده در چند ثانیه.',
},
kaas: {
label: 'KaaS',
name: 'کوبرنتیز به‌عنوان سرویس',
desc: 'کلاستر کوبرنتیز اختصاصی و مدیریت‌شده برای تیم تو.',
},
laas: {
label: 'LaaS',
name: 'لاگ به‌عنوان سرویس',
desc: 'جمع‌آوری، نگه‌داری و تحلیل متمرکز لاگ‌ها.',
},
},
value: {
lead: 'یک پلتفرمِ ',
highlight: 'PaaS خودسرویس',
tail: ' روی کوبرنتیز — تمامِ قدرتِ زیرساختِ ابری، بدون پیچیدگیِ طوفانی‌اش.',
body: 'ابربان لایه‌های سختِ DevOps را برایت مدیریت می‌کند تا فقط روی محصولت تمرکز کنی.',
},
how: {
title: 'به سادگیِ سه قدم',
steps: [
{ n: '۱', title: 'کدت را بده', desc: 'ریپازیتوری یا اپت را وصل کن.' },
{ n: '۲', title: 'ما می‌سازیم', desc: 'ابربان به‌صورت خودکار بیلد و روی کوبرنتیز دیپلوی می‌کند.' },
{ n: '۳', title: 'آنلاین شو', desc: 'دامنه و SSL آماده است؛ اپت زنده می‌شود.' },
],
},
features: {
title: 'هرچه برای ساختن لازم داری',
subtitle: 'یک جعبه‌ابزارِ کامل برای انتشار و نگه‌داریِ اپ.',
items: [
{ title: 'دیپلوی برق‌آسا', desc: 'Node.js، لاراول و وردپرس را با یک کلیک منتشر کن؛ بیلد و انتشار خودکار.' },
{ title: 'دیتابیس مدیریت‌شده', desc: 'PostgreSQL، MySQL، Redis، RabbitMQ و Elasticsearch، آماده و پایدار.' },
{ title: 'SSL خودکار', desc: 'دامنهٔ اختصاصی وصل کن؛ گواهی SSL خودکار صادر و تمدید می‌شود.' },
{ title: 'لینک پیش‌نمایش', desc: 'برای هر دیپلوی یک Preview URL پایدار روی TLS بگیر و سریع تست کن.' },
{ title: 'لاگ زنده', desc: 'لاگ بیلد و اجرای اپ را همان لحظه و به‌صورت زنده دنبال کن.' },
{ title: 'اسنپ‌شات و بکاپ', desc: 'از وضعیت اپ اسنپ‌شات بگیر و هر زمان خواستی بازگردان.' },
{ title: 'بیلینگ شفاف', desc: 'کیف‌پول پیش‌پرداخت، فاکتور دقیق و مصرف لحظه‌ای — بدون سورپرایز.' },
{ title: 'پشتیبانی فارسی', desc: 'تیم پشتیبانی و سیستم تیکت، فارسی و همیشه کنارت.' },
],
},
trust: {
title: 'چرا تیم‌ها به ابربان اعتماد می‌کنند',
items: [
{ kpi: '< ۶۰ ثانیه', label: 'میانگین زمان دیپلوی' },
{ kpi: '۹۹٫۹٪', label: 'پایداریِ زیرساخت' },
{ kpi: 'TLS خودکار', label: 'امنیتِ پیش‌فرض' },
{ kpi: 'بومیِ ایران', label: 'بهینه برای کاربر ایرانی' },
],
},
pricing: {
title: 'قیمت‌گذاری شفاف',
subtitle: 'فقط بابت منابعی که مصرف می‌کنی پرداخت کن. این نرخ‌ها مستقیماً از پلن‌های فعال پلتفرم خوانده می‌شوند.',
runtimeLabel: 'نوع اپلیکیشن',
cycle: { hourly: 'ساعتی', monthly: 'ماهانه', yearly: 'سالانه' },
perCycle: { hourly: 'هر ساعت', monthly: 'هر ماه', yearly: 'هر سال' },
discountBadge: '{p}٪ تخفیف',
free: 'رایگان',
resources: {
base_fee: 'هزینهٔ پایه',
cpu_per_core: 'پردازنده (هر هسته)',
memory_per_gb: 'حافظه (هر گیگابایت)',
storage_per_gb: 'فضای ذخیره (هر گیگابایت)',
database_addon: 'دیتابیس مدیریت‌شده',
custom_domain_addon: 'دامنهٔ اختصاصی + SSL',
},
currency: 'تومان',
note: 'هزینهٔ نهایی بر اساس مصرف واقعی شما محاسبه می‌شود؛ این اعداد نرخ واحد هر منبع هستند.',
loadError: 'دریافت قیمت‌ها ممکن نشد.',
},
estimator: {
title: 'پکیج خودت را تخمین بزن',
subtitle: 'منابع موردنیازت را انتخاب کن تا همین حالا برآورد هزینه را ببینی.',
runtime: 'نوع اپلیکیشن',
cpu: 'پردازنده (CPU)',
memory: 'حافظه (RAM)',
storage: 'فضای ذخیره‌سازی',
replicas: 'تعداد نمونه',
database: 'دیتابیس',
databaseType: 'نوع دیتابیس',
options: 'سرویس‌های جانبی',
redis: 'Redis',
rabbitmq: 'RabbitMQ',
elasticsearch: 'Elasticsearch (لاگ)',
customDomain: 'دامنهٔ اختصاصی + SSL',
cores: '{n} هسته',
gb: '{n} گیگابایت',
none: 'بدون',
estimatedTitle: 'برآورد هزینه',
perCycle: { hourly: 'در ساعت', monthly: 'در ماه', yearly: 'در سال' },
cycle: { hourly: 'ساعتی', monthly: 'ماهانه', yearly: 'سالانه' },
youSave: '{p}٪ تخفیف اعمال شد',
calculating: 'در حال محاسبه…',
cta: 'ساخت این پکیج',
currency: 'تومان',
error: 'محاسبهٔ هزینه ممکن نشد.',
},
blog: {
title: 'بلاگ و آموزش‌ها',
subtitle: 'راهنماها و تازه‌ترین نوشته‌ها برای ساختن سریع‌تر روی ابربان.',
comingSoon: 'به‌زودی',
cta: 'مشاهدهٔ همهٔ مقالات',
readMore: 'ادامهٔ مطلب',
posts: [
{ tag: 'شروع کار', title: 'اولین اپلیکیشن خود را در چند دقیقه منتشر کن', desc: 'از اتصال ریپازیتوری تا دامنه و SSL خودکار — قدم‌به‌قدم.' },
{ tag: 'بهینه‌سازی هزینه', title: 'منابع را درست انتخاب کن و کمتر هزینه بده', desc: 'CPU، حافظه، رپلیکا و سرویس‌های جانبی را هوشمندانه تنظیم کن.' },
{ tag: 'امنیت', title: 'دامنهٔ اختصاصی و گواهی SSL خودکار', desc: 'دامنه‌ات را وصل کن و بگذار ابربان گواهی را صادر و تمدید کند.' },
],
},
finalCta: {
titleLead: 'آسمان صاف است؛ وقتِ ',
titleHighlight: 'زنده',
titleTail: ' کردنِ اپِ توست.',
body: 'همین حالا حسابت را بساز و اولین دیپلوی را تجربه کن.',
ctaPrimary: 'همین حالا شروع کن',
ctaSecondary: 'داشبورد',
},
footer: {
copyright: 'کلیه حقوق این وبسایت متعلق به ابربان می‌باشد',
contactTitle: 'تماس با ما',
phone: '۰۲۱-۹۱۰۹۲۷۶۲',
email: 'info@abrban.com',
},
},
auth: {
backHome: 'بازگشت به خانه',
login: {
title: 'خوش آمدی',
subtitle: 'با شماره موبایل وارد حساب ابربان شو',
altPrompt: 'هنوز حساب نداری؟',
altLabel: 'ثبت‌نام کن',
tabPassword: 'با رمز عبور',
tabOtp: 'با رمز یکبارمصرف',
phone: 'شماره موبایل',
password: 'رمز عبور',
otpHint: 'یک کد تأیید به شماره موبایلت پیامک می‌شود.',
sendCode: 'ارسال کد',
sending: 'در حال ارسال…',
codeSent: 'کد تأیید پیامک شد',
verifyNeeded: 'برای ادامه، شماره موبایلت را تأیید کن.',
otpTitle: 'تأیید شماره موبایل',
otpSubtitle: 'کد ۶ رقمی پیامک‌شده را وارد کن',
submit: 'ورود',
submitting: 'در حال ورود…',
success: 'با موفقیت وارد شدی!',
error: 'ورود ناموفق بود',
},
register: {
title: 'ساخت حساب',
subtitle: 'در چند دقیقه اولین اپت را منتشر کن',
altPrompt: 'قبلاً حساب ساخته‌ای؟',
altLabel: 'وارد شو',
firstName: 'نام',
firstNamePlaceholder: 'مثلاً علی',
lastName: 'نام خانوادگی',
lastNamePlaceholder: 'مثلاً رضایی',
phone: 'شماره موبایل',
emailOptional: 'ایمیل (اختیاری)',
password: 'رمز عبور',
passwordPlaceholder: 'حداقل ۸ کاراکتر',
submit: 'ساخت حساب',
submitting: 'در حال ساخت حساب…',
codeSent: 'کد تأیید به موبایلت پیامک شد',
success: 'حساب با موفقیت ساخته و تأیید شد!',
error: 'ثبت‌نام ناموفق بود',
verifyError: 'تأیید کد ناموفق بود',
},
otp: {
sentTo: 'کد تأیید به این شماره پیامک شد:',
codeLabel: 'کد تأیید',
verify: 'تأیید و ادامه',
verifying: 'در حال بررسی…',
back: 'بازگشت',
resend: 'ارسال مجدد کد',
resendIn: 'ارسال مجدد تا {s} ثانیه',
},
},
components: {
deleting: 'در حال حذف…',
deletingNamed: 'در حال حذف «{name}»…',
deletingService: 'در حال حذف سرویس…',
deletingApplication: 'در حال حذف اپلیکیشن…',
deletingModalBeingRemoved: '«{name}» برای همیشه حذف می‌شود.',
deletingModalDetailApp: 'این اپلیکیشن، دیپلوی‌ها و داده‌هایش از کلاستر حذف می‌شود. ممکن است یک دقیقه طول بکشد.',
deletingModalDetailService: 'این سرویس و داده‌هایش از کلاستر حذف می‌شود. ممکن است یک دقیقه طول بکشد.',
deletingModalWait: 'لطفاً صبر کن — این صفحه را نبند.',
buildPhases: {
uploading: 'آپلود سورس به کلاستر',
building: 'ساخت ایمیج داکر',
deploying: 'انتشار روی کوبرنتیز',
done: 'دیپلوی کامل شد',
failed: 'دیپلوی ناموفق بود',
cancelled: 'دیپلوی لغو شد',
},
startingDeployment: 'در حال شروع دیپلوی…',
deploymentCancelled: 'دیپلوی لغو شد',
cancelDeploymentFailed: 'لغو دیپلوی ناموفق بود',
minimizeHint: 'برای ادامهٔ کار حین دیپلوی، کوچک کن. بستن (×) دیپلوی را لغو می‌کند.',
buildLogTitle: 'لاگ بیلد',
buildLogWaiting: 'در حال شروع بیلد…',
buildLogLive: 'زنده',
continueInBackground: 'ادامه در پس‌زمینه',
minimizeAria: 'کوچک کن و در پس‌زمینه ادامه بده',
cancelDeploymentAria: 'لغو دیپلوی',
viewProgressFor: 'مشاهدهٔ پیشرفت دیپلوی برای {name}',
prevDeployment: 'دیپلوی قبلی',
nextDeployment: 'دیپلوی بعدی',
upgradeTitle: 'تأیید ارتقای منابع',
upgradeNeedsPay: 'این ارتقا نیازمند پرداخت برای بازهٔ باقی‌ماندهٔ صورت‌حساب است.',
upgradeNoCost: 'این تغییر هزینهٔ اضافه‌ای ندارد.',
currentHourlyCost: 'هزینهٔ ساعتی فعلی',
newHourlyCost: 'هزینهٔ ساعتی جدید',
remainingHoursInPeriod: 'ساعت‌های باقی‌مانده در بازه',
proratedAmountToPay: 'مبلغ تسهیم‌شده برای پرداخت',
walletBalance: 'موجودی کیف‌پول',
tomanPerHour: '{n} تومان/ساعت',
hoursUnit: '{n} ساعت',
tomanUnit: '{n} تومان',
walletShortBy: 'موجودی کیف‌پول {n} تومان کم است. می‌توانی مابه‌التفاوت را از طریق درگاه در صفحهٔ فاکتور پرداخت کنی.',
applying: 'در حال اعمال…',
createInvoicePay: 'ساخت فاکتور و پرداخت',
applyChanges: 'اعمال تغییرات',
res: {
databaseResources: 'منابع دیتابیس',
cpuRequest: 'درخواست CPU',
cpuLimit: 'محدودیت CPU',
memoryRequest: 'درخواست حافظه',
memoryLimit: 'محدودیت حافظه',
oneCore: '۱ هسته',
twoCores: '۲ هسته',
storageGb: 'فضای ذخیره (GB)',
},
deployStatus: {
running: 'در حال اجرا',
pending: 'در انتظار',
building: 'در حال ساخت',
deploying: 'در حال انتشار',
failed: 'ناموفق',
build_failed: 'ساخت ناموفق',
cancelled: 'لغوشده',
stopped: 'متوقف',
active: 'فعال',
suspended: 'معلق',
pending_deletion: 'در انتظار حذف',
},
workloadLogs: {
logs: 'لاگ‌ها',
liveEvery3s: 'زنده (هر ۳ث)',
autoEvery5s: 'تازه‌سازی خودکار (هر ۵ث)',
hideLogs: 'پنهان‌کردن لاگ‌ها',
showLogs: 'نمایش لاگ‌ها',
podLogs: 'لاگ پاد',
buildLogs: 'لاگ بیلد',
noBuildNote: 'خروجی پاد workload (این سرویس بیلد ایمیج ندارد).',
loadingLogs: 'در حال بارگذاری لاگ‌ها…',
serviceStopped: 'سرویس متوقف است. برای دیدن لاگ آن را اجرا کن.',
waitingPods: 'در انتظار آماده‌شدن پادهای workload…',
buildInProgress: 'بیلد در حال انجام… لاگ پس از تکمیل نمایش داده می‌شود.',
buildPending: 'بیلد در صف است…',
noDeployments: 'هنوز دیپلویی نیست. برای دیدن لاگ بیلد اپت را منتشر کن.',
noBuildLogs: 'لاگ بیلدی برای این دیپلوی موجود نیست.',
buildDone: 'انجام شده',
},
externalAccess: {
title: 'دسترسی خارجی',
warning: 'یک NodePort روی IP نود کلاستر باز می‌کند. هر کسی که به آن IP دسترسی داشته باشد تا پایان نشست یا لغو آن می‌تواند متصل شود. برای دسترسی موقت از مدت‌های کوتاه استفاده کن؛ حالت دائمی پورت را تا لغو باز نگه می‌دارد.',
deployFirst: 'برای فعال‌سازی دسترسی خارجی، اول سرویس را منتشر کن.',
service: 'سرویس',
accessMode: 'حالت دسترسی',
temporary: 'موقت',
alwaysOpen: 'همیشه باز',
duration: 'مدت',
persistentNote: 'پورت تا وقتی روی «لغو» کلیک کنی باز می‌ماند. فقط وقتی به یک نقطهٔ پایانیِ خارجیِ پایدار نیاز داری استفاده کن.',
opening: 'در حال باز کردن…',
openPermanently: 'باز کردن دائمی پورت',
enableAccess: 'فعال‌سازی دسترسی',
noSessions: 'نشست دسترسی خارجی فعالی وجود ندارد.',
revoke: 'لغو',
endpoint: 'نقطهٔ پایانی',
url: 'آدرس',
permanentUntilRevoked: 'دائمی (تا لغو)',
expired: 'منقضی‌شده',
targets: {
database: 'دیتابیس',
redis: 'Redis',
rabbitmq_amqp: 'RabbitMQ (AMQP)',
rabbitmq_management: 'رابط مدیریت RabbitMQ',
},
permanentEnabled: 'دسترسی خارجی دائمی فعال شد',
temporaryEnabled: 'دسترسی خارجی موقت فعال شد',
enableFailed: 'فعال‌سازی دسترسی ناموفق بود',
revoked: 'دسترسی لغو شد',
revokeFailed: 'لغو دسترسی ناموفق بود',
hShort: 'س',
mShort: 'د',
sShort: 'ث',
},
dbConfig: {
engine: 'موتور دیتابیس',
version: 'نسخه',
credentials: 'اطلاعات ورود دیتابیس',
credentialsOptional: '(اختیاری — اگر خالی باشد خودکار ساخته می‌شود)',
username: 'نام کاربری',
usernamePlaceholder: 'appuser',
password: 'رمز عبور',
passwordPlaceholder: 'تولید خودکار',
generatePassword: 'تولید رمز تصادفی',
credentialsNote: 'برای دسترسی داخلی کلاستر استفاده می‌شود. پس از انتشار از دسترسی خارجی موقت یا دائمی زیر استفاده کن.',
uploadDumpLabel: 'اختیاری: آپلود dump دیتابیس برای بازیابی هنگام ساخت',
remove: 'حذف',
uploadHint: 'یک SQL dump آپلود کن تا پس از ساخت دیتابیس بازیابی شود',
uploadConstraints: 'اختیاری • حداکثر ۵۰۰ مگابایت • .sql, .gz, .dump',
allowedFormats: 'مجاز: .sql، .gz، .dump',
maxSize: 'حداکثر ۵۰۰ مگابایت',
storageSize: 'اندازهٔ فضای ذخیرهٔ دیتابیس',
suggestedFromDump: 'پیشنهادشده از dump (حداقل {gi} GiB)',
minimumGb: 'حداقل {n} GB',
mustFitDump: ' (باید dump آپلودشده را جا دهد)',
expansionOnly: ' • فقط افزایش پس از ساخت مجاز است',
storageTooSmallTitle: 'فضای ذخیره خیلی کم است',
ok: 'باشه',
storageTooSmallDetail: 'حجم dump دیتابیس شما حدود {dumpGi} GiB است. فضای ذخیرهٔ دیتابیس باید حداقل {need} GiB باشد (شما {selected} GiB انتخاب کردی). فضای ذخیره را افزایش بده و دوباره تلاش کن.',
},
snapshots: {
title: 'اسنپ‌شات‌ها',
newSnapshot: 'اسنپ‌شات جدید',
creating: 'در حال ساخت…',
hide: 'پنهان',
show: 'نمایش',
deployFirst: 'اول سرویس را منتشر کن',
waitCurrent: 'منتظر پایان بکاپ فعلی بمان',
infoNote: 'اسنپ‌شات‌های دیتابیس یک SQL dump ذخیره می‌کنند که بعداً می‌توانی دانلود کنی. وقتی پیشرفت به ۱۰۰٪ رسید از دکمهٔ دانلود استفاده کن. تا ۱۰ اسنپ‌شات نگه داشته می‌شود؛ قدیمی‌ترها خودکار حذف می‌شوند.',
loadingBackups: 'در حال بارگذاری بکاپ‌ها…',
noBackups: 'هنوز بکاپی نیست',
noBackupsHint: 'برای ساخت اولین dump دیتابیس روی «اسنپ‌شات جدید» بزن.',
defaultLabel: 'بکاپ دیتابیس',
auto: 'خودکار',
manual: 'دستی',
dumping: 'در حال dump…',
preparing: 'آماده‌سازی dump…',
exporting: 'استخراج دیتابیس…',
finalizing: 'نهایی‌سازی…',
creatingDump: 'ساخت dump دیتابیس…',
dump: 'dump',
downloadTitle: 'دانلود dump دیتابیس',
deleteTitle: 'حذف بکاپ',
removeFailedTitle: 'حذف بکاپ ناموفق',
maxKept: 'حداکثر ۱۰ بکاپ نگه داشته می‌شود.',
backupReady: 'بکاپ آماده است — حالا می‌توانی dump را دانلود کنی',
backupFailed: 'بکاپ ناموفق بود',
backupStarted: 'بکاپ آغاز شد — dump در حال انجام',
createFailed: 'ساخت بکاپ ناموفق بود',
backupDeleted: 'بکاپ حذف شد',
deleteFailed: 'حذف بکاپ ناموفق بود',
downloadStarted: 'دانلود آغاز شد',
downloadFailed: 'دانلود dump دیتابیس ناموفق بود',
deleteConfirmTitle: 'حذف بکاپ؟',
deleteConfirmMessage: 'حذف «{label}»؟ فایل dump برای همیشه حذف می‌شود.',
snapStatus: { completed: 'کامل', failed: 'ناموفق' },
},
serviceResources: {
title: 'منابع و مقیاس‌بندی',
hide: 'پنهان',
monitor: 'پایش',
deployToView: 'برای دیدن متریک‌ها و تنظیم منابع، سرویس را منتشر کن.',
loadingMetrics: 'در حال بارگذاری متریک‌ها…',
replicas: 'رپلیکاها',
pods: 'پادها',
metrics: 'متریک‌ها',
serviceStopped: 'سرویس متوقف است.',
noMetrics: 'هنوز متریک منابعی نیست.',
storage: 'فضای ذخیره',
loadingStorage: 'در حال بارگذاری فضای ذخیره…',
used: 'مصرف‌شده',
allocated: 'تخصیص‌یافته',
expansionNote: 'فقط افزایش مجاز است. از «اعمال تغییرات» زیر استفاده کن.',
storageChargedNote: ' فضای ذخیرهٔ اضافه برای بازهٔ باقی‌ماندهٔ صورت‌حساب محاسبه می‌شود.',
storageUnavailable: 'متریک فضای ذخیره در دسترس نیست.',
adjustCpuMem: 'تنظیم CPU / حافظه',
redisResources: 'منابع Redis',
rabbitmqResources: 'منابع RabbitMQ',
upgradeChargeNote: 'ارتقاهایی که هزینه را افزایش می‌دهند برای بازهٔ باقی‌ماندهٔ صورت‌حساب (کیف‌پول یا فاکتور) محاسبه می‌شوند، مثل اپلیکیشن‌ها.',
applying: 'در حال اعمال…',
applyChanges: 'اعمال تغییرات',
restoreDump: 'بازیابی dump دیتابیس',
restoring: 'در حال بازیابی دیتابیس…',
uploadToRestore: 'آپلود SQL dump برای بازیابی',
uploadFormats: '.sql، .gz یا .dump — حداکثر ۵۰۰ مگابایت',
workloads: { database: 'دیتابیس', redis: 'Redis', rabbitmq: 'RabbitMQ' },
resourcesUpdated: 'منابع به‌روزرسانی شد',
updateFailed: 'به‌روزرسانی منابع ناموفق بود',
upgradedPaid: 'منابع ارتقا یافت! {amount} تومان پرداخت شد',
updatedSuccess: 'منابع با موفقیت به‌روزرسانی شد',
upgradeFailed: 'ارتقای منابع ناموفق بود',
calcFailed: 'محاسبهٔ هزینهٔ ارتقا ناموفق بود',
invoiceCreated: 'فاکتور ساخته شد. روش پرداخت را انتخاب کن.',
invoiceFailed: 'ساخت فاکتور ارتقا ناموفق بود',
restoredSuccess: 'دیتابیس با موفقیت بازیابی شد',
restoreFailed: 'بازیابی دیتابیس ناموفق بود',
uploadFailed: 'آپلود dump دیتابیس ناموفق بود',
invalidFile: 'لطفاً فایل .sql، .dump یا .gz آپلود کن',
fileTooLarge: 'حجم فایل باید کمتر از ۵۰۰ مگابایت باشد',
renewFirst: 'پیش از تغییر منابع، سرویس را تمدید کن',
},
},
nav: {
sectionAdmin: 'مدیریت',
sectionTechnical: 'فنی',
sectionSales: 'فروش',
walletBalanceTitle: 'موجودی کیف‌پول',
dashboard: 'داشبورد',
applications: 'اپلیکیشن‌ها',
services: 'دیتابیس‌ها و سرویس‌ها',
logs: 'لاگ‌ها',
newDeploy: 'دیپلوی جدید',
wallet: 'کیف‌پول',
invoices: 'فاکتورها',
tickets: 'تیکت‌ها',
account: 'حساب من',
users: 'کاربران',
allApplications: 'همهٔ اپلیکیشن‌ها',
billingPlans: 'پلن‌های صورت‌حساب',
clusters: 'کلاسترها',
clusterPools: 'پول‌های کلاستر',
allTickets: 'همهٔ تیکت‌ها',
technicalTickets: 'تیکت‌های فنی',
salesTickets: 'تیکت‌های فروش',
},
dashboard: {
account: {
title: 'حساب من',
subtitle: 'اطلاعات حساب، شماره موبایل و رمز عبورت را مدیریت کن.',
personalInfo: 'اطلاعات شخصی',
firstName: 'نام',
lastName: 'نام خانوادگی',
emailOptional: 'ایمیل (اختیاری)',
emailHint: 'ایمیل فقط برای ارتباط است و در ورود استفاده نمی‌شود.',
save: 'ذخیره',
saving: 'در حال ذخیره…',
savedName: 'اطلاعات با موفقیت ذخیره شد',
verified: 'تأیید شده',
unverified: 'تأیید نشده',
notSet: 'ثبت نشده',
verifyNow: 'تأیید',
currentPassword: 'رمز عبور فعلی',
passwordReason: 'برای تغییر شماره موبایل، رمز فعلی لازم است.',
sendCode: 'ارسال کد',
sending: 'در حال ارسال…',
codeSent: 'کد تأیید پیامک شد',
codeSentTo: 'کد تأیید به این شماره پیامک شد:',
enterCode: 'کد تأیید',
confirm: 'تأیید',
verifying: 'در حال بررسی…',
resend: 'ارسال مجدد کد',
cancel: 'انصراف',
phoneUpdated: 'شماره موبایل با موفقیت به‌روزرسانی شد',
changePassword: 'تغییر رمز عبور',
newPassword: 'رمز عبور جدید',
confirmPassword: 'تکرار رمز عبور جدید',
passwordMismatch: 'رمز عبور جدید و تکرار آن یکسان نیستند',
passwordChanged: 'رمز عبور با موفقیت تغییر کرد',
passwordHint: 'حداقل ۸ کاراکتر',
errorGeneric: 'انجام عملیات ناموفق بود',
phone: {
label: 'شماره موبایل',
empty: 'شماره‌ای ثبت نشده',
add: 'افزودن شماره',
change: 'تغییر شماره',
newLabel: 'شماره موبایل جدید',
},
},
status: {
running: 'در حال اجرا',
pending: 'در انتظار',
building: 'در حال بیلد',
deploying: 'در حال انتشار',
failed: 'ناموفق',
build_failed: 'خطای بیلد',
cancelled: 'لغو شده',
stopped: 'متوقف',
},
home: {
welcome: 'خوش آمدی، {name}!',
overview: 'نمای کلیِ اپلیکیشن‌ها و سرویس‌های مدیریت‌شدهٔ تو.',
creditsTitle: 'اعتبارِ پیش‌پرداختِ منابع',
creditsBody:
'اگر اپی را پیش از پایان پلنت حذف کنی، می‌توانی تا زمان انقضای اعتبار، اپ جدیدی با همان منابع و بدون هزینهٔ اضافه منتشر کنی.',
fromApp: 'از اپِ «{name}»',
resourceCredit: 'اعتبارِ منابع',
remaining: '{label} باقی‌مانده',
expires: 'انقضا {date}',
cpu: 'پردازنده',
ram: 'حافظه',
replicas: 'تعداد نمونه',
db: 'دیتابیس',
dbDisk: 'دیسکِ دیتابیس',
appDisk: 'دیسکِ اپ',
useOnNewApp: 'استفاده روی اپ جدید →',
statApplications: 'اپلیکیشن‌ها',
statAppsRunning: 'اپ‌های در حال اجرا',
statManagedServices: 'سرویس‌های مدیریت‌شده',
statServicesRunning: 'سرویس‌های در حال اجرا',
appsFailed: '{n} اپلیکیشن ناموفق',
servicesFailed: '{n} سرویس ناموفق',
recentApplications: 'اپلیکیشن‌های اخیر',
newApplication: 'اپلیکیشن جدید',
noApplications: 'هنوز اپلیکیشنی نداری',
deployFirst: 'اولین اپت را منتشر کن',
viewAllApplications: 'مشاهدهٔ همهٔ {n} اپلیکیشن →',
recentServices: 'دیتابیس‌ها و سرویس‌های اخیر',
newService: 'سرویس جدید',
noServices: 'هنوز سرویس مدیریت‌شده‌ای نداری',
createServiceCta: 'ساخت دیتابیس یا سرویس',
viewAllServices: 'مشاهدهٔ همهٔ {n} سرویس →',
replica: 'نمونه',
replicaPlural: 'نمونه',
},
apps: {
title: 'اپلیکیشن‌های من',
count: '{n} اپلیکیشن',
newApplication: 'اپلیکیشن جدید',
noApplications: 'هنوز اپلیکیشنی نداری',
emptyDesc: 'برای شروع، اولین اپلیکیشنت را منتشر کن.',
deployFirst: 'اولین اپت را منتشر کن',
colApplication: 'اپلیکیشن',
colRuntime: 'محیط اجرا',
colStatus: 'وضعیت',
colServiceStatus: 'وضعیت سرویس',
colExpiry: 'انقضا',
colActions: 'عملیات',
view: 'مشاهده',
lifecycle: {
active: 'فعال',
suspended: 'معلق — پرداخت‌نشده',
pending_deletion: 'در انتظار حذف',
deleted: 'حذف‌شده',
},
expired: 'منقضی شده',
daysHours: '{d} روز و {h} ساعت باقی‌مانده',
hours: '{h} ساعت باقی‌مانده',
mins: '{m} دقیقه باقی‌مانده',
noPlan: 'بدون پلن',
deleteTitle: 'حذف اپلیکیشن',
deleteMessage:
'اپلیکیشن «{name}» و همهٔ داده‌هایش برای همیشه حذف شود؟\n\nاگر از پلنت زمان باقی مانده باشد، منابع پیش‌پرداخت‌شده روی داشبوردت نمایش داده می‌شود تا بدون هزینهٔ اضافه روی اپ جدید استفاده کنی.',
deleted: 'اپلیکیشن حذف شد',
deletedWithCredit: 'اپلیکیشن حذف شد. منابع پیش‌پرداختت روی داشبورد نمایش داده می‌شود.',
},
services: {
title: 'دیتابیس‌ها و سرویس‌ها',
subtitle: 'دیتابیس‌های مستقل، Redis و RabbitMQ — {n} سرویس',
newService: 'سرویس جدید',
noServices: 'هنوز سرویس مدیریت‌شده‌ای نداری',
emptyDesc: 'بدون انتشار یک اپلیکیشن کامل، یک دیتابیس، Redis یا RabbitMQ بساز.',
createFirst: 'اولین سرویست را بساز',
deleteTitle: 'حذف سرویس؟',
deleteMessage: 'سرویس «{name}» برای همیشه حذف شود؟ این عمل قابل بازگشت نیست.',
deleted: 'سرویس حذف شد',
deletedWithCredit: 'سرویس حذف شد. منابع پیش‌پرداختت روی داشبورد است.',
},
wallet: {
title: 'کیف‌پول',
subtitle: 'موجودی و تراکنش‌هایت را مدیریت کن',
currentBalance: 'موجودی فعلی',
toman: 'تومان',
topUp: 'افزایش موجودی',
amountPlaceholder: 'مبلغ (تومان) — حداقل ۱٬۰۰۰',
payNow: 'پرداخت',
transactionHistory: 'تاریخچهٔ تراکنش‌ها',
noTransactions: 'هنوز تراکنشی نداری',
balanceAfter: 'موجودی: {amount} {unit}',
invoice: 'فاکتور {number}',
minChargeError: 'حداقل مبلغ شارژ ۱٬۰۰۰ تومان است',
chargedSuccess: 'کیف‌پول با موفقیت شارژ شد',
chargeFailed: 'شارژ کیف‌پول ناموفق بود',
paymentSuccess: 'پرداخت موفق — کیف‌پول شارژ شد',
paymentFailed: 'پرداخت ناموفق بود',
topUpDesc: 'شارژ کیف‌پول',
topUpGatewayDesc: 'شارژ کیف‌پول از طریق درگاه',
txTypes: {
charge: 'واریز',
deduction: 'پرداخت',
refund: 'بازگشت وجه',
gateway_payment: 'پرداخت درگاهی',
},
},
tickets: {
status: { open: 'باز', waiting: 'در انتظار', answered: 'پاسخ‌داده‌شده', closed: 'بسته' },
priority: { low: 'کم', medium: 'متوسط', high: 'زیاد' },
department: { technical: 'فنی', sales: 'فروش' },
departmentFull: { technical: 'پشتیبانی فنی', sales: 'فروش' },
role: { admin: 'مدیر', technical: 'فنی', sales: 'فروش' },
myTickets: 'تیکت‌های من',
myTicketsSubtitle: 'تیکت‌های پشتیبانی و وضعیتشان',
newTicket: 'تیکت جدید',
createNewTicket: 'ساخت تیکت جدید',
subject: 'موضوع',
subjectPlaceholder: 'توضیح کوتاهی از مشکلت',
departmentField: 'بخش',
priorityField: 'اولویت',
messageField: 'پیام',
messagePlaceholder: 'مشکلت را با جزئیات توضیح بده…',
submitTicket: 'ثبت تیکت',
creating: 'در حال ساخت…',
noTickets: 'هنوز تیکتی نداری',
noTicketsHint: 'اگر به کمک نیاز داری یک تیکت بساز',
createdSuccess: 'تیکت با موفقیت ساخته شد',
createFailed: 'ساخت تیکت ناموفق بود',
messages: '{n} پیام',
msg: '{n} پیام',
back: 'بازگشت',
notFound: 'تیکت پیدا نشد',
by: 'توسط',
closeTicket: 'بستن تیکت',
closedNotice: 'این تیکت بسته شده است. اگر باز هم کمک خواستی، تیکت جدیدی بساز.',
replyPlaceholder: 'پاسخت را بنویس…',
send: 'ارسال',
replySent: 'پاسخ ارسال شد',
replyFailed: 'ارسال پاسخ ناموفق بود',
ticketClosed: 'تیکت بسته شد',
unknown: 'ناشناس',
ticketsTitle: 'تیکت‌های {dept}',
totalTickets: '{n} تیکت در مجموع',
unanswered: 'بی‌پاسخ',
needResponse: 'نیازمند پاسخ',
answered: 'پاسخ‌داده‌شده',
waitingForUser: 'منتظر کاربر',
totalOpen: 'مجموع باز',
excludingClosed: 'به‌جز بسته‌ها',
all: 'همه',
noTicketsStaff: 'تیکتی نیست',
noStatusTickets: 'تیکت «{status}» وجود ندارد',
noDeptTickets: 'در این بخش تیکتی نیست',
allTickets: 'همهٔ تیکت‌ها',
allTicketsSubtitle: 'نمای کلیِ همهٔ تیکت‌های پشتیبانی در همهٔ بخش‌ها',
totalTicketsStat: 'کل تیکت‌ها',
needStaffResponse: 'نیازمند پاسخ پشتیبان',
avgResponseTime: 'میانگین زمان پاسخ',
byDepartment: 'بر اساس بخش',
departmentLabel: 'بخش:',
statusLabel: 'وضعیت:',
noTicketsFound: 'تیکتی پیدا نشد',
minutes: '{n} دقیقه',
hours: '{n} ساعت',
days: '{n} روز',
},
invoices: {
status: {
draft: 'پیش‌نویس',
issued: 'پرداخت‌نشده',
partially_paid: 'پرداخت جزئی',
paid: 'پرداخت‌شده',
void: 'باطل',
failed: 'ناموفق',
},
title: 'فاکتورها',
subtitle: 'ببین هر پرداخت بابت چه بوده و فاکتورهای باز را پرداخت کن.',
subtotal: 'جمع جزء',
walletBalance: 'موجودی کیف‌پول',
toman: 'تومان',
filterAll: 'همه',
filterUnpaid: 'پرداخت‌نشده',
loadingInvoices: 'در حال بارگذاری فاکتورها…',
noInvoices: 'فاکتوری پیدا نشد',
total: 'مجموع',
due: 'مانده',
paidLabel: 'پرداخت‌شده',
method: 'روش',
selectInvoice: 'برای دیدن جزئیات یک فاکتور را انتخاب کن',
downloadPdf: 'دانلود PDF',
lineItems: 'اقلام',
payment: 'پرداخت',
walletCoversNote: 'موجودی کیف‌پول {wallet} تومان را پوشش می‌دهد. مابقی {rest} تومان از طریق درگاه پرداخت می‌شود.',
processing: 'در حال پردازش…',
pay: 'پرداخت',
paidOn: 'پرداخت‌شده در {date}',
paymentFailed: 'پرداخت ناموفق بود',
waitingRemaining: 'منتظر پرداخت مابقی.',
paymentComplete: 'پرداخت کامل شد',
paymentCompleteUpdated: 'پرداخت کامل شد و سرویس به‌روزرسانی شد',
gatewayFailed: 'پرداخت درگاهی ناموفق بود',
invoicePaid: 'فاکتور پرداخت شد',
invoicePaidUpdated: 'فاکتور پرداخت شد و سرویس به‌روزرسانی شد',
downloadFailed: 'دانلود PDF فاکتور ناموفق بود',
adminTitle: 'مدیریت فاکتورها',
adminSubtitle: 'پیگیری همهٔ فاکتورهای کاربران، پرداخت‌ها، ارجاع درگاه و تراکنش‌های کیف‌پول.',
searchPlaceholder: 'جستجوی فاکتور، ایمیل یا اپلیکیشن',
allStatuses: 'همهٔ وضعیت‌ها',
allMethods: 'همهٔ روش‌ها',
methodWallet: 'کیف‌پول',
methodGateway: 'درگاه',
methodMixed: 'ترکیبی',
colInvoice: 'فاکتور',
colUser: 'کاربر',
colStatus: 'وضعیت',
colMethod: 'روش',
colDue: 'مانده',
selectInvoiceShort: 'یک فاکتور را انتخاب کن',
tracking: 'کد رهگیری',
transactions: 'تراکنش‌ها',
noTransactions: 'هنوز تراکنشی متصل نشده',
manualStatusChange: 'تغییر دستی وضعیت',
reasonPlaceholder: 'برای ثبت در لاگ، ذکر دلیل الزامی است',
failedBtn: 'ناموفق',
voidBtn: 'باطل',
statusUpdated: 'وضعیت فاکتور به‌روزرسانی شد',
statusUpdateFailed: 'به‌روزرسانی وضعیت فاکتور ناموفق بود',
reasonRequired: 'برای تغییر دستی وضعیت، ذکر دلیل الزامی است',
pdf: {
documentTitle: 'فاکتور',
tagline: 'زیرساخت ابری، در کنترل تو',
invoiceNumberLabel: 'شمارهٔ فاکتور',
colIndex: 'ردیف',
colDesc: 'شرح اقلام',
colAmount: 'مبلغ',
customer: 'مشتری',
phone: 'تلفن تماس',
application: 'اپلیکیشن',
createdAt: 'تاریخ صدور',
paidAt: 'تاریخ پرداخت',
subtotal: 'جمع جزء',
generatedAt: 'این سند در تاریخ {date} به‌صورت خودکار صادر شده است.',
footer: 'ابربان — abrban.com',
},
},
logs: {
title: 'لاگ‌ها',
subtitle: 'لاگ اپلیکیشن، Redis، RabbitMQ و دیتابیس در یک‌جا',
levels: { all: 'همهٔ سطوح', error: 'خطا', warn: 'هشدار', info: 'اطلاع', debug: 'دیباگ' },
sources: { all: 'همهٔ منابع', app: 'اپلیکیشن', redis: 'Redis', rabbitmq: 'RabbitMQ', database: 'دیتابیس' },
ranges: { '1h': 'یک ساعت اخیر', '6h': '۶ ساعت اخیر', '24h': '۲۴ ساعت اخیر', '7d': '۷ روز اخیر' },
resource: 'منبع',
allResources: 'همهٔ منابع',
applicationsGroup: 'اپلیکیشن‌ها',
servicesGroup: 'دیتابیس‌ها و سرویس‌ها',
source: 'منبع',
level: 'سطح',
timeRange: 'بازهٔ زمانی',
search: 'جستجو',
searchPlaceholder: 'جستجوی پیام…',
loading: 'در حال بارگذاری',
refresh: 'تازه‌سازی',
autoRefresh: 'تازه‌سازی خودکار (۵ث)',
totalPeriod: 'مجموع ({period})',
errors: 'خطاها',
warnings: 'هشدارها',
sourcesStat: 'منابع',
loadFailed: 'بارگذاری لاگ‌ها ناموفق بود. مطمئن شو لاگینگ روی اپت فعال است و Elasticsearch در حال اجراست.',
logEntries: 'ورودی‌های لاگ',
totalPage: '{total} مورد · صفحهٔ {page}/{pages}',
loadingLogs: 'در حال بارگذاری لاگ‌ها…',
noLogs: 'برای فیلترهای انتخاب‌شده لاگی پیدا نشد.',
noLogsHint: 'برای شروع جمع‌آوری لاگ، اپی با لاگینگ فعال منتشر کن.',
colTime: 'زمان',
colLevel: 'سطح',
colApp: 'اپ',
colSource: 'منبع',
colMessage: 'پیام',
prev: 'قبلی',
next: 'بعدی',
reconnecting: 'در حال اتصال مجدد به لاگینگ…',
notAvailable: 'لاگینگ در دسترس نیست',
notAvailableMessage: 'Elasticsearch مرکزی روی کلاستر مستقر نشده است. هنگام انتشار اپ، افزونهٔ لاگینگ را فعال کن و از مدیر بخواه استک لاگینگ را مستقر کند.',
checkingConnection: 'در حال بررسی اتصال…',
retryingAuto: 'هر چند ثانیه به‌صورت خودکار تلاش می‌شود.',
elasticDisabledTitle: 'لاگ‌گیری Elasticsearch فعال نیست',
elasticDisabledMessage: 'برای این اپلیکیشن هنگام ساخت، گزینهٔ Elasticsearch را فعال نکرده‌ای؛ به همین دلیل لاگ متمرکز در دسترس نیست. هنگام انتشار یک اپ جدید افزونهٔ Elasticsearch را فعال کن تا لاگ‌های آن اینجا نمایش داده شود.',
elasticDisabledMessageAll: 'هیچ‌کدام از اپلیکیشن‌هایت هنگام ساخت، Elasticsearch را فعال نکرده‌اند؛ به همین دلیل لاگ متمرکز در دسترس نیست. هنگام انتشار یک اپ جدید افزونهٔ Elasticsearch را فعال کن تا لاگ‌های آن اینجا نمایش داده شود.',
},
users: {
title: 'مدیریت کاربران',
count: '{n} کاربر ثبت‌شده',
addUser: 'افزودن کاربر',
createNewUser: 'ساخت کاربر جدید',
firstName: 'نام',
lastName: 'نام خانوادگی',
phone: 'شماره موبایل',
email: 'ایمیل',
emailOptional: 'ایمیل (اختیاری)',
password: 'رمز عبور',
firstNamePlaceholder: 'مثلاً علی',
lastNamePlaceholder: 'مثلاً رضایی',
phonePlaceholder: '09123456789',
emailPlaceholder: 'name@example.com',
passwordMin: 'حداقل ۸ کاراکتر',
role: 'نقش',
roles: { user: 'کاربر', admin: 'مدیر', technical: 'فنی', sales: 'فروش' },
creating: 'در حال ساخت…',
createUser: 'ساخت کاربر',
searchPlaceholder: 'جستجو بر اساس نام، موبایل یا ایمیل…',
noUsersSearch: 'کاربری مطابق جستجو پیدا نشد.',
noUsers: 'هنوز کاربری نیست.',
colUser: 'کاربر',
colPhone: 'موبایل',
colEmail: 'ایمیل',
colRole: 'نقش',
colStatus: 'وضعیت',
colApps: 'اپ‌ها',
colCreated: 'تاریخ ایجاد',
colActions: 'عملیات',
active: 'فعال',
inactive: 'غیرفعال',
appsCount: '{n} اپ',
passwordBtn: 'رمز عبور',
deactivate: 'غیرفعال‌سازی',
activate: 'فعال‌سازی',
setPassword: 'تنظیم رمز عبور',
newPasswordFor: 'رمز عبور جدید برای',
savePassword: 'ذخیرهٔ رمز',
saving: 'در حال ذخیره…',
createdSuccess: 'کاربر با موفقیت ساخته شد',
createFailed: 'ساخت کاربر ناموفق بود',
userUpdated: 'کاربر به‌روزرسانی شد',
roleUpdated: 'نقش به‌روزرسانی شد',
passwordUpdated: 'رمز عبور به‌روزرسانی شد',
passwordFailed: 'به‌روزرسانی رمز ناموفق بود',
detail: {
back: 'بازگشت',
notFound: 'کاربر پیدا نشد',
loading: 'در حال بارگذاری…',
viewDetails: 'مشاهدهٔ جزئیات',
tabOverview: 'نمای کلی',
tabApplications: 'اپلیکیشن‌ها',
tabActivity: 'تاریخچه فعالیت',
tabErrors: 'خطاها',
tabTickets: 'تیکت‌ها',
accountStatus: 'وضعیت حساب',
basicInfo: 'اطلاعات پایه',
walletBalance: 'موجودی کیف پول',
revenue: 'درآمد ایجادشده',
totalCharged: 'مجموع شارژ',
totalRefunded: 'مجموع بازگشت',
joinedAt: 'تاریخ عضویت',
namespace: 'فضای‌نام',
recentTransactions: 'آخرین تراکنش‌ها',
noTransactions: 'تراکنشی ثبت نشده.',
countsTitle: 'آمار خلاصه',
appsTotal: 'کل اپلیکیشن‌ها',
appsActive: 'اپ‌های فعال',
appsDeleted: 'اپ‌های حذف/بایگانی‌شده',
managedServices: 'سرویس‌های مدیریت‌شده',
optionalServices: 'سرویس‌های جانبی',
deploymentsCount: 'دیپلوی‌ها',
ticketsOpenCount: 'تیکت‌های باز',
txType: 'نوع',
txAmount: 'مبلغ',
txBalance: 'موجودی پس از',
txDesc: 'توضیح',
txDate: 'تاریخ',
txTypes: { charge: 'شارژ', deduction: 'کسر', refund: 'بازگشت', gateway_payment: 'پرداخت درگاه' },
appName: 'نام',
appType: 'نوع',
appStatus: 'وضعیت',
appExpires: 'انقضای سرویس',
appCreated: 'تاریخ ایجاد',
appResources: 'منابع',
activeApps: 'اپ‌های فعال',
deletedApps: 'اپ‌های حذف/بایگانی‌شده',
noApps: 'اپلیکیشنی نیست.',
expired: 'منقضی‌شده',
remainingDays: '{n} روز باقی‌مانده',
remainingHours: '{n} ساعت باقی‌مانده',
lifecycle: { active: 'فعال', suspended: 'معلق', pending_deletion: 'در انتظار حذف', docked: 'بایگانی‌شده', deleted: 'حذف‌شده' },
restore: { restorable: 'قابل بازگردانی', recoverable: 'با پرداخت قابل احیا', none: 'غیرقابل بازگردانی' },
errorApp: 'اپلیکیشن',
errorReason: 'علت خطا',
errorTime: 'زمان',
errorState: 'وضعیت',
errorResolved: 'حل‌شده',
errorOpen: 'باز',
noErrors: 'خطای Build/Deploy ثبت نشده.',
noErrorMessage: 'پیام خطایی ثبت نشده.',
viewLogs: 'مشاهدهٔ لاگ',
hideLogs: 'بستن لاگ',
buildLog: 'لاگ Build',
deployLog: 'لاگ Deploy',
noLog: 'لاگی موجود نیست.',
noActivity: 'فعالیتی ثبت نشده.',
activityTypes: { app_created: 'ساخت اپلیکیشن', app_docked: 'بایگانی اپلیکیشن', app_deleted: 'حذف اپلیکیشن', deployment: 'دیپلوی', transaction: 'تراکنش کیف پول', ticket: 'تیکت پشتیبانی' },
ticketSubject: 'موضوع',
ticketStatus: 'وضعیت',
ticketDept: 'دپارتمان',
ticketPriority: 'اولویت',
ticketMessages: '{n} پیام',
noTickets: 'تیکتی ثبت نشده.',
viewConversation: 'مشاهدهٔ گفتگو',
hideConversation: 'بستن گفتگو',
ticketStatuses: { open: 'باز', answered: 'پاسخ داده‌شده', waiting: 'در انتظار پاسخ', closed: 'بسته' },
ticketDepts: { technical: 'فنی', sales: 'فروش' },
ticketPriorities: { low: 'کم', medium: 'متوسط', high: 'زیاد' },
senderRoles: { user: 'کاربر', admin: 'مدیر', technical: 'پشتیبان فنی', sales: 'کارشناس فروش' },
loginAsUser: 'ورود به‌عنوان کاربر',
impersonateFailed: 'ورود به‌عنوان کاربر ناموفق بود',
impersonatingBanner: 'شما در حال مشاهدهٔ پنل به‌عنوان «{name}» هستید',
exitImpersonation: 'خروج از حالت کاربر',
tabAudit: 'گزارش ورود ادمین',
auditAction: 'رویداد',
auditAdmin: 'ادمین',
auditTime: 'زمان',
auditIp: 'IP',
noAudit: 'هیچ ورود ادمینی ثبت نشده.',
auditActions: { impersonation_start: 'ورود به‌عنوان کاربر', impersonation_stop: 'خروج از حالت کاربر' },
},
},
pools: {
title: 'پول‌های کلاستر',
subtitle: 'گروه‌های متوازن‌شدهٔ کلاستر برای توزیع خودکار اپ‌ها',
createPool: 'ساخت پول',
editTitle: 'ویرایش «{name}»',
createNewPool: 'ساخت پول کلاستر جدید',
poolName: 'نام پول',
strategy: 'استراتژی',
strategyOptions: {
'weighted-resource': 'منابع وزن‌دار — اولویت با ظرفیت سالم و وزن بالاتر',
'least-loaded': 'کم‌بارترین — اولویت با کمترین CPU، حافظه و فشار پاد',
'weighted-round-robin': 'چرخشی وزن‌دار — چرخش متناسب با وزن',
'region-based': 'بر اساس منطقه — اولویت با منطقهٔ منطبق، سپس وزن و بار',
'least-apps': 'کمترین اپ — انتشار روی کلاستر با کمترین اپ',
'round-robin': 'چرخشی — چرخش یکنواخت بین کلاسترها',
},
strategyShort: {
'weighted-resource': 'منابع وزن‌دار',
'least-loaded': 'کم‌بارترین',
'weighted-round-robin': 'چرخشی وزن‌دار',
'region-based': 'بر اساس منطقه',
'least-apps': 'کمترین اپ',
'round-robin': 'چرخشی',
},
priority: 'اولویت',
description: 'توضیحات',
descriptionPlaceholder: 'پول متوازن‌شده برای بارهای کاری پروداکشن',
useAsDefault: 'استفاده به‌عنوان پول تخصیص پیش‌فرض',
selectClusters: 'انتخاب کلاسترها ({n} انتخاب‌شده)',
noClustersRegistered: 'هیچ کلاستری ثبت نشده. اول کلاستر اضافه کن.',
defaultBadge: 'پیش‌فرض',
na: 'نامشخص',
weight: 'وزن',
saving: 'در حال ذخیره…',
updatePool: 'به‌روزرسانی پول',
poolCreated: 'پول کلاستر ساخته شد!',
createFailed: 'ساخت پول ناموفق بود',
poolUpdated: 'پول کلاستر به‌روزرسانی شد!',
updateFailed: 'به‌روزرسانی پول ناموفق بود',
poolDeleted: 'پول کلاستر حذف شد',
noPools: 'هنوز پول کلاستری ساخته نشده',
noPoolsHint: 'برای فعال‌سازی انتشار متوازن روی چند کلاستر، یک پول بساز',
active: 'فعال',
inactive: 'غیرفعال',
defaultPool: 'پول پیش‌فرض',
priorityBadge: 'اولویت {n}',
noClustersInPool: 'کلاستری در این پول نیست (شاید حذف شده‌اند)',
clustersActive: '{active}/{total} کلاستر فعال · ایجاد {date}',
edit: 'ویرایش',
remove: 'حذف',
deletePoolTitle: 'حذف پول «{name}»',
deletePoolMessage: 'اپ‌هایی که از قبل به این پول اختصاص یافته‌اند، کلاستر فعلی‌شان را حفظ می‌کنند.',
clusterStatus: { active: 'فعال', inactive: 'غیرفعال', error: 'خطا' },
clusterHealth: { healthy: 'سالم', degraded: 'نزول‌یافته', unhealthy: 'ناسالم', unknown: 'نامشخص' },
},
clusters: {
title: 'مدیریت کلاسترها',
count: '{n} کلاستر ثبت‌شده',
addCluster: 'افزودن کلاستر',
registerNew: 'ثبت کلاستر جدید',
verifyNote: 'سیستم پیش از ثبت، اتصال کوبرنتیز را بررسی می‌کند.',
name: 'نام',
apiServer: 'آدرس API Server',
region: 'منطقه',
provider: 'ارائه‌دهنده',
selectProvider: 'انتخاب ارائه‌دهنده',
weight: 'وزن',
tags: 'برچسب‌ها',
tagsPlaceholder: 'ssd, production, iran',
description: 'توضیحات',
kubeconfig: 'Kubeconfig (YAML)',
kubeconfigPlaceholder: 'kubeconfig خود را اینجا بچسبان…',
setDefault: 'تنظیم به‌عنوان کلاستر پیش‌فرض',
verifying: 'در حال بررسی اتصال و افزودن…',
added: 'کلاستر افزوده و اتصال تأیید شد ✓',
addFailed: 'افزودن کلاستر ناموفق بود',
connectionOk: 'اتصال موفق — کوبرنتیز {version}',
connectionFailed: 'اتصال ناموفق: {error}',
testFailed: 'تست اتصال ناموفق بود',
removed: 'کلاستر حذف شد',
noClusters: 'هنوز کلاستری ثبت نشده.',
noClustersHint: 'برای شروع انتشار اپ‌ها، یک کلاستر کوبرنتیز اضافه کن.',
defaultBadge: 'پیش‌فرض',
healthBadge: 'سلامت: {status}',
weightBadge: 'وزن {n}',
resources: 'منابع',
testing: 'در حال تست…',
test: 'تست',
remove: 'حذف',
removeTitle: 'حذف کلاستر',
removeMessage: 'مطمئنی می‌خواهی «{name}» را حذف کنی؟',
loadingResources: 'در حال بارگذاری منابع…',
resourcesFailed: 'بارگذاری منابع ناموفق بود',
nodes: 'نودها',
pods: 'پادها',
apps: 'اپ‌ها',
totalCpu: 'کل CPU',
cpuReserved: 'CPU رزروشده',
memReserved: 'حافظهٔ رزروشده',
memory: 'حافظه',
capacity: 'ظرفیت',
allocatable: 'قابل‌تخصیص',
colName: 'نام',
colStatus: 'وضعیت',
colRoles: 'نقش‌ها',
colCpu: 'CPU (ظرفیت / تخصیص)',
colMemory: 'حافظه (ظرفیت / تخصیص)',
toolsTitle: 'مدیریت ابزارها',
toolsSubtitle: 'ابزارهای زیرساخت را برای هر کلاستر نصب و مدیریت کن. هیچ‌چیز به‌صورت خودکار نصب نمی‌شود — فقط آنچه هر کلاستر نیاز دارد را اضافه کن.',
defaultSuffix: ' (پیش‌فرض)',
loadingTools: 'در حال بارگذاری ابزارها…',
toolsFailed: 'بارگذاری ابزارهای این کلاستر ناموفق بود.',
toolStatus: {
installed: 'نصب‌شده',
installing: 'در حال نصب…',
failed: 'ناموفق',
not_installed: 'نصب‌نشده',
unknown: 'نامشخص',
},
requires: 'نیازمند:',
uninstall: 'حذف نصب',
uninstalling: 'در حال حذف…',
install: 'نصب',
installing: 'در حال نصب…',
repair: 'تعمیر',
confirmInstall: 'تأیید نصب',
installRequiredFirst: 'اول ابزارهای موردنیاز را نصب کن',
removeToolTitle: 'حذف {name}',
removeToolMessage: '«{name}» از این کلاستر حذف شود؟',
uninstallConfirm: 'حذف نصب',
installStarted: '{name} نصب آغاز شد',
installToolFailed: 'نصب {name} ناموفق بود',
toolRemoved: '{name} حذف شد',
removeToolFailed: 'حذف {name} ناموفق بود',
fieldRequired: '{field} الزامی است',
clusterStatus: { active: 'فعال', maintenance: 'تعمیر', inactive: 'غیرفعال', error: 'خطا' },
clusterHealth: { healthy: 'سالم', degraded: 'نزول‌یافته', unhealthy: 'ناسالم', unknown: 'نامشخص' },
na: 'نامشخص',
},
billing: {
cycles: { hourly: 'ساعتی', monthly: 'ماهانه', yearly: 'سالانه' },
resources: {
base_fee: 'هزینهٔ پایه',
cpu_per_core: 'CPU (هر هسته)',
memory_per_gb: 'حافظه (هر GB)',
storage_per_gb: 'فضای ذخیره (هر GB)',
database_addon: 'افزونهٔ دیتابیس',
redis_addon: 'Redis',
rabbitmq_addon: 'RabbitMQ',
elasticsearch_addon: 'Elasticsearch',
custom_domain_addon: 'دامنهٔ اختصاصی + SSL',
},
resourceCol: 'منبع',
title: 'پلن‌های صورت‌حساب',
subtitle: 'قیمت واحد هر منبع را تعیین کن. کاربران هنگام انتشار CPU، حافظه و فضای ذخیره را انتخاب می‌کنند؛ هزینه = مصرف آن‌ها × این نرخ‌ها.',
editPlans: 'ویرایش پلن‌ها',
saving: 'در حال ذخیره…',
save: 'ذخیره',
saved: 'پلن‌های صورت‌حساب ذخیره شد',
saveFailed: 'ذخیرهٔ پلن‌های صورت‌حساب ناموفق بود',
howTitle: 'صورت‌حساب چطور کار می‌کند',
howApps: 'اپلیکیشن‌ها — کاربر منابع رانتایم را در انتشار انتخاب می‌کند؛ تو قیمت هر هسته، GB، هزینهٔ پایه و افزونهٔ دیتابیس را تعیین می‌کنی. CPU و RAM در برآوردها به‌تناسب صورت‌حساب می‌شوند (مثلاً نیمِ نرخِ هر GB برای نیم گیگابایت حافظه).',
howOptional: 'سرویس‌های اختیاری (Redis، RabbitMQ) — همان ماتریس واحد هر سرویس مثل رانتایم‌ها؛ پیش‌فرض‌های ویزارد انتشار جداگانه ویرایش می‌شوند. CPU/RAM در محاسبه‌گر هزینه به‌تناسب محدودیت‌های واقعی صورت‌حساب می‌شوند (مثلاً 500Mi معادل ۰٫۵× نرخِ حافظهٔ هر GB).',
howDefaults: 'پیش‌فرض‌های انتشار — فقط پیش‌پرکردنِ اختیاری؛ تغییر آن‌ها هزینهٔ اپ‌های موجود را عوض نمی‌کند مگر کاربر همان مقادیر را هنگام انتشار انتخاب کرده باشد.',
noPricing: 'داده‌ی قیمتی وجود ندارد',
appRuntimes: 'رانتایم‌های اپلیکیشن',
appRuntimesSub: 'قیمت‌گذاری واحد هر رانتایم (ساعتی / ماهانه / سالانه)',
unitPricesSuffix: '— قیمت‌های واحد',
fillYearly: 'پر کردن سالانه از ماهانه ×۱۲',
optionalServices: 'سرویس‌های اختیاری',
optionalServicesSub: 'قیمت‌گذاری واحد هر سرویس (ساعتی / ماهانه / سالانه)',
deployDefaults: 'سرویس‌های اختیاری — پیش‌فرض‌های انتشار',
deployDefaultsSub: 'پیش‌پرکردن CPU، حافظه و فضای ذخیره هنگام فعال‌سازی هر سرویس در ویزارد انتشار',
addons: 'افزونه‌ها',
addonsSub: 'هزینه‌های ثابت بدون وابستگی به رانتایم',
customDomainTitle: 'دامنهٔ اختصاصی + SSL',
customDomainSub: 'هزینهٔ ثابت در هر دورهٔ صورت‌حساب (نه بر اساس منابع)',
loggingNote: 'محدودیت‌های پیش‌پرشده برای ارسال‌کننده‌های لاگ Fluent Bit (به‌ازای هر workload فعال هنگام روشن‌بودن لاگینگ صورت‌حساب می‌شود).',
logShipperCpuLimit: 'محدودیت CPU ارسال‌کنندهٔ لاگ',
logShipperMemoryLimit: 'محدودیت حافظهٔ ارسال‌کنندهٔ لاگ',
defaultsNote: 'هنگامی که کاربر این سرویس را در انتشار فعال می‌کند نمایش داده می‌شود. او می‌تواند CPU، حافظه و فضای ذخیره را در «منابع و پیکربندی» تغییر دهد؛ صورت‌حساب واقعی از انتخاب‌های او × قیمت‌های واحد زیر استفاده می‌کند.',
cpuRequest: 'درخواست CPU',
cpuLimit: 'محدودیت CPU',
memoryRequest: 'درخواست حافظه',
memoryLimit: 'محدودیت حافظه',
storageGi: 'فضای ذخیره (Gi)',
oneCore: '۱ هسته',
twoCores: '۲ هسته',
retentionTitle: 'سیاست نگه‌داری و حذف داده',
edit: 'ویرایش',
retentionSub: 'تنظیم کن داده‌های کاربر پس از انقضای پلن چه مدت پیش از حذف دائمی نگه داشته شود.',
hourlyPlans: 'پلن‌های ساعتی',
monthlyPlans: 'پلن‌های ماهانه',
yearlyPlans: 'پلن‌های سالانه',
deleteAfterHours: 'حذف پس از (ساعت):',
deleteAfterDays: 'حذف پس از (روز):',
saveSettings: 'ذخیرهٔ تنظیمات',
lifecycleSaved: 'تنظیمات چرخهٔ عمر به‌روزرسانی شد',
saveFailedShort: 'ذخیره ناموفق بود',
hours: 'ساعت',
days: 'روز',
globalDiscount: {
title: 'تخفیف کلی پلتفرم',
subtitle: 'یک درصد تخفیف که روی همهٔ قیمت‌ها و صورت‌حساب‌های واقعی اعمال می‌شود. ۰ یعنی بدون تخفیف.',
label: 'درصد تخفیف کلی',
hint: 'عددی بین ۰ تا ۱۰۰',
save: 'ذخیرهٔ تخفیف',
saving: 'در حال ذخیره…',
saved: 'تخفیف کلی ذخیره شد',
edit: 'ویرایش',
cancel: 'انصراف',
none: 'در حال حاضر تخفیف کلی فعال نیست.',
active: 'تخفیف {p}٪ روی همهٔ سرویس‌ها فعال است.',
},
discounts: {
title: 'کدهای تخفیف',
subtitle: 'تخفیف درصدی روی سرویس‌های مختلف؛ عمومی یا مخصوص کاربران خاص.',
add: 'کد تخفیف جدید',
empty: 'هنوز کد تخفیفی تعریف نشده',
edit: 'ویرایش',
delete: 'حذف',
deleteConfirm: 'این کد تخفیف حذف شود؟',
code: 'کد',
codePlaceholder: 'NOWRUZ1403',
name: 'عنوان',
namePlaceholder: 'تخفیف نوروزی',
description: 'توضیحات',
percentOff: 'درصد تخفیف',
scope: 'سرویس‌های مشمول',
allServices: 'همهٔ سرویس‌ها',
selectServices: 'انتخاب سرویس‌های خاص',
audience: 'کاربران مشمول',
public: 'عمومی (همهٔ کاربران)',
restricted: 'کاربران مشخص',
searchUsers: 'جست‌وجوی کاربر بر اساس نام یا ایمیل…',
noUsersSelected: 'هنوز کاربری انتخاب نشده',
limits: 'محدودیت‌ها',
maxUses: 'سقف کل استفاده',
maxUsesPerUser: 'سقف هر کاربر',
unlimited: 'نامحدود',
startsAt: 'تاریخ شروع',
endsAt: 'تاریخ پایان',
active: 'فعال',
inactive: 'غیرفعال',
used: 'استفاده‌شده',
save: 'ذخیره',
saving: 'در حال ذخیره…',
cancel: 'انصراف',
saved: 'کد تخفیف ذخیره شد',
deleted: 'کد تخفیف حذف شد',
saveFailed: 'ذخیرهٔ کد تخفیف ناموفق بود',
groups: {
runtime: 'رانتایم اپلیکیشن',
optional: 'سرویس‌های جانبی',
managed: 'سرویس‌های مدیریت‌شده',
addon: 'افزونه‌ها',
},
coupon: {
label: 'کد تخفیف',
placeholder: 'کد تخفیف را وارد کنید',
apply: 'اعمال',
checking: 'در حال بررسی…',
applied: 'کد تخفیف اعمال شد',
remove: 'حذف کد',
discountLine: 'تخفیف',
},
reasons: {
not_found: 'کد تخفیف نامعتبر است',
inactive: 'این کد تخفیف غیرفعال است',
not_started: 'این کد هنوز فعال نشده است',
expired: 'این کد منقضی شده است',
max_uses_reached: 'ظرفیت استفاده از این کد تمام شده است',
max_uses_per_user_reached: 'سقف استفادهٔ شما از این کد پر شده است',
not_eligible_user: 'این کد برای حساب شما قابل استفاده نیست',
no_eligible_services: 'این کد روی سرویس‌های انتخابی شما تخفیف ندارد',
},
},
},
servicesNew: {
steps: ['نوع سرویس', 'پیکربندی', 'بررسی و پرداخت'],
title: 'سرویس مدیریت‌شدهٔ جدید',
subtitle: 'دیتابیس، Redis یا RabbitMQ — مثل اپلیکیشن‌ها صورت‌حساب می‌شود',
typeDatabase: 'دیتابیس',
typeDatabaseDesc: 'PostgreSQL، MySQL، MariaDB، MongoDB',
typeRedis: 'Redis',
typeRedisDesc: 'کش و ذخیرهٔ درون‌حافظه‌ای',
typeRabbitmq: 'RabbitMQ',
typeRabbitmqDesc: 'بروکر پیام',
serviceName: 'نام سرویس',
serviceNamePlaceholder: 'my-database',
nameHint: 'فقط حروف کوچک، اعداد و خط تیره',
redisVersion: 'نسخهٔ Redis',
rabbitmqVersion: 'نسخهٔ RabbitMQ',
redisResources: 'منابع Redis',
rabbitmqResources: 'منابع RabbitMQ',
billingCycle: 'دورهٔ صورت‌حساب',
cycles: { hourly: 'ساعتی', monthly: 'ماهانه', yearly: 'سالانه' },
paymentMethod: 'روش پرداخت',
wallet: 'کیف‌پول',
insufficient: 'ناکافی',
payNow: 'پرداخت',
pricingUnavailable: 'قیمت در دسترس نیست',
back: 'بازگشت',
next: 'بعدی',
payProvision: 'پرداخت و راه‌اندازی',
provisioning: 'در حال راه‌اندازی سرویس',
creatingService: 'ساخت سرویس',
uploadingDump: 'آپلود dump دیتابیس',
payment: 'پرداخت',
deploying: 'انتشار',
provisionedSuccess: 'سرویس با موفقیت راه‌اندازی شد',
deployFailed: 'انتشار ناموفق بود',
paySucceededDeployFailed: 'پرداخت موفق بود اما انتشار ناموفق شد',
payProvisionFailed: 'پرداخت یا راه‌اندازی ناموفق بود',
payFailed: 'پرداخت ناموفق بود',
insufficientBalance: 'موجودی کیف‌پول کافی نیست',
serviceDesc: 'سرویس: {name} ({cycle})',
},
serviceDetail: {
productTypes: {
managed_database: 'دیتابیس مدیریت‌شده',
managed_redis: 'Redis مدیریت‌شده',
managed_rabbitmq: 'RabbitMQ مدیریت‌شده',
},
deploy: 'انتشار',
redeploy: 'انتشار مجدد',
redeployTitle: 'اجرای مجدد Helm install برای این سرویس',
restart: 'ری‌استارت',
deleteServiceTitle: 'حذف سرویس؟',
deleteServiceMessage: 'حذف «{name}» به‌صورت دائمی؟',
provisioningStarted: 'راه‌اندازی آغاز شد',
provisioningFailed: 'شروع راه‌اندازی ناموفق بود',
reprovisioningStarted: 'راه‌اندازی مجدد آغاز شد',
reprovisionFailed: 'راه‌اندازی مجدد سرویس ناموفق بود',
serviceRestarted: 'سرویس ری‌استارت شد',
restartFailed: 'ری‌استارت سرویس ناموفق بود',
serviceRenewed: 'سرویس تمدید شد',
renewalFailed: 'تمدید ناموفق بود',
deletedWithCredit: 'سرویس حذف شد. منابع پیش‌پرداختت روی داشبورد است.',
deleted: 'سرویس حذف شد',
deleteFailed: 'حذف ناموفق بود',
paymentRequired: 'پرداخت لازم است',
renewToRestore: 'برای بازگرداندن این سرویس تمدید کن.',
renew: 'تمدید',
planExpires: 'انقضای پلن: {date}',
configuration: 'پیکربندی',
serviceType: 'نوع سرویس',
databaseEngine: 'موتور دیتابیس',
storage: 'فضای ذخیره',
redisVersion: 'نسخهٔ Redis',
rabbitmqVersion: 'نسخهٔ RabbitMQ',
cpu: 'CPU',
memory: 'حافظه',
billing: 'صورت‌حساب',
deployMarker: 'نشان دیپلوی',
deploymentHistory: 'تاریخچهٔ دیپلوی',
noDeployments: 'هنوز دیپلویی نیست',
noDeploymentsHint: 'برای راه‌اندازی این سرویس روی «انتشار» بزن',
provision: 'راه‌اندازی',
connection: 'اتصال',
internalCluster: 'کلاستر داخلی',
host: 'هاست',
port: 'پورت',
database: 'دیتابیس',
username: 'نام کاربری',
password: 'رمز عبور',
useExternalNote: 'برای اتصال‌های اینترنتی از دسترسی خارجی زیر استفاده کن.',
hideSecrets: 'پنهان‌کردن اسرار',
showSecrets: 'نمایش اسرار',
redisInternal: 'Redis (داخلی)',
rabbitmqInternal: 'RabbitMQ (داخلی)',
url: 'آدرس',
amqpPort: 'پورت AMQP',
managementPort: 'پورت مدیریت',
amqpUrl: 'آدرس AMQP',
managementUrl: 'آدرس مدیریت',
deployToLoadCreds: 'برای بارگذاری اطلاعات ورود زنده، سرویس را منتشر کن.',
loadingLogs: 'در حال بارگذاری لاگ‌ها…',
serviceStopped: 'سرویس متوقف است.',
deployToSeeLogs: 'برای دیدن لاگ workload، سرویس را منتشر یا راه‌اندازی مجدد کن.',
renewService: 'تمدید سرویس',
wallet: 'کیف‌پول',
payFromWallet: 'پرداخت از کیف‌پول',
insufficientRenew: 'موجودی کیف‌پول کافی نیست. کیف‌پول را شارژ کن یا از طریق فاکتور پرداخت کن.',
cycles: { hourly: 'ساعتی', monthly: 'ماهانه', yearly: 'سالانه' },
},
adminApps: {
title: 'همهٔ اپلیکیشن‌ها',
count: '{n} اپلیکیشن',
matching: ' مطابق با «{q}»',
lifecycle: { active: 'فعال', suspended: 'معلق — پرداخت‌نشده', pending_deletion: 'در انتظار حذف', deleted: 'حذف‌شده' },
cycles: { hourly: 'ساعتی', monthly: 'ماهانه', yearly: 'سالانه' },
expired: 'منقضی‌شده', dayShort: 'روز', hourShort: 'ساعت', minShort: 'دقیقه',
countRunning: 'در حال اجرا', countDeploying: 'در حال انتشار', countPending: 'در انتظار',
countStopped: 'متوقف', countFailed: 'ناموفق', countSuspended: 'معلق', countPendingDel: 'در انتظار حذف',
searchPlaceholder: 'جستجو بر اساس نام اپ، نام کاربر، ایمیل یا شناسهٔ کاربر…',
noAppsFound: 'اپلیکیشنی پیدا نشد', noResultsFor: 'نتیجه‌ای برای «{q}» نیست. جستجوی دیگری امتحان کن.',
noAppsYet: 'هنوز اپلیکیشنی نیست', noAppsByUser: 'هیچ کاربری اپلیکیشنی نساخته است.',
colApplication: 'اپلیکیشن', colOwner: 'مالک', colStatus: 'وضعیت', colService: 'سرویس', colCluster: 'کلاستر',
colMigration: 'مهاجرت', colPlanExpiry: 'پلن / انقضا', colActions: 'عملیات',
unknownCluster: 'کلاستر نامشخص', notAssigned: 'تخصیص نیافته', noPlan: 'بدون پلن', deletePrefix: 'حذف: {date}',
cluster: 'کلاستر', plan: 'پلن', unknown: 'نامشخص', na: 'نامشخص',
view: 'مشاهده', migrate: 'مهاجرت', notAssignedTooltip: 'اپلیکیشن به کلاستری تخصیص نیافته است',
deleteAppTitle: 'حذف اپلیکیشن', deleteAppConfirm: 'مطمئنی می‌خواهی «{name}» را حذف کنی؟',
replicas: '{n} رپلیکا',
migrateApplication: 'مهاجرت اپلیکیشن',
moveTo: 'انتقال {name} به یک کلاستر مقصدِ سالم با لاگ، تلاش مجدد و بازگردانی.',
targetCluster: 'کلاستر مقصد', currentCluster: 'کلاستر فعلی',
unknownClusterShort: 'کلاستر نامشخص ({id})',
selectHealthyCluster: 'یک کلاستر سالم انتخاب کن',
currentExcludedNote: 'کلاستر فعلی حذف شده است. مهاجرت برای کلاسترهای ناسالم، غیرفعال یا در حال تعمیر مسدود است.',
noOtherCluster: 'هیچ کلاستر دیگری به‌عنوان مقصد مهاجرت در دسترس نیست.',
latestMigration: 'آخرین مهاجرت', queued: 'در صف', attempts: 'تلاش‌ها',
noEvents: 'هنوز رویدادی نیست.', retryMigration: 'تلاش مجدد مهاجرت',
startMigration: 'شروع مهاجرت', queueing: 'در حال صف‌بندی…',
appDeleted: 'اپلیکیشن حذف شد', migrationQueued: 'وظیفهٔ مهاجرت در صف قرار گرفت', migrationQueueFailed: 'صف‌بندی مهاجرت ناموفق بود',
migrationRetryQueued: 'تلاش مجدد مهاجرت در صف قرار گرفت', migrationRetryFailed: 'تلاش مجدد مهاجرت ناموفق بود',
migrationStatus: { completed: 'کامل', failed: 'ناموفق', rolled_back: 'بازگردانده‌شده', running: 'در حال اجرا', rolling_back: 'در حال بازگردانی', queued: 'در صف' },
},
appDetail: {
productTypeApp: 'اپلیکیشن',
cycles: { hourly: 'ساعتی', monthly: 'ماهانه', yearly: 'سالانه' },
// header actions
deploy: 'انتشار', redeploy: 'انتشار مجدد', start: 'شروع', stop: 'توقف', restart: 'ری‌استارت',
preview: 'پیش‌نمایش', delete: 'حذف', renewNow: 'تمدید اکنون', renewApplication: 'تمدید اپلیکیشن',
rebuildTitle: 'بازسازی از آخرین سورس‌کد', instantRollback: 'بازگردانی فوری',
// toasts
deploymentTriggered: 'دیپلوی آغاز شد!', deployFailed: 'شروع دیپلوی ناموفق بود',
redeployStarted: 'انتشار مجدد آغاز شد', redeployFailed: 'انتشار مجدد ناموفق بود',
appStarted: 'اپلیکیشن اجرا شد', startFailed: 'اجرای اپلیکیشن ناموفق بود',
appStopped: 'اپلیکیشن متوقف شد', stopFailed: 'توقف اپلیکیشن ناموفق بود',
appRestarting: 'در حال ری‌استارت اپلیکیشن…', restartFailed: 'ری‌استارت اپلیکیشن ناموفق بود',
sourceUploaded: 'سورس‌کد با موفقیت آپلود شد!', uploadFailed: 'آپلود سورس‌کد ناموفق بود',
uploadSourceFirst: 'سورس‌کد را آپلود و روی «انتشار» بزن تا شروع کنی',
sourceCodeUploaded: 'سورس‌کد آپلود شد',
fileMax10: 'حجم فایل باید حداکثر ۱۰ گیگابایت باشد', fileZipOnly: 'لطفاً فایل .zip یا .tar.gz آپلود کن',
previewHttps: 'پیش‌نمایش روی دامنهٔ HTTPS باز شد.', previewPort: 'پیش‌نمایش روی پورت {port} باز شد',
previewFailed: 'دریافت آدرس پیش‌نمایش ناموفق بود. مطمئن شو اپ منتشر شده است.',
domainSet: 'دامنه تنظیم شد. لطفاً رکوردهای DNS را پیکربندی کن.',
domainVerified: 'دامنه با موفقیت تأیید شد!',
customDomainRemoved: 'دامنهٔ اختصاصی حذف شد',
removeDomainTitle: 'حذف دامنهٔ اختصاصی',
removeDomainConfirm: 'مطمئنی می‌خواهی «{domain}» را حذف کنی؟ وب‌سایت فقط از طریق دامنهٔ پلتفرم در دسترس خواهد بود.',
remove: 'حذف',
copied: 'کپی شد!', copy: 'کپی',
resourcesUpdated: 'منابع به‌روزرسانی شد', updateResourcesFailed: 'به‌روزرسانی منابع ناموفق بود',
resourcesUpdatedSuccess: 'منابع با موفقیت به‌روزرسانی شد!', noChanges: 'تغییری برای اعمال نیست',
renewFirst: 'پیش از تغییر منابع، اپلیکیشن را تمدید کن',
upgradedPaid: 'منابع ارتقا یافت! {amount} تومان پرداخت شد',
upgradeFailed: 'ارتقای منابع ناموفق بود', calcFailed: 'محاسبهٔ هزینهٔ ارتقا ناموفق بود',
invoiceCreated: 'فاکتور ساخته شد. روش پرداخت را انتخاب کن.', invoiceFailed: 'ساخت فاکتور ارتقا ناموفق بود',
dbRestored: 'دیتابیس با موفقیت بازیابی شد!', dbRestoreFailed: 'بازیابی دیتابیس ناموفق بود.', dbInvalidFile: 'لطفاً فایل .sql، .dump یا .gz آپلود کن',
fileMax500: 'حجم فایل باید کمتر از ۵۰۰ مگابایت باشد', dbUploadFailed: 'آپلود dump دیتابیس ناموفق بود',
snapshotStarted: 'ساخت اسنپ‌شات آغاز شد', snapshotCreateFailed: 'ساخت اسنپ‌شات ناموفق بود',
snapshotDeleted: 'اسنپ‌شات حذف شد', snapshotDeleteFailed: 'حذف اسنپ‌شات ناموفق بود',
deleteSnapshotTitle: 'حذف اسنپ‌شات؟', deleteSnapshotMessage: 'حذف «{label}»؟ فایل‌های آرشیوشده برای همیشه حذف می‌شوند.',
deleteSnapshot: 'حذف اسنپ‌شات',
rollbackFailed: 'بازگردانی ناموفق بود', rollbackCompleted: 'بازگردانی کامل شد:\n',
rollbackSnapTitle: 'بازگردانی به «{label}»؟',
rollbackSnapMessage: 'این کار بازیابی می‌کند:\n• دیپلوی اپ از طریق K8s revision (فوری)\n• فایل‌های wp-content (وردپرس)\n• dump دیتابیس\n\nوضعیت فعلی بازنویسی خواهد شد.',
rollbackRevTitle: 'بازگردانی به Revision {n}؟',
rollbackRevMessage: 'این کار Helm release را به revision {n} بازمی‌گرداند.{cause}\n\nنیازی به بازسازی نیست — در چند ثانیه اعمال می‌شود.',
description: 'توضیح',
deleteAppTitle: 'حذف «{name}»؟',
deleteAppMessage: 'این کار همهٔ منابع کوبرنتیز، داده‌ها و رکوردهای دیپلوی را برای همیشه حذف می‌کند.\n\n',
deleteAppCredit: 'منابع پیش‌پرداختِ باقی‌مانده‌ات روی داشبورد نمایش داده می‌شود تا بدون هزینهٔ اضافی روی اپ جدید استفاده کنی.',
appDeleted: 'اپلیکیشن حذف شد', appDeletedCredit: 'اپلیکیشن حذف شد. منابع پیش‌پرداختت روی داشبورد است.',
deleteAppFailed: 'حذف اپلیکیشن ناموفق بود',
downloadInProgress: 'یک دانلود از قبل در حال انجام است. لطفاً صبر کن.',
downloading: 'در حال دانلود {name}… برای فایل‌های بزرگ ممکن است تا ۱۵ دقیقه طول بکشد.',
downloadedSuccess: '{name} با موفقیت دانلود شد!',
downloadTimeout: 'دانلود پس از ۱۵ دقیقه منقضی شد. دوباره تلاش کن یا لاگ سرور را بررسی کن.',
downloadFailed: 'دانلود {name} ناموفق بود', downloadCurrentFailed: 'دانلود {name} فعلی ناموفق بود',
// status / config card
configuration: 'پیکربندی', runtime: 'رانتایم', image: 'ایمیج', status: 'وضعیت',
cpu: 'CPU', memory: 'حافظه', replicas: 'رپلیکاها', cluster: 'کلاستر', pool: 'پول', workload: 'workload', port: 'پورت',
cpuRequest: 'درخواست CPU', cpuLimit: 'محدودیت CPU', memoryRequest: 'درخواست حافظه', memoryLimit: 'محدودیت حافظه',
database: 'دیتابیس', databaseVolume: 'والیوم دیتابیس', gitConnected: 'ریپازیتوری Git متصل است',
deployMarker: 'نشان دیپلوی', billing: 'صورت‌حساب', name: 'نام', domain: 'دامنه',
// deployment history
deploymentHistory: 'تاریخچهٔ دیپلوی', noDeployments: 'هنوز دیپلویی نیست',
uploadToStart: 'سورس‌کد را آپلود و روی «انتشار» بزن تا شروع کنی',
// source upload
sourceCode: 'سورس‌کد', replace: 'جایگزینی', uploadSourceClick: 'سورس‌کد را آپلود و روی «انتشار» بزن تا شروع کنی',
// domain
customDomain: 'دامنهٔ اختصاصی', addCustomDomain: 'افزودن دامنهٔ اختصاصی', setUpCustomDomain: 'راه‌اندازی دامنهٔ اختصاصی',
appDomain: 'دامنهٔ اپلیکیشن', copyDomainHint: 'برای کپی کلیک کن',
platformDomain: 'دامنهٔ پلتفرم', domainPlaceholder: 'example.com یا www.example.com', dnsSetupGuide: 'راهنمای تنظیم DNS',
removeCustomDomain: 'حذف دامنهٔ اختصاصی',
// resources
resourcesScaling: 'منابع و مقیاس‌بندی', monitor: 'پایش', hide: 'پنهان', show: 'نمایش',
liveUsage: 'مصرف زنده', loadingMetrics: 'در حال بارگذاری متریک‌ها…', metrics: 'متریک‌ها', pods: 'پادها', ready: 'آماده',
noMetrics: 'هنوز متریکی نیست', storageUsage: 'مصرف فضای ذخیره', loadingStorageMetrics: 'در حال بارگذاری متریک‌های فضای ذخیره…',
noStorageData: 'داده‌ی فضای ذخیره موجود نیست', storageMetricsUnavailable: 'متریک فضای ذخیره در دسترس نیست',
used: 'مصرف‌شده', applyChanges: 'اعمال تغییرات', applying: 'در حال اعمال…', processing: 'در حال پردازش…',
// snapshots / revisions
newSnapshot: 'اسنپ‌شات جدید', creating: 'در حال ساخت…',
k8sRevisions: 'K8s Revisionها', fileSnapshots: 'اسنپ‌شات فایل', fullSnapshots: 'اسنپ‌شات کامل',
loadingRevisions: 'در حال بارگذاری revisionها…', noRevisions: 'هیچ revisionی موجود نیست',
revisionsAfterDeploy: 'Revisionها پس از اولین دیپلوی نمایان می‌شوند.',
loadingSnapshots: 'در حال بارگذاری اسنپ‌شات‌ها…', noSnapshots: 'هنوز اسنپ‌شاتی نیست',
maxSnapshots: 'حداکثر ۱۰ اسنپ‌شات نگه داشته می‌شود. قدیمی‌ترها خودکار حذف می‌شوند.',
rollback: 'بازگردانی', instant: 'فوری', current: 'فعلی', full: 'کامل',
instantRollbackTitle: 'بازگردانی فوری به این revision',
rollbackSnapTitleBtn: 'بازگردانی به این اسنپ‌شات (از K8s revision استفاده و DB/wp-content را بازیابی می‌کند)',
downloadCurrentState: 'دانلود وضعیت فعلی',
downloadCurrentNote: 'یک کپی از فایل‌های زندهٔ فعلی را بدون ساخت اسنپ‌شات دانلود کن. فایل‌های بزرگ ممکن است تا ۱۵ دقیقه طول بکشند.',
downloadSource: 'دانلود سورس‌کد', downloadWpContent: 'دانلود wp-content', downloadDatabaseDump: 'دانلود dump دیتابیس',
sourceCodeArtifact: 'سورس‌کد', databaseDump: 'dump دیتابیس', downloading2: 'در حال دانلود…',
// db restore
restoreDatabaseDump: 'بازیابی dump دیتابیس', uploadSqlToRestore: 'آپلود SQL dump برای بازیابی',
restoringDatabase: 'در حال بازیابی دیتابیس…', restoreOutput: 'خروجی بازیابی',
dbOnlyInternal: 'دیتابیس فقط داخل کلاستر در دسترس است. به‌صورت خارجی expose نشده.',
// service credentials
serviceCredentials: 'اطلاعات ورود سرویس', serviceCredsAfterDeploy: 'رمزهای سرویس پس از انتشار اپلیکیشن در دسترس هستند.',
password: 'رمز عبور',
// logs
logs: 'لاگ‌ها',
// plan expiry / renewal
planExpiringSoon: 'پلن به‌زودی منقضی می‌شود', planExpires: 'انقضای پلن: {date}', extendPlan: 'تمدید پلن',
renewService: 'تمدید اپلیکیشن', wallet: 'کیف‌پول', walletBalance: 'موجودی کیف‌پول', payFromWallet: 'پرداخت از کیف‌پول',
insufficientRenew: 'موجودی کیف‌پول کافی نیست. کیف‌پول را شارژ کن یا از طریق فاکتور پرداخت کن.',
bestForMost: 'مناسب اکثر کاربران', saveUpTo20: 'تا ۲۰٪ صرفه‌جویی',
// upgrade confirm modal
confirmResourceUpgrade: 'تأیید ارتقای منابع', currentHourlyCost: 'هزینهٔ ساعتی فعلی', newHourlyCost: 'هزینهٔ ساعتی جدید',
remainingHours: 'ساعت‌های باقی‌مانده در بازه', proratedAmount: 'مبلغ تسهیم‌شده برای پرداخت',
feeIncludedNote: 'این هزینه در محاسبهٔ هزینهٔ کل لحاظ شده است.', thisMayTake: 'ممکن است چند دقیقه طول بکشد',
cancel: 'انصراف',
private: 'خصوصی', active: 'فعال',
deployingBtn: 'در حال انتشار…',
adjustCpuMemStorage: 'تنظیم CPU / حافظه و فضای ذخیره',
calculating: 'در حال محاسبه…',
connectionInfoInternal: 'اطلاعات اتصال (کلاستر داخلی)',
createInvoicePay: 'ساخت فاکتور و پرداخت',
customDomainPending: 'دامنهٔ اختصاصی — در انتظار تأیید DNS',
customDomainFee: 'هزینهٔ دامنهٔ اختصاصی:',
dragDrop: 'یک',
fileHereBrowse: 'فایل را اینجا بکش، یا برای انتخاب کلیک کن',
expandDiskNote: 'دیسک را در «تنظیم CPU / حافظه و فضای ذخیره» پایین گسترش بده.',
maxSize10gb: 'حداکثر اندازه: ۱۰ گیگابایت',
maxSize500mb: 'حداکثر اندازه: ۵۰۰ مگابایت',
payAsYouGo: 'پرداخت به‌اندازهٔ مصرف، تمدید خودکار',
pickComponentNote: 'انتخاب کن کدام بخش به‌روزرسانی شود. CPU و حافظه به‌ازای هر workload اعمال می‌شوند؛ فضای ذخیره فقط می‌تواند رشد کند (گسترش). اپلیکیشن اصلی ممکن است برای ارتقاهای پولی از صورت‌حساب استفاده کند؛ دیتابیس و سرویس‌های اختیاری مستقیماً در کلاستر اعمال می‌شوند.',
rabbitmqVolume: 'والیوم RabbitMQ (اختیاری)',
redisVolume: 'والیوم Redis (اختیاری)',
rollbackSnapshots: 'بازگردانی و اسنپ‌شات‌ها',
snapshotsAutoNote: 'اسنپ‌شات‌ها پیش از هر دیپلوی به‌صورت خودکار ساخته می‌شوند، یا می‌توانی دستی یکی بسازی.',
snapshotsIncludeNote: 'شامل سورس‌کد، dump دیتابیس و wp-content. از این‌ها برای بازیابی داده یا دانلود بکاپ استفاده کن. پیش از هر دیپلوی خودکار ساخته می‌شوند.',
revisionsHelmNote: 'با استفاده از revisionهای Helm release. در چند ثانیه به پیکربندی قبلی برمی‌گردد — بدون نیاز به بازسازی. تا ۱۰ revision نگه داشته می‌شود.',
record: 'رکورد:',
cpuColon: 'CPU:', memoryColon: 'حافظه:', sidecars: 'Sidecarها:',
typeColon: 'نوع:', valueColon: 'مقدار:', nameHost: 'نام/هاست:', cnameTarget: 'مقصد CNAME:',
orText: 'یا',
verifyDns: 'تأیید DNS', checking: 'در حال بررسی…',
dnsStep1: '۱. وارد ثبت‌کنندهٔ دامنه‌ات شو (مثلاً Cloudflare، Namecheap، GoDaddy)',
dnsStep2: '۲. به مدیریت DNS دامنه‌ات برو',
dnsStep3a: '۳. یک رکورد ', dnsStep3b: ' اضافه کن:',
dnsStep4a: '۴. اگر از دامنهٔ ریشه (بدون www) استفاده می‌کنی، از ثبت‌کننده‌ای که CNAME flattening را پشتیبانی می‌کند استفاده کن (مثلاً Cloudflare)، یا به‌جای آن از ',
dnsStep4b: ' استفاده کن.',
dnsStep5: '۵. ۵ تا ۳۰ دقیقه برای انتشار DNS صبر کن (در برخی موارد تا ۴۸ ساعت)',
dnsStep6a: '۶. روی دکمهٔ ', dnsStep6b: ' بالا کلیک کن',
scheduledForDeletion: 'اپلیکیشن برای حذف زمان‌بندی شده!',
suspendedPayment: 'اپلیکیشن معلق شد — پرداخت لازم است',
willBeDeletedOn: 'این اپلیکیشن در {date} برای همیشه حذف می‌شود. برای جلوگیری از از‌دست‌رفتن داده، اکنون تمدید کن.',
soon: 'به‌زودی',
planExpiredRestore: 'پلن شما منقضی شده است. برای بازگرداندن دسترسی به سرویس تمدید کن.',
planExpiresEarly: 'پلن شما در {date} منقضی می‌شود. برای جلوگیری از قطع سرویس، زودتر تمدید کن.',
selectBillingCycle: 'یک دورهٔ صورت‌حساب برای تمدید «{name}» انتخاب کن',
toman: 'تومان', tomanPerHour: 'تومان/ساعت',
walletShortBy: 'موجودی کیف‌پول {n} تومان کم است. می‌توانی مابه‌التفاوت را از طریق درگاه در صفحهٔ فاکتور پرداخت کنی.',
revision: 'نسخهٔ', hoursUnit: '{n} ساعت',
payFromWalletBtn: 'پرداخت از کیف‌پول', applyDirectly: 'اعمال مستقیم',
},
deployWizard: {
cycles: { hourly: 'ساعتی', monthly: 'ماهانه', yearly: 'سالانه' },
deployNewApp: 'انتشار اپلیکیشن جدید',
followSteps: 'برای انتشار اپت روی ابر، مراحل را دنبال کن.',
basicInfo: 'اطلاعات پایه',
appType: 'نوع اپلیکیشن',
appName: 'نام اپلیکیشن',
descriptionOptional: 'توضیحات (اختیاری)',
whatDoesApp: 'این اپ چه کاری انجام می‌دهد؟',
nameHint: 'فقط حروف کوچک، اعداد و خط تیره',
source: 'منبع',
sourceCode: 'سورس‌کد',
gitRepository: 'مخزن Git',
uploadZip: 'آپلود ZIP',
uploadAZip: 'آپلود یک ZIP',
repositoryUrl: 'آدرس مخزن',
branch: 'شاخه',
accessToken: 'توکن دسترسی',
auth: 'احراز هویت',
tokenProvided: 'توکن داده شد',
versionsDatabase: 'نسخه‌ها و دیتابیس',
runtime: 'رانتایم',
nodeVersion: 'نسخهٔ Node.js', phpVersion: 'نسخهٔ PHP', pythonVersion: 'نسخهٔ Python',
goVersion: 'نسخهٔ Go', wordpressVersion: 'نسخهٔ WordPress',
database: 'دیتابیس',
databaseCredentials: 'اطلاعات ورود دیتابیس',
dbUsername: 'نام کاربری دیتابیس', dbPassword: 'رمز دیتابیس', dbStorage: 'فضای دیتابیس', dbDump: 'dump دیتابیس',
databaseStorageSize: 'اندازهٔ فضای ذخیرهٔ دیتابیس',
databaseResources: 'منابع دیتابیس',
databaseResourcesHint: 'پردازنده، حافظه و دیسک دیتابیس را در مرحلهٔ منابع پیکربندی کن.',
username: 'نام کاربری', password: 'رمز عبور', autoGenerated: 'تولید خودکار',
generatePassword: 'تولید رمز تصادفی',
dbCredsNote: 'این اطلاعات فقط برای ارتباط داخلی کلاستر استفاده می‌شوند. دیتابیس به‌صورت خارجی expose نمی‌شود.',
optionalDbDump: 'اختیاری: آپلود dump دیتابیس برای بازیابی هنگام ساخت',
uploadSqlNote: 'یک SQL dump آپلود کن تا پس از ساخت دیتابیس بازیابی شود',
uploadDbDumpHint: 'در مرحلهٔ بعد می‌توانی یک dump دیتابیس SQL برای بازیابی داده‌هایت آپلود کنی.',
optionalServices: 'سرویس‌های اختیاری',
configurePerService: 'منابع هر سرویسِ فعال را جدا از اپلیکیشن خود پیکربندی کن.',
redisResources: 'منابع Redis', rabbitmqResources: 'منابع RabbitMQ',
centralizedLogging: 'لاگینگ متمرکز', logsViaFluentBit: 'لاگ‌ها از طریق سایدکار Fluent Bit جمع‌آوری می‌شوند',
logFilePaths: 'مسیر فایل‌های لاگ',
specifyLogFiles: 'مشخص کن کدام فایل‌های لاگ جمع‌آوری شوند. برای مسیرهای پیش‌فرض بر اساس رانتایم، خالی بگذار.',
defaultPathsByRuntime: 'مسیرهای پیش‌فرض بر اساس رانتایم:',
resourcesConfig: 'منابع و پیکربندی',
applicationWorkload: 'workload اپلیکیشن',
cpu: 'CPU', memory: 'حافظه', storage: 'فضای ذخیره', replicas: 'رپلیکاها', port: 'پورت',
cpuRequest: 'درخواست CPU', cpuLimit: 'محدودیت CPU', memoryRequest: 'درخواست حافظه', memoryLimit: 'محدودیت حافظه',
clusterAssignment: 'تخصیص کلاستر',
useDefaultCluster: 'استفاده از کلاستر پیش‌فرض', defaultClusterUsed: 'کلاستر پیش‌فرض استفاده خواهد شد',
pickSpecificCluster: 'انتخاب یک کلاستر مشخص', pickClusterPool: 'انتخاب یک پول کلاستر',
loadBalanced: 'متوازن‌شده', cluster: 'کلاستر',
noClustersAvailable: 'کلاستری در دسترس نیست', noClusterPools: 'هیچ پول کلاستری پیکربندی نشده',
askAdminPool: 'از مدیر بخواه یک پول کلاستر بسازد', defaultClusterWillBeUsed: 'کلاستر پیش‌فرض استفاده خواهد شد',
customDomain: 'دامنهٔ اختصاصی', domainAddress: 'آدرس دامنه',
dnsSetupRequired: 'تنظیم DNS لازم است', dnsNotVerified: 'DNS تأیید نشده', verifyDnsRecords: 'تأیید رکوردهای DNS',
checkingDns: 'در حال بررسی DNS…', dnsVerified: 'DNS تأیید شد', dnsVerifiedProceed: 'DNS تأیید شد! می‌توانی ادامه بدهی.',
mustVerifyDns: 'پیش از ادامه باید DNS را تأیید کنی. SSL پس از انتشار به‌صورت خودکار صادر می‌شود.',
requiredCnameRecord: 'رکورد CNAME موردنیاز:',
record: 'رکورد:', typeColon: 'نوع:', nameHost: 'نام/هاست:', valueColon: 'مقدار:', cnameTarget: 'مقصد CNAME:', versionColon: 'نسخه:',
yourPlatformDomain: 'دامنهٔ پلتفرمِ اپت (پس از ساخت)',
environmentVariables: 'متغیرهای محیطی', envVars: 'متغیرهای محیط',
uploadEnvFile: 'آپلود فایل .env', add: 'افزودن', clear: 'پاک‌کردن', remove: 'حذف',
reviewDeploy: 'بررسی و انتشار',
costEstimate: 'برآورد هزینه', calculating: 'در حال محاسبه…', breakdown: 'تفکیک',
additionalCharges: 'هزینه‌های اضافه (پرداختی شما)', coveredByCredit: 'پوشش‌داده‌شده با اعتبار پیش‌پرداخت',
customDomainFee: 'هزینهٔ دامنهٔ اختصاصی:', feeIncludedNote: 'این هزینه در محاسبهٔ هزینهٔ کل لحاظ شده است.',
prepaidCreditApplied: 'اعتبار پیش‌پرداخت اعمال شد', prepaidCreditPricing: 'قیمت‌گذاری اعتبار پیش‌پرداخت',
deployWithCredit: 'انتشار با اعتبار پیش‌پرداخت',
noChargeCovered: 'بدون هزینهٔ اضافه — کاملاً پوشش داده شده.',
noPaymentCredit: 'نیازی به پرداخت نیست — اعتبار منابع پیش‌پرداختت این انتشار را پوشش می‌دهد.',
noPricingPlans: 'هنوز پلن قیمتی تعریف نشده',
paymentMethod: 'روش پرداخت', payFromWallet: 'پرداخت از کیف‌پول', payNow: 'پرداخت', onlineGateway: 'درگاه پرداخت آنلاین',
insufficientBalance: 'موجودی ناکافی', toman: 'تومان',
payDeploy: 'پرداخت و انتشار', deployApplication: 'انتشار اپلیکیشن',
processingPayment: 'در حال پردازش پرداخت', creatingApplication: 'ساخت اپلیکیشن', startingDeployment: 'شروع انتشار',
stageCreating: 'در حال ساخت اپلیکیشن…', stageUploadingSource: 'در حال آپلود سورس‌کد…',
stageUploadingDb: 'در حال آپلود dump دیتابیس…', stagePaying: 'در حال پردازش پرداخت…',
stageDeploying: 'در حال شروع انتشار…', stageRedirecting: 'در حال انتقال…', stageError: 'خطایی رخ داد',
deploymentFailed: 'انتشار ناموفق بود', success: 'موفق!', deployingApplication: 'در حال انتشار اپلیکیشن',
// app types
appTypeApplication: 'اپلیکیشن', appTypeDatabase: 'دیتابیس',
// service types descriptions
inMemoryCache: 'کش و ذخیرهٔ درون‌حافظه‌ای', messageBroker: 'بروکر پیام',
// wordpress
wordpressOfficial: 'WordPress (ایمیج رسمی)',
freshInstall: 'نصب تازه', migrateExisting: 'انتقال سایت موجود',
freshInstallNote: 'با یک WordPress تمیز شروع کن. تم‌ها و افزونه‌ها را از پنل مدیریت نصب کن.',
migrateNote: 'فایل‌های WordPress خود (wp-content، تم‌ها، افزونه‌ها) و در صورت تمایل یک dump دیتابیس را آپلود کن.',
dragWpZip: 'فایل ZIP وردپرس خود را اینجا بکش و رها کن',
dragProjectZip: 'فایل ZIP پروژهٔ خود را اینجا بکش و رها کن',
// strategies
stratLeastApps: 'کمترین اپ', stratLeastLoaded: 'کم‌بارترین', stratRoundRobin: 'چرخشی',
stratWeightedRR: 'چرخشی وزن‌دار', stratWeightedResource: 'منابع وزن‌دار', stratRegionBased: 'بر اساس منطقه',
default: 'پیش‌فرض', manual: 'دستی', none: 'هیچ‌کدام',
// toasts
appCreatedDeploying: 'اپلیکیشن ساخته شد! در حال آغاز انتشار…',
paymentSuccessDeploying: 'پرداخت موفق! در حال انتشار…',
insufficientWallet: 'موجودی کیف‌پول کافی نیست. لطفاً شارژ کن یا از درگاه پرداخت استفاده کن.',
archiveMax10: 'آرشیو باید حداکثر ۱۰ گیگابایت باشد', fileMax10: 'حجم فایل باید حداکثر ۱۰ گیگابایت باشد',
onlyZipAllowed: 'فقط فایل‌های .zip یا .tar.gz مجاز هستند', envReadFailed: 'خواندن فایل محیطی ناموفق بود',
dnsCheckFailed: 'بررسی DNS ناموفق بود. لطفاً دوباره تلاش کن.',
allowedDumpFormats: 'مجاز: .sql، .gz، .dump', maxSize500: 'حداکثر ۵۰۰ مگابایت',
storageTooSmall: 'فضای ذخیره خیلی کم است',
// misc fragments
anyCustom: 'هر',
ofYourEntire: 'از کل',
uploadAZipContaining: 'یک ZIP حاوی فایل‌های WordPress خود آپلود کن. ساختارهای پشتیبانی‌شده:',
zipWithFullRoot: 'ZIP با ریشهٔ کامل WordPress (',
filesAtRoot: 'فایل‌ها در سطح ریشه',
directoryFullRoot: 'پوشه (ریشهٔ کامل WordPress):',
zipWith: 'ZIP با',
containingWpFiles: ' حاوی فایل‌های WordPress خود. ساختارهای پشتیبانی‌شده:',
wpContentDesc: ' — تم‌ها، افزونه‌ها، آپلودها',
wpConfigDesc: ' — پیکربندی سفارشی (اختیاری)',
anyCustomA: 'هر فایل ', anyCustomB: ' سفارشی در سطح ریشه',
folderMax10: ' پوشه • حداکثر ۱۰ گیگابایت',
fullRootSuffix: '، ...) • حداکثر ۱۰ گیگابایت',
invalidDomainFormat: 'فرمت دامنه نامعتبر است. از فرمتی مثل example.com یا www.example.com استفاده کن',
dnsNotConfigured: 'رکوردهای DNS درست تنظیم نشده‌اند. رکورد CNAME را تنظیم کن و پیش از ادامه منتظر انتشار آن بمان.',
dnsVerifyFailed: 'تأیید DNS ناموفق بود. تنظیمات دامنه‌ات را بررسی کن و دوباره تلاش کن.',
platformDomainArrow: 'دامنهٔ پلتفرمِ اپت (پس از ساخت)',
runtimeDescs: {
nodejs: 'Express، NestJS، Fastify',
laravel: 'PHP، Composer، Artisan',
wordpress: 'تصویر رسمی',
go: 'Gin، Echo، Fiber',
python: 'Flask، FastAPI',
django: 'فریم‌ورک وب پایتون',
php: 'اپ‌های PHP ساده',
dotnet: 'ASP.NET Core',
},
noValidEnvVars: 'هیچ متغیر محیطی معتبری در فایل پیدا نشد',
appDataStorage: 'فضای ذخیرهٔ دادهٔ اپلیکیشن',
wordpressFreshInstall: 'WordPress (نصب تازه)',
automaticAllocator: 'تخصیص‌دهندهٔ خودکار',
back: 'بازگشت', next: 'بعدی',
},
},
};
export type Dictionary = typeof fa;
export default fa;