diff --git a/.forgejo/workflows-composite/build-backend/action.yaml b/.forgejo/workflows-composite/build-backend/action.yaml index ada372b834..68a99ffaf9 100644 --- a/.forgejo/workflows-composite/build-backend/action.yaml +++ b/.forgejo/workflows-composite/build-backend/action.yaml @@ -3,7 +3,7 @@ runs: steps: - run: | su forgejo -c 'make deps-backend' - - uses: actions/cache@v4 + - uses: https://data.forgejo.org/actions/cache@v4 id: cache-backend with: path: ${{github.workspace}}/gitea diff --git a/.forgejo/workflows-composite/setup-cache-go/action.yaml b/.forgejo/workflows-composite/setup-cache-go/action.yaml index 67372d9f36..f2818a7635 100644 --- a/.forgejo/workflows-composite/setup-cache-go/action.yaml +++ b/.forgejo/workflows-composite/setup-cache-go/action.yaml @@ -27,8 +27,10 @@ runs: - name: "Get go environment information" id: go-environment run: | - echo "modcache=$(su ${RUN_AS_USER} -c '/opt/hostedtoolcache/go/${GO_VERSION}/x64/bin/go env GOMODCACHE')" >> "$GITHUB_OUTPUT" - echo "cache=$(su ${RUN_AS_USER} -c '/opt/hostedtoolcache/go/${GO_VERSION}/x64/bin/go env GOCACHE')" >> "$GITHUB_OUTPUT" + chmod 755 $HOME # ensure ${RUN_AS_USER} has permission when go is located in $HOME + export GOROOT="$(go env GOROOT)" + echo "modcache=$(su ${RUN_AS_USER} -c '${GOROOT}/bin/go env GOMODCACHE')" >> "$GITHUB_OUTPUT" + echo "cache=$(su ${RUN_AS_USER} -c '${GOROOT}/bin/go env GOCACHE')" >> "$GITHUB_OUTPUT" env: RUN_AS_USER: ${{ inputs.username }} GO_VERSION: ${{ steps.go-version.outputs.go-version }} @@ -48,7 +50,7 @@ runs: - name: "Restore Go dependencies from cache or mark for later caching" id: cache-deps - uses: actions/cache@v4 + uses: https://data.forgejo.org/actions/cache@v4 with: key: setup-cache-go-deps-${{ runner.os }}-${{ inputs.username }}-${{ steps.go-version.outputs.go_version }}-${{ hashFiles('go.sum', 'go.mod') }} restore-keys: | diff --git a/.forgejo/workflows-composite/setup-env/action.yaml b/.forgejo/workflows-composite/setup-env/action.yaml index 28216e9b8d..f19569a137 100644 --- a/.forgejo/workflows-composite/setup-env/action.yaml +++ b/.forgejo/workflows-composite/setup-env/action.yaml @@ -19,7 +19,7 @@ runs: set -ex toolchain=$(grep -oP '(?<=toolchain ).+' go.mod) version=$(go version | cut -d' ' -f3) - if [ "$toolchain" != "$version" ]; then - echo "go version mismatch: $toolchain <> $version" + if dpkg --compare-versions ${version#go} lt ${toolchain#go}; then + echo "go version too low: $toolchain >= $version" exit 1 fi diff --git a/.forgejo/workflows/build-release-integration.yml b/.forgejo/workflows/build-release-integration.yml index 6410915644..1af6d567dd 100644 --- a/.forgejo/workflows/build-release-integration.yml +++ b/.forgejo/workflows/build-release-integration.yml @@ -25,7 +25,7 @@ jobs: if: vars.ROLE == 'forgejo-coding' runs-on: lxc-bookworm steps: - - uses: actions/checkout@v4 + - uses: https://data.forgejo.org/actions/checkout@v4 - id: forgejo uses: https://data.forgejo.org/actions/setup-forgejo@v2.0.4 diff --git a/.forgejo/workflows/build-release.yml b/.forgejo/workflows/build-release.yml index 433b085969..1a98aebdf6 100644 --- a/.forgejo/workflows/build-release.yml +++ b/.forgejo/workflows/build-release.yml @@ -33,7 +33,7 @@ jobs: # root is used for testing, allow it if: vars.ROLE == 'forgejo-integration' || github.repository_owner == 'root' steps: - - uses: actions/checkout@v4 + - uses: https://data.forgejo.org/actions/checkout@v4 with: fetch-depth: 0 @@ -164,7 +164,7 @@ jobs: - name: build container & release if: ${{ secrets.TOKEN != '' }} - uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.2.1 + uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.3.4 with: forgejo: "${{ env.GITHUB_SERVER_URL }}" owner: "${{ env.GITHUB_REPOSITORY_OWNER }}" @@ -183,7 +183,7 @@ jobs: - name: build rootless container if: ${{ secrets.TOKEN != '' }} - uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.2.1 + uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.3.4 with: forgejo: "${{ env.GITHUB_SERVER_URL }}" owner: "${{ env.GITHUB_REPOSITORY_OWNER }}" diff --git a/.forgejo/workflows/cascade-setup-end-to-end.yml b/.forgejo/workflows/cascade-setup-end-to-end.yml index 710cd27ba4..bcc7821f4f 100644 --- a/.forgejo/workflows/cascade-setup-end-to-end.yml +++ b/.forgejo/workflows/cascade-setup-end-to-end.yml @@ -37,11 +37,11 @@ jobs: container: image: data.forgejo.org/oci/node:20-bookworm steps: - - uses: actions/checkout@v4 + - uses: https://data.forgejo.org/actions/checkout@v4 with: fetch-depth: '0' show-progress: 'false' - - uses: https://code.forgejo.org/actions/cascading-pr@v2.2.0 + - uses: https://data.forgejo.org/actions/cascading-pr@v2.2.0 with: origin-url: ${{ env.GITHUB_SERVER_URL }} origin-repo: ${{ github.repository }} diff --git a/.forgejo/workflows/publish-release.yml b/.forgejo/workflows/publish-release.yml index cbc8455a99..969e606553 100644 --- a/.forgejo/workflows/publish-release.yml +++ b/.forgejo/workflows/publish-release.yml @@ -39,10 +39,10 @@ jobs: runs-on: lxc-bookworm if: vars.DOER != '' && vars.FORGEJO != '' && vars.TO_OWNER != '' && vars.FROM_OWNER != '' && secrets.TOKEN != '' steps: - - uses: actions/checkout@v4 + - uses: https://data.forgejo.org/actions/checkout@v4 - name: copy & sign - uses: https://data.forgejo.org/forgejo/forgejo-build-publish/publish@v5.2.1 + uses: https://data.forgejo.org/forgejo/forgejo-build-publish/publish@v5.3.4 with: from-forgejo: ${{ vars.FORGEJO }} to-forgejo: ${{ vars.FORGEJO }} diff --git a/.forgejo/workflows/testing.yml b/.forgejo/workflows/testing.yml index eb3163d3ae..784bc45736 100644 --- a/.forgejo/workflows/testing.yml +++ b/.forgejo/workflows/testing.yml @@ -46,7 +46,7 @@ jobs: apt-get update -qq apt-get -q install -qq -y zstd - name: "Cache frontend build for playwright testing" - uses: actions/cache/save@v4 + uses: https://data.forgejo.org/actions/cache/save@v4 with: path: ${{github.workspace}}/public/assets key: frontend-build-${{ github.sha }} @@ -104,7 +104,7 @@ jobs: fetch-depth: 20 - uses: ./.forgejo/workflows-composite/setup-env - name: "Restore frontend build" - uses: actions/cache/restore@v4 + uses: https://data.forgejo.org/actions/cache/restore@v4 id: cache-frontend with: path: ${{github.workspace}}/public/assets diff --git a/.gitignore b/.gitignore index 744577248d..f040fdaf37 100644 --- a/.gitignore +++ b/.gitignore @@ -72,6 +72,7 @@ cpu.out /tests/e2e/reports /tests/e2e/test-artifacts /tests/e2e/test-snapshots +/tests/e2e/.auth /tests/*.ini /tests/**/*.git/**/*.sample /node_modules diff --git a/Dockerfile b/Dockerfile index ae21a0821e..af9269a6ce 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ -FROM --platform=$BUILDPLATFORM code.forgejo.org/oci/xx AS xx +FROM --platform=$BUILDPLATFORM data.forgejo.org/oci/xx AS xx -FROM --platform=$BUILDPLATFORM code.forgejo.org/oci/golang:1.23-alpine3.20 as build-env +FROM --platform=$BUILDPLATFORM data.forgejo.org/oci/golang:1.23-alpine3.20 as build-env ARG GOPROXY ENV GOPROXY=${GOPROXY:-direct} @@ -51,7 +51,7 @@ RUN chmod 755 /tmp/local/usr/bin/entrypoint \ /go/src/code.gitea.io/gitea/environment-to-ini RUN chmod 644 /go/src/code.gitea.io/gitea/contrib/autocompletion/bash_autocomplete -FROM code.forgejo.org/oci/alpine:3.20 +FROM data.forgejo.org/oci/alpine:3.20 ARG RELEASE_VERSION LABEL maintainer="contact@forgejo.org" \ org.opencontainers.image.authors="Forgejo" \ diff --git a/Dockerfile.rootless b/Dockerfile.rootless index c5d6a13f35..53c2976d45 100644 --- a/Dockerfile.rootless +++ b/Dockerfile.rootless @@ -1,6 +1,6 @@ -FROM --platform=$BUILDPLATFORM code.forgejo.org/oci/xx AS xx +FROM --platform=$BUILDPLATFORM data.forgejo.org/oci/xx AS xx -FROM --platform=$BUILDPLATFORM code.forgejo.org/oci/golang:1.23-alpine3.20 as build-env +FROM --platform=$BUILDPLATFORM data.forgejo.org/oci/golang:1.23-alpine3.20 as build-env ARG GOPROXY ENV GOPROXY=${GOPROXY:-direct} @@ -49,7 +49,8 @@ RUN chmod 755 /tmp/local/usr/local/bin/docker-entrypoint.sh \ /go/src/code.gitea.io/gitea/environment-to-ini RUN chmod 644 /go/src/code.gitea.io/gitea/contrib/autocompletion/bash_autocomplete -FROM code.forgejo.org/oci/alpine:3.20 +FROM data.forgejo.org/oci/alpine:3.20 +ARG RELEASE_VERSION LABEL maintainer="contact@forgejo.org" \ org.opencontainers.image.authors="Forgejo" \ org.opencontainers.image.url="https://forgejo.org" \ @@ -71,6 +72,7 @@ RUN apk --no-cache add \ git \ curl \ gnupg \ + openssh-client \ && rm -rf /var/cache/apk/* RUN addgroup \ diff --git a/assets/go-licenses.json b/assets/go-licenses.json index 1d19440d59..73ad852082 100644 --- a/assets/go-licenses.json +++ b/assets/go-licenses.json @@ -84,6 +84,11 @@ "path": "gitea.com/lunny/levelqueue/LICENSE", "licenseText": "Copyright (c) 2019 Lunny Xiao\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n" }, + { + "name": "github.com/42wim/httpsig", + "path": "github.com/42wim/httpsig/LICENSE", + "licenseText": "BSD 3-Clause License\n\nCopyright (c) 2018, go-fed\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\n* Neither the name of the copyright holder nor the names of its\n contributors may be used to endorse or promote products derived from\n this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" + }, { "name": "github.com/42wim/sshsig", "path": "github.com/42wim/sshsig/LICENSE", @@ -292,7 +297,7 @@ { "name": "github.com/cyphar/filepath-securejoin", "path": "github.com/cyphar/filepath-securejoin/LICENSE", - "licenseText": "Copyright (C) 2014-2015 Docker Inc \u0026 Go Authors. All rights reserved.\nCopyright (C) 2017 SUSE LLC. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" + "licenseText": "Copyright (C) 2014-2015 Docker Inc \u0026 Go Authors. All rights reserved.\nCopyright (C) 2017-2024 SUSE LLC. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" }, { "name": "github.com/davecgh/go-spew/spew", diff --git a/build/lint-locale.go b/build/lint-locale.go index c49e236938..0b5e501701 100644 --- a/build/lint-locale.go +++ b/build/lint-locale.go @@ -59,9 +59,9 @@ func initRemoveTags() { oldnew := []string{} for _, el := range []string{ "email@example.com", "correu@example.com", "epasts@domens.lv", "email@exemplo.com", "eposta@ornek.com", "email@példa.hu", "email@esempio.it", - "user", "utente", "lietotājs", "gebruiker", "usuário", "Benutzer", "Bruker", + "user", "utente", "lietotājs", "gebruiker", "usuário", "Benutzer", "Bruker", "bruger", "użytkownik", "server", "servidor", "kiszolgáló", "serveris", - "label", "etichetta", "etiķete", "rótulo", "Label", "utilizador", + "label", "etichetta", "etiķete", "rótulo", "Label", "utilizador", "etiket", "iezīme", "etykieta", } { oldnew = append(oldnew, "<"+el+">", "REPLACED-TAG") } diff --git a/go.mod b/go.mod index b054802289..cf6252f02e 100644 --- a/go.mod +++ b/go.mod @@ -1,11 +1,11 @@ module code.gitea.io/gitea -go 1.23 +go 1.23.0 -toolchain go1.23.4 +toolchain go1.23.6 require ( - code.forgejo.org/f3/gof3/v3 v3.7.0 + code.forgejo.org/f3/gof3/v3 v3.10.2 code.forgejo.org/forgejo-contrib/go-libravatar v0.0.0-20191008002943-06d1c002b251 code.forgejo.org/forgejo/reply v1.0.2 code.forgejo.org/go-chi/binding v1.0.0 @@ -19,10 +19,10 @@ require ( gitea.com/lunny/levelqueue v0.4.2-0.20230414023320-3c0159fe0fe4 github.com/42wim/sshsig v0.0.0-20211121163825-841cf5bbc121 github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 - github.com/ProtonMail/go-crypto v1.0.0 + github.com/ProtonMail/go-crypto v1.1.3 github.com/PuerkitoBio/goquery v1.10.0 github.com/SaveTheRbtz/zstd-seekable-format-go/pkg v0.7.2 - github.com/alecthomas/chroma/v2 v2.14.0 + github.com/alecthomas/chroma/v2 v2.15.0 github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb github.com/blevesearch/bleve/v2 v2.4.4 github.com/buildkite/terminal-to-html/v3 v3.16.4 @@ -44,7 +44,7 @@ require ( github.com/go-co-op/gocron v1.37.0 github.com/go-enry/go-enry/v2 v2.9.1 github.com/go-fed/httpsig v1.1.1-0.20201223112313-55836744818e - github.com/go-git/go-git/v5 v5.11.0 + github.com/go-git/go-git/v5 v5.13.1 github.com/go-ldap/ldap/v3 v3.4.6 github.com/go-openapi/spec v0.20.14 github.com/go-sql-driver/mysql v1.8.1 @@ -85,11 +85,11 @@ require ( github.com/opencontainers/image-spec v1.1.0 github.com/pquerna/otp v1.4.0 github.com/prometheus/client_golang v1.20.5 - github.com/redis/go-redis/v9 v9.7.0 + github.com/redis/go-redis/v9 v9.7.3 github.com/robfig/cron/v3 v3.0.1 github.com/santhosh-tekuri/jsonschema/v6 v6.0.1 github.com/sassoftware/go-rpmutils v0.4.0 - github.com/sergi/go-diff v1.3.1 + github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 github.com/shurcooL/vfsgen v0.0.0-20230704071429-0000e147ea92 github.com/stretchr/testify v1.10.0 github.com/syndtr/goleveldb v1.0.0 @@ -101,13 +101,13 @@ require ( github.com/yuin/goldmark v1.7.8 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc go.uber.org/mock v0.4.0 - golang.org/x/crypto v0.31.0 + golang.org/x/crypto v0.35.0 golang.org/x/image v0.23.0 golang.org/x/net v0.33.0 golang.org/x/oauth2 v0.23.0 - golang.org/x/sync v0.10.0 - golang.org/x/sys v0.28.0 - golang.org/x/text v0.21.0 + golang.org/x/sync v0.11.0 + golang.org/x/sys v0.30.0 + golang.org/x/text v0.22.0 google.golang.org/grpc v1.69.2 google.golang.org/protobuf v1.36.1 gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df @@ -131,6 +131,7 @@ require ( dario.cat/mergo v1.0.0 // indirect filippo.io/edwards25519 v1.1.0 // indirect git.sr.ht/~mariusor/go-xsd-duration v0.0.0-20220703122237-02e73435a078 // indirect + github.com/42wim/httpsig v1.2.2 // indirect github.com/DataDog/zstd v1.5.5 // indirect github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.2 // indirect @@ -168,11 +169,11 @@ require ( github.com/cloudflare/circl v1.3.8 // indirect github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect - github.com/cyphar/filepath-securejoin v0.2.4 // indirect + github.com/cyphar/filepath-securejoin v0.3.6 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/davidmz/go-pageant v1.0.2 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/dlclark/regexp2 v1.11.0 // indirect + github.com/dlclark/regexp2 v1.11.4 // indirect github.com/emersion/go-sasl v0.0.0-20231106173351-e73c9f7bad43 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/envoyproxy/go-control-plane v0.13.1 // indirect @@ -184,7 +185,7 @@ require ( github.com/go-asn1-ber/asn1-ber v1.5.5 // indirect github.com/go-enry/go-oniguruma v1.2.1 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect - github.com/go-git/go-billy/v5 v5.5.0 // indirect + github.com/go-git/go-billy/v5 v5.6.1 // indirect github.com/go-ini/ini v1.67.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect @@ -246,13 +247,14 @@ require ( github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c // indirect github.com/sirupsen/logrus v1.9.3 // indirect - github.com/skeema/knownhosts v1.2.1 // indirect + github.com/skeema/knownhosts v1.3.0 // indirect github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf // indirect github.com/x448/float16 v0.8.4 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect github.com/zeebo/blake3 v0.2.4 // indirect + gitlab.com/gitlab-org/api/client-go v0.116.0 // indirect go.etcd.io/bbolt v1.3.9 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/contrib/detectors/gcp v1.31.0 // indirect diff --git a/go.sum b/go.sum index 4629eba1df..cedec7d4e9 100644 --- a/go.sum +++ b/go.sum @@ -610,8 +610,8 @@ cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoIS cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= -code.forgejo.org/f3/gof3/v3 v3.7.0 h1:ZfuCP8CGm8ZJbWmL+V0pUu3E0X4FCAA7GfRDy/y5/K4= -code.forgejo.org/f3/gof3/v3 v3.7.0/go.mod h1:oNhOeqD4DZYjVcNjQXIOdDX9b/1tqxi9ITLS8H9/Csw= +code.forgejo.org/f3/gof3/v3 v3.10.2 h1:EOlv9d8GR7l0BmvZF101O3LUuabb4g5Hw5fKYPiPZlI= +code.forgejo.org/f3/gof3/v3 v3.10.2/go.mod h1:qApIHumpBkFkeBEokviO28+HK2WM11IsmMOhmjvCjFQ= code.forgejo.org/forgejo-contrib/go-libravatar v0.0.0-20191008002943-06d1c002b251 h1:HTZl3CBk3ABNYtFI6TPLvJgGKFIhKT5CBk0sbOtkDKU= code.forgejo.org/forgejo-contrib/go-libravatar v0.0.0-20191008002943-06d1c002b251/go.mod h1:PphB88CPbx601QrWPMZATeorACeVmQlyv3u+uUMbSaM= code.forgejo.org/forgejo/act v1.22.0 h1:NbUf0+vQ48+ddwe4zVkINqnxKYl/to+NUvW7iisPA60= @@ -651,6 +651,8 @@ gitea.com/lunny/levelqueue v0.4.2-0.20230414023320-3c0159fe0fe4 h1:IFT+hup2xejHq gitea.com/lunny/levelqueue v0.4.2-0.20230414023320-3c0159fe0fe4/go.mod h1:HBqmLbz56JWpfEGG0prskAV97ATNRoj5LDmPicD22hU= gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:lSA0F4e9A2NcQSqGqTOXqu2aRi/XEQxDCBwM8yJtE6s= gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:EXuID2Zs0pAQhH8yz+DNjUbjppKQzKFAn28TMYPB6IU= +github.com/42wim/httpsig v1.2.2 h1:ofAYoHUNs/MJOLqQ8hIxeyz2QxOz8qdSVvp3PX/oPgA= +github.com/42wim/httpsig v1.2.2/go.mod h1:P/UYo7ytNBFwc+dg35IubuAUIs8zj5zzFIgUCEl55WY= github.com/42wim/sshsig v0.0.0-20211121163825-841cf5bbc121 h1:r3qt8PCHnfjOv9PN3H+XXKmDA1dfFMIN1AislhlA/ps= github.com/42wim/sshsig v0.0.0-20211121163825-841cf5bbc121/go.mod h1:Ock8XgA7pvULhIaHGAk/cDnRfNrF9Jey81nPcc403iU= github.com/6543/go-version v1.3.1 h1:HvOp+Telns7HWJ2Xo/05YXQSB2bE0WmVgbHqwMPZT4U= @@ -674,8 +676,8 @@ github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78= -github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= +github.com/ProtonMail/go-crypto v1.1.3 h1:nRBOetoydLeUb4nHajyO2bKqMLfWQ/ZPwkXqXxPxCFk= +github.com/ProtonMail/go-crypto v1.1.3/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= github.com/PuerkitoBio/goquery v1.10.0 h1:6fiXdLuUvYs2OJSvNRqlNPoBm6YABE226xrbavY5Wv4= github.com/PuerkitoBio/goquery v1.10.0/go.mod h1:TjZZl68Q3eGHNBA8CWaxAN7rOU1EbDz3CWuolcO5Yu4= github.com/RoaringBitmap/roaring v1.9.3 h1:t4EbC5qQwnisr5PrP9nt0IRhRTb9gMUgQF4t4S2OByM= @@ -686,11 +688,11 @@ github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= -github.com/alecthomas/assert/v2 v2.7.0 h1:QtqSACNS3tF7oasA8CU6A6sXZSBDqnm7RfpLl9bZqbE= -github.com/alecthomas/assert/v2 v2.7.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k= +github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0= +github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k= github.com/alecthomas/chroma/v2 v2.2.0/go.mod h1:vf4zrexSH54oEjJ7EdB65tGNHmH3pGZmVkgTP5RHvAs= -github.com/alecthomas/chroma/v2 v2.14.0 h1:R3+wzpnUArGcQz7fCETQBzO5n9IMNi13iIs46aU4V9E= -github.com/alecthomas/chroma/v2 v2.14.0/go.mod h1:QolEbTfmUHIMVpBqxeDnNBj2uoeI4EbYP4i6n68SG4I= +github.com/alecthomas/chroma/v2 v2.15.0 h1:LxXTQHFoYrstG2nnV9y2X5O94sOBzf0CIUpSTbpxvMc= +github.com/alecthomas/chroma/v2 v2.15.0/go.mod h1:gUhVLrPDXPtp/f+L1jo9xepo9gL4eLwRuGAunSZMkio= github.com/alecthomas/repr v0.0.0-20220113201626-b1b626ac65ae/go.mod h1:2kn6fqh/zIyPLmm3ugklbEi5hg5wS435eygvNfaDQL8= github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc= github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= @@ -768,7 +770,6 @@ github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= github.com/buildkite/terminal-to-html/v3 v3.16.4 h1:QFYO8IGvRnp7tGgiQb8g9uFU8kY9wOzxsFFx17+yy6Q= github.com/buildkite/terminal-to-html/v3 v3.16.4/go.mod h1:r/J7cC9c3EzBzP3/wDz0RJLPwv5PUAMp+KF2w+ntMc0= -github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/caddyserver/certmagic v0.21.4 h1:e7VobB8rffHv8ZZpSiZtEwnLDHUwLVYLWzWSa1FfKI0= github.com/caddyserver/certmagic v0.21.4/go.mod h1:swUXjQ1T9ZtMv95qj7/InJvWLXURU85r+CfG0T+ZbDE= github.com/caddyserver/zerossl v0.1.3 h1:onS+pxp3M8HnHpN5MMbOMyNjmTheJyWRaZYwn+YTAyA= @@ -796,7 +797,6 @@ github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObk github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cloudflare/circl v1.3.8 h1:j+V8jJt09PoeMFIu2uh5JUyEaIHTXVOHslFoLNAKqwI= github.com/cloudflare/circl v1.3.8/go.mod h1:PDRU+oXvdD7KCtgKxW95M5Z8BpSCJXQORiZFnBQS5QU= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= @@ -817,8 +817,8 @@ github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1Ig github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc= github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= -github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/cyphar/filepath-securejoin v0.3.6 h1:4d9N5ykBnSp5Xn2JkhocYDkOpURL/18CYMpo6xB9uWM= +github.com/cyphar/filepath-securejoin v0.3.6/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -837,8 +837,8 @@ github.com/djherbis/nio/v3 v3.0.1/go.mod h1:Ng4h80pbZFMla1yKzm61cF0tqqilXZYrogmW github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= -github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI= -github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/dlclark/regexp2 v1.11.4 h1:rPYF9/LECdNymJufQKmri9gV604RvvABwgOA8un7yAo= +github.com/dlclark/regexp2 v1.11.4/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5/go.mod h1:qssHWj60/X5sZFNxpG4HBPDHVqxNm4DfnCKgrbZOT+s= github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707 h1:2tV76y6Q9BB+NEBasnqvs7e49aEBFI8ejC89PSnWH+4= @@ -849,8 +849,8 @@ github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkp github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/editorconfig/editorconfig-core-go/v2 v2.6.2 h1:dKG8sc7n321deIVRcQtwlMNoBEra7j0qQ8RwxO8RN0w= github.com/editorconfig/editorconfig-core-go/v2 v2.6.2/go.mod h1:7dvD3GCm7eBw53xZ/lsiq72LqobdMg3ITbMBxnmJmqY= -github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= -github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= +github.com/elazarl/goproxy v1.2.3 h1:xwIyKHbaP5yfT6O9KIeYJR5549MXRQkoQMRXGztz8YQ= +github.com/elazarl/goproxy v1.2.3/go.mod h1:YfEbZtqP4AetfO6d40vWchF3znWX7C7Vd6ZMfdL8z64= github.com/emersion/go-imap v1.2.1 h1:+s9ZjMEjOB8NzZMVTM3cCenz2JrQIGGo5j1df19WjTA= github.com/emersion/go-imap v1.2.1/go.mod h1:Qlx1FSx2FTxjnjWpIlVNEuX+ylerZQNFE5NsmKFSejY= github.com/emersion/go-message v0.15.0/go.mod h1:wQUEfE+38+7EW8p8aZ96ptg6bAb1iwdgej19uXASlE4= @@ -929,12 +929,12 @@ github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2H github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= -github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= -github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= +github.com/go-git/go-billy/v5 v5.6.1 h1:u+dcrgaguSSkbjzHwelEjc0Yj300NUevrrPphk/SoRA= +github.com/go-git/go-billy/v5 v5.6.1/go.mod h1:0AsLr1z2+Uksi4NlElmMblP5rPcDZNRCD8ujZCRR2BE= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= -github.com/go-git/go-git/v5 v5.11.0 h1:XIZc1p+8YzypNr34itUfSvYJcv+eYdTnTvOZ2vD3cA4= -github.com/go-git/go-git/v5 v5.11.0/go.mod h1:6GFcX2P3NM7FPBfpePbpLd21XxsgdAt+lKqXmCUiUCY= +github.com/go-git/go-git/v5 v5.13.1 h1:DAQ9APonnlvSWpvolXWIuV6Q6zXy2wHbN4cVlNR5Q+M= +github.com/go-git/go-git/v5 v5.13.1/go.mod h1:qryJB4cSBoq3FRoBRf5A77joojuBcmPJ0qu3XXXVixc= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -1300,8 +1300,8 @@ github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042 github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= -github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= +github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= @@ -1342,8 +1342,8 @@ github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= -github.com/redis/go-redis/v9 v9.7.0 h1:HhLSs+B6O021gwzl+locl0zEDnyNkxMtf/Z3NNBMa9E= -github.com/redis/go-redis/v9 v9.7.0/go.mod h1:f6zhXITC7JUJIlPEiBOTXxJgPLdZcA93GewI7inzyWw= +github.com/redis/go-redis/v9 v9.7.3 h1:YpPyAayJV+XErNsatSElgRZZVCwXX9QzkKYNvO7x0wM= +github.com/redis/go-redis/v9 v9.7.3/go.mod h1:bGUrSggJ9X9GUmZpZNEOQKaANxSGgOEBRltRTZHSvrA= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rhysd/actionlint v1.6.27 h1:xxwe8YmveBcC8lydW6GoHMGmB6H/MTqUU60F2p10wjw= @@ -1373,8 +1373,8 @@ github.com/sassoftware/go-rpmutils v0.4.0/go.mod h1:3goNWi7PGAT3/dlql2lv3+MSN5jN github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys= github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= github.com/serenize/snaker v0.0.0-20171204205717-a683aaf2d516/go.mod h1:Yow6lPLSAXx2ifx470yD/nUe22Dv5vBvxK/UK9UUTVs= -github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= -github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c h1:aqg5Vm5dwtvL+YgDpBcK1ITf3o96N/K7/wsRXQnUTEs= @@ -1382,8 +1382,8 @@ github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c/go.mod h1:owqhoLW1 github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/skeema/knownhosts v1.2.1 h1:SHWdIUa82uGZz+F+47k8SY4QhhI291cXCpopT1lK2AQ= -github.com/skeema/knownhosts v1.2.1/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= +github.com/skeema/knownhosts v1.3.0 h1:AM+y0rI04VksttfwjkSTNQorvGqmwATnvnAHpSgc0LY= +github.com/skeema/knownhosts v1.3.0/go.mod h1:sPINvnADmT/qYH1kfv+ePMmOBTH6Tbl7b5LvTDjFK7M= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= @@ -1449,6 +1449,8 @@ github.com/zeebo/blake3 v0.2.4/go.mod h1:7eeQ6d2iXWRGF6npfaxl2CU+xy2Fjo2gxeyZGCR github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo= github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +gitlab.com/gitlab-org/api/client-go v0.116.0 h1:Dy534gtZPMrnm3fAcmQRMadrcoUyFO4FQ4rXlSAdHAw= +gitlab.com/gitlab-org/api/client-go v0.116.0/go.mod h1:B29OfnZklmaoiR7uHANh9jTyfWEgmXvZLVEnosw2Dx0= go.etcd.io/bbolt v1.3.9 h1:8x7aARPEXiXbHmtUwAIv7eV2fQFHrLLavdiJ3uzJXoI= go.etcd.io/bbolt v1.3.9/go.mod h1:zaO32+Ti0PK1ivdPtgMESzuzL2VPoIG1PCQNvOdo/dE= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -1501,12 +1503,10 @@ golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= -golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= +golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs= +golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1522,6 +1522,8 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= +golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= +golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -1678,8 +1680,8 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= -golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1769,8 +1771,8 @@ golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= -golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= @@ -1782,8 +1784,8 @@ golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= -golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= -golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= +golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU= +golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1802,8 +1804,8 @@ golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= -golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= diff --git a/models/actions/runner.go b/models/actions/runner.go index a679d7d989..b24950d014 100644 --- a/models/actions/runner.go +++ b/models/actions/runner.go @@ -282,27 +282,22 @@ func UpdateRunner(ctx context.Context, r *ActionRunner, cols ...string) error { } // DeleteRunner deletes a runner by given ID. -func DeleteRunner(ctx context.Context, id int64) error { - runner, err := GetRunnerByID(ctx, id) - if err != nil { - return err - } - +func DeleteRunner(ctx context.Context, r *ActionRunner) error { // Replace the UUID, which was either based on the secret's first 16 bytes or an UUIDv4, // with a sequence of 8 0xff bytes followed by the little-endian version of the record's // identifier. This will prevent the deleted record's identifier from colliding with any // new record. b := make([]byte, 8) - binary.LittleEndian.PutUint64(b, uint64(id)) - runner.UUID = fmt.Sprintf("ffffffff-ffff-ffff-%.2x%.2x-%.2x%.2x%.2x%.2x%.2x%.2x", + binary.LittleEndian.PutUint64(b, uint64(r.ID)) + r.UUID = fmt.Sprintf("ffffffff-ffff-ffff-%.2x%.2x-%.2x%.2x%.2x%.2x%.2x%.2x", b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7]) - err = UpdateRunner(ctx, runner, "UUID") + err := UpdateRunner(ctx, r, "UUID") if err != nil { return err } - _, err = db.DeleteByID[ActionRunner](ctx, id) + _, err = db.DeleteByID[ActionRunner](ctx, r.ID) return err } diff --git a/models/actions/runner_test.go b/models/actions/runner_test.go index 26ef4c44c6..2c8d430f94 100644 --- a/models/actions/runner_test.go +++ b/models/actions/runner_test.go @@ -34,7 +34,7 @@ func TestDeleteRunner(t *testing.T) { require.NoError(t, unittest.PrepareTestDatabase()) before := unittest.AssertExistsAndLoadBean(t, &ActionRunner{ID: recordID}) - err := DeleteRunner(db.DefaultContext, recordID) + err := DeleteRunner(db.DefaultContext, &ActionRunner{ID: recordID}) require.NoError(t, err) var after ActionRunner diff --git a/models/actions/variable.go b/models/actions/variable.go index d0f917d923..39cea95c4b 100644 --- a/models/actions/variable.go +++ b/models/actions/variable.go @@ -86,7 +86,7 @@ func FindVariables(ctx context.Context, opts FindVariablesOpts) ([]*ActionVariab } func UpdateVariable(ctx context.Context, variable *ActionVariable) (bool, error) { - count, err := db.GetEngine(ctx).ID(variable.ID).Cols("name", "data"). + count, err := db.GetEngine(ctx).ID(variable.ID).Where("owner_id = ? AND repo_id = ?", variable.OwnerID, variable.RepoID).Cols("name", "data"). Update(&ActionVariable{ Name: variable.Name, Data: variable.Data, @@ -94,11 +94,9 @@ func UpdateVariable(ctx context.Context, variable *ActionVariable) (bool, error) return count != 0, err } -func DeleteVariable(ctx context.Context, id int64) error { - if _, err := db.DeleteByID[ActionVariable](ctx, id); err != nil { - return err - } - return nil +func DeleteVariable(ctx context.Context, variableID, ownerID, repoID int64) (bool, error) { + count, err := db.GetEngine(ctx).Table("action_variable").Where("id = ? AND owner_id = ? AND repo_id = ?", variableID, ownerID, repoID).Delete() + return count != 0, err } func GetVariablesOfRun(ctx context.Context, run *ActionRun) (map[string]string, error) { diff --git a/models/asymkey/ssh_key_parse.go b/models/asymkey/ssh_key_parse.go index 94b1cf112b..3cb51b2b22 100644 --- a/models/asymkey/ssh_key_parse.go +++ b/models/asymkey/ssh_key_parse.go @@ -219,8 +219,13 @@ func SSHNativeParsePublicKey(keyLine string) (string, int, error) { return "", 0, fmt.Errorf("ParsePublicKey: %w", err) } + pkeyType := pkey.Type() + if certPkey, ok := pkey.(*ssh.Certificate); ok { + pkeyType = certPkey.Key.Type() + } + // The ssh library can parse the key, so next we find out what key exactly we have. - switch pkey.Type() { + switch pkeyType { case ssh.KeyAlgoDSA: rawPub := struct { Name string diff --git a/models/asymkey/ssh_key_test.go b/models/asymkey/ssh_key_test.go index 2625d6ac91..9a4ef665af 100644 --- a/models/asymkey/ssh_key_test.go +++ b/models/asymkey/ssh_key_test.go @@ -35,6 +35,7 @@ func Test_SSHParsePublicKey(t *testing.T) { {"ecdsa-384", false, "ecdsa", 384, "ecdsa-sha2-nistp384 AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBINmioV+XRX1Fm9Qk2ehHXJ2tfVxW30ypUWZw670Zyq5GQfBAH6xjygRsJ5wWsHXBsGYgFUXIHvMKVAG1tpw7s6ax9oA+dJOJ7tj+vhn8joFqT+sg3LYHgZkHrfqryRasQ== nocomment"}, {"ecdsa-sk", true, "ecdsa-sk", 256, "sk-ecdsa-sha2-nistp256@openssh.com AAAAInNrLWVjZHNhLXNoYTItbmlzdHAyNTZAb3BlbnNzaC5jb20AAAAIbmlzdHAyNTYAAABBBGXEEzWmm1dxb+57RoK5KVCL0w2eNv9cqJX2AGGVlkFsVDhOXHzsadS3LTK4VlEbbrDMJdoti9yM8vclA8IeRacAAAAEc3NoOg== nocomment"}, {"ed25519-sk", true, "ed25519-sk", 256, "sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIE7kM1R02+4ertDKGKEDcKG0s+2vyDDcIvceJ0Gqv5f1AAAABHNzaDo= nocomment"}, + {"ed25519-cert-v01", true, "ed25519", 256, "ssh-ed25519-cert-v01@openssh.com AAAAIHNzaC1lZDI1NTE5LWNlcnQtdjAxQG9wZW5zc2guY29tAAAAIAlIAPlEj0mYQzQo8Ks0Nm/Ct8ceNkyJSf4DLuF5l7+5AAAAIEuWAoaBo2tT29/oMNnoDfdAPRCIdM2RGapKUhY4nDfLRgPQwfnRoc0AAAABAAAAcHZhdWx0LW9pZGMtNmRhYjdiZDgtNDg5YS00MDFkLTg3ZmItNjdjNTlhMDZkZDkxLTNjNTk2M2YyMGRmMDM3MDkyMzc1YmNiYmNiNzkxY2EyZWIxM2I0NGZhMzc2NTcwMWI0MjMwODU0MWFmNjhkNTgAAAALAAAAB2Zvcmdlam8AAAAAZ6/RUQAAAABn115vAAAAAAAAAAAAAAAAAAACFwAAAAdzc2gtcnNhAAAAAwEAAQAAAgEAySnM/TvD117GyKgOgMatDB2t+fCHORFaWVmH5SaadAzNJ2DfDAauRSLfnim1xdgAOMTzsPEEHH47zyYMjE85o2AiJxrfUBMw3O/7AbNc6+HyLr/txH4+vD9tWQknKnpVWM+3Z9wiHDcOdKRoXCmFZKJH1vxs16GNWjwbrfNiimv7Oi0fadgvTDKX603gpLTuVDXqs9eQFLCONptei86JYBAJqaHvg51k8YUCKt9WFqKAj7BJUWmrDvhv5VFMOsnZieJjqxkoxnpsQNlXfPzxK0vIpJofbYfWwscv/g9WZypHwO1ZR2PqzKm99YrSdr8w5256l0f44vsF0NSP0N7bDQEfYYnRGj8zWTYCBFD+uYF7AxIeaRUpZoTQO8MvCHOLMIDinNgEeCUvNA2v9zHl4BGq+PQjzUKAgJiKj0MZeiCDAmQ22g83ggQlB6BOrBb1fNa/S1cmTbGHQ2oAN358aqkmHVCBhPOyA2Rf65D2M2vzDlUdOsNDUIWAHk7GbwSNGDgcYfTWqtR5fTzp2MJovMh1dDUDXjOvojbhzjJtSy9+rzUYIv18aXdOitzVBgPMWdeVCZFZv4OKF+5MiqxQvedUvfiSjsdxZWLxyT1CJ88G3MzxNMS/Djm86T8h/Oa55bdvFtqpsLfvpIqq0pnXq1V/vF2j1MWwRB5z5Xh/HtEAAAIUAAAADHJzYS1zaGEyLTI1NgAAAgB2I2gzqemQl8/ETxtakALlm/2BpUcbhADcFWuoH6BCPnWHuTSwf3OayM6KXv1PQfL3YFRoi9Afrp8kVFL6DePsmKH+0BUEMz71sZ7v1ty7pwfzibItGnpTbQXhzbEiNYAFoz77rl7oaXF7pV6JNZhj3DVAB5gVA2oN5KRNVxijz+6uyuFJEw1HIl1C7GworvGwZcN7BThTEh3i72/Vntejy9Z8uGVjSFjS0rjRo2oXK1LKN0rVt66p3TmCWHouLkVnOTk0qrhLGlL2HVyo24OYHbkAAObD9b6aMDYlmluk6NsaiTKsSTsvMrbIbjtFQlh7nNyoPhZ0VMwaT1l10pDQ5uxWWZjKGIkz4xM1ZfpBszjJNPo+ivYQnTSjj9LwkbLAT9a/5LawSj80TGcLEMO+0eyPdJsP0wYmOVRFAZeRiBgwb3HrzcF6Wqr8icj1EjYkKSy9YFHGTnFBGknpdh3HGwghRXrCUwAnSM76db9pv4/qowT8LthtJ3dY5Epe0OJ1Tqm+q8bkGH4gB+7uqLSqM5pIHSKLp7lfHQBt1J6xa7H2saiweaWjU+QGTgQ2Lg+uUC5DXJrmm60CeFJ4BoGhUenDlgijbQpjH/l6330PbwefgjWtUK/pqaEA4lCoPyvJ+eF2DbYfPiAIBAFQnhVJJae4AH+XoCt29nb2j30ztg== nocomment"}, } for _, tc := range testCases { diff --git a/models/auth/webauthn.go b/models/auth/webauthn.go index aa13cf6cb1..b230e1665a 100644 --- a/models/auth/webauthn.go +++ b/models/auth/webauthn.go @@ -52,10 +52,10 @@ type WebAuthnCredential struct { AAGUID []byte SignCount uint32 `xorm:"BIGINT"` CloneWarning bool - BackupEligible bool `XORM:"NOT NULL DEFAULT false"` - BackupState bool `XORM:"NOT NULL DEFAULT false"` + BackupEligible bool `xorm:"NOT NULL DEFAULT false"` + BackupState bool `xorm:"NOT NULL DEFAULT false"` // If legacy is set to true, backup_eligible and backup_state isn't set. - Legacy bool `XORM:"NOT NULL DEFAULT true"` + Legacy bool `xorm:"NOT NULL DEFAULT true"` CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"` UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"` } diff --git a/models/fixtures/PrivateIssueProjects/project.yml b/models/fixtures/PrivateIssueProjects/project.yml new file mode 100644 index 0000000000..8950b33606 --- /dev/null +++ b/models/fixtures/PrivateIssueProjects/project.yml @@ -0,0 +1,23 @@ +- + id: 1001 + title: Org project that contains private and public issues + owner_id: 3 + repo_id: 0 + is_closed: false + creator_id: 2 + board_type: 1 + type: 3 + created_unix: 1738000000 + updated_unix: 1738000000 + +- + id: 1002 + title: User project that contains private and public issues + owner_id: 2 + repo_id: 0 + is_closed: false + creator_id: 2 + board_type: 1 + type: 1 + created_unix: 1738000000 + updated_unix: 1738000000 diff --git a/models/fixtures/PrivateIssueProjects/project_board.yml b/models/fixtures/PrivateIssueProjects/project_board.yml new file mode 100644 index 0000000000..3f1fe1e705 --- /dev/null +++ b/models/fixtures/PrivateIssueProjects/project_board.yml @@ -0,0 +1,17 @@ +- + id: 1001 + project_id: 1001 + title: Triage + creator_id: 2 + default: true + created_unix: 1738000000 + updated_unix: 1738000000 + +- + id: 1002 + project_id: 1002 + title: Triage + creator_id: 2 + default: true + created_unix: 1738000000 + updated_unix: 1738000000 diff --git a/models/fixtures/PrivateIssueProjects/project_issue.yml b/models/fixtures/PrivateIssueProjects/project_issue.yml new file mode 100644 index 0000000000..0245fb47f3 --- /dev/null +++ b/models/fixtures/PrivateIssueProjects/project_issue.yml @@ -0,0 +1,23 @@ +- + id: 1001 + issue_id: 6 + project_id: 1001 + project_board_id: 1001 + +- + id: 1002 + issue_id: 7 + project_id: 1002 + project_board_id: 1002 + +- + id: 1003 + issue_id: 16 + project_id: 1001 + project_board_id: 1001 + +- + id: 1004 + issue_id: 1 + project_id: 1002 + project_board_id: 1002 diff --git a/models/fixtures/TestPrivateRepoProjects/access.yml b/models/fixtures/TestPrivateRepoProjects/access.yml new file mode 100644 index 0000000000..4149e34b0b --- /dev/null +++ b/models/fixtures/TestPrivateRepoProjects/access.yml @@ -0,0 +1,5 @@ +- + id: 1001 + user_id: 29 + repo_id: 3 + mode: 1 diff --git a/models/fixtures/TestPrivateRepoProjects/project.yml b/models/fixtures/TestPrivateRepoProjects/project.yml new file mode 100644 index 0000000000..f66e4c8676 --- /dev/null +++ b/models/fixtures/TestPrivateRepoProjects/project.yml @@ -0,0 +1,11 @@ +- + id: 1001 + title: Org project that contains private issues + owner_id: 3 + repo_id: 0 + is_closed: false + creator_id: 2 + board_type: 1 + type: 3 + created_unix: 1738000000 + updated_unix: 1738000000 diff --git a/models/fixtures/TestPrivateRepoProjects/project_board.yml b/models/fixtures/TestPrivateRepoProjects/project_board.yml new file mode 100644 index 0000000000..9829cf7e27 --- /dev/null +++ b/models/fixtures/TestPrivateRepoProjects/project_board.yml @@ -0,0 +1,8 @@ +- + id: 1001 + project_id: 1001 + title: Triage + creator_id: 2 + default: true + created_unix: 1738000000 + updated_unix: 1738000000 diff --git a/models/fixtures/TestPrivateRepoProjects/project_issue.yml b/models/fixtures/TestPrivateRepoProjects/project_issue.yml new file mode 100644 index 0000000000..3e8c1dca9e --- /dev/null +++ b/models/fixtures/TestPrivateRepoProjects/project_issue.yml @@ -0,0 +1,11 @@ +- + id: 1001 + issue_id: 6 + project_id: 1001 + project_board_id: 1001 + +- + id: 1002 + issue_id: 15 + project_id: 1001 + project_board_id: 1001 diff --git a/models/fixtures/label.yml b/models/fixtures/label.yml index 2242b90dcd..acfac74968 100644 --- a/models/fixtures/label.yml +++ b/models/fixtures/label.yml @@ -96,3 +96,14 @@ num_issues: 0 num_closed_issues: 0 archived_unix: 0 + +- + id: 10 + repo_id: 3 + org_id: 0 + name: repo3label1 + color: '#112233' + exclusive: false + num_issues: 0 + num_closed_issues: 0 + archived_unix: 0 diff --git a/models/fixtures/pull_request.yml b/models/fixtures/pull_request.yml index 9a16316e5a..fbc0d504f8 100644 --- a/models/fixtures/pull_request.yml +++ b/models/fixtures/pull_request.yml @@ -64,6 +64,7 @@ base_branch: branch2 merge_base: 985f0301dba5e7b34be866819cd15ad3d8f508ee has_merged: false + allow_maintainer_edit: true - id: 6 diff --git a/models/fixtures/team_unit.yml b/models/fixtures/team_unit.yml index de0e8d738b..e8f8d0e422 100644 --- a/models/fixtures/team_unit.yml +++ b/models/fixtures/team_unit.yml @@ -1,42 +1,49 @@ - id: 1 team_id: 1 + org_id: 3 type: 1 access_mode: 4 - id: 2 team_id: 1 + org_id: 3 type: 2 access_mode: 4 - id: 3 team_id: 1 + org_id: 3 type: 3 access_mode: 4 - id: 4 team_id: 1 + org_id: 3 type: 4 access_mode: 4 - id: 5 team_id: 1 + org_id: 3 type: 5 access_mode: 4 - id: 6 team_id: 1 + org_id: 3 type: 6 access_mode: 4 - id: 7 team_id: 1 + org_id: 3 type: 7 access_mode: 4 diff --git a/models/forgejo_migrations/v25.go b/models/forgejo_migrations/v25.go index e2316007cf..5e3dff80b3 100644 --- a/models/forgejo_migrations/v25.go +++ b/models/forgejo_migrations/v25.go @@ -7,9 +7,11 @@ import ( "context" "crypto/md5" "encoding/base64" + "fmt" "code.gitea.io/gitea/models/auth" "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/secret" "code.gitea.io/gitea/modules/setting" @@ -57,19 +59,38 @@ func MigrateTwoFactorToKeying(x *xorm.Engine) error { oldEncryptionKey := md5.Sum([]byte(setting.SecretKey)) - return db.Iterate(context.Background(), nil, func(ctx context.Context, bean *auth.TwoFactor) error { + messages := make([]string, 0, 100) + ids := make([]int64, 0, 100) + + err = db.Iterate(context.Background(), nil, func(ctx context.Context, bean *auth.TwoFactor) error { decodedStoredSecret, err := base64.StdEncoding.DecodeString(string(bean.Secret)) if err != nil { - return err + messages = append(messages, fmt.Sprintf("two_factor.id=%d, two_factor.uid=%d: base64.StdEncoding.DecodeString: %v", bean.ID, bean.UID, err)) + ids = append(ids, bean.ID) + return nil } secretBytes, err := secret.AesDecrypt(oldEncryptionKey[:], decodedStoredSecret) if err != nil { - return err + messages = append(messages, fmt.Sprintf("two_factor.id=%d, two_factor.uid=%d: secret.AesDecrypt: %v", bean.ID, bean.UID, err)) + ids = append(ids, bean.ID) + return nil } bean.SetSecret(string(secretBytes)) _, err = db.GetEngine(ctx).Cols("secret").ID(bean.ID).Update(bean) return err }) + if err == nil { + if len(ids) > 0 { + log.Error("Forgejo migration[25]: The following TOTP secrets were found to be corrupted and removed from the database. TOTP is no longer required to login with the associated users. They should be informed because they will need to visit their security settings and configure TOTP again. No other action is required. See https://codeberg.org/forgejo/forgejo/issues/6637 for more context on the various causes for such a corruption.") + for _, message := range messages { + log.Error("Forgejo migration[25]: %s", message) + } + + _, err = db.GetEngine(context.Background()).In("id", ids).NoAutoCondition().NoAutoTime().Delete(&auth.TwoFactor{}) + } + } + + return err } diff --git a/models/forgejo_migrations/v25_test.go b/models/forgejo_migrations/v25_test.go index 43c5885c39..73b97f7a35 100644 --- a/models/forgejo_migrations/v25_test.go +++ b/models/forgejo_migrations/v25_test.go @@ -36,10 +36,14 @@ func Test_MigrateTwoFactorToKeying(t *testing.T) { cnt, err := x.Table("two_factor").Count() require.NoError(t, err) - assert.EqualValues(t, 1, cnt) + assert.EqualValues(t, 2, cnt) require.NoError(t, MigrateTwoFactorToKeying(x)) + cnt, err = x.Table("two_factor").Count() + require.NoError(t, err) + assert.EqualValues(t, 1, cnt) + var twofactor auth.TwoFactor _, err = x.Table("two_factor").ID(1).Get(&twofactor) require.NoError(t, err) diff --git a/models/issues/issue.go b/models/issues/issue.go index 17391ffe6c..fbbc4828a2 100644 --- a/models/issues/issue.go +++ b/models/issues/issue.go @@ -416,20 +416,6 @@ func (issue *Issue) SummaryCardURL() string { return fmt.Sprintf("%s/summary-card", issue.HTMLURL()) } -func (issue *Issue) SummaryCardSize() (int, int) { - return 1200, 600 -} - -func (issue *Issue) SummaryCardWidth() int { - width, _ := issue.SummaryCardSize() - return width -} - -func (issue *Issue) SummaryCardHeight() int { - _, height := issue.SummaryCardSize() - return height -} - // Link returns the issue's relative URL. func (issue *Issue) Link() string { var path string diff --git a/models/issues/issue_project.go b/models/issues/issue_project.go index 835ea1db52..697ef7fad6 100644 --- a/models/issues/issue_project.go +++ b/models/issues/issue_project.go @@ -7,8 +7,10 @@ import ( "context" "code.gitea.io/gitea/models/db" + org_model "code.gitea.io/gitea/models/organization" project_model "code.gitea.io/gitea/models/project" user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/optional" "code.gitea.io/gitea/modules/util" ) @@ -48,22 +50,28 @@ func (issue *Issue) ProjectColumnID(ctx context.Context) int64 { } // LoadIssuesFromColumn load issues assigned to this column -func LoadIssuesFromColumn(ctx context.Context, b *project_model.Column) (IssueList, error) { - issueList, err := Issues(ctx, &IssuesOptions{ +func LoadIssuesFromColumn(ctx context.Context, b *project_model.Column, doer *user_model.User, org *org_model.Organization, isClosed optional.Option[bool]) (IssueList, error) { + issueOpts := &IssuesOptions{ ProjectColumnID: b.ID, ProjectID: b.ProjectID, SortType: "project-column-sorting", - }) + IsClosed: isClosed, + AllPublic: true, + } + if doer != nil { + issueOpts.User = doer + issueOpts.Org = org + } + + issueList, err := Issues(ctx, issueOpts) if err != nil { return nil, err } if b.Default { - issues, err := Issues(ctx, &IssuesOptions{ - ProjectColumnID: db.NoConditionID, - ProjectID: b.ProjectID, - SortType: "project-column-sorting", - }) + issueOpts.ProjectColumnID = db.NoConditionID + + issues, err := Issues(ctx, issueOpts) if err != nil { return nil, err } @@ -78,10 +86,10 @@ func LoadIssuesFromColumn(ctx context.Context, b *project_model.Column) (IssueLi } // LoadIssuesFromColumnList load issues assigned to the columns -func LoadIssuesFromColumnList(ctx context.Context, bs project_model.ColumnList) (map[int64]IssueList, error) { +func LoadIssuesFromColumnList(ctx context.Context, bs project_model.ColumnList, doer *user_model.User, org *org_model.Organization, isClosed optional.Option[bool]) (map[int64]IssueList, error) { issuesMap := make(map[int64]IssueList, len(bs)) for i := range bs { - il, err := LoadIssuesFromColumn(ctx, bs[i]) + il, err := LoadIssuesFromColumn(ctx, bs[i], doer, org, isClosed) if err != nil { return nil, err } @@ -160,3 +168,36 @@ func IssueAssignOrRemoveProject(ctx context.Context, issue *Issue, doer *user_mo }) }) } + +// NumIssuesInProjects returns the amount of issues assigned to one of the project +// in the list which the doer can access. +func NumIssuesInProjects(ctx context.Context, pl []*project_model.Project, doer *user_model.User, org *org_model.Organization, isClosed optional.Option[bool]) (map[int64]int, error) { + numMap := make(map[int64]int, len(pl)) + for _, p := range pl { + num, err := NumIssuesInProject(ctx, p, doer, org, isClosed) + if err != nil { + return nil, err + } + numMap[p.ID] = num + } + + return numMap, nil +} + +// NumIssuesInProject returns the amount of issues assigned to the project which +// the doer can access. +func NumIssuesInProject(ctx context.Context, p *project_model.Project, doer *user_model.User, org *org_model.Organization, isClosed optional.Option[bool]) (int, error) { + numIssuesInProject := int(0) + bs, err := p.GetColumns(ctx) + if err != nil { + return 0, err + } + im, err := LoadIssuesFromColumnList(ctx, bs, doer, org, isClosed) + if err != nil { + return 0, err + } + for _, il := range im { + numIssuesInProject += len(il) + } + return numIssuesInProject, nil +} diff --git a/models/issues/issue_project_test.go b/models/issues/issue_project_test.go new file mode 100644 index 0000000000..d724922946 --- /dev/null +++ b/models/issues/issue_project_test.go @@ -0,0 +1,173 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package issues_test + +import ( + "testing" + + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/issues" + "code.gitea.io/gitea/models/organization" + "code.gitea.io/gitea/models/project" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/tests" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestPrivateIssueProjects(t *testing.T) { + defer tests.AddFixtures("models/fixtures/PrivateIssueProjects/")() + require.NoError(t, unittest.PrepareTestDatabase()) + + user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + t.Run("Organization project", func(t *testing.T) { + org := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 3}) + orgProject := unittest.AssertExistsAndLoadBean(t, &project.Project{ID: 1001, OwnerID: org.ID}) + column := unittest.AssertExistsAndLoadBean(t, &project.Column{ID: 1001, ProjectID: orgProject.ID}) + + t.Run("Authenticated user", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + issueList, err := issues.LoadIssuesFromColumn(db.DefaultContext, column, user2, org, optional.None[bool]()) + require.NoError(t, err) + assert.Len(t, issueList, 2) + assert.EqualValues(t, 16, issueList[0].ID) + assert.EqualValues(t, 6, issueList[1].ID) + + issuesNum, err := issues.NumIssuesInProject(db.DefaultContext, orgProject, user2, org, optional.None[bool]()) + require.NoError(t, err) + assert.EqualValues(t, 2, issuesNum) + + issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, orgProject, user2, org, optional.Some(true)) + require.NoError(t, err) + assert.EqualValues(t, 0, issuesNum) + + issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, orgProject, user2, org, optional.Some(false)) + require.NoError(t, err) + assert.EqualValues(t, 2, issuesNum) + }) + + t.Run("Anonymous user", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + issueList, err := issues.LoadIssuesFromColumn(db.DefaultContext, column, nil, org, optional.None[bool]()) + require.NoError(t, err) + assert.Len(t, issueList, 1) + assert.EqualValues(t, 16, issueList[0].ID) + + issuesNum, err := issues.NumIssuesInProject(db.DefaultContext, orgProject, nil, org, optional.None[bool]()) + require.NoError(t, err) + assert.EqualValues(t, 1, issuesNum) + + issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, orgProject, nil, org, optional.Some(true)) + require.NoError(t, err) + assert.EqualValues(t, 0, issuesNum) + + issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, orgProject, nil, org, optional.Some(false)) + require.NoError(t, err) + assert.EqualValues(t, 1, issuesNum) + }) + }) + + t.Run("User project", func(t *testing.T) { + userProject := unittest.AssertExistsAndLoadBean(t, &project.Project{ID: 1002, OwnerID: user2.ID}) + column := unittest.AssertExistsAndLoadBean(t, &project.Column{ID: 1002, ProjectID: userProject.ID}) + + t.Run("Authenticated user", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + issueList, err := issues.LoadIssuesFromColumn(db.DefaultContext, column, user2, nil, optional.None[bool]()) + require.NoError(t, err) + assert.Len(t, issueList, 2) + assert.EqualValues(t, 7, issueList[0].ID) + assert.EqualValues(t, 1, issueList[1].ID) + + issuesNum, err := issues.NumIssuesInProject(db.DefaultContext, userProject, user2, nil, optional.None[bool]()) + require.NoError(t, err) + assert.EqualValues(t, 2, issuesNum) + + issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, userProject, user2, nil, optional.Some(true)) + require.NoError(t, err) + assert.EqualValues(t, 0, issuesNum) + + issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, userProject, user2, nil, optional.Some(false)) + require.NoError(t, err) + assert.EqualValues(t, 2, issuesNum) + }) + + t.Run("Anonymous user", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + issueList, err := issues.LoadIssuesFromColumn(db.DefaultContext, column, nil, nil, optional.None[bool]()) + require.NoError(t, err) + assert.Len(t, issueList, 1) + assert.EqualValues(t, 1, issueList[0].ID) + + issuesNum, err := issues.NumIssuesInProject(db.DefaultContext, userProject, nil, nil, optional.None[bool]()) + require.NoError(t, err) + assert.EqualValues(t, 1, issuesNum) + + issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, userProject, nil, nil, optional.Some(true)) + require.NoError(t, err) + assert.EqualValues(t, 0, issuesNum) + + issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, userProject, nil, nil, optional.Some(false)) + require.NoError(t, err) + assert.EqualValues(t, 1, issuesNum) + }) + }) +} + +func TestPrivateRepoProjects(t *testing.T) { + defer tests.AddFixtures("models/fixtures/TestPrivateRepoProjects/")() + require.NoError(t, unittest.PrepareTestDatabase()) + + org := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 3}) + orgProject := unittest.AssertExistsAndLoadBean(t, &project.Project{ID: 1001, OwnerID: org.ID}) + column := unittest.AssertExistsAndLoadBean(t, &project.Column{ID: 1001, ProjectID: orgProject.ID}) + + t.Run("Partial access", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + user29 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 29}) + + issueList, err := issues.LoadIssuesFromColumn(db.DefaultContext, column, user29, org, optional.None[bool]()) + require.NoError(t, err) + assert.Len(t, issueList, 1) + assert.EqualValues(t, 6, issueList[0].ID) + + issuesNum, err := issues.NumIssuesInProject(db.DefaultContext, orgProject, user29, org, optional.None[bool]()) + require.NoError(t, err) + assert.EqualValues(t, 1, issuesNum) + + issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, orgProject, user29, org, optional.Some(true)) + require.NoError(t, err) + assert.EqualValues(t, 0, issuesNum) + + issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, orgProject, user29, org, optional.Some(false)) + require.NoError(t, err) + assert.EqualValues(t, 1, issuesNum) + }) + + t.Run("Full access", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + + issueList, err := issues.LoadIssuesFromColumn(db.DefaultContext, column, user2, org, optional.None[bool]()) + require.NoError(t, err) + assert.Len(t, issueList, 2) + assert.EqualValues(t, 15, issueList[0].ID) + assert.EqualValues(t, 6, issueList[1].ID) + + issuesNum, err := issues.NumIssuesInProject(db.DefaultContext, orgProject, user2, org, optional.None[bool]()) + require.NoError(t, err) + assert.EqualValues(t, 2, issuesNum) + + issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, orgProject, user2, org, optional.Some(true)) + require.NoError(t, err) + assert.EqualValues(t, 0, issuesNum) + + issuesNum, err = issues.NumIssuesInProject(db.DefaultContext, orgProject, user2, org, optional.Some(false)) + require.NoError(t, err) + assert.EqualValues(t, 2, issuesNum) + }) +} diff --git a/models/issues/issue_search.go b/models/issues/issue_search.go index e9f116bfc6..6592f3708c 100644 --- a/models/issues/issue_search.go +++ b/models/issues/issue_search.go @@ -49,9 +49,13 @@ type IssuesOptions struct { //nolint // prioritize issues from this repo PriorityRepoID int64 IsArchived optional.Option[bool] - Org *organization.Organization // issues permission scope - Team *organization.Team // issues permission scope - User *user_model.User // issues permission scope + + // If combined with AllPublic, then private as well as public issues + // that matches the criteria will be returned, if AllPublic is false + // only the private issues will be returned. + Org *organization.Organization // issues permission scope + Team *organization.Team // issues permission scope + User *user_model.User // issues permission scope } // applySorts sort an issues-related session based on the provided @@ -196,7 +200,8 @@ func applyRepoConditions(sess *xorm.Session, opts *IssuesOptions) { } else if len(opts.RepoIDs) > 1 { opts.RepoCond = builder.In("issue.repo_id", opts.RepoIDs) } - if opts.AllPublic { + // If permission scoping is set, then we set this condition at a later stage. + if opts.AllPublic && opts.User == nil { if opts.RepoCond == nil { opts.RepoCond = builder.NewCond() } @@ -268,7 +273,14 @@ func applyConditions(sess *xorm.Session, opts *IssuesOptions) { applyLabelsCondition(sess, opts) if opts.User != nil { - sess.And(issuePullAccessibleRepoCond("issue.repo_id", opts.User.ID, opts.Org, opts.Team, opts.IsPull.Value())) + cond := issuePullAccessibleRepoCond("issue.repo_id", opts.User.ID, opts.Org, opts.Team, opts.IsPull.Value()) + // If AllPublic was set, then also consider all issues in public + // repositories in addition to the private repositories the user has access + // to. + if opts.AllPublic { + cond = cond.Or(builder.In("issue.repo_id", builder.Select("id").From("repository").Where(builder.Eq{"is_private": false}))) + } + sess.And(cond) } } @@ -329,6 +341,9 @@ func issuePullAccessibleRepoCond(repoIDstr string, userID int64, org *organizati builder.Or( repo_model.UserOrgUnitRepoCond(repoIDstr, userID, org.ID, unitType), // team member repos repo_model.UserOrgPublicUnitRepoCond(userID, org.ID), // user org public non-member repos, TODO: check repo has issues + builder.And( + builder.In("issue.repo_id", builder.Select("id").From("repository").Where(builder.Eq{"owner_id": org.ID})), + repo_model.UserAccessRepoCond(repoIDstr, userID)), // user can access org repo in a unit independent way ), ) } diff --git a/models/issues/label.go b/models/issues/label.go index 804a118e7a..259c87459e 100644 --- a/models/issues/label.go +++ b/models/issues/label.go @@ -353,6 +353,17 @@ func GetLabelIDsInRepoByNames(ctx context.Context, repoID int64, labelNames []st Find(&labelIDs) } +// GetLabelIDsInOrgByNames returns a list of labelIDs by names in a given org. +func GetLabelIDsInOrgByNames(ctx context.Context, orgID int64, labelNames []string) ([]int64, error) { + labelIDs := make([]int64, 0, len(labelNames)) + return labelIDs, db.GetEngine(ctx).Table("label"). + Where("org_id = ?", orgID). + In("name", labelNames). + Asc("name"). + Cols("id"). + Find(&labelIDs) +} + // BuildLabelNamesIssueIDsCondition returns a builder where get issue ids match label names func BuildLabelNamesIssueIDsCondition(labelNames []string) *builder.Builder { return builder.Select("issue_label.issue_id"). diff --git a/models/migrations/fixtures/Test_MigrateTwoFactorToKeying/two_factor.yml b/models/migrations/fixtures/Test_MigrateTwoFactorToKeying/two_factor.yml index ef6c158659..91aa420340 100644 --- a/models/migrations/fixtures/Test_MigrateTwoFactorToKeying/two_factor.yml +++ b/models/migrations/fixtures/Test_MigrateTwoFactorToKeying/two_factor.yml @@ -7,3 +7,12 @@ last_used_passcode: created_unix: 1564253724 updated_unix: 1564253724 +- + id: 2 + uid: 23 + secret: badbad + scratch_salt: badbad + scratch_hash: badbad + last_used_passcode: + created_unix: 1564253724 + updated_unix: 1564253724 diff --git a/models/migrations/v1_23/v303.go b/models/migrations/v1_23/v303.go index c1e74c596a..2fb37ac843 100644 --- a/models/migrations/v1_23/v303.go +++ b/models/migrations/v1_23/v303.go @@ -1,5 +1,5 @@ -// Copyright 2024 The Forgejo Authors. -// SPDX-License-Identifier: MIT +// Copyright 2025 The Forgejo Authors. +// SPDX-License-Identifier: GPL-3.0-or-later package v1_23 //nolint @@ -7,26 +7,53 @@ import ( "code.gitea.io/gitea/models/migrations/base" "xorm.io/xorm" + "xorm.io/xorm/schemas" ) func GiteaLastDrop(x *xorm.Engine) error { + tables, err := x.DBMetas() + if err != nil { + return err + } + sess := x.NewSession() defer sess.Close() - if err := base.DropTableColumns(sess, "badge", "slug"); err != nil { - return err - } - if err := base.DropTableColumns(sess, "oauth2_application", "skip_secondary_authorization"); err != nil { - return err - } - if err := base.DropTableColumns(sess, "repository", "default_wiki_branch"); err != nil { - return err - } - // the migration v297.go that adds everyone_access_mode exists in Gitea >= v1.22 and the column must be dropped - // but it does not exist in Forgejo and a failure to drop the column can be ignored - base.DropTableColumns(sess, "repo_unit", "everyone_access_mode") - if err := base.DropTableColumns(sess, "protected_branch", "can_force_push", "enable_force_push_allowlist", "force_push_allowlist_user_i_ds", "force_push_allowlist_team_i_ds", "force_push_allowlist_deploy_keys"); err != nil { - return err + for _, drop := range []struct { + table string + column string + }{ + {"badge", "slug"}, + {"oauth2_application", "skip_secondary_authorization"}, + {"repository", "default_wiki_branch"}, + {"repo_unit", "everyone_access_mode"}, + {"protected_branch", "can_force_push"}, + {"protected_branch", "enable_force_push_allowlist"}, + {"protected_branch", "force_push_allowlist_user_i_ds"}, + {"protected_branch", "force_push_allowlist_team_i_ds"}, + {"protected_branch", "force_push_allowlist_deploy_keys"}, + } { + var table *schemas.Table + found := false + + for _, table = range tables { + if table.Name == drop.table { + found = true + break + } + } + + if !found { + continue + } + + if table.GetColumn(drop.column) == nil { + continue + } + + if err := base.DropTableColumns(sess, drop.table, drop.column); err != nil { + return err + } } return sess.Commit() diff --git a/models/migrations/v1_23/v303_test.go b/models/migrations/v1_23/v303_test.go new file mode 100644 index 0000000000..752eacee0c --- /dev/null +++ b/models/migrations/v1_23/v303_test.go @@ -0,0 +1,41 @@ +// Copyright 2025 The Forgejo Authors. +// SPDX-License-Identifier: GPL-3.0-or-later + +package v1_23 //nolint + +import ( + "testing" + + migration_tests "code.gitea.io/gitea/models/migrations/test" + + "github.com/stretchr/testify/require" + "xorm.io/xorm/schemas" +) + +func Test_GiteaLastDrop(t *testing.T) { + type Badge struct { + ID int64 `xorm:"pk autoincr"` + Slug string + } + + x, deferable := migration_tests.PrepareTestEnv(t, 0, new(Badge)) + defer deferable() + if x == nil || t.Failed() { + return + } + + getColumn := func() *schemas.Column { + tables, err := x.DBMetas() + require.NoError(t, err) + require.Len(t, tables, 1) + table := tables[0] + require.Equal(t, "badge", table.Name) + return table.GetColumn("slug") + } + + require.NotNil(t, getColumn(), "slug column exists") + require.NoError(t, GiteaLastDrop(x)) + require.Nil(t, getColumn(), "slug column was deleted") + // idempotent + require.NoError(t, GiteaLastDrop(x)) +} diff --git a/models/project/column.go b/models/project/column.go index 222f448599..f6d6614004 100644 --- a/models/project/column.go +++ b/models/project/column.go @@ -57,20 +57,6 @@ func (Column) TableName() string { return "project_board" // TODO: the legacy table name should be project_column } -// NumIssues return counter of all issues assigned to the column -func (c *Column) NumIssues(ctx context.Context) int { - total, err := db.GetEngine(ctx).Table("project_issue"). - Where("project_id=?", c.ProjectID). - And("project_board_id=?", c.ID). - GroupBy("issue_id"). - Cols("issue_id"). - Count() - if err != nil { - return 0 - } - return int(total) -} - func (c *Column) GetIssues(ctx context.Context) ([]*ProjectIssue, error) { issues := make([]*ProjectIssue, 0, 5) if err := db.GetEngine(ctx).Where("project_id=?", c.ProjectID). diff --git a/models/project/issue.go b/models/project/issue.go index 3361b533b9..984f47ee7c 100644 --- a/models/project/issue.go +++ b/models/project/issue.go @@ -34,20 +34,6 @@ func deleteProjectIssuesByProjectID(ctx context.Context, projectID int64) error return err } -// NumIssues return counter of all issues assigned to a project -func (p *Project) NumIssues(ctx context.Context) int { - c, err := db.GetEngine(ctx).Table("project_issue"). - Where("project_id=?", p.ID). - GroupBy("issue_id"). - Cols("issue_id"). - Count() - if err != nil { - log.Error("NumIssues: %v", err) - return 0 - } - return int(c) -} - // NumClosedIssues return counter of closed issues assigned to a project func (p *Project) NumClosedIssues(ctx context.Context) int { c, err := db.GetEngine(ctx).Table("project_issue"). diff --git a/models/repo/release.go b/models/repo/release.go index 38e38c6572..eb18f8aa02 100644 --- a/models/repo/release.go +++ b/models/repo/release.go @@ -97,13 +97,11 @@ func init() { // LoadAttributes load repo and publisher attributes for a release func (r *Release) LoadAttributes(ctx context.Context) error { - var err error - if r.Repo == nil { - r.Repo, err = GetRepositoryByID(ctx, r.RepoID) - if err != nil { - return err - } + err := r.LoadRepo(ctx) + if err != nil { + return err } + if r.Publisher == nil { r.Publisher, err = user_model.GetUserByID(ctx, r.PublisherID) if err != nil { @@ -123,6 +121,18 @@ func (r *Release) LoadAttributes(ctx context.Context) error { return GetReleaseAttachments(ctx, r) } +// LoadRepo load repo attribute for release +func (r *Release) LoadRepo(ctx context.Context) error { + if r.Repo != nil { + return nil + } + + var err error + r.Repo, err = GetRepositoryByID(ctx, r.RepoID) + + return err +} + // LoadArchiveDownloadCount loads the download count for the source archives func (r *Release) LoadArchiveDownloadCount(ctx context.Context) error { var err error @@ -130,6 +140,25 @@ func (r *Release) LoadArchiveDownloadCount(ctx context.Context) error { return err } +// GetTotalDownloadCount returns the summary of all dowload count of files attached to the release +func (r *Release) GetTotalDownloadCount(ctx context.Context) (int64, error) { + var archiveCount int64 + if !r.HideArchiveLinks { + _, err := db.GetEngine(ctx).SQL("SELECT SUM(count) FROM repo_archive_download_count WHERE release_id = ?", r.ID).Get(&archiveCount) + if err != nil { + return 0, err + } + } + + var attachmentCount int64 + _, err := db.GetEngine(ctx).SQL("SELECT SUM(download_count) FROM attachment WHERE release_id = ?", r.ID).Get(&attachmentCount) + if err != nil { + return 0, err + } + + return archiveCount + attachmentCount, nil +} + // APIURL the api url for a release. release must have attributes loaded func (r *Release) APIURL() string { return r.Repo.APIURL() + "/releases/" + strconv.FormatInt(r.ID, 10) @@ -160,6 +189,20 @@ func (r *Release) Link() string { return r.Repo.Link() + "/releases/tag/" + util.PathEscapeSegments(r.TagName) } +// SummaryCardURL returns the absolute URL to an image providing a summary of the release +func (r *Release) SummaryCardURL() string { + return fmt.Sprintf("%s/releases/summary-card/%s", r.Repo.HTMLURL(), util.PathEscapeSegments(r.TagName)) +} + +// DisplayName retruns the name of the release +func (r *Release) DisplayName() string { + if r.IsTag && r.Title == "" { + return r.TagName + } + + return r.Title +} + // IsReleaseExist returns true if release with given tag name already exists. func IsReleaseExist(ctx context.Context, repoID int64, tagName string) (bool, error) { if len(tagName) == 0 { diff --git a/models/repo/release_test.go b/models/repo/release_test.go index 4e61a2805d..7680f2cc9d 100644 --- a/models/repo/release_test.go +++ b/models/repo/release_test.go @@ -9,6 +9,7 @@ import ( "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/unittest" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -25,3 +26,26 @@ func TestMigrate_InsertReleases(t *testing.T) { err := InsertReleases(db.DefaultContext, r) require.NoError(t, err) } + +func TestReleaseLoadRepo(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + + release := unittest.AssertExistsAndLoadBean(t, &Release{ID: 1}) + assert.Nil(t, release.Repo) + + require.NoError(t, release.LoadRepo(db.DefaultContext)) + + assert.EqualValues(t, 1, release.Repo.ID) +} + +func TestReleaseDisplayName(t *testing.T) { + release := Release{TagName: "TagName"} + + assert.Empty(t, release.DisplayName()) + + release.IsTag = true + assert.Equal(t, "TagName", release.DisplayName()) + + release.Title = "Title" + assert.Equal(t, "Title", release.DisplayName()) +} diff --git a/models/repo/repo.go b/models/repo/repo.go index cd6be48b90..bdf0de2f85 100644 --- a/models/repo/repo.go +++ b/models/repo/repo.go @@ -327,6 +327,11 @@ func (repo *Repository) HTMLURL() string { return setting.AppURL + url.PathEscape(repo.OwnerName) + "/" + url.PathEscape(repo.Name) } +// SummaryCardURL returns the absolute URL to an image providing a summary of the repo +func (repo *Repository) SummaryCardURL() string { + return fmt.Sprintf("%s/-/summary-card", repo.HTMLURL()) +} + // CommitLink make link to by commit full ID // note: won't check whether it's an right id func (repo *Repository) CommitLink(commitID string) (result string) { diff --git a/models/repo/user_repo.go b/models/repo/user_repo.go index 781a75730a..0f95f5ab6b 100644 --- a/models/repo/user_repo.go +++ b/models/repo/user_repo.go @@ -166,9 +166,9 @@ func GetReviewers(ctx context.Context, repo *Repository, doerID, posterID int64) // If isShowFullName is set to true, also include full name prefix search func GetIssuePostersWithSearch(ctx context.Context, repo *Repository, isPull bool, search string, isShowFullName bool) ([]*user_model.User, error) { users := make([]*user_model.User, 0, 30) - var prefixCond builder.Cond = builder.Like{"name", search + "%"} + prefixCond := db.BuildCaseInsensitiveLike("name", search+"%") if isShowFullName { - prefixCond = prefixCond.Or(builder.Like{"full_name", "%" + search + "%"}) + prefixCond = db.BuildCaseInsensitiveLike("full_name", "%"+search+"%") } cond := builder.In("`user`.id", diff --git a/models/user/search.go b/models/user/search.go index cb90ca850e..143f9d39c9 100644 --- a/models/user/search.go +++ b/models/user/search.go @@ -126,17 +126,15 @@ func (opts *SearchUserOptions) toSearchQueryBase(ctx context.Context) *xorm.Sess return e.Where(cond) } - // 2fa filter uses LEFT JOIN to check whether a user has a 2fa record - // While using LEFT JOIN, sometimes the performance might not be good, but it won't be a problem now, such SQL is seldom executed. - // There are some possible methods to refactor this SQL in future when we really need to optimize the performance (but not now): - // (1) add a column in user table (2) add a setting value in user_setting table (3) use search engines (bleve/elasticsearch) + // Check if the user has two factor enabled, which is TOTP or Webauthn. if opts.IsTwoFactorEnabled.Value() { - cond = cond.And(builder.Expr("two_factor.uid IS NOT NULL")) + cond = cond.And(builder.Expr("two_factor.uid IS NOT NULL OR webauthn_credential.user_id IS NOT NULL")) } else { - cond = cond.And(builder.Expr("two_factor.uid IS NULL")) + cond = cond.And(builder.Expr("two_factor.uid IS NULL AND webauthn_credential.user_id IS NULL")) } return e.Join("LEFT OUTER", "two_factor", "two_factor.uid = `user`.id"). + Join("LEFT OUTER", "webauthn_credential", "webauthn_credential.user_id = `user`.id"). Where(cond) } diff --git a/models/user/user.go b/models/user/user.go index ec9b35964d..98903bf18e 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -842,48 +842,46 @@ func countUsers(ctx context.Context, opts *CountUserFilter) int64 { // VerifyUserActiveCode verifies that the code is valid for the given purpose for this user. // If delete is specified, the token will be deleted. -func VerifyUserAuthorizationToken(ctx context.Context, code string, purpose auth.AuthorizationPurpose, delete bool) (*User, error) { +func VerifyUserAuthorizationToken(ctx context.Context, code string, purpose auth.AuthorizationPurpose) (user *User, deleteToken func() error, err error) { lookupKey, validator, found := strings.Cut(code, ":") if !found { - return nil, nil + return nil, nil, nil } authToken, err := auth.FindAuthToken(ctx, lookupKey, purpose) if err != nil { if errors.Is(err, util.ErrNotExist) { - return nil, nil + return nil, nil, nil } - return nil, err + return nil, nil, err } if authToken.IsExpired() { - return nil, auth.DeleteAuthToken(ctx, authToken) + return nil, nil, auth.DeleteAuthToken(ctx, authToken) } rawValidator, err := hex.DecodeString(validator) if err != nil { - return nil, err + return nil, nil, err } if subtle.ConstantTimeCompare([]byte(authToken.HashedValidator), []byte(auth.HashValidator(rawValidator))) == 0 { - return nil, errors.New("validator doesn't match") + return nil, nil, errors.New("validator doesn't match") } u, err := GetUserByID(ctx, authToken.UID) if err != nil { if IsErrUserNotExist(err) { - return nil, nil + return nil, nil, nil } - return nil, err + return nil, nil, err } - if delete { - if err := auth.DeleteAuthToken(ctx, authToken); err != nil { - return nil, err - } + deleteToken = func() error { + return auth.DeleteAuthToken(ctx, authToken) } - return u, nil + return u, deleteToken, nil } // ValidateUser check if user is valid to insert / update into database diff --git a/models/user/user_test.go b/models/user/user_test.go index 1c734fa926..68778f4002 100644 --- a/models/user/user_test.go +++ b/models/user/user_test.go @@ -222,7 +222,7 @@ func TestSearchUsers(t *testing.T) { []int64{1041, 37}) testUserSuccess(&user_model.SearchUserOptions{ListOptions: db.ListOptions{Page: 1}, IsTwoFactorEnabled: optional.Some(true)}, - []int64{24}) + []int64{24, 32}) } func TestEmailNotificationPreferences(t *testing.T) { @@ -741,13 +741,13 @@ func TestVerifyUserAuthorizationToken(t *testing.T) { assert.True(t, ok) t.Run("Wrong purpose", func(t *testing.T) { - u, err := user_model.VerifyUserAuthorizationToken(db.DefaultContext, code, auth.PasswordReset, false) + u, _, err := user_model.VerifyUserAuthorizationToken(db.DefaultContext, code, auth.PasswordReset) require.NoError(t, err) assert.Nil(t, u) }) t.Run("No delete", func(t *testing.T) { - u, err := user_model.VerifyUserAuthorizationToken(db.DefaultContext, code, auth.UserActivation, false) + u, _, err := user_model.VerifyUserAuthorizationToken(db.DefaultContext, code, auth.UserActivation) require.NoError(t, err) assert.EqualValues(t, user.ID, u.ID) @@ -757,9 +757,10 @@ func TestVerifyUserAuthorizationToken(t *testing.T) { }) t.Run("Delete", func(t *testing.T) { - u, err := user_model.VerifyUserAuthorizationToken(db.DefaultContext, code, auth.UserActivation, true) + u, deleteToken, err := user_model.VerifyUserAuthorizationToken(db.DefaultContext, code, auth.UserActivation) require.NoError(t, err) assert.EqualValues(t, user.ID, u.ID) + require.NoError(t, deleteToken()) authToken, err := auth.FindAuthToken(db.DefaultContext, lookupKey, auth.UserActivation) require.ErrorIs(t, err, util.ErrNotExist) diff --git a/modules/card/card.go b/modules/card/card.go index bb160d7ea3..370d241073 100644 --- a/modules/card/card.go +++ b/modules/card/card.go @@ -5,6 +5,7 @@ package card import ( "bytes" + "fmt" "image" "image/color" "io" @@ -35,12 +36,19 @@ type Card struct { Img *image.RGBA Font *truetype.Font Margin int + Width int + Height int } var fontCache = sync.OnceValues(func() (*truetype.Font, error) { return truetype.Parse(goregular.TTF) }) +// DefaultSize returns the default size for a card +func DefaultSize() (int, int) { + return 1200, 600 +} + // NewCard creates a new card with the given dimensions in pixels func NewCard(width, height int) (*Card, error) { img := image.NewRGBA(image.Rect(0, 0, width, height)) @@ -55,6 +63,8 @@ func NewCard(width, height int) (*Card, error) { Img: img, Font: font, Margin: 0, + Width: width, + Height: height, }, nil } @@ -67,14 +77,14 @@ func (c *Card) Split(vertical bool, percentage int) (*Card, *Card) { mid := (bounds.Dx() * percentage / 100) + bounds.Min.X subleft := c.Img.SubImage(image.Rect(bounds.Min.X, bounds.Min.Y, mid, bounds.Max.Y)).(*image.RGBA) subright := c.Img.SubImage(image.Rect(mid, bounds.Min.Y, bounds.Max.X, bounds.Max.Y)).(*image.RGBA) - return &Card{Img: subleft, Font: c.Font}, - &Card{Img: subright, Font: c.Font} + return &Card{Img: subleft, Font: c.Font, Width: subleft.Bounds().Dx(), Height: subleft.Bounds().Dy()}, + &Card{Img: subright, Font: c.Font, Width: subright.Bounds().Dx(), Height: subright.Bounds().Dy()} } mid := (bounds.Dy() * percentage / 100) + bounds.Min.Y subtop := c.Img.SubImage(image.Rect(bounds.Min.X, bounds.Min.Y, bounds.Max.X, mid)).(*image.RGBA) subbottom := c.Img.SubImage(image.Rect(bounds.Min.X, mid, bounds.Max.X, bounds.Max.Y)).(*image.RGBA) - return &Card{Img: subtop, Font: c.Font}, - &Card{Img: subbottom, Font: c.Font} + return &Card{Img: subtop, Font: c.Font, Width: subtop.Bounds().Dx(), Height: subtop.Bounds().Dy()}, + &Card{Img: subbottom, Font: c.Font, Width: subbottom.Bounds().Dx(), Height: subbottom.Bounds().Dy()} } // SetMargin sets the margins for the card @@ -244,9 +254,14 @@ func (c *Card) fetchExternalImage(url string) (image.Image, bool) { }, } + // Go expects a absolute URL, so we must change a relative to an absolute one + if !strings.Contains(url, "://") { + url = fmt.Sprintf("%s%s", setting.AppURL, strings.TrimPrefix(url, "/")) + } + resp, err := client.Get(url) if err != nil { - log.Warn("error when fetching external image from %s: %w", url, err) + log.Warn("error when fetching external image from %s: %v", url, err) return nil, false } defer resp.Body.Close() @@ -321,3 +336,8 @@ func (c *Card) DrawExternalImage(url string) { } c.DrawImage(image) } + +// DrawRect draws a rect with the given color +func (c *Card) DrawRect(startX, startY, endX, endY int, color color.Color) { + draw.Draw(c.Img, image.Rect(startX, startY, endX, endY), &image.Uniform{color}, image.Point{}, draw.Src) +} diff --git a/modules/markup/file_preview.go b/modules/markup/file_preview.go index 49a5f1e8ba..2171f6097b 100644 --- a/modules/markup/file_preview.go +++ b/modules/markup/file_preview.go @@ -8,6 +8,7 @@ import ( "bytes" "html/template" "io" + "net/url" "regexp" "slices" "strconv" @@ -77,6 +78,16 @@ func newFilePreview(ctx *RenderContext, node *html.Node, locale translation.Loca commitSha := node.Data[m[4]:m[5]] filePath := node.Data[m[6]:m[7]] + urlFullSource := urlFull + if strings.HasSuffix(filePath, "?display=source") { + filePath = strings.TrimSuffix(filePath, "?display=source") + } else if Type(filePath) != "" { + urlFullSource = node.Data[m[0]:m[6]] + filePath + "?display=source#" + node.Data[m[8]:m[1]] + } + filePath, err := url.QueryUnescape(filePath) + if err != nil { + return nil + } hash := node.Data[m[8]:m[9]] preview.start = m[0] @@ -113,7 +124,7 @@ func newFilePreview(ctx *RenderContext, node *html.Node, locale translation.Loca titleBuffer.WriteString(" – ") } - err = html.Render(titleBuffer, createLink(urlFull, filePath, "muted")) + err = html.Render(titleBuffer, createLink(urlFullSource, filePath, "muted")) if err != nil { log.Error("failed to render filepathLink: %v", err) } diff --git a/modules/markup/html_test.go b/modules/markup/html_test.go index 50ea70905c..05ba321548 100644 --- a/modules/markup/html_test.go +++ b/modules/markup/html_test.go @@ -1026,4 +1026,138 @@ func TestRender_FilePreview(t *testing.T) { localMetas, ) }) + + commitFileURL := util.URLJoin(markup.TestRepoURL, "src", "commit", "c9913120ed2c1e27c1d7752ecdb7a504dc7cf6be", "path", "to", "file.md") + + t.Run("rendered file with ?display=source", func(t *testing.T) { + testRender( + commitFileURL+"?display=source"+"#L1-L2", + `

