Files
cloud-host/frontend/src/i18n/dictionaries/fa.ts
T
keyhan f8ee1ca168 Localize user and admin invoice pages.
Move both invoice views onto a shared invoices dictionary — statuses,
filters, payment/line-item/transaction labels, manual status controls and
toasts — with locale-aware Link, dates and RTL-aware table/search layout.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 13:00:15 +03:30

404 lines
19 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: 'ت',
},
language: {
label: 'زبان',
},
meta: {
title: 'ابربان | زیرساخت ابری، در کنترل تو',
description:
'ابربان؛ پلتفرم ابریِ خودسرویس روی کوبرنتیز. اپ خود را در چند ثانیه منتشر کن — دیتابیس مدیریت‌شده، دامنهٔ اختصاصی، SSL خودکار و لاگ زنده.',
},
roles: {
admin: 'مدیر',
technical: 'فنی',
sales: 'فروش',
},
landing: {
badge: 'پلتفرم ابریِ خودسرویس',
hero: {
title: 'ابربان',
tagline: 'زیرساخت ابری، در کنترل تو',
subtitle:
'اپلیکیشنت را در چند ثانیه روی کوبرنتیز منتشر کن — بدون دردسر سرور، بدون پیچیدگیِ DevOps.',
ctaPrimary: 'رایگان شروع کن',
ctaSecondary: 'ورود',
scrollHint: 'به دلِ ابرها بزن',
},
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: 'بهینه برای کاربر ایرانی' },
],
},
finalCta: {
titleLead: 'آسمان صاف است؛ وقتِ ',
titleHighlight: 'زنده',
titleTail: ' کردنِ اپِ توست.',
body: 'همین حالا حسابت را بساز و اولین دیپلوی را تجربه کن.',
ctaPrimary: 'همین حالا شروع کن',
ctaSecondary: 'داشبورد',
},
footer: {
copyright: '© ابربان — همهٔ حقوق محفوظ است',
},
},
auth: {
backHome: 'بازگشت به خانه',
login: {
title: 'خوش آمدی',
subtitle: 'به حساب ابربان خود وارد شو',
altPrompt: 'هنوز حساب نداری؟',
altLabel: 'ثبت‌نام کن',
email: 'ایمیل',
password: 'رمز عبور',
submit: 'ورود',
submitting: 'در حال ورود…',
success: 'با موفقیت وارد شدی!',
error: 'ورود ناموفق بود',
},
register: {
title: 'ساخت حساب',
subtitle: 'در چند دقیقه اولین اپت را منتشر کن',
altPrompt: 'قبلاً حساب ساخته‌ای؟',
altLabel: 'وارد شو',
firstName: 'نام',
firstNamePlaceholder: 'مثلاً علی',
lastName: 'نام خانوادگی',
lastNamePlaceholder: 'مثلاً رضایی',
email: 'ایمیل',
password: 'رمز عبور',
passwordPlaceholder: 'حداقل ۸ کاراکتر',
submit: 'ساخت حساب',
submitting: 'در حال ساخت حساب…',
success: 'حساب با موفقیت ساخته شد!',
error: 'ثبت‌نام ناموفق بود',
},
},
nav: {
sectionAdmin: 'مدیریت',
sectionTechnical: 'فنی',
sectionSales: 'فروش',
walletBalanceTitle: 'موجودی کیف‌پول',
dashboard: 'داشبورد',
applications: 'اپلیکیشن‌ها',
services: 'دیتابیس‌ها و سرویس‌ها',
logs: 'لاگ‌ها',
newDeploy: 'دیپلوی جدید',
wallet: 'کیف‌پول',
invoices: 'فاکتورها',
tickets: 'تیکت‌ها',
users: 'کاربران',
allApplications: 'همهٔ اپلیکیشن‌ها',
billingPlans: 'پلن‌های صورت‌حساب',
clusters: 'کلاسترها',
clusterPools: 'پول‌های کلاستر',
allTickets: 'همهٔ تیکت‌ها',
technicalTickets: 'تیکت‌های فنی',
salesTickets: 'تیکت‌های فروش',
},
dashboard: {
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: 'ببین هر پرداخت بابت چه بوده و فاکتورهای باز را پرداخت کن.',
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: 'برای تغییر دستی وضعیت، ذکر دلیل الزامی است',
},
},
};
export type Dictionary = typeof fa;
export default fa;