ca-grow-ops-manager/frontend/src/lib/i18n.ts
fullsizemalt 32fd739ccf
Some checks failed
Deploy to Production / deploy (push) Failing after 0s
Test / backend-test (push) Failing after 0s
Test / frontend-test (push) Failing after 0s
feat: Complete Phases 8-13 implementation
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)
2025-12-11 00:26:25 -08:00

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;