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:
soroush.asadi
2026-06-02 00:04:48 +03:30
parent 7519f474f3
commit 75d5bbc84a
9 changed files with 123 additions and 19 deletions
+27
View File
@@ -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": "ميزي"
},