SkateSpots/src/i18n/legacy/cordnUi.ts
SkateSpots 66fc47cc28 feat: restore map footer, inline crew roles, Cordn reactions/push
- Keep the map footer links permanently visible; remove the hide toggle.
- Publish inline founder promote/demote from the member row.
- Add encrypted MLS reaction/delete/read control messages and UI.
- Add the minute Cordn join watcher: NIP-17 DMs + encrypted bell notices.
- Add the browser translation-matrix runner and a low-end performance finding.
2026-10-28 11:02:47 +07:00

213 lines
9.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* `cordnUi.*` — the native Cordn (MLS) crew chat panel. Added to `legacy/`
* (the same `{ en, es }` fragment pattern as `notify.ts` — the flat key object,
* namespaced by `legacy/index.ts`).
*/
const cordnUi = {
en: {
title: 'Private chat',
subtitle:
'End-to-end encrypted (MLS) across crew members. The coordinator routes ciphertext and metadata only — it never sees message contents.',
notLoggedIn: 'Log in to use the crew’s private chat.',
membersOnly: 'Only crew members can open the private chat.',
connecting: 'Connecting…',
noCoordinator: 'No coordinator is configured for this crew yet.',
noGroupAdmin: 'This crew’s private chat hasn’t been created yet.',
noGroupMember: 'You’re not in this crew’s private chat yet.',
create: 'Create the private chat',
requestJoin: 'Ask to join',
checkInvite: 'Check for invite',
requested: 'Request sent — a crew admin will approve it.',
noInvite: 'No invite waiting yet. Ask an admin to approve your request.',
placeholder: 'Message the crew…',
send: 'Send',
refresh: 'Refresh',
requests: 'Join requests',
checkRequests: 'Check requests',
approve: 'Add',
noRequests: 'No pending join requests.',
inviteHint: 'Only you are in this chat so far — crew members can tap “Ask to join”, then you approve them here.',
shareInvite: 'Invite',
shareInviteText: 'Join {{crew}} — private crew chat',
inviteCopied: 'Invite link copied',
memberCount: '{{count}} in the group',
you: 'You',
groupRef: 'Group link',
copyRef: 'Copy',
copied: 'Copied',
attachImage: 'Attach image',
uploading: 'Uploading…',
uploadFailed: 'Couldn’t upload the image.',
bannerTitle: 'This crew has no private chat yet',
bannerBody: 'Set up end-to-end encrypted (MLS) chat for your crew — members join from the tab.',
bannerCta: 'Set up',
ready: 'Connected · MLS',
errorPrefix: 'Couldn’t reach the coordinator',
interactiveHint:
'Your signer asks for approval on each action — use Refresh and Send as needed.',
setupDevice: 'Set up this device',
setupDeviceBody:
'This gives this device its own key for the private chat. A founder approves it once.',
waitingApproval: 'Waiting for the founder to approve…',
waitingApprovalManual:
'Waiting for the founder. Tap “Check for invite” after they approve.',
onboardingFounder1: 'Start the private chat.',
onboardingFounder2: 'Approve members who ask to join.',
onboardingFounder3: 'Chat privately with your crew.',
onboardingMember1: 'Ask to join.',
onboardingMember2: 'The founder approves your device.',
onboardingMember3: 'You’re in — messages are encrypted.',
encryptedNote:
'Only crew members can read this; the coordinator only relays encrypted messages.',
advanced: 'Advanced',
coordinator: 'Coordinator',
keyPackage: 'Key package',
keyPackageReady: 'Ready on this device',
keyPackageMissing: 'Not set up on this device',
members: 'Members',
roleFounder: 'Founder',
roleAdmin: 'Admin',
makeAdmin: 'Make admin',
removeAdmin: 'Remove admin',
adminAdded: 'Member promoted to admin.',
adminRemoved: 'Admin role removed.',
roleUpdateFailed: 'Could not update the role. Try again.',
addReaction: 'Add reaction',
deleteMessage: 'Delete message',
deleteMessageConfirm: 'Delete this message for everyone?',
readBy: 'Read by {{count}}',
joinRequestTitle: 'Private chat request',
joinRequestFor: 'New request to join {{crew}}',
joinRequestReview: 'Review request',
joinRequestDismiss: 'Dismiss request',
roleMember: 'Member',
qrTitle: 'Scan to join the private chat',
qrHint:
'Crew members scan this with their phone camera. The link opens the Private chat tab.',
sendFailed: 'Couldn’t send — tap Retry.',
sending: 'Sending…',
sent: 'Sent',
retry: 'Retry',
errorUnreachable: 'Couldn’t reach the private chat. Check your connection.',
errorDetails: 'Details',
unreachable: 'Unreachable',
dismiss: 'Dismiss',
linkDevice: 'Link this device',
linkDeviceTitle: 'Link another device',
linkDeviceHint: 'Scan this code on a device that is already in the room.',
linkDeviceNote:
'The code contains a public key package. Your private key stays on the new device.',
waitingDevice: 'Waiting for the other device…',
addDevice: 'Add a device',
deviceLinked: 'Device added.',
deviceLinkFailed: 'Couldn’t add that device.',
removeMemberConfirm:
'Remove {{name}} from the private chat? That device will lose access.',
removeMemberFailed: 'Couldn’t remove that member.',
reply: 'Reply',
},
es: {
title: 'Chat privado',
subtitle:
'Cifrado de extremo a extremo (MLS) entre los miembros de la peña. El coordinador solo enruta cifrado y metadatos: nunca ve el contenido de los mensajes.',
notLoggedIn: 'Inicia sesión para usar el chat privado de la peña.',
membersOnly: 'Solo los miembros de la peña pueden abrir el chat privado.',
connecting: 'Conectando…',
noCoordinator: 'Esta peña aún no tiene un coordinador configurado.',
noGroupAdmin: 'El chat privado de esta peña aún no se ha creado.',
noGroupMember: 'Aún no estás en el chat privado de esta peña.',
create: 'Crear el chat privado',
requestJoin: 'Pedir entrar',
checkInvite: 'Buscar invitación',
requested: 'Solicitud enviada: un administrador la aprobará.',
noInvite: 'Aún no hay invitación. Pide a un administrador que apruebe tu solicitud.',
placeholder: 'Escribe a la peña…',
send: 'Enviar',
refresh: 'Actualizar',
requests: 'Solicitudes de entrada',
checkRequests: 'Ver solicitudes',
approve: 'Añadir',
noRequests: 'No hay solicitudes pendientes.',
inviteHint: 'De momento solo estás tú en este chat: los miembros pueden pulsar «Pedir entrar» y tú los apruebas aquí.',
shareInvite: 'Invitar',
shareInviteText: 'Únete a {{crew}} — chat privado de la peña',
inviteCopied: 'Enlace de invitación copiado',
memberCount: '{{count}} en el grupo',
you: 'Tú',
groupRef: 'Enlace del grupo',
copyRef: 'Copiar',
copied: 'Copiado',
attachImage: 'Adjuntar imagen',
uploading: 'Subiendo…',
uploadFailed: 'No se pudo subir la imagen.',
bannerTitle: 'Esta peña aún no tiene chat privado',
bannerBody: 'Configura el chat cifrado de extremo a extremo (MLS) de tu peña: los miembros se unen desde la pestaña.',
bannerCta: 'Configurar',
ready: 'Conectado · MLS',
errorPrefix: 'No se pudo contactar con el coordinador',
interactiveHint:
'Tu firmante pide aprobación en cada acción: usa Actualizar y Enviar cuando haga falta.',
setupDevice: 'Configurar este dispositivo',
setupDeviceBody:
'Esto da a este dispositivo su propia clave para el chat privado. Un fundador lo aprueba una vez.',
waitingApproval: 'Esperando a que el fundador lo apruebe…',
waitingApprovalManual:
'Esperando al fundador. Pulsa «Buscar invitación» cuando lo apruebe.',
onboardingFounder1: 'Crea el chat privado.',
onboardingFounder2: 'Aprueba a los miembros que pidan entrar.',
onboardingFounder3: 'Habla en privado con tu peña.',
onboardingMember1: 'Pide entrar.',
onboardingMember2: 'El fundador aprueba tu dispositivo.',
onboardingMember3: 'Ya estás dentro: los mensajes van cifrados.',
encryptedNote:
'Solo los miembros de la peña pueden leerlo; el coordinador solo retransmite mensajes cifrados.',
advanced: 'Avanzado',
coordinator: 'Coordinador',
keyPackage: 'Paquete de claves',
keyPackageReady: 'Listo en este dispositivo',
keyPackageMissing: 'Sin configurar en este dispositivo',
members: 'Miembros',
roleFounder: 'Fundador',
roleAdmin: 'Admin',
makeAdmin: 'Hacer admin',
removeAdmin: 'Quitar admin',
adminAdded: 'Miembro ascendido a admin.',
adminRemoved: 'Rol de admin eliminado.',
roleUpdateFailed: 'No se pudo actualizar el rol. Inténtalo de nuevo.',
addReaction: 'Añadir reacción',
deleteMessage: 'Eliminar mensaje',
deleteMessageConfirm: '¿Eliminar este mensaje para todos?',
readBy: 'Leído por {{count}}',
joinRequestTitle: 'Solicitud de chat privado',
joinRequestFor: 'Nueva solicitud para unirse a {{crew}}',
joinRequestReview: 'Revisar solicitud',
joinRequestDismiss: 'Descartar solicitud',
roleMember: 'Miembro',
qrTitle: 'Escanea para entrar al chat privado',
qrHint:
'Los miembros de la peña pueden escanearlo con la cámara del móvil. El enlace abre la pestaña del chat privado.',
sendFailed: 'No se pudo enviar: pulsa Reintentar.',
sending: 'Enviando…',
sent: 'Enviado',
retry: 'Reintentar',
errorUnreachable: 'No se pudo conectar con el chat privado. Comprueba tu conexión.',
errorDetails: 'Detalles',
unreachable: 'Sin conexión',
dismiss: 'Descartar',
linkDevice: 'Vincular este dispositivo',
linkDeviceTitle: 'Vincular otro dispositivo',
linkDeviceHint: 'Escanea este código en un dispositivo que ya esté en la sala.',
linkDeviceNote:
'El código contiene un paquete de claves público. Tu clave privada se queda en el dispositivo nuevo.',
waitingDevice: 'Esperando al otro dispositivo…',
addDevice: 'Añadir un dispositivo',
deviceLinked: 'Dispositivo añadido.',
deviceLinkFailed: 'No se pudo añadir ese dispositivo.',
removeMemberConfirm:
'¿Quitar a {{name}} del chat privado? Ese dispositivo perderá el acceso.',
removeMemberFailed: 'No se pudo quitar a ese miembro.',
reply: 'Responder',
},
};
export default cordnUi;