fix(i18n): localize API error messages by code (no more raw English)
Error toasts surfaced the raw English backend message. Added an errors namespace (fa/ar/en) keyed by error code + a useApiError() resolver that maps ApiClientError.code to the localized message (fallback to a localized generic). Wired into menu, tables, demo banner, and subscription checkout; hardened getErrorMessage so it never returns the raw backend message. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -20,6 +20,33 @@
|
||||
"saved": "تم الحفظ",
|
||||
"errorGeneric": "حدث خطأ. حاول مرة أخرى."
|
||||
},
|
||||
"errors": {
|
||||
"generic": "حدث خطأ. حاول مرة أخرى.",
|
||||
"REQUEST_FAILED": "فشل الطلب. حاول مرة أخرى.",
|
||||
"VALIDATION_ERROR": "البيانات المدخلة غير صالحة.",
|
||||
"FORBIDDEN": "ليس لديك إذن للقيام بذلك.",
|
||||
"OWNER_REQUIRED": "يمكن لمالك المقهى فقط القيام بذلك.",
|
||||
"MANAGER_REQUIRED": "يتطلب هذا الإجراء صلاحية المدير.",
|
||||
"PLAN_LIMIT_REACHED": "لقد بلغت حد باقتك. قم بالترقية للمتابعة.",
|
||||
"PLAN_FEATURE_DISABLED": "هذه الميزة غير متاحة في باقتك الحالية.",
|
||||
"NOT_FOUND": "غير موجود.",
|
||||
"ORDER_NOT_FOUND": "الطلب غير موجود.",
|
||||
"ITEM_NOT_FOUND": "العنصر غير موجود.",
|
||||
"ITEM_ALREADY_VOIDED": "تم إلغاء هذا العنصر بالفعل.",
|
||||
"ORDER_ALREADY_CLOSED": "هذا الطلب مغلق بالفعل.",
|
||||
"TABLE_OCCUPIED": "هذه الطاولة مشغولة حاليًا.",
|
||||
"TABLE_CLEANING": "هذه الطاولة قيد التنظيف.",
|
||||
"TABLE_NOT_FOUND": "الطاولة غير موجودة.",
|
||||
"TABLE_HAS_OPEN_ORDER": "هذه الطاولة لديها طلب مفتوح ولا يمكن حذفها.",
|
||||
"TABLE_SECTION_HAS_TABLES": "يحتوي هذا القسم على طاولات ولا يمكن حذفه.",
|
||||
"BRANCH_NOT_FOUND": "الفرع غير موجود.",
|
||||
"SECTION_NOT_FOUND": "القسم غير موجود.",
|
||||
"RATE_LIMITED": "طلبات كثيرة جدًا. يرجى الانتظار قليلاً.",
|
||||
"SMS_FAILED": "تعذّر إرسال الرسالة القصيرة. حاول مرة أخرى.",
|
||||
"INVALID_OTP": "رمز التحقق غير صالح أو منتهي الصلاحية.",
|
||||
"TICKET_CLOSED": "هذه التذكرة مغلقة ولا يمكنها استقبال الرسائل.",
|
||||
"ALREADY_REGISTERED": "يوجد حساب بالفعل لهذا الرقم. يرجى تسجيل الدخول."
|
||||
},
|
||||
"brand": {
|
||||
"name": "ميزي"
|
||||
},
|
||||
|
||||
@@ -20,6 +20,33 @@
|
||||
"saved": "Saved",
|
||||
"errorGeneric": "Something went wrong. Please try again."
|
||||
},
|
||||
"errors": {
|
||||
"generic": "Something went wrong. Please try again.",
|
||||
"REQUEST_FAILED": "Request failed. Please try again.",
|
||||
"VALIDATION_ERROR": "The information entered is invalid.",
|
||||
"FORBIDDEN": "You don't have permission to do this.",
|
||||
"OWNER_REQUIRED": "Only the café owner can do this.",
|
||||
"MANAGER_REQUIRED": "This action requires manager access.",
|
||||
"PLAN_LIMIT_REACHED": "You've reached your plan limit. Upgrade to continue.",
|
||||
"PLAN_FEATURE_DISABLED": "This feature isn't available on your current plan.",
|
||||
"NOT_FOUND": "Not found.",
|
||||
"ORDER_NOT_FOUND": "Order not found.",
|
||||
"ITEM_NOT_FOUND": "Item not found.",
|
||||
"ITEM_ALREADY_VOIDED": "This item is already voided.",
|
||||
"ORDER_ALREADY_CLOSED": "This order is already closed.",
|
||||
"TABLE_OCCUPIED": "This table is currently occupied.",
|
||||
"TABLE_CLEANING": "This table is being cleaned.",
|
||||
"TABLE_NOT_FOUND": "Table not found.",
|
||||
"TABLE_HAS_OPEN_ORDER": "This table has an open order and can't be removed.",
|
||||
"TABLE_SECTION_HAS_TABLES": "This section has tables and can't be removed.",
|
||||
"BRANCH_NOT_FOUND": "Branch not found.",
|
||||
"SECTION_NOT_FOUND": "Section not found.",
|
||||
"RATE_LIMITED": "Too many requests. Please wait a moment.",
|
||||
"SMS_FAILED": "Could not send the SMS. Please try again.",
|
||||
"INVALID_OTP": "Invalid or expired verification code.",
|
||||
"TICKET_CLOSED": "This ticket is closed and can't receive messages.",
|
||||
"ALREADY_REGISTERED": "An account already exists for this number. Please sign in."
|
||||
},
|
||||
"brand": {
|
||||
"name": "Meezi"
|
||||
},
|
||||
|
||||
@@ -20,6 +20,33 @@
|
||||
"saved": "ذخیره شد",
|
||||
"errorGeneric": "خطایی رخ داد. دوباره تلاش کنید."
|
||||
},
|
||||
"errors": {
|
||||
"generic": "خطایی رخ داد. دوباره تلاش کنید.",
|
||||
"REQUEST_FAILED": "درخواست ناموفق بود. دوباره تلاش کنید.",
|
||||
"VALIDATION_ERROR": "اطلاعات واردشده نامعتبر است.",
|
||||
"FORBIDDEN": "شما اجازه این کار را ندارید.",
|
||||
"OWNER_REQUIRED": "فقط مالک کافه میتواند این کار را انجام دهد.",
|
||||
"MANAGER_REQUIRED": "این عملیات نیاز به دسترسی مدیر دارد.",
|
||||
"PLAN_LIMIT_REACHED": "محدودیت پلن شما پر شده است. برای ادامه پلن را ارتقا دهید.",
|
||||
"PLAN_FEATURE_DISABLED": "این قابلیت در پلن فعلی شما فعال نیست.",
|
||||
"NOT_FOUND": "مورد موردنظر یافت نشد.",
|
||||
"ORDER_NOT_FOUND": "سفارش یافت نشد.",
|
||||
"ITEM_NOT_FOUND": "آیتم یافت نشد.",
|
||||
"ITEM_ALREADY_VOIDED": "این آیتم قبلاً ابطال شده است.",
|
||||
"ORDER_ALREADY_CLOSED": "این سفارش بسته شده است.",
|
||||
"TABLE_OCCUPIED": "این میز هماکنون مشغول است.",
|
||||
"TABLE_CLEANING": "این میز در حال نظافت است.",
|
||||
"TABLE_NOT_FOUND": "میز یافت نشد.",
|
||||
"TABLE_HAS_OPEN_ORDER": "این میز سفارش باز دارد و قابل حذف نیست.",
|
||||
"TABLE_SECTION_HAS_TABLES": "این بخش دارای میز است و قابل حذف نیست.",
|
||||
"BRANCH_NOT_FOUND": "شعبه یافت نشد.",
|
||||
"SECTION_NOT_FOUND": "بخش یافت نشد.",
|
||||
"RATE_LIMITED": "تعداد درخواست بیش از حد مجاز است. کمی صبر کنید.",
|
||||
"SMS_FAILED": "ارسال پیامک ناموفق بود. دوباره تلاش کنید.",
|
||||
"INVALID_OTP": "کد تأیید نامعتبر یا منقضی شده است.",
|
||||
"TICKET_CLOSED": "این تیکت بسته شده و امکان ارسال پیام ندارد.",
|
||||
"ALREADY_REGISTERED": "برای این شماره قبلاً حساب ساخته شده است. وارد شوید."
|
||||
},
|
||||
"brand": {
|
||||
"name": "میزی"
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user