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 ARG RELEASE_VERSION=unkown
LABEL maintainer="contact@forgejo.org" \ LABEL maintainer="contact@forgejo.org" \
org.opencontainers.image.version="${RELEASE_VERSION}" org.opencontainers.image.version="${RELEASE_VERSION}"

View file

@ -17,7 +17,7 @@ runs:
apt-get -q install -qq -y zstd apt-get -q install -qq -y zstd
- name: "Set up Go using setup-go" - 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 id: go-version
with: with:
go-version-file: "go.mod" go-version-file: "go.mod"

View file

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

View file

@ -23,12 +23,12 @@ on:
jobs: jobs:
release-simulation: release-simulation:
if: vars.ROLE == 'forgejo-coding' if: vars.ROLE == 'forgejo-coding'
runs-on: self-hosted runs-on: lxc-bookworm
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- id: forgejo - 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: with:
user: root user: root
password: admin1234 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 # 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.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: on:
push: push:
tags: 'v[0-9]+.[0-9]+.*' tags: 'v[0-9]+.[0-9]+.*'
@ -23,7 +29,7 @@ on:
jobs: jobs:
release: release:
runs-on: self-hosted runs-on: lxc-bookworm
# root is used for testing, allow it # root is used for testing, allow it
if: vars.ROLE == 'forgejo-integration' || github.repository_owner == 'root' if: vars.ROLE == 'forgejo-integration' || github.repository_owner == 'root'
steps: steps:
@ -37,11 +43,11 @@ jobs:
repository="${{ github.repository }}" repository="${{ github.repository }}"
echo "value=${repository##*/}" >> "$GITHUB_OUTPUT" echo "value=${repository##*/}" >> "$GITHUB_OUTPUT"
- uses: https://code.forgejo.org/actions/setup-node@v4 - uses: https://data.forgejo.org/actions/setup-node@v4
with: with:
node-version: 20 node-version: 20
- uses: https://code.forgejo.org/actions/setup-go@v5 - uses: https://data.forgejo.org/actions/setup-go@v5
with: with:
go-version-file: "go.mod" go-version-file: "go.mod"
@ -87,7 +93,7 @@ jobs:
- name: cache node_modules - name: cache node_modules
id: node id: node
uses: https://code.forgejo.org/actions/cache@v4 uses: https://data.forgejo.org/actions/cache@v4
with: with:
path: | path: |
node_modules node_modules
@ -158,7 +164,7 @@ jobs:
- name: build container & release - name: build container & release
if: ${{ secrets.TOKEN != '' }} 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: with:
forgejo: "${{ env.GITHUB_SERVER_URL }}" forgejo: "${{ env.GITHUB_SERVER_URL }}"
owner: "${{ env.GITHUB_REPOSITORY_OWNER }}" owner: "${{ env.GITHUB_REPOSITORY_OWNER }}"
@ -177,7 +183,7 @@ jobs:
- name: build rootless container - name: build rootless container
if: ${{ secrets.TOKEN != '' }} 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: with:
forgejo: "${{ env.GITHUB_SERVER_URL }}" forgejo: "${{ env.GITHUB_SERVER_URL }}"
owner: "${{ env.GITHUB_REPOSITORY_OWNER }}" owner: "${{ env.GITHUB_REPOSITORY_OWNER }}"
@ -195,7 +201,7 @@ jobs:
- name: end-to-end tests - name: end-to-end tests
if: ${{ secrets.TOKEN != '' && vars.ROLE == 'forgejo-integration' && vars.SKIP_END_TO_END != 'true' }} 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: with:
origin-url: ${{ env.GITHUB_SERVER_URL }} origin-url: ${{ env.GITHUB_SERVER_URL }}
origin-repo: ${{ github.repository }} origin-repo: ${{ github.repository }}

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -25,11 +25,11 @@ jobs:
runs-on: docker runs-on: docker
container: container:
image: code.forgejo.org/forgejo-contrib/renovate:39.69.2 image: data.forgejo.org/forgejo-contrib/renovate:39.69.2
steps: steps:
- name: Load renovate repo cache - 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: with:
path: | path: |
.tmp/cache/renovate/repository .tmp/cache/renovate/repository
@ -62,7 +62,7 @@ jobs:
- name: Save renovate repo cache - name: Save renovate repo cache
if: always() && env.RENOVATE_DRY_RUN != 'full' 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: with:
path: | path: |
.tmp/cache/renovate/repository .tmp/cache/renovate/repository

View file

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

View file

