Files
PROJECT-CONTORL/frontend/public/locales/en/common.json
beabigegg 679b89ae4c feat: implement security, error resilience, and query optimization proposals
Security Validation (enhance-security-validation):
- JWT secret validation with entropy checking and pattern detection
- CSRF protection middleware with token generation/validation
- Frontend CSRF token auto-injection for DELETE/PUT/PATCH requests
- MIME type validation with magic bytes detection for file uploads

Error Resilience (add-error-resilience):
- React ErrorBoundary component with fallback UI and retry functionality
- ErrorBoundaryWithI18n wrapper for internationalization support
- Page-level and section-level error boundaries in App.tsx

Query Performance (optimize-query-performance):
- Query monitoring utility with threshold warnings
- N+1 query fixes using joinedload/selectinload
- Optimized project members, tasks, and subtasks endpoints

Bug Fixes:
- WebSocket session management (P0): Return primitives instead of ORM objects
- LIKE query injection (P1): Escape special characters in search queries

Tests: 543 backend tests, 56 frontend tests passing

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-11 18:41:19 +08:00

134 lines
3.7 KiB
JSON

{
"buttons": {
"save": "Save",
"cancel": "Cancel",
"delete": "Delete",
"edit": "Edit",
"create": "Create",
"close": "Close",
"confirm": "Confirm",
"back": "Back",
"next": "Next",
"previous": "Previous",
"submit": "Submit",
"reset": "Reset",
"search": "Search",
"filter": "Filter",
"export": "Export",
"import": "Import",
"refresh": "Refresh",
"add": "Add",
"remove": "Remove",
"view": "View",
"download": "Download",
"upload": "Upload"
},
"labels": {
"loading": "Loading...",
"noData": "No data",
"required": "Required",
"optional": "Optional",
"all": "All",
"none": "None",
"yes": "Yes",
"no": "No",
"active": "Active",
"inactive": "Inactive",
"enabled": "Enabled",
"disabled": "Disabled",
"actions": "Actions",
"details": "Details",
"description": "Description",
"name": "Name",
"title": "Title",
"status": "Status",
"type": "Type",
"date": "Date",
"time": "Time",
"createdAt": "Created at",
"updatedAt": "Updated at",
"createdBy": "Created by",
"assignee": "Assignee",
"selectAssignee": "Select assignee...",
"searchUsers": "Search users...",
"noUsersFound": "No users found",
"typeToSearch": "Type to search users",
"task": "Task",
"admin": "Admin",
"live": "Live",
"offline": "Offline"
},
"messages": {
"success": "Operation successful",
"error": "Operation failed",
"confirmDelete": "Are you sure you want to delete? This action cannot be undone.",
"unsavedChanges": "You have unsaved changes. Are you sure you want to leave?",
"networkError": "Network error. Please try again later.",
"sessionExpired": "Session expired. Please log in again.",
"permissionDenied": "You do not have permission to perform this action.",
"notFound": "The requested resource was not found."
},
"validation": {
"required": "This field is required",
"email": "Please enter a valid email address",
"minLength": "Minimum {{min}} characters required",
"maxLength": "Maximum {{max}} characters allowed",
"invalidFormat": "Invalid format"
},
"nav": {
"dashboard": "Dashboard",
"spaces": "Spaces",
"projects": "Projects",
"tasks": "Tasks",
"workload": "Workload",
"health": "Project Health",
"audit": "Audit Log",
"settings": "Settings",
"logout": "Logout",
"toggleMenu": "Toggle Menu",
"menu": "Menu"
},
"language": {
"switch": "Switch language",
"zhTW": "繁體中文",
"en": "English"
},
"notifications": {
"title": "Notifications",
"markAllRead": "Mark all as read",
"noNotifications": "No notifications",
"empty": "No notifications",
"viewAll": "View all",
"refresh": "Refresh",
"time": {
"justNow": "Just now",
"minutesAgo": "{{count}}m ago",
"hoursAgo": "{{count}}h ago",
"daysAgo": "{{count}}d ago"
}
},
"pagination": {
"page": "Page {{page}}",
"of": "of {{total}}",
"showing": "Showing {{from}}-{{to}} of {{total}}",
"itemsPerPage": "Items per page"
},
"errorBoundary": {
"retry": "Try Again",
"page": {
"title": "Something went wrong",
"message": "We apologize for the inconvenience. Please try refreshing the page or contact support if the problem persists."
},
"section": {
"title": "Unable to load this section",
"message": "This section encountered an error. Other parts of the page may still work.",
"messageWithName": "{{section}} encountered an error. Other parts of the page may still work."
},
"widget": {
"title": "Widget error",
"message": "Unable to display this widget.",
"errorSuffix": "error"
}
}
}