`+ + `
`+ + `
`+ + `
`+ + `path/to/file.md`+ + `
`+ + ``+ + `Lines 1 to 2 in c991312`+ + ``+ + `
`+ + `
`+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + `
# A`+"\n"+`
B`+"\n"+`
`+ + `
`+ + `
`+ + `

`, + localMetas, + ) + }) + + t.Run("rendered file without ?display=source", func(t *testing.T) { + testRender( + commitFileURL+"#L1-L2", + `

`+ + `
`+ + `
`+ + `
`+ + `path/to/file.md`+ + `
`+ + ``+ + `Lines 1 to 2 in c991312`+ + ``+ + `
`+ + `
`+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + `
# A`+"\n"+`
B`+"\n"+`
`+ + `
`+ + `
`+ + `

`, + localMetas, + ) + }) + + commitFileURL = util.URLJoin(markup.TestRepoURL, "src", "commit", "190d9492934af498c3f669d6a2431dc5459e5b20", "path", "to", "file.go") + + t.Run("normal file with ?display=source", func(t *testing.T) { + testRender( + commitFileURL+"?display=source"+"#L2-L3", + `

`+ + `
`+ + `
`+ + `
`+ + `path/to/file.go`+ + `
`+ + ``+ + `Lines 2 to 3 in 190d949`+ + ``+ + `
`+ + `
`+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + `
B`+"\n"+`
C`+"\n"+`
`+ + `
`+ + `
`+ + `