@ -1042,7 +1042,7 @@
{ {
"name": "golang.org/x/time/rate", "name": "golang.org/x/time/rate",
"path": "golang.org/x/time/rate/LICENSE", "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", "name": "google.golang.org/genproto/googleapis/rpc/status",

View file

@ -11,13 +11,4 @@ package main
import ( import (
// for embed // for embed
_ "github.com/shurcooL/vfsgen" _ "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{} oldnew := []string{}
for _, el := range []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", "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", "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") oldnew = append(oldnew, "<"+el+">", "REPLACED-TAG")
} }

View file

@ -7,11 +7,11 @@
<body> <body>
<h1>Privacy Policy</h1> <h1>Privacy Policy</h1>
<h4>Last updated: January 29, 2020</h4> <h4>Last updated: December 19, 2024</h4>
<h2>Who We Are?</h2> <h2>Who We Are?</h2>
<p>Your Gitea Instance</p> <p>Your Forgejo Instance</p>
<h2>What Personal Data We Collect?</h2> <h2>What Personal Data We Collect?</h2>
@ -37,19 +37,19 @@
<h3>With your Consent</h3> <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> <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> <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> <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> <h3>Change in Control or Sale</h3>
@ -57,7 +57,7 @@
<h3>Aggregate, Non-Personally Identifying Information</h3> <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> <p>We <b>don't</b> sell your User Personal Information for monetary or other consideration. </p>
@ -67,34 +67,34 @@
<ol> <ol>
<li>We use your Registration Information to create your account, and to provide you the Service.</li> <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 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 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 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 Gitea Instance and to improve our Website and Service.</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 Gitea Instance or our Users.</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 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> <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> </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> <p>To the extent above, we enforce a written security information program, which:</p>
<ul> <ul>
<li>aligns with industry recognized frameworks;</li> <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>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>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> </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>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> <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> <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> <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> <h2>Repository Contents</h2>
@ -118,19 +118,19 @@
<h2>Public Information</h2> <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> <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>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> <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> <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> <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> <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> <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> <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>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> <p>In particular:</p>
<ul> <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 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 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> <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> <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>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> <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> <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> <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> <h2>COPYING</h2>

View file

@ -7,26 +7,26 @@
<body> <body>
<h1>Terms of Service</h1> <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> <h2>Definitions</h2>
<ol> <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>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>“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 "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> </ol>
<h2>Account Terms</h2> <h2>Account Terms</h2>
@ -48,7 +48,7 @@
<ul> <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>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>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> </ul>
<h3>User Account Security</h3> <h3>User Account Security</h3>
@ -57,7 +57,7 @@
<h3>Additional Terms</h3> <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> <h2>Acceptable Use</h2>
@ -73,19 +73,19 @@
<li> <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>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>
<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>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>
<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>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>
<li> <li>
@ -97,7 +97,7 @@
<li> <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>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> </li>
</ol> </ol>
@ -106,27 +106,27 @@
<ol> <ol>
<li>Some Accounts may have private repositories, which allow the User to control access to Content.</li> <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> <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> <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>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 Gitea Instance's systems and Service.</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> </ul>
</li> </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> </ol>
<h2>Copyright Infringement and DMCA Policy</h2> <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> <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> <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> <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> <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> <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> <h3>Upon Cancellation</h3>
@ -161,7 +161,7 @@
<h3>We May Terminate</h3> <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> <h3>Survival</h3>
@ -175,7 +175,7 @@
<h3>Legal Notices to Us Must Be in Writing</h3> <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> <h3>No Phone Support</h3>
@ -183,9 +183,9 @@
<h2>Disclaimer of Warranties</h2> <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> <h2>Limitation of Liability</h2>
@ -212,9 +212,9 @@
<h2>Release and Indemnification</h2> <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> <h2>Changes to These Terms</h2>
@ -224,22 +224,22 @@
<h3>Governing Law</h3> <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> <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> <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> <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> <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> </body>
</html> </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/captcha v1.0.1
code.forgejo.org/go-chi/session v1.0.1 code.forgejo.org/go-chi/session v1.0.1
code.gitea.io/actions-proto-go v0.4.0 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 code.gitea.io/sdk/gitea v0.17.1
codeberg.org/gusted/mcaptcha v0.0.0-20220723083913-4f3072e1d570 codeberg.org/gusted/mcaptcha v0.0.0-20220723083913-4f3072e1d570
connectrpc.com/connect v1.17.0 connectrpc.com/connect v1.17.0
@ -49,8 +48,7 @@ require (
github.com/go-ldap/ldap/v3 v3.4.6 github.com/go-ldap/ldap/v3 v3.4.6
github.com/go-openapi/spec v0.20.14 github.com/go-openapi/spec v0.20.14
github.com/go-sql-driver/mysql v1.8.1 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.14.0
github.com/go-testfixtures/testfixtures/v3 v3.12.0
github.com/go-webauthn/webauthn v0.11.2 github.com/go-webauthn/webauthn v0.11.2
github.com/gobwas/glob v0.2.3 github.com/gobwas/glob v0.2.3
github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f
@ -62,7 +60,6 @@ require (
github.com/google/uuid v1.6.0 github.com/google/uuid v1.6.0
github.com/gorilla/feeds v1.2.0 github.com/gorilla/feeds v1.2.0
github.com/gorilla/sessions v1.4.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/go-version v1.6.0
github.com/hashicorp/golang-lru/v2 v2.0.7 github.com/hashicorp/golang-lru/v2 v2.0.7
github.com/huandu/xstrings v1.5.0 github.com/huandu/xstrings v1.5.0
@ -111,9 +108,8 @@ require (
golang.org/x/sync v0.10.0 golang.org/x/sync v0.10.0
golang.org/x/sys v0.28.0 golang.org/x/sys v0.28.0
golang.org/x/text v0.21.0 golang.org/x/text v0.21.0
golang.org/x/tools v0.28.0 google.golang.org/grpc v1.69.2
google.golang.org/grpc v1.68.0 google.golang.org/protobuf v1.36.1
google.golang.org/protobuf v1.36.0
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
gopkg.in/ini.v1 v1.67.0 gopkg.in/ini.v1 v1.67.0
gopkg.in/yaml.v3 v3.0.1 gopkg.in/yaml.v3 v3.0.1
@ -123,22 +119,26 @@ require (
) )
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 dario.cat/mergo v1.0.0 // indirect
filippo.io/edwards25519 v1.1.0 // indirect filippo.io/edwards25519 v1.1.0 // indirect
git.sr.ht/~mariusor/go-xsd-duration v0.0.0-20220703122237-02e73435a078 // 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/DataDog/zstd v1.5.5 // indirect
github.com/Masterminds/goutils v1.1.1 // indirect github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0 // indirect
github.com/Masterminds/semver/v3 v3.2.1 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.2 // indirect
github.com/Masterminds/sprig/v3 v3.2.3 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect
github.com/Microsoft/go-winio v0.6.1 // indirect
github.com/RoaringBitmap/roaring v1.9.3 // 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/andybalholm/cascadia v1.3.2 // indirect
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be // 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/aymerick/douceur v0.2.0 // indirect
github.com/beorn7/perks v1.0.1 // indirect github.com/beorn7/perks v1.0.1 // indirect
github.com/bits-and-blooms/bitset v1.13.0 // 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/boombuler/barcode v1.0.1 // indirect
github.com/bradfitz/gomemcache v0.0.0-20230905024940-24af94b03874 // indirect github.com/bradfitz/gomemcache v0.0.0-20230905024940-24af94b03874 // indirect
github.com/caddyserver/zerossl v0.1.3 // 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/cention-sany/utf7 v0.0.0-20170124080048-26cad61bd60a // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/cloudflare/circl v1.3.8 // 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/cpuguy83/go-md2man/v2 v2.0.5 // indirect
github.com/cyphar/filepath-securejoin v0.2.4 // indirect github.com/cyphar/filepath-securejoin v0.2.4 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // 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/dlclark/regexp2 v1.11.0 // indirect
github.com/emersion/go-sasl v0.0.0-20231106173351-e73c9f7bad43 // indirect github.com/emersion/go-sasl v0.0.0-20231106173351-e73c9f7bad43 // indirect
github.com/emirpasic/gods v1.18.1 // 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/fatih/color v1.16.0 // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/fxamacker/cbor/v2 v2.7.0 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect
github.com/go-ap/errors v0.0.0-20231003111023-183eef4b31b7 // 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-asn1-ber/asn1-ber v1.5.5 // indirect
github.com/go-enry/go-oniguruma v1.2.1 // 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/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
github.com/go-git/go-billy/v5 v5.5.0 // indirect github.com/go-git/go-billy/v5 v5.5.0 // indirect
github.com/go-ini/ini v1.67.0 // indirect github.com/go-ini/ini v1.67.0 // indirect
github.com/go-openapi/analysis v0.22.2 // indirect github.com/go-logr/logr v1.4.2 // indirect
github.com/go-openapi/errors v0.21.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-openapi/inflect v0.19.0 // indirect
github.com/go-openapi/jsonpointer v0.20.2 // indirect github.com/go-openapi/jsonpointer v0.20.2 // indirect
github.com/go-openapi/jsonreference v0.20.4 // 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/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/go-webauthn/x v0.1.14 // indirect
github.com/goccy/go-json v0.10.3 // indirect github.com/goccy/go-json v0.10.3 // indirect
github.com/golang-jwt/jwt/v4 v4.5.0 // 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-cmp v0.6.0 // indirect
github.com/google/go-querystring v1.1.0 // indirect github.com/google/go-querystring v1.1.0 // indirect
github.com/google/go-tpm v0.9.1 // 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/css v1.0.1 // indirect
github.com/gorilla/handlers v1.5.2 // indirect
github.com/gorilla/mux v1.8.1 // indirect github.com/gorilla/mux v1.8.1 // indirect
github.com/gorilla/securecookie v1.1.2 // 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-cleanhttp v0.5.2 // indirect
github.com/hashicorp/go-retryablehttp v0.7.7 // 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/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/josharian/intern v1.0.0 // indirect
github.com/kevinburke/ssh_config v1.2.0 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect
github.com/klauspost/pgzip v1.2.6 // 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/libdns/libdns v0.2.2 // indirect
github.com/magiconair/properties v1.8.7 // indirect
github.com/mailru/easyjson v0.7.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect
github.com/markbates/going v1.0.3 // indirect github.com/markbates/going v1.0.3 // indirect
github.com/mattn/go-colorable v0.1.13 // 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/mholt/acmez/v2 v2.0.3 // indirect
github.com/miekg/dns v1.1.62 // indirect github.com/miekg/dns v1.1.62 // indirect
github.com/minio/md5-simd v1.1.2 // 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/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/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/mrjones/oauth v0.0.0-20190623134757-126b35219450 // indirect github.com/mrjones/oauth v0.0.0-20190623134757-126b35219450 // indirect
github.com/mschoch/smat v0.2.0 // indirect github.com/mschoch/smat v0.2.0 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/nwaples/rardecode v1.1.3 // 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/olekukonko/tablewriter v0.0.5 // indirect
github.com/onsi/ginkgo v1.16.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/pierrec/lz4/v4 v4.1.21 // indirect
github.com/pjbgf/sha1cd v0.3.0 // indirect github.com/pjbgf/sha1cd v0.3.0 // indirect
github.com/pkg/errors v0.9.1 // 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/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/client_model v0.6.1 // indirect
github.com/prometheus/common v0.55.0 // indirect github.com/prometheus/common v0.55.0 // indirect
github.com/prometheus/procfs v0.15.1 // indirect github.com/prometheus/procfs v0.15.1 // indirect
github.com/rhysd/actionlint v1.6.27 // indirect github.com/rhysd/actionlint v1.6.27 // indirect
github.com/rivo/uniseg v0.4.7 // 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/rs/xid v1.6.0 // indirect
github.com/russross/blackfriday/v2 v2.1.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/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c // indirect
github.com/sirupsen/logrus v1.9.3 // indirect github.com/sirupsen/logrus v1.9.3 // indirect
github.com/skeema/knownhosts v1.2.1 // 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/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/x448/float16 v0.8.4 // indirect
github.com/xanzy/ssh-agent v0.3.3 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect
github.com/zeebo/blake3 v0.2.4 // indirect github.com/zeebo/blake3 v0.2.4 // indirect
go.etcd.io/bbolt v1.3.9 // indirect go.etcd.io/bbolt v1.3.9 // indirect
go.mongodb.org/mongo-driver v1.13.1 // indirect go.opencensus.io v0.24.0 // indirect
go.opentelemetry.io/otel v1.26.0 // indirect go.opentelemetry.io/contrib/detectors/gcp v1.31.0 // indirect
go.opentelemetry.io/otel/trace v1.26.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/atomic v1.11.0 // indirect
go.uber.org/multierr v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.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/mod v0.22.0 // indirect
golang.org/x/time v0.5.0 // indirect golang.org/x/time v0.7.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // 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/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
gopkg.in/warnings.v0 v0.1.2 // 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 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 { func AggregateJobStatus(jobs []*ActionRunJob) Status {
allDone := true allSuccessOrSkipped := len(jobs) != 0
allWaiting := true allSkipped := len(jobs) != 0
hasFailure := false var hasFailure, hasCancelled, hasWaiting, hasRunning, hasBlocked bool
for _, job := range jobs { for _, job := range jobs {
if !job.Status.IsDone() { allSuccessOrSkipped = allSuccessOrSkipped && (job.Status == StatusSuccess || job.Status == StatusSkipped)
allDone = false allSkipped = allSkipped && job.Status == StatusSkipped
} hasFailure = hasFailure || job.Status == StatusFailure
if job.Status != StatusWaiting && !job.Status.IsDone() { hasCancelled = hasCancelled || job.Status == StatusCancelled
allWaiting = false hasWaiting = hasWaiting || job.Status == StatusWaiting
} hasRunning = hasRunning || job.Status == StatusRunning
if job.Status == StatusFailure || job.Status == StatusCancelled { hasBlocked = hasBlocked || job.Status == StatusBlocked
hasFailure = true
}
} }
if allDone { switch {
if hasFailure { case allSkipped:
return StatusFailure return StatusSkipped
} case allSuccessOrSkipped:
return StatusSuccess return StatusSuccess
} case hasCancelled:
if allWaiting { return StatusCancelled
case hasFailure:
return StatusFailure
case hasRunning:
return StatusRunning
case hasWaiting:
return StatusWaiting 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 updated: 1683636626
need_approval: 0 need_approval: 0
approved_by: 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 id: 891
title: "update actions" title: "update actions"

View file

@ -45,3 +45,15 @@
is_deleted: false is_deleted: false
deleted_by_id: 0 deleted_by_id: 0
deleted_unix: 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 { func MigrateTwoFactorToKeying(x *xorm.Engine) error {
var err 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 { switch x.Dialect().URI().DBType {
case schemas.MYSQL: case schemas.MYSQL:
_, err = x.Exec("ALTER TABLE `two_factor` MODIFY `secret` BLOB") _, 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: case schemas.POSTGRES:
_, err = x.Exec("ALTER TABLE `two_factor` ALTER COLUMN `secret` SET DATA TYPE bytea USING secret::text::bytea") _, 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(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(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), 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 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" 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 // UpdateDefaultBranch updates the default branch
func UpdateDefaultBranch(ctx context.Context, repo *Repository) error { func UpdateDefaultBranch(ctx context.Context, repo *Repository) error {
_, err := db.GetEngine(ctx).ID(repo.ID).Cols("default_branch").Update(repo) _, err := db.GetEngine(ctx).ID(repo.ID).Cols("default_branch").Update(repo)

View file

@ -159,6 +159,7 @@ type PullRequestsConfig struct {
AllowRebaseUpdate bool AllowRebaseUpdate bool
DefaultDeleteBranchAfterMerge bool DefaultDeleteBranchAfterMerge bool
DefaultMergeStyle MergeStyle DefaultMergeStyle MergeStyle
DefaultUpdateStyle UpdateStyle
DefaultAllowMaintainerEdit bool DefaultAllowMaintainerEdit bool
} }
@ -197,6 +198,25 @@ func (cfg *PullRequestsConfig) GetDefaultMergeStyle() MergeStyle {
return MergeStyleMerge 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 { type ActionsConfig struct {
DisabledWorkflows []string DisabledWorkflows []string
} }

View file

@ -7,6 +7,8 @@ import (
"testing" "testing"
"code.gitea.io/gitea/models/perm" "code.gitea.io/gitea/models/perm"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/test"
"github.com/stretchr/testify/assert" "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.AccessModeWrite, UnitAccessModeWrite.ToAccessMode(perm.AccessModeAdmin))
assert.Equal(t, perm.AccessModeRead, UnitAccessModeUnset.ToAccessMode(perm.AccessModeRead)) 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 { type Setting struct {
ID int64 `xorm:"pk autoincr"` ID int64 `xorm:"pk autoincr"`
SettingKey string `xorm:"varchar(255) unique"` // key should be lowercase SettingKey string `xorm:"varchar(255) unique"` // key should be lowercase
SettingValue string `xorm:"text"` SettingValue string `xorm:"text"`
Version int `xorm:"version"` Version int
Created timeutil.TimeStamp `xorm:"created"` Created timeutil.TimeStamp `xorm:"created"`
Updated timeutil.TimeStamp `xorm:"updated"` Updated timeutil.TimeStamp `xorm:"updated"`
} }

View file

@ -4,47 +4,80 @@
package pwn package pwn
import ( import (
"errors"
"io"
"net/http" "net/http"
"strings"
"testing" "testing"
"time" "time"
"github.com/h2non/gock"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "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{ var client = New(WithHTTP(&http.Client{
Timeout: time.Second * 2, Timeout: time.Second * 2,
Transport: mockTransport{},
})) }))
func TestPassword(t *testing.T) { func TestPassword(t *testing.T) {
defer gock.Off()
count, err := client.CheckPassword("", false) count, err := client.CheckPassword("", false)
require.ErrorIs(t, err, ErrEmptyPassword, "blank input should return ErrEmptyPassword") require.ErrorIs(t, err, ErrEmptyPassword, "blank input should return ErrEmptyPassword")
assert.Equal(t, -1, count) 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) count, err = client.CheckPassword("pwned", false)
require.NoError(t, err) require.NoError(t, err)
assert.Equal(t, 1, count) 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) count, err = client.CheckPassword("notpwned", false)
require.NoError(t, err) require.NoError(t, err)
assert.Equal(t, 0, count) 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) count, err = client.CheckPassword("paddedpwned", true)
require.NoError(t, err) require.NoError(t, err)
assert.Equal(t, 1, count) 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) count, err = client.CheckPassword("paddednotpwned", true)
require.NoError(t, err) require.NoError(t, err)
assert.Equal(t, 0, count) 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) count, err = client.CheckPassword("paddednotpwnedzero", true)
require.NoError(t, err) require.NoError(t, err)
assert.Equal(t, 0, count) assert.Equal(t, 0, count)

View file

@ -36,13 +36,15 @@ const (
RegExpGrepMode RegExpGrepMode
) )
var GrepSearchOptions = [3]string{"exact", "union", "regexp"}
type GrepOptions struct { type GrepOptions struct {
RefName string RefName string
MaxResultLimit int MaxResultLimit int
MatchesPerFile int // >= git 2.38 MatchesPerFile int // >= git 2.38
ContextLineNumber int ContextLineNumber int
Mode grepMode Mode grepMode
PathSpec []setting.Glob Filename string
} }
func (opts *GrepOptions) ensureDefaults() { func (opts *GrepOptions) ensureDefaults() {
@ -112,12 +114,38 @@ func GrepSearch(ctx context.Context, repo *Repository, search string, opts GrepO
} }
// pathspec // pathspec
files := make([]string, 0, includeLen := len(setting.Indexer.IncludePatterns)
len(setting.Indexer.IncludePatterns)+ if len(opts.Filename) > 0 {
len(setting.Indexer.ExcludePatterns)+ includeLen = 1
len(opts.PathSpec)) }
for _, expr := range append(setting.Indexer.IncludePatterns, opts.PathSpec...) { files := make([]string, 0, len(setting.Indexer.ExcludePatterns)+includeLen)
files = append(files, ":"+expr.Pattern()) 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 { for _, expr := range setting.Indexer.ExcludePatterns {
files = append(files, ":^"+expr.Pattern()) files = append(files, ":^"+expr.Pattern())

View file

@ -89,6 +89,20 @@ func TestGrepSearch(t *testing.T) {
}, },
}, res) }, 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{}) res, err = GrepSearch(context.Background(), repo, "no-such-content", GrepOptions{})
require.NoError(t, err) require.NoError(t, err)
assert.Empty(t, res) assert.Empty(t, res)

View file

@ -230,7 +230,7 @@ func (repo *Repository) CommitsByFileAndRange(opts CommitsByFileAndRangeOptions)
go func() { go func() {
stderr := strings.Builder{} stderr := strings.Builder{}
gitCmd := NewCommand(repo.Ctx, "rev-list"). 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) AddOptionFormat("--skip=%d", skip)
gitCmd.AddDynamicArguments(opts.Revision) gitCmd.AddDynamicArguments(opts.Revision)

View file

@ -7,6 +7,9 @@ import (
"path/filepath" "path/filepath"
"testing" "testing"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/test"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
@ -138,3 +141,61 @@ func TestGetTagCommit(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
assert.EqualValues(t, lTagCommitID, lTag.ID.String()) 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/charset"
"code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/gitrepo" "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" "code.gitea.io/gitea/modules/indexer/code/internal"
indexer_internal "code.gitea.io/gitea/modules/indexer/internal" indexer_internal "code.gitea.io/gitea/modules/indexer/internal"
inner_bleve "code.gitea.io/gitea/modules/indexer/internal/bleve" inner_bleve "code.gitea.io/gitea/modules/indexer/internal/bleve"
@ -56,6 +57,7 @@ func addUnicodeNormalizeTokenFilter(m *mapping.IndexMappingImpl) error {
type RepoIndexerData struct { type RepoIndexerData struct {
RepoID int64 RepoID int64
CommitID string CommitID string
Filename string
Content string Content string
Language string Language string
UpdatedAt time.Time UpdatedAt time.Time
@ -69,7 +71,8 @@ func (d *RepoIndexerData) Type() string {
const ( const (
repoIndexerAnalyzer = "repoIndexerAnalyzer" repoIndexerAnalyzer = "repoIndexerAnalyzer"
repoIndexerDocType = "repoIndexerDocType" repoIndexerDocType = "repoIndexerDocType"
repoIndexerLatestVersion = 6 pathHierarchyAnalyzer = "pathHierarchyAnalyzer"
repoIndexerLatestVersion = 7
) )
// generateBleveIndexMapping generates a bleve index mapping for the repo indexer // 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("Language", termFieldMapping)
docMapping.AddFieldMappingsAt("CommitID", termFieldMapping) docMapping.AddFieldMappingsAt("CommitID", termFieldMapping)
pathFieldMapping := bleve.NewTextFieldMapping()
pathFieldMapping.IncludeInAll = false
pathFieldMapping.Analyzer = pathHierarchyAnalyzer
docMapping.AddFieldMappingsAt("Filename", pathFieldMapping)
timeFieldMapping := bleve.NewDateTimeFieldMapping() timeFieldMapping := bleve.NewDateTimeFieldMapping()
timeFieldMapping.IncludeInAll = false timeFieldMapping.IncludeInAll = false
docMapping.AddFieldMappingsAt("UpdatedAt", timeFieldMapping) docMapping.AddFieldMappingsAt("UpdatedAt", timeFieldMapping)
@ -103,6 +111,13 @@ func generateBleveIndexMapping() (mapping.IndexMapping, error) {
"token_filters": []string{unicodeNormalizeName, camelcase.Name, lowercase.Name}, "token_filters": []string{unicodeNormalizeName, camelcase.Name, lowercase.Name},
}); err != nil { }); err != nil {
return nil, err 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.DefaultAnalyzer = repoIndexerAnalyzer
mapping.AddDocumentMapping(repoIndexerDocType, docMapping) mapping.AddDocumentMapping(repoIndexerDocType, docMapping)
@ -178,6 +193,7 @@ func (b *Indexer) addUpdate(ctx context.Context, batchWriter git.WriteCloserErro
return batch.Index(id, &RepoIndexerData{ return batch.Index(id, &RepoIndexerData{
RepoID: repo.ID, RepoID: repo.ID,
CommitID: commitSha, CommitID: commitSha,
Filename: update.Filename,
Content: string(charset.ToUTF8DropErrors(fileContents, charset.ConvertOpts{})), Content: string(charset.ToUTF8DropErrors(fileContents, charset.ConvertOpts{})),
Language: analyze.GetCodeLanguage(update.Filename, fileContents), Language: analyze.GetCodeLanguage(update.Filename, fileContents),
UpdatedAt: time.Now().UTC(), UpdatedAt: time.Now().UTC(),
@ -266,22 +282,30 @@ func (b *Indexer) Search(ctx context.Context, opts *internal.SearchOptions) (int
indexerQuery = keywordQuery 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 // Save for reuse without language filter
facetQuery := indexerQuery facetQuery := indexerQuery
if len(opts.Language) > 0 { if len(opts.Language) > 0 {
languageQuery := bleve.NewMatchQuery(opts.Language)
languageQuery.FieldVal = "Language"
languageQuery.Analyzer = analyzer_keyword.Name
indexerQuery = bleve.NewConjunctionQuery( indexerQuery = bleve.NewConjunctionQuery(
indexerQuery, indexerQuery,
languageQuery, inner_bleve.MatchQuery(opts.Language, "Language", analyzer_keyword.Name, 0),
) )
} }
from, pageSize := opts.GetSkipTake() from, pageSize := opts.GetSkipTake()
searchRequest := bleve.NewSearchRequestOptions(indexerQuery, pageSize, from, false) 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 searchRequest.IncludeLocations = true
if len(opts.Language) == 0 { 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)), RepoID: int64(hit.Fields["RepoID"].(float64)),
StartIndex: startIndex, StartIndex: startIndex,
EndIndex: endIndex, EndIndex: endIndex,
Filename: internal.FilenameOfIndexerID(hit.ID), Filename: hit.Fields["Filename"].(string),
Content: hit.Fields["Content"].(string), Content: hit.Fields["Content"].(string),
CommitID: hit.Fields["CommitID"].(string), CommitID: hit.Fields["CommitID"].(string),
UpdatedUnix: updatedUnix, UpdatedUnix: updatedUnix,
@ -333,7 +357,7 @@ func (b *Indexer) Search(ctx context.Context, opts *internal.SearchOptions) (int
if len(opts.Language) > 0 { if len(opts.Language) > 0 {
// Use separate query to go get all language counts // Use separate query to go get all language counts
facetRequest := bleve.NewSearchRequestOptions(facetQuery, 1, 0, false) 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.IncludeLocations = true
facetRequest.AddFacet("languages", bleve.NewFacetRequest("Language", 10)) 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 ( const (
esRepoIndexerLatestVersion = 1 esRepoIndexerLatestVersion = 2
// multi-match-types, currently only 2 types are used // 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 // Reference: https://www.elastic.co/guide/en/elasticsearch/reference/7.0/query-dsl-multi-match-query.html#multi-match-types
esMultiMatchTypeBestFields = "best_fields" esMultiMatchTypeBestFields = "best_fields"
@ -57,6 +57,21 @@ func NewIndexer(url, indexerName string) *Indexer {
const ( const (
defaultMapping = `{ defaultMapping = `{
"settings": {
"analysis": {
"analyzer": {
"custom_path_tree": {
"tokenizer": "custom_hierarchy"
}
},
"tokenizer": {
"custom_hierarchy": {
"type": "path_hierarchy",
"delimiter": "/"
}
}
}
},
"mappings": { "mappings": {
"properties": { "properties": {
"repo_id": { "repo_id": {
@ -72,6 +87,15 @@ const (
"type": "keyword", "type": "keyword",
"index": true "index": true
}, },
"filename": {
"type": "text",
"fields": {
"tree": {
"type": "text",
"analyzer": "custom_path_tree"
}
}
},
"language": { "language": {
"type": "keyword", "type": "keyword",
"index": true "index": true
@ -138,6 +162,7 @@ func (b *Indexer) addUpdate(ctx context.Context, batchWriter git.WriteCloserErro
"repo_id": repo.ID, "repo_id": repo.ID,
"content": string(charset.ToUTF8DropErrors(fileContents, charset.ConvertOpts{})), "content": string(charset.ToUTF8DropErrors(fileContents, charset.ConvertOpts{})),
"commit_id": sha, "commit_id": sha,
"filename": update.Filename,
"language": analyze.GetCodeLanguage(update.Filename, fileContents), "language": analyze.GetCodeLanguage(update.Filename, fileContents),
"updated_at": timeutil.TimeStampNow(), "updated_at": timeutil.TimeStampNow(),
}), }),
@ -267,7 +292,6 @@ func convertResult(searchResult *elastic.SearchResult, kw string, pageSize int)
panic(fmt.Sprintf("2===%#v", hit.Highlight)) panic(fmt.Sprintf("2===%#v", hit.Highlight))
} }
repoID, fileName := internal.ParseIndexerID(hit.Id)
res := make(map[string]any) res := make(map[string]any)
if err := json.Unmarshal(hit.Source, &res); err != nil { if err := json.Unmarshal(hit.Source, &res); err != nil {
return 0, nil, nil, err return 0, nil, nil, err
@ -276,8 +300,8 @@ func convertResult(searchResult *elastic.SearchResult, kw string, pageSize int)
language := res["language"].(string) language := res["language"].(string)
hits = append(hits, &internal.SearchResult{ hits = append(hits, &internal.SearchResult{
RepoID: repoID, RepoID: int64(res["repo_id"].(float64)),
Filename: fileName, Filename: res["filename"].(string),
CommitID: res["commit_id"].(string), CommitID: res["commit_id"].(string),
Content: res["content"].(string), Content: res["content"].(string),
UpdatedUnix: timeutil.TimeStamp(res["updated_at"].(float64)), 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...) repoQuery := elastic.NewTermsQuery("repo_id", repoStrs...)
query = query.Must(repoQuery) query = query.Must(repoQuery)
} }
if len(opts.Filename) > 0 {
query = query.Filter(elastic.NewTermsQuery("filename.tree", opts.Filename))
}
var ( var (
start, pageSize = opts.GetSkipTake() 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) err := index(git.DefaultContext, indexer, repoID)
require.NoError(t, err) require.NoError(t, err)
keywords := []struct { keywords := []struct {
RepoIDs []int64 RepoIDs []int64
Keyword string Keyword string
IDs []int64 IDs []int64
Langs int Langs int
Filename string
}{ }{
{ {
RepoIDs: nil, RepoIDs: nil,
@ -51,6 +52,20 @@ func testIndexer(name string, t *testing.T, indexer internal.Indexer) {
IDs: []int64{}, IDs: []int64{},
Langs: 0, 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, RepoIDs: nil,
Keyword: "Description for", Keyword: "Description for",
@ -86,6 +101,7 @@ func testIndexer(name string, t *testing.T, indexer internal.Indexer) {
Page: 1, Page: 1,
PageSize: 10, PageSize: 10,
}, },
Filename: kw.Filename,
IsKeywordFuzzy: true, IsKeywordFuzzy: true,
}) })
require.NoError(t, err) require.NoError(t, err)

View file

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

View file

@ -3,30 +3,8 @@
package internal package internal
import ( import "code.gitea.io/gitea/modules/indexer/internal"
"strings"
"code.gitea.io/gitea/modules/indexer/internal"
"code.gitea.io/gitea/modules/log"
)
func FilenameIndexerID(repoID int64, filename string) string { func FilenameIndexerID(repoID int64, filename string) string {
return internal.Base36(repoID) + "_" + filename 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 type SearchOptions = internal.SearchOptions
var CodeSearchOptions = [2]string{"exact", "fuzzy"}
func indices(content string, selectionStartIndex, selectionEndIndex int) (int, int) { func indices(content string, selectionStartIndex, selectionEndIndex int) (int, int) {
startIndex := selectionStartIndex startIndex := selectionStartIndex
numLinesBefore := 0 numLinesBefore := 0

View file

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

View file

@ -7,6 +7,7 @@ import (
"encoding/xml" "encoding/xml"
"io" "io"
"code.gitea.io/gitea/modules/util"
"code.gitea.io/gitea/modules/validation" "code.gitea.io/gitea/modules/validation"
"golang.org/x/net/html/charset" "golang.org/x/net/html/charset"
@ -49,8 +50,16 @@ type pomStruct struct {
Version string `xml:"version"` Version string `xml:"version"`
Scope string `xml:"scope"` Scope string `xml:"scope"`
} `xml:"dependencies>dependency"` } `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 // ParsePackageMetaData parses the metadata of a pom file
func ParsePackageMetaData(r io.Reader) (*Metadata, error) { func ParsePackageMetaData(r io.Reader) (*Metadata, error) {
var pom pomStruct var pom pomStruct
@ -65,6 +74,17 @@ func ParsePackageMetaData(r io.Reader) (*Metadata, error) {
pom.URL = "" 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)) licenses := make([]string, 0, len(pom.Licenses))
for _, l := range pom.Licenses { for _, l := range pom.Licenses {
if l.Name != "" { if l.Name != "" {
@ -82,7 +102,7 @@ func ParsePackageMetaData(r io.Reader) (*Metadata, error) {
} }
return &Metadata{ return &Metadata{
GroupID: pom.GroupID, GroupID: groupID,
ArtifactID: pom.ArtifactID, ArtifactID: pom.ArtifactID,
Name: pom.Name, Name: pom.Name,
Description: pom.Description, Description: pom.Description,

View file

@ -14,6 +14,7 @@ import (
const ( const (
groupID = "org.gitea" groupID = "org.gitea"
parentGroupID = "org.gitea.parent"
artifactID = "my-project" artifactID = "my-project"
version = "1.0.1" version = "1.0.1"
name = "My Gitea Project" name = "My Gitea Project"
@ -27,6 +28,11 @@ const (
const pomContent = `<?xml version="1.0"?> 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"> <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> <groupId>` + groupID + `</groupId>
<artifactId>` + artifactID + `</artifactId> <artifactId>` + artifactID + `</artifactId>
<version>` + version + `</version> <version>` + version + `</version>
@ -47,6 +53,24 @@ const pomContent = `<?xml version="1.0"?>
</dependencies> </dependencies>
</project>` </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) { func TestParsePackageMetaData(t *testing.T) {
t.Run("InvalidFile", func(t *testing.T) { t.Run("InvalidFile", func(t *testing.T) {
m, err := ParsePackageMetaData(strings.NewReader("")) m, err := ParsePackageMetaData(strings.NewReader(""))
@ -87,4 +111,19 @@ func TestParsePackageMetaData(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
assert.NotNil(t, m) 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, Type: tp,
Config: &repo_model.PullRequestsConfig{ Config: &repo_model.PullRequestsConfig{
AllowMerge: true, AllowRebase: true, AllowRebaseMerge: true, AllowSquash: true, AllowFastForwardOnly: true, AllowMerge: true, AllowRebase: true, AllowRebaseMerge: true, AllowSquash: true, AllowFastForwardOnly: true,
DefaultMergeStyle: repo_model.MergeStyle(setting.Repository.PullRequest.DefaultMergeStyle), DefaultMergeStyle: repo_model.MergeStyle(setting.Repository.PullRequest.DefaultMergeStyle),
AllowRebaseUpdate: true, DefaultUpdateStyle: repo_model.UpdateStyle(setting.Repository.PullRequest.DefaultUpdateStyle),
AllowRebaseUpdate: true,
}, },
}) })
} else { } else {

View file

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

View file

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

View file

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

View file

@ -105,6 +105,7 @@ type Repository struct {
DefaultDeleteBranchAfterMerge bool `json:"default_delete_branch_after_merge"` DefaultDeleteBranchAfterMerge bool `json:"default_delete_branch_after_merge"`
DefaultMergeStyle string `json:"default_merge_style"` DefaultMergeStyle string `json:"default_merge_style"`
DefaultAllowMaintainerEdit bool `json:"default_allow_maintainer_edit"` DefaultAllowMaintainerEdit bool `json:"default_allow_maintainer_edit"`
DefaultUpdateStyle string `json:"default_update_style"`
AvatarURL string `json:"avatar_url"` AvatarURL string `json:"avatar_url"`
Internal bool `json:"internal"` Internal bool `json:"internal"`
MirrorInterval string `json:"mirror_interval"` MirrorInterval string `json:"mirror_interval"`
@ -225,6 +226,8 @@ type EditRepoOption struct {
DefaultDeleteBranchAfterMerge *bool `json:"default_delete_branch_after_merge,omitempty"` 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". // 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"` 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 // set to `true` to allow edits from maintainers by default
DefaultAllowMaintainerEdit *bool `json:"default_allow_maintainer_edit,omitempty"` DefaultAllowMaintainerEdit *bool `json:"default_allow_maintainer_edit,omitempty"`
// set to `true` to archive this repository. // set to `true` to archive this repository.

View file

@ -1,3 +1,8 @@
[common] [common]
help = সাহায্য 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_themes=Výchozí motiv
manage_openid=Adresy OpenID 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. 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í primary=Hlavní
activated=Aktivován activated=Aktivován
requires_activation=Vyžaduje aktivaci 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_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. 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. orgs_none=Nejste členem žádné organizace.
repos_none=Nevlastníte žádné repozitáře. 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>. language.localization_project = Pomozte nám s překladem Forgejo do vašeho jazyka! <a href="%s">Více informací</a>.
[repo] [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=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=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_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 repo_size=Velikost repozitáře
@ -1067,7 +1067,7 @@ template_select=Vyberte šablonu
template_helper=Nastavit repozitář jako š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. 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=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=Nastavit repozitář jako soukromý
visibility_helper_forced=Váš administrátor vynutil, že nové repozitáře budou 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.) 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_repo=Generovat repozitář
generate_from=Generovat z generate_from=Generovat z
repo_desc=Popis repo_desc=Popis
repo_desc_helper=Zadejte krátký popis (volitelné) repo_desc_helper=Zadejte krátký popis (nepovinné)
repo_lang=Jazyk repo_lang=Jazyk
repo_gitignore_helper=Vyberte šablony .gitignore 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=Štítky
issue_labels_helper=Vyberte sadu štítků issue_labels_helper=Vyberte sadu štítků
license=Licence license=Licence
license_helper=Vyberte licenční soubor 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 <a target="_blank" rel="noopener noreferrer" href="%s">Zvolte licenci</a> 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 = Objektový formát
object_format_helper = Objektový formát repozitáře. Později jej nelze změnit. Nejkompatibilnější je SHA1. object_format_helper = Objektový formát repozitáře. Později jej nelze změnit. Nejkompatibilnější je SHA1.
readme=README readme=README
readme_helper=Vyberte šablonu souboru 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) 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=Vyberte model důvěry pro ověření podpisu. Možnosti jsou:
trust_model_helper_collaborator=Spolupracovník: Důvěřovat podpisům spolupracovníků trust_model_helper_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.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=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.error_ismirror=Nemůžete archivovat zrcadlený repozitář.
settings.archive.branchsettings_unavailable=Nastavení větví není dostupné, pokud je repozitář archivovaný. settings.archive.branchsettings_unavailable=Nastavení větví není v archivovaných repozitářích k dispozici.
settings.archive.tagsettings_unavailable=Nastavení značek není k dispozici, pokud je repozitář archivován. 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.button=Zrušit archivaci repozitáře
settings.unarchive.header=Obnovit tento repozitář 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í. 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. 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 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.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.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. 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. 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_one = %d kontrola
issues.num_reviews_few = %d kontrol issues.num_reviews_few = %d kontrol
issues.summary_card_alt = Souhrn problému s názvem „%s“ v repozitáři %s 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] [graphs]
component_loading_info = Tohle může chvíli trvat… 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.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_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_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 = 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í. 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) 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.type=Typ obrazu
container.details.platform=Platforma container.details.platform=Platforma
container.pull=Stáhnout obraz z příkazové řádky: 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.multi_arch=OS/architektura
container.layers=Vrstvy obrazů container.layers=Vrstvy obrazu
container.labels=Štítky container.labels=Štítky
container.labels.key=Klíč container.labels.key=Klíč
container.labels.value=Hodnota container.labels.value=Hodnota
@ -3799,6 +3801,7 @@ arch.version.checkdepends = Závislosti Check
arch.version.conflicts = Konflikty arch.version.conflicts = Konflikty
arch.version.replaces = Nahrazuje arch.version.replaces = Nahrazuje
arch.version.backup = Záloha arch.version.backup = Záloha
container.images.title = Obrázky
[secrets] [secrets]
secrets=Tajné klíče 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_themes=Standard-Theme
manage_openid=OpenID-Adressen 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. 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 primary=Primär
activated=Aktiviert activated=Aktiviert
requires_activation=Erfordert Aktivierung requires_activation=Erfordert Aktivierung
@ -1097,7 +1097,7 @@ issue_labels=Labels
issue_labels_helper=Wähle eine Label-Sammlung issue_labels_helper=Wähle eine Label-Sammlung
license=Lizenz license=Lizenz
license_helper=Wähle eine 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=README
readme_helper=Wähle eine README-Vorlage readme_helper=Wähle eine README-Vorlage
readme_helper_desc=Hier kannst du eine komplette Beschreibung für dein Projekt schreiben. 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.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=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.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.branchsettings_unavailable=Branch-Einstellungen sind nicht verfügbar in archivierten Repos.
settings.archive.tagsettings_unavailable=Tag Einstellungen sind nicht verfügbar, wenn das Repo archiviert wurde. settings.archive.tagsettings_unavailable=Tag-Einstellungen sind nicht verfügbar in archivierten Repos.
settings.unarchive.button=Archivierung zurücksetzen settings.unarchive.button=Archivierung zurücksetzen
settings.unarchive.header=Archivierung dieses Repositorys 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. 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.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. 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. 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. 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 clone_in_vscodium = In VSCodium klonen
settings.units.add_more = Mehr aktivieren 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.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.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.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. 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. 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. 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.num_reviews_one = %d Review
issues.summary_card_alt = Zusammenfassung eines Issues mit dem Titel „%s“ im Repository %s issues.summary_card_alt = Zusammenfassung eines Issues mit dem Titel „%s“ im Repository %s
issues.num_reviews_few = %d Reviews issues.num_reviews_few = %d Reviews
editor.add_tmpl.filename = Dateiname
[graphs] [graphs]
component_loading_failed = Konnte %s nicht laden component_loading_failed = Konnte %s nicht laden
@ -3512,7 +3513,7 @@ notices.type_2=Aufgabe
notices.desc=Beschreibung notices.desc=Beschreibung
notices.op=Aktion notices.op=Aktion
notices.delete_success=Diese Systemmeldung wurde gelöscht. 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 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.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 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: 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.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: 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.details.platform=Plattform
container.pull=Downloade das Container-Image aus der Kommandozeile: container.pull=Downloade das Container-Image aus der Kommandozeile:
container.digest=Digest: container.digest=Digest
container.multi_arch=Betriebsystem / Architektur container.multi_arch=Betriebsystem / Architektur
container.layers=Container-Image Ebenen container.layers=Abbildebenen
container.labels=Labels container.labels=Labels
container.labels.key=Schlüssel container.labels.key=Schlüssel
container.labels.value=Wert container.labels.value=Wert
@ -3803,6 +3804,7 @@ arch.version.conflicts = Konflikte
arch.version.replaces = Ersetzt arch.version.replaces = Ersetzt
arch.version.backup = Backup arch.version.backup = Backup
arch.version.optdepends = Optionale Abhängigkeit arch.version.optdepends = Optionale Abhängigkeit
container.images.title = Bilder
[secrets] [secrets]
secrets=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.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.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.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_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.pulls.default_allow_edits_from_maintainers = Allow edits from maintainers by default
settings.releases_desc = Enable repository releases settings.releases_desc = Enable repository releases

View file

@ -165,6 +165,7 @@ filter.is_template = Mallipohjat
filter.not_fork = Ei forkkeja filter.not_fork = Ei forkkeja
filter.not_template = Ei mallipohjat filter.not_template = Ei mallipohjat
filter.not_mirror = Ei peilattu filter.not_mirror = Ei peilattu
copy_path = Kopioi polku
[aria] [aria]
footer.links = Linkit 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. 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=Käytä federoituja profiilikuvia
federated_avatar_lookup.description=Käytä Libravatar-palvelua profiilikuvien hakemiseen. 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ä. 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. allow_only_external_registration.description=Käyttäjät voivat luoda uusia käyttäjiä vain erikseen konfiguroituja ulkoisia palveluja käyttäen.
openid_signin=Ota OpenID-kirjautuminen käyttöön openid_signin=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_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=Ota ajanseuranta oletusarvoisesti käyttöön
default_enable_timetracking.description=Salli uusien repositorioiden aikaseurannan käyttöönotto oletusarvoisesti. 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'. 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 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 . 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 = Instanssin tunnuslause
app_slogan_helper = Syötä instanssin tunnuslause tähän. Jätä tyhjäksi poistaaksesi käytöstä. 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. domain_helper = Palvelimen verkkotunnus tai isäntänimi.
smtp_from_invalid = "Lähetä sähköpostit osoitteella"-osoite on virheellinen
[home] [home]
uname_holder=Käyttäjätunnus tai sähköpostiosoite 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_one = %d forkki
forks_few = %d forkkia forks_few = %d forkkia
go_to = Siirry go_to = Siirry
relevant_repositories_tooltip = Repot, jotka ovat forkkeja, joilla ei ole aiheita, ei kuvakkeita ja ei kuvausta, ovat piilotettuja.
[auth] [auth]
create_new_account=Rekisteröi tili 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. 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 active_your_account=Aktivoi tilisi
account_activated=Tili on aktivoitu 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. 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. 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 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. 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 reset_password=Tilin palautus
invalid_code=Vahvistusavain on virheellinen tai vanhentunut. invalid_code=Vahvistusavain on virheellinen tai vanhentunut.
reset_password_helper=Palauta käyttäjätili 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> hint_register = Tarvitsetko käyttäjätilin? <a href="%s">Rekisteröidy nyt.</a>
sign_up_button = Rekisteröidy nyt. sign_up_button = Rekisteröidy nyt.
manual_activation_only = Ota yhteyttä järjestelmänvalvojaanne viimeistelläksesi aktivoinnin. 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] [mail]
view_it_on=Näytä %s 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>, hi_user_x=Hei <b>%s</b>,
activate_account=Ole hyvä ja aktivoi tilisi 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ä: 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 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. 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. target_branch_not_exist=Kohde branchia ei ole olemassa.
Pronouns = Pronomini 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] [user]
@ -585,6 +624,16 @@ following.title.one = Seurataan
following.title.few = Seurataan following.title.few = Seurataan
joined_on = Liittynyt %s 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>. 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] [settings]
@ -597,10 +646,10 @@ avatar=Profiilikuva
ssh_gpg_keys=SSH-/GPG-avaimet ssh_gpg_keys=SSH-/GPG-avaimet
social=Sosiaaliset tilit social=Sosiaaliset tilit
applications=Sovellukset applications=Sovellukset
orgs=Hallitse organisaatioita orgs=Organisaatiot
repos=Repot repos=Repot
delete=Poista tili delete=Poista tili
twofa=Kaksivaiheinen todennus twofa=Kaksivaiheinen todennus (TOTP)
account_link=Linkitetyt tilit account_link=Linkitetyt tilit
organization=Organisaatiot organization=Organisaatiot
webauthn=Kaksivaiheinen todennus (Turva-avaimet) 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 full_name=Koko nimi
website=Nettisivut website=Nettisivut
location=Sijainti location=Sijainti
update_theme=Päivitä teema update_theme=Vaihda teema
update_profile=Päivitä profiili update_profile=Päivitä profiili
update_language=Päivitä kieli update_language=Vaihda kieli
update_language_success=Kieli on päivitetty. update_language_success=Kieli on päivitetty.
update_profile_success=Profiilisi on päivitetty. update_profile_success=Profiilisi on päivitetty.
change_username=Käyttäjätunnuksesi on muutettu. 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_assignee=Osoitettu henkilölle
comment_type_group_title=Otsikko comment_type_group_title=Otsikko
comment_type_group_branch=Haara 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_deadline=Määräaika
comment_type_group_dependency=Riippuvuus comment_type_group_dependency=Riippuvuus
comment_type_group_lock=Lukituksen tila 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 lookup_avatar_by_mail=Hae profiilikuva sähköpostin perusteella
federated_avatar_lookup=Ulkopuolinen profiilikuvan haku 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 choose_new_avatar=Valitse uusi profiilikuva
update_avatar=Päivitä profiilikuva update_avatar=Päivitä profiilikuva
delete_current_avatar=Poista nykyinen 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 emails=Sähköposti osoitteet
manage_emails=Hallitse sähköpostiosoitteita manage_emails=Hallitse sähköpostiosoitteita
manage_themes=Valitse oletusteema manage_themes=Oletusteema
manage_openid=Hallitse OpenID osoitteita manage_openid=OpenID-osoitteet
theme_desc=mä on sivuston oletusteemasi. theme_desc=tä teemaa käytetään verkkosivuston käyttöliittymässä, kun olet sisäänkirjautuneena.
primary=Ensisijainen primary=Ensisijainen
activated=Aktivoitu activated=Aktivoitu
requires_activation=Vaatii aktivoinnin requires_activation=Vaatii aktivoinnin
@ -673,7 +722,7 @@ theme_update_error=Valittua teemaa ei löydy.
openid_deletion=Poista OpenID-osoite openid_deletion=Poista OpenID-osoite
openid_deletion_success=OpenID-osoite on poistettu. openid_deletion_success=OpenID-osoite on poistettu.
add_new_email=Lisää uusi sähköpostiosoite 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_email=Lisää sähköpostiosoite
add_openid=Lisää OpenID URI add_openid=Lisää OpenID URI
add_email_success=Uusi sähköpostiosoite on lisätty. 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_ssh_keys=Hallitse SSH-avaimia
manage_gpg_keys=Hallitse GPG-avaimia manage_gpg_keys=Hallitse GPG-avaimia
add_key=Lisää avain add_key=Lisää avain
ssh_desc=Nämä julkiset SSH-avaimet on liitetty tiliisi. Vastaavat yksityiset avaimet antavat täyden pääsyn repoihisi. 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. Pidä yksityiset avaimet turvassa, koska ne mahdollistavat committien todentamisen. 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. 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ä. gpg_helper=<strong>Tarvitsetko apua?</strong> Katso GitHubin opas <a href="%s">GPG</a>:stä.
add_new_key=Lisää SSH avain add_new_key=Lisää SSH avain
add_new_gpg_key=Lisää GPG-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_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_gpg_placeholder=Alkaa sanoilla "-----BEGIN PGP PUBLIC KEY BLOCK-----"
ssh_key_name_used=Samanniminen SSH avain on jo olemassa tililläsi. 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_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. 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_help=Voit luoda allekirjoituksen käyttäen:
gpg_token_code=echo "%s" | gpg -a --default-key %s --detach-sig gpg_token_code=echo "%s" | gpg -a --default-key %s --detach-sig
gpg_token_signature=Panssaroitu GPG-allekirjoitus 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=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_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 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=Pääsymerkki
ssh_token_help=Voit luoda allekirjoituksen käyttäen: ssh_token_help=Voit luoda allekirjoituksen käyttäen:
ssh_token_signature=Panssaroitu SSH-allekirjoitus 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 subkeys=Aliavaimet
key_id=Avain ID key_id=Avain ID
key_name=Avaimen nimi key_name=Avaimen nimi
@ -730,7 +779,7 @@ can_read_info=Luku
can_write_info=Kirjoitus can_write_info=Kirjoitus
show_openid=Näytä profiilissa show_openid=Näytä profiilissa
hide_openid=Piilota profiilista 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_social=Hallitse liitettyjä sosiaalisia tilejä
manage_access_token=Hallitse pääsymerkkejä manage_access_token=Hallitse pääsymerkkejä
@ -751,7 +800,7 @@ create_oauth2_application=Luo uusi OAuth2-sovellus
create_oauth2_application_button=Luo sovellus create_oauth2_application_button=Luo sovellus
oauth2_application_name=Sovelluksen nimi oauth2_application_name=Sovelluksen nimi
save_application=Tallenna save_application=Tallenna
oauth2_regenerate_secret=Luo secret uudelleen oauth2_regenerate_secret=Luo salaisuus uudelleen
oauth2_regenerate_secret_hint=Kadotitko secretin? oauth2_regenerate_secret_hint=Kadotitko secretin?
oauth2_application_edit=Muokkaa oauth2_application_edit=Muokkaa
@ -767,10 +816,10 @@ twofa_enrolled=Tiliisi on otettu käyttöön kaksivaiheinen vahvistus. Ota palau
webauthn_nickname=Nimimerkki 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. manage_account_links_desc=Nämä ulkoiset tilit on linkitetty Forgejo tiliisi.
link_account=Yhdistä tili 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_desc=Linkitetyn tilin poistaminen peruuttaa pääsyn Forgejo-tiliisi linkitetyn tili kautta. Jatketaanko?
remove_account_link_success=Linkitetty tili on poistettu. remove_account_link_success=Linkitetty tili on poistettu.
@ -790,7 +839,7 @@ visibility.limited=Rajattu
visibility.private=Yksityinen visibility.private=Yksityinen
hints = Vihjeet hints = Vihjeet
user_block_success = Käyttäjä on estetty. 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 keep_activity_private = Piilota toiminta profiilisivulla
update_oauth2_application_success = Päivitit OAuth2-sovelluksen. update_oauth2_application_success = Päivitit OAuth2-sovelluksen.
webauthn_delete_key = Poista turva-avain 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 retype_new_password = Vahvista uusi salasana
create_oauth2_application_success = Loit uuden OAuth2-sovelluksen. create_oauth2_application_success = Loit uuden OAuth2-sovelluksen.
repos_none = Et omista yhtäkään repositoriota. 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ä email_notifications.disable = Poista sähköposti-ilmoitukset käytöstä
webauthn_register_key = Lisää turva-avain webauthn_register_key = Lisää turva-avain
blocked_users = Estetyt käyttäjät 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. webauthn_alternative_tip = Saatat haluta määrittää lisätodennusmenetelmän.
twofa_disable = Poista kaksivaiheinen todennus käytöstä twofa_disable = Poista kaksivaiheinen todennus käytöstä
twofa_disable_desc = Kaksivaiheisen todennuksen poistaminen asettaa tilisi aiempaa suurempaan uhkaan. Jatketaanko? 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] [repo]
owner=Omistaja owner=Omistaja
@ -871,7 +944,7 @@ repo_gitignore_helper=Valitse .gitignore-mallit
issue_labels=Ongelmien tunnisteet issue_labels=Ongelmien tunnisteet
issue_labels_helper=Valitse pohja ongelmien nimilapuille. issue_labels_helper=Valitse pohja ongelmien nimilapuille.
license=Lisenssi license=Lisenssi
license_helper=Valitse lisenssitiedosto. license_helper=Valitse lisenssitiedosto
readme=README readme=README
auto_init=Alusta repo (Luo .gitignore, License ja README) auto_init=Alusta repo (Luo .gitignore, License ja README)
create_repo=Luo repo create_repo=Luo repo
@ -935,7 +1008,7 @@ filter_branch_and_tag=Suodata haara tai tagi
branches=Branchit branches=Branchit
tags=Tagit tags=Tagit
issues=Ongelmat issues=Ongelmat
pulls=Pull-pyynnöt pulls=Vetopyynnöt
project_board=Projektit project_board=Projektit
packages=Paketit packages=Paketit
labels=Tunnisteet labels=Tunnisteet
@ -1270,7 +1343,7 @@ activity.new_issues_count_1=Uusi ongelma
activity.new_issues_count_n=uutta ongelmaa activity.new_issues_count_n=uutta ongelmaa
activity.new_issue_label=Avoinna activity.new_issue_label=Avoinna
activity.unresolved_conv_label=Auki 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_pushed_1=on työntänyt
activity.git_stats_file_1=%d tiedosto activity.git_stats_file_1=%d tiedosto
activity.git_stats_file_n=%d tiedostoa 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_url_format=Ulkoisen vikaseurannan URL muoto
settings.tracker_issue_style.numeric=Numeerinen settings.tracker_issue_style.numeric=Numeerinen
settings.tracker_issue_style.alphanumeric=Aakkosnumeerinen 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.danger_zone=Vaaravyöhyke
settings.new_owner_has_same_repo=Uudella omistajalla on jo samanniminen repo. Ole hyvä ja valitse toinen nimi. 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.title=Siirrä omistajuus
settings.transfer_form_title=Syötä repon nimi vahvistuksena: 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_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.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.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.wiki_deletion_success=Repon wiki data on poistettu.
settings.delete=Poista tämä repo settings.delete=Poista tämä repo
settings.delete_desc=Repon poistaminen on pysyvä eikä voi peruuttaa. 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_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_name=Koukun nimi
settings.githook_content=Koukun sisältö settings.githook_content=Koukun sisältö
settings.update_githook=Päivitys koukku settings.update_githook=Päivitä koukku
settings.payload_url=Kohde URL settings.payload_url=Kohde URL
settings.http_method=HTTP-menetelmä settings.http_method=HTTP-menetelmä
settings.secret=Salaus settings.secret=Salaus
@ -1360,7 +1433,7 @@ settings.event_push_desc=Git push repoon.
settings.event_repository=Repo settings.event_repository=Repo
settings.event_repository_desc=Repo luotu tai poistettu. settings.event_repository_desc=Repo luotu tai poistettu.
settings.event_header_issue=Ongelmien tapahtumat 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_issues_desc=Ongelma avattu, suljettu, avattu uudelleen tai muokattu.
settings.event_issue_assign=Ongelma määritetty settings.event_issue_assign=Ongelma määritetty
settings.event_issue_assign_desc=Ongelma osoitettu tai osoitus poistettu. 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_milestone_desc=Merkkipaalu lisätty, poistettu tai muokattu.
settings.event_issue_comment_desc=Ongelman kommentti luotu, muokattu tai poistettu. settings.event_issue_comment_desc=Ongelman kommentti luotu, muokattu tai poistettu.
settings.event_header_pull_request=Vetopyyntöjen tapahtumat 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.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.active_helper=Tiedot käynnistetyistä tapahtumista lähetetään tähän webkoukun URL-osoitteeseen.
settings.add_hook_success=Uusi webkoukku on lisätty. 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_filelist=LFS-tiedostot tallennettu tähän repoon
settings.lfs_no_lfs_files=LFS-tiedostoja ei ole 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_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_noattribute=Tällä polulla ei ole lukittavaa attribuuttia oletushaarassa
settings.lfs_delete=Poista LFS-tiedosto OID:lla %s 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? 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_width=Leveys
diff.file_image_height=Korkeus diff.file_image_height=Korkeus
diff.file_byte_size=Koko 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_single_comment=Lisää yksittäinen kommentti
diff.comment.add_review_comment=Lisää kommentti diff.comment.add_review_comment=Lisää kommentti
diff.comment.start_review=Aloita tarkistus 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. 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. 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ä 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ä milestones.filter_sort.earliest_due_data = Lähin määräpäivä
issues.filter_type.reviewed_by_you = Katselmoitu toimestasi issues.filter_type.reviewed_by_you = Katselmoitu toimestasi
settings.units.overview = Yleisnäkymä 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.update_settings_no_unit = Repositorion tulisi sallia edes jonkinlainen vuorovaikutus.
settings.units.add_more = Ota lisää käyttöön settings.units.add_more = Ota lisää käyttöön
settings.add_team_success = Tiimillä on nyt pääsy repositorioon. 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_loading_info = Tämä saattaa kestää hetken…
component_failed_to_load = Odottamaton virhe. component_failed_to_load = Odottamaton virhe.
component_loading = Ladataan %s... 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]
org_name_holder=Organisaation nimi org_name_holder=Organisaation nimi
@ -1925,7 +2093,7 @@ teams.members=Tiimin jäsenet
teams.update_settings=Päivitä asetukset teams.update_settings=Päivitä asetukset
teams.delete_team=Poista tiimi teams.delete_team=Poista tiimi
teams.add_team_member=Lisää tiimin jäsen 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_desc=Tiimin poisto peruuttaa sen jäseniltä oikeuden päästä tiimin varastoihin. Jatketaanko?
teams.delete_team_success=Tiimi on poistettu. 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. 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.leave.detail = Haluatko varmasti poistua tiimistä "%s"?
teams.invite.title = Sinut on kutsuttu tiimiin <strong>%s</strong> organisaatiossa <strong>%s</strong>. 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. 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 code = Koodi
teams.remove_all_repos_title = Poista kaikki tiimin repot teams.remove_all_repos_title = Poista kaikki tiimin repot
form.name_reserved = Organisaation nimi "%s" on varattu. 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ö team_access_desc = Repositorion käyttö
teams.specific_repositories = Määritetyt repositoriot teams.specific_repositories = Määritetyt repositoriot
open_dashboard = Avaa kojelauta 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] [admin]
dashboard=Kojelauta dashboard=Kojelauta
@ -1975,8 +2154,8 @@ dashboard.operation_switch=Vaihda
dashboard.operation_run=Suorita dashboard.operation_run=Suorita
dashboard.delete_inactive_accounts=Poista kaikki aktivoimattomat käyttäjät dashboard.delete_inactive_accounts=Poista kaikki aktivoimattomat käyttäjät
dashboard.delete_repo_archives=Poista kaikki repojen arkistot (ZIP, TAR.GZ, jne..) dashboard.delete_repo_archives=Poista kaikki repojen arkistot (ZIP, TAR.GZ, jne..)
dashboard.server_uptime=Palvelimen Uptime dashboard.server_uptime=Palvelimen uptime
dashboard.current_goroutine=Nykyiset Goroutinet dashboard.current_goroutine=Nykyiset goroutinet
dashboard.current_memory_usage=Nykyinen muistinkäyttö dashboard.current_memory_usage=Nykyinen muistinkäyttö
dashboard.total_memory_allocated=Yhteensä muistia varattu dashboard.total_memory_allocated=Yhteensä muistia varattu
dashboard.memory_obtained=Muistia saatu dashboard.memory_obtained=Muistia saatu
@ -2152,7 +2331,7 @@ config.default_visibility_organization=Uuden organisaation oletusnäkyvyys
config.webhook_config=Webkoukkujen asetukset config.webhook_config=Webkoukkujen asetukset
config.queue_length=Jonon pituus config.queue_length=Jonon pituus
config.deliver_timeout=Toimitus aikakatkaisu config.deliver_timeout=Toimituksen aikakatkaisu
config.mailer_enabled=Käytössä config.mailer_enabled=Käytössä
config.mailer_name=Nimi config.mailer_name=Nimi
@ -2290,6 +2469,17 @@ config.custom_conf = Asetustiedoston polku
config.reset_password_code_lives = Palautuskoodin vanhenemisaika config.reset_password_code_lives = Palautuskoodin vanhenemisaika
monitor.processes_count = %d prosessia monitor.processes_count = %d prosessia
config.default_allow_create_organization = Salli organisaatioiden luominen oletuksena 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] [action]
@ -2328,6 +2518,7 @@ raw_minutes=minuuttia
default_message=Pudota tiedostot tähän tai klikkaa aluetta ladataksesi tiedoston. default_message=Pudota tiedostot tähän tai klikkaa aluetta ladataksesi tiedoston.
invalid_input_type=Tämäntyyppisiä tiedostoja ei voi ladata. invalid_input_type=Tämäntyyppisiä tiedostoja ei voi ladata.
remove_file=Poista tiedosto remove_file=Poista tiedosto
file_too_big = Tiedoston koko ({{filesize}} Mt) ylittää enimmäisrajan ({{maxFilesize}} Mt).
[notification] [notification]
notifications=Ilmoitukset notifications=Ilmoitukset
@ -2345,9 +2536,10 @@ subscriptions = Tilaukset
[gpg] [gpg]
error.no_committer_account=Committaajan sähköpostiosoitteeseen ei ole linkitetty tiliä 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 error.extract_sign = Allekirjoituksen purkaminen epäonnistui
default_key = Allekirjoitettu oletusavaimella default_key = Allekirjoitettu oletusavaimella
error.failed_retrieval_gpg_keys = Ei saatu yhtäkään kommitin tekijän tiliin liitettyä avainta
[units] [units]
unit = Yksikkö unit = Yksikkö
@ -2452,6 +2644,26 @@ settings.link.success = Repositorion linkki päivitettiin onnistuneesti.
settings.link.button = Päivitä repositorion linkki settings.link.button = Päivitä repositorion linkki
owner.settings.cleanuprules.preview.overview = %d pakettia on ajastettu poistettavaksi. owner.settings.cleanuprules.preview.overview = %d pakettia on ajastettu poistettavaksi.
owner.settings.cargo.initialize.success = Cargo-indeksi luotiin onnistuneesti. 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] [secrets]
creation.failed = Salaisuuden lisääminen epäonnistui. creation.failed = Salaisuuden lisääminen epäonnistui.
@ -2593,3 +2805,4 @@ pull_kind = Etsi pull-vetoja...
commit_kind = Etsi kommitteja... commit_kind = Etsi kommitteja...
fuzzy = Sumea fuzzy = Sumea
runner_kind = Etsi ajajia... 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_repo.title = Nouveau dépôt
new_migrate.link = Nouvelle migration new_migrate.link = Nouvelle migration
new_org.link = Nouvelle organisation new_org.link = Nouvelle organisation
copy_path = Copier le chemin
[aria] [aria]
navbar=Barre de navigation navbar=Barre de navigation
@ -811,7 +812,7 @@ manage_emails=Gérer les adresses courriels
manage_themes=Thème par défaut manage_themes=Thème par défaut
manage_openid=Adresses OpenID 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. 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 primary=Principale
activated=Activé activated=Activé
requires_activation=Nécessite une activation 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. language.description = Cette langue sera enregistrée dans votre compte et utilisée comme langue par défaut après votre connexion.
[repo] [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=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. 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 repo_name=Nom du dépôt
@ -1095,7 +1096,7 @@ issue_labels=Étiquettes
issue_labels_helper=Sélectionner un jeu d'étiquettes issue_labels_helper=Sélectionner un jeu d'étiquettes
license=Licence license=Licence
license_helper=Sélectionner une 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=LISEZMOI
readme_helper=Choisissez un modèle de fichier 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. 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.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.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.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.button=Désarchiver ce dépôt
settings.unarchive.header=Réhabiliter 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. 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.add = Ajouter une note
diff.git-notes.remove-header = Supprimer la 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 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] [graphs]
component_loading = Chargement %s... 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.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.registry.info=Choisissez $branch et $repository dans la liste ci-dessous.
alpine.install=Pour installer le paquet, exécutez la commande suivante : 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.branches=Branches
alpine.repository.repositories=Dépôts alpine.repository.repositories=Dépôts
alpine.repository.architectures=Architectures 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.type=Type d'image
container.details.platform=Plateforme container.details.platform=Plateforme
container.pull=Tirez l'image depuis un terminal : container.pull=Tirez l'image depuis un terminal :
container.digest=Empreinte : container.digest=Empreinte
container.multi_arch=SE / Arch container.multi_arch=SE / Arch
container.layers=Calques d'image container.layers=Calques d'image
container.labels=Labels container.labels=Labels
@ -3797,6 +3802,7 @@ arch.version.conflicts = Conflits
arch.version.replaces = Remplace arch.version.replaces = Remplace
arch.version.backup = Sauvegarde arch.version.backup = Sauvegarde
arch.version.makedepends = Faire des dépendances arch.version.makedepends = Faire des dépendances
container.images.title = Images
[secrets] [secrets]
secrets=Secrets secrets=Secrets

View file

@ -9,7 +9,7 @@ sign_in_with_provider = Iniciar Sesión con %s
sign_in_or = ou sign_in_or = ou
sign_out = Pechar Sesión sign_out = Pechar Sesión
sign_up = Rexístrate sign_up = Rexístrate
link_account = Vincular Conta link_account = Vincular conta
register = Rexistro register = Rexistro
version = Vesión version = Vesión
powered_by = Desenvolvido por %s powered_by = Desenvolvido por %s
@ -18,8 +18,8 @@ template = Modelo
notifications = Notificacións notifications = Notificacións
active_stopwatch = Activar Rastrexador de Tempo active_stopwatch = Activar Rastrexador de Tempo
create_new = Crear… create_new = Crear…
user_profile_and_more = Perfil e Configuración… user_profile_and_more = Perfil e configuración…
signed_in_as = Inicia Sesión como signed_in_as = Sesión iniciada como
enable_javascript = Este sitio web require JavaScript. enable_javascript = Este sitio web require JavaScript.
toc = Táboa de Contidos toc = Táboa de Contidos
licenses = Licenzas licenses = Licenzas
@ -29,17 +29,17 @@ email = Enderezo Electrónico
password = Contrasinal password = Contrasinal
re_type = Confirme o contrasinal re_type = Confirme o contrasinal
captcha = CAPTCHA captcha = CAPTCHA
twofa = Autenticación de Dous Factores twofa = Autenticación de dobre factor
passcode = Código de Acceso passcode = Código de acceso
webauthn_insert_key = Insira a súa Chave de Seguranza webauthn_insert_key = Insira a súa clave de seguridade
webauthn_press_button = Preme o botón da súa Chave de Seguranza 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_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_error = Non se puido ler a súa clave de seguridade.
webauthn_unsupported_browser = O seu Navegador non Soporta Actualmente WebAuthn. webauthn_unsupported_browser = O seu navegador non soporta WebAuthn actualmente.
webauthn_error_unknown = Produciuse un Erro Descoñecido.Téntao de novo. 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_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_duplicated = A clave de seguridade non está permitida para esta solicitude. Asegúrese de que a clave non estea xa rexistrada.
webauthn_error_empty = Debes Definir un Nome para esta Chave. webauthn_error_empty = Debe definir un nome para esta clave.
webauthn_reload = Recarga webauthn_reload = Recarga
repository = Repositorio repository = Repositorio
organization = Organización organization = Organización
@ -49,21 +49,21 @@ new_migrate = Nova Migración
new_mirror = Novo Espello new_mirror = Novo Espello
new_fork = Nova Bifurcación do Repositorio new_fork = Nova Bifurcación do Repositorio
new_org = Nova Organización new_org = Nova Organización
new_project = Novo Proxecto new_project = Novo proxecto
new_project_column = Nova Columna new_project_column = Nova columna
manage_org = Xestionar Organizacións manage_org = Xestionar Organizacións
admin_panel = Administración do Sitio admin_panel = Administración da páxina
account_settings = Axustes da Conta account_settings = Axustes da Conta
settings = Configuración settings = Configuración
your_profile = Perfil your_profile = Perfil
your_starred = Destacado your_starred = Destacado
your_settings = Configuracións your_settings = Configuración
all = Todo all = Todo
sources = Fontes sources = Fontes
mirrors = Espellos mirrors = Espellos
collaborative = Colaborativo collaborative = Colaborativo
forks = Derivacións forks = Derivacións
pull_requests = Pull Requests pull_requests = Solicitudes de fusión
milestones = Fitos milestones = Fitos
ok = OK ok = OK
cancel = Cancelar cancel = Cancelar
@ -71,57 +71,57 @@ retry = Volve Tentar
rerun = Volve Executar rerun = Volve Executar
rerun_all = Volve Executar Todos os Traballos rerun_all = Volve Executar Todos os Traballos
add = Engadir add = Engadir
add_all = Engadir Todo add_all = Engadir todo
remove_all = Quitar Todo remove_all = Quitar todo
remove_label_str = Eliminar Elemento "%s" remove_label_str = Eliminar elemento "%s"
edit = Editar edit = Editar
enabled = Activado enabled = Activado
locked = Bloqueado locked = Bloqueado
copy = Copiar copy = Copiar
copy_url = Copiar URL copy_url = Copiar URL
copy_branch = Copiar o Nome da Rama copy_branch = Copiar o nome da rama
copy_success = Copiado! copy_success = Copiado!
copy_error = Erro na Copia copy_error = Erro na copia
write = Escribir write = Escribir
preview = Vista Previa preview = Vista previa
loading = Cargando… loading = Cargando…
error = Erro error = Erro
go_back = Volver Atrás go_back = Volver atrás
never = Nunca never = Nunca
unknown = Descoñecido unknown = Descoñecido
rss_feed = Feed RSS rss_feed = Feed RSS
unpin = Desprender unpin = Desprender
artifacts = Artefactos 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 archived = Arquivado
concept_system_global = Global concept_system_global = Global
access_token = Token de Acceso access_token = Token de Acceso
activities = Actividades activities = Actividades
save = Gardar save = Gardar
copy_content = Copiar Contido copy_content = Copiar contido
language = Linguaxe language = Linguaxe
copy_hash = Copiar hash copy_hash = Copiar hash
twofa_scratch = Código Scratch de Dous Factores 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. 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 = Problemas issues = Incidencias
disabled = Desactivado disabled = Desactivado
error404 = A páxina á que estás tentando acceder <strong>Non Existe</strong> ou <strong>Non tes Autorización</strong> para vela. 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 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_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. 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 remove = Quitar
view = Vista view = Ver
copy_type_unsupported = Este tipo de ficheiro non se pode copiar copy_type_unsupported = Este tipo de ficheiro non se pode copiar
concept_user_organization = Organización concept_user_organization = Organización
show_timestamps = Mostrar M0arcas de Tempo show_timestamps = Mostrar marcas de tempo
show_log_seconds = Mostrar Segundos show_log_seconds = Mostrar segundos
download_logs = Descargar Rexistros download_logs = Descargar rexistros
name = Nome name = Nome
value = Valor 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 show_full_screen = Mostrar Pantalla Completa
more_items = Máis items more_items = Máis elementos
toggle_menu = Alternar Menú toggle_menu = Alternar menú
filter = Filtro filter = Filtro
filter.clear = Borrar filtros filter.clear = Borrar filtros
filter.is_archived = Arquivado filter.is_archived = Arquivado
@ -140,6 +140,14 @@ pin = Aproximada
filter.private = Privado filter.private = Privado
copy_generic = Copiar ao portapapeis copy_generic = Copiar ao portapapeis
test = Test 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] [aria]
navbar = Barra de Navegación navbar = Barra de Navegación
@ -170,9 +178,23 @@ buttons.ref.tooltip = Referencia un problema ou pull request
[search] [search]
search = Buscar... search = Buscar...
type_tooltip = Tipo de busca type_tooltip = Tipo de procura
repo_kind = Buscar repositorios... repo_kind = Buscar repositorios...
user_kind = Buscar usuarios... 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] [startpage]
platform = Multiplataforma 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.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. 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_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. 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 auths.tip.gitlab_new = Registra una nuova applicazione su %s
config_summary = Riepilogo config_summary = Riepilogo

View file

@ -337,7 +337,7 @@ allow_password_change=사용자에게 비밀번호 변경을 요청 (권장됨)
reset_password_mail_sent_prompt=확인 메일이 <b>%s</b>로 전송되었습니다. 받은 편지함으로 도착한 메일을 %s 안에 확인해서 비밀번호 찾기 절차를 완료하십시오. reset_password_mail_sent_prompt=확인 메일이 <b>%s</b>로 전송되었습니다. 받은 편지함으로 도착한 메일을 %s 안에 확인해서 비밀번호 찾기 절차를 완료하십시오.
active_your_account=계정 활성화 active_your_account=계정 활성화
account_activated=계정이 활성화 되었습니다 account_activated=계정이 활성화 되었습니다
prohibit_login = prohibit_login =
resent_limit_prompt=활성화를 위한 이메일을 이미 전송했습니다. 3분 내로 이메일을 받지 못한 경우 재시도해주세요. resent_limit_prompt=활성화를 위한 이메일을 이미 전송했습니다. 3분 내로 이메일을 받지 못한 경우 재시도해주세요.
has_unconfirmed_mail=안녕하세요 %s, 이메일 주소(<b>%s</b>)가 확인되지 않았습니다. 확인 메일을 받으시지 못하겼거나 새로운 확인 메일이 필요하다면, 아래 버튼을 클릭해 재발송하실 수 있습니다. has_unconfirmed_mail=안녕하세요 %s, 이메일 주소(<b>%s</b>)가 확인되지 않았습니다. 확인 메일을 받으시지 못하겼거나 새로운 확인 메일이 필요하다면, 아래 버튼을 클릭해 재발송하실 수 있습니다.
resend_mail=여기를 눌러 확인 메일 재전송 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 repository = Repositorium
organization = Vereenigung organization = Vereenigung
new_fork = Neje Repositoriums-Gabel new_fork = Neje Repositoriums-Gabel
dashboard = Mien Disk dashboard = Kontor
logo = Logo logo = Logo
active_stopwatch = Aktive Tied-Erfatens active_stopwatch = Aktive Tied-Erfatens
password = Passwoord password = Passwoord
@ -150,7 +150,7 @@ fuzzy = um de Slag
fuzzy_tooltip = Ok Resultaten wiesen, wat dicht to de Söökwoorden passen fuzzy_tooltip = Ok Resultaten wiesen, wat dicht to de Söökwoorden passen
union = Passt union = Passt
union_tooltip = Resultaten wiesen, wat to eets of anner vun de mit Leegtekens trennt Söökwoorden passen 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 exact_tooltip = Blots Resultaten wiesen, wat akkeraat to de Söökwoord passen
regexp = RegEx regexp = RegEx
regexp_tooltip = De Söökwoord as Regel-Utdruck behanneln 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] [home]
uname_holder = Brukernaam of E-Mail-Adress uname_holder = Brukernaam of E-Mail-Adress
switch_dashboard_context = Mien-Disk-Umgeven wesseln switch_dashboard_context = Kontor-Umgeven wesseln
my_repos = Repositoriums my_repos = Repositoriums
my_orgs = Vereenigungen my_orgs = Vereenigungen
view_home = %s wiesen view_home = %s wiesen
@ -521,8 +521,8 @@ followers.title.few = Nagahers
following.title.one = Gaht na following.title.one = Gaht na
followers_one = %d Nagaher followers_one = %d Nagaher
followers_few = %d Nagahers followers_few = %d Nagahers
following_one = %d gaht na following_one = gaht %d na
following_few = %d gahn na following_few = gaht %d na
follow = Nagahn follow = Nagahn
unfollow = Nich mehr nagahn unfollow = Nich mehr nagahn
block_user = Bruker blockeren block_user = Bruker blockeren
@ -600,7 +600,7 @@ change_password = Passwoord ännern
update_password = Passwoord vernejen update_password = Passwoord vernejen
old_password = Stedenwies Passwoord old_password = Stedenwies Passwoord
new_password = Nejes 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 primary = Höövd
activated = Aktiveert activated = Aktiveert
requires_activation = Mutt aktiveert worden 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. 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. 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. 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. 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. 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. 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 generate_from = Maken ut
repo_desc = Beschrieven repo_desc = Beschrieven
admin.update_flags = Flaggen vernejen 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. 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.enabled_flags = Flaggen, wat för deeses Repositorium anknipst sünd:
admin.failed_to_replace_flags = Kunn Repositoriums-Flaggen nich utwesseln 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.matrix.room_id = Ruum-ID
settings.archive.header = Deeses Repo archiveren settings.archive.header = Deeses Repo archiveren
settings.archive.error_ismirror = Du kannst een spegelt Repo nich 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.button = Repo ut Archiv torügghalen
settings.unarchive.success = Dat Repo is nu nich mehr archiveert. 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. 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.update_avatar_success = Dat Repositoriums-Kontobill is verneeit worden.
settings.lfs_findcommits = Kommitterens finnen settings.lfs_findcommits = Kommitterens finnen
settings.protected_branch_required_approvals_min = Nödige Tostimmens könen nich negativ wesen. 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.tags.protection.create = Örder hentofögen
settings.bot_token = Bot-Teken settings.bot_token = Bot-Teken
settings.matrix.message_type = Narichten-Aard 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.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.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.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_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 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.num_reviews_one = %d Nakieken
issues.summary_card_alt = Tosamenfatens-Kaart vun eenem Gefall mit de Naam »%s« im Repositorium %s issues.summary_card_alt = Tosamenfatens-Kaart vun eenem Gefall mit de Naam »%s« im Repositorium %s
issues.num_reviews_few = %d Nakiekens 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] [repo.permissions]
code.read = <b>Lesen:</b> De Quelltext vun deesem Repositorium ankieken un klonen. 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_full_name_holder = Kumpleter Naam vun de Vereenigung
org_name_helper = Vereenigungs-Namen sallen kört un lich to marken wesen. org_name_helper = Vereenigungs-Namen sallen kört un lich to marken wesen.
create_org = Vereenigung maken create_org = Vereenigung maken
open_dashboard = »Mien Disk« opmaken open_dashboard = Kontor opmaken
repo_updated = %s verneeit repo_updated = %s verneeit
members = Liddmaten members = Liddmaten
teams = Klottjen teams = Klottjen
@ -2693,7 +2694,7 @@ teams.specific_repositories_helper = Liddmaten hebben blots Togriep up Repositor
teams.all_repositories = All Repositoriums teams.all_repositories = All Repositoriums
[admin] [admin]
dashboard = Mien Disk dashboard = Kontor
self_check = Sülvst-Överprüfen self_check = Sülvst-Överprüfen
identity_access = Sülvst & Togang identity_access = Sülvst & Togang
users = Brukerkonten users = Brukerkonten
@ -3183,7 +3184,7 @@ notices.view_detail_header = Naricht-Informatioonen
self_check.no_problem_found = Noch keen Probleem funnen. 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_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_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. 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 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 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.type = Avbill-Aard
container.details.platform = Plattfoorm container.details.platform = Plattfoorm
container.pull = Haal deeses Avbill vun de Oorderreeg: container.pull = Haal deeses Avbill vun de Oorderreeg:
container.digest = Prüüfsumm: container.digest = Prüüfsumm
container.multi_arch = BS / Arch container.multi_arch = BS / Arch
container.layers = Avbill-Schichten container.layers = Avbill-Schichten
cran.registry = Richt deese Paketlist in diener <code>Rprofile.site</code>-Datei in: 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 = 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. 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: conan.install = Um dat Paket mit Conan to installeren, föhr deese Oorder ut:
container.images.title = Avbillers
[secrets] [secrets]
secrets = Geheemsten secrets = Geheemsten
@ -3611,9 +3613,9 @@ deletion = Geheemst wegdoon
deletion.success = Dat Geheemst is wegdaan worden. deletion.success = Dat Geheemst is wegdaan worden.
deletion.failed = Kunn Geheemst nich wegdoon. deletion.failed = Kunn Geheemst nich wegdoon.
management = Geheemsten verwalten 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? 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]
actions = Aktioonen actions = Aktioonen

View file

@ -166,6 +166,7 @@ new_repo.link = Nieuwe repository
new_repo.title = Nieuwe repository new_repo.title = Nieuwe repository
new_migrate.link = Nieuwe migratie new_migrate.link = Nieuwe migratie
new_org.link = Nieuwe organisatie new_org.link = Nieuwe organisatie
copy_path = Kopieer bestandspad
[aria] [aria]
navbar = Navigatiebalk navbar = Navigatiebalk
@ -3476,7 +3477,7 @@ self_check.database_inconsistent_collation_columns = Database gebruikt collatie
monitor.stacktrace = Stacktrace monitor.stacktrace = Stacktrace
monitor.download_diagnosis_report = Diagnoserapport downloaden 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_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 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.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 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.type = Afbeelding Type
container.details.platform = Platform container.details.platform = Platform
container.pull = Haal de afbeelding op vanaf de terminal: container.pull = Haal de afbeelding op vanaf de terminal:
container.digest = Digest: container.digest = Digest
container.multi_arch = Besturingssysteem / Arch container.multi_arch = Besturingssysteem / Arch
container.layers = Afbeelding Lagen container.layers = Afbeelding Lagen
container.labels = Labels container.labels = Labels
@ -3800,6 +3801,7 @@ arch.version.conflicts = Conflicten
arch.version.replaces = Vervangt arch.version.replaces = Vervangt
arch.version.backup = Back-up arch.version.backup = Back-up
arch.version.makedepends = Maken is afhankelijk van arch.version.makedepends = Maken is afhankelijk van
container.images.title = Afbeeldingen
[secrets] [secrets]
secrets = Geheimen secrets = Geheimen

View file

@ -166,6 +166,7 @@ new_migrate.link = Nova migração
new_org.link = Nova organização new_org.link = Nova organização
test = Teste test = Teste
error413 = Você esgotou sua cota. error413 = Você esgotou sua cota.
copy_path = Copiar caminho
[aria] [aria]
navbar=Barra de navegação navbar=Barra de navegação
@ -812,7 +813,7 @@ manage_emails=Gerenciar endereços de e-mail
manage_themes=Tema padrão manage_themes=Tema padrão
manage_openid=Endereços OpenID 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. 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 primary=Principal
activated=Ativado activated=Ativado
requires_activation=Requer ativação requires_activation=Requer ativação
@ -1093,7 +1094,7 @@ issue_labels=Etiquetas
issue_labels_helper=Selecione um conjunto de etiquetas issue_labels_helper=Selecione um conjunto de etiquetas
license=Licença license=Licença
license_helper=Selecione um arquivo de 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=LEIA-ME
readme_helper=Selecione um modelo de arquivo README readme_helper=Selecione um modelo de arquivo README
readme_helper_desc=Aqui você pode escrever uma descrição completa para o seu projeto. 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.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=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.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.branchsettings_unavailable=Configurações de branch não estão disponíveis em repositórios arquivados.
settings.archive.tagsettings_unavailable=As configurações de tag não estão disponíveis se o repositório estiver arquivado. 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.update_avatar_success=O avatar do repositório foi atualizado.
settings.lfs=LFS settings.lfs=LFS
settings.lfs_filelist=Arquivos LFS armazenados neste repositório 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.button = Desarquivar repositório
settings.unarchive.header = Desarquivar este repositório settings.unarchive.header = Desarquivar este repositório
diff.comment.add_line_comment = Adicionar comentário na linha 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>. 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. migrate.forgejo.description = Migrar dados do codeberg.org ou outras servidores Forgejo.
commits.browse_further = Ver mais 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 activity.navbar.code_frequency = Frequência de código
settings.protect_status_check_matched = Correspondente 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. 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 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.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: 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 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>. 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>. 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. 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. 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. 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.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.install=Para instalar o pacote usando o Composer, execute o seguinte comando:
composer.dependencies=Dependências composer.dependencies=Dependências
composer.dependencies.development=Dependências de Desenvolvimento composer.dependencies.development=Dependências de desenvolvimento
conan.details.repository=Repositório conan.details.repository=Repositório
conan.registry=Configure este registro pela linha de comando: conan.registry=Configure este registro pela linha de comando:
conan.install=Para instalar o pacote usando o Conan, execute o seguinte 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.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: 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.details.platform=Plataforma
container.pull=Puxe a imagem pela linha de comando: container.pull=Puxe a imagem pela linha de comando:
container.digest=Digest: container.digest=Digest
container.multi_arch=S.O. / Arquitetura container.multi_arch=S.O. / Arquitetura
container.layers=Camadas da Imagem container.layers=Camadas da imagem
container.labels=Rótulos container.labels=Rótulos
container.labels.key=Chave container.labels.key=Chave
container.labels.value=Valor 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.install=Para instalar o pacote usando o npm, execute o seguinte comando:
npm.install2=ou adicione-o ao arquivo package.json: npm.install2=ou adicione-o ao arquivo package.json:
npm.dependencies=Dependências npm.dependencies=Dependências
npm.dependencies.development=Dependências de Desenvolvimento npm.dependencies.development=Dependências de desenvolvimento
npm.dependencies.peer=Dependências Peer npm.dependencies.peer=Dependências peer
npm.dependencies.optional=Dependências Opcionais npm.dependencies.optional=Dependências opcionais
npm.details.tag=Tag npm.details.tag=Tag
pub.install=Para instalar o pacote usando Dart, execute o seguinte comando: pub.install=Para instalar o pacote usando Dart, execute o seguinte comando:
pypi.requires=Requer Python pypi.requires=Requer Python
@ -3728,8 +3729,8 @@ rpm.repository = Informações do repositório
rpm.repository.architectures = Arquiteturas rpm.repository.architectures = Arquiteturas
rubygems.install=Para instalar o pacote usando gem, execute o seguinte comando: rubygems.install=Para instalar o pacote usando gem, execute o seguinte comando:
rubygems.install2=ou adicione-o ao Gemfile: rubygems.install2=ou adicione-o ao Gemfile:
rubygems.dependencies.runtime=Dependências de Execução rubygems.dependencies.runtime=Dependências de tempo de execução
rubygems.dependencies.development=Dependências de Desenvolvimento rubygems.dependencies.development=Dependências de desenvolvimento
rubygems.required.ruby=Requer o Ruby versão rubygems.required.ruby=Requer o Ruby versão
rubygems.required.rubygems=Requer o RubyGem versão rubygems.required.rubygems=Requer o RubyGem versão
swift.registry=Configure este registro pela linha de comando: 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.title=Registro Chef
owner.settings.chef.keypair=Gerar par de chaves owner.settings.chef.keypair=Gerar par de chaves
rpm.repository.multiple_groups = Este pacote está disponível em vários grupos. 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>. 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.replaces = Substitui
arch.version.conflicts = Conflitos 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.description = Descrição
arch.version.groups = Grupo arch.version.groups = Grupo
arch.version.provides = Fornece arch.version.provides = Fornece
@ -3799,6 +3800,7 @@ arch.version.makedepends = Dependências do make
arch.version.checkdepends = Verificar dependências 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.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. 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]
secrets=Segredos secrets=Segredos

View file

@ -166,6 +166,7 @@ new_org.title = Nova organização
new_repo.link = Novo repositório new_repo.link = Novo repositório
new_migrate.link = Nova migração new_migrate.link = Nova migração
new_org.link = Nova organização new_org.link = Nova organização
copy_path = Copiar caminho
[aria] [aria]
navbar=Barra de navegação 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.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_one = %d revisão
issues.num_reviews_few = %d revisões issues.num_reviews_few = %d revisões
editor.add_tmpl.filename = nome do ficheiro
[graphs] [graphs]
component_loading=A carregar %s... 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_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_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_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 config_summary = Resumo
auths.tips.gmail_settings = Configurações do Gmail: auths.tips.gmail_settings = Configurações do Gmail:
config_settings = Configurações config_settings = Configurações
@ -3799,6 +3801,7 @@ arch.version.checkdepends = Verificar dependências
arch.version.conflicts = Conflitos arch.version.conflicts = Conflitos
arch.version.backup = Cópia de segurança arch.version.backup = Cópia de segurança
arch.version.replaces = Substitui arch.version.replaces = Substitui
container.images.title = Imagens
[secrets] [secrets]
secrets=Segredos secrets=Segredos

View file

@ -234,7 +234,7 @@ license_desc=Всё это на <a target="_blank" rel="noopener noreferrer" hre
[install] [install]
install=Установка install=Установка
title=Начальная конфигурация 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). require_db_desc=Forgejo требуется MySQL, PostgreSQL, SQLite3 или TiDB (по протоколу MySQL).
db_title=Настройки базы данных db_title=Настройки базы данных
db_type=Тип базы данных db_type=Тип базы данных
@ -267,16 +267,16 @@ repo_path=Путь до каталога репозиториев
repo_path_helper=Все удалённые Git репозитории будут сохранены в этом каталоге. repo_path_helper=Все удалённые Git репозитории будут сохранены в этом каталоге.
lfs_path=Путь до корневого каталога Git LFS lfs_path=Путь до корневого каталога Git LFS
lfs_path_helper=В этом каталоге будут храниться файлы Git LFS. Оставьте пустым, чтобы отключить LFS. lfs_path_helper=В этом каталоге будут храниться файлы Git LFS. Оставьте пустым, чтобы отключить LFS.
run_user=Выполнение под пользователем run_user=Работа под пользователем
run_user_helper=Имя пользователя операционной системы, под которым работает Forgejo. Обратите внимание, что этот пользователь должен иметь доступ к корневому пути репозиториев. run_user_helper=Имя пользователя операционной системы, под которым работает Forgejo. Обратите внимание, что этот пользователь должен иметь доступ к корневому пути репозиториев.
domain=Домен сервера domain=Домен сервера
domain_helper=Домен или адрес хоста для сервера. domain_helper=Домен или адрес хоста для сервера.
ssh_port=Порт SSH-сервера ssh_port=Порт SSH-сервера
ssh_port_helper=Номер порта, используемый SSH-сервером. Оставьте пустым для отключения доступа по SSH. ssh_port_helper=Номер порта, используемый для входящих подключений по SSH. Оставьте пустым для отключения доступа по SSH.
http_port=Порт HTTP-сервера http_port=Порт HTTP-сервера
http_port_helper=Номер порта, используемый веб-сервером Forgejo. http_port_helper=Номер порта, используемый веб-сервером Forgejo.
app_url=Базовый URL Forgejo app_url=Базовый URL
app_url_helper=Этот параметр влияет на URL для клонирования по HTTP/HTTPS и на некоторые уведомления по эл. почте. app_url_helper=Этот параметр влияет на URL клонирования по HTTP/HTTPS и на ссылки в уведомлениях по эл. почте.
log_root_path=Путь журналов log_root_path=Путь журналов
log_root_path_helper=Файлы журнала будут записываться в этот каталог. log_root_path_helper=Файлы журнала будут записываться в этот каталог.
@ -284,9 +284,9 @@ optional_title=Дополнительные настройки
email_title=Настройки эл. почты email_title=Настройки эл. почты
smtp_addr=Адрес SMTP smtp_addr=Адрес SMTP
smtp_port=Порт SMTP smtp_port=Порт SMTP
smtp_from=Отправлять письма от smtp_from=Отправитель
smtp_from_helper=Адрес эл. почты, который будет использоваться Forgejo. Введите обычный адрес эл. почты или используйте формат "Имя" <email@example.com>. smtp_from_helper=Адрес эл. почты, который будет использоваться Forgejo. Введите обычный адрес эл. почты или используйте формат "Имя" <email@example.com>.
mailer_user=Логин SMTP mailer_user=Имя пользователя SMTP
mailer_password=Пароль SMTP mailer_password=Пароль SMTP
register_confirm=Требовать подтверждение по эл. почте для регистрации register_confirm=Требовать подтверждение по эл. почте для регистрации
mail_notify=Уведомления по эл. почте mail_notify=Уведомления по эл. почте
@ -316,7 +316,7 @@ confirm_password=Подтверждение пароля
admin_email=Адрес эл. почты admin_email=Адрес эл. почты
install_btn_confirm=Установить Forgejo install_btn_confirm=Установить Forgejo
test_git_failed=Не удалось проверить команду «git»: %v 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_setting=Некорректные настройки базы данных: %v
invalid_db_table=Таблица «%s» базы данных некорректна: %v invalid_db_table=Таблица «%s» базы данных некорректна: %v
invalid_repo_path=Недопустимый путь к корню репозитория: %v invalid_repo_path=Недопустимый путь к корню репозитория: %v
@ -360,7 +360,7 @@ my_orgs=Организации
my_mirrors=Мои зеркала my_mirrors=Мои зеркала
view_home=Показать %s view_home=Показать %s
search_repos=Поиск репозитория… search_repos=Поиск репозитория…
filter=Другие фильтры filter=Прочие фильтры
filter_by_team_repositories=Фильтровать по репозиториям команды filter_by_team_repositories=Фильтровать по репозиториям команды
feed_of=Лента «%s» feed_of=Лента «%s»
@ -687,13 +687,13 @@ change_avatar=Изменить изображение профиля…
joined_on=Регистрация %s joined_on=Регистрация %s
repositories=Репозитории repositories=Репозитории
activity=Публичная активность activity=Публичная активность
followers_few=%d подписчики followers_few=%d подписчиков
starred=Избранные репозитории starred=Избранные репозитории
watched=Отслеживаемые репозитории watched=Отслеживаемые репозитории
code=Код code=Код
projects=Проекты projects=Проекты
overview=Обзор overview=Обзор
following_few=%d подписки following_few=%d подписок
follow=Подписаться follow=Подписаться
unfollow=Отписаться unfollow=Отписаться
user_bio=О себе user_bio=О себе
@ -810,10 +810,10 @@ password_change_disabled=Нелокальные учётные записи не
emails=Адреса эл. почты emails=Адреса эл. почты
manage_emails=Управление адресами эл. почты manage_emails=Управление адресами эл. почты
manage_themes=Тема по умолчанию manage_themes=Тема интерфейса
manage_openid=Адреса OpenID manage_openid=Адреса OpenID
email_desc=Ваш основной адрес эл. почты будет использоваться для уведомлений, восстановления пароля и, если он не скрыт, для действий с Git в веб-интерфейсе. email_desc=Ваш основной адрес эл. почты будет использоваться для уведомлений, восстановления пароля и, если он не скрыт, для действий с Git в веб-интерфейсе.
theme_desc=Это будет темой по умолчанию для всего сайта. theme_desc=Эта тема оформления будет использоваться при входе на сайт под этой учётной записью.
primary=Основной primary=Основной
activated=Активирован activated=Активирован
requires_activation=Требуется активация requires_activation=Требуется активация
@ -941,7 +941,7 @@ select_permissions=Выбрать разрешения
permission_no_access=Нет доступа permission_no_access=Нет доступа
permission_read=Чтение permission_read=Чтение
permission_write=Чтение и запись 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=Необходимо выбрать хотя бы одно разрешение для создания токена at_least_one_permission=Необходимо выбрать хотя бы одно разрешение для создания токена
permissions_list=Разрешения: permissions_list=Разрешения:
@ -949,7 +949,7 @@ manage_oauth2_applications=Управление приложениями OAuth2
edit_oauth2_application=Изменить приложение OAuth2 edit_oauth2_application=Изменить приложение OAuth2
oauth2_applications_desc=Приложения OAuth2 позволяет стороннему приложению к безопасно аутентифицировать пользователей данной установки Forgejo. oauth2_applications_desc=Приложения OAuth2 позволяет стороннему приложению к безопасно аутентифицировать пользователей данной установки Forgejo.
remove_oauth2_application=Удаление приложения OAuth2 remove_oauth2_application=Удаление приложения OAuth2
remove_oauth2_application_desc=Удаление приложения OAuth2 отменит доступ ко всем подписанным токенам доступа. Продолжить? remove_oauth2_application_desc=Удаление этого приложения отменит доступ ко всем подписанным токенам доступа. Продолжить?
remove_oauth2_application_success=Приложение было успешно удалено. remove_oauth2_application_success=Приложение было успешно удалено.
create_oauth2_application=Создать новое приложение OAuth2 create_oauth2_application=Создать новое приложение OAuth2
create_oauth2_application_button=Создать приложение create_oauth2_application_button=Создать приложение
@ -1051,7 +1051,7 @@ additional_repo_units_hint_description = Показывать подсказку
pronouns_custom = Другие pronouns_custom = Другие
pronouns = Местоимения pronouns = Местоимения
pronouns_unspecified = Не указаны pronouns_unspecified = Не указаны
language.title = Язык по умолчанию language.title = Язык интерфейса
keep_activity_private.description = Ваша <a href="%s">публичная активность</a> будет видна только вам и администраторам сервера. keep_activity_private.description = Ваша <a href="%s">публичная активность</a> будет видна только вам и администраторам сервера.
language.description = Выбранный язык будет сохранён в вашей уч. записи и будет использован по умолчанию после входа. language.description = Выбранный язык будет сохранён в вашей уч. записи и будет использован по умолчанию после входа.
language.localization_project = Помогите с переводом Forgejo на свой язык! <a href="%s">Подробнее</a>. language.localization_project = Помогите с переводом Forgejo на свой язык! <a href="%s">Подробнее</a>.
@ -1065,11 +1065,11 @@ repo_size=Размер репозитория
size_format = `%[1]s: %[2]s; %[3]s: %[4]s` size_format = `%[1]s: %[2]s; %[3]s: %[4]s`
template=Шаблон template=Шаблон
template_select=Выберите шаблон template_select=Выберите шаблон
template_helper=Сделать репозиторий шаблоном template_helper=Пометить репозиторий как шаблон
template_description=Шаблонные репозитории дают возможность пользователям создавать новые репозитории с той же структурой каталогов, файлами и дополнительными настройками. template_description=Шаблонные репозитории дают возможность пользователям создавать новые репозитории с той же структурой каталогов, файлами и дополнительными настройками.
visibility=Видимость visibility=Видимость
visibility_description=Это увидят только владелец организации или участники при наличии прав. visibility_description=Он будет видим только владельцу организации и её участникам при наличии прав.
visibility_helper=Сделать репозиторий приватным visibility_helper=Частный репозиторий
visibility_helper_forced=Администратор сайта настроил параметр видимости новых репозиториев. Репозиторий приватный по умолчанию. visibility_helper_forced=Администратор сайта настроил параметр видимости новых репозиториев. Репозиторий приватный по умолчанию.
visibility_fork_helper=(Это изменит видимость всех ответвлений.) visibility_fork_helper=(Это изменит видимость всех ответвлений.)
clone_helper=Нужна помощь в клонировании? Посетите страницу <a target="_blank" rel="noopener noreferrer" href="%s">помощи</a>. clone_helper=Нужна помощь в клонировании? Посетите страницу <a target="_blank" rel="noopener noreferrer" href="%s">помощи</a>.
@ -1091,12 +1091,12 @@ repo_desc=Описание
repo_desc_helper=Добавьте краткое описание (необязательно) repo_desc_helper=Добавьте краткое описание (необязательно)
repo_lang=Язык repo_lang=Язык
repo_gitignore_helper=Выберите шаблоны .gitignore repo_gitignore_helper=Выберите шаблоны .gitignore
repo_gitignore_helper_desc=Выберите из списка шаблонов для популярных языков , какие файлы не надо отслеживать. По умолчанию в .gitignore включены типичные артефакты, создаваемые инструментами сборки каждого языка. repo_gitignore_helper_desc=Выберите шаблоны из списка для популярных языков. .gitignore определяет, какие файлы не надо отслеживать в проекте. По умолчанию в него включены типичные артефакты, создаваемые инструментами сборки каждого языка.
issue_labels=Метки issue_labels=Метки
issue_labels_helper=Выберите набор меток issue_labels_helper=Выберите набор меток
license=Лицензия license=Лицензия
license_helper=Выберите лицензию 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=README
readme_helper=Выберите шаблон README readme_helper=Выберите шаблон README
readme_helper_desc=Это место, где вы можете написать подробное описание вашего проекта. readme_helper_desc=Это место, где вы можете написать подробное описание вашего проекта.
@ -1719,8 +1719,8 @@ issues.due_date_form_add=Добавить срок выполнения
issues.due_date_form_edit=Изменить issues.due_date_form_edit=Изменить
issues.due_date_form_remove=Удалить issues.due_date_form_remove=Удалить
issues.due_date_not_set=Срок выполнения не установлен. issues.due_date_not_set=Срок выполнения не установлен.
issues.due_date_added=добавлен срок выполнения %s %s issues.due_date_added=добавлен срок выполнения %s, %s
issues.due_date_modified=срок выполнения передвинут с %[2]s на %[1]s %[3]s issues.due_date_modified=срок выполнения изменён с %[2]s на %[1]s %[3]s
issues.due_date_remove=убран срок выполнения %s %s issues.due_date_remove=убран срок выполнения %s %s
issues.due_date_overdue=Просроченные issues.due_date_overdue=Просроченные
issues.due_date_invalid=Срок выполнения недействителен или находится за пределами допустимого диапазона. Пожалуйста, используйте формат «гггг-мм-дд». issues.due_date_invalid=Срок выполнения недействителен или находится за пределами допустимого диапазона. Пожалуйста, используйте формат «гггг-мм-дд».
@ -2463,11 +2463,11 @@ settings.archive.header=Архивация репозитория
settings.archive.success=Репозиторий был успешно архивирован. settings.archive.success=Репозиторий был успешно архивирован.
settings.archive.error=Ошибка при попытке архивировать репозиторий. Смотрите логи для получения подробностей. settings.archive.error=Ошибка при попытке архивировать репозиторий. Смотрите логи для получения подробностей.
settings.archive.error_ismirror=Вы не можете поместить зеркалируемый репозиторий в архив. settings.archive.error_ismirror=Вы не можете поместить зеркалируемый репозиторий в архив.
settings.archive.branchsettings_unavailable=Настройки ветви недоступны, если репозиторий архивирован. settings.archive.branchsettings_unavailable=Настройки ветвей недоступны в архивированных репозиториях.
settings.archive.tagsettings_unavailable=Настройки тегов недоступны, если репозиторий архивирован. settings.archive.tagsettings_unavailable=Настройки тегов недоступны в архивированных репозиториях.
settings.unarchive.button=Разархивировать settings.unarchive.button=Разархивировать
settings.unarchive.header=Вернуть этот репозиторий из архива settings.unarchive.header=Вернуть этот репозиторий из архива
settings.unarchive.text=Разархивирование репозитория восстановит его способность принимать изменения, а также новые задачи и запросы на слияние. settings.unarchive.text=Разархивация репозитория восстановит возможность отправлять в него изменения, а также создавать новые задачи и запросы на слияние.
settings.unarchive.success=Репозиторий был успешно разархивирован. settings.unarchive.success=Репозиторий был успешно разархивирован.
settings.update_avatar_success=Картинка репозитория изменена. settings.update_avatar_success=Картинка репозитория изменена.
settings.lfs=LFS settings.lfs=LFS
@ -2661,7 +2661,7 @@ error.csv.unexpected=Не удается отобразить этот файл,
error.csv.invalid_field_count=Не удается отобразить этот файл, потому что он имеет неправильное количество полей в строке %d. error.csv.invalid_field_count=Не удается отобразить этот файл, потому что он имеет неправильное количество полей в строке %d.
mirror_address_protocol_invalid = Эта ссылка недействительна. Для зеркалирования можно использовать только расположения http(s):// и git:// . mirror_address_protocol_invalid = Эта ссылка недействительна. Для зеркалирования можно использовать только расположения http(s):// и git:// .
fork_no_valid_owners = Невозможно создать ответвление этого репозитория, т.к. здесь нет действующих владельцев. fork_no_valid_owners = Невозможно создать ответвление этого репозитория, т.к. здесь нет действующих владельцев.
new_repo_helper = Репозиторий содержит все файлы проекта и историю изменений. Уже где-то есть репозиторий? <a href="%s">Выполните перенос.</a> new_repo_helper = Репозиторий содержит все файлы проекта и историю изменений. Уже где-то есть репозиторий? <a href="%s">Выполните перенос</a>.
mirror_address_url_invalid = Эта ссылка недействительна. Необходимо правильно указать все части адреса. mirror_address_url_invalid = Эта ссылка недействительна. Необходимо правильно указать все части адреса.
issues.comment.blocked_by_user = Вы не можете комментировать под этой задачей, т.к. вы заблокированы владельцем репозитория или автором задачи. issues.comment.blocked_by_user = Вы не можете комментировать под этой задачей, т.к. вы заблокированы владельцем репозитория или автором задачи.
pulls.blocked_by_user = Невозможно создать запрос на слияние в этом репозитории, т.к. вы заблокированы его владельцем. pulls.blocked_by_user = Невозможно создать запрос на слияние в этом репозитории, т.к. вы заблокированы его владельцем.
@ -2707,7 +2707,7 @@ pulls.recently_pushed_new_branches = Вы отправили коммиты в
milestones.new_subheader = Этапы полезны для систематизации задач и отслеживания их выполнения. milestones.new_subheader = Этапы полезны для систематизации задач и отслеживания их выполнения.
wiki.cancel = Отмена wiki.cancel = Отмена
settings.unarchive.error = При распаковке репозитория произошла ошибка. Подробности доступны в логе. settings.unarchive.error = При распаковке репозитория произошла ошибка. Подробности доступны в логе.
settings.archive.mirrors_unavailable = Зеркалирование недоступно для архивированных репозиториев. settings.archive.mirrors_unavailable = Настройки зеркалирования недоступны в архивированных репозиториях.
issues.role.contributor_helper = В репозитории присутствуют коммиты за авторством этого пользователя. issues.role.contributor_helper = В репозитории присутствуют коммиты за авторством этого пользователя.
settings.wiki_rename_branch_main = Нормализовать название ветви вики settings.wiki_rename_branch_main = Нормализовать название ветви вики
settings.wiki_rename_branch_main_notices_2 = Внутренняя ветвь вики репозитория %s будет переименована. Несохранённые изменения потребуют обновления. settings.wiki_rename_branch_main_notices_2 = Внутренняя ветвь вики репозитория %s будет переименована. Несохранённые изменения потребуют обновления.
@ -2849,6 +2849,8 @@ diff.git-notes.add = Добавить заметку
issues.num_reviews_few = %d рецензий issues.num_reviews_few = %d рецензий
issues.num_reviews_one = %d рецензия issues.num_reviews_one = %d рецензия
issues.summary_card_alt = Карточка со сводкой задачи "%s" в репозитории %s issues.summary_card_alt = Карточка со сводкой задачи "%s" в репозитории %s
editor.add_tmpl.filename = имя файла
settings.default_update_style_desc = Стиль обновления отстающих ветвей запросов на слияние по умолчанию.
[graphs] [graphs]
component_loading_failed = Не удалось загрузить %s component_loading_failed = Не удалось загрузить %s
@ -3314,13 +3316,13 @@ auths.invalid_openIdConnectAutoDiscoveryURL=Неверный URL для авто
config.server_config=Конфигурация сервера config.server_config=Конфигурация сервера
config.app_name=Название сервера config.app_name=Название сервера
config.app_ver=Версия Forgejo config.app_ver=Версия Forgejo
config.app_url=Базовый URL Forgejo config.app_url=Базовый URL
config.custom_conf=Путь к файлу конфигурации config.custom_conf=Путь к файлу конфигурации
config.custom_file_root_path=Путь до каталога с файлами для персонализации config.custom_file_root_path=Путь до каталога с файлами для персонализации
config.domain=Домен сервера config.domain=Домен сервера
config.offline_mode=Локальный режим config.offline_mode=Локальный режим
config.disable_router_log=Отключение журнала маршрутизатора config.disable_router_log=Отключение журнала маршрутизатора
config.run_user=Выполнение под пользователем config.run_user=Работа под пользователем
config.run_mode=Режим работы config.run_mode=Режим работы
config.git_version=Версия git config.git_version=Версия git
config.app_data_path=Путь к данным приложения config.app_data_path=Путь к данным приложения
@ -3504,7 +3506,7 @@ notices.delete_success=Уведомления системы были удале
self_check.no_problem_found = Пока проблем не обнаружено. self_check.no_problem_found = Пока проблем не обнаружено.
auths.tip.gitea = Зарегистрируйте новое приложение OAuth2. Доступна инструкция: %s auths.tip.gitea = Зарегистрируйте новое приложение OAuth2. Доступна инструкция: %s
auths.tips.oauth2.general.tip = При регистрации нового приложения OAuth2 ссылка обратного перенаправления должна быть: 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.cleanup_actions = Очистить устаревшие журналы и артефакты Действий
dashboard.sync_repo_branches = Синхронизировать ветви из Git в базу данных dashboard.sync_repo_branches = Синхронизировать ветви из Git в базу данных
assets = Кодовые объекты assets = Кодовые объекты
@ -3696,7 +3698,7 @@ conda.install=Чтобы установить пакет с помощью Conda
container.details.type=Тип образа container.details.type=Тип образа
container.details.platform=Платформа container.details.platform=Платформа
container.pull=Загрузите образ из командной строки: container.pull=Загрузите образ из командной строки:
container.digest=Отпечаток: container.digest=Отпечаток
container.multi_arch=ОС / архитектура container.multi_arch=ОС / архитектура
container.layers=Слои образа container.layers=Слои образа
container.labels=Метки container.labels=Метки
@ -3811,6 +3813,7 @@ arch.version.replaces = Заменяет
arch.version.backup = Рез. копия arch.version.backup = Рез. копия
arch.version.conflicts = Конфликтует с arch.version.conflicts = Конфликтует с
arch.version.checkdepends = Проверочные зависимости arch.version.checkdepends = Проверочные зависимости
container.images.title = Образы
[secrets] [secrets]
secrets=Секреты secrets=Секреты
@ -3954,28 +3957,28 @@ fuzzy_tooltip = Включает результаты, достаточно по
type_tooltip = Тип поиска type_tooltip = Тип поиска
fuzzy = Приблизительный fuzzy = Приблизительный
match = Точный match = Точный
repo_kind = Поиск репозиториев... repo_kind = Найти репозитории...
user_kind = Поиск пользователей... user_kind = Найти пользователей...
org_kind = Поиск организаций... org_kind = Найти организации...
team_kind = Поиск команд... team_kind = Найти команды...
code_kind = Поиск по коду... code_kind = Найти в коде...
package_kind = Поиск пакетов... package_kind = Найти пакеты...
project_kind = Поиск проектов... project_kind = Найти проекты...
branch_kind = Поиск ветвей... branch_kind = Найти ветви...
commit_kind = Поиск коммитов... commit_kind = Найти коммиты...
no_results = По запросу ничего не найдено. no_results = По запросу ничего не найдено.
keyword_search_unavailable = Поиск по ключевым словам недоступен. Уточните подробности у администратора. keyword_search_unavailable = Поиск по ключевым словам недоступен. Уточните подробности у администратора сервера.
match_tooltip = Включать только результаты, точно соответствующие запросу match_tooltip = Включать только результаты, точно соответствующие запросу
code_search_unavailable = Поиск по коду сейчас недоступен. Уточните подробности у администратора. code_search_unavailable = Поиск в коде недоступен. Уточните подробности у администратора сервера.
runner_kind = Поиск исполнителей... runner_kind = Найти исполнителей...
code_search_by_git_grep = Эти результаты получены через «git grep». Результатов может быть больше, если администратор сервера включит индексатор кода. code_search_by_git_grep = Эти результаты получены через «git grep». Результатов может быть больше, если на сервере будет включен индексатор кода.
exact = Точный exact = Точный
exact_tooltip = Включает только результаты, в точности соответствующие запросу exact_tooltip = Включает только результаты, в точности соответствующие запросу
issue_kind = Поиск задач... issue_kind = Найти задачи...
pull_kind = Поиск слияний... pull_kind = Найти слияния...
union_tooltip = Включает результаты с совпавшими ключевыми словами, разделёнными пробелами union_tooltip = Включает результаты с совпавшими ключевыми словами, разделёнными пробелами
union = Обычный union = Обычный
milestone_kind = Поиск этапов... milestone_kind = Найти этапы...
regexp = Регулярное выражение regexp = Регулярное выражение
regexp_tooltip = Интерпретировать поисковый запрос как регулярное выражение regexp_tooltip = Интерпретировать поисковый запрос как регулярное выражение
@ -3986,7 +3989,7 @@ filepreview.lines = Строки с %[1]d по %[2]d в %[3]s
filepreview.truncated = Предпросмотр был обрезан filepreview.truncated = Предпросмотр был обрезан
[translation_meta] [translation_meta]
test = ура :) test = forgejo :)
[repo.permissions] [repo.permissions]
code.write = <b>Запись:</b> отправка изменений в репозиторий, создание веток и тегов. 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] [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. 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.) 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. 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.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. 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.is_archived = Архівовано
filter = Фільтри filter = Фільтри
toggle_menu = Перемкнути видимість меню toggle_menu = Перемкнути видимість меню
confirm_delete_artifact = Ви впевнені, що хочете видалити артефакт "%s"? confirm_delete_artifact = Ви впевнені, що хочете видалити артефакт «%s»?
artifacts = Артефакти artifacts = Артефакти
filter.not_archived = Не архівовано filter.not_archived = Не архівовано
filter.public = Загальнодоступні filter.public = Загальнодоступні
filter.private = Приватні filter.private = Приватні
more_items = Більше пунктів more_items = Більше пунктів
remove_label_str = Видалити об'єкт "%s" remove_label_str = Видалити об'єкт «%s»
new_repo.title = Новий репозиторій new_repo.title = Новий репозиторій
new_migrate.title = Нова міграція new_migrate.title = Нова міграція
new_org.title = Нова організація new_org.title = Нова організація
@ -334,7 +334,7 @@ password_algorithm=Алгоритм хешування пароля
config_location_hint = Ці опції налаштувань будуть збережені в: config_location_hint = Ці опції налаштувань будуть збережені в:
env_config_keys = Конфігурація середовища env_config_keys = Конфігурація середовища
env_config_keys_prompt = Ці змінні середовища будуть також застосовані до вашого файлу конфігурації: env_config_keys_prompt = Ці змінні середовища будуть також застосовані до вашого файлу конфігурації:
invalid_db_table = База даних "%s" недійсна: %v invalid_db_table = База даних «%s» недійсна: %v
enable_update_checker = Увімкнути перевірку оновлень enable_update_checker = Увімкнути перевірку оновлень
require_db_desc = Forgejo вимагає MySQL, PostgreSQL, SQLite3 чи TiDB (протокол MySQL). require_db_desc = Forgejo вимагає MySQL, PostgreSQL, SQLite3 чи TiDB (протокол MySQL).
allow_only_external_registration = Дозволити реєстрацію тільки через зовнішні сервіси allow_only_external_registration = Дозволити реєстрацію тільки через зовнішні сервіси
@ -645,7 +645,7 @@ Pronouns = Займенники
Biography = Про себе Biography = Про себе
FullName = Повне ім'я FullName = Повне ім'я
Website = Вебсайт Website = Вебсайт
url_error = `"%s" є недійсним посиланням.` url_error = `«%s» є недійсним посиланням.`
To = Назва гілки To = Назва гілки
Location = Розташування Location = Розташування
AccessToken = Токен доступу AccessToken = Токен доступу
@ -749,7 +749,7 @@ emails=Адреса електронної пошти
manage_emails=Керування адресами ел. пошти manage_emails=Керування адресами ел. пошти
manage_themes=Тема за замовчуванням manage_themes=Тема за замовчуванням
manage_openid=Адреси OpenID manage_openid=Адреси OpenID
theme_desc=Ця тема буде типовою для всього сайту. theme_desc=Ця тема буде типовою для веб-інтерфейсу, коли ви ввійдете в систему.
primary=Основний primary=Основний
activated=Активовано activated=Активовано
requires_activation=Потрібна активація requires_activation=Потрібна активація
@ -861,7 +861,7 @@ oauth2_applications_desc=Програми OAuth2 дають можливість
remove_oauth2_application=Видалити програму OAuth2 remove_oauth2_application=Видалити програму OAuth2
remove_oauth2_application_desc=Видалення програми OAuth2 скасовує доступ до всіх підписаних маркерів доступу. Продовжити? remove_oauth2_application_desc=Видалення програми OAuth2 скасовує доступ до всіх підписаних маркерів доступу. Продовжити?
remove_oauth2_application_success=Програму видалено. remove_oauth2_application_success=Програму видалено.
create_oauth2_application=Створити нову програму OAuth2 create_oauth2_application=Створити новий додаток OAuth2
create_oauth2_application_button=Створити програму create_oauth2_application_button=Створити програму
oauth2_application_name=Назва програми oauth2_application_name=Назва програми
save_application=Зберегти save_application=Зберегти
@ -965,6 +965,7 @@ comment_type_group_pull_request_push = Додані коміти
permissions_public_only = Тільки публічні permissions_public_only = Тільки публічні
select_permissions = Виберіть дозволи select_permissions = Виберіть дозволи
permissions_access_all = Усі (публічні, приватні й обмежені) permissions_access_all = Усі (публічні, приватні й обмежені)
create_oauth2_application_success = Ви успішно створили новий додаток OAuth2.
[repo] [repo]
owner=Власник owner=Власник
@ -1000,7 +1001,7 @@ issue_labels=Мітки
issue_labels_helper=Виберіть набір міток issue_labels_helper=Виберіть набір міток
license=Ліцензія license=Ліцензія
license_helper=Виберіть файл ліцензії 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=README
readme_helper=Виберіть шаблон README readme_helper=Виберіть шаблон README
readme_helper_desc=Це місце, де ви можете написати повний опис вашого проєкту. readme_helper_desc=Це місце, де ви можете написати повний опис вашого проєкту.
@ -1088,7 +1089,7 @@ migrate_items_merge_requests=Запити на об'єднання
migrate_items_releases=Релізи migrate_items_releases=Релізи
migrate_repo=Перенести репозиторій migrate_repo=Перенести репозиторій
migrate.clone_address=Міграція / клонувати з URL-адреси 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.clone_local_path=або шлях до локального серверу
migrate.permission_denied=Вам не дозволено імпортувати локальні репозиторії. migrate.permission_denied=Вам не дозволено імпортувати локальні репозиторії.
migrate.permission_denied_blocked=Ви не можете імпортувати з заборонених вузлів, будь ласка, попросіть адміністратора перевірити налаштування ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS. migrate.permission_denied_blocked=Ви не можете імпортувати з заборонених вузлів, будь ласка, попросіть адміністратора перевірити налаштування ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS.
@ -2060,8 +2061,8 @@ settings.archive.header=Архівувати цей репозиторій
settings.archive.success=Репозиторію успішно присвоєно статус архівного. settings.archive.success=Репозиторію успішно присвоєно статус архівного.
settings.archive.error=Сталася помилка при спробі архівувати репозиторій. Докладнішу інформацію див. у журналі. settings.archive.error=Сталася помилка при спробі архівувати репозиторій. Докладнішу інформацію див. у журналі.
settings.archive.error_ismirror=Неможливо архівувати дзеркальний репозиротрій. settings.archive.error_ismirror=Неможливо архівувати дзеркальний репозиротрій.
settings.archive.branchsettings_unavailable=Параметри гілки не доступні, якщо репозиторій архівний. settings.archive.branchsettings_unavailable=Параметри гілки недоступні в архівованих репозиторіях.
settings.archive.tagsettings_unavailable=Параметри міток недоступні, якщо репозиторій архівний. settings.archive.tagsettings_unavailable=Параметри міток недоступні в архівованих репозиторіях.
settings.update_avatar_success=Аватар репозиторію оновлений. settings.update_avatar_success=Аватар репозиторію оновлений.
settings.lfs=LFS settings.lfs=LFS
settings.lfs_filelist=Файли LFS, які зберігаються в цьому репозиторії settings.lfs_filelist=Файли LFS, які зберігаються в цьому репозиторії
@ -2070,7 +2071,7 @@ settings.lfs_findcommits=Знайти коміти
settings.lfs_lfs_file_no_commits=Не знайдено комітів для цього файлу LFS settings.lfs_lfs_file_no_commits=Не знайдено комітів для цього файлу LFS
settings.lfs_noattribute=Цей шлях не має атрибуту блокування в гілці за замовчуванням settings.lfs_noattribute=Цей шлях не має атрибуту блокування в гілці за замовчуванням
settings.lfs_delete=Видалити файл LFS з OID %s settings.lfs_delete=Видалити файл LFS з OID %s
settings.lfs_delete_warning=Видалення файлу LFS може спричинити помилки "Об'єкт не існує" під час перевірки. Ви впевнені? settings.lfs_delete_warning=Видалення файлу LFS може спричинити помилки «Об'єкт не існує» під час перевірки. Ви впевнені?
settings.lfs_findpointerfiles=Знайти файли-посилання settings.lfs_findpointerfiles=Знайти файли-посилання
settings.lfs_locks=Блокування settings.lfs_locks=Блокування
settings.lfs_invalid_locking_path=Неприпустимий шлях: %s 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.add_web_hook_desc = Інтегрувати <a target="_blank" rel="noreferrer" href="%s">%s</a> у цей репозиторій.
settings.event_wiki_desc = Вікі-сторінку створено, перейменовано, відредаговано або видалено. settings.event_wiki_desc = Вікі-сторінку створено, перейменовано, відредаговано або видалено.
settings.mirror_settings.push_mirror.copy_public_key = Копіювати публічний ключ settings.mirror_settings.push_mirror.copy_public_key = Копіювати публічний ключ
editor.add_tmpl.filename = назва файлу
settings.unarchive.button = Розархівувати репозиторій
object_format = Формат об'єкта
settings.archive.mirrors_unavailable = Дзеркала недоступні в архівованих репозиторіях.
[graphs] [graphs]
contributors.what = внески contributors.what = внески
@ -2793,15 +2798,15 @@ auths.tips.oauth2.general=Автентифікація OAuth2
auths.tip.oauth2_provider=Постачальник OAuth2 auths.tip.oauth2_provider=Постачальник OAuth2
auths.tip.bitbucket=Створіть OAuth URI на сторінці %s auths.tip.bitbucket=Створіть OAuth URI на сторінці %s
auths.tip.nextcloud=`Зареєструйте нового споживача OAuth у вашому екземплярі за допомогою наступного меню "Налаштування -> Безпека -> клієнт OAuth 2.0"` auths.tip.nextcloud=`Зареєструйте нового споживача OAuth у вашому екземплярі за допомогою наступного меню "Налаштування -> Безпека -> клієнт OAuth 2.0"`
auths.tip.dropbox=Додайте новий додаток на %s auths.tip.dropbox=Створіть новий додаток на %s
auths.tip.facebook=`Створіть новий додаток на %s і додайте модуль "Facebook Login"` auths.tip.facebook=Зареєструйте новий додаток на %s і додайте модуль «Facebook Login»
auths.tip.github=Додайте OAuth додаток на %s auths.tip.github=Зареєструйте новий додаток OAuth на %s
auths.tip.gitlab=Додайте новий додаток на https://gitlab.com/profile/applications auths.tip.gitlab=Додайте новий додаток на https://gitlab.com/profile/applications
auths.tip.google_plus=Отримайте облікові дані клієнта OAuth2 в консолі Google API на сторінці %s auths.tip.google_plus=Отримайте облікові дані клієнта OAuth2 в консолі Google API на сторінці %s
auths.tip.openid_connect=Використовуйте OpenID Connect Discovery URL (<server>/.well-known/openid-configuration) для автоматичної настройки входу OAuth auths.tip.openid_connect=Використовуйте OpenID Connect Discovery URL (<server>/.well-known/openid-configuration) для автоматичної настройки входу OAuth
auths.tip.twitter=Перейдіть на %s, створіть програму і переконайтеся, що включена опція «Дозволити цю програму для входу в систему за допомогою Twitter» auths.tip.twitter=Перейдіть на %s, створіть програму і переконайтеся, що включена опція «Дозволити цю програму для входу в систему за допомогою Twitter»
auths.tip.discord=Зареєструйте новий додаток на %s auths.tip.discord=Зареєструйте новий додаток на %s
auths.tip.yandex=`Створіть нову програму в %s. Виберіть наступні дозволи з "Yandex. assport API": "Доступ до адреси електронної пошти", "Доступ до аватара" і "Доступ до імені користувача, імені та прізвища, статі"` auths.tip.yandex=Створіть новий додаток на %s. Виберіть наступні дозволи з «Yandex. assport API»: «Доступ до адреси електронної пошти», «Доступ до аватара» і «Доступ до імені користувача, імені та прізвища, статі»
auths.tip.mastodon=Введіть URL спеціального екземпляра для екземпляра mastodon, який ви хочете автентифікувати за допомогою (або використовувати за замовчуванням) auths.tip.mastodon=Введіть URL спеціального екземпляра для екземпляра mastodon, який ви хочете автентифікувати за допомогою (або використовувати за замовчуванням)
auths.edit=Редагувати джерело автентифікації auths.edit=Редагувати джерело автентифікації
auths.activated=Це джерело авторизації активоване auths.activated=Це джерело авторизації активоване
@ -2826,7 +2831,7 @@ config.disable_router_log=Вимкнути логування роутеру
config.run_user=Користувач, від якого запустити config.run_user=Користувач, від якого запустити
config.run_mode=Режим виконання config.run_mode=Режим виконання
config.git_version=Версія Git config.git_version=Версія Git
config.repo_root_path=Кореневий шлях репозиторія config.repo_root_path=Шлях до кореня репозиторію
config.lfs_root_path=Кореневий шлях LFS config.lfs_root_path=Кореневий шлях LFS
config.log_file_root_path=Шлях до лог файлу config.log_file_root_path=Шлях до лог файлу
config.script_type=Тип скрипта config.script_type=Тип скрипта
@ -2908,7 +2913,7 @@ config.cache_item_ttl=Час зберігання даних кешу
config.session_config=Конфігурація сесії config.session_config=Конфігурація сесії
config.session_provider=Провайдер сесії config.session_provider=Провайдер сесії
config.provider_config=Конфігурація постачальника config.provider_config=Конфігурація постачальника
config.cookie_name=Ім'я файлу cookie config.cookie_name=Назва файлу cookie
config.gc_interval_time=Інтервал запуску збирача сміття (GC) config.gc_interval_time=Інтервал запуску збирача сміття (GC)
config.session_life_time=Час життя сесії config.session_life_time=Час життя сесії
config.https_only=Тільки HTTPS 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_done = Усі елементи в черзі видалено.
monitor.queue.settings.remove_all_items = Видалити всі monitor.queue.settings.remove_all_items = Видалити всі
config.app_slogan = Гасло екземпляра config.app_slogan = Гасло екземпляра
auths.tip.gitea = Зареєструйте новий додаток OAuth. Інструкцію можна знайти на %s
auths.tip.gitlab_new = Зареєструйте новий додаток на %s
[action] [action]
@ -3184,6 +3191,10 @@ settings.delete.error = Не вдалося видалити пакунок.
settings.delete.success = Пакунок видалено. settings.delete.success = Пакунок видалено.
npm.dependencies = Залежності npm.dependencies = Залежності
settings.delete = Видалити пакунок settings.delete = Видалити пакунок
npm.dependencies.development = Залежності розробки
rubygems.dependencies.development = Залежності розробки
npm.dependencies.optional = Необов'язкові залежності
container.images.title = Образи
[secrets] [secrets]
deletion = Видалити секрет deletion = Видалити секрет
@ -3299,7 +3310,7 @@ milestone_kind = Шукати віхи...
commit_kind = Шукати коментарі... commit_kind = Шукати коментарі...
no_results = Не знайдено відповідних результатів. no_results = Не знайдено відповідних результатів.
keyword_search_unavailable = Пошук за ключовими словами наразі недоступний. Будь ласка, зв'яжіться з адміністратором сайту. keyword_search_unavailable = Пошук за ключовими словами наразі недоступний. Будь ласка, зв'яжіться з адміністратором сайту.
code_search_by_git_grep = Поточні результати пошуку коду надаються з "git grep". Тут можуть бути кращі результати, якщо адміністратор сайту ввімкнув індексацію коду. code_search_by_git_grep = Поточні результати пошуку коду надаються з «git grep». Тут можуть бути кращі результати, якщо адміністратор сайту ввімкнув індексацію коду.
package_kind = Шукати пакунки... package_kind = Шукати пакунки...
project_kind = Шукати проєкти... project_kind = Шукати проєкти...
branch_kind = Шукати гілки... branch_kind = Шукати гілки...

View file

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

79
poetry.lock generated
View file

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

View file

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

View file

View file

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

View file

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

View file

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

View file

@ -5,6 +5,7 @@ package actions
import ( import (
"bytes" "bytes"
stdCtx "context"
"fmt" "fmt"
"net/http" "net/http"
"slices" "slices"
@ -224,7 +225,7 @@ func List(ctx *context.Context) {
return return
} }
if err := loadIsRefDeleted(ctx, runs); err != nil { if err := loadIsRefDeleted(ctx, ctx.Repo.Repository.ID, runs); err != nil {
log.Error("LoadIsRefDeleted", err) log.Error("LoadIsRefDeleted", err)
} }
@ -254,7 +255,7 @@ func List(ctx *context.Context) {
// loadIsRefDeleted loads the IsRefDeleted field for each run in the list. // 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. // 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)) branches := make(container.Set[string], len(runs))
for _, run := range runs { for _, run := range runs {
refName := git.RefName(run.Ref) refName := git.RefName(run.Ref)
@ -266,14 +267,14 @@ func loadIsRefDeleted(ctx *context.Context, runs actions_model.RunList) error {
return nil 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 { if err != nil {
return err return err
} }
branchSet := git_model.BranchesToNamesSet(branchInfos) branchSet := git_model.BranchesToNamesSet(branchInfos)
for _, run := range runs { for _, run := range runs {
refName := git.RefName(run.Ref) refName := git.RefName(run.Ref)
if refName.IsBranch() && !branchSet.Contains(run.Ref) { if refName.IsBranch() && !branchSet.Contains(refName.ShortName()) {
run.IsRefDeleted = true 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 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) defaultMergeMessage, defaultMergeBody, err := pull_service.GetDefaultMergeMessage(ctx, ctx.Repo.GitRepo, pull, mergeStyle)
if err != nil { if err != nil {
ctx.ServerError("GetDefaultMergeMessage", err) ctx.ServerError("GetDefaultMergeMessage", err)

View file

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

View file

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

View file

@ -39,6 +39,7 @@ import (
"code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/gitrepo" "code.gitea.io/gitea/modules/gitrepo"
"code.gitea.io/gitea/modules/highlight" "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/lfs"
"code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/markup" "code.gitea.io/gitea/modules/markup"
@ -1152,6 +1153,12 @@ PostRecentBranchCheck:
ctx.Data["TreeNames"] = treeNames ctx.Data["TreeNames"] = treeNames
ctx.Data["BranchLink"] = branchLink ctx.Data["BranchLink"] = branchLink
ctx.Data["CodeIndexerDisabled"] = !setting.Indexer.RepoIndexerEnabled 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) ctx.HTML(http.StatusOK, tplRepoHome)
} }

View file

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

View file

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

View file

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

View file

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

View file

@ -72,7 +72,8 @@ func ReviewRequest(ctx context.Context, issue *issues_model.Issue, doer, reviewe
return nil, err 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) notify_service.PullRequestReviewRequest(ctx, doer, issue, reviewer, isAdd, comment)
} }

View file

@ -8,7 +8,6 @@ import (
"fmt" "fmt"
"io" "io"
"strconv" "strconv"
"strings"
"code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/db"
repo_model "code.gitea.io/gitea/models/repo" 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 // generateAvatar generates the avatar from a template repository
func generateAvatar(ctx context.Context, templateRepo, generateRepo *repo_model.Repository) error { 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 { if _, err := storage.Copy(storage.RepoAvatars, generateRepo.CustomAvatarRelativePath(), storage.RepoAvatars, templateRepo.CustomAvatarRelativePath()); err != nil {
return err return err
} }

View file

@ -29,7 +29,7 @@ func TestUploadAvatar(t *testing.T) {
err := UploadAvatar(db.DefaultContext, repo, buff.Bytes()) err := UploadAvatar(db.DefaultContext, repo, buff.Bytes())
require.NoError(t, err) 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) { func TestUploadBigAvatar(t *testing.T) {
@ -62,3 +62,27 @@ func TestDeleteAvatar(t *testing.T) {
assert.Equal(t, "", repo.Avatar) 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) { func checkGiteaTemplate(tmpDir string) (*GiteaTemplate, error) {
gtPath := filepath.Join(tmpDir, ".gitea", "template") configDirs := []string{".forgejo", ".gitea"}
if _, err := os.Stat(gtPath); os.IsNotExist(err) { var templateFilePath string
return nil, nil
} else if err != nil { for _, dir := range configDirs {
return nil, err 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 { if err != nil {
return nil, err return nil, err
} }
gt := &GiteaTemplate{ return &GiteaTemplate{
Path: gtPath, Path: templateFilePath,
Content: content, Content: content,
} }, nil
return gt, nil
} }
func generateRepoCommit(ctx context.Context, repo, templateRepo, generateRepo *repo_model.Repository, tmpDir string) error { 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 var pullRequest *api.PullRequest
if issue.IsPull { if issue.IsPull {
eventType = webhook_module.HookEventPullRequestComment eventType = webhook_module.HookEventPullRequestComment
if err := issue.LoadPullRequest(ctx); err != nil {
log.Error("LoadPullRequest: %v", err)
return
}
pullRequest = convert.ToAPIPullRequest(ctx, issue.PullRequest, doer) pullRequest = convert.ToAPIPullRequest(ctx, issue.PullRequest, doer)
} else { } else {
eventType = webhook_module.HookEventIssueComment eventType = webhook_module.HookEventIssueComment

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