Compare commits

..

1 commit

Author SHA1 Message Date
Renovate Bot c295b1a5bc Update dependency esbuild-loader to v4.2.0 2024-06-18 00:04:47 +00:00
144 changed files with 1336 additions and 3063 deletions

View file

@ -24,6 +24,3 @@ exclude_dir = [
] ]
exclude_regex = ["_test.go$", "_gen.go$"] exclude_regex = ["_test.go$", "_gen.go$"]
stop_on_error = true stop_on_error = true
[log]
main_only = true

View file

@ -87,6 +87,7 @@ code.gitea.io/gitea/models/repo
releaseSorter.Swap releaseSorter.Swap
SortReleases SortReleases
FindReposMapByIDs FindReposMapByIDs
SearchOrderBy.String
IsErrTopicNotExist IsErrTopicNotExist
ErrTopicNotExist.Error ErrTopicNotExist.Error
ErrTopicNotExist.Unwrap ErrTopicNotExist.Unwrap
@ -210,6 +211,7 @@ code.gitea.io/gitea/modules/json
StdJSON.Indent StdJSON.Indent
code.gitea.io/gitea/modules/markup code.gitea.io/gitea/modules/markup
IsSameDomain
GetRendererByType GetRendererByType
RenderString RenderString
IsMarkupFile IsMarkupFile

View file

@ -6,7 +6,7 @@
"ghcr.io/devcontainers/features/node:1": { "ghcr.io/devcontainers/features/node:1": {
"version": "20" "version": "20"
}, },
"ghcr.io/devcontainers/features/git-lfs:1.2.1": {}, "ghcr.io/devcontainers/features/git-lfs:1.2.0": {},
"ghcr.io/devcontainers-contrib/features/poetry:2": {}, "ghcr.io/devcontainers-contrib/features/poetry:2": {},
"ghcr.io/devcontainers/features/python:1": { "ghcr.io/devcontainers/features/python:1": {
"version": "3.12" "version": "3.12"

View file

@ -22,7 +22,7 @@ jobs:
runs-on: docker runs-on: docker
container: container:
image: ghcr.io/visualon/renovate:37.414.1 image: ghcr.io/visualon/renovate:37.409.1
steps: steps:
- name: Load renovate repo cache - name: Load renovate repo cache

View file

@ -36,7 +36,7 @@ jobs:
- run: make deps-frontend - run: make deps-frontend
- run: make lint-frontend - run: make lint-frontend
- run: make checks-frontend - run: make checks-frontend
- run: make test-frontend-coverage - run: make test-frontend
- run: make frontend - run: make frontend
test-unit: test-unit:
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }} if: ${{ !startsWith(vars.ROLE, 'forgejo-') }}
@ -57,6 +57,8 @@ jobs:
MINIO_DOMAIN: minio MINIO_DOMAIN: minio
MINIO_ROOT_USER: 123456 MINIO_ROOT_USER: 123456
MINIO_ROOT_PASSWORD: 12345678 MINIO_ROOT_PASSWORD: 12345678
redis:
image: redis:7.2
steps: steps:
- uses: https://code.forgejo.org/actions/checkout@v3 - uses: https://code.forgejo.org/actions/checkout@v3
- uses: https://code.forgejo.org/actions/setup-go@v4 - uses: https://code.forgejo.org/actions/setup-go@v4
@ -86,59 +88,8 @@ jobs:
env: env:
RACE_ENABLED: 'true' RACE_ENABLED: 'true'
TAGS: bindata TAGS: bindata
TEST_REDIS_SERVER: redis:6379
TEST_ELASTICSEARCH_URL: http://elasticsearch:9200 TEST_ELASTICSEARCH_URL: http://elasticsearch:9200
test-remote-cacher:
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }}
runs-on: docker
needs: [backend-checks, frontend-checks]
container:
image: 'docker.io/node:20-bookworm'
strategy:
matrix:
cacher:
# redis
- image: redis:7.2
port: 6379
# redict
- image: registry.redict.io/redict:7.3.0-scratch
port: 6379
# garnet
- image: ghcr.io/microsoft/garnet-alpine:1.0.14
port: 6379
services:
cacher:
image: ${{ matrix.cacher.image }}
options: ${{ matrix.cacher.options }}
steps:
- uses: https://code.forgejo.org/actions/checkout@v3
- uses: https://code.forgejo.org/actions/setup-go@v4
with:
go-version: "1.22"
- run: |
git config --add safe.directory '*'
adduser --quiet --comment forgejo --disabled-password forgejo
chown -R forgejo:forgejo .
- name: install git >= 2.42
run: |
export DEBIAN_FRONTEND=noninteractive
echo deb http://deb.debian.org/debian/ testing main > /etc/apt/sources.list.d/testing.list
apt-get update -qq
apt-get -q install -qq -y git
rm /etc/apt/sources.list.d/testing.list
apt-get update -qq
- run: |
su forgejo -c 'make deps-backend'
- run: |
su forgejo -c 'make backend'
env:
TAGS: bindata
- run: |
su forgejo -c 'make test-remote-cacher test-check'
timeout-minutes: 50
env:
RACE_ENABLED: 'true'
TAGS: bindata
TEST_REDIS_SERVER: cacher:${{ matrix.cacher.port }}
test-mysql: test-mysql:
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }} if: ${{ !startsWith(vars.ROLE, 'forgejo-') }}
runs-on: docker runs-on: docker

View file

@ -22,7 +22,6 @@ linters:
- typecheck - typecheck
- unconvert - unconvert
- unused - unused
- unparam
- wastedassign - wastedassign
run: run:

View file

@ -3,11 +3,11 @@ FROM --platform=$BUILDPLATFORM docker.io/tonistiigi/xx AS xx
FROM --platform=$BUILDPLATFORM code.forgejo.org/oci/golang:1.22-alpine3.20 as build-env FROM --platform=$BUILDPLATFORM code.forgejo.org/oci/golang:1.22-alpine3.20 as build-env
ARG GOPROXY ARG GOPROXY
ENV GOPROXY=${GOPROXY:-direct} ENV GOPROXY ${GOPROXY:-direct}
ARG RELEASE_VERSION ARG RELEASE_VERSION
ARG TAGS="sqlite sqlite_unlock_notify" ARG TAGS="sqlite sqlite_unlock_notify"
ENV TAGS="bindata timetzdata $TAGS" ENV TAGS "bindata timetzdata $TAGS"
ARG CGO_EXTRA_CFLAGS ARG CGO_EXTRA_CFLAGS
# #
@ -92,8 +92,8 @@ RUN addgroup \
git && \ git && \
echo "git:*" | chpasswd -e echo "git:*" | chpasswd -e
ENV USER=git ENV USER git
ENV GITEA_CUSTOM=/data/gitea ENV GITEA_CUSTOM /data/gitea
VOLUME ["/data"] VOLUME ["/data"]

View file

@ -3,11 +3,11 @@ FROM --platform=$BUILDPLATFORM docker.io/tonistiigi/xx AS xx
FROM --platform=$BUILDPLATFORM code.forgejo.org/oci/golang:1.22-alpine3.20 as build-env FROM --platform=$BUILDPLATFORM code.forgejo.org/oci/golang:1.22-alpine3.20 as build-env
ARG GOPROXY ARG GOPROXY
ENV GOPROXY=${GOPROXY:-direct} ENV GOPROXY ${GOPROXY:-direct}
ARG RELEASE_VERSION ARG RELEASE_VERSION
ARG TAGS="sqlite sqlite_unlock_notify" ARG TAGS="sqlite sqlite_unlock_notify"
ENV TAGS="bindata timetzdata $TAGS" ENV TAGS "bindata timetzdata $TAGS"
ARG CGO_EXTRA_CFLAGS ARG CGO_EXTRA_CFLAGS
# #
@ -95,17 +95,17 @@ COPY --from=build-env /go/src/code.gitea.io/gitea/contrib/autocompletion/bash_au
#git:git #git:git
USER 1000:1000 USER 1000:1000
ENV GITEA_WORK_DIR=/var/lib/gitea ENV GITEA_WORK_DIR /var/lib/gitea
ENV GITEA_CUSTOM=/var/lib/gitea/custom ENV GITEA_CUSTOM /var/lib/gitea/custom
ENV GITEA_TEMP=/tmp/gitea ENV GITEA_TEMP /tmp/gitea
ENV TMPDIR=/tmp/gitea ENV TMPDIR /tmp/gitea
# Legacy config file for backwards compatibility # Legacy config file for backwards compatibility
# TODO: remove on next major version release # TODO: remove on next major version release
ENV GITEA_APP_INI_LEGACY=/etc/gitea/app.ini ENV GITEA_APP_INI_LEGACY /etc/gitea/app.ini
ENV GITEA_APP_INI=${GITEA_CUSTOM}/conf/app.ini ENV GITEA_APP_INI ${GITEA_CUSTOM}/conf/app.ini
ENV HOME="/var/lib/gitea/git" ENV HOME "/var/lib/gitea/git"
VOLUME ["/var/lib/gitea", "/etc/gitea"] VOLUME ["/var/lib/gitea", "/etc/gitea"]
WORKDIR /var/lib/gitea WORKDIR /var/lib/gitea

View file

@ -39,7 +39,6 @@ GOVULNCHECK_PACKAGE ?= golang.org/x/vuln/cmd/govulncheck@v1 # renovate: datasour
DEADCODE_PACKAGE ?= golang.org/x/tools/cmd/deadcode@v0.22.0 # renovate: datasource=go DEADCODE_PACKAGE ?= golang.org/x/tools/cmd/deadcode@v0.22.0 # renovate: datasource=go
GOMOCK_PACKAGE ?= go.uber.org/mock/mockgen@v0.4.0 # renovate: datasource=go GOMOCK_PACKAGE ?= go.uber.org/mock/mockgen@v0.4.0 # renovate: datasource=go
GOPLS_PACKAGE ?= golang.org/x/tools/gopls@v0.15.3 # renovate: datasource=go GOPLS_PACKAGE ?= golang.org/x/tools/gopls@v0.15.3 # renovate: datasource=go
RENOVATE_NPM_PACKAGE ?= renovate@37.414.1 # renovate: datasource=docker packageName=ghcr.io/visualon/renovate
DOCKER_IMAGE ?= gitea/gitea DOCKER_IMAGE ?= gitea/gitea
DOCKER_TAG ?= latest DOCKER_TAG ?= latest
@ -125,8 +124,6 @@ LINUX_ARCHS ?= linux/amd64,linux/386,linux/arm-5,linux/arm-6,linux/arm64
ifeq ($(HAS_GO), yes) ifeq ($(HAS_GO), yes)
GO_TEST_PACKAGES ?= $(filter-out $(shell $(GO) list code.gitea.io/gitea/models/migrations/...) $(shell $(GO) list code.gitea.io/gitea/models/forgejo_migrations/...) code.gitea.io/gitea/tests/integration/migration-test code.gitea.io/gitea/tests code.gitea.io/gitea/tests/integration code.gitea.io/gitea/tests/e2e,$(shell $(GO) list ./... | grep -v /vendor/)) GO_TEST_PACKAGES ?= $(filter-out $(shell $(GO) list code.gitea.io/gitea/models/migrations/...) $(shell $(GO) list code.gitea.io/gitea/models/forgejo_migrations/...) code.gitea.io/gitea/tests/integration/migration-test code.gitea.io/gitea/tests code.gitea.io/gitea/tests/integration code.gitea.io/gitea/tests/e2e,$(shell $(GO) list ./... | grep -v /vendor/))
endif endif
REMOTE_CACHER_MODULES ?= cache nosql session queue
GO_TEST_REMOTE_CACHER_PACKAGES ?= $(addprefix code.gitea.io/gitea/modules/,$(REMOTE_CACHER_MODULES))
FOMANTIC_WORK_DIR := web_src/fomantic FOMANTIC_WORK_DIR := web_src/fomantic
@ -240,7 +237,6 @@ help:
@echo " - lint-md lint markdown files" @echo " - lint-md lint markdown files"
@echo " - lint-swagger lint swagger files" @echo " - lint-swagger lint swagger files"
@echo " - lint-templates lint template files" @echo " - lint-templates lint template files"
@echo " - lint-renovate lint renovate files"
@echo " - lint-yaml lint yaml files" @echo " - lint-yaml lint yaml files"
@echo " - lint-spell lint spelling" @echo " - lint-spell lint spelling"
@echo " - lint-spell-fix lint spelling and fix issues" @echo " - lint-spell-fix lint spelling and fix issues"
@ -251,9 +247,7 @@ help:
@echo " - show-version-full show the same version as the API endpoint" @echo " - show-version-full show the same version as the API endpoint"
@echo " - show-version-major show major release number only" @echo " - show-version-major show major release number only"
@echo " - test-frontend test frontend files" @echo " - test-frontend test frontend files"
@echo " - test-frontend-coverage test frontend files and display code coverage"
@echo " - test-backend test backend files" @echo " - test-backend test backend files"
@echo " - test-remote-cacher test backend files that use a remote cache"
@echo " - test-e2e-sqlite[\#name.test.e2e] test end to end using playwright and sqlite" @echo " - test-e2e-sqlite[\#name.test.e2e] test end to end using playwright and sqlite"
@echo " - webpack build webpack files" @echo " - webpack build webpack files"
@echo " - svg build svg files" @echo " - svg build svg files"
@ -401,7 +395,7 @@ lint-frontend: lint-js lint-css
lint-frontend-fix: lint-js-fix lint-css-fix lint-frontend-fix: lint-js-fix lint-css-fix
.PHONY: lint-backend .PHONY: lint-backend
lint-backend: lint-go lint-go-vet lint-editorconfig lint-renovate lint-backend: lint-go lint-go-vet lint-editorconfig
.PHONY: lint-backend-fix .PHONY: lint-backend-fix
lint-backend-fix: lint-go-fix lint-go-vet lint-editorconfig lint-backend-fix: lint-go-fix lint-go-vet lint-editorconfig
@ -438,12 +432,6 @@ lint-css-fix: node_modules
lint-swagger: node_modules lint-swagger: node_modules
npx spectral lint -q -F hint $(SWAGGER_SPEC) npx spectral lint -q -F hint $(SWAGGER_SPEC)
.PHONY: lint-renovate
lint-renovate: node_modules
npx --yes --package $(RENOVATE_NPM_PACKAGE) -- renovate-config-validator --strict > .lint-renovate 2>&1 || true
@if grep --quiet --extended-regexp -e '^( WARN:|ERROR:)' .lint-renovate ; then cat .lint-renovate ; rm .lint-renovate ; exit 1 ; fi
@rm .lint-renovate
.PHONY: lint-md .PHONY: lint-md
lint-md: node_modules lint-md: node_modules
npx markdownlint docs *.md npx markdownlint docs *.md
@ -521,19 +509,10 @@ test-backend:
@echo "Running go test with $(GOTESTFLAGS) -tags '$(TEST_TAGS)'..." @echo "Running go test with $(GOTESTFLAGS) -tags '$(TEST_TAGS)'..."
@$(GO) test $(GOTESTFLAGS) -tags='$(TEST_TAGS)' $(GO_TEST_PACKAGES) @$(GO) test $(GOTESTFLAGS) -tags='$(TEST_TAGS)' $(GO_TEST_PACKAGES)
.PHONY: test-remote-cacher
test-remote-cacher:
@echo "Running go test with $(GOTESTFLAGS) -tags '$(TEST_TAGS)'..."
@$(GO) test $(GOTESTFLAGS) -tags='$(TEST_TAGS)' $(GO_TEST_REMOTE_CACHER_PACKAGES)
.PHONY: test-frontend .PHONY: test-frontend
test-frontend: node_modules test-frontend: node_modules
npx vitest npx vitest
.PHONY: test-frontend-coverage
test-frontend-coverage: node_modules
npx vitest --coverage --coverage.include 'web_src/**'
.PHONY: test-check .PHONY: test-check
test-check: test-check:
@echo "Running test-check..."; @echo "Running test-check...";

File diff suppressed because one or more lines are too long

View file

@ -20,11 +20,11 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1717974879, "lastModified": 1715534503,
"narHash": "sha256-GTO3C88+5DX171F/gVS3Qga/hOs/eRMxPFpiHq2t+D8=", "narHash": "sha256-5ZSVkFadZbFP1THataCaSf0JH2cAH3S29hU9rrxTEqk=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "c7b821ba2e1e635ba5a76d299af62821cbcb09f3", "rev": "2057814051972fa1453ddfb0d98badbea9b83c06",
"type": "github" "type": "github"
}, },
"original": { "original": {

View file

@ -30,7 +30,6 @@
# backend # backend
go_1_22 go_1_22
gofumpt
]; ];
}; };
} }

15
go.mod
View file

@ -5,7 +5,7 @@ go 1.22.0
toolchain go1.22.4 toolchain go1.22.4
require ( require (
code.forgejo.org/f3/gof3/v3 v3.4.0 code.forgejo.org/f3/gof3/v3 v3.3.1
code.forgejo.org/forgejo/reply v1.0.2 code.forgejo.org/forgejo/reply v1.0.2
code.gitea.io/actions-proto-go v0.4.0 code.gitea.io/actions-proto-go v0.4.0
code.gitea.io/gitea-vet v0.2.3 code.gitea.io/gitea-vet v0.2.3
@ -39,7 +39,7 @@ require (
github.com/gliderlabs/ssh v0.3.7 github.com/gliderlabs/ssh v0.3.7
github.com/go-ap/activitypub v0.0.0-20231114162308-e219254dc5c9 github.com/go-ap/activitypub v0.0.0-20231114162308-e219254dc5c9
github.com/go-ap/jsonld v0.0.0-20221030091449-f2a191312c73 github.com/go-ap/jsonld v0.0.0-20221030091449-f2a191312c73
github.com/go-chi/chi/v5 v5.0.14 github.com/go-chi/chi/v5 v5.0.11
github.com/go-chi/cors v1.2.1 github.com/go-chi/cors v1.2.1
github.com/go-co-op/gocron v1.37.0 github.com/go-co-op/gocron v1.37.0
github.com/go-enry/go-enry/v2 v2.8.8 github.com/go-enry/go-enry/v2 v2.8.8
@ -58,7 +58,7 @@ require (
github.com/google/go-github/v57 v57.0.0 github.com/google/go-github/v57 v57.0.0
github.com/google/pprof v0.0.0-20240528025155-186aa0362fba github.com/google/pprof v0.0.0-20240528025155-186aa0362fba
github.com/google/uuid v1.6.0 github.com/google/uuid v1.6.0
github.com/gorilla/feeds v1.2.0 github.com/gorilla/feeds v1.1.2
github.com/gorilla/sessions v1.2.2 github.com/gorilla/sessions v1.2.2
github.com/h2non/gock v1.2.0 github.com/h2non/gock v1.2.0
github.com/hashicorp/go-version v1.6.0 github.com/hashicorp/go-version v1.6.0
@ -101,12 +101,12 @@ require (
github.com/valyala/fastjson v1.6.4 github.com/valyala/fastjson v1.6.4
github.com/xanzy/go-gitlab v0.96.0 github.com/xanzy/go-gitlab v0.96.0
github.com/yohcop/openid-go v1.0.1 github.com/yohcop/openid-go v1.0.1
github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark v1.7.2
github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc
github.com/yuin/goldmark-meta v1.1.0 github.com/yuin/goldmark-meta v1.1.0
go.uber.org/mock v0.4.0 go.uber.org/mock v0.4.0
golang.org/x/crypto v0.24.0 golang.org/x/crypto v0.24.0
golang.org/x/image v0.18.0 golang.org/x/image v0.17.0
golang.org/x/net v0.26.0 golang.org/x/net v0.26.0
golang.org/x/oauth2 v0.21.0 golang.org/x/oauth2 v0.21.0
golang.org/x/sys v0.21.0 golang.org/x/sys v0.21.0
@ -213,7 +213,7 @@ require (
github.com/gorilla/securecookie v1.1.2 // indirect github.com/gorilla/securecookie v1.1.2 // indirect
github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 // indirect github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 // indirect
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
github.com/hashicorp/go-retryablehttp v0.7.7 // indirect github.com/hashicorp/go-retryablehttp v0.7.5 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect
github.com/imdario/mergo v0.3.16 // indirect github.com/imdario/mergo v0.3.16 // indirect
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
@ -259,7 +259,6 @@ require (
github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect
github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect
github.com/santhosh-tekuri/jsonschema/v6 v6.0.1 // indirect
github.com/segmentio/asm v1.2.0 // indirect github.com/segmentio/asm v1.2.0 // indirect
github.com/shopspring/decimal v1.4.0 // indirect github.com/shopspring/decimal v1.4.0 // indirect
github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c // indirect github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c // indirect
@ -304,6 +303,8 @@ replace github.com/shurcooL/vfsgen => github.com/lunny/vfsgen v0.0.0-20220105142
replace github.com/nektos/act => gitea.com/gitea/act v0.261.1 replace github.com/nektos/act => gitea.com/gitea/act v0.261.1
replace github.com/gorilla/feeds => github.com/yardenshoham/feeds v0.0.0-20240110072658-f3d0c21c0bd5
exclude github.com/gofrs/uuid v3.2.0+incompatible exclude github.com/gofrs/uuid v3.2.0+incompatible
exclude github.com/gofrs/uuid v4.0.0+incompatible exclude github.com/gofrs/uuid v4.0.0+incompatible

31
go.sum
View file

@ -1,7 +1,7 @@
cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc=
cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
code.forgejo.org/f3/gof3/v3 v3.4.0 h1:60LOo47tAKvr9nVu2qqNjbgRnCKeKx68mRMRBo/hIuA= code.forgejo.org/f3/gof3/v3 v3.3.1 h1:lG7vT1Y/OIJDcZJE+mm5uycLyOQm0nVwGxnIWcBQ5XY=
code.forgejo.org/f3/gof3/v3 v3.4.0/go.mod h1:9v7foN46KlEr5gywOSQPn1k5BVpPeuBozsLKlgOQ3YM= code.forgejo.org/f3/gof3/v3 v3.3.1/go.mod h1:Wk0xt06c72MPbEplc3TZYYOTTHDlCR15YpgFG0ggci8=
code.forgejo.org/forgejo/archiver/v3 v3.5.1 h1:UmmbA7D5550uf71SQjarmrn6yKwOGxtEjb3jaYYtmSE= code.forgejo.org/forgejo/archiver/v3 v3.5.1 h1:UmmbA7D5550uf71SQjarmrn6yKwOGxtEjb3jaYYtmSE=
code.forgejo.org/forgejo/archiver/v3 v3.5.1/go.mod h1:e3dqJ7H78uzsRSEACH1joayhuSyhnonssnDhppzS1L4= code.forgejo.org/forgejo/archiver/v3 v3.5.1/go.mod h1:e3dqJ7H78uzsRSEACH1joayhuSyhnonssnDhppzS1L4=
code.forgejo.org/forgejo/reply v1.0.2 h1:dMhQCHV6/O3L5CLWNTol+dNzDAuyCK88z4J/lCdgFuQ= code.forgejo.org/forgejo/reply v1.0.2 h1:dMhQCHV6/O3L5CLWNTol+dNzDAuyCK88z4J/lCdgFuQ=
@ -243,8 +243,8 @@ github.com/go-ap/jsonld v0.0.0-20221030091449-f2a191312c73/go.mod h1:jyveZeGw5La
github.com/go-asn1-ber/asn1-ber v1.5.5 h1:MNHlNMBDgEKD4TcKr36vQN68BA00aDfjIt3/bD50WnA= github.com/go-asn1-ber/asn1-ber v1.5.5 h1:MNHlNMBDgEKD4TcKr36vQN68BA00aDfjIt3/bD50WnA=
github.com/go-asn1-ber/asn1-ber v1.5.5/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= github.com/go-asn1-ber/asn1-ber v1.5.5/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0=
github.com/go-chi/chi/v5 v5.0.1/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-chi/chi/v5 v5.0.1/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=
github.com/go-chi/chi/v5 v5.0.14 h1:PyEwo2Vudraa0x/Wl6eDRRW2NXBvekgfxyydcM0WGE0= github.com/go-chi/chi/v5 v5.0.11 h1:BnpYbFZ3T3S1WMpD79r7R5ThWX40TaFB7L31Y8xqSwA=
github.com/go-chi/chi/v5 v5.0.14/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-chi/chi/v5 v5.0.11/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=
github.com/go-chi/cors v1.2.1 h1:xEC8UT3Rlp2QuWNEr4Fs/c2EAGVKBwy/1vHx3bppil4= github.com/go-chi/cors v1.2.1 h1:xEC8UT3Rlp2QuWNEr4Fs/c2EAGVKBwy/1vHx3bppil4=
github.com/go-chi/cors v1.2.1/go.mod h1:sSbTewc+6wYHBBCW7ytsFSn836hqM7JxpglAy2Vzc58= github.com/go-chi/cors v1.2.1/go.mod h1:sSbTewc+6wYHBBCW7ytsFSn836hqM7JxpglAy2Vzc58=
github.com/go-co-op/gocron v1.37.0 h1:ZYDJGtQ4OMhTLKOKMIch+/CY70Brbb1dGdooLEhh7b0= github.com/go-co-op/gocron v1.37.0 h1:ZYDJGtQ4OMhTLKOKMIch+/CY70Brbb1dGdooLEhh7b0=
@ -381,8 +381,6 @@ github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8=
github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0=
github.com/gorilla/feeds v1.2.0 h1:O6pBiXJ5JHhPvqy53NsjKOThq+dNFm8+DFrxBEdzSCc=
github.com/gorilla/feeds v1.2.0/go.mod h1:WMib8uJP3BbY+X8Szd1rA5Pzhdfh+HCCAYT2z7Fza6Y=
github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE=
github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w=
github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
@ -401,10 +399,11 @@ github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 h1:2VTzZjLZBgl62/EtslC
github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI= github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI=
github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=
github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ=
github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c=
github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=
github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= github.com/hashicorp/go-retryablehttp v0.7.5 h1:bJj+Pj19UZMIweq/iie+1u5YCdGrnxCT9yvm0e+Nd5M=
github.com/hashicorp/go-retryablehttp v0.7.5/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8=
github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
@ -634,8 +633,6 @@ github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6g
github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=
github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4= github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4=
github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPOhJotwFIyu2bBVN41fcDUY= github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPOhJotwFIyu2bBVN41fcDUY=
github.com/santhosh-tekuri/jsonschema/v6 v6.0.1 h1:PKK9DyHxif4LZo+uQSgXNqs0jj5+xZwwfKHgph2lxBw=
github.com/santhosh-tekuri/jsonschema/v6 v6.0.1/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU=
github.com/sassoftware/go-rpmutils v0.2.1-0.20240124161140-277b154961dd h1:KpbqRPDwcAQTyaP+L+YudTRb3CnJlQ64Hfn1SF/zHBA= github.com/sassoftware/go-rpmutils v0.2.1-0.20240124161140-277b154961dd h1:KpbqRPDwcAQTyaP+L+YudTRb3CnJlQ64Hfn1SF/zHBA=
github.com/sassoftware/go-rpmutils v0.2.1-0.20240124161140-277b154961dd/go.mod h1:TJJQYtLe/BeEmEjelI3b7xNZjzAukEkeWKmoakvaOoI= github.com/sassoftware/go-rpmutils v0.2.1-0.20240124161140-277b154961dd/go.mod h1:TJJQYtLe/BeEmEjelI3b7xNZjzAukEkeWKmoakvaOoI=
github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys= github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys=
@ -732,6 +729,8 @@ github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofm
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos=
github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913 h1:+qGGcbkzsfDQNPPe9UDgpxAWQrhbbBXOYJFQDq/dtJw= github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913 h1:+qGGcbkzsfDQNPPe9UDgpxAWQrhbbBXOYJFQDq/dtJw=
github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913/go.mod h1:4aEEwZQutDLsQv2Deui4iYQ6DWTxR14g6m8Wv88+Xqk= github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913/go.mod h1:4aEEwZQutDLsQv2Deui4iYQ6DWTxR14g6m8Wv88+Xqk=
github.com/yardenshoham/feeds v0.0.0-20240110072658-f3d0c21c0bd5 h1:3seWKGVhGoc66Ht5QlhQsr4xT2caDnFegsnh2NqvENU=
github.com/yardenshoham/feeds v0.0.0-20240110072658-f3d0c21c0bd5/go.mod h1:WMib8uJP3BbY+X8Szd1rA5Pzhdfh+HCCAYT2z7Fza6Y=
github.com/yohcop/openid-go v1.0.1 h1:DPRd3iPO5F6O5zX2e62XpVAbPT6wV51cuucH0z9g3js= github.com/yohcop/openid-go v1.0.1 h1:DPRd3iPO5F6O5zX2e62XpVAbPT6wV51cuucH0z9g3js=
github.com/yohcop/openid-go v1.0.1/go.mod h1:b/AvD03P0KHj4yuihb+VtLD6bYYgsy0zqBzPCRjkCNs= github.com/yohcop/openid-go v1.0.1/go.mod h1:b/AvD03P0KHj4yuihb+VtLD6bYYgsy0zqBzPCRjkCNs=
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
@ -740,8 +739,8 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/yuin/goldmark v1.4.15/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yuin/goldmark v1.4.15/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/yuin/goldmark v1.7.4 h1:BDXOHExt+A7gwPCJgPIIq7ENvceR7we7rOS9TNoLZeg= github.com/yuin/goldmark v1.7.2 h1:NjGd7lO7zrUn/A7eKwn5PEOt4ONYGqpxSEeZuduvgxc=
github.com/yuin/goldmark v1.7.4/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= github.com/yuin/goldmark v1.7.2/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E=
github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc h1:+IAOyRda+RLrxa1WC7umKOZRsGq4QrFFMYApOeHzQwQ= github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc h1:+IAOyRda+RLrxa1WC7umKOZRsGq4QrFFMYApOeHzQwQ=
github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc/go.mod h1:ovIvrum6DQJA4QsJSovrkC4saKHQVs7TvcaeO8AIl5I= github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc/go.mod h1:ovIvrum6DQJA4QsJSovrkC4saKHQVs7TvcaeO8AIl5I=
github.com/yuin/goldmark-meta v1.1.0 h1:pWw+JLHGZe8Rk0EGsMVssiNb/AaPMHfSRszZeUeiOUc= github.com/yuin/goldmark-meta v1.1.0 h1:pWw+JLHGZe8Rk0EGsMVssiNb/AaPMHfSRszZeUeiOUc=
@ -791,8 +790,8 @@ golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI=
golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM=
golang.org/x/exp v0.0.0-20240119083558-1b970713d09a h1:Q8/wZp0KX97QFTc2ywcOE0YRjZPVIx+MXInMzdvQqcA= golang.org/x/exp v0.0.0-20240119083558-1b970713d09a h1:Q8/wZp0KX97QFTc2ywcOE0YRjZPVIx+MXInMzdvQqcA=
golang.org/x/exp v0.0.0-20240119083558-1b970713d09a/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08= golang.org/x/exp v0.0.0-20240119083558-1b970713d09a/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=
golang.org/x/image v0.18.0 h1:jGzIakQa/ZXI1I0Fxvaa9W7yP25TqT6cHIHn+6CqvSQ= golang.org/x/image v0.17.0 h1:nTRVVdajgB8zCMZVsViyzhnMKPwYeroEERRC64JuLco=
golang.org/x/image v0.18.0/go.mod h1:4yyo5vMFQjVjUcVk4jEQcU9MGy/rulF5WvUILseCM2E= golang.org/x/image v0.17.0/go.mod h1:4yyo5vMFQjVjUcVk4jEQcU9MGy/rulF5WvUILseCM2E=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=

View file

@ -18,6 +18,12 @@ const (
SearchOrderByRecentUpdated SearchOrderBy = "updated_unix DESC" SearchOrderByRecentUpdated SearchOrderBy = "updated_unix DESC"
SearchOrderByOldest SearchOrderBy = "created_unix ASC" SearchOrderByOldest SearchOrderBy = "created_unix ASC"
SearchOrderByNewest SearchOrderBy = "created_unix DESC" SearchOrderByNewest SearchOrderBy = "created_unix DESC"
SearchOrderBySize SearchOrderBy = "size ASC"
SearchOrderBySizeReverse SearchOrderBy = "size DESC"
SearchOrderByGitSize SearchOrderBy = "git_size ASC"
SearchOrderByGitSizeReverse SearchOrderBy = "git_size DESC"
SearchOrderByLFSSize SearchOrderBy = "lfs_size ASC"
SearchOrderByLFSSizeReverse SearchOrderBy = "lfs_size DESC"
SearchOrderByID SearchOrderBy = "id ASC" SearchOrderByID SearchOrderBy = "id ASC"
SearchOrderByIDReverse SearchOrderBy = "id DESC" SearchOrderByIDReverse SearchOrderBy = "id DESC"
SearchOrderByStars SearchOrderBy = "num_stars ASC" SearchOrderByStars SearchOrderBy = "num_stars ASC"

View file

@ -215,15 +215,16 @@ func fileTimestampToTime(timestamp int64) time.Time {
return time.UnixMicro(timestamp) return time.UnixMicro(timestamp)
} }
func (f *file) loadMetaByPath() error { func (f *file) loadMetaByPath() (*dbfsMeta, error) {
var fileMeta dbfsMeta var fileMeta dbfsMeta
if ok, err := db.GetEngine(f.ctx).Where("full_path = ?", f.fullPath).Get(&fileMeta); err != nil { if ok, err := db.GetEngine(f.ctx).Where("full_path = ?", f.fullPath).Get(&fileMeta); err != nil {
return err return nil, err
} else if ok { } else if ok {
f.metaID = fileMeta.ID f.metaID = fileMeta.ID
f.blockSize = fileMeta.BlockSize f.blockSize = fileMeta.BlockSize
return &fileMeta, nil
} }
return nil return nil, nil
} }
func (f *file) open(flag int) (err error) { func (f *file) open(flag int) (err error) {
@ -287,7 +288,10 @@ func (f *file) createEmpty() error {
if err != nil { if err != nil {
return err return err
} }
return f.loadMetaByPath() if _, err = f.loadMetaByPath(); err != nil {
return err
}
return nil
} }
func (f *file) truncate() error { func (f *file) truncate() error {
@ -364,5 +368,8 @@ func buildPath(path string) string {
func newDbFile(ctx context.Context, path string) (*file, error) { func newDbFile(ctx context.Context, path string) (*file, error) {
path = buildPath(path) path = buildPath(path)
f := &file{ctx: ctx, fullPath: path, blockSize: defaultFileBlockSize} f := &file{ctx: ctx, fullPath: path, blockSize: defaultFileBlockSize}
return f, f.loadMetaByPath() if _, err := f.loadMetaByPath(); err != nil {
return nil, err
}
return f, nil
} }

View file

@ -110,19 +110,6 @@ func GetProtectedTagByID(ctx context.Context, id int64) (*ProtectedTag, error) {
return tag, nil return tag, nil
} }
// GetProtectedTagByNamePattern gets protected tag by name_pattern
func GetProtectedTagByNamePattern(ctx context.Context, repoID int64, pattern string) (*ProtectedTag, error) {
tag := &ProtectedTag{NamePattern: pattern, RepoID: repoID}
has, err := db.GetEngine(ctx).Get(tag)
if err != nil {
return nil, err
}
if !has {
return nil, nil
}
return tag, nil
}
// IsUserAllowedToControlTag checks if a user can control the specific tag. // IsUserAllowedToControlTag checks if a user can control the specific tag.
// It returns true if the tag name is not protected or the user is allowed to control it. // It returns true if the tag name is not protected or the user is allowed to control it.
func IsUserAllowedToControlTag(ctx context.Context, tags []*ProtectedTag, tagName string, userID int64) (bool, error) { func IsUserAllowedToControlTag(ctx context.Context, tags []*ProtectedTag, tagName string, userID int64) (bool, error) {

View file

@ -99,9 +99,9 @@ func applySorts(sess *xorm.Session, sortType string, priorityRepoID int64) {
} }
} }
func applyLimit(sess *xorm.Session, opts *IssuesOptions) { func applyLimit(sess *xorm.Session, opts *IssuesOptions) *xorm.Session {
if opts.Paginator == nil || opts.Paginator.IsListAll() { if opts.Paginator == nil || opts.Paginator.IsListAll() {
return return sess
} }
start := 0 start := 0
@ -109,9 +109,11 @@ func applyLimit(sess *xorm.Session, opts *IssuesOptions) {
start = (opts.Paginator.Page - 1) * opts.Paginator.PageSize start = (opts.Paginator.Page - 1) * opts.Paginator.PageSize
} }
sess.Limit(opts.Paginator.PageSize, start) sess.Limit(opts.Paginator.PageSize, start)
return sess
} }
func applyLabelsCondition(sess *xorm.Session, opts *IssuesOptions) { func applyLabelsCondition(sess *xorm.Session, opts *IssuesOptions) *xorm.Session {
if len(opts.LabelIDs) > 0 { if len(opts.LabelIDs) > 0 {
if opts.LabelIDs[0] == 0 { if opts.LabelIDs[0] == 0 {
sess.Where("issue.id NOT IN (SELECT issue_id FROM issue_label)") sess.Where("issue.id NOT IN (SELECT issue_id FROM issue_label)")
@ -134,9 +136,11 @@ func applyLabelsCondition(sess *xorm.Session, opts *IssuesOptions) {
if len(opts.ExcludedLabelNames) > 0 { if len(opts.ExcludedLabelNames) > 0 {
sess.And(builder.NotIn("issue.id", BuildLabelNamesIssueIDsCondition(opts.ExcludedLabelNames))) sess.And(builder.NotIn("issue.id", BuildLabelNamesIssueIDsCondition(opts.ExcludedLabelNames)))
} }
return sess
} }
func applyMilestoneCondition(sess *xorm.Session, opts *IssuesOptions) { func applyMilestoneCondition(sess *xorm.Session, opts *IssuesOptions) *xorm.Session {
if len(opts.MilestoneIDs) == 1 && opts.MilestoneIDs[0] == db.NoConditionID { if len(opts.MilestoneIDs) == 1 && opts.MilestoneIDs[0] == db.NoConditionID {
sess.And("issue.milestone_id = 0") sess.And("issue.milestone_id = 0")
} else if len(opts.MilestoneIDs) > 0 { } else if len(opts.MilestoneIDs) > 0 {
@ -149,9 +153,11 @@ func applyMilestoneCondition(sess *xorm.Session, opts *IssuesOptions) {
From("milestone"). From("milestone").
Where(builder.In("name", opts.IncludeMilestones))) Where(builder.In("name", opts.IncludeMilestones)))
} }
return sess
} }
func applyProjectCondition(sess *xorm.Session, opts *IssuesOptions) { func applyProjectCondition(sess *xorm.Session, opts *IssuesOptions) *xorm.Session {
if opts.ProjectID > 0 { // specific project if opts.ProjectID > 0 { // specific project
sess.Join("INNER", "project_issue", "issue.id = project_issue.issue_id"). sess.Join("INNER", "project_issue", "issue.id = project_issue.issue_id").
And("project_issue.project_id=?", opts.ProjectID) And("project_issue.project_id=?", opts.ProjectID)
@ -160,9 +166,10 @@ func applyProjectCondition(sess *xorm.Session, opts *IssuesOptions) {
} }
// opts.ProjectID == 0 means all projects, // opts.ProjectID == 0 means all projects,
// do not need to apply any condition // do not need to apply any condition
return sess
} }
func applyProjectColumnCondition(sess *xorm.Session, opts *IssuesOptions) { func applyProjectColumnCondition(sess *xorm.Session, opts *IssuesOptions) *xorm.Session {
// opts.ProjectColumnID == 0 means all project columns, // opts.ProjectColumnID == 0 means all project columns,
// do not need to apply any condition // do not need to apply any condition
if opts.ProjectColumnID > 0 { if opts.ProjectColumnID > 0 {
@ -170,9 +177,10 @@ func applyProjectColumnCondition(sess *xorm.Session, opts *IssuesOptions) {
} else if opts.ProjectColumnID == db.NoConditionID { } else if opts.ProjectColumnID == db.NoConditionID {
sess.In("issue.id", builder.Select("issue_id").From("project_issue").Where(builder.Eq{"project_board_id": 0})) sess.In("issue.id", builder.Select("issue_id").From("project_issue").Where(builder.Eq{"project_board_id": 0}))
} }
return sess
} }
func applyRepoConditions(sess *xorm.Session, opts *IssuesOptions) { func applyRepoConditions(sess *xorm.Session, opts *IssuesOptions) *xorm.Session {
if len(opts.RepoIDs) == 1 { if len(opts.RepoIDs) == 1 {
opts.RepoCond = builder.Eq{"issue.repo_id": opts.RepoIDs[0]} opts.RepoCond = builder.Eq{"issue.repo_id": opts.RepoIDs[0]}
} else if len(opts.RepoIDs) > 1 { } else if len(opts.RepoIDs) > 1 {
@ -187,9 +195,10 @@ func applyRepoConditions(sess *xorm.Session, opts *IssuesOptions) {
if opts.RepoCond != nil { if opts.RepoCond != nil {
sess.And(opts.RepoCond) sess.And(opts.RepoCond)
} }
return sess
} }
func applyConditions(sess *xorm.Session, opts *IssuesOptions) { func applyConditions(sess *xorm.Session, opts *IssuesOptions) *xorm.Session {
if len(opts.IssueIDs) > 0 { if len(opts.IssueIDs) > 0 {
sess.In("issue.id", opts.IssueIDs) sess.In("issue.id", opts.IssueIDs)
} }
@ -252,6 +261,8 @@ func applyConditions(sess *xorm.Session, opts *IssuesOptions) {
if opts.User != nil { if opts.User != nil {
sess.And(issuePullAccessibleRepoCond("issue.repo_id", opts.User.ID, opts.Org, opts.Team, opts.IsPull.Value())) sess.And(issuePullAccessibleRepoCond("issue.repo_id", opts.User.ID, opts.Org, opts.Team, opts.IsPull.Value()))
} }
return sess
} }
// teamUnitsRepoCond returns query condition for those repo id in the special org team with special units access // teamUnitsRepoCond returns query condition for those repo id in the special org team with special units access
@ -328,22 +339,22 @@ func issuePullAccessibleRepoCond(repoIDstr string, userID int64, org *organizati
return cond return cond
} }
func applyAssigneeCondition(sess *xorm.Session, assigneeID int64) { func applyAssigneeCondition(sess *xorm.Session, assigneeID int64) *xorm.Session {
sess.Join("INNER", "issue_assignees", "issue.id = issue_assignees.issue_id"). return sess.Join("INNER", "issue_assignees", "issue.id = issue_assignees.issue_id").
And("issue_assignees.assignee_id = ?", assigneeID) And("issue_assignees.assignee_id = ?", assigneeID)
} }
func applyPosterCondition(sess *xorm.Session, posterID int64) { func applyPosterCondition(sess *xorm.Session, posterID int64) *xorm.Session {
sess.And("issue.poster_id=?", posterID) return sess.And("issue.poster_id=?", posterID)
} }
func applyMentionedCondition(sess *xorm.Session, mentionedID int64) { func applyMentionedCondition(sess *xorm.Session, mentionedID int64) *xorm.Session {
sess.Join("INNER", "issue_user", "issue.id = issue_user.issue_id"). return sess.Join("INNER", "issue_user", "issue.id = issue_user.issue_id").
And("issue_user.is_mentioned = ?", true). And("issue_user.is_mentioned = ?", true).
And("issue_user.uid = ?", mentionedID) And("issue_user.uid = ?", mentionedID)
} }
func applyReviewRequestedCondition(sess *xorm.Session, reviewRequestedID int64) { func applyReviewRequestedCondition(sess *xorm.Session, reviewRequestedID int64) *xorm.Session {
existInTeamQuery := builder.Select("team_user.team_id"). existInTeamQuery := builder.Select("team_user.team_id").
From("team_user"). From("team_user").
Where(builder.Eq{"team_user.uid": reviewRequestedID}) Where(builder.Eq{"team_user.uid": reviewRequestedID})
@ -364,11 +375,11 @@ func applyReviewRequestedCondition(sess *xorm.Session, reviewRequestedID int64)
), ),
builder.In("review.id", maxReview), builder.In("review.id", maxReview),
)) ))
sess.Where("issue.poster_id <> ?", reviewRequestedID). return sess.Where("issue.poster_id <> ?", reviewRequestedID).
And(builder.In("issue.id", subQuery)) And(builder.In("issue.id", subQuery))
} }
func applyReviewedCondition(sess *xorm.Session, reviewedID int64) { func applyReviewedCondition(sess *xorm.Session, reviewedID int64) *xorm.Session {
// Query for pull requests where you are a reviewer or commenter, excluding // Query for pull requests where you are a reviewer or commenter, excluding
// any pull requests already returned by the review requested filter. // any pull requests already returned by the review requested filter.
notPoster := builder.Neq{"issue.poster_id": reviewedID} notPoster := builder.Neq{"issue.poster_id": reviewedID}
@ -395,11 +406,11 @@ func applyReviewedCondition(sess *xorm.Session, reviewedID int64) {
builder.In("type", CommentTypeComment, CommentTypeCode, CommentTypeReview), builder.In("type", CommentTypeComment, CommentTypeCode, CommentTypeReview),
)), )),
) )
sess.And(notPoster, builder.Or(reviewed, commented)) return sess.And(notPoster, builder.Or(reviewed, commented))
} }
func applySubscribedCondition(sess *xorm.Session, subscriberID int64) { func applySubscribedCondition(sess *xorm.Session, subscriberID int64) *xorm.Session {
sess.And( return sess.And(
builder. builder.
NotIn("issue.id", NotIn("issue.id",
builder.Select("issue_id"). builder.Select("issue_id").

View file

@ -28,7 +28,7 @@ type PullRequestsOptions struct {
MilestoneID int64 MilestoneID int64
} }
func listPullRequestStatement(ctx context.Context, baseRepoID int64, opts *PullRequestsOptions) *xorm.Session { func listPullRequestStatement(ctx context.Context, baseRepoID int64, opts *PullRequestsOptions) (*xorm.Session, error) {
sess := db.GetEngine(ctx).Where("pull_request.base_repo_id=?", baseRepoID) sess := db.GetEngine(ctx).Where("pull_request.base_repo_id=?", baseRepoID)
sess.Join("INNER", "issue", "pull_request.issue_id = issue.id") sess.Join("INNER", "issue", "pull_request.issue_id = issue.id")
@ -46,7 +46,7 @@ func listPullRequestStatement(ctx context.Context, baseRepoID int64, opts *PullR
sess.And("issue.milestone_id=?", opts.MilestoneID) sess.And("issue.milestone_id=?", opts.MilestoneID)
} }
return sess return sess, nil
} }
func GetUnmergedPullRequestsByHeadInfoMax(ctx context.Context, repoID, olderThan int64, branch string) ([]*PullRequest, error) { func GetUnmergedPullRequestsByHeadInfoMax(ctx context.Context, repoID, olderThan int64, branch string) ([]*PullRequest, error) {
@ -136,15 +136,23 @@ func PullRequests(ctx context.Context, baseRepoID int64, opts *PullRequestsOptio
opts.Page = 1 opts.Page = 1
} }
countSession := listPullRequestStatement(ctx, baseRepoID, opts) countSession, err := listPullRequestStatement(ctx, baseRepoID, opts)
if err != nil {
log.Error("listPullRequestStatement: %v", err)
return nil, 0, err
}
maxResults, err := countSession.Count(new(PullRequest)) maxResults, err := countSession.Count(new(PullRequest))
if err != nil { if err != nil {
log.Error("Count PRs: %v", err) log.Error("Count PRs: %v", err)
return nil, maxResults, err return nil, maxResults, err
} }
findSession := listPullRequestStatement(ctx, baseRepoID, opts) findSession, err := listPullRequestStatement(ctx, baseRepoID, opts)
applySorts(findSession, opts.SortType, 0) applySorts(findSession, opts.SortType, 0)
if err != nil {
log.Error("listPullRequestStatement: %v", err)
return nil, maxResults, err
}
findSession = db.SetSessionPagination(findSession, opts) findSession = db.SetSessionPagination(findSession, opts)
prs := make([]*PullRequest, 0, opts.PageSize) prs := make([]*PullRequest, 0, opts.PageSize)
return prs, maxResults, findSession.Find(&prs) return prs, maxResults, findSession.Find(&prs)
@ -198,10 +206,8 @@ func (prs PullRequestList) LoadIssues(ctx context.Context) (IssueList, error) {
return nil, nil return nil, nil
} }
// Load issues which are not loaded // Load issues.
issueIDs := container.FilterSlice(prs, func(pr *PullRequest) (int64, bool) { issueIDs := prs.GetIssueIDs()
return pr.IssueID, pr.Issue == nil && pr.IssueID > 0
})
issues := make(map[int64]*Issue, len(issueIDs)) issues := make(map[int64]*Issue, len(issueIDs))
if err := db.GetEngine(ctx). if err := db.GetEngine(ctx).
In("id", issueIDs). In("id", issueIDs).
@ -237,7 +243,10 @@ func (prs PullRequestList) LoadIssues(ctx context.Context) (IssueList, error) {
// GetIssueIDs returns all issue ids // GetIssueIDs returns all issue ids
func (prs PullRequestList) GetIssueIDs() []int64 { func (prs PullRequestList) GetIssueIDs() []int64 {
return container.FilterSlice(prs, func(pr *PullRequest) (int64, bool) { return container.FilterSlice(prs, func(pr *PullRequest) (int64, bool) {
return pr.IssueID, pr.IssueID > 0 if pr.Issue == nil {
return pr.IssueID, pr.IssueID > 0
}
return 0, false
}) })
} }

View file

@ -205,6 +205,31 @@ type SearchRepoOptions struct {
OnlyShowRelevant bool OnlyShowRelevant bool
} }
// SearchOrderBy is used to sort the result
type SearchOrderBy string
func (s SearchOrderBy) String() string {
return string(s)
}
// Strings for sorting result
const (
SearchOrderByAlphabetically SearchOrderBy = "name ASC"
SearchOrderByAlphabeticallyReverse SearchOrderBy = "name DESC"
SearchOrderByLeastUpdated SearchOrderBy = "updated_unix ASC"
SearchOrderByRecentUpdated SearchOrderBy = "updated_unix DESC"
SearchOrderByOldest SearchOrderBy = "created_unix ASC"
SearchOrderByNewest SearchOrderBy = "created_unix DESC"
SearchOrderBySize SearchOrderBy = "size ASC"
SearchOrderBySizeReverse SearchOrderBy = "size DESC"
SearchOrderByID SearchOrderBy = "id ASC"
SearchOrderByIDReverse SearchOrderBy = "id DESC"
SearchOrderByStars SearchOrderBy = "num_stars ASC"
SearchOrderByStarsReverse SearchOrderBy = "num_stars DESC"
SearchOrderByForks SearchOrderBy = "num_forks ASC"
SearchOrderByForksReverse SearchOrderBy = "num_forks DESC"
)
// UserOwnedRepoCond returns user ownered repositories // UserOwnedRepoCond returns user ownered repositories
func UserOwnedRepoCond(userID int64) builder.Cond { func UserOwnedRepoCond(userID int64) builder.Cond {
return builder.Eq{ return builder.Eq{

View file

@ -5,48 +5,20 @@ package repo
import "code.gitea.io/gitea/models/db" import "code.gitea.io/gitea/models/db"
// OrderByMap represents all possible search order // SearchOrderByMap represents all possible search order
var OrderByMap = map[string]map[string]db.SearchOrderBy{ var SearchOrderByMap = map[string]map[string]db.SearchOrderBy{
"asc": { "asc": {
"alpha": "owner_name ASC, name ASC", "alpha": "owner_name ASC, name ASC",
"created": db.SearchOrderByOldest, "created": db.SearchOrderByOldest,
"updated": db.SearchOrderByLeastUpdated, "updated": db.SearchOrderByLeastUpdated,
"size": "size ASC", "size": db.SearchOrderBySize,
"git_size": "git_size ASC", "id": db.SearchOrderByID,
"lfs_size": "lfs_size ASC",
"id": db.SearchOrderByID,
"stars": db.SearchOrderByStars,
"forks": db.SearchOrderByForks,
}, },
"desc": { "desc": {
"alpha": "owner_name DESC, name DESC", "alpha": "owner_name DESC, name DESC",
"created": db.SearchOrderByNewest, "created": db.SearchOrderByNewest,
"updated": db.SearchOrderByRecentUpdated, "updated": db.SearchOrderByRecentUpdated,
"size": "size DESC", "size": db.SearchOrderBySizeReverse,
"git_size": "git_size DESC", "id": db.SearchOrderByIDReverse,
"lfs_size": "lfs_size DESC",
"id": db.SearchOrderByIDReverse,
"stars": db.SearchOrderByStarsReverse,
"forks": db.SearchOrderByForksReverse,
}, },
} }
// OrderByFlatMap is similar to OrderByMap but use human language keywords
// to decide between asc and desc
var OrderByFlatMap = map[string]db.SearchOrderBy{
"newest": OrderByMap["desc"]["created"],
"oldest": OrderByMap["asc"]["created"],
"leastupdate": OrderByMap["asc"]["updated"],
"reversealphabetically": OrderByMap["desc"]["alpha"],
"alphabetically": OrderByMap["asc"]["alpha"],
"reversesize": OrderByMap["desc"]["size"],
"size": OrderByMap["asc"]["size"],
"reversegitsize": OrderByMap["desc"]["git_size"],
"gitsize": OrderByMap["asc"]["git_size"],
"reverselfssize": OrderByMap["desc"]["lfs_size"],
"lfssize": OrderByMap["asc"]["lfs_size"],
"moststars": OrderByMap["desc"]["stars"],
"feweststars": OrderByMap["asc"]["stars"],
"mostforks": OrderByMap["desc"]["forks"],
"fewestforks": OrderByMap["asc"]["forks"],
}

View file

@ -18,7 +18,7 @@ func parseIntParam(value, param, algorithmName, config string, previousErr error
return parsed, previousErr // <- Keep the previous error as this function should still return an error once everything has been checked if any call failed return parsed, previousErr // <- Keep the previous error as this function should still return an error once everything has been checked if any call failed
} }
func parseUIntParam(value, param, algorithmName, config string, previousErr error) (uint64, error) { //nolint:unparam func parseUIntParam(value, param, algorithmName, config string, previousErr error) (uint64, error) {
parsed, err := strconv.ParseUint(value, 10, 64) parsed, err := strconv.ParseUint(value, 10, 64)
if err != nil { if err != nil {
log.Error("invalid integer for %s representation in %s hash spec %s", param, algorithmName, config) log.Error("invalid integer for %s representation in %s hash spec %s", param, algorithmName, config)

View file

@ -6,7 +6,6 @@ package cache
import ( import (
"fmt" "fmt"
"strconv" "strconv"
"time"
"code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/setting"
@ -41,37 +40,6 @@ func Init() error {
return err return err
} }
const (
testCacheKey = "DefaultCache.TestKey"
SlowCacheThreshold = 100 * time.Microsecond
)
func Test() (time.Duration, error) {
if conn == nil {
return 0, fmt.Errorf("default cache not initialized")
}
testData := fmt.Sprintf("%x", make([]byte, 500))
start := time.Now()
if err := conn.Delete(testCacheKey); err != nil {
return 0, fmt.Errorf("expect cache to delete data based on key if exist but got: %w", err)
}
if err := conn.Put(testCacheKey, testData, 10); err != nil {
return 0, fmt.Errorf("expect cache to store data but got: %w", err)
}
testVal := conn.Get(testCacheKey)
if testVal == nil {
return 0, fmt.Errorf("expect cache hit but got none")
}
if testVal != testData {
return 0, fmt.Errorf("expect cache to return same value as stored but got other")
}
return time.Since(start), nil
}
// GetCache returns the currently configured cache // GetCache returns the currently configured cache
func GetCache() mc.Cache { func GetCache() mc.Cache {
return conn return conn

View file

@ -9,7 +9,6 @@ import (
"time" "time"
"code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/test"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
@ -35,18 +34,6 @@ func TestNewContext(t *testing.T) {
assert.Nil(t, con) assert.Nil(t, con)
} }
func TestTest(t *testing.T) {
defer test.MockVariableValue(&conn, nil)()
_, err := Test()
assert.Error(t, err)
createTestCache()
elapsed, err := Test()
assert.NoError(t, err)
// mem cache should take from 300ns up to 1ms on modern hardware ...
assert.Less(t, elapsed, SlowCacheThreshold)
}
func TestGetCache(t *testing.T) { func TestGetCache(t *testing.T) {
createTestCache() createTestCache()

View file

@ -42,19 +42,20 @@ var (
) )
// loadGitVersion returns current Git version from shell. Internal usage only. // loadGitVersion returns current Git version from shell. Internal usage only.
func loadGitVersion() error { func loadGitVersion() (*version.Version, error) {
// doesn't need RWMutex because it's executed by Init() // doesn't need RWMutex because it's executed by Init()
if gitVersion != nil { if gitVersion != nil {
return nil return gitVersion, nil
} }
stdout, _, runErr := NewCommand(DefaultContext, "version").RunStdString(nil) stdout, _, runErr := NewCommand(DefaultContext, "version").RunStdString(nil)
if runErr != nil { if runErr != nil {
return runErr return nil, runErr
} }
fields := strings.Fields(stdout) fields := strings.Fields(stdout)
if len(fields) < 3 { if len(fields) < 3 {
return fmt.Errorf("invalid git version output: %s", stdout) return nil, fmt.Errorf("invalid git version output: %s", stdout)
} }
var versionString string var versionString string
@ -69,7 +70,7 @@ func loadGitVersion() error {
var err error var err error
gitVersion, err = version.NewVersion(versionString) gitVersion, err = version.NewVersion(versionString)
return err return gitVersion, err
} }
// SetExecutablePath changes the path of git executable and checks the file permission and version. // SetExecutablePath changes the path of git executable and checks the file permission and version.
@ -84,7 +85,7 @@ func SetExecutablePath(path string) error {
} }
GitExecutable = absPath GitExecutable = absPath
err = loadGitVersion() _, err = loadGitVersion()
if err != nil { if err != nil {
return fmt.Errorf("unable to load git version: %w", err) return fmt.Errorf("unable to load git version: %w", err)
} }
@ -311,7 +312,7 @@ func syncGitConfig() (err error) {
// CheckGitVersionAtLeast check git version is at least the constraint version // CheckGitVersionAtLeast check git version is at least the constraint version
func CheckGitVersionAtLeast(atLeast string) error { func CheckGitVersionAtLeast(atLeast string) error {
if err := loadGitVersion(); err != nil { if _, err := loadGitVersion(); err != nil {
return err return err
} }
atLeastVersion, err := version.NewVersion(atLeast) atLeastVersion, err := version.NewVersion(atLeast)
@ -326,7 +327,7 @@ func CheckGitVersionAtLeast(atLeast string) error {
// CheckGitVersionEqual checks if the git version is equal to the constraint version. // CheckGitVersionEqual checks if the git version is equal to the constraint version.
func CheckGitVersionEqual(equal string) error { func CheckGitVersionEqual(equal string) error {
if err := loadGitVersion(); err != nil { if _, err := loadGitVersion(); err != nil {
return err return err
} }
atLeastVersion, err := version.NewVersion(equal) atLeastVersion, err := version.NewVersion(equal)

View file

@ -34,13 +34,13 @@ type ObjectFormat interface {
ComputeHash(t ObjectType, content []byte) ObjectID ComputeHash(t ObjectType, content []byte) ObjectID
} }
func computeHash(dst []byte, hasher hash.Hash, t ObjectType, content []byte) { func computeHash(dst []byte, hasher hash.Hash, t ObjectType, content []byte) []byte {
_, _ = hasher.Write(t.Bytes()) _, _ = hasher.Write(t.Bytes())
_, _ = hasher.Write([]byte(" ")) _, _ = hasher.Write([]byte(" "))
_, _ = hasher.Write([]byte(strconv.Itoa(len(content)))) _, _ = hasher.Write([]byte(strconv.Itoa(len(content))))
_, _ = hasher.Write([]byte{0}) _, _ = hasher.Write([]byte{0})
_, _ = hasher.Write(content) _, _ = hasher.Write(content)
hasher.Sum(dst) return hasher.Sum(dst)
} }
/* SHA1 Type */ /* SHA1 Type */

View file

@ -38,12 +38,6 @@ func ToSearchOptions(keyword string, opts *issues_model.IssuesOptions) *SearchOp
searchOpt.MilestoneIDs = opts.MilestoneIDs searchOpt.MilestoneIDs = opts.MilestoneIDs
} }
if opts.ProjectID > 0 {
searchOpt.ProjectID = optional.Some(opts.ProjectID)
} else if opts.ProjectID == -1 { // FIXME: this is inconsistent from other places
searchOpt.ProjectID = optional.Some[int64](0) // Those issues with no project(projectid==0)
}
// See the comment of issues_model.SearchOptions for the reason why we need to convert // See the comment of issues_model.SearchOptions for the reason why we need to convert
convertID := func(id int64) optional.Option[int64] { convertID := func(id int64) optional.Option[int64] {
if id > 0 { if id > 0 {
@ -55,6 +49,7 @@ func ToSearchOptions(keyword string, opts *issues_model.IssuesOptions) *SearchOp
return nil return nil
} }
searchOpt.ProjectID = convertID(opts.ProjectID)
searchOpt.ProjectColumnID = convertID(opts.ProjectColumnID) searchOpt.ProjectColumnID = convertID(opts.ProjectColumnID)
searchOpt.PosterID = convertID(opts.PosterID) searchOpt.PosterID = convertID(opts.PosterID)
searchOpt.AssigneeID = convertID(opts.AssigneeID) searchOpt.AssigneeID = convertID(opts.AssigneeID)

View file

@ -211,7 +211,7 @@ func createRequest(ctx context.Context, method, url string, headers map[string]s
for key, value := range headers { for key, value := range headers {
req.Header.Set(key, value) req.Header.Set(key, value)
} }
req.Header.Set("Accept", AcceptHeader) req.Header.Set("Accept", MediaType)
return req, nil return req, nil
} }
@ -251,6 +251,6 @@ func handleErrorResponse(resp *http.Response) error {
return err return err
} }
log.Trace("ErrorResponse(%v): %v", resp.Status, er) log.Trace("ErrorResponse: %v", er)
return errors.New(er.Message) return errors.New(er.Message)
} }

View file

@ -155,7 +155,7 @@ func TestHTTPClientDownload(t *testing.T) {
hc := &http.Client{Transport: RoundTripFunc(func(req *http.Request) *http.Response { hc := &http.Client{Transport: RoundTripFunc(func(req *http.Request) *http.Response {
assert.Equal(t, "POST", req.Method) assert.Equal(t, "POST", req.Method)
assert.Equal(t, MediaType, req.Header.Get("Content-type")) assert.Equal(t, MediaType, req.Header.Get("Content-type"))
assert.Equal(t, AcceptHeader, req.Header.Get("Accept")) assert.Equal(t, MediaType, req.Header.Get("Accept"))
var batchRequest BatchRequest var batchRequest BatchRequest
err := json.NewDecoder(req.Body).Decode(&batchRequest) err := json.NewDecoder(req.Body).Decode(&batchRequest)
@ -263,7 +263,7 @@ func TestHTTPClientUpload(t *testing.T) {
hc := &http.Client{Transport: RoundTripFunc(func(req *http.Request) *http.Response { hc := &http.Client{Transport: RoundTripFunc(func(req *http.Request) *http.Response {
assert.Equal(t, "POST", req.Method) assert.Equal(t, "POST", req.Method)
assert.Equal(t, MediaType, req.Header.Get("Content-type")) assert.Equal(t, MediaType, req.Header.Get("Content-type"))
assert.Equal(t, AcceptHeader, req.Header.Get("Accept")) assert.Equal(t, MediaType, req.Header.Get("Accept"))
var batchRequest BatchRequest var batchRequest BatchRequest
err := json.NewDecoder(req.Body).Decode(&batchRequest) err := json.NewDecoder(req.Body).Decode(&batchRequest)

View file

@ -10,8 +10,6 @@ import (
const ( const (
// MediaType contains the media type for LFS server requests // MediaType contains the media type for LFS server requests
MediaType = "application/vnd.git-lfs+json" MediaType = "application/vnd.git-lfs+json"
// Some LFS servers offer content with other types, so fallback to '*/*' if application/vnd.git-lfs+json cannot be served
AcceptHeader = "application/vnd.git-lfs+json;q=0.9, */*;q=0.8"
) )
// BatchRequest contains multiple requests processed in one batch operation. // BatchRequest contains multiple requests processed in one batch operation.

View file

@ -37,7 +37,6 @@ func (a *BasicTransferAdapter) Download(ctx context.Context, l *Link) (io.ReadCl
if err != nil { if err != nil {
return nil, err return nil, err
} }
log.Debug("Download Request: %+v", req)
resp, err := performRequest(ctx, a.client, req) resp, err := performRequest(ctx, a.client, req)
if err != nil { if err != nil {
return nil, err return nil, err

View file

@ -26,7 +26,7 @@ func TestBasicTransferAdapter(t *testing.T) {
p := Pointer{Oid: "b5a2c96250612366ea272ffac6d9744aaf4b45aacd96aa7cfcb931ee3b558259", Size: 5} p := Pointer{Oid: "b5a2c96250612366ea272ffac6d9744aaf4b45aacd96aa7cfcb931ee3b558259", Size: 5}
roundTripHandler := func(req *http.Request) *http.Response { roundTripHandler := func(req *http.Request) *http.Response {
assert.Equal(t, AcceptHeader, req.Header.Get("Accept")) assert.Equal(t, MediaType, req.Header.Get("Accept"))
assert.Equal(t, "test-value", req.Header.Get("test-header")) assert.Equal(t, "test-value", req.Header.Get("test-header"))
url := req.URL.String() url := req.URL.String()

View file

@ -48,7 +48,7 @@ var (
// hashCurrentPattern matches string that represents a commit SHA, e.g. d8a994ef243349f321568f9e36d5c3f444b99cae // hashCurrentPattern matches string that represents a commit SHA, e.g. d8a994ef243349f321568f9e36d5c3f444b99cae
// Although SHA1 hashes are 40 chars long, SHA256 are 64, the regex matches the hash from 7 to 64 chars in length // Although SHA1 hashes are 40 chars long, SHA256 are 64, the regex matches the hash from 7 to 64 chars in length
// so that abbreviated hash links can be used as well. This matches git and GitHub usability. // so that abbreviated hash links can be used as well. This matches git and GitHub usability.
hashCurrentPattern = regexp.MustCompile(`(?:\s|^|\(|\[)([0-9a-f]{7,64})(?:\s|$|\)|\]|[.,:](\s|$))`) hashCurrentPattern = regexp.MustCompile(`(?:\s|^|\(|\[)([0-9a-f]{7,64})(?:\s|$|\)|\]|[.,](\s|$))`)
// shortLinkPattern matches short but difficult to parse [[name|link|arg=test]] syntax // shortLinkPattern matches short but difficult to parse [[name|link|arg=test]] syntax
shortLinkPattern = regexp.MustCompile(`\[\[(.*?)\]\](\w*)`) shortLinkPattern = regexp.MustCompile(`\[\[(.*?)\]\](\w*)`)
@ -143,6 +143,20 @@ func CustomLinkURLSchemes(schemes []string) {
common.LinkRegex, _ = xurls.StrictMatchingScheme(strings.Join(withAuth, "|")) common.LinkRegex, _ = xurls.StrictMatchingScheme(strings.Join(withAuth, "|"))
} }
// IsSameDomain checks if given url string has the same hostname as current Gitea instance
func IsSameDomain(s string) bool {
if strings.HasPrefix(s, "/") {
return true
}
if uapp, err := url.Parse(setting.AppURL); err == nil {
if u, err := url.Parse(s); err == nil {
return u.Host == uapp.Host
}
return false
}
return false
}
type postProcessError struct { type postProcessError struct {
context string context string
err error err error
@ -379,7 +393,7 @@ func visitNode(ctx *RenderContext, procs []processor, node *html.Node) {
// We ignore code and pre. // We ignore code and pre.
switch node.Type { switch node.Type {
case html.TextNode: case html.TextNode:
processTextNodes(ctx, procs, node) textNode(ctx, procs, node)
case html.ElementNode: case html.ElementNode:
if node.Data == "img" { if node.Data == "img" {
for i, attr := range node.Attr { for i, attr := range node.Attr {
@ -422,16 +436,15 @@ func visitNode(ctx *RenderContext, procs []processor, node *html.Node) {
for n := node.FirstChild; n != nil; n = n.NextSibling { for n := node.FirstChild; n != nil; n = n.NextSibling {
visitNode(ctx, procs, n) visitNode(ctx, procs, n)
} }
default:
} }
// ignore everything else // ignore everything else
} }
// processTextNodes runs the passed node through various processors, in order to handle // textNode runs the passed node through various processors, in order to handle
// all kinds of special links handled by the post-processing. // all kinds of special links handled by the post-processing.
func processTextNodes(ctx *RenderContext, procs []processor, node *html.Node) { func textNode(ctx *RenderContext, procs []processor, node *html.Node) {
for _, p := range procs { for _, processor := range procs {
p(ctx, node) processor(ctx, node)
} }
} }

View file

@ -381,7 +381,6 @@ func TestRegExp_sha1CurrentPattern(t *testing.T) {
"(abcdefabcdefabcdefabcdefabcdefabcdefabcd)", "(abcdefabcdefabcdefabcdefabcdefabcdefabcd)",
"[abcdefabcdefabcdefabcdefabcdefabcdefabcd]", "[abcdefabcdefabcdefabcdefabcdefabcdefabcd]",
"abcdefabcdefabcdefabcdefabcdefabcdefabcd.", "abcdefabcdefabcdefabcdefabcdefabcdefabcd.",
"abcdefabcdefabcdefabcdefabcdefabcdefabcd:",
} }
falseTestCases := []string{ falseTestCases := []string{
"test", "test",

View file

@ -135,6 +135,17 @@ func TestRender_CrossReferences(t *testing.T) {
`<p><a href="`+urlWithQuery+`" rel="nofollow"><code>`+sha[:10]+`/README.md (L1-L5)</code></a></p>`) `<p><a href="`+urlWithQuery+`" rel="nofollow"><code>`+sha[:10]+`/README.md (L1-L5)</code></a></p>`)
} }
func TestMisc_IsSameDomain(t *testing.T) {
setting.AppURL = markup.TestAppURL
sha := "b6dd6210eaebc915fd5be5579c58cce4da2e2579"
commit := util.URLJoin(markup.TestRepoURL, "commit", sha)
assert.True(t, markup.IsSameDomain(commit))
assert.False(t, markup.IsSameDomain("http://google.com/ncr"))
assert.False(t, markup.IsSameDomain("favicon.ico"))
}
func TestRender_links(t *testing.T) { func TestRender_links(t *testing.T) {
setting.AppURL = markup.TestAppURL setting.AppURL = markup.TestAppURL

View file

@ -548,10 +548,6 @@ func TestMathBlock(t *testing.T) {
`$$a`, `$$a`,
`<p>$$a</p>` + nl, `<p>$$a</p>` + nl,
}, },
{
"$a$ ($b$) [$c$] {$d$}",
`<p><code class="language-math is-loading">a</code> (<code class="language-math is-loading">b</code>) [$c$] {$d$}</p>` + nl,
},
} }
for _, test := range testcases { for _, test := range testcases {

View file

@ -45,10 +45,6 @@ func isPunctuation(b byte) bool {
return b == '.' || b == '!' || b == '?' || b == ',' || b == ';' || b == ':' return b == '.' || b == '!' || b == '?' || b == ',' || b == ';' || b == ':'
} }
func isBracket(b byte) bool {
return b == ')'
}
func isAlphanumeric(b byte) bool { func isAlphanumeric(b byte) bool {
return (b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || (b >= '0' && b <= '9') return (b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || (b >= '0' && b <= '9')
} }
@ -88,7 +84,7 @@ func (parser *inlineParser) Parse(parent ast.Node, block text.Reader, pc parser.
break break
} }
suceedingCharacter := line[pos] suceedingCharacter := line[pos]
if !isPunctuation(suceedingCharacter) && !(suceedingCharacter == ' ') && !isBracket(suceedingCharacter) { if !isPunctuation(suceedingCharacter) && !(suceedingCharacter == ' ') {
return nil return nil
} }
if line[ender-1] != '\\' { if line[ender-1] != '\\' {

View file

@ -9,9 +9,9 @@ import (
"code.gitea.io/gitea/modules/container" "code.gitea.io/gitea/modules/container"
"code.gitea.io/gitea/modules/markup/common" "code.gitea.io/gitea/modules/markup/common"
"code.gitea.io/gitea/modules/util"
"github.com/yuin/goldmark/ast" "github.com/yuin/goldmark/ast"
"github.com/yuin/goldmark/util"
) )
type prefixedIDs struct { type prefixedIDs struct {
@ -36,7 +36,7 @@ func (p *prefixedIDs) GenerateWithDefault(value, dft []byte) []byte {
if !bytes.HasPrefix(result, []byte("user-content-")) { if !bytes.HasPrefix(result, []byte("user-content-")) {
result = append([]byte("user-content-"), result...) result = append([]byte("user-content-"), result...)
} }
if p.values.Add(util.UnsafeBytesToString(result)) { if p.values.Add(util.BytesToReadOnlyString(result)) {
return result return result
} }
for i := 1; ; i++ { for i := 1; ; i++ {
@ -49,7 +49,7 @@ func (p *prefixedIDs) GenerateWithDefault(value, dft []byte) []byte {
// Put puts a given element id to the used ids table. // Put puts a given element id to the used ids table.
func (p *prefixedIDs) Put(value []byte) { func (p *prefixedIDs) Put(value []byte) {
p.values.Add(util.UnsafeBytesToString(value)) p.values.Add(util.BytesToReadOnlyString(value))
} }
func newPrefixedIDs() *prefixedIDs { func newPrefixedIDs() *prefixedIDs {

View file

@ -48,7 +48,7 @@ func (r *HTMLRenderer) renderCodeSpan(w util.BufWriter, source []byte, n ast.Nod
return ast.WalkContinue, nil return ast.WalkContinue, nil
} }
func (g *ASTTransformer) transformCodeSpan(_ *markup.RenderContext, v *ast.CodeSpan, reader text.Reader) { func (g *ASTTransformer) transformCodeSpan(ctx *markup.RenderContext, v *ast.CodeSpan, reader text.Reader) {
colorContent := v.Text(reader.Source()) colorContent := v.Text(reader.Source())
if matchColor(strings.ToLower(string(colorContent))) { if matchColor(strings.ToLower(string(colorContent))) {
v.AppendChild(v, NewColorPreview(colorContent)) v.AppendChild(v, NewColorPreview(colorContent))

View file

@ -7,10 +7,10 @@ import (
"fmt" "fmt"
"code.gitea.io/gitea/modules/markup" "code.gitea.io/gitea/modules/markup"
"code.gitea.io/gitea/modules/util"
"github.com/yuin/goldmark/ast" "github.com/yuin/goldmark/ast"
"github.com/yuin/goldmark/text" "github.com/yuin/goldmark/text"
"github.com/yuin/goldmark/util"
) )
func (g *ASTTransformer) transformHeading(_ *markup.RenderContext, v *ast.Heading, reader text.Reader, tocList *[]markup.Header) { func (g *ASTTransformer) transformHeading(_ *markup.RenderContext, v *ast.Heading, reader text.Reader, tocList *[]markup.Header) {
@ -21,11 +21,11 @@ func (g *ASTTransformer) transformHeading(_ *markup.RenderContext, v *ast.Headin
} }
txt := v.Text(reader.Source()) txt := v.Text(reader.Source())
header := markup.Header{ header := markup.Header{
Text: util.UnsafeBytesToString(txt), Text: util.BytesToReadOnlyString(txt),
Level: v.Level, Level: v.Level,
} }
if id, found := v.AttributeString("id"); found { if id, found := v.AttributeString("id"); found {
header.ID = util.UnsafeBytesToString(id.([]byte)) header.ID = util.BytesToReadOnlyString(id.([]byte))
} }
*tocList = append(*tocList, header) *tocList = append(*tocList, header)
g.applyElementDir(v) g.applyElementDir(v)

View file

@ -6,7 +6,6 @@ package composer
import ( import (
"archive/zip" "archive/zip"
"io" "io"
"path"
"regexp" "regexp"
"strings" "strings"
@ -37,14 +36,10 @@ type Package struct {
Metadata *Metadata Metadata *Metadata
} }
// https://getcomposer.org/doc/04-schema.md
// Metadata represents the metadata of a Composer package // Metadata represents the metadata of a Composer package
type Metadata struct { type Metadata struct {
Description string `json:"description,omitempty"` Description string `json:"description,omitempty"`
Readme string `json:"readme,omitempty"`
Keywords []string `json:"keywords,omitempty"` Keywords []string `json:"keywords,omitempty"`
Comments Comments `json:"_comments,omitempty"`
Homepage string `json:"homepage,omitempty"` Homepage string `json:"homepage,omitempty"`
License Licenses `json:"license,omitempty"` License Licenses `json:"license,omitempty"`
Authors []Author `json:"authors,omitempty"` Authors []Author `json:"authors,omitempty"`
@ -79,28 +74,6 @@ func (l *Licenses) UnmarshalJSON(data []byte) error {
return nil return nil
} }
// Comments represents the comments of a Composer package
type Comments []string
// UnmarshalJSON reads from a string or array
func (c *Comments) UnmarshalJSON(data []byte) error {
switch data[0] {
case '"':
var value string
if err := json.Unmarshal(data, &value); err != nil {
return err
}
*c = Comments{value}
case '[':
values := make([]string, 0, 5)
if err := json.Unmarshal(data, &values); err != nil {
return err
}
*c = Comments(values)
}
return nil
}
// Author represents an author // Author represents an author
type Author struct { type Author struct {
Name string `json:"name,omitempty"` Name string `json:"name,omitempty"`
@ -128,14 +101,14 @@ func ParsePackage(r io.ReaderAt, size int64) (*Package, error) {
} }
defer f.Close() defer f.Close()
return ParseComposerFile(archive, path.Dir(file.Name), f) return ParseComposerFile(f)
} }
} }
return nil, ErrMissingComposerFile return nil, ErrMissingComposerFile
} }
// ParseComposerFile parses a composer.json file to retrieve the metadata of a Composer package // ParseComposerFile parses a composer.json file to retrieve the metadata of a Composer package
func ParseComposerFile(archive *zip.Reader, pathPrefix string, r io.Reader) (*Package, error) { func ParseComposerFile(r io.Reader) (*Package, error) {
var cj struct { var cj struct {
Name string `json:"name"` Name string `json:"name"`
Version string `json:"version"` Version string `json:"version"`
@ -164,19 +137,6 @@ func ParseComposerFile(archive *zip.Reader, pathPrefix string, r io.Reader) (*Pa
cj.Type = "library" cj.Type = "library"
} }
if cj.Readme == "" {
cj.Readme = "README.md"
}
f, err := archive.Open(path.Join(pathPrefix, cj.Readme))
if err == nil {
// 10kb limit for readme content
buf, _ := io.ReadAll(io.LimitReader(f, 10*1024))
cj.Readme = string(buf)
_ = f.Close()
} else {
cj.Readme = ""
}
return &Package{ return &Package{
Name: cj.Name, Name: cj.Name,
Version: cj.Version, Version: cj.Version,

View file

@ -17,8 +17,6 @@ import (
const ( const (
name = "gitea/composer-package" name = "gitea/composer-package"
description = "Package Description" description = "Package Description"
readme = "Package Readme"
comments = "Package Comment"
packageType = "composer-plugin" packageType = "composer-plugin"
author = "Gitea Authors" author = "Gitea Authors"
email = "no.reply@gitea.io" email = "no.reply@gitea.io"
@ -43,8 +41,7 @@ const composerContent = `{
}, },
"require": { "require": {
"php": ">=7.2 || ^8.0" "php": ">=7.2 || ^8.0"
}, }
"_comments": "` + comments + `"
}` }`
func TestLicenseUnmarshal(t *testing.T) { func TestLicenseUnmarshal(t *testing.T) {
@ -57,30 +54,18 @@ func TestLicenseUnmarshal(t *testing.T) {
assert.Equal(t, "MIT", l[0]) assert.Equal(t, "MIT", l[0])
} }
func TestCommentsUnmarshal(t *testing.T) {
var c Comments
assert.NoError(t, json.NewDecoder(strings.NewReader(`["comment"]`)).Decode(&c))
assert.Len(t, c, 1)
assert.Equal(t, "comment", c[0])
assert.NoError(t, json.NewDecoder(strings.NewReader(`"comment"`)).Decode(&c))
assert.Len(t, c, 1)
assert.Equal(t, "comment", c[0])
}
func TestParsePackage(t *testing.T) { func TestParsePackage(t *testing.T) {
createArchive := func(files map[string]string) []byte { createArchive := func(name, content string) []byte {
var buf bytes.Buffer var buf bytes.Buffer
archive := zip.NewWriter(&buf) archive := zip.NewWriter(&buf)
for name, content := range files { w, _ := archive.Create(name)
w, _ := archive.Create(name) w.Write([]byte(content))
w.Write([]byte(content))
}
archive.Close() archive.Close()
return buf.Bytes() return buf.Bytes()
} }
t.Run("MissingComposerFile", func(t *testing.T) { t.Run("MissingComposerFile", func(t *testing.T) {
data := createArchive(map[string]string{"dummy.txt": ""}) data := createArchive("dummy.txt", "")
cp, err := ParsePackage(bytes.NewReader(data), int64(len(data))) cp, err := ParsePackage(bytes.NewReader(data), int64(len(data)))
assert.Nil(t, cp) assert.Nil(t, cp)
@ -88,7 +73,7 @@ func TestParsePackage(t *testing.T) {
}) })
t.Run("MissingComposerFileInRoot", func(t *testing.T) { t.Run("MissingComposerFileInRoot", func(t *testing.T) {
data := createArchive(map[string]string{"sub/sub/composer.json": ""}) data := createArchive("sub/sub/composer.json", "")
cp, err := ParsePackage(bytes.NewReader(data), int64(len(data))) cp, err := ParsePackage(bytes.NewReader(data), int64(len(data)))
assert.Nil(t, cp) assert.Nil(t, cp)
@ -96,52 +81,43 @@ func TestParsePackage(t *testing.T) {
}) })
t.Run("InvalidComposerFile", func(t *testing.T) { t.Run("InvalidComposerFile", func(t *testing.T) {
data := createArchive(map[string]string{"composer.json": ""}) data := createArchive("composer.json", "")
cp, err := ParsePackage(bytes.NewReader(data), int64(len(data))) cp, err := ParsePackage(bytes.NewReader(data), int64(len(data)))
assert.Nil(t, cp) assert.Nil(t, cp)
assert.Error(t, err) assert.Error(t, err)
}) })
t.Run("InvalidPackageName", func(t *testing.T) { t.Run("Valid", func(t *testing.T) {
data := createArchive(map[string]string{"composer.json": "{}"}) data := createArchive("composer.json", composerContent)
cp, err := ParsePackage(bytes.NewReader(data), int64(len(data))) cp, err := ParsePackage(bytes.NewReader(data), int64(len(data)))
assert.NoError(t, err)
assert.NotNil(t, cp)
})
}
func TestParseComposerFile(t *testing.T) {
t.Run("InvalidPackageName", func(t *testing.T) {
cp, err := ParseComposerFile(strings.NewReader(`{}`))
assert.Nil(t, cp) assert.Nil(t, cp)
assert.ErrorIs(t, err, ErrInvalidName) assert.ErrorIs(t, err, ErrInvalidName)
}) })
t.Run("InvalidPackageVersion", func(t *testing.T) { t.Run("InvalidPackageVersion", func(t *testing.T) {
data := createArchive(map[string]string{"composer.json": `{"name": "gitea/composer-package", "version": "1.a.3"}`}) cp, err := ParseComposerFile(strings.NewReader(`{"name": "gitea/composer-package", "version": "1.a.3"}`))
cp, err := ParsePackage(bytes.NewReader(data), int64(len(data)))
assert.Nil(t, cp) assert.Nil(t, cp)
assert.ErrorIs(t, err, ErrInvalidVersion) assert.ErrorIs(t, err, ErrInvalidVersion)
}) })
t.Run("InvalidReadmePath", func(t *testing.T) {
data := createArchive(map[string]string{"composer.json": `{"name": "gitea/composer-package", "readme": "sub/README.md"}`})
cp, err := ParsePackage(bytes.NewReader(data), int64(len(data)))
assert.NoError(t, err)
assert.NotNil(t, cp)
assert.Empty(t, cp.Metadata.Readme)
})
t.Run("Valid", func(t *testing.T) { t.Run("Valid", func(t *testing.T) {
data := createArchive(map[string]string{"composer.json": composerContent, "README.md": readme}) cp, err := ParseComposerFile(strings.NewReader(composerContent))
cp, err := ParsePackage(bytes.NewReader(data), int64(len(data)))
assert.NoError(t, err) assert.NoError(t, err)
assert.NotNil(t, cp) assert.NotNil(t, cp)
assert.Equal(t, name, cp.Name) assert.Equal(t, name, cp.Name)
assert.Empty(t, cp.Version) assert.Empty(t, cp.Version)
assert.Equal(t, description, cp.Metadata.Description) assert.Equal(t, description, cp.Metadata.Description)
assert.Equal(t, readme, cp.Metadata.Readme)
assert.Len(t, cp.Metadata.Comments, 1)
assert.Equal(t, comments, cp.Metadata.Comments[0])
assert.Len(t, cp.Metadata.Authors, 1) assert.Len(t, cp.Metadata.Authors, 1)
assert.Equal(t, author, cp.Metadata.Authors[0].Name) assert.Equal(t, author, cp.Metadata.Authors[0].Name)
assert.Equal(t, email, cp.Metadata.Authors[0].Email) assert.Equal(t, email, cp.Metadata.Authors[0].Email)

View file

@ -185,6 +185,8 @@ func ParseDescription(r io.Reader) (*Package, error) {
} }
func setField(p *Package, data string) error { func setField(p *Package, data string) error {
const listDelimiter = ", "
if data == "" { if data == "" {
return nil return nil
} }
@ -213,19 +215,19 @@ func setField(p *Package, data string) error {
case "Description": case "Description":
p.Metadata.Description = value p.Metadata.Description = value
case "URL": case "URL":
p.Metadata.ProjectURL = splitAndTrim(value) p.Metadata.ProjectURL = splitAndTrim(value, listDelimiter)
case "License": case "License":
p.Metadata.License = value p.Metadata.License = value
case "Author": case "Author":
p.Metadata.Authors = splitAndTrim(authorReplacePattern.ReplaceAllString(value, "")) p.Metadata.Authors = splitAndTrim(authorReplacePattern.ReplaceAllString(value, ""), listDelimiter)
case "Depends": case "Depends":
p.Metadata.Depends = splitAndTrim(value) p.Metadata.Depends = splitAndTrim(value, listDelimiter)
case "Imports": case "Imports":
p.Metadata.Imports = splitAndTrim(value) p.Metadata.Imports = splitAndTrim(value, listDelimiter)
case "Suggests": case "Suggests":
p.Metadata.Suggests = splitAndTrim(value) p.Metadata.Suggests = splitAndTrim(value, listDelimiter)
case "LinkingTo": case "LinkingTo":
p.Metadata.LinkingTo = splitAndTrim(value) p.Metadata.LinkingTo = splitAndTrim(value, listDelimiter)
case "NeedsCompilation": case "NeedsCompilation":
p.Metadata.NeedsCompilation = value == "yes" p.Metadata.NeedsCompilation = value == "yes"
} }
@ -233,8 +235,8 @@ func setField(p *Package, data string) error {
return nil return nil
} }
func splitAndTrim(s string) []string { func splitAndTrim(s, sep string) []string {
items := strings.Split(s, ", ") items := strings.Split(s, sep)
for i := range items { for i := range items {
items[i] = strings.TrimSpace(items[i]) items[i] = strings.TrimSpace(items[i])
} }

View file

@ -14,7 +14,8 @@ import (
"code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/markup/mdstripper" "code.gitea.io/gitea/modules/markup/mdstripper"
"code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/util"
"github.com/yuin/goldmark/util"
) )
var ( var (
@ -340,7 +341,7 @@ func FindRenderizableReferenceNumeric(content string, prOnly, crossLinkOnly bool
return false, nil return false, nil
} }
} }
r := getCrossReference(util.UnsafeStringToBytes(content), match[2], match[3], false, prOnly) r := getCrossReference(util.StringToReadOnlyBytes(content), match[2], match[3], false, prOnly)
if r == nil { if r == nil {
return false, nil return false, nil
} }

View file

@ -97,7 +97,7 @@ func decodeEnvSectionKey(encoded string) (ok bool, section, key string) {
// decodeEnvironmentKey decode the environment key to section and key // decodeEnvironmentKey decode the environment key to section and key
// The environment key is in the form of GITEA__SECTION__KEY or GITEA__SECTION__KEY__FILE // The environment key is in the form of GITEA__SECTION__KEY or GITEA__SECTION__KEY__FILE
func decodeEnvironmentKey(prefixRegexp *regexp.Regexp, suffixFile, envKey string) (ok bool, section, key string, useFileValue bool) { //nolint:unparam func decodeEnvironmentKey(prefixRegexp *regexp.Regexp, suffixFile, envKey string) (ok bool, section, key string, useFileValue bool) {
if strings.HasSuffix(envKey, suffixFile) { if strings.HasSuffix(envKey, suffixFile) {
useFileValue = true useFileValue = true
envKey = envKey[:len(envKey)-len(suffixFile)] envKey = envKey[:len(envKey)-len(suffixFile)]

View file

@ -122,7 +122,7 @@ const (
targetSecIsSec // target section is from the name seciont [name] targetSecIsSec // target section is from the name seciont [name]
) )
func getStorageSectionByType(rootCfg ConfigProvider, typ string) (ConfigSection, targetSecType, error) { //nolint:unparam func getStorageSectionByType(rootCfg ConfigProvider, typ string) (ConfigSection, targetSecType, error) {
targetSec, err := rootCfg.GetSection(storageSectionName + "." + typ) targetSec, err := rootCfg.GetSection(storageSectionName + "." + typ)
if err != nil { if err != nil {
if !IsValidStorageType(StorageType(typ)) { if !IsValidStorageType(StorageType(typ)) {

View file

@ -24,7 +24,7 @@ type Team struct {
// CreateTeamOption options for creating a team // CreateTeamOption options for creating a team
type CreateTeamOption struct { type CreateTeamOption struct {
// required: true // required: true
Name string `json:"name" binding:"Required;AlphaDashDot;MaxSize(255)"` Name string `json:"name" binding:"Required;AlphaDashDot;MaxSize(30)"`
Description string `json:"description" binding:"MaxSize(255)"` Description string `json:"description" binding:"MaxSize(255)"`
IncludesAllRepositories bool `json:"includes_all_repositories"` IncludesAllRepositories bool `json:"includes_all_repositories"`
// enum: read,write,admin // enum: read,write,admin
@ -40,7 +40,7 @@ type CreateTeamOption struct {
// EditTeamOption options for editing a team // EditTeamOption options for editing a team
type EditTeamOption struct { type EditTeamOption struct {
// required: true // required: true
Name string `json:"name" binding:"AlphaDashDot;MaxSize(255)"` Name string `json:"name" binding:"AlphaDashDot;MaxSize(30)"`
Description *string `json:"description" binding:"MaxSize(255)"` Description *string `json:"description" binding:"MaxSize(255)"`
IncludesAllRepositories *bool `json:"includes_all_repositories"` IncludesAllRepositories *bool `json:"includes_all_repositories"`
// enum: read,write,admin // enum: read,write,admin

View file

@ -3,8 +3,6 @@
package structs package structs
import "time"
// Tag represents a repository tag // Tag represents a repository tag
type Tag struct { type Tag struct {
Name string `json:"name"` Name string `json:"name"`
@ -48,29 +46,3 @@ type TagArchiveDownloadCount struct {
Zip int64 `json:"zip"` Zip int64 `json:"zip"`
TarGz int64 `json:"tar_gz"` TarGz int64 `json:"tar_gz"`
} }
// TagProtection represents a tag protection
type TagProtection struct {
ID int64 `json:"id"`
NamePattern string `json:"name_pattern"`
WhitelistUsernames []string `json:"whitelist_usernames"`
WhitelistTeams []string `json:"whitelist_teams"`
// swagger:strfmt date-time
Created time.Time `json:"created_at"`
// swagger:strfmt date-time
Updated time.Time `json:"updated_at"`
}
// CreateTagProtectionOption options for creating a tag protection
type CreateTagProtectionOption struct {
NamePattern string `json:"name_pattern"`
WhitelistUsernames []string `json:"whitelist_usernames"`
WhitelistTeams []string `json:"whitelist_teams"`
}
// EditTagProtectionOption options for editing a tag protection
type EditTagProtectionOption struct {
NamePattern *string `json:"name_pattern"`
WhitelistUsernames []string `json:"whitelist_usernames"`
WhitelistTeams []string `json:"whitelist_teams"`
}

View file

@ -8,7 +8,8 @@ import (
"code.gitea.io/gitea/models/system" "code.gitea.io/gitea/models/system"
"code.gitea.io/gitea/modules/json" "code.gitea.io/gitea/modules/json"
"code.gitea.io/gitea/modules/util"
"github.com/yuin/goldmark/util"
) )
// DBStore can be used to store app state items in local filesystem // DBStore can be used to store app state items in local filesystem
@ -23,7 +24,7 @@ func (f *DBStore) Get(ctx context.Context, item StateItem) error {
if content == "" { if content == "" {
return nil return nil
} }
return json.Unmarshal(util.UnsafeStringToBytes(content), item) return json.Unmarshal(util.StringToReadOnlyBytes(content), item)
} }
// Set saves the state item // Set saves the state item
@ -32,5 +33,5 @@ func (f *DBStore) Set(ctx context.Context, item StateItem) error {
if err != nil { if err != nil {
return err return err
} }
return system.SaveAppStateContent(ctx, item.Name(), util.UnsafeBytesToString(b)) return system.SaveAppStateContent(ctx, item.Name(), util.BytesToReadOnlyString(b))
} }

View file

@ -15,7 +15,10 @@ import (
// GenerateKeyPair generates a public and private keypair // GenerateKeyPair generates a public and private keypair
func GenerateKeyPair(bits int) (string, string, error) { func GenerateKeyPair(bits int) (string, string, error) {
priv, _ := rsa.GenerateKey(rand.Reader, bits) priv, _ := rsa.GenerateKey(rand.Reader, bits)
privPem := pemBlockForPriv(priv) privPem, err := pemBlockForPriv(priv)
if err != nil {
return "", "", err
}
pubPem, err := pemBlockForPub(&priv.PublicKey) pubPem, err := pemBlockForPub(&priv.PublicKey)
if err != nil { if err != nil {
return "", "", err return "", "", err
@ -23,12 +26,12 @@ func GenerateKeyPair(bits int) (string, string, error) {
return privPem, pubPem, nil return privPem, pubPem, nil
} }
func pemBlockForPriv(priv *rsa.PrivateKey) string { func pemBlockForPriv(priv *rsa.PrivateKey) (string, error) {
privBytes := pem.EncodeToMemory(&pem.Block{ privBytes := pem.EncodeToMemory(&pem.Block{
Type: "RSA PRIVATE KEY", Type: "RSA PRIVATE KEY",
Bytes: x509.MarshalPKCS1PrivateKey(priv), Bytes: x509.MarshalPKCS1PrivateKey(priv),
}) })
return string(privBytes) return string(privBytes), nil
} }
func pemBlockForPub(pub *rsa.PublicKey) (string, error) { func pemBlockForPub(pub *rsa.PublicKey) (string, error) {

View file

@ -6,6 +6,8 @@ package util
import ( import (
"bytes" "bytes"
"unicode" "unicode"
"github.com/yuin/goldmark/util"
) )
type sanitizedError struct { type sanitizedError struct {
@ -31,7 +33,7 @@ var schemeSep = []byte("://")
// SanitizeCredentialURLs remove all credentials in URLs (starting with "scheme://") for the input string: "https://user:pass@domain.com" => "https://sanitized-credential@domain.com" // SanitizeCredentialURLs remove all credentials in URLs (starting with "scheme://") for the input string: "https://user:pass@domain.com" => "https://sanitized-credential@domain.com"
func SanitizeCredentialURLs(s string) string { func SanitizeCredentialURLs(s string) string {
bs := UnsafeStringToBytes(s) bs := util.StringToReadOnlyBytes(s)
schemeSepPos := bytes.Index(bs, schemeSep) schemeSepPos := bytes.Index(bs, schemeSep)
if schemeSepPos == -1 || bytes.IndexByte(bs[schemeSepPos:], '@') == -1 { if schemeSepPos == -1 || bytes.IndexByte(bs[schemeSepPos:], '@') == -1 {
return s // fast return if there is no URL scheme or no userinfo return s // fast return if there is no URL scheme or no userinfo
@ -68,5 +70,5 @@ func SanitizeCredentialURLs(s string) string {
schemeSepPos = bytes.Index(bs, schemeSep) schemeSepPos = bytes.Index(bs, schemeSep)
} }
out = append(out, bs...) out = append(out, bs...)
return UnsafeBytesToString(out) return util.BytesToReadOnlyString(out)
} }

View file

@ -87,11 +87,11 @@ func ToSnakeCase(input string) string {
} }
// UnsafeBytesToString uses Go's unsafe package to convert a byte slice to a string. // UnsafeBytesToString uses Go's unsafe package to convert a byte slice to a string.
// TODO: replace all "goldmark/util.BytesToReadOnlyString" with this official approach
func UnsafeBytesToString(b []byte) string { func UnsafeBytesToString(b []byte) string {
return unsafe.String(unsafe.SliceData(b), len(b)) return unsafe.String(unsafe.SliceData(b), len(b))
} }
// UnsafeStringToBytes uses Go's unsafe package to convert a string to a byte slice.
func UnsafeStringToBytes(s string) []byte { func UnsafeStringToBytes(s string) []byte {
return unsafe.Slice(unsafe.StringData(s), len(s)) return unsafe.Slice(unsafe.StringData(s), len(s))
} }

View file

@ -35,10 +35,6 @@ func GetSiteCookie(req *http.Request, name string) string {
// SetSiteCookie returns given cookie value from request header. // SetSiteCookie returns given cookie value from request header.
func SetSiteCookie(resp http.ResponseWriter, name, value string, maxAge int) { func SetSiteCookie(resp http.ResponseWriter, name, value string, maxAge int) {
// Previous versions would use a cookie path with a trailing /.
// These are more specific than cookies without a trailing /, so
// we need to delete these if they exist.
deleteLegacySiteCookie(resp, name)
cookie := &http.Cookie{ cookie := &http.Cookie{
Name: name, Name: name,
Value: url.QueryEscape(value), Value: url.QueryEscape(value),
@ -50,6 +46,10 @@ func SetSiteCookie(resp http.ResponseWriter, name, value string, maxAge int) {
SameSite: setting.SessionConfig.SameSite, SameSite: setting.SessionConfig.SameSite,
} }
resp.Header().Add("Set-Cookie", cookie.String()) resp.Header().Add("Set-Cookie", cookie.String())
// Previous versions would use a cookie path with a trailing /.
// These are more specific than cookies without a trailing /, so
// we need to delete these if they exist.
deleteLegacySiteCookie(resp, name)
} }
// deleteLegacySiteCookie deletes the cookie with the given name at the cookie // deleteLegacySiteCookie deletes the cookie with the given name at the cookie

View file

@ -1,47 +0,0 @@
# Compiled binaries
*.o
*.bin
*.elf
*.hex
*.map
*.out
*.obj
# Trash
*.bak
thumbs.db
*.~*
# IAR Settings
**/settings/*.crun
**/settings/*.dbgdt
**/settings/*.cspy
**/settings/*.cspy.*
**/settings/*.xcl
**/settings/*.dni
**/settings/*.wsdt
**/settings/*.wspos
# IAR Debug Exe
**/Exe/*.sim
# IAR Debug Obj
**/Obj/*.pbd
**/Obj/*.pbd.*
**/Obj/*.pbi
**/Obj/*.pbi.*
# IAR project "Debug" directory
Debug/
# IAR project "Release" directory
Release/
# IAR project settings directory
settings/
# IAR backup files
Backup*
# IAR .dep files
*.dep

View file

@ -42,3 +42,10 @@ fastlane/report.xml
fastlane/Preview.html fastlane/Preview.html
fastlane/screenshots/**/*.png fastlane/screenshots/**/*.png
fastlane/test_output fastlane/test_output
# Code Injection
#
# After new code Injection tools there's a generated folder /iOSInjectionProject
# https://github.com/johnno1962/injectionforxcode
iOSInjectionProject/

View file

@ -35,3 +35,6 @@ override.tf.json
# Ignore CLI configuration files # Ignore CLI configuration files
.terraformrc .terraformrc
terraform.rc terraform.rc
# Ignore hcl file
.terraform.lock.hcl

View file

@ -164,7 +164,7 @@ copy_generic = Kopírovat do schránky
[aria] [aria]
navbar=Navigační lišta navbar=Navigační lišta
footer=Zápatí footer=Zápatí
footer.software=O tomto softwaru footer.software=O softwaru
footer.links=Odkazy footer.links=Odkazy
[heatmap] [heatmap]
@ -247,7 +247,7 @@ err_admin_name_is_invalid=Uživatelské jméno administrátora není platné
general_title=Obecná nastavení general_title=Obecná nastavení
app_name=Název instance app_name=Název instance
app_name_helper=Sem zadejte název vaší instance. Bude zobrazen na každé stránce. app_name_helper=Sem můžete zadat název vaší společnosti.
repo_path=Kořenový adresář repozitářů repo_path=Kořenový adresář repozitářů
repo_path_helper=Všechny vzdálené repozitáře Gitu budou uloženy do tohoto adresáře. repo_path_helper=Všechny vzdálené repozitáře Gitu budou uloženy do tohoto adresáře.
lfs_path=Kořenový adresář Git LFS lfs_path=Kořenový adresář Git LFS
@ -671,23 +671,15 @@ form.name_reserved=Uživatelské jméno „%s“ je rezervováno.
form.name_pattern_not_allowed=Vzor „%s“ není povolen v uživatelském jméně. form.name_pattern_not_allowed=Vzor „%s“ není povolen v uživatelském jméně.
form.name_chars_not_allowed=Uživatelské jméno „%s“ obsahuje neplatné znaky. form.name_chars_not_allowed=Uživatelské jméno „%s“ obsahuje neplatné znaky.
block_user = Zablokovat uživatele block_user = Zablokovat uživatele
block_user.detail = Při zablokování tohoto uživatele budou provedeny i další akce, například: block_user.detail = Pokud zablokujete tohoto uživatele, budou provedeny i další akce. Například:
block_user.detail_1 = Přestanete se navzájem sledovat a nebudete se moci znovu začít sledovat. block_user.detail_1 = Tento uživatel vás nebude moci sledovat.
block_user.detail_2 = Tento uživatel nebude moci interagovat s vašimi repozitáři ani s vašimi problémy a komentáři. block_user.detail_2 = Tento uživatel nebude moci interagovat s vašimi repozitáři, vytvářet problémy a komentáře.
block_user.detail_3 = Nebudete si moci každý druhého přidat jako spolupracovníky v repozitářích. block_user.detail_3 = Tento uživatel vás nebude moci přidat jako spolupracovníka a naopak.
follow_blocked_user = Tohoto uživatele nemůžete sledovat, protože jste si jej zablokovali nebo si on zablokoval vás. follow_blocked_user = Tohoto uživatele nemůžete sledovat, protože jste si jej zablokovali nebo si on zablokoval vás.
block = Zablokovat block = Zablokovat
unblock = Odblokovat unblock = Odblokovat
followers_one = %d sledující followers_one = %d sledující
following_one = %d následuje following_one = %d následuje
followers.title.one = Sledující
followers.title.few = Sledující
following.title.one = Sleduje
following.title.few = Sleudje
public_activity.visibility_hint.self_private = Vaše aktivita je viditelná pouze vám a správcům instance. <a href="%s">Nastavení</a>.
public_activity.visibility_hint.admin_private = Tato aktivita je pro vás viditelná, protože jste administrátor, ale uživatel chce, aby zůstala soukromá.
public_activity.visibility_hint.self_public = Vaše aktivita je viditelná všem, mimo interakcí v soukromých prostorech. <a href="%s">Nastavení</a>.
public_activity.visibility_hint.admin_public = Tato aktivita je viditelná všem, ale jako administrátor také můžete vidět interakce v soukromých prostorech.
[settings] [settings]
profile=Profil profile=Profil
@ -1077,7 +1069,7 @@ mirror_prune=Vyčistit
mirror_prune_desc=Odstranit zastaralé reference na vzdálené sledování mirror_prune_desc=Odstranit zastaralé reference na vzdálené sledování
mirror_interval=Interval zrcadlení (platné časové jednotky jsou „h“, „m“ a „s“). Nastavením na 0 zakážete periodickou synchronizaci. (Minimální interval: %s) mirror_interval=Interval zrcadlení (platné časové jednotky jsou „h“, „m“ a „s“). Nastavením na 0 zakážete periodickou synchronizaci. (Minimální interval: %s)
mirror_interval_invalid=Interval zrcadlení není platný. mirror_interval_invalid=Interval zrcadlení není platný.
mirror_sync_on_commit=Synchronizovat při nahrávání commitů mirror_sync_on_commit=Synchronizovat při nahrávání revizí
mirror_address=Klonovat z URL mirror_address=Klonovat z URL
mirror_address_desc=Zadejte požadované přístupové údaje do sekce Ověření. mirror_address_desc=Zadejte požadované přístupové údaje do sekce Ověření.
mirror_address_url_invalid=Poskytnutá URL je neplatná. Všechny části musíte správně nahradit escape sekvencí. mirror_address_url_invalid=Poskytnutá URL je neplatná. Všechny části musíte správně nahradit escape sekvencí.
@ -1564,7 +1556,7 @@ issues.closed_title=Uzavřeno
issues.draft_title=Koncept issues.draft_title=Koncept
issues.num_comments_1=%d komentář issues.num_comments_1=%d komentář
issues.num_comments=%d komentářů issues.num_comments=%d komentářů
issues.commented_at=`okomentoval/a <a href="#%s">%s</a>` issues.commented_at=`okomentoval <a href="#%s">%s</a>`
issues.delete_comment_confirm=Jste si jist, že chcete smazat tento komentář? issues.delete_comment_confirm=Jste si jist, že chcete smazat tento komentář?
issues.context.copy_link=Kopírovat odkaz issues.context.copy_link=Kopírovat odkaz
issues.context.quote_reply=Citovat odpověď issues.context.quote_reply=Citovat odpověď
@ -2462,7 +2454,7 @@ settings.lfs=LFS
settings.lfs_filelist=LFS soubory uložené v tomto repozitáři settings.lfs_filelist=LFS soubory uložené v tomto repozitáři
settings.lfs_no_lfs_files=V tomto repozitáři nejsou uloženy žádné LFS soubory settings.lfs_no_lfs_files=V tomto repozitáři nejsou uloženy žádné LFS soubory
settings.lfs_findcommits=Najít revize settings.lfs_findcommits=Najít revize
settings.lfs_lfs_file_no_commits=Pro tento soubor LFS nebyly nalezeny žádné commity settings.lfs_lfs_file_no_commits=Pro tento LFS soubor nebyly nalezeny žádné revize
settings.lfs_noattribute=Tato cesta nemá uzamykatelný atribut ve výchozí větvi settings.lfs_noattribute=Tato cesta nemá uzamykatelný atribut ve výchozí větvi
settings.lfs_delete=Odstranit LFS soubor s OID %s settings.lfs_delete=Odstranit LFS soubor s OID %s
settings.lfs_delete_warning=Odstranění souboru LFS může při kontrole způsobit chybu „objekt neexistuje“. Jste si jisti? settings.lfs_delete_warning=Odstranění souboru LFS může při kontrole způsobit chybu „objekt neexistuje“. Jste si jisti?
@ -2477,7 +2469,7 @@ settings.lfs_locks_no_locks=Žádné zámky
settings.lfs_lock_file_no_exist=Uzamčený soubor neexistuje ve výchozí větvi settings.lfs_lock_file_no_exist=Uzamčený soubor neexistuje ve výchozí větvi
settings.lfs_force_unlock=Vynutit odemknutí settings.lfs_force_unlock=Vynutit odemknutí
settings.lfs_pointers.found=Nalezeno %d blob ukazatel(ů) - %d přiřazeno, %d není přiřazeno (%d chybí v úložišti) settings.lfs_pointers.found=Nalezeno %d blob ukazatel(ů) - %d přiřazeno, %d není přiřazeno (%d chybí v úložišti)
settings.lfs_pointers.sha=Hash blobu settings.lfs_pointers.sha=Blob SHA
settings.lfs_pointers.oid=OID settings.lfs_pointers.oid=OID
settings.lfs_pointers.inRepo=V repozitáři settings.lfs_pointers.inRepo=V repozitáři
settings.lfs_pointers.exists=Existuje v úložišti settings.lfs_pointers.exists=Existuje v úložišti
@ -2781,8 +2773,6 @@ project = Projekty
issues.edit.already_changed = Nepodařilo se uložit změny v problému. Obsah byl nejspíše již změněn jiným uživatelem. Obnovte prosím stránku a zkuste jej znovu upravit, abyste zabránili přepsání změn uživatele issues.edit.already_changed = Nepodařilo se uložit změny v problému. Obsah byl nejspíše již změněn jiným uživatelem. Obnovte prosím stránku a zkuste jej znovu upravit, abyste zabránili přepsání změn uživatele
pulls.edit.already_changed = Nepodařilo se uložit změny v žádosti o sloučení. Obsah byl nejspíše již změněn jiným uživatelem. Obnovte prosím stránku a zkuste jej znovu upravit, abyste zabránili přepsání změn uživatele pulls.edit.already_changed = Nepodařilo se uložit změny v žádosti o sloučení. Obsah byl nejspíše již změněn jiným uživatelem. Obnovte prosím stránku a zkuste jej znovu upravit, abyste zabránili přepsání změn uživatele
comments.edit.already_changed = Nepodařilo se uložit změny v komentáři. Obsah byl nejspíše již změněn jiným uživatelem. Obnovte prosím stránku a zkuste jej znovu upravit, abyste zabránili přepsání změn uživatele comments.edit.already_changed = Nepodařilo se uložit změny v komentáři. Obsah byl nejspíše již změněn jiným uživatelem. Obnovte prosím stránku a zkuste jej znovu upravit, abyste zabránili přepsání změn uživatele
subscribe.issue.guest.tooltip = Přihlaste se pro odebírání tohoto problému.
subscribe.pull.guest.tooltip = Přihlaste se pro odebírání této žádosti o sloučení.
[graphs] [graphs]
component_loading_info = Tohle může chvíli trvat… component_loading_info = Tohle může chvíli trvat…
@ -2916,7 +2906,7 @@ teams.all_repositories_admin_permission_desc=Tomuto týmu je udělen <strong>Adm
teams.invite.title=Byli jste pozváni do týmu <strong>%s</strong> v organizaci <strong>%s</strong>. teams.invite.title=Byli jste pozváni do týmu <strong>%s</strong> v organizaci <strong>%s</strong>.
teams.invite.by=Pozvání od %s teams.invite.by=Pozvání od %s
teams.invite.description=Pro připojení k týmu klikněte na tlačítko níže. teams.invite.description=Pro připojení k týmu klikněte na tlačítko níže.
follow_blocked_user = Tuto organizaci nemůžete sledovat, protože jste v ní zablokováni. follow_blocked_user = Tuto organizaci nemůžete sledovat, protože jste v ní zablokovaní.
open_dashboard = Otevřít nástěnku open_dashboard = Otevřít nástěnku
[admin] [admin]
@ -3483,7 +3473,7 @@ create_pull_request=`vytvořil/a požadavek na natažení <a href="%[1]s">%[3]s#
close_pull_request=`uzavřel/a požadavek na natažení <a href="%[1]s">%[3]s#%[2]s</a>` close_pull_request=`uzavřel/a požadavek na natažení <a href="%[1]s">%[3]s#%[2]s</a>`
reopen_pull_request=`znovuotevřel/a požadavek na natažení <a href="%[1]s">%[3]s#%[2]s</a>` reopen_pull_request=`znovuotevřel/a požadavek na natažení <a href="%[1]s">%[3]s#%[2]s</a>`
comment_issue=`okomentoval/a problém <a href="%[1]s">%[3]s#%[2]s</a>` comment_issue=`okomentoval/a problém <a href="%[1]s">%[3]s#%[2]s</a>`
comment_pull=`okomentoval/a žádost o sloučení <a href="%[1]s">%[3]s#%[2]s</a>` comment_pull=`okomentoval/a požadavek na natažení <a href="%[1]s">%[3]s#%[2]s</a>`
merge_pull_request=`sloučil/a požadavek na natažení <a href="%[1]s">%[3]s#%[2]s</a>` merge_pull_request=`sloučil/a požadavek na natažení <a href="%[1]s">%[3]s#%[2]s</a>`
auto_merge_pull_request=`automaticky sloučen požadavek na natažení <a href="%[1]s">%[3]s#%[2]s</a>` auto_merge_pull_request=`automaticky sloučen požadavek na natažení <a href="%[1]s">%[3]s#%[2]s</a>`
transfer_repo=předal/a repozitář <code>%s</code> uživateli/organizaci <a href="%s">%s</a> transfer_repo=předal/a repozitář <code>%s</code> uživateli/organizaci <a href="%s">%s</a>
@ -3866,10 +3856,6 @@ fuzzy_tooltip = Zahrnout také výsledky, které úzce odpovídají hledanému v
search = Hledat... search = Hledat...
keyword_search_unavailable = Hledání pomocí klíčových slov momentálně není dostupné. Kontaktujte prosím administrátora webu. keyword_search_unavailable = Hledání pomocí klíčových slov momentálně není dostupné. Kontaktujte prosím administrátora webu.
code_search_by_git_grep = Aktuální výsledky vyhledávání kódu jsou poskytovány službou „git grep“. Lepší výsledky dostanete, když administrátor webu povolí indexování kódu. code_search_by_git_grep = Aktuální výsledky vyhledávání kódu jsou poskytovány službou „git grep“. Lepší výsledky dostanete, když administrátor webu povolí indexování kódu.
exact = Přesné
exact_tooltip = Zahrnout pouze výsledky, které přesně odpovídají hledanému výrazu
issue_kind = Hledat problémy...
pull_kind = Hledat pully...
[markup] [markup]
filepreview.lines = Řádky %[1]d až %[2]d v souboru %[3]s filepreview.lines = Řádky %[1]d až %[2]d v souboru %[3]s

View file

@ -245,7 +245,7 @@ err_admin_name_is_invalid=Administratornutzername ist ungültig
general_title=Allgemeine Einstellungen general_title=Allgemeine Einstellungen
app_name=Instanztitel app_name=Instanztitel
app_name_helper=Hier Ihren Instanznamen eingeben. Er wird auf jeder Seite angezeigt. app_name_helper=Du kannst hier den Namen deines Unternehmens eingeben.
repo_path=Repository-Verzeichnis repo_path=Repository-Verzeichnis
repo_path_helper=Remote-Git-Repositorys werden in diesem Verzeichnis gespeichert. repo_path_helper=Remote-Git-Repositorys werden in diesem Verzeichnis gespeichert.
lfs_path=Git-LFS-Wurzelpfad lfs_path=Git-LFS-Wurzelpfad
@ -677,10 +677,6 @@ block_user.detail_3 = Dieser Benutzer kann dich nicht als einen Mitarbeiter hinz
unblock = Nicht mehr blockieren unblock = Nicht mehr blockieren
followers_one = %d Follower followers_one = %d Follower
following_one = %d Folge ich following_one = %d Folge ich
followers.title.few = Follower
following.title.one = Folgt
following.title.few = Folgt
followers.title.one = Follower
[settings] [settings]
profile=Profil profile=Profil
@ -1311,7 +1307,7 @@ editor.patching=Patche:
editor.fail_to_apply_patch=Patch „%s“ nicht anwendbar editor.fail_to_apply_patch=Patch „%s“ nicht anwendbar
editor.new_patch=Neuer Patch editor.new_patch=Neuer Patch
editor.commit_message_desc=Eine ausführlichere (optionale) Beschreibung hinzufügen … editor.commit_message_desc=Eine ausführlichere (optionale) Beschreibung hinzufügen …
editor.signoff_desc=Am Ende der Commit-Nachricht einen „Signed-off-by“-Anhang vom Committer hinzufügen. editor.signoff_desc=Am Ende der Commit Nachricht einen Signed-off-by Anhang vom Committer hinzufügen.
editor.commit_directly_to_this_branch=Direkt in den Branch „<strong class="branch-name">%s</strong>“ einchecken. editor.commit_directly_to_this_branch=Direkt in den Branch „<strong class="branch-name">%s</strong>“ einchecken.
editor.create_new_branch=Einen <strong>neuen Branch</strong> für diesen Commit erstellen und einen Pull-Request starten. editor.create_new_branch=Einen <strong>neuen Branch</strong> für diesen Commit erstellen und einen Pull-Request starten.
editor.create_new_branch_np=Erstelle einen <strong>neuen Branch</strong> für diesen Commit. editor.create_new_branch_np=Erstelle einen <strong>neuen Branch</strong> für diesen Commit.
@ -2470,7 +2466,7 @@ settings.lfs_locks_no_locks=Keine Sperren
settings.lfs_lock_file_no_exist=Gesperrte Datei existiert nicht im Standard-Branch settings.lfs_lock_file_no_exist=Gesperrte Datei existiert nicht im Standard-Branch
settings.lfs_force_unlock=Freigabe erzwingen settings.lfs_force_unlock=Freigabe erzwingen
settings.lfs_pointers.found=%d Blob-Zeiger gefunden %d assoziiert, %d nicht assoziiert (%d fehlend im Speicher) settings.lfs_pointers.found=%d Blob-Zeiger gefunden %d assoziiert, %d nicht assoziiert (%d fehlend im Speicher)
settings.lfs_pointers.sha=Blob-Hash settings.lfs_pointers.sha=Blob-SHA
settings.lfs_pointers.oid=OID settings.lfs_pointers.oid=OID
settings.lfs_pointers.inRepo=Im Repo settings.lfs_pointers.inRepo=Im Repo
settings.lfs_pointers.exists=Existiert im Speicher settings.lfs_pointers.exists=Existiert im Speicher
@ -2761,8 +2757,6 @@ project = Projekte
comments.edit.already_changed = Die Änderungen an diesem Kommentar können nicht gespeichert werden. Es scheint, als seien die Inhalte bereits durch einen anderen Benutzer verändert worden. Bitte die Seite neu laden und das Bearbeiten erneut versuchen, um deren Änderungen nicht zu überschreiben comments.edit.already_changed = Die Änderungen an diesem Kommentar können nicht gespeichert werden. Es scheint, als seien die Inhalte bereits durch einen anderen Benutzer verändert worden. Bitte die Seite neu laden und das Bearbeiten erneut versuchen, um deren Änderungen nicht zu überschreiben
issues.edit.already_changed = Die Änderungen an diesem Issue können nicht gespeichert werden. Es scheint, als seien die Inhalte bereits durch einen anderen Benutzer verändert worden. Bitte die Seite neu laden und das Bearbeiten erneut versuchen, um deren Änderungen nicht zu überschreiben issues.edit.already_changed = Die Änderungen an diesem Issue können nicht gespeichert werden. Es scheint, als seien die Inhalte bereits durch einen anderen Benutzer verändert worden. Bitte die Seite neu laden und das Bearbeiten erneut versuchen, um deren Änderungen nicht zu überschreiben
pulls.edit.already_changed = Die Änderungen an diesem Pull-Request können nicht gespeichert werden. Es scheint, als seien die Inhalte bereits durch einen anderen Benutzer verändert worden. Bitte die Seite neu laden und das Bearbeiten erneut versuchen, um deren Änderungen nicht zu überschreiben pulls.edit.already_changed = Die Änderungen an diesem Pull-Request können nicht gespeichert werden. Es scheint, als seien die Inhalte bereits durch einen anderen Benutzer verändert worden. Bitte die Seite neu laden und das Bearbeiten erneut versuchen, um deren Änderungen nicht zu überschreiben
subscribe.pull.guest.tooltip = Einloggen, um diesen Pull-Request zu abbonieren.
subscribe.issue.guest.tooltip = Einloggen, um dieses Issue zu abbonieren.
[graphs] [graphs]
@ -3838,10 +3832,6 @@ no_results = Keine passenden Ergebnisse gefunden.
code_search_unavailable = Die Code-Suche ist momentan nicht verfügbar. Bitte kontaktiere den Webseitenadministrator. code_search_unavailable = Die Code-Suche ist momentan nicht verfügbar. Bitte kontaktiere den Webseitenadministrator.
keyword_search_unavailable = Suche nach Schlüsselwörtern ist momentan nicht unterstüzt. Bitte kontaktiere den Webseitenadministrator. keyword_search_unavailable = Suche nach Schlüsselwörtern ist momentan nicht unterstüzt. Bitte kontaktiere den Webseitenadministrator.
code_search_by_git_grep = Die derzeitigen Codesuchergebnisse werden durch „git grep“ bereitgestellt. Es könnten bessere Ergebnisse erzielt werden, wenn der Administrator die Repository-Indizierung aktiviert. code_search_by_git_grep = Die derzeitigen Codesuchergebnisse werden durch „git grep“ bereitgestellt. Es könnten bessere Ergebnisse erzielt werden, wenn der Administrator die Repository-Indizierung aktiviert.
exact = Exakt
exact_tooltip = Nur Ergebnisse einbinden, die auf den exakten Suchbegriff passen
issue_kind = Issues durchsuchen …
pull_kind = Pulls durchsuchen …
[markup] [markup]
filepreview.line = Zeile %[1]d in %[2]s filepreview.line = Zeile %[1]d in %[2]s

View file

@ -93,7 +93,6 @@ remove_all = Remove all
remove_label_str = Remove item "%s" remove_label_str = Remove item "%s"
edit = Edit edit = Edit
view = View view = View
test = Test
enabled = Enabled enabled = Enabled
disabled = Disabled disabled = Disabled
@ -269,7 +268,7 @@ err_admin_name_is_invalid = Administrator Username is invalid
general_title = General settings general_title = General settings
app_name = Instance title app_name = Instance title
app_name_helper = Enter your instance name here. It will be displayed on every page. app_name_helper = You can enter your company name here.
app_slogan = Instance slogan app_slogan = Instance slogan
app_slogan_helper = Enter your instance slogan here. Leave empty to disable. app_slogan_helper = Enter your instance slogan here. Leave empty to disable.
repo_path = Repository root path repo_path = Repository root path
@ -656,10 +655,6 @@ change_avatar = Change your avatar…
joined_on = Joined on %s joined_on = Joined on %s
repositories = Repositories repositories = Repositories
activity = Public activity activity = Public activity
followers.title.one = Follower
followers.title.few = Followers
following.title.one = Following
following.title.few = Following
followers_one = %d follower followers_one = %d follower
followers_few = %d followers followers_few = %d followers
following_one = %d following following_one = %d following
@ -667,10 +662,10 @@ following_few = %d following
follow = Follow follow = Follow
unfollow = Unfollow unfollow = Unfollow
block_user = Block user block_user = Block user
block_user.detail = Please note that blocking a user has other effects, such as: block_user.detail = Please understand that if you block this user, other actions will be taken. Such as:
block_user.detail_1 = You will stop following each other and will not be able to follow each other. block_user.detail_1 = You are being unfollowed from this user.
block_user.detail_2 = This user will not be able to interact with the repositories you own, or the issues and comments you have created. block_user.detail_2 = This user cannot interact with your repositories, created issues and comments.
block_user.detail_3 = You will not be able to add each other as repository collaborators. block_user.detail_3 = This user cannot add you as a collaborator, nor can you add them as a collaborator.
follow_blocked_user = You cannot follow this user because you have blocked this user or this user has blocked you. follow_blocked_user = You cannot follow this user because you have blocked this user or this user has blocked you.
starred = Starred repositories starred = Starred repositories
watched = Watched repositories watched = Watched repositories
@ -680,16 +675,11 @@ overview = Overview
block = Block block = Block
unblock = Unblock unblock = Unblock
user_bio = Biography user_bio = Biography
disabled_public_activity = This user has disabled the public visibility of the activity.
email_visibility.limited = Your email address is visible to all authenticated users email_visibility.limited = Your email address is visible to all authenticated users
show_on_map = Show this place on a map show_on_map = Show this place on a map
settings = User settings settings = User settings
disabled_public_activity = This user has disabled the public visibility of the activity.
public_activity.visibility_hint.self_public = Your activity is visible to everyone, except for interactions in private spaces. <a href="%s">Configure</a>.
public_activity.visibility_hint.admin_public = This activity is visible to everyone, but as an administrator you can also see interactions in private spaces.
public_activity.visibility_hint.self_private = Your activity is only visible to you and the instance administrators. <a href="%s">Configure</a>.
public_activity.visibility_hint.admin_private = This activity is visible to you because you're an administrator, but the user wants it to remain private.
form.name_reserved = The username "%s" is reserved. form.name_reserved = The username "%s" is reserved.
form.name_pattern_not_allowed = The pattern "%s" is not allowed in a username. form.name_pattern_not_allowed = The pattern "%s" is not allowed in a username.
form.name_chars_not_allowed = Username "%s" contains invalid characters. form.name_chars_not_allowed = Username "%s" contains invalid characters.
@ -1618,8 +1608,7 @@ issues.ref_closed_from = `<a href="%[3]s">closed this issue %[4]s</a> <a id="%[1
issues.ref_reopened_from = `<a href="%[3]s">reopened this issue %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>` issues.ref_reopened_from = `<a href="%[3]s">reopened this issue %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.ref_from = `from %[1]s` issues.ref_from = `from %[1]s`
issues.author = Author issues.author = Author
issues.author.tooltip.issue = This user is the author of this issue. issues.author_helper = This user is the author.
issues.author.tooltip.pr = This user is the author of this pull request.
issues.role.owner = Owner issues.role.owner = Owner
issues.role.owner_helper = This user is the owner of this repository. issues.role.owner_helper = This user is the owner of this repository.
issues.role.member = Member issues.role.member = Member
@ -3324,11 +3313,6 @@ config.cache_interval = Cache interval
config.cache_conn = Cache connection config.cache_conn = Cache connection
config.cache_item_ttl = Cache item TTL config.cache_item_ttl = Cache item TTL
config.cache_test = Test Cache
config.cache_test_failed = Failed to probe the cache: %v.
config.cache_test_slow = Cache test successful, but response is slow: %s.
config.cache_test_succeeded = Cache test successful, got a response in %s.
config.session_config = Session configuration config.session_config = Session configuration
config.session_provider = Session provider config.session_provider = Session provider
config.provider_config = Provider config config.provider_config = Provider config

View file

@ -53,12 +53,12 @@ view = Itignan
disabled = Naka-disable disabled = Naka-disable
copy_url = Kopyahin ang URL copy_url = Kopyahin ang URL
create_new = Gumawa… create_new = Gumawa…
user_profile_and_more = Profile at mga setting… user_profile_and_more = Profile at Mga Setting…
signed_in_as = Naka-sign in bilang signed_in_as = Naka-sign in bilang
toc = Talaan ng Mga Nilalaman toc = Talaan ng Mga Nilalaman
licenses = Mga Lisensya licenses = Mga Lisensya
return_to_forgejo = Bumalik sa Forgejo return_to_forgejo = Bumalik sa Forgejo
toggle_menu = I-toggle ang menu toggle_menu = I-toggle ang Menu
username = Username username = Username
email = Email address email = Email address
password = Password password = Password
@ -125,7 +125,7 @@ filter.not_template = Hindi mga template
filter.public = Publiko filter.public = Publiko
filter.private = Pribado filter.private = Pribado
notifications = Mga Abiso notifications = Mga Abiso
active_stopwatch = Aktibong tagasubaybay ng oras active_stopwatch = Aktibong Tagasubaybay ng Oras
locked = Naka-kandado locked = Naka-kandado
preview = Paunang tingnan preview = Paunang tingnan
confirm_delete_artifact = Sigurado ka bang gusto mong burahin ang artifact na "%s"? confirm_delete_artifact = Sigurado ka bang gusto mong burahin ang artifact na "%s"?
@ -193,8 +193,8 @@ forks_few = %d mga fork
stars_one = %d bituin stars_one = %d bituin
[aria] [aria]
footer.software = Tungkol sa software na ito footer.software = Tungkol sa Software
navbar = Bar ng nabigasyon navbar = Bar ng Nabigasyon
footer = Footer footer = Footer
footer.links = Mga Link footer.links = Mga Link
@ -233,7 +233,7 @@ err_admin_name_is_reserved = Hindi angkop ang Username ng Tagapangasiwa, naka-re
err_admin_name_is_invalid = Hindi angkop ang Username ng Tagapangasiwa err_admin_name_is_invalid = Hindi angkop ang Username ng Tagapangasiwa
general_title = Mga General Setting general_title = Mga General Setting
app_name = Pamagat ng instansya app_name = Pamagat ng instansya
app_name_helper = Ilagay ang pangalan ng iyong instansya dito. Ipapakita ito sa bawat page. app_name_helper = Maari mong ilagay ang pangalan ng iyong kompanya dito.
repo_path_helper = Ang mga remote Git repository ay mase-save sa directory na ito. repo_path_helper = Ang mga remote Git repository ay mase-save sa directory na ito.
repo_path = Root path ng Repositoryo repo_path = Root path ng Repositoryo
lfs_path = Root path ng Git LFS lfs_path = Root path ng Git LFS
@ -269,16 +269,16 @@ register_confirm = Kailanganin ang kumpirmasyon sa email para magrehistro
mail_notify = Paganahin ang mga email notification mail_notify = Paganahin ang mga email notification
disable_gravatar = I-disable ang Gravatar disable_gravatar = I-disable ang Gravatar
federated_avatar_lookup = I-enable ang mga naka-federate na avatar federated_avatar_lookup = I-enable ang mga naka-federate na avatar
federated_avatar_lookup.description = Hanapin ang mga avatar gamit ang Libravatar. federated_avatar_lookup.description = I-enable ang naka-federate na paghahanap ng avatar gamit ng Libravatar.
disable_registration = I-disable ang pansariling pagrehistro disable_registration = I-disable ang pansariling pagrehistro
allow_only_external_registration.description = Makakagawa lamang ng mga bagong account ang mga user sa pamamagitan ng mga naka-configure na external na serbisyo. allow_only_external_registration.description = Payagan lang ang pagrehistro sa pamamagitan ng mga external na serbisyo
openid_signin = I-enable ang OpenID sign-in openid_signin = I-enable ang OpenID sign-in
openid_signin.description = Payagagan ang mga user na mag-sign in sa pamamagitan ng OpenID. openid_signin.description = I-enable ang pag-sign in ng user gamit ng OpenID.
openid_signup = I-enable ang OpenID na pansariling pagrehistro openid_signup = I-enable ang OpenID na pansariling pagrehistro
openid_signup.description = Payagan ang mga user na gumawa ng mga account aa pamamagitan ng OpenID kapag naka-enable ang pansariling pagrehistro. openid_signup.description = I-enable ang OpenID-based na pansariling pagrehistro ng user.
enable_captcha = I-enable ang CAPTCHA sa pagrehistro enable_captcha = I-enable ang CAPTCHA sa pagrehistro
enable_captcha.description = Kailanganin ang mga user na ipasa ang CAPTCHA upang makagawa ng mga account. enable_captcha.description = Kailanganin ang CAPTCHA sa pansariling pagrehistro ng user.
require_sign_in_view.description = Limitahan ang access ng nilalaman sa mga naka-sign in na user. Mabibisita lamang ng mga bisita ang mga authentikasyon na pahina. require_sign_in_view.description = Limitahan ang access ng pahina sa mga naka-sign in na user. Makikita lang ng mga bisita ang sign-in at pagrehistro na mga pahina.
admin_title = Mga setting ng account ng tagapangasiwa admin_title = Mga setting ng account ng tagapangasiwa
admin_name = Username ng tagapangasiwa admin_name = Username ng tagapangasiwa
admin_password = Password admin_password = Password
@ -298,10 +298,10 @@ save_config_failed = Nabigong i-save ang configuration: %v
invalid_admin_setting = Hindi angkop ang setting ng account ng tagapangasiwa: %v invalid_admin_setting = Hindi angkop ang setting ng account ng tagapangasiwa: %v
invalid_log_root_path = Hindi angkop ang log path: %v invalid_log_root_path = Hindi angkop ang log path: %v
default_keep_email_private = Itago ang mga email address bilang default default_keep_email_private = Itago ang mga email address bilang default
default_keep_email_private.description = I-enable ang pagtago ng email address para sa mga bagong user bilang default para ang impormasyon na ito ay hindi mali-leak agad pagkatapos mag-sign up. default_keep_email_private.description = Itago ang mga email address ng mga bagong user account bilang default.
default_allow_create_organization.description = Payagan ang mga user na gumawa ng mga organisasyon bilang default. Kung naka-disable ang opsyon na ito, ang isang tagapangasiwa ay dapat magbigay ng pahintulot na gumawa ng mga organisasyon sa mga bagong user. default_allow_create_organization.description = Payagan ang mga bagong user account ng gumawa ng mga organisasyon bilang default.
default_enable_timetracking = I-enable ang pagsubaybay ng oras bilang default default_enable_timetracking = I-enable ang pagsubaybay ng oras bilang default
default_enable_timetracking.description = Payagan ang paggamit ang pagsubaybay ng oras na feature sa mga bagong repositoryo bilang default. default_enable_timetracking.description = I-enable ang pagsubaybay ng oras sa mga bagong repositoryo bilang default.
allow_dots_in_usernames = Payagan ang mga user na gamitin ang mga tuldok sa kanilang username. Hindi inaapektuhan ang mga umiiral na account. allow_dots_in_usernames = Payagan ang mga user na gamitin ang mga tuldok sa kanilang username. Hindi inaapektuhan ang mga umiiral na account.
no_reply_address = Domain ng nakatagong email no_reply_address = Domain ng nakatagong email
no_reply_address_helper = Domain name para sa mga user na may nakatagong email address. Halimbawa, ang username na "kita" ay mala-log sa Git bilang "kita@noreply.example.org" kapag ang nakatagong email domain ay nakatakda sa "noreply.example.org". no_reply_address_helper = Domain name para sa mga user na may nakatagong email address. Halimbawa, ang username na "kita" ay mala-log sa Git bilang "kita@noreply.example.org" kapag ang nakatagong email domain ay nakatakda sa "noreply.example.org".
@ -310,18 +310,15 @@ invalid_password_algorithm = Hindi angkop na algorithm ng password hash
password_algorithm_helper = Itakda ang password hashing algorithm. Ang mga algorithm ay may magkakaibang mga kinakailangan at lakas. Ang algorithm ng Argon2 ay sa halip ay ligtas ngunit gumagamit ng maraming memory at maaaring hindi naaangkop para sa mga maliliit na sistema. password_algorithm_helper = Itakda ang password hashing algorithm. Ang mga algorithm ay may magkakaibang mga kinakailangan at lakas. Ang algorithm ng Argon2 ay sa halip ay ligtas ngunit gumagamit ng maraming memory at maaaring hindi naaangkop para sa mga maliliit na sistema.
enable_update_checker = I-enable ang tagasuri ng update enable_update_checker = I-enable ang tagasuri ng update
env_config_keys = Configuration ng Environment env_config_keys = Configuration ng Environment
env_config_keys_prompt = Ang mga sumusunod na mga environment variable ay ilalapat rin sa iyong configuration file: env_config_keys_prompt = Ang mga sumusunod na mga environment variable ay ia-apply rin sa iyong configuration file:
offline_mode.description = I-disable ang lahat ng mga third-party na content delivery network at lokal na ibahagi ang lahat ng mga resource. offline_mode.description = I-disable ang lahat ng mga third-party na content delivery network at ibahagi ang lahat ng mga resources ng locally.
require_sign_in_view = Kailanganin ang pag-sign in para tignan ang nilalaman ng instansya require_sign_in_view = Kailanganin ang pag-sign in para tignan ang nilalaman ng instansya
enable_update_checker_helper_forgejo = Pansamantalang susuriin ito para sa mga bagong bersyon ng Forgejo sa pamamagitan ng pagsuri sa isang tala ng TXT DNS sa release.forgejo.org. enable_update_checker_helper_forgejo = Pansamantalang susuriin ito para sa mga bagong bersyon ng Forgejo sa pamamagitan ng pagsuri sa isang tala ng TXT DNS sa release.forgejo.org.
sqlite3_not_available = Ang itong bersyon ng Forgejo ay hindi sinusuportahan ang SQLite3. Paki-download ang opisyal na bersyon ng binary sa %s (hindi ang "gobuild" na bersyon). sqlite3_not_available = Ang itong bersyon ng Forgejo ay hindi sinusuportahan ang SQLite3. Paki-download ang opisyal na bersyon ng binary sa %s (hindi ang "gobuild" na bersyon).
default_allow_create_organization = Payagan ang paggawa ng mga organisasyon bilang default default_allow_create_organization = Payagan ang paggawa ng mga organisasyon bilang default
disable_registration.description = Ang mga tagapangasiwa ng instansya lamang ang makakagawa ng mga bagong user account. Lubos na inirerekomenda namin na panatilihing naka-disable ang pagrehistro maliban kung balak mo na mag-host ng publikong instansya para sa lahat at handang makitungo sa malaking bilang ng mga spam account. disable_registration.description = I-disable ang pansariling pagrehistro ng user. Ang mga tagapangasiwa lamang ang makakagawa ng mga bagong user account.
disable_gravatar.description = I-disable paggamit ang Gravatar at iba pang mga third-party na avatar source. Ang mga default na avatar ay gagamitin maliban kung maga-upload ng avatar ang user sa instansya. disable_gravatar.description = I-disable ang Gravatar at mga third-party na avatar source. Ang isang default na avatar ay gagamitin maliban kung maga-upload ng avatar ang user.
admin_setting.description = Ang paggawa ng administrator account ay opsyonal. Ang pinakaunang nakarehistro na user ay awtomatikong magiging tagapangasiwa. admin_setting.description = Ang paggawa ng administrator account ay opsyonal. Ang pinakaunang nakarehistro na user ay awtomatikong magiging tagapangasiwa.
allow_only_external_registration = Payagan lamang ang pagrehistro sa pamamagitan ng mga external na serbisyo
app_slogan = Slogan ng instansya
app_slogan_helper = Ilagay ang slogan ng iyong instansya. Iwanang walang laman para i-disable.
[heatmap] [heatmap]
number_of_contributions_in_the_last_12_months = %s mga kontribusyon sa nakalipas na 12 buwan number_of_contributions_in_the_last_12_months = %s mga kontribusyon sa nakalipas na 12 buwan
@ -486,8 +483,8 @@ repo.transfer.body = Para tanggapin o tanggihan bisitahin ang %s o huwag na lang
repo.collaborator.added.subject = Idinagdag ka ni %s sa %s bilang tagaambag repo.collaborator.added.subject = Idinagdag ka ni %s sa %s bilang tagaambag
team_invite.subject = Inimbitahan ka ni %[1]s para sumali sa organisasyong %[2]s team_invite.subject = Inimbitahan ka ni %[1]s para sumali sa organisasyong %[2]s
team_invite.text_1 = Inimbitahan ka ni %[1]s para sumali sa koponang %[2]s sa organisasyong %[3]s. team_invite.text_1 = Inimbitahan ka ni %[1]s para sumali sa koponang %[2]s sa organisasyong %[3]s.
team_invite.text_2 = Mangyaring i-click ang sumusunod na link para sumali sa koponan: team_invite.text_2 = Paki-click ang sumusunod na link para sumali sa koponan:
activate_email.text = Mangyaring i-click ang sumusunod na link para i-verify ang iyong email address sa loob ng <b>%s</b>: activate_email.text = Paki-click ang sumusunod na link para i-verify ang iyong email address sa loob ng <b>%s</b>:
repo.collaborator.added.text = Idinagdag ka bilang tagaambag sa repositoryo: repo.collaborator.added.text = Idinagdag ka bilang tagaambag sa repositoryo:
activate_email.title = %s, paki-verify ang iyong email address activate_email.title = %s, paki-verify ang iyong email address
issue.action.reject = Humingi ng mga pagbabago si <b>@%[1]s</b> sa pull request na ito. issue.action.reject = Humingi ng mga pagbabago si <b>@%[1]s</b> sa pull request na ito.
@ -610,10 +607,10 @@ activity = Pampublikong aktibidad
followers_few = %d mga tagasunod followers_few = %d mga tagasunod
block_user = I-block ang user block_user = I-block ang user
change_avatar = Palitan ang iyong avatar… change_avatar = Palitan ang iyong avatar…
block_user.detail = Pakitandaan na ang pag-block ng isang user ay may iba pang mga epekto, gaya ng: block_user.detail = Pakiunawa na kung i-block mo ang user na ito, isasagawa ang iba pang mga aksyon. Gaya ng:
block_user.detail_1 = Hihinto kayo sa pagsunod sa isa't isa at hindi na kayo makakasunod sa isa't isa. block_user.detail_1 = Ina-unfollow ka sa user na ito.
block_user.detail_2 = Hindi magagawa ng user na ito na makipag-ugnayan sa mga repositoryo na minamamay-ari mo, o sa mga isyu at komentong ginawa mo. block_user.detail_2 = Ang user na ito ay hindi maaaring makipag-ugnayan sa iyong mga repositoryo, ginawang isyu at komento.
block_user.detail_3 = Hindi mo magagawang idagdag ang isa't isa bilang mga tagatulong ng repositoryo. block_user.detail_3 = Hindi ka maaaring idagdag ng user na ito bilang isang collaborator, at hindi mo rin sila maidaragdag bilang isang collaborator.
follow_blocked_user = Hindi mo mapa-follow ang user na ito dahil na-block mo ang user na ito o na-block ka ng user na ito. follow_blocked_user = Hindi mo mapa-follow ang user na ito dahil na-block mo ang user na ito o na-block ka ng user na ito.
starred = Mga naka-bituin na repositoryo starred = Mga naka-bituin na repositoryo
watched = Mga sinusubaybayan na repositoryo watched = Mga sinusubaybayan na repositoryo
@ -636,10 +633,6 @@ form.name_reserved = Nakareserba ang username na "%s".
form.name_chars_not_allowed = Naglalaman ng mga hindi angkop na character ang username. form.name_chars_not_allowed = Naglalaman ng mga hindi angkop na character ang username.
followers_one = %d tagasunod followers_one = %d tagasunod
following_one = %d sinusundan following_one = %d sinusundan
following.title.few = Sinusundan
followers.title.few = Mga tagasunod
following.title.one = Sinusundan
followers.title.one = Tagasunod
[settings] [settings]
profile = Profile profile = Profile
@ -1270,8 +1263,8 @@ code = Code
ambiguous_character = `Ang %[1]c [U+%04[1]X] ay maaring malito sa %[2]c [U+%04[2]X]` ambiguous_character = `Ang %[1]c [U+%04[1]X] ay maaring malito sa %[2]c [U+%04[2]X]`
escape_control_characters = I-escape escape_control_characters = I-escape
unescape_control_characters = I-unescape unescape_control_characters = I-unescape
invisible_runes_line = `Ang linya na ito ay may mga hindi nakikitang Unicode character` invisible_runes_line = `Ang linya na ito ay may mga hindi nakikitang unicode character`
ambiguous_runes_line = `Ang linya na ito ay may mga hindi tiyak na Unicode character` ambiguous_runes_line = `Ang linya na ito ay may mga hindi tiyak na unicode character`
tag = Tag tag = Tag
migrate.migrating_git = Nililipat ang Git data migrate.migrating_git = Nililipat ang Git data
vendored = Naka-vendor vendored = Naka-vendor
@ -1333,7 +1326,7 @@ issues.author_helper = May-akda ang tagagamit na ito.
issues.role.owner = May-ari issues.role.owner = May-ari
activity.title.prs_n = %d mga kahilingan sa paghatak activity.title.prs_n = %d mga kahilingan sa paghatak
issues.label_color = Kulay issues.label_color = Kulay
pulls.nothing_to_compare = Magkapareho ang mga branch na ito. Hindi na kailangang gumawa ng hiling sa paghila. pulls.nothing_to_compare = Magkapareho ang mga branch na ito. Hindi na kailangang gumawa ng hiling sa paghatak.
projects.column.assigned_to = Itinalaga sa/kay projects.column.assigned_to = Itinalaga sa/kay
issues.new_label_desc_placeholder = Paglalarawan issues.new_label_desc_placeholder = Paglalarawan
issues.next = Susunod issues.next = Susunod
@ -1463,7 +1456,7 @@ issues.new.no_projects = Walang mga proyekto
pulls.auto_merge_button_when_succeed = (Kung nagtagumpay ang mga [check]) pulls.auto_merge_button_when_succeed = (Kung nagtagumpay ang mga [check])
activity.git_stats_on_default_branch = Sa %s, activity.git_stats_on_default_branch = Sa %s,
activity.period.quarterly = 3 buwan activity.period.quarterly = 3 buwan
issues.review.left_comment = nagiwan ang komento issues.review.left_comment = iniwan ang [comment]
pulls.compare_base = isama sa pulls.compare_base = isama sa
activity.git_stats_additions = at mayroong activity.git_stats_additions = at mayroong
issues.reopen_comment_issue = Magkomento at buksang muli issues.reopen_comment_issue = Magkomento at buksang muli
@ -1547,7 +1540,7 @@ projects.card_type.desc = Mga preview ng card
commits.desc = I-browse ang history ng pagbabago ng source code. commits.desc = I-browse ang history ng pagbabago ng source code.
commits.search.tooltip = Maari kang mag-prefix ng mga keyword gamit ang "author:", "committer:", "after:", o "before:", hal. "revert author:Nijika before:2022-10-09". commits.search.tooltip = Maari kang mag-prefix ng mga keyword gamit ang "author:", "committer:", "after:", o "before:", hal. "revert author:Nijika before:2022-10-09".
issues.force_push_codes = `puwersahang itinulak ang %[1]s mula <a class="ui sha" href="%[3]s"><code>%[2]s</code></a> sa <a class="ui sha" href="%[5]s"><code>%[4]s</code></a> %[6]s` issues.force_push_codes = `puwersahang itinulak ang %[1]s mula <a class="ui sha" href="%[3]s"><code>%[2]s</code></a> sa <a class="ui sha" href="%[5]s"><code>%[4]s</code></a> %[6]s`
issues.push_commit_1 = idinagdag ang %d commit %s issues.push_commit_1 = idinagdag ang %d [commit] %s
issues.push_commits_n = idinagdag ang %d mga [commit] %s issues.push_commits_n = idinagdag ang %d mga [commit] %s
issues.new.no_reviewers = Walang mga tagasuri issues.new.no_reviewers = Walang mga tagasuri
pulls.title_desc_one = hinihiling na isama ang %[1]d [commit] mula <code>%[2]s</code> patungong <code id="branch_target">%[3]s</code> pulls.title_desc_one = hinihiling na isama ang %[1]d [commit] mula <code>%[2]s</code> patungong <code id="branch_target">%[3]s</code>
@ -1558,14 +1551,14 @@ activity.git_stats_author_n = %d mga may-akda
issues.change_title_at = `binago ang pamagat mula <b><strike>%s</strike></b> sa <b>%s</b> %s` issues.change_title_at = `binago ang pamagat mula <b><strike>%s</strike></b> sa <b>%s</b> %s`
activity.git_stats_author_1 = %d may-akda activity.git_stats_author_1 = %d may-akda
diff.review.header = Isumite ang pagsusuri diff.review.header = Isumite ang pagsusuri
issues.review.comment = sinuri ang %s issues.review.comment = sinuri %s
pulls.approve_count_1 = %d pag-apruba pulls.approve_count_1 = %d pag-apruba
pulls.viewed_files_label = %[1]d / %[2]d tinitingnang mga file pulls.viewed_files_label = %[1]d / %[2]d tinitingnang mga file
pulls.approve_count_n = %d mga pag-apruba pulls.approve_count_n = %d mga pag-apruba
pulls.push_rejected = Nabigo ang pagtulak: Tinatanggi ang pagtulak. Suriin ang [Git hooks] para sa [repositoryong] ito. pulls.push_rejected = Nabigo ang pagtulak: Tinatanggi ang pagtulak. Suriin ang [Git hooks] para sa [repositoryong] ito.
diff.review.reject = Hilingin ang mga pagbago diff.review.reject = Hilingin ang mga pagbago
diff.whitespace_show_everything = Ipakita lahat ng pagbago diff.whitespace_show_everything = Ipakita lahat ng pagbago
issues.review.approve = inaprubahan ang mga pagbabagong ito %s issues.review.approve = [inaprubahan] ang mga pagbabagong ito %s
diff.review.approve = Aprubahin diff.review.approve = Aprubahin
settings.event_pull_request_review_desc = Inapruba, tinatanggihan o [komento ng pagsuri] ang [pull request]. settings.event_pull_request_review_desc = Inapruba, tinatanggihan o [komento ng pagsuri] ang [pull request].
settings.event_pull_request_review = Sinusuri na ang [pull request] settings.event_pull_request_review = Sinusuri na ang [pull request]
@ -1736,7 +1729,7 @@ issues.comment_pull_merged_at = isinama ang commit %[1]s sa %[2]s %[3]s
pulls.commit_ref_at = ` isinangguni ang [pull request] mula sa isang [commit]<a id="%[1]s" href="#%[1]s">%[2]s</a>` pulls.commit_ref_at = ` isinangguni ang [pull request] mula sa isang [commit]<a id="%[1]s" href="#%[1]s">%[2]s</a>`
wiki.last_commit_info = Binago ni %s ang pahinang ito %s wiki.last_commit_info = Binago ni %s ang pahinang ito %s
issues.content_history.edited = binago issues.content_history.edited = binago
issues.ref_pull_from = `<a href="%[3]s">isinangguni ang hiling sa paghila na ito %[4]s </a><a id="%[1]s" href="#%[1]s">%[2]s</a>` issues.ref_pull_from = `<a href="%[3]s">isinangguni ang [pull request] na ito</a><a id="%[1]s" href="#%[1]s">%[2]s</a>`
pulls.merged_title_desc_few = isinali ang %[1]d mga [commit] mula sa <code>%[2]s</code> patungong <code>%[3]s</code> %[4]s pulls.merged_title_desc_few = isinali ang %[1]d mga [commit] mula sa <code>%[2]s</code> patungong <code>%[3]s</code> %[4]s
settings.org_not_allowed_to_be_collaborator = Hindi maaring idagdag ang mga organizasyon bilang tagaambag. settings.org_not_allowed_to_be_collaborator = Hindi maaring idagdag ang mga organizasyon bilang tagaambag.
settings.add_collaborator_success = Naidagdag na ang tagaambag. settings.add_collaborator_success = Naidagdag na ang tagaambag.
@ -1745,7 +1738,7 @@ diff.comment.reply = Tumugon
pulls.create = Gumawa ng [pull request] pulls.create = Gumawa ng [pull request]
issues.dependency.pr_close_blocked = Kailangan mong isara ang lahat ng mga isyu na humaharang sa [pull request] na ito bago mo ito isama. issues.dependency.pr_close_blocked = Kailangan mong isara ang lahat ng mga isyu na humaharang sa [pull request] na ito bago mo ito isama.
pulls.delete.title = Burahin ang [pull request] na ito? pulls.delete.title = Burahin ang [pull request] na ito?
issues.dependency.pr_closing_blockedby = Hinarang ng mga sumusunod na isyu mula sa pagsara ng hiling sa paghila na ito issues.dependency.pr_closing_blockedby = Hinarang ng mga sumusunod na isyu mula sa pagsara ng [pull request] na ito
pulls.closed_at = `isinara ang [pull request] na ito<a id="%[1]s" href="#%[1]s">%[2]s</a>` pulls.closed_at = `isinara ang [pull request] na ito<a id="%[1]s" href="#%[1]s">%[2]s</a>`
pulls.close = Isara ang [pull request] pulls.close = Isara ang [pull request]
pulls.cmd_instruction_hint = `Tingnan ang <a class="show-instruction">mga panuto para sa linya ng utos</a>.` pulls.cmd_instruction_hint = `Tingnan ang <a class="show-instruction">mga panuto para sa linya ng utos</a>.`
@ -1754,8 +1747,8 @@ issues.content_history.deleted = binura
pulls.no_results = Walang nakitang mga resulta. pulls.no_results = Walang nakitang mga resulta.
pulls.closed = Sarado ang [pull request] pulls.closed = Sarado ang [pull request]
pulls.is_closed = Naisara na ang [pull request]. pulls.is_closed = Naisara na ang [pull request].
issues.ref_closing_from = `<a href="%[3]s">isinangguni ang hiling sa paghila %[4]s na magsasara sa isyung ito</a><a id="%[1]s" href="#%[1]s">%[2]s</a>` issues.ref_closing_from = `<a href="%[3]s">isinangguni ang [pull request] %[4]s na magsasara sa isyung ito</a><a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.ref_reopening_from = `<a href="%[3]s">isinangguni ang hiling sa paghila %[4]s na muling bubukas sa isyung ito</a><a id="%[1]s" href="#%[1]s">%[2]s</a>` issues.ref_reopening_from = `<a href="%[3]s">isinangguni ang [pull request] %[4]s na muling bubukas sa isyung ito</a><a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.ref_closed_from = `<a href="%[3]s">isinara ang isyung ito %[4]s</a><a id="%[1]s" href="#%[1]s">%[2]s</a>` issues.ref_closed_from = `<a href="%[3]s">isinara ang isyung ito %[4]s</a><a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.review.wait = hiniling sa pagsuri %s issues.review.wait = hiniling sa pagsuri %s
issues.review.reject = hinihiling ang mga pagbago %s issues.review.reject = hinihiling ang mga pagbago %s
@ -1763,103 +1756,9 @@ issues.review.remove_review_request = tinatanggal ang hiling sa pagsuri para sa/
pulls.reopen_to_merge = Mangyaring buksan muli ang [pull request] upang gawin ang pagsali. pulls.reopen_to_merge = Mangyaring buksan muli ang [pull request] upang gawin ang pagsali.
pulls.merged_title_desc_one = isinali ang %[1]d [commit] mula<code>%[2]s</code> patungong <code>%[3]s</code> %[4]s pulls.merged_title_desc_one = isinali ang %[1]d [commit] mula<code>%[2]s</code> patungong <code>%[3]s</code> %[4]s
pull.deleted_branch = (binura):%s pull.deleted_branch = (binura):%s
issues.dependency.pr_close_blocks = Hinarang ng hiling sa paghila na ito mula sa pagsara ng mga sumusunod na isyu issues.dependency.pr_close_blocks = Hinarang ng [pull request] na ito mula sa pagsara ng mga sumusunod na isyu
issues.reference_issue.body = Katawan issues.reference_issue.body = Katawan
pulls.recently_pushed_new_branches = Itinulak mo sa [branch]<a href="%[3]s"> <strong>%[1]s</strong></a>%[2]s pulls.recently_pushed_new_branches = Itinulak mo sa [branch]<a href="%[3]s"> <strong>%[1]s</strong></a>%[2]s
issues.add_time_minutes = Minuto
issues.del_time = Burahin ang log ng oras na ito
issues.stop_tracking = Itigil ang orasan
issues.cancel_tracking_history = `kinansela ang pagsubaybay ng oras %s`
issues.add_time = Manwal na magdagdag ng oras
issues.tracker = Tagasubaybay ng oras
issues.start_tracking_short = Simulan ang orasan
issues.tracker_auto_close = Awtomatikong titigil ang orasan na ito kapag sinara ang isyu na ito
issues.tracking_already_started = `Nagsimula ka na ng pagsubaybay ng oras sa <a href="%s">isa pang isyu</a>!`
issues.dependency.issue_no_dependencies = Walang nakatakdang mga dependency.
issues.dependency.pr_no_dependencies = Walang nakatakdang mga dependency.
issues.due_date_not_set = Walang nakatakdang takdang petsa.
issues.due_date_added = dinagdag ang takdang petsa %s %s
issues.error_removing_due_date = Nabigong tanggalin ang takdang petsa.
issues.error_modifying_due_date = Nabigong baguhin ang takdang petsa.
issues.due_date_remove = tinanggal ang takdang petsa %s %s
issues.due_date_overdue = Overdue na
issues.due_date_invalid = Ang takdang petsa ay hindi wasto o wala sa saklaw. Mangyaring gamitin ang format na "yyyy-mm-dd".
issues.dependency.title = Mga dependency
issues.due_date_form = yyyy-mm-dd
issues.due_date_form_add = Magdagdag ng takdang petsa
issues.due_date_not_writer = Kailangang may write access ka sa repositoryo na ito upang baguhin ang takdang petsa ng isang isyu.
issues.due_date_modified = binago ang takdang petsa mula %[2]s sa %[1]s %[3]s
issues.due_date = Takdang petsa
issues.add_time_sum_to_small = Walang inilagay na oras.
issues.time_spent_total = Kabuuang nilaan na oras
issues.del_time_history = `binura ang nilaan na oras %s`
subscribe.issue.guest.tooltip = Mag-sign in para mag-subscribe sa isyung ito.
issues.time_spent_from_all_authors = `Kabuuang nilaan na oras: %s`
issues.start_tracking = Simulan ang pagsubaybay ng oras
issues.add_time_history = `dinagdag ang nilaan na oras %s`
issues.invalid_due_date_format = Ang format ng takdang petsa ay dapat "yyyy-mm-dd".
subscribe.pull.guest.tooltip = Mag-sign in para mag-subscribe sa hiling sa paghila na ito.
issues.edit.already_changed = Hindi maimbak ang mga pagbabago sa isyu. Mukhang nabago na ng ibang tagagamit ang nilalaman. Mangyaring i-refresh ang pahina at subukang baguhin muli upang maiwasang ma-overwrite ang kanilang pagbago
signing.wont_sign.not_signed_in = Hindi ka naka-sign in.
activity.new_issues_count_n = Bagong mga isyu
activity.git_stats_files_changed_n = mga nabago
activity.git_stats_files_changed_1 = nabago
issues.dependency.remove = Tanggalin
pulls.edit.already_changed = Hindi maimbak ang mga pagbabago sa [pull request]. Mukhang nabago na ng ibang tagagamit ang nilalaman. Mangyaring i-refresh ang pahina at subukang baguhin muli upang maiwasang ma-overwrite ang kanilang pagbago
milestones.filter_sort.most_complete = Pinakakumpleto
settings.collaboration.owner = May-ari
pulls.showing_only_single_commit = Ipinapakita lamang ang mga pagbago ng [commit] %[1]s
comments.edit.already_changed = Hindi maimbak ang mga pagbabago sa komento. Mukhang nabago na ng ibang tagagamit ang nilalaman. Mangyaring i-refresh ang pahina at subukang baguhin muli upang maiwasang ma-overwrite ang kanilang pagbago
milestones.completeness = <strong>%d%%</strong> nakumpleto
wiki.welcome = Maligayang pagdating sa Wiki.
wiki.create_first_page = Gawin ang unang pahina
pulls.switch_comparison_type = Ilipat ang uri ng pagkumpara
settings.collaboration.read = Basahin
contributors.contribution_type.additions = Mga pagdagdag
settings.collaboration.write = Isulat
wiki.search = Hanapin ang wiki
wiki.no_search_results = Walang mga resulta
activity.git_stats_addition_1 = %d pagdagdag
activity.git_stats_addition_n = %d mga pagdagdag
activity.git_stats_deletion_1 = %d pagbura
activity.git_stats_deletion_n = %d mga pagbura
activity.navbar.code_frequency = Dalas ng [code]
pulls.switch_head_and_base = Ilipat ang ulo at base
activity.git_stats_push_to_all_branches = sa lahat ng mga [branch].
activity.git_stats_pushed_n = mga itinulak
issues.reference_link = Pagsangguni: %s
activity.git_stats_pushed_1 = itinulak
activity.git_stats_commit_n = %d mga [commit]
issues.dependency.add = Magdagdag ng dependency…
issues.dependency.cancel = Kanselahin
issues.dependency.no_permission.can_remove = Wala kang pahintulot na basahin ang dependency na ito ngunit matatanggal ang dependency
issues.dependency.remove_info = Tanggalin ang dependency na ito
issues.dependency.added_dependency = `nagdagdag ng bagong dependency %s`
issues.review.dismissed_label = Nadismiss
issues.review.dismissed = nadismiss ang pagsuri ni %s %s
issues.review.self.approval = Hindi mo maaring aprubahan ang sarili mong hiling sa paghila.
issues.review.self.rejection = Hindi mo maaring humiling ng pagbabago sa sarili mong hiling sa paghila.
pulls.nothing_to_compare_have_tag = Magkapareho ang mga piniling branch/tag.
issues.dependency.no_permission_1 = Wala kang pahintulot na basahin ang dependency na %d
issues.dependency.no_permission_n = Wala kang pahintulot na basahin ang mga %d dependency
issues.dependency.removed_dependency = `nagtanggal ng dependency %s`
settings.mirror_settings.push_mirror.add = Magdagdag ng salaming pangtulak
settings.mirror_settings.last_update = Huling nabago
settings.units.add_more = Magdagdag ng higit pa...
activity.closed_issues_count_n = Isinarang mga isyu
activity.new_issues_count_1 = Bagong isyu
settings.branches.add_new_rule = Magdagdag ng bagong patakaran
pulls.push_rejected_summary = Buong mensahe ng pagtanggi
activity.title.issues_1 = %d isyu
activity.title.issues_n = % mga isyu
settings.mirror_settings.direction.pull = Paghila
settings.mirror_settings.direction.push = Pagtulak
settings.push_mirror_sync_in_progress = Itinulak ang mga pagbabago patungo sa [malayuang] %s sa ngayon.
milestones.filter_sort.least_issues = [Pinakamaliit] na mga isyu
pulls.showing_specified_commit_range = Ipinapakita lamang ang mga pagbabago sa pagitan ng %[1]s..%[2]s
wiki.pages = Mga pahina
activity.unresolved_conv_label = Nakabukas
settings.pull_mirror_sync_in_progress = Inihatak ang mga pagbabago mula sa [malayuang] %s sa ngayon.
[search] [search]
commit_kind = Maghanap ng mga commit... commit_kind = Maghanap ng mga commit...
@ -1882,10 +1781,6 @@ branch_kind = Maghanap ng mga branch...
runner_kind = Maghanap ng mga runner... runner_kind = Maghanap ng mga runner...
no_results = Walang mga tumutugma na resulta na nahanap. no_results = Walang mga tumutugma na resulta na nahanap.
code_search_by_git_grep = Ang kasalukuyang mga resulta ng paghahanap ng code ay ibinibigay ng "git grep*. Maaring may mga mas magandang resulta kapag na-enable ng tagapangasiwa ng site ang Indexer ng Repositoryo. code_search_by_git_grep = Ang kasalukuyang mga resulta ng paghahanap ng code ay ibinibigay ng "git grep*. Maaring may mga mas magandang resulta kapag na-enable ng tagapangasiwa ng site ang Indexer ng Repositoryo.
pull_kind = Maghanap ng mga paghila...
issue_kind = Maghanap ng mga isyu...
exact = Eksakto
exact_tooltip = Samahan lamang ang mga resulta na tutugma sa eksaktong search term
[admin] [admin]
auths.updated = Nabago auths.updated = Nabago
@ -2078,7 +1973,7 @@ auths.auth_name = Pangalan ng authentikasyon
auths.security_protocol = Protocol ng seguridad auths.security_protocol = Protocol ng seguridad
auths.domain = Domain auths.domain = Domain
auths.host = Host auths.host = Host
packages.total_size = Kabuuang laki: %s packages.total_size = Kabuuang Laki: %s
auths.attribute_avatar = Attribute ng avatar auths.attribute_avatar = Attribute ng avatar
auths.enabled = Naka-enable auths.enabled = Naka-enable
auths.syncenabled = I-enable ang user synchronization auths.syncenabled = I-enable ang user synchronization
@ -2113,7 +2008,7 @@ auths.user_dn = DN ng User
auths.attribute_username = Attribute ng username auths.attribute_username = Attribute ng username
auths.attribute_username_placeholder = Iwanang walang laman para gamitin ang username na inilagay sa Forgejo. auths.attribute_username_placeholder = Iwanang walang laman para gamitin ang username na inilagay sa Forgejo.
auths.attribute_name = Attribute ng unang pangalan auths.attribute_name = Attribute ng unang pangalan
packages.unreferenced_size = Hindi sinangguniang laki: %s packages.unreferenced_size = Walang Sangguniang Laki: %s
packages.owner = May-ari packages.owner = May-ari
packages.name = Pangalan packages.name = Pangalan
packages.cleanup = Linisin ang na-expire na data packages.cleanup = Linisin ang na-expire na data
@ -2176,21 +2071,6 @@ config.register_email_confirm = Kailanganin ang pagkumpirma ng email upang magre
config.disable_register = I-disable ang pansariling pagrehistro config.disable_register = I-disable ang pansariling pagrehistro
auths.default_domain_name = Default domain name na gagamitin para sa email address auths.default_domain_name = Default domain name na gagamitin para sa email address
auths.allow_deactivate_all = Pinapayagan ang walang laman na resulta ng paghahanap para i-deactivate ang lahat ng mga user auths.allow_deactivate_all = Pinapayagan ang walang laman na resulta ng paghahanap para i-deactivate ang lahat ng mga user
notices.type_2 = Trabaho
notices.desc = Deskripsyon
notices.op = Op.
notices.delete_all = Burahin ang lahat ng mga paunawa
notices.type = Uri
notices.type_1 = Repositoryo
notices.system_notice_list = Mga paunawa ng sistema
notices.deselect_all = I-deselect lahat
notices.select_all = Piliin lahat
notices.delete_success = Binura na ang mga paunawa ng sistema.
notices.operations = Mga operasyon
notices.delete_selected = Burahin ang pinili
notices.view_detail_header = Mga detalye ng paunawa
notices.inverse_selection = Baliktarin ang pagpili
config.app_slogan = Slogan ng instansya
[org] [org]
repo_updated = Binago %s repo_updated = Binago %s
@ -2212,11 +2092,6 @@ team_name_helper = Ang mga pangalan ng koponan ay dapat na maikli at makakaalala
team_desc_helper = Ilarawan ang layunin ng koponan. team_desc_helper = Ilarawan ang layunin ng koponan.
members = Mga miyembro members = Mga miyembro
code = Code code = Code
follow_blocked_user = Hindi ka makakasunod sa organisasyong ito dahil hinarang ka ng organisasyong ito.
settings.permission = Mga pahintulot
settings.visibility.public = Pangpubliko
settings.full_name = Buong pangalan
form.create_org_not_allowed = Hindi ka pinapayagang gumawa ng organisasyon.
[packages] [packages]

View file

@ -87,9 +87,9 @@ rerun=Relancer
rerun_all=Relancer toutes les tâches rerun_all=Relancer toutes les tâches
save=Enregistrer save=Enregistrer
add=Ajouter add=Ajouter
add_all=Tout ajouter add_all=Tout Ajouter
remove=Supprimer remove=Supprimer
remove_all=Tout supprimer remove_all=Tout Supprimer
remove_label_str=Supprimer lélément « %s » remove_label_str=Supprimer lélément « %s »
edit=Éditer edit=Éditer
view=Voir view=Voir
@ -280,19 +280,19 @@ offline_mode.description=Désactiver l'utilisation de CDNs, et servir toutes les
disable_gravatar=Désactiver Gravatar disable_gravatar=Désactiver Gravatar
disable_gravatar.description=Désactiver Gravatar et les autres sources d'avatars tierces. Un avatar par défaut sera utilisé pour les utilisateurs n'ayant pas téléversé un avatar personnalisé. disable_gravatar.description=Désactiver Gravatar et les autres sources d'avatars tierces. Un avatar par défaut sera utilisé pour les utilisateurs n'ayant pas téléversé un avatar personnalisé.
federated_avatar_lookup=Activer les avatars fédérés federated_avatar_lookup=Activer les avatars fédérés
federated_avatar_lookup.description=Activer la recherche d'avatars en utilisant Libravatar. federated_avatar_lookup.description=Activer la recherche unifiée d'avatars en utilisant le service open source unifié basé sur libravatar.
disable_registration=Désactiver la création de compte disable_registration=Désactiver la création de compte
disable_registration.description=Seuls les administrateurs pourront créer de nouveaux comptes utilisateurs. Il est hautement recommandé de désactiver les inscriptions a moins que vous ayez l'intention de fournir une instance publiquement accessible et soyez prêt à gérer un grand nombre de comptes indésirables. disable_registration.description=Désactiver les nouvelles inscriptions. Seuls les administrateurs pourront créer de nouveaux comptes utilisateurs.
allow_only_external_registration.description=N'autoriser l'inscription qu'à partir des services externes. allow_only_external_registration.description=N'autoriser l'inscription qu'à partir des services externes
openid_signin=Activer l'authentification OpenID openid_signin=Activer l'authentification OpenID
openid_signin.description=Activer l'authentification via OpenID. openid_signin.description=Activer l'authentification via OpenID.
openid_signup=Activer l'inscription OpenID openid_signup=Activer l'inscription OpenID
openid_signup.description=Activer l'inscription avec OpenID si le formulaire d'inscription est disponible. openid_signup.description=Activer l'inscription avec OpenID.
enable_captcha=Activer le CAPTCHA d'inscription enable_captcha=Activer le CAPTCHA d'inscription
enable_captcha.description=Demander un CAPTCHA aux utilisateurs qui créent des comptes. enable_captcha.description=Demander un CAPTCHA à l'inscription.
require_sign_in_view=Exiger la connexion à un compte pour afficher les pages require_sign_in_view=Exiger la connexion à un compte pour afficher les pages
require_sign_in_view.description=Limiter laccès aux pages aux utilisateurs connectés. Les visiteurs ne verront que les pages de connexion et dinscription. require_sign_in_view.description=Limiter laccès aux pages aux utilisateurs connectés. Les visiteurs ne verront que les pages de connexion et dinscription.
admin_setting.description=La création d'un compte administrateur est facultative. Le premier utilisateur enregistré deviendra automatiquement un administrateur. admin_setting.description=La création d'un compte administrateur est facultative. Le premier utilisateur enregistré deviendra automatiquement un administrateur le cas échéant.
admin_title=Paramètres de compte administrateur admin_title=Paramètres de compte administrateur
admin_name=Nom dutilisateur administrateur admin_name=Nom dutilisateur administrateur
admin_password=Mot de passe admin_password=Mot de passe
@ -312,9 +312,9 @@ save_config_failed=L'enregistrement de la configuration %v a échoué
invalid_admin_setting=Paramètres du compte administrateur invalides : %v invalid_admin_setting=Paramètres du compte administrateur invalides : %v
invalid_log_root_path=Le répertoire des fichiers de journalisation est invalide : %v invalid_log_root_path=Le répertoire des fichiers de journalisation est invalide : %v
default_keep_email_private=Masquer les adresses courriels par défaut default_keep_email_private=Masquer les adresses courriels par défaut
default_keep_email_private.description=Masquer par défaut les adresses courriels des nouveaux utilisateurs afin que cette information ne soient pas visible immédiatement après l'inscription. default_keep_email_private.description=Masquer par défaut les adresses courriels des nouveaux utilisateurs.
default_allow_create_organization=Autoriser la création d'organisations par défaut default_allow_create_organization=Autoriser la création d'organisations par défaut
default_allow_create_organization.description=Permettre aux nouveaux comptes utilisateurs de créer des organisations par défaut. Lorsque cette option est désactivée, un administrateur devra donner la permission de créer des organisations aux nouveaux utilisateurs. default_allow_create_organization.description=Permettre aux nouveaux comptes utilisateurs de créer des organisations par défaut.
default_enable_timetracking=Activer le suivi de temps par défaut default_enable_timetracking=Activer le suivi de temps par défaut
default_enable_timetracking.description=Activer le suivi du temps pour les nouveaux dépôts par défaut. default_enable_timetracking.description=Activer le suivi du temps pour les nouveaux dépôts par défaut.
no_reply_address=Domaine pour les courriels cachés no_reply_address=Domaine pour les courriels cachés
@ -331,7 +331,6 @@ smtp_from_invalid = L'adresse "Envoyer un courriel en tant que" est invalide
config_location_hint = Ces options de configuration seront sauvegardées dans : config_location_hint = Ces options de configuration seront sauvegardées dans :
app_slogan = Slogan de l'instance app_slogan = Slogan de l'instance
app_slogan_helper = Entrez le slogan de l'instance ici. En son absence il sera désactivé. app_slogan_helper = Entrez le slogan de l'instance ici. En son absence il sera désactivé.
allow_only_external_registration = Utiliser uniquement l'enregistrement via un service externe
[home] [home]
uname_holder=Nom dutilisateur ou adresse courriel uname_holder=Nom dutilisateur ou adresse courriel
@ -794,7 +793,7 @@ add_email_success=La nouvelle adresse e-mail a été ajoutée.
email_preference_set_success=L'e-mail de préférence a été défini avec succès. email_preference_set_success=L'e-mail de préférence a été défini avec succès.
add_openid_success=La nouvelle adresse OpenID a été ajoutée. add_openid_success=La nouvelle adresse OpenID a été ajoutée.
keep_email_private=Cacher l'adresse courriel keep_email_private=Cacher l'adresse courriel
keep_email_private_popup=Ceci masquera votre adresse e-mail de votre profil, de vos demandes d'ajout et des fichiers modifiés depuis l'interface Web. Les révisions déjà soumises ne seront pas modifiés. Utilisez %s dans les révisions pour les relier à votre compte. keep_email_private_popup=Ceci masquera votre adresse e-mail de votre profil, de vos demandes d'ajout et des fichiers modifiés depuis l'interface Web. Les révisions déjà soumises ne seront pas modifiés.
openid_desc=OpenID vous permet de confier l'authentification à une tierce partie. openid_desc=OpenID vous permet de confier l'authentification à une tierce partie.
manage_ssh_keys=Gérer les clés SSH manage_ssh_keys=Gérer les clés SSH
@ -2763,11 +2762,6 @@ wiki.search = Recherche dans le wiki
wiki.no_search_results = Pas de résultats wiki.no_search_results = Pas de résultats
form.string_too_long = La chaîne de caractère fournie fait plus de %d caractères. form.string_too_long = La chaîne de caractère fournie fait plus de %d caractères.
settings.federation_settings = Paramètres de féderation settings.federation_settings = Paramètres de féderation
project = Projets
subscribe.issue.guest.tooltip = Authentifiez vous pour vous abonner à ce ticket.
subscribe.pull.guest.tooltip = Authentifiez vous pour suivre cette demande d'ajout.
n_release_one = %s publication
n_release_few = %s publications
[graphs] [graphs]
component_loading=Chargement de %s… component_loading=Chargement de %s…

View file

@ -12,7 +12,7 @@ sign_in_with_provider = Iniciar Sesión con %s
sign_in_or = ou sign_in_or = ou
sign_out = Pechar Sesión sign_out = Pechar Sesión
sign_up = Rexístrate sign_up = Rexístrate
link_account = Vincular Conta link_account = Ligazón a Conta
register = Rexistro register = Rexistro
version = Vesión version = Vesión
powered_by = Desenvolvido por %s powered_by = Desenvolvido por %s
@ -125,23 +125,6 @@ confirm_delete_selected = Confirmar a eliminación de todos os elementos selecci
show_full_screen = Mostrar Pantalla Completa show_full_screen = Mostrar Pantalla Completa
more_items = Máis items more_items = Máis items
toggle_menu = Alternar Menú toggle_menu = Alternar Menú
filter = Filtro
filter.clear = Borrar filtros
filter.is_archived = Arquivado
filter.is_fork = Derivacións
filter.is_mirror = Espellos
filter.not_archived = Non arquivado
filter.not_fork = Sen derivacións
filter.not_mirror = Sen réplicas
invalid_data = Datos non válidos: %v
concept_user_individual = Individual
concept_code_repository = Repositorio
filter.is_template = Modelos
filter.not_template = Non modelos
filter.public = Publico
pin = Aproximada
filter.private = Privado
copy_generic = Copiar ao portapapeis
[aria] [aria]
navbar = Barra de Navegación navbar = Barra de Navegación
@ -154,71 +137,9 @@ contributions_zero = Sen Achegas
less = Menos less = Menos
more = Máis more = Máis
number_of_contributions_in_the_last_12_months = %s de contribucións nos últimos 12 meses number_of_contributions_in_the_last_12_months = %s de contribucións nos últimos 12 meses
contributions_few = contribucións
contributions_one = contribución
[editor] [editor]
buttons.heading.tooltip = Engadir Título buttons.heading.tooltip = Engadir Título
buttons.italic.tooltip = Engade texto en cursiva buttons.italic.tooltip = Engade texto en cursiva
buttons.quote.tooltip = Texto de cita buttons.quote.tooltip = Texto de cita
buttons.bold.tooltip = Engadir texto en negriña buttons.bold.tooltip = Engadir texto en negriña
buttons.link.tooltip = Engade unha ligazón
buttons.code.tooltip = Engadir código
buttons.list.unordered.tooltip = Engadir unha lista de marcadores
buttons.enable_monospace_font = Activa o tipo de letra monoespazo
buttons.disable_monospace_font = Desactivar o tipo de letra monoespazo
buttons.ref.tooltip = Referencia un problema ou pull request
[search]
search = Buscar...
type_tooltip = Tipo de busca
[startpage]
platform = Multiplataforma
app_desc = Um servizo Git autoxestionado e fácil de usar
install = Fácil de instalar
platform_desc = Forgejo execútase en calquera lugar onde <a target="_blank" rel="noopener noreferrer" href="https://go.dev/">Go</a> poida compilar para: Windows, MacOS, Linux, ARM, etc. Escolla seu preferido!
install_desc = Simplemente <a target="_blank" rel="noopener noreferrer" href="https://forgejo.org/download/#installation-from-binary">executa o binario</a> para a túa plataforma, envíao con < un target="_blank" rel="noopener noreferrer" href="https://forgejo.org/download/#container-image">Docker</a> ou consígueo <a target="_blank" rel=" noopener noreferrer" href="https://forgejo.org/download">empaquetado</a>.
[error]
occurred = Ocorreu un erro
missing_csrf = Solicitude incorrecta: non hai ningún token CSRF presente
server_internal = Erro interno do servidor
invalid_csrf = Solicitude incorrecta: token CSRF non válido
not_found = Non se puido atopar o obxectivo.
network_error = Erro de rede
report_message = Se cres que se trata dun erro de Forgejo, busca problemas en <a href="https://codeberg.org/forgejo/forgejo/issues" target="_blank">Codeberg</a> ou abre un novo problema Se é necesario.
[filter]
string.asc = A - Z
string.desc = Z - A
[install]
err_empty_db_path = A ruta da base de datos SQLite3 non pode estar baleira.
smtp_from_invalid = O enderezo "Enviar correo electrónico como" non é válido
optional_title = Axustes opcionais
email_title = Configuración de correo electrónico
smtp_addr = Servidor SMTP
smtp_port = Porto do Servidor SMTP
smtp_from = Enviar correo electrónico como
no_admin_and_disable_registration = Non pode desactivar o rexistro automático de usuarios sen crear unha conta de administrador.
err_empty_admin_password = O contrasinal do administrador non pode estar baleiro.
err_empty_admin_email = O correo electrónico do administrador non pode estar baleiro.
err_admin_name_is_reserved = O nome de usuario do administrador non é válido, o nome de usuario está reservado
reinstall_confirm_check_2 = É posible que os repositorios e a configuración teñan que volver a sincronizarse. Ao marcar esta caixa, confirmas que volverás sincronizar os ganchos para os repositorios e o ficheiro authorized_keys manualmente. Confirma que se asegurará de que a configuración do repositorio e do espello sexa correcta.
reinstall_confirm_check_3 = Confirmas que estás absolutamente seguro de que este Forgejo se está a executar coa localización correcta do app.ini e de que tes que volver a instalar. Vostede confirma que recoñece os riscos anteriores.
err_admin_name_pattern_not_allowed = O nome de usuario do administrador non é válido, o nome de usuario coincide cun patrón reservado
err_admin_name_is_invalid = O nome de usuario do administrador non é válido
ssl_mode = SSL
path = Ruta
reinstall_error = Está tentando instalar nunha base de datos Forgejo existente
http_port = Porto de escoita HTTP do Forgejo
http_port_helper = Número de porto que utilizará o servidor web de Forgejo.
app_url = URL Base
app_url_helper = Enderezo base para URL de clonación HTTP(S) e notificacións por correo electrónico.
log_root_path = Ruta de rexistro
log_root_path_helper = Os ficheiros de rexistro escribiranse neste directorio.
sqlite_helper = Ruta do ficheiro para a base de datos SQLite3.<br>Introduza unha ruta absoluta se executa Forgejo como servizo.
reinstall_confirm_message = A reinstalación cunha base de datos Forgejo existente pode causar varios problemas. Na maioría dos casos, deberías usar o teu "app.ini" existente para executar Forgejo. Se sabes o que estás facendo, confirma o seguinte:
reinstall_confirm_check_1 = É posible que se perdan os datos cifrados pola SECRET_KEY en app.ini: é posible que os usuarios non poidan iniciar sesión con 2FA/OTP e que os espellos non funcionen correctamente. Ao marcar esta caixa, confirmas que o ficheiro app.ini actual contén a SECRET_KEY correcta.

View file

@ -275,22 +275,22 @@ register_confirm=登録にはメールによる確認が必要
mail_notify=メール通知を有効にする mail_notify=メール通知を有効にする
server_service_title=サーバーと外部サービスの設定 server_service_title=サーバーと外部サービスの設定
offline_mode=ローカルモードを有効にする offline_mode=ローカルモードを有効にする
offline_mode.description=のCDNサービスを使わず、すべてのリソースを自前で提供します。 offline_mode.description=のCDNサービスを使わず、すべてのリソースを自前で提供します。
disable_gravatar=Gravatarを無効にする disable_gravatar=Gravatarを無効にする
disable_gravatar.description=Gravatarと外のアバターソースを無効にします。 アバターをローカルにアップロードしていないユーザーには、デフォルトのアバターが使用されます。 disable_gravatar.description=Gravatarと外のアバターソースを無効にします。 アバターをローカルにアップロードしていないユーザーには、デフォルトのアバターが使用されます。
federated_avatar_lookup=フェデレーテッド・アバターを有効にする federated_avatar_lookup=フェデレーテッド・アバターを有効にする
federated_avatar_lookup.description=Libravatarを使用したフェデレーテッド・アバター検索を有効にします。 federated_avatar_lookup.description=Libravatarを使用したフェデレーテッド・アバター検索を有効にします。
disable_registration=セルフ登録を無効にする disable_registration=セルフ登録を無効にする
disable_registration.description=管理者だけが新しいユーザー アカウントを作成できます。誰もが利用できるパブリックインスタンスをホストし、大量のスパムアカウントに対処する準備ができていない限り、登録を無効にしておくことを強くお勧めします。 disable_registration.description=ユーザーのセルフ登録を無効にします。 新しいユーザーアカウントを作成できるのは管理者だけとなります。
allow_only_external_registration.description=設定された外部サービスを使用してのみ新しいアカウントを作成できます。 allow_only_external_registration.description=外部サービスを使用した登録のみを許可
openid_signin=OpenIDを使ったサインインを有効にする openid_signin=OpenIDを使ったサインインを有効にする
openid_signin.description=OpenIDを使ったユーザーのサインインを有効にします。 openid_signin.description=OpenIDを使ったユーザーのサインインを有効にします。
openid_signup=OpenIDを使ったセルフ登録を有効にする openid_signup=OpenIDを使ったセルフ登録を有効にする
openid_signup.description=セルフ登録が有効になっている場合、ユーザーが OpenID 経由でアカウントを作成できるようにします。 openid_signup.description=OpenIDベースでのユーザーのセルフ登録を有効にします。
enable_captcha=登録時のCAPTCHAを有効にする enable_captcha=登録時のCAPTCHAを有効にする
enable_captcha.description=アカウントを作成する時に、ユーザーにCAPTCHA 認証を必須にします。 enable_captcha.description=ユーザーのセルフ登録時にCAPTCHAを必須にします。
require_sign_in_view=インスタンス内ページの閲覧にサインインが必要 require_sign_in_view=インスタンス内ページの閲覧にサインインが必要
require_sign_in_view.description=コンテンツへのアクセスをサインインしたユーザーに限定します。 ゲストは認証ページだけ見ることができます。 require_sign_in_view.description=ページアクセスをサインイン済みユーザーに限定します。 訪問者はサインインページと登録ページだけ見ることができます。
admin_setting.description=管理者アカウントの作成は任意です。 最初に登録したユーザーは自動的に管理者になります。 admin_setting.description=管理者アカウントの作成は任意です。 最初に登録したユーザーは自動的に管理者になります。
admin_title=管理者アカウントの設定 admin_title=管理者アカウントの設定
admin_name=管理者ユーザー名 admin_name=管理者ユーザー名
@ -311,9 +311,9 @@ save_config_failed=設定ファイルの保存に失敗しました: %v
invalid_admin_setting=管理者アカウントの設定が無効です: %v invalid_admin_setting=管理者アカウントの設定が無効です: %v
invalid_log_root_path=ログの保存先パスが無効です: %v invalid_log_root_path=ログの保存先パスが無効です: %v
default_keep_email_private=デフォルトでメールアドレスを隠す default_keep_email_private=デフォルトでメールアドレスを隠す
default_keep_email_private.description=規ユーザーのメールアドレスの非表示をデフォルトで有効にして、サインアップ直後にこの情報が漏洩しないようにします。 default_keep_email_private.description=しいユーザーアカウントで、デフォルトでメールアドレスを隠す設定にします。
default_allow_create_organization=デフォルトで組織の作成を許可 default_allow_create_organization=デフォルトで組織の作成を許可
default_allow_create_organization.description=デフォルトで、新規ユーザーが組織を作成できるようにします。このオプションを無効にすると、管理者は新規ユーザーに組織を作成する権限を付与する必要があります。 default_allow_create_organization.description=新しいユーザーアカウントに組織の作成をデフォルトで許可します。
default_enable_timetracking=デフォルトでタイムトラッキング有効 default_enable_timetracking=デフォルトでタイムトラッキング有効
default_enable_timetracking.description=新しいリポジトリのタイムトラッキングをデフォルトで有効にします。 default_enable_timetracking.description=新しいリポジトリのタイムトラッキングをデフォルトで有効にします。
no_reply_address=メールを隠すときのドメイン no_reply_address=メールを隠すときのドメイン
@ -328,9 +328,6 @@ allow_dots_in_usernames = ユーザー名にドットを使用できるように
smtp_from_invalid = メール送信者のアドレスが無効です smtp_from_invalid = メール送信者のアドレスが無効です
enable_update_checker_helper_forgejo = Forgejoの最新バージョンを、release.forgejo.orgのDNSのTXTレコードを定期的に参照して取得します。 enable_update_checker_helper_forgejo = Forgejoの最新バージョンを、release.forgejo.orgのDNSのTXTレコードを定期的に参照して取得します。
config_location_hint = この設定は次に保存されます: config_location_hint = この設定は次に保存されます:
allow_only_external_registration = 外部サービス経由のみの登録を許可する
app_slogan = インスタンスのスローガン
app_slogan_helper = ここにインスタンスのスローガンを入力します。無効にするには空白のままにします。
[home] [home]
uname_holder=ユーザー名またはメールアドレス uname_holder=ユーザー名またはメールアドレス
@ -668,7 +665,7 @@ settings=ユーザー設定
form.name_reserved=ユーザー名 "%s" は予約されています。 form.name_reserved=ユーザー名 "%s" は予約されています。
form.name_pattern_not_allowed=`"%s" の形式はユーザー名に使用できません。` form.name_pattern_not_allowed=`"%s" の形式はユーザー名に使用できません。`
form.name_chars_not_allowed=ユーザー名 "%s" には無効な文字が含まれています。 form.name_chars_not_allowed=ユーザー名 "%s" には無効な文字が含まれています。
block_user.detail_2 = このユーザーは、リポジトリ、作成されたイシュー、コメントを操作できません。 block_user.detail_2 = このユーザーは、リポジトリ、作成された問題、コメントを操作できません。
block_user.detail_1 = このユーザーからのフォローが解除されています。 block_user.detail_1 = このユーザーからのフォローが解除されています。
follow_blocked_user = あなたはこのユーザーをフォローできません。なぜなら、あなたはこのユーザーをブロックしたか、このユーザーはあなたをブロックしているからです。 follow_blocked_user = あなたはこのユーザーをフォローできません。なぜなら、あなたはこのユーザーをブロックしたか、このユーザーはあなたをブロックしているからです。
block_user.detail_3 = このユーザーはあなたをコラボレーターとして追加することはできませんし、あなたも彼らをコラボレーターに追加できません。 block_user.detail_3 = このユーザーはあなたをコラボレーターとして追加することはできませんし、あなたも彼らをコラボレーターに追加できません。
@ -799,7 +796,7 @@ manage_ssh_keys=SSHキーの管理
manage_ssh_principals=SSH証明書プリンシパルの管理 manage_ssh_principals=SSH証明書プリンシパルの管理
manage_gpg_keys=GPGキーの管理 manage_gpg_keys=GPGキーの管理
add_key=キーを追加 add_key=キーを追加
ssh_desc=あなたのアカウントに関連付けられているSSH公開鍵です。 対応する秘密鍵で、あなたのリポジトリへのフルアクセスが可能です。検証済みの SSHキーは、SSH 署名された Git コミットの検証に使用できます。 ssh_desc=あなたのアカウントに関連付けられているSSH公開鍵です。 対応する秘密鍵で、あなたのリポジトリへのフルアクセスが可能です。
principal_desc=これらのSSH証明書プリンシパルがあなたのアカウントに関連付けられており、あなたのリポジトリへのフルアクセスが許可されています。 principal_desc=これらのSSH証明書プリンシパルがあなたのアカウントに関連付けられており、あなたのリポジトリへのフルアクセスが許可されています。
gpg_desc=あなたのアカウントに関連付けられているGPG公開鍵です。 これらの鍵でコミットが検証できるよう、秘密鍵は安全に保管してください。 gpg_desc=あなたのアカウントに関連付けられているGPG公開鍵です。 これらの鍵でコミットが検証できるよう、秘密鍵は安全に保管してください。
ssh_helper=<strong>ヘルプが必要ですか?</strong> GitHubのガイドをご覧ください: <a href="%s">SSHキーの作成</a>、SSHを使う際に<a href="%s">よくある問題</a> ssh_helper=<strong>ヘルプが必要ですか?</strong> GitHubのガイドをご覧ください: <a href="%s">SSHキーの作成</a>、SSHを使う際に<a href="%s">よくある問題</a>
@ -875,7 +872,7 @@ social_desc=これらのソーシャルアカウントで、あなたのアカ
unbind=連携の解除 unbind=連携の解除
unbind_success=ソーシャルアカウントの登録を削除しました。 unbind_success=ソーシャルアカウントの登録を削除しました。
manage_access_token=アクセストークン manage_access_token=アクセストークンの管理
generate_new_token=新しいトークンを生成 generate_new_token=新しいトークンを生成
tokens_desc=これらのトークンは、Forgejo APIによるアカウントへのアクセスを許可します。 tokens_desc=これらのトークンは、Forgejo APIによるアカウントへのアクセスを許可します。
token_name=トークン名 token_name=トークン名
@ -906,7 +903,7 @@ remove_oauth2_application=OAuth2アプリケーションの削除
remove_oauth2_application_desc=OAuth2アプリケーションを削除すると、すべての署名済みアクセストークンが利用できなくなります。 続行しますか? remove_oauth2_application_desc=OAuth2アプリケーションを削除すると、すべての署名済みアクセストークンが利用できなくなります。 続行しますか?
remove_oauth2_application_success=アプリケーションを削除しました。 remove_oauth2_application_success=アプリケーションを削除しました。
create_oauth2_application=新しいOAuth2アプリケーションの作成 create_oauth2_application=新しいOAuth2アプリケーションの作成
create_oauth2_application_button=アプリケーション作成 create_oauth2_application_button=アプリケーション作成
create_oauth2_application_success=新しいOAuth2アプリケーションを作成しました。 create_oauth2_application_success=新しいOAuth2アプリケーションを作成しました。
update_oauth2_application_success=OAuth2アプリケーションを更新しました。 update_oauth2_application_success=OAuth2アプリケーションを更新しました。
oauth2_application_name=アプリケーション名 oauth2_application_name=アプリケーション名
@ -924,7 +921,7 @@ oauth2_application_remove_description=OAuth2アプリケーションを削除す
oauth2_application_locked=設定で有効にされた場合、Forgejoは起動時にいくつかのOAuth2アプリケーションを事前登録します。 想定されていない動作を防ぐため、これらは編集も削除もできません。 詳細についてはOAuth2のドキュメントを参照してください。 oauth2_application_locked=設定で有効にされた場合、Forgejoは起動時にいくつかのOAuth2アプリケーションを事前登録します。 想定されていない動作を防ぐため、これらは編集も削除もできません。 詳細についてはOAuth2のドキュメントを参照してください。
authorized_oauth2_applications=許可済みOAuth2アプリケーション authorized_oauth2_applications=許可済みOAuth2アプリケーション
authorized_oauth2_applications_description=これらのサードパーティ アプリケーションに、あなたのForgejoアカウントへのアクセスを許可しています。 使用しなくなったアプリケーションはアクセス権を取り消すようにしてください。 authorized_oauth2_applications_description=これらのサードパーティ アプリケーションに、あなたのForgejoアカウントへのアクセスを許可しています。 不要になったアプリケーションはアクセス権を取り消すようにしてください。
revoke_key=取り消し revoke_key=取り消し
revoke_oauth2_grant=アクセス権の取り消し revoke_oauth2_grant=アクセス権の取り消し
revoke_oauth2_grant_description=このサードパーティ アプリケーションのアクセス権を取り消し、アプリケーションがあなたのデータへアクセスすることを防ぎます。 続行しますか? revoke_oauth2_grant_description=このサードパーティ アプリケーションのアクセス権を取り消し、アプリケーションがあなたのデータへアクセスすることを防ぎます。 続行しますか?
@ -957,10 +954,10 @@ webauthn_delete_key_desc=セキュリティキーの登録を解除すると、
webauthn_key_loss_warning=セキュリティキーを紛失すると、アカウントへのアクセスを失います。 webauthn_key_loss_warning=セキュリティキーを紛失すると、アカウントへのアクセスを失います。
webauthn_alternative_tip=もうひとつ別の認証方法も設定しておくと良いでしょう。 webauthn_alternative_tip=もうひとつ別の認証方法も設定しておくと良いでしょう。
manage_account_links=連携アカウント manage_account_links=連携アカウントの管理
manage_account_links_desc=これらの外部アカウントがForgejoアカウントと連携されています。 manage_account_links_desc=これらの外部アカウントがForgejoアカウントと連携されています。
account_links_not_available=現在このForgejoアカウントが連携している外部アカウントはありません。 account_links_not_available=現在このForgejoアカウントが連携している外部アカウントはありません。
link_account=アカウントを連携 link_account=アカウントをリンク
remove_account_link=連携アカウントの削除 remove_account_link=連携アカウントの削除
remove_account_link_desc=連携アカウントを削除し、Forgejoアカウントへのアクセス権を取り消します。 続行しますか? remove_account_link_desc=連携アカウントを削除し、Forgejoアカウントへのアクセス権を取り消します。 続行しますか?
remove_account_link_success=連携アカウントを削除しました。 remove_account_link_success=連携アカウントを削除しました。
@ -977,9 +974,9 @@ confirm_delete_account=削除の続行
delete_account_title=ユーザーアカウントの削除 delete_account_title=ユーザーアカウントの削除
delete_account_desc=このユーザーアカウントを恒久的に削除してもよろしいですか? delete_account_desc=このユーザーアカウントを恒久的に削除してもよろしいですか?
email_notifications.enable=メール通知有効 email_notifications.enable=メール通知有効
email_notifications.onmention=メンションのみメール通知 email_notifications.onmention=メンションのみメール通知
email_notifications.disable=メール通知無効 email_notifications.disable=メール通知無効
email_notifications.submit=メール設定を保存 email_notifications.submit=メール設定を保存
email_notifications.andyourown=自分に関する通知も含める email_notifications.andyourown=自分に関する通知も含める
@ -990,7 +987,7 @@ visibility.limited=限定
visibility.limited_tooltip=認証されたユーザーのみに表示されます visibility.limited_tooltip=認証されたユーザーのみに表示されます
visibility.private=プライベート visibility.private=プライベート
visibility.private_tooltip=あなたが参加した組織のメンバーのみに表示されます visibility.private_tooltip=あなたが参加した組織のメンバーのみに表示されます
blocked_users_none = ブロックしているユーザーはいません。 blocked_users_none = あなたはまだ誰もユーザーをブロックしていません。
blocked_users = ブロックしたユーザー blocked_users = ブロックしたユーザー
user_unblock_success = このユーザーをアンブロックするのに成功しました。 user_unblock_success = このユーザーをアンブロックするのに成功しました。
blocked_since = %s からブロック中 blocked_since = %s からブロック中
@ -999,7 +996,7 @@ change_password = パスワードを変更
pronouns = 代名詞 pronouns = 代名詞
pronouns_custom = カスタム pronouns_custom = カスタム
pronouns_unspecified = 未指定 pronouns_unspecified = 未指定
update_hints = ヒントを更新 update_hints = アップデートのヒント
additional_repo_units_hint_description = 利用可能なすべての機能が有効になっていないリポジトリに対して、「機能を追加...」ボタンを表示します。 additional_repo_units_hint_description = 利用可能なすべての機能が有効になっていないリポジトリに対して、「機能を追加...」ボタンを表示します。
update_hints_success = ヒントが更新されました。 update_hints_success = ヒントが更新されました。
hints = ヒント hints = ヒント
@ -1122,7 +1119,7 @@ desc.sha256=SHA256
template.items=テンプレート項目 template.items=テンプレート項目
template.git_content=Gitコンテンツ (デフォルトブランチ) template.git_content=Gitコンテンツ (デフォルトブランチ)
template.git_hooks=Gitフック template.git_hooks=Gitフック
template.git_hooks_tooltip=現在、一度追加したGitフックは変更や削除ができません。 テンプレートリポジトリを信頼している場合のみ、これを選択してください。 template.git_hooks_tooltip=現在のところ、一度追加したGitフックは変更や削除ができません。 テンプレートリポジトリを信頼している場合のみ、これを選択してください。
template.webhooks=Webhook template.webhooks=Webhook
template.topics=トピック template.topics=トピック
template.avatar=アバター template.avatar=アバター
@ -1175,7 +1172,7 @@ migrate.migrating=<b>%s</b> から移行しています ...
migrate.migrating_failed=<b>%s</b> からの移行が失敗しました。 migrate.migrating_failed=<b>%s</b> からの移行が失敗しました。
migrate.migrating_failed.error=移行に失敗しました: %s migrate.migrating_failed.error=移行に失敗しました: %s
migrate.migrating_failed_no_addr=移行に失敗しました。 migrate.migrating_failed_no_addr=移行に失敗しました。
migrate.github.description=github.com やその他の GitHub エンタープライズサーバーからデータを移行します。 migrate.github.description=github.com やその他の GitHub インスタンスからデータを移行します。
migrate.git.description=Git サービスからリポジトリのみを移行します。 migrate.git.description=Git サービスからリポジトリのみを移行します。
migrate.gitlab.description=gitlab.com やその他の GitLab インスタンスからデータを移行します。 migrate.gitlab.description=gitlab.com やその他の GitLab インスタンスからデータを移行します。
migrate.gitea.description=gitea.com やその他の Gitea/Forgejo インスタンスからデータを移行します。 migrate.gitea.description=gitea.com やその他の Gitea/Forgejo インスタンスからデータを移行します。
@ -1283,7 +1280,7 @@ line=行
lines= lines=
from_comment=(コメント) from_comment=(コメント)
editor.add_file=ファイル追加 editor.add_file=ファイル追加
editor.new_file=新規ファイル editor.new_file=新規ファイル
editor.upload_file=ファイルをアップロード editor.upload_file=ファイルをアップロード
editor.edit_file=ファイルを編集 editor.edit_file=ファイルを編集
@ -1298,7 +1295,7 @@ editor.delete_this_file=ファイルを削除
editor.must_have_write_access=このファイルを変更したり変更の提案をするには、書き込み権限が必要です。 editor.must_have_write_access=このファイルを変更したり変更の提案をするには、書き込み権限が必要です。
editor.file_delete_success=ファイル "%s" を削除しました。 editor.file_delete_success=ファイル "%s" を削除しました。
editor.name_your_file=ファイル名を指定… editor.name_your_file=ファイル名を指定…
editor.filename_help=ディレクトリを追加するにはディレクトリ名に続けてスラッシュ("/")を入力します。 ディレクトリを削除するには入力欄の先頭でbackspaceキーを押します。 editor.filename_help=ディレクトリを追加するにはディレクトリ名に続けてスラッシュ('/')を入力します。 ディレクトリを削除するには入力欄の先頭でbackspaceキーを押します。
editor.or=または editor.or=または
editor.cancel_lower=キャンセル editor.cancel_lower=キャンセル
editor.commit_signed_changes=署名した変更をコミット editor.commit_signed_changes=署名した変更をコミット
@ -1338,7 +1335,7 @@ editor.fail_to_update_file=ファイル "%s" を作成または変更できま
editor.fail_to_update_file_summary=エラーメッセージ: editor.fail_to_update_file_summary=エラーメッセージ:
editor.push_rejected_no_message=サーバーがメッセージを出さずに変更を拒否しました。 Git フックを確認してください。 editor.push_rejected_no_message=サーバーがメッセージを出さずに変更を拒否しました。 Git フックを確認してください。
editor.push_rejected=サーバーが変更を拒否しました。 Gitフックを確認してください。 editor.push_rejected=サーバーが変更を拒否しました。 Gitフックを確認してください。
editor.push_rejected_summary=拒否されたメッセージの全文: editor.push_rejected_summary=拒否メッセージ全体:
editor.add_subdir=ディレクトリを追加… editor.add_subdir=ディレクトリを追加…
editor.unable_to_upload_files=`"%s" へファイルをアップロードすることができませんでした: %v` editor.unable_to_upload_files=`"%s" へファイルをアップロードすることができませんでした: %v`
editor.upload_file_is_locked=ファイル "%s" は %s がロックしています。 editor.upload_file_is_locked=ファイル "%s" は %s がロックしています。
@ -2728,7 +2725,7 @@ settings.sourcehut_builds.manifest_path = Build manifestのパス
settings.sourcehut_builds.secrets_helper = ジョブにビルドシークレットへのアクセス権を付与します (SECRETS:RO 権限が必要です) settings.sourcehut_builds.secrets_helper = ジョブにビルドシークレットへのアクセス権を付与します (SECRETS:RO 権限が必要です)
release.hide_archive_links_helper = このリリース用に自動的に生成されたソース コード アーカイブを非表示にします。たとえば、独自のソース コードをアップロードする場合などです。 release.hide_archive_links_helper = このリリース用に自動的に生成されたソース コード アーカイブを非表示にします。たとえば、独自のソース コードをアップロードする場合などです。
error.broken_git_hook = このリポジトリの Git フックが壊れているようです。<a target="_blank" rel="noreferrer" href="%s">ドキュメント</a>に従って修正し、コミットをいくつかプッシュしてステータスを更新してください。 error.broken_git_hook = このリポジトリの Git フックが壊れているようです。<a target="_blank" rel="noreferrer" href="%s">ドキュメント</a>に従って修正し、コミットをいくつかプッシュしてステータスを更新してください。
editor.commit_id_not_matching = 編集中にファイルが変更されました。新しいブランチにコミットしてからマージしてください。 editor.commit_id_not_matching = このコミットIDはあなたが編集していたものと一致しません。新しいブランチへコミットし、そしてマージしてください。
issues.num_participants_one = %d 人の参加者 issues.num_participants_one = %d 人の参加者
commits.search_branch = このブランチ commits.search_branch = このブランチ
size_format = %[1]s: %[2]s, %[3]s: %[4]s size_format = %[1]s: %[2]s, %[3]s: %[4]s
@ -2743,10 +2740,6 @@ settings.transfer.button = 所有権を移送する
settings.transfer.modal.title = 所有権を移送 settings.transfer.modal.title = 所有権を移送
wiki.search = Wikiを検索 wiki.search = Wikiを検索
wiki.no_search_results = 結果がありませんでした wiki.no_search_results = 結果がありませんでした
form.string_too_long = 指定された文字列は %d 文字より長いです。
project = プロジェクト
subscribe.issue.guest.tooltip = このイシューを購読するにはサインインしてください。
subscribe.pull.guest.tooltip = このプルリクエストを購読するにはサインインしてください。
[graphs] [graphs]
component_loading = %s の読み込み中... component_loading = %s の読み込み中...

View file

@ -156,14 +156,12 @@ artifacts = Artifacts
filter.public = 공개 filter.public = 공개
filter.private = 비공개 filter.private = 비공개
filter.not_template = 템플릿이 아님 filter.not_template = 템플릿이 아님
view = 보기
never = 안함
[aria] [aria]
navbar = 비게이션 바 navbar = 비게이션 바
footer.links = 링크 footer.links = 링크
footer = 꼬릿말 footer = 꼬릿말
footer.software = 소프트웨어에 대하여 footer.software = 소프트웨어에 대하여
[heatmap] [heatmap]
number_of_contributions_in_the_last_12_months = 지난 12달간 %s 명의 기여자 number_of_contributions_in_the_last_12_months = 지난 12달간 %s 명의 기여자
@ -175,11 +173,6 @@ less = 적은
more = 많은 more = 많은
[editor] [editor]
buttons.italic.tooltip = 기울어진 텍스트 추가
buttons.heading.tooltip = 헤딩 추가
buttons.bold.tooltip = 두꺼운 텍스트 추가
buttons.code.tooltip = 코드 추가
buttons.link.tooltip = 링크 추가
[filter] [filter]
@ -440,11 +433,6 @@ auth_failed=인증 실패: %v
target_branch_not_exist=대상 브랜치가 존재하지 않습니다. target_branch_not_exist=대상 브랜치가 존재하지 않습니다.
url_error = `"%s"는 유효한 URL이 아닙니다.`
include_error = `"%s"을/를 포함해야 합니다.`
regex_pattern_error = `regex 패턴이 잘못되었습니다: %s`
username_error = `영문("a-z", "A-Z"), 숫자("0-9"), 대시("-"), 밑줄("_"), 점(".")만 포함할 수 있습니다. 영문 혹은 숫자가 아닌 문자로 시작하거나 끝날 수 없으며 연속된 영문 혹은 숫자가 아닌 문자도 금지됩니다.`
glob_pattern_error = `glob 패턴이 잘못되었습니다: %s`
[user] [user]
@ -636,7 +624,6 @@ email_notifications.disable=이메일 알림 끄기
visibility.private=비공개 visibility.private=비공개
change_password = 비밀번호 변경 change_password = 비밀번호 변경
email_desc = 당신의 대표 이메일 주소는 알림, 비밀번호 재설정과 웹에서의 Git 작동에 사용되며 가려지지 않습니다. email_desc = 당신의 대표 이메일 주소는 알림, 비밀번호 재설정과 웹에서의 Git 작동에 사용되며 가려지지 않습니다.
comment_type_group_dependency = 전제조건
[repo] [repo]
owner=소유자 owner=소유자
@ -670,7 +657,7 @@ mirror_interval_invalid=미러 간격이 올바르지 않습니다.
mirror_address=URL로 부터 클론 mirror_address=URL로 부터 클론
mirror_last_synced=마지막 동기화 mirror_last_synced=마지막 동기화
watchers=이 저장소를 주시하고 있는 사람들 watchers=이 저장소를 주시하고 있는 사람들
stargazers=이 저장소를 좋아하는 사람들 stargazers=별을 준 사람들
forks=포크 forks=포크
reactions_more=그리고 %d 더 reactions_more=그리고 %d 더
language_other=기타 language_other=기타
@ -855,7 +842,7 @@ issues.open_title=오픈
issues.closed_title=닫힘 issues.closed_title=닫힘
issues.draft_title=초안 issues.draft_title=초안
issues.num_comments=%d개의 코멘트 issues.num_comments=%d개의 코멘트
issues.commented_at=`코멘트, <a href="#%s">%s</a>` issues.commented_at=`코멘트, <a href="#%s">%s</a>`
issues.delete_comment_confirm=이 댓글을 정말 삭제하시겠습니까? issues.delete_comment_confirm=이 댓글을 정말 삭제하시겠습니까?
issues.context.edit=수정하기 issues.context.edit=수정하기
issues.context.delete=삭제 issues.context.delete=삭제
@ -883,7 +870,7 @@ issues.label_deletion_desc=라벨을 삭제하면 모든 이슈로부터도 삭
issues.label_deletion_success=라벨이 삭제되었습니다. issues.label_deletion_success=라벨이 삭제되었습니다.
issues.label.filter_sort.alphabetically=알파벳순 issues.label.filter_sort.alphabetically=알파벳순
issues.label.filter_sort.reverse_alphabetically=이름 역순으로 정렬 issues.label.filter_sort.reverse_alphabetically=이름 역순으로 정렬
issues.num_participants_few=자 %d명 issues.num_participants_few=자 %d명
issues.attachment.open_tab=`클릭하여 "%s" 새탭으로 보기` issues.attachment.open_tab=`클릭하여 "%s" 새탭으로 보기`
issues.attachment.download=' "%s"를 다운로드 하려면 클릭 하십시오 ' issues.attachment.download=' "%s"를 다운로드 하려면 클릭 하십시오 '
issues.subscribe=구독하기 issues.subscribe=구독하기
@ -891,8 +878,8 @@ issues.unsubscribe=구독 취소
issues.delete=삭제 issues.delete=삭제
issues.tracker=타임 트래커 issues.tracker=타임 트래커
issues.start_tracking=타임 트래킹 시작 issues.start_tracking=타임 트래킹 시작
issues.start_tracking_history=`님이 %s 작업 시작` issues.start_tracking_history=`%s 작업 시작`
issues.stop_tracking_history=`님이 %s 작업 중단` issues.stop_tracking_history=`작업 중단 %s`
issues.add_time=수동으로 시간 입력 issues.add_time=수동으로 시간 입력
issues.add_time_short=시간 입력 issues.add_time_short=시간 입력
issues.add_time_cancel=취소 issues.add_time_cancel=취소
@ -915,21 +902,21 @@ issues.due_date_added=마감일 %s 를 추가 %s
issues.due_date_remove=%s %s 마감일이 삭제됨 issues.due_date_remove=%s %s 마감일이 삭제됨
issues.due_date_overdue="기한 초과" issues.due_date_overdue="기한 초과"
issues.due_date_invalid=기한이 올바르지 않거나 범위를 벗어났습니다. "yyyy-mm-dd"형식을 사용해주십시오. issues.due_date_invalid=기한이 올바르지 않거나 범위를 벗어났습니다. "yyyy-mm-dd"형식을 사용해주십시오.
issues.dependency.title=전제조건 issues.dependency.title=의존성
issues.dependency.add=전제조건 추가… issues.dependency.add=의존성 추가…
issues.dependency.cancel=취소 issues.dependency.cancel=취소
issues.dependency.remove=제거 issues.dependency.remove=제거
issues.dependency.remove_info=전제조건 제거 issues.dependency.remove_info=의존성 제거
issues.dependency.blocks_short=차단 issues.dependency.blocks_short=차단
issues.dependency.blocked_by_short=의존성 issues.dependency.blocked_by_short=의존성
issues.dependency.remove_header=전제조건 제거 issues.dependency.remove_header=의존성 제거
issues.dependency.issue_remove_text=이슈로부터 전제조건을 제거하게 됩니다. 계속하시겠습니까? issues.dependency.issue_remove_text=이슈로부터 의존성을 제거하게 됩니다. 계속하시겠습니까?
issues.dependency.pr_remove_text=풀 리퀘스트로부터 전제조건을 제거하게 됩니다. 계속하시겠습니까? issues.dependency.pr_remove_text=풀 리퀘스트로부터 의존성을 제거하게 됩니다. 계속하시겠습니까?
issues.dependency.add_error_same_issue=자기자신을 전제하는 이슈는 만들 수 없습니다. issues.dependency.add_error_same_issue=자기자신에 종속되는 이슈는 만들 수 없습니다.
issues.dependency.add_error_dep_issue_not_exist=전제된 이슈가 없습니다. issues.dependency.add_error_dep_issue_not_exist=종속된 이슈가 없습니다.
issues.dependency.add_error_dep_not_exist=전제조건이 존재하지 않습니다. issues.dependency.add_error_dep_not_exist=의존성이 존재하지 않습니다.
issues.dependency.add_error_dep_exists=전제조건이 이미 존재합니다. issues.dependency.add_error_dep_exists=의존성이 이미 존재합니다.
issues.dependency.add_error_dep_not_same_repo=두 이슈는 같은 저장소 안에 있어야 합니다. issues.dependency.add_error_dep_not_same_repo=두 이슈는 같은 레포지토리 안에 있어야 합니다.
issues.review.self.approval=자신의 풀 리퀘스트를 승인할 수 없습니다. issues.review.self.approval=자신의 풀 리퀘스트를 승인할 수 없습니다.
issues.review.self.rejection=자신의 풀 리퀘스트에 대한 변경을 요청할 수 없습니다. issues.review.self.rejection=자신의 풀 리퀘스트에 대한 변경을 요청할 수 없습니다.
issues.review.approve="이 변경사항을 승인하였습니다. %s" issues.review.approve="이 변경사항을 승인하였습니다. %s"
@ -1304,23 +1291,6 @@ issues.filter_milestone_closed = 닫힌 마일스톤
issues.opened_by_fake = %[2]s님이 %[1]s에 열음 issues.opened_by_fake = %[2]s님이 %[1]s에 열음
issues.filter_project_none = 프로젝트 없음 issues.filter_project_none = 프로젝트 없음
issues.new.no_projects = 프로젝트 없음 issues.new.no_projects = 프로젝트 없음
issues.dependency.pr_close_blocks = 이 풀 리퀘스트는 다음의 이슈를 닫는것을 제한함
issues.dependency.setting = 이슈와 풀 리퀘스트에서 전제조건을 활성화
issues.dependency.issue_no_dependencies = 전제조건이 설정되지 않았습니다.
issues.dependency.pr_closing_blockedby = 이 풀 리퀘스트를 닫는것이 다음의 이슈에 의해 제한됨
issues.dependency.issue_closing_blockedby = 이 이슈를 닫는것이 다음의 이슈에 의해 제한됨
issues.dependency.issue_close_blocked = 이 이슈를 닫으려면 먼저 이 이슈를 제한하는 모든 이슈를 닫아야 합니다.
issues.num_participants_one = 참가자 %d명
issues.dependency.no_permission_n = %d개의 전제조건을 읽을 권한이 없음
issues.dependency.issue_close_blocks = 이 이슈는 다음의 이슈를 닫는것을 제한함
issues.dependency.add_error_cannot_create_circular = 서로를 전제하는 이슈를 만들 수 없습니다.
issues.dependency.pr_no_dependencies = 전제조건이 설정되지 않았습니다.
issues.dependency.added_dependency = `님이 %s 새로운 전제조건 추가`
issues.dependency.issue_batch_close_blocked = 이슈 #%d에 아직 열려 있는 전제조건이 있어 선택한 이슈를 일괄적으로 종료할 수 없음
issues.dependency.no_permission_1 = %d개의 전제조건을 읽을 권한이 없음
issues.dependency.no_permission.can_remove = 이 전제조건을 읽을 권한이 없지만 지울 수 있음
issues.dependency.removed_dependency = `님이 %s 전제조건 삭제`
issues.dependency.pr_close_blocked = 병합하기 전에 이 풀 리퀘스트을 제한하는 모든 이슈를 종료해야 합니다.
@ -1750,10 +1720,6 @@ alpine.repository.branches=브랜치
alpine.repository.repositories=저장소 alpine.repository.repositories=저장소
conan.details.repository=저장소 conan.details.repository=저장소
owner.settings.cleanuprules.enabled=활성화됨 owner.settings.cleanuprules.enabled=활성화됨
nuget.dependency.framework = 타겟 프레임워크
maven.download = 종속성을 다운로드하려면 명령줄을 통해 실행하세요:
dependency.id = ID
dependency.version = 버전
[secrets] [secrets]
@ -1786,18 +1752,4 @@ code_search_by_git_grep = 현재 코드 검색 결과는 "git grep"에 의해
branch_kind = 브랜치 검색... branch_kind = 브랜치 검색...
keyword_search_unavailable = 지금은 키워드로 검색이 지원되지 않습니다. 사이트 관리자에게 문의하십시오. keyword_search_unavailable = 지금은 키워드로 검색이 지원되지 않습니다. 사이트 관리자에게 문의하십시오.
commit_kind = 커밋 검색... commit_kind = 커밋 검색...
no_results = 일치하는 결과를 찾을 수 없습니다. no_results = 일치하는 결과를 찾을 수 없습니다.
search = 검색...
type_tooltip = 검색 타입
fuzzy_tooltip = 검색어와 밀접하게 일치하는 결과도 포함
repo_kind = 저장소 검색...
user_kind = 사용자 검색...
org_kind = 조직 검색...
team_kind = 팀 검색...
code_kind = 코드 검색...
code_search_unavailable = 코드 검색은 현재 허용되지 않았습니다. 사이트 관리자와 연락하세요.
package_kind = 패키지 검색...
project_kind = 프로젝트 검색...
exact_tooltip = 검색어와 정확하게 일치하는 결과만 포함
issue_kind = 이슈 검색...
pull_kind = 풀 검색...

View file

@ -16,7 +16,7 @@ page=Pagina
template=Sjabloon template=Sjabloon
language=Taal language=Taal
notifications=Meldingen notifications=Meldingen
active_stopwatch=Actieve tijd tracker active_stopwatch=Actieve Tijd Tracker
create_new=Maken… create_new=Maken…
user_profile_and_more=Profiel en instellingen… user_profile_and_more=Profiel en instellingen…
signed_in_as=Aangemeld als signed_in_as=Aangemeld als
@ -103,7 +103,7 @@ error404=De pagina die u probeert te bereiken <strong>bestaat niet</strong> of <
never=Nooit never=Nooit
rss_feed=RSS feed rss_feed=RSS Feed
@ -145,12 +145,12 @@ confirm_delete_artifact = Weet u zeker dat u het artefact "%s" wilt verwijderen?
toggle_menu = Menu schakelen toggle_menu = Menu schakelen
filter.clear = Filter wissen filter.clear = Filter wissen
filter.is_archived = Gearchiveerd filter.is_archived = Gearchiveerd
filter.is_fork = Forks filter.is_fork = Geforkt
filter.not_fork = Niet forks filter.not_fork = Niet geforkt
filter.is_mirror = Mirrors filter.is_mirror = Gespiegeld
filter.not_mirror = Niet mirrors filter.not_mirror = Niet gespiegeld
filter.is_template = Sjabloons filter.is_template = Sjabloon
filter.not_template = Geen sjabloons filter.not_template = Geen sjabloon
filter.public = Publiek filter.public = Publiek
filter.private = Privé filter.private = Privé
filter = Filter filter = Filter
@ -162,7 +162,7 @@ copy_generic = Kopieer naar klembord
[aria] [aria]
navbar = Navigatiebalk navbar = Navigatiebalk
footer = Voettekst footer = Voettekst
footer.software = Over deze software footer.software = Info over software
footer.links = Verwijzingen footer.links = Verwijzingen
[heatmap] [heatmap]
@ -245,7 +245,7 @@ err_admin_name_is_invalid=Gebruikersnaam van beheerder is ongeldig
general_title=Algemene instellingen general_title=Algemene instellingen
app_name=Instantienaam app_name=Instantienaam
app_name_helper=Voer hier de naam van uw instantie in. Dit wordt weergegeven op elke pagina. app_name_helper=U kan de naam van uw bedrijf hier invullen.
repo_path=Repository hoofdpad repo_path=Repository hoofdpad
repo_path_helper=Externe git repositories worden opgeslagen in deze map. repo_path_helper=Externe git repositories worden opgeslagen in deze map.
lfs_path=Git LFS root pad lfs_path=Git LFS root pad
@ -276,9 +276,9 @@ server_service_title=Server en service-instellingen van derden
offline_mode=Lokale modus inschakelen offline_mode=Lokale modus inschakelen
offline_mode.description=Schakel third-party content uit en gebruik alleen lokale middelen. offline_mode.description=Schakel third-party content uit en gebruik alleen lokale middelen.
disable_gravatar=Gravatar uitschakelen disable_gravatar=Gravatar uitschakelen
disable_gravatar.description=Gravatar en derden avatar bronnen uitschakelen. Een standaard avatar zal worden gebruikt, tenzij een gebruiker hun eigen avatar uploadt naar de instantie. disable_gravatar.description=Gravatar en derden avatar bronnen uitschakelen. Een standaard avatar zal worden gebruikt, tenzij een gebruiker een lokale avatar uploadt.
federated_avatar_lookup=Federated avatars toestaan federated_avatar_lookup=Federated avatars toestaan
federated_avatar_lookup.description=Zoek avatars op met Libravatar. federated_avatar_lookup.description=Enable federated avatars lookup to use federated open source service based on libravatar.
disable_registration=Schakel zelf registratie uit disable_registration=Schakel zelf registratie uit
disable_registration.description=Schakel zelfregistratie uit, alleen admins kunnen accounts maken. disable_registration.description=Schakel zelfregistratie uit, alleen admins kunnen accounts maken.
allow_only_external_registration.description=Registratie alleen via externe diensten toestaan allow_only_external_registration.description=Registratie alleen via externe diensten toestaan
@ -328,9 +328,6 @@ require_sign_in_view.description = Beperk de toegang tot de pagina's tot ingelog
enable_update_checker_helper_forgejo = Het zal periodiek controleren op nieuwe Forgejo-versies door een TXT DNS-record op release.forgejo.org te controleren. enable_update_checker_helper_forgejo = Het zal periodiek controleren op nieuwe Forgejo-versies door een TXT DNS-record op release.forgejo.org te controleren.
smtp_from_invalid = Het adres "E-mails versturen als" is ongeldig smtp_from_invalid = Het adres "E-mails versturen als" is ongeldig
config_location_hint = Deze configuratieopties worden opgeslagen in: config_location_hint = Deze configuratieopties worden opgeslagen in:
allow_only_external_registration = Sta alleen registratie toe via externe diensten
app_slogan = Instantie slogan
app_slogan_helper = Voer hier de slogan van uw instantie in. Laat leeg om dit uit te schakelen.
[home] [home]
uname_holder=Gebruikersnaam of e-mailadres uname_holder=Gebruikersnaam of e-mailadres
@ -639,8 +636,6 @@ Description = Beschrijving
FullName = Volledige naam FullName = Volledige naam
To = Branch naam To = Branch naam
Website = Website Website = Website
AccessToken = Toegangstoken
Pronouns = Voornaamwoorden
[user] [user]
@ -676,10 +671,6 @@ form.name_pattern_not_allowed = Het patroon "%s" is niet toegestaan in een gebru
form.name_chars_not_allowed = Gebruikernaam "%s" bevat ongeldige karakters. form.name_chars_not_allowed = Gebruikernaam "%s" bevat ongeldige karakters.
following_one = %d volgers following_one = %d volgers
followers_one = %d volger followers_one = %d volger
followers.title.few = Volgers
following.title.one = Volgend
following.title.few = Volgend
followers.title.one = Volger
[settings] [settings]
@ -1007,7 +998,6 @@ additional_repo_units_hint_description = Toon een "Voeg meer eenheden toe..." kn
pronouns = Persoonlijke voornaamwoord pronouns = Persoonlijke voornaamwoord
pronouns_custom = Aangepast pronouns_custom = Aangepast
pronouns_unspecified = Ongedefinieerd pronouns_unspecified = Ongedefinieerd
language.title = Standaard taal
[repo] [repo]
owner=Eigenaar owner=Eigenaar
@ -2731,25 +2721,6 @@ release.download_count_few = %s downloads
release.system_generated = Deze bijlage wordt automatisch gegenereerd. release.system_generated = Deze bijlage wordt automatisch gegenereerd.
settings.sourcehut_builds.secrets = Geheimen settings.sourcehut_builds.secrets = Geheimen
settings.web_hook_name_sourcehut_builds = SourceHut Builds settings.web_hook_name_sourcehut_builds = SourceHut Builds
form.string_too_long = De opgegeven string is langer dan %d tekens.
project = Projecten
settings.federation_following_repos = URLs van de volgende repositories. Gescheiden door ";", geen witruimte.
settings.federation_settings = Federatie instellingen
settings.federation_apapiurl = Federatie URL van deze repository. Kopiër en plak dit in de federatie instellingen van een andere repository als een URL van de volgende repository.
settings.federation_not_enabled = Federatie is niet ingeschakeld voor deze instantie.
subscribe.issue.guest.tooltip = Log in om dit issue te volgen.
subscribe.pull.guest.tooltip = Log in om dit pull request te volgen.
settings.transfer.modal.title = Eigendom overdragen
settings.transfer.button = Eigendom overdragen
settings.graphql_url = GraphQL URL
release.hide_archive_links = Verberg automatisch gegenereerde archieven
release.hide_archive_links_helper = Verberg automatisch gegenereerde broncode-archieven voor deze release. Als u bijvoorbeeld uw eigen uploadt.
wiki.search = Zoek wiki
wiki.no_search_results = Geen resultaten
settings.sourcehut_builds.visibility = Job zichtbaarheid
settings.sourcehut_builds.manifest_path = Bouw manifestpad
n_release_one = %s release
n_release_few = %s releases
@ -2879,7 +2850,6 @@ settings.change_orgname_prompt = Merk op: Het wijzigen van de organisatienaam za
settings.visibility.limited = Beperkt (alleen zichtbaar voor geauthenticeerde gebruikers) settings.visibility.limited = Beperkt (alleen zichtbaar voor geauthenticeerde gebruikers)
teams.add_nonexistent_repo = De repository die u probeert toe te voegen bestaat niet, maak deze eerst aan alstublieft. teams.add_nonexistent_repo = De repository die u probeert toe te voegen bestaat niet, maak deze eerst aan alstublieft.
teams.all_repositories_write_permission_desc = Dit team verleent <strong>Schrijf</strong> permissies tot <strong>alle repositories</strong>: leden kunnen lezen en pushen naar repositories. teams.all_repositories_write_permission_desc = Dit team verleent <strong>Schrijf</strong> permissies tot <strong>alle repositories</strong>: leden kunnen lezen en pushen naar repositories.
open_dashboard = Open dashboard
[admin] [admin]
dashboard=Overzicht dashboard=Overzicht
@ -3421,8 +3391,6 @@ auths.tips.gmail_settings = Gmail instellingen:
config_summary = Samenvatting config_summary = Samenvatting
config.open_with_editor_app_help = De "Openen met" editors voor het kloonmenu. Als deze leeg blijft, wordt de standaardwaarde gebruikt. Uitvouwen om de standaard te zien. config.open_with_editor_app_help = De "Openen met" editors voor het kloonmenu. Als deze leeg blijft, wordt de standaardwaarde gebruikt. Uitvouwen om de standaard te zien.
auths.tip.gitlab_new = Registreer een nieuwe applicatie op https://gitlab.com/-/profile/applications auths.tip.gitlab_new = Registreer een nieuwe applicatie op https://gitlab.com/-/profile/applications
config.app_slogan = Instantie slogan
auths.default_domain_name = Standaarddomeinnaam die voor het e-mailadres wordt gebruikt
[action] [action]
@ -3666,7 +3634,6 @@ versions = Versies
versions.view_all = Alles weergeven versions.view_all = Alles weergeven
filter.type.all = Alle filter.type.all = Alle
owner.settings.cargo.rebuild.no_index = Kan niet herbouwen, er is geen index geïnitialiseerd. owner.settings.cargo.rebuild.no_index = Kan niet herbouwen, er is geen index geïnitialiseerd.
npm.dependencies.bundle = Gebundelde dependencies
[secrets] [secrets]
secrets = Geheimen secrets = Geheimen
@ -3773,7 +3740,6 @@ runners.delete_runner_success = Runner succesvol verwijderd
runs.no_matching_online_runner_helper = Geen overeenkomende online runner met label: %s runs.no_matching_online_runner_helper = Geen overeenkomende online runner met label: %s
runs.workflow = Workflow runs.workflow = Workflow
runs.no_job_without_needs = De workflow moet ten minste één taak zonder afhankelijkheden bevatten. runs.no_job_without_needs = De workflow moet ten minste één taak zonder afhankelijkheden bevatten.
runs.no_job = De workflow moet minimaal één job bevatten
@ -3824,11 +3790,7 @@ type_tooltip = Zoektype
fuzzy_tooltip = Neem resultaten op die ook sterk overeenkomen met de zoekterm fuzzy_tooltip = Neem resultaten op die ook sterk overeenkomen met de zoekterm
code_search_unavailable = Code zoeken is momenteel niet beschikbaar. Neem contact op met de sitebeheerder. code_search_unavailable = Code zoeken is momenteel niet beschikbaar. Neem contact op met de sitebeheerder.
keyword_search_unavailable = Zoeken op trefwoord is momenteel niet beschikbaar. Neem contact op met de beheerder van de site. keyword_search_unavailable = Zoeken op trefwoord is momenteel niet beschikbaar. Neem contact op met de beheerder van de site.
code_search_by_git_grep = Huidige code zoekresultaten worden geleverd door "git grep". Er kunnen betere resultaten zijn als de sitebeheerder code indexer inschakelt. code_search_by_git_grep = Huidige code zoekresultaten worden geleverd door "git grep". Er kunnen betere resultaten zijn als de sitebeheerder Repository Indexer inschakelt.
exact = Exact
exact_tooltip = Bevat alleen resultaten die de exacte zoekterm bevatten
issue_kind = Zoek issues...
pull_kind = Zoek pulls...
[munits.data] [munits.data]
b = B b = B

View file

@ -162,7 +162,7 @@ copy_generic = Copiar para área de transferência
[aria] [aria]
navbar=Barra de navegação navbar=Barra de navegação
footer=Rodapé footer=Rodapé
footer.software=Sobre o software footer.software=Sobre o Software
footer.links=Links footer.links=Links
[heatmap] [heatmap]
@ -211,7 +211,7 @@ platform_desc=Forgejo roda em qualquer sistema em que <a target="_blank" rel="no
lightweight=Leve e rápido lightweight=Leve e rápido
lightweight_desc=Forgejo utiliza poucos recursos e consegue mesmo rodar no barato Raspberry Pi. Economize energia elétrica da sua máquina! lightweight_desc=Forgejo utiliza poucos recursos e consegue mesmo rodar no barato Raspberry Pi. Economize energia elétrica da sua máquina!
license=Código aberto license=Código aberto
license_desc=Está tudo no <a target="_blank" rel="noopener noreferrer" href="https://forgejo.org/download">Forgejo</a>! Contribua e torne este projeto ainda melhor. Não tenha vergonha de contribuir! license_desc=Está tudo no <a target="_blank" rel="noopener noreferrer" href="https://codeberg.org/forgejo/forgejo/">Forgejo</a>! Contribua e torne este projeto ainda melhor. Não tenha vergonha de contribuir!
install_desc = Apenas <a target="_blank" rel="noopener noreferrer" href="https://forgejo.org/download/#installation-from-binary">rode o binário</a> para a sua plataforma, execute-o com <a target="_blank" rel="noopener noreferrer" href="https://forgejo.org/download/#container-image">Docker</a>, ou obtenha-o <a target="_blank" rel="noopener noreferrer" href="https://forgejo.org/download">empacotado</a>. install_desc = Apenas <a target="_blank" rel="noopener noreferrer" href="https://forgejo.org/download/#installation-from-binary">rode o binário</a> para a sua plataforma, execute-o com <a target="_blank" rel="noopener noreferrer" href="https://forgejo.org/download/#container-image">Docker</a>, ou obtenha-o <a target="_blank" rel="noopener noreferrer" href="https://forgejo.org/download">empacotado</a>.
[install] [install]
@ -288,7 +288,7 @@ openid_signin.description=Habilitar o acesso de usuários via OpenID.
openid_signup=Habilitar cadastros via OpenID openid_signup=Habilitar cadastros via OpenID
openid_signup.description=Habilitar o auto-cadastro com base no OpenID. openid_signup.description=Habilitar o auto-cadastro com base no OpenID.
enable_captcha=Habilitar CAPTCHA ao registrar enable_captcha=Habilitar CAPTCHA ao registrar
enable_captcha.description=Impor validação por CAPTCHA para cadastro de usuários. enable_captcha.description=Obrigar validação por CAPTCHA para auto-cadastro de usuários.
require_sign_in_view=Apenas usuários logados podem visualizar páginas require_sign_in_view=Apenas usuários logados podem visualizar páginas
require_sign_in_view.description=Limitar o acesso de página aos usuários autenticados. Os visitantes só verão as páginas de autenticação e cadastro. require_sign_in_view.description=Limitar o acesso de página aos usuários autenticados. Os visitantes só verão as páginas de autenticação e cadastro.
admin_setting.description=Criar uma conta de administrador é opcional. O primeiro usuário cadastrado automaticamente se tornará um administrador. admin_setting.description=Criar uma conta de administrador é opcional. O primeiro usuário cadastrado automaticamente se tornará um administrador.
@ -304,7 +304,7 @@ invalid_db_setting=Configuração de banco de dados está inválida: %v
invalid_db_table=A tabela "%s" do banco de dados é inválida: %v invalid_db_table=A tabela "%s" do banco de dados é inválida: %v
invalid_repo_path=A raiz do repositório está inválida: %v invalid_repo_path=A raiz do repositório está inválida: %v
invalid_app_data_path=O caminho dos dados do aplicativo é inválido: %v invalid_app_data_path=O caminho dos dados do aplicativo é inválido: %v
run_user_not_match=O usuário configurado para executar o Forgejo não corresponde ao usuário atual: %s -> %s run_user_not_match=
internal_token_failed=Falha ao gerar o token interno: %v internal_token_failed=Falha ao gerar o token interno: %v
secret_key_failed=Falha ao gerar a chave secreta: %v secret_key_failed=Falha ao gerar a chave secreta: %v
save_config_failed=Falha ao salvar a configuração: %v save_config_failed=Falha ao salvar a configuração: %v
@ -329,8 +329,6 @@ enable_update_checker_helper_forgejo = Confere periodicamente um registro TXT de
smtp_from_invalid = O endereço "Enviar e-mail como" é inválido smtp_from_invalid = O endereço "Enviar e-mail como" é inválido
config_location_hint = Essas opções de configuração serão salvas em: config_location_hint = Essas opções de configuração serão salvas em:
allow_only_external_registration = Permitir cadastros somente via serviços externos allow_only_external_registration = Permitir cadastros somente via serviços externos
app_slogan = Slogan do servidor
app_slogan_helper = Insira o slogan de seu servidor aqui. Deixe em branco para desabilitar.
[home] [home]
uname_holder=Usuário ou e-mail uname_holder=Usuário ou e-mail
@ -672,11 +670,10 @@ unblock = Desbloquear
block = Bloquear block = Bloquear
block_user.detail_2 = Este usuário não poderá interagir com seus repositórios, questões criadas e comentários. block_user.detail_2 = Este usuário não poderá interagir com seus repositórios, questões criadas e comentários.
follow_blocked_user = Você não pode seguir este usuário, pois você o bloqueou ou foi bloqueado por ele. follow_blocked_user = Você não pode seguir este usuário, pois você o bloqueou ou foi bloqueado por ele.
block_user.detail_3 = Este(a) usuário(a) não poderá adicioná-lo(a) como colaborador(a), nem você poderá adicioná-lo(a) como colaborador(a). block_user.detail_3 = Este usuário não poderá adicionar-lhe como colaborador e você também não poderá adicioná-lo como colaborador.
block_user.detail = Por favor, entenda que se você bloquear este usuário, outras ações serão tomadas. Tais como: block_user.detail = Por favor, entenda que se você bloquear este usuário, outras ações serão tomadas. Tais como:
followers_one = %d seguidor followers_one = %d seguidor
following_one = %d seguindo following_one = %d seguindo
block_user.detail_1 = Você deixará de seguir este usuário.
[settings] [settings]
profile=Perfil profile=Perfil
@ -686,7 +683,7 @@ password=Senha
security=Segurança security=Segurança
avatar=Avatar avatar=Avatar
ssh_gpg_keys=Chaves SSH / GPG ssh_gpg_keys=Chaves SSH / GPG
social=Redes sociais social=Contas sociais
applications=Aplicativos applications=Aplicativos
orgs=Organizações orgs=Organizações
repos=Repositórios repos=Repositórios
@ -931,7 +928,7 @@ revoke_oauth2_grant_success=Acesso revogado com sucesso.
twofa_desc=Autenticação de dois fatores melhora a segurança de sua conta. twofa_desc=Autenticação de dois fatores melhora a segurança de sua conta.
twofa_is_enrolled=Sua conta está atualmente <strong>habilitada</strong> com autenticação de dois fatores. twofa_is_enrolled=Sua conta está atualmente <strong>habilitada</strong> com autenticação de dois fatores.
twofa_not_enrolled=Sua conta não está atualmente inscrita para a autenticação em duas etapas. twofa_not_enrolled=Sua conta não está atualmente inscrita para a autenticação em duas etapas.
twofa_disable=Desabilitar autenticação de dois fatores twofa_disable=Desabilitar a autenticação de dois fatores
twofa_scratch_token_regenerate=Gerar novamente o token de backup twofa_scratch_token_regenerate=Gerar novamente o token de backup
twofa_scratch_token_regenerated=Seu token agora é %s. Guarde-a em um local seguro, pois ela nunca mais será exibido. twofa_scratch_token_regenerated=Seu token agora é %s. Guarde-a em um local seguro, pois ela nunca mais será exibido.
twofa_enroll=Inscrever para a autenticação de dois fatores twofa_enroll=Inscrever para a autenticação de dois fatores
@ -947,16 +944,16 @@ twofa_enrolled=Sua conta foi inscrita na autenticação de dois fatores. Armazen
twofa_failed_get_secret=Falha ao obter o segredo. twofa_failed_get_secret=Falha ao obter o segredo.
webauthn_desc=Chaves de segurança são dispositivos de hardware que contém chaves de criptografia. Elas podem ser usadas para autenticação de dois fatores. A chave de segurança deve suportar o padrão <a rel="noreferrer" target="_blank" href="https://w3c.github.io/webauthn/#webauthn-authenticator">WebAuthnn Authenticator</a>. webauthn_desc=Chaves de segurança são dispositivos de hardware que contém chaves de criptografia. Elas podem ser usadas para autenticação de dois fatores. A chave de segurança deve suportar o padrão <a rel="noreferrer" target="_blank" href="https://w3c.github.io/webauthn/#webauthn-authenticator">WebAuthnn Authenticator</a>.
webauthn_register_key=Adicionar chave webauthn_register_key=Adicionar chave de segurança
webauthn_nickname=Apelido webauthn_nickname=Apelido
webauthn_delete_key=Remover chave webauthn_delete_key=Remover chave de segurança
webauthn_delete_key_desc=Se você remover uma chave de segurança, não será possível utilizá-la para fazer login. Continuar? webauthn_delete_key_desc=Se você remover uma chave de segurança, não poderá mais entrar com ela. Continuar?
manage_account_links=Contas vinculadas manage_account_links=Gerenciar contas vinculadas
manage_account_links_desc=Estas contas externas estão vinculadas a sua conta de Forgejo. manage_account_links_desc=Estas contas externas estão vinculadas a sua conta de Forgejo.
account_links_not_available=Não existem contas externas atualmente vinculadas a esta conta. account_links_not_available=Não existem contas externas atualmente vinculadas a esta conta.
link_account=Vincular conta link_account=Vincular Conta
remove_account_link=Remover conta remove_account_link=Remover conta vinculada
remove_account_link_desc=A exclusão da chave SSH revogará o acesso à sua conta. Continuar? remove_account_link_desc=A exclusão da chave SSH revogará o acesso à sua conta. Continuar?
remove_account_link_success=A conta vinculada foi removida. remove_account_link_success=A conta vinculada foi removida.
@ -966,17 +963,17 @@ orgs_none=Você não é membro de nenhuma organização.
repos_none=Você não é proprietário de nenhum repositório. repos_none=Você não é proprietário de nenhum repositório.
delete_account=Excluir sua conta delete_account=Excluir sua conta
delete_prompt=Esta operação excluirá o seu usuário permanentemente. Esta ação é <strong>IRREVERSÍVEL</strong>. delete_prompt=Esta operação irá apagar permanentemente a sua conta de usuário. Isto <strong>NÃO PODERÁ</strong> ser desfeito.
delete_with_all_comments=Sua conta é mais nova que %s. Para evitar comentários fantasmas, todos os comentários de Issue/PR serão excluídos com ela. delete_with_all_comments=Sua conta é mais nova que %s. Para evitar comentários fantasmas, todos os comentários de Issue/PR serão excluídos com ela.
confirm_delete_account=Confirmar exclusão confirm_delete_account=Confirmar exclusão
delete_account_title=Excluir usuário delete_account_title=Excluir conta de usuário
delete_account_desc=Tem certeza que deseja apagar sua conta de usuário permanentemente? delete_account_desc=Tem certeza que deseja apagar sua conta de usuário permanentemente?
email_notifications.enable=Habilitar notificações por e-mail email_notifications.enable=Habilitar notificações de e-mail
email_notifications.onmention=Somente quando for mencionado(a) email_notifications.onmention=Somente e-mail com menção
email_notifications.disable=Desabilitar notificações por e-mail email_notifications.disable=Desabilitar notificações de e-mail
email_notifications.submit=Atualizar preferências de e-mail email_notifications.submit=Atualizar preferências de e-mail
email_notifications.andyourown=e suas próprias notificações email_notifications.andyourown=E Suas Próprias Notificações
visibility=Visibilidade do usuário visibility=Visibilidade do usuário
visibility.public=Pública visibility.public=Pública
@ -1033,7 +1030,7 @@ download_zip=Baixar ZIP
download_tar=Baixar TAR.GZ download_tar=Baixar TAR.GZ
download_bundle=Baixar PACOTE download_bundle=Baixar PACOTE
generate_repo=Gerar repositório generate_repo=Gerar repositório
generate_from=Gerar a partir de generate_from=Gerar de
repo_desc=Descrição repo_desc=Descrição
repo_desc_helper=Digite uma breve descrição (opcional) repo_desc_helper=Digite uma breve descrição (opcional)
repo_lang=Linguagem repo_lang=Linguagem
@ -1054,7 +1051,7 @@ trust_model_helper_committer=Committer: Confiar em assinaturas que correspondem
trust_model_helper_collaborator_committer=Colaborador+Committer: Confiar em assinaturas dos colaboradores que correspondem ao committer trust_model_helper_collaborator_committer=Colaborador+Committer: Confiar em assinaturas dos colaboradores que correspondem ao committer
trust_model_helper_default=Padrão: Usar o modelo de confiança padrão para esta instalação trust_model_helper_default=Padrão: Usar o modelo de confiança padrão para esta instalação
create_repo=Criar repositório create_repo=Criar repositório
default_branch=Ramo padrão default_branch=Branch Padrão
default_branch_label=padrão default_branch_label=padrão
default_branch_helper=O branch padrão é o branch base para pull requests e commits de código. default_branch_helper=O branch padrão é o branch base para pull requests e commits de código.
mirror_prune=Varrer mirror_prune=Varrer
@ -1062,7 +1059,7 @@ mirror_prune_desc=Remover referências obsoletas de controle remoto
mirror_interval=Intervalo de espelhamento (unidades válidas são 'h', 'm', ou 's'). O desabilita a sincronização automática. (Intervalo mínimo: %s) mirror_interval=Intervalo de espelhamento (unidades válidas são 'h', 'm', ou 's'). O desabilita a sincronização automática. (Intervalo mínimo: %s)
mirror_interval_invalid=O intervalo do espelhamento não é válido. mirror_interval_invalid=O intervalo do espelhamento não é válido.
mirror_sync_on_commit=Sincronizar quando commits forem enviados mirror_sync_on_commit=Sincronizar quando commits forem enviados
mirror_address=Clonar a partir de URL mirror_address=Clonar de URL
mirror_address_desc=Coloque todas as credenciais necessárias na seção de autorização. mirror_address_desc=Coloque todas as credenciais necessárias na seção de autorização.
mirror_address_url_invalid=O URL fornecido é inválido. Você deve escapar todos os componentes do URL corretamente. mirror_address_url_invalid=O URL fornecido é inválido. Você deve escapar todos os componentes do URL corretamente.
mirror_address_protocol_invalid=O URL fornecido é inválido. Somente locais http(s):// ou git:// podem ser usados para espelhamento. mirror_address_protocol_invalid=O URL fornecido é inválido. Somente locais http(s):// ou git:// podem ser usados para espelhamento.
@ -1173,8 +1170,8 @@ migrate.codebase.description=Migrar dados de codebasehq.com.
migrate.gitbucket.description=Migrar dados de instâncias do GitBucket. migrate.gitbucket.description=Migrar dados de instâncias do GitBucket.
migrate.migrating_git=Migrando dados Git migrate.migrating_git=Migrando dados Git
migrate.migrating_topics=Migrando tópicos migrate.migrating_topics=Migrando tópicos
migrate.migrating_milestones=Migrando marcos migrate.migrating_milestones=Migrando Marcos
migrate.migrating_labels=Migrando rótulos migrate.migrating_labels=Migrando Rótulos
migrate.migrating_releases=Migrando Versões migrate.migrating_releases=Migrando Versões
migrate.migrating_issues=Migrando Issues migrate.migrating_issues=Migrando Issues
migrate.migrating_pulls=Migrando Pull Requests migrate.migrating_pulls=Migrando Pull Requests
@ -1194,10 +1191,10 @@ unstar=Retirar dos favoritos
star=Juntar aos favoritos star=Juntar aos favoritos
fork=Fork fork=Fork
download_archive=Baixar repositório download_archive=Baixar repositório
more_operations=Mais operações more_operations=Mais Operações
no_desc=Nenhuma descrição no_desc=Nenhuma descrição
quick_guide=Guia rápido quick_guide=Guia Rápido
clone_this_repo=Clonar este repositório clone_this_repo=Clonar este repositório
cite_this_repo=Citar este repositório cite_this_repo=Citar este repositório
create_new_repo_command=Criando um novo repositório por linha de comando create_new_repo_command=Criando um novo repositório por linha de comando
@ -1234,8 +1231,8 @@ tagged_this=criou essa tag
file.title=%s em %s file.title=%s em %s
file_raw=Original file_raw=Original
file_history=Histórico file_history=Histórico
file_view_source=Ver código-fonte file_view_source=Exibir código-fonte
file_view_rendered=Ver renderizado file_view_rendered=Ver Renderizado
file_view_raw=Ver original file_view_raw=Ver original
file_permalink=Link permanente file_permalink=Link permanente
file_too_large=O arquivo é muito grande para ser mostrado. file_too_large=O arquivo é muito grande para ser mostrado.
@ -1243,13 +1240,13 @@ invisible_runes_header=`Este arquivo contém caracteres Unicode invisíveis`
invisible_runes_description=`Este arquivo contém caracteres Unicode invisíveis que são indistinguíveis para humanos, mas que podem ser processados de forma diferente por um computador. Se você acha que isso é intencional, pode ignorar esse aviso com segurança. Use o botão Escapar para revelá-los invisible_runes_description=`Este arquivo contém caracteres Unicode invisíveis que são indistinguíveis para humanos, mas que podem ser processados de forma diferente por um computador. Se você acha que isso é intencional, pode ignorar esse aviso com segurança. Use o botão Escapar para revelá-los
ambiguous_runes_header=`Este arquivo contém caracteres Unicode ambíguos` ambiguous_runes_header=`Este arquivo contém caracteres Unicode ambíguos`
ambiguous_runes_description=`Este arquivo contém caracteres Unicode que podem ser confundidos com outros caracteres. Se você acha que isso é intencional, pode ignorar esse aviso com segurança. Use o botão Escapar para revelá-los ambiguous_runes_description=`Este arquivo contém caracteres Unicode que podem ser confundidos com outros caracteres. Se você acha que isso é intencional, pode ignorar esse aviso com segurança. Use o botão Escapar para revelá-los
invisible_runes_line=`Esta linha contém caracteres unicode invisíveis` invisible_runes_line=`Esta linha tem caracteres unicode invisíveis`
ambiguous_runes_line=`Esta linha contém caracteres unicode ambíguos` ambiguous_runes_line=`Esta linha tem caracteres unicode ambíguos`
ambiguous_character=`%[1]c [U+%04[1]X] é confundível com o %[2]c [U+%04[2]X]` ambiguous_character=`%[1]c [U+%04[1]X] é confundível com o %[2]c [U+%04[2]X]`
escape_control_characters=Escapar escape_control_characters=Escapar
unescape_control_characters=Desescapar unescape_control_characters=Desescapar
file_copy_permalink=Copiar link permanente file_copy_permalink=Copiar Link Permanente
view_git_blame=Ver Git Blame view_git_blame=Ver Git Blame
video_not_supported_in_browser=Seu navegador não suporta a tag 'video' do HTML5. video_not_supported_in_browser=Seu navegador não suporta a tag 'video' do HTML5.
audio_not_supported_in_browser=Seu navegador não suporta a tag 'audio' do HTML5. audio_not_supported_in_browser=Seu navegador não suporta a tag 'audio' do HTML5.
@ -1271,11 +1268,11 @@ line=linha
lines=linhas lines=linhas
from_comment=(comentário) from_comment=(comentário)
editor.add_file=Adicionar arquivo editor.add_file=Adicionar Arquivo
editor.new_file=Novo arquivo editor.new_file=Novo arquivo
editor.upload_file=Enviar arquivo editor.upload_file=Enviar arquivo
editor.edit_file=Editar arquivo editor.edit_file=Editar arquivo
editor.preview_changes=Pré-visualizar alterações editor.preview_changes=Visualizar alterações
editor.cannot_edit_lfs_files=Arquivos LFS não podem ser editados na interface web. editor.cannot_edit_lfs_files=Arquivos LFS não podem ser editados na interface web.
editor.cannot_edit_non_text_files=Arquivos binários não podem ser editados na interface web. editor.cannot_edit_non_text_files=Arquivos binários não podem ser editados na interface web.
editor.edit_this_file=Editar arquivo editor.edit_this_file=Editar arquivo
@ -1295,7 +1292,7 @@ editor.add_tmpl=Adicionar "<nome do arquivo>"
editor.add=Adicionar %s editor.add=Adicionar %s
editor.update=Atualizar %s editor.update=Atualizar %s
editor.delete=Excluir %s editor.delete=Excluir %s
editor.patch=Aplicar correção editor.patch=Aplicar Correção
editor.patching=Corrigindo: editor.patching=Corrigindo:
editor.fail_to_apply_patch=`Não foi possível aplicar a correção "%s"` editor.fail_to_apply_patch=`Não foi possível aplicar a correção "%s"`
editor.new_patch=Nova correção editor.new_patch=Nova correção
@ -1345,7 +1342,7 @@ commits.nothing_to_compare=Estes branches são iguais.
commits.search=Pesquisar commits... commits.search=Pesquisar commits...
commits.search.tooltip=Você pode prefixar as palavras-chave com "author:" (autor da mudança), "committer:" (autor do commit), "after:" (depois) ou "before:" (antes). Por exemplo: "revert author:Ana before:2019-01-13".\ commits.search.tooltip=Você pode prefixar as palavras-chave com "author:" (autor da mudança), "committer:" (autor do commit), "after:" (depois) ou "before:" (antes). Por exemplo: "revert author:Ana before:2019-01-13".\
commits.find=Pesquisar commits.find=Pesquisar
commits.search_all=Todos os ramos commits.search_all=Todos os branches
commits.author=Autor commits.author=Autor
commits.message=Mensagem commits.message=Mensagem
commits.date=Data commits.date=Data
@ -1377,17 +1374,17 @@ projects=Projetos
projects.desc=Gerencie issues e PRs nos quadros do projeto. projects.desc=Gerencie issues e PRs nos quadros do projeto.
projects.description=Descrição (opcional) projects.description=Descrição (opcional)
projects.description_placeholder=Descrição projects.description_placeholder=Descrição
projects.create=Criar projeto projects.create=Criar Projeto
projects.title=Título projects.title=Título
projects.new=Novo projeto projects.new=Novo projeto
projects.new_subheader=Coordene, acompanhe e atualize seu trabalho em um só lugar, para que os projetos permaneçam transparentes e dentro do cronograma. projects.new_subheader=Coordene, acompanhe e atualize seu trabalho em um só lugar, para que os projetos permaneçam transparentes e dentro do cronograma.
projects.create_success=Projeto "%s" criado. projects.create_success=Projeto "%s" criado.
projects.deletion=Excluir projeto projects.deletion=Apagar Projeto
projects.deletion_desc=Excluir um projeto o remove de todas as issues relacionadas. Deseja continuar? projects.deletion_desc=Excluir um projeto o remove de todas as issues relacionadas. Deseja continuar?
projects.deletion_success=O projeto foi excluido. projects.deletion_success=O projeto foi excluido.
projects.edit=Editar projeto projects.edit=Editar Projetos
projects.edit_subheader=Projetos organizam issues e acompanham o progresso. projects.edit_subheader=Projetos organizam issues e acompanham o progresso.
projects.modify=Editar projeto projects.modify=Atualizar Projeto
projects.edit_success=Projeto "%s" atualizado. projects.edit_success=Projeto "%s" atualizado.
projects.type.none=Nenhum projects.type.none=Nenhum
projects.type.basic_kanban=Kanban básico projects.type.basic_kanban=Kanban básico
@ -1399,7 +1396,7 @@ projects.column.edit=Editar coluna
projects.column.edit_title=Nome projects.column.edit_title=Nome
projects.column.new_title=Nome projects.column.new_title=Nome
projects.column.new_submit=Criar coluna projects.column.new_submit=Criar coluna
projects.column.new=Nova coluna projects.column.new=Adicionar coluna
projects.column.set_default=Atribuir como padrão projects.column.set_default=Atribuir como padrão
projects.column.set_default_desc=Definir esta coluna como padrão para pull e issues sem categoria projects.column.set_default_desc=Definir esta coluna como padrão para pull e issues sem categoria
projects.column.unset_default=Desatribuir padrão projects.column.unset_default=Desatribuir padrão
@ -1423,12 +1420,12 @@ issues.filter_reviewers=Filtrar Revisor
issues.new=Nova issue issues.new=Nova issue
issues.new.title_empty=Título não pode ser em branco issues.new.title_empty=Título não pode ser em branco
issues.new.labels=Etiquetas issues.new.labels=Etiquetas
issues.new.no_label=Nenhum rótulo issues.new.no_label=Sem etiqueta
issues.new.clear_labels=Limpar etiquetas issues.new.clear_labels=Limpar etiquetas
issues.new.projects=Projetos issues.new.projects=Projetos
issues.new.clear_projects=Limpar projetos issues.new.clear_projects=Limpar projetos
issues.new.no_projects=Sem projeto issues.new.no_projects=Sem projeto
issues.new.open_projects=Projetos abertos issues.new.open_projects=Abrir Projetos
issues.new.closed_projects=Projetos fechados issues.new.closed_projects=Projetos fechados
issues.new.no_items=Nenhum item issues.new.no_items=Nenhum item
issues.new.milestone=Marco issues.new.milestone=Marco
@ -1446,12 +1443,12 @@ issues.choose.blank=Padrão
issues.choose.blank_about=Criar uma issue a partir do modelo padrão. issues.choose.blank_about=Criar uma issue a partir do modelo padrão.
issues.choose.ignore_invalid_templates=Modelos inválidos foram ignorados issues.choose.ignore_invalid_templates=Modelos inválidos foram ignorados
issues.choose.invalid_templates=%v modelo(s) inválido(s) encontrado(s) issues.choose.invalid_templates=%v modelo(s) inválido(s) encontrado(s)
issues.no_ref=Nenhum ramo ou rótulo especificado issues.no_ref=Nenhum branch/tag especificado
issues.create=Criar issue issues.create=Criar issue
issues.new_label=Novo rótulo issues.new_label=Nova etiqueta
issues.new_label_placeholder=Nome da etiqueta issues.new_label_placeholder=Nome da etiqueta
issues.new_label_desc_placeholder=Descrição issues.new_label_desc_placeholder=Descrição
issues.create_label=Criar rótulo issues.create_label=Criar etiqueta
issues.label_templates.title=Carregue um conjunto de etiquetas pré-definidas issues.label_templates.title=Carregue um conjunto de etiquetas pré-definidas
issues.label_templates.info=Ainda não existem etiquetas. Crie uma etiqueta em 'Nova etiqueta' ou use um conjunto de etiquetas predefinida: issues.label_templates.info=Ainda não existem etiquetas. Crie uma etiqueta em 'Nova etiqueta' ou use um conjunto de etiquetas predefinida:
issues.label_templates.helper=Selecione um conjunto de etiquetas issues.label_templates.helper=Selecione um conjunto de etiquetas
@ -1584,7 +1581,7 @@ issues.label_description=Descrição
issues.label_color=Cor issues.label_color=Cor
issues.label_exclusive=Exclusiva issues.label_exclusive=Exclusiva
issues.label_archive=Arquivar issues.label_archive=Arquivar
issues.label_exclusive_desc=Nomeie o rótulo como <code>âmbito/objeto</code> para torná-lo mutuamente exclusivo em relação a outros rótulos do mesmo <code>âmbito/</code>. issues.label_exclusive_desc=Nomeie a etiqueta <code>escopo/item</code> para torná-la mutuamente exclusiva em relação a outras etiquetas do <code>escopo/</code>.
issues.label_exclusive_warning=Quaisquer rótulos com escopo conflitantes serão removidos ao editar os rótulos de uma issue ou pull request. issues.label_exclusive_warning=Quaisquer rótulos com escopo conflitantes serão removidos ao editar os rótulos de uma issue ou pull request.
issues.label_count=%d etiquetas issues.label_count=%d etiquetas
issues.label_open_issues=%d issues abertas issues.label_open_issues=%d issues abertas
@ -1775,7 +1772,7 @@ pulls.merged_title_desc_few=aplicou merge dos %[1]d commits de <code>%[2]s</code
pulls.change_target_branch_at=`mudou o branch de destino de <b>%s</b> para <b>%s</b> %s` pulls.change_target_branch_at=`mudou o branch de destino de <b>%s</b> para <b>%s</b> %s`
pulls.tab_conversation=Conversação pulls.tab_conversation=Conversação
pulls.tab_commits=Commits pulls.tab_commits=Commits
pulls.tab_files=Arquivos modificados pulls.tab_files=Arquivos alterados
pulls.reopen_to_merge=Por favor reabra este pull request para aplicar o merge. pulls.reopen_to_merge=Por favor reabra este pull request para aplicar o merge.
pulls.cant_reopen_deleted_branch=Este pull request não pode ser reaberto porque o branch foi excluído. pulls.cant_reopen_deleted_branch=Este pull request não pode ser reaberto porque o branch foi excluído.
pulls.merged=Merge aplicado pulls.merged=Merge aplicado
@ -1812,8 +1809,8 @@ pulls.approve_count_1=%d aprovação
pulls.approve_count_n=%d aprovações pulls.approve_count_n=%d aprovações
pulls.reject_count_1=%d pedido de alteração pulls.reject_count_1=%d pedido de alteração
pulls.reject_count_n=%d pedidos de alteração pulls.reject_count_n=%d pedidos de alteração
pulls.waiting_count_1=%d revisão pendente pulls.waiting_count_1=aguardando %d revisão
pulls.waiting_count_n=%d revisões pendentes pulls.waiting_count_n=aguardando %d revisões
pulls.wrong_commit_id=id de commit tem que ser um id de commit no branch de destino pulls.wrong_commit_id=id de commit tem que ser um id de commit no branch de destino
pulls.no_merge_desc=O merge deste pull request não pode ser aplicado porque todas as opções de mesclagem do repositório estão desabilitadas. pulls.no_merge_desc=O merge deste pull request não pode ser aplicado porque todas as opções de mesclagem do repositório estão desabilitadas.
@ -1885,7 +1882,7 @@ milestones.no_due_date=Sem data limite
milestones.open=Reabrir milestones.open=Reabrir
milestones.close=Fechar milestones.close=Fechar
milestones.new_subheader=Os marcos podem ajudá-lo a organizar os problemas e acompanhar seu progresso. milestones.new_subheader=Os marcos podem ajudá-lo a organizar os problemas e acompanhar seu progresso.
milestones.completeness=<strong>%d%%</strong> completo milestones.completeness=%d%% concluído
milestones.create=Criar marco milestones.create=Criar marco
milestones.title=Título milestones.title=Título
milestones.desc=Descrição milestones.desc=Descrição
@ -2153,7 +2150,7 @@ settings.confirm_wiki_delete=Excluir dados da wiki
settings.wiki_deletion_success=Os dados da wiki do repositório foi excluídos. settings.wiki_deletion_success=Os dados da wiki do repositório foi excluídos.
settings.delete=Excluir este repositório settings.delete=Excluir este repositório
settings.delete_desc=A exclusão de um repositório é permanente e não pode ser desfeita. settings.delete_desc=A exclusão de um repositório é permanente e não pode ser desfeita.
settings.delete_notices_1=- <strong>NÃO É POSSÍVEL</strong> desfazer esta ação. settings.delete_notices_1=- Esta operação <strong>NÃO PODERÁ</strong> ser desfeita.
settings.delete_notices_2=- Essa operação excluirá permanentemente o repositório <strong>%s</strong>, incluindo código, issues, comentários, dados da wiki e configurações do colaborador. settings.delete_notices_2=- Essa operação excluirá permanentemente o repositório <strong>%s</strong>, incluindo código, issues, comentários, dados da wiki e configurações do colaborador.
settings.delete_notices_fork_1=- Forks deste repositório se tornarão independentes após a exclusão. settings.delete_notices_fork_1=- Forks deste repositório se tornarão independentes após a exclusão.
settings.deletion_success=O repositório foi excluído. settings.deletion_success=O repositório foi excluído.
@ -2605,7 +2602,7 @@ settings.transfer_abort_success = A transferência de repositório para %s foi c
settings.enter_repo_name = Digite os nomes do dono e do repositório exatamente neste formato: settings.enter_repo_name = Digite os nomes do dono e do repositório exatamente neste formato:
issues.blocked_by_user = Você não pode criar uma questão neste repositório porque você foi bloqueado pelo dono do repositório. issues.blocked_by_user = Você não pode criar uma questão neste repositório porque você foi bloqueado pelo dono do repositório.
settings.new_owner_blocked_doer = Você foi bloqueado pelo novo dono do repositório. settings.new_owner_blocked_doer = Você foi bloqueado pelo novo dono do repositório.
settings.wiki_rename_branch_main_notices_1 = <strong>NÃO É POSSÍVEL</strong> desfazer esta ação. settings.wiki_rename_branch_main_notices_1 = Esta ação <strong>NÃO PODERÁ</strong> ser desfeita.
tree_path_not_found_commit = O caminho %[1]s não existe no commit %[2]s tree_path_not_found_commit = O caminho %[1]s não existe no commit %[2]s
rss.must_be_on_branch = Você precisa estar em uma branch para ter um feed RSS. rss.must_be_on_branch = Você precisa estar em uma branch para ter um feed RSS.
admin.manage_flags = Gerenciar sinalizadores admin.manage_flags = Gerenciar sinalizadores
@ -2614,8 +2611,8 @@ admin.update_flags = Atualizar sinalizadores
admin.flags_replaced = Os sinalizadores do repositório foram substituídos admin.flags_replaced = Os sinalizadores do repositório foram substituídos
all_branches = Todas as branches all_branches = Todas as branches
fork_branch = Branch a ser clonada para o fork fork_branch = Branch a ser clonada para o fork
object_format_helper = O formato utilizado para armazenar os objetos do repositório, sendo SHA1 o mais compatível. Esta ação é <strong>IRREVERSÍVEL</strong>. object_format_helper = O formato utilizado para armazenar os objetos do repositório, sendo SHA1 o mais compatível. Esta opção não poderá ser alterada futuramente.
object_format = Formato dos objetos object_format = Formato de objeto
tree_path_not_found_branch = Caminho %[1]s não existe na branch %[2]s tree_path_not_found_branch = Caminho %[1]s não existe na branch %[2]s
tree_path_not_found_tag = Caminho %[1]s não existe na etiqueta %[2]s tree_path_not_found_tag = Caminho %[1]s não existe na etiqueta %[2]s
commits.view_path = Ver neste ponto do histórico commits.view_path = Ver neste ponto do histórico
@ -2665,42 +2662,6 @@ wiki.search = Pesquisar na wiki
wiki.no_search_results = Nenhum resultado wiki.no_search_results = Nenhum resultado
n_release_one = %s versão n_release_one = %s versão
n_release_few = %s versões n_release_few = %s versões
form.string_too_long = O texto fornecido possui mais que %d caracteres.
branch.branch_name_conflict = O nome do ramo "%s" está em conflito com o ramo "%s" já existente.
settings.graphql_url = URL do GraphQL
settings.add_collaborator_blocked_our = Não foi possível adicionar o(a) colaborador(a), pois o(a) proprietário(a) do repositório bloqueou-os.
settings.confirmation_string = Texto de confirmação
settings.wiki_rename_branch_main = Regularizar o nome do ramo da wiki
project = Projetos
comments.edit.already_changed = Falha ao salvar as alterações ao comentário. Parece que o conteúdo foi alterado por outro usuário. Atualize a página e tente novamente para evitar sobrescrever as alterações feitas pelo outro usuário.
activity.navbar.code_frequency = Frequência de código
settings.protect_status_check_matched = Correspondente
branch.tag_collision = O ramo "%s" não pode ser criado porque já existe uma etiqueta com o mesmo nome no repositório.
settings.archive.mirrors_unavailable = As réplicas ficarão indisponíveis se o repositório estiver arquivado.
release.download_count_one = %s download
settings.mirror_settings.docs.no_new_mirrors = O seu repositório está replicando alterações de ou para outro repositório. Observe que não é possível criar novas réplicas no momento.
settings.mirror_settings.docs.pull_mirror_instructions = Para configurar uma réplica de outro repositório, consulte:
settings.wiki_rename_branch_main_desc = Renomear o ramo usado internamente pela wiki para "%s". Esta ação é <strong>IRREVERSÍVEL</strong>.
settings.enforce_on_admins = Impor esta regra aos administradores de repositórios
settings.enforce_on_admins_desc = Administradores de repositório não podem burlar esta regra.
subscribe.issue.guest.tooltip = Faça login para receber notificações desta questão
settings.federation_not_enabled = O recurso de federação não está habilitado em seu servidor.
settings.trust_model.committer.desc = Uma assinatura de commit é considerada "confiável" caso corresponda ao autor do commit, caso contrário será definida como "discordante". Isso permite delegar a autoria de commits ao Forgejo, adicionando créditos ao autor original nos campos "Co-authored-by" e "Co-commited-by" no final do commit. A chave padrão do Forgejo deve corresponder à chave de um usuário no banco de dados.
settings.wiki_branch_rename_success = O nome do ramo da wiki do repositório foi regularizado com sucesso.
pulls.nothing_to_compare_have_tag = O ramo/etiqueta escolhidos são iguais.
settings.sourcehut_builds.secrets = Segredos
release.download_count_few = %s downloads
release.hide_archive_links = Ocultar arquivos gerados automaticamente
release.system_generated = Este anexo foi gerado automaticamente.
settings.wiki_branch_rename_failure = Falha ao regularizar o nome do ramo da wiki do repositório.
settings.add_collaborator_blocked_them = Não foi possível adicionar o(a) colaborador(a) porque ele(a) bloqueou o(a) proprietário(a) do repositório.
settings.thread_id = ID da discussão
issues.edit.already_changed = Não foi possível salvar as alterações desta questão porque o conteúdo foi alterado por outro(a) usuário(a). Atualize a página e tente novamente para evitar sobrescrever as alterações.
pulls.edit.already_changed = Não foi possível salvar as alterações deste pedido de integração porque o conteúdo foi alterado por outro(a) usuário(a). Atualize a página e tente novamente para evitar sobrescrever as alterações.
editor.commit_id_not_matching = O arquivo foi alterado durante a edição. Salve as alterações em um novo ramo e realize a mesclagem.
blame.ignore_revs = As revisões em <a href="%s">.git-blame-ignore-revs</a> foram ignoradas. Clique <a href="%s">aqui</a> para retornar à visualização normal.
topic.format_prompt = Os tópicos devem começar com um caracter alfanumérico, podem incluir hífens ("-") e pontos ("."), e podem ter até 35 caracteres. As letras devem ser minúsculas.
settings.rename_branch_failed_protected = Não foi possível renomar o ramo %s porque ele está protegido.
[graphs] [graphs]
@ -2750,7 +2711,7 @@ settings.change_orgname_redirect_prompt=O nome antigo irá redirecionar até que
settings.update_avatar_success=O avatar da organização foi atualizado. settings.update_avatar_success=O avatar da organização foi atualizado.
settings.delete=Excluir organização settings.delete=Excluir organização
settings.delete_account=Excluir esta organização settings.delete_account=Excluir esta organização
settings.delete_prompt=A organização será excluída permanentemente. Esta ação é <strong>IRREVERSÍVEL</strong>! settings.delete_prompt=A organização será excluída permanentemente. Isto <strong>NÃO PODERÁ</strong> ser desfeito!
settings.confirm_delete_account=Confirmar exclusão settings.confirm_delete_account=Confirmar exclusão
settings.delete_org_title=Excluir organização settings.delete_org_title=Excluir organização
settings.delete_org_desc=Essa organização será excluída permanentemente. Continuar? settings.delete_org_desc=Essa organização será excluída permanentemente. Continuar?
@ -2825,10 +2786,6 @@ teams.invite.by=Convidado por %s
teams.invite.description=Por favor, clique no botão abaixo para se juntar à equipe. teams.invite.description=Por favor, clique no botão abaixo para se juntar à equipe.
settings.email = E-mail de contato settings.email = E-mail de contato
teams.invite.title = Você foi convidado para juntar-se à equipe <strong>%s</strong> da organização <strong>%s</strong>. teams.invite.title = Você foi convidado para juntar-se à equipe <strong>%s</strong> da organização <strong>%s</strong>.
open_dashboard = Abrir painel
settings.change_orgname_prompt = Obs.: Alterar o nome de uma organização resultará na alteração do URL dela e disponibilizará o nome antigo para uso.
follow_blocked_user = Não foi possível seguir esta organização porque ela bloqueou-o(a).
form.name_pattern_not_allowed = O padrão "%s" não é permitido no nome de uma organização.
[admin] [admin]
dashboard=Painel dashboard=Painel
@ -3346,18 +3303,6 @@ self_check = Autodiagnóstico
auths.tip.gitea = Registre um novo aplicativo OAuth2. A documentação pode ser encontrada em https://forgejo.org/docs/latest/user/oauth2-provider/ auths.tip.gitea = Registre um novo aplicativo OAuth2. A documentação pode ser encontrada em https://forgejo.org/docs/latest/user/oauth2-provider/
dashboard.sync_tag.started = Sincronização de etiquetas iniciada dashboard.sync_tag.started = Sincronização de etiquetas iniciada
self_check.no_problem_found = Por enquanto não há algum problema. self_check.no_problem_found = Por enquanto não há algum problema.
config_settings = Configurações
config_summary = Resumo
auths.tips.gmail_settings = Configurações do Gmail:
auths.tip.gitlab_new = Registre um novo aplicativo em https://gitlab.com/-/profile/applications
config.app_slogan = Slogan do servidor
auths.default_domain_name = Domínio padrão usado para o endereço de e-mail
dashboard.sync_repo_tags = Sincronizar etiquetas do Git para o banco de dados
config.app_data_path = Caminho dos dados do aplicativo
dashboard.task.cancelled = Tarefa: %[1]s cancelada: %[3]s
dashboard.sync_branch.started = Sincronização de ramos iniciada
dashboard.sync_repo_branches = Sincronizar ramos perdidos do Git para o banco de dados
packages.cleanup.success = Os dados expirados foram limpos com sucesso
[action] [action]
@ -3597,8 +3542,6 @@ owner.settings.chef.keypair=Gerar par de chaves
rpm.repository.architectures = Arquiteturas rpm.repository.architectures = Arquiteturas
rpm.repository = Informações do repositório rpm.repository = Informações do repositório
rpm.repository.multiple_groups = Este pacote está disponível em vários grupos. rpm.repository.multiple_groups = Este pacote está disponível em vários grupos.
npm.dependencies.bundle = Dependências empacotadas
registry.documentation = Para mais informações sobre o registro %s, veja <a target="_blank" rel="noopener noreferrer" href="%s">a documentação</a>.
[secrets] [secrets]
secrets=Segredos secrets=Segredos
@ -3639,7 +3582,7 @@ runners.name=Nome
runners.owner_type=Tipo runners.owner_type=Tipo
runners.description=Descrição runners.description=Descrição
runners.labels=Rótulos runners.labels=Rótulos
runners.last_online=Última vez online runners.last_online=Última Vez Online
runners.runner_title=Runner runners.runner_title=Runner
runners.task_list=Tarefas recentes neste runner runners.task_list=Tarefas recentes neste runner
runners.task_list.no_tasks=Ainda não há nenhuma tarefa. runners.task_list.no_tasks=Ainda não há nenhuma tarefa.
@ -3692,10 +3635,6 @@ variables = Variáveis
variables.id_not_exist = A variável com o ID %d não existe. variables.id_not_exist = A variável com o ID %d não existe.
variables.deletion.failed = Falha ao remover a variável. variables.deletion.failed = Falha ao remover a variável.
variables.creation.failed = Falha ao adicionar a variável. variables.creation.failed = Falha ao adicionar a variável.
runs.no_workflows.documentation = Para mais informações sobre Forgejo Actions, veja <a target="_blank" rel="noopener noreferrer" href="%s">a documentação</a>.
runs.no_workflows.quick_start = Forgejo Actions é uma novidade para você? Veja <a target="_blank" rel="noopener noreferrer" href="%s">o guia rápido</a>.
runs.no_results = Nenhum resultado.
variables.description = As variáveis serão passadas para certas ações e não poderão ser lidas de outra forma.
[projects] [projects]
@ -3719,9 +3658,6 @@ component_loading = Carregando %s...
component_loading_failed = Não foi possível carregar o(a) %s component_loading_failed = Não foi possível carregar o(a) %s
component_loading_info = Pode demorar um pouco… component_loading_info = Pode demorar um pouco…
contributors.what = contribuições contributors.what = contribuições
code_frequency.what = frequência de código
recent_commits.what = commits recentes
component_failed_to_load = Ocorreu um erro inesperado.
[search] [search]
@ -3744,18 +3680,4 @@ code_search_by_git_grep = Os resultados atuais da pesquisa de código são forne
branch_kind = Pesquisar branches… branch_kind = Pesquisar branches…
commit_kind = Pesquisar commits… commit_kind = Pesquisar commits…
runner_kind = Pesquisar runners... runner_kind = Pesquisar runners...
code_search_unavailable = A pesquisa de código não está disponível no momento. Entre em contato com o administrador do site. code_search_unavailable = A pesquisa de código não está disponível no momento. Entre em contato com o administrador do site.
[munits.data]
b = B
kib = KiB
mib = MiB
gib = GiB
tib = TiB
pib = PiB
eib = EiB
[markup]
filepreview.line = Linha %[1]d em %[2]s
filepreview.lines = Linhas %[1]d a %[2]d em %[3]s
filepreview.truncated = Pré-visualização truncada

View file

@ -162,7 +162,7 @@ copy_generic = Copiar para a área de transferência
[aria] [aria]
navbar=Barra de navegação navbar=Barra de navegação
footer=Rodapé footer=Rodapé
footer.software=Sobre este software footer.software=Sobre o Software
footer.links=Ligações footer.links=Ligações
[heatmap] [heatmap]
@ -279,18 +279,18 @@ offline_mode.description=Desabilitar redes de entrega de conteúdos de terceiros
disable_gravatar=Desabilitar o Gravatar disable_gravatar=Desabilitar o Gravatar
disable_gravatar.description=Desabilitar o Gravatar e fontes de avatares de terceiros. Será usado um avatar padrão, a não ser que o utilizador carregue um avatar localmente. disable_gravatar.description=Desabilitar o Gravatar e fontes de avatares de terceiros. Será usado um avatar padrão, a não ser que o utilizador carregue um avatar localmente.
federated_avatar_lookup=Habilitar avatares federados federated_avatar_lookup=Habilitar avatares federados
federated_avatar_lookup.description=Pesquisar avatares usando o Libravatar. federated_avatar_lookup.description=Habilitar pesquisa de avatares federada usando o Libravatar.
disable_registration=Desabilitar a auto-inscrição disable_registration=Desabilitar a auto-inscrição
disable_registration.description=Apenas os administradores da instância poderão criar novas contas de utilizador. É altamente recomendado que o registo seja mantido desabilitado, a não ser que tencione hospedar uma instância pública para toda a gente e esteja disposto a lidar com grandes quantidades de contas falsas (spam). disable_registration.description=Desabilitar a auto-inscrição do utilizador. Somente os administradores poderão criar novas contas de utilizador.
allow_only_external_registration.description=Os utilizadores apenas poderão criar novas contas usando serviços externos que tenham sido configurados. allow_only_external_registration.description=Permitir a inscrição somente por meio de serviços externos
openid_signin=Habilitar início de sessão com OpenID openid_signin=Habilitar início de sessão com OpenID
openid_signin.description=Habilitar o início de sessão do utilizador usando o OpenID. openid_signin.description=Habilitar o início de sessão do utilizador usando o OpenID.
openid_signup=Habilitar a auto-inscrição com OpenID openid_signup=Habilitar a auto-inscrição com OpenID
openid_signup.description=Permitir que os utilizadores criem contas com OpenID se as auto-inscrições estiverem habilitadas. openid_signup.description=Habilitar a utilização do OpenID para fazer auto-inscrições.
enable_captcha=Habilitar CAPTCHA na inscrição enable_captcha=Habilitar CAPTCHA na inscrição
enable_captcha.description=Exigir que os utilizadores passem um CAPTCHA para poderem criar uma conta. enable_captcha.description=Exigir CAPTCHA na auto-inscrição de utilizadores.
require_sign_in_view=Exigir sessão iniciada para visualizar conteúdo da instância require_sign_in_view=Exigir sessão iniciada para visualizar conteúdo da instância
require_sign_in_view.description=Limitar o acesso às páginas aos utilizadores com sessão iniciada. Os visitantes só poderão visualizar a página de autenticação. require_sign_in_view.description=Limitar o acesso às páginas aos utilizadores com sessão iniciada. Os visitantes só poderão visualizar as páginas de início de sessão e de inscrição.
admin_setting.description=A criação de uma conta de administração é opcional. O primeiro utilizador inscrito tornar-se-á automaticamente num administrador. admin_setting.description=A criação de uma conta de administração é opcional. O primeiro utilizador inscrito tornar-se-á automaticamente num administrador.
admin_title=Configurações da conta de administração admin_title=Configurações da conta de administração
admin_name=Nome de utilizador do administrador admin_name=Nome de utilizador do administrador
@ -311,9 +311,9 @@ save_config_failed=Falhou ao guardar a configuração: %v
invalid_admin_setting=A configuração da conta de administrador é inválida: %v invalid_admin_setting=A configuração da conta de administrador é inválida: %v
invalid_log_root_path=A localização dos registos é inválida: %v invalid_log_root_path=A localização dos registos é inválida: %v
default_keep_email_private=Esconder, por norma, os endereços de email default_keep_email_private=Esconder, por norma, os endereços de email
default_keep_email_private.description=Esconder, por norma, os endereços de email de novos utilizadores, para que essa informação não seja divulgada imediatamente após o registo. default_keep_email_private.description=Esconder, por norma, os endereços de email de novos utilizadores.
default_allow_create_organization=Permitir, por norma, a criação de organizações default_allow_create_organization=Permitir, por norma, a criação de organizações
default_allow_create_organization.description=Permitir, por norma, que os novos utilizadores criem organizações. Quando esta opção está desabilitada, um administrador tem de dar permissão para utilizadores possam criar organizações. default_allow_create_organization.description=Permitir, por norma, que os novos utilizadores criem organizações.
default_enable_timetracking=Habilitar, por norma, a contagem do tempo default_enable_timetracking=Habilitar, por norma, a contagem do tempo
default_enable_timetracking.description=Habilitar, por norma, a contagem do tempo nos novos repositórios. default_enable_timetracking.description=Habilitar, por norma, a contagem do tempo nos novos repositórios.
no_reply_address=Domínio dos emails ocultos no_reply_address=Domínio dos emails ocultos
@ -328,9 +328,6 @@ config_location_hint = Estas opções de configuração serão gravadas em:
enable_update_checker_helper_forgejo = Irá verificar periodicamente a existência de novas versões do Forgejo analisando um registo TXT DNS em release.forgejo.org. enable_update_checker_helper_forgejo = Irá verificar periodicamente a existência de novas versões do Forgejo analisando um registo TXT DNS em release.forgejo.org.
smtp_from_invalid = O endereço para "Enviar email como" é inválido smtp_from_invalid = O endereço para "Enviar email como" é inválido
allow_dots_in_usernames = Permitir que os utilizadores usem pontos no nome de utilizador. Não tem efeito sobre as contas existentes. allow_dots_in_usernames = Permitir que os utilizadores usem pontos no nome de utilizador. Não tem efeito sobre as contas existentes.
app_slogan = Lema da instância
app_slogan_helper = Escreva aqui o seu lema da instância. Deixe em branco para desabilitar.
allow_only_external_registration = Permitir registo apenas através de serviços externos
[home] [home]
uname_holder=Nome de utilizador ou endereço de email uname_holder=Nome de utilizador ou endereço de email
@ -1591,7 +1588,7 @@ issues.role.collaborator_helper=Este utilizador foi convidado a colaborar neste
issues.role.first_time_contributor=Contribuidor pela primeira vez issues.role.first_time_contributor=Contribuidor pela primeira vez
issues.role.first_time_contributor_helper=Esta é a primeira contribuição deste utilizador para o repositório. issues.role.first_time_contributor_helper=Esta é a primeira contribuição deste utilizador para o repositório.
issues.role.contributor=Contribuidor issues.role.contributor=Contribuidor
issues.role.contributor_helper=Este utilizador cometeu anteriormente para este repositório. issues.role.contributor_helper=Este utilizador cometeu anteriormente para o repositório.
issues.re_request_review=Voltar a solicitar revisão issues.re_request_review=Voltar a solicitar revisão
issues.is_stale=Houve modificações neste pedido de integração posteriormente a esta revisão issues.is_stale=Houve modificações neste pedido de integração posteriormente a esta revisão
issues.remove_request_review=Remover solicitação de revisão issues.remove_request_review=Remover solicitação de revisão
@ -2492,7 +2489,7 @@ settings.lfs_locks_no_locks=Sem bloqueios
settings.lfs_lock_file_no_exist=O ficheiro bloqueado não existe no ramo principal settings.lfs_lock_file_no_exist=O ficheiro bloqueado não existe no ramo principal
settings.lfs_force_unlock=Forçar desbloqueio settings.lfs_force_unlock=Forçar desbloqueio
settings.lfs_pointers.found=Encontrado(s) %d ponteiro(s) de blob - %d associado(a), %d desassociado(a) (%d ausente do armazenamento) settings.lfs_pointers.found=Encontrado(s) %d ponteiro(s) de blob - %d associado(a), %d desassociado(a) (%d ausente do armazenamento)
settings.lfs_pointers.sha=Hash do blob settings.lfs_pointers.sha=SHA do blob
settings.lfs_pointers.oid=OID settings.lfs_pointers.oid=OID
settings.lfs_pointers.inRepo=No repositório settings.lfs_pointers.inRepo=No repositório
settings.lfs_pointers.exists=Existe no armazenamento settings.lfs_pointers.exists=Existe no armazenamento
@ -2743,19 +2740,6 @@ wiki.no_search_results = Sem resultados
settings.transfer.button = Transferir propriedade settings.transfer.button = Transferir propriedade
settings.transfer.modal.title = Transferir propriedade settings.transfer.modal.title = Transferir propriedade
wiki.search = Pesquisar wiki wiki.search = Pesquisar wiki
form.string_too_long = O texto fornecido é mais comprido do que %d caracteres.
settings.federation_settings = Configurações da federação
settings.federation_apapiurl = URL de federação deste repositório. Copie e cole nas configurações de federação de outro repositório como um URL de um repositório que está a ser seguido.
issues.edit.already_changed = Não foi possível guardar as modificações desta questão. O conteúdo parece ter sido modificado por outro utilizador. Refresque a página e tente editar novamente para evitar sobrescrever as modificações que fizeram
project = Planeamentos
pulls.edit.already_changed = Não foi possível guardar as modificações do pedido de integração. O conteúdo parece ter sido modificado por outro utilizador. Refresque a página e tente editar novamente para evitar sobrescrever as modificações que fizeram
subscribe.issue.guest.tooltip = Inicie sessão para subscrever esta questão.
subscribe.pull.guest.tooltip = Inicie sessão para subscrever este pedido de integração.
comments.edit.already_changed = Não foi possível guardar as modificações do comentário. O conteúdo parece ter sido modificado por outro utilizador. Refresque a página e tente editar novamente para evitar sobrescrever as modificações que fizeram
settings.federation_following_repos = URLs de repositórios que estão a ser seguidos. Separe-os com ";" sem espaços em branco.
settings.federation_not_enabled = A federação não está a habilitada na sua instância.
n_release_one = %s lançamento
n_release_few = %s lançamentos
[graphs] [graphs]
component_loading=A carregar %s... component_loading=A carregar %s...
@ -3434,7 +3418,6 @@ auths.tip.gitlab_new = Registe uma nova aplicação em https://gitlab.com/-/prof
config.open_with_editor_app_help = Os editores da opção "Abrir com" do menu da clonagem. Se for deixado em branco, será usado o valor predefinido. Expanda para ver o que está predefinido. config.open_with_editor_app_help = Os editores da opção "Abrir com" do menu da clonagem. Se for deixado em branco, será usado o valor predefinido. Expanda para ver o que está predefinido.
config.allow_dots_in_usernames = Permitir que os utilizadores usem pontos no seu nome de utilizador. Não altera as contas existentes. config.allow_dots_in_usernames = Permitir que os utilizadores usem pontos no seu nome de utilizador. Não altera as contas existentes.
auths.default_domain_name = Nome de domínio predefinido usado para o endereço de email auths.default_domain_name = Nome de domínio predefinido usado para o endereço de email
config.app_slogan = Lema da instância
[action] [action]
create_repo=criou o repositório <a href="%s">%s</a> create_repo=criou o repositório <a href="%s">%s</a>
@ -3787,7 +3770,6 @@ runs.no_workflows.documentation = Para mais informação sobre o Forgejo Action,
runs.no_workflows.quick_start = Não sabe como começar com o Forgejo Action? Veja o <a target="_blank" rel="noopener noreferrer" href="%s">guia de iniciação rápida</a>. runs.no_workflows.quick_start = Não sabe como começar com o Forgejo Action? Veja o <a target="_blank" rel="noopener noreferrer" href="%s">guia de iniciação rápida</a>.
runs.no_job_without_needs = A sequência de trabalho tem de conter pelo menos um trabalho sem dependências. runs.no_job_without_needs = A sequência de trabalho tem de conter pelo menos um trabalho sem dependências.
runs.workflow = Sequência de trabalho runs.workflow = Sequência de trabalho
runs.no_job = A sequência de trabalho tem de conter pelo menos um trabalho
[projects] [projects]
type-1.display_name=Planeamento individual type-1.display_name=Planeamento individual

View file

@ -86,9 +86,9 @@ rerun=Перезапустить
rerun_all=Перезапустить все задания rerun_all=Перезапустить все задания
save=Сохранить save=Сохранить
add=Добавить add=Добавить
add_all=Включить все add_all=Добавить все
remove=Исключить remove=Удалить
remove_all=Исключить все remove_all=Удалить все
remove_label_str=Удалить элемент «%s» remove_label_str=Удалить элемент «%s»
edit=Изменить edit=Изменить
@ -140,7 +140,7 @@ confirm_delete_selected=Вы точно хотите удалить все вы
name=Название name=Название
value=Значение value=Значение
tracked_time_summary = Сводка отслеженного времени на основе фильтров списка задач tracked_time_summary = Сводка отслеженного времени на основе фильтров списка задач
view = Открыть view = Просмотр
confirm_delete_artifact = Вы точно хотите удалить артефакт «%s»? confirm_delete_artifact = Вы точно хотите удалить артефакт «%s»?
toggle_menu = Показать/скрыть меню toggle_menu = Показать/скрыть меню
filter.not_archived = Не архивированные filter.not_archived = Не архивированные
@ -245,7 +245,7 @@ err_admin_name_is_invalid=Неверное имя администратора
general_title=Основные настройки general_title=Основные настройки
app_name=Название сервера app_name=Название сервера
app_name_helper=Укажите название вашего сервера (Git-хостинга). Оно будет видно на всех страницах. app_name_helper=Здесь вы можете ввести название своей компании.
repo_path=Путь до каталога репозиториев repo_path=Путь до каталога репозиториев
repo_path_helper=Все удалённые Git репозитории будут сохранены в этом каталоге. repo_path_helper=Все удалённые Git репозитории будут сохранены в этом каталоге.
lfs_path=Путь до корневого каталога Git LFS lfs_path=Путь до корневого каталога Git LFS
@ -275,22 +275,22 @@ register_confirm=Требовать подтверждение по эл. поч
mail_notify=Уведомления по эл. почте mail_notify=Уведомления по эл. почте
server_service_title=Настройки сервера и внешних служб server_service_title=Настройки сервера и внешних служб
offline_mode=Локальный режим offline_mode=Локальный режим
offline_mode.description=Отключить сторонние службы доставки контента и передавать все ресурсы из их локальных копий. offline_mode.description=Отключить сторонние сети доставки контента и передавать все ресурсы из их локальных копий.
disable_gravatar=Отключить Gravatar disable_gravatar=Отключить Gravatar
disable_gravatar.description=Отключить Gravatar и прочие сторонние источники аватаров. Если у пользователя нет локально установленного аватара, будет использован аватар по умолчанию. disable_gravatar.description=Отключить Gravatar и сторонние источники аватаров. Если у пользователя нет локально установленного аватара, будет использоваться аватар по умолчанию.
federated_avatar_lookup=Федерированные аватары federated_avatar_lookup=Федерированные аватары
federated_avatar_lookup.description=Искать аватары используя Libravatar. federated_avatar_lookup.description=Искать аватары используя Libravatar.
disable_registration=Отключить самостоятельную регистрацию disable_registration=Отключить самостоятельную регистрацию
disable_registration.description=Только администраторы смогут создавать новые учётные записи пользователей. Отключение саморегистрации крайне рекомендовано, разве что если вы не собираетесь создать публичный сервер для всех и готовы бороться с большим количеством спама. disable_registration.description=Отключить самостоятельную регистрацию. Только администраторы смогут создавать новые учётные записи пользователей.
allow_only_external_registration.description=Пользователи смогут создавать новые учётные записи только через добавленные сторонние службы. allow_only_external_registration.description=Пользователи смогут создавать новые учётные записи только через добавленные сторонние службы.
openid_signin=Вход через OpenID openid_signin=Включить вход через OpenID
openid_signin.description=Разрешить вход в учётные записи через OpenID. openid_signin.description=Включить вход через OpenID.
openid_signup=Саморегистрация через OpenID openid_signup=Включить саморегистрацию через OpenID
openid_signup.description=Разрешить пользователям регистрироваться через OpenID, если включена саморегистрация. openid_signup.description=Включить регистрацию пользователей через OpenID.
enable_captcha=CAPTCHA для регистрации enable_captcha=Включить CAPTCHA при регистрации
enable_captcha.description=Требовать прохождение CAPTCHA для регистрации учётных записей. enable_captcha.description=Запрашивать капчу при регистрации пользователя.
require_sign_in_view=Требовать авторизацию для просмотра содержимого require_sign_in_view=Требовать авторизацию для просмотра содержимого
require_sign_in_view.description=Требовать наличие учётной записи для просмотра содержимого сервера. Посетители увидят лишь страницы входа и регистрации. require_sign_in_view.description=Ограничить доступ к странице только вошедшими пользователями. Посетители увидят лишь страницы входа и регистрации.
admin_setting.description=Создание учётной записи администратора необязательно. Первый зарегистрированный пользователь автоматически становится администратором. admin_setting.description=Создание учётной записи администратора необязательно. Первый зарегистрированный пользователь автоматически становится администратором.
admin_title=Учётная запись администратора admin_title=Учётная запись администратора
admin_name=Логин администратора admin_name=Логин администратора
@ -311,11 +311,11 @@ save_config_failed=Не удалось сохранить конфигураци
invalid_admin_setting=Некорректные настройки учётной записи администратора: %v invalid_admin_setting=Некорректные настройки учётной записи администратора: %v
invalid_log_root_path=Недопустимый путь для логов: %v invalid_log_root_path=Недопустимый путь для логов: %v
default_keep_email_private=Скрывать адреса эл. почты по умолчанию default_keep_email_private=Скрывать адреса эл. почты по умолчанию
default_keep_email_private.description=Скрывать адреса эл. почты новых учётных записей по умолчанию, чтобы они не «утекали» сразу после регистрации. default_keep_email_private.description=Скрывать адреса эл. почты новых учётных записей по умолчанию.
default_allow_create_organization=Разрешить создание организаций по умолчанию default_allow_create_organization=Разрешить создание организаций по умолчанию
default_allow_create_organization.description=Разрешать создание организаций новым пользователям по умолчанию. Если эта опция выключена, администратор будет должен выдавать такое разрешение новым пользователям по отдельности. default_allow_create_organization.description=Разрешить новым учётным записям пользователей создавать организации по умолчанию.
default_enable_timetracking=Включить отслеживание времени по умолчанию default_enable_timetracking=Включить отслеживание времени по умолчанию
default_enable_timetracking.description=Использование отслеживания времени будет разрешено в новых репозиториях по умолчанию. default_enable_timetracking.description=Включить отслеживание времени для новых репозиториев по умолчанию.
no_reply_address=Домен скрытых адресов почты no_reply_address=Домен скрытых адресов почты
no_reply_address_helper=Доменное имя для пользователей со скрытым адресом эл. почты. Например, пользователь «joe» будет зарегистрирован в Git как «joe@noreply.example.org», если скрытый домен эл. почты задан как «noreply.example.org». no_reply_address_helper=Доменное имя для пользователей со скрытым адресом эл. почты. Например, пользователь «joe» будет зарегистрирован в Git как «joe@noreply.example.org», если скрытый домен эл. почты задан как «noreply.example.org».
password_algorithm=Алгоритм хеширования паролей password_algorithm=Алгоритм хеширования паролей
@ -330,7 +330,7 @@ smtp_from_invalid = Адрес для отправки писем некорре
config_location_hint = Эти настройки конфигурации будут сохранены в: config_location_hint = Эти настройки конфигурации будут сохранены в:
allow_only_external_registration = Разрешить регистрацию только через сторонние службы allow_only_external_registration = Разрешить регистрацию только через сторонние службы
app_slogan = Лозунг сервера app_slogan = Лозунг сервера
app_slogan_helper = Укажите лозунг вашего сервера, либо оставьте пустым для отключения. app_slogan_helper = Укажите лозунг вашего Git-хостинга, либо оставьте пустым для отключения.
[home] [home]
uname_holder=Логин или адрес эл. почты uname_holder=Логин или адрес эл. почты
@ -669,22 +669,14 @@ form.name_pattern_not_allowed=Шаблон «%s» не допускается в
form.name_chars_not_allowed=Имя пользователя «%s» содержит недопустимые символы. form.name_chars_not_allowed=Имя пользователя «%s» содержит недопустимые символы.
block = Заблокировать block = Заблокировать
unblock = Разблокировать unblock = Разблокировать
block_user.detail_2 = Этот пользователь не сможет взаимодействовать с вашими репозиториями, а также с задачами и комментариями, которые вы создали. block_user.detail_2 = Этот пользователь не сможет взаимодействовать с вашими репозиториями, задачами и комментариями.
block_user.detail = Учтите, что блокировка этого пользователя приведёт ко следующему: block_user.detail = Учтите, что блокировка этого пользователя повлияет на следующее:
follow_blocked_user = Вы не можете подписаться на этого пользователя, т.к. вы его заблокировали, либо он вас. follow_blocked_user = Вы не можете подписаться на этого пользователя, т.к. вы его заблокировали, либо он вас.
block_user = Заблокировать пользователя block_user = Заблокировать пользователя
block_user.detail_1 = Вы будете отписаны друг от друга и не сможете подписаться друг на друга. block_user.detail_1 = Вы будете отписаны от этого пользователя.
block_user.detail_3 = Вы не сможете добавлять друг друга в качестве соучастников репозиториев. block_user.detail_3 = Вы не сможете добавлять друг друга в качестве соучастников репозиториев.
followers_one = %d подписчик followers_one = %d подписчик
following_one = %d подписка following_one = %d подписка
followers.title.few = Подписчики
following.title.one = Подписка
followers.title.one = Подписчик
following.title.few = Подписки
public_activity.visibility_hint.self_public = Ваша активность видна всем, кроме действий в приватных местах. <a href="%s">Изменить</a>.
public_activity.visibility_hint.self_private = Ваша активность видна только вам и администраторам сервера. <a href="%s">Изменить</a>.
public_activity.visibility_hint.admin_private = Эта активность доступна вам, потому что вы администратор. Этот пользователь желает, чтобы она осталась частной.
public_activity.visibility_hint.admin_public = Эта активность доступна всем, но вы, как администратор, также видите действия в приватных местах.
[settings] [settings]
profile=Профиль profile=Профиль
@ -1321,7 +1313,7 @@ editor.filename_is_a_directory=Имя файла «%s» уже использу
editor.file_editing_no_longer_exists=Редактируемый файл «%s» больше не существует в этом репозитории. editor.file_editing_no_longer_exists=Редактируемый файл «%s» больше не существует в этом репозитории.
editor.file_deleting_no_longer_exists=Удаляемый файл «%s» больше не существует в этом репозитории. editor.file_deleting_no_longer_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.file_already_exists=Файл с именем «%s» уже существует в репозитории.
editor.commit_empty_file_header=Закоммитить пустой файл editor.commit_empty_file_header=Закоммитить пустой файл
editor.commit_empty_file_text=Файл, который вы собираетесь зафиксировать, пуст. Продолжить? editor.commit_empty_file_text=Файл, который вы собираетесь зафиксировать, пуст. Продолжить?
editor.no_changes_to_show=Нет изменений. editor.no_changes_to_show=Нет изменений.
@ -1855,7 +1847,7 @@ pulls.status_checks_warning=Некоторые проверки имеют пр
pulls.status_checks_failure=Некоторые проверки провалились pulls.status_checks_failure=Некоторые проверки провалились
pulls.status_checks_error=Некоторые проверки сообщили об ошибках pulls.status_checks_error=Некоторые проверки сообщили об ошибках
pulls.status_checks_requested=Требуется pulls.status_checks_requested=Требуется
pulls.status_checks_details=Подробности pulls.status_checks_details=Информация
pulls.status_checks_hide_all=Скрыть все проверки pulls.status_checks_hide_all=Скрыть все проверки
pulls.status_checks_show_all=Показать все проверки pulls.status_checks_show_all=Показать все проверки
pulls.update_branch=Обновить ветку слиянием pulls.update_branch=Обновить ветку слиянием
@ -2220,7 +2212,7 @@ settings.githook_edit_desc=Если хук не активен, будет по
settings.githook_name=Название хукa settings.githook_name=Название хукa
settings.githook_content=Содержимое хука settings.githook_content=Содержимое хука
settings.update_githook=Обновить хук settings.update_githook=Обновить хук
settings.add_webhook_desc=Forgejo будет оправлять <code>POST</code>-запросы на указанный URL адрес с информацией о происходящих событиях. Подробности на странице <a target="_blank" rel="noopener noreferrer" href="%s">инструкции по использованию веб-хуков</a>. settings.add_webhook_desc=Forgejo будет оправлять <code>POST</code> запросы на указанный URL адрес, с информацией о происходящих событиях. Подробности на странице <a target="_blank" rel="noopener noreferrer" href="%s">инструкции по использованию веб-хуков</a>.
settings.payload_url=URL обработчика settings.payload_url=URL обработчика
settings.http_method=HTTP-метод settings.http_method=HTTP-метод
settings.content_type=Тип содержимого POST settings.content_type=Тип содержимого POST
@ -2260,7 +2252,7 @@ settings.event_issue_milestone=Добавление задач в этапы
settings.event_issue_milestone_desc=Этап или этап выполнения задания. settings.event_issue_milestone_desc=Этап или этап выполнения задания.
settings.event_issue_comment=Комментарии в задаче settings.event_issue_comment=Комментарии в задаче
settings.event_issue_comment_desc=Комментарий создан, изменён или удалён. settings.event_issue_comment_desc=Комментарий создан, изменён или удалён.
settings.event_header_pull_request=События запросов слияний settings.event_header_pull_request=События запроса на слияние
settings.event_pull_request=Запрос на слияние settings.event_pull_request=Запрос на слияние
settings.event_pull_request_desc=Запрос на слияние открыт, закрыт, переоткрыт или отредактирован. settings.event_pull_request_desc=Запрос на слияние открыт, закрыт, переоткрыт или отредактирован.
settings.event_pull_request_assign=Запроса на слияние назначен settings.event_pull_request_assign=Запроса на слияние назначен
@ -2765,8 +2757,6 @@ settings.federation_apapiurl = Федеративная ссылка на это
settings.federation_following_repos = Ссылки следуемых репозиториев. Разделены с «;», без пробелов. settings.federation_following_repos = Ссылки следуемых репозиториев. Разделены с «;», без пробелов.
n_release_one = %s выпуск n_release_one = %s выпуск
n_release_few = %s выпусков n_release_few = %s выпусков
subscribe.issue.guest.tooltip = Войдите, чтобы подписаться на эту задачу.
subscribe.pull.guest.tooltip = Войдите, чтобы подписаться на это слияние.
[graphs] [graphs]
@ -2842,7 +2832,7 @@ members.leave.detail=Покинуть %s?
members.invite_desc=Добавить нового участника в %s: members.invite_desc=Добавить нового участника в %s:
members.invite_now=Пригласить members.invite_now=Пригласить
teams.join=Присоединиться teams.join=Объединить
teams.leave=Выйти teams.leave=Выйти
teams.leave.detail=Покинуть %s? teams.leave.detail=Покинуть %s?
teams.can_create_org_repo=Создать репозитории teams.can_create_org_repo=Создать репозитории
@ -3271,7 +3261,7 @@ config.register_email_confirm=Требовать подтверждение по
config.disable_register=Саморегистрация отключена config.disable_register=Саморегистрация отключена
config.allow_only_internal_registration=Разрешить регистрацию только напрямую через Forgejo config.allow_only_internal_registration=Разрешить регистрацию только напрямую через Forgejo
config.allow_only_external_registration=Регистрация только через сторонние службы config.allow_only_external_registration=Регистрация только через сторонние службы
config.enable_openid_signup=Саморегистрация через OpenID config.enable_openid_signup=Cаморегистрация через OpenID
config.enable_openid_signin=Вход через OpenID config.enable_openid_signin=Вход через OpenID
config.show_registration_button=Кнопка регистрации config.show_registration_button=Кнопка регистрации
config.require_sign_in_view=Для просмотра необходима авторизация config.require_sign_in_view=Для просмотра необходима авторизация
@ -3557,7 +3547,7 @@ about=Об этом пакете
requirements=Требования requirements=Требования
dependencies=Зависимости dependencies=Зависимости
keywords=Ключевые слова keywords=Ключевые слова
details=Сведения details=Подробнее
details.author=Автор details.author=Автор
details.project_site=Сайт проекта details.project_site=Сайт проекта
details.repository_site=Сайт репозитория details.repository_site=Сайт репозитория
@ -3851,10 +3841,6 @@ match_tooltip = Включать только результаты, точно
code_search_unavailable = Поиск по коду сейчас недоступен. Уточните подробности у администратора. code_search_unavailable = Поиск по коду сейчас недоступен. Уточните подробности у администратора.
runner_kind = Поиск исполнителей... runner_kind = Поиск исполнителей...
code_search_by_git_grep = Эти результаты получены через «git grep». Результатов может быть больше, если администратор сервера включит индексатор кода. code_search_by_git_grep = Эти результаты получены через «git grep». Результатов может быть больше, если администратор сервера включит индексатор кода.
exact = Точный
exact_tooltip = Включать только результаты, точно соответствующие запросу
issue_kind = Поиск задач...
pull_kind = Поиск слияний...
[markup] [markup]

View file

@ -20,7 +20,7 @@ notifications=通知
active_stopwatch=活动时间跟踪器 active_stopwatch=活动时间跟踪器
tracked_time_summary=基于问题列表过滤器的跟踪时间概要 tracked_time_summary=基于问题列表过滤器的跟踪时间概要
create_new=创建… create_new=创建…
user_profile_and_more=个人信息和设置… user_profile_and_more=个人信息和配置
signed_in_as=已登录用户 signed_in_as=已登录用户
enable_javascript=此网站需要 JavaScript。 enable_javascript=此网站需要 JavaScript。
toc=目录 toc=目录
@ -245,7 +245,7 @@ err_admin_name_is_invalid=管理员用户名无效
general_title=一般设置 general_title=一般设置
app_name=站点名称 app_name=站点名称
app_name_helper=在此输入您的实例名称。它将显示在所有页面上 app_name_helper=您可以在此输入您公司的名称。
repo_path=仓库根目录 repo_path=仓库根目录
repo_path_helper=所有远程 Git 仓库将保存到此目录。 repo_path_helper=所有远程 Git 仓库将保存到此目录。
lfs_path=LFS 根目录 lfs_path=LFS 根目录
@ -275,20 +275,20 @@ register_confirm=需要发电子邮件确认注册
mail_notify=启用邮件通知提醒 mail_notify=启用邮件通知提醒
server_service_title=服务器和第三方服务设置 server_service_title=服务器和第三方服务设置
offline_mode=启用本地模式 offline_mode=启用本地模式
offline_mode.description=禁用第三方 CDN 并在本地提供所有资源。 offline_mode.description=禁用第三方 CDN 并在本地服务所有资源。
disable_gravatar=禁用 Gravatar 头像 disable_gravatar=禁用 Gravatar 头像
disable_gravatar.description=禁用 Gravatar 和第三方头像源。除非用户在实例上传头像, 否则将使用默认的头像。 disable_gravatar.description=禁用 Gravatar 和第三方头像源。除非用户在本地上传头像, 否则将使用默认的头像。
federated_avatar_lookup=启用 Federated 头像 federated_avatar_lookup=启用 Federated 头像
federated_avatar_lookup.description=使用 Libravatar 查找头像 federated_avatar_lookup.description=启用 Federated Avatars 查找以使用开源的 Libravatar 服务
disable_registration=禁止用户自助注册 disable_registration=禁止用户自助注册
disable_registration.description=只有实例管理员才能创建新的用户帐户。强烈建议保持注册禁用,除非您打算为所有人托管一个公共实例并准备好处理大量垃圾帐户。 disable_registration.description=禁用用户自助注册。只有管理员才能创建新的用户帐户。
allow_only_external_registration.description=仅允许使用已配置的外部服务来创建新帐户。 allow_only_external_registration.description=仅允许通过外部服务注册
openid_signin=启用 OpenID 登录 openid_signin=启用 OpenID 登录
openid_signin.description=允许用户通过 OpenID 登录。 openid_signin.description=启用通过 OpenID 登录
openid_signup=启用 OpenID 自助注册 openid_signup=启用 OpenID 自助注册
openid_signup.description=如果启用了自助注册,则允许用户通过 OpenID 创建帐户 openid_signup.description=启用基于 OpenID 的用户自助注册
enable_captcha=启用注册验证码 enable_captcha=启用注册验证码
enable_captcha.description=要求用户通过 CAPTCHA 验证才能创建帐户。 enable_captcha.description=要求在用户注册时输入预验证码
require_sign_in_view=启用页面访问限制 require_sign_in_view=启用页面访问限制
require_sign_in_view.description=仅允许已登录用户访问页面。访客只能看到注册和登录页。 require_sign_in_view.description=仅允许已登录用户访问页面。访客只能看到注册和登录页。
admin_setting.description=创建管理员帐户是可选的。第一个注册用户将自动成为管理员。 admin_setting.description=创建管理员帐户是可选的。第一个注册用户将自动成为管理员。
@ -311,11 +311,11 @@ save_config_failed=应用配置保存失败:%v
invalid_admin_setting=管理员帐户设置无效: %v invalid_admin_setting=管理员帐户设置无效: %v
invalid_log_root_path=日志路径无效: %v invalid_log_root_path=日志路径无效: %v
default_keep_email_private=默认情况下隐藏电子邮件地址 default_keep_email_private=默认情况下隐藏电子邮件地址
default_keep_email_private.description=默认为新用户启用电子邮件地址隐藏,防止这些信息在注册后立即泄露 default_keep_email_private.description=默认情况下, 隐藏新用户帐户的电子邮件地址
default_allow_create_organization=默认情况下允许创建组织 default_allow_create_organization=默认情况下允许创建组织
default_allow_create_organization.description=默认允许新用户创建组织。禁用此选项时,管理员必须向新用户授予创建组织的权限 default_allow_create_organization.description=默认情况下, 允许新用户帐户创建组织
default_enable_timetracking=默认情况下启用时间跟踪 default_enable_timetracking=默认情况下启用时间跟踪
default_enable_timetracking.description=默认允许新存储库使用时间跟踪功能 default_enable_timetracking.description=默认情况下启用新仓库的时间跟踪
no_reply_address=隐藏电子邮件 no_reply_address=隐藏电子邮件
no_reply_address_helper=用于设置隐藏电子邮件地址的用户使用的电子邮件域名。例如如果用于隐藏电子邮件地址的域名设为“noreply.example.org”则用户名 “joe” 在 Git 中将以 “joe@noreply.example.org” 表示。 no_reply_address_helper=用于设置隐藏电子邮件地址的用户使用的电子邮件域名。例如如果用于隐藏电子邮件地址的域名设为“noreply.example.org”则用户名 “joe” 在 Git 中将以 “joe@noreply.example.org” 表示。
password_algorithm=密码哈希算法 password_algorithm=密码哈希算法
@ -329,11 +329,9 @@ enable_update_checker_helper_forgejo = 通过检查 release.forgejo.org 上的 D
smtp_from_invalid = 电子邮件发件人地址无效 smtp_from_invalid = 电子邮件发件人地址无效
config_location_hint = 这些配置项将被保存在: config_location_hint = 这些配置项将被保存在:
allow_only_external_registration = 仅允许通过外部服务注册 allow_only_external_registration = 仅允许通过外部服务注册
app_slogan = 实例标语
app_slogan_helper = 在此处输入您的实例标语。留空则禁用。
[home] [home]
uname_holder=用户名或电子邮箱 uname_holder=用户名或邮箱
password_holder=密码 password_holder=密码
switch_dashboard_context=切换控制面板用户 switch_dashboard_context=切换控制面板用户
my_repos=仓库列表 my_repos=仓库列表
@ -410,7 +408,7 @@ resent_limit_prompt=您请求发送激活邮件过于频繁,请等待 3 分钟
has_unconfirmed_mail=%s 您好,系统检测到您有一封发送至 <b>%s</b> 但未被确认的邮件。如果您未收到激活邮件,或需要重新发送,请单击下方的按钮。 has_unconfirmed_mail=%s 您好,系统检测到您有一封发送至 <b>%s</b> 但未被确认的邮件。如果您未收到激活邮件,或需要重新发送,请单击下方的按钮。
resend_mail=单击此处重新发送确认邮件 resend_mail=单击此处重新发送确认邮件
email_not_associate=您输入的邮箱地址未被关联到任何帐号! email_not_associate=您输入的邮箱地址未被关联到任何帐号!
send_reset_mail=发送恢复邮件 send_reset_mail=发送账户恢复邮件
reset_password=账户恢复 reset_password=账户恢复
invalid_code=此确认密钥无效或已过期。 invalid_code=此确认密钥无效或已过期。
invalid_code_forgot_password=你的确认码无效或者已过期,点击 <a href="%s">这里</a> 开始新的会话。 invalid_code_forgot_password=你的确认码无效或者已过期,点击 <a href="%s">这里</a> 开始新的会话。
@ -427,8 +425,8 @@ twofa_passcode_incorrect=你的验证码不正确。如果你丢失了你的设
twofa_scratch_token_incorrect=你的验证口令不正确。 twofa_scratch_token_incorrect=你的验证口令不正确。
login_userpass=登录 login_userpass=登录
tab_openid=OpenID tab_openid=OpenID
oauth_signup_tab=注册帐号 oauth_signup_tab=注册帐号
oauth_signup_title=完成新帐户创建 oauth_signup_title=完成新帐户
oauth_signup_submit=完成账号 oauth_signup_submit=完成账号
oauth_signin_tab=绑定到现有帐号 oauth_signin_tab=绑定到现有帐号
oauth_signin_title=登录以授权绑定帐户 oauth_signin_title=登录以授权绑定帐户
@ -687,13 +685,13 @@ password=修改密码
security=安全 security=安全
avatar=头像设置 avatar=头像设置
ssh_gpg_keys=SSH / GPG 密钥 ssh_gpg_keys=SSH / GPG 密钥
social=社交帐号 social=社交帐号绑定
applications=应用 applications=应用
orgs=组织 orgs=管理组织
repos=仓库列表 repos=仓库列表
delete=删除帐户 delete=删除帐户
twofa=两步验证 twofa=两步验证
account_link=已绑定帐户 account_link=已绑定帐户
organization=组织 organization=组织
uid=UID uid=UID
webauthn=安全密钥 webauthn=安全密钥
@ -763,14 +761,14 @@ password_change_disabled=非本地帐户不能通过 Forgejo 的 web 界面更
emails=邮箱地址 emails=邮箱地址
manage_emails=管理邮箱地址 manage_emails=管理邮箱地址
manage_themes=默认主题 manage_themes=选择默认主题
manage_openid=OpenID 地址 manage_openid=管理 OpenID 地址
email_desc=您的主要电子邮件地址将用于通知、密码恢复基于网页界面的Git操作(只要它不是设置为隐藏的)。 email_desc=您的主要电子邮件地址将用于通知、密码恢复基于网页界面的Git操作(只要它不是设置为隐藏的)。
theme_desc=这将是您在整个网站上的默认主题。 theme_desc=这将是您在整个网站上的默认主题。
primary=主要 primary=主要
activated=已激活 activated=已激活
requires_activation=需要激活 requires_activation=需要激活
primary_email=设为主要 primary_email=设为主要邮件地址
activate_email=发送激活邮件 activate_email=发送激活邮件
activations_pending=等待激活 activations_pending=等待激活
can_not_add_email_activations_pending=有一个待处理的激活请求,请稍等几分钟后再尝试添加新的电子邮件地址。 can_not_add_email_activations_pending=有一个待处理的激活请求,请稍等几分钟后再尝试添加新的电子邮件地址。
@ -867,7 +865,7 @@ token_state_desc=7 天内使用过该密钥
principal_state_desc=7 天内使用过该规则 principal_state_desc=7 天内使用过该规则
show_openid=在个人信息上显示 show_openid=在个人信息上显示
hide_openid=在个人信息上隐藏 hide_openid=在个人信息上隐藏
ssh_disabled=SSH 禁用 ssh_disabled=SSH 禁用
ssh_signonly=SSH 目前已禁用,因此这些密钥仅用于提交签名验证。 ssh_signonly=SSH 目前已禁用,因此这些密钥仅用于提交签名验证。
ssh_externally_managed=此 SSH 密钥是由外部管理的 ssh_externally_managed=此 SSH 密钥是由外部管理的
manage_social=管理关联社交帐户 manage_social=管理关联社交帐户
@ -875,7 +873,7 @@ social_desc=这些社交账户可以用来登录您的账户。确保您认识
unbind=取消链接 unbind=取消链接
unbind_success=社交账户已成功移除。 unbind_success=社交账户已成功移除。
manage_access_token=访问令牌 manage_access_token=管理访问令牌
generate_new_token=生成新的令牌 generate_new_token=生成新的令牌
tokens_desc=这些令牌拥有通过 Forgejo API 对您的帐户的访问权限。 tokens_desc=这些令牌拥有通过 Forgejo API 对您的帐户的访问权限。
token_name=令牌名称 token_name=令牌名称
@ -957,7 +955,7 @@ webauthn_delete_key_desc=如果删除了安全密钥,则不能再使用它登
webauthn_key_loss_warning=如果您丢失了您的安全密钥,您将无法访问您的帐户。 webauthn_key_loss_warning=如果您丢失了您的安全密钥,您将无法访问您的帐户。
webauthn_alternative_tip=您可能想要配置额外的身份验证方法。 webauthn_alternative_tip=您可能想要配置额外的身份验证方法。
manage_account_links=已绑定的账号 manage_account_links=管理绑定过的账号
manage_account_links_desc=这些外部帐户已经绑定到您的 Forgejo 帐户。 manage_account_links_desc=这些外部帐户已经绑定到您的 Forgejo 帐户。
account_links_not_available=当前没有与您的 Forgejo 帐户绑定的外部帐户。 account_links_not_available=当前没有与您的 Forgejo 帐户绑定的外部帐户。
link_account=链接账户 link_account=链接账户
@ -996,7 +994,7 @@ blocked_since = 自 %s 起被屏蔽
user_unblock_success = 已成功取消对该用户的屏蔽。 user_unblock_success = 已成功取消对该用户的屏蔽。
user_block_success = 已成功屏蔽该用户。 user_block_success = 已成功屏蔽该用户。
change_password = 更改密码 change_password = 更改密码
additional_repo_units_hint = 建议仓库启用更多功能 additional_repo_units_hint = 鼓励仓库启用更多功能
hints = 提示 hints = 提示
update_hints = 更新提示 update_hints = 更新提示
additional_repo_units_hint_description = 在所有存在未启用的功能的仓库内显示一个“选择更多功能…”按钮。 additional_repo_units_hint_description = 在所有存在未启用的功能的仓库内显示一个“选择更多功能…”按钮。
@ -1592,7 +1590,7 @@ issues.role.collaborator_helper=该用户已被邀请在仓库上进行协作。
issues.role.first_time_contributor=首次贡献者 issues.role.first_time_contributor=首次贡献者
issues.role.first_time_contributor_helper=这是该用户对仓库的第一次贡献。 issues.role.first_time_contributor_helper=这是该用户对仓库的第一次贡献。
issues.role.contributor=贡献者 issues.role.contributor=贡献者
issues.role.contributor_helper=该用户之前已提交至该仓库。 issues.role.contributor_helper=该用户之前提交过该仓库。
issues.re_request_review=再次请求审核 issues.re_request_review=再次请求审核
issues.is_stale=此评审之后代码有更新 issues.is_stale=此评审之后代码有更新
issues.remove_request_review=移除审核请求 issues.remove_request_review=移除审核请求
@ -1868,7 +1866,7 @@ pulls.head_out_of_date=合并失败在生成合并时head 已更新。提
pulls.has_merged=失败:合并请求已经被合并,您不能再次合并或更改目标分支。 pulls.has_merged=失败:合并请求已经被合并,您不能再次合并或更改目标分支。
pulls.push_rejected=合并失败:推送被拒绝。请查看此仓库的 Git 钩子。 pulls.push_rejected=合并失败:推送被拒绝。请查看此仓库的 Git 钩子。
pulls.push_rejected_summary=详细拒绝信息 pulls.push_rejected_summary=详细拒绝信息
pulls.push_rejected_no_message=推送失败:此推送被拒绝但未提供其他信息。请检查此仓库的 Git 钩子 pulls.push_rejected_no_message=推送失败:此推送被拒绝但未提供其他信息。请检查此仓库的 Git Hook
pulls.open_unmerged_pull_exists=`您不能执行重新打开操作, 因为已经存在相同的合并请求 (#%d)。` pulls.open_unmerged_pull_exists=`您不能执行重新打开操作, 因为已经存在相同的合并请求 (#%d)。`
pulls.status_checking=一些检测仍在等待运行 pulls.status_checking=一些检测仍在等待运行
pulls.status_checks_success=所有检测均成功 pulls.status_checks_success=所有检测均成功
@ -1999,8 +1997,8 @@ activity.period.quarterly=3个月
activity.period.semiyearly=6 个月 activity.period.semiyearly=6 个月
activity.period.yearly=1年 activity.period.yearly=1年
activity.overview=概览 activity.overview=概览
activity.active_prs_count_1=<strong>%d</strong> 个活跃合并请求 activity.active_prs_count_1=<strong>%d</strong> 合并请求
activity.active_prs_count_n=<strong>%d</strong> 个活跃合并请求 activity.active_prs_count_n=<strong>%d</strong> 项活动的合并请求
activity.merged_prs_count_1=已合并的合并请求 activity.merged_prs_count_1=已合并的合并请求
activity.merged_prs_count_n=已合并的合并请求 activity.merged_prs_count_n=已合并的合并请求
activity.opened_prs_count_1=新合并请求 activity.opened_prs_count_1=新合并请求
@ -2149,12 +2147,12 @@ settings.pulls.default_allow_edits_from_maintainers=默认开启允许维护者
settings.releases_desc=启用版本发布 settings.releases_desc=启用版本发布
settings.packages_desc=启用仓库软件包注册中心 settings.packages_desc=启用仓库软件包注册中心
settings.projects_desc=启用仓库项目 settings.projects_desc=启用仓库项目
settings.actions_desc=使用 Forgejo Actions 启用集成 CI/CD 管道 settings.actions_desc=启用 Actions
settings.admin_settings=管理员设置 settings.admin_settings=管理员设置
settings.admin_enable_health_check=启用仓库健康检查 (git fsck) settings.admin_enable_health_check=启用仓库健康检查 (git fsck)
settings.admin_code_indexer=代码索引器 settings.admin_code_indexer=代码索引器
settings.admin_stats_indexer=代码统计索引器 settings.admin_stats_indexer=代码统计索引器
settings.admin_indexer_commit_sha=上次索引的提交 settings.admin_indexer_commit_sha=上次索引的 SHA
settings.admin_indexer_unindexed=未索引 settings.admin_indexer_unindexed=未索引
settings.reindex_button=添加到重新索引队列 settings.reindex_button=添加到重新索引队列
settings.reindex_requested=已请求重新索引 settings.reindex_requested=已请求重新索引
@ -2412,7 +2410,7 @@ settings.ignore_stale_approvals=忽略过期批准
settings.ignore_stale_approvals_desc=对旧提交(过期审核)的批准将不计入 PR 的批准数。如果过期审查已被驳回,则与此无关。 settings.ignore_stale_approvals_desc=对旧提交(过期审核)的批准将不计入 PR 的批准数。如果过期审查已被驳回,则与此无关。
settings.require_signed_commits=需要签名提交 settings.require_signed_commits=需要签名提交
settings.require_signed_commits_desc=拒绝推送未签名或无法验证的提交到分支 settings.require_signed_commits_desc=拒绝推送未签名或无法验证的提交到分支
settings.protect_branch_name_pattern=受保护的分支名称正则 settings.protect_branch_name_pattern=受保护的分支名称模式
settings.protect_branch_name_pattern_desc=分支保护的名称匹配规则。语法请参阅 <a href="github.com/gobwas/glob">文档</a> 。如main, release/** settings.protect_branch_name_pattern_desc=分支保护的名称匹配规则。语法请参阅 <a href="github.com/gobwas/glob">文档</a> 。如main, release/**
settings.protect_patterns=规则 settings.protect_patterns=规则
settings.protect_protected_file_patterns=受保护的文件模式(使用半角分号“;”分隔): settings.protect_protected_file_patterns=受保护的文件模式(使用半角分号“;”分隔):
@ -2510,10 +2508,10 @@ diff.commit=当前提交
diff.git-notes=Notes diff.git-notes=Notes
diff.data_not_available=比较内容不可用 diff.data_not_available=比较内容不可用
diff.options_button=Diff 选项 diff.options_button=Diff 选项
diff.show_diff_stats=显示统计信息 diff.show_diff_stats=显示统计
diff.download_patch=下载 Patch 文件 diff.download_patch=下载 Patch 文件
diff.download_diff=下载 Diff 文件 diff.download_diff=下载 Diff 文件
diff.show_split_view=分视图 diff.show_split_view=视图
diff.show_unified_view=合并视图 diff.show_unified_view=合并视图
diff.whitespace_button=空白符号 diff.whitespace_button=空白符号
diff.whitespace_show_everything=显示所有更改 diff.whitespace_show_everything=显示所有更改
@ -2544,7 +2542,7 @@ diff.comment.add_single_comment=添加单条评论
diff.comment.add_review_comment=添加评论 diff.comment.add_review_comment=添加评论
diff.comment.start_review=开始评审 diff.comment.start_review=开始评审
diff.comment.reply=回复 diff.comment.reply=回复
diff.review=完成审核 diff.review=评审
diff.review.header=提交评审 diff.review.header=提交评审
diff.review.placeholder=评审意见 diff.review.placeholder=评审意见
diff.review.comment=评论 diff.review.comment=评论
@ -2554,7 +2552,7 @@ diff.review.reject=请求变更
diff.review.self_approve=合并请求作者不能批准自己的合并请求 diff.review.self_approve=合并请求作者不能批准自己的合并请求
diff.committed_by=提交者 diff.committed_by=提交者
diff.protected=受保护的 diff.protected=受保护的
diff.image.side_by_side= diff.image.side_by_side=
diff.image.swipe=滑动 diff.image.swipe=滑动
diff.image.overlay=叠加 diff.image.overlay=叠加
diff.has_escaped=这一行有隐藏的 Unicode 字符 diff.has_escaped=这一行有隐藏的 Unicode 字符
@ -2590,9 +2588,9 @@ release.prerelease_helper=标记此版本不适合生产使用。
release.cancel=取消 release.cancel=取消
release.publish=发布版本 release.publish=发布版本
release.save_draft=保存草稿 release.save_draft=保存草稿
release.edit_release=更新此次发布 release.edit_release=保存此次发布
release.delete_release=删除发布 release.delete_release=删除发布
release.delete_tag=删除标签 release.delete_tag=删除 Git标签
release.deletion=删除发布 release.deletion=删除发布
release.deletion_desc=删除版本发布只会从 Forgejo 中移除。这不会影响 Git 的标签以及您仓库的内容和历史。是否继续? release.deletion_desc=删除版本发布只会从 Forgejo 中移除。这不会影响 Git 的标签以及您仓库的内容和历史。是否继续?
release.deletion_success=Release已被删除。 release.deletion_success=Release已被删除。
@ -2605,14 +2603,14 @@ release.tag_already_exist=此 Git标签 名称已存在
release.downloads=下载附件 release.downloads=下载附件
release.download_count=下载:%s release.download_count=下载:%s
release.add_tag_msg=使用发布的标题和内容作为标签消息。 release.add_tag_msg=使用发布的标题和内容作为标签消息。
release.add_tag=创建标签 release.add_tag=创建标签
release.releases_for=%s 的版本发布 release.releases_for=%s 的版本发布
release.tags_for=%s 的标签 release.tags_for=%s 的标签
branch.name=分支名称 branch.name=分支名称
branch.already_exists=名为 %s 的分支已存在。 branch.already_exists=名为 %s 的分支已存在。
branch.delete_head=刪除 branch.delete_head=刪除
branch.delete=删除分支 "%s" branch.delete=删除分支 %s
branch.delete_html=删除分支 branch.delete_html=删除分支
branch.delete_desc=删除分支是永久的。虽然已删除的分支在实际被删除前有可能会短时间存在,但这在大多数情况下无法撤销。是否继续? branch.delete_desc=删除分支是永久的。虽然已删除的分支在实际被删除前有可能会短时间存在,但这在大多数情况下无法撤销。是否继续?
branch.deletion_success=分支 %s 已被删除。 branch.deletion_success=分支 %s 已被删除。
@ -2629,9 +2627,9 @@ branch.restore_success=分支 "%s"已还原。
branch.restore_failed=还原分支 "%s"失败。 branch.restore_failed=还原分支 "%s"失败。
branch.protected_deletion_failed=不能删除受保护的分支 "%s"。 branch.protected_deletion_failed=不能删除受保护的分支 "%s"。
branch.default_deletion_failed=不能删除默认分支"%s"。 branch.default_deletion_failed=不能删除默认分支"%s"。
branch.restore=恢复分支 "%s" branch.restore=`还原分支 "%s"`
branch.download=下载分支 "%s" branch.download=`下载分支 "%s"`
branch.rename=重命名分支 "%s" branch.rename=`重命名分支 "%s"`
branch.search=搜索分支 branch.search=搜索分支
branch.included_desc=此分支是默认分支的一部分 branch.included_desc=此分支是默认分支的一部分
branch.included=已包含 branch.included=已包含
@ -2728,7 +2726,7 @@ n_branch_one = %s 分支
n_branch_few = %s 分支 n_branch_few = %s 分支
n_tag_one = %s 标签 n_tag_one = %s 标签
n_tag_few = %s 标签 n_tag_few = %s 标签
editor.commit_id_not_matching = 您在编辑文件时该文件已被更改。请提交到一个新的分支,然后再将这个新的分支合并回当前分支。 editor.commit_id_not_matching = 此提交ID与您当前编辑的不匹配。请提交到一个新的分支,然后再将这个新的分支合并回当前分支。
issues.num_participants_one = %d 个参与者 issues.num_participants_one = %d 个参与者
issues.archived_label_description = (已归档)%s issues.archived_label_description = (已归档)%s
editor.push_out_of_date = 推送似乎已过期。 editor.push_out_of_date = 推送似乎已过期。
@ -2764,12 +2762,6 @@ project = 项目
issues.edit.already_changed = 无法保存对工单的更改。工单似乎已经被另一个用户修改了,为了防止修改被覆盖,请刷新页面后再次尝试编辑 issues.edit.already_changed = 无法保存对工单的更改。工单似乎已经被另一个用户修改了,为了防止修改被覆盖,请刷新页面后再次尝试编辑
pulls.edit.already_changed = 无法保存对合并请求的更改。内容似乎已经被另一个用户修改了,为了防止修改被覆盖,请刷新页面后再次尝试编辑 pulls.edit.already_changed = 无法保存对合并请求的更改。内容似乎已经被另一个用户修改了,为了防止修改被覆盖,请刷新页面后再次尝试编辑
comments.edit.already_changed = 无法保存对评论的更改。内容似乎已经被另一个用户修改了,为了防止修改被覆盖,请刷新页面后再次尝试编辑 comments.edit.already_changed = 无法保存对评论的更改。内容似乎已经被另一个用户修改了,为了防止修改被覆盖,请刷新页面后再次尝试编辑
subscribe.issue.guest.tooltip = 登录以订阅工单。
subscribe.pull.guest.tooltip = 登录以订阅此拉取请求。
settings.federation_following_repos = 关注仓库的 URL。以“;”分隔,无空格。
settings.federation_settings = 邦联设置
settings.federation_apapiurl = 此仓库的邦联URL地址。将其作为关注的仓库URL地址填写到另一个仓库的邦联设置中。
settings.federation_not_enabled = 当前实例未启用邦联功能。
[graphs] [graphs]
component_loading=正在加载 %s... component_loading=正在加载 %s...
@ -2809,7 +2801,7 @@ form.create_org_not_allowed=此账号禁止创建组织
settings=组织设置 settings=组织设置
settings.options=组织 settings.options=组织
settings.full_name=全名 settings.full_name=组织全名
settings.email=联系电子邮件 settings.email=联系电子邮件
settings.website=网站 settings.website=网站
settings.location=所在地区 settings.location=所在地区
@ -2822,7 +2814,7 @@ settings.visibility.limited_shortname=受限
settings.visibility.private=私有 (仅对组织成员可见) settings.visibility.private=私有 (仅对组织成员可见)
settings.visibility.private_shortname=私有 settings.visibility.private_shortname=私有
settings.update_settings=更新设置 settings.update_settings=更新组织设置
settings.update_setting_success=组织设置已更新。 settings.update_setting_success=组织设置已更新。
settings.change_orgname_prompt=注意:更改组织名称同时会更改组织的 URL 地址并释放旧的名称。 settings.change_orgname_prompt=注意:更改组织名称同时会更改组织的 URL 地址并释放旧的名称。
settings.change_orgname_redirect_prompt=在被人使用前,旧用户名将会被重定向。 settings.change_orgname_redirect_prompt=在被人使用前,旧用户名将会被重定向。
@ -2830,7 +2822,7 @@ settings.update_avatar_success=组织头像已经更新。
settings.delete=删除组织 settings.delete=删除组织
settings.delete_account=删除当前组织 settings.delete_account=删除当前组织
settings.delete_prompt=删除操作会永久清除该组织的信息,并且 <strong>不可恢复</strong> settings.delete_prompt=删除操作会永久清除该组织的信息,并且 <strong>不可恢复</strong>
settings.confirm_delete_account=确认删除 settings.confirm_delete_account=确认删除组织
settings.delete_org_title=删除组织 settings.delete_org_title=删除组织
settings.delete_org_desc=此组织将会被永久删除,确认继续吗? settings.delete_org_desc=此组织将会被永久删除,确认继续吗?
settings.hooks_desc=在此处添加的 Web 钩子将会应用到该组织下的 <strong>所有仓库</strong>。 settings.hooks_desc=在此处添加的 Web 钩子将会应用到该组织下的 <strong>所有仓库</strong>。
@ -2871,7 +2863,7 @@ teams.no_desc=该团队暂无描述
teams.settings=团队设置 teams.settings=团队设置
teams.owners_permission_desc=管理员团队对 <strong>所有仓库</strong> 具有操作权限,且对组织具有 <strong>管理员权限</strong>。 teams.owners_permission_desc=管理员团队对 <strong>所有仓库</strong> 具有操作权限,且对组织具有 <strong>管理员权限</strong>。
teams.members=团队成员 teams.members=团队成员
teams.update_settings=更新设置 teams.update_settings=更新团队设置
teams.delete_team=删除团队 teams.delete_team=删除团队
teams.add_team_member=添加团队成员 teams.add_team_member=添加团队成员
teams.invite_team_member=邀请加入 %s teams.invite_team_member=邀请加入 %s
@ -2910,7 +2902,7 @@ open_dashboard = 打开仪表盘
dashboard=管理面板 dashboard=管理面板
self_check=自我检查 self_check=自我检查
identity_access=身份及认证 identity_access=身份及认证
users=用户帐户 users=帐户管理
organizations=组织管理 organizations=组织管理
assets=代码资产 assets=代码资产
repositories=仓库管理 repositories=仓库管理
@ -3012,7 +3004,7 @@ dashboard.sync_branch.started=分支同步已开始
dashboard.sync_tag.started=标签同步已开始 dashboard.sync_tag.started=标签同步已开始
dashboard.rebuild_issue_indexer=重建工单索引 dashboard.rebuild_issue_indexer=重建工单索引
users.user_manage_panel=管理用户帐户 users.user_manage_panel=用户帐户管理
users.new_account=创建新帐户 users.new_account=创建新帐户
users.name=用户名 users.name=用户名
users.full_name=全名 users.full_name=全名
@ -3027,7 +3019,7 @@ users.repos=仓库数
users.created=创建时间 users.created=创建时间
users.last_login=上次登录 users.last_login=上次登录
users.never_login=从未登录 users.never_login=从未登录
users.send_register_notify=通过邮件发送注册通知 users.send_register_notify=发送注册通知
users.new_success=用户账户 '%s' 已被创建。 users.new_success=用户账户 '%s' 已被创建。
users.edit=修改 users.edit=修改
users.auth_source=认证源 users.auth_source=认证源
@ -3150,7 +3142,7 @@ auths.attribute_surname=姓氏属性
auths.attribute_mail=电子邮箱属性 auths.attribute_mail=电子邮箱属性
auths.attribute_ssh_public_key=SSH公钥属性 auths.attribute_ssh_public_key=SSH公钥属性
auths.attribute_avatar=头像属性 auths.attribute_avatar=头像属性
auths.attributes_in_bind=bind DN 中拉取属性信息 auths.attributes_in_bind=Bind DN 中拉取属性信息
auths.allow_deactivate_all=允许在搜索结果为空时停用所有用户 auths.allow_deactivate_all=允许在搜索结果为空时停用所有用户
auths.use_paged_search=使用分页搜索 auths.use_paged_search=使用分页搜索
auths.search_page_size=分页大小 auths.search_page_size=分页大小
@ -3202,7 +3194,7 @@ auths.oauth2_admin_group=管理员用户组的 Claim 声明值。(可选 - 需
auths.oauth2_restricted_group=受限用户组的 Claim 声明值。(可选 - 需要上面的声明名称) auths.oauth2_restricted_group=受限用户组的 Claim 声明值。(可选 - 需要上面的声明名称)
auths.oauth2_map_group_to_team=映射声明的组到组织团队。(可选 - 要求在上面填写声明的名字) auths.oauth2_map_group_to_team=映射声明的组到组织团队。(可选 - 要求在上面填写声明的名字)
auths.oauth2_map_group_to_team_removal=如果用户不属于相应的组,从已同步团队中移除用户 auths.oauth2_map_group_to_team_removal=如果用户不属于相应的组,从已同步团队中移除用户
auths.enable_auto_register=允许自动注册 auths.enable_auto_register=允许用户自动注册
auths.sspi_auto_create_users=自动创建用户 auths.sspi_auto_create_users=自动创建用户
auths.sspi_auto_create_users_helper=允许 SSPI 认证在用户第一次登录时自动创建新账号 auths.sspi_auto_create_users_helper=允许 SSPI 认证在用户第一次登录时自动创建新账号
auths.sspi_auto_activate_users=自动激活用户 auths.sspi_auto_activate_users=自动激活用户
@ -3236,7 +3228,7 @@ auths.new_success=已添加身份验证 '%s'。
auths.update_success=认证源已经更新。 auths.update_success=认证源已经更新。
auths.update=更新认证源 auths.update=更新认证源
auths.delete=删除认证源 auths.delete=删除认证源
auths.delete_auth_title=删除证源 auths.delete_auth_title=删除身份验证源
auths.delete_auth_desc=删除一个认证源将阻止使用它进行登录。确认? auths.delete_auth_desc=删除一个认证源将阻止使用它进行登录。确认?
auths.still_in_used=认证源仍在使用。请先解除或者删除使用此认证源的用户。 auths.still_in_used=认证源仍在使用。请先解除或者删除使用此认证源的用户。
auths.deletion_success=认证源已经更新。 auths.deletion_success=认证源已经更新。
@ -3246,9 +3238,9 @@ auths.unable_to_initialize_openid=无法初始化 OpenID Connect 提供商: %s
auths.invalid_openIdConnectAutoDiscoveryURL=无效的 Auto Discovery URL (这必须是一个以 http:// 或 https://开头的有效的 URL) auths.invalid_openIdConnectAutoDiscoveryURL=无效的 Auto Discovery URL (这必须是一个以 http:// 或 https://开头的有效的 URL)
config.server_config=服务器配置 config.server_config=服务器配置
config.app_name=实例名称 config.app_name=站点名称
config.app_ver=Forgejo 版本 config.app_ver=Forgejo版本
config.app_url=基本 URL config.app_url=Forgejo 基本 URL
config.custom_conf=配置文件路径 config.custom_conf=配置文件路径
config.custom_file_root_path=自定义文件根路径 config.custom_file_root_path=自定义文件根路径
config.domain=服务器域名 config.domain=服务器域名
@ -3262,7 +3254,7 @@ config.repo_root_path=仓库根目录
config.lfs_root_path=LFS根目录 config.lfs_root_path=LFS根目录
config.log_file_root_path=日志路径 config.log_file_root_path=日志路径
config.script_type=脚本类型 config.script_type=脚本类型
config.reverse_auth_user=反向代理认证用户 config.reverse_auth_user=反向代理认证
config.ssh_config=SSH 配置 config.ssh_config=SSH 配置
config.ssh_enabled=启用 config.ssh_enabled=启用
@ -3295,10 +3287,10 @@ config.register_email_confirm=需要电子邮件确认注册
config.disable_register=禁止用户注册 config.disable_register=禁止用户注册
config.allow_only_internal_registration=只允许通过 Forgejo 进行注册 config.allow_only_internal_registration=只允许通过 Forgejo 进行注册
config.allow_only_external_registration=仅允许通过外部服务注册 config.allow_only_external_registration=仅允许通过外部服务注册
config.enable_openid_signup=启用 OpenID 自注册 config.enable_openid_signup=启用 OpenID 自注册
config.enable_openid_signin=启用 OpenID 登录 config.enable_openid_signin=启用 OpenID 登录
config.show_registration_button=显示注册按钮 config.show_registration_button=显示注册按钮
config.require_sign_in_view=需要登录才能查看内容 config.require_sign_in_view=启用登录访问限制
config.mail_notify=启用邮件通知 config.mail_notify=启用邮件通知
config.enable_captcha=启用登录验证码 config.enable_captcha=启用登录验证码
config.active_code_lives=激活用户链接有效期 config.active_code_lives=激活用户链接有效期
@ -3309,7 +3301,7 @@ config.enable_timetracking=启用时间跟踪
config.default_enable_timetracking=默认情况下启用时间跟踪 config.default_enable_timetracking=默认情况下启用时间跟踪
config.allow_dots_in_usernames = 允许用户在用户名中使用英文句号。不影响已有的帐户。 config.allow_dots_in_usernames = 允许用户在用户名中使用英文句号。不影响已有的帐户。
config.default_allow_only_contributors_to_track_time=仅允许成员跟踪时间 config.default_allow_only_contributors_to_track_time=仅允许成员跟踪时间
config.no_reply_address=隐藏电子邮件域 config.no_reply_address=隐藏电子邮件域
config.default_visibility_organization=新组织的默认可见性 config.default_visibility_organization=新组织的默认可见性
config.default_enable_dependencies=默认情况下启用工单依赖 config.default_enable_dependencies=默认情况下启用工单依赖
@ -3318,7 +3310,7 @@ config.queue_length=队列长度
config.deliver_timeout=推送超时 config.deliver_timeout=推送超时
config.skip_tls_verify=跳过 TLS 验证 config.skip_tls_verify=跳过 TLS 验证
config.mailer_config=邮件配置 config.mailer_config=Mailer 配置
config.mailer_enabled=启用服务 config.mailer_enabled=启用服务
config.mailer_enable_helo=启用HELO config.mailer_enable_helo=启用HELO
config.mailer_name=任务名称 config.mailer_name=任务名称
@ -3334,17 +3326,17 @@ config.mailer_use_dummy=Dummy
config.test_email_placeholder=电子邮址 (例如test@example.com) config.test_email_placeholder=电子邮址 (例如test@example.com)
config.send_test_mail=发送测试邮件 config.send_test_mail=发送测试邮件
config.send_test_mail_submit=发送 config.send_test_mail_submit=发送
config.test_mail_failed=发送测试邮件至 "%s" 时失败:%v config.test_mail_failed=发送测试邮件至 '%s' 时失败:%v
config.test_mail_sent=测试邮件已经发送至 "%s" config.test_mail_sent=测试邮件已经发送至 '%s'
config.oauth_config=OAuth 配置 config.oauth_config=OAuth 配置
config.oauth_enabled=启用 config.oauth_enabled=启用
config.cache_config=缓存配置 config.cache_config=Cache 配置
config.cache_adapter=缓存适配器 config.cache_adapter=Cache 适配器
config.cache_interval=缓存周期 config.cache_interval=Cache 周期
config.cache_conn=缓存连接字符串 config.cache_conn=Cache 连接字符串
config.cache_item_ttl=缓存目 TTL config.cache_item_ttl=缓存目 TTL
config.session_config=Session 配置 config.session_config=Session 配置
config.session_provider=Session 提供者 config.session_provider=Session 提供者
@ -3358,7 +3350,7 @@ config.cookie_life_time=Cookie 生命周期
config.picture_config=图片和头像配置 config.picture_config=图片和头像配置
config.picture_service=图片服务 config.picture_service=图片服务
config.disable_gravatar=禁用 Gravatar 头像 config.disable_gravatar=禁用 Gravatar 头像
config.enable_federated_avatar=启用 federated avatars config.enable_federated_avatar=启用 Federated Avatars
config.git_config=Git 配置 config.git_config=Git 配置
config.git_disable_diff_highlight=禁用差异对比语法高亮 config.git_disable_diff_highlight=禁用差异对比语法高亮
@ -3383,7 +3375,7 @@ config.set_setting_failed=设置 %s 失败
monitor.stats=统计 monitor.stats=统计
monitor.cron=定时任务 monitor.cron=Cron 任务
monitor.name=任务名称 monitor.name=任务名称
monitor.schedule=任务安排 monitor.schedule=任务安排
monitor.next=下次执行时间 monitor.next=下次执行时间
@ -3407,11 +3399,11 @@ monitor.queue=队列: %s
monitor.queue.name=名称 monitor.queue.name=名称
monitor.queue.type=类型 monitor.queue.type=类型
monitor.queue.exemplar=数据类型 monitor.queue.exemplar=数据类型
monitor.queue.numberworkers=worker 数量 monitor.queue.numberworkers=工作者数量
monitor.queue.activeworkers=活跃 worker monitor.queue.activeworkers=活跃工作者
monitor.queue.maxnumberworkers=最大 worker 数量 monitor.queue.maxnumberworkers=最大工作者数量
monitor.queue.numberinqueue=队列中的数量 monitor.queue.numberinqueue=队列中的数量
monitor.queue.review_add=审查 / 添加 worker monitor.queue.review_add=查看 / 添加工作者
monitor.queue.settings.title=池设置 monitor.queue.settings.title=池设置
monitor.queue.settings.desc=因为工作者队列阻塞,池正在动态扩展。 monitor.queue.settings.desc=因为工作者队列阻塞,池正在动态扩展。
monitor.queue.settings.maxnumberworkers=最大工作者数量 monitor.queue.settings.maxnumberworkers=最大工作者数量
@ -3437,7 +3429,7 @@ notices.desc=提示描述
notices.op=操作 notices.op=操作
notices.delete_success=系统通知已被删除。 notices.delete_success=系统通知已被删除。
dashboard.sync_repo_tags = 将 git 数据中的标签同步到数据库 dashboard.sync_repo_tags = 将 git 数据中的标签同步到数据库
dashboard.sync_tag.started = 标签同步开始 dashboard.sync_tag.started = 标签同步开始
self_check = 自检 self_check = 自检
self_check.no_problem_found = 未找到问题。 self_check.no_problem_found = 未找到问题。
self_check.database_collation_mismatch = 期望数据库使用排序规则:%s self_check.database_collation_mismatch = 期望数据库使用排序规则:%s
@ -3456,7 +3448,6 @@ config_settings = 设置
config_summary = 概况 config_summary = 概况
auths.default_domain_name = 用于电子邮件地址的默认域名 auths.default_domain_name = 用于电子邮件地址的默认域名
config.open_with_editor_app_help = 克隆菜单中的“打开方式”所用的编辑器。如果留空,将使用默认值。展开以查看默认值。 config.open_with_editor_app_help = 克隆菜单中的“打开方式”所用的编辑器。如果留空,将使用默认值。展开以查看默认值。
config.app_slogan = 实例标语
[action] [action]
create_repo=创建了仓库 <a href="%s">%s</a> create_repo=创建了仓库 <a href="%s">%s</a>
@ -3675,10 +3666,10 @@ owner.settings.cargo.rebuild=重建索引
owner.settings.cargo.rebuild.description=如果索引与存储的 Cargo 包不同步,重建可能会有用。 owner.settings.cargo.rebuild.description=如果索引与存储的 Cargo 包不同步,重建可能会有用。
owner.settings.cargo.rebuild.error=无法重建 Cargo 索引: %v owner.settings.cargo.rebuild.error=无法重建 Cargo 索引: %v
owner.settings.cargo.rebuild.success=Cargo 索引已成功重建。 owner.settings.cargo.rebuild.success=Cargo 索引已成功重建。
owner.settings.cleanuprules.title=清理规则 owner.settings.cleanuprules.title=管理清理规则
owner.settings.cleanuprules.add=添加清理规则 owner.settings.cleanuprules.add=添加清理规则
owner.settings.cleanuprules.edit=编辑清理规则 owner.settings.cleanuprules.edit=编辑清理规则
owner.settings.cleanuprules.none=尚无清理规则 owner.settings.cleanuprules.none=没有可用的清理规则。请查阅文档
owner.settings.cleanuprules.preview=清理规则预览 owner.settings.cleanuprules.preview=清理规则预览
owner.settings.cleanuprules.preview.overview=%d 个软件包计划被删除。 owner.settings.cleanuprules.preview.overview=%d 个软件包计划被删除。
owner.settings.cleanuprules.preview.none=清理规则与任何软件包都不匹配。 owner.settings.cleanuprules.preview.none=清理规则与任何软件包都不匹配。
@ -3722,7 +3713,7 @@ management=密钥管理
[actions] [actions]
actions=Actions actions=Actions
unit.desc=使用 Forgejo Actions 管理集成的 CI/CD 管道 unit.desc=管理Actions
status.unknown=未知 status.unknown=未知
status.waiting=等待中 status.waiting=等待中
@ -3734,7 +3725,7 @@ status.skipped=已忽略
status.blocked=阻塞中 status.blocked=阻塞中
runners=Runners runners=Runners
runners.runner_manage_panel=管理 Runners runners.runner_manage_panel=Runners管理
runners.new=创建 Runner runners.new=创建 Runner
runners.new_notice=如何启动一个运行器 runners.new_notice=如何启动一个运行器
runners.status=状态 runners.status=状态
@ -3782,21 +3773,21 @@ runs.actors_no_select=所有操作者
runs.status_no_select=所有状态 runs.status_no_select=所有状态
runs.no_results=没有匹配的结果。 runs.no_results=没有匹配的结果。
runs.no_workflows=目前还没有工作流。 runs.no_workflows=目前还没有工作流。
runs.no_workflows.quick_start=不知道如何使用 Forgejo Actions吗请查看 <a target="_blank" rel="noopener noreferrer" href="%s">快速启动指南</a>。 runs.no_workflows.quick_start=不知道如何使用 Gitea Actions吗请查看 <a target="_blank" rel="noopener noreferrer" href="%s">快速启动指南</a>。
runs.no_workflows.documentation=关于Forgejo Actions的更多信息请参阅 <a target="_blank" rel="noopener noreferrer" href="%s">文档</a>。 runs.no_workflows.documentation=关于Gitea Actions的更多信息请参阅 <a target="_blank" rel="noopener noreferrer" href="%s">文档</a>。
runs.no_runs=工作流尚未运行过。 runs.no_runs=工作流尚未运行过。
runs.empty_commit_message=(空白的提交消息) runs.empty_commit_message=(空白的提交消息)
workflow.disable=禁用工作流 workflow.disable=禁用工作流
workflow.disable_success=工作流 "%s" 已成功禁用。 workflow.disable_success=工作流 '%s' 已成功禁用。
workflow.enable=启用工作流 workflow.enable=启用工作流
workflow.enable_success=工作流 "%s" 已成功启用。 workflow.enable_success=工作流 '%s' 已成功启用。
workflow.disabled=工作流已禁用。 workflow.disabled=工作流已禁用。
need_approval_desc=该工作流由派生仓库的合并请求所触发,需要批准方可运行。 need_approval_desc=该工作流由派生仓库的合并请求所触发,需要批准方可运行。
variables=变量 variables=变量
variables.management=管理变量 variables.management=变量管理
variables.creation=添加变量 variables.creation=添加变量
variables.none=目前还没有变量。 variables.none=目前还没有变量。
variables.deletion=删除变量 variables.deletion=删除变量
@ -3851,10 +3842,6 @@ code_search_by_git_grep = 当前搜索结果由 git grep 提供,如果站点
match = 匹配 match = 匹配
match_tooltip = 仅包含与搜索词完全匹配的结果 match_tooltip = 仅包含与搜索词完全匹配的结果
fuzzy_tooltip = 在搜索结果中包含与搜索词相近的项目 fuzzy_tooltip = 在搜索结果中包含与搜索词相近的项目
exact = 精确
issue_kind = 搜索工单...
pull_kind = 搜索拉取...
exact_tooltip = 仅包含与精确搜索词匹配的结果
[munits.data] [munits.data]

895
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -24,7 +24,7 @@
"dayjs": "1.11.11", "dayjs": "1.11.11",
"dropzone": "6.0.0-beta.2", "dropzone": "6.0.0-beta.2",
"easymde": "2.18.0", "easymde": "2.18.0",
"esbuild-loader": "4.1.0", "esbuild-loader": "4.2.0",
"escape-goat": "4.0.0", "escape-goat": "4.0.0",
"fast-glob": "3.3.2", "fast-glob": "3.3.2",
"htmx.org": "1.9.12", "htmx.org": "1.9.12",
@ -34,7 +34,7 @@
"license-checker-webpack-plugin": "0.2.1", "license-checker-webpack-plugin": "0.2.1",
"mermaid": "10.9.1", "mermaid": "10.9.1",
"mini-css-extract-plugin": "2.9.0", "mini-css-extract-plugin": "2.9.0",
"minimatch": "9.0.5", "minimatch": "9.0.4",
"monaco-editor": "0.47.0", "monaco-editor": "0.47.0",
"monaco-editor-webpack-plugin": "7.1.0", "monaco-editor-webpack-plugin": "7.1.0",
"pdfobject": "2.3.0", "pdfobject": "2.3.0",
@ -53,23 +53,22 @@
"tributejs": "5.1.3", "tributejs": "5.1.3",
"uint8-to-base64": "0.2.0", "uint8-to-base64": "0.2.0",
"vanilla-colorful": "0.7.2", "vanilla-colorful": "0.7.2",
"vue": "3.4.30", "vue": "3.4.27",
"vue-bar-graph": "2.0.0", "vue-bar-graph": "2.0.0",
"vue-chartjs": "5.3.1", "vue-chartjs": "5.3.1",
"vue-loader": "17.4.2", "vue-loader": "17.4.2",
"vue3-calendar-heatmap": "2.0.5", "vue3-calendar-heatmap": "2.0.5",
"webpack": "5.92.1", "webpack": "5.91.0",
"webpack-cli": "5.1.4", "webpack-cli": "5.1.4",
"wrap-ansi": "9.0.0" "wrap-ansi": "9.0.0"
}, },
"devDependencies": { "devDependencies": {
"@eslint-community/eslint-plugin-eslint-comments": "4.3.0", "@eslint-community/eslint-plugin-eslint-comments": "4.3.0",
"@playwright/test": "1.45.0", "@playwright/test": "1.44.1",
"@stoplight/spectral-cli": "6.11.1", "@stoplight/spectral-cli": "6.11.1",
"@stylistic/eslint-plugin-js": "1.8.1", "@stylistic/eslint-plugin-js": "1.8.1",
"@stylistic/stylelint-plugin": "2.1.2", "@stylistic/stylelint-plugin": "2.1.2",
"@vitejs/plugin-vue": "5.0.4", "@vitejs/plugin-vue": "5.0.4",
"@vitest/coverage-v8": "1.6.0",
"@vue/test-utils": "2.4.6", "@vue/test-utils": "2.4.6",
"eslint": "8.57.0", "eslint": "8.57.0",
"eslint-plugin-array-func": "4.0.0", "eslint-plugin-array-func": "4.0.0",
@ -84,9 +83,9 @@
"eslint-plugin-vitest": "0.5.4", "eslint-plugin-vitest": "0.5.4",
"eslint-plugin-vitest-globals": "1.5.0", "eslint-plugin-vitest-globals": "1.5.0",
"eslint-plugin-vue": "9.26.0", "eslint-plugin-vue": "9.26.0",
"eslint-plugin-vue-scoped-css": "2.8.1", "eslint-plugin-vue-scoped-css": "2.8.0",
"eslint-plugin-wc": "2.1.0", "eslint-plugin-wc": "2.1.0",
"happy-dom": "14.12.3", "happy-dom": "14.12.0",
"markdownlint-cli": "0.41.0", "markdownlint-cli": "0.41.0",
"postcss-html": "1.7.0", "postcss-html": "1.7.0",
"stylelint": "16.6.1", "stylelint": "16.6.1",
@ -94,7 +93,7 @@
"stylelint-declaration-strict-value": "1.10.4", "stylelint-declaration-strict-value": "1.10.4",
"stylelint-value-no-unknown-custom-properties": "6.0.1", "stylelint-value-no-unknown-custom-properties": "6.0.1",
"svgo": "3.2.0", "svgo": "3.2.0",
"vite-string-plugin": "1.3.4", "vite-string-plugin": "1.3.2",
"vitest": "1.6.0" "vitest": "1.6.0"
}, },
"browserslist": ["defaults"] "browserslist": ["defaults"]

View file

@ -0,0 +1 @@
Wrongfully hidden "Use Custom URLs Instead of Default URLs" checkbox on Authentication Source Administration page.

View file

@ -1 +0,0 @@
Authentication Source Administration page wrongfully handled the "Custom URLs Instead of Default URLs" checkbox (missing checkbox, irrelevant fields) [#4059](https://codeberg.org/forgejo/forgejo/pulls/4059) [#4194](https://codeberg.org/forgejo/forgejo/pulls/4194)

View file

@ -1 +0,0 @@
User profiles: only show RSS feed button and Public activity tab when the activity can be accessed, add messages about visibility

View file

@ -1 +0,0 @@
Make tooltip of Author label in comments more clear

View file

@ -1,3 +0,0 @@
- [commit](https://codeberg.org/forgejo/forgejo/commit/b60e3ac7b4aeeb9b8760f43eea9576c0e23309e9) allow downloading draft releases assets.
- [commit](https://codeberg.org/forgejo/forgejo/commit/1fca15529ac8fefb60d86b0c1f4bec8dae9a8566) API endpoints for managing tag protection
- [commit](https://codeberg.org/forgejo/forgejo/commit/4334c705b5f9388b16af23c7e75a69d027d07d5e) extract and display readme and comments for Composer packages

View file

@ -1,2 +0,0 @@
- [commit](https://codeberg.org/forgejo/forgejo/commit/364922c6e4f28264add9e2501a352c25ad6a0993) when a repository is adopted, its object format is not set in the database
- [commit](https://codeberg.org/forgejo/forgejo/commit/e7f332a55d6a48a3f3b4f2bfa43d18455ac00acc) during a migration from bitbucket, LFS downloads fail

View file

@ -1 +0,0 @@
- markdown files displayed in the UI that have an unescaped backtick in the image alt [could (accidentally) trigger an inline code](https://github.com/yuin/goldmark/issues/456)

View file

@ -1 +0,0 @@
- markdown `[*[a]*](b)` [is incorrectly rendered as `<p><a href="b"><em>[a]</em></a></p>`](https://github.com/yuin/goldmark/issues/457)

View file

@ -1 +0,0 @@
- [commit](https://codeberg.org/forgejo/forgejo/commit/358cd67c4f316f2d4f1d3be6dcb891dc04a2ff07) reduce memory usage for chunked artifact uploads to S3

View file

@ -7,8 +7,7 @@
"group:postcss", "group:postcss",
"group:linters", "group:linters",
"schedule:daily", "schedule:daily",
"schedule:automergeDaily", "schedule:automergeDaily"
"local>forgejo-contrib/forgejo-renovate//go.json"
], ],
"ignorePresets": [ "ignorePresets": [
":semanticPrefixFixDepsChoreOthers", ":semanticPrefixFixDepsChoreOthers",
@ -18,7 +17,7 @@
"semanticCommits": "disabled", "semanticCommits": "disabled",
"automergeStrategy": "merge-commit", "automergeStrategy": "merge-commit",
"postUpdateOptions": ["gomodTidy", "gomodUpdateImportPaths", "npmDedupe"], "postUpdateOptions": ["gomodTidy", "gomodUpdateImportPaths", "npmDedupe"],
"prConcurrentLimit": 10, "prConcurrentLimit": 5,
"internalChecksFilter": "strict", "internalChecksFilter": "strict",
"osvVulnerabilityAlerts": true, "osvVulnerabilityAlerts": true,
"labels": ["dependency-upgrade"], "labels": ["dependency-upgrade"],
@ -57,20 +56,10 @@
{ {
"description": "elasticsearch CI images are published about once a month and do not use semantic versioning or short tags", "description": "elasticsearch CI images are published about once a month and do not use semantic versioning or short tags",
"matchDepNames": [ "matchDepNames": [
"elasticsearch" "elasticsearch",
], ],
"extends": ["schedule:quarterly"] "extends": ["schedule:quarterly"]
}, },
{
"description": "devcontainer is an optional tool used by some Forgejo contributors when working on the codebase",
"matchPackagePrefixes": [
"ghcr.io/devcontainers/features/",
"ghcr.io/devcontainers-contrib/features/"
],
"groupName": "devcontainer packages",
"extends": ["schedule:quarterly"],
"automerge": true
},
{ {
"description": "Group golang packages", "description": "Group golang packages",
"matchDepNames": [ "matchDepNames": [
@ -93,8 +82,7 @@
"matchDatasources": ["docker"], "matchDatasources": ["docker"],
"matchPackageNames": ["ghcr.io/visualon/renovate"], "matchPackageNames": ["ghcr.io/visualon/renovate"],
"matchUpdateTypes": ["minor", "patch", "digest"], "matchUpdateTypes": ["minor", "patch", "digest"],
"automerge": true, "automerge": true
"groupName": "renovate"
}, },
{ {
"description": "Split minor and patch updates", "description": "Split minor and patch updates",
@ -159,6 +147,8 @@
"@playwright/", "@playwright/",
"@stoplight/spectral-cli", "@stoplight/spectral-cli",
"@stylistic/", "@stylistic/",
"ghcr.io/devcontainers/features/",
"ghcr.io/devcontainers-contrib/features/",
"mcr.microsoft.com/devcontainers/" "mcr.microsoft.com/devcontainers/"
], ],
"automerge": true "automerge": true
@ -197,7 +187,7 @@
"customType": "regex", "customType": "regex",
"fileMatch": ["^Makefile$"], "fileMatch": ["^Makefile$"],
"matchStrings": [ "matchStrings": [
" \\?= (?<depName>.+?)@(?<currentValue>.+?) # renovate: datasource=(?<datasource>.+?)(?: packageName=(?<packageName>.+?))?( versioning=(?<versioning>.+?))?\\s" " \\?= (?<depName>.+?)@(?<currentValue>.+?) # renovate: datasource=(?<datasource>.+?)\\s"
] ]
} }
] ]

View file

@ -241,12 +241,16 @@ func (ar artifactRoutes) uploadArtifact(ctx *ArtifactContext) {
} }
// get upload file size // get upload file size
fileRealTotalSize, contentLength := getUploadFileSize(ctx) fileRealTotalSize, contentLength, err := getUploadFileSize(ctx)
if err != nil {
log.Error("Error get upload file size: %v", err)
ctx.Error(http.StatusInternalServerError, "Error get upload file size")
return
}
// get artifact retention days // get artifact retention days
expiredDays := setting.Actions.ArtifactRetentionDays expiredDays := setting.Actions.ArtifactRetentionDays
if queryRetentionDays := ctx.Req.URL.Query().Get("retentionDays"); queryRetentionDays != "" { if queryRetentionDays := ctx.Req.URL.Query().Get("retentionDays"); queryRetentionDays != "" {
var err error
expiredDays, err = strconv.ParseInt(queryRetentionDays, 10, 64) expiredDays, err = strconv.ParseInt(queryRetentionDays, 10, 64)
if err != nil { if err != nil {
log.Error("Error parse retention days: %v", err) log.Error("Error parse retention days: %v", err)

View file

@ -39,7 +39,7 @@ func saveUploadChunkBase(st storage.ObjectStorage, ctx *ArtifactContext,
r = io.TeeReader(r, hasher) r = io.TeeReader(r, hasher)
} }
// save chunk to storage // save chunk to storage
writtenSize, err := st.Save(storagePath, r, contentSize) writtenSize, err := st.Save(storagePath, r, -1)
if err != nil { if err != nil {
return -1, fmt.Errorf("save chunk to storage error: %v", err) return -1, fmt.Errorf("save chunk to storage error: %v", err)
} }
@ -208,7 +208,7 @@ func mergeChunksForArtifact(ctx *ArtifactContext, chunks []*chunkFileItem, st st
// save merged file // save merged file
storagePath := fmt.Sprintf("%d/%d/%d.%s", artifact.RunID%255, artifact.ID%255, time.Now().UnixNano(), extension) storagePath := fmt.Sprintf("%d/%d/%d.%s", artifact.RunID%255, artifact.ID%255, time.Now().UnixNano(), extension)
written, err := st.Save(storagePath, mergedReader, artifact.FileCompressedSize) written, err := st.Save(storagePath, mergedReader, -1)
if err != nil { if err != nil {
return fmt.Errorf("save merged file error: %v", err) return fmt.Errorf("save merged file error: %v", err)
} }

View file

@ -43,7 +43,7 @@ func validateRunID(ctx *ArtifactContext) (*actions.ActionTask, int64, bool) {
return task, runID, true return task, runID, true
} }
func validateRunIDV4(ctx *ArtifactContext, rawRunID string) (*actions.ActionTask, int64, bool) { //nolint:unparam func validateRunIDV4(ctx *ArtifactContext, rawRunID string) (*actions.ActionTask, int64, bool) {
task := ctx.ActionTask task := ctx.ActionTask
runID, err := strconv.ParseInt(rawRunID, 10, 64) runID, err := strconv.ParseInt(rawRunID, 10, 64)
if err != nil || task.Job.RunID != runID { if err != nil || task.Job.RunID != runID {
@ -84,11 +84,11 @@ func parseArtifactItemPath(ctx *ArtifactContext) (string, string, bool) {
// getUploadFileSize returns the size of the file to be uploaded. // getUploadFileSize returns the size of the file to be uploaded.
// The raw size is the size of the file as reported by the header X-TFS-FileLength. // The raw size is the size of the file as reported by the header X-TFS-FileLength.
func getUploadFileSize(ctx *ArtifactContext) (int64, int64) { func getUploadFileSize(ctx *ArtifactContext) (int64, int64, error) {
contentLength := ctx.Req.ContentLength contentLength := ctx.Req.ContentLength
xTfsLength, _ := strconv.ParseInt(ctx.Req.Header.Get(artifactXTfsFileLengthHeader), 10, 64) xTfsLength, _ := strconv.ParseInt(ctx.Req.Header.Get(artifactXTfsFileLengthHeader), 10, 64)
if xTfsLength > 0 { if xTfsLength > 0 {
return xTfsLength, contentLength return xTfsLength, contentLength, nil
} }
return contentLength, contentLength return contentLength, contentLength, nil
} }

View file

@ -26,7 +26,7 @@ var uploadVersionMutex sync.Mutex
// saveAsPackageBlob creates a package blob from an upload // saveAsPackageBlob creates a package blob from an upload
// The uploaded blob gets stored in a special upload version to link them to the package/image // The uploaded blob gets stored in a special upload version to link them to the package/image
func saveAsPackageBlob(ctx context.Context, hsr packages_module.HashedSizeReader, pci *packages_service.PackageCreationInfo) (*packages_model.PackageBlob, error) { //nolint:unparam func saveAsPackageBlob(ctx context.Context, hsr packages_module.HashedSizeReader, pci *packages_service.PackageCreationInfo) (*packages_model.PackageBlob, error) {
pb := packages_service.NewPackageBlob(hsr) pb := packages_service.NewPackageBlob(hsr)
exists := false exists := false

View file

@ -36,7 +36,7 @@ func apiError(ctx *context.Context, status int, obj any) {
}) })
} }
func xmlResponse(ctx *context.Context, status int, obj any) { //nolint:unparam func xmlResponse(ctx *context.Context, status int, obj any) {
ctx.Resp.Header().Set("Content-Type", "application/atom+xml; charset=utf-8") ctx.Resp.Header().Set("Content-Type", "application/atom+xml; charset=utf-8")
ctx.Resp.WriteHeader(status) ctx.Resp.WriteHeader(status)
if _, err := ctx.Resp.Write([]byte(xml.Header)); err != nil { if _, err := ctx.Resp.Write([]byte(xml.Header)); err != nil {

View file

@ -1112,15 +1112,6 @@ func Routes() *web.Route {
m.Post("", reqToken(), reqRepoWriter(unit.TypeCode), mustNotBeArchived, bind(api.CreateTagOption{}), repo.CreateTag) m.Post("", reqToken(), reqRepoWriter(unit.TypeCode), mustNotBeArchived, bind(api.CreateTagOption{}), repo.CreateTag)
m.Delete("/*", reqToken(), reqRepoWriter(unit.TypeCode), mustNotBeArchived, repo.DeleteTag) m.Delete("/*", reqToken(), reqRepoWriter(unit.TypeCode), mustNotBeArchived, repo.DeleteTag)
}, reqRepoReader(unit.TypeCode), context.ReferencesGitRepo(true)) }, reqRepoReader(unit.TypeCode), context.ReferencesGitRepo(true))
m.Group("/tag_protections", func() {
m.Combo("").Get(repo.ListTagProtection).
Post(bind(api.CreateTagProtectionOption{}), mustNotBeArchived, repo.CreateTagProtection)
m.Group("/{id}", func() {
m.Combo("").Get(repo.GetTagProtection).
Patch(bind(api.EditTagProtectionOption{}), mustNotBeArchived, repo.EditTagProtection).
Delete(repo.DeleteTagProtection)
})
}, reqToken(), reqAdmin())
m.Group("/actions", func() { m.Group("/actions", func() {
m.Get("/tasks", repo.ListActionTasks) m.Get("/tasks", repo.ListActionTasks)
}, reqRepoReader(unit.TypeActions), context.ReferencesGitRepo(true)) }, reqRepoReader(unit.TypeActions), context.ReferencesGitRepo(true))

View file

@ -64,7 +64,7 @@ func CompareDiff(ctx *context.APIContext) {
} }
} }
_, headGitRepo, ci, _, _ := parseCompareInfo(ctx, api.CreatePullRequestOption{ _, _, headGitRepo, ci, _, _ := parseCompareInfo(ctx, api.CreatePullRequestOption{
Base: infos[0], Base: infos[0],
Head: infos[1], Head: infos[1],
}) })

View file

@ -406,7 +406,7 @@ func CreatePullRequest(ctx *context.APIContext) {
) )
// Get repo/branch information // Get repo/branch information
headRepo, headGitRepo, compareInfo, baseBranch, headBranch := parseCompareInfo(ctx, form) _, headRepo, headGitRepo, compareInfo, baseBranch, headBranch := parseCompareInfo(ctx, form)
if ctx.Written() { if ctx.Written() {
return return
} }
@ -1051,7 +1051,7 @@ func MergePullRequest(ctx *context.APIContext) {
ctx.Status(http.StatusOK) ctx.Status(http.StatusOK)
} }
func parseCompareInfo(ctx *context.APIContext, form api.CreatePullRequestOption) (*repo_model.Repository, *git.Repository, *git.CompareInfo, string, string) { func parseCompareInfo(ctx *context.APIContext, form api.CreatePullRequestOption) (*user_model.User, *repo_model.Repository, *git.Repository, *git.CompareInfo, string, string) {
baseRepo := ctx.Repo.Repository baseRepo := ctx.Repo.Repository
// Get compared branches information // Get compared branches information
@ -1084,14 +1084,14 @@ func parseCompareInfo(ctx *context.APIContext, form api.CreatePullRequestOption)
} else { } else {
ctx.Error(http.StatusInternalServerError, "GetUserByName", err) ctx.Error(http.StatusInternalServerError, "GetUserByName", err)
} }
return nil, nil, nil, "", "" return nil, nil, nil, nil, "", ""
} }
headBranch = headInfos[1] headBranch = headInfos[1]
// The head repository can also point to the same repo // The head repository can also point to the same repo
isSameRepo = ctx.Repo.Owner.ID == headUser.ID isSameRepo = ctx.Repo.Owner.ID == headUser.ID
} else { } else {
ctx.NotFound() ctx.NotFound()
return nil, nil, nil, "", "" return nil, nil, nil, nil, "", ""
} }
ctx.Repo.PullRequest.SameRepo = isSameRepo ctx.Repo.PullRequest.SameRepo = isSameRepo
@ -1099,7 +1099,7 @@ func parseCompareInfo(ctx *context.APIContext, form api.CreatePullRequestOption)
// Check if base branch is valid. // Check if base branch is valid.
if !ctx.Repo.GitRepo.IsBranchExist(baseBranch) && !ctx.Repo.GitRepo.IsTagExist(baseBranch) { if !ctx.Repo.GitRepo.IsBranchExist(baseBranch) && !ctx.Repo.GitRepo.IsTagExist(baseBranch) {
ctx.NotFound("BaseNotExist") ctx.NotFound("BaseNotExist")
return nil, nil, nil, "", "" return nil, nil, nil, nil, "", ""
} }
// Check if current user has fork of repository or in the same repository. // Check if current user has fork of repository or in the same repository.
@ -1107,7 +1107,7 @@ func parseCompareInfo(ctx *context.APIContext, form api.CreatePullRequestOption)
if headRepo == nil && !isSameRepo { if headRepo == nil && !isSameRepo {
log.Trace("parseCompareInfo[%d]: does not have fork or in same repository", baseRepo.ID) log.Trace("parseCompareInfo[%d]: does not have fork or in same repository", baseRepo.ID)
ctx.NotFound("GetForkedRepo") ctx.NotFound("GetForkedRepo")
return nil, nil, nil, "", "" return nil, nil, nil, nil, "", ""
} }
var headGitRepo *git.Repository var headGitRepo *git.Repository
@ -1118,7 +1118,7 @@ func parseCompareInfo(ctx *context.APIContext, form api.CreatePullRequestOption)
headGitRepo, err = gitrepo.OpenRepository(ctx, headRepo) headGitRepo, err = gitrepo.OpenRepository(ctx, headRepo)
if err != nil { if err != nil {
ctx.Error(http.StatusInternalServerError, "OpenRepository", err) ctx.Error(http.StatusInternalServerError, "OpenRepository", err)
return nil, nil, nil, "", "" return nil, nil, nil, nil, "", ""
} }
} }
@ -1127,7 +1127,7 @@ func parseCompareInfo(ctx *context.APIContext, form api.CreatePullRequestOption)
if err != nil { if err != nil {
headGitRepo.Close() headGitRepo.Close()
ctx.Error(http.StatusInternalServerError, "GetUserRepoPermission", err) ctx.Error(http.StatusInternalServerError, "GetUserRepoPermission", err)
return nil, nil, nil, "", "" return nil, nil, nil, nil, "", ""
} }
if !permBase.CanReadIssuesOrPulls(true) || !permBase.CanRead(unit.TypeCode) { if !permBase.CanReadIssuesOrPulls(true) || !permBase.CanRead(unit.TypeCode) {
if log.IsTrace() { if log.IsTrace() {
@ -1138,7 +1138,7 @@ func parseCompareInfo(ctx *context.APIContext, form api.CreatePullRequestOption)
} }
headGitRepo.Close() headGitRepo.Close()
ctx.NotFound("Can't read pulls or can't read UnitTypeCode") ctx.NotFound("Can't read pulls or can't read UnitTypeCode")
return nil, nil, nil, "", "" return nil, nil, nil, nil, "", ""
} }
// user should have permission to read headrepo's codes // user should have permission to read headrepo's codes
@ -1146,7 +1146,7 @@ func parseCompareInfo(ctx *context.APIContext, form api.CreatePullRequestOption)
if err != nil { if err != nil {
headGitRepo.Close() headGitRepo.Close()
ctx.Error(http.StatusInternalServerError, "GetUserRepoPermission", err) ctx.Error(http.StatusInternalServerError, "GetUserRepoPermission", err)
return nil, nil, nil, "", "" return nil, nil, nil, nil, "", ""
} }
if !permHead.CanRead(unit.TypeCode) { if !permHead.CanRead(unit.TypeCode) {
if log.IsTrace() { if log.IsTrace() {
@ -1157,24 +1157,24 @@ func parseCompareInfo(ctx *context.APIContext, form api.CreatePullRequestOption)
} }
headGitRepo.Close() headGitRepo.Close()
ctx.NotFound("Can't read headRepo UnitTypeCode") ctx.NotFound("Can't read headRepo UnitTypeCode")
return nil, nil, nil, "", "" return nil, nil, nil, nil, "", ""
} }
// Check if head branch is valid. // Check if head branch is valid.
if !headGitRepo.IsBranchExist(headBranch) && !headGitRepo.IsTagExist(headBranch) { if !headGitRepo.IsBranchExist(headBranch) && !headGitRepo.IsTagExist(headBranch) {
headGitRepo.Close() headGitRepo.Close()
ctx.NotFound() ctx.NotFound()
return nil, nil, nil, "", "" return nil, nil, nil, nil, "", ""
} }
compareInfo, err := headGitRepo.GetCompareInfo(repo_model.RepoPath(baseRepo.Owner.Name, baseRepo.Name), baseBranch, headBranch, false, false) compareInfo, err := headGitRepo.GetCompareInfo(repo_model.RepoPath(baseRepo.Owner.Name, baseRepo.Name), baseBranch, headBranch, false, false)
if err != nil { if err != nil {
headGitRepo.Close() headGitRepo.Close()
ctx.Error(http.StatusInternalServerError, "GetCompareInfo", err) ctx.Error(http.StatusInternalServerError, "GetCompareInfo", err)
return nil, nil, nil, "", "" return nil, nil, nil, nil, "", ""
} }
return headRepo, headGitRepo, compareInfo, baseBranch, headBranch return headUser, headRepo, headGitRepo, compareInfo, baseBranch, headBranch
} }
// UpdatePullRequest merge PR's baseBranch into headBranch // UpdatePullRequest merge PR's baseBranch into headBranch

View file

@ -107,7 +107,7 @@ func Search(ctx *context.APIContext) {
// - name: sort // - name: sort
// in: query // in: query
// description: sort repos by attribute. Supported values are // description: sort repos by attribute. Supported values are
// "alpha", "created", "updated", "size", "git_size", "lfs_size", "stars", "forks" and "id". // "alpha", "created", "updated", "size", and "id".
// Default is "alpha" // Default is "alpha"
// type: string // type: string
// - name: order // - name: order
@ -184,7 +184,7 @@ func Search(ctx *context.APIContext) {
if len(sortOrder) == 0 { if len(sortOrder) == 0 {
sortOrder = "asc" sortOrder = "asc"
} }
if searchModeMap, ok := repo_model.OrderByMap[sortOrder]; ok { if searchModeMap, ok := repo_model.SearchOrderByMap[sortOrder]; ok {
if orderBy, ok := searchModeMap[sortMode]; ok { if orderBy, ok := searchModeMap[sortMode]; ok {
opts.OrderBy = orderBy opts.OrderBy = orderBy
} else { } else {

View file

@ -7,13 +7,9 @@ import (
"errors" "errors"
"fmt" "fmt"
"net/http" "net/http"
"strings"
"code.gitea.io/gitea/models" "code.gitea.io/gitea/models"
git_model "code.gitea.io/gitea/models/git"
"code.gitea.io/gitea/models/organization"
repo_model "code.gitea.io/gitea/models/repo" repo_model "code.gitea.io/gitea/models/repo"
user_model "code.gitea.io/gitea/models/user"
api "code.gitea.io/gitea/modules/structs" api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/modules/web"
"code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/routers/api/v1/utils"
@ -318,349 +314,3 @@ func DeleteTag(ctx *context.APIContext) {
ctx.Status(http.StatusNoContent) ctx.Status(http.StatusNoContent)
} }
// ListTagProtection lists tag protections for a repo
func ListTagProtection(ctx *context.APIContext) {
// swagger:operation GET /repos/{owner}/{repo}/tag_protections repository repoListTagProtection
// ---
// summary: List tag protections for 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
// responses:
// "200":
// "$ref": "#/responses/TagProtectionList"
repo := ctx.Repo.Repository
pts, err := git_model.GetProtectedTags(ctx, repo.ID)
if err != nil {
ctx.Error(http.StatusInternalServerError, "GetProtectedTags", err)
return
}
apiPts := make([]*api.TagProtection, len(pts))
for i := range pts {
apiPts[i] = convert.ToTagProtection(ctx, pts[i], repo)
}
ctx.JSON(http.StatusOK, apiPts)
}
// GetTagProtection gets a tag protection
func GetTagProtection(ctx *context.APIContext) {
// swagger:operation GET /repos/{owner}/{repo}/tag_protections/{id} repository repoGetTagProtection
// ---
// summary: Get a specific tag protection for the 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: id
// in: path
// description: id of the tag protect to get
// type: integer
// required: true
// responses:
// "200":
// "$ref": "#/responses/TagProtection"
// "404":
// "$ref": "#/responses/notFound"
repo := ctx.Repo.Repository
id := ctx.ParamsInt64(":id")
pt, err := git_model.GetProtectedTagByID(ctx, id)
if err != nil {
ctx.Error(http.StatusInternalServerError, "GetProtectedTagByID", err)
return
}
if pt == nil || repo.ID != pt.RepoID {
ctx.NotFound()
return
}
ctx.JSON(http.StatusOK, convert.ToTagProtection(ctx, pt, repo))
}
// CreateTagProtection creates a tag protection for a repo
func CreateTagProtection(ctx *context.APIContext) {
// swagger:operation POST /repos/{owner}/{repo}/tag_protections repository repoCreateTagProtection
// ---
// summary: Create a tag protections for a repository
// consumes:
// - application/json
// 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: body
// in: body
// schema:
// "$ref": "#/definitions/CreateTagProtectionOption"
// responses:
// "201":
// "$ref": "#/responses/TagProtection"
// "403":
// "$ref": "#/responses/forbidden"
// "404":
// "$ref": "#/responses/notFound"
// "422":
// "$ref": "#/responses/validationError"
// "423":
// "$ref": "#/responses/repoArchivedError"
form := web.GetForm(ctx).(*api.CreateTagProtectionOption)
repo := ctx.Repo.Repository
namePattern := strings.TrimSpace(form.NamePattern)
if namePattern == "" {
ctx.Error(http.StatusBadRequest, "name_pattern are empty", "name_pattern are empty")
return
}
if len(form.WhitelistUsernames) == 0 && len(form.WhitelistTeams) == 0 {
ctx.Error(http.StatusBadRequest, "both whitelist_usernames and whitelist_teams are empty", "both whitelist_usernames and whitelist_teams are empty")
return
}
pt, err := git_model.GetProtectedTagByNamePattern(ctx, repo.ID, namePattern)
if err != nil {
ctx.Error(http.StatusInternalServerError, "GetProtectTagOfRepo", err)
return
} else if pt != nil {
ctx.Error(http.StatusForbidden, "Create tag protection", "Tag protection already exist")
return
}
var whitelistUsers, whitelistTeams []int64
whitelistUsers, err = user_model.GetUserIDsByNames(ctx, form.WhitelistUsernames, false)
if err != nil {
if user_model.IsErrUserNotExist(err) {
ctx.Error(http.StatusUnprocessableEntity, "User does not exist", err)
return
}
ctx.Error(http.StatusInternalServerError, "GetUserIDsByNames", err)
return
}
if repo.Owner.IsOrganization() {
whitelistTeams, err = organization.GetTeamIDsByNames(ctx, repo.OwnerID, form.WhitelistTeams, false)
if err != nil {
if organization.IsErrTeamNotExist(err) {
ctx.Error(http.StatusUnprocessableEntity, "Team does not exist", err)
return
}
ctx.Error(http.StatusInternalServerError, "GetTeamIDsByNames", err)
return
}
}
protectTag := &git_model.ProtectedTag{
RepoID: repo.ID,
NamePattern: strings.TrimSpace(namePattern),
AllowlistUserIDs: whitelistUsers,
AllowlistTeamIDs: whitelistTeams,
}
if err := git_model.InsertProtectedTag(ctx, protectTag); err != nil {
ctx.Error(http.StatusInternalServerError, "InsertProtectedTag", err)
return
}
pt, err = git_model.GetProtectedTagByID(ctx, protectTag.ID)
if err != nil {
ctx.Error(http.StatusInternalServerError, "GetProtectedTagByID", err)
return
}
if pt == nil || pt.RepoID != repo.ID {
ctx.Error(http.StatusInternalServerError, "New tag protection not found", err)
return
}
ctx.JSON(http.StatusCreated, convert.ToTagProtection(ctx, pt, repo))
}
// EditTagProtection edits a tag protection for a repo
func EditTagProtection(ctx *context.APIContext) {
// swagger:operation PATCH /repos/{owner}/{repo}/tag_protections/{id} repository repoEditTagProtection
// ---
// summary: Edit a tag protections for a repository. Only fields that are set will be changed
// consumes:
// - application/json
// 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: id
// in: path
// description: id of protected tag
// type: integer
// required: true
// - name: body
// in: body
// schema:
// "$ref": "#/definitions/EditTagProtectionOption"
// responses:
// "200":
// "$ref": "#/responses/TagProtection"
// "404":
// "$ref": "#/responses/notFound"
// "422":
// "$ref": "#/responses/validationError"
// "423":
// "$ref": "#/responses/repoArchivedError"
repo := ctx.Repo.Repository
form := web.GetForm(ctx).(*api.EditTagProtectionOption)
id := ctx.ParamsInt64(":id")
pt, err := git_model.GetProtectedTagByID(ctx, id)
if err != nil {
ctx.Error(http.StatusInternalServerError, "GetProtectedTagByID", err)
return
}
if pt == nil || pt.RepoID != repo.ID {
ctx.NotFound()
return
}
if form.NamePattern != nil {
pt.NamePattern = *form.NamePattern
}
var whitelistUsers, whitelistTeams []int64
if form.WhitelistTeams != nil {
if repo.Owner.IsOrganization() {
whitelistTeams, err = organization.GetTeamIDsByNames(ctx, repo.OwnerID, form.WhitelistTeams, false)
if err != nil {
if organization.IsErrTeamNotExist(err) {
ctx.Error(http.StatusUnprocessableEntity, "Team does not exist", err)
return
}
ctx.Error(http.StatusInternalServerError, "GetTeamIDsByNames", err)
return
}
}
pt.AllowlistTeamIDs = whitelistTeams
}
if form.WhitelistUsernames != nil {
whitelistUsers, err = user_model.GetUserIDsByNames(ctx, form.WhitelistUsernames, false)
if err != nil {
if user_model.IsErrUserNotExist(err) {
ctx.Error(http.StatusUnprocessableEntity, "User does not exist", err)
return
}
ctx.Error(http.StatusInternalServerError, "GetUserIDsByNames", err)
return
}
pt.AllowlistUserIDs = whitelistUsers
}
err = git_model.UpdateProtectedTag(ctx, pt)
if err != nil {
ctx.Error(http.StatusInternalServerError, "UpdateProtectedTag", err)
return
}
pt, err = git_model.GetProtectedTagByID(ctx, id)
if err != nil {
ctx.Error(http.StatusInternalServerError, "GetProtectedTagByID", err)
return
}
if pt == nil || pt.RepoID != repo.ID {
ctx.Error(http.StatusInternalServerError, "New tag protection not found", "New tag protection not found")
return
}
ctx.JSON(http.StatusOK, convert.ToTagProtection(ctx, pt, repo))
}
// DeleteTagProtection
func DeleteTagProtection(ctx *context.APIContext) {
// swagger:operation DELETE /repos/{owner}/{repo}/tag_protections/{id} repository repoDeleteTagProtection
// ---
// summary: Delete a specific tag protection for the 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: id
// in: path
// description: id of protected tag
// type: integer
// required: true
// responses:
// "204":
// "$ref": "#/responses/empty"
// "404":
// "$ref": "#/responses/notFound"
repo := ctx.Repo.Repository
id := ctx.ParamsInt64(":id")
pt, err := git_model.GetProtectedTagByID(ctx, id)
if err != nil {
ctx.Error(http.StatusInternalServerError, "GetProtectedTagByID", err)
return
}
if pt == nil || pt.RepoID != repo.ID {
ctx.NotFound()
return
}
err = git_model.DeleteProtectedTag(ctx, pt)
if err != nil {
ctx.Error(http.StatusInternalServerError, "DeleteProtectedTag", err)
return
}
ctx.Status(http.StatusNoContent)
}

View file

@ -184,12 +184,6 @@ type swaggerParameterBodies struct {
// in:body // in:body
CreateTagOption api.CreateTagOption CreateTagOption api.CreateTagOption
// in:body
CreateTagProtectionOption api.CreateTagProtectionOption
// in:body
EditTagProtectionOption api.EditTagProtectionOption
// in:body // in:body
CreateAccessTokenOption api.CreateAccessTokenOption CreateAccessTokenOption api.CreateAccessTokenOption

View file

@ -70,20 +70,6 @@ type swaggerResponseAnnotatedTag struct {
Body api.AnnotatedTag `json:"body"` Body api.AnnotatedTag `json:"body"`
} }
// TagProtectionList
// swagger:response TagProtectionList
type swaggerResponseTagProtectionList struct {
// in:body
Body []api.TagProtection `json:"body"`
}
// TagProtection
// swagger:response TagProtection
type swaggerResponseTagProtection struct {
// in:body
Body api.TagProtection `json:"body"`
}
// Reference // Reference
// swagger:response Reference // swagger:response Reference
type swaggerResponseReference struct { type swaggerResponseReference struct {

View file

@ -46,5 +46,5 @@ type swaggerResponseUserHeatmapData struct {
// swagger:response UserSettings // swagger:response UserSettings
type swaggerResponseUserSettings struct { type swaggerResponseUserSettings struct {
// in:body // in:body
Body api.UserSettings `json:"body"` Body []api.UserSettings `json:"body"`
} }

View file

@ -434,7 +434,7 @@ func preReceiveBranch(ctx *preReceiveContext, oldCommitID, newCommitID string, r
} }
} }
func preReceiveTag(ctx *preReceiveContext, oldCommitID, newCommitID string, refFullName git.RefName) { //nolint:unparam func preReceiveTag(ctx *preReceiveContext, oldCommitID, newCommitID string, refFullName git.RefName) {
if !ctx.AssertCanWriteCode() { if !ctx.AssertCanWriteCode() {
return return
} }
@ -470,7 +470,7 @@ func preReceiveTag(ctx *preReceiveContext, oldCommitID, newCommitID string, refF
} }
} }
func preReceiveFor(ctx *preReceiveContext, oldCommitID, newCommitID string, refFullName git.RefName) { //nolint:unparam func preReceiveFor(ctx *preReceiveContext, oldCommitID, newCommitID string, refFullName git.RefName) {
if !ctx.AssertCreatePullRequest() { if !ctx.AssertCreatePullRequest() {
return return
} }

View file

@ -14,7 +14,6 @@ import (
activities_model "code.gitea.io/gitea/models/activities" activities_model "code.gitea.io/gitea/models/activities"
"code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/modules/base" "code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/cache"
"code.gitea.io/gitea/modules/graceful" "code.gitea.io/gitea/modules/graceful"
"code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/setting"
@ -212,14 +211,6 @@ func SelfCheck(ctx *context.Context) {
ctx.Data["DatabaseCheckHasProblems"] = hasProblem ctx.Data["DatabaseCheckHasProblems"] = hasProblem
} }
elapsed, err := cache.Test()
if err != nil {
ctx.Data["CacheError"] = err
} else if elapsed > cache.SlowCacheThreshold {
ctx.Data["CacheSlow"] = fmt.Sprint(elapsed)
}
ctx.HTML(http.StatusOK, tplSelfCheck) ctx.HTML(http.StatusOK, tplSelfCheck)
} }

View file

@ -12,7 +12,6 @@ import (
system_model "code.gitea.io/gitea/models/system" system_model "code.gitea.io/gitea/models/system"
"code.gitea.io/gitea/modules/base" "code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/cache"
"code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/json" "code.gitea.io/gitea/modules/json"
"code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/log"
@ -43,22 +42,6 @@ func SendTestMail(ctx *context.Context) {
ctx.Redirect(setting.AppSubURL + "/admin/config") ctx.Redirect(setting.AppSubURL + "/admin/config")
} }
// TestCache test the cache settings
func TestCache(ctx *context.Context) {
elapsed, err := cache.Test()
if err != nil {
ctx.Flash.Error(ctx.Tr("admin.config.cache_test_failed", err))
} else {
if elapsed > cache.SlowCacheThreshold {
ctx.Flash.Warning(ctx.Tr("admin.config.cache_test_slow", elapsed))
} else {
ctx.Flash.Info(ctx.Tr("admin.config.cache_test_succeeded", elapsed))
}
}
ctx.Redirect(setting.AppSubURL + "/admin/config")
}
func shadowPasswordKV(cfgItem, splitter string) string { func shadowPasswordKV(cfgItem, splitter string) string {
fields := strings.Split(cfgItem, splitter) fields := strings.Split(cfgItem, splitter)
for i := 0; i < len(fields); i++ { for i := 0; i < len(fields); i++ {
@ -200,7 +183,7 @@ func ChangeConfig(ctx *context.Context) {
value := ctx.FormString("value") value := ctx.FormString("value")
cfg := setting.Config() cfg := setting.Config()
marshalBool := func(v string) (string, error) { //nolint:unparam marshalBool := func(v string) (string, error) {
if b, _ := strconv.ParseBool(v); b { if b, _ := strconv.ParseBool(v); b {
return "true", nil return "true", nil
} }

View file

@ -6,7 +6,6 @@ package explore
import ( import (
"fmt" "fmt"
"net/http" "net/http"
"strings"
"code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/db"
repo_model "code.gitea.io/gitea/models/repo" repo_model "code.gitea.io/gitea/models/repo"
@ -58,18 +57,47 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) {
orderBy db.SearchOrderBy orderBy db.SearchOrderBy
) )
sortOrder := strings.ToLower(ctx.FormString("sort")) sortOrder := ctx.FormString("sort")
if sortOrder == "" { if sortOrder == "" {
sortOrder = setting.UI.ExploreDefaultSort sortOrder = setting.UI.ExploreDefaultSort
} }
ctx.Data["SortType"] = sortOrder
if order, ok := repo_model.OrderByFlatMap[sortOrder]; ok { switch sortOrder {
orderBy = order case "newest":
} else { orderBy = db.SearchOrderByNewest
sortOrder = "recentupdate" case "oldest":
orderBy = db.SearchOrderByOldest
case "leastupdate":
orderBy = db.SearchOrderByLeastUpdated
case "reversealphabetically":
orderBy = db.SearchOrderByAlphabeticallyReverse
case "alphabetically":
orderBy = db.SearchOrderByAlphabetically
case "reversesize":
orderBy = db.SearchOrderBySizeReverse
case "size":
orderBy = db.SearchOrderBySize
case "reversegitsize":
orderBy = db.SearchOrderByGitSizeReverse
case "gitsize":
orderBy = db.SearchOrderByGitSize
case "reverselfssize":
orderBy = db.SearchOrderByLFSSizeReverse
case "lfssize":
orderBy = db.SearchOrderByLFSSize
case "moststars":
orderBy = db.SearchOrderByStarsReverse
case "feweststars":
orderBy = db.SearchOrderByStars
case "mostforks":
orderBy = db.SearchOrderByForksReverse
case "fewestforks":
orderBy = db.SearchOrderByForks
default:
ctx.Data["SortType"] = "recentupdate"
orderBy = db.SearchOrderByRecentUpdated orderBy = db.SearchOrderByRecentUpdated
} }
ctx.Data["SortType"] = sortOrder
keyword := ctx.FormTrim("q") keyword := ctx.FormTrim("q")

View file

@ -39,7 +39,7 @@ func redirectToBadge(ctx *context_module.Context, label, text, color string) {
ctx.Redirect(getBadgeURL(ctx, label, text, color)) ctx.Redirect(getBadgeURL(ctx, label, text, color))
} }
func errorBadge(ctx *context_module.Context, label, text string) { //nolint:unparam func errorBadge(ctx *context_module.Context, label, text string) {
ctx.Redirect(getBadgeURL(ctx, label, text, "crimson")) ctx.Redirect(getBadgeURL(ctx, label, text, "crimson"))
} }

View file

@ -19,8 +19,14 @@ const (
// Contributors render the page to show repository contributors graph // Contributors render the page to show repository contributors graph
func Contributors(ctx *context.Context) { func Contributors(ctx *context.Context) {
ctx.Data["Title"] = ctx.Tr("repo.activity.navbar.contributors") ctx.Data["Title"] = ctx.Tr("repo.activity.navbar.contributors")
ctx.Data["PageIsActivity"] = true ctx.Data["PageIsActivity"] = true
ctx.Data["PageIsContributors"] = true ctx.Data["PageIsContributors"] = true
ctx.PageData["contributionType"] = "commits"
ctx.PageData["repoLink"] = ctx.Repo.RepoLink
ctx.HTML(http.StatusOK, tplContributors) ctx.HTML(http.StatusOK, tplContributors)
} }

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