@acms-subir/core 0.3.53 → 0.3.54

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,473 @@
1
+ // Words of the built-in "My events" pages (pages/members): the list, the
2
+ // request form, the date controls and the errors people can see there. They
3
+ // follow the page's language (/es/members/events), like the RSVP pages.
4
+ // Plain strings with {name}, {date}, {when}, {count}, {days}, {rooms},
5
+ // {title}, {repeat} and {label} slots (live/words.ts `fill`). Other languages
6
+ // fall back to English. Errors are looked up by their `code`
7
+ // (lib/calendar/requests.ts, moves.ts, host-requests.ts); one without a word
8
+ // here shows its own English message.
9
+ export interface MemberStrings {
10
+ signedInAs: string;
11
+ openAdmin: string;
12
+ signOut: string;
13
+ myEvents: string;
14
+ back: string;
15
+ requestEvent: string;
16
+ /** after an action (?sent=1 …) */
17
+ flash: {
18
+ sent: string; updated: string; changes: string; withdrawn: string; cancelled: string; restored: string;
19
+ moved: string; movedBack: string; moveSent: string; fromDateSent: string; dismissed: string;
20
+ };
21
+ requests: string;
22
+ upcoming: string;
23
+ pastEvents: string;
24
+ showingRecent: string;
25
+ noUpcoming: string;
26
+ requestOne: string;
27
+ requestOneRest: string;
28
+ /** request states (requestLabel) */
29
+ waiting: string;
30
+ declined: string;
31
+ changesWaiting: string;
32
+ changesDeclined: string;
33
+ moveWaiting: string;
34
+ moveDeclined: string;
35
+ moveApproved: string;
36
+ fromDateWaiting: string;
37
+ fromDateDeclined: string;
38
+ fromDateApproved: string;
39
+ sentOn: string;
40
+ teamSaid: string;
41
+ edit: string;
42
+ suggestAgain: string;
43
+ dismiss: string;
44
+ withdraw: string;
45
+ withdrawRequest: string;
46
+ withdrawChanges: string;
47
+ confirmWithdrawRequest: string;
48
+ confirmWithdrawChanges: string;
49
+ cancelledState: string;
50
+ goesLive: string;
51
+ scheduled: string;
52
+ /** one date */
53
+ cancelledDate: string;
54
+ movedFrom: string;
55
+ cancel: string;
56
+ restore: string;
57
+ cancelLabel: string;
58
+ restoreLabel: string;
59
+ confirmCancelDate: string;
60
+ suggestChanges: string;
61
+ view: string;
62
+ /** moving one date (C3) */
63
+ moveDate: string;
64
+ moveDateLabel: string;
65
+ moveBack: string;
66
+ confirmMoveBack: string;
67
+ date: string;
68
+ starts: string;
69
+ ends: string;
70
+ rooms: string;
71
+ roomsHint: string;
72
+ publicNote: string;
73
+ publicNoteHint: string;
74
+ moveNow: string;
75
+ sendForApproval: string;
76
+ approvalHint: string;
77
+ moveRequested: string;
78
+ moveBackRequested: string;
79
+ roomTaken: string;
80
+ roomsTaken: string;
81
+ sendInstead: string;
82
+ messageForTeam: string;
83
+ sendAsRequest: string;
84
+ /** "Change from this date on" (C4) */
85
+ changeFrom: string;
86
+ changeFromLabel: string;
87
+ changeFromHint: string;
88
+ changeFromRequested: string;
89
+ weekday: string;
90
+ everyWeek: string;
91
+ /** the request form */
92
+ form: {
93
+ title: string; when: string; date: string; starts: string; ends: string; optional: string; allDay: string; allDayHint: string;
94
+ multiDay: string; repeats: string; where: string; wherePlaceholder: string; description: string; descriptionHint: string;
95
+ calendar: string; notSure: string; choose: string; note: string; staffOnly: string; asSetByTeam: string;
96
+ repeat: { none: string; daily: string; weekly: string; biweekly: string; monthly: string };
97
+ };
98
+ newTitle: string;
99
+ newLede: string;
100
+ submit: string;
101
+ noRequestRole: string;
102
+ suggestTitle: string;
103
+ editTitle: string;
104
+ suggestLede: string;
105
+ declinedLede: string;
106
+ waitingLede: string;
107
+ draftLede: string;
108
+ sendChanges: string;
109
+ changesWaitingNote: string;
110
+ declinedChanges: string;
111
+ declinedRequest: string;
112
+ theySaid: string;
113
+ /** errors by code; {label} is a custom field's name */
114
+ errors: Record<string, string>;
115
+ somethingWrong: string;
116
+ }
117
+
118
+ const EN: MemberStrings = {
119
+ signedInAs: 'Signed in as {name}', openAdmin: 'Open the admin', signOut: 'Sign out',
120
+ myEvents: 'My events', back: '← My events', requestEvent: 'Request an event',
121
+ flash: {
122
+ sent: 'Thanks! Your request is with the team. You’ll hear back once they’ve looked at it.',
123
+ updated: 'Your request is updated and waiting for approval.',
124
+ changes: 'Your changes are with the team. The event stays as it is until they approve them.',
125
+ withdrawn: 'Request withdrawn.',
126
+ cancelled: 'That date is cancelled. The calendar shows it as cancelled.',
127
+ restored: 'That date is back on.',
128
+ moved: 'That date is moved. People who signed up were emailed the new time.',
129
+ movedBack: 'That date is back at its usual time. People who signed up were emailed.',
130
+ moveSent: 'Your move is with the team. The date stays as it is until they approve it.',
131
+ fromDateSent: 'Your schedule change is with the team. Nothing changes until they apply it.',
132
+ dismissed: 'Cleared.',
133
+ },
134
+ requests: 'Requests', upcoming: 'Upcoming', pastEvents: 'Past events ({count})', showingRecent: 'Showing the {count} most recent.',
135
+ noUpcoming: 'You’re not hosting any upcoming events.', requestOne: 'Request one', requestOneRest: ' and the team will take a look.',
136
+ waiting: 'Waiting for approval', declined: 'Declined', changesWaiting: 'Changes waiting for approval', changesDeclined: 'Changes declined',
137
+ moveWaiting: 'Date move waiting for approval', moveDeclined: 'Date move declined', moveApproved: 'Date move approved',
138
+ fromDateWaiting: 'Schedule change waiting for approval', fromDateDeclined: 'Schedule change declined', fromDateApproved: 'Schedule change applied',
139
+ sentOn: 'Sent {date}', teamSaid: 'The team said:', edit: 'Edit', suggestAgain: 'Suggest changes again', dismiss: 'Dismiss', withdraw: 'Withdraw',
140
+ withdrawRequest: 'Withdraw request', withdrawChanges: 'Withdraw changes', confirmWithdrawRequest: 'Withdraw this request?', confirmWithdrawChanges: 'Withdraw these changes?',
141
+ cancelledState: 'Cancelled', goesLive: 'Goes live {date}', scheduled: 'Scheduled',
142
+ cancelledDate: 'Cancelled', movedFrom: 'Moved from {when}', cancel: 'Cancel', restore: 'Restore', cancelLabel: 'Cancel {when}', restoreLabel: 'Restore {when}',
143
+ confirmCancelDate: 'Cancel this date? It shows as cancelled straight away.', suggestChanges: 'Suggest changes', view: 'View',
144
+ moveDate: 'Move…', moveDateLabel: 'Move {when}', moveBack: 'Move back', confirmMoveBack: 'Put this date back at its usual time?',
145
+ date: 'Date', starts: 'Starts', ends: 'Ends', rooms: 'Rooms', roomsHint: 'The rooms this event uses, and any the team lets people ask for.',
146
+ publicNote: 'Note for people who come', publicNoteHint: 'Shown with the date, and in the email to people who signed up.',
147
+ moveNow: 'Move this date', sendForApproval: 'Send for approval', approvalHint: 'The team approves date moves. The date stays as it is until they do.',
148
+ moveRequested: 'Move to {when} waiting for approval', moveBackRequested: 'Move back waiting for approval',
149
+ roomTaken: '{rooms} is taken at that time.', roomsTaken: '{rooms} are taken at that time.', sendInstead: 'You can send this move to the team as a request instead. The date stays as it is until they answer.',
150
+ messageForTeam: 'Message for the team', sendAsRequest: 'Send as a request',
151
+ changeFrom: 'Change from this date on…', changeFromLabel: 'Change {title} from {when} on',
152
+ changeFromHint: 'For a lasting change, like a new day or time. Dates before this one stay as they are. The team applies it, and people who signed up hear about their new dates.',
153
+ changeFromRequested: 'Change from {when} on waiting for approval', weekday: 'Day', everyWeek: 'Every week',
154
+ form: {
155
+ title: 'Title', when: 'When', date: 'Date', starts: 'Starts', ends: 'Ends', optional: '(optional)', allDay: 'All day', allDayHint: 'No start or end time',
156
+ multiDay: 'This event runs over {days} days. Changing the date moves all of them.', repeats: 'Repeats', where: 'Where',
157
+ wherePlaceholder: 'A room, an address, or “Online”', description: 'Description', descriptionHint: 'Plain text. Leave a blank line between paragraphs.',
158
+ calendar: 'Calendar', notSure: 'Not sure (the team will choose)', choose: 'Choose…', note: 'Note for the team', staffOnly: '(only staff see this)',
159
+ asSetByTeam: '{repeat} (as set by the team)',
160
+ repeat: { none: 'Does not repeat', daily: 'Every day', weekly: 'Every week', biweekly: 'Every 2 weeks', monthly: 'Every month' },
161
+ },
162
+ newTitle: 'Request an event', newLede: 'Tell the team what you’d like to host. It goes on the calendar once they approve it.', submit: 'Submit for approval',
163
+ noRequestRole: 'Your role doesn’t include “Request events”. Ask the site’s team if you need it.',
164
+ suggestTitle: 'Suggest changes', editTitle: 'Edit your request', suggestLede: '“{title}” stays as it is on the site until the team approves your changes.',
165
+ declinedLede: 'Make your changes and send it again.', waitingLede: 'It’s waiting for approval. Saving sends the updated request.',
166
+ draftLede: 'It isn’t on the calendar yet. Send it to the team when it’s ready.', sendChanges: 'Send changes for approval',
167
+ changesWaitingNote: 'The changes you sent are waiting for approval; they’re filled in below. Sending again replaces them.',
168
+ declinedChanges: 'The team declined your last changes.', declinedRequest: 'The team declined this request.', theySaid: 'They said:',
169
+ errors: {
170
+ 'sign-in': 'Sign in to continue.', 'no-request-role': 'Your role doesn’t include “Request events”. Ask the site’s team if you need it.',
171
+ 'not-found': 'That event isn’t available.', 'request-not-found': 'That request isn’t available any more.',
172
+ 'rate-limit': 'That’s a lot of requests in an hour. Try again later.', 'too-many-waiting': 'You have many requests waiting already. Wait for the team to answer them first.',
173
+ title: 'Give the event a title.', start: 'Pick a date and start time.', end: 'Pick a valid end time.', 'end-before-start': 'The end has to come after the start.',
174
+ repeat: 'Choose how often it repeats from the list.', calendar: 'Choose a calendar from the list.', field: 'Choose {label} from the list.',
175
+ 'staff-editing': 'The team is editing this event right now. Try again later.', 'nothing-to-withdraw': 'There’s no request on this event to withdraw.',
176
+ 'one-off': 'Only a repeating event has single dates to change.', 'not-a-date': 'That date isn’t part of this event.',
177
+ 'cancelled-event': 'This event is cancelled.', 'cancelled-date': 'That date is cancelled. Restore it before moving it.',
178
+ started: 'That date has already started or passed.', 'original-passed': 'Its usual time has already passed.', past: 'Pick a time that hasn’t passed yet.',
179
+ 'bad-time': 'Pick a valid date and time.', 'room-not-allowed': 'Pick from the rooms this event uses, or ask the team for another room.',
180
+ unchanged: 'That’s where the date already is.', 'previous-date': 'Pick a first date after the one before it.', answered: 'That request was already answered.',
181
+ unavailable: 'That action isn’t available here.',
182
+ },
183
+ somethingWrong: 'Something went wrong. Please try again.',
184
+ };
185
+
186
+ const ES: MemberStrings = {
187
+ signedInAs: 'Sesión iniciada como {name}', openAdmin: 'Abrir el panel', signOut: 'Cerrar sesión',
188
+ myEvents: 'Mis eventos', back: '← Mis eventos', requestEvent: 'Solicitar un evento',
189
+ flash: {
190
+ sent: '¡Gracias! Tu solicitud ya la tiene el equipo. Te avisaremos cuando la revisen.',
191
+ updated: 'Tu solicitud se actualizó y está en espera de aprobación.',
192
+ changes: 'Tus cambios ya los tiene el equipo. El evento sigue igual hasta que los aprueben.',
193
+ withdrawn: 'Solicitud retirada.',
194
+ cancelled: 'Esa fecha se canceló. El calendario la muestra como cancelada.',
195
+ restored: 'Esa fecha vuelve a estar en pie.',
196
+ moved: 'La fecha se cambió. A quienes se inscribieron les enviamos el nuevo horario.',
197
+ movedBack: 'La fecha volvió a su horario de siempre. Avisamos por correo a quienes se inscribieron.',
198
+ moveSent: 'Tu cambio de fecha ya lo tiene el equipo. La fecha sigue igual hasta que lo aprueben.',
199
+ fromDateSent: 'Tu cambio de horario ya lo tiene el equipo. Nada cambia hasta que lo apliquen.',
200
+ dismissed: 'Listo.',
201
+ },
202
+ requests: 'Solicitudes', upcoming: 'Próximos', pastEvents: 'Eventos pasados ({count})', showingRecent: 'Se muestran los {count} más recientes.',
203
+ noUpcoming: 'No tienes eventos próximos a tu cargo.', requestOne: 'Solicita uno', requestOneRest: ' y el equipo lo revisará.',
204
+ waiting: 'En espera de aprobación', declined: 'Rechazada', changesWaiting: 'Cambios en espera de aprobación', changesDeclined: 'Cambios rechazados',
205
+ moveWaiting: 'Cambio de fecha en espera de aprobación', moveDeclined: 'Cambio de fecha rechazado', moveApproved: 'Cambio de fecha aprobado',
206
+ fromDateWaiting: 'Cambio de horario en espera de aprobación', fromDateDeclined: 'Cambio de horario rechazado', fromDateApproved: 'Cambio de horario aplicado',
207
+ sentOn: 'Enviada el {date}', teamSaid: 'El equipo dijo:', edit: 'Editar', suggestAgain: 'Sugerir cambios otra vez', dismiss: 'Descartar', withdraw: 'Retirar',
208
+ withdrawRequest: 'Retirar la solicitud', withdrawChanges: 'Retirar los cambios', confirmWithdrawRequest: '¿Retirar esta solicitud?', confirmWithdrawChanges: '¿Retirar estos cambios?',
209
+ cancelledState: 'Cancelado', goesLive: 'Se publica el {date}', scheduled: 'Programado',
210
+ cancelledDate: 'Cancelada', movedFrom: 'Antes: {when}', cancel: 'Cancelar', restore: 'Restaurar', cancelLabel: 'Cancelar {when}', restoreLabel: 'Restaurar {when}',
211
+ confirmCancelDate: '¿Cancelar esta fecha? Aparecerá como cancelada de inmediato.', suggestChanges: 'Sugerir cambios', view: 'Ver',
212
+ moveDate: 'Cambiar…', moveDateLabel: 'Cambiar {when}', moveBack: 'Regresar a su horario', confirmMoveBack: '¿Regresar esta fecha a su horario de siempre?',
213
+ date: 'Fecha', starts: 'Empieza', ends: 'Termina', rooms: 'Salas', roomsHint: 'Las salas que usa este evento y las que el equipo permite solicitar.',
214
+ publicNote: 'Nota para los asistentes', publicNoteHint: 'Se muestra con la fecha y en el correo a quienes se inscribieron.',
215
+ moveNow: 'Cambiar esta fecha', sendForApproval: 'Enviar para aprobación', approvalHint: 'El equipo aprueba los cambios de fecha. La fecha sigue igual hasta entonces.',
216
+ moveRequested: 'Cambio a {when} en espera de aprobación', moveBackRequested: 'Regreso a su horario en espera de aprobación',
217
+ roomTaken: '{rooms} está ocupada a esa hora.', roomsTaken: '{rooms} están ocupadas a esa hora.', sendInstead: 'Puedes enviar este cambio al equipo como solicitud. La fecha sigue igual hasta que respondan.',
218
+ messageForTeam: 'Mensaje para el equipo', sendAsRequest: 'Enviar como solicitud',
219
+ changeFrom: 'Cambiar desde esta fecha…', changeFromLabel: 'Cambiar {title} desde el {when}',
220
+ changeFromHint: 'Para un cambio duradero, como un nuevo día u horario. Las fechas anteriores quedan igual. El equipo lo aplica, y a quienes se inscribieron les avisamos sus nuevas fechas.',
221
+ changeFromRequested: 'Cambio desde el {when} en espera de aprobación', weekday: 'Día', everyWeek: 'Cada semana',
222
+ form: {
223
+ title: 'Título', when: 'Cuándo', date: 'Fecha', starts: 'Empieza', ends: 'Termina', optional: '(opcional)', allDay: 'Todo el día', allDayHint: 'Sin hora de inicio ni de fin',
224
+ multiDay: 'Este evento dura {days} días. Si cambias la fecha, se mueven todos.', repeats: 'Se repite', where: 'Dónde',
225
+ wherePlaceholder: 'Una sala, una dirección o “En línea”', description: 'Descripción', descriptionHint: 'Texto simple. Deja una línea en blanco entre párrafos.',
226
+ calendar: 'Calendario', notSure: 'No sé (el equipo lo elige)', choose: 'Elige…', note: 'Nota para el equipo', staffOnly: '(solo la ve el equipo)',
227
+ asSetByTeam: '{repeat} (como lo dejó el equipo)',
228
+ repeat: { none: 'No se repite', daily: 'Todos los días', weekly: 'Cada semana', biweekly: 'Cada 2 semanas', monthly: 'Cada mes' },
229
+ },
230
+ newTitle: 'Solicitar un evento', newLede: 'Cuéntale al equipo qué te gustaría organizar. Aparece en el calendario cuando lo aprueben.', submit: 'Enviar para aprobación',
231
+ noRequestRole: 'Tu rol no incluye “Solicitar eventos”. Pídeselo al equipo del sitio si lo necesitas.',
232
+ suggestTitle: 'Sugerir cambios', editTitle: 'Editar tu solicitud', suggestLede: '“{title}” sigue igual en el sitio hasta que el equipo apruebe tus cambios.',
233
+ declinedLede: 'Haz tus cambios y envíala otra vez.', waitingLede: 'Está en espera de aprobación. Al guardar, se envía la solicitud actualizada.',
234
+ draftLede: 'Todavía no está en el calendario. Envíala al equipo cuando esté lista.', sendChanges: 'Enviar cambios para aprobación',
235
+ changesWaitingNote: 'Los cambios que enviaste esperan aprobación; aparecen abajo. Si los envías otra vez, los reemplazas.',
236
+ declinedChanges: 'El equipo rechazó tus últimos cambios.', declinedRequest: 'El equipo rechazó esta solicitud.', theySaid: 'Dijeron:',
237
+ errors: {
238
+ 'sign-in': 'Inicia sesión para continuar.', 'no-request-role': 'Tu rol no incluye “Solicitar eventos”. Pídeselo al equipo del sitio si lo necesitas.',
239
+ 'not-found': 'Ese evento no está disponible.', 'request-not-found': 'Esa solicitud ya no está disponible.',
240
+ 'rate-limit': 'Son muchas solicitudes en una hora. Inténtalo más tarde.', 'too-many-waiting': 'Ya tienes muchas solicitudes en espera. Espera a que el equipo las responda.',
241
+ title: 'Ponle un título al evento.', start: 'Elige una fecha y una hora de inicio.', end: 'Elige una hora de fin válida.', 'end-before-start': 'El fin tiene que ser después del inicio.',
242
+ repeat: 'Elige de la lista cada cuánto se repite.', calendar: 'Elige un calendario de la lista.', field: 'Elige {label} de la lista.',
243
+ 'staff-editing': 'El equipo está editando este evento ahora. Inténtalo más tarde.', 'nothing-to-withdraw': 'Este evento no tiene una solicitud que retirar.',
244
+ 'one-off': 'Solo un evento que se repite tiene fechas que se cambian una por una.', 'not-a-date': 'Esa fecha no es parte de este evento.',
245
+ 'cancelled-event': 'Este evento está cancelado.', 'cancelled-date': 'Esa fecha está cancelada. Restáurala antes de cambiarla.',
246
+ started: 'Esa fecha ya empezó o ya pasó.', 'original-passed': 'Su horario de siempre ya pasó.', past: 'Elige una hora que todavía no haya pasado.',
247
+ 'bad-time': 'Elige una fecha y hora válidas.', 'room-not-allowed': 'Elige entre las salas que usa este evento, o pide otra sala al equipo.',
248
+ unchanged: 'La fecha ya está así.', 'previous-date': 'Elige una primera fecha después de la anterior.', answered: 'Esa solicitud ya tiene respuesta.',
249
+ unavailable: 'Esa acción no está disponible aquí.',
250
+ },
251
+ somethingWrong: 'Algo salió mal. Inténtalo de nuevo.',
252
+ };
253
+
254
+ const FR: MemberStrings = {
255
+ signedInAs: 'Connecté en tant que {name}', openAdmin: 'Ouvrir l’administration', signOut: 'Se déconnecter',
256
+ myEvents: 'Mes événements', back: '← Mes événements', requestEvent: 'Demander un événement',
257
+ flash: {
258
+ sent: 'Merci ! L’équipe a reçu votre demande. Vous aurez une réponse dès qu’elle l’aura examinée.',
259
+ updated: 'Votre demande est mise à jour et attend une approbation.',
260
+ changes: 'L’équipe a reçu vos modifications. L’événement reste tel quel jusqu’à leur approbation.',
261
+ withdrawn: 'Demande retirée.',
262
+ cancelled: 'Cette date est annulée. Le calendrier l’affiche comme annulée.',
263
+ restored: 'Cette date est rétablie.',
264
+ moved: 'La date est déplacée. Les inscrits ont reçu le nouvel horaire par e-mail.',
265
+ movedBack: 'La date revient à son horaire habituel. Les inscrits ont été prévenus par e-mail.',
266
+ moveSent: 'L’équipe a reçu votre déplacement. La date reste telle quelle jusqu’à son approbation.',
267
+ fromDateSent: 'L’équipe a reçu votre changement d’horaire. Rien ne change avant qu’elle l’applique.',
268
+ dismissed: 'C’est effacé.',
269
+ },
270
+ requests: 'Demandes', upcoming: 'À venir', pastEvents: 'Événements passés ({count})', showingRecent: 'Les {count} plus récents sont affichés.',
271
+ noUpcoming: 'Vous n’animez aucun événement à venir.', requestOne: 'Demandez-en un', requestOneRest: ' et l’équipe l’examinera.',
272
+ waiting: 'En attente d’approbation', declined: 'Refusée', changesWaiting: 'Modifications en attente d’approbation', changesDeclined: 'Modifications refusées',
273
+ moveWaiting: 'Déplacement en attente d’approbation', moveDeclined: 'Déplacement refusé', moveApproved: 'Déplacement approuvé',
274
+ fromDateWaiting: 'Changement d’horaire en attente d’approbation', fromDateDeclined: 'Changement d’horaire refusé', fromDateApproved: 'Changement d’horaire appliqué',
275
+ sentOn: 'Envoyée le {date}', teamSaid: 'L’équipe a répondu :', edit: 'Modifier', suggestAgain: 'Proposer de nouveau', dismiss: 'Effacer', withdraw: 'Retirer',
276
+ withdrawRequest: 'Retirer la demande', withdrawChanges: 'Retirer les modifications', confirmWithdrawRequest: 'Retirer cette demande ?', confirmWithdrawChanges: 'Retirer ces modifications ?',
277
+ cancelledState: 'Annulé', goesLive: 'En ligne le {date}', scheduled: 'Programmé',
278
+ cancelledDate: 'Annulée', movedFrom: 'Déplacée depuis {when}', cancel: 'Annuler', restore: 'Rétablir', cancelLabel: 'Annuler {when}', restoreLabel: 'Rétablir {when}',
279
+ confirmCancelDate: 'Annuler cette date ? Elle apparaît annulée tout de suite.', suggestChanges: 'Proposer des modifications', view: 'Voir',
280
+ moveDate: 'Déplacer…', moveDateLabel: 'Déplacer {when}', moveBack: 'Remettre à son horaire', confirmMoveBack: 'Remettre cette date à son horaire habituel ?',
281
+ date: 'Date', starts: 'Début', ends: 'Fin', rooms: 'Salles', roomsHint: 'Les salles de cet événement, et celles que l’équipe permet de demander.',
282
+ publicNote: 'Note pour les participants', publicNoteHint: 'Affichée avec la date, et dans l’e-mail aux inscrits.',
283
+ moveNow: 'Déplacer cette date', sendForApproval: 'Envoyer pour approbation', approvalHint: 'L’équipe approuve les déplacements. La date reste telle quelle d’ici là.',
284
+ moveRequested: 'Déplacement au {when} en attente d’approbation', moveBackRequested: 'Retour à l’horaire habituel en attente d’approbation',
285
+ roomTaken: '{rooms} est occupée à cette heure-là.', roomsTaken: '{rooms} sont occupées à cette heure-là.', sendInstead: 'Vous pouvez envoyer ce déplacement à l’équipe sous forme de demande. La date reste telle quelle jusqu’à sa réponse.',
286
+ messageForTeam: 'Message pour l’équipe', sendAsRequest: 'Envoyer comme demande',
287
+ changeFrom: 'Changer à partir de cette date…', changeFromLabel: 'Changer {title} à partir du {when}',
288
+ changeFromHint: 'Pour un changement durable, comme un nouveau jour ou horaire. Les dates précédentes restent telles quelles. L’équipe l’applique, et les inscrits sont prévenus de leurs nouvelles dates.',
289
+ changeFromRequested: 'Changement à partir du {when} en attente d’approbation', weekday: 'Jour', everyWeek: 'Chaque semaine',
290
+ form: {
291
+ title: 'Titre', when: 'Quand', date: 'Date', starts: 'Début', ends: 'Fin', optional: '(facultatif)', allDay: 'Toute la journée', allDayHint: 'Sans heure de début ni de fin',
292
+ multiDay: 'Cet événement dure {days} jours. Changer la date les déplace tous.', repeats: 'Répétition', where: 'Lieu',
293
+ wherePlaceholder: 'Une salle, une adresse ou « En ligne »', description: 'Description', descriptionHint: 'Texte simple. Laissez une ligne vide entre les paragraphes.',
294
+ calendar: 'Calendrier', notSure: 'Je ne sais pas (l’équipe choisira)', choose: 'Choisir…', note: 'Note pour l’équipe', staffOnly: '(visible par l’équipe seulement)',
295
+ asSetByTeam: '{repeat} (défini par l’équipe)',
296
+ repeat: { none: 'Ne se répète pas', daily: 'Tous les jours', weekly: 'Chaque semaine', biweekly: 'Toutes les 2 semaines', monthly: 'Chaque mois' },
297
+ },
298
+ newTitle: 'Demander un événement', newLede: 'Dites à l’équipe ce que vous aimeriez animer. Il apparaît au calendrier une fois approuvé.', submit: 'Envoyer pour approbation',
299
+ noRequestRole: 'Votre rôle ne comprend pas « Demander des événements ». Demandez-le à l’équipe du site si besoin.',
300
+ suggestTitle: 'Proposer des modifications', editTitle: 'Modifier votre demande', suggestLede: '« {title} » reste tel quel sur le site jusqu’à ce que l’équipe approuve vos modifications.',
301
+ declinedLede: 'Faites vos modifications et renvoyez-la.', waitingLede: 'Elle attend une approbation. Enregistrer envoie la demande mise à jour.',
302
+ draftLede: 'Il n’est pas encore au calendrier. Envoyez-le à l’équipe quand il est prêt.', sendChanges: 'Envoyer les modifications pour approbation',
303
+ changesWaitingNote: 'Les modifications envoyées attendent une approbation ; elles sont reprises ci-dessous. Les renvoyer les remplace.',
304
+ declinedChanges: 'L’équipe a refusé vos dernières modifications.', declinedRequest: 'L’équipe a refusé cette demande.', theySaid: 'Réponse :',
305
+ errors: {
306
+ 'sign-in': 'Connectez-vous pour continuer.', 'no-request-role': 'Votre rôle ne comprend pas « Demander des événements ». Demandez-le à l’équipe du site si besoin.',
307
+ 'not-found': 'Cet événement n’est pas disponible.', 'request-not-found': 'Cette demande n’est plus disponible.',
308
+ 'rate-limit': 'Cela fait beaucoup de demandes en une heure. Réessayez plus tard.', 'too-many-waiting': 'Vous avez déjà beaucoup de demandes en attente. Attendez que l’équipe y réponde.',
309
+ title: 'Donnez un titre à l’événement.', start: 'Choisissez une date et une heure de début.', end: 'Choisissez une heure de fin valide.', 'end-before-start': 'La fin doit venir après le début.',
310
+ repeat: 'Choisissez la répétition dans la liste.', calendar: 'Choisissez un calendrier dans la liste.', field: 'Choisissez {label} dans la liste.',
311
+ 'staff-editing': 'L’équipe modifie cet événement en ce moment. Réessayez plus tard.', 'nothing-to-withdraw': 'Il n’y a pas de demande à retirer sur cet événement.',
312
+ 'one-off': 'Seul un événement répété a des dates à changer une par une.', 'not-a-date': 'Cette date ne fait pas partie de cet événement.',
313
+ 'cancelled-event': 'Cet événement est annulé.', 'cancelled-date': 'Cette date est annulée. Rétablissez-la avant de la déplacer.',
314
+ started: 'Cette date a déjà commencé ou est passée.', 'original-passed': 'Son horaire habituel est déjà passé.', past: 'Choisissez une heure qui n’est pas encore passée.',
315
+ 'bad-time': 'Choisissez une date et une heure valides.', 'room-not-allowed': 'Choisissez parmi les salles de cet événement, ou demandez une autre salle à l’équipe.',
316
+ unchanged: 'La date est déjà là.', 'previous-date': 'Choisissez une première date après la précédente.', answered: 'Cette demande a déjà reçu une réponse.',
317
+ unavailable: 'Cette action n’est pas disponible ici.',
318
+ },
319
+ somethingWrong: 'Une erreur s’est produite. Réessayez.',
320
+ };
321
+
322
+ const DE: MemberStrings = {
323
+ signedInAs: 'Angemeldet als {name}', openAdmin: 'Verwaltung öffnen', signOut: 'Abmelden',
324
+ myEvents: 'Meine Termine', back: '← Meine Termine', requestEvent: 'Termin anfragen',
325
+ flash: {
326
+ sent: 'Danke! Das Team hat deine Anfrage. Du hörst von uns, sobald es sie angesehen hat.',
327
+ updated: 'Deine Anfrage ist aktualisiert und wartet auf Freigabe.',
328
+ changes: 'Das Team hat deine Änderungen. Der Termin bleibt, wie er ist, bis sie freigegeben sind.',
329
+ withdrawn: 'Anfrage zurückgezogen.',
330
+ cancelled: 'Dieser Termin ist abgesagt. Der Kalender zeigt ihn als abgesagt.',
331
+ restored: 'Dieser Termin findet wieder statt.',
332
+ moved: 'Der Termin ist verlegt. Wer angemeldet ist, hat die neue Zeit per E-Mail bekommen.',
333
+ movedBack: 'Der Termin ist wieder zur gewohnten Zeit. Wer angemeldet ist, hat eine E-Mail bekommen.',
334
+ moveSent: 'Das Team hat deine Verlegung. Der Termin bleibt, wie er ist, bis sie freigegeben ist.',
335
+ fromDateSent: 'Das Team hat deine Planänderung. Es ändert sich nichts, bis sie übernommen ist.',
336
+ dismissed: 'Erledigt.',
337
+ },
338
+ requests: 'Anfragen', upcoming: 'Demnächst', pastEvents: 'Vergangene Termine ({count})', showingRecent: 'Die {count} neuesten werden gezeigt.',
339
+ noUpcoming: 'Du leitest keine kommenden Termine.', requestOne: 'Frag einen an', requestOneRest: ', und das Team sieht ihn sich an.',
340
+ waiting: 'Wartet auf Freigabe', declined: 'Abgelehnt', changesWaiting: 'Änderungen warten auf Freigabe', changesDeclined: 'Änderungen abgelehnt',
341
+ moveWaiting: 'Verlegung wartet auf Freigabe', moveDeclined: 'Verlegung abgelehnt', moveApproved: 'Verlegung freigegeben',
342
+ fromDateWaiting: 'Planänderung wartet auf Freigabe', fromDateDeclined: 'Planänderung abgelehnt', fromDateApproved: 'Planänderung übernommen',
343
+ sentOn: 'Gesendet am {date}', teamSaid: 'Das Team schreibt:', edit: 'Bearbeiten', suggestAgain: 'Erneut Änderungen vorschlagen', dismiss: 'Ausblenden', withdraw: 'Zurückziehen',
344
+ withdrawRequest: 'Anfrage zurückziehen', withdrawChanges: 'Änderungen zurückziehen', confirmWithdrawRequest: 'Diese Anfrage zurückziehen?', confirmWithdrawChanges: 'Diese Änderungen zurückziehen?',
345
+ cancelledState: 'Abgesagt', goesLive: 'Online ab {date}', scheduled: 'Geplant',
346
+ cancelledDate: 'Abgesagt', movedFrom: 'Verlegt von {when}', cancel: 'Absagen', restore: 'Wiederherstellen', cancelLabel: '{when} absagen', restoreLabel: '{when} wiederherstellen',
347
+ confirmCancelDate: 'Diesen Termin absagen? Er erscheint sofort als abgesagt.', suggestChanges: 'Änderungen vorschlagen', view: 'Ansehen',
348
+ moveDate: 'Verlegen…', moveDateLabel: '{when} verlegen', moveBack: 'Zurückverlegen', confirmMoveBack: 'Diesen Termin wieder auf die gewohnte Zeit legen?',
349
+ date: 'Datum', starts: 'Beginn', ends: 'Ende', rooms: 'Räume', roomsHint: 'Die Räume dieses Termins und die, die man beim Team anfragen kann.',
350
+ publicNote: 'Hinweis für Teilnehmende', publicNoteHint: 'Steht beim Termin und in der E-Mail an die Angemeldeten.',
351
+ moveNow: 'Termin verlegen', sendForApproval: 'Zur Freigabe senden', approvalHint: 'Das Team gibt Verlegungen frei. Bis dahin bleibt der Termin, wie er ist.',
352
+ moveRequested: 'Verlegung auf {when} wartet auf Freigabe', moveBackRequested: 'Zurückverlegen wartet auf Freigabe',
353
+ roomTaken: '{rooms} ist zu dieser Zeit belegt.', roomsTaken: '{rooms} sind zu dieser Zeit belegt.', sendInstead: 'Du kannst diese Verlegung stattdessen als Anfrage ans Team schicken. Bis zur Antwort bleibt der Termin, wie er ist.',
354
+ messageForTeam: 'Nachricht ans Team', sendAsRequest: 'Als Anfrage senden',
355
+ changeFrom: 'Ab diesem Termin ändern…', changeFromLabel: '{title} ab {when} ändern',
356
+ changeFromHint: 'Für eine dauerhafte Änderung, etwa ein neuer Tag oder eine neue Zeit. Frühere Termine bleiben, wie sie sind. Das Team übernimmt sie, und Angemeldete erfahren ihre neuen Termine.',
357
+ changeFromRequested: 'Änderung ab {when} wartet auf Freigabe', weekday: 'Tag', everyWeek: 'Jede Woche',
358
+ form: {
359
+ title: 'Titel', when: 'Wann', date: 'Datum', starts: 'Beginn', ends: 'Ende', optional: '(optional)', allDay: 'Ganztägig', allDayHint: 'Ohne Beginn- und Endzeit',
360
+ multiDay: 'Dieser Termin dauert {days} Tage. Ein neues Datum verschiebt alle.', repeats: 'Wiederholung', where: 'Wo',
361
+ wherePlaceholder: 'Ein Raum, eine Adresse oder „Online“', description: 'Beschreibung', descriptionHint: 'Einfacher Text. Zwischen Absätzen eine Leerzeile lassen.',
362
+ calendar: 'Kalender', notSure: 'Weiß nicht (das Team wählt)', choose: 'Auswählen…', note: 'Hinweis ans Team', staffOnly: '(nur für das Team sichtbar)',
363
+ asSetByTeam: '{repeat} (vom Team festgelegt)',
364
+ repeat: { none: 'Keine Wiederholung', daily: 'Jeden Tag', weekly: 'Jede Woche', biweekly: 'Alle 2 Wochen', monthly: 'Jeden Monat' },
365
+ },
366
+ newTitle: 'Termin anfragen', newLede: 'Sag dem Team, was du leiten möchtest. Nach der Freigabe steht es im Kalender.', submit: 'Zur Freigabe senden',
367
+ noRequestRole: 'Deine Rolle enthält „Termine anfragen“ nicht. Frag das Team der Seite, wenn du es brauchst.',
368
+ suggestTitle: 'Änderungen vorschlagen', editTitle: 'Anfrage bearbeiten', suggestLede: '„{title}“ bleibt auf der Seite, wie er ist, bis das Team deine Änderungen freigibt.',
369
+ declinedLede: 'Ändere sie und sende sie erneut.', waitingLede: 'Sie wartet auf Freigabe. Speichern sendet die aktualisierte Anfrage.',
370
+ draftLede: 'Er steht noch nicht im Kalender. Sende ihn ans Team, wenn er fertig ist.', sendChanges: 'Änderungen zur Freigabe senden',
371
+ changesWaitingNote: 'Deine gesendeten Änderungen warten auf Freigabe; sie sind unten eingetragen. Erneutes Senden ersetzt sie.',
372
+ declinedChanges: 'Das Team hat deine letzten Änderungen abgelehnt.', declinedRequest: 'Das Team hat diese Anfrage abgelehnt.', theySaid: 'Antwort:',
373
+ errors: {
374
+ 'sign-in': 'Melde dich an, um fortzufahren.', 'no-request-role': 'Deine Rolle enthält „Termine anfragen“ nicht. Frag das Team der Seite, wenn du es brauchst.',
375
+ 'not-found': 'Dieser Termin ist nicht verfügbar.', 'request-not-found': 'Diese Anfrage ist nicht mehr verfügbar.',
376
+ 'rate-limit': 'Das sind viele Anfragen in einer Stunde. Versuch es später noch einmal.', 'too-many-waiting': 'Du hast schon viele offene Anfragen. Warte, bis das Team sie beantwortet.',
377
+ title: 'Gib dem Termin einen Titel.', start: 'Wähle ein Datum und eine Beginnzeit.', end: 'Wähle eine gültige Endzeit.', 'end-before-start': 'Das Ende muss nach dem Beginn liegen.',
378
+ repeat: 'Wähle die Wiederholung aus der Liste.', calendar: 'Wähle einen Kalender aus der Liste.', field: 'Wähle {label} aus der Liste.',
379
+ 'staff-editing': 'Das Team bearbeitet diesen Termin gerade. Versuch es später noch einmal.', 'nothing-to-withdraw': 'Zu diesem Termin gibt es keine Anfrage zum Zurückziehen.',
380
+ 'one-off': 'Nur ein wiederkehrender Termin hat einzelne Daten zum Ändern.', 'not-a-date': 'Dieses Datum gehört nicht zu diesem Termin.',
381
+ 'cancelled-event': 'Dieser Termin ist abgesagt.', 'cancelled-date': 'Dieses Datum ist abgesagt. Stell es wieder her, bevor du es verlegst.',
382
+ started: 'Dieser Termin hat schon begonnen oder ist vorbei.', 'original-passed': 'Seine gewohnte Zeit ist schon vorbei.', past: 'Wähle eine Zeit, die noch nicht vorbei ist.',
383
+ 'bad-time': 'Wähle ein gültiges Datum und eine gültige Uhrzeit.', 'room-not-allowed': 'Wähle einen Raum dieses Termins, oder frag das Team nach einem anderen.',
384
+ unchanged: 'Der Termin liegt schon dort.', 'previous-date': 'Wähle ein erstes Datum nach dem vorherigen.', answered: 'Diese Anfrage wurde schon beantwortet.',
385
+ unavailable: 'Diese Aktion ist hier nicht verfügbar.',
386
+ },
387
+ somethingWrong: 'Etwas ist schiefgelaufen. Versuch es noch einmal.',
388
+ };
389
+
390
+ const PT: MemberStrings = {
391
+ signedInAs: 'Conectado como {name}', openAdmin: 'Abrir o painel', signOut: 'Sair',
392
+ myEvents: 'Meus eventos', back: '← Meus eventos', requestEvent: 'Pedir um evento',
393
+ flash: {
394
+ sent: 'Obrigado! A equipe recebeu seu pedido. Você terá uma resposta assim que eles olharem.',
395
+ updated: 'Seu pedido foi atualizado e aguarda aprovação.',
396
+ changes: 'A equipe recebeu suas alterações. O evento continua como está até que elas sejam aprovadas.',
397
+ withdrawn: 'Pedido retirado.',
398
+ cancelled: 'Essa data foi cancelada. O calendário a mostra como cancelada.',
399
+ restored: 'Essa data voltou a acontecer.',
400
+ moved: 'A data mudou. Quem se inscreveu recebeu o novo horário por e-mail.',
401
+ movedBack: 'A data voltou ao horário de sempre. Quem se inscreveu foi avisado por e-mail.',
402
+ moveSent: 'A equipe recebeu sua mudança de data. A data continua como está até ser aprovada.',
403
+ fromDateSent: 'A equipe recebeu sua mudança de horário. Nada muda até que ela seja aplicada.',
404
+ dismissed: 'Pronto.',
405
+ },
406
+ requests: 'Pedidos', upcoming: 'Próximos', pastEvents: 'Eventos passados ({count})', showingRecent: 'Mostrando os {count} mais recentes.',
407
+ noUpcoming: 'Você não está à frente de nenhum evento próximo.', requestOne: 'Peça um', requestOneRest: ' e a equipe vai analisar.',
408
+ waiting: 'Aguardando aprovação', declined: 'Recusado', changesWaiting: 'Alterações aguardando aprovação', changesDeclined: 'Alterações recusadas',
409
+ moveWaiting: 'Mudança de data aguardando aprovação', moveDeclined: 'Mudança de data recusada', moveApproved: 'Mudança de data aprovada',
410
+ fromDateWaiting: 'Mudança de horário aguardando aprovação', fromDateDeclined: 'Mudança de horário recusada', fromDateApproved: 'Mudança de horário aplicada',
411
+ sentOn: 'Enviado em {date}', teamSaid: 'A equipe disse:', edit: 'Editar', suggestAgain: 'Sugerir alterações de novo', dismiss: 'Dispensar', withdraw: 'Retirar',
412
+ withdrawRequest: 'Retirar pedido', withdrawChanges: 'Retirar alterações', confirmWithdrawRequest: 'Retirar este pedido?', confirmWithdrawChanges: 'Retirar estas alterações?',
413
+ cancelledState: 'Cancelado', goesLive: 'Publicado em {date}', scheduled: 'Agendado',
414
+ cancelledDate: 'Cancelada', movedFrom: 'Antes: {when}', cancel: 'Cancelar', restore: 'Restaurar', cancelLabel: 'Cancelar {when}', restoreLabel: 'Restaurar {when}',
415
+ confirmCancelDate: 'Cancelar esta data? Ela aparece como cancelada na hora.', suggestChanges: 'Sugerir alterações', view: 'Ver',
416
+ moveDate: 'Mudar…', moveDateLabel: 'Mudar {when}', moveBack: 'Voltar ao horário', confirmMoveBack: 'Voltar esta data ao horário de sempre?',
417
+ date: 'Data', starts: 'Começa', ends: 'Termina', rooms: 'Salas', roomsHint: 'As salas deste evento e as que a equipe deixa pedir.',
418
+ publicNote: 'Aviso para os participantes', publicNoteHint: 'Aparece com a data e no e-mail para quem se inscreveu.',
419
+ moveNow: 'Mudar esta data', sendForApproval: 'Enviar para aprovação', approvalHint: 'A equipe aprova mudanças de data. Até lá, a data continua como está.',
420
+ moveRequested: 'Mudança para {when} aguardando aprovação', moveBackRequested: 'Volta ao horário aguardando aprovação',
421
+ roomTaken: '{rooms} está ocupada nesse horário.', roomsTaken: '{rooms} estão ocupadas nesse horário.', sendInstead: 'Você pode enviar esta mudança para a equipe como pedido. A data continua como está até a resposta.',
422
+ messageForTeam: 'Mensagem para a equipe', sendAsRequest: 'Enviar como pedido',
423
+ changeFrom: 'Mudar a partir desta data…', changeFromLabel: 'Mudar {title} a partir de {when}',
424
+ changeFromHint: 'Para uma mudança duradoura, como um novo dia ou horário. As datas anteriores continuam como estão. A equipe aplica, e quem se inscreveu é avisado das novas datas.',
425
+ changeFromRequested: 'Mudança a partir de {when} aguardando aprovação', weekday: 'Dia', everyWeek: 'Toda semana',
426
+ form: {
427
+ title: 'Título', when: 'Quando', date: 'Data', starts: 'Começa', ends: 'Termina', optional: '(opcional)', allDay: 'Dia inteiro', allDayHint: 'Sem hora de início ou fim',
428
+ multiDay: 'Este evento dura {days} dias. Mudar a data move todos eles.', repeats: 'Repete', where: 'Onde',
429
+ wherePlaceholder: 'Uma sala, um endereço ou “On-line”', description: 'Descrição', descriptionHint: 'Texto simples. Deixe uma linha em branco entre parágrafos.',
430
+ calendar: 'Calendário', notSure: 'Não sei (a equipe escolhe)', choose: 'Escolha…', note: 'Nota para a equipe', staffOnly: '(só a equipe vê)',
431
+ asSetByTeam: '{repeat} (definido pela equipe)',
432
+ repeat: { none: 'Não se repete', daily: 'Todos os dias', weekly: 'Toda semana', biweekly: 'A cada 2 semanas', monthly: 'Todo mês' },
433
+ },
434
+ newTitle: 'Pedir um evento', newLede: 'Conte à equipe o que você gostaria de organizar. Ele entra no calendário quando for aprovado.', submit: 'Enviar para aprovação',
435
+ noRequestRole: 'Seu papel não inclui “Pedir eventos”. Peça à equipe do site se precisar.',
436
+ suggestTitle: 'Sugerir alterações', editTitle: 'Editar seu pedido', suggestLede: '“{title}” continua como está no site até a equipe aprovar suas alterações.',
437
+ declinedLede: 'Faça suas alterações e envie de novo.', waitingLede: 'Ele aguarda aprovação. Salvar envia o pedido atualizado.',
438
+ draftLede: 'Ainda não está no calendário. Envie para a equipe quando estiver pronto.', sendChanges: 'Enviar alterações para aprovação',
439
+ changesWaitingNote: 'As alterações que você enviou aguardam aprovação; estão preenchidas abaixo. Enviar de novo as substitui.',
440
+ declinedChanges: 'A equipe recusou suas últimas alterações.', declinedRequest: 'A equipe recusou este pedido.', theySaid: 'Disseram:',
441
+ errors: {
442
+ 'sign-in': 'Entre para continuar.', 'no-request-role': 'Seu papel não inclui “Pedir eventos”. Peça à equipe do site se precisar.',
443
+ 'not-found': 'Esse evento não está disponível.', 'request-not-found': 'Esse pedido não está mais disponível.',
444
+ 'rate-limit': 'São muitos pedidos em uma hora. Tente mais tarde.', 'too-many-waiting': 'Você já tem muitos pedidos aguardando. Espere a equipe responder.',
445
+ title: 'Dê um título ao evento.', start: 'Escolha uma data e um horário de início.', end: 'Escolha um horário de término válido.', 'end-before-start': 'O fim precisa ser depois do início.',
446
+ repeat: 'Escolha na lista com que frequência se repete.', calendar: 'Escolha um calendário da lista.', field: 'Escolha {label} na lista.',
447
+ 'staff-editing': 'A equipe está editando este evento agora. Tente mais tarde.', 'nothing-to-withdraw': 'Não há pedido para retirar neste evento.',
448
+ 'one-off': 'Só um evento que se repete tem datas para mudar uma a uma.', 'not-a-date': 'Essa data não faz parte deste evento.',
449
+ 'cancelled-event': 'Este evento está cancelado.', 'cancelled-date': 'Essa data está cancelada. Restaure-a antes de mudá-la.',
450
+ started: 'Essa data já começou ou já passou.', 'original-passed': 'O horário de sempre já passou.', past: 'Escolha um horário que ainda não passou.',
451
+ 'bad-time': 'Escolha uma data e um horário válidos.', 'room-not-allowed': 'Escolha entre as salas deste evento, ou peça outra sala à equipe.',
452
+ unchanged: 'A data já está assim.', 'previous-date': 'Escolha uma primeira data depois da anterior.', answered: 'Esse pedido já foi respondido.',
453
+ unavailable: 'Essa ação não está disponível aqui.',
454
+ },
455
+ somethingWrong: 'Algo deu errado. Tente de novo.',
456
+ };
457
+
458
+ const STRINGS: Record<string, MemberStrings> = { en: EN, es: ES, fr: FR, de: DE, pt: PT };
459
+
460
+ export const memberStrings = (locale: string | null | undefined): MemberStrings =>
461
+ STRINGS[(locale || 'en').toLowerCase().split('-')[0]] ?? EN;
462
+
463
+ /** An error from the member functions in the page's words: by its `code`, else its own (English) message; `label` fills a field's name, `rooms` a taken room's names (joined in `lang`). */
464
+ export function memberError(w: MemberStrings, err: { code?: unknown; message: string; label?: unknown; rooms?: unknown }, lang?: string): string {
465
+ if (err.code === 'room-taken' && Array.isArray(err.rooms) && err.rooms.length) {
466
+ const rooms = err.rooms.map(String);
467
+ let list: string;
468
+ try { list = new Intl.ListFormat(lang || 'en', { type: 'conjunction' }).format(rooms); } catch { list = rooms.join(', '); }
469
+ return (rooms.length > 1 ? w.roomsTaken : w.roomTaken).replace('{rooms}', list);
470
+ }
471
+ const word = typeof err.code === 'string' ? w.errors[err.code] : undefined;
472
+ return word ? word.replace('{label}', typeof err.label === 'string' ? err.label : '') : err.message;
473
+ }
@@ -1,5 +1,5 @@
1
1
  import { userConfig } from 'virtual:acms-config';
2
2
 
3
- /** where the built-in member pages live (acms({ members })); `notify` hears about new requests */
4
- export const MEMBERS: { enabled: boolean; base: string; notify: string[] } = { enabled: false, base: '/members', notify: [], ...(userConfig.members ?? {}) };
3
+ /** where the built-in member pages live (acms({ members })); `notify` hears about new requests; `hostMoves`: a host's date move applies at once ('direct', while its rooms are free) or waits for staff ('approve') */
4
+ export const MEMBERS: { enabled: boolean; base: string; notify: string[]; hostMoves: 'direct' | 'approve' } = { enabled: false, base: '/members', notify: [], hostMoves: 'direct', ...(userConfig.members ?? {}) };
5
5
  export const memberEventsPath = () => `${MEMBERS.base}/events`;