Skærmbillederne skulle tages på engelsk, og det var dét, der fandt dem: en konto sat til engelsk fik stadig "Forsinket" over de forsinkede opgaver, "Uden sektion" over den første kolonne på tavlen, "Aldrig" i gentagelses- menuen, "hver dag" på rækken, "til instansen · inviteret af" på invitationen, "3 projekter" på kontoen, og hele historikken — nitten hændelser, alle på dansk. En funktion, der kun virker på det ene sprog, er en funktion, der er i stykker. Gentagelsen er den eneste, der ikke bare manglede en nøgle. Serveren skriver `recurrence_text` på dansk og skal blive ved med det: én besked går over WebSocket til alle i projektet på én gang, og de læser ikke det samme sprog. Så de regler, der har et navn, får det i when.js — på den side, der ved, hvis skærm det er — og alt mere specifikt falder tilbage til serverens ord. Mellemrummet i historikken er skrevet ud. Svelte fjerner det, der åbner en blok, så "inviterede" og adressen løb sammen til ét ord. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
53 lines
2.0 KiB
JavaScript
53 lines
2.0 KiB
JavaScript
/**
|
|
* What each recorded activity event is called.
|
|
*
|
|
* The keys are the server's and they are stable; this is the only place they get a
|
|
* name. It lives in its own module because two surfaces read the same log now — a
|
|
* project's own history panel, and the administrator's instance-wide audit page —
|
|
* and two copies of twenty strings is two places for them to drift apart.
|
|
*
|
|
* The names themselves are in the dictionaries rather than here. They were written
|
|
* out in Danish, which made the whole of both history pages Danish for somebody
|
|
* reading the rest of the app in English.
|
|
*
|
|
* An unknown key falls through to the key itself rather than being hidden: a build
|
|
* that records something this table has not learned yet should still show that it
|
|
* happened.
|
|
*/
|
|
import { t } from './i18n.svelte.js';
|
|
|
|
export const EVENTS = {
|
|
'project.created': 'event.projectCreated',
|
|
'project.updated': 'event.projectUpdated',
|
|
'project.deleted': 'event.projectDeleted',
|
|
'project.imported': 'event.projectImported',
|
|
'section.created': 'event.sectionCreated',
|
|
'section.updated': 'event.sectionUpdated',
|
|
'section.deleted': 'event.sectionDeleted',
|
|
'member.invited': 'event.memberInvited',
|
|
'member.added': 'event.memberAdded',
|
|
'member.removed': 'event.memberRemoved',
|
|
'member.role_changed': 'event.memberRoleChanged',
|
|
'task.created': 'event.taskCreated',
|
|
'task.updated': 'event.taskUpdated',
|
|
'task.completed': 'event.taskCompleted',
|
|
'task.reopened': 'event.taskReopened',
|
|
'task.moved': 'event.taskMoved',
|
|
'task.deleted': 'event.taskDeleted',
|
|
'task.split': 'event.taskSplit',
|
|
'comment.created': 'event.commentCreated',
|
|
'attachment.added': 'event.attachmentAdded'
|
|
};
|
|
|
|
/** The name of an event, or the raw key when it is one this build does not know. */
|
|
export function eventName(event) {
|
|
const key = EVENTS[event];
|
|
return key ? t(key) : event;
|
|
}
|
|
|
|
/** The bit of context an entry carries, when it has one worth reading. */
|
|
export function eventDetail(entry) {
|
|
const p = entry.payload ?? {};
|
|
return p.name ?? p.email ?? p.role ?? '';
|
|
}
|