Files
qlockify-frontend-deployment/src/locales/fa.ts

881 lines
52 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.
export const fa = {
title: "Qlockify",
logout: "خروج",
logoutToast: "با موفقیت خارج شدید!",
confirmLogoutTitle: "تایید خروج",
confirmLogoutMessage: "آیا مطمئن هستید که می‌خواهید از حساب خود خارج شوید؟",
confirmLeave: "تغییرات ذخیره نشده‌ای دارید. آیا مطمئن هستید که می‌خواهید خارج شوید؟",
add: "افزودن",
create: "ایجاد",
cancel: "لغو",
save: "ذخیره",
remove: "حذف",
lightMode: "حالت روشن",
darkMode: "حالت تاریک",
settings: "تنظیمات",
loadingText: "در حال بارگذاری...",
loading: "در حال بارگذاری...",
noMoreResults: "نتیجه دیگری نیست.",
actions: {
create: "ایجاد",
view: "مشاهده",
edit: "ویرایش",
delete: "حذف",
cancel: "لغو",
},
login: {
loginTitle: "ورود به حساب",
loginDescription: "شماره موبایل خود را وارد کنید تا کد یکبار مصرف برای شما ارسال شود.",
loginCta: "ورود",
createAccount: "ایجاد حساب",
haveNoAccount: "حساب ندارید؟",
haveAccount: "قبلا حساب دارید؟",
loginOtpTitle: "کد ورود را تایید کنید",
passwordLoginTitle: "ورود با رمز عبور",
passwordLoginDescription: (mobile: string) => `رمز عبور مربوط به ${mobile} را وارد کنید`,
usePasswordInstead: "استفاده از رمز عبور",
useOtpInstead: "استفاده از کد یکبار مصرف",
backToMobile: "بازگشت به مرحله موبایل",
backToPasswordLogin: "بازگشت به ورود با رمز عبور",
forgotPassword: "رمز عبور را فراموش کرده‌اید؟",
signupTitle: "ساخت حساب جدید",
signupDescription: "با شماره موبایل شروع کنید تا کد تایید برای شما ارسال شود.",
sendSignupCode: "ارسال کد تایید",
signupVerifyTitle: "تایید شماره موبایل",
continueToPassword: "ادامه به مرحله رمز عبور",
signupPasswordTitle: "تعیین رمز عبور",
signupPasswordDescription: "برای حساب جدید خود یک رمز عبور انتخاب کنید.",
createAccountPasswordCta: "ایجاد حساب",
forgotPasswordTitle: "بازیابی رمز عبور",
forgotPasswordDescription: "شماره موبایل خود را وارد کنید تا کد تایید برای تغییر رمز عبور ارسال شود.",
sendResetCode: "ارسال کد بازیابی",
forgotPasswordVerifyTitle: "کد بازیابی را وارد کنید",
continueToResetPassword: "ادامه برای تعیین رمز جدید",
resetPasswordTitle: "انتخاب رمز عبور جدید",
resetPasswordDescription: "رمز عبور جدید خود را وارد کنید و آن را تایید کنید.",
resetPasswordCta: "تغییر رمز عبور",
newPasswordPlaceholder: "رمز عبور جدید",
confirmPasswordPlaceholder: "تکرار رمز عبور",
passwordMismatch: "رمز عبور و تکرار آن یکسان نیستند.",
passwordRequirements:
"رمز عبور باید حداقل 8 کاراکتر باشد و حداقل یک حرف کوچک، یک حرف بزرگ، یک عدد و یک نماد داشته باشد.",
passwordReuse: "رمز عبور جدید نباید با رمز عبور قبلی یکسان باشد.",
welcome: (title: string = "Qlockifiy") => `به ${title} خوش آمدید`,
enterPassword: "رمز عبور خود را وارد کنید",
verifyNumber: "تایید شماره موبایل",
enterMobileDesc: "برای ادامه، شماره موبایل خود را وارد کنید",
signInDesc: "با استفاده از رمز عبور خود وارد شوید",
sentCodeDesc: (mobile: string) => `کد تایید به ${mobile} ارسال شد`,
mobilePlaceholder: "شماره موبایل (مثلا ۰۹۱۲۳۴۵۶۷۸۹)",
continueWithPassword: "ادامه با رمز عبور",
continueWithGoogle: "ادامه با گوگل",
orContinueWith: "یا ادامه با",
otpLogin: "ورود با کد یکبار مصرف",
register: "ثبت نام",
passwordPlaceholder: "رمز عبور",
signIn: "ورود",
back: "بازگشت",
otpPlaceholder: "کد ۵ رقمی",
verifyAndContinue: "تایید و ادامه",
sendingOtp: "در حال ارسال کد...",
verifyingOtp: "در حال تأیید کد...",
resendOtp: "ارسال دوباره کد",
otpExpiresIn: (time: string) => `اعتبار کد تا ${time} دیگر است`,
otpExpired: "اعتبار این کد به پایان رسیده است. برای ادامه کد جدید بگیرید.",
terms: "با کلیک روی ادامه، شما با قوانین و مقررات و حریم خصوصی ما موافقت می‌کنید.",
brandingQuote: "زمان و ورک‌اسپیس‌ها خود را با پلتفرم مینیمال، سریع و امن ما بهینه مدیریت کنید.",
toasts: {
enterMobile: "لطفا شماره موبایل خود را وارد کنید",
verifySent: "کد تایید ارسال شد.",
failedOtp: "ارسال کد تایید انجام نشد.",
fillAll: "لطفا تمام فیلدها را پر کنید.",
successLogin: "با موفقیت وارد شدید.",
accountCreated: "حساب با موفقیت ایجاد شد.",
failedSignup: "تکمیل ثبت نام انجام نشد.",
invalidCreds: "اطلاعات ورود نامعتبر است.",
enterOtp: "لطفا کد تایید را وارد کنید.",
invalidOtp: "کد تایید نامعتبر است.",
passwordResetSuccess: "رمز عبور با موفقیت تغییر کرد.",
passwordResetFailed: "تغییر رمز عبور انجام نشد."
},
throttle: {
title: "تعداد تلاش‌ها بیش از حد مجاز است",
genericMessage: (time: string) => `درخواست‌های زیادی ارسال شده است. ${time} دیگر دوباره تلاش کنید.`,
otpSendMessage: (time: string) => `ارسال کد یکبار مصرف بیش از حد مجاز انجام شده است. ${time} دیگر دوباره تلاش کنید.`,
passwordLoginMessage: (time: string) => `تلاش برای ورود با رمز عبور بیش از حد مجاز بوده است. ${time} دیگر دوباره تلاش کنید.`,
otpLoginMessage: (time: string) => `تلاش برای ورود با کد یکبار مصرف بیش از حد مجاز بوده است. ${time} دیگر دوباره تلاش کنید.`,
countdownLabel: (time: string) => `تلاش دوباره تا ${time}`,
fallback: "درخواست‌های زیادی ارسال شده است. کمی صبر کنید و دوباره تلاش کنید.",
},
google: {
loadingTitle: "در حال تکمیل ورود با گوگل",
loadingDescription: "در حال بررسی حساب گوگل شما و آماده‌سازی مرحله بعد هستیم.",
collectMobileTitle: "ساخت حساب را کامل کنید",
collectMobileDescription: (email: string) =>
`حساب گوگل ${email} تایید شد. برای تکمیل ساخت حساب، شماره موبایل خود را وارد کنید.`,
existingEmailClaimDescription: (email: string, mobileHint: string) =>
`حساب گوگل ${email} تایید شد. برای تایید مالکیت، شماره موبایل متصل به این حساب (${mobileHint}) را وارد کنید.`,
claimTitle: "حساب موجود خود را تایید کنید",
claimDescription: (mobile: string) =>
`حسابی با شماره ${mobile} از قبل وجود دارد. کد ارسال‌شده به این شماره را وارد کنید تا گوگل به همان حساب متصل شود.`,
mobileClaimDescription: (mobile: string) =>
`حسابی بدون ایمیل با شماره ${mobile} از قبل وجود دارد. کد ارسال‌شده به این شماره را وارد کنید تا گوگل به همان حساب متصل شود.`,
errorTitle: "ورود با گوگل کامل نشد",
cancelled: "فرآیند ورود با گوگل قبل از تکمیل لغو شد.",
missingFlow: "جریان ورود با گوگل پیدا نشد یا منقضی شده است.",
loadFailed: "بارگذاری وضعیت ورود با گوگل انجام نشد.",
callbackFailed: "تکمیل ورود با گوگل انجام نشد. لطفاً دوباره تلاش کنید.",
tokenExchangeFailed: "ورود با گوگل موقتاً در دسترس نیست. چند دقیقه دیگر دوباره تلاش کنید.",
profileLookupFailed: "دریافت اطلاعات حساب گوگل انجام نشد. لطفاً دوباره تلاش کنید.",
completeFailed: "تکمیل ساخت حساب با گوگل انجام نشد.",
claimOtpSent: "کد تایید با موفقیت ارسال شد.",
googleAccount: "حساب گوگل",
mobileHintLabel: (mobileHint: string) => `شماره مورد انتظار: ${mobileHint}`,
completeButton: "ادامه و ایجاد حساب",
verifyClaimButton: "تایید و ادامه",
resendClaimOtp: "ارسال دوباره کد تایید",
restartGoogle: "شروع دوباره ورود با گوگل",
}
},
loginTerms: {
prefix: "با ورود به سیستم، شما با ",
link: "شرایط خدمات و حریم خصوصی",
suffix: " ما موافقت می‌کنید."
},
rateLimit: {
eyebrow: "محدودیت درخواست فعال شده است",
title: "لطفاً پیش از تلاش دوباره صبر کنید",
message: "درخواست‌های زیادی ارسال شده است. دسترسی شما تا پایان زمان انتظار به صورت موقت محدود شده است.",
cooldownLabel: "زمان انتظار",
waitingMessage: (time: string) => `ارسال درخواست برای مدتی مسدود است.`,
finishedMessage: "زمان انتظار به پایان رسیده است. اکنون می‌توانید ادامه دهید.",
continue: "ادامه",
continueCooldown: (time: string) => `ادامه تا ${time}`,
ready: "آماده",
},
terms: {
back: "بازگشت",
title: "شرایط خدمات و حریم خصوصی",
lastUpdated: "آخرین بروزرسانی: ۲۱ اسفند ۱۴۰۴",
sections: {
acceptance: {
title: "۱. پذیرش شرایط",
content: "با دسترسی و استفاده از Qlockify، شما موافقت می‌کنید که به این شرایط خدمات و تمامی قوانین و مقررات مربوطه پایبند باشید. اگر با هر یک از این شرایط موافق نیستید، استفاده یا دسترسی شما به این سایت ممنوع است."
},
license: {
title: "۲. مجوز کاربر و مسئولیت‌ها",
items: [
"شما باید اطلاعات دقیق، به‌روز و کامل را در طول فرآیند ثبت‌نام ارائه دهید.",
"شما مسئول حفظ امنیت حساب و رمز عبور خود هستید.",
"شما مجاز به استفاده از خدمات برای اهداف غیرقانونی یا غیرمجاز نیستید.",
"استفاده شما از خدمات نباید قوانین حوزه قضایی شما را نقض کند."
]
},
privacy: {
title: "۳. حریم خصوصی و جمع‌آوری داده‌ها",
p1: "ما حریم خصوصی شما را جدی می‌گیریم. ما اطلاعاتی را برای ارائه خدمات بهتر به کاربران خود جمع‌آوری می‌کنیم. انواع داده‌های شخصی که جمع‌آوری می‌کنیم شامل موارد زیر است:",
personalLabel: "اطلاعات شخصی",
personalText: "نام، آدرس ایمیل، شماره تلفن و تاریخ تولد ارائه‌شده در طول ثبت‌نام یا به‌روزرسانی پروفایل.",
usageLabel: "داده‌های استفاده",
usageText: "اطلاعات مربوط به نحوه دسترسی و استفاده از خدمات، از جمله زمان‌سنجی‌ها و معیارهای دستگاه.",
p2: "ما اطلاعات شناسایی شخصی شما را به دیگران نمی‌فروشیم، مبادله نمی‌کنیم یا اجاره نمی‌دهیم. ما از اقدامات امنیتی استاندارد صنعت برای محافظت در برابر دسترسی غیرمجاز، تغییر، افشا یا تخریب داده‌های شخصی شما استفاده می‌کنیم."
},
liability: {
title: "۴. محدودیت مسئولیت",
content: "در هیچ شرایطی Qlockify یا تأمین‌کنندگان آن مسئولیتی در قبال هرگونه خسارت (از جمله، بدون محدودیت، خسارت ناشی از دست دادن داده‌ها یا سود، یا به دلیل وقفه در کسب‌وکار) ناشی از استفاده یا عدم توانایی استفاده از مواد روی پلتفرم نخواهند داشت."
},
modifications: {
title: "۵. اصلاحات",
content: "ما ممکن است این شرایط خدمات را در هر زمان بدون اطلاع قبلی بازبینی کنیم. با استفاده از این وب‌سایت، شما موافقت می‌کنید که به نسخه فعلی این شرایط خدمات پایبند باشید."
},
},
},
profile: {
title: "پروفایل کاربر",
firstName: "نام",
lastName: "نام خانوادگی",
email: "ایمیل",
description: "توضیحات",
mobileNumber: "شماره موبایل",
birthDate: "تاریخ تولد",
yearsOld: "سال",
dateJoined: "تاریخ عضویت",
editInfo: "ویرایش اطلاعات",
changePicture: "تغییر تصویر",
save: "ذخیره",
cancel: "لغو",
upload: "آپلود",
remove: "حذف",
imageInput: "برای انتخاب کلیک کنید یا فایل را بکشید",
noEmail: "ایمیلی ثبت نشده",
password: {
trigger: "تغییر رمز عبور",
title: "تغییر رمز عبور",
description: "رمز عبور فعلی خود را وارد کنید و یک رمز جدید انتخاب کنید.",
currentPassword: "رمز عبور فعلی",
newPassword: "رمز عبور جدید",
confirmPassword: "تکرار رمز جدید",
submit: "ذخیره رمز عبور",
saving: "در حال ذخیره...",
toasts: {
success: "رمز عبور با موفقیت تغییر کرد.",
error: "تغییر رمز عبور انجام نشد.",
},
},
toasts: {
successEdit: "پروفایل با موفقیت به‌روزرسانی شد.",
successImage: "عکس پروفایل به‌روزرسانی شد.",
successRemoveImage: "عکس پروفایل حذف شد.",
error: "خطایی رخ داد."
}
},
workspace: {
title: "مدیریت ورک‌اسپیس‌ها",
createNew: "ایجاد ورک‌اسپیس جدید",
manage: "مدیریت ورک‌اسپیس‌ها",
nameLabel: "عنوان",
namePlaceholder: "نام ورک‌اسپیس را وارد کنید",
descriptionLabel: "توضیحات",
descriptionPlaceholder: "توضیحات (اختیاری)",
thumbnailLabel: "تصویر",
uploadImage: "برای آپلود تصویر کلیک کنید",
removeImage: "حذف تصویر",
thumbnailInvalidType: "نوع تصویر پشتیبانی نمی‌شود. از JPG، PNG یا WebP استفاده کنید.",
thumbnailMaxSizeError: "حجم تصویر باید حداکثر ۲ مگابایت باشد.",
searchMemberPlaceholder: "جستجو با موبایل دقیق (مثلا 09123456789)",
addMember: "افزودن عضو",
roleAdmin: "مدیر",
roleMember: "عضو",
userNotFound: "کاربر یافت نشد",
userAlreadyAdded: "کاربر قبلا اضافه شده است",
inviteMembers: "دعوت اعضا (شماره موبایل دقیق)",
selectedMembers: "اعضای انتخاب شده",
creating: "در حال ایجاد...",
submit: "ایجاد",
cancel: "لغو",
loading: "در حال بارگذاری...",
confirmDelete: "آیا از حذف این ورک‌اسپیس اطمینان دارید؟",
deleteError: "خطا در حذف ورک‌اسپیس",
subtitle: "ورک‌اسپیس‌های خود را مدیریت کنید",
noDescription: "بدون توضیحات",
emptyState: "شما در هیچ ورک‌اسپیس عضو نیستید.",
noWorkspaceSearch: "لطفاً عبارت جستجو را تغییر دهید.",
noWorkspace: "ورک‌اسپیس یافت نشد.",
createTitle: "ایجاد ورک‌اسپیس",
editTitle: "ویرایش ورک‌اسپیس",
detailTitle: "جزئیات ورک‌اسپیس",
save: "ذخیره",
create: "ایجاد",
noWorkspaceTitle: "خوش آمدید!",
noWorkspaceDesc: "لطفاً اولین ورک‌اسپیس خود را ایجاد کنید.",
back: "بازگشت به ورک‌اسپیس‌ها",
roleLabel: "نقش شما",
openReports: "مشاهده گزارش‌ها",
statsMembers: "اعضا",
statsRates: "نرخ‌های ثبت‌شده",
statsOwnersAdmins: "مالکان و ادمین‌ها",
statsGuests: "مهمان‌ها",
membersSectionTitle: "اعضا",
membersSectionSubtitle: "اعضای این ورک‌اسپیس و نقش فعلی آن‌ها.",
membersLocked: "فهرست کامل اعضا فقط برای مالک و ادمین قابل مشاهده است.",
projectRateHint: "برای هر کاربر می‌توانید از صفحه پروژه‌ها و داخل پنجره دسترسی پروژه، یک نرخ اختصاصی برای همان پروژه تعریف کنید تا روی نرخ ساعتی ورک‌اسپیس اولویت داشته باشد.",
manageMembers: "مدیریت اعضا",
mobileNumber: "شماره تماس",
youLabel: "شما",
resourcesTitle: "منابع",
resourceOpen: "مشاهده",
roleDistributionTitle: "توزیع نقش‌ها",
unknownMember: "عضو ناشناس",
roles: {
owner: "مالک",
admin: "ادمین",
member: "عضو",
guest: "مهمان",
},
createdSuccess: "ورک‌اسپیس با موفقیت ایجاد شد",
updatedSuccess: "ورک‌اسپیس با موفقیت ویرایش شد",
fetchError: "خطا در دریافت اطلاعات ورک‌اسپیس",
loadErrorDescription: "ممکن است سرویس بک‌اند در دسترس نباشد. لطفاً چند لحظه بعد دوباره تلاش کنید.",
retry: "تلاش دوباره",
remove: "حذف",
noUsersFound: "کاربری یافت نشد",
selectRole: "انتخاب نقش",
add: "افزودن",
searchPlaceholder: "جستوجوی ورک‌اسپیس‌ها...",
deleteSuccess: "ورک‌اسپیس با موفقیت حذف شد",
deleteTitle: "حذف ورک‌اسپیس",
deleteWarning: "برای تأیید حذف، لطفاً نام ورک‌اسپیس را وارد کنید:",
members: "اعضا",
searchUser: "جستجوی کاربر با شماره موبایل",
searching: "در حال جستجو...",
noMembers: "عضوی یافت نشد.",
removeMemberTitle: "حذف عضو",
confirmDeleteTitle: "حذف عضو",
confirmDeleteMessage: "آیا مطمئن هستید که می‌خواهید این عضو را از ورک‌اسپیس حذف کنید؟",
successCreate: "ورک‌اسپیس با موفقیت ایجاد شد.",
toast: {
successCreate: "ورک‌اسپیس با موفقیت ساخته شد.",
errorCreate: "ایجاد ورک‌اسپیس ناموفق بود.",
successUpdate: "ورک‌اسپیس با موفقیت به‌روزرسانی شد.",
errorUpdate: "به‌روزرسانی ورک‌اسپیس با خطا مواجه شد.",
successAdd: "کاربر جدید با موفقیت به ورک‌اسپیس افزوده شد.",
errorAdd: "افزودن کاربر با خطا مواجه شد.",
successRemove: "کاربر با موفقیت از ورک‌اسپیس حذف شد.",
errorRemove: "حذف کاربر با خطا مواجه شد.",
successRole: "نقش کاربر با موفقیت تغییر کرد.",
errorRole: "تغییر نقش کاربر با خطا مواجه شد.",
errorLoad: "دریافت اطلاعات ورک‌اسپیس با خطا مواجه شد.",
cannotAddSelf: "شما به‌صورت خودکار مالک هستید.",
},
onlyNumbersAllowed: "برای شماره موبایل فقط مجاز به وارد کردن عدد هستید.",
weekTotal: "مجموع هفته"
},
clients: {
title: "مشتری‌ها",
description: (workspaceName: string) => `مدیریت مشتری‌ها برای ${workspaceName}`,
addClient: "افزودن مشتری",
searchPlaceholder: "جستجوی مشتری‌ها...",
noClients: "مشتری یافت نشد",
noClientsSearch: "لطفاً عبارت جستجو را تغییر دهید.",
noClientsAdd: "برای شروع اولین مشتری خود را اضافه کنید.",
addedOn: "تاریخ افزودن",
selectWorkspace: "لطفاً ابتدا یک ورک‌اسپیس انتخاب کنید.",
modalTitle: "ایجاد مشتری جدید",
clientName: "نام مشتری",
clientNamePlaceholder: "مثال: شرکت الف",
notes: "یادداشت‌ها",
notesPlaceholder: "توضیحات اختیاری...",
create: "ایجاد",
cancel: "انصراف",
editClient: "ویرایش مشتری",
deleteConfirmTitle: "حذف مشتری",
deleteConfirmMessage: (name: string) => `آیا از حذف ${name} اطمینان دارید؟`,
delete: "حذف",
saveChanges: "ذخیره تغییرات",
createSuccess: "مشتری با موفقیت ایجاد شد.",
updateSuccess: "مشتری با موفقیت به‌روزرسانی شد.",
deleteSuccess: "مشتری با موفقیت حذف شد.",
errors: {
createFailed: "خطا در ایجاد مشتری",
fetchFailed: "خطا در دریافت لیست مشتری‌ها",
updateFailed: "خطا در ویرایش مشتری",
deleteFailed: "خطا در حذف مشتری",
},
},
pagination: {
perPage: "در هر صفحه",
showing: "نمایش",
to: "تا",
of: "از",
previous: "قبلی",
page: "صفحه",
next: "بعدی",
},
sidebar: {
timesheet: 'تایم‌شیت',
reports: 'گزارش‌ها',
logs: "لاگ‌ها",
workspaces: 'ورک‌اسپیس‌ها',
clients: 'مشتری‌ها',
projects: "پروژه‌ها",
tags: "تگ‌ها",
expand: 'باز کردن',
collapse: 'جمع کردن',
},
landing: {
brandLabel: "زیرساخت عملیاتی زمان",
eyebrow: "طراحی‌شده برای تیم‌های دقیق که به داده زمانی قابل اتکا نیاز دارند",
nav: {
demo: "دموی محصول",
features: "قابلیت‌ها",
workflow: "فرآیند کار",
about: "درباره ما",
},
actions: {
switchToEnglish: "English",
switchToPersian: "فارسی",
signIn: "ورود",
openApp: "ورود به اپ",
openWorkspace: "باز کردن ورک‌اسپیس",
startNow: "شروع با کنترل کامل",
watchDemo: "مشاهده دموی محصول",
readTerms: "مطالعه قوانین",
readAbout: "درباره Qlockify",
},
hero: {
titleTop: "هر ساعت کاری را به یک سیگنال عملیاتی قابل اعتماد تبدیل کنید.",
titleAccent: "Qlockify زمان را شفاف، پاسخ‌گو و قابل‌صورتحساب می‌کند.",
description:
"یک محیط متمرکز برای تیم‌های مدرن که به ثبت سریع زمان، رهگیری دقیق پروژه، گزارش‌های قابل اتکا و لاگ عملیاتی واقعی برای مدیریت نیاز دارند.",
},
metrics: {
capture: "ثبت تمیزتر ساعات قابل‌صورتحساب",
visibility: "دسترسی سریع‌تر به دید گزارش‌دهی",
decision: "از ورودی خام تا تصمیم مدیریتی",
},
trust: {
first: "تایمر دقیق با امکان ویرایش دستی در زمان لازم",
second: "دسترسی‌ها، لاگ‌ها و گزارش‌های مبتنی بر نرخ",
third: "مناسب آژانس‌ها، شرکت‌های مشاوره، تیم‌های محصول و عملیات",
},
capabilities: {
time: {
title: "ثبت کار بدون اصطکاک",
description:
"تایمر را شروع کنید، ورودی‌های گذشته را اصلاح کنید و پروژه و تگ را بدون ایجاد اصطکاک برای تیم به هر ساعت متصل نگه دارید.",
},
reports: {
title: "کسب‌وکار را در چند دقیقه بخوانید",
description:
"خروجی روزانه، عملکرد قابل‌صورتحساب، توزیع پروژه‌ها و بسته‌های گزارشی قابل خروجی را بدون پاک‌سازی دستی فایل‌ها ببینید.",
},
control: {
title: "عملیات را قابل توضیح نگه دارید",
description:
"ببینید چه کسی چه چیزی را تغییر داده، نقش‌ها را شفاف نگه دارید و برای مدیریت یک رد عملیاتی تمیزتر از چت و فایل دستی بسازید.",
},
},
demo: {
timerTag: "تایمر زنده",
timerTitle: "بازه اجرای فعلی",
timerText: "بهبود دیزاین سیستم، متصل به پروژه درست، تگ‌های صحیح و نرخ قابل‌صورتحساب.",
panelLabel: "پیش‌نمایش تعاملی محصول",
panelTitle: "یک سطح واحد برای رهگیری، گزارش‌دهی و شفافیت عملیاتی",
runningCard: "ورودی فعال",
currentTask: "پیاده‌سازی لندینگ سازمانی",
currentTaskMeta: "پروژه: بازاریابی Qlockify · تگ‌ها: طراحی، بازبینی، تحویل",
billableLabel: "نرخ زنده قابل‌صورتحساب",
reportCard: "روند گزارش روزانه",
opsCard: "سلامت عملیات",
opsLabels: ["پوشش", "تمرکز تیم", "آمادگی صورتحساب"],
logCard: "آخرین فعالیت‌های ورک‌اسپیس",
logItems: [
{ title: "نرخ تیم طراحی محصول به‌روزرسانی شد", meta: "اقدام مالک · ۳ دقیقه پیش" },
{ title: "پروژه مشتری‌محور بایگانی شد", meta: "اقدام ادمین · ۱۸ دقیقه پیش" },
{ title: "تگ تاریخی روی ورودی ویرایش‌شده حفظ شد", meta: "اقدام عضو · ۴۱ دقیقه پیش" },
],
outcomeTag: "خروجی مدیریتی",
outcomeText: "ابهام کمتر در پایان ماه، ساعات قابل‌صورتحساب از‌دست‌رفته کمتر و بازبینی عملیاتی سریع‌تر.",
},
workflowTag: "فرآیند عملیاتی",
workflowTitle: "از تلاش خام تا داده مدیریتی قابل استفاده، با یک حلقه کوتاه‌تر.",
workflowDescription:
"Qlockify مسیر را کوتاه نگه می‌دارد: دقیق ثبت کنید، یک‌بار بستر را درست بسازید و همان نتیجه را در تایم‌شیت، گزارش و تصمیم‌گیری مدیریتی مصرف کنید.",
workflow: {
capture: "زمان را در مبدأ، همراه با پروژه، تگ و بستر مالی ثبت کنید.",
structure: "هر تغییر در اعضا، نرخ‌ها و تنظیمات ورک‌اسپیس را قابل مشاهده و قابل بررسی نگه دارید.",
improve: "عملکرد روزانه و ماهانه را با گزارش‌هایی بخوانید که آماده خروجی و اقدام هستند.",
},
finalCtaTag: "آماده برای تیم‌های جدی",
finalCtaTitle: "اگر تیم شما تخصص می‌فروشد یا پروژه مشتری تحویل می‌دهد، سیستم زمان شما هم باید همین‌قدر جدی باشد.",
finalCtaDescription:
"اپ را باز کنید، ورک‌اسپیس بسازید و ببینید وقتی محصول نشت بستر را متوقف می‌کند، انضباط گزارش‌دهی چقدر سریع بهتر می‌شود.",
},
demo: {
badge: "محیط دمو",
starting: "در حال آماده‌سازی دمو...",
started: "محیط دمو آماده شد.",
startError: "امکان ساخت محیط دمو وجود ندارد.",
expiresAt: "زمان انقضا",
resetAction: "شروع دوباره دمو",
reset: "محیط دموی تازه آماده شد.",
},
ordering: {
createdAtDesc: "جدیدترین",
createdAt: "قدیمی‌ترین",
updatedAtDesc: "اخیراً بروزرسانی شده",
name: "نام (صعودی)",
nameDesc: "نام (نزولی)",
},
projects: {
title: "پروژه‌ها",
description: (workspaceName: string) => `مدیریت پروژه‌ها برای ${workspaceName}`,
active: "پروژه‌های فعال",
archived: "بایگانی شده",
createNew: "ایجاد پروژه جدید",
searchPlaceholder: "جستجوی پروژه‌ها...",
selectWorkspace: "لطفاً ابتدا یک ورک‌اسپیس انتخاب کنید.",
titlePlaceholder: "عنوان پروژه",
descriptionPlaceholder: "توضیحات پروژه",
titleLabel: "عنوان",
descriptionLabel: "توضیحات",
clientLabel: "مشتری",
colorLabel: "رنگ",
loading: "در حال بارگذاری...",
client: "مشتری",
noClient: "بدون مشتری",
emptyState: "پروژه‌ای یافت نشد",
noProjectsSearch: "لطفاً عبارت جستجو را تغییر دهید.",
deleteTitle: "حذف پروژه",
deleteWarning: "برای تایید حذف، لطفاً نام پروژه را تایپ کنید:",
deleteSuccess: "پروژه با موفقیت حذف شد",
deleteError: "خطا در حذف پروژه",
create: "ایجاد",
cancel: "انصراف",
createProject: "ایجاد پروژه",
editProject: "ویرایش پروژه",
restore: "بازیابی",
archive: "بایگانی",
archiveSuccess: "پروژه با موفقیت بایگانی شد.",
restoreSuccess: "پروژه با موفقیت بازیابی شد.",
fetchError: "خطا در دریافت پروژه‌ها.",
clientFetchError: "خطا در دریافت لیست مشتری‌ها.",
filterClients: "فیلتر بر اساس مشتری",
clearClientFilters: "پاک کردن فیلترها",
memberAlreadyAdded: "این کاربر قبلا اضافه شده است",
creator: "سازنده",
addUser: "افزودن کاربر",
addFromWorkspace: "افزودن از اعضای ورک‌اسپیس",
searchMembers: "جستجوی اعضا",
addAllWorkspaceMembers: "افزودن همه اعضای ورک‌اسپیس",
confirmDeleteTitle: "حذف عضو",
confirmDeleteDesc: "آیا مطمئن هستید که می‌خواهید این عضو را حذف کنید؟",
roles: {
member: "عضو",
manager: "مدیر"
},
namePlaceholder: "نام پروژه...",
teamMembers: "اعضای تیم",
manageAccess: "پروژه‌ها و نرخ‌ها",
accessModalTitle: "پروژه‌ها و نرخ‌ها",
accessModalDescription: "دسترسی پروژه‌ها را برای اعضا و مهمان‌ها مدیریت کنید و برای هر کاربر ورک‌اسپیس نرخ اختصاصی پروژه ثبت کنید.",
accessMemberLabel: "کاربر",
accessNoMembers: "کاربری در این ورک‌اسپیس پیدا نشد.",
accessNoProjects: "پروژه‌ای پیدا نشد.",
accessSelectVisible: "انتخاب همه موارد قابل مشاهده",
accessClearSelection: "پاک کردن انتخاب",
accessSelectClientProjects: "انتخاب همه پروژه‌های این مشتری",
accessGrant: "اعطای دسترسی به موارد انتخاب‌شده",
accessRevoke: "لغو دسترسی موارد انتخاب‌شده",
accessOn: "دارای دسترسی",
accessOff: "بدون دسترسی",
accessGrantSuccess: "دسترسی پروژه با موفقیت اعطا شد.",
accessRevokeSuccess: "دسترسی پروژه با موفقیت لغو شد.",
accessLoadError: "بارگذاری وضعیت دسترسی پروژه‌ها انجام نشد.",
accessSaveError: "به‌روزرسانی دسترسی پروژه‌ها انجام نشد.",
implicitAccessHint: "مالک‌ها و ادمین‌ها همیشه به همه پروژه‌ها دسترسی دارند. از اینجا فقط می‌توانید نرخ اختصاصی پروژه برای آن‌ها تنظیم کنید.",
createSuccess: "پروژه با موفقیت ایجاد شد.",
createError: "خطا در ایجاد پروژه.",
updateSuccess: "پروژه با موفقیت به‌روزرسانی شد.",
updateError: "به‌روزرسانی پروژه با خطا مواجه شد.",
edit: "ویرایش پروژه",
projectMembers: "اعضای پروژه",
removeAllWorkspaceMembers: "حذف همه",
searchWorkspaceMembers: "جستجو با نام یا وارد کردن شماره موبایل...",
userNotFound: "کاربری با این شماره موبایل یافت نشد.",
alreadyInProject: "قبلاً اضافه شده",
addToProject: "افزودن به پروژه",
noWorkspaceMembers: "عضوی یافت نشد.",
},
tags: {
title: "تگ‌ها",
description: (workspaceName: string) => `مدیریت تگ‌ها برای ${workspaceName}`,
create: "ایجاد تگ",
createTitle: "ایجاد تگ",
editTitle: "ویرایش تگ",
deleteTitle: "حذف تگ",
deleteConfirmMessage: (name: string) => `آیا از حذف ${name} اطمینان دارید؟`,
searchPlaceholder: "جست‌وجوی تگ‌ها...",
nameLabel: "نام تگ",
namePlaceholder: "مثلاً طراحی",
colorLabel: "رنگ",
emptyState: "تگی یافت نشد",
noTagsSearch: "لطفاً عبارت جستجو را تغییر دهید.",
selectWorkspace: "لطفاً ابتدا یک ورک‌اسپیس انتخاب کنید.",
fetchError: "دریافت تگ‌ها با خطا مواجه شد.",
createSuccess: "تگ با موفقیت ایجاد شد.",
updateSuccess: "تگ با موفقیت به‌روزرسانی شد.",
saveError: "ذخیره تگ با خطا مواجه شد.",
deleteSuccess: "تگ با موفقیت حذف شد.",
deleteError: "حذف تگ با خطا مواجه شد.",
},
rates: {
workspaceSectionTitle: "نرخ‌های کاربران ورک‌اسپیس",
projectSectionTitle: "نرخ‌های کاربران پروژه",
myRatesTitle: "تعرفه‌های من",
myRatesHint: "نرخ‌های اختصاصی پروژه در این ورک‌اسپیس روی نرخ پیش‌فرض شما اولویت دارند.",
workspaceRate: "دستمزد ساعتی",
workspaceRateHint: "این نرخ پیش‌فرض شما است مگر این‌که برای یک پروژه نرخ اختصاصی ثبت شده باشد.",
projectOverride: "نرخ اختصاصی پروژه",
projectOverrides: "نرخ‌های اختصاصی پروژه",
accessibleProjects: "پروژه‌های دردسترس",
workspaceFallbackProjects: "با نرخ ورک‌اسپیس",
projectOverrideHint: "فقط پروژه‌هایی که نرخ اختصاصی دارند اینجا نمایش داده می‌شوند. بقیه پروژه‌های دردسترس از نرخ ورک‌اسپیس استفاده می‌کنند.",
projectOverrideEmpty: "برای شما در این ورک‌اسپیس هنوز نرخ اختصاصی پروژه‌ای ثبت نشده است.",
myRatesEmpty: "هنوز نرخی برای این ورک‌اسپیس ثبت نشده است.",
inheritsWorkspaceRate: "ارث‌بری از دستمزد ساعتی",
noRate: "بدون نرخ",
hourlyRatePlaceholder: "0.00",
currencyPlaceholder: "USD",
searchUnitPlaceholder: "جست‌وجوی واحد...",
removeRate: "حذف نرخ",
workspaceSaveSuccess: "نرخ کاربر ورک‌اسپیس ذخیره شد.",
workspaceSaveError: "ذخیره نرخ کاربر ورک‌اسپیس با خطا مواجه شد.",
workspaceRemoveSuccess: "نرخ کاربر ورک‌اسپیس حذف شد.",
workspaceRemoveError: "حذف نرخ کاربر ورک‌اسپیس با خطا مواجه شد.",
projectSaveSuccess: "نرخ کاربر پروژه ذخیره شد.",
projectSaveError: "ذخیره نرخ کاربر پروژه با خطا مواجه شد.",
projectRemoveSuccess: "نرخ کاربر پروژه حذف شد.",
projectRemoveError: "حذف نرخ کاربر پروژه با خطا مواجه شد.",
},
timesheet: {
title: "تایم‌شیت",
description: (workspaceName: string) => `ثبت زمان در ${workspaceName}`,
selectWorkspace: "لطفاً ابتدا یک ورک‌اسپیس انتخاب کنید.",
addEntry: "افزودن ورودی",
startTimer: "شروع تایمر",
stopTimer: "توقف تایمر",
timerRunning: "تایمر فعال است",
runningLabel: "تایمر فعلی",
runningBadge: "در حال اجرا",
noRunningEntry: "تایمر فعالی وجود ندارد",
searchPlaceholder: "جست‌وجوی ورودی‌های زمان...",
orderingNewest: "جدیدترین",
orderingOldest: "قدیمی‌ترین",
emptyState: "ورودی زمانی یافت نشد",
emptyDescription: "بدون توضیح",
emptyStateDescription: "برای شروع، تایمر را اجرا کنید یا یک ورودی دستی اضافه کنید.",
noEntriesSearch: "عبارت جست‌وجو یا فیلترهای خود را تغییر دهید.",
createTitle: "افزودن ورودی زمان",
startTitle: "شروع تایمر",
editTitle: "ویرایش ورودی زمان",
createSuccess: "ورودی زمان با موفقیت ایجاد شد.",
startSuccess: "تایمر با موفقیت شروع شد.",
updateSuccess: "ورودی زمان با موفقیت به‌روزرسانی شد.",
saveError: "ذخیره ورودی زمان با خطا مواجه شد.",
stopSuccess: "تایمر با موفقیت متوقف شد.",
stopError: "توقف تایمر با خطا مواجه شد.",
deleteSuccess: "ورودی زمان با موفقیت حذف شد.",
deleteError: "حذف ورودی زمان با خطا مواجه شد.",
fetchError: "دریافت ورودی‌های زمان با خطا مواجه شد.",
optionsError: "دریافت پروژه‌ها و تگ‌ها با خطا مواجه شد.",
descriptionLabel: "توضیحات",
descriptionPlaceholder: "روی چه چیزی کار می‌کنید؟",
projectLabel: "پروژه",
noProject: "بدون پروژه",
startLabel: "شروع",
endLabel: "پایان",
timeLabel: "زمان",
billable: "قابل صورتحساب",
noTagsHint: "ابتدا از صفحه تگ‌ها، تگ ایجاد کنید.",
clearFilters: "پاک کردن فیلترها",
customFromLabel: "از تاریخ",
customToLabel: "تا تاریخ",
allClientsLabel: "همه مشتری‌ها",
allProjectsLabel: "همه پروژه‌ها",
allTagsLabel: "همه تگ‌ها",
showFiltersLabel: "نمایش فیلترها",
hideFiltersLabel: "مخفی کردن فیلترها",
applyFiltersLabel: "اعمال",
clientFilterPrefix: "مشتری",
projectFilterPrefix: "پروژه",
tagFilterPrefix: "تگ",
fromFilterPrefix: "از",
toFilterPrefix: "تا",
deleteTitle: "حذف ورودی زمان",
deleteConfirmMessage: "آیا از حذف این ورودی زمان اطمینان دارید؟",
restartConfirmMessage: "می‌خواهید یک تایمر جدید را از روی این ورودی شروع کنید؟",
discardConfirmMessage: "آیا از دور انداختن این تایمر در حال اجرا اطمینان دارید؟",
searchTagsLabel: "جست‌وجوی تگ‌ها...",
noTagsFoundLabel: "تگی پیدا نشد.",
searchProjectsLabel: "جست‌وجوی پروژه‌ها...",
noProjectsFoundLabel: "پروژه‌ای پیدا نشد.",
deletedProjectLabel: "پروژه حذف‌شده",
deletedTagLabel: "تگ حذف‌شده",
},
reports: {
title: "گزارش‌ها",
description: (workspaceName: string) => `مرور گزارش فعالیت برای ${workspaceName}`,
selectWorkspace: "لطفاً ابتدا یک ورک‌اسپیس انتخاب کنید.",
chartTab: "نمودار",
tableTab: "جدول",
period: "بازه",
periodThisWeek: "این هفته",
periodThisMonth: "این ماه",
periodThisYear: "این سال",
periodFirstHalf: "نیمه اول سال",
periodSecondHalf: "نیمه دوم سال",
periodCustom: "بازه دلخواه",
fromDate: "از تاریخ",
toDate: "تا تاریخ",
user: "کاربر",
mobile: "موبایل",
allUsers: "همه کاربران",
searchUsers: "جست‌وجوی کاربران...",
client: "مشتری",
allClients: "همه مشتری‌ها",
searchClients: "جست‌وجوی مشتری‌ها...",
project: "پروژه",
allProjects: "همه پروژه‌ها",
searchProjects: "جست‌وجوی پروژه‌ها...",
tags: "تگ‌ها",
allTags: "همه تگ‌ها",
searchTags: "جست‌وجوی تگ‌ها...",
name: "نام",
clear: "پاک کردن",
apply: "اعمال",
totalHours: "مجموع ساعت",
billableHours: "ساعات کاری",
nonBillableHours: "ساعات غیر کاری",
hourlyRate: "نرخ ساعتی",
hourlyRates: "نرخ‌های ساعتی",
workingHours: "ساعات کاری",
nonWorkingHours: "ساعات غیرکاری",
totalIncome: "مجموع کارکرد",
projectPercentages: "درصد پروژه‌ها",
clientPercentages: "درصد مشتری‌ها",
tagPercentages: "درصد تگ‌ها",
userSummaryTitle: "خلاصه کاربران",
userSummaryDetailsTitle: "جزئیات کاربر: {name}",
userSummaryDetailsDescription: "تاریخچه نرخ‌های ساعتی و توزیع زمان کار برای کاربر انتخاب‌شده را بررسی کنید.",
rateHistory: "تاریخچه نرخ‌ها",
percentage: "درصد",
hourPercentage: "درصد ساعت",
incomePercentage: "درصد کارکرد",
now: "حال",
chartTitle: "نمودار فعالیت",
totalSeconds: "مجموع ثانیه",
exportExcel: "خروجی Excel",
exportPdf: "خروجی PDF",
date: "تاریخ",
details: "جزئیات",
total: "مجموع",
noData: "داده‌ای وجود ندارد",
clientsTable: "مشتری‌ها",
projectsTable: "پروژه‌ها",
tagsTable: "تگ‌ها",
loadError: "دریافت گزارش‌ها با خطا مواجه شد.",
loadDayDetailsError: "دریافت جزئیات روز با خطا مواجه شد.",
loadFiltersError: "دریافت فیلترهای گزارش با خطا مواجه شد.",
exportQueued: "درخواست خروجی ثبت شد. پیوند دانلود از طریق اعلان ارسال می‌شود.",
exportError: "ثبت درخواست خروجی با خطا مواجه شد.",
},
logs: {
eyebrow: "فعالیت‌های ورک‌اسپیس",
title: "لاگ‌های فعالیت",
description: (workspaceName: string) => `مرور رویدادهای ثبت‌شده در ${workspaceName}`,
selectWorkspace: "لطفاً ابتدا یک ورک‌اسپیس انتخاب کنید.",
unauthorized: "فقط مالک و ادمین می‌توانند لاگ‌های فعالیت ورک‌اسپیس را مشاهده کنند.",
loading: "در حال بارگذاری لاگ‌ها...",
loadingUsers: "در حال بارگذاری کاربران...",
loadingDetails: "در حال بارگذاری جزئیات...",
loadError: "دریافت لاگ‌ها با خطا مواجه شد.",
loadDetailsError: "دریافت جزئیات لاگ با خطا مواجه شد.",
loadFiltersError: "دریافت فیلترهای لاگ با خطا مواجه شد.",
search: "جست‌وجو",
searchPlaceholder: "جست‌وجوی لاگ‌ها...",
section: "بخش",
allSections: "همه بخش‌ها",
event: "رویداد",
allEvents: "همه رویدادها",
actor: "انجام‌دهنده",
allActors: "همه کاربران",
searchActors: "جست‌وجوی کاربران...",
ordering: "مرتب‌سازی",
newestFirst: "جدیدترین",
oldestFirst: "قدیمی‌ترین",
fromDate: "از تاریخ",
toDate: "تا تاریخ",
clear: "پاک کردن",
apply: "اعمال",
loadMore: "بارگذاری بیشتر",
totalLogs: "کل لاگ‌ها",
activeFilters: "فیلترهای فعال",
latestActivity: "آخرین فعالیت",
resultsCount: (count: number) => `${count} نتیجه`,
empty: "لاگ فعالیتی پیدا نشد",
emptyHint: "فیلترها را تغییر دهید یا منتظر فعالیت جدید بمانید.",
detailsTitle: "جزئیات فعالیت",
detailsHint: "برای بررسی دقیق تغییرات، یک مورد را انتخاب کنید.",
selectLogHint: "یک لاگ را برای مشاهده جزئیات انتخاب کنید.",
target: "هدف",
timestamp: "زمان",
remoteAddress: "آدرس شبکه",
previousValue: "مقدار قبلی",
currentValue: "مقدار جدید",
changesTitle: "تغییرات",
noDetails: "برای این رویداد جزئیات فیلدی در دسترس نیست.",
snapshot: "نمونه ذخیره‌شده",
unknownActor: "کاربر نامشخص",
summary: (actor: string, event: string, section: string, target: string) =>
`${actor} ${target} را در بخش ${section} ${event}`,
sections: {
workspace: "ورک‌اسپیس",
workspace_members: "اعضای ورک‌اسپیس",
clients: "مشتری‌ها",
projects: "پروژه‌ها",
tags: "تگ‌ها",
time_entries: "ورودی‌های زمان",
rates: "نرخ‌ها",
report_exports: "خروجی‌های گزارش",
},
events: {
create: "ایجاد کرد",
update: "ویرایش کرد",
delete: "حذف کرد",
restore: "بازیابی کرد",
archive: "بایگانی کرد",
unarchive: "از بایگانی خارج کرد",
activate: "فعال کرد",
deactivate: "غیرفعال کرد",
},
},
notifications: {
title: "اعلان‌ها",
pageDescription: "مرور همه اعلان‌ها و وضعیت خروجی‌های گزارش.",
open: "باز کردن اعلان‌ها",
empty: "هنوز اعلانی وجود ندارد.",
emptyUnread: "اعلان خوانده‌نشده‌ای وجود ندارد.",
loading: "در حال بارگذاری اعلان‌ها...",
loadingMore: "در حال بارگذاری بیشتر...",
loadMore: "بارگذاری بیشتر",
markAllRead: "خواندن همه",
viewAll: "نمایش همه اعلان‌ها",
totalLabel: "مجموع اعلان‌ها",
unreadLabel: "اعلان‌های خوانده‌نشده",
deleteLabel: "حذف اعلان",
markSeenError: "به‌روزرسانی اعلان با خطا مواجه شد.",
markAllError: "به‌روزرسانی اعلان‌ها با خطا مواجه شد.",
deleteError: "حذف اعلان با خطا مواجه شد.",
loadError: "دریافت اعلان‌ها با خطا مواجه شد.",
openError: "باز کردن اعلان با خطا مواجه شد.",
newTitle: "اعلان جدید",
openAction: "باز کردن",
summary: (total: number, unread: number) => `${total} کل، ${unread} خوانده‌نشده`,
workspaceMembershipAddedTitle: "به ورک‌اسپیس اضافه شدید",
workspaceMembershipAddedMessage: (actor: string, workspace: string, role: string) =>
`${actor} شما را با نقش ${role} به ${workspace} اضافه کرد.`,
workspaceMembershipRoleChangedTitle: "نقش شما در ورک‌اسپیس تغییر کرد",
workspaceMembershipRoleChangedMessage: (actor: string, workspace: string, previousRole: string, newRole: string) =>
`${actor} نقش شما را در ${workspace} از ${previousRole} به ${newRole} تغییر داد.`,
workspaceMembershipDeactivatedTitle: "دسترسی ورک‌اسپیس غیرفعال شد",
workspaceMembershipDeactivatedMessage: (actor: string, workspace: string) =>
`${actor} دسترسی شما به ${workspace} را غیرفعال کرد.`,
workspaceMembershipRemovedTitle: "از ورک‌اسپیس حذف شدید",
workspaceMembershipRemovedMessage: (actor: string, workspace: string) =>
`${actor} شما را از ${workspace} حذف کرد.`,
reportExportReadyTitle: "خروجی گزارش آماده است",
reportExportReadyMessage: (exportType: string, workspace: string, fileName?: string | null) =>
`خروجی ${exportType.toUpperCase()} گزارش ${workspace}${fileName ? ` با نام ${fileName}` : ""} آماده دانلود است.`,
reportExportFailedTitle: "خروجی گزارش ناموفق بود",
reportExportFailedMessage: (exportType: string, workspace: string) =>
`تولید خروجی ${exportType.toUpperCase()} گزارش ${workspace} با خطا مواجه شد.`,
},
}