`, + localMetas, + ) + }) + + commitFileURL = util.URLJoin(markup.TestRepoURL, "src", "commit", "eeb243c3395e1921c5d90e73bd739827251fc99d", "path", "to", "file%20%23.txt") + + t.Run("file with strange characters in name", func(t *testing.T) { + testRender( + commitFileURL+"#L1", + `

`+ + `
`+ + `
`+ + `
`+ + `path/to/file #.txt`+ + `
`+ + ``+ + `Line 1 in eeb243c`+ + ``+ + `
`+ + `
`+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + `
A`+"\n"+`
`+ + `
`+ + `
`+ + `

`, + localMetas, + ) + }) } diff --git a/modules/markup/markdown/transform_heading.go b/modules/markup/markdown/transform_heading.go index d869ee5de9..79fc9a3067 100644 --- a/modules/markup/markdown/transform_heading.go +++ b/modules/markup/markdown/transform_heading.go @@ -7,6 +7,7 @@ import ( "fmt" "code.gitea.io/gitea/modules/markup" + mdutil "code.gitea.io/gitea/modules/markup/markdown/util" "code.gitea.io/gitea/modules/util" "github.com/yuin/goldmark/ast" @@ -19,7 +20,7 @@ func (g *ASTTransformer) transformHeading(_ *markup.RenderContext, v *ast.Headin v.SetAttribute(attr.Name, []byte(fmt.Sprintf("%v", attr.Value))) } } - txt := v.Lines().Value(reader.Source()) + txt := mdutil.Text(v, reader.Source()) header := markup.Header{ Text: util.UnsafeBytesToString(txt), Level: v.Level, diff --git a/modules/markup/orgmode/orgmode_test.go b/modules/markup/orgmode/orgmode_test.go index f41d86a8a8..58fede7eb8 100644 --- a/modules/markup/orgmode/orgmode_test.go +++ b/modules/markup/orgmode/orgmode_test.go @@ -152,8 +152,8 @@ func HelloWorld() { } #+end_src `, `
-
// HelloWorld prints "Hello World"
-func HelloWorld() {
+
// HelloWorld prints "Hello World"
+func HelloWorld() {
 	fmt.Println("Hello World")
 }
`) diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/0b/b53b56d70d253ce75c257d3cd6334a41ef2b6c b/modules/markup/tests/repo/repo1_filepreview/objects/0b/b53b56d70d253ce75c257d3cd6334a41ef2b6c new file mode 100644 index 0000000000..1ab268b76c Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/0b/b53b56d70d253ce75c257d3cd6334a41ef2b6c differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/18/9739e1c2a6cdb8ee094ba1ef8a2e40cf65b2ec b/modules/markup/tests/repo/repo1_filepreview/objects/18/9739e1c2a6cdb8ee094ba1ef8a2e40cf65b2ec new file mode 100644 index 0000000000..c8b99f906b Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/18/9739e1c2a6cdb8ee094ba1ef8a2e40cf65b2ec differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/2a/4032b49cff56d6d4921133e087d9dc0341a2c5 b/modules/markup/tests/repo/repo1_filepreview/objects/2a/4032b49cff56d6d4921133e087d9dc0341a2c5 new file mode 100644 index 0000000000..f799e8a988 Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/2a/4032b49cff56d6d4921133e087d9dc0341a2c5 differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/2d/2f8eaa17b17359ee1c73222065575d50d9a157 b/modules/markup/tests/repo/repo1_filepreview/objects/2d/2f8eaa17b17359ee1c73222065575d50d9a157 new file mode 100644 index 0000000000..7f4c451d00 Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/2d/2f8eaa17b17359ee1c73222065575d50d9a157 differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/2f/b9577a8e940a0a84a789cdd4a45d0f172e3fdd b/modules/markup/tests/repo/repo1_filepreview/objects/2f/b9577a8e940a0a84a789cdd4a45d0f172e3fdd new file mode 100644 index 0000000000..fc97712911 Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/2f/b9577a8e940a0a84a789cdd4a45d0f172e3fdd differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/2f/f8eb63aad050c3f20e9cb27090ab7378267ab2 b/modules/markup/tests/repo/repo1_filepreview/objects/2f/f8eb63aad050c3f20e9cb27090ab7378267ab2 new file mode 100644 index 0000000000..e230df1343 Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/2f/f8eb63aad050c3f20e9cb27090ab7378267ab2 differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/35/75ed7948fe86ab56b0a76f796f7995222bec65 b/modules/markup/tests/repo/repo1_filepreview/objects/35/75ed7948fe86ab56b0a76f796f7995222bec65 new file mode 100644 index 0000000000..1493caa3df Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/35/75ed7948fe86ab56b0a76f796f7995222bec65 differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/3c/95f14e5a0ab2c5ba9ee9a47ddc261af4968043 b/modules/markup/tests/repo/repo1_filepreview/objects/3c/95f14e5a0ab2c5ba9ee9a47ddc261af4968043 new file mode 100644 index 0000000000..3e9c0c0d8b Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/3c/95f14e5a0ab2c5ba9ee9a47ddc261af4968043 differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/3e/2a4f1b9a15ffa15ea7ffdc06acd302442b3eca b/modules/markup/tests/repo/repo1_filepreview/objects/3e/2a4f1b9a15ffa15ea7ffdc06acd302442b3eca new file mode 100644 index 0000000000..78189a52f6 --- /dev/null +++ b/modules/markup/tests/repo/repo1_filepreview/objects/3e/2a4f1b9a15ffa15ea7ffdc06acd302442b3eca @@ -0,0 +1 @@ +xAN0EYGB;a U=D9=&r}7ҌB^yY8:A X}RXks";uF9x EdВ%~**Z3\v9Й>n8fxk=[9K%L>{7s;av4hXOHԓՆ`K \ No newline at end of file diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/72/1f0ce13d83f93d431b849a554a62948b85f573 b/modules/markup/tests/repo/repo1_filepreview/objects/72/1f0ce13d83f93d431b849a554a62948b85f573 new file mode 100644 index 0000000000..d781d4d248 --- /dev/null +++ b/modules/markup/tests/repo/repo1_filepreview/objects/72/1f0ce13d83f93d431b849a554a62948b85f573 @@ -0,0 +1 @@ +xK1@]$JazJR@w+s۲"@VL&J3%f-GDq2>FjBOEݹ:g\1ꦒkEM6D,Ÿ\Ǹ:\6Olmȩ;ϭ|!GE6ZzYβ mwٛi.x-o"L \ No newline at end of file diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/72/e0a44ea5761c9055995db18019e459576b3b27 b/modules/markup/tests/repo/repo1_filepreview/objects/72/e0a44ea5761c9055995db18019e459576b3b27 new file mode 100644 index 0000000000..7b926dc0d8 Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/72/e0a44ea5761c9055995db18019e459576b3b27 differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/72/e1c77b65c7baa0e848557089148833fb54705e b/modules/markup/tests/repo/repo1_filepreview/objects/72/e1c77b65c7baa0e848557089148833fb54705e new file mode 100644 index 0000000000..0bbca73af2 Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/72/e1c77b65c7baa0e848557089148833fb54705e differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/8a/3b1881b5c4e7dc2be7ee1c0f37f93ffbb5ff77 b/modules/markup/tests/repo/repo1_filepreview/objects/8a/3b1881b5c4e7dc2be7ee1c0f37f93ffbb5ff77 new file mode 100644 index 0000000000..0ea93376dc Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/8a/3b1881b5c4e7dc2be7ee1c0f37f93ffbb5ff77 differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/8b/ccd5176c25898b57da2551e076f769054e0d8e b/modules/markup/tests/repo/repo1_filepreview/objects/8b/ccd5176c25898b57da2551e076f769054e0d8e new file mode 100644 index 0000000000..394a7bb50d Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/8b/ccd5176c25898b57da2551e076f769054e0d8e differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/95/31b649823095acf5d79ab9e4f8b8d86046352f b/modules/markup/tests/repo/repo1_filepreview/objects/95/31b649823095acf5d79ab9e4f8b8d86046352f new file mode 100644 index 0000000000..ab36311f6f Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/95/31b649823095acf5d79ab9e4f8b8d86046352f differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/ac/769ab4baa91060a4c2f828f53e6c3cc2f708f8 b/modules/markup/tests/repo/repo1_filepreview/objects/ac/769ab4baa91060a4c2f828f53e6c3cc2f708f8 new file mode 100644 index 0000000000..59afaebf4a Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/ac/769ab4baa91060a4c2f828f53e6c3cc2f708f8 differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/c5/3110b1957cefc56c4b2d879476ddbe905980bf b/modules/markup/tests/repo/repo1_filepreview/objects/c5/3110b1957cefc56c4b2d879476ddbe905980bf new file mode 100644 index 0000000000..3de089bf6a Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/c5/3110b1957cefc56c4b2d879476ddbe905980bf differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/c9/8762531dd068cd818300a5f5c7dca5da79b510 b/modules/markup/tests/repo/repo1_filepreview/objects/c9/8762531dd068cd818300a5f5c7dca5da79b510 new file mode 100644 index 0000000000..af5b784773 Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/c9/8762531dd068cd818300a5f5c7dca5da79b510 differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/c9/913120ed2c1e27c1d7752ecdb7a504dc7cf6be b/modules/markup/tests/repo/repo1_filepreview/objects/c9/913120ed2c1e27c1d7752ecdb7a504dc7cf6be new file mode 100644 index 0000000000..9fc2b7c312 Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/c9/913120ed2c1e27c1d7752ecdb7a504dc7cf6be differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/e7/99b34ea867a0364d0df33f382562db9ff39084 b/modules/markup/tests/repo/repo1_filepreview/objects/e7/99b34ea867a0364d0df33f382562db9ff39084 new file mode 100644 index 0000000000..ef73ed1791 Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/e7/99b34ea867a0364d0df33f382562db9ff39084 differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/ee/b243c3395e1921c5d90e73bd739827251fc99d b/modules/markup/tests/repo/repo1_filepreview/objects/ee/b243c3395e1921c5d90e73bd739827251fc99d new file mode 100644 index 0000000000..5515b07d4a Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/ee/b243c3395e1921c5d90e73bd739827251fc99d differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/f7/0f10e4db19068f79bc43844b49f3eece45c4e8 b/modules/markup/tests/repo/repo1_filepreview/objects/f7/0f10e4db19068f79bc43844b49f3eece45c4e8 new file mode 100644 index 0000000000..2e15b4fb0a Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/f7/0f10e4db19068f79bc43844b49f3eece45c4e8 differ diff --git a/modules/markup/tests/repo/repo1_filepreview/refs/heads/master b/modules/markup/tests/repo/repo1_filepreview/refs/heads/master index df25bf45f0..709cffca17 100644 --- a/modules/markup/tests/repo/repo1_filepreview/refs/heads/master +++ b/modules/markup/tests/repo/repo1_filepreview/refs/heads/master @@ -1 +1 @@ -4c1aaf56bcb9f39dcf65f3f250726850aed13cd6 +eeb243c3395e1921c5d90e73bd739827251fc99d diff --git a/modules/references/references.go b/modules/references/references.go index c61d06d5dc..3b4bcb3706 100644 --- a/modules/references/references.go +++ b/modules/references/references.go @@ -32,7 +32,7 @@ var ( // issueNumericPattern matches string that references to a numeric issue, e.g. #1287 issueNumericPattern = regexp.MustCompile(`(?:\s|^|\(|\[|\'|\")([#!][0-9]+)(?:\s|$|\)|\]|\'|\"|[:;,.?!]\s|[:;,.?!]$)`) // issueAlphanumericPattern matches string that references to an alphanumeric issue, e.g. ABC-1234 - issueAlphanumericPattern = regexp.MustCompile(`(?:\s|^|\(|\[|\"|\')([A-Z]{1,10}-[1-9][0-9]*)(?:\s|$|\)|\]|:|\.(\s|$)|\"|\')`) + issueAlphanumericPattern = regexp.MustCompile(`(?:\s|^|\(|\[|\"|\')([A-Z]{1,10}-[1-9][0-9]*)(?:\s|$|\)|\]|:|\.(\s|$)|\"|\'|,)`) // crossReferenceIssueNumericPattern matches string that references a numeric issue in a different repository // e.g. org/repo#12345 crossReferenceIssueNumericPattern = regexp.MustCompile(`(?:\s|^|\(|\[)([0-9a-zA-Z-_\.]+/[0-9a-zA-Z-_\.]+[#!][0-9]+)(?:\s|$|\)|\]|[:;,.?!]\s|[:;,.?!]$)`) diff --git a/modules/references/references_test.go b/modules/references/references_test.go index ffa7f993e3..d5f7c4b4c5 100644 --- a/modules/references/references_test.go +++ b/modules/references/references_test.go @@ -466,6 +466,7 @@ func TestRegExp_issueAlphanumericPattern(t *testing.T) { "ABC-123:", "\"ABC-123\"", "'ABC-123'", + "ABC-123, unknown PR", } falseTestCases := []string{ "RC-08", diff --git a/modules/secret/secret.go b/modules/secret/secret.go index e70ae1839c..e3557b91b9 100644 --- a/modules/secret/secret.go +++ b/modules/secret/secret.go @@ -47,7 +47,7 @@ func AesDecrypt(key, text []byte) ([]byte, error) { cfb.XORKeyStream(text, text) data, err := base64.StdEncoding.DecodeString(string(text)) if err != nil { - return nil, fmt.Errorf("AesDecrypt invalid decrypted base64 string: %w", err) + return nil, fmt.Errorf("AesDecrypt invalid decrypted base64 string: %w - it can be caused by a change of the [security].SECRET_KEY setting or a database corruption - `forgejo doctor check --run check-db-consistency --fix` will get rid of orphaned rows found in the `two_factor` table and may fix this problem if they are the one with the invalid content", err) } return data, nil } diff --git a/modules/setting/service.go b/modules/setting/service.go index 5a6cc254e0..74ed5cd3c9 100644 --- a/modules/setting/service.go +++ b/modules/setting/service.go @@ -138,6 +138,11 @@ func CompileEmailGlobList(sec ConfigSection, keys ...string) (globs []glob.Glob) return globs } +// LoadServiceSetting loads the service settings +func LoadServiceSetting() { + loadServiceFrom(CfgProvider) +} + func loadServiceFrom(rootCfg ConfigProvider) { sec := rootCfg.Section("service") Service.ActiveCodeLives = sec.Key("ACTIVE_CODE_LIVE_MINUTES").MustInt(180) diff --git a/modules/templates/helper.go b/modules/templates/helper.go index 55de85646c..023ba60fa9 100644 --- a/modules/templates/helper.go +++ b/modules/templates/helper.go @@ -103,6 +103,10 @@ func NewFuncMap() template.FuncMap { "AppVer": func() string { return setting.AppVer }, + "AppVerNoMetadata": func() string { + version, _, _ := strings.Cut(setting.AppVer, "+") + return version + }, "AppDomain": func() string { // documented in mail-templates.md return setting.Domain }, diff --git a/options/locale/locale_bg.ini b/options/locale/locale_bg.ini index 924ce710e0..d55fa10111 100644 --- a/options/locale/locale_bg.ini +++ b/options/locale/locale_bg.ini @@ -111,6 +111,7 @@ new_migrate.link = Нова миграция new_org.link = Нова организация copy_generic = Копиране в клипборда copy_error = Неуспешно копиране +copy_path = Копиране на пътя [settings] ui = Тема @@ -159,7 +160,7 @@ comment_type_group_milestone = Етап manage_emails = Управление на адресите на ел. поща permission_read = Четене update_password = Обновяване на паролата -biography_placeholder = Разкажете ни малко за себе си! (Можете да използвате Markdown) +biography_placeholder = Разкажете на другите малко за себе си! (Можете да използвате Маркдаун) orgs = Организации continue = Продължаване blocked_users = Блокирани потребители @@ -224,7 +225,7 @@ key_signature_gpg_placeholder = Започва с „-----BEGIN PGP SIGNATURE--- key_signature_ssh_placeholder = Започва с „-----BEGIN SSH SIGNATURE-----“ saved_successfully = Настройките бяха запазени успешно. no_activity = Няма скорошна дейност -theme_desc = Това ще бъде вашата тема по подразбиране в целия сайт. +theme_desc = Тази тема ще се използва за уеб интерфейса, когато сте влезли. keep_activity_private = Скриване на дейността от профилната страница lookup_avatar_by_mail = Търсене на профилна снимка по адреса на ел. поща password_incorrect = Текущата парола е неправилна. @@ -235,7 +236,7 @@ twofa_disabled = Двуфакторното удостоверяване е из orgs_none = Не сте участник в никакви организации. repos_none = Не притежавате никакви хранилища. blocked_users_none = Няма блокирани потребители. -profile_desc = Контролирайте как вашият профил се показва на другите потребители. Вашият основен адрес на ел. поща ще се използва за известия, възстановяване на паролата и уеб базирани Git операции. +profile_desc = Вашият профил permission_write = Четене и писане twofa_disable = Изключване на двуфакторното удостоверяване twofa_enroll = Включване на двуфакторно удостоверяване @@ -252,6 +253,9 @@ gpg_token_code = echo "%s" | gpg -a --default-key %s --detach-sig language.title = Език по подразбиране language.localization_project = Помогнете ни да преведем Forgejo на вашия език! Научете повече. language.description = Този език ще бъде запазен във вашия акаунт и ще се използва като език по подразбиране, след като влезете. +pronouns_custom = Персонализирани +visibility.limited_tooltip = Видимо само за влезли потребители +pronouns_custom_label = Персонализирани местоимения [packages] container.labels.value = Стойност @@ -280,6 +284,9 @@ dependencies = Зависимости published_by_in = Публикуван %[1]s от %[3]s в %[5]s published_by = Публикуван %[1]s от %[3]s generic.download = Изтеглете пакета от командния ред: +container.details.type = Тип образ +alpine.repository = За хранилището +container.images.title = Образи [tool] hours = %d часа @@ -397,7 +404,7 @@ issues.keyword_search_unavailable = В момента търсенето по к repo_desc_helper = Въведете кратко описание (опционално) mirror_address = Клониране от URL owner_helper = Някои организации може да не се показват в падащото меню поради ограничение за максимален брой хранилища. -new_repo_helper = Хранилището съдържа всички файлове на проекта, включително хронологията на ревизиите. Вече хоствате хранилище другаде? Мигрирайте хранилище. +new_repo_helper = Хранилището съдържа всички файлове на проекта, включително хронологията на ревизиите. Вече хоствате хранилище другаде? Мигрирайте хранилище. repo_name_helper = Добрите имена на хранилища използват кратки, запомнящи се и уникални ключови думи. migrated_from = Мигрирано от %[2]s visibility_description = Само притежателят или участниците в организацията, ако имат права, ще могат да го видят. @@ -424,14 +431,14 @@ settings.add_webhook = Добавяне на уеб-кука template.webhooks = Уеб-куки issues.label_templates.info = Все още няма етикети. Създайте етикет с „Нов етикет“ или използвайте предварително зададен набор от етикети: labels = Етикети -license_helper_desc = Лицензът определя какво могат и какво не могат да правят другите с вашия код. Не сте сигурни кой е подходящ за вашия проект? Вижте Избиране на лиценз. +license_helper_desc = Лицензът определя какво могат и какво не могат да правят другите с вашия код. Не сте сигурни кой е подходящ за вашия проект? Вижте Избиране на лиценз. issues.choose.blank = По подразбиране settings.hooks = Уеб-куки issue_labels = Етикети issue_labels_helper = Изберете набор от етикети readme_helper_desc = Това е мястото, където можете да напишете пълно описание на вашия проект. repo_gitignore_helper = Изберете .gitignore шаблони -auto_init = Да се инициализира хранилище (Добавя .gitignore, License и README) +auto_init = Да се инициализира хранилище template.issue_labels = Етикети за задачите migrate_items_labels = Етикети issues.label_templates.title = Зареждане на предв. зададен набор от етикети @@ -815,7 +822,7 @@ diff.browse_source = Разглеждане на изходния код file_view_rendered = Преглед на визуализация issues.lock_with_reason = заключи като %s и ограничи обсъждането до сътрудници %s milestones.new_subheader = Етапите ви помагат да управлявате задачите и да проследявате напредъка им. -release.edit = редактиране +release.edit = Редактиране activity.published_release_label = Издание activity.navbar.contributors = Допринесли pulls.recently_pushed_new_branches = Изтласкахте в клона %[1]s %[2]s @@ -939,7 +946,7 @@ pulls.approve_count_1 = %d одобрение pulls.can_auto_merge_desc = Тази заявка за сливане може да бъде слята автоматично. pulls.num_conflicting_files_1 = %d конфликтен файл activity.git_stats_commit_n = %d подавания -settings.event_issues = Модификация +settings.event_issues = Изменение branch.delete_head = Изтриване branch.delete = Изтриване на клона „%s“ branch.delete_html = Изтриване на клона @@ -1113,7 +1120,7 @@ pulls.reject_count_1 = %d поискана промяна issues.review.show_resolved = Показване на решено issues.review.hide_resolved = Скриване на решено issues.review.resolve_conversation = Решаване на обсъждането -diff.comment.markdown_info = Поддържа се стилизиране с markdown. +diff.comment.markdown_info = Поддържа се стилизиране с Маркдаун. diff.file_suppressed = Разликите не са показани, защото са твърде много pulls.reject_count_n = %d поискани промени settings.pulls.default_allow_edits_from_maintainers = Позволяване на редакции от поддържащите по подразбиране @@ -1195,6 +1202,95 @@ issues.all_title = Общо issues.new.assign_to_me = Възлагане на мен ext_wiki = Външно уики ext_issues = Външни задачи +readme_helper = Изберете шаблон за файл README +settings.event_pull_request_review_desc = Заявка за сливане е одобрена, отхвърлена или са добавени рецензионни коментари. +settings.event_pull_request_review = Рецензии +issues.filter_sort.relevance = Съответствие +settings.confirm_wiki_branch_rename = Преименуване на клона на уикито +settings.webhook.request = Заявка +settings.webhook.response = Отговор +settings.event_create = Създаване +settings.event_push_only = Събития при изтласкване +settings.event_delete = Изтриване +settings.event_header_repository = Събития за хранилището +settings.event_fork_desc = Хранилище е разклонено. +settings.event_fork = Разклоняване +settings.event_wiki_desc = Уики страница е създадена, преименувана, редактирана или изтрита. +settings.event_issue_milestone = Етапи +settings.event_pull_request_milestone_desc = Етап е добавен, премахнат или изменен. +settings.event_pull_request_label_desc = Етикети на заявка за сливане са добавени или премахнати. +settings.event_pull_request_merge = Сливане на заявка за сливане +settings.archive.tagsettings_unavailable = Настройките за маркери не са налични в архивирани хранилища. +settings.event_desc = Задействане при: +settings.event_create_desc = Клон или маркер е създаден. +generate_from = Генериране от +settings.event_push_desc = Git изтласкване към хранилище. +settings.event_package = Пакет +settings.event_pull_request_label = Етикети +settings.event_pull_request_assign_desc = Заявка за сливане е възложена или отвъзложена. +settings.event_choose = Персонализирани събития… +settings.event_header_issue = Събития при задачи +fork_no_valid_owners = Това хранилище не може да бъде разклонено, защото няма валидни притежатели. +settings.unarchive.text = Разархивирането на хранилище ще възстанови способността му да получава подавания и изтласквания, както и нови задачи и заявки за сливане. +settings.archive.branchsettings_unavailable = Настройките за клонове не са налични в архивирани хранилища. +settings.event_send_everything = Всички събития +settings.event_pull_request_approvals = Одобрения на заявка за сливане +release.invalid_external_url = Невалиден външен URL адрес: "%s" +settings.event_delete_desc = Клон или маркер е изтрит. +settings.discord_icon_url = URL адрес на иконка +settings.discord_icon_url.exceeds_max_length = URL адресът на иконката трябва да е по-малък или равен на 2048 знака +settings.event_push = Изтласкване +settings.event_repository_desc = Хранилище е създадено или изтрито. +settings.slack_icon_url = URL адрес на иконка +settings.event_issue_comment = Коментари +settings.event_pull_request_desc = Заявка за сливане е отворена, затворена, отворена наново или редактирана. +settings.event_issue_comment_desc = Коментар на задача е създаден, редактиран или изтрит. +settings.event_release_desc = Издание е публикувано, обновено или изтрито в хранилище. +settings.event_pull_request_review_request = Искания за рецензия +settings.event_pull_request_enforcement = Принудително изпълнение +diff.git-notes.remove-header = Премахване на бележката +diff.git-notes.add = Добавяне на бележка +settings.event_pull_request_assign = Възлагане +new_advanced_expand = Щракнете за разгъване +new_advanced = Разширени настройки +new_from_template = Използване на шаблон +new_from_template_description = Можете да изберете съществуващо шаблонно хранилище в тази инстанция и да приложите неговите настройки. +settings.event_pull_request_comment = Коментари +repo_gitignore_helper_desc = Изберете кои файлове да не се проследяват от списък с шаблони за обичайните езици. Типичните артефакти, генерирани от инструментите за изграждане, са включени в .gitignore по подразбиране. +object_format_helper = Формат на обектите на хранилището. Не може да се променя по-късно. SHA1 е най-съвместим. +issues.num_reviews_one = %d рецензия +settings.event_pull_request = Изменение +settings.event_issue_label = Етикети +settings.event_issue_assign = Възлагане +settings.event_header_pull_request = Събития при заявка за сливане +settings.event_issue_milestone_desc = Етап е добавен, премахнат или изменен. +settings.event_issue_label_desc = Етикети на задача са добавени или премахнати. +settings.event_issues_desc = Задача е отворена, затворена, отворена наново или редактирана. +settings.webhook.headers = Заглавки +settings.webhook.body = Тяло +settings.event_pull_request_sync = Синхронизирано +settings.event_pull_request_sync_desc = Клонът е обновен автоматично с целевия клон. +settings.event_package_desc = Пакет е създаден или изтрит в хранилище. +template_description = Шаблонните хранилища позволяват на потребителите да генерират нови хранилища със същата структура на директориите, файлове и опционални настройки. +auto_init_description = Поставете началото на Git историята с README и по избор добавете файлове License и .gitignore. +pulls.sign_in_require = Влезте, за да създадете нова заявка за сливане. +issues.num_reviews_few = %d рецензии +diff.git-notes.remove-body = Тази бележка ще бъде премахната. +issues.review.add_remove_review_requests = поиска рецензии от %[1]s и премахна заявки за рецензия за %[2]s %[3]s +form.name_pattern_not_allowed = Шаблонът "%s" не е разрешен в име на хранилище. +settings.wiki_rename_branch_main_notices_2 = Това ще преименува перманентно вътрешния клон на уикито на хранилището %s. Съществуващите изтегляния ще трябва да бъдат обновени. +settings.event_pull_request_milestone = Етапи +settings.event_pull_request_comment_desc = Заявка за сливане е създадена, редактирана или изтрита. +settings.event_issue_assign_desc = Задача е възложена или отвъзложена. +settings.event_pull_request_review_request_desc = Рецензия на заявка за сливане е поискана или е премахната. +generate_repo = Генериране на хранилище +default_branch_helper = Стандартният клон е основния клон за заявки за сливане и подавания на код. + +issues.reaction.add = Добавяне на реакция +issues.reaction.alt_few = %[1]s реагира с %[2]s. +issues.reaction.alt_many = %[1]s и още %[2]d реагираха с %[3]s. +issues.reaction.alt_remove = Премахване на реакция %[1]s от коментара. +issues.reaction.alt_add = Добавяне на реакция %[1]s към коментара. [modal] confirm = Потвърждаване @@ -1218,6 +1314,12 @@ buttons.italic.tooltip = Добавяне на курсив текст buttons.link.tooltip = Добавяне на връзка buttons.disable_monospace_font = Изключване на равноширокия шрифт buttons.ref.tooltip = Препратка към задача или заявка за сливане +table_modal.label.columns = Колони +table_modal.label.rows = Редове +table_modal.placeholder.content = Съдържание +table_modal.placeholder.header = Заглавка +buttons.new_table.tooltip = Добавяне на таблица +table_modal.header = Добавяне на таблица [org] teams.write_access = Писане @@ -1249,7 +1351,7 @@ settings.visibility.public = Публична settings.visibility.limited_shortname = Ограничена settings.visibility.private_shortname = Частна settings.permission = Разрешения -settings.visibility.limited = Ограничена (видима само за удостоверени потребители) +settings.visibility.limited = Ограничена (видима само за влезли потребители) settings.visibility.private = Частна (видима само за участниците в организацията) org_name_helper = Имената на организациите е добре да са кратки и запомнящи се. org_full_name_holder = Пълно име на организацията @@ -1330,6 +1432,9 @@ err_empty_admin_email = Администраторският адрес на е password_algorithm = Алгоритъм за хеш. на паролите default_keep_email_private = Скриване на адресите на ел. поща по подразбиране invalid_password_algorithm = Невалиден алгоритъм за хеш. на паролите +err_admin_name_is_reserved = Потребителското име на администратора е невалидно, потребителското име е резервирано +err_admin_name_pattern_not_allowed = Потребителското име на администратора е невалидно, потребителското име съответства с резервиран шаблон +err_admin_name_is_invalid = Потребителското име на администратора е невалидно [filter] string.asc = А - Я @@ -1361,6 +1466,14 @@ activate_account.text_1 = Здравейте, %[1]s, благодарим activate_email.text = Моля, щракнете върху следната връзка, за да потвърдите своя адрес на ел. поща в рамките на %s: activate_email = Потвърдете своя адрес на ел. поща activate_account.text_2 = Моля, щракнете върху следната връзка, за да активирате своя акаунт в рамките на %s: +issue_assigned.issue = @%[1]s ви възложи задача %[2]s в хранилище %[3]s. +issue.action.push_n = @%[1]s изтласка %[3]d подавания към %[2]s +issue.action.push_1 = @%[1]s изтласка %[3]d подаване към %[2]s +repo.transfer.subject_to_you = %s иска да прехвърли хранилище "%s" към вас +issue.action.merge = @%[1]s сля #%[2]d в %[3]s. +issue_assigned.pull = @%[1]s ви възложи заявката за сливане %[2]s в хранилище %[3]s. +issue.action.ready_for_review = @%[1]s отбеляза тази заявка за сливане като готова за рецензиране. +repo.transfer.subject_to = %s иска да прехвърли хранилище "%s" към %s [user] joined_on = Присъединени на %s @@ -1392,6 +1505,9 @@ followers.title.one = Последовател following.title.one = Следван following.title.few = Следвани public_activity.visibility_hint.self_public = Вашата дейност е видима за всички, с изключение на взаимодействията в частни пространства. Конфигуриране. +form.name_pattern_not_allowed = Шаблонът "%s" не е разрешен в потребителско име. +form.name_reserved = Потребителското име "%s" е резервирано. +public_activity.visibility_hint.self_private_profile = Вашата дейност е видима само за вас и администраторите на инстанцията, тъй като вашият профил е частен. Конфигуриране. [home] filter = Други филтри @@ -1661,6 +1777,11 @@ variables.creation = Добавяне на променлива variables.deletion.failed = Неуспешно премахване на променлива. runners.task_list.repository = Хранилище runners.description = Описание +runs.no_workflows.help_no_write_access = За да научите повече за Forgejo Actions, вижте документацията. + +variables.management = Управление на променливи +variables.id_not_exist = Променлива с идентификатор %d не съществува. +variables.not_found = Променливата не е открита. [heatmap] less = По-малко @@ -1698,6 +1819,8 @@ code_frequency.what = честота на промените type-1.display_name = Индивидуален проект +deleted.display_name = Изтрит проект + [search] no_results = Няма намерени съответстващи резултати. team_kind = Търсене на екипи... diff --git a/options/locale/locale_ca.ini b/options/locale/locale_ca.ini index ec8ae32668..20010c0e79 100644 --- a/options/locale/locale_ca.ini +++ b/options/locale/locale_ca.ini @@ -1,10 +1,10 @@ [common] -home = inici +home = Inici dashboard = Panell de control explore = Explorar help = Ajuda logo = Logo -sign_in = Entrar +sign_in = Iniciar sessió sign_in_with_provider = Entra amb %s sign_in_or = o sign_out = Sortir @@ -15,7 +15,7 @@ page = Pàgina template = Plantilla language = Idioma notifications = Notificacions -active_stopwatch = Registre de Temps Actiu +active_stopwatch = Registre de temps actiu create_new = Crear… user_profile_and_more = Perfil i Configuració… signed_in_as = Entrat com @@ -140,6 +140,14 @@ filter.not_archived = No arxivats filter.not_fork = No és fork filter.is_fork = Són forks +new_repo.title = Nou repositori +new_migrate.title = Nova migració +new_org.title = Nova organització +new_repo.link = Nou repositori +new_migrate.link = Nova migració +new_org.link = Nova organització +copy_path = Copiar ruta + [search] milestone_kind = Cerca fites... fuzzy = Difusa @@ -167,6 +175,9 @@ exact = Exacte exact_tooltip = Inclou només resultats que són exactament el terme de cerca issue_kind = Cerca problemes... +regexp = RegExp +regexp_tooltip = Interpreta el terme de cerca com una expressió regular + [heatmap] number_of_contributions_in_the_last_12_months = %s contribucions en els últims 12 mesos contributions_zero = Cap contribució @@ -204,7 +215,7 @@ reinstall_error = Estas intentant instaŀlar sobre una base de dades existent de reinstall_confirm_message = Reinstaŀlar amb una base de dades existent de Forgejo pot causar diferents problemes. En la majoria de casos, s'hauria d'utilitzar l'"app.ini" existent per executar Forgejo. Si saps el que estàs fent, confirma el seguent: no_admin_and_disable_registration = No pot deshabilitar l'autoregistre d'usuaris sense crear un compte d'administrador. err_admin_name_is_reserved = El nom d'usuari "Administrador" no es vàlid: està reservat -smtp_addr = Hoste SMPT +smtp_addr = Hoste SMTP smtp_port = Port SMPT smtp_from = Enviar correu com a mailer_user = Nom d'usuari SMTP @@ -337,6 +348,76 @@ manual_activation_only = Contacti amb l'administrador de lloc per a completar l' remember_me = Recordar aquest dispositiu create_new_account = Registrar compte +forgot_password_title = Contrasenya oblidada +forgot_password = Contrasenya oblidada? +hint_login = Ja tens compte? Entra ara! +hint_register = Necessites un compte? Registra't ara. +sign_up_button = Registra't ara. +sign_up_successful = S'ha creat el compte correctament. Benvingut! +confirmation_mail_sent_prompt = S'ha enviat un correu electrònic de confirmació a %s. Per tal de completar el registre, reviseu la safata d'entrada i seguiu l'enllaç que se us ha enviat en els següents %s. Si l'adreça de correu és incorrecta, podreu accedir al compte i demanar d'enviar un altre correu de confirmació a una altra adreça. +must_change_password = Actualitza la contrasenya +allow_password_change = Requereix a l'usuari canviar la contrasenya (recomanat) +reset_password_mail_sent_prompt = S'ha enviat un correu electrònic de confirmació a %s. Per tal de completar el procés de recuperació del compte, reviseu la safata d'entrada i seguiu l'enllaç que se us ha enviat en els següents %s. +active_your_account = Activeu el compte +account_activated = El compte s'ha activat +prohibit_login = El compte està en suspensió +prohibit_login_desc = S'ha suspès la interacció del vostre compte amb la instància. Contacteu amb l'administrador per a recuperar-ne l'accés. +resent_limit_prompt = Fa poc que heu sol·licitat un correu electrònic d'activació. Si us plau, espereu 3 minuts i torneu a intentar-ho. +has_unconfirmed_mail = Hola %s, la vostra adreça de correu no s'ha confirmat (%s). Si no heu rebut un correu de confirmació o necessiteu que l'enviem de nou, feu clic al botó següent. +change_unconfirmed_email_summary = Canvieu l'adreça de correu on s'envia el correu d'activació. +change_unconfirmed_email = Si heu proporcionat una direcció de correu incorrecta durant el registre, la podeu canviar aquí baix i se us enviarà una confirmació a l'adreça nova. +change_unconfirmed_email_error = No s'ha pogut canviar l'adreça de correu: %v +resend_mail = Feu clic aquí per tornar a enviar el correu electrònic d'activació +send_reset_mail = Enviar correu electrònic de recuperació del compte +reset_password = Recuperació del compte +invalid_code = El codi de confirmació no és vàlid o ha caducat. +invalid_code_forgot_password = El codi de confirmació és invàlid o ha caducat. Feu click aquí per a iniciar una sessió nova. +invalid_password = La contrasenya no coincideix amb la que es va utilitzar per a crear el compte. +reset_password_helper = Recuperar compte +reset_password_wrong_user = Heu iniciat sessió com a %s, però l'enllaç de recuperació pertany a %s +password_too_short = La longitud de la contrasenya no pot ser inferior a %d caràcters. +non_local_account = Els usuaris no locals no poden actualitzar la seva contrasenya mitjançant l'interfície web de Forgejo +verify = Verificar +unauthorized_credentials = Les credencials són incorrectes o han caducat. Torneu a executar l'ordre o visiteu %s per a més informació +scratch_code = Codi de recuperació +use_scratch_code = Utilitzar un codi de recuperació +use_onetime_code = Utilitzar un codi d'un sol ús +twofa_scratch_used = Ja heu utilitzat el vostre codi de recuperació. Se us ha redirigit a la pàgina de configuració de l'autenticació de doble factor per tal d'eliminar el dispositiu o generar un codi de recuperació nou. +twofa_passcode_incorrect = El codi d'accés és incorrecte. Si heu perdut el dispositiu, useu el codi de recuperació per a entrar. +twofa_scratch_token_incorrect = El codi de recuperació és incorrecte. +login_userpass = Entra +oauth_signup_tab = Registrar compte nou +oauth_signup_title = Completar compte nou +oauth_signup_submit = Completar compte +oauth_signin_tab = Vincular a un compte existent +oauth_signin_title = Entreu per a autoritzar el compte vinculat +oauth_signin_submit = Vincular compte +oauth.signin.error = Hi ha hagut un error processant la sol·licitud d'autorització. Si persisteix, poseu-vos en contacte amb l'administrador del lloc. +oauth.signin.error.access_denied = S'ha denegat la sol·licitud d'autorització. +oauth.signin.error.temporarily_unavailable = Ha fallat l'autorització perquè el servidor d'autenticació no està disponible temporalment. Intenteu-ho de nou més tard. +openid_connect_submit = Connectar +openid_connect_title = Entreu a un compte existent +openid_register_title = Crear un compte nou +openid_signin_desc = Introduïu la URI OpenID. Per exemple: alice.openid.example.org o https://openid.example.org/alice. +disable_forgot_password_mail = La recuperació de comptes està deshabilitada perquè no hi ha configuració de correu electrònic. Si us plau, contacteu amb l'administrador del lloc. +disable_forgot_password_mail_admin = La recuperació de comptes només està disponible quan s'ha configurat el correu electrònic. Si us plau, configureu el correu electrònic per a habilitar la recuperació de comptes. +email_domain_blacklisted = No podeu registrar-vos amb el correu electrònic. +authorize_application = Autoritzar aplicació +authorize_redirect_notice = Sereu redirigits a %s si autoritzeu aquesta aplicació. +authorize_application_created_by = Aquesta aplicació l'ha creat %s. +authorize_application_description = Si li concediu l'accés podrà accedir i escriure a tota la informació del vostre compte, inclòs repositoris privats i organitzacions. +authorize_title = Autoritzeu "%s" a accedir al vostre compte? +authorization_failed = Ha fallat l'autorització +authorization_failed_desc = Ha fallat l'autorització perquè s'ha detectat una sol·licitud invàlida. Si us plau, contacteu amb el responsable de l'aplicació que heu intentat autoritzar. +password_pwned = La contrasenya que heu introduït es troba en una llista de contrasenyes robades exposades en dades filtrades públicament. Si us plau, intenteu-ho de nou amb una contrasenya diferent i considereu modificar aquesta contrasenya a tot arreu on la utilitzeu. +password_pwned_err = No s'ha pogut completar la sol·licitud a HaveIBeenPwned +last_admin = No podeu eliminar l'últim usuari administrador. Com a mínim n'hi ha d'haver un. +back_to_sign_in = Torneu a entrar + +openid_connect_desc = No s'ha reconegut la URI OpenID. Vinculeu-la amb un compte nou aquí. +openid_register_desc = No s'ha reconegut la URI OpenID. Vinculeu-la amb un compte nou aquí. +sign_in_openid = Accediu amb OpenID + [editor] buttons.indent.tooltip = Aniua els elements un nivell buttons.unindent.tooltip = Desaniuna els elements un nivell @@ -355,6 +436,13 @@ buttons.list.ordered.tooltip = Afegir una llista enumerada buttons.list.task.tooltip = Afegir una llista de tasques buttons.mention.tooltip = Mencionar un usuari o equip +buttons.new_table.tooltip = Afegir taula +table_modal.header = Afegir taula +table_modal.placeholder.header = Capçalera +table_modal.placeholder.content = Contingut +table_modal.label.rows = Files +table_modal.label.columns = Columnes + [home] my_orgs = Organitzacions show_more_repos = Mostra més repositoris… @@ -381,4 +469,19 @@ filter = Altres filtres footer.software = Sobre aquest software footer.links = Enllaços navbar = Barra de navegació -footer = Peu de pàgina \ No newline at end of file +footer = Peu de pàgina + +[mail] +view_it_on = Veure a %s +reply = o responeu directament a aquest correu +link_not_working_do_paste = No funciona l'enllaç? Proveu a copiar-lo i enganxar-lo al navegador web. +hi_user_x = Hola %s, +activate_account = Si us plau, activeu el compte +activate_account.text_1 = Hola %[1]s, gràcies per registrar-te a %[2]s! +admin.new_user.user_info = Informació d'usuari +admin.new_user.text = Si us plau, cliqueu aui per administrar aquest usuari des del panell d'administració. +register_notify = Benvinguts a %s +activate_account.text_2 = Si us plau, cliqueu l'enllaç següent per activar el vostre compte en %s: +activate_email = Verifica la teva adreça de correu electrònic +activate_email.text = Si us plau, cliqueu el següent enllaç per verificar la vostra adreça de correu electrònic en %s +admin.new_user.subject = Nou usuari %s s'acaba d'enregistrar \ No newline at end of file diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini index bd983164b2..15a39179da 100644 --- a/options/locale/locale_cs-CZ.ini +++ b/options/locale/locale_cs-CZ.ini @@ -4,7 +4,7 @@ dashboard=Přehled explore=Procházet help=Nápověda logo=Logo -sign_in=Přihlášení +sign_in=Přihlásit se sign_in_with_provider = Přihlásit se přes %s sign_in_or=nebo sign_out=Odhlásit se @@ -220,7 +220,7 @@ network_error=Chyba sítě server_internal = Interní chyba serveru [startpage] -app_desc=Bezproblémová samostatně hostovatelná služba Git +app_desc=Jednoduchá, samostatně hostovatelná služba Git install=Jednoduché na instalaci install_desc=Jednoduše spusťte binární soubor pro vaši platformu, nasaďte jej pomocí Dockeru nebo si jej stáhněte jako balíček. platform=Multiplatformní @@ -517,8 +517,8 @@ issue_assigned.issue=@%[1]s vás přiřadil/a k problému %[2]s v repozitáři % issue.x_mentioned_you=@%s vás zmínil/a: issue.action.force_push=%[1]s vynutil/a nahrání %[2]s z %[3]s do %[4]s. -issue.action.push_1=@%[1]s nahrál/a %[3]d commit do %[2]s -issue.action.push_n=@%[1]s nahrál/a %[3]d commity do %[2]s +issue.action.push_1=Uživatel @%[1]s nahrál %[3]d revizi do %[2]s +issue.action.push_n=Uživatel @%[1]s nahrál %[3]d revizí do %[2]s issue.action.close=@%[1]s uzavřel/a #%[2]d. issue.action.reopen=@%[1]s znovu otevřel/a #%[2]d. issue.action.merge=@%[1]s sloučil/a #%[2]d do %[3]s. @@ -590,9 +590,9 @@ AuthName=Název ověření AdminEmail=E-mailová adresa správce NewBranchName=Název nové větve -CommitSummary=Shrnutí commity -CommitMessage=Zpráva commitu -CommitChoice=Výběr commitu +CommitSummary=Shrnutí revize +CommitMessage=Zpráva revize +CommitChoice=Výběr revize TreeName=Cesta k souboru Content=Obsah @@ -652,8 +652,8 @@ cannot_add_org_to_team=Organizace nemůže být přidána jako člen týmu. duplicate_invite_to_team=Uživatel byl již pozván jako člen týmu. organization_leave_success=Úspěšně jste opustili organizaci %s. -invalid_ssh_key=Nelze ověřit váš SSH klíč: %s -invalid_gpg_key=Nelze ověřit váš GPG klíč: %s +invalid_ssh_key=Nepodařilo se ověřit váš klíč SSH: %s +invalid_gpg_key=Nepodařilo se ověřit váš klíč GPG: %s invalid_ssh_principal=Neplatný SSH Principal certifikát: %s must_use_public_key=Zadaný klíč je soukromý klíč. Nenahrávejte svůj soukromý klíč nikde. Místo toho použijte váš veřejný klíč. unable_verify_ssh_key=Nepodařilo se ověřit klíč SSH, zkontrolujte, zda neobsahuje chyby. @@ -681,6 +681,8 @@ To = Název větve Biography = Životopis AccessToken = Přístupový token +email_domain_is_not_allowed = Doména uživatelské e-mailové adresy %s je v rozporu se seznamem EMAIL_DOMAIN_ALLOWLIST nebo EMAIL_DOMAIN_BLOCKLIST. Ujistěte se, že je vaše adresa správně nastavena. + [user] change_avatar=Změnit váš avatar… joined_on=Přidal/a se %s @@ -692,7 +694,7 @@ watched=Sledované repozitáře code=Kód projects=Projekty overview=Přehled -following_few=%d sledovaní +following_few=%d sledovaných follow=Sledovat unfollow=Přestat sledovat user_bio=Životopis @@ -714,7 +716,7 @@ follow_blocked_user = Tohoto uživatele nemůžete sledovat, protože jste si je block = Zablokovat unblock = Odblokovat followers_one = %d sledující -following_one = %d následuje +following_one = %d sledovaný followers.title.one = Sledující followers.title.few = Sledující following.title.one = Sleduje @@ -747,7 +749,7 @@ webauthn=Dvoufázové ověření (bezpečnostní klíče) public_profile=Veřejný profil biography_placeholder=Řekněte ostatním něco o sobě! (Je podporován Markdown) location_placeholder=Sdílejte svou přibližnou polohu s ostatními -profile_desc=Nastavte, jak bude váš profil zobrazen ostatním uživatelům. Vaše hlavní e-mailová adresa bude použita pro oznámení, obnovení hesla a operace Git. +profile_desc=O vás password_username_disabled=Externí uživatelé nemohou měnit svoje uživatelské jméno. Kontaktujte prosím svého administrátora pro více detailů. full_name=Celé jméno website=Web @@ -767,7 +769,7 @@ language=Jazyk ui=Motiv vzhledu hidden_comment_types=Skryté typy komentářů hidden_comment_types_description=Zde zkontrolované typy komentářů nebudou zobrazeny na stránkách problémů. Zaškrtnutí „Štítek“ například odstraní všechny komentáře „ přidal/odstranil pour vérifier la signature de l'index : alpine.registry.info=Choisissez $branch et $repository dans la liste ci-dessous. alpine.install=Pour installer le paquet, exécutez la commande suivante : -alpine.repository=Informations sur le Dépôt +alpine.repository=Informations sur le dépôt alpine.repository.branches=Branches alpine.repository.repositories=Dépôts alpine.repository.architectures=Architectures @@ -3682,7 +3709,7 @@ conda.install=Pour installer le paquet en utilisant Conda, exécutez la commande container.details.type=Type d'image container.details.platform=Plateforme container.pull=Tirez l'image depuis un terminal : -container.digest=Empreinte : +container.digest=Empreinte container.multi_arch=SE / Arch container.layers=Calques d'image container.labels=Labels @@ -3693,7 +3720,7 @@ cran.install=Pour installer le paquet, exécutez la commande suivante : debian.registry=Configurez ce registre à partir d'un terminal : debian.registry.info=Choisissez $distribution et $component dans la liste ci-dessous. debian.install=Pour installer le paquet, exécutez la commande suivante : -debian.repository=Infos sur le Dépôt +debian.repository=Infos sur le dépôt debian.repository.distributions=Distributions debian.repository.components=Composants debian.repository.architectures=Architectures @@ -3797,6 +3824,7 @@ arch.version.conflicts = Conflits arch.version.replaces = Remplace arch.version.backup = Sauvegarde arch.version.makedepends = Faire des dépendances +container.images.title = Images [secrets] secrets=Secrets @@ -3918,6 +3946,8 @@ runs.expire_log_message = Les journaux ont été purgés car ils étaient trop a runs.no_workflows.help_write_access = Vous ne savez pas par où commencer avec Forgejo Actions ? Regardez la section démarrage rapide dans la documentation utilisateur pour écrire votre premier workflow, puis mettre en place un Forgejo runner pour exécuter vos jobs. runs.no_workflows.help_no_write_access = Pour en savoir plus sur Forgejo Actions, consultez la documentation. +variables.not_found = La variable n'a pas été trouvée. + [projects] type-1.display_name=Projet personnel type-2.display_name=Projet du dépôt @@ -3945,7 +3975,7 @@ keyword_search_unavailable = La recherche par mot-clé n'est pas disponible actu fuzzy_tooltip = Inclure les résultats proches des termes recherchés match = Correspondance match_tooltip = Uniquement inclure les résultats correspondant exactement aux termes recherchés -repo_kind = Chercher dans les dépôt... +repo_kind = Chercher dans les dépôts... user_kind = Chercher les utilisateurs... org_kind = Chercher les organisations... team_kind = Chercher les équipes... diff --git a/options/locale/locale_gl.ini b/options/locale/locale_gl.ini index 4a10ee8b61..e21fe78186 100644 --- a/options/locale/locale_gl.ini +++ b/options/locale/locale_gl.ini @@ -8,15 +8,15 @@ sign_in = Iniciar sesión sign_in_with_provider = Iniciar Sesión con %s sign_in_or = ou sign_out = Pechar Sesión -sign_up = Rexístrate +sign_up = Rexistrarse link_account = Vincular conta register = Rexistro -version = Vesión -powered_by = Desenvolvido por %s +version = Versión +powered_by = Impulsado por %s page = Páxina template = Modelo notifications = Notificacións -active_stopwatch = Activar Rastrexador de Tempo +active_stopwatch = Rastreador de tempo activo create_new = Crear… user_profile_and_more = Perfil e configuración… signed_in_as = Sesión iniciada como @@ -31,8 +31,8 @@ re_type = Confirme o contrasinal captcha = CAPTCHA twofa = Autenticación de dobre factor passcode = Código de acceso -webauthn_insert_key = Insira a súa clave de seguridade -webauthn_press_button = Prema o botón da súa clave de seguridade… +webauthn_insert_key = Insira a súa chave de seguridade +webauthn_press_button = Prema o botón da súa chave de seguridade… webauthn_use_twofa = Use o Código de Dous Factores do seu Teléfono webauthn_error = Non se puido ler a súa clave de seguridade. webauthn_unsupported_browser = O seu navegador non soporta WebAuthn actualmente. @@ -102,7 +102,7 @@ copy_content = Copiar contido language = Linguaxe copy_hash = Copiar hash twofa_scratch = Código Scratch de Dous Factores -webauthn_sign_in = Prema o botón da súa clave de seguridade. Se a súa clave de seguridade non ten ningún botón, insíraa de novo. +webauthn_sign_in = Prema o botón da súa chave de seguridade. Se a súa chave de seguridade non ten ningún botón, volva inserila. issues = Incidencias disabled = Desactivado error404 = A páxina á que estás tentando acceder non existe ou non tes autorización para vela. @@ -163,6 +163,8 @@ number_of_contributions_in_the_last_12_months = %s de contribucións nos último contributions_few = contribucións contributions_one = contribución +contributions_format = {contributions} no {day} de {month} do {year} + [editor] buttons.heading.tooltip = Engadir Título buttons.italic.tooltip = Engade texto en cursiva @@ -176,6 +178,19 @@ buttons.disable_monospace_font = Desactivar o tipo de letra monoespazo buttons.ref.tooltip = Referencia un problema ou pull request +buttons.list.ordered.tooltip = Engade unha lista numerada +buttons.list.task.tooltip = Engade unha lista de tarefas +buttons.mention.tooltip = Menciona a un usuario ou equipo +buttons.switch_to_legacy.tooltip = Utilizar o editor herdado +buttons.indent.tooltip = Aniña os elementos nun nivel +buttons.unindent.tooltip = Desaniñar os elementos nun nivel +buttons.new_table.tooltip = Engadir táboa +table_modal.header = Engadir táboa +table_modal.placeholder.header = Cabeceira +table_modal.placeholder.content = Contido +table_modal.label.rows = Filas +table_modal.label.columns = Columnas + [search] search = Buscar... type_tooltip = Tipo de procura @@ -196,12 +211,22 @@ exact = Exacta exact_tooltip = Incluír só resultados correspondentes ao termo exacto da procura issue_kind = Procurar incidencias... +project_kind = Buscar proxectos... +branch_kind = Buscar ramas... +commit_kind = Buscar achegas... +runner_kind = Buscar executores... +no_results = Non se atoparon resultados coincidentes. +pull_kind = Buscar pulls... +keyword_search_unavailable = A busca por palabra clave non está dispoñible actualmente. Póñase en contacto co administrador do sitio. + [startpage] platform = Multiplataforma app_desc = Um servizo Git autoxestionado e fácil de usar install = Fácil de instalar install_desc = Simplemente executa o binario para a túa plataforma, envíao con Docker ou consígueo empaquetado. +license = Código aberto + [error] occurred = Ocorreu un erro missing_csrf = Solicitude incorrecta: non hai ningún token CSRF presente @@ -244,4 +269,26 @@ sqlite_helper = Ruta do ficheiro para a base de datos SQLite3.
Introduza unha reinstall_confirm_message = A reinstalación cunha base de datos Forgejo existente pode causar varios problemas. Na maioría dos casos, deberías usar o teu "app.ini" existente para executar Forgejo. Se sabes o que estás facendo, confirma o seguinte: reinstall_confirm_check_1 = É posible que se perdan os datos cifrados pola SECRET_KEY en app.ini: é posible que os usuarios non poidan iniciar sesión con 2FA/OTP e que os espellos non funcionen correctamente. Ao marcar esta caixa, confirmas que o ficheiro app.ini actual contén a SECRET_KEY correcta. disable_gravatar.description = Desactiva o uso de Gravatar ou outras fontes de avatares de terceiros. As imaxes predeterminadas utilizaranse para os avatares dos usuarios a menos que carguen o seu propio avatar na instancia. -federated_avatar_lookup = Activar avatares federados \ No newline at end of file +federated_avatar_lookup = Activar avatares federados +install = Instalación +title = Configuración inicial +db_title = Configuración da base de datos +db_type = Tipo de base de datos +user = Nome de usuario +password = Contrasinal +db_name = Nome da base de datos +db_schema = Esquema +db_schema_helper = Déixao baleiro para a base de datos por defecto ("public"). +general_title = Opcións xerais +app_name = Título da instancia +app_name_helper = Escribe o nome da túa instancia aqui. Será amosado en cada páxina. +app_slogan = Slogan da instancia +app_slogan_helper = Escribe o slogan da túa instancia aqui. Ou deixao baleiro para desabilitala. +repo_path = Ruta raíz do repositorio +repo_path_helper = Os repositorios Git remotos gardaránse neste directorio. +lfs_path = Ruta raíz de Git LFS +run_user = O usuario co que executar +domain = Dominio do servidor +ssh_port = Porto do servidor SSH +mailer_user = Usuario SMTP +mailer_password = Contrasinal SMTP \ No newline at end of file diff --git a/options/locale/locale_he.ini b/options/locale/locale_he.ini new file mode 100644 index 0000000000..ef2c701b64 --- /dev/null +++ b/options/locale/locale_he.ini @@ -0,0 +1,661 @@ +[common] +home = בית +dashboard = מבט על +help = עזרה +logo = לוגו +sign_in = כניסה +sign_in_with_provider = כניסה דרך %s +sign_in_or = או +sign_out = יציאה מהחשבון +sign_up = הרשמה +link_account = חיבור חשבון +register = הרשמה +version = גרסה +powered_by = רץ על %s +page = דף +template = תבנית +language = שפה +notifications = הודעות +active_stopwatch = סטופר +create_new = חדש… +user_profile_and_more = פרופיל והגדרות… +signed_in_as = שלום +enable_javascript = אתר זה משתמש בJavaScript. +toc = תוכן הענינים +licenses = רישיונות +return_to_forgejo = חזרה לפורג'ו +more_items = עוד אפשרויות +username = שם משתמש +email = כתובת אימייל +password = סיסמה +access_token = קוד גישה +captcha = CAPTCHA +twofa = אימות דו־שלבי +twofa_scratch = קוד אימות דו־שלבי +passcode = קוד כניסה +webauthn_insert_key = יש להכניס את מפתח אבטחך +webauthn_sign_in = יש ללחוץ על הכפתור שעל מפתח האבטחה. אם אין כפתור, אפשר להוציא את המפתח ולחבר אותו שוב. +webauthn_press_button = נא ללחוץ על הכפתור שעל מפתח האבטחה… +webauthn_error = קריאת מפתח האבטחה נכשלה. +webauthn_unsupported_browser = הדפדפן שלך לא תומך בWebAuthn. +webauthn_error_unknown = שגיאה לא ידועה, אפשר לנסות שוב. +webauthn_error_insecure = הפרוטוקול WebAuthn לא תומך בחיבורים לא מאובטחים, למעט דרך "localhost" או "127.0.0.1" +webauthn_error_unable_to_process = שרת זה נכשל בעיבוד בקשתך. +webauthn_error_duplicated = מפתח האבטחה לא יכול לשמש לבקשה זו. נא לוודא שהמפתח לא רשום. +webauthn_error_empty = שם המפתח הוא שדה חובה. +webauthn_error_timeout = קריאת מפתחך לקחה יותר מדי זמן. אפשר לטעון מחדש את הדף ולנסות שוב. +repository = קרפיף +organization = ארגון +mirror = מראה +new_mirror = מראה חדשה +new_fork = מזלוג חדש של קרפיף זה +new_project = פרויקט חדש +new_project_column = עמודה חדשה +admin_panel = לוח ניהול מערכת +settings = הגדרות +your_profile = פרופיל +your_starred = כיכבת +your_settings = הגדרות +new_repo.title = קרפיף חדש +new_migrate.title = יבוא קרפיף +new_org.title = ארגון חדש +new_repo.link = קרפיף חדש +new_migrate.link = יבוא קרפיף +new_org.link = ארגון חדש +all = הכל +sources = מקורות +mirrors = מראות +collaborative = שיתופי +forks = מזלוגים +activities = פעילויות +pull_requests = בקשות מיזוג +issues = סוגיות +milestones = מטרות +ok = אישור +cancel = ביטול +retry = לנסות שוב +rerun = הרצה חוזרת +save = שמירה +add = הוספה +add_all = הוספת הכל +remove = הסרה +remove_all = הסרת הכל +remove_label_str = הסרת "%s" +edit = עריכה +test = בדיקה +enabled = מופעל +disabled = כבוי +locked = נעול +copy = העתקה +copy_generic = העתקה לCtrl + C +copy_url = העתקת קישור +copy_hash = העתקת קוד גיבוב +copy_path = העתקת מיקום קובץ +copy_content = העתקת תוכן +copy_branch = העתקת שם ענף +copy_success = הועתק! +copy_error = העתקה נכשלה +copy_type_unsupported = אי אפשר להעתיק קבצים מסוג זה +write = כתיבה +preview = תצוגה מקדימה +loading = נטען… +error = שגיאה +error404 = דף זה לא קיים או שאין לך אילו גישה. +go_back = אחורה +invalid_data = הבנת הקלט נכשלה: %v +never = אף פעם +unknown = לא ידוע +rss_feed = פיד RSS +pin = הצמדה +unpin = ביטול הצמדה +archived = ארכיון +concept_system_global = גלובלי +concept_user_individual = אישי +concept_code_repository = קרפיף +concept_user_organization = ארגון +show_timestamps = הצגת זמנים +show_log_seconds = הצגת שניות +show_full_screen = מסך מלא +download_logs = הורדת לוגים +confirm_delete_selected = למחוק את כל הפריטים המסומנים? +name = שם +value = ערך +filter = מסנן +filter.clear = ניקוי מסננים +filter.is_archived = בארכיון +filter.not_archived = מחוץ לארכיון +filter.is_fork = רק מזלוגים +filter.not_fork = להוציא מזלוגים +filter.is_mirror = רק מראות +filter.not_mirror = להוציא מראות +filter.is_template = רק תבניות +filter.not_template = להוציא תבניות +filter.public = ציבורי +filter.private = פרטי + +explore = קטלוגים +toggle_menu = הצגת\הסתרת תפריט +re_type = סיסמה (שוב) +view = עוד מידע +artifacts = ארטיפקטים +confirm_delete_artifact = למחוק את הארטיפקט "%s"? + +[search] +search = חיפוש... +type_tooltip = סוג חיפוש +fuzzy = מקורב +fuzzy_tooltip = תוצאות יתאימו לתוכן תיבת החיפוש בקירוב; מומלץ כנגד שגיאות כתיב +union = מילות מפתח +union_tooltip = תוצאות יכללו לפחות מילת מפתח אחת; אפשר להפריד מילות מפתח עם רווחים +exact = מדויק +exact_tooltip = תוצאות יתאימו במדויק לתוכן תיבת החיפוש +regexp = רג'קס +repo_kind = חיפוש קרפיפים... +user_kind = חיפוש אנשים... +org_kind = חיפוש ארגונים... +team_kind = חיפוש צוותים... +code_kind = חיפוש קוד... +code_search_unavailable = חיפוש קוד לא זמין. נא לדווח למנהלי המערכת. +package_kind = חיפוש חבילות... +project_kind = חיפוש פרוייקטים... +branch_kind = חיפוש ענפים... +commit_kind = חיפוש קומיטים... +runner_kind = חיפוש מריצים... +no_results = לא נמצאו תוצאות. +issue_kind = חיפוש סוגיות... +keyword_search_unavailable = חיפוש מילות מפתח לא זמין. נא לדווח למנהלי המערכת. + +pull_kind = חיפוש בקשות מיזוג... + +[aria] +navbar = סרגל הניווט +footer.software = על תוכנה זו +footer.links = קישורים + +footer = סיומת עמוד + +[heatmap] +number_of_contributions_in_the_last_12_months = % תרומות ב־12 החודשים האחרונים +contributions_zero = אפס תרומות +contributions_format = {contributions} ב{day} ל{month} {year} +contributions_one = תרומה +contributions_few = תרומות +less = פחות +more = יותר + +[editor] +buttons.heading.tooltip = הוספת כותרת +buttons.bold.tooltip = הדגשת טקסט +buttons.italic.tooltip = הטיית טקסט +buttons.quote.tooltip = ציטוט +buttons.code.tooltip = הוספת קוד +buttons.link.tooltip = הוספת קישור +buttons.list.unordered.tooltip = הוספת רשימה לא ממוספרת +buttons.list.ordered.tooltip = הוספת רשימה ממוספרת +buttons.list.task.tooltip = הוספת רשימת משימות +buttons.mention.tooltip = תיוג אדם או צוות +buttons.ref.tooltip = ריפרור לסוגיה או בקשת מיזוג +buttons.switch_to_legacy.tooltip = מעבר לעורך הישן +buttons.enable_monospace_font = הפעלת גופן קבוע־רוחב +buttons.disable_monospace_font = כיבוי גופן קבוע־רוחב +buttons.new_table.tooltip = הוספת טבלה +table_modal.header = הוספת טבלה +table_modal.placeholder.header = כותרת +table_modal.placeholder.content = תוכן +table_modal.label.rows = שורות +table_modal.label.columns = עמודות + +[filter] +string.asc = סדר אלפבתי עולה +string.desc = סדר אלפבתי יורד + +[error] +occurred = קרתה שגיאה +not_found = המטרה לא נמצאה. +network_error = שגיאת אינטרנט +server_internal = שגיאת שרת פנימית + +[startpage] +install = קל להתקנה +lightweight = קל +license = קוד פתוח + +platform_desc = פורג'ו רץ על מערכות הפעלה פתוחות כמו לינוקס וFreeBSD, ועל ארכיטקטורות מעבד שונות. +lightweight_desc = פורג'ו צורך כמות מינימלית של משאבים ויכול לרוץ על מיני־מחשבים לא יקרים כמו הראספרי הפיי. + +[install] +install = התקנה +title = הגדרה ראשונית +db_title = הגדרות מסד מידע +db_type = סוג מסד מידע +user = שם משתמש +password = סיסמה +db_name = שם מסד המידע +db_schema = סכימה +db_schema_helper = תוכן ריק משמע ערך ברירת המחדל ("public") של מסד המידע. +ssl_mode = SSL +err_empty_admin_password = סיסמה של מנהל מערכת לא יכולה להיות ריקה. +err_empty_admin_email = כתובת אימייל של מנהל מערכת היא חובה. +general_title = הגדרות כלליות +app_name = שם שרת זה + +require_db_desc = פורג'ו דורש MySQL, PostgreSQL, או TiDB (דרך פרוטוקול MySQL). +err_empty_db_path = הכתובת למסד המידע SQLite3 לא יכולה להיות ריקה. +no_admin_and_disable_registration = אי אפשר לחסום הרשמה עצמית בלי ליצור חשבון מנהל מערכת. +err_admin_name_is_reserved = שם משתמש חשבון המערכת לא זמין, שם המשתמש שמור +err_admin_name_pattern_not_allowed = שם משתמש מנהל המערכת לא זמין, שם המשתמש עונה על תבנית שמורה +err_admin_name_is_invalid = שם משתמש מנהל המערכת לא זמין +app_name_helper = שם האתר נכנס כאן. הוא יוצג בכל מקום באתר, בצד ימין למעלה (או באנגלית, שמאל למעלה). +app_slogan = סלוגן האתר +app_slogan_helper = סלוגן האתר נכנס כאן. פורג'ו יתעלם מסלוגן ריק. +run_user = משתמש שפורג'ו ירוץ תחת +run_user_helper = שם המשתמש של משתמש מערכת ההפעלה שפורג'ו ירוץ תחתיו. למשתמש חייבת להיות גישה לקרפיפים. +domain = דומיין השרת +domain_helper = דומיין או host address לשרת זה. +ssh_port = פורט שרת ה־SSH +ssh_port_helper = מספר הפורט ששרת ה־SSH ישתמש בו. ערך ריק יכבה את התמיכה ב־SSH. +http_port = פורט ה־HTTP (האזנה) +http_port_helper = הפורט שישמש את דף האינטרנט (זה שדפדפני אינטרנט ניגשים אליו). +app_url = כתובת (URL) בסיס +log_root_path = כתובת לוגינג +log_root_path_helper = יומנים (logfiles) ייוצאו לתיקייה זו. +optional_title = הגדרות לא חובה +email_title = הגדרות אימייל +smtp_addr = שרת SMTP +smtp_port = פורט SMTP +smtp_from = אימיילים ישלחו כ־ +smtp_from_helper = כתובת האימייל שפורג'ו ישלח ממנה הודעות למשתמשים. אפשר להכניס כתובת אמייל פשוטה או להישמתש בפורמט "שם" <אימייל@דוגמה.קום>. +mailer_user = שם משתמש בשרת ה־SMTP +mailer_password = סיסמת שרת ה־SMTP +register_confirm = אישור אימייל חובה לרישום +mail_notify = הפעלת נוטיפיקציות דרך אימייל +server_service_title = הגדרות שרת ושירותים צד שלישי +offline_mode = הפעלת מצב לוקאלי +offline_mode.description = CDN־ים צד שלישי יושבתו וכל המשאבים יוגשו מהמחשב הנוכחי, ללא גישה לאינטרנט. +disable_gravatar = השבתת Gravatar +disable_gravatar.description = שימוש בגראווטאר, או כל מקור צד־שלישי אחר לתמונות פרופיל, יושבת. אלא אם כן לחשבון יש תמונה שהועלתה ידנית, פורג'ו ישתמש בתמונות ברירת המחדל הלוקאליות. +federated_avatar_lookup = הפעלת תמונות פרופיל מבוזרות +disable_registration = השבתת הרשמה עצמית +disable_registration.description = רק מנהלי מערכת יוכלו ליצור חשבונות משתמש חדשים. מאוד לא מומלץ להפעיל הרשמה עצמית אלא אם כן בכוונתך ליצור שרת ציבורי, דבר הכולל התעסקות בכמויות עצומות של ספאם והתקפות DDoS. +allow_only_external_registration = אפשור הרשמה רק דרך שירותים חיצוניים +allow_only_external_registration.description = חשבונות חדשים לא יכולו להיווצר לוקאלית, אלא רק דרך שירותים צד־שלישי שקונפגו מראש. +openid_signin = הפעלת כניסה דרך OpenID +openid_signup = הפעלת הרשמה עצמית דרך OpenID +openid_signup.description = חשבונות יוכלו להיווצר דרך OpenID אם הרשמה עצמית מופעלת. +enable_captcha = הפעלת CAPTCHA בתהליך הרישום +enable_captcha.description = כדי ליצור חשבונות חדשים, יהיה צריך לעבור אתגר CAPTCHA (טוב כנגד ספאם ובוטים; פוגע בנגישות ופחות אפקטיבי כנגד AI מודרני). +require_sign_in_view = שרת פרטי +require_sign_in_view.description = גישה לתוכן השרת תיחסם ללא כניסה לחשבון, למעט דפי הרישום והכניסה. +default_keep_email_private = הסתרת כתובות אימייל כברירת מחדל +default_keep_email_private.description = כתובות האימייל של חשבונות חדשים לא יוצגו על הפרופילים הציבוריים שלהם (אלא אם כן ישנו זאת בעצמם), כדי למנוע זליגה של מידע פרטי מיד לאחר ההרשמה. +default_allow_create_organization = אפשור יצירת ארגונים כברירת מחדל +default_allow_create_organization.description = חשבונות חדשים יוכלו ליצור ארגונים ללא אישור מנהל המערכת. +default_enable_timetracking = הפעלת מדידת זמן כברירת מחדל +default_enable_timetracking.description = תכונת מדידת הזמן של פורג'ו תופעל לקרפיפים חדשים כברירת מחדל. +admin_title = הגדרות חשבון מנהל מערכת +admin_setting.description = יצירת חשבון מנהל המערכת היא לא חובה; ללא חשבון מורשה, החשבון הראשון שיווצר יקבל הרשאות אדמיניסטרציה. +admin_name = שם משתמש של מנהל מערכת +admin_password = סיסמה +confirm_password = סיסמה (שוב) +admin_email = כתובת אימייל +config_location_hint = הגדרות אלו ישמרו ב־: +install_btn_confirm = סיום התקנת פורג'ו +test_git_failed = בדיקת פקודת "git" נכשלה: %v +sqlite3_not_available = גרסת פורג'ו זו לא תומכת ב־SQLite3. נא להוריד את הארטיפקט הרשמי מ %s (*לא* את גרסת ה"gobuild"). +invalid_db_setting = הגדרות מסד המידע שגויות: %v +invalid_db_table = טבלת מסד המידע "%s" שגויה: %v + +[mail] +issue_assigned.pull = @%[1]s שייך אותך לבקשת המיזוג %[2]s בקרפיף %[3]s. +issue_assigned.issue = @%[1]s שייך אותך לסוגיה %[2]s בקרפיף %[3]s. +repo.transfer.subject_to = %s רוצה להעביר את הקרפיף "%s" ל־%s +repo.transfer.subject_to_you = %s רוצה להעביר את הקרפיף "%s" אליך +repo.collaborator.added.text = הוספת בתור פועל לקרפיף: + +[form] +RepoName = שם קרפיף +repo_name_been_taken = כבר יש קרפיף בשם זה. +repository_force_private = פרטיות כפויה מופעלת: קרפיפים פרטיים לא יכולים להעשות ציבוריים. +repository_files_already_exist = כבר יש קבצים בקרפיף זה. יש לדבר עם מנהל המערכת כדי לתקן את הבעיה. +AccessToken = קוד גישה +Content = תוכן +SSPIDefaultLanguage = שפת ברירת מחדל + +[home] +uname_holder = שם משתמש או כתובת אימייל +my_repos = קרפיפים +my_orgs = ארגונים +filter = מסננים אחרים +filter_by_team_repositories = סינון לפי קרפיפי צוות +feed_of = פיד של "%s" +show_archived = בארכיון +show_both_archived_unarchived = כולל גם מתוך וגם מחוץ הארכיון +show_only_archived = כולל רק מהארכיון +show_only_unarchived = לא כולל את הארכיון +show_private = פרטי +issues.in_your_repos = בקרפיפיך + +[explore] +repos = קרפיפים +users = אנשים +stars_one = כוכב אחד +stars_few = %d כוכבים +forks_one = מזלוג אחד +forks_few = %d מזלוגים +organizations = ארגונים +code = קוד +code_last_indexed_at = אונדקס לאחרונה %s +relevant_repositories_tooltip = מזלוגים וקרפיפים ללא תיאור, נושא, וסמל לא מוצגים. +relevant_repositories = רק קרפיפים רלוונטים מוצגים; אפשר להציג תוצאות לא מסוננות. + +[auth] +create_new_account = הרשמה +disable_register_prompt = הרשמה מושבתת. יש לדבר עם מנהלי המערכת. +disable_register_mail = אישור הרשמה דרך אימייל מושבת. +manual_activation_only = יש לדבר עם מנהלי המערכת כדי להשלים את הפעלת חשבונך. +remember_me = זה המכשיר שלי ואני רוצה לשמור עליו את הסיסמה שלי לפעם הבאה +forgot_password_title = שכחתי את הסיסמה +forgot_password = שכחת את הסיסמה? +hint_login = כבר יש לך חשבון? כניסה +hint_register = אין לך חשבון? הרשמה +sign_up_button = הרשמה +sign_up_successful = החשבון נוצר בהצלחה. ברוכים הבאים! +must_change_password = עדכן סיסמתך +allow_password_change = הכרחת המשתמש לעדכן את סיסמת חשבונו (מומלץ) +active_your_account = הפעלת חשבונך +account_activated = חשבונך הופעל +prohibit_login = חשבונך הושעה +prohibit_login_desc = חשבנוך הושעה משרת זה. אפשר לבקש ממנהלי המערכת לתת לך גישה. +resent_limit_prompt = כבר ביקשת מייל אימות בשלושת הדקות האחרונות. נא לחכות ולנסות שוב. +has_unconfirmed_mail = שלום %s, חשבונך משויך לכתובת אימייל לא מאומתת (%s). אם לא קיבלת הודעת אימות באימייל, או שאתה צריך חדשה, נא ללחוץ על הכפתור למטה. +change_unconfirmed_email = אם נתת את כתובת האימייל הלא נכונה כשנרשמת, אפשר לשנות אותה כאן, ומייל אימות חדש ישלח לכתובת החדשה. +change_unconfirmed_email_error = שינוי כתובת האימייל כשל: %v +resend_mail = שליחת מייל אימות חדש +send_reset_mail = שליחת מייל שחזור חשבון +reset_password = שחזור חשבון +invalid_code = קוד האימות שלך לא תקף, או שעבר יותר מדי זמן מאז שהונפק. +invalid_code_forgot_password = קוד האימות שלך לא תקף, או שעבר יותר מדי זמן מאז שהונפק. אפשר לנסות שוב. +invalid_password = הסיסמה לא תואמת את הסיסמה שאיתה יצרת את חשבונך. +reset_password_helper = שחזור חשבון +reset_password_wrong_user = נכנסת כ־%s, אבל הקישור נועד לשחזור החשבון של %s +password_too_short = הסיסמה חייבת להיות באורך %d תווים ומעלה. +non_local_account = חשבונות א־לוקאליים לא יכולים לעדכן את סיסמתם דרך אתר האינטרנט של פורג'ו. +verify = אימות +use_onetime_code = שימוש בקוד חד־פעמי + +[settings] +update_avatar = עדכון תמונת פרופיל +delete_current_avatar = מחיקת תמונת הפרופיל הנוכחית +uploaded_avatar_not_a_image = הקובץ שהועלה לא תמונה. +key_name = שם המפתח +key_content = תוכן +principal_content = תוכן +add_key_success = מפתח ה־SSH "%s" הוסף לחשבונך. +add_gpg_key_success = מפתח ה־GPG "%s" הוסף לחשבונך. +delete_key = הסרה +ssh_key_deletion = הסרת מפתח SSH +gpg_key_deletion = הסרת מפתח GPG +ssh_key_deletion_desc = הסרת מפתח SSH מבטלת את גישתו לחשבונך. להמשיך? +gpg_key_deletion_desc = הסרת מפתח GPG הופכת קומיטים שנחתמו בעזרתו ללא־מאומתים. להמשיך? +ssh_key_deletion_success = מפתח ה־SSH הוסר מחשבונך. +gpg_key_deletion_success = מפתח ה־GPG הוסר מחשבונך. +added_on = הוסף ב־%s +valid_until_date = תקף עד ה־%s +valid_forever = תקף לנצח +last_used = שומש לאחרונה ב +can_read_info = קריאה +can_write_info = שינוי +key_state_desc = מפתח זה שומש בשבוע האחרון +show_openid = הצגה על פרופילך +hide_openid = הסתרה מפרופילך +ssh_disabled = SSH מושבת +ssh_signonly = SSH מושבת; מפתחות אלו ישמשו רק כדי לחתום קומיטים. +ssh_externally_managed = מפתח SSH זה מנוהל חיצונית +manage_access_token = קודי גישה +generate_new_token = קוד גישה חדש +token_name = שם קוד הגישה +generate_token_success = קוד הגישה החדש נוצר, ולא יוצג שוב. +generate_token_name_duplicate = כבר קיימת אפליקציה בשם %s. +delete_token = מחיקה +access_token_deletion = מחיקת קוד גישה +access_token_deletion_desc = אפליקציות שמשתמשות בקוד הגישה הזה לא יוכלו לגשת לחשבון שלך יותר. זוהי פעולה בלתי־הפיכה. להמשיך? +delete_token_success = קוד הגישה נמחק. אפליקציות שהשתמשו בו לא יכולות לגשת לחשבון שלך יותר. +repo_and_org_access = גישה לקרפיפים וארגונים +permissions_public_only = ציבורי בלבד +permissions_access_all = הכל (ציבורי, פרטי, מוגבל) +select_permissions = בחירת הרשאות +permission_no_access = שום גישה +permission_read = קריאה +permission_write = קריאה ושינוי +at_least_one_permission = קודי גישה צריכים לפחות הרשאה אחת +permissions_list = הרשאות: +manage_oauth2_applications = ניהול אפליקציות OAuth2 +edit_oauth2_application = עריכת אפליקצית OAuth2 +remove_oauth2_application = הסרת אפליקצית OAuth2 +remove_oauth2_application_success = האפליקציה נמחקה. +create_oauth2_application = יצירת אפליקציית OAuth2 חדשה +create_oauth2_application_button = יצירת אפליקציה +create_oauth2_application_success = יצרת אפליקציית OAuth2 חדשה בהצלחה. +update_oauth2_application_success = ערכת אפליקציית OAuth2 בהצלחה. +oauth2_application_name = שם האפליקציה +oauth2_redirect_uris = קישורי הפניה מחדש. כל קישור בשורה משל עצמו. +save_application = שמירה +oauth2_application_edit = עריכה +revoke_key = הסרת גישה +revoke_oauth2_grant = הסרת גישה +delete_account = מחיקת החשבון +delete_prompt = פעולה זו בלתי הפיכה ותמחוק את החשבון שלך לחלוטין. +delete_with_all_comments = חשבונך נוצר לפני פחות מ־%s; כל התגובות שלך (לסוגיות, בקשות מיזוג, וכולי) ימחקו. +confirm_delete_account = כן, אני רוצה למחוק את החשבון שלי +delete_account_title = מחייקת חשבון משתמש +delete_account_desc = למחוק את חשבון משתמש זה לנצח? +email_notifications.enable = הפעלת הודעות אימייל +email_notifications.onmention = שליחת אימיילים רק עבור אזכור (mention\ping) מפורש +email_notifications.disable = השבתת הודעות אימייל +email_notifications.submit = בחירת אימייל מועדף +visibility = סוג חשבון +visibility.public = ציבורי +visibility.public_tooltip = נגיש לכולם +visibility.limited = מוגבל +visibility.limited_tooltip = נגיש רק למי שיש לו חשבון +visibility.private = פרטי +visibility.private_tooltip = נגיש רק למי שחבר בארגון שאתה חלק ממנו +blocked_since = חסום כבר %s +user_unblock_success = החסימה בוטלה. +user_block_success = המשתמש נחסם. + +[repo] +new_from_template = קרפיף חדש מתבנית +new_advanced = הגדרות מתקדמות +new_advanced_expand = +owner = בעלים +owner_helper = ארגונים שכבר יצרו את כמות הקרפיפים המקסימלית לא מוצגים בתפריט. +repo_name = שם הקרפיף +repo_name_helper = שמות קרפיפים טובים הם זכירים, קצרים וייחודיים. +fork_repo = מזלוג +already_forked = כבר מזלגת את %s +fork_to_different_account = מזלוג לחשבון אחר +fork_branch = הענף שיועתק למזלוג +all_branches = כל הענפים +fork_no_valid_owners = קרפיף זה לא משויך לבעלים תקפים; אי אפשר למזלגו. +use_template = קרפיף חדש מתבנית זו +open_with_editor = פתיחה עם %s +download_zip = הורדה כ־.zip +download_tar = הורדה כ־.tag.gz +repo_desc = תיאור +repo_desc_helper = תיאור קצר (לא חובה) +repo_lang = שפה +repo_gitignore_helper = תבנית .gitignore +repo_gitignore_helper_desc = מאילו קבצים גיט יתעלם. התפריט כולל רשימות קבצים המשויכות לשפות או ספריות נפוצות. ארטיפקטים טיפוסיים כלולים ב.gitignore כברירת מחדל. +issue_labels = תוויות +issue_labels_helper = תוויות לדוגמה נפוצות ומומלצות שאפשר להתאים לדרישות הפרויקט הספציפי +license = רישיון +license_helper_desc = רישיונות מכתיבות מה אחרים יכולים ולא יכולים לעשות עם הקוד שלך. איך לבחור רישיון? +object_format = אלגוריתם גיבוב +object_format_helper = אלגוריתם הגיבוב שהקרפיף ישתמש בו. אי אפשר לשנות את הבחירה הזו. ל־SHA1 התאימות הטובה ביותר עם תוכנות אחרות. +readme = קרא־אותי +readme_helper = תבנית קובץ קרא־אותי (README) +readme_helper_desc = כאן אפשר לכתוב את התיאור המלא של הפרויקט שלך, וכל דבר שברצונך שאנשים ידעו עליו. +auto_init = תיחול הקרפיף +auto_init_description = פורג'ו מאפשר להוסיף קבצי קרא־אותי, .gitignore, ורשיונות בקומיט הראשון של הקרפיף שלך. +create_repo = קרפיף חדש +default_branch = ענף ברירת המחדל +default_branch_label = ברירת מחדל +mirror_public_key = מפתח SSH ציבורי +mirror_use_ssh.helper = פורג'ו ישקף את הקרפיף דרך התמיכה המובנית של גיט ב־SSH, ויצור בשבילך זוג מפתחות אוטומטית. באחריותך לוודא שלמפתח הציבורי שיווצר יהיה גישה לקרפיף היעד. אי אפשר להשתמש בכניסה על־בסיס סיסמה עם אפשרות זו. +mirror_use_ssh.not_available = אימות על־בסיס SSH לא זמין. +mirror_denied_combination = אי אפשר להשתמש באימות על־בסיס גם סיסמה וגם מפתח ציבורי; חובה לבחור רק באפשרות אחת. +mirror_sync = מסונכרן +mirror_sync_on_commit = סנכרון כשקומיטים מגיעים לשרת המקומי +mirror_address = שכפול מכתובת אינטרנט (URL) +mirror_lfs = אחסון קבצים גדולים (LFS) +mirror_lfs_desc = שיקוף אחסון קבצים גדולים (LFS) +mirror_last_synced = סונכרן לאחרונה +watchers = מנויים +stargazers = מככבים +stars_remove_warning = פעולה זו תסיר מהקרפיף את כל הכוכבים. +forks = מיזלוגים +stars = כוכבים +reactions_more = ועוד %d +unit_disabled = מנהלי המערכת השביתו תכונת קרפיף זאת. +language_other = אחרת +adopt_preexisting_content = קרפיף חדש מ־‏%s +delete_preexisting_label = מחיקה +delete_preexisting = מחיקת קבצים קיימים +delete_preexisting_content = מחיקת קבצים ב־%s +author_search_tooltip = מקסימום 30 חשבונות מוצגים +summary_card_alt = קלף תקציר הקרפיף %s +tree_path_not_found_commit = הכתובת %[1]s לא קיימת בקומיט %[2]s +tree_path_not_found_branch = הכתובת %[1]s לא קיימת בענף %[2]s +tree_path_not_found_tag = הכתובת %[1]s לא קיימת בתגית %[2]s +transfer.accept = אישור העברת הקרפיף +transfer.accept_desc = העברה ל "%s" +transfer.reject = דחיית העברת הקרפיף +transfer.reject_desc = ביטול העברת הקרפיף ל־"%s" +transfer.no_permission_to_accept = אין לך הרשאה לאשר את העברת הקרפיף הזו. +transfer.no_permission_to_reject = אין לך הרשאה לדחות את העברת הקרפיף הזו. +desc.private = פרטי +desc.public = ציבורי +desc.template = תבנית +desc.internal = פנימי +desc.archived = בארכיון +template.webhooks = Webhook־ים +template.topics = נושאים +form.reach_limit_of_creation_1 = החשבון של הבעלים כבר הגיע לכמות הקרפיפים המקסימלית (אחד). +form.reach_limit_of_creation_n = החשבון של הבעלים כבר הגיע לכמות הקרפיפים המקסימלית (%s). +form.name_reserved = שם הקרפיף "%s" שמור. +form.name_pattern_not_allowed = התבנית "%s" לא חוקית בתוך שם של קרפיף. +form.string_too_long = הטקסט הנתון ארוך מ־%d תווים. +migrate_options = אפשרויות ייבוא +migrate_options_mirror_helper = קרפיף זה יהיה מראה +migrate_options_lfs = ייבוא אחסון קבצים גדולים (LFS) +migrate_items_wiki = ויקי +migrate_items_milestones = אבני דרך +migrate_items_labels = תוויות +migrate_items_issues = סוגיות +migrate_items_pullrequests = בקשות מיזוג +migrate_items_releases = גרסאות +migrate_repo = ייבוא קרפיף +migrate.clone_address = ייבוא \ שכפול מ־URL +migrate.permission_denied = אין לך הרשאה לייבא קרפיפים מהשרת הנוכחי. +migrate.failed = הייבוא נכשל: %v +migrate.migrate_items_options = פורג'ו צריך קוד גישה כדי לייבא מידע נוסף +migrated_from = יובא מ‏־%[2]s +migrated_from_fake = יובא מ־%[1]s +migrate.migrate = יבוא מ־%s +migrate.migrating = פורג'ו בתהליכי יבוא מ־%s... +migrate.migrating_failed = היבוא מ%s נכשל. +migrate.migrating_failed.error = הייבוא נכשל: %s +migrate.migrating_failed_no_addr = הייבוא נכשל. +migrate.github.description = ייבוא מידע מ־github.com או שרת GitHub Enteprise. +migrate.git.description = ייבוא קרפיף מכל שירות גיט שהוא. +migrate.gitlab.description = ייבוא מידע מ־gitlab.com או משרתי GitLab אחרים. +migrate.forgejo.description = ייבוא מידע מקודברג או שרת פורג'ו אחר. +migrate.gitea.description = ייבוא מידע מ־gitea.com או שרת גיטאה אחר. +migrate.gogs.description = ייבוא מידע מ־notabug.org או שרת גוגס אחר. +migrate.onedev.description = ייבוא מידע מ־code.onedev.io או שרת OneDev אחר. +migrate.codebase.description = ייבוא מידע מ־codebasehq.com. +migrate.gitbucket.description = יבוא מידע משרת GitBucket. +migrate.migrating_git = ייבוא הקרפיף עצמו +migrate.migrating_topics = ייבוא נושאים +migrate.migrating_milestones = ייבוא אבני דרך +migrate.migrating_labels = ייבוא תוויות +migrate.migrating_releases = ייבוא גרסאות +editor.delete_this_file = מחיקת קובץ +editor.file_delete_success = הקובץ "%s" נמחק. +editor.name_your_file = שם הקובץ… +editor.filename_help = אפשר להפריד בין תיקיות עם סלאשים, ו"למחוק" תיקיות עם backspace, כאילו זוהי תיבת טקסט רגילה. +editor.or = או +editor.cancel_lower = ביטול +editor.add_tmpl = הוספת "<%s>" +editor.add_tmpl.filename = שם הקובץ +editor.add = הוספתי את %s +editor.update = עידכנתי את %s +editor.delete = מחקתי את %s +editor.commit_message_desc = תיאור ארוך לא חובה… +editor.propose_file_change = הצעת השינוי +editor.new_branch_name = שם הענף שאליו הקומיט ידחף +editor.new_branch_name_desc = שם הענף החדש… +editor.cancel = ביטול +editor.filename_cannot_be_empty = שם הקובץ לא יכול להיות ריק. +editor.filename_is_invalid = שם הקובץ לא תקין: "%s". +editor.invalid_commit_mail = כתובת אימייל זו לא חוקית למטרות יצירת קומיטים. +editor.branch_does_not_exist = הענף "%s" לא קיים בקרפיף זה. +editor.branch_already_exists = הענף "%s" כבר קיים בקרפיף זה. +editor.directory_is_a_file = אי אפשר ליצור את התיקייה "%s"; כבר קיים קובץ תחת אותו שם. +editor.filename_is_a_directory = אי אפשר לקרוא לקובץ "%s"; כבר קיימת תיקייה תחת אותו שם. +editor.file_editing_no_longer_exists = הקובץ הנערך שהיה ידוע כ־"%s" לא קיים יותר בקרפיף זה. +editor.file_deleting_no_longer_exists = מחיקת הקובץ שהיה ידוע כ־"%s" נכשלה; הקובץ לא קיים יותר בקרפיף זה. +editor.file_changed_while_editing = תוכן קובץ זה השתנה מאז שהתחלת לערוך. אפשר לראות מה היו השינויים או ליצור את הקומיט שוב כדי לדרוס אותם. +editor.file_already_exists = כבר יש קובץ תחת השם "%s" בקרפיף זה. +editor.commit_id_not_matching = תוכן קובץ זה השתנה מאז שהתחלת לערוך. אפשר לשמור את השינויים לענף חדש ולפתוח בקשת מיזוג במקום. +editor.no_changes_to_show = אין שינויים להציג. +editor.fail_to_update_file = יצירת\שינוי הקובץ "s" נכשלה. +editor.fail_to_update_file_summary = הודעת שגיאה: +editor.push_rejected_summary = הודעת דחייה מלאה: +editor.add_subdir = הוספת תיקייה… +editor.unable_to_upload_files = העלאת הקבצים ל־"%s" נכשלה: %v +editor.upload_file_is_locked = הקובץ "%s" ננעל ע"י %s. +editor.upload_files_to_dir = העלאת קבצים ל"%s" +editor.commit_email = כתובת האימייל המשויכת לקומיט +commits.commits = קומיטים +commits.nothing_to_compare = ענפים אלו זהים. +commits.search_branch = ענף זה +commits.search_all = כל הענפים +commits.author = מחבר +commits.message = מסר +commits.date = תאריך +commits.signed_by = נחתם ע"י +commits.signed_by_untrusted_user = בעל חתימה לא מהימנת +commits.signed_by_untrusted_user_unmatched = בעל חתימה לא מהימנת שלא תואמת את מחבר הקומיט +commits.gpg_key_id = מזהה מפתח ה־GPG +commits.ssh_key_fingerprint = טביעת אצבע מפתח ה־SSH +commitstatus.error = שגיאה +commitstatus.failure = כישלון +commitstatus.pending = בתהליכים +commitstatus.success = הצלחה +ext_issues = סוגיות חיצוניות +projects = פרויקטים +projects.desc = פרויקטים עוזרים בניהול וארגון סוגיות ובקשות מיזוג. +projects.description = תיאור (לא חובה) +projects.description_placeholder = תיאור... +projects.create = פרויקט חדש +projects.title = כותרת +projects.new = פרויקט חדש +issues.create = סוגייה חדשה +issues.edit = עריכה +issues.cancel = ביטול +issues.save = שמירה +issues.label_title = שם +issues.label_description = תיאור +issues.label_color = צבע +issues.label_exclusive = בחירה בודדת +issues.label_archive = לארכיון +issues.label_archived_filter = הצגת תוויות מהארכיון +issues.label_archive_tooltip = תוויות בארכיון לא מוצעות בחיפוש על־בסיס תווית כברירת מחדל. + +[projects] +deleted.display_name = פרויקט נמחק + +[translation_meta] +test = ואהבת לרעך כמוך diff --git a/options/locale/locale_hu-HU.ini b/options/locale/locale_hu-HU.ini index 57555b90a2..411bad835a 100644 --- a/options/locale/locale_hu-HU.ini +++ b/options/locale/locale_hu-HU.ini @@ -1270,6 +1270,8 @@ topic.done=Kész +milestones.filter_sort.name = Név + [graphs] [org] @@ -1684,6 +1686,9 @@ config.cache_item_ttl = Gyorsítótárelem TTL értéke config.app_data_path = Alkalmazásadatok elérési útja +config_summary = Összefoglaló +config_settings = Beállítások + [action] create_repo=létrehozott tárolót: %s rename_repo=átnevezte a(z) %[1]s tárolót %[3]s-ra/re diff --git a/options/locale/locale_id-ID.ini b/options/locale/locale_id-ID.ini index 1e0044e4ce..db1344aec6 100644 --- a/options/locale/locale_id-ID.ini +++ b/options/locale/locale_id-ID.ini @@ -84,15 +84,92 @@ concept_code_repository=Repositori name=Nama +re_type = Konfirmasi Kata Sandi +webauthn_insert_key = Masukkan kunci keamanan anda +webauthn_sign_in = Tekan tombol pada kunci keamanan Anda. Jika kunci keamanan Anda tidak memiliki tombol, masukkan kembali. +webauthn_press_button = Silakan tekan tombol pada kunci keamanan Anda… +webauthn_use_twofa = Gunakan kode dua faktor dari telepon Anda +webauthn_error = Tidak dapat membaca kunci keamanan Anda. +webauthn_unsupported_browser = Browser Anda saat ini tidak mendukung WebAuthn. +webauthn_error_unknown = Terdapat kesalahan yang tidak diketahui. Mohon coba lagi. +webauthn_error_insecure = `WebAuthn hanya mendukung koneksi aman. Untuk pengujian melalui HTTP, Anda dapat menggunakan "localhost" atau "127.0.0.1"` +webauthn_error_unable_to_process = Server tidak dapat memproses permintaan Anda. +webauthn_error_duplicated = Kunci keamanan tidak diperbolehkan untuk permintaan ini. Pastikan bahwa kunci ini belum terdaftar sebelumnya. +webauthn_error_empty = Anda harus menetapkan nama untuk kunci ini. +webauthn_error_timeout = Waktu habis sebelum kunci Anda dapat dibaca. Mohon muat ulang halaman ini dan coba lagi. +new_project = Proyek Baru +new_project_column = Kolom Baru +ok = Oke +retry = Coba lagi +rerun = Jalankan ulang +rerun_all = Jalankan ulang semua job +remove_label_str = `Hapus item "%s"` +view = Tampilan +test = Pengujian +locked = Terkunci +copy = Salin +copy_url = Salin URL +copy_hash = Salin hash +copy_content = Salin konten +copy_branch = Salin nama branch +copy_success = Tersalin! +copy_error = Gagal menyalin +copy_type_unsupported = Tipe berkas ini tidak dapat disalin +error = Gangguan +go_back = Kembali +invalid_data = Data invalid: %v +never = Tidak Pernah +unknown = Tidak diketahui +rss_feed = Umpan Berita +pin = Sematkan +unpin = Lepas sematan +artifacts = Artefak +archived = Diarsipkan +concept_system_global = Global +concept_user_individual = Perorangan +show_full_screen = Tampilkan layar penuh +download_logs = Unduh Logs +confirm_delete_selected = Konfirmasi untuk menghapus semua item yang dipilih? +value = Nilai +filter = Saring +filter.is_archived = Diarsipkan +filter.not_archived = Tidak Diarsipkan +filter.public = Publik +filter.private = Pribadi + [aria] +navbar = Bar Navigasi +footer = Footer +footer.links = Tautan [heatmap] +number_of_contributions_in_the_last_12_months = %s Kontribusi pada 12 bulan terakhir +less = Lebih sedikit +more = Lebih banyak [editor] +buttons.heading.tooltip = Tambahkan heading +buttons.bold.tooltip = Tambahkan teks Tebal +buttons.italic.tooltip = Tambahkan teks Miring +buttons.quote.tooltip = Kutip teks +buttons.code.tooltip = Tambah Kode +buttons.link.tooltip = Tambahkan tautan +buttons.list.unordered.tooltip = Tambah daftar titik +buttons.list.ordered.tooltip = Tambah daftar angka +buttons.list.task.tooltip = Tambahkan daftar tugas +buttons.mention.tooltip = Tandai pengguna atau tim +buttons.ref.tooltip = Merujuk pada isu atau permintaan tarik +buttons.switch_to_legacy.tooltip = Gunakan editor versi lama +buttons.enable_monospace_font = Aktifkan font monospace +buttons.disable_monospace_font = Non-Aktifkan font monospace [filter] +string.asc = A - Z +string.desc = Z - A [error] +occurred = Terjadi kesalahan +not_found = Target tidak dapat ditemukan. [startpage] app_desc=Sebuah layanan hosting Git sendiri yang tanpa kesulitan @@ -124,6 +201,9 @@ require_sign_in_view=Harus Login Untuk Melihat Halaman admin_password=Kata Sandi admin_email=Alamat Email +email_title = Pengaturan email +smtp_from = Kirim Email Sebagai + [home] uname_holder=Nama Pengguna atau Alamat Surel password_holder=Kata Sandi @@ -141,6 +221,8 @@ show_private=Pribadi issues.in_your_repos=Dalam repositori anda +show_archived = Diarsipkan + [explore] repos=Repositori users=Pengguna @@ -492,6 +574,8 @@ email_notifications.submit=Pasang Pengaturan Email visibility.private=Pribadi +visibility.public = Publik + [repo] owner=Pemilik repo_name=Nama Repositori @@ -955,6 +1039,12 @@ branch.deleted_by=Dihapus oleh %s +desc.public = Publik +desc.archived = Diarsipkan +commitstatus.error = Gangguan +projects.new = Proyek Baru +milestones.filter_sort.name = Nama + [graphs] [org] @@ -1009,6 +1099,8 @@ teams.delete_team_success=Tim sudah di hapus. teams.repositories=Tim repositori teams.search_repo_placeholder=Cari repositori… +settings.visibility.public = Publik + [admin] dashboard=Dasbor organizations=Organisasi @@ -1267,6 +1359,9 @@ notices.op=Op. notices.delete_success=Laporan sistem telah dihapus. +config_settings = Pengaturan +users.list_status_filter.menu_text = Saring + [action] create_repo=repositori dibuat %s rename_repo=ganti nama gudang penyimpanan dari %[1]s ke %[3]s @@ -1342,6 +1437,56 @@ runs.commit=Memperbuat +runs.no_matching_online_runner_helper = Tidak ada runner online yang cocok dengan label: %s +runs.actor = Aktor +runs.status = Status +runs.actors_no_select = Semua aktor +runs.status_no_select = Semua status +runs.no_results = Tidak ada hasil yang cocok. +runs.no_workflows = Belum ada alur kerja. +runs.no_runs = Alur kerja belum berjalan. +runs.empty_commit_message = (pesan commit kosong) +workflow.disable = Nonaktifkan Alur Kerja +workflow.enable = Aktifkan Alur Kerja +workflow.disabled = Alur kerja dinonaktifkan. +need_approval_desc = Butuh persetujuan untuk menjalankan alur kerja untuk pull request fork. +variables = Variabel +variables.creation = Tambah Variabel +variables.none = Belum ada variabel. +variables.deletion = Hapus variabel +variables.deletion.description = Menghapus variabel bersifat permanen dan tidak dapat dibatalkan. Lanjutkan? +variables.description = Variabel akan diteruskan ke beberapa tindakan dan tidak dapat dibaca sebaliknya. +variables.id_not_exist = Variabel dengan ID %d tidak ada. +variables.edit = Edit Variabel +variables.deletion.failed = Gagal menghapus variabel. +variables.deletion.success = Variabel telah dihapus. +variables.creation.failed = Gagal menambahkan variabel. +variables.creation.success = Variabel "%s" telah ditambahkan. +variables.update.failed = Gagal mengedit variabel. +variables.update.success = Variabel telah diedit. + [projects] +type-1.display_name = Proyek Individu +type-2.display_name = Proyek Repositori +type-3.display_name = Proyek Organisasi [git.filemode] +changed_filemode = %[1]s → %[2]s +directory = Directory +normal_file = Normal file +executable_file = Executable file +symbolic_link = Symbolic link +submodule = Submodule + +[search] +search = Cari... +type_tooltip = Tipe pencarian +fuzzy_tooltip = Termasuk juga hasil yang mendekati kata pencarian +exact_tooltip = Hanya menampilkan hasil yang cocok dengan istilah pencarian +repo_kind = Cari repo... +user_kind = Telusuri pengguna... +org_kind = Cari organisasi... +team_kind = Cari tim... +code_kind = Cari kode... +code_search_unavailable = Pencarian kode saat ini tidak tersedia. Silahkan hubungi administrator. +branch_kind = Cari cabang... diff --git a/options/locale/locale_is-IS.ini b/options/locale/locale_is-IS.ini index 3a6e844de2..9b1d56fed9 100644 --- a/options/locale/locale_is-IS.ini +++ b/options/locale/locale_is-IS.ini @@ -114,6 +114,10 @@ value=Gildi sign_in_with_provider = Skrá inn með %s enable_javascript = Þessi síða krefst JavaScript. +filter = Sía +filter.is_archived = Safnvistað +filter.public = Opinbert + [aria] [heatmap] @@ -1118,6 +1122,8 @@ topic.done=Í lagi +milestones.filter_sort.name = Heiti + [graphs] [org] @@ -1287,6 +1293,9 @@ notices.type_2=Verkefni notices.desc=Lýsing +config_summary = Yfirlit +config_settings = Stillingar + [action] create_issue=`opnaði vandamál %[3]s#%[2]s` reopen_issue=`enduropnaði vandamál %[3]s#%[2]s` @@ -1371,3 +1380,5 @@ runs.commit=Framlag [projects] [git.filemode] + +[search] diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini index fa5853c92e..c5582bbf99 100644 --- a/options/locale/locale_it-IT.ini +++ b/options/locale/locale_it-IT.ini @@ -167,6 +167,8 @@ new_org.title = Nuova organizzazione new_migrate.link = Nuova migrazione new_org.link = Nuova organizzazione +copy_path = Copia percorso + [aria] footer.links = Collegamenti navbar = Barra di navigazione @@ -200,6 +202,13 @@ buttons.disable_monospace_font = Disattiva font monospace buttons.indent.tooltip = Annida elementi di un livello buttons.unindent.tooltip = Disannida elementi di un livello +buttons.new_table.tooltip = Aggiungi tabella +table_modal.header = Aggiungi tabella +table_modal.placeholder.header = Intestazione +table_modal.placeholder.content = Contenuto +table_modal.label.rows = File +table_modal.label.columns = Colonne + [filter] string.asc = A - Z string.desc = Z - A @@ -220,7 +229,7 @@ platform=Multipiattaforma lightweight=Leggero lightweight_desc=Forgejo ha requisiti minimi bassi e può funzionare su un economico Raspberry Pi. Risparmia l'energia della tua macchina! license=Open Source -license_desc=Ottieni Forgejo! Partecipa per contribuire a rendere questo progetto ancora migliore. Non aver paura di diventare un collaboratore! +license_desc=Ottieni Forgejo! Partecipa per contribuire a rendere questo progetto ancora più bello. Non aver paura di diventare collaborante! install_desc = Semplicemente avvia l'eseguibile per la tua piattaforma, distribuiscilo con Docker, oppure scarica il pacchetto. [install] @@ -511,11 +520,11 @@ issue.action.push_n=@%[1]s ha immesso %[3]d commit presso %[2]s issue.action.close=@%[1]s chiuso #%[2]d. issue.action.reopen=@%[1]s riaperto #%[2]d. issue.action.merge=@%[1]s unito #%[2]d in %[3]s. -issue.action.approve=@%[1]s ha approvato questa pull request. -issue.action.reject=@%[1]s ha richiesto modifiche su questa pull request. -issue.action.review=@%[1]s ha commentato questa pull request. -issue.action.review_dismissed=@%[1]s ha respinto l'ultima recensione da %[2]s per questa pull request. -issue.action.ready_for_review=@%[1]s ha contrassegnato questa pull request pronta per la revisione. +issue.action.approve=@%[1]s ha approvato questa richiesta di modifica. +issue.action.reject=@%[1]s ha richiesto modifiche su questa richiesta. +issue.action.review=@%[1]s ha commentato questa richiesta di modifica. +issue.action.review_dismissed=@%[1]s ha respinto l'ultima revisione di %[2]s per questa richiesta di modifica. +issue.action.ready_for_review=@%[1]s ha contrassegnato questa richiesta di modifica come pronta per la revisione. issue.action.new=@%[1]s creato #%[2]d. issue.in_tree_path=In %s: @@ -532,8 +541,8 @@ repo.transfer.subject_to_you=%s ti vorrebbe trasferire il repositorio "%s" repo.transfer.to_you=tu repo.transfer.body=Per accettare o respingerla visita %s o semplicemente ignorarla. -repo.collaborator.added.subject=%s ti ha aggiunto a %s come collaboratorə -repo.collaborator.added.text=Sei statə aggiuntə come collaboratorə al repositorio: +repo.collaborator.added.subject=%s ti ha aggiunto a %s come collaborante +repo.collaborator.added.text=Sei statə aggiuntə come collaborante al repositorio: reply = o rispondi direttamente a questa email admin.new_user.subject = Il nuovo utente %s si è appena registrato admin.new_user.user_info = Informazioni utente @@ -690,7 +699,7 @@ joined_on = Membro dal %s block_user = Blocca utente block_user.detail_1 = Questo utente non ti seguirà più. block_user.detail_2 = Quest'utente non potrà interagire né con i tuoi repositori, né con le segnalazioni che hai aperto, né con i tuoi commenti. -block_user.detail_3 = Non sarete in grado di aggiungervi come collaboratorɜ del repositorio. +block_user.detail_3 = Non sarete in grado di aggiungervi come collaboranti del repositorio. code = Codice block = Blocca unblock = Sblocca @@ -762,7 +771,7 @@ comment_type_group_lock=Stato blocco comment_type_group_review_request=Richiesta di revisione comment_type_group_pull_request_push=Commit aggiunti comment_type_group_project=Progetto -comment_type_group_issue_ref=Riferimento del problema +comment_type_group_issue_ref=Riferimento alla segnalazione saved_successfully=Le impostazioni sono state salvate correttamente. privacy=Privacy keep_activity_private_popup=La tua attività sarà visibile solo a te e agli amministratori dell'istanza @@ -1029,7 +1038,7 @@ oauth2_application_locked = Forgejo preregistra alcune applicazioni OAuth2 all'a hooks.desc = Aggiungi richiami HTTP che saranno innescati per tutti i progetti che possiedi. repos_none = Non possiedi alcun progetto. blocked_users_none = Non ci sono utenti bloccati. -keep_email_private_popup = Questo nasconderà il tuo indirizzo e-mail nel tuo profilo, nelle pull request e quando modifichi un file usando l'interfaccia web. I commit inoltrati non saranno modificati. Usa %s nei commit per associarli al tuo profilo. +keep_email_private_popup = Questo nasconderà il tuo indirizzo e-mail nel tuo profilo, nelle richieste di modifica e quando modifichi un file usando l'interfaccia web. I commit inoltrati non saranno modificati. Usa %s nei commit per associarli al tuo profilo. verify_gpg_key_success = La chiave GPG "%s" è stata verificata. added_on = Aggiunto su %s additional_repo_units_hint = Suggerisci l'attivazione di unità aggiuntive nel repositorio @@ -1189,7 +1198,7 @@ migrate.migrating_failed_no_addr=Migrazione non riuscita. migrate.github.description=Migrare i dati da github.com o da server GitHub Enterprise. migrate.git.description=Migra un repositorio solo da qualsiasi servizio Git. migrate.gitlab.description=Migrare i dati da gitlab.com o da altre istanze di GitLab. -migrate.gitea.description=Migrare i dati da gitea.com o altre istanze di Gitea/Forgejo. +migrate.gitea.description=Migrare i dati da gitea.com o altre istanze di Gitea. migrate.gogs.description=Migrare i dati da notabug.org o da altre istanze Gogs. migrate.onedev.description=Migrare i dati da code.onedev.io o da altre istanze OneDev. migrate.codebase.description=Migrare i dati da codebasehq.com. @@ -1338,8 +1347,8 @@ commits.date=Data commits.older=Più vecchio commits.newer=Più recente commits.signed_by=Firmato da -commits.signed_by_untrusted_user=Firmato da un utente non attendibile -commits.signed_by_untrusted_user_unmatched=Firmato da un utente non attendibile che non corrisponde al committer +commits.signed_by_untrusted_user=Firmato da un*utente non attendibile +commits.signed_by_untrusted_user_unmatched=Firmato da un*utente non attendibile che non corrisponde al committente commits.gpg_key_id=ID chiave GPG commits.ssh_key_fingerprint=Impronta chiave SSH @@ -1400,8 +1409,8 @@ issues.new.open_projects=Apri progetti issues.new.closed_projects=Progetti chiusi issues.new.no_items=Nessun elemento issues.new.milestone=Traguardo -issues.new.no_milestone=Nessuna pietra miliare -issues.new.clear_milestone=Milestone pulita +issues.new.no_milestone=Nessun traguardo +issues.new.clear_milestone=Rimuovi traguardo issues.new.open_milestone=Traguardi aperti issues.new.closed_milestone=Traguardi chiusi issues.new.assignees=Assegnatari @@ -1411,7 +1420,7 @@ issues.new.no_reviewers=Nessun revisore issues.choose.get_started=Cominciare issues.choose.open_external_link=Apri issues.choose.blank=Default -issues.choose.blank_about=Crea un problema dal modello predefinito. +issues.choose.blank_about=Crea una segnalazione dal modello predefinito. issues.no_ref=Nessun ramo/etichetta specificati issues.create=Crea segnalazione issues.new_label=Nuova etichetta @@ -1429,7 +1438,7 @@ issues.remove_labels=rimosso le %s etichette %s issues.add_remove_labels=aggiunto %s e rimosso %s etichette %s issues.add_milestone_at=`aggiunta alle pietre miliari %s %s` issues.add_project_at=`aggiunto questo al progetto %s %s` -issues.change_milestone_at=`pietra miliare modificata da %s a %s %s` +issues.change_milestone_at=`ha modificato il traguardo da %s a %s %s` issues.change_project_at=`ha modificato il progetto da %s a %s %s` issues.remove_milestone_at=`rimossa dalle pietre miliari %s %s` issues.remove_project_at=`rimosso questo dal progetto %s %s` @@ -1477,13 +1486,13 @@ issues.filter_sort.fewestforks=Minor numero di fork issues.action_open=Apri issues.action_close=Chiuso issues.action_label=Etichetta -issues.action_milestone=Pietra Miliare -issues.action_milestone_no_select=Nessuna pietra miliare +issues.action_milestone=Traguardo +issues.action_milestone_no_select=Nessun Traguardo issues.action_assignee=Assegnatario issues.action_assignee_no_select=Nessun assegnatario issues.opened_by=aperta %[1]s da %[3]s -pulls.merged_by=di %[3]s è stato fuso %[1]s -pulls.merged_by_fake=di %[2]s è stato fuso %[1]s +pulls.merged_by=di %[3]s è stata fusa %[1]s +pulls.merged_by_fake=di %[2]s è stata fusa %[1]s issues.closed_by=di %[3]s è stato chiuso %[1]s issues.opened_by_fake=aperta %[1]s da %[2]s issues.closed_by_fake=di %[2]s è stato chiuso %[1]s @@ -1504,14 +1513,14 @@ issues.close_comment_issue=Commenta e chiudi issues.reopen_issue=Riapri issues.reopen_comment_issue=Commenta e riapri issues.create_comment=Commento -issues.closed_at=`chiuso questo probleam %[2]s` +issues.closed_at=`ha chiuso questa segnalazione %[2]s` issues.reopened_at=`ha riaperto questa segnalazione %[2]s` issues.commit_ref_at=`ha fatto riferimento a questa segnalazione dal commit %[2]s` issues.ref_issue_from=`ha fatto riferimento a questa segnalazione %[4]s %[2]s` issues.ref_pull_from=`ha fatto riferimento a questa richiesta di modifica %[4]s %[2]s` issues.ref_closing_from=`ha fatto riferimento a questa segnalazione da una richiesta di modifica %[4]s che la chiuderà, %[2]s` issues.ref_reopening_from=`ha fatto riferimento a questa segnalazione da una richiesta di modifica %[4]s che la riaprirà, %[2]s` -issues.ref_closed_from=`chiuso questo problema %[4]s %[2]s` +issues.ref_closed_from=`chiuso questa segnalazione %[4]s %[2]s` issues.ref_reopened_from=`ha riaperto questa segnalazione %[4]s %[2]s` issues.ref_from=`da %[1]s` issues.author=Autore @@ -1549,32 +1558,32 @@ issues.subscribe=Iscriviti issues.unsubscribe=Annulla iscrizione issues.lock=Blocca conversazione issues.unlock=Sblocca conversazione -issues.lock.unknown_reason=Impossibile bloccare un problema con un motivo sconosciuto. +issues.lock.unknown_reason=Impossibile bloccare una segnalazione senza un motivo. issues.lock_duplicate=Un issue non può essere bloccato due volte. -issues.unlock_error=Impossibile sbloccare un problema che non è bloccato. -issues.lock_with_reason=ha bloccato come %s e limitato la conversazione ai collaboratori %s -issues.lock_no_reason=ha bloccato e limitato la conversazione ai collaboratori %s +issues.unlock_error=Impossibile sbloccare una segnalazione che non è bloccata. +issues.lock_with_reason=ha bloccato come %s e limitato la conversazione allɜ collaboranti %s +issues.lock_no_reason=ha bloccato e limitato la conversazione allɜ collaboranti %s issues.unlock_comment=ha sbloccato questa conversazione %s issues.lock_confirm=Blocca issues.unlock_confirm=Sblocca issues.lock.notice_1=- Altri utenti non possono aggiungere nuovi commenti a questa segnalazione. -issues.lock.notice_2=- Tu e altri collaboratori con accesso a questo repository potete ancora lasciare commenti che altri possono vedere. -issues.lock.notice_3=- Puoi sempre sbloccare questo problema in futuro. -issues.unlock.notice_1=- Tutti potranno commentare nuovamente questo problema. -issues.unlock.notice_2=- Puoi sempre chiudere nuovamente questo problema in futuro. +issues.lock.notice_2=- Tu e altrɜ collaboranti con accesso a questo repositorio potete ancora lasciare commenti visibili da altre persone. +issues.lock.notice_3=- Puoi sempre sbloccare questa segnalazione in futuro. +issues.unlock.notice_1=- Tuttɜ potranno commentare nuovamente questa segnalazione. +issues.unlock.notice_2=- Puoi sempre chiudere nuovamente questa segnalazione in futuro. issues.lock.reason=Motivo per il blocco issues.lock.title=Blocca la conversazione su questa issue. issues.unlock.title=Sblocca la conversazione su questa issue. -issues.comment_on_locked=Non puoi commentare un problema bloccato. +issues.comment_on_locked=Non puoi commentare una segnalazione bloccata. issues.delete=Elimina -issues.delete.title=Eliminare questo problema? -issues.delete.text=Vuoi davvero eliminare questo problema? (Questo rimuoverà permanentemente tutti i contenuti. Considera invece di chiuderlo, se vuoi tenerlo archiviato) +issues.delete.title=Eliminare la segnalazione? +issues.delete.text=Vuoi davvero eliminare la segnalazione? (Questo rimuoverà permanentemente tutti i contenuti. Considera invece di chiuderla, se vuoi tenerla archiviata) issues.tracker=Cronografo issues.start_tracking_short=Avvia timer issues.start_tracking=Avvia cronografo issues.start_tracking_history=ha iniziato a lavorare %s -issues.tracker_auto_close=Il timer verrà interrotto automaticamente una volta che il problema verrá chiuso -issues.tracking_already_started=`Hai già avviato il monitoraggio del tempo su un altro problema!` +issues.tracker_auto_close=Il timer verrà fermato automaticamente quando questa segnalazione verrà chiusa +issues.tracking_already_started=`Hai già avviato il monitoraggio del tempo su un'altra segnalazione!` issues.stop_tracking=Ferma timer issues.stop_tracking_history=`ha smesso di funzionare %s` issues.cancel_tracking=Scarta @@ -1620,16 +1629,16 @@ issues.dependency.pr_closing_blockedby=Questa richiesta di modifica non può ess issues.dependency.issue_closing_blockedby=Questa segnalazione non può essere chiusa per via delle seguenti segnalazioni issues.dependency.issue_close_blocks=Questa segnalazione impedisce la chiusura delle seguenti segnalazioni issues.dependency.pr_close_blocks=Questa richiesta di modifica impedisce la chiusura delle seguenti segnalazioni -issues.dependency.issue_close_blocked=Devi chiudere tutte le anomalie che bloiccano questo problema prima di chiudelo. +issues.dependency.issue_close_blocked=Vanno chiuse tutte le segnalazioni che bloccano quest'ultima, prima di poterla chiudere. issues.dependency.pr_close_blocked=Chiudere tutte le anomalie che bloccano la richiesta di pull prima di effettaure il merge. issues.dependency.blocks_short=Blocchi issues.dependency.blocked_by_short=Dipende da issues.dependency.remove_header=Rimuovi Dipendenza issues.dependency.issue_remove_text=Questo rimuoverà la dipendenza da questa issue. Continuare? -issues.dependency.pr_remove_text=Questo rimuoverà la dipendenza da questa pull request. Continuare? +issues.dependency.pr_remove_text=Questo rimuoverà la dipendenza da questa richiesta di modifica. Continuare? issues.dependency.setting=Abilita le dipendenze per segnalazioni e richieste di modifica -issues.dependency.add_error_same_issue=Non si può fare dipendere un problema da se stesso. -issues.dependency.add_error_dep_issue_not_exist=Il problema dipendente non esiste. +issues.dependency.add_error_same_issue=Non si può fare dipendere una segnalazione da se stessa. +issues.dependency.add_error_dep_issue_not_exist=La segnalazione dalla quale dipende non esiste. issues.dependency.add_error_dep_not_exist=La dipendenza non esiste. issues.dependency.add_error_dep_exists=La dipendenza esiste già. issues.dependency.add_error_cannot_create_circular=Non puoi creare una dipendenza con due segnalazioni che si bloccano a vicenda. @@ -1671,7 +1680,7 @@ issues.reference_link=Riferimento: %s compare.compare_base=base compare.compare_head=confronta -pulls.desc=Attiva pull request e revisioni di codice. +pulls.desc=Attiva richieste di modifica e revisioni del codice. pulls.new=Nuova richiesta di modifica pulls.view=Visualizza richiesta di modifica pulls.compare_changes=Nuova richiesta di modifica @@ -1698,17 +1707,17 @@ pulls.change_target_branch_at=`cambiato il ramo di destinazione da %s a < pulls.tab_conversation=Conversazione pulls.tab_commits=Commit pulls.tab_files=File modificati -pulls.reopen_to_merge=Riapri questa pull request per effettuare l'unione. -pulls.cant_reopen_deleted_branch=Questa richiesta di modifica non può essere riaperta perché il ramo è stato eliminato. +pulls.reopen_to_merge=Riapri questa richiesta di modifica per poter fondere. +pulls.cant_reopen_deleted_branch=Questa richiesta di modifica non può essere riaperta in quanto il ramo è stato eliminato. pulls.merged=Unito pulls.manually_merged=Unito manualmente pulls.is_closed=La richiesta di modifica è stata chiusa. -pulls.title_wip_desc=`Inizia il titolo con %s per evitare che la pull request venga unita accidentalmente.` -pulls.cannot_merge_work_in_progress=Questa pull request è contrassegnata come un lavoro in corso. +pulls.title_wip_desc=`Inizia il titolo con %s per evitare che la richiesta di modifica venga fusa accidentalmente.` +pulls.cannot_merge_work_in_progress=Questa richiesta di modifica è contrassegnata come lavori in corso. pulls.still_in_progress=Ancora in corso? pulls.add_prefix=Aggiungi prefisso %s pulls.remove_prefix=Rimuovi il prefisso %s -pulls.data_broken=Questa pull request è rovinata a causa di informazioni mancanti del fork. +pulls.data_broken=Questa richiesta di modifica è rovinata a causa di informazioni mancanti riguardo la derivazione. pulls.files_conflicted=Questa richiesta di modifica va in conflitto con il ramo di destinazione. pulls.is_checking=Verifica dei conflitti di fusione in corso. Riprova tra qualche istante. pulls.is_ancestor=Questo ramo è già incluso nel ramo di destinazione. Non c'è nulla da fondere. @@ -1716,8 +1725,8 @@ pulls.is_empty=Le modifiche di questo ramo sono già nel ramo di destinazione. Q pulls.required_status_check_failed=Alcuni controlli richiesti non hanno avuto successo. pulls.required_status_check_missing=Mancano alcuni controlli richiesti. pulls.required_status_check_administrator=Come amministratore, puoi ancora unire questa pull request. -pulls.can_auto_merge_desc=La pull request può essere unita automaticamente. -pulls.cannot_auto_merge_desc=Questa pull request non può essere unita automaticamente a causa di conflitti. +pulls.can_auto_merge_desc=La richiesta di modifica può essere unita automaticamente. +pulls.cannot_auto_merge_desc=Questa richiesta di modifica non può essere unita automaticamente a causa di conflitti. pulls.cannot_auto_merge_helper=Unire manualmente per risolvere i conflitti. pulls.num_conflicting_files_1=%d file in conflitto pulls.num_conflicting_files_n=%d file in conflitto @@ -1729,20 +1738,20 @@ pulls.waiting_count_1=%d in attesa di revisione pulls.waiting_count_n=%d in attesa di revisione pulls.wrong_commit_id=l'ID del commit deve essere un ID del commit nel ramo di destinazione -pulls.no_merge_desc=Questa pull request non può essere unita perché tutte le opzioni di merge del repository sono disattivate. +pulls.no_merge_desc=Questa richiesta di modifica non può essere fusa perché tutte le opzioni di fusione del repositorio sono disattivate. pulls.no_merge_helper=Attiva le opzioni di merge nelle impostazioni del repository o unisci la pull request manualmente. pulls.no_merge_wip=Questa pull request non può essere unita perché è contrassegnata come un lavoro in corso. pulls.no_merge_not_ready=Questa pull request non è pronta per il merge, controlla lo stato della revisione e i controlli di stato. -pulls.no_merge_access=Non sei autorizzato ad effettuare il merge su questa pull request. -pulls.merge_pull_request=Crea commit unito -pulls.rebase_merge_pull_request=Ricostruisci poi manda avanti -pulls.rebase_merge_commit_pull_request=Ricostruisci quindi crea commit unito +pulls.no_merge_access=Non sei autorizzatə a fondere questa richiesta di modifica. +pulls.merge_pull_request=Crea commit di fusione +pulls.rebase_merge_pull_request=Ricostruisci e avanti veloce +pulls.rebase_merge_commit_pull_request=Ricostruisci e crea commit di fusione pulls.squash_merge_pull_request=Crea commit mescolato pulls.merge_manually=Unito manualmente pulls.merge_commit_id=L'ID del commit di merge pulls.require_signed_wont_sign=Il ramo richiede commit firmati ma questa fusione non verrà firmata -pulls.invalid_merge_option=Non puoi utilizzare questa opzione di merge per questa pull request. +pulls.invalid_merge_option=Non è possibile utilizzare l'opzione di fusione selezionata per questa richiesta di modifica. pulls.merge_conflict=Unione non riuscita: C'è stato un conflitto durante l'operazione. Suggerimento: Prova una strategia diversa pulls.merge_conflict_summary=Messaggio d'errore pulls.rebase_conflict=Merge non riuscito: c'è stato un conflitto durante il rebase dell'commit: %[1]s. Suggerimento: Prova una strategia diversa @@ -1771,7 +1780,7 @@ pulls.reopened_at=`ha riaperto questa richiesta di modifica NON PUÒ essere annullata. -settings.delete_notices_2=-Questa operazione eliminerà definitivamente il repository %s inclusi codice, issue, commenti, dati wiki e impostazioni collaboratore. +settings.delete_notices_2=-Questa operazione eliminerà definitivamente il repositorio %s, inclusi codice, segnalazioni commenti, dati della wiki e impostazioni collaboranti. settings.delete_notices_fork_1=-I fork di questo repository diventeranno indipendenti dopo la cancellazione. settings.deletion_success=Il repository è stato eliminato. settings.update_settings_success=Le impostazioni del repository sono state aggiornate. settings.confirm_delete=Elimina progetto -settings.add_collaborator=Aggiungi collaboratore -settings.add_collaborator_success=Il collaboratore è stato aggiunto. -settings.add_collaborator_inactive_user=Non posso aggiungere un utente inattivo come collaboratore. -settings.add_collaborator_duplicate=Il collaboratore è già stato aggiunto a questo repository. +settings.add_collaborator=Aggiungi collaborante +settings.add_collaborator_success=Lə collaborante è statə aggiuntə. +settings.add_collaborator_inactive_user=Non posso aggiungere un*utente inattivə come collaborante. +settings.add_collaborator_duplicate=Lə collaborante è già statə aggiuntə a questo repositorio. settings.delete_collaborator=Rimuovi -settings.collaborator_deletion=Rimuovi collaboratore -settings.collaborator_deletion_desc=Rimuovere un collaboratore revocherà l'accesso a questo repository. Continuare? -settings.remove_collaborator_success=Il collaboratore è stato rimosso. +settings.collaborator_deletion=Rimuovi collaborante +settings.collaborator_deletion_desc=Rimuovere unə collaborante ne revocherà l'accesso a questo repositorio. Continuare? +settings.remove_collaborator_success=Lə collaborante è statə rimossə. settings.search_user_placeholder=Ricerca utente… -settings.org_not_allowed_to_be_collaborator=Le organizzazioni non possono essere aggiunte come un collaboratore. +settings.org_not_allowed_to_be_collaborator=Le organizzazioni non possono essere aggiunte come collaborante. settings.change_team_access_not_allowed=La modifica dell'accesso al team per il repository è stato limitato al solo proprietario dell'organizzazione settings.team_not_in_organization=Il team non è nella stessa organizzazione del repository settings.teams=Gruppi @@ -2409,7 +2418,7 @@ actions = Azioni commit.operations = Operazioni issues.action_check = Seleziona/Deseleziona issues.close = Chiudi segnalazione -issues.role.collaborator = Collaboratore +issues.role.collaborator = Collaborante desc.sha256 = SHA256 editor.add = Aggiungi %s editor.update = Aggiorna %s @@ -2452,7 +2461,7 @@ settings.units.overview = Panoramica all_branches = Tutti i rami projects.column.assigned_to = Assegnato a pulls.cmd_instruction_hint = `Visualizza istruzioni per la riga di comando.` -settings.add_collaborator_blocked_them = Non si può aggiungere il collaboratore perché ha bloccato il proprietario del progetto. +settings.add_collaborator_blocked_them = Non si può aggiungere lə collaborante perché ha bloccato lə proprietariə del progetto. branch.protected_deletion_failed = Il ramo "%s" è protetto. Non può essere eliminato. branch.default_deletion_failed = Il ramo "%s" è il ramo predefinito. Non può essere eliminato. branch.tag_collision = Il ramo "%s" non può essere creato perché esiste già un'etichetta con lo stesso nome nel repositorio. @@ -2566,7 +2575,7 @@ settings.wiki_branch_rename_success = Il nome del ramo della wiki della repo è settings.wiki_branch_rename_failure = Impossibile normalizzare il nome del ramo della wiki della repo. settings.confirm_wiki_branch_rename = Rinomina il ramo della wiki settings.wiki_rename_branch_main_notices_2 = Ciò rinominerà permanentemente il ramo interno della wiki della repo di %s. Passaggi esistenti dovranno essere aggiornati. -settings.add_collaborator_blocked_our = Non si può aggiungere il collaboratore perché il proprietario del progetto lo ha bloccato. +settings.add_collaborator_blocked_our = Non si può aggiungere lə collaborante perché lə proprietariə del progetto l'ha bloccatə. settings.webhook.replay.description_disabled = Per riprodurre questo richiamo HTTP, attivalo. settings.event_wiki_desc = Pagina wiki creata, rinominata, modificata o rimossa. settings.event_pull_request_review_request = Richiesta di modifica revisionata @@ -2609,7 +2618,7 @@ invisible_runes_description = `Questo file contiene caratteri Unicode invisibili issues.filter_type.reviewed_by_you = Revisionati da te projects.edit_success = Il progetto "%s" è stato aggiornato. issues.keyword_search_unavailable = La ricerca per parola chiave non è attualmente disponibile. Contatta l'amministratore del sito. -issues.role.collaborator_helper = Questo utente è stato invitato a collaborare sul progetto. +issues.role.collaborator_helper = Quest*utente è statə invitatə a collaborare al progetto. pulls.commit_ref_at = `ha fatto riferimento a questa richiesta di modifica da un commit %[2]s` settings.thread_id = ID della discussione release.title = Titolo del rilascio @@ -2661,7 +2670,7 @@ settings.branches.add_new_rule = Aggiungi una nuova regola settings.actions_desc = Abilita azioni del progetto settings.new_owner_blocked_doer = Il nuovo proprietario ti ha bloccato. settings.update_settings_no_unit = Ili progetto dovrebbe consentire almeno qualche tipo di interazione. -settings.add_collaborator_owner = Non si può aggiungere un proprietario come collaboratore. +settings.add_collaborator_owner = Non si può aggiungere unə proprietariə come collaborante. branch.delete_desc = L'eliminazione di un ramo è definitiva. Nonostante il ramo eliminato potrebbe continuare ad esistere per un breve periodo di tempo prima di essere realmente eliminato, l'eliminazione NON PUÒ essere annullata in molti casi. Continuare? editor.invalid_commit_mail = Email invalida per creare un commit. editor.branch_does_not_exist = Non esiste nessun ramo "%s" nel repositorio. @@ -2780,9 +2789,9 @@ settings.matrix.access_token_helper = È consigliata l'impostazione di un accoun issues.author.tooltip.issue = Questo utente è l'autore di questa segnalazione. form.string_too_long = La stringa data è più lunga di %d caratteri. project = Progetti -issues.edit.already_changed = Impossibile salvare le modifiche al problema. Sembra che il contenuto sia già stato modificato da un altro utente. Aggiornare la pagina e provare a modificare nuovamente per evitare di sovrascrivere le modifiche +issues.edit.already_changed = Impossibile salvare le modifiche alla segnalazione. Sembra che il contenuto sia già stato modificato da un*altrə utente. Aggiornare la pagina e provare a modificare nuovamente per evitare di sovrascrivere le modifiche subscribe.pull.guest.tooltip = Accedi per iscriverti a questa richiesta di modifica. -subscribe.issue.guest.tooltip = Accedere per sottoscrivere questo problema. +subscribe.issue.guest.tooltip = Accedere per seguire questa segnalazione. n_release_one = rilascio %s n_release_few = rilasci %s issues.author.tooltip.pr = Quest'utente è l'autorə di questa richiesta di modifica. @@ -2889,7 +2898,7 @@ teams.read_access_helper=I membri possono visualizzare e clonare i repository de teams.write_access=Scrittura teams.write_access_helper=I membri possono leggere e pushare sui repository del team. teams.admin_access=Accesso amministratore -teams.admin_access_helper=I membri possono pullare e pushare sulle repository del team e anche aggiungere collaboratori. +teams.admin_access_helper=I membri possono prelevare e immettere sui repositori del team e aggiungere collaboranti. teams.no_desc=Questo team non ha alcuna descrizione teams.settings=Impostazioni teams.owners_permission_desc=I proprietari hanno pieno accesso a tutti i repository e hanno diritti di amministratore nell'organizzazione. @@ -2902,7 +2911,7 @@ teams.delete_team_desc=Eliminare un team revocherà l'accesso al repository da p teams.delete_team_success=Il team è stato eliminato. teams.read_permission_desc=Questo team concede l'accesso di lettura: i membri possono visualizzare e clonare i repository del team. teams.write_permission_desc=Questo team concede l'accesso di Scrittura: i membri possono leggere da e pushare sui repository del team. -teams.admin_permission_desc=Questo team concede l'accesso di Amministratore: i membri possono leggere da, pushare su e aggiungere collaboratori ai repository del team. +teams.admin_permission_desc=Questo team concede l'accesso di Amministrante: i membri possono leggere da, immettere in e aggiungere collaboranti ai repositori del team. teams.create_repo_permission_desc=Inoltre, questo team concede il permesso di Creare repository: i membri possono creare nuove repository nell'organizzazione. teams.repositories=Progetti della squadra teams.search_repo_placeholder=Ricerca repository… @@ -3221,7 +3230,7 @@ auths.tip.google_plus=Ottieni le credenziali del client OAuth2 dalla console API auths.tip.openid_connect=Utilizza l'OpenID Connect Discovery URL (/.well-known/openid-configuration) per specificare gli endpoint auths.tip.twitter=Vai su %s, crea una applicazione e assicurati che l'opzione "Allow this application to be used to Sign In with Twitter" sia abilitata auths.tip.discord=Registra una nuova applicazione su %s -auths.tip.yandex=`Crea una nuova applicazione su %s. Seleziona i seguenti permessi da "Yandex. assport API": "Access to email address", "Access to user avatar" e "Access to username, name and surname, gender"` +auths.tip.yandex=`Crea una nuova applicazione su %s. Seleziona i seguenti permessi da "Yandex.Passport API": "Access to email address", "Access to user avatar" e "Access to username, name and surname, gender"` auths.tip.mastodon=Inserisci un URL di istanza personalizzato per l'istanza mastodon con cui vuoi autenticarti (o usa quella predefinita) auths.edit=Modifica fonte di autenticazione auths.activated=Questa fonte di autenticazione è attiva @@ -3463,7 +3472,7 @@ auths.tips.gmail_settings = Impostazioni Gmail: config.test_mail_failed = Impossibile inviare email di prova a "%s": %v users.details = Dettagli dell'utente monitor.queue.review_add = Revisiona / aggiungi lavoratori -self_check.no_problem_found = Nessun problema trovato. +self_check.no_problem_found = Non c'è ancora nessuna segnalazione. self_check.database_inconsistent_collation_columns = La base di dati sta usando la collazione %s ma queste colonne usano una collazione diversa. Potrebbe causare problemi imprevisti. monitor.queue.settings.remove_all_items = Rimuovi tutto monitor.queue.settings.desc = Le piscine crescono dinamicamente in risposta al blocco dei lavoratori in coda. @@ -3483,11 +3492,13 @@ config.app_slogan = Slogan dell'istanza auths.default_domain_name = Nome di dominio predefinito utilizzato per l'indirizzo e-mail +users.restricted.description = Permetti di interagire solo con i repositori e le organizzazioni in cui l'utente è aggiuntə come collaborante. Ciò evita l'accesso ai repositori pubblici di quest'istanza. + [action] create_repo=ha creato il repository %s rename_repo=repository rinominato da %[1]s a [3]s create_issue=`ha aperto la segnalazione %[3]s#%[2]s` -close_issue=`ha chiuso il problema %[3]s#%[2]s` +close_issue=`ha chiuso la segnalazione %[3]s#%[2]s` reopen_issue=`ha riaperto la segnalazione %[3]s#%[2]s` create_pull_request=`ha creato la pull request %[3]s#%[2]s` close_pull_request=`ha chiuso la pull request %[3]s#%[2]s` @@ -3882,6 +3893,9 @@ pull_kind = Cerca richieste... exact = Esatto milestone_kind = Ricerca tappe... +regexp = Espressione Regolare +regexp_tooltip = Interpreta i termini di ricerca come un'espressione regolare + [munits.data] gib = GiB tib = TiB @@ -3895,3 +3909,7 @@ b = B filepreview.lines = Linee da %[1]d a %[2]d in %[3]s filepreview.truncated = L'anteprima è stata troncata filepreview.line = Linea %[1]d in %[2]s + +[repo.permissions] +issues.write = Scrittura: Chiudere segnalazioni e gestire metadati come etichette, traguardi, assegnatarɜ, scadenze e dipendenze. +pulls.write = Scrittura: Chiudere richieste di modifica e gestire metadati come etichette, traguardi, assegnatarɜ, scadenze e dipendenze. diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini index b0fc38d911..1d7d56d44b 100644 --- a/options/locale/locale_ja-JP.ini +++ b/options/locale/locale_ja-JP.ini @@ -167,6 +167,8 @@ new_org.link = 新しい組織 test = テスト error413 = 割り当て量を使い切りしました。 +copy_path = パスをコピー + [aria] navbar=ナビゲーションバー footer=フッター @@ -1217,7 +1219,7 @@ migrate.migrating_failed_no_addr=移行に失敗しました。 migrate.github.description=github.com やその他の GitHub エンタープライズサーバーからデータを移行します。 migrate.git.description=Git サービスからリポジトリのみを移行します。 migrate.gitlab.description=gitlab.com やその他の GitLab インスタンスからデータを移行します。 -migrate.gitea.description=gitea.com やその他の Gitea/Forgejo インスタンスからデータを移行します。 +migrate.gitea.description=gitea.com やその他の Gitea インスタンスからデータを移行します。 migrate.gogs.description=notabug.org やその他の Gogs インスタンスからデータを移行します。 migrate.onedev.description=code.onedev.io やその他の OneDev インスタンスからデータを移行します。 migrate.codebase.description=codebasehq.com からデータを移行します。 @@ -3515,6 +3517,8 @@ config.app_slogan = インスタンスのスローガン config.cache_test = テストキャッシュ +config.cache_test_failed = キャッシュの調査に失敗しました: %v. + [action] create_repo=がリポジトリ %s を作成しました rename_repo=がリポジトリ名を %[1]s から %[3]s へ変更しました @@ -3875,11 +3879,15 @@ workflow.dispatch.invalid_input_type = 入力タイプ「%s」が無効です。 workflow.dispatch.warn_input_limit = 最初の %d 個の入力のみを表示します。 runs.no_job = ワークフローには少なくとも1つのジョブが含まれている必要があります +runs.expire_log_message = ログは古すぎるため消去されています。 + [projects] type-1.display_name=個人プロジェクト type-2.display_name=リポジトリ プロジェクト type-3.display_name=組織プロジェクト +deleted.display_name = 削除されたプロジェクト + [git.filemode] changed_filemode=%[1]s → %[2]s directory=ディレクトリ diff --git a/options/locale/locale_ko-KR.ini b/options/locale/locale_ko-KR.ini index 6eb9dd634e..2c1e743fdd 100644 --- a/options/locale/locale_ko-KR.ini +++ b/options/locale/locale_ko-KR.ini @@ -128,7 +128,7 @@ copy_success = 복사되었습니다! copy_error = 복사 실패 copy_type_unsupported = 이 파일 형식은 복사할 수 없습니다 error = 오류 -error404 = 도달하려는 페이지가 존재하지 않거나 볼 수 있도록 인증되지 않았습니다. +error404 = 도달하려는 페이지가 존재하지 않거나 볼 수 있는 권한이 없습니다. go_back = 돌아가기 invalid_data = 유효하지 않는 데이터: %v unknown = 알 수 없음 @@ -160,6 +160,16 @@ view = 보기 never = 안함 test = 테스트 +new_repo.title = 새 저장소 +new_org.title = 새 조직 +new_repo.link = 새 저장소 +new_org.link = 새 조직 +copy_path = 경로 복사 + +new_migrate.title = 마이그레이션 +new_migrate.link = 새 마이그레이션 +error413 = 사용 가능한 할당량을 모두 소진하였습니다. + [aria] navbar = 내비게이션 바 footer.links = 링크 @@ -183,6 +193,21 @@ buttons.code.tooltip = 코드 추가 buttons.link.tooltip = 링크 추가 buttons.quote.tooltip = 인용구 추가 +buttons.list.unordered.tooltip = 불릿 리스트 추가 +buttons.list.ordered.tooltip = 번호로 된 리스트 추가 +buttons.list.task.tooltip = 작업 목록 추가 +buttons.mention.tooltip = 사용자 또는 팀을 언급 +buttons.ref.tooltip = 이슈 또는 풀 리퀘스트 참조 +buttons.switch_to_legacy.tooltip = 대신에 구형 편집기 사용 +buttons.enable_monospace_font = 고정 폭 글꼴 활성화 +buttons.disable_monospace_font = 고정 폭 글꼴 비활성화 +buttons.new_table.tooltip = 테이블 추가 +table_modal.header = 테이블 추가 +table_modal.placeholder.header = 헤더 +table_modal.placeholder.content = 내용 +table_modal.label.rows = 행 +table_modal.label.columns = 열 + [filter] string.desc = 하 - 가 string.asc = 가 - 하 @@ -191,6 +216,10 @@ string.asc = 가 - 하 network_error = 네트워크 오류 server_internal = 내부 서버 오류 +occurred = 에러가 발생함 +report_message = 이것이 Forgejo의 버그라고 생각한다면, Codeberg 에서 이슈를 검색하거나 필요하다면 새 이슈를 만들어주세요. +not_found = 타겟을 찾을 수 없습니다. + [startpage] app_desc=편리한 설치형 Git 서비스 install=쉬운 설치 @@ -198,6 +227,11 @@ platform=크로스 플랫폼 lightweight=가벼움 license=오픈 소스 +install_desc = 간단히 당신의 기기에서바이너리를 실행하거나, Docker를 사용하거나, 패키지 저장소에서 설치할 수 있습니다. +platform_desc = Forgejo는 Linux와 FreeBSD등의 자유 오픈소스 운영 체제를 포함한 다양한 CPU 아키텍처에서 실행됩니다. 마음 가는대로 고르세요! +lightweight_desc = Forgejo의 낮은 전력 소모량은 값싼 Raspberry Pi마저 구동할 수 있게 합니다. 기기의 에너지를 절약하세요! +license_desc = Forgejo를 설치해보세요! Forgejo를 개선하기 위해 기여할 수 있습니다. 기여자가 되기를 망설이지 마세요! + [install] install=설치 title=초기 설정 @@ -205,7 +239,7 @@ docker_helper=Forgejo를 Docker에서 실행하려면 설정 전에 이 형식으로 입력하세요. -mailer_user=SMTP 사용자이름 +mailer_user=SMTP 사용자명 mailer_password=SMTP 비밀번호 register_confirm=가입시 이메일 확인 필수 mail_notify=이메일 알림 켜기 @@ -250,9 +284,9 @@ server_service_title=서버 및 기타 서비스 설정 offline_mode=로컬 모드 켜기 offline_mode.description=타사 콘텐츠 전송 네트워크를 사용하지 않도록 설정하고 모든 리소스를 로컬에서 제공합니다. disable_gravatar=Gravatar 사용안함 -disable_gravatar.description=Gravatar 및 타사 아바타 소스를 사용하지 않도록 설정합니다. 사용자가 로컬로 아바타를 업로드하지 않는 한 기본 아바타가 사용됩니다. +disable_gravatar.description=Gravatar를 비롯한 타사 아바타 출처를 사용하지 않도록 설정합니다. 사용자가 직접 아바타를 업로드하지 않는 한 기본 아바타를 사용합니다. federated_avatar_lookup=탈중앙화 아바타 사용 -federated_avatar_lookup.description=libravatar 기반 오픈소스 연합 아바타 조회를 허용합니다. +federated_avatar_lookup.description=Libravatar 아바타를 조회합니다. disable_registration=사용자 등록 비활성화 disable_registration.description=인스턴스 관리자만이 새 사용자 계정을 추가할 수 있게 됩니다. 공개 인스턴스를 제공할 예정이고 많은 양의 스팸 계정을 감당할 준비가 되어 있지 않다면 사용자 등록을 비활성화 할 것을 강력히 권고합니다. allow_only_external_registration.description=새 계정을 등록하려는 사용자는 설정된 외부 서비스를 이용해야만 새 계정을 등록할 수 있습니다. @@ -264,7 +298,7 @@ enable_captcha.description=사용자 등록시 캡차를 요구합니다. require_sign_in_view=인스턴스의 콘텐츠를 볼때 로그인 요구 admin_setting.description=관리자 계정을 만드는 것은 선택사항입니다. 첫번째로 등록된 사용자는 자동적으로 관리자로 지정됩니다. admin_title=관리자 계정 설정 -admin_name=관리자 이름 +admin_name=관리자의 사용자명 admin_password=비밀번호 confirm_password=비밀번호 확인 admin_email=이메일 주소 @@ -273,18 +307,18 @@ test_git_failed='git' 명령 테스트 실패: %v sqlite3_not_available=해당 버전에서는 SQLite3를 지원하지 않습니다. %s에서 공식 버전을 다운로드해주세요. ('gobuild' 버전이 아닙니다). invalid_db_setting=데이터베이스 설정이 올바르지 않습니다: %v invalid_repo_path=저장소(레파지토리) 의 경로가 올바르지 않습니다: %v -run_user_not_match=실행 사용자명이 현재 사용자명과 다릅니다: %s -> %s +run_user_not_match="실행 사용자명"이 현재 사용자명과 다릅니다: %s -> %s save_config_failed=설정을 저장할 수 없습니다: %v invalid_admin_setting=관리자 계정 설정이 올바르지 않습니다: %v invalid_log_root_path=로그(Log) 의 경로가 올바르지 않습니다: %v default_keep_email_private=이메일 주소 숨김처리를 기본값으로 설정 -default_keep_email_private.description=새 사용자에 대한 이메일 주소 숨김처리를 기본값으로 설정합니다. +default_keep_email_private.description=새 사용자에 대한 이메일 주소 숨김처리를 기본값으로 설정해 가입 직후 정보가 유출되는것을 방지합니다. default_allow_create_organization=조직 생성 허용을 기본값으로 설정 -default_allow_create_organization.description=신규 사용자 생성시 조직 생성을 기본값으로 설정합니다. -default_enable_timetracking=시간 추적 사용을 기본값으로 설정 -default_enable_timetracking.description=신규 레포지토리에 대한 시간 추적 사용을 기본값으로 설정합니다. +default_allow_create_organization.description=신규 사용자에게 기본적으로 조직 생성 권한을 부여합니다. 이 옵션이 꺼져있다면, 관리자가 신규 사용자에게 조직 생성 권한을 부여해야합니다. +default_enable_timetracking=시간 기록 기능을 기본적으로 사용 +default_enable_timetracking.description=신규 저장소가 시간기록 기능을 기본적으로 사용할 수 있습니다. no_reply_address=가려진 이메일 도메인 -no_reply_address_helper=가려진 이메일을 가진 사용자에게 적용될 이메일 도메인입니다. 예를 들어, 사용자 'joe'의 가려잔 이메일 도메인이 'noreply.example.org'로 설정되어 있으면 'joe@noreply.example.org'로 처리 됩니다. +no_reply_address_helper=이메일을 가린 사용자에게 적용될 이메일 도메인입니다. 예를 들어, 사용자명 'joe'가 도메인'noreply.example.org'로 이메일을 가리면 Git에 'joe@noreply.example.org'로 로그인 하게 됩니다. db_schema_helper = 데이터베이스 기본값 ("공개")를 사용하려면 빈 칸으로 두세요. require_db_desc = Forgejo를 사용하려면 MySQL, PostgreSQL, SQLite3 또는 TiDB (MySQL 프로토콜) 이 설치되어 있어야 합니다. domain = 서버 도메인 @@ -292,8 +326,19 @@ smtp_from_invalid = "이메일 발신인" 주소가 유효하지 않습니다 enable_captcha = 등록 시 CAPTCHA 활성화 allow_only_external_registration = 외부 서비스를 통한 등록만 허용 +reinstall_error = 이미 존재하는 Forgejo 데이터베이스에 설치를 시도중임 +reinstall_confirm_message = 이미 존재하는 Forgejo 데이터베이스에 재설치를 하는것은 다수의 문제의 원인이 될 수 있습니다. 대부분의 경우 이미 존재하는 "app.ini" 를 사용해 Forgejo를 구동해야합니다. 당신이 무엇을 하고있는지 명확히 알고있다면 다음 사항들을 확인하세요: +reinstall_confirm_check_1 = app.ini의 SECRET_KEY로 암호화 되어있는 데이터를 잃을 수 있습니다: 2FA/OTP를 통해 로그인 할 수 없으며 & 미러가 제대로 작동하지 않게됩니다. app.ini 파일에 정확한 SECRET_KEY가 있는것이 확실하다면 체크하세요. +reinstall_confirm_check_2 = 저장소와 설정에 재동기화가 요구될 수 있습니다. 이 박스에 체크하면 저장소의 훅과 authorized_key 들을 수동으로 재동기화해야 한다는 것을 인지한다는 것을 의미합니다. 저장소와 미러의 설정이 올바른지 확인하세요. +reinstall_confirm_check_3 = Forgejo가 올바른 app.ini 위치로 실행중이며 그것이 다시 설치할 대상이 맞다는것을 전적으로 확신합니다. 위의 위험성들을 인지하고 있음에 동의합니다. +err_admin_name_pattern_not_allowed = 관리자의 사용자명이 올바르지 않음, 사용자명이 예약된 패턴과 일치함 +app_slogan = 인스턴스 슬로건 +app_slogan_helper = 인스턴스의 슬로건을 입력하세요. 비워두면 비활성화됩니다. +run_user_helper = Forgejo를 구동하는 운영체제의 사용자명입니다. 이 사용자는 저장소 루트 경로에 접근권한이 있어야 합니다. +allow_dots_in_usernames = 사용자들이 마침표를 사용자명에 사용할 수 있도록 허가합니다. 이미 존재하는 계정에는 영향을 주지 않습니다. + [home] -uname_holder=사용자 이름 또는 이메일 주소 +uname_holder=사용자명 또는 이메일 주소 password_holder=비밀번호 switch_dashboard_context=대시보드 컨텍스트 바꾸기 my_repos=저장소 @@ -337,7 +382,7 @@ allow_password_change=사용자에게 비밀번호 변경을 요청 (권장됨) reset_password_mail_sent_prompt=확인 메일이 %s로 전송되었습니다. 받은 편지함으로 도착한 메일을 %s 안에 확인해서 비밀번호 찾기 절차를 완료하십시오. active_your_account=계정 활성화 account_activated=계정이 활성화 되었습니다 -prohibit_login = +prohibit_login = resent_limit_prompt=활성화를 위한 이메일을 이미 전송했습니다. 3분 내로 이메일을 받지 못한 경우 재시도해주세요. has_unconfirmed_mail=안녕하세요 %s, 이메일 주소(%s)가 확인되지 않았습니다. 확인 메일을 받으시지 못하겼거나 새로운 확인 메일이 필요하다면, 아래 버튼을 클릭해 재발송하실 수 있습니다. resend_mail=여기를 눌러 확인 메일 재전송 @@ -402,6 +447,8 @@ issue.action.new = @%[1]s님이 #%[2]d를 만들었습니다. +register_notify.text_2 = 당신의 계정에 사용자명으로 로그인 할 수 있습니다: %s + [modal] yes=예 no=아니오 @@ -409,8 +456,8 @@ cancel=취소 modify=변경하기 [form] -UserName=사용자 이름 -RepoName=저장소 이름 +UserName=사용자명 +RepoName=저장소명 Email=이메일 주소 Password=비밀번호 Retype=비밀번호 확인 @@ -444,14 +491,14 @@ captcha_incorrect=CAPTCHA 코드가 올바르지 않습니다. password_not_match=비밀번호가 일치하지 않습니다. lang_select_error=목록에서 언어를 선택해주세요. -username_been_taken=이미 사용하고 있는 아이디입니다. -repo_name_been_taken=이미 사용하고 있는 저장소 이름입니다. +username_been_taken=이미 사용되는 사용자명입니다. +repo_name_been_taken=이미 사용중인 저장소명 입니다. org_name_been_taken=이미 사용중인 조직 이름입니다. team_name_been_taken=이미 사용중인 팀 이름입니다. team_no_units_error=최소 하나 이상의 레포지토리 섹션에 대한 접근을 허용하십시오. email_been_used=이미 사용 중인 이메일 주소입니다. -username_password_incorrect=사용자 이름 또는 암호가 올바르지 않습니다. -enterred_invalid_repo_name=입력한 저장소의 이름이 올바르지 않습니다. +username_password_incorrect=사용자명 또는 암호가 올바르지 않습니다. +enterred_invalid_repo_name=입력한 저장소명이 올바르지 않습니다. enterred_invalid_owner_name=새로운 소유자 이름이 올바르지 않습니다. enterred_invalid_password=입력한 비밀번호는 올바르지 않습니다. user_not_exist=존재하지 않는 사용자입니다. @@ -467,10 +514,13 @@ target_branch_not_exist=대상 브랜치가 존재하지 않습니다. url_error = `"%s"는 유효한 URL이 아닙니다.` include_error = `"%s"을/를 포함해야 합니다.` regex_pattern_error = `regex 패턴이 잘못되었습니다: %s` -username_error = `영문("a-z", "A-Z"), 숫자("0-9"), 대시("-"), 밑줄("_"), 점(".")만 포함할 수 있습니다. 영문 혹은 숫자가 아닌 문자로 시작하거나 끝날 수 없으며 연속된 영문 혹은 숫자가 아닌 문자도 금지됩니다.` +username_error = `영문("a-z", "A-Z"), 숫자("0-9"), 대시("-"), 밑줄("_"), 마침표(".")만 포함할 수 있습니다. 영문 혹은 숫자가 아닌 문자로 시작하거나 끝날 수 없으며 연속된 영문 혹은 숫자가 아닌 문자도 금지됩니다.` glob_pattern_error = `glob 패턴이 잘못되었습니다: %s` +username_error_no_dots = `영문("a-z", "A-Z"), 숫자("0-9"), 대시("-"), 밑줄("_")만 포함할 수 있습니다. 영문 혹은 숫자가 아닌 문자로 시작하거나 끝날 수 없으며 연속된 영문 혹은 숫자가 아닌 문자도 금지됩니다.` +username_change_not_local_user = 외부 사용자들은 사용자명을 변경할 수 없습니다. + [user] change_avatar=아바타 변경… repositories=저장소 @@ -486,6 +536,10 @@ projects = 프로젝트 watched = 주시중인 저장소 +form.name_reserved = "%s" 사용자명이 예약(reserved)되었습니다. +form.name_pattern_not_allowed = "%s" 패턴이 사용자명으로 사용할 수 없습니다. +form.name_chars_not_allowed = "%s" 사용자명이 유효하지 않은 문자를 포함합니다. + [settings] profile=프로필 account=계정 @@ -503,14 +557,14 @@ account_link=연결된 계정 organization=조직 public_profile=공개 프로필 -password_username_disabled=로컬 사용자가 아닌 경우 사용자 이름 변경을 할 수 없습니다. 자세한 내용은 관리자에게 문의해주세요. +password_username_disabled=로컬 사용자가 아닌 경우 사용자명을 변경 할 수 없습니다. 자세한 내용은 관리자에게 문의해주세요. full_name=성명 website=웹 사이트 location=위치 update_theme=테마 변경 update_profile=프로필 업데이트 update_profile_success=프로필이 업데이트 되었습니다. -change_username=사용자 이름 변경 되었습니다. +change_username=사용자명이 변경 되었습니다. continue=계속하기 cancel=취소 language=언어 @@ -662,10 +716,14 @@ change_password = 비밀번호 변경 email_desc = 당신의 대표 이메일 주소는 알림, 비밀번호 재설정과 웹에서의 Git 작동에 사용되며 가려지지 않습니다. comment_type_group_dependency = 전제조건 +change_username_prompt = 참고: 사용자명의 변경은 계정의 URL을 변경시킵니다. +change_username_redirect_prompt = 과거 사용자명은 누군가 사용하기 전까지 리디렉트됩니다. +comment_type_group_time_tracking = 시간 기록 + [repo] owner=소유자 -repo_name=저장소 이름 -repo_name_helper=좋은 저장소 이름은 보통 짧고 기억하기 좋은 특별한 키워드로 이루어 집니다. +repo_name=저장소명 +repo_name_helper=좋은 저장소명은 보통 짧고 기억하기 좋은 특별한 키워드로 이루어 집니다. repo_size=저장소 용량 template=템플릿 template_select=템플릿을 선택합니다. @@ -914,7 +972,7 @@ issues.subscribe=구독하기 issues.unsubscribe=구독 취소 issues.delete=삭제 issues.tracker=타임 트래커 -issues.start_tracking=타임 트래킹 시작 +issues.start_tracking=시간 기록 시작 issues.start_tracking_history=`님이 %s 작업 시작` issues.stop_tracking_history=`님이 %s 작업 중단` issues.add_time=수동으로 시간 입력 @@ -1114,7 +1172,7 @@ settings.tracker_url_format=외부 이슈 트래커 URL 형식 settings.tracker_issue_style=외부 이슈 트래커 숫자 포맷 settings.tracker_issue_style.numeric=숫자 settings.tracker_issue_style.alphanumeric=문자 숫자 -settings.enable_timetracker=시간 추적 활성화 +settings.enable_timetracker=시간 기록 활성화 settings.allow_only_contributors_to_track_time=기여자 트랙 타임만 settings.pulls_desc=저장소 풀 리퀘스트 활성화 settings.pulls.ignore_whitespace=공백은 충돌에서 무시하기 @@ -1160,7 +1218,7 @@ settings.update_githook=Hook 갱신 settings.payload_url=대상 URL settings.content_type=POST Content Type settings.secret=비밀 -settings.slack_username=사용자 이름 +settings.slack_username=사용자명 settings.slack_icon_url=아이콘 URL settings.discord_username=사용자명 settings.discord_icon_url=아이콘 URL @@ -1301,7 +1359,7 @@ settings.trust_model.committer.desc = 유효한 서명이 커미터와 일치할 visibility_helper = 저장소 비공개로 만들기 projects.description = 설명 (선택) settings.external_tracker_url_desc = 방문자들이 이슈 탭을 클릭하면 외부 이슈 트레커 URL로 연결됩니다. -settings.tracker_url_format_desc = {user}, {repo} and {index}를 사용자 이름, 저장소 이름, 이슈 번호로 사용할 수 있습니다. +settings.tracker_url_format_desc = {user}를 사용자명, {repo}를 저장소명, {index}를 이슈 번호로 사용할 수 있습니다. projects = 프로젝트 projects.desc = 이슈와 풀 리퀘스트를 프로젝트에서 관리합니다. projects.create = 프로젝트 만들기 @@ -1366,11 +1424,26 @@ pulls.merged_title_desc_one = 님이 %[2]s 에서 %[3]s다른 이슈에서 시간을 기록중입니다!` +issues.stop_tracking = 타이머 정지 +issues.cancel_tracking_history = `취소된 시간 기록 %s` +settings.enter_repo_name = 표시된 소유자와 저장소명을 정확하게 입력하세요: +settings.packagist_username = Packagist 사용자명 + +archive.title_date = 이 저장소는 %s에 보관처리되었습니다. 파일을 볼 수 있고 복제할 수도 있지만, 푸시하거나 이슈를 열거나 풀 리퀘스트를 만들 수 없습니다. + +milestones.filter_sort.name = 이름 + [graphs] [org] org_name_holder=조직 이름 -org_full_name_holder=조직 전체 이름 +org_full_name_holder=조직 별명 create_org=새로운 조직 repo_updated=업데이트됨 %s members=멤버 @@ -1407,7 +1480,7 @@ members.public=보임 members.public_helper=숨기기 members.private=숨김 members.private_helper=보이기 -members.member_role=회원 역할: +members.member_role=멤버 역할: members.owner=소유자 members.member=멤버 members.remove=제거 @@ -1432,6 +1505,8 @@ teams.search_repo_placeholder=저장소 찾기... teams.add_duplicate_users=사용자가 이미 팀 멤버입니다. teams.members.none=이 팀에 멤버가 없습니다. +form.name_pattern_not_allowed = "%s" 패턴이 조직명으로 사용할 수 없습니다. + [admin] dashboard=대시보드 users=사용자 계정 @@ -1631,9 +1706,9 @@ config.db_path=경로 config.service_config=서비스 설정 config.register_email_confirm=가입시 이메일 확인 필수 -config.disable_register=자체등록 사용안함 +config.disable_register=사용자 등록 거부 config.allow_only_external_registration=외부 서비스를 통해서만 등록 허용 -config.enable_openid_signup=OpenID 자체등록 활성화 +config.enable_openid_signup=OpenID 등록 활성화 config.enable_openid_signin=OpenID 로그인 활성화 config.show_registration_button=등록 버튼을 표시 config.require_sign_in_view=페이지를 보려면 로그인 필수 @@ -1642,8 +1717,8 @@ config.enable_captcha=CAPTCHA 활성화 config.active_code_lives=코드 만료 기한 config.default_keep_email_private=기본적으로 이메일 주소를 숨김 config.default_allow_create_organization=기본적으로 조직 생성을 허용 -config.enable_timetracking=타임 트래킹 활성화 -config.default_enable_timetracking=기본 타임 트래킹 활성화 +config.enable_timetracking=시간 기록 활성화 +config.default_enable_timetracking=기본으로 시간 기록을 활성화 config.default_allow_only_contributors_to_track_time=기여자 트랙 타임만 config.no_reply_address=가려진 이메일 도메인 config.default_enable_dependencies=기본적으로 이슈 종속성을 활성화 @@ -1731,6 +1806,16 @@ users.allow_git_hook_tooltip = Git 훅은 Forgejo가 실행중인 OS 유저로 emails.primary = 대표 +emails.filter_sort.name = 사용자명 +emails.filter_sort.name_reverse = 사용자명 (예약됨) +auths.attribute_username_placeholder = 비워두면 Forgejo에 입력된 사용자명을 사용합니다. +auths.sspi_strip_domain_names = 사용자명들에서 도메인명을 제거함 +auths.tip.yandex = %s에 새 애플리케이션을 만듭니다. "Yandex.Passport API"부분의 "Access to email address", "Access to user avatar", "Access to username, first name and surname, gender" 권한을 활성화 하세요. +config.allow_dots_in_usernames = 사용자들이 마침표를 사용자명에 사용할 수 있도록 허가합니다. 이미 존재하는 계정에는 영향을 주지 않습니다. + +config_summary = 요약 +config_settings = 설정 + [action] create_repo=저장소를 만들었습니다. %s rename_repo=저장소 이름을 %[1]s에서에서 %[3]s으로 변경함 @@ -1838,4 +1923,11 @@ package_kind = 패키지 검색... project_kind = 프로젝트 검색... exact_tooltip = 검색어와 정확하게 일치하는 결과만 포함 issue_kind = 이슈 검색... -pull_kind = 풀 검색... \ No newline at end of file +pull_kind = 풀 검색... +fuzzy = 모호함 +union = 통합 검색 +union_tooltip = 공백으로 구분된 키워드 중 하나라도 일치하는 결과를 포함하세요 +exact = 정확한 +regexp = 정규 표현식 +regexp_tooltip = 검색어를 정규 표현식으로 해석합니다 +milestone_kind = 마일스톤 검색... \ No newline at end of file diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index 397370c883..b77ed6c6ca 100644 --- a/options/locale/locale_lv-LV.ini +++ b/options/locale/locale_lv-LV.ini @@ -7,7 +7,7 @@ logo=Logo sign_in=Pieteikties sign_in_with_provider=Pieteikties ar %s sign_in_or=vai -sign_out=Izrakstīties +sign_out=Atteikties sign_up=Reģistrēties link_account=Sasaistīt kontu register=Reģistrēties @@ -38,9 +38,9 @@ twofa_scratch=Divpakāpju vienreiz izmantojamais kods passcode=Kods webauthn_insert_key=Jāievieto sava drošības atslēga -webauthn_sign_in=Jānospiež poga uz drošības. Ja drošības atslēgai nav pogas, tā ir atkārtoti jāievieto. +webauthn_sign_in=Jānospiež poga uz drošības atslēgas. Ja tai nav pogas, drošības atslēga ir atkārtoti jāievieto. webauthn_press_button=Lūgums nospiest pogu uz savas drošības atslēgas… -webauthn_use_twofa=Izmantot divfaktoru kodu no tālruņa +webauthn_use_twofa=Izmantot divpakāpju kodu no sava tālruņa webauthn_error=Nevar nolasīt drošības atslēgu. webauthn_unsupported_browser=Pārlūks pašlaik nenodrošina WebAuthn. webauthn_error_unknown=Atgadījās nezināma kļūda. Lūgums mēģināt vēlreiz. @@ -52,7 +52,7 @@ webauthn_error_timeout=Iestājās noildze, pirms varēja nolasīt atslēgu. Lūg webauthn_reload=Pārlādēt repository=Glabātava -organization=Organizācija +organization=Apvienība mirror=Spoguļglabātava new_repo=Jauns repozitorijs new_migrate=Jauna migrācija @@ -75,7 +75,7 @@ mirrors=Spoguļglabātavas collaborative=Līdzdarbošanās forks=Atzarojumi -activities=Aktivitāte +activities=Darbības pull_requests=Izmaiņu pieprasījumi issues=Pieteikumi milestones=Atskaites punkti @@ -83,8 +83,8 @@ milestones=Atskaites punkti ok=Labi cancel=Atcelt retry=Mēģināt vēlreiz -rerun=Palaist atkārtoti -rerun_all=Palaist atkārtoti visus darbus +rerun=Atkārtoti izpildīt +rerun_all=Atkārtoti izpildīt visus darbus save=Saglabāt add=Pievienot add_all=Pievienot visus @@ -98,13 +98,13 @@ enabled=Iespējots disabled=Atspējots locked=Slēgts -copy=Kopēt -copy_url=Kopēt saiti -copy_hash=Kopēt jaucējkodu -copy_content=Kopēt saturu +copy=Ievietot starpliktuvē +copy_url=Ievietot URL starpliktuvē +copy_hash=Ievietot jaucējvērtību starpliktuvē +copy_content=Ievietot saturu starpliktuvē copy_branch=Ievietot zara nosaukumu starpliktuvē -copy_success=Nokopēts! -copy_error=Kopēšana neizdevās +copy_success=Ievietots starpliktuvē. +copy_error=Ievietošana starpliktuvē neizdevās copy_type_unsupported=Šāda veida datnes nevar ievietot starpliktuvē write=Rakstīt @@ -130,11 +130,11 @@ archived=Arhivētie concept_system_global=Globāls concept_user_individual=Individuāls concept_code_repository=Glabātava -concept_user_organization=Organizācija +concept_user_organization=Apvienība -show_timestamps=Rādīt laika zīmogus +show_timestamps=Rādīt laikspiedolus show_log_seconds=Rādīt sekundes -show_full_screen=Atvērt pilnā logā +show_full_screen=Atvērt pilnekrānā download_logs=Lejupielādēt žurnālus confirm_delete_selected=Apstiprināt, lai izdzēstu visus atlasītos vienumus? @@ -162,7 +162,7 @@ filter.not_archived = Nav arhivētas filter.is_fork = Atzarojumi filter.not_fork = Nav atzarojumi filter.is_mirror = Spoguļglabātavas -filter.public = Publiskas +filter.public = Atklātas filter.private = Privātas filter.clear = Notīrīt atlasi confirm_delete_artifact = Vai tiešām izdzēst artefaktu '%s'? @@ -184,8 +184,8 @@ contributions_few = iesaistīšanās contributions_one = iesaistīšanās [editor] -buttons.heading.tooltip=Pievienot virsrakstu -buttons.bold.tooltip=Izcelt tekstu +buttons.heading.tooltip=Virsraksts +buttons.bold.tooltip=Treknraksts buttons.italic.tooltip=Slīpraksta teksts buttons.quote.tooltip=Citēt tekstu buttons.code.tooltip=Pievienot kodu @@ -196,8 +196,8 @@ buttons.list.task.tooltip=Pievienot uzdevumu sarakstu buttons.mention.tooltip=Pieminēt lietotāju vai komandu buttons.ref.tooltip=Atsaukties uz pieteikumu vai izmaiņu pieprasījumu buttons.switch_to_legacy.tooltip=Izmantot vēsturisko redaktoru -buttons.enable_monospace_font=Izmantot vienāda izmēra fontu -buttons.disable_monospace_font=Neizmantot vienāda izmēra fontu +buttons.enable_monospace_font=Iespējot vienplatuma fontu +buttons.disable_monospace_font=Atspējot vienplatuma fontu table_modal.placeholder.header = Galvene table_modal.placeholder.content = Saturs table_modal.label.rows = Rindas @@ -213,7 +213,7 @@ string.desc=Z - A [error] occurred=Radusies kļūda -report_message=Ja ir pārliecība, ka šī ir Forgejo nepilnība, lūgums pārbaudīt GitHub, vai tā jau nav zināma, vai izveidot jaunu pieteikumu, ja nepieciešams. +report_message=Ja ir pārliecība, ka šī ir Forgejo nepilnība, lūgums pārbaudīt Codeberg, vai tā jau nav zināma, vai izveidot jaunu pieteikumu, ja nepieciešams. missing_csrf=Kļūdains pieprasījums: netika iesūtīta drošības pilnvara invalid_csrf=Kļūdains pieprasījums: iesūtīta kļūdaina drošības pilnvara not_found=Pieprasītie dati netika atrasti. @@ -221,20 +221,20 @@ network_error=Tīkla kļūda server_internal = Iekšēja servera kļūda [startpage] -app_desc=Viegli uzstādāms Git serviss -install=Vienkārši instalējams +app_desc=Pašmitināms Git pakalpojums bez galvassāpēm +install=Viegli uzstādīt install_desc=Vienkārši jāpalaiž izpildāmā datne vajadzīgajai sistēmai, jāizmanto Docker vai jāiegūst pakotne. platform=Pieejama dažādām platformām lightweight=Viegla -lightweight_desc=Forgejo ir miminālas prasības un to var darbināt uz nedārga Raspberry Pi datora. Ietaupi savai ierīcei resursus! +lightweight_desc=Forgejo ir zemas tehniskās prasības, un to var darbināt nedārgā Raspberry Pi datorā. Taupām savas ierīces patērēto enerģiju! license=Atvērtā pirmkoda license_desc=Iegūsti Forgejo! Pievienojies mums līdzdarbojoties, lai padarītu šo projektu vēl labāku! Nekautrējies un līdzdarbojies! -platform_desc = Ir apstiprināts, ka Forgejo darbojas brīvās operētājsistēmāš, piemēram, GNU/Linux un FreeBSD, kā arī ar dažādām procesoru arhitektūrām. Izvēlies to, kas patīk! +platform_desc = Ir apstiprināts, ka Forgejo darbojas brīvās operētājsistēmās, piemēram, GNU/Linux un FreeBSD, kā arī ar dažādām procesoru arhitektūrām. Izvēlies to, kas patīk! [install] -install=Instalācija +install=Uzstādīšana title=Sākotnējā konfigurācija -docker_helper=Ja Forgejo ir uzstādīts Docker konteinerī, izlasiet vadlīninas pirms maināt iestatījumus. +docker_helper=Ja Forgejo ir uzstādīts Docker konteinerā, lūgums izlasīt vadlīnijas, pirms tiek mainīti iestatījumi. require_db_desc=Forgejo nepieciešams MySQL, PostgreSQL, SQLite3 vai TiDB (ar MySQL protokolu). db_title=Datubāzes iestatījumi db_type=Datubāzes veids @@ -247,12 +247,12 @@ db_schema_helper=Atstāt tukšu, lai izmantotu datubāzes noklusējumu ("public" ssl_mode=SSL path=Ceļš sqlite_helper=SQLite3 datubāzes datnes ceļš.
Jāievada pilns ceļš, ja Forgejo tiek palaists kā sistēmas pakalpojums. -reinstall_error=Nevar instalēt datubāzē, kura jau satur Forgejo datus +reinstall_error=Tiek mēģināts uzstādīt esošā Forgejo datubāzē reinstall_confirm_message=Atkārtota uzstādīšana ar esošu Forgejo datubāzi var izraisīt vairākas nebūšanas. Vairumā gadījumu vajadzētu izmantot esošo "app.ini", lai palaistu Forgejo. Jāapstiprina zemāk esošais, ja ir skaidrs, kas tiek darīts: reinstall_confirm_check_1=Dati, kas šifrēti ar SECRET_KEY, kas ir norādīta app.ini datnē, var tikt pazaudēti: lietotāji nevarēs pieteikties ar 2FA/OTP, kā arī spoguļglabātavas var pārstāt darboties. Ar šīs izvēles rūtiņas atzīmēšanu tiek apstiprināts, ka pašreizējā app.ini datne satur pareizu SECRET_KEY vērtību. -reinstall_confirm_check_2=Glabātavas un iestatījumus var būt nepieciešams atkārtoti sinhronizēt. Ar šīs izvēles rūtiņas atzīmēšanu tiek apstiprināts, ka pašrocīgi tiks veikta glabātavu aizķeru un authorized_keys datnes atkārtota sinhronizēšana, kā arī tiek apstiprināts, ka tiks nodrošināts, ka glabātavas un spoguļošanas iestatījumi ir pareizi. -reinstall_confirm_check_3=Ar šo tiek apstiprināts, ka ir pilnīga pārliecība, ka Forgejo darbojas ar pareizu app.ini atrašanāš vietu un ka tiešām ir nepieciešama atkārtota uzstādīšana. Tiek apliecināts, ka iepriekšminētais var novest pie kļūmēm. -err_empty_db_path=Nav norādīts SQLite3 datu bāzes ceļš. +reinstall_confirm_check_2=Glabātavas un iestatījumus var būt nepieciešams atkārtoti sinhronizēt. Ar šīs izvēles rūtiņas atzīmēšanu tiek apstiprināts, ka pašrocīgi tiks veikta glabātavu aizķeru un authorized_keys datnes atkārtota sinhronizēšana. Tiek apstiprināts, ka tiks nodrošināts, ka glabātavas un spoguļošanas iestatījumi ir pareizi. +reinstall_confirm_check_3=Ar šo tiek apstiprināts, ka ir pilnīga pārliecība, ka Forgejo darbojas ar pareizu app.ini atrašanās vietu un ka tiešām ir nepieciešama atkārtota uzstādīšana. Tiek apliecināts, ka iepriekšminētais var novest pie kļūmēm. +err_empty_db_path=SQLite3 datubāzes ceļš nevar būt tukšs. no_admin_and_disable_registration=Lietotāju reģistrēšanos nevar atspējot bez pārvaldītāja konta izveidošanas. err_empty_admin_password=Pārvaldītāja parole nevar būt tukša. err_empty_admin_email=Pārvaldītāja e-pasta adrese nevar būt tukša. @@ -267,7 +267,7 @@ repo_path=Glabātavu atrašanās vieta repo_path_helper=Attālās Git glabātavas tiks saglabātas šajā mapē. lfs_path=Git LFS atrašanās vieta lfs_path_helper=Datnes, kas pievienotas Git LFS, tiks glabātas šajā mapē. Atstāt tukšu, lai atspējotu. -run_user=Lietotājus, ar kuru palaist +run_user=Lietotājs, ar kuru palaist run_user_helper=Operētājsistēms lietotājs, ar kuru tiks palaists Forgejo. Jāņem vērā, ka šim lietotājam ir jābūt piekļuvei glabātavas atrašanās vietai. domain=Servera domēna vārds domain_helper=Domēns vai servera adrese. @@ -288,7 +288,7 @@ smtp_from=Sūtīt e-pasta ziņojumus kā smtp_from_helper=E-pasta adrese, ko izmantos Forgejo. Jāievada tikai e-pasta adrese vai jāizmanto pieraksts "Vārds" . mailer_user=SMTP lietotājvārds mailer_password=SMTP parole -register_confirm=Reģistrējoties pieprasīt apstiprināt e-pastu +register_confirm=Reģistrējoties pieprasīt e-pasta adreses apstiprināšanu mail_notify=Iespējot e-pasta paziņojumus server_service_title=Servera un trešo pušu pakalpojumu iestatījumi offline_mode=Iespējot bezsaistes režīmu @@ -298,7 +298,7 @@ disable_gravatar.description=Atspējot Gravatar un citu trešo pušu attēlu avo federated_avatar_lookup=Iespējot apvienotos profila attēlus federated_avatar_lookup.description=Uzmeklēt profila attēlus ar Libravatar. disable_registration=Atspējot pašreģistrēšanos -disable_registration.description=Tikai servera pārvaldītāji varēs izveidot jaunus lietotāju kontus. Ir ļoti ieteicams reģistrēšanos paturēt atspējotu, ja vien nav iecerēts mitināt visiem pieejamu publisku serveri un ir gatavība tikt galā ar lielu negodprātīgu kontu skaitu. +disable_registration.description=Tikai servera pārvaldītāji varēs izveidot jaunus lietotāju kontus. Ir ļoti ieteicams reģistrēšanos paturēt atspējotu, ja vien nav iecerēts mitināt visiem pieejamu serveri un ir gatavība tikt galā ar lielu negodprātīgu kontu skaitu. allow_only_external_registration.description=Lietotāji varēs izveidot jaunos kontus tikai izmantojot konfigurētus ārējos pakalpojumus. openid_signin=Iespējot pieteikšanos ar OpenID openid_signin.description=Ļaut lietotājiem pieteikties ar OpenID. @@ -314,19 +314,19 @@ admin_name=Pārvaldītāja lietotājvārds admin_password=Parole confirm_password=Apstiprināt paroli admin_email=E-pasta adrese -install_btn_confirm=Instalēt Forgejo +install_btn_confirm=Uzstādīt Forgejo test_git_failed=Nevarēja pārbaudīt "git" komandu: %v sqlite3_not_available=Šī Forgejo versija neatbalsta SQLite3. Lūgums lejupielādēt oficiālo bināro versiju no %s (ne 'gobuild' versiju). invalid_db_setting=Nederīgi datu bāzes iestatījumi: %v invalid_db_table=Datubāzes tabula "%s" ir kļūdaina: %v invalid_repo_path=Nederīga glabātavu atrašanās vieta: %v -invalid_app_data_path=Lietojumprogrammas datu ceļš ir kļūdains: %v -run_user_not_match="Izpildīt kā lietotājam" lietotājvārds neatbilst pašreizējam lietotājam: %s -> %s +invalid_app_data_path=Lietotnes datu ceļš ir nederīgs: %v +run_user_not_match="Lietotājs, ar kuru palaist" lietotājvārds neatbilst pašreizējam lietotājam: %s -> %s internal_token_failed=Neizdevās izveidot iekšējo pilnvaru: %v secret_key_failed=Neizdevās izveidot drošības atslēgu: %v save_config_failed=Neizdevās saglabāt konfigurāciju: %v invalid_admin_setting=Pārvaldītāja konta iestatījums ir nederīgs: %v -invalid_log_root_path=Nederīgs žurnalizēšanas ceļš: %v +invalid_log_root_path=Žurnāla atrašanās vieta ir nederīga: %v default_keep_email_private=Pēc noklusējuma slēpt e-pasta adreses default_keep_email_private.description=Pēc noklusējuma iespējot e-pasta adreses slēpšanu jauniem lietotājiem, lai šī informāciju nenoplūstu uzreiz pēc reģistrēšanās. default_allow_create_organization=Pēc noklusējuma ļaut apvienību izveidošanu @@ -362,7 +362,7 @@ view_home=Apskatīt %s search_repos=Meklēt repozitoriju… filter=Citas atlases filter_by_team_repositories=Atlasīt pēc komandas glabātavām -feed_of=`"%s" plūsma` +feed_of="%s" barotne show_archived=Arhivētie show_both_archived_unarchived=Attēlot gan arhivētos, gan nearhivētos @@ -370,16 +370,16 @@ show_only_archived=Attēlot tikai arhivētos show_only_unarchived=Attēlot tikai nearhivētos show_private=Privāts -show_both_private_public=Attēlot gan publiskos, gan privātos +show_both_private_public=Rāda gan atklātās, gan privātās show_only_private=Attēlot tikai privātos -show_only_public=Attēlot tikai publiskos +show_only_public=Attēlo tikai atklātās issues.in_your_repos=Manās glabātavās [explore] repos=Glabātavas users=Lietotāji -organizations=Organizācijas +organizations=Apvienības search=Meklēt go_to=Iet uz code=Kods @@ -403,11 +403,11 @@ forks_one = %d atzarojums forks_few = %d atzarojumi [auth] -create_new_account=Reģistrēt kontu +create_new_account=Izveidot kontu register_helper_msg=Jau ir konts? Piesakieties tagad! social_register_helper_msg=Jau ir konts? Piesaisti to! disable_register_prompt=Reģistrēšanās ir atspējota. Lūgums sazināties ar vietnes pārvaldītāju. -disable_register_mail=Reģistrācijas e-pasta apstiprināšana ir atspējota. +disable_register_mail=E-pasta adreses apstiprināšana reģistrējoties ir atspējota. manual_activation_only=Jāsazinās ar vietnes pārvaldītāju, lai pabeigtu aktivēšanu. remember_me=Atcerēties šo ierīci remember_me.compromised=Pieteikšanās pilnvara vairs nav derīga, kas var norādīt uz ļaunprātīgām darbībām kontā. Lūgums pārbaudīt, vai kontā nav neparastu darbību. @@ -418,25 +418,25 @@ sign_up_successful=Konts tika sekmīgi izveidots. Laipni lūdzam! confirmation_mail_sent_prompt=Jauns apstiprināšanas e-pasta ziņojums tika nosūtīts uz %s. Lūgums pārbaudīt savu iesūtni nākamajās %s, lai pabeigtu reģistrēšanos. Ja e-pasta adrese ir nepareiza, ir iespējams pieteikties un pieprasīt vēl viena apstiprināšanas e-pasta ziņojuma nosūtīšanu uz citu adresi. must_change_password=Atjaunināt savu paroli allow_password_change=Pieprasīt lietotājam mainīt paroli (ieteicams) -reset_password_mail_sent_prompt=Apstiprināšanas e-pasta ziņojums tika nosūtīts uz %s. Lūgums pārbaudīt savu iesūtni un atvērt tajā esošo saiti tuvākajās %s, lai pabeigtu konta atkopšanu. +reset_password_mail_sent_prompt=Apstiprinājuma e-pasta ziņojums tika nosūtīts uz %s. Lūgums pārbaudīt savu iesūtni un atvērt tajā saņemto saiti, lai pabeigtu konta atkopi. active_your_account=Aktivēt savu kontu account_activated=Konts ir aktivēts prohibit_login=Konta darbība ir apturēta prohibit_login_desc=Kontam ir liegts mijiedarboties ar serveri. Jāsazinās ar tā pārvaldītāju, lai atgūtu piekļuvi. resent_limit_prompt=Nesen jau tika pieprasīts aktivēšanas e-pasta ziņojums. Lūgums uzgaidīt 3 minūtes un mēģināt vēlreiz. -has_unconfirmed_mail=Sveiciens, %s! Tev ir neapstiprināta e-pasta adrese (%s). Ja neesi saņēmis apstiprinājuma e-pasta ziņojumu vai ir nepieciešams nosūtīt jaunu, lūgums klikšķināt uz zemāk esošās pogas. +has_unconfirmed_mail=Sveiciens, %s! Tev ir neapstiprināta e-pasta adrese (%s). Ja nav saņemts apstiprinājuma e-pasta ziņojums vai ir nepieciešams nosūtīt jaunu, lūgums klikšķināt uz zemāk esošās pogas. resend_mail=Klikšķināt šeit, lai atkārtoti nosūtītu aktivēšanas e-pasta ziņojumu email_not_associate=Šī e-pasta adrese nav saistīta ar nevienu kontu. send_reset_mail=Nosūtīt atkopes e-pasta ziņojumu reset_password=Konta atkope invalid_code=Apstiprināšanas kods ir nederīgs, vai ir beidzies tā derīgums. -invalid_code_forgot_password=Apstiprināšanas kods ir nederīgs vai tā derīgums ir beidzies. Jāklikšķina šeit, lai uzsāktu jaunu sesiju. +invalid_code_forgot_password=Apstiprināšanas kods ir nederīgs, vai tā derīgums ir beidzies. Jāklikšķina šeit, lai uzsāktu jaunu sesiju. invalid_password=Parole neatbilst tai, kas tika izmantota konta izveidošanas laikā. reset_password_helper=Atjaunot paroli -reset_password_wrong_user=Jūs esat pieteicies kā %s, bet konta atkopšanas saite ir paredzēta lietotājam %s +reset_password_wrong_user=Tu pieteicies kā %s, bet konta atkopes saite ir paredzēta %s password_too_short=Paroles garums nevar būt mazāks par %d rakstzīmēm. non_local_account=Ārējie konti nevar mainīt paroli, izmantojot, Forgejo saskarni. -verify=Pārbaudīt +verify=Apliecināt scratch_code=Vienreizējais kods use_scratch_code=Izmantot vienreizējo kodu twofa_scratch_used=Ir izmantots vienreizējais kods. Notika pārvirzīšana uz divpakāpju iestatījumu lapu, lai varētu noņemt savas ierīces piesaisti vai izveidot jaunu vienreizējo kodu. @@ -445,10 +445,10 @@ twofa_scratch_token_incorrect=Ievadīts nepareizs vienreizējais kods. login_userpass=Pieteikties tab_openid=OpenID oauth_signup_tab=Izveidot jaunu kontu -oauth_signup_title=Pabeigt jaunā konta izveidošanu +oauth_signup_title=Pabeigt jauna konta izveidošanu oauth_signup_submit=Pabeigt konta izveidošanu oauth_signin_tab=Sasaistīt ar esošu kontu -oauth_signin_title=Pieteikties, lai autorizētu sasaistīto kontu +oauth_signin_title=Pieteikties, lai pilnvarotu sasaistīto kontu oauth_signin_submit=Sasaistīt kontu oauth.signin.error=Pilnvarošanas pieprasījuma apstrādes laikā atgadījās kļūda. Jā tā atkārtojas, lūgums sazināties ar vietnes pārvaldītāju. oauth.signin.error.access_denied=Pilnvarošanas pieprasījums tika noraidīts. @@ -459,18 +459,18 @@ openid_connect_desc=Izvēlētais OpenID URI ir nezināms. Tas ir jāasasaista ar openid_register_title=Izveidot jaunu kontu openid_register_desc=Izvēlētais OpenID URI ir nezināms. Tas ir jāasasaista ar jaunu kontu šeit. openid_signin_desc=Jāievada OpenID URI. Piemēram, anna.openid.example.org vai https://openid.example.org/anna. -disable_forgot_password_mail=Konta atkopšana ir atspējota, jo nav uzstādīta e-pasta izsūtīšana. Lūgums sazināties ar vietnes pārvaldītāju. -disable_forgot_password_mail_admin=Kontu atkope ir pieejama tikai tad, kad ir veikta e-pasta servera iestatīšana. Lūgums iestatīt e-pasta serveri, lai iespējotu kontu atkopi. +disable_forgot_password_mail=Konta atkope ir atspējota, jo nav iestatīta e-pasta izsūtīšana. Lūgums sazināties ar vietnes pārvaldītāju. +disable_forgot_password_mail_admin=Kontu atkope ir pieejama tikai tad, kad ir veikta e-pasta servera iestatīšana. Lūgums iestatīt e-pasta serveri, lai varētu iespējot kontu atkopi. email_domain_blacklisted=Nav atļauts reģistrēties ar šādu e-pasta adresi. -authorize_application=Autorizēt lietotni -authorize_redirect_notice=Jūs tiksiet nosūtīts uz %s, ja autorizēsiet šo lietotni. +authorize_application=Pilnvarot lietotni +authorize_redirect_notice=Notiks pārvirzīšana uz %s, ja pilnvaroši šo lietotni. authorize_application_created_by=Šo lietotni izveidoja %s. authorize_application_description=Ja nodrošināsi piekļuvi, tā varēs piekļūt visai konta informācijai un mainīt to, tajā skaitā privātās glabātavas un apvienības. authorize_title=Pilnvarot "%s" piekļuvi Tavam kontam? -authorization_failed=Autorizācija neizdevās +authorization_failed=Pilnvarošana neizdevās authorization_failed_desc=Pilnvarošana neizdevās, jo tika noteikts nederīgs pieprasījums. Lūgums sazināties ar lietotnes, no kuras tika veikts pilnvarošanas pieprasījums, uzturētāju. sspi_auth_failed=SSPI autentifikācija neizdevās -password_pwned=Izvēlētā parole ir nozagto paroļu sarakstā, kas iepriekš ir atklāts publiskās datu noplūdēs. Lūgums mēģināt vēlreiz ar citu paroli un apsvērt to nomainīt arī citur. +password_pwned=Izvēlētā parole ir nozagto paroļu sarakstā, kas iepriekš ir atklāts pieejamās datu noplūdēs. Lūgums mēģināt vēlreiz ar citu paroli un apsvērt to nomainīt arī citur. password_pwned_err=Neizdevās pabeigt pieprasījumu uz HaveIBeenPwned back_to_sign_in = Atpakaļ uz pieteikšanos unauthorized_credentials = Pieteikšanās dati ir nepareizi vai ir izbeigušies. Jāizpilda komanda atkārtoti vai jāizmanto %s, lai iegūtu vairāk informācijas @@ -485,14 +485,14 @@ change_unconfirmed_email = Ja reģistrēšanās laikā tika iesniegta nepareiza sign_in_openid = Turpināt ar OpenID [mail] -view_it_on=Aplūkot %s +view_it_on=Apskatīt to %s reply=vai jāatbild uz šo e-pasta ziņojumu link_not_working_do_paste=Saite nedarbojas? Jāmēģina tā ievietot starpliktuvē un ielīmēt pārlūka adrešu joslā. -hi_user_x=Sveiki %s, +hi_user_x=Sveiciens, %s! activate_account=Lūgums aktivēt savu kontu activate_account.title=%s, aktivizējiet savu kontu -activate_account.text_1=Sveiki %[1]s, esat reģistrējies %[2]s! +activate_account.text_1=Sveiciens, %[1]s! Paldies par reģistrēšanos %[2]s! activate_account.text_2=Jāklikšķina uz šīs saites, lai aktivētu savu %s kontu: activate_email=Apliecini savu e-pasta adresi @@ -501,21 +501,21 @@ activate_email.text=Lūgums klikšķināt uz šīs saites, lai apliecinātu savu register_notify=Laipni lūdzam %s register_notify.title=%[1]s, esat reģistrējies %[2]s -register_notify.text_1=šis ir reģistrācijas apstiprinājuma e-pasts lapai %s! +register_notify.text_1=Šis ir apstiprinājuma e-pasta ziņojums reģistrācijai %s. register_notify.text_2=Tagad var pieteikties ar savu lietotājvārdu: %s register_notify.text_3=Ja šo kontu izveidoja kāds cits, vispirms ir nepieciešams iestatīt savu paroli. reset_password=Atgūt kontu reset_password.title=%s, esat pieprasījis atjaunot savu kontu -reset_password.text=Nospiediet uz saites, lai atjaunotu savu kontu lapā %s: +reset_password.text=Lūgums klikšķināt uz šīs saites, lai atjaunotu savu %s kontu: register_success=Reģistrācija bija sekmīga issue_assigned.pull=@%[1]s piešķīra izmaiņu pieprasījumu %[2]s glabātavā %[3]s. issue_assigned.issue=@%[1]s piešķīra pieteikumu %[2]s glabātavā %[3]s. -issue.x_mentioned_you=@%s pieminēja Jūs: -issue.action.force_push=%[1]s piespiedu kārtā aizgādāja izmaiņas %[2]s no %[3]s uz %[4]s. +issue.x_mentioned_you=@%s pieminēja Tevi: +issue.action.force_push=%[1]s uzspiesti aizgādāja izmaiņas %[2]s no %[3]s uz %[4]s. issue.action.push_1=@%[1]s aizgādāja %[3]d iesūtījumu uz %[2]s issue.action.push_n=@%[1]s aizgādāja %[3]d iesūtījumus uz %[2]s issue.action.close=@%[1]s aizvēra #%[2]d. @@ -534,8 +534,8 @@ release.new.text=@%[1]s izveidoja jaunu laidienu %[2]s glabātavā %[3]s release.title=Nosaukums: %s release.note=Piezīmes: release.downloads=Lejupielādes: -release.download.zip=Izejas kods (ZIP) -release.download.targz=Izejas kods (TAR.GZ) +release.download.zip=Pirmkods (ZIP) +release.download.targz=Pirmkods (TAR.GZ) repo.transfer.subject_to=%s vēlas nodot glabātavu "%s" %s repo.transfer.subject_to_you=%s vēlas nodot glabātavu "%s" @@ -545,9 +545,9 @@ repo.transfer.body=Lai to pieņemtu vai noraidītu, jāapmeklē %s vai arī vien repo.collaborator.added.subject=%s pievienoja Tevi glabātavai %s kā līdzdalībnieku repo.collaborator.added.text=Tevi pievienoja kā līdzdalībnieku glabātavā: -team_invite.subject=%[1]s uzaicināja Jūs pievienoties organizācijai %[2]s -team_invite.text_1=%[1]s uzaicināja Jūs pievienoties komandai %[2]s organizācijā %[3]s. -team_invite.text_2=Uzspiediet uz šīs saites, lai pievienoties komandai: +team_invite.subject=%[1]s uzaicināja pievienoties apvienībai %[2]s +team_invite.text_1=%[1]s uzaicināja pievienoties apvienības %[3] komandai %[2]s. +team_invite.text_2=Lūgums klikšķināt uz sekojošās saites, lai pievienotos komandai: team_invite.text_3=Piezīme: šis uzaicinājums ir paredzēts %[1]s. Ja šis ielūgums netika gaidīts, šo e-pasta ziņojumu var neņemt vērā. totp_enrolled.subject = Ir aktivēts TOTP kā divpakāpju pieteikšanās veids account_security_caution.text_1 = Ja tas biji Tu, tad šo e-pasta ziņojumu var droši neņemt vērā. @@ -585,7 +585,7 @@ SSHTitle=SSH atslēgas nosaukums HttpsUrl=HTTPS URL PayloadUrl=Vērtuma URL TeamName=Komandas nosaukums -AuthName=Autorizācijas nosaukums +AuthName=Pilnvarošanas nosaukums AdminEmail=Pārvaldītāja e-pasta adrese NewBranchName=Jaunais zara nosaukums @@ -618,20 +618,20 @@ password_not_match=Izvēlētā parole nesakrīt ar atkārtoti ievadīto. lang_select_error=Atlasīt valodu no saraksta. username_been_taken=Lietotājvārds jau ir aizņemts. -username_change_not_local_user=Ne-lokālie lietotāji nevar mainīt savus lietotājvārdus. +username_change_not_local_user=Ārējie lietotāji nevar mainīt savu lietotājvārdu. username_has_not_been_changed=Lietotājvārds netika mainīts repo_name_been_taken=Glabātavas nosaukums jau tiek izmantots. -repository_force_private=Iespējoti piespiedu privātās glabātavas: privātās glabātavas nevar padarīt pieejamas visiem. +repository_force_private=Iespējots "Uzspiest privātās": privātās glabātavas nevar padarīt pieejamas visiem. repository_files_already_exist=Šajā glabātavā jau atrodas datnes. Jāsazinās ar sistēmas pārvaldītāju. repository_files_already_exist.adopt=Šajā glabātavā jau atrodas datnes, un tās var tikai tikt pieņemtas. repository_files_already_exist.delete=Šajā glabātavā jau atrodas datnes. Tās ir jāizdzēš. repository_files_already_exist.adopt_or_delete=Šajā glabātavā jau atrodas datnes. Vai nu tās ir jāpieņem vai jāizdzēš. visit_rate_limit=Attālinātā piekļuve ir ierobežota ar ātruma ierobežotāju. -2fa_auth_required=Attālinātai piekļuvei ir nepieciešama divu faktoru autentifikācija. -org_name_been_taken=Organizācijas nosaukums jau ir aizņemts. +2fa_auth_required=Attālinātai piekļuvei ir nepieciešama divpakāpju pieteikšanās. +org_name_been_taken=Apvienības nosaukums jau ir aizņemts. team_name_been_taken=Komandas nosaukums jau ir aizņemts. team_no_units_error=Komandai ir jābūt iespējotai vismaz vienai sadaļai. -email_been_used=E-pasta adrese jau ir izmantota. +email_been_used=E-pasta adrese jau tiek izmantota. email_invalid=E-pasta adrese nav derīga. openid_been_used=OpenID adrese "%s" jau ir izmantota. username_password_incorrect=Nepareizs lietotājvārds vai parole. @@ -641,22 +641,22 @@ password_uppercase_one=Vismaz viens lielais burts password_digit_one=Vismaz viens cipars password_special_one=Vismaz viena īpaša rakstzīme (punkts, iekavas, pēdiņas utt.) enterred_invalid_repo_name=Ievadītais glabātavas nosaukums ir nepareizs. -enterred_invalid_org_name=Ievadītais organizācijas nosaukums ir nepareizs. +enterred_invalid_org_name=Ievadītais apvienības nosaukums ir nepareizs. enterred_invalid_owner_name=Jaunā īpašnieka vārds nav derīgs. enterred_invalid_password=Ievadītā parole ir nepareiza. user_not_exist=Lietotājs nepastāv. team_not_exist=Komanda nepastāv. last_org_owner=Nevar noņemt īpašnieku komandas pēdējo lietotāju. Apvienībai ir jābūt vismaz vienam īpašniekam. -cannot_add_org_to_team=Organizāciju nevar pievienot kā komandas biedru. -duplicate_invite_to_team=Lietotājs jau ir uzaicināts kā komandas biedrs. -organization_leave_success=Jūs esat pametis organizāciju %s. +cannot_add_org_to_team=Apvienību nevar pievienot kā komandas dalībnieku. +duplicate_invite_to_team=Lietotājs jau tika uzaicināts kā komandas dalībnieks. +organization_leave_success=Ir veiksmīgi atstāta apvienība %s. invalid_ssh_key=Nav iespējams pārbaudīt SSH atslēgu: %s invalid_gpg_key=Nav iespējams pārbaudīt GPG atslēgu: %s invalid_ssh_principal=Kļūdaina identitāte: %s must_use_public_key=Norādītā atslēga ir privātā atslēga. Lūgums nekur neaugšupielādēt savu privāto atslēgu. Jāizmanto sava publiskā atslēga. unable_verify_ssh_key=SSH atslēgu nav iespējams apliecināt. Kārtīgi jāpārbauda, vai nav pieļautas kļūdas. -auth_failed=Autentifikācija neizdevās: %v +auth_failed=Autentificēšanās neizdevās: %v still_own_repo=Kontam pieder vismaz viena vai vairākas glabātavas, tās vispirms ir jāizdzēš vai jānodod kādam. still_has_org=Konts ir vienas vai vairāku apvienību dalībnieks, vispirms tās ir jāpamet. @@ -680,11 +680,13 @@ AccessToken = Piekļuves pilnvara To = Zara nosaukums +email_domain_is_not_allowed = Lietotāja e-pasta adreses %s domēna vārds ir pretrunāt ar EMAIL_DOMAIN_ALLOWLIST vai EMAIL_DOMAIN_BLOCKLIST. Jāpārliecinās, ka e-pasta adrese ir norādīta pareizi. + [user] change_avatar=Mainīt profila attēlu… joined_on=Pievienojās %s repositories=Glabātavas -activity=Publiskie notikumi +activity=Atklāti notikumi followers_few=%d sekotāji starred=Izlasei pievienotās glabātavas watched=Vērotās glabātavas @@ -693,9 +695,9 @@ projects=Projekti overview=Pārskats following_few=%d seko follow=Sekot -unfollow=Nesekot -user_bio=Biogrāfija -disabled_public_activity=Šis lietotājs ir atslēdzies iespēju aplūkot tā aktivitāti. +unfollow=Pārtraukt sekot +user_bio=Apraksts par sevi +disabled_public_activity=Šis lietotājs ir atspējojis darbību redzamību visiem. email_visibility.limited=E-pasta adrese ir redzama visiem autentificētajiem lietotājiem email_visibility.private=E-pasta adrese ir redzama tikai administratoriem show_on_map=Rādīt šo vietu kartē @@ -734,22 +736,22 @@ avatar=Profila attēls ssh_gpg_keys=SSH / GPG atslēgas social=Sociālie konti applications=Lietotnes -orgs=Pārvaldīt apvienības +orgs=Apvienības repos=Glabātavas -delete=Dzēst kontu +delete=Izdzēst kontu twofa=Divpakāpju pieteikšanās (TOTP) account_link=Saistītie konti -organization=Organizācijas +organization=Apvienības uid=UID webauthn=Divpakāpju pieteikšanās (drošības atslēgas) -public_profile=Publiskais profils +public_profile=Visiem pieejamais profils biography_placeholder=Pastāsti citiem mazliet par sevi! (Tiek atbalstīts Markdown) location_placeholder=Kopīgot savu aptuveno atrašanās vietu ar citiem -profile_desc=Norādīt, kā profils tiek attēlots citiem lietotājiem. Primārā e-pasta adrese tiks izmantota paziņojumiem, paroles atjaunošanai un Git tīmekļa darbībām. +profile_desc=Par Tevi password_username_disabled=Ārējiem lietotājiem nav atļauts mainīt savu lietotājvārdu. Lūgums sazināties ar vietnes pārvaldītāju, lai uzzinātu vairāk. full_name=Pilns vārds -website=Mājas lapa +website=Tīmekļvietne location=Atrašanās vieta update_theme=Mainīt izskatu update_profile=Atjaunināt profilu @@ -759,13 +761,13 @@ update_language_success=Valoda tika nomainīta. update_profile_success=Profils tika atjaunināts. change_username=Lietotājvārds mainīts. change_username_prompt=Piezīme: lietotājvārda mainīšana maina arī konta URL. -change_username_redirect_prompt=Iepriekšējais lietotājvārds tiks pārvirzīts, kamēr neviens cits to neizmanto. +change_username_redirect_prompt=Iepriekšējais lietotājvārds tiks pārvirzīts, līdz kāds to izmantos. continue=Turpināt cancel=Atcelt language=Valoda ui=Motīvs hidden_comment_types=Slēpjamo piebilžu veidi -hidden_comment_types_description=Šeit atzīmētie piebilžu veidi netiks attēloti pieteikumu lapās. "Iezīme" atzīmēšana, piemēram, noņems visas " pievienoja/noņēma