feat(i18n): add internationalization support with English and Spanish translations
feat(kiosk): implement kiosk report submission functionality with offline support test(outbox): add tests for outbox functionality including report submission and error handling feat(outbox): create outbox management for queued reports with IndexedDB persistence feat(uuid): add UUID generation utility for client IDs feat(qr): implement QR code generation for reporting links by site and area feat(kiosk): create Kiosk page for reporting incidents without an account
This commit is contained in:
1 parent
3f6dff5f24
commit
3e964d1176
64 files changed
+10056
-267
No files matched your search
+167
@@ -0,0 +1,167 @@
|
||||
import type { Messages } from './en'
|
||||
|
||||
const plural = (n: number, one: string, many: string) => `${n} ${n === 1 ? one : many}`
|
||||
|
||||
export const es: Messages = {
|
||||
language: { name: 'Español', switchTo: 'English' },
|
||||
common: {
|
||||
cancel: 'Cancelar',
|
||||
optional: 'Opcional',
|
||||
loading: 'Cargando…',
|
||||
back: 'Volver',
|
||||
},
|
||||
nav: {
|
||||
overview: 'Resumen',
|
||||
incidents: 'Incidentes',
|
||||
myActions: 'Mis acciones',
|
||||
locations: 'Ubicaciones',
|
||||
analytics: 'Análisis',
|
||||
manage: 'Gestionar',
|
||||
reportIncident: 'Reportar un incidente',
|
||||
about: 'Acerca de',
|
||||
settings: 'Configuración',
|
||||
signOut: 'Cerrar sesión',
|
||||
openMenu: 'Abrir menú',
|
||||
closeMenu: 'Cerrar menú',
|
||||
workspace: 'Espacio de trabajo',
|
||||
searchIncidents: 'Buscar incidentes',
|
||||
},
|
||||
auth: {
|
||||
signIn: 'Iniciar sesión',
|
||||
email: 'Correo electrónico',
|
||||
password: 'Contraseña',
|
||||
resetTitle: 'Restablecer la contraseña',
|
||||
linkCopy: 'Le enviaremos un enlace por correo para iniciar sesión.',
|
||||
resetCopy: 'Le enviaremos un enlace por correo para elegir una nueva contraseña.',
|
||||
sendLink: 'Enviarme un enlace de acceso',
|
||||
sendReset: 'Enviarme un enlace para restablecer',
|
||||
usePassword: 'Iniciar sesión con contraseña',
|
||||
useLink: 'Prefiero recibir un enlace por correo',
|
||||
forgot: '¿Olvidó su contraseña?',
|
||||
sent: 'Si ese correo pertenece a una cuenta, el enlace ya está en camino. Caduca pronto, así que úselo enseguida.',
|
||||
continueWithLink: 'Continúe para iniciar sesión con el enlace de su correo.',
|
||||
backToSignIn: 'Volver a iniciar sesión',
|
||||
choosePassword: 'Elija una contraseña',
|
||||
choosePasswordCopy: 'Establezca una contraseña para su cuenta. Después iniciará sesión automáticamente.',
|
||||
newPassword: 'Nueva contraseña',
|
||||
confirmPassword: 'Confirme la contraseña',
|
||||
atLeast10: 'Al menos 10 caracteres.',
|
||||
mismatch: 'Las contraseñas no coinciden.',
|
||||
savePassword: 'Guardar contraseña e iniciar sesión',
|
||||
},
|
||||
report: {
|
||||
eyebrow: 'Nuevo reporte',
|
||||
title: 'Reportar un incidente',
|
||||
intro: 'Registre los hechos mientras están frescos. Los detalles de la investigación se pueden añadir después.',
|
||||
whatHappened: '¿Qué pasó?',
|
||||
whatHappenedCopy: 'Empiece con una descripción clara y objetiva.',
|
||||
incidentTitle: 'Título del incidente',
|
||||
titlePlaceholder: 'p. ej. Resbalón cerca del muelle de carga',
|
||||
type: 'Tipo de incidente',
|
||||
severity: 'Gravedad',
|
||||
when: 'Cuándo',
|
||||
description: '¿Qué pasó?',
|
||||
descriptionPlaceholder: 'Describa lo que observó, sin suposiciones...',
|
||||
where: '¿Dónde ocurrió?',
|
||||
whereCopy: 'Indique el lugar exacto para que se puedan ver patrones.',
|
||||
site: 'Planta',
|
||||
area: 'Edificio o área',
|
||||
notSpecified: 'Sin especificar',
|
||||
exactLocation: 'Lugar exacto',
|
||||
exactLocationPlaceholder: 'p. ej. Vestíbulo planta baja, Línea 3',
|
||||
fromQr: 'Ubicación tomada del código QR.',
|
||||
responseAndPhotos: 'Respuesta y fotos',
|
||||
responseAndPhotosCopy: 'Lo que se hizo de inmediato y fotos del lugar.',
|
||||
immediateResponse: 'Respuesta inmediata',
|
||||
immediateResponsePlaceholder: 'p. ej. Área aislada, supervisor avisado...',
|
||||
photos: 'Fotos',
|
||||
addPhotos: 'Añadir fotos',
|
||||
removePhoto: (name: string) => `Quitar ${name}`,
|
||||
anonymous: 'Reportar de forma anónima.',
|
||||
anonymousHelp: 'Su nombre no se guardará con este reporte y después no podrá encontrarlo en su lista.',
|
||||
submit: 'Enviar reporte',
|
||||
submitting: 'Enviando…',
|
||||
noSites: 'Todavía no hay plantas configuradas. Un gerente de seguridad debe añadir una planta antes de poder reportar incidentes.',
|
||||
addSite: 'Añadir una planta',
|
||||
queuedTitle: 'Guardado en este dispositivo',
|
||||
queuedCopy: 'No hay conexión, así que el reporte aún no se ha enviado. Se enviará automáticamente en cuanto haya conexión. Puede cerrar esta página.',
|
||||
reportAnother: 'Reportar otra cosa',
|
||||
photosFailed: (reference: string, details: string) => `El reporte ${reference} se guardó, pero algunas fotos no se subieron. ${details}`,
|
||||
},
|
||||
kiosk: {
|
||||
heading: 'Reporte un problema de seguridad',
|
||||
intro: 'Peligros, casi accidentes, lesiones: cualquier cosa que pueda lastimar a alguien. No necesita una cuenta.',
|
||||
whatKind: '¿Qué tipo de problema?',
|
||||
howSerious: '¿Qué tan grave podría ser?',
|
||||
summary: 'En pocas palabras, ¿qué vio?',
|
||||
summaryPlaceholder: 'p. ej. Aceite en el piso junto a la prensa 4',
|
||||
details: '¿Algo más que debamos saber?',
|
||||
yourName: 'Su nombre',
|
||||
yourNameHelp: 'Déjelo en blanco para reportar de forma anónima.',
|
||||
send: 'Enviar reporte',
|
||||
sending: 'Enviando…',
|
||||
thanksTitle: 'Gracias',
|
||||
thanks: (reference: string) => `Su reporte ${reference} se envió al equipo de seguridad.`,
|
||||
thanksQueued: 'Su reporte está guardado en este dispositivo y se enviará en cuanto haya conexión.',
|
||||
resetIn: (seconds: number) => `Esta pantalla se reinicia en ${seconds} s.`,
|
||||
invalidLink: 'Este enlace de reporte no funciona. Pida uno nuevo a su equipo de seguridad.',
|
||||
},
|
||||
actions: {
|
||||
eyebrow: 'Acciones correctivas',
|
||||
mine: 'Mis acciones',
|
||||
all: 'Todas las acciones',
|
||||
mineCopy: 'Acciones correctivas asignadas a usted. Márquelas como hechas cuando la solución esté en marcha.',
|
||||
allCopy: 'Todas las acciones correctivas de la organización.',
|
||||
filterOpen: 'Abiertas',
|
||||
filterOverdue: 'Vencidas',
|
||||
filterDone: 'Hechas',
|
||||
filterAll: 'Todas',
|
||||
assignedToMe: 'Asignadas a mí',
|
||||
everyone: 'Todos',
|
||||
nothingOpen: 'Nada pendiente. ¡Buen trabajo!',
|
||||
none: 'No hay acciones aquí.',
|
||||
due: (date: string) => `Vence ${date}`,
|
||||
noDueDate: 'Sin fecha límite',
|
||||
overdue: 'Vencida',
|
||||
unassigned: 'Sin asignar',
|
||||
statusOf: (title: string) => `Estado de ${title}`,
|
||||
},
|
||||
outbox: {
|
||||
offline: 'Sin conexión. Los nuevos reportes se guardarán en este dispositivo y se enviarán al reconectarse.',
|
||||
waiting: (n: number) => `${plural(n, 'reporte pendiente', 'reportes pendientes')} de enviar`,
|
||||
sending: 'Enviando…',
|
||||
retry: 'Enviar ahora',
|
||||
otherUser: 'Guardado por otro usuario en este dispositivo',
|
||||
failed: (error: string) => `No se pudo enviar: ${error}`,
|
||||
discard: 'Descartar',
|
||||
discardConfirm: '¿Descartar este reporte sin enviar? No se puede deshacer.',
|
||||
signOutWarning: (n: number) => `${plural(n, 'reporte aún no se ha', 'reportes aún no se han')} enviado. Se enviarán la próxima vez que inicie sesión en este dispositivo. ¿Cerrar sesión de todos modos?`,
|
||||
},
|
||||
qr: {
|
||||
caption: 'Escanee para reportar un peligro o casi accidente',
|
||||
},
|
||||
types: {
|
||||
near_miss: 'Casi accidente',
|
||||
hazard: 'Peligro',
|
||||
injury: 'Lesión',
|
||||
illness: 'Enfermedad',
|
||||
property_damage: 'Daño a la propiedad',
|
||||
environmental: 'Ambiental',
|
||||
},
|
||||
typeHints: {
|
||||
near_miss: 'Algo casi salió mal',
|
||||
hazard: 'Algo que podría lastimar a alguien',
|
||||
injury: 'Alguien se lastimó',
|
||||
illness: 'Alguien se enfermó por el trabajo',
|
||||
property_damage: 'Equipo o edificio dañado',
|
||||
environmental: 'Derrame, fuga o emisión',
|
||||
},
|
||||
severities: { low: 'Baja', medium: 'Media', high: 'Alta', critical: 'Crítica' },
|
||||
severityHints: {
|
||||
low: 'Menor, sin probabilidad de lesión',
|
||||
medium: 'Podría causar una lesión menor',
|
||||
high: 'Podría causar una lesión grave',
|
||||
critical: 'Podría poner en riesgo la vida',
|
||||
},
|
||||
actionStatuses: { open: 'Abierta', in_progress: 'En curso', done: 'Hecha', verified: 'Verificada', cancelled: 'Cancelada' },
|
||||
}
|
||||
Reference in new issue
Block a user