Merge branch 'forgejo' into repocard

This commit is contained in:
JakobDev 2024-12-29 11:20:09 +00:00
commit a82cd18d9a
119 changed files with 6915 additions and 2391 deletions

View file

@ -1,4 +1,4 @@
FROM code.forgejo.org/oci/alpine:3.20
FROM data.forgejo.org/oci/alpine:3.20
ARG RELEASE_VERSION=unkown
LABEL maintainer="contact@forgejo.org" \
org.opencontainers.image.version="${RELEASE_VERSION}"

View file

@ -17,7 +17,7 @@ runs:
apt-get -q install -qq -y zstd
- name: "Set up Go using setup-go"
uses: https://code.forgejo.org/actions/setup-go@v5
uses: https://data.forgejo.org/actions/setup-go@v5
id: go-version
with:
go-version-file: "go.mod"

View file

@ -40,14 +40,14 @@ jobs:
)
runs-on: docker
container:
image: 'code.forgejo.org/oci/node:20-bookworm'
image: 'data.forgejo.org/oci/node:20-bookworm'
steps:
- name: event info
run: |
cat <<'EOF'
${{ toJSON(github) }}
EOF
- uses: https://code.forgejo.org/actions/git-backporting@v4.8.4
- uses: https://data.forgejo.org/actions/git-backporting@v4.8.4
with:
target-branch-pattern: "^backport/(?<target>(v.*))$"
strategy: ort

View file

@ -23,12 +23,12 @@ on:
jobs:
release-simulation:
if: vars.ROLE == 'forgejo-coding'
runs-on: self-hosted
runs-on: lxc-bookworm
steps:
- uses: actions/checkout@v4
- id: forgejo
uses: https://code.forgejo.org/actions/setup-forgejo@v2.0.4
uses: https://data.forgejo.org/actions/setup-forgejo@v2.0.4
with:
user: root
password: admin1234

View file

@ -14,6 +14,12 @@
# secrets.CASCADE_DESTINATION_TOKEN: <generated from code.forgejo.org/forgejo-ci> scope read:user, write:repository, write:issue
# vars.CASCADE_DESTINATION_DOER: forgejo-ci
#
# vars.SKIP_END_TO_END: `true` or `false`
# It must be `false` (or absent) so https://code.forgejo.org/forgejo/end-to-end is run
# with the newly built release.
# It must be set to `true` when a release is missing, for instance because it was
# removed and failed to upload.
#
on:
push:
tags: 'v[0-9]+.[0-9]+.*'
@ -23,7 +29,7 @@ on:
jobs:
release:
runs-on: self-hosted
runs-on: lxc-bookworm
# root is used for testing, allow it
if: vars.ROLE == 'forgejo-integration' || github.repository_owner == 'root'
steps:
@ -37,11 +43,11 @@ jobs:
repository="${{ github.repository }}"
echo "value=${repository##*/}" >> "$GITHUB_OUTPUT"
- uses: https://code.forgejo.org/actions/setup-node@v4
- uses: https://data.forgejo.org/actions/setup-node@v4
with:
node-version: 20
- uses: https://code.forgejo.org/actions/setup-go@v5
- uses: https://data.forgejo.org/actions/setup-go@v5
with:
go-version-file: "go.mod"
@ -87,7 +93,7 @@ jobs:
- name: cache node_modules
id: node
uses: https://code.forgejo.org/actions/cache@v4
uses: https://data.forgejo.org/actions/cache@v4
with:
path: |
node_modules
@ -158,7 +164,7 @@ jobs:
- name: build container & release
if: ${{ secrets.TOKEN != '' }}
uses: https://code.forgejo.org/forgejo/forgejo-build-publish/build@v5.2.1
uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.2.1
with:
forgejo: "${{ env.GITHUB_SERVER_URL }}"
owner: "${{ env.GITHUB_REPOSITORY_OWNER }}"
@ -177,7 +183,7 @@ jobs:
- name: build rootless container
if: ${{ secrets.TOKEN != '' }}
uses: https://code.forgejo.org/forgejo/forgejo-build-publish/build@v5.2.1
uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.2.1
with:
forgejo: "${{ env.GITHUB_SERVER_URL }}"
owner: "${{ env.GITHUB_REPOSITORY_OWNER }}"
@ -195,7 +201,7 @@ jobs:
- name: end-to-end tests
if: ${{ secrets.TOKEN != '' && vars.ROLE == 'forgejo-integration' && vars.SKIP_END_TO_END != 'true' }}
uses: https://code.forgejo.org/actions/cascading-pr@v2.2.0
uses: https://data.forgejo.org/actions/cascading-pr@v2.2.0
with:
origin-url: ${{ env.GITHUB_SERVER_URL }}
origin-repo: ${{ github.repository }}

View file

@ -35,7 +35,7 @@ jobs:
)
runs-on: docker
container:
image: code.forgejo.org/oci/node:20-bookworm
image: data.forgejo.org/oci/node:20-bookworm
steps:
- uses: actions/checkout@v4
with:

View file

@ -9,7 +9,7 @@ jobs:
if: vars.ROLE == 'forgejo-integration'
runs-on: docker
container:
image: 'code.forgejo.org/oci/node:20-bookworm'
image: 'data.forgejo.org/oci/node:20-bookworm'
steps:
- name: apt install curl jq

View file

@ -16,7 +16,7 @@ jobs:
if: vars.ROLE == 'forgejo-coding'
runs-on: docker
container:
image: 'code.forgejo.org/oci/node:20-bookworm'
image: 'data.forgejo.org/oci/node:20-bookworm'
steps:
- name: Debug output
run: |

View file

@ -13,9 +13,9 @@ jobs:
if: vars.ROLE == 'forgejo-coding' && github.event.pull_request.merged
runs-on: docker
container:
image: 'code.forgejo.org/oci/ci:1'
image: 'data.forgejo.org/oci/ci:1'
steps:
- uses: https://code.forgejo.org/forgejo/set-milestone@v1.0.0
- uses: https://data.forgejo.org/forgejo/set-milestone@v1.0.0
with:
forgejo: https://codeberg.org
repository: forgejo/forgejo

View file

@ -11,7 +11,7 @@ jobs:
if: ${{ secrets.MIRROR_TOKEN != '' }}
runs-on: docker
container:
image: 'code.forgejo.org/oci/node:20-bookworm'
image: 'data.forgejo.org/oci/node:20-bookworm'
steps:
- name: git push {v*/,}forgejo
run: |

View file

@ -36,13 +36,13 @@ on:
jobs:
publish:
runs-on: self-hosted
runs-on: lxc-bookworm
if: vars.DOER != '' && vars.FORGEJO != '' && vars.TO_OWNER != '' && vars.FROM_OWNER != '' && secrets.TOKEN != ''
steps:
- uses: actions/checkout@v4
- name: copy & sign
uses: https://code.forgejo.org/forgejo/forgejo-build-publish/publish@v5.2.1
uses: https://data.forgejo.org/forgejo/forgejo-build-publish/publish@v5.2.1
with:
from-forgejo: ${{ vars.FORGEJO }}
to-forgejo: ${{ vars.FORGEJO }}
@ -61,14 +61,14 @@ jobs:
- name: get trigger mirror issue
id: mirror
uses: https://code.forgejo.org/infrastructure/issue-action/get@v1.1.0
uses: https://data.forgejo.org/infrastructure/issue-action/get@v1.1.0
with:
forgejo: https://code.forgejo.org
repository: forgejo/forgejo
labels: mirror-trigger
- name: trigger the mirror
uses: https://code.forgejo.org/infrastructure/issue-action/set@v1.1.0
uses: https://data.forgejo.org/infrastructure/issue-action/set@v1.1.0
with:
forgejo: https://code.forgejo.org
repository: forgejo/forgejo
@ -78,7 +78,7 @@ jobs:
label: trigger
- name: upgrade v*.next.forgejo.org
uses: https://code.forgejo.org/infrastructure/next-digest@v1.1.0
uses: https://data.forgejo.org/infrastructure/next-digest@v1.1.0
with:
url: https://placeholder:${{ secrets.TOKEN_NEXT_DIGEST }}@code.forgejo.org/infrastructure/next-digest
ref_name: '${{ github.ref_name }}'

View file

@ -9,11 +9,11 @@ jobs:
if: vars.ROLE == 'forgejo-coding'
runs-on: docker
container:
image: 'code.forgejo.org/oci/node:20-bookworm'
image: 'data.forgejo.org/oci/node:20-bookworm'
steps:
- uses: https://code.forgejo.org/actions/checkout@v4
- uses: https://data.forgejo.org/actions/checkout@v4
- uses: https://code.forgejo.org/actions/setup-go@v5
- uses: https://data.forgejo.org/actions/setup-go@v5
with:
go-version-file: "go.mod"
cache: false

View file

@ -12,9 +12,9 @@ jobs:
if: ( vars.ROLE == 'forgejo-coding' ) && contains(github.event.pull_request.labels.*.name, 'worth a release-note')
runs-on: docker
container:
image: 'code.forgejo.org/oci/node:20-bookworm'
image: 'data.forgejo.org/oci/node:20-bookworm'
steps:
- uses: https://code.forgejo.org/actions/checkout@v4
- uses: https://data.forgejo.org/actions/checkout@v4
- name: event
run: |
@ -25,7 +25,7 @@ jobs:
${{ toJSON(github.event) }}
EOF
- uses: https://code.forgejo.org/actions/setup-go@v5
- uses: https://data.forgejo.org/actions/setup-go@v5
with:
go-version-file: "go.mod"
cache: false

View file

@ -25,11 +25,11 @@ jobs:
runs-on: docker
container:
image: code.forgejo.org/forgejo-contrib/renovate:39.69.2
image: data.forgejo.org/forgejo-contrib/renovate:39.69.2
steps:
- name: Load renovate repo cache
uses: https://code.forgejo.org/actions/cache/restore@3624ceb22c1c5a301c8db4169662070a689d9ea8 # v4.1.1
uses: https://data.forgejo.org/actions/cache/restore@3624ceb22c1c5a301c8db4169662070a689d9ea8 # v4.1.1
with:
path: |
.tmp/cache/renovate/repository
@ -62,7 +62,7 @@ jobs:
- name: Save renovate repo cache
if: always() && env.RENOVATE_DRY_RUN != 'full'
uses: https://code.forgejo.org/actions/cache/save@3624ceb22c1c5a301c8db4169662070a689d9ea8 # v4.1.1
uses: https://data.forgejo.org/actions/cache/save@3624ceb22c1c5a301c8db4169662070a689d9ea8 # v4.1.1
with:
path: |
.tmp/cache/renovate/repository

View file

@ -13,7 +13,7 @@ jobs:
if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
runs-on: docker
container:
image: 'code.forgejo.org/oci/node:20-bookworm'
image: 'data.forgejo.org/oci/node:20-bookworm'
options: --tmpfs /tmp:exec,noatime
steps:
- name: event info
@ -21,7 +21,7 @@ jobs:
cat <<'EOF'
${{ toJSON(github) }}
EOF
- uses: https://code.forgejo.org/actions/checkout@v4
- uses: https://data.forgejo.org/actions/checkout@v4
- uses: ./.forgejo/workflows-composite/setup-env
- run: su forgejo -c 'make deps-backend deps-tools'
- 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
@ -30,10 +30,10 @@ jobs:
if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
runs-on: docker
container:
image: 'code.forgejo.org/oci/node:20-bookworm'
image: 'data.forgejo.org/oci/node:20-bookworm'
options: --tmpfs /tmp:exec,noatime
steps:
- uses: https://code.forgejo.org/actions/checkout@v4
- uses: https://data.forgejo.org/actions/checkout@v4
- run: make deps-frontend
- run: make lint-frontend
- run: make checks-frontend
@ -55,17 +55,17 @@ jobs:
runs-on: docker
needs: [backend-checks, frontend-checks]
container:
image: 'code.forgejo.org/oci/node:20-bookworm'
image: 'data.forgejo.org/oci/node:20-bookworm'
options: --tmpfs /tmp:exec,noatime
services:
elasticsearch:
image: code.forgejo.org/oci/bitnami/elasticsearch:7
image: data.forgejo.org/oci/bitnami/elasticsearch:7
options: --tmpfs /bitnami/elasticsearch/data
env:
discovery.type: single-node
ES_JAVA_OPTS: "-Xms512m -Xmx512m"
minio:
image: code.forgejo.org/oci/bitnami/minio:2024.8.17
image: data.forgejo.org/oci/bitnami/minio:2024.8.17
options: >-
--hostname gitea.minio --tmpfs /bitnami/minio/data:noatime
env:
@ -73,7 +73,7 @@ jobs:
MINIO_ROOT_USER: 123456
MINIO_ROOT_PASSWORD: 12345678
steps:
- uses: https://code.forgejo.org/actions/checkout@v4
- uses: https://data.forgejo.org/actions/checkout@v4
- uses: ./.forgejo/workflows-composite/setup-env
- name: install git >= 2.42
uses: ./.forgejo/workflows-composite/apt-install-from
@ -96,10 +96,10 @@ jobs:
runs-on: docker
needs: [backend-checks, frontend-checks]
container:
image: 'code.forgejo.org/oci/playwright:latest'
image: 'data.forgejo.org/oci/playwright:latest'
options: --tmpfs /tmp:exec,noatime
steps:
- uses: https://code.forgejo.org/actions/checkout@v4
- uses: https://data.forgejo.org/actions/checkout@v4
with:
fetch-depth: 20
- uses: ./.forgejo/workflows-composite/setup-env
@ -116,7 +116,7 @@ jobs:
- uses: ./.forgejo/workflows-composite/build-backend
- name: Get changed files
id: changed-files
uses: https://code.forgejo.org/tj-actions/changed-files@v45
uses: https://data.forgejo.org/tj-actions/changed-files@v45
with:
separator: '\n'
- run: |
@ -128,7 +128,7 @@ jobs:
CHANGED_FILES: ${{steps.changed-files.outputs.all_changed_files}}
- name: Upload test artifacts on failure
if: failure()
uses: https://code.forgejo.org/forgejo/upload-artifact@v4
uses: https://data.forgejo.org/forgejo/upload-artifact@v4
with:
name: test-artifacts.zip
path: tests/e2e/test-artifacts/
@ -138,20 +138,20 @@ jobs:
runs-on: docker
needs: [backend-checks, frontend-checks, test-unit]
container:
image: 'code.forgejo.org/oci/node:20-bookworm'
image: 'data.forgejo.org/oci/node:20-bookworm'
options: --tmpfs /tmp:exec,noatime
name: ${{ format('test-remote-cacher ({0})', matrix.cacher.name) }}
strategy:
matrix:
cacher:
- name: redis
image: code.forgejo.org/oci/bitnami/redis:7.2
image: data.forgejo.org/oci/bitnami/redis:7.2
options: --tmpfs /bitnami/redis/data:noatime
- name: redict
image: registry.redict.io/redict:7.3.0-scratch
options: --tmpfs /data:noatime
- name: valkey
image: code.forgejo.org/oci/bitnami/valkey:7.2
image: data.forgejo.org/oci/bitnami/valkey:7.2
options: --tmpfs /bitnami/redis/data:noatime
- name: garnet
image: ghcr.io/microsoft/garnet-alpine:1.0.14
@ -161,7 +161,7 @@ jobs:
image: ${{ matrix.cacher.image }}
options: ${{ matrix.cacher.options }}
steps:
- uses: https://code.forgejo.org/actions/checkout@v4
- uses: https://data.forgejo.org/actions/checkout@v4
- uses: ./.forgejo/workflows-composite/setup-env
- name: install git >= 2.42
uses: ./.forgejo/workflows-composite/apt-install-from
@ -180,11 +180,11 @@ jobs:
runs-on: docker
needs: [backend-checks, frontend-checks]
container:
image: 'code.forgejo.org/oci/node:20-bookworm'
image: 'data.forgejo.org/oci/node:20-bookworm'
options: --tmpfs /tmp:exec,noatime
services:
mysql:
image: 'code.forgejo.org/oci/bitnami/mysql:8.4'
image: 'data.forgejo.org/oci/bitnami/mysql:8.4'
env:
ALLOW_EMPTY_PASSWORD: yes
MYSQL_DATABASE: testgitea
@ -194,7 +194,7 @@ jobs:
MYSQL_EXTRA_FLAGS: --innodb-adaptive-flushing=OFF --innodb-buffer-pool-size=4G --innodb-log-buffer-size=128M --innodb-flush-log-at-trx-commit=0 --innodb-flush-log-at-timeout=30 --innodb-flush-method=nosync --innodb-fsync-threshold=1000000000 --disable-log-bin
options: --tmpfs /bitnami/mysql/data:noatime
steps:
- uses: https://code.forgejo.org/actions/checkout@v4
- uses: https://data.forgejo.org/actions/checkout@v4
- uses: ./.forgejo/workflows-composite/setup-env
- name: install dependencies & git >= 2.42
uses: ./.forgejo/workflows-composite/apt-install-from
@ -211,19 +211,19 @@ jobs:
runs-on: docker
needs: [backend-checks, frontend-checks]
container:
image: 'code.forgejo.org/oci/node:20-bookworm'
image: 'data.forgejo.org/oci/node:20-bookworm'
options: --tmpfs /tmp:exec,noatime
services:
minio:
image: code.forgejo.org/oci/bitnami/minio:2024.8.17
image: data.forgejo.org/oci/bitnami/minio:2024.8.17
env:
MINIO_ROOT_USER: 123456
MINIO_ROOT_PASSWORD: 12345678
options: --tmpfs /bitnami/minio/data
ldap:
image: code.forgejo.org/oci/test-openldap:latest
image: data.forgejo.org/oci/test-openldap:latest
pgsql:
image: code.forgejo.org/oci/bitnami/postgresql:15
image: data.forgejo.org/oci/bitnami/postgresql:15
env:
POSTGRESQL_DATABASE: test
POSTGRESQL_PASSWORD: postgres
@ -231,7 +231,7 @@ jobs:
POSTGRESQL_EXTRA_FLAGS: -c full_page_writes=off
options: --tmpfs /bitnami/postgresql
steps:
- uses: https://code.forgejo.org/actions/checkout@v4
- uses: https://data.forgejo.org/actions/checkout@v4
- uses: ./.forgejo/workflows-composite/setup-env
- name: install dependencies & git >= 2.42
uses: ./.forgejo/workflows-composite/apt-install-from
@ -250,10 +250,10 @@ jobs:
runs-on: docker
needs: [backend-checks, frontend-checks]
container:
image: 'code.forgejo.org/oci/node:20-bookworm'
image: 'data.forgejo.org/oci/node:20-bookworm'
options: --tmpfs /tmp:exec,noatime
steps:
- uses: https://code.forgejo.org/actions/checkout@v4
- uses: https://data.forgejo.org/actions/checkout@v4
- uses: ./.forgejo/workflows-composite/setup-env
- name: install dependencies & git >= 2.42
uses: ./.forgejo/workflows-composite/apt-install-from
@ -278,10 +278,10 @@ jobs:
- test-remote-cacher
- test-unit
container:
image: 'code.forgejo.org/oci/node:20-bookworm'
image: 'data.forgejo.org/oci/node:20-bookworm'
options: --tmpfs /tmp:exec,noatime
steps:
- uses: https://code.forgejo.org/actions/checkout@v4
- uses: https://data.forgejo.org/actions/checkout@v4
- uses: ./.forgejo/workflows-composite/setup-env
- run: su forgejo -c 'make deps-backend deps-tools'
- run: su forgejo -c 'make security-check'

View file

@ -49,7 +49,7 @@ GOVULNCHECK_PACKAGE ?= golang.org/x/vuln/cmd/govulncheck@v1 # renovate: datasour
DEADCODE_PACKAGE ?= golang.org/x/tools/cmd/deadcode@v0.28.0 # renovate: datasource=go
GOMOCK_PACKAGE ?= go.uber.org/mock/mockgen@v0.4.0 # renovate: datasource=go
GOPLS_PACKAGE ?= golang.org/x/tools/gopls@v0.17.0 # renovate: datasource=go
RENOVATE_NPM_PACKAGE ?= renovate@39.69.2 # renovate: datasource=docker packageName=code.forgejo.org/forgejo-contrib/renovate
RENOVATE_NPM_PACKAGE ?= renovate@39.82.1 # renovate: datasource=docker packageName=code.forgejo.org/forgejo-contrib/renovate
# https://github.com/disposable-email-domains/disposable-email-domains/commits/main/
DISPOSABLE_EMAILS_SHA ?= 0c27e671231d27cf66370034d7f6818037416989 # renovate: ...

View file

@ -1042,7 +1042,7 @@
{
"name": "golang.org/x/time/rate",
"path": "golang.org/x/time/rate/LICENSE",
"licenseText": "Copyright (c) 2009 The Go Authors. 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 2009 The Go Authors.\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 LLC 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": "google.golang.org/genproto/googleapis/rpc/status",

View file

@ -11,13 +11,4 @@ package main
import (
// for embed
_ "github.com/shurcooL/vfsgen"
// for cover merge
_ "golang.org/x/tools/cover"
// for vet
_ "code.gitea.io/gitea-vet"
// for swagger
_ "github.com/go-swagger/go-swagger/cmd/swagger"
)

View file

@ -1,118 +0,0 @@
// Copyright 2020 The Gitea Authors. All rights reserved.
// Copyright (c) 2015, Wade Simmons
// SPDX-License-Identifier: MIT
// gocovmerge takes the results from multiple `go test -coverprofile` runs and
// merges them into one profile
//go:build ignore
package main
import (
"flag"
"fmt"
"io"
"log"
"os"
"sort"
"golang.org/x/tools/cover"
)
func mergeProfiles(p, merge *cover.Profile) {
if p.Mode != merge.Mode {
log.Fatalf("cannot merge profiles with different modes")
}
// Since the blocks are sorted, we can keep track of where the last block
// was inserted and only look at the blocks after that as targets for merge
startIndex := 0
for _, b := range merge.Blocks {
startIndex = mergeProfileBlock(p, b, startIndex)
}
}
func mergeProfileBlock(p *cover.Profile, pb cover.ProfileBlock, startIndex int) int {
sortFunc := func(i int) bool {
pi := p.Blocks[i+startIndex]
return pi.StartLine >= pb.StartLine && (pi.StartLine != pb.StartLine || pi.StartCol >= pb.StartCol)
}
i := 0
if sortFunc(i) != true {
i = sort.Search(len(p.Blocks)-startIndex, sortFunc)
}
i += startIndex
if i < len(p.Blocks) && p.Blocks[i].StartLine == pb.StartLine && p.Blocks[i].StartCol == pb.StartCol {
if p.Blocks[i].EndLine != pb.EndLine || p.Blocks[i].EndCol != pb.EndCol {
log.Fatalf("OVERLAP MERGE: %v %v %v", p.FileName, p.Blocks[i], pb)
}
switch p.Mode {
case "set":
p.Blocks[i].Count |= pb.Count
case "count", "atomic":
p.Blocks[i].Count += pb.Count
default:
log.Fatalf("unsupported covermode: '%s'", p.Mode)
}
} else {
if i > 0 {
pa := p.Blocks[i-1]
if pa.EndLine >= pb.EndLine && (pa.EndLine != pb.EndLine || pa.EndCol > pb.EndCol) {
log.Fatalf("OVERLAP BEFORE: %v %v %v", p.FileName, pa, pb)
}
}
if i < len(p.Blocks)-1 {
pa := p.Blocks[i+1]
if pa.StartLine <= pb.StartLine && (pa.StartLine != pb.StartLine || pa.StartCol < pb.StartCol) {
log.Fatalf("OVERLAP AFTER: %v %v %v", p.FileName, pa, pb)
}
}
p.Blocks = append(p.Blocks, cover.ProfileBlock{})
copy(p.Blocks[i+1:], p.Blocks[i:])
p.Blocks[i] = pb
}
return i + 1
}
func addProfile(profiles []*cover.Profile, p *cover.Profile) []*cover.Profile {
i := sort.Search(len(profiles), func(i int) bool { return profiles[i].FileName >= p.FileName })
if i < len(profiles) && profiles[i].FileName == p.FileName {
mergeProfiles(profiles[i], p)
} else {
profiles = append(profiles, nil)
copy(profiles[i+1:], profiles[i:])
profiles[i] = p
}
return profiles
}
func dumpProfiles(profiles []*cover.Profile, out io.Writer) {
if len(profiles) == 0 {
return
}
fmt.Fprintf(out, "mode: %s\n", profiles[0].Mode)
for _, p := range profiles {
for _, b := range p.Blocks {
fmt.Fprintf(out, "%s:%d.%d,%d.%d %d %d\n", p.FileName, b.StartLine, b.StartCol, b.EndLine, b.EndCol, b.NumStmt, b.Count)
}
}
}
func main() {
flag.Parse()
var merged []*cover.Profile
for _, file := range flag.Args() {
profiles, err := cover.ParseProfiles(file)
if err != nil {
log.Fatalf("failed to parse profile '%s': %v", file, err)
}
for _, p := range profiles {
merged = addProfile(merged, p)
}
}
dumpProfiles(merged, os.Stdout)
}

View file

@ -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")
}

View file

@ -7,11 +7,11 @@
<body>
<h1>Privacy Policy</h1>
<h4>Last updated: January 29, 2020</h4>
<h4>Last updated: December 19, 2024</h4>
<h2>Who We Are?</h2>
<p>Your Gitea Instance</p>
<p>Your Forgejo Instance</p>
<h2>What Personal Data We Collect?</h2>
@ -37,19 +37,19 @@
<h3>With your Consent</h3>
<p>We share your User Personal Information, if you consent, after letting you know what information will be shared, with whom, and why. For example, if you allow third party applications to access your Account using <a href="https://docs.gitea.com/development/oauth2-provider">OAuth2 providers</a>, we share all information associated with your Account, including private repos and organizations. You may also direct us through your action on Your Gitea Instance to share your User Personal Information, such as when joining an Organization.</p>
<p>We share your User Personal Information, if you consent, after letting you know what information will be shared, with whom, and why. For example, if you allow third party applications to access your Account using <a href="https://forgejo.org/docs/latest/user/oauth2-provider/">OAuth2 providers</a>, we share all information associated with your Account, including private repos and organizations. You may also direct us through your action on Your Forgejo Instance to share your User Personal Information, such as when joining an Organization.</p>
<h3>With Service Providers</h3>
<p>We share User Personal Information with a limited number of service providers who process it on our behalf to provide or improve our Service, and who have agreed to privacy restrictions similar to the ones in our Privacy Statement by signing data protection agreements or making similar commitments. Our service providers perform payment processing, customer support ticketing, network data transmission, security, and other similar services. While Your Gitea Instance processes all User Personal Information in the (country/state where Gitea is deployed), our service providers may process data outside of (country/state where Gitea is deployed), the United States or the European Union.</p>
<p>We share User Personal Information with a limited number of service providers who process it on our behalf to provide or improve our Service, and who have agreed to privacy restrictions similar to the ones in our Privacy Statement by signing data protection agreements or making similar commitments. Our service providers perform payment processing, customer support ticketing, network data transmission, security, and other similar services. While Your Forgejo Instance processes all User Personal Information in the (country/state where Forgejo is deployed), our service providers may process data outside of (country/state where Forgejo is deployed), the United States or the European Union.</p>
<h3>For Security Purposes</h3>
<p>If you are a member of an Organization, Your Gitea Instance may share your username, Usage Information, and Device Information associated with that Organization with an owner and/or administrator of the Organization who has agreed to the Corporate Terms of Service or applicable customer agreements, to the extent that such information is provided only to investigate or respond to a security incident that affects or compromises the security of that particular Organization.</p>
<p>If you are a member of an Organization, Your Forgejo Instance may share your username, Usage Information, and Device Information associated with that Organization with an owner and/or administrator of the Organization who has agreed to the Corporate Terms of Service or applicable customer agreements, to the extent that such information is provided only to investigate or respond to a security incident that affects or compromises the security of that particular Organization.</p>
<h3>For Legal Disclosure</h3>
<p>Your Gitea Instance strives for transparency in complying with legal process and legal obligations. Unless prevented from doing so by law or court order, or in rare, exigent circumstances, we make a reasonable effort to notify users of any legally compelled or required disclosure of their information. Your Gitea Instance may disclose User Personal Information or other information we collect about you to law enforcement if required in response to a valid subpoena, court order, search warrant, a similar government order, or when we believe in good faith that disclosure is necessary to comply with our legal obligations, to protect our property or rights, or those of third parties or the public at large.</p>
<p>Your Forgejo Instance strives for transparency in complying with legal process and legal obligations. Unless prevented from doing so by law or court order, or in rare, exigent circumstances, we make a reasonable effort to notify users of any legally compelled or required disclosure of their information. Your Forgejo Instance may disclose User Personal Information or other information we collect about you to law enforcement if required in response to a valid subpoena, court order, search warrant, a similar government order, or when we believe in good faith that disclosure is necessary to comply with our legal obligations, to protect our property or rights, or those of third parties or the public at large.</p>
<h3>Change in Control or Sale</h3>
@ -57,7 +57,7 @@
<h3>Aggregate, Non-Personally Identifying Information</h3>
<p>We share certain aggregated, non-personally identifying information with others about how our users, collectively, use Your Gitea Instance, or how our users respond to our other offerings, such as our conferences or events. For example, we may compile statistics on the open source activity across Your Gitea Instance.</p>
<p>We share certain aggregated, non-personally identifying information with others about how our users, collectively, use Your Forgejo Instance, or how our users respond to our other offerings, such as our conferences or events. For example, we may compile statistics on the open source activity across Your Forgejo Instance.</p>
<p>We <b>don't</b> sell your User Personal Information for monetary or other consideration. </p>
@ -67,34 +67,34 @@
<ol>
<li>We use your Registration Information to create your account, and to provide you the Service.</li>
<li>We use your User Personal Information, specifically your username, to identify you on Your Gitea Instance.</li>
<li>We use your User Personal Information, specifically your username, to identify you on Your Forgejo Instance.</li>
<li>We use your Profile Information to fill out your Account profile and to share that profile with other users if you ask us to.</li>
<li>We use your email address to communicate with you, if you've said that's okay, and only for the reasons youve said thats okay.</li>
<li>We use User Personal Information and other data to make recommendations for you, such as to suggest projects you may want to follow or contribute to. We learn from your public behavior on Your Gitea Instance—such as the projects you star—to determine your coding interests, and we recommend similar projects. These recommendations are automated decisions, but they have no legal impact on your rights.</li>
<li>We use Usage Information and Device Information to better understand how our Users use Your Gitea Instance and to improve our Website and Service.</li>
<li>We may use your User Personal Information if it is necessary for security purposes or to investigate possible fraud or attempts to harm Your Gitea Instance or our Users.</li>
<li>We use User Personal Information and other data to make recommendations for you, such as to suggest projects you may want to follow or contribute to. We learn from your public behavior on Your Forgejo Instance—such as the projects you star—to determine your coding interests, and we recommend similar projects. These recommendations are automated decisions, but they have no legal impact on your rights.</li>
<li>We use Usage Information and Device Information to better understand how our Users use Your Forgejo Instance and to improve our Website and Service.</li>
<li>We may use your User Personal Information if it is necessary for security purposes or to investigate possible fraud or attempts to harm Your Forgejo Instance or our Users.</li>
<li>We may use your User Personal Information to comply with our legal obligations, protect our intellectual property, and enforce our Terms of Service.</li>
<li>We limit our use of your User Personal Information to the purposes listed in this Privacy Statement. If we need to use your User Personal Information for other purposes, we will ask your permission first. You can always see what information we have, how we're using it, and what permissions you have given us in your user profile.</li>
</ol>
<h2>How Your Gitea Instance Secures Your Information?</h2>
<h2>How Your Forgejo Instance Secures Your Information?</h2>
<p>Your Gitea Instance takes all measures reasonably necessary to protect User Personal Information from unauthorized access, alteration, or destruction; maintain data accuracy; and help ensure the appropriate use of User Personal Information.</p>
<p>Your Forgejo Instance takes all measures reasonably necessary to protect User Personal Information from unauthorized access, alteration, or destruction; maintain data accuracy; and help ensure the appropriate use of User Personal Information.</p>
<p>To the extent above, we enforce a written security information program, which:</p>
<ul>
<li>aligns with industry recognized frameworks;</li>
<li>includes security safeguards reasonably designed to protect the confidentiality, integrity, availability, and resilience of our Users' data;</li>
<li>is appropriate to the nature, size, and complexity of Your Gitea Instances business operations;</li>
<li>is appropriate to the nature, size, and complexity of Your Forgejo Instances business operations;</li>
<li>includes incident response and data breach notification processes; and</li>
<li>complies with applicable information security-related laws and regulations in the geographic regions where Your Gitea Instance does business.</li>
<li>complies with applicable information security-related laws and regulations in the geographic regions where Your Forgejo Instance does business.</li>
</ul>
<p>In the event of a data breach that affects your User Personal Information, we will act promptly to mitigate the impact of a breach and notify any affected Users without undue delay.</p>
<p>Transmission of data on Your Gitea Instance is encrypted using SSH, HTTPS (TLS), and git repository content is encrypted at rest. We host Your Gitea Instance at our hosting partner, which they provide data centers with high level of physical and network security.</p>
<p>Transmission of data on Your Forgejo Instance is encrypted using SSH, HTTPS (TLS), and git repository content is encrypted at rest. We host Your Forgejo Instance at our hosting partner, which they provide data centers with high level of physical and network security.</p>
<p><b>Disclaimer:</b> No method of transmission, or method of electronic storage, is 100% secure, therefore, we cannot guarantee absolute security.</p>
@ -102,13 +102,13 @@
<h3>Cookies</h3>
<p>We uses cookies to make interactions with our service easy and meaningful. Cookies are small text files that websites often store on computer hard drives or mobile devices of visitors. We use cookies (and similar technologies, like HTML5 localStorage) to keep you logged in, remember your preferences, and provide information for future development of Your Gitea Instance. For security purposes, we use cookies to identify a device. By using our Website, you agree that we can place these types of cookies on your computer or device. If you disable your browser or devices ability to accept these cookies, you will not be able to log in or use our services.</p>
<p>We uses cookies to make interactions with our service easy and meaningful. Cookies are small text files that websites often store on computer hard drives or mobile devices of visitors. We use cookies (and similar technologies, like HTML5 localStorage) to keep you logged in, remember your preferences, and provide information for future development of Your Forgejo Instance. For security purposes, we use cookies to identify a device. By using our Website, you agree that we can place these types of cookies on your computer or device. If you disable your browser or devices ability to accept these cookies, you will not be able to log in or use our services.</p>
<h3>Tracking and Analytics</h3>
<p>Out of the box, Gitea doesn't use third-party analytics. In case when we opt in to their usage, we do that to help us evaluate our Users' use of Your Gitea Instance, compile statistical reports on activity, and improve our content and Website performance. We only use these third-party analytics providers on certain areas of our Website, and all of them have signed data protection agreements with us that limit the type of User Personal Information they can collect and the purpose for which they can process the information. In addition, we may also deploy internal analytics software to provide similar functionality.</p>
<p>Out of the box, Forgejo doesn't use third-party analytics. In case when we opt in to their usage, we do that to help us evaluate our Users' use of Your Forgejo Instance, compile statistical reports on activity, and improve our content and Website performance. We only use these third-party analytics providers on certain areas of our Website, and all of them have signed data protection agreements with us that limit the type of User Personal Information they can collect and the purpose for which they can process the information. In addition, we may also deploy internal analytics software to provide similar functionality.</p>
<p>Some browsers have incorporated "Do Not Track" (DNT) features that can send a signal to the websites you visit indicating you do not wish to be tracked. Your Gitea Instance responds to browser DNT signals and follows the <a href="https://www.w3.org/TR/tracking-dnt/">W3C standard for responding to DNT signals</a>. If you have not enabled DNT on a browser that supports it, cookies on some parts of our Website will track your online browsing activity on other online services over time, though we do not permit third parties other than our analytics and service providers to track Your Gitea Instance Users' activity over time on Your Gitea Instance.</p>
<p>Some browsers have incorporated "Do Not Track" (DNT) features that can send a signal to the websites you visit indicating you do not wish to be tracked. Your Forgejo Instance responds to browser DNT signals and follows the <a href="https://www.w3.org/TR/tracking-dnt/">W3C standard for responding to DNT signals</a>. If you have not enabled DNT on a browser that supports it, cookies on some parts of our Website will track your online browsing activity on other online services over time, though we do not permit third parties other than our analytics and service providers to track Your Forgejo Instance Users' activity over time on Your Forgejo Instance.</p>
<h2>Repository Contents</h2>
@ -118,19 +118,19 @@
<h2>Public Information</h2>
<p>Many of our services and feature are public-facing. If your content is public-facing, third parties may access and use it in compliance with our Terms of Service, such as by viewing your profile or repositories or pulling data via our API. We do not sell that content; it is yours. However, we do allow third parties, such as research organizations or archives, to compile public-facing Your Gitea Instance information. Other third parties, such as data brokers, have been known to scrape Your Gitea Instance and compile data as well.</p>
<p>Many of our services and feature are public-facing. If your content is public-facing, third parties may access and use it in compliance with our Terms of Service, such as by viewing your profile or repositories or pulling data via our API. We do not sell that content; it is yours. However, we do allow third parties, such as research organizations or archives, to compile public-facing Your Forgejo Instance information. Other third parties, such as data brokers, have been known to scrape Your Forgejo Instance and compile data as well.</p>
<p>Your User Personal Information associated with your content could be gathered by third parties in these compilations of Your Gitea Instance data. If you do not want your User Personal Information to appear in third parties compilations of Your Gitea Instance data, please do not make your User Personal Information publicly available and be sure to configure your email address to be private in your user profile and in your git commit settings.</p>
<p>Your User Personal Information associated with your content could be gathered by third parties in these compilations of Your Forgejo Instance data. If you do not want your User Personal Information to appear in third parties compilations of Your Forgejo Instance data, please do not make your User Personal Information publicly available and be sure to configure your email address to be private in your user profile and in your git commit settings.</p>
<p>If you would like to compile Your Gitea Instance data, you must comply with our Terms of Service regarding scraping and privacy, and you may only use any public-facing User Personal Information you gather for the purpose for which our user authorized it. For example, where a Your Gitea Instance user has made an email address public-facing for the purpose of identification and attribution, do not use that email address for commercial advertising. We expect you to reasonably secure any User Personal Information you have gathered from Your Gitea Instance, and to respond promptly to complaints, removal requests, and "do not contact" requests from Your Gitea Instance or Your Gitea Instance users.</p>
<p>If you would like to compile Your Forgejo Instance data, you must comply with our Terms of Service regarding scraping and privacy, and you may only use any public-facing User Personal Information you gather for the purpose for which our user authorized it. For example, where a Your Forgejo Instance user has made an email address public-facing for the purpose of identification and attribution, do not use that email address for commercial advertising. We expect you to reasonably secure any User Personal Information you have gathered from Your Forgejo Instance, and to respond promptly to complaints, removal requests, and "do not contact" requests from Your Forgejo Instance or Your Forgejo Instance users.</p>
<p>In similar fashion, projects on Your Gitea Instance may include publicly available User Personal Information collected as part of the collaborative events.</p>
<p>In similar fashion, projects on Your Forgejo Instance may include publicly available User Personal Information collected as part of the collaborative events.</p>
<h2>Organizations</h2>
<p>If you collaborate on or become a member of an Organization, then its Account owners may receive your User Personal Information. When you accept an invitation to an Organization, you will be notified of the types of information owners may be able to see. If you accept an invitation to an Organization with a verified domain, then the owners of that Organization will be able to see your full email address(es) within that Organization's verified domain(s).</p>
<p>Please note, Your Gitea Instance may share your username, Usage Information, and Device Information with the owner of the Organization you are a member of, to the extent that your User Personal Information is provided only to investigate or respond to a security incident that affects or compromises the security of that particular Organization.</p>
<p>Please note, Your Forgejo Instance may share your username, Usage Information, and Device Information with the owner of the Organization you are a member of, to the extent that your User Personal Information is provided only to investigate or respond to a security incident that affects or compromises the security of that particular Organization.</p>
<p>If you collaborate with or become a member of an Account that has agreed to a Data Protection Addendum (DPA) to this Privacy Policy, then that DPA governs in the event of conflicts between this Privacy Policy and DPA with respect to your activity in the Account.</p>
@ -138,17 +138,17 @@
<h2>How You Can Access and Control the Information We Collect?</h2>
<p>If you're already a Your Gitea Instance user, you may access, update, alter, or delete your basic user information by editing your user profile. You can control the information we collect about you by limiting what information is in your profile, or by keeping your information current.</p>
<p>If you're already a Your Forgejo Instance user, you may access, update, alter, or delete your basic user information by editing your user profile. You can control the information we collect about you by limiting what information is in your profile, or by keeping your information current.</p>
<p>If Your Gitea Instance processes information about you, such as information receives from third parties, and you do not have an account, then you may, subject to applicable law, access, update, alter, delete, or object to the processing of your personal information by contacting our support.</p>
<p>If Your Forgejo Instance processes information about you, such as information receives from third parties, and you do not have an account, then you may, subject to applicable law, access, update, alter, delete, or object to the processing of your personal information by contacting our support.</p>
<h3>Data Portability</h3>
<p>As a Your Gitea Instance User, you can always take your data with you. You can clone your repositories to your computer, or you can <a href="https://docs.gitea.com/development/migrations-interfaces">perform migrations using the provided interfaces</a>, for example.</p>
<p>As a Your Forgejo Instance User, you can always take your data with you. You can clone your repositories to your computer, or you can <a href="https://docs.gitea.com/development/migrations-interfaces">perform migrations using the provided interfaces</a>, for example.</p>
<h3>Data Retention and Deletion of Data</h3>
<p>In general, Your Gitea Instance retains User Personal Information for as long as your account is active, or as needed to provide you service.</p>
<p>In general, Your Forgejo Instance retains User Personal Information for as long as your account is active, or as needed to provide you service.</p>
<p>If you would like to cancel your account or delete your User Personal Information, you may do so in your user profile. We retain and use your information as necessary to comply with our legal obligations, resolve disputes, and enforce our agreements, but barring legal requirements, we will delete your full profile (within reason) within 90 days of your request. Feel free to contact our support to request erasure of the data we process on the basis of consent within 30 days.</p>
@ -158,14 +158,14 @@
<h2>Our Global Privacy Practices</h2>
<p>We store and process the information that we collect in the (country/state where Gitea is deployed) in accordance with this Privacy Statement though our service providers may store and process data outside the (country/state where Gitea is deployed). However, we understand that we have Users from different countries and regions with different privacy expectations, and we try to meet those needs even when the (country/state where Gitea is deployed) does not have the same privacy framework as other countries.</p>
<p>We store and process the information that we collect in the (country/state where Forgejo is deployed) in accordance with this Privacy Statement though our service providers may store and process data outside the (country/state where Forgejo is deployed). However, we understand that we have Users from different countries and regions with different privacy expectations, and we try to meet those needs even when the (country/state where Forgejo is deployed) does not have the same privacy framework as other countries.</p>
<p>We provide a high standard of privacy protection—as described in this Privacy Statement—to all our users around the world, regardless of their country of origin or location, and we are proud of the levels of notice, choice, accountability, security, data integrity, access, and recourse we provide. We work hard to comply with the applicable data privacy laws wherever we do business, working with our Data Protection Officer as part of a cross-functional team that oversees our privacy compliance efforts. Additionally, if our vendors or affiliates have access to User Personal Information, they must sign agreements that require them to comply with our privacy policies and with applicable data privacy laws.</p>
<p>In particular:</p>
<ul>
<li>Your Gitea Instance provides clear methods of unambiguous, informed, specific, and freely given consent at the time of data collection, when we collect your User Personal Information using consent as a basis.</li>
<li>Your Forgejo Instance provides clear methods of unambiguous, informed, specific, and freely given consent at the time of data collection, when we collect your User Personal Information using consent as a basis.</li>
<li>We collect only the minimum amount of User Personal Information necessary for our purposes, unless you choose to provide more. We encourage you to only give us the amount of data you are comfortable sharing.</li>
<li>We offer you simple methods of accessing, altering, or deleting the User Personal Information we have collected, where legally permitted.</li>
<li>We provide our Users notice, choice, accountability, security, and access regarding their User Personal Information, and we limit the purpose for processing it. We also provide our Users a method of recourse and enforcement. These are the Privacy Shield Principles, but they are also just good practices.</li>
@ -173,21 +173,21 @@
<h2>How We Communicate with You?</h2>
<p>We use your email address to communicate with you, if you've said that's okay, and only for the reasons youve said thats okay. For example, if you contact our support with a request, we respond to you via email. You have a lot of control over how your email address is used and shared on and through Your Gitea instance. You may manage your communication preferences in your user profile.</p>
<p>We use your email address to communicate with you, if you've said that's okay, and only for the reasons youve said thats okay. For example, if you contact our support with a request, we respond to you via email. You have a lot of control over how your email address is used and shared on and through Your Forgejo instance. You may manage your communication preferences in your user profile.</p>
<p>By design, the Git version control system associates many actions with a User's email address, such as commit messages. We are not able to change many aspects of the Git system. If you would like your email address to remain private, even when youre commenting on public repositories, you can create a private email address in your user profile. You should also update your local Git configuration to use your private email address. This will not change how we contact you, but it will affect how others see you.</p>
<p>Depending on your email settings, Your Gitea instance may occasionally send notification emails about changes in a repository youre watching, new features, requests for feedback, important policy changes, or to offer customer support. We also send marketing emails, based on your choices and in accordance with applicable laws and regulations. There's an “unsubscribe” link located at the bottom of each of the marketing emails we send you. Note that you can opt out of any communications with us, except the important ones (like from our support and system emails).</p>
<p>Depending on your email settings, Your Forgejo instance may occasionally send notification emails about changes in a repository youre watching, new features, requests for feedback, important policy changes, or to offer customer support. We also send marketing emails, based on your choices and in accordance with applicable laws and regulations. There's an “unsubscribe” link located at the bottom of each of the marketing emails we send you. Note that you can opt out of any communications with us, except the important ones (like from our support and system emails).</p>
<p>Our emails may contain a pixel tag, which is a small, clear image that can tell us whether or not you have opened an email and what your IP address is. We use this pixel tag to make our email more effective for you and to make sure were not sending you unwanted email.</p>
<h2>Changes to this Privacy Policy</h2>
<p>Although most changes are likely to be minor, Your Gitea Instance may change our Privacy Statement from time to time. We will provide notification to Users of material changes to this Privacy Statement through our Website at least 30 days prior to the change taking effect by posting a notice on our home page or sending email to the primary email address specified in your account.</p>
<p>Although most changes are likely to be minor, Your Forgejo Instance may change our Privacy Statement from time to time. We will provide notification to Users of material changes to this Privacy Statement through our Website at least 30 days prior to the change taking effect by posting a notice on our home page or sending email to the primary email address specified in your account.</p>
<h2>Contact</h2>
<p>If you have any concerns about privacy, please contact us at <a href="mailto:privacy@your-gitea-instance">privacy@your-gitea-instance</a>. We will respond promptly, within 45 days.</p>
<p>If you have any concerns about privacy, please contact us at <a href="mailto:privacy@your-forgejo-instance">privacy@your-forgejo-instance</a>. We will respond promptly, within 45 days.</p>
<h2>COPYING</h2>

View file

@ -7,26 +7,26 @@
<body>
<h1>Terms of Service</h1>
<h4>Last updated: January 29, 2020</h4>
<h4>Last updated: December 19, 2024</h4>
<p>Thank you for choosing Your Gitea Instance! Before you use it, please read this Terms of Service agreement carefully, which contains important contract between us and our users.</p>
<p>Thank you for choosing Your Forgejo Instance! Before you use it, please read this Terms of Service agreement carefully, which contains important contract between us and our users.</p>
<h2>Definitions</h2>
<ol>
<li>An "Account" represents your legal relationship with Your Gitea Instance. A “User Account” represents an individual Users authorization to log in to and use the Service and serves as a Users identity on Your Gitea Instance. “Organizations” are shared workspaces that may be associated with a single entity or with one or more Users where multiple Users can collaborate across many projects at once. A User Account can be a member of any number of Organizations.</li>
<li>An "Account" represents your legal relationship with Your Forgejo Instance. A “User Account” represents an individual Users authorization to log in to and use the Service and serves as a Users identity on Your Forgejo Instance. “Organizations” are shared workspaces that may be associated with a single entity or with one or more Users where multiple Users can collaborate across many projects at once. A User Account can be a member of any number of Organizations.</li>
<li>The "Agreement" collectively refers to all terms, conditions, and notices referenced or contained in this document and other operating rules, policies (including Privacy Policy) and procedures that we may publish from time to time on this Website.</li>
<li>“Content” refers to content featured or displayed through the Website, including without limitation code, text, data, articles, images, photographs, graphics, software, applications, packages, designs, features, and other materials that are available on the Website or otherwise available through the Service. "Content" also includes Services. “User-Generated Content” is Content, written or otherwise, created or uploaded by our Users. "Your Content" is Content that you create or own.</li>
<li>"Your Gitea Instance", "We", and "Us" refers to Your Gitea Instance, as well as our affiliates, directors, subsidiaries, contractors, licensors, officers, agents, and employees.</li>
<li>"Your Forgejo Instance", "We", and "Us" refers to Your Forgejo Instance, as well as our affiliates, directors, subsidiaries, contractors, licensors, officers, agents, and employees.</li>
<li>The "Service" refers to applications/software, products, and services provided by Your Gitea Instance.</li>
<li>The "Service" refers to applications/software, products, and services provided by Your Forgejo Instance.</li>
<li>The "User", "You", and "Your" refers to individual person or institution (organizations or company) that has visited or using the Service; that have access or use any part of the Account; or that directs to use the Account to perform its function. Please note that additional terms may apply for Accounts related to business or government.</li>
<li>The "Website" refers to Your Gitea Instance's website at <a href="https://your-gitea-instance">your-gitea-instance</a>, including its subdomains and other websites owned by Your Gitea Instance.</li>
<li>The "Website" refers to Your Forgejo Instance's website at <a href="https://your-forgejo-instance">your-forgejo-instance</a>, including its subdomains and other websites owned by Your Forgejo Instance.</li>
</ol>
<h2>Account Terms</h2>
@ -48,7 +48,7 @@
<ul>
<li>You must be a human to create an Account. Accounts registered by "bots" or other automated methods are not permitted. We do permit machine accounts:</li>
<li>A machine account is an Account set up by an individual human who accepts the Terms on behalf of the Account, provides a valid email address, and is responsible for its actions. A machine account is used exclusively for performing automated tasks. Multiple users may direct the actions of a machine account, but the owner of the Account is ultimately responsible for the machine's actions.</li>
<li>You must be age 13 or older. If we learn of any User under that age, we will immediately terminate that User's Account. Different countries may have different minimum age; in such cases you are responsible for complying with your country's regulation. By using Your Gitea Instance, you agree to comply with <a href="https://www.ftc.gov/enforcement/rules/rulemaking-regulatory-reform-proceedings/childrens-online-privacy-protection-rule">COPPA</a> and/or similar law in your country.</li>
<li>You must be age 13 or older. If we learn of any User under that age, we will immediately terminate that User's Account. Different countries may have different minimum age; in such cases you are responsible for complying with your country's regulation. By using Your Forgejo Instance, you agree to comply with <a href="https://www.ftc.gov/enforcement/rules/rulemaking-regulatory-reform-proceedings/childrens-online-privacy-protection-rule">COPPA</a> and/or similar law in your country.</li>
</ul>
<h3>User Account Security</h3>
@ -57,7 +57,7 @@
<h3>Additional Terms</h3>
<p>In some situations, third parties' terms may apply to your use of Your Gitea Instance. For example, you may be a member of an organization on Your Gitea Instance with its own terms or license agreements; you may download an application that integrates with Your Gitea Instance; or you may use Your Gitea Instance to authenticate to another service. Please be aware that while these Terms are our full agreement with you, other parties' terms govern their relationships with you.</p>
<p>In some situations, third parties' terms may apply to your use of Your Forgejo Instance. For example, you may be a member of an organization on Your Forgejo Instance with its own terms or license agreements; you may download an application that integrates with Your Forgejo Instance; or you may use Your Forgejo Instance to authenticate to another service. Please be aware that while these Terms are our full agreement with you, other parties' terms govern their relationships with you.</p>
<h2>Acceptable Use</h2>
@ -73,19 +73,19 @@
<li>
<p>You retain ownership of and responsibility for Your Content. If you're posting anything you did not create yourself or do not own the rights to, you agree that you are responsible for any Content you post; that you will only submit Content that you have the right to post; and that you will fully comply with any third party licenses relating to Content you post.</p>
<p>Because of above, we need you to grant us -- and other Your Gitea Instance users -- certain legal permissions, listed below in this section. If you upload Content that already comes with a license granting Your Gitea Instance the permissions we need to run our Service, no additional license is required. You understand that you will not receive any payment for any of the rights granted below. The licenses you grant to us will end when you remove Your Content from our servers, unless other Users have forked it.</p>
<p>Because of above, we need you to grant us -- and other Your Forgejo Instance users -- certain legal permissions, listed below in this section. If you upload Content that already comes with a license granting Your Forgejo Instance the permissions we need to run our Service, no additional license is required. You understand that you will not receive any payment for any of the rights granted below. The licenses you grant to us will end when you remove Your Content from our servers, unless other Users have forked it.</p>
</li>
<li>
<p>We need the legal right to do things like host Your Content, publish it, and share it. You grant us and our legal successors the right to store, parse, and display Your Content, and make incidental copies as necessary to render the Website and provide the Service. This includes the right to do things like copy it to our database and make backups; show it to you and other users; parse it into a search index or otherwise analyze it on our servers; share it with other users; and perform it, in case Your Content is something like music or video.</p>
<p>This license, however, doesn't grant Your Gitea Instance the right to sell Your Content or otherwise distribute or use it outside of our provision of the Service.</p>
<p>This license, however, doesn't grant Your Forgejo Instance the right to sell Your Content or otherwise distribute or use it outside of our provision of the Service.</p>
</li>
<li>
<p>Any User-Generated Content you post publicly, including issues, comments, and contributions to other Users' repositories, may be viewed by others. By setting your repositories to be viewed publicly, you agree to allow others to view and "fork" your repositories (this means that others may make their own copies of Content from your repositories in repositories they control).</p>
<p>If you set your pages and repositories to be viewed publicly, you grant each User of Your Gitea Instance a nonexclusive, worldwide license to use, display, and perform Your Content through the Your Gitea Instance Service and to reproduce Your Content solely on Your Gitea Instance as permitted through Your Gitea Instance's functionality (for example, through forking). You may grant further rights if you adopt a license. If you are uploading Content you did not create or own, you are responsible for ensuring that the Content you upload is licensed under terms that grant these permissions to other Your Gitea Instance Users.</p>
<p>If you set your pages and repositories to be viewed publicly, you grant each User of Your Forgejo Instance a nonexclusive, worldwide license to use, display, and perform Your Content through the Your Forgejo Instance Service and to reproduce Your Content solely on Your Forgejo Instance as permitted through Your Forgejo Instance's functionality (for example, through forking). You may grant further rights if you adopt a license. If you are uploading Content you did not create or own, you are responsible for ensuring that the Content you upload is licensed under terms that grant these permissions to other Your Forgejo Instance Users.</p>
</li>
<li>
@ -97,7 +97,7 @@
<li>
<p>You retain all moral rights to Your Content that you upload, publish, or submit to any part of the Service, including the rights of integrity and attribution. However, you waive these rights and agree not to assert them against us, to enable us to reasonably exercise the rights granted above, but not otherwise.</p>
<p>To the extent this agreement is not enforceable by applicable law, you grant Your Gitea Instance the rights we need to use Your Content without attribution and to make reasonable adaptations of Your Content as necessary to render the Website and provide the Service.</p>
<p>To the extent this agreement is not enforceable by applicable law, you grant Your Forgejo Instance the rights we need to use Your Content without attribution and to make reasonable adaptations of Your Content as necessary to render the Website and provide the Service.</p>
</li>
</ol>
@ -106,27 +106,27 @@
<ol>
<li>Some Accounts may have private repositories, which allow the User to control access to Content.</li>
<li>Your Gitea Instance considers the contents of private repositories to be confidential to you. Your Gitea Instance will protect the contents of private repositories from unauthorized use, access, or disclosure in the same manner that we would use to protect our own confidential information of a similar nature and in no event with less than a reasonable degree of care.</li>
<li>Your Forgejo Instance considers the contents of private repositories to be confidential to you. Your Forgejo Instance will protect the contents of private repositories from unauthorized use, access, or disclosure in the same manner that we would use to protect our own confidential information of a similar nature and in no event with less than a reasonable degree of care.</li>
<li>
<p>Your Gitea Instance employees may only access the content of your private repositories in the following situations:</p>
<p>Your Forgejo Instance employees may only access the content of your private repositories in the following situations:</p>
<ul>
<li>With your consent and knowledge, for support reasons. If Your Gitea Instance accesses a private repository for support reasons, we will only do so with the owners consent and knowledge.</li>
<li>When access is required for security reasons, including when access is required to maintain ongoing confidentiality, integrity, availability and resilience of Your Gitea Instance's systems and Service.</li>
<li>With your consent and knowledge, for support reasons. If Your Forgejo Instance accesses a private repository for support reasons, we will only do so with the owners consent and knowledge.</li>
<li>When access is required for security reasons, including when access is required to maintain ongoing confidentiality, integrity, availability and resilience of Your Forgejo Instance's systems and Service.</li>
</ul>
</li>
<li>You may choose to enable additional access to your private repositories. For example: You may enable various Your Gitea Instance services or features that require additional rights to Your Content in private repositories. These rights may vary depending on the service or feature, but Your Gitea Instance will continue to treat your private repository Content as confidential. If those services or features require rights in addition to those we need to provide the Your Gitea Instance Service, we will provide an explanation of those rights.</li>
<li>You may choose to enable additional access to your private repositories. For example: You may enable various Your Forgejo Instance services or features that require additional rights to Your Content in private repositories. These rights may vary depending on the service or feature, but Your Forgejo Instance will continue to treat your private repository Content as confidential. If those services or features require rights in addition to those we need to provide the Your Forgejo Instance Service, we will provide an explanation of those rights.</li>
</ol>
<h2>Copyright Infringement and DMCA Policy</h2>
<p>If you are copyright owner and believe that content on our website violates your copyright, please contact us at <a href="mailto:copyright@your-gitea-instance">copyright@your-gitea-instance</a>. Please note that before sending a takedown notice, consider legal uses (such as fair use and licensed use); and legal consequences for sending false notices.</p>
<p>If you are copyright owner and believe that content on our website violates your copyright, please contact us at <a href="mailto:copyright@your-forgejo-instance">copyright@your-forgejo-instance</a>. Please note that before sending a takedown notice, consider legal uses (such as fair use and licensed use); and legal consequences for sending false notices.</p>
<h2>Intellectual Properties and COPYING</h2>
<p>Your Gitea Instance and our licensors, vendors, agents, and/or our content providers retain ownership of all intellectual property rights of any kind related to the Website and Service. We reserve all rights that are not expressly granted to you under this Agreement or by law. The look and feel of the Website and Service is copyright © Your Gitea Instance. All rights reserved.</p>
<p>Your Forgejo Instance and our licensors, vendors, agents, and/or our content providers retain ownership of all intellectual property rights of any kind related to the Website and Service. We reserve all rights that are not expressly granted to you under this Agreement or by law. The look and feel of the Website and Service is copyright © Your Forgejo Instance. All rights reserved.</p>
<p>If you'd like to use our trademarks, you must follow all of our trademark guidelines.</p>
@ -134,13 +134,13 @@
<h2>API Terms</h2>
<p>Abuse or excessively frequent requests to Your Gitea Instance via the API may result in the temporary or permanent suspension of your Account's access to the API. Your Gitea Instance, in our sole discretion, will determine abuse or excessive usage of the API. We will make a reasonable attempt to warn you via email prior to suspension.</p>
<p>Abuse or excessively frequent requests to Your Forgejo Instance via the API may result in the temporary or permanent suspension of your Account's access to the API. Your Forgejo Instance, in our sole discretion, will determine abuse or excessive usage of the API. We will make a reasonable attempt to warn you via email prior to suspension.</p>
<p>You may not share API tokens to exceed Your Gitea Instance's rate limitations.</p>
<p>You may not share API tokens to exceed Your Forgejo Instance's rate limitations.</p>
<p>You may not use the API to download data or Content from Your Gitea Instance for spamming purposes, including for the purposes of selling Your Gitea Instance users' personal information, such as to recruiters, headhunters, and job boards.</p>
<p>You may not use the API to download data or Content from Your Forgejo Instance for spamming purposes, including for the purposes of selling Your Forgejo Instance users' personal information, such as to recruiters, headhunters, and job boards.</p>
<p>All use of the Your Gitea Instance API is subject to these Terms of Service and the Your Gitea Instance Privacy Statement.</p>
<p>All use of the Your Forgejo Instance API is subject to these Terms of Service and the Your Forgejo Instance Privacy Statement.</p>
<p>However, we may provide subscription-based access to our API for Users who need high-throughput access or reselling our Service.</p>
@ -149,7 +149,7 @@
<h3>Account Cancellation</h3>
<p>It is your responsibility to properly cancel your Account with Your Gitea Instance. You can cancel your Account at any time by going into your Settings in the global navigation bar at the top of the screen. The Account screen provides a simple, no questions asked cancellation link. We are not able to cancel Accounts in response to an email or phone request.</p>
<p>It is your responsibility to properly cancel your Account with Your Forgejo Instance. You can cancel your Account at any time by going into your Settings in the global navigation bar at the top of the screen. The Account screen provides a simple, no questions asked cancellation link. We are not able to cancel Accounts in response to an email or phone request.</p>
<h3>Upon Cancellation</h3>
@ -161,7 +161,7 @@
<h3>We May Terminate</h3>
<p>Your Gitea Instance has the right to suspend or terminate your access to all or any part of the Website at any time, with or without cause, with or without notice, effective immediately. Your Gitea Instance reserves the right to refuse service to anyone for any reason at any time.</p>
<p>Your Forgejo Instance has the right to suspend or terminate your access to all or any part of the Website at any time, with or without cause, with or without notice, effective immediately. Your Forgejo Instance reserves the right to refuse service to anyone for any reason at any time.</p>
<h3>Survival</h3>
@ -175,7 +175,7 @@
<h3>Legal Notices to Us Must Be in Writing</h3>
<p>Communications made through email or Your Gitea Instance Support's messaging system will not constitute legal notice to Your Gitea Instance or any of its officers, employees, agents or representatives in any situation where notice to Your Gitea Instance is required by contract or any law or regulation. Legal notice to Your Gitea Instance must be in writing and served on Your Gitea Instance's legal agent.</p>
<p>Communications made through email or Your Forgejo Instance Support's messaging system will not constitute legal notice to Your Forgejo Instance or any of its officers, employees, agents or representatives in any situation where notice to Your Forgejo Instance is required by contract or any law or regulation. Legal notice to Your Forgejo Instance must be in writing and served on Your Forgejo Instance's legal agent.</p>
<h3>No Phone Support</h3>
@ -183,9 +183,9 @@
<h2>Disclaimer of Warranties</h2>
<p>Your Gitea Instance provides the Website and the Service “as is” and “as available,” without warranty of any kind. Without limiting this, we expressly disclaim all warranties, whether express, implied or statutory, regarding the Website and the Service including without limitation any warranty of merchantability, fitness for a particular purpose, title, security, accuracy and non-infringement.</p>
<p>Your Forgejo Instance provides the Website and the Service “as is” and “as available,” without warranty of any kind. Without limiting this, we expressly disclaim all warranties, whether express, implied or statutory, regarding the Website and the Service including without limitation any warranty of merchantability, fitness for a particular purpose, title, security, accuracy and non-infringement.</p>
<p>Your Gitea Instance does not warrant that the Service will meet your requirements; that the Service will be uninterrupted, timely, secure, or error-free; that the information provided through the Service is accurate, reliable or correct; that any defects or errors will be corrected; that the Service will be available at any particular time or location; or that the Service is free of viruses or other harmful components. You assume full responsibility and risk of loss resulting from your downloading and/or use of files, information, content or other material obtained from the Service.</p>
<p>Your Forgejo Instance does not warrant that the Service will meet your requirements; that the Service will be uninterrupted, timely, secure, or error-free; that the information provided through the Service is accurate, reliable or correct; that any defects or errors will be corrected; that the Service will be available at any particular time or location; or that the Service is free of viruses or other harmful components. You assume full responsibility and risk of loss resulting from your downloading and/or use of files, information, content or other material obtained from the Service.</p>
<h2>Limitation of Liability</h2>
@ -212,9 +212,9 @@
<h2>Release and Indemnification</h2>
<p>If you have a dispute with one or more Users, you agree to release Your Gitea Instance from any and all claims, demands and damages (actual and consequential) of every kind and nature, known and unknown, arising out of or in any way connected with such disputes.</p>
<p>If you have a dispute with one or more Users, you agree to release Your Forgejo Instance from any and all claims, demands and damages (actual and consequential) of every kind and nature, known and unknown, arising out of or in any way connected with such disputes.</p>
<p>You agree to indemnify us, defend us, and hold us harmless from and against any and all claims, liabilities, and expenses, including attorneys fees, arising out of your use of the Website and the Service, including but not limited to your violation of this Agreement, provided that Your Gitea Instance (1) promptly gives you written notice of the claim, demand, suit or proceeding; (2) gives you sole control of the defense and settlement of the claim, demand, suit or proceeding (provided that you may not settle any claim, demand, suit or proceeding unless the settlement unconditionally releases Your Gitea Instance of all liability); and (3) provides to you all reasonable assistance, at your expense.</p>
<p>You agree to indemnify us, defend us, and hold us harmless from and against any and all claims, liabilities, and expenses, including attorneys fees, arising out of your use of the Website and the Service, including but not limited to your violation of this Agreement, provided that Your Forgejo Instance (1) promptly gives you written notice of the claim, demand, suit or proceeding; (2) gives you sole control of the defense and settlement of the claim, demand, suit or proceeding (provided that you may not settle any claim, demand, suit or proceeding unless the settlement unconditionally releases Your Forgejo Instance of all liability); and (3) provides to you all reasonable assistance, at your expense.</p>
<h2>Changes to These Terms</h2>
@ -224,22 +224,22 @@
<h3>Governing Law</h3>
<p>Except to the extent applicable law provides otherwise, this Agreement between you and us and any access to or use of the Website or the Service are governed by (national laws of country/state where Gitea is deployed) and (regional laws of locality where Gitea is deployed), without regard to conflict of law provisions. You and Your Gitea Instance agree to submit to the exclusive jurisdiction and venue of the courts located in (locality where Gitea is deployed).</p>
<p>Except to the extent applicable law provides otherwise, this Agreement between you and us and any access to or use of the Website or the Service are governed by (national laws of country/state where Forgejo is deployed) and (regional laws of locality where Forgejo is deployed), without regard to conflict of law provisions. You and Your Forgejo Instance agree to submit to the exclusive jurisdiction and venue of the courts located in (locality where Forgejo is deployed).</p>
<h3>Non-Assignability</h3>
<p>Your Gitea Instance may assign or delegate these Terms of Service and/or our Privacy Policy in whole or in part, to any person or entity at any time with or without your consent, including the license granted in <i>User-Generated Content</i>. You may not assign or delegate any rights or obligations under the Terms of Service or Privacy Statement without our prior written consent, and any unauthorized assignment and delegation by you is void.</p>
<p>Your Forgejo Instance may assign or delegate these Terms of Service and/or our Privacy Policy in whole or in part, to any person or entity at any time with or without your consent, including the license granted in <i>User-Generated Content</i>. You may not assign or delegate any rights or obligations under the Terms of Service or Privacy Statement without our prior written consent, and any unauthorized assignment and delegation by you is void.</p>
<h3>Severablity, No Waiver, and Survival</h3>
<p>If any part of this Agreement is held invalid or unenforceable, that portion of the Agreement will be construed to reflect the parties original intent. The remaining portions will remain in full force and effect. Any failure on the part of Your Gitea Instance to enforce any provision of this Agreement will not be considered a waiver of our right to enforce such provision. Our rights under this Agreement will survive any termination of this Agreement.</p>
<p>If any part of this Agreement is held invalid or unenforceable, that portion of the Agreement will be construed to reflect the parties original intent. The remaining portions will remain in full force and effect. Any failure on the part of Your Forgejo Instance to enforce any provision of this Agreement will not be considered a waiver of our right to enforce such provision. Our rights under this Agreement will survive any termination of this Agreement.</p>
<h3>Amendments and Complete Agreement</h3>
<p>This Agreement may only be modified by a written amendment signed by an authorized representative of Your Gitea Instance, or by the posting by Your Gitea Instance of a revised version in accordance with <i>Changes to These Terms</i>. These Terms of Service, together with the Your Gitea Instance Privacy Policy, represent the complete and exclusive statement of the agreement between you and us. This Agreement supersedes any proposal or prior agreement oral or written, and any other communications between you and Your Gitea Instance relating to the subject matter of these terms including any confidentiality or nondisclosure agreements.</p>
<p>This Agreement may only be modified by a written amendment signed by an authorized representative of Your Forgejo Instance, or by the posting by Your Forgejo Instance of a revised version in accordance with <i>Changes to These Terms</i>. These Terms of Service, together with the Your Forgejo Instance Privacy Policy, represent the complete and exclusive statement of the agreement between you and us. This Agreement supersedes any proposal or prior agreement oral or written, and any other communications between you and Your Forgejo Instance relating to the subject matter of these terms including any confidentiality or nondisclosure agreements.</p>
<h3>Contact</h3>
<p>If you have questions about these Terms of Service, you can <a href="mailto:support@your-gitea-instance">contact our support</a>.</p>
<p>If you have questions about these Terms of Service, you can <a href="mailto:support@your-forgejo-instance">contact our support</a>.</p>
</body>
</html>

99
go.mod
View file

