mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2025-04-23 03:21:35 +02:00
Compare commits
63 commits
Author | SHA1 | Date | |
---|---|---|---|
|
39843ee2b3 | ||
|
3b7ed0cda2 | ||
|
2b1e74a76f | ||
|
c439e26c33 | ||
|
317559fdd9 | ||
|
b88cd0c111 | ||
|
5326183693 | ||
|
5b6e0ca99c | ||
|
90730e83ba | ||
|
775770ad81 | ||
|
4eb7e0fe08 | ||
|
597d806753 | ||
|
2b6a4137d5 | ||
|
35266133d8 | ||
|
dab3121c65 | ||
|
3ce1a6562d | ||
|
3b5f162fe6 | ||
|
f63e5a1cff | ||
|
25640f201e | ||
|
ef205915cc | ||
|
81d351ce5f | ||
|
cd08097bbb | ||
|
13496203bc | ||
|
8f47560bf7 | ||
|
9e6c3f226c | ||
|
c7c7f69f82 | ||
|
86a09562fd | ||
|
ce5c3e32c1 | ||
|
fa9f6e0cdd | ||
|
172a48be8a | ||
|
4a25a3e154 | ||
|
6266715486 | ||
|
3496c819da | ||
|
4f8d96a6de | ||
|
8d353ad258 | ||
|
865d4f538b | ||
|
ecbbaabfc8 | ||
|
38f058a5f0 | ||
|
1a64ae1dc4 | ||
|
a8cc73fe87 | ||
|
7a84081755 | ||
|
2ac9b16297 | ||
|
2bcbfbc5d4 | ||
|
4999de50c3 | ||
|
eb00a80efc | ||
|
c7c22aae8c | ||
|
0eab84d02e | ||
|
e71fd7d28d | ||
|
055348430e | ||
|
440be42baf | ||
|
f1b98d16c7 | ||
|
662b385596 | ||
|
023aaef2b9 | ||
|
cb745a771a | ||
|
38d2933cc1 | ||
|
5a0c79e6b4 | ||
|
424f85304e | ||
|
382db9e8de | ||
|
0ff66fa3bb | ||
|
d5c5724f44 | ||
|
1da56f0eb8 | ||
|
6a78a71172 | ||
|
f6c442c2fe |
113 changed files with 6369 additions and 2096 deletions
|
@ -164,7 +164,7 @@ jobs:
|
|||
|
||||
- name: build container & release
|
||||
if: ${{ secrets.TOKEN != '' }}
|
||||
uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.2.1
|
||||
uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.3.1
|
||||
with:
|
||||
forgejo: "${{ env.GITHUB_SERVER_URL }}"
|
||||
owner: "${{ env.GITHUB_REPOSITORY_OWNER }}"
|
||||
|
@ -183,7 +183,7 @@ jobs:
|
|||
|
||||
- name: build rootless container
|
||||
if: ${{ secrets.TOKEN != '' }}
|
||||
uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.2.1
|
||||
uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.3.1
|
||||
with:
|
||||
forgejo: "${{ env.GITHUB_SERVER_URL }}"
|
||||
owner: "${{ env.GITHUB_REPOSITORY_OWNER }}"
|
||||
|
|
|
@ -42,7 +42,7 @@ jobs:
|
|||
- uses: actions/checkout@v4
|
||||
|
||||
- name: copy & sign
|
||||
uses: https://data.forgejo.org/forgejo/forgejo-build-publish/publish@v5.2.1
|
||||
uses: https://data.forgejo.org/forgejo/forgejo-build-publish/publish@v5.3.1
|
||||
with:
|
||||
from-forgejo: ${{ vars.FORGEJO }}
|
||||
to-forgejo: ${{ vars.FORGEJO }}
|
||||
|
|
7
assets/go-licenses.json
generated
7
assets/go-licenses.json
generated
|
@ -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",
|
||||
|
|
|
@ -59,9 +59,9 @@ func initRemoveTags() {
|
|||
oldnew := []string{}
|
||||
for _, el := range []string{
|
||||
"email@example.com", "correu@example.com", "epasts@domens.lv", "email@exemplo.com", "eposta@ornek.com", "email@példa.hu", "email@esempio.it",
|
||||
"user", "utente", "lietotājs", "gebruiker", "usuário", "Benutzer", "Bruker",
|
||||
"user", "utente", "lietotājs", "gebruiker", "usuário", "Benutzer", "Bruker", "bruger",
|
||||
"server", "servidor", "kiszolgáló", "serveris",
|
||||
"label", "etichetta", "etiķete", "rótulo", "Label", "utilizador",
|
||||
"label", "etichetta", "etiķete", "rótulo", "Label", "utilizador", "etiket", "iezīme",
|
||||
} {
|
||||
oldnew = append(oldnew, "<"+el+">", "REPLACED-TAG")
|
||||
}
|
||||
|
|
20
go.mod
20
go.mod
|
@ -5,7 +5,7 @@ go 1.23
|
|||
toolchain go1.23.4
|
||||
|
||||
require (
|
||||
code.forgejo.org/f3/gof3/v3 v3.7.0
|
||||
code.forgejo.org/f3/gof3/v3 v3.10.2
|
||||
code.forgejo.org/forgejo-contrib/go-libravatar v0.0.0-20191008002943-06d1c002b251
|
||||
code.forgejo.org/forgejo/reply v1.0.2
|
||||
code.forgejo.org/go-chi/binding v1.0.0
|
||||
|
@ -19,10 +19,10 @@ require (
|
|||
gitea.com/lunny/levelqueue v0.4.2-0.20230414023320-3c0159fe0fe4
|
||||
github.com/42wim/sshsig v0.0.0-20211121163825-841cf5bbc121
|
||||
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358
|
||||
github.com/ProtonMail/go-crypto v1.0.0
|
||||
github.com/ProtonMail/go-crypto v1.1.3
|
||||
github.com/PuerkitoBio/goquery v1.10.0
|
||||
github.com/SaveTheRbtz/zstd-seekable-format-go/pkg v0.7.2
|
||||
github.com/alecthomas/chroma/v2 v2.14.0
|
||||
github.com/alecthomas/chroma/v2 v2.15.0
|
||||
github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb
|
||||
github.com/blevesearch/bleve/v2 v2.4.4
|
||||
github.com/buildkite/terminal-to-html/v3 v3.16.4
|
||||
|
@ -44,7 +44,7 @@ require (
|
|||
github.com/go-co-op/gocron v1.37.0
|
||||
github.com/go-enry/go-enry/v2 v2.9.1
|
||||
github.com/go-fed/httpsig v1.1.1-0.20201223112313-55836744818e
|
||||
github.com/go-git/go-git/v5 v5.11.0
|
||||
github.com/go-git/go-git/v5 v5.13.1
|
||||
github.com/go-ldap/ldap/v3 v3.4.6
|
||||
github.com/go-openapi/spec v0.20.14
|
||||
github.com/go-sql-driver/mysql v1.8.1
|
||||
|
@ -89,7 +89,7 @@ require (
|
|||
github.com/robfig/cron/v3 v3.0.1
|
||||
github.com/santhosh-tekuri/jsonschema/v6 v6.0.1
|
||||
github.com/sassoftware/go-rpmutils v0.4.0
|
||||
github.com/sergi/go-diff v1.3.1
|
||||
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3
|
||||
github.com/shurcooL/vfsgen v0.0.0-20230704071429-0000e147ea92
|
||||
github.com/stretchr/testify v1.10.0
|
||||
github.com/syndtr/goleveldb v1.0.0
|
||||
|
@ -131,6 +131,7 @@ require (
|
|||
dario.cat/mergo v1.0.0 // indirect
|
||||
filippo.io/edwards25519 v1.1.0 // indirect
|
||||
git.sr.ht/~mariusor/go-xsd-duration v0.0.0-20220703122237-02e73435a078 // indirect
|
||||
github.com/42wim/httpsig v1.2.2 // indirect
|
||||
github.com/DataDog/zstd v1.5.5 // indirect
|
||||
github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0 // indirect
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.2 // indirect
|
||||
|
@ -168,11 +169,11 @@ require (
|
|||
github.com/cloudflare/circl v1.3.8 // indirect
|
||||
github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 // indirect
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect
|
||||
github.com/cyphar/filepath-securejoin v0.2.4 // indirect
|
||||
github.com/cyphar/filepath-securejoin v0.3.6 // indirect
|
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
||||
github.com/davidmz/go-pageant v1.0.2 // indirect
|
||||
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
|
||||
github.com/dlclark/regexp2 v1.11.0 // indirect
|
||||
github.com/dlclark/regexp2 v1.11.4 // indirect
|
||||
github.com/emersion/go-sasl v0.0.0-20231106173351-e73c9f7bad43 // indirect
|
||||
github.com/emirpasic/gods v1.18.1 // indirect
|
||||
github.com/envoyproxy/go-control-plane v0.13.1 // indirect
|
||||
|
@ -184,7 +185,7 @@ require (
|
|||
github.com/go-asn1-ber/asn1-ber v1.5.5 // indirect
|
||||
github.com/go-enry/go-oniguruma v1.2.1 // indirect
|
||||
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
|
||||
github.com/go-git/go-billy/v5 v5.5.0 // indirect
|
||||
github.com/go-git/go-billy/v5 v5.6.1 // indirect
|
||||
github.com/go-ini/ini v1.67.0 // indirect
|
||||
github.com/go-logr/logr v1.4.2 // indirect
|
||||
github.com/go-logr/stdr v1.2.2 // indirect
|
||||
|
@ -246,13 +247,14 @@ require (
|
|||
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
||||
github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c // indirect
|
||||
github.com/sirupsen/logrus v1.9.3 // indirect
|
||||
github.com/skeema/knownhosts v1.2.1 // indirect
|
||||
github.com/skeema/knownhosts v1.3.0 // indirect
|
||||
github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf // indirect
|
||||
github.com/x448/float16 v0.8.4 // indirect
|
||||
github.com/xanzy/ssh-agent v0.3.3 // indirect
|
||||
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect
|
||||
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect
|
||||
github.com/zeebo/blake3 v0.2.4 // indirect
|
||||
gitlab.com/gitlab-org/api/client-go v0.116.0 // indirect
|
||||
go.etcd.io/bbolt v1.3.9 // indirect
|
||||
go.opencensus.io v0.24.0 // indirect
|
||||
go.opentelemetry.io/contrib/detectors/gcp v1.31.0 // indirect
|
||||
|
|
58
go.sum
58
go.sum
|
@ -610,8 +610,8 @@ cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoIS
|
|||
cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M=
|
||||
cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA=
|
||||
cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw=
|
||||
code.forgejo.org/f3/gof3/v3 v3.7.0 h1:ZfuCP8CGm8ZJbWmL+V0pUu3E0X4FCAA7GfRDy/y5/K4=
|
||||
code.forgejo.org/f3/gof3/v3 v3.7.0/go.mod h1:oNhOeqD4DZYjVcNjQXIOdDX9b/1tqxi9ITLS8H9/Csw=
|
||||
code.forgejo.org/f3/gof3/v3 v3.10.2 h1:EOlv9d8GR7l0BmvZF101O3LUuabb4g5Hw5fKYPiPZlI=
|
||||
code.forgejo.org/f3/gof3/v3 v3.10.2/go.mod h1:qApIHumpBkFkeBEokviO28+HK2WM11IsmMOhmjvCjFQ=
|
||||
code.forgejo.org/forgejo-contrib/go-libravatar v0.0.0-20191008002943-06d1c002b251 h1:HTZl3CBk3ABNYtFI6TPLvJgGKFIhKT5CBk0sbOtkDKU=
|
||||
code.forgejo.org/forgejo-contrib/go-libravatar v0.0.0-20191008002943-06d1c002b251/go.mod h1:PphB88CPbx601QrWPMZATeorACeVmQlyv3u+uUMbSaM=
|
||||
code.forgejo.org/forgejo/act v1.22.0 h1:NbUf0+vQ48+ddwe4zVkINqnxKYl/to+NUvW7iisPA60=
|
||||
|
@ -651,6 +651,8 @@ gitea.com/lunny/levelqueue v0.4.2-0.20230414023320-3c0159fe0fe4 h1:IFT+hup2xejHq
|
|||
gitea.com/lunny/levelqueue v0.4.2-0.20230414023320-3c0159fe0fe4/go.mod h1:HBqmLbz56JWpfEGG0prskAV97ATNRoj5LDmPicD22hU=
|
||||
gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:lSA0F4e9A2NcQSqGqTOXqu2aRi/XEQxDCBwM8yJtE6s=
|
||||
gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:EXuID2Zs0pAQhH8yz+DNjUbjppKQzKFAn28TMYPB6IU=
|
||||
github.com/42wim/httpsig v1.2.2 h1:ofAYoHUNs/MJOLqQ8hIxeyz2QxOz8qdSVvp3PX/oPgA=
|
||||
github.com/42wim/httpsig v1.2.2/go.mod h1:P/UYo7ytNBFwc+dg35IubuAUIs8zj5zzFIgUCEl55WY=
|
||||
github.com/42wim/sshsig v0.0.0-20211121163825-841cf5bbc121 h1:r3qt8PCHnfjOv9PN3H+XXKmDA1dfFMIN1AislhlA/ps=
|
||||
github.com/42wim/sshsig v0.0.0-20211121163825-841cf5bbc121/go.mod h1:Ock8XgA7pvULhIaHGAk/cDnRfNrF9Jey81nPcc403iU=
|
||||
github.com/6543/go-version v1.3.1 h1:HvOp+Telns7HWJ2Xo/05YXQSB2bE0WmVgbHqwMPZT4U=
|
||||
|
@ -674,8 +676,8 @@ github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v
|
|||
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
|
||||
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
|
||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
||||
github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78=
|
||||
github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0=
|
||||
github.com/ProtonMail/go-crypto v1.1.3 h1:nRBOetoydLeUb4nHajyO2bKqMLfWQ/ZPwkXqXxPxCFk=
|
||||
github.com/ProtonMail/go-crypto v1.1.3/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE=
|
||||
github.com/PuerkitoBio/goquery v1.10.0 h1:6fiXdLuUvYs2OJSvNRqlNPoBm6YABE226xrbavY5Wv4=
|
||||
github.com/PuerkitoBio/goquery v1.10.0/go.mod h1:TjZZl68Q3eGHNBA8CWaxAN7rOU1EbDz3CWuolcO5Yu4=
|
||||
github.com/RoaringBitmap/roaring v1.9.3 h1:t4EbC5qQwnisr5PrP9nt0IRhRTb9gMUgQF4t4S2OByM=
|
||||
|
@ -686,11 +688,11 @@ github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm
|
|||
github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=
|
||||
github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
|
||||
github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=
|
||||
github.com/alecthomas/assert/v2 v2.7.0 h1:QtqSACNS3tF7oasA8CU6A6sXZSBDqnm7RfpLl9bZqbE=
|
||||
github.com/alecthomas/assert/v2 v2.7.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
|
||||
github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0=
|
||||
github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
|
||||
github.com/alecthomas/chroma/v2 v2.2.0/go.mod h1:vf4zrexSH54oEjJ7EdB65tGNHmH3pGZmVkgTP5RHvAs=
|
||||
github.com/alecthomas/chroma/v2 v2.14.0 h1:R3+wzpnUArGcQz7fCETQBzO5n9IMNi13iIs46aU4V9E=
|
||||
github.com/alecthomas/chroma/v2 v2.14.0/go.mod h1:QolEbTfmUHIMVpBqxeDnNBj2uoeI4EbYP4i6n68SG4I=
|
||||
github.com/alecthomas/chroma/v2 v2.15.0 h1:LxXTQHFoYrstG2nnV9y2X5O94sOBzf0CIUpSTbpxvMc=
|
||||
github.com/alecthomas/chroma/v2 v2.15.0/go.mod h1:gUhVLrPDXPtp/f+L1jo9xepo9gL4eLwRuGAunSZMkio=
|
||||
github.com/alecthomas/repr v0.0.0-20220113201626-b1b626ac65ae/go.mod h1:2kn6fqh/zIyPLmm3ugklbEi5hg5wS435eygvNfaDQL8=
|
||||
github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc=
|
||||
github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
|
||||
|
@ -768,7 +770,6 @@ github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
|
|||
github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
|
||||
github.com/buildkite/terminal-to-html/v3 v3.16.4 h1:QFYO8IGvRnp7tGgiQb8g9uFU8kY9wOzxsFFx17+yy6Q=
|
||||
github.com/buildkite/terminal-to-html/v3 v3.16.4/go.mod h1:r/J7cC9c3EzBzP3/wDz0RJLPwv5PUAMp+KF2w+ntMc0=
|
||||
github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0=
|
||||
github.com/caddyserver/certmagic v0.21.4 h1:e7VobB8rffHv8ZZpSiZtEwnLDHUwLVYLWzWSa1FfKI0=
|
||||
github.com/caddyserver/certmagic v0.21.4/go.mod h1:swUXjQ1T9ZtMv95qj7/InJvWLXURU85r+CfG0T+ZbDE=
|
||||
github.com/caddyserver/zerossl v0.1.3 h1:onS+pxp3M8HnHpN5MMbOMyNjmTheJyWRaZYwn+YTAyA=
|
||||
|
@ -796,7 +797,6 @@ github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObk
|
|||
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
||||
github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8=
|
||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||
github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA=
|
||||
github.com/cloudflare/circl v1.3.8 h1:j+V8jJt09PoeMFIu2uh5JUyEaIHTXVOHslFoLNAKqwI=
|
||||
github.com/cloudflare/circl v1.3.8/go.mod h1:PDRU+oXvdD7KCtgKxW95M5Z8BpSCJXQORiZFnBQS5QU=
|
||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
||||
|
@ -817,8 +817,8 @@ github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1Ig
|
|||
github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||
github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg=
|
||||
github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
|
||||
github.com/cyphar/filepath-securejoin v0.3.6 h1:4d9N5ykBnSp5Xn2JkhocYDkOpURL/18CYMpo6xB9uWM=
|
||||
github.com/cyphar/filepath-securejoin v0.3.6/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
|
||||
|
@ -837,8 +837,8 @@ github.com/djherbis/nio/v3 v3.0.1/go.mod h1:Ng4h80pbZFMla1yKzm61cF0tqqilXZYrogmW
|
|||
github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
|
||||
github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
|
||||
github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
|
||||
github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI=
|
||||
github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
|
||||
github.com/dlclark/regexp2 v1.11.4 h1:rPYF9/LECdNymJufQKmri9gV604RvvABwgOA8un7yAo=
|
||||
github.com/dlclark/regexp2 v1.11.4/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
|
||||
github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
|
||||
github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5/go.mod h1:qssHWj60/X5sZFNxpG4HBPDHVqxNm4DfnCKgrbZOT+s=
|
||||
github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707 h1:2tV76y6Q9BB+NEBasnqvs7e49aEBFI8ejC89PSnWH+4=
|
||||
|
@ -849,8 +849,8 @@ github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkp
|
|||
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
|
||||
github.com/editorconfig/editorconfig-core-go/v2 v2.6.2 h1:dKG8sc7n321deIVRcQtwlMNoBEra7j0qQ8RwxO8RN0w=
|
||||
github.com/editorconfig/editorconfig-core-go/v2 v2.6.2/go.mod h1:7dvD3GCm7eBw53xZ/lsiq72LqobdMg3ITbMBxnmJmqY=
|
||||
github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU=
|
||||
github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM=
|
||||
github.com/elazarl/goproxy v1.2.3 h1:xwIyKHbaP5yfT6O9KIeYJR5549MXRQkoQMRXGztz8YQ=
|
||||
github.com/elazarl/goproxy v1.2.3/go.mod h1:YfEbZtqP4AetfO6d40vWchF3znWX7C7Vd6ZMfdL8z64=
|
||||
github.com/emersion/go-imap v1.2.1 h1:+s9ZjMEjOB8NzZMVTM3cCenz2JrQIGGo5j1df19WjTA=
|
||||
github.com/emersion/go-imap v1.2.1/go.mod h1:Qlx1FSx2FTxjnjWpIlVNEuX+ylerZQNFE5NsmKFSejY=
|
||||
github.com/emersion/go-message v0.15.0/go.mod h1:wQUEfE+38+7EW8p8aZ96ptg6bAb1iwdgej19uXASlE4=
|
||||
|
@ -929,12 +929,12 @@ github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2H
|
|||
github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=
|
||||
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI=
|
||||
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic=
|
||||
github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU=
|
||||
github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow=
|
||||
github.com/go-git/go-billy/v5 v5.6.1 h1:u+dcrgaguSSkbjzHwelEjc0Yj300NUevrrPphk/SoRA=
|
||||
github.com/go-git/go-billy/v5 v5.6.1/go.mod h1:0AsLr1z2+Uksi4NlElmMblP5rPcDZNRCD8ujZCRR2BE=
|
||||
github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4=
|
||||
github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII=
|
||||
github.com/go-git/go-git/v5 v5.11.0 h1:XIZc1p+8YzypNr34itUfSvYJcv+eYdTnTvOZ2vD3cA4=
|
||||
github.com/go-git/go-git/v5 v5.11.0/go.mod h1:6GFcX2P3NM7FPBfpePbpLd21XxsgdAt+lKqXmCUiUCY=
|
||||
github.com/go-git/go-git/v5 v5.13.1 h1:DAQ9APonnlvSWpvolXWIuV6Q6zXy2wHbN4cVlNR5Q+M=
|
||||
github.com/go-git/go-git/v5 v5.13.1/go.mod h1:qryJB4cSBoq3FRoBRf5A77joojuBcmPJ0qu3XXXVixc=
|
||||
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||
|
@ -1300,8 +1300,8 @@ github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042
|
|||
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
||||
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
||||
github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI=
|
||||
github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M=
|
||||
github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k=
|
||||
github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY=
|
||||
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
|
||||
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
|
||||
github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug=
|
||||
|
@ -1373,8 +1373,8 @@ github.com/sassoftware/go-rpmutils v0.4.0/go.mod h1:3goNWi7PGAT3/dlql2lv3+MSN5jN
|
|||
github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys=
|
||||
github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs=
|
||||
github.com/serenize/snaker v0.0.0-20171204205717-a683aaf2d516/go.mod h1:Yow6lPLSAXx2ifx470yD/nUe22Dv5vBvxK/UK9UUTVs=
|
||||
github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8=
|
||||
github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I=
|
||||
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8=
|
||||
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4=
|
||||
github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k=
|
||||
github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME=
|
||||
github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c h1:aqg5Vm5dwtvL+YgDpBcK1ITf3o96N/K7/wsRXQnUTEs=
|
||||
|
@ -1382,8 +1382,8 @@ github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c/go.mod h1:owqhoLW1
|
|||
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
||||
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
|
||||
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
||||
github.com/skeema/knownhosts v1.2.1 h1:SHWdIUa82uGZz+F+47k8SY4QhhI291cXCpopT1lK2AQ=
|
||||
github.com/skeema/knownhosts v1.2.1/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo=
|
||||
github.com/skeema/knownhosts v1.3.0 h1:AM+y0rI04VksttfwjkSTNQorvGqmwATnvnAHpSgc0LY=
|
||||
github.com/skeema/knownhosts v1.3.0/go.mod h1:sPINvnADmT/qYH1kfv+ePMmOBTH6Tbl7b5LvTDjFK7M=
|
||||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
||||
github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4=
|
||||
github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
|
||||
|
@ -1449,6 +1449,8 @@ github.com/zeebo/blake3 v0.2.4/go.mod h1:7eeQ6d2iXWRGF6npfaxl2CU+xy2Fjo2gxeyZGCR
|
|||
github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo=
|
||||
github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4=
|
||||
github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA=
|
||||
gitlab.com/gitlab-org/api/client-go v0.116.0 h1:Dy534gtZPMrnm3fAcmQRMadrcoUyFO4FQ4rXlSAdHAw=
|
||||
gitlab.com/gitlab-org/api/client-go v0.116.0/go.mod h1:B29OfnZklmaoiR7uHANh9jTyfWEgmXvZLVEnosw2Dx0=
|
||||
go.etcd.io/bbolt v1.3.9 h1:8x7aARPEXiXbHmtUwAIv7eV2fQFHrLLavdiJ3uzJXoI=
|
||||
go.etcd.io/bbolt v1.3.9/go.mod h1:zaO32+Ti0PK1ivdPtgMESzuzL2VPoIG1PCQNvOdo/dE=
|
||||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
||||
|
@ -1501,8 +1503,6 @@ golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5
|
|||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
|
||||
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
|
||||
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
|
||||
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
|
||||
golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
|
||||
|
@ -1522,6 +1522,8 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0
|
|||
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
|
||||
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
|
||||
golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE=
|
||||
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8=
|
||||
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY=
|
||||
golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
|
||||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
|
|
|
@ -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"`
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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").
|
||||
|
|
|
@ -4,6 +4,8 @@
|
|||
package v1_23 //nolint
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"code.gitea.io/gitea/models/migrations/base"
|
||||
|
||||
"xorm.io/xorm"
|
||||
|
@ -13,20 +15,26 @@ func GiteaLastDrop(x *xorm.Engine) error {
|
|||
sess := x.NewSession()
|
||||
defer sess.Close()
|
||||
|
||||
if err := base.DropTableColumns(sess, "badge", "slug"); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := base.DropTableColumns(sess, "oauth2_application", "skip_secondary_authorization"); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := base.DropTableColumns(sess, "repository", "default_wiki_branch"); err != nil {
|
||||
return err
|
||||
}
|
||||
// the migration v297.go that adds everyone_access_mode exists in Gitea >= v1.22 and the column must be dropped
|
||||
// but it does not exist in Forgejo and a failure to drop the column can be ignored
|
||||
base.DropTableColumns(sess, "repo_unit", "everyone_access_mode")
|
||||
if err := base.DropTableColumns(sess, "protected_branch", "can_force_push", "enable_force_push_allowlist", "force_push_allowlist_user_i_ds", "force_push_allowlist_team_i_ds", "force_push_allowlist_deploy_keys"); err != nil {
|
||||
return err
|
||||
for _, drop := range []struct {
|
||||
table string
|
||||
field string
|
||||
}{
|
||||
{"badge", "slug"},
|
||||
{"oauth2_application", "skip_secondary_authorization"},
|
||||
{"repository", "default_wiki_branch"},
|
||||
{"repo_unit", "everyone_access_mode"},
|
||||
{"protected_branch", "can_force_push"},
|
||||
{"protected_branch", "enable_force_push_allowlist"},
|
||||
{"protected_branch", "force_push_allowlist_user_i_ds"},
|
||||
{"protected_branch", "force_push_allowlist_team_i_ds"},
|
||||
{"protected_branch", "force_push_allowlist_deploy_keys"},
|
||||
} {
|
||||
if _, err := sess.Exec(fmt.Sprintf("SELECT `%s` FROM `%s` WHERE 0 = 1", drop.field, drop.table)); err != nil {
|
||||
continue
|
||||
}
|
||||
if err := base.DropTableColumns(sess, drop.table, drop.field); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return sess.Commit()
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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())
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -152,8 +152,8 @@ func HelloWorld() {
|
|||
}
|
||||
#+end_src
|
||||
`, `<div class="src src-go">
|
||||
<pre><code class="chroma language-go"><span class="c1">// HelloWorld prints "Hello World"
|
||||
</span><span class="c1"></span><span class="kd">func</span> <span class="nf">HelloWorld</span><span class="p">()</span> <span class="p">{</span>
|
||||
<pre><code class="chroma language-go"><span class="c1">// HelloWorld prints "Hello World"</span>
|
||||
<span class="kd">func</span> <span class="nf">HelloWorld</span><span class="p">()</span> <span class="p">{</span>
|
||||
<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">"Hello World"</span><span class="p">)</span>
|
||||
<span class="p">}</span></code></pre>
|
||||
</div>`)
|
||||
|
|
|
@ -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|[:;,.?!]$)`)
|
||||
|
|
|
@ -466,6 +466,7 @@ func TestRegExp_issueAlphanumericPattern(t *testing.T) {
|
|||
"ABC-123:",
|
||||
"\"ABC-123\"",
|
||||
"'ABC-123'",
|
||||
"ABC-123, unknown PR",
|
||||
}
|
||||
falseTestCases := []string{
|
||||
"RC-08",
|
||||
|
|
|
@ -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
|
||||
},
|
||||
|
|
|
@ -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 на вашия език! <a href="%s">Научете повече</a>.
|
||||
language.description = Този език ще бъде запазен във вашия акаунт и ще се използва като език по подразбиране, след като влезете.
|
||||
pronouns_custom = Персонализирани
|
||||
visibility.limited_tooltip = Видимо само за влезли потребители
|
||||
pronouns_custom_label = Персонализирани местоимения
|
||||
|
||||
[packages]
|
||||
container.labels.value = Стойност
|
||||
|
@ -280,6 +284,9 @@ dependencies = Зависимости
|
|||
published_by_in = Публикуван %[1]s от <a href="%[2]s">%[3]s</a> в <a href="%[4]s"><strong>%[5]s</strong></a>
|
||||
published_by = Публикуван %[1]s от <a href="%[2]s">%[3]s</a>
|
||||
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 = Хранилището съдържа всички файлове на проекта, включително хронологията на ревизиите. Вече хоствате хранилище другаде? <a href="%s">Мигрирайте хранилище.</a>
|
||||
new_repo_helper = Хранилището съдържа всички файлове на проекта, включително хронологията на ревизиите. Вече хоствате хранилище другаде? <a href="%s">Мигрирайте хранилище</a>.
|
||||
repo_name_helper = Добрите имена на хранилища използват кратки, запомнящи се и уникални ключови думи.
|
||||
migrated_from = Мигрирано от <a href="%[1]s">%[2]s</a>
|
||||
visibility_description = Само притежателят или участниците в организацията, ако имат права, ще могат да го видят.
|
||||
|
@ -424,14 +431,14 @@ settings.add_webhook = Добавяне на уеб-кука
|
|||
template.webhooks = Уеб-куки
|
||||
issues.label_templates.info = Все още няма етикети. Създайте етикет с „Нов етикет“ или използвайте предварително зададен набор от етикети:
|
||||
labels = Етикети
|
||||
license_helper_desc = Лицензът определя какво могат и какво не могат да правят другите с вашия код. Не сте сигурни кой е подходящ за вашия проект? Вижте <a target="_blank" rel="noopener noreferrer" href="%s">Избиране на лиценз.</a>
|
||||
license_helper_desc = Лицензът определя какво могат и какво не могат да правят другите с вашия код. Не сте сигурни кой е подходящ за вашия проект? Вижте <a target="_blank" rel="noopener noreferrer" href="%s">Избиране на лиценз</a>.
|
||||
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 = заключи като <strong>%s</strong> и ограничи обсъждането до сътрудници %s
|
||||
milestones.new_subheader = Етапите ви помагат да управлявате задачите и да проследявате напредъка им.
|
||||
release.edit = редактиране
|
||||
release.edit = Редактиране
|
||||
activity.published_release_label = Издание
|
||||
activity.navbar.contributors = Допринесли
|
||||
pulls.recently_pushed_new_branches = Изтласкахте в клона <a href="%[3]s"><strong>%[1]s</strong></a> %[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 = <a href="%s">Влезте</a>, за да създадете нова заявка за сливане.
|
||||
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 = Здравейте, <b>%[1]s</b>, благодарим
|
|||
activate_email.text = Моля, щракнете върху следната връзка, за да потвърдите своя адрес на ел. поща в рамките на <b>%s</b>:
|
||||
activate_email = Потвърдете своя адрес на ел. поща
|
||||
activate_account.text_2 = Моля, щракнете върху следната връзка, за да активирате своя акаунт в рамките на <b>%s</b>:
|
||||
issue_assigned.issue = @%[1]s ви възложи задача %[2]s в хранилище %[3]s.
|
||||
issue.action.push_n = <b>@%[1]s</b> изтласка %[3]d подавания към %[2]s
|
||||
issue.action.push_1 = <b>@%[1]s</b> изтласка %[3]d подаване към %[2]s
|
||||
repo.transfer.subject_to_you = %s иска да прехвърли хранилище "%s" към вас
|
||||
issue.action.merge = <b>@%[1]s</b> сля #%[2]d в %[3]s.
|
||||
issue_assigned.pull = @%[1]s ви възложи заявката за сливане %[2]s в хранилище %[3]s.
|
||||
issue.action.ready_for_review = <b>@%[1]s</b> отбеляза тази заявка за сливане като готова за рецензиране.
|
||||
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 = Вашата дейност е видима за всички, с изключение на взаимодействията в частни пространства. <a href="%s">Конфигуриране</a>.
|
||||
form.name_pattern_not_allowed = Шаблонът "%s" не е разрешен в потребителско име.
|
||||
form.name_reserved = Потребителското име "%s" е резервирано.
|
||||
public_activity.visibility_hint.self_private_profile = Вашата дейност е видима само за вас и администраторите на инстанцията, тъй като вашият профил е частен. <a href="%s">Конфигуриране</a>.
|
||||
|
||||
[home]
|
||||
filter = Други филтри
|
||||
|
@ -1661,6 +1777,7 @@ variables.creation = Добавяне на променлива
|
|||
variables.deletion.failed = Неуспешно премахване на променлива.
|
||||
runners.task_list.repository = Хранилище
|
||||
runners.description = Описание
|
||||
runs.no_workflows.help_no_write_access = За да научите повече за Forgejo Actions, вижте <a target="_blank" rel="noopener noreferrer" href="%s">документацията</a>.
|
||||
|
||||
[heatmap]
|
||||
less = По-малко
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
[common]
|
||||
home = inici
|
||||
home = Inici
|
||||
dashboard = Panell de control
|
||||
explore = Explorar
|
||||
help = Ajuda
|
||||
logo = Logo
|
||||
sign_in = Entrar
|
||||
sign_in = Iniciar sessió
|
||||
sign_in_with_provider = Entra amb %s
|
||||
sign_in_or = o
|
||||
sign_out = Sortir
|
||||
|
@ -15,7 +15,7 @@ page = Pàgina
|
|||
template = Plantilla
|
||||
language = Idioma
|
||||
notifications = Notificacions
|
||||
active_stopwatch = Registre de Temps Actiu
|
||||
active_stopwatch = Registre de temps actiu
|
||||
create_new = Crear…
|
||||
user_profile_and_more = Perfil i Configuració…
|
||||
signed_in_as = Entrat com
|
||||
|
@ -140,6 +140,14 @@ filter.not_archived = No arxivats
|
|||
filter.not_fork = No és fork
|
||||
filter.is_fork = Són forks
|
||||
|
||||
new_repo.title = Nou repositori
|
||||
new_migrate.title = Nova migració
|
||||
new_org.title = Nova organització
|
||||
new_repo.link = Nou repositori
|
||||
new_migrate.link = Nova migració
|
||||
new_org.link = Nova organització
|
||||
copy_path = Copiar ruta
|
||||
|
||||
[search]
|
||||
milestone_kind = Cerca fites...
|
||||
fuzzy = Difusa
|
||||
|
@ -167,6 +175,9 @@ exact = Exacte
|
|||
exact_tooltip = Inclou només resultats que són exactament el terme de cerca
|
||||
issue_kind = Cerca problemes...
|
||||
|
||||
regexp = Expressió regular
|
||||
regexp_tooltip = Interpreta el terme de cerca com una expressió regular
|
||||
|
||||
[heatmap]
|
||||
number_of_contributions_in_the_last_12_months = %s contribucions en els últims 12 mesos
|
||||
contributions_zero = Cap contribució
|
||||
|
@ -337,6 +348,72 @@ manual_activation_only = Contacti amb l'administrador de lloc per a completar l'
|
|||
remember_me = Recordar aquest dispositiu
|
||||
create_new_account = Registrar compte
|
||||
|
||||
forgot_password_title = Contrasenya oblidada
|
||||
forgot_password = Contrasenya oblidada?
|
||||
hint_login = Ja tens compte? <a href="%s">Entra ara!</a>
|
||||
hint_register = Necessites un compte? <a href="%s">Registra't ara.</a>
|
||||
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 <b>%s</b>. 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 <b>%s</b>. 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 (<b>%s</b>). 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 <a href="%s">aquí</a> 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 <a target="_blank" rel="noopener noreferrer" href="%s">llista de contrasenyes robades</a> exposades en dades filtrades públicament. Si us plau, intenteu-ho de nou amb una contrasenya diferent i considereu modificar aquesta contrasenya a tot arreu on la utilitzeu.
|
||||
password_pwned_err = No s'ha pogut completar la sol·licitud a HaveIBeenPwned
|
||||
last_admin = No podeu eliminar l'últim usuari administrador. Com a mínim n'hi ha d'haver un.
|
||||
back_to_sign_in = Torneu a entrar
|
||||
|
||||
[editor]
|
||||
buttons.indent.tooltip = Aniua els elements un nivell
|
||||
buttons.unindent.tooltip = Desaniuna els elements un nivell
|
||||
|
@ -355,6 +432,13 @@ buttons.list.ordered.tooltip = Afegir una llista enumerada
|
|||
buttons.list.task.tooltip = Afegir una llista de tasques
|
||||
buttons.mention.tooltip = Mencionar un usuari o equip
|
||||
|
||||
buttons.new_table.tooltip = Afegir taula
|
||||
table_modal.header = Afegir taula
|
||||
table_modal.placeholder.header = Capçalera
|
||||
table_modal.placeholder.content = Contingut
|
||||
table_modal.label.rows = Files
|
||||
table_modal.label.columns = Columnes
|
||||
|
||||
[home]
|
||||
my_orgs = Organitzacions
|
||||
show_more_repos = Mostra més repositoris…
|
||||
|
@ -381,4 +465,15 @@ filter = Altres filtres
|
|||
footer.software = Sobre aquest software
|
||||
footer.links = Enllaços
|
||||
navbar = Barra de navegació
|
||||
footer = Peu de pàgina
|
||||
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 <b>%s</b>,
|
||||
activate_account = Si us plau, activeu el compte
|
||||
activate_account.text_1 = Hola <b>%[1]s</b>, gràcies per registrar-te a %[2]s!
|
||||
admin.new_user.user_info = Informació d'usuari
|
||||
admin.new_user.text = Si us plau, <a href="%s">cliqueu aui</a> per administrar aquest usuari des del panell d'administració.
|
||||
register_notify = Benvinguts a %s
|
|
@ -747,7 +747,7 @@ webauthn=Dvoufázové ověření (bezpečnostní klíče)
|
|||
public_profile=Veřejný profil
|
||||
biography_placeholder=Řekněte ostatním něco o sobě! (Je podporován Markdown)
|
||||
location_placeholder=Sdílejte svou přibližnou polohu s ostatními
|
||||
profile_desc=Nastavte, jak bude váš profil zobrazen ostatním uživatelům. Vaše hlavní e-mailová adresa bude použita pro oznámení, obnovení hesla a operace Git.
|
||||
profile_desc=O vás
|
||||
password_username_disabled=Externí uživatelé nemohou měnit svoje uživatelské jméno. Kontaktujte prosím svého administrátora pro více detailů.
|
||||
full_name=Celé jméno
|
||||
website=Web
|
||||
|
@ -838,7 +838,7 @@ add_email_success=Nová e-mailová adresa byla přidána.
|
|||
email_preference_set_success=Nastavení e-mailu bylo úspěšně nastaveno.
|
||||
add_openid_success=Nová OpenID adresa byla přidána.
|
||||
keep_email_private=Skrýt e-mailovou adresu
|
||||
keep_email_private_popup=Tímto skryjete svou e-mailovou adresu ze svého profilu. Nebude již výchozí adresou pro commity provedené skrze webové rozhraní, jako nahrávání a úpravy souborů, a nebude použita pro slučovací commity. Místo toho můžete použít speciální adresu %s pro spojení commitů s vaším účtem. Změna této funkce nebude mít vliv na stávající commity.
|
||||
keep_email_private_popup=Vaše e-mailová adresa nebude zobrazena na vašem profilu a nebude výchozí adresou pro commity provedené skrze webové rozhraní, jako nahrávání, úpravy a sloučení. Namísto toho lze použít speciální adresu %s pro propojení commitů s vaším účtem. Tato možnost neovlivní existující commity.
|
||||
openid_desc=OpenID vám umožní delegovat ověřování na externího poskytovatele.
|
||||
|
||||
manage_ssh_keys=Správa klíčů SSH
|
||||
|
@ -1010,7 +1010,7 @@ remove_account_link=Odstranit propojený účet
|
|||
remove_account_link_desc=Odstraněním propojeného účtu zrušíte jeho přístup k vašemu Forgejo účtu. Pokračovat?
|
||||
remove_account_link_success=Propojený účet byl odstraněn.
|
||||
|
||||
hooks.desc=Přidat webhooky, které budou spouštěny pro <strong>všechny repozitáře</strong> vve vašem vlastnictví.
|
||||
hooks.desc=Přidejte webhooky, které budou spouštěny pro <strong>všechny repozitáře</strong> ve vašem vlastnictví.
|
||||
|
||||
orgs_none=Nejste členem žádné organizace.
|
||||
repos_none=Nevlastníte žádné repozitáře.
|
||||
|
@ -1054,6 +1054,8 @@ language.title = Výchozí jazyk
|
|||
keep_activity_private.description = Vaše <a href="%s">veřejná aktivita</a> bude viditelná pouze vám a správcům instance.
|
||||
language.description = Tento jazyk bude uložen do vašeho účtu a po přihlášení bude použit jako výchozí.
|
||||
language.localization_project = Pomozte nám s překladem Forgejo do vašeho jazyka! <a href="%s">Více informací</a>.
|
||||
user_block_yourself = Nemůžete zablokovat sami sebe.
|
||||
pronouns_custom_label = Vlastní zájmena
|
||||
|
||||
[repo]
|
||||
new_repo_helper=Repozitář obsahuje všechny soubory projektu, včetně historie revizí. Už jej hostujete jinde? <a href="%s">Migrovat repozitář</a>.
|
||||
|
@ -1102,7 +1104,7 @@ object_format_helper = Objektový formát repozitáře. Později jej nelze změn
|
|||
readme=README
|
||||
readme_helper=Vyberte šablonu souboru README
|
||||
readme_helper_desc=Do tohoto místa můžete zadat celý popis vašeho projektu.
|
||||
auto_init=Inicializovat repozitář (přidá soubory .gitignore, License a README)
|
||||
auto_init=Inicializovat repozitář
|
||||
trust_model_helper=Vyberte model důvěry pro ověření podpisu. Možnosti jsou:
|
||||
trust_model_helper_collaborator=Spolupracovník: Důvěřovat podpisům spolupracovníků
|
||||
trust_model_helper_committer=Přispěvatel: Důvěřovat podpisům, které se shodují s přispěvateli
|
||||
|
@ -2395,7 +2397,7 @@ settings.deploy_key_deletion=Odstranit klíč pro nasazení
|
|||
settings.deploy_key_deletion_desc=Odstranění klíče pro nasazení zruší jeho přístup k repozitáři. Pokračovat?
|
||||
settings.deploy_key_deletion_success=Klíč pro nasazení byl odstraněn.
|
||||
settings.branches=Větve
|
||||
settings.protected_branch=Ochrana větve
|
||||
settings.protected_branch=Ochrana větví
|
||||
settings.protected_branch.save_rule=Uložit pravidlo
|
||||
settings.protected_branch.delete_rule=Odstranit pravidlo
|
||||
settings.protected_branch_can_push=Povolit nahrání?
|
||||
|
@ -2461,7 +2463,7 @@ settings.default_branch_desc=Vybrat výchozí větev repozitáře pro požadavky
|
|||
settings.merge_style_desc=Sloučit styly
|
||||
settings.default_merge_style_desc=Výchozí styl sloučení
|
||||
settings.choose_branch=Vyberte větev…
|
||||
settings.no_protected_branch=Nejsou tu žádné chráněné větve.
|
||||
settings.no_protected_branch=Nemáte žádné chráněné větve.
|
||||
settings.edit_protected_branch=Upravit
|
||||
settings.protected_branch_required_rule_name=Požadovaný název pravidla
|
||||
settings.protected_branch_duplicate_rule_name=Již existuje pravidlo pro tuto sadu větví
|
||||
|
@ -2849,6 +2851,21 @@ issues.num_reviews_one = %d kontrola
|
|||
issues.num_reviews_few = %d kontrol
|
||||
issues.summary_card_alt = Souhrn problému s názvem „%s“ v repozitáři %s
|
||||
editor.add_tmpl.filename = nazevsouboru
|
||||
settings.default_update_style_desc = Výchozí způsob aktualizací používaný pro aktualizace žádostí o sloučení, které jsou pozadu oproti základní větvi.
|
||||
pulls.sign_in_require = <a href="%s">Přihlaste se</a> pro vytvoření nové žádosti o sloučení.
|
||||
new_from_template = Použít šablonu
|
||||
new_from_template_description = Můžete si vybrat existující šablonu repozitáře na této instanci a použít její nastavení.
|
||||
new_advanced = Pokročilá nastavení
|
||||
new_advanced_expand = Klikněte pro rozbalení
|
||||
auto_init_description = Vytvořit historii Gitu se souborem README a volitelně přidat soubory License a .gitignore.
|
||||
summary_card_alt = Karta se souhrnem repozitáře %s
|
||||
issues.reaction.alt_many = Uživatel %[1]s a %[2]d dalších zareagovali s %[3]s.
|
||||
release.summary_card_alt = Karta souhrnu vydání s názvem „%s“ v repozitáři %s
|
||||
issues.reaction.add = Přidat reakci
|
||||
issues.reaction.alt_few = Uživatel %[1]s zareagoval pomocí %[2]s.
|
||||
issues.context.menu = Nabídka komentáře
|
||||
issues.reaction.alt_remove = Odstranit %[1]s reakci z komentáře.
|
||||
issues.reaction.alt_add = Přidat %[1]s reakci na komentář.
|
||||
|
||||
[graphs]
|
||||
component_loading_info = Tohle může chvíli trvat…
|
||||
|
|
1634
options/locale/locale_da.ini
Normal file
1634
options/locale/locale_da.ini
Normal file
File diff suppressed because it is too large
Load diff
|
@ -749,7 +749,7 @@ webauthn=Hardware-Sicherheitsschlüssel
|
|||
public_profile=Öffentliches Profil
|
||||
biography_placeholder=Erzähle anderen ein wenig über dich selbst! (Markdown wird unterstützt)
|
||||
location_placeholder=Teile deinen ungefähren Standort mit anderen
|
||||
profile_desc=Leg fest, wie dein Profil anderen Benutzern angezeigt wird. Deine primäre E-Mail-Adresse wird für Benachrichtigungen, Passwort-Wiederherstellung und webbasierte Git-Operationen verwendet.
|
||||
profile_desc=Über dich
|
||||
password_username_disabled=Benutzer, die nicht von Forgejo verwaltet werden können ihren Benutzernamen nicht ändern. Bitte kontaktiere deinen Administrator für mehr Details.
|
||||
full_name=Vollständiger Name
|
||||
website=Webseite
|
||||
|
@ -814,7 +814,7 @@ manage_emails=E-Mail-Adressen verwalten
|
|||
manage_themes=Standard-Theme
|
||||
manage_openid=OpenID-Adressen
|
||||
email_desc=Deine primäre E-Mail-Adresse wird für Benachrichtigungen, Passwort-Wiederherstellung und, sofern sie nicht versteckt ist, web-basierte Git-Operationen verwendet.
|
||||
theme_desc=Dies wird dein Standard-Theme auf der Seite sein.
|
||||
theme_desc=Dieses Thema wird für die Weboberfläche verwendet, wenn du angemeldet bist.
|
||||
primary=Primär
|
||||
activated=Aktiviert
|
||||
requires_activation=Erfordert Aktivierung
|
||||
|
@ -840,7 +840,7 @@ add_email_success=Die neue E-Mail-Addresse wurde hinzugefügt.
|
|||
email_preference_set_success=E-Mail-Einstellungen wurden erfolgreich aktualisiert.
|
||||
add_openid_success=Die neue OpenID-Adresse wurde hinzugefügt.
|
||||
keep_email_private=E-Mail-Adresse verbergen
|
||||
keep_email_private_popup=Dies wird deine E-Mail-Adresse in deinem Profil ausblenden. Sie wird nicht mehr der Standardwert für die Commits, die vom Web-Interface gemacht wurden, sein, z.B. Dateiuploads und -bearbeitungen, und sie wird nicht für Merge-Commits benutzt werden. Stattdessen kann eine besondere Adresse %s benutzt werden, um Commits mit deinem Konto zu assoziieren. Beachte, dass diese Option für existierende Commits keine Wirkung hat.
|
||||
keep_email_private_popup=Deine Mailadresse wird nicht in deinem Profil angezeigt und wird nicht der Standard für Commits über das Webinterface sein, wie zum Beispiel Dateiuploads, Bearbeitungen, und Merge-Commits. Stattdessen kann eine besondere Adresse %s benutzt werden, um Commits mit deinem Account zu verbinden. Diese Option wirkt sich nicht auf bestehende Commits aus.
|
||||
openid_desc=Mit OpenID kannst du dich über einen Drittanbieter authentifizieren.
|
||||
|
||||
manage_ssh_keys=SSH-Schlüssel verwalten
|
||||
|
@ -1056,6 +1056,8 @@ language.title = Standardsprache
|
|||
keep_activity_private.description = Deine <a href="%s">öffentliche Aktivität</a> wird nur für dich selbst und die Instanzadminstratoren sichtbar sein.
|
||||
language.localization_project = Hilf uns, Forgejo in deine Sprache zu übersetzen! <a href="%s">Mehr erfahren</a>.
|
||||
language.description = Diese Sprache wird in deinem Konto gespeichert und standardmäßig nach dem Anmelden benutzt.
|
||||
user_block_yourself = Du kannst dich nicht selbst blockieren.
|
||||
pronouns_custom_label = Individuelle Pronomen
|
||||
|
||||
[repo]
|
||||
owner=Besitzer
|
||||
|
@ -1097,11 +1099,11 @@ issue_labels=Labels
|
|||
issue_labels_helper=Wähle eine Label-Sammlung
|
||||
license=Lizenz
|
||||
license_helper=Wähle eine Lizenz
|
||||
license_helper_desc=Eine Lizenz regelt, was andere mit deinem Code tun (oder nicht tun) können. Unsicher, welches für dein Projekt die Richtige ist? Siehe <a target="_blank" rel="noopener noreferrer" href="%s">Choose a license.</a>
|
||||
license_helper_desc=Eine Lizenz regelt, was andere mit deinem Code tun (oder nicht tun) können. Unsicher, welches für dein Projekt die Richtige ist? Siehe <a target="_blank" rel="noopener noreferrer" href="%s">Choose a license</a>.
|
||||
readme=README
|
||||
readme_helper=Wähle eine README-Vorlage
|
||||
readme_helper_desc=Hier kannst du eine komplette Beschreibung für dein Projekt schreiben.
|
||||
auto_init=Repository initialisieren (Fügt .gitignore, License und README-Dateien hinzu)
|
||||
auto_init=Repository initialisieren
|
||||
trust_model_helper=Wähle das Vertrauensmodell für die Signaturvalidierung aus. Mögliche Modelle sind:
|
||||
trust_model_helper_collaborator=Mitarbeiter: Vertraue Signaturen von Mitarbeitern am Projekt
|
||||
trust_model_helper_committer=Committer: Vertraue Signaturen, die mit ihren Committern übereinstimmen
|
||||
|
@ -1179,8 +1181,8 @@ template.invalid=Es muss ein Vorlagen-Repository ausgewählt werden
|
|||
|
||||
archive.title=Dieses Repository ist archiviert. Du kannst Dateien ansehen und es klonen, kannst aber nicht pushen oder Issues/Pull-Requests öffnen.
|
||||
archive.title_date=Dieses Repository wurde am %s archiviert. Du kannst Dateien ansehen und es klonen, aber nicht pushen oder Issues/Pull-Requests öffnen.
|
||||
archive.issue.nocomment=Dieses Repo ist archiviert. Du kannst Issues nicht kommentieren.
|
||||
archive.pull.nocomment=Dieses Repo ist archiviert. Du kannst Pull-Requests nicht kommentieren.
|
||||
archive.issue.nocomment=Dieses Repository ist archiviert. Du kannst Issues nicht kommentieren.
|
||||
archive.pull.nocomment=Dieses Repository ist archiviert. Du kannst Pull-Requests nicht kommentieren.
|
||||
|
||||
form.reach_limit_of_creation_1=Du hast bereits dein Limit von %d Repository erreicht.
|
||||
form.reach_limit_of_creation_n=Du hast bereits dein Limit von %d Repositorys erreicht.
|
||||
|
@ -2490,8 +2492,8 @@ settings.archive.text=Durch das Archivieren wird ein Repo vollständig schreibge
|
|||
settings.archive.success=Das Repo wurde erfolgreich archiviert.
|
||||
settings.archive.error=Beim Versuch, das Repository zu archivieren, ist ein Fehler aufgetreten. Weitere Details finden sich im Log.
|
||||
settings.archive.error_ismirror=Du kannst kein gespiegeltes Repo archivieren.
|
||||
settings.archive.branchsettings_unavailable=Branch-Einstellungen sind nicht verfügbar wenn das Repo archiviert ist.
|
||||
settings.archive.tagsettings_unavailable=Tag Einstellungen sind nicht verfügbar, wenn das Repo archiviert wurde.
|
||||
settings.archive.branchsettings_unavailable=Branch-Einstellungen sind nicht verfügbar in archivierten Repos.
|
||||
settings.archive.tagsettings_unavailable=Tag-Einstellungen sind nicht verfügbar in archivierten Repos.
|
||||
settings.unarchive.button=Archivierung zurücksetzen
|
||||
settings.unarchive.header=Archivierung dieses Repositorys zurücksetzen
|
||||
settings.unarchive.text=Durch das Aufheben der Archivierung kann das Repo wieder Commits und Pushes sowie neue Issues und Pull-Requests empfangen.
|
||||
|
@ -2690,7 +2692,7 @@ error.csv.too_large=Diese Datei kann nicht gerendert werden, da sie zu groß ist
|
|||
error.csv.unexpected=Diese Datei kann nicht gerendert werden, da sie ein unerwartetes Zeichen in Zeile %d und Spalte %d enthält.
|
||||
error.csv.invalid_field_count=Diese Datei kann nicht gerendert werden, da sie eine falsche Anzahl an Feldern in Zeile %d hat.
|
||||
rss.must_be_on_branch = Du musst auf einem Branch sein, um einen RSS-Feed zu haben.
|
||||
new_repo_helper = Ein Repository enthält alle Projektdateien inklusive der Revisionshistorie. Bereits woanders gehostet? <a href="%s">Repository migrieren.</a>
|
||||
new_repo_helper = Ein Repository enthält alle Projektdateien inklusive der Revisionshistorie. Bereits woanders gehostet? <a href="%s">Repository migrieren</a>.
|
||||
issues.comment.blocked_by_user = Du kannst kein Kommentar für dieses Issue erstellen, weil du vom Repository-Besitzer oder dem Autoren des Issues blockiert wurdest.
|
||||
clone_in_vscodium = In VSCodium klonen
|
||||
settings.units.add_more = Mehr aktivieren
|
||||
|
@ -2704,7 +2706,7 @@ settings.add_collaborator_blocked_them = Der Mitarbeiter konnte nicht hinzugefü
|
|||
settings.wiki_rename_branch_main = Den Wiki-Branch-Namen normalisieren
|
||||
settings.enter_repo_name = Gib den Besitzer- und den Repository-Namen genau wie angezeigt ein:
|
||||
settings.wiki_branch_rename_success = Der Branch-Name des Repository-Wikis wurde erfolgreich normalisiert.
|
||||
settings.archive.mirrors_unavailable = Spiegel sind nicht verfügbar, wenn das Repo archiviert ist.
|
||||
settings.archive.mirrors_unavailable = Spiegel sind nicht verfügbar in archivierten Repos.
|
||||
pulls.blocked_by_user = Du kannst keinen Pull-Request in diesem Repository erstellen, weil du vom Repository-Besitzer blockiert wurdest.
|
||||
settings.add_collaborator_blocked_our = Der Mitarbeiter konnte nicht hinzugefügt werden, weil der Repository-Besitzer ihn blockiert hat.
|
||||
issues.blocked_by_user = Du kannst kein Issue in diesem Repository erstellen, weil du vom Repository-Besitzer blockiert wurdest.
|
||||
|
@ -2851,6 +2853,21 @@ issues.num_reviews_one = %d Review
|
|||
issues.summary_card_alt = Zusammenfassung eines Issues mit dem Titel „%s“ im Repository %s
|
||||
issues.num_reviews_few = %d Reviews
|
||||
editor.add_tmpl.filename = Dateiname
|
||||
settings.default_update_style_desc = Standard-Aktualisierungsart um Pull-Requests zu aktualisieren, die hinter dem Base-Branch sind.
|
||||
new_advanced = Erweiterte Einstellungen
|
||||
new_advanced_expand = Zum Ausklappen klicken
|
||||
pulls.sign_in_require = <a href="%s">Anmelden</a>, um einen neuen Pull-Request zu erstellen.
|
||||
new_from_template = Eine Vorlage benutzen
|
||||
new_from_template_description = Du kannst eine existierende Repository-Vorlage auf dieser Instanz benutzen und ihre Einstellungen anwenden.
|
||||
auto_init_description = Die Git-Historie mit einer README-Datei und optional einer Lizenz- und .gitignore-Datei starten.
|
||||
issues.context.menu = Kommentar Menü
|
||||
issues.reaction.add = Reaktion hinzufügen
|
||||
issues.reaction.alt_many = %[1]s und %[2]d mehr reagierten %[3]s.
|
||||
issues.reaction.alt_few = %[1]s reagierten %[2]s.
|
||||
issues.reaction.alt_add = Füge %[1]s Reaktion zum Kommentar hinzu.
|
||||
issues.reaction.alt_remove = Entferne %[1]s Reaktion von diesem Kommentar.
|
||||
summary_card_alt = Zusammenfassungskarte des Repositorys %s
|
||||
release.summary_card_alt = Übersichtskarte eines Releases mit dem Titel „%s“ im Repository %s
|
||||
|
||||
[graphs]
|
||||
component_loading_failed = Konnte %s nicht laden
|
||||
|
@ -3686,12 +3703,12 @@ conan.registry=Diese Registry über die Kommandozeile einrichten:
|
|||
conan.install=Um das Paket mit Conan zu installieren, führe den folgenden Befehl aus:
|
||||
conda.registry=Richte diese Registry als Conda-Repository in deiner <code>.condarc</code>-Datei ein:
|
||||
conda.install=Um das Paket mit Conda zu installieren, führe den folgenden Befehl aus:
|
||||
container.details.type=Container-Image Typ
|
||||
container.details.type=Abbildtyp
|
||||
container.details.platform=Plattform
|
||||
container.pull=Downloade das Container-Image aus der Kommandozeile:
|
||||
container.digest=Digest
|
||||
container.multi_arch=Betriebsystem / Architektur
|
||||
container.layers=Container-Image Ebenen
|
||||
container.layers=Abbildebenen
|
||||
container.labels=Labels
|
||||
container.labels.key=Schlüssel
|
||||
container.labels.value=Wert
|
||||
|
|
|
@ -166,6 +166,7 @@ new_org.link = Νέος οργανισμός
|
|||
new_migrate.title = Νέα μεταφορά
|
||||
new_repo.title = Νέο repository
|
||||
new_org.title = Νέος οργανισμός
|
||||
copy_path = Αντιγραφή τοποθεσίας
|
||||
|
||||
[aria]
|
||||
navbar=Μπάρα πλοήγησης
|
||||
|
@ -197,8 +198,14 @@ buttons.ref.tooltip=Μνημόνευση ενός θέματος ή pull request
|
|||
buttons.switch_to_legacy.tooltip=Χρήση του κλασσικού κειμενογράφου
|
||||
buttons.enable_monospace_font=Ενεργοποίηση σταθερής γραμματοσειράς
|
||||
buttons.disable_monospace_font=Απενεργοποίηση σταθερής γραμματοσειράς
|
||||
buttons.unindent.tooltip = Αναίρεση στοιχείων κατά ένα επίπεδο
|
||||
buttons.indent.tooltip = Στοιχεία φωλιών κατά ένα επίπεδο
|
||||
buttons.unindent.tooltip = Μείωση εσοχής στοιχείων κατά ένα επίπεδο
|
||||
buttons.indent.tooltip = Αύξηση εσοχής στοιχείων κατά ένα επίπεδο
|
||||
table_modal.header = Προσθήκη πίνακα
|
||||
table_modal.placeholder.header = Επικεφαλίδα
|
||||
table_modal.placeholder.content = Περιεχόμενο
|
||||
table_modal.label.rows = Σειρές
|
||||
table_modal.label.columns = Στήλες
|
||||
buttons.new_table.tooltip = Προσθήκη πίνακα
|
||||
|
||||
[filter]
|
||||
string.asc=A - Z
|
||||
|
@ -249,9 +256,9 @@ err_empty_db_path=Η διαδρομή της βάσης δεδομένων SQLit
|
|||
no_admin_and_disable_registration=Δεν μπορείτε να απενεργοποιήσετε την ιδιο-εγγραφή χρήστη χωρίς να έχετε δημιουργήσει διαχειριστικό λογαριασμό.
|
||||
err_empty_admin_password=Ο κωδικός πρόσβασης του διαχειριστή δεν μπορεί να είναι κενός.
|
||||
err_empty_admin_email=Το email του διαχειριστή δεν μπορεί να είναι κενό.
|
||||
err_admin_name_is_reserved=Το Όνομα χρήστη του Διαχειριστή δεν είναι έγκυρο, είναι δεσμευμένο
|
||||
err_admin_name_is_reserved=Το όνομα χρήστη του Διαχειριστή δεν είναι έγκυρο, αυτό το όνομα είναι δεσμευμένο
|
||||
err_admin_name_pattern_not_allowed=Το Όνομα χρήστη του Διαχειριστή δεν είναι έγκυρο, ταιριάζει σε μια δεσμευμένη μορφή
|
||||
err_admin_name_is_invalid=Το Όνομα Χρήστη του Διαχειριστή δεν είναι έγκυρο
|
||||
err_admin_name_is_invalid=Το όνομα χρήστη του Διαχειριστή δεν είναι έγκυρο
|
||||
|
||||
general_title=Γενικές ρυθμίσεις
|
||||
app_name=Τίτλος διακομιστή
|
||||
|
@ -476,6 +483,8 @@ hint_register = Χρειάζεστε έναν λογαριασμό; <a href="%s"
|
|||
sign_up_button = Δημιουργία λογαριασμού.
|
||||
back_to_sign_in = Επιστροφή στην σελίδα εισόδου
|
||||
sign_in_openid = Συνέχεια με OpenID
|
||||
unauthorized_credentials = Τα διαπιστευτήρια σύνδεσης είναι λανθασμένα ή έχουν λήξει. Προσπαθήστε ξανά την ενέργεια ή δείτε %s για περισσότερες πληροφορίες
|
||||
use_onetime_code = Χρήση κωδικού μίας χρήσης
|
||||
|
||||
[mail]
|
||||
view_it_on=Δείτε το στο %s
|
||||
|
@ -553,7 +562,7 @@ password_change.text_1 = Μόλις άλλαξε ο κωδικός πρόσβα
|
|||
primary_mail_change.subject = Η κύρια διεύθυνση email σας άλλαξε
|
||||
primary_mail_change.text_1 = Η κύρια διεύθυνση email του λογαριασμού σας μόλις άλλαξε στην %[1]s. Αυτό σημαίνει πως η διεύθυνση στην οποία λαμβάνετε αυτό το μήνυμα δεν θα λαμβάνει ειδοποιήσεις email για τον λογαριασμό σας πια.
|
||||
totp_disabled.subject = Το TOTP απενεργοποιήθηκε
|
||||
totp_disabled.text_1 = Το TOTP στο λογαριασμό σας μόλις απενεργοποιήθηκε.
|
||||
totp_disabled.text_1 = Ο κωδικός μίας χρήσης (TOTP) για το λογαριασμό σας μόλις απενεργοποιήθηκε.
|
||||
removed_security_key.subject = Καταργήθηκε ένα κλειδί ασφαλείας
|
||||
removed_security_key.text_1 = Το κλειδί ασφαλείας «%[1]s» μόλις αφαιρέθηκε από τον λογαριασμό σας.
|
||||
totp_disabled.no_2fa = Δεν έχετε ρυθμίσει κάποια άλλη μέθοδο σύνδεσης δευτέρου παράγοντα (2FA), άρα δεν χρειάζεται να συνδεθείτε στον λογαριασμό σας μέσω 2FA.
|
||||
|
@ -715,6 +724,7 @@ following.title.one = ακολουθεί
|
|||
public_activity.visibility_hint.admin_public = Η δραστηριότητα είναι ορατή σε όλους, αλλά ως διαχειριστής μπορείτε να δείτε και τις αλληλεπιδράσεις σε ιδιωτικούς χώρους.
|
||||
public_activity.visibility_hint.self_public = Η δραστηριότητά σου είναι ορατή σε όλους, πλην τις αλληλεπιδράσεις σας σε ιδιωτικούς χώρους. <a href="%s">Αλλαγή ορατότητας</a>.
|
||||
public_activity.visibility_hint.self_private = Η δραστηριότητά σας είναι ορατή μόνο σε εσάς και στους διαχειριστές. <a href="%s">Αλλαγή ορατότητας</a>.
|
||||
public_activity.visibility_hint.self_private_profile = Η δραστηριότητά σας είναι ορατή μόνο σε εσάς και τους διαχειριστές του διακομιστή καθώς το προφίλ σας είναι ιδιωτικό <a href="%s">Αλλαγή ορατότητας</a>.
|
||||
|
||||
[settings]
|
||||
profile=Προφίλ
|
||||
|
@ -736,9 +746,9 @@ uid=UID
|
|||
webauthn=Πιστοποίηση δύο παραγόντων (Κλειδιά Ασφαλείας)
|
||||
|
||||
public_profile=Δημόσιο προφίλ
|
||||
biography_placeholder=Πείτε μας λίγο για τον εαυτό σας! (Μπορείτε να γράψετε με Markdown)
|
||||
biography_placeholder=Πείτε λίγα πράγματα για τον εαυτό σας! (Μπορείτε να γράψετε με Markdown)
|
||||
location_placeholder=Μοιραστείτε την κατά προσέγγιση τοποθεσία σας με άλλους
|
||||
profile_desc=Ελέγξτε πώς εμφανίζεται το προφίλ σας σε άλλους χρήστες. Η κύρια διεύθυνση email σας θα χρησιμοποιηθεί για ειδοποιήσεις, ανάκτηση κωδικού πρόσβασης και λειτουργίες Git που βασίζονται στο web.
|
||||
profile_desc=Σχετικά με εσάς
|
||||
password_username_disabled=Οι μη τοπικοί χρήστες δεν επιτρέπεται να αλλάξουν το όνομα χρήστη τους. Επικοινωνήστε με το διαχειριστή σας για περισσότερες λεπτομέρειες.
|
||||
full_name=Πλήρες όνομα
|
||||
website=Ιστοσελίδα
|
||||
|
@ -803,7 +813,7 @@ manage_emails=Διαχείριση διευθύνσεων email
|
|||
manage_themes=Προεπιλεγμένο θέμα
|
||||
manage_openid=Διευθύνσεις OpenID
|
||||
email_desc=Η κύρια διεύθυνση ηλεκτρονικού ταχυδρομείου σας θα χρησιμοποιηθεί για ειδοποιήσεις, ανάκτηση του κωδικού πρόσβασης και, εφόσον δεν είναι κρυμμένη, λειτουργίες Git στον ιστότοπο.
|
||||
theme_desc=Αυτό θα είναι το προεπιλεγμένο θέμα διεπαφής σας σε όλη την ιστοσελίδα.
|
||||
theme_desc=Αυτό θα είναι το προεπιλεγμένο θέμα διεπαφής σας όταν είστε συνδεδεμένοι.
|
||||
primary=Κύριο
|
||||
activated=Ενεργό
|
||||
requires_activation=Απαιτείται ενεργοποίηση
|
||||
|
@ -1038,13 +1048,14 @@ pronouns = Αντωνυμίες
|
|||
pronouns_custom = κάτι άλλο
|
||||
pronouns_unspecified = Απροσδιόριστες
|
||||
hints = Συμβουλές
|
||||
additional_repo_units_hint_description = Εμφάνιση κουμπιού «Προσθήκη μονάδων...» σε αποθετήρια που δεν έχουν ενεργοποιημένες όλες τις διαθέσιμες μονάδες.
|
||||
additional_repo_units_hint_description = Εμφάνιση υπόδειξης «Προσθήκη μονάδων...» σε αποθετήρια που δεν έχουν ενεργοποιημένες όλες τις διαθέσιμες μονάδες.
|
||||
update_hints = Ενημέρωση συμβουλών
|
||||
update_hints_success = Οι συμβουλές ενημερώθηκαν.
|
||||
language.title = Προεπιλεγμένη γλώσσα
|
||||
keep_activity_private.description = Η <a href="%s">δημόσια δραστηριότητά σας</a> θα είναι ορατή μόνο σε εσάς και στους διαχειριστές.
|
||||
language.localization_project = Βοηθήστε μας να μεταφράσουμε το Forgejo στην γλώσσα σας! <a href="%s">Περισσότερες πληροφορίες</a>.
|
||||
language.description = Από εδώ και στο εξής, αυτή η γλώσσα θα χρησιμοποιείται από προεπιλογή για τον λογαριασμό σας.
|
||||
pronouns_custom_label = Ειδικές αντωνυμίες
|
||||
|
||||
[repo]
|
||||
new_repo_helper=Ένα repository περιέχει όλα τα αρχεία έργου, συμπεριλαμβανομένου του ιστορικού εκδόσεων. Έχετε ήδη ένα που φιλοξενείται κάπου αλλού; <a href="%s">Μεταφορά αποθετηρίου.</a>
|
||||
|
@ -3929,6 +3940,8 @@ exact = Ακριβής
|
|||
milestone_kind = Αναζήτηση ορόσημων...
|
||||
union = Ένωση
|
||||
union_tooltip = Να συμπεριληφθούν αποτελέσματα που περιέχουν οποιαδήποτε από τις λέξεις που έχουν εισαχθεί και διαχωριστεί με κενό
|
||||
regexp = Κανονική Έκφραση
|
||||
regexp_tooltip = Ερμηνεία του όρου αναζήτησης ως κανονική έκφραση
|
||||
|
||||
[munits.data]
|
||||
mib = MiB
|
||||
|
|
|
@ -748,13 +748,14 @@ blocked_users = Blocked users
|
|||
public_profile = Public profile
|
||||
biography_placeholder = Tell others a little bit about yourself! (Markdown is supported)
|
||||
location_placeholder = Share your approximate location with others
|
||||
profile_desc = Control how your profile is shown to other users. Your primary email address will be used for notifications, password recovery and web-based Git operations.
|
||||
profile_desc = About you
|
||||
password_username_disabled = Non-local users are not allowed to change their username. Please contact your site administrator for more details.
|
||||
full_name = Full name
|
||||
website = Website
|
||||
location = Location
|
||||
pronouns = Pronouns
|
||||
pronouns_custom = Custom
|
||||
pronouns_custom_label = Custom pronouns
|
||||
pronouns_unspecified = Unspecified
|
||||
update_theme = Change theme
|
||||
update_profile = Update profile
|
||||
|
@ -849,7 +850,7 @@ add_email_success = The new email address has been added.
|
|||
email_preference_set_success = Email preference has been set successfully.
|
||||
add_openid_success = The new OpenID address has been added.
|
||||
keep_email_private = Hide email address
|
||||
keep_email_private_popup = This will hide your email address from your profile. It will no longer be the default for commits made via the web interface, like file uploads and edits, and will not be used for merge commits. Instead a special address %s can be used to associate commits with your account. Note that changing this option will not affect existing commits.
|
||||
keep_email_private_popup = Your email address will not be shown on your profile and will not be the default for commits made via the web interface, like file uploads, edits, and merge commits. Instead, a special address %s can be used to link commits to your account. This option will not affect existing commits.
|
||||
openid_desc = OpenID lets you delegate authentication to an external provider.
|
||||
|
||||
manage_ssh_keys = Manage SSH keys
|
||||
|
@ -1053,6 +1054,10 @@ admin.failed_to_replace_flags = Failed to replace repository flags
|
|||
admin.flags_replaced = Repository flags replaced
|
||||
|
||||
new_repo_helper = A repository contains all project files, including revision history. Already hosting one elsewhere? <a href="%s">Migrate repository</a>.
|
||||
new_from_template = Use a template
|
||||
new_from_template_description = You can select an existing repository template on this instance and apply its settings.
|
||||
new_advanced = Advanced settings
|
||||
new_advanced_expand = Click to expand
|
||||
owner = Owner
|
||||
owner_helper = Some organizations may not show up in the dropdown due to a maximum repository count limit.
|
||||
repo_name = Repository name
|
||||
|
@ -1099,7 +1104,8 @@ object_format_helper = Object format of the repository. Cannot be changed later.
|
|||
readme = README
|
||||
readme_helper = Select a README file template
|
||||
readme_helper_desc = This is the place where you can write a complete description for your project.
|
||||
auto_init = Initialize repository (Adds .gitignore, License and README)
|
||||
auto_init = Initialize repository
|
||||
auto_init_description = Start the Git history with a README and optionally add License and .gitignore files.
|
||||
create_repo = Create repository
|
||||
default_branch = Default branch
|
||||
default_branch_label = default
|
||||
|
@ -1148,6 +1154,7 @@ blame_prior = View blame prior to this change
|
|||
blame.ignore_revs = Ignoring revisions in <a href="%s">.git-blame-ignore-revs</a>. Click <a href="%s">here to bypass</a> and see the normal blame view.
|
||||
blame.ignore_revs.failed = Failed to ignore revisions in <a href="%s">.git-blame-ignore-revs</a>.
|
||||
author_search_tooltip = Shows a maximum of 30 users
|
||||
summary_card_alt = Summary card of repository %s
|
||||
|
||||
tree_path_not_found_commit = Path %[1]s doesn't exist in commit %[2]s
|
||||
tree_path_not_found_branch = Path %[1]s doesn't exist in branch %[2]s
|
||||
|
@ -1628,6 +1635,12 @@ issues.num_reviews_one = %d review
|
|||
issues.num_reviews_few = %d reviews
|
||||
issues.commented_at = `commented <a href="#%s">%s</a>`
|
||||
issues.delete_comment_confirm = Are you sure you want to delete this comment?
|
||||
issues.reaction.add = Add reaction
|
||||
issues.reaction.alt_few = %[1]s reacted %[2]s.
|
||||
issues.reaction.alt_many = %[1]s and %[2]d more reacted %[3]s.
|
||||
issues.reaction.alt_remove = Remove %[1]s reaction from comment.
|
||||
issues.reaction.alt_add = Add %[1]s reaction to comment.
|
||||
issues.context.menu = Comment menu
|
||||
issues.context.copy_link = Copy link
|
||||
issues.context.quote_reply = Quote reply
|
||||
issues.context.reference_issue = Reference in a new issue
|
||||
|
@ -1845,6 +1858,7 @@ pulls.new = New pull request
|
|||
pulls.view = View pull request
|
||||
pulls.edit.already_changed = Unable to save changes to the pull request. It appears the content has already been changed by another user. Please refresh the page and try editing again to avoid overwriting their changes
|
||||
pulls.compare_changes = New pull request
|
||||
pulls.sign_in_require = <a href="%s">Sign in</a> to create a new pull request.
|
||||
pulls.allow_edits_from_maintainers = Allow edits from maintainers
|
||||
pulls.allow_edits_from_maintainers_desc = Users with write access to the base branch can also push to this branch
|
||||
pulls.allow_edits_from_maintainers_err = Updating failed
|
||||
|
@ -2741,6 +2755,7 @@ release.asset_name = Asset name
|
|||
release.asset_external_url = External URL
|
||||
release.add_external_asset = Add external asset
|
||||
release.invalid_external_url = Invalid external URL: "%s"
|
||||
release.summary_card_alt = Summary card of an release titled "%s" in repository %s
|
||||
|
||||
branch.name = Branch name
|
||||
branch.already_exists = A branch named "%s" already exists.
|
||||
|
|
|
@ -119,7 +119,7 @@ new_project_column = Uusi sarake
|
|||
retry = Yritä uudelleen
|
||||
copy_type_unsupported = Tätä tiedostotyyppiä ei voi kopioida
|
||||
locked = Lukittu
|
||||
filter = Suodatin
|
||||
filter = Suodata
|
||||
filter.is_archived = Arkistoitu
|
||||
filter.not_archived = Ei arkistoitu
|
||||
filter.public = Julkinen
|
||||
|
@ -167,6 +167,8 @@ filter.not_template = Ei mallipohjat
|
|||
filter.not_mirror = Ei peilattu
|
||||
copy_path = Kopioi polku
|
||||
|
||||
concept_user_individual = Yksittäinen
|
||||
|
||||
[aria]
|
||||
footer.links = Linkit
|
||||
navbar = Navigaatiopalkki
|
||||
|
@ -205,6 +207,8 @@ table_modal.placeholder.content = Sisältö
|
|||
table_modal.label.rows = Rivit
|
||||
table_modal.label.columns = Sarakkeet
|
||||
|
||||
buttons.unindent.tooltip = Vähennä sisennystä yhden tason verran
|
||||
|
||||
[filter]
|
||||
string.asc = A - Ö
|
||||
string.desc = Ö - A
|
||||
|
@ -231,7 +235,7 @@ install_desc = Suorita alustallesi suunnattu <a target="_blank" rel="noopener no
|
|||
|
||||
[install]
|
||||
install=Asennus
|
||||
title=Alkuperäiset asetukset
|
||||
title=Aloitusasetukset
|
||||
docker_helper=Jos ajat Forgejoa Dockerin sisällä, lue <a target="_blank" rel="noopener noreferrer" href="%s">ohjeet</a> ennen minkään asetuksen muuttamista.
|
||||
require_db_desc=Forgejo tarvitsee toimiakseen MySQL-, PostgreSQL-, SQLite3- tai TiDB- (MySQL-protokolla) tietokannan.
|
||||
db_title=Tietokannan asetukset
|
||||
|
@ -292,7 +296,7 @@ disable_gravatar.description=Poista Gravatar ja kolmannen osapuolen avaratir kä
|
|||
federated_avatar_lookup=Käytä federoituja profiilikuvia
|
||||
federated_avatar_lookup.description=Käytä Libravatar-palvelua profiilikuvien hakemiseen.
|
||||
disable_registration=Poista omatoiminen rekisteröityminen käytöstä
|
||||
disable_registration.description=Poista käyttäjän itse-rekisteröinti, vain ylläpito voi luoda tilejä.
|
||||
disable_registration.description=Vain järjestelmänvalvojat voivat luoda uusia käyttäjiä. On suositeltavaa pitää rekisteröinti suljettuna mikäli kyseessä ei ole julkinen instanssi jota varten tarvitsee hallinnoida suuria määriä roskapostikäyttäjiä.
|
||||
allow_only_external_registration.description=Käyttäjät voivat luoda uusia käyttäjiä vain erikseen konfiguroituja ulkoisia palveluja käyttäen.
|
||||
openid_signin=Ota OpenID-kirjautuminen käyttöön
|
||||
openid_signin.description=Salli OpenID:n kautta kirjautuminen.
|
||||
|
@ -319,7 +323,7 @@ default_keep_email_private=Piilota sähköpostiosoitteet oletuksena
|
|||
default_keep_email_private.description=Piilota oletusarvoisesti uusien käyttäjätilien sähköpostiosoitteet estääksesi tietojen vuotamisen rekisteröinnin yhteydessä.
|
||||
default_enable_timetracking=Ota ajanseuranta oletusarvoisesti käyttöön
|
||||
default_enable_timetracking.description=Salli uusien repositorioiden aikaseurannan käyttöönotto oletusarvoisesti.
|
||||
no_reply_address=Piilotettu sähköpostin verkkotunnus
|
||||
no_reply_address=Piilotetun sähköpostin verkkotunnus
|
||||
no_reply_address_helper=Verkkotunnuksen nimi käyttäjille, joilla on piilotettu sähköpostiosoite. Esimerkiksi käyttäjätunnus 'joe' kirjataan Git-palveluun nimellä 'joe@noreply.example.org' jos piilotetun sähköpostiosoitteen arvoksi on asetettu 'noreply.example.org'.
|
||||
password_algorithm=Salasanan hajautusalgoritmi
|
||||
enable_update_checker_helper_forgejo = Se tarkistaa tietyin väliajoin uusia Forgejo-versioita tutkimalla sen TXT DNS record -tietoja osoitteesta release.forgejo.org .
|
||||
|
@ -346,6 +350,8 @@ app_slogan_helper = Syötä instanssin tunnuslause tähän. Jätä tyhjäksi poi
|
|||
domain_helper = Palvelimen verkkotunnus tai isäntänimi.
|
||||
smtp_from_invalid = "Lähetä sähköpostit osoitteella"-osoite on virheellinen
|
||||
|
||||
err_admin_name_pattern_not_allowed = Ylläpitäjän käyttäjätunnus on virheellinen, se vastaa varattua kaaviota
|
||||
|
||||
[home]
|
||||
uname_holder=Käyttäjätunnus tai sähköpostiosoite
|
||||
password_holder=Salasana
|
||||
|
@ -461,6 +467,19 @@ change_unconfirmed_email = Jos annoit väärän sähköpostiosoitteen rekisterö
|
|||
invalid_code_forgot_password = Vahvistuskoodisi on virheellinen tai vanhentunut. Napsauta <a href="%s">tästä</a> aloittaaksesi uuden istunnon.
|
||||
openid_signin_desc = Kirjoita OpenID-URI:si. Esimerkki: alice.openid.example.org tai https://openid.example.org/alice.
|
||||
change_unconfirmed_email_summary = Vaihda sähköpostiosoite, johon aktivointisähköposti lähetetään.
|
||||
reset_password_wrong_user = Olet kirjautuneena tilillä %s, mutta tilin palautuslinkki on tarkoitettu tilille %s
|
||||
last_admin = Et voi poistaa viimeistä ylläpitäjää. Ylläpitäjiä tulee olla vähintään yksi.
|
||||
password_pwned = Valitsemasi salasana on <a target="_blank" rel="noopener noreferrer" href="%s">varastettujen salasanojen listalla</a>, eli se on paljastanut jossain julkisessa tietovuodossa. Kokeile asettaa eri salasana, ja jos käytät samaa salasanaa muissa palveluissa, vaihda kyseinen salasana.
|
||||
|
||||
use_onetime_code = Käytä kertakäyttöiskoodia
|
||||
|
||||
unauthorized_credentials = Kirjautumistiedot ovat virheelliset tai vanhentuneet. Yritä suorittaa komento uudelleen tai katso %s saadaksesi lisätietoja
|
||||
oauth.signin.error = Valtuuspyynnön käsittelyssä tapahtui virhe. Jos virhe toistuu, ota yhteys sivuston ylläpitoon.
|
||||
oauth.signin.error.temporarily_unavailable = Valtuus epäonnistui, koska todennuspalvelin ei ole tällä hetkellä käytettävissä. Yritä uudelleen myöhemmin.
|
||||
disable_forgot_password_mail = Tilin palautus ei ole käytössä, koska sähköpostia ei ole määritetty. Ota yhteys sivuston ylläpitoon.
|
||||
disable_forgot_password_mail_admin = Tilin palautus on käytössä vain, jos sähköposti on määritetty. Aseta sähköposti, jotta tilin palauttaminen on mahdollista ottaa käyttöön.
|
||||
authorization_failed_desc = Valtuus epäonnistui, koska havaitsimme virheellisen pyynnön. Ota yhteys sen sovelluksen ylläpitäjään, jota yritit valtuuttaa.
|
||||
password_pwned_err = Pyyntöä HaveIBeenPwned-palveluun ei voitu suorittaa
|
||||
|
||||
[mail]
|
||||
view_it_on=Näytä %s
|
||||
|
@ -514,9 +533,18 @@ account_security_caution.text_1 = Jos se olit sinä, voit jättää tämän vies
|
|||
issue.action.approve = <b>@%[1]s</b> hyväksyi tämän vetopyynnön.
|
||||
issue.action.review = <b>@%[1]s</b> kommentoi tätä vetopyyntöä.
|
||||
issue.action.ready_for_review = <b>@%[1]s</b> merkitsi tämän vetopyynnön valmiiksi katselmointia varten.
|
||||
totp_disabled.text_1 = Tilisi aikapohjainen kertakäyttösalasana (TOTP) poistettiin käytöstä.
|
||||
issue.action.close = <b>@%[1]s</b> sulki ongelman #%[2]d.
|
||||
issue.action.reopen = <b>@%[1]s</b> avasi uudelleen ongelman #%[2]d.
|
||||
admin.new_user.text = <a href="%s">Napsauta tästä</a> hallitaksesi tätä käyttäjää ylläpitonäkymästä.
|
||||
|
||||
|
||||
|
||||
repo.collaborator.added.text = Sinut on lisätty avustajaksi repoon:
|
||||
|
||||
primary_mail_change.text_1 = Tilisi ensisijaiseksi sähköpostiosoitteeksi asetettiin %[1]s. Se tarkoittaa, että tämä sähköpostiosoite ei enää vastaanota tilisi ilmoituksia sähköpostitse.
|
||||
team_invite.text_1 = %[1]s on kutsunut sinut liittymään tiimiin %[2]s organisaatiossa %[3]s.
|
||||
|
||||
[modal]
|
||||
yes=Kyllä
|
||||
no=Ei
|
||||
|
@ -629,8 +657,13 @@ following_one = %d seurataan
|
|||
block_user.detail = Huomaa, että käyttäjän estämisellä on muita vaikutuksia, kuten:
|
||||
show_on_map = Näytä paikka kartalla
|
||||
form.name_chars_not_allowed = Käyttäjätunnus "%s" sisältää virheellisiä merkkejä.
|
||||
follow_blocked_user = Et voi seurata tätä käyttäjää, koska olet estänyt kyseisen käyttäjän tai kyseinen käyttäjä on estänyt sinut.
|
||||
disabled_public_activity = Käyttäjä on poistanut käytöstä toiminnan julkisen näkyvyyden.
|
||||
|
||||
|
||||
form.name_reserved = Käyttäjätunnus "%s" on varattu.
|
||||
form.name_pattern_not_allowed = Kaava "%s" ei ole sallittu käyttäjätunnuksessa.
|
||||
|
||||
[settings]
|
||||
profile=Profiili
|
||||
account=Tili
|
||||
|
@ -684,7 +717,7 @@ keep_activity_private_popup=Tekee toiminnon näkyvän vain sinulle ja ylläpitä
|
|||
|
||||
lookup_avatar_by_mail=Hae profiilikuva sähköpostin perusteella
|
||||
federated_avatar_lookup=Ulkopuolinen profiilikuvan haku
|
||||
enable_custom_avatar=Ota käyttöön mukautettu profiilikuva
|
||||
enable_custom_avatar=Käytä mukautettua profiilikuvaa
|
||||
choose_new_avatar=Valitse uusi profiilikuva
|
||||
update_avatar=Päivitä profiilikuva
|
||||
delete_current_avatar=Poista nykyinen profiilikuva
|
||||
|
@ -699,9 +732,9 @@ password_change_disabled=Ei-lokaalit käyttäjät eivät voi päivittää salasa
|
|||
|
||||
emails=Sähköposti osoitteet
|
||||
manage_emails=Hallitse sähköpostiosoitteita
|
||||
manage_themes=Valitse oletusteema
|
||||
manage_openid=Hallitse OpenID osoitteita
|
||||
theme_desc=Tämä on sivuston oletusteemasi.
|
||||
manage_themes=Oletusteema
|
||||
manage_openid=OpenID-osoitteet
|
||||
theme_desc=Tätä teemaa käytetään verkkosivuston käyttöliittymässä, kun olet sisäänkirjautuneena.
|
||||
primary=Ensisijainen
|
||||
activated=Aktivoitu
|
||||
requires_activation=Vaatii aktivoinnin
|
||||
|
@ -717,7 +750,7 @@ theme_update_error=Valittua teemaa ei löydy.
|
|||
openid_deletion=Poista OpenID-osoite
|
||||
openid_deletion_success=OpenID-osoite on poistettu.
|
||||
add_new_email=Lisää uusi sähköpostiosoite
|
||||
add_new_openid=Lisää uusi OpenID URI
|
||||
add_new_openid=Lisää uusi OpenID-URI
|
||||
add_email=Lisää sähköpostiosoite
|
||||
add_openid=Lisää OpenID URI
|
||||
add_email_success=Uusi sähköpostiosoite on lisätty.
|
||||
|
@ -729,14 +762,14 @@ openid_desc=OpenID mahdollistaa todentamisen delegoinnin ulkopuoliselle palvelun
|
|||
manage_ssh_keys=Hallitse SSH-avaimia
|
||||
manage_gpg_keys=Hallitse GPG-avaimia
|
||||
add_key=Lisää avain
|
||||
ssh_desc=Nämä julkiset SSH-avaimet on liitetty tiliisi. Vastaavat yksityiset avaimet antavat täyden pääsyn repoihisi.
|
||||
gpg_desc=Nämä julkiset GPG-avaimet on liitetty tiliisi. Pidä yksityiset avaimet turvassa, koska ne mahdollistavat committien todentamisen.
|
||||
ssh_desc=Nämä julkiset SSH-avaimet on liitetty tiliisi. Vastaavat yksityiset avaimet antavat täyden pääsyn repoihisi. Vahvistettuja SSH-avaimia voi käyttää SSH-allekirjoitettujen Git-kommittien vahvistamiseen.
|
||||
gpg_desc=Nämä julkiset GPG-avaimet on liitetty tiliisi, ja niitä käytetään kommittien vahvistamiseen. Pidä yksityiset avaimet turvassa, koska ne mahdollistavat kommittien allekirjoittamisen sinun nimissä.
|
||||
ssh_helper=<strong>Tarvitsetko apua?</strong> Tutustu GitHubin oppaaseen <a href="%s">omien SSH-avainten luonnista</a> tai <a href="%s">yleisistä ongelmista</a>, joita voit kohdata SSH:n kanssa.
|
||||
gpg_helper=<strong>Tarvitsetko apua?</strong> Katso GitHubin opas <a href="%s">GPG</a>:stä.
|
||||
add_new_key=Lisää SSH avain
|
||||
add_new_gpg_key=Lisää GPG-avain
|
||||
key_content_ssh_placeholder=Alkaa sanoilla 'ssh-ed25519', 'ssh-rsa', 'ecdsa-sha2-nistp256', 'ecdsa-sha2-nistp384', 'ecdsa-sha2-nistp521', 'sk-ecdsa-sha2-nistp256@openssh.com', tai 'sk-ssh-ed25519@openssh.com'
|
||||
key_content_gpg_placeholder=Alkaa sanoilla '-----BEGIN PGP PUBLIC KEY BLOCK-----'
|
||||
key_content_ssh_placeholder=Alkaa sanoilla "ssh-ed25519", "ssh-rsa", "ecdsa-sha2-nistp256", "ecdsa-sha2-nistp384", "ecdsa-sha2-nistp521", "sk-ecdsa-sha2-nistp256@openssh.com" tai "sk-ssh-ed25519@openssh.com"
|
||||
key_content_gpg_placeholder=Alkaa sanoilla "-----BEGIN PGP PUBLIC KEY BLOCK-----"
|
||||
ssh_key_name_used=Samanniminen SSH avain on jo olemassa tililläsi.
|
||||
gpg_key_id_used=Julkinen GPG-avain samalla tunnuksella on jo olemassa.
|
||||
gpg_no_key_email_found=Tämä GPG-avain ei vastaa mitään tiliisi liitettyä aktivoitua sähköpostiosoitetta. Se voidaan silti lisätä, jos allekirjoitat annetun pääsymerkin.
|
||||
|
@ -748,7 +781,7 @@ gpg_token=Pääsymerkki
|
|||
gpg_token_help=Voit luoda allekirjoituksen käyttäen:
|
||||
gpg_token_code=echo "%s" | gpg -a --default-key %s --detach-sig
|
||||
gpg_token_signature=Panssaroitu GPG-allekirjoitus
|
||||
key_signature_gpg_placeholder=Alkaa sanoilla '-----BEGIN PGP SIGNATURE-----'
|
||||
key_signature_gpg_placeholder=Alkaa sanoilla "-----BEGIN PGP SIGNATURE-----"
|
||||
ssh_key_verified=Vahvistettu avain
|
||||
ssh_key_verified_long=Avain on vahvistettu pääsymerkillä ja sitä voidaan käyttää todentamaan commitit, jotka vastaavat tämän käyttäjän aktivoituja sähköpostiosoitteita.
|
||||
ssh_key_verify=Vahvista
|
||||
|
@ -756,7 +789,7 @@ ssh_token_required=Sinun täytyy antaa allekirjoitus alla olevalle pääsymerkil
|
|||
ssh_token=Pääsymerkki
|
||||
ssh_token_help=Voit luoda allekirjoituksen käyttäen:
|
||||
ssh_token_signature=Panssaroitu SSH-allekirjoitus
|
||||
key_signature_ssh_placeholder=Alkaa sanoilla '-----BEGIN SSH SIGNATURE-----'
|
||||
key_signature_ssh_placeholder=Alkaa sanoilla "-----BEGIN SSH SIGNATURE-----"
|
||||
subkeys=Aliavaimet
|
||||
key_id=Avain ID
|
||||
key_name=Avaimen nimi
|
||||
|
@ -774,7 +807,7 @@ can_read_info=Luku
|
|||
can_write_info=Kirjoitus
|
||||
show_openid=Näytä profiilissa
|
||||
hide_openid=Piilota profiilista
|
||||
ssh_disabled=SSH pois käytöstä
|
||||
ssh_disabled=SSH on pois käytöstä
|
||||
manage_social=Hallitse liitettyjä sosiaalisia tilejä
|
||||
|
||||
manage_access_token=Hallitse pääsymerkkejä
|
||||
|
@ -795,7 +828,7 @@ create_oauth2_application=Luo uusi OAuth2-sovellus
|
|||
create_oauth2_application_button=Luo sovellus
|
||||
oauth2_application_name=Sovelluksen nimi
|
||||
save_application=Tallenna
|
||||
oauth2_regenerate_secret=Luo secret uudelleen
|
||||
oauth2_regenerate_secret=Luo salaisuus uudelleen
|
||||
oauth2_regenerate_secret_hint=Kadotitko secretin?
|
||||
oauth2_application_edit=Muokkaa
|
||||
|
||||
|
@ -811,10 +844,10 @@ twofa_enrolled=Tiliisi on otettu käyttöön kaksivaiheinen vahvistus. Ota palau
|
|||
|
||||
webauthn_nickname=Nimimerkki
|
||||
|
||||
manage_account_links=Hallitse linkitettyjä tilejä
|
||||
manage_account_links=Yhdistetyt tilit
|
||||
manage_account_links_desc=Nämä ulkoiset tilit on linkitetty Forgejo tiliisi.
|
||||
link_account=Yhdistä tili
|
||||
remove_account_link=Poista linkitetty tili
|
||||
remove_account_link=Poista yhdistetty tili
|
||||
remove_account_link_desc=Linkitetyn tilin poistaminen peruuttaa pääsyn Forgejo-tiliisi linkitetyn tili kautta. Jatketaanko?
|
||||
remove_account_link_success=Linkitetty tili on poistettu.
|
||||
|
||||
|
@ -854,11 +887,11 @@ location_placeholder = Jaa likimääräinen sijaintisi muiden kanssa
|
|||
retype_new_password = Vahvista uusi salasana
|
||||
create_oauth2_application_success = Loit uuden OAuth2-sovelluksen.
|
||||
repos_none = Et omista yhtäkään repositoriota.
|
||||
visibility.limited_tooltip = Näkyvissä vain tunnistautuneille käyttäjille
|
||||
visibility.limited_tooltip = Näkyvissä vain kirjautuneille käyttäjille
|
||||
email_notifications.disable = Poista sähköposti-ilmoitukset käytöstä
|
||||
webauthn_register_key = Lisää turva-avain
|
||||
blocked_users = Estetyt käyttäjät
|
||||
profile_desc = Määritä, miten muut näkevät profiilisi. Ensisijaista sähköpostiosoitettasi käytetään ilmoitusten ja salasanan palautuspyyntöjen lähettämiseen sekä verkkosivupohjaisiin Git-operaatioihin.
|
||||
profile_desc = Tietoja sinusta
|
||||
change_password_success = Salasanasi on päivitetty. Kirjaudu jatkossa käyttäen uutta salasanaa.
|
||||
manage_oauth2_applications = Hallitse OAuth2-sovelluksia
|
||||
change_password = Vaihda salasana
|
||||
|
@ -892,6 +925,36 @@ twofa_disable = Poista kaksivaiheinen todennus käytöstä
|
|||
twofa_disable_desc = Kaksivaiheisen todennuksen poistaminen asettaa tilisi aiempaa suurempaan uhkaan. Jatketaanko?
|
||||
update_language_not_found = Kieli "%s" ei ole käytettävissä.
|
||||
change_username_prompt = Huomio: Käyttäjätunnuksen vaihtaminen muuttaa myös tilisi URL-osoitteen.
|
||||
oauth2_client_secret_hint = Tätä salaisuutta ei näytetä uudelleen, kun olet poistunut sivulta tai päivittänyt sivun. Varmista, että olet ottanut salaisuuden talteen.
|
||||
blocked_since = Estetty %s lähtien
|
||||
user_unblock_success = Käyttäjän esto on poistettu.
|
||||
oauth2_redirect_uris = Uudelleenohjaus-URI:t. Käytä uutta riviä (newline) jokaista URI:a kohden.
|
||||
oauth2_client_secret = Asiakkaan salaisuus
|
||||
verify_ssh_key_success = SSH-avain "%s" on vahvistettu.
|
||||
change_username_redirect_prompt = Vanha käyttäjätunnus uudelleenohjaa, kunnes joku muu ottaa käyttäjätunnuksen käyttönsä.
|
||||
uploaded_avatar_is_too_big = Lähetetyn tiedoston koko (%d KiB) ylittää enimmäiskoon (%d KiB).
|
||||
ssh_key_been_used = Tämä SSH-avain on jo lisätty palvelimelle.
|
||||
verify_gpg_key_success = GPG-avain "%s" on vahvistettu.
|
||||
add_key_success = SSH-avain "%s" on lisätty.
|
||||
add_gpg_key_success = GPG-avain "%s" on lisätty.
|
||||
ssh_key_deletion_success = SSH-avain on poistettu.
|
||||
valid_until_date = Kelvollinen %s asti
|
||||
oauth2_client_id = Asiakkaan tunniste
|
||||
email_notifications.onmention = Ilmoitus vain maininnasta
|
||||
email_notifications.submit = Aseta valinta
|
||||
email_notifications.andyourown = Ja omat ilmoitukset
|
||||
key_state_desc = Tätä avainta on käytetty viimeisen 7 päivän aikana
|
||||
oauth2_application_create_description = OAuth2-sovellukset mahdollistavat kolmannen osapuolen sovelluksen pääsyn tilillesi tässä instanssissa.
|
||||
oauth2_confidential_client = Luottamuksellinen sovellus. Valitse sovelluksille, jotka pitävät salaisuuden luottamuksellisena, kuten web-sovelluksille. Älä valitse natiiveille sovelluksille mukaan lukien työpöytä- ja mobiilisovellukset.
|
||||
ssh_key_deletion_desc = SSH-avaimen poistaminen kumoaa pääsyn tilillesi kyseistä avainta käyttäen. Jatketaanko?
|
||||
|
||||
add_email_confirmation_sent = Vahvistusviesti on lähetetty osoitteeseen "%s". Vahvista sähköpostiosoitteesi seuraavan %s sisällä.
|
||||
|
||||
pronouns_custom_label = Mukautetut pronominit
|
||||
openid_deletion_desc = Tämän OpenID-osoitteen poistaminen tililtäsi estää kirjautumisen sitä käyttäen. Jatketaanko?
|
||||
ssh_signonly = SSH on tällä hetkellä poistettu käytöstä, joten näitä avaimia käytetään vain kommittien allekirjoituksen vahvistamiseen.
|
||||
generate_token_name_duplicate = Nimeä <strong>%s</strong> on jo käytetty sovelluksen nimenä. Käytä eri nimeä.
|
||||
oauth2_applications_desc = OAuth2-sovellukset mahdollistavat käyttämäsi kolmannen osapuolen sovelluksen todentaa turvallisesti käyttäjiä tähän Forgejo-instanssiin.
|
||||
|
||||
[repo]
|
||||
owner=Omistaja
|
||||
|
@ -917,7 +980,7 @@ repo_gitignore_helper=Valitse .gitignore-mallit
|
|||
issue_labels=Ongelmien tunnisteet
|
||||
issue_labels_helper=Valitse pohja ongelmien nimilapuille.
|
||||
license=Lisenssi
|
||||
license_helper=Valitse lisenssitiedosto.
|
||||
license_helper=Valitse lisenssitiedosto
|
||||
readme=README
|
||||
auto_init=Alusta repo (Luo .gitignore, License ja README)
|
||||
create_repo=Luo repo
|
||||
|
@ -1316,7 +1379,7 @@ activity.new_issues_count_1=Uusi ongelma
|
|||
activity.new_issues_count_n=uutta ongelmaa
|
||||
activity.new_issue_label=Avoinna
|
||||
activity.unresolved_conv_label=Auki
|
||||
activity.published_release_label=Julkaistu
|
||||
activity.published_release_label=Julkaisu
|
||||
activity.git_stats_pushed_1=on työntänyt
|
||||
activity.git_stats_file_1=%d tiedosto
|
||||
activity.git_stats_file_n=%d tiedostoa
|
||||
|
@ -1361,9 +1424,9 @@ settings.transfer.title=Siirrä omistajuus
|
|||
settings.transfer_form_title=Syötä repon nimi vahvistuksena:
|
||||
settings.transfer_notices_3=- Jos arkisto on yksityinen ja se siirretään yksittäiselle käyttäjälle, tämä toiminto varmistaa, että käyttäjällä on ainakin lukuoikeudet (ja muuttaa käyttöoikeuksia tarvittaessa).
|
||||
settings.transfer_owner=Uusi omistaja
|
||||
settings.wiki_delete=Poista Wiki data
|
||||
settings.wiki_delete=Poista wikidata
|
||||
settings.wiki_delete_desc=Repon wikin data poistaminen on pysyvä eikä voi peruuttaa.
|
||||
settings.confirm_wiki_delete=Wiki datan poistaminen
|
||||
settings.confirm_wiki_delete=Poista wikidata
|
||||
settings.wiki_deletion_success=Repon wiki data on poistettu.
|
||||
settings.delete=Poista tämä repo
|
||||
settings.delete_desc=Repon poistaminen on pysyvä eikä voi peruuttaa.
|
||||
|
@ -1384,7 +1447,7 @@ settings.webhook.body=Sisältö
|
|||
settings.githook_edit_desc=Jos koukku ei ole käytössä, esitellään esimerkkisisältö. Sisällön jättäminen tyhjäksi arvoksi poistaa tämän koukun käytöstä.
|
||||
settings.githook_name=Koukun nimi
|
||||
settings.githook_content=Koukun sisältö
|
||||
settings.update_githook=Päivitys koukku
|
||||
settings.update_githook=Päivitä koukku
|
||||
settings.payload_url=Kohde URL
|
||||
settings.http_method=HTTP-menetelmä
|
||||
settings.secret=Salaus
|
||||
|
@ -1406,7 +1469,7 @@ settings.event_push_desc=Git push repoon.
|
|||
settings.event_repository=Repo
|
||||
settings.event_repository_desc=Repo luotu tai poistettu.
|
||||
settings.event_header_issue=Ongelmien tapahtumat
|
||||
settings.event_issues=Ongelmat
|
||||
settings.event_issues=Muokkaus
|
||||
settings.event_issues_desc=Ongelma avattu, suljettu, avattu uudelleen tai muokattu.
|
||||
settings.event_issue_assign=Ongelma määritetty
|
||||
settings.event_issue_assign_desc=Ongelma osoitettu tai osoitus poistettu.
|
||||
|
@ -1414,7 +1477,7 @@ settings.event_issue_label_desc=Ongelman tunnisteet päivitetty tai tyhjennetty.
|
|||
settings.event_issue_milestone_desc=Merkkipaalu lisätty, poistettu tai muokattu.
|
||||
settings.event_issue_comment_desc=Ongelman kommentti luotu, muokattu tai poistettu.
|
||||
settings.event_header_pull_request=Vetopyyntöjen tapahtumat
|
||||
settings.event_pull_request=Vetopyyntö
|
||||
settings.event_pull_request=Muokkaus
|
||||
settings.event_package_desc=Paketti on luotu tai poistettu repossa.
|
||||
settings.active_helper=Tiedot käynnistetyistä tapahtumista lähetetään tähän webkoukun URL-osoitteeseen.
|
||||
settings.add_hook_success=Uusi webkoukku on lisätty.
|
||||
|
@ -1573,7 +1636,7 @@ release.ahead.commits = <strong>%d</strong> kommittia
|
|||
all_branches = Kaikki haarat
|
||||
n_tag_few = %s tagia
|
||||
settings.event_fork_desc = Repo forkattu.
|
||||
actions = Toimenpiteet
|
||||
actions = Actions
|
||||
fork_guest_user = Kirjaudu sisään forkataksesi tämän repon.
|
||||
fork_from_self = Et voi forkata omistamaasi repoa.
|
||||
visibility_fork_helper = (Tämän muuttaminen vaikuttaa kaikkien forkkien näkyvyyteen.)
|
||||
|
@ -1641,7 +1704,7 @@ activity.git_stats_author_n = %d tekijää
|
|||
issues.dependency.add_error_dep_exists = Riippuvuus on jo olemassa.
|
||||
wiki.page_content = Sivun sisältö
|
||||
wiki.page_title = Sivun otsikko
|
||||
activity.navbar.contributors = Kontribuuttorit
|
||||
activity.navbar.contributors = Avustajat
|
||||
n_release_few = %s julkaisua
|
||||
n_release_one = %s julkaisu
|
||||
symbolic_link = Symbolinen linkki
|
||||
|
@ -1659,7 +1722,7 @@ milestones.deletion_success = Merkkipaalu on poistettu.
|
|||
project = Projektit
|
||||
pulls.delete.title = Poistetaanko tämä vetopyyntö?
|
||||
activity.title.issues_1 = %d ongelma
|
||||
contributors.contribution_type.filter_label = Kontribuution tyyppi:
|
||||
contributors.contribution_type.filter_label = Avustuksen tyyppi:
|
||||
settings.protected_branch.delete_rule = Poista sääntö
|
||||
settings.archive.success = Repo arkistoitiin onnistuneesti.
|
||||
diff.comment.placeholder = Jätä kommentti
|
||||
|
@ -1883,7 +1946,7 @@ migrate.gitlab.description = Tee migraatio gitlab.comista tai muista GitLab-inst
|
|||
migrate.gitea.description = Tee migraatio gitea.comista tai muista Gitea-instansseista.
|
||||
repo_gitignore_helper_desc = Valitse mitä tiedostoja ei seurata yleisimpien kielten mallipohjista. Tyypilliset artefaktit, joita eri kielten koostamistyökalut tuottavat, lisätään .gitignore-tiedostoon oletusarvoisesti.
|
||||
milestones.filter_sort.latest_due_date = Kaukaisin määräpäivä
|
||||
license_helper_desc = Lisenssi määrää, mitä muut voivat ja eivät voi tehdä koodillasi. Etkö ole varma, mikä lisenssi soveltuu projektillesi? Lue <a target="_blank" rel="noopener noreferrer" href="%s">ohje lisenssin valinnasta.</a>
|
||||
license_helper_desc = Lisenssi määrää, mitä muut voivat ja eivät voi tehdä koodillasi. Etkö ole varma, mikä lisenssi soveltuu projektillesi? Lue <a target="_blank" rel="noopener noreferrer" href="%s">ohje lisenssin valinnasta</a>.
|
||||
milestones.filter_sort.earliest_due_data = Lähin määräpäivä
|
||||
issues.filter_type.reviewed_by_you = Katselmoitu toimestasi
|
||||
settings.units.overview = Yleisnäkymä
|
||||
|
@ -1959,9 +2022,81 @@ editor.must_have_write_access = Sinulla täytyy olla kirjoitusoikeus tehdäksesi
|
|||
issues.re_request_review = Pyydä katselmointia uudelleen
|
||||
pulls.status_checks_details = Yksityiskohdat
|
||||
release.title_empty = Nimi ei voi olla tyhjä.
|
||||
archive.title = Tämä repo on arkistoitu. Voit katsella sen sisältämiä tiedostoja ja kloonata repon, mutta et voi pushata, avata ongelmia tai luoda vetopyyntöjä.
|
||||
reactions_more = ja %d lisää
|
||||
mirror_address = Kloonaa URL-osoitteesta
|
||||
migrate_items_merge_requests = Yhdistämispyynnöt
|
||||
stars_remove_warning = Tämä poistaa kaikki tähdet tästä reposta.
|
||||
archive.issue.nocomment = Tämä repo on arkistoitu. Et voi kommentoida ongelmia.
|
||||
archive.pull.nocomment = Tämä repo on arkistoitu. Et voi kommentoida vetopyyntöjä.
|
||||
settings.webhook_deletion_desc = Webkoukun poistaminen poistaa sen asetukset ja toimitushistorian. Jatketaanko?
|
||||
settings.discord_icon_url.exceeds_max_length = Kuvakkeen URL-osoite voi sisältää enintään 2048 merkkiä
|
||||
settings.event_wiki_desc = Wiki-sivu luotu, nimetty uudelleen, muokattu tai poistettu.
|
||||
settings.event_pull_request_desc = Vetopyyntö avattu, suljettu, avattu uudelleen tai muokattu.
|
||||
settings.protect_branch_name_pattern = Suojatun haaran nimen kaava
|
||||
issues.dependency.add_error_dep_not_same_repo = Molempien ongelmien tulee olla samassa repossa.
|
||||
settings.event_release = Julkaisu
|
||||
pulls.merge_pull_request = Luo yhdistämiskommitti
|
||||
settings.pull_mirror_sync_quota_exceeded = Kiintiö ylitetty, ei vedetä muutoksia.
|
||||
settings.wiki_rename_branch_main_notices_1 = Tätä toimintoa <strong>EI VOI</strong> perua.
|
||||
settings.webhook.test_delivery_desc_disabled = Aktivoi webkoukku testataksesi sitä tekaistulla tapahtumalla.
|
||||
settings.discord_icon_url = Kuvakkeen URL-osoite
|
||||
settings.archive.branchsettings_unavailable = Haaran asetukset eivät ole saatavilla arkistoiduissa repoissa.
|
||||
pulls.ready_for_review = Valmiina katselmointiin?
|
||||
issues.time_spent_total = Käytetty kokonaisaika
|
||||
settings.webhook.test_delivery_desc = Testaa tätä webkoukkua tekaistulla tapahtumalla.
|
||||
pulls.switch_comparison_type = Vaihda vertailutyyppiä
|
||||
settings.hooks_desc = Webkoukut tekevät automaattisesti HTTP POST -pyyntöjä palvelimelle, kun jotkin Forgejo-tapahtumat käynnistyvät. Lue lisää <a target="_blank" rel="noopener noreferrer" href="%s">webkoukkujen oppaasta</a>.
|
||||
issues.num_participants_one = %d osallistuja
|
||||
issues.reference_link = Viittaus: %s
|
||||
|
||||
|
||||
|
||||
mirror_interval = Peilauksen aikaväli (kelvolliset yksiköt ovat "h", "m", "s"). 0 poistaa käytöstä aikaan pohjautuvan synkronoinnin. (Pienin aikaväli: %s)
|
||||
mirror_interval_invalid = Peilauksen aikaväli ei ole kelvollinen.
|
||||
mirror_sync_on_commit = Synkronoi kun kommitit pushataan
|
||||
issues.role.collaborator = Avustaja
|
||||
issues.role.collaborator_helper = Tämä käyttäjä on kutsuttu avustajaksi tähän repoon.
|
||||
issues.dependency.setting = Käytä riippuvuuksia ongelmiin ja vetopyyntöihin
|
||||
wiki.desc = Kirjoita ja jaa dokumentaatiota avustajien kesken.
|
||||
settings.collaboration = Avustajat
|
||||
settings.mirror_settings.docs = Määritä reposi automaattisesti synkronoimaan kommitit, tagit ja haarat toiseen repoon.
|
||||
settings.mirror_settings.docs.disabled_pull_mirror.instructions = Määritä projektisi automaattisesti pushaamaan kommitit, tagit ja haarat toiseen repoon. Pull-peilit on poistettu käytöstä tämän sivuston ylläpitäjän toimesta.
|
||||
settings.mirror_settings.docs.disabled_push_mirror.instructions = Määritä projektisi automaattisesti vetämään kommitit, tagit ja haarat toisesta reposta.
|
||||
settings.mirror_settings.docs.more_information_if_disabled = Löydät lisätietoja push- ja pull-peileistä täältä:
|
||||
settings.mirror_settings.pushed_repository = Työnnetty repo
|
||||
settings.mirror_settings.push_mirror.none = Push-peilejä ei ole määritetty
|
||||
settings.mirror_settings.push_mirror.add = Lisää push-peili
|
||||
settings.mirror_settings.push_mirror.edit_sync_time = Muokkaa peilin synkronoinnin aikaväliä
|
||||
settings.allow_only_contributors_to_track_time = Salli vain avustajien seurata aikaa
|
||||
settings.pulls_desc = Käytä repositorion vetopyyntöjä
|
||||
settings.actions_desc = Käytä integroituja CI-/CD-putkia Forgejo Actionsia hyödyntäen
|
||||
settings.admin_enable_health_check = Käytä repositorion terveystarkastuksia (git fsck)
|
||||
settings.admin_enable_close_issues_via_commit_in_any_branch = Sulje ongelma kommitin toimesta, joka on tehty muuhun kuin oletusarvoiseen haaraan
|
||||
settings.transfer_desc = Siirrä tämä repo käyttäjälle tai organisaatiolle, johon sinulla ylläpito-oikeus.
|
||||
settings.signing_settings = Allekirjoituksen vahvistuksen asetukset
|
||||
settings.trust_model = Allekirjoituksen luottamusmalli
|
||||
settings.trust_model.default = Oletusarvoinen luottamusmalli
|
||||
settings.trust_model.collaborator = Avustaja
|
||||
settings.trust_model.collaborator.long = Avustaja: Luota avustajien allekirjoituksiin
|
||||
settings.trust_model.collaboratorcommitter = Avustaja+kommitoija
|
||||
settings.trust_model.collaboratorcommitter.long = Avustaja+kommitoija: Luota avustajien allekirjoituksiin, jotka vastaavat kommitoijaa
|
||||
settings.add_collaborator = Lisää avustaja
|
||||
settings.add_collaborator_success = Avustaja on lisätty.
|
||||
settings.add_collaborator_owner = Omistajaa ei voi lisätä avustajaksi.
|
||||
settings.add_collaborator_duplicate = Avustaja on jo lisätty tähän repoon.
|
||||
settings.add_collaborator_blocked_our = Avustajaa ei voi lisätä, koska repon omistaja on estänyt hänet.
|
||||
settings.add_collaborator_blocked_them = Avustajaa ei voi lisätä, koska kyseinen avustaja on estänyt repon omistajan.
|
||||
settings.collaborator_deletion = Poista avustaja
|
||||
settings.collaborator_deletion_desc = Avustajan poistaminen estää hänen pääsyn tähän repoon. Jatketaanko?
|
||||
settings.remove_collaborator_success = Avustaja on poistettu.
|
||||
settings.org_not_allowed_to_be_collaborator = Organisaatioita ei voi lisätä avustajaksi.
|
||||
settings.default_branch_desc = Valitse repon oletushaara, johon vetopyynnöt ja koodikommitit kohdistetaan:
|
||||
settings.archive.text = Repon arkistointi asettaa sen pelkkään lukutilaan. Se piilotetaan hallintapaneelista. Kukaan (et edes sinä!) ei pysty tehdä uusia kommitteja, avata uusia ongelmia tai avata vetopyyntöjä.
|
||||
|
||||
no_eol.text = Ei EOL:ää
|
||||
pulls.compare_changes_desc = Valitse haara, johon yhdistetään, ja haara, josta vedetään.
|
||||
|
||||
[graphs]
|
||||
component_loading_info = Tämä saattaa kestää hetken…
|
||||
component_failed_to_load = Odottamaton virhe.
|
||||
|
@ -2102,8 +2237,8 @@ dashboard.operation_switch=Vaihda
|
|||
dashboard.operation_run=Suorita
|
||||
dashboard.delete_inactive_accounts=Poista kaikki aktivoimattomat käyttäjät
|
||||
dashboard.delete_repo_archives=Poista kaikki repojen arkistot (ZIP, TAR.GZ, jne..)
|
||||
dashboard.server_uptime=Palvelimen Uptime
|
||||
dashboard.current_goroutine=Nykyiset Goroutinet
|
||||
dashboard.server_uptime=Palvelimen uptime
|
||||
dashboard.current_goroutine=Nykyiset goroutinet
|
||||
dashboard.current_memory_usage=Nykyinen muistinkäyttö
|
||||
dashboard.total_memory_allocated=Yhteensä muistia varattu
|
||||
dashboard.memory_obtained=Muistia saatu
|
||||
|
@ -2123,7 +2258,7 @@ dashboard.mcache_structures_obtained=MCache rakenteita saatu
|
|||
dashboard.profiling_bucket_hash_table_obtained=Profilointi Bucket Hash Table saatu
|
||||
dashboard.gc_metadata_obtained=GC metatietoja saatu
|
||||
dashboard.other_system_allocation_obtained=Muita järjestestelmän varauksia saatu
|
||||
dashboard.next_gc_recycle=Seuraava GC kierrätys
|
||||
dashboard.next_gc_recycle=Seuraava GC-kierrätys
|
||||
dashboard.last_gc_time=Edellisen GC ajan jälkeen
|
||||
dashboard.total_gc_time=Yhteensä GC tauko
|
||||
dashboard.total_gc_pause=Yhteensä GC tauko
|
||||
|
@ -2279,7 +2414,7 @@ config.default_visibility_organization=Uuden organisaation oletusnäkyvyys
|
|||
|
||||
config.webhook_config=Webkoukkujen asetukset
|
||||
config.queue_length=Jonon pituus
|
||||
config.deliver_timeout=Toimitus aikakatkaisu
|
||||
config.deliver_timeout=Toimituksen aikakatkaisu
|
||||
|
||||
config.mailer_enabled=Käytössä
|
||||
config.mailer_name=Nimi
|
||||
|
@ -2426,8 +2561,14 @@ dashboard.task.unknown = Tuntematon tehtävä: %[1]s
|
|||
dashboard.cron.error = Virhe Cronissa: %s: %[3]s
|
||||
dashboard.task.started = Käynnistetty tehtävä: %[1]s
|
||||
dashboard.cron.finished = Cron: %[1]s on valmistunut
|
||||
dashboard.resync_all_sshkeys = Päivitä ".ssh/authorized_keys"-tiedosto Forgejo:n SSH-avaimilla.
|
||||
dashboard.cleanup_packages = Siivoa vanhentuneet paketit
|
||||
|
||||
|
||||
config.default_allow_only_contributors_to_track_time = Salli vain avustajien seurata aikaa
|
||||
monitor.download_diagnosis_report = Lataa diagnostiikkaraportti
|
||||
monitor.last_execution_result = Tulos
|
||||
|
||||
[action]
|
||||
create_repo=luotu repo <a href="%s">%s</a>
|
||||
rename_repo=uudelleennimetty repo <code>%[1]s</code> nimelle <a href="%[2]s">%[3]s</a>
|
||||
|
@ -2601,6 +2742,31 @@ settings.link = Linkitä tämä paketti repositorioon
|
|||
maven.download = Lataa riippuvuus suorittamalla komentorivillä:
|
||||
registry.documentation = Lisätietoja %s-rekisteristä on <a target="_blank" rel="noopener noreferrer" href="%s">dokumentaatiossa</a>.
|
||||
owner.settings.chef.keypair.description = Avainpari vaaditaan Chef-rekisteriin tunnistautumista varten. Jos olet luonut avainparin aiemmin, uuden avainparin luominen hylkää aiemman avainparin.
|
||||
owner.settings.cleanuprules.keep.pattern = Säilytä kaavaa vastaavat versiot
|
||||
owner.settings.cleanuprules.pattern_full_match = Toteuta kaavio paketin koko nimeen
|
||||
owner.settings.cleanuprules.keep.title = Näitä sääntöjä vastaavat versiot säilytetään, vaikka ne vastaisivat alla olevaa poistosääntöä.
|
||||
owner.settings.cleanuprules.keep.count = Säilytä viimeisimmät
|
||||
owner.settings.cleanuprules.remove.pattern = Poista kaavaa vastaavat versiot
|
||||
owner.settings.cleanuprules.keep.pattern.container = Viimeisin (<code>latest</code>) versio säilytetään aina Container-paketeista.
|
||||
owner.settings.cleanuprules.remove.title = Näitä sääntöjä vastaavat versiot poistetaan, ellei sääntö yläpuolella käske säilyttää niitä.
|
||||
owner.settings.cleanuprules.remove.days = Poista versiot, jotka ovat vanhempia kuin
|
||||
arch.pacman.helper.gpg = Lisää luottamusvarmenne pacmanille:
|
||||
|
||||
empty.repo = Lähetitkö paketin, mutta se ei näy täällä? Siirry <a href="%[1]s">paketin asetuksiin</a> ja linkitä se tähän repoon.
|
||||
published_by = Julkaistu %[1]s käyttäjän <a href="%[2]s">%[3]s</a> toimesta
|
||||
alpine.registry = Määritä tämä rekisteri lisäämällä URL-osoite tiedostoon <code>/etc/apk/repositories</code>:
|
||||
alpine.registry.key = Lataa rekisterin julkinen RSA-avain hakemistoon <code>/etc/apk/keys/</code> vahvistaaksesi indeksin allekirjoituksen:
|
||||
alpine.registry.info = Valitse $branch ja $repository alla olevasta listasta.
|
||||
arch.pacman.conf = Lisää palvelin asiaan liittyvällä jakelulla ja arkkitehtuurilla tiedostoon <code>/etc/pacman.conf</code> :
|
||||
arch.pacman.sync = Synkronoi paketti pacmanin kanssa:
|
||||
container.images.title = Levykuvat
|
||||
debian.registry.info = Valitse $distribution ja $component alla olevasta listasta.
|
||||
rpm.repository.multiple_groups = Tämä paketti on saatavilla useissa ryhmissä.
|
||||
rubygems.dependencies.runtime = Ajonaikaiset riippuvuudet
|
||||
owner.settings.cargo.rebuild = Rakenna indeksi uudelleen
|
||||
owner.settings.cargo.rebuild.error = Cargo-indeksin rakentaminen uudelleen epäonnistui: %v
|
||||
owner.settings.cargo.rebuild.success = Cargo-indeksi rakennettiin uudelleen.
|
||||
owner.settings.cleanuprules.preview.none = Siivoussääntö ei vastaa yhtäkään pakettia.
|
||||
|
||||
[secrets]
|
||||
creation.failed = Salaisuuden lisääminen epäonnistui.
|
||||
|
@ -2699,11 +2865,15 @@ workflow.disable_success = Työnkulku "%s" on poistettu käytöstä.
|
|||
runs.no_job = Työnkulun tulee sisältää vähintään yksi työ
|
||||
runs.invalid_workflow_helper = Työnkulun asetustiedosto on virheellinen. Tarkista asetustiedosto: %s
|
||||
runners = Ajajat
|
||||
actions = Toimenpiteet
|
||||
actions = Actions
|
||||
|
||||
|
||||
|
||||
|
||||
unit.desc = Hallitse integroituja CI/CD-putkia Forgejo Actionsia hyödyntäen.
|
||||
runs.pushed_by = työntänyt
|
||||
runs.no_workflows.help_no_write_access = Lisätietoja Forgejo Actionsista on saatavilla <a target="_blank" rel="noopener noreferrer" href="%s">dokumentaatiosta</a>.
|
||||
|
||||
[projects]
|
||||
type-1.display_name = Yksittäinen projekti
|
||||
deleted.display_name = Poistettu projekti
|
||||
|
|
|
@ -748,7 +748,7 @@ social = Mga social account
|
|||
biography_placeholder = Sabihin sa iba ng kaunti tungkol sa iyong sarili! (Sinusuportahan ang Markdown)
|
||||
change_username_prompt = Tandaan: Ang pagpalit ng username ay papalitan din ang URL ng iyong account.
|
||||
organization = Mga Organisasyon
|
||||
profile_desc = Kontrolin kung paano ipinapakita ang iyong profile sa ibang mga gumagamit. Ang iyong pangunahing email address ay gagamitin para sa mga abiso, pagbawi ng password at mga Git operation na batay sa web.
|
||||
profile_desc = Tungkol sa iyo
|
||||
hidden_comment_types_description = Ang mga uri ng komento na naka-check dito ay hindi ipapakita sa loob ng mga pahina ng isyu. Halimbawa ang pag-check ng "Label" ay tatanggalin lahat ng mga "Idinagdag/tinanggal ni <user> ang <label>" na komento.
|
||||
comment_type_group_milestone = Milestone
|
||||
comment_type_group_issue_ref = Pagsangguni ng isyu
|
||||
|
@ -767,7 +767,7 @@ ssh_key_deletion_desc = Ang pagtanggal ng SSH key ay matatanggihan ang pag-acces
|
|||
no_activity = Walang kamakilang aktibidad
|
||||
ssh_signonly = Kasalukuyang naka-disable ang SSH kaya magagamit lang ang mga key na ito para sa pagpapatunay ng commit signature.
|
||||
gpg_desc = Ang mga pampublikong GPG key dito ay nauugnay sa iyong account at ginagamit para i-verify ang iyong mga commit. Panatilihing ligtas ang iyong mga pribadong key dahil pinapayagan nito ang pag-sign ng mga commit gamit ng iyong pagkakakilanlan.
|
||||
keep_email_private_popup = Itatago nito ang iyong email address sa iyong profile. Hindi na ito ang magiging default para sa mga commit na ginawa sa pamamagitan ng web interface, tulad ng pag-upload ng mga file at pagbabago. Sa halip gagamitin ang isang espeyal na address na %s para i-associate ang mga commit sa iyong account. Tandaan na ang pagbabago ng opsyon na ito ay hindi makakaapekto sa mga umiiral na commit.
|
||||
keep_email_private_popup = Ang iyong email address ay hindi ipapakita sa iyong profile at hindi magiging default para sa mga commit na ginawa sa pamamagitan ng web interface, tulad ng pag-upload ng mga file, mga pagbabago, at mga merge commit. Sa halip, gagamitin ang isang espeyal na address na %s para i-link ang mga commit sa iyong account. Ang opsyon na ito ay hindi makakaapekto sa mga umiiral na commit.
|
||||
gpg_key_id_used = Ang isang publikong GPG key na may katulad na ID ay umiiral na.
|
||||
gpg_no_key_email_found = Ang GPG key na ito ay hindi tumutugma sa anumang email address na nauugnay sa iyong account. Madadagdag pa rin ito kapag i-sign mo ang ibinigay na token.
|
||||
ssh_principal_deletion_success = Tinanggal na ang principal.
|
||||
|
@ -997,6 +997,8 @@ language.title = Default na wika
|
|||
keep_activity_private.description = Makikita mo lang at mga tagapangasiwa ng instansya ang iyong <a href="%s">pampublikong aktibidad</a>.
|
||||
language.description = Mase-save ang wika sa iyong account at gagamitin bilang default pagkatapos mong mag-log in.
|
||||
language.localization_project = Tulungan kaming isalin ang Forgejo sa iyong wika! <a href="%s">Matuto pa</a>.
|
||||
pronouns_custom_label = Mga pasadyang pronoun
|
||||
user_block_yourself = Hindi mo maaring harangan ang sarili mo.
|
||||
|
||||
[repo]
|
||||
template_description = Ang mga template na repositoryo ay pinapayagan ang mga gumagamit na mag-generate ng mga bagong repositoryo na may magkatulad na istraktura ng direktoryo, mga file, at opsyonal na mga setting.
|
||||
|
@ -1070,7 +1072,7 @@ license_helper = Pumili ng file ng lisensya
|
|||
license_helper_desc = Ang lisensya ay namamahala kung ano ang pwede at hindi pwedeng gawin ng mga ibang tao sa iyong code. Hindi sigurado kung alin ang wasto para sa iyong proyekto? Tignan ang <a target="_blank" rel="noopener noreferrer" href="%s">Pumili ng lisensya</a>.
|
||||
object_format_helper = Object format ng repositoryo. Hindi mababago mamaya. Ang SHA1 ang pinaka-compatible.
|
||||
readme = README
|
||||
auto_init = I-initialize ang repositoryo (Nagdadagdag ng .gitignore, Lisensya, at README)
|
||||
auto_init = I-initialize ang repositoryo
|
||||
trust_model_helper = Pumili ng trust model para sa signature verification. Ang mga posibleng opsyon ay:
|
||||
trust_model_helper_collaborator = Katulong: I-trust ang mga signature batay sa mga katulong
|
||||
trust_model_helper_committer = Commiter: I-trust ang mga signature na tumutugma sa mga commiter
|
||||
|
@ -1127,8 +1129,8 @@ delete_preexisting_content = Burahin ang mga file sa %s
|
|||
tree_path_not_found_commit = Hindi umiiral ang path na %[1]s sa commit %[2]s
|
||||
tree_path_not_found_branch = Hindi umiiral ang daanang %[1]s sa branch %[2]s
|
||||
migrate_items_pullrequests = Mga hiling sa paghila
|
||||
archive.pull.nocomment = Naka-archive ang repo na ito. Hindi ka makakakomento sa mga pull request.
|
||||
archive.title = Naka-archive ang repo na ito. Maari mong itignan ang mga file at i-clone ito, pero hindi makaka-push o magbukas ng mga isyu o mga pull request.
|
||||
archive.pull.nocomment = Naka-archive ang repositoryong ito. Hindi ka makakakomento sa mga pull request.
|
||||
archive.title = Naka-archive ang repositoryong ito. Maari mong itignan ang mga file at i-clone ito, pero hindi makaka-push o magbukas ng mga isyu o mga pull request.
|
||||
archive.title_date = Naka-archive ang repositoryo na ito noong %s. Maari mong itignan ang mga file at i-clone ito, pero hindi makaka-push o magbukas ng mga isyu o mga pull request.
|
||||
pulls = Mga hiling sa paghila
|
||||
activity.merged_prs_count_n = Mga naisamang hiling sa paghila
|
||||
|
@ -1184,7 +1186,7 @@ migrate_items_labels = Mga label
|
|||
migrate_items_issues = Mga isyu
|
||||
migrate_items_merge_requests = Mga merge request
|
||||
migrate.clone_address = Magmigrate / Mag-clone mula sa URL
|
||||
archive.issue.nocomment = Naka-archive ang repo na ito. Hindi ka makakakomento sa mga isyu.
|
||||
archive.issue.nocomment = Naka-archive ang repositoryong ito. Hindi ka makakakomento sa mga isyu.
|
||||
migrate_items = Mga item sa pagmigrate
|
||||
migrate_items_releases = Mga paglabas
|
||||
migrate_repo = I-migrate ang repositoryo
|
||||
|
@ -2707,6 +2709,21 @@ release.hide_archive_links = Itago ang mga awtomatikong na-generate na archive
|
|||
release.hide_archive_links_helper = Itago ang awtomatikong na-generate na source code archive para sa release na ito. Halimbawa, kung maga-upload ka ng sarili mo.
|
||||
branch.already_exists = Umiiral na ang branch na may pangalan na "%s".
|
||||
diff.bin = BIN
|
||||
settings.default_update_style_desc = Ang default na istilio na gagamitin sa pag-update ng mga hiling sa paghila na nalilipas sa base branch.
|
||||
pulls.sign_in_require = <a href="%s">Mag-sign in</a> para gumawa ng bagong hiling sa paghila.
|
||||
new_from_template = Gumamit ng template
|
||||
new_from_template_description = Maari kang pumili ng umiiral na repository template sa instansya na ito at i-apply ang mga setting nito.
|
||||
new_advanced = Mga advanced na setting
|
||||
new_advanced_expand = I-click para i-expand
|
||||
auto_init_description = Simulan ang kasaysayan ng Git gamit ang README at opsyonal na magdagdag ng mga lisensya at .gitignore na file.
|
||||
issues.reaction.add = Magdagdag ng reaksyon
|
||||
issues.reaction.alt_few = Nag-react si %[1]s ng %[2]s.
|
||||
issues.reaction.alt_many = Sina %[1]s at %[2]d pang iba ay nag-react ng %[3]s.
|
||||
issues.reaction.alt_remove = Magtanggal ng %[1]s reaksyon mula sa komento.
|
||||
issues.reaction.alt_add = Magdagdag ng %[1]s reaksyon sa komento.
|
||||
issues.context.menu = Menu ng komento
|
||||
summary_card_alt = Pangkalahatang-ideyang card ng repositoryo na %s
|
||||
release.summary_card_alt = Pangkalahatang-ideyang card ng isang release na nakapamagat na "%s" sa repositoryo na %s
|
||||
|
||||
[search]
|
||||
commit_kind = Maghanap ng mga commit…
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
[common]
|
||||
home=Accueil
|
||||
dashboard=Tableau de bord
|
||||
explore=Explorateur
|
||||
explore=Explorer
|
||||
help=Aide
|
||||
logo=Logo
|
||||
sign_in=Connexion
|
||||
|
@ -165,6 +165,7 @@ error413 = Votre quota est épuisé.
|
|||
new_repo.title = Nouveau dépôt
|
||||
new_migrate.link = Nouvelle migration
|
||||
new_org.link = Nouvelle organisation
|
||||
copy_path = Copier le chemin
|
||||
|
||||
[aria]
|
||||
navbar=Barre de navigation
|
||||
|
@ -519,7 +520,7 @@ issue.action.force_push=<b>%[1]s</b> a forcé <b>%[2]s</b> de %[3]s vers %[4]s.
|
|||
issue.action.push_1=<b>@%[1]s</b> a soumis %[3]d révision sur %[2]s
|
||||
issue.action.push_n=<b>@%[1]s</b> a soumis %[3]d révisions sur %[2]s
|
||||
issue.action.close=<b>@%[1]s</b> a fermé #%[2]d.
|
||||
issue.action.reopen=<b>@%[1]s</b> a réouvert #%[2]d.
|
||||
issue.action.reopen=<b>@%[1]s</b> a rouvert #%[2]d.
|
||||
issue.action.merge=<b>@%[1]s</b> a fusionné de #%[2]d vers %[3]s.
|
||||
issue.action.approve=<b>@%[1]s</b> a approuvé cette demande d'ajout.
|
||||
issue.action.reject=<b>@%[1]s</b> a demandé des modifications sur cette demande d'ajout.
|
||||
|
@ -744,9 +745,9 @@ uid=UID
|
|||
webauthn=Clés de sécurité à deux facteurs
|
||||
|
||||
public_profile=Profil public
|
||||
biography_placeholder=Parlez-nous un peu de vous ! (Markdown est interprété)
|
||||
biography_placeholder=Parlez-nous un peu de vous ! (Markdown est supporté)
|
||||
location_placeholder=Partagez votre position approximative avec d'autres personnes
|
||||
profile_desc=Contrôlez comment votre profil est affiché aux autres utilisateurs. Votre adresse courriel principale sera utilisée pour les notifications, la récupération de mot de passe et les opérations Git basées sur le Web.
|
||||
profile_desc=À propos de vous
|
||||
password_username_disabled=Les utilisateurs externes ne sont pas autorisés à modifier leur nom d'utilisateur. Veuillez contacter l'administrateur de votre site pour plus de détails.
|
||||
full_name=Nom complet
|
||||
website=Site Web
|
||||
|
@ -811,7 +812,7 @@ manage_emails=Gérer les adresses courriels
|
|||
manage_themes=Thème par défaut
|
||||
manage_openid=Adresses OpenID
|
||||
email_desc=Votre adresse courriel principale sera utilisée pour les notifications, la récupération de mot de passe et, à condition qu'elle ne soit pas cachée, les opérations Git basées sur le Web.
|
||||
theme_desc=Ce sera votre thème par défaut sur le site.
|
||||
theme_desc=Ce thème sera utilisé pour l'interface web lorsque vous êtes authentifié.
|
||||
primary=Principale
|
||||
activated=Activé
|
||||
requires_activation=Nécessite une activation
|
||||
|
@ -837,7 +838,7 @@ add_email_success=La nouvelle adresse e-mail a été ajoutée.
|
|||
email_preference_set_success=L'e-mail de préférence a été défini avec succès.
|
||||
add_openid_success=La nouvelle adresse OpenID a été ajoutée.
|
||||
keep_email_private=Cacher l'adresse courriel
|
||||
keep_email_private_popup=Ceci masquera votre adresse courriel de votre profil. Elle ne sera plus la valeur par défaut pour les commits créés par l'interface web, tel que des ajouts de fichiers ou des éditions, et ne sera pas utilisée pour fusionner les commits. Un courriel special %s peut être utilisé pour établir la relation entre des commits et votre compte. Notez que changer cette option n'aura pas d'effet sur les commits existants.
|
||||
keep_email_private_popup=Ceci masquera votre adresse courriel de votre profil. Elle ne sera plus la valeur par défaut pour les commits créés par l'interface web, tel que des ajouts de fichiers ou des éditions, et ne sera pas utilisée pour fusionner les commits. Un courriel special %s peut être utilisé pour établir la relation entre des commits et votre compte. Cette option n'aura pas d'effet sur les commits existants.
|
||||
openid_desc=OpenID vous permet de confier l'authentification à une tierce partie.
|
||||
|
||||
manage_ssh_keys=Gérer les clés SSH
|
||||
|
@ -1053,9 +1054,12 @@ language.title = Langue par défaut
|
|||
keep_activity_private.description = Vous seul pourrez voir votre <a href="%s">activité publique</a>, ainsi que les administrateurs de l'instance.
|
||||
language.localization_project = Aidez-nous à traduire Forgejo dans votre langue ! <a href="%s">En savoir plus</a>.
|
||||
language.description = Cette langue sera enregistrée dans votre compte et utilisée comme langue par défaut après votre connexion.
|
||||
user_block_yourself = Vous ne pouvez pas vous bloquer vous même.
|
||||
|
||||
pronouns_custom_label = Pronoms personnalisés
|
||||
|
||||
[repo]
|
||||
new_repo_helper=Un dépôt contient tous les fichiers d’un projet, ainsi que l’historique de leurs modifications. Vous avez déjà ça ailleurs ? <a href="%s">Migrez-le ici.</a>
|
||||
new_repo_helper=Un dépôt contient tous les fichiers d’un projet, ainsi que l’historique de leurs modifications. Vous avez déjà ça ailleurs ? <a href="%s">Migrez-le ici.</a>.
|
||||
owner=Propriétaire
|
||||
owner_helper=Certaines organisations peuvent ne pas apparaître dans la liste déroulante en raison d'une limite maximale du nombre de dépôts.
|
||||
repo_name=Nom du dépôt
|
||||
|
@ -1095,11 +1099,11 @@ issue_labels=Étiquettes
|
|||
issue_labels_helper=Sélectionner un jeu d'étiquettes
|
||||
license=Licence
|
||||
license_helper=Sélectionner une licence
|
||||
license_helper_desc=Une licence réglemente ce que les autres peuvent ou ne peuvent pas faire avec votre code. Vous ne savez pas laquelle est la bonne pour votre projet ? Comment <a target="_blank" rel="noopener noreferrer" href="%s">choisir une licence.</a>
|
||||
license_helper_desc=Une licence réglemente ce que les autres peuvent ou ne peuvent pas faire avec votre code. Vous ne savez pas laquelle est la bonne pour votre projet ? Comment <a target="_blank" rel="noopener noreferrer" href="%s">choisir une licence.</a>.
|
||||
readme=LISEZMOI
|
||||
readme_helper=Choisissez un modèle de fichier LISEZMOI
|
||||
readme_helper_desc=Le README est l'endroit idéal pour décrire votre projet et accueillir des contributeurs.
|
||||
auto_init=Initialiser le dépôt (avec un .gitignore, une Licence et un README.md)
|
||||
auto_init=Initialiser le dépôt
|
||||
trust_model_helper=Choisissez, parmi les éléments suivants, les règles de confiance des signatures paraphant les révisions :
|
||||
trust_model_helper_collaborator=Collaborateur : ne se fier qu'aux signatures des collaborateurs du dépôt
|
||||
trust_model_helper_committer=Auteur : ne se fier qu'aux signatures des auteurs de révisions
|
||||
|
@ -1617,7 +1621,7 @@ issues.reopen_issue=Rouvrir
|
|||
issues.reopen_comment_issue=Réouvrir avec le commentaire
|
||||
issues.create_comment=Commenter
|
||||
issues.closed_at=`a fermé ce ticket <a id="%[1]s" href="#%[1]s">%[2]s</a>.`
|
||||
issues.reopened_at=`a réouvert ce ticket <a id="%[1]s" href="#%[1]s">%[2]s</a>.`
|
||||
issues.reopened_at=`a rouvert ce ticket <a id="%[1]s" href="#%[1]s">%[2]s</a>.`
|
||||
issues.commit_ref_at=`a référencé ce ticket depuis une révision <a id="%[1]s" href="#%[1]s"> %[2]s</a>.`
|
||||
issues.ref_issue_from=`<a href="%[3]s">a fait référence à %[4]s</a> ce ticket <a id="%[1]s" href="#%[1]s">%[2]s</a>.`
|
||||
issues.ref_pull_from=`<a href="%[3]s">a fait référence</a> à cette demande d'ajout %[4]s <a id="%[1]s" href="#%[1]s">%[2]s</a>.`
|
||||
|
@ -1777,7 +1781,7 @@ issues.review.approve=a approuvé ces modifications %s
|
|||
issues.review.comment=a évalué cette demande d’ajout %s
|
||||
issues.review.dismissed=a révoqué l’évaluation de %s %s
|
||||
issues.review.dismissed_label=Révoquée
|
||||
issues.review.left_comment=laisser un commentaire
|
||||
issues.review.left_comment=a laissé un commentaire
|
||||
issues.review.content.empty=Vous devez laisser un commentaire indiquant le(s) changement(s) demandé(s).
|
||||
issues.review.reject=a requis les changements %s
|
||||
issues.review.wait=a été sollicité pour évaluer cette demande d’ajout %s
|
||||
|
@ -2508,7 +2512,7 @@ settings.archive.error=Une erreur s'est produite lors de l'archivage du dépôt.
|
|||
settings.archive.error_ismirror=Vous ne pouvez pas archiver un dépôt en miroir.
|
||||
settings.archive.branchsettings_unavailable=Le paramétrage des branches n'est pas disponible quand le dépôt est archivé.
|
||||
settings.archive.tagsettings_unavailable=Le paramétrage des étiquettes n'est pas disponible si le dépôt est archivé.
|
||||
settings.archive.mirrors_unavailable = Les mirroirs ne sont pas disponibles si le dépôt a été archivé.
|
||||
settings.archive.mirrors_unavailable = Les miroirs ne sont pas disponibles si le dépôt a été archivé.
|
||||
settings.unarchive.button=Désarchiver ce dépôt
|
||||
settings.unarchive.header=Réhabiliter ce dépôt
|
||||
settings.unarchive.text=Réhabiliter un dépôt dégèle les actions de révisions et de soumissions, la gestion des tickets et des demandes d'ajouts.
|
||||
|
@ -2844,6 +2848,25 @@ diff.git-notes.remove-body = Cette note sera supprimée.
|
|||
diff.git-notes.add = Ajouter une note
|
||||
diff.git-notes.remove-header = Supprimer la note
|
||||
issues.summary_card_alt = Fiche de synthèse d'un ticket nommé "%s" dans le dépôt %s
|
||||
editor.add_tmpl.filename = fichier
|
||||
issues.num_reviews_one = %d revue
|
||||
issues.num_reviews_few = %d revues
|
||||
settings.default_update_style_desc = Style de mise à jour des demandes de fusion qui sont en retard par rapport à la branche de base.
|
||||
|
||||
new_from_template = Utiliser un modèle
|
||||
new_from_template_description = Vous pouvez sélectionner un modèle de dépôt existant sur cette instance et appliquer ses paramètres.
|
||||
new_advanced = Options avancées
|
||||
new_advanced_expand = Cliquer pour développer
|
||||
auto_init_description = Débuter l'historique Git avec un README et ajouter en option les fichier de licence et .gitignore.
|
||||
summary_card_alt = Carte résumé du dépôt %s
|
||||
issues.reaction.add = Ajouter une réaction
|
||||
issues.reaction.alt_few = %[1]s a réagit %[2]s.
|
||||
issues.reaction.alt_many = %[1]s et %[2]d de plus ont réagit %[3]s.
|
||||
issues.reaction.alt_remove = Enlever la réaction %[1]s du commentaire.
|
||||
issues.reaction.alt_add = Ajouter la réaction %[1]s du commentaire.
|
||||
issues.context.menu = Menu commentaire
|
||||
pulls.sign_in_require = <a href="%s">Identifiez vous</a> pour créer une nouvelle demande d'ajout.
|
||||
release.summary_card_alt = Carte résumé de la publication dont le titre est "%s" dans le dépôt %s
|
||||
|
||||
[graphs]
|
||||
component_loading = Chargement %s...
|
||||
|
@ -3545,10 +3568,10 @@ rename_repo=a rebaptisé le dépôt <code>%[1]s</code> en <a href="%[2]s">%[3]s<
|
|||
commit_repo=a soumis sur <a href="%[2]s">%[3]s</a> dans <a href="%[1]s">%[4]s</a>
|
||||
create_issue=`a ouvert le ticket <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||
close_issue=`a fermé le ticket <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||
reopen_issue=`a réouvert le ticket <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||
reopen_issue=`a rouvert le ticket <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||
create_pull_request=`a créé la demande d’ajout <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||
close_pull_request=`a fermé la demande d’ajout <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||
reopen_pull_request=`a réouvert la demande d’ajout <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||
reopen_pull_request=`a rouvert la demande d’ajout <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||
comment_issue=`a commenté le ticket <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||
comment_pull=`a commenté la demande d’ajout <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||
merge_pull_request=`a fusionné la demande d’ajout <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||
|
@ -3662,7 +3685,7 @@ alpine.registry=Configurez ce registre en ajoutant l’URL dans votre fichier <c
|
|||
alpine.registry.key=Téléchargez la clé RSA publique du registre dans le dossier <code>/etc/apk/keys/</code> pour vérifier la signature de l'index :
|
||||
alpine.registry.info=Choisissez $branch et $repository dans la liste ci-dessous.
|
||||
alpine.install=Pour installer le paquet, exécutez la commande suivante :
|
||||
alpine.repository=Informations sur le Dépôt
|
||||
alpine.repository=Informations sur le dépôt
|
||||
alpine.repository.branches=Branches
|
||||
alpine.repository.repositories=Dépôts
|
||||
alpine.repository.architectures=Architectures
|
||||
|
@ -3682,7 +3705,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 +3716,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 +3820,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
|
||||
|
@ -3945,7 +3969,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...
|
||||
|
|
|
@ -3221,7 +3221,7 @@ auths.tip.google_plus=Ottieni le credenziali del client OAuth2 dalla console API
|
|||
auths.tip.openid_connect=Utilizza l'OpenID Connect Discovery URL (<server>/.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
|
||||
|
|
|
@ -128,7 +128,7 @@ copy_success = 복사되었습니다!
|
|||
copy_error = 복사 실패
|
||||
copy_type_unsupported = 이 파일 형식은 복사할 수 없습니다
|
||||
error = 오류
|
||||
error404 = 도달하려는 페이지가 <strong>존재하지 않거나</strong> 볼 수 있도록 <strong>인증되지 않았습니다</strong>.
|
||||
error404 = 도달하려는 페이지가 <strong>존재하지 않거나</strong> 볼 수 있는 <strong>권한이 없습니다</strong>.
|
||||
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의 버그라고 생각한다면, <a href="%s" target="_blank">Codeberg</a> 에서 이슈를 검색하거나 필요하다면 새 이슈를 만들어주세요.
|
||||
not_found = 타겟을 찾을 수 없습니다.
|
||||
|
||||
[startpage]
|
||||
app_desc=편리한 설치형 Git 서비스
|
||||
install=쉬운 설치
|
||||
|
@ -198,6 +227,11 @@ platform=크로스 플랫폼
|
|||
lightweight=가벼움
|
||||
license=오픈 소스
|
||||
|
||||
install_desc = 간단히 당신의 기기에서<a target="_blank" rel="noopener noreferrer" href="%[1]s">바이너리를 실행하거나</a>, <a target="_blank" rel="noopener noreferrer" href="%[2]s">Docker</a>를 사용하거나, <a target="_blank" rel="noopener noreferrer" href="%[3]s">패키지 저장소</a>에서 설치할 수 있습니다.
|
||||
platform_desc = Forgejo는 Linux와 FreeBSD등의 자유 오픈소스 운영 체제를 포함한 다양한 CPU 아키텍처에서 실행됩니다. 마음 가는대로 고르세요!
|
||||
lightweight_desc = Forgejo의 낮은 전력 소모량은 값싼 Raspberry Pi마저 구동할 수 있게 합니다. 기기의 에너지를 절약하세요!
|
||||
license_desc = <a target="_blank" rel="noopener noreferrer" href="%[1]s">Forgejo</a>를 설치해보세요! Forgejo를 개선하기 위해 <a target="_blank" rel="noopener noreferrer" href="%[2]s">기여</a>할 수 있습니다. 기여자가 되기를 망설이지 마세요!
|
||||
|
||||
[install]
|
||||
install=설치
|
||||
title=초기 설정
|
||||
|
@ -205,7 +239,7 @@ docker_helper=Forgejo를 Docker에서 실행하려면 설정 전에 이 <a targe
|
|||
db_title=데이터베이스 설정
|
||||
db_type=데이터베이스 유형
|
||||
host=호스트
|
||||
user=이름
|
||||
user=사용자명
|
||||
password=비밀번호
|
||||
db_name=데이터베이스 이름
|
||||
db_schema=스키마
|
||||
|
@ -216,8 +250,8 @@ err_empty_db_path=SQLite3 데이터베이스 경로는 필수 입력 값입니
|
|||
no_admin_and_disable_registration=관리자 계정을 만들지 않고 등록을 비활성화할 수 없습니다.
|
||||
err_empty_admin_password=관리자 비밀번호는 비어 있을 수 없습니다.
|
||||
err_empty_admin_email=관리자 이메일은 비어 있을 수 없습니다.
|
||||
err_admin_name_is_reserved=관리자 사용자 이름이 올바르지 않습니다, 제한된 사용자 이름입니다
|
||||
err_admin_name_is_invalid=관리자 사용자 이름이 올바르지 않습니다
|
||||
err_admin_name_is_reserved=관리자의 사용자명이 올바르지 않음, 이미 사용된 사용자명임
|
||||
err_admin_name_is_invalid=관리자의 사용자명이 올바르지 않음
|
||||
|
||||
general_title=기본설정
|
||||
app_name=인스턴스 제목
|
||||
|
@ -226,7 +260,7 @@ repo_path=저장소 최상위 경로
|
|||
repo_path_helper=Git 원격 저장소는 이 디렉터리에 저장 됩니다.
|
||||
lfs_path=Git LFS 루트 경로
|
||||
lfs_path_helper=Git LFS에 저장된 파일들은 이 디렉토리에 저장됩니다. LFS를 사용하지 않는다면 빈칸으로 남겨주세요.
|
||||
run_user=다음 사용자로 실행
|
||||
run_user=실행 사용자명
|
||||
ssh_port=SSH 서버 포트
|
||||
ssh_port_helper=SSH 서버를 실행할 포트를 입력하세요. 비워둘 경우 SSH를 사용하지 않습니다.
|
||||
http_port=HTTP 수신 포트
|
||||
|
@ -242,7 +276,7 @@ smtp_addr=SMTP 호스트
|
|||
smtp_port=SMTP 포트
|
||||
smtp_from=이메일 발신인
|
||||
smtp_from_helper=Forgejo 가 사용할 이메일 주소. 이메일 주소 또는 "이름" <email@example.com> 형식으로 입력하세요.
|
||||
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=확인 메일이 <b>%s</b>로 전송되었습니다. 받은 편지함으로 도착한 메일을 %s 안에 확인해서 비밀번호 찾기 절차를 완료하십시오.
|
||||
active_your_account=계정 활성화
|
||||
account_activated=계정이 활성화 되었습니다
|
||||
prohibit_login =
|
||||
prohibit_login =
|
||||
resent_limit_prompt=활성화를 위한 이메일을 이미 전송했습니다. 3분 내로 이메일을 받지 못한 경우 재시도해주세요.
|
||||
has_unconfirmed_mail=안녕하세요 %s, 이메일 주소(<b>%s</b>)가 확인되지 않았습니다. 확인 메일을 받으시지 못하겼거나 새로운 확인 메일이 필요하다면, 아래 버튼을 클릭해 재발송하실 수 있습니다.
|
||||
resend_mail=여기를 눌러 확인 메일 재전송
|
||||
|
@ -402,6 +447,8 @@ issue.action.new = <b>@%[1]s</b>님이 #%[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 = <code>{user}</code>, <code>{repo}</code> and <code>{index}</code>를 사용자 이름, 저장소 이름, 이슈 번호로 사용할 수 있습니다.
|
||||
settings.tracker_url_format_desc = <code>{user}</code>를 사용자명, <code>{repo}</code>를 저장소명, <code>{index}</code>를 이슈 번호로 사용할 수 있습니다.
|
||||
projects = 프로젝트
|
||||
projects.desc = 이슈와 풀 리퀘스트를 프로젝트에서 관리합니다.
|
||||
projects.create = 프로젝트 만들기
|
||||
|
@ -1366,11 +1424,22 @@ pulls.merged_title_desc_one = 님이 <code>%[2]s</code> 에서 <code>%[3]s</code
|
|||
|
||||
|
||||
|
||||
mirror_password_help = 사용자명을 변경해 저장된 비밀번호를 지우세요.
|
||||
adopt_search = 사용자명을 입력해 소유자가 누락된 저장소를 검색... (모두 찾으려면 비워두기)
|
||||
form.name_reserved = "%s" 저장소명이 예약되어 있습니다.
|
||||
form.name_pattern_not_allowed = "%s" 패턴이 저장소명으로 사용할 수 없습니다.
|
||||
issues.start_tracking_short = 타이머 시작
|
||||
issues.tracking_already_started = `당신은 이미 <a href="%s">다른 이슈</a>에서 시간을 기록중입니다!`
|
||||
issues.stop_tracking = 타이머 정지
|
||||
issues.cancel_tracking_history = `취소된 시간 기록 %s`
|
||||
settings.enter_repo_name = 표시된 소유자와 저장소명을 정확하게 입력하세요:
|
||||
settings.packagist_username = Packagist 사용자명
|
||||
|
||||
[graphs]
|
||||
|
||||
[org]
|
||||
org_name_holder=조직 이름
|
||||
org_full_name_holder=조직 전체 이름
|
||||
org_full_name_holder=조직 별명
|
||||
create_org=새로운 조직
|
||||
repo_updated=업데이트됨 %s
|
||||
members=멤버
|
||||
|
@ -1407,7 +1476,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 +1501,8 @@ teams.search_repo_placeholder=저장소 찾기...
|
|||
teams.add_duplicate_users=사용자가 이미 팀 멤버입니다.
|
||||
teams.members.none=이 팀에 멤버가 없습니다.
|
||||
|
||||
form.name_pattern_not_allowed = "%s" 패턴이 조직명으로 사용할 수 없습니다.
|
||||
|
||||
[admin]
|
||||
dashboard=대시보드
|
||||
users=사용자 계정
|
||||
|
@ -1631,9 +1702,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 +1713,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 +1802,13 @@ 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 = 사용자들이 마침표를 사용자명에 사용할 수 있도록 허가합니다. 이미 존재하는 계정에는 영향을 주지 않습니다.
|
||||
|
||||
[action]
|
||||
create_repo=저장소를 만들었습니다. <a href="%s">%s</a>
|
||||
rename_repo=저장소 이름을 <code>%[1]s에서</code>에서 <a href="%[2]s"> %[3]s</a>으로 변경함
|
||||
|
@ -1838,4 +1916,11 @@ package_kind = 패키지 검색...
|
|||
project_kind = 프로젝트 검색...
|
||||
exact_tooltip = 검색어와 정확하게 일치하는 결과만 포함
|
||||
issue_kind = 이슈 검색...
|
||||
pull_kind = 풀 검색...
|
||||
pull_kind = 풀 검색...
|
||||
fuzzy = 모호함
|
||||
union = 통합 검색
|
||||
union_tooltip = 공백으로 구분된 키워드 중 하나라도 일치하는 결과를 포함하세요
|
||||
exact = 정확한
|
||||
regexp = 정규 표현식
|
||||
regexp_tooltip = 검색어를 정규 표현식으로 해석합니다
|
||||
milestone_kind = 마일스톤 검색...
|
File diff suppressed because it is too large
Load diff
|
@ -124,12 +124,27 @@ sign_up = Opprett konto
|
|||
confirm_delete_artifact = Er du sikker på at du vil slette artefakten "%s" ?
|
||||
webauthn_sign_in = Trykk på knappen på sikkerhetsnøkkelen din. Dersom nøkkelen din ikke har en knapp, sett den inn på nytt.
|
||||
|
||||
webauthn_error_unable_to_process = Tjeneren kunne ikke behandle forespørselen din.
|
||||
webauthn_error_empty = Du må gi nøkkelen et navn.
|
||||
copy_path = Kopier sti
|
||||
|
||||
[search]
|
||||
search = Søk...
|
||||
type_tooltip = Søketype
|
||||
fuzzy = Fuzzy
|
||||
union = Union
|
||||
|
||||
exact = Nøyaktig
|
||||
regexp = RegExp
|
||||
|
||||
[auth]
|
||||
verify = Bekreft
|
||||
sign_up_button = Opprett konto nå.
|
||||
sign_up_button = Opprett konto nå.
|
||||
change_unconfirmed_email_error = Kan ikke endre e-postadresse: %v
|
||||
login_userpass = Logg inn
|
||||
oauth_signup_tab = Registrer ny konto
|
||||
oauth_signup_title = Fullfør ny konto
|
||||
oauth_signup_submit = Fullfør konto
|
||||
|
||||
[home]
|
||||
uname_holder = Brukernavn eller e-postadresse
|
|
@ -833,7 +833,7 @@ confirm_delete_account = Lösken utwiesen
|
|||
email_notifications.disable = Nich över E-Mail benarichtigen
|
||||
visibility.public_tooltip = Elkeen kann ’t sehen
|
||||
password_username_disabled = Frömde Brukers könen hör Brukernaam nich ännern. Bidde kuntakteer dienen Sied-Chef för mehr Informatioonen.
|
||||
profile_desc = Richt in, wo dien Profil to anner Brukers wiest word. Diene Höövd-E-Mail-Adress word för Narichtens, Passwoord-Torügghalen un Git-Aktioonen över ’t Internett bruukt.
|
||||
profile_desc = Över di
|
||||
hidden_comment_types_description = Kommentaar-Arden, wat hier utköört sünd, worden in Gefall-Sieden nich wiest. Wenn du to’n Bispööl »Vermark« utköörst, worden all de »›Bruker‹ hett ›Vermark‹ hentoföögt/wegdaan«-Kommentaren wegdaan.
|
||||
email_desc = Diene Höövd-E-Mail-Adress word för Narichtens, Passwoord-Torügghalen un, wenn se nich verburgen is, Git-Aktioonen över ’t Internett bruukt.
|
||||
can_not_add_email_activations_pending = Een Aktiveren staht noch ut. Wenn du eene neje E-Mail-Adress hentofögen willst, versöök dat in een paar Menüten noch eenmaal.
|
||||
|
@ -841,7 +841,7 @@ email_deletion_desc = De E-Mail-Adress un daarmit verbunnen Informatioon word ut
|
|||
principal_desc = Deese SSH-Zertifikaat-Höövdmannen sünd mit dienem Konto verbunnen un geven kumpleten Togriep up diene Repositoriums.
|
||||
add_email_confirmation_sent = Eene Utwiesens-E-Mail is an »%s« schickt worden. Um diene E-Mail-Adress uttowiesen, kiek bidde in dienen E-Mail-Ingang un folg de Verwies daarin in de anner %s.
|
||||
ssh_desc = Deese publiken SSH-Slötels sünd mit dienem Konto verbunnen. De tohörig privaate Slötel gifft kumpleten Togriep up diene Repositoriums. SSH-Slötels, wat utwiest worden sünd, könen bruukt worden, um SSH-unnerschreven Git-Kommitterens uttowiesen.
|
||||
keep_email_private_popup = Dat word diene E-Mail-Adress vun dienem Profil verbargen. Dann is dat nich mehr de Normaalweert för Kommitterens, wat du över de Internett-Schnittstee maakst, so as Datei-Upladens un Bewarkens, un word nich in Tosamenföhrens-Kommitterens bruukt. In Stee daarvun kann eene besünnere Adress %s bruukt worden, um Kommitterens mit dienem Konto to verbinnen. Wees wiss, dat dat Ännern vun deeser Instellen bestahn Kommitterens nich ännert.
|
||||
keep_email_private_popup = Diene E-Mail-Adress word vun dienem Profil verbargen un is nich de Normaalweert för Kommitterens, wat du över de Internett-Schnittstee maakst, so as Datei-Upladens, Bewarkens un Tosamenföhrens-Kommitterens. In Stee daarvun kann eene besünnere Adress %s bruukt worden, um Kommitterens mit dienem Konto to verbinnen. Deese Instellen ännert keene bestahn Kommitterens.
|
||||
ssh_helper = <strong>Bruukst du Hülp?</strong> Kiek de Inföhren an, wo du <a href="%s">diene eegenen SSH-Slötels maakst</a> of hülp <a href="%s">gewohnten Probleemen</a> of, över wat man mit SSH mennigmaal strukelt.
|
||||
access_token_desc = Utköört Teken-Verlöövnissen begrenzen dat Anmellen blots up de tohörig <a href="%[1]s" target="_blank">API</a>-Padden. Lees de <a href="%[2]s" target="_blank">Dokumenteren</a> för mehr Informatioonen.
|
||||
oauth2_confidential_client = Diskreeter Klient. Köör dat för Programmen ut, wat dat Geheemst diskreet behanneln, as Internett-Sieden. Köör dat nich för stedenwies Programmen ut, as Schrievdisk- un Telefoon-Programmens.
|
||||
|
@ -851,6 +851,8 @@ oauth2_application_locked = Forgejo vermarkt vörweg eenige OAuth2-Programmen bi
|
|||
twofa_desc = Um dien Konto tegen Passwoordklau to schütten, kannst du een Smart-Telefoon of anner Geraadskupp bruken, um tied-baseerte Eenmaalpasswoorden (»TOTP«) to kriegen.
|
||||
twofa_recovery_tip = Wenn du dien Geraadskupp verlüst, kannst du eenen Eenmaal-Bruuk-Torügghalens-Slötel bruken, um weer in dien Konto to komen.
|
||||
webauthn_desc = Sekerheids-Slötels sünd Geraadskuppen, wat kryptographisk Slötels enthollen. Se könen för dat Anmellen mit Twee Faktooren bruukt worden. Sekerheids-Slötels mutten de »<a rel="noreferrer" target="_blank" href="%s">WebAuthn Authenticator</a>«-Standard unnerstütten.
|
||||
user_block_yourself = Du kannst di nich sülvst blockeren.
|
||||
pronouns_custom_label = Eegene Pronomens
|
||||
|
||||
[repo]
|
||||
rss.must_be_on_branch = Du muttst up eenem Twieg wesen, um eenen RSS-Schuuv to hebben.
|
||||
|
@ -914,7 +916,7 @@ mirror_interval = Tiedofstand för ’t Spegeln (gültige Tied-Eenheiden sünd
|
|||
issue_labels = Vermarkens
|
||||
issue_labels_helper = Köör eene Vermarkens-Sammlung ut
|
||||
license = Lizenz
|
||||
auto_init = Repositorium inrichten (Föögt .gitignore, Lizenz un LEESMI hento)
|
||||
auto_init = Repositorium inrichten
|
||||
mirror_sync_on_commit = Spegeln, wenn Kommitterens schuuvt worden
|
||||
repo_gitignore_helper_desc = Köör ut eener List vun Vörlagen för bekannte Spraken ut, welke Dateien nich verfolgt worden. Normaale Objekten, wat vun de Bauwarktüüg vun elkeen Spraak utgeven worden, sünd in deeser .gitignore dann al enthollen.
|
||||
default_branch = Höövd-Twieg
|
||||
|
@ -2548,6 +2550,21 @@ diff.git-notes.remove-body = Deeses Anmarken word wegdaan.
|
|||
issues.num_reviews_one = %d Nakieken
|
||||
issues.summary_card_alt = Tosamenfatens-Kaart vun eenem Gefall mit de Naam »%s« im Repositorium %s
|
||||
issues.num_reviews_few = %d Nakiekens
|
||||
settings.default_update_style_desc = Normaale Vernejens-Aard, wat bruukt word, um Haalvörslagens to vernejen, wat achter de Grund-Twieg torügg sünd.
|
||||
pulls.sign_in_require = <a href="%s">Mell di an</a>, um eenen nejen Haalvörslag to maken.
|
||||
new_from_template = Bruuk eene Vörlaag
|
||||
new_advanced = Mehr Instellens
|
||||
new_advanced_expand = Klick, um mehr to wiesen
|
||||
auto_init_description = Begünn de Git-Histoorje mit eenem LEESMI un föög, wenn du willst, Lizenz- un .gitignore-Dateien hento.
|
||||
new_from_template_description = Du kannst eene bestahn Repositoriums-Vörlaag up deeser Instanz utkören un hör Instellens anwennen.
|
||||
summary_card_alt = Tosamenfatens-Kaart vun de Repositorium %s
|
||||
issues.reaction.alt_add = De %[1]s-Reageren to de Kommentaar hentofögen.
|
||||
issues.reaction.add = Reageren hentofögen
|
||||
issues.reaction.alt_few = %[1]s hett mit %[2]s reageert.
|
||||
issues.reaction.alt_many = %[1]s un %[2]d anner hebben mit %[3]s reageert.
|
||||
issues.reaction.alt_remove = De %[1]s-Reageren vun de Kommentaar wegdoon.
|
||||
issues.context.menu = Kommentaar-Menü
|
||||
release.summary_card_alt = Tosamenfatens-Kaart vun eenem Publizeren mit de Naam »%s« im Repositorium %s
|
||||
|
||||
[repo.permissions]
|
||||
code.read = <b>Lesen:</b> De Quelltext vun deesem Repositorium ankieken un klonen.
|
||||
|
|
|
@ -555,7 +555,7 @@ team_invite.text_2 = Klik alstublieft op de volgende link om aan het team deel t
|
|||
admin.new_user.text = <a href="%s">Klik hier</a> om deze gebruiker te beheren vanuit het beheerderspaneel.
|
||||
password_change.subject = Uw wachtwoord is gewijzigd
|
||||
password_change.text_1 = Het wachtwoord voor je account is zojuist gewijzigd.
|
||||
reset_password.text_1 =
|
||||
reset_password.text_1 =
|
||||
totp_disabled.subject = TOTP is uitgeschakeld
|
||||
primary_mail_change.subject = Uw primaire e-mail is gewijzigd
|
||||
totp_disabled.no_2fa = Er zijn geen andere 2FA methodes meer geconfigureerd, wat betekent dat het niet langer nodig is om in te loggen op uw account met 2FA.
|
||||
|
@ -800,7 +800,7 @@ emails=E-mailadressen
|
|||
manage_emails=E-mailadressen beheren
|
||||
manage_themes=Standaardthema
|
||||
manage_openid=OpenID-adressen
|
||||
theme_desc=Dit zal het standaardthema worden op de gehele site.
|
||||
theme_desc=Dit thema wordt gebruikt voor de webinterface wanneer je bent aangemeld.
|
||||
primary=Primair
|
||||
activated=Geactiveerd
|
||||
requires_activation=Vereist activering
|
||||
|
@ -987,7 +987,7 @@ visibility.private=Privé
|
|||
blocked_users = Geblokkeerde gebruikers
|
||||
uid = UID
|
||||
biography_placeholder = Vertel anderen een beetje over uzelf! (Markdown is ondersteund)
|
||||
profile_desc = Controleer hoe uw profiel aan andere gebruikers wordt getoond. Uw primaire e-mailadres zal worden gebruikt voor notificaties, wachtwoord herstel en web-gebaseerde Git-operaties.
|
||||
profile_desc = Over u
|
||||
update_language_not_found = Taal "%s" is niet beschikbaar.
|
||||
change_username_prompt = Opmerking: Het veranderen van uw gebruikersnaam zal ook de URL van uw account veranderen.
|
||||
change_username_redirect_prompt = De oude gebruikersnaam zal worden doorverwezen totdat iemand deze opeist.
|
||||
|
@ -1020,7 +1020,7 @@ at_least_one_permission = Je moet minstens één machtiging kiezen om een token
|
|||
permission_write = Lees en schrijf
|
||||
oauth2_client_secret_hint = Dit geheim zal niet meer worden getoond nadat u deze pagina heeft verlaten of vernieuwd. Zorg ervoor dat u het heeft opgeslagen.
|
||||
revoke_oauth2_grant_success = Toegang succesvol ingetrokken.
|
||||
keep_email_private_popup = Dit zal je e-mailadres verbergen van uw profielpagina. Het zal niet langer de standaard zijn voor commits die via de webinterface gemaakt worden, zoals bestandsuploads en bewerkingen, en het zal niet gebruikt worden voor samenvoeg commits. In plaats daarvan kan een speciaal adres %s gebruikt worden om commits met je account te associëren. Merk op dat het veranderen van deze optie geen effect heeft op bestaande commits.
|
||||
keep_email_private_popup = Uw e-mailadres zal niet getoond worden op uw profiel en zal niet de standaard zijn voor commits die via de webinterface gemaakt worden, zoals bestandsuploads, bewerkingen en samenvoeg commits. In plaats daarvan kan een speciaal adres %s gebruikt worden om commits aan uw account te koppelen. Deze optie zal bestaande commits niet beïnvloeden.
|
||||
create_oauth2_application_success = U heeft met succes een OAuth2 applicatie gecreëerd.
|
||||
permissions_access_all = Alle (publiek, privé en gelimiteerd)
|
||||
oauth2_application_remove_description = Door een OAuth2-applicatie te verwijderen, krijgt deze geen toegang meer tot geautoriseerde gebruikersaccounts op deze instantie. Doorgaan?
|
||||
|
@ -1056,6 +1056,9 @@ language.title = Standaard taal
|
|||
keep_activity_private.description = Uw <a href="%s">publieke activiteit</a> zal alleen zichtbaar zijn voor u en de beheerders van de instantie.
|
||||
language.description = Deze taal wordt opgeslagen in uw account en wordt als standaardtaal gebruikt nadat u zich heeft aangemeld.
|
||||
language.localization_project = Help ons Forgejo in uw taal te vertalen! <a href="%s">Leer meer</a>.
|
||||
user_block_yourself = U kunt niet zichzelf blokkeren.
|
||||
|
||||
pronouns_custom_label = Aangepaste voornaamwoorden
|
||||
|
||||
[repo]
|
||||
owner=Eigenaar
|
||||
|
@ -1093,11 +1096,11 @@ issue_labels=Labels
|
|||
issue_labels_helper=Selecteer een labelset
|
||||
license=Licentie
|
||||
license_helper=Selecteer een licentie bestand
|
||||
license_helper_desc=Een licentie bepaalt wat anderen wel en niet met je code kunnen doen. Niet zeker welke juist is voor jouw project? Zie <a target="_blank" rel="noopener noreferrer" href="%s">Kies een licentie.</a>
|
||||
license_helper_desc=Een licentie bepaalt wat anderen wel en niet met je code kunnen doen. Niet zeker welke juist is voor jouw project? Zie <a target="_blank" rel="noopener noreferrer" href="%s">Kies een licentie</a>.
|
||||
readme=README
|
||||
readme_helper=Selecteer een README-bestandssjabloon
|
||||
readme_helper_desc=Dit is de plek waar je een volledige beschrijving van je project kunt schrijven.
|
||||
auto_init=Initialiseer repository (voegt .gitignore, License en README toe)
|
||||
auto_init=Initialiseer repository
|
||||
trust_model_helper=Selecteer het vertrouwensmodel voor handtekeningverificatie. Mogelijke opties zijn:
|
||||
trust_model_helper_collaborator=Samenwerker: Vertrouw handtekeningen door samenwerker
|
||||
trust_model_helper_committer=Committer: Vertrouw handtekeningen die overeenkomen met de committers
|
||||
|
@ -2194,8 +2197,8 @@ settings.archive.header=Archiveer deze repo
|
|||
settings.archive.success=De repo is succesvol gearchiveerd.
|
||||
settings.archive.error=Er is een fout opgetreden tijdens het archiveren van de repo. Zie het logboek voor meer informatie.
|
||||
settings.archive.error_ismirror=U kunt geen gespiegelde repository archiveren.
|
||||
settings.archive.branchsettings_unavailable=Branch instellingen zijn niet beschikbaar als de repo is gearchiveerd.
|
||||
settings.archive.tagsettings_unavailable=Labelinstellingen zijn niet beschikbaar als de repo is gearchiveerd.
|
||||
settings.archive.branchsettings_unavailable=Branchinstellingen zijn niet beschikbaar in gearchiveerde repo's.
|
||||
settings.archive.tagsettings_unavailable=Tag-instellingen zijn niet beschikbaar in gearchiveerde repo's.
|
||||
settings.update_avatar_success=De repository avatar is bijgewerkt.
|
||||
settings.lfs=LFS
|
||||
settings.lfs_filelist=LFS bestanden opgeslagen in deze repository
|
||||
|
@ -2408,7 +2411,7 @@ issues.review.option.hide_outdated_comments = Verouderde reacties verbergen
|
|||
pulls.expand_files = Alle bestanden uitklappen
|
||||
pulls.collapse_files = Alle bestanden inklappen
|
||||
pulls.show_all_commits = Alle commits weergeven
|
||||
new_repo_helper = Een repository bevat alle projectbestanden, inclusief revisiegeschiedenis. Host je er al ergens anders een? <a href="%s">Repository migreren.</a>
|
||||
new_repo_helper = Een repository bevat alle projectbestanden, inclusief revisiegeschiedenis. Host je er al ergens anders een? <a href="%s">Repository migreren</a>.
|
||||
editor.fail_to_update_file = Mislukt bij het bijwerken/creëren van bestand "%s".
|
||||
editor.file_is_a_symlink = `"%s" is een symbolische link. Symbolische links kunnen niet worden bewerkt in de webeditor`
|
||||
editor.filename_is_a_directory = Bestandsnaam "%s" wordt al gebruikt als naam van een map in deze repository.
|
||||
|
@ -2610,7 +2613,7 @@ settings.remove_protected_branch_success = Branchbescherming voor regel "%s" is
|
|||
settings.remove_protected_branch_failed = Verwijderen van branchbeschermings regel "%s" is mislukt.
|
||||
settings.merge_style_desc = Samenvoegstijl
|
||||
settings.thread_id = Thread ID
|
||||
settings.archive.mirrors_unavailable = Mirrors zijn niet beschikbaar als de repo is gearchiveerd.
|
||||
settings.archive.mirrors_unavailable = Mirrors zijn niet beschikbaar in gearchiveerde repo's.
|
||||
settings.unarchive.header = Deze repo uit het archief halen
|
||||
settings.unarchive.text = Het uit het archief halen van de repo zal het vermogen herstellen om commits en pushes te ontvangen, evenals nieuwe issues en pull requests.
|
||||
settings.unarchive.error = Er is een fout opgetreden bij het uit het archief halen van de repo. Bekijk de logs voor meer details.
|
||||
|
@ -2846,9 +2849,25 @@ diff.git-notes.remove-body = Deze notitie zal worden verwijderd.
|
|||
issues.summary_card_alt = Overzichtskaart van een issue met de titel "%s" in repository %s
|
||||
issues.num_reviews_one = %d beoordeling
|
||||
issues.num_reviews_few = %d beoordelingen
|
||||
settings.default_update_style_desc = Standaard update stijl gebruikt voor het updaten van pull requests die achter de basis branch liggen.
|
||||
pulls.sign_in_require = <a href="%s">Aanmelden</a> om een nieuwe pull request aan te maken.
|
||||
new_advanced = Geavanceerde instellingen
|
||||
new_advanced_expand = Klik om uit te breiden
|
||||
new_from_template_description = Je kunt een bestaand repositorysjabloon op deze instantie selecteren en de instellingen toepassen.
|
||||
new_from_template = Een sjabloon gebruiken
|
||||
auto_init_description = De Git geschiedenis starten met een README en optioneel License en .gitignore bestanden toevoegen.
|
||||
|
||||
|
||||
|
||||
summary_card_alt = Overzichtskaart van repository %s
|
||||
issues.reaction.add = Reactie toevoegen
|
||||
issues.reaction.alt_few = %[1]s reageerde %[2]s.
|
||||
issues.reaction.alt_many = %[1]s en %[2]d meer gereageerd %[3]s.
|
||||
issues.reaction.alt_remove = Verwijder %[1]s reactie van bericht.
|
||||
issues.reaction.alt_add = Voeg %[1]s reactie toe aan commentaar.
|
||||
issues.context.menu = Commentaar menu
|
||||
release.summary_card_alt = Samenvattende kaart van een release met de titel "%s" in repository %s
|
||||
|
||||
[graphs]
|
||||
component_loading_info = Dit kan even duren…
|
||||
component_failed_to_load = Er is een onverwachte fout opgetreden.
|
||||
|
@ -3666,16 +3685,16 @@ cargo.install = Voer de volgende opdracht uit om het pakket met Cargo te install
|
|||
chef.install = Voer het volgende commando uit om het pakket te installeren:
|
||||
composer.registry = Stel dit register in je <code>~/.composer/config.json</code> bestand:
|
||||
composer.dependencies = Afhankelijkheden
|
||||
composer.dependencies.development = Ontwikkelings Afhankelijkheden
|
||||
composer.dependencies.development = Ontwikkelings afhankelijkheden
|
||||
conan.registry = Stel dit register in vanaf de terminal:
|
||||
conan.install = Voer het volgende commando uit om het pakket met Conan te installeren:
|
||||
conda.registry = Stel dit register in als een Conda repository in je <code>.condarc</code> bestand:
|
||||
container.details.type = Afbeelding Type
|
||||
container.details.type = Afbeelding type
|
||||
container.details.platform = Platform
|
||||
container.pull = Haal de afbeelding op vanaf de terminal:
|
||||
container.digest = Digest
|
||||
container.multi_arch = Besturingssysteem / Arch
|
||||
container.layers = Afbeelding Lagen
|
||||
container.layers = Afbeelding lagen
|
||||
container.labels = Labels
|
||||
container.labels.key = Sleutel
|
||||
debian.repository = Repository informatie
|
||||
|
@ -3697,7 +3716,7 @@ rpm.repository.architectures = Architecturen
|
|||
rpm.repository.multiple_groups = Dit pakket is beschikbaar in meerdere groepen.
|
||||
rubygems.install = Voer het volgende commando uit om het pakket met gem te installeren:
|
||||
rubygems.install2 = of voeg het toe aan het Gemfile:
|
||||
rubygems.dependencies.development = Ontwikkelings Dependencies
|
||||
rubygems.dependencies.development = Ontwikkelings dependencies
|
||||
swift.registry = Stel dit register in vanaf de terminal:
|
||||
swift.install = Voeg het pakket toe in je <code>Package.swift</code> bestand:
|
||||
swift.install2 = en voer het volgende commando uit:
|
||||
|
@ -3715,7 +3734,7 @@ nuget.install = Voer het volgende commando uit om het pakket met NuGet te instal
|
|||
npm.install = Voer het volgende commando uit om het pakket met npm te installeren:
|
||||
npm.install2 = of voeg het toe aan het package.json bestand:
|
||||
npm.dependencies = Afhankelijkheden
|
||||
npm.dependencies.development = Ontwikkelings Afhankelijkheden
|
||||
npm.dependencies.development = Ontwikkelings afhankelijkheden
|
||||
npm.dependencies.peer = Peer afhankelijkheden
|
||||
npm.dependencies.optional = Optionele afhankelijkheden
|
||||
owner.settings.cargo.title = Cargo register index
|
||||
|
@ -3737,7 +3756,7 @@ owner.settings.cleanuprules.keep.count = Bewaar de meest recente
|
|||
owner.settings.cleanuprules.keep.count.1 = 1 versie per pakket
|
||||
owner.settings.cleanuprules.keep.count.n = %d versies per pakket
|
||||
pub.install = Voer het volgende commando uit om het pakket met Dart te installeren:
|
||||
rubygems.dependencies.runtime = Runtime Dependencies
|
||||
rubygems.dependencies.runtime = Runtime dependencies
|
||||
settings.delete.error = Het verwijderen van het pakket is mislukt.
|
||||
alpine.registry = Stel dit register in door de url toe te voegen aan je <code>/etc/apk/repositories</code> bestand:
|
||||
maven.registry = Stel dit register in het <code>pom.xml</code> bestand van je project:
|
||||
|
|
|
@ -167,6 +167,8 @@ new_migrate.link = Nowa migracja
|
|||
new_org.link = Nowa organizacja
|
||||
filter.not_fork = Nie forki
|
||||
|
||||
copy_path = Skopiuj ścieżkę
|
||||
|
||||
[aria]
|
||||
navbar = Pasek nawigacji
|
||||
footer = Stopka
|
||||
|
@ -254,7 +256,7 @@ err_empty_db_path=Ścieżka do bazy danych SQLite3 nie może być pusta.
|
|||
no_admin_and_disable_registration=Nie możesz wyłączyć możliwości samodzielnej rejestracji kont użytkowników bez stworzenia konta administratora.
|
||||
err_empty_admin_password=Hasło administratora nie może być puste.
|
||||
err_empty_admin_email=Pole adresu e-mail administratora nie może być puste.
|
||||
err_admin_name_is_reserved=Nazwa użytkownika administratora jest nieprawidłowa, pseudonim jest zastrzeżony
|
||||
err_admin_name_is_reserved=Nazwa użytkownika administratora jest nieprawidłowa, pseudonim jest zarezerwowany
|
||||
err_admin_name_pattern_not_allowed=Nazwa użytkownika administratora jest nieprawidłowa, pseudonim zawiera zastrzeżone znaki
|
||||
err_admin_name_is_invalid=Nazwa użytkownika administratora jest nieprawidłowa
|
||||
|
||||
|
@ -478,6 +480,8 @@ hint_login = Masz już konto? <a href="%s">Zaloguj się teraz!</a>
|
|||
sign_up_button = Zarejestruj się.
|
||||
use_onetime_code = Użyj kodu jednorazowego
|
||||
|
||||
unauthorized_credentials = Dane uwierzytelniające są nieprawidłowe lub wygasły. Spróbuj ponownie wykonać polecenie lub zobacz %s, aby uzyskać więcej informacji
|
||||
|
||||
[mail]
|
||||
view_it_on=Zobacz na %s
|
||||
link_not_working_do_paste=Czy link nie działa? Spróbuj skopiować i wkleić go do paska adresu URL przeglądarki.
|
||||
|
|
|
@ -748,7 +748,7 @@ webauthn=Chaves de segurança
|
|||
public_profile=Perfil público
|
||||
biography_placeholder=Conte um pouco sobre você! (Markdown é suportado)
|
||||
location_placeholder=Compartilhe sua localização aproximada com outras pessoas
|
||||
profile_desc=Controle como o seu perfil é exibido para outros usuários. Seu endereço de e-mail principal será usado para notificações, recuperação de senha e operações do Git baseadas na Web.
|
||||
profile_desc=Sobre você
|
||||
password_username_disabled=Usuários não-locais não podem alterar seus nomes de usuário. Por favor contate o administrador do site para mais informações.
|
||||
full_name=Nome completo
|
||||
website=Site
|
||||
|
@ -813,7 +813,7 @@ manage_emails=Gerenciar endereços de e-mail
|
|||
manage_themes=Tema padrão
|
||||
manage_openid=Endereços OpenID
|
||||
email_desc=Seu endereço de e-mail principal será usado para notificações, recuperação de senha e, desde que não esteja oculto, para operações do Git baseadas na Web.
|
||||
theme_desc=Este será o seu tema padrão em todo o site.
|
||||
theme_desc=Este tema será usado para a interface web quando você fizer login.
|
||||
primary=Principal
|
||||
activated=Ativado
|
||||
requires_activation=Requer ativação
|
||||
|
@ -839,7 +839,7 @@ add_email_success=O novo endereço de e-mail foi adicionado.
|
|||
email_preference_set_success=Preferência de e-mail definida com sucesso.
|
||||
add_openid_success=O novo endereço de OpenID foi adicionado.
|
||||
keep_email_private=Ocultar endereço de e-mail
|
||||
keep_email_private_popup=Isso ocultará seu endereço de e-mail do seu perfil. Ele não será mais o padrão para commits feitos pela interface web, como envios de arquivos e modificações, e não será usado para commits de merge. Em vez disso, um endereço especial %s pode ser usado para associar commits com a sua conta. Note que modificar esta opção não irá afetar commits já existentes.
|
||||
keep_email_private_popup=Seu endereço de email não será exibido no seu perfil e não será o padrão para commits feitos pela interface web, como envios de arquivos, modificações e commits de merge. Em vez disso, um endereço especial %s pode ser usado para associar commits com a sua conta. Esta opção não irá afetar commits já existentes.
|
||||
openid_desc=OpenID permite delegar autenticação para um provedor externo.
|
||||
|
||||
manage_ssh_keys=Gerenciar chaves SSH
|
||||
|
@ -1055,6 +1055,9 @@ update_hints_success = As dicas foram atualizadas.
|
|||
keep_activity_private.description = A sua <a href="%s">atividade pública</a> estará visível apenas para si e para os administradores do servidor.
|
||||
language.localization_project = Ajude-nos a traduzir Forgejo para o seu idioma! <a href="%s">Mais informações</a>.
|
||||
language.description = Essa língua será salva em sua conta e será usada como padrão após você iniciar a sessão.
|
||||
user_block_yourself = Você não pode se bloquear.
|
||||
|
||||
pronouns_custom_label = Pronomes personalizados
|
||||
|
||||
[repo]
|
||||
owner=Proprietário
|
||||
|
@ -1094,11 +1097,11 @@ issue_labels=Etiquetas
|
|||
issue_labels_helper=Selecione um conjunto de etiquetas
|
||||
license=Licença
|
||||
license_helper=Selecione um arquivo de licença
|
||||
license_helper_desc=Uma licença define o que os outros podem e não podem fazer com o seu código. Não tem certeza qual é a mais adequada para o seu projeto? Veja <a target="_blank" rel="noopener noreferrer" href="%s">Escolher uma licença.</a>
|
||||
license_helper_desc=Uma licença define o que os outros podem e não podem fazer com o seu código. Não tem certeza qual é a mais adequada para o seu projeto? Veja <a target="_blank" rel="noopener noreferrer" href="%s">Escolher uma licença</a>.
|
||||
readme=LEIA-ME
|
||||
readme_helper=Selecione um modelo de arquivo README
|
||||
readme_helper_desc=Aqui você pode escrever uma descrição completa para o seu projeto.
|
||||
auto_init=Inicializar o repositório (Adiciona arquivos .gitignore, licença e README)
|
||||
auto_init=Inicializar repositório
|
||||
trust_model_helper=Selecione o modelo de confiança para verificação de assinatura. As opções possíveis são:
|
||||
trust_model_helper_collaborator=Colaborador: Confiar em assinaturas de colaboradores
|
||||
trust_model_helper_committer=Committer: Confiar em assinaturas que correspondem aos committers
|
||||
|
@ -2440,8 +2443,8 @@ settings.archive.header=Arquivar este repositório
|
|||
settings.archive.success=O repositório foi arquivado com sucesso.
|
||||
settings.archive.error=Um erro ocorreu enquanto estava sendo arquivado o repositório. Veja o log para mais detalhes.
|
||||
settings.archive.error_ismirror=Você não pode arquivar um repositório espelhado.
|
||||
settings.archive.branchsettings_unavailable=Configurações do branch não estão disponíveis quando o repositório está arquivado.
|
||||
settings.archive.tagsettings_unavailable=As configurações de tag não estão disponíveis se o repositório estiver arquivado.
|
||||
settings.archive.branchsettings_unavailable=Configurações de branch não estão disponíveis em repositórios arquivados.
|
||||
settings.archive.tagsettings_unavailable=Configurações de tag não estão disponíveis em repositórios arquivados.
|
||||
settings.update_avatar_success=O avatar do repositório foi atualizado.
|
||||
settings.lfs=LFS
|
||||
settings.lfs_filelist=Arquivos LFS armazenados neste repositório
|
||||
|
@ -2641,7 +2644,7 @@ settings.unarchive.success = O repositório foi desarquivado.
|
|||
settings.unarchive.button = Desarquivar repositório
|
||||
settings.unarchive.header = Desarquivar este repositório
|
||||
diff.comment.add_line_comment = Adicionar comentário na linha
|
||||
new_repo_helper = Um repositório contém todos os arquivos de projeto, incluindo o histórico de revisões. Já hospeda um repositório em outra plataforma? <a href="%s">Migrar repositório</a>
|
||||
new_repo_helper = Um repositório contém todos os arquivos de projeto, incluindo o histórico de revisões. Já hospeda um repositório em outra plataforma? <a href="%s">Migrar repositório</a>.
|
||||
blame.ignore_revs.failed = Falha ao ignorar as revisões em <a href="%s">.git-blame-ignore-revs</a>.
|
||||
migrate.forgejo.description = Migrar dados do codeberg.org ou outras servidores Forgejo.
|
||||
commits.browse_further = Ver mais
|
||||
|
@ -2726,7 +2729,7 @@ comments.edit.already_changed = Falha ao salvar as alterações ao comentário.
|
|||
activity.navbar.code_frequency = Frequência de código
|
||||
settings.protect_status_check_matched = Correspondente
|
||||
branch.tag_collision = O ramo "%s" não pode ser criado porque já existe uma etiqueta com o mesmo nome no repositório.
|
||||
settings.archive.mirrors_unavailable = As réplicas ficarão indisponíveis se o repositório estiver arquivado.
|
||||
settings.archive.mirrors_unavailable = Réplicas não estão disponíveis em repositórios arquivados.
|
||||
release.download_count_one = %s download
|
||||
settings.mirror_settings.docs.no_new_mirrors = O seu repositório está replicando alterações de ou para outro repositório. Observe que não é possível criar novas réplicas no momento.
|
||||
settings.mirror_settings.docs.pull_mirror_instructions = Para configurar uma réplica de outro repositório, consulte:
|
||||
|
@ -2847,6 +2850,22 @@ diff.git-notes.remove-body = Esta anotação será removida.
|
|||
issues.num_reviews_one = %d revisão
|
||||
issues.summary_card_alt = Cartão de resumo de um issue com o título "%s" no repositório %s
|
||||
issues.num_reviews_few = %d revisões
|
||||
settings.default_update_style_desc = Estilo padrão de atualização usado para atualizar pull requests que estão atrasados em relação ao branch base.
|
||||
pulls.sign_in_require = <a href="%s">Entre</a> para criar um novo pull request.
|
||||
new_from_template = Use um modelo
|
||||
new_from_template_description = Você pode selecionar um modelo de repositório nesta instância e aplicar suas configurações.
|
||||
new_advanced = Configurações avançadas
|
||||
new_advanced_expand = Clique para expandir
|
||||
auto_init_description = Inicializar o histórico do Git com um README e opcionalmente adicionar arquivos License e .gitignore.
|
||||
|
||||
summary_card_alt = Cartão de resumo do repositório %s
|
||||
issues.reaction.add = Adicionar reação
|
||||
issues.reaction.alt_few = %[1]s reagiu com %[2]s.
|
||||
issues.reaction.alt_many = %[1]s e mais %[2]d reagiram com %[3]s.
|
||||
issues.reaction.alt_remove = Remover reação %[1]s deste comentário.
|
||||
issues.reaction.alt_add = Adicionar reação %[1]s ao comentário.
|
||||
issues.context.menu = Menu de comentário
|
||||
release.summary_card_alt = Cartão de resumo de um release intitulado "%s" no repositório %s
|
||||
|
||||
[graphs]
|
||||
component_loading = Carregando %s...
|
||||
|
@ -3675,18 +3694,18 @@ chef.install=Para instalar o pacote, execute o seguinte comando:
|
|||
composer.registry=Configure este registro em seu arquivo <code>~/.composer/config.json</code>:
|
||||
composer.install=Para instalar o pacote usando o Composer, execute o seguinte comando:
|
||||
composer.dependencies=Dependências
|
||||
composer.dependencies.development=Dependências de Desenvolvimento
|
||||
composer.dependencies.development=Dependências de desenvolvimento
|
||||
conan.details.repository=Repositório
|
||||
conan.registry=Configure este registro pela linha de comando:
|
||||
conan.install=Para instalar o pacote usando o Conan, execute o seguinte comando:
|
||||
conda.registry=Configure este registro como um repositório Conda no arquivo <code>.condarc</code>:
|
||||
conda.install=Para instalar o pacote usando o Conda, execute o seguinte comando:
|
||||
container.details.type=Tipo de Imagem
|
||||
container.details.type=Tipo de imagem
|
||||
container.details.platform=Plataforma
|
||||
container.pull=Puxe a imagem pela linha de comando:
|
||||
container.digest=Digest
|
||||
container.multi_arch=S.O. / Arquitetura
|
||||
container.layers=Camadas da Imagem
|
||||
container.layers=Camadas da imagem
|
||||
container.labels=Rótulos
|
||||
container.labels.key=Chave
|
||||
container.labels.value=Valor
|
||||
|
@ -3714,9 +3733,9 @@ npm.registry=Configure este registro no arquivo <code>.npmrc</code> do seu proje
|
|||
npm.install=Para instalar o pacote usando o npm, execute o seguinte comando:
|
||||
npm.install2=ou adicione-o ao arquivo package.json:
|
||||
npm.dependencies=Dependências
|
||||
npm.dependencies.development=Dependências de Desenvolvimento
|
||||
npm.dependencies.peer=Dependências Peer
|
||||
npm.dependencies.optional=Dependências Opcionais
|
||||
npm.dependencies.development=Dependências de desenvolvimento
|
||||
npm.dependencies.peer=Dependências peer
|
||||
npm.dependencies.optional=Dependências opcionais
|
||||
npm.details.tag=Tag
|
||||
pub.install=Para instalar o pacote usando Dart, execute o seguinte comando:
|
||||
pypi.requires=Requer Python
|
||||
|
@ -3729,8 +3748,8 @@ rpm.repository = Informações do repositório
|
|||
rpm.repository.architectures = Arquiteturas
|
||||
rubygems.install=Para instalar o pacote usando gem, execute o seguinte comando:
|
||||
rubygems.install2=ou adicione-o ao Gemfile:
|
||||
rubygems.dependencies.runtime=Dependências de Execução
|
||||
rubygems.dependencies.development=Dependências de Desenvolvimento
|
||||
rubygems.dependencies.runtime=Dependências de tempo de execução
|
||||
rubygems.dependencies.development=Dependências de desenvolvimento
|
||||
rubygems.required.ruby=Requer o Ruby versão
|
||||
rubygems.required.rubygems=Requer o RubyGem versão
|
||||
swift.registry=Configure este registro pela linha de comando:
|
||||
|
@ -3777,11 +3796,11 @@ owner.settings.cleanuprules.success.delete=Regra de limpeza foi excluída.
|
|||
owner.settings.chef.title=Registro Chef
|
||||
owner.settings.chef.keypair=Gerar par de chaves
|
||||
rpm.repository.multiple_groups = Este pacote está disponível em vários grupos.
|
||||
npm.dependencies.bundle = Dependências empacotadas
|
||||
npm.dependencies.bundle = Dependências em bundle
|
||||
registry.documentation = Para mais informações sobre o registro %s, veja <a target="_blank" rel="noopener noreferrer" href="%s">a documentação</a>.
|
||||
arch.version.replaces = Substitui
|
||||
arch.version.conflicts = Conflitos
|
||||
arch.version.properties = Propriedades de Versão
|
||||
arch.version.properties = Propriedades da versão
|
||||
arch.version.description = Descrição
|
||||
arch.version.groups = Grupo
|
||||
arch.version.provides = Fornece
|
||||
|
|
|
@ -142,7 +142,7 @@ confirm_delete_selected=Confirma a exclusão de todos os itens marcados?
|
|||
|
||||
name=Nome
|
||||
value=Valor
|
||||
filter.is_fork = Derivações
|
||||
filter.is_fork = Derivado
|
||||
filter.is_mirror = Réplicas
|
||||
filter.is_template = Modelos
|
||||
filter.public = Público
|
||||
|
@ -156,7 +156,7 @@ filter.clear = Retirar filtros
|
|||
filter.is_archived = Arquivado
|
||||
filter.not_template = Não modelos
|
||||
toggle_menu = Comutar menu
|
||||
filter = Filtro
|
||||
filter = Filtrar
|
||||
copy_generic = Copiar para a área de transferência
|
||||
test = Teste
|
||||
error413 = Você esgotou a sua quota.
|
||||
|
@ -166,6 +166,7 @@ new_org.title = Nova organização
|
|||
new_repo.link = Novo repositório
|
||||
new_migrate.link = Nova migração
|
||||
new_org.link = Nova organização
|
||||
copy_path = Copiar caminho
|
||||
|
||||
[aria]
|
||||
navbar=Barra de navegação
|
||||
|
@ -212,7 +213,7 @@ string.desc=Z - A
|
|||
|
||||
[error]
|
||||
occurred=Ocorreu um erro
|
||||
report_message=Se acredita de que se trata de um erro do Forgejo, procure, por favor, questões relacionadas no <a href="%s">GitHub</a> ou abra uma nova questão, se necessário.
|
||||
report_message=Se acredita de que se trata de um erro do Forgejo, procure, por favor, questões relacionadas no <a href="%s" target="_blank">Codeberg</a> ou abra uma nova questão, se necessário.
|
||||
missing_csrf=Pedido inválido: não há código CSRF
|
||||
invalid_csrf=Pedido inválido: código CSRF inválido
|
||||
not_found=Não foi possível encontrar o destino.
|
||||
|
@ -747,7 +748,7 @@ webauthn=Autenticação em dois passos (chaves de segurança)
|
|||
public_profile=Perfil público
|
||||
biography_placeholder=Diga aos outros um pouco sobre si! (Markdown é suportado)
|
||||
location_placeholder=Partilhe a sua localização aproximada com outros
|
||||
profile_desc=Controle como o seu perfil é apresentado aos outros utilizadores. O seu endereço de email principal será usado para notificações, recuperação de senha e operações Git baseadas na web.
|
||||
profile_desc=Sobre si
|
||||
password_username_disabled=Utilizadores não-locais não podem mudar os seus nomes de utilizador. Entre em contacto com o administrador do sítio saber para mais detalhes.
|
||||
full_name=Nome completo
|
||||
website=Sítio web
|
||||
|
@ -812,7 +813,7 @@ manage_emails=Gerir endereços de email
|
|||
manage_themes=Tema padrão
|
||||
manage_openid=Endereços OpenID
|
||||
email_desc=O seu endereço de email principal irá ser usado para notificações, recuperação de senha e, desde que não esteja oculto, operações Git baseados na web.
|
||||
theme_desc=Este será o seu tema padrão em todo o sítio.
|
||||
theme_desc=Este tema será usado para a interface web quando tiver sessão iniciada.
|
||||
primary=Principal
|
||||
activated=Em uso
|
||||
requires_activation=Tem que ser habilitado
|
||||
|
@ -838,7 +839,7 @@ add_email_success=O novo endereço de email foi adicionado.
|
|||
email_preference_set_success=As preferências relativas ao email foram definidas com sucesso.
|
||||
add_openid_success=O novo endereço OpenID foi adicionado.
|
||||
keep_email_private=Ocultar endereço de email
|
||||
keep_email_private_popup=Isto irá ocultar o seu endereço de email no seu perfil. Não será mais o predefinido nos cometimentos feitos através da interface web, tais como carregamentos de ficheiros e edições, e não será usado para cometimentos de integração. Ao invés disso, um endereço especial %s poderá ser usado para associar cometimentos à sua conta. Note que mudar esta opção não irá alterar os cometimentos existentes.
|
||||
keep_email_private_popup=O seu endereço de e-mail não será mostrado no seu perfil e não será o predefinido para cometimentos feitos através da interface web, tais como upload de arquivos, edições e cometimentos de integração. Ao invés disso, um endereço especial %s poderá ser usado para vincular cometimentos à sua conta. Esta opção não irá alterar os cometimentos existentes.
|
||||
openid_desc=O OpenID permite delegar a autenticação num fornecedor externo.
|
||||
|
||||
manage_ssh_keys=Gerir chaves SSH
|
||||
|
@ -1055,6 +1056,8 @@ keep_activity_private.description = O seu <a href="%s">trabalho público</a> ape
|
|||
language.description = Este idioma vai ser guardado na sua conta e ser usado como o predefinido depois de iniciar sessão.
|
||||
language.localization_project = Ajude-nos a traduzir o Forgejo para o seu idioma! <a href="%s">Saiba mais</a>.
|
||||
|
||||
pronouns_custom_label = Pronomes personalizados
|
||||
|
||||
[repo]
|
||||
new_repo_helper=Um repositório contém todos os ficheiros do trabalho, incluindo o histórico das revisões. Já tem um hospedado noutro sítio? <a href="%s">Migre o repositório</a>.
|
||||
owner=Proprietário(a)
|
||||
|
@ -1096,13 +1099,13 @@ issue_labels=Rótulos
|
|||
issue_labels_helper=Escolha um conjunto de rótulos
|
||||
license=Licença
|
||||
license_helper=Escolha um ficheiro de licença
|
||||
license_helper_desc=Uma licença rege o que os outros podem, ou não, fazer com o seu código fonte. Não tem a certeza sobre qual a mais indicada para o seu trabalho? Veja: <a target="_blank" rel="noopener noreferrer" href="%s">Escolher uma licença.</a>
|
||||
license_helper_desc=Uma licença rege o que os outros podem, ou não, fazer com o seu código fonte. Não tem a certeza sobre qual a mais indicada para o seu trabalho? Veja: <a target="_blank" rel="noopener noreferrer" href="%s">Escolher uma licença</a>.
|
||||
object_format=Formato dos elementos
|
||||
object_format_helper=Formato dos elementos do repositório. Não poderá ser alterado mais tarde. SHA1 é o mais compatível.
|
||||
readme=README
|
||||
readme_helper=Escolha um modelo de ficheiro README
|
||||
readme_helper_desc=Este é o sítio onde pode escrever uma descrição completa do seu trabalho.
|
||||
auto_init=Inicializar repositório (adiciona `.gitignore`, `LICENSE` e `README.md`)
|
||||
auto_init=Inicializar repositório
|
||||
trust_model_helper=Escolha o modelo de confiança para a validação das assinaturas. As opções são:
|
||||
trust_model_helper_collaborator=Colaborador: Confiar nas assinaturas dos colaboradores
|
||||
trust_model_helper_committer=Autor do cometimento: Confiar nas assinaturas que correspondem a autores de cometimentos
|
||||
|
@ -2514,9 +2517,9 @@ settings.archive.text=Arquivar o repositório irá torná-lo apenas de leitura.
|
|||
settings.archive.success=O repositório foi arquivado com sucesso.
|
||||
settings.archive.error=Ocorreu um erro enquanto decorria o processo de arquivo do repositório. Veja os registo para obter mais detalhes.
|
||||
settings.archive.error_ismirror=Não pode arquivar um repositório que tenha sido replicado.
|
||||
settings.archive.branchsettings_unavailable=As configurações dos ramos não estão disponíveis quando o repositório está arquivado.
|
||||
settings.archive.tagsettings_unavailable=As configurações sobre etiquetas não estão disponíveis quando o repositório está arquivado.
|
||||
settings.archive.mirrors_unavailable=As réplicas não estão disponíveis se o repositório estiver arquivado.
|
||||
settings.archive.branchsettings_unavailable=As configurações dos ramos não estão disponíveis em repositórios arquivados.
|
||||
settings.archive.tagsettings_unavailable=As configurações sobre etiquetas não estão disponíveis em repositórios arquivados.
|
||||
settings.archive.mirrors_unavailable=As réplicas não estão disponíveis em repositórios arquivados.
|
||||
settings.unarchive.button=Desarquivar repositório
|
||||
settings.unarchive.header=Desarquivar este repositório
|
||||
settings.unarchive.text=Desarquivar o repositório irá restaurar a capacidade de receber cometimentos e envios, assim como novas questões e pedidos de integração.
|
||||
|
@ -2828,7 +2831,7 @@ mirror_use_ssh.text = Utilizar a autenticação SSH
|
|||
mirror_denied_combination = Não é possível usar a autenticação baseada em chave pública e senha em combinação.
|
||||
settings.mirror_settings.push_mirror.copy_public_key = Copiar chave pública
|
||||
settings.mirror_settings.push_mirror.none_ssh = Nenhuma
|
||||
settings.protect_new_rule = Criar uma nova regra de salvaguarda do ramo
|
||||
settings.protect_new_rule = Criar uma nova regra de proteção de ramo
|
||||
mirror_use_ssh.helper = O Forgejo irá replicar o repositório via Git sobre SSH e criar um par de chaves para si quando escolher esta opção. Tem que se certificar que a chave pública gerada está autorizada a enviar para o repositório de destino. Não pode usar a autorização baseada numa senha quando escolher isto.
|
||||
mirror_use_ssh.not_available = A autenticação por SSH não está disponível.
|
||||
issues.new.assign_to_me = Atribuir a mim
|
||||
|
@ -2844,9 +2847,26 @@ issues.review.add_remove_review_requests = pedidos de revisão de %[1]s e pedido
|
|||
pulls.delete_after_merge.head_branch.is_default = O ramo de topo que pretende eliminar é o ramo predefinido e não pode ser eliminado.
|
||||
pulls.delete_after_merge.head_branch.is_protected = O ramo de topo que pretende eliminar é um ramo protegido e não pode ser eliminado.
|
||||
pulls.delete_after_merge.head_branch.insufficient_branch = Não tem permissão para eliminar o ramo de topo.
|
||||
issues.summary_card_alt = Sumário de uma questão com o título "%s" no repositório %s
|
||||
issues.summary_card_alt = Cartão de resumo de uma questão com o título "%s" no repositório %s
|
||||
issues.num_reviews_one = %d revisão
|
||||
issues.num_reviews_few = %d revisões
|
||||
editor.add_tmpl.filename = nome do ficheiro
|
||||
|
||||
new_from_template = Utilize um template
|
||||
new_from_template_description = Pode selecionar um modelo de repositório existente nesta instância e aplicar as suas definições.
|
||||
new_advanced = Configurações avançadas
|
||||
new_advanced_expand = Clique para expandir
|
||||
auto_init_description = Iniciar o histórico do Git com um README e, opcionalmente, adicione os ficheiros License e .gitignore.
|
||||
summary_card_alt = Cartão de resumo do repositório %s
|
||||
issues.reaction.add = Adicionar reação
|
||||
issues.reaction.alt_few = %[1]s reagiu com %[2]s.
|
||||
issues.reaction.alt_many = %[1]s e mais %[2]d reagiram com %[3]s.
|
||||
issues.reaction.alt_remove = Remover reação %[1]s deste comentário.
|
||||
issues.reaction.alt_add = Adicionar reação %[1]s ao comentário.
|
||||
issues.context.menu = Menu de comentário
|
||||
pulls.sign_in_require = <a href="%s">Inicie sessão</a> para criar um novo pedido de integração.
|
||||
settings.default_update_style_desc = Estilo de atualização predefinido utilizado para atualizar pedidos de integração que estão atrasados em relação ao ramo base.
|
||||
release.summary_card_alt = Cartão de resumo de um lançamento com o título "%s" no repositório %s
|
||||
|
||||
[graphs]
|
||||
component_loading=A carregar %s...
|
||||
|
@ -3167,8 +3187,8 @@ orgs.members=Membros
|
|||
orgs.new_orga=Nova organização
|
||||
|
||||
repos.repo_manage_panel=Gerir repositórios
|
||||
repos.unadopted=Repositórios não adoptados
|
||||
repos.unadopted.no_more=Não foram encontrados mais repositórios não adoptados
|
||||
repos.unadopted=Repositórios não adotados
|
||||
repos.unadopted.no_more=Não foram encontrados repositórios não adotados.
|
||||
repos.owner=Proprietário(a)
|
||||
repos.name=Nome
|
||||
repos.private=Privado
|
||||
|
@ -3275,9 +3295,9 @@ auths.oauth2_required_claim_name_helper=Defina este nome para restringir o iníc
|
|||
auths.oauth2_required_claim_value=Valor de reivindicação obrigatório
|
||||
auths.oauth2_required_claim_value_helper=Defina este valor para restringir o início de sessão desta fonte a utilizadores que tenham uma reivindicação com este nome e este valor
|
||||
auths.oauth2_group_claim_name=Reivindicar nome que fornece nomes de grupo para esta fonte. (Opcional)
|
||||
auths.oauth2_admin_group=Valor da reivindicação de grupo para utilizadores administradores (opcional — exige a reivindicação de nome acima).
|
||||
auths.oauth2_restricted_group=Valor da reivindicação de grupo para utilizadores restritos (opcional — exige a reivindicação de nome acima).
|
||||
auths.oauth2_map_group_to_team=Mapear grupos reclamados em equipas da organização (opcional — requer nome de reclamação acima).
|
||||
auths.oauth2_admin_group=Valor da reivindicação de grupo para utilizadores administradores. (Opcional — exige a reivindicação de nome acima)
|
||||
auths.oauth2_restricted_group=Valor da reivindicação de grupo para utilizadores restritos. (Opcional — exige a reivindicação de nome acima)
|
||||
auths.oauth2_map_group_to_team=Mapear grupos reclamados em equipas da organização. (Opcional — requer nome de reclamação acima)
|
||||
auths.oauth2_map_group_to_team_removal=Remover utilizadores das equipas sincronizadas se esses utilizadores não pertencerem ao grupo correspondente.
|
||||
auths.enable_auto_register=Habilitar o registo automático
|
||||
auths.sspi_auto_create_users=Criar utilizadores automaticamente
|
||||
|
@ -3664,7 +3684,7 @@ alpine.registry=Configure este registo adicionando o URL no seu ficheiro <code>/
|
|||
alpine.registry.key=Descarregue a chave RSA pública do registo para dentro da pasta <code>/etc/apk/keys/</code> para verificar a assinatura do índice:
|
||||
alpine.registry.info=Escolha $branch e $repository da lista abaixo.
|
||||
alpine.install=Para instalar o pacote, execute o seguinte comando:
|
||||
alpine.repository=Informação do repositório
|
||||
alpine.repository=Informações do repositório
|
||||
alpine.repository.branches=Ramos
|
||||
alpine.repository.repositories=Repositórios
|
||||
alpine.repository.architectures=Arquitecturas
|
||||
|
@ -3684,9 +3704,9 @@ conda.install=Para instalar o pacote usando o Conda, execute o seguinte comando:
|
|||
container.details.type=Tipo de imagem
|
||||
container.details.platform=Plataforma
|
||||
container.pull=Puxar a imagem usando a linha de comandos:
|
||||
container.digest=Resumo:
|
||||
container.digest=Resumo
|
||||
container.multi_arch=S.O. / Arquit.
|
||||
container.layers=Camadas de imagem
|
||||
container.layers=Camadas da imagem
|
||||
container.labels=Rótulos
|
||||
container.labels.key=Chave
|
||||
container.labels.value=Valor
|
||||
|
@ -3695,7 +3715,7 @@ cran.install=Para instalar o pacote, execute o seguinte comando:
|
|||
debian.registry=Configurar este registo usando a linha de comandos:
|
||||
debian.registry.info=Escolha $distribution e $component da lista abaixo.
|
||||
debian.install=Para instalar o pacote, execute o seguinte comando:
|
||||
debian.repository=Informação do repositório
|
||||
debian.repository=Informações do repositório
|
||||
debian.repository.distributions=Distribuições
|
||||
debian.repository.components=Componentes
|
||||
debian.repository.architectures=Arquitecturas
|
||||
|
@ -3725,12 +3745,12 @@ rpm.registry=Configurar este registo usando a linha de comandos:
|
|||
rpm.distros.redhat=em distribuições baseadas no RedHat
|
||||
rpm.distros.suse=em distribuições baseadas no SUSE
|
||||
rpm.install=Para instalar o pacote, execute o seguinte comando:
|
||||
rpm.repository=Informação do repositório
|
||||
rpm.repository=Informações do repositório
|
||||
rpm.repository.architectures=Arquitecturas
|
||||
rpm.repository.multiple_groups=Este pacote está disponível em vários grupos.
|
||||
rubygems.install=Para instalar o pacote usando o gem, execute o seguinte comando:
|
||||
rubygems.install2=ou adicione-o ao ficheiro <code>Gemfile</code>:
|
||||
rubygems.dependencies.runtime=Dependências do tempo de execução (runtime)
|
||||
rubygems.dependencies.runtime=Dependências em tempo de execução
|
||||
rubygems.dependencies.development=Dependências de desenvolvimento
|
||||
rubygems.required.ruby=Requer a versão do Ruby
|
||||
rubygems.required.rubygems=Requer a versão do RubyGem
|
||||
|
@ -3791,7 +3811,7 @@ arch.version.provides = Fornece
|
|||
arch.pacman.helper.gpg = Adicionar certificado de confiança para o pacman:
|
||||
arch.pacman.conf = Adicionar servidor com distribuição e arquitectura relacionadas a <code>/etc/pacman.conf</code> :
|
||||
arch.pacman.repo.multi = %s tem a mesma versão em distribuições diferentes.
|
||||
arch.version.optdepends = Dependências opcionais
|
||||
arch.version.optdepends = Depende opcionalmente
|
||||
arch.version.depends = Depende de
|
||||
arch.version.makedepends = Dependências do make
|
||||
arch.version.groups = Grupo
|
||||
|
@ -3799,6 +3819,7 @@ arch.version.checkdepends = Verificar dependências
|
|||
arch.version.conflicts = Conflitos
|
||||
arch.version.backup = Cópia de segurança
|
||||
arch.version.replaces = Substitui
|
||||
container.images.title = Imagens
|
||||
|
||||
[secrets]
|
||||
secrets=Segredos
|
||||
|
@ -3991,8 +4012,8 @@ projects.read = <b>Ler:</b> Aceder aos quadros de planeamento do repositório.
|
|||
projects.write = <b>Escrever:</b> Criar planeamentos e colunas e editá-las.
|
||||
packages.read = <b>Ler:</b> Ver e descarregar pacotes atribuídos ao repositório.
|
||||
packages.write = <b>Escrever:</b> Publicar e eliminar pacotes atribuídos ao repositório.
|
||||
actions.read = <b>Ler:</b> Ver canais CI/CD integrados e os seus registos.
|
||||
actions.write = <b>Escrever:</b> Despoletar, reiniciar, cancelar ou aprovar manualmente canais CI/CD pendentes.
|
||||
actions.read = <b>Ler:</b> Ver sequências CI/CD integrados e os seus registos.
|
||||
actions.write = <b>Escrever:</b> Despoletar, reiniciar, cancelar ou aprovar manualmente sequências CI/CD pendentes.
|
||||
ext_issues = Aceder à ligação para um rastreador de questões externo. As permissões são geridas externamente.
|
||||
ext_wiki = Aceder à ligação para um wiki externo. As permissões são geridas externamente.
|
||||
issues.write = <b>Escrever:</b> Fechar questões e gerir metadados, tais como rótulos, etapas, encarregados, datas de vencimento e dependências.
|
||||
|
|
|
@ -234,7 +234,7 @@ license_desc=Всё это на <a target="_blank" rel="noopener noreferrer" hre
|
|||
[install]
|
||||
install=Установка
|
||||
title=Начальная конфигурация
|
||||
docker_helper=Если вы запускаете Forgejo под Docker, пожалуйста, ознакомьтесь с <a target="_blank" rel="noopener noreferrer" href="%s">документацией</a>, прежде чем изменять любые настройки.
|
||||
docker_helper=Если вы запускаете Forgejo под Docker, прежде чем изменять любые настройки, пожалуйста, ознакомьтесь с <a target="_blank" rel="noopener noreferrer" href="%s">документацией</a>.
|
||||
require_db_desc=Forgejo требуется MySQL, PostgreSQL, SQLite3 или TiDB (по протоколу MySQL).
|
||||
db_title=Настройки базы данных
|
||||
db_type=Тип базы данных
|
||||
|
@ -267,16 +267,16 @@ repo_path=Путь до каталога репозиториев
|
|||
repo_path_helper=Все удалённые Git репозитории будут сохранены в этом каталоге.
|
||||
lfs_path=Путь до корневого каталога Git LFS
|
||||
lfs_path_helper=В этом каталоге будут храниться файлы Git LFS. Оставьте пустым, чтобы отключить LFS.
|
||||
run_user=Выполнение под пользователем
|
||||
run_user=Работа под пользователем
|
||||
run_user_helper=Имя пользователя операционной системы, под которым работает Forgejo. Обратите внимание, что этот пользователь должен иметь доступ к корневому пути репозиториев.
|
||||
domain=Домен сервера
|
||||
domain_helper=Домен или адрес хоста для сервера.
|
||||
ssh_port=Порт SSH-сервера
|
||||
ssh_port_helper=Номер порта, используемый SSH-сервером. Оставьте пустым для отключения доступа по SSH.
|
||||
ssh_port_helper=Номер порта, используемый для входящих подключений по SSH. Оставьте пустым для отключения доступа по SSH.
|
||||
http_port=Порт HTTP-сервера
|
||||
http_port_helper=Номер порта, используемый веб-сервером Forgejo.
|
||||
app_url=Базовый URL Forgejo
|
||||
app_url_helper=Этот параметр влияет на URL для клонирования по HTTP/HTTPS и на некоторые уведомления по эл. почте.
|
||||
app_url=Базовый URL
|
||||
app_url_helper=Этот параметр влияет на URL клонирования по HTTP/HTTPS и на ссылки в уведомлениях по эл. почте.
|
||||
log_root_path=Путь журналов
|
||||
log_root_path_helper=Файлы журнала будут записываться в этот каталог.
|
||||
|
||||
|
@ -284,9 +284,9 @@ optional_title=Дополнительные настройки
|
|||
email_title=Настройки эл. почты
|
||||
smtp_addr=Адрес SMTP
|
||||
smtp_port=Порт SMTP
|
||||
smtp_from=Отправлять письма от
|
||||
smtp_from=Отправитель
|
||||
smtp_from_helper=Адрес эл. почты, который будет использоваться Forgejo. Введите обычный адрес эл. почты или используйте формат "Имя" <email@example.com>.
|
||||
mailer_user=Логин SMTP
|
||||
mailer_user=Имя пользователя SMTP
|
||||
mailer_password=Пароль SMTP
|
||||
register_confirm=Требовать подтверждение по эл. почте для регистрации
|
||||
mail_notify=Уведомления по эл. почте
|
||||
|
@ -316,11 +316,11 @@ confirm_password=Подтверждение пароля
|
|||
admin_email=Адрес эл. почты
|
||||
install_btn_confirm=Установить Forgejo
|
||||
test_git_failed=Не удалось проверить команду «git»: %v
|
||||
sqlite3_not_available=Эта версия Forgejo не поддерживает SQLite3. Пожалуйста, загрузите официальную бинарную сборку из %s (не сборку «gobuild»).
|
||||
sqlite3_not_available=Эта версия Forgejo не поддерживает SQLite3. Пожалуйста, скачайте официальную сборку из %s (не версию «gobuild»).
|
||||
invalid_db_setting=Некорректные настройки базы данных: %v
|
||||
invalid_db_table=Таблица «%s» базы данных некорректна: %v
|
||||
invalid_repo_path=Недопустимый путь к корню репозитория: %v
|
||||
invalid_app_data_path=Неверный путь к приложению: %v
|
||||
invalid_repo_path=Неверный путь к корню репозиториев: %v
|
||||
invalid_app_data_path=Неверный путь к данным приложения: %v
|
||||
run_user_not_match=Текущий пользователь не является пользователем для запуска: %s -> %s
|
||||
internal_token_failed=Не удалось создать внутренний токен: %v
|
||||
secret_key_failed=Не удалось создать секретный ключ: %v
|
||||
|
@ -360,7 +360,7 @@ my_orgs=Организации
|
|||
my_mirrors=Мои зеркала
|
||||
view_home=Показать %s
|
||||
search_repos=Поиск репозитория…
|
||||
filter=Другие фильтры
|
||||
filter=Прочие фильтры
|
||||
filter_by_team_repositories=Фильтровать по репозиториям команды
|
||||
feed_of=Лента «%s»
|
||||
|
||||
|
@ -687,13 +687,13 @@ change_avatar=Изменить изображение профиля…
|
|||
joined_on=Регистрация %s
|
||||
repositories=Репозитории
|
||||
activity=Публичная активность
|
||||
followers_few=%d подписчики
|
||||
followers_few=%d подписчиков
|
||||
starred=Избранные репозитории
|
||||
watched=Отслеживаемые репозитории
|
||||
code=Код
|
||||
projects=Проекты
|
||||
overview=Обзор
|
||||
following_few=%d подписки
|
||||
following_few=%d подписок
|
||||
follow=Подписаться
|
||||
unfollow=Отписаться
|
||||
user_bio=О себе
|
||||
|
@ -748,7 +748,7 @@ webauthn=Двухфакторная аутентификация (ключами
|
|||
public_profile=Публичный профиль
|
||||
biography_placeholder=Кратко расскажите о себе другим! (Можно использовать Markdown)
|
||||
location_placeholder=Пусть все знают, откуда вы
|
||||
profile_desc=Как ваш профиль будет отображаться для других пользователей. Ваш основной адрес эл. почты будет использоваться для уведомлений, восстановления пароля и веб-операций с Git.
|
||||
profile_desc=Ваш профиль
|
||||
password_username_disabled=Нелокальным пользователям запрещено изменение их имени пользователя. Для получения более подробной информации обратитесь к администратору сайта.
|
||||
full_name=Полное имя
|
||||
website=Веб-сайт
|
||||
|
@ -810,7 +810,7 @@ password_change_disabled=Нелокальные учётные записи не
|
|||
|
||||
emails=Адреса эл. почты
|
||||
manage_emails=Управление адресами эл. почты
|
||||
manage_themes=Тема по умолчанию
|
||||
manage_themes=Тема интерфейса
|
||||
manage_openid=Адреса OpenID
|
||||
email_desc=Ваш основной адрес эл. почты будет использоваться для уведомлений, восстановления пароля и, если он не скрыт, для действий с Git в веб-интерфейсе.
|
||||
theme_desc=Эта тема оформления будет использоваться при входе на сайт под этой учётной записью.
|
||||
|
@ -941,7 +941,7 @@ select_permissions=Выбрать разрешения
|
|||
permission_no_access=Нет доступа
|
||||
permission_read=Чтение
|
||||
permission_write=Чтение и запись
|
||||
access_token_desc=Выбранные области действия токена ограничивают авторизацию только соответствующими маршрутами <a href="%[1]s" target="_blank">API</a>. Читайте <a href="%[2]s" target="_blank">документацию</a> для получения дополнительной информации.
|
||||
access_token_desc=Выбранные области действия токена ограничивают его использование до соответствующих маршрутов <a href="%[1]s" target="_blank">API</a>. Для получения подробностей ознакомьтесь с <a href="%[2]s" target="_blank">документацией</a> .
|
||||
at_least_one_permission=Необходимо выбрать хотя бы одно разрешение для создания токена
|
||||
permissions_list=Разрешения:
|
||||
|
||||
|
@ -949,7 +949,7 @@ manage_oauth2_applications=Управление приложениями OAuth2
|
|||
edit_oauth2_application=Изменить приложение OAuth2
|
||||
oauth2_applications_desc=Приложения OAuth2 позволяет стороннему приложению к безопасно аутентифицировать пользователей данной установки Forgejo.
|
||||
remove_oauth2_application=Удаление приложения OAuth2
|
||||
remove_oauth2_application_desc=Удаление приложения OAuth2 отменит доступ ко всем подписанным токенам доступа. Продолжить?
|
||||
remove_oauth2_application_desc=Удаление этого приложения отменит доступ ко всем подписанным токенам доступа. Продолжить?
|
||||
remove_oauth2_application_success=Приложение было успешно удалено.
|
||||
create_oauth2_application=Создать новое приложение OAuth2
|
||||
create_oauth2_application_button=Создать приложение
|
||||
|
@ -1040,7 +1040,7 @@ blocked_since = Заблокирован с %s
|
|||
user_unblock_success = Пользователь разблокирован.
|
||||
twofa_scratch_token_regenerated = Ваш одноразовый ключ восстановления: %s. Сохраните его в надёжном месте. Больше он показан не будет.
|
||||
blocked_users = Заблокированные пользователи
|
||||
keep_email_private_popup = Ваш адрес эл. почты будет скрыт из профиля. Он больше не будет использоваться по умолчанию для коммитов, сделанных из веб-интерфейса, таких как загрузки и редактирования файлов и не будет использоваться для коммитов запросов на слияние. Вместо него можно будет использовать специальный адрес %s, чтобы присваивать коммиты с вашим аккаунтом. Обратите внимание на то, что изменение данной настройки не повлияет на существующие коммиты.
|
||||
keep_email_private_popup = Ваш адрес эл. почты не будет видим в профиле и не будет использован по умолчанию для коммитов из веб-интерфейса, таких как загрузка и редактирование файлов, а также для коммитов слияний. Вместо него для связи коммитов с уч. записью можно использовать специальный адрес %s. Изменение данной настройки не изменит адрес в существующих коммитах.
|
||||
oauth2_confidential_client = Конфиденциальный клиент. Выберите для приложений, хранящих секрет в тайне, например, для веб-приложений. Не выбирайте для нативных приложений, включая приложения для ПК или смартфонов.
|
||||
change_password = Изменение пароля
|
||||
hints = Подсказки
|
||||
|
@ -1051,10 +1051,12 @@ additional_repo_units_hint_description = Показывать подсказку
|
|||
pronouns_custom = Другие
|
||||
pronouns = Местоимения
|
||||
pronouns_unspecified = Не указаны
|
||||
language.title = Язык по умолчанию
|
||||
language.title = Язык интерфейса
|
||||
keep_activity_private.description = Ваша <a href="%s">публичная активность</a> будет видна только вам и администраторам сервера.
|
||||
language.description = Выбранный язык будет сохранён в вашей уч. записи и будет использован по умолчанию после входа.
|
||||
language.localization_project = Помогите с переводом Forgejo на свой язык! <a href="%s">Подробнее</a>.
|
||||
user_block_yourself = Нельзя заблокировать себя.
|
||||
pronouns_custom_label = Другие местоимения
|
||||
|
||||
[repo]
|
||||
owner=Владелец
|
||||
|
@ -1065,11 +1067,11 @@ repo_size=Размер репозитория
|
|||
size_format = `%[1]s: %[2]s; %[3]s: %[4]s`
|
||||
template=Шаблон
|
||||
template_select=Выберите шаблон
|
||||
template_helper=Сделать репозиторий шаблоном
|
||||
template_helper=Пометить репозиторий как шаблон
|
||||
template_description=Шаблонные репозитории дают возможность пользователям создавать новые репозитории с той же структурой каталогов, файлами и дополнительными настройками.
|
||||
visibility=Видимость
|
||||
visibility_description=Это увидят только владелец организации или участники при наличии прав.
|
||||
visibility_helper=Сделать репозиторий приватным
|
||||
visibility_description=Он будет видим только владельцу организации и её участникам при наличии прав.
|
||||
visibility_helper=Частный репозиторий
|
||||
visibility_helper_forced=Администратор сайта настроил параметр видимости новых репозиториев. Репозиторий приватный по умолчанию.
|
||||
visibility_fork_helper=(Это изменит видимость всех ответвлений.)
|
||||
clone_helper=Нужна помощь в клонировании? Посетите страницу <a target="_blank" rel="noopener noreferrer" href="%s">помощи</a>.
|
||||
|
@ -1091,16 +1093,16 @@ repo_desc=Описание
|
|||
repo_desc_helper=Добавьте краткое описание (необязательно)
|
||||
repo_lang=Язык
|
||||
repo_gitignore_helper=Выберите шаблоны .gitignore
|
||||
repo_gitignore_helper_desc=Выберите из списка шаблонов для популярных языков , какие файлы не надо отслеживать. По умолчанию в .gitignore включены типичные артефакты, создаваемые инструментами сборки каждого языка.
|
||||
repo_gitignore_helper_desc=Выберите шаблоны из списка для популярных языков. .gitignore определяет, какие файлы не надо отслеживать в проекте. По умолчанию в него включены типичные артефакты, создаваемые инструментами сборки каждого языка.
|
||||
issue_labels=Метки
|
||||
issue_labels_helper=Выберите набор меток
|
||||
license=Лицензия
|
||||
license_helper=Выберите лицензию
|
||||
license_helper_desc=Лицензия определяет, что другие люди могут, а что не могут делать с вашим кодом. Не уверены, какая лицензия подходит для вашего проекта? Смотрите <a target="_blank" rel="noopener noreferrer" href="%s">Выберите лицензию</a>.
|
||||
license_helper_desc=Лицензия определяет, что другие могут и не могут делать с вашим кодом. Не знаете, какая лицензия подойдёт для вашего проекта? Ознакомьтесь с <a target="_blank" rel="noopener noreferrer" href="%s">Выбором лицензии</a>.
|
||||
readme=README
|
||||
readme_helper=Выберите шаблон README
|
||||
readme_helper_desc=Это место, где вы можете написать подробное описание вашего проекта.
|
||||
auto_init=Инициализировать репозиторий (Добавляет .gitignore, LICENSE and README)
|
||||
auto_init=Инициализировать репозиторий
|
||||
trust_model_helper=Выберите модель доверия для проверки подписи. Возможные варианты:
|
||||
trust_model_helper_collaborator=Соучастник: доверять подписям соучастников
|
||||
trust_model_helper_committer=Автор коммита: доверять подписям, соответствующим авторам коммитов
|
||||
|
@ -1719,8 +1721,8 @@ issues.due_date_form_add=Добавить срок выполнения
|
|||
issues.due_date_form_edit=Изменить
|
||||
issues.due_date_form_remove=Удалить
|
||||
issues.due_date_not_set=Срок выполнения не установлен.
|
||||
issues.due_date_added=добавлен срок выполнения %s %s
|
||||
issues.due_date_modified=срок выполнения передвинут с %[2]s на %[1]s %[3]s
|
||||
issues.due_date_added=добавлен срок выполнения – %s, %s
|
||||
issues.due_date_modified=срок выполнения изменён с %[2]s на %[1]s %[3]s
|
||||
issues.due_date_remove=убран срок выполнения %s %s
|
||||
issues.due_date_overdue=Просроченные
|
||||
issues.due_date_invalid=Срок выполнения недействителен или находится за пределами допустимого диапазона. Пожалуйста, используйте формат «гггг-мм-дд».
|
||||
|
@ -2195,9 +2197,9 @@ settings.transfer_perform=Выполнить передачу
|
|||
settings.transfer_started=Репозиторий ожидает подтверждения передачи от «%s»
|
||||
settings.transfer_succeed=Репозиторий перенесён.
|
||||
settings.signing_settings=Настройки проверки подписей
|
||||
settings.trust_model=Модель доверия подписи
|
||||
settings.trust_model.default=Модель доверия по умолчанию
|
||||
settings.trust_model.default.desc=Использовать стандартную модель доверия репозитория для этой установки.
|
||||
settings.trust_model=Факторы доверия подписям
|
||||
settings.trust_model.default=Фактор доверия по умолчанию
|
||||
settings.trust_model.default.desc=Использовать фактор доверия по умолчанию, используемый на этом сервере.
|
||||
settings.trust_model.collaborator=Соучастник
|
||||
settings.trust_model.collaborator.long=Соучастник: доверять подписям соучастников
|
||||
settings.trust_model.collaborator.desc=Действительные подписи соучастников этого репозитория будут помечены как «доверенные» (независимо от того, соответствуют ли они автору коммита). В остальных случаях действительные подписи будут помечены как «недоверенные», если подпись соответствует автору коммита, и «не совпадающие», если нет.
|
||||
|
@ -2742,7 +2744,7 @@ pulls.made_using_agit = AGit
|
|||
activity.navbar.contributors = Соавторы
|
||||
activity.navbar.code_frequency = Частота изменений
|
||||
activity.navbar.recent_commits = Недавние коммиты
|
||||
settings.confirmation_string = Подтверждение
|
||||
settings.confirmation_string = Строка подтверждения
|
||||
settings.archive.text = Архивация репозитория сделает всё его содержимое доступным только для чтения. Он будет скрыт с домашнего экрана. Никто (включая вас!) не сможет добавлять коммиты, открывать задачи и запросы слияний.
|
||||
release.deletion_desc = Удаление выпуска удаляет его только в Forgejo. Это действие не затронет тег в git, содержимое репозитория и его историю. Продолжить?
|
||||
pulls.agit_explanation = Создано через рабочий поток AGit. С ним можно предлагать изменения, используя команду «git push», без необходимости в создании ответвления или новой ветви.
|
||||
|
@ -2850,6 +2852,22 @@ issues.num_reviews_few = %d рецензий
|
|||
issues.num_reviews_one = %d рецензия
|
||||
issues.summary_card_alt = Карточка со сводкой задачи "%s" в репозитории %s
|
||||
editor.add_tmpl.filename = имя файла
|
||||
settings.default_update_style_desc = Стиль обновления отстающих ветвей запросов на слияние по умолчанию.
|
||||
pulls.sign_in_require = <a href="%s">Войдите</a>, чтобы создать запрос слияния.
|
||||
new_from_template = Применить шаблон
|
||||
new_from_template_description = Вы можете выбрать любой шаблон репозитория на этом сервере и применить его настройки на этом репозитории.
|
||||
new_advanced = Расширенные настройки
|
||||
new_advanced_expand = Нажмите, чтобы раскрыть
|
||||
auto_init_description = Начать историю коммитов с добавления README и, если надо, лицензии и .gitignore.
|
||||
|
||||
summary_card_alt = Карточка со сводкой о репозитории %s
|
||||
issues.reaction.add = Добавить реакцию
|
||||
issues.reaction.alt_few = Реакция %[2]s от %[1]s.
|
||||
issues.reaction.alt_many = Реакция %[3]s от %[1]s и %[2]d других.
|
||||
issues.reaction.alt_remove = Убрать реакцию %[1]s с этого комментария.
|
||||
issues.reaction.alt_add = Добавить реакцию %[1]s к этому комментарию.
|
||||
issues.context.menu = Меню комментария
|
||||
release.summary_card_alt = Карточка со сводкой о выпуске «%s» в репозитории %s
|
||||
|
||||
[graphs]
|
||||
component_loading_failed = Не удалось загрузить %s
|
||||
|
@ -3315,13 +3333,13 @@ auths.invalid_openIdConnectAutoDiscoveryURL=Неверный URL для авто
|
|||
config.server_config=Конфигурация сервера
|
||||
config.app_name=Название сервера
|
||||
config.app_ver=Версия Forgejo
|
||||
config.app_url=Базовый URL Forgejo
|
||||
config.app_url=Базовый URL
|
||||
config.custom_conf=Путь к файлу конфигурации
|
||||
config.custom_file_root_path=Путь до каталога с файлами для персонализации
|
||||
config.domain=Домен сервера
|
||||
config.offline_mode=Локальный режим
|
||||
config.disable_router_log=Отключение журнала маршрутизатора
|
||||
config.run_user=Выполнение под пользователем
|
||||
config.run_user=Работа под пользователем
|
||||
config.run_mode=Режим работы
|
||||
config.git_version=Версия git
|
||||
config.app_data_path=Путь к данным приложения
|
||||
|
@ -3956,28 +3974,28 @@ fuzzy_tooltip = Включает результаты, достаточно по
|
|||
type_tooltip = Тип поиска
|
||||
fuzzy = Приблизительный
|
||||
match = Точный
|
||||
repo_kind = Поиск репозиториев...
|
||||
user_kind = Поиск пользователей...
|
||||
org_kind = Поиск организаций...
|
||||
team_kind = Поиск команд...
|
||||
code_kind = Поиск по коду...
|
||||
package_kind = Поиск пакетов...
|
||||
project_kind = Поиск проектов...
|
||||
branch_kind = Поиск ветвей...
|
||||
commit_kind = Поиск коммитов...
|
||||
repo_kind = Найти репозитории...
|
||||
user_kind = Найти пользователей...
|
||||
org_kind = Найти организации...
|
||||
team_kind = Найти команды...
|
||||
code_kind = Найти в коде...
|
||||
package_kind = Найти пакеты...
|
||||
project_kind = Найти проекты...
|
||||
branch_kind = Найти ветви...
|
||||
commit_kind = Найти коммиты...
|
||||
no_results = По запросу ничего не найдено.
|
||||
keyword_search_unavailable = Поиск по ключевым словам недоступен. Уточните подробности у администратора.
|
||||
keyword_search_unavailable = Поиск по ключевым словам недоступен. Уточните подробности у администратора сервера.
|
||||
match_tooltip = Включать только результаты, точно соответствующие запросу
|
||||
code_search_unavailable = Поиск по коду сейчас недоступен. Уточните подробности у администратора.
|
||||
runner_kind = Поиск исполнителей...
|
||||
code_search_by_git_grep = Эти результаты получены через «git grep». Результатов может быть больше, если администратор сервера включит индексатор кода.
|
||||
code_search_unavailable = Поиск в коде недоступен. Уточните подробности у администратора сервера.
|
||||
runner_kind = Найти исполнителей...
|
||||
code_search_by_git_grep = Эти результаты получены через «git grep». Результатов может быть больше, если на сервере будет включен индексатор кода.
|
||||
exact = Точный
|
||||
exact_tooltip = Включает только результаты, в точности соответствующие запросу
|
||||
issue_kind = Поиск задач...
|
||||
pull_kind = Поиск слияний...
|
||||
issue_kind = Найти задачи...
|
||||
pull_kind = Найти слияния...
|
||||
union_tooltip = Включает результаты с совпавшими ключевыми словами, разделёнными пробелами
|
||||
union = Обычный
|
||||
milestone_kind = Поиск этапов...
|
||||
milestone_kind = Найти этапы...
|
||||
regexp = Регулярное выражение
|
||||
regexp_tooltip = Интерпретировать поисковый запрос как регулярное выражение
|
||||
|
||||
|
@ -3988,7 +4006,7 @@ filepreview.lines = Строки с %[1]d по %[2]d в %[3]s
|
|||
filepreview.truncated = Предпросмотр был обрезан
|
||||
|
||||
[translation_meta]
|
||||
test = skip-ci routine :)
|
||||
test = forgejo :)
|
||||
|
||||
[repo.permissions]
|
||||
code.write = <b>Запись:</b> отправка изменений в репозиторий, создание веток и тегов.
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -17,10 +17,10 @@ page=Sayfa
|
|||
template=Şablon
|
||||
language=Dil
|
||||
notifications=Bildirimler
|
||||
active_stopwatch=Etkin Zaman Takibi
|
||||
active_stopwatch=Etkin Zaman Takipçisi
|
||||
tracked_time_summary=Konu listesi süzgeçlerine dayanan takip edilen zamanın özeti
|
||||
create_new=Oluştur…
|
||||
user_profile_and_more=Profil ve Ayarlar…
|
||||
user_profile_and_more=Profil ve ayarlar…
|
||||
signed_in_as=Giriş yapan:
|
||||
enable_javascript=Bu web sitesinin çalışması için JavaScript gereklidir.
|
||||
toc=İçindekiler Tablosu
|
||||
|
@ -28,12 +28,12 @@ licenses=Lisanslar
|
|||
return_to_forgejo=Forgejo'ya Dön
|
||||
|
||||
username=Kullanıcı Adı
|
||||
email=E-posta Adresi
|
||||
email=E-posta adresi
|
||||
password=Parola
|
||||
access_token=Erişim Kodu
|
||||
re_type=Parolayı Doğrula
|
||||
re_type=Parolayı doğrula
|
||||
captcha=CAPTCHA
|
||||
twofa=İki Aşamalı Doğrulama
|
||||
twofa=İki aşamalı doğrulama
|
||||
twofa_scratch=İki aşamalı kazınmış kod
|
||||
passcode=Şifre
|
||||
|
||||
|
@ -59,10 +59,10 @@ new_migrate=Yeni Göç
|
|||
new_mirror=Yeni Yansı
|
||||
new_fork=Yeni Depo Çatalı
|
||||
new_org=Yeni Organizasyon
|
||||
new_project=Yeni Proje
|
||||
new_project_column=Yeni Sütun
|
||||
new_project=Yeni proje
|
||||
new_project_column=Yeni sütun
|
||||
manage_org=Organizasyonları Yönet
|
||||
admin_panel=Site Yönetimi
|
||||
admin_panel=Site yönetimi
|
||||
account_settings=Hesap Ayarları
|
||||
settings=Ayarlar
|
||||
your_profile=Profil
|
||||
|
@ -87,9 +87,9 @@ rerun=Yeniden çalıştır
|
|||
rerun_all=Tüm görevleri yeniden çalıştır
|
||||
save=Kaydet
|
||||
add=Ekle
|
||||
add_all=Tümünü Ekle
|
||||
add_all=Tümünü ekle
|
||||
remove=Kaldır
|
||||
remove_all=Tümünü Kaldır
|
||||
remove_all=Tümünü kaldır
|
||||
remove_label_str=`"%s" öğesini kaldır`
|
||||
edit=Düzenle
|
||||
view=Görüntüle
|
||||
|
@ -118,7 +118,7 @@ go_back=Geri Git
|
|||
never=Asla
|
||||
unknown=Bilinmiyor
|
||||
|
||||
rss_feed=RSS Beslemesi
|
||||
rss_feed=RSS yayını
|
||||
|
||||
pin=Sabitle
|
||||
unpin=Sabitlemeyi kaldır
|
||||
|
@ -141,17 +141,17 @@ confirm_delete_selected=Tüm seçili öğeleri gerçekten silmek istiyor musunuz
|
|||
|
||||
name=İsim
|
||||
value=Değer
|
||||
copy_generic = Kopyala
|
||||
copy_generic = Panoya kopyala
|
||||
filter = Filtrele
|
||||
filter.not_archived = Arşivlenmemiş
|
||||
filter.clear = Filtreleri Temizle
|
||||
filter.is_archived = Arşivlenmiş
|
||||
filter.is_mirror = Yansılaştırılmış
|
||||
filter.is_fork = Çatallanmış
|
||||
filter.not_fork = Çatallanmamış
|
||||
filter.is_fork = Çatallar
|
||||
filter.not_fork = Çatallanmayanlar
|
||||
filter.not_mirror = Yansılanmamış
|
||||
filter.is_template = Şablon
|
||||
filter.not_template = Şablon değil
|
||||
filter.not_template = Şablon olmayan
|
||||
filter.public = Herkese açık
|
||||
filter.private = Gizli
|
||||
more_items = Daha fazla öğe
|
||||
|
@ -166,10 +166,12 @@ toggle_menu = Menüyü aç-kapa
|
|||
new_migrate.title = Yeni geçiş
|
||||
new_migrate.link = Yeni geçiş
|
||||
|
||||
copy_path = Dizini kopyala
|
||||
|
||||
[aria]
|
||||
navbar=Gezinti Çubuğu
|
||||
navbar=Gezinti çubuğu
|
||||
footer=Alt Bilgi
|
||||
footer.software=Yazılım Hakkında
|
||||
footer.software=Bu yazılım hakkında
|
||||
footer.links=Bağlantılar
|
||||
|
||||
[heatmap]
|
||||
|
@ -196,6 +198,13 @@ buttons.switch_to_legacy.tooltip=Eski düzenleyiciyi kullan
|
|||
buttons.enable_monospace_font=Eşaralıklı yazıtipini etkinleştir
|
||||
buttons.disable_monospace_font=Eşaralıklı yazıtipini devre dışı bırak
|
||||
|
||||
buttons.new_table.tooltip = Tablo ekle
|
||||
table_modal.header = Tablo ekle
|
||||
table_modal.placeholder.header = Başlık
|
||||
table_modal.placeholder.content = İçerik
|
||||
table_modal.label.rows = Satırlar
|
||||
table_modal.label.columns = Sütunlar
|
||||
|
||||
[filter]
|
||||
string.asc=A - Z
|
||||
string.desc=Z - A
|
||||
|
@ -224,12 +233,12 @@ install=Kurulum
|
|||
title=Başlangıç Yapılandırması
|
||||
docker_helper=Eğer Forgejo'yı Docker içerisinde çalıştırıyorsanız, lütfen herhangi bir değişiklik yapmadan önce <a target="_blank" rel="noopener noreferrer" href="%s">belgeleri</a> okuyun.
|
||||
require_db_desc=Forgejo MySQL, PostgreSQL, SQLite3 veya TiDB (MySQL protokolü) gerektirir.
|
||||
db_title=Veritabanı Ayarları
|
||||
db_type=Veritabanı Türü
|
||||
db_title=Veritabanı ayarları
|
||||
db_type=Veritabanı tipi
|
||||
host=Sunucu
|
||||
user=Kullanıcı adı
|
||||
password=Parola
|
||||
db_name=Veritabanı Adı
|
||||
db_name=Veritabanı adı
|
||||
db_schema=Şema
|
||||
db_schema_helper=Veritabanı varsayılanı için boş bırakın ("genel").
|
||||
ssl_mode=SSL
|
||||
|
@ -248,16 +257,16 @@ err_admin_name_is_reserved=Yönetici Kullanıcı Adı geçersiz, bu kullanıcı
|
|||
err_admin_name_pattern_not_allowed=Yönetici kullanıcı adı geçersiz, kullanıcı adı ayrılmış bir desenle eşleşiyor
|
||||
err_admin_name_is_invalid=Yönetici Kullanıcı Adı geçersiz
|
||||
|
||||
general_title=Genel Ayarlar
|
||||
general_title=Genel ayarlar
|
||||
app_name=Site Başlığı
|
||||
app_name_helper=Şirket adınızı buraya girebilirsiniz.
|
||||
repo_path=Depo Kök Yolu
|
||||
repo_path=Depo kök dizini
|
||||
repo_path_helper=Tüm uzak Git depoları bu dizine kaydedilecektir.
|
||||
lfs_path=Git LFS Kök Yolu
|
||||
lfs_path=Git LFS kök dizini
|
||||
lfs_path_helper=Git LFS tarafından izlenen dosyalar bu dizinde saklanacaktır. LFS'yi devre dışı bırakmak için boş bırakın.
|
||||
run_user=Şu Kullanıcı Olarak Çalıştır
|
||||
run_user_helper=Forgejo'nin çalışacağı işletim sistemi kullanıcı adı. Bu kullanıcının depo kök yoluna erişiminin olması gerektiğini unutmayın.
|
||||
domain=Sunucu Alan Adı
|
||||
domain=Sunucu alan adı
|
||||
domain_helper=Sunucu için alan adı veya ana bilgisayar adresi.
|
||||
ssh_port=SSH Sunucu Portu
|
||||
ssh_port_helper=SSH sunucusunun dinleyeceği port numarası. Etkisizleştimek için boş bırakın.
|
||||
|
@ -269,15 +278,15 @@ log_root_path=Günlük Dosyaları Yolu
|
|||
log_root_path_helper=Günlük dosyaları bu dizine kaydedilecektir.
|
||||
|
||||
optional_title=İsteğe Bağlı Ayarlar
|
||||
email_title=E-posta Ayarları
|
||||
smtp_addr=SMTP Sunucusu
|
||||
smtp_port=SMTP Portu
|
||||
email_title=E-posta ayarları
|
||||
smtp_addr=SMTP sunucusu
|
||||
smtp_port=SMTP portu
|
||||
smtp_from=E-posta Gönderen
|
||||
smtp_from_helper=Forgejo'nın kullanacağı e-posta adresi. Yalın bir e-posta adresi girin veya "İsim" <eposta@ornek.com> biçimini kullanın.
|
||||
mailer_user=SMTP Kullanıcı Adı
|
||||
mailer_password=SMTP Parolası
|
||||
mailer_user=SMTP kullanıcı adı
|
||||
mailer_password=SMTP parolası
|
||||
register_confirm=Kayıt için E-posta Doğrulaması Gereksin
|
||||
mail_notify=E-Posta Bildirimlerini Etkinleştir
|
||||
mail_notify=E-Posta bildirimlerini etkinleştir
|
||||
server_service_title=Sunucu ve Diğer Servis Ayarları
|
||||
offline_mode=Yerel Kipi Etkinleştir
|
||||
offline_mode.description=Üçüncü parti içerik teslim ağlarını etkisizleştirin ve bütün kaynakları yerelden sunun.
|
||||
|
@ -297,11 +306,11 @@ enable_captcha.description=Kullanıcının kendi kendine kaydolması için captc
|
|||
require_sign_in_view=Sayfaları Görüntülemek için Giriş Yapmak Gereksin
|
||||
require_sign_in_view.description=Sayfa erişimini giriş yapmış kullanıcılarla sınırlandır. Ziyaretçiler sadece oturum açma ve kayıt sayfalarını görecektir.
|
||||
admin_setting.description=Bir yönetici hesabı açmak isteğe bağlıdır. İlk kayıt olan kullanıcı kendiliğinden yönetici olacaktır.
|
||||
admin_title=Yönetici Hesabı Ayarları
|
||||
admin_name=Yönetici Kullanıcı Adı
|
||||
admin_title=Yönetici hesabı ayarları
|
||||
admin_name=Yönetici kullanıcı adı
|
||||
admin_password=Parola
|
||||
confirm_password=Parolayı Doğrula
|
||||
admin_email=E-posta Adresi
|
||||
confirm_password=Parolayı doğrula
|
||||
admin_email=E-posta adresi
|
||||
install_btn_confirm=Forgejo'u Kur
|
||||
test_git_failed='git' komut testi başarısız: %v
|
||||
sqlite3_not_available=Bu Gieta sürümü SQLite3 desteklemiyor. Lütfen %s adresinden resmi çalışır sürümü ('gobuild' sürümünü değil) indirin.
|
||||
|
@ -316,7 +325,7 @@ save_config_failed=%v Yapılandırması kaydedilirken hata oluştu
|
|||
invalid_admin_setting=Yönetici hesap ayarları geçersiz: %v
|
||||
invalid_log_root_path=Log dosya yolu geçersiz: %v
|
||||
default_keep_email_private=E-posta adreslerini varsayılan olarak gizle
|
||||
default_keep_email_private.description=Yeni kullanıcı hesaplarının e-posta adreslerini varsayılan olarak gizle.
|
||||
default_keep_email_private.description=Kayıt olunduktan hemen sonra bilgi sızıntısı olmaması için yeni kullanıcı hesaplarının e-posta adreslerini varsayılan olarak gizle.
|
||||
default_allow_create_organization=Varsayılan Olarak Organizasyon Oluşturmaya İzin Ver
|
||||
default_allow_create_organization.description=Varsayılan olarak yeni kullanıcı hesaplarının organizasyon oluşturmasına izin ver.
|
||||
default_enable_timetracking=Varsayılan Olarak Zaman Takibini Etkinleştir
|
||||
|
@ -326,7 +335,7 @@ no_reply_address_helper=Gizlenmiş e-posta adresine sahip kullanıcılar için a
|
|||
password_algorithm=Parola Hash Algoritması
|
||||
invalid_password_algorithm=Hatalı parola hash algoritması
|
||||
password_algorithm_helper=Parola hash algoritmasını ayarlayın. Algoritmalar değişen gereksinimlere ve güce sahiptirler. argon2 algoritması iyi özelliklere sahip olmasına rağmen fazla miktarda bellek kullanır ve küçük sistemler için uygun olmayabilir.
|
||||
enable_update_checker=Güncelleme Denetleyicisini Etkinleştir
|
||||
enable_update_checker=Güncelleme denetleyicisini etkinleştir
|
||||
env_config_keys=Ortam Yapılandırma
|
||||
env_config_keys_prompt=Aşağıdaki ortam değişkenleri de yapılandırma dosyanıza eklenecektir:
|
||||
allow_only_external_registration = Sadece dış hizmetler aracılığıyla kullanıcı kaydına izin ver
|
||||
|
@ -336,7 +345,7 @@ enable_update_checker_helper_forgejo = release.forgejo.org adresindeki TXT DNS k
|
|||
allow_dots_in_usernames = Kullanıcı isimlerinde noktaya izin ver. Var olan kullanıcıları etkilemez.
|
||||
|
||||
[home]
|
||||
uname_holder=Kullanıcı Adı veya E-Posta Adresi
|
||||
uname_holder=Kullanıcı adı veya e-posta adresi
|
||||
password_holder=Parola
|
||||
switch_dashboard_context=Panoya Geçiş Yap
|
||||
my_repos=Depolar
|
||||
|
@ -389,13 +398,13 @@ forks_one = %d çatal
|
|||
forks_few = %d çatal
|
||||
|
||||
[auth]
|
||||
create_new_account=Hesap Oluştur
|
||||
create_new_account=Hesap oluştur
|
||||
register_helper_msg=Bir hesabınız var mı? Şimdi giriş yapın!
|
||||
social_register_helper_msg=Hesabınız var mı? Hemen bağlayın!
|
||||
disable_register_prompt=Kayıt işlemi devre dışıdır. Lütfen site yöneticinizle iletişim kurun.
|
||||
disable_register_mail=Kayıt için e-posta doğrulama devre dışıdır.
|
||||
manual_activation_only=Etkinleştirmeyi tamamlamak için site yöneticinizle bağlantıya geçin.
|
||||
remember_me=Bu Aygıtı hatırla
|
||||
remember_me=Bu cihazı hatırla
|
||||
remember_me.compromised=Oturum açma tokeni artık geçerli değil, bu ele geçirilmiş bir hesaba işaret ediyor olabilir. Lütfen hesabınızda olağandışı faaliyet olup olmadığını denetleyin.
|
||||
forgot_password_title=Şifremi unuttum
|
||||
forgot_password=Şifrenizi mi unuttunuz?
|
||||
|
@ -414,7 +423,7 @@ has_unconfirmed_mail=Merhaba %s, doğrulanmamış bir e-posta adresin var (<b>%s
|
|||
resend_mail=Etkinleştirme e-postasını tekrar almak için buraya tıklayın
|
||||
email_not_associate=Bu e-posta adresi hiçbir hesap ile ilişkilendirilmemiştir.
|
||||
send_reset_mail=Hesap Kurtarma E-postası Gönder
|
||||
reset_password=Hesap Kurtarma
|
||||
reset_password=Hesap kurtarma
|
||||
invalid_code=Doğrulama kodunuz geçersiz veya süresi dolmuş.
|
||||
invalid_code_forgot_password=Onay kodunuz hatalı veya süresi geçmiş. Yeni bir oturum başlatmak için <a href="%s">buraya</a> tıklayın.
|
||||
invalid_password=Parolanız hesap oluşturulurken kullanılan parolayla eşleşmiyor.
|
||||
|
@ -428,9 +437,9 @@ use_scratch_code=Bir çizgi kodu kullanınız
|
|||
twofa_scratch_used=Geçici kodunuzu kullandınız. İki aşamalı ayarlar sayfasına yönlendirildiniz, burada aygıt kaydınızı kaldırabilir veya yeni bir geçici kod oluşturabilirsiniz.
|
||||
twofa_passcode_incorrect=Şifreniz yanlış. Aygıtınızı yanlış yerleştirdiyseniz, oturum açmak için çizgi kodunuzu kullanın.
|
||||
twofa_scratch_token_incorrect=Çizgi kodunuz doğru değildir.
|
||||
login_userpass=Oturum Aç
|
||||
login_userpass=Oturum aç
|
||||
tab_openid=Açık Kimlik
|
||||
oauth_signup_tab=Yeni Hesap Oluştur
|
||||
oauth_signup_tab=Yeni hesap oluştur
|
||||
oauth_signup_title=Yeni Hesabı Tamamla
|
||||
oauth_signup_submit=Hesabı Tamamla
|
||||
oauth_signin_tab=Mevcut Hesaba Bağla
|
||||
|
@ -467,6 +476,8 @@ hint_register = Hesaba ihtiyacın var mı? <a href="%s">Hemen kaydol.</a>
|
|||
sign_in_openid = OpenID ile giriş yap
|
||||
hint_login = Mevcut hesabın var mı? <a href="%s">Hemen giriş yap!</a>
|
||||
|
||||
use_onetime_code = Tek kullanımlık kod kullan
|
||||
|
||||
[mail]
|
||||
view_it_on=%s üzerinde görüntüle
|
||||
reply=veya doğrudan bu e-postayı yanıtlayın
|
||||
|
@ -544,6 +555,8 @@ password_change.subject = Parolanız değişti
|
|||
admin.new_user.user_info = Kullanıcı bilgisi
|
||||
admin.new_user.text = Lütfen bu kullanıcıyı admin panelinden yönetmek için <a href="%s">buraya tıklayın</a>.
|
||||
|
||||
password_change.text_1 = Hesabınızın parolası değişti.
|
||||
|
||||
[modal]
|
||||
yes=Evet
|
||||
no=Hayır
|
||||
|
@ -652,6 +665,9 @@ Location = Konum
|
|||
Website = Websitesi
|
||||
|
||||
|
||||
username_error_no_dots = ` sadece alfanumerik karakterler ("0-9","a-z","A-Z"), tire ("-") ve alt tire ("-") içerebilir. Alfanumerik olmayan karakterlerle başlayamaz ve bitemez, ayrıca ardışık alfanumerik olmayan karakterler de kullanılamaz.`
|
||||
admin_cannot_delete_self = Yöneticiyken kullanıcınızı silemezsiniz. Lütfen önce yönetici yetkilerinizi kaldırın.
|
||||
|
||||
[user]
|
||||
change_avatar=Profil resmini değiştir…
|
||||
joined_on=%s tarihinde katıldı
|
||||
|
@ -691,6 +707,10 @@ block = Engelle
|
|||
public_activity.visibility_hint.self_private = Aktiviteniz sadece size ve oluşum yöneticilerine açıktır. <a href="%s">Değiştir</a>.
|
||||
followers_one = %d takipçi
|
||||
|
||||
block_user.detail = Bu kullanıcıyı engellediğinizde:
|
||||
block_user.detail_1 = Birbirinizden takipten çıkacak ve birbirinizi takip edemeyeceksiniz.
|
||||
block_user.detail_2 = Bu kullanıcı sahip olduğunuz depolar, açtığınız sorunlar ve yaptığınız yorumlar ile etkileşime geçemeyecek.
|
||||
|
||||
[settings]
|
||||
profile=Profil
|
||||
account=Hesap
|
||||
|
@ -3663,7 +3683,7 @@ need_approval_desc=Değişiklik isteği çatalında iş akışı çalıştırmak
|
|||
|
||||
variables=Değişkenler
|
||||
variables.management=Değişken Yönetimi
|
||||
variables.creation=Değişken Ekle
|
||||
variables.creation=Değişken ekle
|
||||
variables.none=Henüz hiçbir değişken yok.
|
||||
variables.deletion=Değişkeni kaldır
|
||||
variables.deletion.description=Bir değişkeni kaldırma kalıcıdır ve geri alınamaz. Devam edilsin mi?
|
||||
|
@ -3684,6 +3704,8 @@ type-1.display_name=Kişisel Proje
|
|||
type-2.display_name=Depo Projesi
|
||||
type-3.display_name=Organizasyon Projesi
|
||||
|
||||
deleted.display_name = Silinmiş proje
|
||||
|
||||
[git.filemode]
|
||||
changed_filemode=%[1]s → %[2]s
|
||||
directory=Dizin
|
||||
|
@ -3714,3 +3736,6 @@ issue_kind = Sorunları ara...
|
|||
pull_kind = Birleştirme isteklerini ara...
|
||||
code_search_by_git_grep = Anlık kod araması sonuçları "git grep" komutu tarafından sağlanmaktadır. Site yöneticisinin kod endekslemesini açması durumunda daha iyi sonuçlar verilmesi mümkün olabilir.
|
||||
keyword_search_unavailable = Anahtar kelime ile arama şu anda kullanıma açık değildir. Lütfen site yöneticisi ile iletişime geçin.
|
||||
fuzzy_tooltip = Arama terimine yakın olan eşleşmeleri dahil et
|
||||
union_tooltip = Boşlukla ayrılmış anahtar kelime eşleşmelerini dahil et
|
||||
exact_tooltip = Sadece arama terimiyle tam uyuşan sonuçları dahit et.
|
||||
|
|
|
@ -143,13 +143,13 @@ filter.clear = Очистити фільтри
|
|||
filter.is_archived = Архівовано
|
||||
filter = Фільтри
|
||||
toggle_menu = Перемкнути видимість меню
|
||||
confirm_delete_artifact = Ви впевнені, що хочете видалити артефакт "%s"?
|
||||
confirm_delete_artifact = Ви впевнені, що хочете видалити артефакт «%s»?
|
||||
artifacts = Артефакти
|
||||
filter.not_archived = Не архівовано
|
||||
filter.public = Загальнодоступні
|
||||
filter.private = Приватні
|
||||
more_items = Більше пунктів
|
||||
remove_label_str = Видалити об'єкт "%s"
|
||||
remove_label_str = Видалити об'єкт «%s»
|
||||
new_repo.title = Новий репозиторій
|
||||
new_migrate.title = Нова міграція
|
||||
new_org.title = Нова організація
|
||||
|
@ -334,7 +334,7 @@ password_algorithm=Алгоритм хешування пароля
|
|||
config_location_hint = Ці опції налаштувань будуть збережені в:
|
||||
env_config_keys = Конфігурація середовища
|
||||
env_config_keys_prompt = Ці змінні середовища будуть також застосовані до вашого файлу конфігурації:
|
||||
invalid_db_table = База даних "%s" недійсна: %v
|
||||
invalid_db_table = База даних «%s» недійсна: %v
|
||||
enable_update_checker = Увімкнути перевірку оновлень
|
||||
require_db_desc = Forgejo вимагає MySQL, PostgreSQL, SQLite3 чи TiDB (протокол MySQL).
|
||||
allow_only_external_registration = Дозволити реєстрацію тільки через зовнішні сервіси
|
||||
|
@ -474,6 +474,10 @@ sign_up_successful = Обліковий запис успішно створен
|
|||
unauthorized_credentials = Хибні або прострочені дані для входу. Спробуйте ще раз або перейдіть до %s по докладнішу інформацію
|
||||
use_onetime_code = Користати одноразовий код
|
||||
|
||||
oauth.signin.error = Виникла помилка при обробці запиту на авторизацію. Якщо ця помилка буде повторюватись, зверніться до адміністратора сайту.
|
||||
authorization_failed_desc = Авторизація не відбулася: виявлено недійсний запит. Будь ласка, зверніться до розробника програми, яку ви намагалися авторизувати.
|
||||
password_pwned = Вибраний вами пароль є у <a target="_blank" rel="noopener noreferrer" href="%s">списку викрадених паролів</a>, виявлених під час витоків даних. Будь ласка, спробуйте ще раз з іншим паролем. Варто також змінити цей пароль в інших місцях.
|
||||
|
||||
[mail]
|
||||
view_it_on=Переглянути на %s
|
||||
link_not_working_do_paste=Посилання не працює? Спробуйте його скопіювати та вставити у свій браузер.
|
||||
|
@ -555,6 +559,9 @@ totp_enrolled.text_1.has_webauthn = Ви щойно задіяли TOTP для
|
|||
totp_enrolled.text_1.no_webauthn = Ви щойно задіяли TOTP для свого облікового запису. Всі наступні спроби входу вимагатимуть використання TOTP як засобу двофакторної автентифікації.
|
||||
|
||||
|
||||
totp_disabled.no_2fa = Не налаштовано жодного засобу двофакторної автентифікації. Це означає, що ви можете входити у свій обліковий запис без необхідності використовувати двофакторну автентифікацію.
|
||||
removed_security_key.no_2fa = Не налаштовано жодного засобу двофакторної автентифікації. Це означає, що ви можете входити у свій обліковий запис без необхідності використовувати двофакторну автентифікацію.
|
||||
|
||||
[modal]
|
||||
yes=Так
|
||||
no=Ні
|
||||
|
@ -645,12 +652,25 @@ Pronouns = Займенники
|
|||
Biography = Про себе
|
||||
FullName = Повне ім'я
|
||||
Website = Вебсайт
|
||||
url_error = `"%s" є недійсним посиланням.`
|
||||
url_error = `«%s» є недійсним посиланням.`
|
||||
To = Назва гілки
|
||||
Location = Розташування
|
||||
AccessToken = Токен доступу
|
||||
|
||||
|
||||
include_error = ` має містити підрядок «%s».`
|
||||
invalid_group_team_map_error = ` призначення недійсне: %s`
|
||||
repository_force_private = Увімкнено примусову приватність: приватні репозиторії не можна зробити публічними.
|
||||
openid_been_used = Адреса OpenID «%s» вже використовується.
|
||||
unset_password = Для користувача не встановлено пароль.
|
||||
unsupported_login_type = Цей тип входу не підтримує видалення облікового запису.
|
||||
duplicate_invite_to_team = Цього користувача вже запрошено як учасника команди.
|
||||
organization_leave_success = Ви успішно покинули організацію %s.
|
||||
must_use_public_key = Ключ, який ви надали, є приватним. Будь ласка, нікуди не завантажуйте свій приватний ключ. Використовуйте замість нього публічний ключ.
|
||||
unable_verify_ssh_key = Не вдалося перевірити ключ SSH, перевірте його на наявність помилок.
|
||||
still_has_org = Ваш обліковий запис є учасником однієї або декількох організацій, спочатку покиньте їх.
|
||||
admin_cannot_delete_self = Ви не можете видалити себе, якщо ви є адміністратором. Спочатку зніміть із себе права адміністратора.
|
||||
|
||||
[user]
|
||||
change_avatar=Змінити свій аватар…
|
||||
repositories=Репозиторії
|
||||
|
@ -687,6 +707,9 @@ following.title.one = Відстежуваний
|
|||
following.title.few = Відстежувані
|
||||
|
||||
|
||||
form.name_reserved = Ім'я користувача «%s» зарезервовано.
|
||||
form.name_chars_not_allowed = Ім'я користувача «%s» містить неприпустимі символи.
|
||||
|
||||
[settings]
|
||||
profile=Профіль
|
||||
account=Обліковий запис
|
||||
|
@ -844,7 +867,7 @@ unbind=Від'єднати
|
|||
manage_access_token=Токени доступу
|
||||
generate_new_token=Згенерувати новий токен
|
||||
tokens_desc=Ці токени надають доступ до вашого облікового запису за допомогою Forgejo API.
|
||||
token_name=Ім'я токену
|
||||
token_name=Ім'я токена
|
||||
generate_token=Згенерувати токен
|
||||
generate_token_success=Ваш новий токен був створений. Скопіюйте його зараз, оскільки він не буде показаний знову.
|
||||
generate_token_name_duplicate=Назва програми <strong>%s</strong> вже використовується. Будь ласка, використайте нову.
|
||||
|
@ -861,7 +884,7 @@ oauth2_applications_desc=Програми OAuth2 дають можливість
|
|||
remove_oauth2_application=Видалити програму OAuth2
|
||||
remove_oauth2_application_desc=Видалення програми OAuth2 скасовує доступ до всіх підписаних маркерів доступу. Продовжити?
|
||||
remove_oauth2_application_success=Програму видалено.
|
||||
create_oauth2_application=Створити нову програму OAuth2
|
||||
create_oauth2_application=Створити новий додаток OAuth2
|
||||
create_oauth2_application_button=Створити програму
|
||||
oauth2_application_name=Назва програми
|
||||
save_application=Зберегти
|
||||
|
@ -930,7 +953,7 @@ hidden_comment_types = Приховані типи коментарів
|
|||
keep_activity_private = Приховати активність зі сторінки профілю
|
||||
blocked_users = Заблоковані користувачі
|
||||
blocked_users_none = Немає заблокованих користувачів.
|
||||
profile_desc = Керуйте тим, як ваш профіль відображається іншим користувачам. Ваша основна адреса електронної пошти буде використовуватися для сповіщень, відновлення пароля та операцій з Git через веб-інтерфейс.
|
||||
profile_desc = Про себе
|
||||
retype_new_password = Підтвердіть новий пароль
|
||||
email_desc = Ваша основна адреса електронної пошти буде використовуватися для сповіщень, відновлення пароля і, за умови, що вона не прихована, для операцій з Git через веб-інтерфейс.
|
||||
visibility.limited_tooltip = Видимий(а) тільки для авторизованих користувачів
|
||||
|
@ -965,6 +988,28 @@ comment_type_group_pull_request_push = Додані коміти
|
|||
permissions_public_only = Тільки публічні
|
||||
select_permissions = Виберіть дозволи
|
||||
permissions_access_all = Усі (публічні, приватні й обмежені)
|
||||
create_oauth2_application_success = Ви успішно створили новий додаток OAuth2.
|
||||
keep_email_private_popup = Ваша адреса електронної пошти не буде відображатися у вашому профілі і не буде використовуватися за замовчуванням для комітів, зроблених через веб-інтерфейс, таких як завантаження файлів, редагування і об'єднання комітів. Натомість ви можете використовувати спеціальну адресу %s для прив'язки комітів до свого облікового запису. Ця опція не вплине на існуючі коміти.
|
||||
|
||||
uid = UID
|
||||
pronouns_custom_label = Інші займенники
|
||||
uploaded_avatar_is_too_big = Розмір завантаженого файлу (%d КіБ) перевищує максимальний розмір (%d КіБ).
|
||||
can_not_add_email_activations_pending = Очікується активація, спробуйте ще раз за кілька хвилин, якщо хочете додати нову адресу електронної пошти.
|
||||
verify_gpg_key_success = Ключ GPG «%s» перевірено.
|
||||
ssh_invalid_token_signature = Наданий SSH-ключ, підпис або токен не збігаються або токен застарів.
|
||||
key_signature_ssh_placeholder = Починається з «-----BEGIN SSH SIGNATURE-----»
|
||||
verify_ssh_key_success = Ключ SSH «%s» перевірено.
|
||||
add_key_success = Ключ SSH «%s» додано.
|
||||
add_gpg_key_success = Ключ GPG «%s» додано.
|
||||
added_on = Додано %s
|
||||
valid_until_date = Дійсний до %s
|
||||
ssh_signonly = SSH наразі вимкнено, тому ці ключі використовуються лише для перевірки підпису комітів.
|
||||
repo_and_org_access = Доступ до репозиторію та організації
|
||||
permission_no_access = Немає доступу
|
||||
permission_write = Читання і запис
|
||||
at_least_one_permission = Для створення токена необхідно вибрати хоча б один дозвіл
|
||||
repos_none = Ви не є власником жодного репозиторію.
|
||||
blocked_since = Заблокований з %s
|
||||
|
||||
[repo]
|
||||
owner=Власник
|
||||
|
@ -1004,7 +1049,7 @@ license_helper_desc=Ліцензія регулює те, що інші можу
|
|||
readme=README
|
||||
readme_helper=Виберіть шаблон README
|
||||
readme_helper_desc=Це місце, де ви можете написати повний опис вашого проєкту.
|
||||
auto_init=Ініціалізувати репозиторій (Додає .gitignore, License та README)
|
||||
auto_init=Ініціалізувати репозиторій
|
||||
trust_model_helper=Виберіть модель довіри для підтвердження підпису. Можливі варіанти:
|
||||
trust_model_helper_collaborator=Співавтор: підписи довіри від співавторів
|
||||
trust_model_helper_committer=Учасник: довірені підписи участників
|
||||
|
@ -1066,7 +1111,7 @@ template.one_item=Слід обрати хоча б один елемент ша
|
|||
template.invalid=Слід обрати шаблонний репозиторій
|
||||
|
||||
archive.issue.nocomment=Цей репозиторій архівовано. Ви не можете коментувати задачі.
|
||||
archive.pull.nocomment=Це архівний репозитарій. Ви не можете коментувати пулл-реквести.
|
||||
archive.pull.nocomment=Цей репозиторій архівовано. Ви не можете коментувати запити на злиття.
|
||||
|
||||
form.reach_limit_of_creation_1=Ви вже досягли ліміту в %d репозиторіїв.
|
||||
form.reach_limit_of_creation_n=Ви досягли максимальної кількості %d створених репозиторіїв.
|
||||
|
@ -1088,7 +1133,7 @@ migrate_items_merge_requests=Запити на об'єднання
|
|||
migrate_items_releases=Релізи
|
||||
migrate_repo=Перенести репозиторій
|
||||
migrate.clone_address=Міграція / клонувати з URL-адреси
|
||||
migrate.clone_address_desc=URL-адреса HTTP(S) або Git "clone" існуючого репозиторія
|
||||
migrate.clone_address_desc=URL-адреса HTTP(S) або Git «clone» існуючого репозиторію
|
||||
migrate.clone_local_path=або шлях до локального серверу
|
||||
migrate.permission_denied=Вам не дозволено імпортувати локальні репозиторії.
|
||||
migrate.permission_denied_blocked=Ви не можете імпортувати з заборонених вузлів, будь ласка, попросіть адміністратора перевірити налаштування ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS.
|
||||
|
@ -2070,7 +2115,7 @@ settings.lfs_findcommits=Знайти коміти
|
|||
settings.lfs_lfs_file_no_commits=Не знайдено комітів для цього файлу LFS
|
||||
settings.lfs_noattribute=Цей шлях не має атрибуту блокування в гілці за замовчуванням
|
||||
settings.lfs_delete=Видалити файл LFS з OID %s
|
||||
settings.lfs_delete_warning=Видалення файлу LFS може спричинити помилки "Об'єкт не існує" під час перевірки. Ви впевнені?
|
||||
settings.lfs_delete_warning=Видалення файлу LFS може спричинити помилки «Об'єкт не існує» під час перевірки. Ви впевнені?
|
||||
settings.lfs_findpointerfiles=Знайти файли-посилання
|
||||
settings.lfs_locks=Блокування
|
||||
settings.lfs_invalid_locking_path=Неприпустимий шлях: %s
|
||||
|
@ -2422,6 +2467,18 @@ editor.add_tmpl.filename = назва файлу
|
|||
settings.unarchive.button = Розархівувати репозиторій
|
||||
object_format = Формат об'єкта
|
||||
settings.archive.mirrors_unavailable = Дзеркала недоступні в архівованих репозиторіях.
|
||||
pulls.sign_in_require = <a href="%s">Увійдіть</a>, щоб створити новий запит на злиття.
|
||||
new_advanced_expand = Натисніть, щоб розгорнути
|
||||
new_from_template = Використати шаблон
|
||||
new_advanced = Додаткові налаштування
|
||||
auto_init_description = Почніть історію Git з README і за бажанням додайте файли License та .gitignore.
|
||||
new_from_template_description = Можете вибрати наявний шаблон репозиторію на цьому екземплярі і застосувати його налаштування.
|
||||
form.string_too_long = Довжина введеного рядка більша за %d символів.
|
||||
form.name_reserved = Назву репозиторію «%s» зарезервовано.
|
||||
form.name_pattern_not_allowed = Шаблон «%s» не допускається у назві репозиторію.
|
||||
|
||||
wiki.reserved_page = Назву вікі-сторінки «%s» зарезервовано.
|
||||
settings.wiki_rename_branch_main_desc = Перейменувати внутрішню гілку, яка використовується у вікі, на «%s». Ця зміна є остаточною і її неможливо скасувати.
|
||||
|
||||
[graphs]
|
||||
contributors.what = внески
|
||||
|
@ -2543,6 +2600,8 @@ follow_blocked_user = Ви не можете стежити за цією орг
|
|||
teams.invite.description = Щоб приєднатися до команди, натисніть кнопку нижче.
|
||||
teams.invite.title = Вас запрошено приєднатися до команди <strong>%s</strong> в організації <strong>%s</strong>.
|
||||
|
||||
form.name_reserved = Назву організації «%s» зарезервовано.
|
||||
|
||||
[admin]
|
||||
dashboard=Панель управління
|
||||
users=Облікові записи користувачів
|
||||
|
@ -2797,15 +2856,15 @@ auths.tips.oauth2.general=Автентифікація OAuth2
|
|||
auths.tip.oauth2_provider=Постачальник OAuth2
|
||||
auths.tip.bitbucket=Створіть OAuth URI на сторінці %s
|
||||
auths.tip.nextcloud=`Зареєструйте нового споживача OAuth у вашому екземплярі за допомогою наступного меню "Налаштування -> Безпека -> клієнт OAuth 2.0"`
|
||||
auths.tip.dropbox=Додайте новий додаток на %s
|
||||
auths.tip.facebook=`Створіть новий додаток на %s і додайте модуль "Facebook Login"`
|
||||
auths.tip.github=Додайте OAuth додаток на %s
|
||||
auths.tip.dropbox=Створіть новий додаток на %s
|
||||
auths.tip.facebook=Зареєструйте новий додаток на %s і додайте модуль «Facebook Login»
|
||||
auths.tip.github=Зареєструйте новий додаток OAuth на %s
|
||||
auths.tip.gitlab=Додайте новий додаток на https://gitlab.com/profile/applications
|
||||
auths.tip.google_plus=Отримайте облікові дані клієнта OAuth2 в консолі Google API на сторінці %s
|
||||
auths.tip.openid_connect=Використовуйте OpenID Connect Discovery URL (<server>/.well-known/openid-configuration) для автоматичної настройки входу OAuth
|
||||
auths.tip.twitter=Перейдіть на %s, створіть програму і переконайтеся, що включена опція «Дозволити цю програму для входу в систему за допомогою Twitter»
|
||||
auths.tip.discord=Зареєструйте новий додаток на %s
|
||||
auths.tip.yandex=`Створіть нову програму в %s. Виберіть наступні дозволи з "Yandex. assport API": "Доступ до адреси електронної пошти", "Доступ до аватара" і "Доступ до імені користувача, імені та прізвища, статі"`
|
||||
auths.tip.yandex=Створіть новий додаток на %s. Виберіть наступні дозволи з «Yandex.Passport API»: «Доступ до адреси електронної пошти», «Доступ до аватара» і «Доступ до імені користувача, імені та прізвища, статі»
|
||||
auths.tip.mastodon=Введіть URL спеціального екземпляра для екземпляра mastodon, який ви хочете автентифікувати за допомогою (або використовувати за замовчуванням)
|
||||
auths.edit=Редагувати джерело автентифікації
|
||||
auths.activated=Це джерело авторизації активоване
|
||||
|
@ -2830,7 +2889,7 @@ config.disable_router_log=Вимкнути логування роутеру
|
|||
config.run_user=Користувач, від якого запустити
|
||||
config.run_mode=Режим виконання
|
||||
config.git_version=Версія Git
|
||||
config.repo_root_path=Кореневий шлях репозиторія
|
||||
config.repo_root_path=Шлях до кореня репозиторію
|
||||
config.lfs_root_path=Кореневий шлях LFS
|
||||
config.log_file_root_path=Шлях до лог файлу
|
||||
config.script_type=Тип скрипта
|
||||
|
@ -2953,7 +3012,7 @@ monitor.desc=Опис
|
|||
monitor.start=Час початку
|
||||
monitor.execute_time=Час виконання
|
||||
monitor.process.cancel=Зупинити процес
|
||||
monitor.process.cancel_desc=Зупинка процесу може призвести до втрати даних
|
||||
monitor.process.cancel_desc=Скасування процесу може призвести до втрати даних
|
||||
monitor.process.cancel_notices=Зупинити: <strong>%s</strong>?
|
||||
monitor.process.children=Дочірні процеси
|
||||
|
||||
|
@ -3020,8 +3079,12 @@ monitor.queue.settings.desc = Пули динамічно зростають у
|
|||
monitor.queue.settings.remove_all_items_done = Усі елементи в черзі видалено.
|
||||
monitor.queue.settings.remove_all_items = Видалити всі
|
||||
config.app_slogan = Гасло екземпляра
|
||||
auths.tip.gitea = Зареєструйте новий додаток OAuth. Інструкцію можна знайти на %s
|
||||
auths.tip.gitlab_new = Зареєструйте новий додаток на %s
|
||||
|
||||
|
||||
users.reserved = Зарезервовано
|
||||
|
||||
[action]
|
||||
create_repo=створив(ла) репозиторій <a href="%s">%s</a>
|
||||
rename_repo=репозиторій перейменовано з <code>%[1]s</code> на <a href="%[2]s">%[3]s</a>
|
||||
|
@ -3193,6 +3256,10 @@ rubygems.dependencies.development = Залежності розробки
|
|||
npm.dependencies.optional = Необов'язкові залежності
|
||||
container.images.title = Образи
|
||||
|
||||
settings.delete.description = Видалення пакунка є остаточним і його неможливо скасувати.
|
||||
owner.settings.cleanuprules.keep.count.1 = 1 версію на пакунок
|
||||
owner.settings.cleanuprules.keep.count.n = %d версій на пакунок
|
||||
|
||||
[secrets]
|
||||
deletion = Видалити секрет
|
||||
creation.success = Секрет «%s» додано.
|
||||
|
@ -3307,7 +3374,7 @@ milestone_kind = Шукати віхи...
|
|||
commit_kind = Шукати коментарі...
|
||||
no_results = Не знайдено відповідних результатів.
|
||||
keyword_search_unavailable = Пошук за ключовими словами наразі недоступний. Будь ласка, зв'яжіться з адміністратором сайту.
|
||||
code_search_by_git_grep = Поточні результати пошуку коду надаються з "git grep". Тут можуть бути кращі результати, якщо адміністратор сайту ввімкнув індексацію коду.
|
||||
code_search_by_git_grep = Поточні результати пошуку коду надаються з «git grep». Тут можуть бути кращі результати, якщо адміністратор сайту ввімкнув індексацію коду.
|
||||
package_kind = Шукати пакунки...
|
||||
project_kind = Шукати проєкти...
|
||||
branch_kind = Шукати гілки...
|
||||
|
|
|
@ -126,7 +126,7 @@ unpin=取消置顶
|
|||
artifacts=制品
|
||||
confirm_delete_artifact=您确定要删除制品“%s”吗?
|
||||
|
||||
archived=已归档
|
||||
archived=已存档
|
||||
|
||||
concept_system_global=全局
|
||||
concept_user_individual=个人
|
||||
|
@ -144,8 +144,8 @@ name=名称
|
|||
value=值
|
||||
filter = 筛选
|
||||
filter.clear = 清除筛选条件
|
||||
filter.is_archived = 已归档
|
||||
filter.not_archived = 未归档
|
||||
filter.is_archived = 已存档
|
||||
filter.not_archived = 未存档
|
||||
filter.is_fork = 是派生
|
||||
filter.not_fork = 不是派生
|
||||
filter.is_mirror = 是镜像
|
||||
|
@ -199,7 +199,7 @@ buttons.switch_to_legacy.tooltip=使用旧版编辑器
|
|||
buttons.enable_monospace_font=启用等宽字体
|
||||
buttons.disable_monospace_font=禁用等宽字体
|
||||
buttons.unindent.tooltip = 解除一级嵌套条目
|
||||
buttons.indent.tooltip = 解除一级嵌套条目
|
||||
buttons.indent.tooltip = 嵌套一级条目
|
||||
table_modal.header = 添加表格
|
||||
table_modal.placeholder.header = 标题
|
||||
table_modal.label.columns = 列数
|
||||
|
@ -364,10 +364,10 @@ filter=其他过滤器
|
|||
filter_by_team_repositories=按团队仓库筛选
|
||||
feed_of=`"%s"的源`
|
||||
|
||||
show_archived=已归档
|
||||
show_both_archived_unarchived=显示已归档和未归档的
|
||||
show_only_archived=只显示已归档的
|
||||
show_only_unarchived=只显示未归档的
|
||||
show_archived=已存档
|
||||
show_both_archived_unarchived=显示已存档和未存档的
|
||||
show_only_archived=只显示已存档的
|
||||
show_only_unarchived=只显示未存档的
|
||||
|
||||
show_private=私有库
|
||||
show_both_private_public=同时显示公开的和私有的
|
||||
|
@ -747,7 +747,7 @@ webauthn=两步验证(安全密钥)
|
|||
public_profile=公开信息
|
||||
biography_placeholder=向他人介绍一下你自己!(支持 Markdown)
|
||||
location_placeholder=与他人分享你的大概位置
|
||||
profile_desc=控制您的个人资料对其他用户的显示方式。您的主要电子邮件地址将用于通知、密码恢复和基于网页界面的 Git 操作。
|
||||
profile_desc=关于您
|
||||
password_username_disabled=不允许非本地用户更改他们的用户名。更多详情请联系您的系统管理员。
|
||||
full_name=全名
|
||||
website=个人网站
|
||||
|
@ -838,7 +838,7 @@ add_email_success=新的电子邮件地址已添加。
|
|||
email_preference_set_success=电子邮件首选项已成功设置。
|
||||
add_openid_success=新的 OpenID 地址已添加。
|
||||
keep_email_private=隐藏邮箱地址
|
||||
keep_email_private_popup=这将从您的个人资料中隐藏您的电子邮件地址。它将不再是通过 Web 界面创建拉取请求的默认地址,如文件上传和编辑,也不会用于合并提交。相反,可以使用特殊地址 %s 将提交与您的账号相关联。请注意,更改此选项不会影响现有的提交。
|
||||
keep_email_private_popup=您的邮件地址不会在个人资料中显示,也不会成为通过网页界面提交的默认地址,例如文件上传、编辑和合并提交。相反,可以使用特殊地址 %s 将提交链接到您的账号。此选项不会影响现有提交。
|
||||
openid_desc=OpenID 让你可以将认证转发到外部服务。
|
||||
|
||||
manage_ssh_keys=管理 SSH 密钥
|
||||
|
@ -898,7 +898,7 @@ ssh_principal_deletion=删除 SSH 证书规则
|
|||
ssh_key_deletion_desc=删除 SSH 公钥将取消对应的私钥对您的 Forgejo 帐户的访问权限。继续?
|
||||
gpg_key_deletion_desc=删除 GPG 公钥将无法认知使用对应私钥签名的提交,继续?
|
||||
ssh_principal_deletion_desc=删除此 SSH 证书规则将取消它对您的账户的访问权限。继续?
|
||||
ssh_key_deletion_success=GPG 密钥已被删除。
|
||||
ssh_key_deletion_success=SSH 密钥已被删除。
|
||||
gpg_key_deletion_success=GPG 密钥已被删除。
|
||||
ssh_principal_deletion_success=此规则删除成功。
|
||||
added_on=添加于 %s
|
||||
|
@ -1049,11 +1049,13 @@ additional_repo_units_hint_description = 在所有存在未启用的功能的仓
|
|||
update_hints_success = 提示更改成功。
|
||||
pronouns_custom = 自定义
|
||||
pronouns = 代词
|
||||
pronouns_unspecified = 不指定
|
||||
pronouns_unspecified = 未指定
|
||||
language.title = 默认语言
|
||||
keep_activity_private.description = 您的<a href="%s">公开活动</a>将仅对您和实例管理员可见。
|
||||
language.description = 此语言将保存到您的账号中,并在您登录后用作默认语言。
|
||||
language.localization_project = 帮助我们将 Forgejo 翻译成您的语言!<a href="%s">了解更多</a>。
|
||||
user_block_yourself = 您不能屏蔽自己。
|
||||
pronouns_custom_label = 自定义代词
|
||||
|
||||
[repo]
|
||||
new_repo_helper=代码仓库包含了所有的项目文件,包括版本历史记录。已经在其他地方托管了?<a href="%s">迁移仓库</a>。
|
||||
|
@ -1102,7 +1104,7 @@ object_format_helper = 仓库的对象格式,一旦设置无法更改。SHA1
|
|||
readme=自述
|
||||
readme_helper=选择自述文件模板
|
||||
readme_helper_desc=这是您可以为您的项目撰写完整描述的地方。
|
||||
auto_init=初始化仓库(添加 .gitignore、许可证和自述文件)
|
||||
auto_init=初始化仓库
|
||||
trust_model_helper=选择签名验证的“信任模型”。可能的选项是:
|
||||
trust_model_helper_collaborator=协作者:信任协作者的签名
|
||||
trust_model_helper_committer=提交者:信任与提交者相符的签名
|
||||
|
@ -1142,7 +1144,7 @@ adopt_preexisting_label=收录文件
|
|||
adopt_preexisting=收录已存在的仓库
|
||||
adopt_preexisting_content=从 %s 创建仓库
|
||||
adopt_preexisting_success=从 %s 收录仓库成功
|
||||
delete_preexisting_label=刪除
|
||||
delete_preexisting_label=删除
|
||||
delete_preexisting=删除已存在的文件
|
||||
delete_preexisting_content=删除 %s 中的文件
|
||||
delete_preexisting_success=删除 %s 中未收录的文件
|
||||
|
@ -1179,10 +1181,10 @@ template.issue_labels=工单标签
|
|||
template.one_item=必须至少选择一个模板项
|
||||
template.invalid=必须选择一个模板仓库
|
||||
|
||||
archive.title=该仓库已被归档。您可以查看文件和克隆它,但不能推送、创建工单或合并请求。
|
||||
archive.title_date=该仓库已于 %s 归档。您可以查看文件或克隆它,但不能推送、创建工单或合并请求。
|
||||
archive.issue.nocomment=此仓库已存档,您不能在此工单添加评论。
|
||||
archive.pull.nocomment=此仓库已存档,您不能在此合并请求添加评论。
|
||||
archive.title=此仓库已存档。您可以查看文件和克隆仓库,但不能推送、创建工单或合并请求。
|
||||
archive.title_date=该仓库已于 %s 存档。您可以查看文件或克隆它,但不能推送、创建工单或合并请求。
|
||||
archive.issue.nocomment=此仓库已存档,您不能在工单添加评论。
|
||||
archive.pull.nocomment=此仓库已存档,您不能在合并请求添加评论。
|
||||
|
||||
form.reach_limit_of_creation_1=你已经达到了 %d 仓库的上限。
|
||||
form.reach_limit_of_creation_n=你已经达到了 %d 个仓库的上限。
|
||||
|
@ -1610,18 +1612,18 @@ issues.context.copy_link=复制链接
|
|||
issues.context.quote_reply=引用回复
|
||||
issues.context.reference_issue=在新工单中引用
|
||||
issues.context.edit=编辑
|
||||
issues.context.delete=刪除
|
||||
issues.context.delete=删除
|
||||
issues.no_content=没有提供说明。
|
||||
issues.close=关闭工单
|
||||
issues.close=关闭
|
||||
issues.comment_pull_merged_at=已合并提交 %[1]s 到 %[2]s %[3]s
|
||||
issues.comment_manually_pull_merged_at=手动合并提交 %[1]s 到 %[2]s %[3]s
|
||||
issues.close_comment_issue=评论并关闭
|
||||
issues.reopen_issue=重新开放
|
||||
issues.reopen_comment_issue=重新打开评论
|
||||
issues.create_comment=评论
|
||||
issues.closed_at=`于 <a id="%[1]s" href="#%[1]s">%[2]s</a> 关闭此工单`
|
||||
issues.closed_at=`于<a id="%[1]s" href="#%[1]s">%[2]s</a>关闭此工单`
|
||||
issues.reopened_at=`重新打开此问题 <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||
issues.commit_ref_at=`于 <a id="%[1]s" href="#%[1]s">%[2]s</a> 在代码提交中引用了该工单`
|
||||
issues.commit_ref_at=`于<a id="%[1]s" href="#%[1]s">%[2]s</a>在代码提交中引用了该工单`
|
||||
issues.ref_issue_from=`<a href="%[3]s">引用了工单 %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||
issues.ref_pull_from=`<a href="%[3]s">引用了合并请求 %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||
issues.ref_closing_from=`于 <a id="%[1]s" href="#%[1]s">%[2]s</a> <a href="%[3]s">从合并请求 %[4]s引用了此工单,将关闭此工单</a>`
|
||||
|
@ -1655,7 +1657,7 @@ issues.label_title=标签名称
|
|||
issues.label_description=标签描述
|
||||
issues.label_color=标签颜色
|
||||
issues.label_exclusive=独有
|
||||
issues.label_archive=归档标签
|
||||
issues.label_archive=存档标签
|
||||
issues.label_archived_filter=显示存档标签
|
||||
issues.label_archive_tooltip=在标签搜索时,默认情况下存档标签将被排除在外。
|
||||
issues.label_exclusive_desc=命名标签为 <code>scope/item</code> 以使其与其他以 <code>scope/</code> 开头的标签互斥。
|
||||
|
@ -1933,7 +1935,7 @@ pulls.update_branch_success=分支更新成功
|
|||
pulls.update_not_allowed=您无权更新分支
|
||||
pulls.outdated_with_base_branch=此分支相比基础分支已过期
|
||||
pulls.close=关闭
|
||||
pulls.closed_at=`于 <a id="%[1]s" href="#%[1]s">%[2]s</a> 关闭此合并请求 `
|
||||
pulls.closed_at=`于<a id="%[1]s" href="#%[1]s">%[2]s</a>关闭此合并请求 `
|
||||
pulls.reopened_at=`重新打开此合并请求 <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||
pulls.cmd_instruction_hint=查看命令行说明
|
||||
pulls.cmd_instruction_checkout_title=检出
|
||||
|
@ -2053,12 +2055,12 @@ activity.merged_prs_count_1=已合并的合并请求
|
|||
activity.merged_prs_count_n=已合并的合并请求
|
||||
activity.opened_prs_count_1=新合并请求
|
||||
activity.opened_prs_count_n=新合并请求
|
||||
activity.title.user_1=%d 用户
|
||||
activity.title.user_n=%d 用户
|
||||
activity.title.user_1=%d 名用户
|
||||
activity.title.user_n=%d 名用户
|
||||
activity.title.prs_1=%d 个合并请求
|
||||
activity.title.prs_n=%d 个合并请求
|
||||
activity.title.prs_merged_by=%[2]s 由 %[1]s 合并
|
||||
activity.title.prs_opened_by=%[2]s 创建了 %[1]s
|
||||
activity.title.prs_merged_by=%[2]s 共合并了 %[1]s
|
||||
activity.title.prs_opened_by=%[2]s 共创建了 %[1]s
|
||||
activity.merged_prs_label=已合并
|
||||
activity.opened_prs_label=已创建
|
||||
activity.active_issues_count_1=<strong>%d</strong> 项活动的工单
|
||||
|
@ -2067,8 +2069,8 @@ activity.closed_issues_count_1=已关闭的工单
|
|||
activity.closed_issues_count_n=已关闭的工单
|
||||
activity.title.issues_1=%d 项工单
|
||||
activity.title.issues_n=%d 项工单
|
||||
activity.title.issues_closed_from=%s 从 %s 被关闭
|
||||
activity.title.issues_created_by=%[2]s 创建了 %[1]s
|
||||
activity.title.issues_closed_from=%[2]s 共关闭了 %[1]s
|
||||
activity.title.issues_created_by=%[2]s 共创建了 %[1]s
|
||||
activity.closed_issue_label=已关闭
|
||||
activity.new_issues_count_1=新工单
|
||||
activity.new_issues_count_n=新工单
|
||||
|
@ -2079,29 +2081,29 @@ activity.unresolved_conv_desc=这些最近更新的工单和合并请求还没
|
|||
activity.unresolved_conv_label=打开
|
||||
activity.title.releases_1=%d 个版本发布
|
||||
activity.title.releases_n=%d 个版本发布
|
||||
activity.title.releases_published_by=%[2]s 发布了 %[1]s
|
||||
activity.title.releases_published_by=%[2]s 共发布了 %[1]s
|
||||
activity.published_release_label=版本发布
|
||||
activity.no_git_activity=在此期间没有任何提交活动。
|
||||
activity.git_stats_exclude_merges=排除合并,
|
||||
activity.git_stats_author_1=%d 作者
|
||||
activity.git_stats_author_n=%d 作者
|
||||
activity.git_stats_pushed_1=已经推送
|
||||
activity.git_stats_pushed_n=已经推送
|
||||
activity.git_stats_commit_1=%d 提交
|
||||
activity.git_stats_commit_n=%d 提交
|
||||
activity.git_stats_exclude_merges=除去合并提交以外,
|
||||
activity.git_stats_author_1=%d 名作者
|
||||
activity.git_stats_author_n=%d 名作者
|
||||
activity.git_stats_pushed_1=总共推送了
|
||||
activity.git_stats_pushed_n=总共推送了
|
||||
activity.git_stats_commit_1=%d 个提交
|
||||
activity.git_stats_commit_n=%d 个提交
|
||||
activity.git_stats_push_to_branch=到 %s 和
|
||||
activity.git_stats_push_to_all_branches=到所有分支。
|
||||
activity.git_stats_on_default_branch=在 %s 上,
|
||||
activity.git_stats_file_1=%d 文件
|
||||
activity.git_stats_file_n=%d 文件
|
||||
activity.git_stats_files_changed_1=已经改变
|
||||
activity.git_stats_files_changed_n=已经改变
|
||||
activity.git_stats_additions=而且
|
||||
activity.git_stats_addition_1=新增 %d 行
|
||||
activity.git_stats_addition_n=新增 %d 行
|
||||
activity.git_stats_and_deletions=和
|
||||
activity.git_stats_deletion_1=删除 %d 行
|
||||
activity.git_stats_deletion_n=删除 %d 行
|
||||
activity.git_stats_on_default_branch=在 %s 分支上,
|
||||
activity.git_stats_file_1=%d 个文件
|
||||
activity.git_stats_file_n=%d 个文件
|
||||
activity.git_stats_files_changed_1=被改动
|
||||
activity.git_stats_files_changed_n=被改动
|
||||
activity.git_stats_additions=,总共
|
||||
activity.git_stats_addition_1=新增了 %d 行
|
||||
activity.git_stats_addition_n=新增了 %d 行
|
||||
activity.git_stats_and_deletions=并有
|
||||
activity.git_stats_deletion_1=%d 行被删除
|
||||
activity.git_stats_deletion_n=%d 行被删除
|
||||
|
||||
contributors.contribution_type.filter_label=贡献类型:
|
||||
contributors.contribution_type.commits=提交
|
||||
|
@ -2178,7 +2180,7 @@ settings.external_tracker_url=外部工单系统 URL
|
|||
settings.external_tracker_url_error=外部百科链接无效。
|
||||
settings.external_tracker_url_desc=当点击工单标签时,访问者将被重定向到外部工单系统的URL。
|
||||
settings.tracker_url_format=外部工单系统的 URL 格式
|
||||
settings.tracker_url_format_error=外部工单追踪器链接无效
|
||||
settings.tracker_url_format_error=外部工单追踪器链接无效。
|
||||
settings.tracker_issue_style=外部工单系统的编号格式
|
||||
settings.tracker_issue_style.numeric=纯数字形式
|
||||
settings.tracker_issue_style.alphanumeric=英文字母数字组合形式
|
||||
|
@ -2322,7 +2324,7 @@ settings.event_choose=自定义事件…
|
|||
settings.event_header_repository=仓库事件
|
||||
settings.event_create=创建
|
||||
settings.event_create_desc=创建分支或标签。
|
||||
settings.event_delete=刪除
|
||||
settings.event_delete=删除
|
||||
settings.event_delete_desc=分支或标签已删除。
|
||||
settings.event_fork=派生
|
||||
settings.event_fork_desc=仓库被派生。
|
||||
|
@ -2505,20 +2507,20 @@ settings.thread_id=线程 ID
|
|||
settings.matrix.homeserver_url=主服务器网址
|
||||
settings.matrix.room_id=房间ID
|
||||
settings.matrix.message_type=消息类型
|
||||
settings.archive.button=归档仓库
|
||||
settings.archive.header=归档此仓库
|
||||
settings.archive.text=归档仓库将使其完全只读。它将在首页隐藏。没有人(甚至你!)能够进行新的提交,或打开工单及合并请求。
|
||||
settings.archive.success=仓库已成功归档。
|
||||
settings.archive.error=仓库在归档时出现异常。请通过日志获取详细信息。
|
||||
settings.archive.error_ismirror=不能归档镜像仓库。
|
||||
settings.archive.branchsettings_unavailable=分支设置对已归档的仓库不可用。
|
||||
settings.archive.tagsettings_unavailable=标签设置对已归档的仓库不可用。
|
||||
settings.archive.mirrors_unavailable = 镜像对已归档的仓库不可用。
|
||||
settings.unarchive.button=撤销仓库归档
|
||||
settings.unarchive.header=撤销此仓库归档
|
||||
settings.unarchive.text=撤销归档将恢复仓库接收提交、推送,以及新工单和合并请求的能力。
|
||||
settings.unarchive.success=仓库已成功撤销归档。
|
||||
settings.unarchive.error=仓库在取消归档时出现异常。请通过日志获取详细信息。
|
||||
settings.archive.button=存档仓库
|
||||
settings.archive.header=存档此仓库
|
||||
settings.archive.text=存档仓库将使其完全只读。它将在首页隐藏。没有人(甚至你!)能够进行新的提交,或打开工单及合并请求。
|
||||
settings.archive.success=仓库已成功存档。
|
||||
settings.archive.error=仓库在存档时出现异常。请通过日志获取详细信息。
|
||||
settings.archive.error_ismirror=不能存档镜像仓库。
|
||||
settings.archive.branchsettings_unavailable=分支设置对已存档的仓库不可用。
|
||||
settings.archive.tagsettings_unavailable=标签设置对已存档的仓库不可用。
|
||||
settings.archive.mirrors_unavailable = 镜像对已存档的仓库不可用。
|
||||
settings.unarchive.button=撤销仓库存档
|
||||
settings.unarchive.header=撤销此仓库存档
|
||||
settings.unarchive.text=撤销存档将恢复仓库接收提交、推送,以及新工单和合并请求的能力。
|
||||
settings.unarchive.success=仓库已成功撤销存档。
|
||||
settings.unarchive.error=仓库在取消存档时出现异常。请通过日志获取详细信息。
|
||||
settings.update_avatar_success=仓库头像已经更新。
|
||||
settings.lfs=LFS
|
||||
settings.lfs_filelist=存储在此仓库中的 LFS 文件
|
||||
|
@ -2659,7 +2661,7 @@ release.tags_for=%s 的标签
|
|||
|
||||
branch.name=分支名称
|
||||
branch.already_exists=名为 %s 的分支已存在。
|
||||
branch.delete_head=刪除
|
||||
branch.delete_head=删除
|
||||
branch.delete=删除分支 "%s"
|
||||
branch.delete_html=删除分支
|
||||
branch.delete_desc=删除分支是永久的。虽然已删除的分支在实际被删除前有可能会短时间存在,但这在大多数情况下无法撤销。是否继续?
|
||||
|
@ -2750,7 +2752,7 @@ pulls.made_using_agit = AGit
|
|||
activity.navbar.pulse = 动态
|
||||
activity.navbar.code_frequency = 代码频率
|
||||
activity.navbar.recent_commits = 近期提交
|
||||
pulls.agit_explanation = 该合并请求是用 AGit 创建的。AGit 是一种可以让贡献者直接通过 “git push” 提出更改代码而不需要派生或建立新分支。
|
||||
pulls.agit_explanation = 该合并请求是用 AGit 工作流创建的。使用 AGit,贡献者无需派生或创建分支就可以直接通过 “git push” 提出更改代码。
|
||||
error.broken_git_hook = 该仓库的 Git 钩子似乎已经损坏,请按照 <a target="_blank" rel="noreferrer" href="%s">此文档</a>来修复这些问题,然后推送一些提交来刷新状态。
|
||||
pulls.merged_title_desc_one = 已将来自 <code>%[2]s</code> 的 %[1]d 提交合并入 <code>%[3]s</code> %[4]s
|
||||
commits.search_branch = 此分支
|
||||
|
@ -2767,7 +2769,7 @@ n_tag_one = %s 标签
|
|||
n_tag_few = %s 标签
|
||||
editor.commit_id_not_matching = 您在编辑文件时该文件已被更改。请提交到一个新的分支,然后再将这个新的分支合并回当前分支。
|
||||
issues.num_participants_one = %d 位参与者
|
||||
issues.archived_label_description = (已归档)%s
|
||||
issues.archived_label_description = (已存档)%s
|
||||
editor.push_out_of_date = 推送似乎已过期。
|
||||
settings.enforce_on_admins = 对仓库的管理员适用该规则
|
||||
settings.enforce_on_admins_desc = 使仓库管理员也须遵守此规则。
|
||||
|
@ -2802,7 +2804,7 @@ issues.edit.already_changed = 无法保存对工单的更改。工单似乎已
|
|||
pulls.edit.already_changed = 无法保存对合并请求的更改。内容似乎已经被另一个用户修改了,为了防止修改被覆盖,请刷新页面后再次尝试编辑
|
||||
comments.edit.already_changed = 无法保存对评论的更改。内容似乎已经被另一个用户修改了,为了防止修改被覆盖,请刷新页面后再次尝试编辑
|
||||
subscribe.issue.guest.tooltip = 登录以订阅工单。
|
||||
subscribe.pull.guest.tooltip = 登录以订阅此拉取请求。
|
||||
subscribe.pull.guest.tooltip = 登录以订阅此合并请求。
|
||||
settings.federation_following_repos = 关注的仓库URL地址,多个地址以 “;” 分隔,不需要前后空格。
|
||||
settings.federation_settings = 邦联设置
|
||||
settings.federation_apapiurl = 此仓库的邦联URL地址。将其作为关注的仓库URL地址填写到另一个仓库的邦联设置中。
|
||||
|
@ -2849,9 +2851,25 @@ issues.num_reviews_one = %d 评审
|
|||
issues.num_reviews_few = %d 评审
|
||||
issues.summary_card_alt = 仓库 %[2]s 中标题为 %[1]s 的工单的摘要卡片
|
||||
editor.add_tmpl.filename = 文件名
|
||||
settings.default_update_style_desc = 用于更新落后于基础分支的合并请求的默认更新样式。
|
||||
pulls.sign_in_require = <a href="%s">登录</a>以创建新的合并请求。
|
||||
new_from_template = 使用模板
|
||||
new_from_template_description = 您可以选择此实例上现有仓库模板并应用其设置。
|
||||
new_advanced = 高级设置
|
||||
new_advanced_expand = 单击展开
|
||||
auto_init_description = 以一个自述文件、可选的许可证与 .gitignore 文件开始Git历史。
|
||||
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] 回应。
|
||||
issues.context.menu = 评论菜单
|
||||
issues.reaction.alt_add = 对评论添加 %[1]s 回应。
|
||||
|
||||
summary_card_alt = 仓库 %s 的摘要卡片
|
||||
release.summary_card_alt = 仓库 %[2]s 中标题为 %[1]s 的版本发布的摘要卡片
|
||||
|
||||
[graphs]
|
||||
component_loading=正在加载 %s...
|
||||
component_loading=正在加载 %s…
|
||||
component_loading_failed=无法加载 %s
|
||||
component_loading_info=这可能需要一点…
|
||||
component_failed_to_load=意外的错误发生了。
|
||||
|
@ -3807,7 +3825,7 @@ secrets=密钥
|
|||
description=Secrets 将被传给特定的 Actions,其它情况将不能读取
|
||||
none=还没有密钥。
|
||||
creation=添加密钥
|
||||
creation.name_placeholder=不区分大小写,字母数字或下划线不能以GITEA_ 或 GITHUB_ 开头。
|
||||
creation.name_placeholder=不区分大小写,只能包含英文字母、数字或下划线,不能以 GITEA_ 或 GITHUB_ 开头
|
||||
creation.value_placeholder=输入任何内容,开头和结尾的空白都会被省略
|
||||
creation.success=您的密钥 '%s' 添加成功。
|
||||
creation.failed=添加密钥失败。
|
||||
|
@ -3832,8 +3850,8 @@ status.skipped=已忽略
|
|||
status.blocked=阻塞中
|
||||
|
||||
runners=运行器
|
||||
runners.runner_manage_panel=管理 Runners
|
||||
runners.new=创建 Runner
|
||||
runners.runner_manage_panel=管理运行器
|
||||
runners.new=创建新运行器
|
||||
runners.new_notice=如何启动一个运行器
|
||||
runners.status=状态
|
||||
runners.id=ID
|
||||
|
@ -3911,7 +3929,7 @@ variables.update.success=该变量已被编辑。
|
|||
runs.workflow = 工作流
|
||||
runs.no_job_without_needs = 工作流必须至少包含一组没有依赖的作业。
|
||||
runs.no_job = 工作流必须至少包含一个作业
|
||||
workflow.dispatch.trigger_found = 此工作流有一个 <c>workflow_dispatch</c> 事件触发。
|
||||
workflow.dispatch.trigger_found = 此工作流有 <c>workflow_dispatch</c> 事件触发器。
|
||||
workflow.dispatch.use_from = 使用工作流
|
||||
workflow.dispatch.invalid_input_type = 输入类型“%s”无效。
|
||||
workflow.dispatch.warn_input_limit = 仅显示前 %d 个输入。
|
||||
|
@ -3940,18 +3958,18 @@ submodule=子模块
|
|||
|
||||
[search]
|
||||
keyword_search_unavailable = 关键词搜索目前不可用,请联系站点管理员。
|
||||
search = 搜索...
|
||||
repo_kind = 搜索仓库...
|
||||
user_kind = 搜索用户...
|
||||
org_kind = 搜索组织...
|
||||
team_kind = 搜索团队...
|
||||
code_kind = 搜索代码...
|
||||
search = 搜索…
|
||||
repo_kind = 搜索仓库…
|
||||
user_kind = 搜索用户…
|
||||
org_kind = 搜索组织…
|
||||
team_kind = 搜索团队…
|
||||
code_kind = 搜索代码…
|
||||
code_search_unavailable = 代码搜索目前不可用,请联系站点管理员。
|
||||
package_kind = 搜索软件包...
|
||||
project_kind = 搜索项目...
|
||||
branch_kind = 搜索分支...
|
||||
commit_kind = 搜索提交...
|
||||
runner_kind = 搜索Runners...
|
||||
package_kind = 搜索软件包…
|
||||
project_kind = 搜索项目…
|
||||
branch_kind = 搜索分支…
|
||||
commit_kind = 搜索提交…
|
||||
runner_kind = 搜索运行器…
|
||||
no_results = 未找到匹配的结果。
|
||||
type_tooltip = 搜索类型
|
||||
fuzzy = 模糊
|
||||
|
@ -3960,8 +3978,8 @@ match = 匹配
|
|||
match_tooltip = 仅包含与搜索词完全匹配的结果
|
||||
fuzzy_tooltip = 在搜索结果中包含与搜索词相近的项目
|
||||
exact = 精确
|
||||
issue_kind = 搜索工单...
|
||||
pull_kind = 搜索合并请求...
|
||||
issue_kind = 搜索工单…
|
||||
pull_kind = 搜索合并请求…
|
||||
exact_tooltip = 仅包含与搜索词精确匹配的结果
|
||||
milestone_kind = 搜索里程碑…
|
||||
union_tooltip = 包括与任何空格分隔的关键字匹配的结果
|
||||
|
|
10
package-lock.json
generated
10
package-lock.json
generated
|
@ -28,7 +28,7 @@
|
|||
"escape-goat": "4.0.0",
|
||||
"fast-glob": "3.3.2",
|
||||
"htmx.org": "1.9.12",
|
||||
"idiomorph": "0.4.0",
|
||||
"idiomorph": "0.3.0",
|
||||
"jquery": "3.7.1",
|
||||
"katex": "0.16.18",
|
||||
"mermaid": "11.4.1",
|
||||
|
@ -9314,10 +9314,10 @@
|
|||
}
|
||||
},
|
||||
"node_modules/idiomorph": {
|
||||
"version": "0.4.0",
|
||||
"resolved": "https://registry.npmjs.org/idiomorph/-/idiomorph-0.4.0.tgz",
|
||||
"integrity": "sha512-VdXFpZOTXhLatJmhCWJR5oQKLXT01O6sFCJqT0/EqG71C4tYZdPJ5etvttwWsT2WKRYWz160XkNr1DUqXNMZHg==",
|
||||
"license": "BSD-2-Clause"
|
||||
"version": "0.3.0",
|
||||
"resolved": "https://registry.npmjs.org/idiomorph/-/idiomorph-0.3.0.tgz",
|
||||
"integrity": "sha512-UhV1Ey5xCxIwR9B+OgIjQa+1Jx99XQ1vQHUsKBU1RpQzCx1u+b+N6SOXgf5mEJDqemUI/ffccu6+71l2mJUsRA==",
|
||||
"license": "BSD 2-Clause"
|
||||
},
|
||||
"node_modules/ieee754": {
|
||||
"version": "1.2.1",
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
"escape-goat": "4.0.0",
|
||||
"fast-glob": "3.3.2",
|
||||
"htmx.org": "1.9.12",
|
||||
"idiomorph": "0.4.0",
|
||||
"idiomorph": "0.3.0",
|
||||
"jquery": "3.7.1",
|
||||
"katex": "0.16.18",
|
||||
"mermaid": "11.4.1",
|
||||
|
|
|
@ -24,6 +24,7 @@ import (
|
|||
"code.gitea.io/gitea/modules/log"
|
||||
packages_module "code.gitea.io/gitea/modules/packages"
|
||||
maven_module "code.gitea.io/gitea/modules/packages/maven"
|
||||
"code.gitea.io/gitea/modules/sync"
|
||||
"code.gitea.io/gitea/routers/api/packages/helper"
|
||||
"code.gitea.io/gitea/services/context"
|
||||
packages_service "code.gitea.io/gitea/services/packages"
|
||||
|
@ -228,6 +229,8 @@ func servePackageFile(ctx *context.Context, params parameters, serveContent bool
|
|||
helper.ServePackageFile(ctx, s, u, pf, opts)
|
||||
}
|
||||
|
||||
var mavenUploadLock = sync.NewExclusivePool()
|
||||
|
||||
// UploadPackageFile adds a file to the package. If the package does not exist, it gets created.
|
||||
func UploadPackageFile(ctx *context.Context) {
|
||||
params, err := extractPathParameters(ctx)
|
||||
|
@ -246,6 +249,9 @@ func UploadPackageFile(ctx *context.Context) {
|
|||
|
||||
packageName := params.GroupID + "-" + params.ArtifactID
|
||||
|
||||
mavenUploadLock.CheckIn(packageName)
|
||||
defer mavenUploadLock.CheckOut(packageName)
|
||||
|
||||
buf, err := packages_module.CreateHashedBufferFromReader(ctx.Req.Body)
|
||||
if err != nil {
|
||||
apiError(ctx, http.StatusInternalServerError, err)
|
||||
|
|
|
@ -350,6 +350,9 @@ func prepareForReplaceOrAdd(ctx *context.APIContext, form api.IssueLabelsOption)
|
|||
labelIDs = append(labelIDs, int64(rv.Float()))
|
||||
case reflect.String:
|
||||
labelNames = append(labelNames, rv.String())
|
||||
default:
|
||||
ctx.Error(http.StatusBadRequest, "InvalidLabel", "a label must be an integer or a string")
|
||||
return nil, nil, fmt.Errorf("invalid label")
|
||||
}
|
||||
}
|
||||
if len(labelIDs) > 0 && len(labelNames) > 0 {
|
||||
|
@ -357,11 +360,20 @@ func prepareForReplaceOrAdd(ctx *context.APIContext, form api.IssueLabelsOption)
|
|||
return nil, nil, fmt.Errorf("invalid labels")
|
||||
}
|
||||
if len(labelNames) > 0 {
|
||||
labelIDs, err = issues_model.GetLabelIDsInRepoByNames(ctx, ctx.Repo.Repository.ID, labelNames)
|
||||
repoLabelIDs, err := issues_model.GetLabelIDsInRepoByNames(ctx, ctx.Repo.Repository.ID, labelNames)
|
||||
if err != nil {
|
||||
ctx.Error(http.StatusInternalServerError, "GetLabelIDsInRepoByNames", err)
|
||||
return nil, nil, err
|
||||
}
|
||||
labelIDs = append(labelIDs, repoLabelIDs...)
|
||||
if ctx.Repo.Owner.IsOrganization() {
|
||||
orgLabelIDs, err := issues_model.GetLabelIDsInOrgByNames(ctx, ctx.Repo.Owner.ID, labelNames)
|
||||
if err != nil {
|
||||
ctx.Error(http.StatusInternalServerError, "GetLabelIDsInOrgByNames", err)
|
||||
return nil, nil, err
|
||||
}
|
||||
labelIDs = append(labelIDs, orgLabelIDs...)
|
||||
}
|
||||
}
|
||||
|
||||
labels, err := issues_model.GetLabelsByIDs(ctx, labelIDs, "id", "repo_id", "org_id", "name", "exclusive")
|
||||
|
|
526
routers/web/repo/card.go
Normal file
526
routers/web/repo/card.go
Normal file
|
@ -0,0 +1,526 @@
|
|||
// Copyright 2024 The Forgejo Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
package repo
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/hex"
|
||||
"fmt"
|
||||
"image"
|
||||
"image/color"
|
||||
"image/png"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"code.gitea.io/gitea/models/db"
|
||||
issue_model "code.gitea.io/gitea/models/issues"
|
||||
repo_model "code.gitea.io/gitea/models/repo"
|
||||
unit_model "code.gitea.io/gitea/models/unit"
|
||||
user_model "code.gitea.io/gitea/models/user"
|
||||
"code.gitea.io/gitea/modules/cache"
|
||||
"code.gitea.io/gitea/modules/card"
|
||||
"code.gitea.io/gitea/modules/log"
|
||||
"code.gitea.io/gitea/modules/setting"
|
||||
"code.gitea.io/gitea/modules/storage"
|
||||
"code.gitea.io/gitea/services/context"
|
||||
)
|
||||
|
||||
// drawUser draws a user avatar in a summary card
|
||||
func drawUser(ctx *context.Context, card *card.Card, user *user_model.User) error {
|
||||
if user.UseCustomAvatar {
|
||||
posterAvatarPath := user.CustomAvatarRelativePath()
|
||||
if posterAvatarPath != "" {
|
||||
userAvatarFile, err := storage.Avatars.Open(user.CustomAvatarRelativePath())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
userAvatarImage, _, err := image.Decode(userAvatarFile)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
card.DrawImage(userAvatarImage)
|
||||
}
|
||||
} else {
|
||||
posterAvatarLink := user.AvatarLinkWithSize(ctx, 256)
|
||||
card.DrawExternalImage(posterAvatarLink)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// drawRepoIcon draws the repo icon in a summary card
|
||||
func drawRepoIcon(ctx *context.Context, card *card.Card, repo *repo_model.Repository) error {
|
||||
repoAvatarPath := repo.CustomAvatarRelativePath()
|
||||
|
||||
if repoAvatarPath != "" {
|
||||
repoAvatarFile, err := storage.RepoAvatars.Open(repoAvatarPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
repoAvatarImage, _, err := image.Decode(repoAvatarFile)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
card.DrawImage(repoAvatarImage)
|
||||
return nil
|
||||
}
|
||||
|
||||
// If the repo didn't have an avatar, fallback to the repo owner's avatar for the right-hand-side icon
|
||||
err := repo.LoadOwner(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if repo.Owner != nil {
|
||||
err = drawUser(ctx, card, repo.Owner)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// hexToColor converts a hex color to a go color
|
||||
func hexToColor(colorStr string) (*color.RGBA, error) {
|
||||
colorStr = strings.TrimLeft(colorStr, "#")
|
||||
|
||||
b, err := hex.DecodeString(colorStr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(b) < 3 {
|
||||
return nil, fmt.Errorf("expected at least 3 bytes from DecodeString, got %d", len(b))
|
||||
}
|
||||
|
||||
color := color.RGBA{b[0], b[1], b[2], 255}
|
||||
|
||||
return &color, nil
|
||||
}
|
||||
|
||||
func drawLanguagesCard(ctx *context.Context, card *card.Card) error {
|
||||
languageList, err := repo_model.GetTopLanguageStats(ctx, ctx.Repo.Repository, 5)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if len(languageList) == 0 {
|
||||
card.DrawRect(0, 0, card.Width, card.Height, color.White)
|
||||
return nil
|
||||
}
|
||||
|
||||
currentX := 0
|
||||
var langColor *color.RGBA
|
||||
|
||||
for _, lang := range languageList {
|
||||
langColor, err = hexToColor(lang.Color)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
langWidth := float32(card.Width) * (lang.Percentage / 100)
|
||||
card.DrawRect(currentX, 0, currentX+int(langWidth), card.Width, langColor)
|
||||
currentX += int(langWidth)
|
||||
}
|
||||
|
||||
if currentX < card.Width {
|
||||
card.DrawRect(currentX, 0, card.Width, card.Height, langColor)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func drawRepoSummaryCard(ctx *context.Context, repo *repo_model.Repository) (*card.Card, error) {
|
||||
width, height := card.DefaultSize()
|
||||
mainCard, err := card.NewCard(width, height)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
contentCard, languageBarCard := mainCard.Split(false, 90)
|
||||
|
||||
contentCard.SetMargin(60)
|
||||
topSection, bottomSection := contentCard.Split(false, 75)
|
||||
issueSummary, issueIcon := topSection.Split(true, 80)
|
||||
repoInfo, issueDescription := issueSummary.Split(false, 30)
|
||||
|
||||
repoInfo.SetMargin(10)
|
||||
_, err = repoInfo.DrawText(repo.FullName(), color.Black, 56, card.Top, card.Left)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
issueDescription.SetMargin(10)
|
||||
_, err = issueDescription.DrawText(repo.Description, color.Gray{128}, 36, card.Top, card.Left)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
issueIcon.SetMargin(10)
|
||||
err = drawRepoIcon(ctx, issueIcon, repo)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
topCountCard, bottomCountCard := bottomSection.Split(false, 50)
|
||||
|
||||
releaseCount, err := db.Count[repo_model.Release](ctx, repo_model.FindReleasesOptions{
|
||||
// only show draft releases for users who can write, read-only users shouldn't see draft releases.
|
||||
IncludeDrafts: ctx.Repo.CanWrite(unit_model.TypeReleases),
|
||||
RepoID: ctx.Repo.Repository.ID,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
starsText := ctx.Locale.TrN(
|
||||
repo.NumStars,
|
||||
"explore.stars_one",
|
||||
"explore.stars_few",
|
||||
repo.NumStars,
|
||||
)
|
||||
forksText := ctx.Locale.TrN(
|
||||
repo.NumForks,
|
||||
"explore.forks_one",
|
||||
"explore.forks_few",
|
||||
repo.NumForks,
|
||||
)
|
||||
releasesText := ctx.Locale.TrN(
|
||||
releaseCount,
|
||||
"repo.activity.title.releases_1",
|
||||
"repo.activity.title.releases_n",
|
||||
releaseCount,
|
||||
)
|
||||
|
||||
topCountText := fmt.Sprintf("%s • %s • %s", starsText, forksText, releasesText)
|
||||
|
||||
topCountCard.SetMargin(10)
|
||||
_, err = topCountCard.DrawText(topCountText, color.Gray{128}, 36, card.Top, card.Left)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
issuesText := ctx.Locale.TrN(
|
||||
repo.NumOpenIssues,
|
||||
"repo.activity.title.issues_1",
|
||||
"repo.activity.title.issues_n",
|
||||
repo.NumOpenIssues,
|
||||
)
|
||||
pullRequestsText := ctx.Locale.TrN(
|
||||
repo.NumOpenPulls,
|
||||
"repo.activity.title.prs_1",
|
||||
"repo.activity.title.prs_n",
|
||||
repo.NumOpenPulls,
|
||||
)
|
||||
|
||||
bottomCountText := fmt.Sprintf("%s • %s", issuesText, pullRequestsText)
|
||||
|
||||
bottomCountCard.SetMargin(10)
|
||||
_, err = bottomCountCard.DrawText(bottomCountText, color.Gray{128}, 36, card.Top, card.Left)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = drawLanguagesCard(ctx, languageBarCard)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return mainCard, nil
|
||||
}
|
||||
|
||||
func drawIssueSummaryCard(ctx *context.Context, issue *issue_model.Issue) (*card.Card, error) {
|
||||
width, height := card.DefaultSize()
|
||||
mainCard, err := card.NewCard(width, height)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
mainCard.SetMargin(60)
|
||||
topSection, bottomSection := mainCard.Split(false, 75)
|
||||
issueSummary, issueIcon := topSection.Split(true, 80)
|
||||
repoInfo, issueDescription := issueSummary.Split(false, 15)
|
||||
|
||||
repoInfo.SetMargin(10)
|
||||
_, err = repoInfo.DrawText(fmt.Sprintf("%s - #%d", issue.Repo.FullName(), issue.Index), color.Gray{128}, 36, card.Top, card.Left)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
issueDescription.SetMargin(10)
|
||||
_, err = issueDescription.DrawText(issue.Title, color.Black, 56, card.Top, card.Left)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
issueIcon.SetMargin(10)
|
||||
err = drawRepoIcon(ctx, issueIcon, issue.Repo)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
issueStats, issueAttribution := bottomSection.Split(false, 50)
|
||||
|
||||
var state string
|
||||
if issue.IsPull && issue.PullRequest.HasMerged {
|
||||
if issue.PullRequest.Status == 3 {
|
||||
state = ctx.Locale.TrString("repo.pulls.manually_merged")
|
||||
} else {
|
||||
state = ctx.Locale.TrString("repo.pulls.merged")
|
||||
}
|
||||
} else if issue.IsClosed {
|
||||
state = ctx.Locale.TrString("repo.issues.closed_title")
|
||||
} else if issue.IsPull {
|
||||
if issue.PullRequest.IsWorkInProgress(ctx) {
|
||||
state = ctx.Locale.TrString("repo.issues.draft_title")
|
||||
} else {
|
||||
state = ctx.Locale.TrString("repo.issues.open_title")
|
||||
}
|
||||
} else {
|
||||
state = ctx.Locale.TrString("repo.issues.open_title")
|
||||
}
|
||||
state = strings.ToLower(state)
|
||||
|
||||
issueStats.SetMargin(10)
|
||||
if issue.IsPull {
|
||||
reviews := map[int64]bool{}
|
||||
for _, comment := range issue.Comments {
|
||||
if comment.Review != nil {
|
||||
reviews[comment.Review.ID] = true
|
||||
}
|
||||
}
|
||||
_, err = issueStats.DrawText(
|
||||
fmt.Sprintf("%s, %s, %s",
|
||||
ctx.Locale.TrN(
|
||||
issue.NumComments,
|
||||
"repo.issues.num_comments_1",
|
||||
"repo.issues.num_comments",
|
||||
issue.NumComments,
|
||||
),
|
||||
ctx.Locale.TrN(
|
||||
len(reviews),
|
||||
"repo.issues.num_reviews_one",
|
||||
"repo.issues.num_reviews_few",
|
||||
len(reviews),
|
||||
),
|
||||
state,
|
||||
),
|
||||
color.Gray{128}, 36, card.Top, card.Left)
|
||||
} else {
|
||||
_, err = issueStats.DrawText(
|
||||
fmt.Sprintf("%s, %s",
|
||||
ctx.Locale.TrN(
|
||||
issue.NumComments,
|
||||
"repo.issues.num_comments_1",
|
||||
"repo.issues.num_comments",
|
||||
issue.NumComments,
|
||||
),
|
||||
state,
|
||||
),
|
||||
color.Gray{128}, 36, card.Top, card.Left)
|
||||
}
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
issueAttributionIcon, issueAttributionText := issueAttribution.Split(true, 8)
|
||||
issueAttributionText.SetMargin(5)
|
||||
_, err = issueAttributionText.DrawText(
|
||||
fmt.Sprintf(
|
||||
"%s - %s",
|
||||
issue.Poster.Name,
|
||||
issue.Created.AsTime().Format(time.DateOnly),
|
||||
),
|
||||
color.Gray{128}, 36, card.Middle, card.Left)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = drawUser(ctx, issueAttributionIcon, issue.Poster)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return mainCard, nil
|
||||
}
|
||||
|
||||
func drawReleaseSummaryCard(ctx *context.Context, release *repo_model.Release) (*card.Card, error) {
|
||||
width, height := card.DefaultSize()
|
||||
mainCard, err := card.NewCard(width, height)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
mainCard.SetMargin(60)
|
||||
topSection, bottomSection := mainCard.Split(false, 75)
|
||||
releaseSummary, repoIcon := topSection.Split(true, 80)
|
||||
repoInfo, releaseDescription := releaseSummary.Split(false, 15)
|
||||
|
||||
repoInfo.SetMargin(10)
|
||||
_, err = repoInfo.DrawText(release.Repo.FullName(), color.Gray{128}, 36, card.Top, card.Left)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
releaseDescription.SetMargin(10)
|
||||
_, err = releaseDescription.DrawText(release.DisplayName(), color.Black, 56, card.Top, card.Left)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
repoIcon.SetMargin(10)
|
||||
err = drawRepoIcon(ctx, repoIcon, release.Repo)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
downloadCountCard, releaseDateCard := bottomSection.Split(true, 75)
|
||||
|
||||
downloadCount, err := release.GetTotalDownloadCount(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
downloadCountText := ctx.Locale.TrN(
|
||||
strconv.FormatInt(downloadCount, 10),
|
||||
"repo.release.download_count_one",
|
||||
"repo.release.download_count_few",
|
||||
strconv.FormatInt(downloadCount, 10),
|
||||
)
|
||||
|
||||
_, err = downloadCountCard.DrawText(string(downloadCountText), color.Gray{128}, 36, card.Bottom, card.Left)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
_, err = releaseDateCard.DrawText(release.CreatedUnix.AsTime().Format(time.DateOnly), color.Gray{128}, 36, card.Bottom, card.Left)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return mainCard, nil
|
||||
}
|
||||
|
||||
// checkCardCache checks if a card in cache and serves it
|
||||
func checkCardCache(ctx *context.Context, cacheKey string) bool {
|
||||
cache := cache.GetCache()
|
||||
pngData, ok := cache.Get(cacheKey).([]byte)
|
||||
if ok && pngData != nil && len(pngData) > 0 {
|
||||
ctx.Resp.Header().Set("Content-Type", "image/png")
|
||||
ctx.Resp.WriteHeader(http.StatusOK)
|
||||
_, err := ctx.Resp.Write(pngData)
|
||||
if err != nil {
|
||||
ctx.ServerError("GetSummaryCard", err)
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// serveCard server a Card to the user adds it to the cache
|
||||
func serveCard(ctx *context.Context, card *card.Card, cacheKey string) {
|
||||
cache := cache.GetCache()
|
||||
|
||||
// Encode image, store in cache
|
||||
var imageBuffer bytes.Buffer
|
||||
err := png.Encode(&imageBuffer, card.Img)
|
||||
if err != nil {
|
||||
ctx.ServerError("GetSummaryCard", err)
|
||||
return
|
||||
}
|
||||
imageBytes := imageBuffer.Bytes()
|
||||
err = cache.Put(cacheKey, imageBytes, setting.CacheService.TTLSeconds())
|
||||
if err != nil {
|
||||
// don't abort serving the image if we just had a cache storage failure
|
||||
log.Warn("failed to cache issue summary card: %v", err)
|
||||
}
|
||||
|
||||
// Finish the uncached image response
|
||||
ctx.Resp.Header().Set("Content-Type", "image/png")
|
||||
ctx.Resp.WriteHeader(http.StatusOK)
|
||||
_, err = ctx.Resp.Write(imageBytes)
|
||||
if err != nil {
|
||||
ctx.ServerError("GetSummaryCard", err)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
func DrawRepoSummaryCard(ctx *context.Context) {
|
||||
cacheKey := fmt.Sprintf("summary_card:repo:%s:%d", ctx.Locale.Language(), ctx.Repo.Repository.ID)
|
||||
|
||||
if checkCardCache(ctx, cacheKey) {
|
||||
return
|
||||
}
|
||||
|
||||
card, err := drawRepoSummaryCard(ctx, ctx.Repo.Repository)
|
||||
if err != nil {
|
||||
ctx.ServerError("drawRepoSummaryCar", err)
|
||||
return
|
||||
}
|
||||
|
||||
serveCard(ctx, card, cacheKey)
|
||||
}
|
||||
|
||||
func DrawIssueSummaryCard(ctx *context.Context) {
|
||||
issue, err := issue_model.GetIssueWithAttrsByIndex(ctx, ctx.Repo.Repository.ID, ctx.ParamsInt64(":index"))
|
||||
if err != nil {
|
||||
if issue_model.IsErrIssueNotExist(err) {
|
||||
ctx.Error(http.StatusNotFound)
|
||||
} else {
|
||||
ctx.Error(http.StatusInternalServerError, "GetIssueByIndex", err.Error())
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
if !ctx.Repo.CanReadIssuesOrPulls(issue.IsPull) {
|
||||
ctx.Error(http.StatusNotFound)
|
||||
return
|
||||
}
|
||||
|
||||
cacheKey := fmt.Sprintf("summary_card:issue:%s:%d", ctx.Locale.Language(), issue.ID)
|
||||
|
||||
if checkCardCache(ctx, cacheKey) {
|
||||
return
|
||||
}
|
||||
|
||||
card, err := drawIssueSummaryCard(ctx, issue)
|
||||
if err != nil {
|
||||
ctx.ServerError("drawIssueSummaryCar", err)
|
||||
return
|
||||
}
|
||||
|
||||
serveCard(ctx, card, cacheKey)
|
||||
}
|
||||
|
||||
func DrawReleaseSummaryCard(ctx *context.Context) {
|
||||
release, err := repo_model.GetRelease(ctx, ctx.Repo.Repository.ID, ctx.Params("*"))
|
||||
if err != nil {
|
||||
if repo_model.IsErrReleaseNotExist(err) {
|
||||
ctx.NotFound("", nil)
|
||||
} else {
|
||||
ctx.ServerError("GetReleaseForRepoByID", err)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
err = release.LoadRepo(ctx)
|
||||
if err != nil {
|
||||
ctx.ServerError("LoadRepo", err)
|
||||
return
|
||||
}
|
||||
|
||||
cacheKey := fmt.Sprintf("summary_card:release:%s:%d", ctx.Locale.Language(), release.ID)
|
||||
|
||||
if checkCardCache(ctx, cacheKey) {
|
||||
return
|
||||
}
|
||||
|
||||
card, err := drawReleaseSummaryCard(ctx, release)
|
||||
if err != nil {
|
||||
ctx.ServerError("drawRepoSummaryCar", err)
|
||||
return
|
||||
}
|
||||
|
||||
serveCard(ctx, card, cacheKey)
|
||||
}
|
|
@ -51,6 +51,7 @@ const (
|
|||
func setCompareContext(ctx *context.Context, before, head *git.Commit, headOwner, headName string) {
|
||||
ctx.Data["BeforeCommit"] = before
|
||||
ctx.Data["HeadCommit"] = head
|
||||
ctx.Data["SignInLink"] = setting.AppSubURL + "/user/login?redirect_to=" + url.QueryEscape(ctx.Data["Link"].(string))
|
||||
|
||||
ctx.Data["GetBlobByPathForCommit"] = func(commit *git.Commit, path string) *git.Blob {
|
||||
if commit == nil {
|
||||
|
|
|
@ -10,9 +10,6 @@ import (
|
|||
"errors"
|
||||
"fmt"
|
||||
"html/template"
|
||||
"image"
|
||||
"image/color"
|
||||
"image/png"
|
||||
"math/big"
|
||||
"net/http"
|
||||
"net/url"
|
||||
|
@ -34,8 +31,6 @@ import (
|
|||
"code.gitea.io/gitea/models/unit"
|
||||
user_model "code.gitea.io/gitea/models/user"
|
||||
"code.gitea.io/gitea/modules/base"
|
||||
"code.gitea.io/gitea/modules/cache"
|
||||
"code.gitea.io/gitea/modules/card"
|
||||
"code.gitea.io/gitea/modules/container"
|
||||
"code.gitea.io/gitea/modules/emoji"
|
||||
"code.gitea.io/gitea/modules/git"
|
||||
|
@ -47,7 +42,6 @@ import (
|
|||
"code.gitea.io/gitea/modules/optional"
|
||||
repo_module "code.gitea.io/gitea/modules/repository"
|
||||
"code.gitea.io/gitea/modules/setting"
|
||||
"code.gitea.io/gitea/modules/storage"
|
||||
api "code.gitea.io/gitea/modules/structs"
|
||||
"code.gitea.io/gitea/modules/templates"
|
||||
"code.gitea.io/gitea/modules/templates/vars"
|
||||
|
@ -2076,6 +2070,8 @@ func ViewIssue(ctx *context.Context) {
|
|||
ctx.Data["RefEndName"] = git.RefName(issue.Ref).ShortName()
|
||||
ctx.Data["NewPinAllowed"] = pinAllowed
|
||||
ctx.Data["PinEnabled"] = setting.Repository.Issue.MaxPinned != 0
|
||||
ctx.Data["OpenGraphImageURL"] = issue.SummaryCardURL()
|
||||
ctx.Data["OpenGraphImageAltText"] = ctx.Tr("repo.issues.summary_card_alt", issue.Title, issue.Repo.FullName())
|
||||
|
||||
prepareHiddenCommentType(ctx)
|
||||
if ctx.Written() {
|
||||
|
@ -2233,222 +2229,6 @@ func GetIssueInfo(ctx *context.Context) {
|
|||
ctx.JSON(http.StatusOK, convert.ToIssue(ctx, ctx.Doer, issue))
|
||||
}
|
||||
|
||||
// GetSummaryCard get an issue of a repository
|
||||
func GetSummaryCard(ctx *context.Context) {
|
||||
issue, err := issues_model.GetIssueWithAttrsByIndex(ctx, ctx.Repo.Repository.ID, ctx.ParamsInt64(":index"))
|
||||
if err != nil {
|
||||
if issues_model.IsErrIssueNotExist(err) {
|
||||
ctx.Error(http.StatusNotFound)
|
||||
} else {
|
||||
ctx.Error(http.StatusInternalServerError, "GetIssueByIndex", err.Error())
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
if !ctx.Repo.CanReadIssuesOrPulls(issue.IsPull) {
|
||||
ctx.Error(http.StatusNotFound)
|
||||
return
|
||||
}
|
||||
|
||||
cache := cache.GetCache()
|
||||
cacheKey := fmt.Sprintf("summary_card:issue:%s:%d", ctx.Locale.Language(), issue.ID)
|
||||
pngData, ok := cache.Get(cacheKey).([]byte)
|
||||
if ok && pngData != nil && len(pngData) > 0 {
|
||||
ctx.Resp.Header().Set("Content-Type", "image/png")
|
||||
ctx.Resp.WriteHeader(http.StatusOK)
|
||||
_, err = ctx.Resp.Write(pngData)
|
||||
if err != nil {
|
||||
ctx.ServerError("GetSummaryCard", err)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
card, err := drawSummaryCard(ctx, issue)
|
||||
if err != nil {
|
||||
ctx.ServerError("GetSummaryCard", err)
|
||||
return
|
||||
}
|
||||
|
||||
// Encode image, store in cache
|
||||
var imageBuffer bytes.Buffer
|
||||
err = png.Encode(&imageBuffer, card.Img)
|
||||
if err != nil {
|
||||
ctx.ServerError("GetSummaryCard", err)
|
||||
return
|
||||
}
|
||||
imageBytes := imageBuffer.Bytes()
|
||||
err = cache.Put(cacheKey, imageBytes, setting.CacheService.TTLSeconds())
|
||||
if err != nil {
|
||||
// don't abort serving the image if we just had a cache storage failure
|
||||
log.Warn("failed to cache issue summary card: %v", err)
|
||||
}
|
||||
|
||||
// Finish the uncached image response
|
||||
ctx.Resp.Header().Set("Content-Type", "image/png")
|
||||
ctx.Resp.WriteHeader(http.StatusOK)
|
||||
_, err = ctx.Resp.Write(imageBytes)
|
||||
if err != nil {
|
||||
ctx.ServerError("GetSummaryCard", err)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
func drawSummaryCard(ctx *context.Context, issue *issues_model.Issue) (*card.Card, error) {
|
||||
width, height := issue.SummaryCardSize()
|
||||
mainCard, err := card.NewCard(width, height)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
mainCard.SetMargin(60)
|
||||
topSection, bottomSection := mainCard.Split(false, 75)
|
||||
issueSummary, issueIcon := topSection.Split(true, 80)
|
||||
repoInfo, issueDescription := issueSummary.Split(false, 15)
|
||||
|
||||
repoInfo.SetMargin(10)
|
||||
_, err = repoInfo.DrawText(fmt.Sprintf("%s - #%d", issue.Repo.FullName(), issue.Index), color.Gray{128}, 36, card.Top, card.Left)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
issueDescription.SetMargin(10)
|
||||
_, err = issueDescription.DrawText(issue.Title, color.Black, 56, card.Top, card.Left)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
issueIcon.SetMargin(10)
|
||||
|
||||
repoAvatarPath := issue.Repo.CustomAvatarRelativePath()
|
||||
if repoAvatarPath != "" {
|
||||
repoAvatarFile, err := storage.RepoAvatars.Open(repoAvatarPath)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
repoAvatarImage, _, err := image.Decode(repoAvatarFile)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
issueIcon.DrawImage(repoAvatarImage)
|
||||
} else {
|
||||
// If the repo didn't have an avatar, fallback to the repo owner's avatar for the right-hand-side icon
|
||||
err = issue.Repo.LoadOwner(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if issue.Repo.Owner != nil {
|
||||
err = drawUser(ctx, issueIcon, issue.Repo.Owner)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
issueStats, issueAttribution := bottomSection.Split(false, 50)
|
||||
|
||||
var state string
|
||||
if issue.IsPull && issue.PullRequest.HasMerged {
|
||||
if issue.PullRequest.Status == 3 {
|
||||
state = ctx.Locale.TrString("repo.pulls.manually_merged")
|
||||
} else {
|
||||
state = ctx.Locale.TrString("repo.pulls.merged")
|
||||
}
|
||||
} else if issue.IsClosed {
|
||||
state = ctx.Locale.TrString("repo.issues.closed_title")
|
||||
} else if issue.IsPull {
|
||||
if issue.PullRequest.IsWorkInProgress(ctx) {
|
||||
state = ctx.Locale.TrString("repo.issues.draft_title")
|
||||
} else {
|
||||
state = ctx.Locale.TrString("repo.issues.open_title")
|
||||
}
|
||||
} else {
|
||||
state = ctx.Locale.TrString("repo.issues.open_title")
|
||||
}
|
||||
state = strings.ToLower(state)
|
||||
|
||||
issueStats.SetMargin(10)
|
||||
if issue.IsPull {
|
||||
reviews := map[int64]bool{}
|
||||
for _, comment := range issue.Comments {
|
||||
if comment.Review != nil {
|
||||
reviews[comment.Review.ID] = true
|
||||
}
|
||||
}
|
||||
_, err = issueStats.DrawText(
|
||||
fmt.Sprintf("%s, %s, %s",
|
||||
ctx.Locale.TrN(
|
||||
issue.NumComments,
|
||||
"repo.issues.num_comments_1",
|
||||
"repo.issues.num_comments",
|
||||
issue.NumComments,
|
||||
),
|
||||
ctx.Locale.TrN(
|
||||
len(reviews),
|
||||
"repo.issues.num_reviews_one",
|
||||
"repo.issues.num_reviews_few",
|
||||
len(reviews),
|
||||
),
|
||||
state,
|
||||
),
|
||||
color.Gray{128}, 36, card.Top, card.Left)
|
||||
} else {
|
||||
_, err = issueStats.DrawText(
|
||||
fmt.Sprintf("%s, %s",
|
||||
ctx.Locale.TrN(
|
||||
issue.NumComments,
|
||||
"repo.issues.num_comments_1",
|
||||
"repo.issues.num_comments",
|
||||
issue.NumComments,
|
||||
),
|
||||
state,
|
||||
),
|
||||
color.Gray{128}, 36, card.Top, card.Left)
|
||||
}
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
issueAttributionIcon, issueAttributionText := issueAttribution.Split(true, 8)
|
||||
issueAttributionText.SetMargin(5)
|
||||
_, err = issueAttributionText.DrawText(
|
||||
fmt.Sprintf(
|
||||
"%s - %s",
|
||||
issue.Poster.Name,
|
||||
issue.Created.AsTime().Format("2006-01-02"),
|
||||
),
|
||||
color.Gray{128}, 36, card.Middle, card.Left)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = drawUser(ctx, issueAttributionIcon, issue.Poster)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return mainCard, nil
|
||||
}
|
||||
|
||||
func drawUser(ctx *context.Context, card *card.Card, user *user_model.User) error {
|
||||
if user.UseCustomAvatar {
|
||||
posterAvatarPath := user.CustomAvatarRelativePath()
|
||||
if posterAvatarPath != "" {
|
||||
userAvatarFile, err := storage.Avatars.Open(user.CustomAvatarRelativePath())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
userAvatarImage, _, err := image.Decode(userAvatarFile)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
card.DrawImage(userAvatarImage)
|
||||
}
|
||||
} else {
|
||||
posterAvatarLink := user.AvatarLinkWithSize(ctx, 256)
|
||||
card.DrawExternalImage(posterAvatarLink)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// UpdateIssueTitle change issue's title
|
||||
func UpdateIssueTitle(ctx *context.Context) {
|
||||
issue := GetActionIssue(ctx)
|
||||
|
|
|
@ -365,11 +365,7 @@ func SingleRelease(ctx *context.Context) {
|
|||
addVerifyTagToContext(ctx)
|
||||
|
||||
ctx.Data["PageIsSingleTag"] = release.IsTag
|
||||
if release.IsTag {
|
||||
ctx.Data["Title"] = release.TagName
|
||||
} else {
|
||||
ctx.Data["Title"] = release.Title
|
||||
}
|
||||
ctx.Data["Title"] = release.DisplayName()
|
||||
|
||||
err = release.LoadArchiveDownloadCount(ctx)
|
||||
if err != nil {
|
||||
|
@ -378,6 +374,13 @@ func SingleRelease(ctx *context.Context) {
|
|||
}
|
||||
|
||||
ctx.Data["Releases"] = releases
|
||||
|
||||
ctx.Data["OpenGraphTitle"] = fmt.Sprintf("%s - %s", release.DisplayName(), release.Repo.FullName())
|
||||
ctx.Data["OpenGraphDescription"] = base.EllipsisString(release.Note, 300)
|
||||
ctx.Data["OpenGraphURL"] = release.HTMLURL()
|
||||
ctx.Data["OpenGraphImageURL"] = release.SummaryCardURL()
|
||||
ctx.Data["OpenGraphImageAltText"] = ctx.Tr("repo.release.summary_card_alt", release.DisplayName(), release.Repo.FullName())
|
||||
|
||||
ctx.HTML(http.StatusOK, tplReleasesList)
|
||||
}
|
||||
|
||||
|
|
|
@ -67,6 +67,12 @@ func Search(ctx *context.Context) {
|
|||
ctx.Data["CodeSearchPath"] = path
|
||||
ctx.Data["CodeSearchMode"] = mode.String()
|
||||
ctx.Data["PageIsViewCode"] = true
|
||||
ctx.Data["CodeIndexerDisabled"] = !setting.Indexer.RepoIndexerEnabled
|
||||
if setting.Indexer.RepoIndexerEnabled {
|
||||
ctx.Data["CodeSearchOptions"] = code_indexer.CodeSearchOptions
|
||||
} else {
|
||||
ctx.Data["CodeSearchOptions"] = git.GrepSearchOptions
|
||||
}
|
||||
|
||||
if keyword == "" {
|
||||
ctx.HTML(http.StatusOK, tplSearch)
|
||||
|
@ -103,7 +109,6 @@ func Search(ctx *context.Context) {
|
|||
} else {
|
||||
ctx.Data["CodeIndexerUnavailable"] = !code_indexer.IsAvailable(ctx)
|
||||
}
|
||||
ctx.Data["CodeSearchOptions"] = code_indexer.CodeSearchOptions
|
||||
} else {
|
||||
grepOpt := git.GrepOptions{
|
||||
ContextLineNumber: 1,
|
||||
|
@ -139,10 +144,8 @@ func Search(ctx *context.Context) {
|
|||
strings.Join(r.LineCodes, "\n")),
|
||||
})
|
||||
}
|
||||
ctx.Data["CodeSearchOptions"] = git.GrepSearchOptions
|
||||
}
|
||||
|
||||
ctx.Data["CodeIndexerDisabled"] = !setting.Indexer.RepoIndexerEnabled
|
||||
ctx.Data["Repo"] = ctx.Repo.Repository
|
||||
ctx.Data["SourcePath"] = ctx.Repo.Repository.Link()
|
||||
ctx.Data["SearchResults"] = searchResults
|
||||
|
|
|
@ -86,7 +86,7 @@ func TestWiki(t *testing.T) {
|
|||
Wiki(ctx)
|
||||
assert.EqualValues(t, http.StatusOK, ctx.Resp.Status())
|
||||
assert.EqualValues(t, "Home", ctx.Data["Title"])
|
||||
assertPagesMetas(t, []string{"Home", "Long Page", "Page With Image", "Page With Spaced Name", "Unescaped File"}, ctx.Data["Pages"])
|
||||
assertPagesMetas(t, []string{"Home", "Long Page", "Page With Image", "Page With Spaced Name", "Unescaped File", "XSS"}, ctx.Data["Pages"])
|
||||
}
|
||||
|
||||
func TestWikiPages(t *testing.T) {
|
||||
|
@ -96,7 +96,7 @@ func TestWikiPages(t *testing.T) {
|
|||
contexttest.LoadRepo(t, ctx, 1)
|
||||
WikiPages(ctx)
|
||||
assert.EqualValues(t, http.StatusOK, ctx.Resp.Status())
|
||||
assertPagesMetas(t, []string{"Home", "Long Page", "Page With Image", "Page With Spaced Name", "Unescaped File"}, ctx.Data["Pages"])
|
||||
assertPagesMetas(t, []string{"Home", "Long Page", "Page With Image", "Page With Spaced Name", "Unescaped File", "XSS"}, ctx.Data["Pages"])
|
||||
}
|
||||
|
||||
func TestNewWiki(t *testing.T) {
|
||||
|
|
|
@ -1146,9 +1146,10 @@ func registerRoutes(m *web.Route) {
|
|||
m.Group("/{type:issues|pulls}", func() {
|
||||
m.Group("/{index}", func() {
|
||||
m.Get("/info", repo.GetIssueInfo)
|
||||
m.Get("/summary-card", repo.GetSummaryCard)
|
||||
m.Get("/summary-card", repo.DrawIssueSummaryCard)
|
||||
})
|
||||
})
|
||||
m.Get("/-/summary-card", repo.DrawRepoSummaryCard)
|
||||
}, ignSignIn, context.RepoAssignment, context.UnitTypes()) // for "/{username}/{reponame}" which doesn't require authentication
|
||||
|
||||
// Grouping for those endpoints that do require authentication
|
||||
|
@ -1298,6 +1299,7 @@ func registerRoutes(m *web.Route) {
|
|||
m.Get("/latest", repo.LatestRelease)
|
||||
m.Get(".rss", feedEnabled, repo.ReleasesFeedRSS)
|
||||
m.Get(".atom", feedEnabled, repo.ReleasesFeedAtom)
|
||||
m.Get("/summary-card/*", repo.DrawReleaseSummaryCard)
|
||||
}, ctxDataSet("EnableFeed", setting.Other.EnableFeed),
|
||||
repo.MustBeNotEmpty, context.RepoRefByType(context.RepoRefTag, true))
|
||||
m.Get("/releases/attachments/{uuid}", repo.MustBeNotEmpty, repo.GetAttachment)
|
||||
|
|
|
@ -25,6 +25,7 @@ import (
|
|||
unit_model "code.gitea.io/gitea/models/unit"
|
||||
user_model "code.gitea.io/gitea/models/user"
|
||||
"code.gitea.io/gitea/modules/cache"
|
||||
"code.gitea.io/gitea/modules/card"
|
||||
"code.gitea.io/gitea/modules/git"
|
||||
"code.gitea.io/gitea/modules/gitrepo"
|
||||
code_indexer "code.gitea.io/gitea/modules/indexer/code"
|
||||
|
@ -632,6 +633,12 @@ func RepoAssignment(ctx *Context) context.CancelFunc {
|
|||
ctx.Data["IsStaringRepo"] = repo_model.IsStaring(ctx, ctx.Doer.ID, repo.ID)
|
||||
}
|
||||
|
||||
cardWidth, cardHeight := card.DefaultSize()
|
||||
ctx.Data["OpenGraphImageURL"] = repo.SummaryCardURL()
|
||||
ctx.Data["OpenGraphImageWidth"] = cardWidth
|
||||
ctx.Data["OpenGraphImageHeight"] = cardHeight
|
||||
ctx.Data["OpenGraphImageAltText"] = ctx.Tr("repo.summary_card_alt", repo.FullName())
|
||||
|
||||
if repo.IsFork {
|
||||
RetrieveBaseRepo(ctx, repo)
|
||||
if ctx.Written() {
|
||||
|
|
|
@ -48,7 +48,7 @@ func (o *issue) ToFormat() f3.Interface {
|
|||
return o.NewFormat()
|
||||
}
|
||||
|
||||
var milestone *f3.Reference
|
||||
milestone := &f3.Reference{}
|
||||
if o.forgejoIssue.Milestone != nil {
|
||||
milestone = f3_tree.NewIssueMilestoneReference(o.forgejoIssue.Milestone.ID)
|
||||
}
|
||||
|
@ -82,9 +82,11 @@ func (o *issue) ToFormat() f3.Interface {
|
|||
func (o *issue) FromFormat(content f3.Interface) {
|
||||
issue := content.(*f3.Issue)
|
||||
var milestone *issues_model.Milestone
|
||||
var milestoneID int64
|
||||
if issue.Milestone != nil {
|
||||
milestoneID = issue.Milestone.GetIDAsInt()
|
||||
milestone = &issues_model.Milestone{
|
||||
ID: issue.Milestone.GetIDAsInt(),
|
||||
ID: milestoneID,
|
||||
}
|
||||
}
|
||||
o.forgejoIssue = &issues_model.Issue{
|
||||
|
@ -95,6 +97,7 @@ func (o *issue) FromFormat(content f3.Interface) {
|
|||
ID: issue.PosterID.GetIDAsInt(),
|
||||
},
|
||||
Content: issue.Content,
|
||||
MilestoneID: milestoneID,
|
||||
Milestone: milestone,
|
||||
IsClosed: issue.State == f3.IssueStateClosed,
|
||||
CreatedUnix: timeutil.TimeStamp(issue.Created.Unix()),
|
||||
|
@ -134,7 +137,7 @@ func (o *issue) Get(ctx context.Context) bool {
|
|||
panic(fmt.Errorf("issue %v %w", id, err))
|
||||
}
|
||||
if err := issue.LoadAttributes(ctx); err != nil {
|
||||
panic(err)
|
||||
panic(fmt.Errorf("LoadAttributes %v %w", id, err))
|
||||
}
|
||||
|
||||
o.forgejoIssue = issue
|
||||
|
@ -144,11 +147,67 @@ func (o *issue) Get(ctx context.Context) bool {
|
|||
func (o *issue) Patch(ctx context.Context) {
|
||||
node := o.GetNode()
|
||||
project := f3_tree.GetProjectID(o.GetNode())
|
||||
id := node.GetID().Int64()
|
||||
o.Trace("repo_id = %d, index = %d", project, id)
|
||||
if _, err := db.GetEngine(ctx).Where("`repo_id` = ? AND `index` = ?", project, id).Cols("name", "content", "is_closed").Update(o.forgejoIssue); err != nil {
|
||||
index := node.GetID().Int64()
|
||||
id := getIssueID(ctx, project, index)
|
||||
o.Trace("id = %d, repo_id = %d, index = %d, assignees = %v", id, project, index, o.forgejoIssue.Assignees)
|
||||
if _, err := db.GetEngine(ctx).Where("`id` = ?", id).Cols("name", "content", "is_closed", "milestone_id", "is_locked").Update(o.forgejoIssue); err != nil {
|
||||
panic(fmt.Errorf("%v %v", o.forgejoIssue, err))
|
||||
}
|
||||
|
||||
updateIssueAssignees(ctx, id, o.forgejoIssue.Assignees)
|
||||
updateIssueLabels(ctx, id, o.forgejoIssue.Labels)
|
||||
}
|
||||
|
||||
func getIssueID(ctx context.Context, repoID, index int64) int64 {
|
||||
var id int64
|
||||
if _, err := db.GetEngine(ctx).Select("id").Table("issue").Where("`repo_id` = ? AND `index` = ?", repoID, index).Get(&id); err != nil {
|
||||
panic(fmt.Errorf("%v %v: %w", repoID, index, err))
|
||||
}
|
||||
return id
|
||||
}
|
||||
|
||||
func updateIssueAssignees(ctx context.Context, issueID int64, assignees []*user_model.User) {
|
||||
sess := db.GetEngine(ctx)
|
||||
|
||||
if _, err := sess.Where("issue_id = ?", issueID).Delete(new(issues_model.IssueAssignees)); err != nil {
|
||||
panic(fmt.Errorf("delete IssueAssignees %v %w", issueID, err))
|
||||
}
|
||||
|
||||
issueAssignees := make([]issues_model.IssueAssignees, 0, len(assignees))
|
||||
for _, assignee := range assignees {
|
||||
issueAssignees = append(issueAssignees, issues_model.IssueAssignees{
|
||||
IssueID: issueID,
|
||||
AssigneeID: assignee.ID,
|
||||
})
|
||||
}
|
||||
|
||||
if len(issueAssignees) > 0 {
|
||||
if _, err := sess.Insert(issueAssignees); err != nil {
|
||||
panic(fmt.Errorf("Insert %v %w", issueID, err))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func updateIssueLabels(ctx context.Context, issueID int64, labels []*issues_model.Label) {
|
||||
sess := db.GetEngine(ctx)
|
||||
|
||||
if _, err := sess.Where("issue_id = ?", issueID).Delete(new(issues_model.IssueLabel)); err != nil {
|
||||
panic(fmt.Errorf("delete IssueLabel %v %w", issueID, err))
|
||||
}
|
||||
|
||||
issueLabels := make([]issues_model.IssueLabel, 0, len(labels))
|
||||
for _, label := range labels {
|
||||
issueLabels = append(issueLabels, issues_model.IssueLabel{
|
||||
IssueID: issueID,
|
||||
LabelID: label.ID,
|
||||
})
|
||||
}
|
||||
|
||||
if len(issueLabels) > 0 {
|
||||
if _, err := sess.Insert(issueLabels); err != nil {
|
||||
panic(fmt.Errorf("Insert %v %w", issueID, err))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (o *issue) Put(ctx context.Context) generic.NodeID {
|
||||
|
@ -156,17 +215,6 @@ func (o *issue) Put(ctx context.Context) generic.NodeID {
|
|||
o.Trace("%s", node.GetID())
|
||||
|
||||
o.forgejoIssue.RepoID = f3_tree.GetProjectID(o.GetNode())
|
||||
makeLabels := func(issueID int64) []issues_model.IssueLabel {
|
||||
labels := make([]issues_model.IssueLabel, 0, len(o.forgejoIssue.Labels))
|
||||
for _, label := range o.forgejoIssue.Labels {
|
||||
o.Trace("%d with label %d", issueID, label.ID)
|
||||
labels = append(labels, issues_model.IssueLabel{
|
||||
IssueID: issueID,
|
||||
LabelID: label.ID,
|
||||
})
|
||||
}
|
||||
return labels
|
||||
}
|
||||
|
||||
idx, err := db.GetNextResourceIndex(ctx, "issue_index", o.forgejoIssue.RepoID)
|
||||
if err != nil {
|
||||
|
@ -180,31 +228,8 @@ func (o *issue) Put(ctx context.Context) generic.NodeID {
|
|||
panic(err)
|
||||
}
|
||||
|
||||
labels := makeLabels(o.forgejoIssue.ID)
|
||||
if len(labels) > 0 {
|
||||
if _, err := sess.Insert(labels); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
makeAssignees := func(issueID int64) []issues_model.IssueAssignees {
|
||||
assignees := make([]issues_model.IssueAssignees, 0, len(o.forgejoIssue.Assignees))
|
||||
for _, assignee := range o.forgejoIssue.Assignees {
|
||||
o.Trace("%d with assignee %d", issueID, assignee.ID)
|
||||
assignees = append(assignees, issues_model.IssueAssignees{
|
||||
IssueID: issueID,
|
||||
AssigneeID: assignee.ID,
|
||||
})
|
||||
}
|
||||
return assignees
|
||||
}
|
||||
|
||||
assignees := makeAssignees(o.forgejoIssue.ID)
|
||||
if len(assignees) > 0 {
|
||||
if _, err := sess.Insert(assignees); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
updateIssueAssignees(ctx, o.forgejoIssue.ID, o.forgejoIssue.Assignees)
|
||||
updateIssueLabels(ctx, o.forgejoIssue.ID, o.forgejoIssue.Labels)
|
||||
|
||||
o.Trace("issue created %d/%d", o.forgejoIssue.ID, o.forgejoIssue.Index)
|
||||
return generic.NewNodeID(o.forgejoIssue.Index)
|
||||
|
|
|
@ -7,6 +7,7 @@ package driver
|
|||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"code.gitea.io/gitea/models/db"
|
||||
issues_model "code.gitea.io/gitea/models/issues"
|
||||
|
@ -45,7 +46,7 @@ func (o *label) ToFormat() f3.Interface {
|
|||
return &f3.Label{
|
||||
Common: f3.NewCommon(fmt.Sprintf("%d", o.forgejoLabel.ID)),
|
||||
Name: o.forgejoLabel.Name,
|
||||
Color: o.forgejoLabel.Color,
|
||||
Color: strings.TrimPrefix(o.forgejoLabel.Color, "#"),
|
||||
Description: o.forgejoLabel.Description,
|
||||
}
|
||||
}
|
||||
|
@ -56,7 +57,7 @@ func (o *label) FromFormat(content f3.Interface) {
|
|||
ID: f3_util.ParseInt(label.GetID()),
|
||||
Name: label.Name,
|
||||
Description: label.Description,
|
||||
Color: label.Color,
|
||||
Color: "#" + label.Color,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -117,7 +117,7 @@ func (o *milestone) Get(ctx context.Context) bool {
|
|||
|
||||
func (o *milestone) Patch(ctx context.Context) {
|
||||
o.Trace("%d", o.forgejoMilestone.ID)
|
||||
if _, err := db.GetEngine(ctx).ID(o.forgejoMilestone.ID).Cols("name", "description").Update(o.forgejoMilestone); err != nil {
|
||||
if _, err := db.GetEngine(ctx).ID(o.forgejoMilestone.ID).Cols("name", "description", "is_closed", "deadline_unix").Update(o.forgejoMilestone); err != nil {
|
||||
panic(fmt.Errorf("UpdateMilestoneCols: %v %v", o.forgejoMilestone, err))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -85,6 +85,10 @@ func changeMilestoneAssign(ctx context.Context, doer *user_model.User, issue *is
|
|||
}
|
||||
}
|
||||
|
||||
if issue.MilestoneID == 0 {
|
||||
issue.Milestone = nil
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
|
@ -24,6 +24,7 @@ func TestChangeMilestoneAssign(t *testing.T) {
|
|||
|
||||
oldMilestoneID := issue.MilestoneID
|
||||
issue.MilestoneID = 2
|
||||
require.NoError(t, issue.LoadMilestone(db.DefaultContext))
|
||||
require.NoError(t, ChangeMilestoneAssign(db.DefaultContext, issue, doer, oldMilestoneID))
|
||||
unittest.AssertExistsAndLoadBean(t, &issues_model.Comment{
|
||||
IssueID: issue.ID,
|
||||
|
@ -32,4 +33,11 @@ func TestChangeMilestoneAssign(t *testing.T) {
|
|||
OldMilestoneID: oldMilestoneID,
|
||||
})
|
||||
unittest.CheckConsistencyFor(t, &issues_model.Milestone{}, &issues_model.Issue{})
|
||||
assert.NotNil(t, issue.Milestone)
|
||||
|
||||
oldMilestoneID = issue.MilestoneID
|
||||
issue.MilestoneID = 0
|
||||
require.NoError(t, ChangeMilestoneAssign(db.DefaultContext, issue, doer, oldMilestoneID))
|
||||
assert.EqualValues(t, 0, issue.MilestoneID)
|
||||
assert.Nil(t, issue.Milestone)
|
||||
}
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
{{if .IsAdmin}}
|
||||
<a href="{{AppSubUrl}}/admin/config">{{AppVer}}</a>
|
||||
{{else}}
|
||||
{{AppVer}}
|
||||
{{AppVerNoMetadata}}
|
||||
{{end}}
|
||||
{{end}}
|
||||
{{if and .TemplateLoadTimes ShowFooterTemplateLoadTime}}
|
||||
|
|
|
@ -1,4 +1,25 @@
|
|||
{{- /* og:description - a one to two sentence description of your object, maybe it only needs at most 300 bytes */ -}}
|
||||
{{if .OpenGraphTitle}}
|
||||
<meta property="og:title" content="{{.OpenGraphTitle}}">
|
||||
{{end}}
|
||||
{{if .OpenGraphDescription}}
|
||||
<meta property="og:description" content="{{.OpenGraphDescription}}">
|
||||
{{end}}
|
||||
{{if .OpenGraphURL}}
|
||||
<meta property="og:url" content="{{.OpenGraphURL}}">
|
||||
{{end}}
|
||||
{{if .OpenGraphImageURL}}
|
||||
<meta property="og:image" content="{{.OpenGraphImageURL}}">
|
||||
{{if .OpenGraphImageWidth}}
|
||||
<meta property="og:image:width" content="{{.OpenGraphImageWidth}}">
|
||||
{{end}}
|
||||
{{if .OpenGraphImageHeight}}
|
||||
<meta property="og:image:height" content="{{.OpenGraphImageHeight}}">
|
||||
{{end}}
|
||||
{{if .OpenGraphImageAltText}}
|
||||
<meta property="og:image:alt" content="{{.OpenGraphImageAltText}}">
|
||||
{{end}}
|
||||
{{end}}
|
||||
{{if .PageIsUserProfile}}
|
||||
<meta property="og:title" content="{{.ContextUser.DisplayName}}">
|
||||
<meta property="og:type" content="profile">
|
||||
|
@ -14,10 +35,6 @@
|
|||
{{if .Issue.Content}}
|
||||
<meta property="og:description" content="{{StringUtils.EllipsisString .Issue.Content 300}}">
|
||||
{{end}}
|
||||
<meta property="og:image" content="{{.Issue.SummaryCardURL}}">
|
||||
<meta property="og:image:width" content="{{.Issue.SummaryCardWidth}}">
|
||||
<meta property="og:image:height" content="{{.Issue.SummaryCardHeight}}">
|
||||
<meta property="og:image:alt" content="{{ctx.Locale.Tr "repo.issues.summary_card_alt" .Issue.Title .Repository.FullName}}">
|
||||
{{else if or .PageIsDiff .IsViewFile}}
|
||||
<meta property="og:title" content="{{.Title}}">
|
||||
<meta property="og:url" content="{{AppUrl}}{{.Link}}">
|
||||
|
@ -35,14 +52,18 @@
|
|||
<meta property="og:description" content="{{StringUtils.EllipsisString .Repository.Description 300}}">
|
||||
{{end}}
|
||||
{{else}}
|
||||
<meta property="og:title" content="{{.Repository.Name}}">
|
||||
<meta property="og:url" content="{{.Repository.HTMLURL}}">
|
||||
{{if .Repository.Description}}
|
||||
{{if not .OpenGraphTitle}}
|
||||
<meta property="og:title" content="{{.Repository.Name}}">
|
||||
{{end}}
|
||||
{{if not .OpenGraphURL}}
|
||||
<meta property="og:url" content="{{.Repository.HTMLURL}}">
|
||||
{{end}}
|
||||
{{if and (.Repository.Description) (not .OpenGraphDescription)}}
|
||||
<meta property="og:description" content="{{StringUtils.EllipsisString .Repository.Description 300}}">
|
||||
{{end}}
|
||||
{{end}}
|
||||
<meta property="og:type" content="object">
|
||||
{{if not .Issue}}
|
||||
{{if and (not .Issue) (not .OpenGraphImageURL)}}
|
||||
{{if (.Repository.AvatarLink ctx)}}
|
||||
<meta property="og:image" content="{{.Repository.AvatarLink ctx}}">
|
||||
{{else}}
|
||||
|
|
|
@ -263,7 +263,7 @@
|
|||
</div>
|
||||
{{end}}
|
||||
{{if .NoteRendered}}
|
||||
<div class="ui top attached header segment git-notes">
|
||||
<div class="ui top attached header segment git-notes tw-flex tw-gap-1 tw-flex-wrap">
|
||||
{{svg "octicon-note" 16 "tw-mr-2"}}
|
||||
{{ctx.Locale.Tr "repo.diff.git-notes"}}:
|
||||
{{if .NoteAuthor}}
|
||||
|
@ -277,11 +277,11 @@
|
|||
{{else}}
|
||||
<strong>{{.NoteCommit.Author.Name}}</strong>
|
||||
{{end}}
|
||||
<span class="text grey" id="note-authored-time">{{DateUtils.TimeSince .NoteCommit.Author.When}}</span>
|
||||
<span class="text grey tw-flex-1" id="note-authored-time">{{DateUtils.TimeSince .NoteCommit.Author.When}}</span>
|
||||
{{if and ($.Permission.CanWrite $.UnitTypeCode) (not $.Repository.IsArchived) (not .IsDeleted)}}
|
||||
<div class="ui right">
|
||||
<button id="commit-notes-edit-button" class="ui tiny primary button">{{ctx.Locale.Tr "edit"}}</button>
|
||||
<button class="ui tiny button red show-modal" data-modal="#delete-note-modal">{{ctx.Locale.Tr "remove"}}</button>
|
||||
<div class="ui tw-flex tw-items-center">
|
||||
<button id="commit-notes-edit-button" class="ui tiny primary button tw-py-[6px] tw-px-[10px]">{{ctx.Locale.Tr "edit"}}</button>
|
||||
<button class="ui tiny button red show-modal tw-py-[6px] tw-px-[10px]" data-modal="#delete-note-modal">{{ctx.Locale.Tr "remove"}}</button>
|
||||
</div>
|
||||
<div class="ui small modal" id="delete-note-modal">
|
||||
<div class="header">
|
||||
|
|
|
@ -16,206 +16,34 @@
|
|||
<p>{{ctx.Locale.TrN .MaxCreationLimit "repo.form.reach_limit_of_creation_1" "repo.form.reach_limit_of_creation_n" .MaxCreationLimit}}</p>
|
||||
</div>
|
||||
{{end}}
|
||||
<div class="inline required field {{if .Err_Owner}}error{{end}}">
|
||||
<label>{{ctx.Locale.Tr "repo.owner"}}</label>
|
||||
<div class="ui selection owner dropdown">
|
||||
<input type="hidden" id="uid" name="uid" value="{{.ContextUser.ID}}" required>
|
||||
<span class="text truncated-item-container" title="{{.ContextUser.Name}}">
|
||||
{{ctx.AvatarUtils.Avatar .ContextUser 28 "mini"}}
|
||||
<span class="truncated-item-name">{{.ContextUser.ShortName 40}}</span>
|
||||
</span>
|
||||
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||
<div class="menu">
|
||||
<div class="item truncated-item-container" data-value="{{.SignedUser.ID}}" title="{{.SignedUser.Name}}">
|
||||
{{ctx.AvatarUtils.Avatar .SignedUser 28 "mini"}}
|
||||
<span class="truncated-item-name">{{.SignedUser.ShortName 40}}</span>
|
||||
</div>
|
||||
{{range .Orgs}}
|
||||
<div class="item truncated-item-container" data-value="{{.ID}}" title="{{.Name}}">
|
||||
{{ctx.AvatarUtils.Avatar . 28 "mini"}}
|
||||
<span class="truncated-item-name">{{.ShortName 40}}</span>
|
||||
</div>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
<span class="help">{{ctx.Locale.Tr "repo.owner_helper"}}</span>
|
||||
</div>
|
||||
<fieldset>
|
||||
{{template "repo/create_basic" .}}
|
||||
</fieldset>
|
||||
|
||||
<div class="inline required field {{if .Err_RepoName}}error{{end}}">
|
||||
<label for="repo_name">{{ctx.Locale.Tr "repo.repo_name"}}</label>
|
||||
<input id="repo_name" name="repo_name" value="{{.repo_name}}" autofocus required maxlength="100">
|
||||
<span class="help">{{ctx.Locale.Tr "repo.repo_name_helper"}}</span>
|
||||
</div>
|
||||
<div class="inline field">
|
||||
<label>{{ctx.Locale.Tr "repo.visibility"}}</label>
|
||||
<div class="ui checkbox">
|
||||
<input name="private" type="checkbox"
|
||||
{{if .IsForcedPrivate}}
|
||||
checked disabled
|
||||
{{else}}
|
||||
{{if .private}}checked{{end}}
|
||||
{{end}}>
|
||||
<label>{{ctx.Locale.Tr "repo.visibility_helper"}}</label>
|
||||
</div>
|
||||
{{if .IsForcedPrivate}}
|
||||
<span class="help">{{ctx.Locale.Tr "repo.visibility_helper_forced"}}</span>
|
||||
{{end}}
|
||||
<span class="help">{{ctx.Locale.Tr "repo.visibility_description"}}</span>
|
||||
</div>
|
||||
<div class="inline field {{if .Err_Description}}error{{end}}">
|
||||
<label for="description">{{ctx.Locale.Tr "repo.repo_desc"}}</label>
|
||||
<textarea id="description" rows="2" name="description" placeholder="{{ctx.Locale.Tr "repo.repo_desc_helper"}}" maxlength="2048">{{.description}}</textarea>
|
||||
</div>
|
||||
<div class="inline field">
|
||||
<label>{{ctx.Locale.Tr "repo.template"}}</label>
|
||||
<div id="repo_template_search" class="ui search selection dropdown">
|
||||
<input type="hidden" id="repo_template" name="repo_template" value="{{if ne .repo_template 0}}{{.repo_template}}{{end}}">
|
||||
<div class="default text">{{.repo_template_name}}</div>
|
||||
<div class="menu">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="template_units" class="tw-hidden">
|
||||
<div class="inline field">
|
||||
<label>{{ctx.Locale.Tr "repo.template.items"}}</label>
|
||||
<div class="ui checkbox">
|
||||
<input name="git_content" type="checkbox" {{if .git_content}}checked{{end}}>
|
||||
<label>{{ctx.Locale.Tr "repo.template.git_content"}}</label>
|
||||
</div>
|
||||
<div class="ui checkbox" {{if not .SignedUser.CanEditGitHook}}data-tooltip-content="{{ctx.Locale.Tr "repo.template.git_hooks_tooltip"}}"{{end}}>
|
||||
<input name="git_hooks" type="checkbox" {{if .git_hooks}}checked{{end}}>
|
||||
<label>{{ctx.Locale.Tr "repo.template.git_hooks"}}</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="inline field">
|
||||
<label></label>
|
||||
<div class="ui checkbox">
|
||||
<input name="webhooks" type="checkbox" {{if .webhooks}}checked{{end}}>
|
||||
<label>{{ctx.Locale.Tr "repo.template.webhooks"}}</label>
|
||||
</div>
|
||||
<div class="ui checkbox">
|
||||
<input name="topics" type="checkbox" {{if .topics}}checked{{end}}>
|
||||
<label>{{ctx.Locale.Tr "repo.template.topics"}}</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="inline field">
|
||||
<label></label>
|
||||
<div class="ui checkbox">
|
||||
<input name="avatar" type="checkbox" {{if .avatar}}checked{{end}}>
|
||||
<label>{{ctx.Locale.Tr "repo.template.avatar"}}</label>
|
||||
</div>
|
||||
<div class="ui checkbox">
|
||||
<input name="labels" type="checkbox" {{if .labels}}checked{{end}}>
|
||||
<label>{{ctx.Locale.Tr "repo.template.issue_labels"}}</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="inline field">
|
||||
<label></label>
|
||||
<div class="ui checkbox">
|
||||
<input name="protected_branch" type="checkbox" {{if .protected_branch}}checked{{end}}>
|
||||
<label>{{ctx.Locale.Tr "repo.settings.protected_branch"}}</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<fieldset>
|
||||
<legend>
|
||||
{{ctx.Locale.Tr "repo.new_from_template"}}
|
||||
<span class="help">{{ctx.Locale.Tr "repo.new_from_template_description"}}</span>
|
||||
</legend>
|
||||
{{template "repo/create_from_template" .}}
|
||||
</fieldset>
|
||||
|
||||
<div id="non_template">
|
||||
<div class="inline field">
|
||||
<label>{{ctx.Locale.Tr "repo.issue_labels"}}</label>
|
||||
<div class="ui search selection dropdown">
|
||||
<input type="hidden" name="issue_labels" value="{{.issueLabels}}">
|
||||
<div class="default text">{{ctx.Locale.Tr "repo.issue_labels_helper"}}</div>
|
||||
<div class="menu">
|
||||
<div class="item" data-value="">{{ctx.Locale.Tr "repo.issue_labels_helper"}}</div>
|
||||
{{range .LabelTemplateFiles}}
|
||||
<div class="item" data-value="{{.DisplayName}}">{{.DisplayName}}<br><p>({{.Description}})</p></div>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<fieldset>
|
||||
<legend>{{ctx.Locale.Tr "repo.auto_init"}}</legend>
|
||||
{{template "repo/create_init" .}}
|
||||
</fieldset>
|
||||
|
||||
<div class="divider"></div>
|
||||
|
||||
<div class="inline field">
|
||||
<label>.gitignore</label>
|
||||
<div class="ui multiple search selection dropdown">
|
||||
<input type="hidden" name="gitignores" value="{{.gitignores}}">
|
||||
<div class="default text">{{ctx.Locale.Tr "repo.repo_gitignore_helper"}}</div>
|
||||
<div class="menu">
|
||||
{{range .Gitignores}}
|
||||
<div class="item" data-value="{{.}}">{{.}}</div>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
<span class="help">{{ctx.Locale.Tr "repo.repo_gitignore_helper_desc"}}</span>
|
||||
</div>
|
||||
<div class="inline field">
|
||||
<label>{{ctx.Locale.Tr "repo.license"}}</label>
|
||||
<div class="ui search selection dropdown">
|
||||
<input type="hidden" name="license" value="{{.license}}">
|
||||
<div class="default text">{{ctx.Locale.Tr "repo.license_helper"}}</div>
|
||||
<div class="menu">
|
||||
<div class="item" data-value="">{{ctx.Locale.Tr "repo.license_helper"}}</div>
|
||||
{{range .Licenses}}
|
||||
<div class="item" data-value="{{.}}">{{.}}</div>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
<span class="help">{{ctx.Locale.Tr "repo.license_helper_desc" "https://choosealicense.com/"}}</span>
|
||||
</div>
|
||||
|
||||
<div class="inline field">
|
||||
<label>{{ctx.Locale.Tr "repo.readme"}}</label>
|
||||
<div class="ui selection dropdown">
|
||||
<input type="hidden" name="readme" value="{{.readme}}">
|
||||
<div class="default text">{{ctx.Locale.Tr "repo.readme_helper"}}</div>
|
||||
<div class="menu">
|
||||
{{range .Readmes}}
|
||||
<div class="item" data-value="{{.}}">{{.}}</div>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
<span class="help">{{ctx.Locale.Tr "repo.readme_helper_desc"}}</span>
|
||||
</div>
|
||||
<div class="inline field">
|
||||
<div class="ui checkbox" id="auto-init">
|
||||
<input name="auto_init" type="checkbox" {{if .auto_init}}checked{{end}}>
|
||||
<label>{{ctx.Locale.Tr "repo.auto_init"}}</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="inline field">
|
||||
<label for="default_branch">{{ctx.Locale.Tr "repo.default_branch"}}</label>
|
||||
<input id="default_branch" name="default_branch" value="{{.default_branch}}" placeholder="{{.default_branch}}">
|
||||
<span class="help">{{ctx.Locale.Tr "repo.default_branch_helper"}}</span>
|
||||
</div>
|
||||
<div class="inline field">
|
||||
<label>{{ctx.Locale.Tr "repo.object_format"}}</label>
|
||||
<div class="ui selection owner dropdown">
|
||||
<input type="hidden" id="object_format_name" name="object_format_name" value="{{.DefaultObjectFormat.Name}}" required>
|
||||
<div class="default text">{{.DefaultObjectFormat.Name}}</div>
|
||||
<div class="menu">
|
||||
{{range .SupportedObjectFormats}}
|
||||
<div class="item" data-value="{{.Name}}">{{.Name}}</div>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
<span class="help">{{ctx.Locale.Tr "repo.object_format_helper"}}</span>
|
||||
</div>
|
||||
<div class="inline field">
|
||||
<label>{{ctx.Locale.Tr "repo.template"}}</label>
|
||||
<div class="ui checkbox">
|
||||
<input name="template" type="checkbox">
|
||||
<label>{{ctx.Locale.Tr "repo.template_helper"}}</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<br>
|
||||
<div class="inline field">
|
||||
<label></label>
|
||||
<button class="ui primary button{{if not .CanCreateRepo}} disabled{{end}}">
|
||||
{{ctx.Locale.Tr "repo.create_repo"}}
|
||||
</button>
|
||||
<fieldset>
|
||||
<legend>{{ctx.Locale.Tr "repo.new_advanced"}}</legend>
|
||||
<details><summary>{{ctx.Locale.Tr "repo.new_advanced_expand"}}</summary>
|
||||
{{template "repo/create_advanced" .}}
|
||||
</details>
|
||||
</fieldset>
|
||||
</div>
|
||||
<button class="ui primary button{{if not .CanCreateRepo}} disabled{{end}}">
|
||||
{{ctx.Locale.Tr "repo.create_repo"}}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
|
45
templates/repo/create_advanced.tmpl
Normal file
45
templates/repo/create_advanced.tmpl
Normal file
|
@ -0,0 +1,45 @@
|
|||
<label>
|
||||
{{ctx.Locale.Tr "repo.issue_labels"}}
|
||||
<div class="ui search selection dropdown">
|
||||
<input type="hidden" name="issue_labels" value="{{.issueLabels}}">
|
||||
<div class="default text">{{ctx.Locale.Tr "repo.issue_labels_helper"}}</div>
|
||||
<div class="menu">
|
||||
<div class="item" data-value="">{{ctx.Locale.Tr "repo.issue_labels_helper"}}</div>
|
||||
{{range .LabelTemplateFiles}}
|
||||
<div class="item" data-value="{{.DisplayName}}">{{.DisplayName}}<br><p>({{.Description}})</p></div>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
</label>
|
||||
|
||||
{{$supportedFormatsLength := len .SupportedObjectFormats}}
|
||||
{{/* Only offer object format selection if there is an actual choice */}}
|
||||
{{if ge $supportedFormatsLength 2}}
|
||||
<label>
|
||||
{{ctx.Locale.Tr "repo.object_format"}}
|
||||
<div class="ui selection dropdown">
|
||||
<input type="hidden" id="object_format_name" name="object_format_name" value="{{.DefaultObjectFormat.Name}}" required>
|
||||
<div class="default text">{{.DefaultObjectFormat.Name}}</div>
|
||||
<div class="menu">
|
||||
{{range .SupportedObjectFormats}}
|
||||
<div class="item" data-value="{{.Name}}">{{.Name}}</div>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
<span class="help">{{ctx.Locale.Tr "repo.object_format_helper"}}</span>
|
||||
</label>
|
||||
{{else}}
|
||||
<input type="hidden" name="object_format_name" value="{{.DefaultObjectFormat.Name}}" required>
|
||||
{{end}}
|
||||
|
||||
<label>
|
||||
{{ctx.Locale.Tr "repo.default_branch"}}
|
||||
<input name="default_branch" value="{{.default_branch}}" placeholder="{{.default_branch}}">
|
||||
<span class="help">{{ctx.Locale.Tr "repo.default_branch_helper"}}</span>
|
||||
</label>
|
||||
|
||||
<label>
|
||||
<input name="template" type="checkbox">
|
||||
{{ctx.Locale.Tr "repo.template_helper"}}
|
||||
<span class="help">{{ctx.Locale.Tr "repo.template_description"}}</span>
|
||||
</label>
|
47
templates/repo/create_basic.tmpl
Normal file
47
templates/repo/create_basic.tmpl
Normal file
|
@ -0,0 +1,47 @@
|
|||
<label id="repo_owner_label" {{if .Err_Owner}}class="field error"{{end}}>
|
||||
{{ctx.Locale.Tr "repo.owner"}}
|
||||
<div class="ui selection required dropdown" aria-labelledby="repo_owner_label">
|
||||
{{/* uid id is used by the repo-template code */}}
|
||||
<input type="hidden" id="uid" name="uid" value="{{.ContextUser.ID}}" required>
|
||||
<span class="text truncated-item-container" title="{{.ContextUser.Name}}">
|
||||
{{ctx.AvatarUtils.Avatar .ContextUser 28 "mini"}}
|
||||
<span class="truncated-item-name">{{.ContextUser.ShortName 40}}</span>
|
||||
</span>
|
||||
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||
<div class="menu">
|
||||
<div class="item truncated-item-container" data-value="{{.SignedUser.ID}}" title="{{.SignedUser.Name}}">
|
||||
{{ctx.AvatarUtils.Avatar .SignedUser 28 "mini"}}
|
||||
<span class="truncated-item-name">{{.SignedUser.ShortName 40}}</span>
|
||||
</div>
|
||||
{{range .Orgs}}
|
||||
<div class="item truncated-item-container" data-value="{{.ID}}" title="{{.Name}}">
|
||||
{{ctx.AvatarUtils.Avatar . 28 "mini"}}
|
||||
<span class="truncated-item-name">{{.ShortName 40}}</span>
|
||||
</div>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
<span class="help">{{ctx.Locale.Tr "repo.owner_helper"}}</span>
|
||||
</label>
|
||||
<label {{if .Err_RepoName}}class="field error"{{end}}>
|
||||
{{ctx.Locale.Tr "repo.repo_name"}}
|
||||
<input name="repo_name" value="{{.repo_name}}" required maxlength="100">
|
||||
<span class="help">{{ctx.Locale.Tr "repo.repo_name_helper"}}</span>
|
||||
</label>
|
||||
<label>
|
||||
<input name="private" type="checkbox"
|
||||
{{if .IsForcedPrivate}}
|
||||
checked disabled
|
||||
{{else}}
|
||||
{{if .private}}checked{{end}}
|
||||
{{end}}>
|
||||
{{ctx.Locale.Tr "repo.visibility_helper"}}
|
||||
{{if .IsForcedPrivate}}
|
||||
<span class="help">{{ctx.Locale.Tr "repo.visibility_helper_forced"}}</span>
|
||||
{{end}}
|
||||
<span class="help">{{ctx.Locale.Tr "repo.visibility_description"}}</span>
|
||||
</label>
|
||||
<label {{if .Err_Description}}class="field error"{{end}}>
|
||||
{{ctx.Locale.Tr "repo.repo_desc"}}
|
||||
<textarea rows="2" name="description" placeholder="{{ctx.Locale.Tr "repo.repo_desc_helper"}}" maxlength="2048">{{.description}}</textarea>
|
||||
</label>
|
49
templates/repo/create_from_template.tmpl
Normal file
49
templates/repo/create_from_template.tmpl
Normal file
|
@ -0,0 +1,49 @@
|
|||
<label class="tw-mb-0">
|
||||
{{ctx.Locale.Tr "repo.template"}}
|
||||
</label>
|
||||
{{/* If the dropdown is inside the label, the focus works correctly and it is more accessible.
|
||||
However, the Javascript takes the focus and opens the dropdown again immediately after closing.
|
||||
When the user interacts (via mouse or keyboard), the dropdown closes again.
|
||||
Due to the fieldset legend, this solutions is probably acceptable until the dropdown can be fixed properly. */}}
|
||||
<div id="repo_template_search" class="ui search selection dropdown tw-w-full">
|
||||
<input type="hidden" id="repo_template" name="repo_template" value="{{if ne .repo_template 0}}{{.repo_template}}{{end}}">
|
||||
<div class="default text">{{.repo_template_name}}</div>
|
||||
<div class="menu">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<fieldset id="template_units" class="tw-hidden simple-grid grid-2">
|
||||
<legend>{{ctx.Locale.Tr "repo.template.items"}}</legend>
|
||||
|
||||
<label>
|
||||
<input name="git_content" type="checkbox" {{if .git_content}}checked{{end}}>
|
||||
{{ctx.Locale.Tr "repo.template.git_content"}}
|
||||
</label>
|
||||
<label>
|
||||
<input name="webhooks" type="checkbox" {{if .webhooks}}checked{{end}}>
|
||||
{{ctx.Locale.Tr "repo.template.webhooks"}}
|
||||
</label>
|
||||
<label>
|
||||
<input name="topics" type="checkbox" {{if .topics}}checked{{end}}>
|
||||
{{ctx.Locale.Tr "repo.template.topics"}}
|
||||
</label>
|
||||
<label>
|
||||
<input name="avatar" type="checkbox" {{if .avatar}}checked{{end}}>
|
||||
{{ctx.Locale.Tr "repo.template.avatar"}}
|
||||
</label>
|
||||
<label>
|
||||
<input name="labels" type="checkbox" {{if .labels}}checked{{end}}>
|
||||
{{ctx.Locale.Tr "repo.template.issue_labels"}}
|
||||
</label>
|
||||
<label>
|
||||
<input name="protected_branch" type="checkbox" {{if .protected_branch}}checked{{end}}>
|
||||
{{ctx.Locale.Tr "repo.settings.protected_branch"}}
|
||||
</label>
|
||||
<label>
|
||||
<input name="git_hooks" type="checkbox" {{if .git_hooks}}checked{{end}}>
|
||||
{{ctx.Locale.Tr "repo.template.git_hooks"}}
|
||||
{{if not .SignedUser.CanEditGitHook}}
|
||||
<span class="help">{{ctx.Locale.Tr "repo.template.git_hooks_tooltip"}}</span>
|
||||
{{end}}
|
||||
</label>
|
||||
</fieldset>
|
56
templates/repo/create_init.tmpl
Normal file
56
templates/repo/create_init.tmpl
Normal file
|
@ -0,0 +1,56 @@
|
|||
<label>
|
||||
<input name="auto_init" type="checkbox" {{if .auto_init}}checked{{end}}>
|
||||
{{ctx.Locale.Tr "repo.auto_init"}}
|
||||
<span class="help">{{ctx.Locale.Tr "repo.auto_init_description"}}</span>
|
||||
</label>
|
||||
|
||||
<div class="hide-unless-checked">
|
||||
<label>
|
||||
.gitignore
|
||||
<div class="ui multiple search selection dropdown">
|
||||
<input type="hidden" name="gitignores" value="{{.gitignores}}">
|
||||
<div class="default text">{{ctx.Locale.Tr "repo.repo_gitignore_helper"}}</div>
|
||||
<div class="menu">
|
||||
{{range .Gitignores}}
|
||||
<div class="item" data-value="{{.}}">{{.}}</div>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
<span class="help">{{ctx.Locale.Tr "repo.repo_gitignore_helper_desc"}}</span>
|
||||
</label>
|
||||
|
||||
<label>
|
||||
{{ctx.Locale.Tr "repo.license"}}
|
||||
<div class="ui search selection dropdown">
|
||||
<input type="hidden" name="license" value="{{.license}}">
|
||||
<div class="default text">{{ctx.Locale.Tr "repo.license_helper"}}</div>
|
||||
<div class="menu">
|
||||
<div class="item" data-value="">{{ctx.Locale.Tr "repo.license_helper"}}</div>
|
||||
{{range .Licenses}}
|
||||
<div class="item" data-value="{{.}}">{{.}}</div>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
<span class="help">{{ctx.Locale.Tr "repo.license_helper_desc" "https://choosealicense.com/"}}</span>
|
||||
</label>
|
||||
|
||||
{{$supportedReadmesLength := len .Readmes}}
|
||||
{{/* Only offer README selection if there is an actual choice */}}
|
||||
{{if ge $supportedReadmesLength 2}}
|
||||
<label>
|
||||
{{ctx.Locale.Tr "repo.readme"}}
|
||||
<div class="ui selection dropdown">
|
||||
<input type="hidden" name="readme" value="{{.readme}}">
|
||||
<div class="default text">{{ctx.Locale.Tr "repo.readme_helper"}}</div>
|
||||
<div class="menu">
|
||||
{{range .Readmes}}
|
||||
<div class="item" data-value="{{.}}">{{.}}</div>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
<span class="help">{{ctx.Locale.Tr "repo.readme_helper_desc"}}</span>
|
||||
</label>
|
||||
{{else}}
|
||||
<input type="hidden" name="readme" value="Default">
|
||||
{{end}}
|
||||
</div>
|
|
@ -248,8 +248,8 @@
|
|||
</div>
|
||||
{{end}}
|
||||
<div class="text right edit buttons">
|
||||
<button class="ui cancel button">{{ctx.Locale.Tr "repo.issues.cancel"}}</button>
|
||||
<button class="ui primary save button">{{ctx.Locale.Tr "repo.issues.save"}}</button>
|
||||
<button class="ui cancel button" data-button-name="cancel-edit">{{ctx.Locale.Tr "repo.issues.cancel"}}</button>
|
||||
<button class="ui primary save button" data-button-name="save-edit">{{ctx.Locale.Tr "repo.issues.save"}}</button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
|
|
@ -215,6 +215,10 @@
|
|||
{{ctx.Locale.Tr "repo.archive.title_date" (DateUtils.AbsoluteLong .Repository.ArchivedUnix)}}
|
||||
{{end}}
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="ui warning message tw-mb-4">
|
||||
{{ctx.Locale.Tr "repo.pulls.sign_in_require" .SignInLink}}
|
||||
</div>
|
||||
{{end}}
|
||||
{{if $.IsSigned}}
|
||||
<div class="pullrequest-form {{if not .Flash}}tw-hidden{{end}}">
|
||||
|
|
|
@ -163,8 +163,8 @@
|
|||
|
||||
<div class="field">
|
||||
<div class="text right edit">
|
||||
<button class="ui basic cancel button">{{ctx.Locale.Tr "repo.issues.cancel"}}</button>
|
||||
<button class="ui primary save button">{{ctx.Locale.Tr "repo.issues.save"}}</button>
|
||||
<button class="ui basic cancel button" data-button-name="cancel-edit">{{ctx.Locale.Tr "repo.issues.cancel"}}</button>
|
||||
<button class="ui primary save button" data-button-name="save-edit">{{ctx.Locale.Tr "repo.issues.save"}}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{{if .ctxData.IsSigned}}
|
||||
<div class="item action ui dropdown jump pointing top right select-reaction" data-action-url="{{.ActionURL}}">
|
||||
<div class="item action ui dropdown jump pointing top right select-reaction" data-action-url="{{.ActionURL}}" aria-label="{{ctx.Locale.Tr "repo.issues.reaction.add"}}">
|
||||
<a class="add-reaction muted">
|
||||
{{svg "octicon-smiley"}}
|
||||
</a>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<div class="item action ui dropdown jump pointing top right context-dropdown">
|
||||
<div class="item action ui dropdown jump pointing top right context-dropdown" aria-label="{{ctx.Locale.Tr "repo.issues.context.menu"}}">
|
||||
<a class="context-menu muted">
|
||||
{{svg "octicon-kebab-horizontal"}}
|
||||
</a>
|
||||
|
|
|
@ -2,9 +2,18 @@
|
|||
{{range $key, $value := .Reactions}}
|
||||
{{$hasReacted := $value.HasUser $.ctxData.SignedUserID}}
|
||||
<a role="button" class="ui label basic{{if $hasReacted}} primary{{end}}{{if not $.ctxData.IsSigned}} disabled{{end}} comment-reaction-button"
|
||||
data-tooltip-content
|
||||
title="{{$value.GetFirstUsers}}{{if gt ($value.GetMoreUserCount) 0}} {{ctx.Locale.Tr "repo.reactions_more" $value.GetMoreUserCount}}{{end}}"
|
||||
aria-label="{{$value.GetFirstUsers}}{{if gt ($value.GetMoreUserCount) 0}} {{ctx.Locale.Tr "repo.reactions_more" $value.GetMoreUserCount}}{{end}}"
|
||||
title="{{$value.GetFirstUsers}}"
|
||||
aria-label="
|
||||
{{if eq ($value.GetMoreUserCount) 0}}
|
||||
{{ctx.Locale.Tr "repo.issues.reaction.alt_few" $value.GetFirstUsers $key}}
|
||||
{{else}}
|
||||
{{ctx.Locale.Tr "repo.issues.reaction.alt_many" $value.GetFirstUsers $value.GetMoreUserCount $key}}
|
||||
{{end}}
|
||||
{{if $hasReacted}}
|
||||
{{ctx.Locale.Tr "repo.issues.reaction.alt_remove" $key}}
|
||||
{{else}}
|
||||
{{ctx.Locale.Tr "repo.issues.reaction.alt_add" $key}}
|
||||
{{end}}"
|
||||
data-tooltip-placement="bottom-start"
|
||||
data-reaction-content="{{$key}}" data-has-reacted="{{$hasReacted}}">
|
||||
<span class="reaction">{{ReactionToEmoji $key}}</span>
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
{{template "shared/user/name" .}}
|
||||
</div>
|
||||
<div class="flex-item-body">
|
||||
<span>{{ctx.Locale.Tr "settings.blocked_since" (DateTime "short" .CreatedUnix)}}</span>
|
||||
<span>{{ctx.Locale.Tr "settings.blocked_since" (DateUtils.AbsoluteShort .CreatedUnix)}}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex-item-trailing">
|
||||
|
|
|
@ -37,14 +37,14 @@ Template Attributes:
|
|||
<md-task-list class="markdown-toolbar-button" data-tooltip-content="{{ctx.Locale.Tr "editor.buttons.list.task.tooltip"}}">{{svg "octicon-tasklist"}}</md-task-list>
|
||||
<button type="button" class="markdown-toolbar-button" data-md-button data-md-action="unindent" data-tooltip-content="{{ctx.Locale.Tr "editor.buttons.unindent.tooltip"}}">{{svg "octicon-arrow-left"}}</button>
|
||||
<button type="button" class="markdown-toolbar-button" data-md-button data-md-action="indent" data-tooltip-content="{{ctx.Locale.Tr "editor.buttons.indent.tooltip"}}">{{svg "octicon-arrow-right"}}</button>
|
||||
<button type="button" class="markdown-toolbar-button show-modal button" data-md-action="new-table" data-tooltip-content="{{ctx.Locale.Tr "editor.buttons.new_table.tooltip"}}">{{svg "octicon-table"}}</button>
|
||||
</div>
|
||||
<div class="markdown-toolbar-group">
|
||||
<button type="button" class="markdown-toolbar-button show-modal button" data-md-button data-md-action="new-table" data-tooltip-content="{{ctx.Locale.Tr "editor.buttons.new_table.tooltip"}}">{{svg "octicon-table"}}</button>
|
||||
<md-mention class="markdown-toolbar-button" data-tooltip-content="{{ctx.Locale.Tr "editor.buttons.mention.tooltip"}}">{{svg "octicon-mention"}}</md-mention>
|
||||
<md-ref class="markdown-toolbar-button" data-tooltip-content="{{ctx.Locale.Tr "editor.buttons.ref.tooltip"}}">{{svg "octicon-cross-reference"}}</md-ref>
|
||||
</div>
|
||||
<div class="markdown-toolbar-group">
|
||||
<button class="markdown-toolbar-button markdown-switch-monospace" role="switch" data-enable-text="{{ctx.Locale.Tr "editor.buttons.enable_monospace_font"}}" data-disable-text="{{ctx.Locale.Tr "editor.buttons.disable_monospace_font"}}">{{svg "octicon-typography"}}</button>
|
||||
<button class="markdown-toolbar-button markdown-switch-monospace" data-md-button role="switch" data-enable-text="{{ctx.Locale.Tr "editor.buttons.enable_monospace_font"}}" data-disable-text="{{ctx.Locale.Tr "editor.buttons.disable_monospace_font"}}">{{svg "octicon-typography"}}</button>
|
||||
{{if .EasyMDE}}
|
||||
<button class="markdown-toolbar-button markdown-switch-easymde" data-tooltip-content="{{ctx.Locale.Tr "editor.buttons.switch_to_legacy.tooltip"}}">{{svg "octicon-arrow-switch"}}</button>
|
||||
{{end}}
|
||||
|
@ -85,7 +85,7 @@ Template Attributes:
|
|||
|
||||
<div class="text right actions">
|
||||
<button class="ui cancel button" data-selector-name="cancel-button">{{ctx.Locale.Tr "cancel"}}</button>
|
||||
<button class="ui blue button" data-selector-name="ok-button">{{ctx.Locale.Tr "ok"}}</button>
|
||||
<button class="ui primary button" data-selector-name="ok-button">{{ctx.Locale.Tr "ok"}}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
|
||||
<div class="divider"></div>
|
||||
<br>
|
||||
{{if .ShowFooterVersion}}<p>{{ctx.Locale.Tr "admin.config.app_ver"}}: {{AppVer}}</p>{{end}}
|
||||
{{if .ShowFooterVersion}}<p>{{ctx.Locale.Tr "admin.config.app_ver"}}: {{AppVerNoMetadata}}</p>{{end}}
|
||||
</div>
|
||||
</div>
|
||||
{{template "base/footer" .}}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
{{if or .OAuth2Providers .EnableOpenIDSignIn}}
|
||||
{{if .EnableInternalSignIn}}
|
||||
<div class="divider divider-text">
|
||||
{{ctx.Locale.Tr "sign_in_or"}}
|
||||
</div>
|
||||
{{if or (and .PageIsSignUp (not .DisableRegistration)) (and .PageIsSignIn .EnableInternalSignIn)}}
|
||||
<div class="divider divider-text">
|
||||
{{ctx.Locale.Tr "sign_in_or"}}
|
||||
</div>
|
||||
{{end}}
|
||||
<div id="oauth2-login-navigator" class="tw-py-1">
|
||||
<div class="tw-flex tw-flex-col tw-justify-center">
|
||||
|
|
|
@ -40,9 +40,9 @@
|
|||
</h4>
|
||||
<div class="ui attached segment">
|
||||
<div class="ui list">
|
||||
<div class="tw-mb-2">{{ctx.Locale.Tr "settings.email_desc"}}</div>
|
||||
{{if $.EnableNotifyMail}}
|
||||
<div class="item">
|
||||
<div class="tw-mb-2">{{ctx.Locale.Tr "settings.email_desc"}}</div>
|
||||
<form action="{{AppSubUrl}}/user/settings/account/email" class="ui form" method="post">
|
||||
{{$.CsrfTokenHtml}}
|
||||
<input name="_method" type="hidden" value="NOTIFICATION">
|
||||
|
|
|
@ -4,126 +4,121 @@
|
|||
{{ctx.Locale.Tr "settings.public_profile"}}
|
||||
</h4>
|
||||
<div class="ui attached segment">
|
||||
<p>{{ctx.Locale.Tr "settings.profile_desc"}}</p>
|
||||
<form class="ui form" action="{{.Link}}" method="post">
|
||||
{{.CsrfTokenHtml}}
|
||||
<div class="required field {{if .Err_Name}}error{{end}}">
|
||||
<label for="username">{{ctx.Locale.Tr "username"}}
|
||||
<span class="text red tw-hidden" id="name-change-prompt"> {{ctx.Locale.Tr "settings.change_username_prompt"}}</span>
|
||||
<span class="text red tw-hidden" id="name-change-redirect-prompt"> {{ctx.Locale.Tr "settings.change_username_redirect_prompt"}}</span>
|
||||
<fieldset>
|
||||
<legend>{{ctx.Locale.Tr "settings.profile_desc"}}</legend>
|
||||
<label {{if .Err_Name}}class="field error"{{end}}>
|
||||
{{ctx.Locale.Tr "username"}}
|
||||
<input name="name" value="{{.SignedUser.Name}}" data-name="{{.SignedUser.Name}}" autofocus required {{if or (not .SignedUser.IsLocal) .IsReverseProxy}}disabled{{end}} maxlength="40">
|
||||
{{if or (not .SignedUser.IsLocal) .IsReverseProxy}}
|
||||
<span class="help">{{ctx.Locale.Tr "settings.password_username_disabled"}}</span>
|
||||
{{else}}
|
||||
<span class="help">
|
||||
{{ctx.Locale.Tr "settings.change_username_prompt"}}
|
||||
{{ctx.Locale.Tr "settings.change_username_redirect_prompt"}}
|
||||
</span>
|
||||
{{end}}
|
||||
</label>
|
||||
<input id="username" name="name" value="{{.SignedUser.Name}}" data-name="{{.SignedUser.Name}}" autofocus required {{if or (not .SignedUser.IsLocal) .IsReverseProxy}}disabled{{end}} maxlength="40">
|
||||
{{if or (not .SignedUser.IsLocal) .IsReverseProxy}}
|
||||
<p class="help text blue">{{ctx.Locale.Tr "settings.password_username_disabled"}}</p>
|
||||
{{end}}
|
||||
</div>
|
||||
<div class="field {{if .Err_FullName}}error{{end}}">
|
||||
<label for="full_name">{{ctx.Locale.Tr "settings.full_name"}}</label>
|
||||
<input id="full_name" name="full_name" value="{{.SignedUser.FullName}}" maxlength="100">
|
||||
</div>
|
||||
<div class="inline field">
|
||||
<span class="inline field"><label for="pronouns">{{ctx.Locale.Tr "settings.pronouns"}}</label></span>
|
||||
<div id="pronouns-dropdown" style="display: none" class="ui selection dropdown">
|
||||
<input type="hidden" value="{{.SignedUser.Pronouns}}">
|
||||
<div class="text">
|
||||
{{if .PronounsAreCustom}}
|
||||
{{ctx.Locale.Tr "settings.pronouns_custom"}}
|
||||
{{else if eq "" .SignedUser.Pronouns}}
|
||||
{{ctx.Locale.Tr "settings.pronouns_unspecified"}}
|
||||
{{else}}
|
||||
{{.SignedUser.Pronouns}}
|
||||
{{end}}
|
||||
</div>
|
||||
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||
<div class="menu">
|
||||
<div class="item{{if eq "" .SignedUser.Pronouns}} active selected{{end}}" data-value=""><p>{{ctx.Locale.Tr "settings.pronouns_unspecified"}}</p></div>
|
||||
<div class="item{{if eq "he/him" .SignedUser.Pronouns}} active selected{{end}}" data-value="he/him">he/him</div>
|
||||
<div class="item{{if eq "she/her" .SignedUser.Pronouns}} active selected{{end}}" data-value="she/her">she/her</div>
|
||||
<div class="item{{if eq "they/them" .SignedUser.Pronouns}} active selected{{end}}" data-value="they/them">they/them</div>
|
||||
<div class="item{{if eq "it/its" .SignedUser.Pronouns}} active selected{{end}}" data-value="it/its">it/its</div>
|
||||
<div class="item{{if eq "any pronouns" .SignedUser.Pronouns}} active selected{{end}}" data-value="any pronouns">any pronouns</div>
|
||||
{{if .PronounsAreCustom}}
|
||||
<div class="item active selected" data-value="{{.SignedUser.Pronouns}}"><p>{{ctx.Locale.Tr "settings.pronouns_custom"}}</p></div>
|
||||
{{else}}
|
||||
<div class="item" data-value="!"><i>{{ctx.Locale.Tr "settings.pronouns_custom"}}</i></div>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
<input id="pronouns-custom" name="pronouns" value="{{.SignedUser.Pronouns}}" maxlength="50">
|
||||
</div>
|
||||
{{if not .SignedUser.KeepEmailPrivate}}
|
||||
<div class="field">
|
||||
<label>{{ctx.Locale.Tr "email"}}</label>
|
||||
<p id="signed-user-email">{{.SignedUser.Email}}</p>
|
||||
</div>
|
||||
{{end}}
|
||||
<div class="field {{if .Err_Biography}}error{{end}}">
|
||||
<label for="biography">{{ctx.Locale.Tr "user.user_bio"}}</label>
|
||||
<textarea id="biography" name="biography" rows="2" placeholder="{{ctx.Locale.Tr "settings.biography_placeholder"}}" maxlength="255">{{.SignedUser.Description}}</textarea>
|
||||
</div>
|
||||
<div class="field {{if .Err_Website}}error{{end}}">
|
||||
<label for="website">{{ctx.Locale.Tr "settings.website"}}</label>
|
||||
<input id="website" name="website" type="url" value="{{.SignedUser.Website}}" maxlength="255">
|
||||
</div>
|
||||
<div class="field">
|
||||
<label for="location">{{ctx.Locale.Tr "settings.location"}}</label>
|
||||
<input id="location" name="location" placeholder="{{ctx.Locale.Tr "settings.location_placeholder"}}" value="{{.SignedUser.Location}}" maxlength="50">
|
||||
</div>
|
||||
|
||||
<div class="divider"></div>
|
||||
<!-- private block -->
|
||||
<label {{if .Err_FullName}}class="field error"{{end}}>
|
||||
{{ctx.Locale.Tr "settings.full_name"}}
|
||||
<input name="full_name" value="{{.SignedUser.FullName}}" maxlength="100">
|
||||
</label>
|
||||
|
||||
<div class="field" id="privacy-user-settings">
|
||||
<label><strong>{{ctx.Locale.Tr "settings.privacy"}}</strong></label>
|
||||
</div>
|
||||
|
||||
<div class="inline field {{if .Err_Visibility}}error{{end}}">
|
||||
<span class="inline required field" id="visibility-setting"><label>{{ctx.Locale.Tr "settings.visibility"}}</label></span>
|
||||
<div class="ui selection type dropdown">
|
||||
{{if .SignedUser.Visibility.IsPublic}}<input type="hidden" id="visibility" name="visibility" value="0">{{end}}
|
||||
{{if .SignedUser.Visibility.IsLimited}}<input type="hidden" id="visibility" name="visibility" value="1">{{end}}
|
||||
{{if .SignedUser.Visibility.IsPrivate}}<input type="hidden" id="visibility" name="visibility" value="2">{{end}}
|
||||
<div class="text">
|
||||
{{if .SignedUser.Visibility.IsPublic}}{{ctx.Locale.Tr "settings.visibility.public"}}{{end}}
|
||||
{{if .SignedUser.Visibility.IsLimited}}{{ctx.Locale.Tr "settings.visibility.limited"}}{{end}}
|
||||
{{if .SignedUser.Visibility.IsPrivate}}{{ctx.Locale.Tr "settings.visibility.private"}}{{end}}
|
||||
</div>
|
||||
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||
<div class="menu">
|
||||
{{range $mode := .AllowedUserVisibilityModes}}
|
||||
{{if $mode.IsPublic}}
|
||||
<div class="item" data-tooltip-content="{{ctx.Locale.Tr "settings.visibility.public_tooltip"}}" data-value="0">{{ctx.Locale.Tr "settings.visibility.public"}}</div>
|
||||
{{else if $mode.IsLimited}}
|
||||
<div class="item" data-tooltip-content="{{ctx.Locale.Tr "settings.visibility.limited_tooltip"}}" data-value="1">{{ctx.Locale.Tr "settings.visibility.limited"}}</div>
|
||||
{{else if $mode.IsPrivate}}
|
||||
<div class="item" data-tooltip-content="{{ctx.Locale.Tr "settings.visibility.private_tooltip"}}" data-value="2">{{ctx.Locale.Tr "settings.visibility.private"}}</div>
|
||||
<label id="label-pronouns" class="tw-hidden">
|
||||
{{ctx.Locale.Tr "settings.pronouns"}}
|
||||
<div id="pronouns-dropdown" class="ui selection dropdown" aria-labelledby="label-pronouns">
|
||||
<input type="hidden" value="{{.SignedUser.Pronouns}}">
|
||||
<div class="text">
|
||||
{{if .PronounsAreCustom}}
|
||||
{{ctx.Locale.Tr "settings.pronouns_custom"}}
|
||||
{{else if eq "" .SignedUser.Pronouns}}
|
||||
{{ctx.Locale.Tr "settings.pronouns_unspecified"}}
|
||||
{{else}}
|
||||
{{.SignedUser.Pronouns}}
|
||||
{{end}}
|
||||
{{end}}
|
||||
</div>
|
||||
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||
<div class="menu">
|
||||
<div class="item{{if eq "" .SignedUser.Pronouns}} active selected{{end}}" data-value=""><p>{{ctx.Locale.Tr "settings.pronouns_unspecified"}}</p></div>
|
||||
<div class="item{{if eq "he/him" .SignedUser.Pronouns}} active selected{{end}}" data-value="he/him">he/him</div>
|
||||
<div class="item{{if eq "she/her" .SignedUser.Pronouns}} active selected{{end}}" data-value="she/her">she/her</div>
|
||||
<div class="item{{if eq "they/them" .SignedUser.Pronouns}} active selected{{end}}" data-value="they/them">they/them</div>
|
||||
<div class="item{{if eq "it/its" .SignedUser.Pronouns}} active selected{{end}}" data-value="it/its">it/its</div>
|
||||
<div class="item{{if eq "any pronouns" .SignedUser.Pronouns}} active selected{{end}}" data-value="any pronouns">any pronouns</div>
|
||||
{{if .PronounsAreCustom}}
|
||||
<div class="item active selected" data-value="{{.SignedUser.Pronouns}}">{{ctx.Locale.Tr "settings.pronouns_custom"}}</div>
|
||||
{{else}}
|
||||
<div class="item" data-value="!"><i>{{ctx.Locale.Tr "settings.pronouns_custom"}}</i></div>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</label>
|
||||
<label id="label-pronouns-custom">
|
||||
{{ctx.Locale.Tr "settings.pronouns_custom_label"}}
|
||||
<input name="pronouns" value="{{.SignedUser.Pronouns}}" maxlength="50">
|
||||
</label>
|
||||
|
||||
<div class="field">
|
||||
<div class="ui checkbox">
|
||||
<label>{{ctx.Locale.Tr "settings.keep_email_private"}}</label>
|
||||
<label {{if .Err_Biography}}class="field error"{{end}}>
|
||||
{{ctx.Locale.Tr "user.user_bio"}}
|
||||
<textarea name="biography" rows="2" placeholder="{{ctx.Locale.Tr "settings.biography_placeholder"}}" maxlength="255">{{.SignedUser.Description}}</textarea>
|
||||
</label>
|
||||
|
||||
<label {{if .Err_Website}}class="field error"{{end}}>
|
||||
{{ctx.Locale.Tr "settings.website"}}
|
||||
<input name="website" type="url" value="{{.SignedUser.Website}}" maxlength="255">
|
||||
</label>
|
||||
|
||||
<label>
|
||||
{{ctx.Locale.Tr "settings.location"}}
|
||||
<input name="location" placeholder="{{ctx.Locale.Tr "settings.location_placeholder"}}" value="{{.SignedUser.Location}}" maxlength="50">
|
||||
</label>
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<legend id="privacy-user-settings">{{ctx.Locale.Tr "settings.privacy"}}</legend>
|
||||
|
||||
<label id="visibility-setting" {{if .Err_Visibility}}class="field error"{{end}}>
|
||||
{{ctx.Locale.Tr "settings.visibility"}}
|
||||
<div class="ui selection type dropdown" aria-labelledby="visibility-setting">
|
||||
{{if .SignedUser.Visibility.IsPublic}}<input type="hidden" id="visibility" name="visibility" value="0">{{end}}
|
||||
{{if .SignedUser.Visibility.IsLimited}}<input type="hidden" id="visibility" name="visibility" value="1">{{end}}
|
||||
{{if .SignedUser.Visibility.IsPrivate}}<input type="hidden" id="visibility" name="visibility" value="2">{{end}}
|
||||
<div class="text">
|
||||
{{if .SignedUser.Visibility.IsPublic}}{{ctx.Locale.Tr "settings.visibility.public"}}{{end}}
|
||||
{{if .SignedUser.Visibility.IsLimited}}{{ctx.Locale.Tr "settings.visibility.limited"}}{{end}}
|
||||
{{if .SignedUser.Visibility.IsPrivate}}{{ctx.Locale.Tr "settings.visibility.private"}}{{end}}
|
||||
</div>
|
||||
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||
<div class="menu">
|
||||
{{range $mode := .AllowedUserVisibilityModes}}
|
||||
{{if $mode.IsPublic}}
|
||||
<div class="item" data-tooltip-content="{{ctx.Locale.Tr "settings.visibility.public_tooltip"}}" data-value="0">{{ctx.Locale.Tr "settings.visibility.public"}}</div>
|
||||
{{else if $mode.IsLimited}}
|
||||
<div class="item" data-tooltip-content="{{ctx.Locale.Tr "settings.visibility.limited_tooltip"}}" data-value="1">{{ctx.Locale.Tr "settings.visibility.limited"}}</div>
|
||||
{{else if $mode.IsPrivate}}
|
||||
<div class="item" data-tooltip-content="{{ctx.Locale.Tr "settings.visibility.private_tooltip"}}" data-value="2">{{ctx.Locale.Tr "settings.visibility.private"}}</div>
|
||||
{{end}}
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
</label>
|
||||
|
||||
<label>
|
||||
<input name="keep_email_private" type="checkbox" {{if .SignedUser.KeepEmailPrivate}}checked{{end}}>
|
||||
</div>
|
||||
<span class="help tw-block">{{ctx.Locale.Tr "settings.keep_email_private_popup" .SignedUser.GetPlaceholderEmail}}</span>
|
||||
</div>
|
||||
{{ctx.Locale.Tr "settings.keep_email_private"}}
|
||||
<span class="help">{{ctx.Locale.Tr "settings.keep_email_private_popup" .SignedUser.GetPlaceholderEmail}}</span>
|
||||
</label>
|
||||
|
||||
<div class="field">
|
||||
<div class="ui checkbox" id="keep-activity-private">
|
||||
<label>{{ctx.Locale.Tr "settings.keep_activity_private"}}</label>
|
||||
<label id="keep-activity-private">
|
||||
<input name="keep_activity_private" type="checkbox" {{if .SignedUser.KeepActivityPrivate}}checked{{end}}>
|
||||
</div>
|
||||
<span class="help tw-block">{{ctx.Locale.Tr "settings.keep_activity_private.description" (printf "/%s?tab=activity" .SignedUser.Name)}}</span>
|
||||
</div>
|
||||
{{ctx.Locale.Tr "settings.keep_activity_private"}}
|
||||
<span class="help">{{ctx.Locale.Tr "settings.keep_activity_private.description" (printf "/%s?tab=activity" .SignedUser.Name)}}</span>
|
||||
</label>
|
||||
</fieldset>
|
||||
|
||||
<div class="divider"></div>
|
||||
|
||||
<div class="field">
|
||||
<button class="ui primary button">{{ctx.Locale.Tr "settings.update_profile"}}</button>
|
||||
</div>
|
||||
<button class="ui primary button">{{ctx.Locale.Tr "settings.update_profile"}}</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
|
|
|
@ -11,6 +11,19 @@ test.beforeAll(async ({browser}, workerInfo) => {
|
|||
await login_user(browser, workerInfo, 'user2');
|
||||
});
|
||||
|
||||
test('Menu accessibility', async ({browser}, workerInfo) => {
|
||||
const page = await login({browser}, workerInfo);
|
||||
await page.goto('/user2/repo1/issues/1');
|
||||
await expect(page.getByLabel('user2 reacted eyes. Remove eyes')).toBeVisible();
|
||||
await expect(page.getByLabel('reacted laugh. Remove laugh')).toBeVisible();
|
||||
await expect(page.locator('#issue-1').getByLabel('Comment menu')).toBeVisible();
|
||||
await expect(page.locator('#issue-1').getByRole('heading').getByLabel('Add reaction')).toBeVisible();
|
||||
page.getByLabel('reacted laugh. Remove').click();
|
||||
await expect(page.getByLabel('user1 reacted laugh. Add laugh')).toBeVisible();
|
||||
page.getByLabel('user1 reacted laugh.').click();
|
||||
await expect(page.getByLabel('user1, user2 reacted laugh. Remove laugh')).toBeVisible();
|
||||
});
|
||||
|
||||
test('Hyperlink paste behaviour', async ({browser}, workerInfo) => {
|
||||
test.skip(['Mobile Safari', 'Mobile Chrome', 'webkit'].includes(workerInfo.project.name), 'Mobile clients seem to have very weird behaviour with this test, which I cannot confirm with real usage');
|
||||
const page = await login({browser}, workerInfo);
|
||||
|
|
134
tests/e2e/repo-new.test.e2e.ts
Normal file
134
tests/e2e/repo-new.test.e2e.ts
Normal file
|
@ -0,0 +1,134 @@
|
|||
// @watch start
|
||||
// templates/repo/create**.tmpl
|
||||
// web_src/css/{form,repo}.css
|
||||
// @watch end
|
||||
|
||||
import {expect} from '@playwright/test';
|
||||
import {test, dynamic_id, save_visual, login_user, login} from './utils_e2e.ts';
|
||||
import {validate_form} from './shared/forms.ts';
|
||||
|
||||
test.beforeAll(async ({browser}, workerInfo) => {
|
||||
await login_user(browser, workerInfo, 'user2');
|
||||
});
|
||||
|
||||
test('New repo: invalid', async ({browser}, workerInfo) => {
|
||||
const page = await login({browser}, workerInfo);
|
||||
const response = await page.goto('/repo/create');
|
||||
expect(response?.status()).toBe(200);
|
||||
// check that relevant form content is hidden or available
|
||||
await expect(page.getByRole('group', {name: 'Use a template You can select'}).getByRole('combobox')).toBeVisible();
|
||||
await expect(page.getByText('.gitignore Select .gitignore')).toBeHidden();
|
||||
await expect(page.getByText('Labels Select a label set')).toBeHidden();
|
||||
await validate_form({page}, 'fieldset');
|
||||
await save_visual(page);
|
||||
|
||||
await page.getByLabel('Repository name').fill('*invalid');
|
||||
await page.getByRole('button', {name: 'Create repository'}).click();
|
||||
await expect(page.getByText('Repository name should contain only alphanumeric')).toBeVisible();
|
||||
await save_visual(page);
|
||||
});
|
||||
|
||||
test('New repo: initialize', async ({browser}, workerInfo) => {
|
||||
const page = await login({browser}, workerInfo);
|
||||
const response = await page.goto('/repo/create');
|
||||
expect(response?.status()).toBe(200);
|
||||
// check that relevant form content is hidden or available
|
||||
await expect(page.getByRole('group', {name: 'Use a template You can select'}).getByRole('combobox')).toBeVisible();
|
||||
await expect(page.getByText('.gitignore Select .gitignore')).toBeHidden();
|
||||
// fill initialization section
|
||||
await page.getByText('Start the Git history with').click();
|
||||
await page.getByText('Select .gitignore templates').click();
|
||||
await page.getByLabel('.gitignore Select .gitignore').fill('Go');
|
||||
await page.getByRole('option', {name: 'Go', exact: true}).click();
|
||||
await page.keyboard.press('Escape');
|
||||
await page.getByLabel('License Select a license file').click();
|
||||
await page.getByRole('option', {name: 'MIT', exact: true}).click();
|
||||
await page.keyboard.press('Escape');
|
||||
// add advanced settings
|
||||
await page.getByText('Click to expand').click();
|
||||
await page.getByPlaceholder('master').fill('main');
|
||||
await page.getByLabel('Make repository a template').check();
|
||||
|
||||
await validate_form({page}, 'fieldset');
|
||||
await save_visual(page);
|
||||
const reponame = dynamic_id();
|
||||
await page.getByLabel('Repository name').fill(reponame);
|
||||
await page.getByRole('button', {name: 'Create repository'}).click();
|
||||
await expect(page.getByRole('link', {name: '.gitignore'})).toBeVisible();
|
||||
await expect(page.getByRole('link', {name: 'LICENSE', exact: true})).toBeVisible();
|
||||
if (!workerInfo.project.name.includes('Mobile')) {
|
||||
await expect(page.getByText('Template', {exact: true})).toBeVisible();
|
||||
}
|
||||
await save_visual(page);
|
||||
});
|
||||
|
||||
test('New repo: initialize later', async ({browser}, workerInfo) => {
|
||||
const page = await login({browser}, workerInfo);
|
||||
const response = await page.goto('/repo/create');
|
||||
expect(response?.status()).toBe(200);
|
||||
|
||||
const reponame = dynamic_id();
|
||||
await page.getByLabel('Repository name').fill(reponame);
|
||||
await page.getByPlaceholder('Enter short description').fill(`Description for repo ${reponame}`);
|
||||
await page.getByText('Click to expand').click();
|
||||
await page.getByPlaceholder('master').fill('devbranch');
|
||||
await validate_form({page}, 'fieldset');
|
||||
await page.getByRole('button', {name: 'Create repository'}).click();
|
||||
expect(page.url()).toBe(`http://localhost:3003/user2/${reponame}`);
|
||||
await expect(page.getByRole('link', {name: 'New file'})).toBeVisible();
|
||||
await expect(page.getByRole('heading', {name: 'Creating a new repository on'})).toBeVisible();
|
||||
await save_visual(page);
|
||||
|
||||
// add a README
|
||||
await page.getByRole('link', {name: 'New file'}).click();
|
||||
// wait for loading spinner to disappear
|
||||
// Otherwise, filling the filename might not populate the tree_path form field or preview tab
|
||||
// The editor has race conditions, likely related to https://codeberg.org/forgejo/forgejo/issues/3371
|
||||
await expect(page.locator('.is-loading')).toBeHidden();
|
||||
await page.locator('.view-lines').click();
|
||||
await page.keyboard.type('# Heading\n\nHello Forgejo!');
|
||||
await page.getByPlaceholder('Name your file…').fill('README.md');
|
||||
await expect(page.getByText('Preview')).toBeVisible();
|
||||
await page.getByPlaceholder('Add "<filename>"').fill('My first commit message');
|
||||
await page.getByRole('button', {name: 'Commit changes'}).click();
|
||||
expect(page.url()).toBe(`http://localhost:3003/user2/${reponame}/src/branch/devbranch/README.md`);
|
||||
await expect(page.getByRole('link', {name: 'My first commit message'})).toBeVisible();
|
||||
await expect(page.getByText('Hello Forgejo!')).toBeVisible();
|
||||
await save_visual(page);
|
||||
});
|
||||
|
||||
test('New repo: from template', async ({browser}, workerInfo) => {
|
||||
test.skip(['Mobile Safari', 'webkit'].includes(workerInfo.project.name), 'WebKit browsers seem to have CORS issues with localhost here.');
|
||||
const page = await login({browser}, workerInfo);
|
||||
const response = await page.goto('/repo/create');
|
||||
expect(response?.status()).toBe(200);
|
||||
|
||||
const reponame = dynamic_id();
|
||||
await page.getByRole('group', {name: 'Use a template You can select'}).getByRole('combobox').click();
|
||||
await page.getByRole('option', {name: 'user27/template1'}).click();
|
||||
await page.getByText('Git content (Default branch)').click();
|
||||
await save_visual(page);
|
||||
await page.getByLabel('Repository name').fill(reponame);
|
||||
await page.getByRole('button', {name: 'Create repository'}).click();
|
||||
await expect(page.getByRole('link', {name: `${reponame}.log`})).toBeVisible();
|
||||
await save_visual(page);
|
||||
});
|
||||
|
||||
test('New repo: label set', async ({browser}, workerInfo) => {
|
||||
const page = await login({browser}, workerInfo);
|
||||
await page.goto('/repo/create');
|
||||
|
||||
const reponame = dynamic_id();
|
||||
await page.getByText('Click to expand').click();
|
||||
await page.getByLabel('Labels Select a label set').click();
|
||||
await page.getByRole('option', {name: 'Advanced (Kind/Bug, Kind/'}).click();
|
||||
// close dropdown via unrelated click
|
||||
await page.getByText('You can select an existing').click();
|
||||
await save_visual(page);
|
||||
await page.getByLabel('Repository name').fill(reponame);
|
||||
await page.getByRole('button', {name: 'Create repository'}).click();
|
||||
await page.goto(`/user2/${reponame}/issues`);
|
||||
await page.getByRole('link', {name: 'Labels'}).click();
|
||||
await expect(page.getByText('Kind/Bug Something is not')).toBeVisible();
|
||||
await save_visual(page);
|
||||
});
|
|
@ -7,6 +7,9 @@ export async function validate_form({page}: {page: Page}, scope: 'form' | 'field
|
|||
'span[data-tooltip-content',
|
||||
// exclude weird non-semantic HTML disabled content
|
||||
'.disabled',
|
||||
// legacy dropdowns don't use semantic HTML yet,
|
||||
// avoid using these where possible
|
||||
'.ui.dropdown',
|
||||
];
|
||||
await accessibilityCheck({page}, [scope], excludedElements, []);
|
||||
|
||||
|
|
65
tests/e2e/user-settings.test.e2e.ts
Normal file
65
tests/e2e/user-settings.test.e2e.ts
Normal file
|
@ -0,0 +1,65 @@
|
|||
// @watch start
|
||||
// templates/user/settings/**.tmpl
|
||||
// web_src/css/{form,user}.css
|
||||
// @watch end
|
||||
|
||||
import {expect} from '@playwright/test';
|
||||
import {test, save_visual, login_user, login} from './utils_e2e.ts';
|
||||
import {validate_form} from './shared/forms.ts';
|
||||
|
||||
test.beforeAll(async ({browser}, workerInfo) => {
|
||||
await login_user(browser, workerInfo, 'user2');
|
||||
});
|
||||
|
||||
test('User: Profile settings', async ({browser}, workerInfo) => {
|
||||
const page = await login({browser}, workerInfo);
|
||||
await page.goto('/user/settings');
|
||||
|
||||
await page.getByLabel('Full name').fill('SecondUser');
|
||||
await page.locator('#pronouns-dropdown').click();
|
||||
await page.getByRole('option', {name: 'she/her'}).click();
|
||||
await page.getByPlaceholder('Tell others a little bit').fill('I am a playwright test running for several seconds.');
|
||||
await page.getByPlaceholder('Tell others a little bit').press('Tab');
|
||||
await page.getByLabel('Website').fill('https://forgejo.org');
|
||||
await page.getByPlaceholder('Share your approximate').fill('on a computer chip');
|
||||
await page.getByLabel('User visibility').click();
|
||||
await page.getByLabel('Visible only to signed-in').click();
|
||||
await page.getByLabel('Hide email address Your email').uncheck();
|
||||
await page.getByLabel('Hide activity from profile').check();
|
||||
|
||||
await validate_form({page}, 'fieldset');
|
||||
await save_visual(page);
|
||||
await page.getByRole('button', {name: 'Update profile'}).click();
|
||||
await expect(page.getByText('Your profile has been updated.')).toBeVisible();
|
||||
await page.getByRole('link', {name: 'public activity'}).click();
|
||||
await expect(page.getByText('Your activity is only visible')).toBeVisible();
|
||||
await save_visual(page);
|
||||
|
||||
await page.goto('/user2');
|
||||
await expect(page.getByText('SecondUser')).toBeVisible();
|
||||
await expect(page.getByText('on a computer chip')).toBeVisible();
|
||||
await expect(page.locator('li').filter({hasText: 'user2@example.com'})).toBeVisible();
|
||||
await expect(page.locator('li').filter({hasText: 'https://forgejo.org'})).toBeVisible();
|
||||
await expect(page.getByText('I am a playwright test')).toBeVisible();
|
||||
await save_visual(page);
|
||||
|
||||
await page.goto('/user/settings');
|
||||
await page.locator('#pronouns-dropdown').click();
|
||||
await page.getByRole('option', {name: 'Custom'}).click();
|
||||
await page.getByLabel('Custom pronouns').fill('rob/ot');
|
||||
await page.getByLabel('User visibility').click();
|
||||
await page.getByLabel('Visible to everyone').click();
|
||||
await page.getByLabel('Hide email address Your email').check();
|
||||
await page.getByLabel('Hide activity from profile').uncheck();
|
||||
await expect(page.getByText('Your profile has been updated.')).toBeHidden();
|
||||
await validate_form({page}, 'fieldset');
|
||||
await save_visual(page);
|
||||
await page.getByRole('button', {name: 'Update profile'}).click();
|
||||
await expect(page.getByText('Your profile has been updated.')).toBeVisible();
|
||||
|
||||
await page.goto('/user2');
|
||||
await expect(page.getByText('SecondUser')).toBeVisible();
|
||||
await expect(page.locator('li').filter({hasText: 'user2@example.com'})).toBeHidden();
|
||||
await page.goto('/user2?tab=activity');
|
||||
await expect(page.getByText('Your activity is visible to everyone')).toBeVisible();
|
||||
});
|
|
@ -81,6 +81,14 @@ export async function save_visual(page: Page) {
|
|||
await page.locator('.flex-item-body > relative-time').filter({hasText: /now|minute/}).evaluateAll((nodes) => {
|
||||
for (const node of nodes) node.outerHTML = 'relative time in repo';
|
||||
});
|
||||
// dynamically generated UUIDs
|
||||
await page.getByText('dyn-id-').evaluateAll((nodes) => {
|
||||
for (const node of nodes) node.innerHTML = node.innerHTML.replaceAll(/dyn-id-[a-f0-9-]+/g, 'dynamic-id');
|
||||
});
|
||||
// repeat above, work around https://github.com/microsoft/playwright/issues/34152
|
||||
await page.getByText('dyn-id-').evaluateAll((nodes) => {
|
||||
for (const node of nodes) node.innerHTML = node.innerHTML.replaceAll(/dyn-id-[a-f0-9-]+/g, 'dynamic-id');
|
||||
});
|
||||
await page.locator('relative-time').evaluateAll((nodes) => {
|
||||
for (const node of nodes) node.outerHTML = 'time element';
|
||||
});
|
||||
|
@ -97,6 +105,9 @@ export async function save_visual(page: Page) {
|
|||
page.locator('#repo_migrating'),
|
||||
// update order of recently created repos is not fully deterministic
|
||||
page.locator('.flex-item-main').filter({hasText: 'relative time in repo'}),
|
||||
page.locator('#activity-feed'),
|
||||
// dynamic IDs in fixed-size inputs
|
||||
page.locator('input[value*="dyn-id-"]'),
|
||||
],
|
||||
});
|
||||
}
|
||||
|
@ -122,3 +133,8 @@ export async function create_temp_user(browser: Browser, workerInfo: TestInfo, r
|
|||
|
||||
return {context: await login_user(browser, workerInfo, username), username};
|
||||
}
|
||||
|
||||
// returns a random string with a pattern that can be filtered for screenshots automatically
|
||||
export function dynamic_id() {
|
||||
return `dyn-id-${globalThis.crypto.randomUUID()}`;
|
||||
}
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1 +1 @@
|
|||
d49ac742d44063dcf69d4e0afe725813b777dd89
|
||||
f54f5a6b7c4f83b606600e43186165854f189530
|
||||
|
|
417
tests/integration/actions_job_test.go
Normal file
417
tests/integration/actions_job_test.go
Normal file
|
@ -0,0 +1,417 @@
|
|||
// Copyright 2024 The Gitea Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package integration
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
actions_model "code.gitea.io/gitea/models/actions"
|
||||
auth_model "code.gitea.io/gitea/models/auth"
|
||||
"code.gitea.io/gitea/models/unittest"
|
||||
user_model "code.gitea.io/gitea/models/user"
|
||||
"code.gitea.io/gitea/modules/setting"
|
||||
api "code.gitea.io/gitea/modules/structs"
|
||||
|
||||
runnerv1 "code.gitea.io/actions-proto-go/runner/v1"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestJobWithNeeds(t *testing.T) {
|
||||
if !setting.Database.Type.IsSQLite3() {
|
||||
t.Skip()
|
||||
}
|
||||
testCases := []struct {
|
||||
treePath string
|
||||
fileContent string
|
||||
outcomes map[string]*mockTaskOutcome
|
||||
expectedStatuses map[string]string
|
||||
}{
|
||||
{
|
||||
treePath: ".gitea/workflows/job-with-needs.yml",
|
||||
fileContent: `name: job-with-needs
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- '.gitea/workflows/job-with-needs.yml'
|
||||
jobs:
|
||||
job1:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- run: echo job1
|
||||
job2:
|
||||
runs-on: ubuntu-latest
|
||||
needs: [job1]
|
||||
steps:
|
||||
- run: echo job2
|
||||
`,
|
||||
outcomes: map[string]*mockTaskOutcome{
|
||||
"job1": {
|
||||
result: runnerv1.Result_RESULT_SUCCESS,
|
||||
},
|
||||
"job2": {
|
||||
result: runnerv1.Result_RESULT_SUCCESS,
|
||||
},
|
||||
},
|
||||
expectedStatuses: map[string]string{
|
||||
"job1": actions_model.StatusSuccess.String(),
|
||||
"job2": actions_model.StatusSuccess.String(),
|
||||
},
|
||||
},
|
||||
{
|
||||
treePath: ".gitea/workflows/job-with-needs-fail.yml",
|
||||
fileContent: `name: job-with-needs-fail
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- '.gitea/workflows/job-with-needs-fail.yml'
|
||||
jobs:
|
||||
job1:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- run: echo job1
|
||||
job2:
|
||||
runs-on: ubuntu-latest
|
||||
needs: [job1]
|
||||
steps:
|
||||
- run: echo job2
|
||||
`,
|
||||
outcomes: map[string]*mockTaskOutcome{
|
||||
"job1": {
|
||||
result: runnerv1.Result_RESULT_FAILURE,
|
||||
},
|
||||
},
|
||||
expectedStatuses: map[string]string{
|
||||
"job1": actions_model.StatusFailure.String(),
|
||||
"job2": actions_model.StatusSkipped.String(),
|
||||
},
|
||||
},
|
||||
{
|
||||
treePath: ".gitea/workflows/job-with-needs-fail-if.yml",
|
||||
fileContent: `name: job-with-needs-fail-if
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- '.gitea/workflows/job-with-needs-fail-if.yml'
|
||||
jobs:
|
||||
job1:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- run: echo job1
|
||||
job2:
|
||||
runs-on: ubuntu-latest
|
||||
if: ${{ always() }}
|
||||
needs: [job1]
|
||||
steps:
|
||||
- run: echo job2
|
||||
`,
|
||||
outcomes: map[string]*mockTaskOutcome{
|
||||
"job1": {
|
||||
result: runnerv1.Result_RESULT_FAILURE,
|
||||
},
|
||||
"job2": {
|
||||
result: runnerv1.Result_RESULT_SUCCESS,
|
||||
},
|
||||
},
|
||||
expectedStatuses: map[string]string{
|
||||
"job1": actions_model.StatusFailure.String(),
|
||||
"job2": actions_model.StatusSuccess.String(),
|
||||
},
|
||||
},
|
||||
}
|
||||
onGiteaRun(t, func(t *testing.T, u *url.URL) {
|
||||
user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
|
||||
session := loginUser(t, user2.Name)
|
||||
token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser)
|
||||
|
||||
apiRepo := createActionsTestRepo(t, token, "actions-jobs-with-needs", false)
|
||||
runner := newMockRunner()
|
||||
runner.registerAsRepoRunner(t, user2.Name, apiRepo.Name, "mock-runner", []string{"ubuntu-latest"})
|
||||
|
||||
for _, tc := range testCases {
|
||||
t.Run(fmt.Sprintf("test %s", tc.treePath), func(t *testing.T) {
|
||||
// create the workflow file
|
||||
opts := getWorkflowCreateFileOptions(user2, apiRepo.DefaultBranch, fmt.Sprintf("create %s", tc.treePath), tc.fileContent)
|
||||
fileResp := createWorkflowFile(t, token, user2.Name, apiRepo.Name, tc.treePath, opts)
|
||||
|
||||
// fetch and execute task
|
||||
for i := 0; i < len(tc.outcomes); i++ {
|
||||
task := runner.fetchTask(t)
|
||||
jobName := getTaskJobNameByTaskID(t, token, user2.Name, apiRepo.Name, task.Id)
|
||||
outcome := tc.outcomes[jobName]
|
||||
assert.NotNil(t, outcome)
|
||||
runner.execTask(t, task, outcome)
|
||||
}
|
||||
|
||||
// check result
|
||||
req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/repos/%s/%s/actions/tasks", user2.Name, apiRepo.Name)).
|
||||
AddTokenAuth(token)
|
||||
resp := MakeRequest(t, req, http.StatusOK)
|
||||
var actionTaskRespAfter api.ActionTaskResponse
|
||||
DecodeJSON(t, resp, &actionTaskRespAfter)
|
||||
for _, apiTask := range actionTaskRespAfter.Entries {
|
||||
if apiTask.HeadSHA != fileResp.Commit.SHA {
|
||||
continue
|
||||
}
|
||||
status := apiTask.Status
|
||||
assert.Equal(t, status, tc.expectedStatuses[apiTask.Name])
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
httpContext := NewAPITestContext(t, user2.Name, apiRepo.Name, auth_model.AccessTokenScopeWriteRepository)
|
||||
doAPIDeleteRepository(httpContext)(t)
|
||||
})
|
||||
}
|
||||
|
||||
func TestJobNeedsMatrix(t *testing.T) {
|
||||
if !setting.Database.Type.IsSQLite3() {
|
||||
t.Skip()
|
||||
}
|
||||
testCases := []struct {
|
||||
treePath string
|
||||
fileContent string
|
||||
outcomes map[string]*mockTaskOutcome
|
||||
expectedTaskNeeds map[string]*runnerv1.TaskNeed // jobID => TaskNeed
|
||||
}{
|
||||
{
|
||||
treePath: ".gitea/workflows/jobs-outputs-with-matrix.yml",
|
||||
fileContent: `name: jobs-outputs-with-matrix
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- '.gitea/workflows/jobs-outputs-with-matrix.yml'
|
||||
jobs:
|
||||
job1:
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
output_1: ${{ steps.gen_output.outputs.output_1 }}
|
||||
output_2: ${{ steps.gen_output.outputs.output_2 }}
|
||||
output_3: ${{ steps.gen_output.outputs.output_3 }}
|
||||
strategy:
|
||||
matrix:
|
||||
version: [1, 2, 3]
|
||||
steps:
|
||||
- name: Generate output
|
||||
id: gen_output
|
||||
run: |
|
||||
version="${{ matrix.version }}"
|
||||
echo "output_${version}=${version}" >> "$GITHUB_OUTPUT"
|
||||
job2:
|
||||
runs-on: ubuntu-latest
|
||||
needs: [job1]
|
||||
steps:
|
||||
- run: echo '${{ toJSON(needs.job1.outputs) }}'
|
||||
`,
|
||||
outcomes: map[string]*mockTaskOutcome{
|
||||
"job1 (1)": {
|
||||
result: runnerv1.Result_RESULT_SUCCESS,
|
||||
outputs: map[string]string{
|
||||
"output_1": "1",
|
||||
"output_2": "",
|
||||
"output_3": "",
|
||||
},
|
||||
},
|
||||
"job1 (2)": {
|
||||
result: runnerv1.Result_RESULT_SUCCESS,
|
||||
outputs: map[string]string{
|
||||
"output_1": "",
|
||||
"output_2": "2",
|
||||
"output_3": "",
|
||||
},
|
||||
},
|
||||
"job1 (3)": {
|
||||
result: runnerv1.Result_RESULT_SUCCESS,
|
||||
outputs: map[string]string{
|
||||
"output_1": "",
|
||||
"output_2": "",
|
||||
"output_3": "3",
|
||||
},
|
||||
},
|
||||
},
|
||||
expectedTaskNeeds: map[string]*runnerv1.TaskNeed{
|
||||
"job1": {
|
||||
Result: runnerv1.Result_RESULT_SUCCESS,
|
||||
Outputs: map[string]string{
|
||||
"output_1": "1",
|
||||
"output_2": "2",
|
||||
"output_3": "3",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
treePath: ".gitea/workflows/jobs-outputs-with-matrix-failure.yml",
|
||||
fileContent: `name: jobs-outputs-with-matrix-failure
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- '.gitea/workflows/jobs-outputs-with-matrix-failure.yml'
|
||||
jobs:
|
||||
job1:
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
output_1: ${{ steps.gen_output.outputs.output_1 }}
|
||||
output_2: ${{ steps.gen_output.outputs.output_2 }}
|
||||
output_3: ${{ steps.gen_output.outputs.output_3 }}
|
||||
strategy:
|
||||
matrix:
|
||||
version: [1, 2, 3]
|
||||
steps:
|
||||
- name: Generate output
|
||||
id: gen_output
|
||||
run: |
|
||||
version="${{ matrix.version }}"
|
||||
echo "output_${version}=${version}" >> "$GITHUB_OUTPUT"
|
||||
job2:
|
||||
runs-on: ubuntu-latest
|
||||
if: ${{ always() }}
|
||||
needs: [job1]
|
||||
steps:
|
||||
- run: echo '${{ toJSON(needs.job1.outputs) }}'
|
||||
`,
|
||||
outcomes: map[string]*mockTaskOutcome{
|
||||
"job1 (1)": {
|
||||
result: runnerv1.Result_RESULT_SUCCESS,
|
||||
outputs: map[string]string{
|
||||
"output_1": "1",
|
||||
"output_2": "",
|
||||
"output_3": "",
|
||||
},
|
||||
},
|
||||
"job1 (2)": {
|
||||
result: runnerv1.Result_RESULT_FAILURE,
|
||||
outputs: map[string]string{
|
||||
"output_1": "",
|
||||
"output_2": "",
|
||||
"output_3": "",
|
||||
},
|
||||
},
|
||||
"job1 (3)": {
|
||||
result: runnerv1.Result_RESULT_SUCCESS,
|
||||
outputs: map[string]string{
|
||||
"output_1": "",
|
||||
"output_2": "",
|
||||
"output_3": "3",
|
||||
},
|
||||
},
|
||||
},
|
||||
expectedTaskNeeds: map[string]*runnerv1.TaskNeed{
|
||||
"job1": {
|
||||
Result: runnerv1.Result_RESULT_FAILURE,
|
||||
Outputs: map[string]string{
|
||||
"output_1": "1",
|
||||
"output_2": "",
|
||||
"output_3": "3",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
onGiteaRun(t, func(t *testing.T, u *url.URL) {
|
||||
user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
|
||||
session := loginUser(t, user2.Name)
|
||||
token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser)
|
||||
|
||||
apiRepo := createActionsTestRepo(t, token, "actions-jobs-outputs-with-matrix", false)
|
||||
runner := newMockRunner()
|
||||
runner.registerAsRepoRunner(t, user2.Name, apiRepo.Name, "mock-runner", []string{"ubuntu-latest"})
|
||||
|
||||
for _, tc := range testCases {
|
||||
t.Run(fmt.Sprintf("test %s", tc.treePath), func(t *testing.T) {
|
||||
opts := getWorkflowCreateFileOptions(user2, apiRepo.DefaultBranch, fmt.Sprintf("create %s", tc.treePath), tc.fileContent)
|
||||
createWorkflowFile(t, token, user2.Name, apiRepo.Name, tc.treePath, opts)
|
||||
|
||||
for i := 0; i < len(tc.outcomes); i++ {
|
||||
task := runner.fetchTask(t)
|
||||
jobName := getTaskJobNameByTaskID(t, token, user2.Name, apiRepo.Name, task.Id)
|
||||
outcome := tc.outcomes[jobName]
|
||||
assert.NotNil(t, outcome)
|
||||
runner.execTask(t, task, outcome)
|
||||
}
|
||||
|
||||
task := runner.fetchTask(t)
|
||||
actualTaskNeeds := task.Needs
|
||||
assert.Len(t, actualTaskNeeds, len(tc.expectedTaskNeeds))
|
||||
for jobID, tn := range tc.expectedTaskNeeds {
|
||||
actualNeed := actualTaskNeeds[jobID]
|
||||
assert.Equal(t, tn.Result, actualNeed.Result)
|
||||
assert.Len(t, actualNeed.Outputs, len(tn.Outputs))
|
||||
for outputKey, outputValue := range tn.Outputs {
|
||||
assert.Equal(t, outputValue, actualNeed.Outputs[outputKey])
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
httpContext := NewAPITestContext(t, user2.Name, apiRepo.Name, auth_model.AccessTokenScopeWriteRepository)
|
||||
doAPIDeleteRepository(httpContext)(t)
|
||||
})
|
||||
}
|
||||
|
||||
func createActionsTestRepo(t *testing.T, authToken, repoName string, isPrivate bool) *api.Repository {
|
||||
req := NewRequestWithJSON(t, "POST", "/api/v1/user/repos", &api.CreateRepoOption{
|
||||
Name: repoName,
|
||||
Private: isPrivate,
|
||||
Readme: "Default",
|
||||
AutoInit: true,
|
||||
DefaultBranch: "main",
|
||||
}).AddTokenAuth(authToken)
|
||||
resp := MakeRequest(t, req, http.StatusCreated)
|
||||
var apiRepo api.Repository
|
||||
DecodeJSON(t, resp, &apiRepo)
|
||||
return &apiRepo
|
||||
}
|
||||
|
||||
func getWorkflowCreateFileOptions(u *user_model.User, branch, msg, content string) *api.CreateFileOptions {
|
||||
return &api.CreateFileOptions{
|
||||
FileOptions: api.FileOptions{
|
||||
BranchName: branch,
|
||||
Message: msg,
|
||||
Author: api.Identity{
|
||||
Name: u.Name,
|
||||
Email: u.Email,
|
||||
},
|
||||
Committer: api.Identity{
|
||||
Name: u.Name,
|
||||
Email: u.Email,
|
||||
},
|
||||
Dates: api.CommitDateOptions{
|
||||
Author: time.Now(),
|
||||
Committer: time.Now(),
|
||||
},
|
||||
},
|
||||
ContentBase64: base64.StdEncoding.EncodeToString([]byte(content)),
|
||||
}
|
||||
}
|
||||
|
||||
func createWorkflowFile(t *testing.T, authToken, ownerName, repoName, treePath string, opts *api.CreateFileOptions) *api.FileResponse {
|
||||
req := NewRequestWithJSON(t, "POST", fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s", ownerName, repoName, treePath), opts).
|
||||
AddTokenAuth(authToken)
|
||||
resp := MakeRequest(t, req, http.StatusCreated)
|
||||
var fileResponse api.FileResponse
|
||||
DecodeJSON(t, resp, &fileResponse)
|
||||
return &fileResponse
|
||||
}
|
||||
|
||||
// getTaskJobNameByTaskID get the job name of the task by task ID
|
||||
// there is currently not an API for querying a task by ID so we have to list all the tasks
|
||||
func getTaskJobNameByTaskID(t *testing.T, authToken, ownerName, repoName string, taskID int64) string {
|
||||
// FIXME: we may need to query several pages
|
||||
req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/repos/%s/%s/actions/tasks", ownerName, repoName)).
|
||||
AddTokenAuth(authToken)
|
||||
resp := MakeRequest(t, req, http.StatusOK)
|
||||
var taskRespBefore api.ActionTaskResponse
|
||||
DecodeJSON(t, resp, &taskRespBefore)
|
||||
for _, apiTask := range taskRespBefore.Entries {
|
||||
if apiTask.ID == taskID {
|
||||
return apiTask.Name
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
163
tests/integration/actions_log_test.go
Normal file
163
tests/integration/actions_log_test.go
Normal file
|
@ -0,0 +1,163 @@
|
|||
// Copyright 2024 The Gitea Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package integration
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
auth_model "code.gitea.io/gitea/models/auth"
|
||||
repo_model "code.gitea.io/gitea/models/repo"
|
||||
"code.gitea.io/gitea/models/unittest"
|
||||
user_model "code.gitea.io/gitea/models/user"
|
||||
"code.gitea.io/gitea/modules/setting"
|
||||
"code.gitea.io/gitea/modules/storage"
|
||||
"code.gitea.io/gitea/modules/test"
|
||||
|
||||
runnerv1 "code.gitea.io/actions-proto-go/runner/v1"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"google.golang.org/protobuf/types/known/timestamppb"
|
||||
)
|
||||
|
||||
func TestDownloadTaskLogs(t *testing.T) {
|
||||
if !setting.Database.Type.IsSQLite3() {
|
||||
t.Skip()
|
||||
}
|
||||
now := time.Now()
|
||||
testCases := []struct {
|
||||
treePath string
|
||||
fileContent string
|
||||
outcome *mockTaskOutcome
|
||||
zstdEnabled bool
|
||||
}{
|
||||
{
|
||||
treePath: ".gitea/workflows/download-task-logs-zstd.yml",
|
||||
fileContent: `name: download-task-logs-zstd
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- '.gitea/workflows/download-task-logs-zstd.yml'
|
||||
jobs:
|
||||
job1:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- run: echo job1 with zstd enabled
|
||||
`,
|
||||
outcome: &mockTaskOutcome{
|
||||
result: runnerv1.Result_RESULT_SUCCESS,
|
||||
logRows: []*runnerv1.LogRow{
|
||||
{
|
||||
Time: timestamppb.New(now.Add(1 * time.Second)),
|
||||
Content: " \U0001F433 docker create image",
|
||||
},
|
||||
{
|
||||
Time: timestamppb.New(now.Add(2 * time.Second)),
|
||||
Content: "job1 zstd enabled",
|
||||
},
|
||||
{
|
||||
Time: timestamppb.New(now.Add(3 * time.Second)),
|
||||
Content: "\U0001F3C1 Job succeeded",
|
||||
},
|
||||
},
|
||||
},
|
||||
zstdEnabled: true,
|
||||
},
|
||||
{
|
||||
treePath: ".gitea/workflows/download-task-logs-no-zstd.yml",
|
||||
fileContent: `name: download-task-logs-no-zstd
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- '.gitea/workflows/download-task-logs-no-zstd.yml'
|
||||
jobs:
|
||||
job1:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- run: echo job1 with zstd disabled
|
||||
`,
|
||||
outcome: &mockTaskOutcome{
|
||||
result: runnerv1.Result_RESULT_SUCCESS,
|
||||
logRows: []*runnerv1.LogRow{
|
||||
{
|
||||
Time: timestamppb.New(now.Add(4 * time.Second)),
|
||||
Content: " \U0001F433 docker create image",
|
||||
},
|
||||
{
|
||||
Time: timestamppb.New(now.Add(5 * time.Second)),
|
||||
Content: "job1 zstd disabled",
|
||||
},
|
||||
{
|
||||
Time: timestamppb.New(now.Add(6 * time.Second)),
|
||||
Content: "\U0001F3C1 Job succeeded",
|
||||
},
|
||||
},
|
||||
},
|
||||
zstdEnabled: false,
|
||||
},
|
||||
}
|
||||
onGiteaRun(t, func(t *testing.T, u *url.URL) {
|
||||
user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
|
||||
session := loginUser(t, user2.Name)
|
||||
token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser)
|
||||
|
||||
apiRepo := createActionsTestRepo(t, token, "actions-download-task-logs", false)
|
||||
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: apiRepo.ID})
|
||||
runner := newMockRunner()
|
||||
runner.registerAsRepoRunner(t, user2.Name, repo.Name, "mock-runner", []string{"ubuntu-latest"})
|
||||
|
||||
for _, tc := range testCases {
|
||||
t.Run(fmt.Sprintf("test %s", tc.treePath), func(t *testing.T) {
|
||||
var resetFunc func()
|
||||
if tc.zstdEnabled {
|
||||
resetFunc = test.MockVariableValue(&setting.Actions.LogCompression, "zstd")
|
||||
assert.True(t, setting.Actions.LogCompression.IsZstd())
|
||||
} else {
|
||||
resetFunc = test.MockVariableValue(&setting.Actions.LogCompression, "none")
|
||||
assert.False(t, setting.Actions.LogCompression.IsZstd())
|
||||
}
|
||||
|
||||
// create the workflow file
|
||||
opts := getWorkflowCreateFileOptions(user2, repo.DefaultBranch, fmt.Sprintf("create %s", tc.treePath), tc.fileContent)
|
||||
createWorkflowFile(t, token, user2.Name, repo.Name, tc.treePath, opts)
|
||||
|
||||
// fetch and execute task
|
||||
task := runner.fetchTask(t)
|
||||
runner.execTask(t, task, tc.outcome)
|
||||
|
||||
// check whether the log file exists
|
||||
logFileName := fmt.Sprintf("%s/%02x/%d.log", repo.FullName(), task.Id%256, task.Id)
|
||||
if setting.Actions.LogCompression.IsZstd() {
|
||||
logFileName += ".zst"
|
||||
}
|
||||
_, err := storage.Actions.Stat(logFileName)
|
||||
require.NoError(t, err)
|
||||
|
||||
// download task logs and check content
|
||||
runIndex := task.Context.GetFields()["run_number"].GetStringValue()
|
||||
req := NewRequest(t, "GET", fmt.Sprintf("/%s/%s/actions/runs/%s/jobs/0/logs", user2.Name, repo.Name, runIndex)).
|
||||
AddTokenAuth(token)
|
||||
resp := MakeRequest(t, req, http.StatusOK)
|
||||
logTextLines := strings.Split(strings.TrimSpace(resp.Body.String()), "\n")
|
||||
assert.Len(t, logTextLines, len(tc.outcome.logRows))
|
||||
for idx, lr := range tc.outcome.logRows {
|
||||
assert.Equal(
|
||||
t,
|
||||
fmt.Sprintf("%s %s", lr.Time.AsTime().Format("2006-01-02T15:04:05.0000000Z07:00"), lr.Content),
|
||||
logTextLines[idx],
|
||||
)
|
||||
}
|
||||
|
||||
resetFunc()
|
||||
})
|
||||
}
|
||||
|
||||
httpContext := NewAPITestContext(t, user2.Name, repo.Name, auth_model.AccessTokenScopeWriteRepository)
|
||||
doAPIDeleteRepository(httpContext)(t)
|
||||
})
|
||||
}
|
162
tests/integration/actions_runner_test.go
Normal file
162
tests/integration/actions_runner_test.go
Normal file
|
@ -0,0 +1,162 @@
|
|||
// Copyright 2024 The Gitea Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package integration
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
auth_model "code.gitea.io/gitea/models/auth"
|
||||
"code.gitea.io/gitea/modules/setting"
|
||||
|
||||
pingv1 "code.gitea.io/actions-proto-go/ping/v1"
|
||||
"code.gitea.io/actions-proto-go/ping/v1/pingv1connect"
|
||||
runnerv1 "code.gitea.io/actions-proto-go/runner/v1"
|
||||
"code.gitea.io/actions-proto-go/runner/v1/runnerv1connect"
|
||||
"connectrpc.com/connect"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"google.golang.org/protobuf/types/known/timestamppb"
|
||||
)
|
||||
|
||||
type mockRunner struct {
|
||||
client *mockRunnerClient
|
||||
}
|
||||
|
||||
type mockRunnerClient struct {
|
||||
pingServiceClient pingv1connect.PingServiceClient
|
||||
runnerServiceClient runnerv1connect.RunnerServiceClient
|
||||
}
|
||||
|
||||
func newMockRunner() *mockRunner {
|
||||
client := newMockRunnerClient("", "")
|
||||
return &mockRunner{client: client}
|
||||
}
|
||||
|
||||
func newMockRunnerClient(uuid, token string) *mockRunnerClient {
|
||||
baseURL := fmt.Sprintf("%sapi/actions", setting.AppURL)
|
||||
|
||||
opt := connect.WithInterceptors(connect.UnaryInterceptorFunc(func(next connect.UnaryFunc) connect.UnaryFunc {
|
||||
return func(ctx context.Context, req connect.AnyRequest) (connect.AnyResponse, error) {
|
||||
if uuid != "" {
|
||||
req.Header().Set("x-runner-uuid", uuid)
|
||||
}
|
||||
if token != "" {
|
||||
req.Header().Set("x-runner-token", token)
|
||||
}
|
||||
return next(ctx, req)
|
||||
}
|
||||
}))
|
||||
|
||||
client := &mockRunnerClient{
|
||||
pingServiceClient: pingv1connect.NewPingServiceClient(http.DefaultClient, baseURL, opt),
|
||||
runnerServiceClient: runnerv1connect.NewRunnerServiceClient(http.DefaultClient, baseURL, opt),
|
||||
}
|
||||
|
||||
return client
|
||||
}
|
||||
|
||||
func (r *mockRunner) doPing(t *testing.T) {
|
||||
resp, err := r.client.pingServiceClient.Ping(context.Background(), connect.NewRequest(&pingv1.PingRequest{
|
||||
Data: "mock-runner",
|
||||
}))
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, "Hello, mock-runner!", resp.Msg.Data)
|
||||
}
|
||||
|
||||
func (r *mockRunner) doRegister(t *testing.T, name, token string, labels []string) {
|
||||
r.doPing(t)
|
||||
resp, err := r.client.runnerServiceClient.Register(context.Background(), connect.NewRequest(&runnerv1.RegisterRequest{
|
||||
Name: name,
|
||||
Token: token,
|
||||
Version: "mock-runner-version",
|
||||
Labels: labels,
|
||||
}))
|
||||
require.NoError(t, err)
|
||||
r.client = newMockRunnerClient(resp.Msg.Runner.Uuid, resp.Msg.Runner.Token)
|
||||
}
|
||||
|
||||
func (r *mockRunner) registerAsRepoRunner(t *testing.T, ownerName, repoName, runnerName string, labels []string) {
|
||||
if !setting.Database.Type.IsSQLite3() {
|
||||
// registering a mock runner when using a database other than SQLite leaves leftovers
|
||||
t.FailNow()
|
||||
}
|
||||
session := loginUser(t, ownerName)
|
||||
token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository)
|
||||
req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/repos/%s/%s/actions/runners/registration-token", ownerName, repoName)).AddTokenAuth(token)
|
||||
resp := MakeRequest(t, req, http.StatusOK)
|
||||
var registrationToken struct {
|
||||
Token string `json:"token"`
|
||||
}
|
||||
DecodeJSON(t, resp, ®istrationToken)
|
||||
r.doRegister(t, runnerName, registrationToken.Token, labels)
|
||||
}
|
||||
|
||||
func (r *mockRunner) fetchTask(t *testing.T, timeout ...time.Duration) *runnerv1.Task {
|
||||
fetchTimeout := 10 * time.Second
|
||||
if len(timeout) > 0 {
|
||||
fetchTimeout = timeout[0]
|
||||
}
|
||||
ddl := time.Now().Add(fetchTimeout)
|
||||
var task *runnerv1.Task
|
||||
for time.Now().Before(ddl) {
|
||||
resp, err := r.client.runnerServiceClient.FetchTask(context.Background(), connect.NewRequest(&runnerv1.FetchTaskRequest{
|
||||
TasksVersion: 0,
|
||||
}))
|
||||
require.NoError(t, err)
|
||||
if resp.Msg.Task != nil {
|
||||
task = resp.Msg.Task
|
||||
break
|
||||
}
|
||||
time.Sleep(time.Second)
|
||||
}
|
||||
assert.NotNil(t, task, "failed to fetch a task")
|
||||
return task
|
||||
}
|
||||
|
||||
type mockTaskOutcome struct {
|
||||
result runnerv1.Result
|
||||
outputs map[string]string
|
||||
logRows []*runnerv1.LogRow
|
||||
execTime time.Duration
|
||||
}
|
||||
|
||||
func (r *mockRunner) execTask(t *testing.T, task *runnerv1.Task, outcome *mockTaskOutcome) {
|
||||
for idx, lr := range outcome.logRows {
|
||||
resp, err := r.client.runnerServiceClient.UpdateLog(context.Background(), connect.NewRequest(&runnerv1.UpdateLogRequest{
|
||||
TaskId: task.Id,
|
||||
Index: int64(idx),
|
||||
Rows: []*runnerv1.LogRow{lr},
|
||||
NoMore: idx == len(outcome.logRows)-1,
|
||||
}))
|
||||
require.NoError(t, err)
|
||||
assert.EqualValues(t, idx+1, resp.Msg.AckIndex)
|
||||
}
|
||||
sentOutputKeys := make([]string, 0, len(outcome.outputs))
|
||||
for outputKey, outputValue := range outcome.outputs {
|
||||
resp, err := r.client.runnerServiceClient.UpdateTask(context.Background(), connect.NewRequest(&runnerv1.UpdateTaskRequest{
|
||||
State: &runnerv1.TaskState{
|
||||
Id: task.Id,
|
||||
Result: runnerv1.Result_RESULT_UNSPECIFIED,
|
||||
},
|
||||
Outputs: map[string]string{outputKey: outputValue},
|
||||
}))
|
||||
require.NoError(t, err)
|
||||
sentOutputKeys = append(sentOutputKeys, outputKey)
|
||||
assert.ElementsMatch(t, sentOutputKeys, resp.Msg.SentOutputs)
|
||||
}
|
||||
time.Sleep(outcome.execTime)
|
||||
resp, err := r.client.runnerServiceClient.UpdateTask(context.Background(), connect.NewRequest(&runnerv1.UpdateTaskRequest{
|
||||
State: &runnerv1.TaskState{
|
||||
Id: task.Id,
|
||||
Result: outcome.result,
|
||||
StoppedAt: timestamppb.Now(),
|
||||
},
|
||||
}))
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, outcome.result, resp.Msg.State.Result)
|
||||
}
|
|
@ -120,27 +120,33 @@ func TestAPIAddIssueLabels(t *testing.T) {
|
|||
func TestAPIAddIssueLabelsWithLabelNames(t *testing.T) {
|
||||
require.NoError(t, unittest.LoadFixtures())
|
||||
|
||||
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
|
||||
issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{RepoID: repo.ID})
|
||||
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3})
|
||||
issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 6, RepoID: repo.ID})
|
||||
owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
|
||||
repoLabel := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 10, RepoID: repo.ID})
|
||||
orgLabel := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 4, OrgID: owner.ID})
|
||||
|
||||
session := loginUser(t, owner.Name)
|
||||
token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteIssue)
|
||||
urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/labels",
|
||||
repo.OwnerName, repo.Name, issue.Index)
|
||||
user1Session := loginUser(t, "user1")
|
||||
token := getTokenForLoggedInUser(t, user1Session, auth_model.AccessTokenScopeWriteIssue)
|
||||
|
||||
// add the org label and the repo label to the issue
|
||||
urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/labels", owner.Name, repo.Name, issue.Index)
|
||||
req := NewRequestWithJSON(t, "POST", urlStr, &api.IssueLabelsOption{
|
||||
Labels: []any{"label1", "label2"},
|
||||
Labels: []any{repoLabel.Name, orgLabel.Name},
|
||||
}).AddTokenAuth(token)
|
||||
resp := MakeRequest(t, req, http.StatusOK)
|
||||
var apiLabels []*api.Label
|
||||
DecodeJSON(t, resp, &apiLabels)
|
||||
assert.Len(t, apiLabels, unittest.GetCount(t, &issues_model.IssueLabel{IssueID: issue.ID}))
|
||||
|
||||
var apiLabelNames []string
|
||||
for _, label := range apiLabels {
|
||||
apiLabelNames = append(apiLabelNames, label.Name)
|
||||
}
|
||||
assert.ElementsMatch(t, apiLabelNames, []string{"label1", "label2"})
|
||||
assert.ElementsMatch(t, apiLabelNames, []string{repoLabel.Name, orgLabel.Name})
|
||||
|
||||
// delete labels
|
||||
req = NewRequest(t, "DELETE", urlStr).AddTokenAuth(token)
|
||||
MakeRequest(t, req, http.StatusNoContent)
|
||||
}
|
||||
|
||||
func TestAPIAddIssueLabelsAutoDate(t *testing.T) {
|
||||
|
|
|
@ -8,6 +8,7 @@ import (
|
|||
"net/http"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"testing"
|
||||
|
||||
"code.gitea.io/gitea/models/db"
|
||||
|
@ -254,3 +255,35 @@ func TestPackageMaven(t *testing.T) {
|
|||
assert.NotContains(t, resp.Body.String(), "Internal server error")
|
||||
})
|
||||
}
|
||||
|
||||
func TestPackageMavenConcurrent(t *testing.T) {
|
||||
defer tests.PrepareTestEnv(t)()
|
||||
|
||||
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
|
||||
|
||||
groupID := "com.gitea"
|
||||
artifactID := "test-project"
|
||||
packageVersion := "1.0.1"
|
||||
|
||||
root := fmt.Sprintf("/api/packages/%s/maven/%s/%s", user.Name, strings.ReplaceAll(groupID, ".", "/"), artifactID)
|
||||
|
||||
putFile := func(t *testing.T, path, content string, expectedStatus int) {
|
||||
req := NewRequestWithBody(t, "PUT", root+path, strings.NewReader(content)).
|
||||
AddBasicAuth(user.Name)
|
||||
MakeRequest(t, req, expectedStatus)
|
||||
}
|
||||
|
||||
t.Run("Concurrent Upload", func(t *testing.T) {
|
||||
defer tests.PrintCurrentTest(t)()
|
||||
|
||||
var wg sync.WaitGroup
|
||||
for i := 0; i < 10; i++ {
|
||||
wg.Add(1)
|
||||
go func(i int) {
|
||||
putFile(t, fmt.Sprintf("/%s/%s.jar", packageVersion, strconv.Itoa(i)), "test", http.StatusCreated)
|
||||
wg.Done()
|
||||
}(i)
|
||||
}
|
||||
wg.Wait()
|
||||
})
|
||||
}
|
||||
|
|
|
@ -224,6 +224,29 @@ func TestAPIListWikiPages(t *testing.T) {
|
|||
Message: "add unescaped file\n",
|
||||
},
|
||||
},
|
||||
{
|
||||
Title: "XSS",
|
||||
HTMLURL: meta[5].HTMLURL,
|
||||
SubURL: "XSS",
|
||||
LastCommit: &api.WikiCommit{
|
||||
ID: "f54f5a6b7c4f83b606600e43186165854f189530",
|
||||
Author: &api.CommitUser{
|
||||
Identity: api.Identity{
|
||||
Name: "Gusted<script class=\"evil\">alert('Oh no!');</script>",
|
||||
Email: "valid@example.org",
|
||||
},
|
||||
Date: "2024-01-31T00:00:00Z",
|
||||
},
|
||||
Committer: &api.CommitUser{
|
||||
Identity: api.Identity{
|
||||
Name: "Gusted<script class=\"evil\">alert('Oh no!');</script>",
|
||||
Email: "valid@example.org",
|
||||
},
|
||||
Date: "2024-01-31T00:00:00Z",
|
||||
},
|
||||
Message: "Yay XSS",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
assert.Equal(t, dummymeta, meta)
|
||||
|
|
|
@ -185,7 +185,6 @@ func TestLDAPUserSignin(t *testing.T) {
|
|||
|
||||
assert.Equal(t, u.UserName, htmlDoc.GetInputValueByName("name"))
|
||||
assert.Equal(t, u.FullName, htmlDoc.GetInputValueByName("full_name"))
|
||||
assert.Equal(t, u.Email, htmlDoc.Find("#signed-user-email").Text())
|
||||
}
|
||||
|
||||
func TestLDAPAuthChange(t *testing.T) {
|
||||
|
|
|
@ -291,3 +291,43 @@ func TestCompareCodeExpand(t *testing.T) {
|
|||
})
|
||||
})
|
||||
}
|
||||
|
||||
func TestCompareSignedIn(t *testing.T) {
|
||||
onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) {
|
||||
// Setup the test with a connected user
|
||||
session := loginUser(t, "user1")
|
||||
testRepoFork(t, session, "user2", "repo1", "user1", "repo1")
|
||||
testCreateBranch(t, session, "user1", "repo1", "branch/master", "recent-push", http.StatusSeeOther)
|
||||
testEditFile(t, session, "user1", "repo1", "recent-push", "README.md", "Hello recently!\n")
|
||||
|
||||
newPrSelector := "button.ui.button.primary.show-form"
|
||||
|
||||
t.Run("PR creation button displayed if logged in", func(t *testing.T) {
|
||||
defer tests.PrintCurrentTest(t)()
|
||||
|
||||
req := NewRequest(t, "GET", "/user1/repo1/compare/master...recent-push")
|
||||
resp := session.MakeRequest(t, req, http.StatusOK)
|
||||
htmlDoc := NewHTMLParser(t, resp.Body)
|
||||
|
||||
// Check that the "Sign in" button doesn't show up
|
||||
htmlDoc.AssertElement(t, "a[href='/user/login?redirect_to=%2Fuser1%2Frepo1%2Fcompare%2Fmaster...recent-push']", false)
|
||||
|
||||
// Check that the "New pull request" button shows up
|
||||
htmlDoc.AssertElement(t, newPrSelector, true)
|
||||
})
|
||||
|
||||
t.Run("no PR creation button but display warning", func(t *testing.T) {
|
||||
defer tests.PrintCurrentTest(t)()
|
||||
|
||||
req := NewRequest(t, "GET", "/user1/repo1/compare/master...recent-push")
|
||||
resp := MakeRequest(t, req, http.StatusOK)
|
||||
htmlDoc := NewHTMLParser(t, resp.Body)
|
||||
|
||||
// Check that the "Sign in" button shows up
|
||||
htmlDoc.AssertElement(t, "a[href='/user/login?redirect_to=%2Fuser1%2Frepo1%2Fcompare%2Fmaster...recent-push']", true)
|
||||
|
||||
// Check that the "New pull request" button doesn't show up
|
||||
htmlDoc.AssertElement(t, newPrSelector, false)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
|
|
@ -94,45 +94,71 @@ func TestOpenGraphProperties(t *testing.T) {
|
|||
name: "file in repo",
|
||||
url: "/user27/repo49/src/branch/master/test/test.txt",
|
||||
expected: map[string]string{
|
||||
"og:title": "repo49/test/test.txt at master",
|
||||
"og:url": setting.AppURL + "/user27/repo49/src/branch/master/test/test.txt",
|
||||
"og:type": "object",
|
||||
"og:image": setting.AppURL + "assets/img/avatar_default.png",
|
||||
"og:site_name": siteName,
|
||||
"og:title": "repo49/test/test.txt at master",
|
||||
"og:url": setting.AppURL + "/user27/repo49/src/branch/master/test/test.txt",
|
||||
"og:type": "object",
|
||||
"og:image": setting.AppURL + "user27/repo49/-/summary-card",
|
||||
"og:image:alt": "Summary card of repository user27/repo49",
|
||||
"og:image:width": "1200",
|
||||
"og:image:height": "600",
|
||||
"og:site_name": siteName,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "wiki page for repo without description",
|
||||
url: "/user2/repo1/wiki/Page-With-Spaced-Name",
|
||||
expected: map[string]string{
|
||||
"og:title": "Page With Spaced Name",
|
||||
"og:url": setting.AppURL + "/user2/repo1/wiki/Page-With-Spaced-Name",
|
||||
"og:type": "object",
|
||||
"og:image": setting.AppURL + "avatars/ab53a2911ddf9b4817ac01ddcd3d975f",
|
||||
"og:site_name": siteName,
|
||||
"og:title": "Page With Spaced Name",
|
||||
"og:url": setting.AppURL + "/user2/repo1/wiki/Page-With-Spaced-Name",
|
||||
"og:type": "object",
|
||||
"og:image": setting.AppURL + "user2/repo1/-/summary-card",
|
||||
"og:image:alt": "Summary card of repository user2/repo1",
|
||||
"og:image:width": "1200",
|
||||
"og:image:height": "600",
|
||||
"og:site_name": siteName,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "index page for repo without description",
|
||||
url: "/user2/repo1",
|
||||
expected: map[string]string{
|
||||
"og:title": "repo1",
|
||||
"og:url": setting.AppURL + "user2/repo1",
|
||||
"og:type": "object",
|
||||
"og:image": setting.AppURL + "avatars/ab53a2911ddf9b4817ac01ddcd3d975f",
|
||||
"og:site_name": siteName,
|
||||
"og:title": "repo1",
|
||||
"og:url": setting.AppURL + "user2/repo1",
|
||||
"og:type": "object",
|
||||
"og:image": setting.AppURL + "user2/repo1/-/summary-card",
|
||||
"og:image:alt": "Summary card of repository user2/repo1",
|
||||
"og:image:width": "1200",
|
||||
"og:image:height": "600",
|
||||
"og:site_name": siteName,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "index page for repo with description",
|
||||
url: "/user27/repo49",
|
||||
expected: map[string]string{
|
||||
"og:title": "repo49",
|
||||
"og:url": setting.AppURL + "user27/repo49",
|
||||
"og:description": "A wonderful repository with more than just a README.md",
|
||||
"og:type": "object",
|
||||
"og:image": setting.AppURL + "assets/img/avatar_default.png",
|
||||
"og:site_name": siteName,
|
||||
"og:title": "repo49",
|
||||
"og:url": setting.AppURL + "user27/repo49",
|
||||
"og:description": "A wonderful repository with more than just a README.md",
|
||||
"og:type": "object",
|
||||
"og:image": setting.AppURL + "user27/repo49/-/summary-card",
|
||||
"og:image:alt": "Summary card of repository user27/repo49",
|
||||
"og:image:width": "1200",
|
||||
"og:image:height": "600",
|
||||
"og:site_name": siteName,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "release",
|
||||
url: "/user2/repo1/releases/tag/v1.1",
|
||||
expected: map[string]string{
|
||||
"og:title": "testing-release - user2/repo1",
|
||||
"og:url": setting.AppURL + "user2/repo1/releases/tag/v1.1",
|
||||
"og:type": "object",
|
||||
"og:image": setting.AppURL + "user2/repo1/releases/summary-card/v1.1",
|
||||
"og:image:alt": "Summary card of an release titled \"testing-release\" in repository user2/repo1",
|
||||
"og:image:width": "1200",
|
||||
"og:image:height": "600",
|
||||
"og:site_name": siteName,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
@ -166,6 +192,10 @@ func TestOpenGraphSummaryCard(t *testing.T) {
|
|||
name string
|
||||
url string
|
||||
}{
|
||||
{
|
||||
name: "repo",
|
||||
url: "/user2/repo1/-/summary-card",
|
||||
},
|
||||
{
|
||||
name: "issue",
|
||||
url: "/user2/repo1/issues/1/summary-card",
|
||||
|
@ -174,6 +204,10 @@ func TestOpenGraphSummaryCard(t *testing.T) {
|
|||
name: "pull request",
|
||||
url: "/user2/repo1/pulls/2/summary-card",
|
||||
},
|
||||
{
|
||||
name: "release",
|
||||
url: "/user2/repo1/releases/summary-card/v1.1",
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
|
|
|
@ -43,7 +43,7 @@ func assertRepoCreateForm(t *testing.T, htmlDoc *HTMLDoc, owner *user_model.User
|
|||
// the template menu is loaded client-side, so don't assert the option exists
|
||||
assert.Equal(t, templateID, htmlDoc.GetInputValueByName("repo_template"), "Unexpected repo_template selection")
|
||||
|
||||
for _, name := range []string{"issue_labels", "gitignores", "license", "readme", "object_format_name"} {
|
||||
for _, name := range []string{"issue_labels", "gitignores", "license", "object_format_name"} {
|
||||
htmlDoc.AssertDropdownHasOptions(t, name)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -78,6 +78,7 @@ func testSearchRepo(t *testing.T, indexer bool) {
|
|||
code_indexer.UpdateRepoIndexer(repo)
|
||||
}
|
||||
|
||||
testSearch(t, "/user2/glob/search?q=", []string{}, indexer)
|
||||
testSearch(t, "/user2/glob/search?q=loren&page=1", []string{"a.txt"}, indexer)
|
||||
testSearch(t, "/user2/glob/search?q=loren&page=1&mode=exact", []string{"a.txt"}, indexer)
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue