- 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.
213 lines
9.6 KiB
TypeScript
213 lines
9.6 KiB
TypeScript
/**
|
||
* `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;
|