diff --git a/.forgejo/workflows-composite/apt-install-from/action.yaml b/.forgejo/workflows-composite/apt-install-from/action.yaml
index 615e7cb184..ab55883a11 100644
--- a/.forgejo/workflows-composite/apt-install-from/action.yaml
+++ b/.forgejo/workflows-composite/apt-install-from/action.yaml
@@ -13,6 +13,8 @@ runs:
run: |
export DEBIAN_FRONTEND=noninteractive
echo "deb http://deb.debian.org/debian/ ${RELEASE} main" > "/etc/apt/sources.list.d/${RELEASE}.list"
+ wget -O- http://neuro.debian.net/lists/bookworm.de-fzj.libre | tee /etc/apt/sources.list.d/neurodebian.sources.list
+ apt-key adv --recv-keys --keyserver hkps://keyserver.ubuntu.com 0xA5D32F012649A5A9
env:
RELEASE: ${{inputs.release}}
- name: install packages
@@ -24,6 +26,7 @@ runs:
- name: remove temporary package list to prevent using it in other steps
run: |
rm "/etc/apt/sources.list.d/${RELEASE}.list"
+ rm "/etc/apt/sources.list.d/neurodebian.sources.list"
apt-get update -qq
env:
RELEASE: ${{inputs.release}}
diff --git a/.forgejo/workflows-composite/setup-env/action.yaml b/.forgejo/workflows-composite/setup-env/action.yaml
index 28216e9b8d..f19569a137 100644
--- a/.forgejo/workflows-composite/setup-env/action.yaml
+++ b/.forgejo/workflows-composite/setup-env/action.yaml
@@ -19,7 +19,7 @@ runs:
set -ex
toolchain=$(grep -oP '(?<=toolchain ).+' go.mod)
version=$(go version | cut -d' ' -f3)
- if [ "$toolchain" != "$version" ]; then
- echo "go version mismatch: $toolchain <> $version"
+ if dpkg --compare-versions ${version#go} lt ${toolchain#go}; then
+ echo "go version too low: $toolchain >= $version"
exit 1
fi
diff --git a/.forgejo/workflows/build-oci-image.yml b/.forgejo/workflows/build-oci-image.yml
new file mode 100644
index 0000000000..8e843b41ee
--- /dev/null
+++ b/.forgejo/workflows/build-oci-image.yml
@@ -0,0 +1,41 @@
+on:
+ push:
+ branches:
+ - 'forgejo'
+ tags:
+ - '*-git-annex*'
+
+jobs:
+ build-oci-image:
+ runs-on: docker
+ strategy:
+ matrix:
+ type: ["rootful", "rootless"]
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0 # fetch the full history so that the Forgejo version is determined properly
+ - name: Determine registry and username
+ id: determine-registry-and-username
+ run: |
+ echo "registry=${GITHUB_SERVER_URL#https://}" >> "$GITHUB_OUTPUT"
+ echo "username=${GITHUB_REPOSITORY%/*}" >> "$GITHUB_OUTPUT"
+ - name: Install Docker
+ run: curl -fsSL https://get.docker.com | sh
+ - name: Set up QEMU
+ uses: docker/setup-qemu-action@v3
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v3
+ - name: Login to Docker Hub
+ uses: docker/login-action@v3
+ with:
+ registry: ${{ steps.determine-registry-and-username.outputs.registry }}
+ username: ${{ steps.determine-registry-and-username.outputs.username }}
+ password: ${{ secrets.REGISTRY_TOKEN }}
+ - name: Build and push
+ uses: docker/build-push-action@v6
+ with:
+ context: .
+ file: ${{ (matrix.type == 'rootful' && 'Dockerfile') || (matrix.type == 'rootless' && 'Dockerfile.rootless') }}
+ push: true
+ tags: ${{ steps.determine-registry-and-username.outputs.registry }}/${{ github.repository }}:${{ github.ref_name }}${{ (matrix.type == 'rootful' && ' ') || (matrix.type == 'rootless' && '-rootless') }}
diff --git a/.forgejo/workflows/build-release.yml b/.forgejo/workflows/build-release.yml
index 433b085969..9d88cb43dd 100644
--- a/.forgejo/workflows/build-release.yml
+++ b/.forgejo/workflows/build-release.yml
@@ -164,7 +164,7 @@ jobs:
- name: build container & release
if: ${{ secrets.TOKEN != '' }}
- uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.2.1
+ uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.3.1
with:
forgejo: "${{ env.GITHUB_SERVER_URL }}"
owner: "${{ env.GITHUB_REPOSITORY_OWNER }}"
@@ -183,7 +183,7 @@ jobs:
- name: build rootless container
if: ${{ secrets.TOKEN != '' }}
- uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.2.1
+ uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.3.1
with:
forgejo: "${{ env.GITHUB_SERVER_URL }}"
owner: "${{ env.GITHUB_REPOSITORY_OWNER }}"
diff --git a/.forgejo/workflows/publish-release.yml b/.forgejo/workflows/publish-release.yml
index cbc8455a99..a3ff48c718 100644
--- a/.forgejo/workflows/publish-release.yml
+++ b/.forgejo/workflows/publish-release.yml
@@ -42,7 +42,7 @@ jobs:
- uses: actions/checkout@v4
- name: copy & sign
- uses: https://data.forgejo.org/forgejo/forgejo-build-publish/publish@v5.2.1
+ uses: https://data.forgejo.org/forgejo/forgejo-build-publish/publish@v5.3.1
with:
from-forgejo: ${{ vars.FORGEJO }}
to-forgejo: ${{ vars.FORGEJO }}
diff --git a/.forgejo/workflows/testing.yml b/.forgejo/workflows/testing.yml
index eb3163d3ae..c4972c96c9 100644
--- a/.forgejo/workflows/testing.yml
+++ b/.forgejo/workflows/testing.yml
@@ -10,7 +10,6 @@ on:
jobs:
backend-checks:
- if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
runs-on: docker
container:
image: 'data.forgejo.org/oci/node:20-bookworm'
@@ -27,7 +26,6 @@ jobs:
- run: su forgejo -c 'make --always-make -j$(nproc) lint-backend tidy-check swagger-check fmt-check swagger-validate' # ensure the "go-licenses" make target runs
- uses: ./.forgejo/workflows-composite/build-backend
frontend-checks:
- if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
runs-on: docker
container:
image: 'data.forgejo.org/oci/node:20-bookworm'
@@ -176,7 +174,6 @@ jobs:
TAGS: bindata
TEST_REDIS_SERVER: cacher:${{ matrix.cacher.port }}
test-mysql:
- if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
runs-on: docker
needs: [backend-checks, frontend-checks]
container:
@@ -199,15 +196,13 @@ jobs:
- name: install dependencies & git >= 2.42
uses: ./.forgejo/workflows-composite/apt-install-from
with:
- packages: git git-lfs
+ packages: git git-annex-standalone git-lfs
- uses: ./.forgejo/workflows-composite/build-backend
- run: |
su forgejo -c 'make test-mysql-migration test-mysql'
- timeout-minutes: 120
env:
USE_REPO_TEST_DIR: 1
test-pgsql:
- if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
runs-on: docker
needs: [backend-checks, frontend-checks]
container:
@@ -236,17 +231,15 @@ jobs:
- name: install dependencies & git >= 2.42
uses: ./.forgejo/workflows-composite/apt-install-from
with:
- packages: git git-lfs
+ packages: git git-annex-standalone git-lfs
- uses: ./.forgejo/workflows-composite/build-backend
- run: |
su forgejo -c 'make test-pgsql-migration test-pgsql'
- timeout-minutes: 120
env:
RACE_ENABLED: true
USE_REPO_TEST_DIR: 1
TEST_LDAP: 1
test-sqlite:
- if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
runs-on: docker
needs: [backend-checks, frontend-checks]
container:
@@ -258,25 +251,21 @@ jobs:
- name: install dependencies & git >= 2.42
uses: ./.forgejo/workflows-composite/apt-install-from
with:
- packages: git git-lfs
+ packages: git git-annex-standalone git-lfs
- uses: ./.forgejo/workflows-composite/build-backend
- run: |
su forgejo -c 'make test-sqlite-migration test-sqlite'
- timeout-minutes: 120
env:
TAGS: sqlite sqlite_unlock_notify
RACE_ENABLED: true
TEST_TAGS: sqlite sqlite_unlock_notify
USE_REPO_TEST_DIR: 1
security-check:
- if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
runs-on: docker
needs:
- test-sqlite
- test-pgsql
- test-mysql
- - test-remote-cacher
- - test-unit
container:
image: 'data.forgejo.org/oci/node:20-bookworm'
options: --tmpfs /tmp:exec,noatime
diff --git a/Dockerfile b/Dockerfile
index ae21a0821e..d39de78bf9 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -78,6 +78,7 @@ RUN apk --no-cache add \
sqlite \
su-exec \
gnupg \
+ git-annex \
&& rm -rf /var/cache/apk/*
RUN addgroup \
diff --git a/Dockerfile.rootless b/Dockerfile.rootless
index c5d6a13f35..d636e10168 100644
--- a/Dockerfile.rootless
+++ b/Dockerfile.rootless
@@ -71,6 +71,7 @@ RUN apk --no-cache add \
git \
curl \
gnupg \
+ git-annex \
&& rm -rf /var/cache/apk/*
RUN addgroup \
diff --git a/Makefile b/Makefile
index a9de57e523..561d674198 100644
--- a/Makefile
+++ b/Makefile
@@ -8,7 +8,7 @@ self := $(location)
@tmpdir=`mktemp --tmpdir -d` ; \
echo Using temporary directory $$tmpdir for test repositories ; \
USE_REPO_TEST_DIR= $(MAKE) -f $(self) --no-print-directory REPO_TEST_DIR=$$tmpdir/ $@ ; \
- STATUS=$$? ; rm -r "$$tmpdir" ; exit $$STATUS
+ STATUS=$$? ; chmod -R +w "$$tmpdir" && rm -r "$$tmpdir" ; exit $$STATUS
else
@@ -104,7 +104,7 @@ else
FORGEJO_VERSION_API ?= $(GITEA_VERSION)+${GITEA_COMPATIBILITY}
else
# drop the "g" prefix prepended by git describe to the commit hash
- FORGEJO_VERSION ?= $(shell git describe --exclude '*-test' --tags --always | sed 's/^v//' | sed 's/\-g/-/')+${GITEA_COMPATIBILITY}
+ FORGEJO_VERSION ?= $(shell git describe --exclude '*-test' --tags --always | sed 's/^v//' | sed 's/\-g/-/2')+${GITEA_COMPATIBILITY}
endif
endif
FORGEJO_VERSION_MAJOR=$(shell echo $(FORGEJO_VERSION) | sed -e 's/\..*//')
diff --git a/assets/go-licenses.json b/assets/go-licenses.json
index 1d19440d59..73ad852082 100644
--- a/assets/go-licenses.json
+++ b/assets/go-licenses.json
@@ -84,6 +84,11 @@
"path": "gitea.com/lunny/levelqueue/LICENSE",
"licenseText": "Copyright (c) 2019 Lunny Xiao\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
},
+ {
+ "name": "github.com/42wim/httpsig",
+ "path": "github.com/42wim/httpsig/LICENSE",
+ "licenseText": "BSD 3-Clause License\n\nCopyright (c) 2018, go-fed\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\n* Neither the name of the copyright holder nor the names of its\n contributors may be used to endorse or promote products derived from\n this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
+ },
{
"name": "github.com/42wim/sshsig",
"path": "github.com/42wim/sshsig/LICENSE",
@@ -292,7 +297,7 @@
{
"name": "github.com/cyphar/filepath-securejoin",
"path": "github.com/cyphar/filepath-securejoin/LICENSE",
- "licenseText": "Copyright (C) 2014-2015 Docker Inc \u0026 Go Authors. All rights reserved.\nCopyright (C) 2017 SUSE LLC. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
+ "licenseText": "Copyright (C) 2014-2015 Docker Inc \u0026 Go Authors. All rights reserved.\nCopyright (C) 2017-2024 SUSE LLC. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
},
{
"name": "github.com/davecgh/go-spew/spew",
diff --git a/build/lint-locale.go b/build/lint-locale.go
index c49e236938..44d320994c 100644
--- a/build/lint-locale.go
+++ b/build/lint-locale.go
@@ -59,9 +59,9 @@ func initRemoveTags() {
oldnew := []string{}
for _, el := range []string{
"email@example.com", "correu@example.com", "epasts@domens.lv", "email@exemplo.com", "eposta@ornek.com", "email@példa.hu", "email@esempio.it",
- "user", "utente", "lietotājs", "gebruiker", "usuário", "Benutzer", "Bruker",
+ "user", "utente", "lietotājs", "gebruiker", "usuário", "Benutzer", "Bruker", "bruger",
"server", "servidor", "kiszolgáló", "serveris",
- "label", "etichetta", "etiķete", "rótulo", "Label", "utilizador",
+ "label", "etichetta", "etiķete", "rótulo", "Label", "utilizador", "etiket", "iezīme",
} {
oldnew = append(oldnew, "<"+el+">", "REPLACED-TAG")
}
diff --git a/cmd/serv.go b/cmd/serv.go
index db67e36fa3..57804034e2 100644
--- a/cmd/serv.go
+++ b/cmd/serv.go
@@ -38,6 +38,7 @@ import (
const (
lfsAuthenticateVerb = "git-lfs-authenticate"
+ gitAnnexShellVerb = "git-annex-shell"
)
// CmdServ represents the available serv sub-command.
@@ -79,6 +80,7 @@ var (
"git-upload-archive": perm.AccessModeRead,
"git-receive-pack": perm.AccessModeWrite,
lfsAuthenticateVerb: perm.AccessModeNone,
+ gitAnnexShellVerb: perm.AccessModeNone, // annex permissions are enforced by GIT_ANNEX_SHELL_READONLY, rather than the Gitea API
}
alphaDashDotPattern = regexp.MustCompile(`[^\w-\.]`)
)
@@ -212,6 +214,28 @@ func runServ(c *cli.Context) error {
}
}
+ if verb == gitAnnexShellVerb {
+ if !setting.Annex.Enabled {
+ return fail(ctx, "Unknown git command", "git-annex request over SSH denied, git-annex support is disabled")
+ }
+
+ if len(words) < 3 {
+ return fail(ctx, "Too few arguments", "Too few arguments in cmd: %s", cmd)
+ }
+
+ // git-annex always puts the repo in words[2], unlike most other
+ // git subcommands; and it sometimes names repos like /~/, as if
+ // $HOME should get expanded while also being rooted. e.g.:
+ // git-annex-shell 'configlist' '/~/user/repo'
+ // git-annex-shell 'sendkey' '/user/repo 'key'
+ repoPath = words[2]
+ repoPath = strings.TrimPrefix(repoPath, "/")
+ repoPath = strings.TrimPrefix(repoPath, "~/")
+ }
+
+ // prevent directory traversal attacks
+ repoPath = filepath.Clean("/" + repoPath)[1:]
+
rr := strings.SplitN(repoPath, "/", 2)
if len(rr) != 2 {
return fail(ctx, "Invalid repository path", "Invalid repository path: %v", repoPath)
@@ -225,6 +249,18 @@ func runServ(c *cli.Context) error {
// so that username and reponame are not affected.
repoPath = strings.ToLower(strings.TrimSpace(repoPath))
+ // put the sanitized repoPath back into the argument list for later
+ if verb == gitAnnexShellVerb {
+ // git-annex-shell demands an absolute path
+ absRepoPath, err := filepath.Abs(filepath.Join(setting.RepoRootPath, repoPath))
+ if err != nil {
+ return fail(ctx, "Error locating repoPath", "%v", err)
+ }
+ words[2] = absRepoPath
+ } else {
+ words[1] = repoPath
+ }
+
if alphaDashDotPattern.MatchString(reponame) {
return fail(ctx, "Invalid repo name", "Invalid repo name: %s", reponame)
}
@@ -303,21 +339,45 @@ func runServ(c *cli.Context) error {
return nil
}
- var gitcmd *exec.Cmd
- gitBinPath := filepath.Dir(git.GitExecutable) // e.g. /usr/bin
- gitBinVerb := filepath.Join(gitBinPath, verb) // e.g. /usr/bin/git-upload-pack
- if _, err := os.Stat(gitBinVerb); err != nil {
+ gitBinVerb, err := exec.LookPath(verb)
+ if err != nil {
// if the command "git-upload-pack" doesn't exist, try to split "git-upload-pack" to use the sub-command with git
// ps: Windows only has "git.exe" in the bin path, so Windows always uses this way
+ // ps: git-annex-shell and other extensions may not necessarily be in gitBinPath,
+ // but '{gitBinPath}/git annex-shell' should be able to find them on $PATH.
verbFields := strings.SplitN(verb, "-", 2)
if len(verbFields) == 2 {
// use git binary with the sub-command part: "C:\...\bin\git.exe", "upload-pack", ...
- gitcmd = exec.CommandContext(ctx, git.GitExecutable, verbFields[1], repoPath)
+ gitBinVerb = git.GitExecutable
+ words = append([]string{verbFields[1]}, words...)
}
}
- if gitcmd == nil {
- // by default, use the verb (it has been checked above by allowedCommands)
- gitcmd = exec.CommandContext(ctx, gitBinVerb, repoPath)
+
+ // by default, use the verb (it has been checked above by allowedCommands)
+ gitcmd := exec.CommandContext(ctx, gitBinVerb, words[1:]...)
+
+ if verb == gitAnnexShellVerb {
+ // This doesn't get its own isolated section like LFS does, because LFS
+ // is handled by internal Gitea routines, but git-annex has to be shelled out
+ // to like other git subcommands, so we need to build up gitcmd.
+
+ // TODO: does this work on Windows?
+ gitcmd.Env = append(gitcmd.Env,
+ // "If set, disallows running git-shell to handle unknown commands."
+ // - git-annex-shell(1)
+ "GIT_ANNEX_SHELL_LIMITED=True",
+ // "If set, git-annex-shell will refuse to run commands
+ // that do not operate on the specified directory."
+ // - git-annex-shell(1)
+ fmt.Sprintf("GIT_ANNEX_SHELL_DIRECTORY=%s", words[2]),
+ )
+ if results.UserMode < perm.AccessModeWrite {
+ // "If set, disallows any action that could modify the git-annex repository."
+ // - git-annex-shell(1)
+ // We set this when the backend API has told us that we don't have write permission to this repo.
+ log.Debug("Setting GIT_ANNEX_SHELL_READONLY=True")
+ gitcmd.Env = append(gitcmd.Env, "GIT_ANNEX_SHELL_READONLY=True")
+ }
}
process.SetSysProcAttribute(gitcmd)
diff --git a/cmd/web.go b/cmd/web.go
index 44babd51c5..661e6d158e 100644
--- a/cmd/web.go
+++ b/cmd/web.go
@@ -9,6 +9,7 @@ import (
"net"
"net/http"
"os"
+ "os/exec"
"path/filepath"
"strconv"
"strings"
@@ -247,6 +248,12 @@ func runWeb(ctx *cli.Context) error {
createPIDFile(ctx.String("pid"))
}
+ if setting.Annex.Enabled {
+ if _, err := exec.LookPath("git-annex"); err != nil {
+ log.Fatal("You have enabled git-annex support but git-annex is not installed. Please make sure that Forgejo's PATH contains the git-annex executable.")
+ }
+ }
+
if !setting.InstallLock {
if err := serveInstall(ctx); err != nil {
return err
@@ -311,6 +318,10 @@ func listen(m http.Handler, handleRedirector bool) error {
log.Info("LFS server enabled")
}
+ if setting.Annex.Enabled {
+ log.Info("git-annex enabled")
+ }
+
var err error
switch setting.Protocol {
case setting.HTTP:
diff --git a/custom/conf/app.example.ini b/custom/conf/app.example.ini
index ee8ad66668..3c723fa4c7 100644
--- a/custom/conf/app.example.ini
+++ b/custom/conf/app.example.ini
@@ -2678,6 +2678,17 @@ LEVEL = Info
;; Limit the number of concurrent upload/download operations within a batch
;BATCH_OPERATION_CONCURRENCY = 8
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;[annex]
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Whether git-annex is enabled; defaults to false
+;ENABLED = false
+;; Whether to disable p2phttp support; default is the same as repository.DISABLE_HTTP_GIT
+;DISABLE_P2PHTTP = false
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; settings for packages, will override storage setting
diff --git a/go.mod b/go.mod
index b054802289..d5f48716ff 100644
--- a/go.mod
+++ b/go.mod
@@ -5,7 +5,7 @@ go 1.23
toolchain go1.23.4
require (
- code.forgejo.org/f3/gof3/v3 v3.7.0
+ code.forgejo.org/f3/gof3/v3 v3.10.2
code.forgejo.org/forgejo-contrib/go-libravatar v0.0.0-20191008002943-06d1c002b251
code.forgejo.org/forgejo/reply v1.0.2
code.forgejo.org/go-chi/binding v1.0.0
@@ -19,10 +19,10 @@ require (
gitea.com/lunny/levelqueue v0.4.2-0.20230414023320-3c0159fe0fe4
github.com/42wim/sshsig v0.0.0-20211121163825-841cf5bbc121
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358
- github.com/ProtonMail/go-crypto v1.0.0
+ github.com/ProtonMail/go-crypto v1.1.3
github.com/PuerkitoBio/goquery v1.10.0
github.com/SaveTheRbtz/zstd-seekable-format-go/pkg v0.7.2
- github.com/alecthomas/chroma/v2 v2.14.0
+ github.com/alecthomas/chroma/v2 v2.15.0
github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb
github.com/blevesearch/bleve/v2 v2.4.4
github.com/buildkite/terminal-to-html/v3 v3.16.4
@@ -44,7 +44,7 @@ require (
github.com/go-co-op/gocron v1.37.0
github.com/go-enry/go-enry/v2 v2.9.1
github.com/go-fed/httpsig v1.1.1-0.20201223112313-55836744818e
- github.com/go-git/go-git/v5 v5.11.0
+ github.com/go-git/go-git/v5 v5.13.1
github.com/go-ldap/ldap/v3 v3.4.6
github.com/go-openapi/spec v0.20.14
github.com/go-sql-driver/mysql v1.8.1
@@ -89,7 +89,7 @@ require (
github.com/robfig/cron/v3 v3.0.1
github.com/santhosh-tekuri/jsonschema/v6 v6.0.1
github.com/sassoftware/go-rpmutils v0.4.0
- github.com/sergi/go-diff v1.3.1
+ github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3
github.com/shurcooL/vfsgen v0.0.0-20230704071429-0000e147ea92
github.com/stretchr/testify v1.10.0
github.com/syndtr/goleveldb v1.0.0
@@ -131,6 +131,7 @@ require (
dario.cat/mergo v1.0.0 // indirect
filippo.io/edwards25519 v1.1.0 // indirect
git.sr.ht/~mariusor/go-xsd-duration v0.0.0-20220703122237-02e73435a078 // indirect
+ github.com/42wim/httpsig v1.2.2 // indirect
github.com/DataDog/zstd v1.5.5 // indirect
github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0 // indirect
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.2 // indirect
@@ -168,11 +169,11 @@ require (
github.com/cloudflare/circl v1.3.8 // indirect
github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect
- github.com/cyphar/filepath-securejoin v0.2.4 // indirect
+ github.com/cyphar/filepath-securejoin v0.3.6 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/davidmz/go-pageant v1.0.2 // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
- github.com/dlclark/regexp2 v1.11.0 // indirect
+ github.com/dlclark/regexp2 v1.11.4 // indirect
github.com/emersion/go-sasl v0.0.0-20231106173351-e73c9f7bad43 // indirect
github.com/emirpasic/gods v1.18.1 // indirect
github.com/envoyproxy/go-control-plane v0.13.1 // indirect
@@ -184,7 +185,7 @@ require (
github.com/go-asn1-ber/asn1-ber v1.5.5 // indirect
github.com/go-enry/go-oniguruma v1.2.1 // indirect
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
- github.com/go-git/go-billy/v5 v5.5.0 // indirect
+ github.com/go-git/go-billy/v5 v5.6.1 // indirect
github.com/go-ini/ini v1.67.0 // indirect
github.com/go-logr/logr v1.4.2 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
@@ -246,13 +247,14 @@ require (
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
- github.com/skeema/knownhosts v1.2.1 // indirect
+ github.com/skeema/knownhosts v1.3.0 // indirect
github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf // indirect
github.com/x448/float16 v0.8.4 // indirect
github.com/xanzy/ssh-agent v0.3.3 // indirect
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect
github.com/zeebo/blake3 v0.2.4 // indirect
+ gitlab.com/gitlab-org/api/client-go v0.116.0 // indirect
go.etcd.io/bbolt v1.3.9 // indirect
go.opencensus.io v0.24.0 // indirect
go.opentelemetry.io/contrib/detectors/gcp v1.31.0 // indirect
diff --git a/go.sum b/go.sum
index 4629eba1df..0bdc471be2 100644
--- a/go.sum
+++ b/go.sum
@@ -610,8 +610,8 @@ cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoIS
cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M=
cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA=
cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw=
-code.forgejo.org/f3/gof3/v3 v3.7.0 h1:ZfuCP8CGm8ZJbWmL+V0pUu3E0X4FCAA7GfRDy/y5/K4=
-code.forgejo.org/f3/gof3/v3 v3.7.0/go.mod h1:oNhOeqD4DZYjVcNjQXIOdDX9b/1tqxi9ITLS8H9/Csw=
+code.forgejo.org/f3/gof3/v3 v3.10.2 h1:EOlv9d8GR7l0BmvZF101O3LUuabb4g5Hw5fKYPiPZlI=
+code.forgejo.org/f3/gof3/v3 v3.10.2/go.mod h1:qApIHumpBkFkeBEokviO28+HK2WM11IsmMOhmjvCjFQ=
code.forgejo.org/forgejo-contrib/go-libravatar v0.0.0-20191008002943-06d1c002b251 h1:HTZl3CBk3ABNYtFI6TPLvJgGKFIhKT5CBk0sbOtkDKU=
code.forgejo.org/forgejo-contrib/go-libravatar v0.0.0-20191008002943-06d1c002b251/go.mod h1:PphB88CPbx601QrWPMZATeorACeVmQlyv3u+uUMbSaM=
code.forgejo.org/forgejo/act v1.22.0 h1:NbUf0+vQ48+ddwe4zVkINqnxKYl/to+NUvW7iisPA60=
@@ -651,6 +651,8 @@ gitea.com/lunny/levelqueue v0.4.2-0.20230414023320-3c0159fe0fe4 h1:IFT+hup2xejHq
gitea.com/lunny/levelqueue v0.4.2-0.20230414023320-3c0159fe0fe4/go.mod h1:HBqmLbz56JWpfEGG0prskAV97ATNRoj5LDmPicD22hU=
gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:lSA0F4e9A2NcQSqGqTOXqu2aRi/XEQxDCBwM8yJtE6s=
gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:EXuID2Zs0pAQhH8yz+DNjUbjppKQzKFAn28TMYPB6IU=
+github.com/42wim/httpsig v1.2.2 h1:ofAYoHUNs/MJOLqQ8hIxeyz2QxOz8qdSVvp3PX/oPgA=
+github.com/42wim/httpsig v1.2.2/go.mod h1:P/UYo7ytNBFwc+dg35IubuAUIs8zj5zzFIgUCEl55WY=
github.com/42wim/sshsig v0.0.0-20211121163825-841cf5bbc121 h1:r3qt8PCHnfjOv9PN3H+XXKmDA1dfFMIN1AislhlA/ps=
github.com/42wim/sshsig v0.0.0-20211121163825-841cf5bbc121/go.mod h1:Ock8XgA7pvULhIaHGAk/cDnRfNrF9Jey81nPcc403iU=
github.com/6543/go-version v1.3.1 h1:HvOp+Telns7HWJ2Xo/05YXQSB2bE0WmVgbHqwMPZT4U=
@@ -674,8 +676,8 @@ github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
-github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78=
-github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0=
+github.com/ProtonMail/go-crypto v1.1.3 h1:nRBOetoydLeUb4nHajyO2bKqMLfWQ/ZPwkXqXxPxCFk=
+github.com/ProtonMail/go-crypto v1.1.3/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE=
github.com/PuerkitoBio/goquery v1.10.0 h1:6fiXdLuUvYs2OJSvNRqlNPoBm6YABE226xrbavY5Wv4=
github.com/PuerkitoBio/goquery v1.10.0/go.mod h1:TjZZl68Q3eGHNBA8CWaxAN7rOU1EbDz3CWuolcO5Yu4=
github.com/RoaringBitmap/roaring v1.9.3 h1:t4EbC5qQwnisr5PrP9nt0IRhRTb9gMUgQF4t4S2OByM=
@@ -686,11 +688,11 @@ github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm
github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=
github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=
-github.com/alecthomas/assert/v2 v2.7.0 h1:QtqSACNS3tF7oasA8CU6A6sXZSBDqnm7RfpLl9bZqbE=
-github.com/alecthomas/assert/v2 v2.7.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
+github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0=
+github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
github.com/alecthomas/chroma/v2 v2.2.0/go.mod h1:vf4zrexSH54oEjJ7EdB65tGNHmH3pGZmVkgTP5RHvAs=
-github.com/alecthomas/chroma/v2 v2.14.0 h1:R3+wzpnUArGcQz7fCETQBzO5n9IMNi13iIs46aU4V9E=
-github.com/alecthomas/chroma/v2 v2.14.0/go.mod h1:QolEbTfmUHIMVpBqxeDnNBj2uoeI4EbYP4i6n68SG4I=
+github.com/alecthomas/chroma/v2 v2.15.0 h1:LxXTQHFoYrstG2nnV9y2X5O94sOBzf0CIUpSTbpxvMc=
+github.com/alecthomas/chroma/v2 v2.15.0/go.mod h1:gUhVLrPDXPtp/f+L1jo9xepo9gL4eLwRuGAunSZMkio=
github.com/alecthomas/repr v0.0.0-20220113201626-b1b626ac65ae/go.mod h1:2kn6fqh/zIyPLmm3ugklbEi5hg5wS435eygvNfaDQL8=
github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc=
github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
@@ -768,7 +770,6 @@ github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
github.com/buildkite/terminal-to-html/v3 v3.16.4 h1:QFYO8IGvRnp7tGgiQb8g9uFU8kY9wOzxsFFx17+yy6Q=
github.com/buildkite/terminal-to-html/v3 v3.16.4/go.mod h1:r/J7cC9c3EzBzP3/wDz0RJLPwv5PUAMp+KF2w+ntMc0=
-github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0=
github.com/caddyserver/certmagic v0.21.4 h1:e7VobB8rffHv8ZZpSiZtEwnLDHUwLVYLWzWSa1FfKI0=
github.com/caddyserver/certmagic v0.21.4/go.mod h1:swUXjQ1T9ZtMv95qj7/InJvWLXURU85r+CfG0T+ZbDE=
github.com/caddyserver/zerossl v0.1.3 h1:onS+pxp3M8HnHpN5MMbOMyNjmTheJyWRaZYwn+YTAyA=
@@ -796,7 +797,6 @@ github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObk
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
-github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA=
github.com/cloudflare/circl v1.3.8 h1:j+V8jJt09PoeMFIu2uh5JUyEaIHTXVOHslFoLNAKqwI=
github.com/cloudflare/circl v1.3.8/go.mod h1:PDRU+oXvdD7KCtgKxW95M5Z8BpSCJXQORiZFnBQS5QU=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
@@ -817,8 +817,8 @@ github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1Ig
github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc=
github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
-github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg=
-github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
+github.com/cyphar/filepath-securejoin v0.3.6 h1:4d9N5ykBnSp5Xn2JkhocYDkOpURL/18CYMpo6xB9uWM=
+github.com/cyphar/filepath-securejoin v0.3.6/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
@@ -837,8 +837,8 @@ github.com/djherbis/nio/v3 v3.0.1/go.mod h1:Ng4h80pbZFMla1yKzm61cF0tqqilXZYrogmW
github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
-github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI=
-github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
+github.com/dlclark/regexp2 v1.11.4 h1:rPYF9/LECdNymJufQKmri9gV604RvvABwgOA8un7yAo=
+github.com/dlclark/regexp2 v1.11.4/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5/go.mod h1:qssHWj60/X5sZFNxpG4HBPDHVqxNm4DfnCKgrbZOT+s=
github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707 h1:2tV76y6Q9BB+NEBasnqvs7e49aEBFI8ejC89PSnWH+4=
@@ -849,8 +849,8 @@ github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkp
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/editorconfig/editorconfig-core-go/v2 v2.6.2 h1:dKG8sc7n321deIVRcQtwlMNoBEra7j0qQ8RwxO8RN0w=
github.com/editorconfig/editorconfig-core-go/v2 v2.6.2/go.mod h1:7dvD3GCm7eBw53xZ/lsiq72LqobdMg3ITbMBxnmJmqY=
-github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU=
-github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM=
+github.com/elazarl/goproxy v1.2.3 h1:xwIyKHbaP5yfT6O9KIeYJR5549MXRQkoQMRXGztz8YQ=
+github.com/elazarl/goproxy v1.2.3/go.mod h1:YfEbZtqP4AetfO6d40vWchF3znWX7C7Vd6ZMfdL8z64=
github.com/emersion/go-imap v1.2.1 h1:+s9ZjMEjOB8NzZMVTM3cCenz2JrQIGGo5j1df19WjTA=
github.com/emersion/go-imap v1.2.1/go.mod h1:Qlx1FSx2FTxjnjWpIlVNEuX+ylerZQNFE5NsmKFSejY=
github.com/emersion/go-message v0.15.0/go.mod h1:wQUEfE+38+7EW8p8aZ96ptg6bAb1iwdgej19uXASlE4=
@@ -929,12 +929,12 @@ github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2H
github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI=
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic=
-github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU=
-github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow=
+github.com/go-git/go-billy/v5 v5.6.1 h1:u+dcrgaguSSkbjzHwelEjc0Yj300NUevrrPphk/SoRA=
+github.com/go-git/go-billy/v5 v5.6.1/go.mod h1:0AsLr1z2+Uksi4NlElmMblP5rPcDZNRCD8ujZCRR2BE=
github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4=
github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII=
-github.com/go-git/go-git/v5 v5.11.0 h1:XIZc1p+8YzypNr34itUfSvYJcv+eYdTnTvOZ2vD3cA4=
-github.com/go-git/go-git/v5 v5.11.0/go.mod h1:6GFcX2P3NM7FPBfpePbpLd21XxsgdAt+lKqXmCUiUCY=
+github.com/go-git/go-git/v5 v5.13.1 h1:DAQ9APonnlvSWpvolXWIuV6Q6zXy2wHbN4cVlNR5Q+M=
+github.com/go-git/go-git/v5 v5.13.1/go.mod h1:qryJB4cSBoq3FRoBRf5A77joojuBcmPJ0qu3XXXVixc=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
@@ -1300,8 +1300,8 @@ github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
-github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI=
-github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M=
+github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k=
+github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY=
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug=
@@ -1373,8 +1373,8 @@ github.com/sassoftware/go-rpmutils v0.4.0/go.mod h1:3goNWi7PGAT3/dlql2lv3+MSN5jN
github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys=
github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs=
github.com/serenize/snaker v0.0.0-20171204205717-a683aaf2d516/go.mod h1:Yow6lPLSAXx2ifx470yD/nUe22Dv5vBvxK/UK9UUTVs=
-github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8=
-github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I=
+github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8=
+github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4=
github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k=
github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME=
github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c h1:aqg5Vm5dwtvL+YgDpBcK1ITf3o96N/K7/wsRXQnUTEs=
@@ -1382,8 +1382,8 @@ github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c/go.mod h1:owqhoLW1
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
-github.com/skeema/knownhosts v1.2.1 h1:SHWdIUa82uGZz+F+47k8SY4QhhI291cXCpopT1lK2AQ=
-github.com/skeema/knownhosts v1.2.1/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo=
+github.com/skeema/knownhosts v1.3.0 h1:AM+y0rI04VksttfwjkSTNQorvGqmwATnvnAHpSgc0LY=
+github.com/skeema/knownhosts v1.3.0/go.mod h1:sPINvnADmT/qYH1kfv+ePMmOBTH6Tbl7b5LvTDjFK7M=
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4=
github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
@@ -1449,6 +1449,8 @@ github.com/zeebo/blake3 v0.2.4/go.mod h1:7eeQ6d2iXWRGF6npfaxl2CU+xy2Fjo2gxeyZGCR
github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo=
github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4=
github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA=
+gitlab.com/gitlab-org/api/client-go v0.116.0 h1:Dy534gtZPMrnm3fAcmQRMadrcoUyFO4FQ4rXlSAdHAw=
+gitlab.com/gitlab-org/api/client-go v0.116.0/go.mod h1:B29OfnZklmaoiR7uHANh9jTyfWEgmXvZLVEnosw2Dx0=
go.etcd.io/bbolt v1.3.9 h1:8x7aARPEXiXbHmtUwAIv7eV2fQFHrLLavdiJ3uzJXoI=
go.etcd.io/bbolt v1.3.9/go.mod h1:zaO32+Ti0PK1ivdPtgMESzuzL2VPoIG1PCQNvOdo/dE=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
@@ -1501,8 +1503,6 @@ golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
-golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
@@ -1522,6 +1522,8 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE=
+golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8=
+golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY=
golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
diff --git a/models/auth/webauthn.go b/models/auth/webauthn.go
index aa13cf6cb1..b230e1665a 100644
--- a/models/auth/webauthn.go
+++ b/models/auth/webauthn.go
@@ -52,10 +52,10 @@ type WebAuthnCredential struct {
AAGUID []byte
SignCount uint32 `xorm:"BIGINT"`
CloneWarning bool
- BackupEligible bool `XORM:"NOT NULL DEFAULT false"`
- BackupState bool `XORM:"NOT NULL DEFAULT false"`
+ BackupEligible bool `xorm:"NOT NULL DEFAULT false"`
+ BackupState bool `xorm:"NOT NULL DEFAULT false"`
// If legacy is set to true, backup_eligible and backup_state isn't set.
- Legacy bool `XORM:"NOT NULL DEFAULT true"`
+ Legacy bool `xorm:"NOT NULL DEFAULT true"`
CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"`
}
diff --git a/models/fixtures/label.yml b/models/fixtures/label.yml
index 2242b90dcd..acfac74968 100644
--- a/models/fixtures/label.yml
+++ b/models/fixtures/label.yml
@@ -96,3 +96,14 @@
num_issues: 0
num_closed_issues: 0
archived_unix: 0
+
+-
+ id: 10
+ repo_id: 3
+ org_id: 0
+ name: repo3label1
+ color: '#112233'
+ exclusive: false
+ num_issues: 0
+ num_closed_issues: 0
+ archived_unix: 0
diff --git a/models/issues/issue.go b/models/issues/issue.go
index 17391ffe6c..fbbc4828a2 100644
--- a/models/issues/issue.go
+++ b/models/issues/issue.go
@@ -416,20 +416,6 @@ func (issue *Issue) SummaryCardURL() string {
return fmt.Sprintf("%s/summary-card", issue.HTMLURL())
}
-func (issue *Issue) SummaryCardSize() (int, int) {
- return 1200, 600
-}
-
-func (issue *Issue) SummaryCardWidth() int {
- width, _ := issue.SummaryCardSize()
- return width
-}
-
-func (issue *Issue) SummaryCardHeight() int {
- _, height := issue.SummaryCardSize()
- return height
-}
-
// Link returns the issue's relative URL.
func (issue *Issue) Link() string {
var path string
diff --git a/models/issues/label.go b/models/issues/label.go
index 804a118e7a..259c87459e 100644
--- a/models/issues/label.go
+++ b/models/issues/label.go
@@ -353,6 +353,17 @@ func GetLabelIDsInRepoByNames(ctx context.Context, repoID int64, labelNames []st
Find(&labelIDs)
}
+// GetLabelIDsInOrgByNames returns a list of labelIDs by names in a given org.
+func GetLabelIDsInOrgByNames(ctx context.Context, orgID int64, labelNames []string) ([]int64, error) {
+ labelIDs := make([]int64, 0, len(labelNames))
+ return labelIDs, db.GetEngine(ctx).Table("label").
+ Where("org_id = ?", orgID).
+ In("name", labelNames).
+ Asc("name").
+ Cols("id").
+ Find(&labelIDs)
+}
+
// BuildLabelNamesIssueIDsCondition returns a builder where get issue ids match label names
func BuildLabelNamesIssueIDsCondition(labelNames []string) *builder.Builder {
return builder.Select("issue_label.issue_id").
diff --git a/models/migrations/v1_23/v303.go b/models/migrations/v1_23/v303.go
index c1e74c596a..e3ee180539 100644
--- a/models/migrations/v1_23/v303.go
+++ b/models/migrations/v1_23/v303.go
@@ -4,6 +4,8 @@
package v1_23 //nolint
import (
+ "fmt"
+
"code.gitea.io/gitea/models/migrations/base"
"xorm.io/xorm"
@@ -13,20 +15,26 @@ func GiteaLastDrop(x *xorm.Engine) error {
sess := x.NewSession()
defer sess.Close()
- if err := base.DropTableColumns(sess, "badge", "slug"); err != nil {
- return err
- }
- if err := base.DropTableColumns(sess, "oauth2_application", "skip_secondary_authorization"); err != nil {
- return err
- }
- if err := base.DropTableColumns(sess, "repository", "default_wiki_branch"); err != nil {
- return err
- }
- // the migration v297.go that adds everyone_access_mode exists in Gitea >= v1.22 and the column must be dropped
- // but it does not exist in Forgejo and a failure to drop the column can be ignored
- base.DropTableColumns(sess, "repo_unit", "everyone_access_mode")
- if err := base.DropTableColumns(sess, "protected_branch", "can_force_push", "enable_force_push_allowlist", "force_push_allowlist_user_i_ds", "force_push_allowlist_team_i_ds", "force_push_allowlist_deploy_keys"); err != nil {
- return err
+ for _, drop := range []struct {
+ table string
+ field string
+ }{
+ {"badge", "slug"},
+ {"oauth2_application", "skip_secondary_authorization"},
+ {"repository", "default_wiki_branch"},
+ {"repo_unit", "everyone_access_mode"},
+ {"protected_branch", "can_force_push"},
+ {"protected_branch", "enable_force_push_allowlist"},
+ {"protected_branch", "force_push_allowlist_user_i_ds"},
+ {"protected_branch", "force_push_allowlist_team_i_ds"},
+ {"protected_branch", "force_push_allowlist_deploy_keys"},
+ } {
+ if _, err := sess.Exec(fmt.Sprintf("SELECT `%s` FROM `%s` WHERE 0 = 1", drop.field, drop.table)); err != nil {
+ continue
+ }
+ if err := base.DropTableColumns(sess, drop.table, drop.field); err != nil {
+ return err
+ }
}
return sess.Commit()
diff --git a/models/repo/release.go b/models/repo/release.go
index 38e38c6572..eb18f8aa02 100644
--- a/models/repo/release.go
+++ b/models/repo/release.go
@@ -97,13 +97,11 @@ func init() {
// LoadAttributes load repo and publisher attributes for a release
func (r *Release) LoadAttributes(ctx context.Context) error {
- var err error
- if r.Repo == nil {
- r.Repo, err = GetRepositoryByID(ctx, r.RepoID)
- if err != nil {
- return err
- }
+ err := r.LoadRepo(ctx)
+ if err != nil {
+ return err
}
+
if r.Publisher == nil {
r.Publisher, err = user_model.GetUserByID(ctx, r.PublisherID)
if err != nil {
@@ -123,6 +121,18 @@ func (r *Release) LoadAttributes(ctx context.Context) error {
return GetReleaseAttachments(ctx, r)
}
+// LoadRepo load repo attribute for release
+func (r *Release) LoadRepo(ctx context.Context) error {
+ if r.Repo != nil {
+ return nil
+ }
+
+ var err error
+ r.Repo, err = GetRepositoryByID(ctx, r.RepoID)
+
+ return err
+}
+
// LoadArchiveDownloadCount loads the download count for the source archives
func (r *Release) LoadArchiveDownloadCount(ctx context.Context) error {
var err error
@@ -130,6 +140,25 @@ func (r *Release) LoadArchiveDownloadCount(ctx context.Context) error {
return err
}
+// GetTotalDownloadCount returns the summary of all dowload count of files attached to the release
+func (r *Release) GetTotalDownloadCount(ctx context.Context) (int64, error) {
+ var archiveCount int64
+ if !r.HideArchiveLinks {
+ _, err := db.GetEngine(ctx).SQL("SELECT SUM(count) FROM repo_archive_download_count WHERE release_id = ?", r.ID).Get(&archiveCount)
+ if err != nil {
+ return 0, err
+ }
+ }
+
+ var attachmentCount int64
+ _, err := db.GetEngine(ctx).SQL("SELECT SUM(download_count) FROM attachment WHERE release_id = ?", r.ID).Get(&attachmentCount)
+ if err != nil {
+ return 0, err
+ }
+
+ return archiveCount + attachmentCount, nil
+}
+
// APIURL the api url for a release. release must have attributes loaded
func (r *Release) APIURL() string {
return r.Repo.APIURL() + "/releases/" + strconv.FormatInt(r.ID, 10)
@@ -160,6 +189,20 @@ func (r *Release) Link() string {
return r.Repo.Link() + "/releases/tag/" + util.PathEscapeSegments(r.TagName)
}
+// SummaryCardURL returns the absolute URL to an image providing a summary of the release
+func (r *Release) SummaryCardURL() string {
+ return fmt.Sprintf("%s/releases/summary-card/%s", r.Repo.HTMLURL(), util.PathEscapeSegments(r.TagName))
+}
+
+// DisplayName retruns the name of the release
+func (r *Release) DisplayName() string {
+ if r.IsTag && r.Title == "" {
+ return r.TagName
+ }
+
+ return r.Title
+}
+
// IsReleaseExist returns true if release with given tag name already exists.
func IsReleaseExist(ctx context.Context, repoID int64, tagName string) (bool, error) {
if len(tagName) == 0 {
diff --git a/models/repo/release_test.go b/models/repo/release_test.go
index 4e61a2805d..7680f2cc9d 100644
--- a/models/repo/release_test.go
+++ b/models/repo/release_test.go
@@ -9,6 +9,7 @@ import (
"code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/models/unittest"
+ "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
@@ -25,3 +26,26 @@ func TestMigrate_InsertReleases(t *testing.T) {
err := InsertReleases(db.DefaultContext, r)
require.NoError(t, err)
}
+
+func TestReleaseLoadRepo(t *testing.T) {
+ require.NoError(t, unittest.PrepareTestDatabase())
+
+ release := unittest.AssertExistsAndLoadBean(t, &Release{ID: 1})
+ assert.Nil(t, release.Repo)
+
+ require.NoError(t, release.LoadRepo(db.DefaultContext))
+
+ assert.EqualValues(t, 1, release.Repo.ID)
+}
+
+func TestReleaseDisplayName(t *testing.T) {
+ release := Release{TagName: "TagName"}
+
+ assert.Empty(t, release.DisplayName())
+
+ release.IsTag = true
+ assert.Equal(t, "TagName", release.DisplayName())
+
+ release.Title = "Title"
+ assert.Equal(t, "Title", release.DisplayName())
+}
diff --git a/models/repo/repo.go b/models/repo/repo.go
index cd6be48b90..bdf0de2f85 100644
--- a/models/repo/repo.go
+++ b/models/repo/repo.go
@@ -327,6 +327,11 @@ func (repo *Repository) HTMLURL() string {
return setting.AppURL + url.PathEscape(repo.OwnerName) + "/" + url.PathEscape(repo.Name)
}
+// SummaryCardURL returns the absolute URL to an image providing a summary of the repo
+func (repo *Repository) SummaryCardURL() string {
+ return fmt.Sprintf("%s/-/summary-card", repo.HTMLURL())
+}
+
// CommitLink make link to by commit full ID
// note: won't check whether it's an right id
func (repo *Repository) CommitLink(commitID string) (result string) {
diff --git a/modules/annex/annex.go b/modules/annex/annex.go
new file mode 100644
index 0000000000..dee24d21bc
--- /dev/null
+++ b/modules/annex/annex.go
@@ -0,0 +1,192 @@
+// Copyright 2022 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+// Unlike modules/lfs, which operates mainly on git.Blobs, this operates on git.TreeEntrys.
+// The motivation for this is that TreeEntrys have an easy pointer to the on-disk repo path,
+// while blobs do not (in fact, if building with TAGS=gogit, blobs might exist only in a mock
+// filesystem, living only in process RAM). We must have the on-disk path to do anything
+// useful with git-annex because all of its interesting data is on-disk under .git/annex/.
+
+package annex
+
+import (
+ "errors"
+ "fmt"
+ "io/fs"
+ "os"
+ "path"
+ "path/filepath"
+ "regexp"
+ "strings"
+
+ "code.gitea.io/gitea/modules/git"
+ "code.gitea.io/gitea/modules/log"
+ "code.gitea.io/gitea/modules/setting"
+ "code.gitea.io/gitea/modules/typesniffer"
+)
+
+// ErrBlobIsNotAnnexed occurs if a blob does not contain a valid annex key
+var ErrBlobIsNotAnnexed = errors.New("not a git-annex pointer")
+
+func LookupKey(blob *git.Blob) (string, error) {
+ stdout, _, err := git.NewCommand(git.DefaultContext, "annex", "lookupkey", "--ref").AddDynamicArguments(blob.ID.String()).RunStdString(&git.RunOpts{Dir: blob.Repo().Path})
+ if err != nil {
+ return "", ErrBlobIsNotAnnexed
+ }
+ key := strings.TrimSpace(stdout)
+ return key, nil
+}
+
+func ContentLocationFromKey(repoPath, key string) (string, error) {
+ contentLocation, _, err := git.NewCommandContextNoGlobals(git.DefaultContext, "annex", "contentlocation").AddDynamicArguments(key).RunStdString(&git.RunOpts{Dir: repoPath})
+ if err != nil {
+ return "", fmt.Errorf("in %s: %s does not seem to be a valid annexed file: %w", repoPath, key, err)
+ }
+ contentLocation = strings.TrimSpace(contentLocation)
+ contentLocation = path.Clean("/" + contentLocation)[1:] // prevent directory traversals
+ contentLocation = path.Join(repoPath, contentLocation)
+
+ return contentLocation, nil
+}
+
+// return the absolute path of the content pointed to by the annex pointer stored in the git object
+// errors if the content is not found in this repo
+func ContentLocation(blob *git.Blob) (string, error) {
+ key, err := LookupKey(blob)
+ if err != nil {
+ return "", err
+ }
+ return ContentLocationFromKey(blob.Repo().Path, key)
+}
+
+// returns a stream open to the annex content
+func Content(blob *git.Blob) (*os.File, error) {
+ contentLocation, err := ContentLocation(blob)
+ if err != nil {
+ return nil, err
+ }
+
+ return os.Open(contentLocation)
+}
+
+// whether the object appears to be a valid annex pointer
+// does *not* verify if the content is actually in this repo;
+// for that, use ContentLocation()
+func IsAnnexed(blob *git.Blob) (bool, error) {
+ if !setting.Annex.Enabled {
+ return false, nil
+ }
+
+ // LookupKey is written to only return well-formed keys
+ // so the test is just to see if it errors
+ _, err := LookupKey(blob)
+ if err != nil {
+ if errors.Is(err, ErrBlobIsNotAnnexed) {
+ return false, nil
+ }
+ return false, err
+ }
+ return true, nil
+}
+
+// IsAnnexRepo determines if repo is a git-annex enabled repository
+func IsAnnexRepo(repo *git.Repository) bool {
+ _, _, err := git.NewCommand(repo.Ctx, "config", "annex.uuid").RunStdString(&git.RunOpts{Dir: repo.Path})
+ return err == nil
+}
+
+var repoConfigFileRe = regexp.MustCompile("[^/]+/[^/]+.git/config$")
+
+var (
+ uuid2repoPathCache = make(map[string]string)
+ repoPath2uuidCache = make(map[string]string)
+)
+
+func Init() error {
+ if !setting.Annex.Enabled {
+ return nil
+ }
+ log.Info("Populating the git-annex UUID cache with existing repositories")
+ return updateUUID2RepoPathCache()
+}
+
+func updateUUID2RepoPathCache() error {
+ return filepath.WalkDir(setting.RepoRootPath, func(path string, d fs.DirEntry, err error) error {
+ if err == nil && repoConfigFileRe.MatchString(path) {
+ thisRepoPath := strings.TrimSuffix(path, "/config")
+ _, ok := repoPath2uuidCache[thisRepoPath]
+ if ok {
+ return nil
+ }
+ stdout, _, err := git.NewCommand(git.DefaultContext, "config", "annex.uuid").RunStdString(&git.RunOpts{Dir: thisRepoPath})
+ if err != nil {
+ return nil
+ }
+ repoUUID := strings.TrimSpace(stdout)
+ if repoUUID != "" {
+ uuid2repoPathCache[repoUUID] = thisRepoPath
+ repoPath2uuidCache[thisRepoPath] = repoUUID
+ }
+ }
+ return nil
+ })
+}
+
+func repoPathFromUUIDCache(uuid string) (string, error) {
+ if repoPath, ok := uuid2repoPathCache[uuid]; ok {
+ return repoPath, nil
+ }
+ // If the cache didn't contain an entry for the UUID then update the cache and try again
+ if err := updateUUID2RepoPathCache(); err != nil {
+ return "", err
+ }
+ if repoPath, ok := uuid2repoPathCache[uuid]; ok {
+ return repoPath, nil
+ }
+ return "", fmt.Errorf("no repository known for UUID '%s'", uuid)
+}
+
+func checkValidity(uuid, repoPath string) (bool, error) {
+ stdout, _, err := git.NewCommand(git.DefaultContext, "config", "annex.uuid").RunStdString(&git.RunOpts{Dir: repoPath})
+ if err != nil {
+ return false, err
+ }
+ repoUUID := strings.TrimSpace(stdout)
+ return uuid == repoUUID, nil
+}
+
+func removeCachedEntries(uuid, repoPath string) {
+ delete(uuid2repoPathCache, uuid)
+ delete(repoPath2uuidCache, repoPath)
+}
+
+func UUID2RepoPath(uuid string) (string, error) {
+ // Get the current cache entry for the UUID
+ repoPath, err := repoPathFromUUIDCache(uuid)
+ if err != nil {
+ return "", err
+ }
+ // Check if it is still up-to-date
+ valid, err := checkValidity(uuid, repoPath)
+ if err != nil {
+ return "", err
+ }
+ if !valid {
+ // If it isn't, remove the cache entry and try again
+ removeCachedEntries(uuid, repoPath)
+ return UUID2RepoPath(uuid)
+ }
+ // Otherwise just return the cached entry
+ return repoPath, nil
+}
+
+// GuessContentType guesses the content type of the annexed blob.
+func GuessContentType(blob *git.Blob) (typesniffer.SniffedType, error) {
+ r, err := Content(blob)
+ if err != nil {
+ return typesniffer.SniffedType{}, err
+ }
+ defer r.Close()
+
+ return typesniffer.DetectContentTypeFromReader(r)
+}
diff --git a/modules/base/tool.go b/modules/base/tool.go
index 02f1db59d3..a885546fde 100644
--- a/modules/base/tool.go
+++ b/modules/base/tool.go
@@ -16,6 +16,7 @@ import (
"strings"
"unicode/utf8"
+ "code.gitea.io/gitea/modules/annex"
"code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/log"
@@ -101,6 +102,12 @@ func Int64sToStrings(ints []int64) []string {
// EntryIcon returns the octicon class for displaying files/directories
func EntryIcon(entry *git.TreeEntry) string {
+ isAnnexed, _ := annex.IsAnnexed(entry.Blob())
+ if isAnnexed {
+ // Show git-annex files as binary files to differentiate them from non-annexed files
+ // TODO: find a more suitable icon, maybe something related to git-annex
+ return "file-binary"
+ }
switch {
case entry.IsLink():
te, _, err := entry.FollowLink()
diff --git a/modules/card/card.go b/modules/card/card.go
index bb160d7ea3..370d241073 100644
--- a/modules/card/card.go
+++ b/modules/card/card.go
@@ -5,6 +5,7 @@ package card
import (
"bytes"
+ "fmt"
"image"
"image/color"
"io"
@@ -35,12 +36,19 @@ type Card struct {
Img *image.RGBA
Font *truetype.Font
Margin int
+ Width int
+ Height int
}
var fontCache = sync.OnceValues(func() (*truetype.Font, error) {
return truetype.Parse(goregular.TTF)
})
+// DefaultSize returns the default size for a card
+func DefaultSize() (int, int) {
+ return 1200, 600
+}
+
// NewCard creates a new card with the given dimensions in pixels
func NewCard(width, height int) (*Card, error) {
img := image.NewRGBA(image.Rect(0, 0, width, height))
@@ -55,6 +63,8 @@ func NewCard(width, height int) (*Card, error) {
Img: img,
Font: font,
Margin: 0,
+ Width: width,
+ Height: height,
}, nil
}
@@ -67,14 +77,14 @@ func (c *Card) Split(vertical bool, percentage int) (*Card, *Card) {
mid := (bounds.Dx() * percentage / 100) + bounds.Min.X
subleft := c.Img.SubImage(image.Rect(bounds.Min.X, bounds.Min.Y, mid, bounds.Max.Y)).(*image.RGBA)
subright := c.Img.SubImage(image.Rect(mid, bounds.Min.Y, bounds.Max.X, bounds.Max.Y)).(*image.RGBA)
- return &Card{Img: subleft, Font: c.Font},
- &Card{Img: subright, Font: c.Font}
+ return &Card{Img: subleft, Font: c.Font, Width: subleft.Bounds().Dx(), Height: subleft.Bounds().Dy()},
+ &Card{Img: subright, Font: c.Font, Width: subright.Bounds().Dx(), Height: subright.Bounds().Dy()}
}
mid := (bounds.Dy() * percentage / 100) + bounds.Min.Y
subtop := c.Img.SubImage(image.Rect(bounds.Min.X, bounds.Min.Y, bounds.Max.X, mid)).(*image.RGBA)
subbottom := c.Img.SubImage(image.Rect(bounds.Min.X, mid, bounds.Max.X, bounds.Max.Y)).(*image.RGBA)
- return &Card{Img: subtop, Font: c.Font},
- &Card{Img: subbottom, Font: c.Font}
+ return &Card{Img: subtop, Font: c.Font, Width: subtop.Bounds().Dx(), Height: subtop.Bounds().Dy()},
+ &Card{Img: subbottom, Font: c.Font, Width: subbottom.Bounds().Dx(), Height: subbottom.Bounds().Dy()}
}
// SetMargin sets the margins for the card
@@ -244,9 +254,14 @@ func (c *Card) fetchExternalImage(url string) (image.Image, bool) {
},
}
+ // Go expects a absolute URL, so we must change a relative to an absolute one
+ if !strings.Contains(url, "://") {
+ url = fmt.Sprintf("%s%s", setting.AppURL, strings.TrimPrefix(url, "/"))
+ }
+
resp, err := client.Get(url)
if err != nil {
- log.Warn("error when fetching external image from %s: %w", url, err)
+ log.Warn("error when fetching external image from %s: %v", url, err)
return nil, false
}
defer resp.Body.Close()
@@ -321,3 +336,8 @@ func (c *Card) DrawExternalImage(url string) {
}
c.DrawImage(image)
}
+
+// DrawRect draws a rect with the given color
+func (c *Card) DrawRect(startX, startY, endX, endY int, color color.Color) {
+ draw.Draw(c.Img, image.Rect(startX, startY, endX, endY), &image.Uniform{color}, image.Point{}, draw.Src)
+}
diff --git a/modules/git/blob.go b/modules/git/blob.go
index 2f02693428..bbfab7d005 100644
--- a/modules/git/blob.go
+++ b/modules/git/blob.go
@@ -126,6 +126,10 @@ func (b *blobReader) Close() error {
return nil
}
+func (b *Blob) Repo() *Repository {
+ return b.repo
+}
+
// Name returns name of the tree entry this blob object was created from (or empty string)
func (b *Blob) Name() string {
return b.name
diff --git a/modules/git/command.go b/modules/git/command.go
index a3d43aaec6..d3e6b7b8bc 100644
--- a/modules/git/command.go
+++ b/modules/git/command.go
@@ -457,12 +457,13 @@ func (c *Command) RunStdBytes(opts *RunOpts) (stdout, stderr []byte, runErr RunS
}
// AllowLFSFiltersArgs return globalCommandArgs with lfs filter, it should only be used for tests
+// It also re-enables git-credential(1), which is used to test git-annex's HTTP support
func AllowLFSFiltersArgs() TrustedCmdArgs {
// Now here we should explicitly allow lfs filters to run
filteredLFSGlobalArgs := make(TrustedCmdArgs, len(globalCommandArgs))
j := 0
for _, arg := range globalCommandArgs {
- if strings.Contains(string(arg), "lfs") {
+ if strings.Contains(string(arg), "lfs") || strings.Contains(string(arg), "credential") {
j--
} else {
filteredLFSGlobalArgs[j] = arg
diff --git a/modules/markup/external/external.go b/modules/markup/external/external.go
index 122517ed11..b9760772a1 100644
--- a/modules/markup/external/external.go
+++ b/modules/markup/external/external.go
@@ -12,6 +12,7 @@ import (
"runtime"
"strings"
+ "code.gitea.io/gitea/modules/annex"
"code.gitea.io/gitea/modules/graceful"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/markup"
@@ -86,8 +87,22 @@ func (p *Renderer) Render(ctx *markup.RenderContext, input io.Reader, output io.
commands = strings.Fields(command)
args = commands[1:]
)
-
- if p.IsInputFile {
+ isAnnexed, _ := annex.IsAnnexed(ctx.Blob)
+ // if a renderer wants to read a file, and we have annexed content, we can
+ // provide the annex key file location directly to the renderer. git-annex
+ // takes care of having that location be read-only, so no critical
+ // protection layer is needed. Moreover, the file readily exists, and
+ // expensive temporary files can be avoided, also allowing an operator
+ // to raise MAX_DISPLAY_FILE_SIZE without much negative impact.
+ if p.IsInputFile && isAnnexed {
+ // look for annexed content, will be empty, if there is none
+ annexContentLocation, _ := annex.ContentLocation(ctx.Blob)
+ // we call the renderer, even if there is no annex content present.
+ // showing the pointer file content is not much use, and a topical
+ // renderer might be able to produce something useful from the
+ // filename alone (present in ENV)
+ args = append(args, annexContentLocation)
+ } else if p.IsInputFile {
// write to temp file
f, err := os.CreateTemp("", "gitea_input")
if err != nil {
@@ -130,6 +145,12 @@ func (p *Renderer) Render(ctx *markup.RenderContext, input io.Reader, output io.
os.Environ(),
"GITEA_PREFIX_SRC="+ctx.Links.SrcLink(),
"GITEA_PREFIX_RAW="+ctx.Links.RawLink(),
+ // also communicate the relative path of the to-be-rendered item.
+ // this enables the renderer to make use of the original file name
+ // and path, e.g., to make rendering or dtype-detection decisions
+ // that go beyond the originally matched extension. Even if the
+ // content is directly streamed to STDIN
+ "GITEA_RELATIVE_PATH="+ctx.RelativePath,
)
if !p.IsInputFile {
cmd.Stdin = input
diff --git a/modules/markup/orgmode/orgmode_test.go b/modules/markup/orgmode/orgmode_test.go
index f41d86a8a8..58fede7eb8 100644
--- a/modules/markup/orgmode/orgmode_test.go
+++ b/modules/markup/orgmode/orgmode_test.go
@@ -152,8 +152,8 @@ func HelloWorld() {
}
#+end_src
`, `
-
// HelloWorld prints "Hello World"
-funcHelloWorld(){
+
// HelloWorld prints "Hello World"
+funcHelloWorld(){fmt.Println("Hello World")}
`)
diff --git a/modules/markup/renderer.go b/modules/markup/renderer.go
index 2137302f43..c00bd2b56e 100644
--- a/modules/markup/renderer.go
+++ b/modules/markup/renderer.go
@@ -67,14 +67,18 @@ type Header struct {
// RenderContext represents a render context
type RenderContext struct {
- Ctx context.Context
- RelativePath string // relative path from tree root of the branch
- Type string
- IsWiki bool
- Links Links
- Metas map[string]string
- DefaultLink string
- GitRepo *git.Repository
+ Ctx context.Context
+ RelativePath string // relative path from tree root of the branch
+ Type string
+ IsWiki bool
+ Links Links
+ Metas map[string]string
+ DefaultLink string
+ GitRepo *git.Repository
+ // reporting the target blob that is to-be-rendered enables
+ // deeper inspection in the handler for external renderer
+ // (i.e., more targeted handling of annexed files)
+ Blob *git.Blob
ShaExistCache map[string]bool
cancelFn func()
SidebarTocNode ast.Node
diff --git a/modules/private/serv.go b/modules/private/serv.go
index 480a446954..6c7c753cf0 100644
--- a/modules/private/serv.go
+++ b/modules/private/serv.go
@@ -40,6 +40,7 @@ type ServCommandResults struct {
UserName string
UserEmail string
UserID int64
+ UserMode perm.AccessMode
OwnerName string
RepoName string
RepoID int64
diff --git a/modules/references/references.go b/modules/references/references.go
index c61d06d5dc..3b4bcb3706 100644
--- a/modules/references/references.go
+++ b/modules/references/references.go
@@ -32,7 +32,7 @@ var (
// issueNumericPattern matches string that references to a numeric issue, e.g. #1287
issueNumericPattern = regexp.MustCompile(`(?:\s|^|\(|\[|\'|\")([#!][0-9]+)(?:\s|$|\)|\]|\'|\"|[:;,.?!]\s|[:;,.?!]$)`)
// issueAlphanumericPattern matches string that references to an alphanumeric issue, e.g. ABC-1234
- issueAlphanumericPattern = regexp.MustCompile(`(?:\s|^|\(|\[|\"|\')([A-Z]{1,10}-[1-9][0-9]*)(?:\s|$|\)|\]|:|\.(\s|$)|\"|\')`)
+ issueAlphanumericPattern = regexp.MustCompile(`(?:\s|^|\(|\[|\"|\')([A-Z]{1,10}-[1-9][0-9]*)(?:\s|$|\)|\]|:|\.(\s|$)|\"|\'|,)`)
// crossReferenceIssueNumericPattern matches string that references a numeric issue in a different repository
// e.g. org/repo#12345
crossReferenceIssueNumericPattern = regexp.MustCompile(`(?:\s|^|\(|\[)([0-9a-zA-Z-_\.]+/[0-9a-zA-Z-_\.]+[#!][0-9]+)(?:\s|$|\)|\]|[:;,.?!]\s|[:;,.?!]$)`)
diff --git a/modules/references/references_test.go b/modules/references/references_test.go
index ffa7f993e3..d5f7c4b4c5 100644
--- a/modules/references/references_test.go
+++ b/modules/references/references_test.go
@@ -466,6 +466,7 @@ func TestRegExp_issueAlphanumericPattern(t *testing.T) {
"ABC-123:",
"\"ABC-123\"",
"'ABC-123'",
+ "ABC-123, unknown PR",
}
falseTestCases := []string{
"RC-08",
diff --git a/modules/setting/annex.go b/modules/setting/annex.go
new file mode 100644
index 0000000000..35e9e55c0e
--- /dev/null
+++ b/modules/setting/annex.go
@@ -0,0 +1,25 @@
+// Copyright 2023 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package setting
+
+import (
+ "code.gitea.io/gitea/modules/log"
+)
+
+// Annex represents the configuration for git-annex
+var Annex = struct {
+ Enabled bool `ini:"ENABLED"`
+ DisableP2PHTTP bool `ini:"DISABLE_P2PHTTP"`
+}{}
+
+func loadAnnexFrom(rootCfg ConfigProvider) {
+ sec := rootCfg.Section("annex")
+ if err := sec.MapTo(&Annex); err != nil {
+ log.Fatal("Failed to map Annex settings: %v", err)
+ }
+ if !sec.HasKey("DISABLE_P2PHTTP") {
+ // If DisableP2PHTTP is not explicitly set then use DisableHTTPGit as its default
+ Annex.DisableP2PHTTP = Repository.DisableHTTPGit
+ }
+}
diff --git a/modules/setting/setting.go b/modules/setting/setting.go
index c9d30836ac..9710fb23d8 100644
--- a/modules/setting/setting.go
+++ b/modules/setting/setting.go
@@ -153,6 +153,7 @@ func loadCommonSettingsFrom(cfg ConfigProvider) error {
loadCamoFrom(cfg)
loadI18nFrom(cfg)
loadGitFrom(cfg)
+ loadAnnexFrom(cfg)
loadMirrorFrom(cfg)
loadMarkupFrom(cfg)
loadQuotaFrom(cfg)
diff --git a/modules/templates/helper.go b/modules/templates/helper.go
index 55de85646c..023ba60fa9 100644
--- a/modules/templates/helper.go
+++ b/modules/templates/helper.go
@@ -103,6 +103,10 @@ func NewFuncMap() template.FuncMap {
"AppVer": func() string {
return setting.AppVer
},
+ "AppVerNoMetadata": func() string {
+ version, _, _ := strings.Cut(setting.AppVer, "+")
+ return version
+ },
"AppDomain": func() string { // documented in mail-templates.md
return setting.Domain
},
diff --git a/modules/util/remove.go b/modules/util/remove.go
index d1e38faf5f..39556e5e0b 100644
--- a/modules/util/remove.go
+++ b/modules/util/remove.go
@@ -4,7 +4,9 @@
package util
import (
+ "io/fs"
"os"
+ "path/filepath"
"runtime"
"syscall"
"time"
@@ -41,10 +43,48 @@ func Remove(name string) error {
return err
}
-// RemoveAll removes the named file or (empty) directory with at most 5 attempts.
+// MakeWritable recursively makes the named directory writable.
+func MakeWritable(name string) error {
+ return filepath.WalkDir(name, func(path string, d fs.DirEntry, err error) error {
+ // NB: this is called WalkDir but it works on a single file too
+ if err == nil {
+ info, err := d.Info()
+ if err != nil {
+ return err
+ }
+
+ // Don't try chmod'ing symlinks (will fail with broken symlinks)
+ if info.Mode()&os.ModeSymlink != os.ModeSymlink {
+ // 0200 == u+w, in octal unix permission notation
+ err = os.Chmod(path, info.Mode()|0o200)
+ if err != nil {
+ return err
+ }
+ }
+ }
+ return nil
+ })
+}
+
+// RemoveAll removes the named file or directory with at most 5 attempts.
func RemoveAll(name string) error {
var err error
+
for i := 0; i < 5; i++ {
+ // Do chmod -R +w to help ensure the removal succeeds.
+ // In particular, in the git-annex case, this handles
+ // https://git-annex.branchable.com/internals/lockdown/ :
+ //
+ // > (The only bad consequence of this is that rm -rf .git
+ // > doesn't work unless you first run chmod -R +w .git)
+
+ err = MakeWritable(name)
+ if err != nil {
+ // try again
+ <-time.After(100 * time.Millisecond)
+ continue
+ }
+
err = os.RemoveAll(name)
if err == nil {
break
diff --git a/options/locale/locale_bg.ini b/options/locale/locale_bg.ini
index 924ce710e0..133ffd248e 100644
--- a/options/locale/locale_bg.ini
+++ b/options/locale/locale_bg.ini
@@ -111,6 +111,7 @@ new_migrate.link = Нова миграция
new_org.link = Нова организация
copy_generic = Копиране в клипборда
copy_error = Неуспешно копиране
+copy_path = Копиране на пътя
[settings]
ui = Тема
@@ -159,7 +160,7 @@ comment_type_group_milestone = Етап
manage_emails = Управление на адресите на ел. поща
permission_read = Четене
update_password = Обновяване на паролата
-biography_placeholder = Разкажете ни малко за себе си! (Можете да използвате Markdown)
+biography_placeholder = Разкажете на другите малко за себе си! (Можете да използвате Маркдаун)
orgs = Организации
continue = Продължаване
blocked_users = Блокирани потребители
@@ -224,7 +225,7 @@ key_signature_gpg_placeholder = Започва с „-----BEGIN PGP SIGNATURE---
key_signature_ssh_placeholder = Започва с „-----BEGIN SSH SIGNATURE-----“
saved_successfully = Настройките бяха запазени успешно.
no_activity = Няма скорошна дейност
-theme_desc = Това ще бъде вашата тема по подразбиране в целия сайт.
+theme_desc = Тази тема ще се използва за уеб интерфейса, когато сте влезли.
keep_activity_private = Скриване на дейността от профилната страница
lookup_avatar_by_mail = Търсене на профилна снимка по адреса на ел. поща
password_incorrect = Текущата парола е неправилна.
@@ -235,7 +236,7 @@ twofa_disabled = Двуфакторното удостоверяване е из
orgs_none = Не сте участник в никакви организации.
repos_none = Не притежавате никакви хранилища.
blocked_users_none = Няма блокирани потребители.
-profile_desc = Контролирайте как вашият профил се показва на другите потребители. Вашият основен адрес на ел. поща ще се използва за известия, възстановяване на паролата и уеб базирани Git операции.
+profile_desc = Вашият профил
permission_write = Четене и писане
twofa_disable = Изключване на двуфакторното удостоверяване
twofa_enroll = Включване на двуфакторно удостоверяване
@@ -252,6 +253,9 @@ gpg_token_code = echo "%s" | gpg -a --default-key %s --detach-sig
language.title = Език по подразбиране
language.localization_project = Помогнете ни да преведем Forgejo на вашия език! Научете повече.
language.description = Този език ще бъде запазен във вашия акаунт и ще се използва като език по подразбиране, след като влезете.
+pronouns_custom = Персонализирани
+visibility.limited_tooltip = Видимо само за влезли потребители
+pronouns_custom_label = Персонализирани местоимения
[packages]
container.labels.value = Стойност
@@ -280,6 +284,9 @@ dependencies = Зависимости
published_by_in = Публикуван %[1]s от %[3]s в %[5]s
published_by = Публикуван %[1]s от %[3]s
generic.download = Изтеглете пакета от командния ред:
+container.details.type = Тип образ
+alpine.repository = За хранилището
+container.images.title = Образи
[tool]
hours = %d часа
@@ -397,7 +404,7 @@ issues.keyword_search_unavailable = В момента търсенето по к
repo_desc_helper = Въведете кратко описание (опционално)
mirror_address = Клониране от URL
owner_helper = Някои организации може да не се показват в падащото меню поради ограничение за максимален брой хранилища.
-new_repo_helper = Хранилището съдържа всички файлове на проекта, включително хронологията на ревизиите. Вече хоствате хранилище другаде? Мигрирайте хранилище.
+new_repo_helper = Хранилището съдържа всички файлове на проекта, включително хронологията на ревизиите. Вече хоствате хранилище другаде? Мигрирайте хранилище.
repo_name_helper = Добрите имена на хранилища използват кратки, запомнящи се и уникални ключови думи.
migrated_from = Мигрирано от %[2]s
visibility_description = Само притежателят или участниците в организацията, ако имат права, ще могат да го видят.
@@ -424,14 +431,14 @@ settings.add_webhook = Добавяне на уеб-кука
template.webhooks = Уеб-куки
issues.label_templates.info = Все още няма етикети. Създайте етикет с „Нов етикет“ или използвайте предварително зададен набор от етикети:
labels = Етикети
-license_helper_desc = Лицензът определя какво могат и какво не могат да правят другите с вашия код. Не сте сигурни кой е подходящ за вашия проект? Вижте Избиране на лиценз.
+license_helper_desc = Лицензът определя какво могат и какво не могат да правят другите с вашия код. Не сте сигурни кой е подходящ за вашия проект? Вижте Избиране на лиценз.
issues.choose.blank = По подразбиране
settings.hooks = Уеб-куки
issue_labels = Етикети
issue_labels_helper = Изберете набор от етикети
readme_helper_desc = Това е мястото, където можете да напишете пълно описание на вашия проект.
repo_gitignore_helper = Изберете .gitignore шаблони
-auto_init = Да се инициализира хранилище (Добавя .gitignore, License и README)
+auto_init = Да се инициализира хранилище
template.issue_labels = Етикети за задачите
migrate_items_labels = Етикети
issues.label_templates.title = Зареждане на предв. зададен набор от етикети
@@ -815,7 +822,7 @@ diff.browse_source = Разглеждане на изходния код
file_view_rendered = Преглед на визуализация
issues.lock_with_reason = заключи като %s и ограничи обсъждането до сътрудници %s
milestones.new_subheader = Етапите ви помагат да управлявате задачите и да проследявате напредъка им.
-release.edit = редактиране
+release.edit = Редактиране
activity.published_release_label = Издание
activity.navbar.contributors = Допринесли
pulls.recently_pushed_new_branches = Изтласкахте в клона %[1]s %[2]s
@@ -939,7 +946,7 @@ pulls.approve_count_1 = %d одобрение
pulls.can_auto_merge_desc = Тази заявка за сливане може да бъде слята автоматично.
pulls.num_conflicting_files_1 = %d конфликтен файл
activity.git_stats_commit_n = %d подавания
-settings.event_issues = Модификация
+settings.event_issues = Изменение
branch.delete_head = Изтриване
branch.delete = Изтриване на клона „%s“
branch.delete_html = Изтриване на клона
@@ -1113,7 +1120,7 @@ pulls.reject_count_1 = %d поискана промяна
issues.review.show_resolved = Показване на решено
issues.review.hide_resolved = Скриване на решено
issues.review.resolve_conversation = Решаване на обсъждането
-diff.comment.markdown_info = Поддържа се стилизиране с markdown.
+diff.comment.markdown_info = Поддържа се стилизиране с Маркдаун.
diff.file_suppressed = Разликите не са показани, защото са твърде много
pulls.reject_count_n = %d поискани промени
settings.pulls.default_allow_edits_from_maintainers = Позволяване на редакции от поддържащите по подразбиране
@@ -1195,6 +1202,95 @@ issues.all_title = Общо
issues.new.assign_to_me = Възлагане на мен
ext_wiki = Външно уики
ext_issues = Външни задачи
+readme_helper = Изберете шаблон за файл README
+settings.event_pull_request_review_desc = Заявка за сливане е одобрена, отхвърлена или са добавени рецензионни коментари.
+settings.event_pull_request_review = Рецензии
+issues.filter_sort.relevance = Съответствие
+settings.confirm_wiki_branch_rename = Преименуване на клона на уикито
+settings.webhook.request = Заявка
+settings.webhook.response = Отговор
+settings.event_create = Създаване
+settings.event_push_only = Събития при изтласкване
+settings.event_delete = Изтриване
+settings.event_header_repository = Събития за хранилището
+settings.event_fork_desc = Хранилище е разклонено.
+settings.event_fork = Разклоняване
+settings.event_wiki_desc = Уики страница е създадена, преименувана, редактирана или изтрита.
+settings.event_issue_milestone = Етапи
+settings.event_pull_request_milestone_desc = Етап е добавен, премахнат или изменен.
+settings.event_pull_request_label_desc = Етикети на заявка за сливане са добавени или премахнати.
+settings.event_pull_request_merge = Сливане на заявка за сливане
+settings.archive.tagsettings_unavailable = Настройките за маркери не са налични в архивирани хранилища.
+settings.event_desc = Задействане при:
+settings.event_create_desc = Клон или маркер е създаден.
+generate_from = Генериране от
+settings.event_push_desc = Git изтласкване към хранилище.
+settings.event_package = Пакет
+settings.event_pull_request_label = Етикети
+settings.event_pull_request_assign_desc = Заявка за сливане е възложена или отвъзложена.
+settings.event_choose = Персонализирани събития…
+settings.event_header_issue = Събития при задачи
+fork_no_valid_owners = Това хранилище не може да бъде разклонено, защото няма валидни притежатели.
+settings.unarchive.text = Разархивирането на хранилище ще възстанови способността му да получава подавания и изтласквания, както и нови задачи и заявки за сливане.
+settings.archive.branchsettings_unavailable = Настройките за клонове не са налични в архивирани хранилища.
+settings.event_send_everything = Всички събития
+settings.event_pull_request_approvals = Одобрения на заявка за сливане
+release.invalid_external_url = Невалиден външен URL адрес: "%s"
+settings.event_delete_desc = Клон или маркер е изтрит.
+settings.discord_icon_url = URL адрес на иконка
+settings.discord_icon_url.exceeds_max_length = URL адресът на иконката трябва да е по-малък или равен на 2048 знака
+settings.event_push = Изтласкване
+settings.event_repository_desc = Хранилище е създадено или изтрито.
+settings.slack_icon_url = URL адрес на иконка
+settings.event_issue_comment = Коментари
+settings.event_pull_request_desc = Заявка за сливане е отворена, затворена, отворена наново или редактирана.
+settings.event_issue_comment_desc = Коментар на задача е създаден, редактиран или изтрит.
+settings.event_release_desc = Издание е публикувано, обновено или изтрито в хранилище.
+settings.event_pull_request_review_request = Искания за рецензия
+settings.event_pull_request_enforcement = Принудително изпълнение
+diff.git-notes.remove-header = Премахване на бележката
+diff.git-notes.add = Добавяне на бележка
+settings.event_pull_request_assign = Възлагане
+new_advanced_expand = Щракнете за разгъване
+new_advanced = Разширени настройки
+new_from_template = Използване на шаблон
+new_from_template_description = Можете да изберете съществуващо шаблонно хранилище в тази инстанция и да приложите неговите настройки.
+settings.event_pull_request_comment = Коментари
+repo_gitignore_helper_desc = Изберете кои файлове да не се проследяват от списък с шаблони за обичайните езици. Типичните артефакти, генерирани от инструментите за изграждане, са включени в .gitignore по подразбиране.
+object_format_helper = Формат на обектите на хранилището. Не може да се променя по-късно. SHA1 е най-съвместим.
+issues.num_reviews_one = %d рецензия
+settings.event_pull_request = Изменение
+settings.event_issue_label = Етикети
+settings.event_issue_assign = Възлагане
+settings.event_header_pull_request = Събития при заявка за сливане
+settings.event_issue_milestone_desc = Етап е добавен, премахнат или изменен.
+settings.event_issue_label_desc = Етикети на задача са добавени или премахнати.
+settings.event_issues_desc = Задача е отворена, затворена, отворена наново или редактирана.
+settings.webhook.headers = Заглавки
+settings.webhook.body = Тяло
+settings.event_pull_request_sync = Синхронизирано
+settings.event_pull_request_sync_desc = Клонът е обновен автоматично с целевия клон.
+settings.event_package_desc = Пакет е създаден или изтрит в хранилище.
+template_description = Шаблонните хранилища позволяват на потребителите да генерират нови хранилища със същата структура на директориите, файлове и опционални настройки.
+auto_init_description = Поставете началото на Git историята с README и по избор добавете файлове License и .gitignore.
+pulls.sign_in_require = Влезте, за да създадете нова заявка за сливане.
+issues.num_reviews_few = %d рецензии
+diff.git-notes.remove-body = Тази бележка ще бъде премахната.
+issues.review.add_remove_review_requests = поиска рецензии от %[1]s и премахна заявки за рецензия за %[2]s %[3]s
+form.name_pattern_not_allowed = Шаблонът "%s" не е разрешен в име на хранилище.
+settings.wiki_rename_branch_main_notices_2 = Това ще преименува перманентно вътрешния клон на уикито на хранилището %s. Съществуващите изтегляния ще трябва да бъдат обновени.
+settings.event_pull_request_milestone = Етапи
+settings.event_pull_request_comment_desc = Заявка за сливане е създадена, редактирана или изтрита.
+settings.event_issue_assign_desc = Задача е възложена или отвъзложена.
+settings.event_pull_request_review_request_desc = Рецензия на заявка за сливане е поискана или е премахната.
+generate_repo = Генериране на хранилище
+default_branch_helper = Стандартният клон е основния клон за заявки за сливане и подавания на код.
+
+issues.reaction.add = Добавяне на реакция
+issues.reaction.alt_few = %[1]s реагира с %[2]s.
+issues.reaction.alt_many = %[1]s и още %[2]d реагираха с %[3]s.
+issues.reaction.alt_remove = Премахване на реакция %[1]s от коментара.
+issues.reaction.alt_add = Добавяне на реакция %[1]s към коментара.
[modal]
confirm = Потвърждаване
@@ -1218,6 +1314,12 @@ buttons.italic.tooltip = Добавяне на курсив текст
buttons.link.tooltip = Добавяне на връзка
buttons.disable_monospace_font = Изключване на равноширокия шрифт
buttons.ref.tooltip = Препратка към задача или заявка за сливане
+table_modal.label.columns = Колони
+table_modal.label.rows = Редове
+table_modal.placeholder.content = Съдържание
+table_modal.placeholder.header = Заглавка
+buttons.new_table.tooltip = Добавяне на таблица
+table_modal.header = Добавяне на таблица
[org]
teams.write_access = Писане
@@ -1249,7 +1351,7 @@ settings.visibility.public = Публична
settings.visibility.limited_shortname = Ограничена
settings.visibility.private_shortname = Частна
settings.permission = Разрешения
-settings.visibility.limited = Ограничена (видима само за удостоверени потребители)
+settings.visibility.limited = Ограничена (видима само за влезли потребители)
settings.visibility.private = Частна (видима само за участниците в организацията)
org_name_helper = Имената на организациите е добре да са кратки и запомнящи се.
org_full_name_holder = Пълно име на организацията
@@ -1330,6 +1432,9 @@ err_empty_admin_email = Администраторският адрес на е
password_algorithm = Алгоритъм за хеш. на паролите
default_keep_email_private = Скриване на адресите на ел. поща по подразбиране
invalid_password_algorithm = Невалиден алгоритъм за хеш. на паролите
+err_admin_name_is_reserved = Потребителското име на администратора е невалидно, потребителското име е резервирано
+err_admin_name_pattern_not_allowed = Потребителското име на администратора е невалидно, потребителското име съответства с резервиран шаблон
+err_admin_name_is_invalid = Потребителското име на администратора е невалидно
[filter]
string.asc = А - Я
@@ -1361,6 +1466,14 @@ activate_account.text_1 = Здравейте, %[1]s, благодарим
activate_email.text = Моля, щракнете върху следната връзка, за да потвърдите своя адрес на ел. поща в рамките на %s:
activate_email = Потвърдете своя адрес на ел. поща
activate_account.text_2 = Моля, щракнете върху следната връзка, за да активирате своя акаунт в рамките на %s:
+issue_assigned.issue = @%[1]s ви възложи задача %[2]s в хранилище %[3]s.
+issue.action.push_n = @%[1]s изтласка %[3]d подавания към %[2]s
+issue.action.push_1 = @%[1]s изтласка %[3]d подаване към %[2]s
+repo.transfer.subject_to_you = %s иска да прехвърли хранилище "%s" към вас
+issue.action.merge = @%[1]s сля #%[2]d в %[3]s.
+issue_assigned.pull = @%[1]s ви възложи заявката за сливане %[2]s в хранилище %[3]s.
+issue.action.ready_for_review = @%[1]s отбеляза тази заявка за сливане като готова за рецензиране.
+repo.transfer.subject_to = %s иска да прехвърли хранилище "%s" към %s
[user]
joined_on = Присъединени на %s
@@ -1392,6 +1505,9 @@ followers.title.one = Последовател
following.title.one = Следван
following.title.few = Следвани
public_activity.visibility_hint.self_public = Вашата дейност е видима за всички, с изключение на взаимодействията в частни пространства. Конфигуриране.
+form.name_pattern_not_allowed = Шаблонът "%s" не е разрешен в потребителско име.
+form.name_reserved = Потребителското име "%s" е резервирано.
+public_activity.visibility_hint.self_private_profile = Вашата дейност е видима само за вас и администраторите на инстанцията, тъй като вашият профил е частен. Конфигуриране.
[home]
filter = Други филтри
@@ -1661,6 +1777,7 @@ variables.creation = Добавяне на променлива
variables.deletion.failed = Неуспешно премахване на променлива.
runners.task_list.repository = Хранилище
runners.description = Описание
+runs.no_workflows.help_no_write_access = За да научите повече за Forgejo Actions, вижте документацията.
[heatmap]
less = По-малко
diff --git a/options/locale/locale_ca.ini b/options/locale/locale_ca.ini
index ec8ae32668..dda88b1b46 100644
--- a/options/locale/locale_ca.ini
+++ b/options/locale/locale_ca.ini
@@ -1,10 +1,10 @@
[common]
-home = inici
+home = Inici
dashboard = Panell de control
explore = Explorar
help = Ajuda
logo = Logo
-sign_in = Entrar
+sign_in = Iniciar sessió
sign_in_with_provider = Entra amb %s
sign_in_or = o
sign_out = Sortir
@@ -15,7 +15,7 @@ page = Pàgina
template = Plantilla
language = Idioma
notifications = Notificacions
-active_stopwatch = Registre de Temps Actiu
+active_stopwatch = Registre de temps actiu
create_new = Crear…
user_profile_and_more = Perfil i Configuració…
signed_in_as = Entrat com
@@ -140,6 +140,14 @@ filter.not_archived = No arxivats
filter.not_fork = No és fork
filter.is_fork = Són forks
+new_repo.title = Nou repositori
+new_migrate.title = Nova migració
+new_org.title = Nova organització
+new_repo.link = Nou repositori
+new_migrate.link = Nova migració
+new_org.link = Nova organització
+copy_path = Copiar ruta
+
[search]
milestone_kind = Cerca fites...
fuzzy = Difusa
@@ -167,6 +175,9 @@ exact = Exacte
exact_tooltip = Inclou només resultats que són exactament el terme de cerca
issue_kind = Cerca problemes...
+regexp = Expressió regular
+regexp_tooltip = Interpreta el terme de cerca com una expressió regular
+
[heatmap]
number_of_contributions_in_the_last_12_months = %s contribucions en els últims 12 mesos
contributions_zero = Cap contribució
@@ -337,6 +348,72 @@ manual_activation_only = Contacti amb l'administrador de lloc per a completar l'
remember_me = Recordar aquest dispositiu
create_new_account = Registrar compte
+forgot_password_title = Contrasenya oblidada
+forgot_password = Contrasenya oblidada?
+hint_login = Ja tens compte? Entra ara!
+hint_register = Necessites un compte? Registra't ara.
+sign_up_button = Registra't ara.
+sign_up_successful = S'ha creat el compte correctament. Benvingut!
+confirmation_mail_sent_prompt = S'ha enviat un correu electrònic de confirmació a %s. Per tal de completar el registre, reviseu la safata d'entrada i seguiu l'enllaç que se us ha enviat en els següents %s. Si l'adreça de correu és incorrecta, podreu accedir al compte i demanar d'enviar un altre correu de confirmació a una altra adreça.
+must_change_password = Actualitza la contrasenya
+allow_password_change = Requereix a l'usuari canviar la contrasenya (recomanat)
+reset_password_mail_sent_prompt = S'ha enviat un correu electrònic de confirmació a %s. Per tal de completar el procés de recuperació del compte, reviseu la safata d'entrada i seguiu l'enllaç que se us ha enviat en els següents %s.
+active_your_account = Activeu el compte
+account_activated = El compte s'ha activat
+prohibit_login = El compte està en suspensió
+prohibit_login_desc = S'ha suspès la interacció del vostre compte amb la instància. Contacteu amb l'administrador per a recuperar-ne l'accés.
+resent_limit_prompt = Fa poc que heu sol·licitat un correu electrònic d'activació. Si us plau, espereu 3 minuts i torneu a intentar-ho.
+has_unconfirmed_mail = Hola %s, la vostra adreça de correu no s'ha confirmat (%s). Si no heu rebut un correu de confirmació o necessiteu que l'enviem de nou, feu clic al botó següent.
+change_unconfirmed_email_summary = Canvieu l'adreça de correu on s'envia el correu d'activació.
+change_unconfirmed_email = Si heu proporcionat una direcció de correu incorrecta durant el registre, la podeu canviar aquí baix i se us enviarà una confirmació a l'adreça nova.
+change_unconfirmed_email_error = No s'ha pogut canviar l'adreça de correu: %v
+resend_mail = Feu clic aquí per tornar a enviar el correu electrònic d'activació
+send_reset_mail = Enviar correu electrònic de recuperació del compte
+reset_password = Recuperació del compte
+invalid_code = El codi de confirmació no és vàlid o ha caducat.
+invalid_code_forgot_password = El codi de confirmació és invàlid o ha caducat. Feu click aquí per a iniciar una sessió nova.
+invalid_password = La contrasenya no coincideix amb la que es va utilitzar per a crear el compte.
+reset_password_helper = Recuperar compte
+reset_password_wrong_user = Heu iniciat sessió com a %s, però l'enllaç de recuperació pertany a %s
+password_too_short = La longitud de la contrasenya no pot ser inferior a %d caràcters.
+non_local_account = Els usuaris no locals no poden actualitzar la seva contrasenya mitjançant l'interfície web de Forgejo
+verify = Verificar
+unauthorized_credentials = Les credencials són incorrectes o han caducat. Torneu a executar l'ordre o visiteu %s per a més informació
+scratch_code = Codi de recuperació
+use_scratch_code = Utilitzar un codi de recuperació
+use_onetime_code = Utilitzar un codi d'un sol ús
+twofa_scratch_used = Ja heu utilitzat el vostre codi de recuperació. Se us ha redirigit a la pàgina de configuració de l'autenticació de doble factor per tal d'eliminar el dispositiu o generar un codi de recuperació nou.
+twofa_passcode_incorrect = El codi d'accés és incorrecte. Si heu perdut el dispositiu, useu el codi de recuperació per a entrar.
+twofa_scratch_token_incorrect = El codi de recuperació és incorrecte.
+login_userpass = Entra
+oauth_signup_tab = Registrar compte nou
+oauth_signup_title = Completar compte nou
+oauth_signup_submit = Completar compte
+oauth_signin_tab = Vincular a un compte existent
+oauth_signin_title = Entreu per a autoritzar el compte vinculat
+oauth_signin_submit = Vincular compte
+oauth.signin.error = Hi ha hagut un error processant la sol·licitud d'autorització. Si persisteix, poseu-vos en contacte amb l'administrador del lloc.
+oauth.signin.error.access_denied = S'ha denegat la sol·licitud d'autorització.
+oauth.signin.error.temporarily_unavailable = Ha fallat l'autorització perquè el servidor d'autenticació no està disponible temporalment. Intenteu-ho de nou més tard.
+openid_connect_submit = Connectar
+openid_connect_title = Entreu a un compte existent
+openid_register_title = Crear un compte nou
+openid_signin_desc = Introduïu la URI OpenID. Per exemple: alice.openid.example.org o https://openid.example.org/alice.
+disable_forgot_password_mail = La recuperació de comptes està deshabilitada perquè no hi ha configuració de correu electrònic. Si us plau, contacteu amb l'administrador del lloc.
+disable_forgot_password_mail_admin = La recuperació de comptes només està disponible quan s'ha configurat el correu electrònic. Si us plau, configureu el correu electrònic per a habilitar la recuperació de comptes.
+email_domain_blacklisted = No podeu registrar-vos amb el correu electrònic.
+authorize_application = Autoritzar aplicació
+authorize_redirect_notice = Sereu redirigits a %s si autoritzeu aquesta aplicació.
+authorize_application_created_by = Aquesta aplicació l'ha creat %s.
+authorize_application_description = Si li concediu l'accés podrà accedir i escriure a tota la informació del vostre compte, inclòs repositoris privats i organitzacions.
+authorize_title = Autoritzeu "%s" a accedir al vostre compte?
+authorization_failed = Ha fallat l'autorització
+authorization_failed_desc = Ha fallat l'autorització perquè s'ha detectat una sol·licitud invàlida. Si us plau, contacteu amb el responsable de l'aplicació que heu intentat autoritzar.
+password_pwned = La contrasenya que heu introduït es troba en una llista de contrasenyes robades exposades en dades filtrades públicament. Si us plau, intenteu-ho de nou amb una contrasenya diferent i considereu modificar aquesta contrasenya a tot arreu on la utilitzeu.
+password_pwned_err = No s'ha pogut completar la sol·licitud a HaveIBeenPwned
+last_admin = No podeu eliminar l'últim usuari administrador. Com a mínim n'hi ha d'haver un.
+back_to_sign_in = Torneu a entrar
+
[editor]
buttons.indent.tooltip = Aniua els elements un nivell
buttons.unindent.tooltip = Desaniuna els elements un nivell
@@ -355,6 +432,13 @@ buttons.list.ordered.tooltip = Afegir una llista enumerada
buttons.list.task.tooltip = Afegir una llista de tasques
buttons.mention.tooltip = Mencionar un usuari o equip
+buttons.new_table.tooltip = Afegir taula
+table_modal.header = Afegir taula
+table_modal.placeholder.header = Capçalera
+table_modal.placeholder.content = Contingut
+table_modal.label.rows = Files
+table_modal.label.columns = Columnes
+
[home]
my_orgs = Organitzacions
show_more_repos = Mostra més repositoris…
@@ -381,4 +465,15 @@ filter = Altres filtres
footer.software = Sobre aquest software
footer.links = Enllaços
navbar = Barra de navegació
-footer = Peu de pàgina
\ No newline at end of file
+footer = Peu de pàgina
+
+[mail]
+view_it_on = Veure a %s
+reply = o responeu directament a aquest correu
+link_not_working_do_paste = No funciona l'enllaç? Proveu a copiar-lo i enganxar-lo al navegador web.
+hi_user_x = Hola %s,
+activate_account = Si us plau, activeu el compte
+activate_account.text_1 = Hola %[1]s, gràcies per registrar-te a %[2]s!
+admin.new_user.user_info = Informació d'usuari
+admin.new_user.text = Si us plau, cliqueu aui per administrar aquest usuari des del panell d'administració.
+register_notify = Benvinguts a %s
\ No newline at end of file
diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini
index bd983164b2..e050e0db12 100644
--- a/options/locale/locale_cs-CZ.ini
+++ b/options/locale/locale_cs-CZ.ini
@@ -747,7 +747,7 @@ webauthn=Dvoufázové ověření (bezpečnostní klíče)
public_profile=Veřejný profil
biography_placeholder=Řekněte ostatním něco o sobě! (Je podporován Markdown)
location_placeholder=Sdílejte svou přibližnou polohu s ostatními
-profile_desc=Nastavte, jak bude váš profil zobrazen ostatním uživatelům. Vaše hlavní e-mailová adresa bude použita pro oznámení, obnovení hesla a operace Git.
+profile_desc=O vás
password_username_disabled=Externí uživatelé nemohou měnit svoje uživatelské jméno. Kontaktujte prosím svého administrátora pro více detailů.
full_name=Celé jméno
website=Web
@@ -838,7 +838,7 @@ add_email_success=Nová e-mailová adresa byla přidána.
email_preference_set_success=Nastavení e-mailu bylo úspěšně nastaveno.
add_openid_success=Nová OpenID adresa byla přidána.
keep_email_private=Skrýt e-mailovou adresu
-keep_email_private_popup=Tímto skryjete svou e-mailovou adresu ze svého profilu. Nebude již výchozí adresou pro commity provedené skrze webové rozhraní, jako nahrávání a úpravy souborů, a nebude použita pro slučovací commity. Místo toho můžete použít speciální adresu %s pro spojení commitů s vaším účtem. Změna této funkce nebude mít vliv na stávající commity.
+keep_email_private_popup=Vaše e-mailová adresa nebude zobrazena na vašem profilu a nebude výchozí adresou pro commity provedené skrze webové rozhraní, jako nahrávání, úpravy a sloučení. Namísto toho lze použít speciální adresu %s pro propojení commitů s vaším účtem. Tato možnost neovlivní existující commity.
openid_desc=OpenID vám umožní delegovat ověřování na externího poskytovatele.
manage_ssh_keys=Správa klíčů SSH
@@ -1010,7 +1010,7 @@ remove_account_link=Odstranit propojený účet
remove_account_link_desc=Odstraněním propojeného účtu zrušíte jeho přístup k vašemu Forgejo účtu. Pokračovat?
remove_account_link_success=Propojený účet byl odstraněn.
-hooks.desc=Přidat webhooky, které budou spouštěny pro všechny repozitáře vve vašem vlastnictví.
+hooks.desc=Přidejte webhooky, které budou spouštěny pro všechny repozitáře ve vašem vlastnictví.
orgs_none=Nejste členem žádné organizace.
repos_none=Nevlastníte žádné repozitáře.
@@ -1054,6 +1054,8 @@ language.title = Výchozí jazyk
keep_activity_private.description = Vaše veřejná aktivita bude viditelná pouze vám a správcům instance.
language.description = Tento jazyk bude uložen do vašeho účtu a po přihlášení bude použit jako výchozí.
language.localization_project = Pomozte nám s překladem Forgejo do vašeho jazyka! Více informací.
+user_block_yourself = Nemůžete zablokovat sami sebe.
+pronouns_custom_label = Vlastní zájmena
[repo]
new_repo_helper=Repozitář obsahuje všechny soubory projektu, včetně historie revizí. Už jej hostujete jinde? Migrovat repozitář.
@@ -1102,7 +1104,7 @@ object_format_helper = Objektový formát repozitáře. Později jej nelze změn
readme=README
readme_helper=Vyberte šablonu souboru README
readme_helper_desc=Do tohoto místa můžete zadat celý popis vašeho projektu.
-auto_init=Inicializovat repozitář (přidá soubory .gitignore, License a README)
+auto_init=Inicializovat repozitář
trust_model_helper=Vyberte model důvěry pro ověření podpisu. Možnosti jsou:
trust_model_helper_collaborator=Spolupracovník: Důvěřovat podpisům spolupracovníků
trust_model_helper_committer=Přispěvatel: Důvěřovat podpisům, které se shodují s přispěvateli
@@ -1313,6 +1315,7 @@ view_git_blame=Zobrazit git blame
video_not_supported_in_browser=Váš prohlížeč nepodporuje značku HTML5 „video“.
audio_not_supported_in_browser=Váš prohlížeč nepodporuje značku HTML5 „audio“.
stored_lfs=Uloženo pomocí Git LFS
+stored_annex=Uloženo pomocí Git Annex
symbolic_link=Symbolický odkaz
executable_file=Spustitelný soubor
vendored = Vendorováno
@@ -1338,6 +1341,7 @@ editor.upload_file=Nahrát soubor
editor.edit_file=Upravit soubor
editor.preview_changes=Náhled změn
editor.cannot_edit_lfs_files=LFS soubory nemohou být upravovány přes webové rozhraní.
+editor.cannot_edit_annex_files=Annex soubory nemohou být upravovány přes webové rozhraní.
editor.cannot_edit_non_text_files=Binární soubory nemohou být upravovány přes webové rozhraní.
editor.edit_this_file=Upravit soubor
editor.this_file_locked=Soubor je uzamčen
@@ -2395,7 +2399,7 @@ settings.deploy_key_deletion=Odstranit klíč pro nasazení
settings.deploy_key_deletion_desc=Odstranění klíče pro nasazení zruší jeho přístup k repozitáři. Pokračovat?
settings.deploy_key_deletion_success=Klíč pro nasazení byl odstraněn.
settings.branches=Větve
-settings.protected_branch=Ochrana větve
+settings.protected_branch=Ochrana větví
settings.protected_branch.save_rule=Uložit pravidlo
settings.protected_branch.delete_rule=Odstranit pravidlo
settings.protected_branch_can_push=Povolit nahrání?
@@ -2461,7 +2465,7 @@ settings.default_branch_desc=Vybrat výchozí větev repozitáře pro požadavky
settings.merge_style_desc=Sloučit styly
settings.default_merge_style_desc=Výchozí styl sloučení
settings.choose_branch=Vyberte větev…
-settings.no_protected_branch=Nejsou tu žádné chráněné větve.
+settings.no_protected_branch=Nemáte žádné chráněné větve.
settings.edit_protected_branch=Upravit
settings.protected_branch_required_rule_name=Požadovaný název pravidla
settings.protected_branch_duplicate_rule_name=Již existuje pravidlo pro tuto sadu větví
@@ -2849,6 +2853,21 @@ issues.num_reviews_one = %d kontrola
issues.num_reviews_few = %d kontrol
issues.summary_card_alt = Souhrn problému s názvem „%s“ v repozitáři %s
editor.add_tmpl.filename = nazevsouboru
+settings.default_update_style_desc = Výchozí způsob aktualizací používaný pro aktualizace žádostí o sloučení, které jsou pozadu oproti základní větvi.
+pulls.sign_in_require = Přihlaste se pro vytvoření nové žádosti o sloučení.
+new_from_template = Použít šablonu
+new_from_template_description = Můžete si vybrat existující šablonu repozitáře na této instanci a použít její nastavení.
+new_advanced = Pokročilá nastavení
+new_advanced_expand = Klikněte pro rozbalení
+auto_init_description = Vytvořit historii Gitu se souborem README a volitelně přidat soubory License a .gitignore.
+summary_card_alt = Karta se souhrnem repozitáře %s
+issues.reaction.alt_many = Uživatel %[1]s a %[2]d dalších zareagovali s %[3]s.
+release.summary_card_alt = Karta souhrnu vydání s názvem „%s“ v repozitáři %s
+issues.reaction.add = Přidat reakci
+issues.reaction.alt_few = Uživatel %[1]s zareagoval pomocí %[2]s.
+issues.context.menu = Nabídka komentáře
+issues.reaction.alt_remove = Odstranit %[1]s reakci z komentáře.
+issues.reaction.alt_add = Přidat %[1]s reakci na komentář.
[graphs]
component_loading_info = Tohle může chvíli trvat…
diff --git a/options/locale/locale_da.ini b/options/locale/locale_da.ini
new file mode 100644
index 0000000000..cbe65c6583
--- /dev/null
+++ b/options/locale/locale_da.ini
@@ -0,0 +1,1634 @@
+[common]
+home = Hjem
+dashboard = Instrumentpanel
+explore = Udforsk
+help = Hjælp
+logo = Logo
+sign_in = Login
+sign_in_with_provider = Login med %s
+sign_in_or = eller
+sign_out = Logud
+sign_up = Register
+return_to_forgejo = Vend tilbage til Forgejo
+new_repo.title = Ny repository
+retry = Prøv igen
+link_account = Link konto
+register = Register
+powered_by = Baseret på %s
+version = Version
+create_new = Opret…
+user_profile_and_more = Profil og indstillinger…
+page = Side
+template = Skabelon
+language = Sprog
+notifications = Notifikationer
+active_stopwatch = Aktiv tidsregistrering
+enable_javascript = Dette websted kræver JavaScript.
+toc = Indholdsfortegnelse
+licenses = Licenser
+more_items = Flere genstande
+username = Brugernavn
+email = E-mailadresse
+password = Adgangskode
+access_token = Adgangstoken
+re_type = Bekræft adgangskode
+captcha = CAPTCHA
+twofa = To-faktor autentificering
+twofa_scratch = To-faktor skrabekode
+webauthn_sign_in = Tryk på knappen på din sikkerhedsnøgle. Hvis din sikkerhedsnøgle ikke har nogen knap, skal du indsætte den igen.
+webauthn_use_twofa = Brug en tofaktorkode fra din telefon
+webauthn_error = Kunne ikke læse din sikkerhedsnøgle.
+webauthn_unsupported_browser = Din browser understøtter i øjeblikket ikke WebAuthn.
+webauthn_error_unknown = Der opstod en ukendt fejl. Prøv venligst igen.
+webauthn_error_unable_to_process = Serveren kunne ikke behandle din anmodning.
+webauthn_error_duplicated = Sikkerhedsnøglen er ikke tilladt for denne anmodning. Sørg for, at nøglen ikke allerede er registreret.
+webauthn_error_empty = Du skal angive et navn for denne nøgle.
+organization = Organisation
+mirror = Mirror
+new_mirror = Ny mirror
+new_fork = Ny repository fork
+new_project = Nyt projekt
+new_project_column = Ny kolonne
+admin_panel = Side administration
+settings = Indstillinger
+your_profile = Profil
+your_starred = Stjernemarkeret
+your_settings = Indstillinger
+passcode = Passcode
+repository = Repository
+new_org.title = Ny organisation
+new_repo.link = Nyt repository
+new_migrate.link = Ny migration
+new_org.link = Ny organisation
+all = Alle
+sources = Kilder
+mirrors = Mirrors
+collaborative = Samarbejdende
+forks = Forks
+activities = Aktiviteter
+pull_requests = Pull anmodninger
+issues = Problemer
+milestones = Milepæle
+ok = OK
+cancel = Annuller
+rerun = Kør igen
+rerun_all = Kør alle jobs igen
+save = Gem
+add = Tilføj
+add_all = Tilføj alle
+remove = Slet
+remove_all = Slet alle
+remove_label_str = Slet genstand "%s"
+edit = Redigere
+view = Se
+test = Test
+disabled = Deaktiveret
+copy = Kopiér
+copy_generic = Kopiér til udklipsholder
+copy_url = Kopiér URL
+copy_path = Kopiér sti
+copy_content = Kopier indhold
+copy_branch = Kopiér branch navn
+copy_success = Kopieret!
+copy_error = Kopiering mislykkedes
+write = Skriv
+preview = Forhåndsvisning
+loading = Indlæser…
+error = Fejl
+error413 = Du har opbrugt din kvote.
+go_back = Gå tilbage
+never = Aldrig
+unknown = Ukendt
+rss_feed = RSS feed
+pin = Pin
+unpin = Frigør
+artifacts = Artefakter
+archived = Arkiveret
+concept_system_global = Global
+concept_user_individual = Individuel
+concept_code_repository = Repository
+concept_user_organization = Organisation
+show_timestamps = Vis tidsstempler
+show_log_seconds = Vis sekunder
+tracked_time_summary = Opsummering af sporet tid baseret på filtre af problemliste
+signed_in_as = Logget ind som
+webauthn_error_insecure = WebAuthn understøtter kun sikre forbindelser. Til test over HTTP kan du bruge oprindelsen "localhost" eller "127.0.0.1"
+invalid_data = Ugyldige data: %v
+webauthn_insert_key = Indsæt din sikkerhedsnøgle
+webauthn_press_button = Tryk venligst på knappen på din sikkerhedsnøgle…
+webauthn_error_timeout = Timeout nået, før din nøgle kunne læses. Genindlæs denne side og prøv igen.
+enabled = Aktiveret
+locked = Låst
+copy_hash = Kopiér hash
+error404 = Den side, du forsøger at nå, enten findes ikke eller du er ikke autoriseret til at se den.
+confirm_delete_artifact = Er du sikker på, at du vil slette artefakten "%s"?
+new_migrate.title = Ny migration
+copy_type_unsupported = Denne filtype kan ikke kopieres
+toggle_menu = TIl/Fra menu
+show_full_screen = Vis fuld skærm
+download_logs = Download logs
+confirm_delete_selected = Bekræft at slette alle valgte genstande?
+name = Navn
+value = Værdi
+filter = Filter
+filter.clear = Ryd filtre
+filter.is_archived = Arkiveret
+filter.not_archived = Ikke arkiveret
+filter.is_fork = Forks
+filter.not_fork = Ikke forks
+filter.is_mirror = Mirrors
+filter.not_mirror = Ikke mirrors
+filter.is_template = Skabeloner
+filter.not_template = Ikke skabeloner
+filter.public = Offentlig
+filter.private = Privat
+
+[search]
+search = Søg...
+type_tooltip = Søge type
+fuzzy = Fuzzy
+fuzzy_tooltip = Medtag resultater, der også matcher søgeordet tæt
+union = Almindelig
+union_tooltip = Inkluder resultater, der matcher et hvilket som helst af de mellemrumsadskilte søgeord
+exact = Nøjagtig
+exact_tooltip = Medtag kun resultater, der matcher den nøjagtige søgeterm
+regexp = RegExp
+regexp_tooltip = Fortolk søgetermen som et regulært udtryk
+org_kind = Søg i organisationer...
+team_kind = Søg efter hold...
+code_kind = Søg kode...
+code_search_by_git_grep = Aktuelle kodesøgeresultater leveres af "git grep". Der kan være bedre resultater, hvis webstedsadministratoren aktiverer kodeindeksering.
+package_kind = Søg pakker...
+project_kind = Søg efter projekter...
+commit_kind = Søg commits...
+branch_kind = Søg branches...
+runner_kind = Søg runners...
+issue_kind = Søg i problemer...
+milestone_kind = Søg milepæle...
+pull_kind = Søg pulls...
+repo_kind = Søg depoter...
+code_search_unavailable = Kodesøgning er ikke tilgængelig i øjeblikket. Kontakt venligst webstedets administrator.
+no_results = Ingen matchende resultater fundet.
+user_kind = Søg brugere...
+keyword_search_unavailable = Søgning efter nøgleord er ikke tilgængelig i øjeblikket. Kontakt venligst webstedets administrator.
+
+[aria]
+navbar = Navigationslinje
+footer = Sidefod
+footer.software = Omkring dette software
+footer.links = Links
+
+[heatmap]
+number_of_contributions_in_the_last_12_months = %s bidrag inden for de sidste 12 måneder
+contributions_zero = Ingen bidrag
+contributions_format = {contributions} på {month} {day}, {year}
+contributions_one = bidrag
+contributions_few = bidragene
+less = Mindre
+more = Mere
+
+[editor]
+buttons.heading.tooltip = Tilføj overskrift
+buttons.bold.tooltip = Tilføj fed tekst
+buttons.italic.tooltip = Tilføj kursiv tekst
+buttons.quote.tooltip = Citat tekst
+buttons.code.tooltip = Tilføj kode
+buttons.link.tooltip = Tilføj et link
+buttons.list.unordered.tooltip = Tilføj en punktliste
+buttons.list.task.tooltip = Tilføj en liste over opgaver
+buttons.list.ordered.tooltip = Tilføj en nummereret liste
+buttons.mention.tooltip = Nævn en bruger eller et hold
+buttons.ref.tooltip = Henvis til et problem eller pull-anmodning
+buttons.enable_monospace_font = Aktiver monospace-skrifttype
+buttons.disable_monospace_font = Deaktiver monospace-skrifttype
+buttons.new_table.tooltip = Tilføj tabel
+table_modal.header = Tilføj tabel
+table_modal.placeholder.header = Hoved
+table_modal.placeholder.content = Indhold
+table_modal.label.rows = Rækker
+table_modal.label.columns = Kolonner
+buttons.unindent.tooltip = Udsortere genstande med ét niveau
+buttons.indent.tooltip = Indlejring af genstande med ét niveau
+buttons.switch_to_legacy.tooltip = Brug den gamle editor i stedet
+
+[filter]
+string.asc = A - Z
+string.desc = Z - A
+
+[error]
+occurred = Der opstod en fejl
+not_found = Målet kunne ikke findes.
+network_error = Netværksfejl
+server_internal = Intern serverfejl
+report_message = Hvis du mener, at dette er en Forgejo-fejl, skal du søge efter problemer på Codeberg eller åbne et nyt problem, hvis det er nødvendigt.
+
+[startpage]
+app_desc = En smertefri, selv-hostet Git-tjeneste
+install = Nem at installere
+platform = På tværs af platforme
+platform_desc = Det er bekræftet, at Forgejo kører på frie operativsystemer som Linux og FreeBSD, samt forskellige CPU-arkitekturer. Vælg den du elsker!
+lightweight = Letvægtig
+lightweight_desc = Forgejo har lave minimale krav og kan køre på en billig Raspberry Pi. Spar din maskines energi!
+license = Åben kildekode
+license_desc = Få Forgejo! Slut dig til os ved at bidrage til at gøre dette projekt endnu bedre. Vær ikke genert over at være en bidragyder!
+install_desc = Du skal blot køre binæren for din platform, send den med Docker, eller få det pakket.
+
+[install]
+install = Installation
+title = Indledende konfiguration
+docker_helper = Hvis du kører Forgejo inde i Docker, skal du læse dokumentationen, før du ændrer nogen indstillinger.
+require_db_desc = Forgejo kræver MySQL, PostgreSQL, SQLite3 eller TiDB (MySQL-protokol).
+db_title = Database indstillinger
+db_type = Database type
+host = Vært
+user = Brugernavn
+password = Adgangskode
+db_name = Database navn
+db_schema = Schema
+db_schema_helper = Lad stå tom for databasestandard ("offentlig").
+ssl_mode = SSL
+reinstall_error = Du forsøger at installere i en eksisterende Forgejo-database
+reinstall_confirm_check_1 = Dataene krypteret af SECRET_KEY i app.ini kan gå tabt: brugere kan muligvis ikke logge ind med 2FA/OTP, og mirrors fungerer muligvis ikke korrekt. Ved at markere dette felt bekræfter du, at den aktuelle app.ini-fil indeholder den korrekte SECRET_KEY.
+reinstall_confirm_check_3 = Du bekræfter, at du er helt sikker på, at denne Forgejo kører med den korrekte app.ini placering, og at du er sikker på, at du skal gen-installere. Du bekræfter, at du anerkender ovenstående risici.
+err_empty_db_path = SQLite3-databasestien må ikke være tom.
+no_admin_and_disable_registration = Du kan ikke deaktivere brugerens selvregistrering uden at oprette en administratorkonto.
+err_empty_admin_password = Administratoradgangskoden må ikke være tom.
+err_empty_admin_email = Administrator-e-mailen må ikke være tom.
+err_admin_name_is_reserved = Administratorbrugernavnet er ugyldigt, brugernavnet er reserveret
+err_admin_name_pattern_not_allowed = Administratorbrugernavnet er ugyldigt, brugernavnet matcher et reserveret mønster
+err_admin_name_is_invalid = Administratorbrugernavnet er ugyldigt
+general_title = Generelle indstillinger
+app_name = Instans titel
+app_slogan_helper = Indtast dit instans slogan her. Lad være tom for at deaktivere.
+lfs_path_helper = Filer sporet af Git LFS vil blive gemt i denne mappe. Lad være tom for at deaktivere.
+run_user = Bruger at køre som
+lfs_path = Git LFS rodsti
+repo_path = Depot rodsti
+domain = Server domæne
+domain_helper = Domæne eller værtsadresse for serveren.
+ssh_port = SSH server port
+ssh_port_helper = Portnummer, der vil blive brugt af SSH-serveren. Lad være tomt for at deaktivere SSH-serveren.
+http_port = HTTP lytte port
+http_port_helper = Portnummer, der vil blive brugt af Forgejo-webserveren.
+app_url = Base URL
+log_root_path = Log sti
+log_root_path_helper = Logfiler vil blive skrevet til denne mappe.
+optional_title = Valgfrie indstillinger
+email_title = E-mail-indstillinger
+smtp_addr = SMTP vært
+smtp_port = SMTP port
+smtp_from = Send e-mail som
+smtp_from_invalid = "Send e-mail som"-adressen er ugyldig
+mailer_user = SMTP brugernavn
+mailer_password = SMTP adgangskode
+register_confirm = Kræv e-mail-bekræftelse for at registrere
+mail_notify = Aktiver e-mailmeddelelser
+server_service_title = Server- og tredjeparts tjenesteindstillinger
+offline_mode = Aktiver lokal tilstand
+disable_gravatar = Deaktiver Gravatar
+disable_gravatar.description = Deaktiver brug af Gravatar eller andre tredjeparts avatar kilder. Standardbilleder vil blive brugt til bruger avatarer, medmindre de uploader deres egen avatar til instansen.
+federated_avatar_lookup = Aktiver fødererede avatarer
+federated_avatar_lookup.description = Slå avatarer op ved hjælp af Libravatar.
+disable_registration = Deaktiver selvregistrering
+allow_only_external_registration = Tillad kun registrering via eksterne tjenester
+allow_only_external_registration.description = Brugere vil kun være i stand til at oprette nye konti ved at bruge konfigurerede eksterne tjenester.
+openid_signin = Aktiver OpenID-logon
+openid_signin.description = Tillad brugere at logge ind via OpenID.
+app_slogan = Instans slogan
+repo_path_helper = Fjerne Git depoter vil blive gemt i denne mappe.
+smtp_from_helper = E-mailadresse Forgejo vil bruge. Indtast en almindelig e-mailadresse, eller brug formatet "Navn" .
+run_user_helper = Operativsystemets brugernavn, som Forgejo kører som. Bemærk, at denne bruger skal have adgang til depotets rodsti.
+app_name_helper = Indtast dit instans-navn her. Det vil blive vist på hver side.
+offline_mode.description = Deaktiver tredjeparts indholdsleverings netværk og server alle ressourcer lokalt.
+disable_registration.description = Kun instans administratoren vil være i stand til at oprette nye brugerkonti. Det anbefales stærkt at holde registreringen deaktiveret, medmindre du har til hensigt at være vært for en offentlig instans for alle og klar til at håndtere store mængder spamkonti.
+openid_signup = Aktiver OpenID-selvregistrering
+sqlite_helper = Filsti til SQLite3-databasen. Indtast en absolut sti, hvis du kører Forgejo som en tjeneste.
+path = Sti
+reinstall_confirm_message = Geninstallation med en eksisterende Forgejo-database kan forårsage flere problemer. I de fleste tilfælde bør du bruge din eksisterende "app.ini" til at køre Forgejo. Hvis du ved, hvad du laver, skal du bekræfte følgende:
+reinstall_confirm_check_2 = Depoterne og indstillingerne skal muligvis synkroniseres igen. Ved at markere dette felt bekræfter du, at du vil re-synkronisere hooks for depoter og authorized_keys-filen manuelt. Du bekræfter, at du vil sikre dig, at indstillingerne for depoter og mirror er korrekte.
+app_url_helper = Base adresse for HTTP(S)-klone-URL'er og e-mail-meddelelser.
+enable_captcha = Aktiver registrering CAPTCHA
+enable_captcha.description = Kræv brugere at bestå CAPTCHA for at oprette konti.
+require_sign_in_view = Kræv at logge ind for at se instansindhold
+default_keep_email_private = Skjul e-mailadresser som standard
+default_keep_email_private.description = Aktiver skjulning af e-mail-adresser for nye brugere som standard, så disse oplysninger ikke lækkes umiddelbart efter tilmelding.
+default_allow_create_organization = Tillad oprettelse af organisationer som standard
+default_enable_timetracking = Aktiver tidsregistrering som standard
+default_enable_timetracking.description = Tillad som standard brug af tidssporings-funktion for nye depoter.
+admin_title = Indstillinger for administratorkonto
+admin_setting.description = Det er valgfrit at oprette en administratorkonto. Den første registrerede bruger bliver automatisk administrator.
+admin_name = Administrator brugernavn
+admin_password = Adgangskode
+confirm_password = Bekræft adgangskode
+admin_email = E-mailadresse
+config_location_hint = Disse konfigurationsmuligheder vil blive gemt i:
+install_btn_confirm = Installer Forgejo
+invalid_db_setting = Databaseindstillingerne er ugyldige: %v
+invalid_db_table = Databasetabellen "%s" er ugyldig: %v
+invalid_repo_path = Depotets rodsti er ugyldig: %v
+invalid_app_data_path = Appens datasti er ugyldig: %v
+run_user_not_match = Brugernavnet som "bruger det skal køres som" er ikke det aktuelle brugernavn: %s -> %s
+internal_token_failed = Kunne ikke generere intern token: %v
+secret_key_failed = Kunne ikke generere hemmelig nøgle: %v
+save_config_failed = Konfigurationen kunne ikke gemmes: %v
+invalid_admin_setting = Administratorkonto indstillingen er ugyldig: %v
+invalid_log_root_path = Log stien er ugyldig: %v
+allow_dots_in_usernames = Tillad brugere at bruge prikker i deres brugernavne. Påvirker ikke eksisterende konti.
+no_reply_address = Skjult e-mail-domæne
+invalid_password_algorithm = Ugyldig hash-algoritme for adgangskode
+enable_update_checker = Aktiver opdateringskontrol
+env_config_keys = Miljøkonfiguration
+env_config_keys_prompt = Følgende miljøvariabler vil også blive anvendt på din konfigurationsfil:
+test_git_failed = Kunne ikke teste "git" kommandoen: %v
+sqlite3_not_available = Denne Forgejo-version understøtter ikke SQLite3. Download venligst den officielle binære version fra %s (ikke "gobuild"-versionen).
+no_reply_address_helper = Domænenavn til brugere med en skjult e-mailadresse. For eksempel vil brugernavnet "joe" blive logget i Git som "joe@noreply.example.org", hvis det skjulte e-mail-domæne er sat til "noreply.example.org".
+require_sign_in_view.description = Begræns indholdsadgang til ind-loggede brugere. Gæster vil kun kunne besøge autentificerings sider..
+default_allow_create_organization.description = Tillad nye brugere at oprette organisationer som standard. Når denne mulighed er deaktiveret, skal en administrator give tilladelse til at oprette organisationer til nye brugere.
+password_algorithm = Adgangskode hash algoritme
+enable_update_checker_helper_forgejo = Den vil med jævne mellemrum tjekke for nye Forgejo versioner ved at tjekke en TXT DNS-posten på release.forgejo.org.
+password_algorithm_helper = Indstil adgangskode-hash-algoritmen. Algoritmer har forskellige krav og styrke. Argon2-algoritmen er ret sikker, men bruger meget hukommelse og kan være upassende til små systemer.
+openid_signup.description = Tillad brugere at oprette konti via OpenID, hvis selvregistrering er aktiveret.
+
+[home]
+uname_holder = Brugernavn eller e-mailadresse
+switch_dashboard_context = Skift instrumentpanel-kontekst
+my_repos = Depoter
+my_orgs = Organisationer
+view_home = Se %s
+filter = Andre filtre
+filter_by_team_repositories = Filtrer efter holddepoter
+feed_of = Feed af "%s"
+show_archived = Arkiveret
+show_both_archived_unarchived = Viser både arkiveret og ikke-arkiveret
+show_only_archived = Viser kun arkiverede
+show_only_unarchived = Viser kun ikke-arkiveret
+show_private = Privat
+show_only_private = Viser kun privat
+show_only_public = Viser kun offentligt
+issues.in_your_repos = I dine depoter
+show_both_private_public = Viser både offentlige og private
+
+[explore]
+repos = Depoter
+users = Brugere
+stars_one = %d stjerne
+stars_few = %d stjerner
+forks_one = %d fork
+forks_few = %d forks
+organizations = Organisationer
+code = Kode
+code_last_indexed_at = Sidst indekseret %s
+relevant_repositories = Kun relevante depoter vises, vis ufiltrerede resultater.
+go_to = Gå til
+relevant_repositories_tooltip = Depoter som er forks, eller som ikke har noget emne, intet ikon og ingen beskrivelse, er skjult.
+
+[auth]
+create_new_account = Registrer konto
+disable_register_prompt = Registrering er deaktiveret. Kontakt venligst din side-administrator.
+disable_register_mail = E-mailbekræftelse for registrering er deaktiveret.
+manual_activation_only = Kontakt din side-administrator for at fuldføre aktiveringen.
+remember_me = Husk denne enhed
+forgot_password_title = Glemt adgangskode
+forgot_password = Glemt adgangskode?
+hint_register = Har du brug for en konto? Registrer dig nu.
+sign_up_button = Registrer nu.
+sign_up_successful = Kontoen blev oprettet. Velkommen!
+must_change_password = Opdater din adgangskode
+allow_password_change = Kræv, at brugeren ændrer adgangskode (anbefales)
+reset_password_mail_sent_prompt = En bekræftelses-e-mail er blevet sendt til %s. For at fuldføre kontogendannelses-processen skal du tjekke din indbakke og følge det medfølgende link inden for de næste %s.
+active_your_account = Aktiver din konto
+account_activated = Kontoen er blevet aktiveret
+prohibit_login = Kontoen er suspenderet
+prohibit_login_desc = Din konto er blevet suspenderet fra interaktion med instansen. Kontakt instans-administratoren for at få adgang igen.
+change_unconfirmed_email_summary = Skift den e-mailadresse, aktiveringsmail sendes til.
+change_unconfirmed_email_error = Kan ikke ændre e-mailadressen: %v
+resend_mail = Klik her for at sende din aktiverings-e-mail igen
+send_reset_mail = Send gendannelses-e-mail
+reset_password = Kontogendannelse
+invalid_code = Din bekræftelseskode er ugyldig eller er udløbet.
+invalid_code_forgot_password = Din bekræftelseskode er ugyldig eller er udløbet. Klik her for at starte en ny session.
+invalid_password = Din adgangskode stemmer ikke overens med den adgangskode, der blev brugt til at oprette kontoen.
+reset_password_helper = Gendan konto
+resent_limit_prompt = Du har allerede anmodet om en aktiverings-e-mail for nylig. Vent venligst 3 minutter, og prøv igen.
+reset_password_wrong_user = Du er logget ind som %s, men linket til kontogendannelse er beregnet til %s
+confirmation_mail_sent_prompt = En ny bekræftelses-e-mail er blevet sendt til %s. For at fuldføre registreringsprocessen skal du tjekke din indbakke og følge det medfølgende link inden for de næste %s. Hvis e-mailen er forkert, kan du logge ind og anmode om, at endnu en bekræftelses-e-mail sendes til en anden adresse.
+change_unconfirmed_email = Hvis du har opgivet den forkerte e-mailadresse under tilmeldingen, kan du ændre den nedenfor, og der vil i stedet blive sendt en bekræftelse til den nye adresse.
+hint_login = Har du allerede en konto? Log ind nu!
+has_unconfirmed_mail = Hej %s, du har en ubekræftet e-mailadresse (%s). Hvis du ikke har modtaget en bekræftelses-e-mail eller har brug for at sende en ny, bedes du klikke på knappen nedenfor.
+password_too_short = Adgangskodelængden må ikke være mindre end %d tegn.
+non_local_account = Ikke-lokale brugere kan ikke opdatere deres adgangskode via Forgejo-webgrænsefladen.
+verify = Verificere
+unauthorized_credentials = Legitimationsoplysningerne er forkerte eller er udløbet. Prøv din kommando igen, eller se %s for at få flere oplysninger
+scratch_code = Skrabekode
+use_scratch_code = Brug en skrabekode
+use_onetime_code = Brug en engangskode
+twofa_scratch_used = Du har brugt din skrabekode. Du er blevet omdirigeret til siden med to-faktorindstillinger, så du kan fjerne din enhedstilmelding eller generere en ny skrabekode.
+twofa_passcode_incorrect = Din passcode er forkert. Hvis du har forlagt din enhed, skal du bruge din skrabekode til at logge ind.
+twofa_scratch_token_incorrect = Din skrabekode er forkert.
+login_userpass = Login
+oauth_signup_tab = Registrer ny konto
+oauth_signup_title = Fuldfør ny konto
+oauth_signup_submit = Gennemfør konto
+oauth_signin_tab = Link til en eksisterende konto
+oauth_signin_title = Log ind for at godkende linket konto
+oauth_signin_submit = Link konto
+oauth.signin.error = Der opstod en fejl under behandling af godkendelsesanmodningen. Hvis denne fejl fortsætter, bedes du kontakte webstedets administrator.
+oauth.signin.error.access_denied = Godkendelsesanmodningen blev afvist.
+oauth.signin.error.temporarily_unavailable = Godkendelse mislykkedes, fordi godkendelsesserveren midlertidigt ikke er tilgængelig. Prøv venligst igen senere.
+openid_connect_submit = Forbind
+openid_connect_title = Opret forbindelse til en eksisterende konto
+openid_register_title = Opret ny konto
+openid_register_desc = Den valgte OpenID URI er ukendt. Knyt den til en ny konto her.
+disable_forgot_password_mail = Kontogendannelse er deaktiveret, fordi der ikke er konfigureret nogen e-mail. Kontakt venligst din webstedsadministrator.
+email_domain_blacklisted = Du kan ikke registrere dig med din e-mailadresse.
+authorize_application = Godkend Applikation
+authorize_redirect_notice = Du vil blive omdirigeret til %s, hvis du godkender denne applikation.
+authorize_application_created_by = Denne applikation blev oprettet af %s.
+authorize_application_description = Hvis du giver adgangen, vil den være i stand til at få adgang til og skrive til alle dine kontooplysninger, inklusive private depoter og organisationer.
+authorize_title = Tillad "%s" at få adgang til din konto?
+authorization_failed = Godkendelse mislykkedes
+password_pwned_err = Kunne ikke fuldføre anmodningen til HaveIBeenPwned
+last_admin = Du kan ikke fjerne den sidste admin. Der skal være mindst én administrator.
+back_to_sign_in = Tilbage til Log ind
+sign_in_openid = Fortsæt med OpenID
+openid_signin_desc = Indtast din OpenID URI. For eksempel: alice.openid.example.org eller https://openid.example.org/alice.
+disable_forgot_password_mail_admin = Kontogendannelse er kun tilgængelig, når e-mail er konfigureret. Konfigurer venligst e-mail for at aktivere kontogendannelse.
+password_pwned = Den adgangskode, du valgte, er på en liste over stjålne adgangskoder, der tidligere er blevet afsløret i forbindelse med offentlige databrud. Prøv venligst igen med en anden adgangskode, og overvej også at ændre denne adgangskode et andet sted.
+openid_connect_desc = Den valgte OpenID URI er ukendt. Knyt den til en ny konto her.
+authorization_failed_desc = Godkendelsen mislykkedes, fordi vi har registreret en ugyldig anmodning. Kontakt venligst vedligeholderen af den app, du har forsøgt at godkende.
+
+[mail]
+view_it_on = Se det på %s
+reply = eller svar direkte på denne e-mail
+link_not_working_do_paste = Virker linket ikke? Prøv at kopiere og indsætte det i din browsers URL-linje.
+hi_user_x = Hej %s,
+activate_account = Aktiver venligst din konto
+activate_account.text_1 = Hej %[1]s, tak, fordi du registrerede dig hos %[2]s!
+activate_account.text_2 = Klik venligst på følgende link for at aktivere din konto inden for %s:
+activate_email = Bekræft din e-mailadresse
+admin.new_user.subject = Ny bruger %s har lige tilmeldt sig
+admin.new_user.user_info = Brugeroplysninger
+admin.new_user.text = Venligst klik her for at administrere denne bruger fra administrationspanelet.
+register_notify = Velkommen til %s
+register_notify.text_1 = dette er din registreringsbekræftelses-e-mail for %s!
+register_notify.text_3 = Hvis en anden har lavet denne konto for dig, skal du først indstille din adgangskode.
+reset_password = Gendan din konto
+password_change.subject = Din adgangskode er blevet ændret
+password_change.text_1 = Adgangskoden til din konto er lige blevet ændret.
+primary_mail_change.subject = Din primære mail er blevet ændret
+totp_disabled.subject = TOTP er blevet deaktiveret
+totp_disabled.text_1 = Tidsbaseret engangsadgangskode (TOTP) på din konto er netop blevet deaktiveret.
+totp_disabled.no_2fa = Der er ikke længere konfigureret andre 2FA-metoder, hvilket betyder, at det ikke længere er nødvendigt at logge ind på din konto hos 2FA.
+removed_security_key.subject = En sikkerhedsnøgle er blevet fjernet
+removed_security_key.text_1 = Sikkerhedsnøglen "%[1]s" er lige blevet fjernet fra din konto.
+account_security_caution.text_1 = Hvis dette var dig, så kan du roligt ignorere denne mail.
+totp_enrolled.subject = Du har aktiveret TOTP som 2FA-metode
+totp_enrolled.text_1.has_webauthn = Du har lige aktiveret TOTP for din konto. Dette betyder, at du for alle fremtidige login til din konto kan bruge TOTP som en 2FA-metode eller bruge en af dine sikkerhedsnøgler.
+register_success = Registreringen lykkedes
+issue_assigned.pull = @%[1]s har tildelt dig at trække anmodning %[2]s i depotet %[3]s.
+issue_assigned.issue = @%[1]s har tildelt dig et problem %[2]s i depotet %[3]s.
+register_notify.text_2 = Du kan logge ind på din konto med dit brugernavn: %s
+primary_mail_change.text_1 = Din kontos primære mail er lige blevet ændret til %[1]s. Det betyder, at denne e-mailadresse ikke længere vil modtage e-mail-meddelelser for din konto.
+account_security_caution.text_2 = Hvis dette ikke var dig, er din konto kompromitteret. Kontakt venligst administratorerne af dette websted.
+activate_email.text = Klik venligst på følgende link for at bekræfte din e-mailadresse inden for %s:
+reset_password.text = Hvis dette var dig, skal du klikke på følgende link for at gendanne din konto inden for %s:
+removed_security_key.no_2fa = Der er ikke længere konfigureret andre 2FA-metoder, hvilket betyder, at det ikke længere er nødvendigt at logge ind på din konto hos 2FA.
+totp_enrolled.text_1.no_webauthn = Du har lige aktiveret TOTP for din konto. Det betyder, at du for alle fremtidige login til din konto skal bruge TOTP som 2FA-metode.
+issue.x_mentioned_you = @%s nævnte dig:
+issue.action.force_push = %[1]s tvangs pushed %[2]s fra %[3]s til %[4]s.
+issue.action.push_1 = @%[1]s pushed %[3]d commit til %[2]s
+issue.action.push_n = @%[1]s pushed %[3]d commits til %[2]s
+issue.action.close = @%[1]s lukket #%[2]d.
+issue.action.reopen = @%[1]s genåbnet #%[2]d.
+issue.action.merge = @%[1]s merged #%[2]d ind i %[3]s.
+issue.action.approve = @%[1]s godkendte denne pull-anmodning.
+issue.action.reject = @%[1]s anmodede om ændringer på denne pull-anmodning.
+issue.action.review = @%[1]s kommenterede denne pull-anmodning.
+issue.action.review_dismissed = @%[1]s afviste den seneste kontrol fra %[2]s for denne pull-anmodning.
+issue.action.ready_for_review = @%[1]s markerede denne pull-anmodning klar til gennemgang.
+issue.action.new = @%[1]s oprettede #%[2]d.
+issue.in_tree_path = I %s:
+release.new.subject = %s i %s udgivet
+release.new.text = @%[1]s udgivet %[2]s i %[3]s
+release.title = Title: %s
+release.note = Note:
+release.downloads = Downloads:
+release.download.zip = Kildekode (ZIP)
+release.download.targz = Kildekode (TAR.GZ)
+repo.transfer.subject_to = %s ønsker at overføre depotet "%s" til %s
+repo.transfer.subject_to_you = %s ønsker at overføre depotet "%s" til dig
+repo.transfer.to_you = dig
+repo.transfer.body = For at acceptere eller afvise det, besøg %s eller ignorer det.
+repo.collaborator.added.subject = %s føjede dig til %s som samarbejdspartner
+repo.collaborator.added.text = Du er blevet tilføjet som samarbejdspartner til depotet:
+team_invite.subject = %[1]s har inviteret dig til at deltage i %[2]s organisationen
+team_invite.text_1 = %[1]s har inviteret dig til at deltage i teamet %[2]s i organisationen %[3]s.
+team_invite.text_2 = Klik venligst på følgende link for at blive medlem af holdet:
+team_invite.text_3 = Note: Denne invitation var beregnet til %[1]s. Hvis du ikke forventede denne invitation, kan du ignorere denne e-mail.
+
+[modal]
+yes = Ja
+no = Nej
+confirm = Bekærft
+cancel = Annuller
+modify = Updatere
+
+[form]
+UserName = Brugernavn
+FullName = Fulde navn
+Description = Beskrivelse
+Pronouns = Stedord
+Biography = Biografi
+Website = Websted
+Location = Lokation
+RepoName = Depot navn
+Email = E-mailadresse
+Password = Adgangskode
+Retype = Bekræft adgangskode
+PayloadUrl = Payload URL
+TeamName = Holdnavn
+AuthName = Autorisationsnavn
+AdminEmail = Admin email
+To = Gren navn
+AccessToken = Adgangstoken
+NewBranchName = Nyt gren navn
+CommitSummary = Commit oversigt
+CommitMessage = Commit besked
+CommitChoice = Commit valg
+TreeName = Fil sti
+Content = Indhold
+SSPISeparatorReplacement = Separator
+SSPIDefaultLanguage = Standard sprog
+require_error = ` må ikke være tomt.`
+alpha_dash_error = ` bør kun indeholde alfanumeriske, bindestreg ("-") og understregningstegn ("_").`
+alpha_dash_dot_error = ` bør kun indeholde alfanumeriske tegn, bindestreg ("-"), understregning ("_") og prik ("".").`
+git_ref_name_error = ` skal være et veludformet Git-referencenavn.`
+size_error = ` skal være størrelse %s.`
+min_size_error = ` skal indeholde mindst %s tegn.`
+email_error = ` er ikke en gyldig e-mailadresse.`
+url_error = `"%s" er ikke en gyldig URL.`
+include_error = ` skal indeholde understreng "%s".`
+glob_pattern_error = ` globmønster er ugyldigt: %s.`
+regex_pattern_error = ` regex-mønster er ugyldigt: %s.`
+invalid_group_team_map_error = ` mapping er ugyldig: %s`
+unknown_error = Ukendt fejl:
+captcha_incorrect = CAPTCHA-koden er forkert.
+password_not_match = Adgangskoderne stemmer ikke overens.
+lang_select_error = Vælg et sprog fra listen.
+username_been_taken = Brugernavnet er allerede taget.
+username_change_not_local_user = Ikke-lokale brugere må ikke ændre deres brugernavn.
+repo_name_been_taken = Depotnavnet er allerede brugt.
+repository_force_private = Tving Privat er aktiveret: private depoter kan ikke gøres offentlige.
+repository_files_already_exist = Der findes allerede filer for dette depot. Kontakt systemadministratoren.
+repository_files_already_exist.delete = Der findes allerede filer for dette depot. Du skal slette dem.
+visit_rate_limit = Fjernbesøg adresseret takstbegrænsning.
+2fa_auth_required = Fjernbesøg krævede godkendelse af to faktorer.
+org_name_been_taken = Organisationsnavnet er allerede taget.
+team_name_been_taken = Holdnavnet er allerede taget.
+team_no_units_error = Tillad adgang til mindst én depotsektion.
+email_been_used = E-mailadressen er allerede brugt.
+email_invalid = E-mailadressen er ugyldig.
+openid_been_used = OpenID-adressen "%s" er allerede brugt.
+password_complexity = Adgangskoden opfylder ikke kompleksitetskravene:
+password_lowercase_one = Mindst ét lille bogstav
+password_uppercase_one = Mindst ét stort tegn
+password_digit_one = Mindst ét ciffer
+enterred_invalid_repo_name = Det depotnavn, du indtastede, er forkert.
+enterred_invalid_org_name = Det organisationsnavn, du har indtastet, er forkert.
+enterred_invalid_owner_name = Det nye ejernavn er ikke gyldigt.
+enterred_invalid_password = Den adgangskode, du indtastede, er forkert.
+unset_password = Login-brugeren har ikke angivet adgangskoden.
+user_not_exist = Brugeren eksisterer ikke.
+team_not_exist = Holdet eksisterer ikke.
+last_org_owner = Du kan ikke fjerne den sidste bruger fra "ejere"-teamet. Der skal være mindst én ejer for en organisation.
+duplicate_invite_to_team = Brugeren var allerede inviteret som et holdmedlem.
+organization_leave_success = Du har forladt organisationen %s.
+invalid_ssh_key = Kan ikke bekræfte din SSH-nøgle: %s
+invalid_gpg_key = Kan ikke bekræfte din GPG-nøgle: %s
+invalid_ssh_principal = Ugyldig principal: %s
+unable_verify_ssh_key = Kan ikke bekræfte SSH-nøglen, dobbelttjek den for fejl.
+auth_failed = Godkendelse mislykkedes: %v
+still_own_repo = Din konto ejer et eller flere depoter, slet eller overfør dem først.
+still_has_org = Din konto er medlem af en eller flere organisationer, forlad dem først.
+still_own_packages = Din konto ejer en eller flere pakker, slet dem først.
+org_still_own_packages = Denne organisation ejer stadig en eller flere pakker, slet dem først.
+target_branch_not_exist = Gren målet eksisterer ikke.
+admin_cannot_delete_self = Du kan ikke slette dig selv, når du er administrator. Fjern venligst dine administratorrettigheder først.
+required_prefix = Input skal starte med "%s"
+username_error = ` kan kun indeholde alfanumeriske tegn ("0-9","a-z","A-Z"), bindestreg ("-"), understregning ("_") og prik ("."). Det kan ikke begynde eller slutte med ikke-alfanumeriske tegn, og på hinanden følgende ikke-alfanumeriske tegn er også forbudt.`
+max_size_error = ` må højst indeholde %s tegn.`
+repository_files_already_exist.adopt_or_delete = Der findes allerede filer for dette depot. Enten adopter dem eller slet dem.
+org_still_own_repo = Denne organisation ejer stadig et eller flere depoter, slet eller overfør dem først.
+username_error_no_dots = ` kan kun indeholde alfanumeriske tegn ("0-9","a-z","A-Z"), bindestreg ("-") og understregning ("_"). Det kan ikke begynde eller slutte med ikke-alfanumeriske tegn, og på hinanden følgende ikke-alfanumeriske tegn er også forbudt.`
+username_password_incorrect = Brugernavn eller adgangskode er forkert.
+repository_files_already_exist.adopt = Filer findes allerede for dette depot og kan kun adopteres.
+password_special_one = Mindst ét specialtegn (tegnsætning, parenteser, anførselstegn osv.)
+unsupported_login_type = Login typen understøttes ikke for at slette kontoen.
+cannot_add_org_to_team = En organisation kan ikke tilføjes som et holdmedlem.
+must_use_public_key = Nøglen du har angivet er en privat nøgle. Lad være med at uploade din private nøgle nogen steder. Brug din offentlige nøgle i stedet.
+
+[user]
+change_avatar = Skift din avatar…
+joined_on = Tilmeldte sig den %s
+repositories = Depoter
+activity = Offentlig aktivitet
+followers.title.one = Følger
+followers.title.few = Følgere
+following.title.one = Følger
+following.title.few = Følger
+followers_one = %d følger
+followers_few = %d følgere
+following_one = %d følger
+following_few = %d følger
+follow = Følg
+unfollow = Fjern følg
+block_user = Bloker bruger
+block_user.detail = Bemærk venligst, at blokering af en bruger har andre effekter, såsom:
+block_user.detail_1 = I vil holde op med at følge hinanden og vil ikke være i stand til at følge hinanden.
+block_user.detail_2 = Denne bruger vil ikke være i stand til at interagere med de depoter, du ejer, eller de problemer og kommentarer, du har oprettet.
+block_user.detail_3 = I vil ikke være i stand til at tilføje hinanden som depot-samarbejdspartnere.
+follow_blocked_user = Du kan ikke følge denne bruger, fordi du har blokeret denne bruger, eller denne bruger har blokeret dig.
+starred = Stjernemarkerede depoter
+watched = Overvågede depoter
+code = Kode
+overview = Oversigt
+block = Block
+user_bio = Biografi
+email_visibility.limited = Din e-mailadresse er synlig for alle godkendte brugere
+show_on_map = Vis dette sted på et kort
+settings = Brugerindstillinger
+public_activity.visibility_hint.admin_public = Denne aktivitet er synlig for alle, men som administrator kan du også se interaktioner i private rum.
+public_activity.visibility_hint.self_private = Din aktivitet er kun synlig for dig og instans-administratorerne. Konfigurer.
+public_activity.visibility_hint.admin_private = Denne aktivitet er synlig for dig, fordi du er administrator, men brugeren ønsker, at den forbliver privat.
+form.name_reserved = Brugernavnet "%s" er reserveret.
+form.name_pattern_not_allowed = Mønsteret "%s" er ikke tilladt i et brugernavn.
+form.name_chars_not_allowed = Brugernavnet "%s" indeholder ugyldige tegn.
+unblock = Fjern blokering
+projects = Projekter
+disabled_public_activity = Denne bruger har deaktiveret den offentlige synlighed af aktiviteten.
+public_activity.visibility_hint.self_public = Din aktivitet er synlig for alle, undtagen interaktioner i private rum. Konfigurer.
+public_activity.visibility_hint.self_private_profile = Din aktivitet er kun synlig for dig og instans-administratorerne, fordi din profil er privat. Konfigurer.
+
+[settings]
+profile = Profil
+account = Konto
+appearance = Udseende
+password = Adgangskode
+security = Sikkerhed
+avatar = Avatar
+ssh_gpg_keys = SSH / GPG nøgler
+applications = Applikationer
+orgs = Organisationer
+repos = Depoter
+delete = Slet konto
+twofa = To-faktor-godkendelse (TOTP)
+organization = Organisationer
+uid = UID
+webauthn = To-faktor-godkendelse (sikkerhedsnøgler)
+blocked_users = Blokerede brugere
+public_profile = Offentlig profil
+location_placeholder = Del din omtrentlige placering med andre
+password_username_disabled = Ikke-lokale brugere må ikke ændre deres brugernavn. Kontakt venligst din webstedsadministrator for flere detaljer.
+full_name = Fulde navn
+website = Websted
+location = Lokation
+pronouns = Stedord
+pronouns_custom = Brugerdefineret
+pronouns_unspecified = Uspecificeret
+update_theme = Skift tema
+update_language = Skift sprog
+update_language_success = Sproget er blevet opdateret.
+update_profile_success = Din profil er blevet opdateret.
+change_username = Dit brugernavn er blevet ændret.
+change_username_redirect_prompt = Det gamle brugernavn vil omdirigere, indtil nogen gør krav på det.
+continue = Fortsæt
+cancel = Annuller
+language = Sprog
+language.title = Standard sprog
+language.description = Dette sprog gemmes på din konto og bruges som standard, når du logger ind.
+ui = Tema
+additional_repo_units_hint = Foreslå at aktivere yderligere depotenheder
+additional_repo_units_hint_description = Vis et "Aktiver mere"-tip for depoter, der ikke har alle tilgængelige enheder aktiveret.
+update_hints = Opdater tips
+hints = Tips
+update_hints_success = Tips er blevet opdateret.
+hidden_comment_types = Skjulte kommentartyper
+hidden_comment_types.ref_tooltip = Kommentarer, hvor dette problem blev refereret fra en anden problem/commit/…
+hidden_comment_types.issue_ref_tooltip = Kommentarer, hvor brugeren ændrer grenen/taget, der er knyttet til problemet
+comment_type_group_reference = Reference
+comment_type_group_label = Etiket
+comment_type_group_milestone = Milepæl
+comment_type_group_assignee = Udpegningsmodtager
+comment_type_group_title = Title
+comment_type_group_branch = Gren
+comment_type_group_time_tracking = Tidsregistrering
+comment_type_group_deadline = Tidsfrist
+comment_type_group_dependency = Dependency
+comment_type_group_lock = Lås status
+comment_type_group_review_request = Gennemgå anmodning
+comment_type_group_pull_request_push = Tilføjet commits
+comment_type_group_project = Projekt
+comment_type_group_issue_ref = Problem henvisning
+privacy = Privatliv
+keep_activity_private = Skjul aktivitet fra profilsiden
+lookup_avatar_by_mail = Slå avatar up efter e-mailadresse
+enable_custom_avatar = Brug tilpasset avatar
+delete_current_avatar = Slet nuværende avatar
+uploaded_avatar_not_a_image = Den uploadede fil er ikke et billede.
+update_avatar_success = Din avatar er blevet opdateret.
+update_user_avatar_success = Brugerens avatar er blevet opdateret.
+change_password = Skift adgangskode
+update_password = Opdater adgangskode
+old_password = Nuværende adgangskode
+new_password = Ny adgangskode
+retype_new_password = Bekræft ny adgangskode
+password_incorrect = Den aktuelle adgangskode er forkert.
+password_change_disabled = Ikke-lokale brugere kan ikke opdatere deres adgangskode via Forgejo-webgrænsefladen.
+manage_emails = Administrer e-mailadresser
+manage_themes = Standard tema
+manage_openid = OpenID-adresser
+theme_desc = Dette tema vil blive brugt til webgrænsefladen, når du er logget ind.
+primary = Primær
+activated = Aktiveret
+requires_activation = Kræver aktivering
+primary_email = Gør til primær
+activate_email = Send aktivering
+activations_pending = Aktiveringer afventer
+can_not_add_email_activations_pending = Der er en afventende aktivering, prøv igen om et par minutter, hvis du vil tilføje en ny e-mail.
+delete_email = Slet
+email_deletion = Fjern e-mailadresse
+email_deletion_success = E-mailadressen er blevet fjernet.
+theme_update_success = Dit tema blev opdateret.
+theme_update_error = Det valgte tema findes ikke.
+openid_deletion = Fjern OpenID-adresse
+openid_deletion_desc = Fjernelse af denne OpenID-adresse fra din konto vil forhindre dig i at logge ind med den. Fortsætte?
+openid_deletion_success = OpenID-adressen er blevet fjernet.
+add_new_email = Tilføj e-mailadresse
+add_new_openid = Tilføj ny OpenID URI
+language.localization_project = Hjælp os med at oversætte Forgejo til dit sprog! Få flere oplysninger.
+update_language_not_found = Sprog "%s" er ikke tilgængeligt.
+hidden_comment_types_description = Kommentartyper, der er markeret her, vil ikke blive vist på problemsider. Hvis du f.eks. markerer "Etiket", fjernes alle " tilføjede/fjernede " kommentarer.
+update_profile = Opdater profil
+change_username_prompt = Note: Ændring af dit brugernavn ændrer også din konto-URL.
+biography_placeholder = Fortæl andre lidt om dig selv! (Markdown understøttes)
+profile_desc = Om dig
+saved_successfully = Dine indstillinger blev gemt.
+keep_activity_private.description = Din offentlige aktivitet vil kun være synlig for dig og instans-administratorerne.
+email_desc = Din primære e-mailadresse vil blive brugt til meddelelser, gendannelse af adgangskode og, forudsat at den ikke er skjult, webbaserede Git-operationer.
+uploaded_avatar_is_too_big = Den uploadede filstørrelse (%d KiB) overstiger den maksimale størrelse (%d KiB).
+email_deletion_desc = E-mailadressen og relaterede oplysninger vil blive fjernet fra din konto. Git commits af denne e-mailadresse forbliver uændret. Fortsætte?
+choose_new_avatar = Vælg ny avatar
+update_avatar = Opdater avatar
+change_password_success = Din adgangskode er blevet opdateret. Log ind med din nye adgangskode fra nu af.
+add_email = Tilføj e-mailadresse
+add_openid = Tilføj OpenID URI
+add_email_confirmation_sent = En bekræftelses-e-mail er blevet sendt til "%s". For at bekræfte din e-mailadresse, tjek venligst din indbakke og følg det medfølgende link inden for de næste %s.
+add_openid_success = Den nye OpenID-adresse er blevet tilføjet.
+keep_email_private = Skjul e-mailadresse
+openid_desc = OpenID lader dig uddelegere godkendelse til en ekstern udbyder.
+manage_ssh_keys = Administrer SSH-nøgler
+manage_ssh_principals = Administrer SSH-certifikatprincippere
+manage_gpg_keys = Administrer GPG-nøgler
+add_key = Tilføj nøgle
+ssh_desc = Disse offentlige SSH-nøgler er knyttet til din konto. De tilsvarende private nøgler giver fuld adgang til dine depoter. SSH-nøgler, der er blevet bekræftet, kan bruges til at bekræfte SSH-signerede Git-commits.
+principal_desc = Disse SSH-certifikatprincipper er knyttet til din konto og giver fuld adgang til dine depoter.
+ssh_helper = Har du brug for hjælp? Se vejledningen til at oprette dine egne SSH-nøgler eller løse almindelige problemer a> du kan støde på når du bruger SSH.
+gpg_helper = Har du brug for hjælp? Se vejledningen om GPG.
+key_content_gpg_placeholder = Begynder med "-----BEGIN PGP PUBLIC KEY BLOCK-----"
+add_new_principal = Tilføj principal
+ssh_key_been_used = Denne SSH-nøgle er allerede blevet tilføjet til serveren.
+ssh_key_name_used = En SSH-nøgle med samme navn findes allerede på din konto.
+ssh_principal_been_used = Denne principal er allerede blevet tilføjet til serveren.
+gpg_key_id_used = Der findes allerede en offentlig GPG-nøgle med samme id.
+gpg_no_key_email_found = Denne GPG-nøgle matcher ikke nogen aktiveret e-mail-adresse tilknyttet din konto. Det kan stadig tilføjes, hvis du underskriver det medfølgende token.
+gpg_key_matched_identities = Matchede identiteter:
+gpg_key_verified = Verificeret nøgle
+gpg_key_verified_long = Nøglen er blevet bekræftet med et token og kan bruges til at bekræfte commits, der matcher alle aktiverede e-mailadresser for denne bruger ud over eventuelle matchede identiteter for denne nøgle.
+gpg_key_verify = Bekræft
+gpg_invalid_token_signature = Den medfølgende GPG-nøgle, signatur og token stemmer ikke overens, eller token er forældet.
+gpg_token_required = Du skal angive en underskrift for nedenstående token
+gpg_token = Token
+gpg_token_signature = Pansret GPG-signatur
+key_signature_gpg_placeholder = Begynder med "-----BEGIN PGP SIGNATURE-----"
+verify_gpg_key_success = GPG-nøglen "%s" er blevet bekræftet.
+ssh_key_verified = Verificeret nøgle
+ssh_token_required = Du skal angive en underskrift for nedenstående token
+ssh_token = Token
+ssh_token_help = Du kan generere en signatur ved at bruge:
+ssh_token_signature = Pansret SSH signatur
+key_signature_ssh_placeholder = Begynder med "-----BEGIN SSH SIGNATURE-----"
+verify_ssh_key_success = SSH-nøglen "%s" er blevet bekræftet.
+subkeys = Undernøgler
+key_name = Nøglenavn
+key_id = Nøgle ID
+key_content = Indhold
+principal_content = Indhold
+add_key_success = SSH-nøglen "%s" er blevet tilføjet.
+add_principal_success = SSH-certifikatprincippet "%s" er blevet tilføjet.
+delete_key = Slet
+ssh_key_deletion = Slet SSH-nøgle
+gpg_key_deletion = Slet GPG-nøglen
+ssh_principal_deletion = Slet SSH Certificate Principal
+gpg_key_deletion_desc = Fjernelse af en GPG-nøgle afbekræfter commits, der er underskrevet af den. Fortsætte?
+ssh_principal_deletion_desc = Fjernelse af en SSH Certificate Principal tilbagekalder dens adgang til din konto. Fortsætte?
+ssh_key_deletion_success = SSH-nøglen er blevet fjernet.
+ssh_principal_deletion_success = Principal er blevet fjernet.
+added_on = Tilføjet den %s
+valid_until_date = Gyldig indtil %s
+last_used = Sidst brugt på
+no_activity = Ingen nylig aktivitet
+can_read_info = Læs
+can_write_info = Skriv
+token_state_desc = Dette token er blevet brugt inden for de sidste 7 dage
+principal_state_desc = Denne principal er blevet brugt inden for de sidste 7 dage
+show_openid = Vis på profil
+hide_openid = Skjul fra profil
+ssh_externally_managed = Denne SSH-nøgle administreres eksternt for denne bruger
+manage_access_token = Adgangstoken
+generate_new_token = Generer nyt token
+tokens_desc = Disse tokens giver adgang til din konto ved hjælp af Forgejo API.
+token_name = Token navn
+generate_token = Generer token
+generate_token_success = Dit nye token er blevet genereret. Kopier den nu, da den ikke vises igen.
+delete_token = Slet
+access_token_deletion = Slet adgangstoken
+access_token_deletion_desc = Sletning af et token vil tilbagekalde adgangen til din konto for applikationer, der bruger den. Dette kan ikke fortrydes. Fortsætte?
+repo_and_org_access = Depot og organisationsadgang
+permissions_public_only = Kun offentlig
+permissions_access_all = Alle (offentlige, private og begrænsede)
+select_permissions = Vælg tilladelser
+permission_no_access = Ingen adgang
+permission_read = Læs
+permission_write = Læs og skriv
+permissions_list = Tilladelser:
+manage_oauth2_applications = Administrer OAuth2-applikationer
+edit_oauth2_application = Rediger OAuth2-applikation
+add_email_success = Den nye e-mailadresse er blevet tilføjet.
+key_content_ssh_placeholder = Begynder med "ssh-ed25519", "ssh-rsa", "ecdsa-sha2-nistp256", "ecdsa-sha2-nistp384", "ecdsa-sha2-nistp521", "sk-ecdsa-sha2-nistp256@openssh.com", eller "sk-ssh-ed25519@openssh.com"
+gpg_key_matched_identities_long = De indlejrede identiteter i denne nøgle matcher de følgende aktiverede e-mailadresser for denne bruger. Commits, der matcher disse e-mailadresser, kan bekræftes med denne nøgle.
+gpg_key_deletion_success = GPG-nøglen er blevet fjernet.
+email_preference_set_success = E-mail-præference er blevet indstillet.
+keep_email_private_popup = Din e-mailadresse vil ikke blive vist på din profil og vil ikke være standard for commits foretaget via webgrænsefladen, som f.eks. filupload, redigeringer og merge commits. I stedet kan en speciel adresse %s bruges til at linke commits til din konto. Denne mulighed vil ikke påvirke eksisterende commits.
+gpg_desc = Disse offentlige GPG-nøgler er knyttet til din konto og bruges til at bekræfte dine commits. Opbevar dine private nøgler sikkert, da de giver dig mulighed for at underskrive commits med din identitet.
+gpg_token_help = Du kan generere en signatur ved at bruge:
+ssh_key_verified_long = Nøglen er blevet bekræftet med et token og kan bruges til at bekræfte commits, der matcher enhver aktiveret e-mail-adresse for denne bruger.
+ssh_key_deletion_desc = Fjernelse af en SSH-nøgle tilbagekalder dens adgang til din konto. Fortsætte?
+ssh_signonly = SSH er i øjeblikket deaktiveret, så disse nøgler bruges kun til bekræftelse af commit signatur.
+at_least_one_permission = Du skal vælge mindst én tilladelse for at oprette et token
+ssh_key_verify = Bekræft
+ssh_invalid_token_signature = Den angivne SSH-nøgle, signatur eller token stemmer ikke overens, eller token er forældet.
+add_gpg_key_success = GPG-nøglen "%s" er blevet tilføjet.
+valid_forever = Gyldig for evigt
+ssh_disabled = SSH er deaktiveret
+key_state_desc = Denne nøgle er blevet brugt inden for de sidste 7 dage
+generate_token_name_duplicate = %s er allerede blevet brugt som applikationsnavn. Brug venligst en ny.
+delete_token_success = Tokenet er blevet slettet. Applikationer, der bruger den, har ikke længere adgang til din konto.
+access_token_desc = Valgte tokentilladelser begrænser kun autorisation til de tilsvarende API-ruter. Læs dokumentationen for at få flere oplysninger.
+oauth2_applications_desc = OAuth2-applikationer gør det muligt for din tredjepartsapplikation at godkende brugere sikkert i denne Forgejo-instans.
+remove_oauth2_application = Slet OAuth2-applikation
+remove_oauth2_application_desc = Sletning af en OAuth2-applikation vil tilbagekalde adgangen til alle signerede adgangstokens. Vil du fortsætte?
+remove_oauth2_application_success = Ansøgningen er blevet slettet.
+create_oauth2_application = Opret en ny OAuth2-applikation
+create_oauth2_application_button = Opret applikation
+create_oauth2_application_success = Du har oprettet en ny OAuth2-applikation.
+update_oauth2_application_success = Du har opdateret OAuth2-applikationen.
+oauth2_application_name = Applikationsnavn
+oauth2_redirect_uris = Omdiriger URI'er. Brug venligst en ny linje for hver URI.
+save_application = Gem
+oauth2_client_id = Klient ID
+oauth2_client_secret = Klient hemmelighed
+oauth2_regenerate_secret = Genskab hemmeligheden
+oauth2_regenerate_secret_hint = Har du mistet din hemmelighed?
+oauth2_client_secret_hint = Hemmeligheden vil ikke blive vist igen, når du forlader eller opdaterer denne side. Sørg for, at du har gemt den.
+oauth2_application_edit = Redigere
+oauth2_confidential_client = Fortrolig klient. Vælg for apps, der holder hemmeligheden fortrolig, såsom webapps. Vælg ikke for indbyggede apps, herunder desktop- og mobilapps.
+oauth2_application_create_description = OAuth2-applikationer giver din tredjepartsapplikation adgang til brugerkonti på denne instans.
+oauth2_application_remove_description = Fjernelse af en OAuth2-applikation forhindrer den i at få adgang til autoriserede brugerkonti på denne instans. Vil du fortsætte?
+authorized_oauth2_applications = Autoriserede OAuth2-applikationer
+revoke_key = Tilbagekald
+revoke_oauth2_grant = Tilbagekald adgang
+revoke_oauth2_grant_description = Tilbagekaldelse af adgang for denne tredjepartsapplikation forhindrer denne applikation i at få adgang til dine data. Er du sikker?
+revoke_oauth2_grant_success = Adgangen blev tilbagekaldt.
+twofa_desc = For at beskytte din konto mod adgangskodetyveri kan du bruge en smartphone eller en anden enhed til at modtage tidsbaserede engangsadgangskoder ("TOTP").
+twofa_is_enrolled = Din konto er i øjeblikket tilmeldt til tofaktorgodkendelse.
+twofa_not_enrolled = Din konto er i øjeblikket ikke tilmeldt to-faktor-godkendelse.
+twofa_disable = Deaktiver to-faktor-godkendelse
+twofa_scratch_token_regenerate = Gendan engangsgendannelsesnøgle
+twofa_scratch_token_regenerated = Din gendannelsesnøgle til engangsbrug er nu %s. Opbevar det et sikkert sted, da det ikke vil blive vist igen.
+twofa_enroll = Tilmeld dig to-faktor-godkendelse
+twofa_recovery_tip = Hvis du mister din enhed, vil du være i stand til at bruge en gendannelsesnøgle til engangsbrug for at få adgang til din konto igen.
+oauth2_application_locked = Forgejo forhåndsregistrerer nogle OAuth2-applikationer ved opstart, hvis det er aktiveret i config. For at forhindre uventet adfærd kan disse hverken redigeres eller fjernes. Se venligst OAuth2-dokumentationen for at få flere oplysninger.
+authorized_oauth2_applications_description = Du har givet adgang til din personlige Forgejo-konto til disse tredjepartsapplikationer. Tilbagekald venligst adgangen for applikationer, der ikke længere er i brug.
+manage_account_links = Tilknyttede konti
+manage_account_links_desc = Disse eksterne konti er knyttet til din Forgejo-konto.
+link_account = Link konto
+remove_account_link = Slet linket konto
+remove_account_link_desc = Fjernelse af en tilknyttet konto vil tilbagekalde dens adgang til din Forgejo-konto. Vil du fortsætte?
+remove_account_link_success = Den tilknyttede konto er blevet fjernet.
+twofa_disable_note = Du kan deaktivere to-faktor-godkendelse, hvis det er nødvendigt.
+twofa_disable_desc = Deaktivering af to-faktor-godkendelse vil gøre din konto mindre sikker. Vil du fortsætte?
+regenerate_scratch_token_desc = Hvis du har forlagt din gendannelsesnøgle eller allerede har brugt den til at logge på, kan du nulstille den her.
+twofa_disabled = To-faktor-godkendelse er blevet deaktiveret.
+scan_this_image = Scan dette billede med din godkendelsesapplikation:
+then_enter_passcode = Og indtast adgangskoden vist i applikationen:
+passcode_invalid = Passkoden er forkert. Prøv igen.
+twofa_enrolled = Din konto er blevet tilmeldt. Opbevar din gendannelsesnøgle til engangsbrug (%s) et sikkert sted, da den ikke vil blive vist igen.
+twofa_failed_get_secret = Det lykkedes ikke at få hemmelig-koden.
+or_enter_secret = Eller indtast hemmelig-koden: %s
+webauthn_desc = Sikkerhedsnøgler er hardwareenheder, der indeholder kryptografiske nøgler. De kan bruges til to-faktor-godkendelse. Sikkerhedsnøgler skal understøtte WebAuthn Authenticator-standarden.
+webauthn_register_key = Tilføj sikkerhedsnøgle
+webauthn_nickname = Kaldenavn
+webauthn_delete_key = Slet sikkerhedsnøglen
+webauthn_delete_key_desc = Hvis du sletter en sikkerhedsnøgle, kan du ikke længere logge ind med den. Vil du fortsætte?
+webauthn_key_loss_warning = Hvis du mister dine sikkerhedsnøgler, mister du adgangen til din konto.
+webauthn_alternative_tip = Du vil måske gerne konfigurere en ekstra godkendelsesmetode.
+hooks.desc = Tilføj webhooks, som vil blive udløst for alle depoter, som du ejer.
+orgs_none = Du er ikke medlem af nogen organisationer.
+repos_none = Du ejer ikke nogen depoter.
+delete_account = Slet din konto
+delete_prompt = Denne handling vil permanent slette din brugerkonto. Det KAN IKKE fortrydes.
+confirm_delete_account = Bekræft sletning
+email_notifications.enable = Aktiver e-mail-notifikationer
+email_notifications.onmention = Kun e-mail ved omtale
+email_notifications.disable = Deaktiver e-mail-notifikationer
+email_notifications.submit = Indstil e-mail-præference
+email_notifications.andyourown = Og dine egne notifikationer
+visibility = Brugersynlighed
+visibility.public = Offentlig
+visibility.public_tooltip = Synlig for alle
+visibility.limited_tooltip = Kun synlig for brugere, der er logget ind
+visibility.private = Privat
+blocked_since = Blokeret siden %s
+user_unblock_success = Blokeringen af brugeren er blevet fjernet.
+user_block_success = Brugeren er blevet blokeret.
+blocked_users_none = Der er ingen blokerede brugere.
+visibility.limited = Begrænset
+delete_account_desc = Er du sikker på, at du vil slette denne brugerkonto permanent?
+visibility.private_tooltip = Kun synlig for medlemmer af organisationer, du har tilsluttet dig
+delete_with_all_comments = Din konto er yngre end %s. For at undgå spøgelseskommentarer slettes alle problemer/PR-kommentarer med kontoen.
+delete_account_title = Slet brugerkonto
+user_block_yourself = Du kan ikke blokere dig selv.
+pronouns_custom_label = Brugerdefinerede stedord
+
+[repo]
+rss.must_be_on_branch = Du skal være på en gren for at have et RSS-feed.
+admin.manage_flags = Administrer flag
+admin.enabled_flags = Flag aktiveret for depotet:
+admin.update_flags = Opdater flag
+admin.flags_replaced = Depot flag udskiftet
+owner = Ejer
+owner_helper = Nogle organisationer vises muligvis ikke i dropdown-menuen på grund af en maksimal grænse for optælling af depoter.
+repo_name = Depot navn
+repo_name_helper = Gode depotnavne bruger korte, mindeværdige og unikke nøgleord.
+repo_size = Depotstørrelse
+size_format = %[1]s: %[2]s, %[3]s: %[4]s
+template = Skabelon
+template_select = Vælg en skabelon
+template_helper = Gør depot til en skabelon
+visibility = Synlighed
+visibility_helper = Gør depotet privat
+visibility_helper_forced = Din webstedsadministrator tvinger nye depoter til at være private.
+clone_helper = Har du brug for hjælp til kloning? Besøg Hjælp.
+fork_repo = Fork depot
+fork_from = Fork fra
+already_forked = Du har allerede forked %s
+fork_to_different_account = Fork til en anden konto
+fork_branch = Gren, der skal klones til fork
+all_branches = Alle grene
+fork_no_valid_owners = Dette depot kan ikke blive forked, fordi der ikke er nogen gyldige ejere.
+use_template = Brug denne skabelon
+open_with_editor = Åben med %s
+download_zip = Download ZIP
+download_tar = Download TAR.GZ
+download_bundle = Download BUNDLE
+generate_repo = Generer depot
+generate_from = Generer fra
+repo_desc = Beskrivelse
+repo_lang = Sprog
+repo_gitignore_helper = Vælg .gitignore skabeloner
+issue_labels = Etiketter
+issue_labels_helper = Vælg et etiketsæt
+license = Licens
+object_format = Objektformat
+object_format_helper = Objektformatet for depotet. Kan ikke ændres senere. SHA1 er den mest kompatible.
+readme = LÆSMIG
+readme_helper = Vælg en LÆSMIG-filskabelon
+readme_helper_desc = Dette er stedet, hvor du kan skrive en komplet beskrivelse af dit projekt.
+auto_init = Initialiser depot
+create_repo = Opret depot
+default_branch = Standard gren
+default_branch_label = standard
+default_branch_helper = Standardgrenen er basegrenen for pull-anmodninger og kode-commits.
+mirror_prune = Prune
+mirror_prune_desc = Slet forældede referencer til fjernsporing
+mirror_interval = Spejlinterval (gyldige tidsenheder er "h", "m", "s"). 0 for at deaktivere periodisk synkronisering. (Minimumsinterval: %s)
+mirror_interval_invalid = Spejlintervallet er ikke gyldigt.
+mirror_use_ssh.text = Brug SSH-godkendelse
+mirror_use_ssh.not_available = SSH-godkendelse er ikke tilgængelig.
+mirror_denied_combination = Kan ikke bruge offentlig nøgle- og adgangskodebaseret godkendelse i kombination.
+mirror_sync = synkroniseret
+mirror_sync_on_commit = Synkroniser når commits er pushed
+mirror_address = Klon fra URL
+mirror_address_desc = Angiv eventuelle nødvendige legitimationsoplysninger i sektionen Autorisation.
+mirror_address_url_invalid = Den angivne URL er ugyldig. Du skal escape alle komponenter i URL'en korrekt.
+mirror_lfs = Stort fillager (LFS)
+mirror_lfs_desc = Aktiver spejling af LFS-data.
+mirror_lfs_endpoint = LFS-endepunkt
+mirror_last_synced = Sidst synkroniseret
+mirror_password_placeholder = (Uændret)
+mirror_password_blank_placeholder = (Usat)
+mirror_password_help = Skift brugernavn for at slette en gemt adgangskode.
+watchers = Observatører
+stargazers = Stjernekiggere
+stars_remove_warning = Dette vil fjerne alle stjerner fra dette depot.
+forks = Forks
+stars = Stjerner
+reactions_more = og %d mere
+unit_disabled = Webstedsadministratoren har deaktiveret denne depotsektion.
+adopt_preexisting_label = Adopter filer
+adopt_preexisting = Adopter allerede eksisterende filer
+adopt_preexisting_content = Opret depot fra %s
+adopt_preexisting_success = Adopterede filer og oprettet depot fra %s
+delete_preexisting_label = Slet
+delete_preexisting = Slet allerede eksisterende filer
+delete_preexisting_content = Slet filer i %s
+delete_preexisting_success = Slettede ikke-adopterede filer i %s
+blame_prior = Se skylden før denne ændring
+blame.ignore_revs.failed = Kunne ikke ignorere revisioner i .git-blame-ignore-revs.
+author_search_tooltip = Viser maksimalt 30 brugere
+tree_path_not_found_commit = Sti %[1]s eksisterer ikke i commit %[2]s
+tree_path_not_found_branch = Sti %[1]s findes ikke i gren %[2]s
+tree_path_not_found_tag = Sti %[1]s findes ikke i tag %[2]s
+transfer.accept = Accepter overførsel
+transfer.accept_desc = Overfør til "%s"
+transfer.reject = Afvis overførsel
+transfer.no_permission_to_accept = Du har ikke tilladelse til at acceptere denne overførsel.
+transfer.no_permission_to_reject = Du har ikke tilladelse til at afvise denne overførsel.
+desc.private = Privat
+desc.public = Offentlig
+desc.template = Skabelon
+desc.archived = Arkiveret
+desc.sha256 = SHA256
+template.items = Skabelonelementer
+template.git_content = Git-indhold (standardgren)
+template.git_hooks = Git hooks
+template.webhooks = Webhooks
+template.topics = Emner
+template.avatar = Avatar
+template.issue_labels = Problem etiketter
+template.one_item = Skal vælge mindst ét skabelonelement
+template.invalid = Skal vælge et skabelondepot
+admin.failed_to_replace_flags = Det lykkedes ikke at erstatte depot flag
+repo_desc_helper = Indtast en kort beskrivelse (valgfrit)
+mirror_use_ssh.helper = Forgejo vil spejle depotet via Git over SSH og oprette et nøglepar til dig, når du vælger denne mulighed. Du skal sikre dig, at den genererede offentlige nøgle er autoriseret til at pushe til destinationsdepotet. Du kan ikke bruge adgangskodebaseret godkendelse, når du vælger dette.
+adopt_search = Indtast brugernavn for at søge efter ikke-adopterede depoter... (lad stå tomt for at finde alle)
+fork_visibility_helper = Synligheden af et forked depot kan ikke ændres.
+license_helper = Vælg en licensfil
+language_other = Andre
+desc.internal = Internt
+visibility_description = Kun ejeren eller organisationens medlemmer, hvis de har rettigheder, vil kunne se det.
+new_repo_helper = Et depot indeholder alle projektfiler, inklusive revisionshistorik. Er du allerede vært for en et andet sted? Migrer depot.
+visibility_fork_helper = (Hvis du ændrer dette, vil det påvirke synligheden af alle forks.)
+mirror_lfs_endpoint_desc = Synkronisering vil forsøge at bruge klon-url'en til at bestemme LFS-serveren. Du kan også angive et brugerdefineret endepunkt, hvis depots LFS-data er gemt et andet sted.
+template_description = Skabelondepoter lader brugere generere nye depoter med samme mappestruktur, filer og valgfri indstillinger.
+repo_gitignore_helper_desc = Vælg, hvilke filer der ikke skal spores, fra en liste over skabeloner til almindelige sprog. Typiske artefakter genereret af hvert sprogs byggeværktøjer er inkluderet på .gitignore som standard.
+license_helper_desc = En licens styrer, hvad andre kan og ikke kan gøre med din kode. Er du i tvivl om, hvilken der passer til dit projekt? Se Vælg en licens.
+template.git_hooks_tooltip = Du er i øjeblikket ikke i stand til at ændre eller fjerne Git hooks, når først de er tilføjet. Vælg kun dette, hvis du har tillid til skabelondepotet.
+mirror_public_key = Offentlig SSH-nøgle
+blame.ignore_revs = Ignorerer revisioner i .git-blame-ignore-revs. Klik her for at omgå og se den normale skyldvisning.
+mirror_address_protocol_invalid = Den angivne URL er ugyldig. Kun http(s):// eller git:// placeringer kan bruges til spejling.
+transfer.reject_desc = Annuller overførsel til "%s"
+archive.title = Dette depot er arkiveret. Du kan se filer og klone dem, men du kan ikke pushe eller åbne problemer eller pull-anmodninger.
+archive.title_date = Dette depot er blevet arkiveret på %s. Du kan se filer og klone dem, men du kan ikke pushe eller åbne problemer eller pull-anmodninger.
+archive.issue.nocomment = Denne depot er arkiveret. Du kan ikke kommentere på problemer.
+form.reach_limit_of_creation_1 = Ejeren har allerede nået grænsen på %d depot.
+form.reach_limit_of_creation_n = Ejeren har allerede nået grænsen på %d depoterne.
+form.name_reserved = Depotnavnet "%s" er reserveret.
+form.string_too_long = Den givne streng er længere end %d tegn.
+need_auth = Autorisation
+migrate_options = Migrationsmuligheder
+migrate_options_mirror_helper = Dette depot vil være et spejl
+migrate_options_lfs = Migrer LFS-filer
+migrate_options_lfs_endpoint.label = LFS endepunkt
+migrate_options_lfs_endpoint.description.local = En lokal serversti understøttes også.
+migrate_items = Migration Elementer
+migrate_items_wiki = Wiki
+migrate_items_milestones = Milepæle
+migrate_items_labels = Etiketter
+migrate_items_issues = Problemmer
+migrate_items_pullrequests = Pull-anmodninger
+migrate_items_merge_requests = Flet anmodninger
+migrate_items_releases = Udgivelser
+migrate_repo = Migrer depot
+migrate.clone_address_desc = HTTP(S) eller Git "klone" URL'en for et eksisterende lager
+migrate.clone_local_path = eller en lokal serversti
+migrate.permission_denied = Du har ikke tilladelse til at importere lokale depoter.
+migrate.permission_denied_blocked = Du kan ikke importere fra ikke-tilladte værter. Bed venligst administratoren om at kontrollere ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS indstillingerne.
+migrate.invalid_local_path = Den lokale sti er ugyldig. Den eksisterer ikke eller er ikke en mappe.
+migrate.invalid_lfs_endpoint = LFS-endepunktet er ikke gyldigt.
+migrate.failed = Migrering mislykkedes: %v
+migrate.migrate_items_options = Adgangstoken er påkrævet for at migrere yderligere elementer
+migrated_from_fake = Migreret fra %[1]s
+migrate.migrate = Migrer fra %s
+migrate.migrating = Migrerer fra %s ...
+migrate.migrating_failed = Migrering fra %s mislykkedes.
+migrate.migrating_failed.error = Kunne ikke migrere: %s
+migrate.migrating_failed_no_addr = Migration mislykkedes.
+migrate.git.description = Migrer kun et depot fra enhver Git-tjeneste.
+migrate.gitlab.description = Migrer data fra gitlab.com eller andre GitLab-instanser.
+migrate.forgejo.description = Migrer data fra codeberg.org eller andre Forgejo-instanser.
+migrate.gogs.description = Migrer data fra notabug.org eller andre Gogs-instanser.
+migrate.codebase.description = Migrer data fra codebasehq.com.
+migrate.migrating_git = Migrering af Git-data
+migrate.migrating_topics = Migrering af emner
+migrate.migrating_milestones = Migrerende milepæle
+migrate.migrating_labels = Migrering af etiketter
+migrate.migrating_releases = Migrering af udgivelser
+migrate.migrating_issues = Migrering af problemer
+migrate.migrating_pulls = Migrering af pull-anmodninger
+migrate.cancel_migrating_title = Annuller migrering
+mirror_from = spejl af
+forked_from = forked fra
+generated_from = genereret fra
+fork_from_self = Du kan ikke forke et depot, du ejer.
+migrate.onedev.description = Migrer data fra code.onedev.io eller andre OneDev-instanser.
+archive.pull.nocomment = Denne depot er arkiveret. Du kan ikke kommentere på pull-anmodninger.
+migrated_from = Migreret fra %[2]s
+migrate.gitea.description = Migrer data fra gitea.com eller andre Gitea-instanser.
+migrate.gitbucket.description = Migrer data fra GitBucket-instanser.
+migrate.github_token_desc = Du kan sætte et eller flere tokens med kommasepareret her for at gøre migreringen hurtigere på grund af GitHub API-hastighedsgrænsen. ADVARSEL: Misbrug af denne funktion kan overtræde tjenesteudbyderens politik og føre til kontoblokering.
+migrate_options_lfs_endpoint.description = Migration vil forsøge at bruge din fjern-Git til at bestemme LFS-serveren. Du kan også angive et brugerdefineret slutpunkt, hvis lagerets LFS-data er gemt et andet sted.
+form.name_pattern_not_allowed = Mønsteret "%s" er ikke tilladt i et depotnavn.
+migrate_options_lfs_endpoint.placeholder = Hvis det efterlades tomt, vil endepunktet blive afledt fra klonens URL
+migrate.clone_address = Migrer / Klon fra URL
+migrate.github.description = Migrer data fra github.com eller GitHub Enterprise server.
+migrate.cancel_migrating_confirm = Vil du annullere denne migrering?
+more_operations = Flere operationer
+new_from_template = Brug en skabelon
+new_from_template_description = Du kan vælge en eksisterende depotskabelon på denne instans og anvende dens indstillinger.
+new_advanced = Avancerede indstillinger
+new_advanced_expand = Klik for at udvide
+auto_init_description = Start Git-historikken med en LÆSMIG og tilføj eventuelt licens- og .gitignore-filer.
+unwatch = Fjern overvågning
+star = Stjerne
+unstar = Fjern stjerne
+fork = Fork
+download_archive = Download depot
+no_desc = Ingen beskrivelse
+code = Kode
+audio_not_supported_in_browser = Din browser understøtter ikke HTML5 "audio"-tagget.
+clone_this_repo = Klon dette depot
+create_new_repo_command = Oprettelse af et nyt depot på kommandolinjen
+push_exist_repo = Push et eksisterende depot fra kommandolinjen
+empty_message = Dette depot indeholder ikke noget indhold.
+code.desc = Få adgang til kildekode, filer, commits og grene.
+branch = Gren
+tree = Træ
+clear_ref = `Ryd nuværende reference`
+find_tag = Find tag
+branches = Grene
+tag = Tag
+tags = Tags
+issues = Problemer
+pulls = Pull-anmodninger
+project = Projekter
+file_permalink = Permalink
+file_too_large = Filen er for stor til at blive vist.
+ambiguous_runes_header = `Denne fil indeholder tvetydige Unicode-tegn`
+ambiguous_runes_description = `Denne fil indeholder Unicode-tegn, der kan forveksles med andre tegn. Hvis du tror, at dette er med vilje, kan du roligt ignorere denne advarsel. Brug Escape-knappen til at afsløre dem.`
+invisible_runes_line = `Denne linje har usynlige Unicode-tegn`
+ambiguous_runes_line = `Denne linje har tvetydige Unicode-tegn`
+ambiguous_character = `%[1]c [U+%04[1]X] kan forveksles med %[2]c [U+%04[2]X]`
+escape_control_characters = Escape
+unescape_control_characters = Unescape
+file_copy_permalink = Kopiér permalink
+view_git_blame = Se git skyld
+video_not_supported_in_browser = Din browser understøtter ikke HTML5 "video"-tagget.
+stored_lfs = Lagret med Git LFS
+symbolic_link = Symbolsk link
+executable_file = Eksekverbar fil
+vendored = Vendored
+generated = Genereret
+commit_graph = Commit graf
+commit_graph.select = Vælg grene
+commit_graph.hide_pr_refs = Skjul pull-anmodninger
+commit_graph.monochrome = Mono
+commit_graph.color = Farve
+commit.contained_in = Denne commit er indeholdt i:
+commit.contained_in_default_branch = Denne commit er en del af standardgrenen
+commit.load_referencing_branches_and_tags = Indlæs grene og tags, der refererer til denne commit
+blame = Skyld
+download_file = Download fil
+normal_view = Normal visning
+line = linje
+lines = linjer
+from_comment = (kommentar)
+no_eol.text = Ingen EOL
+no_eol.tooltip = Denne fil indeholder ikke et afsluttende linjesluttegn.
+editor.add_file = Tilføj fil
+editor.new_file = Ny fil
+editor.upload_file = Upload fil
+editor.edit_file = Rediger fil
+editor.preview_changes = Forhåndsvisning af ændringer
+editor.cannot_edit_lfs_files = LFS-filer kan ikke redigeres i webgrænsefladen.
+editor.cannot_edit_non_text_files = Binære filer kan ikke redigeres i webgrænsefladen.
+editor.edit_this_file = Rediger fil
+editor.this_file_locked = Filen er låst
+editor.must_be_on_a_branch = Du skal være på en gren for at foretage eller foreslå ændringer til denne fil.
+editor.fork_before_edit = Du skal fork dette depot for at foretage eller foreslå ændringer til denne fil.
+editor.delete_this_file = Slet fil
+editor.must_have_write_access = Du skal have skriveadgang for at foretage eller foreslå ændringer til denne fil.
+filter_branch_and_tag = Filtrer gren eller tag
+quick_guide = Hurtig guide
+broken_message = Git-dataene, der ligger til grund for dette depot, kan ikke læses. Kontakt administratoren af denne instans eller slet dette depot.
+invisible_runes_header = `Denne fil indeholder usynlige Unicode-tegn`
+cite_this_repo = Citér dette depot
+invisible_runes_description = `Denne fil indeholder usynlige Unicode-tegn, der ikke kan skelnes for mennesker, men som kan behandles anderledes af en computer. Hvis du tror, at dette er med vilje, kan du roligt ignorere denne advarsel. Brug Escape-knappen til at afsløre dem.`
+fork_guest_user = Log ind for at forke dette depot.
+watch_guest_user = Log ind for at overvåge dette depot.
+watch = Overvåg
+star_guest_user = Log ind for at stjernemarkere dette depot.
+subscribe.issue.guest.tooltip = Log ind for at abonnere på dette problem.
+subscribe.pull.guest.tooltip = Log ind for at abonnere på denne pull-anmodning.
+release = Udgivelse
+releases = Udgivelser
+packages = Pakker
+actions = Handlinger
+labels = Etiketter
+milestones = Milepæle
+n_commit_few = %s commits
+n_branch_one = %s gren
+n_branch_few = %s grene
+org_labels_desc_manage = Styr
+commits = Commits
+commit = Commit
+org_labels_desc = Etiketter på organisationsniveau, der kan bruges med alle depoter under denne organisation
+n_commit_one = %s commit
+n_release_few = %s udgivelser
+released_this = udgivet dette
+file.title = %s ved %s
+file_raw = Rå
+file_follow = Følg symbollink
+editor.or = eller
+editor.fail_to_update_file_summary = Fejlmeddelelse:
+editor.push_rejected_summary = Fuldstændig afvisningsmeddelelse:
+editor.add_subdir = Tilføj en mappe…
+editor.unable_to_upload_files = Kunne ikke uploade filer til "%s" med fejl: %v
+n_tag_one = %s tag
+n_tag_few = %s tags
+n_release_one = %s udgivelse
+file_history = Historie
+file_view_source = Se kilde
+file_view_rendered = Vis gengivet
+file_view_raw = Vis rå
+editor.file_delete_success = Filen "%s" er blevet slettet.
+editor.name_your_file = Navngiv din fil…
+editor.filename_help = Tilføj en mappe ved at skrive dens navn efterfulgt af en skråstreg ("/"). Fjern en mappe ved at skrive backspace i begyndelsen af inputfeltet.
+editor.cancel_lower = Annuller
+editor.commit_signed_changes = Commit underskrevne ændringer
+editor.file_is_a_symlink = `"%s" er et symbolsk link. Symbolske links kan ikke redigeres i webeditoren`
+editor.filename_is_a_directory = Filnavnet "%s" er allerede brugt som et mappenavn i dette depot.
+editor.upload_file_is_locked = Filen "%s" er låst af %s.
+editor.upload_files_to_dir = Upload filer til "%s"
+editor.cannot_commit_to_protected_branch = Kan ikke commit til den beskyttede gren "%s".
+editor.no_commit_to_branch = Kan ikke commit direkte til grenen fordi:
+editor.user_no_push_to_branch = Brugeren kan ikke push til gren
+editor.require_signed_commit = Gren kræver en underskrevet commit
+editor.cherry_pick = Kirsebær-pluk %s på:
+editor.revert = Vend %s tilbage til:
+commits.desc = Gennemse kildekodens ændringshistorik.
+commits.commits = Commits
+commits.no_commits = Ingen commits til fælles. "%s" og "%s" har helt forskellige historier.
+commits.nothing_to_compare = Disse grene er ens.
+commits.search.tooltip = Du kan præfikse nøgleord med "forfatter:", "committer:", "efter:" eller "før:", f.eks. "vend forfatter:Alice før:2019-01-13".
+commits.search_branch = Denne gren
+commits.search_all = Alle grene
+commits.author = Forfatter
+commits.gpg_key_id = GPG nøgle-id
+commits.ssh_key_fingerprint = SSH nøgle fingeraftryk
+commits.view_path = Se på dette tidspunkt i historien
+commit.operations = Operationer
+commit.revert = Revert
+commit.revert-header = Revert: %s
+commit.revert-content = Vælg gren for at revert til:
+editor.directory_is_a_file = Katalognavnet "%s" er allerede brugt som et filnavn i dette depot.
+editor.branch_already_exists = Gren "%s" findes allerede i dette depot.
+editor.filename_cannot_be_empty = Filnavnet må ikke være tomt.
+editor.commit_changes = Commit ændringer
+editor.signoff_desc = Tilføj en Signed-off-by trailer af committeren i slutningen af commit log-meddelelsen.
+editor.commit_directly_to_this_branch = Commit direkte til %[1]s-grenen.
+editor.add_tmpl = Tilføj "<%s>"
+editor.add_tmpl.filename = filnavn
+editor.add = Tilføj %s
+editor.update = Opdater %s
+editor.delete = Slet %s
+editor.patch = Påfør patch
+editor.patching = Patching:
+editor.fail_to_apply_patch = Kan ikke anvende patch "%s"
+editor.new_patch = Nyt patch
+editor.commit_message_desc = Tilføj en valgfri udvidet beskrivelse…
+editor.create_new_branch = Opret en ny gren til denne commit og start en pull-anmodning.
+editor.create_new_branch_np = Opret en ny gren til denne commit.
+editor.propose_file_change = Foreslå filændring
+editor.new_branch_name = Navngiv den nye gren for denne commit
+editor.new_branch_name_desc = Ny gren navn…
+editor.cancel = Annuller
+commits.signed_by_untrusted_user_unmatched = Signeret af ikke-pålidelig bruger, der ikke matcher committer
+commits.signed_by = Signeret af
+commits.signed_by_untrusted_user = Signeret af en ikke-pålidelig bruger
+commit.cherry-pick = Kirsebær-pluk
+commit.cherry-pick-header = Kirsebærpluk: %s
+commit.cherry-pick-content = Vælg en gren at kirsebær-pluk på:
+commitstatus.failure = Fiasko
+commitstatus.error = Fejl
+projects.create_success = Projektet "%s" er blevet oprettet.
+projects.title = Titel
+projects.new = Nyt projekt
+projects.new_subheader = Koordiner, spor og opdater dit arbejde ét sted, så projekter forbliver gennemsigtige og planmæssigt.
+editor.filename_is_invalid = Filnavnet er ugyldigt: "%s".
+projects.deletion_desc = Sletning af et projekt fjerner det fra alle relaterede problemer. Vil du fortsætte?
+projects.deletion_success = Projektet er blevet slettet.
+projects.modify = Rediger projekt
+projects.type.none = Intet
+projects.type.basic_kanban = Grundlæggende kanban
+projects.type.bug_triage = Fejltriage
+projects.template.desc = Skabelon
+projects.template.desc_helper = Vælg en projektskabelon for at komme i gang
+projects.column.edit = Rediger kolonne
+projects.column.set_default_desc = Indstil denne kolonne som standard for ukategoriserede problemer og pulls
+projects.column.delete = Slet kolonne
+projects.column.deletion_desc = Sletning af en projektkolonne flytter alle relaterede problemer til standardkolonnen. Vil du fortsætte?
+projects.column.color = Farve
+projects.open = Åben
+projects.close = Luk
+projects.column.assigned_to = Tildelt til
+projects.card_type.desc = Forhåndsvisninger af kort
+projects.card_type.images_and_text = Billeder og tekst
+projects.card_type.text_only = Kun tekst
+issues.desc = Organiser fejlrapporter, opgaver og milepæle.
+editor.invalid_commit_mail = Ugyldig mail til oprettelse af en commit.
+editor.branch_does_not_exist = Gren "%s" findes ikke i dette depot.
+editor.file_editing_no_longer_exists = Filen, der redigeres, "%s", findes ikke længere i dette depot.
+projects.column.edit_title = Navn
+projects.column.new_title = Navn
+projects.column.new_submit = Opret kolonne
+projects.column.new = Ny kolonne
+projects.column.set_default = Indstil standard
+editor.file_deleting_no_longer_exists = Filen, der slettes, "%s", eksisterer ikke længere i dette depot.
+editor.no_changes_to_show = Der er ingen ændringer at vise.
+editor.fail_to_update_file = Kunne ikke opdatere/oprette filen "%s".
+editor.push_rejected_no_message = Ændringen blev afvist af serveren uden en besked. Tjek venligst Git hooks.
+editor.push_rejected = Ændringen blev afvist af serveren. Tjek venligst Git hooks.
+projects.create = Opret projekt
+projects.deletion = Slet projekt
+projects.edit = Rediger projekt
+projects.edit_subheader = Projekter organiserer problemer og sporer fremskridt.
+projects.edit_success = Projekt "%s" er blevet opdateret.
+issues.new.no_label = Ingen etiketter
+issues.new.clear_labels = Tydelige etiketter
+issues.new.projects = Projekter
+issues.new.clear_projects = Ryd projekter
+issues.new.no_projects = Intet projekt
+issues.new.open_projects = Åben projekter
+issues.new.closed_projects = Lukkede projekter
+issues.new.no_items = Ingen elementer
+issues.new.milestone = Milepæl
+issues.new.no_milestone = Ingen milepæl
+issues.filter_assignees = Filter tildelt
+issues.filter_milestones = Filter Milepæl
+issues.filter_projects = Filter projekt
+issues.filter_labels = Filter etiket
+issues.filter_reviewers = Filter anmelder
+issues.new = Nyt problem
+issues.new.title_empty = Titel må ikke være tom
+issues.new.labels = Etiketter
+issues.new.clear_milestone = Ryd milepæl
+issues.new.open_milestone = Åben milepæle
+issues.new.closed_milestone = Lukkede milepæle
+issues.new.assignees = Tilvalgte
+issues.new.clear_assignees = Ryd tildelte
+issues.filter_sort.recentupdate = For nylig opdateret
+issues.filter_sort.leastupdate = Sidst opdateret
+issues.filter_sort.mostcomment = De fleste kommenterede
+issues.filter_sort.leastcomment = Mindst kommenteret
+issues.filter_sort.nearduedate = Nærmeste forfaldsdato
+issues.filter_sort.farduedate = Længste forfaldsdato
+issues.filter_sort.moststars = Flest stjerner
+editor.file_changed_while_editing = Filens indhold er ændret, siden du begyndte at redigere. Klik her for at se dem eller Bekræft ændringer igen for at overskrive dem.
+editor.file_already_exists = En fil med navnet "%s" findes allerede i dette depot.
+editor.commit_id_not_matching = Filen blev ændret, mens du redigerede den. Forpligt dig til en ny gren og merge derefter.
+editor.push_out_of_date = Pushet ser ud til at være forældet.
+editor.commit_empty_file_header = Commit en tom fil
+editor.commit_empty_file_text = Den fil, du er ved at commitere, er tom. Vil du fortsætte?
+commits.message = Besked
+commits.browse_further = Gennemse videre
+commits.renamed_from = Omdøbt fra %s
+commits.date = Dato
+commits.older = Ældre
+commits.newer = Nyere
+issues.new.no_assignees = Ingen tildelte
+issues.new.assign_to_me = Tildel mig
+issues.action_assignee_no_select = Ingen tildelt
+issues.action_check = Marker/fjern markeringen
+issues.action_check_all = Marker/fjern markeringen af alle elementer
+issues.opened_by = åbnet %[1]s af %[3]s
+pulls.merged_by = af %[3]s blev merged %[1]s
+pulls.merged_by_fake = af %[2]s blev merged %[1]s
+issues.closed_by = af %[3]s blev lukket %[1]s
+projects.desc = Håndtere problemer og pulls i projektboards.
+issues.filter_sort.feweststars = Færre stjerner
+issues.action_assignee = Tildelte
+commitstatus.success = Succes
+ext_issues = Eksterne problemer
+projects = Projekter
+projects.description = Beskrivelse (valgfrit)
+projects.description_placeholder = Beskrivelse
+issues.new.no_reviewers = Ingen anmeldere
+issues.choose.get_started = Kom godt i gang
+issues.choose.open_external_link = Åben
+issues.choose.blank = Standard
+issues.choose.blank_about = Opret et problem fra standardskabelon.
+issues.choose.ignore_invalid_templates = Ugyldige skabeloner er blevet ignoreret
+issues.filter_sort.mostforks = Fleste forks
+issues.filter_sort.fewestforks = Mindste forks
+issues.action_open = Åben
+issues.action_close = Lukket
+issues.action_label = Etiket
+issues.action_milestone_no_select = Ingen milepæl
+commitstatus.pending = Afventer
+issues.edit.already_changed = Kunne ikke gemme ændringer af problemet. Det ser ud til, at indholdet allerede er blevet ændret af en anden bruger. Opdater siden, og prøv at redigere igen for at undgå at overskrive deres ændringer
+issues.action_milestone = Milepæl
+issues.comment_pull_merged_at = merged commit %[1]s ind i %[2]s %[3]s
+issues.comment_manually_pull_merged_at = manuelt merged commit %[1]s into %[2]s %[3]s
+issues.context.edit = Redigere
+issues.context.delete = Slet
+issues.no_content = Ingen beskrivelse angivet.
+issues.close = Luk problem
+
+summary_card_alt = Oversigtskort for depot %s
+issues.choose.invalid_templates = %v ugyldig(e) skabelon(er) fundet
+issues.choose.invalid_config = Problemkonfigurationen indeholder fejl:
+issues.no_ref = Ingen gren/tag angivet
+issues.create = Opret problem
+issues.new_label = Ny etiket
+issues.new_label_placeholder = Etiketnavn
+issues.new_label_desc_placeholder = Beskrivelse
+issues.create_label = Opret etiket
+issues.label_templates.title = Indlæs en etiketforudindstilling
+issues.label_templates.info = Der findes endnu ingen etiketter. Opret en etiket med "Ny etiket", eller brug en etiketforudindstilling:
+issues.label_templates.helper = Vælg en etiketforudindstilling
+issues.label_templates.use = Brug etiketforudindstilling
+issues.label_templates.fail_to_load_file = Kunne ikke indlæse etiketskabelonfilen "%s": %v
+issues.add_label = tilføjede %s etiketten %s
+issues.add_labels = tilføjede %s etiketterne %s
+issues.remove_label = fjernede %s etiketten %s
+issues.remove_labels = fjernede %s etiketterne %s
+issues.add_remove_labels = tilføjede %s og fjernede %s etiketter %s
+issues.add_milestone_at = `føjede dette til %s milepælen %s`
+issues.add_project_at = `føjede dette til %s- projektet %s`
+issues.change_milestone_at = "ændrede milepælen fra %s til %s %s"
+issues.change_project_at = `modificerede projektet fra %s til %s %s`
+issues.remove_milestone_at = `fjernede dette fra %s milepælen %s`
+issues.remove_project_at = `fjernede dette fra %s-projektet %s`
+issues.deleted_milestone = `(slettet)`
+issues.deleted_project = `(slettet)`
+issues.self_assign_at = `selv tildelt denne %s".
+issues.add_assignee_at = `blev tildelt af %s %s`
+issues.remove_assignee_at = `blev utildelt af %s %s`
+issues.remove_self_assignment = `fjernede deres opgave %s`
+issues.change_title_at = `ændret titel fra %s til %s %s`
+issues.change_ref_at = `ændret reference fra %s til %s %s`
+issues.remove_ref_at = `fjernet reference %s %s`
+issues.add_ref_at = `tilføjet reference %s %s`
+issues.delete_branch_at = `slettet gren %s %s`
+issues.filter_label = Etiket
+issues.filter_label_exclude = `Brug alt + klik/enter for at ekskludere etiketter`
+issues.filter_label_no_select = Alle etiketter
+issues.filter_label_select_no_label = Ingen etiket
+issues.filter_milestone = Milepæl
+issues.filter_milestone_all = Alle milepæle
+issues.filter_milestone_none = Ingen milepæle
+issues.filter_milestone_open = Åbne milepæle
+issues.filter_milestone_closed = Lukkede milepæle
+issues.filter_project = Projekt
+issues.filter_project_all = Alle projekter
+issues.filter_project_none = Intet projekt
+issues.filter_assignee = Tildelte
+issues.filter_assginee_no_select = Alle tildelte
+issues.filter_assginee_no_assignee = Ingen tildelte
+issues.filter_poster = Forfatter
+issues.filter_poster_no_select = Alle forfattere
+issues.filter_type = Type
+issues.filter_type.all_issues = Alle problemer
+issues.filter_type.assigned_to_you = Tildelt til dig
+issues.filter_type.created_by_you = Oprettet af dig
+issues.filter_type.mentioning_you = Nævnte dig
+issues.filter_type.review_requested = Gennemgang anmodet om
+issues.filter_type.reviewed_by_you = Gennemgået af dig
+issues.filter_sort = Sortere
+issues.filter_sort.relevance = Relevans
+issues.filter_sort.latest = Nyeste
+issues.filter_sort.oldest = Ældste
+issues.opened_by_fake = åbnet %[1]s af %[2]s
+issues.closed_by_fake = af %[2]s var lukket %[1]s
+issues.previous = Tidligere
+issues.next = Næste
+issues.open_title = Åben
+issues.closed_title = Lukket
+issues.all_title = Alle
+issues.draft_title = Udkast
+issues.num_comments_1 = %d kommentar
+issues.num_comments = %d kommentarer
+issues.num_reviews_one = %d gennemgang
+issues.num_reviews_few = %d gennemganger
+issues.commented_at = `kommenterede %s`
+issues.delete_comment_confirm = Er du sikker på, at du vil slette denne kommentar?
+issues.reaction.add = Tilføj reaktion
+issues.reaction.alt_few = %[1]s reagerede %[2]s.
+issues.reaction.alt_many = %[1]s og %[2]d mere reagerede %[3]s.
+issues.reaction.alt_remove = Fjern %[1]s reaktion fra kommentar.
+issues.reaction.alt_add = Tilføj %[1]s reaktion til kommentar.
+issues.context.menu = Kommentar menu
+issues.context.copy_link = Kopiér link
+issues.context.quote_reply = Citat svar
+issues.context.reference_issue = Reference i nyt problem
+issues.close_comment_issue = Luk med kommentar
+issues.reopen_issue = Genåben
+issues.reopen_comment_issue = Genåbner med kommentar
+issues.create_comment = Kommentar
+issues.closed_at = `lukkede dette problem %[2]s`
+issues.reopened_at = `genåbnede dette problem %[2]s`
+issues.commit_ref_at = `henviste til dette problem fra en commit %[2]s`
+issues.ref_issue_from = `henviste til dette problem %[4]s%[2 ]s`
+issues.ref_pull_from = `henviste til denne pull-anmodning %[4]s%[ 2]s`
+issues.ref_closing_from = `henviste til dette problem fra en pull-anmodning %[4]s, der vil lukke det, %[2]s`
+issues.ref_reopening_from = `henviste til dette problem fra en pull-anmodning %[4]s, der vil genåbne den, %[2]s`
+issues.ref_closed_from = `lukkede dette problem %[4]s%[2 ]s`
+issues.ref_reopened_from = `genåbnede dette problem %[4]s%[2 ]s`
+issues.ref_from = `fra %[1]s`
+issues.author = Forfatter
+issues.author.tooltip.issue = Denne bruger er forfatteren til dette problem.
+issues.author.tooltip.pr = Denne bruger er forfatteren af denne pull-anmodning.
+issues.role.owner = Ejer
+issues.role.owner_helper = Denne bruger er ejeren af dette depot.
+issues.role.member = Medlem
+issues.role.member_helper = Denne bruger er medlem af den organisation, der ejer dette depot.
+issues.role.collaborator = Samarbejdspartner
+issues.role.collaborator_helper = Denne bruger er blevet inviteret til at samarbejde om depotet.
+issues.role.first_time_contributor = Førstegangs bidragyder
+issues.role.first_time_contributor_helper = Dette er det første bidrag fra denne bruger til depotet.
+issues.role.contributor = Bidragyder
+issues.role.contributor_helper = Denne bruger har tidligere forpligtet sig i dette depot.
+issues.re_request_review = Anmod om gennemgang igen
+issues.is_stale = Der er sket ændringer i denne PR siden denne gennemgang
+issues.remove_request_review = Fjern anmodning om gennemgang
+issues.remove_request_review_block = Anmodningen om gennemgang kan ikke fjernes
+issues.dismiss_review = Afvis gennemgang
+issues.dismiss_review_warning = Er du sikker på, at du vil afvise denne gennemgang?
+issues.sign_in_require_desc = Log ind for at deltage i denne samtale.
+issues.edit = Redigere
+issues.cancel = Annuller
+issues.save = Gem
+issues.label_title = Navn
+issues.label_description = Beskrivelse
+issues.label_color = Farve
+issues.label_exclusive = Eksklusiv
+issues.label_archive = Arkiver etiketten
+issues.label_archived_filter = Vis arkiverede etiketter
+issues.label_archive_tooltip = Arkiverede etiketter udelukkes som standard fra forslagene, når du søger efter etiket.
+issues.label_exclusive_desc = Navngiv etiketten omfang/element for at gøre den gensidigt udelukkende med andre omfang/ etiketter.
+issues.label_exclusive_warning = Eventuelle modstridende etiketter vil blive fjernet, når etiketterne for et problem eller pull-anmodning redigeres.
+issues.label_count = %d etiketter
+issues.label_open_issues = %d åben problemer/pull-anmodninger
+issues.label_edit = Redigere
+issues.label_delete = Slet
+issues.label_modify = Rediger etiket
+issues.label_deletion = Slet etiket
+issues.label_deletion_desc = Sletning af en etiket fjerner den fra alle problemer. Vil du fortsætte?
+issues.label_deletion_success = Etiketten er blevet slettet.
+
+issues.archived_label_description = (Arkiveret) %s
+issues.label.filter_sort.alphabetically = Alfabetisk
+issues.label.filter_sort.reverse_alphabetically = Omvendt alfabetisk
+issues.label.filter_sort.by_size = Mindste størrelse
+issues.label.filter_sort.reverse_by_size = Største størrelse
+issues.num_participants_one = %d deltager
+issues.num_participants_few = %d deltagere
+issues.attachment.open_tab = `Klik for at se "%s" i en ny fane`
+issues.attachment.download = `Klik for at downloade "%s"`
+issues.subscribe = Abonner
+issues.unsubscribe = Afmeld
+issues.lock_duplicate = Et problem kan ikke låses to gange.
+issues.unlock_error = Kan ikke låse et problem op, der ikke er låst.
+issues.lock_with_reason = låst som %s og begrænset samtale til samarbejdspartnere %s
+issues.lock_no_reason = låst og begrænset samtale til samarbejdspartnere %s
+issues.unlock_comment = låste denne samtale %s op
+issues.lock_confirm = Lås
+issues.unlock_confirm = Lås op
+issues.lock.notice_1 = - Andre brugere kan ikke tilføje nye kommentarer til dette problem.
+
+[notification]
+watching = Overvåger
+
+[action]
+watched_repo = begyndte at overvåge %[2]s
\ No newline at end of file
diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini
index 12c241accc..22dd5f3eb7 100644
--- a/options/locale/locale_de-DE.ini
+++ b/options/locale/locale_de-DE.ini
@@ -749,7 +749,7 @@ webauthn=Hardware-Sicherheitsschlüssel
public_profile=Öffentliches Profil
biography_placeholder=Erzähle anderen ein wenig über dich selbst! (Markdown wird unterstützt)
location_placeholder=Teile deinen ungefähren Standort mit anderen
-profile_desc=Leg fest, wie dein Profil anderen Benutzern angezeigt wird. Deine primäre E-Mail-Adresse wird für Benachrichtigungen, Passwort-Wiederherstellung und webbasierte Git-Operationen verwendet.
+profile_desc=Über dich
password_username_disabled=Benutzer, die nicht von Forgejo verwaltet werden können ihren Benutzernamen nicht ändern. Bitte kontaktiere deinen Administrator für mehr Details.
full_name=Vollständiger Name
website=Webseite
@@ -814,7 +814,7 @@ manage_emails=E-Mail-Adressen verwalten
manage_themes=Standard-Theme
manage_openid=OpenID-Adressen
email_desc=Deine primäre E-Mail-Adresse wird für Benachrichtigungen, Passwort-Wiederherstellung und, sofern sie nicht versteckt ist, web-basierte Git-Operationen verwendet.
-theme_desc=Dies wird dein Standard-Theme auf der Seite sein.
+theme_desc=Dieses Thema wird für die Weboberfläche verwendet, wenn du angemeldet bist.
primary=Primär
activated=Aktiviert
requires_activation=Erfordert Aktivierung
@@ -840,7 +840,7 @@ add_email_success=Die neue E-Mail-Addresse wurde hinzugefügt.
email_preference_set_success=E-Mail-Einstellungen wurden erfolgreich aktualisiert.
add_openid_success=Die neue OpenID-Adresse wurde hinzugefügt.
keep_email_private=E-Mail-Adresse verbergen
-keep_email_private_popup=Dies wird deine E-Mail-Adresse in deinem Profil ausblenden. Sie wird nicht mehr der Standardwert für die Commits, die vom Web-Interface gemacht wurden, sein, z.B. Dateiuploads und -bearbeitungen, und sie wird nicht für Merge-Commits benutzt werden. Stattdessen kann eine besondere Adresse %s benutzt werden, um Commits mit deinem Konto zu assoziieren. Beachte, dass diese Option für existierende Commits keine Wirkung hat.
+keep_email_private_popup=Deine Mailadresse wird nicht in deinem Profil angezeigt und wird nicht der Standard für Commits über das Webinterface sein, wie zum Beispiel Dateiuploads, Bearbeitungen, und Merge-Commits. Stattdessen kann eine besondere Adresse %s benutzt werden, um Commits mit deinem Account zu verbinden. Diese Option wirkt sich nicht auf bestehende Commits aus.
openid_desc=Mit OpenID kannst du dich über einen Drittanbieter authentifizieren.
manage_ssh_keys=SSH-Schlüssel verwalten
@@ -1056,6 +1056,8 @@ language.title = Standardsprache
keep_activity_private.description = Deine öffentliche Aktivität wird nur für dich selbst und die Instanzadminstratoren sichtbar sein.
language.localization_project = Hilf uns, Forgejo in deine Sprache zu übersetzen! Mehr erfahren.
language.description = Diese Sprache wird in deinem Konto gespeichert und standardmäßig nach dem Anmelden benutzt.
+user_block_yourself = Du kannst dich nicht selbst blockieren.
+pronouns_custom_label = Individuelle Pronomen
[repo]
owner=Besitzer
@@ -1097,11 +1099,11 @@ issue_labels=Labels
issue_labels_helper=Wähle eine Label-Sammlung
license=Lizenz
license_helper=Wähle eine Lizenz
-license_helper_desc=Eine Lizenz regelt, was andere mit deinem Code tun (oder nicht tun) können. Unsicher, welches für dein Projekt die Richtige ist? Siehe Choose a license.
+license_helper_desc=Eine Lizenz regelt, was andere mit deinem Code tun (oder nicht tun) können. Unsicher, welches für dein Projekt die Richtige ist? Siehe Choose a license.
readme=README
readme_helper=Wähle eine README-Vorlage
readme_helper_desc=Hier kannst du eine komplette Beschreibung für dein Projekt schreiben.
-auto_init=Repository initialisieren (Fügt .gitignore, License und README-Dateien hinzu)
+auto_init=Repository initialisieren
trust_model_helper=Wähle das Vertrauensmodell für die Signaturvalidierung aus. Mögliche Modelle sind:
trust_model_helper_collaborator=Mitarbeiter: Vertraue Signaturen von Mitarbeitern am Projekt
trust_model_helper_committer=Committer: Vertraue Signaturen, die mit ihren Committern übereinstimmen
@@ -1179,8 +1181,8 @@ template.invalid=Es muss ein Vorlagen-Repository ausgewählt werden
archive.title=Dieses Repository ist archiviert. Du kannst Dateien ansehen und es klonen, kannst aber nicht pushen oder Issues/Pull-Requests öffnen.
archive.title_date=Dieses Repository wurde am %s archiviert. Du kannst Dateien ansehen und es klonen, aber nicht pushen oder Issues/Pull-Requests öffnen.
-archive.issue.nocomment=Dieses Repo ist archiviert. Du kannst Issues nicht kommentieren.
-archive.pull.nocomment=Dieses Repo ist archiviert. Du kannst Pull-Requests nicht kommentieren.
+archive.issue.nocomment=Dieses Repository ist archiviert. Du kannst Issues nicht kommentieren.
+archive.pull.nocomment=Dieses Repository ist archiviert. Du kannst Pull-Requests nicht kommentieren.
form.reach_limit_of_creation_1=Du hast bereits dein Limit von %d Repository erreicht.
form.reach_limit_of_creation_n=Du hast bereits dein Limit von %d Repositorys erreicht.
@@ -1313,6 +1315,8 @@ view_git_blame=„git blame“ ansehen
video_not_supported_in_browser=Dein Browser unterstützt das HTML5-„video“-Tag nicht.
audio_not_supported_in_browser=Dein Browser unterstützt das HTML5-„audio“-Tag nicht.
stored_lfs=Gespeichert mit Git LFS
+stored_annex=Gespeichert mit Git Annex
+stored_annex_not_present = hier nicht vorhanden, versuche git annex whereis
symbolic_link=Softlink
executable_file=Ausführbare Datei
commit_graph=Commit-Graph
@@ -1336,6 +1340,7 @@ editor.upload_file=Datei hochladen
editor.edit_file=Datei bearbeiten
editor.preview_changes=Vorschau der Änderungen
editor.cannot_edit_lfs_files=LFS-Dateien können im Webinterface nicht bearbeitet werden.
+editor.cannot_edit_annex_files=Annex-Dateien können im Webinterface nicht bearbeitet werden.
editor.cannot_edit_non_text_files=Binärdateien können nicht im Webinterface bearbeitet werden.
editor.edit_this_file=Datei bearbeiten
editor.this_file_locked=Datei ist gesperrt
@@ -2490,8 +2495,8 @@ settings.archive.text=Durch das Archivieren wird ein Repo vollständig schreibge
settings.archive.success=Das Repo wurde erfolgreich archiviert.
settings.archive.error=Beim Versuch, das Repository zu archivieren, ist ein Fehler aufgetreten. Weitere Details finden sich im Log.
settings.archive.error_ismirror=Du kannst kein gespiegeltes Repo archivieren.
-settings.archive.branchsettings_unavailable=Branch-Einstellungen sind nicht verfügbar wenn das Repo archiviert ist.
-settings.archive.tagsettings_unavailable=Tag Einstellungen sind nicht verfügbar, wenn das Repo archiviert wurde.
+settings.archive.branchsettings_unavailable=Branch-Einstellungen sind nicht verfügbar in archivierten Repos.
+settings.archive.tagsettings_unavailable=Tag-Einstellungen sind nicht verfügbar in archivierten Repos.
settings.unarchive.button=Archivierung zurücksetzen
settings.unarchive.header=Archivierung dieses Repositorys zurücksetzen
settings.unarchive.text=Durch das Aufheben der Archivierung kann das Repo wieder Commits und Pushes sowie neue Issues und Pull-Requests empfangen.
@@ -2690,7 +2695,7 @@ error.csv.too_large=Diese Datei kann nicht gerendert werden, da sie zu groß ist
error.csv.unexpected=Diese Datei kann nicht gerendert werden, da sie ein unerwartetes Zeichen in Zeile %d und Spalte %d enthält.
error.csv.invalid_field_count=Diese Datei kann nicht gerendert werden, da sie eine falsche Anzahl an Feldern in Zeile %d hat.
rss.must_be_on_branch = Du musst auf einem Branch sein, um einen RSS-Feed zu haben.
-new_repo_helper = Ein Repository enthält alle Projektdateien inklusive der Revisionshistorie. Bereits woanders gehostet? Repository migrieren.
+new_repo_helper = Ein Repository enthält alle Projektdateien inklusive der Revisionshistorie. Bereits woanders gehostet? Repository migrieren.
issues.comment.blocked_by_user = Du kannst kein Kommentar für dieses Issue erstellen, weil du vom Repository-Besitzer oder dem Autoren des Issues blockiert wurdest.
clone_in_vscodium = In VSCodium klonen
settings.units.add_more = Mehr aktivieren
@@ -2704,7 +2709,7 @@ settings.add_collaborator_blocked_them = Der Mitarbeiter konnte nicht hinzugefü
settings.wiki_rename_branch_main = Den Wiki-Branch-Namen normalisieren
settings.enter_repo_name = Gib den Besitzer- und den Repository-Namen genau wie angezeigt ein:
settings.wiki_branch_rename_success = Der Branch-Name des Repository-Wikis wurde erfolgreich normalisiert.
-settings.archive.mirrors_unavailable = Spiegel sind nicht verfügbar, wenn das Repo archiviert ist.
+settings.archive.mirrors_unavailable = Spiegel sind nicht verfügbar in archivierten Repos.
pulls.blocked_by_user = Du kannst keinen Pull-Request in diesem Repository erstellen, weil du vom Repository-Besitzer blockiert wurdest.
settings.add_collaborator_blocked_our = Der Mitarbeiter konnte nicht hinzugefügt werden, weil der Repository-Besitzer ihn blockiert hat.
issues.blocked_by_user = Du kannst kein Issue in diesem Repository erstellen, weil du vom Repository-Besitzer blockiert wurdest.
@@ -2851,6 +2856,21 @@ issues.num_reviews_one = %d Review
issues.summary_card_alt = Zusammenfassung eines Issues mit dem Titel „%s“ im Repository %s
issues.num_reviews_few = %d Reviews
editor.add_tmpl.filename = Dateiname
+settings.default_update_style_desc = Standard-Aktualisierungsart um Pull-Requests zu aktualisieren, die hinter dem Base-Branch sind.
+new_advanced = Erweiterte Einstellungen
+new_advanced_expand = Zum Ausklappen klicken
+pulls.sign_in_require = Anmelden, um einen neuen Pull-Request zu erstellen.
+new_from_template = Eine Vorlage benutzen
+new_from_template_description = Du kannst eine existierende Repository-Vorlage auf dieser Instanz benutzen und ihre Einstellungen anwenden.
+auto_init_description = Die Git-Historie mit einer README-Datei und optional einer Lizenz- und .gitignore-Datei starten.
+issues.context.menu = Kommentar Menü
+issues.reaction.add = Reaktion hinzufügen
+issues.reaction.alt_many = %[1]s und %[2]d mehr reagierten %[3]s.
+issues.reaction.alt_few = %[1]s reagierten %[2]s.
+issues.reaction.alt_add = Füge %[1]s Reaktion zum Kommentar hinzu.
+issues.reaction.alt_remove = Entferne %[1]s Reaktion von diesem Kommentar.
+summary_card_alt = Zusammenfassungskarte des Repositorys %s
+release.summary_card_alt = Übersichtskarte eines Releases mit dem Titel „%s“ im Repository %s
[graphs]
component_loading_failed = Konnte %s nicht laden
@@ -3686,12 +3706,12 @@ conan.registry=Diese Registry über die Kommandozeile einrichten:
conan.install=Um das Paket mit Conan zu installieren, führe den folgenden Befehl aus:
conda.registry=Richte diese Registry als Conda-Repository in deiner .condarc-Datei ein:
conda.install=Um das Paket mit Conda zu installieren, führe den folgenden Befehl aus:
-container.details.type=Container-Image Typ
+container.details.type=Abbildtyp
container.details.platform=Plattform
container.pull=Downloade das Container-Image aus der Kommandozeile:
container.digest=Digest
container.multi_arch=Betriebsystem / Architektur
-container.layers=Container-Image Ebenen
+container.layers=Abbildebenen
container.labels=Labels
container.labels.key=Schlüssel
container.labels.value=Wert
diff --git a/options/locale/locale_el-GR.ini b/options/locale/locale_el-GR.ini
index a32d616814..3cbf24c3ff 100644
--- a/options/locale/locale_el-GR.ini
+++ b/options/locale/locale_el-GR.ini
@@ -166,6 +166,7 @@ new_org.link = Νέος οργανισμός
new_migrate.title = Νέα μεταφορά
new_repo.title = Νέο repository
new_org.title = Νέος οργανισμός
+copy_path = Αντιγραφή τοποθεσίας
[aria]
navbar=Μπάρα πλοήγησης
@@ -197,8 +198,14 @@ buttons.ref.tooltip=Μνημόνευση ενός θέματος ή pull request
buttons.switch_to_legacy.tooltip=Χρήση του κλασσικού κειμενογράφου
buttons.enable_monospace_font=Ενεργοποίηση σταθερής γραμματοσειράς
buttons.disable_monospace_font=Απενεργοποίηση σταθερής γραμματοσειράς
-buttons.unindent.tooltip = Αναίρεση στοιχείων κατά ένα επίπεδο
-buttons.indent.tooltip = Στοιχεία φωλιών κατά ένα επίπεδο
+buttons.unindent.tooltip = Μείωση εσοχής στοιχείων κατά ένα επίπεδο
+buttons.indent.tooltip = Αύξηση εσοχής στοιχείων κατά ένα επίπεδο
+table_modal.header = Προσθήκη πίνακα
+table_modal.placeholder.header = Επικεφαλίδα
+table_modal.placeholder.content = Περιεχόμενο
+table_modal.label.rows = Σειρές
+table_modal.label.columns = Στήλες
+buttons.new_table.tooltip = Προσθήκη πίνακα
[filter]
string.asc=A - Z
@@ -249,9 +256,9 @@ err_empty_db_path=Η διαδρομή της βάσης δεδομένων SQLit
no_admin_and_disable_registration=Δεν μπορείτε να απενεργοποιήσετε την ιδιο-εγγραφή χρήστη χωρίς να έχετε δημιουργήσει διαχειριστικό λογαριασμό.
err_empty_admin_password=Ο κωδικός πρόσβασης του διαχειριστή δεν μπορεί να είναι κενός.
err_empty_admin_email=Το email του διαχειριστή δεν μπορεί να είναι κενό.
-err_admin_name_is_reserved=Το Όνομα χρήστη του Διαχειριστή δεν είναι έγκυρο, είναι δεσμευμένο
+err_admin_name_is_reserved=Το όνομα χρήστη του Διαχειριστή δεν είναι έγκυρο, αυτό το όνομα είναι δεσμευμένο
err_admin_name_pattern_not_allowed=Το Όνομα χρήστη του Διαχειριστή δεν είναι έγκυρο, ταιριάζει σε μια δεσμευμένη μορφή
-err_admin_name_is_invalid=Το Όνομα Χρήστη του Διαχειριστή δεν είναι έγκυρο
+err_admin_name_is_invalid=Το όνομα χρήστη του Διαχειριστή δεν είναι έγκυρο
general_title=Γενικές ρυθμίσεις
app_name=Τίτλος διακομιστή
@@ -476,6 +483,8 @@ hint_register = Χρειάζεστε έναν λογαριασμό; Αλλαγή ορατότητας.
public_activity.visibility_hint.self_private = Η δραστηριότητά σας είναι ορατή μόνο σε εσάς και στους διαχειριστές. Αλλαγή ορατότητας.
+public_activity.visibility_hint.self_private_profile = Η δραστηριότητά σας είναι ορατή μόνο σε εσάς και τους διαχειριστές του διακομιστή καθώς το προφίλ σας είναι ιδιωτικό Αλλαγή ορατότητας.
[settings]
profile=Προφίλ
@@ -736,9 +746,9 @@ uid=UID
webauthn=Πιστοποίηση δύο παραγόντων (Κλειδιά Ασφαλείας)
public_profile=Δημόσιο προφίλ
-biography_placeholder=Πείτε μας λίγο για τον εαυτό σας! (Μπορείτε να γράψετε με Markdown)
+biography_placeholder=Πείτε λίγα πράγματα για τον εαυτό σας! (Μπορείτε να γράψετε με Markdown)
location_placeholder=Μοιραστείτε την κατά προσέγγιση τοποθεσία σας με άλλους
-profile_desc=Ελέγξτε πώς εμφανίζεται το προφίλ σας σε άλλους χρήστες. Η κύρια διεύθυνση email σας θα χρησιμοποιηθεί για ειδοποιήσεις, ανάκτηση κωδικού πρόσβασης και λειτουργίες Git που βασίζονται στο web.
+profile_desc=Σχετικά με εσάς
password_username_disabled=Οι μη τοπικοί χρήστες δεν επιτρέπεται να αλλάξουν το όνομα χρήστη τους. Επικοινωνήστε με το διαχειριστή σας για περισσότερες λεπτομέρειες.
full_name=Πλήρες όνομα
website=Ιστοσελίδα
@@ -803,7 +813,7 @@ manage_emails=Διαχείριση διευθύνσεων email
manage_themes=Προεπιλεγμένο θέμα
manage_openid=Διευθύνσεις OpenID
email_desc=Η κύρια διεύθυνση ηλεκτρονικού ταχυδρομείου σας θα χρησιμοποιηθεί για ειδοποιήσεις, ανάκτηση του κωδικού πρόσβασης και, εφόσον δεν είναι κρυμμένη, λειτουργίες Git στον ιστότοπο.
-theme_desc=Αυτό θα είναι το προεπιλεγμένο θέμα διεπαφής σας σε όλη την ιστοσελίδα.
+theme_desc=Αυτό θα είναι το προεπιλεγμένο θέμα διεπαφής σας όταν είστε συνδεδεμένοι.
primary=Κύριο
activated=Ενεργό
requires_activation=Απαιτείται ενεργοποίηση
@@ -1038,13 +1048,14 @@ pronouns = Αντωνυμίες
pronouns_custom = κάτι άλλο
pronouns_unspecified = Απροσδιόριστες
hints = Συμβουλές
-additional_repo_units_hint_description = Εμφάνιση κουμπιού «Προσθήκη μονάδων...» σε αποθετήρια που δεν έχουν ενεργοποιημένες όλες τις διαθέσιμες μονάδες.
+additional_repo_units_hint_description = Εμφάνιση υπόδειξης «Προσθήκη μονάδων...» σε αποθετήρια που δεν έχουν ενεργοποιημένες όλες τις διαθέσιμες μονάδες.
update_hints = Ενημέρωση συμβουλών
update_hints_success = Οι συμβουλές ενημερώθηκαν.
language.title = Προεπιλεγμένη γλώσσα
keep_activity_private.description = Η δημόσια δραστηριότητά σας θα είναι ορατή μόνο σε εσάς και στους διαχειριστές.
language.localization_project = Βοηθήστε μας να μεταφράσουμε το Forgejo στην γλώσσα σας! Περισσότερες πληροφορίες.
language.description = Από εδώ και στο εξής, αυτή η γλώσσα θα χρησιμοποιείται από προεπιλογή για τον λογαριασμό σας.
+pronouns_custom_label = Ειδικές αντωνυμίες
[repo]
new_repo_helper=Ένα repository περιέχει όλα τα αρχεία έργου, συμπεριλαμβανομένου του ιστορικού εκδόσεων. Έχετε ήδη ένα που φιλοξενείται κάπου αλλού; Μεταφορά αποθετηρίου.
@@ -1303,6 +1314,7 @@ view_git_blame=Προβολή git blame
video_not_supported_in_browser=Το πρόγραμμα περιήγησής σας δεν υποστηρίζει την ετικέτα HTML5 «video».
audio_not_supported_in_browser=Το πρόγραμμα περιήγησής σας δεν υποστηρίζει την ετικέτα HTML5 «audio».
stored_lfs=Αποθηκεύτηκε με το Git LFS
+stored_annex=Αποθηκεύτηκε με το Git Annex
symbolic_link=Symbolic link
executable_file=Εκτελέσιμο αρχείο
commit_graph=Γράφημα υποβολών
@@ -1326,6 +1338,7 @@ editor.upload_file=Ανέβασμα αρχείου
editor.edit_file=Επεξεργασία αρχείου
editor.preview_changes=Προεπισκόπηση αλλαγών
editor.cannot_edit_lfs_files=Τα αρχεία LFS δεν μπορούν να επεξεργαστούν στη διεπαφή web.
+editor.cannot_edit_annex_files=Τα αρχεία Annex δεν μπορούν να επεξεργαστούν στη διεπαφή web.
editor.cannot_edit_non_text_files=Τα δυαδικά αρχεία δεν μπορούν να επεξεργαστούν στη διεπαφή web.
editor.edit_this_file=Επεξεργασία αρχείου
editor.this_file_locked=Το αρχείο είναι κλειδωμένο
@@ -3929,6 +3942,8 @@ exact = Ακριβής
milestone_kind = Αναζήτηση ορόσημων...
union = Ένωση
union_tooltip = Να συμπεριληφθούν αποτελέσματα που περιέχουν οποιαδήποτε από τις λέξεις που έχουν εισαχθεί και διαχωριστεί με κενό
+regexp = Κανονική Έκφραση
+regexp_tooltip = Ερμηνεία του όρου αναζήτησης ως κανονική έκφραση
[munits.data]
mib = MiB
diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini
index 3b413b8f92..45188feb6c 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -748,13 +748,14 @@ blocked_users = Blocked users
public_profile = Public profile
biography_placeholder = Tell others a little bit about yourself! (Markdown is supported)
location_placeholder = Share your approximate location with others
-profile_desc = Control how your profile is shown to other users. Your primary email address will be used for notifications, password recovery and web-based Git operations.
+profile_desc = About you
password_username_disabled = Non-local users are not allowed to change their username. Please contact your site administrator for more details.
full_name = Full name
website = Website
location = Location
pronouns = Pronouns
pronouns_custom = Custom
+pronouns_custom_label = Custom pronouns
pronouns_unspecified = Unspecified
update_theme = Change theme
update_profile = Update profile
@@ -849,7 +850,7 @@ add_email_success = The new email address has been added.
email_preference_set_success = Email preference has been set successfully.
add_openid_success = The new OpenID address has been added.
keep_email_private = Hide email address
-keep_email_private_popup = This will hide your email address from your profile. It will no longer be the default for commits made via the web interface, like file uploads and edits, and will not be used for merge commits. Instead a special address %s can be used to associate commits with your account. Note that changing this option will not affect existing commits.
+keep_email_private_popup = Your email address will not be shown on your profile and will not be the default for commits made via the web interface, like file uploads, edits, and merge commits. Instead, a special address %s can be used to link commits to your account. This option will not affect existing commits.
openid_desc = OpenID lets you delegate authentication to an external provider.
manage_ssh_keys = Manage SSH keys
@@ -1053,6 +1054,10 @@ admin.failed_to_replace_flags = Failed to replace repository flags
admin.flags_replaced = Repository flags replaced
new_repo_helper = A repository contains all project files, including revision history. Already hosting one elsewhere? Migrate repository.
+new_from_template = Use a template
+new_from_template_description = You can select an existing repository template on this instance and apply its settings.
+new_advanced = Advanced settings
+new_advanced_expand = Click to expand
owner = Owner
owner_helper = Some organizations may not show up in the dropdown due to a maximum repository count limit.
repo_name = Repository name
@@ -1099,7 +1104,8 @@ object_format_helper = Object format of the repository. Cannot be changed later.
readme = README
readme_helper = Select a README file template
readme_helper_desc = This is the place where you can write a complete description for your project.
-auto_init = Initialize repository (Adds .gitignore, License and README)
+auto_init = Initialize repository
+auto_init_description = Start the Git history with a README and optionally add License and .gitignore files.
create_repo = Create repository
default_branch = Default branch
default_branch_label = default
@@ -1148,6 +1154,7 @@ blame_prior = View blame prior to this change
blame.ignore_revs = Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.
blame.ignore_revs.failed = Failed to ignore revisions in .git-blame-ignore-revs.
author_search_tooltip = Shows a maximum of 30 users
+summary_card_alt = Summary card of repository %s
tree_path_not_found_commit = Path %[1]s doesn't exist in commit %[2]s
tree_path_not_found_branch = Path %[1]s doesn't exist in branch %[2]s
@@ -1329,6 +1336,8 @@ view_git_blame = View git blame
video_not_supported_in_browser = Your browser does not support the HTML5 "video" tag.
audio_not_supported_in_browser = Your browser does not support the HTML5 "audio" tag.
stored_lfs = Stored with Git LFS
+stored_annex = Stored with Git Annex
+stored_annex_not_present = not present here, try using git annex whereis
symbolic_link = Symbolic link
executable_file = Executable file
vendored = Vendored
@@ -1356,6 +1365,7 @@ editor.upload_file = Upload file
editor.edit_file = Edit file
editor.preview_changes = Preview changes
editor.cannot_edit_lfs_files = LFS files cannot be edited in the web interface.
+editor.cannot_edit_annex_files = Annex files cannot be edited in the web interface.
editor.cannot_edit_non_text_files = Binary files cannot be edited in the web interface.
editor.edit_this_file = Edit file
editor.this_file_locked = File is locked
@@ -1628,6 +1638,12 @@ issues.num_reviews_one = %d review
issues.num_reviews_few = %d reviews
issues.commented_at = `commented %s`
issues.delete_comment_confirm = Are you sure you want to delete this comment?
+issues.reaction.add = Add reaction
+issues.reaction.alt_few = %[1]s reacted %[2]s.
+issues.reaction.alt_many = %[1]s and %[2]d more reacted %[3]s.
+issues.reaction.alt_remove = Remove %[1]s reaction from comment.
+issues.reaction.alt_add = Add %[1]s reaction to comment.
+issues.context.menu = Comment menu
issues.context.copy_link = Copy link
issues.context.quote_reply = Quote reply
issues.context.reference_issue = Reference in a new issue
@@ -1845,6 +1861,7 @@ pulls.new = New pull request
pulls.view = View pull request
pulls.edit.already_changed = Unable to save changes to the pull request. It appears the content has already been changed by another user. Please refresh the page and try editing again to avoid overwriting their changes
pulls.compare_changes = New pull request
+pulls.sign_in_require = Sign in to create a new pull request.
pulls.allow_edits_from_maintainers = Allow edits from maintainers
pulls.allow_edits_from_maintainers_desc = Users with write access to the base branch can also push to this branch
pulls.allow_edits_from_maintainers_err = Updating failed
@@ -2741,6 +2758,7 @@ release.asset_name = Asset name
release.asset_external_url = External URL
release.add_external_asset = Add external asset
release.invalid_external_url = Invalid external URL: "%s"
+release.summary_card_alt = Summary card of an release titled "%s" in repository %s
branch.name = Branch name
branch.already_exists = A branch named "%s" already exists.
diff --git a/options/locale/locale_es-ES.ini b/options/locale/locale_es-ES.ini
index 4f9d141423..b55ff3181c 100644
--- a/options/locale/locale_es-ES.ini
+++ b/options/locale/locale_es-ES.ini
@@ -1310,6 +1310,7 @@ view_git_blame=Ver Git blame
video_not_supported_in_browser=Su navegador no soporta el tag "video" de HTML5.
audio_not_supported_in_browser=Su navegador no soporta el tag "audio" de HTML5.
stored_lfs=Almacenados con Git LFS
+stored_annex=Almacenados con Git Annex
symbolic_link=Enlace simbólico
executable_file=Archivo ejecutable
commit_graph=Gráfico de commits
@@ -1333,6 +1334,7 @@ editor.upload_file=Subir archivo
editor.edit_file=Editar archivo
editor.preview_changes=Vista previa de los cambios
editor.cannot_edit_lfs_files=Los archivos LFS no se pueden editar en la interfaz web.
+editor.cannot_edit_annex_files=Los archivos Annex no se pueden editar en la interfaz web.
editor.cannot_edit_non_text_files=Los archivos binarios no se pueden editar en la interfaz web.
editor.edit_this_file=Editar archivo
editor.this_file_locked=El archivo está bloqueado
diff --git a/options/locale/locale_fa-IR.ini b/options/locale/locale_fa-IR.ini
index 8960be8bf4..3d5be270a4 100644
--- a/options/locale/locale_fa-IR.ini
+++ b/options/locale/locale_fa-IR.ini
@@ -951,6 +951,7 @@ file_copy_permalink=پرمالینک را کپی کنید
video_not_supported_in_browser=مرورگر شما از تگ video که در HTML5 تعریف شده است، پشتیبانی نمی کند.
audio_not_supported_in_browser=مرورگر شما از تگ audio که در HTML5 تعریف شده است، پشتیبانی نمی کند.
stored_lfs=ذخیره شده با GIT LFS
+stored_annex=ذخیره شده با GIT Annex
symbolic_link=پیوند نمادین
commit_graph=نمودار کامیت
commit_graph.select=انتخاب برنچها
@@ -968,6 +969,7 @@ editor.upload_file=بارگذاری پرونده
editor.edit_file=ویرایش پرونده
editor.preview_changes=پیش نمایش تغییرات
editor.cannot_edit_lfs_files=پرونده های LFS در صحفه وب قابل تغییر نیست.
+editor.cannot_edit_annex_files=پرونده های Annex در صحفه وب قابل تغییر نیست.
editor.cannot_edit_non_text_files=پروندههای دودویی در صفحه وب قابل تغییر نیست.
editor.edit_this_file=ویرایش پرونده
editor.this_file_locked=پرونده قفل شده است
diff --git a/options/locale/locale_fi-FI.ini b/options/locale/locale_fi-FI.ini
index b3864d4e83..937a577936 100644
--- a/options/locale/locale_fi-FI.ini
+++ b/options/locale/locale_fi-FI.ini
@@ -119,7 +119,7 @@ new_project_column = Uusi sarake
retry = Yritä uudelleen
copy_type_unsupported = Tätä tiedostotyyppiä ei voi kopioida
locked = Lukittu
-filter = Suodatin
+filter = Suodata
filter.is_archived = Arkistoitu
filter.not_archived = Ei arkistoitu
filter.public = Julkinen
@@ -167,6 +167,8 @@ filter.not_template = Ei mallipohjat
filter.not_mirror = Ei peilattu
copy_path = Kopioi polku
+concept_user_individual = Yksittäinen
+
[aria]
footer.links = Linkit
navbar = Navigaatiopalkki
@@ -205,6 +207,8 @@ table_modal.placeholder.content = Sisältö
table_modal.label.rows = Rivit
table_modal.label.columns = Sarakkeet
+buttons.unindent.tooltip = Vähennä sisennystä yhden tason verran
+
[filter]
string.asc = A - Ö
string.desc = Ö - A
@@ -231,7 +235,7 @@ install_desc = Suorita alustallesi suunnattu ohjeet ennen minkään asetuksen muuttamista.
require_db_desc=Forgejo tarvitsee toimiakseen MySQL-, PostgreSQL-, SQLite3- tai TiDB- (MySQL-protokolla) tietokannan.
db_title=Tietokannan asetukset
@@ -292,7 +296,7 @@ disable_gravatar.description=Poista Gravatar ja kolmannen osapuolen avaratir kä
federated_avatar_lookup=Käytä federoituja profiilikuvia
federated_avatar_lookup.description=Käytä Libravatar-palvelua profiilikuvien hakemiseen.
disable_registration=Poista omatoiminen rekisteröityminen käytöstä
-disable_registration.description=Poista käyttäjän itse-rekisteröinti, vain ylläpito voi luoda tilejä.
+disable_registration.description=Vain järjestelmänvalvojat voivat luoda uusia käyttäjiä. On suositeltavaa pitää rekisteröinti suljettuna mikäli kyseessä ei ole julkinen instanssi jota varten tarvitsee hallinnoida suuria määriä roskapostikäyttäjiä.
allow_only_external_registration.description=Käyttäjät voivat luoda uusia käyttäjiä vain erikseen konfiguroituja ulkoisia palveluja käyttäen.
openid_signin=Ota OpenID-kirjautuminen käyttöön
openid_signin.description=Salli OpenID:n kautta kirjautuminen.
@@ -319,7 +323,7 @@ default_keep_email_private=Piilota sähköpostiosoitteet oletuksena
default_keep_email_private.description=Piilota oletusarvoisesti uusien käyttäjätilien sähköpostiosoitteet estääksesi tietojen vuotamisen rekisteröinnin yhteydessä.
default_enable_timetracking=Ota ajanseuranta oletusarvoisesti käyttöön
default_enable_timetracking.description=Salli uusien repositorioiden aikaseurannan käyttöönotto oletusarvoisesti.
-no_reply_address=Piilotettu sähköpostin verkkotunnus
+no_reply_address=Piilotetun sähköpostin verkkotunnus
no_reply_address_helper=Verkkotunnuksen nimi käyttäjille, joilla on piilotettu sähköpostiosoite. Esimerkiksi käyttäjätunnus 'joe' kirjataan Git-palveluun nimellä 'joe@noreply.example.org' jos piilotetun sähköpostiosoitteen arvoksi on asetettu 'noreply.example.org'.
password_algorithm=Salasanan hajautusalgoritmi
enable_update_checker_helper_forgejo = Se tarkistaa tietyin väliajoin uusia Forgejo-versioita tutkimalla sen TXT DNS record -tietoja osoitteesta release.forgejo.org .
@@ -346,6 +350,8 @@ app_slogan_helper = Syötä instanssin tunnuslause tähän. Jätä tyhjäksi poi
domain_helper = Palvelimen verkkotunnus tai isäntänimi.
smtp_from_invalid = "Lähetä sähköpostit osoitteella"-osoite on virheellinen
+err_admin_name_pattern_not_allowed = Ylläpitäjän käyttäjätunnus on virheellinen, se vastaa varattua kaaviota
+
[home]
uname_holder=Käyttäjätunnus tai sähköpostiosoite
password_holder=Salasana
@@ -461,6 +467,19 @@ change_unconfirmed_email = Jos annoit väärän sähköpostiosoitteen rekisterö
invalid_code_forgot_password = Vahvistuskoodisi on virheellinen tai vanhentunut. Napsauta tästä aloittaaksesi uuden istunnon.
openid_signin_desc = Kirjoita OpenID-URI:si. Esimerkki: alice.openid.example.org tai https://openid.example.org/alice.
change_unconfirmed_email_summary = Vaihda sähköpostiosoite, johon aktivointisähköposti lähetetään.
+reset_password_wrong_user = Olet kirjautuneena tilillä %s, mutta tilin palautuslinkki on tarkoitettu tilille %s
+last_admin = Et voi poistaa viimeistä ylläpitäjää. Ylläpitäjiä tulee olla vähintään yksi.
+password_pwned = Valitsemasi salasana on varastettujen salasanojen listalla, eli se on paljastanut jossain julkisessa tietovuodossa. Kokeile asettaa eri salasana, ja jos käytät samaa salasanaa muissa palveluissa, vaihda kyseinen salasana.
+
+use_onetime_code = Käytä kertakäyttöiskoodia
+
+unauthorized_credentials = Kirjautumistiedot ovat virheelliset tai vanhentuneet. Yritä suorittaa komento uudelleen tai katso %s saadaksesi lisätietoja
+oauth.signin.error = Valtuuspyynnön käsittelyssä tapahtui virhe. Jos virhe toistuu, ota yhteys sivuston ylläpitoon.
+oauth.signin.error.temporarily_unavailable = Valtuus epäonnistui, koska todennuspalvelin ei ole tällä hetkellä käytettävissä. Yritä uudelleen myöhemmin.
+disable_forgot_password_mail = Tilin palautus ei ole käytössä, koska sähköpostia ei ole määritetty. Ota yhteys sivuston ylläpitoon.
+disable_forgot_password_mail_admin = Tilin palautus on käytössä vain, jos sähköposti on määritetty. Aseta sähköposti, jotta tilin palauttaminen on mahdollista ottaa käyttöön.
+authorization_failed_desc = Valtuus epäonnistui, koska havaitsimme virheellisen pyynnön. Ota yhteys sen sovelluksen ylläpitäjään, jota yritit valtuuttaa.
+password_pwned_err = Pyyntöä HaveIBeenPwned-palveluun ei voitu suorittaa
[mail]
view_it_on=Näytä %s
@@ -514,9 +533,18 @@ account_security_caution.text_1 = Jos se olit sinä, voit jättää tämän vies
issue.action.approve = @%[1]s hyväksyi tämän vetopyynnön.
issue.action.review = @%[1]s kommentoi tätä vetopyyntöä.
issue.action.ready_for_review = @%[1]s merkitsi tämän vetopyynnön valmiiksi katselmointia varten.
+totp_disabled.text_1 = Tilisi aikapohjainen kertakäyttösalasana (TOTP) poistettiin käytöstä.
+issue.action.close = @%[1]s sulki ongelman #%[2]d.
+issue.action.reopen = @%[1]s avasi uudelleen ongelman #%[2]d.
+admin.new_user.text = Napsauta tästä hallitaksesi tätä käyttäjää ylläpitonäkymästä.
+repo.collaborator.added.text = Sinut on lisätty avustajaksi repoon:
+
+primary_mail_change.text_1 = Tilisi ensisijaiseksi sähköpostiosoitteeksi asetettiin %[1]s. Se tarkoittaa, että tämä sähköpostiosoite ei enää vastaanota tilisi ilmoituksia sähköpostitse.
+team_invite.text_1 = %[1]s on kutsunut sinut liittymään tiimiin %[2]s organisaatiossa %[3]s.
+
[modal]
yes=Kyllä
no=Ei
@@ -629,8 +657,13 @@ following_one = %d seurataan
block_user.detail = Huomaa, että käyttäjän estämisellä on muita vaikutuksia, kuten:
show_on_map = Näytä paikka kartalla
form.name_chars_not_allowed = Käyttäjätunnus "%s" sisältää virheellisiä merkkejä.
+follow_blocked_user = Et voi seurata tätä käyttäjää, koska olet estänyt kyseisen käyttäjän tai kyseinen käyttäjä on estänyt sinut.
+disabled_public_activity = Käyttäjä on poistanut käytöstä toiminnan julkisen näkyvyyden.
+form.name_reserved = Käyttäjätunnus "%s" on varattu.
+form.name_pattern_not_allowed = Kaava "%s" ei ole sallittu käyttäjätunnuksessa.
+
[settings]
profile=Profiili
account=Tili
@@ -684,7 +717,7 @@ keep_activity_private_popup=Tekee toiminnon näkyvän vain sinulle ja ylläpitä
lookup_avatar_by_mail=Hae profiilikuva sähköpostin perusteella
federated_avatar_lookup=Ulkopuolinen profiilikuvan haku
-enable_custom_avatar=Ota käyttöön mukautettu profiilikuva
+enable_custom_avatar=Käytä mukautettua profiilikuvaa
choose_new_avatar=Valitse uusi profiilikuva
update_avatar=Päivitä profiilikuva
delete_current_avatar=Poista nykyinen profiilikuva
@@ -699,9 +732,9 @@ password_change_disabled=Ei-lokaalit käyttäjät eivät voi päivittää salasa
emails=Sähköposti osoitteet
manage_emails=Hallitse sähköpostiosoitteita
-manage_themes=Valitse oletusteema
-manage_openid=Hallitse OpenID osoitteita
-theme_desc=Tämä on sivuston oletusteemasi.
+manage_themes=Oletusteema
+manage_openid=OpenID-osoitteet
+theme_desc=Tätä teemaa käytetään verkkosivuston käyttöliittymässä, kun olet sisäänkirjautuneena.
primary=Ensisijainen
activated=Aktivoitu
requires_activation=Vaatii aktivoinnin
@@ -717,7 +750,7 @@ theme_update_error=Valittua teemaa ei löydy.
openid_deletion=Poista OpenID-osoite
openid_deletion_success=OpenID-osoite on poistettu.
add_new_email=Lisää uusi sähköpostiosoite
-add_new_openid=Lisää uusi OpenID URI
+add_new_openid=Lisää uusi OpenID-URI
add_email=Lisää sähköpostiosoite
add_openid=Lisää OpenID URI
add_email_success=Uusi sähköpostiosoite on lisätty.
@@ -729,14 +762,14 @@ openid_desc=OpenID mahdollistaa todentamisen delegoinnin ulkopuoliselle palvelun
manage_ssh_keys=Hallitse SSH-avaimia
manage_gpg_keys=Hallitse GPG-avaimia
add_key=Lisää avain
-ssh_desc=Nämä julkiset SSH-avaimet on liitetty tiliisi. Vastaavat yksityiset avaimet antavat täyden pääsyn repoihisi.
-gpg_desc=Nämä julkiset GPG-avaimet on liitetty tiliisi. Pidä yksityiset avaimet turvassa, koska ne mahdollistavat committien todentamisen.
+ssh_desc=Nämä julkiset SSH-avaimet on liitetty tiliisi. Vastaavat yksityiset avaimet antavat täyden pääsyn repoihisi. Vahvistettuja SSH-avaimia voi käyttää SSH-allekirjoitettujen Git-kommittien vahvistamiseen.
+gpg_desc=Nämä julkiset GPG-avaimet on liitetty tiliisi, ja niitä käytetään kommittien vahvistamiseen. Pidä yksityiset avaimet turvassa, koska ne mahdollistavat kommittien allekirjoittamisen sinun nimissä.
ssh_helper=Tarvitsetko apua? Tutustu GitHubin oppaaseen omien SSH-avainten luonnista tai yleisistä ongelmista, joita voit kohdata SSH:n kanssa.
gpg_helper=Tarvitsetko apua? Katso GitHubin opas GPG:stä.
add_new_key=Lisää SSH avain
add_new_gpg_key=Lisää GPG-avain
-key_content_ssh_placeholder=Alkaa sanoilla 'ssh-ed25519', 'ssh-rsa', 'ecdsa-sha2-nistp256', 'ecdsa-sha2-nistp384', 'ecdsa-sha2-nistp521', 'sk-ecdsa-sha2-nistp256@openssh.com', tai 'sk-ssh-ed25519@openssh.com'
-key_content_gpg_placeholder=Alkaa sanoilla '-----BEGIN PGP PUBLIC KEY BLOCK-----'
+key_content_ssh_placeholder=Alkaa sanoilla "ssh-ed25519", "ssh-rsa", "ecdsa-sha2-nistp256", "ecdsa-sha2-nistp384", "ecdsa-sha2-nistp521", "sk-ecdsa-sha2-nistp256@openssh.com" tai "sk-ssh-ed25519@openssh.com"
+key_content_gpg_placeholder=Alkaa sanoilla "-----BEGIN PGP PUBLIC KEY BLOCK-----"
ssh_key_name_used=Samanniminen SSH avain on jo olemassa tililläsi.
gpg_key_id_used=Julkinen GPG-avain samalla tunnuksella on jo olemassa.
gpg_no_key_email_found=Tämä GPG-avain ei vastaa mitään tiliisi liitettyä aktivoitua sähköpostiosoitetta. Se voidaan silti lisätä, jos allekirjoitat annetun pääsymerkin.
@@ -748,7 +781,7 @@ gpg_token=Pääsymerkki
gpg_token_help=Voit luoda allekirjoituksen käyttäen:
gpg_token_code=echo "%s" | gpg -a --default-key %s --detach-sig
gpg_token_signature=Panssaroitu GPG-allekirjoitus
-key_signature_gpg_placeholder=Alkaa sanoilla '-----BEGIN PGP SIGNATURE-----'
+key_signature_gpg_placeholder=Alkaa sanoilla "-----BEGIN PGP SIGNATURE-----"
ssh_key_verified=Vahvistettu avain
ssh_key_verified_long=Avain on vahvistettu pääsymerkillä ja sitä voidaan käyttää todentamaan commitit, jotka vastaavat tämän käyttäjän aktivoituja sähköpostiosoitteita.
ssh_key_verify=Vahvista
@@ -756,7 +789,7 @@ ssh_token_required=Sinun täytyy antaa allekirjoitus alla olevalle pääsymerkil
ssh_token=Pääsymerkki
ssh_token_help=Voit luoda allekirjoituksen käyttäen:
ssh_token_signature=Panssaroitu SSH-allekirjoitus
-key_signature_ssh_placeholder=Alkaa sanoilla '-----BEGIN SSH SIGNATURE-----'
+key_signature_ssh_placeholder=Alkaa sanoilla "-----BEGIN SSH SIGNATURE-----"
subkeys=Aliavaimet
key_id=Avain ID
key_name=Avaimen nimi
@@ -774,7 +807,7 @@ can_read_info=Luku
can_write_info=Kirjoitus
show_openid=Näytä profiilissa
hide_openid=Piilota profiilista
-ssh_disabled=SSH pois käytöstä
+ssh_disabled=SSH on pois käytöstä
manage_social=Hallitse liitettyjä sosiaalisia tilejä
manage_access_token=Hallitse pääsymerkkejä
@@ -795,7 +828,7 @@ create_oauth2_application=Luo uusi OAuth2-sovellus
create_oauth2_application_button=Luo sovellus
oauth2_application_name=Sovelluksen nimi
save_application=Tallenna
-oauth2_regenerate_secret=Luo secret uudelleen
+oauth2_regenerate_secret=Luo salaisuus uudelleen
oauth2_regenerate_secret_hint=Kadotitko secretin?
oauth2_application_edit=Muokkaa
@@ -811,10 +844,10 @@ twofa_enrolled=Tiliisi on otettu käyttöön kaksivaiheinen vahvistus. Ota palau
webauthn_nickname=Nimimerkki
-manage_account_links=Hallitse linkitettyjä tilejä
+manage_account_links=Yhdistetyt tilit
manage_account_links_desc=Nämä ulkoiset tilit on linkitetty Forgejo tiliisi.
link_account=Yhdistä tili
-remove_account_link=Poista linkitetty tili
+remove_account_link=Poista yhdistetty tili
remove_account_link_desc=Linkitetyn tilin poistaminen peruuttaa pääsyn Forgejo-tiliisi linkitetyn tili kautta. Jatketaanko?
remove_account_link_success=Linkitetty tili on poistettu.
@@ -854,11 +887,11 @@ location_placeholder = Jaa likimääräinen sijaintisi muiden kanssa
retype_new_password = Vahvista uusi salasana
create_oauth2_application_success = Loit uuden OAuth2-sovelluksen.
repos_none = Et omista yhtäkään repositoriota.
-visibility.limited_tooltip = Näkyvissä vain tunnistautuneille käyttäjille
+visibility.limited_tooltip = Näkyvissä vain kirjautuneille käyttäjille
email_notifications.disable = Poista sähköposti-ilmoitukset käytöstä
webauthn_register_key = Lisää turva-avain
blocked_users = Estetyt käyttäjät
-profile_desc = Määritä, miten muut näkevät profiilisi. Ensisijaista sähköpostiosoitettasi käytetään ilmoitusten ja salasanan palautuspyyntöjen lähettämiseen sekä verkkosivupohjaisiin Git-operaatioihin.
+profile_desc = Tietoja sinusta
change_password_success = Salasanasi on päivitetty. Kirjaudu jatkossa käyttäen uutta salasanaa.
manage_oauth2_applications = Hallitse OAuth2-sovelluksia
change_password = Vaihda salasana
@@ -892,6 +925,36 @@ twofa_disable = Poista kaksivaiheinen todennus käytöstä
twofa_disable_desc = Kaksivaiheisen todennuksen poistaminen asettaa tilisi aiempaa suurempaan uhkaan. Jatketaanko?
update_language_not_found = Kieli "%s" ei ole käytettävissä.
change_username_prompt = Huomio: Käyttäjätunnuksen vaihtaminen muuttaa myös tilisi URL-osoitteen.
+oauth2_client_secret_hint = Tätä salaisuutta ei näytetä uudelleen, kun olet poistunut sivulta tai päivittänyt sivun. Varmista, että olet ottanut salaisuuden talteen.
+blocked_since = Estetty %s lähtien
+user_unblock_success = Käyttäjän esto on poistettu.
+oauth2_redirect_uris = Uudelleenohjaus-URI:t. Käytä uutta riviä (newline) jokaista URI:a kohden.
+oauth2_client_secret = Asiakkaan salaisuus
+verify_ssh_key_success = SSH-avain "%s" on vahvistettu.
+change_username_redirect_prompt = Vanha käyttäjätunnus uudelleenohjaa, kunnes joku muu ottaa käyttäjätunnuksen käyttönsä.
+uploaded_avatar_is_too_big = Lähetetyn tiedoston koko (%d KiB) ylittää enimmäiskoon (%d KiB).
+ssh_key_been_used = Tämä SSH-avain on jo lisätty palvelimelle.
+verify_gpg_key_success = GPG-avain "%s" on vahvistettu.
+add_key_success = SSH-avain "%s" on lisätty.
+add_gpg_key_success = GPG-avain "%s" on lisätty.
+ssh_key_deletion_success = SSH-avain on poistettu.
+valid_until_date = Kelvollinen %s asti
+oauth2_client_id = Asiakkaan tunniste
+email_notifications.onmention = Ilmoitus vain maininnasta
+email_notifications.submit = Aseta valinta
+email_notifications.andyourown = Ja omat ilmoitukset
+key_state_desc = Tätä avainta on käytetty viimeisen 7 päivän aikana
+oauth2_application_create_description = OAuth2-sovellukset mahdollistavat kolmannen osapuolen sovelluksen pääsyn tilillesi tässä instanssissa.
+oauth2_confidential_client = Luottamuksellinen sovellus. Valitse sovelluksille, jotka pitävät salaisuuden luottamuksellisena, kuten web-sovelluksille. Älä valitse natiiveille sovelluksille mukaan lukien työpöytä- ja mobiilisovellukset.
+ssh_key_deletion_desc = SSH-avaimen poistaminen kumoaa pääsyn tilillesi kyseistä avainta käyttäen. Jatketaanko?
+
+add_email_confirmation_sent = Vahvistusviesti on lähetetty osoitteeseen "%s". Vahvista sähköpostiosoitteesi seuraavan %s sisällä.
+
+pronouns_custom_label = Mukautetut pronominit
+openid_deletion_desc = Tämän OpenID-osoitteen poistaminen tililtäsi estää kirjautumisen sitä käyttäen. Jatketaanko?
+ssh_signonly = SSH on tällä hetkellä poistettu käytöstä, joten näitä avaimia käytetään vain kommittien allekirjoituksen vahvistamiseen.
+generate_token_name_duplicate = Nimeä %s on jo käytetty sovelluksen nimenä. Käytä eri nimeä.
+oauth2_applications_desc = OAuth2-sovellukset mahdollistavat käyttämäsi kolmannen osapuolen sovelluksen todentaa turvallisesti käyttäjiä tähän Forgejo-instanssiin.
[repo]
owner=Omistaja
@@ -917,7 +980,7 @@ repo_gitignore_helper=Valitse .gitignore-mallit
issue_labels=Ongelmien tunnisteet
issue_labels_helper=Valitse pohja ongelmien nimilapuille.
license=Lisenssi
-license_helper=Valitse lisenssitiedosto.
+license_helper=Valitse lisenssitiedosto
readme=README
auto_init=Alusta repo (Luo .gitignore, License ja README)
create_repo=Luo repo
@@ -1316,7 +1379,7 @@ activity.new_issues_count_1=Uusi ongelma
activity.new_issues_count_n=uutta ongelmaa
activity.new_issue_label=Avoinna
activity.unresolved_conv_label=Auki
-activity.published_release_label=Julkaistu
+activity.published_release_label=Julkaisu
activity.git_stats_pushed_1=on työntänyt
activity.git_stats_file_1=%d tiedosto
activity.git_stats_file_n=%d tiedostoa
@@ -1361,9 +1424,9 @@ settings.transfer.title=Siirrä omistajuus
settings.transfer_form_title=Syötä repon nimi vahvistuksena:
settings.transfer_notices_3=- Jos arkisto on yksityinen ja se siirretään yksittäiselle käyttäjälle, tämä toiminto varmistaa, että käyttäjällä on ainakin lukuoikeudet (ja muuttaa käyttöoikeuksia tarvittaessa).
settings.transfer_owner=Uusi omistaja
-settings.wiki_delete=Poista Wiki data
+settings.wiki_delete=Poista wikidata
settings.wiki_delete_desc=Repon wikin data poistaminen on pysyvä eikä voi peruuttaa.
-settings.confirm_wiki_delete=Wiki datan poistaminen
+settings.confirm_wiki_delete=Poista wikidata
settings.wiki_deletion_success=Repon wiki data on poistettu.
settings.delete=Poista tämä repo
settings.delete_desc=Repon poistaminen on pysyvä eikä voi peruuttaa.
@@ -1384,7 +1447,7 @@ settings.webhook.body=Sisältö
settings.githook_edit_desc=Jos koukku ei ole käytössä, esitellään esimerkkisisältö. Sisällön jättäminen tyhjäksi arvoksi poistaa tämän koukun käytöstä.
settings.githook_name=Koukun nimi
settings.githook_content=Koukun sisältö
-settings.update_githook=Päivitys koukku
+settings.update_githook=Päivitä koukku
settings.payload_url=Kohde URL
settings.http_method=HTTP-menetelmä
settings.secret=Salaus
@@ -1406,7 +1469,7 @@ settings.event_push_desc=Git push repoon.
settings.event_repository=Repo
settings.event_repository_desc=Repo luotu tai poistettu.
settings.event_header_issue=Ongelmien tapahtumat
-settings.event_issues=Ongelmat
+settings.event_issues=Muokkaus
settings.event_issues_desc=Ongelma avattu, suljettu, avattu uudelleen tai muokattu.
settings.event_issue_assign=Ongelma määritetty
settings.event_issue_assign_desc=Ongelma osoitettu tai osoitus poistettu.
@@ -1414,7 +1477,7 @@ settings.event_issue_label_desc=Ongelman tunnisteet päivitetty tai tyhjennetty.
settings.event_issue_milestone_desc=Merkkipaalu lisätty, poistettu tai muokattu.
settings.event_issue_comment_desc=Ongelman kommentti luotu, muokattu tai poistettu.
settings.event_header_pull_request=Vetopyyntöjen tapahtumat
-settings.event_pull_request=Vetopyyntö
+settings.event_pull_request=Muokkaus
settings.event_package_desc=Paketti on luotu tai poistettu repossa.
settings.active_helper=Tiedot käynnistetyistä tapahtumista lähetetään tähän webkoukun URL-osoitteeseen.
settings.add_hook_success=Uusi webkoukku on lisätty.
@@ -1573,7 +1636,7 @@ release.ahead.commits = %d kommittia
all_branches = Kaikki haarat
n_tag_few = %s tagia
settings.event_fork_desc = Repo forkattu.
-actions = Toimenpiteet
+actions = Actions
fork_guest_user = Kirjaudu sisään forkataksesi tämän repon.
fork_from_self = Et voi forkata omistamaasi repoa.
visibility_fork_helper = (Tämän muuttaminen vaikuttaa kaikkien forkkien näkyvyyteen.)
@@ -1641,7 +1704,7 @@ activity.git_stats_author_n = %d tekijää
issues.dependency.add_error_dep_exists = Riippuvuus on jo olemassa.
wiki.page_content = Sivun sisältö
wiki.page_title = Sivun otsikko
-activity.navbar.contributors = Kontribuuttorit
+activity.navbar.contributors = Avustajat
n_release_few = %s julkaisua
n_release_one = %s julkaisu
symbolic_link = Symbolinen linkki
@@ -1659,7 +1722,7 @@ milestones.deletion_success = Merkkipaalu on poistettu.
project = Projektit
pulls.delete.title = Poistetaanko tämä vetopyyntö?
activity.title.issues_1 = %d ongelma
-contributors.contribution_type.filter_label = Kontribuution tyyppi:
+contributors.contribution_type.filter_label = Avustuksen tyyppi:
settings.protected_branch.delete_rule = Poista sääntö
settings.archive.success = Repo arkistoitiin onnistuneesti.
diff.comment.placeholder = Jätä kommentti
@@ -1883,7 +1946,7 @@ migrate.gitlab.description = Tee migraatio gitlab.comista tai muista GitLab-inst
migrate.gitea.description = Tee migraatio gitea.comista tai muista Gitea-instansseista.
repo_gitignore_helper_desc = Valitse mitä tiedostoja ei seurata yleisimpien kielten mallipohjista. Tyypilliset artefaktit, joita eri kielten koostamistyökalut tuottavat, lisätään .gitignore-tiedostoon oletusarvoisesti.
milestones.filter_sort.latest_due_date = Kaukaisin määräpäivä
-license_helper_desc = Lisenssi määrää, mitä muut voivat ja eivät voi tehdä koodillasi. Etkö ole varma, mikä lisenssi soveltuu projektillesi? Lue ohje lisenssin valinnasta.
+license_helper_desc = Lisenssi määrää, mitä muut voivat ja eivät voi tehdä koodillasi. Etkö ole varma, mikä lisenssi soveltuu projektillesi? Lue ohje lisenssin valinnasta.
milestones.filter_sort.earliest_due_data = Lähin määräpäivä
issues.filter_type.reviewed_by_you = Katselmoitu toimestasi
settings.units.overview = Yleisnäkymä
@@ -1959,9 +2022,81 @@ editor.must_have_write_access = Sinulla täytyy olla kirjoitusoikeus tehdäksesi
issues.re_request_review = Pyydä katselmointia uudelleen
pulls.status_checks_details = Yksityiskohdat
release.title_empty = Nimi ei voi olla tyhjä.
+archive.title = Tämä repo on arkistoitu. Voit katsella sen sisältämiä tiedostoja ja kloonata repon, mutta et voi pushata, avata ongelmia tai luoda vetopyyntöjä.
+reactions_more = ja %d lisää
+mirror_address = Kloonaa URL-osoitteesta
+migrate_items_merge_requests = Yhdistämispyynnöt
+stars_remove_warning = Tämä poistaa kaikki tähdet tästä reposta.
+archive.issue.nocomment = Tämä repo on arkistoitu. Et voi kommentoida ongelmia.
+archive.pull.nocomment = Tämä repo on arkistoitu. Et voi kommentoida vetopyyntöjä.
+settings.webhook_deletion_desc = Webkoukun poistaminen poistaa sen asetukset ja toimitushistorian. Jatketaanko?
+settings.discord_icon_url.exceeds_max_length = Kuvakkeen URL-osoite voi sisältää enintään 2048 merkkiä
+settings.event_wiki_desc = Wiki-sivu luotu, nimetty uudelleen, muokattu tai poistettu.
+settings.event_pull_request_desc = Vetopyyntö avattu, suljettu, avattu uudelleen tai muokattu.
+settings.protect_branch_name_pattern = Suojatun haaran nimen kaava
+issues.dependency.add_error_dep_not_same_repo = Molempien ongelmien tulee olla samassa repossa.
+settings.event_release = Julkaisu
+pulls.merge_pull_request = Luo yhdistämiskommitti
+settings.pull_mirror_sync_quota_exceeded = Kiintiö ylitetty, ei vedetä muutoksia.
+settings.wiki_rename_branch_main_notices_1 = Tätä toimintoa EI VOI perua.
+settings.webhook.test_delivery_desc_disabled = Aktivoi webkoukku testataksesi sitä tekaistulla tapahtumalla.
+settings.discord_icon_url = Kuvakkeen URL-osoite
+settings.archive.branchsettings_unavailable = Haaran asetukset eivät ole saatavilla arkistoiduissa repoissa.
+pulls.ready_for_review = Valmiina katselmointiin?
+issues.time_spent_total = Käytetty kokonaisaika
+settings.webhook.test_delivery_desc = Testaa tätä webkoukkua tekaistulla tapahtumalla.
+pulls.switch_comparison_type = Vaihda vertailutyyppiä
+settings.hooks_desc = Webkoukut tekevät automaattisesti HTTP POST -pyyntöjä palvelimelle, kun jotkin Forgejo-tapahtumat käynnistyvät. Lue lisää webkoukkujen oppaasta.
+issues.num_participants_one = %d osallistuja
+issues.reference_link = Viittaus: %s
+mirror_interval = Peilauksen aikaväli (kelvolliset yksiköt ovat "h", "m", "s"). 0 poistaa käytöstä aikaan pohjautuvan synkronoinnin. (Pienin aikaväli: %s)
+mirror_interval_invalid = Peilauksen aikaväli ei ole kelvollinen.
+mirror_sync_on_commit = Synkronoi kun kommitit pushataan
+issues.role.collaborator = Avustaja
+issues.role.collaborator_helper = Tämä käyttäjä on kutsuttu avustajaksi tähän repoon.
+issues.dependency.setting = Käytä riippuvuuksia ongelmiin ja vetopyyntöihin
+wiki.desc = Kirjoita ja jaa dokumentaatiota avustajien kesken.
+settings.collaboration = Avustajat
+settings.mirror_settings.docs = Määritä reposi automaattisesti synkronoimaan kommitit, tagit ja haarat toiseen repoon.
+settings.mirror_settings.docs.disabled_pull_mirror.instructions = Määritä projektisi automaattisesti pushaamaan kommitit, tagit ja haarat toiseen repoon. Pull-peilit on poistettu käytöstä tämän sivuston ylläpitäjän toimesta.
+settings.mirror_settings.docs.disabled_push_mirror.instructions = Määritä projektisi automaattisesti vetämään kommitit, tagit ja haarat toisesta reposta.
+settings.mirror_settings.docs.more_information_if_disabled = Löydät lisätietoja push- ja pull-peileistä täältä:
+settings.mirror_settings.pushed_repository = Työnnetty repo
+settings.mirror_settings.push_mirror.none = Push-peilejä ei ole määritetty
+settings.mirror_settings.push_mirror.add = Lisää push-peili
+settings.mirror_settings.push_mirror.edit_sync_time = Muokkaa peilin synkronoinnin aikaväliä
+settings.allow_only_contributors_to_track_time = Salli vain avustajien seurata aikaa
+settings.pulls_desc = Käytä repositorion vetopyyntöjä
+settings.actions_desc = Käytä integroituja CI-/CD-putkia Forgejo Actionsia hyödyntäen
+settings.admin_enable_health_check = Käytä repositorion terveystarkastuksia (git fsck)
+settings.admin_enable_close_issues_via_commit_in_any_branch = Sulje ongelma kommitin toimesta, joka on tehty muuhun kuin oletusarvoiseen haaraan
+settings.transfer_desc = Siirrä tämä repo käyttäjälle tai organisaatiolle, johon sinulla ylläpito-oikeus.
+settings.signing_settings = Allekirjoituksen vahvistuksen asetukset
+settings.trust_model = Allekirjoituksen luottamusmalli
+settings.trust_model.default = Oletusarvoinen luottamusmalli
+settings.trust_model.collaborator = Avustaja
+settings.trust_model.collaborator.long = Avustaja: Luota avustajien allekirjoituksiin
+settings.trust_model.collaboratorcommitter = Avustaja+kommitoija
+settings.trust_model.collaboratorcommitter.long = Avustaja+kommitoija: Luota avustajien allekirjoituksiin, jotka vastaavat kommitoijaa
+settings.add_collaborator = Lisää avustaja
+settings.add_collaborator_success = Avustaja on lisätty.
+settings.add_collaborator_owner = Omistajaa ei voi lisätä avustajaksi.
+settings.add_collaborator_duplicate = Avustaja on jo lisätty tähän repoon.
+settings.add_collaborator_blocked_our = Avustajaa ei voi lisätä, koska repon omistaja on estänyt hänet.
+settings.add_collaborator_blocked_them = Avustajaa ei voi lisätä, koska kyseinen avustaja on estänyt repon omistajan.
+settings.collaborator_deletion = Poista avustaja
+settings.collaborator_deletion_desc = Avustajan poistaminen estää hänen pääsyn tähän repoon. Jatketaanko?
+settings.remove_collaborator_success = Avustaja on poistettu.
+settings.org_not_allowed_to_be_collaborator = Organisaatioita ei voi lisätä avustajaksi.
+settings.default_branch_desc = Valitse repon oletushaara, johon vetopyynnöt ja koodikommitit kohdistetaan:
+settings.archive.text = Repon arkistointi asettaa sen pelkkään lukutilaan. Se piilotetaan hallintapaneelista. Kukaan (et edes sinä!) ei pysty tehdä uusia kommitteja, avata uusia ongelmia tai avata vetopyyntöjä.
+
+no_eol.text = Ei EOL:ää
+pulls.compare_changes_desc = Valitse haara, johon yhdistetään, ja haara, josta vedetään.
+
[graphs]
component_loading_info = Tämä saattaa kestää hetken…
component_failed_to_load = Odottamaton virhe.
@@ -2102,8 +2237,8 @@ dashboard.operation_switch=Vaihda
dashboard.operation_run=Suorita
dashboard.delete_inactive_accounts=Poista kaikki aktivoimattomat käyttäjät
dashboard.delete_repo_archives=Poista kaikki repojen arkistot (ZIP, TAR.GZ, jne..)
-dashboard.server_uptime=Palvelimen Uptime
-dashboard.current_goroutine=Nykyiset Goroutinet
+dashboard.server_uptime=Palvelimen uptime
+dashboard.current_goroutine=Nykyiset goroutinet
dashboard.current_memory_usage=Nykyinen muistinkäyttö
dashboard.total_memory_allocated=Yhteensä muistia varattu
dashboard.memory_obtained=Muistia saatu
@@ -2123,7 +2258,7 @@ dashboard.mcache_structures_obtained=MCache rakenteita saatu
dashboard.profiling_bucket_hash_table_obtained=Profilointi Bucket Hash Table saatu
dashboard.gc_metadata_obtained=GC metatietoja saatu
dashboard.other_system_allocation_obtained=Muita järjestestelmän varauksia saatu
-dashboard.next_gc_recycle=Seuraava GC kierrätys
+dashboard.next_gc_recycle=Seuraava GC-kierrätys
dashboard.last_gc_time=Edellisen GC ajan jälkeen
dashboard.total_gc_time=Yhteensä GC tauko
dashboard.total_gc_pause=Yhteensä GC tauko
@@ -2279,7 +2414,7 @@ config.default_visibility_organization=Uuden organisaation oletusnäkyvyys
config.webhook_config=Webkoukkujen asetukset
config.queue_length=Jonon pituus
-config.deliver_timeout=Toimitus aikakatkaisu
+config.deliver_timeout=Toimituksen aikakatkaisu
config.mailer_enabled=Käytössä
config.mailer_name=Nimi
@@ -2426,8 +2561,14 @@ dashboard.task.unknown = Tuntematon tehtävä: %[1]s
dashboard.cron.error = Virhe Cronissa: %s: %[3]s
dashboard.task.started = Käynnistetty tehtävä: %[1]s
dashboard.cron.finished = Cron: %[1]s on valmistunut
+dashboard.resync_all_sshkeys = Päivitä ".ssh/authorized_keys"-tiedosto Forgejo:n SSH-avaimilla.
+dashboard.cleanup_packages = Siivoa vanhentuneet paketit
+config.default_allow_only_contributors_to_track_time = Salli vain avustajien seurata aikaa
+monitor.download_diagnosis_report = Lataa diagnostiikkaraportti
+monitor.last_execution_result = Tulos
+
[action]
create_repo=luotu repo %s
rename_repo=uudelleennimetty repo %[1]s nimelle %[3]s
@@ -2601,6 +2742,31 @@ settings.link = Linkitä tämä paketti repositorioon
maven.download = Lataa riippuvuus suorittamalla komentorivillä:
registry.documentation = Lisätietoja %s-rekisteristä on dokumentaatiossa.
owner.settings.chef.keypair.description = Avainpari vaaditaan Chef-rekisteriin tunnistautumista varten. Jos olet luonut avainparin aiemmin, uuden avainparin luominen hylkää aiemman avainparin.
+owner.settings.cleanuprules.keep.pattern = Säilytä kaavaa vastaavat versiot
+owner.settings.cleanuprules.pattern_full_match = Toteuta kaavio paketin koko nimeen
+owner.settings.cleanuprules.keep.title = Näitä sääntöjä vastaavat versiot säilytetään, vaikka ne vastaisivat alla olevaa poistosääntöä.
+owner.settings.cleanuprules.keep.count = Säilytä viimeisimmät
+owner.settings.cleanuprules.remove.pattern = Poista kaavaa vastaavat versiot
+owner.settings.cleanuprules.keep.pattern.container = Viimeisin (latest) versio säilytetään aina Container-paketeista.
+owner.settings.cleanuprules.remove.title = Näitä sääntöjä vastaavat versiot poistetaan, ellei sääntö yläpuolella käske säilyttää niitä.
+owner.settings.cleanuprules.remove.days = Poista versiot, jotka ovat vanhempia kuin
+arch.pacman.helper.gpg = Lisää luottamusvarmenne pacmanille:
+
+empty.repo = Lähetitkö paketin, mutta se ei näy täällä? Siirry paketin asetuksiin ja linkitä se tähän repoon.
+published_by = Julkaistu %[1]s käyttäjän %[3]s toimesta
+alpine.registry = Määritä tämä rekisteri lisäämällä URL-osoite tiedostoon /etc/apk/repositories:
+alpine.registry.key = Lataa rekisterin julkinen RSA-avain hakemistoon /etc/apk/keys/ vahvistaaksesi indeksin allekirjoituksen:
+alpine.registry.info = Valitse $branch ja $repository alla olevasta listasta.
+arch.pacman.conf = Lisää palvelin asiaan liittyvällä jakelulla ja arkkitehtuurilla tiedostoon /etc/pacman.conf :
+arch.pacman.sync = Synkronoi paketti pacmanin kanssa:
+container.images.title = Levykuvat
+debian.registry.info = Valitse $distribution ja $component alla olevasta listasta.
+rpm.repository.multiple_groups = Tämä paketti on saatavilla useissa ryhmissä.
+rubygems.dependencies.runtime = Ajonaikaiset riippuvuudet
+owner.settings.cargo.rebuild = Rakenna indeksi uudelleen
+owner.settings.cargo.rebuild.error = Cargo-indeksin rakentaminen uudelleen epäonnistui: %v
+owner.settings.cargo.rebuild.success = Cargo-indeksi rakennettiin uudelleen.
+owner.settings.cleanuprules.preview.none = Siivoussääntö ei vastaa yhtäkään pakettia.
[secrets]
creation.failed = Salaisuuden lisääminen epäonnistui.
@@ -2699,11 +2865,15 @@ workflow.disable_success = Työnkulku "%s" on poistettu käytöstä.
runs.no_job = Työnkulun tulee sisältää vähintään yksi työ
runs.invalid_workflow_helper = Työnkulun asetustiedosto on virheellinen. Tarkista asetustiedosto: %s
runners = Ajajat
-actions = Toimenpiteet
+actions = Actions
+unit.desc = Hallitse integroituja CI/CD-putkia Forgejo Actionsia hyödyntäen.
+runs.pushed_by = työntänyt
+runs.no_workflows.help_no_write_access = Lisätietoja Forgejo Actionsista on saatavilla dokumentaatiosta.
+
[projects]
type-1.display_name = Yksittäinen projekti
deleted.display_name = Poistettu projekti
diff --git a/options/locale/locale_fil.ini b/options/locale/locale_fil.ini
index 9a001ee81a..9d0ec9f308 100644
--- a/options/locale/locale_fil.ini
+++ b/options/locale/locale_fil.ini
@@ -748,7 +748,7 @@ social = Mga social account
biography_placeholder = Sabihin sa iba ng kaunti tungkol sa iyong sarili! (Sinusuportahan ang Markdown)
change_username_prompt = Tandaan: Ang pagpalit ng username ay papalitan din ang URL ng iyong account.
organization = Mga Organisasyon
-profile_desc = Kontrolin kung paano ipinapakita ang iyong profile sa ibang mga gumagamit. Ang iyong pangunahing email address ay gagamitin para sa mga abiso, pagbawi ng password at mga Git operation na batay sa web.
+profile_desc = Tungkol sa iyo
hidden_comment_types_description = Ang mga uri ng komento na naka-check dito ay hindi ipapakita sa loob ng mga pahina ng isyu. Halimbawa ang pag-check ng "Label" ay tatanggalin lahat ng mga "Idinagdag/tinanggal ni ang