Phase 8: Visitor Management - Visitor/VisitorLog/AccessZone models - Check-in/out with badge generation - Zone occupancy tracking - Kiosk and management pages Phase 9: Messaging & Communication - Announcements with priority levels - Acknowledgement tracking - Shift notes for team handoffs - AnnouncementBanner component Phase 10: Compliance & Audit Trail - Immutable AuditLog model - Document versioning and approval workflow - Acknowledgement tracking for SOPs - CSV export for audit logs Phase 11: Accessibility & i18n - WCAG 2.1 AA compliance utilities - react-i18next with EN/ES translations - User preferences context (theme, font size, etc) - High contrast and reduced motion support Phase 12: Hardware Integration - QR code generation for batches/plants/visitors - Printable label system - Visitor badge printing Phase 13: Advanced Features - Environmental monitoring (sensors, readings, alerts) - Financial tracking (transactions, P&L reports) - AI/ML insights (yield predictions, anomaly detection)
375 lines
10 KiB
TypeScript
375 lines
10 KiB
TypeScript
import i18n from 'i18next';
|
|
import { initReactI18next } from 'react-i18next';
|
|
import LanguageDetector from 'i18next-browser-languagedetector';
|
|
|
|
// English translations
|
|
const enTranslations = {
|
|
common: {
|
|
loading: 'Loading...',
|
|
save: 'Save',
|
|
cancel: 'Cancel',
|
|
delete: 'Delete',
|
|
edit: 'Edit',
|
|
add: 'Add',
|
|
search: 'Search',
|
|
filter: 'Filter',
|
|
export: 'Export',
|
|
close: 'Close',
|
|
confirm: 'Confirm',
|
|
back: 'Back',
|
|
next: 'Next',
|
|
submit: 'Submit',
|
|
yes: 'Yes',
|
|
no: 'No',
|
|
ok: 'OK',
|
|
error: 'Error',
|
|
success: 'Success',
|
|
warning: 'Warning',
|
|
info: 'Info',
|
|
required: 'Required',
|
|
optional: 'Optional',
|
|
noData: 'No data available',
|
|
selectAll: 'Select all',
|
|
clearAll: 'Clear all',
|
|
},
|
|
nav: {
|
|
dashboard: 'Dashboard',
|
|
walkthrough: 'Walkthrough',
|
|
ipm: 'IPM',
|
|
tasks: 'Tasks',
|
|
reports: 'Reports',
|
|
inventory: 'Inventory',
|
|
timeclock: 'Time Clock',
|
|
rooms: 'Rooms',
|
|
batches: 'Batches',
|
|
quickActions: 'Quick Actions',
|
|
layout: 'Layout Designer',
|
|
visitors: 'Visitors',
|
|
roles: 'Roles',
|
|
settings: 'Settings',
|
|
logout: 'Logout',
|
|
},
|
|
auth: {
|
|
login: 'Login',
|
|
logout: 'Logout',
|
|
email: 'Email',
|
|
password: 'Password',
|
|
forgotPassword: 'Forgot password?',
|
|
rememberMe: 'Remember me',
|
|
loginFailed: 'Login failed. Please check your credentials.',
|
|
sessionExpired: 'Your session has expired. Please login again.',
|
|
},
|
|
dashboard: {
|
|
welcome: 'Welcome back',
|
|
todaysTasks: "Today's Tasks",
|
|
activeBatches: 'Active Batches',
|
|
upcomingHarvests: 'Upcoming Harvests',
|
|
recentActivity: 'Recent Activity',
|
|
quickStats: 'Quick Stats',
|
|
plantsTotal: 'Total Plants',
|
|
roomsActive: 'Active Rooms',
|
|
},
|
|
batches: {
|
|
title: 'Batches',
|
|
createBatch: 'Create Batch',
|
|
batchName: 'Batch Name',
|
|
strain: 'Strain',
|
|
stage: 'Stage',
|
|
plantCount: 'Plant Count',
|
|
startDate: 'Start Date',
|
|
harvestDate: 'Harvest Date',
|
|
status: 'Status',
|
|
stages: {
|
|
clone: 'Clone',
|
|
veg: 'Vegetative',
|
|
flower: 'Flowering',
|
|
dry: 'Drying',
|
|
cure: 'Curing',
|
|
harvest: 'Harvested',
|
|
},
|
|
},
|
|
tasks: {
|
|
title: 'Tasks',
|
|
createTask: 'Create Task',
|
|
taskName: 'Task Name',
|
|
assignee: 'Assignee',
|
|
dueDate: 'Due Date',
|
|
priority: 'Priority',
|
|
status: 'Status',
|
|
description: 'Description',
|
|
priorities: {
|
|
low: 'Low',
|
|
medium: 'Medium',
|
|
high: 'High',
|
|
urgent: 'Urgent',
|
|
},
|
|
statuses: {
|
|
pending: 'Pending',
|
|
inProgress: 'In Progress',
|
|
completed: 'Completed',
|
|
cancelled: 'Cancelled',
|
|
},
|
|
},
|
|
visitors: {
|
|
title: 'Visitor Management',
|
|
checkIn: 'Check In',
|
|
checkOut: 'Check Out',
|
|
onSite: 'On-Site',
|
|
badge: 'Badge',
|
|
purpose: 'Purpose of Visit',
|
|
escort: 'Escort',
|
|
company: 'Company',
|
|
types: {
|
|
visitor: 'Visitor',
|
|
contractor: 'Contractor',
|
|
inspector: 'Inspector',
|
|
vendor: 'Vendor',
|
|
delivery: 'Delivery',
|
|
},
|
|
},
|
|
compliance: {
|
|
title: 'Compliance',
|
|
auditLog: 'Audit Log',
|
|
documents: 'Documents',
|
|
acknowledge: 'Acknowledge',
|
|
acknowledged: 'Acknowledged',
|
|
pending: 'Pending',
|
|
sopLibrary: 'SOP Library',
|
|
policies: 'Policies',
|
|
},
|
|
messaging: {
|
|
announcements: 'Announcements',
|
|
shiftNotes: 'Shift Notes',
|
|
newAnnouncement: 'New Announcement',
|
|
priority: {
|
|
info: 'Info',
|
|
warning: 'Warning',
|
|
critical: 'Critical',
|
|
},
|
|
},
|
|
settings: {
|
|
title: 'Settings',
|
|
profile: 'Profile',
|
|
language: 'Language',
|
|
theme: 'Theme',
|
|
notifications: 'Notifications',
|
|
accessibility: 'Accessibility',
|
|
themes: {
|
|
light: 'Light',
|
|
dark: 'Dark',
|
|
system: 'System',
|
|
},
|
|
},
|
|
errors: {
|
|
generic: 'Something went wrong. Please try again.',
|
|
network: 'Network error. Please check your connection.',
|
|
notFound: 'Page not found.',
|
|
unauthorized: 'You are not authorized to perform this action.',
|
|
validation: 'Please check your input and try again.',
|
|
},
|
|
time: {
|
|
today: 'Today',
|
|
yesterday: 'Yesterday',
|
|
tomorrow: 'Tomorrow',
|
|
thisWeek: 'This Week',
|
|
lastWeek: 'Last Week',
|
|
thisMonth: 'This Month',
|
|
lastMonth: 'Last Month',
|
|
},
|
|
};
|
|
|
|
// Spanish translations
|
|
const esTranslations = {
|
|
common: {
|
|
loading: 'Cargando...',
|
|
save: 'Guardar',
|
|
cancel: 'Cancelar',
|
|
delete: 'Eliminar',
|
|
edit: 'Editar',
|
|
add: 'Agregar',
|
|
search: 'Buscar',
|
|
filter: 'Filtrar',
|
|
export: 'Exportar',
|
|
close: 'Cerrar',
|
|
confirm: 'Confirmar',
|
|
back: 'Atrás',
|
|
next: 'Siguiente',
|
|
submit: 'Enviar',
|
|
yes: 'Sí',
|
|
no: 'No',
|
|
ok: 'OK',
|
|
error: 'Error',
|
|
success: 'Éxito',
|
|
warning: 'Advertencia',
|
|
info: 'Información',
|
|
required: 'Requerido',
|
|
optional: 'Opcional',
|
|
noData: 'No hay datos disponibles',
|
|
selectAll: 'Seleccionar todo',
|
|
clearAll: 'Limpiar todo',
|
|
},
|
|
nav: {
|
|
dashboard: 'Panel',
|
|
walkthrough: 'Recorrido',
|
|
ipm: 'MIP',
|
|
tasks: 'Tareas',
|
|
reports: 'Informes',
|
|
inventory: 'Inventario',
|
|
timeclock: 'Reloj de Tiempo',
|
|
rooms: 'Cuartos',
|
|
batches: 'Lotes',
|
|
quickActions: 'Acciones Rápidas',
|
|
layout: 'Diseñador de Plano',
|
|
visitors: 'Visitantes',
|
|
roles: 'Roles',
|
|
settings: 'Configuración',
|
|
logout: 'Cerrar Sesión',
|
|
},
|
|
auth: {
|
|
login: 'Iniciar Sesión',
|
|
logout: 'Cerrar Sesión',
|
|
email: 'Correo Electrónico',
|
|
password: 'Contraseña',
|
|
forgotPassword: '¿Olvidaste tu contraseña?',
|
|
rememberMe: 'Recuérdame',
|
|
loginFailed: 'Error al iniciar sesión. Verifica tus credenciales.',
|
|
sessionExpired: 'Tu sesión ha expirado. Por favor inicia sesión nuevamente.',
|
|
},
|
|
dashboard: {
|
|
welcome: 'Bienvenido de nuevo',
|
|
todaysTasks: 'Tareas de Hoy',
|
|
activeBatches: 'Lotes Activos',
|
|
upcomingHarvests: 'Próximas Cosechas',
|
|
recentActivity: 'Actividad Reciente',
|
|
quickStats: 'Estadísticas Rápidas',
|
|
plantsTotal: 'Total de Plantas',
|
|
roomsActive: 'Cuartos Activos',
|
|
},
|
|
batches: {
|
|
title: 'Lotes',
|
|
createBatch: 'Crear Lote',
|
|
batchName: 'Nombre del Lote',
|
|
strain: 'Cepa',
|
|
stage: 'Etapa',
|
|
plantCount: 'Cantidad de Plantas',
|
|
startDate: 'Fecha de Inicio',
|
|
harvestDate: 'Fecha de Cosecha',
|
|
status: 'Estado',
|
|
stages: {
|
|
clone: 'Clon',
|
|
veg: 'Vegetativo',
|
|
flower: 'Floración',
|
|
dry: 'Secado',
|
|
cure: 'Curado',
|
|
harvest: 'Cosechado',
|
|
},
|
|
},
|
|
tasks: {
|
|
title: 'Tareas',
|
|
createTask: 'Crear Tarea',
|
|
taskName: 'Nombre de Tarea',
|
|
assignee: 'Asignado a',
|
|
dueDate: 'Fecha Límite',
|
|
priority: 'Prioridad',
|
|
status: 'Estado',
|
|
description: 'Descripción',
|
|
priorities: {
|
|
low: 'Baja',
|
|
medium: 'Media',
|
|
high: 'Alta',
|
|
urgent: 'Urgente',
|
|
},
|
|
statuses: {
|
|
pending: 'Pendiente',
|
|
inProgress: 'En Progreso',
|
|
completed: 'Completada',
|
|
cancelled: 'Cancelada',
|
|
},
|
|
},
|
|
visitors: {
|
|
title: 'Gestión de Visitantes',
|
|
checkIn: 'Registrar Entrada',
|
|
checkOut: 'Registrar Salida',
|
|
onSite: 'En el Sitio',
|
|
badge: 'Gafete',
|
|
purpose: 'Propósito de la Visita',
|
|
escort: 'Escolta',
|
|
company: 'Empresa',
|
|
types: {
|
|
visitor: 'Visitante',
|
|
contractor: 'Contratista',
|
|
inspector: 'Inspector',
|
|
vendor: 'Proveedor',
|
|
delivery: 'Entrega',
|
|
},
|
|
},
|
|
compliance: {
|
|
title: 'Cumplimiento',
|
|
auditLog: 'Registro de Auditoría',
|
|
documents: 'Documentos',
|
|
acknowledge: 'Reconocer',
|
|
acknowledged: 'Reconocido',
|
|
pending: 'Pendiente',
|
|
sopLibrary: 'Biblioteca de POE',
|
|
policies: 'Políticas',
|
|
},
|
|
messaging: {
|
|
announcements: 'Anuncios',
|
|
shiftNotes: 'Notas de Turno',
|
|
newAnnouncement: 'Nuevo Anuncio',
|
|
priority: {
|
|
info: 'Información',
|
|
warning: 'Advertencia',
|
|
critical: 'Crítico',
|
|
},
|
|
},
|
|
settings: {
|
|
title: 'Configuración',
|
|
profile: 'Perfil',
|
|
language: 'Idioma',
|
|
theme: 'Tema',
|
|
notifications: 'Notificaciones',
|
|
accessibility: 'Accesibilidad',
|
|
themes: {
|
|
light: 'Claro',
|
|
dark: 'Oscuro',
|
|
system: 'Sistema',
|
|
},
|
|
},
|
|
errors: {
|
|
generic: 'Algo salió mal. Por favor intenta de nuevo.',
|
|
network: 'Error de red. Por favor verifica tu conexión.',
|
|
notFound: 'Página no encontrada.',
|
|
unauthorized: 'No estás autorizado para realizar esta acción.',
|
|
validation: 'Por favor verifica tu entrada e intenta de nuevo.',
|
|
},
|
|
time: {
|
|
today: 'Hoy',
|
|
yesterday: 'Ayer',
|
|
tomorrow: 'Mañana',
|
|
thisWeek: 'Esta Semana',
|
|
lastWeek: 'Semana Pasada',
|
|
thisMonth: 'Este Mes',
|
|
lastMonth: 'Mes Pasado',
|
|
},
|
|
};
|
|
|
|
i18n
|
|
.use(LanguageDetector)
|
|
.use(initReactI18next)
|
|
.init({
|
|
resources: {
|
|
en: { translation: enTranslations },
|
|
es: { translation: esTranslations },
|
|
},
|
|
fallbackLng: 'en',
|
|
interpolation: {
|
|
escapeValue: false, // React already escapes
|
|
},
|
|
detection: {
|
|
order: ['localStorage', 'navigator', 'htmlTag'],
|
|
caches: ['localStorage'],
|
|
},
|
|
});
|
|
|
|
export default i18n;
|