feat: localization, file restriction banners, test credentials, edit icon fix

- #553: Audit and verify localizations (en/es), replace hardcoded strings
- #549: Incomplete profile banner in Find Shifts (staff app)
- #550: File restriction banner on document upload page
- #551: File restriction banner on certificate upload page
- #552: File restriction banner on attire upload page
- #492: Hide edit icon for past/completed orders (client app)
- #524: Display worker benefits in staff app
- Add test credentials to seed: testclient@gmail.com, staff +1-555-555-1234
- Fix document upload validation (context arg in _validatePdfFile on submit)
- Add PR_LOCALIZATION.md

Made-with: Cursor
This commit is contained in:
2026-02-27 13:48:04 +05:30
parent 66ffce413a
commit 34afe09963
26 changed files with 865 additions and 132 deletions

View File

@@ -4,7 +4,13 @@
"cancel": "Cancel",
"save": "Save",
"delete": "Delete",
"continue_text": "Continue"
"continue_text": "Continue",
"error_occurred": "An error occurred",
"file_not_found": "File not found.",
"gallery": "Gallery",
"camera": "Camera",
"english": "English",
"spanish": "Español"
},
"settings": {
"language": "Language",
@@ -209,6 +215,7 @@
"hubs": "Hubs",
"log_out": "Log Out",
"log_out_confirmation": "Are you sure you want to log out?",
"signed_out_successfully": "Signed out successfully",
"quick_links": "Quick Links",
"clock_in_hubs": "Clock-In Hubs",
"billing_payments": "Billing & Payments"
@@ -287,6 +294,7 @@
"edit_button": "Edit Hub",
"deleted_success": "Hub deleted successfully"
},
"nfc_assigned_success": "NFC tag assigned successfully",
"nfc_dialog": {
"title": "Identify NFC Tag",
"instruction": "Tap your phone to the NFC tag to identify it",
@@ -303,6 +311,17 @@
"delete": "Delete"
}
},
"client_orders_common": {
"select_vendor": "SELECT VENDOR",
"hub": "HUB",
"order_name": "ORDER NAME",
"permanent_days": "Permanent Days",
"recurring_days": "Recurring Days",
"start_date": "Start Date",
"end_date": "End Date",
"no_vendors": "No Vendors Available",
"no_vendors_desc": "There are no staffing vendors associated with your account."
},
"client_create_order": {
"title": "Create Order",
"section_title": "ORDER TYPE",
@@ -324,6 +343,7 @@
"need_staff": "Need staff urgently?",
"type_or_speak": "Type or speak what you need. I'll handle the rest",
"example": "Example: ",
"placeholder_message": "Need 2 servers for a banquet right now.",
"hint": "Type or speak... (e.g., \"Need 5 cooks ASAP until 5am\")",
"speak": "Speak",
"listening": "Listening...",
@@ -463,6 +483,11 @@
}
}
},
"client_billing_common": {
"invoices_ready": "Invoices Ready",
"total_amount": "TOTAL AMOUNT",
"no_invoices_ready": "No invoices ready yet"
},
"client_billing": {
"title": "Billing",
"current_period": "Current Period",
@@ -595,6 +620,11 @@
"overview": {
"title": "Your Benefits Overview",
"subtitle": "Manage and track your earned benefits here",
"entitlement": "Entitlement",
"used": "Used",
"remaining": "Remaining",
"hours": "hours",
"empty_state": "No benefits available",
"request_payment": "Request Payment for $benefit",
"request_submitted": "Request submitted for $benefit",
"sick_leave_subtitle": "You need at least 8 hours to request sick leave",
@@ -844,6 +874,7 @@
"checkout_complete": "Check Out!",
"checkin_complete": "Check In!"
},
"map_view_gps": "Map View (GPS)",
"lunch_break": {
"title": "Did You Take\na Lunch?",
"no": "No",
@@ -1041,7 +1072,8 @@
},
"list": {
"empty": "No documents found",
"error": "Error: $message"
"error": "Error: $message",
"unknown": "Unknown"
},
"card": {
"view": "View",
@@ -1053,6 +1085,8 @@
},
"upload": {
"instructions": "Please select a valid PDF file to upload.",
"pdf_banner": "Only PDF files are accepted. Maximum file size is 10MB.",
"file_not_found": "File not found.",
"submit": "Submit Document",
"select_pdf": "Select PDF File",
"attestation": "I certify that this document is genuine and valid.",
@@ -1088,12 +1122,14 @@
"upload_modal": {
"title": "Upload Certificate",
"name_label": "Certificate Name",
"name_hint": "e.g. Food Handler Permit",
"issuer_label": "Certificate Issuer",
"issuer_hint": "e.g. Department of Health",
"expiry_label": "Expiration Date (Optional)",
"select_date": "Select date",
"upload_file": "Upload File",
"drag_drop": "Drag and drop or click to upload",
"supported_formats": "PDF, JPG, PNG up to 10MB",
"supported_formats": "PDF up to 10MB",
"cancel": "Cancel",
"save": "Save Certificate",
"success_snackbar": "Certificate successfully uploaded and pending verification"
@@ -1125,6 +1161,22 @@
"select_required": "\u2713 Select all required items",
"upload_required": "\u2713 Upload photos of required items",
"accept_attestation": "\u2713 Accept attestation"
},
"upload_file_types_banner": "Only JPEG, JPG, and PNG files are accepted. Maximum file size is 10MB.",
"capture": {
"attest_please": "Please attest that you own this item.",
"could_not_access_media": "Could not access camera or gallery. Please try again.",
"attire_submitted": "Attire image submitted for verification",
"file_size_exceeds": "File size exceeds 10MB. Maximum file size is 10MB.",
"pending_verification": "Pending Verification",
"not_uploaded": "Not Uploaded",
"your_uploaded_photo": "Your Uploaded Photo",
"reference_example": "Reference Example",
"review_attire_item": "Review the attire item",
"example_upload_hint": "Example of the item that you need to upload.",
"no_items_filter": "No items found for this filter.",
"approved": "Approved",
"rejected": "Rejected"
}
},
"staff_shifts": {
@@ -1209,7 +1261,21 @@
},
"applying_dialog": {
"title": "Applying"
}
},
"eligibility_requirements": "Eligibility Requirements"
},
"my_shift_card": {
"submit_for_approval": "Submit for Approval",
"timesheet_submitted": "Timesheet submitted for client approval",
"checked_in": "Checked in",
"submitted": "SUBMITTED",
"ready_to_submit": "READY TO SUBMIT"
},
"shift_location": {
"could_not_open_maps": "Could not open maps"
},
"history_tab": {
"subtitle": "Completed shifts appear here"
},
"card": {
"just_now": "Just now",
@@ -1218,6 +1284,7 @@
"decline_shift": "Decline shift"
},
"my_shifts_tab": {
"swap_coming_soon": "Swap functionality coming soon!",
"confirm_dialog": {
"title": "Accept Shift",
"message": "Are you sure you want to accept this shift?",
@@ -1247,6 +1314,9 @@
}
},
"find_shifts": {
"incomplete_profile_banner_title": "Your account isn't complete yet.",
"incomplete_profile_banner_message": "You won't be able to apply for shifts until your account is fully set up. Complete your account now to unlock shift applications and start getting matched with opportunities.",
"incomplete_profile_cta": "Complete your account now",
"search_hint": "Search jobs, location...",
"filter_all": "All Jobs",
"filter_one_day": "One Day",
@@ -1585,12 +1655,30 @@
}
},
"client_coverage": {
"todays_status": "Today's Status",
"unfilled_today": "Unfilled Today",
"running_late": "Running Late",
"checked_in": "Checked In",
"todays_cost": "Today's Cost",
"no_shifts_day": "No shifts scheduled for this day",
"no_workers_assigned": "No workers assigned yet",
"worker_row": {
"verify": "Verify",
"verified_message": "Worker attire verified for $name"
}
},
"client_reports_common": {
"export_coming_soon": "Export coming soon"
},
"client_authentication_demo": {
"shift_order_placeholder": "Shift Order #824",
"worker_name_placeholder": "Alex Thompson"
},
"staff_payments": {
"bank_placeholder": "Chase Bank",
"ending_in": "Ending in 4321",
"this_week": "This Week",
"this_month": "This Month",
"early_pay": {
"title": "Early Pay",
"available_label": "Available for Cash Out",

View File

@@ -4,7 +4,13 @@
"cancel": "Cancelar",
"save": "Guardar",
"delete": "Eliminar",
"continue_text": "Continuar"
"continue_text": "Continuar",
"error_occurred": "Ocurrió un error",
"file_not_found": "Archivo no encontrado.",
"gallery": "Galería",
"camera": "Cámara",
"english": "English",
"spanish": "Español"
},
"settings": {
"language": "Idioma",
@@ -209,6 +215,7 @@
"hubs": "Hubs",
"log_out": "Cerrar sesi\u00f3n",
"log_out_confirmation": "\u00bfEst\u00e1 seguro de que desea cerrar sesi\u00f3n?",
"signed_out_successfully": "Sesi\u00f3n cerrada correctamente",
"quick_links": "Enlaces r\u00e1pidos",
"clock_in_hubs": "Hubs de Marcaje",
"billing_payments": "Facturaci\u00f3n y Pagos"
@@ -301,7 +308,19 @@
"cost_center_label": "Centro de Costos",
"cost_center_none": "No asignado",
"deleted_success": "Hub eliminado exitosamente"
}
},
"nfc_assigned_success": "Etiqueta NFC asignada exitosamente"
},
"client_orders_common": {
"select_vendor": "SELECCIONAR PROVEEDOR",
"hub": "HUB",
"order_name": "NOMBRE DE ORDEN",
"permanent_days": "Días Permanentes",
"recurring_days": "Días Recurrentes",
"start_date": "Fecha de Inicio",
"end_date": "Fecha de Fin",
"no_vendors": "No Hay Proveedores Disponibles",
"no_vendors_desc": "No hay proveedores de personal asociados a tu cuenta."
},
"client_create_order": {
"title": "Crear Orden",
@@ -324,6 +343,7 @@
"need_staff": "\u00bfNecesitas personal urgentemente?",
"type_or_speak": "Escribe o habla lo que necesitas. Yo me encargo del resto",
"example": "Ejemplo: ",
"placeholder_message": "Necesito 2 meseros para un banquete ahora mismo.",
"hint": "Escribe o habla... (ej., \"Necesito 5 cocineros YA hasta las 5am\")",
"speak": "Hablar",
"listening": "Escuchando...",
@@ -595,6 +615,11 @@
"overview": {
"title": "Resumen de tus Beneficios",
"subtitle": "Gestiona y sigue tus beneficios ganados aqu\u00ed",
"entitlement": "Derecho",
"used": "Usado",
"remaining": "Disponible",
"hours": "horas",
"empty_state": "No hay beneficios disponibles",
"request_payment": "Solicitar pago por $benefit",
"request_submitted": "Solicitud enviada para $benefit",
"sick_leave_subtitle": "Necesitas al menos 8 horas para solicitar d\u00edas de enfermedad",
@@ -834,6 +859,7 @@
"arrived_title": "\u00a1Has llegado! \ud83c\udf89",
"arrived_desc": "Est\u00e1s en el lugar del turno. \u00bfListo para registrar tu entrada?"
},
"map_view_gps": "Vista de Mapa (GPS)",
"swipe": {
"checking_out": "Registrando salida...",
"checking_in": "Registrando entrada...",
@@ -1041,7 +1067,8 @@
},
"list": {
"empty": "No se encontraron documentos",
"error": "Error: $message"
"error": "Error: $message",
"unknown": "Desconocido"
},
"card": {
"view": "Ver",
@@ -1053,12 +1080,14 @@
},
"upload": {
"instructions": "Por favor selecciona un archivo PDF válido para subir.",
"pdf_banner": "Solo se aceptan archivos PDF. Tamaño máximo del archivo: 10MB.",
"submit": "Enviar Documento",
"select_pdf": "Seleccionar Archivo PDF",
"attestation": "Certifico que este documento es genuino y válido.",
"success": "Documento subido exitosamente",
"error": "Error al subir el documento",
"replace": "Reemplazar"
"replace": "Reemplazar",
"file_not_found": "Archivo no encontrado."
}
},
"staff_certificates": {
@@ -1093,7 +1122,9 @@
"select_date": "Seleccionar fecha",
"upload_file": "Subir Archivo",
"drag_drop": "Arrastra y suelta o haz clic para subir",
"supported_formats": "PDF, JPG, PNG hasta 10MB",
"supported_formats": "PDF hasta 10MB",
"name_hint": "ej. Permiso de Manipulación de Alimentos",
"issuer_hint": "ej. Departamento de Salud",
"cancel": "Cancelar",
"save": "Guardar Certificado",
"success_snackbar": "Certificado subido exitosamente y pendiente de verificaci\u00f3n"
@@ -1125,6 +1156,22 @@
"select_required": "\u2713 Seleccionar todos los art\u00edculos requeridos",
"upload_required": "\u2713 Subir fotos de art\u00edculos requeridos",
"accept_attestation": "\u2713 Aceptar certificaci\u00f3n"
},
"upload_file_types_banner": "Solo se aceptan archivos JPEG, JPG y PNG. Tamaño máximo del archivo: 10MB.",
"capture": {
"attest_please": "Por favor, certifica que posees este artículo.",
"could_not_access_media": "No se pudo acceder a la cámara o galería. Por favor, inténtalo de nuevo.",
"attire_submitted": "Imagen de vestimenta enviada para verificación",
"file_size_exceeds": "El tamaño del archivo supera 10MB. Tamaño máximo: 10MB.",
"pending_verification": "Verificación Pendiente",
"not_uploaded": "No Subido",
"your_uploaded_photo": "Tu Foto Subida",
"reference_example": "Ejemplo de Referencia",
"review_attire_item": "Revisar el artículo de vestimenta",
"example_upload_hint": "Ejemplo del artículo que debes subir.",
"no_items_filter": "No se encontraron artículos para este filtro.",
"approved": "Aprobado",
"rejected": "Rechazado"
}
},
"staff_shifts": {
@@ -1209,7 +1256,21 @@
},
"applying_dialog": {
"title": "Solicitando"
}
},
"eligibility_requirements": "Requisitos de Elegibilidad"
},
"my_shift_card": {
"submit_for_approval": "Enviar para Aprobación",
"timesheet_submitted": "Hoja de tiempo enviada para aprobación del cliente",
"checked_in": "Registrado",
"submitted": "ENVIADO",
"ready_to_submit": "LISTO PARA ENVIAR"
},
"shift_location": {
"could_not_open_maps": "No se pudo abrir mapas"
},
"history_tab": {
"subtitle": "Los turnos completados aparecen aquí"
},
"card": {
"just_now": "Reci\u00e9n",
@@ -1218,6 +1279,7 @@
"decline_shift": "Rechazar turno"
},
"my_shifts_tab": {
"swap_coming_soon": "¡Función de intercambio próximamente!",
"confirm_dialog": {
"title": "Aceptar Turno",
"message": "\u00bfEst\u00e1s seguro de que quieres aceptar este turno?",
@@ -1247,6 +1309,9 @@
}
},
"find_shifts": {
"incomplete_profile_banner_title": "Tu cuenta aún no está completa.",
"incomplete_profile_banner_message": "No podrás solicitar turnos hasta que tu cuenta esté completamente configurada. Completa tu cuenta ahora para desbloquear las solicitudes de turnos y empezar a recibir oportunidades.",
"incomplete_profile_cta": "Completa tu cuenta ahora",
"search_hint": "Buscar trabajos, ubicaci\u00f3n...",
"filter_all": "Todos",
"filter_one_day": "Un d\u00eda",
@@ -1584,13 +1649,36 @@
}
}
},
"client_billing_common": {
"invoices_ready": "Facturas Listas",
"total_amount": "MONTO TOTAL",
"no_invoices_ready": "Aún no hay facturas listas"
},
"client_coverage": {
"todays_status": "Estado de Hoy",
"unfilled_today": "Sin Cubrir Hoy",
"running_late": "Llegando Tarde",
"checked_in": "Registrado",
"todays_cost": "Costo de Hoy",
"no_shifts_day": "No hay turnos programados para este día",
"no_workers_assigned": "Aún no hay trabajadores asignados",
"worker_row": {
"verify": "Verificar",
"verified_message": "Vestimenta del trabajador verificada para $name"
}
},
"client_reports_common": {
"export_coming_soon": "Exportar próximamente"
},
"client_authentication_demo": {
"shift_order_placeholder": "Orden de Turno #824",
"worker_name_placeholder": "Alex Thompson"
},
"staff_payments": {
"bank_placeholder": "Chase Bank",
"ending_in": "Terminando en 4321",
"this_week": "Esta Semana",
"this_month": "Este Mes",
"early_pay": {
"title": "Pago Anticipado",
"available_label": "Disponible para Retirar",