Template
1
0
Fork 0
mirror of https://codeberg.org/forgejo/forgejo synced 2024-11-22 01:44:24 +01:00

Merge branch 'forgejo' into moremarkdown

This commit is contained in:
JakobDev 2024-11-14 18:19:15 +00:00
commit e36f0e0910
52 changed files with 658 additions and 309 deletions

View file

@ -31,7 +31,7 @@ on:
jobs: jobs:
backporting: backporting:
if: > if: >
!startsWith(vars.ROLE, 'forgejo-') && ( ( vars.ROLE == 'forgejo-coding' ) && (
github.event.pull_request.merged github.event.pull_request.merged
&& &&
contains(toJSON(github.event.pull_request.labels), 'backport/v') contains(toJSON(github.event.pull_request.labels), 'backport/v')

View file

@ -22,7 +22,7 @@ on:
jobs: jobs:
release-simulation: release-simulation:
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }} if: vars.ROLE == 'forgejo-coding'
runs-on: self-hosted runs-on: self-hosted
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4

View file

@ -26,7 +26,7 @@ on:
jobs: jobs:
info: info:
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }} if: vars.ROLE == 'forgejo-coding'
runs-on: docker runs-on: docker
container: container:
image: code.forgejo.org/oci/node:20-bookworm image: code.forgejo.org/oci/node:20-bookworm
@ -45,7 +45,7 @@ jobs:
cascade: cascade:
if: > if: >
!startsWith(vars.ROLE, 'forgejo-') && ( vars.ROLE == 'forgejo-coding' && (
github.event_name == 'push' || github.event_name == 'push' ||
( (
github.event.action == 'label_updated' && github.event.label.name == 'run-end-to-end-tests' github.event.action == 'label_updated' && github.event.label.name == 'run-end-to-end-tests'

View file

@ -13,6 +13,7 @@ on:
jobs: jobs:
merge-conditions: merge-conditions:
if: vars.ROLE == 'forgejo-coding'
runs-on: docker runs-on: docker
container: container:
image: 'code.forgejo.org/oci/node:20-bookworm' image: 'code.forgejo.org/oci/node:20-bookworm'

View file

@ -6,7 +6,7 @@ on:
jobs: jobs:
release-notes: release-notes:
if: ${{ !startsWith(vars.ROLE, 'forgejo-') if: vars.ROLE == 'forgejo-coding'
runs-on: docker runs-on: docker
container: container:
image: 'code.forgejo.org/oci/node:20-bookworm' image: 'code.forgejo.org/oci/node:20-bookworm'

View file

@ -7,7 +7,7 @@ on:
jobs: jobs:
release-notes: release-notes:
if: ${{ !startsWith(vars.ROLE, 'forgejo-') && 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: 'code.forgejo.org/oci/node:20-bookworm'

View file

@ -21,7 +21,7 @@ env:
jobs: jobs:
renovate: renovate:
if: ${{ secrets.RENOVATE_TOKEN != '' }} if: vars.ROLE == 'forgejo-coding' && secrets.RENOVATE_TOKEN != ''
runs-on: docker-runner-one runs-on: docker-runner-one
container: container:

View file

@ -10,7 +10,7 @@ on:
jobs: jobs:
backend-checks: backend-checks:
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }} 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: 'code.forgejo.org/oci/node:20-bookworm'
@ -26,7 +26,7 @@ jobs:
- run: su forgejo -c 'make --always-make -j$(nproc) lint-backend tidy-check swagger-check fmt-check swagger-validate' # ensure the "go-licenses" make target runs - run: su forgejo -c 'make --always-make -j$(nproc) lint-backend tidy-check swagger-check fmt-check swagger-validate' # ensure the "go-licenses" make target runs
- uses: ./.forgejo/workflows-composite/build-backend - uses: ./.forgejo/workflows-composite/build-backend
frontend-checks: frontend-checks:
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }} 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: 'code.forgejo.org/oci/node:20-bookworm'
@ -49,7 +49,7 @@ jobs:
path: ${{github.workspace}}/public/assets path: ${{github.workspace}}/public/assets
key: frontend-build-${{ github.sha }} key: frontend-build-${{ github.sha }}
test-unit: test-unit:
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }} if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
runs-on: docker runs-on: docker
needs: [backend-checks, frontend-checks] needs: [backend-checks, frontend-checks]
container: container:
@ -57,13 +57,14 @@ jobs:
services: services:
elasticsearch: elasticsearch:
image: docker.io/bitnami/elasticsearch:7 image: docker.io/bitnami/elasticsearch:7
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: docker.io/bitnami/minio:2024.8.17 image: docker.io/bitnami/minio:2024.8.17
options: >- options: >-
--hostname gitea.minio --hostname gitea.minio --tmpfs /bitnami/minio/data
env: env:
MINIO_DOMAIN: minio MINIO_DOMAIN: minio
MINIO_ROOT_USER: 123456 MINIO_ROOT_USER: 123456
@ -88,7 +89,7 @@ jobs:
TAGS: bindata TAGS: bindata
TEST_ELASTICSEARCH_URL: http://elasticsearch:9200 TEST_ELASTICSEARCH_URL: http://elasticsearch:9200
test-e2e: test-e2e:
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }} if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
runs-on: docker runs-on: docker
needs: [backend-checks, frontend-checks] needs: [backend-checks, frontend-checks]
container: container:
@ -121,8 +122,15 @@ jobs:
USE_REPO_TEST_DIR: 1 USE_REPO_TEST_DIR: 1
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1 PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
CHANGED_FILES: ${{steps.changed-files.outputs.all_changed_files}} CHANGED_FILES: ${{steps.changed-files.outputs.all_changed_files}}
- name: Upload screenshots on failure
if: failure()
uses: https://code.forgejo.org/forgejo/upload-artifact@v4
with:
name: screenshots.zip
path: /workspace/forgejo/forgejo/tests/e2e/test-artifacts/*/*.png
retention-days: 3
test-remote-cacher: test-remote-cacher:
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }} if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
runs-on: docker runs-on: docker
needs: [backend-checks, frontend-checks, test-unit] needs: [backend-checks, frontend-checks, test-unit]
container: container:
@ -132,16 +140,16 @@ jobs:
cacher: cacher:
# redis # redis
- image: docker.io/bitnami/redis:7.2 - image: docker.io/bitnami/redis:7.2
port: 6379 options: --tmpfs /bitnami/redis/data
# redict # redict
- image: registry.redict.io/redict:7.3.0-scratch - image: registry.redict.io/redict:7.3.0-scratch
port: 6379 options: --tmpfs /data
# valkey # valkey
- image: docker.io/bitnami/valkey:7.2 - image: docker.io/bitnami/valkey:7.2
port: 6379 options: --tmpfs /bitnami/redis/data
# garnet # garnet
- image: ghcr.io/microsoft/garnet-alpine:1.0.14 - image: ghcr.io/microsoft/garnet-alpine:1.0.14
port: 6379 options: --tmpfs /data
services: services:
cacher: cacher:
image: ${{ matrix.cacher.image }} image: ${{ matrix.cacher.image }}
@ -162,7 +170,7 @@ jobs:
TAGS: bindata TAGS: bindata
TEST_REDIS_SERVER: cacher:${{ matrix.cacher.port }} TEST_REDIS_SERVER: cacher:${{ matrix.cacher.port }}
test-mysql: test-mysql:
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }} if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
runs-on: docker runs-on: docker
needs: [backend-checks, frontend-checks] needs: [backend-checks, frontend-checks]
container: container:
@ -176,7 +184,8 @@ jobs:
# #
# See also https://codeberg.org/forgejo/forgejo/issues/976 # See also https://codeberg.org/forgejo/forgejo/issues/976
# #
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 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
steps: steps:
- uses: https://code.forgejo.org/actions/checkout@v4 - uses: https://code.forgejo.org/actions/checkout@v4
- uses: ./.forgejo/workflows-composite/setup-env - uses: ./.forgejo/workflows-composite/setup-env
@ -191,7 +200,7 @@ jobs:
env: env:
USE_REPO_TEST_DIR: 1 USE_REPO_TEST_DIR: 1
test-pgsql: test-pgsql:
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }} if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
runs-on: docker runs-on: docker
needs: [backend-checks, frontend-checks] needs: [backend-checks, frontend-checks]
container: container:
@ -202,6 +211,7 @@ jobs:
env: env:
MINIO_ROOT_USER: 123456 MINIO_ROOT_USER: 123456
MINIO_ROOT_PASSWORD: 12345678 MINIO_ROOT_PASSWORD: 12345678
options: --tmpfs /bitnami/minio/data
ldap: ldap:
image: docker.io/gitea/test-openldap:latest image: docker.io/gitea/test-openldap:latest
pgsql: pgsql:
@ -209,6 +219,7 @@ jobs:
env: env:
POSTGRES_DB: test POSTGRES_DB: test
POSTGRES_PASSWORD: postgres POSTGRES_PASSWORD: postgres
options: --tmpfs /var/lib/postgresql/data
steps: steps:
- uses: https://code.forgejo.org/actions/checkout@v4 - uses: https://code.forgejo.org/actions/checkout@v4
- uses: ./.forgejo/workflows-composite/setup-env - uses: ./.forgejo/workflows-composite/setup-env
@ -225,7 +236,7 @@ jobs:
USE_REPO_TEST_DIR: 1 USE_REPO_TEST_DIR: 1
TEST_LDAP: 1 TEST_LDAP: 1
test-sqlite: test-sqlite:
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }} if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
runs-on: docker runs-on: docker
needs: [backend-checks, frontend-checks] needs: [backend-checks, frontend-checks]
container: container:
@ -247,7 +258,7 @@ jobs:
TEST_TAGS: sqlite sqlite_unlock_notify TEST_TAGS: sqlite sqlite_unlock_notify
USE_REPO_TEST_DIR: 1 USE_REPO_TEST_DIR: 1
security-check: security-check:
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }} if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
runs-on: docker runs-on: docker
needs: needs:
- test-sqlite - test-sqlite

View file

@ -62,7 +62,7 @@ func initRemoveTags() {
"user", "utente", "lietotājs", "gebruiker", "usuário", "Benutzer", "Bruker", "user", "utente", "lietotājs", "gebruiker", "usuário", "Benutzer", "Bruker",
"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",
"filename", "bestandsnaam", "dosyaadi", "fails", "nome do arquivo", "filename", "bestandsnaam", "dosyaadi", "fails", "nome do arquivo", "datnes nosaukums",
} { } {
oldnew = append(oldnew, "<"+el+">", "REPLACED-TAG") oldnew = append(oldnew, "<"+el+">", "REPLACED-TAG")
} }

View file

@ -1938,7 +1938,7 @@ LEVEL = Info
;ENABLED = true ;ENABLED = true
;; ;;
;; Comma-separated list of allowed file extensions (`.zip`), mime types (`text/plain`) or wildcard type (`image/*`, `audio/*`, `video/*`). Empty value or `*/*` allows all types. ;; Comma-separated list of allowed file extensions (`.zip`), mime types (`text/plain`) or wildcard type (`image/*`, `audio/*`, `video/*`). Empty value or `*/*` allows all types.
;ALLOWED_TYPES = .cpuprofile,.csv,.dmp,.docx,.fodg,.fodp,.fods,.fodt,.gif,.gz,.jpeg,.jpg,.json,.jsonc,.log,.md,.mov,.mp4,.odf,.odg,.odp,.ods,.odt,.patch,.pdf,.png,.pptx,.svg,.tgz,.txt,.webm,.xls,.xlsx,.zip ;ALLOWED_TYPES = .avif,.cpuprofile,.csv,.dmp,.docx,.fodg,.fodp,.fods,.fodt,.gif,.gz,.jpeg,.jpg,.json,.jsonc,.log,.md,.mov,.mp4,.odf,.odg,.odp,.ods,.odt,.patch,.pdf,.png,.pptx,.svg,.tgz,.txt,.webm,.xls,.xlsx,.zip
;; ;;
;; Max size of each file. Defaults to 2048MB ;; Max size of each file. Defaults to 2048MB
;MAX_SIZE = 2048 ;MAX_SIZE = 2048
@ -1976,7 +1976,7 @@ LEVEL = Info
;; Url lookup for the minio bucket only available when STORAGE_TYPE is `minio` ;; Url lookup for the minio bucket only available when STORAGE_TYPE is `minio`
;; Available values: auto, dns, path ;; Available values: auto, dns, path
;; If empty, it behaves the same as "auto" was set ;; If empty, it behaves the same as "auto" was set
;MINIO_BUCKET_LOOKUP = ;MINIO_BUCKET_LOOKUP =
;; ;;
;; Minio location to create bucket only available when STORAGE_TYPE is `minio` ;; Minio location to create bucket only available when STORAGE_TYPE is `minio`
;MINIO_LOCATION = us-east-1 ;MINIO_LOCATION = us-east-1
@ -2703,7 +2703,7 @@ LEVEL = Info
;; Url lookup for the minio bucket only available when STORAGE_TYPE is `minio` ;; Url lookup for the minio bucket only available when STORAGE_TYPE is `minio`
;; Available values: auto, dns, path ;; Available values: auto, dns, path
;; If empty, it behaves the same as "auto" was set ;; If empty, it behaves the same as "auto" was set
;MINIO_BUCKET_LOOKUP = ;MINIO_BUCKET_LOOKUP =
;; ;;
;; Minio location to create bucket only available when STORAGE_TYPE is `minio` ;; Minio location to create bucket only available when STORAGE_TYPE is `minio`
;MINIO_LOCATION = us-east-1 ;MINIO_LOCATION = us-east-1

12
go.mod
View file

@ -23,7 +23,7 @@ require (
github.com/SaveTheRbtz/zstd-seekable-format-go/pkg v0.7.2 github.com/SaveTheRbtz/zstd-seekable-format-go/pkg v0.7.2
github.com/alecthomas/chroma/v2 v2.14.0 github.com/alecthomas/chroma/v2 v2.14.0
github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb
github.com/blevesearch/bleve/v2 v2.4.2 github.com/blevesearch/bleve/v2 v2.4.3
github.com/buildkite/terminal-to-html/v3 v3.16.4 github.com/buildkite/terminal-to-html/v3 v3.16.4
github.com/caddyserver/certmagic v0.21.4 github.com/caddyserver/certmagic v0.21.4
github.com/chi-middleware/proxy v1.1.1 github.com/chi-middleware/proxy v1.1.1
@ -137,13 +137,13 @@ require (
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
github.com/blevesearch/bleve_index_api v1.1.10 // indirect github.com/blevesearch/bleve_index_api v1.1.12 // indirect
github.com/blevesearch/geo v0.1.20 // indirect github.com/blevesearch/geo v0.1.20 // indirect
github.com/blevesearch/go-faiss v1.0.20 // indirect github.com/blevesearch/go-faiss v1.0.23 // indirect
github.com/blevesearch/go-porterstemmer v1.0.3 // indirect github.com/blevesearch/go-porterstemmer v1.0.3 // indirect
github.com/blevesearch/gtreap v0.1.1 // indirect github.com/blevesearch/gtreap v0.1.1 // indirect
github.com/blevesearch/mmap-go v1.0.4 // indirect github.com/blevesearch/mmap-go v1.0.4 // indirect
github.com/blevesearch/scorch_segment_api/v2 v2.2.15 // indirect github.com/blevesearch/scorch_segment_api/v2 v2.2.16 // indirect
github.com/blevesearch/segment v0.9.1 // indirect github.com/blevesearch/segment v0.9.1 // indirect
github.com/blevesearch/snowballstem v0.9.0 // indirect github.com/blevesearch/snowballstem v0.9.0 // indirect
github.com/blevesearch/upsidedown_store_api v1.0.2 // indirect github.com/blevesearch/upsidedown_store_api v1.0.2 // indirect
@ -152,8 +152,8 @@ require (
github.com/blevesearch/zapx/v12 v12.3.10 // indirect github.com/blevesearch/zapx/v12 v12.3.10 // indirect
github.com/blevesearch/zapx/v13 v13.3.10 // indirect github.com/blevesearch/zapx/v13 v13.3.10 // indirect
github.com/blevesearch/zapx/v14 v14.3.10 // indirect github.com/blevesearch/zapx/v14 v14.3.10 // indirect
github.com/blevesearch/zapx/v15 v15.3.13 // indirect github.com/blevesearch/zapx/v15 v15.3.16 // indirect
github.com/blevesearch/zapx/v16 v16.1.5 // indirect github.com/blevesearch/zapx/v16 v16.1.8 // indirect
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

24
go.sum
View file

@ -98,22 +98,22 @@ github.com/bits-and-blooms/bitset v1.13.0 h1:bAQ9OPNFYbGHV6Nez0tmNI0RiEu7/hxlYJR
github.com/bits-and-blooms/bitset v1.13.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/bits-and-blooms/bitset v1.13.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8=
github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb h1:m935MPodAbYS46DG4pJSv7WO+VECIWUQ7OJYSoTrMh4= github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb h1:m935MPodAbYS46DG4pJSv7WO+VECIWUQ7OJYSoTrMh4=
github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb/go.mod h1:PkYb9DJNAwrSvRx5DYA+gUcOIgTGVMNkfSCbZM8cWpI= github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb/go.mod h1:PkYb9DJNAwrSvRx5DYA+gUcOIgTGVMNkfSCbZM8cWpI=
github.com/blevesearch/bleve/v2 v2.4.2 h1:NooYP1mb3c0StkiY9/xviiq2LGSaE8BQBCc/pirMx0U= github.com/blevesearch/bleve/v2 v2.4.3 h1:XDYj+1prgX84L2Cf+V3ojrOPqXxy0qxyd2uLMmeuD+4=
github.com/blevesearch/bleve/v2 v2.4.2/go.mod h1:ATNKj7Yl2oJv/lGuF4kx39bST2dveX6w0th2FFYLkc8= github.com/blevesearch/bleve/v2 v2.4.3/go.mod h1:hEPDPrbYw3vyrm5VOa36GyS4bHWuIf4Fflp7460QQXY=
github.com/blevesearch/bleve_index_api v1.1.10 h1:PDLFhVjrjQWr6jCuU7TwlmByQVCSEURADHdCqVS9+g0= github.com/blevesearch/bleve_index_api v1.1.12 h1:P4bw9/G/5rulOF7SJ9l4FsDoo7UFJ+5kexNy1RXfegY=
github.com/blevesearch/bleve_index_api v1.1.10/go.mod h1:PbcwjIcRmjhGbkS/lJCpfgVSMROV6TRubGGAODaK1W8= github.com/blevesearch/bleve_index_api v1.1.12/go.mod h1:PbcwjIcRmjhGbkS/lJCpfgVSMROV6TRubGGAODaK1W8=
github.com/blevesearch/geo v0.1.20 h1:paaSpu2Ewh/tn5DKn/FB5SzvH0EWupxHEIwbCk/QPqM= github.com/blevesearch/geo v0.1.20 h1:paaSpu2Ewh/tn5DKn/FB5SzvH0EWupxHEIwbCk/QPqM=
github.com/blevesearch/geo v0.1.20/go.mod h1:DVG2QjwHNMFmjo+ZgzrIq2sfCh6rIHzy9d9d0B59I6w= github.com/blevesearch/geo v0.1.20/go.mod h1:DVG2QjwHNMFmjo+ZgzrIq2sfCh6rIHzy9d9d0B59I6w=
github.com/blevesearch/go-faiss v1.0.20 h1:AIkdTQFWuZ5LQmKQSebgMR4RynGNw8ZseJXaan5kvtI= github.com/blevesearch/go-faiss v1.0.23 h1:Wmc5AFwDLKGl2L6mjLX1Da3vCL0EKa2uHHSorcIS1Uc=
github.com/blevesearch/go-faiss v1.0.20/go.mod h1:jrxHrbl42X/RnDPI+wBoZU8joxxuRwedrxqswQ3xfU8= github.com/blevesearch/go-faiss v1.0.23/go.mod h1:OMGQwOaRRYxrmeNdMrXJPvVx8gBnvE5RYrr0BahNnkk=
github.com/blevesearch/go-porterstemmer v1.0.3 h1:GtmsqID0aZdCSNiY8SkuPJ12pD4jI+DdXTAn4YRcHCo= github.com/blevesearch/go-porterstemmer v1.0.3 h1:GtmsqID0aZdCSNiY8SkuPJ12pD4jI+DdXTAn4YRcHCo=
github.com/blevesearch/go-porterstemmer v1.0.3/go.mod h1:angGc5Ht+k2xhJdZi511LtmxuEf0OVpvUUNrwmM1P7M= github.com/blevesearch/go-porterstemmer v1.0.3/go.mod h1:angGc5Ht+k2xhJdZi511LtmxuEf0OVpvUUNrwmM1P7M=
github.com/blevesearch/gtreap v0.1.1 h1:2JWigFrzDMR+42WGIN/V2p0cUvn4UP3C4Q5nmaZGW8Y= github.com/blevesearch/gtreap v0.1.1 h1:2JWigFrzDMR+42WGIN/V2p0cUvn4UP3C4Q5nmaZGW8Y=
github.com/blevesearch/gtreap v0.1.1/go.mod h1:QaQyDRAT51sotthUWAH4Sj08awFSSWzgYICSZ3w0tYk= github.com/blevesearch/gtreap v0.1.1/go.mod h1:QaQyDRAT51sotthUWAH4Sj08awFSSWzgYICSZ3w0tYk=
github.com/blevesearch/mmap-go v1.0.4 h1:OVhDhT5B/M1HNPpYPBKIEJaD0F3Si+CrEKULGCDPWmc= github.com/blevesearch/mmap-go v1.0.4 h1:OVhDhT5B/M1HNPpYPBKIEJaD0F3Si+CrEKULGCDPWmc=
github.com/blevesearch/mmap-go v1.0.4/go.mod h1:EWmEAOmdAS9z/pi/+Toxu99DnsbhG1TIxUoRmJw/pSs= github.com/blevesearch/mmap-go v1.0.4/go.mod h1:EWmEAOmdAS9z/pi/+Toxu99DnsbhG1TIxUoRmJw/pSs=
github.com/blevesearch/scorch_segment_api/v2 v2.2.15 h1:prV17iU/o+A8FiZi9MXmqbagd8I0bCqM7OKUYPbnb5Y= github.com/blevesearch/scorch_segment_api/v2 v2.2.16 h1:uGvKVvG7zvSxCwcm4/ehBa9cCEuZVE+/zvrSl57QUVY=
github.com/blevesearch/scorch_segment_api/v2 v2.2.15/go.mod h1:db0cmP03bPNadXrCDuVkKLV6ywFSiRgPFT1YVrestBc= github.com/blevesearch/scorch_segment_api/v2 v2.2.16/go.mod h1:VF5oHVbIFTu+znY1v30GjSpT5+9YFs9dV2hjvuh34F0=
github.com/blevesearch/segment v0.9.1 h1:+dThDy+Lvgj5JMxhmOVlgFfkUtZV2kw49xax4+jTfSU= github.com/blevesearch/segment v0.9.1 h1:+dThDy+Lvgj5JMxhmOVlgFfkUtZV2kw49xax4+jTfSU=
github.com/blevesearch/segment v0.9.1/go.mod h1:zN21iLm7+GnBHWTao9I+Au/7MBiL8pPFtJBJTsk6kQw= github.com/blevesearch/segment v0.9.1/go.mod h1:zN21iLm7+GnBHWTao9I+Au/7MBiL8pPFtJBJTsk6kQw=
github.com/blevesearch/snowballstem v0.9.0 h1:lMQ189YspGP6sXvZQ4WZ+MLawfV8wOmPoD/iWeNXm8s= github.com/blevesearch/snowballstem v0.9.0 h1:lMQ189YspGP6sXvZQ4WZ+MLawfV8wOmPoD/iWeNXm8s=
@ -130,10 +130,10 @@ github.com/blevesearch/zapx/v13 v13.3.10 h1:0KY9tuxg06rXxOZHg3DwPJBjniSlqEgVpxIq
github.com/blevesearch/zapx/v13 v13.3.10/go.mod h1:w2wjSDQ/WBVeEIvP0fvMJZAzDwqwIEzVPnCPrz93yAk= github.com/blevesearch/zapx/v13 v13.3.10/go.mod h1:w2wjSDQ/WBVeEIvP0fvMJZAzDwqwIEzVPnCPrz93yAk=
github.com/blevesearch/zapx/v14 v14.3.10 h1:SG6xlsL+W6YjhX5N3aEiL/2tcWh3DO75Bnz77pSwwKU= github.com/blevesearch/zapx/v14 v14.3.10 h1:SG6xlsL+W6YjhX5N3aEiL/2tcWh3DO75Bnz77pSwwKU=
github.com/blevesearch/zapx/v14 v14.3.10/go.mod h1:qqyuR0u230jN1yMmE4FIAuCxmahRQEOehF78m6oTgns= github.com/blevesearch/zapx/v14 v14.3.10/go.mod h1:qqyuR0u230jN1yMmE4FIAuCxmahRQEOehF78m6oTgns=
github.com/blevesearch/zapx/v15 v15.3.13 h1:6EkfaZiPlAxqXz0neniq35my6S48QI94W/wyhnpDHHQ= github.com/blevesearch/zapx/v15 v15.3.16 h1:Ct3rv7FUJPfPk99TI/OofdC+Kpb4IdyfdMH48sb+FmE=
github.com/blevesearch/zapx/v15 v15.3.13/go.mod h1:Turk/TNRKj9es7ZpKK95PS7f6D44Y7fAFy8F4LXQtGg= github.com/blevesearch/zapx/v15 v15.3.16/go.mod h1:Turk/TNRKj9es7ZpKK95PS7f6D44Y7fAFy8F4LXQtGg=
github.com/blevesearch/zapx/v16 v16.1.5 h1:b0sMcarqNFxuXvjoXsF8WtwVahnxyhEvBSRJi/AUHjU= github.com/blevesearch/zapx/v16 v16.1.8 h1:Bxzpw6YQpFs7UjoCV1+RvDw6fmAT2GZxldwX8b3wVBM=
github.com/blevesearch/zapx/v16 v16.1.5/go.mod h1:J4mSF39w1QELc11EWRSBFkPeZuO7r/NPKkHzDCoiaI8= github.com/blevesearch/zapx/v16 v16.1.8/go.mod h1:JqQlOqlRVaYDkpLIl3JnKql8u4zKTNlVEa3nLsi0Gn8=
github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
github.com/boombuler/barcode v1.0.1 h1:NDBbPmhS+EqABEs5Kg3n/5ZNjy73Pz7SIV+KCeqyXcs= github.com/boombuler/barcode v1.0.1 h1:NDBbPmhS+EqABEs5Kg3n/5ZNjy73Pz7SIV+KCeqyXcs=
github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=

View file

@ -96,7 +96,7 @@ func parsePackage(r io.Reader) (*Package, error) {
Target *string `json:"target"` Target *string `json:"target"`
Kind string `json:"kind"` Kind string `json:"kind"`
Registry *string `json:"registry"` Registry *string `json:"registry"`
ExplicitNameInToml string `json:"explicit_name_in_toml"` ExplicitNameInToml *string `json:"explicit_name_in_toml"`
} `json:"deps"` } `json:"deps"`
Features map[string][]string `json:"features"` Features map[string][]string `json:"features"`
Authors []string `json:"authors"` Authors []string `json:"authors"`
@ -136,8 +136,16 @@ func parsePackage(r io.Reader) (*Package, error) {
dependencies := make([]*Dependency, 0, len(meta.Deps)) dependencies := make([]*Dependency, 0, len(meta.Deps))
for _, dep := range meta.Deps { for _, dep := range meta.Deps {
name := dep.Name
packageName := dep.ExplicitNameInToml
// If the explicit_name_in_toml field is set, the package is renamed and
// should be set accordingly.
if dep.ExplicitNameInToml != nil {
name = *dep.ExplicitNameInToml
packageName = &dep.Name
}
dependencies = append(dependencies, &Dependency{ dependencies = append(dependencies, &Dependency{
Name: dep.Name, Name: name,
Req: dep.VersionReq, Req: dep.VersionReq,
Features: dep.Features, Features: dep.Features,
Optional: dep.Optional, Optional: dep.Optional,
@ -145,6 +153,7 @@ func parsePackage(r io.Reader) (*Package, error) {
Target: dep.Target, Target: dep.Target,
Kind: dep.Kind, Kind: dep.Kind,
Registry: dep.Registry, Registry: dep.Registry,
Package: packageName,
}) })
} }

View file

@ -22,7 +22,7 @@ const (
) )
func TestParsePackage(t *testing.T) { func TestParsePackage(t *testing.T) {
createPackage := func(name, version string) io.Reader { createPackage := func(name, version, dependency string) io.Reader {
metadata := `{ metadata := `{
"name":"` + name + `", "name":"` + name + `",
"vers":"` + version + `", "vers":"` + version + `",
@ -32,7 +32,7 @@ func TestParsePackage(t *testing.T) {
{ {
"name":"dep", "name":"dep",
"version_req":"1.0" "version_req":"1.0"
} }` + dependency + `
], ],
"homepage":"` + homepage + `", "homepage":"` + homepage + `",
"license":"` + license + `" "license":"` + license + `"
@ -48,7 +48,7 @@ func TestParsePackage(t *testing.T) {
t.Run("InvalidName", func(t *testing.T) { t.Run("InvalidName", func(t *testing.T) {
for _, name := range []string{"", "0test", "-test", "_test", strings.Repeat("a", 65)} { for _, name := range []string{"", "0test", "-test", "_test", strings.Repeat("a", 65)} {
data := createPackage(name, "1.0.0") data := createPackage(name, "1.0.0", "")
cp, err := ParsePackage(data) cp, err := ParsePackage(data)
assert.Nil(t, cp) assert.Nil(t, cp)
@ -58,7 +58,7 @@ func TestParsePackage(t *testing.T) {
t.Run("InvalidVersion", func(t *testing.T) { t.Run("InvalidVersion", func(t *testing.T) {
for _, version := range []string{"", "1.", "-1.0", "1.0.0/1"} { for _, version := range []string{"", "1.", "-1.0", "1.0.0/1"} {
data := createPackage("test", version) data := createPackage("test", version, "")
cp, err := ParsePackage(data) cp, err := ParsePackage(data)
assert.Nil(t, cp) assert.Nil(t, cp)
@ -67,7 +67,7 @@ func TestParsePackage(t *testing.T) {
}) })
t.Run("Valid", func(t *testing.T) { t.Run("Valid", func(t *testing.T) {
data := createPackage("test", "1.0.0") data := createPackage("test", "1.0.0", "")
cp, err := ParsePackage(data) cp, err := ParsePackage(data)
assert.NotNil(t, cp) assert.NotNil(t, cp)
@ -84,4 +84,25 @@ func TestParsePackage(t *testing.T) {
content, _ := io.ReadAll(cp.Content) content, _ := io.ReadAll(cp.Content)
assert.Equal(t, "test", string(content)) assert.Equal(t, "test", string(content))
}) })
t.Run("Renamed dependency", func(t *testing.T) {
data := createPackage("test", "1.0.0", `, {"name":"v4l2-sys", "version":"0.3.0", "explicit_name_in_toml":"v4l2-sys-mit"}`)
cp, err := ParsePackage(data)
assert.NotNil(t, cp)
require.NoError(t, err)
assert.Equal(t, "test", cp.Name)
assert.Equal(t, "1.0.0", cp.Version)
assert.Equal(t, description, cp.Metadata.Description)
assert.Equal(t, []string{author}, cp.Metadata.Authors)
assert.Len(t, cp.Metadata.Dependencies, 2)
assert.Equal(t, "dep", cp.Metadata.Dependencies[0].Name)
assert.EqualValues(t, "v4l2-sys-mit", cp.Metadata.Dependencies[1].Name)
assert.EqualValues(t, "v4l2-sys", *cp.Metadata.Dependencies[1].Package)
assert.Equal(t, homepage, cp.Metadata.ProjectURL)
assert.Equal(t, license, cp.Metadata.License)
content, _ := io.ReadAll(cp.Content)
assert.Equal(t, "test", string(content))
})
} }

View file

@ -12,7 +12,7 @@ var Attachment = struct {
Enabled bool Enabled bool
}{ }{
Storage: &Storage{}, Storage: &Storage{},
AllowedTypes: ".cpuprofile,.csv,.dmp,.docx,.fodg,.fodp,.fods,.fodt,.gif,.gz,.jpeg,.jpg,.json,.jsonc,.log,.md,.mov,.mp4,.odf,.odg,.odp,.ods,.odt,.patch,.pdf,.png,.pptx,.svg,.tgz,.txt,.webm,.webp,.xls,.xlsx,.zip", AllowedTypes: ".avif,.cpuprofile,.csv,.dmp,.docx,.fodg,.fodp,.fods,.fodt,.gif,.gz,.jpeg,.jpg,.json,.jsonc,.log,.md,.mov,.mp4,.odf,.odg,.odp,.ods,.odt,.patch,.pdf,.png,.pptx,.svg,.tgz,.txt,.webm,.webp,.xls,.xlsx,.zip",
MaxSize: 2048, MaxSize: 2048,
MaxFiles: 5, MaxFiles: 5,
Enabled: true, Enabled: true,
@ -25,7 +25,7 @@ func loadAttachmentFrom(rootCfg ConfigProvider) (err error) {
return err return err
} }
Attachment.AllowedTypes = sec.Key("ALLOWED_TYPES").MustString(".cpuprofile,.csv,.dmp,.docx,.fodg,.fodp,.fods,.fodt,.gif,.gz,.jpeg,.jpg,.json,.jsonc,.log,.md,.mov,.mp4,.odf,.odg,.odp,.ods,.odt,.patch,.pdf,.png,.pptx,.svg,.tgz,.txt,.webm,.webp,.xls,.xlsx,.zip") Attachment.AllowedTypes = sec.Key("ALLOWED_TYPES").MustString(".avif,.cpuprofile,.csv,.dmp,.docx,.fodg,.fodp,.fods,.fodt,.gif,.gz,.jpeg,.jpg,.json,.jsonc,.log,.md,.mov,.mp4,.odf,.odg,.odp,.ods,.odt,.patch,.pdf,.png,.pptx,.svg,.tgz,.txt,.webm,.webp,.xls,.xlsx,.zip")
Attachment.MaxSize = sec.Key("MAX_SIZE").MustInt64(2048) Attachment.MaxSize = sec.Key("MAX_SIZE").MustInt64(2048)
Attachment.MaxFiles = sec.Key("MAX_FILES").MustInt(5) Attachment.MaxFiles = sec.Key("MAX_FILES").MustInt(5)
Attachment.Enabled = sec.Key("ENABLED").MustBool(true) Attachment.Enabled = sec.Key("ENABLED").MustBool(true)

View file

@ -486,7 +486,7 @@ func PrintCurrentTest(t testing.TB, skip ...int) func() {
if err := WriterCloser.popT(); err != nil { if err := WriterCloser.popT(); err != nil {
// disable test failure for now (too flacky) // disable test failure for now (too flacky)
_, _ = fmt.Fprintf(os.Stdout, "testlogger.go:recordError() FATAL ERROR: log.Error has been called: %v", err) _, _ = fmt.Fprintf(os.Stdout, "testlogger.go:recordError() FATAL ERROR: log.Error has been called: %v\n", err)
// t.Errorf("testlogger.go:recordError() FATAL ERROR: log.Error has been called: %v", err) // t.Errorf("testlogger.go:recordError() FATAL ERROR: log.Error has been called: %v", err)
} }
} }

View file

@ -20,6 +20,8 @@ const sniffLen = 1024
const ( const (
// SvgMimeType MIME type of SVG images. // SvgMimeType MIME type of SVG images.
SvgMimeType = "image/svg+xml" SvgMimeType = "image/svg+xml"
// AvifMimeType MIME type of AVIF images
AvifMimeType = "image/avif"
// ApplicationOctetStream MIME type of binary files. // ApplicationOctetStream MIME type of binary files.
ApplicationOctetStream = "application/octet-stream" ApplicationOctetStream = "application/octet-stream"
) )
@ -106,6 +108,12 @@ func DetectContentType(data []byte) SniffedType {
} }
} }
// AVIF is unsuported by http.DetectContentType
// Signature taken from https://stackoverflow.com/a/68322450
if bytes.Index(data, []byte("ftypavif")) == 4 {
ct = AvifMimeType
}
if strings.HasPrefix(ct, "audio/") && bytes.HasPrefix(data, []byte("ID3")) { if strings.HasPrefix(ct, "audio/") && bytes.HasPrefix(data, []byte("ID3")) {
// The MP3 detection is quite inaccurate, any content with "ID3" prefix will result in "audio/mpeg". // The MP3 detection is quite inaccurate, any content with "ID3" prefix will result in "audio/mpeg".
// So remove the "ID3" prefix and detect again, if result is text, then it must be text content. // So remove the "ID3" prefix and detect again, if result is text, then it must be text content.

View file

@ -135,3 +135,13 @@ func TestDetectContentTypeOgg(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
assert.True(t, st.IsVideo()) assert.True(t, st.IsVideo())
} }
func TestDetectContentTypeAvif(t *testing.T) {
avifImage, err := hex.DecodeString("000000206674797061766966")
require.NoError(t, err)
st, err := DetectContentTypeFromReader(bytes.NewReader(avifImage))
require.NoError(t, err)
assert.True(t, st.IsImage())
}

View file

@ -2859,6 +2859,7 @@ issues.review.add_remove_review_requests = požádal/a o kontroly od %[1]s a ods
pulls.delete_after_merge.head_branch.is_default = Větev hlavy, kterou chcete odstranit, je výchozí větví a nelze ji odstranit. pulls.delete_after_merge.head_branch.is_default = Větev hlavy, kterou chcete odstranit, je výchozí větví a nelze ji odstranit.
pulls.delete_after_merge.head_branch.is_protected = Větev hlavy, kterou chcete odstranit, je chráněnou větví a nelze ji odstranit. pulls.delete_after_merge.head_branch.is_protected = Větev hlavy, kterou chcete odstranit, je chráněnou větví a nelze ji odstranit.
pulls.delete_after_merge.head_branch.insufficient_branch = Nemáte oprávnění k odstranění větve hlavy. pulls.delete_after_merge.head_branch.insufficient_branch = Nemáte oprávnění k odstranění větve hlavy.
issues.filter_sort.relevance = Relevance
[graphs] [graphs]
component_loading_info = Tohle může chvíli trvat… component_loading_info = Tohle může chvíli trvat…

View file

@ -2844,6 +2844,7 @@ issues.review.add_remove_review_requests = hat Reviews von %[1]s angefragt und h
pulls.delete_after_merge.head_branch.is_default = Der Head-Branch, den Sie löschen wollen, ist der Standardbranch und kann nicht gelöscht werden. pulls.delete_after_merge.head_branch.is_default = Der Head-Branch, den Sie löschen wollen, ist der Standardbranch und kann nicht gelöscht werden.
pulls.delete_after_merge.head_branch.is_protected = Der Head-Branch, den Sie löschen wollen, ist ein geschützter Branch und kann nicht gelöscht werden. pulls.delete_after_merge.head_branch.is_protected = Der Head-Branch, den Sie löschen wollen, ist ein geschützter Branch und kann nicht gelöscht werden.
pulls.delete_after_merge.head_branch.insufficient_branch = Sie haben keine Erlaubnis, den Head-Branch zu löschen. pulls.delete_after_merge.head_branch.insufficient_branch = Sie haben keine Erlaubnis, den Head-Branch zu löschen.
issues.filter_sort.relevance = Relevanz
[graphs] [graphs]

View file

@ -199,6 +199,11 @@ buttons.enable_monospace_font=Activar fuente monoespaciada
buttons.disable_monospace_font=Desactivar fuente monoespaciada buttons.disable_monospace_font=Desactivar fuente monoespaciada
buttons.unindent.tooltip = Desanidar elementos por un nivel buttons.unindent.tooltip = Desanidar elementos por un nivel
buttons.indent.tooltip = Anidar elementos por un nivel buttons.indent.tooltip = Anidar elementos por un nivel
buttons.new_table.tooltip = Añadir tabla
table_modal.header = Añadir tabla
table_modal.placeholder.header = Cabecera
table_modal.label.rows = Filas
table_modal.label.columns = Columnas
[filter] [filter]
string.asc=A - Z string.asc=A - Z
@ -475,6 +480,7 @@ back_to_sign_in = Volver a Iniciar sesión
sign_in_openid = Proceder con OpenID sign_in_openid = Proceder con OpenID
remember_me.compromised = El identificador de inicio de sesión ya no es válido, lo que puede indicar una cuenta comprometida. Por favor, verifica si tu cuenta presenta actividades sospechosas. remember_me.compromised = El identificador de inicio de sesión ya no es válido, lo que puede indicar una cuenta comprometida. Por favor, verifica si tu cuenta presenta actividades sospechosas.
unauthorized_credentials = Las credenciales son incorrectas o han expirado. Reintenta el comando o visita %s para más información unauthorized_credentials = Las credenciales son incorrectas o han expirado. Reintenta el comando o visita %s para más información
use_onetime_code = Usar código de un solo uso
[mail] [mail]
view_it_on=Ver en %s view_it_on=Ver en %s
@ -1036,7 +1042,7 @@ update_hints = Actualizar sugerencias
pronouns = Pronombres pronouns = Pronombres
pronouns_custom = Personalizados pronouns_custom = Personalizados
additional_repo_units_hint = Sugerir la habilitación de unidades de repositorio adicionales additional_repo_units_hint = Sugerir la habilitación de unidades de repositorio adicionales
additional_repo_units_hint_description = Mostrar un botón "Añadir más unidades..." para los repositorios que no tengan habilitadas todas las unidades disponibles. additional_repo_units_hint_description = Mostrar la sugerencia "Habilitar más" para los repositorios que no tengan habilitadas todas las unidades disponibles.
language.title = Idioma por defecto language.title = Idioma por defecto
update_hints_success = Se han actualizado las sugerencias. update_hints_success = Se han actualizado las sugerencias.
pronouns_unspecified = No especificados pronouns_unspecified = No especificados
@ -1769,8 +1775,8 @@ issues.review.left_comment=dejó un comentario
issues.review.content.empty=Es necesario dejar un comentario indicando los cambios solicitados. issues.review.content.empty=Es necesario dejar un comentario indicando los cambios solicitados.
issues.review.reject=cambios solicitados %s issues.review.reject=cambios solicitados %s
issues.review.wait=fue solicitado para revisión %s issues.review.wait=fue solicitado para revisión %s
issues.review.add_review_request=solicitó revisión de %s %s issues.review.add_review_request=solicitó revisión de %[1]s %[2]s
issues.review.remove_review_request=eliminó la solicitud de revisión para %s %s issues.review.remove_review_request=eliminó la solicitud de revisión para %[1]s %[2]s
issues.review.remove_review_request_self=se negó a revisar %s issues.review.remove_review_request_self=se negó a revisar %s
issues.review.pending=Pendiente issues.review.pending=Pendiente
issues.review.pending.tooltip=Este comentario no es visible actualmente para otros usuarios. Para enviar sus comentarios pendientes, seleccione "%s" -> "%s/%s/%s" en la parte superior de la página. issues.review.pending.tooltip=Este comentario no es visible actualmente para otros usuarios. Para enviar sus comentarios pendientes, seleccione "%s" -> "%s/%s/%s" en la parte superior de la página.
@ -2750,7 +2756,7 @@ pulls.cmd_instruction_merge_title = Fusionar
contributors.contribution_type.deletions = Eliminaciones contributors.contribution_type.deletions = Eliminaciones
contributors.contribution_type.filter_label = Tipo de contribución: contributors.contribution_type.filter_label = Tipo de contribución:
contributors.contribution_type.additions = Adiciones contributors.contribution_type.additions = Adiciones
settings.units.add_more = Añadir más... settings.units.add_more = Habilitar más
wiki.cancel = Cancelar wiki.cancel = Cancelar
activity.published_prerelease_label = Pre-lanzamiento activity.published_prerelease_label = Pre-lanzamiento
activity.published_tag_label = Etiqueta activity.published_tag_label = Etiqueta
@ -2775,6 +2781,16 @@ settings.mirror_settings.push_mirror.copy_public_key = Copiar clave pública
issues.new.assign_to_me = Asignar a mi issues.new.assign_to_me = Asignar a mi
issues.all_title = Todos issues.all_title = Todos
settings.wiki_globally_editable = Permitir a cualquiera editar la wiki settings.wiki_globally_editable = Permitir a cualquiera editar la wiki
settings.new_owner_blocked_doer = El nuevo propietario te ha bloqueado.
settings.add_collaborator_blocked_our = No se puede añadir al colaborador debido a que el propietario del repositorio lo ha bloqueado.
settings.discord_icon_url.exceeds_max_length = La URL del icono debe tener una longitud menor o igual a 2048 caracteres
settings.add_webhook.invalid_path = La ruta no debe contener una parte que sea "." o ".." o la cadena vacía. No puede empezar o acabar con una barra oblicua.
settings.wiki_rename_branch_main_notices_1 = Esta operación <strong>NO SE PUEDE</strong> deshacer.
settings.add_collaborator_blocked_them = No se puede añadir al colaborador debido a que este ha bloqueado al propietario del repositorio.
settings.transfer.button = Transferir la propiedad
settings.transfer.modal.title = Transferir la propiedad
settings.enter_repo_name = Introduce el nombre del propietario y del repositorio exactamente como se muestra:
settings.confirmation_string = Cadena de confirmación
[graphs] [graphs]
@ -3814,6 +3830,7 @@ exact_tooltip = Incluir sólo los resultados que corresponden al término de bú
issue_kind = Buscar incidencias… issue_kind = Buscar incidencias…
fuzzy = Difusa fuzzy = Difusa
runner_kind = Buscar ejecutores… runner_kind = Buscar ejecutores…
regexp_tooltip = Interpretar los términos de búsqueda como una expresión regular
[markup] [markup]
filepreview.lines = Líneas %[1]d a %[2]d en %[3]s filepreview.lines = Líneas %[1]d a %[2]d en %[3]s

View file

@ -567,6 +567,7 @@ followers.title.few = seuraajaa
following.title.one = Seurataan 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>.
[settings] [settings]
@ -801,6 +802,10 @@ change_password_success = Salasanasi on päivitetty. Kirjaudu jatkossa käyttäe
manage_oauth2_applications = Hallitse OAuth2-sovelluksia manage_oauth2_applications = Hallitse OAuth2-sovelluksia
change_password = Vaihda salasana change_password = Vaihda salasana
webauthn_key_loss_warning = Jos kadotat turva-avaimesi, menetät pääsyn tilillesi. webauthn_key_loss_warning = Jos kadotat turva-avaimesi, menetät pääsyn tilillesi.
keep_activity_private.description = <a href="%s">Julkinen toimintasi</a> näkyy vain sinulle ja instanssin ylläpitäjille.
email_desc = Ensisijaista sähköpostiosoitettasi käytetään ilmoituksiin, salasanan palautukseen ja jos sähköpostiosoite ei ole piilotettu, web-pohjaisiin Git-toimenpiteisiin.
tokens_desc = Nämä poletit mahdollistavat pääsyn tilillesi Forgejon rajapintaa vasten.
keep_email_private_popup = Tämä piilottaa sähköpostiosoitteesi profiilistasi. Se ei ole enää oletus verkkosivukäyttöliittymän kautta tehdyissä kommiteissa, kuten tiedostojen lähetyksissä ja muokkauksissa, eikä sitä käytetä yhdistämiskommiteissa. Sen sijaan erikoisosoitetta %s voidaan käyttää kommittien liittämisessä tiliisi. Ota huomioon, ettei tämän asetuksen muuttaminen vaikuta olemassa oleviin kommitteihin.
[repo] [repo]
owner=Omistaja owner=Omistaja
@ -2384,6 +2389,7 @@ conan.registry = Määritä tämä rekisteri komentoriviltä:
conda.install = Asenna paketti Condalla suorittamalla seuraava komento: conda.install = Asenna paketti Condalla suorittamalla seuraava komento:
helm.registry = Määritä tämä rekisteri komentoriviltä: helm.registry = Määritä tämä rekisteri komentoriviltä:
pub.install = Asenna paketti Dartilla suorittamalla seuraava komento: pub.install = Asenna paketti Dartilla suorittamalla seuraava komento:
owner.settings.cargo.title = Cargon rekisteri-indeksi
[secrets] [secrets]
creation.failed = Salaisuuden lisääminen epäonnistui. creation.failed = Salaisuuden lisääminen epäonnistui.

View file

@ -201,6 +201,11 @@ buttons.disable_monospace_font=Désactiver la police à chasse fixe
buttons.indent.tooltip = Indenter les éléments d'un niveau buttons.indent.tooltip = Indenter les éléments d'un niveau
buttons.unindent.tooltip = Supprimer un niveau d'indentation buttons.unindent.tooltip = Supprimer un niveau d'indentation
buttons.new_table.tooltip = Ajouter une table buttons.new_table.tooltip = Ajouter une table
table_modal.header = Ajouter une table
table_modal.placeholder.header = Entête
table_modal.placeholder.content = Contenu
table_modal.label.rows = Lignes
table_modal.label.columns = Colonnes
[filter] [filter]
string.asc=A - Z string.asc=A - Z
@ -480,6 +485,7 @@ hint_login = Vous avez déjà un compte? <a href="%s">Connectez vous maintena
back_to_sign_in = Retour à la connexion back_to_sign_in = Retour à la connexion
sign_in_openid = Continuer avec OpenID sign_in_openid = Continuer avec OpenID
unauthorized_credentials = Vos identifiants sont invalides ou ont expiré. Réessayez votre commande, ou allez à %s pour plus d'informations unauthorized_credentials = Vos identifiants sont invalides ou ont expiré. Réessayez votre commande, ou allez à %s pour plus d'informations
use_onetime_code = Utiliser un code a usage unique
[mail] [mail]
view_it_on=Voir sur %s view_it_on=Voir sur %s
@ -743,7 +749,7 @@ uid=UID
webauthn=Clés de sécurité à deux facteurs webauthn=Clés de sécurité à deux facteurs
public_profile=Profil public public_profile=Profil public
biography_placeholder=Parlez-nous un peu de vous! (Vous pouvez utiliser Markdown) biography_placeholder=Parlez-nous un peu de vous! (Markdown est interprété)
location_placeholder=Partagez votre position approximative avec d'autres personnes location_placeholder=Partagez votre position approximative avec d'autres personnes
profile_desc=Contrôlez comment votre profil est affiché aux autres utilisateurs. Votre adresse courriel principale sera utilisée pour les notifications, la récupération de mot de passe et les opérations Git basées sur le Web. profile_desc=Contrôlez comment votre profil est affiché aux autres utilisateurs. Votre adresse courriel principale sera utilisée pour les notifications, la récupération de mot de passe et les opérations Git basées sur le Web.
password_username_disabled=Les utilisateurs externes ne sont pas autorisés à modifier leur nom d'utilisateur. Veuillez contacter l'administrateur de votre site pour plus de détails. password_username_disabled=Les utilisateurs externes ne sont pas autorisés à modifier leur nom d'utilisateur. Veuillez contacter l'administrateur de votre site pour plus de détails.
@ -939,7 +945,7 @@ select_permissions=Sélectionner les autorisations
permission_no_access=Aucun accès permission_no_access=Aucun accès
permission_read=Lecture permission_read=Lecture
permission_write=Lecture et écriture permission_write=Lecture et écriture
access_token_desc=Les autorisations des jetons sélectionnées se limitent aux <a href="%[1]s" target="_blank">routes API</a> correspondantes. Lisez la <a href="%[2]s" target="_blank">documentation</a> pour plus dinformations. access_token_desc=Les autorisations des jetons sélectionnées se limitent aux <a href="%[1]s" target="_blank">routes API</a> correspondantes. Lisez la <a href="%[2]s" target="_blank">documentation</a> pour plus dinformation.
at_least_one_permission=Vous devez sélectionner au moins une permission pour créer un jeton at_least_one_permission=Vous devez sélectionner au moins une permission pour créer un jeton
permissions_list=Autorisations : permissions_list=Autorisations :
@ -1781,8 +1787,8 @@ issues.review.left_comment=laisser un commentaire
issues.review.content.empty=Vous devez laisser un commentaire indiquant le(s) changement(s) demandé(s). issues.review.content.empty=Vous devez laisser un commentaire indiquant le(s) changement(s) demandé(s).
issues.review.reject=a requis les changements %s issues.review.reject=a requis les changements %s
issues.review.wait=a été sollicité pour évaluer cette demande dajout %s issues.review.wait=a été sollicité pour évaluer cette demande dajout %s
issues.review.add_review_request=a demandé à %s une évaluation %s issues.review.add_review_request=demande d'évaluation de %[1]s %[2]s
issues.review.remove_review_request=a retiré la demande dévaluation pour %s %s issues.review.remove_review_request=demande dévaluation retirée pour %[1]s %[2]s
issues.review.remove_review_request_self=a refusé dévaluer cette demande dajout %s issues.review.remove_review_request_self=a refusé dévaluer cette demande dajout %s
issues.review.pending=En attente issues.review.pending=En attente
issues.review.pending.tooltip=Ce commentaire n'est pas encore visible par les autres utilisateurs. Pour soumettre vos commentaires en attente, sélectionnez "%s" → "%s/%s/%s" en haut de la page. issues.review.pending.tooltip=Ce commentaire n'est pas encore visible par les autres utilisateurs. Pour soumettre vos commentaires en attente, sélectionnez "%s" → "%s/%s/%s" en haut de la page.
@ -2583,7 +2589,7 @@ diff.generated=générée
diff.vendored=externe diff.vendored=externe
diff.comment.add_line_comment=Commenter cette ligne diff.comment.add_line_comment=Commenter cette ligne
diff.comment.placeholder=Laisser un commentaire diff.comment.placeholder=Laisser un commentaire
diff.comment.markdown_info=Formater avec Markdown. diff.comment.markdown_info=Formater avec Markdown est autorisé.
diff.comment.add_single_comment=Commenter (simple) diff.comment.add_single_comment=Commenter (simple)
diff.comment.add_review_comment=Commenter diff.comment.add_review_comment=Commenter
diff.comment.start_review=Débuter une évaluation diff.comment.start_review=Débuter une évaluation
@ -2834,12 +2840,12 @@ settings.pull_mirror_sync_quota_exceeded = Quota dépassé, les modifications ne
activity.commit = Activité de commit activity.commit = Activité de commit
settings.mirror_settings.push_mirror.copy_public_key = Copier la clé publique settings.mirror_settings.push_mirror.copy_public_key = Copier la clé publique
release.asset_external_url = URL externe release.asset_external_url = URL externe
release.invalid_external_url = URL externe non valable : « %s » release.invalid_external_url = URL externe non valable : "%s "
milestones.filter_sort.name = Nom milestones.filter_sort.name = Nom
settings.mirror_settings.push_mirror.none_ssh = Aucun settings.mirror_settings.push_mirror.none_ssh = Aucun
settings.protect_new_rule = Créer une nouvelle règle de protection de branche settings.protect_new_rule = Créer une nouvelle règle de protection de branche
pulls.cmd_instruction_merge_warning = <b>Avertissement :</b> Le paramètre "détection automatique de la fusion manuelle" n'est pas activé pour ce dépôt, vous devrez marquer cette demande d'ajout comme manuellement fusionnée après. pulls.cmd_instruction_merge_warning = <b>Avertissement :</b> Le paramètre "détection automatique de la fusion manuelle" n'est pas activé pour ce dépôt, vous devrez marquer cette demande d'ajout comme manuellement fusionnée après.
release.type_external_asset = Actif Externe release.type_external_asset = Actif externe
activity.published_prerelease_label = Pré-version activity.published_prerelease_label = Pré-version
activity.published_tag_label = Étiquette activity.published_tag_label = Étiquette
release.asset_name = Nom de l'actif release.asset_name = Nom de l'actif
@ -2847,6 +2853,13 @@ release.add_external_asset = Ajouter un actif externe
issues.new.assign_to_me = Assigner à moi-même issues.new.assign_to_me = Assigner à moi-même
issues.all_title = Tous issues.all_title = Tous
settings.discord_icon_url.exceeds_max_length = L'URL de licône ne doit pas dépasser 2048 caractères settings.discord_icon_url.exceeds_max_length = L'URL de licône ne doit pas dépasser 2048 caractères
issues.review.add_review_requests = demandes d'évaluation de %[1]s %[2]s
issues.review.remove_review_requests = demandes dévaluation retirée pour %[1]s %[2]s
issues.review.add_remove_review_requests = demandes d'évaluation pour %[1]s et demandes d'évaluation retirées pour %[2]s %[3]s
pulls.delete_after_merge.head_branch.is_protected = La branche head que vous voulez supprimer est une branche protégée et ne peut pas être supprimée.
pulls.delete_after_merge.head_branch.is_default = La branche head que vous voulez supprimer est la branche par défaut et ne peut pas être supprimée.
pulls.delete_after_merge.head_branch.insufficient_branch = Vous n'avez pas le droit de supprimer la branche head.
issues.filter_sort.relevance = Pertinence
[graphs] [graphs]
component_loading=Chargement de %s… component_loading=Chargement de %s…

View file

@ -1172,20 +1172,20 @@ invisible_runes_header=`Šīs fails satur neredzamus unikoda simbolus`
invisible_runes_description=`Šis fails satur neredzamus unikoda simbolus, kas ir neatšķirami cilvēkiem, bet dators tās var atstrādāt atšķirīgi. Ja šķiet, ka tas ir ar nolūku, šo brīdinājumu var droši neņemt vērā. Jāizmanto atsoļa taustiņš (Esc), lai atklātu tās.` invisible_runes_description=`Šis fails satur neredzamus unikoda simbolus, kas ir neatšķirami cilvēkiem, bet dators tās var atstrādāt atšķirīgi. Ja šķiet, ka tas ir ar nolūku, šo brīdinājumu var droši neņemt vērā. Jāizmanto atsoļa taustiņš (Esc), lai atklātu tās.`
ambiguous_runes_header=`Šis fails satur neviennozīmīgus unikoda simbolus` ambiguous_runes_header=`Šis fails satur neviennozīmīgus unikoda simbolus`
ambiguous_runes_description=`Šis fails satur unikoda simbolus, kas var tikt sajauktas ar citām rakstzīmēm. Ja šķiet, ka tas ir ar nolūku, šo brīdinājumu var droši neņemt vērā. Jāizmanto atsoļa taustiņš (Esc), lai atklātu tās.` ambiguous_runes_description=`Šis fails satur unikoda simbolus, kas var tikt sajauktas ar citām rakstzīmēm. Ja šķiet, ka tas ir ar nolūku, šo brīdinājumu var droši neņemt vērā. Jāizmanto atsoļa taustiņš (Esc), lai atklātu tās.`
invisible_runes_line=ī līnija satur neredzamus unikoda simbolus` invisible_runes_line=ajā rindā ir neredzamas unikoda rakstzīmes`
ambiguous_runes_line=ī līnija satur neviennozīmīgus unikoda simbolus` ambiguous_runes_line=ajā rindā ir neviennozīmīgas unikoda rakstzīmes`
ambiguous_character=`%[1]c [U+%04[1]X] var tikt sajaukts ar %[2]c [U+%04[2]X]` ambiguous_character=`%[1]c [U+%04[1]X] var tikt sajaukts ar %[2]c [U+%04[2]X]`
escape_control_characters=Kodēt escape_control_characters=Kodēt
unescape_control_characters=Atkodēt unescape_control_characters=Atkodēt
file_copy_permalink=Kopēt saiti file_copy_permalink=Ievietot pastāvīgo saiti starpliktuvē
view_git_blame=Aplūkot Git vainīgos view_git_blame=Apskatīt Git izmaiņu veicējus
video_not_supported_in_browser=Jūsu pārlūks neatbalsta HTML5 video. video_not_supported_in_browser=Pārlūks neatbalsta HTML5 tagu "video".
audio_not_supported_in_browser=Jūsu pārlūks neatbalsta HTML5 audio. audio_not_supported_in_browser=Pārlūks neatbalsta HTML5 tagu "audio".
stored_lfs=Saglabāts Git LFS stored_lfs=Saglabāts Git LFS
symbolic_link=Simboliska saite symbolic_link=Simboliska saite
executable_file=Izpildāmais fails executable_file=Izpildāma datne
commit_graph=Revīziju grafs commit_graph=Iesūtījumu karte
commit_graph.select=Izvēlieties atzarus commit_graph.select=Izvēlieties atzarus
commit_graph.hide_pr_refs=Paslēpt izmaiņu pieprasījumus commit_graph.hide_pr_refs=Paslēpt izmaiņu pieprasījumus
commit_graph.monochrome=Melnbalts commit_graph.monochrome=Melnbalts
@ -1200,27 +1200,27 @@ line=rinda
lines=rindas lines=rindas
from_comment=(komentārs) from_comment=(komentārs)
editor.add_file=Pievienot editor.add_file=Pievienot datni
editor.new_file=Jauna datne editor.new_file=Jauna datne
editor.upload_file=Augšupielādēt failu editor.upload_file=Augšupielādēt datni
editor.edit_file=Labot failu editor.edit_file=Labot datni
editor.preview_changes=Priekšskatīt izmaiņas editor.preview_changes=Priekšskatīt izmaiņas
editor.cannot_edit_lfs_files=LFS failus nevar labot no tīmekļa saskarnes. editor.cannot_edit_lfs_files=LFS failus nevar labot no tīmekļa saskarnes.
editor.cannot_edit_non_text_files=Nav iespējams labot bināros failus no pārlūka saskarnes. editor.cannot_edit_non_text_files=Nav iespējams labot bināros failus no pārlūka saskarnes.
editor.edit_this_file=Labot failu editor.edit_this_file=Labot datni
editor.this_file_locked=Fails ir bloķēts editor.this_file_locked=Fails ir bloķēts
editor.must_be_on_a_branch=Ir jābūt izvēlētam atzaram, lai varētu veikt vai piedāvāt izmaiņas šim failam. editor.must_be_on_a_branch=Ir jābūt izvēlētam atzaram, lai varētu veikt vai piedāvāt izmaiņas šim failam.
editor.fork_before_edit=Lai varētu labot failu, ir nepieciešams atdalīt repozitoriju. editor.fork_before_edit=Lai varētu labot failu, ir nepieciešams atdalīt repozitoriju.
editor.delete_this_file=Dzēst failu editor.delete_this_file=Izdzēst datni
editor.must_have_write_access=Jums ir jābūt rakstīšanas tiesībām, lai varētu veikt vai piedāvāt izmaiņas šim failam. editor.must_have_write_access=Jums ir jābūt rakstīšanas tiesībām, lai varētu veikt vai piedāvāt izmaiņas šim failam.
editor.file_delete_success=Fails "%s" tika izdzēsts. editor.file_delete_success=Fails "%s" tika izdzēsts.
editor.name_your_file=Ievadiet faila nosaukumu… editor.name_your_file=Ievadiet faila nosaukumu…
editor.filename_help=Lai pievienotu direktoriju, ierakstiet tās nosaukumu un slīpsvītru ('/'). Lai noņemtu direktoriju, ielieciet kursoru pirms faila nosaukuma un nospiediet atpakaļatkāpes taustiņu. editor.filename_help=Mapi var pievienot, ja ieraksta tās nosaukumu, aiz kura ir slīpsvītra ("/"). Mapi var noņemt ar atpakaļatkāpes taustiņa nospiešanu ievades lauka sākumā.
editor.or=vai editor.or=vai
editor.cancel_lower=Atcelt editor.cancel_lower=Atcelt
editor.commit_signed_changes=Apstiprināt parakstītu revīziju editor.commit_signed_changes=Iesūtīt parakstītas izmaiņas
editor.commit_changes=Pabeigt revīziju editor.commit_changes=Iesūtīt izmaiņas
editor.add_tmpl=Pievienot '<fails>' editor.add_tmpl=Pievienot '<datnes nosaukums>'
editor.add=Pievienot %s editor.add=Pievienot %s
editor.update=Atjaunot %s editor.update=Atjaunot %s
editor.delete=Dzēst %s editor.delete=Dzēst %s
@ -1246,15 +1246,15 @@ editor.file_is_a_symlink=Fails "%s" ir norāde, kuru nav iespējams labot no tī
editor.filename_is_a_directory=Faila nosaukums "%s" sakrīt ar direktorijas nosaukumu šajā repozitorijā. editor.filename_is_a_directory=Faila nosaukums "%s" sakrīt ar direktorijas nosaukumu šajā repozitorijā.
editor.file_editing_no_longer_exists=Fails "%s", ko labojat, vairs neeksistē šajā repozitorijā. editor.file_editing_no_longer_exists=Fails "%s", ko labojat, vairs neeksistē šajā repozitorijā.
editor.file_deleting_no_longer_exists=Fails "%s", ko dzēšat, vairs neeksistē šajā repozitorijā. editor.file_deleting_no_longer_exists=Fails "%s", ko dzēšat, vairs neeksistē šajā repozitorijā.
editor.file_changed_while_editing=Faila saturs ir mainījies kopš sākāt to labot. Noklikšķiniet <a target="_blank" rel="noopener noreferrer" href="%s">šeit</a>, lai apskatītu, vai <strong>Nosūtiet izmaiņas atkārtoti</strong>, lai pārrakstītu. editor.file_changed_while_editing=Datnes saturs ir mainījies kopš labošanas uzsākšanas. <a target="_blank" rel="noopener noreferrer" href="%s">Klikšķināt šeit</a>, lai apskatītu vai <strong>atkārtoti iesūtītu izmaiņas</strong>, lai tās pārrakstītu.
editor.file_already_exists=Fails ar nosaukumu "%s" šajā repozitorijā jau eksistē. editor.file_already_exists=Fails ar nosaukumu "%s" šajā repozitorijā jau eksistē.
editor.commit_empty_file_header=Iesūtīt tukšu failu editor.commit_empty_file_header=Iesūtīt tukšu failu
editor.commit_empty_file_text=Fails, ko vēlaties iesūtīt, ir tukšs. Vai turpināt? editor.commit_empty_file_text=Fails, ko vēlaties iesūtīt, ir tukšs. Vai turpināt?
editor.no_changes_to_show=Nav izmaiņu, ko rādīt. editor.no_changes_to_show=Nav izmaiņu, ko rādīt.
editor.fail_to_update_file=Neizdevās atjaunot/izveidot failu "%s". editor.fail_to_update_file=Neizdevās atjaunot/izveidot failu "%s".
editor.fail_to_update_file_summary=Kļūdas ziņojums: editor.fail_to_update_file_summary=Kļūdas ziņojums:
editor.push_rejected_no_message=Izmaiņu iesūtīšana tika noraidīta, bet serveris neatgrieza paziņojumu. Pārbaudiet git āķus šim repozitorijam. editor.push_rejected_no_message=Serveris noraidīja izmaiņas bez paziņojuma. Lūgums pārbaudīt Git aizķeres.
editor.push_rejected=Serveris noraidīja šo izmaiņu. Pārbaudiet git āķus. editor.push_rejected=Serveris noraidīja izmaiņas. Lūgums pārbaudīt Git aizķeres.
editor.push_rejected_summary=Pilns noraidīšanas ziņojums: editor.push_rejected_summary=Pilns noraidīšanas ziņojums:
editor.add_subdir=Pievienot direktoriju… editor.add_subdir=Pievienot direktoriju…
editor.unable_to_upload_files=Neizdevās augšupielādēt failus uz direktoriju "%s", kļūda: %v editor.unable_to_upload_files=Neizdevās augšupielādēt failus uz direktoriju "%s", kļūda: %v
@ -1274,7 +1274,7 @@ commits.nothing_to_compare=Atzari ir vienādi.
commits.search=Meklēt revīzijas… commits.search=Meklēt revīzijas…
commits.search.tooltip=Jūs varat izmantot atslēgas vārdus "author:", "committer:", "after:" vai "before:", piemēram, "revert author:Alice before:2019-01-13". commits.search.tooltip=Jūs varat izmantot atslēgas vārdus "author:", "committer:", "after:" vai "before:", piemēram, "revert author:Alice before:2019-01-13".
commits.find=Meklēt commits.find=Meklēt
commits.search_all=Visi atzari commits.search_all=Visi zari
commits.author=Autors commits.author=Autors
commits.message=Ziņojums commits.message=Ziņojums
commits.date=Datums commits.date=Datums
@ -1283,8 +1283,8 @@ commits.newer=Jaunāki
commits.signed_by=Parakstījis commits.signed_by=Parakstījis
commits.signed_by_untrusted_user=Parakstījis neuzticams lietotājs commits.signed_by_untrusted_user=Parakstījis neuzticams lietotājs
commits.signed_by_untrusted_user_unmatched=Parakstījis neuzticams lietotājs, kas neatbilst izmaiņu autoram commits.signed_by_untrusted_user_unmatched=Parakstījis neuzticams lietotājs, kas neatbilst izmaiņu autoram
commits.gpg_key_id=GPG atslēgas ID commits.gpg_key_id=GPG atslēgas Id
commits.ssh_key_fingerprint=SSH atslēgas identificējošā zīmju virkne commits.ssh_key_fingerprint=SSH atslēgas nospiedums
commits.view_path=Skatīt šajā vēstures punktā commits.view_path=Skatīt šajā vēstures punktā
commit.operations=Darbības commit.operations=Darbības
@ -1300,7 +1300,7 @@ commitstatus.failure=Kļūme
commitstatus.pending=Nav iesūtīts commitstatus.pending=Nav iesūtīts
commitstatus.success=Pabeigts commitstatus.success=Pabeigts
ext_issues=Piekļuve ārējām problēmām ext_issues=Piekļuve ārējiem pieteikumiem
ext_issues.desc=Saite uz ārējo problēmu sekotāju. ext_issues.desc=Saite uz ārējo problēmu sekotāju.
projects=Projekti projects=Projekti
@ -1312,35 +1312,35 @@ projects.title=Nosaukums
projects.new=Jauns projekts projects.new=Jauns projekts
projects.new_subheader=Koordinē, seko un atjauno savu darbu centralizēti, lai projekts būtu izsekojams un vienmēr laikā. projects.new_subheader=Koordinē, seko un atjauno savu darbu centralizēti, lai projekts būtu izsekojams un vienmēr laikā.
projects.create_success=Projekts "%s" tika izveidots. projects.create_success=Projekts "%s" tika izveidots.
projects.deletion=Dzēst projektu projects.deletion=Izdzēst projektu
projects.deletion_desc=Dzēšot projektu no tā tiks atsaistītās visas tam piesaistītās problēmas. Vai turpināt? projects.deletion_desc=Dzēšot projektu no tā tiks atsaistītās visas tam piesaistītās problēmas. Vai turpināt?
projects.deletion_success=Šis projekts tika izdzēsts. projects.deletion_success=Šis projekts tika izdzēsts.
projects.edit=Labot projektu projects.edit=Labot projektu
projects.edit_subheader=Projekti organizē problēmas un ļauj izsekot to progresam. projects.edit_subheader=Projekti organizē problēmas un ļauj izsekot to progresam.
projects.modify=Mainīt projektu projects.modify=Labot projektu
projects.edit_success=Projekta "%s" izmaiņas tika saglabātas. projects.edit_success=Projekta "%s" izmaiņas tika saglabātas.
projects.type.none=Nav projects.type.none=Nav
projects.type.basic_kanban=`Vienkāršots "Kanban"` projects.type.basic_kanban=Pamata "Kanban"
projects.type.bug_triage=Kļūdu šķirošana projects.type.bug_triage=Kļūdu šķirošana
projects.template.desc=Projekta sagatave projects.template.desc=Sagatave
projects.template.desc_helper=Izvēlieties projekta sagatavi, lai sāktu darbu projects.template.desc_helper=Jāatlasa projekta sagatave, lai uzsāktu
projects.type.uncategorized=Bez kategorijas projects.type.uncategorized=Bez kategorijas
projects.column.edit=Rediģēt kolonnas projects.column.edit=Labot kolonnu
projects.column.edit_title=Nosaukums projects.column.edit_title=Nosaukums
projects.column.new_title=Nosaukums projects.column.new_title=Nosaukums
projects.column.new_submit=Izveidot kolonnu projects.column.new_submit=Izveidot kolonnu
projects.column.new=Jauna kolonna projects.column.new=Jauna kolonna
projects.column.set_default=Izvēlēties kā noklusēto projects.column.set_default=Iestatīt kā noklusējumu
projects.column.set_default_desc=Izvēlēties šo kolonnu kā noklusēto nekategorizētām problēmām un izmaiņu pieteikumiem projects.column.set_default_desc=Iestatīt šo kolonnu kā noklusējumu neapkopotiem pieteikumiem un izmaiņu pieprasījumiem
projects.column.unset_default=Atiestatīt noklusēto projects.column.unset_default=Atiestatīt noklusēto
projects.column.unset_default_desc=Noņemt šo kolonnu kā noklusēto projects.column.unset_default_desc=Noņemt šo kolonnu kā noklusēto
projects.column.delete=Dzēst kolonnu projects.column.delete=Izdzēst kolonnu
projects.column.deletion_desc=Dzēšot projekta kolonnu visas tam piesaistītās problēmas tiks pārliktas kā nekategorizētas. Vai turpināt? projects.column.deletion_desc=Projekta kolonnas izdzēšana pārvietos visus saistītos pieteikumus uz noklusējuma kolonnu. Turpināt?
projects.column.color=Krāsa projects.column.color=Krāsa
projects.open=Aktīvie projects.open=Aktīvie
projects.close=Pabeigtie projects.close=Pabeigtie
projects.column.assigned_to=Piešķirts projects.column.assigned_to=Piešķirts
projects.card_type.desc=Kartītes priekšskatījums projects.card_type.desc=Kartīšu priekšskatījumi
projects.card_type.images_and_text=Attēli un teksts projects.card_type.images_and_text=Attēli un teksts
projects.card_type.text_only=Tikai teksts projects.card_type.text_only=Tikai teksts
@ -1350,40 +1350,40 @@ issues.filter_milestones=Filtrēt pēc atskaites punkta
issues.filter_projects=Filtrēt pēc projekta issues.filter_projects=Filtrēt pēc projekta
issues.filter_labels=Filtrēt pēc etiķetēm issues.filter_labels=Filtrēt pēc etiķetēm
issues.filter_reviewers=Filtrēt pēc recenzentiem issues.filter_reviewers=Filtrēt pēc recenzentiem
issues.new=Jauna problēma issues.new=Jauns pieteikums
issues.new.title_empty=Nosaukums nevar būt tukšs issues.new.title_empty=Nosaukums nevar būt tukšs
issues.new.labels=Etiķetes issues.new.labels=Etiķetes
issues.new.no_label=Nav etiķešu issues.new.no_label=Nav iezīmju
issues.new.clear_labels=Noņemt etiķetes issues.new.clear_labels=Noņemt etiķetes
issues.new.projects=Projekti issues.new.projects=Projekti
issues.new.clear_projects=Notīrīt projektus issues.new.clear_projects=Notīrīt projektus
issues.new.no_projects=Nav projektu issues.new.no_projects=Nav projektu
issues.new.open_projects=Aktīvie projekti issues.new.open_projects=Atvērtie projekti
issues.new.closed_projects=Pabeigtie projekti issues.new.closed_projects=Aizvērtie projekti
issues.new.no_items=Nav neviena ieraksta issues.new.no_items=Nav neviena ieraksta
issues.new.milestone=Atskaites punkts issues.new.milestone=Atskaites punkts
issues.new.no_milestone=Nav atskaites punktu issues.new.no_milestone=Nav atskaites punktu
issues.new.clear_milestone=Notīrīt atskaites punktus issues.new.clear_milestone=Notīrīt atskaites punktus
issues.new.open_milestone=Atvērtie atskaites punktus issues.new.open_milestone=Atvērtie atskaites punkti
issues.new.closed_milestone=Aizvērtie atskaites punkti issues.new.closed_milestone=Aizvērtie atskaites punkti
issues.new.assignees=Atbildīgie issues.new.assignees=Atbildīgie
issues.new.clear_assignees=Noņemt atbildīgo issues.new.clear_assignees=Noņemt atbildīgo
issues.new.no_assignees=Nav atbildīgo issues.new.no_assignees=Nav atbildīgo
issues.new.no_reviewers=Nav recenzentu issues.new.no_reviewers=Nav recenzentu
issues.choose.get_started=Sākt darbu issues.choose.get_started=Uzsākt darbu
issues.choose.open_external_link=Atvērt issues.choose.open_external_link=Atvērt
issues.choose.blank=Noklusējuma issues.choose.blank=Noklusējuma
issues.choose.blank_about=Izveidot problēmu ar noklusējuma sagatavi. issues.choose.blank_about=Izveidot problēmu ar noklusējuma sagatavi.
issues.choose.ignore_invalid_templates=Kļūdainās sagataves tika izlaistas issues.choose.ignore_invalid_templates=Kļūdainās sagataves tika izlaistas
issues.choose.invalid_templates=%v ķļūdaina sagatave(s) atrastas issues.choose.invalid_templates=%v ķļūdaina sagatave(s) atrastas
issues.choose.invalid_config=Problēmu konfigurācija satur kļūdas: issues.choose.invalid_config=Problēmu konfigurācija satur kļūdas:
issues.no_ref=Nav norādīts atzars/tags issues.no_ref=Nav norādīts zars/birka
issues.create=Pieteikt problēmu issues.create=Izveidot pieteikumu
issues.new_label=Jauna etiķete issues.new_label=Jauna iezīme
issues.new_label_placeholder=Etiķetes nosaukums issues.new_label_placeholder=Etiķetes nosaukums
issues.new_label_desc_placeholder=Apraksts issues.new_label_desc_placeholder=Apraksts
issues.create_label=Izveidot etiķeti issues.create_label=Izveidot iezīmi
issues.label_templates.title=Ielādēt sākotnēji noteiktu etiķešu kopu issues.label_templates.title=Ielādēt iepriekš noteiktu iezīmju kopu
issues.label_templates.info=Nav izveidota neviena etiķete. Jūs varat noklikšķināt uz "Jauna etiķete" augstāk, lai to izveidotu vai izmantot zemāk piedāvātās etiķetes: issues.label_templates.info=Nav izveidota neviena etiķete. Jūs varat noklikšķināt uz "Jauna etiķete" augstāk, lai to izveidotu vai izmantot zemāk piedāvātās etiķetes:
issues.label_templates.helper=Izvēlieties etiķešu kopu issues.label_templates.helper=Izvēlieties etiķešu kopu
issues.label_templates.use=Izmantot etiķešu kopu issues.label_templates.use=Izmantot etiķešu kopu
@ -1752,10 +1752,10 @@ pulls.num_conflicting_files_n=%d faili ar konfliktiem
pulls.approve_count_1=%d apstiprinājums pulls.approve_count_1=%d apstiprinājums
pulls.approve_count_n=%d apstiprinājumi pulls.approve_count_n=%d apstiprinājumi
pulls.reject_count_1=%d izmaiņu pieprasījums pulls.reject_count_1=%d izmaiņu pieprasījums
pulls.reject_count_n=%d pieprasītas izmaiņas pulls.reject_count_n=%d izmaiņu pieprasījumi
pulls.waiting_count_1=nepieciešama %d recenzija pulls.waiting_count_1=nepieciešama %d izskatīšana
pulls.waiting_count_n=nepieciešamas %d recenzijas pulls.waiting_count_n=nepieciešamas %d izskatīšanas
pulls.wrong_commit_id=revīzijas identifikātoram ir jābūt revīzijas identifikatoram no mērķa atzara pulls.wrong_commit_id=iesūtījuma identifikatoram jābūt mērķa zara iesūtījuma identifikatoram
pulls.no_merge_desc=Šo izmaiņu pieprasījumu nav iespējams sapludināt, jo nav atļauts neviens sapludināšanas veids. pulls.no_merge_desc=Šo izmaiņu pieprasījumu nav iespējams sapludināt, jo nav atļauts neviens sapludināšanas veids.
pulls.no_merge_helper=Lai sapludinātu šo izmaiņu pieprasījumu, iespējojiet vismaz vienu sapludināšanas veidu repozitorija iestatījumos vai sapludiniet to manuāli. pulls.no_merge_helper=Lai sapludinātu šo izmaiņu pieprasījumu, iespējojiet vismaz vienu sapludināšanas veidu repozitorija iestatījumos vai sapludiniet to manuāli.
@ -1771,17 +1771,17 @@ pulls.merge_commit_id=Sapludināšanas revīzijas ID
pulls.require_signed_wont_sign=Atzarā var iesūtīt tikai parakstītas revīzijas, bet sapludināšanas revīzijas netiks parakstīta pulls.require_signed_wont_sign=Atzarā var iesūtīt tikai parakstītas revīzijas, bet sapludināšanas revīzijas netiks parakstīta
pulls.invalid_merge_option=Nav iespējams izmantot šādu sapludināšanas veidu šim izmaiņu pieprasījumam. pulls.invalid_merge_option=Nav iespējams izmantot šādu sapludināšanas veidu šim izmaiņu pieprasījumam.
pulls.merge_conflict=Sapludināšana neizdevās: Veicot sapludināšanu, radās konflikts. Mēģiniet izmantot citu sapludināšanas stratēģiju pulls.merge_conflict=Apvienošana neizdevās: iekļaušanas laikā radās nesaderības. Norāde: jāmēģina cita pieeja
pulls.merge_conflict_summary=Kļūdas paziņojums pulls.merge_conflict_summary=Kļūdas ziņojums
pulls.rebase_conflict=Sapludināšana neizdevās: Veicot pārbāzēšanu uz revīziju %[1]s, radās konflikts. Mēģiniet izmantot citu sapludināšanas stratēģiju pulls.rebase_conflict=Apvienošana neizdevās: iesūtījuma %[1]s pārbāzēšanas laikā radās nesaderība. Norāde: jāmēģina cita pieeja
pulls.rebase_conflict_summary=Kļūdas paziņojums pulls.rebase_conflict_summary=Kļūdas ziņojums
pulls.unrelated_histories=Sapludināšana neizdevās: mērķa un bāzes atzariem nav kopējas vēstures. Ieteikums: izvēlieties citu sapludināšanas stratēģiju pulls.unrelated_histories=Apvienošana neizdevās: apvienošanas galotnei un pamatam nav kopējas vēstures. Norāde: jāmēģina cita pieeja
pulls.merge_out_of_date=Sapludināšana neizdevās: sapludināšanas laikā, bāzes atzarā tika iesūtītas izmaiņas. Ieteikums: mēģiniet atkārtoti. pulls.merge_out_of_date=Apvienošana neizdevās: apvienošanas laikā pamata zars tika atjaunināts. Norāde: jāmēģina vēlreiz.
pulls.head_out_of_date=Sapludināšana neizdevās: sapludināšanas laikā, bāzes atzarā tika iesūtītas izmaiņas. Ieteikums: mēģiniet atkārtoti. pulls.head_out_of_date=Apvienošana neizdevās: apvienošanas laikā galotne tika atjaunināta. Norāde: jāmēģina vēlreiz.
pulls.has_merged=Neizdevās: izmaiņu pieprasījums jau ir sapludināts, nevar to darīt atkārtoti vai mainīt mērķa atzaru. pulls.has_merged=Neizdevās: izmaiņu pieprasījums jau ir sapludināts, nevar to darīt atkārtoti vai mainīt mērķa atzaru.
pulls.push_rejected=Sapludināšana neizdevās: iesūtīšana tika noraidīta. Pārbaudiet git āķus šim repozitorijam. pulls.push_rejected=Aizgādāšana neizdevās: aizgādāšana tika noraidīta. Jāpārskata šīs glabātavas Git aizķeres.
pulls.push_rejected_summary=Pilns noraidīšanas ziņojums pulls.push_rejected_summary=Pilns noraidīšanas ziņojums
pulls.push_rejected_no_message=Sapludināšana neizdevās: Izmaiņu iesūtīšana tika noraidīta, bet serveris neatgrieza paziņojumu.<br>Pārbaudiet git āķus šim repozitorijam pulls.push_rejected_no_message=Apvienošana neizdevās: aizgādāšana tika noraidīta, bet serveris neatgrieza ziņojumu. Jāpārskata šīs glabātavas Git aizķeres
pulls.open_unmerged_pull_exists=`Jūs nevarat veikt atkārtotas atvēršanas darbību, jo jau eksistē izmaiņu pieprasījums (#%d) ar šādu sapludināšanas informāciju.` pulls.open_unmerged_pull_exists=`Jūs nevarat veikt atkārtotas atvēršanas darbību, jo jau eksistē izmaiņu pieprasījums (#%d) ar šādu sapludināšanas informāciju.`
pulls.status_checking=Dažas pārbaudes vēl tiek veiktas pulls.status_checking=Dažas pārbaudes vēl tiek veiktas
pulls.status_checks_success=Visas pārbaudes ir veiksmīgas pulls.status_checks_success=Visas pārbaudes ir veiksmīgas
@ -1800,7 +1800,7 @@ pulls.outdated_with_base_branch=Atzars ir novecojis salīdzinot ar bāzes atzaru
pulls.close=Aizvērt izmaiņu pieprasījumu pulls.close=Aizvērt izmaiņu pieprasījumu
pulls.closed_at=`aizvēra šo izmaiņu pieprasījumu <a id="%[1]s" href="#%[1]s">%[2]s</a>` pulls.closed_at=`aizvēra šo izmaiņu pieprasījumu <a id="%[1]s" href="#%[1]s">%[2]s</a>`
pulls.reopened_at=`atkārtoti atvēra šo izmaiņu pieprasījumu <a id="%[1]s" href="#%[1]s">%[2]s</a>` pulls.reopened_at=`atkārtoti atvēra šo izmaiņu pieprasījumu <a id="%[1]s" href="#%[1]s">%[2]s</a>`
pulls.cmd_instruction_hint=`Apskatīt komandrindas izmantošanas norādes.` pulls.cmd_instruction_hint=Apskatīt komandrindas izmantošanas norādes
pulls.cmd_instruction_checkout_title=Paņemt pulls.cmd_instruction_checkout_title=Paņemt
pulls.cmd_instruction_checkout_desc=Projekta repozitorijā jāizveido jauns atzars un jāpārbauda izmaiņas. pulls.cmd_instruction_checkout_desc=Projekta repozitorijā jāizveido jauns atzars un jāpārbauda izmaiņas.
pulls.cmd_instruction_merge_title=Sapludināt pulls.cmd_instruction_merge_title=Sapludināt
@ -1838,20 +1838,20 @@ milestones.completeness=%d%% pabeigti
milestones.create=Izveidot atskaites punktu milestones.create=Izveidot atskaites punktu
milestones.title=Virsraksts milestones.title=Virsraksts
milestones.desc=Apraksts milestones.desc=Apraksts
milestones.due_date=Termiņš (neobligāts) milestones.due_date=Beigu datums (pēc izvēles)
milestones.clear=Notīrīt milestones.clear=Notīrīt
milestones.invalid_due_date_format=Izpildes termiņam ir jābūt formāta 'yyyy-mm-dd'. milestones.invalid_due_date_format=Beigu datuma pierakstam ir jābūt 'yyyy-mm-dd'.
milestones.create_success=Atskaites punkts "%s" tika veiksmīgi izveidots. milestones.create_success=Atskaites punkts "%s" tika veiksmīgi izveidots.
milestones.edit=Labot atskaites punktu milestones.edit=Labot atskaites punktu
milestones.edit_subheader=Atskaites punkti, ļauj organizēt problēmas un sekot to progresam. milestones.edit_subheader=Atskaites punkti, ļauj organizēt problēmas un sekot to progresam.
milestones.cancel=Atcelt milestones.cancel=Atcelt
milestones.modify=Labot atskaites punktu milestones.modify=Atjaunināt atskaites punktu
milestones.edit_success=Izmaiņas atskaites punktā "%s" tika veiksmīgi saglabātas. milestones.edit_success=Izmaiņas atskaites punktā "%s" tika veiksmīgi saglabātas.
milestones.deletion=Dzēst atskaites punktu milestones.deletion=Izdzēst atskaites punktu
milestones.deletion_desc=Dzēšot šo atskaites punktu, tas tiks noņemts no visām saistītajām problēmām un izmaiņu pieprasījumiem. Vai turpināt? milestones.deletion_desc=Dzēšot šo atskaites punktu, tas tiks noņemts no visām saistītajām problēmām un izmaiņu pieprasījumiem. Vai turpināt?
milestones.deletion_success=Atskaites punkts tika veiksmīgi izdzēsts. milestones.deletion_success=Atskaites punkts tika veiksmīgi izdzēsts.
milestones.filter_sort.earliest_due_data=Agrākais izpildes laiks milestones.filter_sort.earliest_due_data=Tuvākais izpildes datums
milestones.filter_sort.latest_due_date=Vēlākais izpildes laiks milestones.filter_sort.latest_due_date=Tālākais izpildes datums
milestones.filter_sort.least_complete=Vismazāk pabeigtais milestones.filter_sort.least_complete=Vismazāk pabeigtais
milestones.filter_sort.most_complete=Visvairāk pabeigtais milestones.filter_sort.most_complete=Visvairāk pabeigtais
milestones.filter_sort.most_issues=Visvairāk problēmu milestones.filter_sort.most_issues=Visvairāk problēmu
@ -1859,7 +1859,7 @@ milestones.filter_sort.least_issues=Vismazāk problēmu
signing.will_sign=Šī revīzija tiks parakstīta ar atslēgu "%s". signing.will_sign=Šī revīzija tiks parakstīta ar atslēgu "%s".
signing.wont_sign.error=Notika kļūda pārbaudot vai revīzija var tikt parakstīta. signing.wont_sign.error=Notika kļūda pārbaudot vai revīzija var tikt parakstīta.
signing.wont_sign.nokey=Nav pieejamas atslēgas, ar ko parakstīt šo revīziju. signing.wont_sign.nokey=Nav pieejamas atslēgas, ar ko parakstīt šo iesūtījumu.
signing.wont_sign.never=Revīzijas nekad netiek parakstītas. signing.wont_sign.never=Revīzijas nekad netiek parakstītas.
signing.wont_sign.always=Revīzijas vienmēr tiek parakstītas. signing.wont_sign.always=Revīzijas vienmēr tiek parakstītas.
signing.wont_sign.pubkey=Revīzija netiks parakstīta, jo kontam nav piesaistīta publiskā atslēga. signing.wont_sign.pubkey=Revīzija netiks parakstīta, jo kontam nav piesaistīta publiskā atslēga.

View file

@ -2542,6 +2542,7 @@ issues.review.remove_review_requests = hett %[2]s de Nakieken-Anfragen för %[1]
pulls.delete_after_merge.head_branch.is_protected = De Kopp-Twieg, wat du lösken willst, is een schütt Twieg un kann nich lösket worden. pulls.delete_after_merge.head_branch.is_protected = De Kopp-Twieg, wat du lösken willst, is een schütt Twieg un kann nich lösket worden.
pulls.delete_after_merge.head_branch.insufficient_branch = Du hest nich dat Recht, de Kopp-Twieg to lösken. pulls.delete_after_merge.head_branch.insufficient_branch = Du hest nich dat Recht, de Kopp-Twieg to lösken.
pulls.delete_after_merge.head_branch.is_default = De Kopp-Twieg, wat du lösken willst, is de Höövd-Twieg un kann nich lösket worden. pulls.delete_after_merge.head_branch.is_default = De Kopp-Twieg, wat du lösken willst, is de Höövd-Twieg un kann nich lösket worden.
issues.filter_sort.relevance = Belang
[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.

View file

@ -199,6 +199,12 @@ buttons.list.task.tooltip = Een lijst met taken toevoegen
buttons.disable_monospace_font = Lettertype monospace uitschakelen buttons.disable_monospace_font = Lettertype monospace uitschakelen
buttons.indent.tooltip = Items één niveau lager plaatsen buttons.indent.tooltip = Items één niveau lager plaatsen
buttons.unindent.tooltip = Items één niveau hoger plaatsen buttons.unindent.tooltip = Items één niveau hoger plaatsen
buttons.new_table.tooltip = Tabel toevoegen
table_modal.header = Tabel toevoegen
table_modal.placeholder.header = Kop
table_modal.placeholder.content = Inhoud
table_modal.label.rows = Rijen
table_modal.label.columns = Kolommen
[filter] [filter]
string.asc = A - Z string.asc = A - Z
@ -250,7 +256,7 @@ no_admin_and_disable_registration=U kunt zelf-registratie van de gebruiker niet
err_empty_admin_password=Het administrator-wachtwoord mag niet leeg zijn. err_empty_admin_password=Het administrator-wachtwoord mag niet leeg zijn.
err_empty_admin_email=Het e-mailadres van Het beheerder mag niet leeg zijn. err_empty_admin_email=Het e-mailadres van Het beheerder mag niet leeg zijn.
err_admin_name_is_reserved=Gebruikersnaam van beheerder is ongeldig, gebruikersnaam is gereserveerd err_admin_name_is_reserved=Gebruikersnaam van beheerder is ongeldig, gebruikersnaam is gereserveerd
err_admin_name_pattern_not_allowed=Gebruikersnaam van beheerder is ongeldig, de gebruikersnaam is gereserveerd err_admin_name_pattern_not_allowed=Gebruikersnaam van beheerder is ongeldig, de gebruikersnaam komt overeen met een gereserveerd patroon
err_admin_name_is_invalid=Gebruikersnaam van beheerder is ongeldig err_admin_name_is_invalid=Gebruikersnaam van beheerder is ongeldig
general_title=Algemene instellingen general_title=Algemene instellingen
@ -269,7 +275,7 @@ http_port=HTTP luisterpoort
http_port_helper=Poortnummer dat zal worden gebruikt door de Forgejo webserver. http_port_helper=Poortnummer dat zal worden gebruikt door de Forgejo webserver.
app_url=Basis URL app_url=Basis URL
app_url_helper=Basisadres voor HTTP(S) kloon URL's en e-mailmeldingen. app_url_helper=Basisadres voor HTTP(S) kloon URL's en e-mailmeldingen.
log_root_path=Log-pad log_root_path=Logboek-pad
log_root_path_helper=Logboekbestanden worden geschreven naar deze map. log_root_path_helper=Logboekbestanden worden geschreven naar deze map.
optional_title=Optionele instellingen optional_title=Optionele instellingen
@ -477,6 +483,7 @@ sign_up_button = Registreer nu.
back_to_sign_in = Terug naar aanmelden back_to_sign_in = Terug naar aanmelden
sign_in_openid = Ga verder met OpenID sign_in_openid = Ga verder met OpenID
unauthorized_credentials = Je inloggegevens zijn foutief of vervallen. Probeer opnieuw of zie %s voor meer informatie unauthorized_credentials = Je inloggegevens zijn foutief of vervallen. Probeer opnieuw of zie %s voor meer informatie
use_onetime_code = Gebruik een eenmalige code
[mail] [mail]
view_it_on=Bekijk het op %s view_it_on=Bekijk het op %s
@ -978,7 +985,7 @@ visibility.limited=Beperkt
visibility.private=Privé visibility.private=Privé
blocked_users = Geblokkeerde gebruikers blocked_users = Geblokkeerde gebruikers
uid = UID uid = UID
biography_placeholder = Vertel ons iets over uzelf! (U kunt van Markdown gebruik maken) biography_placeholder = Vertel anderen een beetje over uzelf! (Markdown is ondersteund)
profile_desc = Controleer hoe uw profiel aan andere gebruikers wordt getoond. Uw primaire e-mailadres zal worden gebruikt voor notificaties, wachtwoord herstel en web-gebaseerde Git-operaties. profile_desc = Controleer hoe uw profiel aan andere gebruikers wordt getoond. Uw primaire e-mailadres zal worden gebruikt voor notificaties, wachtwoord herstel en web-gebaseerde Git-operaties.
update_language_not_found = Taal "%s" is niet beschikbaar. update_language_not_found = Taal "%s" is niet beschikbaar.
change_username_prompt = Opmerking: Het veranderen van uw gebruikersnaam zal ook de URL van uw account veranderen. change_username_prompt = Opmerking: Het veranderen van uw gebruikersnaam zal ook de URL van uw account veranderen.
@ -1309,7 +1316,7 @@ editor.patching=Patchen:
editor.new_patch=Nieuwe patch editor.new_patch=Nieuwe patch
editor.commit_message_desc=Voeg een optionele uitgebreide omschrijving toe… editor.commit_message_desc=Voeg een optionele uitgebreide omschrijving toe…
editor.signoff_desc=Voeg een Signed-off-by toe aan het einde van het commit logbericht. editor.signoff_desc=Voeg een Signed-off-by toe aan het einde van het commit logbericht.
editor.commit_directly_to_this_branch=Commit direct naar de branch '<strong class="%[2]s">%[1]s</strong>'. editor.commit_directly_to_this_branch=Commit direct naar de branch <strong class="%[2]s">%[1]s</strong>.
editor.create_new_branch=Maak een <strong>nieuwe branch</strong> voor deze commit en start van een pull request. editor.create_new_branch=Maak een <strong>nieuwe branch</strong> voor deze commit en start van een pull request.
editor.create_new_branch_np=Maak een <strong>nieuwe branch</strong> voor deze commit. editor.create_new_branch_np=Maak een <strong>nieuwe branch</strong> voor deze commit.
editor.propose_file_change=Stel bestandswijziging voor editor.propose_file_change=Stel bestandswijziging voor
@ -1648,9 +1655,9 @@ issues.review.left_comment=heeft een reactie achtergelaten
issues.review.content.empty=Je moet een reactie achterlaten die de gewenste verandering(en) beschrijft. issues.review.content.empty=Je moet een reactie achterlaten die de gewenste verandering(en) beschrijft.
issues.review.reject=aangevraagde wijzigingen %s issues.review.reject=aangevraagde wijzigingen %s
issues.review.wait=is gevraagd voor review %s issues.review.wait=is gevraagd voor review %s
issues.review.add_review_request=heeft een review aangevraagd van %s %s issues.review.add_review_request=beoordeling gevraagd van %[1]s %[2]s
issues.review.remove_review_request=beoordelingsaanvraag voor %s %s verwijderd issues.review.remove_review_request=beoordelingsaanvraag voor %[1]s %[2]s verwijderd
issues.review.remove_review_request_self=beoordeling geweigerd %s issues.review.remove_review_request_self=weigerde te beoordelen %s
issues.review.pending=In behandeling issues.review.pending=In behandeling
issues.review.review=Review issues.review.review=Review
issues.review.reviewers=Beoordelaars issues.review.reviewers=Beoordelaars
@ -2826,6 +2833,12 @@ mirror_use_ssh.not_available = SSH-authenticatie is niet beschikbaar.
issues.new.assign_to_me = Aan mij toewijzen issues.new.assign_to_me = Aan mij toewijzen
issues.all_title = Alles issues.all_title = Alles
settings.discord_icon_url.exceeds_max_length = Icoon-URL moet 2048 tekens of minder zijn settings.discord_icon_url.exceeds_max_length = Icoon-URL moet 2048 tekens of minder zijn
issues.review.add_review_requests = beoordelingen gevraagd van %[1]s %[2]s
issues.review.remove_review_requests = verwijderde beoordelingsverzoeken voor %[1]s %[2]s
issues.review.add_remove_review_requests = vraagde beoordelingen van %[1]s en verwijderde beoordelingsverzoeken voor %[2]s %[3]s
pulls.delete_after_merge.head_branch.is_default = De hoofdbranch die u wilt verwijderen is de standaard branch en kan niet verwijderd worden.
pulls.delete_after_merge.head_branch.is_protected = De hoofdbranch die u wilt verwijderen is een beschermde branch en kan niet verwijderd worden.
pulls.delete_after_merge.head_branch.insufficient_branch = Je hebt geen toestemming om de hoofdbranch te verwijderen.

View file

@ -198,6 +198,12 @@ buttons.switch_to_legacy.tooltip = Zamiast tego użyj starego edytora
buttons.disable_monospace_font = Wyłącz czcionkę monospace buttons.disable_monospace_font = Wyłącz czcionkę monospace
buttons.enable_monospace_font = Włącz czcionkę monospace buttons.enable_monospace_font = Włącz czcionkę monospace
buttons.indent.tooltip = Zagnieżdż elementy o jeden poziom buttons.indent.tooltip = Zagnieżdż elementy o jeden poziom
buttons.new_table.tooltip = Dodaj tabelę
table_modal.header = Dodaj tabelę
table_modal.placeholder.header = Nagłówek
table_modal.placeholder.content = Zawartość
table_modal.label.rows = Wiersze
table_modal.label.columns = Kolumny
[filter] [filter]
string.asc = A - Z string.asc = A - Z
@ -470,6 +476,7 @@ back_to_sign_in = Wróć do logowania
sign_in_openid = Kontynuuj z OpenID sign_in_openid = Kontynuuj z OpenID
hint_login = Masz już konto? <a href="%s">Zaloguj się teraz!</a> hint_login = Masz już konto? <a href="%s">Zaloguj się teraz!</a>
sign_up_button = Zarejestruj się. sign_up_button = Zarejestruj się.
use_onetime_code = Użyj kodu jednorazowego
[mail] [mail]
view_it_on=Zobacz na %s view_it_on=Zobacz na %s
@ -655,6 +662,9 @@ must_use_public_key = Podany klucz jest kluczem prywatnym. Nie przesyłaj nigdzi
Location = Lokalizacja Location = Lokalizacja
username_error_no_dots = ` może zawierać tylko znaki alfanumeryczne ("0-9", "a-z", "A-Z"), myślnik ("-") oraz podkreślenie ("_"). Nie może zaczynać się ani kończyć znakami niealfanumerycznymi, a znaki niealfanumeryczne występujące po sobie są również zabronione.` username_error_no_dots = ` może zawierać tylko znaki alfanumeryczne ("0-9", "a-z", "A-Z"), myślnik ("-") oraz podkreślenie ("_"). Nie może zaczynać się ani kończyć znakami niealfanumerycznymi, a znaki niealfanumeryczne występujące po sobie są również zabronione.`
username_error = ` może zawierać tylko znaki alfanumeryczne ("0-9", "a-z", "A-Z"), myślnik ("-") oraz podkreślenie ("_"). Nie może zaczynać się ani kończyć znakami niealfanumerycznymi, a znaki niealfanumeryczne występujące po sobie są również zabronione.` username_error = ` może zawierać tylko znaki alfanumeryczne ("0-9", "a-z", "A-Z"), myślnik ("-") oraz podkreślenie ("_"). Nie może zaczynać się ani kończyć znakami niealfanumerycznymi, a znaki niealfanumeryczne występujące po sobie są również zabronione.`
still_has_org = Twoje konto jest członkiem jednej bądź wielu organizacji, musisz je najpierw opuścić.
org_still_own_repo = Ta organizacja nadal jest właścicielem jednego lub wielu repozytoriów. Najpierw je usuń lub przenieś.
admin_cannot_delete_self = Nie możesz usunąć siebie, gdy jesteś administratorem. Proszę najpierw usunąć swoje uprawnienia administratora.
[user] [user]
@ -674,6 +684,20 @@ disabled_public_activity=Ten użytkownik wyłączył publiczne wyświetlanie jeg
code = Kod code = Kod
block = Zablokuj block = Zablokuj
unblock = Odblokuj unblock = Odblokuj
block_user.detail = Pamiętaj, że zablokowanie użytkownika powoduje inne skutki, takie jak:
block_user.detail_2 = Ten użytkownik nie będzie mógł wchodzić w interakcję z repozytoriami, których jesteś właścicielem, ani z problemami i komentarzami, które utworzyłeś.
settings = Ustawienia użytkownika
followers_one = %d obserwujących
following_one = %d obserwowanych
followers.title.one = Obserwujący
followers.title.few = Obserwujący
following.title.one = Obserwowani
following.title.few = Obserwowani
email_visibility.limited = Twój adres e-mail jest widoczny dla wszystkich uwierzytelnionych użytkowników
block_user = Zablokuj użytkownika
block_user.detail_1 = Przestaniecie się wzajemnie obserwować i nie będziecie mogli się wzajemnie obserwować.
follow_blocked_user = Nie możesz obserwować tego użytkownika, ponieważ go zablokowałeś lub ten użytkownik zablokował Ciebie.
show_on_map = Pokaż to mejsce na mapie
[settings] [settings]
@ -2868,4 +2892,5 @@ exact_tooltip = Uwzględniaj tylko wyniki pasujące do wyszukiwanego hasła
issue_kind = Wyszukaj problemy... issue_kind = Wyszukaj problemy...
pull_kind = Wyszukaj pull requesty... pull_kind = Wyszukaj pull requesty...
union = Unia union = Unia
regexp = RegExp regexp = RegExp
regexp_tooltip = Interpretuj wyszukiwane hasło jako wyrażenie regularne

View file

@ -2840,6 +2840,7 @@ issues.review.add_remove_review_requests = solicitou revisões de %[1]s e remove
pulls.delete_after_merge.head_branch.is_default = O branch head que você quer excluir é o branch padrão e não pode ser excluído. pulls.delete_after_merge.head_branch.is_default = O branch head que você quer excluir é o branch padrão e não pode ser excluído.
pulls.delete_after_merge.head_branch.is_protected = O branch head que você quer excluir é um branch protegido e não pode ser excluído. pulls.delete_after_merge.head_branch.is_protected = O branch head que você quer excluir é um branch protegido e não pode ser excluído.
pulls.delete_after_merge.head_branch.insufficient_branch = Você não tem permissão para excluir o branch head. pulls.delete_after_merge.head_branch.insufficient_branch = Você não tem permissão para excluir o branch head.
issues.filter_sort.relevance = Relevância
[graphs] [graphs]

View file

@ -160,10 +160,10 @@ invalid_data = Неверные данные: %v
copy_generic = Копировать в буфер обмена copy_generic = Копировать в буфер обмена
test = Проверить test = Проверить
error413 = Ваша квота исчерпана. error413 = Ваша квота исчерпана.
new_migrate.link = Выполнить миграцию new_migrate.link = Выполнить перенос
new_org.link = Создать организацию new_org.link = Создать организацию
new_repo.title = Новый репозиторий new_repo.title = Новый репозиторий
new_migrate.title = Новая миграция new_migrate.title = Новый перенос
new_org.title = Новая организация new_org.title = Новая организация
new_repo.link = Создать репозиторий new_repo.link = Создать репозиторий
@ -255,9 +255,9 @@ err_empty_db_path=Путь к базе данных SQLite3 не может бы
no_admin_and_disable_registration=Вы не можете отключить регистрацию до создания учётной записи администратора. no_admin_and_disable_registration=Вы не можете отключить регистрацию до создания учётной записи администратора.
err_empty_admin_password=Пароль администратора не может быть пустым. err_empty_admin_password=Пароль администратора не может быть пустым.
err_empty_admin_email=Адрес эл. почты администратора не может быть пустым. err_empty_admin_email=Адрес эл. почты администратора не может быть пустым.
err_admin_name_is_reserved=Неверное имя администратора, это имя зарезервировано err_admin_name_is_reserved=Неподходящее имя администратора, оно зарезервировано
err_admin_name_pattern_not_allowed=Неверное имя администратора, имя попадает под зарезервированный шаблон err_admin_name_pattern_not_allowed=Неподходящее имя администратора, оно попадает под шаблон зарезервированных
err_admin_name_is_invalid=Неверное имя администратора err_admin_name_is_invalid=Неподходящее имя администратора
general_title=Основные настройки general_title=Основные настройки
app_name=Название сервера app_name=Название сервера
@ -745,7 +745,7 @@ uid=UID
webauthn=Двухфакторная аутентификация (ключами безопасности) webauthn=Двухфакторная аутентификация (ключами безопасности)
public_profile=Публичный профиль public_profile=Публичный профиль
biography_placeholder=Расскажите немного о себе! (Можно использовать Markdown) biography_placeholder=Кратко расскажите о себе другим! (Можно использовать Markdown)
location_placeholder=Пусть все знают, откуда вы location_placeholder=Пусть все знают, откуда вы
profile_desc=Как ваш профиль будет отображаться для других пользователей. Ваш основной адрес эл. почты будет использоваться для уведомлений, восстановления пароля и веб-операций с Git. profile_desc=Как ваш профиль будет отображаться для других пользователей. Ваш основной адрес эл. почты будет использоваться для уведомлений, восстановления пароля и веб-операций с Git.
password_username_disabled=Нелокальным пользователям запрещено изменение их имени пользователя. Для получения более подробной информации обратитесь к администратору сайта. password_username_disabled=Нелокальным пользователям запрещено изменение их имени пользователя. Для получения более подробной информации обратитесь к администратору сайта.
@ -1195,7 +1195,7 @@ migrate_items_releases=Выпуски
migrate_repo=Перенос репозитория migrate_repo=Перенос репозитория
migrate.clone_address=Перенос / Клонирование по URL migrate.clone_address=Перенос / Клонирование по URL
migrate.clone_address_desc=HTTP/HTTPS или Git адрес существующего репозитория migrate.clone_address_desc=HTTP/HTTPS или Git адрес существующего репозитория
migrate.github_token_desc=Вы можете поместить один или несколько токенов, разделенных запятыми, чтобы ускорить миграцию, обходом ограничений скорости API GitHub. ПРЕДУПРЕЖДЕНИЕ: злоупотребление этой функцией может нарушить политику поставщика услуг и привести к блокировке учётной записи. migrate.github_token_desc=Вы можете указать один или несколько разделенных запятыми токенов, чтобы ускорить перенос за счёт обхода ограничений частоты обращений к API GitHub. ПРЕДУПРЕЖДЕНИЕ: злоупотребление этой функцией может нарушить условия предоставления услуг и привести к блокировке учётной записи.
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.
@ -1208,7 +1208,7 @@ migrated_from_fake=Перенесено из %[1]s
migrate.migrate=Перенос из %s migrate.migrate=Перенос из %s
migrate.migrating=Перенос из <b>%s</b>... migrate.migrating=Перенос из <b>%s</b>...
migrate.migrating_failed=Перенос из <b>%s</b> не удался. migrate.migrating_failed=Перенос из <b>%s</b> не удался.
migrate.migrating_failed.error=Не удалось мигрировать: %s migrate.migrating_failed.error=Не удалось перенести: %s
migrate.migrating_failed_no_addr=Перенос не удался. migrate.migrating_failed_no_addr=Перенос не удался.
migrate.github.description=Перенесите данные с github.com или сервера GitHub Enterprise. migrate.github.description=Перенесите данные с github.com или сервера GitHub Enterprise.
migrate.git.description=Перенести только репозиторий из любого Git сервиса. migrate.git.description=Перенести только репозиторий из любого Git сервиса.
@ -1226,7 +1226,7 @@ migrate.migrating_releases=Перенос выпусков
migrate.migrating_issues=Перенос задач migrate.migrating_issues=Перенос задач
migrate.migrating_pulls=Перенос запросов на слияние migrate.migrating_pulls=Перенос запросов на слияние
migrate.cancel_migrating_title=Отменить перенос migrate.cancel_migrating_title=Отменить перенос
migrate.cancel_migrating_confirm=Вы хотите отменить эту миграцию? migrate.cancel_migrating_confirm=Вы хотите отменить перенос?
mirror_from=зеркало из mirror_from=зеркало из
forked_from=ответвлён от forked_from=ответвлён от
@ -2097,7 +2097,7 @@ settings.mirror_settings=Зеркалирование
settings.mirror_settings.docs=Настройте свой репозиторий для автоматической синхронизации коммитов, тегов и ветвей с другим репозиторием. settings.mirror_settings.docs=Настройте свой репозиторий для автоматической синхронизации коммитов, тегов и ветвей с другим репозиторием.
settings.mirror_settings.docs.disabled_pull_mirror.instructions=Настройте свой проект для автоматической отправки коммитов, тегов и ветвей в другой репозиторий. Pull-зеркала были отключены администратором сайта. settings.mirror_settings.docs.disabled_pull_mirror.instructions=Настройте свой проект для автоматической отправки коммитов, тегов и ветвей в другой репозиторий. Pull-зеркала были отключены администратором сайта.
settings.mirror_settings.docs.disabled_push_mirror.instructions=Настройте свой проект, чтобы автоматически получать коммиты, теги и ветви из другого репозитория. settings.mirror_settings.docs.disabled_push_mirror.instructions=Настройте свой проект, чтобы автоматически получать коммиты, теги и ветви из другого репозитория.
settings.mirror_settings.docs.disabled_push_mirror.pull_mirror_warning=В настоящее время это можно сделать только в меню «Новая миграция». Для получения дополнительной информации, пожалуйста, ознакомьтесь: settings.mirror_settings.docs.disabled_push_mirror.pull_mirror_warning=В настоящее время это можно сделать только через меню «Выполнить перенос». Для получения дополнительной информации, пожалуйста, ознакомьтесь:
settings.mirror_settings.docs.disabled_push_mirror.info=Push-зеркала отключены администратором сайта. settings.mirror_settings.docs.disabled_push_mirror.info=Push-зеркала отключены администратором сайта.
settings.mirror_settings.docs.no_new_mirrors=Ваш репозиторий зеркалирует изменения в другой репозиторий или из него. Пожалуйста, имейте в виду, что в данный момент невозможно создавать новые зеркала. settings.mirror_settings.docs.no_new_mirrors=Ваш репозиторий зеркалирует изменения в другой репозиторий или из него. Пожалуйста, имейте в виду, что в данный момент невозможно создавать новые зеркала.
settings.mirror_settings.docs.can_still_use=Хотя вы не можете изменять существующие зеркала или создавать новые, вы можете по-прежнему использовать существующее зеркало. settings.mirror_settings.docs.can_still_use=Хотя вы не можете изменять существующие зеркала или создавать новые, вы можете по-прежнему использовать существующее зеркало.
@ -2536,7 +2536,7 @@ diff.load=Показать различия
diff.generated=сгенерированный diff.generated=сгенерированный
diff.vendored=предоставленный diff.vendored=предоставленный
diff.comment.placeholder=Оставить комментарий diff.comment.placeholder=Оставить комментарий
diff.comment.markdown_info=Поддерживается синтаксис Markdown. diff.comment.markdown_info=Поддерживается форматирование с Markdown.
diff.comment.add_single_comment=Добавить простой комментарий diff.comment.add_single_comment=Добавить простой комментарий
diff.comment.add_review_comment=Добавить комментарий diff.comment.add_review_comment=Добавить комментарий
diff.comment.start_review=Начать рецензию diff.comment.start_review=Начать рецензию
@ -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 = Невозможно создать запрос на слияние в этом репозитории, т.к. вы заблокированы его владельцем.
@ -2843,6 +2843,7 @@ issues.review.add_remove_review_requests = запрошены рецензии
pulls.delete_after_merge.head_branch.is_default = Головная ветвь, которую вы попытались удалить, является ветвью по умолчанию и не может быть удалена. pulls.delete_after_merge.head_branch.is_default = Головная ветвь, которую вы попытались удалить, является ветвью по умолчанию и не может быть удалена.
pulls.delete_after_merge.head_branch.is_protected = Головная ветвь, которую вы попытались удалить, защищена от этого и не может быть удалена. pulls.delete_after_merge.head_branch.is_protected = Головная ветвь, которую вы попытались удалить, защищена от этого и не может быть удалена.
pulls.delete_after_merge.head_branch.insufficient_branch = Отсутствует разрешение для удаления головной ветви. pulls.delete_after_merge.head_branch.insufficient_branch = Отсутствует разрешение для удаления головной ветви.
issues.filter_sort.relevance = По соответствию
[graphs] [graphs]
@ -3418,7 +3419,7 @@ config.git_max_diff_lines=Макс. количество строк в файл
config.git_max_diff_line_characters=Макс. количество символов в строке при сравнении config.git_max_diff_line_characters=Макс. количество символов в строке при сравнении
config.git_max_diff_files=Макс. отображаемое количество файлов при сравнении config.git_max_diff_files=Макс. отображаемое количество файлов при сравнении
config.git_gc_args=Аргументы сборщика мусора config.git_gc_args=Аргументы сборщика мусора
config.git_migrate_timeout=Ограничение времени миграций config.git_migrate_timeout=Ограничение времени переносов
config.git_mirror_timeout=Ограничение времени на синхронизацию зеркала config.git_mirror_timeout=Ограничение времени на синхронизацию зеркала
config.git_clone_timeout=Ограничение времени операций клонирования config.git_clone_timeout=Ограничение времени операций клонирования
config.git_pull_timeout=Ограничение времени на получение изменений config.git_pull_timeout=Ограничение времени на получение изменений

View file

@ -108,7 +108,7 @@ enable_javascript = Цей вебсайт потребує JavaScript.
webauthn_press_button = Натисніть кнопку на ключі безпеки… webauthn_press_button = Натисніть кнопку на ключі безпеки…
webauthn_use_twofa = Введіть код підтвердження з телефону webauthn_use_twofa = Введіть код підтвердження з телефону
webauthn_error = Не вдалося розпізнати ключ безпеки. webauthn_error = Не вдалося розпізнати ключ безпеки.
webauthn_error_unknown = Трапилась невідома помилка. Будь ласка, повторіть спробу. webauthn_error_unknown = Сталася невідома помилка. Будь ласка, повторіть спробу.
webauthn_error_unable_to_process = Сервер не зміг обробити запит. webauthn_error_unable_to_process = Сервер не зміг обробити запит.
webauthn_error_duplicated = Запит із наданим ключем безпеки відхилено. Впевніться, що цього ключа ще не зареєстровано. webauthn_error_duplicated = Запит із наданим ключем безпеки відхилено. Впевніться, що цього ключа ще не зареєстровано.
webauthn_error_empty = Ключ слід якось назвати. webauthn_error_empty = Ключ слід якось назвати.
@ -468,7 +468,7 @@ openid_signin_desc = Введіть ваше посилання OpenID. Напр
invalid_password = Ваш пароль не відповідає тому, що був заданий при створенні облікового запису. invalid_password = Ваш пароль не відповідає тому, що був заданий при створенні облікового запису.
hint_login = Вже маєте обліковий запис? <a href="%s">Увійдіть зараз!</a> hint_login = Вже маєте обліковий запис? <a href="%s">Увійдіть зараз!</a>
hint_register = Потрібен обліковий запис? <a href="%s">Зареєструйтеся зараз.</a> hint_register = Потрібен обліковий запис? <a href="%s">Зареєструйтеся зараз.</a>
sign_up_button = Зареєструватись зараз. sign_up_button = Зареєструватися.
sign_up_successful = Обліковий запис успішно створений. Вітаємо! sign_up_successful = Обліковий запис успішно створений. Вітаємо!
[mail] [mail]
@ -492,7 +492,7 @@ register_notify.text_3=Якщо цей обліковий запис було с
reset_password=Відновлення вашого облікового запису reset_password=Відновлення вашого облікового запису
reset_password.title=%s, ви відправили запит на відновлення облікового запису reset_password.title=%s, ви відправили запит на відновлення облікового запису
reset_password.text=Перейдіть за цим посиланням, щоб відновити ваш обліковий запис в <b>%s</b>: reset_password.text=Перейдіть за цим посиланням, щоб відновити свій обліковий запис в <b>%s</b>:
register_success=Реєстрація успішна register_success=Реєстрація успішна
@ -532,12 +532,14 @@ repo.collaborator.added.text=Вас додано в якості співавт
primary_mail_change.subject = Ваша основна пошта була змінена primary_mail_change.subject = Ваша основна пошта була змінена
totp_disabled.subject = TOTP було вимкнено totp_disabled.subject = TOTP було вимкнено
totp_disabled.text_1 = Тимчасовий одноразовий пароль (TOTP) на вашому обліковому записі було вимкнено. totp_disabled.text_1 = Тимчасовий одноразовий пароль (TOTP) на вашому обліковому записі було вимкнено.
password_change.subject = Ваш пароль було успішно змінено password_change.subject = Ваш пароль успішно змінено
password_change.text_1 = Пароль до вашого облікового запису щойно був змінений. password_change.text_1 = Пароль до вашого облікового запису було щойно змінено.
reply = чи відповісти напряму з електронної адреси reply = чи відповісти напряму з електронної адреси
admin.new_user.user_info = Інформація користувача admin.new_user.user_info = Інформація користувача
admin.new_user.text = Будь ласка, <a href="%s">натисніть тут</a>, щоб керувати цим користувачем із панелі адміністрації. admin.new_user.text = Будь ласка, <a href="%s">натисніть тут</a>, щоб керувати цим користувачем із панелі адміністрації.
admin.new_user.subject = Новий користувач %s щойно ввійшов admin.new_user.subject = Новий користувач %s щойно ввійшов
removed_security_key.text_1 = Ключ безпеки «%[1]s» було щойно видалено з вашого облікового запису.
removed_security_key.subject = Ключ безпеки видалено
[modal] [modal]
@ -748,7 +750,7 @@ manage_ssh_keys=Керувати ключами SSH
manage_ssh_principals=Управління SSH сертифікатами користувачів manage_ssh_principals=Управління SSH сертифікатами користувачів
manage_gpg_keys=Керувати ключами GPG manage_gpg_keys=Керувати ключами GPG
add_key=Додати ключ add_key=Додати ключ
ssh_desc=Ці відкриті SSH-ключі пов'язані з вашим обліковим записом. Відповідні приватні ключі дозволяють отримати повний доступ до ваших репозиторіїв. ssh_desc=Ці відкриті ключі SSH повʼязані з вашим обліковим записом. Відповідні приватні ключі дозволяють отримати повний доступ до ваших репозиторіїв. Підтверджені ключі можна використати для підтвердження комітів Git, підписані з SSH.
principal_desc=Ці настройки SSH сертифікатів вказані у вашому обліковому записі та надають повний доступ до ваших репозиторіїв. principal_desc=Ці настройки SSH сертифікатів вказані у вашому обліковому записі та надають повний доступ до ваших репозиторіїв.
gpg_desc=Ці публічні ключі GPG пов'язані з вашим обліковим записом. Тримайте свої приватні ключі в безпеці, оскільки вони дозволяють здійснювати перевірку комітів. gpg_desc=Ці публічні ключі GPG пов'язані з вашим обліковим записом. Тримайте свої приватні ключі в безпеці, оскільки вони дозволяють здійснювати перевірку комітів.
ssh_helper=<strong>Потрібна допомога?</strong> Дивіться гід на GitHub з <a href="%s"> генерації ключів SSH</a> або виправлення <a href="%s">типових неполадок SSH</a>. ssh_helper=<strong>Потрібна допомога?</strong> Дивіться гід на GitHub з <a href="%s"> генерації ключів SSH</a> або виправлення <a href="%s">типових неполадок SSH</a>.
@ -917,6 +919,20 @@ webauthn_delete_key_desc = Якщо ви видалите ключ безпек
change_password = Зміна пароля change_password = Зміна пароля
email_notifications.andyourown = І ваші власні сповіщення email_notifications.andyourown = І ваші власні сповіщення
visibility.public_tooltip = Видимий(а) для всіх visibility.public_tooltip = Видимий(а) для всіх
update_language_not_found = Мова «%s» недоступна.
pronouns = Займенники
pronouns_unspecified = Не вказані
hints = Підказки
language.title = Мова за замовчуванням
update_hints = Оновити підказки
update_hints_success = Підказки оновлено.
additional_repo_units_hint = Пропонувати увімкнути додаткові розділи репозиторію
additional_repo_units_hint_description = Показувати підказку «Увімкнути ще» для репозиторіїв, у яких увімкнено не всі доступні розділи.
language.description = Цю мову буде збережено у вашому обліковому записі, вона використовуватиметься після того, як ви ввійдете в систему.
language.localization_project = Допоможіть нам перекласти Forgejo вашою мовою! <a href="%s">Дізнатися більше</a>.
permissions_list = Дозволи:
comment_type_group_dependency = Залежність
comment_type_group_pull_request_push = Додані коміти
[repo] [repo]
owner=Власник owner=Власник
@ -1181,7 +1197,7 @@ commits.commits=Коміти
commits.nothing_to_compare=Ці гілки однакові. commits.nothing_to_compare=Ці гілки однакові.
commits.search=Знайти коміт… commits.search=Знайти коміт…
commits.find=Пошук commits.find=Пошук
commits.search_all=Усі гілки commits.search_all=У всіх гілках
commits.author=Автор commits.author=Автор
commits.message=Повідомлення commits.message=Повідомлення
commits.date=Дата commits.date=Дата
@ -1744,9 +1760,9 @@ settings.site=Веб-сайт
settings.update_settings=Зберегти налаштування settings.update_settings=Зберегти налаштування
settings.branches.update_default_branch=Оновити гілку за замовчуванням settings.branches.update_default_branch=Оновити гілку за замовчуванням
settings.advanced_settings=Додаткові налаштування settings.advanced_settings=Додаткові налаштування
settings.wiki_desc=Увімкнути репозиторії Вікі settings.wiki_desc=Увімкнути вікі репозиторію
settings.use_internal_wiki=Використовувати вбудовані Вікі settings.use_internal_wiki=Використовувати вбудовану вікі
settings.use_external_wiki=Використовувати зовнішні Вікі settings.use_external_wiki=Використовувати зовнішню вікі
settings.external_wiki_url=URL зовнішньої вікі settings.external_wiki_url=URL зовнішньої вікі
settings.external_wiki_url_error=Зовнішня URL-адреса wiki не є допустимою URL-адресою. settings.external_wiki_url_error=Зовнішня URL-адреса wiki не є допустимою URL-адресою.
settings.external_wiki_url_desc=Відвідувачі будуть перенаправлені на URL-адресу, коли вони клацають по вкладці. settings.external_wiki_url_desc=Відвідувачі будуть перенаправлені на URL-адресу, коли вони клацають по вкладці.
@ -1796,7 +1812,7 @@ settings.transfer_notices_1=- Ви втратите доступ до репоз
settings.transfer_notices_2=- Ви збережете доступ, якщо новим власником стане організація, власником якої ви є. settings.transfer_notices_2=- Ви збережете доступ, якщо новим власником стане організація, власником якої ви є.
settings.transfer_notices_3=- Якщо репозиторій є приватним і передається окремому користувачеві, ця дія гарантує, що користувач має хоча б дозвіл на читаня репозитарію (і при необхідності змінює права дозволів). settings.transfer_notices_3=- Якщо репозиторій є приватним і передається окремому користувачеві, ця дія гарантує, що користувач має хоча б дозвіл на читаня репозитарію (і при необхідності змінює права дозволів).
settings.transfer_owner=Новий власник settings.transfer_owner=Новий власник
settings.transfer_perform=Здіснити перенесення settings.transfer_perform=Здійснити перенесення
settings.transfer_started=`Цей репозиторій чекає підтвердження перенесення від "%s"` settings.transfer_started=`Цей репозиторій чекає підтвердження перенесення від "%s"`
settings.transfer_succeed=Репозиторій був перенесений. settings.transfer_succeed=Репозиторій був перенесений.
settings.signing_settings=Параметри перевірки підпису settings.signing_settings=Параметри перевірки підпису
@ -1906,7 +1922,7 @@ settings.event_pull_request_desc=Запит до злиття відкрито,
settings.event_pull_request_assign=Призначення settings.event_pull_request_assign=Призначення
settings.event_pull_request_assign_desc=Запит про злиття призначено або скасовано. settings.event_pull_request_assign_desc=Запит про злиття призначено або скасовано.
settings.event_pull_request_label=Мітки settings.event_pull_request_label=Мітки
settings.event_pull_request_label_desc=Мітка запиту на злиття оновлена або очищена. settings.event_pull_request_label_desc=Мітки запиту на злиття оновлено або очищено.
settings.event_pull_request_milestone=Запит на злиття призначений на етап settings.event_pull_request_milestone=Запит на злиття призначений на етап
settings.event_pull_request_milestone_desc=Запит на злиття призначений на етап або видалений з етапу. settings.event_pull_request_milestone_desc=Запит на злиття призначений на етап або видалений з етапу.
settings.event_pull_request_comment=Коментарі settings.event_pull_request_comment=Коментарі
@ -1928,8 +1944,8 @@ settings.hook_type=Тип хука
settings.slack_token=Токен settings.slack_token=Токен
settings.slack_domain=Домен settings.slack_domain=Домен
settings.slack_channel=Канал settings.slack_channel=Канал
settings.deploy_keys=Ключі для розгортування settings.deploy_keys=Ключі для розгортання
settings.add_deploy_key=Додати ключ для розгортування settings.add_deploy_key=Додати ключ для розгортання
settings.deploy_key_desc=Ключі розгортання доступні тільки для читання. Це не те ж саме що і SSH-ключі аккаунта. settings.deploy_key_desc=Ключі розгортання доступні тільки для читання. Це не те ж саме що і SSH-ключі аккаунта.
settings.is_writable=Увімкнути доступ для запису settings.is_writable=Увімкнути доступ для запису
settings.is_writable_info=Чи може цей ключ бути використаний для виконання <strong>push</strong> в репозиторій? Ключі розгортання завжди мають доступ на pull. settings.is_writable_info=Чи може цей ключ бути використаний для виконання <strong>push</strong> в репозиторій? Ключі розгортання завжди мають доступ на pull.
@ -1938,7 +1954,7 @@ settings.title=Заголовок
settings.deploy_key_content=Зміст settings.deploy_key_content=Зміст
settings.key_been_used=Зміст ключа розгортання вже використовується. settings.key_been_used=Зміст ключа розгортання вже використовується.
settings.key_name_used=Ключ розгортання з таким заголовком вже існує. settings.key_name_used=Ключ розгортання з таким заголовком вже існує.
settings.deploy_key_deletion=Видалити ключ для розгортування settings.deploy_key_deletion=Видалити ключ для розгортання
settings.deploy_key_deletion_desc=Видалення ключа розгортки унеможливить доступ до репозиторія з його допомогою. Ви впевнені? settings.deploy_key_deletion_desc=Видалення ключа розгортки унеможливить доступ до репозиторія з його допомогою. Ви впевнені?
settings.deploy_key_deletion_success=Ключі розгортання було видалено. settings.deploy_key_deletion_success=Ключі розгортання було видалено.
settings.branches=Гілки settings.branches=Гілки
@ -1949,7 +1965,7 @@ settings.protected_branch_can_push_no=Ви не можете виконуват
settings.branch_protection=Правила захисту для гілки «<b>%s</b>» settings.branch_protection=Правила захисту для гілки «<b>%s</b>»
settings.protect_this_branch=Захистити цю гілку settings.protect_this_branch=Захистити цю гілку
settings.protect_this_branch_desc=Запобігає видаленню гілки та обмежує виконання в ній push та злиття. settings.protect_this_branch_desc=Запобігає видаленню гілки та обмежує виконання в ній push та злиття.
settings.protect_disable_push=Заборонити Push settings.protect_disable_push=Заборонити push
settings.protect_disable_push_desc=Для цієї гілки буде заборонено виконання push. settings.protect_disable_push_desc=Для цієї гілки буде заборонено виконання push.
settings.protect_enable_push=Дозволити push settings.protect_enable_push=Дозволити push
settings.protect_enable_push_desc=Будь-хто із правом запису зможе виконувати push для цієї гілки (за виключенням force push). settings.protect_enable_push_desc=Будь-хто із правом запису зможе виконувати push для цієї гілки (за виключенням force push).
@ -2273,9 +2289,86 @@ no_eol.tooltip = У цьому файлі відсутній символ зак
settings.trust_model.committer.desc = Допустимі підписи будуть позначатися як «довірені», тільки якщо вони відповідають автору коміта, в іншому випадку вони позначатимуться як «невідповідні». Це змусить Forgejo бути автором підписаних комітів, а фактичного автора зазначати в трейлерах «Co-authored-by» і «Co-committed-by» в описі коміта. Типовий ключ Forgejo повинен відповідати користувачу в базі даних. settings.trust_model.committer.desc = Допустимі підписи будуть позначатися як «довірені», тільки якщо вони відповідають автору коміта, в іншому випадку вони позначатимуться як «невідповідні». Це змусить Forgejo бути автором підписаних комітів, а фактичного автора зазначати в трейлерах «Co-authored-by» і «Co-committed-by» в описі коміта. Типовий ключ Forgejo повинен відповідати користувачу в базі даних.
pulls.clear_merge_message_hint = Очищення повідомлення про об'єднання видалить лише вміст повідомлення коміту і збереже згенеровані git-трейлери, такі як «Co-Authored-By…». pulls.clear_merge_message_hint = Очищення повідомлення про об'єднання видалить лише вміст повідомлення коміту і збереже згенеровані git-трейлери, такі як «Co-Authored-By…».
branch.delete_branch_has_new_commits = Гілку «%s» не можна видалити, оскільки після об'єднання було додано нові коміти. branch.delete_branch_has_new_commits = Гілку «%s» не можна видалити, оскільки після об'єднання було додано нові коміти.
settings.graphql_url = Посилання GraphQL
settings.packagist_api_token = Токен API
settings.archive.text = Архівування репозиторію зробить його доступним тільки для читання. Він буде прихований з панелі управління. Ніхто (навіть ви!) не зможе робити нові коміти, створювати задачі чи запити на злиття.
settings.protected_branch.delete_rule = Видалити правило
settings.branches.add_new_rule = Додати нове правило
settings.add_key_success = Ключ для розгортання «%s» успішно додано.
settings.update_settings_no_unit = Репозиторій повинен дозволяти хоча б якусь взаємодію.
settings.packagist_package_url = Посилання на пакунок Packagist
settings.transfer.modal.title = Передати новому власнику
settings.transfer.button = Передати новому власнику
settings.event_package = Пакунок
settings.event_package_desc = Пакунок у репозиторії створено або видалено.
settings.new_owner_blocked_doer = Новий власник заблокував вас.
settings.transfer_quota_exceeded = Новий власник (%s) перевищив квоту. Репозиторій не передано.
release.title_empty = Заголовок не може бути порожнім.
issues.role.member_helper = Цей користувач є членом організації, що володіє цим репозиторієм.
wiki.page_content = Вміст сторінки
wiki.page_title = Заголовок сторінки
pulls.close = Закрити запит на злиття
branch.delete = Видалити гілку «%s»
diff.comment.add_line_comment = Додати коментар до рядка
issues.review.option.hide_outdated_comments = Приховати застарілі коментарі
issues.num_participants_one = %d учасник
issues.review.option.show_outdated_comments = Показати застарілі коментарі
pulls.delete.title = Видалити цей запит на злиття?
issues.author.tooltip.pr = Автор цього запиту на злиття.
branch.deletion_failed = Не вдалося видалити гілку «%s».
pulls.status_checks_show_all = Показати всі перевірки
wiki.cancel = Скасувати
issues.role.first_time_contributor_helper = Це перший внесок цього користувача до репозиторію.
pulls.filter_changes_by_commit = Фільтрувати за комітом
pulls.is_empty = Зміни з цієї гілки вже є в цільовій гілці. Коміт буде порожній.
issues.author.tooltip.issue = Автор цієї задачі.
pulls.made_using_agit = AGit
activity.navbar.recent_commits = Нещодавні коміти
branch.deletion_success = Гілку «%s» видалено.
pulls.show_all_commits = Показати всі коміти
pull.deleted_branch = (видалено): %s
milestones.update_ago = Оновлено %s
size_format = %[1]s: %[2]s; %[3]s: %[4]s
settings.units.add_more = Увімкнути ще
migrate.cancel_migrating_title = Скасувати перенесення
settings.units.units = Розділи
settings.units.overview = Огляд
projects.create_success = Проєкт «%s» створено.
issues.no_content = Немає опису.
settings.mirror_settings.docs.doc_link_title = Як дзеркалювати репозиторії?
n_commit_one = %s коміт
n_commit_few = %s комітів
signing.will_sign = Коміт буде підписано ключем «%s».
signing.wont_sign.error = Під час перевірки можливості підписати коміт сталася помилка.
commits.search_branch = У цій гілці
ext_wiki = Зовнішня вікі
pulls.commit_ref_at = `послався на цей запит на злиття в коміті <a id="%[1]s" href="#%[1]s">%[2]s</a>`
pulls.cmd_instruction_hint = Переглянути інструкції для командного рядка
issues.max_pinned = Неможливо закріпити більше задач
issues.unpin_comment = відкріпив %s
issues.pin_comment = закріпив %s
project = Проєкти
issues.review.outdated_description = Вміст змінився з моменту написання цього коментаря
commits.browse_further = Дивитися далі
issues.unpin_issue = Відкріпити задачу
n_branch_one = %s гілка
n_branch_few = %s гілок
executable_file = Виконуваний файл
migrate_options_mirror_helper = Цей репозиторій буде дзеркалом
projects.edit_success = Проєкт «%s» оновлено.
wiki.search = Пошук по вікі
wiki.no_search_results = Нічого не знайдено
pulls.closed = Запит на злиття закрито
signing.wont_sign.not_signed_in = Ви не ввійшли в систему.
settings.wiki_globally_editable = Дозволити всім користувачам редагувати вікі
[graphs] [graphs]
contributors.what = внески contributors.what = внески
component_loading_info = Це може зайняти деякий час…
component_loading = Завантаження %s...
component_loading_failed = Не вдалося завантажити %s
recent_commits.what = нещодавні коміти
component_failed_to_load = Сталася несподівана помилка.
[org] [org]
org_name_holder=Назва організації org_name_holder=Назва організації
@ -2384,6 +2477,7 @@ teams.all_repositories_read_permission_desc=Ця команда надає до
teams.all_repositories_write_permission_desc=Ця команда надає дозвіл <strong>Запис</strong> для <strong>всіх репозиторіїв</strong>: учасники можуть переглядати та виконувати push в репозиторіях. teams.all_repositories_write_permission_desc=Ця команда надає дозвіл <strong>Запис</strong> для <strong>всіх репозиторіїв</strong>: учасники можуть переглядати та виконувати push в репозиторіях.
teams.all_repositories_admin_permission_desc=Ця команда надає дозвіл <strong>Адміністрування</strong> для <strong>всіх репозиторіїв</strong>: учасники можуть переглядати, виконувати push та додавати співробітників. teams.all_repositories_admin_permission_desc=Ця команда надає дозвіл <strong>Адміністрування</strong> для <strong>всіх репозиторіїв</strong>: учасники можуть переглядати, виконувати push та додавати співробітників.
code = Код code = Код
open_dashboard = Відкрити панель управління
[admin] [admin]
dashboard=Панель управління dashboard=Панель управління
@ -2844,6 +2938,17 @@ monitor.last_execution_result = Результат
repos.lfs_size = Розмір LFS repos.lfs_size = Розмір LFS
config.allow_dots_in_usernames = Дозволити використання крапки в іменах користувачів. Не впливає на існуючі облікові записи. config.allow_dots_in_usernames = Дозволити використання крапки в іменах користувачів. Не впливає на існуючі облікові записи.
config.mailer_enable_helo = Увімкнути HELO config.mailer_enable_helo = Увімкнути HELO
users.organization_creation.description = Дозволити створення нових організацій.
users.cannot_delete_self = Ви не можете видалити себе
monitor.processes_count = %d процесів
monitor.stacktrace = Траса стека
config.send_test_mail_submit = Надіслати
users.bot = Бот
monitor.stats = Статистика
users.new_success = Обліковий запис «%s» створено.
config_settings = Налаштування
self_check.no_problem_found = Проблем поки що не виявлено.
config_summary = Підсумок
[action] [action]
@ -2969,7 +3074,7 @@ desc = Керувати пакунками репозиторію.
requirements = Вимоги requirements = Вимоги
dependencies = Залежності dependencies = Залежності
empty.repo = Ви опублікували пакунок, але він не показаний тут? Перейдіть до <a href="%[1]s">налаштувань пакунків</a> та привʼяжіть його до цього репозиторію. empty.repo = Ви опублікували пакунок, але він не показаний тут? Перейдіть до <a href="%[1]s">налаштувань пакунків</a> та привʼяжіть його до цього репозиторію.
alpine.repository = Інформація репозиторію alpine.repository = Про репозиторій
alpine.install = Аби встановити цей пакунок, запустіть команду: alpine.install = Аби встановити цей пакунок, запустіть команду:
cran.install = Аби встановити пакунок, запустіть команду: cran.install = Аби встановити пакунок, запустіть команду:
composer.dependencies.development = Залежності розробки composer.dependencies.development = Залежності розробки
@ -2992,7 +3097,7 @@ container.pull = Завантажити світлину з командного
details.repository_site = Вебсторінка репозиторію details.repository_site = Вебсторінка репозиторію
composer.dependencies = Залежності composer.dependencies = Залежності
debian.install = Аби встановити пакунок, запустіть команду: debian.install = Аби встановити пакунок, запустіть команду:
debian.repository = Інформація репозиторію debian.repository = Про репозиторій
debian.repository.distributions = Дистрибутиви debian.repository.distributions = Дистрибутиви
alpine.repository.architectures = Архітектури alpine.repository.architectures = Архітектури
arch.version.depends = Залежить arch.version.depends = Залежить
@ -3006,6 +3111,12 @@ dependency.version = Версія
container.labels = Мітки container.labels = Мітки
filter.no_result = Ваш фільтр не видав жодних результатів. filter.no_result = Ваш фільтр не видав жодних результатів.
dependency.id = ID dependency.id = ID
rpm.repository = Про репозиторій
rpm.repository.architectures = Архітектури
settings.delete.error = Не вдалося видалити пакунок.
settings.delete.success = Пакунок видалено.
npm.dependencies = Залежності
settings.delete = Видалити пакунок
[secrets] [secrets]
deletion = Видалити секрет deletion = Видалити секрет
@ -3018,6 +3129,7 @@ deletion.description = Видалення секрету є остаточним
creation = Додати секрет creation = Додати секрет
none = Секретів ще немає. none = Секретів ще немає.
creation.name_placeholder = без урахування регістру, тільки літерно-цифрові символи або підкреслення, не може починатися з GITEA_ або GITHUB_ creation.name_placeholder = без урахування регістру, тільки літерно-цифрові символи або підкреслення, не може починатися з GITEA_ або GITHUB_
secrets = Секрети
[actions] [actions]
@ -3065,6 +3177,8 @@ runs.status_no_select = Усі стани
runs.status = Стан runs.status = Стан
runners.task_list.status = Стан runners.task_list.status = Стан
runners.status = Стан runners.status = Стан
runs.no_workflows.documentation = Докладніше про Дії Forgejo читайте в <a target="_blank" rel="noopener noreferrer" href="%s">документації</a>.
runners.reset_registration_token = Скинути токен реєстрації

View file

@ -70,7 +70,7 @@ your_starred=点赞
your_settings=设置 your_settings=设置
all=所有 all=所有
sources=自建 sources=来源
mirrors=镜像 mirrors=镜像
collaborative=协作 collaborative=协作
forks=派生 forks=派生
@ -2585,7 +2585,7 @@ diff.file_suppressed_line_too_long=文件差异因一行或多行过长而隐藏
diff.too_many_files=某些文件未显示,因为此 diff 中更改的文件太多 diff.too_many_files=某些文件未显示,因为此 diff 中更改的文件太多
diff.show_more=显示更多 diff.show_more=显示更多
diff.load=加载差异 diff.load=加载差异
diff.generated=自动生成 diff.generated=自动生成
diff.vendored=Vendored diff.vendored=Vendored
diff.comment.add_line_comment=添加行内评论 diff.comment.add_line_comment=添加行内评论
diff.comment.placeholder=留下评论 diff.comment.placeholder=留下评论

View file

@ -26,6 +26,7 @@
.ui.secondary.menu .dropdown.item > .menu { margin-top: 0; } .ui.secondary.menu .dropdown.item > .menu { margin-top: 0; }
</style> </style>
</noscript> </noscript>
{{template "shared/user/mention_highlight" .}}
{{template "base/head_opengraph" .}} {{template "base/head_opengraph" .}}
{{template "base/head_style" .}} {{template "base/head_style" .}}
{{template "custom/header" .}} {{template "custom/header" .}}

View file

@ -0,0 +1,14 @@
{{if .IsSigned}}
<style>
.comment,
.commit-summary,
.commit-body {
.mention[href="{{AppSubUrl}}/{{.SignedUser.Name}}" i] {
background-color: var(--color-primary-alpha-30);
color: var(--color-primary-dark-2);
border-radius: 5px;
padding: 1px 4px;
}
}
</style>
{{end}}

View file

@ -5,7 +5,6 @@ package e2e
import ( import (
"fmt" "fmt"
"strconv"
"strings" "strings"
"testing" "testing"
"time" "time"
@ -23,14 +22,31 @@ import (
// first entry represents filename // first entry represents filename
// the following entries define the full file content over time // the following entries define the full file content over time
type FileChanges [][]string type FileChanges struct {
Filename string
CommitMsg string
Versions []string
}
// put your Git repo declarations in here // put your Git repo declarations in here
// feel free to amend the helper function below or use the raw variant directly // feel free to amend the helper function below or use the raw variant directly
func DeclareGitRepos(t *testing.T) func() { func DeclareGitRepos(t *testing.T) func() {
cleanupFunctions := []func(){ cleanupFunctions := []func(){
newRepo(t, 2, "diff-test", FileChanges{ newRepo(t, 2, "diff-test", []FileChanges{{
{"testfile", "hello", "hallo", "hola", "native", "ubuntu-latest", "- runs-on: ubuntu-latest", "- runs-on: debian-latest"}, Filename: "testfile",
Versions: []string{"hello", "hallo", "hola", "native", "ubuntu-latest", "- runs-on: ubuntu-latest", "- runs-on: debian-latest"},
}}),
newRepo(t, 2, "mentions-highlighted", []FileChanges{
{
Filename: "history1.md",
Versions: []string{""},
CommitMsg: "A commit message which mentions @user2 in the title\nand has some additional text which mentions @user1",
},
{
Filename: "history2.md",
Versions: []string{""},
CommitMsg: "Another commit which mentions @user1 in the title\nand @user2 in the text",
},
}), }),
// add your repo declarations here // add your repo declarations here
} }
@ -42,7 +58,7 @@ func DeclareGitRepos(t *testing.T) func() {
} }
} }
func newRepo(t *testing.T, userID int64, repoName string, fileChanges FileChanges) func() { func newRepo(t *testing.T, userID int64, repoName string, fileChanges []FileChanges) func() {
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: userID}) user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: userID})
somerepo, _, cleanupFunc := tests.CreateDeclarativeRepo(t, user, repoName, somerepo, _, cleanupFunc := tests.CreateDeclarativeRepo(t, user, repoName,
[]unit_model.Type{unit_model.TypeCode, unit_model.TypeIssues}, nil, []unit_model.Type{unit_model.TypeCode, unit_model.TypeIssues}, nil,
@ -50,19 +66,25 @@ func newRepo(t *testing.T, userID int64, repoName string, fileChanges FileChange
) )
for _, file := range fileChanges { for _, file := range fileChanges {
changeLen := len(file) for i, version := range file.Versions {
for i := 1; i < changeLen; i++ { operation := "update"
operation := "create" if i == 0 {
if i != 1 { operation = "create"
operation = "update"
} }
// default to unique commit messages
commitMsg := file.CommitMsg
if commitMsg == "" {
commitMsg = fmt.Sprintf("Patch: %s-%d", file.Filename, i+1)
}
resp, err := files_service.ChangeRepoFiles(git.DefaultContext, somerepo, user, &files_service.ChangeRepoFilesOptions{ resp, err := files_service.ChangeRepoFiles(git.DefaultContext, somerepo, user, &files_service.ChangeRepoFilesOptions{
Files: []*files_service.ChangeRepoFile{{ Files: []*files_service.ChangeRepoFile{{
Operation: operation, Operation: operation,
TreePath: file[0], TreePath: file.Filename,
ContentReader: strings.NewReader(file[i]), ContentReader: strings.NewReader(version),
}}, }},
Message: fmt.Sprintf("Patch: %s-%s", file[0], strconv.Itoa(i)), Message: commitMsg,
OldBranch: "main", OldBranch: "main",
NewBranch: "main", NewBranch: "main",
Author: &files_service.IdentityOptions{ Author: &files_service.IdentityOptions{

View file

@ -5,7 +5,12 @@
// @watch end // @watch end
import {expect} from '@playwright/test'; import {expect} from '@playwright/test';
import {test} from './utils_e2e.ts'; import {test, login_user, login} from './utils_e2e.ts';
import {accessibilityCheck} from './shared/accessibility.ts';
test.beforeAll(async ({browser}, workerInfo) => {
await login_user(browser, workerInfo, 'user2');
});
async function assertSelectedLines(page, nums) { async function assertSelectedLines(page, nums) {
const pageAssertions = async () => { const pageAssertions = async () => {
@ -75,3 +80,19 @@ test('Readable diff', async ({page}, workerInfo) => {
} }
} }
}); });
test('Username highlighted in commits', async ({browser}, workerInfo) => {
const page = await login({browser}, workerInfo);
await page.goto('/user2/mentions-highlighted/commits/branch/main');
// check first commit
await page.getByRole('link', {name: 'A commit message which'}).click();
await expect(page.getByRole('link', {name: '@user2'})).toHaveCSS('background-color', /(.*)/);
await expect(page.getByRole('link', {name: '@user1'})).toHaveCSS('background-color', 'rgba(0, 0, 0, 0)');
await accessibilityCheck({page}, ['.commit-header'], [], []);
// check second commit
await page.goto('/user2/mentions-highlighted/commits/branch/main');
await page.locator('tbody').getByRole('link', {name: 'Another commit which mentions'}).click();
await expect(page.getByRole('link', {name: '@user2'})).toHaveCSS('background-color', /(.*)/);
await expect(page.getByRole('link', {name: '@user1'})).toHaveCSS('background-color', 'rgba(0, 0, 0, 0)');
await accessibilityCheck({page}, ['.commit-header'], [], []);
});

View file

@ -0,0 +1,35 @@
import {expect, type Page} from '@playwright/test';
import {AxeBuilder} from '@axe-core/playwright';
export async function accessibilityCheck({page}: {page: Page}, includes: string[], excludes: string[], disabledRules: string[]) {
// contrast of inline links is still a global issue in Forgejo
disabledRules += 'link-in-text-block';
let accessibilityScanner = await new AxeBuilder({page})
.disableRules(disabledRules);
// passing the whole array seems to be not supported,
// iterating has the nice side-effectof skipping this if the array is empty
for (const incl of includes) {
// passing the whole array seems to be not supported
accessibilityScanner = accessibilityScanner.include(incl);
}
for (const excl of excludes) {
accessibilityScanner = accessibilityScanner.exclude(excl);
}
// scan the page both in dark and light theme
let accessibilityScanResults = await accessibilityScanner.analyze();
expect(accessibilityScanResults.violations).toEqual([]);
await page.emulateMedia({colorScheme: 'dark'});
// in https://codeberg.org/forgejo/forgejo/pulls/5899 there have been
// some weird failures related to contrast scanning,
// reporting for colours that haven't been used and no trace in the
// screenshots.
// Since this was only happening with some browsers and not always,
// my bet is on a transition effect on dark/light mode switch.
// Waiting a little seems to work around this.
await page.waitForTimeout(100); // eslint-disable-line playwright/no-wait-for-timeout
accessibilityScanResults = await accessibilityScanner.analyze();
expect(accessibilityScanResults.violations).toEqual([]);
await page.emulateMedia({colorScheme: 'light'});
}

View file

@ -1,17 +1,14 @@
import {expect, type Page} from '@playwright/test'; import {expect, type Page} from '@playwright/test';
import {AxeBuilder} from '@axe-core/playwright'; import {accessibilityCheck} from './accessibility.ts';
export async function validate_form({page}: {page: Page}, scope: 'form' | 'fieldset' = 'form') { export async function validate_form({page}: {page: Page}, scope: 'form' | 'fieldset' = 'form') {
const accessibilityScanResults = await new AxeBuilder({page}) const excludedElements = [
// disable checking for link style - should be fixed, but not now
.disableRules('link-in-text-block')
.include(scope)
// exclude automated tooltips from accessibility scan, remove when fixed // exclude automated tooltips from accessibility scan, remove when fixed
.exclude('span[data-tooltip-content') 'span[data-tooltip-content',
// exclude weird non-semantic HTML disabled content // exclude weird non-semantic HTML disabled content
.exclude('.disabled') '.disabled',
.analyze(); ];
expect(accessibilityScanResults.violations).toEqual([]); await accessibilityCheck({page}, [scope], excludedElements, []);
// assert CSS properties that needed to be overriden for forms (ensure they remain active) // assert CSS properties that needed to be overriden for forms (ensure they remain active)
const boxes = page.getByRole('checkbox').or(page.getByRole('radio')); const boxes = page.getByRole('checkbox').or(page.getByRole('radio'));

View file

@ -302,12 +302,11 @@ jobs:
}, },
} { } {
t.Run(testCase.onType, func(t *testing.T) { t.Run(testCase.onType, func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
defer func() { defer func() {
// cleanup leftovers, start from scratch // cleanup leftovers, start from scratch
_, err = db.DeleteByBean(db.DefaultContext, actions_model.ActionRun{RepoID: baseRepo.ID}) unittest.AssertSuccessfulDelete(t, &actions_model.ActionRun{RepoID: baseRepo.ID})
require.NoError(t, err) unittest.AssertSuccessfulDelete(t, &actions_model.ActionRunJob{RepoID: baseRepo.ID})
_, err = db.DeleteByBean(db.DefaultContext, actions_model.ActionRunJob{RepoID: baseRepo.ID})
require.NoError(t, err)
}() }()
// trigger the onType event // trigger the onType event

View file

@ -10,6 +10,7 @@ import (
"code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/models/unittest" "code.gitea.io/gitea/models/unittest"
user_model "code.gitea.io/gitea/models/user" user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/tests"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
@ -44,6 +45,7 @@ func Test_Cmd_AdminUser(t *testing.T) {
}, },
} { } {
t.Run(testCase.name, func(t *testing.T) { t.Run(testCase.name, func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
name := "testuser" name := "testuser"
options := []string{"user", "create", "--username", name, "--password", "password", "--email", name + "@example.com"} options := []string{"user", "create", "--username", name, "--password", "password", "--email", name + "@example.com"}

View file

@ -15,6 +15,7 @@ import (
repo_model "code.gitea.io/gitea/models/repo" repo_model "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/models/unittest" "code.gitea.io/gitea/models/unittest"
user_model "code.gitea.io/gitea/models/user" user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/tests"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
@ -67,6 +68,7 @@ func Test_CmdForgejo_Actions(t *testing.T) {
}, },
} { } {
t.Run(testCase.testName, func(t *testing.T) { t.Run(testCase.testName, func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
output, err := runMainApp("forgejo-cli", "actions", "register", "--secret", testCase.secret, "--scope", testCase.scope) output, err := runMainApp("forgejo-cli", "actions", "register", "--secret", testCase.secret, "--scope", testCase.scope)
assert.EqualValues(t, "", output) assert.EqualValues(t, "", output)

View file

@ -18,7 +18,6 @@ import (
"code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/ssh"
"code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/util"
"code.gitea.io/gitea/tests" "code.gitea.io/gitea/tests"
@ -33,8 +32,10 @@ func withKeyFile(t *testing.T, keyname string, callback func(string)) {
require.NoError(t, err) require.NoError(t, err)
keyFile := filepath.Join(tmpDir, keyname) keyFile := filepath.Join(tmpDir, keyname)
err = ssh.GenKeyPair(keyFile) pubkey, privkey, err := util.GenerateSSHKeypair()
require.NoError(t, err) require.NoError(t, err)
require.NoError(t, os.WriteFile(keyFile, privkey, 0o600))
require.NoError(t, os.WriteFile(keyFile+".pub", pubkey, 0o600))
err = os.WriteFile(path.Join(tmpDir, "ssh"), []byte("#!/bin/bash\n"+ err = os.WriteFile(path.Join(tmpDir, "ssh"), []byte("#!/bin/bash\n"+
"ssh -o \"UserKnownHostsFile=/dev/null\" -o \"StrictHostKeyChecking=no\" -o \"IdentitiesOnly=yes\" -i \""+keyFile+"\" \"$@\""), 0o700) "ssh -o \"UserKnownHostsFile=/dev/null\" -o \"StrictHostKeyChecking=no\" -o \"IdentitiesOnly=yes\" -i \""+keyFile+"\" \"$@\""), 0o700)

View file

@ -19,6 +19,7 @@ import (
repo_module "code.gitea.io/gitea/modules/repository" repo_module "code.gitea.io/gitea/modules/repository"
"code.gitea.io/gitea/modules/test" "code.gitea.io/gitea/modules/test"
repo_service "code.gitea.io/gitea/services/repository" repo_service "code.gitea.io/gitea/services/repository"
"code.gitea.io/gitea/tests"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
@ -40,7 +41,7 @@ func testGitPush(t *testing.T, u *url.URL) {
forEachObjectFormat(t, func(t *testing.T, objectFormat git.ObjectFormat) { forEachObjectFormat(t, func(t *testing.T, objectFormat git.ObjectFormat) {
t.Run("Push branches at once", func(t *testing.T) { t.Run("Push branches at once", func(t *testing.T) {
runTestGitPush(t, u, objectFormat, func(t *testing.T, gitPath string) (pushed, deleted []string) { runTestGitPush(t, u, objectFormat, func(t *testing.T, gitPath string) (pushed, deleted []string) {
for i := 0; i < 100; i++ { for i := 0; i < 10; i++ {
branchName := fmt.Sprintf("branch-%d", i) branchName := fmt.Sprintf("branch-%d", i)
pushed = append(pushed, branchName) pushed = append(pushed, branchName)
doGitCreateBranch(gitPath, branchName)(t) doGitCreateBranch(gitPath, branchName)(t)
@ -88,7 +89,7 @@ func testGitPush(t *testing.T, u *url.URL) {
t.Run("Push branches one by one", func(t *testing.T) { t.Run("Push branches one by one", func(t *testing.T) {
runTestGitPush(t, u, objectFormat, func(t *testing.T, gitPath string) (pushed, deleted []string) { runTestGitPush(t, u, objectFormat, func(t *testing.T, gitPath string) (pushed, deleted []string) {
for i := 0; i < 100; i++ { for i := 0; i < 10; i++ {
branchName := fmt.Sprintf("branch-%d", i) branchName := fmt.Sprintf("branch-%d", i)
doGitCreateBranch(gitPath, branchName)(t) doGitCreateBranch(gitPath, branchName)(t)
doGitPushTestRepository(gitPath, "origin", branchName)(t) doGitPushTestRepository(gitPath, "origin", branchName)(t)
@ -103,7 +104,7 @@ func testGitPush(t *testing.T, u *url.URL) {
doGitPushTestRepository(gitPath, "origin", "master")(t) // make sure master is the default branch instead of a branch we are going to delete doGitPushTestRepository(gitPath, "origin", "master")(t) // make sure master is the default branch instead of a branch we are going to delete
pushed = append(pushed, "master") pushed = append(pushed, "master")
for i := 0; i < 100; i++ { for i := 0; i < 10; i++ {
branchName := fmt.Sprintf("branch-%d", i) branchName := fmt.Sprintf("branch-%d", i)
pushed = append(pushed, branchName) pushed = append(pushed, branchName)
doGitCreateBranch(gitPath, branchName)(t) doGitCreateBranch(gitPath, branchName)(t)
@ -139,6 +140,7 @@ func testGitPush(t *testing.T, u *url.URL) {
} }
func runTestGitPush(t *testing.T, u *url.URL, objectFormat git.ObjectFormat, gitOperation func(t *testing.T, gitPath string) (pushed, deleted []string)) { func runTestGitPush(t *testing.T, u *url.URL, objectFormat git.ObjectFormat, gitOperation func(t *testing.T, gitPath string) (pushed, deleted []string)) {
defer tests.PrintCurrentTest(t, 1)()
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
repo, err := repo_service.CreateRepository(db.DefaultContext, user, user, repo_service.CreateRepoOptions{ repo, err := repo_service.CreateRepository(db.DefaultContext, user, user, repo_service.CreateRepoOptions{
Name: "repo-to-push", Name: "repo-to-push",

View file

@ -8,6 +8,7 @@ import (
"crypto/rand" "crypto/rand"
"encoding/hex" "encoding/hex"
"fmt" "fmt"
"io"
"net/http" "net/http"
"net/url" "net/url"
"os" "os"
@ -39,8 +40,8 @@ import (
) )
const ( const (
littleSize = 1024 // 1ko littleSize = 1024 // 1KiB
bigSize = 128 * 1024 * 1024 // 128Mo bigSize = 32 * 1024 * 1024 // 32MiB
) )
func TestGit(t *testing.T) { func TestGit(t *testing.T) {
@ -299,53 +300,26 @@ func lockFileTest(t *testing.T, filename, repoPath string) {
require.NoError(t, err) require.NoError(t, err)
} }
func doCommitAndPush(t *testing.T, size int, repoPath, prefix string) string { func doCommitAndPush(t *testing.T, size int64, repoPath, prefix string) string {
name, err := generateCommitWithNewData(size, repoPath, "user2@example.com", "User Two", prefix) name := generateCommitWithNewData(t, size, repoPath, "user2@example.com", "User Two", prefix)
require.NoError(t, err) _, _, err := git.NewCommand(git.DefaultContext, "push", "origin", "master").RunStdString(&git.RunOpts{Dir: repoPath}) // Push
_, _, err = git.NewCommand(git.DefaultContext, "push", "origin", "master").RunStdString(&git.RunOpts{Dir: repoPath}) // Push
require.NoError(t, err) require.NoError(t, err)
return name return name
} }
func generateCommitWithNewData(size int, repoPath, email, fullName, prefix string) (string, error) { func generateCommitWithNewData(t *testing.T, size int64, repoPath, email, fullName, prefix string) string {
// Generate random file t.Helper()
bufSize := 4 * 1024
if bufSize > size {
bufSize = size
}
buffer := make([]byte, bufSize)
tmpFile, err := os.CreateTemp(repoPath, prefix) tmpFile, err := os.CreateTemp(repoPath, prefix)
if err != nil { require.NoError(t, err)
return "", err
}
defer tmpFile.Close() defer tmpFile.Close()
written := 0 _, err = io.CopyN(tmpFile, rand.Reader, size)
for written < size { require.NoError(t, err)
n := size - written
if n > bufSize {
n = bufSize
}
_, err := rand.Read(buffer[:n])
if err != nil {
return "", err
}
n, err = tmpFile.Write(buffer[:n])
if err != nil {
return "", err
}
written += n
}
// Commit // Commit
// Now here we should explicitly allow lfs filters to run // Now here we should explicitly allow lfs filters to run
globalArgs := git.AllowLFSFiltersArgs() globalArgs := git.AllowLFSFiltersArgs()
err = git.AddChangesWithArgs(repoPath, globalArgs, false, filepath.Base(tmpFile.Name())) require.NoError(t, git.AddChangesWithArgs(repoPath, globalArgs, false, filepath.Base(tmpFile.Name())))
if err != nil { require.NoError(t, git.CommitChangesWithArgs(repoPath, globalArgs, git.CommitChangesOptions{
return "", err
}
err = git.CommitChangesWithArgs(repoPath, globalArgs, git.CommitChangesOptions{
Committer: &git.Signature{ Committer: &git.Signature{
Email: email, Email: email,
Name: fullName, Name: fullName,
@ -357,8 +331,8 @@ func generateCommitWithNewData(size int, repoPath, email, fullName, prefix strin
When: time.Now(), When: time.Now(),
}, },
Message: fmt.Sprintf("Testing commit @ %v", time.Now()), Message: fmt.Sprintf("Testing commit @ %v", time.Now()),
}) }))
return filepath.Base(tmpFile.Name()), err return filepath.Base(tmpFile.Name())
} }
func doBranchProtect(baseCtx *APITestContext, dstPath string) func(t *testing.T) { func doBranchProtect(baseCtx *APITestContext, dstPath string) func(t *testing.T) {
@ -370,6 +344,7 @@ func doBranchProtect(baseCtx *APITestContext, dstPath string) func(t *testing.T)
ctx := NewAPITestContext(t, baseCtx.Username, baseCtx.Reponame, auth_model.AccessTokenScopeWriteRepository) ctx := NewAPITestContext(t, baseCtx.Username, baseCtx.Reponame, auth_model.AccessTokenScopeWriteRepository)
t.Run("PushToNewProtectedBranch", func(t *testing.T) { t.Run("PushToNewProtectedBranch", func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
t.Run("CreateBranchProtected", doGitCreateBranch(dstPath, "before-create-1")) t.Run("CreateBranchProtected", doGitCreateBranch(dstPath, "before-create-1"))
t.Run("ProtectProtectedBranch", doProtectBranch(ctx, "before-create-1", parameterProtectBranch{ t.Run("ProtectProtectedBranch", doProtectBranch(ctx, "before-create-1", parameterProtectBranch{
"enable_push": "all", "enable_push": "all",
@ -378,8 +353,7 @@ func doBranchProtect(baseCtx *APITestContext, dstPath string) func(t *testing.T)
t.Run("PushProtectedBranch", doGitPushTestRepository(dstPath, "origin", "before-create-1")) t.Run("PushProtectedBranch", doGitPushTestRepository(dstPath, "origin", "before-create-1"))
t.Run("GenerateCommit", func(t *testing.T) { t.Run("GenerateCommit", func(t *testing.T) {
_, err := generateCommitWithNewData(littleSize, dstPath, "user2@example.com", "User Two", "protected-file-data-") generateCommitWithNewData(t, littleSize, dstPath, "user2@example.com", "User Two", "protected-file-data-")
require.NoError(t, err)
}) })
t.Run("ProtectProtectedBranch", doProtectBranch(ctx, "before-create-2", parameterProtectBranch{ t.Run("ProtectProtectedBranch", doProtectBranch(ctx, "before-create-2", parameterProtectBranch{
@ -392,11 +366,11 @@ func doBranchProtect(baseCtx *APITestContext, dstPath string) func(t *testing.T)
}) })
t.Run("FailToPushToProtectedBranch", func(t *testing.T) { t.Run("FailToPushToProtectedBranch", func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
t.Run("ProtectProtectedBranch", doProtectBranch(ctx, "protected")) t.Run("ProtectProtectedBranch", doProtectBranch(ctx, "protected"))
t.Run("Create modified-protected-branch", doGitCheckoutBranch(dstPath, "-b", "modified-protected-branch", "protected")) t.Run("Create modified-protected-branch", doGitCheckoutBranch(dstPath, "-b", "modified-protected-branch", "protected"))
t.Run("GenerateCommit", func(t *testing.T) { t.Run("GenerateCommit", func(t *testing.T) {
_, err := generateCommitWithNewData(littleSize, dstPath, "user2@example.com", "User Two", "branch-data-file-") generateCommitWithNewData(t, littleSize, dstPath, "user2@example.com", "User Two", "branch-data-file-")
require.NoError(t, err)
}) })
doGitPushTestRepositoryFail(dstPath, "origin", "modified-protected-branch:protected")(t) doGitPushTestRepositoryFail(dstPath, "origin", "modified-protected-branch:protected")(t)
@ -405,10 +379,10 @@ func doBranchProtect(baseCtx *APITestContext, dstPath string) func(t *testing.T)
t.Run("PushToUnprotectedBranch", doGitPushTestRepository(dstPath, "origin", "modified-protected-branch:unprotected")) t.Run("PushToUnprotectedBranch", doGitPushTestRepository(dstPath, "origin", "modified-protected-branch:unprotected"))
t.Run("FailToPushProtectedFilesToProtectedBranch", func(t *testing.T) { t.Run("FailToPushProtectedFilesToProtectedBranch", func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
t.Run("Create modified-protected-file-protected-branch", doGitCheckoutBranch(dstPath, "-b", "modified-protected-file-protected-branch", "protected")) t.Run("Create modified-protected-file-protected-branch", doGitCheckoutBranch(dstPath, "-b", "modified-protected-file-protected-branch", "protected"))
t.Run("GenerateCommit", func(t *testing.T) { t.Run("GenerateCommit", func(t *testing.T) {
_, err := generateCommitWithNewData(littleSize, dstPath, "user2@example.com", "User Two", "protected-file-") generateCommitWithNewData(t, littleSize, dstPath, "user2@example.com", "User Two", "protected-file-")
require.NoError(t, err)
}) })
t.Run("ProtectedFilePathsApplyToAdmins", doProtectBranch(ctx, "protected")) t.Run("ProtectedFilePathsApplyToAdmins", doProtectBranch(ctx, "protected"))
@ -419,13 +393,13 @@ func doBranchProtect(baseCtx *APITestContext, dstPath string) func(t *testing.T)
}) })
t.Run("PushUnprotectedFilesToProtectedBranch", func(t *testing.T) { t.Run("PushUnprotectedFilesToProtectedBranch", func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
t.Run("Create modified-unprotected-file-protected-branch", doGitCheckoutBranch(dstPath, "-b", "modified-unprotected-file-protected-branch", "protected")) t.Run("Create modified-unprotected-file-protected-branch", doGitCheckoutBranch(dstPath, "-b", "modified-unprotected-file-protected-branch", "protected"))
t.Run("UnprotectedFilePaths", doProtectBranch(ctx, "protected", parameterProtectBranch{ t.Run("UnprotectedFilePaths", doProtectBranch(ctx, "protected", parameterProtectBranch{
"unprotected_file_patterns": "unprotected-file-*", "unprotected_file_patterns": "unprotected-file-*",
})) }))
t.Run("GenerateCommit", func(t *testing.T) { t.Run("GenerateCommit", func(t *testing.T) {
_, err := generateCommitWithNewData(littleSize, dstPath, "user2@example.com", "User Two", "unprotected-file-") generateCommitWithNewData(t, littleSize, dstPath, "user2@example.com", "User Two", "unprotected-file-")
require.NoError(t, err)
}) })
doGitPushTestRepository(dstPath, "origin", "modified-unprotected-file-protected-branch:protected")(t) doGitPushTestRepository(dstPath, "origin", "modified-unprotected-file-protected-branch:protected")(t)
doGitCheckoutBranch(dstPath, "protected")(t) doGitCheckoutBranch(dstPath, "protected")(t)
@ -441,19 +415,19 @@ func doBranchProtect(baseCtx *APITestContext, dstPath string) func(t *testing.T)
})) }))
t.Run("WhitelistedUserFailToForcePushToProtectedBranch", func(t *testing.T) { t.Run("WhitelistedUserFailToForcePushToProtectedBranch", func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
t.Run("Create toforce", doGitCheckoutBranch(dstPath, "-b", "toforce", "master")) t.Run("Create toforce", doGitCheckoutBranch(dstPath, "-b", "toforce", "master"))
t.Run("GenerateCommit", func(t *testing.T) { t.Run("GenerateCommit", func(t *testing.T) {
_, err := generateCommitWithNewData(littleSize, dstPath, "user2@example.com", "User Two", "branch-data-file-") generateCommitWithNewData(t, littleSize, dstPath, "user2@example.com", "User Two", "branch-data-file-")
require.NoError(t, err)
}) })
doGitPushTestRepositoryFail(dstPath, "-f", "origin", "toforce:protected")(t) doGitPushTestRepositoryFail(dstPath, "-f", "origin", "toforce:protected")(t)
}) })
t.Run("WhitelistedUserPushToProtectedBranch", func(t *testing.T) { t.Run("WhitelistedUserPushToProtectedBranch", func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
t.Run("Create topush", doGitCheckoutBranch(dstPath, "-b", "topush", "protected")) t.Run("Create topush", doGitCheckoutBranch(dstPath, "-b", "topush", "protected"))
t.Run("GenerateCommit", func(t *testing.T) { t.Run("GenerateCommit", func(t *testing.T) {
_, err := generateCommitWithNewData(littleSize, dstPath, "user2@example.com", "User Two", "branch-data-file-") generateCommitWithNewData(t, littleSize, dstPath, "user2@example.com", "User Two", "branch-data-file-")
require.NoError(t, err)
}) })
doGitPushTestRepository(dstPath, "origin", "topush:protected")(t) doGitPushTestRepository(dstPath, "origin", "topush:protected")(t)
}) })
@ -693,8 +667,7 @@ func doAutoPRMerge(baseCtx *APITestContext, dstPath string) func(t *testing.T) {
t.Run("CheckoutProtected", doGitCheckoutBranch(dstPath, "protected")) t.Run("CheckoutProtected", doGitCheckoutBranch(dstPath, "protected"))
t.Run("PullProtected", doGitPull(dstPath, "origin", "protected")) t.Run("PullProtected", doGitPull(dstPath, "origin", "protected"))
t.Run("GenerateCommit", func(t *testing.T) { t.Run("GenerateCommit", func(t *testing.T) {
_, err := generateCommitWithNewData(littleSize, dstPath, "user2@example.com", "User Two", "branch-data-file-") generateCommitWithNewData(t, littleSize, dstPath, "user2@example.com", "User Two", "branch-data-file-")
require.NoError(t, err)
}) })
t.Run("PushToUnprotectedBranch", doGitPushTestRepository(dstPath, "origin", "protected:unprotected3")) t.Run("PushToUnprotectedBranch", doGitPushTestRepository(dstPath, "origin", "protected:unprotected3"))
var pr api.PullRequest var pr api.PullRequest

View file

@ -0,0 +1,21 @@
// Copyright 2024 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: GPL-3.0-or-later
package integration
import (
"net/http"
"testing"
"github.com/stretchr/testify/assert"
)
func TestHeadMentionCSS(t *testing.T) {
userSession := loginUser(t, "user2")
resp := userSession.MakeRequest(t, NewRequest(t, "GET", "/"), http.StatusOK)
assert.Contains(t, resp.Body.String(), `.mention[href="/user2" i]`)
guestSession := emptyTestSession(t)
resp = guestSession.MakeRequest(t, NewRequest(t, "GET", "/"), http.StatusOK)
assert.NotContains(t, resp.Body.String(), `.mention[href="`)
}

View file

@ -5,7 +5,6 @@
package integration package integration
import ( import (
"context"
"fmt" "fmt"
"net/http" "net/http"
"net/url" "net/url"
@ -21,9 +20,10 @@ import (
user_model "code.gitea.io/gitea/models/user" user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/modules/test"
"code.gitea.io/gitea/modules/translation" "code.gitea.io/gitea/modules/translation"
"code.gitea.io/gitea/services/migrations" "code.gitea.io/gitea/services/migrations"
"code.gitea.io/gitea/services/repository" "code.gitea.io/gitea/tests"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
@ -58,16 +58,8 @@ func TestMigrateLocalPath(t *testing.T) {
func TestMigrate(t *testing.T) { func TestMigrate(t *testing.T) {
onGiteaRun(t, func(t *testing.T, u *url.URL) { onGiteaRun(t, func(t *testing.T, u *url.URL) {
AllowLocalNetworks := setting.Migrations.AllowLocalNetworks defer test.MockVariableValue(&setting.Migrations.AllowLocalNetworks, true)()
setting.Migrations.AllowLocalNetworks = true defer test.MockVariableValue(&setting.AppVer, "1.16.0")()
AppVer := setting.AppVer
// Gitea SDK (go-sdk) need to parse the AppVer from server response, so we must set it to a valid version string.
setting.AppVer = "1.16.0"
defer func() {
setting.Migrations.AllowLocalNetworks = AllowLocalNetworks
setting.AppVer = AppVer
migrations.Init()
}()
require.NoError(t, migrations.Init()) require.NoError(t, migrations.Init())
ownerName := "user2" ownerName := "user2"
@ -82,42 +74,40 @@ func TestMigrate(t *testing.T) {
{svc: structs.GiteaService}, {svc: structs.GiteaService},
{svc: structs.ForgejoService}, {svc: structs.ForgejoService},
} { } {
// Step 0: verify the repo is available t.Run(s.svc.Name(), func(t *testing.T) {
req := NewRequestf(t, "GET", "/%s/%s", ownerName, repoName) defer tests.PrintCurrentTest(t)()
_ = session.MakeRequest(t, req, http.StatusOK) // Step 0: verify the repo is available
// Step 1: get the Gitea migration form req := NewRequestf(t, "GET", "/%s/%s", ownerName, repoName)
req = NewRequestf(t, "GET", "/repo/migrate/?service_type=%d", s.svc) _ = session.MakeRequest(t, req, http.StatusOK)
resp := session.MakeRequest(t, req, http.StatusOK) // Step 1: get the Gitea migration form
// Step 2: load the form req = NewRequestf(t, "GET", "/repo/migrate/?service_type=%d", s.svc)
htmlDoc := NewHTMLParser(t, resp.Body) resp := session.MakeRequest(t, req, http.StatusOK)
// Check form title // Step 2: load the form
title := htmlDoc.doc.Find("title").Text() htmlDoc := NewHTMLParser(t, resp.Body)
assert.Contains(t, title, translation.NewLocale("en-US").TrString("new_migrate.title")) // Check form title
// Get the link of migration button title := htmlDoc.doc.Find("title").Text()
link, exists := htmlDoc.doc.Find(`form.ui.form[action^="/repo/migrate"]`).Attr("action") assert.Contains(t, title, translation.NewLocale("en-US").TrString("new_migrate.title"))
assert.True(t, exists, "The template has changed") // Get the link of migration button
// Step 4: submit the migration to only migrate issues link, exists := htmlDoc.doc.Find(`form.ui.form[action^="/repo/migrate"]`).Attr("action")
migratedRepoName := "otherrepo" assert.True(t, exists, "The template has changed")
req = NewRequestWithValues(t, "POST", link, map[string]string{ // Step 4: submit the migration to only migrate issues
"_csrf": htmlDoc.GetCSRF(), migratedRepoName := "otherrepo-" + s.svc.Name()
"service": fmt.Sprintf("%d", s.svc), req = NewRequestWithValues(t, "POST", link, map[string]string{
"clone_addr": fmt.Sprintf("%s%s/%s", u, ownerName, repoName), "_csrf": htmlDoc.GetCSRF(),
"auth_token": token, "service": fmt.Sprintf("%d", s.svc),
"issues": "on", "clone_addr": fmt.Sprintf("%s%s/%s", u, ownerName, repoName),
"repo_name": migratedRepoName, "auth_token": token,
"description": "", "issues": "on",
"uid": fmt.Sprintf("%d", repoOwner.ID), "repo_name": migratedRepoName,
"description": "",
"uid": fmt.Sprintf("%d", repoOwner.ID),
})
resp = session.MakeRequest(t, req, http.StatusSeeOther)
// Step 5: a redirection displays the migrated repository
assert.EqualValues(t, fmt.Sprintf("/%s/%s", ownerName, migratedRepoName), test.RedirectURL(resp))
// Step 6: check the repo was created
unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{Name: migratedRepoName})
}) })
resp = session.MakeRequest(t, req, http.StatusSeeOther)
// Step 5: a redirection displays the migrated repository
loc := resp.Header().Get("Location")
assert.EqualValues(t, fmt.Sprintf("/%s/%s", ownerName, migratedRepoName), loc)
// Step 6: check the repo was created
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{Name: migratedRepoName})
// Step 7: delete the repository, so we can test with other services
err := repository.DeleteRepository(context.Background(), repoOwner, repo, false)
require.NoError(t, err)
} }
}) })
} }

View file

@ -822,6 +822,7 @@ func TestPullMergeBranchProtect(t *testing.T) {
} }
for _, withAPIOrWeb := range []string{"api", "web"} { for _, withAPIOrWeb := range []string{"api", "web"} {
t.Run(testCase.name+" "+withAPIOrWeb, func(t *testing.T) { t.Run(testCase.name+" "+withAPIOrWeb, func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
branch := testCase.name + "-" + withAPIOrWeb branch := testCase.name + "-" + withAPIOrWeb
unprotected := branch + "-unprotected" unprotected := branch + "-unprotected"
doGitCheckoutBranch(dstPath, "master")(t) doGitCheckoutBranch(dstPath, "master")(t)
@ -834,8 +835,7 @@ func TestPullMergeBranchProtect(t *testing.T) {
ctx = NewAPITestContext(t, testCase.doer, "not used", auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) ctx = NewAPITestContext(t, testCase.doer, "not used", auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser)
ctx.Username = owner ctx.Username = owner
ctx.Reponame = repo ctx.Reponame = repo
_, err := generateCommitWithNewData(littleSize, dstPath, "user2@example.com", "User Two", testCase.filename) generateCommitWithNewData(t, littleSize, dstPath, "user2@example.com", "User Two", testCase.filename)
require.NoError(t, err)
doGitPushTestRepository(dstPath, "origin", branch+":"+unprotected)(t) doGitPushTestRepository(dstPath, "origin", branch+":"+unprotected)(t)
pr, err := doAPICreatePullRequest(ctx, owner, repo, branch, unprotected)(t) pr, err := doAPICreatePullRequest(ctx, owner, repo, branch, unprotected)(t)
require.NoError(t, err) require.NoError(t, err)
@ -1015,6 +1015,7 @@ func TestPullAutoMergeAfterCommitStatusSucceed(t *testing.T) {
// perform all tests with API and web routes // perform all tests with API and web routes
for _, withAPI := range []bool{false, true} { for _, withAPI := range []bool{false, true} {
t.Run(testCase.name, func(t *testing.T) { t.Run(testCase.name, func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
protectedBranch := parameterProtectBranch{ protectedBranch := parameterProtectBranch{
"enable_push": "true", "enable_push": "true",
"enable_status_check": "true", "enable_status_check": "true",

View file

@ -316,6 +316,7 @@ func assertInput(t testing.TB, form *goquery.Selection, name string) string {
func testWebhookForms(name string, session *TestSession, validFields map[string]string, invalidPatches ...map[string]string) func(t *testing.T) { func testWebhookForms(name string, session *TestSession, validFields map[string]string, invalidPatches ...map[string]string) func(t *testing.T) {
return func(t *testing.T) { return func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
t.Run("repo1", func(t *testing.T) { t.Run("repo1", func(t *testing.T) {
testWebhookFormsShared(t, "/user2/repo1/settings/hooks", name, session, validFields, invalidPatches...) testWebhookFormsShared(t, "/user2/repo1/settings/hooks", name, session, validFields, invalidPatches...)
}) })

View file

@ -98,6 +98,7 @@ func (countTest *userCountTest) getCount(doc *goquery.Document, name string) (in
func (countTest *userCountTest) TestPage(t *testing.T, page string, orgLink bool) { func (countTest *userCountTest) TestPage(t *testing.T, page string, orgLink bool) {
t.Run(page, func(t *testing.T) { t.Run(page, func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
var userLink string var userLink string
if orgLink { if orgLink {

View file

@ -113,3 +113,6 @@ REPLY_TO_ADDRESS = incoming+%{token}@localhost
[actions] [actions]
ENABLED = true ENABLED = true
[ui.notification]
EVENT_SOURCE_UPDATE_TIME = 1s

View file

@ -127,3 +127,6 @@ ENABLED = true
[actions] [actions]
ENABLED = true ENABLED = true
[ui.notification]
EVENT_SOURCE_UPDATE_TIME = 1s

View file

@ -5,6 +5,7 @@ RUN_MODE = prod
[database] [database]
DB_TYPE = sqlite3 DB_TYPE = sqlite3
PATH = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-sqlite/gitea.db PATH = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-sqlite/gitea.db
SQLITE_JOURNAL_MODE = MEMORY
[indexer] [indexer]
REPO_INDEXER_ENABLED = true REPO_INDEXER_ENABLED = true
@ -113,3 +114,6 @@ RENDER_CONTENT_MODE=sanitized
[actions] [actions]
ENABLED = true ENABLED = true
[ui.notification]
EVENT_SOURCE_UPDATE_TIME = 1s

View file

@ -175,6 +175,9 @@ func InitTest(requireGitea bool) {
log.Fatal("db.Exec: CREATE SCHEMA: %v", err) log.Fatal("db.Exec: CREATE SCHEMA: %v", err)
} }
} }
case setting.Database.Type.IsSQLite3():
setting.Database.Path = ":memory:"
} }
routers.InitWebInstalled(graceful.GetManager().HammerContext()) routers.InitWebInstalled(graceful.GetManager().HammerContext())