mirror of
https://codeberg.org/davrot/forgejo.git
synced 2025-07-22 16:00:03 +02:00
Compare commits
27 commits
a3703a71ca
...
d48ff06b06
Author | SHA1 | Date | |
---|---|---|---|
![]() |
d48ff06b06 | ||
![]() |
877fa8cec1 | ||
![]() |
5e157d40df | ||
![]() |
65bb09a332 | ||
![]() |
7380eac5a2 | ||
![]() |
90f8239448 | ||
![]() |
53d5e6d754 | ||
![]() |
6cdf2cd66e | ||
![]() |
35e051aaee | ||
![]() |
44de50fcac | ||
![]() |
07cc5802bf | ||
![]() |
2fdddcb04e | ||
![]() |
fd2f9e6842 | ||
![]() |
a4ea74020f | ||
![]() |
42514a4744 | ||
![]() |
09699c1506 | ||
![]() |
c21d271358 | ||
![]() |
07e8684a61 | ||
![]() |
402a85a9b6 | ||
![]() |
563d8f1564 | ||
![]() |
4a06153709 | ||
![]() |
e2cf8520bc | ||
![]() |
db99d8d09e | ||
![]() |
6753480ab1 | ||
![]() |
442f11995c | ||
![]() |
fe28f128df | ||
![]() |
2d436a5244 |
86 changed files with 1746 additions and 821 deletions
|
@ -37,13 +37,9 @@ coverage.all
|
|||
coverage/
|
||||
cpu.out
|
||||
|
||||
/modules/migration/bindata.go
|
||||
/modules/migration/bindata.go.hash
|
||||
/modules/options/bindata.go
|
||||
/modules/options/bindata.go.hash
|
||||
/modules/public/bindata.go
|
||||
/modules/public/bindata.go.hash
|
||||
/modules/templates/bindata.go
|
||||
/modules/templates/bindata.go.hash
|
||||
|
||||
*.db
|
||||
|
|
|
@ -164,7 +164,7 @@ jobs:
|
|||
|
||||
- name: build container & release
|
||||
if: ${{ secrets.TOKEN != '' }}
|
||||
uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.3.4
|
||||
uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.3.5
|
||||
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.3.4
|
||||
uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.3.5
|
||||
with:
|
||||
forgejo: "${{ env.GITHUB_SERVER_URL }}"
|
||||
owner: "${{ env.GITHUB_REPOSITORY_OWNER }}"
|
||||
|
|
|
@ -44,7 +44,7 @@ jobs:
|
|||
- uses: https://data.forgejo.org/actions/checkout@v4
|
||||
|
||||
- name: copy & sign
|
||||
uses: https://data.forgejo.org/forgejo/forgejo-build-publish/publish@v5.3.4
|
||||
uses: https://data.forgejo.org/forgejo/forgejo-build-publish/publish@v5.3.5
|
||||
with:
|
||||
from-forgejo: ${{ vars.FORGEJO }}
|
||||
to-forgejo: ${{ vars.FORGEJO }}
|
||||
|
|
|
@ -28,7 +28,7 @@ jobs:
|
|||
|
||||
runs-on: docker
|
||||
container:
|
||||
image: data.forgejo.org/renovate/renovate:40.48.4
|
||||
image: data.forgejo.org/renovate/renovate:40.57.1
|
||||
|
||||
steps:
|
||||
- name: Load renovate repo cache
|
||||
|
|
|
@ -91,6 +91,7 @@ jobs:
|
|||
RACE_ENABLED: 'true'
|
||||
TAGS: bindata
|
||||
TEST_ELASTICSEARCH_URL: http://elasticsearch:9200
|
||||
TEST_MINIO_ENDPOINT: minio:9000
|
||||
test-e2e:
|
||||
if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing'
|
||||
runs-on: docker
|
||||
|
|
|
@ -33,10 +33,10 @@ RUN apk --no-cache add build-base git nodejs npm
|
|||
COPY . ${GOPATH}/src/forgejo.org
|
||||
WORKDIR ${GOPATH}/src/forgejo.org
|
||||
|
||||
RUN make clean
|
||||
RUN make clean-no-bindata
|
||||
RUN make frontend
|
||||
RUN go build contrib/environment-to-ini/environment-to-ini.go && xx-verify environment-to-ini
|
||||
RUN LDFLAGS="-buildid=" make RELEASE_VERSION=$RELEASE_VERSION GOFLAGS="-trimpath" go-check generate-backend static-executable && xx-verify gitea
|
||||
RUN LDFLAGS="-buildid=" make FORGEJO_GENERATE_SKIP_HASH=true RELEASE_VERSION=$RELEASE_VERSION GOFLAGS="-trimpath" go-check generate-backend static-executable && xx-verify gitea
|
||||
|
||||
# Copy local files
|
||||
COPY docker/root /tmp/local
|
||||
|
|
|
@ -33,10 +33,10 @@ RUN apk --no-cache add build-base git nodejs npm
|
|||
COPY . ${GOPATH}/src/forgejo.org
|
||||
WORKDIR ${GOPATH}/src/forgejo.org
|
||||
|
||||
RUN make clean
|
||||
RUN make clean-no-bindata
|
||||
RUN make frontend
|
||||
RUN go build contrib/environment-to-ini/environment-to-ini.go && xx-verify environment-to-ini
|
||||
RUN make RELEASE_VERSION=$RELEASE_VERSION go-check generate-backend static-executable && xx-verify gitea
|
||||
RUN make FORGEJO_GENERATE_SKIP_HASH=true RELEASE_VERSION=$RELEASE_VERSION go-check generate-backend static-executable && xx-verify gitea
|
||||
|
||||
# Copy local files
|
||||
COPY docker/rootless /tmp/local
|
||||
|
|
12
Makefile
12
Makefile
|
@ -48,7 +48,7 @@ GOVULNCHECK_PACKAGE ?= golang.org/x/vuln/cmd/govulncheck@v1 # renovate: datasour
|
|||
DEADCODE_PACKAGE ?= golang.org/x/tools/cmd/deadcode@v0.34.0 # renovate: datasource=go
|
||||
GOMOCK_PACKAGE ?= go.uber.org/mock/mockgen@v0.5.2 # renovate: datasource=go
|
||||
GOPLS_PACKAGE ?= golang.org/x/tools/gopls@v0.18.1 # renovate: datasource=go
|
||||
RENOVATE_NPM_PACKAGE ?= renovate@40.48.4 # renovate: datasource=docker packageName=data.forgejo.org/renovate/renovate
|
||||
RENOVATE_NPM_PACKAGE ?= renovate@40.57.1 # renovate: datasource=docker packageName=data.forgejo.org/renovate/renovate
|
||||
|
||||
# https://github.com/disposable-email-domains/disposable-email-domains/commits/main/
|
||||
DISPOSABLE_EMAILS_SHA ?= 0c27e671231d27cf66370034d7f6818037416989 # renovate: ...
|
||||
|
@ -129,7 +129,7 @@ WEBPACK_CONFIGS := webpack.config.js tailwind.config.js
|
|||
WEBPACK_DEST := public/assets/js/index.js public/assets/css/index.css
|
||||
WEBPACK_DEST_ENTRIES := public/assets/js public/assets/css public/assets/fonts
|
||||
|
||||
BINDATA_DEST := modules/public/bindata.go modules/options/bindata.go modules/templates/bindata.go
|
||||
BINDATA_DEST := modules/migration/bindata.go modules/public/bindata.go modules/options/bindata.go modules/templates/bindata.go
|
||||
BINDATA_HASH := $(addsuffix .hash,$(BINDATA_DEST))
|
||||
|
||||
GENERATED_GO_DEST := modules/charset/invisible_gen.go modules/charset/ambiguous_gen.go
|
||||
|
@ -325,8 +325,12 @@ clean-all: clean
|
|||
rm -rf $(WEBPACK_DEST_ENTRIES) node_modules
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
rm -rf $(EXECUTABLE) $(DIST) $(BINDATA_DEST) $(BINDATA_HASH) \
|
||||
clean: clean-no-bindata
|
||||
rm -rf $(BINDATA_DEST) $(BINDATA_HASH)
|
||||
|
||||
.PHONY: clean-no-bindata
|
||||
clean-no-bindata:
|
||||
rm -rf $(EXECUTABLE) $(DIST) \
|
||||
integrations*.test \
|
||||
e2e*.test \
|
||||
tests/integration/gitea-integration-* \
|
||||
|
|
30
assets/go-licenses.json
generated
30
assets/go-licenses.json
generated
File diff suppressed because one or more lines are too long
|
@ -22,12 +22,19 @@ import (
|
|||
"github.com/klauspost/compress/zstd"
|
||||
)
|
||||
|
||||
func needsUpdate(dir, filename string) (bool, []byte) {
|
||||
needRegen := false
|
||||
func fileExists(filename string) bool {
|
||||
_, err := os.Stat(filename)
|
||||
if err != nil {
|
||||
needRegen = true
|
||||
if err == nil {
|
||||
return true
|
||||
}
|
||||
if os.IsNotExist(err) {
|
||||
return false
|
||||
}
|
||||
panic(err)
|
||||
}
|
||||
|
||||
func needsUpdate(dir, filename string) (bool, []byte) {
|
||||
needRegen := !fileExists(filename)
|
||||
|
||||
oldHash, err := os.ReadFile(filename + ".hash")
|
||||
if err != nil {
|
||||
|
@ -73,10 +80,14 @@ func main() {
|
|||
useGlobalModTime, _ = strconv.ParseBool(os.Args[4])
|
||||
}
|
||||
|
||||
update, newHash := needsUpdate(dir, filename)
|
||||
if os.Getenv("FORGEJO_GENERATE_SKIP_HASH") == "true" && fileExists(filename) {
|
||||
fmt.Printf("bindata %s already exists and FORGEJO_GENERATE_SKIP_HASH=true\n", packageName)
|
||||
return
|
||||
}
|
||||
|
||||
update, newHash := needsUpdate(dir, filename)
|
||||
if !update {
|
||||
fmt.Printf("bindata for %s already up-to-date\n", packageName)
|
||||
fmt.Printf("bindata %s already exists and the checksum is a match\n", packageName)
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -1,45 +1,46 @@
|
|||
Environment To Ini
|
||||
==================
|
||||
|
||||
Multiple docker users have requested that the Gitea docker is changed
|
||||
to permit arbitrary configuration via environment variables.
|
||||
This tool allows defining Forgejo's entire configuration via environment
|
||||
variables, mostly geared towards usage in Docker.
|
||||
|
||||
Gitea needs to use an ini file for configuration because the running
|
||||
environment that starts the docker may not be the same as that used
|
||||
by the hooks. An ini file also gives a good default and means that
|
||||
users do not have to completely provide a full environment.
|
||||
Forgejo needs to use an INI file for configuration because the running
|
||||
environment that starts the container may not be the same as the one used
|
||||
by the hooks. An INI file also gives a good default and means that
|
||||
users do not have to provide the entire set of environment variables.
|
||||
|
||||
With those caveats above, this command provides a generic way of
|
||||
converting suitably structured environment variables into any ini
|
||||
value.
|
||||
|
||||
To use the command is very simple just run it and the default gitea
|
||||
app.ini will be rewritten to take account of the variables provided,
|
||||
however there are various options to give slightly different
|
||||
behavior and these can be interrogated with the `-h` option.
|
||||
When run, `environment-to-ini` will write the config files based on the
|
||||
environment variables provided.
|
||||
Check with the `-h` flag for several options to alter this behaviour.
|
||||
|
||||
The environment variables should be of the form:
|
||||
Environment variables of the form "FORGEJO__SECTION_NAME__KEY_NAME"
|
||||
will be mapped to the ini section "[section_name]" and the key
|
||||
"KEY_NAME" with the value as provided.
|
||||
|
||||
GITEA__SECTION_NAME__KEY_NAME
|
||||
|
||||
Note, SECTION_NAME in the notation above is case-insensitive.
|
||||
Environment variables of the form "FORGEJO__SECTION_NAME__KEY_NAME__FILE"
|
||||
will be mapped to the ini section "[section_name]" and the key
|
||||
"KEY_NAME" with the value loaded from the specified file.
|
||||
|
||||
Environment variables are usually restricted to a reduced character
|
||||
set "0-9A-Z_" - in order to allow the setting of sections with
|
||||
characters outside of that set, they should be escaped as following:
|
||||
"_0X2E_" for "." and "_0X2D_" for "-". The entire section and key names
|
||||
can be escaped as a UTF8 byte string if necessary. E.g. to configure:
|
||||
"_0X2E_" for ".". The entire section and key names can be escaped as
|
||||
a UTF8 byte string if necessary. E.g. to configure:
|
||||
|
||||
"""
|
||||
...
|
||||
[log.console]
|
||||
COLORIZE=false
|
||||
STDERR=true
|
||||
...
|
||||
"""
|
||||
"""
|
||||
...
|
||||
[log.console]
|
||||
COLORIZE=false
|
||||
STDERR=true
|
||||
...
|
||||
"""
|
||||
|
||||
You would set the environment variables: "GITEA__LOG_0x2E_CONSOLE__COLORIZE=false"
|
||||
and "GITEA__LOG_0x2E_CONSOLE__STDERR=false". Other examples can be found
|
||||
You would set the environment variables: "FORGEJO__LOG_0x2E_CONSOLE__COLORIZE=false"
|
||||
and "FORGEJO__LOG_0x2E_CONSOLE__STDERR=false". Other examples can be found
|
||||
on the configuration cheat sheet.
|
||||
|
||||
To build locally, run:
|
||||
|
|
10
go.mod
10
go.mod
|
@ -48,7 +48,7 @@ require (
|
|||
github.com/go-git/go-git/v5 v5.13.2
|
||||
github.com/go-ldap/ldap/v3 v3.4.6
|
||||
github.com/go-openapi/spec v0.21.0
|
||||
github.com/go-sql-driver/mysql v1.9.2
|
||||
github.com/go-sql-driver/mysql v1.9.3
|
||||
github.com/go-webauthn/webauthn v0.13.0
|
||||
github.com/gobwas/glob v0.2.3
|
||||
github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f
|
||||
|
@ -76,7 +76,7 @@ require (
|
|||
github.com/meilisearch/meilisearch-go v0.31.0
|
||||
github.com/mholt/archiver/v3 v3.5.1
|
||||
github.com/microcosm-cc/bluemonday v1.0.27
|
||||
github.com/minio/minio-go/v7 v7.0.91
|
||||
github.com/minio/minio-go/v7 v7.0.93
|
||||
github.com/msteinert/pam/v2 v2.1.0
|
||||
github.com/nektos/act v0.2.52
|
||||
github.com/niklasfasching/go-org v1.8.0
|
||||
|
@ -92,7 +92,6 @@ require (
|
|||
github.com/stretchr/testify v1.10.0
|
||||
github.com/syndtr/goleveldb v1.0.0
|
||||
github.com/ulikunitz/xz v0.5.12
|
||||
github.com/urfave/cli/v2 v2.27.6
|
||||
github.com/urfave/cli/v3 v3.3.3
|
||||
github.com/valyala/fastjson v1.6.4
|
||||
github.com/yohcop/openid-go v1.0.1
|
||||
|
@ -152,7 +151,6 @@ require (
|
|||
github.com/cention-sany/utf7 v0.0.0-20170124080048-26cad61bd60a // indirect
|
||||
github.com/cespare/xxhash/v2 v2.3.0 // indirect
|
||||
github.com/cloudflare/circl v1.6.1 // indirect
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.5 // 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
|
||||
|
@ -209,6 +207,7 @@ require (
|
|||
github.com/nwaples/rardecode v1.1.3 // indirect
|
||||
github.com/olekukonko/tablewriter v0.0.5 // indirect
|
||||
github.com/onsi/ginkgo v1.16.5 // indirect
|
||||
github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c // indirect
|
||||
github.com/pierrec/lz4/v4 v4.1.21 // indirect
|
||||
github.com/pjbgf/sha1cd v0.3.2 // indirect
|
||||
github.com/pkg/errors v0.9.1 // indirect
|
||||
|
@ -220,14 +219,13 @@ require (
|
|||
github.com/rivo/uniseg v0.4.7 // indirect
|
||||
github.com/rogpeppe/go-internal v1.13.1 // indirect
|
||||
github.com/rs/xid v1.6.0 // indirect
|
||||
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
||||
github.com/sirupsen/logrus v1.9.3 // indirect
|
||||
github.com/skeema/knownhosts v1.3.0 // indirect
|
||||
github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf // indirect
|
||||
github.com/tinylib/msgp v1.3.0 // indirect
|
||||
github.com/x448/float16 v0.8.4 // indirect
|
||||
github.com/xanzy/ssh-agent v0.3.3 // indirect
|
||||
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect
|
||||
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect
|
||||
github.com/zeebo/assert v1.3.0 // indirect
|
||||
github.com/zeebo/blake3 v0.2.4 // indirect
|
||||
go.etcd.io/bbolt v1.4.0 // indirect
|
||||
|
|
20
go.sum
20
go.sum
|
@ -152,8 +152,6 @@ github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObk
|
|||
github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8=
|
||||
github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0=
|
||||
github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs=
|
||||
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.3.6 h1:4d9N5ykBnSp5Xn2JkhocYDkOpURL/18CYMpo6xB9uWM=
|
||||
github.com/cyphar/filepath-securejoin v0.3.6/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI=
|
||||
|
@ -247,8 +245,8 @@ github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9Z
|
|||
github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk=
|
||||
github.com/go-openapi/swag v0.23.1 h1:lpsStH0n2ittzTnbaSloVZLuB5+fvSY/+hnagBjSNZU=
|
||||
github.com/go-openapi/swag v0.23.1/go.mod h1:STZs8TbRvEQQKUA+JZNAm3EWlgaOBGpyFDqQnDHMef0=
|
||||
github.com/go-sql-driver/mysql v1.9.2 h1:4cNKDYQ1I84SXslGddlsrMhc8k4LeDVj6Ad6WRjiHuU=
|
||||
github.com/go-sql-driver/mysql v1.9.2/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
|
||||
github.com/go-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo=
|
||||
github.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
|
||||
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
|
||||
github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U=
|
||||
github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE=
|
||||
|
@ -413,8 +411,8 @@ github.com/minio/crc64nvme v1.0.1 h1:DHQPrYPdqK7jQG/Ls5CTBZWeex/2FMS3G5XGkycuFrY
|
|||
github.com/minio/crc64nvme v1.0.1/go.mod h1:eVfm2fAzLlxMdUGc0EEBGSMmPwmXD5XiNRpnu9J3bvg=
|
||||
github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34=
|
||||
github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM=
|
||||
github.com/minio/minio-go/v7 v7.0.91 h1:tWLZnEfo3OZl5PoXQwcwTAPNNrjyWwOh6cbZitW5JQc=
|
||||
github.com/minio/minio-go/v7 v7.0.91/go.mod h1:uvMUcGrpgeSAAI6+sD3818508nUyMULw94j2Nxku/Go=
|
||||
github.com/minio/minio-go/v7 v7.0.93 h1:lAB4QJp8Nq3vDMOU0eKgMuyBiEGMNlXQ5Glc8qAxqSU=
|
||||
github.com/minio/minio-go/v7 v7.0.93/go.mod h1:71t2CqDt3ThzESgZUlU1rBN54mksGGlkLcFgguDnnAc=
|
||||
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
|
||||
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
|
@ -457,6 +455,8 @@ github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3I
|
|||
github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040=
|
||||
github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M=
|
||||
github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde/go.mod h1:nZgzbfBr3hhjoZnS66nKrHmduYNpc34ny7RK4z5/HM0=
|
||||
github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c h1:dAMKvw0MlJT1GshSTtih8C2gDs04w8dReiOGXrGLNoY=
|
||||
github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM=
|
||||
github.com/pierrec/lz4/v4 v4.1.2/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
|
||||
github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ=
|
||||
github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
|
||||
|
@ -495,8 +495,6 @@ github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR
|
|||
github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
|
||||
github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU=
|
||||
github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0=
|
||||
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
|
||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||
github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 h1:KRzFb2m7YtdldCEkzs6KqmJw4nqEVZGK7IN2kJkjTuQ=
|
||||
github.com/santhosh-tekuri/jsonschema/v6 v6.0.2/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU=
|
||||
github.com/serenize/snaker v0.0.0-20171204205717-a683aaf2d516/go.mod h1:Yow6lPLSAXx2ifx470yD/nUe22Dv5vBvxK/UK9UUTVs=
|
||||
|
@ -525,12 +523,12 @@ github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOf
|
|||
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||
github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE=
|
||||
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
|
||||
github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww=
|
||||
github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0=
|
||||
github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
|
||||
github.com/ulikunitz/xz v0.5.9/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
|
||||
github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc=
|
||||
github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
|
||||
github.com/urfave/cli/v2 v2.27.6 h1:VdRdS98FNhKZ8/Az8B7MTyGQmpIr36O1EHybx/LaZ4g=
|
||||
github.com/urfave/cli/v2 v2.27.6/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ=
|
||||
github.com/urfave/cli/v3 v3.3.3 h1:byCBaVdIXuLPIDm5CYZRVG6NvT7tv1ECqdU4YzlEa3I=
|
||||
github.com/urfave/cli/v3 v3.3.3/go.mod h1:FJSKtM/9AiiTOJL4fJ6TbMUkxBXn7GO9guZqoZtpYpo=
|
||||
github.com/valyala/fastjson v1.6.4 h1:uAUNq9Z6ymTgGhcm0UynUAB6tlbakBrz6CQFax3BXVQ=
|
||||
|
@ -541,8 +539,6 @@ github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM
|
|||
github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw=
|
||||
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo=
|
||||
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos=
|
||||
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4=
|
||||
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM=
|
||||
github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU=
|
||||
github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E=
|
||||
github.com/yohcop/openid-go v1.0.1 h1:DPRd3iPO5F6O5zX2e62XpVAbPT6wV51cuucH0z9g3js=
|
||||
|
|
2
main.go
2
main.go
|
@ -21,7 +21,7 @@ import (
|
|||
_ "forgejo.org/modules/markup/markdown"
|
||||
_ "forgejo.org/modules/markup/orgmode"
|
||||
|
||||
"github.com/urfave/cli/v2"
|
||||
"github.com/urfave/cli/v3"
|
||||
)
|
||||
|
||||
// these flags will be set by the build flags
|
||||
|
|
|
@ -467,11 +467,8 @@ func GetFeeds(ctx context.Context, opts GetFeedsOptions) (ActionList, int64, err
|
|||
return nil, 0, err
|
||||
}
|
||||
|
||||
sess := db.GetEngine(ctx).Where(cond).
|
||||
Select("`action`.*"). // this line will avoid select other joined table's columns
|
||||
Join("INNER", "repository", "`repository`.id = `action`.repo_id")
|
||||
|
||||
opts.SetDefaultValues()
|
||||
sess := db.GetEngine(ctx).Where(cond)
|
||||
sess = db.SetSessionPagination(sess, &opts)
|
||||
|
||||
actions := make([]*Action, 0, opts.PageSize)
|
||||
|
|
|
@ -226,24 +226,6 @@ func TestNotifyWatchers(t *testing.T) {
|
|||
})
|
||||
}
|
||||
|
||||
func TestGetFeedsCorrupted(t *testing.T) {
|
||||
require.NoError(t, unittest.PrepareTestDatabase())
|
||||
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
|
||||
unittest.AssertExistsAndLoadBean(t, &activities_model.Action{
|
||||
ID: 8,
|
||||
RepoID: 1700,
|
||||
})
|
||||
|
||||
actions, count, err := activities_model.GetFeeds(db.DefaultContext, activities_model.GetFeedsOptions{
|
||||
RequestedUser: user,
|
||||
Actor: user,
|
||||
IncludePrivate: true,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
assert.Empty(t, actions)
|
||||
assert.Equal(t, int64(0), count)
|
||||
}
|
||||
|
||||
func TestConsistencyUpdateAction(t *testing.T) {
|
||||
if !setting.Database.Type.IsSQLite3() {
|
||||
t.Skip("Test is only for SQLite database.")
|
||||
|
|
|
@ -59,14 +59,6 @@
|
|||
created_unix: 1603011540 # grouped with id:7
|
||||
|
||||
- id: 8
|
||||
user_id: 1
|
||||
op_type: 12 # close issue
|
||||
act_user_id: 1
|
||||
repo_id: 1700 # dangling intentional
|
||||
is_private: false
|
||||
created_unix: 1603011541
|
||||
|
||||
- id: 9
|
||||
user_id: 34
|
||||
op_type: 12 # close issue
|
||||
act_user_id: 34
|
||||
|
|
|
@ -179,25 +179,6 @@ func (status *CommitStatus) LocaleString(lang translation.Locale) string {
|
|||
return lang.TrString("repo.commitstatus." + status.State.String())
|
||||
}
|
||||
|
||||
// HideActionsURL set `TargetURL` to an empty string if the status comes from Gitea Actions
|
||||
func (status *CommitStatus) HideActionsURL(ctx context.Context) {
|
||||
if status.RepoID == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
if status.Repo == nil {
|
||||
if err := status.loadRepository(ctx); err != nil {
|
||||
log.Error("loadRepository: %v", err)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
prefix := fmt.Sprintf("%s/actions", status.Repo.Link())
|
||||
if strings.HasPrefix(status.TargetURL, prefix) {
|
||||
status.TargetURL = ""
|
||||
}
|
||||
}
|
||||
|
||||
// CalcCommitStatus returns commit status state via some status, the commit statues should order by id desc
|
||||
func CalcCommitStatus(statuses []*CommitStatus) *CommitStatus {
|
||||
if len(statuses) == 0 {
|
||||
|
@ -453,11 +434,19 @@ type SignCommitWithStatuses struct {
|
|||
*asymkey_model.SignCommit
|
||||
}
|
||||
|
||||
// ParseCommitsWithStatus checks commits latest statuses and calculates its worst status state
|
||||
func ParseCommitsWithStatus(ctx context.Context, oldCommits []*asymkey_model.SignCommit, repo *repo_model.Repository) []*SignCommitWithStatuses {
|
||||
newCommits := make([]*SignCommitWithStatuses, 0, len(oldCommits))
|
||||
// ParseCommitsWithStatus converts git commits into SignCommitWithStatuses (checks signature and calculates its worst status state)
|
||||
func ParseCommitsWithStatus(ctx context.Context, commits []*git.Commit, repo *repo_model.Repository) []*SignCommitWithStatuses {
|
||||
commitsWithSignature := asymkey_model.ParseCommitsWithSignature(
|
||||
ctx,
|
||||
user_model.ValidateCommitsWithEmails(ctx, commits),
|
||||
repo.GetTrustModel(),
|
||||
func(user *user_model.User) (bool, error) {
|
||||
return repo_model.IsOwnerMemberCollaborator(ctx, repo, user.ID)
|
||||
},
|
||||
)
|
||||
|
||||
for _, c := range oldCommits {
|
||||
commitsWithStatus := make([]*SignCommitWithStatuses, 0, len(commitsWithSignature))
|
||||
for _, c := range commitsWithSignature {
|
||||
commit := &SignCommitWithStatuses{
|
||||
SignCommit: c,
|
||||
}
|
||||
|
@ -469,43 +458,12 @@ func ParseCommitsWithStatus(ctx context.Context, oldCommits []*asymkey_model.Sig
|
|||
commit.Status = CalcCommitStatus(statuses)
|
||||
}
|
||||
|
||||
newCommits = append(newCommits, commit)
|
||||
commitsWithStatus = append(commitsWithStatus, commit)
|
||||
}
|
||||
return newCommits
|
||||
return commitsWithStatus
|
||||
}
|
||||
|
||||
// hashCommitStatusContext hash context
|
||||
func hashCommitStatusContext(context string) string {
|
||||
return fmt.Sprintf("%x", sha1.Sum([]byte(context)))
|
||||
}
|
||||
|
||||
// ConvertFromGitCommit converts git commits into SignCommitWithStatuses
|
||||
func ConvertFromGitCommit(ctx context.Context, commits []*git.Commit, repo *repo_model.Repository) []*SignCommitWithStatuses {
|
||||
return ParseCommitsWithStatus(ctx,
|
||||
asymkey_model.ParseCommitsWithSignature(
|
||||
ctx,
|
||||
user_model.ValidateCommitsWithEmails(ctx, commits),
|
||||
repo.GetTrustModel(),
|
||||
func(user *user_model.User) (bool, error) {
|
||||
return repo_model.IsOwnerMemberCollaborator(ctx, repo, user.ID)
|
||||
},
|
||||
),
|
||||
repo,
|
||||
)
|
||||
}
|
||||
|
||||
// CommitStatusesHideActionsURL hide Gitea Actions urls
|
||||
func CommitStatusesHideActionsURL(ctx context.Context, statuses []*CommitStatus) {
|
||||
idToRepos := make(map[int64]*repo_model.Repository)
|
||||
for _, status := range statuses {
|
||||
if status == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
if status.Repo == nil {
|
||||
status.Repo = idToRepos[status.RepoID]
|
||||
}
|
||||
status.HideActionsURL(ctx)
|
||||
idToRepos[status.RepoID] = status.Repo
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,11 +4,9 @@
|
|||
package git_test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
actions_model "forgejo.org/models/actions"
|
||||
"forgejo.org/models/db"
|
||||
git_model "forgejo.org/models/git"
|
||||
repo_model "forgejo.org/models/repo"
|
||||
|
@ -246,26 +244,3 @@ func TestFindRepoRecentCommitStatusContexts(t *testing.T) {
|
|||
assert.Equal(t, "compliance/lint-backend", contexts[0])
|
||||
}
|
||||
}
|
||||
|
||||
func TestCommitStatusesHideActionsURL(t *testing.T) {
|
||||
require.NoError(t, unittest.PrepareTestDatabase())
|
||||
|
||||
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 4})
|
||||
run := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{ID: 791, RepoID: repo.ID})
|
||||
require.NoError(t, run.LoadAttributes(db.DefaultContext))
|
||||
|
||||
statuses := []*git_model.CommitStatus{
|
||||
{
|
||||
RepoID: repo.ID,
|
||||
TargetURL: fmt.Sprintf("%s/jobs/%d", run.Link(), run.Index),
|
||||
},
|
||||
{
|
||||
RepoID: repo.ID,
|
||||
TargetURL: "https://mycicd.org/1",
|
||||
},
|
||||
}
|
||||
|
||||
git_model.CommitStatusesHideActionsURL(db.DefaultContext, statuses)
|
||||
assert.Empty(t, statuses[0].TargetURL)
|
||||
assert.Equal(t, "https://mycicd.org/1", statuses[1].TargetURL)
|
||||
}
|
||||
|
|
|
@ -802,7 +802,7 @@ func (c *Comment) LoadPushCommits(ctx context.Context) (err error) {
|
|||
}
|
||||
defer closer.Close()
|
||||
|
||||
c.Commits = git_model.ConvertFromGitCommit(ctx, gitRepo.GetCommitsFromIDs(data.CommitIDs), c.Issue.Repo)
|
||||
c.Commits = git_model.ParseCommitsWithStatus(ctx, gitRepo.GetCommitsFromIDs(data.CommitIDs), c.Issue.Repo)
|
||||
c.CommitsNum = int64(len(c.Commits))
|
||||
}
|
||||
|
||||
|
|
|
@ -38,6 +38,7 @@ var (
|
|||
InvertedGitFlushEnv bool // 2.43.1
|
||||
SupportCheckAttrOnBare bool // >= 2.40
|
||||
SupportGitMergeTree bool // >= 2.38
|
||||
SupportGrepMaxCount bool // >= 2.38
|
||||
|
||||
HasSSHExecutable bool
|
||||
|
||||
|
@ -191,6 +192,7 @@ func InitFull(ctx context.Context) (err error) {
|
|||
|
||||
InvertedGitFlushEnv = CheckGitVersionEqual("2.43.1") == nil
|
||||
SupportGitMergeTree = CheckGitVersionAtLeast("2.38") == nil
|
||||
SupportGrepMaxCount = CheckGitVersionAtLeast("2.38") == nil
|
||||
|
||||
if setting.LFS.StartServer {
|
||||
if CheckGitVersionAtLeast("2.1.2") != nil {
|
||||
|
|
|
@ -98,8 +98,7 @@ func GrepSearch(ctx context.Context, repo *Repository, search string, opts GrepO
|
|||
|
||||
cmd.AddOptionValues("--context", fmt.Sprint(opts.ContextLineNumber))
|
||||
|
||||
// --max-count requires at least git 2.38
|
||||
if CheckGitVersionAtLeast("2.38.0") == nil {
|
||||
if SupportGrepMaxCount {
|
||||
cmd.AddOptionValues("--max-count", fmt.Sprint(opts.MatchesPerFile))
|
||||
} else {
|
||||
log.Warn("git-grep: --max-count requires at least git 2.38")
|
||||
|
|
|
@ -59,48 +59,55 @@ func TestGrepSearch(t *testing.T) {
|
|||
},
|
||||
}, res)
|
||||
|
||||
res, err = GrepSearch(t.Context(), repo, "world", GrepOptions{MatchesPerFile: 1})
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, []*GrepResult{
|
||||
{
|
||||
Filename: "i-am-a-python.p",
|
||||
LineNumbers: []int{1},
|
||||
LineCodes: []string{"## This is a simple file to do a hello world"},
|
||||
HighlightedRanges: [][3]int{{0, 39, 44}},
|
||||
},
|
||||
{
|
||||
Filename: "java-hello/main.java",
|
||||
LineNumbers: []int{1},
|
||||
LineCodes: []string{"public class HelloWorld"},
|
||||
HighlightedRanges: [][3]int{{0, 18, 23}},
|
||||
},
|
||||
{
|
||||
Filename: "main.vendor.java",
|
||||
LineNumbers: []int{1},
|
||||
LineCodes: []string{"public class HelloWorld"},
|
||||
HighlightedRanges: [][3]int{{0, 18, 23}},
|
||||
},
|
||||
{
|
||||
Filename: "python-hello/hello.py",
|
||||
LineNumbers: []int{1},
|
||||
LineCodes: []string{"## This is a simple file to do a hello world"},
|
||||
HighlightedRanges: [][3]int{{0, 39, 44}},
|
||||
},
|
||||
}, res)
|
||||
t.Run("Max count", func(t *testing.T) {
|
||||
if !SupportGrepMaxCount {
|
||||
t.Skip("Skipping, git grep --max-count is not supported")
|
||||
return
|
||||
}
|
||||
|
||||
res, err = GrepSearch(t.Context(), repo, "world", GrepOptions{
|
||||
MatchesPerFile: 1,
|
||||
Filename: "java-hello/",
|
||||
res, err = GrepSearch(t.Context(), repo, "world", GrepOptions{MatchesPerFile: 1})
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, []*GrepResult{
|
||||
{
|
||||
Filename: "i-am-a-python.p",
|
||||
LineNumbers: []int{1},
|
||||
LineCodes: []string{"## This is a simple file to do a hello world"},
|
||||
HighlightedRanges: [][3]int{{0, 39, 44}},
|
||||
},
|
||||
{
|
||||
Filename: "java-hello/main.java",
|
||||
LineNumbers: []int{1},
|
||||
LineCodes: []string{"public class HelloWorld"},
|
||||
HighlightedRanges: [][3]int{{0, 18, 23}},
|
||||
},
|
||||
{
|
||||
Filename: "main.vendor.java",
|
||||
LineNumbers: []int{1},
|
||||
LineCodes: []string{"public class HelloWorld"},
|
||||
HighlightedRanges: [][3]int{{0, 18, 23}},
|
||||
},
|
||||
{
|
||||
Filename: "python-hello/hello.py",
|
||||
LineNumbers: []int{1},
|
||||
LineCodes: []string{"## This is a simple file to do a hello world"},
|
||||
HighlightedRanges: [][3]int{{0, 39, 44}},
|
||||
},
|
||||
}, res)
|
||||
|
||||
res, err = GrepSearch(t.Context(), repo, "world", GrepOptions{
|
||||
MatchesPerFile: 1,
|
||||
Filename: "java-hello/",
|
||||
})
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, []*GrepResult{
|
||||
{
|
||||
Filename: "java-hello/main.java",
|
||||
LineNumbers: []int{1},
|
||||
LineCodes: []string{"public class HelloWorld"},
|
||||
HighlightedRanges: [][3]int{{0, 18, 23}},
|
||||
},
|
||||
}, res)
|
||||
})
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, []*GrepResult{
|
||||
{
|
||||
Filename: "java-hello/main.java",
|
||||
LineNumbers: []int{1},
|
||||
LineCodes: []string{"public class HelloWorld"},
|
||||
HighlightedRanges: [][3]int{{0, 18, 23}},
|
||||
},
|
||||
}, res)
|
||||
|
||||
res, err = GrepSearch(t.Context(), repo, "no-such-content", GrepOptions{})
|
||||
require.NoError(t, err)
|
||||
|
|
|
@ -251,10 +251,14 @@ func TestGitAttributeCheckerError(t *testing.T) {
|
|||
cancel()
|
||||
|
||||
ac, err := gitRepo.GitAttributeChecker("8fee858da5796dfb37704761701bb8e800ad9ef3", "linguist-language")
|
||||
require.NoError(t, err)
|
||||
if SupportCheckAttrOnBare {
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = ac.CheckPath("i-am-a-python.p")
|
||||
require.Error(t, err)
|
||||
_, err = ac.CheckPath("i-am-a-python.p")
|
||||
require.Error(t, err)
|
||||
} else {
|
||||
require.Error(t, err)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("Cancelled/DuringRun", func(t *testing.T) {
|
||||
|
|
|
@ -16,16 +16,10 @@ import (
|
|||
)
|
||||
|
||||
func TestElasticsearchIndexer(t *testing.T) {
|
||||
// The elasticsearch instance started by testing.yml > test-unit > services > elasticsearch
|
||||
url := "http://elastic:changeme@elasticsearch:9200"
|
||||
|
||||
if os.Getenv("CI") == "" {
|
||||
// Make it possible to run tests against a local elasticsearch instance
|
||||
url = os.Getenv("TEST_ELASTICSEARCH_URL")
|
||||
if url == "" {
|
||||
t.Skip("TEST_ELASTICSEARCH_URL not set and not running in CI")
|
||||
return
|
||||
}
|
||||
url := os.Getenv("TEST_ELASTICSEARCH_URL")
|
||||
if url == "" {
|
||||
t.Skip("TEST_ELASTICSEARCH_URL not set")
|
||||
return
|
||||
}
|
||||
|
||||
require.Eventually(t, func() bool {
|
||||
|
|
|
@ -69,6 +69,10 @@ var (
|
|||
// https://html.spec.whatwg.org/multipage/input.html#e-mail-state-(type%3Demail)
|
||||
emailRegex = regexp.MustCompile("(?:\\s|^|\\(|\\[)([a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9]{2,}(?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+)(?:\\s|$|\\)|\\]|;|,|\\?|!|\\.(\\s|$))")
|
||||
|
||||
// Fediverse handle regex (same as emailRegex but with additonal @ or !
|
||||
// at start)
|
||||
fediRegex = regexp.MustCompile("(?:\\s|^|\\(|\\[)([@!]([a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+)@([a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9]{2,}(?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+))(?:\\s|$|\\)|\\]|;|,|\\?|!|\\.(\\s|$))")
|
||||
|
||||
// blackfriday extensions create IDs like fn:user-content-footnote
|
||||
blackfridayExtRegex = regexp.MustCompile(`[^:]*:user-content-`)
|
||||
|
||||
|
@ -153,6 +157,7 @@ var defaultProcessors = []processor{
|
|||
issueIndexPatternProcessor,
|
||||
commitCrossReferencePatternProcessor,
|
||||
hashCurrentPatternProcessor,
|
||||
fediAddressProcessor,
|
||||
emailAddressProcessor,
|
||||
emojiProcessor,
|
||||
emojiShortCodeProcessor,
|
||||
|
@ -1237,6 +1242,21 @@ func hashCurrentPatternProcessor(ctx *RenderContext, node *html.Node) {
|
|||
}
|
||||
}
|
||||
|
||||
// fediAddressProcessor replaces raw fediverse handles with toolforge links
|
||||
func fediAddressProcessor(ctx *RenderContext, node *html.Node) {
|
||||
next := node.NextSibling
|
||||
for node != nil && node != next {
|
||||
m := fediRegex.FindStringSubmatchIndex(node.Data)
|
||||
if m == nil {
|
||||
return
|
||||
}
|
||||
|
||||
fedihandle := node.Data[m[2]:m[3]]
|
||||
replaceContent(node, m[2], m[3], createLink("https://fedirect.toolforge.org/?id="+url.QueryEscape(fedihandle), fedihandle, "fedihandle"))
|
||||
node = node.NextSibling.NextSibling
|
||||
}
|
||||
}
|
||||
|
||||
// emailAddressProcessor replaces raw email addresses with a mailto: link.
|
||||
func emailAddressProcessor(ctx *RenderContext, node *html.Node) {
|
||||
next := node.NextSibling
|
||||
|
|
|
@ -307,6 +307,19 @@ func TestRender_email(t *testing.T) {
|
|||
test(
|
||||
"email@domain..com",
|
||||
`<p>email@domain..com</p>`)
|
||||
|
||||
// Test fediverse handle
|
||||
test(
|
||||
"@forgejo@floss.social",
|
||||
`<p><a href="https://fedirect.toolforge.org/?id=%40forgejo%40floss.social" rel="nofollow">@forgejo@floss.social</a></p>`)
|
||||
|
||||
test(
|
||||
"!forgejo@programming.dev",
|
||||
`<p><a href="https://fedirect.toolforge.org/?id=%21forgejo%40programming.dev" rel="nofollow">!forgejo@programming.dev</a></p>`)
|
||||
|
||||
test(
|
||||
"@#&@forgejo.org",
|
||||
`<p><a href="https://fedirect.toolforge.org/?id=%40%23%26%40forgejo.org" rel="nofollow">@#&@forgejo.org</a></p>`)
|
||||
}
|
||||
|
||||
func TestRender_emoji(t *testing.T) {
|
||||
|
|
|
@ -18,13 +18,14 @@ import (
|
|||
)
|
||||
|
||||
func TestMinioStorageIterator(t *testing.T) {
|
||||
if os.Getenv("CI") == "" {
|
||||
t.Skip("minioStorage not present outside of CI")
|
||||
endpoint := os.Getenv("TEST_MINIO_ENDPOINT")
|
||||
if endpoint == "" {
|
||||
t.Skip("TEST_MINIO_ENDPOINT not set")
|
||||
return
|
||||
}
|
||||
testStorageIterator(t, setting.MinioStorageType, &setting.Storage{
|
||||
MinioConfig: setting.MinioStorageConfig{
|
||||
Endpoint: "minio:9000",
|
||||
Endpoint: endpoint,
|
||||
AccessKeyID: "123456",
|
||||
SecretAccessKey: "12345678",
|
||||
Bucket: "gitea",
|
||||
|
@ -34,13 +35,14 @@ func TestMinioStorageIterator(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestVirtualHostMinioStorage(t *testing.T) {
|
||||
if os.Getenv("CI") == "" {
|
||||
t.Skip("minioStorage not present outside of CI")
|
||||
endpoint := os.Getenv("TEST_MINIO_ENDPOINT")
|
||||
if endpoint == "" {
|
||||
t.Skip("TEST_MINIO_ENDPOINT not set")
|
||||
return
|
||||
}
|
||||
testStorageIterator(t, setting.MinioStorageType, &setting.Storage{
|
||||
MinioConfig: setting.MinioStorageConfig{
|
||||
Endpoint: "minio:9000",
|
||||
Endpoint: endpoint,
|
||||
AccessKeyID: "123456",
|
||||
SecretAccessKey: "12345678",
|
||||
Bucket: "gitea",
|
||||
|
@ -85,13 +87,14 @@ func TestMinioStoragePath(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestS3StorageBadRequest(t *testing.T) {
|
||||
if os.Getenv("CI") == "" {
|
||||
t.Skip("S3Storage not present outside of CI")
|
||||
endpoint := os.Getenv("TEST_MINIO_ENDPOINT")
|
||||
if endpoint == "" {
|
||||
t.Skip("TEST_MINIO_ENDPOINT not set")
|
||||
return
|
||||
}
|
||||
cfg := &setting.Storage{
|
||||
MinioConfig: setting.MinioStorageConfig{
|
||||
Endpoint: "minio:9000",
|
||||
Endpoint: endpoint,
|
||||
AccessKeyID: "123456",
|
||||
SecretAccessKey: "12345678",
|
||||
Bucket: "bucket",
|
||||
|
|
|
@ -3,8 +3,8 @@
|
|||
|
||||
package structs
|
||||
|
||||
// GitBlobResponse represents a git blob
|
||||
type GitBlobResponse struct {
|
||||
// GitBlob represents a git blob
|
||||
type GitBlob struct {
|
||||
Content string `json:"content"`
|
||||
Encoding string `json:"encoding"`
|
||||
URL string `json:"url"`
|
||||
|
|
|
@ -11,7 +11,7 @@ copy_content = Копиране на съдържанието
|
|||
user_profile_and_more = Профил и настройки…
|
||||
view = Преглед
|
||||
your_settings = Настройки
|
||||
mirrors = Огледала
|
||||
mirrors = Огледални
|
||||
explore = Разглеждане
|
||||
write = Писане
|
||||
twofa = Двуфакторно удостоверяване
|
||||
|
@ -36,7 +36,7 @@ dashboard = Табло
|
|||
logo = Лого
|
||||
toc = Съдържание
|
||||
copy_url = Копиране на URL
|
||||
new_mirror = Ново огледало
|
||||
new_mirror = Ново огледално
|
||||
re_type = Потвърдете паролата
|
||||
copy = Копиране
|
||||
enabled = Включено
|
||||
|
@ -61,7 +61,7 @@ ok = Добре
|
|||
manage_org = Управление на организациите
|
||||
new_repo = Ново хранилище
|
||||
register = Регистрация
|
||||
mirror = Огледало
|
||||
mirror = Огледално
|
||||
username = Потребителско име
|
||||
password = Парола
|
||||
template = Шаблон
|
||||
|
@ -69,7 +69,7 @@ signed_in_as = Влезли сте като
|
|||
sign_up = Регистриране
|
||||
enable_javascript = Този сайт изисква JavaScript.
|
||||
home = Начало
|
||||
email = Адрес на ел. поща
|
||||
email = Адрес за ел. поща
|
||||
issues = Задачи
|
||||
retry = Повторен опит
|
||||
remove = Премахване
|
||||
|
@ -93,8 +93,8 @@ filter.not_fork = Не разклонения
|
|||
filter.is_template = Шаблони
|
||||
filter.not_template = Не шаблони
|
||||
filter.private = Частни
|
||||
filter.is_mirror = Огледала
|
||||
filter.not_mirror = Не огледала
|
||||
filter.is_mirror = Огледални
|
||||
filter.not_mirror = Не огледални
|
||||
copy_hash = Копиране на контролната сума
|
||||
artifacts = Артефакти
|
||||
show_log_seconds = Показване на секундите
|
||||
|
@ -102,7 +102,7 @@ remove_all = Премахване на всичко
|
|||
test = Проба
|
||||
remove_label_str = Премахване на елемента „%s“
|
||||
copy_branch = Копиране на името на клона
|
||||
error404 = Страницата, която се опитвате да отворите, или <strong>не съществува</strong> или <strong>не сте упълномощени</strong> да я видите.
|
||||
error404 = Страницата, която се опитвате да отворите, или <strong>не съществува</strong>, или <strong>е премахната</strong>, или <strong>не сте упълномощени</strong> да я видите.
|
||||
new_repo.link = Ново хранилище
|
||||
new_migrate.title = Нова миграция
|
||||
new_repo.title = Ново хранилище
|
||||
|
@ -112,6 +112,35 @@ new_org.link = Нова организация
|
|||
copy_generic = Копиране в клипборда
|
||||
copy_error = Неуспешно копиране
|
||||
copy_path = Копиране на пътя
|
||||
toggle_menu = Превключване на менюто
|
||||
confirm_delete_artifact = Сигурни ли сте, че искате да изтриете артефакта „%s“?
|
||||
more_items = Още елементи
|
||||
twofa_scratch = Резервен код за двуфакторно удостоверяване
|
||||
webauthn_use_twofa = Използвайте двуфакторен код от телефона си
|
||||
webauthn_error_insecure = WebAuthn поддържа само сигурни връзки. За тестване през HTTP можете да използвате произход „localhost“ или „127.0.0.1“
|
||||
error413 = Изчерпали сте квотата си.
|
||||
go_back = Връщане
|
||||
invalid_data = Невалидни данни: %v
|
||||
archived = Архивирано
|
||||
concept_system_global = Глобално
|
||||
concept_user_individual = Индивидуално
|
||||
show_full_screen = Показване на цял екран
|
||||
show_timestamps = Показване на времеви отпечатъци
|
||||
rerun = Повторно изпълнение
|
||||
copy_type_unsupported = Този тип файл не може да бъде копиран
|
||||
webauthn_error_unknown = Възникна неизвестна грешка. Моля, опитайте отново.
|
||||
webauthn_error_unable_to_process = Сървърът не можа да обработи заявката ви.
|
||||
webauthn_error_empty = Трябва да зададете име за този ключ.
|
||||
webauthn_error_timeout = Времето за изчакване изтече преди ключът ви да бъде прочетен. Моля, презаредете страницата и опитайте отново.
|
||||
return_to_forgejo = Връщане към Forgejo
|
||||
unknown = Неизвестно
|
||||
confirm_delete_selected = Потвърждавате ли изтриването на всички избрани елементи?
|
||||
webauthn_insert_key = Поставете вашия ключ за сигурност
|
||||
webauthn_press_button = Моля, натиснете бутона на вашия ключ за сигурност…
|
||||
webauthn_sign_in = Натиснете бутона на вашия ключ за сигурност. Ако ключът ви за сигурност няма бутон, поставете го отново.
|
||||
webauthn_error = Неуспешно прочитане на вашия ключ за сигурност.
|
||||
webauthn_unsupported_browser = Вашият браузър в момента не поддържа WebAuthn.
|
||||
webauthn_error_duplicated = Ключът за сигурност не е разрешен за тази заявка. Моля, уверете се, че ключът не е вече регистриран.
|
||||
|
||||
[settings]
|
||||
ui = Тема
|
||||
|
@ -157,7 +186,7 @@ account = Акаунт
|
|||
update_avatar = Обновяване на профилната снимка
|
||||
ssh_gpg_keys = SSH / GPG ключове
|
||||
comment_type_group_milestone = Етап
|
||||
manage_emails = Управление на адресите на ел. поща
|
||||
manage_emails = Управление на адресите за ел. поща
|
||||
permission_read = Четене
|
||||
update_password = Обновяване на паролата
|
||||
biography_placeholder = Разкажете на другите малко за себе си! (Можете да използвате Маркдаун)
|
||||
|
@ -183,7 +212,7 @@ user_block_success = Потребителят е блокиран успешно
|
|||
update_profile_success = Профилът ви е обновен.
|
||||
update_user_avatar_success = Профилната снимка на потребителя е обновена.
|
||||
remove_oauth2_application_success = Приложението е изтрито.
|
||||
email_deletion_success = Адресът на ел. поща е премахнат.
|
||||
email_deletion_success = Адресът за ел. поща е премахнат.
|
||||
update_avatar_success = Профилната ви снимка е обновена.
|
||||
change_username = Потребителското ви име е променено.
|
||||
comment_type_group_assignee = Изпълнител
|
||||
|
@ -191,22 +220,22 @@ enable_custom_avatar = Използване на персонализирана
|
|||
requires_activation = Изисква активиране
|
||||
activated = Активиран
|
||||
primary = Основен
|
||||
email_deletion = Премахване на адреса на ел. поща
|
||||
add_new_email = Добавяне на нов адрес на ел. поща
|
||||
add_email = Добавяне на адрес на ел. поща
|
||||
email_deletion = Премахване на адреса за ел. поща
|
||||
add_new_email = Добавяне на нов адрес за ел. поща
|
||||
add_email = Добавяне на адрес за ел. поща
|
||||
key_content_gpg_placeholder = Започва с „-----BEGIN PGP PUBLIC KEY BLOCK-----“
|
||||
comment_type_group_title = Заглавие
|
||||
comment_type_group_label = Етикет
|
||||
change_username_prompt = Забележка: Промяната на потребителското ви име променя също URL на вашия акаунт.
|
||||
change_username_prompt = Бележка: Промяната на потребителското ви име променя също URL на вашия акаунт.
|
||||
update_language_not_found = Езикът „%s“ не е наличен.
|
||||
keep_activity_private_popup = Вашата дейност ще бъде видима само за вас и администраторите на сайта
|
||||
uploaded_avatar_not_a_image = Каченият файл не е изображение.
|
||||
uploaded_avatar_is_too_big = Размерът на качения файл (%d KiB) надвишава максималния размер (%d KiB).
|
||||
change_password_success = Паролата ви е обновена. Влизайте с новата си парола от сега нататък.
|
||||
change_password_success = Паролата ви е обновена. Отсега нататък използвайте новата си парола, за да влезете.
|
||||
manage_themes = Тема по подразбиране
|
||||
manage_openid = OpenID адреси
|
||||
primary_email = Да е основен
|
||||
keep_email_private = Скриване на адреса на ел. поща
|
||||
keep_email_private = Скриване на адреса за ел. поща
|
||||
theme_update_error = Избраната тема не съществува.
|
||||
theme_update_success = Темата ви е обновена.
|
||||
key_content_ssh_placeholder = Започва с „ssh-ed25519“, „ssh-rsa“, „ecdsa-sha2-nistp256“, „ecdsa-sha2-nistp384“, „ecdsa-sha2-nistp521“, „sk-ecdsa-sha2-nistp256@openssh.com“, или „sk-ssh-ed25519@openssh.com“
|
||||
|
@ -227,7 +256,7 @@ saved_successfully = Настройките бяха запазени успеш
|
|||
no_activity = Няма скорошна дейност
|
||||
theme_desc = Тази тема ще се използва за уеб интерфейса, когато сте влезли.
|
||||
keep_activity_private = Скриване на дейността от профилната страница
|
||||
lookup_avatar_by_mail = Търсене на профилна снимка по адреса на ел. поща
|
||||
lookup_avatar_by_mail = Търсене на профилна снимка по адреса за ел. поща
|
||||
password_incorrect = Текущата парола е неправилна.
|
||||
change_username_redirect_prompt = Старото потребителско име ще се пренасочва, докато някой не го вземе.
|
||||
principal_content = Съдържание
|
||||
|
@ -246,7 +275,7 @@ delete_prompt = Тази операция ще изтрие перманентн
|
|||
email_notifications.disable = Изключване на известията по ел. поща
|
||||
delete_account = Изтриване на акаунта ви
|
||||
confirm_delete_account = Потвърждаване на изтриването
|
||||
email_notifications.onmention = Ел. поща само при споменаване
|
||||
email_notifications.onmention = Ел. писмо само при споменаване
|
||||
pronouns_unspecified = Непосочени
|
||||
pronouns = Местоимения
|
||||
gpg_token_code = echo "%s" | gpg -a --default-key %s --detach-sig
|
||||
|
@ -254,8 +283,103 @@ language.title = Език по подразбиране
|
|||
language.localization_project = Помогнете ни да преведем Forgejo на вашия език! <a href="%s">Научете повече</a>.
|
||||
language.description = Този език ще бъде запазен във вашия акаунт и ще се използва като език по подразбиране, след като влезете.
|
||||
pronouns_custom = Персонализирани
|
||||
visibility.limited_tooltip = Видимо само за влезли потребители
|
||||
visibility.limited_tooltip = Видим само за влезли потребители
|
||||
pronouns_custom_label = Персонализирани местоимения
|
||||
comment_type_group_review_request = Искане за рецензия
|
||||
ssh_key_been_used = Този SSH ключ вече е добавен към сървъра.
|
||||
create_oauth2_application = Създаване на ново OAuth2 приложение
|
||||
update_oauth2_application_success = Успешно обновихте OAuth2 приложението.
|
||||
authorized_oauth2_applications = Упълномощени OAuth2 приложения
|
||||
manage_account_links = Свързани акаунти
|
||||
revoke_oauth2_grant = Отнемане на достъпа
|
||||
added_on = Добавен на %s
|
||||
comment_type_group_dependency = Зависимост
|
||||
update_hints_success = Подсказките са обновени.
|
||||
manage_oauth2_applications = Управление на OAuth2 приложения
|
||||
gpg_key_id_used = Вече съществува публичен GPG ключ със същото ID.
|
||||
oauth2_applications_desc = OAuth2 приложенията позволяват на вашето приложение от трета страна да удостоверява сигурно потребители в тази инстанция на Forgejo.
|
||||
blocked_since = Блокиран от %s
|
||||
hidden_comment_types.ref_tooltip = Коментари, в които тази задача е спомената от друга задача/подаване/…
|
||||
create_oauth2_application_success = Успешно създадохте ново OAuth2 приложение.
|
||||
quota.applies_to_org = Следните правила за квота се прилагат за тази организация
|
||||
keep_activity_private.description = Вашата <a href="%s">публична дейност</a> ще бъде видима само за вас и администраторите на инстанцията.
|
||||
ssh_helper = <strong>Нуждаете се от помощ?</strong> Разгледайте ръководството за <a href="%s">създаване на собствени SSH ключове</a> или за решаване на <a href="%s">често срещани проблеми</a>, които може да срещнете при използване на SSH.
|
||||
twofa_desc = За да защитите акаунта си от кражба на парола, можете да използвате смартфон или друго устройство за получаване на еднократни пароли, базирани на време („TOTP“).
|
||||
scan_this_image = Сканирайте това изображение с вашето приложение за удостоверяване:
|
||||
quota.rule.exceeded.helper = Общият размер на обектите за това правило надвиши квотата.
|
||||
password_change_disabled = Нелокални потребители не могат да обновяват паролата си през уеб интерфейса на Forgejo.
|
||||
twofa_disable_note = Можете да изключите двуфакторното удостоверяване, ако е необходимо.
|
||||
hooks.desc = Добавете уеб-куки, които ще се задействат за <strong>всички хранилища</strong>, които притежавате.
|
||||
delete_account_desc = Сигурни ли сте, че искате да изтриете перманентно този потребителски акаунт?
|
||||
last_used = Последно използван на
|
||||
revoke_oauth2_grant_description = Отнемането на достъпа за това приложение от трета страна ще му попречи да има достъп до вашите данни. Сигурни ли сте?
|
||||
password_username_disabled = Нелокални потребители не могат да променят потребителското си име. Моля, свържете се с администратора на сайта за повече подробности.
|
||||
change_username_redirect_prompt.with_cooldown.one = Старото потребителско име ще бъде достъпно за всички след период на изчакване от %[1]d ден. Все още можете да си върнете старото потребителско име по време на периода на изчакване.
|
||||
change_username_redirect_prompt.with_cooldown.few = Старото потребителско име ще бъде достъпно за всички след период на изчакване от %[1]d дни. Все още можете да си върнете старото потребителско име по време на периода на изчакване.
|
||||
generate_token_name_duplicate = <strong>%s</strong> вече е използвано като име на приложение. Моля, използвайте ново.
|
||||
quota.rule.exceeded = Надвишена
|
||||
repo_and_org_access = Достъп до хранилища и организации
|
||||
permissions_public_only = Само публични
|
||||
permissions_list = Разрешения:
|
||||
edit_oauth2_application = Редактиране на OAuth2 приложение
|
||||
remove_oauth2_application = Премахване на OAuth2 приложение
|
||||
twofa_recovery_tip = Ако загубите устройството си, ще можете да използвате ключ за еднократно възстановяване, за да си върнете достъпа до акаунта.
|
||||
visibility.private_tooltip = Видим само за членове на организации, в които участвате
|
||||
quota.applies_to_user = Следните правила за квота се прилагат за вашия акаунт
|
||||
quota.rule.no_limit = Неограничена
|
||||
hints = Подсказки
|
||||
comment_type_group_issue_ref = Препратка към задача
|
||||
activate_email = Изпращане на активация
|
||||
ssh_disabled = SSH е изключен
|
||||
twofa_disable_desc = Изключването на двуфакторното удостоверяване ще направи акаунта ви по-малко сигурен. Продължаване?
|
||||
keep_pronouns_private = Показване на местоименията само на удостоверени потребители
|
||||
keep_pronouns_private.description = Това ще скрие вашите местоимения от посетители, които не са влезли в системата.
|
||||
gpg_helper = <strong>Нуждаете се от помощ?</strong> Разгледайте ръководството <a href="%s">относно GPG</a>.
|
||||
valid_until_date = Валиден до %s
|
||||
ssh_externally_managed = Този SSH ключ се управлява външно за този потребител
|
||||
regenerate_scratch_token_desc = Ако сте загубили ключа си за възстановяване или вече сте го използвали, за да влезете, можете да го нулирате тук.
|
||||
create_oauth2_application_button = Създаване на приложение
|
||||
revoke_oauth2_grant_success = Достъпът е отнет успешно.
|
||||
comment_type_group_deadline = Краен срок
|
||||
comment_type_group_time_tracking = Проследяване на времето
|
||||
activations_pending = Чакащи активации
|
||||
valid_forever = Валиден завинаги
|
||||
key_state_desc = Този ключ е използван през последните 7 дни
|
||||
revoke_key = Отнемане
|
||||
delete_account_title = Изтриване на потребителския акаунт
|
||||
update_hints = Обновяване на подсказките
|
||||
permissions_access_all = Всички (публични, частни и ограничени)
|
||||
oauth2_application_name = Име на приложението
|
||||
visibility.public_tooltip = Видим за всички
|
||||
user_block_yourself = Не можете да блокирате себе си.
|
||||
hidden_comment_types.issue_ref_tooltip = Коментари, в които потребителят променя клона/маркера, свързан със задачата
|
||||
comment_type_group_reference = Препратка
|
||||
comment_type_group_branch = Клон
|
||||
comment_type_group_pull_request_push = Добавени подавания
|
||||
quota = Квота
|
||||
webauthn_delete_key = Премахване на ключ за сигурност
|
||||
webauthn_register_key = Добавяне на ключ за сигурност
|
||||
webauthn_nickname = Прякор
|
||||
webauthn_delete_key_desc = Ако премахнете ключ за сигурност, вече няма да можете да влизате с него. Продължаване?
|
||||
additional_repo_units_hint = Предлагане за включване на допълнителни елементи на хранилището
|
||||
twofa_is_enrolled = Вашият акаунт в момента е <strong>включен</strong> в двуфакторно удостоверяване.
|
||||
twofa_not_enrolled = Вашият акаунт в момента не е включен в двуфакторно удостоверяване.
|
||||
webauthn_key_loss_warning = Ако загубите ключовете си за сигурност, ще загубите достъп до акаунта си.
|
||||
email_desc = Вашият основен адрес за ел. поща ще се използва за известия, възстановяване на парола и, при условие че не е скрит, за уеб-базирани Git операции.
|
||||
email_preference_set_success = Предпочитанията за ел. поща са зададени успешно.
|
||||
add_email_confirmation_sent = Изпратено е ел. писмо за потвърждение до „%s“. За да потвърдите адреса си за ел. поща, моля, проверете входящата си кутия и последвайте предоставената връзка в рамките на следващите %s.
|
||||
additional_repo_units_hint_description = Показване на подсказка „Включване на повече“ за хранилища, които нямат включени всички налични елементи.
|
||||
email_notifications.submit = Задаване на предпочит. за ел. поща
|
||||
email_notifications.andyourown = И вашите собствени известия
|
||||
email_deletion_desc = Адресът за ел. поща и свързаната информация ще бъдат премахнати от вашия акаунт. Git подаванията от този адрес за ел. поща ще останат непроменени. Продължаване?
|
||||
add_email_success = Новият адрес за ел. поща е добавен.
|
||||
remove_account_link = Премахване на свързан акаунт
|
||||
webauthn_alternative_tip = Може да искате да конфигурирате допълнителен метод за удостоверяване.
|
||||
hidden_comment_types_description = Типовете коментари, отметнати тук, няма да се показват в страниците на задачите. Например, отмятането на „Етикет“ премахва всички коментари от типа „<потребител> добави/премахна <етикет>“.
|
||||
hidden_comment_types = Скрити типове коментари
|
||||
comment_type_group_lock = Състояние на заключване
|
||||
can_not_add_email_activations_pending = Има чакаща активация, опитайте отново след няколко минути, ако искате да добавите нова ел. поща.
|
||||
storage_overview = Преглед на съхранението
|
||||
|
||||
[packages]
|
||||
container.labels.value = Стойност
|
||||
|
@ -287,6 +411,33 @@ generic.download = Изтеглете пакета от командния ре
|
|||
container.details.type = Тип образ
|
||||
alpine.repository = За хранилището
|
||||
container.images.title = Образи
|
||||
arch.version.description = Описание
|
||||
search_in_external_registry = Търсене в %s
|
||||
filter.type = Тип
|
||||
filter.container.untagged = Без маркер
|
||||
filter.type.all = Всички
|
||||
registry.documentation = За повече информация относно регистъра %s, вижте <a target="_blank" rel="noopener noreferrer" href="%s">документацията</a>.
|
||||
filter.no_result = Вашият филтър не даде резултати.
|
||||
filter.container.tagged = С маркер
|
||||
arch.pacman.repo.multi = %s има същата версия в различни дистрибуции.
|
||||
arch.pacman.helper.gpg = Добавете доверителен сертификат за pacman:
|
||||
alpine.repository.architectures = Архитектури
|
||||
arch.version.provides = Доставя
|
||||
arch.version.groups = Група
|
||||
details.project_site = Уебсайт на проекта
|
||||
arch.pacman.conf = Добавете сървър със свързаната дистрибуция и архитектура към <code>/etc/pacman.conf</code> :
|
||||
arch.pacman.sync = Синхронизирайте пакета с pacman:
|
||||
details.repository_site = Уебсайт на хранилището
|
||||
arch.version.depends = Зависимости
|
||||
arch.version.optdepends = Допълнителни зависимости
|
||||
arch.version.replaces = Заменя
|
||||
go.install = Инсталирайте пакета от командния ред:
|
||||
cargo.registry = Настройте този регистър в конфигурационния файл на Cargo (например <code>~/.cargo/config.toml</code>):
|
||||
cargo.install = За да инсталирате пакета с Cargo, изпълнете следната команда:
|
||||
details.documentation_site = Уебсайт на документацията
|
||||
arch.version.conflicts = В конфликт
|
||||
alpine.repository.branches = Клонове
|
||||
arch.pacman.repo.multi.item = Конфигурация за %s
|
||||
|
||||
[tool]
|
||||
hours = %d часа
|
||||
|
@ -447,7 +598,7 @@ projects.template.desc = Шаблон
|
|||
projects.card_type.text_only = Само текст
|
||||
projects.card_type.images_and_text = Изображения и текст
|
||||
wiki = Уики
|
||||
wiki.welcome = Добре дошли в Уикито.
|
||||
wiki.welcome = Добре дошли в уикито.
|
||||
wiki.create_first_page = Създаване на първата страница
|
||||
editor.upload_file = Качване на файл
|
||||
projects.column.color = Цвят
|
||||
|
@ -644,7 +795,7 @@ milestones.filter_sort.latest_due_date = Най-далечен краен сро
|
|||
diff.view_file = Преглед на файла
|
||||
release.deletion_success = Изданието е изтрито.
|
||||
projects.column.delete = Изтриване на колоната
|
||||
migrate.migrating = Мигриране от <b>%s</b> ...
|
||||
migrate.migrating = Мигриране от <b>%s</b> …
|
||||
escape_control_characters = Екраниране
|
||||
issues.label_deletion_success = Етикетът е изтрит.
|
||||
pulls.is_closed = Заявката за сливане е затворена.
|
||||
|
@ -1025,7 +1176,7 @@ issues.content_history.edited = редактирано
|
|||
pulls.title_desc_one = иска да слее %[1]d подаване от <code>%[2]s</code> в <code id="%[4]s">%[3]s</code>
|
||||
pulls.showing_specified_commit_range = Показани са само промените между %[1]s..%[2]s
|
||||
pulls.merged_title_desc_one = сля %[1]d подаване от <code>%[2]s</code> в <code>%[3]s</code> %[4]s
|
||||
pulls.no_merge_access = Не сте упълномощени за сливане на тази заявка за сливане.
|
||||
pulls.no_merge_access = Не сте упълномощени да слеете тази заявка за сливане.
|
||||
activity.navbar.code_frequency = Честота на промените
|
||||
activity.git_stats_pushed_1 = е изтласкал
|
||||
activity.git_stats_push_to_branch = към %s и
|
||||
|
@ -1139,7 +1290,7 @@ issues.review.review = Рецензия
|
|||
issues.review.comment = рецензира %s
|
||||
branch.deleted_by = Изтрит от %s
|
||||
branch.restore = Възстановяване на клона „%s“
|
||||
archive.title_date = Това хранилище е архивирано на %s. Можете да преглеждате файлове и да го клонирате, но не можете да изтласквате или отваряте задачи или заявки за сливане.
|
||||
archive.title_date = Това хранилище е архивирано на %s. Можете да преглеждате файлове и да го клонирате, но не можете да правите промени в състоянието му, като изтласкване и създаване на нови задачи, заявки за сливане или коментари.
|
||||
release.download_count_one = %s изтегляне
|
||||
release.download_count_few = %s изтегляния
|
||||
branch.restore_success = Клонът „%s“ е възстановен.
|
||||
|
@ -1156,7 +1307,7 @@ pulls.reopen_to_merge = Моля, отворете наново тази зая
|
|||
pulls.cant_reopen_deleted_branch = Тази заявка за сливане не може да бъде отворена наново, защото клонът е изтрит.
|
||||
pulls.status_checks_hide_all = Скриване на всички проверки
|
||||
pulls.status_checks_failure = Някои проверки са неуспешни
|
||||
issues.review.add_review_request = поиска рецензия от %s %s
|
||||
issues.review.add_review_request = поиска рецензия от %[1]s %[2]s
|
||||
wiki.no_search_results = Няма резултати
|
||||
wiki.search = Търсене в уикито
|
||||
issues.author.tooltip.pr = Този потребител е авторът на тази заявка за сливане.
|
||||
|
@ -1290,6 +1441,140 @@ issues.reaction.alt_few = %[1]s реагира с %[2]s.
|
|||
issues.reaction.alt_many = %[1]s и още %[2]d реагираха с %[3]s.
|
||||
issues.reaction.alt_add = Добавяне на реакция %[1]s към коментара.
|
||||
issues.reaction.alt_remove = Премахване на реакция %[1]s от коментара.
|
||||
already_forked = Вече сте разклонили %s
|
||||
generated_from = генерирано от
|
||||
clear_ref = `Изчистване на текущата препратка`
|
||||
file_follow = Последване на символната връзка
|
||||
commitstatus.failure = Неуспех
|
||||
issues.filter_label_exclude = `Използвайте <code>alt</code> + <code>click/enter</code>, за да изключите етикети`
|
||||
migrate.migrating_failed = Мигрирането от <b>%s</b> е неуспешно.
|
||||
migrate.migrating_issues = Мигриране на задачи
|
||||
mirror_from = огледално на
|
||||
fork_from_self = Не можете да разклоните хранилище, което притежавате.
|
||||
commit_graph.hide_pr_refs = Скриване на заявките за сливане
|
||||
generated = Генерирано
|
||||
broken_message = Git данните, лежащи в основата на това хранилище, не могат да бъдат прочетени. Свържете се с администратора на тази инстанция или изтрийте това хранилище.
|
||||
editor.file_is_a_symlink = `„%s“ е символна връзка. Символните връзки не могат да се редактират в уеб редактора`
|
||||
commits.browse_further = Разглеждане нататък
|
||||
commits.older = По-стари
|
||||
form.reach_limit_of_creation_n = Притежателят вече е достигнал лимита от %d хранилища.
|
||||
issues.edit.already_changed = Неуспешно запазване на промените в задачата. Изглежда съдържанието вече е променено от друг потребител. Моля, презаредете страницата и опитайте да редактирате отново, за да избегнете презаписването на техните промени
|
||||
transfer.accept_desc = Прехвърляне към „%s“
|
||||
archive.title = Това хранилище е архивирано. Можете да преглеждате файлове и да го клонирате, но не можете да правите промени в състоянието му, като изтласкване и създаване на нови задачи, заявки за сливане или коментари.
|
||||
form.reach_limit_of_creation_1 = Притежателят вече е достигнал лимита от %d хранилище.
|
||||
editor.patching = Прилагане на кръпка:
|
||||
editor.fail_to_apply_patch = Неуспешно прилагане на кръпка „%s“
|
||||
commits.no_commits = Няма общи подавания. „%s“ и „%s“ имат напълно различни истории.
|
||||
migrate.migrating_pulls = Мигриране на заявки за сливане
|
||||
migrate.migrating_topics = Мигриране на теми
|
||||
projects.desc = Управлявайте задачи и заявки за сливане в проектни табла.
|
||||
issues.choose.invalid_templates = %v невалидни шаблона са намерени
|
||||
pulls.edit.already_changed = Неуспешно запазване на промените в заявката за сливане. Изглежда съдържанието вече е променено от друг потребител. Моля, презаредете страницата и опитайте да редактирате отново, за да избегнете презаписването на техните промени
|
||||
migrate.gitbucket.description = Мигриране на данни от GitBucket инстанции.
|
||||
migrate.migrating_git = Мигриране на Git данни
|
||||
commits.newer = По-нови
|
||||
issues.choose.blank_about = Създаване на задача от стандартен шаблон.
|
||||
issues.filter_no_results = Няма резултати
|
||||
issues.filter_no_results_placeholder = Опитайте да коригирате филтрите си за търсене.
|
||||
archive.nocomment = Коментирането не е възможно, тъй като хранилището е архивирано.
|
||||
migrate.gitlab.description = Мигриране на данни от gitlab.com или други GitLab инстанции.
|
||||
transfer.no_permission_to_accept = Нямате разрешение да приемете това прехвърляне.
|
||||
transfer.no_permission_to_reject = Нямате разрешение да отхвърлите това прехвърляне.
|
||||
editor.file_changed_while_editing = Съдържанието на файла е променено, откакто сте го отворили. <a target="_blank" rel="noopener noreferrer" href="%s">Щракнете тук</a>, за да го видите, или <strong>Подайте промените отново</strong>, за да ги презапишете.
|
||||
sync_fork.button = Синхронизиране
|
||||
migrate.onedev.description = Мигриране на данни от code.onedev.io или други OneDev инстанции.
|
||||
migrate.codebase.description = Мигриране на данни от codebasehq.com.
|
||||
migrate.migrating_labels = Мигриране на етикети
|
||||
migrate.migrating_releases = Мигриране на издания
|
||||
editor.push_rejected_no_message = Промяната беше отхвърлена от сървъра без съобщение. Моля, проверете Git куките.
|
||||
issues.choose.open_external_link = Отваряне
|
||||
comments.edit.already_changed = Неуспешно запазване на промените в коментара. Изглежда съдържанието вече е променено от друг потребител. Моля, презаредете страницата и опитайте да редактирате отново, за да избегнете презаписването на техните промени
|
||||
commits.nothing_to_compare = Тези клонове са равни.
|
||||
transfer.reject_desc = Отказ от прехвърляне към „%s“
|
||||
subscribe.pull.guest.tooltip = Влезте, за да се абонирате за тази заявка за сливане.
|
||||
commit.contained_in_default_branch = Това подаване е част от стандартния клон
|
||||
normal_view = Нормален изглед
|
||||
issues.context.menu = Меню за коментара
|
||||
form.name_reserved = Името на хранилището „%s“ е резервирано.
|
||||
need_auth = Упълномощаване
|
||||
subscribe.issue.guest.tooltip = Влезте, за да се абонирате за тази задача.
|
||||
commitstatus.pending = В очакване
|
||||
commitstatus.success = Успех
|
||||
editor.cannot_commit_to_protected_branch = Не може да се подава в защитения клон „%s“.
|
||||
editor.no_commit_to_branch = Не може да се подава директно в клона, защото:
|
||||
editor.push_rejected = Промяната беше отхвърлена от сървъра. Моля, проверете Git куките.
|
||||
cite_this_repo = Цитиране на това хранилище
|
||||
migrate.gitea.description = Мигриране на данни от gitea.com или други Gitea инстанции.
|
||||
editor.push_rejected_summary = Пълно съобщение на отхвърлянето:
|
||||
sync_fork.branch_behind_one = Този клон е %[1]d подаване зад %[2]s
|
||||
sync_fork.branch_behind_few = Този клон е %[1]d подавания зад %[2]s
|
||||
form.string_too_long = Даденият низ е по-дълъг от %d знака.
|
||||
editor.commit_id_not_matching = Файлът е променен, докато сте го редактирали. Подайте в нов клон и след това слейте.
|
||||
editor.user_no_push_to_branch = Потребителят не може да изтласква в клона
|
||||
archive.pull.noreview = Това хранилище е архивирано. Не можете да рецензирате заявки за сливане.
|
||||
migrate.migrating_failed.error = Неуспешно мигриране: %s
|
||||
migrate.github.description = Мигриране на данни от github.com или GitHub Enterprise сървър.
|
||||
migrate.forgejo.description = Мигриране на данни от codeberg.org или други Forgejo инстанции.
|
||||
migrate.gogs.description = Мигриране на данни от notabug.org или други Gogs инстанции.
|
||||
migrate.migrating_milestones = Мигриране на етапи
|
||||
migrate.failed = Мигрирането е неуспешно: %v
|
||||
pulls.nothing_to_compare_and_allow_empty_pr = Тези клонове са равни. Тази заявка за сливане ще бъде празна.
|
||||
pulls.has_pull_request = `Вече съществува заявка за сливане между тези клонове: <a href="%[1]s">%[2]s#%[3]d</a>`
|
||||
pulls.is_checking = Проверката за конфликти при сливане е в ход. Опитайте отново след няколко минути.
|
||||
pulls.cannot_merge_work_in_progress = Тази заявка за сливане е отбелязана като в процес на работа.
|
||||
pulls.blocked_by_approvals = Тази заявка за сливане все още няма достатъчно одобрения. Дадени са %d от %d одобрения.
|
||||
pulls.blocked_by_rejection = Тази заявка за сливане има поискани промени от официален рецензент.
|
||||
pulls.waiting_count_1 = %d чакаща рецензия
|
||||
pulls.status_checks_requested = Задължително
|
||||
pulls.update_branch_success = Обновяването на клона е успешно
|
||||
pulls.cannot_auto_merge_helper = Слейте ръчно, за да разрешите конфликтите.
|
||||
migrate.clone_address_desc = HTTP(S) или Git „clone“ URL на съществуващо хранилище
|
||||
pulls.add_prefix = Добавете префикс <strong>%s</strong>
|
||||
pulls.merge_pull_request = Създаване на подаване със сливане
|
||||
pulls.waiting_count_n = %d чакащи рецензии
|
||||
pulls.is_ancestor = Този клон вече е включен в целевия клон. Няма какво да се слива.
|
||||
pulls.required_status_check_missing = Някои задължителни проверки липсват.
|
||||
pulls.change_target_branch_at = `промени целевия клон от <b>%s</b> на <b>%s</b> %s`
|
||||
issues.time_spent_total = Общо изразходвано време
|
||||
issues.del_time_history = `изтри изразходваното време %s`
|
||||
pulls.nothing_to_compare_have_tag = Избраните клон/маркер са равни.
|
||||
pulls.cannot_auto_merge_desc = Тази заявка за сливане не може да бъде слята автоматично поради конфликти.
|
||||
issues.tracker_auto_close = Таймерът ще бъде спрян автоматично, когато тази задача бъде затворена
|
||||
issues.force_push_codes = `изтласка принудително %[1]s от <a class="%[7]s" href="%[3]s"><code>%[2]s</code></a> към <a class="%[7]s" href="%[5]s"><code>%[4]s</code></a> %[6]s`
|
||||
pulls.blocked_by_official_review_requests = Тази заявка за сливане е блокирана, защото липсва одобрение от един или повече официални рецензенти.
|
||||
issues.tracker = Проследяване на времето
|
||||
issues.add_time_history = `добави изразходвано време %s`
|
||||
migrate.repo_desc_helper = Оставете празно, за да внесете съществуващото описание
|
||||
migrate.git.description = Мигриране само на хранилище от всяка Git услуга.
|
||||
mirror_sync = синхронизирано
|
||||
migrate_repo = Мигриране на хранилище
|
||||
migrate_options = Опции за мигрирането
|
||||
editor.fork_before_edit = Трябва да разклоните това хранилище, за да направите или предложите промени в този файл.
|
||||
editor.must_have_write_access = Трябва да имате право на запис, за да правите или предлагате промени в този файл.
|
||||
editor.new_branch_name = Дайте име на новия клон за това подаване
|
||||
editor.invalid_commit_mail = Невалидна ел. поща за създаване на подаване.
|
||||
pulls.required_status_check_failed = Някои задължителни проверки не са успешни.
|
||||
issues.time_spent_from_all_authors = `Общо изразходвано време: %s`
|
||||
issues.attachment.download = `Щракнете, за да изтеглите „%s“`
|
||||
issues.attachment.open_tab = `Щракнете, за да видите „%s“ в нов раздел`
|
||||
pulls.update_branch = Обновяване на клона чрез сливане
|
||||
migrate_items = Елементи за мигриране
|
||||
commit.load_referencing_branches_and_tags = Зареждане на клонове и маркери, препращащи към това подаване
|
||||
pulls.files_conflicted = Тази заявка за сливане има промени, които са в конфликт с целевия клон.
|
||||
pulls.still_in_progress = Все още е в процес на работа?
|
||||
pulls.ready_for_review = Готово е за рецензиране?
|
||||
pulls.is_empty = Промените в този клон вече са в целевия клон. Това ще бъде празно подаване.
|
||||
issues.start_tracking = Започване на проследяване на времето
|
||||
migrate_options_mirror_helper = Това хранилище ще бъде огледално
|
||||
migrate_options_lfs = Мигриране на LFS файлове
|
||||
editor.upload_file_is_locked = Файлът „%s“ е заключен от %s.
|
||||
issues.tracking_already_started = `Вече сте започнали проследяване на времето по <a href="%s">друга задача</a>!`
|
||||
pulls.remove_prefix = Премахнете префикса <strong>%s</strong>
|
||||
author_search_tooltip = Показва максимум 30 потребители
|
||||
migrate.migrating_failed_no_addr = Мигрирането е неуспешно.
|
||||
issues.force_push_compare = Сравняване
|
||||
pulls.status_checking = Някои проверки са в очакване
|
||||
pulls.nothing_to_compare = Тези клонове са равни. Не е нужно да създавате заявка за сливане.
|
||||
|
||||
[modal]
|
||||
confirm = Потвърждаване
|
||||
|
@ -1319,6 +1604,11 @@ table_modal.placeholder.content = Съдържание
|
|||
table_modal.placeholder.header = Заглавка
|
||||
buttons.new_table.tooltip = Добавяне на таблица
|
||||
table_modal.header = Добавяне на таблица
|
||||
link_modal.description = Описание
|
||||
link_modal.header = Добавяне на връзка
|
||||
buttons.indent.tooltip = Вмъкване на елементи с едно ниво
|
||||
buttons.unindent.tooltip = Изваждане на елементи с едно ниво
|
||||
link_modal.paste_reminder = Подсказка: С URL адрес в клипборда можете да поставите директно в редактора, за да създадете връзка.
|
||||
|
||||
[org]
|
||||
teams.write_access = Писане
|
||||
|
@ -1393,11 +1683,12 @@ members.private_helper = Да е видим
|
|||
teams.no_desc = Този екип няма описание
|
||||
settings.delete_org_desc = Тази организация ще бъде изтрита перманентно. Продължаване?
|
||||
open_dashboard = Отваряне на таблото
|
||||
settings.change_orgname_prompt = Бележка: Промяната на името на организацията ще промени и URL адреса на вашата организация и ще освободи старото име.
|
||||
|
||||
[install]
|
||||
admin_password = Парола
|
||||
user = Потребителско име
|
||||
admin_email = Адрес на ел. поща
|
||||
admin_email = Адрес за ел. поща
|
||||
path = Път
|
||||
password = Парола
|
||||
host = Хост
|
||||
|
@ -1427,13 +1718,17 @@ admin_title = Настройки на администраторския ака
|
|||
err_empty_admin_password = Администраторската парола не може да бъде празна.
|
||||
docker_helper = Ако стартирате Forgejo в Docker, моля, прочетете <a target="_blank" rel="noopener noreferrer" href="%s">документацията</a> преди да промените настройки.
|
||||
sqlite_helper = Път на файла за SQLite3 базата данни.<br>Въведете абсолютен път, ако стартирате Forgejo като service.
|
||||
err_empty_admin_email = Администраторският адрес на ел. поща не може да бъде празен.
|
||||
err_empty_admin_email = Администраторският адрес за ел. поща не може да бъде празен.
|
||||
password_algorithm = Алгоритъм за хеш. на паролите
|
||||
default_keep_email_private = Скриване на адресите на ел. поща по подразбиране
|
||||
default_keep_email_private = Скриване на адресите за ел. поща по подразбиране
|
||||
invalid_password_algorithm = Невалиден алгоритъм за хеш. на паролите
|
||||
err_admin_name_is_reserved = Потребителското име на администратора е невалидно, потребителското име е резервирано
|
||||
err_admin_name_pattern_not_allowed = Потребителското име на администратора е невалидно, потребителското име съответства с резервиран шаблон
|
||||
err_admin_name_is_invalid = Потребителското име на администратора е невалидно
|
||||
db_schema_helper = Оставете празно за схемата по подразбиране на базата данни („public“).
|
||||
reinstall_error = Опитвате се да инсталирате върху съществуваща Forgejo база данни
|
||||
reinstall_confirm_message = Преинсталирането със съществуваща Forgejo база данни може да причини множество проблеми. В повечето случаи трябва да използвате съществуващия си „app.ini“, за да стартирате Forgejo. Ако знаете какво правите, потвърдете следното:
|
||||
app_slogan = Слоган на инстанцията
|
||||
|
||||
[filter]
|
||||
string.asc = А - Я
|
||||
|
@ -1462,8 +1757,8 @@ link_not_working_do_paste = Ако връзката не работи, опит
|
|||
activate_account = Моля, активирайте своя акаунт
|
||||
admin.new_user.subject = Нов потребител %s току-що се регистрира
|
||||
activate_account.text_1 = Здравейте, <b>%[1]s</b>, благодарим ви за регистрацията в %[2]s!
|
||||
activate_email.text = Моля, щракнете върху следната връзка, за да потвърдите своя адрес на ел. поща в рамките на <b>%s</b>:
|
||||
activate_email = Потвърдете своя адрес на ел. поща
|
||||
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
|
||||
|
@ -1473,6 +1768,28 @@ 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
|
||||
password_change.subject = Вашата парола е променена
|
||||
admin.new_user.text = Моля, <a href="%s">щракнете тук</a>, за да управлявате този потребител от администраторския панел.
|
||||
password_change.text_1 = Паролата за вашия акаунт току-що беше променена.
|
||||
reset_password = Възстановете своя акаунт
|
||||
account_security_caution.text_1 = Ако това сте били вие, можете спокойно да игнорирате това ел. писмо.
|
||||
issue.action.force_push = <b>%[1]s</b> изтласка принудително <b>%[2]s</b> от %[3]s към %[4]s.
|
||||
team_invite.text_3 = Бележка: Тази покана е предназначена за %[1]s. Ако не сте очаквали тази покана, можете да игнорирате това ел. писмо.
|
||||
view_it_on = Вижте го на %s
|
||||
register_notify.text_1 = това е ел. писмо за потвърждение на вашата регистрация в %s!
|
||||
register_notify.text_2 = Можете да влезете в акаунта си с потребителско име: %s
|
||||
register_notify.text_3 = Ако някой друг е създал този акаунт за вас, първо ще трябва да <a href="%s">зададете парола</a>.
|
||||
repo.collaborator.added.subject = %s ви добави към %s като сътрудник
|
||||
primary_mail_change.text_1 = Основният адрес за ел. поща на вашия акаунт току-що беше променен на %[1]s. Това означава, че този адрес за ел. поща повече няма да получава известия по ел. поща за вашия акаунт.
|
||||
team_invite.text_2 = Моля, щракнете върху следната връзка, за да се присъедините към екипа:
|
||||
repo.transfer.body = За да го приемете или отхвърлите, посетете %s или просто го игнорирайте.
|
||||
repo.collaborator.added.text = Бяхте добавени като сътрудник в хранилище:
|
||||
team_invite.subject = %[1]s ви покани да се присъедините към организацията %[2]s
|
||||
team_invite.text_1 = %[1]s ви покани да се присъедините към екип %[2]s в организация %[3]s.
|
||||
reply = или отговорете директно на това ел. писмо
|
||||
reset_password.text = Ако това сте вие, моля, щракнете върху следната връзка, за да възстановите акаунта си в рамките на <b>%s</b>:
|
||||
primary_mail_change.subject = Основният ви адрес за ел. поща е променен
|
||||
account_security_caution.text_2 = Ако това не сте били вие, акаунтът ви е компрометиран. Моля, свържете се с администраторите на този сайт.
|
||||
|
||||
[user]
|
||||
joined_on = Присъединени на %s
|
||||
|
@ -1493,7 +1810,7 @@ follow = Последване
|
|||
followers_few = %d последователи
|
||||
block_user = Блокиране на потребителя
|
||||
change_avatar = Променете профилната си снимка…
|
||||
email_visibility.limited = Вашият адрес на ел. поща е видим за всички удостоверени потребители
|
||||
email_visibility.limited = Вашият адрес за ел. поща е видим за всички удостоверени потребители
|
||||
disabled_public_activity = Този потребител е изключил публичната видимост на дейността.
|
||||
email_visibility.private = Вашият адрес на ел. поща е видим само за вас и администраторите
|
||||
show_on_map = Показване на това място на картата
|
||||
|
@ -1507,6 +1824,15 @@ public_activity.visibility_hint.self_public = Вашата дейност е в
|
|||
form.name_pattern_not_allowed = Шаблонът "%s" не е разрешен в потребителско име.
|
||||
form.name_reserved = Потребителското име "%s" е резервирано.
|
||||
public_activity.visibility_hint.self_private_profile = Вашата дейност е видима само за вас и администраторите на инстанцията, тъй като вашият профил е частен. <a href="%s">Конфигуриране</a>.
|
||||
block_user.detail = Моля, имайте предвид, че блокирането на потребител има и други ефекти, като например:
|
||||
block_user.detail_2 = Този потребител няма да може да взаимодейства с хранилищата, които притежавате, или със задачите и коментарите, които сте създали.
|
||||
block_user.detail_3 = Няма да можете да се добавяте един друг като сътрудници на хранилище.
|
||||
public_activity.visibility_hint.self_private = Вашата дейност е видима само за вас и администраторите на инстанцията. <a href="%s">Конфигуриране</a>.
|
||||
form.name_chars_not_allowed = Потребителското име „%s“ съдържа невалидни знаци.
|
||||
public_activity.visibility_hint.admin_private = Тази дейност е видима за вас, защото сте администратор, но потребителят иска тя да остане частна.
|
||||
public_activity.visibility_hint.admin_public = Тази дейност е видима за всички, но като администратор можете да виждате и взаимодействия в частни пространства.
|
||||
follow_blocked_user = Не можете да последвате този потребител, защото сте го блокирали или той ви е блокирал.
|
||||
block_user.detail_1 = Ще спрете да се следвате един друг и няма да можете да се последвате отново.
|
||||
|
||||
[home]
|
||||
filter = Други филтри
|
||||
|
@ -1530,6 +1856,7 @@ view_home = Преглед на %s
|
|||
collaborative_repos = Съвместни хранилища
|
||||
switch_dashboard_context = Превключване на контекста на таблото
|
||||
show_only_public = Показване само на публични
|
||||
filter_by_team_repositories = Филтриране по хранилища на екипа
|
||||
|
||||
[admin]
|
||||
packages.version = Версия
|
||||
|
@ -1587,7 +1914,7 @@ config.server_config = Сървърна конфигурация
|
|||
packages.size = Размер
|
||||
settings = Админ. настройки
|
||||
users = Потребителски акаунти
|
||||
emails.duplicate_active = Този адрес на ел. поща вече е активен за друг потребител.
|
||||
emails.duplicate_active = Този адрес за ел. поща вече е активен за друг потребител.
|
||||
config.app_ver = Forgejo версия
|
||||
config.custom_conf = Път на конфигурационния файл
|
||||
config.git_version = Git версия
|
||||
|
@ -1606,16 +1933,20 @@ users.details = Потребителски данни
|
|||
packages.total_size = Общ размер: %s
|
||||
dashboard.new_version_hint = Forgejo %s вече е наличен, вие изпълнявате %s. Проверете <a target="_blank" rel="noreferrer" href="%s">блога</a> за повече подробности.
|
||||
total = Общо: %d
|
||||
config.db_type = Тип
|
||||
monitor.queue.type = Тип
|
||||
notices.type = Тип
|
||||
|
||||
[error]
|
||||
not_found = Целта не може да бъде намерена.
|
||||
report_message = Ако смятате, че това е грешка на Forgejo, моля, потърсете в задачите на <a href="%s" target="_blank">Codeberg</a> или отворете нова задача, ако е необходимо.
|
||||
network_error = Мрежова грешка
|
||||
occurred = Възникна грешка
|
||||
server_internal = Вътрешна грешка на сървъра
|
||||
|
||||
[form]
|
||||
UserName = Потребителско име
|
||||
Email = Адрес на ел. поща
|
||||
Email = Адрес за ел. поща
|
||||
Password = Парола
|
||||
RepoName = Име на хранилището
|
||||
username_been_taken = Потребителското име вече е заето.
|
||||
|
@ -1633,8 +1964,8 @@ url_error = `„%s“ не е валиден URL.`
|
|||
Content = Съдържание
|
||||
team_not_exist = Екипът не съществува.
|
||||
TeamName = Име на екипа
|
||||
email_error = ` не е валиден адрес на ел. поща.`
|
||||
email_invalid = Адресът на ел. поща е невалиден.
|
||||
email_error = ` не е валиден адрес за ел. поща.`
|
||||
email_invalid = Адресът за ел. поща е невалиден.
|
||||
SSHTitle = Име на SSH ключ
|
||||
repo_name_been_taken = Името на хранилището вече е използвано.
|
||||
team_name_been_taken = Името на екипа вече е заето.
|
||||
|
@ -1647,6 +1978,44 @@ Pronouns = Местоимения
|
|||
Biography = Биография
|
||||
Website = Уебсайт
|
||||
Location = Местоположение
|
||||
cannot_add_org_to_team = Организация не може да бъде добавена като член на екип.
|
||||
auth_failed = Неуспешно удостоверяване: %v
|
||||
team_no_units_error = Разрешете достъп до поне една секция на хранилището.
|
||||
password_uppercase_one = Поне един голям знак
|
||||
CommitSummary = Обобщение на подаването
|
||||
username_error = ` може да съдържа само буквено-цифрови знаци („0-9“, „a-z“, „A-Z“), тире („-“), долна черта („_“) и точка („.“). Не може да започва или завършва с не-буквено-цифрови знаци, като също така са забранени и последователни не-буквено-цифрови знаци.`
|
||||
username_error_no_dots = ` може да съдържа само буквено-цифрови знаци („0-9“, „a-z“, „A-Z“), тире („-“) и долна черта („_“). Не може да започва или завършва с не-буквено-цифрови знаци, като също така са забранени и последователни не-буквено-цифрови знаци.`
|
||||
duplicate_invite_to_team = Потребителят вече е поканен като член на екипа.
|
||||
must_use_public_key = Ключът, който предоставихте, е частен ключ. Моля, не качвайте частния си ключ никъде. Вместо това използвайте публичния си ключ.
|
||||
org_still_own_packages = Тази организация все още притежава един или повече пакети, първо ги изтрийте.
|
||||
admin_cannot_delete_self = Не можете да изтриете себе си, когато сте администратор. Моля, първо премахнете администраторските си привилегии.
|
||||
To = Име на клон
|
||||
CommitMessage = Съобщение на подаването
|
||||
include_error = ` трябва да съдържа подниз „%s“.`
|
||||
alpha_dash_error = ` трябва да съдържа само буквено-цифрови знаци, тире („-“) и долна черта („_“).`
|
||||
alpha_dash_dot_error = ` трябва да съдържа само буквено-цифрови знаци, тире („-“), долна черта („_“) и точка („.“).`
|
||||
size_error = ` трябва да е с размер %s.`
|
||||
min_size_error = ` трябва да съдържа поне %s знака.`
|
||||
max_size_error = ` трябва да съдържа най-много %s знака.`
|
||||
invalid_group_team_map_error = ` съпоставянето е невалидно: %s`
|
||||
password_complexity = Паролата не отговаря на изискванията за сложност:
|
||||
password_lowercase_one = Поне един малък знак
|
||||
password_digit_one = Поне една цифра
|
||||
password_special_one = Поне един специален знак (препинателни знаци, скоби, кавички и др.)
|
||||
enterred_invalid_repo_name = Името на хранилището, което въведохте, е неправилно.
|
||||
enterred_invalid_org_name = Името на организацията, което въведохте, е неправилно.
|
||||
enterred_invalid_password = Паролата, която въведохте, е неправилна.
|
||||
organization_leave_success = Успешно напуснахте организацията %s.
|
||||
still_has_org = Вашият акаунт е член на една или повече организации, първо ги напуснете.
|
||||
org_still_own_repo = Тази организация все още притежава едно или повече хранилища, първо ги изтрийте или прехвърлете.
|
||||
target_branch_not_exist = Целевият клон не съществува.
|
||||
glob_pattern_error = ` glob шаблонът е невалиден: %s.`
|
||||
openid_been_used = OpenID адресът „%s“ вече е използван.
|
||||
unknown_error = Неизвестна грешка:
|
||||
TreeName = Път до файла
|
||||
AdminEmail = Администраторски адрес за ел. поща
|
||||
email_domain_is_not_allowed = Домейнът на адреса за ел. поща на потребителя <b>%s</b> е в конфликт с EMAIL_DOMAIN_ALLOWLIST или EMAIL_DOMAIN_BLOCKLIST. Уверете се, че сте въвели правилно адреса за ел. поща.
|
||||
email_been_used = Адресът за ел. поща вече се използва.
|
||||
|
||||
[action]
|
||||
close_issue = `затвори задача <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||
|
@ -1709,11 +2078,38 @@ sign_up_button = Регистрирайте се.
|
|||
back_to_sign_in = Назад към Вход
|
||||
sign_in_openid = Продължаване с OpenID
|
||||
send_reset_mail = Изпращане на ел. писмо за възстановяване
|
||||
authorize_application = Упълномощаване на приложение
|
||||
password_pwned_err = Неуспешно завършване на заявката към HaveIBeenPwned
|
||||
last_admin = Не можете да премахнете последния администратор. Трябва да има поне един администратор.
|
||||
allow_password_change = Изискване потребителят да смени паролата си (препоръчително)
|
||||
authorize_title = Упълномощавате ли „%s“ да има достъп до вашия акаунт?
|
||||
reset_password_mail_sent_prompt = Изпратено е ел. писмо за потвърждение до <b>%s</b>. За да завършите процеса по възстановяване на акаунта, моля, проверете входящата си поща и последвайте предоставената връзка в рамките на следващите %s.
|
||||
reset_password_wrong_user = Вие сте влезли като %s, но връзката за възстановяване на акаунта е предназначена за %s
|
||||
authorize_redirect_notice = Ще бъдете пренасочени към %s, ако упълномощите това приложение.
|
||||
authorize_application_description = Ако предоставите достъп, то ще може да осъществява достъп и да записва цялата информация за вашия акаунт, включително частни хранилища и организации.
|
||||
twofa_scratch_used = Използвали сте своя резервен код. Пренасочени сте към страницата с настройки за двуфакторно удостоверяване, за да можете да премахнете регистрацията на устройството си или да генерирате нов резервен код.
|
||||
reset_password_helper = Възстановяване на акаунт
|
||||
invalid_password = Вашата парола не съвпада с паролата, използвана за създаване на акаунта.
|
||||
invalid_code = Вашият код за потвърждение е невалиден или е изтекъл.
|
||||
invalid_code_forgot_password = Вашият код за потвърждение е невалиден или е изтекъл. Щракнете <a href="%s">тук</a>, за да започнете нова сесия.
|
||||
scratch_code = Резервен код
|
||||
use_scratch_code = Използвайте резервен код
|
||||
use_onetime_code = Използвайте еднократен код
|
||||
twofa_scratch_token_incorrect = Вашият резервен код е неправилен.
|
||||
authorize_application_created_by = Това приложение е създадено от %s.
|
||||
authorization_failed = Неуспешно упълномощаване
|
||||
resent_limit_prompt = Вече сте поискали ел. писмо за активация наскоро. Моля, изчакайте 3 минути и опитайте отново.
|
||||
has_unconfirmed_mail = Здравейте, %s, имате непотвърден адрес за ел. поща (<b>%s</b>). Ако не сте получили ел. писмо за потвърждение или трябва да изпратите ново, моля, щракнете върху бутона по-долу.
|
||||
change_unconfirmed_email_error = Неуспешна промяна на адреса за ел. поща: %v
|
||||
resend_mail = Щракнете тук, за повторно изпращане на ел. писмо за активация
|
||||
change_unconfirmed_email_summary = Промяна на адреса, на който се изпраща ел. писмо за активация.
|
||||
change_unconfirmed_email = Ако сте въвели грешен адрес за ел. поща по време на регистрацията, можете да го промените по-долу и потвърждение ще бъде изпратено на новия адрес.
|
||||
|
||||
[aria]
|
||||
footer.software = Относно този софтуер
|
||||
footer.links = Връзки
|
||||
footer = Долен колонтитул
|
||||
navbar = Навигационна лента
|
||||
|
||||
[startpage]
|
||||
install = Лесен за инсталиране
|
||||
|
@ -1780,6 +2176,7 @@ runs.no_workflows.help_no_write_access = За да научите повече
|
|||
variables.management = Управление на променливи
|
||||
variables.not_found = Променливата не е открита.
|
||||
variables.id_not_exist = Променлива с идентификатор %d не съществува.
|
||||
runners.owner_type = Тип
|
||||
|
||||
[heatmap]
|
||||
less = По-малко
|
||||
|
@ -1809,9 +2206,10 @@ invalid_input_type = Не можете да качвате файлове от
|
|||
component_loading_failed = Неуспешно зареждане на %s
|
||||
contributors.what = приноси
|
||||
recent_commits.what = скорошни подавания
|
||||
component_loading = Зареждане на %s...
|
||||
component_loading = Зареждане на %s…
|
||||
component_loading_info = Това може да отнеме известно време…
|
||||
code_frequency.what = честота на промените
|
||||
component_failed_to_load = Възникна неочаквана грешка.
|
||||
|
||||
[projects]
|
||||
type-1.display_name = Индивидуален проект
|
||||
|
@ -1820,20 +2218,29 @@ deleted.display_name = Изтрит проект
|
|||
|
||||
[search]
|
||||
no_results = Няма намерени съответстващи резултати.
|
||||
team_kind = Търсене на екипи...
|
||||
repo_kind = Търсене на хранилища...
|
||||
org_kind = Търсене на организации...
|
||||
user_kind = Търсене на потребители...
|
||||
code_kind = Търсене на код...
|
||||
commit_kind = Търсене на подавания...
|
||||
project_kind = Търсене на проекти...
|
||||
package_kind = Търсене на пакети...
|
||||
search = Търсене...
|
||||
branch_kind = Търсене на клонове...
|
||||
pull_kind = Търсене на заявки за сливане...
|
||||
issue_kind = Търсене на задачи...
|
||||
team_kind = Търсене на екипи…
|
||||
repo_kind = Търсене на хранилища…
|
||||
org_kind = Търсене на организации…
|
||||
user_kind = Търсене на потребители…
|
||||
code_kind = Търсене на код…
|
||||
commit_kind = Търсене на подавания…
|
||||
project_kind = Търсене на проекти…
|
||||
package_kind = Търсене на пакети…
|
||||
search = Търсене…
|
||||
branch_kind = Търсене на клонове…
|
||||
pull_kind = Търсене на заявки за сливане…
|
||||
issue_kind = Търсене на задачи…
|
||||
fuzzy = Приблизително
|
||||
exact = Прецизно
|
||||
regexp = Регекс
|
||||
regexp_tooltip = Третиране на термина за търсене като регулярен израз
|
||||
fuzzy_tooltip = Включване на резултати, които също съвпадат приблизително с термина за търсене
|
||||
exact_tooltip = Включване само на резултати, които съвпадат точно с термина за търсене
|
||||
code_search_unavailable = Търсенето на код в момента не е достъпно. Моля, свържете се с администратора на сайта.
|
||||
keyword_search_unavailable = Търсенето по ключова дума в момента не е достъпно. Моля, свържете се с администратора на сайта.
|
||||
union_tooltip = Включване на резултати, които съвпадат с някоя от ключовите думи, разделени с интервал
|
||||
union = Обединение
|
||||
type_tooltip = Тип търсене
|
||||
|
||||
[markup]
|
||||
filepreview.lines = Редове от %[1]d до %[2]d в %[3]s
|
||||
|
|
|
@ -493,11 +493,11 @@ use_onetime_code = Použít jednorázový kód
|
|||
view_it_on=Zobrazit na %s
|
||||
reply=nebo přímo odpovědět na tento e-mail
|
||||
link_not_working_do_paste=Odkaz nefunguje? Zkuste jej zkopírovat a vložit do adresního řádku svého prohlížeče.
|
||||
hi_user_x=Ahoj <b>%s</b>,
|
||||
hi_user_x=Dobrý den, uživateli <b>%s</b>,
|
||||
|
||||
activate_account=Prosíme, aktivujte si váš účet
|
||||
activate_account.title=%s, prosím aktivujte si váš účet
|
||||
activate_account.text_1=Ahoj <b>%[1]s</b>, děkujeme za registraci na %[2]s!
|
||||
activate_account.text_1=Dobrý den, uživateli <b>%[1]s</b>, děkujeme za registraci ve službě %[2]s!
|
||||
activate_account.text_2=Pro aktivaci vašeho účtu klikněte <b>%s</b> na následující odkaz :
|
||||
|
||||
activate_email=Ověřte vaši e-mailovou adresu
|
||||
|
@ -932,7 +932,7 @@ generate_new_token=Vygenerovat nový token
|
|||
tokens_desc=Tyto tokeny umožňují přístup k vašemu účtu pomocí Forgejo API.
|
||||
token_name=Název tokenu
|
||||
generate_token=Vygenerovat token
|
||||
generate_token_success=Nový token byl vygenerován. Zkopírujte jej nyní, jelikož již nebude znovu zobrazen.
|
||||
generate_token_success=Nový token byl vygenerován. Zkopírujte si jej nyní, jelikož již nebude znovu zobrazen.
|
||||
generate_token_name_duplicate=<strong>%s</strong> byl již použit jako název aplikace. Použijte prosím nový.
|
||||
delete_token=Smazat
|
||||
access_token_deletion=Odstranit přístupový token
|
||||
|
|
|
@ -2917,6 +2917,13 @@ comment.blocked_by_user = Kommentieren ist nicht möglich, da du vom Repository-
|
|||
sync_fork.branch_behind_one = Dieser Branch ist %[1]d Commit hinter %[2]s
|
||||
sync_fork.branch_behind_few = Dieser Branch ist %[1]d Commits hinter %[2]s
|
||||
sync_fork.button = Sync
|
||||
settings.event_action_failure_desc = Action-Run endete im Fehlschlag.
|
||||
settings.event_action_success_desc = Action-Run war erfolgreich.
|
||||
settings.event_action_failure = Fehlschlag
|
||||
settings.event_action_success = Erfolg
|
||||
settings.event_header_action = Action-Run-Ereignisse
|
||||
settings.event_action_recover_desc = Action-Run war erfolgreich, nachdem der letzte Action-Run im selben Arbeitsablauf fehlgeschlagen ist.
|
||||
settings.event_action_recover = Wiederherstellen
|
||||
|
||||
[graphs]
|
||||
component_loading_failed = Konnte %s nicht laden
|
||||
|
|
|
@ -2773,6 +2773,10 @@ comment.blocked_by_user = Hindi posible ang pagkomento dahil hinarang ka ng may-
|
|||
sync_fork.button = I-sync
|
||||
sync_fork.branch_behind_one = Ang branch na ito ay %[1]d commit sa likod ng %[2]s
|
||||
sync_fork.branch_behind_few = Ang branch na ito ay %[1]d mga commit sa likod ng %[2]s
|
||||
settings.event_header_action = Mga event sa run ng aksyon
|
||||
settings.event_action_failure = Pagkabigo
|
||||
settings.event_action_failure_desc = Natapos ang action run bilang pagkabigo.
|
||||
settings.event_action_recover = I-recover
|
||||
|
||||
[search]
|
||||
commit_kind = Maghanap ng mga commit…
|
||||
|
|
|
@ -9,7 +9,7 @@ sign_in_with_provider=Se connecter avec %s
|
|||
sign_in_or=ou
|
||||
sign_out=Déconnexion
|
||||
sign_up=S'inscrire
|
||||
link_account=Lier un Compte
|
||||
link_account=Lier un compte
|
||||
register=S'inscrire
|
||||
version=Version
|
||||
powered_by=Propulsé par %s
|
||||
|
@ -1516,7 +1516,7 @@ issues.desc=Organiser les rapports de bug, les tâches et les jalons.
|
|||
issues.filter_assignees=Filtrer par assignation
|
||||
issues.filter_milestones=Filtrer le jalon
|
||||
issues.filter_projects=Filtrer par projet
|
||||
issues.filter_labels=Filtrer par labels
|
||||
issues.filter_labels=Filtrer par étiquettes
|
||||
issues.filter_reviewers=Filtrer par évaluateur
|
||||
issues.new=Nouveau ticket
|
||||
issues.new.title_empty=Le titre ne peut pas être vide
|
||||
|
@ -4090,4 +4090,4 @@ issues.write = <b>Écrire :</b> Fermer des tickets et gérer les métadonnées t
|
|||
pulls.read = <b>Lire :</b> Lire et créer des demandes de tirage.
|
||||
|
||||
[translation_meta]
|
||||
test = Ceci est une chaîne de test. Elle n'est pas affichée dans l'interface de Forgejo mais est utilisée à des fins de test. N'hésitez pas à entrer 'ok' pour gagner du temps (ou un fait amusant de votre choix) pour atteindre ce doux 100 % de complétion. :-)
|
||||
test = Ceci est une chaîne de test. Elle n'est pas affichée dans l'interface de Forgejo mais est utilisée à des fins de test. N'hésitez pas à entrer 'ok' pour gagner du temps (ou un fait amusant de votre choix) pour atteindre ce difficile 100 % de complétion. :-)
|
||||
|
|
|
@ -2913,6 +2913,13 @@ comment.blocked_by_user = Piebilžu pievienošana nav iespējama, jo glabātavas
|
|||
sync_fork.branch_behind_one = Šis zars ir %[1]d iesūtījumu aiz %[2]s
|
||||
sync_fork.button = Sinhronizēt
|
||||
sync_fork.branch_behind_few = Šis zars ir %[1]d iesūtījumus aiz %[2]s
|
||||
settings.event_action_failure = Kļūme
|
||||
settings.event_action_failure_desc = Darbības izpilde beidzās ar kļūmi.
|
||||
settings.event_header_action = Darbības izpildes notikumi
|
||||
settings.event_action_recover = Atgūt
|
||||
settings.event_action_recover_desc = Darbības izpilde bija sekmīga pēc kļūmes iepriekšējā darbības izpildē tajā pašā darbplūsmā.
|
||||
settings.event_action_success = Sekmīgi
|
||||
settings.event_action_success_desc = Darbības izpilde bija sekmīga.
|
||||
|
||||
[graphs]
|
||||
component_loading=Ielādē %s…
|
||||
|
|
|
@ -2913,6 +2913,13 @@ comment.blocked_by_user = Não é possível comentar pois você foi bloqueado pe
|
|||
sync_fork.branch_behind_few = Este branch está %[1]d commits atrás de %[2]s
|
||||
sync_fork.branch_behind_one = Este branch está %[1]d commit atrás de %[2]s
|
||||
sync_fork.button = Sincronizar
|
||||
settings.event_header_action = Eventos de execução de Actions
|
||||
settings.event_action_failure = Falha
|
||||
settings.event_action_failure_desc = Execução da Action terminou com falha.
|
||||
settings.event_action_recover = Recuperar
|
||||
settings.event_action_recover_desc = A execução da Action teve sucesso após a última execução no mesmo workflow ter falhado.
|
||||
settings.event_action_success = Sucesso
|
||||
settings.event_action_success_desc = A execução da Action foi bem sucedida.
|
||||
|
||||
[graphs]
|
||||
component_loading = Carregando %s…
|
||||
|
|
|
@ -31,7 +31,7 @@ username=Nome de utilizador
|
|||
email=Endereço de email
|
||||
password=Senha
|
||||
access_token=Código de acesso
|
||||
re_type=Confirme a senha
|
||||
re_type=Confirme a palavra-passe
|
||||
captcha=CAPTCHA
|
||||
twofa=Autenticação com dois passos
|
||||
twofa_scratch=Código de uso único em dois passos
|
||||
|
@ -2915,6 +2915,13 @@ comment.blocked_by_user = Não é possível comentar porque está bloqueado pelo
|
|||
sync_fork.branch_behind_few = Este ramo está %[1]d cometimentos atrás de %[2]s
|
||||
sync_fork.button = Sincronizar
|
||||
sync_fork.branch_behind_one = Este ramo está %[1]d cometimento atrás de %[2]s
|
||||
settings.event_action_failure = Falha
|
||||
settings.event_action_failure_desc = A execução da ação terminou com falha.
|
||||
settings.event_action_recover = Recuperar
|
||||
settings.event_header_action = Eventos da execução de ações
|
||||
settings.event_action_recover_desc = A execução de ação foi bem sucedida depois da última execução de ação na mesma sequência de trabalho ter falhado.
|
||||
settings.event_action_success = Sucesso
|
||||
settings.event_action_success_desc = A Execução de ação foi bem sucedida.
|
||||
|
||||
[graphs]
|
||||
component_loading=A carregar %s…
|
||||
|
|
|
@ -1450,7 +1450,7 @@ commit.cherry-pick-content=Выбрать ветвь для переноса:
|
|||
commitstatus.error=Ошибка
|
||||
commitstatus.failure=Неудача
|
||||
commitstatus.pending=Ожидание
|
||||
commitstatus.success=Успешно
|
||||
commitstatus.success=Успех
|
||||
|
||||
ext_issues=Внешние задачи
|
||||
ext_issues.desc=Ссылка на внешнюю систему отслеживания задач.
|
||||
|
@ -2916,6 +2916,13 @@ comment.blocked_by_user = Комментирование невозможно,
|
|||
sync_fork.branch_behind_few = Эта ветвь отстаёт от %[2]s на %[1]d коммитов
|
||||
sync_fork.button = Синхронизировать
|
||||
sync_fork.branch_behind_one = Эта ветвь отстаёт от %[2]s на %[1]d коммит
|
||||
settings.event_header_action = События выполнений Действий
|
||||
settings.event_action_failure = Неудача
|
||||
settings.event_action_failure_desc = Выполнение завершилось неудачно.
|
||||
settings.event_action_recover = Восстановлен
|
||||
settings.event_action_recover_desc = После неудачи повторное выполнение рабочего потока было успешно.
|
||||
settings.event_action_success = Успех
|
||||
settings.event_action_success_desc = Выполнение завершилось успешно.
|
||||
|
||||
[graphs]
|
||||
component_loading_failed = Не удалось загрузить %s
|
||||
|
@ -3914,10 +3921,10 @@ unit.desc=Управление встроенными конвейерами CI/
|
|||
status.unknown=Неизвестно
|
||||
status.waiting=Ожидает
|
||||
status.running=Запущено
|
||||
status.success=Успешно
|
||||
status.success=Успех
|
||||
status.failure=Неудача
|
||||
status.cancelled=Отменено
|
||||
status.skipped=Пропущено
|
||||
status.skipped=Пропущен
|
||||
status.blocked=Заблокировано
|
||||
|
||||
runners=Исполнители
|
||||
|
@ -3938,7 +3945,7 @@ runners.task_list.run=Запуск
|
|||
runners.task_list.status=Состояние
|
||||
runners.task_list.repository=Репозиторий
|
||||
runners.task_list.commit=Коммит
|
||||
runners.task_list.done_at=Время завершения
|
||||
runners.task_list.done_at=Завершено
|
||||
runners.edit_runner=Изменить исполнитель
|
||||
runners.update_runner=Обновить изменения
|
||||
runners.update_runner_success=Исполнитель успешно обновлён
|
||||
|
@ -3960,7 +3967,7 @@ runners.reset_registration_token_success=Токен регистрации ис
|
|||
runs.all_workflows=Все рабочие потоки
|
||||
runs.commit=коммит
|
||||
runs.scheduled=Запланировано
|
||||
runs.pushed_by=отправлено
|
||||
runs.pushed_by=отправлен
|
||||
runs.invalid_workflow_helper=Файл конфигурации рабочего потока некорректен. Пожалуйста, проверьте конфигурационный файл: %s
|
||||
runs.actor=Автор
|
||||
runs.status=Состояние
|
||||
|
|
|
@ -2856,12 +2856,12 @@ dashboard.current_memory_usage=Поточне використання пам'я
|
|||
dashboard.total_memory_allocated=Виділено пам'яті загалом
|
||||
dashboard.memory_obtained=Отримано пам'яті
|
||||
dashboard.pointer_lookup_times=Пошуків вказівника
|
||||
dashboard.memory_allocate_times=Виділення пам'яті
|
||||
dashboard.memory_allocate_times=Виділень пам'яті
|
||||
dashboard.memory_free_times=Звільнень пам'яті
|
||||
dashboard.current_heap_usage=Поточне використання динамічної пам'яті
|
||||
dashboard.heap_memory_obtained=Отримано динамічної пам'яті
|
||||
dashboard.heap_memory_idle=Не використовується динамічною пам'яттю
|
||||
dashboard.heap_memory_in_use=Використовується динамічною пам'яттю
|
||||
dashboard.heap_memory_idle=Динамічної пам'яті простоює
|
||||
dashboard.heap_memory_in_use=Динамічної пам'яті використовується
|
||||
dashboard.heap_memory_released=Звільнено динамічної пам'яті
|
||||
dashboard.heap_objects=Об'єктів динамічної пам'яті
|
||||
dashboard.bootstrap_stack_usage=Використання стеку Bootstrap
|
||||
|
@ -3625,6 +3625,8 @@ runners.runner_title = Ранер
|
|||
runners.task_list = Нещодавні завдання ранера
|
||||
runners.update_runner_success = Ранер оновлено
|
||||
runners.delete_runner_header = Підтвердіть видалення ранера
|
||||
runners.status.offline = Неактивний
|
||||
runners.status.idle = Простоює
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -2915,6 +2915,13 @@ comment.blocked_by_user = 您无法评论,因为您已被仓库所有者或作
|
|||
sync_fork.button = 同步
|
||||
sync_fork.branch_behind_one = 此分支落后于 %[2]s %[1]d 个提交
|
||||
sync_fork.branch_behind_few = 此分支落后于 %[2]s %[1]d 个提交
|
||||
settings.event_action_failure = 失败
|
||||
settings.event_action_recover = 恢复
|
||||
settings.event_action_recover_desc = Action运行在同一工作流上次失败后成功。
|
||||
settings.event_action_success = 成功
|
||||
settings.event_action_success_desc = Action运行以成功结束。
|
||||
settings.event_action_failure_desc = Action运行以失败结束。
|
||||
settings.event_header_action = Action运行事件
|
||||
|
||||
[graphs]
|
||||
component_loading=正在加载 %s…
|
||||
|
|
|
@ -209,6 +209,7 @@ buttons.unindent.tooltip = 使項目取消縮排一層
|
|||
link_modal.header = 新增連結
|
||||
link_modal.url = 網址
|
||||
link_modal.description = 描述
|
||||
link_modal.paste_reminder = 提示:當您的剪貼簿中有網址時,可以直接貼到編輯器中來建立連結。
|
||||
|
||||
[filter]
|
||||
string.asc=A - Z
|
||||
|
@ -220,7 +221,7 @@ missing_csrf=錯誤的請求:未提供 CSRF 符記
|
|||
invalid_csrf=錯誤的請求:無效的 CSRF 符記
|
||||
not_found=找不到目標。
|
||||
network_error=網路錯誤
|
||||
report_message = 如果您相信這是一個 Forgejo 的錯誤,請在 <a href="%s" target="_blank">Codeberg</a> 上搜尋相關問題,或在必要時提出一個新問題。
|
||||
report_message = 如果您相信這是一個 Forgejo 的錯誤,請在 <a href="%s" target="_blank">Codeberg</a> 上搜尋相關議題,或在必要時提出一個新議題。
|
||||
server_internal = 伺服器內部錯誤
|
||||
|
||||
[startpage]
|
||||
|
@ -713,7 +714,7 @@ show_on_map = 在地圖上顯示這個地點
|
|||
settings = 使用者設定
|
||||
block_user = 封鎖使用者
|
||||
block_user.detail_1 = 你們將停止互相關注,並且無法互相關注。
|
||||
block_user.detail_2 = 此使用者將無法與你擁有的儲存庫或由你建立的問題和評論進行互動。
|
||||
block_user.detail_2 = 此使用者將無法與你擁有的儲存庫或由你建立的議題和評論進行互動。
|
||||
followers_one = %d 位追蹤者
|
||||
following_one = 追蹤 %d 個人
|
||||
block_user.detail_3 = 你們將無法互相新增為儲存庫協作者。
|
||||
|
@ -1013,7 +1014,7 @@ uploaded_avatar_is_too_big = 上傳檔案的大小 (%d KiB)超過了上限
|
|||
select_permissions = 選擇權限
|
||||
permission_write = 讀寫
|
||||
permissions_list = 權限:
|
||||
add_email_confirmation_sent = 我們已發送一封確認信至 「%s」。請檢查您的信箱並在 %s 內確認您的信箱地址。
|
||||
add_email_confirmation_sent = 確認信已發送至「%s」。請在接下來的 %s 內前往收件匣查看該郵件,並點擊其中的連結以完成電子郵件地址的確認。
|
||||
repo_and_org_access = 儲存庫和組織存取權
|
||||
permissions_public_only = 僅公開
|
||||
permissions_access_all = 全部(公開、私有和受限)
|
||||
|
@ -1027,9 +1028,9 @@ unbind_success = 已成功移除該社群帳號。
|
|||
create_oauth2_application_success = 您已成功建立一個新的 OAuth2 應用程式。
|
||||
change_username_prompt = 註:更改您的使用者名稱也會更改您的帳號 URL。
|
||||
change_username_redirect_prompt = 舊的使用者名稱在被其他使用者認領之前將會轉址到新的使用者名稱。
|
||||
visibility.limited_tooltip = 只有已登入的使用者能看見
|
||||
visibility.limited_tooltip = 僅對已登入的使用者可見
|
||||
visibility.private_tooltip = 只有您加入的組織之成員能看見
|
||||
keep_email_private_popup = 這將在您的個人資料頁面、合併請求或網頁檔案編輯器中隱藏您的電子信箱地址。已推送的提交不會被修改。在提交中使用 %s 來將其連結至您的帳號。
|
||||
keep_email_private_popup = 您的電子郵件地址不會顯示在個人資料頁面中,也不會成為透過網頁介面(例如上傳檔案、編輯或合併提交)所建立的提交紀錄的預設地址。取而代之的是,可以使用特殊地址 %s 將這些提交關聯到您的帳號。此設定不會影響既有的提交紀錄。
|
||||
ssh_signonly = 因為目前 SSH 已被停用,這個金鑰只被用來校驗提交簽署。
|
||||
email_desc = 您的主要電子信箱將被用於通知、密碼復原、和網頁 Git 操作(如果您的信箱不是隱藏的)。
|
||||
pronouns_custom = 自訂
|
||||
|
@ -1076,6 +1077,20 @@ quota.sizes.assets.attachments.all = 附件
|
|||
quota.sizes.assets.artifacts = 製品
|
||||
quota.sizes.wiki = 百科
|
||||
quota = 配額
|
||||
access_token_regeneration = 重新產生存取符記
|
||||
access_token_regeneration_desc = 重新產生存取符記將會撤銷使用該符記的應用程式對您帳號的存取權限,此操作無法還原。是否繼續?
|
||||
regenerate_token_success = 符記已重新產生。使用該符記的應用程式將不再具有你帳號的存取權限,必須更新為新的符記後才能繼續使用。
|
||||
quota.applies_to_user = 以下配額規則適用於您的帳號
|
||||
quota.applies_to_org = 以下配額規則適用於此組織
|
||||
quota.rule.exceeded.helper = 符合此規則的物件總大小已超出配額限制。
|
||||
quota.sizes.repos.public = 公開儲存庫
|
||||
quota.sizes.repos.private = 私有儲存庫
|
||||
quota.sizes.git.all = Git 內容
|
||||
quota.sizes.git.lfs = Git LFS
|
||||
quota.sizes.assets.attachments.issues = 問題附件
|
||||
quota.sizes.assets.attachments.releases = 版本發布附件
|
||||
keep_pronouns_private = 僅向已驗證的使用者顯示代名詞
|
||||
keep_pronouns_private.description = 這將對未登入的訪客隱藏您的代名詞。
|
||||
|
||||
[repo]
|
||||
owner=所有者
|
||||
|
@ -1147,7 +1162,7 @@ forks=分叉
|
|||
reactions_more=和其他 %d 個
|
||||
unit_disabled=網站管理員已經停用這個儲存庫區域。
|
||||
language_other=其他
|
||||
adopt_search=輸入帳號以搜尋未接管的儲存庫... (留白以查詢全部)
|
||||
adopt_search=輸入帳號以搜尋未接管的儲存庫... (留白以查詢全部)
|
||||
adopt_preexisting_label=接管檔案
|
||||
adopt_preexisting=接管既有的檔案
|
||||
adopt_preexisting_content=從 %s 建立儲存庫
|
||||
|
@ -1362,7 +1377,7 @@ editor.filename_cannot_be_empty=檔案名稱不能為空。
|
|||
editor.filename_is_invalid=檔名無效:「%s」。
|
||||
editor.branch_does_not_exist=此儲存庫沒有名為「%s」的分支。
|
||||
editor.branch_already_exists=此儲存庫已有名為「%s」的分支。
|
||||
editor.file_changed_while_editing=檔案內容在您編輯時已被更改。<a target="_blank" rel="noopener noreferrer" href="%s">按一下此處</a>來檢視被更改的地方或<strong>再次提交</strong>以覆蓋這些變更。
|
||||
editor.file_changed_while_editing=檔案內容自您開啟後已有變更。<a target="_blank" rel="noopener noreferrer" href="%s">點此查看</a>,或<strong>再次提交變更</strong>以覆寫原內容。
|
||||
editor.file_already_exists=此儲存庫已有名為「%s」的檔案。
|
||||
editor.commit_empty_file_header=提交空白檔案
|
||||
editor.commit_empty_file_text=你準備提交的檔案是空白的,是否繼續?
|
||||
|
@ -1581,7 +1596,7 @@ issues.commented_at=`已留言 <a href="#%s"> %s</a>`
|
|||
issues.delete_comment_confirm=您確定要刪除這則留言嗎?
|
||||
issues.context.copy_link=複製連結
|
||||
issues.context.quote_reply=引用回覆
|
||||
issues.context.reference_issue=新增問題並參考
|
||||
issues.context.reference_issue=在新問題中引用
|
||||
issues.context.edit=編輯
|
||||
issues.context.delete=刪除
|
||||
issues.close=關閉問題
|
||||
|
@ -1594,8 +1609,8 @@ issues.reopened_at=`重新開放了這個問題 <a id="%[1]s" href="#%[1]s">%[2]
|
|||
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 href="%[3]s">關聯了合併請求 %[4]s 將關閉這個問題</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||
issues.ref_reopening_from=`<a href="%[3]s">關聯了合併請求 %[4]s 將重新開放這個問題</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||
issues.ref_closing_from=<a href="%[3]s">從將關閉此問題的拉取請求 %[4]s 中提及了此問題</a>,<a id="%[1]s" href="#%[1]s">%[2]s</a>
|
||||
issues.ref_reopening_from=<a href="%[3]s">從將重新開啟此問題的拉取請求 %[4]s 中提及了此問題</a>,<a id="%[1]s" href="#%[1]s">%[2]s</a>
|
||||
issues.ref_closed_from=`<a href="%[3]s">關閉了這個問題 %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||
issues.ref_reopened_from=`<a href="%[3]s">重新開放了這個問題 %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||
issues.ref_from=`自 %[1]s`
|
||||
|
@ -1644,8 +1659,8 @@ issues.unlock=解鎖對話
|
|||
issues.lock.unknown_reason=由於未知的原因而無法鎖定問題。
|
||||
issues.lock_duplicate=問題無法被鎖定兩次。
|
||||
issues.unlock_error=無法解鎖未被鎖定的問題。
|
||||
issues.lock_with_reason=因為 <strong>%s</strong> 而鎖定,並將對話設為協作者限定 %s
|
||||
issues.lock_no_reason=鎖定並將對話設為協作者限定 %s
|
||||
issues.lock_with_reason=因為 <strong>%s</strong> 而鎖定,並將對話限制為協作者 %s
|
||||
issues.lock_no_reason=鎖定並將對話限制為協作者 %s
|
||||
issues.unlock_comment=解鎖這個對話 %s
|
||||
issues.lock_confirm=鎖定
|
||||
issues.unlock_confirm=解除鎖定
|
||||
|
@ -1739,8 +1754,8 @@ issues.review.left_comment=留下了回應
|
|||
issues.review.content.empty=您必須留下訊息指出需要修正的地方。
|
||||
issues.review.reject=請求了變更 %s
|
||||
issues.review.wait=被請求進行審核 %s
|
||||
issues.review.add_review_request=請求了 %s 來審核 %s
|
||||
issues.review.remove_review_request=移除了對 %s 的審核請求 %s
|
||||
issues.review.add_review_request=請求 %[1]s 進行審查 %[2]s
|
||||
issues.review.remove_review_request=移除了對 %[1]s 的審查請求 %[2]s
|
||||
issues.review.remove_review_request_self=拒絕了審核 %s
|
||||
issues.review.pending=待處理
|
||||
issues.review.review=審核
|
||||
|
@ -1824,7 +1839,7 @@ pulls.reject_count_1=%d 個變更請求
|
|||
pulls.reject_count_n=%d 個變更請求
|
||||
pulls.waiting_count_1=%d 個正在等待審核
|
||||
pulls.waiting_count_n=%d 個正在等待審核
|
||||
pulls.wrong_commit_id=提交 id 必須存在於目標分支上
|
||||
pulls.wrong_commit_id=提交 ID 必須存在於目標分支上
|
||||
|
||||
pulls.no_merge_desc=無法進行合併,因為所有儲存庫的合併選項已被停用。
|
||||
pulls.no_merge_helper=在儲存庫設定啟用合併選項或手動合併該合併請求。
|
||||
|
@ -1840,13 +1855,13 @@ pulls.merge_commit_id=合併提交 ID
|
|||
pulls.require_signed_wont_sign=該分支需要經簽署的提交,但此合併將不會被簽署
|
||||
|
||||
pulls.invalid_merge_option=您無法對此合併請求使用這個合併選項。
|
||||
pulls.merge_conflict=合併失敗:合併時發生衝突。 提示:請嘗試不同的策略
|
||||
pulls.merge_conflict=合併失敗:合併時發生衝突。 提示:請嘗試其他的合併策略
|
||||
pulls.merge_conflict_summary=錯誤訊息
|
||||
pulls.rebase_conflict=合併失敗:Rebase 提交時發生衝突:%[1]s。 提示:請嘗試不同的策略
|
||||
pulls.rebase_conflict=合併失敗:Rebase 提交時發生衝突:%[1]s。 提示:請嘗試其他的合併策略
|
||||
pulls.rebase_conflict_summary=錯誤訊息
|
||||
pulls.unrelated_histories=合併失敗:要合併的 HEAD 和基底分支沒有共同的歷史。 提示:請嘗試不同的策略
|
||||
pulls.unrelated_histories=合併失敗:要合併的 HEAD 和基底分支沒有共同的歷史。 提示:請嘗試其他的合併策略
|
||||
pulls.merge_out_of_date=合併失敗:產生合併時,基底已被更新。提示:再試一次。
|
||||
pulls.head_out_of_date=合併失敗:產生合併時,head 已被更新。提示:再試一次。
|
||||
pulls.head_out_of_date=合併失敗:產生合併時,HEAD 已被更新。提示:再試一次。
|
||||
pulls.push_rejected=合併失敗:此推送被拒絕。請檢查此儲存庫的 Git Hook。
|
||||
pulls.push_rejected_summary=完整的拒絕訊息
|
||||
pulls.push_rejected_no_message=推送失敗:此推送被拒絕但未提供其他資訊。請檢查此儲存庫的 Git Hook
|
||||
|
@ -2082,7 +2097,7 @@ settings.pulls.default_allow_edits_from_maintainers=預設允許維護者進行
|
|||
settings.releases_desc=啟用儲存庫版本發佈
|
||||
settings.packages_desc=啟用儲存庫軟體包註冊中心
|
||||
settings.projects_desc=啟用儲存庫專案
|
||||
settings.actions_desc=啟用儲存庫 Actions
|
||||
settings.actions_desc=啟用與 Forgejo Actions 整合的 CI/CD 流程
|
||||
settings.admin_settings=管理員設定
|
||||
settings.admin_enable_health_check=啟用儲存庫的健康檢查(git fsck)
|
||||
settings.admin_code_indexer=程式碼索引器
|
||||
|
@ -2181,7 +2196,7 @@ settings.webhook.payload=內容
|
|||
settings.webhook.body=本體
|
||||
settings.webhook.replay.description=再次執行此 Webhook。
|
||||
settings.webhook.delivery.success=已將事件加入到傳送佇列,可能需要等待幾分鐘才會出現於傳送紀錄。
|
||||
settings.githooks_desc=Git Hook 是 Git 本身提供的功能。您可以在下方編輯 hook 檔案以設定自訂作業。
|
||||
settings.githooks_desc=Git hook 是 Git 本身提供的功能。您可以在下方編輯 hook 檔案以設定自訂作業。
|
||||
settings.githook_edit_desc=如果 Hook 未啟動,則會顯示範例文件中的內容。如果想要刪除某個 Hook,則送出空白內容即可。
|
||||
settings.githook_name=Hook 名稱
|
||||
settings.githook_content=Hook 內容
|
||||
|
@ -2232,15 +2247,15 @@ settings.event_pull_request_desc=建立、編輯、關閉及重新開放合併
|
|||
settings.event_pull_request_assign=指派
|
||||
settings.event_pull_request_assign_desc=指派或取消指派合併請求。
|
||||
settings.event_pull_request_label=標籤
|
||||
settings.event_pull_request_label_desc=更新或清除合併請求標籤。
|
||||
settings.event_pull_request_label_desc=已新增或移除合併請求的標籤。
|
||||
settings.event_pull_request_milestone=里程碑
|
||||
settings.event_pull_request_milestone_desc=里程碑已新增、已移除或已修改。
|
||||
settings.event_pull_request_comment=評註
|
||||
settings.event_pull_request_comment_desc=建立、編輯或刪除合併請求的留言。
|
||||
settings.event_pull_request_review=審核
|
||||
settings.event_pull_request_review_desc=核准、退回或提出審核留言。
|
||||
settings.event_pull_request_review_desc=合併請求已被核准、拒絕,或已有審查留言新增。
|
||||
settings.event_pull_request_sync=同步
|
||||
settings.event_pull_request_sync_desc=合併請求同步。
|
||||
settings.event_pull_request_sync_desc=分支已自動與目標分支同步更新。
|
||||
settings.event_package=軟體包
|
||||
settings.event_package_desc=已在儲存庫中建立或刪除軟體包。
|
||||
settings.branch_filter=分支篩選
|
||||
|
@ -2352,7 +2367,7 @@ settings.choose_branch=選擇一個分支…
|
|||
settings.no_protected_branch=沒有受保護的分支。
|
||||
settings.edit_protected_branch=編輯
|
||||
settings.protected_branch_required_rule_name=必須填寫規則名稱
|
||||
settings.protected_branch_duplicate_rule_name=規則名稱已存在
|
||||
settings.protected_branch_duplicate_rule_name=已經存在一條針對這組分支的規則
|
||||
settings.protected_branch_required_approvals_min=需要的核可數量不能為負數。
|
||||
settings.tags=標籤
|
||||
settings.tags.protection=標籤保護
|
||||
|
@ -2486,7 +2501,7 @@ release.tag_helper=新增或選擇現有的標籤。
|
|||
release.tag_helper_new=新標籤,將在目標上建立此標籤。
|
||||
release.tag_helper_existing=現有的標籤。
|
||||
release.title_empty=標題不可為空。
|
||||
release.prerelease_desc=標記為 Pre-Release
|
||||
release.prerelease_desc=標記為預發行
|
||||
release.prerelease_helper=標記此版本不適合生產使用。
|
||||
release.cancel=取消
|
||||
release.publish=發佈發行
|
||||
|
@ -2629,10 +2644,10 @@ issues.filter_milestone_all = 所有里程碑
|
|||
issues.author_helper = 此使用者是作者。
|
||||
pulls.blocked_by_approvals = 此合併請求還沒有足夠的核可。已有 %d 個,總共需要 %d 個核可。
|
||||
wiki.search = 搜尋百科
|
||||
settings.mirror_settings.docs.disabled_pull_mirror.instructions = 設定您的儲存庫以自動推送提交、標簽、和分支至另一個儲存庫。Pull 鏡像已被您的管理員停用。
|
||||
settings.mirror_settings.docs.disabled_pull_mirror.instructions = 設定你的專案使其自動將提交、標籤與分支推送到另一個儲存庫。您的網站管理員已停用拉取鏡像功能。
|
||||
settings.mirror_settings.docs = 設定您的儲存庫以自動與另一個儲存庫同步提交、標籤、和分支。
|
||||
settings.mirror_settings.docs.disabled_push_mirror.info = 推送鏡像已被您的網站管理員停用。
|
||||
settings.mirror_settings.docs.pull_mirror_instructions = 如需建立一個 pull 鏡像,請參閱:
|
||||
settings.mirror_settings.docs.pull_mirror_instructions = 如需建立一個拉取鏡像,請參閱:
|
||||
blame.ignore_revs = <a href="%s">.git-blame-ignore-revs</a> 中的修訂已被忽略。點擊<a href="%s">這裡</a>來檢視一般的責任歸屬界面。
|
||||
editor.file_is_a_symlink = `「%s」是一個符號連結。網頁編輯器無法編輯符號連結`
|
||||
issues.label_archive = 封存標籤
|
||||
|
@ -2644,7 +2659,7 @@ pulls.showing_only_single_commit = 只顯示提交 %[1]s 的變更
|
|||
pulls.cmd_instruction_merge_desc = 合併更改並在 Forgejo 上更新。
|
||||
signing.wont_sign.pubkey = 無法簽署該提交,因為您沒有與您帳號連結的公鑰。
|
||||
signing.wont_sign.twofa = 您必須啟用兩步驟認證才能簽署提交。
|
||||
signing.wont_sign.basesigned = 因為 base 提交沒有被簽署,無法簽署該提交。
|
||||
signing.wont_sign.basesigned = 合併將不會被簽署,因為其基礎提交尚未簽署。
|
||||
settings.mirror_settings.docs.disabled_push_mirror.pull_mirror_warning = 目前,這個操作只能在「新的遷移」目錄完成。如需更多資訊,請參閱:
|
||||
settings.mirror_settings.docs.disabled_push_mirror.instructions = 設定您的儲存庫以自動從另一個儲存庫拉取提交、標籤和分支。
|
||||
issues.role.contributor_helper = 該使用者過去曾經提交至此儲存庫。
|
||||
|
@ -2657,14 +2672,14 @@ signing.wont_sign.error = 在檢查是否能簽署提交時發生錯誤。
|
|||
issues.num_participants_one = %d 位參與者
|
||||
pulls.showing_specified_commit_range = 只顯示 %[1]s 至 %[2]s 之間的變更
|
||||
blame.ignore_revs.failed = 忽略 <a href="%s">.git-blame-ignore-revs</a> 中的修訂失敗。
|
||||
issues.blocked_by_user = 因為您被該儲存庫的所有者封鎖,您不能提出一個新的問題。
|
||||
issues.blocked_by_user = 因為您已被儲存庫擁有者封鎖,您無法在此儲存庫中建立問題。
|
||||
pulls.blocked_by_user = 因為您被這個儲存庫的所有者封鎖,您不能在這裡開啟一個合併請求。
|
||||
pulls.has_merged = 失敗:該合併請求已被合併,您無法再合併一次或更改目標分支。
|
||||
wiki.cancel = 取消
|
||||
activity.navbar.code_frequency = 寫程式頻率
|
||||
settings.mirror_settings.docs.no_new_mirrors = 您的儲存庫目前是另一個儲存庫的鏡像。請記住,您目前不能建立新的鏡像。
|
||||
settings.mirror_settings.docs.can_still_use = 雖然您不能建立新的鏡像,您還是可以使用既有的鏡像。
|
||||
pulls.reopen_failed.base_branch = 因為這個合併請求的 base 分支不存在,它無法被開啟。
|
||||
pulls.reopen_failed.base_branch = 因為這個合併請求的基礎分支不存在,它無法被開啟。
|
||||
issues.label_archive_tooltip = 在預設情況下,標籤搜尋時會排除被封存的標籤。
|
||||
signing.wont_sign.approved = 因為合併請求沒有被核可,這個合併不會被簽署。
|
||||
activity.navbar.recent_commits = 最近的提交
|
||||
|
@ -2679,7 +2694,7 @@ editor.push_out_of_date = 該推送似乎過期了。
|
|||
issues.cancel_tracking_history = `已取消時間追蹤 %s`
|
||||
issues.due_date_not_writer = 您需要有寫入這個儲存庫的權限才能更新其問題的到期日。
|
||||
pulls.commit_ref_at = `在提交 <a id="%[1]s" href="#%[1]s">%[2]s</a> 引用了這個合併請求`
|
||||
pulls.cmd_instruction_checkout_desc = 從您的專案儲存庫 checkout 一個新的分支來測試這些更改。
|
||||
pulls.cmd_instruction_checkout_desc = 從您的專案儲存庫中,建立並切換到一個新分支以測試這些變更。
|
||||
pulls.cmd_instruction_merge_title = 合併
|
||||
pulls.ready_for_review = 可以開始審閱了嗎?
|
||||
pulls.cmd_instruction_hint = `檢視命令列指示`
|
||||
|
@ -2704,7 +2719,7 @@ pulls.blocked_by_changed_protected_files_1 = 這個合併請求被暫止,因
|
|||
pulls.blocked_by_changed_protected_files_n = 這個合併請求被暫止,因為它更改了這些受保護的檔案:
|
||||
pulls.status_checks_hide_all = 隱藏所有檢查
|
||||
pulls.status_checks_show_all = 顯示所有檢查
|
||||
pulls.reopen_failed.head_branch = 因為這個合併請求的 head 分支不存在,它無法被開啟。
|
||||
pulls.reopen_failed.head_branch = 因為這個合併請求的 HEAD 分支不存在,無法重新開啟此合併請求。
|
||||
activity.navbar.pulse = 動態
|
||||
signing.will_sign = 將以金鑰「%s」簽署這個提交。
|
||||
signing.wont_sign.headsigned = 因為 head 提交沒有被簽署,這個合併不會被簽署。
|
||||
|
@ -2721,7 +2736,7 @@ pulls.show_changes_since_your_last_review = 顯示自您上次審閱的變更
|
|||
pulls.blocked_by_rejection = 這個合併請求有正式審閱者所請求的更改。
|
||||
pulls.blocked_by_official_review_requests = 因為這個合併請求還缺少至少一個正式審閱者的核可,它已被暫止。
|
||||
wiki.original_git_entry_tooltip = 與其使用友善連結,檢視原始 Git 檔案。
|
||||
settings.mirror_settings.docs.more_information_if_disabled = 您可以在這裡找到更多關於 push 和 pull 鏡像的資訊:
|
||||
settings.mirror_settings.docs.more_information_if_disabled = 您可以在這裡找到更多關於推送和拉取鏡像的資訊:
|
||||
settings.mirror_settings.docs.doc_link_title = 如何建立儲存庫鏡像?
|
||||
settings.mirror_settings.docs.pulling_remote_title = 從遠端儲存庫拉取
|
||||
issues.author.tooltip.pr = 此使用者是這個合併請求的作者。
|
||||
|
@ -2872,12 +2887,40 @@ settings.units.units = 功能
|
|||
diff.git-notes.add = 增加註釋
|
||||
diff.git-notes.remove-header = 移除註釋
|
||||
settings.event_pull_request_enforcement = 執行
|
||||
sync_fork.branch_behind_few = 此分支落後 %[2]s %[1]d 次提交
|
||||
sync_fork.branch_behind_few = 此分支落後 %[2]s 共 %[1]d 次提交
|
||||
sync_fork.button = 同步
|
||||
sync_fork.branch_behind_one = 此分支落後 %[2]s %[1]d 次提交
|
||||
issues.review.remove_review_requests = 移除了對 %[1]s 的審查請求 %[2]s
|
||||
issues.filter_no_results_placeholder = 嘗試調整您的搜尋篩選條件。
|
||||
issues.reaction.alt_add = 對留言添加 %[1]s 個反應。
|
||||
issues.reopen.blocked_by_user = 您無法重新開啟此問題,因為您已被儲存庫擁有者或此問題的發佈者封鎖。
|
||||
issues.filter_no_results = 沒有結果
|
||||
archive.nocomment = 您無法留言,因為此儲存庫已被封存。
|
||||
migrate.repo_desc_helper = 如欲匯入現有描述請留空
|
||||
comment.blocked_by_user = 您無法留言,因為您已被儲存庫擁有者或作者封鎖。
|
||||
pulls.editable_explanation = 此合併請求允許維護者進行編輯。您可以直接參與貢獻。
|
||||
pulls.agit_explanation = 此合併請求使用 AGit 工作流程建立。AGit 允許貢獻者透過「git push」提出變更,無需建立分支或分叉。
|
||||
issues.review.add_remove_review_requests = 請求 %[1]s 進行審查,並取消了對 %[2]s 的審查請求 %[3]s
|
||||
pulls.cmd_instruction_merge_warning = <b>警告:</b>此儲存庫尚未啟用「自動偵測手動合併」設定,您之後需要手動標記此合併請求為已合併。
|
||||
issues.review.add_review_requests = 請求 %[1]s 進行審查 %[2]s
|
||||
settings.event_header_action = Action 執行事件
|
||||
settings.event_action_failure = 失敗
|
||||
settings.event_action_recover = 恢復
|
||||
settings.event_action_recover_desc = Action 執行成功,先前同一工作流程中的 Action 執行曾經失敗。
|
||||
settings.event_action_success = 成功
|
||||
settings.event_action_success_desc = Action 執行成功。
|
||||
settings.sourcehut_builds.manifest_path = 建置清單路徑
|
||||
settings.sourcehut_builds.visibility = 作業可見性
|
||||
settings.event_action_failure_desc = Action 執行以失敗結束。
|
||||
settings.protect_branch_name_pattern_desc = 受保護分支名稱的模式。請參閱<a href="%s">文件說明</a>以了解模式語法。範例:main、release/**
|
||||
settings.sourcehut_builds.access_token_helper = 具有 JOBS:RW 權限的存取權杖。請在 meta.sr.ht 上產生一個 <a target="_blank" rel="noopener noreferrer" href="%s">builds.sr.ht 權杖</a>,或一個 <a target="_blank" rel="noopener noreferrer" href="%s">具有機密存取權限的 builds.sr.ht 權杖</a>。
|
||||
settings.matrix.room_id_helper = 可從 Element 網頁版客戶端取得 Room ID:進入房間設定 > 進階 > Internal room ID。範例:%s。
|
||||
settings.web_hook_name_sourcehut_builds = SourceHut Builds
|
||||
diff.git-notes.remove-body = 此注釋將會被移除。
|
||||
settings.sourcehut_builds.secrets_helper = 授權此作業存取建置機密(需要 SECRETS:RO 權限)
|
||||
|
||||
[graphs]
|
||||
component_loading = %s載入中…
|
||||
component_loading = 正在載入 %s…
|
||||
code_frequency.what = 寫程式頻率
|
||||
recent_commits.what = 最近的提交
|
||||
contributors.what = 貢獻
|
||||
|
@ -2920,7 +2963,7 @@ settings.permission=權限
|
|||
settings.repoadminchangeteam=儲存庫管理者可增加與移除團隊權限
|
||||
settings.visibility=瀏覽權限
|
||||
settings.visibility.public=公開
|
||||
settings.visibility.limited=受限(只有已驗證的使用者才可以看到)
|
||||
settings.visibility.limited=受限(僅對已登入使用者可見)
|
||||
settings.visibility.limited_shortname=受限
|
||||
settings.visibility.private=私有(只有組織成員才能看到)
|
||||
settings.visibility.private_shortname=私有
|
||||
|
@ -3096,8 +3139,8 @@ dashboard.total_gc_time=總 GC 暫停時間
|
|||
dashboard.total_gc_pause=總 GC 暫停時間
|
||||
dashboard.last_gc_pause=上次 GC 暫停時間
|
||||
dashboard.gc_times=GC 執行次數
|
||||
dashboard.delete_old_actions=從資料庫刪除所有舊行為
|
||||
dashboard.delete_old_actions.started=從資料庫刪除所有舊行為的任務已啟動。
|
||||
dashboard.delete_old_actions=從資料庫刪除所有舊操作紀錄
|
||||
dashboard.delete_old_actions.started=從資料庫刪除所有舊操作紀錄的任務已啟動。
|
||||
dashboard.update_checker=更新檢查器
|
||||
dashboard.delete_old_system_notices=從資料庫刪除所有舊系統提示
|
||||
dashboard.gc_lfs=對 LFS meta objects 進行垃圾回收
|
||||
|
@ -3117,7 +3160,7 @@ users.repos=儲存庫數
|
|||
users.created=建立時間
|
||||
users.last_login=上次登入
|
||||
users.never_login=從未登入
|
||||
users.send_register_notify=寄送使用者註冊通知
|
||||
users.send_register_notify=透過電子郵件傳送註冊通知
|
||||
users.new_success=已建立新帳號「%s」。
|
||||
users.edit=編輯
|
||||
users.auth_source=認證來源
|
||||
|
@ -3133,7 +3176,7 @@ users.prohibit_login=已停權帳號
|
|||
users.is_admin=管理員帳號
|
||||
users.is_restricted=受限制的帳號
|
||||
users.allow_git_hook=可以建立 Git Hook
|
||||
users.allow_git_hook_tooltip=Git Hook 將以和 Forgejo 相同的作業系統使用者執行,並擁有同等的主機存取權限。因此擁有此特殊 Git Hook 權限的使用者可存取和修改所有的 Forgejo 儲存庫和 Forgejo 的資料庫。他們甚至能取得 Forgejo 的管理員權限。
|
||||
users.allow_git_hook_tooltip=Git hooks 會以執行 Forgejo 的作業系統使用者身分執行,並擁有相同等級的主機存取權限。因此,擁有此特殊 Git hook 權限的使用者,可以存取並修改所有 Forgejo 儲存庫,以及 Forgejo 使用的資料庫。換句話說,他們也具備取得 Forgejo 管理員權限的能力。
|
||||
users.allow_import_local=可以匯入本地儲存庫
|
||||
users.allow_create_organization=可以建立組織
|
||||
users.update_profile=更新使用者帳號
|
||||
|
@ -3335,7 +3378,7 @@ 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.repo_root_path=儲存庫根路徑
|
||||
|
@ -3440,8 +3483,8 @@ config.enable_federated_avatar=啟用聯邦式大頭貼
|
|||
|
||||
config.git_config=Git 設定
|
||||
config.git_disable_diff_highlight=停用比較語法高亮
|
||||
config.git_max_diff_lines=差異比較時顯示的最多行數 (單檔)
|
||||
config.git_max_diff_line_characters=差異比較時顯示的最多字元數 (單行)
|
||||
config.git_max_diff_lines=差異比較時顯示的最多行數
|
||||
config.git_max_diff_line_characters=差異比較時顯示的最多字元數
|
||||
config.git_max_diff_files=差異比較時顯示的最多檔案數
|
||||
config.git_gc_args=GC 參數
|
||||
config.git_migrate_timeout=遷移逾時
|
||||
|
@ -3599,7 +3642,7 @@ mirror_sync_create=從鏡像同步了新參考 <a href="%[2]s">%[3]s</a> 到 <a
|
|||
mirror_sync_delete=已從鏡像同步並從 <a href="%[1]s">%[3]s</a> 刪除了參考 <code>%[2]s</code>
|
||||
approve_pull_request=`核可了 <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||
reject_pull_request=`提出了修改建議 <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||
publish_release=`發布了 <a href="%[1]s">%[3]s</a> 的 <a href="%[2]s"> "%[4]s" </a>`
|
||||
publish_release=`已於 <a href="%[1]s">%[3]s</a> 發佈 <a href="%[2]s">%[4]s</a>`
|
||||
review_dismissed=`取消了 <b>%[4]s</b> 對 <a href="%[1]s">%[3]s#%[2]s</a> 的審核`
|
||||
review_dismissed_reason=原因:
|
||||
create_branch=在 <a href="%[1]s">%[4]s</a> 中建立了分支 <a href="%[2]s">%[3]s</a>
|
||||
|
@ -3817,7 +3860,7 @@ arch.version.depends = 依賴
|
|||
owner.settings.cargo.rebuild.no_index = 無法重建,未初始化任何索引。
|
||||
cran.registry = 在你的 <code>Rprofile.site</code> 檔案中設定此註冊表:
|
||||
debian.repository.distributions = 發行版
|
||||
owner.settings.chef.keypair.description = 需要金鑰對才能向 Chef 註冊表進行身份驗證。如果你之前已經產生過金鑰對,產生新的金鑰對將會丟棄舊的金鑰對。
|
||||
owner.settings.chef.keypair.description = 送往 Chef 註冊表的請求必須經過加密簽署,以作為驗證身分的方式。在產生金鑰對時,只有公鑰會儲存在 Forgejo 上,私鑰則會提供給你用於 knife 工具。產生新的金鑰對將會覆蓋先前的金鑰。
|
||||
owner.settings.cargo.initialize.description = 使用 Cargo 註冊表需要一個特殊的索引 Git 儲存庫。使用此選項將會(重新)建立儲存庫並自動配置它。
|
||||
rpm.repository.multiple_groups = 此套件可以在多個群組中使用。
|
||||
rpm.distros.suse = 在基於 SUSE 的發行版上
|
||||
|
@ -3839,6 +3882,7 @@ registry.documentation = 有關 %s 註冊表的更多資訊,請參閱<a target
|
|||
alt.registry.install = 若要安裝軟體包,執行以下命令:
|
||||
alt.repository.multiple_groups = 此軟體包在多個群組中可用。
|
||||
alt.setup = 新增儲存庫至已連接的儲存庫清單(選擇必要的架構結構而非「_arch_」):
|
||||
arch.version.makedepends = 編譯依賴
|
||||
|
||||
[secrets]
|
||||
secrets=Secret
|
||||
|
@ -3999,9 +4043,9 @@ commit_kind = 搜尋提交…
|
|||
code_search_by_git_grep = 目前搜尋結果由「git grep」提供。如果網站管理員啟用程式碼索引,可能會有更好的結果。
|
||||
exact = 精確
|
||||
milestone_kind = 搜尋里程碑...
|
||||
issue_kind = 搜尋問題…
|
||||
issue_kind = 搜尋議題…
|
||||
exact_tooltip = 只包含與搜尋詞完全相符的結合
|
||||
pull_kind = 搜尋拉取…
|
||||
pull_kind = 搜尋合併請求…
|
||||
regexp = 正規表示式
|
||||
regexp_tooltip = 將搜尋詞解釋為正規表示式
|
||||
union = 關鍵字
|
||||
|
@ -4027,4 +4071,20 @@ test = 好的
|
|||
|
||||
[repo.permissions]
|
||||
ext_issues = 存取外部問題追蹤器的連結。權限由外部管理。
|
||||
ext_wiki = 存取外部百科的連結。權限由外部管理。
|
||||
ext_wiki = 存取外部百科的連結。權限由外部管理。
|
||||
issues.read = <b>讀取:</b>查看並建立問題與留言。
|
||||
releases.write = <b>寫入:</b>發布、編輯與刪除發行版本及其資源。
|
||||
wiki.read = <b>讀取:</b>查看整合的 Wiki 及其歷史紀錄。
|
||||
code.write = <b>寫入:</b>推送到儲存庫,建立分支與標籤。
|
||||
code.read = <b>讀取:</b>存取並複製此儲存庫的原始碼。
|
||||
issues.write = <b>寫入:</b>關閉問題,並管理標籤、里程碑、指派對象、到期日與依賴關係等中繼資料。
|
||||
pulls.read = <b>讀取:</b>查看並建立合併請求。
|
||||
pulls.write = <b>寫入:</b>關閉合併請求,並管理標籤、里程碑、指派對象、到期日與依賴關係等中繼資料。
|
||||
releases.read = <b>讀取:</b>檢視並下載發行版本。
|
||||
wiki.write = <b>寫入:</b>在整合的 Wiki 中建立、更新與刪除頁面。
|
||||
projects.read = <b>讀取:</b>存取儲存庫的專案看板。
|
||||
packages.write = <b>寫入:</b>發布與刪除指派給此儲存庫的套件。
|
||||
projects.write = <b>寫入:</b>建立專案與欄位,並編輯它們。
|
||||
packages.read = <b>讀取:</b>檢視並下載指派給此儲存庫的套件。
|
||||
actions.read = <b>讀取:</b>查看整合的 CI/CD 流程及其紀錄。
|
||||
actions.write = <b>寫入:</b>手動觸發、重新啟動、取消或核准待處理的 CI/CD 流程。
|
|
@ -1,10 +1,89 @@
|
|||
{
|
||||
"repo.pulls.merged_title_desc": {
|
||||
"one": "сля %[1]d подаване от <code>%[2]s</code> в <code>%[3]s</code> %[4]s",
|
||||
"other": "сля %[1]d подавания от <code>%[2]s</code> в <code>%[3]s</code> %[4]s"
|
||||
},
|
||||
"repo.pulls.title_desc": {
|
||||
"one": "иска да слее %[1]d подаване от <code>%[2]s</code> в <code id=\"%[4]s\">%[3]s</code>",
|
||||
"other": "иска да слее %[1]d подавания от <code>%[2]s</code> в <code id=\"%[4]s\">%[3]s</code>"
|
||||
}
|
||||
"repo.pulls.merged_title_desc": {
|
||||
"one": "сля %[1]d подаване от <code>%[2]s</code> в <code>%[3]s</code> %[4]s",
|
||||
"other": "сля %[1]d подавания от <code>%[2]s</code> в <code>%[3]s</code> %[4]s"
|
||||
},
|
||||
"repo.pulls.title_desc": {
|
||||
"one": "иска да слее %[1]d подаване от <code>%[2]s</code> в <code id=\"%[4]s\">%[3]s</code>",
|
||||
"other": "иска да слее %[1]d подавания от <code>%[2]s</code> в <code id=\"%[4]s\">%[3]s</code>"
|
||||
},
|
||||
"mail.actions.run_info_ref": "Клон: %[1]s (%[2]s)",
|
||||
"mail.actions.run_info_trigger": "Задействано поради: %[1]s от: %[2]s",
|
||||
"meta.last_line": "В България расте най-старото дърво в страната, Байкушевата мура, на възраст над 1300 години.",
|
||||
"relativetime.1day": "вчера",
|
||||
"relativetime.2months": "преди два месеца",
|
||||
"home.explore_repos": "Разглеждане на хранилища",
|
||||
"home.explore_users": "Разглеждане на потребители",
|
||||
"home.explore_orgs": "Разглеждане на организации",
|
||||
"relativetime.mins": {
|
||||
"one": "преди %d минута",
|
||||
"other": "преди %d минути"
|
||||
},
|
||||
"repo.form.cannot_create": "Всички пространства, в които можете да създавате хранилища, са достигнали лимита си на хранилища.",
|
||||
"moderation.report_remarks": "Подробности",
|
||||
"moderation.submit_report": "Изпращане на доклада",
|
||||
"followers.incoming.list.self.none": "Никой не следва вашия профил.",
|
||||
"followers.incoming.list.none": "Никой не следва този потребител.",
|
||||
"relativetime.now": "сега",
|
||||
"home.welcome.no_activity": "Няма дейност",
|
||||
"relativetime.1year": "миналата година",
|
||||
"moderation.abuse_category": "Категория",
|
||||
"moderation.abuse_category.illegal_content": "Незаконно съдържание",
|
||||
"home.welcome.activity_hint": "Все още няма нищо в емисията ви. Вашите действия и дейност от хранилищата, които наблюдавате, ще се появят тук.",
|
||||
"stars.list.none": "Никой не е отбелязал това хранилище със звезда.",
|
||||
"moderation.report_abuse_form.invalid": "Невалидни аргументи",
|
||||
"moderation.report_abuse_form.already_reported": "Вече сте докладвали това съдържание",
|
||||
"moderation.abuse_category.placeholder": "Изберете категория",
|
||||
"moderation.abuse_category.spam": "Спам",
|
||||
"repo.issue_indexer.title": "Индексатор на задачи",
|
||||
"moderation.report_abuse_form.details": "Този формуляр трябва да се използва за докладване на потребители, които създават спам профили, хранилища, задачи, коментари или се държат неподходящо.",
|
||||
"moderation.report_remarks.placeholder": "Моля, предоставете подробности относно злоупотребата, за която докладвате.",
|
||||
"moderation.reporting_failed": "Не може да се изпрати новият доклад за злоупотреба: %v",
|
||||
"moderation.reported_thank_you": "Благодарим ви за доклада. Администрацията е уведомена.",
|
||||
"error.not_found.title": "Страницата не е намерена",
|
||||
"incorrect_root_url": "Тази инстанция на Forgejo е конфигурирана да се сервира на \"%s\". В момента разглеждате Forgejo през друг URL адрес, което може да доведе до неправилно функциониране на части от приложението. Каноничният URL адрес се контролира от администраторите на Forgejo чрез настройката ROOT_URL в app.ini.",
|
||||
"themes.names.forgejo-dark": "Forgejo тъмна",
|
||||
"themes.names.forgejo-auto": "Forgejo (следване на системната тема)",
|
||||
"themes.names.forgejo-light": "Forgejo светла",
|
||||
"watch.list.none": "Никой не наблюдава това хранилище.",
|
||||
"followers.outgoing.list.self.none": "Не следвате никого.",
|
||||
"followers.outgoing.list.none": "%s не следва никого.",
|
||||
"relativetime.future": "в бъдеще",
|
||||
"relativetime.2days": "преди два дни",
|
||||
"relativetime.1week": "миналата седмица",
|
||||
"relativetime.2weeks": "преди две седмици",
|
||||
"relativetime.1month": "миналия месец",
|
||||
"relativetime.2years": "преди две години",
|
||||
"moderation.report_abuse_form.header": "Докладване на злоупотреба до администратора",
|
||||
"moderation.abuse_category.malware": "Зловреден софтуер",
|
||||
"moderation.abuse_category.other_violations": "Други нарушения на правилата на платформата",
|
||||
"alert.asset_load_failed": "Неуспешно зареждане на файлове с ресурси от {path}. Моля, уверете се, че файловете с ресурси са достъпни.",
|
||||
"alert.range_error": " трябва да бъде число между %[1]s и %[2]s.",
|
||||
"install.invalid_lfs_path": "Не може да се създаде LFS корен в посочения път: %[1]s",
|
||||
"search.milestone_kind": "Търсене на етапи…",
|
||||
"admin.config.moderation_config": "Конфигурация на модерацията",
|
||||
"moderation.report_abuse": "Докладване на злоупотреба",
|
||||
"moderation.report_content": "Докладване на съдържание",
|
||||
"relativetime.hours": {
|
||||
"one": "преди %d час",
|
||||
"other": "преди %d часа"
|
||||
},
|
||||
"relativetime.days": {
|
||||
"one": "преди %d ден",
|
||||
"other": "преди %d дни"
|
||||
},
|
||||
"relativetime.weeks": {
|
||||
"one": "преди %d седмица",
|
||||
"other": "преди %d седмици"
|
||||
},
|
||||
"relativetime.months": {
|
||||
"one": "преди %d месец",
|
||||
"other": "преди %d месеца"
|
||||
},
|
||||
"relativetime.years": {
|
||||
"one": "преди %d година",
|
||||
"other": "преди %d години"
|
||||
},
|
||||
"editor.textarea.tab_hint": "Редът вече е с отстъп. Натиснете отново <kbd>Tab</kbd> или <kbd>Escape</kbd>, за да излезете от редактора.",
|
||||
"editor.textarea.shift_tab_hint": "Няма отстъп на този ред. Натиснете отново <kbd>Shift</kbd> + <kbd>Tab</kbd> или <kbd>Escape</kbd>, за да излезете от редактора."
|
||||
}
|
||||
|
|
|
@ -100,5 +100,7 @@
|
|||
"stars.list.none": "Tento repozitář si nikdo nepřidal do oblíbených.",
|
||||
"followers.outgoing.list.self.none": "Nikoho nesledujete.",
|
||||
"editor.textarea.tab_hint": "Řádek je již odsazen. Pro opuštění editoru stiskněte znovu <kbd>Tab</kbd> nebo <kbd>Escape</kbd>.",
|
||||
"editor.textarea.shift_tab_hint": "Na tomto řádku není žádné odsazení. Pro opuštění editoru stiskněte znovu <kbd>Shift</kbd> + <kbd>Tab</kbd> nebo <kbd>Escape</kbd>."
|
||||
"editor.textarea.shift_tab_hint": "Na tomto řádku není žádné odsazení. Pro opuštění editoru stiskněte znovu <kbd>Shift</kbd> + <kbd>Tab</kbd> nebo <kbd>Escape</kbd>.",
|
||||
"admin.dashboard.cleanup_offline_runners": "Vymazat offline runnery",
|
||||
"settings.visibility.description": "Viditelnost profilu ovlivňuje možnost ostatních přistupovat k vašim veřejným repozitářům. <a href=\"%s\" target=\"_blank\">Zjistit více</a>"
|
||||
}
|
||||
|
|
|
@ -92,5 +92,6 @@
|
|||
"stars.list.none": "Niemand hat dieses Repo favorisiert.",
|
||||
"followers.incoming.list.none": "Niemand folgt diesem Benutzer.",
|
||||
"editor.textarea.tab_hint": "Zeile bereits eingerückt. Drücke nochmals <kbd>Tab</kbd> oder <kbd>Escape</kbd> um den Editor zu verlassen.",
|
||||
"editor.textarea.shift_tab_hint": "Keine Einrückung auf dieser Zeile. Drücke nochmals <kbd>Shift</kbd> + <kbd>Tab</kbd> oder <kbd>Escape</kbd> um den Editor zu verlassen."
|
||||
"editor.textarea.shift_tab_hint": "Keine Einrückung auf dieser Zeile. Drücke nochmals <kbd>Shift</kbd> + <kbd>Tab</kbd> oder <kbd>Escape</kbd> um den Editor zu verlassen.",
|
||||
"admin.dashboard.cleanup_offline_runners": "Aufräumen der offline Runner"
|
||||
}
|
||||
|
|
|
@ -94,5 +94,6 @@
|
|||
"editor.textarea.shift_tab_hint": "No indentation on this line. Press <kbd>Shift</kbd> + <kbd>Tab</kbd> again or <kbd>Escape</kbd> to leave the editor.",
|
||||
"admin.dashboard.cleanup_offline_runners": "Cleanup offline runners",
|
||||
"settings.visibility.description": "Profile visibility affects others' ability to access your non-private repositories. <a href=\"%s\" target=\"_blank\">Learn more</a>",
|
||||
"avatar.constraints_hint": "Custom avatar may not exceed %[1]s in size or be larger than %[2]dx%[3]d pixels",
|
||||
"meta.last_line": "Thank you for translating Forgejo! This line isn't seen by the users but it serves other purposes in the translation management. You can place a fun fact in the translation instead of translating it."
|
||||
}
|
||||
|
|
|
@ -92,5 +92,7 @@
|
|||
"followers.outgoing.list.self.none": "Hindi ka sumusunod ng anumang tao.",
|
||||
"followers.outgoing.list.none": "Hindi sinusundan ni %s ang sinuman.",
|
||||
"editor.textarea.tab_hint": "Naka-indent na ang linya. Pindutin ulit ang <kbd>Tab</kbd> o <kbd>Escape</kbd> para umalis sa editor.",
|
||||
"editor.textarea.shift_tab_hint": "Walang indentation sa linyang ito. Pindutin ang <kbd>Shift</kbd> + <kbd>Tab</kbd> ulit o <kbd>Escape</kbd> para umalis sa editor."
|
||||
"editor.textarea.shift_tab_hint": "Walang indentation sa linyang ito. Pindutin ang <kbd>Shift</kbd> + <kbd>Tab</kbd> ulit o <kbd>Escape</kbd> para umalis sa editor.",
|
||||
"admin.dashboard.cleanup_offline_runners": "Linisin ang mga offline na runner",
|
||||
"settings.visibility.description": "Maaapektuhan ng visibility ng profile ang kakayahan ng iba na i-access ang iyong mga hindi pribadong repositoryo. <a href=\"%s\" target=\"_blank\">Matuto pa</a>"
|
||||
}
|
||||
|
|
|
@ -100,5 +100,7 @@
|
|||
"stars.list.none": "Neviens šo glabātavu nav atzīmējis ar zvaigzni.",
|
||||
"followers.incoming.list.self.none": "Neviens neseko Tavam profilam.",
|
||||
"editor.textarea.tab_hint": "Rinda jau ir ar atkāpi. Spied <kbd>Tab</kbd> vēlreiz vai <kbd>Escape</kbd>, lai izietu no redaktora!",
|
||||
"editor.textarea.shift_tab_hint": "Šajā rindā nav atkāpes. Spied <kbd>Shift</kbd> + <kbd>Tab</kbd> vēlreiz vai <kbd>Escape</kbd>, lai izietu no redaktora!"
|
||||
"editor.textarea.shift_tab_hint": "Šajā rindā nav atkāpes. Spied <kbd>Shift</kbd> + <kbd>Tab</kbd> vēlreiz vai <kbd>Escape</kbd>, lai izietu no redaktora!",
|
||||
"admin.dashboard.cleanup_offline_runners": "Notīrīt bezsaistes izpildītājus",
|
||||
"settings.visibility.description": "Profila redzamība ietekmē iespēju citiem piekļūt Tavām glabātavām, kas nav privātas. <a href=\"%s\" target=\"_blank\">Uzzināt vairāk</a>"
|
||||
}
|
||||
|
|
|
@ -92,5 +92,7 @@
|
|||
"followers.outgoing.list.self.none": "Du gahst nüms na.",
|
||||
"stars.list.none": "Nüms hett up deesem Repositorium eenen Steern sett.",
|
||||
"editor.textarea.tab_hint": "Rieg al inschuven. Drück weer <kbd>Tab</kbd> of <kbd>Esc</kbd>, um de Bewarker to verlaten.",
|
||||
"editor.textarea.shift_tab_hint": "Keen Inschuuv in deeser Rieg. Drück weer <kbd>Umschalt</kbd>+<kbd>Tab</kbd> of <kbd>Esc</kbd>, um de Bewarker to verlaten."
|
||||
"editor.textarea.shift_tab_hint": "Keen Inschuuv in deeser Rieg. Drück weer <kbd>Umschalt</kbd>+<kbd>Tab</kbd> of <kbd>Esc</kbd>, um de Bewarker to verlaten.",
|
||||
"admin.dashboard.cleanup_offline_runners": "Nich verbunnen Lopers uprümen",
|
||||
"settings.visibility.description": "De Profil-Sichtbaarkeid maakt daar wat an, of un wo anner Lüü diene nich-privaaten Repositoriums ankieken könen. <a href=\"%s\" target=\"_blank\">Mehr unnerhören</a>"
|
||||
}
|
||||
|
|
|
@ -100,5 +100,6 @@
|
|||
"followers.outgoing.list.self.none": "Não está a seguir ninguém.",
|
||||
"editor.textarea.tab_hint": "Linha já indentada. Pressione <kbd>Tab</kbd> novamente ou <kbd>Escape</kbd> para sair do editor.",
|
||||
"editor.textarea.shift_tab_hint": "Sem indentação nesta linha. Pressione <kbd>Shift</kbd> + <kbd>Tab</kbd> novamente ou <kbd>Escape</kbd> para sair do editor.",
|
||||
"stars.list.none": "Ninguém juntou este repositório aos favoritos."
|
||||
"stars.list.none": "Ninguém juntou este repositório aos favoritos.",
|
||||
"admin.dashboard.cleanup_offline_runners": "Limpeza de executores offline"
|
||||
}
|
||||
|
|
|
@ -100,5 +100,6 @@
|
|||
"moderation.report_abuse_form.invalid": "Невалидные аргументы",
|
||||
"moderation.report_abuse_form.header": "Жалоба администрации",
|
||||
"editor.textarea.tab_hint": "Отступ уже добавлен. Нажмите <kbd>Tab</kbd> снова или <kbd>Escape</kbd>, чтобы покинуть редактор.",
|
||||
"editor.textarea.shift_tab_hint": "В строке нет отступов. Нажмите <kbd>Shift</kbd> + <kbd>Tab</kbd> снова или <kbd>Escape</kbd>, чтобы покинуть редактор."
|
||||
"editor.textarea.shift_tab_hint": "В строке нет отступов. Нажмите <kbd>Shift</kbd> + <kbd>Tab</kbd> снова или <kbd>Escape</kbd>, чтобы покинуть редактор.",
|
||||
"admin.dashboard.cleanup_offline_runners": "Удалить недоступных исполнителей"
|
||||
}
|
||||
|
|
|
@ -1,5 +1,97 @@
|
|||
{
|
||||
"repo.pulls.merged_title_desc": "sammanfogade %[1]d incheckningar från <code>%[2]s</code> in i <code>%[3]s</code> %[4]s",
|
||||
"repo.pulls.title_desc": "vill sammanfoga %[1]d incheckningar från <code>s[2]s</code> in i <code id=\"%[4]s\">%[3]s</code>",
|
||||
"search.milestone_kind": "Sök milstolpar..."
|
||||
"repo.pulls.merged_title_desc": {
|
||||
"one": "sammanfogade %[1]d incheckning från <code>%[2]s</code> in i <code>%[3]s</code> %[4]s",
|
||||
"other": "sammanfogade %[1]d incheckningar från <code>%[2]s</code> in i <code>%[3]s</code> %[4]s"
|
||||
},
|
||||
"repo.pulls.title_desc": {
|
||||
"one": "vill sammanfoga %[1]d incheckning från <code>s[2]s</code> in i <code id=\"%[4]s\">%[3]s</code>",
|
||||
"other": "vill sammanfoga %[1]d incheckningar från <code>s[2]s</code> in i <code id=\"%[4]s\">%[3]s</code>"
|
||||
},
|
||||
"search.milestone_kind": "Sök milstolpar…",
|
||||
"mail.actions.not_successful_run_subject": "Arbetsflödet %[1]s misslyckades i förrådet %[2]s",
|
||||
"discussion.locked": "Denna diskussion har låsts. Kommentarer är begränsade till bidragsgivare.",
|
||||
"relativetime.now": "nu",
|
||||
"relativetime.1day": "igår",
|
||||
"relativetime.2days": "för två dagar sedan",
|
||||
"relativetime.days": {
|
||||
"one": "%d dag sedan",
|
||||
"other": "%d dagar sedan"
|
||||
},
|
||||
"admin.dashboard.cleanup_offline_runners": "Städa upp offline runners",
|
||||
"repo.issue_indexer.title": "Indexerare för utgåvor",
|
||||
"moderation.reported_thank_you": "Tack för din rapport. Administrationen har gjorts uppmärksam på det.",
|
||||
"themes.names.forgejo-light": "Forgejo ljus",
|
||||
"themes.names.forgejo-dark": "Forgejo mörk",
|
||||
"themes.names.forgejo-auto": "Forgejo (följ systemets tema)",
|
||||
"moderation.submit_report": "Skicka in rapport",
|
||||
"moderation.reporting_failed": "Det gick inte att skicka in den nya övergreppsrapporten: %v",
|
||||
"mail.actions.run_info_cur_status": "Status för denna körning: %[1]s (just uppdaterad från %[2]s)",
|
||||
"mail.actions.run_info_previous_status": "Status för föregående körning: %[1]s",
|
||||
"mail.actions.run_info_ref": "Gren: %[1]s (%[2]s)",
|
||||
"mail.actions.run_info_trigger": "Utlöses på grund av: %[1]s av: %[2]s",
|
||||
"alert.asset_load_failed": "Misslyckades med att läsa in resursfiler från {path}. Kontrollera att resursfilerna är åtkomliga.",
|
||||
"install.invalid_lfs_path": "Det gick inte att skapa LFS-roten på den angivna sökvägen: %[1]s",
|
||||
"alert.range_error": " måste vara ett tal mellan %[1]s och %[2]s.",
|
||||
"stars.list.none": "Ingen har stjärnmarkerat detta förråd.",
|
||||
"watch.list.none": "Ingen tittar på det här förrådet.",
|
||||
"followers.incoming.list.self.none": "Ingen följer din profil.",
|
||||
"followers.incoming.list.none": "Ingen följer den här användaren.",
|
||||
"followers.outgoing.list.self.none": "Du följer inte någon.",
|
||||
"followers.outgoing.list.none": "%s följer inte någon.",
|
||||
"relativetime.future": "i framtiden",
|
||||
"relativetime.1week": "förra veckan",
|
||||
"relativetime.2weeks": "för två veckor sedan",
|
||||
"relativetime.1month": "senaste månaden",
|
||||
"relativetime.2months": "för två månader sedan",
|
||||
"relativetime.1year": "förra året",
|
||||
"relativetime.2years": "för två år sedan",
|
||||
"repo.form.cannot_create": "Alla utrymmen där du kan skapa förråd har nått gränsen för antal förråd.",
|
||||
"incorrect_root_url": "Denna Forgejo-instans är konfigurerad att serveras på \"%s\". Du tittar för närvarande på Forgejo via en annan URL, vilket kan leda till att delar av applikationen bryts. Den kanoniska webbadressen styrs av Forgejo-administratörer via inställningen ROOT_URL i app.ini.",
|
||||
"error.not_found.title": "Sidan hittades inte",
|
||||
"moderation.abuse_category.illegal_content": "Olagligt innehåll",
|
||||
"moderation.abuse_category.other_violations": "Andra överträdelser av plattformsreglerna",
|
||||
"moderation.report_remarks": "Anmärkningar",
|
||||
"moderation.report_remarks.placeholder": "Ge några detaljer om det övergrepp som du rapporterar.",
|
||||
"mail.actions.successful_run_after_failure_subject": "Arbetsflöde %[1]s återställdes i förrådet %[2]s",
|
||||
"mail.actions.successful_run_after_failure": "Arbetsflöde %[1]s återställdes i förrådet %[2]s",
|
||||
"mail.actions.not_successful_run": "Arbetsflödet %[1]s misslyckades i förrådet %[2]s",
|
||||
"editor.textarea.shift_tab_hint": "Ingen indragning på den här raden. Tryck på <kbd>Shift</kbd> + <kbd>Tab</kbd> igen eller <kbd>Escape</kbd> för att lämna redigeringsläget.",
|
||||
"meta.last_line": "Tack för att du översatte Forgejo! Daniel Nylander heter jag. https://www.danielnylander.se",
|
||||
"editor.textarea.tab_hint": "Raden är redan indragen. Tryck på <kbd>Tab</kbd> igen eller <kbd>Escape</kbd> för att lämna redigeringsläget.",
|
||||
"home.welcome.no_activity": "Ingen aktivitet",
|
||||
"home.welcome.activity_hint": "Det finns inget i ditt flöde ännu. Dina åtgärder och aktivitet från förråd som du bevakar kommer att visas här.",
|
||||
"home.explore_repos": "Utforska förråd",
|
||||
"home.explore_users": "Utforska användare",
|
||||
"home.explore_orgs": "Utforska organisationer",
|
||||
"relativetime.mins": {
|
||||
"one": "%d minut sedan",
|
||||
"other": "%d minuter sedan"
|
||||
},
|
||||
"relativetime.hours": {
|
||||
"one": "%d timme sedan",
|
||||
"other": "%d timmar sedan"
|
||||
},
|
||||
"relativetime.weeks": {
|
||||
"one": "%d vecka sedan",
|
||||
"other": "%d veckor sedan"
|
||||
},
|
||||
"relativetime.months": {
|
||||
"one": "%d månad sedan",
|
||||
"other": "%d månader sedan"
|
||||
},
|
||||
"relativetime.years": {
|
||||
"one": "%d år sedan",
|
||||
"other": "%d år sedan"
|
||||
},
|
||||
"admin.config.moderation_config": "Konfiguration av moderering",
|
||||
"moderation.report_abuse": "Rapportera missbruk",
|
||||
"moderation.report_content": "Rapportera innehåll",
|
||||
"moderation.report_abuse_form.header": "Rapportera missbruk till administratör",
|
||||
"moderation.report_abuse_form.details": "Detta formulär ska användas för att rapportera användare som skapar skräpprofiler, förråd, problem, kommentarer eller beter sig olämpligt.",
|
||||
"moderation.report_abuse_form.invalid": "Ogiltiga argument",
|
||||
"moderation.report_abuse_form.already_reported": "Du har redan rapporterat detta innehåll",
|
||||
"moderation.abuse_category": "Kategori",
|
||||
"moderation.abuse_category.placeholder": "Välj en kategori",
|
||||
"moderation.abuse_category.spam": "Skräppost",
|
||||
"moderation.abuse_category.malware": "Skadlig kod"
|
||||
}
|
||||
|
|
|
@ -100,5 +100,7 @@
|
|||
"stars.list.none": "Ніхто не додав цей репозиторій в обрані.",
|
||||
"watch.list.none": "Ніхто не спостерігає за цим репозиторієм.",
|
||||
"editor.textarea.tab_hint": "У рядку вже є відступ. Натисніть <kbd>Tab</kbd> ще раз або <kbd>Esc</kbd>, щоб вийти з редактора.",
|
||||
"editor.textarea.shift_tab_hint": "У цьому рядку немає відступів. Натисніть <kbd>Shift</kbd> + <kbd>Tab</kbd> ще раз або <kbd>Esc</kbd>, щоб вийти з редактора."
|
||||
"editor.textarea.shift_tab_hint": "У цьому рядку немає відступів. Натисніть <kbd>Shift</kbd> + <kbd>Tab</kbd> ще раз або <kbd>Esc</kbd>, щоб вийти з редактора.",
|
||||
"admin.dashboard.cleanup_offline_runners": "Очистити неактивні раннери",
|
||||
"settings.visibility.description": "Видимість профілю впливає на можливість інших користувачів отримати доступ до ваших неприватних репозиторіїв. <a href=\"%s\" target=\"_blank\">Дізнатися більше</a>"
|
||||
}
|
||||
|
|
|
@ -68,5 +68,6 @@
|
|||
"stars.list.none": "没有人点赞这个仓库。",
|
||||
"followers.incoming.list.self.none": "没有人关注你的个人资料。",
|
||||
"editor.textarea.tab_hint": "此行已缩进。再次按 <kbd>Tab</kbd> 或按 <kbd>Escape</kbd> 退出编辑器。",
|
||||
"editor.textarea.shift_tab_hint": "此行无缩进。再次按 <kbd>Shift</kbd> + <kbd>Tab</kbd> 或按 <kbd>Escape</kbd> 退出编辑器。"
|
||||
"editor.textarea.shift_tab_hint": "此行无缩进。再次按 <kbd>Shift</kbd> + <kbd>Tab</kbd> 或按 <kbd>Escape</kbd> 退出编辑器。",
|
||||
"admin.dashboard.cleanup_offline_runners": "清理离线运行器"
|
||||
}
|
||||
|
|
|
@ -67,5 +67,6 @@
|
|||
"moderation.report_abuse_form.header": "向管理員回報濫用",
|
||||
"moderation.report_abuse_form.details": "這個表單是用來檢舉用戶建立垃圾帳號、儲存庫、問題、留言,或其他不當行為。",
|
||||
"moderation.report_abuse_form.invalid": "無效參數",
|
||||
"moderation.report_abuse_form.already_reported": "您已檢舉此內容"
|
||||
"moderation.report_abuse_form.already_reported": "您已檢舉此內容",
|
||||
"meta.last_line": "Rubi-chan? Hai! Nani ga suki? Choko minto yori mo a・na・ta♡ Ayumu-chan? Hai! Nani ga suki? Sutoroberii fureibaa yori mo a・na・ta♡ Shiki-chan! Hai! Nani ga suki? Kukkii and kuriimu yori mo a・na・ta♡ Minna? Hai! Nani ga suki? Mochiron daisuki AiScReam."
|
||||
}
|
||||
|
|
732
package-lock.json
generated
732
package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
@ -32,11 +32,11 @@
|
|||
"katex": "0.16.22",
|
||||
"mermaid": "11.6.0",
|
||||
"mini-css-extract-plugin": "2.9.2",
|
||||
"minimatch": "10.0.2",
|
||||
"minimatch": "10.0.3",
|
||||
"monaco-editor": "0.52.2",
|
||||
"monaco-editor-webpack-plugin": "7.1.0",
|
||||
"pdfobject": "2.3.0",
|
||||
"postcss": "8.5.4",
|
||||
"postcss": "8.5.5",
|
||||
"postcss-loader": "8.1.1",
|
||||
"postcss-nesting": "13.0.2",
|
||||
"pretty-ms": "9.0.0",
|
||||
|
|
|
@ -1310,6 +1310,7 @@ func Routes() *web.Route {
|
|||
m.Get("/refs", repo.GetGitAllRefs)
|
||||
m.Get("/refs/*", repo.GetGitRefs)
|
||||
m.Get("/trees/{sha}", repo.GetTree)
|
||||
m.Get("/blobs", repo.GetBlobs)
|
||||
m.Get("/blobs/{sha}", repo.GetBlob)
|
||||
m.Get("/tags/{sha}", repo.GetAnnotatedTag)
|
||||
m.Group("/notes/{sha}", func() {
|
||||
|
|
|
@ -5,11 +5,54 @@ package repo
|
|||
|
||||
import (
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"forgejo.org/services/context"
|
||||
files_service "forgejo.org/services/repository/files"
|
||||
)
|
||||
|
||||
// GetBlobs gets multiple blobs of a repository.
|
||||
func GetBlobs(ctx *context.APIContext) {
|
||||
// swagger:operation GET /repos/{owner}/{repo}/git/blobs repository GetBlobs
|
||||
// ---
|
||||
// summary: Gets multiplbe blobs of a repository.
|
||||
// produces:
|
||||
// - application/json
|
||||
// parameters:
|
||||
// - name: owner
|
||||
// in: path
|
||||
// description: owner of the repo
|
||||
// type: string
|
||||
// required: true
|
||||
// - name: repo
|
||||
// in: path
|
||||
// description: name of the repo
|
||||
// type: string
|
||||
// required: true
|
||||
// - name: shas
|
||||
// in: query
|
||||
// description: a comma separated list of blob-sha (mind the overall URL-length limit of ~2,083 chars)
|
||||
// type: string
|
||||
// required: true
|
||||
// responses:
|
||||
// "200":
|
||||
// "$ref": "#/responses/GitBlobList"
|
||||
// "400":
|
||||
// "$ref": "#/responses/error"
|
||||
|
||||
shas := ctx.FormString("shas")
|
||||
if len(shas) == 0 {
|
||||
ctx.Error(http.StatusBadRequest, "", "shas not provided")
|
||||
return
|
||||
}
|
||||
|
||||
if blobs, err := files_service.GetBlobsBySHA(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, strings.Split(shas, ",")); err != nil {
|
||||
ctx.Error(http.StatusBadRequest, "", err)
|
||||
} else {
|
||||
ctx.JSON(http.StatusOK, blobs)
|
||||
}
|
||||
}
|
||||
|
||||
// GetBlob get the blob of a repository file.
|
||||
func GetBlob(ctx *context.APIContext) {
|
||||
// swagger:operation GET /repos/{owner}/{repo}/git/blobs/{sha} repository GetBlob
|
||||
|
@ -30,12 +73,12 @@ func GetBlob(ctx *context.APIContext) {
|
|||
// required: true
|
||||
// - name: sha
|
||||
// in: path
|
||||
// description: sha of the commit
|
||||
// description: sha of the blob to retrieve
|
||||
// type: string
|
||||
// required: true
|
||||
// responses:
|
||||
// "200":
|
||||
// "$ref": "#/responses/GitBlobResponse"
|
||||
// "$ref": "#/responses/GitBlob"
|
||||
// "400":
|
||||
// "$ref": "#/responses/error"
|
||||
// "404":
|
||||
|
|
|
@ -231,11 +231,18 @@ type swaggerGitTreeResponse struct {
|
|||
Body api.GitTreeResponse `json:"body"`
|
||||
}
|
||||
|
||||
// GitBlobResponse
|
||||
// swagger:response GitBlobResponse
|
||||
type swaggerGitBlobResponse struct {
|
||||
// GitBlob
|
||||
// swagger:response GitBlob
|
||||
type swaggerGitBlob struct {
|
||||
// in: body
|
||||
Body api.GitBlobResponse `json:"body"`
|
||||
Body api.GitBlob `json:"body"`
|
||||
}
|
||||
|
||||
// GitBlobList
|
||||
// swagger:response GitBlobList
|
||||
type swaggerGitBlobList struct {
|
||||
// in: body
|
||||
Body []api.GitBlob `json:"body"`
|
||||
}
|
||||
|
||||
// Commit
|
||||
|
|
|
@ -313,6 +313,9 @@ func editUserCommon(ctx *context.Context) {
|
|||
ctx.Data["DisableMigrations"] = setting.Repository.DisableMigrations
|
||||
ctx.Data["AllowedUserVisibilityModes"] = setting.Service.AllowedUserVisibilityModesSlice.ToVisibleTypeSlice()
|
||||
ctx.Data["DisableGravatar"] = setting.Config().Picture.DisableGravatar.Value(ctx)
|
||||
ctx.Data["MaxAvatarFileSize"] = setting.Avatar.MaxFileSize
|
||||
ctx.Data["MaxAvatarWidth"] = setting.Avatar.MaxWidth
|
||||
ctx.Data["MaxAvatarHeight"] = setting.Avatar.MaxHeight
|
||||
}
|
||||
|
||||
// EditUser show editing user page
|
||||
|
|
|
@ -50,6 +50,9 @@ func Settings(ctx *context.Context) {
|
|||
ctx.Data["RepoAdminChangeTeamAccess"] = ctx.Org.Organization.RepoAdminChangeTeamAccess
|
||||
ctx.Data["ContextUser"] = ctx.ContextUser
|
||||
ctx.Data["CooldownPeriod"] = setting.Service.UsernameCooldownPeriod
|
||||
ctx.Data["MaxAvatarFileSize"] = setting.Avatar.MaxFileSize
|
||||
ctx.Data["MaxAvatarWidth"] = setting.Avatar.MaxWidth
|
||||
ctx.Data["MaxAvatarHeight"] = setting.Avatar.MaxHeight
|
||||
|
||||
err := shared_user.LoadHeaderCount(ctx)
|
||||
if err != nil {
|
||||
|
|
|
@ -70,11 +70,6 @@ func Branches(ctx *context.Context) {
|
|||
ctx.ServerError("LoadBranches", err)
|
||||
return
|
||||
}
|
||||
if !ctx.Repo.CanRead(unit.TypeActions) {
|
||||
for key := range commitStatuses {
|
||||
git_model.CommitStatusesHideActionsURL(ctx, commitStatuses[key])
|
||||
}
|
||||
}
|
||||
|
||||
commitStatus := make(map[string]*git_model.CommitStatus)
|
||||
for commitID, cs := range commitStatuses {
|
||||
|
|
|
@ -16,7 +16,6 @@ import (
|
|||
"forgejo.org/models/db"
|
||||
git_model "forgejo.org/models/git"
|
||||
repo_model "forgejo.org/models/repo"
|
||||
unit_model "forgejo.org/models/unit"
|
||||
user_model "forgejo.org/models/user"
|
||||
"forgejo.org/modules/base"
|
||||
"forgejo.org/modules/charset"
|
||||
|
@ -84,7 +83,7 @@ func Commits(ctx *context.Context) {
|
|||
ctx.ServerError("CommitsByRange", err)
|
||||
return
|
||||
}
|
||||
ctx.Data["Commits"] = processGitCommits(ctx, commits)
|
||||
ctx.Data["Commits"] = git_model.ParseCommitsWithStatus(ctx, commits, ctx.Repo.Repository)
|
||||
|
||||
ctx.Data["Username"] = ctx.Repo.Owner.Name
|
||||
ctx.Data["Reponame"] = ctx.Repo.Repository.Name
|
||||
|
@ -202,7 +201,7 @@ func SearchCommits(ctx *context.Context) {
|
|||
return
|
||||
}
|
||||
ctx.Data["CommitCount"] = len(commits)
|
||||
ctx.Data["Commits"] = processGitCommits(ctx, commits)
|
||||
ctx.Data["Commits"] = git_model.ParseCommitsWithStatus(ctx, commits, ctx.Repo.Repository)
|
||||
|
||||
ctx.Data["Keyword"] = query
|
||||
if all {
|
||||
|
@ -267,7 +266,7 @@ func FileHistory(ctx *context.Context) {
|
|||
}
|
||||
}
|
||||
|
||||
ctx.Data["Commits"] = processGitCommits(ctx, commits)
|
||||
ctx.Data["Commits"] = git_model.ParseCommitsWithStatus(ctx, commits, ctx.Repo.Repository)
|
||||
|
||||
ctx.Data["Username"] = ctx.Repo.Owner.Name
|
||||
ctx.Data["Reponame"] = ctx.Repo.Repository.Name
|
||||
|
@ -375,9 +374,6 @@ func Diff(ctx *context.Context) {
|
|||
if err != nil {
|
||||
log.Error("GetLatestCommitStatus: %v", err)
|
||||
}
|
||||
if !ctx.Repo.CanRead(unit_model.TypeActions) {
|
||||
git_model.CommitStatusesHideActionsURL(ctx, statuses)
|
||||
}
|
||||
|
||||
ctx.Data["CommitStatus"] = git_model.CalcCommitStatus(statuses)
|
||||
ctx.Data["CommitStatuses"] = statuses
|
||||
|
@ -456,20 +452,6 @@ func RawDiff(ctx *context.Context) {
|
|||
}
|
||||
}
|
||||
|
||||
func processGitCommits(ctx *context.Context, gitCommits []*git.Commit) []*git_model.SignCommitWithStatuses {
|
||||
commits := git_model.ConvertFromGitCommit(ctx, gitCommits, ctx.Repo.Repository)
|
||||
if !ctx.Repo.CanRead(unit_model.TypeActions) {
|
||||
for _, commit := range commits {
|
||||
if commit.Status == nil {
|
||||
continue
|
||||
}
|
||||
commit.Status.HideActionsURL(ctx)
|
||||
git_model.CommitStatusesHideActionsURL(ctx, commit.Statuses)
|
||||
}
|
||||
}
|
||||
return commits
|
||||
}
|
||||
|
||||
func SetCommitNotes(ctx *context.Context) {
|
||||
form := web.GetForm(ctx).(*forms.CommitNotesForm)
|
||||
|
||||
|
|
|
@ -654,7 +654,7 @@ func PrepareCompareDiff(
|
|||
return false
|
||||
}
|
||||
|
||||
commits := processGitCommits(ctx, ci.CompareInfo.Commits)
|
||||
commits := git_model.ParseCommitsWithStatus(ctx, ci.CompareInfo.Commits, ctx.Repo.Repository)
|
||||
ctx.Data["Commits"] = commits
|
||||
ctx.Data["CommitCount"] = len(commits)
|
||||
|
||||
|
|
|
@ -348,11 +348,6 @@ func issues(ctx *context.Context, milestoneID, projectID int64, isPullOption opt
|
|||
ctx.ServerError("GetIssuesAllCommitStatus", err)
|
||||
return
|
||||
}
|
||||
if !ctx.Repo.CanRead(unit.TypeActions) {
|
||||
for key := range commitStatuses {
|
||||
git_model.CommitStatusesHideActionsURL(ctx, commitStatuses[key])
|
||||
}
|
||||
}
|
||||
|
||||
if err := issues.LoadAttributes(ctx); err != nil {
|
||||
ctx.ServerError("issues.LoadAttributes", err)
|
||||
|
@ -1799,15 +1794,6 @@ func ViewIssue(ctx *context.Context) {
|
|||
ctx.ServerError("LoadPushCommits", err)
|
||||
return
|
||||
}
|
||||
if !ctx.Repo.CanRead(unit.TypeActions) {
|
||||
for _, commit := range comment.Commits {
|
||||
if commit.Status == nil {
|
||||
continue
|
||||
}
|
||||
commit.Status.HideActionsURL(ctx)
|
||||
git_model.CommitStatusesHideActionsURL(ctx, commit.Statuses)
|
||||
}
|
||||
}
|
||||
} else if comment.Type == issues_model.CommentTypeAddTimeManual ||
|
||||
comment.Type == issues_model.CommentTypeStopTracking ||
|
||||
comment.Type == issues_model.CommentTypeDeleteTimeManual {
|
||||
|
|
|
@ -515,9 +515,6 @@ func PrepareMergedViewPullInfo(ctx *context.Context, issue *issues_model.Issue)
|
|||
ctx.ServerError("GetLatestCommitStatus", err)
|
||||
return nil
|
||||
}
|
||||
if !ctx.Repo.CanRead(unit.TypeActions) {
|
||||
git_model.CommitStatusesHideActionsURL(ctx, commitStatuses)
|
||||
}
|
||||
|
||||
if len(commitStatuses) != 0 {
|
||||
ctx.Data["LatestCommitStatuses"] = commitStatuses
|
||||
|
@ -581,9 +578,6 @@ func PrepareViewPullInfo(ctx *context.Context, issue *issues_model.Issue) *git.C
|
|||
ctx.ServerError("GetLatestCommitStatus", err)
|
||||
return nil
|
||||
}
|
||||
if !ctx.Repo.CanRead(unit.TypeActions) {
|
||||
git_model.CommitStatusesHideActionsURL(ctx, commitStatuses)
|
||||
}
|
||||
|
||||
if len(commitStatuses) > 0 {
|
||||
ctx.Data["LatestCommitStatuses"] = commitStatuses
|
||||
|
@ -677,9 +671,6 @@ func PrepareViewPullInfo(ctx *context.Context, issue *issues_model.Issue) *git.C
|
|||
ctx.ServerError("GetLatestCommitStatus", err)
|
||||
return nil
|
||||
}
|
||||
if !ctx.Repo.CanRead(unit.TypeActions) {
|
||||
git_model.CommitStatusesHideActionsURL(ctx, commitStatuses)
|
||||
}
|
||||
|
||||
if len(commitStatuses) > 0 {
|
||||
ctx.Data["LatestCommitStatuses"] = commitStatuses
|
||||
|
@ -847,7 +838,7 @@ func ViewPullCommits(ctx *context.Context) {
|
|||
ctx.Data["Username"] = ctx.Repo.Owner.Name
|
||||
ctx.Data["Reponame"] = ctx.Repo.Repository.Name
|
||||
|
||||
commits := processGitCommits(ctx, prInfo.Commits)
|
||||
commits := git_model.ParseCommitsWithStatus(ctx, prInfo.Commits, ctx.Repo.Repository)
|
||||
ctx.Data["Commits"] = commits
|
||||
ctx.Data["CommitCount"] = len(commits)
|
||||
|
||||
|
|
|
@ -693,9 +693,6 @@ func SearchRepo(ctx *context.Context) {
|
|||
ctx.JSON(http.StatusInternalServerError, nil)
|
||||
return
|
||||
}
|
||||
if !ctx.Repo.CanRead(unit.TypeActions) {
|
||||
git_model.CommitStatusesHideActionsURL(ctx, latestCommitStatuses)
|
||||
}
|
||||
|
||||
results := make([]*repo_service.WebSearchRepository, len(repos))
|
||||
for i, repo := range repos {
|
||||
|
|
|
@ -64,6 +64,9 @@ func SettingsCtxData(ctx *context.Context) {
|
|||
ctx.Data["DisableNewPushMirrors"] = setting.Mirror.DisableNewPush
|
||||
ctx.Data["DefaultMirrorInterval"] = setting.Mirror.DefaultInterval
|
||||
ctx.Data["MinimumMirrorInterval"] = setting.Mirror.MinInterval
|
||||
ctx.Data["MaxAvatarFileSize"] = setting.Avatar.MaxFileSize
|
||||
ctx.Data["MaxAvatarWidth"] = setting.Avatar.MaxWidth
|
||||
ctx.Data["MaxAvatarHeight"] = setting.Avatar.MaxHeight
|
||||
|
||||
signing, _ := asymkey_service.SigningKey(ctx, ctx.Repo.Repository.RepoPath())
|
||||
ctx.Data["SigningKeyAvailable"] = len(signing) > 0
|
||||
|
|
|
@ -369,9 +369,6 @@ func loadLatestCommitData(ctx *context.Context, latestCommit *git.Commit) bool {
|
|||
if err != nil {
|
||||
log.Error("GetLatestCommitStatus: %v", err)
|
||||
}
|
||||
if !ctx.Repo.CanRead(unit_model.TypeActions) {
|
||||
git_model.CommitStatusesHideActionsURL(ctx, statuses)
|
||||
}
|
||||
|
||||
ctx.Data["LatestCommitStatus"] = git_model.CalcCommitStatus(statuses)
|
||||
ctx.Data["LatestCommitStatuses"] = statuses
|
||||
|
|
|
@ -393,7 +393,7 @@ func renderRevisionPage(ctx *context.Context) (*git.Repository, *git.TreeEntry)
|
|||
ctx.ServerError("CommitsByFileAndRange", err)
|
||||
return nil, nil
|
||||
}
|
||||
ctx.Data["Commits"] = git_model.ConvertFromGitCommit(ctx, commitsHistory, ctx.Repo.Repository)
|
||||
ctx.Data["Commits"] = git_model.ParseCommitsWithStatus(ctx, commitsHistory, ctx.Repo.Repository)
|
||||
|
||||
pager := context.NewPagination(int(commitsCount), setting.Git.CommitsRangeSize, page, 5)
|
||||
pager.SetDefaultParams(ctx)
|
||||
|
|
|
@ -16,7 +16,6 @@ import (
|
|||
activities_model "forgejo.org/models/activities"
|
||||
asymkey_model "forgejo.org/models/asymkey"
|
||||
"forgejo.org/models/db"
|
||||
git_model "forgejo.org/models/git"
|
||||
issues_model "forgejo.org/models/issues"
|
||||
"forgejo.org/models/organization"
|
||||
repo_model "forgejo.org/models/repo"
|
||||
|
@ -611,11 +610,6 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) {
|
|||
ctx.ServerError("GetIssuesLastCommitStatus", err)
|
||||
return
|
||||
}
|
||||
if !ctx.Repo.CanRead(unit.TypeActions) {
|
||||
for key := range commitStatuses {
|
||||
git_model.CommitStatusesHideActionsURL(ctx, commitStatuses[key])
|
||||
}
|
||||
}
|
||||
|
||||
// -------------------------------
|
||||
// Fill stats to post to ctx.Data.
|
||||
|
|
|
@ -13,10 +13,8 @@ import (
|
|||
|
||||
activities_model "forgejo.org/models/activities"
|
||||
"forgejo.org/models/db"
|
||||
git_model "forgejo.org/models/git"
|
||||
issues_model "forgejo.org/models/issues"
|
||||
repo_model "forgejo.org/models/repo"
|
||||
"forgejo.org/models/unit"
|
||||
"forgejo.org/modules/base"
|
||||
"forgejo.org/modules/log"
|
||||
"forgejo.org/modules/optional"
|
||||
|
@ -311,11 +309,6 @@ func NotificationSubscriptions(ctx *context.Context) {
|
|||
ctx.ServerError("GetIssuesAllCommitStatus", err)
|
||||
return
|
||||
}
|
||||
if !ctx.Repo.CanRead(unit.TypeActions) {
|
||||
for key := range commitStatuses {
|
||||
git_model.CommitStatusesHideActionsURL(ctx, commitStatuses[key])
|
||||
}
|
||||
}
|
||||
ctx.Data["CommitLastStatus"] = lastStatus
|
||||
ctx.Data["CommitStatuses"] = commitStatuses
|
||||
ctx.Data["Issues"] = issues
|
||||
|
|
|
@ -51,6 +51,9 @@ func Profile(ctx *context.Context) {
|
|||
ctx.Data["DisableGravatar"] = setting.Config().Picture.DisableGravatar.Value(ctx)
|
||||
ctx.Data["CooldownPeriod"] = setting.Service.UsernameCooldownPeriod
|
||||
ctx.Data["CommonPronouns"] = commonPronouns
|
||||
ctx.Data["MaxAvatarFileSize"] = setting.Avatar.MaxFileSize
|
||||
ctx.Data["MaxAvatarWidth"] = setting.Avatar.MaxWidth
|
||||
ctx.Data["MaxAvatarHeight"] = setting.Avatar.MaxHeight
|
||||
|
||||
ctx.HTML(http.StatusOK, tplSettingsProfile)
|
||||
}
|
||||
|
|
|
@ -250,8 +250,25 @@ func GetContents(ctx context.Context, repo *repo_model.Repository, treePath, ref
|
|||
return contentsResponse, nil
|
||||
}
|
||||
|
||||
// GetBlobBySHA get the GitBlobResponse of a repository using a sha hash.
|
||||
func GetBlobBySHA(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository, sha string) (*api.GitBlobResponse, error) {
|
||||
// GetBlobsBySHA gets multiple GitBlobs of a repository by sha hash.
|
||||
func GetBlobsBySHA(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository, shas []string) ([]*api.GitBlob, error) {
|
||||
if len(shas) > setting.API.MaxResponseItems {
|
||||
shas = shas[:setting.API.MaxResponseItems]
|
||||
}
|
||||
|
||||
blobs := make([]*api.GitBlob, 0, len(shas))
|
||||
for _, sha := range shas {
|
||||
blob, err := GetBlobBySHA(ctx, repo, gitRepo, sha)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
blobs = append(blobs, blob)
|
||||
}
|
||||
return blobs, nil
|
||||
}
|
||||
|
||||
// GetBlobBySHA get the GitBlob of a repository using a sha hash.
|
||||
func GetBlobBySHA(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository, sha string) (*api.GitBlob, error) {
|
||||
gitBlob, err := gitRepo.GetBlob(sha)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
@ -263,7 +280,7 @@ func GetBlobBySHA(ctx context.Context, repo *repo_model.Repository, gitRepo *git
|
|||
return nil, err
|
||||
}
|
||||
}
|
||||
return &api.GitBlobResponse{
|
||||
return &api.GitBlob{
|
||||
SHA: gitBlob.ID.String(),
|
||||
URL: repo.APIURL() + "/git/blobs/" + url.PathEscape(gitBlob.ID.String()),
|
||||
Size: gitBlob.Size(),
|
||||
|
|
|
@ -192,7 +192,7 @@ func TestGetBlobBySHA(t *testing.T) {
|
|||
defer gitRepo.Close()
|
||||
|
||||
gbr, err := GetBlobBySHA(db.DefaultContext, repo, gitRepo, "65f1bf27bc3bf70f64657658635e66094edbcb4d")
|
||||
expectedGBR := &api.GitBlobResponse{
|
||||
expectedGBR := &api.GitBlob{
|
||||
Content: "dHJlZSAyYTJmMWQ0NjcwNzI4YTJlMTAwNDllMzQ1YmQ3YTI3NjQ2OGJlYWI2CmF1dGhvciB1c2VyMSA8YWRkcmVzczFAZXhhbXBsZS5jb20+IDE0ODk5NTY0NzkgLTA0MDAKY29tbWl0dGVyIEV0aGFuIEtvZW5pZyA8ZXRoYW50a29lbmlnQGdtYWlsLmNvbT4gMTQ4OTk1NjQ3OSAtMDQwMAoKSW5pdGlhbCBjb21taXQK",
|
||||
Encoding: "base64",
|
||||
URL: "https://try.gitea.io/api/v1/repos/user2/repo1/git/blobs/65f1bf27bc3bf70f64657658635e66094edbcb4d",
|
||||
|
@ -202,3 +202,43 @@ func TestGetBlobBySHA(t *testing.T) {
|
|||
require.NoError(t, err)
|
||||
assert.Equal(t, expectedGBR, gbr)
|
||||
}
|
||||
|
||||
func TestGetBlobsBySHA(t *testing.T) {
|
||||
unittest.PrepareTestEnv(t)
|
||||
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2})
|
||||
|
||||
gitRepo, err := gitrepo.OpenRepository(db.DefaultContext, repo)
|
||||
require.NoError(t, err)
|
||||
defer gitRepo.Close()
|
||||
|
||||
gbr, err := GetBlobsBySHA(db.DefaultContext, repo, gitRepo, []string{
|
||||
"ea82fc8777a24b07c26b3a4bf4e2742c03733eab", // Home.md
|
||||
"6395b68e1feebb1e4c657b4f9f6ba2676a283c0b", // line.svg
|
||||
"26f842bcad37fa40a1bb34cbb5ee219ee35d863d", // test.xml
|
||||
})
|
||||
expectedGBR := []*api.GitBlob{
|
||||
{
|
||||
Content: "IyBIb21lIHBhZ2UKClRoaXMgaXMgdGhlIGhvbWUgcGFnZSEK",
|
||||
Encoding: "base64",
|
||||
URL: "https://try.gitea.io/api/v1/repos/user2/repo2/git/blobs/ea82fc8777a24b07c26b3a4bf4e2742c03733eab",
|
||||
SHA: "ea82fc8777a24b07c26b3a4bf4e2742c03733eab",
|
||||
Size: 36,
|
||||
},
|
||||
{
|
||||
Content: "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZwogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHdpZHRoPSIxMjgiCiAgIGhlaWdodD0iMTI4IgogICB2aWV3Qm94PSIwIDAgMTI4IDEyOCI+CgogIDxsaW5lIHgxPSIwIiB5MT0iNyIgeDI9IjEwIiB5Mj0iNyIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPC9zdmc+",
|
||||
Encoding: "base64",
|
||||
URL: "https://try.gitea.io/api/v1/repos/user2/repo2/git/blobs/6395b68e1feebb1e4c657b4f9f6ba2676a283c0b",
|
||||
SHA: "6395b68e1feebb1e4c657b4f9f6ba2676a283c0b",
|
||||
Size: 246,
|
||||
},
|
||||
{
|
||||
Content: "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHRlc3Q+VGhpcyBpcyBYTUw8L3Rlc3Q+Cg==",
|
||||
Encoding: "base64",
|
||||
URL: "https://try.gitea.io/api/v1/repos/user2/repo2/git/blobs/26f842bcad37fa40a1bb34cbb5ee219ee35d863d",
|
||||
SHA: "26f842bcad37fa40a1bb34cbb5ee219ee35d863d",
|
||||
Size: 64,
|
||||
},
|
||||
}
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, expectedGBR, gbr)
|
||||
}
|
||||
|
|
|
@ -208,6 +208,7 @@
|
|||
<div class="inline field tw-pl-4">
|
||||
<label for="avatar">{{ctx.Locale.Tr "settings.choose_new_avatar"}}</label>
|
||||
<input name="avatar" type="file" accept="image/png,image/jpeg,image/gif,image/webp">
|
||||
<br/><span class=help>{{ctx.Locale.Tr "avatar.constraints_hint" (ctx.Locale.TrSize .MaxAvatarFileSize) .MaxAvatarWidth .MaxAvatarHeight}}</span>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
|
|
|
@ -94,6 +94,7 @@
|
|||
<div class="inline field">
|
||||
<label for="avatar">{{ctx.Locale.Tr "settings.choose_new_avatar"}}</label>
|
||||
<input name="avatar" type="file" accept="image/png,image/jpeg,image/gif,image/webp">
|
||||
<br/><span class=help>{{ctx.Locale.Tr "avatar.constraints_hint" (ctx.Locale.TrSize .MaxAvatarFileSize) .MaxAvatarWidth .MaxAvatarHeight}}</span>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
|
|
|
@ -56,6 +56,7 @@
|
|||
<div class="inline field">
|
||||
<label for="avatar">{{ctx.Locale.Tr "settings.choose_new_avatar"}}</label>
|
||||
<input name="avatar" type="file" accept="image/png,image/jpeg,image/gif,image/webp">
|
||||
<br/><span class=help>{{ctx.Locale.Tr "avatar.constraints_hint" (ctx.Locale.TrSize .MaxAvatarFileSize) .MaxAvatarWidth .MaxAvatarHeight}}</span>
|
||||
</div>
|
||||
<div class="field">
|
||||
<button class="ui primary button">{{ctx.Locale.Tr "settings.update_avatar"}}</button>
|
||||
|
|
66
templates/swagger/v1_json.tmpl
generated
66
templates/swagger/v1_json.tmpl
generated
|
@ -7616,6 +7616,49 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"/repos/{owner}/{repo}/git/blobs": {
|
||||
"get": {
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"repository"
|
||||
],
|
||||
"summary": "Gets multiplbe blobs of a repository.",
|
||||
"operationId": "GetBlobs",
|
||||
"parameters": [
|
||||
{
|
||||
"type": "string",
|
||||
"description": "owner of the repo",
|
||||
"name": "owner",
|
||||
"in": "path",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"description": "name of the repo",
|
||||
"name": "repo",
|
||||
"in": "path",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"description": "a comma separated list of blob-sha (mind the overall URL-length limit of ~2,083 chars)",
|
||||
"name": "shas",
|
||||
"in": "query",
|
||||
"required": true
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"$ref": "#/responses/GitBlobList"
|
||||
},
|
||||
"400": {
|
||||
"$ref": "#/responses/error"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/repos/{owner}/{repo}/git/blobs/{sha}": {
|
||||
"get": {
|
||||
"produces": [
|
||||
|
@ -7643,7 +7686,7 @@
|
|||
},
|
||||
{
|
||||
"type": "string",
|
||||
"description": "sha of the commit",
|
||||
"description": "sha of the blob to retrieve",
|
||||
"name": "sha",
|
||||
"in": "path",
|
||||
"required": true
|
||||
|
@ -7651,7 +7694,7 @@
|
|||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"$ref": "#/responses/GitBlobResponse"
|
||||
"$ref": "#/responses/GitBlob"
|
||||
},
|
||||
"400": {
|
||||
"$ref": "#/responses/error"
|
||||
|
@ -24864,8 +24907,8 @@
|
|||
},
|
||||
"x-go-package": "forgejo.org/modules/structs"
|
||||
},
|
||||
"GitBlobResponse": {
|
||||
"description": "GitBlobResponse represents a git blob",
|
||||
"GitBlob": {
|
||||
"description": "GitBlob represents a git blob",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"content": {
|
||||
|
@ -29119,10 +29162,19 @@
|
|||
"$ref": "#/definitions/GeneralUISettings"
|
||||
}
|
||||
},
|
||||
"GitBlobResponse": {
|
||||
"description": "GitBlobResponse",
|
||||
"GitBlob": {
|
||||
"description": "GitBlob",
|
||||
"schema": {
|
||||
"$ref": "#/definitions/GitBlobResponse"
|
||||
"$ref": "#/definitions/GitBlob"
|
||||
}
|
||||
},
|
||||
"GitBlobList": {
|
||||
"description": "GitBlobList",
|
||||
"schema": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/definitions/GitBlob"
|
||||
}
|
||||
}
|
||||
},
|
||||
"GitHook": {
|
||||
|
|
|
@ -138,6 +138,7 @@
|
|||
<div class="inline field tw-pl-4">
|
||||
<label for="new-avatar">{{ctx.Locale.Tr "settings.choose_new_avatar"}}</label>
|
||||
<input id="new-avatar" name="avatar" type="file" accept="image/png,image/jpeg,image/gif,image/webp">
|
||||
<br/><span class=help>{{ctx.Locale.Tr "avatar.constraints_hint" (ctx.Locale.TrSize .MaxAvatarFileSize) .MaxAvatarWidth .MaxAvatarHeight}}</span>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
|
|
|
@ -37,7 +37,7 @@ func TestAPIReposGitBlobs(t *testing.T) {
|
|||
// Test a public repo that anyone can GET the blob of
|
||||
req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/git/blobs/%s", user2.Name, repo1.Name, repo1ReadmeSHA)
|
||||
resp := MakeRequest(t, req, http.StatusOK)
|
||||
var gitBlobResponse api.GitBlobResponse
|
||||
var gitBlobResponse api.GitBlob
|
||||
DecodeJSON(t, resp, &gitBlobResponse)
|
||||
assert.NotNil(t, gitBlobResponse)
|
||||
expectedContent := "dHJlZSAyYTJmMWQ0NjcwNzI4YTJlMTAwNDllMzQ1YmQ3YTI3NjQ2OGJlYWI2CmF1dGhvciB1c2VyMSA8YWRkcmVzczFAZXhhbXBsZS5jb20+IDE0ODk5NTY0NzkgLTA0MDAKY29tbWl0dGVyIEV0aGFuIEtvZW5pZyA8ZXRoYW50a29lbmlnQGdtYWlsLmNvbT4gMTQ4OTk1NjQ3OSAtMDQwMAoKSW5pdGlhbCBjb21taXQK"
|
||||
|
|
|
@ -32,10 +32,15 @@ func TestPatchStatus(t *testing.T) {
|
|||
user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
|
||||
session := loginUser(t, user2.Name)
|
||||
|
||||
var objectFormat optional.Option[string]
|
||||
if git.SupportHashSha256 {
|
||||
objectFormat = optional.Some("sha256")
|
||||
}
|
||||
|
||||
repo, _, f := tests.CreateDeclarativeRepoWithOptions(t, user2, tests.DeclarativeRepoOptions{
|
||||
AutoInit: optional.Some(true),
|
||||
EnabledUnits: optional.Some([]unit_model.Type{unit_model.TypeCode}),
|
||||
ObjectFormat: optional.Some("sha256"),
|
||||
ObjectFormat: objectFormat,
|
||||
Files: optional.Some([]*files_service.ChangeRepoFile{
|
||||
{
|
||||
Operation: "create",
|
||||
|
|
|
@ -25,6 +25,10 @@ import (
|
|||
)
|
||||
|
||||
func TestRepoSSHSignedTags(t *testing.T) {
|
||||
if git.CheckGitVersionAtLeast("2.34") != nil {
|
||||
t.Skip("Skipping, does not support SSH signing")
|
||||
return
|
||||
}
|
||||
defer tests.PrepareTestEnv(t)()
|
||||
|
||||
// Preparations
|
||||
|
|
|
@ -155,3 +155,51 @@ func TestSettingSecurityAuthSource(t *testing.T) {
|
|||
assert.Contains(t, resp.Body.String(), `gitlab-active`)
|
||||
assert.Contains(t, resp.Body.String(), `gitlab-inactive`)
|
||||
}
|
||||
|
||||
func TestUserAvatarSizeNotice(t *testing.T) {
|
||||
defer tests.PrepareTestEnv(t)()
|
||||
|
||||
session := loginUser(t, "user1")
|
||||
req := NewRequest(t, "GET", "/user/settings")
|
||||
resp := session.MakeRequest(t, req, http.StatusOK)
|
||||
htmlDoc := NewHTMLParser(t, resp.Body)
|
||||
assert.Contains(t,
|
||||
htmlDoc.doc.Find("form div:has(input#new-avatar) .help").Text(),
|
||||
"Custom avatar may not exceed 1 MiB in size or be larger than 4096x4096 pixels")
|
||||
}
|
||||
|
||||
func TestRepoAvatarSizeNotice(t *testing.T) {
|
||||
defer tests.PrepareTestEnv(t)()
|
||||
|
||||
session := loginUser(t, "user2")
|
||||
req := NewRequest(t, "GET", "/user2/repo1/settings")
|
||||
resp := session.MakeRequest(t, req, http.StatusOK)
|
||||
htmlDoc := NewHTMLParser(t, resp.Body)
|
||||
assert.Contains(t,
|
||||
htmlDoc.doc.Find("form div:has(input[name=\"avatar\"]) .help").Text(),
|
||||
"Custom avatar may not exceed 1 MiB in size or be larger than 4096x4096 pixels")
|
||||
}
|
||||
|
||||
func TestOrgAvatarSizeNotice(t *testing.T) {
|
||||
defer tests.PrepareTestEnv(t)()
|
||||
|
||||
session := loginUser(t, "user2")
|
||||
req := NewRequest(t, "GET", "/org/org3/settings")
|
||||
resp := session.MakeRequest(t, req, http.StatusOK)
|
||||
htmlDoc := NewHTMLParser(t, resp.Body)
|
||||
assert.Contains(t,
|
||||
htmlDoc.doc.Find("form div:has(input[name=\"avatar\"]) .help").Text(),
|
||||
"Custom avatar may not exceed 1 MiB in size or be larger than 4096x4096 pixels")
|
||||
}
|
||||
|
||||
func TestAdminAvatarSizeNotice(t *testing.T) {
|
||||
defer tests.PrepareTestEnv(t)()
|
||||
|
||||
session := loginUser(t, "user1")
|
||||
req := NewRequest(t, "GET", "/admin/users/2/edit")
|
||||
resp := session.MakeRequest(t, req, http.StatusOK)
|
||||
htmlDoc := NewHTMLParser(t, resp.Body)
|
||||
assert.Contains(t,
|
||||
htmlDoc.doc.Find("form div:has(input[name=\"avatar\"]) .help").Text(),
|
||||
"Custom avatar may not exceed 1 MiB in size or be larger than 4096x4096 pixels")
|
||||
}
|
||||
|
|
|
@ -42,6 +42,10 @@ func TestInstanceSigning(t *testing.T) {
|
|||
defer test.MockProtect(&setting.Repository.Signing.CRUDActions)()
|
||||
|
||||
t.Run("SSH", func(t *testing.T) {
|
||||
if git.CheckGitVersionAtLeast("2.34") != nil {
|
||||
t.Skip("Skipping, does not support git SSH signing")
|
||||
return
|
||||
}
|
||||
defer tests.PrintCurrentTest(t)()
|
||||
|
||||
pubKeyContent, err := os.ReadFile("tests/integration/ssh-signing-key.pub")
|
||||
|
|
44
web_src/fomantic/package-lock.json
generated
44
web_src/fomantic/package-lock.json
generated
|
@ -494,12 +494,12 @@
|
|||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@types/node": {
|
||||
"version": "22.15.30",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.30.tgz",
|
||||
"integrity": "sha512-6Q7lr06bEHdlfplU6YRbgG1SFBdlsfNC4/lX+SkhiTs0cpJkOElmWls8PxDFv4yY/xKb8Y6SO0OmSX4wgqTZbA==",
|
||||
"version": "24.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.1.tgz",
|
||||
"integrity": "sha512-MX4Zioh39chHlDJbKmEgydJDS3tspMP/lnQC67G3SWsTnb9NeYVWOjkxpOSy4oMfPs4StcWHwBrvUb4ybfnuaw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"undici-types": "~6.21.0"
|
||||
"undici-types": "~7.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/vinyl": {
|
||||
|
@ -1086,9 +1086,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/brace-expansion": {
|
||||
"version": "1.1.11",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||
"version": "1.1.12",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
|
||||
"integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"balanced-match": "^1.0.0",
|
||||
|
@ -1249,9 +1249,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/caniuse-lite": {
|
||||
"version": "1.0.30001721",
|
||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001721.tgz",
|
||||
"integrity": "sha512-cOuvmUVtKrtEaoKiO0rSc29jcjwMwX5tOHDy4MgVFEWiUXj4uBMJkwI8MDySkgXidpMiHUcviogAvFi4pA2hDQ==",
|
||||
"version": "1.0.30001723",
|
||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001723.tgz",
|
||||
"integrity": "sha512-1R/elMjtehrFejxwmexeXAtae5UO9iSyFn6G/I806CYC/BLyyBk1EPhrKBkWhy6wM6Xnm47dSJQec+tLJ39WHw==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "opencollective",
|
||||
|
@ -1969,9 +1969,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/editorconfig/node_modules/brace-expansion": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
|
||||
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
|
||||
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"balanced-match": "^1.0.0"
|
||||
|
@ -2005,9 +2005,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/electron-to-chromium": {
|
||||
"version": "1.5.165",
|
||||
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.165.tgz",
|
||||
"integrity": "sha512-naiMx1Z6Nb2TxPU6fiFrUrDTjyPMLdTtaOd2oLmG8zVSg2hCWGkhPyxwk+qRmZ1ytwVqUv0u7ZcDA5+ALhaUtw==",
|
||||
"version": "1.5.167",
|
||||
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.167.tgz",
|
||||
"integrity": "sha512-LxcRvnYO5ez2bMOFpbuuVuAI5QNeY1ncVytE/KXaL6ZNfzX1yPlAO0nSOyIHx2fVAuUprMqPs/TdVhUFZy7SIQ==",
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/emoji-regex": {
|
||||
|
@ -5019,9 +5019,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/js-beautify/node_modules/brace-expansion": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
|
||||
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
|
||||
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"balanced-match": "^1.0.0"
|
||||
|
@ -8226,9 +8226,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/undici-types": {
|
||||
"version": "6.21.0",
|
||||
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
|
||||
"integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
|
||||
"version": "7.8.0",
|
||||
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz",
|
||||
"integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/union-value": {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue