2026-06-20 12:37:38 +03:30
{
"common" : {
2026-08-19 02:41:05 +03:30
"appName" : "Nudentic" ,
2026-06-20 14:51:43 +03:30
"loading" : "در حال بارگذاری..." ,
"loadingApp" : "در حال بارگذاری برنامه..." ,
"loadingWorkspace" : "در حال بارگذاری فضای کاری..." ,
"continue" : "ادامه" ,
"back" : "بازگشت" ,
"save" : "ذخیره" ,
"cancel" : "لغو" ,
"delete" : "حذف" ,
"edit" : "ویرایش" ,
"next" : "بعدی" ,
"dismiss" : "رد کردن" ,
"or" : "یا" ,
"and" : "و" ,
"close" : "بستن" ,
"redirecting" : "در حال انتقال..." ,
"readOnlyAccess" : "دسترسی فقط خواندنی برای این سازمان." ,
"errorGeneric" : "خطایی رخ داده است" ,
"loadingEllipsis" : "در حال بارگذاری..." ,
"search" : "جستجو" ,
"action" : "عملیات" ,
"status" : "وضعیت" ,
"name" : "نام" ,
"email" : "ایمیل" ,
"date" : "تاریخ" ,
"organization" : "سازمان" ,
"backToApp" : "← بازگشت به برنامه" ,
"copied" : "کپی شد" ,
"copyLink" : "کپی لینک" ,
"none" : "هیچکدام" ,
2026-07-11 17:10:02 +03:30
"preview" : "پیشنمایش" ,
"openMenu" : "باز کردن منو" ,
"closeMenu" : "بستن منو"
2026-06-20 12:37:38 +03:30
} ,
"language" : {
2026-06-20 14:51:43 +03:30
"label" : "زبان" ,
"selectLanguage" : "انتخاب زبان" ,
"en" : "انگلیسی" ,
"fa" : "فارسی" ,
"nl" : "هلندی"
2026-06-20 12:37:38 +03:30
} ,
"theme" : {
2026-06-20 14:51:43 +03:30
"switchToLight" : "تغییر به حالت روشن" ,
"switchToDark" : "تغییر به حالت تیره" ,
"lightMode" : "حالت روشن" ,
"darkMode" : "حالت تیره"
2026-06-20 12:37:38 +03:30
} ,
"nav" : {
2026-06-20 14:51:43 +03:30
"dashboard" : "داشبورد" ,
"staff" : "کارکنان" ,
"patients" : "بیماران" ,
"appointment" : "نوبتها" ,
"treatment" : "درمان" ,
2026-06-28 14:59:06 +03:30
"cases" : "پروندهها" ,
2026-06-28 22:56:56 +03:30
"tasks" : "وظایف" ,
2026-06-20 14:51:43 +03:30
"billing" : "صورتحساب" ,
"reports" : "گزارشها" ,
"clinics" : "کلینیکها" ,
"labs" : "لابراتوارها"
2026-06-20 12:37:38 +03:30
} ,
"auth" : {
2026-06-20 14:51:43 +03:30
"login" : "ورود" ,
"signIn" : "ورود به حساب" ,
"signOut" : "خروج" ,
"register" : "ثبتنام" ,
"startTrial" : "شروع دوره آزمایشی" ,
2026-07-11 17:10:02 +03:30
"startTrialShort" : "آزمایشی" ,
2026-06-20 14:51:43 +03:30
"startFreeTrial" : "شروع دوره آزمایشی رایگان" ,
"dashboard" : "داشبورد" ,
"signInTitle" : "به حساب کاربری خود وارد شوید" ,
"signInPrompt" : "یا {link}" ,
"startTrialLink" : "دوره آزمایشی رایگان خود را شروع کنید" ,
"registerTitle" : "دوره آزمایشی رایگان ۳۰ روزه خود را آغاز کنید" ,
"registerPrompt" : "از قبل حساب کاربری دارید؟" ,
"signInLink" : "وارد شوید" ,
"email" : "آدرس ایمیل" ,
"password" : "رمز عبور" ,
"confirmPassword" : "تأیید رمز عبور" ,
"fullName" : "نام و نام خانوادگی" ,
"rememberMe" : "مرا به خاطر بسپار" ,
2026-07-10 19:04:10 +03:30
"showPassword" : "نمایش رمز عبور" ,
"hidePassword" : "پنهان کردن رمز عبور" ,
2026-06-20 14:51:43 +03:30
"forgotPassword" : "رمز عبور خود را فراموش کردهاید؟" ,
"invalidCredentials" : "ایمیل یا رمز عبور نامعتبر است" ,
"loginFailed" : "ورود ناموفق بود" ,
"registrationFailed" : "ثبتنام ناموفق بود. لطفاً دوباره تلاش کنید." ,
"startMyFreeTrial" : "دوره آزمایشی رایگان من را شروع کن" ,
"trialIncludes" : "دوره آزمایشی شما شامل موارد زیر است:" ,
"trialTeamMembers" : "تا ۵ عضو تیم" ,
"trialFullAccess" : "دسترسی کامل به تمام امکانات" ,
"trialNoCard" : "۳۰ روز رایگان، بدون نیاز به کارت اعتباری" ,
"termsAgreement" : "با ثبتنام، شما با {terms} و {privacy} ما موافقت میکنید" ,
"termsOfService" : "شرایط استفاده از خدمات" ,
"privacyPolicy" : "سیاست حفظ حریم خصوصی" ,
"signedIn" : "وارد شدهاید" ,
"switchOrganization" : "تغییر سازمان" ,
"subscriptions" : "اشتراکها" ,
"account" : "حساب کاربری" ,
"emailPlaceholder" : "you@example.com" ,
"passwordPlaceholder" : "••••••••" ,
"namePlaceholder" : "John Doe" ,
"termsIntro" : "با ثبتنام، شما با" ,
"errorRegistrationFailed" : "ثبتنام ناموفق بود" ,
"errorLoginFailed" : "ورود ناموفق بود" ,
"errorCreateOrganization" : "ایجاد سازمان ناموفق بود" ,
"acceptInviteTitle" : "پذیرش دعوتنامه" ,
"loadingInvitation" : "در حال بارگذاری دعوتنامه..." ,
"invalidInvitationLink" : "لینک دعوتنامه نامعتبر است" ,
"invitationAlreadyAccepted" : "این دعوتنامه قبلاً پذیرفته شده است. اکنون میتوانید وارد شوید." ,
"errorLoadInvitation" : "بارگذاری دعوتنامه امکانپذیر نبود" ,
"organizationLabel" : "سازمان:" ,
"emailLabel" : "ایمیل:" ,
"nameRequired" : "نام الزامی است" ,
"passwordMinLength8" : "رمز عبور باید حداقل ۸ کاراکتر باشد" ,
"passwordsDoNotMatch" : "رمزهای عبور مطابقت ندارند" ,
"labelName" : "نام" ,
"labelCreatePassword" : "ایجاد رمز عبور" ,
"labelConfirmPassword" : "تأیید رمز عبور" ,
"activateAccount" : "فعالسازی حساب" ,
2026-08-19 00:39:31 +03:30
"invitationAcceptedRedirect" : "دعوتنامه پذیرفته شد. در حال ورود به فضای کاری..." ,
"invitationAcceptedSignInFailed" : "حساب فعال شد، اما ورود انجام نشد. لطفاً با رمز عبور خود وارد شوید." ,
2026-06-20 14:51:43 +03:30
"errorAcceptInvitation" : "پذیرش دعوتنامه امکانپذیر نبود" ,
"alreadyHaveAccess" : "از قبل دسترسی دارید؟" ,
"goToLogin" : "رفتن به ورود" ,
"acceptOrganizationTitle" : "پذیرش دعوتنامه سازمان" ,
"alreadyHaveAccount" : "از قبل حساب کاربری دارید؟" ,
"invitedBy" : "دعوتکننده:" ,
"ownerEmail" : "ایمیل مالک" ,
"activateOrganization" : "فعالسازی سازمان" ,
2026-08-19 00:39:31 +03:30
"organizationAcceptedRedirect" : "دعوتنامه پذیرفته شد. در حال ورود به فضای کاری..." ,
2026-06-20 14:51:43 +03:30
"stepAccount" : "حساب" ,
"stepOrganization" : "سازمان" ,
"organizationName" : "نام سازمان" ,
"organizationNamePlaceholder" : "کلینیک دندانپزشکی خورشید" ,
"organizationEmail" : "ایمیل سازمان" ,
"organizationEmailPlaceholder" : "contact@sunshineclinic.com" ,
"organizationType" : "نوع سازمان" ,
"dentalClinic" : "کلینیک دندانپزشکی" ,
2026-07-04 00:01:58 +03:30
"dentalLab" : "لابراتوار دندانپزشکی" ,
"mobile" : "شماره موبایل" ,
"mobilePlaceholder" : "۰۹۱۲ ۳۴۵ ۶۷۸۹" ,
"forgotPasswordTitle" : "بازیابی رمز عبور" ,
"forgotPasswordSubtitle" : "شماره موبایل ثبتشده در حساب خود را وارد کنید. کد تأیید برای شما ارسال میشود." ,
"codeSentHint" : "کد تأیید ارسالشده به موبایل خود را وارد کنید." ,
"sendCode" : "ارسال کد تأیید" ,
"verificationCode" : "کد تأیید" ,
"verificationCodePlaceholder" : "۱۲۳۴۵" ,
"verifyAndContinue" : "تأیید و ادامه" ,
"backToSignIn" : "بازگشت به ورود" ,
"codeSendFailed" : "ارسال کد تأیید انجام نشد. دوباره تلاش کنید." ,
"verifyFailed" : "کد تأیید نامعتبر یا منقضی شده است."
2026-06-20 12:37:38 +03:30
} ,
"landing" : {
2026-06-20 14:51:43 +03:30
"heroTitle" : "اتصال کلینیکها و لابراتوارهای دندانپزشکی" ,
"heroHighlight" : "بهصورت یکپارچه" ,
"heroSubtitle" : "ارتباط بین متخصصان دندانپزشکی را ساده و سریع کنید. با یک دوره آزمایشی رایگان ۳۰ روزه، بدون نیاز به کارت اعتباری، شروع کنید." ,
"featureClinicsTitle" : "برای کلینیکها" ,
"featureClinicsDescription" : "بیماران و نوبتها را مدیریت کنید و پروندهها را فوراً به لابراتوارها ارسال کنید." ,
"featureLabsTitle" : "برای لابراتوارها" ,
"featureLabsDescription" : "پروندهها را دریافت کنید، روند پیشرفت را پیگیری کنید و با کلینیکها در ارتباط باشید." ,
"featureTeamTitle" : "مدیریت تیم" ,
"featureTeamDescription" : "در طول دوره آزمایشی تا ۵ عضو تیم اضافه کنید. همگام با رشد خود مقیاسپذیر باشید." ,
"featureTrialTitle" : "دوره آزمایشی ۳۰ روزه" ,
"featureTrialDescription" : "دسترسی کامل به تمامی امکانات. بدون نیاز به کارت اعتباری." ,
"featureRealtimeTitle" : "بهروزرسانیهای لحظهای" ,
"featureRealtimeDescription" : "اعلانهای فوری درباره تغییر وضعیت پروندهها دریافت کنید." ,
"featureSecurityTitle" : "امن و منطبق با استانداردها" ,
"featureSecurityDescription" : "منطبق با HIPAA و دارای امنیت در سطح سازمانی." ,
2026-08-19 02:41:05 +03:30
"footerCopyright" : "© ۲۰۲۶ Nudentic. تمامی حقوق محفوظ است." ,
2026-06-20 14:51:43 +03:30
"termsAndConditions" : "شرایط و ضوابط"
2026-06-20 12:37:38 +03:30
} ,
"accountMenu" : {
2026-06-20 14:51:43 +03:30
"noActiveSubscription" : "اشتراک فعالی وجود ندارد — اشتراکها را بررسی کنید" ,
"trialEnded" : "دوره آزمایشی به پایان رسیده است — اشتراکها را بررسی کنید" ,
"trialEndingSoon" : "دوره آزمایشی بهزودی به پایان میرسد — اشتراکها را بررسی کنید" ,
"seatsLow" : "ظرفیت کاربران رو به اتمام است — اشتراکها را بررسی کنید" ,
"reviewSubscriptions" : "بررسی اشتراکها"
2026-06-20 12:37:38 +03:30
} ,
"validation" : {
2026-06-20 14:51:43 +03:30
"emailInvalid" : "لطفاً یک آدرس ایمیل معتبر وارد کنید" ,
"passwordRequired" : "رمز عبور الزامی است" ,
"nameMinLength" : "نام باید حداقل ۲ کاراکتر باشد" ,
"passwordMinLength" : "رمز عبور باید حداقل ۸ کاراکتر باشد" ,
"passwordUppercase" : "رمز عبور باید حداقل شامل یک حرف بزرگ باشد" ,
"passwordNumber" : "رمز عبور باید حداقل شامل یک عدد باشد" ,
"organizationNameMinLength" : "نام سازمان باید حداقل ۲ کاراکتر باشد" ,
"organizationEmailInvalid" : "لطفاً یک ایمیل سازمانی معتبر وارد کنید" ,
"organizationTypeRequired" : "لطفاً نوع سازمان را انتخاب کنید" ,
2026-07-04 00:01:58 +03:30
"passwordsDoNotMatch" : "رمزهای عبور مطابقت ندارند" ,
"mobileRequired" : "شماره موبایل الزامی است" ,
"mobileInvalid" : "لطفاً یک شماره موبایل ایرانی معتبر وارد کنید" ,
"codeRequired" : "کد تأیید الزامی است"
2026-06-20 14:51:43 +03:30
} ,
"today" : {
"welcomeBack" : "خوش آمدید!!" ,
"noSubscriptionNotice" : "این سازمان هنوز اشتراک فعالی ندارد." ,
"choosePlanLink" : "انتخاب طرح" ,
"noSubscriptionCta" : "برای شروع فرآیند خرید." ,
2026-07-11 00:07:48 +03:30
"noWidgets" : "هیچ معیاری برای دسترسی فعلی شما در دسترس نیست." ,
"loadError" : "بارگذاری معیارهای داشبورد ناموفق بود." ,
"seatsUnlimited" : "طرح نامحدود" ,
"widgetAppointmentsToday" : "نوبتهای امروز" ,
"widgetPatientsToday" : "بیماران امروز" ,
"widgetTreatmentsToday" : "درمانهای امروز" ,
"widgetDraftTreatments" : "درمانهای پیشنویس" ,
"widgetLabCasesPendingSend" : "پروندههای در انتظار ارسال" ,
"widgetCasesReceivedToday" : "پروندههای دریافتی امروز" ,
2026-07-11 03:12:56 +03:30
"widgetCasesInProgress" : "پروندههای در حال انجام" ,
2026-07-11 00:07:48 +03:30
"widgetTasksInProgress" : "وظایف در حال انجام" ,
"widgetImportantTasks" : "وظایف مهم" ,
2026-07-14 03:06:56 +03:30
"widgetOverdueCases" : "پروندههای معوق" ,
"widgetUnassignedTasks" : "وظایف بدون مسئول" ,
2026-07-11 00:07:48 +03:30
"widgetPendingConnections" : "درخواستهای اتصال در انتظار" ,
2026-07-11 03:12:56 +03:30
"widgetProvidersWithoutWorkingHours" : "ارائهدهندگان بدون ساعات کاری" ,
2026-07-11 00:34:38 +03:30
"widgetPendingStaffInvites" : "دعوتهای کارکنان در انتظار" ,
2026-07-11 22:32:37 +03:30
"widgetSubscription" : "اشتراک" ,
"subscriptionSeatsLabel" : "صندلیهای استفادهشده" ,
"subscriptionSeatsRemainingLabel" : "صندلی باقیمانده" ,
"subscriptionSeatsPercent" : "{percent}٪" ,
"subscriptionSeatsUnlimitedShort" : "نامحدود" ,
"subscriptionPeriodLabel" : "دوره اشتراک" ,
"subscriptionPeriodRemainingLabel" : "روز باقیمانده" ,
"subscriptionPeriodPercent" : "{percent}٪" ,
"subscriptionPeriodDays" : "{elapsed}/{total} روز" ,
"subscriptionNoPlan" : "اشتراک فعال نیست" ,
2026-07-19 00:37:59 +03:30
"chartAppointmentsWeekAllTitle" : "نوبتها" ,
2026-07-11 03:12:56 +03:30
"chartAppointmentsWeekAllSubtitle" : "همه ارائهدهندگان — ۷ روز گذشته" ,
2026-07-19 00:37:59 +03:30
"chartAppointmentsWeekMineTitle" : "نوبتهای من" ,
2026-07-11 03:12:56 +03:30
"chartAppointmentsWeekMineSubtitle" : "برنامه شما — ۷ روز گذشته" ,
"chartLabTaskActivityTitle" : "فعالیت وظایف آزمایشگاه" ,
"chartLabTaskActivitySubtitle" : "۷ روز گذشته" ,
"chartLabTaskCompletedLegend" : "تکمیلشده" ,
"chartLabTaskReceivedLegend" : "دریافتشده" ,
"chartAppointmentsByProviderTitle" : "نوبتها بر اساس ارائهدهنده" ,
"chartAppointmentsByProviderSubtitle" : "امروز" ,
2026-07-11 00:34:38 +03:30
"chartTreatmentMixTitle" : "ترکیب درمانها" ,
"chartTreatmentMixSubtitle" : "۷ روز گذشته" ,
2026-07-11 03:12:56 +03:30
"chartCaseCompletionTitle" : "تکمیل پروندهها" ,
"chartCaseCompletionSubtitle" : "همه پروندههای فعال" ,
"chartCaseCompletionPercent" : "{percent}٪" ,
"chartCaseCompletionTasks" : "وظایف تکمیلشده" ,
2026-07-12 02:08:54 +03:30
"chartTreatmentPlanCompletionTitle" : "تکمیل طرح درمان" ,
"chartTreatmentPlanCompletionSubtitle" : "همه نوبتها" ,
"chartTreatmentPlanCompletionRatio" : "دارای طرح درمان" ,
2026-07-12 00:28:43 +03:30
"chartTasksByProsthesisTitle" : "وظایف در حال انجام بر اساس پروتز" ,
"chartTasksByProsthesisSubtitle" : "ترکیب بار کاری فعلی" ,
2026-07-19 00:37:59 +03:30
"chartCasesDueWeekTitle" : "پروندههای موعددار" ,
2026-07-14 03:06:56 +03:30
"chartCasesDueWeekSubtitle" : "پروندههای فعال با موعد تحویل در ۷ روز آینده" ,
2026-07-12 02:08:54 +03:30
"chartCasePartnersClinicTitle" : "کیسها بر اساس لابراتوار" ,
"chartCasePartnersLabTitle" : "کیسها بر اساس کلینیک" ,
"chartCasePartnersSubtitle" : "۳۰ روز گذشته" ,
"chartCasePartnersSentLegend" : "ارسالشده" ,
"chartCasePartnersOpenLegend" : "در حال انجام" ,
2026-07-11 22:32:37 +03:30
"chartEfficiencyReportTitle" : "گزارش کارایی" ,
"chartEfficiencyReportSubtitleClinic" : "درمانهای ثبتشده توسط کارکنان — ۳۰ روز گذشته" ,
"chartEfficiencyReportSubtitleLab" : "وظایف تکمیلشده توسط کارکنان — ۳۰ روز گذشته" ,
2026-07-11 00:48:35 +03:30
"chartEmpty" : "هنوز دادهای برای این بازه وجود ندارد." ,
2026-07-19 00:37:59 +03:30
"periodWeek" : "هفته" ,
"periodMonth" : "ماه" ,
"periodYear" : "سال" ,
"periodSelectAria" : "بازه زمانی نمودار" ,
2026-07-11 00:48:35 +03:30
"upcomingAppointmentsTitle" : "نوبتهای پیش رو" ,
"upcomingAppointmentsSubtitle" : "نوبتهای باقیمانده امروز" ,
"viewAllAppointments" : "مشاهده برنامه" ,
2026-07-11 00:53:40 +03:30
"noUpcomingAppointments" : "نوبت پیشرویی برای باقی امروز وجود ندارد." ,
"retryLoad" : "تلاش مجدد" ,
"sectionLoadError" : "نمایش این بخش ممکن نشد." ,
"lastUpdated" : "بهروزرسانی در {time}"
2026-06-20 14:51:43 +03:30
} ,
"staff" : {
"redirecting" : "در حال انتقال..." ,
"title" : "مدیریت کارکنان" ,
"subtitle" : "از همکاران خود دعوت کنید، دسترسی به برگهها را تنظیم کنید و در محدوده طرح خود باقی بمانید." ,
"inviteMember" : "دعوت از عضو" ,
"seatsLabel" : "مجوزها:" ,
"unlimitedPlan" : "(طرح نامحدود)" ,
"seatLimitReached" : "ظرفیت مجوزهای طرح برای این سازمان تکمیل شده است." ,
"noActivePlan" : "هیچ طرح فعالی برای این سازمان انتخاب نشده است. برای دعوت از اعضا، یک طرح اشتراک انتخاب کنید." ,
"invitedPending" : "دعوتنامه تا زمانی که لینک را باز کنند، رمز عبور تنظیم کنند و وارد شوند، در حالت انتظار است." ,
"invitedAccepted" : "دعوتنامه بلافاصله پذیرفته شد." ,
"inviteLinkHeading" : "لینک دعوت" ,
"shareLinkHint" : "این لینک را به صورت دستی از طریق پیامک یا ایمیل به اشتراک بگذارید. در صورت منقضی شدن یا گم شدن لینک قبلی، لینک جدیدی تولید میشود." ,
"loadingTeam" : "در حال بارگذاری تیم..." ,
"tableName" : "نام" ,
"tableEmail" : "ایمیل" ,
"tableRole" : "نقش" ,
"tableStatus" : "وضعیت" ,
"tableAccess" : "دسترسی" ,
"tableAction" : "عملیات" ,
"roleOwner" : "مالک" ,
"roleStaff" : "کارمند" ,
"statusActive" : "فعال" ,
"statusPending" : "در انتظار" ,
"statusDisabled" : "غیرفعال" ,
"statusExpired" : "منقضی شده" ,
"allFeatures" : "همه امکانات" ,
"inviteModalTitle" : "دعوت از عضو تیم" ,
"stepOf" : "مرحله {step} از ۲" ,
"permissionView" : "نمایش" ,
"permissionEdit" : "ویرایش" ,
"labelEmail" : "ایمیل" ,
"labelDisplayName" : "نام نمایشی" ,
"tabAccess" : "دسترسی به برگهها" ,
"sendInvite" : "ارسال دعوتنامه" ,
"skipForNow" : "فعلاً رد کردن" ,
"enableModalTitle" : "فعالسازی عضو تیم" ,
"enableConfirm" : "{name} ({email}) فعال شود؟" ,
"enableBullet1" : "آنها میتوانند دوباره با حساب موجود خود وارد این سازمان شوند." ,
"enableBullet2" : "هیچ دعوتنامه جدیدی ارسال نمیشود و در زمان غیرفعال بودن هیچ دادهای حذف نشده است." ,
"enableBullet3" : "فعالسازی از یک مجوز در طرح شما استفاده میکند." ,
"noSeatsAvailable" : "هیچ مجوزی در دسترس نیست. قبل از فعالسازی این شخص، عضو دیگری را غیرفعال کنید یا طرح خود را ارتقا دهید." ,
"enableMemberButton" : "فعالسازی عضو" ,
"disableModalTitle" : "غیرفعالسازی عضو تیم" ,
"disableConfirm" : "{name} ({email}) غیرفعال شود؟" ,
"disableBullet1" : "آنها نمیتوانند وارد این سازمان شوند." ,
"disableBullet2" : "هیچ دادهای حذف نمیشود." ,
"disableBullet3" : "غیرفعالسازی یک مجوز در طرح شما را آزاد میکند تا بتوانید شخص دیگری را دعوت کنید." ,
"disableMemberButton" : "غیرفعالسازی عضو" ,
"editModalTitle" : "ویرایش عضو" ,
"loadingWorkingHours" : "در حال بارگذاری ساعات کاری..." ,
"errorLoadStaff" : "بارگذاری کارکنان ناموفق بود." ,
"errorCopyInvite" : "کپی لینک دعوتنامه امکانپذیر نبود." ,
"errorSendInvite" : "ارسال دعوتنامه ناموفق بود." ,
"errorLoadWorkingHours" : "بارگذاری ساعات کاری ناموفق بود." ,
"successMemberUpdated" : "عضو بهروزرسانی شد." ,
"errorUpdateMember" : "بهروزرسانی عضو ناموفق بود." ,
"errorDeleteNotImplemented" : "حذف هنوز پیادهسازی نشده است." ,
"successMemberDisabled" : "{name} غیرفعال شد. یک مجوز در دسترس قرار گرفت." ,
"errorDisableMember" : "غیرفعالسازی عضو ناموفق بود." ,
"successMemberEnabled" : "{name} فعال شد و میتواند دوباره وارد شود." ,
"errorEnableMember" : "فعالسازی عضو ناموفق بود." ,
"successInvited" : "{name} ({email}) دعوت شد." ,
"copyInviteLink" : "کپی لینک دعوتنامه" ,
"copyInviteLinkTitle" : "کپی لینک دعوتنامه (در صورت نیاز لینک جدیدی تولید میکند)" ,
"enableMemberAria" : "فعالسازی عضو" ,
"enableMemberTitle" : "فعالسازی عضو (از یک مجوز استفاده میکند)" ,
"disableMemberAria" : "غیرفعالسازی عضو" ,
"disableMemberTitle" : "غیرفعالسازی عضو (یک مجوز را آزاد میکند)" ,
"editMemberAria" : "ویرایش عضو" ,
"deleteMemberAria" : "حذف عضو" ,
"deleteMemberTitle" : "حذف عضو (پیادهسازی نشده)" ,
"features" : {
"featureToday" : "امروز" ,
"featureStaff" : "کارکنان" ,
"featureOrganizations" : "سازمانها" ,
"featureClinics" : "کلینیکها" ,
"featureLabs" : "لابراتوارها" ,
"featurePatients" : "بیماران" ,
"featureAppointment" : "نوبتها" ,
"featureTreatment" : "درمان" ,
2026-06-28 14:59:06 +03:30
"featureCases" : "پروندهها" ,
2026-06-28 22:56:56 +03:30
"featureTasks" : "وظایف" ,
2026-06-20 14:51:43 +03:30
"featureBilling" : "صورتحساب" ,
"featureReports" : "گزارشها" ,
"noTabAccess" : "دسترسی به برگهها وجود ندارد" ,
"readOnlySuffix" : "(فقط خواندنی)"
} ,
"workingHours" : {
"recommendedTitle" : "ساعات کاری توصیه میشود" ,
"recommendedBody" : "کارکنانی که دسترسی ویرایش درمان دارند، به عنوان ستونهای ارائهدهنده در نوبتها ظاهر میشوند. ساعات هفتگی آنها را تنظیم کنید تا جدول زمانبندی زمانهای قابل رزرو صحیح را نشان دهد." ,
"intro" : "ساعات کاری هفتگی این ارائهدهنده را تنظیم کنید. جدول نوبتها از این ساعات برای نمایش زمانهای قابل رزرو استفاده میکند." ,
"workingDay" : "روز کاری" ,
"start" : "شروع" ,
"end" : "پایان" ,
"removeShift" : "حذف شیفت" ,
"addShift" : "افزودن شیفت" ,
"autoRepeatWeekly" : "این ساعات را در ابتدای هر هفته تکرار کنید (کپی به جلو در روز دوشنبه)" ,
"weekdayMon" : "دوشنبه" ,
"weekdayTue" : "سهشنبه" ,
"weekdayWed" : "چهارشنبه" ,
"weekdayThu" : "پنجشنبه" ,
"weekdayFri" : "جمعه" ,
"weekdaySat" : "شنبه" ,
"weekdaySun" : "یکشنبه" ,
"validationNeedsShift" : "{day} حداقل به یک شیفت نیاز دارد یا باید به عنوان تعطیل علامتگذاری شود." ,
"validationEndAfterStart" : "زمان پایان شیفت {day} باید بعد از زمان شروع باشد." ,
"validationOverlap" : "شیفتهای {day} نمیتوانند همپوشانی داشته باشند."
}
} ,
"patients" : {
"title" : "بیماران" ,
"newPatient" : "بیمار جدید" ,
"errorLoadPatients" : "بارگذاری بیماران ناموفق بود." ,
"successPatientSaved" : "بیمار {firstName} {lastName} با موفقیت ذخیره شد." ,
"errorSavePatient" : "ذخیره بیمار ناموفق بود." ,
"firstName" : "نام" ,
"lastName" : "نام خانوادگی" ,
2026-06-28 14:49:37 +03:30
"mobile" : "موبایل" ,
"mobilePlaceholder" : "09121234567" ,
"mobileLabel" : "موبایل:" ,
"patientAlreadyExists" : "بیماری با این شماره موبایل از قبل وجود دارد: {firstName} {lastName}. برای شما انتخاب شد." ,
2026-06-20 14:51:43 +03:30
"savePatient" : "ذخیره بیمار" ,
"dialogTitle" : "بیمار جدید" ,
2026-06-28 14:49:37 +03:30
"searchPlaceholder" : "جستجوی بیماران بر اساس نام، موبایل، ایمیل" ,
2026-06-20 14:51:43 +03:30
"loadingPatients" : "در حال بارگذاری بیماران..." ,
"noResults" : "هیچ بیماری برای این جستجو یافت نشد." ,
"noContact" : "بدون اطلاعات تماس" ,
"selectPatient" : "برای مشاهده جزئیات، یک بیمار را انتخاب کنید." ,
"emailLabel" : "ایمیل:" ,
"statusLabel" : "وضعیت:" ,
"statusActive" : "فعال" ,
"statusInactive" : "غیرفعال" ,
2026-07-12 18:56:01 +03:30
"emptyValue" : "-" ,
"requiredMark" : "*" ,
"requiredFieldsHint" : "فیلدهای دارای * الزامی هستند. ایمیل اختیاری است." ,
"firstNameRequired" : "نام الزامی است." ,
"lastNameRequired" : "نام خانوادگی الزامی است." ,
"emailOptional" : "ایمیل (اختیاری)" ,
"emailOptionalSummary" : "ایمیل (اختیاری):" ,
"appointmentHistoryTitle" : "سوابق نوبت" ,
"appointmentHistorySubtitle" : "نوبتهای گذشته و آینده این بیمار در کلینیک شما." ,
"appointmentHistoryLoading" : "در حال بارگذاری سوابق نوبت…" ,
"appointmentHistoryEmpty" : "هنوز نوبتی برای این بیمار ثبت نشده است." ,
"appointmentHistoryError" : "بارگذاری سوابق نوبت انجام نشد." ,
"appointmentHistoryProvider" : "ارائهدهنده: {name}" ,
"appointmentHistoryUnknownProvider" : "ارائهدهنده نامشخص"
2026-06-20 14:51:43 +03:30
} ,
2026-06-28 14:59:06 +03:30
"cases" : {
"title" : "پروندهها" ,
2026-07-07 15:31:09 +03:30
"subtitle" : "پروندههای ارسالی از کلینیکهای متصل. پیشرفت را پیگیری کنید و وظایف مهم را علامت بزنید." ,
2026-06-28 16:46:42 +03:30
"searchPlaceholder" : "جستجو با نام یا موبایل بیمار…" ,
"emptyList" : "هنوز پروندهای دریافت نشده است." ,
"selectCaseHint" : "برای مشاهده وظایف، یک پرونده از فهرست انتخاب کنید." ,
"fromClinic" : "از {name}" ,
"sentAt" : "ارسال {date}" ,
2026-07-13 16:30:36 +03:30
"dueDateLabel" : "موعد {date}" ,
"overdueBadge" : "عقبافتاده" ,
2026-06-28 16:46:42 +03:30
"taskProgressLabel" : "وظایف: {completed} از {total} انجام شده" ,
"taskProgressShort" : "{progress} وظیفه" ,
"treatmentDetails" : "جزئیات درمان" ,
"teethLabel" : "دندانها" ,
2026-07-07 15:31:09 +03:30
"tasksByTooth" : "وظایف" ,
"toothGroupTitle" : "دندانهای {teeth} · {prosthesis}" ,
2026-06-28 16:46:42 +03:30
"noTasks" : "برای این پرونده وظیفهای ایجاد نشده است." ,
"statusInProgress" : "در حال انجام" ,
"statusCompleted" : "انجام شده" ,
2026-07-07 15:31:09 +03:30
"importantLabel" : "مهم" ,
2026-07-13 17:44:44 +03:30
"unreadCase" : "بهروزرسانیهای خواندهنشده" ,
2026-07-18 22:00:44 +03:30
"markCaseImportant" : "پرونده مهم" ,
2026-07-07 15:31:09 +03:30
"markImportant" : "علامتگذاری به عنوان مهم" ,
"lastUpdatedBy" : "بهروزرسانی توسط {name}" ,
"lastUpdatedUnknown" : "هنوز شروع نشده" ,
"timelineTitle" : "تاریخچه" ,
"timelineEntry" : "{status} · {name} · {date}" ,
2026-06-28 16:46:42 +03:30
"errorLoadList" : "بارگذاری پروندهها ناموفق بود." ,
"errorLoadDetail" : "بارگذاری جزئیات پرونده ناموفق بود." ,
2026-06-28 17:49:40 +03:30
"errorUpdateTask" : "بهروزرسانی وظیفه ناموفق بود." ,
2026-07-13 15:47:32 +03:30
"errorAssignTask" : "واگذاری وظیفه ناموفق بود." ,
"assigneeLabel" : "واگذار شده به" ,
"assigneeUnassigned" : "واگذار نشده" ,
"assignedTo" : "واگذار شده به {name}" ,
2026-06-28 17:49:40 +03:30
"filterClinic" : "کلینیک" ,
"filterClinicAll" : "همه کلینیکها" ,
2026-07-14 03:06:56 +03:30
"filterProsthesisType" : "نوع پروتز" ,
"filterProsthesisTypeAll" : "همه انواع" ,
2026-06-28 17:49:40 +03:30
"filterSentFrom" : "ارسال از" ,
"filterSentTo" : "ارسال تا" ,
"clearFilters" : "پاک کردن فیلترها" ,
"patientMobile" : "موبایل" ,
2026-07-07 17:14:31 +03:30
"showComments" : "نظرات" ,
"commentsCount" : "نظرات ({count})" ,
2026-07-07 18:43:10 +03:30
"latestAttachment" : "آخرین فایل" ,
2026-07-08 02:53:47 +03:30
"viewAttachments" : "مشاهده همه پیوستها" ,
"attachmentsDialogTitle" : "پیوستهای پرونده" ,
"attachmentsDialogSubtitle" : "پیشنمایش و دانلود فایلهای بهاشتراکگذاشتهشده با این پرونده." ,
"noAttachments" : "هیچ پیوستی با این پرونده بهاشتراک گذاشته نشده است." ,
"downloadAttachment" : "دانلود" ,
"downloadAllAttachments" : "دانلود همه" ,
"attachmentPreviewUnavailable" : "پیشنمایش در دسترس نیست" ,
2026-06-28 17:49:40 +03:30
"prevPage" : "قبلی" ,
"nextPage" : "بعدی" ,
2026-06-28 22:56:56 +03:30
"pageSummary" : "صفحه {page} از {totalPages} ({total} پرونده)" ,
2026-07-14 21:07:05 +03:30
"statusLabel" : "وضعیت" ,
"viewShareQr" : "مشاهده QR و لینک اشتراکگذاری پرونده" ,
"shareQrDialogTitle" : "لینک اشتراکگذاری پرونده" ,
"shareQrDialogSubtitle" : "QR را اسکن کنید یا لینک را کپی کنید تا وظایف این پرونده باز شود." ,
"copyShareLink" : "کپی لینک" ,
"shareLinkCopied" : "لینک در کلیپبورد کپی شد" ,
2026-07-18 22:00:44 +03:30
"shareQrUnavailable" : "پیشنمایش QR در دسترس نیست" ,
"downloadCaseSheet" : "دانلود PDF" ,
"caseSheetTitle" : "برگه پرونده" ,
"caseSheetOrderNumber" : "شماره سفارش" ,
"caseSheetOrderDate" : "تاریخ سفارش" ,
"caseSheetDateDue" : "موعد تحویل" ,
"caseSheetSender" : "فرستنده" ,
"caseSheetRecipient" : "گیرنده" ,
"caseSheetPatient" : "بیمار" ,
"caseSheetPatientId" : "موبایل" ,
"caseSheetProsthesis" : "پروتز" ,
"caseSheetToothChart" : "نمودار دندان" ,
"caseSheetComments" : "توضیحات" ,
"caseSheetNoComments" : "بدون توضیحات." ,
"errorDownloadCaseSheet" : "دانلود PDF برگه پرونده ممکن نشد." ,
"externalCodePlaceholder" : "کد خارجی مثلاً کد exocad" ,
2026-08-19 15:05:58 +03:30
"errorUpdateExternalCode" : "ذخیره کد خارجی ممکن نشد." ,
"addCase" : "افزودن پرونده" ,
"addCaseTitle" : "پرونده جدید" ,
"addCaseSubtitle" : "کلینیک ارجاعدهنده یا بیمار را وارد کنید و خطوط پروتز را اضافه کنید. وقتی آماده بود، شروع کنید." ,
"startCase" : "شروع" ,
"draftBadge" : "پیشنویس" ,
2026-08-19 16:07:32 +03:30
"receivedBadge" : "دریافتی" ,
"generatedBadge" : "ایجادشده" ,
2026-08-19 15:05:58 +03:30
"referringClinic" : "کلینیک ارجاعدهنده" ,
"referringDentist" : "دندانپزشک" ,
"patientName" : "نام بیمار" ,
"partnerClinic" : "کلینیک متصل" ,
"partnerClinicNone" : "هیچکدام" ,
"dueDateField" : "موعد" ,
"caseLinesTitle" : "خطوط کار" ,
"addLine" : "افزودن خط" ,
"lineChip" : "خط {n}" ,
"removeLineAria" : "حذف خط {n}" ,
"errorCreateCase" : "ایجاد پرونده ممکن نشد." ,
"errorSaveCase" : "ذخیره پرونده ممکن نشد." ,
2026-08-19 23:59:37 +03:30
"errorStartCase" : "شروع پرونده ممکن نشد." ,
"confirmDeleteDraftCase" : "این پیشنویس پرونده حذف شود؟ این کار قابل بازگشت نیست." ,
"errorDeleteCase" : "حذف پرونده ممکن نشد."
2026-07-14 21:07:05 +03:30
} ,
"labCaseAccess" : {
"pageTitle" : "وظایف پرونده" ,
"loading" : "در حال بارگذاری پرونده…" ,
"accessDeniedTitle" : "دسترسی مجاز نیست" ,
"accessDenied" : "اجازه مشاهده این پرونده را ندارید. با حساب لاب یا کلینیک دارای دسترسی وارد شوید و برای دسترسی کلینیک، ارائهدهنده همان درمان باشید." ,
"emptyTasks" : "وظیفهای برای این پرونده یافت نشد." ,
"caseSummary" : "{clinic} · {patient}" ,
"labName" : "لاب: {name}"
2026-06-28 22:56:56 +03:30
} ,
"tasks" : {
"title" : "وظایف" ,
2026-07-07 15:31:09 +03:30
"subtitle" : "همه وظایف لاب از کلینیکهای متصل. فیلتر، مرتبسازی و بهروزرسانی وضعیت هر مرحله." ,
"subtitleOwner" : "همه وظایف لاب از کلینیکهای متصل. فیلتر، مرتبسازی و بهروزرسانی وضعیت هر مرحله." ,
2026-06-28 22:56:56 +03:30
"loading" : "در حال بارگذاری وظایف…" ,
2026-07-07 15:31:09 +03:30
"emptyList" : "هیچ وظیفهای با فیلترهای فعلی مطابقت ندارد." ,
"emptyListOwner" : "هیچ وظیفهای با فیلترهای فعلی مطابقت ندارد." ,
2026-06-28 22:56:56 +03:30
"noPermissionTitle" : "وظایف" ,
"noPermissionBody" : "شما مجوز مشاهده وظایف برای این سازمان را ندارید." ,
"fromClinic" : "از {name}" ,
"patientLabel" : "بیمار" ,
"taskDate" : "{date}" ,
2026-07-07 15:31:09 +03:30
"teethLabel" : "دندانهای {teeth}" ,
"importantBadge" : "مهم" ,
"lastUpdatedBy" : "بهروزرسانی توسط {name}" ,
2026-06-28 22:56:56 +03:30
"statusInProgress" : "در حال انجام" ,
"statusCompleted" : "تکمیلشده" ,
2026-07-07 15:31:09 +03:30
"searchPlaceholder" : "جستجوی بیمار یا کلینیک…" ,
"filterClinic" : "کلینیک" ,
"filterClinicAll" : "همه کلینیکها" ,
2026-08-19 16:07:32 +03:30
"filterOrigin" : "منبع پرونده" ,
"filterOriginAll" : "همه منابع" ,
"filterOriginReceived" : "دریافتی" ,
"filterOriginGenerated" : "ایجادشده" ,
2026-07-07 15:31:09 +03:30
"filterStatus" : "وضعیت" ,
"filterStatusAll" : "همه وضعیتها" ,
2026-07-13 02:09:49 +03:30
"filterStepCompleted" : "مرحله تکمیلشده" ,
"filterStepCompletedAll" : "هر مرحلهای" ,
2026-07-07 15:31:09 +03:30
"showCompleted" : "نمایش تکمیلشدهها" ,
2026-07-13 13:22:38 +03:30
"importantOnly" : "مهمها در ابتدا" ,
2026-07-13 15:47:32 +03:30
"assignedToMe" : "واگذار شده به من" ,
2026-07-13 16:30:36 +03:30
"overdueOnly" : "فقط پروندههای عقبافتاده" ,
2026-07-14 03:06:56 +03:30
"unassignedOnly" : "فقط بدون مسئول" ,
2026-07-13 15:47:32 +03:30
"assignedToStaff" : "واگذار شده به {name}" ,
2026-07-13 13:22:38 +03:30
"resetView" : "بازنشانی فیلترها و مرتبسازی" ,
"showInCase" : "نمایش در پرونده" ,
"showInCaseNotFound" : "این کار در فهرست پیشفرض در حال انجام نیست." ,
"showInCaseError" : "یافتن این کار در فهرست ممکن نشد." ,
"locatingCase" : "در حال یافتن پرونده در فهرست…" ,
"taskCompletedToast" : "مرحله تکمیل شد — آفرین!" ,
"taskCompletedFlash" : "انجام شد" ,
2026-07-07 15:31:09 +03:30
"filterSentFrom" : "از" ,
"filterSentTo" : "تا" ,
"sortBy" : "مرتبسازی بر اساس" ,
"sortDate" : "تاریخ" ,
2026-07-13 16:30:36 +03:30
"sortDueDate" : "موعد پرونده" ,
2026-07-07 15:31:09 +03:30
"sortStatus" : "وضعیت" ,
"sortClinic" : "کلینیک" ,
"sortPatient" : "بیمار" ,
"sortImportant" : "مهم" ,
2026-07-08 02:53:47 +03:30
"sortProsthesis" : "نوع پروتز" ,
"sortTaskType" : "نوع کار" ,
2026-07-07 17:14:31 +03:30
"sortDirection" : "جهت مرتبسازی" ,
2026-07-13 02:09:49 +03:30
"groupingOffClinic" : "مرتبسازی بر اساس کلینیک — گروهبندی پرونده غیرفعال است." ,
"groupingOffPatient" : "مرتبسازی بر اساس بیمار — گروهبندی پرونده غیرفعال است." ,
"groupingOffProsthesis" : "مرتبسازی بر اساس نوع پروتز — گروهبندی پرونده غیرفعال است." ,
"groupingOffTaskType" : "مرتبسازی بر اساس نوع کار — گروهبندی پرونده غیرفعال است." ,
"groupingOffStatus" : "مرتبسازی بر اساس وضعیت — گروهبندی پرونده غیرفعال است." ,
2026-07-13 16:30:36 +03:30
"groupingOffDueDate" : "مرتبسازی بر اساس موعد — گروهبندی پرونده غیرفعال است." ,
2026-07-13 02:09:49 +03:30
"caseReceivedAt" : "دریافت {date}" ,
2026-07-13 16:30:36 +03:30
"caseDueDate" : "موعد {date}" ,
"overdueBadge" : "عقبافتاده" ,
2026-07-13 02:09:49 +03:30
"caseTaskProgress" : "{completed}/{total} کار در این صفحه" ,
2026-07-07 15:31:09 +03:30
"clearFilters" : "پاک کردن فیلترها" ,
"commentsButton" : "نظرات" ,
2026-06-28 22:56:56 +03:30
"errorLoadList" : "بارگذاری وظایف ناموفق بود." ,
"errorUpdateTask" : "بهروزرسانی وظیفه ناموفق بود." ,
"pageSummary" : "صفحه {page} از {totalPages} ({total} وظیفه)"
2026-06-28 14:59:06 +03:30
} ,
2026-07-07 15:31:09 +03:30
"caseComments" : {
"title" : "نظرات" ,
"placeholder" : "یک نظر بنویسید…" ,
"reply" : "پاسخ…" ,
"post" : "ثبت" ,
"empty" : "هنوز نظری ثبت نشده است." ,
"visibleToClinicToggle" : "قابل مشاهده برای کلینیک" ,
"clinicCanSee" : "کلینیک میتواند ببیند" ,
"hiddenFromClinic" : "پنهان از کلینیک" ,
"makeVisible" : "نمایش به کلینیک" ,
"makeHidden" : "پنهان از کلینیک" ,
"labAuthor" : "آزمایشگاه" ,
"clinicAuthor" : "کلینیک" ,
"errorLoad" : "بارگذاری نظرات ناموفق بود." ,
"errorPost" : "ثبت نظر ناموفق بود." ,
2026-07-08 02:53:47 +03:30
"errorToggle" : "بهروزرسانی وضعیت نمایش نظر ناموفق بود." ,
"send" : "ارسال نظر" ,
"composerVisible" : "قابل مشاهده برای کلینیک" ,
"composerHidden" : "پنهان از کلینیک"
2026-07-07 15:31:09 +03:30
} ,
2026-06-20 14:51:43 +03:30
"appointments" : {
"title" : "نوبتها" ,
"subtitle" : "یک بیمار را جستجو کنید، تاریخ را انتخاب کنید، سپس روی یک زمان در زیر ارائهدهنده کلیک کنید تا رزرو کنید." ,
"loadingSchedule" : "در حال بارگذاری برنامه..." ,
"infoPastViewOnly" : "نوبتهای گذشته فقط قابل مشاهده هستند." ,
2026-07-17 11:21:08 +03:30
"infoEditBlockedHasTreatment" : "این نوبت قابل ویرایش نیست چون یک درمان به آن متصل است." ,
2026-06-20 14:51:43 +03:30
"infoSelectPatient" : "قبل از رزرو، یک بیمار را انتخاب کنید." ,
"errorOutsideHours" : "این نوبت خارج از ساعات کاری فعلی ارائهدهنده است و قابل ویرایش نیست." ,
"successUpdated" : "نوبت بهروزرسانی شد." ,
"successSaved" : "نوبت ذخیره شد." ,
"errorUpdate" : "بهروزرسانی نوبت امکانپذیر نبود." ,
"errorSave" : "ذخیره نوبت امکانپذیر نبود." ,
"confirmRemove" : "این نوبت حذف شود؟" ,
"successRemoved" : "نوبت حذف شد." ,
"errorDelete" : "حذف نوبت امکانپذیر نبود." ,
2026-07-16 22:35:02 +03:30
"deleteBlockedHint" : "بهدلیل وجود درمان مرتبط با این نوبت، امکان حذف آن وجود ندارد." ,
2026-06-20 14:51:43 +03:30
"errorLoadSchedule" : "بارگذاری برنامه ناموفق بود." ,
"successPatientSaved" : "بیمار {firstName} {lastName} ذخیره شد." ,
"searchPlaceholder" : "جستجوی بیماران موجود" ,
"searching" : "در حال جستجو..." ,
"searchHint" : "برای جستجوی بیماران بر اساس نام، تلفن یا ایمیل، تایپ کنید." ,
"noPermissionAdd" : "شما مجوز اضافه کردن بیمار را ندارید." ,
"editTitle" : "ویرایش نوبت" ,
"newTitle" : "نوبت جدید" ,
"providerLabel" : "ارائهدهنده:" ,
"patientLabel" : "بیمار" ,
"startLabel" : "شروع" ,
"endLabel" : "پایان" ,
"purposeLabel" : "هدف" ,
"errorSelectPatient" : "ابتدا یک بیمار را انتخاب کنید." ,
2026-07-12 22:07:11 +03:30
"patientSearchPlaceholder" : "جستجوی بیمار بر اساس نام، تلفن یا ایمیل" ,
"patientSearchEmpty" : "بیماری با این جستجو یافت نشد." ,
"patientLockedHint" : "بهدلیل وجود درمان مرتبط با این نوبت، امکان تغییر بیمار وجود ندارد." ,
2026-06-20 14:51:43 +03:30
"errorEndAfterStart" : "زمان پایان باید بعد از زمان شروع باشد." ,
"errorPastSchedule" : "نمیتوان در گذشته زمانبندی کرد." ,
"errorPastViewOnly" : "نوبتهای گذشته فقط قابل مشاهده هستند." ,
"errorMissingDetails" : "جزئیات نوبت وجود ندارد." ,
"noProviders" : "هیچ ارائهدهندهای در دسترس نیست. برای مشاهده ستونها در اینجا، کارکنانی با دسترسی ویرایش درمان اضافه کنید." ,
"noWorkingHours" : "ساعات کاری برای این روز پیکربندی نشده است. ساعات کاری ارائهدهنده را در مدیریت کارکنان تنظیم کنید." ,
"noHoursSet" : "ساعتی تنظیم نشده" ,
"offToday" : "امروز تعطیل است" ,
"slotOffToday" : "ارائهدهنده امروز تعطیل است" ,
"slotHoursNotConfigured" : "ساعات کاری پیکربندی نشده است" ,
"slotOutsideHours" : "خارج از ساعات کاری" ,
"slotCannotCreate" : "شما نمیتوانید نوبت ایجاد کنید" ,
"slotBookAt" : "رزرو {time}" ,
"outsideHoursBlocked" : "خارج از ساعات کاری — ویرایش مسدود شده است" ,
"overlappingChoose" : "{count} همپوشانی — برای انتخاب کلیک کنید" ,
"overlapping" : "{count} همپوشانی" ,
"legend" : "راهنما" ,
"overlappingTitle" : "نوبتهای همپوشانی ({count})" ,
"purposeConsultation" : "مشاوره" ,
"purposeFilling" : "پر کردن" ,
"purposeEndo" : "درمان ریشه" ,
"purposeVisit" : "ویزیت" ,
"purposeHygiene" : "بهداشت"
} ,
"treatment" : {
"loading" : "در حال بارگذاری..." ,
"noPermissionTitle" : "فضای کاری درمان" ,
"noPermissionBody" : "شما مجوز مشاهده برگه درمان برای این سازمان را ندارید." ,
"title" : "درمان" ,
"subtitleEdit" : "پروندههای نوبتهای خود را مستند کنید، پیشنویسها را ذخیره کنید و کار را به سازمانهای مرتبط ارسال کنید." ,
"subtitleReadOnly" : "دسترسی فقط خواندنی — میتوانید نوبتها و تاریخچه درمان را بررسی کنید اما نمیتوانید ویرایش کنید." ,
"pastDayNotice" : "روزهای گذشته فقط قابل مشاهده هستند. میتوانید نوبتها و تاریخچه را بررسی کنید، اما پروندههای درمانی قابل اضافه یا تغییر نیستند." ,
"selectedPatient" : "بیمار انتخاب شده" ,
"purposeLabel" : "هدف:" ,
"loadingAppointments" : "در حال بارگذاری نوبتها..." ,
2026-08-22 20:11:43 +03:30
"selectDayWithAppointment" : "برای بیمار جستجو کنید یا یک ویزیت را از نوار روز انتخاب کنید." ,
2026-08-22 20:25:11 +03:30
"noTreatmentFoundTitle" : "درمانی یافت نشد" ,
"noTreatmentFoundBody" : "هنوز درمان یا ویزیتی برای {name} ثبت نشده است. میتوانید با دکمه {action} در نوار کناری یکی اضافه کنید." ,
2026-06-20 14:51:43 +03:30
"confirmDiscard" : "تغییرات ذخیرهنشده دارید. آنها را کنار بگذارید و ادامه دهید؟" ,
"errorChooseOrg" : "حداقل یک سازمان فعال را برای ارسال این پرونده انتخاب کنید." ,
"successCaseSent" : "پرونده به سازمانهای انتخاب شده ارسال شد." ,
"successFilesUploaded" : "{count} فایل با موفقیت بارگذاری شد." ,
"errorLoadAppointments" : "بارگذاری نوبتها ناموفق بود." ,
"errorLoadOrgs" : "بارگذاری سازمانهای مرتبط ناموفق بود." ,
"errorLoadHistory" : "بارگذاری تاریخچه درمان ناموفق بود." ,
"errorLoadDraft" : "بارگذاری پیشنویس درمان ناموفق بود." ,
"errorUpload" : "بارگذاری پیوستها ناموفق بود." ,
"errorSaveDraft" : "ذخیره پیشنویس درمان ناموفق بود." ,
"errorSendCase" : "ارسال پرونده ناموفق بود." ,
"errorCaseMustSave" : "پرونده باید قبل از ارسال ذخیره شود." ,
2026-06-28 21:45:33 +03:30
"treatmentPlanTitle" : "درمان · {patientName}" ,
2026-06-20 14:51:43 +03:30
"hiddenMessage" : "نوبتها پنهان هستند." ,
"showAppointments" : "نمایش نوبتها" ,
"appointmentsTitle" : "نوبتهای من" ,
"hideAppointments" : "پنهان کردن نوبتها" ,
2026-08-19 15:05:58 +03:30
"emptyDay" : "در این روز هیچ نوبت یا درمان بدون نوبتی به شما اختصاص داده نشده است." ,
"unscheduledHeading" : "بدون نوبت" ,
"noAppointment" : "بدون نوبت" ,
"walkIn" : "بدون نوبت (مراجع)" ,
"newTreatment" : "درمان جدید" ,
2026-08-19 16:07:32 +03:30
"newTreatmentPatientPrompt" : "این ویزیت برای چه کسی است؟" ,
2026-08-22 20:11:43 +03:30
"newTreatmentUseCurrent" : "استفاده از {name}" ,
"newTreatmentUseCurrentHint" : "ویزیت جدیدی برای بیماری که همین حالا در این صفحه باز است شروع کنید." ,
2026-08-19 16:07:32 +03:30
"walkInPickerHint" : "بیمار نامدار نیست — همیشه در دسترس است و نیازی به جستجو ندارد." ,
2026-08-19 15:05:58 +03:30
"errorCreateTreatment" : "ایجاد درمان ممکن نشد." ,
"deleteEmptyTreatment" : "حذف درمان خالی" ,
"confirmDeleteEmptyTreatment" : "این درمان حذف شود؟ هنوز جزئیاتی ندارد." ,
"errorDeleteTreatment" : "حذف درمان ممکن نشد." ,
2026-06-20 14:51:43 +03:30
"casesTitle" : "پروندههای درمانی" ,
"casesSubtitle" : "هر پرونده دارای دندانها، یادداشتها، پیوستها و مقصدهای ارسال خود است." ,
2026-06-28 17:14:02 +03:30
"detailsTitle" : "جزئیات درمان" ,
"addDetail" : "افزودن جزئیات" ,
2026-07-16 22:45:37 +03:30
"confirmRemoveDetail" : "این جزئیات درمان حذف شود؟" ,
2026-08-22 19:36:37 +03:30
"confirmRemoveLastDetail" : "این آخرین جزئیات است. با حذف آن برنامه خالی میماند تا جزئیات جدیدی اضافه کنید. ادامه میدهید؟" ,
2026-07-17 00:39:32 +03:30
"removeDetailAria" : "حذف جزئیات {n}" ,
2026-06-28 17:14:02 +03:30
"detailLabel" : "جزئیات {n}" ,
"detailSentBadge" : "ارسالشده" ,
2026-08-19 23:59:37 +03:30
"detailUnsentBadge" : "ارسالنشده" ,
"attachmentPreviewUnavailable" : "پیشنمایش در دسترس نیست" ,
2026-06-28 17:14:02 +03:30
"detailLockedInShipment" : "این جزئیات به لابراتوار ارسال شده و دیگر قابل ویرایش نیست." ,
"detailsSaveHint" : "ارسال لاب در بخش جداگانه زیر پیکربندی میشود." ,
2026-06-20 14:51:43 +03:30
"addCase" : "افزودن پرونده" ,
"caseLabel" : "پرونده {n}" ,
2026-07-17 12:30:43 +03:30
"comments" : "یادداشتها" ,
"commentsPlaceholder" : "یادداشتهای بالینی این جزئیات را بنویسید…" ,
2026-06-20 14:51:43 +03:30
"treatmentType" : "نوع درمان" ,
2026-07-13 01:03:26 +03:30
"treatmentTypePlaceholder" : "نوع درمان را انتخاب کنید…" ,
"treatmentTypeNotSelected" : "نوع انتخاب نشده" ,
2026-06-20 14:51:43 +03:30
"typeConsultation" : "مشاوره" ,
"typeFilling" : "پر کردن" ,
"typeEndo" : "درمان ریشه" ,
"typeVisit" : "ویزیت" ,
"typeHygiene" : "بهداشت" ,
"attachments" : "پیوستها" ,
"attachFiles" : "فایلها را برای این پرونده درمانی پیوست کنید" ,
"chooseFiles" : "انتخاب فایلها" ,
"sendToOrgs" : "ارسال این پرونده به سازمانهای مرتبط" ,
"searchOrgsPlaceholder" : "جستجوی سازمانهای فعال..." ,
"recent" : "اخیر:" ,
"noOrgMatch" : "هیچ سازمان فعالی با جستجوی شما مطابقت ندارد." ,
2026-07-13 01:03:26 +03:30
"inviteLab" : "دعوت از آزمایشگاه" ,
"noOrgInvitePermission" : "شما مجوز دعوت از آزمایشگاه را ندارید. با مالک سازمان تماس بگیرید." ,
2026-06-20 14:51:43 +03:30
"sendThisCase" : "ارسال این پرونده" ,
2026-06-28 17:14:02 +03:30
"labDispatchTitle" : "ارسال به لابراتوار" ,
2026-08-19 23:59:37 +03:30
"labDispatchSubtitle" : "لابراتوار را انتخاب کنید، نوع پروتز را مشخص کنید و ارسال کنید." ,
2026-06-28 18:08:29 +03:30
"labDispatchSendHint" : "گروهبندی محموله هنگام ارسال به لاب ذخیره میشود." ,
2026-06-28 17:14:02 +03:30
"addLabShipment" : "افزودن محموله لاب" ,
"labShipmentLabel" : "محموله {n}" ,
"includeDetails" : "شامل جزئیات درمان" ,
2026-06-28 18:48:06 +03:30
"labShipmentIncludedDetails" : "شامل این محموله" ,
"labShipmentNoIncludedDetails" : "جزئیاتی در این محموله گنجانده نشده است." ,
"labShipmentNoDetailsAvailable" : "همه جزئیات لاب در محمولههای دیگر هستند یا ارسال شدهاند." ,
2026-06-28 17:14:02 +03:30
"labDetailLine" : "جزئیات {n} · {type} · {teeth}" ,
2026-07-06 20:40:19 +03:30
"noLabDetails" : "هنوز جزئیات پروتز وجود ندارد. پروتز را در جزئیات درمان بالا اضافه کنید." ,
2026-06-28 17:14:02 +03:30
"labDispatchEmpty" : "یک محموله لاب اضافه کنید تا جزئیات را گروهبندی و ارسال کنید." ,
2026-07-06 20:40:19 +03:30
"prosthesisTypesTitle" : "انواع پروتز" ,
"prosthesisApplyAll" : "اعمال برای همه دندانها" ,
"prosthesisSelectPlaceholder" : "نوع پروتز را انتخاب کنید…" ,
"prosthesisColTooth" : "دندان" ,
"prosthesisColDetail" : "جزئیات" ,
"prosthesisColType" : "نوع پروتز" ,
2026-07-13 22:53:23 +03:30
"prosthesisUnassigned" : "تخصیصدادهنشده" ,
2026-06-28 17:14:02 +03:30
"selectLab" : "لابراتوار مقصد" ,
"selectLabPlaceholder" : "یک لابراتوار متصل انتخاب کنید…" ,
"sendToLab" : "ارسال به لابراتوار" ,
2026-07-13 16:30:36 +03:30
"dueDateLabel" : "موعد تحویل" ,
"dueDateOptional" : "اختیاری" ,
"dueDateLockedCompleted" : "پس از تکمیل همه وظایف، موعد قابل تغییر نیست." ,
"dueDateUpdateError" : "بهروزرسانی موعد ناموفق بود." ,
2026-06-28 17:14:02 +03:30
"saveLabShipments" : "ذخیره محمولههای لاب" ,
"labDispatchSaveHint" : "گروهبندی محموله را بدون ارسال ذخیره میکند." ,
"successLabShipmentsSaved" : "محمولههای لاب ذخیره شد." ,
"errorSaveLabShipments" : "ذخیره محمولههای لاب ناموفق بود." ,
"errorLabCaseNeedsDetails" : "حداقل یک جزئیات درمان برای این محموله انتخاب کنید." ,
2026-06-20 14:51:43 +03:30
"unsavedChanges" : "تغییرات ذخیرهنشده" ,
2026-06-28 18:08:29 +03:30
"saveStatusSaving" : "در حال ذخیره…" ,
"saveStatusSaved" : "همه تغییرات ذخیره شد" ,
"saveStatusError" : "ذخیره ناموفق بود — اتصال را بررسی کنید" ,
2026-06-20 14:51:43 +03:30
"sendSavesFirst" : "ارسال برای هر پرونده به صورت جداگانه است و ابتدا به طور خودکار ذخیره میکند." ,
"historyTitle" : "درمانهای قبلی" ,
2026-07-13 01:03:26 +03:30
"historyPatientScope" : "درمانهای قبلی برای {patientName}" ,
"historyCurrentAppointment" : "این نوبت" ,
"historySubtitle" : "برای پیشنمایش روی یک طرح قبلی کلیک کنید، سپس در صورت نیاز آن را در فضای کار بارگذاری کنید." ,
"historyFilterNotShipped" : "ارسالنشده به لابراتوار" ,
"historyFilterDate" : "تاریخ" ,
"historyClearFilters" : "حذف فیلترها" ,
"historyFilterEmpty" : "هیچ درمانی با این فیلترها یافت نشد." ,
"labShipmentBlockedTitle" : "ارسال به لابراتوار هنوز ممکن نیست" ,
"labShipmentBlockedBody" : "قبل از ایجاد ارسال لابراتوار، حداقل یک دندان برای این جزئیات پروتز انتخاب کنید." ,
"labCaseCommentsTitle" : "نظرات پرونده لابراتوار" ,
"labCaseCommentsHint" : "تا زمانی که پرونده در لابراتوار در حال انجام است با لابراتوار پیام بگذارید. پس از تکمیل همه کارها، نظردهی بسته میشود." ,
2026-07-13 22:53:23 +03:30
"labShipmentsTitle" : "ارسالهای لابراتوار" ,
"labShipmentsSubtitle" : "پروندههای ارسالشده این بیمار — برای پیگیری پیشرفت و پیامها یکی را باز کنید." ,
"labShipmentsPatientScope" : "پروندههای ارسالشده برای {patientName} — برای پیگیری پیشرفت و پیامها یکی را باز کنید." ,
"labShipmentsUpdatesScope" : "پروندههای دارای فعالیت جدید لاب — برای بررسی و پاک کردن بهروزرسانی یکی را باز کنید." ,
"labShipmentsScopePatient" : "این بیمار" ,
"labShipmentsScopeUpdates" : "همه بهروزرسانیها ({count})" ,
"labShipmentsOtherPatientsUnread" : "{count, plural, one {# بهروزرسانی برای بیمار دیگر} other {# بهروزرسانی برای بیماران دیگر}}" ,
"labShipmentsUpdatesEmpty" : "پروندهای با فعالیت جدید لاب وجود ندارد." ,
"labShipmentsEmpty" : "هنوز ارسالی به لابراتوار برای این بیمار ثبت نشده است." ,
"labShipmentTeethCount" : "{count, plural, one {# دندان} other {# دندان}}" ,
"historyShowFilters" : "نمایش فیلترها" ,
"historyHideFilters" : "پنهان کردن فیلترها" ,
"labTrackerExpand" : "مشاهده فعالیت" ,
"labTrackerCollapse" : "پنهان کردن فعالیت" ,
"activityFeedTitle" : "فعالیت" ,
"activityFeedEmpty" : "هنوز فعالیتی ثبت نشده است." ,
"unreadLabCase" : "بهروزرسانیهای خواندهنشده لاب" ,
"overdueBadge" : "عقبافتاده" ,
"activityUnknownActor" : "کاربر" ,
"activityUnknownStep" : "وظیفه" ,
"activityCaseSent" : "پرونده به لاب ارسال شد · {date}" ,
"activityClinicComment" : "{actor}: «{preview}» · {date}" ,
"activityLabComment" : "{actor}: «{preview}» · {date}" ,
"activityTaskCompleted" : "{step} توسط {actor} تکمیل شد · {date}" ,
2026-07-18 17:23:47 +03:30
"activityTaskAssigned" : "{step} توسط {actor} اختصاص داده شد · {date}" ,
2026-07-13 22:53:23 +03:30
"activityCaseImportant" : "مهم علامتگذاری شد توسط {actor} · {date}" ,
"activityCaseAmended" : "پرونده بهروزرسانی شد توسط {actor} · {date}" ,
"activityGeneric" : "بهروزرسانی · {date}" ,
2026-06-20 14:51:43 +03:30
"loadingHistory" : "در حال بارگذاری تاریخچه..." ,
2026-06-28 21:45:33 +03:30
"historyEmpty" : "هیچ درمان دیگری برای این بیمار ثبت نشده است." ,
"historyDetailLabel" : "جزئیات {n} · {type}" ,
2026-07-13 01:03:26 +03:30
"previewCurrentDraft" : "پیشنویس فعلی" ,
"previewBrowsingTitle" : "پیشنمایش طرح ذخیرهشده" ,
"browseBanner" : "در حال مشاهده {date} — این طرح هنوز در ویرایشگر بارگذاری نشده است." ,
"loadIntoWorkspace" : "بارگذاری در فضای کاری" ,
"backToCurrentDraft" : "بازگشت به پیشنویس فعلی" ,
"labAttentionTitle" : "نیاز به ارسال به لابراتوار" ,
"labAttentionSubtitle" : "این جزئیات وابسته به لاب هنوز به لابراتوار ارسال نشدهاند." ,
"labAttentionCurrentDraft" : "نوبت فعلی" ,
"labAttentionGoDispatch" : "رفتن به ارسال" ,
"labAttentionLoadDispatch" : "بارگذاری و ارسال" ,
2026-06-28 21:45:33 +03:30
"previewTitle" : "پیشنمایش درمان" ,
"openTreatment" : "باز کردن" ,
"selectAppointment" : "یک نوبت را برای پیشنمایش درمان انتخاب کنید." ,
"detailCount" : "{n} جزئیات" ,
"detailSummary" : "جزئیات {n}: {type}" ,
"detailAttachmentCount" : "{n} فایل" ,
"detailNotSentToLab" : "به لاب ارسال نشده" ,
"detailPendingLabSend" : "این جزئیات لاب هنوز ارسال نشده است." ,
"historicalReadonlyNotice" : "در حال مشاهده یک درمان گذشته (فقط خواندنی) هستید." ,
"errorNoAppointmentForTreatment" : "این درمان نوبت مرتبطی ندارد و قابل باز کردن نیست." ,
2026-07-13 22:53:23 +03:30
"errorNoTreatmentForPatient" : "هنوز هیچ سابقه درمانی برای این بیمار ثبت نشده است." ,
2026-06-20 14:51:43 +03:30
"teethLabel" : "دندانها:" ,
"teethNone" : "هیچکدام انتخاب نشده" ,
2026-06-28 21:45:33 +03:30
"noDetails" : "هنوز جزئیات درمانی وجود ندارد." ,
2026-06-20 14:51:43 +03:30
"noCases" : "هیچ پروندهای در این درمان وجود ندارد." ,
"typeLabel" : "نوع:" ,
"commentsLabel" : "نظرات:" ,
"commentsEmpty" : "نظرات: —" ,
"attachFilesShort" : "پیوست فایلها" ,
"sendCase" : "ارسال این پرونده" ,
"sendToLinkedOrgs" : "ارسال به سازمانهای مرتبط" ,
"noActiveOrgs" : "هیچ سازمان مرتبط فعالی وجود ندارد." ,
"confirmSend" : "تأیید ارسال" ,
"toothChartTitle" : "نمودار دندانها FDI" ,
2026-07-07 18:43:10 +03:30
"toothChartTitleCompact" : "نمودار دندان" ,
2026-08-19 00:06:21 +03:30
"toothChartHint" : "برای انتخاب یا لغو انتخاب روی دندان ضربه بزنید. وقتی دو دندان همسایه انتخاب شوند، دایرهٔ خالی بینشان ظاهر میشود — برای اتصال روی آن بزنید (یا روی دایرهٔ پر برای قطع اتصال). Shift+کلیک روی یک بازه، همه را انتخاب میکند (تا وقتی دایرهها را پر نکنید متصل نیستند)." ,
2026-08-19 23:59:37 +03:30
"toothChartHelpAria" : "راهنمای انتخاب دندان" ,
2026-07-17 00:39:32 +03:30
"toothConnectedHint" : "انتخاب متصل" ,
2026-08-19 00:06:21 +03:30
"toothLinkHint" : "اتصال این دندانها" ,
"toothUnlinkHint" : "قطع اتصال این دندانها" ,
"toothLinkAria" : "اتصال دندانهای {a} و {b}" ,
"toothUnlinkAria" : "قطع اتصال دندانهای {a} و {b}" ,
2026-07-17 00:39:32 +03:30
"toothConnectedSuffix" : " (متصل)" ,
"connectedBadge" : "متصل" ,
"prosthesisConnectedLabel" : "نوع پروتز دندانهای متصل" ,
"entryWizardLabel" : "مراحل ثبت درمان" ,
"entryStepTeeth" : "دندانها" ,
"entryStepContent" : "محتوا" ,
"entryStepLab" : "لابراتوار" ,
2026-08-19 23:59:37 +03:30
"entryStepTreatment" : "درمان" ,
2026-07-17 00:39:32 +03:30
"entryStepBack" : "قبلی" ,
"entryStepNext" : "بعدی" ,
2026-08-19 23:59:37 +03:30
"continueToLab" : "ادامه به لابراتوار" ,
"backToTreatment" : "بازگشت به درمان" ,
"selectTypeBeforeTeeth" : "قبل از انتخاب دندان، نوع درمان را انتخاب کنید." ,
"labDispatchNotSent" : "ارسال نشده" ,
"labDispatchLastLab" : "آخرین لاب: {name}" ,
"labCommentsMovedHint" : "پیشرفت و پیامها در بخش محمولههای لاب هستند." ,
2026-07-17 00:39:32 +03:30
"entryStepLabUnavailable" : "ارسال به لابراتوار پس از ذخیره جزئیات وابسته به لاب با انتخاب دندان در دسترس است." ,
2026-07-13 22:53:23 +03:30
"toothChartWholePlan" : "نمایش کامل" ,
2026-07-07 18:43:10 +03:30
"labShipmentAttachments" : "فایلها برای لابراتوار" ,
2026-08-19 23:59:37 +03:30
"labShipmentAttachmentsHint" : "همه فایلها پیوست میشوند. برای حذف از ارسال، تیک را بردارید." ,
2026-06-20 14:51:43 +03:30
"selectedLabel" : "انتخاب شده:" ,
"selectedEmpty" : "—" ,
"upperArch" : "قوس بالا" ,
"lowerArch" : "قوس پایین" ,
"toothAria" : "دندان FDI {fdi}" ,
"toothSelectedSuffix" : "، انتخاب شده" ,
"sentToAt" : "ارسال به {orgName} در {datetime}" ,
"fallbackOrgName" : "سازمان"
} ,
"organizations" : {
"loadingOrganization" : "در حال بارگذاری سازمان..." ,
2026-08-19 02:41:05 +03:30
"subtitle" : "سازمانها را جستجو کنید، درخواست اتصال به حسابهای موجود ارسال کنید، یا اگر هنوز در Nudentic نیستند، لینک دعوت ارسال کنید." ,
2026-06-20 14:51:43 +03:30
"invitationHistory" : "تاریخچه دعوتنامهها" ,
"searchPlaceholder" : "جستجوی {counterpart} بر اساس نام، ایمیل یا تلفن..." ,
"backToList" : "بازگشت به لیست" ,
"tableOrganization" : "سازمان" ,
"tableOwnerEmail" : "ایمیل مالک" ,
"tableDate" : "تاریخ" ,
"tableStatus" : "وضعیت" ,
"tableAction" : "عملیات" ,
"emptyConnections" : "هنوز هیچ اتصالی وجود ندارد. برای ارسال درخواست اتصال یا لینک دعوت، جستجو کنید." ,
"statusInvitationPending" : "دعوتنامه در انتظار" ,
"statusConnectionPending" : "درخواست اتصال در انتظار" ,
"statusConnected" : "متصل" ,
"statusDeclined" : "درخواست اتصال رد شد" ,
"statusFound" : "یافت شد" ,
"statusToday" : "امروز" ,
"acceptRequest" : "پذیرش درخواست اتصال" ,
"declineRequest" : "رد درخواست اتصال" ,
"removeConnection" : "قطع اتصال" ,
"sendRequest" : "ارسال درخواست اتصال" ,
"noDirectoryResults" : "هیچ سازمانی در جستجوی دایرکتوری یافت نشد." ,
"hideInvitationFields" : "پنهان کردن فیلدهای دعوت" ,
"sendInvitationLink" : "ارسال لینک دعوت" ,
"counterpartNameLabel" : "نام {counterpart}" ,
"ownerEmailLabel" : "ایمیل مالک" ,
"sendInvitation" : "ارسال دعوتنامه" ,
"successConnectionSent" : "درخواست اتصال {counterpart} ارسال شد." ,
"successInviteCreated" : "لینک دعوت برای {email} ایجاد شد" ,
"successLinkCopied" : "لینک دعوت در کلیپبورد کپی شد." ,
"successAccepted" : "درخواست اتصال پذیرفته شد." ,
"successDeclined" : "درخواست اتصال رد شد." ,
"successRemoved" : "اتصال قطع شد." ,
"historyTitle" : "تاریخچه دعوتنامهها" ,
"loadingHistory" : "در حال بارگذاری تاریخچه دعوتنامهها..." ,
"historyEmpty" : "هنوز هیچ دعوتنامهای وجود ندارد." ,
"tableInvitationLink" : "لینک دعوت" ,
"statusPending" : "دعوتنامه در انتظار" ,
"statusAccepted" : "دعوتنامه پذیرفته شد" ,
"statusRejected" : "دعوتنامه رد شد" ,
"statusExpired" : "دعوتنامه منقضی شد" ,
"copyInvitationLink" : "کپی لینک دعوتنامه" ,
"copyInvitationLinkTitle" : "کپی لینک دعوتنامه (در صورت نیاز لینک جدیدی تولید میکند)" ,
"selectorTitle" : "سازمانها" ,
"selectorSubtitleWithCreate" : "یک سازمان را برای ادامه انتخاب کنید، یا یک سازمان جدید ایجاد کنید." ,
"selectorSubtitleSelectOnly" : "یک سازمان را برای ادامه انتخاب کنید." ,
"createOrganization" : "ایجاد سازمان" ,
"createAndContinue" : "ایجاد و ادامه" ,
"emptyCanCreate" : "هیچ سازمانی یافت نشد. اولین سازمان خود را ایجاد کنید تا ادامه دهید." ,
"emptyAskOwner" : "هیچ سازمانی یافت نشد. از مالک سازمان بخواهید تا شما را دعوت کند." ,
"continueArrow" : "ادامه →" ,
"planLabel" : "طرح: {name} • {maxUsers} کاربر" ,
"counterpartClinic" : "کلینیک" ,
2026-06-28 23:19:33 +03:30
"counterpartLab" : "لابراتوار" ,
"viewCaseHistory" : "مشاهده تاریخچه پروندهها" ,
"caseHistoryBackToConnections" : "← بازگشت به اتصالات" ,
"caseHistoryTitle" : "تاریخچه پرونده با {name}" ,
2026-07-13 22:53:23 +03:30
"caseHistorySlimClinicBody" : "پیگیری پروندههای لاب را در درمان هر بیمار انجام دهید." ,
"caseHistorySlimClinicHint" : "درمان را باز کنید، بیمار را انتخاب کنید و از پنل «ارسالهای لابراتوار» در سمت چپ، پروندههای ارسالشده به {name} را دنبال کنید." ,
"caseHistorySlimClinicCta" : "باز کردن درمان" ,
"caseHistorySlimLabBody" : "پروندههای تولید این کلینیک در تب پروندهها هستند." ,
"caseHistorySlimLabHint" : "از تب پروندهها برای کار روی موارد دریافتی از {name} استفاده کنید. در صورت نیاز بر اساس این کلینیک فیلتر کنید." ,
"caseHistorySlimLabCta" : "باز کردن پروندهها"
2026-06-20 14:51:43 +03:30
} ,
"settings" : {
"accountTitle" : "حساب کاربری" ,
"accountSubtitle" : "تنظیمات پروفایل و امنیت برای ورود شما." ,
2026-07-12 15:11:50 +03:30
"participationSectionTitle" : "مشارکت بالینی" ,
"participationSectionSubtitle" : "مشخص کنید آیا شخصاً در درمانها یا کارهای آزمایشگاهی این سازمان شرکت میکنید." ,
"participateInTreatments" : "میخواهم در درمانها شرکت کنم" ,
"participateInTasks" : "میخواهم در وظایف شرکت کنم" ,
"participateWorkingHoursTitle" : "ساعات کاری" ,
"participateWorkingHoursSubtitle" : "برنامه خود را تنظیم کنید تا نوبتها برای شما رزرو شوند." ,
"participateSaveHours" : "ذخیره و مشارکت" ,
"participateEnabledTreatments" : "اکنون در درمانها شرکت میکنید." ,
"participateEnabledTasks" : "اکنون در وظایف شرکت میکنید." ,
"participateDisabledTreatments" : "دیگر در درمانها شرکت نمیکنید." ,
"participateDisabledTasks" : "دیگر در وظایف شرکت نمیکنید." ,
"participateUpdateFailed" : "بهروزرسانی تنظیمات مشارکت ممکن نشد. دوباره تلاش کنید." ,
"participateConfirmRevokeTitle" : "توقف مشارکت؟" ,
"participateConfirmRevokeBodyTreatments" : "دسترسی درمان را از دست میدهید و از برنامه نوبتها حذف میشوید. ساعات کاری ذخیرهشده حفظ میشود." ,
"participateConfirmRevokeBodyTasks" : "دسترسی ویرایش وظایف را از دست میدهید و از گزارش کارایی حذف میشوید." ,
"participateConfirmRevokeConfirm" : "توقف مشارکت" ,
"changePasswordOption" : "تغییر رمز عبور" ,
2026-07-04 00:01:58 +03:30
"changePasswordTitle" : "تغییر رمز عبور" ,
"resetPasswordTitle" : "تنظیم رمز عبور جدید" ,
"resetPasswordSubtitle" : "موبایل شما تأیید شد. رمز عبور جدید برای حساب خود انتخاب کنید." ,
"currentPassword" : "رمز عبور فعلی" ,
"newPassword" : "رمز عبور جدید" ,
"confirmNewPassword" : "تأیید رمز عبور جدید" ,
"updatePassword" : "بهروزرسانی رمز عبور" ,
"setNewPassword" : "ذخیره رمز عبور جدید" ,
"passwordChanged" : "رمز عبور بهروزرسانی شد. لطفاً دوباره وارد شوید." ,
"passwordChangeFailed" : "بهروزرسانی رمز عبور انجام نشد. دوباره تلاش کنید." ,
2026-06-20 14:51:43 +03:30
"subscriptionsTitle" : "اشتراکها" ,
2026-08-19 02:41:05 +03:30
"subscriptionsSubtitle" : "طرح و مجوزهای فضای کاری Nudentic شما برای {orgName}. پیگیری درآمد کلینیک و لابراتوار در برگه صورتحساب در نوار کناری قرار دارد." ,
2026-06-20 14:51:43 +03:30
"noSubscriptionNotice" : "این سازمان اشتراک فعالی ندارد. برای شروع فرآیند خرید، یک طرح زیر را انتخاب کنید." ,
"currentPlan" : "طرح فعلی" ,
"planPrice" : "قیمت طرح" ,
"seatsUsed" : "مجوزهای استفاده شده" ,
"seatsRemaining" : "مجوزهای باقیمانده" ,
"daysRemaining" : "روزهای باقیمانده" ,
"unlimited" : "نامحدود" ,
"unlimitedSeats" : "مجوزهای نامحدود" ,
"seatsCount" : "{n} مجوز" ,
"pricePerMonth" : "${price} / ماه" ,
"noActiveSubscription" : "هیچ اشتراک فعالی برای این سازمان وجود ندارد." ,
"trialEnded" : "دوره آزمایشی به پایان رسیده است. زمانی که تسویه حساب در دسترس قرار گرفت، یک طرح انتخاب کنید." ,
"trialEndsIn" : "دوره آزمایشی در {days} روز به پایان میرسد." ,
"seatsLow" : "استفاده از مجوزها برای این سازمان بالا است." ,
"choosePlanIntro" : "یک طرح را برای ادامه انتخاب کنید. یکپارچهسازی خرید هنوز فعال نیست، بنابراین این مرحله فقط مرحله انتخاب را آماده میکند." ,
"planSolo" : "انفرادی" ,
"planSmall" : "کوچک" ,
"planMedium" : "متوسط" ,
"planLarge" : "بزرگ" ,
"planEnterprise" : "سازمانی" ,
"startPurchase" : "شروع فرآیند خرید" ,
"purchaseNotice" : "جریان خرید به زودی فعال میشود. {plan} انتخاب شده و برای راهاندازی تسویه حساب آماده است."
} ,
"schedule" : {
"defaultLabel" : "تاریخ برنامه" ,
"previousDay" : "روز قبل" ,
"nextDay" : "روز بعد" ,
"chooseDate" : "انتخاب تاریخ برنامه" ,
2026-07-12 21:16:38 +03:30
"today" : "امروز" ,
2026-06-20 14:51:43 +03:30
"year" : "سال" ,
"month" : "ماه" ,
"day" : "روز" ,
"monthJanuary" : "ژانویه" ,
"monthFebruary" : "فوریه" ,
"monthMarch" : "مارس" ,
"monthApril" : "آوریل" ,
"monthMay" : "مه" ,
"monthJune" : "ژوئن" ,
"monthJuly" : "ژوئیه" ,
"monthAugust" : "اوت" ,
"monthSeptember" : "سپتامبر" ,
"monthOctober" : "اکتبر" ,
"monthNovember" : "نوامبر" ,
"monthDecember" : "دسامبر"
2026-07-12 18:27:38 +03:30
} ,
2026-07-18 01:09:54 +03:30
"notifications" : {
"bellAria" : "اعلانها" ,
"unreadCount" : "{count} اعلان خواندهنشده" ,
"dropdownTitle" : "اعلانها" ,
"viewAll" : "مشاهده همه" ,
"pageTitle" : "اعلانها" ,
"pageSubtitle" : "بهروزرسانیهای پروندهها، وظایف، سازمانها و کارکنان." ,
"loading" : "در حال بارگذاری اعلانها…" ,
"empty" : "هنوز اعلانی نیست." ,
"loadMore" : "بیشتر" ,
"markAllRead" : "علامتگذاری همه بهعنوان خواندهشده" ,
"errorLoad" : "بارگذاری اعلانها ممکن نشد." ,
"errorMarkRead" : "بهروزرسانی اعلان ممکن نشد." ,
"typeCaseSent" : "پرونده جدید در لابراتوار دریافت شد" ,
"typeClinicComment" : "نظر جدید کلینیک روی پرونده" ,
"typeLabComment" : "نظر جدید لابراتوار روی پرونده" ,
"typeLabCommentClinic" : "نظر جدید لابراتوار روی پرونده شما" ,
"typeCaseImportant" : "پرونده بهعنوان مهم علامت خورد" ,
"typeTaskCompleted" : "وظیفه لابراتوار تکمیل شد" ,
"typeTaskAssigned" : "یک وظیفه به شما اختصاص داده شد" ,
"typeConnectionRequest" : "درخواست اتصال سازمان جدید" ,
"typeStaffInvite" : "دعوتنامه کارکنان ایجاد شد" ,
2026-07-18 16:57:13 +03:30
"typeUnknown" : "اعلان" ,
"destCases" : "باز کردن پروندهها" ,
"destTasks" : "باز کردن وظایف" ,
"destTreatment" : "باز کردن درمان" ,
"destOrganizations" : "باز کردن سازمانها" ,
"destStaff" : "باز کردن کارکنان" ,
"destOpen" : "باز کردن"
2026-07-18 01:09:54 +03:30
} ,
2026-07-12 18:27:38 +03:30
"errors" : {
"GENERIC" : "مشکلی پیش آمد. لطفاً دوباره تلاش کنید." ,
"NETWORK_ERROR" : "اتصال به سرور برقرار نشد. اتصال اینترنت را بررسی کنید." ,
"TIMEOUT" : "درخواست بیش از حد طول کشید. لطفاً دوباره تلاش کنید." ,
"AUTH_INVALID_CREDENTIALS" : "ایمیل یا رمز عبور نادرست است." ,
"AUTH_UNAUTHORIZED" : "نشست شما منقضی شده است. لطفاً دوباره وارد شوید." ,
"AUTH_REFRESH_TOKEN_NOT_FOUND" : "نشست شما منقضی شده است. لطفاً دوباره وارد شوید." ,
"AUTH_REFRESH_TOKEN_INVALID" : "نشست شما منقضی شده است. لطفاً دوباره وارد شوید." ,
"AUTH_SESSION_EXPIRED" : "نشست شما منقضی شده است. لطفاً دوباره وارد شوید." ,
"AUTH_USER_NOT_FOUND" : "حساب کاربری یافت نشد." ,
"AUTH_ORG_NOT_SELECTED" : "لطفاً یک سازمان را انتخاب کنید." ,
"AUTH_ORG_ACCESS_DENIED" : "به این سازمان دسترسی ندارید." ,
"AUTH_INVITATION_PENDING" : "دعوتنامه شما هنوز فعال نشده است. از مدیر بخواهید حساب شما را فعال کند." ,
"AUTH_REGISTRATION_EMAIL_EXISTS" : "حسابی با این ایمیل وجود دارد. وارد شوید و از حساب خود سازمان جدید بسازید." ,
"AUTH_REGISTRATION_MOBILE_EXISTS" : "این شماره موبایل قبلاً ثبت شده است." ,
"AUTH_REGISTRATION_MOBILE_INVALID" : "لطفاً شماره موبایل معتبر وارد کنید." ,
"AUTH_REGISTRATION_FAILED" : "ثبتنام انجام نشد. لطفاً دوباره تلاش کنید." ,
"AUTH_PASSWORD_INCORRECT" : "رمز عبور فعلی نادرست است." ,
"AUTH_PASSWORD_RESET_EXPIRED" : "زمان بازیابی رمز عبور تمام شده است. دوباره شماره موبایل را تأیید کنید." ,
"AUTH_VERIFICATION_CODE_INVALID" : "کد تأیید نامعتبر یا منقضی شده است." ,
"AUTH_VERIFICATION_RATE_LIMIT" : "لطفاً کمی صبر کنید و دوباره درخواست کد دهید." ,
"AUTH_SELECT_ORG_FIRST" : "قبل از ایجاد سازمان جدید، یک سازمان را انتخاب کنید." ,
"AUTH_CREATE_ORG_OWNER_ONLY" : "فقط مالک سازمان فعلی میتواند سازمان جدید ایجاد کند." ,
"AUTH_PASSWORD_CURRENT_REQUIRED" : "رمز عبور فعلی الزامی است." ,
"PERMISSION_DENIED" : "اجازه انجام این کار را ندارید." ,
"PERMISSION_ORG_MANAGE" : "اجازه مدیریت سازمانها را ندارید." ,
"PERMISSION_CLINIC_ONLY" : "این عمل فقط برای کلینیکها در دسترس است." ,
"PERMISSION_LAB_ONLY" : "این عمل فقط برای لابراتوارها در دسترس است." ,
"PERMISSION_NOT_MEMBER" : "عضو این سازمان نیستید." ,
"PERMISSION_OWNER_ONLY" : "فقط مالک سازمان میتواند این کار را انجام دهد." ,
"PERMISSION_PARTICIPATION_SUBSCRIPTION" : "برای شرکت در درمان یا وظایف، اشتراک فعال لازم است." ,
"PERMISSION_ENABLE_PARTICIPATION_FIRST" : "قبل از تنظیم ساعات کاری، مشارکت در درمان را فعال کنید." ,
"PERMISSION_CLINIC_WORKING_HOURS" : "ساعات کاری فقط برای کلینیکها در دسترس است." ,
"PERMISSION_ACCESS_APPOINTMENTS" : "به نوبتها دسترسی ندارید." ,
"PERMISSION_EDIT_APPOINTMENTS" : "نمیتوانید نوبت ایجاد یا ویرایش کنید." ,
"PERMISSION_ACCESS_TREATMENTS" : "به درمانها دسترسی ندارید." ,
"PERMISSION_EDIT_TREATMENTS" : "نمیتوانید درمانها را ویرایش کنید." ,
"PERMISSION_ACCESS_TASKS" : "به وظایف دسترسی ندارید." ,
"PERMISSION_EDIT_TASKS" : "نمیتوانید وظایف را ویرایش کنید." ,
"PERMISSION_ACCESS_CASES" : "به پروندهها دسترسی ندارید." ,
2026-07-14 21:07:05 +03:30
"LAB_CASE_ACCESS_DENIED" : "اجازه مشاهده این پرونده اشتراکگذاریشده را ندارید." ,
2026-07-12 18:27:38 +03:30
"PERMISSION_ACCESS_STAFF" : "به مدیریت پرسنل دسترسی ندارید." ,
"PERMISSION_EDIT_STAFF" : "نمیتوانید ساعات کاری پرسنل را مدیریت کنید." ,
"PERMISSION_ORG_NOT_FOUND" : "سازمان یافت نشد." ,
"VALIDATION_FAILED" : "لطفاً فرم را بررسی و دوباره تلاش کنید." ,
"VALIDATION_EMAIL_INVALID" : "لطفاً یک ایمیل معتبر وارد کنید." ,
"VALIDATION_PASSWORD_TOO_SHORT" : "رمز عبور کوتاه است." ,
"VALIDATION_PASSWORD_REQUIRED" : "رمز عبور الزامی است." ,
"VALIDATION_MOBILE_INVALID" : "لطفاً شماره موبایل معتبر وارد کنید." ,
"VALIDATION_NAME_TOO_SHORT" : "نام کوتاه است." ,
"VALIDATION_ORGANIZATION_NAME_REQUIRED" : "نام سازمان الزامی است." ,
"VALIDATION_ORGANIZATION_TYPE_INVALID" : "نوع سازمان معتبر انتخاب کنید." ,
"VALIDATION_TOKEN_REQUIRED" : "این لینک نامعتبر یا ناقص است." ,
"VALIDATION_FIELD_REQUIRED" : "لطفاً همه فیلدهای الزامی را پر کنید." ,
"VALIDATION_LANGUAGE_INVALID" : "زبان پشتیبانیشده انتخاب کنید." ,
"VALIDATION_INVALID_REQUEST" : "درخواست حاوی داده نامعتبر است." ,
2026-08-19 01:43:50 +03:30
"VALIDATION_TIMEZONE_INVALID" : "منطقه زمانی شما مشخص نشد. صفحه را تازهسازی کنید و دوباره تلاش کنید." ,
"APPOINTMENT_INVALID_TIME" : "زمان شروع یا پایان نوبت نامعتبر است." ,
"APPOINTMENT_END_BEFORE_START" : "زمان پایان باید بعد از زمان شروع باشد." ,
"APPOINTMENT_TOO_LONG" : "مدت نوبت نمیتواند بیش از ۲۴ ساعت باشد." ,
"APPOINTMENT_IN_PAST" : "نمیتوانید نوبت در گذشته ثبت کنید." ,
"APPOINTMENT_INVALID_RANGE" : "بازه تاریخ نامعتبر است." ,
"APPOINTMENT_INVALID_RANGE_ORDER" : "پایان بازه باید بعد از شروع باشد." ,
"APPOINTMENT_INVALID_DATE" : "تاریخ انتخابشده نامعتبر است." ,
"APPOINTMENT_PROVIDER_NOT_MEMBER" : "این ارائهدهنده عضو سازمان نیست." ,
"APPOINTMENT_PROVIDER_INACTIVE" : "این ارائهدهنده عضو فعال پرسنل نیست." ,
"APPOINTMENT_PROVIDER_NO_TREATMENT_EDIT" : "این ارائهدهنده نمیتواند نوبت درمان بپذیرد." ,
"APPOINTMENT_PROVIDER_NO_WORKING_HOURS" : "برای این ارائهدهنده ساعات کاری تعریف نشده است." ,
"APPOINTMENT_PROVIDER_NOT_WORKING_DAY" : "این ارائهدهنده در روز انتخابشده کار نمیکند." ,
"APPOINTMENT_OUTSIDE_WORKING_HOURS" : "این زمان خارج از ساعات کاری ارائهدهنده است." ,
"APPOINTMENT_NOT_FOUND" : "نوبت یافت نشد." ,
"APPOINTMENT_NOT_PROVIDER" : "شما ارائهدهنده این نوبت نیستید." ,
"PATIENT_NOT_FOUND" : "بیمار یافت نشد." ,
"WORKING_HOURS_INVALID" : "ساعات کاری نامعتبر است. همپوشانی شیفتها را بررسی کنید." ,
"WORKING_HOURS_OWNER_NOT_ALLOWED" : "ساعات کاری مالک را از تنظیمات حساب تنظیم کنید." ,
"WORKING_HOURS_CONFLICTS_WITH_APPOINTMENTS" : "این ساعات با نوبتهای آینده تداخل دارد. ابتدا آن نوبتها را تغییر دهید یا حذف کنید." ,
"STAFF_UNKNOWN_PERMISSIONS" : "یک یا چند دسترسی انتخابشده نامعتبر است." ,
"STAFF_NO_SUBSCRIPTION" : "قبل از افزودن پرسنل یک طرح انتخاب کنید." ,
"STAFF_SEAT_LIMIT" : "در طرح شما صندلی خالی نیست. یک عضو را غیرفعال کنید یا طرح را ارتقا دهید." ,
"STAFF_INVITE_OWNER_EMAIL" : "مالک سازمان از قبل عضو است." ,
"STAFF_ALREADY_MEMBER" : "این فرد از قبل عضو است." ,
"STAFF_OWNER_NO_INVITE_LINK" : "مالک از لینک دعوت استفاده نمیکند." ,
"STAFF_ALREADY_ACCEPTED" : "این عضو دعوتنامه را پذیرفته است." ,
"STAFF_INVITE_MISSING" : "دعوتنامهای برای این عضو یافت نشد." ,
"STAFF_INVITE_ALREADY_ACCEPTED" : "این دعوتنامه قبلاً پذیرفته شده است." ,
"STAFF_INVITE_INVALID" : "این دعوتنامه دیگر معتبر نیست." ,
"STAFF_INVITE_REVOKED" : "این دعوتنامه لغو شده است." ,
"STAFF_INVITE_EXPIRED" : "این دعوتنامه منقضی شده است." ,
"STAFF_ALREADY_ACTIVE" : "این عضو از قبل فعال است." ,
"STAFF_ALREADY_DISABLED" : "این عضو از قبل غیرفعال یا در انتظار است." ,
"STAFF_CANNOT_DISABLE_SELF" : "نمیتوانید دسترسی خود را غیرفعال کنید." ,
"STAFF_MEMBER_NOT_FOUND" : "عضو پرسنل یافت نشد." ,
"STAFF_CANNOT_EDIT_OWNER" : "عضویت مالک را نمیتوان از اینجا ویرایش کرد." ,
"STAFF_CANNOT_ENABLE_OWNER" : "مالک سازمان را نمیتوان اینگونه فعال کرد." ,
"STAFF_CANNOT_DISABLE_OWNER" : "مالک سازمان را نمیتوان غیرفعال کرد." ,
"STAFF_CANNOT_REMOVE_OWNER" : "مالک سازمان را نمیتوان حذف کرد." ,
"ORG_CANNOT_LINK_SELF" : "نمیتوانید سازمان را به خودش متصل کنید." ,
"ORG_LINK_WRONG_TYPE" : "فقط میتوانید به نوع سازمان متناظر (کلینیک یا لابراتوار) متصل شوید." ,
"ORG_TARGET_NO_SUBSCRIPTION" : "سازمان مقابل اشتراک فعال ندارد." ,
"ORG_LINK_EXISTS" : "این سازمانها از قبل متصل هستند." ,
"ORG_REQUEST_NOT_PENDING" : "فقط درخواستهای در انتظار را میتوان پاسخ داد." ,
"ORG_CANNOT_RESPOND_OWN" : "نمیتوانید به درخواست اتصال خودتان پاسخ دهید." ,
"ORG_INVITE_ALREADY_ACCEPTED" : "این دعوتنامه قبلاً پذیرفته شده است." ,
"ORG_INVITE_INVALID" : "این دعوتنامه دیگر معتبر نیست." ,
"ORG_INVITE_REVOKED" : "این دعوتنامه لغو شده است." ,
"ORG_INVITE_EXPIRED" : "این دعوتنامه منقضی شده است." ,
"ORG_INVITE_TYPE_MISMATCH" : "نوع سازمان با این دعوتنامه مطابقت ندارد." ,
"ORG_INVITE_OWNER_HAS_ORG" : "این مالک از قبل سازمان دارد. بهجای ارسال دعوتنامه آن را در جستجو پیدا کنید." ,
"ORG_UNKNOWN_TYPE" : "نوع سازمان ناشناخته است." ,
"ORG_COUNTERPART_NOT_LAB" : "سازمان متصلشده لابراتوار نیست." ,
"ORG_COUNTERPART_NOT_CLINIC" : "سازمان متصلشده کلینیک نیست." ,
"ORG_CONNECTION_NOT_FOUND" : "سازمان متصل یافت نشد." ,
"ORG_INVITE_NOT_FOUND" : "دعوتنامه یافت نشد." ,
"ORG_ONLY_CLINIC_COMMENT" : "فقط کلینیک میتواند روی این کیس نظر بگذارد." ,
"CATALOG_UNKNOWN_TREATMENT_TYPE" : "نوع درمان ناشناخته است." ,
"CATALOG_UNKNOWN_PROSTHESIS_TYPE" : "نوع پروتز ناشناخته است." ,
"CATALOG_TREATMENT_NOT_LAB_DEPENDENT" : "این نوع درمان در کلینیک تکمیل میشود و قابل ارسال به لابراتوار نیست." ,
"TREATMENT_SAVE_DETAILS_BEFORE_LAB" : "قبل از ایجاد کیس لابراتوار، جزئیات درمان را ذخیره کنید." ,
"TREATMENT_DETAIL_ONE_CASE" : "هر جزء درمان فقط میتواند به یک کیس لابراتوار تعلق داشته باشد." ,
"TREATMENT_DETAILS_NOT_FOUND" : "یک یا چند جزء درمان یافت نشد." ,
"TREATMENT_DEST_NOT_LINKED" : "آن سازمان لابراتوار متصل فعال نیست." ,
"TREATMENT_TEETH_REQUIRED_TO_SHIP" : "قبل از ارسال به لابراتوار دندانها را انتخاب کنید." ,
"TREATMENT_TOOTH_UNKNOWN_DETAIL" : "یک دندان به جزء درمان ناشناخته لینک شده است." ,
"TREATMENT_TOOTH_NOT_ON_DETAIL" : "دندان انتخابشده روی این جزء درمان نیست." ,
"TREATMENT_CASE_NO_DEST" : "این کیس لابراتوار مقصد ندارد." ,
"TREATMENT_CASE_NEEDS_DETAIL" : "کیس لابراتوار باید شامل یک جزء درمان باشد." ,
"TREATMENT_CASE_ONE_DETAIL" : "کیس لابراتوار فقط میتواند یک جزء درمان داشته باشد." ,
"TREATMENT_ONLY_PROVIDER_SEND" : "فقط ارائهدهنده درمان میتواند این کیس را ارسال کند." ,
"TREATMENT_CASE_ALREADY_SENT" : "این کیس قبلاً به آن لابراتوار ارسال شده است." ,
"TREATMENT_DUE_DATE_LOCKED" : "پس از تکمیل همه کارها نمیتوان موعد را تغییر داد." ,
"TREATMENT_INVALID_DUE_DATE" : "موعد نامعتبر است." ,
"TREATMENT_DETAIL_KEY_REQUIRED" : "برای این بارگذاری یک جزء درمان لازم است." ,
"TREATMENT_FILE_REQUIRED" : "حداقل یک فایل لازم است." ,
"TREATMENT_ATTACHMENT_NOT_FOUND" : "پیوست یافت نشد." ,
"TREATMENT_FILE_UNAVAILABLE" : "این فایل دیگر در دسترس نیست." ,
"TREATMENT_CASE_INVALID_ATTACHMENTS" : "یک یا چند پیوست برای این کیس معتبر نیست." ,
"TREATMENT_TOOTH_PROSTHESIS_INCOMPLETE" : "قبل از ارسال، هر دندان باید نوع پروتز داشته باشد." ,
"LAB_CASE_NOT_FOUND" : "کیس لابراتوار یافت نشد." ,
"TASK_ASSIGNEE_INVALID" : "فرد انتخابشده را نمیتوان به این کار تخصیص داد." ,
"TASK_ASSIGNED_TO_OTHER" : "این کار به عضو دیگری تخصیص داده شده است." ,
"TASK_PAGE_DATE_SORT_ONLY" : "پرش به کار در فهرست فقط وقتی مرتبسازی بر اساس تاریخ است ممکن است." ,
"INVALID_SENT_FROM" : "تاریخ شروع بازه نامعتبر است." ,
"INVALID_SENT_TO" : "تاریخ پایان بازه نامعتبر است." ,
"CASE_NOT_FOUND" : "کیس یافت نشد." ,
"CASE_ATTACHMENT_NOT_FOUND" : "پیوست یافت نشد." ,
"CASE_ATTACHMENT_MISSING_FILE" : "فایل پیوست موجود نیست." ,
"CASE_TASK_NOT_FOUND" : "کار یافت نشد." ,
"COMMENT_NOT_FOUND" : "نظر یافت نشد." ,
"COMMENT_VISIBILITY_LAB_ONLY" : "فقط نظرات لابراتوار میتوانند وضعیت نمایش را تغییر دهند." ,
"TODAY_INVALID_RANGE" : "بازه تاریخ نامعتبر است." ,
"TODAY_INVALID_RANGE_ORDER" : "پایان بازه باید بعد از شروع باشد." ,
2026-07-12 18:27:38 +03:30
"NOT_FOUND" : "مورد درخواستی یافت نشد." ,
"CONFLICT" : "این عمل با دادههای موجود در تضاد است." ,
"CONFLICT_FUTURE_APPOINTMENTS" : "تا وقتی نوبتهای آینده دارید نمیتوانید مشارکت در درمان را متوقف کنید. ابتدا آنها را لغو یا واگذار کنید." ,
2026-07-12 22:07:11 +03:30
"APPOINTMENT_PATIENT_LOCKED" : "تا وقتی درمانی به این نوبت متصل است، امکان تغییر بیمار وجود ندارد." ,
2026-07-16 22:35:02 +03:30
"APPOINTMENT_HAS_TREATMENT" : "بهدلیل وجود درمان مرتبط با این نوبت، امکان حذف آن وجود ندارد." ,
2026-07-16 22:45:37 +03:30
"TREATMENT_DETAIL_SENT" : "این جزئیات به لابراتوار ارسال شده و دیگر قابل تغییر نیست." ,
2026-08-19 15:05:58 +03:30
"TREATMENT_NOT_FOUND" : "درمان پیدا نشد." ,
"TREATMENT_PATIENT_OR_WALK_IN" : "یک بیمار انتخاب کنید یا درمان بدون نوبت بسازید." ,
"TREATMENT_NOT_STANDALONE" : "فقط درمانهای بدون نوبت را میتوان اینگونه حذف کرد." ,
"TREATMENT_HAS_DETAILS" : "این درمان جزئیات دارد و قابل حذف نیست." ,
"LAB_CASE_NOT_EDITABLE" : "این پرونده دیگر قابل ویرایش نیست." ,
"LAB_CASE_ALREADY_STARTED" : "این پرونده قبلاً شروع شده است." ,
"LAB_CASE_LINES_REQUIRED" : "حداقل یک خط کار با دندان و نوع پروتز اضافه کنید." ,
"LAB_CASE_START_INCOMPLETE" : "قبل از شروع پرونده، دندانها و نوع پروتز را کامل کنید." ,
"LAB_CASE_CLIENT_REQUIRED" : "نام کلینیک یا نام بیمار را وارد کنید." ,
2026-07-12 18:27:38 +03:30
"BAD_REQUEST" : "درخواست قابل پردازش نبود." ,
feat(backend): voice extraction endpoint
POST /voice/extract behind JwtAuthGuard + ClinicOrgGuard, plus
GET /voice/availability so the frontend can decide whether to render the
microphone — it cannot learn that from NEXT_PUBLIC_*, which are baked in at
build time.
Audio is held in memory for the request only: never written to disk, never a
Prisma row. The transcript goes back to the client and is not persisted. What
is logged is structured and patient-free — clip length, which fields resolved,
unresolved count, vendor cost, outcome — with log lines as the interim sink
until this repo has metrics infrastructure.
On extraction failure the transcript still travels back in the error details,
so the words the clinician already paid for can be salvaged into a note.
v1 ships ungated beyond a configured locale profile; the Plan.features design
is deferred, not dropped.
From review of this commit, four of which were load-bearing:
- Express's 100 kb default body limit rejected any recording past ~20 seconds,
making the endpoint unusable at its own 2-minute cap. Body parsers are now
registered explicitly with a 10 MB limit scoped to the voice route only.
Verified empirically: 600 KB reaches /api/voice/extract, while /api/auth/login
still 413s.
- ThrottlerGuard keys on req.ip, so behind nginx the whole deployment would
share one bucket and an abuser rotating IPs would bypass it. VoiceThrottlerGuard
keys on the user id instead — with no plan gate, this is the only control on
metered vendor spend.
- ThrottlerException had no 429 fallback and surfaced as INTERNAL_ERROR; the
guard now throws VOICE_RATE_LIMITED directly.
- durationMs was optional, so omitting it bypassed VOICE_MAX_RECORDING_MS
entirely. It is required.
- VOICE_UNSUPPORTED_FORMAT was dead code — the DTO's @IsIn already rejects
unknown containers — so it is gone rather than left unreachable.
ThrottlerModule is deliberately not bound as a global APP_GUARD: a global
ThrottlerGuard rate-limits every route against every named throttler, which
would have capped the whole API at the voice limit.
All seven remaining VOICE_* codes have errors.* keys in en, fa and nl.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-20 18:27:14 +03:30
"INTERNAL_ERROR" : "مشکلی در سرور رخ داد. لطفاً بعداً تلاش کنید." ,
"VOICE_MIC_DENIED" : "دسترسی به میکروفون مسدود شده است. در تنظیمات مرورگر اجازه دهید و دوباره تلاش کنید." ,
"VOICE_NOT_AVAILABLE" : "ثبت گفتاری هنوز برای این زبان در دسترس نیست." ,
"VOICE_CLIP_TOO_LONG" : "مدت ضبط بیش از حد است. لطفاً کمتر از دو دقیقه صحبت کنید." ,
"VOICE_ASR_FAILED" : "تبدیل گفتار به متن انجام نشد. لطفاً دوباره تلاش کنید." ,
"VOICE_EXTRACT_FAILED" : "اطلاعات درمان از روی گفتار استخراج نشد." ,
"VOICE_NOTHING_RECOGNIZED" : "گفتاری شناسایی نشد. میکروفون را بررسی کنید و دوباره تلاش کنید." ,
"VOICE_RATE_LIMITED" : "تعداد ضبطها در بازه کوتاه زیاد بود. کمی صبر کنید."
2026-06-20 12:37:38 +03:30
}
feat(backend): voice extraction endpoint
POST /voice/extract behind JwtAuthGuard + ClinicOrgGuard, plus
GET /voice/availability so the frontend can decide whether to render the
microphone — it cannot learn that from NEXT_PUBLIC_*, which are baked in at
build time.
Audio is held in memory for the request only: never written to disk, never a
Prisma row. The transcript goes back to the client and is not persisted. What
is logged is structured and patient-free — clip length, which fields resolved,
unresolved count, vendor cost, outcome — with log lines as the interim sink
until this repo has metrics infrastructure.
On extraction failure the transcript still travels back in the error details,
so the words the clinician already paid for can be salvaged into a note.
v1 ships ungated beyond a configured locale profile; the Plan.features design
is deferred, not dropped.
From review of this commit, four of which were load-bearing:
- Express's 100 kb default body limit rejected any recording past ~20 seconds,
making the endpoint unusable at its own 2-minute cap. Body parsers are now
registered explicitly with a 10 MB limit scoped to the voice route only.
Verified empirically: 600 KB reaches /api/voice/extract, while /api/auth/login
still 413s.
- ThrottlerGuard keys on req.ip, so behind nginx the whole deployment would
share one bucket and an abuser rotating IPs would bypass it. VoiceThrottlerGuard
keys on the user id instead — with no plan gate, this is the only control on
metered vendor spend.
- ThrottlerException had no 429 fallback and surfaced as INTERNAL_ERROR; the
guard now throws VOICE_RATE_LIMITED directly.
- durationMs was optional, so omitting it bypassed VOICE_MAX_RECORDING_MS
entirely. It is required.
- VOICE_UNSUPPORTED_FORMAT was dead code — the DTO's @IsIn already rejects
unknown containers — so it is gone rather than left unreachable.
ThrottlerModule is deliberately not bound as a global APP_GUARD: a global
ThrottlerGuard rate-limits every route against every named throttler, which
would have capped the whole API at the voice limit.
All seven remaining VOICE_* codes have errors.* keys in en, fa and nl.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-20 18:27:14 +03:30
}