diff --git a/web/src/assets/locales/de.json b/web/src/assets/locales/de.json
new file mode 100644
index 00000000000..39e18680fa2
--- /dev/null
+++ b/web/src/assets/locales/de.json
@@ -0,0 +1,217 @@
+{
+ "login": "Anmelden",
+ "welcome": "Willkommen bei Woodpecker",
+ "repos": "Repos",
+ "repositories": "Repositories",
+ "docs": "Docs",
+ "logout": "Abmelden",
+ "search": "Suche...",
+ "username": "Benutzername",
+ "password": "Passwort",
+ "url": "URL",
+ "unknown_error": "Ein unbekannter Fehler ist aufgetreten",
+
+ "not_found": {
+ "not_found": "Whoa 404, entweder haben wir etwas kaputt gemacht oder du hattest einen Tippfehler :-/",
+ "back_home": "Zurück zum Start"
+ },
+
+ "time": {
+ "tmpl": "DD.MM.YYYY, HH:mm z",
+ "weeks_short": "w",
+ "days_short": "t",
+ "hours_short": "h",
+ "min_short": "min",
+ "sec_short": "sek",
+ "not_started": "noch nicht gestartet"
+ },
+
+ "repo": {
+ "activity": "Aktivitäten",
+ "branches": "Branches",
+ "add": "Repository hinzufügen",
+ "user_none": "Diese Organisation / dieser Benutzer hat noch keine Repositories.",
+ "not_allowed": "Zugriff auf dieses Repository nicht erlaubt",
+
+ "enable": {
+ "reload": "Repositories neu laden",
+ "enable": "Aktivieren",
+ "enabled": "Bereits Aktiviert",
+ "success": "Repository aktiviert",
+ "list_reloaded": "Repository-Liste neu geladen"
+ },
+
+ "settings": {
+ "settings": "Einstellungen",
+ "not_allowed": "Zugriff auf die Einstellungen dieses Repositorys nicht erlaubt",
+
+ "general": {
+ "general": "Allgemein",
+ "project": "Projekt-Einstellungen",
+ "save": "Einstellungen speichern",
+ "success": "Repository-Einstellungen aktualisiert",
+
+ "pipeline_path": {
+ "path": "Pipeline-Pfad",
+ "default": "Standardmäßig: .woodpecker/*.yml -> .woodpecker.yml -> .drone.yml",
+ "desc": "Pfad zu deiner Pipeline-Konfiguration (z. B. mein/pfad/). Ordner sollten mit einem / enden."
+ },
+
+ "allow_pr": {
+ "allow": "Pull Requests zulassen",
+ "desc": "Pipelines können für Pull-Requests genutzt werden."
+ },
+
+ "protected": {
+ "protected": "Geschützt",
+ "desc": "Jede Pipeline muss genehmigt werden, bevor sie ausgeführt wird."
+ },
+ "trusted": {
+ "trusted": "Vertrauenswürdig",
+ "desc": "Die zugrundeliegenden Pipeline-Container erhalten Zugriff auf ausgeweitete Funktionen wie z. B. das Einhängen von Volumes."
+ },
+ "visibility": {
+ "visibility": "Sichtbarkeit des Projekts",
+
+ "public": {
+ "public": "Öffentlich",
+ "desc": "Jeder Benutzer kann Ihr Projekt sehen, ohne eingeloggt zu sein."
+ },
+ "private": {
+ "private": "Privat",
+ "desc": "Nur du und andere Besitzer des Repositorys können dieses Projekt sehen."
+ },
+ "internal": {
+ "internal": "Intern",
+ "desc": "Nur authentifizierte Benutzer der Woodpecker-Instanz können dieses Projekt sehen."
+ }
+ },
+
+ "timeout": {
+ "timeout": "Zeitlimit",
+ "minutes": "Minuten"
+ },
+
+ "cancel_prev": {
+ "cancel": "Breche ältere Pipelines ab",
+ "desc": "Aktiviere diese Option, um laufende Pipelines desselben Ereignisses und Kontexts abzubrechen, bevor die neue Pipeline startet."
+ }
+ },
+
+ "secrets": {
+ "secrets": "Secrets",
+ "desc": "Secrets können zur Laufzeit als Umgebungsvariablen an einzelne Pipelineschritte übergeben werden.",
+ "none": "Es gibt noch keine Secrets.",
+ "add": "Secret hinzufügen",
+ "save": "Secret speichern",
+ "show": "Secret anzeigen",
+ "name": "Name",
+ "value": "Wert",
+ "deleted": "Secret gelöscht",
+ "created": "Secret erstellt",
+ "saved": "Secret gespeichert",
+
+ "images": {
+ "images": "Verfügbar für folgende Images",
+ "desc": "Durch Kommata getrennte Liste der Images, für die dieses Secret verfügbar ist; leer lassen, um alle Images zuzulassen"
+ },
+ "events": {
+ "events": "Verfügbar bei folgenden Ereignissen",
+ "pr_warning": "Sei bitte vorsichtig mit dieser Option, da ein bösartiger Akteur eine bösartigen Pull Request erstellen kann, der deine Secrets preisgibt."
+ }
+ },
+
+ "registries": {
+ "registries": "Registries",
+ "creds": "Zugangsdaten für die Registry",
+ "desc": "Zugangsdaten für die Registry können hinzugefügt werden, um private Images für Ihre Pipeline zu verwenden.",
+ "show": "Registries anzeigen",
+ "add": "Registry hinzufügen",
+ "none": "Es gibt noch keine Zugangsdaten für die Registry.",
+ "save": "Registry speichern",
+ "created": "Registry-Zugangsdaten erstellt",
+ "saved": "Registry-Zugangsdaten gespeichert",
+ "deleted": "Registry-Zugangsdaten gelöscht",
+
+ "address": {
+ "address": "Adresse",
+ "placeholder": "Registry-Adresse (z. B. docker.io)"
+ }
+ },
+
+ "badge": {
+ "badge": "Abzeichen",
+ "url_branch": "URL für bestimmten Branch",
+ "markdown": "Markdown"
+ },
+
+ "actions": {
+ "actions": "Aktionen",
+
+ "repair": {
+ "repair": "Repository reparieren",
+ "success": "Repository repariert"
+ },
+ "disable": {
+ "disable": "Repository deaktivieren",
+ "success": "Repository deaktiviert"
+ },
+ "delete": {
+ "delete": "Repository löschen",
+ "confirm": "Alle Daten sind nach dieser Aktion verloren!!!\n\nMöchtest du wirklich fortfahren?",
+ "success": "Repository gelöscht"
+ }
+ }
+ },
+
+ "build": {
+ "created": "Erstellt",
+ "tasks": "Vorgänge",
+ "config": "Konfiguration",
+ "files": "Geänderte Dateien ({files})",
+ "no_files": "Es wurden keine Dateien geändert.",
+ "execution_error": "Ausführungsfehler",
+ "no_pipelines": "Bisher wurden noch keine Pipelines gestartet.",
+ "no_pipeline_steps": "Keine Schritte in der Pipeline vorhanden!",
+ "step_not_started": "Dieser Schritt hat noch nicht begonnen.",
+ "pipelines_for": "Pipelines für den Branch \"{branch}\"",
+ "exit_code": "Exit-Code {exitCode}",
+ "loading": "Laden ...",
+ "pipeline": "Pipeline #{buildId}",
+
+ "actions": {
+ "cancel": "Abbrechen",
+ "restart": "Neustarten",
+ "canceled": "Dieser Schritt wurde abgebrochen.",
+ "cancel_success": "Pipeline abgebrochen",
+ "restart_success": "Pipeline neu gestartet"
+ },
+ "protected": {
+ "awaits": "Diese Pipeline wartet auf die Genehmigung durch einen Maintainer!",
+ "approve": "Genehmigen",
+ "decline": "Ablehnen",
+ "declined": "Diese Pipeline ist abgelehnt worden!",
+ "approve_success": "Pipeline genehmigt",
+ "decline_success": "Pipeline abgelehnt"
+ },
+ "event": {
+ "push": "Push",
+ "tag": "Tag",
+ "pr": "Pull Request",
+ "deploy": "Deploy"
+ }
+ }
+ },
+
+ "user": {
+ "oauth_error": "Fehler bei der Authentifizierung gegen OAuth-Anbieter",
+ "internal_error": "Ein interner Fehler ist aufgetreten",
+ "access_denied": "Du bist nicht berechtigt, dich anzumelden",
+ "token": "Dein persönlicher Token",
+ "shell_setup": "Kommandozeilen-Einrichtung",
+ "api_usage": "Beispiel für die API-Nutzung",
+ "cli_usage": "Beispiel für die Kommandozeilen-Nutzung",
+ "dl_cli": "Download Kommando-Zeilen-Tool",
+ "shell_setup_before": "Führe bitte die Schritte zur Einrichtung der Kommandozeile vorher aus"
+ }
+}
diff --git a/web/src/assets/locales/en.json b/web/src/assets/locales/en.json
index 7f50391e2da..1ea927e74d9 100644
--- a/web/src/assets/locales/en.json
+++ b/web/src/assets/locales/en.json
@@ -79,11 +79,11 @@
},
"private": {
"private": "Private",
- "desc": "Only authenticated users of the Woodpecker instance can see this project."
+ "desc": "Only you and other owners of the repository can see this project."
},
"internal": {
"internal": "Internal",
- "desc": "Only you and other owners of the repository can see this project."
+ "desc": "Only authenticated users of the Woodpecker instance can see this project."
}
},
@@ -94,7 +94,7 @@
"cancel_prev": {
"cancel": "Cancel previous pipelines",
- "desc": "Enable to cancel running pipelines of the same event and context before starting the newly triggered one."
+ "desc": "Enable to cancel pending and running pipelines of the same event and context before starting the newly triggered one."
}
},
diff --git a/web/src/assets/locales/lv.json b/web/src/assets/locales/lv.json
index 89f28df7b41..7b8d3a1db4f 100644
--- a/web/src/assets/locales/lv.json
+++ b/web/src/assets/locales/lv.json
@@ -79,11 +79,11 @@
},
"private": {
"private": "Privāts",
- "desc": "Tikai autorizēti lietotāji var piekļūt šim projektam."
+ "desc": "Tikai lietotāji, kam ir tiesības uz repozitoriju, var piekļūt šim projektam."
},
"internal": {
"internal": "Iekšējs",
- "desc": "Tikai lietotāji, kam ir tiesības uz repozitoriju, var piekļūt šim projektam."
+ "desc": "Tikai autorizēti lietotāji var piekļūt šim projektam."
}
},
diff --git a/web/src/compositions/useDate.ts b/web/src/compositions/useDate.ts
index 4feb36944ce..5827c00ac91 100644
--- a/web/src/compositions/useDate.ts
+++ b/web/src/compositions/useDate.ts
@@ -1,5 +1,6 @@
import 'dayjs/locale/en';
import 'dayjs/locale/lv';
+import 'dayjs/locale/de';
import dayjs from 'dayjs';
import advancedFormat from 'dayjs/plugin/advancedFormat';
diff --git a/web/src/utils/timeAgo.ts b/web/src/utils/timeAgo.ts
index 6ca86b271c3..6724b3fec4f 100644
--- a/web/src/utils/timeAgo.ts
+++ b/web/src/utils/timeAgo.ts
@@ -1,10 +1,12 @@
import TimeAgo from 'javascript-time-ago';
+import de from 'javascript-time-ago/locale/de.json';
import en from 'javascript-time-ago/locale/en.json';
import lv from 'javascript-time-ago/locale/lv.json';
import { getUserLanguage } from '~/utils/locale';
TimeAgo.addDefaultLocale(en);
+TimeAgo.addLocale(de);
TimeAgo.addLocale(lv);
const timeAgo = new TimeAgo(getUserLanguage());