@ -13,7 +13,6 @@ require (
code.forgejo.org/go-chi/captcha v1.0.1
code.forgejo.org/go-chi/session v1.0.1
code.gitea.io/actions-proto-go v0.4.0
code.gitea.io/gitea-vet v0.2.3
code.gitea.io/sdk/gitea v0.17.1
codeberg.org/gusted/mcaptcha v0.0.0-20220723083913-4f3072e1d570
connectrpc.com/connect v1.17.0
@ -49,8 +48,7 @@ require (
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
github.com/go-swagger/go-swagger v0.30.5
github.com/go-testfixtures/testfixtures/v3 v3.12.0
github.com/go-testfixtures/testfixtures/v3 v3.14.0
github.com/go-webauthn/webauthn v0.11.2
github.com/gobwas/glob v0.2.3
github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f
@ -62,7 +60,6 @@ require (
github.com/google/uuid v1.6.0
github.com/gorilla/feeds v1.2.0
github.com/gorilla/sessions v1.4.0
github.com/h2non/gock v1.2.0
github.com/hashicorp/go-version v1.6.0
github.com/hashicorp/golang-lru/v2 v2.0.7
github.com/huandu/xstrings v1.5.0
@ -111,9 +108,8 @@ require (
golang.org/x/sync v0.10.0
golang.org/x/sys v0.28.0
golang.org/x/text v0.21.0
golang.org/x/tools v0.28.0
google.golang.org/grpc v1.68.0
google.golang.org/protobuf v1.36.0
google.golang.org/grpc v1.69.2
google.golang.org/protobuf v1.36.1
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
gopkg.in/ini.v1 v1.67.0
gopkg.in/yaml.v3 v3.0.1
@ -123,22 +119,26 @@ require (
)
require (
cloud.google.com/go/compute/metadata v0.5.0 // indirect
cel.dev/expr v0.16.2 // indirect
cloud.google.com/go v0.116.0 // indirect
cloud.google.com/go/auth v0.9.9 // indirect
cloud.google.com/go/auth/oauth2adapt v0.2.4 // indirect
cloud.google.com/go/compute/metadata v0.5.2 // indirect
cloud.google.com/go/iam v1.2.1 // indirect
cloud.google.com/go/longrunning v0.6.1 // indirect
cloud.google.com/go/monitoring v1.21.1 // indirect
cloud.google.com/go/spanner v1.73.0 // indirect
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/ClickHouse/ch-go v0.61.5 // indirect
github.com/ClickHouse/clickhouse-go/v2 v2.26.0 // indirect
github.com/DataDog/zstd v1.5.5 // indirect
github.com/Masterminds/goutils v1.1.1 // indirect
github.com/Masterminds/semver/v3 v3.2.1 // indirect
github.com/Masterminds/sprig/v3 v3.2.3 // indirect
github.com/Microsoft/go-winio v0.6.1 // indirect
github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0 // indirect
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.2 // indirect
github.com/Microsoft/go-winio v0.6.2 // indirect
github.com/RoaringBitmap/roaring v1.9.3 // indirect
github.com/andybalholm/brotli v1.1.0 // indirect
github.com/andybalholm/brotli v1.1.1 // indirect
github.com/andybalholm/cascadia v1.3.2 // indirect
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be // indirect
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
github.com/aymerick/douceur v0.2.0 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/bits-and-blooms/bitset v1.13.0 // indirect
@ -162,9 +162,11 @@ require (
github.com/boombuler/barcode v1.0.1 // indirect
github.com/bradfitz/gomemcache v0.0.0-20230905024940-24af94b03874 // indirect
github.com/caddyserver/zerossl v0.1.3 // indirect
github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect
github.com/cention-sany/utf7 v0.0.0-20170124080048-26cad61bd60a // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
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/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
@ -173,27 +175,22 @@ require (
github.com/dlclark/regexp2 v1.11.0 // 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
github.com/envoyproxy/protoc-gen-validate v1.1.0 // indirect
github.com/fatih/color v1.16.0 // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/fxamacker/cbor/v2 v2.7.0 // indirect
github.com/go-ap/errors v0.0.0-20231003111023-183eef4b31b7 // indirect
github.com/go-asn1-ber/asn1-ber v1.5.5 // indirect
github.com/go-enry/go-oniguruma v1.2.1 // indirect
github.com/go-faster/city v1.0.1 // indirect
github.com/go-faster/errors v0.7.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-ini/ini v1.67.0 // indirect
github.com/go-openapi/analysis v0.22.2 // indirect
github.com/go-openapi/errors v0.21.0 // indirect
github.com/go-openapi/inflect v0.19.0 // indirect
github.com/go-logr/logr v1.4.2 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-openapi/jsonpointer v0.20.2 // indirect
github.com/go-openapi/jsonreference v0.20.4 // indirect
github.com/go-openapi/loads v0.21.5 // indirect
github.com/go-openapi/runtime v0.26.2 // indirect
github.com/go-openapi/strfmt v0.22.0 // indirect
github.com/go-openapi/swag v0.22.7 // indirect
github.com/go-openapi/validate v0.22.6 // indirect
github.com/go-webauthn/x v0.1.14 // indirect
github.com/goccy/go-json v0.10.3 // indirect
github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
@ -205,24 +202,20 @@ require (
github.com/google/go-cmp v0.6.0 // indirect
github.com/google/go-querystring v1.1.0 // indirect
github.com/google/go-tpm v0.9.1 // indirect
github.com/google/s2a-go v0.1.8 // indirect
github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect
github.com/googleapis/gax-go/v2 v2.13.0 // indirect
github.com/googleapis/go-sql-spanner v1.7.4 // indirect
github.com/gorilla/css v1.0.1 // indirect
github.com/gorilla/handlers v1.5.2 // indirect
github.com/gorilla/mux v1.8.1 // indirect
github.com/gorilla/securecookie v1.1.2 // indirect
github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 // indirect
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
github.com/hashicorp/go-retryablehttp v0.7.7 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/imdario/mergo v0.3.16 // indirect
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
github.com/jessevdk/go-flags v1.5.0 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/kevinburke/ssh_config v1.2.0 // indirect
github.com/klauspost/pgzip v1.2.6 // indirect
github.com/kr/pretty v0.3.1 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/libdns/libdns v0.2.2 // indirect
github.com/magiconair/properties v1.8.7 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/markbates/going v1.0.3 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
@ -230,66 +223,58 @@ require (
github.com/mholt/acmez/v2 v2.0.3 // indirect
github.com/miekg/dns v1.1.62 // indirect
github.com/minio/md5-simd v1.1.2 // indirect
github.com/mitchellh/copystructure v1.2.0 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/mitchellh/reflectwalk v1.0.2 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/mrjones/oauth v0.0.0-20190623134757-126b35219450 // indirect
github.com/mschoch/smat v0.2.0 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/nwaples/rardecode v1.1.3 // indirect
github.com/oklog/ulid v1.3.1 // indirect
github.com/olekukonko/tablewriter v0.0.5 // indirect
github.com/onsi/ginkgo v1.16.5 // indirect
github.com/paulmach/orb v0.11.1 // indirect
github.com/pelletier/go-toml/v2 v2.1.1 // indirect
github.com/pierrec/lz4/v4 v4.1.21 // indirect
github.com/pjbgf/sha1cd v0.3.0 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/prometheus/client_model v0.6.1 // indirect
github.com/prometheus/common v0.55.0 // indirect
github.com/prometheus/procfs v0.15.1 // indirect
github.com/rhysd/actionlint v1.6.27 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
github.com/rogpeppe/go-internal v1.12.0 // indirect
github.com/rs/xid v1.6.0 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/sagikazarmark/locafero v0.4.0 // indirect
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
github.com/segmentio/asm v1.2.0 // indirect
github.com/shopspring/decimal v1.4.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/sourcegraph/conc v0.3.0 // indirect
github.com/spf13/afero v1.11.0 // indirect
github.com/spf13/cast v1.6.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/spf13/viper v1.18.2 // indirect
github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf // indirect
github.com/subosito/gotenv v1.6.0 // indirect
github.com/toqueteos/webbrowser v1.2.0 // 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
go.etcd.io/bbolt v1.3.9 // indirect
go.mongodb.org/mongo-driver v1.13.1 // indirect
go.opentelemetry.io/otel v1.26.0 // indirect
go.opentelemetry.io/otel/trace v1.26.0 // indirect
go.opencensus.io v0.24.0 // indirect
go.opentelemetry.io/contrib/detectors/gcp v1.31.0 // indirect
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 // indirect
go.opentelemetry.io/otel v1.31.0 // indirect
go.opentelemetry.io/otel/metric v1.31.0 // indirect
go.opentelemetry.io/otel/sdk v1.31.0 // indirect
go.opentelemetry.io/otel/sdk/metric v1.31.0 // indirect
go.opentelemetry.io/otel/trace v1.31.0 // indirect
go.uber.org/atomic v1.11.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
golang.org/x/exp v0.0.0-20240119083558-1b970713d09a // indirect
golang.org/x/mod v0.22.0 // indirect
golang.org/x/time v0.5.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect
golang.org/x/time v0.7.0 // indirect
golang.org/x/tools v0.28.0 // indirect
google.golang.org/api v0.203.0 // indirect
google.golang.org/genproto v0.0.0-20241015192408-796eee8c2d53 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20241015192408-796eee8c2d53 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53 // indirect
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
gopkg.in/warnings.v0 v0.1.2 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
)
replace github.com/hashicorp/go-version => github.com/6543/go-version v1.3.1

1594
go.sum

File diff suppressed because it is too large Load diff

View file

@ -153,28 +153,34 @@ func UpdateRunJob(ctx context.Context, job *ActionRunJob, cond builder.Cond, col
}
func AggregateJobStatus(jobs []*ActionRunJob) Status {
allDone := true
allWaiting := true
hasFailure := false
allSuccessOrSkipped := len(jobs) != 0
allSkipped := len(jobs) != 0
var hasFailure, hasCancelled, hasWaiting, hasRunning, hasBlocked bool
for _, job := range jobs {
if !job.Status.IsDone() {
allDone = false
}
if job.Status != StatusWaiting && !job.Status.IsDone() {
allWaiting = false
}
if job.Status == StatusFailure || job.Status == StatusCancelled {
hasFailure = true
}
allSuccessOrSkipped = allSuccessOrSkipped && (job.Status == StatusSuccess || job.Status == StatusSkipped)
allSkipped = allSkipped && job.Status == StatusSkipped
hasFailure = hasFailure || job.Status == StatusFailure
hasCancelled = hasCancelled || job.Status == StatusCancelled
hasWaiting = hasWaiting || job.Status == StatusWaiting
hasRunning = hasRunning || job.Status == StatusRunning
hasBlocked = hasBlocked || job.Status == StatusBlocked
}
if allDone {
if hasFailure {
return StatusFailure
}
switch {
case allSkipped:
return StatusSkipped
case allSuccessOrSkipped:
return StatusSuccess
}
if allWaiting {
case hasCancelled:
return StatusCancelled
case hasFailure:
return StatusFailure
case hasRunning:
return StatusRunning
case hasWaiting:
return StatusWaiting
case hasBlocked:
return StatusBlocked
default:
return StatusUnknown // it shouldn't happen
}
return StatusRunning
}

View file

@ -0,0 +1,85 @@
// Copyright 2024 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package actions
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestAggregateJobStatus(t *testing.T) {
testStatuses := func(expected Status, statuses []Status) {
t.Helper()
var jobs []*ActionRunJob
for _, v := range statuses {
jobs = append(jobs, &ActionRunJob{Status: v})
}
actual := AggregateJobStatus(jobs)
if !assert.Equal(t, expected, actual) {
var statusStrings []string
for _, s := range statuses {
statusStrings = append(statusStrings, s.String())
}
t.Errorf("AggregateJobStatus(%v) = %v, want %v", statusStrings, statusNames[actual], statusNames[expected])
}
}
cases := []struct {
statuses []Status
expected Status
}{
// unknown cases, maybe it shouldn't happen in real world
{[]Status{}, StatusUnknown},
{[]Status{StatusUnknown, StatusSuccess}, StatusUnknown},
{[]Status{StatusUnknown, StatusSkipped}, StatusUnknown},
{[]Status{StatusUnknown, StatusFailure}, StatusFailure},
{[]Status{StatusUnknown, StatusCancelled}, StatusCancelled},
{[]Status{StatusUnknown, StatusWaiting}, StatusWaiting},
{[]Status{StatusUnknown, StatusRunning}, StatusRunning},
{[]Status{StatusUnknown, StatusBlocked}, StatusBlocked},
// success with other status
{[]Status{StatusSuccess}, StatusSuccess},
{[]Status{StatusSuccess, StatusSkipped}, StatusSuccess}, // skipped doesn't affect success
{[]Status{StatusSuccess, StatusFailure}, StatusFailure},
{[]Status{StatusSuccess, StatusCancelled}, StatusCancelled},
{[]Status{StatusSuccess, StatusWaiting}, StatusWaiting},
{[]Status{StatusSuccess, StatusRunning}, StatusRunning},
{[]Status{StatusSuccess, StatusBlocked}, StatusBlocked},
// any cancelled, then cancelled
{[]Status{StatusCancelled}, StatusCancelled},
{[]Status{StatusCancelled, StatusSuccess}, StatusCancelled},
{[]Status{StatusCancelled, StatusSkipped}, StatusCancelled},
{[]Status{StatusCancelled, StatusFailure}, StatusCancelled},
{[]Status{StatusCancelled, StatusWaiting}, StatusCancelled},
{[]Status{StatusCancelled, StatusRunning}, StatusCancelled},
{[]Status{StatusCancelled, StatusBlocked}, StatusCancelled},
// failure with other status, fail fast
// Should "running" win? Maybe no: old code does make "running" win, but GitHub does fail fast.
{[]Status{StatusFailure}, StatusFailure},
{[]Status{StatusFailure, StatusSuccess}, StatusFailure},
{[]Status{StatusFailure, StatusSkipped}, StatusFailure},
{[]Status{StatusFailure, StatusCancelled}, StatusCancelled},
{[]Status{StatusFailure, StatusWaiting}, StatusFailure},
{[]Status{StatusFailure, StatusRunning}, StatusFailure},
{[]Status{StatusFailure, StatusBlocked}, StatusFailure},
// skipped with other status
// TODO: need to clarify whether a PR with "skipped" job status is considered as "mergeable" or not.
{[]Status{StatusSkipped}, StatusSkipped},
{[]Status{StatusSkipped, StatusSuccess}, StatusSuccess},
{[]Status{StatusSkipped, StatusFailure}, StatusFailure},
{[]Status{StatusSkipped, StatusCancelled}, StatusCancelled},
{[]Status{StatusSkipped, StatusWaiting}, StatusWaiting},
{[]Status{StatusSkipped, StatusRunning}, StatusRunning},
{[]Status{StatusSkipped, StatusBlocked}, StatusBlocked},
}
for _, c := range cases {
testStatuses(c.expected, c.statuses)
}
}

View file

@ -432,6 +432,25 @@
updated: 1683636626
need_approval: 0
approved_by: 0
-
id: 794
title: "job output"
repo_id: 4
owner_id: 1
workflow_id: "test.yaml"
index: 190
trigger_user_id: 1
ref: "refs/heads/test"
commit_sha: "c2d72f548424103f01ee1dc02889c1e2bff816b0"
event: "push"
is_fork_pull_request: 0
status: 1
started: 1683636528
stopped: 1683636626
created: 1683636108
updated: 1683636626
need_approval: 0
approved_by: 0
-
id: 891
title: "update actions"

View file

@ -45,3 +45,15 @@
is_deleted: false
deleted_by_id: 0
deleted_unix: 0
-
id: 15
repo_id: 4
name: 'master'
commit_id: 'c7cd3cd144e6d23c9d6f3d07e52b2c1a956e0338'
commit_message: 'add Readme'
commit_time: 1588147171
pusher_id: 13
is_deleted: false
deleted_by_id: 0
deleted_unix: 0

View file

@ -20,9 +20,34 @@ import (
func MigrateTwoFactorToKeying(x *xorm.Engine) error {
var err error
// When upgrading from Forgejo v9 to v10, this migration will already be
// called from models/migrations/migrations.go migration 304 and must not
// be run twice.
var version int
_, err = x.Table("version").Where("`id` = 1").Select("version").Get(&version)
if err != nil {
// the version table does not exist when a test environment only applies Forgejo migrations
} else if version > 304 {
return nil
}
switch x.Dialect().URI().DBType {
case schemas.MYSQL:
_, err = x.Exec("ALTER TABLE `two_factor` MODIFY `secret` BLOB")
case schemas.SQLITE:
_, err = x.Exec("ALTER TABLE `two_factor` RENAME COLUMN `secret` TO `secret_backup`")
if err != nil {
return err
}
_, err = x.Exec("ALTER TABLE `two_factor` ADD COLUMN `secret` BLOB")
if err != nil {
return err
}
_, err = x.Exec("UPDATE `two_factor` SET `secret` = `secret_backup`")
if err != nil {
return err
}
_, err = x.Exec("ALTER TABLE `two_factor` DROP COLUMN `secret_backup`")
case schemas.POSTGRES:
_, err = x.Exec("ALTER TABLE `two_factor` ALTER COLUMN `secret` SET DATA TYPE bytea USING secret::text::bytea")
}

View file

@ -362,6 +362,10 @@ func prepareMigrationTasks() []*migration {
newMigration(300, "Add force-push branch protection support", v1_23.AddForcePushBranchProtection),
newMigration(301, "Add skip_secondary_authorization option to oauth2 application table", v1_23.AddSkipSecondaryAuthColumnToOAuth2ApplicationTable),
newMigration(302, "Add index to action_task stopped log_expired", v1_23.AddIndexToActionTaskStoppedLogExpired),
// Migration to Forgejo v10
newMigration(303, "Gitea last drop", v1_23.GiteaLastDrop),
newMigration(304, "Migrate `secret` column to store keying material", forgejo_migrations.MigrateTwoFactorToKeying),
}
return preparedMigrations
}

View file

@ -0,0 +1,33 @@
// Copyright 2024 The Forgejo Authors.
// SPDX-License-Identifier: MIT
package v1_23 //nolint
import (
"code.gitea.io/gitea/models/migrations/base"
"xorm.io/xorm"
)
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
}
return sess.Commit()
}

View file

@ -29,6 +29,15 @@ const (
MergeStyleRebaseUpdate MergeStyle = "rebase-update-only"
)
type UpdateStyle string
const (
// UpdateStyleMerge create merge commit to update
UpdateStyleMerge UpdateStyle = "merge"
// UpdateStyleRebase rebase to update
UpdateStyleRebase UpdateStyle = "rebase"
)
// UpdateDefaultBranch updates the default branch
func UpdateDefaultBranch(ctx context.Context, repo *Repository) error {
_, err := db.GetEngine(ctx).ID(repo.ID).Cols("default_branch").Update(repo)

View file

@ -159,6 +159,7 @@ type PullRequestsConfig struct {
AllowRebaseUpdate bool
DefaultDeleteBranchAfterMerge bool
DefaultMergeStyle MergeStyle
DefaultUpdateStyle UpdateStyle
DefaultAllowMaintainerEdit bool
}
@ -197,6 +198,25 @@ func (cfg *PullRequestsConfig) GetDefaultMergeStyle() MergeStyle {
return MergeStyleMerge
}
// IsUpdateStyleAllowed returns if update style is allowed
func (cfg *PullRequestsConfig) IsUpdateStyleAllowed(updateStyle UpdateStyle) bool {
return updateStyle == UpdateStyleMerge ||
updateStyle == UpdateStyleRebase && cfg.AllowRebaseUpdate
}
// GetDefaultUpdateStyle returns the default update style for this pull request
func (cfg *PullRequestsConfig) GetDefaultUpdateStyle() UpdateStyle {
if len(cfg.DefaultUpdateStyle) != 0 {
return cfg.DefaultUpdateStyle
}
if setting.Repository.PullRequest.DefaultUpdateStyle != "" {
return UpdateStyle(setting.Repository.PullRequest.DefaultUpdateStyle)
}
return UpdateStyleMerge
}
type ActionsConfig struct {
DisabledWorkflows []string
}

View file

@ -7,6 +7,8 @@ import (
"testing"
"code.gitea.io/gitea/models/perm"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/test"
"github.com/stretchr/testify/assert"
)
@ -37,3 +39,50 @@ func TestRepoUnitAccessMode(t *testing.T) {
assert.Equal(t, perm.AccessModeWrite, UnitAccessModeWrite.ToAccessMode(perm.AccessModeAdmin))
assert.Equal(t, perm.AccessModeRead, UnitAccessModeUnset.ToAccessMode(perm.AccessModeRead))
}
func TestRepoPRIsUpdateStyleAllowed(t *testing.T) {
var cfg PullRequestsConfig
cfg = PullRequestsConfig{
AllowRebaseUpdate: true,
}
assert.True(t, cfg.IsUpdateStyleAllowed(UpdateStyleMerge))
assert.True(t, cfg.IsUpdateStyleAllowed(UpdateStyleRebase))
cfg = PullRequestsConfig{
AllowRebaseUpdate: false,
}
assert.True(t, cfg.IsUpdateStyleAllowed(UpdateStyleMerge))
assert.False(t, cfg.IsUpdateStyleAllowed(UpdateStyleRebase))
}
func TestRepoPRGetDefaultUpdateStyle(t *testing.T) {
defer test.MockVariableValue(&setting.Repository.PullRequest.DefaultUpdateStyle, "merge")()
var cfg PullRequestsConfig
cfg = PullRequestsConfig{
DefaultUpdateStyle: "",
}
assert.Equal(t, UpdateStyleMerge, cfg.GetDefaultUpdateStyle())
cfg = PullRequestsConfig{
DefaultUpdateStyle: "rebase",
}
assert.Equal(t, UpdateStyleRebase, cfg.GetDefaultUpdateStyle())
cfg = PullRequestsConfig{
DefaultUpdateStyle: "merge",
}
assert.Equal(t, UpdateStyleMerge, cfg.GetDefaultUpdateStyle())
setting.Repository.PullRequest.DefaultUpdateStyle = "rebase"
cfg = PullRequestsConfig{
DefaultUpdateStyle: "",
}
assert.Equal(t, UpdateStyleRebase, cfg.GetDefaultUpdateStyle())
cfg = PullRequestsConfig{
DefaultUpdateStyle: "rebase",
}
assert.Equal(t, UpdateStyleRebase, cfg.GetDefaultUpdateStyle())
cfg = PullRequestsConfig{
DefaultUpdateStyle: "merge",
}
assert.Equal(t, UpdateStyleMerge, cfg.GetDefaultUpdateStyle())
}

View file

@ -18,10 +18,10 @@ import (
)
type Setting struct {
ID int64 `xorm:"pk autoincr"`
SettingKey string `xorm:"varchar(255) unique"` // key should be lowercase
SettingValue string `xorm:"text"`
Version int `xorm:"version"`
ID int64 `xorm:"pk autoincr"`
SettingKey string `xorm:"varchar(255) unique"` // key should be lowercase
SettingValue string `xorm:"text"`
Version int
Created timeutil.TimeStamp `xorm:"created"`
Updated timeutil.TimeStamp `xorm:"updated"`
}

View file

@ -4,47 +4,80 @@
package pwn
import (
"errors"
"io"
"net/http"
"strings"
"testing"
"time"
"github.com/h2non/gock"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
type mockTransport struct{}
func (mockTransport) RoundTrip(req *http.Request) (*http.Response, error) {
if req.URL.Host != "api.pwnedpasswords.com" {
return nil, errors.New("unexpected host")
}
res := &http.Response{
ProtoMajor: 1,
ProtoMinor: 1,
Proto: "HTTP/1.1",
Request: req,
Header: make(http.Header),
StatusCode: 200,
}
switch req.URL.Path {
case "/range/5c1d8":
res.Body = io.NopCloser(strings.NewReader("EAF2F254732680E8AC339B84F3266ECCBB5:1\r\nFC446EB88938834178CB9322C1EE273C2A7:2"))
return res, nil
case "/range/ba189":
res.Body = io.NopCloser(strings.NewReader("FD4CB34F0378BCB15D23F6FFD28F0775C9E:3\r\nFDF342FCD8C3611DAE4D76E8A992A3E4169:4"))
return res, nil
case "/range/a1733":
res.Body = io.NopCloser(strings.NewReader("C4CE0F1F0062B27B9E2F41AF0C08218017C:1\r\nFC446EB88938834178CB9322C1EE273C2A7:2\r\nFE81480327C992FE62065A827429DD1318B:0"))
return res, nil
case "/range/5617b":
res.Body = io.NopCloser(strings.NewReader("FD4CB34F0378BCB15D23F6FFD28F0775C9E:3\r\nFDF342FCD8C3611DAE4D76E8A992A3E4169:4\r\nFE81480327C992FE62065A827429DD1318B:0"))
return res, nil
case "/range/79082":
res.Body = io.NopCloser(strings.NewReader("FDF342FCD8C3611DAE4D76E8A992A3E4169:4\r\nFE81480327C992FE62065A827429DD1318B:0\r\nAFEF386F56EB0B4BE314E07696E5E6E6536:0"))
return res, nil
}
return nil, errors.New("unexpected path")
}
var client = New(WithHTTP(&http.Client{
Timeout: time.Second * 2,
Timeout: time.Second * 2,
Transport: mockTransport{},
}))
func TestPassword(t *testing.T) {
defer gock.Off()
count, err := client.CheckPassword("", false)
require.ErrorIs(t, err, ErrEmptyPassword, "blank input should return ErrEmptyPassword")
assert.Equal(t, -1, count)
gock.New("https://api.pwnedpasswords.com").Get("/range/5c1d8").Times(1).Reply(200).BodyString("EAF2F254732680E8AC339B84F3266ECCBB5:1\r\nFC446EB88938834178CB9322C1EE273C2A7:2")
count, err = client.CheckPassword("pwned", false)
require.NoError(t, err)
assert.Equal(t, 1, count)
gock.New("https://api.pwnedpasswords.com").Get("/range/ba189").Times(1).Reply(200).BodyString("FD4CB34F0378BCB15D23F6FFD28F0775C9E:3\r\nFDF342FCD8C3611DAE4D76E8A992A3E4169:4")
count, err = client.CheckPassword("notpwned", false)
require.NoError(t, err)
assert.Equal(t, 0, count)
gock.New("https://api.pwnedpasswords.com").Get("/range/a1733").Times(1).Reply(200).BodyString("C4CE0F1F0062B27B9E2F41AF0C08218017C:1\r\nFC446EB88938834178CB9322C1EE273C2A7:2\r\nFE81480327C992FE62065A827429DD1318B:0")
count, err = client.CheckPassword("paddedpwned", true)
require.NoError(t, err)
assert.Equal(t, 1, count)
gock.New("https://api.pwnedpasswords.com").Get("/range/5617b").Times(1).Reply(200).BodyString("FD4CB34F0378BCB15D23F6FFD28F0775C9E:3\r\nFDF342FCD8C3611DAE4D76E8A992A3E4169:4\r\nFE81480327C992FE62065A827429DD1318B:0")
count, err = client.CheckPassword("paddednotpwned", true)
require.NoError(t, err)
assert.Equal(t, 0, count)
gock.New("https://api.pwnedpasswords.com").Get("/range/79082").Times(1).Reply(200).BodyString("FDF342FCD8C3611DAE4D76E8A992A3E4169:4\r\nFE81480327C992FE62065A827429DD1318B:0\r\nAFEF386F56EB0B4BE314E07696E5E6E6536:0")
count, err = client.CheckPassword("paddednotpwnedzero", true)
require.NoError(t, err)
assert.Equal(t, 0, count)

View file

@ -36,13 +36,15 @@ const (
RegExpGrepMode
)
var GrepSearchOptions = [3]string{"exact", "union", "regexp"}
type GrepOptions struct {
RefName string
MaxResultLimit int
MatchesPerFile int // >= git 2.38
ContextLineNumber int
Mode grepMode
PathSpec []setting.Glob
Filename string
}
func (opts *GrepOptions) ensureDefaults() {
@ -112,12 +114,38 @@ func GrepSearch(ctx context.Context, repo *Repository, search string, opts GrepO
}
// pathspec
files := make([]string, 0,
len(setting.Indexer.IncludePatterns)+
len(setting.Indexer.ExcludePatterns)+
len(opts.PathSpec))
for _, expr := range append(setting.Indexer.IncludePatterns, opts.PathSpec...) {
files = append(files, ":"+expr.Pattern())
includeLen := len(setting.Indexer.IncludePatterns)
if len(opts.Filename) > 0 {
includeLen = 1
}
files := make([]string, 0, len(setting.Indexer.ExcludePatterns)+includeLen)
if len(opts.Filename) > 0 && len(setting.Indexer.IncludePatterns) > 0 {
// if the both a global include pattern and the per search path is defined
// we only include results where the path matches the globally set pattern
// (eg, global pattern = "src/**" and path = "node_modules/")
// FIXME: this is a bit too restrictive, and fails to consider cases where the
// gloabally set include pattern refers to a file than a directory
// (eg, global pattern = "**.go" and path = "modules/git")
exprMatched := false
for _, expr := range setting.Indexer.IncludePatterns {
if expr.Match(opts.Filename) {
files = append(files, ":(literal)"+opts.Filename)
exprMatched = true
break
}
}
if !exprMatched {
log.Warn("git-grep: filepath %s does not match any include pattern", opts.Filename)
}
} else if len(opts.Filename) > 0 {
// if the path is only set we just include results that matches it
files = append(files, ":(literal)"+opts.Filename)
} else {
// otherwise if global include patterns are set include results that strictly match them
for _, expr := range setting.Indexer.IncludePatterns {
files = append(files, ":"+expr.Pattern())
}
}
for _, expr := range setting.Indexer.ExcludePatterns {
files = append(files, ":^"+expr.Pattern())

View file

@ -89,6 +89,20 @@ func TestGrepSearch(t *testing.T) {
},
}, res)
res, err = GrepSearch(context.Background(), repo, "world", GrepOptions{
MatchesPerFile: 1,
Filename: "java-hello/",
})
require.NoError(t, err)
assert.Equal(t, []*GrepResult{
{
Filename: "java-hello/main.java",
LineNumbers: []int{1},
LineCodes: []string{"public class HelloWorld"},
HighlightedRanges: [][3]int{{0, 18, 23}},
},
}, res)
res, err = GrepSearch(context.Background(), repo, "no-such-content", GrepOptions{})
require.NoError(t, err)
assert.Empty(t, res)

View file

@ -230,7 +230,7 @@ func (repo *Repository) CommitsByFileAndRange(opts CommitsByFileAndRangeOptions)
go func() {
stderr := strings.Builder{}
gitCmd := NewCommand(repo.Ctx, "rev-list").
AddOptionFormat("--max-count=%d", setting.Git.CommitsRangeSize*opts.Page).
AddOptionFormat("--max-count=%d", setting.Git.CommitsRangeSize).
AddOptionFormat("--skip=%d", skip)
gitCmd.AddDynamicArguments(opts.Revision)

View file

@ -7,6 +7,9 @@ import (
"path/filepath"
"testing"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/test"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
@ -138,3 +141,61 @@ func TestGetTagCommit(t *testing.T) {
require.NoError(t, err)
assert.EqualValues(t, lTagCommitID, lTag.ID.String())
}
func TestCommitsByRange(t *testing.T) {
bareRepo1Path := filepath.Join(testReposDir, "repo1_bare")
bareRepo1, err := openRepositoryWithDefaultContext(bareRepo1Path)
require.NoError(t, err)
defer bareRepo1.Close()
baseCommit, err := bareRepo1.GetBranchCommit("master")
require.NoError(t, err)
testCases := []struct {
Page int
ExpectedCommitCount int
}{
{1, 3},
{2, 3},
{3, 1},
{4, 0},
}
for _, testCase := range testCases {
commits, err := baseCommit.CommitsByRange(testCase.Page, 3, "")
require.NoError(t, err)
assert.Len(t, commits, testCase.ExpectedCommitCount, "page: %d", testCase.Page)
}
}
func TestCommitsByFileAndRange(t *testing.T) {
bareRepo1Path := filepath.Join(testReposDir, "repo1_bare")
bareRepo1, err := openRepositoryWithDefaultContext(bareRepo1Path)
require.NoError(t, err)
defer bareRepo1.Close()
defer test.MockVariableValue(&setting.Git.CommitsRangeSize, 2)()
testCases := []struct {
File string
Page int
ExpectedCommitCount int
}{
{"file1.txt", 1, 1},
{"file2.txt", 1, 1},
{"file*.txt", 1, 2},
{"foo", 1, 2},
{"foo", 2, 1},
{"foo", 3, 0},
{"f*", 1, 2},
{"f*", 2, 2},
{"f*", 3, 1},
}
for _, testCase := range testCases {
commits, err := bareRepo1.CommitsByFileAndRange(CommitsByFileAndRangeOptions{
Revision: "master",
File: testCase.File,
Page: testCase.Page,
})
require.NoError(t, err)
assert.Len(t, commits, testCase.ExpectedCommitCount, "file: '%s', page: %d", testCase.File, testCase.Page)
}
}

View file

@ -17,6 +17,7 @@ import (
"code.gitea.io/gitea/modules/charset"
"code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/gitrepo"
tokenizer_hierarchy "code.gitea.io/gitea/modules/indexer/code/bleve/tokenizer/hierarchy"
"code.gitea.io/gitea/modules/indexer/code/internal"
indexer_internal "code.gitea.io/gitea/modules/indexer/internal"
inner_bleve "code.gitea.io/gitea/modules/indexer/internal/bleve"
@ -56,6 +57,7 @@ func addUnicodeNormalizeTokenFilter(m *mapping.IndexMappingImpl) error {
type RepoIndexerData struct {
RepoID int64
CommitID string
Filename string
Content string
Language string
UpdatedAt time.Time
@ -69,7 +71,8 @@ func (d *RepoIndexerData) Type() string {
const (
repoIndexerAnalyzer = "repoIndexerAnalyzer"
repoIndexerDocType = "repoIndexerDocType"
repoIndexerLatestVersion = 6
pathHierarchyAnalyzer = "pathHierarchyAnalyzer"
repoIndexerLatestVersion = 7
)
// generateBleveIndexMapping generates a bleve index mapping for the repo indexer
@ -89,6 +92,11 @@ func generateBleveIndexMapping() (mapping.IndexMapping, error) {
docMapping.AddFieldMappingsAt("Language", termFieldMapping)
docMapping.AddFieldMappingsAt("CommitID", termFieldMapping)
pathFieldMapping := bleve.NewTextFieldMapping()
pathFieldMapping.IncludeInAll = false
pathFieldMapping.Analyzer = pathHierarchyAnalyzer
docMapping.AddFieldMappingsAt("Filename", pathFieldMapping)
timeFieldMapping := bleve.NewDateTimeFieldMapping()
timeFieldMapping.IncludeInAll = false
docMapping.AddFieldMappingsAt("UpdatedAt", timeFieldMapping)
@ -103,6 +111,13 @@ func generateBleveIndexMapping() (mapping.IndexMapping, error) {
"token_filters": []string{unicodeNormalizeName, camelcase.Name, lowercase.Name},
}); err != nil {
return nil, err
} else if err := mapping.AddCustomAnalyzer(pathHierarchyAnalyzer, map[string]any{
"type": analyzer_custom.Name,
"char_filters": []string{},
"tokenizer": tokenizer_hierarchy.Name,
"token_filters": []string{unicodeNormalizeName},
}); err != nil {
return nil, err
}
mapping.DefaultAnalyzer = repoIndexerAnalyzer
mapping.AddDocumentMapping(repoIndexerDocType, docMapping)
@ -178,6 +193,7 @@ func (b *Indexer) addUpdate(ctx context.Context, batchWriter git.WriteCloserErro
return batch.Index(id, &RepoIndexerData{
RepoID: repo.ID,
CommitID: commitSha,
Filename: update.Filename,
Content: string(charset.ToUTF8DropErrors(fileContents, charset.ConvertOpts{})),
Language: analyze.GetCodeLanguage(update.Filename, fileContents),
UpdatedAt: time.Now().UTC(),
@ -266,22 +282,30 @@ func (b *Indexer) Search(ctx context.Context, opts *internal.SearchOptions) (int
indexerQuery = keywordQuery
}
opts.Filename = strings.Trim(opts.Filename, "/")
if len(opts.Filename) > 0 {
// we use a keyword analyzer for the query than path hierarchy analyzer
// to match only the exact path
// eg, a query for modules/indexer/code
// should not provide results for modules/ nor modules/indexer
indexerQuery = bleve.NewConjunctionQuery(
indexerQuery,
inner_bleve.MatchQuery(opts.Filename, "Filename", analyzer_keyword.Name, 0),
)
}
// Save for reuse without language filter
facetQuery := indexerQuery
if len(opts.Language) > 0 {
languageQuery := bleve.NewMatchQuery(opts.Language)
languageQuery.FieldVal = "Language"
languageQuery.Analyzer = analyzer_keyword.Name
indexerQuery = bleve.NewConjunctionQuery(
indexerQuery,
languageQuery,
inner_bleve.MatchQuery(opts.Language, "Language", analyzer_keyword.Name, 0),
)
}
from, pageSize := opts.GetSkipTake()
searchRequest := bleve.NewSearchRequestOptions(indexerQuery, pageSize, from, false)
searchRequest.Fields = []string{"Content", "RepoID", "Language", "CommitID", "UpdatedAt"}
searchRequest.Fields = []string{"Content", "RepoID", "Filename", "Language", "CommitID", "UpdatedAt"}
searchRequest.IncludeLocations = true
if len(opts.Language) == 0 {
@ -320,7 +344,7 @@ func (b *Indexer) Search(ctx context.Context, opts *internal.SearchOptions) (int
RepoID: int64(hit.Fields["RepoID"].(float64)),
StartIndex: startIndex,
EndIndex: endIndex,
Filename: internal.FilenameOfIndexerID(hit.ID),
Filename: hit.Fields["Filename"].(string),
Content: hit.Fields["Content"].(string),
CommitID: hit.Fields["CommitID"].(string),
UpdatedUnix: updatedUnix,
@ -333,7 +357,7 @@ func (b *Indexer) Search(ctx context.Context, opts *internal.SearchOptions) (int
if len(opts.Language) > 0 {
// Use separate query to go get all language counts
facetRequest := bleve.NewSearchRequestOptions(facetQuery, 1, 0, false)
facetRequest.Fields = []string{"Content", "RepoID", "Language", "CommitID", "UpdatedAt"}
facetRequest.Fields = []string{"Content", "RepoID", "Filename", "Language", "CommitID", "UpdatedAt"}
facetRequest.IncludeLocations = true
facetRequest.AddFacet("languages", bleve.NewFacetRequest("Language", 10))

View file

@ -0,0 +1,69 @@
// Copyright 2024 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package hierarchy
import (
"bytes"
"github.com/blevesearch/bleve/v2/analysis"
"github.com/blevesearch/bleve/v2/registry"
)
const Name = "path_hierarchy"
type PathHierarchyTokenizer struct{}
// Similar to elastic's path_hierarchy tokenizer
// This tokenizes a given path into all the possible hierarchies
// For example,
// modules/indexer/code/search.go =>
//
// modules/
// modules/indexer
// modules/indexer/code
// modules/indexer/code/search.go
func (t *PathHierarchyTokenizer) Tokenize(input []byte) analysis.TokenStream {
// trim any extra slashes
input = bytes.Trim(input, "/")
// zero allocations until the nested directories exceed a depth of 8 (which is unlikely)
rv := make(analysis.TokenStream, 0, 8)
count, off := 1, 0
// iterate till all directory seperators
for i := bytes.IndexRune(input[off:], '/'); i != -1; i = bytes.IndexRune(input[off:], '/') {
// the index is relative to input[offest...]
// add this index to the accumlated offset to get the index of the current seperator in input[0...]
off += i
rv = append(rv, &analysis.Token{
Term: input[:off], // take the slice, input[0...index of seperator]
Start: 0,
End: off,
Position: count,
Type: analysis.AlphaNumeric,
})
// increment the offset after considering the seperator
off++
count++
}
// the entire file path should always be the last token
rv = append(rv, &analysis.Token{
Term: input,
Start: 0,
End: len(input),
Position: count,
Type: analysis.AlphaNumeric,
})
return rv
}
func TokenizerConstructor(config map[string]any, cache *registry.Cache) (analysis.Tokenizer, error) {
return &PathHierarchyTokenizer{}, nil
}
func init() {
registry.RegisterTokenizer(Name, TokenizerConstructor)
}

View file

@ -0,0 +1,59 @@
// Copyright 2024 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package hierarchy
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestIndexerBleveHierarchyTokenizer(t *testing.T) {
tokenizer := &PathHierarchyTokenizer{}
keywords := []struct {
Term string
Results []string
}{
{
Term: "modules/indexer/code/search.go",
Results: []string{
"modules",
"modules/indexer",
"modules/indexer/code",
"modules/indexer/code/search.go",
},
},
{
Term: "/tmp/forgejo/",
Results: []string{
"tmp",
"tmp/forgejo",
},
},
{
Term: "a/b/c/d/e/f/g/h/i/j",
Results: []string{
"a",
"a/b",
"a/b/c",
"a/b/c/d",
"a/b/c/d/e",
"a/b/c/d/e/f",
"a/b/c/d/e/f/g",
"a/b/c/d/e/f/g/h",
"a/b/c/d/e/f/g/h/i",
"a/b/c/d/e/f/g/h/i/j",
},
},
}
for _, kw := range keywords {
tokens := tokenizer.Tokenize([]byte(kw.Term))
assert.Len(t, tokens, len(kw.Results))
for i, token := range tokens {
assert.Equal(t, i+1, token.Position)
assert.Equal(t, kw.Results[i], string(token.Term))
}
}
}

View file

@ -30,7 +30,7 @@ import (
)
const (
esRepoIndexerLatestVersion = 1
esRepoIndexerLatestVersion = 2
// multi-match-types, currently only 2 types are used
// Reference: https://www.elastic.co/guide/en/elasticsearch/reference/7.0/query-dsl-multi-match-query.html#multi-match-types
esMultiMatchTypeBestFields = "best_fields"
@ -57,6 +57,21 @@ func NewIndexer(url, indexerName string) *Indexer {
const (
defaultMapping = `{
"settings": {
"analysis": {
"analyzer": {
"custom_path_tree": {
"tokenizer": "custom_hierarchy"
}
},
"tokenizer": {
"custom_hierarchy": {
"type": "path_hierarchy",
"delimiter": "/"
}
}
}
},
"mappings": {
"properties": {
"repo_id": {
@ -72,6 +87,15 @@ const (
"type": "keyword",
"index": true
},
"filename": {
"type": "text",
"fields": {
"tree": {
"type": "text",
"analyzer": "custom_path_tree"
}
}
},
"language": {
"type": "keyword",
"index": true
@ -138,6 +162,7 @@ func (b *Indexer) addUpdate(ctx context.Context, batchWriter git.WriteCloserErro
"repo_id": repo.ID,
"content": string(charset.ToUTF8DropErrors(fileContents, charset.ConvertOpts{})),
"commit_id": sha,
"filename": update.Filename,
"language": analyze.GetCodeLanguage(update.Filename, fileContents),
"updated_at": timeutil.TimeStampNow(),
}),
@ -267,7 +292,6 @@ func convertResult(searchResult *elastic.SearchResult, kw string, pageSize int)
panic(fmt.Sprintf("2===%#v", hit.Highlight))
}
repoID, fileName := internal.ParseIndexerID(hit.Id)
res := make(map[string]any)
if err := json.Unmarshal(hit.Source, &res); err != nil {
return 0, nil, nil, err
@ -276,8 +300,8 @@ func convertResult(searchResult *elastic.SearchResult, kw string, pageSize int)
language := res["language"].(string)
hits = append(hits, &internal.SearchResult{
RepoID: repoID,
Filename: fileName,
RepoID: int64(res["repo_id"].(float64)),
Filename: res["filename"].(string),
CommitID: res["commit_id"].(string),
Content: res["content"].(string),
UpdatedUnix: timeutil.TimeStamp(res["updated_at"].(float64)),
@ -326,6 +350,9 @@ func (b *Indexer) Search(ctx context.Context, opts *internal.SearchOptions) (int
repoQuery := elastic.NewTermsQuery("repo_id", repoStrs...)
query = query.Must(repoQuery)
}
if len(opts.Filename) > 0 {
query = query.Filter(elastic.NewTermsQuery("filename.tree", opts.Filename))
}
var (
start, pageSize = opts.GetSkipTake()

View file

@ -34,10 +34,11 @@ func testIndexer(name string, t *testing.T, indexer internal.Indexer) {
err := index(git.DefaultContext, indexer, repoID)
require.NoError(t, err)
keywords := []struct {
RepoIDs []int64
Keyword string
IDs []int64
Langs int
RepoIDs []int64
Keyword string
IDs []int64
Langs int
Filename string
}{
{
RepoIDs: nil,
@ -51,6 +52,20 @@ func testIndexer(name string, t *testing.T, indexer internal.Indexer) {
IDs: []int64{},
Langs: 0,
},
{
RepoIDs: nil,
Keyword: "Description",
IDs: []int64{},
Langs: 0,
Filename: "NOT-README.md",
},
{
RepoIDs: nil,
Keyword: "Description",
IDs: []int64{repoID},
Langs: 1,
Filename: "README.md",
},
{
RepoIDs: nil,
Keyword: "Description for",
@ -86,6 +101,7 @@ func testIndexer(name string, t *testing.T, indexer internal.Indexer) {
Page: 1,
PageSize: 10,
},
Filename: kw.Filename,
IsKeywordFuzzy: true,
})
require.NoError(t, err)

View file

@ -24,6 +24,7 @@ type SearchOptions struct {
RepoIDs []int64
Keyword string
Language string
Filename string
IsKeywordFuzzy bool

View file

@ -3,30 +3,8 @@
package internal
import (
"strings"
"code.gitea.io/gitea/modules/indexer/internal"
"code.gitea.io/gitea/modules/log"
)
import "code.gitea.io/gitea/modules/indexer/internal"
func FilenameIndexerID(repoID int64, filename string) string {
return internal.Base36(repoID) + "_" + filename
}
func ParseIndexerID(indexerID string) (int64, string) {
index := strings.IndexByte(indexerID, '_')
if index == -1 {
log.Error("Unexpected ID in repo indexer: %s", indexerID)
}
repoID, _ := internal.ParseBase36(indexerID[:index])
return repoID, indexerID[index+1:]
}
func FilenameOfIndexerID(indexerID string) string {
index := strings.IndexByte(indexerID, '_')
if index == -1 {
log.Error("Unexpected ID in repo indexer: %s", indexerID)
}
return indexerID[index+1:]
}

View file

@ -35,6 +35,8 @@ type SearchResultLanguages = internal.SearchResultLanguages
type SearchOptions = internal.SearchOptions
var CodeSearchOptions = [2]string{"exact", "fuzzy"}
func indices(content string, selectionStartIndex, selectionEndIndex int) (int, int) {
startIndex := selectionStartIndex
numLinesBefore := 0

View file

@ -28,13 +28,16 @@ var (
// The hash used for HKDF.
hash = sha256.New
// The AEAD used for encryption/decryption.
aead = chacha20poly1305.NewX
aeadKeySize = chacha20poly1305.KeySize
aeadNonceSize = chacha20poly1305.NonceSizeX
aead = chacha20poly1305.NewX
// The pseudorandom key generated by HKDF-Extract.
prk []byte
)
const (
aeadKeySize = chacha20poly1305.KeySize
aeadNonceSize = chacha20poly1305.NonceSizeX
)
// Set the main IKM for this module.
func Init(ikm []byte) {
// Salt is intentionally left empty, it's not useful to Forgejo's use case.
@ -55,7 +58,7 @@ var (
// Derive *the* key for a given context, this is a deterministic function.
// The same key will be provided for the same context.
func DeriveKey(context Context) *Key {
if len(prk) == 0 {
if len(prk) != sha256.Size {
panic("keying: not initialized")
}
@ -63,7 +66,7 @@ func DeriveKey(context Context) *Key {
key := make([]byte, aeadKeySize)
// This should never return an error, but if it does, panic.
if _, err := r.Read(key); err != nil {
if n, err := r.Read(key); err != nil || n != aeadKeySize {
panic(err)
}
@ -92,7 +95,7 @@ func (k *Key) Encrypt(plaintext, additionalData []byte) []byte {
// Generate a random nonce.
nonce := make([]byte, aeadNonceSize)
if _, err := rand.Read(nonce); err != nil {
if n, err := rand.Read(nonce); err != nil || n != aeadNonceSize {
panic(err)
}

View file

@ -7,6 +7,7 @@ import (
"encoding/xml"
"io"
"code.gitea.io/gitea/modules/util"
"code.gitea.io/gitea/modules/validation"
"golang.org/x/net/html/charset"
@ -49,8 +50,16 @@ type pomStruct struct {
Version string `xml:"version"`
Scope string `xml:"scope"`
} `xml:"dependencies>dependency"`
Parent struct {
GroupID string `xml:"groupId"`
ArtifactID string `xml:"artifactId"`
Version string `xml:"version"`
RelativePath string `xml:"relativePath"`
} `xml:"parent"`
}
var ErrNoGroupID = util.NewInvalidArgumentErrorf("group ID is missing")
// ParsePackageMetaData parses the metadata of a pom file
func ParsePackageMetaData(r io.Reader) (*Metadata, error) {
var pom pomStruct
@ -65,6 +74,17 @@ func ParsePackageMetaData(r io.Reader) (*Metadata, error) {
pom.URL = ""
}
groupID := pom.GroupID
if groupID == "" {
// If a project inherits from a parent project, the groupId element is optional.
// Refer to: https://maven.apache.org/pom.html#Inheritance
if pom.Parent.GroupID == "" {
return nil, ErrNoGroupID
}
groupID = pom.Parent.GroupID
}
licenses := make([]string, 0, len(pom.Licenses))
for _, l := range pom.Licenses {
if l.Name != "" {
@ -82,7 +102,7 @@ func ParsePackageMetaData(r io.Reader) (*Metadata, error) {
}
return &Metadata{
GroupID: pom.GroupID,
GroupID: groupID,
ArtifactID: pom.ArtifactID,
Name: pom.Name,
Description: pom.Description,

View file

@ -14,6 +14,7 @@ import (
const (
groupID = "org.gitea"
parentGroupID = "org.gitea.parent"
artifactID = "my-project"
version = "1.0.1"
name = "My Gitea Project"
@ -27,6 +28,11 @@ const (
const pomContent = `<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>` + parentGroupID + `</groupId>
<artifactId>parent-project</artifactId>
<version>1.0.0</version>
</parent>
<groupId>` + groupID + `</groupId>
<artifactId>` + artifactID + `</artifactId>
<version>` + version + `</version>
@ -47,6 +53,24 @@ const pomContent = `<?xml version="1.0"?>
</dependencies>
</project>`
const pomWithParentGroupID = `<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>` + parentGroupID + `</groupId>
<artifactId>parent-project</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>` + artifactID + `</artifactId>
<version>` + version + `</version>
</project>`
const pomWithMissingGroupID = `<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<artifactId>` + artifactID + `</artifactId>
<version>` + version + `</version>
</project>`
func TestParsePackageMetaData(t *testing.T) {
t.Run("InvalidFile", func(t *testing.T) {
m, err := ParsePackageMetaData(strings.NewReader(""))
@ -87,4 +111,19 @@ func TestParsePackageMetaData(t *testing.T) {
require.NoError(t, err)
assert.NotNil(t, m)
})
t.Run("UseParentGroupID", func(t *testing.T) {
m, err := ParsePackageMetaData(strings.NewReader(pomWithParentGroupID))
require.NoError(t, err)
assert.NotNil(t, m)
assert.Equal(t, parentGroupID, m.GroupID)
})
t.Run("MissingGroupIDThrowsError", func(t *testing.T) {
m, err := ParsePackageMetaData(strings.NewReader(pomWithMissingGroupID))
assert.Nil(t, m)
require.Error(t, err)
assert.Equal(t, ErrNoGroupID, err)
})
}

View file

@ -89,8 +89,9 @@ func CreateRepositoryByExample(ctx context.Context, doer, u *user_model.User, re
Type: tp,
Config: &repo_model.PullRequestsConfig{
AllowMerge: true, AllowRebase: true, AllowRebaseMerge: true, AllowSquash: true, AllowFastForwardOnly: true,
DefaultMergeStyle: repo_model.MergeStyle(setting.Repository.PullRequest.DefaultMergeStyle),
AllowRebaseUpdate: true,
DefaultMergeStyle: repo_model.MergeStyle(setting.Repository.PullRequest.DefaultMergeStyle),
DefaultUpdateStyle: repo_model.UpdateStyle(setting.Repository.PullRequest.DefaultUpdateStyle),
AllowRebaseUpdate: true,
},
})
} else {

View file

@ -46,7 +46,7 @@ func (url defaultActionsURL) URL() string {
}
const (
defaultActionsURLForgejo = "https://code.forgejo.org"
defaultActionsURLForgejo = "https://data.forgejo.org"
defaultActionsURLGitHub = "github" // https://github.com
defaultActionsURLSelf = "self" // the root URL of the self-hosted instance
)

View file

@ -117,7 +117,7 @@ func Test_getDefaultActionsURLForActions(t *testing.T) {
iniStr: `
[actions]
`,
wantURL: "https://code.forgejo.org",
wantURL: "https://data.forgejo.org",
},
{
name: "github",

View file

@ -87,6 +87,7 @@ var (
DefaultMergeMessageAllAuthors bool
DefaultMergeMessageMaxApprovers int
DefaultMergeMessageOfficialApproversOnly bool
DefaultUpdateStyle string
PopulateSquashCommentWithCommitMessages bool
AddCoCommitterTrailers bool
TestConflictingPatchesWithGitApply bool
@ -216,6 +217,7 @@ var (
DefaultMergeMessageAllAuthors bool
DefaultMergeMessageMaxApprovers int
DefaultMergeMessageOfficialApproversOnly bool
DefaultUpdateStyle string
PopulateSquashCommentWithCommitMessages bool
AddCoCommitterTrailers bool
TestConflictingPatchesWithGitApply bool
@ -232,6 +234,7 @@ var (
DefaultMergeMessageAllAuthors: false,
DefaultMergeMessageMaxApprovers: 10,
DefaultMergeMessageOfficialApproversOnly: true,
DefaultUpdateStyle: "merge",
PopulateSquashCommentWithCommitMessages: false,
AddCoCommitterTrailers: true,
RetargetChildrenOnMerge: true,

View file

@ -105,6 +105,7 @@ type Repository struct {
DefaultDeleteBranchAfterMerge bool `json:"default_delete_branch_after_merge"`
DefaultMergeStyle string `json:"default_merge_style"`
DefaultAllowMaintainerEdit bool `json:"default_allow_maintainer_edit"`
DefaultUpdateStyle string `json:"default_update_style"`
AvatarURL string `json:"avatar_url"`
Internal bool `json:"internal"`
MirrorInterval string `json:"mirror_interval"`
@ -225,6 +226,8 @@ type EditRepoOption struct {
DefaultDeleteBranchAfterMerge *bool `json:"default_delete_branch_after_merge,omitempty"`
// set to a merge style to be used by this repository: "merge", "rebase", "rebase-merge", "squash", or "fast-forward-only".
DefaultMergeStyle *string `json:"default_merge_style,omitempty"`
// set to a update style to be used by this repository: "rebase" or "merge"
DefaultUpdateStyle *string `json:"default_update_style,omitempty"`
// set to `true` to allow edits from maintainers by default
DefaultAllowMaintainerEdit *bool `json:"default_allow_maintainer_edit,omitempty"`
// set to `true` to archive this repository.

View file

@ -1,3 +1,8 @@
[common]
help = সাহায্য
dashboard = ড্যাশবোর্ড
dashboard = ড্যাশবোর্ড
home = বাড়ি
explore = দেখোণ
logo = লোগো
sign_in = সাইণ ইণ
sign_in_or = বা

View file

@ -812,7 +812,7 @@ manage_emails=Správa e-mailových adres
manage_themes=Výchozí motiv
manage_openid=Adresy OpenID
email_desc=Vaše hlavní e-mailová adresa bude použita pro oznámení, obnovení hesla, a pokud není skrytá, pro operace Gitu.
theme_desc=Toto bude váš výchozí motiv vzhledu na tomto webu.
theme_desc=Tento motiv se použije pro webové rozhraní, když jste přihlášeni.
primary=Hlavní
activated=Aktivován
requires_activation=Vyžaduje aktivaci
@ -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 <strong>všechny repozitáře</strong> vve vašem vlastnictví.
hooks.desc=Přidejte webhooky, které budou spouštěny pro <strong>všechny repozitáře</strong> ve vašem vlastnictví.
orgs_none=Nejste členem žádné organizace.
repos_none=Nevlastníte žádné repozitáře.
@ -1056,9 +1056,9 @@ language.description = Tento jazyk bude uložen do vašeho účtu a po přihlá
language.localization_project = Pomozte nám s překladem Forgejo do vašeho jazyka! <a href="%s">Více informací</a>.
[repo]
new_repo_helper=Repozitář obsahuje všechny projektové soubory, včetně historie revizí. Už jej hostujete jinde? <a href="%s">Migrovat repozitář.</a>
new_repo_helper=Repozitář obsahuje všechny soubory projektu, včetně historie revizí. Už jej hostujete jinde? <a href="%s">Migrovat repozitář</a>.
owner=Vlastník
owner_helper=Některé organizace se nemusejí v seznamu zobrazit kvůli maximálnímu dosaženému počtu repozitářů.
owner_helper=Některé organizace se nemusí v seznamu zobrazit kvůli maximálnímu dosaženému počtu repozitářů.
repo_name=Název repozitáře
repo_name_helper=Dobrý název repozitáře většinou používá krátká, zapamatovatelná a unikátní klíčová slova.
repo_size=Velikost repozitáře
@ -1067,7 +1067,7 @@ template_select=Vyberte šablonu
template_helper=Nastavit repozitář jako šablonu
template_description=Šablony repozitářů umožňují uživatelům generovat nové repositáře se stejnou strukturou, soubory a volitelnými nastaveními.
visibility=Viditelnost
visibility_description=Pouze majitelé nebo členové organizace to budou moci vidět, pokud mají práva.
visibility_description=Budou jej moci vidět pouze majitelé nebo členové organizace, pokud mají práva.
visibility_helper=Nastavit repozitář jako soukromý
visibility_helper_forced=Váš administrátor vynutil, že nové repozitáře budou soukromé.
visibility_fork_helper=(Změna této možnosti ovlivní viditelnost všech forků repozitáře.)
@ -1088,20 +1088,20 @@ download_bundle=Stáhnout BUNDLE
generate_repo=Generovat repozitář
generate_from=Generovat z
repo_desc=Popis
repo_desc_helper=Zadejte krátký popis (volitelné)
repo_desc_helper=Zadejte krátký popis (nepovinné)
repo_lang=Jazyk
repo_gitignore_helper=Vyberte šablony .gitignore
repo_gitignore_helper_desc=Vyberte soubory, které nechcete sledovat ze seznamu šablon pro běžné jazyky. Typické artefakty generované nástroji pro sestavení každého jazyka jsou ve výchozím stavu součástí .gitignore.
repo_gitignore_helper_desc=Ze seznamu šablon pro běžné jazyky vyberte soubory, které nemáme sledovat. Typické artefakty generované nástroji pro sestavení každého jazyka jsou ve výchozím stavu součástí .gitignore.
issue_labels=Štítky
issue_labels_helper=Vyberte sadu štítků
license=Licence
license_helper=Vyberte licenční soubor
license_helper_desc=Licence řídí, co ostatní mohou a nemohou dělat s vaším kódem. Nejste si jisti, která je pro váš projekt správná? Podívejte se na <a target="_blank" rel="noopener noreferrer" href="%s">Zvolte licenci</a>
license_helper=Vyberte soubor licence
license_helper_desc=Licence řídí, co ostatní mohou a nemohou dělat s vaším kódem. Nejste si jisti, která je pro váš projekt správná? Podívejte se na stránku <a target="_blank" rel="noopener noreferrer" href="%s">Výběr licence</a>.
object_format = Objektový formát
object_format_helper = Objektový formát repozitáře. Později jej nelze změnit. Nejkompatibilnější je SHA1.
readme=README
readme_helper=Vyberte šablonu souboru README
readme_helper_desc=Toto je místo, kde můžete napsat úplný popis vašeho projektu.
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)
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ů
@ -2488,8 +2488,8 @@ settings.archive.text = Archivováním repozitáře jej celý převedete do stav
settings.archive.success=Repozitář byl úspěšně archivován.
settings.archive.error=Nastala chyba při archivování repozitáře. Prohlédněte si záznam pro více detailů.
settings.archive.error_ismirror=Nemůžete archivovat zrcadlený repozitář.
settings.archive.branchsettings_unavailable=Nastavení větví není dostupné, pokud je repozitář archivovaný.
settings.archive.tagsettings_unavailable=Nastavení značek není k dispozici, pokud je repozitář archivován.
settings.archive.branchsettings_unavailable=Nastavení větví není v archivovaných repozitářích k dispozici.
settings.archive.tagsettings_unavailable=Nastavení značek nejsou v archivovaných repozitářích k dispozici.
settings.unarchive.button=Zrušit archivaci repozitáře
settings.unarchive.header=Obnovit tento repozitář
settings.unarchive.text=Obnovení repozitáře vrátí možnost přijímání commitů a nahrávání. Stejně tak se obnoví i možnost vytváření nových problémů a žádostí o sloučení.
@ -2749,7 +2749,7 @@ settings.event_pull_request_approvals = Schválení žádostí o sloučení
settings.ignore_stale_approvals_desc = Nepočítat schválení udělená u starších commitů (zastaralá schválení) do celkového počtu schválení u ŽS. Není relevantní, pokud byla zastaralá schválení již zrušena.
file_follow = Následovat symbolický odkaz
settings.protect_status_check_patterns_desc = Zadejte vzorce pro upřesnění kontrol, které musí projít před sloučením větví do větve, která se shoduje s tímto pravidlem. Na každý řádek zadejte jeden vzorec. Vzorce nesmí být prázdné.
settings.archive.mirrors_unavailable = Zrcadla nejsou dostupná, když je repozitář archivován.
settings.archive.mirrors_unavailable = Zrcadla nejsou v archivovaných repozitářích k dispozici.
settings.protect_enable_merge_desc = Kdokoli s přístupem k zápisu bude moci slučovat žádosti o sloučení do této větve.
settings.event_pull_request_review_request_desc = Bylo požádáno o posouzení žádosti o sloučení nebo bylo toto požádání odstraněno.
error.broken_git_hook = Zdá se, že u tohoto repozitáře jsou rozbité Git hooks. Pro jejich opravení se prosím řiďte pokyny v <a target="_blank" rel="noreferrer" href="%s">dokumentaci</a> a poté odešlete několik commitů pro obnovení stavu.
@ -2848,6 +2848,8 @@ diff.git-notes.remove-body = Tato poznámka bude odebrána.
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.
[graphs]
component_loading_info = Tohle může chvíli trvat…
@ -3513,7 +3515,7 @@ monitor.download_diagnosis_report = Stáhnout hlášení o diagnóze
self_check.no_problem_found=Zatím nebyl nalezen žádný problém.
self_check.database_collation_mismatch=Očekávejte, že databáze použije collation: %s
self_check.database_inconsistent_collation_columns=Databáze používá collation %s, ale tyto sloupce používají chybné collation. To může způsobit neočekávané problémy.
self_check.database_fix_mysql=Pro uživatele MySQL/MariaDB můžete použít příkaz "gitea doctor convert", který opraví problémy s collation, nebo můžete také problém vyřešit příkazem "ALTER ... COLLATE ..." SQL ručně.
self_check.database_fix_mysql=Pro uživatele MySQL/MariaDB můžete použít příkaz „forgejo doctor convert“, který opraví problémy s porovnáním. Problém také můžete ručně vyřešit příkazem „ALTER ... COLLATE ...“ SQL.
self_check = Vlastní kontrola
self_check.database_collation_case_insensitive=Databáze používá collation %s, což je collation nerozlišující velká a malá písmena. Ačkoli s ní Gitea může pracovat, mohou se vyskytnout vzácné případy, kdy nebude fungovat podle očekávání.
auths.oauth2_map_group_to_team = Zmapovat zabrané skupiny u týmů organizací (volitelné - vyžaduje název claimu výše)
@ -3684,9 +3686,9 @@ conda.install=Pro instalaci balíčku pomocí Conda spusťte následující př
container.details.type=Typ obrazu
container.details.platform=Platforma
container.pull=Stáhnout obraz z příkazové řádky:
container.digest=Výběr:
container.digest=Výběr
container.multi_arch=OS/architektura
container.layers=Vrstvy obrazů
container.layers=Vrstvy obrazu
container.labels=Štítky
container.labels.key=Klíč
container.labels.value=Hodnota
@ -3799,6 +3801,7 @@ arch.version.checkdepends = Závislosti Check
arch.version.conflicts = Konflikty
arch.version.replaces = Nahrazuje
arch.version.backup = Záloha
container.images.title = Obrázky
[secrets]
secrets=Tajné klíče

View file

@ -0,0 +1,907 @@
[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 <strong>findes ikke</strong> eller <strong>du er ikke autoriseret</strong> 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å <a href="%s" target="_blank">Codeberg</a> 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å <a target="_blank" rel="noopener noreferrer" href="%[1]s">Forgejo</a>! Slut dig til os ved at <a target="_blank" rel="noopener noreferrer" href="%[2]s">bidrage</a> til at gøre dette projekt endnu bedre. Vær ikke genert over at være en bidragyder!
install_desc = Du skal blot <a target="_blank" rel="noopener noreferrer" href="%[1]s">køre binæren</a> for din platform, send den med <a target="_blank" rel="noopener noreferrer" href="%[2]s">Docker</a>, eller få det <a target="_blank" rel="noopener noreferrer" href="%[3]s">pakket</a>.
[install]
install = Installation
title = Indledende konfiguration
docker_helper = Hvis du kører Forgejo inde i Docker, skal du læse <a target="_blank" rel="noopener noreferrer" href="%s">dokumentationen</a>, 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" <email@example.com>.
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.<br>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 of "%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, <a href="%s">vis ufiltrerede resultater</a>.
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? <a href="%s">Registrer dig nu.</a>
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 <b>%s</b>. 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 <a href="%s">her</a> 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 <b>%s</b>. 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? <a href="%s">Log ind nu!</a>
has_unconfirmed_mail = Hej %s, du har en ubekræftet e-mailadresse (<b>%s</b>). 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 <a target="_blank" rel="noopener noreferrer" href="%s">liste over stjålne adgangskoder</a>, 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 <b>%s</b>,
activate_account = Aktiver venligst din konto
activate_account.text_1 = Hej <b>%[1]s</b>, 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 <b>%s</b>:
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 <a href="%s">klik her</a> 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 <a href="%s">indstille din adgangskode</a>.
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 <b>%s</b>:
reset_password.text = Hvis dette var dig, skal du klikke på følgende link for at gendanne din konto inden for <b>%s</b>:
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 = <b>@%s</b> nævnte dig:
issue.action.force_push = <b>%[1]s</b> tvangs pushed <b>%[2]s</b> fra %[3]s til %[4]s.
issue.action.push_1 = <b>@%[1]s</b> pushed %[3]d commit til %[2]s
issue.action.push_n = <b>@%[1]s</b> pushed %[3]d commits til %[2]s
issue.action.close = <b>@%[1]s</b> lukket #%[2]d.
issue.action.reopen = <b>@%[1]s</b> genåbnet #%[2]d.
issue.action.merge = <b>@%[1]s</b> merged #%[2]d ind i %[3]s.
issue.action.approve = <b>@%[1]s</b> godkendte denne pull-anmodning.
issue.action.reject = <b>@%[1]s</b> anmodede om ændringer på denne pull-anmodning.
issue.action.review = <b>@%[1]s</b> kommenterede denne pull-anmodning.
issue.action.review_dismissed = <b>@%[1]s</b> afviste den seneste kontrol fra %[2]s for denne pull-anmodning.
issue.action.ready_for_review = <b>@%[1]s</b> markerede denne pull-anmodning klar til gennemgang.
issue.action.new = <b>@%[1]s</b> oprettede #%[2]d.
issue.in_tree_path = I %s:
release.new.subject = %s i %s udgivet
release.new.text = <b>@%[1]s</b> 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. <a href="%s">Konfigurer</a>.
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. <a href="%s">Konfigurer</a>.
public_activity.visibility_hint.self_private_profile = Din aktivitet er kun synlig for dig og instans-administratorerne, fordi din profil er privat. <a href="%s">Konfigurer</a>.
[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! <a href="%s">Få flere oplysninger</a>.
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 "<bruger> tilføjede/fjernede <etiket>" 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 = Styr, hvordan din profil vises til andre brugere. Din primære e-mailadresse vil blive brugt til meddelelser, gendannelse af adgangskode og webbaserede Git-operationer.
saved_successfully = Dine indstillinger blev gemt.
keep_activity_private.description = Din <a href="%s">offentlige aktivitet</a> 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 = <strong>Har du brug for hjælp?</strong> Se vejledningen til at <a href="%s">oprette dine egne SSH-nøgler</a> eller løse <a href="%s">almindelige problemer</a> a> du kan støde på når du bruger SSH.
gpg_helper = <strong>Har du brug for hjælp?</strong> Se vejledningen <a href="%s">om GPG</a>.
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 = Dette vil skjule din e-mailadresse fra din profil. Det vil ikke længere være standard for commits foretaget via webgrænsefladen, såsom filupload og redigeringer, og vil ikke blive brugt til merge commits. I stedet kan en speciel adresse %s bruges til at knytte commits til din konto. Bemærk, at ændring af denne mulighed ikke vil 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 = <strong>%s</strong> 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 <a href="%[1]s" target="_blank">API</a>-ruter. Læs <a href="%[2]s" target="_blank">dokumentationen</a> 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.

View file

@ -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
@ -1097,7 +1097,7 @@ 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 <a target="_blank" rel="noopener noreferrer" href="%s">Choose a license.</a>
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 <a target="_blank" rel="noopener noreferrer" href="%s">Choose a license</a>.
readme=README
readme_helper=Wähle eine README-Vorlage
readme_helper_desc=Hier kannst du eine komplette Beschreibung für dein Projekt schreiben.
@ -2490,8 +2490,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 +2690,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? <a href="%s">Repository migrieren.</a>
new_repo_helper = Ein Repository enthält alle Projektdateien inklusive der Revisionshistorie. Bereits woanders gehostet? <a href="%s">Repository migrieren</a>.
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 +2704,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.
@ -2850,6 +2850,7 @@ diff.git-notes.remove-body = Diese Anmerkung wird entfernt.
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
[graphs]
component_loading_failed = Konnte %s nicht laden
@ -3512,7 +3513,7 @@ notices.type_2=Aufgabe
notices.desc=Beschreibung
notices.op=Aktion
notices.delete_success=Diese Systemmeldung wurde gelöscht.
self_check.database_fix_mysql = Für MySQL-/MariaDB-Benutzer: Du kannst den Befehl „gitea doctor convert“ verwenden, um die Collation-Probleme zu lösen, oder du kannst das Problem mit „ALTER … COLLATE …“-SQLs manuell lösen.
self_check.database_fix_mysql = Für MySQL-/MariaDB-Benutzer: Du kannst den Befehl „forgejo doctor convert“ verwenden, um die Collation-Probleme zu lösen, oder du kannst das Problem mit „ALTER … COLLATE …“-SQLs manuell lösen.
dashboard.sync_tag.started = Tag-Synchronisierung gestartet
self_check.database_collation_case_insensitive = Datenbank benutzt eine Collation %s, welcher der Groß-/Kleinschreibung egal ist. Obwohl Forgejo damit arbeiten könnte, könnte es ein paar seltene Fälle geben, bei denen es nicht wie erwartet funktioniert.
self_check = Selbstprüfung
@ -3685,12 +3686,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 <code>.condarc</code>-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.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
@ -3803,6 +3804,7 @@ arch.version.conflicts = Konflikte
arch.version.replaces = Ersetzt
arch.version.backup = Backup
arch.version.optdepends = Optionale Abhängigkeit
container.images.title = Bilder
[secrets]
secrets=Secrets

View file

@ -2247,6 +2247,7 @@ settings.pulls_desc = Enable repository pull requests
settings.pulls.ignore_whitespace = Ignore whitespace for conflicts
settings.pulls.enable_autodetect_manual_merge = Enable autodetect manual merge (Note: In some special cases, misjudgments can occur)
settings.pulls.allow_rebase_update = Enable updating pull request branch by rebase
settings.default_update_style_desc=Default update style used for updating pull requests that are behind the base branch.
settings.pulls.default_delete_branch_after_merge = Delete pull request branch after merge by default
settings.pulls.default_allow_edits_from_maintainers = Allow edits from maintainers by default
settings.releases_desc = Enable repository releases

View file

@ -165,6 +165,7 @@ filter.is_template = Mallipohjat
filter.not_fork = Ei forkkeja
filter.not_template = Ei mallipohjat
filter.not_mirror = Ei peilattu
copy_path = Kopioi polku
[aria]
footer.links = Linkit
@ -290,7 +291,7 @@ disable_gravatar=Poista Gravatar käytöstä
disable_gravatar.description=Poista Gravatar ja kolmannen osapuolen avaratir käytöstä. Oletus-avatar näytetään, ellei käyttäjä ole ladannut omaansa.
federated_avatar_lookup=Käytä federoituja profiilikuvia
federated_avatar_lookup.description=Käytä Libravatar-palvelua profiilikuvien hakemiseen.
disable_registration=Poista rekisteröinti käytöstä
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ä.
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
@ -318,7 +319,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 .
@ -343,6 +344,7 @@ enable_update_checker = Ota päivitystentarkistus käyttöön
app_slogan = Instanssin tunnuslause
app_slogan_helper = Syötä instanssin tunnuslause tähän. Jätä tyhjäksi poistaaksesi käytöstä.
domain_helper = Palvelimen verkkotunnus tai isäntänimi.
smtp_from_invalid = "Lähetä sähköpostit osoitteella"-osoite on virheellinen
[home]
uname_holder=Käyttäjätunnus tai sähköpostiosoite
@ -389,6 +391,7 @@ relevant_repositories = Vain relevantit repositoriot näytetään, <a href="%s">
forks_one = %d forkki
forks_few = %d forkkia
go_to = Siirry
relevant_repositories_tooltip = Repot, jotka ovat forkkeja, joilla ei ole aiheita, ei kuvakkeita ja ei kuvausta, ovat piilotettuja.
[auth]
create_new_account=Rekisteröi tili
@ -406,12 +409,12 @@ allow_password_change=Vaadi käyttäjää vaihtamaan salasanansa (suositeltava)
reset_password_mail_sent_prompt=Varmistussähköposti on lähetetty osoitteeseen <b>%s</b>. Tarkista sähköpostisi ja seuraa annettua linkkiä seuraavan %s aikana saadaksesi tilin palauttamisen valmiiksi.
active_your_account=Aktivoi tilisi
account_activated=Tili on aktivoitu
prohibit_login=Kirjautuminen estetty
prohibit_login=Tili on jäädytetty
resent_limit_prompt=Olet jo tilannut aktivointisähköpostin hetki sitten. Ole hyvä ja odota 3 minuuttia ja yritä sitten uudelleen.
has_unconfirmed_mail=Hei %s, sinulla on varmistamaton sähköposti osoite (<b>%s</b>). Jos et ole saanut varmistus sähköpostia tai tarvitset uudelleenlähetyksen, ole hyvä ja klikkaa allaolevaa painiketta.
resend_mail=Klikkaa tästä uudelleenlähettääksesi aktivointi sähköpostisi
email_not_associate=Tätä sähköpostiosoitetta ei ole liitetty mihinkään tiliin.
send_reset_mail=Lähetä tilin palautussähköposti
send_reset_mail=Lähetä palautussähköposti
reset_password=Tilin palautus
invalid_code=Vahvistusavain on virheellinen tai vanhentunut.
reset_password_helper=Palauta käyttäjätili
@ -450,10 +453,21 @@ hint_login = Onko sinulla jo käyttäjätili? <a href="%s">Kirjaudu sisään!</a
hint_register = Tarvitsetko käyttäjätilin? <a href="%s">Rekisteröidy nyt.</a>
sign_up_button = Rekisteröidy nyt.
manual_activation_only = Ota yhteyttä järjestelmänvalvojaanne viimeistelläksesi aktivoinnin.
change_unconfirmed_email_error = Sähköpostiosoitteen vaihtaminen ei onnistu: %v
invalid_password = Salasanasi ei vastaa tilin luomisen yhteydessä käytettyä salasanaa.
back_to_sign_in = Takaisin kirjautumiseen
sign_in_openid = Jatka OpenID:llä
change_unconfirmed_email = Jos annoit väärän sähköpostiosoitteen rekisteröitymisen yhteydessä, voit vaihtaa sen alapuolella, ja vahvistus lähetetään uuteen osoitteeseen.
invalid_code_forgot_password = Vahvistuskoodisi on virheellinen tai vanhentunut. Napsauta <a href="%s">tästä</a> 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 <a target="_blank" rel="noopener noreferrer" href="%s">varastettujen salasanojen listalla</a>, eli se on paljastanut jossain julkisessa tietovuodossa. Kokeile asettaa eri salasana, ja jos käytät samaa salasanaa muissa palveluissa, vaihda kyseinen salasana.
[mail]
view_it_on=Näytä %s
link_not_working_do_paste=Eikö toimi? Yritä kopioida ja liittää se selaimeesi.
link_not_working_do_paste=Eikö linkki toimi? Yritä kopioida ja liittää se selaimesi osoitepalkkiin.
hi_user_x=Hei <b>%s</b>,
activate_account=Ole hyvä ja aktivoi tilisi
@ -494,6 +508,15 @@ admin.new_user.user_info = Käyttäjätiedot
activate_email.text = Vahvista sähköpostiosoitteesi napsauttamalla linkkiä aikaikkunan <b>%s</b> sisällä:
admin.new_user.subject = Uusi käyttäjä %s rekisteröityi juuri
register_notify.text_3 = Jos joku muu teki tämän tilin puolestasi, <a href="%s">aseta salasana</a> ensin.
repo.transfer.subject_to_you = %s haluaa siirtää repon "%s" sinulle
reply = tai vastaa tähän sähköpostiin suoraan
issue.action.new = <b>@%[1]s</b> loi #%[2]d.
team_invite.subject = %[1]s kutsui sinut liittymään organisaatioon %[2]s
account_security_caution.text_2 = Jos se et ollut sinä, tilisi on vaarantunut. Ota yhteys tämän sivuston ylläpitoon.
account_security_caution.text_1 = Jos se olit sinä, voit jättää tämän viestin huomiotta.
issue.action.approve = <b>@%[1]s</b> hyväksyi tämän vetopyynnön.
issue.action.review = <b>@%[1]s</b> kommentoi tätä vetopyyntöä.
issue.action.ready_for_review = <b>@%[1]s</b> merkitsi tämän vetopyynnön valmiiksi katselmointia varten.
@ -561,6 +584,22 @@ auth_failed=Todennus epäonnistui: %v
target_branch_not_exist=Kohde branchia ei ole olemassa.
Pronouns = Pronomini
FullName = Koko nimi
Description = Kuvaus
Biography = Biografia
Website = Verkkosivusto
Location = Sijainti
To = Haaran nimi
still_own_repo = Tilisi omistaa yhden tai useamman repon, poista tai siirrä ne ensin.
organization_leave_success = Olet poistunut organisaatiosta %s.
enterred_invalid_repo_name = Kirjoittamasi repon nimi on virheellinen.
openid_been_used = OpenID-osoite "%s" on jo käytetty.
password_complexity = Salasana ei täytä monimutkaisuusvaatimuksia:
still_has_org = Tilisi on jäsen yhdessä tai useamassa organisaatiossa, poistu niistä ensin.
unable_verify_ssh_key = SSH-avainta ei voi vahvistaa, tarkista se mahdollisten virheiden varalta.
url_error = `"%s" ei ole kelvollinen URL-osoite.`
must_use_public_key = Antamasi avain on yksityinen avain. Älä lähetä yksityistä avaintasi mihinkään. Käytä sen sijaan julkista avaintasi.
still_own_packages = Tilisi omistaa yhden tai useamman paketin, poista ne ensin.
[user]
@ -585,6 +624,16 @@ following.title.one = Seurataan
following.title.few = Seurataan
joined_on = Liittynyt %s
public_activity.visibility_hint.self_private = Toimintasi näkyy vain sinulle ja instanssin ylläpitäjille. <a href="%s">Määritä</a>.
block = Estä
block_user = Estä käyttäjä
code = Koodi
unblock = Poista esto
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.
[settings]
@ -597,10 +646,10 @@ avatar=Profiilikuva
ssh_gpg_keys=SSH-/GPG-avaimet
social=Sosiaaliset tilit
applications=Sovellukset
orgs=Hallitse organisaatioita
orgs=Organisaatiot
repos=Repot
delete=Poista tili
twofa=Kaksivaiheinen todennus
twofa=Kaksivaiheinen todennus (TOTP)
account_link=Linkitetyt tilit
organization=Organisaatiot
webauthn=Kaksivaiheinen todennus (Turva-avaimet)
@ -610,9 +659,9 @@ password_username_disabled=Ei-paikalliset käyttäjät eivät voi muuttaa käytt
full_name=Koko nimi
website=Nettisivut
location=Sijainti
update_theme=Päivitä teema
update_theme=Vaihda teema
update_profile=Päivitä profiili
update_language=Päivitä kieli
update_language=Vaihda kieli
update_language_success=Kieli on päivitetty.
update_profile_success=Profiilisi on päivitetty.
change_username=Käyttäjätunnuksesi on muutettu.
@ -627,7 +676,7 @@ comment_type_group_milestone=Merkkipaalu
comment_type_group_assignee=Osoitettu henkilölle
comment_type_group_title=Otsikko
comment_type_group_branch=Haara
comment_type_group_time_tracking=Ajan seuranta
comment_type_group_time_tracking=Ajanseuranta
comment_type_group_deadline=Määräaika
comment_type_group_dependency=Riippuvuus
comment_type_group_lock=Lukituksen tila
@ -640,7 +689,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
@ -655,9 +704,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=mä on sivuston oletusteemasi.
manage_themes=Oletusteema
manage_openid=OpenID-osoitteet
theme_desc=tä teemaa käytetään verkkosivuston käyttöliittymässä, kun olet sisäänkirjautuneena.
primary=Ensisijainen
activated=Aktivoitu
requires_activation=Vaatii aktivoinnin
@ -673,7 +722,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.
@ -685,14 +734,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=<strong>Tarvitsetko apua?</strong> Tutustu GitHubin oppaaseen <a href="%s">omien SSH-avainten luonnista</a> tai <a href="%s">yleisistä ongelmista</a>, joita voit kohdata SSH:n kanssa.
gpg_helper=<strong>Tarvitsetko apua?</strong> Katso GitHubin opas <a href="%s">GPG</a>: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.
@ -704,7 +753,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
@ -712,7 +761,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
@ -730,7 +779,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ä
@ -751,7 +800,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
@ -767,10 +816,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.
@ -790,7 +839,7 @@ visibility.limited=Rajattu
visibility.private=Yksityinen
hints = Vihjeet
user_block_success = Käyttäjä on estetty.
biography_placeholder = Kerro jotain itsestäsi! (Voit käyttää Markdownia)
biography_placeholder = Kerro jotain itsestäsi! (Markdown on tuettu)
keep_activity_private = Piilota toiminta profiilisivulla
update_oauth2_application_success = Päivitit OAuth2-sovelluksen.
webauthn_delete_key = Poista turva-avain
@ -810,7 +859,7 @@ 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
@ -846,6 +895,30 @@ hidden_comment_types_description = Tässä valittuja kommenttityyppejä ei näyt
webauthn_alternative_tip = Saatat haluta määrittää lisätodennusmenetelmän.
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?
[repo]
owner=Omistaja
@ -871,7 +944,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
@ -935,7 +1008,7 @@ filter_branch_and_tag=Suodata haara tai tagi
branches=Branchit
tags=Tagit
issues=Ongelmat
pulls=Pull-pyynnöt
pulls=Vetopyynnöt
project_board=Projektit
packages=Paketit
labels=Tunnisteet
@ -1270,7 +1343,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
@ -1308,16 +1381,16 @@ settings.external_wiki_url_desc=Wiki-välilehden klikkaus ohjaa vierailijat ulko
settings.tracker_url_format=Ulkoisen vikaseurannan URL muoto
settings.tracker_issue_style.numeric=Numeerinen
settings.tracker_issue_style.alphanumeric=Aakkosnumeerinen
settings.enable_timetracker=Ota käyttöön ajan seuranta
settings.enable_timetracker=Käytä ajan seurantaa
settings.danger_zone=Vaaravyöhyke
settings.new_owner_has_same_repo=Uudella omistajalla on jo samanniminen repo. Ole hyvä ja valitse toinen nimi.
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.
@ -1338,7 +1411,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
@ -1360,7 +1433,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.
@ -1368,7 +1441,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.
@ -1436,7 +1509,7 @@ settings.lfs=LFS
settings.lfs_filelist=LFS-tiedostot tallennettu tähän repoon
settings.lfs_no_lfs_files=LFS-tiedostoja ei ole tallennettu tähän repoon.
settings.lfs_findcommits=Etsi commitit
settings.lfs_lfs_file_no_commits=LFS-tiedostolle ei löytynyt committeja
settings.lfs_lfs_file_no_commits=LFS-tiedostolle ei löytynyt kommitteja
settings.lfs_noattribute=Tällä polulla ei ole lukittavaa attribuuttia oletushaarassa
settings.lfs_delete=Poista LFS-tiedosto OID:lla %s
settings.lfs_delete_warning=LFS-tiedoston poistaminen voi aiheuttaa 'object does not exists'-virheitä checkouttattaessa. Oletko varma?
@ -1474,7 +1547,7 @@ diff.view_file=Näytä tiedosto
diff.file_image_width=Leveys
diff.file_image_height=Korkeus
diff.file_byte_size=Koko
diff.comment.markdown_info=Muotoilu markdownilla tuettu.
diff.comment.markdown_info=Muotoilu Markdownilla on tuettu.
diff.comment.add_single_comment=Lisää yksittäinen kommentti
diff.comment.add_review_comment=Lisää kommentti
diff.comment.start_review=Aloita tarkistus
@ -1837,7 +1910,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 <a target="_blank" rel="noopener noreferrer" href="%s">ohje lisenssin valinnasta.</a>
license_helper_desc = Lisenssi määrää, mitä muut voivat ja eivät voi tehdä koodillasi. Etkö ole varma, mikä lisenssi soveltuu projektillesi? Lue <a target="_blank" rel="noopener noreferrer" href="%s">ohje lisenssin valinnasta</a>.
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ä
@ -1847,6 +1920,97 @@ settings.units.units = Yksiköt
settings.update_settings_no_unit = Repositorion tulisi sallia edes jonkinlainen vuorovaikutus.
settings.units.add_more = Ota lisää käyttöön
settings.add_team_success = Tiimillä on nyt pääsy repositorioon.
settings.use_external_issue_tracker = Käytä ulkoista ongelmienseurantaa
settings.transfer_started = Tämä repositorio on merkitty siirrettäväksi ja se odottaa vahvistusta käyttäjältä "%s"
signing.wont_sign.pubkey = Kommittia ei allekirjoiteta, koska sinulla ei ole yhtäkään julkista avainta liitetty tiliisi.
settings.transfer_succeed = Repositorio on siirretty.
activity.git_stats_on_default_branch = Haarassa %s,
settings.tracker_issue_style.regexp = Säännöllinen lauseke
wiki.reserved_page = Wikisivun nimi "%s" on varattu.
pulls.recently_pushed_new_branches = Työnsit haaraan <a href="%[3]s"><strong>%[1]s</strong></a> %[2]s
signing.will_sign = Tämä kommitti allekirjoitetaan avaimella "%s".
signing.wont_sign.never = Kommitit eivät ole koskaan allekirjoitettuja.
settings.mirror_settings.direction = Suunta
settings.mirror_settings.push_mirror.remote_url = Git-etärepon URL-osoite
settings.issues_desc = Käytä repositorion ongelmienseurantaa
settings.use_internal_issue_tracker = Käytä sisäänrakennettua ongelmienseurantaa
settings.external_tracker_url = Ulkoisen ongelmienseurannan URL-osoite
settings.transfer_abort_success = Repositorion siirto käyttäjälle %s peruttiin.
settings.transfer_quota_exceeded = Uuden omistajan (%s) tilakiintiö on täynnä. Repositoriota ei ole siirretty.
settings.projects_desc = Käytä repositorion projekteja
settings.releases_desc = Käytä repositorion julkaisuja
settings.packages_desc = Käytä repositorion pakettirekisteriä
activity.git_stats_push_to_branch = haaraan %s ja
wiki.wiki_page_revisions = Sivun versiot
settings.wiki_desc = Käytä repositorion wikiä
signing.wont_sign.always = Kommitit ovat aina allekirjoitettuja.
milestones.edit_subheader = Merkkipaalut järjestävät ongelmia ja seuraavat edistymistä.
view_git_blame = Näytä git blame
editor.push_rejected = Tämä muutos hylättiin palvelimen toimesta. Tarkista Git-koukut.
editor.push_rejected_no_message = Tämä muutos hylättiin palvelimen toimesta ilman viestiä. Tarkista Git-koukut.
editor.upload_file_is_locked = Tiedoston "%s" on lukinnut %s.
editor.fail_to_update_file = Tiedoston "%s" päivittäminen/luominen epäonnistui.
diff.protected = Suojattu
releases.desc = Seuraa projektin versioita ja latauksia.
settings.protect_patterns = Kaavat
branch.new_branch_from = Luo uusi haara kohteesta "%s"
settings.matrix.message_type = Viestin tyyppi
diff.committed_by = kommitoinut
invisible_runes_line = `Tällä rivillä on näkymättömiä Unicode-merkkejä`
editor.fork_before_edit = Sinun täytyy forkata tämä repo tehdäksesi tai ehdottaaksesi muutoksia tähän tiedostoon.
editor.file_deleting_no_longer_exists = Poistettava tiedosto, "%s", ei ole enää olemassa tässä repossa.
editor.add_tmpl.filename = tiedostonimi
editor.fail_to_apply_patch = Ei voitu toteuttaa paikkaa "%s"
editor.propose_file_change = Ehdota tiedostomuutosta
editor.new_branch_name = Nimeä uusi haara tätä kommittia varten
editor.new_branch_name_desc = Uuden haaran nimi…
editor.file_editing_no_longer_exists = Muokattava tiedosto, "%s", ei ole enää olemassa tässä repossa.
editor.cannot_commit_to_protected_branch = Suojattuun haaraan "%s" ei voi kommitoida.
issues.remove_request_review = Poista katselmointipyyntö
issues.remove_request_review_block = Katselmointipyyntöä ei voi poistaa
pulls.require_signed_wont_sign = Tämä haara vaatii allekirjoitetut kommitit, mutta tätä yhdistämistä ei allekirjoiteta
pulls.push_rejected_summary = Koko hylkäysviesti
settings.unarchive.button = Poista repon arkistointi
release.type_attachment = Liite
tag.create_tag_from = Luo uusi tagi kohteesta"%s"
topic.count_prompt = Voit valita korkeintaan 25 aihetta
settings.require_signed_commits = Vaadi allekirjoitetut kommitit
editor.push_rejected_summary = Koko hylkäysviesti:
release.title = Julkaisun nimi
release.tag_helper_existing = Olemassa oleva tagi.
file_view_source = Näytä lähde
diff.bin_not_shown = Binääritiedostoa ei näytetä.
release.system_generated = Tämä liite on luotu automaattisesti.
invisible_runes_header = `Tämä tiedosto sisältää näkymättömiä Unicode-merkkejä`
editor.must_have_write_access = Sinulla täytyy olla kirjoitusoikeus tehdäksesi tai ehdottaaksesi muutoksia tähän tiedostoon.
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 <strong>EI VOI</strong> 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ää <a target="_blank" rel="noopener noreferrer" href="%s">webkoukkujen oppaasta</a>.
@ -1854,6 +2018,10 @@ settings.add_team_success = Tiimillä on nyt pääsy repositorioon.
component_loading_info = Tämä saattaa kestää hetken…
component_failed_to_load = Odottamaton virhe.
component_loading = Ladataan %s...
contributors.what = kontribuutiot
recent_commits.what = viimeisimmät kommitit
code_frequency.what = koodifrekvenssi
component_loading_failed = Ei voitu ladata %s
[org]
org_name_holder=Organisaation nimi
@ -1925,7 +2093,7 @@ teams.members=Tiimin jäsenet
teams.update_settings=Päivitä asetukset
teams.delete_team=Poista tiimi
teams.add_team_member=Lisää tiimin jäsen
teams.delete_team_title=Tiimin poisto
teams.delete_team_title=Poista tiimi
teams.delete_team_desc=Tiimin poisto peruuttaa sen jäseniltä oikeuden päästä tiimin varastoihin. Jatketaanko?
teams.delete_team_success=Tiimi on poistettu.
teams.read_permission_desc=Tämä tiimi myöntää jäsenille <strong>Luku</strong> oikeudet: tiimin jäsenet voivat katsella ja kloonata tiimin varastoja.
@ -1944,7 +2112,7 @@ form.create_org_not_allowed = Sinulla ei ole oikeutta luoda organisaatiota.
teams.leave.detail = Haluatko varmasti poistua tiimistä "%s"?
teams.invite.title = Sinut on kutsuttu tiimiin <strong>%s</strong> organisaatiossa <strong>%s</strong>.
teams.add_duplicate_users = Käyttäjä on jo tiimijäsen.
settings.visibility.limited = Rajattu (näkyvissä vain tunnistautuneille käyttäjille)
settings.visibility.limited = Rajattu (näkyvissä vain kirjautuneille käyttäjille)
code = Koodi
teams.remove_all_repos_title = Poista kaikki tiimin repot
form.name_reserved = Organisaation nimi "%s" on varattu.
@ -1952,6 +2120,17 @@ settings.delete_org_desc = Organisaatio poistetaan pysyvästi. Jatketaanko?
team_access_desc = Repositorion käyttö
teams.specific_repositories = Määritetyt repositoriot
open_dashboard = Avaa kojelauta
teams.remove_all_repos_desc = Tämä poistaa kaikki repot tiimiltä.
teams.add_all_repos_desc = Tämä lisää kaikki organisaation repot tiimille.
team_unit_disabled = (Pois käytöstä)
follow_blocked_user = Et voi seurata tätä organisaatiota, koska organisaatio on estänyt sinut.
teams.can_create_org_repo = Luo repoja
teams.none_access = Ei pääsyä
form.name_pattern_not_allowed = Kaava "%s" ei ole sallittu organisaation nimessä.
settings.email = Yhteydenoton sähköposti
teams.general_access = Mukautettu pääsy
settings.change_orgname_redirect_prompt = Vanha nimi uudelleenohjaa, kunnes nimi otetaan uudelleen käyttöön.
settings.change_orgname_prompt = Huomio: organisaation nimen vaihtaminen vaihtaa myös organisaation URL-osoitteen ja vapauttaa vanhan nimen.
[admin]
dashboard=Kojelauta
@ -1975,8 +2154,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
@ -2152,7 +2331,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
@ -2290,6 +2469,17 @@ config.custom_conf = Asetustiedoston polku
config.reset_password_code_lives = Palautuskoodin vanhenemisaika
monitor.processes_count = %d prosessia
config.default_allow_create_organization = Salli organisaatioiden luominen oletuksena
config.test_mail_sent = Testisähköposti on lähetetty osoitteeseen "%s".
config.mailer_sendmail_timeout = Sendmailin aikakatkaisu
dashboard.cron.started = Käynnistetty Cron: %[1]s
dashboard.task.process = Tehtävä: %[1]s
dashboard.task.error = Virhe tehtävässä: %[1]s: %[3]s
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
[action]
@ -2328,6 +2518,7 @@ raw_minutes=minuuttia
default_message=Pudota tiedostot tähän tai klikkaa aluetta ladataksesi tiedoston.
invalid_input_type=Tämäntyyppisiä tiedostoja ei voi ladata.
remove_file=Poista tiedosto
file_too_big = Tiedoston koko ({{filesize}} Mt) ylittää enimmäisrajan ({{maxFilesize}} Mt).
[notification]
notifications=Ilmoitukset
@ -2345,9 +2536,10 @@ subscriptions = Tilaukset
[gpg]
error.no_committer_account=Committaajan sähköpostiosoitteeseen ei ole linkitetty tiliä
error.not_signed_commit=Ei allekirjoitettu committi
error.not_signed_commit=Kommitti ei ole allekirjoitettu
error.extract_sign = Allekirjoituksen purkaminen epäonnistui
default_key = Allekirjoitettu oletusavaimella
error.failed_retrieval_gpg_keys = Ei saatu yhtäkään kommitin tekijän tiliin liitettyä avainta
[units]
unit = Yksikkö
@ -2452,6 +2644,26 @@ settings.link.success = Repositorion linkki päivitettiin onnistuneesti.
settings.link.button = Päivitä repositorion linkki
owner.settings.cleanuprules.preview.overview = %d pakettia on ajastettu poistettavaksi.
owner.settings.cargo.initialize.success = Cargo-indeksi luotiin onnistuneesti.
vagrant.install = Lisää Vagrant-boksi suorittamalla seuraava komento:
rubygems.dependencies.development = Kehitysriippuvuudet
owner.settings.cleanuprules.preview = Siivoussäännön esikatselu
npm.dependencies.development = Kehitysriippuvuudet
composer.dependencies.development = Kehitysriippuvuudet
owner.settings.cleanuprules.success.update = Siivoussääntö on päivitetty.
owner.settings.cleanuprules.success.delete = Siivoussääntö on poistettu.
settings.link = Linkitä tämä paketti repositorioon
maven.download = Lataa riippuvuus suorittamalla komentorivillä:
registry.documentation = Lisätietoja %s-rekisteristä on <a target="_blank" rel="noopener noreferrer" href="%s">dokumentaatiossa</a>.
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 (<code>latest</code>) 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:
[secrets]
creation.failed = Salaisuuden lisääminen epäonnistui.
@ -2593,3 +2805,4 @@ pull_kind = Etsi pull-vetoja...
commit_kind = Etsi kommitteja...
fuzzy = Sumea
runner_kind = Etsi ajajia...
code_search_by_git_grep = Nykyiset koodin hakutulokset pohjautuvat komentoon "git grep". Parempia tuloksia on mahdollista saada, jos sivuston ylläpitäjä ottaa käyttöön koodin indeksoijan.

File diff suppressed because it is too large Load diff

View file

@ -165,6 +165,7 @@ error413 = Votre quota est épuisé.
new_repo.title = Nouveau dépôt
new_migrate.link = Nouvelle migration
new_org.link = Nouvelle organisation
copy_path = Copier le chemin
[aria]
navbar=Barre de navigation
@ -811,7 +812,7 @@ manage_emails=Gérer les adresses courriels
manage_themes=Thème par défaut
manage_openid=Adresses OpenID
email_desc=Votre adresse courriel principale sera utilisée pour les notifications, la récupération de mot de passe et, à condition qu'elle ne soit pas cachée, les opérations Git basées sur le Web.
theme_desc=Ce sera votre thème par défaut sur le site.
theme_desc=Ce thème sera utilisé pour l'interface web lorsque vous êtes authentifié.
primary=Principale
activated=Activé
requires_activation=Nécessite une activation
@ -1055,7 +1056,7 @@ language.localization_project = Aidez-nous à traduire Forgejo dans votre langue
language.description = Cette langue sera enregistrée dans votre compte et utilisée comme langue par défaut après votre connexion.
[repo]
new_repo_helper=Un dépôt contient tous les fichiers dun projet, ainsi que lhistorique de leurs modifications. Vous avez déjà ça ailleurs ? <a href="%s">Migrez-le ici.</a>
new_repo_helper=Un dépôt contient tous les fichiers dun projet, ainsi que lhistorique de leurs modifications. Vous avez déjà ça ailleurs ? <a href="%s">Migrez-le ici.</a>.
owner=Propriétaire
owner_helper=Certaines organisations peuvent ne pas apparaître dans la liste déroulante en raison d'une limite maximale du nombre de dépôts.
repo_name=Nom du dépôt
@ -1095,7 +1096,7 @@ issue_labels=Étiquettes
issue_labels_helper=Sélectionner un jeu d'étiquettes
license=Licence
license_helper=Sélectionner une licence
license_helper_desc=Une licence réglemente ce que les autres peuvent ou ne peuvent pas faire avec votre code. Vous ne savez pas laquelle est la bonne pour votre projet ? Comment <a target="_blank" rel="noopener noreferrer" href="%s">choisir une licence.</a>
license_helper_desc=Une licence réglemente ce que les autres peuvent ou ne peuvent pas faire avec votre code. Vous ne savez pas laquelle est la bonne pour votre projet ? Comment <a target="_blank" rel="noopener noreferrer" href="%s">choisir une licence.</a>.
readme=LISEZMOI
readme_helper=Choisissez un modèle de fichier LISEZMOI
readme_helper_desc=Le README est l'endroit idéal pour décrire votre projet et accueillir des contributeurs.
@ -2508,7 +2509,7 @@ settings.archive.error=Une erreur s'est produite lors de l'archivage du dépôt.
settings.archive.error_ismirror=Vous ne pouvez pas archiver un dépôt en miroir.
settings.archive.branchsettings_unavailable=Le paramétrage des branches n'est pas disponible quand le dépôt est archivé.
settings.archive.tagsettings_unavailable=Le paramétrage des étiquettes n'est pas disponible si le dépôt est archivé.
settings.archive.mirrors_unavailable = Les mirroirs ne sont pas disponibles si le dépôt a été archivé.
settings.archive.mirrors_unavailable = Les miroirs ne sont pas disponibles si le dépôt a été archivé.
settings.unarchive.button=Désarchiver ce dépôt
settings.unarchive.header=Réhabiliter ce dépôt
settings.unarchive.text=Réhabiliter un dépôt dégèle les actions de révisions et de soumissions, la gestion des tickets et des demandes d'ajouts.
@ -2844,6 +2845,10 @@ diff.git-notes.remove-body = Cette note sera supprimée.
diff.git-notes.add = Ajouter une note
diff.git-notes.remove-header = Supprimer la note
issues.summary_card_alt = Fiche de synthèse d'un ticket nommé "%s" dans le dépôt %s
editor.add_tmpl.filename = fichier
issues.num_reviews_one = %d revue
issues.num_reviews_few = %d revues
settings.default_update_style_desc = Style de mise à jour des demandes de fusion qui sont en retard par rapport à la branche de base.
[graphs]
component_loading = Chargement %s...
@ -3662,7 +3667,7 @@ alpine.registry=Configurez ce registre en ajoutant lURL dans votre fichier <c
alpine.registry.key=Téléchargez la clé RSA publique du registre dans le dossier <code>/etc/apk/keys/</code> pour vérifier la signature de l'index :
alpine.registry.info=Choisissez $branch et $repository dans la liste ci-dessous.
alpine.install=Pour installer le paquet, exécutez la commande suivante :
alpine.repository=Informations sur le Dépôt
alpine.repository=Informations sur le dépôt
alpine.repository.branches=Branches
alpine.repository.repositories=Dépôts
alpine.repository.architectures=Architectures
@ -3682,7 +3687,7 @@ conda.install=Pour installer le paquet en utilisant Conda, exécutez la commande
container.details.type=Type d'image
container.details.platform=Plateforme
container.pull=Tirez l'image depuis un terminal :
container.digest=Empreinte :
container.digest=Empreinte
container.multi_arch=SE / Arch
container.layers=Calques d'image
container.labels=Labels
@ -3797,6 +3802,7 @@ arch.version.conflicts = Conflits
arch.version.replaces = Remplace
arch.version.backup = Sauvegarde
arch.version.makedepends = Faire des dépendances
container.images.title = Images
[secrets]
secrets=Secrets

View file

@ -9,7 +9,7 @@ sign_in_with_provider = Iniciar Sesión con %s
sign_in_or = ou
sign_out = Pechar Sesión
sign_up = Rexístrate
link_account = Vincular Conta
link_account = Vincular conta
register = Rexistro
version = Vesión
powered_by = Desenvolvido por %s
@ -18,8 +18,8 @@ template = Modelo
notifications = Notificacións
active_stopwatch = Activar Rastrexador de Tempo
create_new = Crear…
user_profile_and_more = Perfil e Configuración…
signed_in_as = Inicia Sesión como
user_profile_and_more = Perfil e configuración…
signed_in_as = Sesión iniciada como
enable_javascript = Este sitio web require JavaScript.
toc = Táboa de Contidos
licenses = Licenzas
@ -29,17 +29,17 @@ email = Enderezo Electrónico
password = Contrasinal
re_type = Confirme o contrasinal
captcha = CAPTCHA
twofa = Autenticación de Dous Factores
passcode = Código de Acceso
webauthn_insert_key = Insira a súa Chave de Seguranza
webauthn_press_button = Preme o botón da súa Chave de Seguranza
twofa = Autenticación de dobre factor
passcode = Código de acceso
webauthn_insert_key = Insira a súa clave de seguridade
webauthn_press_button = Prema o botón da súa clave de seguridade
webauthn_use_twofa = Use o Código de Dous Factores do seu Teléfono
webauthn_error = Non se Puido Ler a súa Chave de Seguranza.
webauthn_unsupported_browser = O seu Navegador non Soporta Actualmente WebAuthn.
webauthn_error_unknown = Produciuse un Erro Descoñecido.Téntao de novo.
webauthn_error_unable_to_process = O Servidor non Puido Procesar a súa Solicitude.
webauthn_error_duplicated = A Chave de Seguranza non está Permitida para esta Solicitude. Asegúrese de que a Chave non Estea Rexistrada.
webauthn_error_empty = Debes Definir un Nome para esta Chave.
webauthn_error = Non se puido ler a súa clave de seguridade.
webauthn_unsupported_browser = O seu navegador non soporta WebAuthn actualmente.
webauthn_error_unknown = Produciuse un erro descoñecido. Ténteo de novo.
webauthn_error_unable_to_process = O servidor non puido procesar a súa solicitude.
webauthn_error_duplicated = A clave de seguridade non está permitida para esta solicitude. Asegúrese de que a clave non estea xa rexistrada.
webauthn_error_empty = Debe definir un nome para esta clave.
webauthn_reload = Recarga
repository = Repositorio
organization = Organización
@ -49,21 +49,21 @@ new_migrate = Nova Migración
new_mirror = Novo Espello
new_fork = Nova Bifurcación do Repositorio
new_org = Nova Organización
new_project = Novo Proxecto
new_project_column = Nova Columna
new_project = Novo proxecto
new_project_column = Nova columna
manage_org = Xestionar Organizacións
admin_panel = Administración do Sitio
admin_panel = Administración da páxina
account_settings = Axustes da Conta
settings = Configuración
your_profile = Perfil
your_starred = Destacado
your_settings = Configuracións
your_settings = Configuración
all = Todo
sources = Fontes
mirrors = Espellos
collaborative = Colaborativo
forks = Derivacións
pull_requests = Pull Requests
pull_requests = Solicitudes de fusión
milestones = Fitos
ok = OK
cancel = Cancelar
@ -71,57 +71,57 @@ retry = Volve Tentar
rerun = Volve Executar
rerun_all = Volve Executar Todos os Traballos
add = Engadir
add_all = Engadir Todo
remove_all = Quitar Todo
remove_label_str = Eliminar Elemento "%s"
add_all = Engadir todo
remove_all = Quitar todo
remove_label_str = Eliminar elemento "%s"
edit = Editar
enabled = Activado
locked = Bloqueado
copy = Copiar
copy_url = Copiar URL
copy_branch = Copiar o Nome da Rama
copy_branch = Copiar o nome da rama
copy_success = Copiado!
copy_error = Erro na Copia
copy_error = Erro na copia
write = Escribir
preview = Vista Previa
preview = Vista previa
loading = Cargando…
error = Erro
go_back = Volver Atrás
go_back = Volver atrás
never = Nunca
unknown = Descoñecido
rss_feed = Feed RSS
unpin = Desprender
artifacts = Artefactos
confirm_delete_artifact = Estás seguro de que queres eliminar o Artefacto '%s' ?
confirm_delete_artifact = Está seguro de querer eliminar o artefacto "%s"?
archived = Arquivado
concept_system_global = Global
access_token = Token de Acceso
activities = Actividades
save = Gardar
copy_content = Copiar Contido
copy_content = Copiar contido
language = Linguaxe
copy_hash = Copiar hash
twofa_scratch = Código Scratch de Dous Factores
webauthn_sign_in = Preme o botón da súa Chave de Seguranza. Se a súa Chave de Seguranza non ten ningún botón, insírela de novo.
issues = Problemas
webauthn_sign_in = Prema o botón da súa clave de seguridade. Se a súa clave de seguridade non ten ningún botón, insíraa de novo.
issues = Incidencias
disabled = Desactivado
error404 = A páxina á que estás tentando acceder <strong>Non Existe</strong> ou <strong>Non tes Autorización</strong> para vela.
tracked_time_summary = Resumo do tempo de seguimento baseado nos filtros da lista de problemas
webauthn_error_insecure = WebAuthn só Admite Conexións Seguras. Para probar a través de HTTP, pode usar a orixe "localhost" ou "127.0.0.1"
webauthn_error_timeout = Alcanzouse o tempo de espera antes de que se Pidese Ler a súa Chave. Volve cargar esta Páxina e Téntao de Novo.
error404 = A páxina á que estás tentando acceder <strong>non existe</strong> ou <strong>non tes autorización</strong> para vela.
tracked_time_summary = Resumo do tempo de seguimento baseado nos filtros da lista de incidencias
webauthn_error_insecure = WebAuthn só admite conexións seguras. Para probar a través de HTTP, pode usar a orixe "localhost" ou "127.0.0.1"
webauthn_error_timeout = Alcanzouse o límite de tempo antes de que se puidera ler a súa clave. Volva cargar esta páxina e ténteo de novo.
remove = Quitar
view = Vista
view = Ver
copy_type_unsupported = Este tipo de ficheiro non se pode copiar
concept_user_organization = Organización
show_timestamps = Mostrar M0arcas de Tempo
show_log_seconds = Mostrar Segundos
download_logs = Descargar Rexistros
show_timestamps = Mostrar marcas de tempo
show_log_seconds = Mostrar segundos
download_logs = Descargar rexistros
name = Nome
value = Valor
confirm_delete_selected = Confirmar a eliminación de todos os elementos seleccionados?
confirm_delete_selected = Confirmar a eliminación de tódolos elementos seleccionados?
show_full_screen = Mostrar Pantalla Completa
more_items = Máis items
toggle_menu = Alternar Menú
more_items = Máis elementos
toggle_menu = Alternar menú
filter = Filtro
filter.clear = Borrar filtros
filter.is_archived = Arquivado
@ -140,6 +140,14 @@ pin = Aproximada
filter.private = Privado
copy_generic = Copiar ao portapapeis
test = Test
copy_path = Copiar ruta
error413 = Esgotou a súa cota.
new_repo.title = Novo repositorio
new_migrate.title = Nova migración
new_org.title = Nova organización
new_repo.link = Novo repositorio
new_migrate.link = Nova migración
new_org.link = Nova organización
[aria]
navbar = Barra de Navegación
@ -170,9 +178,23 @@ buttons.ref.tooltip = Referencia un problema ou pull request
[search]
search = Buscar...
type_tooltip = Tipo de busca
type_tooltip = Tipo de procura
repo_kind = Buscar repositorios...
user_kind = Buscar usuarios...
regexp = RegExp
regexp_tooltip = Interpretar o termo da procura como expresión regular
org_kind = Procurar organizacións...
team_kind = Procurar equipos...
code_kind = Procurar código...
code_search_unavailable = A procura de código non está dispoñible neste momento. Por favor contacte coa persoa responsable da administración da páxina.
package_kind = Buscar paquetes...
fuzzy = Difusa
fuzzy_tooltip = Incluír resultados que tamén coincidan estreitamente co termo da procura
union = Palabras clave
union_tooltip = Incluír resultados correspondentes a calquera dal palabras clave separadas por espazos en branco
exact = Exacta
exact_tooltip = Incluír só resultados correspondentes ao termo exacto da procura
issue_kind = Procurar incidencias...
[startpage]
platform = Multiplataforma

View file

@ -3469,7 +3469,7 @@ monitor.queue.settings.remove_all_items = Rimuovi tutto
monitor.queue.settings.desc = Le piscine crescono dinamicamente in risposta al blocco dei lavoratori in coda.
monitor.queue.settings.remove_all_items_done = Tutti gli elementi in coda sono stati rimossi.
self_check.database_collation_mismatch = Pretendi che la base di dati usi la collazione: %s
self_check.database_fix_mysql = Per utenti MySQL/MariaDB, potresti usare il comando "gitea doctor convert" per risolvere problemi di collazione, o potresti risolvere il problema manualmente tramite SQL con "ALTER ... COLLATE ...".
self_check.database_fix_mysql = Per utenti MySQL/MariaDB, potresti usare il comando "forgejo doctor convert" per risolvere problemi di collazione, o potresti risolvere il problema manualmente tramite SQL con "ALTER ... COLLATE ...".
self_check.database_collation_case_insensitive = La base di dati sta usando la collazione %s, che è una collazione insensibile. Nonostante Forgejo potrebbe lavorarci, ci potrebbero essere rari casi che non vanno come previsto.
auths.tip.gitlab_new = Registra una nuova applicazione su %s
config_summary = Riepilogo

View file

@ -337,7 +337,7 @@ allow_password_change=사용자에게 비밀번호 변경을 요청 (권장됨)
reset_password_mail_sent_prompt=확인 메일이 <b>%s</b>로 전송되었습니다. 받은 편지함으로 도착한 메일을 %s 안에 확인해서 비밀번호 찾기 절차를 완료하십시오.
active_your_account=계정 활성화
account_activated=계정이 활성화 되었습니다
prohibit_login =
prohibit_login =
resent_limit_prompt=활성화를 위한 이메일을 이미 전송했습니다. 3분 내로 이메일을 받지 못한 경우 재시도해주세요.
has_unconfirmed_mail=안녕하세요 %s, 이메일 주소(<b>%s</b>)가 확인되지 않았습니다. 확인 메일을 받으시지 못하겼거나 새로운 확인 메일이 필요하다면, 아래 버튼을 클릭해 재발송하실 수 있습니다.
resend_mail=여기를 눌러 확인 메일 재전송

File diff suppressed because it is too large Load diff

View file

@ -39,7 +39,7 @@ webauthn_error_empty = Du muttst de Slötel eenen Naam geven.
repository = Repositorium
organization = Vereenigung
new_fork = Neje Repositoriums-Gabel
dashboard = Mien Disk
dashboard = Kontor
logo = Logo
active_stopwatch = Aktive Tied-Erfatens
password = Passwoord
@ -150,7 +150,7 @@ fuzzy = um de Slag
fuzzy_tooltip = Ok Resultaten wiesen, wat dicht to de Söökwoorden passen
union = Passt
union_tooltip = Resultaten wiesen, wat to eets of anner vun de mit Leegtekens trennt Söökwoorden passen
exact = Akkeraat
exact = akkeraat
exact_tooltip = Blots Resultaten wiesen, wat akkeraat to de Söökwoord passen
regexp = RegEx
regexp_tooltip = De Söökwoord as Regel-Utdruck behanneln
@ -235,7 +235,7 @@ install_desc = Du kannst dat Programm eenfach <a target="_blank" rel="noopener n
[home]
uname_holder = Brukernaam of E-Mail-Adress
switch_dashboard_context = Mien-Disk-Umgeven wesseln
switch_dashboard_context = Kontor-Umgeven wesseln
my_repos = Repositoriums
my_orgs = Vereenigungen
view_home = %s wiesen
@ -521,8 +521,8 @@ followers.title.few = Nagahers
following.title.one = Gaht na
followers_one = %d Nagaher
followers_few = %d Nagahers
following_one = %d gaht na
following_few = %d gahn na
following_one = gaht %d na
following_few = gaht %d na
follow = Nagahn
unfollow = Nich mehr nagahn
block_user = Bruker blockeren
@ -600,7 +600,7 @@ change_password = Passwoord ännern
update_password = Passwoord vernejen
old_password = Stedenwies Passwoord
new_password = Nejes Passwoord
theme_desc = Dat word dien normaales Thema all över de Sied wesen.
theme_desc = Deeses Thema word in de Brukerschnittstee bruukt, wenn du anmellt büst.
primary = Höövd
activated = Aktiveert
requires_activation = Mutt aktiveert worden
@ -841,7 +841,7 @@ email_deletion_desc = De E-Mail-Adress un daarmit verbunnen Informatioon word ut
principal_desc = Deese SSH-Zertifikaat-Höövdmannen sünd mit dienem Konto verbunnen un geven kumpleten Togriep up diene Repositoriums.
add_email_confirmation_sent = Eene Utwiesens-E-Mail is an »%s« schickt worden. Um diene E-Mail-Adress uttowiesen, kiek bidde in dienen E-Mail-Ingang un folg de Verwies daarin in de anner %s.
ssh_desc = Deese publiken SSH-Slötels sünd mit dienem Konto verbunnen. De tohörig privaate Slötel gifft kumpleten Togriep up diene Repositoriums. SSH-Slötels, wat utwiest worden sünd, könen bruukt worden, um SSH-unnerschreven Git-Kommitterens uttowiesen.
keep_email_private_popup = Dat word diene E-Mail-Adress vun dienem Profil verburgen. Dann is dat nich mehr de Normaalweert för Kommitterens, wat du över de Internett-Schnittstee maakst, so as Datei-Upladens un Bewarkens, un word nich in Tosamenföhrens-Kommitterens bruukt. In Stee daarvun kann eene besünnere Adress %s bruukt worden, um Kommitterens mit dienem Konto to verbinnen. Wees wiss, dat dat Ännern vun deeser Instellen bestahn Kommitterens nich ännert.
keep_email_private_popup = Dat word diene E-Mail-Adress vun dienem Profil verbargen. Dann is dat nich mehr de Normaalweert för Kommitterens, wat du över de Internett-Schnittstee maakst, so as Datei-Upladens un Bewarkens, un word nich in Tosamenföhrens-Kommitterens bruukt. In Stee daarvun kann eene besünnere Adress %s bruukt worden, um Kommitterens mit dienem Konto to verbinnen. Wees wiss, dat dat Ännern vun deeser Instellen bestahn Kommitterens nich ännert.
ssh_helper = <strong>Bruukst du Hülp?</strong> Kiek de Inföhren an, wo du <a href="%s">diene eegenen SSH-Slötels maakst</a> of hülp <a href="%s">gewohnten Probleemen</a> of, över wat man mit SSH mennigmaal strukelt.
access_token_desc = Utköört Teken-Verlöövnissen begrenzen dat Anmellen blots up de tohörig <a href="%[1]s" target="_blank">API</a>-Padden. Lees de <a href="%[2]s" target="_blank">Dokumenteren</a> för mehr Informatioonen.
oauth2_confidential_client = Diskreeter Klient. Köör dat för Programmen ut, wat dat Geheemst diskreet behanneln, as Internett-Sieden. Köör dat nich för stedenwies Programmen ut, as Schrievdisk- un Telefoon-Programmens.
@ -876,7 +876,7 @@ generate_repo = Repositorium maken
generate_from = Maken ut
repo_desc = Beschrieven
admin.update_flags = Flaggen vernejen
new_repo_helper = In eenem Repositorium sünd all Dateien vun eenem Projekt, ok hör Versioons-Histoorje. Hest du al annerwaar eens? <a href="%s">Treck een Repositorium um.</a>
new_repo_helper = In eenem Repositorium sünd all Dateien vun eenem Projekt, ok hör Versioons-Histoorje. Hest du al annerwaar eens? <a href="%s">Treck een Repositorium um</a>.
owner_helper = Eenige Vereenigungen worden in de List villicht nich wiest, denn t gifft eene Grenz, wo völe Repositoriums man hebben kann.
admin.enabled_flags = Flaggen, wat för deeses Repositorium anknipst sünd:
admin.failed_to_replace_flags = Kunn Repositoriums-Flaggen nich utwesseln
@ -2286,7 +2286,7 @@ settings.matrix.homeserver_url = Heimaadserver-URL
settings.matrix.room_id = Ruum-ID
settings.archive.header = Deeses Repo archiveren
settings.archive.error_ismirror = Du kannst een spegelt Repo nich archiveren.
settings.archive.tagsettings_unavailable = Mark-Instellens sünd nich verföögbaar, wenn dat Repo archiveert is.
settings.archive.tagsettings_unavailable = Mark-Instellens sünd in archiveert Repos nich verföögbaar.
settings.unarchive.button = Repo ut Archiv torügghalen
settings.unarchive.success = Dat Repo is nu nich mehr archiveert.
settings.unarchive.error = Een Fehler is bim Torügghalen vum Repo ut de Archiv uptreden. Kiek in de Utgaav för mehr Informatioonen.
@ -2301,14 +2301,14 @@ settings.unarchive.header = Deeses Repo as nich mehr archiveert setten
settings.update_avatar_success = Dat Repositoriums-Kontobill is verneeit worden.
settings.lfs_findcommits = Kommitterens finnen
settings.protected_branch_required_approvals_min = Nödige Tostimmens könen nich negativ wesen.
settings.archive.mirrors_unavailable = Spegels sünd nich verföögbar, wenn dat Repo archiveert is.
settings.archive.mirrors_unavailable = Spegels sünd in archiveert Repos nich verföögbaar.
settings.tags.protection.create = Örder hentofögen
settings.bot_token = Bot-Teken
settings.matrix.message_type = Narichten-Aard
settings.archive.text = Wenn dat Repo archiveert word, kann man daar blots noch lesen. Dat word vum Disk verburgen. Nüms (ok nich du sülvst!) kann noch neje Kommitterens maken of Gefallens of Haalvörslagen opmaken.
settings.archive.text = Wenn dat Repo archiveert word, kann man daar blots noch lesen. Dat word vum Kontor verburgen. Nüms (ok nich du sülvst!) kann noch neje Kommitterens maken of Gefallens of Haalvörslagen opmaken.
settings.archive.success = Dat Repo is archiveert worden.
settings.archive.error = Een Fehler is bim Archiveren vum Repo uptreden. Kiek in de Utgaav för mehr Informatioonen.
settings.archive.branchsettings_unavailable = Twieg-Instellens sünd nich verföögbaar, wenn dat Repo archiveert is.
settings.archive.branchsettings_unavailable = Twieg-Instellens sünd in archiveert Repos nich verföögbaar.
settings.unarchive.text = Wenn dat Repo nich mehr archiveert is, kann dat weer Kommitterens un Schuvens kriegen un ok neje Gefallens un Haalvörslagens.
settings.lfs_no_lfs_files = In deesem Repositorium sünd keene LFS-Dateien verwahrt
settings.lfs_noattribute = Deeser Padd is im Höövd-Twieg nich as toslutbaar markeert
@ -2548,6 +2548,7 @@ diff.git-notes.remove-body = Deeses Anmarken word wegdaan.
issues.num_reviews_one = %d Nakieken
issues.summary_card_alt = Tosamenfatens-Kaart vun eenem Gefall mit de Naam »%s« im Repositorium %s
issues.num_reviews_few = %d Nakiekens
settings.default_update_style_desc = Normaale Vernejens-Aard, wat bruukt word, um Haalvörslagens to vernejen, wat achter de Grund-Twieg torügg sünd.
[repo.permissions]
code.read = <b>Lesen:</b> De Quelltext vun deesem Repositorium ankieken un klonen.
@ -2583,7 +2584,7 @@ org_name_holder = Vereenigungs-Naam
org_full_name_holder = Kumpleter Naam vun de Vereenigung
org_name_helper = Vereenigungs-Namen sallen kört un lich to marken wesen.
create_org = Vereenigung maken
open_dashboard = »Mien Disk« opmaken
open_dashboard = Kontor opmaken
repo_updated = %s verneeit
members = Liddmaten
teams = Klottjen
@ -2693,7 +2694,7 @@ teams.specific_repositories_helper = Liddmaten hebben blots Togriep up Repositor
teams.all_repositories = All Repositoriums
[admin]
dashboard = Mien Disk
dashboard = Kontor
self_check = Sülvst-Överprüfen
identity_access = Sülvst & Togang
users = Brukerkonten
@ -3183,7 +3184,7 @@ notices.view_detail_header = Naricht-Informatioonen
self_check.no_problem_found = Noch keen Probleem funnen.
self_check.database_collation_mismatch = Verwacht, dat de Datenbank deese Kollatioon bruukt: %s
self_check.database_collation_case_insensitive = Datenbank bruukt eene Kollatioon %s, wat eene unklünige Kollatioon is. Forgejo kann twaar daarmit warken, aver dat kann rare Fallen geven, waar dat nich so warkt as verwacht.
self_check.database_fix_mysql = Brukers vun MySQL of MariaDB könen de Oorder »gitea doctor convert« bruken, um de Kollatioons-Problemen oftohelpen, of du kannst dat Probleem ofhelpen, indeem du vun Hand de SQL-Oorders »ALTER … COLLATE …« bruukst.
self_check.database_fix_mysql = Brukers vun MySQL of MariaDB könen de Oorder »forgejo doctor convert« bruken, um de Kollatioons-Problemen oftohelpen, of du kannst dat Probleem ofhelpen, indeem du vun Hand de SQL-Oorders »ALTER … COLLATE …« bruukst.
self_check.database_inconsistent_collation_columns = Datenbank bruukt Kollatioon %s, aver deese Striepen bruken unpassend Kollatioonen. Dat kann unverwachte Problemen maken.
auths.sspi_auto_create_users_helper = Verlöövt de SSPI-Anmellens-Aard, automatisk een Konto för Brukers to maken, well sik tum eersten Maal anmellen
config.log_file_root_path = Utgaav-Padd
@ -3561,7 +3562,7 @@ conda.install = Um dat Paket mit Conda to installeren, föhr deese Oorder ut:
container.details.type = Avbill-Aard
container.details.platform = Plattfoorm
container.pull = Haal deeses Avbill vun de Oorderreeg:
container.digest = Prüüfsumm:
container.digest = Prüüfsumm
container.multi_arch = BS / Arch
container.layers = Avbill-Schichten
cran.registry = Richt deese Paketlist in diener <code>Rprofile.site</code>-Datei in:
@ -3599,6 +3600,7 @@ owner.settings.chef.title = Chef-Paketlist
owner.settings.chef.keypair = Slötelpaar maken
owner.settings.chef.keypair.description = Een Slötelpaar is nödig, um sik bi de Chef-Paketlist antomellen. Wenn du al een Slötelpaar maakt hest, word dat olle Slötelpaar wegdaan, wenn du een nejes Slötelpaar maakst.
conan.install = Um dat Paket mit Conan to installeren, föhr deese Oorder ut:
container.images.title = Avbillers
[secrets]
secrets = Geheemsten
@ -3611,9 +3613,9 @@ deletion = Geheemst wegdoon
deletion.success = Dat Geheemst is wegdaan worden.
deletion.failed = Kunn Geheemst nich wegdoon.
management = Geheemsten verwalten
creation.value_placeholder = Giff elkeen Inholl in. Leegtekens am Begünn un Enn word ofsneden.
creation.value_placeholder = Giff elkeen Inholl in. Leegtekens am Begünn un Enn worden ofsneden.
deletion.description = Een Geheemst wegtodoon is för all Tieden un kann nich torüggnohmen worden. Wiedermaken?
creation.name_placeholder = Blots alphanumerisk Boostavens (dat word nich tüsken Groot- un Kleenbookstavens unnerscheden) un Unnerstrekens; kann nich mit GITEA_ of GITHUB_ begünnen
creation.name_placeholder = Blots alphanumerisk Bookstavens (t word nich tüsken Groot- un Kleenbookstavens unnerscheden) un Unnerstrekens; kann nich mit GITEA_ of GITHUB_ begünnen
[actions]
actions = Aktioonen

View file

@ -166,6 +166,7 @@ new_repo.link = Nieuwe repository
new_repo.title = Nieuwe repository
new_migrate.link = Nieuwe migratie
new_org.link = Nieuwe organisatie
copy_path = Kopieer bestandspad
[aria]
navbar = Navigatiebalk
@ -3476,7 +3477,7 @@ self_check.database_inconsistent_collation_columns = Database gebruikt collatie
monitor.stacktrace = Stacktrace
monitor.download_diagnosis_report = Diagnoserapport downloaden
self_check.database_collation_case_insensitive = Database gebruikt collatie %s, wat een ongevoelige collatie is. Hoewel Forgejo ermee kan werken, kunnen er enkele zeldzame gevallen zijn die niet werken zoals verwacht.
self_check.database_fix_mysql = Voor MySQL/MariaDB gebruikers zou je het "gitea doctor convert" commando kunnen gebruiken om de collatieproblemen op te lossen, of je zou het probleem ook kunnen oplossen door "ALTER ... COLLATE ..." SQL's handmatig op te lossen.
self_check.database_fix_mysql = Voor MySQL/MariaDB gebruikers zou je het "forgejo doctor convert" commando kunnen gebruiken om de collatieproblemen op te lossen, of je zou het probleem ook kunnen oplossen door "ALTER ... COLLATE ..." SQL's handmatig op te lossen.
dashboard.gc_lfs = LFS meta-objecten afval opruimen
auths.map_group_to_team = Breng LDAP-groepen in kaart voor organisatieteams (laat het veld leeg om over te slaan)
auths.oauth2_required_claim_name = Verplichte claimnaam
@ -3672,7 +3673,7 @@ conda.registry = Stel dit register in als een Conda repository in je <code>.cond
container.details.type = Afbeelding Type
container.details.platform = Platform
container.pull = Haal de afbeelding op vanaf de terminal:
container.digest = Digest:
container.digest = Digest
container.multi_arch = Besturingssysteem / Arch
container.layers = Afbeelding Lagen
container.labels = Labels
@ -3800,6 +3801,7 @@ arch.version.conflicts = Conflicten
arch.version.replaces = Vervangt
arch.version.backup = Back-up
arch.version.makedepends = Maken is afhankelijk van
container.images.title = Afbeeldingen
[secrets]
secrets = Geheimen

View file

@ -166,6 +166,7 @@ new_migrate.link = Nova migração
new_org.link = Nova organização
test = Teste
error413 = Você esgotou sua cota.
copy_path = Copiar caminho
[aria]
navbar=Barra de navegação
@ -812,7 +813,7 @@ manage_emails=Gerenciar endereços de e-mail
manage_themes=Tema padrão
manage_openid=Endereços OpenID
email_desc=Seu endereço de e-mail principal será usado para notificações, recuperação de senha e, desde que não esteja oculto, para operações do Git baseadas na Web.
theme_desc=Este será o seu tema padrão em todo o site.
theme_desc=Este tema será usado para a interface web quando você fizer login.
primary=Principal
activated=Ativado
requires_activation=Requer ativação
@ -1093,7 +1094,7 @@ issue_labels=Etiquetas
issue_labels_helper=Selecione um conjunto de etiquetas
license=Licença
license_helper=Selecione um arquivo de licença
license_helper_desc=Uma licença define o que os outros podem e não podem fazer com o seu código. Não tem certeza qual é a mais adequada para o seu projeto? Veja <a target="_blank" rel="noopener noreferrer" href="%s">Escolher uma licença.</a>
license_helper_desc=Uma licença define o que os outros podem e não podem fazer com o seu código. Não tem certeza qual é a mais adequada para o seu projeto? Veja <a target="_blank" rel="noopener noreferrer" href="%s">Escolher uma licença</a>.
readme=LEIA-ME
readme_helper=Selecione um modelo de arquivo README
readme_helper_desc=Aqui você pode escrever uma descrição completa para o seu projeto.
@ -2439,8 +2440,8 @@ settings.archive.header=Arquivar este repositório
settings.archive.success=O repositório foi arquivado com sucesso.
settings.archive.error=Um erro ocorreu enquanto estava sendo arquivado o repositório. Veja o log para mais detalhes.
settings.archive.error_ismirror=Você não pode arquivar um repositório espelhado.
settings.archive.branchsettings_unavailable=Configurações do branch não estão disponíveis quando o repositório está arquivado.
settings.archive.tagsettings_unavailable=As configurações de tag não estão disponíveis se o repositório estiver arquivado.
settings.archive.branchsettings_unavailable=Configurações de branch não estão disponíveis em repositórios arquivados.
settings.archive.tagsettings_unavailable=Configurações de tag não estão disponíveis em repositórios arquivados.
settings.update_avatar_success=O avatar do repositório foi atualizado.
settings.lfs=LFS
settings.lfs_filelist=Arquivos LFS armazenados neste repositório
@ -2640,7 +2641,7 @@ settings.unarchive.success = O repositório foi desarquivado.
settings.unarchive.button = Desarquivar repositório
settings.unarchive.header = Desarquivar este repositório
diff.comment.add_line_comment = Adicionar comentário na linha
new_repo_helper = Um repositório contém todos os arquivos de projeto, incluindo o histórico de revisões. Já hospeda um repositório em outra plataforma? <a href="%s">Migrar repositório</a>
new_repo_helper = Um repositório contém todos os arquivos de projeto, incluindo o histórico de revisões. Já hospeda um repositório em outra plataforma? <a href="%s">Migrar repositório</a>.
blame.ignore_revs.failed = Falha ao ignorar as revisões em <a href="%s">.git-blame-ignore-revs</a>.
migrate.forgejo.description = Migrar dados do codeberg.org ou outras servidores Forgejo.
commits.browse_further = Ver mais
@ -2725,7 +2726,7 @@ comments.edit.already_changed = Falha ao salvar as alterações ao comentário.
activity.navbar.code_frequency = Frequência de código
settings.protect_status_check_matched = Correspondente
branch.tag_collision = O ramo "%s" não pode ser criado porque já existe uma etiqueta com o mesmo nome no repositório.
settings.archive.mirrors_unavailable = As réplicas ficarão indisponíveis se o repositório estiver arquivado.
settings.archive.mirrors_unavailable = Réplicas não estão disponíveis em repositórios arquivados.
release.download_count_one = %s download
settings.mirror_settings.docs.no_new_mirrors = O seu repositório está replicando alterações de ou para outro repositório. Observe que não é possível criar novas réplicas no momento.
settings.mirror_settings.docs.pull_mirror_instructions = Para configurar uma réplica de outro repositório, consulte:
@ -3514,7 +3515,7 @@ packages.cleanup.success = Os dados expirados foram limpos com sucesso
monitor.queue.activeworkers = Processos ativos
systemhooks.desc = Os webhooks fazem automaticamente solicitações HTTP POST para um servidor quando certos eventos Forgejo são acionados. Os webhooks definidos aqui atuarão em todos os repositórios do sistema, então, considere quaisquer implicações de desempenho que isso possa ter. Leia mais no <a target="_blank" rel="noopener" href="%s">guia de webhooks</a>.
defaulthooks.desc = Os webhooks fazem automaticamente solicitações HTTP POST para um servidor quando certos eventos Forgejo são acionados. Os webhooks definidos aqui são padrões e serão copiados para todos os novos repositórios. Leia mais no <a target="_blank" rel="noopener" href="%s">guia de webhooks</a>.
self_check.database_fix_mysql = Para usuários do MySQL/MariaDB, você pode usar o comando "gitea doctor convert" para corrigir os problemas de ordenamento, ou também pode corrigir o problema usando "ALTER ... COLLATE ..." SQLs manualmente.
self_check.database_fix_mysql = Para usuários do MySQL/MariaDB, você pode usar o comando "forgejo doctor convert" para corrigir os problemas de ordenamento, ou também pode corrigir o problema usando "ALTER ... COLLATE ..." SQLs manualmente.
monitor.queue.settings.desc = Os pools crescem dinamicamente quando as filas de seus workers ficam bloqueadas.
config.cache_test_succeeded = Teste de cache bem-sucedido, obteve uma resposta em %s.
self_check.database_inconsistent_collation_columns = O banco de dados está usando o ordenamento %s, mas essas colunas estão usando ordenamentos incompatíveis. Isso pode causar alguns problemas inesperados.
@ -3674,18 +3675,18 @@ chef.install=Para instalar o pacote, execute o seguinte comando:
composer.registry=Configure este registro em seu arquivo <code>~/.composer/config.json</code>:
composer.install=Para instalar o pacote usando o Composer, execute o seguinte comando:
composer.dependencies=Dependências
composer.dependencies.development=Dependências de Desenvolvimento
composer.dependencies.development=Dependências de desenvolvimento
conan.details.repository=Repositório
conan.registry=Configure este registro pela linha de comando:
conan.install=Para instalar o pacote usando o Conan, execute o seguinte comando:
conda.registry=Configure este registro como um repositório Conda no arquivo <code>.condarc</code>:
conda.install=Para instalar o pacote usando o Conda, execute o seguinte comando:
container.details.type=Tipo de Imagem
container.details.type=Tipo de imagem
container.details.platform=Plataforma
container.pull=Puxe a imagem pela linha de comando:
container.digest=Digest:
container.digest=Digest
container.multi_arch=S.O. / Arquitetura
container.layers=Camadas da Imagem
container.layers=Camadas da imagem
container.labels=Rótulos
container.labels.key=Chave
container.labels.value=Valor
@ -3713,9 +3714,9 @@ npm.registry=Configure este registro no arquivo <code>.npmrc</code> do seu proje
npm.install=Para instalar o pacote usando o npm, execute o seguinte comando:
npm.install2=ou adicione-o ao arquivo package.json:
npm.dependencies=Dependências
npm.dependencies.development=Dependências de Desenvolvimento
npm.dependencies.peer=Dependências Peer
npm.dependencies.optional=Dependências Opcionais
npm.dependencies.development=Dependências de desenvolvimento
npm.dependencies.peer=Dependências peer
npm.dependencies.optional=Dependências opcionais
npm.details.tag=Tag
pub.install=Para instalar o pacote usando Dart, execute o seguinte comando:
pypi.requires=Requer Python
@ -3728,8 +3729,8 @@ rpm.repository = Informações do repositório
rpm.repository.architectures = Arquiteturas
rubygems.install=Para instalar o pacote usando gem, execute o seguinte comando:
rubygems.install2=ou adicione-o ao Gemfile:
rubygems.dependencies.runtime=Dependências de Execução
rubygems.dependencies.development=Dependências de Desenvolvimento
rubygems.dependencies.runtime=Dependências de tempo de execução
rubygems.dependencies.development=Dependências de desenvolvimento
rubygems.required.ruby=Requer o Ruby versão
rubygems.required.rubygems=Requer o RubyGem versão
swift.registry=Configure este registro pela linha de comando:
@ -3776,11 +3777,11 @@ owner.settings.cleanuprules.success.delete=Regra de limpeza foi excluída.
owner.settings.chef.title=Registro Chef
owner.settings.chef.keypair=Gerar par de chaves
rpm.repository.multiple_groups = Este pacote está disponível em vários grupos.
npm.dependencies.bundle = Dependências empacotadas
npm.dependencies.bundle = Dependências em bundle
registry.documentation = Para mais informações sobre o registro %s, veja <a target="_blank" rel="noopener noreferrer" href="%s">a documentação</a>.
arch.version.replaces = Substitui
arch.version.conflicts = Conflitos
arch.version.properties = Propriedades de Versão
arch.version.properties = Propriedades da versão
arch.version.description = Descrição
arch.version.groups = Grupo
arch.version.provides = Fornece
@ -3799,6 +3800,7 @@ arch.version.makedepends = Dependências do make
arch.version.checkdepends = Verificar dependências
owner.settings.cargo.initialize.description = É necessário um repositório Git especial de índice para usar o registro Cargo. Usar esta opção irá (re-)criar o repositório e configurá-lo automaticamente.
owner.settings.chef.keypair.description = É necessário um par de chaves para autenticar no registro Chef. Se você já gerou um par de chaves, gere um novo par e descarte o antigo.
container.images.title = Imagens
[secrets]
secrets=Segredos

View file

@ -166,6 +166,7 @@ new_org.title = Nova organização
new_repo.link = Novo repositório
new_migrate.link = Nova migração
new_org.link = Nova organização
copy_path = Copiar caminho
[aria]
navbar=Barra de navegação
@ -2847,6 +2848,7 @@ pulls.delete_after_merge.head_branch.insufficient_branch = Não tem permissão p
issues.summary_card_alt = Sumário de uma questão com o título "%s" no repositório %s
issues.num_reviews_one = %d revisão
issues.num_reviews_few = %d revisões
editor.add_tmpl.filename = nome do ficheiro
[graphs]
component_loading=A carregar %s...
@ -3517,7 +3519,7 @@ self_check.no_problem_found=Nenhum problema encontrado até agora.
self_check.database_collation_mismatch=Supor que a base de dados usa a colação: %s
self_check.database_collation_case_insensitive=A base de dados está a usar a colação %s, que é insensível à diferença entre maiúsculas e minúsculas. Embora o Gitea possa trabalhar com ela, pode haver alguns casos raros que não funcionem como esperado.
self_check.database_inconsistent_collation_columns=A base de dados está a usar a colação %s, mas estas colunas estão a usar colações diferentes. Isso poderá causar alguns problemas inesperados.
self_check.database_fix_mysql=Para utilizadores do MySQL/MariaDB, pode usar o comando "gitea doctor convert" para resolver os problemas de colação. Também pode resolver o problema com comandos SQL "ALTER ... COLLATE ..." aplicados manualmente.
self_check.database_fix_mysql=Para utilizadores do MySQL/MariaDB, pode usar o comando "forgejo doctor convert" para resolver os problemas de colação. Também pode resolver o problema com comandos SQL "ALTER ... COLLATE ..." aplicados manualmente.
config_summary = Resumo
auths.tips.gmail_settings = Configurações do Gmail:
config_settings = Configurações
@ -3799,6 +3801,7 @@ arch.version.checkdepends = Verificar dependências
arch.version.conflicts = Conflitos
arch.version.backup = Cópia de segurança
arch.version.replaces = Substitui
container.images.title = Imagens
[secrets]
secrets=Segredos

View file

@ -234,7 +234,7 @@ license_desc=Всё это на <a target="_blank" rel="noopener noreferrer" hre
[install]
install=Установка
title=Начальная конфигурация
docker_helper=Если вы запускаете Forgejo под Docker, пожалуйста, ознакомьтесь с <a target="_blank" rel="noopener noreferrer" href="%s">документацией</a>, прежде чем изменять любые настройки.
docker_helper=Если вы запускаете Forgejo под Docker, прежде чем изменять любые настройки, пожалуйста, ознакомьтесь с <a target="_blank" rel="noopener noreferrer" href="%s">документацией</a>.
require_db_desc=Forgejo требуется MySQL, PostgreSQL, SQLite3 или TiDB (по протоколу MySQL).
db_title=Настройки базы данных
db_type=Тип базы данных
@ -267,16 +267,16 @@ repo_path=Путь до каталога репозиториев
repo_path_helper=Все удалённые Git репозитории будут сохранены в этом каталоге.
lfs_path=Путь до корневого каталога Git LFS
lfs_path_helper=В этом каталоге будут храниться файлы Git LFS. Оставьте пустым, чтобы отключить LFS.
run_user=Выполнение под пользователем
run_user=Работа под пользователем
run_user_helper=Имя пользователя операционной системы, под которым работает Forgejo. Обратите внимание, что этот пользователь должен иметь доступ к корневому пути репозиториев.
domain=Домен сервера
domain_helper=Домен или адрес хоста для сервера.
ssh_port=Порт SSH-сервера
ssh_port_helper=Номер порта, используемый SSH-сервером. Оставьте пустым для отключения доступа по SSH.
ssh_port_helper=Номер порта, используемый для входящих подключений по SSH. Оставьте пустым для отключения доступа по SSH.
http_port=Порт HTTP-сервера
http_port_helper=Номер порта, используемый веб-сервером Forgejo.
app_url=Базовый URL Forgejo
app_url_helper=Этот параметр влияет на URL для клонирования по HTTP/HTTPS и на некоторые уведомления по эл. почте.
app_url=Базовый URL
app_url_helper=Этот параметр влияет на URL клонирования по HTTP/HTTPS и на ссылки в уведомлениях по эл. почте.
log_root_path=Путь журналов
log_root_path_helper=Файлы журнала будут записываться в этот каталог.
@ -284,9 +284,9 @@ optional_title=Дополнительные настройки
email_title=Настройки эл. почты
smtp_addr=Адрес SMTP
smtp_port=Порт SMTP
smtp_from=Отправлять письма от
smtp_from=Отправитель
smtp_from_helper=Адрес эл. почты, который будет использоваться Forgejo. Введите обычный адрес эл. почты или используйте формат "Имя" <email@example.com>.
mailer_user=Логин SMTP
mailer_user=Имя пользователя SMTP
mailer_password=Пароль SMTP
register_confirm=Требовать подтверждение по эл. почте для регистрации
mail_notify=Уведомления по эл. почте
@ -316,7 +316,7 @@ confirm_password=Подтверждение пароля
admin_email=Адрес эл. почты
install_btn_confirm=Установить Forgejo
test_git_failed=Не удалось проверить команду «git»: %v
sqlite3_not_available=Эта версия Forgejo не поддерживает SQLite3. Пожалуйста, загрузите официальную бинарную сборку из %s (не сборку «gobuild»).
sqlite3_not_available=Эта версия Forgejo не поддерживает SQLite3. Пожалуйста, скачайте официальную сборку из %s (не версию «gobuild»).
invalid_db_setting=Некорректные настройки базы данных: %v
invalid_db_table=Таблица «%s» базы данных некорректна: %v
invalid_repo_path=Недопустимый путь к корню репозитория: %v
@ -360,7 +360,7 @@ my_orgs=Организации
my_mirrors=Мои зеркала
view_home=Показать %s
search_repos=Поиск репозитория…
filter=Другие фильтры
filter=Прочие фильтры
filter_by_team_repositories=Фильтровать по репозиториям команды
feed_of=Лента «%s»
@ -687,13 +687,13 @@ change_avatar=Изменить изображение профиля…
joined_on=Регистрация %s
repositories=Репозитории
activity=Публичная активность
followers_few=%d подписчики
followers_few=%d подписчиков
starred=Избранные репозитории
watched=Отслеживаемые репозитории
code=Код
projects=Проекты
overview=Обзор
following_few=%d подписки
following_few=%d подписок
follow=Подписаться
unfollow=Отписаться
user_bio=О себе
@ -810,10 +810,10 @@ password_change_disabled=Нелокальные учётные записи не
emails=Адреса эл. почты
manage_emails=Управление адресами эл. почты
manage_themes=Тема по умолчанию
manage_themes=Тема интерфейса
manage_openid=Адреса OpenID
email_desc=Ваш основной адрес эл. почты будет использоваться для уведомлений, восстановления пароля и, если он не скрыт, для действий с Git в веб-интерфейсе.
theme_desc=Это будет темой по умолчанию для всего сайта.
theme_desc=Эта тема оформления будет использоваться при входе на сайт под этой учётной записью.
primary=Основной
activated=Активирован
requires_activation=Требуется активация
@ -941,7 +941,7 @@ select_permissions=Выбрать разрешения
permission_no_access=Нет доступа
permission_read=Чтение
permission_write=Чтение и запись
access_token_desc=Выбранные области действия токена ограничивают авторизацию только соответствующими маршрутами <a href="%[1]s" target="_blank">API</a>. Читайте <a href="%[2]s" target="_blank">документацию</a> для получения дополнительной информации.
access_token_desc=Выбранные области действия токена ограничивают его использование до соответствующих маршрутов <a href="%[1]s" target="_blank">API</a>. Для получения подробностей ознакомьтесь с <a href="%[2]s" target="_blank">документацией</a> .
at_least_one_permission=Необходимо выбрать хотя бы одно разрешение для создания токена
permissions_list=Разрешения:
@ -949,7 +949,7 @@ manage_oauth2_applications=Управление приложениями OAuth2
edit_oauth2_application=Изменить приложение OAuth2
oauth2_applications_desc=Приложения OAuth2 позволяет стороннему приложению к безопасно аутентифицировать пользователей данной установки Forgejo.
remove_oauth2_application=Удаление приложения OAuth2
remove_oauth2_application_desc=Удаление приложения OAuth2 отменит доступ ко всем подписанным токенам доступа. Продолжить?
remove_oauth2_application_desc=Удаление этого приложения отменит доступ ко всем подписанным токенам доступа. Продолжить?
remove_oauth2_application_success=Приложение было успешно удалено.
create_oauth2_application=Создать новое приложение OAuth2
create_oauth2_application_button=Создать приложение
@ -1051,7 +1051,7 @@ additional_repo_units_hint_description = Показывать подсказку
pronouns_custom = Другие
pronouns = Местоимения
pronouns_unspecified = Не указаны
language.title = Язык по умолчанию
language.title = Язык интерфейса
keep_activity_private.description = Ваша <a href="%s">публичная активность</a> будет видна только вам и администраторам сервера.
language.description = Выбранный язык будет сохранён в вашей уч. записи и будет использован по умолчанию после входа.
language.localization_project = Помогите с переводом Forgejo на свой язык! <a href="%s">Подробнее</a>.
@ -1065,11 +1065,11 @@ repo_size=Размер репозитория
size_format = `%[1]s: %[2]s; %[3]s: %[4]s`
template=Шаблон
template_select=Выберите шаблон
template_helper=Сделать репозиторий шаблоном
template_helper=Пометить репозиторий как шаблон
template_description=Шаблонные репозитории дают возможность пользователям создавать новые репозитории с той же структурой каталогов, файлами и дополнительными настройками.
visibility=Видимость
visibility_description=Это увидят только владелец организации или участники при наличии прав.
visibility_helper=Сделать репозиторий приватным
visibility_description=Он будет видим только владельцу организации и её участникам при наличии прав.
visibility_helper=Частный репозиторий
visibility_helper_forced=Администратор сайта настроил параметр видимости новых репозиториев. Репозиторий приватный по умолчанию.
visibility_fork_helper=(Это изменит видимость всех ответвлений.)
clone_helper=Нужна помощь в клонировании? Посетите страницу <a target="_blank" rel="noopener noreferrer" href="%s">помощи</a>.
@ -1091,12 +1091,12 @@ repo_desc=Описание
repo_desc_helper=Добавьте краткое описание (необязательно)
repo_lang=Язык
repo_gitignore_helper=Выберите шаблоны .gitignore
repo_gitignore_helper_desc=Выберите из списка шаблонов для популярных языков , какие файлы не надо отслеживать. По умолчанию в .gitignore включены типичные артефакты, создаваемые инструментами сборки каждого языка.
repo_gitignore_helper_desc=Выберите шаблоны из списка для популярных языков. .gitignore определяет, какие файлы не надо отслеживать в проекте. По умолчанию в него включены типичные артефакты, создаваемые инструментами сборки каждого языка.
issue_labels=Метки
issue_labels_helper=Выберите набор меток
license=Лицензия
license_helper=Выберите лицензию
license_helper_desc=Лицензия определяет, что другие люди могут, а что не могут делать с вашим кодом. Не уверены, какая лицензия подходит для вашего проекта? Смотрите <a target="_blank" rel="noopener noreferrer" href="%s">Выберите лицензию.</a>
license_helper_desc=Лицензия определяет, что другие могут и не могут делать с вашим кодом. Не знаете, какая лицензия подойдёт для вашего проекта? Ознакомьтесь с <a target="_blank" rel="noopener noreferrer" href="%s">Выбором лицензии</a>.
readme=README
readme_helper=Выберите шаблон README
readme_helper_desc=Это место, где вы можете написать подробное описание вашего проекта.
@ -1719,8 +1719,8 @@ issues.due_date_form_add=Добавить срок выполнения
issues.due_date_form_edit=Изменить
issues.due_date_form_remove=Удалить
issues.due_date_not_set=Срок выполнения не установлен.
issues.due_date_added=добавлен срок выполнения %s %s
issues.due_date_modified=срок выполнения передвинут с %[2]s на %[1]s %[3]s
issues.due_date_added=добавлен срок выполнения %s, %s
issues.due_date_modified=срок выполнения изменён с %[2]s на %[1]s %[3]s
issues.due_date_remove=убран срок выполнения %s %s
issues.due_date_overdue=Просроченные
issues.due_date_invalid=Срок выполнения недействителен или находится за пределами допустимого диапазона. Пожалуйста, используйте формат «гггг-мм-дд».
@ -2463,11 +2463,11 @@ settings.archive.header=Архивация репозитория
settings.archive.success=Репозиторий был успешно архивирован.
settings.archive.error=Ошибка при попытке архивировать репозиторий. Смотрите логи для получения подробностей.
settings.archive.error_ismirror=Вы не можете поместить зеркалируемый репозиторий в архив.
settings.archive.branchsettings_unavailable=Настройки ветви недоступны, если репозиторий архивирован.
settings.archive.tagsettings_unavailable=Настройки тегов недоступны, если репозиторий архивирован.
settings.archive.branchsettings_unavailable=Настройки ветвей недоступны в архивированных репозиториях.
settings.archive.tagsettings_unavailable=Настройки тегов недоступны в архивированных репозиториях.
settings.unarchive.button=Разархивировать
settings.unarchive.header=Вернуть этот репозиторий из архива
settings.unarchive.text=Разархивирование репозитория восстановит его способность принимать изменения, а также новые задачи и запросы на слияние.
settings.unarchive.text=Разархивация репозитория восстановит возможность отправлять в него изменения, а также создавать новые задачи и запросы на слияние.
settings.unarchive.success=Репозиторий был успешно разархивирован.
settings.update_avatar_success=Картинка репозитория изменена.
settings.lfs=LFS
@ -2661,7 +2661,7 @@ error.csv.unexpected=Не удается отобразить этот файл,
error.csv.invalid_field_count=Не удается отобразить этот файл, потому что он имеет неправильное количество полей в строке %d.
mirror_address_protocol_invalid = Эта ссылка недействительна. Для зеркалирования можно использовать только расположения http(s):// и git:// .
fork_no_valid_owners = Невозможно создать ответвление этого репозитория, т.к. здесь нет действующих владельцев.
new_repo_helper = Репозиторий содержит все файлы проекта и историю изменений. Уже где-то есть репозиторий? <a href="%s">Выполните перенос.</a>
new_repo_helper = Репозиторий содержит все файлы проекта и историю изменений. Уже где-то есть репозиторий? <a href="%s">Выполните перенос</a>.
mirror_address_url_invalid = Эта ссылка недействительна. Необходимо правильно указать все части адреса.
issues.comment.blocked_by_user = Вы не можете комментировать под этой задачей, т.к. вы заблокированы владельцем репозитория или автором задачи.
pulls.blocked_by_user = Невозможно создать запрос на слияние в этом репозитории, т.к. вы заблокированы его владельцем.
@ -2707,7 +2707,7 @@ pulls.recently_pushed_new_branches = Вы отправили коммиты в
milestones.new_subheader = Этапы полезны для систематизации задач и отслеживания их выполнения.
wiki.cancel = Отмена
settings.unarchive.error = При распаковке репозитория произошла ошибка. Подробности доступны в логе.
settings.archive.mirrors_unavailable = Зеркалирование недоступно для архивированных репозиториев.
settings.archive.mirrors_unavailable = Настройки зеркалирования недоступны в архивированных репозиториях.
issues.role.contributor_helper = В репозитории присутствуют коммиты за авторством этого пользователя.
settings.wiki_rename_branch_main = Нормализовать название ветви вики
settings.wiki_rename_branch_main_notices_2 = Внутренняя ветвь вики репозитория %s будет переименована. Несохранённые изменения потребуют обновления.
@ -2849,6 +2849,8 @@ diff.git-notes.add = Добавить заметку
issues.num_reviews_few = %d рецензий
issues.num_reviews_one = %d рецензия
issues.summary_card_alt = Карточка со сводкой задачи "%s" в репозитории %s
editor.add_tmpl.filename = имя файла
settings.default_update_style_desc = Стиль обновления отстающих ветвей запросов на слияние по умолчанию.
[graphs]
component_loading_failed = Не удалось загрузить %s
@ -3314,13 +3316,13 @@ auths.invalid_openIdConnectAutoDiscoveryURL=Неверный URL для авто
config.server_config=Конфигурация сервера
config.app_name=Название сервера
config.app_ver=Версия Forgejo
config.app_url=Базовый URL Forgejo
config.app_url=Базовый URL
config.custom_conf=Путь к файлу конфигурации
config.custom_file_root_path=Путь до каталога с файлами для персонализации
config.domain=Домен сервера
config.offline_mode=Локальный режим
config.disable_router_log=Отключение журнала маршрутизатора
config.run_user=Выполнение под пользователем
config.run_user=Работа под пользователем
config.run_mode=Режим работы
config.git_version=Версия git
config.app_data_path=Путь к данным приложения
@ -3504,7 +3506,7 @@ notices.delete_success=Уведомления системы были удале
self_check.no_problem_found = Пока проблем не обнаружено.
auths.tip.gitea = Зарегистрируйте новое приложение OAuth2. Доступна инструкция: %s
auths.tips.oauth2.general.tip = При регистрации нового приложения OAuth2 ссылка обратного перенаправления должна быть:
self_check.database_fix_mysql = Пользователи MySQL и MariaDB могут исправить проблемы с сопоставлением командой "gitea doctor convert". Также можно вручную вписать "ALTER ... COLLATE ..." в SQL.
self_check.database_fix_mysql = Пользователи MySQL и MariaDB могут исправить проблемы с сопоставлением командой "forgejo doctor convert". Также можно вручную вписать "ALTER ... COLLATE ..." в SQL.
dashboard.cleanup_actions = Очистить устаревшие журналы и артефакты Действий
dashboard.sync_repo_branches = Синхронизировать ветви из Git в базу данных
assets = Кодовые объекты
@ -3696,7 +3698,7 @@ conda.install=Чтобы установить пакет с помощью Conda
container.details.type=Тип образа
container.details.platform=Платформа
container.pull=Загрузите образ из командной строки:
container.digest=Отпечаток:
container.digest=Отпечаток
container.multi_arch=ОС / архитектура
container.layers=Слои образа
container.labels=Метки
@ -3811,6 +3813,7 @@ arch.version.replaces = Заменяет
arch.version.backup = Рез. копия
arch.version.conflicts = Конфликтует с
arch.version.checkdepends = Проверочные зависимости
container.images.title = Образы
[secrets]
secrets=Секреты
@ -3954,28 +3957,28 @@ fuzzy_tooltip = Включает результаты, достаточно по
type_tooltip = Тип поиска
fuzzy = Приблизительный
match = Точный
repo_kind = Поиск репозиториев...
user_kind = Поиск пользователей...
org_kind = Поиск организаций...
team_kind = Поиск команд...
code_kind = Поиск по коду...
package_kind = Поиск пакетов...
project_kind = Поиск проектов...
branch_kind = Поиск ветвей...
commit_kind = Поиск коммитов...
repo_kind = Найти репозитории...
user_kind = Найти пользователей...
org_kind = Найти организации...
team_kind = Найти команды...
code_kind = Найти в коде...
package_kind = Найти пакеты...
project_kind = Найти проекты...
branch_kind = Найти ветви...
commit_kind = Найти коммиты...
no_results = По запросу ничего не найдено.
keyword_search_unavailable = Поиск по ключевым словам недоступен. Уточните подробности у администратора.
keyword_search_unavailable = Поиск по ключевым словам недоступен. Уточните подробности у администратора сервера.
match_tooltip = Включать только результаты, точно соответствующие запросу
code_search_unavailable = Поиск по коду сейчас недоступен. Уточните подробности у администратора.
runner_kind = Поиск исполнителей...
code_search_by_git_grep = Эти результаты получены через «git grep». Результатов может быть больше, если администратор сервера включит индексатор кода.
code_search_unavailable = Поиск в коде недоступен. Уточните подробности у администратора сервера.
runner_kind = Найти исполнителей...
code_search_by_git_grep = Эти результаты получены через «git grep». Результатов может быть больше, если на сервере будет включен индексатор кода.
exact = Точный
exact_tooltip = Включает только результаты, в точности соответствующие запросу
issue_kind = Поиск задач...
pull_kind = Поиск слияний...
issue_kind = Найти задачи...
pull_kind = Найти слияния...
union_tooltip = Включает результаты с совпавшими ключевыми словами, разделёнными пробелами
union = Обычный
milestone_kind = Поиск этапов...
milestone_kind = Найти этапы...
regexp = Регулярное выражение
regexp_tooltip = Интерпретировать поисковый запрос как регулярное выражение
@ -3986,7 +3989,7 @@ filepreview.lines = Строки с %[1]d по %[2]d в %[3]s
filepreview.truncated = Предпросмотр был обрезан
[translation_meta]
test = ура :)
test = forgejo :)
[repo.permissions]
code.write = <b>Запись:</b> отправка изменений в репозиторий, создание веток и тегов.

View file

@ -240,7 +240,7 @@ smtp_from_helper = e-poštni naslov, ki ga bo uporabljal Forgejo. Vnesite navade
[admin]
users.allow_git_hook_tooltip = Kljuke Git se izvajajo kot uporabnik operacijskega sistema, v katerem je nameščen program Forgejo, in imajo enako raven dostopa do gostitelja. Uporabniki s tem posebnim privilegijem Git Hook lahko dostopajo do vseh skladišč Forgejo in spreminjajo vse zbirke Forgejo ter podatkovno bazo, ki jo uporablja Forgejo. Posledično lahko pridobijo tudi skrbniške privilegije Forgejo.
auths.force_smtps_helper = SMTPS se vedno uporablja na vratih 465. Če želite, da se SMTPS uporablja tudi na drugih vratih, to nastavite. (V nasprotnem primeru se bo STARTTLS uporabljal na drugih vratih, če ga gostitelj podpira.)
self_check.database_fix_mysql = Uporabniki MySQL/MariaDB lahko za odpravo težav s kollacijo uporabite ukaz "gitea doctor convert", lahko pa težavo odpravite tudi z ukazom "ALTER ... COLLATE ..." SQL ročno.
self_check.database_fix_mysql = Uporabniki MySQL/MariaDB lahko za odpravo težav s kollacijo uporabite ukaz "forgejo doctor convert", lahko pa težavo odpravite tudi z ukazom "ALTER ... COLLATE ..." SQL ročno.
users.purge_help = Prisilno izbrišite uporabnika in vsa skladišča, organizacije in pakete, ki so v njegovi lasti. Izbrisani bodo tudi vsi komentarji in vprašanja, ki jih je objavil ta uporabnik.
auths.sspi_default_language_helper = Privzet jezik za uporabnike, samodejno ustvarjene z metodo avtentikacije SSPI. Pustite prazno, če želite, da se jezik zazna samodejno.
auths.restricted_filter_helper = Pustite prazno, če ne želite nastaviti nobenega uporabnika kot omejenega. Uporabite zvezdico ("*"), če želite vse uporabnike, ki se ne ujemajo z administratorskim filtrom, nastaviti kot omejene.

View file

@ -143,13 +143,13 @@ filter.clear = Очистити фільтри
filter.is_archived = Архівовано
filter = Фільтри
toggle_menu = Перемкнути видимість меню
confirm_delete_artifact = Ви впевнені, що хочете видалити артефакт "%s"?
confirm_delete_artifact = Ви впевнені, що хочете видалити артефакт «%s»?
artifacts = Артефакти
filter.not_archived = Не архівовано
filter.public = Загальнодоступні
filter.private = Приватні
more_items = Більше пунктів
remove_label_str = Видалити об'єкт "%s"
remove_label_str = Видалити об'єкт «%s»
new_repo.title = Новий репозиторій
new_migrate.title = Нова міграція
new_org.title = Нова організація
@ -334,7 +334,7 @@ password_algorithm=Алгоритм хешування пароля
config_location_hint = Ці опції налаштувань будуть збережені в:
env_config_keys = Конфігурація середовища
env_config_keys_prompt = Ці змінні середовища будуть також застосовані до вашого файлу конфігурації:
invalid_db_table = База даних "%s" недійсна: %v
invalid_db_table = База даних «%s» недійсна: %v
enable_update_checker = Увімкнути перевірку оновлень
require_db_desc = Forgejo вимагає MySQL, PostgreSQL, SQLite3 чи TiDB (протокол MySQL).
allow_only_external_registration = Дозволити реєстрацію тільки через зовнішні сервіси
@ -645,7 +645,7 @@ Pronouns = Займенники
Biography = Про себе
FullName = Повне ім'я
Website = Вебсайт
url_error = `"%s" є недійсним посиланням.`
url_error = `«%s» є недійсним посиланням.`
To = Назва гілки
Location = Розташування
AccessToken = Токен доступу
@ -749,7 +749,7 @@ emails=Адреса електронної пошти
manage_emails=Керування адресами ел. пошти
manage_themes=Тема за замовчуванням
manage_openid=Адреси OpenID
theme_desc=Ця тема буде типовою для всього сайту.
theme_desc=Ця тема буде типовою для веб-інтерфейсу, коли ви ввійдете в систему.
primary=Основний
activated=Активовано
requires_activation=Потрібна активація
@ -861,7 +861,7 @@ oauth2_applications_desc=Програми OAuth2 дають можливість
remove_oauth2_application=Видалити програму OAuth2
remove_oauth2_application_desc=Видалення програми OAuth2 скасовує доступ до всіх підписаних маркерів доступу. Продовжити?
remove_oauth2_application_success=Програму видалено.
create_oauth2_application=Створити нову програму OAuth2
create_oauth2_application=Створити новий додаток OAuth2
create_oauth2_application_button=Створити програму
oauth2_application_name=Назва програми
save_application=Зберегти
@ -965,6 +965,7 @@ comment_type_group_pull_request_push = Додані коміти
permissions_public_only = Тільки публічні
select_permissions = Виберіть дозволи
permissions_access_all = Усі (публічні, приватні й обмежені)
create_oauth2_application_success = Ви успішно створили новий додаток OAuth2.
[repo]
owner=Власник
@ -1000,7 +1001,7 @@ issue_labels=Мітки
issue_labels_helper=Виберіть набір міток
license=Ліцензія
license_helper=Виберіть файл ліцензії
license_helper_desc=Ліцензія регулює те, що інші можуть і не можуть робити з вашим кодом. Не впевнені, що саме підходить для вашого проєкту? Дивіться <a target="_blank" rel="noopener noreferrer" href="%s">Виберіть ліцензію.</a>
license_helper_desc=Ліцензія регулює те, що інші можуть і не можуть робити з вашим кодом. Не впевнені, що саме підходить для вашого проєкту? Дивіться <a target="_blank" rel="noopener noreferrer" href="%s">Виберіть ліцензію</a>.
readme=README
readme_helper=Виберіть шаблон README
readme_helper_desc=Це місце, де ви можете написати повний опис вашого проєкту.
@ -1088,7 +1089,7 @@ migrate_items_merge_requests=Запити на об'єднання
migrate_items_releases=Релізи
migrate_repo=Перенести репозиторій
migrate.clone_address=Міграція / клонувати з URL-адреси
migrate.clone_address_desc=URL-адреса HTTP(S) або Git "clone" існуючого репозиторія
migrate.clone_address_desc=URL-адреса HTTP(S) або Git «clone» існуючого репозиторію
migrate.clone_local_path=або шлях до локального серверу
migrate.permission_denied=Вам не дозволено імпортувати локальні репозиторії.
migrate.permission_denied_blocked=Ви не можете імпортувати з заборонених вузлів, будь ласка, попросіть адміністратора перевірити налаштування ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS.
@ -2060,8 +2061,8 @@ settings.archive.header=Архівувати цей репозиторій
settings.archive.success=Репозиторію успішно присвоєно статус архівного.
settings.archive.error=Сталася помилка при спробі архівувати репозиторій. Докладнішу інформацію див. у журналі.
settings.archive.error_ismirror=Неможливо архівувати дзеркальний репозиротрій.
settings.archive.branchsettings_unavailable=Параметри гілки не доступні, якщо репозиторій архівний.
settings.archive.tagsettings_unavailable=Параметри міток недоступні, якщо репозиторій архівний.
settings.archive.branchsettings_unavailable=Параметри гілки недоступні в архівованих репозиторіях.
settings.archive.tagsettings_unavailable=Параметри міток недоступні в архівованих репозиторіях.
settings.update_avatar_success=Аватар репозиторію оновлений.
settings.lfs=LFS
settings.lfs_filelist=Файли LFS, які зберігаються в цьому репозиторії
@ -2070,7 +2071,7 @@ settings.lfs_findcommits=Знайти коміти
settings.lfs_lfs_file_no_commits=Не знайдено комітів для цього файлу LFS
settings.lfs_noattribute=Цей шлях не має атрибуту блокування в гілці за замовчуванням
settings.lfs_delete=Видалити файл LFS з OID %s
settings.lfs_delete_warning=Видалення файлу LFS може спричинити помилки "Об'єкт не існує" під час перевірки. Ви впевнені?
settings.lfs_delete_warning=Видалення файлу LFS може спричинити помилки «Об'єкт не існує» під час перевірки. Ви впевнені?
settings.lfs_findpointerfiles=Знайти файли-посилання
settings.lfs_locks=Блокування
settings.lfs_invalid_locking_path=Неприпустимий шлях: %s
@ -2418,6 +2419,10 @@ contributors.contribution_type.additions = Додавання
settings.add_web_hook_desc = Інтегрувати <a target="_blank" rel="noreferrer" href="%s">%s</a> у цей репозиторій.
settings.event_wiki_desc = Вікі-сторінку створено, перейменовано, відредаговано або видалено.
settings.mirror_settings.push_mirror.copy_public_key = Копіювати публічний ключ
editor.add_tmpl.filename = назва файлу
settings.unarchive.button = Розархівувати репозиторій
object_format = Формат об'єкта
settings.archive.mirrors_unavailable = Дзеркала недоступні в архівованих репозиторіях.
[graphs]
contributors.what = внески
@ -2793,15 +2798,15 @@ auths.tips.oauth2.general=Автентифікація OAuth2
auths.tip.oauth2_provider=Постачальник OAuth2
auths.tip.bitbucket=Створіть OAuth URI на сторінці %s
auths.tip.nextcloud=`Зареєструйте нового споживача OAuth у вашому екземплярі за допомогою наступного меню "Налаштування -> Безпека -> клієнт OAuth 2.0"`
auths.tip.dropbox=Додайте новий додаток на %s
auths.tip.facebook=`Створіть новий додаток на %s і додайте модуль "Facebook Login"`
auths.tip.github=Додайте OAuth додаток на %s
auths.tip.dropbox=Створіть новий додаток на %s
auths.tip.facebook=Зареєструйте новий додаток на %s і додайте модуль «Facebook Login»
auths.tip.github=Зареєструйте новий додаток OAuth на %s
auths.tip.gitlab=Додайте новий додаток на https://gitlab.com/profile/applications
auths.tip.google_plus=Отримайте облікові дані клієнта OAuth2 в консолі Google API на сторінці %s
auths.tip.openid_connect=Використовуйте OpenID Connect Discovery URL (<server>/.well-known/openid-configuration) для автоматичної настройки входу OAuth
auths.tip.twitter=Перейдіть на %s, створіть програму і переконайтеся, що включена опція «Дозволити цю програму для входу в систему за допомогою Twitter»
auths.tip.discord=Зареєструйте новий додаток на %s
auths.tip.yandex=`Створіть нову програму в %s. Виберіть наступні дозволи з "Yandex. assport API": "Доступ до адреси електронної пошти", "Доступ до аватара" і "Доступ до імені користувача, імені та прізвища, статі"`
auths.tip.yandex=Створіть новий додаток на %s. Виберіть наступні дозволи з «Yandex. assport API»: «Доступ до адреси електронної пошти», «Доступ до аватара» і «Доступ до імені користувача, імені та прізвища, статі»
auths.tip.mastodon=Введіть URL спеціального екземпляра для екземпляра mastodon, який ви хочете автентифікувати за допомогою (або використовувати за замовчуванням)
auths.edit=Редагувати джерело автентифікації
auths.activated=Це джерело авторизації активоване
@ -2826,7 +2831,7 @@ config.disable_router_log=Вимкнути логування роутеру
config.run_user=Користувач, від якого запустити
config.run_mode=Режим виконання
config.git_version=Версія Git
config.repo_root_path=Кореневий шлях репозиторія
config.repo_root_path=Шлях до кореня репозиторію
config.lfs_root_path=Кореневий шлях LFS
config.log_file_root_path=Шлях до лог файлу
config.script_type=Тип скрипта
@ -2908,7 +2913,7 @@ config.cache_item_ttl=Час зберігання даних кешу
config.session_config=Конфігурація сесії
config.session_provider=Провайдер сесії
config.provider_config=Конфігурація постачальника
config.cookie_name=Ім'я файлу cookie
config.cookie_name=Назва файлу cookie
config.gc_interval_time=Інтервал запуску збирача сміття (GC)
config.session_life_time=Час життя сесії
config.https_only=Тільки HTTPS
@ -3016,6 +3021,8 @@ monitor.queue.settings.desc = Пули динамічно зростають у
monitor.queue.settings.remove_all_items_done = Усі елементи в черзі видалено.
monitor.queue.settings.remove_all_items = Видалити всі
config.app_slogan = Гасло екземпляра
auths.tip.gitea = Зареєструйте новий додаток OAuth. Інструкцію можна знайти на %s
auths.tip.gitlab_new = Зареєструйте новий додаток на %s
[action]
@ -3184,6 +3191,10 @@ settings.delete.error = Не вдалося видалити пакунок.
settings.delete.success = Пакунок видалено.
npm.dependencies = Залежності
settings.delete = Видалити пакунок
npm.dependencies.development = Залежності розробки
rubygems.dependencies.development = Залежності розробки
npm.dependencies.optional = Необов'язкові залежності
container.images.title = Образи
[secrets]
deletion = Видалити секрет
@ -3299,7 +3310,7 @@ milestone_kind = Шукати віхи...
commit_kind = Шукати коментарі...
no_results = Не знайдено відповідних результатів.
keyword_search_unavailable = Пошук за ключовими словами наразі недоступний. Будь ласка, зв'яжіться з адміністратором сайту.
code_search_by_git_grep = Поточні результати пошуку коду надаються з "git grep". Тут можуть бути кращі результати, якщо адміністратор сайту ввімкнув індексацію коду.
code_search_by_git_grep = Поточні результати пошуку коду надаються з «git grep». Тут можуть бути кращі результати, якщо адміністратор сайту ввімкнув індексацію коду.
package_kind = Шукати пакунки...
project_kind = Шукати проєкти...
branch_kind = Шукати гілки...

View file

@ -812,7 +812,7 @@ manage_emails=管理邮箱地址
manage_themes=默认主题
manage_openid=OpenID 地址
email_desc=您的主要电子邮件地址将用于通知、密码恢复基于网页界面的Git操作(只要它不是设置为隐藏的)。
theme_desc=这将是您在整个网站上的默认主题
theme_desc=此主题将在您已登录时被用于网页界面
primary=主要
activated=已激活
requires_activation=需要激活
@ -1056,7 +1056,7 @@ language.description = 此语言将保存到您的账号中,并在您登录后
language.localization_project = 帮助我们将 Forgejo 翻译成您的语言!<a href="%s">了解更多</a>。
[repo]
new_repo_helper=代码仓库包含了所有的项目文件,包括版本历史记录。已经在其他地方托管了?<a href="%s">迁移仓库</a>
new_repo_helper=代码仓库包含了所有的项目文件,包括版本历史记录。已经在其他地方托管了?<a href="%s">迁移仓库</a>
owner=拥有者
owner_helper=由于最大仓库数量限制,一些组织可能不会显示在下拉列表中。
repo_name=仓库名称
@ -1096,7 +1096,7 @@ issue_labels=标签
issue_labels_helper=选择标签集
license=授权许可
license_helper=选择授权许可文件
license_helper_desc=许可证说明了其他人可以和不可以用您的代码做什么。不确定哪一个适合你的项目?见 <a target="_blank" rel="noopener noreferrer" href="%s">选择一个许可证</a>
license_helper_desc=许可证说明了其他人可以和不可以用您的代码做什么。不确定哪一个适合你的项目?见 <a target="_blank" rel="noopener noreferrer" href="%s">选择一个许可证</a>
object_format = 对象格式
object_format_helper = 仓库的对象格式一旦设置无法更改。SHA1 的兼容性最强。
readme=自述
@ -1624,7 +1624,7 @@ issues.reopened_at=`重新打开此问题 <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.commit_ref_at=`于 <a id="%[1]s" href="#%[1]s">%[2]s</a> 在代码提交中引用了该工单`
issues.ref_issue_from=`<a href="%[3]s">引用了工单 %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.ref_pull_from=`<a href="%[3]s">引用了合并请求 %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.ref_closing_from=`于 <a id="%[1]s" href="#%[1]s">%[2]s</a> <a href="%[3]s">引用了合并请求 %[4]s 将关闭此工单</a>`
issues.ref_closing_from=`于 <a id="%[1]s" href="#%[1]s">%[2]s</a> <a href="%[3]s">从合并请求 %[4]s引用了此工单将关闭此工单</a>`
issues.ref_reopening_from=`于 <a id="%[1]s" href="#%[1]s">%[2]s</a> <a href="%[3]s"> 引用了合并请求 %[4]s 将重新讨论此工单</a> `
issues.ref_closed_from=`<a href="%[3]s">关闭了这个工单 %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.ref_reopened_from=`<a href="%[3]s">重新打开这个工单 %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
@ -1744,7 +1744,7 @@ issues.due_date_remove=于 %[2]s 删除了到期时间 %[1]s
issues.due_date_overdue=超期
issues.due_date_invalid=到期日期无效或超出范围。请使用“yyyy-mm-dd”格式。
issues.dependency.title=依赖工单
issues.dependency.issue_no_dependencies=没有设置依赖项。
issues.dependency.issue_no_dependencies=设置依赖项。
issues.dependency.pr_no_dependencies=没有设置依赖项。
issues.dependency.no_permission_1=您没有读取 %d 依赖关系的权限
issues.dependency.no_permission_n=您没有读取 %d 依赖关系的权限
@ -1782,7 +1782,7 @@ issues.review.dismissed=于 %[2]s 取消了 %[1]s 的评审
issues.review.dismissed_label=已取消
issues.review.left_comment=留下了一条评论
issues.review.content.empty=您需要留下一个注释,表明需要的更改。
issues.review.reject=于 %s 请求
issues.review.reject=于 %s 请求
issues.review.wait=于 %s 请求评审
issues.review.add_review_request=于 %[2]s 请求 %[1]s 评审
issues.review.remove_review_request=于 %[2]s 取消对 %[1]s 的评审请求
@ -1799,8 +1799,8 @@ issues.review.show_outdated=显示过时的
issues.review.hide_outdated=隐藏过时的
issues.review.show_resolved=显示已解决的
issues.review.hide_resolved=隐藏已解决的
issues.review.resolve_conversation=已解决问题
issues.review.un_resolve_conversation=未解决问题
issues.review.resolve_conversation=已解决
issues.review.un_resolve_conversation=未解决
issues.review.resolved_by=标记问题为已解决
issues.assignee.error=因为未知原因,并非所有的指派都成功。
issues.reference_issue.body=内容
@ -1810,7 +1810,7 @@ issues.content_history.created=创建于
issues.content_history.delete_from_history=从历史记录中删除
issues.content_history.delete_from_history_confirm=从历史记录中删除吗?
issues.content_history.options=选项
issues.reference_link=参考%s
issues.reference_link=引用%s
compare.compare_base=基准
compare.compare_head=比较
@ -1849,7 +1849,7 @@ pulls.create=创建合并请求
pulls.title_desc_few=请求将 %[1]d 次代码提交从 <code>%[2]s</code> 合并至 <code id="%[4]s">%[3]s</code>
pulls.merged_title_desc_few=于 %[4]s 将 %[1]d 次代码提交从 <code>%[2]s</code>合并至 <code>%[3]s</code>
pulls.change_target_branch_at=将目标分支从 <b>%s</b> 更改为 <b>%s</b> %s
pulls.tab_conversation=对话内容
pulls.tab_conversation=对话
pulls.tab_commits=代码提交
pulls.tab_files=文件变动
pulls.reopen_to_merge=请重新创建此合并请求。
@ -1872,7 +1872,7 @@ pulls.is_ancestor=此分支已经包含在目标分支中,没有更改可以
pulls.is_empty=此分支上的更改已经在目标分支上。这将是一个空提交。
pulls.required_status_check_failed=一些必要的检查没有成功。
pulls.required_status_check_missing=缺少一些必要的检查。
pulls.required_status_check_administrator=作为管理员,您仍可合并此合并请求
pulls.required_status_check_administrator=作为管理员,您仍可合并此合并请求
pulls.blocked_by_approvals=此合并请求当前还没有通过审批。已获取审批数%d个共需要审批数%d个。
pulls.blocked_by_rejection=此合并请求有官方评审员请求的更改。
pulls.blocked_by_official_review_requests=此合并请求需要一名或多名评审员审阅批准。
@ -1881,7 +1881,7 @@ pulls.blocked_by_changed_protected_files_1=此合并请求因修改了下列被
pulls.blocked_by_changed_protected_files_n=此合并请求因修改了下列被保护的文件而被阻止:
pulls.can_auto_merge_desc=该合并请求可以进行自动合并操作。
pulls.cannot_auto_merge_desc=该合并请求存在冲突,无法进行自动合并操作。
pulls.cannot_auto_merge_helper=手动合并解决冲突
pulls.cannot_auto_merge_helper=手动合并解决冲突
pulls.num_conflicting_files_1=%d 个冲突文件
pulls.num_conflicting_files_n=%d 个冲突文件
pulls.approve_count_1=%d 项批准
@ -2012,7 +2012,7 @@ ext_wiki.desc=链接到外部 wiki。
wiki=百科
wiki.welcome=欢迎来到百科。
wiki.welcome_desc=百科允许你撰写并与协作者分享文档。
wiki.desc=撰写和与协作者分享文档
wiki.desc=撰写并与协作者共享文档。
wiki.create_first_page=创建第一个页面
wiki.page=页面
wiki.filter_page=过滤页面
@ -2169,16 +2169,16 @@ settings.wiki_desc=启用仓库百科
settings.use_internal_wiki=使用内置百科
settings.use_external_wiki=使用外部百科
settings.external_wiki_url=外部百科链接
settings.external_wiki_url_error=外部百科链接无效
settings.external_wiki_url_error=外部百科链接不是有效的 URL。
settings.external_wiki_url_desc=当点击百科标签时访问者将被重定向到外部百科系统的URL。
settings.issues_desc=启用仓库工单系统
settings.use_internal_issue_tracker=使用内置的工单系统
settings.use_external_issue_tracker=使用外部的工单系统
settings.external_tracker_url=外部工单系统 URL
settings.external_tracker_url_error=外部百科链接无效
settings.external_tracker_url_error=外部百科链接无效
settings.external_tracker_url_desc=当点击工单标签时访问者将被重定向到外部工单系统的URL。
settings.tracker_url_format=外部工单系统的 URL 格式
settings.tracker_url_format_error=外部工单链接无效
settings.tracker_url_format_error=外部工单追踪器链接无效
settings.tracker_issue_style=外部工单系统的编号格式
settings.tracker_issue_style.numeric=纯数字形式
settings.tracker_issue_style.alphanumeric=英文字母数字组合形式
@ -2255,7 +2255,7 @@ settings.confirm_wiki_delete=删除百科数据
settings.wiki_deletion_success=已成功删除仓库百科数据。
settings.delete=删除本仓库
settings.delete_desc=删除仓库是永久性的, 无法撤消。
settings.delete_notices_1=- 此操作 <strong>不可</strong> 被回滚。
settings.delete_notices_1=- 此操作<strong>不可</strong>被回滚。
settings.delete_notices_2=- 此操作将永久删除仓库 <strong>%s</strong>,包括 Git 数据、 工单、评论、百科和协作者的操作权限。
settings.delete_notices_fork_1=- 在此仓库删除后,它的派生仓库将变成独立仓库。
settings.deletion_success=仓库已被删除。
@ -2321,7 +2321,7 @@ settings.event_send_everything=所有事件
settings.event_choose=自定义事件…
settings.event_header_repository=仓库事件
settings.event_create=创建
settings.event_create_desc=创建分支或标签
settings.event_create_desc=创建分支或标签
settings.event_delete=刪除
settings.event_delete_desc=分支或标签已删除。
settings.event_fork=派生
@ -2331,9 +2331,9 @@ settings.event_wiki_desc=创建、重命名、编辑或删除了百科页面。
settings.event_release=版本发布
settings.event_release_desc=发布、更新或删除版本时。
settings.event_push=推送
settings.event_push_desc=Git 仓库推送
settings.event_push_desc=推送到 Git 仓库。
settings.event_repository=仓库
settings.event_repository_desc=创建或删除仓库
settings.event_repository_desc=创建或删除仓库
settings.event_header_issue=工单事件
settings.event_issues=修改
settings.event_issues_desc=工单已打开、已关闭、已重新打开或已编辑。
@ -2511,9 +2511,9 @@ settings.archive.text=归档仓库将使其完全只读。它将在首页隐藏
settings.archive.success=仓库已成功归档。
settings.archive.error=仓库在归档时出现异常。请通过日志获取详细信息。
settings.archive.error_ismirror=不能归档镜像仓库。
settings.archive.branchsettings_unavailable=已归档仓库无法进行分支设置
settings.archive.tagsettings_unavailable=已归档仓库的Git标签设置不可用。
settings.archive.mirrors_unavailable = 不能镜像已归档的仓库。
settings.archive.branchsettings_unavailable=分支设置对已归档的仓库不可用
settings.archive.tagsettings_unavailable=标签设置对已归档仓库不可用。
settings.archive.mirrors_unavailable = 镜像已归档的仓库不可用
settings.unarchive.button=撤销仓库归档
settings.unarchive.header=撤销此仓库归档
settings.unarchive.text=撤销归档将恢复仓库接收提交、推送,以及新工单和合并请求的能力。
@ -2598,7 +2598,7 @@ diff.review.placeholder=评审意见
diff.review.comment=评论
diff.review.approve=批准
diff.review.self_reject=合并请求作者不能对自己的合并请求更改
diff.review.reject=请求
diff.review.reject=请求
diff.review.self_approve=合并请求作者不能批准自己的合并请求
diff.committed_by=提交者
diff.protected=受保护的
@ -2750,12 +2750,12 @@ pulls.made_using_agit = AGit
activity.navbar.pulse = 动态
activity.navbar.code_frequency = 代码频率
activity.navbar.recent_commits = 近期提交
pulls.agit_explanation = 该合并请求是用 AGit 创建的。AGit 是一种可以让贡献者直接通过 “git push” 提出更改代码而不需要派生或建立新分支
pulls.agit_explanation = 该合并请求是用 AGit 工作流创建的。使用 AGit贡献者无需派生或创建分支就可以直接通过 “git push” 提出更改代码
error.broken_git_hook = 该仓库的 Git 钩子似乎已经损坏,请按照 <a target="_blank" rel="noreferrer" href="%s">此文档</a>来修复这些问题,然后推送一些提交来刷新状态。
pulls.merged_title_desc_one = 已将来自 <code>%[2]s</code> 的 %[1]d 提交合并入 <code>%[3]s</code> %[4]s
commits.search_branch = 此分支
open_with_editor = 使用 %s 打开
pulls.title_desc_one = 想要将来自 <code>%[2]s</code> 的 %[1]d 提交合并到 <code id="%[4]s">%[3]s</code>
pulls.title_desc_one = 想要将来自 <code>%[2]s</code> 的 %[1]d 提交合并到 <code id="%[4]s">%[3]s</code>
settings.rename_branch_failed_protected = 无法重命名受保护的分支 %s。
stars = 点赞
settings.confirmation_string = 确认输入
@ -2766,7 +2766,7 @@ n_branch_few = %s 分支
n_tag_one = %s 标签
n_tag_few = %s 标签
editor.commit_id_not_matching = 您在编辑文件时该文件已被更改。请提交到一个新的分支,然后再将这个新的分支合并回当前分支。
issues.num_participants_one = %d 参与者
issues.num_participants_one = %d 参与者
issues.archived_label_description = (已归档)%s
editor.push_out_of_date = 推送似乎已过期。
settings.enforce_on_admins = 对仓库的管理员适用该规则
@ -2848,6 +2848,7 @@ diff.git-notes.remove-body = 此注释将被移除。
issues.num_reviews_one = %d 评审
issues.num_reviews_few = %d 评审
issues.summary_card_alt = 仓库 %[2]s 中标题为 %[1]s 的工单的摘要卡片
editor.add_tmpl.filename = 文件名
[graphs]
component_loading=正在加载 %s...
@ -3518,7 +3519,7 @@ self_check.no_problem_found=尚未发现问题。
self_check.database_collation_mismatch=期望数据库使用的校验方式:%s
self_check.database_collation_case_insensitive=数据库正在使用一个校验 %s, 这是一个不敏感的校验. 虽然Gitea可以与它合作但可能有一些罕见的情况不如预期的那样起作用。
self_check.database_inconsistent_collation_columns=数据库正在使用%s的排序规则但是这些列使用了不匹配的排序规则。这可能会造成一些意外问题。
self_check.database_fix_mysql=对于MySQL/MariaDB用户您可以使用“gitea doctor convert”命令来解决校验问题。 或者您也可以通过 "ALTER ... COLLATE ..." 这样的SQL 来手动解决这个问题。
self_check.database_fix_mysql=对于 MySQL/MariaDB 用户您可以使用“forgejo doctor convert”命令来修复排序规则问题或者您也可以手动通过“ALTER ... COLLATE ...” SQL 修复该问题。
auths.tips.gmail_settings = Gmail 设置:
auths.tip.gitlab_new = 在 %s 上注册新应用
config_settings = 设置
@ -3595,7 +3596,7 @@ raw_seconds=秒
raw_minutes=分钟
[dropzone]
default_message=动文件或者点击此处上传。
default_message=放文件或点击此处上传。
invalid_input_type=您不能上传该类型的文件
file_too_big=文件体积({{filesize}} MB超过了最大允许体积{{maxFilesize}} MB
remove_file=移除文件
@ -3684,9 +3685,9 @@ conda.install=要使用 Conda 安装软件包,请运行以下命令:
container.details.type=镜像类型
container.details.platform=平台
container.pull=从命令行拉取镜像:
container.digest=摘要
container.digest=摘要
container.multi_arch=操作系统 / 架构
container.layers=镜像
container.layers=镜像
container.labels=标签
container.labels.key=
container.labels.value=
@ -3715,7 +3716,7 @@ npm.install=要使用 npm 安装软件包,请运行以下命令:
npm.install2=或将其添加到 package.json 文件:
npm.dependencies=依赖项
npm.dependencies.development=开发依赖
npm.dependencies.peer=Peer 依赖
npm.dependencies.peer=同等依赖
npm.dependencies.optional=可选依赖
npm.details.tag=标签
pub.install=要使用 Dart 安装软件包,请运行以下命令:
@ -3799,6 +3800,7 @@ arch.version.replaces = 替换
arch.version.backup = 备份
arch.version.checkdepends = 检查依赖
arch.version.makedepends = 编译依赖
container.images.title = 镜像
[secrets]
secrets=密钥

1427
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -55,7 +55,7 @@
"vue-loader": "17.4.2",
"vue3-calendar-heatmap": "2.0.5",
"webpack": "5.97.1",
"webpack-cli": "5.1.4",
"webpack-cli": "6.0.1",
"wrap-ansi": "9.0.0"
},
"devDependencies": {
@ -65,15 +65,15 @@
"@stoplight/spectral-cli": "6.14.2",
"@stylistic/eslint-plugin-js": "2.12.1",
"@stylistic/stylelint-plugin": "3.1.1",
"@typescript-eslint/parser": "8.18.1",
"@typescript-eslint/parser": "8.18.2",
"@vitejs/plugin-vue": "5.1.5",
"@vitest/coverage-v8": "2.1.8",
"@vitest/eslint-plugin": "1.1.16",
"@vitest/eslint-plugin": "1.1.20",
"@vue/test-utils": "2.4.6",
"eslint": "9.17.0",
"eslint-import-resolver-typescript": "3.7.0",
"eslint-plugin-array-func": "5.0.2",
"eslint-plugin-import-x": "4.5.1",
"eslint-plugin-import-x": "4.6.1",
"eslint-plugin-no-jquery": "3.1.0",
"eslint-plugin-no-use-extend-native": "0.7.2",
"eslint-plugin-playwright": "2.1.0",
@ -95,7 +95,7 @@
"stylelint-value-no-unknown-custom-properties": "6.0.1",
"svgo": "3.2.0",
"typescript": "5.7.2",
"typescript-eslint": "8.18.1",
"typescript-eslint": "8.18.2",
"vite-string-plugin": "1.3.4",
"vitest": "2.1.8"
},

79
poetry.lock generated
View file

@ -2,13 +2,13 @@
[[package]]
name = "click"
version = "8.1.7"
version = "8.1.8"
description = "Composable command line interface toolkit"
optional = false
python-versions = ">=3.7"
files = [
{file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"},
{file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"},
{file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"},
{file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"},
]
[package.dependencies]
@ -59,33 +59,33 @@ six = ">=1.13.0"
[[package]]
name = "djlint"
version = "1.36.3"
version = "1.36.4"
description = "HTML Template Linter and Formatter"
optional = false
python-versions = ">=3.9"
files = [
{file = "djlint-1.36.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2ae7c620b58e16d6bf003bd7de3f71376a7a3daa79dc02e77f3726d5a75243f2"},
{file = "djlint-1.36.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e155ce0970d4a28d0a2e9f2e106733a2ad05910eee90e056b056d48049e4a97b"},
{file = "djlint-1.36.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e8bb0406e60cc696806aa6226df137618f3889c72f2dbdfa76c908c99151579"},
{file = "djlint-1.36.3-cp310-cp310-win_amd64.whl", hash = "sha256:76d32faf988ad58ef2e7a11d04046fc984b98391761bf1b61f9a6044da53d414"},
{file = "djlint-1.36.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:32f7a5834000fff22e94d1d35f95aaf2e06f2af2cae18af0ed2a4e215d60e730"},
{file = "djlint-1.36.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3eb1b9c0be499e63e8822a051e7e55f188ff1ab8172a85d338a8ae21c872060e"},
{file = "djlint-1.36.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c2e0dd1f26eb472b8c84eb70d6482877b6497a1fd031d7534864088f016d5ea"},
{file = "djlint-1.36.3-cp311-cp311-win_amd64.whl", hash = "sha256:a06b531ab9d049c46ad4d2365d1857004a1a9dd0c23c8eae94aa0d233c6ec00d"},
{file = "djlint-1.36.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e66361a865e5e5a4bbcb40f56af7f256fd02cbf9d48b763a40172749cc294084"},
{file = "djlint-1.36.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:36e102b80d83e9ac2e6be9a9ded32fb925945f6dbc7a7156e4415de1b0aa0dba"},
{file = "djlint-1.36.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ac4b7370d80bd82281e57a470de8923ac494ffb571b89d8787cef57c738c69a"},
{file = "djlint-1.36.3-cp312-cp312-win_amd64.whl", hash = "sha256:107cc56bbef13d60cc0ae774a4d52881bf98e37c02412e573827a3e549217e3a"},
{file = "djlint-1.36.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2a9f51971d6e63c41ea9b3831c928e1f21ae6fe57e87a3452cfe672d10232433"},
{file = "djlint-1.36.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:080c98714b55d8f0fef5c42beaee8247ebb2e3d46b0936473bd6c47808bb6302"},
{file = "djlint-1.36.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f65a80e0b5cb13d357ea51ca6570b34c2d9d18974c1e57142de760ea27d49ed0"},
{file = "djlint-1.36.3-cp313-cp313-win_amd64.whl", hash = "sha256:95ef6b67ef7f2b90d9434bba37d572031079001dc8524add85c00ef0386bda1e"},
{file = "djlint-1.36.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8e2317a32094d525bc41cd11c8dc064bf38d1b442c99cc3f7c4a2616b5e6ce6e"},
{file = "djlint-1.36.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e82266c28793cd15f97b93535d72bfbc77306eaaf6b210dd90910383a814ee6c"},
{file = "djlint-1.36.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01b2101c2d1b079e8d545e6d9d03487fcca14d2371e44cbfdedee15b0bf4567c"},
{file = "djlint-1.36.3-cp39-cp39-win_amd64.whl", hash = "sha256:15cde63ef28beb5194ff4137883025f125676ece1b574b64a3e1c6daed734639"},
{file = "djlint-1.36.3-py3-none-any.whl", hash = "sha256:0c05cd5b76785de2c41a2420c06ffd112800bfc0f9c0f399cc7cea7c42557f4c"},
{file = "djlint-1.36.3.tar.gz", hash = "sha256:d85735da34bc7ac93ad8ef9b4822cc2a23d5f0ce33f25438737b8dca1d404f78"},
{file = "djlint-1.36.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a2dfb60883ceb92465201bfd392291a7597c6752baede6fbb6f1980cac8d6c5c"},
{file = "djlint-1.36.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4bc6a1320c0030244b530ac200642f883d3daa451a115920ef3d56d08b644292"},
{file = "djlint-1.36.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3164a048c7bb0baf042387b1e33f9bbbf99d90d1337bb4c3d66eb0f96f5400a1"},
{file = "djlint-1.36.4-cp310-cp310-win_amd64.whl", hash = "sha256:3196d5277da5934962d67ad6c33a948ba77a7b6eadf064648bef6ee5f216b03c"},
{file = "djlint-1.36.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d68da0ed10ee9ca1e32e225cbb8e9b98bf7e6f8b48a8e4836117b6605b88cc7"},
{file = "djlint-1.36.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c0478d5392247f1e6ee29220bbdbf7fb4e1bc0e7e83d291fda6fb926c1787ba7"},
{file = "djlint-1.36.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:962f7b83aee166e499eff916d631c6dde7f1447d7610785a60ed2a75a5763483"},
{file = "djlint-1.36.4-cp311-cp311-win_amd64.whl", hash = "sha256:53cbc450aa425c832f09bc453b8a94a039d147b096740df54a3547fada77ed08"},
{file = "djlint-1.36.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ff9faffd7d43ac20467493fa71d5355b5b330a00ade1c4d1e859022f4195223b"},
{file = "djlint-1.36.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:79489e262b5ac23a8dfb7ca37f1eea979674cfc2d2644f7061d95bea12c38f7e"},
{file = "djlint-1.36.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e58c5fa8c6477144a0be0a87273706a059e6dd0d6efae01146ae8c29cdfca675"},
{file = "djlint-1.36.4-cp312-cp312-win_amd64.whl", hash = "sha256:bb6903777bf3124f5efedcddf1f4716aef097a7ec4223fc0fa54b865829a6e08"},
{file = "djlint-1.36.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ead475013bcac46095b1bbc8cf97ed2f06e83422335734363f8a76b4ba7e47c2"},
{file = "djlint-1.36.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6c601dfa68ea253311deb4a29a7362b7a64933bdfcfb5a06618f3e70ad1fa835"},
{file = "djlint-1.36.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bda5014f295002363381969864addeb2db13955f1b26e772657c3b273ed7809f"},
{file = "djlint-1.36.4-cp313-cp313-win_amd64.whl", hash = "sha256:16ce37e085afe5a30953b2bd87cbe34c37843d94c701fc68a2dda06c1e428ff4"},
{file = "djlint-1.36.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:89678661888c03d7bc6cadd75af69db29962b5ecbf93a81518262f5c48329f04"},
{file = "djlint-1.36.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5b01a98df3e1ab89a552793590875bc6e954cad661a9304057db75363d519fa0"},
{file = "djlint-1.36.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dabbb4f7b93223d471d09ae34ed515fef98b2233cbca2449ad117416c44b1351"},
{file = "djlint-1.36.4-cp39-cp39-win_amd64.whl", hash = "sha256:7a483390d17e44df5bc23dcea29bdf6b63f3ed8b4731d844773a4829af4f5e0b"},
{file = "djlint-1.36.4-py3-none-any.whl", hash = "sha256:e9699b8ac3057a6ed04fb90835b89bee954ed1959c01541ce4f8f729c938afdd"},
{file = "djlint-1.36.4.tar.gz", hash = "sha256:17254f218b46fe5a714b224c85074c099bcb74e3b2e1f15c2ddc2cf415a408a1"},
]
[package.dependencies]
@ -99,15 +99,17 @@ pyyaml = ">=6"
regex = ">=2023"
tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""}
tqdm = ">=4.62.2"
typing-extensions = {version = ">=3.6.6", markers = "python_version < \"3.11\""}
[[package]]
name = "editorconfig"
version = "0.12.4"
version = "0.17.0"
description = "EditorConfig File Locator and Interpreter for Python"
optional = false
python-versions = "*"
files = [
{file = "EditorConfig-0.12.4.tar.gz", hash = "sha256:24857fa1793917dd9ccf0c7810a07e05404ce9b823521c7dce22a4fb5d125f80"},
{file = "EditorConfig-0.17.0-py3-none-any.whl", hash = "sha256:fe491719c5f65959ec00b167d07740e7ffec9a3f362038c72b289330b9991dfc"},
{file = "editorconfig-0.17.0.tar.gz", hash = "sha256:8739052279699840065d3a9f5c125d7d5a98daeefe53b0e5274261d77cb49aa2"},
]
[[package]]
@ -316,13 +318,13 @@ files = [
[[package]]
name = "six"
version = "1.16.0"
version = "1.17.0"
description = "Python 2 and 3 compatibility utilities"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
files = [
{file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
{file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
{file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"},
{file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"},
]
[[package]]
@ -387,6 +389,17 @@ notebook = ["ipywidgets (>=6)"]
slack = ["slack-sdk"]
telegram = ["requests"]
[[package]]
name = "typing-extensions"
version = "4.12.2"
description = "Backported and Experimental Type Hints for Python 3.8+"
optional = false
python-versions = ">=3.8"
files = [
{file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"},
{file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"},
]
[[package]]
name = "yamllint"
version = "1.35.1"
@ -408,4 +421,4 @@ dev = ["doc8", "flake8", "flake8-import-order", "rstcheck[sphinx]", "sphinx"]
[metadata]
lock-version = "2.0"
python-versions = "^3.10"
content-hash = "23017e1bfd215dcbb046aaf68d4d2668737e17c687e6655be46e9bfd9a3df4c5"
content-hash = "64588702d556674c109df1bacaac08353a40f0863e7e72513d22f197f0c340c4"

View file

@ -5,7 +5,7 @@ package-mode = false
python = "^3.10"
[tool.poetry.group.dev.dependencies]
djlint = "1.36.3"
djlint = "1.36.4"
yamllint = "1.35.1"
codespell = "^2.2.6"

View file

View file

@ -9,8 +9,8 @@
"baseBranches": [
"$default",
"/^v7\\.\\d+/forgejo$/",
"/^v9\\.\\d+/forgejo$/",
"/^v10\\.\\d+/forgejo$/"
"/^v10\\.\\d+/forgejo$/",
"/^v11\\.\\d+/forgejo$/"
],
"postUpdateOptions": ["gomodTidy", "gomodUpdateImportPaths", "npmDedupe"],
"prConcurrentLimit": 10,

View file

@ -937,6 +937,7 @@ func updateRepoUnits(ctx *context.APIContext, opts api.EditRepoOption) error {
AllowRebaseUpdate: true,
DefaultDeleteBranchAfterMerge: false,
DefaultMergeStyle: repo_model.MergeStyleMerge,
DefaultUpdateStyle: repo_model.UpdateStyleMerge,
DefaultAllowMaintainerEdit: false,
}
} else {
@ -976,6 +977,9 @@ func updateRepoUnits(ctx *context.APIContext, opts api.EditRepoOption) error {
if opts.DefaultMergeStyle != nil {
config.DefaultMergeStyle = repo_model.MergeStyle(*opts.DefaultMergeStyle)
}
if opts.DefaultUpdateStyle != nil {
config.DefaultUpdateStyle = repo_model.UpdateStyle(*opts.DefaultUpdateStyle)
}
if opts.DefaultAllowMaintainerEdit != nil {
config.DefaultAllowMaintainerEdit = *opts.DefaultAllowMaintainerEdit
}

View file

@ -35,6 +35,7 @@ func Code(ctx *context.Context) {
language := ctx.FormTrim("l")
keyword := ctx.FormTrim("q")
path := ctx.FormTrim("path")
isFuzzy := ctx.FormOptionalBool("fuzzy").ValueOrDefault(true)
if mode := ctx.FormTrim("mode"); len(mode) > 0 {
@ -91,6 +92,7 @@ func Code(ctx *context.Context) {
Keyword: keyword,
IsKeywordFuzzy: isFuzzy,
Language: language,
Filename: path,
Paginator: &db.ListOptions{
Page: page,
PageSize: setting.UI.RepoSearchPagingNum,

View file

@ -5,6 +5,7 @@ package actions
import (
"bytes"
stdCtx "context"
"fmt"
"net/http"
"slices"
@ -224,7 +225,7 @@ func List(ctx *context.Context) {
return
}
if err := loadIsRefDeleted(ctx, runs); err != nil {
if err := loadIsRefDeleted(ctx, ctx.Repo.Repository.ID, runs); err != nil {
log.Error("LoadIsRefDeleted", err)
}
@ -254,7 +255,7 @@ func List(ctx *context.Context) {
// loadIsRefDeleted loads the IsRefDeleted field for each run in the list.
// TODO: move this function to models/actions/run_list.go but now it will result in a circular import.
func loadIsRefDeleted(ctx *context.Context, runs actions_model.RunList) error {
func loadIsRefDeleted(ctx stdCtx.Context, repoID int64, runs actions_model.RunList) error {
branches := make(container.Set[string], len(runs))
for _, run := range runs {
refName := git.RefName(run.Ref)
@ -266,14 +267,14 @@ func loadIsRefDeleted(ctx *context.Context, runs actions_model.RunList) error {
return nil
}
branchInfos, err := git_model.GetBranches(ctx, ctx.Repo.Repository.ID, branches.Values(), false)
branchInfos, err := git_model.GetBranches(ctx, repoID, branches.Values(), false)
if err != nil {
return err
}
branchSet := git_model.BranchesToNamesSet(branchInfos)
for _, run := range runs {
refName := git.RefName(run.Ref)
if refName.IsBranch() && !branchSet.Contains(run.Ref) {
if refName.IsBranch() && !branchSet.Contains(refName.ShortName()) {
run.IsRefDeleted = true
}
}

View file

@ -0,0 +1,33 @@
// Copyright 2022 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package actions
import (
"testing"
actions_model "code.gitea.io/gitea/models/actions"
"code.gitea.io/gitea/models/db"
unittest "code.gitea.io/gitea/models/unittest"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func Test_loadIsRefDeleted(t *testing.T) {
unittest.PrepareTestEnv(t)
runs, total, err := db.FindAndCount[actions_model.ActionRun](db.DefaultContext,
actions_model.FindRunOptions{RepoID: 4, Ref: "refs/heads/test"})
require.NoError(t, err)
assert.Len(t, runs, 1)
assert.EqualValues(t, 1, total)
for _, run := range runs {
assert.False(t, run.IsRefDeleted)
}
require.NoError(t, loadIsRefDeleted(db.DefaultContext, 4, runs))
for _, run := range runs {
assert.True(t, run.IsRefDeleted)
}
}

View file

@ -0,0 +1,14 @@
// Copyright 2024 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package actions
import (
"testing"
"code.gitea.io/gitea/models/unittest"
)
func TestMain(m *testing.M) {
unittest.MainTest(m)
}

View file

@ -1912,6 +1912,21 @@ func ViewIssue(ctx *context.Context) {
ctx.Data["MergeStyle"] = mergeStyle
var updateStyle repo_model.UpdateStyle
// Check correct values and select default
if ms, ok := ctx.Data["UpdateStyle"].(repo_model.UpdateStyle); !ok ||
!prConfig.IsUpdateStyleAllowed(ms) {
defaultUpdateStyle := prConfig.GetDefaultUpdateStyle()
if prConfig.IsUpdateStyleAllowed(defaultUpdateStyle) && !ok {
updateStyle = defaultUpdateStyle
} else if prConfig.AllowMerge {
updateStyle = repo_model.UpdateStyleMerge
} else if prConfig.AllowRebase {
updateStyle = repo_model.UpdateStyleRebase
}
}
ctx.Data["UpdateStyle"] = updateStyle
defaultMergeMessage, defaultMergeBody, err := pull_service.GetDefaultMergeMessage(ctx, ctx.Repo.GitRepo, pull, mergeStyle)
if err != nil {
ctx.ServerError("GetDefaultMergeMessage", err)

View file

@ -54,6 +54,7 @@ func Search(ctx *context.Context) {
language := ctx.FormTrim("l")
keyword := ctx.FormTrim("q")
path := ctx.FormTrim("path")
mode := ExactSearchMode
if modeStr := ctx.FormString("mode"); len(modeStr) > 0 {
mode = searchModeFromString(modeStr)
@ -63,6 +64,7 @@ func Search(ctx *context.Context) {
ctx.Data["Keyword"] = keyword
ctx.Data["Language"] = language
ctx.Data["CodeSearchPath"] = path
ctx.Data["CodeSearchMode"] = mode.String()
ctx.Data["PageIsViewCode"] = true
@ -86,6 +88,7 @@ func Search(ctx *context.Context) {
Keyword: keyword,
IsKeywordFuzzy: mode == FuzzySearchMode,
Language: language,
Filename: path,
Paginator: &db.ListOptions{
Page: page,
PageSize: setting.UI.RepoSearchPagingNum,
@ -100,11 +103,12 @@ func Search(ctx *context.Context) {
} else {
ctx.Data["CodeIndexerUnavailable"] = !code_indexer.IsAvailable(ctx)
}
ctx.Data["CodeSearchOptions"] = []string{"exact", "fuzzy"}
ctx.Data["CodeSearchOptions"] = code_indexer.CodeSearchOptions
} else {
grepOpt := git.GrepOptions{
ContextLineNumber: 1,
RefName: ctx.Repo.RefName,
Filename: path,
}
switch mode {
case FuzzySearchMode:
@ -130,10 +134,12 @@ func Search(ctx *context.Context) {
// UpdatedUnix: not supported yet
// Language: not supported yet
// Color: not supported yet
Lines: code_indexer.HighlightSearchResultCode(r.Filename, r.LineNumbers, r.HighlightedRanges, strings.Join(r.LineCodes, "\n")),
Lines: code_indexer.HighlightSearchResultCode(
r.Filename, r.LineNumbers, r.HighlightedRanges,
strings.Join(r.LineCodes, "\n")),
})
}
ctx.Data["CodeSearchOptions"] = []string{"exact", "union", "regexp"}
ctx.Data["CodeSearchOptions"] = git.GrepSearchOptions
}
ctx.Data["CodeIndexerDisabled"] = !setting.Indexer.RepoIndexerEnabled

View file

@ -262,6 +262,7 @@ func UnitsPost(ctx *context.Context) {
AllowRebaseUpdate: form.PullsAllowRebaseUpdate,
DefaultDeleteBranchAfterMerge: form.DefaultDeleteBranchAfterMerge,
DefaultMergeStyle: repo_model.MergeStyle(form.PullsDefaultMergeStyle),
DefaultUpdateStyle: repo_model.UpdateStyle(form.PullsDefaultUpdateStyle),
DefaultAllowMaintainerEdit: form.DefaultAllowMaintainerEdit,
},
})

View file

@ -39,6 +39,7 @@ import (
"code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/gitrepo"
"code.gitea.io/gitea/modules/highlight"
code_indexer "code.gitea.io/gitea/modules/indexer/code"
"code.gitea.io/gitea/modules/lfs"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/markup"
@ -1152,6 +1153,12 @@ PostRecentBranchCheck:
ctx.Data["TreeNames"] = treeNames
ctx.Data["BranchLink"] = branchLink
ctx.Data["CodeIndexerDisabled"] = !setting.Indexer.RepoIndexerEnabled
if setting.Indexer.RepoIndexerEnabled {
ctx.Data["CodeIndexerUnavailable"] = !code_indexer.IsAvailable(ctx)
ctx.Data["CodeSearchOptions"] = code_indexer.CodeSearchOptions
} else {
ctx.Data["CodeSearchOptions"] = git.GrepSearchOptions
}
ctx.HTML(http.StatusOK, tplRepoHome)
}

View file

@ -39,6 +39,7 @@ func CodeSearch(ctx *context.Context) {
language := ctx.FormTrim("l")
keyword := ctx.FormTrim("q")
path := ctx.FormTrim("path")
isFuzzy := ctx.FormOptionalBool("fuzzy").ValueOrDefault(true)
if mode := ctx.FormTrim("mode"); len(mode) > 0 {
@ -88,6 +89,7 @@ func CodeSearch(ctx *context.Context) {
Keyword: keyword,
IsKeywordFuzzy: isFuzzy,
Language: language,
Filename: path,
Paginator: &db.ListOptions{
Page: page,
PageSize: setting.UI.RepoSearchPagingNum,

View file

@ -29,6 +29,11 @@ func ToAPIPullRequest(ctx context.Context, pr *issues_model.PullRequest, doer *u
err error
)
if err = pr.LoadIssue(ctx); err != nil {
log.Error("pr.LoadIssue[%d]: %v", pr.ID, err)
return nil
}
if err = pr.Issue.LoadRepo(ctx); err != nil {
log.Error("pr.Issue.LoadRepo[%d]: %v", pr.ID, err)
return nil

View file

@ -101,6 +101,7 @@ func innerToRepo(ctx context.Context, repo *repo_model.Repository, permissionInR
allowRebaseUpdate := false
defaultDeleteBranchAfterMerge := false
defaultMergeStyle := repo_model.MergeStyleMerge
defaultUpdateStyle := repo_model.UpdateStyleMerge
defaultAllowMaintainerEdit := false
if unit, err := repo.GetUnit(ctx, unit_model.TypePullRequests); err == nil {
config := unit.PullRequestsConfig()
@ -114,6 +115,7 @@ func innerToRepo(ctx context.Context, repo *repo_model.Repository, permissionInR
allowRebaseUpdate = config.AllowRebaseUpdate
defaultDeleteBranchAfterMerge = config.DefaultDeleteBranchAfterMerge
defaultMergeStyle = config.GetDefaultMergeStyle()
defaultUpdateStyle = config.GetDefaultUpdateStyle()
defaultAllowMaintainerEdit = config.DefaultAllowMaintainerEdit
}
hasProjects := false
@ -231,6 +233,7 @@ func innerToRepo(ctx context.Context, repo *repo_model.Repository, permissionInR
AllowRebaseUpdate: allowRebaseUpdate,
DefaultDeleteBranchAfterMerge: defaultDeleteBranchAfterMerge,
DefaultMergeStyle: string(defaultMergeStyle),
DefaultUpdateStyle: string(defaultUpdateStyle),
DefaultAllowMaintainerEdit: defaultAllowMaintainerEdit,
AvatarURL: repo.AvatarLink(ctx),
Internal: !repo.IsPrivate && repo.Owner.Visibility == api.VisibleTypePrivate,

View file

@ -189,6 +189,7 @@ type RepoUnitSettingForm struct {
PullsAllowFastForwardOnly bool
PullsAllowManualMerge bool
PullsDefaultMergeStyle string
PullsDefaultUpdateStyle string
EnableAutodetectManualMerge bool
PullsAllowRebaseUpdate bool
DefaultDeleteBranchAfterMerge bool

View file

@ -72,7 +72,8 @@ func ReviewRequest(ctx context.Context, issue *issues_model.Issue, doer, reviewe
return nil, err
}
if comment != nil {
// don't notify if the user is requesting itself as reviewer
if comment != nil && doer.ID != reviewer.ID {
notify_service.PullRequestReviewRequest(ctx, doer, issue, reviewer, isAdd, comment)
}

View file

@ -8,7 +8,6 @@ import (
"fmt"
"io"
"strconv"
"strings"
"code.gitea.io/gitea/models/db"
repo_model "code.gitea.io/gitea/models/repo"
@ -107,7 +106,18 @@ func RemoveRandomAvatars(ctx context.Context) error {
// generateAvatar generates the avatar from a template repository
func generateAvatar(ctx context.Context, templateRepo, generateRepo *repo_model.Repository) error {
generateRepo.Avatar = strings.Replace(templateRepo.Avatar, strconv.FormatInt(templateRepo.ID, 10), strconv.FormatInt(generateRepo.ID, 10), 1)
file, err := storage.RepoAvatars.Open(templateRepo.CustomAvatarRelativePath())
if err != nil {
return err
}
defer file.Close()
data, err := io.ReadAll(file)
if err != nil {
return err
}
generateRepo.Avatar = avatar.HashAvatar(generateRepo.ID, data)
if _, err := storage.Copy(storage.RepoAvatars, generateRepo.CustomAvatarRelativePath(), storage.RepoAvatars, templateRepo.CustomAvatarRelativePath()); err != nil {
return err
}

View file

@ -29,7 +29,7 @@ func TestUploadAvatar(t *testing.T) {
err := UploadAvatar(db.DefaultContext, repo, buff.Bytes())
require.NoError(t, err)
assert.Equal(t, avatar.HashAvatar(10, buff.Bytes()), repo.Avatar)
assert.Equal(t, avatar.HashAvatar(repo.ID, buff.Bytes()), repo.Avatar)
}
func TestUploadBigAvatar(t *testing.T) {
@ -62,3 +62,27 @@ func TestDeleteAvatar(t *testing.T) {
assert.Equal(t, "", repo.Avatar)
}
func TestTemplateGenerateAvatar(t *testing.T) {
// Generate image
myImage := image.NewRGBA(image.Rect(0, 0, 1, 1))
var buff bytes.Buffer
png.Encode(&buff, myImage)
require.NoError(t, unittest.PrepareTestDatabase())
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 10})
// Upload Avatar
err := UploadAvatar(db.DefaultContext, repo, buff.Bytes())
require.NoError(t, err)
assert.Equal(t, avatar.HashAvatar(repo.ID, buff.Bytes()), repo.Avatar)
// Generate the Avatar for Another Repo
genRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 11})
err = generateAvatar(db.DefaultContext, repo, genRepo)
require.NoError(t, err)
assert.Equal(t, avatar.HashAvatar(genRepo.ID, buff.Bytes()), genRepo.Avatar)
// Make sure The 2 Hashes are not the same
assert.NotEqual(t, repo.Avatar, genRepo.Avatar)
}

View file

@ -126,24 +126,32 @@ func (gt *GiteaTemplate) Globs() []glob.Glob {
}
func checkGiteaTemplate(tmpDir string) (*GiteaTemplate, error) {
gtPath := filepath.Join(tmpDir, ".gitea", "template")
if _, err := os.Stat(gtPath); os.IsNotExist(err) {
return nil, nil
} else if err != nil {
return nil, err
configDirs := []string{".forgejo", ".gitea"}
var templateFilePath string
for _, dir := range configDirs {
candidatePath := filepath.Join(tmpDir, dir, "template")
if _, err := os.Stat(candidatePath); err == nil {
templateFilePath = candidatePath
break
} else if !os.IsNotExist(err) {
return nil, err
}
}
content, err := os.ReadFile(gtPath)
if templateFilePath == "" {
return nil, nil
}
content, err := os.ReadFile(templateFilePath)
if err != nil {
return nil, err
}
gt := &GiteaTemplate{
Path: gtPath,
return &GiteaTemplate{
Path: templateFilePath,
Content: content,
}
return gt, nil
}, nil
}
func generateRepoCommit(ctx context.Context, repo, templateRepo, generateRepo *repo_model.Repository, tmpDir string) error {

View file

@ -409,6 +409,10 @@ func (m *webhookNotifier) CreateIssueComment(ctx context.Context, doer *user_mod
var pullRequest *api.PullRequest
if issue.IsPull {
eventType = webhook_module.HookEventPullRequestComment
if err := issue.LoadPullRequest(ctx); err != nil {
log.Error("LoadPullRequest: %v", err)
return
}
pullRequest = convert.ToAPIPullRequest(ctx, issue.PullRequest, doer)
} else {
eventType = webhook_module.HookEventIssueComment

Some files were not shown because too many files have changed in this diff Show more