f8ee1ca168
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>
404 lines
19 KiB
TypeScript
404 lines
19 KiB
TypeScript
// 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;
|