feat(i18n): the interface speaks both languages
The account has had a `locale` since the beginning and it only chose which grammar quick add read a line with — so picking English changed nothing anybody could see, and the field said so honestly: "Sprog i hurtig tilføjelse". It says "Sprog" now, because it means it. Every component goes through `t()`. Danish is the source: a key missing from English falls through to Danish rather than to the key, because a Danish sentence in an English screen can be read and `settings.notifications.title` cannot. `tag()` is the single place `Intl` is asked. Before, `'da-DK'` was written into a dozen components, and that is the half of a translation that gets left behind — an English interface still saying "24. aug." is exactly the shape of a job half done. There is a smoke test that switches to English and refuses to see a Danish month name in the calendar's heading. Colour and theme names are keys now. `colors.js` keeps its ids untouched — they are what the database stores, and `internal/store` reads them out of that file — but `name` is `'color.tomato'`, resolved where it is drawn. The Inbox keeps its name. It is a project row the server creates at signup, not a string in the interface, and it can be renamed like any other project. Four copies of "3 hours ago" became one, in `web/src/lib/when.js`. They had already drifted: one said "aldrig logget ind", another "aldrig", and two stopped at days where the others carried on to a date. Routes stay Danish. `/indstillinger`, `/projekt`, `/uddelegeret` are bookmarks and they are in every smoke test; translating them buys nothing and costs both. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
e3c7fc792a
commit
4d8b70918b
+512
-1
@@ -72,5 +72,516 @@ export const da = {
|
||||
'task.noPriority': 'Ingen prioritet',
|
||||
|
||||
// --- a project group -----------------------------------------------------------
|
||||
'group.colorOf': 'Farve på {name}'
|
||||
'group.colorOf': 'Farve på {name}',
|
||||
|
||||
|
||||
// --- settings: the frame -------------------------------------------------------
|
||||
'settings.title': 'Indstillinger',
|
||||
'settings.tab.account': 'Konto',
|
||||
'settings.tab.notifications': 'Notifikationer',
|
||||
'settings.tab.integrations': 'Integrationer',
|
||||
'settings.tab.ai': 'AI',
|
||||
'settings.tab.tokens': 'API-tokens',
|
||||
'settings.tab.users': 'Brugere',
|
||||
'settings.tab.history': 'Historik',
|
||||
'settings.tab.errors': 'Fejl',
|
||||
'settings.tab.data': 'Data og skabeloner',
|
||||
|
||||
// --- settings: the account -----------------------------------------------------
|
||||
'account.profile': 'Profil',
|
||||
'account.profileHint':
|
||||
'Tidszonen er ikke pynt: alle datoer i appen bliver afgjort i den, så “i morgen kl. 9” betyder noget andet, når du skifter den.',
|
||||
'account.name': 'Navn',
|
||||
'account.email': 'E-mail',
|
||||
'account.emailFixed': 'Kan ikke ændres her.',
|
||||
'account.timezone': 'Tidszone',
|
||||
'account.parseLanguage': 'Sprog',
|
||||
'account.danish': 'Dansk',
|
||||
'account.english': 'English',
|
||||
'account.parseHint':
|
||||
'Både fladens sprog og den grammatik, hurtig tilføjelse tolker en linje med — “hver mandag” eller “every monday”.',
|
||||
'account.save': 'Gem',
|
||||
'account.saved': 'Gemt.',
|
||||
'account.appearance': 'Udseende',
|
||||
'account.appearanceHint':
|
||||
'Gemmes i denne browser. Det er en egenskab ved den skærm, du sidder ved — en bærbar i solen og en skærm i et mørkt rum vil have hvert sit svar.',
|
||||
'account.password': 'Adgangskode',
|
||||
'account.passwordHint':
|
||||
'At skifte den logger alle andre sessioner ud — hvilket for det meste er grunden til at gøre det.',
|
||||
'account.currentPassword': 'Nuværende adgangskode',
|
||||
'account.newPassword': 'Ny adgangskode',
|
||||
'account.changePassword': 'Skift adgangskode',
|
||||
'account.passwordChanged': 'Skiftet.',
|
||||
'account.totp': 'To-faktor',
|
||||
'account.totpHint': 'En engangskode fra en authenticator-app oven i adgangskoden.',
|
||||
'account.writeThemDown': 'Skriv dem ned nu.',
|
||||
'account.recoveryHint': 'De vises kun denne ene gang — serveren har kun deres hash.',
|
||||
'account.gotThem': 'Jeg har dem',
|
||||
'account.passwordRequired':
|
||||
'Kræves til begge handlinger nedenfor. At slå to-faktor fra er præcis det, en fremmed med din session ville gøre først.',
|
||||
'account.newRecoveryCodes': 'Nye gendannelseskoder',
|
||||
'account.totpOff': 'Slå to-faktor fra',
|
||||
'account.scanHint': 'Scan i din authenticator-app, eller indtast nøglen manuelt.',
|
||||
'account.codeFromApp': 'Koden fra appen',
|
||||
'account.totpProofHint':
|
||||
'To-faktor er først slået til, når en kode har bevist, at appen faktisk har nøglen.',
|
||||
'account.confirm': 'Bekræft',
|
||||
'account.cancel': 'Fortryd',
|
||||
'account.totpOn': 'Slå to-faktor til',
|
||||
'account.devices': 'Enheder',
|
||||
'account.devicesHint':
|
||||
'Hvor du er logget ind. Genkender du ikke en af dem, så log den ud og skift adgangskode.',
|
||||
'account.thisDevice': 'denne enhed',
|
||||
'account.signOutDevice': 'Log ud',
|
||||
|
||||
'account.totpEnabled': 'Slået til.',
|
||||
'account.recoveryLeftOne': '{n} gendannelseskode tilbage.',
|
||||
'account.recoveryLeftMany': '{n} gendannelseskoder tilbage.',
|
||||
|
||||
// --- settings: notifications ---------------------------------------------------
|
||||
'push.title': 'Notifikationer på enheden',
|
||||
'push.hint':
|
||||
'Påmindelser og beskeder fra andre, også når fanen er lukket. Beskeden krypteres til din browser undervejs — push-tjenesten kan ikke læse den.',
|
||||
'push.unsupported':
|
||||
'Denne browser understøtter det ikke. Safari kræver, at appen er lagt på hjemmeskærmen; over almindelig HTTP virker det kun på localhost.',
|
||||
'push.blocked':
|
||||
'Browseren har blokeret notifikationer for dette site. Det kan kun laves om i browserens egne indstillinger — en side kan ikke spørge igen, når svaret har været nej.',
|
||||
'push.on': 'Slået til på denne enhed.',
|
||||
'push.turnOff': 'Slå fra',
|
||||
'push.turnOn': 'Slå til på denne enhed',
|
||||
'push.perBrowser': 'Gælder kun den browser, du sidder i nu.',
|
||||
'push.recent': 'Seneste',
|
||||
'push.none': 'Ingenting endnu.',
|
||||
'push.open': 'Åbn',
|
||||
'push.markAllRead': 'Markér alle som læst',
|
||||
'push.version': 'Version',
|
||||
'push.running': 'Kører',
|
||||
'push.seeRelease': 'Se udgivelsen',
|
||||
|
||||
// --- settings: API tokens ------------------------------------------------------
|
||||
'tokens.title': 'API-tokens',
|
||||
'tokens.hint':
|
||||
'Det, et script, en CalDAV-klient eller en MCP-forbindelse logger ind med. En token bærer dine rettigheder præcist — den kan intet, du ikke selv kan.',
|
||||
'tokens.copyNow': 'Kopiér den nu.',
|
||||
'tokens.onceOnly': 'Den vises kun denne ene gang — serveren har kun dens hash.',
|
||||
'tokens.copy': 'Kopiér',
|
||||
'tokens.copied': 'Kopieret.',
|
||||
'tokens.done': 'Færdig',
|
||||
'tokens.mcpBefore': 'Skal du bruge den som',
|
||||
'tokens.mcpLink': 'MCP-forbindelse',
|
||||
'tokens.mcpAfter': 'i Claude? Så er det denne adresse, dialogen skal have:',
|
||||
'tokens.copyAddress': 'Kopiér adressen',
|
||||
'tokens.name': 'Navn',
|
||||
'tokens.namePlaceholder': 'fx min bærbare, eller backup-scriptet',
|
||||
'tokens.expires': 'Udløber',
|
||||
'tokens.never': 'Aldrig',
|
||||
'tokens.in30': 'Om 30 dage',
|
||||
'tokens.in90': 'Om 90 dage',
|
||||
'tokens.inYear': 'Om et år',
|
||||
'tokens.expiryHint':
|
||||
'En kalenderklient, der har abonneret i årevis, har brug for “aldrig”. Et script, du kører én gang, har ikke.',
|
||||
'tokens.create': 'Lav en token',
|
||||
'tokens.none': 'Ingen tokens endnu.',
|
||||
'tokens.revoke': 'Tilbagekald',
|
||||
|
||||
// --- settings: AI --------------------------------------------------------------
|
||||
'ai.title': 'AI',
|
||||
'ai.hint':
|
||||
'Bruges to steder: at dele en opgave op i undertasks, og at skrive et kort overblik over det, der er udestående. Nøglen ligger på din server og sendes kun til den udbyder, du vælger her.',
|
||||
'ai.provider': 'Udbyder',
|
||||
'ai.off': 'Slået fra',
|
||||
'ai.model': 'Model',
|
||||
'ai.baseURL': 'Adresse',
|
||||
'ai.apiKey': 'API-nøgle',
|
||||
'ai.save': 'Gem',
|
||||
'ai.saved': 'Gemt.',
|
||||
'ai.weekly': 'Ugentligt overblik',
|
||||
'ai.weeklyHint': 'En kort note om, hvad der ser vigtigst ud lige nu.',
|
||||
|
||||
'push.unreadOne': '{n} ulæst.',
|
||||
'push.unreadMany': '{n} ulæste.',
|
||||
|
||||
'ai.keyStored': 'Der er gemt en nøgle — lad feltet stå tomt',
|
||||
'ai.keyBlankHint':
|
||||
'Feltet er tomt med vilje. Nøglen sendes aldrig tilbage til browseren — en indstillingsside, der fylder et kodeordsfelt ud igen, er en side, der en dag lækker en nøgle ud i et skærmbillede.',
|
||||
'ai.keyNewHint': 'Gemmes på serveren og vises aldrig igen.',
|
||||
'tokens.lastUsed': 'sidst brugt {when}',
|
||||
'tokens.neverUsed': 'aldrig brugt',
|
||||
'tokens.expired': 'udløbet {when}',
|
||||
'tokens.expiresOn': 'udløber {when}',
|
||||
'tokens.revokeNamed': 'Tilbagekald {name}',
|
||||
|
||||
// --- settings: people ----------------------------------------------------------
|
||||
'users.invite': 'Inviter en bruger',
|
||||
'users.inviteHint':
|
||||
'Der er ingen åben registrering. Du sender et link, og personen vælger selv navn og adgangskode — så er der ikke en adgangskode, to mennesker kender.',
|
||||
'users.emailAddress': 'E-mailadresse',
|
||||
'users.emailPlaceholder': 'navn@example.dk',
|
||||
'users.mustBeEmail': 'Skal være en e-mailadresse.',
|
||||
'users.sendInvite': 'Send invitation',
|
||||
'users.inviteMade': 'Invitationen er oprettet. Send linket til personen:',
|
||||
'users.pending': 'Afventer svar',
|
||||
'users.pendingHint':
|
||||
'Invitationer, der er sendt og ikke brugt endnu. Kun linkets hash er gemt, så det kan ikke vises igen — er det gået til den forkerte, så træk det tilbage.',
|
||||
'users.revoke': 'Træk tilbage',
|
||||
'users.accounts': 'Konti',
|
||||
'users.accountsHint': 'Alle på denne instans.',
|
||||
'users.admin': 'administrator',
|
||||
'users.you': 'dig',
|
||||
'users.makeAdmin': 'Gør til administrator',
|
||||
'users.removeAdmin': 'Fjern administrator',
|
||||
'users.delete': 'Slet',
|
||||
'users.deleteQuestion': 'Slet {name} <{email}> for altid?',
|
||||
'users.deleteTakes': 'Det sletter {projects} og {tasks} i dem.',
|
||||
'users.deleteLeaves': '{tasks} i andres projekter bliver stående uden forfatter.',
|
||||
'users.deleteFinal': 'Det kan ikke fortrydes. Der er ingen papirkurv for konti.',
|
||||
'users.revokeQuestion':
|
||||
'Træk invitationen til {email} tilbage? Linket holder op med at virke.',
|
||||
'users.projectOne': 'projekt',
|
||||
'users.projectMany': 'projekter',
|
||||
'users.taskOne': 'opgave',
|
||||
'users.taskMany': 'opgaver',
|
||||
'users.never': 'aldrig set',
|
||||
|
||||
// --- settings: history and errors -----------------------------------------------
|
||||
'history.title': 'Historik',
|
||||
'history.hint':
|
||||
'Alt, der er blevet gjort på denne server, på tværs af alle projekter — også dem, du ikke selv er med i. Projekternes egne historik-paneler viser det samme, ét projekt ad gangen; det her er spørgsmålet, de ikke kan svare på. Rækkerne bliver stående, når en konto slettes: det, der blev gjort, holder op med at have et navn, ikke med at være sket.',
|
||||
'history.person': 'Person',
|
||||
'history.all': 'Alle',
|
||||
'history.project': 'Projekt',
|
||||
'history.event': 'Hændelse',
|
||||
'history.clear': 'Ryd',
|
||||
'history.more': 'Hent flere',
|
||||
'history.loading': 'Henter…',
|
||||
'history.noMatch': 'Ingen hændelser matcher de valgte filtre.',
|
||||
'history.nothing': 'Der er ikke registreret noget endnu.',
|
||||
'history.deletedAccount': 'En slettet konto',
|
||||
'errors.title': 'Serverfejl',
|
||||
'errors.hint':
|
||||
'Hver 500, API’et har svaret, med hvad handleren var i gang med og fejlen den ramte. Gemt i databasen, ikke kun i loggen — containerens log starter forfra ved hver genstart, så forklaringen er som regel væk, når nogen kigger. Ryddes efter 30 dage.',
|
||||
'errors.none': 'Ingen fejl registreret. Det er den rigtige tilstand.',
|
||||
|
||||
// --- the views -------------------------------------------------------------------
|
||||
'view.delegated': 'Venter på andre',
|
||||
'view.delegatedEmpty': 'Du venter ikke på nogen.',
|
||||
'view.labelEmpty': 'Ingen åbne opgaver med denne etiket.',
|
||||
'view.filterEmpty': 'Ingenting matcher lige nu.',
|
||||
'view.filterFailed': 'Filteret kunne ikke køres.',
|
||||
'view.upcoming': 'Kommende',
|
||||
'view.mode': 'Visning',
|
||||
'view.list': 'Liste',
|
||||
'view.week': 'Uge',
|
||||
'view.month': 'Måned',
|
||||
'view.board': 'Board',
|
||||
'view.calendar': 'Kalender',
|
||||
'view.emptySection': 'Tom',
|
||||
'view.addSection': '+ Tilføj sektion',
|
||||
'view.sectionName': 'Sektionens navn',
|
||||
'view.newSection': 'Ny sektion',
|
||||
'view.prevMonth': 'Forrige måned',
|
||||
'view.nextMonth': 'Næste måned',
|
||||
'view.prevWeek': 'Forrige uge',
|
||||
'view.nextWeek': 'Næste uge',
|
||||
'view.weekNumber': 'uge {n}',
|
||||
'view.more': '+{n} mere',
|
||||
|
||||
// --- how long ago ----------------------------------------------------------------
|
||||
'when.justNow': 'lige nu',
|
||||
'when.minutes': 'for {n} min. siden',
|
||||
'when.hours': 'for {n} timer siden',
|
||||
'when.days': 'for {n} dage siden',
|
||||
'when.never': 'aldrig',
|
||||
'when.neverSignedIn': 'aldrig logget ind',
|
||||
|
||||
// --- settings: data ---------------------------------------------------------------
|
||||
'data.import': 'Importér fra Todoist',
|
||||
'data.csvFile': 'CSV-fil',
|
||||
'data.importing': 'Importerer …',
|
||||
'data.openProject': 'Åbn projektet',
|
||||
'data.trash': 'Papirkurv',
|
||||
'data.trashEmpty': 'Papirkurven er tom.',
|
||||
'data.restore': 'Hent tilbage',
|
||||
'data.backups': 'Sikkerhedskopier',
|
||||
'data.backupNow': 'Tag en kopi nu',
|
||||
'data.backingUp': 'Kopierer…',
|
||||
'data.backupMade': 'Kopi taget — {size}',
|
||||
'data.backupFailed': 'mislykkedes',
|
||||
'data.download': 'Hent',
|
||||
'data.noBackups': 'Der er ikke taget nogen kopi endnu.',
|
||||
'data.swept': 'ryddet væk',
|
||||
'data.empty': 'tom',
|
||||
'data.export': 'Eksport',
|
||||
'data.exportAccount': 'Hele kontoen som JSON',
|
||||
'data.exportOne': 'Ét projekt',
|
||||
'data.pickProject': 'Vælg et projekt',
|
||||
'data.csv': 'CSV',
|
||||
'data.ics': 'Kalenderfil',
|
||||
'data.templates': 'Skabeloner',
|
||||
'data.saveAsTemplate': 'Gem et projekt som skabelon',
|
||||
'data.templateName': 'Navn på skabelonen',
|
||||
'data.saveTemplate': 'Gem som skabelon',
|
||||
'data.noTemplates': 'Ingen skabeloner endnu.',
|
||||
'data.use': 'Brug',
|
||||
'data.delete': 'Slet',
|
||||
'data.newProjectName': 'Navn på det nye projekt',
|
||||
'data.startDate': 'Startdato',
|
||||
'data.startDateHint': 'Dag nul for skabelonens datoer. Tom betyder i dag.',
|
||||
'data.createProject': 'Opret projektet',
|
||||
|
||||
// --- a group's own page ------------------------------------------------------------
|
||||
'group.notFound': 'Gruppen findes ikke, eller den er ikke din.',
|
||||
'group.failed': 'Gruppen kunne ikke hentes.',
|
||||
'group.retry': 'Prøv igen',
|
||||
'group.about': 'Om gruppen',
|
||||
'group.aboutPlaceholder': 'Hvad er det her for et stykke arbejde?',
|
||||
'group.writeAbout': 'Skriv hvad det her er for et stykke arbejde.',
|
||||
'group.saving': 'Gemmer…',
|
||||
'group.projects': 'Projekter',
|
||||
'group.projectOne': '1 projekt',
|
||||
'group.projectMany': '{n} projekter',
|
||||
'group.noProjects':
|
||||
'Ingen projekter i gruppen endnu. Træk et herop i sidebjælken, eller vælg gruppen, når du opretter et.',
|
||||
'group.documents': 'Dokumenter',
|
||||
'group.documentsHint':
|
||||
'Filer, der hører til hele gruppen frem for til én opgave i den — kontrakten, tegningen, den aftale alt det andet hviler på.',
|
||||
'group.remove': 'Fjern',
|
||||
'group.removeNamed': 'Fjern {name}',
|
||||
'group.removeQuestion': 'Fjern "{name}"?',
|
||||
'group.addFile': '+ Læg en fil op',
|
||||
'group.uploading': 'Lægger op…',
|
||||
|
||||
// --- keyboard shortcuts --------------------------------------------------------------
|
||||
'keys.title': 'Genveje',
|
||||
|
||||
'data.importHint':
|
||||
'Vælg CSV-eksporten af ét projekt. Prioriteterne bliver konverteret, ikke kopieret: Todoist skriver 4 for det, grænsefladen kalder P1.',
|
||||
'data.trashHint':
|
||||
'Slettede projekter, med deres opgaver. De bliver hentet tilbage præcis som de var — bortset fra opgaver, du havde slettet hver for sig først; dem var der en grund til.',
|
||||
'data.backupsHint':
|
||||
'Databasen kopieres hver nat og de seneste fjorten gemmes. Kopierne er talt, ikke dateret: en container, der har stået slukket en måned, må ikke komme tilbage og slette dem alle for at være for gamle.',
|
||||
'data.backupsAttachments':
|
||||
'Vedhæftede filer er ikke med. De er indholdsadresserede og bliver kun lagt til, så fjorten ens kopier af dem ville fylde det drev op, de skulle beskytte — tag hele /data, hvis du vil have det hele.',
|
||||
'data.restoreHint':
|
||||
'At lægge en kopi tilbage er ikke en knap her, og det er med vilje: en database kan ikke skiftes ud under en server, der skriver i den, og en halvt gennemført udskiftning ødelægger netop det, den skulle redde. Stop containeren, læg filen i stedet for verdande.db i datamappen, slet -wal og -shm ved siden af, og start den igen.',
|
||||
'data.exportHint':
|
||||
'Alt, i den rå form. Det er garantien for, at du kan gå igen — en eksport, der er blevet pyntet, er en eksport, der har mistet noget.',
|
||||
'data.templatesHint':
|
||||
'Et projekt gemt som en form, der kan bruges igen. Datoerne i skabelonen er relative, så de bliver regnet ud fra den startdato, du vælger.',
|
||||
|
||||
'keys.navigation': 'Navigation',
|
||||
'keys.jumpToQuickAdd': 'Hop til feltet “tilføj opgave”',
|
||||
'keys.thisPage': 'Denne side',
|
||||
'keys.inQuickAdd': 'I hurtig tilføjelse',
|
||||
'keys.intoProject': 'Læg opgaven i et projekt',
|
||||
'keys.setLabel': 'Sæt en etiket',
|
||||
'keys.priority': 'Prioritet',
|
||||
'keys.date': 'Dato — dansk og engelsk',
|
||||
'keys.time': 'Klokkeslæt',
|
||||
'keys.clear': 'Ryd feltet',
|
||||
|
||||
// --- signing in ------------------------------------------------------------------
|
||||
'auth.firstAccount': 'Opret den første konto. Den bliver administrator.',
|
||||
'auth.name': 'Navn',
|
||||
'auth.nameRequired': 'Skal udfyldes',
|
||||
'auth.email': 'E-mail',
|
||||
'auth.emailInvalid': 'Skal være en e-mailadresse',
|
||||
'auth.password': 'Adgangskode',
|
||||
'auth.passwordHint': 'Mindst 10 tegn. En sætning er både nemmere og stærkere.',
|
||||
'auth.createAccount': 'Opret konto',
|
||||
'auth.totpPrompt': 'Indtast koden fra din authenticator.',
|
||||
'auth.code': 'Kode',
|
||||
'auth.totpRecovery': 'Har du mistet din telefon, virker en af dine gendannelseskoder her.',
|
||||
'auth.continue': 'Fortsæt',
|
||||
'auth.resetPrompt': 'Vi sender et link til at vælge en ny adgangskode.',
|
||||
'auth.sendLink': 'Send link',
|
||||
'auth.back': 'Tilbage',
|
||||
'auth.linkBroken': 'Linket er ikke komplet. Åbn det fra e-mailen igen, eller bed om et nyt.',
|
||||
'auth.toSignIn': 'Til log ind',
|
||||
'auth.signOut': 'Log ud',
|
||||
'auth.invited': 'Du er inviteret. Vælg et navn og en adgangskode.',
|
||||
'auth.pickNew': 'Vælg en ny adgangskode.',
|
||||
'auth.newPassword': 'Ny adgangskode',
|
||||
'auth.newPasswordHint': 'Mindst 10 tegn. Alle andre enheder bliver logget ud.',
|
||||
'auth.savePassword': 'Gem adgangskoden',
|
||||
'auth.passwordChanged': 'Adgangskoden er skiftet. Log ind med den nye.',
|
||||
'auth.resetSent': 'Hvis adressen har en konto, er der et link på vej. Tjek også spamfilteret.',
|
||||
'auth.signInPrompt': 'Log ind for at fortsætte.',
|
||||
'auth.signIn': 'Log ind',
|
||||
'auth.forgot': 'Glemt adgangskode?',
|
||||
|
||||
// --- a task, opened ---------------------------------------------------------------
|
||||
'detail.task': 'Opgave',
|
||||
'detail.close': 'Luk',
|
||||
'detail.text': 'Opgavens tekst',
|
||||
'detail.description': 'Beskrivelse',
|
||||
'detail.descriptionPlaceholder': 'Detaljer, links, hvad der skal huskes',
|
||||
'detail.priority': 'Prioritet',
|
||||
'detail.p1': 'P1 — haster',
|
||||
'detail.none': 'Ingen',
|
||||
'detail.due': 'Forfalder',
|
||||
'detail.labels': 'Etiketter',
|
||||
'detail.labelsPlaceholder': 'adskilt af komma',
|
||||
'detail.project': 'Projekt',
|
||||
'detail.repeats': 'Gentages',
|
||||
'detail.monthly': 'Hver måned',
|
||||
'detail.yearly': 'Hvert år',
|
||||
'detail.assignee': 'Ansvarlig',
|
||||
'detail.subtasks': 'Undertasks',
|
||||
'detail.addSubtask': 'Tilføj en undertask',
|
||||
'detail.newSubtask': 'Ny undertask',
|
||||
'detail.files': 'Filer',
|
||||
'detail.delete': 'Slet',
|
||||
'detail.reminders': 'Påmindelser',
|
||||
'detail.newReminder': 'Ny påmindelse',
|
||||
'detail.sent': 'sendt',
|
||||
'detail.add': 'Tilføj',
|
||||
'detail.comments': 'Kommentarer',
|
||||
'detail.writeComment': 'Skriv en kommentar',
|
||||
'detail.newComment': 'Ny kommentar',
|
||||
'detail.post': 'Skriv',
|
||||
'detail.readAs': 'Læst som {what}',
|
||||
|
||||
'auth.alreadySignedIn': 'Du er logget ind som {name}. Log ud først, og åbn så linket igen.',
|
||||
|
||||
'detail.reopen': 'Genåbn',
|
||||
'detail.uploading': 'Lægger op …',
|
||||
'detail.attachFile': 'Vedhæft en fil',
|
||||
|
||||
// --- settings: integrations --------------------------------------------------------
|
||||
'int.gmail': 'Gmail',
|
||||
'int.gmailHint':
|
||||
'Stjernemarkér en mail, eller giv den en etiket, og den bliver en opgave. Envejs: at fjerne stjernen gør ikke noget ved opgaven.',
|
||||
'int.connectGmail': 'Forbind Gmail',
|
||||
'int.fromEnv':
|
||||
'Klienten er sat i miljøet (VERDANDE_GMAIL_CLIENT_ID), så den kan ikke ændres her. Det er med vilje: en værdi i runens manifest er en beslutning, der bliver anvendt igen ved hver genstart, og en formular, der kunne overskrive den, ville gøre manifestet til en løgn.',
|
||||
'int.oauthClient': 'OAuth-klient hos Google',
|
||||
'int.registerHint':
|
||||
'Registrér en klient i Google Cloud Console → APIs & Services → Credentials → OAuth client ID → Web application, slå Gmail API til, og indsæt de to værdier her. Din egen konto skal stå som testbruger, så længe appen ikke er verificeret hos Google.',
|
||||
'int.redirectURI': 'Godkendt redirect-URI',
|
||||
'int.clientID': 'Klient-id',
|
||||
'int.clientSecret': 'Klienthemmelighed',
|
||||
'int.secretStored': 'Gemt — udfyld kun for at skifte den',
|
||||
'int.save': 'Gem',
|
||||
'int.saved': 'Gemt.',
|
||||
'int.noClient':
|
||||
'Der er ikke registreret en OAuth-klient hos Google endnu. Det skal en administrator gøre, før knappen her kan bruges.',
|
||||
'int.connectedAs': 'Forbundet som',
|
||||
'int.unknownAccount': 'ukendt konto',
|
||||
'int.whatMakesATask': 'Hvad laver en opgave',
|
||||
'int.starred': 'Stjernemarkerede',
|
||||
'int.aLabel': 'En bestemt etiket',
|
||||
'int.both': 'Begge dele',
|
||||
'int.gmailLabelName': 'Etikettens navn i Gmail',
|
||||
'int.gmailLabelExample': 'fx Opgaver',
|
||||
'int.fetchNow': 'Hent nu',
|
||||
'int.disconnect': 'Afbryd',
|
||||
'int.feed': 'Kalenderfeed',
|
||||
'int.feedHint':
|
||||
'Abonnér i Apple Kalender, Google eller Thunderbird. En kalenderklient kan ikke logge ind, så nøglen i adressen er hele adgangskoden — del den ikke.',
|
||||
'int.address': 'Adresse',
|
||||
'int.copy': 'Kopiér',
|
||||
'int.newLink': 'Nyt link',
|
||||
'int.newLinkHint':
|
||||
'Et nyt link bryder alle eksisterende abonnementer med det samme. Det er pointen: det er det, man gør, når det gamle er havnet et forkert sted.',
|
||||
'int.mailToTask': 'Mail til opgave',
|
||||
'int.mailHint':
|
||||
'Send eller videresend en mail hertil, og emnelinjen bliver tolket som en hurtig tilføjelse — “Fakturer Anders p1 #Firma” virker også her.',
|
||||
'int.noMailServer':
|
||||
'Der er ingen mailserver sat op på denne server, så adressen herunder kan ikke modtage noget endnu. Sæt VERDANDE_SMTP_HOST og de øvrige SMTP-indstillinger, og få mailserveren til at aflevere post til todo+* videre til /inbound/mail.',
|
||||
'int.yourAddress': 'Din adresse',
|
||||
'int.newAddress': 'Ny adresse',
|
||||
'int.caldav': 'CalDAV',
|
||||
'int.caldavHint':
|
||||
'Tovejs, i modsætning til feedet ovenfor: Apple Påmindelser og Thunderbird kan også skrive tilbage.',
|
||||
'int.server': 'Server',
|
||||
'int.caldavAuth':
|
||||
'Brugernavn er din e-mail. Adgangskoden er en API-token — ikke din rigtige adgangskode.',
|
||||
'int.gmailConnected': 'Gmail er forbundet.',
|
||||
'int.gmailState':
|
||||
'Svaret fra Google passede ikke til det forsøg, der blev startet her. Prøv igen.',
|
||||
'int.gmailExpired': 'Forsøget udløb undervejs. Prøv igen.',
|
||||
'int.gmailInvalid': 'Svaret fra Google kunne ikke læses. Prøv igen.',
|
||||
'int.gmailFailed': 'Google afviste ombytningen af koden.',
|
||||
'int.gmailNoRefresh':
|
||||
'Google sendte ingen refresh-token. Fjern verdande under din Google-konto og forbind igen.',
|
||||
'int.gmailDenied': 'Adgangen blev afvist hos Google.',
|
||||
'int.gmailOther': 'Gmail svarede: {what}',
|
||||
|
||||
// --- a project ----------------------------------------------------------------------
|
||||
'project.name': 'Projektets navn',
|
||||
'project.clickToRename': 'Klik for at omdøbe',
|
||||
'project.color': 'Farve på projektet',
|
||||
'project.pickColor': 'Vælg farve',
|
||||
'project.delete': 'Slet projektet',
|
||||
'project.share': 'Del',
|
||||
'project.history': 'Historik',
|
||||
'project.noHistory': 'Ingenting er sket her endnu.',
|
||||
'project.canEdit': 'Kan redigere',
|
||||
'project.canView': 'Kan kun se',
|
||||
'project.invite': 'Inviter',
|
||||
'project.inviteByEmail': 'Inviter via e-mail',
|
||||
'project.emailAddress': 'e-mailadresse',
|
||||
'project.role': 'Rolle',
|
||||
'project.sendLinkYourself': 'Ingen mailserver sat op — send selv linket:',
|
||||
'project.noSection': 'Uden sektion',
|
||||
'project.rename': 'Omdøb',
|
||||
'project.deleteSection': 'Slet',
|
||||
'project.readOnly': 'Du kan se dette projekt, men ikke ændre det.',
|
||||
'project.notFound': 'Projektet findes ikke, eller du har ikke adgang til det.',
|
||||
'project.loadFailed': 'Kunne ikke hente projektet. Serveren svarede ikke.',
|
||||
'project.retry': 'Prøv igen',
|
||||
'project.nothingHere': 'Ingenting her endnu.',
|
||||
|
||||
'project.sharedWith': 'Delt · {n}',
|
||||
|
||||
// --- the palette ---------------------------------------------------------------
|
||||
'color.graphite': 'Grafit',
|
||||
'color.tomato': 'Tomat',
|
||||
'color.amber': 'Rav',
|
||||
'color.lime': 'Lime',
|
||||
'color.green': 'Grøn',
|
||||
'color.teal': 'Petrol',
|
||||
'color.blue': 'Blå',
|
||||
'color.indigo': 'Indigo',
|
||||
'color.violet': 'Violet',
|
||||
'color.magenta': 'Magenta',
|
||||
|
||||
// --- what a failed request says -----------------------------------------------
|
||||
'error.unauthorized': 'Forkert e-mail eller adgangskode.',
|
||||
'error.totpRequired': 'Indtast koden fra din authenticator.',
|
||||
'error.forbidden': 'Det har du ikke adgang til.',
|
||||
'error.notFound': 'Findes ikke.',
|
||||
'error.conflict': 'Det er der allerede.',
|
||||
'error.rateLimited': 'For mange forsøg. Vent et øjeblik.',
|
||||
'error.validation': 'Tjek felterne herunder.',
|
||||
'error.tooLarge': 'Det er for stort.',
|
||||
'error.internal': 'Noget gik galt. Prøv igen.',
|
||||
'error.badRequest': 'Anmodningen kunne ikke læses.',
|
||||
'error.offline': 'Ingen forbindelse til serveren.',
|
||||
'error.gmailNotConfigured':
|
||||
'Gmail er ikke sat op på denne server. En administrator skal registrere en OAuth-klient hos Google under Indstillinger → Integrationer.',
|
||||
'error.aiNotConfigured': 'Der er ikke valgt en AI-udbyder. Sæt den op under Indstillinger → AI.',
|
||||
'error.totpNotEnabled': 'To-faktor er ikke slået til.',
|
||||
'error.inboxProtected': 'Indbakken kan ikke slettes.',
|
||||
'error.lastAdmin':
|
||||
'Det er den sidste administrator. Gør en anden til administrator først — ellers er der ingen, der kan komme ind på denne side igen.',
|
||||
|
||||
// --- the themes -------------------------------------------------------------------
|
||||
'theme.dark': 'Nordlys',
|
||||
'theme.darkNote': 'Mørk med grøn accent.',
|
||||
'theme.dusk': 'Skumring',
|
||||
'theme.duskNote': 'Mørk og varm, med rav.',
|
||||
'theme.light': 'Dagslys',
|
||||
'theme.lightNote': 'Lys og køligt neutral.',
|
||||
'theme.paper': 'Papir',
|
||||
'theme.paperNote': 'Lys og varm, som papir.',
|
||||
'theme.contrast': 'Kontrast',
|
||||
'theme.contrastNote': 'Sort på hvidt, til skarpt lys.',
|
||||
|
||||
// --- push, in the browser's own words ----------------------------------------------
|
||||
'push.deniedByBrowser':
|
||||
'Browseren har blokeret notifikationer for dette site. Det skal slås til i browserens indstillinger.',
|
||||
'push.notEnabled': 'Notifikationer blev ikke slået til.',
|
||||
'push.noVapidKey': 'Serveren har ingen VAPID-nøgle.'
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user