Merge branch 'forgejo' into upload_with_path_structure

This commit is contained in:
David Rotermund 2025-02-18 14:53:38 +00:00
commit a681ebad20
107 changed files with 6314 additions and 790 deletions

View file

@ -87,6 +87,9 @@ code.gitea.io/gitea/modules/eventsource
Event.String
code.gitea.io/gitea/modules/forgefed
NewForgeUndoLike
ForgeUndoLike.UnmarshalJSON
ForgeUndoLike.Validate
GetItemByType
JSONUnmarshalerFn
NotEmpty
@ -103,9 +106,6 @@ code.gitea.io/gitea/modules/git
openRepositoryWithDefaultContext
ToEntryMode
code.gitea.io/gitea/modules/gitgraph
Parser.Reset
code.gitea.io/gitea/modules/gitrepo
GetBranchCommitID
GetWikiDefaultBranch
@ -224,6 +224,9 @@ code.gitea.io/gitea/services/repository
code.gitea.io/gitea/services/repository/files
ContentType.String
code.gitea.io/gitea/services/repository/gitgraph
Parser.Reset
code.gitea.io/gitea/services/webhook
NewNotifier

View file

@ -28,7 +28,7 @@ jobs:
runs-on: docker
container:
image: data.forgejo.org/renovate/renovate:39.158.2
image: data.forgejo.org/renovate/renovate:39.171.2
steps:
- name: Load renovate repo cache

View file

@ -71,6 +71,7 @@ RUN apk --no-cache add \
git \
curl \
gnupg \
openssh-client \
&& rm -rf /var/cache/apk/*
RUN addgroup \

View file

@ -49,7 +49,7 @@ GOVULNCHECK_PACKAGE ?= golang.org/x/vuln/cmd/govulncheck@v1 # renovate: datasour
DEADCODE_PACKAGE ?= golang.org/x/tools/cmd/deadcode@v0.29.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.17.1 # renovate: datasource=go
RENOVATE_NPM_PACKAGE ?= renovate@39.158.2 # renovate: datasource=docker packageName=data.forgejo.org/renovate/renovate
RENOVATE_NPM_PACKAGE ?= renovate@39.171.2 # renovate: datasource=docker packageName=data.forgejo.org/renovate/renovate
# https://github.com/disposable-email-domains/disposable-email-domains/commits/main/
DISPOSABLE_EMAILS_SHA ?= 0c27e671231d27cf66370034d7f6818037416989 # renovate: ...
@ -127,6 +127,11 @@ FORGEJO_VERSION_API ?= ${FORGEJO_VERSION}
show-version-api:
@echo ${FORGEJO_VERSION_API}
# Strip binaries by default to reduce size, allow overriding for debugging
STRIP ?= 1
ifeq ($(STRIP),1)
LDFLAGS := $(LDFLAGS) -s -w
endif
LDFLAGS := $(LDFLAGS) -X "main.ReleaseVersion=$(RELEASE_VERSION)" -X "main.MakeVersion=$(MAKE_VERSION)" -X "main.Version=$(FORGEJO_VERSION)" -X "main.Tags=$(TAGS)" -X "main.ForgejoVersion=$(FORGEJO_VERSION_API)"
LINUX_ARCHS ?= linux/amd64,linux/386,linux/arm-5,linux/arm-6,linux/arm64
@ -827,7 +832,7 @@ check: test
.PHONY: install $(TAGS_PREREQ)
install: $(wildcard *.go)
CGO_CFLAGS="$(CGO_CFLAGS)" $(GO) install -v -tags '$(TAGS)' -ldflags '-s -w $(LDFLAGS)'
CGO_CFLAGS="$(CGO_CFLAGS)" $(GO) install -v -tags '$(TAGS)' -ldflags '$(LDFLAGS)'
.PHONY: build
build: frontend backend
@ -855,13 +860,13 @@ merge-locales:
@echo "NOT NEEDED: THIS IS A NOOP AS OF Forgejo 7.0 BUT KEPT FOR BACKWARD COMPATIBILITY"
$(EXECUTABLE): $(GO_SOURCES) $(TAGS_PREREQ)
CGO_CFLAGS="$(CGO_CFLAGS)" $(GO) build $(GOFLAGS) $(EXTRA_GOFLAGS) -tags '$(TAGS)' -ldflags '-s -w $(LDFLAGS)' -o $@
CGO_CFLAGS="$(CGO_CFLAGS)" $(GO) build $(GOFLAGS) $(EXTRA_GOFLAGS) -tags '$(TAGS)' -ldflags '$(LDFLAGS)' -o $@
forgejo: $(EXECUTABLE)
ln -f $(EXECUTABLE) forgejo
static-executable: $(GO_SOURCES) $(TAGS_PREREQ)
CGO_CFLAGS="$(CGO_CFLAGS)" $(GO) build $(GOFLAGS) $(EXTRA_GOFLAGS) -tags 'netgo osusergo $(TAGS)' -ldflags '-s -w -linkmode external -extldflags "-static" $(LDFLAGS)' -o $(EXECUTABLE)
CGO_CFLAGS="$(CGO_CFLAGS)" $(GO) build $(GOFLAGS) $(EXTRA_GOFLAGS) -tags 'netgo osusergo $(TAGS)' -ldflags '-linkmode external -extldflags "-static" $(LDFLAGS)' -o $(EXECUTABLE)
.PHONY: release
release: frontend generate release-linux release-copy release-compress vendor release-sources release-check

6
go.mod
View file

@ -26,7 +26,7 @@ require (
github.com/alecthomas/chroma/v2 v2.15.0
github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb
github.com/blevesearch/bleve/v2 v2.4.4
github.com/buildkite/terminal-to-html/v3 v3.16.4
github.com/buildkite/terminal-to-html/v3 v3.16.5
github.com/caddyserver/certmagic v0.21.7
github.com/chi-middleware/proxy v1.1.1
github.com/djherbis/buffer v1.2.0
@ -76,7 +76,7 @@ require (
github.com/meilisearch/meilisearch-go v0.29.0
github.com/mholt/archiver/v3 v3.5.1
github.com/microcosm-cc/bluemonday v1.0.27
github.com/minio/minio-go/v7 v7.0.84
github.com/minio/minio-go/v7 v7.0.85
github.com/msteinert/pam v1.2.0
github.com/nektos/act v0.2.52
github.com/niklasfasching/go-org v1.7.0
@ -103,7 +103,7 @@ require (
go.uber.org/mock v0.4.0
golang.org/x/crypto v0.33.0
golang.org/x/image v0.23.0
golang.org/x/net v0.34.0
golang.org/x/net v0.35.0
golang.org/x/oauth2 v0.24.0
golang.org/x/sync v0.11.0
golang.org/x/sys v0.30.0

12
go.sum
View file

@ -768,8 +768,8 @@ github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
github.com/buildkite/terminal-to-html/v3 v3.16.4 h1:QFYO8IGvRnp7tGgiQb8g9uFU8kY9wOzxsFFx17+yy6Q=
github.com/buildkite/terminal-to-html/v3 v3.16.4/go.mod h1:r/J7cC9c3EzBzP3/wDz0RJLPwv5PUAMp+KF2w+ntMc0=
github.com/buildkite/terminal-to-html/v3 v3.16.5 h1:s/8NElw/Yhm09jKdMq4nY31tjcFMgHukjLfPrqxApcQ=
github.com/buildkite/terminal-to-html/v3 v3.16.5/go.mod h1:PgzeBymbRFC8I2m46Sci3S18AbwonEgpaz3TGhD7EPs=
github.com/caddyserver/certmagic v0.21.7 h1:66KJioPFJwttL43KYSWk7ErSmE6LfaJgCQuhm8Sg6fg=
github.com/caddyserver/certmagic v0.21.7/go.mod h1:LCPG3WLxcnjVKl/xpjzM0gqh0knrKKKiO5WVttX2eEI=
github.com/caddyserver/zerossl v0.1.3 h1:onS+pxp3M8HnHpN5MMbOMyNjmTheJyWRaZYwn+YTAyA=
@ -1263,8 +1263,8 @@ github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcs
github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE=
github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34=
github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM=
github.com/minio/minio-go/v7 v7.0.84 h1:D1HVmAF8JF8Bpi6IU4V9vIEj+8pc+xU88EWMs2yed0E=
github.com/minio/minio-go/v7 v7.0.84/go.mod h1:57YXpvc5l3rjPdhqNrDsvVlY0qPI6UTk1bflAe+9doY=
github.com/minio/minio-go/v7 v7.0.85 h1:9psTLS/NTvC3MWoyjhjXpwcKoNbkongaCSF3PNpSuXo=
github.com/minio/minio-go/v7 v7.0.85/go.mod h1:57YXpvc5l3rjPdhqNrDsvVlY0qPI6UTk1bflAe+9doY=
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@ -1640,8 +1640,8 @@ golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0=
golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k=
golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8=
golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=

View file

@ -219,8 +219,13 @@ func SSHNativeParsePublicKey(keyLine string) (string, int, error) {
return "", 0, fmt.Errorf("ParsePublicKey: %w", err)
}
pkeyType := pkey.Type()
if certPkey, ok := pkey.(*ssh.Certificate); ok {
pkeyType = certPkey.Key.Type()
}
// The ssh library can parse the key, so next we find out what key exactly we have.
switch pkey.Type() {
switch pkeyType {
case ssh.KeyAlgoDSA:
rawPub := struct {
Name string

View file

@ -35,6 +35,7 @@ func Test_SSHParsePublicKey(t *testing.T) {
{"ecdsa-384", false, "ecdsa", 384, "ecdsa-sha2-nistp384 AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBINmioV+XRX1Fm9Qk2ehHXJ2tfVxW30ypUWZw670Zyq5GQfBAH6xjygRsJ5wWsHXBsGYgFUXIHvMKVAG1tpw7s6ax9oA+dJOJ7tj+vhn8joFqT+sg3LYHgZkHrfqryRasQ== nocomment"},
{"ecdsa-sk", true, "ecdsa-sk", 256, "sk-ecdsa-sha2-nistp256@openssh.com AAAAInNrLWVjZHNhLXNoYTItbmlzdHAyNTZAb3BlbnNzaC5jb20AAAAIbmlzdHAyNTYAAABBBGXEEzWmm1dxb+57RoK5KVCL0w2eNv9cqJX2AGGVlkFsVDhOXHzsadS3LTK4VlEbbrDMJdoti9yM8vclA8IeRacAAAAEc3NoOg== nocomment"},
{"ed25519-sk", true, "ed25519-sk", 256, "sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIE7kM1R02+4ertDKGKEDcKG0s+2vyDDcIvceJ0Gqv5f1AAAABHNzaDo= nocomment"},
{"ed25519-cert-v01", true, "ed25519", 256, "ssh-ed25519-cert-v01@openssh.com AAAAIHNzaC1lZDI1NTE5LWNlcnQtdjAxQG9wZW5zc2guY29tAAAAIAlIAPlEj0mYQzQo8Ks0Nm/Ct8ceNkyJSf4DLuF5l7+5AAAAIEuWAoaBo2tT29/oMNnoDfdAPRCIdM2RGapKUhY4nDfLRgPQwfnRoc0AAAABAAAAcHZhdWx0LW9pZGMtNmRhYjdiZDgtNDg5YS00MDFkLTg3ZmItNjdjNTlhMDZkZDkxLTNjNTk2M2YyMGRmMDM3MDkyMzc1YmNiYmNiNzkxY2EyZWIxM2I0NGZhMzc2NTcwMWI0MjMwODU0MWFmNjhkNTgAAAALAAAAB2Zvcmdlam8AAAAAZ6/RUQAAAABn115vAAAAAAAAAAAAAAAAAAACFwAAAAdzc2gtcnNhAAAAAwEAAQAAAgEAySnM/TvD117GyKgOgMatDB2t+fCHORFaWVmH5SaadAzNJ2DfDAauRSLfnim1xdgAOMTzsPEEHH47zyYMjE85o2AiJxrfUBMw3O/7AbNc6+HyLr/txH4+vD9tWQknKnpVWM+3Z9wiHDcOdKRoXCmFZKJH1vxs16GNWjwbrfNiimv7Oi0fadgvTDKX603gpLTuVDXqs9eQFLCONptei86JYBAJqaHvg51k8YUCKt9WFqKAj7BJUWmrDvhv5VFMOsnZieJjqxkoxnpsQNlXfPzxK0vIpJofbYfWwscv/g9WZypHwO1ZR2PqzKm99YrSdr8w5256l0f44vsF0NSP0N7bDQEfYYnRGj8zWTYCBFD+uYF7AxIeaRUpZoTQO8MvCHOLMIDinNgEeCUvNA2v9zHl4BGq+PQjzUKAgJiKj0MZeiCDAmQ22g83ggQlB6BOrBb1fNa/S1cmTbGHQ2oAN358aqkmHVCBhPOyA2Rf65D2M2vzDlUdOsNDUIWAHk7GbwSNGDgcYfTWqtR5fTzp2MJovMh1dDUDXjOvojbhzjJtSy9+rzUYIv18aXdOitzVBgPMWdeVCZFZv4OKF+5MiqxQvedUvfiSjsdxZWLxyT1CJ88G3MzxNMS/Djm86T8h/Oa55bdvFtqpsLfvpIqq0pnXq1V/vF2j1MWwRB5z5Xh/HtEAAAIUAAAADHJzYS1zaGEyLTI1NgAAAgB2I2gzqemQl8/ETxtakALlm/2BpUcbhADcFWuoH6BCPnWHuTSwf3OayM6KXv1PQfL3YFRoi9Afrp8kVFL6DePsmKH+0BUEMz71sZ7v1ty7pwfzibItGnpTbQXhzbEiNYAFoz77rl7oaXF7pV6JNZhj3DVAB5gVA2oN5KRNVxijz+6uyuFJEw1HIl1C7GworvGwZcN7BThTEh3i72/Vntejy9Z8uGVjSFjS0rjRo2oXK1LKN0rVt66p3TmCWHouLkVnOTk0qrhLGlL2HVyo24OYHbkAAObD9b6aMDYlmluk6NsaiTKsSTsvMrbIbjtFQlh7nNyoPhZ0VMwaT1l10pDQ5uxWWZjKGIkz4xM1ZfpBszjJNPo+ivYQnTSjj9LwkbLAT9a/5LawSj80TGcLEMO+0eyPdJsP0wYmOVRFAZeRiBgwb3HrzcF6Wqr8icj1EjYkKSy9YFHGTnFBGknpdh3HGwghRXrCUwAnSM76db9pv4/qowT8LthtJ3dY5Epe0OJ1Tqm+q8bkGH4gB+7uqLSqM5pIHSKLp7lfHQBt1J6xa7H2saiweaWjU+QGTgQ2Lg+uUC5DXJrmm60CeFJ4BoGhUenDlgijbQpjH/l6330PbwefgjWtUK/pqaEA4lCoPyvJ+eF2DbYfPiAIBAFQnhVJJae4AH+XoCt29nb2j30ztg== nocomment"},
}
for _, tc := range testCases {

View file

@ -64,6 +64,7 @@
base_branch: branch2
merge_base: 985f0301dba5e7b34be866819cd15ad3d8f508ee
has_merged: false
allow_maintainer_edit: true
-
id: 6

View file

@ -45,6 +45,7 @@
full_name: ' < U<se>r Tw<o > >< '
email: user2@example.com
keep_email_private: true
keep_pronouns_private: true
email_notifications_preference: enabled
passwd: ZogKvWdyEx:password
passwd_hash_algo: dummy
@ -350,6 +351,7 @@
full_name: User Ten
email: user10@example.com
keep_email_private: false
keep_pronouns_private: true
email_notifications_preference: enabled
passwd: ZogKvWdyEx:password
passwd_hash_algo: dummy

View file

@ -58,40 +58,42 @@ var migrations = []*Migration{
NewMigration("Add the `apply_to_admins` column to the `protected_branch` table", forgejo_v1_22.AddApplyToAdminsSetting),
// v9 -> v10
NewMigration("Add pronouns to user", forgejo_v1_22.AddPronounsToUser),
// v11 -> v12
// v10 -> v11
NewMigration("Add the `created` column to the `issue` table", forgejo_v1_22.AddCreatedToIssue),
// v12 -> v13
// v11 -> v12
NewMigration("Add repo_archive_download_count table", forgejo_v1_22.AddRepoArchiveDownloadCount),
// v13 -> v14
// v12 -> v13
NewMigration("Add `hide_archive_links` column to `release` table", AddHideArchiveLinksToRelease),
// v14 -> v15
// v13 -> v14
NewMigration("Remove Gitea-specific columns from the repository and badge tables", RemoveGiteaSpecificColumnsFromRepositoryAndBadge),
// v15 -> v16
// v14 -> v15
NewMigration("Create the `federation_host` table", CreateFederationHostTable),
// v16 -> v17
// v15 -> v16
NewMigration("Create the `federated_user` table", CreateFederatedUserTable),
// v17 -> v18
// v16 -> v17
NewMigration("Add `normalized_federated_uri` column to `user` table", AddNormalizedFederatedURIToUser),
// v18 -> v19
// v17 -> v18
NewMigration("Create the `following_repo` table", CreateFollowingRepoTable),
// v19 -> v20
// v18 -> v19
NewMigration("Add external_url to attachment table", AddExternalURLColumnToAttachmentTable),
// v20 -> v21
// v19 -> v20
NewMigration("Creating Quota-related tables", CreateQuotaTables),
// v21 -> v22
// v20 -> v21
NewMigration("Add SSH keypair to `pull_mirror` table", AddSSHKeypairToPushMirror),
// v22 -> v23
// v21 -> v22
NewMigration("Add `legacy` to `web_authn_credential` table", AddLegacyToWebAuthnCredential),
// v23 -> v24
// v22 -> v23
NewMigration("Add `delete_branch_after_merge` to `auto_merge` table", AddDeleteBranchAfterMergeToAutoMerge),
// v24 -> v25
// v23 -> v24
NewMigration("Add `purpose` column to `forgejo_auth_token` table", AddPurposeToForgejoAuthToken),
// v25 -> v26
// v24 -> v25
NewMigration("Migrate `secret` column to store keying material", MigrateTwoFactorToKeying),
// v26 -> v27
// v25 -> v26
NewMigration("Add `hash_blake2b` column to `package_blob` table", AddHashBlake2bToPackageBlob),
// v27 -> v28
// v26 -> v27
NewMigration("Add `created_unix` column to `user_redirect` table", AddCreatedUnixToRedirect),
// v27 -> v28
NewMigration("Add pronoun privacy settings to user", AddHidePronounsOptionToUser),
}
// GetCurrentDBVersion returns the current Forgejo database version.

View file

@ -0,0 +1,15 @@
// Copyright 2024 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package forgejo_migrations //nolint:revive
import "xorm.io/xorm"
func AddHidePronounsOptionToUser(x *xorm.Engine) error {
type User struct {
ID int64 `xorm:"pk autoincr"`
KeepPronounsPrivate bool `xorm:"NOT NULL DEFAULT false"`
}
return x.Sync(&User{})
}

View file

@ -154,6 +154,7 @@ type User struct {
DiffViewStyle string `xorm:"NOT NULL DEFAULT ''"`
Theme string `xorm:"NOT NULL DEFAULT ''"`
KeepActivityPrivate bool `xorm:"NOT NULL DEFAULT false"`
KeepPronounsPrivate bool `xorm:"NOT NULL DEFAULT false"`
EnableRepoUnitHints bool `xorm:"NOT NULL DEFAULT true"`
}
@ -500,6 +501,16 @@ func (u *User) GetCompleteName() string {
return u.Name
}
// GetPronouns returns an empty string, if the user has set to keep his
// pronouns private from non-logged in users, otherwise the pronouns
// are returned.
func (u *User) GetPronouns(signed bool) string {
if u.KeepPronounsPrivate && !signed {
return ""
}
return u.Pronouns
}
func gitSafeName(name string) string {
return strings.TrimSpace(strings.NewReplacer("\n", "", "<", "", ">", "").Replace(name))
}
@ -854,48 +865,46 @@ func countUsers(ctx context.Context, opts *CountUserFilter) int64 {
// VerifyUserActiveCode verifies that the code is valid for the given purpose for this user.
// If delete is specified, the token will be deleted.
func VerifyUserAuthorizationToken(ctx context.Context, code string, purpose auth.AuthorizationPurpose, delete bool) (*User, error) {
func VerifyUserAuthorizationToken(ctx context.Context, code string, purpose auth.AuthorizationPurpose) (user *User, deleteToken func() error, err error) {
lookupKey, validator, found := strings.Cut(code, ":")
if !found {
return nil, nil
return nil, nil, nil
}
authToken, err := auth.FindAuthToken(ctx, lookupKey, purpose)
if err != nil {
if errors.Is(err, util.ErrNotExist) {
return nil, nil
return nil, nil, nil
}
return nil, err
return nil, nil, err
}
if authToken.IsExpired() {
return nil, auth.DeleteAuthToken(ctx, authToken)
return nil, nil, auth.DeleteAuthToken(ctx, authToken)
}
rawValidator, err := hex.DecodeString(validator)
if err != nil {
return nil, err
return nil, nil, err
}
if subtle.ConstantTimeCompare([]byte(authToken.HashedValidator), []byte(auth.HashValidator(rawValidator))) == 0 {
return nil, errors.New("validator doesn't match")
return nil, nil, errors.New("validator doesn't match")
}
u, err := GetUserByID(ctx, authToken.UID)
if err != nil {
if IsErrUserNotExist(err) {
return nil, nil
return nil, nil, nil
}
return nil, err
return nil, nil, err
}
if delete {
if err := auth.DeleteAuthToken(ctx, authToken); err != nil {
return nil, err
}
deleteToken = func() error {
return auth.DeleteAuthToken(ctx, authToken)
}
return u, nil
return u, deleteToken, nil
}
// ValidateUser check if user is valid to insert / update into database

View file

@ -756,13 +756,13 @@ func TestVerifyUserAuthorizationToken(t *testing.T) {
assert.True(t, ok)
t.Run("Wrong purpose", func(t *testing.T) {
u, err := user_model.VerifyUserAuthorizationToken(db.DefaultContext, code, auth.PasswordReset, false)
u, _, err := user_model.VerifyUserAuthorizationToken(db.DefaultContext, code, auth.PasswordReset)
require.NoError(t, err)
assert.Nil(t, u)
})
t.Run("No delete", func(t *testing.T) {
u, err := user_model.VerifyUserAuthorizationToken(db.DefaultContext, code, auth.UserActivation, false)
u, _, err := user_model.VerifyUserAuthorizationToken(db.DefaultContext, code, auth.UserActivation)
require.NoError(t, err)
assert.EqualValues(t, user.ID, u.ID)
@ -772,9 +772,10 @@ func TestVerifyUserAuthorizationToken(t *testing.T) {
})
t.Run("Delete", func(t *testing.T) {
u, err := user_model.VerifyUserAuthorizationToken(db.DefaultContext, code, auth.UserActivation, true)
u, deleteToken, err := user_model.VerifyUserAuthorizationToken(db.DefaultContext, code, auth.UserActivation)
require.NoError(t, err)
assert.EqualValues(t, user.ID, u.ID)
require.NoError(t, deleteToken())
authToken, err := auth.FindAuthToken(db.DefaultContext, lookupKey, auth.UserActivation)
require.ErrorIs(t, err, util.ErrNotExist)
@ -795,3 +796,42 @@ func TestGetInactiveUsers(t *testing.T) {
require.NoError(t, err)
require.Empty(t, users)
}
func TestPronounsPrivacy(t *testing.T) {
require.NoError(t, unittest.PrepareTestDatabase())
t.Run("EmptyPronounsIfNoneSet", func(t *testing.T) {
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
user.Pronouns = ""
user.KeepPronounsPrivate = false
assert.Equal(t, "", user.GetPronouns(false))
})
t.Run("EmptyPronounsIfSetButPrivateAndNotLoggedIn", func(t *testing.T) {
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
user.Pronouns = "any"
user.KeepPronounsPrivate = true
assert.Equal(t, "", user.GetPronouns(false))
})
t.Run("ReturnPronounsIfSetAndNotPrivateAndNotLoggedIn", func(t *testing.T) {
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
user.Pronouns = "any"
user.KeepPronounsPrivate = false
assert.Equal(t, "any", user.GetPronouns(false))
})
t.Run("ReturnPronounsIfSetAndPrivateAndLoggedIn", func(t *testing.T) {
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
user.Pronouns = "any"
user.KeepPronounsPrivate = false
assert.Equal(t, "any", user.GetPronouns(true))
})
t.Run("ReturnPronounsIfSetAndNotPrivateAndLoggedIn", func(t *testing.T) {
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
user.Pronouns = "any"
user.KeepPronounsPrivate = true
assert.Equal(t, "any", user.GetPronouns(true))
})
}

View file

@ -21,8 +21,8 @@ type ForgeLike struct {
func NewForgeLike(actorIRI, objectIRI string, startTime time.Time) (ForgeLike, error) {
result := ForgeLike{}
result.Type = ap.LikeType
result.Actor = ap.IRI(actorIRI) // That's us, a User
result.Object = ap.IRI(objectIRI) // That's them, a Repository
result.Actor = ap.IRI(actorIRI)
result.Object = ap.IRI(objectIRI)
result.StartTime = startTime
if valid, err := validation.IsValid(result); !valid {
return ForgeLike{}, err
@ -46,20 +46,23 @@ func (like ForgeLike) Validate() []string {
var result []string
result = append(result, validation.ValidateNotEmpty(string(like.Type), "type")...)
result = append(result, validation.ValidateOneOf(string(like.Type), []any{"Like"}, "type")...)
if like.Actor == nil {
result = append(result, "Actor should not be nil.")
} else {
result = append(result, validation.ValidateNotEmpty(like.Actor.GetID().String(), "actor")...)
}
if like.Object == nil {
result = append(result, "Object should not be nil.")
} else {
result = append(result, validation.ValidateNotEmpty(like.Object.GetID().String(), "object")...)
}
result = append(result, validation.ValidateNotEmpty(like.StartTime.String(), "startTime")...)
if like.StartTime.IsZero() {
result = append(result, "StartTime was invalid.")
}
if like.Object == nil {
result = append(result, "Object should not be nil.")
} else {
result = append(result, validation.ValidateNotEmpty(like.Object.GetID().String(), "object")...)
}
return result
}

View file

@ -16,11 +16,11 @@ import (
)
func Test_NewForgeLike(t *testing.T) {
want := []byte(`{"type":"Like","startTime":"2024-03-07T00:00:00Z","actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1","object":"https://codeberg.org/api/v1/activitypub/repository-id/1"}`)
actorIRI := "https://repo.prod.meissa.de/api/v1/activitypub/user-id/1"
objectIRI := "https://codeberg.org/api/v1/activitypub/repository-id/1"
want := []byte(`{"type":"Like","startTime":"2024-03-27T00:00:00Z","actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1","object":"https://codeberg.org/api/v1/activitypub/repository-id/1"}`)
startTime, _ := time.Parse("2006-Jan-02", "2024-Mar-27")
startTime, _ := time.Parse("2006-Jan-02", "2024-Mar-07")
sut, err := NewForgeLike(actorIRI, objectIRI, startTime)
if err != nil {
t.Errorf("unexpected error: %v\n", err)
@ -84,7 +84,6 @@ func Test_LikeUnmarshalJSON(t *testing.T) {
wantErr error
}
//revive:disable
tests := map[string]testPair{
"with ID": {
item: []byte(`{"type":"Like","actor":"https://repo.prod.meissa.de/api/activitypub/user-id/1","object":"https://codeberg.org/api/activitypub/repository-id/1"}`),
@ -100,10 +99,9 @@ func Test_LikeUnmarshalJSON(t *testing.T) {
"invalid": {
item: []byte(`{"type":"Invalid","actor":"https://repo.prod.meissa.de/api/activitypub/user-id/1","object":"https://codeberg.org/api/activitypub/repository-id/1"`),
want: &ForgeLike{},
wantErr: fmt.Errorf("cannot parse JSON:"),
wantErr: fmt.Errorf("cannot parse JSON"),
},
}
//revive:enable
for name, test := range tests {
t.Run(name, func(t *testing.T) {
@ -120,7 +118,9 @@ func Test_LikeUnmarshalJSON(t *testing.T) {
}
}
func TestActivityValidation(t *testing.T) {
func Test_ForgeLikeValidation(t *testing.T) {
// Successful
sut := new(ForgeLike)
sut.UnmarshalJSON([]byte(`{"type":"Like",
"actor":"https://repo.prod.meissa.de/api/activitypub/user-id/1",
@ -130,35 +130,37 @@ func TestActivityValidation(t *testing.T) {
t.Errorf("sut expected to be valid: %v\n", sut.Validate())
}
// Errors
sut.UnmarshalJSON([]byte(`{"actor":"https://repo.prod.meissa.de/api/activitypub/user-id/1",
"object":"https://codeberg.org/api/activitypub/repository-id/1",
"startTime": "2014-12-31T23:00:00-08:00"}`))
if sut.Validate()[0] != "type should not be empty" {
t.Errorf("validation error expected but was: %v\n", sut.Validate()[0])
if err := validateAndCheckError(sut, "type should not be empty"); err != nil {
t.Error(err)
}
sut.UnmarshalJSON([]byte(`{"type":"bad-type",
"actor":"https://repo.prod.meissa.de/api/activitypub/user-id/1",
"object":"https://codeberg.org/api/activitypub/repository-id/1",
"startTime": "2014-12-31T23:00:00-08:00"}`))
if sut.Validate()[0] != "Value bad-type is not contained in allowed values [Like]" {
t.Errorf("validation error expected but was: %v\n", sut.Validate()[0])
if err := validateAndCheckError(sut, "Value bad-type is not contained in allowed values [Like]"); err != nil {
t.Error(err)
}
sut.UnmarshalJSON([]byte(`{"type":"Like",
"actor":"https://repo.prod.meissa.de/api/activitypub/user-id/1",
"object":"https://codeberg.org/api/activitypub/repository-id/1",
"startTime": "not a date"}`))
if sut.Validate()[0] != "StartTime was invalid." {
t.Errorf("validation error expected but was: %v\n", sut.Validate())
"object":"https://codeberg.org/api/activitypub/repository-id/1",
"startTime": "not a date"}`))
if err := validateAndCheckError(sut, "StartTime was invalid."); err != nil {
t.Error(err)
}
sut.UnmarshalJSON([]byte(`{"type":"Wrong",
"actor":"https://repo.prod.meissa.de/api/activitypub/user-id/1",
"object":"https://codeberg.org/api/activitypub/repository-id/1",
"startTime": "2014-12-31T23:00:00-08:00"}`))
if sut.Validate()[0] != "Value Wrong is not contained in allowed values [Like]" {
t.Errorf("validation error expected but was: %v\n", sut.Validate())
"object":"https://codeberg.org/api/activitypub/repository-id/1",
"startTime": "2014-12-31T23:00:00-08:00"}`))
if err := validateAndCheckError(sut, "Value Wrong is not contained in allowed values [Like]"); err != nil {
t.Error(err)
}
}
@ -166,6 +168,6 @@ func TestActivityValidation_Attack(t *testing.T) {
sut := new(ForgeLike)
sut.UnmarshalJSON([]byte(`{rubbish}`))
if len(sut.Validate()) != 5 {
t.Errorf("5 validateion errors expected but was: %v\n", len(sut.Validate()))
t.Errorf("5 validation errors expected but was: %v\n", len(sut.Validate()))
}
}

View file

@ -0,0 +1,80 @@
// Copyright 2023, 2024 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package forgefed
import (
"time"
"code.gitea.io/gitea/modules/validation"
ap "github.com/go-ap/activitypub"
)
// ForgeLike activity data type
// swagger:model
type ForgeUndoLike struct {
// swagger:ignore
ap.Activity
}
func NewForgeUndoLike(actorIRI, objectIRI string, startTime time.Time) (ForgeUndoLike, error) {
result := ForgeUndoLike{}
result.Type = ap.UndoType
result.Actor = ap.IRI(actorIRI)
result.StartTime = startTime
like := ap.Activity{}
like.Type = ap.LikeType
like.Actor = ap.IRI(actorIRI)
like.Object = ap.IRI(objectIRI)
result.Object = &like
if valid, err := validation.IsValid(result); !valid {
return ForgeUndoLike{}, err
}
return result, nil
}
func (undo *ForgeUndoLike) UnmarshalJSON(data []byte) error {
return undo.Activity.UnmarshalJSON(data)
}
func (undo ForgeUndoLike) Validate() []string {
var result []string
result = append(result, validation.ValidateNotEmpty(string(undo.Type), "type")...)
result = append(result, validation.ValidateOneOf(string(undo.Type), []any{"Undo"}, "type")...)
if undo.Actor == nil {
result = append(result, "Actor should not be nil.")
} else {
result = append(result, validation.ValidateNotEmpty(undo.Actor.GetID().String(), "actor")...)
}
result = append(result, validation.ValidateNotEmpty(undo.StartTime.String(), "startTime")...)
if undo.StartTime.IsZero() {
result = append(result, "StartTime was invalid.")
}
if undo.Object == nil {
result = append(result, "object should not be empty.")
} else if activity, ok := undo.Object.(*ap.Activity); !ok {
result = append(result, "object is not of type Activity")
} else {
result = append(result, validation.ValidateNotEmpty(string(activity.Type), "type")...)
result = append(result, validation.ValidateOneOf(string(activity.Type), []any{"Like"}, "type")...)
if activity.Actor == nil {
result = append(result, "Object.Actor should not be nil.")
} else {
result = append(result, validation.ValidateNotEmpty(activity.Actor.GetID().String(), "actor")...)
}
if activity.Object == nil {
result = append(result, "Object.Object should not be nil.")
} else {
result = append(result, validation.ValidateNotEmpty(activity.Object.GetID().String(), "object")...)
}
}
return result
}

View file

@ -0,0 +1,246 @@
// Copyright 2023, 2024 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package forgefed
import (
"fmt"
"reflect"
"strings"
"testing"
"time"
"code.gitea.io/gitea/modules/validation"
ap "github.com/go-ap/activitypub"
)
func Test_NewForgeUndoLike(t *testing.T) {
actorIRI := "https://repo.prod.meissa.de/api/v1/activitypub/user-id/1"
objectIRI := "https://codeberg.org/api/v1/activitypub/repository-id/1"
want := []byte(`{"type":"Undo","startTime":"2024-03-27T00:00:00Z",` +
`"actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1",` +
`"object":{` +
`"type":"Like",` +
`"actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1",` +
`"object":"https://codeberg.org/api/v1/activitypub/repository-id/1"}}`)
startTime, _ := time.Parse("2006-Jan-02", "2024-Mar-27")
sut, err := NewForgeUndoLike(actorIRI, objectIRI, startTime)
if err != nil {
t.Errorf("unexpected error: %v\n", err)
}
if valid, _ := validation.IsValid(sut); !valid {
t.Errorf("sut expected to be valid: %v\n", sut.Validate())
}
got, err := sut.MarshalJSON()
if err != nil {
t.Errorf("MarshalJSON() error = \"%v\"", err)
return
}
if !reflect.DeepEqual(got, want) {
t.Errorf("MarshalJSON() got = %q, want %q", got, want)
}
}
func Test_UndoLikeMarshalJSON(t *testing.T) {
type testPair struct {
item ForgeUndoLike
want []byte
wantErr error
}
startTime, _ := time.Parse("2006-Jan-02", "2024-Mar-27")
like, _ := NewForgeLike("https://repo.prod.meissa.de/api/v1/activitypub/user-id/1", "https://codeberg.org/api/v1/activitypub/repository-id/1", startTime)
tests := map[string]testPair{
"empty": {
item: ForgeUndoLike{},
want: nil,
},
"valid": {
item: ForgeUndoLike{
Activity: ap.Activity{
StartTime: startTime,
Actor: ap.IRI("https://repo.prod.meissa.de/api/v1/activitypub/user-id/1"),
Type: "Undo",
Object: like,
},
},
want: []byte(`{"type":"Undo",` +
`"startTime":"2024-03-27T00:00:00Z",` +
`"actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1",` +
`"object":{` +
`"type":"Like",` +
`"startTime":"2024-03-27T00:00:00Z",` +
`"actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1",` +
`"object":"https://codeberg.org/api/v1/activitypub/repository-id/1"}}`),
},
}
for name, tt := range tests {
t.Run(name, func(t *testing.T) {
got, err := tt.item.MarshalJSON()
if (err != nil || tt.wantErr != nil) && tt.wantErr.Error() != err.Error() {
t.Errorf("MarshalJSON() error = \"%v\", wantErr \"%v\"", err, tt.wantErr)
return
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("MarshalJSON() got = %q\nwant %q", got, tt.want)
}
})
}
}
func Test_UndoLikeUnmarshalJSON(t *testing.T) {
type testPair struct {
item []byte
want *ForgeUndoLike
wantErr error
}
startTime, _ := time.Parse("2006-Jan-02", "2024-Mar-27")
like, _ := NewForgeLike("https://repo.prod.meissa.de/api/v1/activitypub/user-id/1", "https://codeberg.org/api/v1/activitypub/repository-id/1", startTime)
tests := map[string]testPair{
"valid": {
item: []byte(`{"type":"Undo",` +
`"startTime":"2024-03-27T00:00:00Z",` +
`"actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1",` +
`"object":{` +
`"type":"Like",` +
`"startTime":"2024-03-27T00:00:00Z",` +
`"actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1",` +
`"object":"https://codeberg.org/api/v1/activitypub/repository-id/1"}}`),
want: &ForgeUndoLike{
Activity: ap.Activity{
StartTime: startTime,
Actor: ap.IRI("https://repo.prod.meissa.de/api/v1/activitypub/user-id/1"),
Type: "Undo",
Object: like,
},
},
wantErr: nil,
},
"invalid": {
item: []byte(`invalid JSON`),
want: nil,
wantErr: fmt.Errorf("cannot parse JSON"),
},
}
for name, test := range tests {
t.Run(name, func(t *testing.T) {
got := new(ForgeUndoLike)
err := got.UnmarshalJSON(test.item)
if test.wantErr != nil {
if err == nil {
t.Errorf("UnmarshalJSON() error = nil, wantErr \"%v\"", test.wantErr)
} else if !strings.Contains(err.Error(), test.wantErr.Error()) {
t.Errorf("UnmarshalJSON() error = \"%v\", wantErr \"%v\"", err, test.wantErr)
}
return
}
remarshalledgot, _ := got.MarshalJSON()
remarshalledwant, _ := test.want.MarshalJSON()
if !reflect.DeepEqual(remarshalledgot, remarshalledwant) {
t.Errorf("UnmarshalJSON() got = %#v\nwant %#v", got, test.want)
}
})
}
}
func TestActivityValidationUndo(t *testing.T) {
sut := new(ForgeUndoLike)
_ = sut.UnmarshalJSON([]byte(`
{"type":"Undo",
"startTime":"2024-03-27T00:00:00Z",
"actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1",
"object":{
"type":"Like",
"actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1",
"object":"https://codeberg.org/api/v1/activitypub/repository-id/1"}}`))
if res, _ := validation.IsValid(sut); !res {
t.Errorf("sut expected to be valid: %v\n", sut.Validate())
}
_ = sut.UnmarshalJSON([]byte(`
{"startTime":"2024-03-27T00:00:00Z",
"actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1",
"object":{
"type":"Like",
"startTime":"2024-03-27T00:00:00Z",
"actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1",
"object":"https://codeberg.org/api/v1/activitypub/repository-id/1"}}`))
if err := validateAndCheckError(sut, "type should not be empty"); err != nil {
t.Error(*err)
}
_ = sut.UnmarshalJSON([]byte(`
{"type":"Undo",
"startTime":"2024-03-27T00:00:00Z",
"object":{
"type":"Like",
"actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1",
"object":"https://codeberg.org/api/v1/activitypub/repository-id/1"}}`))
if err := validateAndCheckError(sut, "Actor should not be nil."); err != nil {
t.Error(*err)
}
_ = sut.UnmarshalJSON([]byte(`
{"type":"Undo",
"startTime":"2024-03-27T00:00:00Z",
"actor":"string",
"object":{
"type":"Like",
"actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1",
"object":"https://codeberg.org/api/v1/activitypub/repository-id/1"}}`))
if err := validateAndCheckError(sut, "Actor should not be nil."); err != nil {
t.Error(*err)
}
_ = sut.UnmarshalJSON([]byte(`
{"type":"Undo",
"startTime":"2024-03-27T00:00:00Z",
"actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1"
}`))
if err := validateAndCheckError(sut, "object should not be empty."); err != nil {
t.Error(*err)
}
_ = sut.UnmarshalJSON([]byte(`
{"type":"Undo",
"startTime":"2024-03-27T00:00:00Z",
"actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1",
"object":{
"startTime":"2024-03-27T00:00:00Z",
"actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1",
"object":"https://codeberg.org/api/v1/activitypub/repository-id/1"}}`))
if err := validateAndCheckError(sut, "object is not of type Activity"); err != nil {
t.Error(*err)
}
_ = sut.UnmarshalJSON([]byte(`
{"type":"Undo",
"startTime":"2024-03-27T00:00:00Z",
"actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1",
"object":{
"type":"Like",
"object":""}}`))
if err := validateAndCheckError(sut, "Object.Actor should not be nil."); err != nil {
t.Error(*err)
}
_ = sut.UnmarshalJSON([]byte(`
{"type":"Undo",
"startTime":"2024-03-27T00:00:00Z",
"actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1",
"object":{
"type":"Like",
"startTime":"2024-03-27T00:00:00Z",
"actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1"}}`))
if err := validateAndCheckError(sut, "Object.Object should not be nil."); err != nil {
t.Error(*err)
}
}

View file

@ -0,0 +1,23 @@
// Copyright 2023, 2024 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package forgefed
import (
"fmt"
"code.gitea.io/gitea/modules/validation"
)
func validateAndCheckError(subject validation.Validateable, expectedError string) *string {
errors := subject.Validate()
err := errors[0]
if len(errors) < 1 {
val := "Validation error should have been returned, but was not."
return &val
} else if err != expectedError {
val := fmt.Sprintf("Validation error should be [%v] but was: %v\n", expectedError, err)
return &val
}
return nil
}

View file

@ -1,4 +1,5 @@
// Copyright 2023 The Gitea Authors. All rights reserved.
// Copyright 2025 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package repository
@ -107,6 +108,9 @@ func getLicensePlaceholder(name string) *licensePlaceholder {
}
// Other special placeholders can be added here.
} else if name == "BSD-4-Clause" {
ret.Owner = append(ret.Owner, "COPYRIGHT HOLDER")
ret.Owner = append(ret.Owner, "the organization")
}
return ret
}

View file

@ -1,4 +1,5 @@
// Copyright 2023 The Gitea Authors. All rights reserved.
// Copyright 2025 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package repository
@ -170,6 +171,31 @@ Copyright (C) 2023 by Gitea teabot@gitea.io
...
... THE AUTHOR BE LIABLE FOR ...
`,
},
{
name: "BSD-4-Clause",
args: args{
name: "BSD-4-Clause",
values: &LicenseValues{Year: "2025", Owner: "Forgejo", Email: "hello@forgejo.org", Repo: "forgejo"},
origin: `
Copyright (c) <year> <owner>. All rights reserved.
... includes software developed by the organization.
... Neither the name of the copyright holder nor
... PROVIDED BY COPYRIGHT HOLDER "AS IS" ... NO EVENT SHALL COPYRIGHT HOLDER BE LIABLE ...
`,
},
want: `
Copyright (c) 2025 Forgejo. All rights reserved.
... includes software developed by Forgejo.
... Neither the name of the copyright holder nor
... PROVIDED BY Forgejo "AS IS" ... NO EVENT SHALL Forgejo BE LIABLE ...
`,
},
}

View file

@ -84,6 +84,7 @@ type UserSettings struct {
EnableRepoUnitHints bool `json:"enable_repo_unit_hints"`
// Privacy
HideEmail bool `json:"hide_email"`
HidePronouns bool `json:"hide_pronouns"`
HideActivity bool `json:"hide_activity"`
}
@ -101,6 +102,7 @@ type UserSettingsOptions struct {
EnableRepoUnitHints *bool `json:"enable_repo_unit_hints"`
// Privacy
HideEmail *bool `json:"hide_email"`
HidePronouns *bool `json:"hide_pronouns"`
HideActivity *bool `json:"hide_activity"`
}

119
options/gitignore/Flutter Normal file
View file

@ -0,0 +1,119 @@
# Miscellaneous
*.class
*.lock
*.log
*.pyc
*.swp
.buildlog/
.history
# Flutter repo-specific
/bin/cache/
/bin/internal/bootstrap.bat
/bin/internal/bootstrap.sh
/bin/mingit/
/dev/benchmarks/mega_gallery/
/dev/bots/.recipe_deps
/dev/bots/android_tools/
/dev/devicelab/ABresults*.json
/dev/docs/doc/
/dev/docs/flutter.docs.zip
/dev/docs/lib/
/dev/docs/pubspec.yaml
/dev/integration_tests/**/xcuserdata
/dev/integration_tests/**/Pods
/packages/flutter/coverage/
version
analysis_benchmark.json
# packages file containing multi-root paths
.packages.generated
# Flutter/Dart/Pub related
**/doc/api/
.dart_tool/
.flutter-plugins
.flutter-plugins-dependencies
**/generated_plugin_registrant.dart
.packages
.pub-preload-cache/
.pub/
build/
flutter_*.png
linked_*.ds
unlinked.ds
unlinked_spec.ds
# Android related
**/android/**/gradle-wrapper.jar
.gradle/
**/android/captures/
**/android/gradlew
**/android/gradlew.bat
**/android/local.properties
**/android/**/GeneratedPluginRegistrant.java
**/android/key.properties
*.jks
# iOS/XCode related
**/ios/**/*.mode1v3
**/ios/**/*.mode2v3
**/ios/**/*.moved-aside
**/ios/**/*.pbxuser
**/ios/**/*.perspectivev3
**/ios/**/*sync/
**/ios/**/.sconsign.dblite
**/ios/**/.tags*
**/ios/**/.vagrant/
**/ios/**/DerivedData/
**/ios/**/Icon?
**/ios/**/Pods/
**/ios/**/.symlinks/
**/ios/**/profile
**/ios/**/xcuserdata
**/ios/.generated/
**/ios/Flutter/.last_build_id
**/ios/Flutter/App.framework
**/ios/Flutter/Flutter.framework
**/ios/Flutter/Flutter.podspec
**/ios/Flutter/Generated.xcconfig
**/ios/Flutter/ephemeral
**/ios/Flutter/app.flx
**/ios/Flutter/app.zip
**/ios/Flutter/flutter_assets/
**/ios/Flutter/flutter_export_environment.sh
**/ios/ServiceDefinitions.json
**/ios/Runner/GeneratedPluginRegistrant.*
# macOS
**/Flutter/ephemeral/
**/Pods/
**/macos/Flutter/GeneratedPluginRegistrant.swift
**/macos/Flutter/ephemeral
**/xcuserdata/
# Windows
**/windows/flutter/generated_plugin_registrant.cc
**/windows/flutter/generated_plugin_registrant.h
**/windows/flutter/generated_plugins.cmake
# Linux
**/linux/flutter/generated_plugin_registrant.cc
**/linux/flutter/generated_plugin_registrant.h
**/linux/flutter/generated_plugins.cmake
# Coverage
coverage/
# Symbols
app.*.symbols
# Exceptions to above rules.
!**/ios/**/default.mode1v3
!**/ios/**/default.mode2v3
!**/ios/**/default.pbxuser
!**/ios/**/default.perspectivev3
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
!/dev/ci/**/Gemfile.lock

View file

@ -1,3 +1,6 @@
# Ignore build outputs from performing a nix-build or `nix build` command
result
result-*
# Ignore automatically generated direnv output
.direnv

View file

@ -0,0 +1,16 @@
# Excludes Obsidian workspace cache and plugins. All notes and core obsidian
# configuration files are tracked by Git.
# The current application UI state (DOM layout, recently-opened files, etc.) is
# stored in these files (separate for desktop and mobile) so you can resume
# your session seamlessly after a restart. If you want to track UI state, use
# the Workspaces core plugin instead of relying on these files.
.obsidian/workspace.json
.obsidian/workspace-mobile.json
# Obsidian plugins are stored under .obsidian/plugins/$plugin_name. They
# contain metadata (manifest.json), application code (main.js), stylesheets
# (styles.css), and user-configuration data (data.json).
# We want to exclude all plugin-related files, so we can exclude everything
# under this directory.
.obsidian/plugins/**/*

View file

@ -0,0 +1,38 @@
# Excludes Obsidian workspace cache and plugin code, but retains plugin
# configuration. All notes and user-controlled configuration files are tracked
# by Git.
#
# !!! WARNING !!!
#
# Community plugins may store sensitive secrets in their data.json files. By
# including these files, those secrets may be tracked in your Git repository.
#
# To ignore configurations for specific plugins, add a line like this after the
# contents of this file (order is important):
# .obsidian/plugins/{{plugin_name}}/data.json
#
# Alternatively, ensure that you are treating your entire Git repository as
# sensitive data, since it may contain secrets, or may have contained them in
# past commits. Understand your threat profile, and make the decision
# appropriate for yourself. If in doubt, err on the side of not including
# plugin configuration. Use one of the alternative gitignore files instead:
# * NotesOnly.gitignore
# * NotesAndCoreConfiguration.gitignore
# The current application UI state (DOM layout, recently-opened files, etc.) is
# stored in these files (separate for desktop and mobile) so you can resume
# your session seamlessly after a restart. If you want to track UI state, use
# the Workspaces core plugin instead of relying on these files.
.obsidian/workspace.json
.obsidian/workspace-mobile.json
# Obsidian plugins are stored under .obsidian/plugins/$plugin_name. They
# contain metadata (manifest.json), application code (main.js), stylesheets
# (styles.css), and user-configuration data (data.json).
# We only want to track data.json, so we:
# 1. exclude everything under the plugins directory recursively,
# 2. unignore the plugin directories themselves, which then allows us to
# 3. unignore the data.json files
.obsidian/plugins/**/*
!.obsidian/plugins/*/
!.obsidian/plugins/*/data.json

View file

@ -0,0 +1,4 @@
# Excludes all Obsidian-related configuration. All notes are tracked by Git.
# All Obsidian configuration and runtime state is stored here
.obsidian/**/*

View file

@ -2873,6 +2873,8 @@ issues.reaction.alt_add = Přidat %[1]s reakci na komentář.
archive.pull.noreview = Tento repozitář je archivován. Nemůžete kontrolovat žádosti o sloučení.
editor.commit_email = E-mail revize
commits.view_single_diff = Zobrazit změny tohoto souboru provedené v této revizi
pulls.editable = Upravitelné
pulls.editable_explanation = Tato žádost o sloučení umožňuje úpravy správci. Můžete přispět přímo do ní.
[graphs]
component_loading_info = Tohle může chvíli trvat…
@ -3008,8 +3010,8 @@ teams.invite.by=Pozvání od %s
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.
open_dashboard = Otevřít nástěnku
settings.change_orgname_redirect_prompt.with_cooldown.one = Staré uživatelské jméno bude dostupné ostatním po %[1]d dni. Do té doby budete moci své staré uživatelské jméno znovu získat.
settings.change_orgname_redirect_prompt.with_cooldown.few = Staré uživatelské jméno bude dostupné ostatním po %[1]d dnech. Do té doby budete moci své staré uživatelské jméno znovu získat.
settings.change_orgname_redirect_prompt.with_cooldown.one = Starý název organizace bude dostupný ostatním po %[1]d dni. Do té doby budete moci staré jméno znovu získat.
settings.change_orgname_redirect_prompt.with_cooldown.few = Starý název organizace bude dostupný ostatním po %[1]d dnech. Do té doby budete moci starý název znovu získat.
[admin]
dashboard=Přehled
@ -3956,6 +3958,7 @@ workflow.dispatch.success = Žádost o spuštění workflow byla úspěšně ode
runs.expire_log_message = Protokoly byly smazány, protože byly příliš staré.
runs.no_workflows.help_no_write_access = Pro více informací o Forgejo Actions se podívejte do <a target="_blank" rel="noopener noreferrer" href="%s">dokumentace</a>.
runs.no_workflows.help_write_access = Nevíte, jak začít s Forgejo Actions? Podívejte se na <a target="_blank" rel="noopener noreferrer" href="%s">rychlý začátek v uživatelské dokumentaci</a> pro vytvoření vašeho prvního workflow. Poté <a target="_blank" rel="noopener noreferrer" href="%s">nastavte runner Forgejo</a> pro provádění vašich úloh.
variables.not_found = Nepodařilo se najít proměnnou.
[projects]
type-1.display_name=Samostatný projekt

View file

@ -1827,6 +1827,34 @@ pulls.blocked_by_outdated_branch = Denne pull-anmodning er blokeret, fordi den e
pulls.blocked_by_changed_protected_files_1 = Denne pull-anmodning er blokeret, fordi den ændrer en beskyttet fil:
pulls.blocked_by_changed_protected_files_n = Denne pull-anmodning er blokeret, fordi den ændrer beskyttede filer:
pulls.can_auto_merge_desc = Denne pull-anmodning kan flettes automatisk.
pulls.approve_count_1 = %d godkendelse
pulls.num_conflicting_files_n = %d modstridende filer
pulls.num_conflicting_files_1 = %d modstridende fil
pulls.approve_count_n = %d godkendelser
pulls.reject_count_1 = %d ændringsanmodning
commits.view_single_diff = Se ændringer til denne fil introduceret i denne commit
pulls.cannot_auto_merge_helper = Flet manuelt for at løse konflikterne.
pulls.cannot_auto_merge_desc = Denne pull-anmodning kan ikke flettes automatisk på grund af konflikter.
pulls.reject_count_n = %d ændringsanmodninger
pulls.no_merge_desc = Denne pull-anmodning kan ikke flettes, fordi alle depotsfletningsmuligheder er deaktiveret.
pulls.no_merge_helper = Aktiver fletteindstillinger i depotindstillingerne, eller flet pull-anmodningen manuelt.
pulls.no_merge_wip = Denne pull-anmodning kan ikke flettes, fordi den er markeret som værende et igangværende arbejde.
pulls.no_merge_not_ready = Denne pull-anmodning er ikke klar til at blive flettet, tjek gennemgangsstatus og statustjek.
pulls.squash_merge_pull_request = Opret squash-commit
pulls.fast_forward_only_merge_pull_request = Spol kun frem
pulls.merge_manually = Manuel flet
pulls.merge_commit_id = Flettes commit ID
pulls.require_signed_wont_sign = Grenen kræver underskrevne tilsagn, men denne fletning vil ikke blive underskrevet
pulls.waiting_count_n = %d venter på gennemgange
pulls.wrong_commit_id = commit id skal være et commit id på målgrenen
pulls.blocked_by_user = Du kan ikke oprette en pull-anmodning på dette depot, fordi du er blokeret af depotets ejer.
pulls.no_merge_access = Du er ikke autoriseret til at flette denne pull-anmodning.
pulls.merge_pull_request = Opret flet commit
pulls.rebase_merge_pull_request = Rebaser og spole derefter frem
pulls.rebase_merge_commit_pull_request = Rebase og opret derefter flet commit
pulls.waiting_count_1 = %d venter på gennemgang
pulls.invalid_merge_option = Du kan ikke bruge denne fletteindstilling til denne pull-anmodning.
pulls.merge_conflict = Sammenfletning mislykkedes: Der var en konflikt under sammenlægningen. Tip: Prøv en anden strategi
[notification]
watching = Overvåger

View file

@ -2874,6 +2874,7 @@ summary_card_alt = Zusammenfassungskarte des Repositorys %s
release.summary_card_alt = Übersichtskarte eines Releases mit dem Titel „%s“ im Repository %s
archive.pull.noreview = Dieses Repository ist archiviert. Pull-Requests können nicht gereviewt werden.
editor.commit_email = Commit-E-Mail
commits.view_single_diff = Änderungen an dieser Datei, die in diesem Commit eingeführt wurden, betrachten
[graphs]
component_loading_failed = Konnte %s nicht laden
@ -3959,6 +3960,7 @@ workflow.dispatch.success = Ausführung des Workflows wurde erfolgreich angefrag
runs.expire_log_message = Logs wurden gelöscht, weil sie zu alt waren.
runs.no_workflows.help_write_access = Keine Ahnung, wie man mit Forgejo Actions anfangen soll? Schau im <a target="_blank" rel="noopener noreferrer" href="%s">Schnellstart in der Benutzerdokumentation</a> vorbei, um deinen ersten Workflow zu schreiben, dann <a target="_blank" rel="noopener noreferrer" href="%s">setze einen Forgejo-Runner auf</a>, um deine Jobs auszuführen.
runs.no_workflows.help_no_write_access = Um über Forgejo Actions zu lernen, siehe <a target="_blank" rel="noopener noreferrer" href="%s">die Dokumentation</a>.
variables.not_found = Die Variable wurde nicht gefunden.
[projects]
type-1.display_name=Individuelles Projekt

View file

@ -2828,6 +2828,8 @@ milestones.filter_sort.name = Όνομα
release.type_external_asset = Εξωτερικό αρχείο
mirror_public_key = Δημόσιο κλειδί SSH
mirror_use_ssh.helper = το Forgejo θα κατοπτρίσει το αποθετήριο μέσω Git με τη χρήση SSH και θα δημιουργήσει ένα ζεύγος κλειδιών. Πρέπει να εξασφαλίσετε πως το δημιουργημένο κλειδί είναι εξουσιοδοτημένο να ωθεί στο αποθετήριο προορισμού. Εφόσον το έχετε επιλέξει, δε μπορείτε να χρησιμοποιήσετε εξουσιοδότηση συνθηματικού.
issues.all_title = Όλα
editor.add_tmpl.filename = Όνομα αρχείου
[graphs]
component_loading_failed = Δεν ήταν δυνατή η φόρτωση του %s

View file

@ -853,6 +853,8 @@ email_preference_set_success = Email preference has been set successfully.
add_openid_success = The new OpenID address has been added.
keep_email_private = Hide email address
keep_email_private_popup = Your email address will not be shown on your profile and will not be the default for commits made via the web interface, like file uploads, edits, and merge commits. Instead, a special address %s can be used to link commits to your account. This option will not affect existing commits.
keep_pronouns_private = Only show pronouns to authenticated users
keep_pronouns_private.description = This will hide your pronouns from visitors that are not logged in.
openid_desc = OpenID lets you delegate authentication to an external provider.
manage_ssh_keys = Manage SSH keys
@ -1996,6 +1998,9 @@ pulls.reopen_failed.base_branch = The pull request cannot be reopened, because t
pulls.made_using_agit = AGit
pulls.agit_explanation = Created using the AGit workflow. AGit lets contributors propose changes using "git push" without creating a fork or a new branch.
pulls.editable = Editable
pulls.editable_explanation = This pull request allows edits from maintainers. You can contribute directly to it.
pulls.auto_merge_button_when_succeed = (When checks succeed)
pulls.auto_merge_when_succeed = Auto merge when all checks succeed
pulls.auto_merge_newly_scheduled = The pull request was scheduled to merge when all checks succeed.
@ -2888,8 +2893,8 @@ settings.update_settings = Update settings
settings.update_setting_success = Organization settings have been updated.
settings.change_orgname_prompt = Note: Changing the organization name will also change your organization's URL and free the old name.
settings.change_orgname_redirect_prompt = The old name will redirect until it is claimed.
settings.change_orgname_redirect_prompt.with_cooldown.one = The old username will be available to everyone after a cooldown period of %[1]d day, you can still reclaim the old username during the cooldown period.
settings.change_orgname_redirect_prompt.with_cooldown.few = The old username will be available to everyone after a cooldown period of %[1]d days, you can still reclaim the old username during the cooldown period.
settings.change_orgname_redirect_prompt.with_cooldown.one = The old organization name will be available to everyone after a cooldown period of %[1]d day, you can still reclaim the old name during the cooldown period.
settings.change_orgname_redirect_prompt.with_cooldown.few = The old organization name will be available to everyone after a cooldown period of %[1]d days, you can still reclaim the old name during the cooldown period.
settings.update_avatar_success = The organization's avatar has been updated.
settings.delete = Delete organization
settings.delete_account = Delete this organization
@ -3932,4 +3937,4 @@ filepreview.lines = Lines %[1]d to %[2]d in %[3]s
filepreview.truncated = Preview has been truncated
[translation_meta]
test = This is a test string. It is not displayed in Forgejo UI but is used for testing purposes. Feel free to enter "ok" to save time (or a fun fact of your choice) to hit that sweet 100% completion mark :)
test = This is a test string. It is not displayed in Forgejo UI but is used for testing purposes. Feel free to enter "ok" to save time (or a fun fact of your choice) to hit that sweet 100% completion mark :)

View file

@ -134,6 +134,11 @@ new_repo.title = مخزن جدید
new_migrate.title = مهاجرت جدید
new_repo.link = مخزن جدید
filter = فیلتر
filter.is_archived = بایگانی شده
filter.public = عمومی
filter.private = خصوصی
[aria]
[heatmap]
@ -1987,6 +1992,8 @@ error.csv.too_large=نمی توان این فایل را رندر کرد زیر
error.csv.unexpected=نمی توان این فایل را رندر کرد زیرا حاوی یک کاراکتر غیرمنتظره در خط %d و ستون %d است.
error.csv.invalid_field_count=نمی توان این فایل را رندر کرد زیرا تعداد فیلدهای آن در خط %d اشتباه است.
milestones.filter_sort.name = نام
[graphs]
[org]
@ -2540,6 +2547,9 @@ notices.op=عملیات.
notices.delete_success=گزارش سیستم حذف شده است.
config_summary = چکیده
config_settings = تنظيمات
[action]
create_repo=مخزن ایجاد شده <a href="%s"> %s</a>
rename_repo=مخزن تغییر نام داد از <code>%[1]s</code> به <a href="%[2]s">%[3]s</a>
@ -2669,3 +2679,5 @@ executable_file = فایل اجرایی
normal_file = فایل معمولی
changed_filemode = %[1] ها ← %[2] ها
directory = پوشه
[search]

View file

@ -290,7 +290,7 @@ server_service_title=Palvelimen ja kolmansien osapuolten palveluiden asetukset
offline_mode=Ota käyttöön lokaali tila
offline_mode.description=Poista kolmannen osapuolen sisällönjakeluverkot ja tarjoa kaikki resurssit paikallisesti.
disable_gravatar=Poista Gravatar käytöstä
disable_gravatar.description=Poista Gravatar ja kolmannen osapuolen avaratir käytöstä. Oletus-avatar näytetään, ellei käyttäjä ole ladannut omaansa.
disable_gravatar.description=Poista Gravatar- tai muiden kolmansien osapuolien avatar-lähteet käytöstä. Oletuskuvia käytetään käyttäjien avatareissa, elleivät he uloslataa omaa avatariaan ilmentymään.
federated_avatar_lookup=Käytä federoituja profiilikuvia
federated_avatar_lookup.description=Käytä Libravatar-palvelua profiilikuvien hakemiseen.
disable_registration=Poista omatoiminen rekisteröityminen käytöstä
@ -953,7 +953,7 @@ repo_name=Repon nimi
repo_name_helper=Hyvä repon nimi on lyhyt, mieleenpainuva ja yksilöllinen.
repo_size=Repon koko
template=Malli
template_select=Valitse malli.
template_select=Valitse malli
template_helper=Tee reposta mallipohja
visibility=Näkyvyys
visibility_description=Vain omistaja tai organisaation jäsenet, jos heillä on oikeudet, voivat nähdä sen.
@ -968,7 +968,7 @@ repo_desc=Kuvaus
repo_lang=Kieli
repo_gitignore_helper=Valitse .gitignore-mallit
issue_labels=Ongelmien tunnisteet
issue_labels_helper=Valitse pohja ongelmien nimilapuille.
issue_labels_helper=Valitse nimiöjoukko
license=Lisenssi
license_helper=Valitse lisenssitiedosto
readme=README
@ -1507,12 +1507,12 @@ settings.protected_branch=Haaran suojaus
settings.branch_protection=Haaran "<b>%s</b>" suojaussäännöt
settings.protect_this_branch=Ota haaran suojaus käyttöön
settings.protect_whitelist_deploy_keys=Lisää julkaisuavaimet sallittujen listalle mahdollistaaksesi repohin kirjoituksen.
settings.protect_whitelist_users=Lista käyttäjistä joilla työntö oikeus:
settings.protect_whitelist_users=Sallitut käyttäjät suhteessa työntämiseen
settings.protect_whitelist_search_users=Etsi käyttäjiä…
settings.protect_merge_whitelist_committers_desc=Salli vain listaan merkittyjen käyttäjien ja tiimien yhdistää vetopyynnöt tähän haaraan.
settings.protect_merge_whitelist_users=Lista käyttäjistä joilla yhdistämis-oikeus:
settings.protect_merge_whitelist_users=Sallitut käyttäjät suhteessa yhdistämiseen
settings.protect_required_approvals=Vaadittavat hyväksynnät
settings.protect_approvals_whitelist_users=Sallittujen tarkastajien lista:
settings.protect_approvals_whitelist_users=Sallittujen tarkastajien lista
settings.choose_branch=Valitse haara…
settings.no_protected_branch=Suojattuja haaroja ei ole.
settings.edit_protected_branch=Muokkaa
@ -1686,7 +1686,7 @@ settings.event_issue_comment = Kommentit
diff.download_patch = Lataa patch-tiedosto
issues.filter_milestone_none = Ei merkkipaaluja
issues.filter_milestone_open = Avoimet merkkipaalut
new_repo_helper = Repositorio eli tietovarasto sisältää kaikki projektin tiedostot, mukaan lukien versiohistorian. Onko sinulla repo jo jossain muualla? <a href="%s">Tee repomigraatio.</a>
new_repo_helper = Tietovarasto sisältää kaikki projektitiedostot, mukaan lukien tarkistushistoria. Järjestätkö jo sellaisen muualla? <a href="%s">Siirrä tietovarasto</a>.
use_template = Käytä tätä mallipohjaa
star_guest_user = Kirjaudu sisään lisätäksesi tähden tähän repoon.
watch_guest_user = Kirjaudu sisään tarkkaillaksesi tätä repoa.

View file

@ -2730,6 +2730,9 @@ summary_card_alt = Pangkalahatang-ideyang card ng repositoryo na %s
release.summary_card_alt = Pangkalahatang-ideyang card ng isang release na nakapamagat na "%s" sa repositoryo na %s
editor.commit_email = Email ng commit
archive.pull.noreview = Naka-archive ang repositoryong ito. Hindi ka makakasuri ng mga hiling sa paghila.
commits.view_single_diff = Tignan ang mga pagbabago sa file na ito na ipinakilala sa commit na ito
pulls.editable = Nababago
pulls.editable_explanation = Pinapayagan ng hiling sa paghila na ito ang mga pagbabago mula sa mga tagapangasiwa. Maaari kang direktang mag-ambag dito.
[search]
commit_kind = Maghanap ng mga commit…
@ -3400,8 +3403,8 @@ teams.owners_permission_desc = Ang mga owner ay may punong access sa <strong>lah
teams.add_nonexistent_repo = Hindi pa umiiral ang repositoryo na sinusubukan mong idagdag. Mangyaring gawin iyan muna.
teams.all_repositories = Lahat ng mga repositoryo
teams.all_repositories_helper = Ang koponan ay may access sa lahat ng mga repositoryo. Ang pagpili nito ay <strong>idadagdag ang lahat ng mga umiiral</strong> na repositoryo sa koponan.
settings.change_orgname_redirect_prompt.with_cooldown.few = Magiging available ang lumang username sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw, maari mo pa ring ma-claim muli ang lumang username sa panahon ng panahon ng cooldown.
settings.change_orgname_redirect_prompt.with_cooldown.one = Magiging available ang lumang username sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw, maari mo pa ring ma-claim muli ang lumang username sa panahon ng panahon ng cooldown.
settings.change_orgname_redirect_prompt.with_cooldown.few = Magiging available ang lumang pangalan ng organisasyon sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw, maari mo pa ring ma-claim muli ang lumang pangalan sa panahon ng cooldown.
settings.change_orgname_redirect_prompt.with_cooldown.one = Magiging available ang lumang pangalan ng organisasyon sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw, maari mo pa ring ma-claim muli ang lumang pangalan ng panahon ng cooldown.
[packages]
@ -3680,6 +3683,7 @@ variables.creation.success = Nadagdag na ang variable na "%s".
runs.expire_log_message = Na-purge ang mga log dahil masyado silang luma.
runs.no_workflows.help_write_access = Hindi alam kung paano magsimula sa Forgejo Actions? Tignan ang <a target="_blank" rel="noopener noreferrer" href="%s">mabilisang pagsimula sa user documentation</a> para magsimulang magsulat ng unang workflow, at <a target="_blank" rel="noopener noreferrer" href="%s">mag-setup ng Forgejo runner</a> para patakbuhin ang mga job.
runs.no_workflows.help_no_write_access = Para matuto tungkol sa Forgejo Actions, tignan ang <a target="_blank" rel="noopener noreferrer" href="%s">dokumentasyon</a>.
variables.not_found = Nabigong hanapin ang variable.
[action]
commit_repo = itinulak sa <a href="%[2]s">%[3]s</a> sa <a href="%[1]s">%[4]s</a>

View file

@ -2871,6 +2871,7 @@ issues.context.menu = Menu commentaire
summary_card_alt = Carte résumé du dépôt %s
archive.pull.noreview = Ce dépôt est archivé. Vous ne pouvez pas faire de revue de demandes d'ajout.
editor.commit_email = Courriel de commit
commits.view_single_diff = Voir les changements dans ce fichier introduit par ce commit
[graphs]
component_loading = Chargement %s...
@ -3955,6 +3956,7 @@ workflow.dispatch.warn_input_limit = Affichage des %d premiers champs seulement.
runs.expire_log_message = Les journaux ont été purgés car ils étaient trop anciens.
runs.no_workflows.help_write_access = Vous ne savez pas par où commencer avec Forgejo Actions ? Regardez la section <a target="_blank" rel="noopener noreferrer" href="%s"> démarrage rapide dans la documentation utilisateur</a> pour écrire votre premier workflow, puis <a target="_blank" rel="noopener noreferrer" href="%s">mettre en place un Forgejo runner</a> pour exécuter vos jobs.
runs.no_workflows.help_no_write_access = Pour en savoir plus sur Forgejo Actions, consultez <a target="_blank" rel="noopener noreferrer" href="%s">la documentation</a>.
variables.not_found = La variable n'a pas été trouvée.
[projects]
type-1.display_name=Projet personnel

File diff suppressed because it is too large Load diff

View file

@ -8,15 +8,15 @@ sign_in = Iniciar sesión
sign_in_with_provider = Iniciar Sesión con %s
sign_in_or = ou
sign_out = Pechar Sesión
sign_up = Rexístrate
sign_up = Rexistrarse
link_account = Vincular conta
register = Rexistro
version = Vesión
powered_by = Desenvolvido por %s
version = Versión
powered_by = Impulsado por %s
page = Páxina
template = Modelo
notifications = Notificacións
active_stopwatch = Activar Rastrexador de Tempo
active_stopwatch = Rastreador de tempo activo
create_new = Crear…
user_profile_and_more = Perfil e configuración…
signed_in_as = Sesión iniciada como
@ -31,8 +31,8 @@ re_type = Confirme o contrasinal
captcha = CAPTCHA
twofa = Autenticación de dobre factor
passcode = Código de acceso
webauthn_insert_key = Insira a súa clave de seguridade
webauthn_press_button = Prema o botón da súa clave de seguridade…
webauthn_insert_key = Insira a súa chave de seguridade
webauthn_press_button = Prema o botón da súa chave de seguridade…
webauthn_use_twofa = Use o Código de Dous Factores do seu Teléfono
webauthn_error = Non se puido ler a súa clave de seguridade.
webauthn_unsupported_browser = O seu navegador non soporta WebAuthn actualmente.
@ -102,7 +102,7 @@ copy_content = Copiar contido
language = Linguaxe
copy_hash = Copiar hash
twofa_scratch = Código Scratch de Dous Factores
webauthn_sign_in = Prema o botón da súa clave de seguridade. Se a súa clave de seguridade non ten ningún botón, insíraa de novo.
webauthn_sign_in = Prema o botón da súa chave de seguridade. Se a súa chave de seguridade non ten ningún botón, volva inserila.
issues = Incidencias
disabled = Desactivado
error404 = A páxina á que estás tentando acceder <strong>non existe</strong> ou <strong>non tes autorización</strong> para vela.
@ -162,6 +162,7 @@ more = Máis
number_of_contributions_in_the_last_12_months = %s de contribucións nos últimos 12 meses
contributions_few = contribucións
contributions_one = contribución
contributions_format = {contributions} no {day} de {month} do {year}
[editor]
buttons.heading.tooltip = Engadir Título
@ -174,6 +175,18 @@ 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
buttons.indent.tooltip = Aniña os elementos nun nivel
buttons.unindent.tooltip = Desaniñar os elementos nun nivel
table_modal.placeholder.content = Contido
table_modal.label.rows = Filas
table_modal.label.columns = Columnas
buttons.list.ordered.tooltip = Engade unha lista numerada
buttons.list.task.tooltip = Engade unha lista de tarefas
buttons.mention.tooltip = Menciona a un usuario ou equipo
buttons.switch_to_legacy.tooltip = Utilizar o editor herdado
buttons.new_table.tooltip = Engadir táboa
table_modal.header = Engadir táboa
table_modal.placeholder.header = Cabeceira
[search]
@ -195,6 +208,13 @@ union_tooltip = Incluír resultados correspondentes a calquera dal palabras clav
exact = Exacta
exact_tooltip = Incluír só resultados correspondentes ao termo exacto da procura
issue_kind = Procurar incidencias...
project_kind = Buscar proxectos...
branch_kind = Buscar ramas...
no_results = Non se atoparon resultados coincidentes.
keyword_search_unavailable = A busca por palabra clave non está dispoñible actualmente. Póñase en contacto co administrador do sitio.
commit_kind = Buscar achegas...
runner_kind = Buscar executores...
pull_kind = Buscar pulls...
[startpage]
platform = Multiplataforma

View file

@ -135,6 +135,10 @@ webauthn_sign_in = יש ללחוץ על הכפתור שעל מפתח האבטח
webauthn_error_duplicated = מפתח האבטחה לא יכול לשמש לבקשה זו. נא לוודא שהמפתח לא רשום.
dashboard = מבט על
remove_label_str = הסרת "%s"
explore = קטלוגים
view = עוד מידע
artifacts = ארטיפקטים
confirm_delete_artifact = למחוק את הארטיפקט "%s"?
[search]
search = חיפוש...
@ -161,6 +165,7 @@ code_search_by_git_grep = תוצאות החיפוש יוצרו על ידי "git
runner_kind = חיפוש מריצים...
keyword_search_unavailable = חיפוש מילות מפתח לא זמין. נא לדווח למנהלי המערכת.
code_search_unavailable = חיפוש קוד לא זמין. נא לדווח למנהלי המערכת.
pull_kind = חיפוש בקשות מיזוג...
[heatmap]
number_of_contributions_in_the_last_12_months = % תרומות ב־12 החודשים האחרונים
@ -228,6 +233,7 @@ app_name = שם שרת זה
navbar = סרגל הניווט
footer.software = על תוכנה זו
footer.links = קישורים
footer = סיומת עמוד
[mail]
repo.transfer.subject_to_you = %s רוצה להעביר את הקרפיף "%s" אליך
@ -240,4 +246,7 @@ repo.transfer.subject_to = %s רוצה להעביר את הקרפיף "%s" ל־%
RepoName = שם קרפיף
repository_force_private = פרטיות כפויה מופעלת: קרפיפים פרטיים לא יכולים להעשות ציבוריים.
repo_name_been_taken = כבר יש קרפיף בשם זה.
repository_files_already_exist = כבר יש קבצים בקרפיף זה. יש לדבר עם מנהל המערכת כדי לתקן את הבעיה.
repository_files_already_exist = כבר יש קבצים בקרפיף זה. יש לדבר עם מנהל המערכת כדי לתקן את הבעיה.
[projects]
deleted.display_name = פרויקט נמחק

View file

@ -1270,6 +1270,8 @@ topic.done=Kész
milestones.filter_sort.name = Név
[graphs]
[org]
@ -1684,6 +1686,9 @@ config.cache_item_ttl = Gyorsítótárelem TTL értéke
config.app_data_path = Alkalmazásadatok elérési útja
config_summary = Összefoglaló
config_settings = Beállítások
[action]
create_repo=létrehozott tárolót: <a href="%s"> %s</a>
rename_repo=átnevezte a(z) <code>%[1]s</code> tárolót <a href="%[2]s">%[3]s</a>-ra/re

View file

@ -84,15 +84,93 @@ concept_code_repository=Repositori
name=Nama
re_type = Konfirmasi Kata Sandi
webauthn_insert_key = Masukkan kunci keamanan anda
webauthn_sign_in = Tekan tombol pada kunci keamanan Anda. Jika kunci keamanan Anda tidak memiliki tombol, masukkan kembali.
webauthn_press_button = Silakan tekan tombol pada kunci keamanan Anda…
webauthn_use_twofa = Gunakan kode dua faktor dari telepon Anda
webauthn_error = Tidak dapat membaca kunci keamanan Anda.
webauthn_unsupported_browser = Browser Anda saat ini tidak mendukung WebAuthn.
webauthn_error_unknown = Terdapat kesalahan yang tidak diketahui. Mohon coba lagi.
webauthn_error_insecure = `WebAuthn hanya mendukung koneksi aman. Untuk pengujian melalui HTTP, Anda dapat menggunakan "localhost" atau "127.0.0.1"`
webauthn_error_unable_to_process = Server tidak dapat memproses permintaan Anda.
webauthn_error_duplicated = Kunci keamanan tidak diperbolehkan untuk permintaan ini. Pastikan bahwa kunci ini belum terdaftar sebelumnya.
webauthn_error_empty = Anda harus menetapkan nama untuk kunci ini.
webauthn_error_timeout = Waktu habis sebelum kunci Anda dapat dibaca. Mohon muat ulang halaman ini dan coba lagi.
new_project = Proyek Baru
new_project_column = Kolom Baru
ok = Oke
retry = Coba lagi
rerun = Jalankan ulang
rerun_all = Jalankan ulang semua job
remove_label_str = `Hapus item "%s"`
view = Tampilan
test = Pengujian
locked = Terkunci
copy = Salin
copy_url = Salin URL
copy_hash = Salin hash
copy_content = Salin konten
copy_branch = Salin nama branch
copy_success = Tersalin!
copy_error = Gagal menyalin
copy_type_unsupported = Tipe berkas ini tidak dapat disalin
error = Gangguan
error404 = Halaman yang akan kamu akses <strong>tidak dapat ditemukan</strong> atau <strong>kamu tidak memiliki akses </strong> untuk melihatnya.
go_back = Kembali
invalid_data = Data invalid: %v
never = Tidak Pernah
unknown = Tidak diketahui
rss_feed = Umpan Berita
pin = Sematkan
unpin = Lepas sematan
artifacts = Artefak
archived = Diarsipkan
concept_system_global = Global
concept_user_individual = Perorangan
show_full_screen = Tampilkan layar penuh
download_logs = Unduh Logs
confirm_delete_selected = Konfirmasi untuk menghapus semua item yang dipilih?
value = Nilai
filter = Saring
filter.is_archived = Diarsipkan
filter.not_archived = Tidak Diarsipkan
filter.public = Publik
filter.private = Pribadi
[aria]
navbar = Bar Navigasi
footer = Footer
footer.links = Tautan
[heatmap]
number_of_contributions_in_the_last_12_months = %s Kontribusi pada 12 bulan terakhir
less = Lebih sedikit
more = Lebih banyak
[editor]
buttons.heading.tooltip = Tambahkan heading
buttons.bold.tooltip = Tambahkan teks Tebal
buttons.italic.tooltip = Tambahkan teks Miring
buttons.quote.tooltip = Kutip teks
buttons.code.tooltip = Tambah Kode
buttons.link.tooltip = Tambahkan tautan
buttons.list.unordered.tooltip = Tambah daftar titik
buttons.list.ordered.tooltip = Tambah daftar angka
buttons.list.task.tooltip = Tambahkan daftar tugas
buttons.mention.tooltip = Tandai pengguna atau tim
buttons.ref.tooltip = Merujuk pada isu atau permintaan tarik
buttons.switch_to_legacy.tooltip = Gunakan editor versi lama
buttons.enable_monospace_font = Aktifkan font monospace
buttons.disable_monospace_font = Non-Aktifkan font monospace
[filter]
string.asc = A - Z
string.desc = Z - A
[error]
occurred = Terjadi kesalahan
not_found = Target tidak dapat ditemukan.
[startpage]
app_desc=Sebuah layanan hosting Git sendiri yang tanpa kesulitan
@ -124,6 +202,9 @@ require_sign_in_view=Harus Login Untuk Melihat Halaman
admin_password=Kata Sandi
admin_email=Alamat Email
email_title = Pengaturan email
smtp_from = Kirim Email Sebagai
[home]
uname_holder=Nama Pengguna atau Alamat Surel
password_holder=Kata Sandi
@ -141,6 +222,8 @@ show_private=Pribadi
issues.in_your_repos=Dalam repositori anda
show_archived = Diarsipkan
[explore]
repos=Repositori
users=Pengguna
@ -492,6 +575,8 @@ email_notifications.submit=Pasang Pengaturan Email
visibility.private=Pribadi
visibility.public = Publik
[repo]
owner=Pemilik
repo_name=Nama Repositori
@ -955,6 +1040,12 @@ branch.deleted_by=Dihapus oleh %s
desc.public = Publik
desc.archived = Diarsipkan
commitstatus.error = Gangguan
projects.new = Proyek Baru
milestones.filter_sort.name = Nama
[graphs]
[org]
@ -1009,6 +1100,8 @@ teams.delete_team_success=Tim sudah di hapus.
teams.repositories=Tim repositori
teams.search_repo_placeholder=Cari repositori…
settings.visibility.public = Publik
[admin]
dashboard=Dasbor
organizations=Organisasi
@ -1267,6 +1360,9 @@ notices.op=Op.
notices.delete_success=Laporan sistem telah dihapus.
config_settings = Pengaturan
users.list_status_filter.menu_text = Saring
[action]
create_repo=repositori dibuat <a href="%s">%s</a>
rename_repo=ganti nama gudang penyimpanan dari <code>%[1]s</code> ke <a href="%[2]s">%[3]s</a>
@ -1342,6 +1438,56 @@ runs.commit=Memperbuat
runs.no_matching_online_runner_helper = Tidak ada runner online yang cocok dengan label: %s
runs.actor = Aktor
runs.status = Status
runs.actors_no_select = Semua aktor
runs.status_no_select = Semua status
runs.no_results = Tidak ada hasil yang cocok.
runs.no_workflows = Belum ada alur kerja.
runs.no_runs = Alur kerja belum berjalan.
runs.empty_commit_message = (pesan commit kosong)
workflow.disable = Nonaktifkan Alur Kerja
workflow.enable = Aktifkan Alur Kerja
workflow.disabled = Alur kerja dinonaktifkan.
need_approval_desc = Butuh persetujuan untuk menjalankan alur kerja untuk pull request fork.
variables = Variabel
variables.creation = Tambah Variabel
variables.none = Belum ada variabel.
variables.deletion = Hapus variabel
variables.deletion.description = Menghapus variabel bersifat permanen dan tidak dapat dibatalkan. Lanjutkan?
variables.description = Variabel akan diteruskan ke beberapa tindakan dan tidak dapat dibaca sebaliknya.
variables.id_not_exist = Variabel dengan ID %d tidak ada.
variables.edit = Edit Variabel
variables.deletion.failed = Gagal menghapus variabel.
variables.deletion.success = Variabel telah dihapus.
variables.creation.failed = Gagal menambahkan variabel.
variables.creation.success = Variabel "%s" telah ditambahkan.
variables.update.failed = Gagal mengedit variabel.
variables.update.success = Variabel telah diedit.
[projects]
type-1.display_name = Proyek Individu
type-2.display_name = Proyek Repositori
type-3.display_name = Proyek Organisasi
[git.filemode]
changed_filemode = %[1]s → %[2]s
directory = Directory
normal_file = Normal file
executable_file = Executable file
symbolic_link = Symbolic link
submodule = Submodule
[search]
search = Cari...
type_tooltip = Tipe pencarian
fuzzy_tooltip = Termasuk juga hasil yang mendekati kata pencarian
exact_tooltip = Hanya menampilkan hasil yang cocok dengan istilah pencarian
repo_kind = Cari repo...
user_kind = Telusuri pengguna...
org_kind = Cari organisasi...
team_kind = Cari tim...
code_kind = Cari kode...
code_search_unavailable = Pencarian kode saat ini tidak tersedia. Silahkan hubungi administrator.
branch_kind = Cari cabang...

View file

@ -114,6 +114,10 @@ value=Gildi
sign_in_with_provider = Skrá inn með %s
enable_javascript = Þessi síða krefst JavaScript.
filter = Sía
filter.is_archived = Safnvistað
filter.public = Opinbert
[aria]
[heatmap]
@ -1118,6 +1122,8 @@ topic.done=Í lagi
milestones.filter_sort.name = Heiti
[graphs]
[org]
@ -1287,6 +1293,9 @@ notices.type_2=Verkefni
notices.desc=Lýsing
config_summary = Yfirlit
config_settings = Stillingar
[action]
create_issue=`opnaði vandamál <a href="%[1]s">%[3]s#%[2]s</a>`
reopen_issue=`enduropnaði vandamál <a href="%[1]s">%[3]s#%[2]s</a>`
@ -1371,3 +1380,5 @@ runs.commit=Framlag
[projects]
[git.filemode]
[search]

View file

@ -1504,7 +1504,7 @@ issues.close_comment_issue=Commenta e chiudi
issues.reopen_issue=Riapri
issues.reopen_comment_issue=Commenta e riapri
issues.create_comment=Commento
issues.closed_at=`chiuso questo probleam <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.closed_at=`ha chiuso questa segnalazione <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.reopened_at=`ha riaperto questa segnalazione <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.commit_ref_at=`ha fatto riferimento a questa segnalazione dal commit <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.ref_issue_from=`<a href="%[3]s">ha fatto riferimento a questa segnalazione %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`

View file

@ -167,6 +167,8 @@ new_org.link = 新しい組織
test = テスト
error413 = 割り当て量を使い切りしました。
copy_path = パスをコピー
[aria]
navbar=ナビゲーションバー
footer=フッター
@ -3515,6 +3517,8 @@ config.app_slogan = インスタンスのスローガン
config.cache_test = テストキャッシュ
config.cache_test_failed = キャッシュの調査に失敗しました: %v.
[action]
create_repo=がリポジトリ <a href="%s">%s</a> を作成しました
rename_repo=がリポジトリ名を <code>%[1]s</code> から <a href="%[2]s">%[3]s</a> へ変更しました
@ -3758,6 +3762,8 @@ rpm.repository.multiple_groups = このパッケージは複数のグループ
owner.settings.cargo.rebuild.no_index = 再構築できません、インデックスが初期化されていません。
npm.dependencies.bundle = バンドルされた依存関係
search_in_external_registry = %s で検索
[secrets]
secrets=シークレット
description=シークレットは特定のActionsに渡されます。 それ以外で読み出されることはありません。
@ -3875,11 +3881,15 @@ workflow.dispatch.invalid_input_type = 入力タイプ「%s」が無効です。
workflow.dispatch.warn_input_limit = 最初の %d 個の入力のみを表示します。
runs.no_job = ワークフローには少なくとも1つのジョブが含まれている必要があります
runs.expire_log_message = ログは古すぎるため消去されています。
[projects]
type-1.display_name=個人プロジェクト
type-2.display_name=リポジトリ プロジェクト
type-3.display_name=組織プロジェクト
deleted.display_name = 削除されたプロジェクト
[git.filemode]
changed_filemode=%[1]s → %[2]s
directory=ディレクトリ

View file

@ -376,7 +376,7 @@ allow_password_change=사용자에게 비밀번호 변경을 요청 (권장됨)
reset_password_mail_sent_prompt=확인 메일이 <b>%s</b>로 전송되었습니다. 받은 편지함으로 도착한 메일을 %s 안에 확인해서 비밀번호 찾기 절차를 완료하십시오.
active_your_account=계정 활성화
account_activated=계정이 활성화 되었습니다
prohibit_login =
prohibit_login =
resent_limit_prompt=활성화를 위한 이메일을 이미 전송했습니다. 3분 내로 이메일을 받지 못한 경우 재시도해주세요.
has_unconfirmed_mail=안녕하세요 %s, 이메일 주소(<b>%s</b>)가 확인되지 않았습니다. 확인 메일을 받으시지 못하겼거나 새로운 확인 메일이 필요하다면, 아래 버튼을 클릭해 재발송하실 수 있습니다.
resend_mail=여기를 눌러 확인 메일 재전송
@ -1425,6 +1425,8 @@ archive.title_date = 이 저장소는 %s에 보관처리되었습니다. 파일
milestones.filter_sort.name = 이름
[graphs]
[org]
@ -1797,6 +1799,9 @@ emails.filter_sort.name_reverse = 사용자명 (예약됨)
config.allow_dots_in_usernames = 사용자들이 마침표를 사용자명에 사용할 수 있도록 허가합니다. 이미 존재하는 계정에는 영향을 주지 않습니다.
config_summary = 요약
config_settings = 설정
[action]
create_repo=저장소를 만들었습니다. <a href="%s">%s</a>
rename_repo=저장소 이름을 <code>%[1]s에서</code>에서 <a href="%[2]s"> %[3]s</a>으로 변경함

View file

@ -38,7 +38,7 @@ twofa_scratch=Divpakāpju vienreiz izmantojamais kods
passcode=Kods
webauthn_insert_key=Jāievieto sava drošības atslēga
webauthn_sign_in=Jānospiež poga uz drošības. Ja drošības atslēgai nav pogas, tā ir atkārtoti jāievieto.
webauthn_sign_in=Jānospiež poga uz drošības atslēgas. Ja tai nav pogas, drošības atslēga ir atkārtoti jāievieto.
webauthn_press_button=Lūgums nospiest pogu uz savas drošības atslēgas…
webauthn_use_twofa=Izmantot divpakāpju kodu no sava tālruņa
webauthn_error=Nevar nolasīt drošības atslēgu.
@ -2870,6 +2870,9 @@ summary_card_alt = Glabātavas %s apkopojuma kartīte
release.summary_card_alt = Laidiena "%s" apkopojuma kartīte glabātavā %s
archive.pull.noreview = Šī glabātava ir arhivēta. Nevar izskatīt izmaiņu pieprasījumus.
editor.commit_email = Iesūtījuma e-pasta adrese
commits.view_single_diff = Apskatīt šajā datnē veiktās izmaiņas šajā iesūtījumā
pulls.editable = Labojams
pulls.editable_explanation = Šis izmaiņu pieprasījums pieļauj labojumus no uzturētājiem. Tu vari tieši līdzdarboties tajā.
[graphs]
component_loading=Ielādē %s...
@ -3005,8 +3008,8 @@ teams.invite.by=Uzaicināja %s
teams.invite.description=Lūgums nospiest zemāk esošo pogu, lai pievienotos komandai.
open_dashboard = Atvērt pārskata paneli
follow_blocked_user = Tu nevari sekot šai apvienībai, jo tā ir liegusi Tevi.
settings.change_orgname_redirect_prompt.with_cooldown.one = Vecais lietotājvārds būs pieejams visiem pēc noilguma, kas ir %[1]d diena. Šajā laikā ir iespējams to atkal sākt izmantot.
settings.change_orgname_redirect_prompt.with_cooldown.few = Vecais lietotājvārds būs pieejams visiem pēc noilguma, kas ir %[1]d dienas. Šajā laikā ir iespējams to atkal sākt izmantot.
settings.change_orgname_redirect_prompt.with_cooldown.one = Vecais apvienības nosaukums būs pieejams visiem pēc noilguma, kas ir %[1]d diena. Šajā laikā ir iespējams to atkal sākt izmantot.
settings.change_orgname_redirect_prompt.with_cooldown.few = Vecais apvienības nosaukums būs pieejams visiem pēc noilguma, kas ir %[1]d dienas. Šajā laikā ir iespējams to atkal sākt izmantot.
[admin]
dashboard=Pārskata panelis
@ -3952,6 +3955,7 @@ runs.no_job = Darbplūsmā ir jābūt vismaz vienam darbam
runs.no_workflows.help_write_access = Nav skaidrs, kā sākt izmantot Forgejo Actions? Jāieskatās <a target="_blank" rel="noopener noreferrer" href="%s">ātrajā ievadā lietotāja dokumentācijā</a>, lai uzrakstītu savu pirmo darbplūsmu, tad <a target="_blank" rel="noopener noreferrer" href="%s">jāiestata Forgejo izpildītājs</a>, lai izpildītu savus darbus.
workflow.dispatch.warn_input_limit = Attēlo tikai pirmos %d ievades mainīgos.
workflow.dispatch.trigger_found = Šai darbplūsmai ir <c>workflow_dispatch</c> notikuma izraisītājs.
variables.not_found = Neizdevās atrast mainīgo.
[projects]
type-1.display_name=Atsevišķs projekts

View file

@ -357,8 +357,8 @@ account_security_caution.text_1 = Wenn du dat weerst, kannst du deese E-Mail sek
account_security_caution.text_2 = Wenn du dat nich weerst, hett well in dien Konto inbroken. Bidde kuntakteer de Sied-Chefs.
register_success = Registreren kumpleet
issue_assigned.pull = @%[1]s hett di to Haalvörslag %[2]s in Repositorium %[3]s towiesen.
issue.action.reopen = <b>@%[1]s</b> hett #%[2]s weer opmaakt.
issue.action.merge = <b>@%[1]s</b> hett #%[2]s in %[3]s tosamenföhrt.
issue.action.reopen = <b>@%[1]s</b> hett #%[2]d weer opmaakt.
issue.action.merge = <b>@%[1]s</b> hett #%[2]d in %[3]s tosamenföhrt.
issue.action.reject = <b>@%[1]s</b> hett um Änners för deesen Haalvörslag beden.
issue.action.ready_for_review = <b>@%[1]s</b> hett deesen Haalvörslag as klaar tum Nakieken markeert.
issue.action.new = <b>@%[1]s</b> hett #%[2]d opmaakt.
@ -375,8 +375,8 @@ activate_email.text = Bidde klick up deesen Verwies, um diene E-Mail-Adress binn
reset_password.text = Wenn du dat weerst, klick bidde up deesen Verwies, um dien Konto binnen <b>%s</b> torüggtohalen:
password_change.subject = Dien Passwoord is ännert worden
issue_assigned.issue = @%[1]s hett di to Gefall %[2]s in Repositorium %[3]s towiesen.
issue.action.push_1 = <b>@%[1]s</b> hett %[3]Kommitteren to %[2]s schuven
issue.action.push_n = <b>@%[1]s</b> hett %[3]Kommitterens to %[2]s schuven
issue.action.push_1 = <b>@%[1]s</b> hett %[3]d Kommitteren to %[2]s schuven
issue.action.push_n = <b>@%[1]s</b> hett %[3]d Kommitterens to %[2]s schuven
activate_account.text_1 = Moin <b>%[1]s</b>, wees bedankt, dat du di up %[2]s registreert hest!
issue.action.review_dismissed = <b>@%[1]s</b> hett dat leste Nakieken vun %[2]s för deesen Haalvörslag ofseggt.
issue.in_tree_path = In %s:
@ -404,7 +404,7 @@ issue.x_mentioned_you = <b>@%s</b> hett di nöömt:
issue.action.approve = <b>@%[1]s</b> hett deesem Haalvörslag tostimmt.
repo.transfer.subject_to_you = %s will Repositorium »%s« to di överdragen
team_invite.text_3 = Wahrschau: Deese Inladen weer för %[1]s dacht. Wenn du deese Inladen nich verwacht hest, kannst du deese E-Mail minnachten.
issue.action.close = <b>@%[1]s</b> hett #%[2]s dichtmaakt.
issue.action.close = <b>@%[1]s</b> hett #%[2]d dichtmaakt.
repo.transfer.body = Um dat antonehmen of oftolehnen, besöök %s, of ignoreer dat eenfach.
release.download.zip = Quelltext (ZIP)
team_invite.subject = %[1]s hett di inladen, in de Vereenigung %[2]s intotreden
@ -1941,7 +1941,7 @@ milestones.filter_sort.earliest_due_data = Nahst Anstahns-Datum
milestones.filter_sort.least_issues = Minnst Gefallens
wiki.wiki_page_revisions = Sied-Versioonen
activity.period.yearly = 1 Jahr
activity.title.issues_1 = %s Gefall
activity.title.issues_1 = %d Gefall
activity.git_stats_files_changed_1 = ännert worden
activity.git_stats_deletion_n = %d lösket Riegen geven
contributors.contribution_type.deletions = Lösket Riegen
@ -1977,7 +1977,7 @@ activity.merged_prs_count_n = Tosamenföhrt Haalvörslagen
activity.title.user_1 = %d Bruker
activity.title.prs_1 = %d Haalvörslag
activity.active_issues_count_n = <strong>%d</strong> aktiiv Gefallens
activity.title.issues_n = %s Gefallens
activity.title.issues_n = %d Gefallens
activity.title.unresolved_conv_n = %d nich lööst Snacks
activity.title.releases_1 = %d Publizeren
activity.git_stats_file_1 = is %d Datei
@ -2572,6 +2572,8 @@ release.summary_card_alt = Tosamenfatens-Kaart vun eenem Publizeren mit de Naam
editor.commit_email = Kommitterens-E-Mail
archive.pull.noreview = Deeses Repositorium is archiveert. Du kannst keene Haalvörslagens nakieken.
commits.view_single_diff = Ännerns an deeser Datei in deesem Kommitteren wiesen
pulls.editable = Bewarkbaar
pulls.editable_explanation = Deeser Haalvörslag verlöövt Bewarkens vun Liddmaten. Du kannst stracks daarto bidragen.
[repo.permissions]
code.read = <b>Lesen:</b> De Quelltext vun deesem Repositorium ankieken un klonen.
@ -2715,8 +2717,8 @@ teams.read_permission_desc = Deese Klottje gifft <strong>Lesens</strong>-Togriep
teams.repos.none = Deese Klottje kann up keene Repositoriums togriepen.
teams.specific_repositories_helper = Liddmaten hebben blots Togriep up Repositoriums, wat besünners to de Klottje hentoföögt worden sünd. Wenn du dat utköörst, worden Repositoriums, wat du al mit <i>All Repositoriums</i> hentoföögt hest, <strong>nich automatisk wegdaan</strong>.
teams.all_repositories = All Repositoriums
settings.change_orgname_redirect_prompt.with_cooldown.one = De olle Brukernaam word na eener Ofköhl-Düür vun %[1]d Dag för all Lüü verföögbaar wesen. In de Ofköhl-Düür kannst du de ollen Naam noch torügghalen.
settings.change_orgname_redirect_prompt.with_cooldown.few = De olle Brukernaam word na eener Ofköhl-Düür vun %[1]d Dagen för all Lüü verföögbaar wesen. In de Ofköhl-Düür kannst du de ollen Naam noch torügghalen.
settings.change_orgname_redirect_prompt.with_cooldown.one = De olle Vereenigungs-Naam word na eener Ofköhl-Düür vun %[1]d Dag för all Lüü verföögbaar wesen. In de Ofköhl-Düür kannst du de ollen Naam noch torügghalen.
settings.change_orgname_redirect_prompt.with_cooldown.few = De olle Vereenigungs-Naam word na eener Ofköhl-Düür vun %[1]d Dagen för all Lüü verföögbaar wesen. In de Ofköhl-Düür kannst du de ollen Naam noch torügghalen.
[admin]
dashboard = Kontor
@ -3748,6 +3750,7 @@ runs.no_workflows.quick_start = Weetst du nich, wo man mit Forgejo-Aktioonen beg
runs.no_workflows.documentation = För mehr Informatioonen över Forgejo-Aktioonen, kiek <a target="_blank" rel="noopener noreferrer" href="%s">de Dokumenteren</a> an.
runs.no_workflows.help_write_access = Weetst du nich, wo man mit Forgejo-Aktioonen begünnen sall? Kiek de <a target="_blank" rel="noopener noreferrer" href="%s">Fixanwies in de Bruker-Dokumenteren</a> an, um diene eerste Warkwies to schrieven, un <a target="_blank" rel="noopener noreferrer" href="%s">richt dann dienen eersten Forgejo-Loper in</a>, um diene Upgavens uttoföhren.
runs.no_workflows.help_no_write_access = Um mehr över Forgejo-Aktioonen to lehren, kiek <a target="_blank" rel="noopener noreferrer" href="%s">de Dokumenteren</a> an.
variables.not_found = Kunn de Variaabel nich finnen.
[projects]
deleted.display_name = Lösket Projekt

View file

@ -2869,6 +2869,9 @@ issues.reaction.alt_remove = Verwijder %[1]s reactie van bericht.
issues.reaction.alt_many = %[1]s en %[2]d meer gereageerd %[3]s.
editor.commit_email = Commit e-mail
archive.pull.noreview = Deze repository is gearchiveerd. U kunt geen pull requests beoordelen.
commits.view_single_diff = Bekijk de veranderingen aan dit bestand die in deze commit zijn geïntroduceerd
pulls.editable_explanation = Deze pull request staat bewerkingen toe van beheerders. Je kunt er direct aan bijdragen.
pulls.editable = Bewerkbaar
@ -3007,8 +3010,8 @@ settings.visibility.limited = Beperkt (alleen zichtbaar voor ingelogde gebruiker
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.
open_dashboard = Open dashboard
settings.change_orgname_redirect_prompt.with_cooldown.one = De oude gebruikersnaam zal voor iedereen beschikbaar zijn na een afkoelperiode van %[1]d dag. U kunt de oude gebruikersnaam nog steeds opeisen tijdens de afkoelperiode.
settings.change_orgname_redirect_prompt.with_cooldown.few = De oude gebruikersnaam zal voor iedereen beschikbaar zijn na een afkoelperiode van %[1]d dagen. U kunt de oude gebruikersnaam nog steeds opeisen tijdens de afkoelperiode.
settings.change_orgname_redirect_prompt.with_cooldown.one = De oude organisatienaam zal voor iedereen beschikbaar zijn na een afkoelperiode van %[1]d dag. U kunt de oude naam nog steeds opeisen tijdens de afkoelperiode.
settings.change_orgname_redirect_prompt.with_cooldown.few = De oude organisatienaam zal voor iedereen beschikbaar zijn na een afkoelperiode van %[1]d dagen. U kunt de oude naam nog steeds opeisen tijdens de afkoelperiode.
[admin]
dashboard=Overzicht
@ -3950,6 +3953,7 @@ workflow.dispatch.input_required = Waarde vereist voor invoer “%s”.
runs.expire_log_message = Logs zijn verwijderd omdat ze te oud waren.
runs.no_workflows.help_no_write_access = Om meer te weten te komen over Forgejo Acties, zie <a target="_blank" rel="noopener noreferrer" href="%s">de documentatie</a>.
runs.no_workflows.help_write_access = Weet je niet hoe je moet beginnen met Forgejo Actions? Bekijk de <a target="_blank" rel="noopener noreferrer" href="%s">snelstart in de gebruikersdocumentatie</a> om je eerste workflow te schrijven en <a target="_blank" rel="noopener noreferrer" href="%s">stel vervolgens een Forgejo runner in</a> om je jobs uit te voeren.
variables.not_found = De variabele kon niet gevonden worden.

View file

@ -29,8 +29,8 @@ password=Hasło
access_token=Token dostępu
re_type=Potwierdź hasło
captcha=CAPTCHA
twofa=Autoryzacja dwuskładnikowa
twofa_scratch=Kod jednorazowy weryfikacji dwuetapowej
twofa=Uwierzytelnianie dwuskładnikowe
twofa_scratch=Kod jednorazowy uwierzytelniania dwuskładnikowego
passcode=Kod dostępu
webauthn_insert_key=Podłącz swój klucz bezpieczeństwa
@ -171,17 +171,17 @@ copy_path = Skopiuj ścieżkę
[aria]
navbar = Pasek nawigacji
footer = Stopka
footer.software = O oprogramowaniu
footer.software = O tym oprogramowaniu
footer.links = Linki
[heatmap]
contributions_format = {contributions} w dniu {month} {day}, {year}
contributions_format = {contributions} w dniu {day} {month} {year}
less = Mniej
more = Więcej
number_of_contributions_in_the_last_12_months = %s kontrybucji w ciągu ostatnich 12 miesięcy
contributions_zero = Brak kontrybucji
contributions_one = Wkład
contributions_few = Wkłady
contributions_one = kontrybucja
contributions_few = kontrybucji
[editor]
buttons.heading.tooltip = Dodaj nagłówek
@ -196,8 +196,8 @@ buttons.list.task.tooltip = Dodaj listę zadań
buttons.ref.tooltip = Dodaj odniesienie do zgłoszenia lub pull requestu
buttons.mention.tooltip = Dodaj wzmiankę o użytkowniku lub zespole
buttons.switch_to_legacy.tooltip = Zamiast tego użyj starego edytora
buttons.disable_monospace_font = Wyłącz czcionkę monospace
buttons.enable_monospace_font = Włącz czcionkę monospace
buttons.disable_monospace_font = Wyłącz czcionkę o stałej szerokości
buttons.enable_monospace_font = Włącz czcionkę o stałej szerokości
buttons.indent.tooltip = Zagnieźdź elementy o jeden poziom
buttons.new_table.tooltip = Dodaj tabelę
table_modal.header = Dodaj tabelę
@ -256,7 +256,7 @@ err_empty_db_path=Ścieżka do bazy danych SQLite3 nie może być pusta.
no_admin_and_disable_registration=Nie możesz wyłączyć możliwości samodzielnej rejestracji kont użytkowników bez stworzenia konta administratora.
err_empty_admin_password=Hasło administratora nie może być puste.
err_empty_admin_email=Pole adresu e-mail administratora nie może być puste.
err_admin_name_is_reserved=Nazwa użytkownika administratora jest nieprawidłowa, pseudonim jest zarezerwowany
err_admin_name_is_reserved=Nazwa użytkownika administratora jest nieprawidłowa, nazwa użytkownika jest zarezerwowana
err_admin_name_pattern_not_allowed=Nazwa użytkownika administratora jest nieprawidłowa, pseudonim zawiera zastrzeżone znaki
err_admin_name_is_invalid=Nazwa użytkownika administratora jest nieprawidłowa
@ -329,12 +329,12 @@ default_keep_email_private.description=Domyślnie włącz ukrywanie adresu e-mai
default_allow_create_organization=Domyślne zezwolenie na tworzenie organizacji
default_allow_create_organization.description=Domyślnie zezwalaj nowym użytkownikom na tworzenie organizacji. Gdy ta opcja jest wyłączona, administrator będzie musiał przyznać uprawnienia do tworzenia organizacji nowym użytkownikom.
default_enable_timetracking=Domyślnie włącz śledzenie czasu
default_enable_timetracking.description=Domyślne zezwól na korzystanie z funkcji śledzenia czasu dla nowych repozytoriów.
no_reply_address=Ukryta domena e-mail
default_enable_timetracking.description=Domyślnie zezwól na korzystanie z funkcji śledzenia czasu dla nowych repozytoriów.
no_reply_address=Domena ukrytych e-maili
no_reply_address_helper=Nazwa domeny dla użytkowników z ukrytym adresem e-mail. Przykładowo, użytkownik "jan" będzie zalogowany na Git'cie jako "jan@noreply.example.org", jeśli domena ukrytego adresu e-mail jest ustawiona na "noreply.example.org".
password_algorithm=Algorytm hashowania haseł
invalid_db_table = Tabela bazy danych "%s" jest nieprawidłowa: %v
allow_dots_in_usernames = Zezwolenie użytkownikom na używanie kropek w nazwach użytkowników. Nie ma to wpływu na istniejące konta.
allow_dots_in_usernames = Zezwól użytkownikom na używanie kropek w nazwach użytkowników. Nie ma to wpływu na istniejące konta.
invalid_password_algorithm = Nieprawidłowy algorytm hashowania haseł
smtp_from_invalid = Adres "Wyślij e-mail jako" jest nieprawidłowy
env_config_keys_prompt = Następujące zmienne środowiskowe zostaną również zastosowane do pliku konfiguracyjnego:
@ -350,7 +350,7 @@ app_slogan = Slogan instancji
app_slogan_helper = Wprowadź tutaj slogan swojej instancji. Pozostaw puste, aby wyłączyć.
[home]
uname_holder=Nazwa użytkownika lub adres email
uname_holder=Nazwa użytkownika lub adres e-mail
password_holder=Hasło
switch_dashboard_context=Przełącz kontekst pulpitu
my_repos=Repozytoria
@ -407,10 +407,10 @@ remember_me=Zapamiętaj to urządzenie
forgot_password_title=Zapomniałem hasła
forgot_password=Zapomniałeś hasła?
sign_up_now=Potrzebujesz konta? Zarejestruj się teraz.
confirmation_mail_sent_prompt=Nowa wiadomość e-mail z potwierdzeniem została wysłana do <b>%s</b>. Aby zakończyć proces rejestracji, sprawdź swoją skrzynkę odbiorczą i kliknij podany link w ciągu najbliższych %s. Jeśli wiadomość email jest nieważna, możesz się zalogować i poprosić o wysłanie kolejnej wiadomości email z potwierdzeniem na inny adres.
confirmation_mail_sent_prompt=Nowa wiadomość e-mail z potwierdzeniem została wysłana do <b>%s</b>. Aby zakończyć proces rejestracji, sprawdź swoją skrzynkę odbiorczą i kliknij podany link w ciągu najbliższych %s. Jeśli wiadomość e-mail jest nieważna, możesz się zalogować i poprosić o wysłanie kolejnej wiadomości e-mail z potwierdzeniem na inny adres.
must_change_password=Zaktualizuj swoje hasło
allow_password_change=Użytkownik musi zmienić hasło (zalecane)
reset_password_mail_sent_prompt=Wiadomość email z potwierdzeniem została wysłana do <b>%s</b>. Aby zakończyć proces odzyskiwania konta, sprawdź swoją skrzynkę odbiorczą i kliknij podany link w ciągu najbliższych %s.
reset_password_mail_sent_prompt=Wiadomość e-mail z potwierdzeniem została wysłana do <b>%s</b>. Aby zakończyć proces odzyskiwania konta, sprawdź swoją skrzynkę odbiorczą i kliknij podany link w ciągu najbliższych %s.
active_your_account=Aktywuj swoje konto
account_activated=Konto zostało aktywowane
prohibit_login=Konto jest zawieszone
@ -418,7 +418,7 @@ resent_limit_prompt=Zażądano już wiadomości aktywacyjnej. Zaczekaj 3 minuty
has_unconfirmed_mail=Witaj, %s, masz niepotwierdzony adres e-mail (<b>%s</b>). Jeśli nie otrzymałeś wiadomości e-mail z potwierdzeniem lub potrzebujesz wysłać nową, kliknij na poniższy przycisk.
resend_mail=Kliknij tutaj, aby wysłać e-mail aktywacyjny
email_not_associate=Adres e-mail nie jest powiązany z żadnym kontem.
send_reset_mail=Wyślij email odzyskiwania
send_reset_mail=Wyślij e-mail odzyskiwania
reset_password=Odzyskiwanie konta
invalid_code=Twój kod potwierdzający jest nieprawidłowy lub wygasł.
reset_password_helper=Odzyskaj konto
@ -466,7 +466,7 @@ password_pwned = Wybrane hasło znajduje się na <a target="_blank" rel="noopene
last_admin = Nie można usunąć ostatniego administratora. Musi istnieć co najmniej jeden administrator.
tab_signin = Zaloguj
oauth.signin.error = Wystąpił błąd podczas przetwarzania żądania autoryzacji. Jeśli ten błąd nadal występuje, skontaktuj się z administratorem witryny.
change_unconfirmed_email_error = Nie udało się zmienić adresu email: %v
change_unconfirmed_email_error = Nie udało się zmienić adresu e-mail: %v
invalid_code_forgot_password = Twój kod potwierdzający jest niepoprawny lub wygasł. Naciśnij <a href="%s">tutaj</a>, aby rozpocząć nową sesję.
invalid_password = Twoje hasło nie zgadza się z hasłem, które zostało użyte do stworzenia konta.
reset_password_wrong_user = Jesteś zalogowany(-a) jako %s, ale link odzyskujący jest dla %s
@ -545,7 +545,7 @@ issue.action.reject = <b>@%[1]s</b> poprosił o zmiany w tym pull requeście.
issue.action.review_dismissed = <b>@%[1]s</b> odrzucił ostatnią analizę od %[2]s dla tego pull requesta.
team_invite.subject = %[1]s zaprosił cię do dołączenia do organizacji %[2]s
primary_mail_change.subject = Twój główny mail został zmieniony
primary_mail_change.text_1 = Główny mail twojego konta został właśnie zmieniony na %[1]s. To oznacza ze ten adres email nie będzie już otrzymywał powiadomień dla twojego konta.
primary_mail_change.text_1 = Główny mail twojego konta został właśnie zmieniony na %[1]s. To oznacza ze ten adres e-mail nie będzie już otrzymywał powiadomień dla twojego konta.
totp_disabled.subject = TOTP został wyłączony
password_change.subject = Twoje hasło zostało zmienione
password_change.text_1 = Hasło do twojego konta zostało właśnie zmienione.
@ -555,7 +555,7 @@ account_security_caution.text_2 = Jeśli to nie byłeś(-aś) Ty, Twoje konto pa
account_security_caution.text_1 = Jeśli to byłeś(-aś) ty, możesz bezpiecznie zignorować tę wiadomość.
totp_enrolled.subject = Aktywowałeś(-aś) TOTP jako metodę 2FA
totp_enrolled.text_1.no_webauthn = Właśnie włączyłeś(-aś) TOTP dla swojego konta. Oznacza to, że dla wszystkich przyszłych logowań do konta musisz używać TOTP jako metody 2FA.
team_invite.text_3 = Uwaga: To zaproszenie było przeznaczone dla %[1]s. Jeśli nie spodziewałeś(-aś) się tego zaproszenia, możesz zignorować ten email.
team_invite.text_3 = Uwaga: To zaproszenie było przeznaczone dla %[1]s. Jeśli nie spodziewałeś(-aś) się tego zaproszenia, możesz zignorować ten e-mail.
totp_disabled.text_1 = Jednorazowe hasło czasowe (TOTP) zostało właśnie wyłączone na twoim koncie.
totp_disabled.no_2fa = Nie ma już skonfigurowanych innych metod 2FA, co oznacza, że nie jest już konieczne logowanie się do konta za pomocą 2FA.
removed_security_key.subject = Klucz bezpieczeństwa został usunięty
@ -674,7 +674,8 @@ unsupported_login_type = Ta forma logowania nie wspiera możliwości usunięcia
include_error = ` musi zawierać podciąg znaków "%s".`
still_own_packages = Twoje konto jest właścicielem jednego lub więcej pakietów, musisz je najpierw usunąć.
username_claiming_cooldown = Nazwa użytkownika nie może być uzyskana, ponieważ okres ochrony jeszcze nie minął. Może zostać uzyskana dopiero w %[1]s.
email_domain_is_not_allowed = Domena adresu email użytkownika <b>%s</b> konfliktuje z EMAIL_DOMAIN_ALLOWLIST lub EMAIL_DOMAIN_BLOCKLIST. Upewnij się, że ustawiony adres email jest poprawny.
email_domain_is_not_allowed = Domena adresu e-mail użytkownika <b>%s</b> konfliktuje z EMAIL_DOMAIN_ALLOWLIST lub EMAIL_DOMAIN_BLOCKLIST. Upewnij się, że ustawiony adres e-mail jest poprawny.
invalid_ssh_principal = Nieprawidłowy podmiot: %s
[user]
@ -781,10 +782,10 @@ primary=Podstawowy
activated=Aktywowany
requires_activation=Wymaga aktywacji
primary_email=Ustaw jako podstawowy
activate_email=Wyślij email aktywacyjny
activate_email=Wyślij e-mail aktywacyjny
activations_pending=Oczekujące aktywacje
delete_email=Usuń
email_deletion=Usuń adres email
email_deletion=Usuń adres e-mail
email_deletion_desc=Adres e-mail i powiązane informacje zostaną usunięte z Twojego konta. Commity za pomocą tego adresu e-mail pozostaną niezmienione. Kontynuować?
email_deletion_success=Adres e-mail został usunięty.
theme_update_success=Twój motyw został zaktualizowany.
@ -970,12 +971,12 @@ comment_type_group_pull_request_push = Dodane commity
keep_activity_private = Ukryj aktywność ze strony profilu
oauth2_application_locked = Forgejo rejestruje zawczasu kilka aplikacji OAuth2 podczas rozruchu jeżeli włączono taką opcję w konfiguracji. By zapobiec nieoczekiwanym zachowaniom, nie mogą one zostać ani edytowane, ani usunięte. Proszę odnieś się do dokumentacji OAuth2 po więcej informacji.
oauth2_client_secret_hint = Sekret nie będzie pokazany ponownie po opuszczeniu lub odświeżeniu tej strony. Proszę upewnij się, że został zapisany.
email_desc = Twój główny adres email będzie użyty dla powiadomień, odzyskiwania hasła i, chyba że jest ukryty, operacji Git w przeglądarce.
email_desc = Twój główny adres e-mail będzie użyty dla powiadomień, odzyskiwania hasła i, chyba że jest ukryty, operacji Git w przeglądarce.
key_content_ssh_placeholder = Rozpoczyna się z "ssh-ed25519", "ssh-rsa", "ecdsa-sha2-nistp256", "ecdsa-sha2-nistp384", "ecdsa-sha2-nistp521", "sk-ecdsa-sha2-nistp256@openssh.com", lub "sk-ssh-ed25519@openssh.com"
repo_and_org_access = Dostęp do Repozytoriów i Organizacji
revoke_oauth2_grant_success = Dostęp cofnięty pomyślnie.
update_language = Zmień język
keep_email_private_popup = Twój adres email nie będzie pokazywany na twoim profilu i nie będzie używany jako domyślny dla commitów utworzonych przez interfejs przeglądarki, takich jak wgrywanie plików, edycje, commity scalające. Zamiast tego, specjalny adres %s może zostać użyty do powiązania commitów z twoim kontem. Ta opcja nie wpływa na commity już istniejące.
keep_email_private_popup = Twój adres e-mail nie będzie pokazywany na twoim profilu i nie będzie używany jako domyślny dla commitów utworzonych przez interfejs przeglądarki, takich jak wgrywanie plików, edycje, commity scalające. Zamiast tego, specjalny adres %s może zostać użyty do powiązania commitów z twoim kontem. Ta opcja nie wpływa na commity już istniejące.
repos_none = Nie posiadasz żadnych repozytoriów.
verify_gpg_key_success = Klucz GPG "%s" został zweryfikowany.
email_notifications.andyourown = Dodaj swoje własne powiadomienia
@ -988,7 +989,7 @@ additional_repo_units_hint = Proponuj włączenie dodatkowych jednostek repozyto
webauthn_desc = Klucze bezpieczeństwa to urządzenia zawierające klucze kryptograficzne. Mogą zostać użyte do uwierzytelniania dwuskładnikowego. Klucze bezpieczeństwa muszą wspierać standard <a rel="noreferrer" target="_blank" href="%s">WebAuthn Authenticator</a>.
uploaded_avatar_is_too_big = Rozmiar wgranego pliku (%d KiB) przekraczana rozmiar maksymalny (%d KiB).
retype_new_password = Potwierdź nowe hasło
can_not_add_email_activations_pending = Aktywacja w toku, spróbuj ponownie w ciągu kolejnych kilku minut jeżeli chcesz dodać nowy email.
can_not_add_email_activations_pending = Aktywacja w toku, spróbuj ponownie w ciągu kolejnych kilku minut jeżeli chcesz dodać nowy e-mail.
location_placeholder = Podziel się swoim położeniem z innymi
select_permissions = Wybierz uprawnienia
permissions_access_all = Wszystkie (publiczne, prywatne i ograniczone)
@ -1030,7 +1031,7 @@ pronouns = Zaimki
pronouns_custom = Własne
saved_successfully = Twoje ustawienia zostały zapisane pomyślnie.
keep_activity_private.description = Twoja <a href="%s">aktywność publiczna</a> będzie widoczna tylko dla ciebie i administratorów tej instancji.
add_email_confirmation_sent = Email z potwierdzeniem został wysłany do "%s". By potwierdzić swój adres email, proszę sprawdź swoją skrzynkę odbiorczą i odwiedź dostarczony link w ciągu %s.
add_email_confirmation_sent = E-mail z potwierdzeniem został wysłany do "%s". By potwierdzić swój adres e-mail, proszę sprawdź swoją skrzynkę odbiorczą i odwiedź dostarczony link w ciągu %s.
verify_ssh_key_success = Klucz SSH "%s" został zweryfikowany.
twofa_recovery_tip = Jeżeli zgubisz swoje urządzenie, będziesz mógł użyć jednorazowego klucza odzyskiwania by odzyskać dostęp do swojego konta.
webauthn_key_loss_warning = Jeżeli zgubisz swoje klucze bezpieczeństwa, utracisz dostęp do swojego konta.
@ -1046,6 +1047,11 @@ change_username_redirect_prompt.with_cooldown.one = Stara nazwa użytkownika bę
change_username_redirect_prompt.with_cooldown.few = Stara nazwa użytkownika będzie dostępna dla każdego po okresie ochronnym wynoszącym %[1]d dni, nadal możesz uzyskać z powrotem starą nazwę użytkownika podczas okresu ochronnego.
language.description = Ten język zostanie zapisany na twoim koncie i będzie używany jako domyślny po zalogowaniu.
hidden_comment_types_description = Rodzaje komentarzy zaznaczone tutaj nie będą wyświetlały się na stronach zgłoszeń. Zaznaczenie "Etykieta" na przykład usunie wszystkie komentarze "<użytkownik> dodał/usunął <etykieta>".
principal_desc = Te podmioty certyfikatu SSH będą powiązane z twoim kontem i pozwolą na pełen dostęp do twoich repozytoriów.
add_new_principal = Dodaj podmiot
manage_ssh_principals = Zarządzaj podmiotami certyfikatu SSH
principal_state_desc = Ten podmiot nie był używany w ciągu ostatnich 7 dni
add_principal_success = Podmiot certyfikatu SSH "%s" został dodany.
[repo]
owner=Właściciel
@ -2348,7 +2354,7 @@ release.message = Opisz to wydanie
release.download_count_few = %s pobrania
tag.create_tag_operation = Utwórz tag
tag.create_success = Tag "%s" został utworzony.
editor.commit_email = Email commitu
editor.commit_email = E-mail commitu
projects.edit_success = Projekt "%s" został zaktualizowany.
issues.choose.invalid_config = Konfiguracja zgłoszeń zawiera błędy:
issues.add_ref_at = `dodał(a) odniesienie <b>%s</b> %s`
@ -2836,6 +2842,12 @@ settings.protected_branch_duplicate_rule_name = Już istnieje reguła dla tego z
release.summary_card_alt = Karta podsumowania wydania zatytułowanego "%s" w repozytorium %s
settings.archive.text = Zarchiwizowanie tego repo sprawi, że będzie ono w całości tylko do odczytu. Będzie ukryte z pulpitu. Nikt (nawet ty!) nie będzie mógł utworzyć nowych commitów, lub otworzyć jakichkolwiek zgłoszeń lub pull requestów.
settings.unarchive.button = Odarchiwizuj repo
commits.view_single_diff = Zobacz zmiany tego pliku wprowadzone w tym commicie
tag.ahead.target = do %s od tego tagu
settings.matrix.room_id_helper = ID Pokoju może być pozyskane z klienta przeglądarkowego Element > Ustawienia pokoju > Zaawansowane > Wewnętrzne ID pokoju. Przykład: %s.
settings.matrix.access_token_helper = Zalecane jest skonfigurowanie dedykowany konta Matrix. Token dostępu może zostać pozyskany z przeglądarkowego klienta Element (w zakładce incognito/prywatnej) > Menu użytkownika (lewy górny róg) > Wszystkie ustawienia > Pomoc i O aplikacji > Zaawansowane > Token dostępu (zaraz pod URL Serwera domowego). Zamknij zakładkę incognito/prywatną (wylogowanie się unieważniłoby ten token).
pulls.editable = Edytowalne
pulls.editable_explanation = Ten pull request zezwala na edycje przez opiekunów. Możesz uczestniczyć w nim bezpośrednio.
[graphs]
component_loading = Wczytywanie %s...
@ -2958,15 +2970,15 @@ form.name_reserved = Nazwa organizacji "%s" jest zarezerwowana.
follow_blocked_user = Nie możesz obserwować tej organizacji ponieważ ta organizacja ciebie zablokowała.
settings.change_orgname_prompt = Uwaga: Zmiana nazwy organizacji zmieni również URL twojej organizacji i udostępni starą nazwę.
form.name_pattern_not_allowed = Wzór "%s" nie jest dozwolony w nazwie organizacji.
settings.email = Email kontaktowy
settings.email = E-mail kontaktowy
teams.general_access_helper = Uprawnienia członków będą określane na podstawie poniższej tabeli uprawnień.
members.remove.detail = Usunąć %[1]s z %[2]s?
teams.none_access_helper = Opcja "brak dostępu" dotyczy tylko repozytoriów prywatnych.
teams.general_access = Niestandardowy dostęp
teams.add_nonexistent_repo = Repozytorium które próbujesz dodać nie istnieje, proszę je najpierw utworzyć.
teams.invite_team_member.list = Oczekujące zaproszenia
settings.change_orgname_redirect_prompt.with_cooldown.few = Stara nazwa użytkownika będzie dostępna dla każdego po okresie ochrony wynoszącym %[1]d dni, możesz nadal odzyskać swoją starą nazwę użytkownika podczas okresu ochrony.
settings.change_orgname_redirect_prompt.with_cooldown.one = Stara nazwa użytkownika będzie dostępna dla każdego po okresie ochrony wynoszącym %[1]d dzień, możesz nadal odzyskać swoją starą nazwę użytkownika podczas okresu ochrony.
settings.change_orgname_redirect_prompt.with_cooldown.few = Stara nazwa organizacji będzie dostępna dla każdego po okresie ochrony wynoszącym %[1]d dni, możesz nadal odzyskać starą nazwę podczas okresu ochrony.
settings.change_orgname_redirect_prompt.with_cooldown.one = Stara nazwa organizacji będzie dostępna dla każdego po okresie ochrony wynoszącym %[1]d dzień, możesz nadal odzyskać starą nazwę podczas okresu ochrony.
teams.invite_team_member = Zaproś do %s
settings.visibility.limited = Ograniczona (widoczne tylko dla zalogowanych użytkowników)
teams.none_access = Brak dostępu
@ -2981,7 +2993,7 @@ organizations=Organizacje
repositories=Repozytoria
hooks=Weebhook'i
authentication=Źródła uwierzytelniania
emails=Emaile użytkowników
emails=E-maile użytkowników
config=Konfiguracja
notices=Powiadomienia systemu
monitor=Monitorowanie
@ -3020,7 +3032,7 @@ dashboard.archive_cleanup=Usuń stare archiwa repozytoriów
dashboard.deleted_branches_cleanup=Wyczyść usunięte galęzie
dashboard.git_gc_repos=Wykonaj zbieranie śmieci ze wszystkich repozytoriów
dashboard.resync_all_sshkeys=Zaktualizuj plik '.ssh/authorized_keys' z kluczami SSH Forgejo.
dashboard.resync_all_sshprincipals=Zaktualizuj plik '.ssh/authorized_keys' z kluczami SSH Forgejo.
dashboard.resync_all_sshprincipals=Zaktualizuj plik ".ssh/authorized_principals" z podmiotami SSH Forgejo.
dashboard.resync_all_hooks=Ponownie synchronizuj hooki pre-receive, update i post-receive we wszystkich repozytoriach
dashboard.reinit_missing_repos=Ponownie zainicjalizuj wszystkie brakujące repozytoria Git, dla których istnieją rekordy
dashboard.sync_external_users=Synchronizuj zewnętrzne dane użytkownika
@ -3097,7 +3109,7 @@ users.list_status_filter.is_active=Aktywne
users.list_status_filter.is_admin=Administrator
users.list_status_filter.is_restricted=Ograniczone
emails.email_manage_panel=Zarządzanie adresami email
emails.email_manage_panel=Zarządzanie adresami e-mail
emails.primary=Podstawowy
emails.activated=Aktywowany
emails.filter_sort.email=E-mail
@ -3162,7 +3174,7 @@ auths.attribute_username=Atrybut nazwy użytkownika
auths.attribute_username_placeholder=Pozostaw puste, aby użyć nazwy użytkownika wprowadzonej w Forgejo.
auths.attribute_name=Atrybut imienia
auths.attribute_surname=Atrybut nazwiska
auths.attribute_mail=Atrybut adresu email
auths.attribute_mail=Atrybut adresu e-mail
auths.attribute_ssh_public_key=Atrybut publicznego klucza SSH
auths.attributes_in_bind=Pobierz atrybuty w kontekście Bind DN
auths.allow_deactivate_all=Zezwól na pusty wynik wyszukiwania, aby zdezaktywować wszystkich użytkowników
@ -3181,7 +3193,7 @@ auths.allowed_domains_helper=Pozostaw puste, aby zezwolić na wszystkie domeny.
auths.skip_tls_verify=Pomiń weryfikację protokołu TLS
auths.disable_helo=Wyłącz HELO
auths.pam_service_name=Nazwa usługi PAM
auths.pam_email_domain=Domena email PAM (opcjonalna)
auths.pam_email_domain=Domena e-mail PAM (opcjonalna)
auths.oauth2_provider=Dostawca OAuth2
auths.oauth2_icon_url=Adres URL Ikony
auths.oauth2_clientID=ID klienta (klucz)
@ -3281,16 +3293,16 @@ config.enable_openid_signup=Włącz samodzielną rejestrację za pomocą OpenID
config.enable_openid_signin=Włącz logowanie za pomocą OpenID
config.show_registration_button=Pokazuj przycisk rejestracji
config.require_sign_in_view=Wymagaj zalogowania w celu wyświetlania stron
config.mail_notify=Włącz powiadomienia email
config.mail_notify=Włącz powiadomienia e-mail
config.enable_captcha=Włącz CAPTCHA
config.active_code_lives=Ważność kodów aktywacyjnych
config.reset_password_code_lives=Czas wygaśnięcia kodu przywracania konta
config.default_keep_email_private=Domyślne ukrywanie adresów email
config.default_keep_email_private=Domyślne ukrywanie adresów e-mail
config.default_allow_create_organization=Domyślnie zezwalaj na tworzenie organizacji
config.enable_timetracking=Włącz śledzenie czasu
config.default_enable_timetracking=Domyślnie włącz śledzenie czasu
config.default_allow_only_contributors_to_track_time=Zezwalaj wyłącznie współpracownikom na śledzenie czasu
config.no_reply_address=Ukryta domena email
config.no_reply_address=Domena ukrytych e-maili
config.default_visibility_organization=Domyślna widoczność dla nowych organizacji
config.default_enable_dependencies=Domyślne włączanie zależności zgłoszeń
@ -3414,8 +3426,8 @@ assets = Zasoby kodu
dashboard.cleanup_packages = Wyczyść przedawnione pakiety
dashboard.delete_old_system_notices = Usuń wszystkie stare powiadomienia systemowe z bazy danych
users.details = Szczegóły użytkownika
emails.deletion_success = Adres email został usunięty.
emails.delete_primary_email_error = Nie możesz usunąć głównego adresu email.
emails.deletion_success = Adres e-mail został usunięty.
emails.delete_primary_email_error = Nie możesz usunąć głównego adresu e-mail.
users.purge_help = Wymusza usunięcie użytkownika razem z jakimikolwiek repozytoriami, organizacjami, oraz pakietami których ten użytkownik jest właścicielem. Wszystkie komentarze i zgłoszenia przez tego użytkownika również zostaną usunięte.
dashboard.sync_branch.started = Synchronizacja gałęzi rozpoczęta
dashboard.cancel_abandoned_jobs = Anuluj porzucone prace akcji
@ -3440,7 +3452,7 @@ dashboard.cleanup_actions = Wyczyść przedawnione logi i artefakty z akcji
dashboard.rebuild_issue_indexer = Przebuduj indekser zgłoszeń
users.new_success = Konto użytkownika "%s" zostało utworzone.
users.purge = Pozbądź się użytkownika
users.activated.description = Zakończenie weryfikacji email. Właściciel nieaktywowanego konta nie będzie mógł się zalogować dopóki weryfikacja email nie została zakończona.
users.activated.description = Zakończenie weryfikacji e-mail. Właściciel nieaktywowanego konta nie będzie mógł się zalogować dopóki weryfikacja e-mail nie została zakończona.
users.block.description = Zablokuj użytkownikowi możliwości interakcji z tym serwisem przez jego konto i zabroń logowania się.
users.admin.description = Nadaj temu użytkownikowi pełen dostęp do wszystkich funkcji administracyjnych dostępnych przez interfejs przeglądarkowy lub API.
users.restricted.description = Zezwól tylko na interakcje z repozytoriami i organizacjami do których ten użytkownik został dodany jako współpracownik. To uniemożliwia dostęp do publicznych repozytoriów na tej instancji.
@ -3449,16 +3461,88 @@ users.organization_creation.description = Zezwól na tworzenie nowych organizacj
users.still_own_packages = Ten użytkownik nadal jest właścicielem jednego lub więcej pakietów, usuń najpierw te pakiety.
users.list_status_filter.not_admin = Nie administrator
users.list_status_filter.not_2fa_enabled = 2FA wyłączone
emails.change_email_text = Czy jesteś pewien(-na), że chcesz zaktualizować ten adres email?
emails.delete = Usuń Email
emails.delete_desc = Czy jesteś pewien(-na), że chcesz usunąć ten adres email?
emails.change_email_text = Czy jesteś pewien(-na), że chcesz zaktualizować ten adres e-mail?
emails.delete = Usuń E-mail
emails.delete_desc = Czy jesteś pewien(-na), że chcesz usunąć ten adres e-mail?
packages.total_size = Wielkość całkowita: %s
packages.unreferenced_size = Nieodniesiona wielkość: %s
packages.cleanup = Wyczyść przedawnione dane
defaulthooks.desc = Webhooki automatycznie wykonują żądania HTTP POST do serwera kiedy pewne wydarzenia Forgejo zostają wywołane. Webhooki zdefiniowane tutaj są domyślne i będą kopiowane do wszystkich nowych repozytoriów. Przeczytaj więcej w <a target="_blank" rel="noopener" href="%s">przewoniku webhooków</a>.
defaulthooks.desc = Webhooki automatycznie wykonują żądania HTTP POST do serwera kiedy pewne wydarzenia Forgejo zostają wywołane. Webhooki zdefiniowane tutaj są domyślne i będą kopiowane do wszystkich nowych repozytoriów. Przeczytaj więcej w <a target="_blank" rel="noopener" href="%s">przewodniku webhooków</a>.
dashboard.new_version_hint = Forgejo %s jest już dostępne, w tej chwili korzystasz z %s. Sprawdź szczegóły na <a target="_blank" rel="noreferrer" href="%s">blogu</a>.
identity_access = Tożsamość i dostęp
dashboard.cron.cancelled = Cron: %[1]s anulowany: %[3]s
config.domain = Domena serwera
monitor.queue.activeworkers = Aktywne procesy pracujące
monitor.queue.settings.remove_all_items = Usuń wszystkie
monitor.queue.settings.desc = Pule rosną dynamicznie w odpowiedzi na blokadę kolejki procesów pracujących.
config.mailer_config = Konfiguracja Mailer
auths.tip.gitea = Zarejestruj nową aplikację OAuth2. Przewodnik można znaleźć na %s
auths.unable_to_initialize_openid = Nie można zainicjalizować Dostawcy Uwierzytelniania OpenID Connect: %s
auths.force_smtps = Wymuś SMTPS
auths.helo_hostname = Nazwa hosta HELO
self_check = Autoweryfikacja
config.mailer_enable_helo = Włącz HELO
monitor.queue.settings.remove_all_items_done = Wszystkie elementy w kolejce zostały usunięte.
auths.tips.gmail_settings = Ustawienia Gmail:
auths.map_group_to_team_removal = Usuń użytkowników z synchronizowanych zespołów jeżeli użytkownik nie należy do odpowiadającej grupy LDAP
auths.enable_ldap_groups = Włącz grupy LDAP
auths.map_group_to_team = Odwzorowywuj grupy LDAP na zespoły Organizacji (pozostaw pole puste by pominąć)
config.test_mail_sent = Testowy e-mail został wysłany do "%s".
config.cache_test_slow = Test pamięci podręcznej zakończony powodzeniem, jednak odpowiedź była wolna: %s.
auths.verify_group_membership = Weryfikuj przynależność do grupy w LDAP (pozostaw filtr pusty by pominąć)
monitor.stacktrace = Stacktrace
monitor.download_diagnosis_report = Pobierz raport diagnostyczny
auths.skip_local_two_fa_helper = Pozostawienie tej opcji jako odznaczonej oznacza, że użytkownicy lokalni z aktywowanym 2FA nadal będą musieli przejść 2FA by móc się zalogować
config.app_slogan = Slogan instancji
config.test_mail_failed = Nie udało się wysłać testowego e-maila do "%s": %v
config.mailer_use_dummy = Testowa
config.cache_test_failed = Nie udało się zbadać pamięci podręcznej: %v.
config.cache_test = Przetestuj Pamięć Podręczną
monitor.processes_count = %d Procesów
monitor.queue.numberinqueue = Liczba w kolejce
monitor.queue.review_add = Sprawdź / dodaj procesy pracujące
self_check.no_problem_found = Nie znaleziono jeszcze żadnych problemów.
config.cache_test_succeeded = Test pamięci podręcznej zakończony powodzeniem, otrzymano odpowiedź w ciągu %s.
auths.login_source_exist = Źródło uwierzytelniania "%s" już istnieje.
auths.new_success = Uwierzytelnianie "%s" została dodana.
config.app_data_path = Ścieżka danych aplikacji
systemhooks.desc = Webhooki automatycznie tworzą zapytania HTTP POST do serwera, kiedy następują pewne zdarzenia w Forgejo. Zdefiniowane tutaj webhooki będą oddziaływać na wszystkie repozytoria tego systemu, zatem proszę rozważ ich możliwy wpływ na wydajność. Przeczytaj o tym więcej w <a target="_blank" rel="noopener" href="%s">przewodniku o webhookach</a>.
auths.force_smtps_helper = SMTPS jest zawsze używane na porcie 465. Zaznacz tę opcję by wymusić SMTPS na innych portach. (W przeciwnym wypadku dla innych portów zostanie użyte STARTTLS gdy jest wspierane przez hosta.)
auths.default_domain_name = Domyślna nazwa domeny używana do adresu e-mail
config.allow_dots_in_usernames = Zezwól użytkownikom na użycie kropek w ich nazwach użytkowników. Nie wpływa na już istniejące konta.
config.open_with_editor_app_help = Edytory dostępne w menu klonowania "Otwórz przy pomocy". Jeżeli pozostawione puste, ustawienie domyślne będzie użyte. Rozwiń by zobaczyć ustawienie domyślne.
monitor.duration = Okres (s)
config.ssh_domain = Domena serwera SSH
config.mailer_smtp_addr = Host SMTP
auths.tip.gitlab_new = Zarejestruj nową aplikację na %s
auths.oauth2_scopes = Dodatkowe zakresy
auths.tips.oauth2.general.tip = Podczas rejestrowania nowego uwierzytelniania OAuth2, callback/przekierowanie URL powinno być:
auths.oauth2_group_claim_name = Nazwa oświadczenia określającego nazwy grup dla tego źródła. (Opcjonalne)
dashboard.update_migration_poster_id = Aktualizuj ID autora migracji
config.access_log_template = Szablon dziennika dostępu
dashboard.start_schedule_tasks = Uruchomienie zaplanowanych zadań akcji
config.logger_name_fmt = Dziennik: %s
self_check.database_collation_case_insensitive = Baza danych korzysta z układu sortowania %s, dla którego nie ma znaczenia wielkość liter. Mimo, że Forgejo mógłoby działać z tym ustawieniem poprawnie, mogą wydarzyć się rzadkie przypadki, które nie będą działać zgodnie z oczekiwaniami.
auths.helo_hostname_helper = Nazwa hosta wysyłana z HELO. Aby wysłać bieżącą nazwę hosta, pozostaw puste.
dashboard.update_checker = Sprawdzanie aktualizacji
auths.oauth2_required_claim_name_helper = Ustaw tę nazwę by ograniczyć logowanie z tego źródła dla użytkowników z oświadczeniem o tej nazwie
auths.group_attribute_list_users = Atrybut grupy zawierający listę użytkowników
auths.attribute_avatar = Atrybut awatara
config.set_setting_failed = Ustawienie %s nie powiodło się
auths.oauth2_tenant = Dzierżawa
auths.oauth2_map_group_to_team_removal = Usuń użytkowników z synchronizowanych zespołów jeżeli użytkownik nie należy do odpowiadającej grupy.
auths.oauth2_required_claim_value_helper = Ustaw tę nazwę by ograniczyć logowanie z tego źródła dla użytkowników z oświadczeniem o tej nazwie i wartości
auths.oauth2_restricted_group = Wartość oświadczenia grupy dla użytkowników ograniczonych. (Opcjonalne - wymaga nazwy oświadczenia powyżej)
auths.oauth2_map_group_to_team = Odwzorowywuj grupy oświadczenia na zespoły organizacji (Opcjonalne - wymaga nazwy oświadczenia powyżej)
auths.invalid_openIdConnectAutoDiscoveryURL = Niepoprawny URL Auto Discovery (musi to być poprawny URL rozpoczynający się od http:// lub https://)
self_check.database_fix_mysql = Dla użytkowników MySQL/MariaDB, możesz użyć polecenia "forgejo doctor convert" by naprawić problemy układu sortowania. Możesz też naprawić problem przez ręczne użycie kwerend SQL "ALTER ... COLLATE ...".
auths.oauth2_required_claim_name = Nazwa wymaganego oświadczenia
auths.oauth2_required_claim_value = Wymagana wartość oświadczenia
auths.oauth2_admin_group = Wartość oświadczenia grupy dla administratorów. (Opcjonalne - wymaga nazwy oświadczenia powyżej)
auths.group_search_base = Podstawowy DN do wyszukiwania grup
auths.user_attribute_in_group = Atrybut użytkownika w grupie
self_check.database_collation_mismatch = Wymagaj by baza danych korzystała z układu sortowania: %s
self_check.database_inconsistent_collation_columns = Baza danych korzysta z układu sortowania %s, ale te kolumny korzystają z niedopasowanych układów sortowania. Może to spowodować nieoczekiwane problemy.
[action]
@ -3472,6 +3556,27 @@ compare_commits=Porównaj %d commitów
compare_commits_general=Porównaj commity
mirror_sync_delete=synchronizuje i usuwa odwołanie <code>%[2]s</code> w <a href="%[1]s">%[3]s</a> z kopii lustrzanej
review_dismissed_reason=Powód:
auto_merge_pull_request = `automatycznie scalił(a) pull request <a href="%[1]s">%[3]s#%[2]s</a>`
starred_repo = dał(a) gwiazdkę <a href="%[1]s">%[2]s</a>
create_pull_request = `utworzył(a) pull request <a href="%[1]s">%[3]s#%[2]s</a>`
comment_issue = `skomentował(a) zgłoszenie <a href="%[1]s">%[3]s#%[2]s</a>`
mirror_sync_create = zsynchronizował(a) nowe odniesienie <a href="%[2]s">%[3]s</a> do <a href="%[1]s">%[4]s</a> z kopii lustrzanej
reject_pull_request = `zasugerował(a) zmiany dla <a href="%[1]s">%[3]s#%[2]s</a>`
publish_release = `wydał <a href="%[2]s">%[4]s</a> na <a href="%[1]s">%[3]s</a>`
comment_pull = `skomentował(a) pull request <a href="%[1]s">%[3]s#%[2]s</a>`
review_dismissed = `odrzucił(a) recenzję od <b>%[4]s</b> dla <a href="%[1]s">%[3]s#%[2]s</a>`
close_pull_request = `zamknął(-ęła) pull request <a href="%[1]s">%[3]s#%[2]s</a>`
reopen_pull_request = `otworzył(a) ponownie pull request <a href="%[1]s">%[3]s#%[2]s</a>`
merge_pull_request = `scalił(a) pull request <a href="%[1]s">%[3]s#%[2]s</a>`
approve_pull_request = `zatwierdził(a) <a href="%[1]s">%[3]s#%[2]s</a>`
create_branch = utworzył(a) gałąź <a href="%[2]s">%[3]s</a> in <a href="%[1]s">%[4]s</a>
watched_repo = zaczął(-ęła) obserwować <a href="%[1]s">%[2]s</a>
push_tag = wypchnął tag <a href="%[2]s">%[3]s</a> do <a href="%[1]s">%[4]s</a>
mirror_sync_push = zsynchronizował commity do <a href="%[2]s">%[3]s</a> na <a href="%[1]s">%[4]s</a> z kopii lustrzanej
create_issue = `otworzył(a) zgłoszenie <a href="%[1]s">%[3]s#%[2]s</a>`
close_issue = `zamknął(-ęła) zgłoszenie <a href="%[1]s">%[3]s#%[2]s</a>`
reopen_issue = `otworzył(a) ponownie zgłoszenie <a href="%[1]s">%[3]s#%[2]s</a>`
commit_repo = wypchnął(-ęła) do <a href="%[2]s">%[3]s</a> na <a href="%[1]s">%[4]s</a>
[tool]
now=teraz
@ -3510,6 +3615,8 @@ mark_as_read=Oznacz jako przeczytane
mark_as_unread=Oznacz jak nieprzeczytane
mark_all_as_read=Oznacz wszystkie jako przeczytane
subscriptions = Subskrybcje
no_subscriptions = Brak subskrypcji
watching = Obserwowane
[gpg]
default_key=Podpisano domyślnym kluczem
@ -3560,6 +3667,151 @@ container.labels.value = Wartość
npm.dependencies = Zależności
rpm.repository.architectures = Architektury
owner.settings.chef.keypair.description = Para kluczy jest konieczna do uwierzytelnienia do rejestru Chef. Jeżeli wygenerowałeś(-aś) parę kluczy wcześniej, generowanie nowej pary kluczy porzuci starą parę kluczy.
maven.install2 = Uruchom z wiersza poleceń:
settings.delete = Usuń pakiet
assets = Zasoby
helm.registry = Skonfiguruj ten rejestr z wiersza poleceń:
helm.install = By zainstalować ten pakiet, wykonaj następujące polecenie:
alt.install = Zainstaluj pakiet
alt.repository.multiple_groups = Ten pakiet jest dostępny w wielu grupach.
settings.delete.description = Usunięcie pakietu jest operacją permanentną i nie może zostać cofnięte.
nuget.registry = Skonfiguruj ten rejestr z wiersza poleceń:
conda.registry = Skonfiguruj ten rejestr jako repozytorium Conda w twoim pliku <code>.condarc</code>:
search_in_external_registry = Szukaj w %s
settings.delete.notice = Za moment usuniesz %s (%s). Ta operacja jest nieodwracalna, jesteś pewien(-na)?
settings.delete.success = Pakiet został usunięty.
settings.delete.error = Nie udało się usunąć pakietu.
debian.registry = Skonfiguruj ten rejestr z wiersza poleceń:
debian.repository = Informacje o repozytorium
generic.download = Pobierz pakiet z wiersza poleceń:
go.install = Zainstaluj pakiet z wiersza poleceń:
maven.registry = Skonfiguruj ten rejestr w twoim pliku projektu <code>pom.xml</code>:
npm.install = By zainstalować ten pakiet przy użyciu npm, wykonaj następujące polecenie:
npm.dependencies.optional = Zależności opcjonalne
alt.setup = Dodaj repozytorium do listy połączonych repozytoriów (wybierz wymaganą architekturę zamiast '_arch_'):
alt.repository.architectures = Architektury
alpine.install = By zainstalować ten pakiet, wykonaj następujące polecenie:
conan.install = By zainstalować ten pakiet przy użyciu Conan, wykonaj następujące polecenie:
composer.install = By zainstalować ten pakiet przy użyciu Composer, wykonaj następujące polecenie:
npm.dependencies.peer = Zależności rówieśnicze
owner.settings.chef.keypair = Wygeneruj parę kluczy
owner.settings.cleanuprules.success.update = Reguła czyszczenia została zaktualizowana.
chef.registry = Skonfiguruj ten rejestr w twoim pliku <code>~/.chef/config.rb</code>:
rubygems.install2 = lub dodaj to do Gemfile:
about = O tym pakiecie
published_by_in = Opublikowano %[1]s przez <a href="%[2]s">%[3]s</a> w <a href="%[4]s"><strong>%[5]s</strong></a>
published_by = Opublikowano %[1]s przez <a href="%[2]s">%[3]s</a>
npm.registry = Skonfiguruj ten rejestr w pliku projektu <code>.npmrc</code>:
rpm.repository.multiple_groups = Ten pakiet jest dostępny w wielu grupach.
rpm.repository = Informacje o repozytorium
alpine.registry = Skonfiguruj ten rejestr dodając url do twojego pliku <code>/etc/apk/repositories</code>:
cargo.registry = Skonfiguruj ten rejestr w pliku konfiguracyjnym Cargo (na przykład <code>~/.cargo/config.toml</code>):
nuget.install = By zainstalować ten pakiet przy użyciu NuGet, wykonaj następujące polecenie:
rpm.distros.suse = na dystrybucjach opartych o SUSE
npm.dependencies.bundle = Dołączone zależności
rubygems.required.ruby = Wymaga wersji Ruby
rubygems.required.rubygems = Wymaga wersji RubyGem
arch.version.groups = Grupa
arch.version.depends = Zależności
arch.version.optdepends = Opcjonalne zależności
composer.registry = Skonfiguruj ten rejestr w twoim pliku <code>~/.composer/config.json</code>:
conda.install = By zainstalować ten pakiet przy użyciu Conda, wykonaj następujące polecenie:
container.details.type = Rodzaj obrazu
rpm.distros.redhat = na dystrybucjach opartych o RedHat
filter.no_result = Twój filtr nie dał żadnych wyników.
registry.documentation = Więcej informacji o rejestrze %s znajdziesz w <a target="_blank" rel="noopener noreferrer" href="%s">dokumentacji</a>.
empty.repo = Czy wgrałeś pakiet, ale nie jest tutaj wyświetlany? Odwiedź <a href="%[1]s">ustawienia pakietów</a> i powiąż go z tym repozytorium.
empty.documentation = Więcej informacji o rejestrze przekietów znajdziesz w <a target="_blank" rel="noopener noreferrer" href="%s">dokumentacji</a>.
alpine.repository = Informacje o repozytorium
arch.pacman.helper.gpg = Dodaj certyfikat zaufania do pacmana:
alpine.registry.key = Pobierz klucz publiczny RSA rejestru do folderu <code>/etc/apk/keys/</code> by zweryfikować podpis indeksu:
arch.pacman.sync = Synchronizuj pakiet przy użyciu pacman:
arch.version.checkdepends = Zależności weryfikacji
arch.version.conflicts = Konflikty
cargo.install = By zainstalować ten pakiet przy użyciu Cargo, wykonaj następujące polecenie:
chef.install = By zainstalować ten pakiet, wykonaj następujące polecenie:
debian.install = By zainstalować ten pakiet, wykonaj następujące polecenie:
maven.download = By pobrać zależność, wykonaj w wierszu poleceń:
npm.install2 = lub dodaj to do pliku package.json:
pub.install = By zainstalować ten pakiet przy użyciu Dart, wykonaj następujące polecenie:
maven.install = By użyć tego pakietu dołącz następującą treść w bloku <code>dependencies</code> w pliku <code>pom.xml</code>:
pypi.install = By zainstalować ten pakiet przy użyciu pip, wykonaj następujące polecenie:
rpm.registry = Skonfiguruj ten rejestr z wiersza poleceń:
rpm.install = By zainstalować ten pakiet, wykonaj następujące polecenie:
rubygems.install = By zainstalować ten pakiet przy użyciu gem, wykonaj następujące polecenie:
settings.link.description = Jeżeli połączych pakiet z repozytorium, pakiet ten będzie widoczny na liście pakietów danego repozytorium.
settings.link.success = Połączone repozytorium zostało zaktualizowane pomyślnie.
owner.settings.cleanuprules.keep.count = Pozostaw ostatnie
owner.settings.cleanuprules.keep.count.1 = 1 wersji na pakiet
owner.settings.chef.title = Rejestr Chef
conan.registry = Skonfiguruj ten rejestr z wiersza poleceń:
container.multi_arch = OS / Architektura
container.images.title = Obrazy
owner.settings.cleanuprules.keep.pattern = Pozostaw pasujące wersje
desc = Zarządzaj pakietami repozytoriów.
settings.link.button = Zaktualizuj Połączone Repozytorium
settings.link = Połącz ten pakiet z repozytorium
swift.install2 = i wykonaj następujące polecenie:
arch.version.properties = Własności wersji
arch.pacman.repo.multi.item = Konfiguracja dla %s
arch.pacman.repo.multi = %s ma tę samą wersję co w innych dystrybucjach.
arch.pacman.conf = Dodaj serwer z powiązaną dystrybucją i architekturą do <code>/etc/pacman.conf</code> :
versions.view_all = Pokaż wszystkie
details.documentation_site = Strona dokumentacji
details.repository_site = Strona repozytorium
arch.version.description = Opis
arch.version.provides = Zapewnia
arch.version.makedepends = Zależności budowy
container.pull = Pobierz obraz z wiersza poleceń:
container.layers = Warstwy obrazu
pypi.requires = Wymagany Python
rubygems.dependencies.runtime = Zależności czasu wykonywania
swift.registry = Skonfiguruj ten rejestr z wiersza poleceń:
alt.registry = Skonfiguruj ten rejestr z wiersza poleceń:
alt.registry.install = By zainstalować ten pakiet, wykonaj następujące polecenie:
owner.settings.cleanuprules.preview.overview = %d pakietów jest zaplanowanych do usunięcia.
owner.settings.cleanuprules.keep.count.n = %d wersji na pakiet
owner.settings.cleanuprules.remove.title = Wersje które nie pasują do tych reguł zostaną usunięte, chyba, że reguła wcześniej każe jest pozostawić.
owner.settings.cleanuprules.remove.days = Usuń wersje starsze niż
alt.repository = Informacje o repozytorium
owner.settings.cleanuprules.remove.pattern = Usuń wersje pasujące
owner.settings.cleanuprules.success.delete = Reguła czyszczenia została usunięta.
arch.version.replaces = Zamienia
arch.version.backup = Kopia zapasowa
details.project_site = Strona projektu
settings.link.error = Nie udało się zaktualizować połączonego repozytorium.
swift.install = Dodaj ten packiet do twojego pliku <code>Package.swift</code>:
settings.link.select = Wybierz Repozytorium
empty = Nie ma jeszcze żadnych pakietów.
cran.registry = Skonfiguruj ten rejestr w twoim pliku <code>Rprofile.site</code>:
cran.install = By zainstalować ten pakiet, wykonaj następujące polecenie:
owner.settings.cargo.rebuild.no_index = Nie można odbudować, żaden indeks nie jest zainicjowany.
owner.settings.cargo.title = Indeks rejestru Cargo
owner.settings.cargo.rebuild.error = Nie udało się odbudować indeksu Cargo: %v
owner.settings.cargo.rebuild.success = Indeks Cargo został odbudowany pomyślnie.
owner.settings.cleanuprules.none = Nie ma jeszcze żadnych reguł czyszczenia.
nuget.dependency.framework = Framework Docelowy
owner.settings.cleanuprules.preview = Podgląd reguły czyszczenia
owner.settings.cleanuprules.keep.pattern.container = Wersja <code>latest</code> jest zawsze pozostawiana dla pakietów kontenerów.
owner.settings.cargo.initialize.success = Indeks Cargo został utworzony pomyślnie.
owner.settings.cargo.rebuild = Odbuduj indeks
owner.settings.cargo.initialize.error = Nie udało się zainicjować indeksu Cargo: %v
composer.dependencies.development = Zależności programistyczne
owner.settings.cargo.initialize = Zainicjuj indeks
alpine.registry.info = Wybierz $branch i $repository z listy poniżej.
owner.settings.cleanuprules.pattern_full_match = Zastosuj wzór do pełnej nazwy pakietu
owner.settings.cleanuprules.keep.title = Wersje które pasują do tych reguł są pozostawiane, nawet jeżeli pasują do reguły usunięcia niżej.
vagrant.install = By dodać box Vagrant, wykonaj następujące polecenie:
npm.dependencies.development = Zależności programistyczne
rubygems.dependencies.development = Zależności programistyczne
owner.settings.cargo.rebuild.description = Odbudowanie może być przydatne gdy indeks nie jest synchronizowany z zapisanymi pakietami Cargo.
owner.settings.cleanuprules.title = Reguły czyszczenia
owner.settings.cleanuprules.add = Dodaj regułę czyszczenia
owner.settings.cleanuprules.edit = Edytuj regułę czyszczenia
owner.settings.cleanuprules.preview.none = Reguła czyszczenia nie pasuje do żadnego pakietu.
owner.settings.cargo.initialize.description = Specjalny indeks repozytorium Git jest potrzebny by użyć rejestru Cargo. Wybranie tej opcji utworzy/odtworzy repozytorium i skonfiguruje jest automatycznie.
container.digest = Digest
debian.registry.info = Wybierz $distribution i $component z listy poniżej.
[secrets]
secrets = Sekrety
@ -3646,6 +3898,33 @@ variables.description = Zmienne będą przekazane pewnym akcjom, nie mogą być
runners.runner_manage_panel = Zarządzaj runnerami
runners.new = Utwórz nowy runner
runs.no_matching_online_runner_helper = Brak pasujących runnerów online z etykietą: %s
workflow.disable = Wyłącz proces pracy
unit.desc = Zarządzaj zintegrowanymi procesami CI/CD z Forgejo Actions.
runs.all_workflows = Wszystkie procesy prac
variables.not_found = Nie udało się znaleźć zmiennej.
runs.invalid_workflow_helper = Plik konfiguracyjny procesu pracy jest nieprawidłowy. Proszę sprawdź swój plik konfiguracyjny: %s
runs.no_workflows = Nie ma jeszcze żadnych procesów pracy.
runs.no_runs = Ten proces pracy nie ma jeszcze uruchomień.
workflow.dispatch.use_from = Wykorzystaj proces pracy z
workflow.disabled = Proces pracy jest wyłączony.
workflow.enable_success = Proces pracy "%s" włączony pomyślnie.
workflow.enable = Włącz proces pracy
workflow.disable_success = Proces pracy "%s" wyłączony pomyślnie.
workflow.dispatch.run = Uruchom proces pracy
runs.no_job = Proces pracy musi posiadać chociaż jedno zadanie
runs.no_job_without_needs = Proces pracy musi zawierać chociaż jedno zadanie bez zależności.
status.running = Uruchomione
runs.workflow = Proces pracy
runners.task_list.done_at = Ukończone W
need_approval_desc = Potrzebne zatwierdzenie by móc uruchamiać procesy pracy dla pull requestów forków.
runs.pushed_by = wypchnięty przez
runs.status_no_select = Wszystkie stany
runs.actors_no_select = Wszyscy aktorzy
workflow.dispatch.success = Proces pracy został pomyślnie zażądany.
workflow.dispatch.invalid_input_type = Nieprawidłowy typ danych wejścia "%s".
workflow.dispatch.input_required = Wymagaj wartości dla danych wejścia "%s".
workflow.dispatch.warn_input_limit = Wyświetlane jest tylko pierwszych %d danych wejścia.
workflow.dispatch.trigger_found = Ten proces pracy zawiera wywołanie przy wydarzeniu <c>workflow_dispatch</c>.
@ -3669,9 +3948,9 @@ normal_file = Zwykły plik
[search]
search = Wyszukaj...
type_tooltip = Typ wyszukiwania
fuzzy = Fuzzy
package_kind = Wyszukaj paczki...
fuzzy_tooltip = Uwzględnij wyniki, które również pasują do wyszukiwanego hasła
fuzzy = Przybliżone
package_kind = Wyszukaj pakiety...
fuzzy_tooltip = Uwzględnij wyniki, które są bliskie wyszukiwanemu hasłu
match = Dopasuj
match_tooltip = Uwzględniaj tylko wyniki pasujące do wyszukiwanego hasła
repo_kind = Wyszukaj repozytoria...
@ -3689,7 +3968,7 @@ runner_kind = Wyszukaj runnery...
keyword_search_unavailable = Wyszukiwanie według słów kluczowych jest obecnie niedostępne. Skontaktuj się z administratorem strony.
milestone_kind = Wyszukaj kamienie milowe...
union_tooltip = Uwzględnij wyniki pasujące do dowolnego słowa kluczowego oddzielonego spacjami
exact = Dokładnie
exact = Dokładne
exact_tooltip = Uwzględniaj tylko wyniki pasujące do wyszukiwanego hasła
issue_kind = Wyszukaj zgłoszenia...
pull_kind = Wyszukaj pull requesty...
@ -3704,7 +3983,7 @@ filepreview.truncated = Podgląd został przycięty
filepreview.line = Linia %[1]d w %[2]s
[translation_meta]
test = Litwo, Ojczyzno moja! ty jesteś jak zdrowie; ile cię trzeba cenić, ten tylko się dowie, kto cię stracił. Dziś piękność twą w całej ozdobie widzę i opisuję, bo tęsknię po tobie.
test = Litwo, Ojczyzno moja! ty jesteś jak zdrowie; ile cię trzeba cenić, ten tylko się dowie, kto cię stracił. Dziś piękność twą w całej ozdobie widzę i opisuję, bo tęsknię po tobie :)
[repo.permissions]
code.read = <b>Odczyt:</b> Dostęp i klonowanie kodu repozytorium.
@ -3724,4 +4003,13 @@ pulls.write = <b>Zapis:</b> Zamykanie pull requestów i zarządzanie metadanymi
ext_issues = Dostęp do linku kierującego do zewnętrznego dziennika zgłoszeń. Uprawnienia są zarządzane zewnętrznie.
ext_wiki = Dostęp do linku kierującego do zewnętrznej wiki. Uprawnienia są zarządzane zewnętrznie.
actions.write = <b>Zapis:</b> Ręczne wywołanie, restart, anulowanie lub zatwierdzenie oczekujących procesów CI/CD.
actions.read = <b>Odczyt:</b> Podgląd zintegrowanych procesów CI/CD i ich logów.
actions.read = <b>Odczyt:</b> Podgląd zintegrowanych procesów CI/CD i ich logów.
[munits.data]
eib = EiB
pib = PiB
tib = TiB
gib = GiB
b = B
kib = KiB
mib = MiB

View file

@ -2870,6 +2870,9 @@ summary_card_alt = Cartão de resumo do repositório %s
release.summary_card_alt = Cartão de resumo de um release intitulado "%s" no repositório %s
archive.pull.noreview = Este repositório está arquivado. Não é possível revisar pull requests.
editor.commit_email = Email de commit
commits.view_single_diff = Ver modificações neste arquivo introduzidas neste commit
pulls.editable = Editável
pulls.editable_explanation = Este pull request permite edições de mantenedores. Voçê pode contribuir diretamenta para ele.
[graphs]
component_loading = Carregando %s...
@ -3006,8 +3009,8 @@ 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.
settings.change_orgname_redirect_prompt.with_cooldown.one = O nome de usuário antigo ficará disponível para qualquer pessoa após um período de espera de %[1]d dia, você ainda pode recuperar o nome de usuário antigo durante este período de espera.
settings.change_orgname_redirect_prompt.with_cooldown.few = O nome de usuário antigo ficará disponível para qualquer pessoa após um período de espera de %[1]d dias, você ainda pode recuperar o nome de usuário antigo durante este período de espera.
settings.change_orgname_redirect_prompt.with_cooldown.one = O nome de organização antigo ficará disponível para qualquer pessoa após um período de proteção de %[1]d dia, você ainda pode recuperar o nome antigo durante este período de proteção.
settings.change_orgname_redirect_prompt.with_cooldown.few = O nome de organização antigo ficará disponível para qualquer pessoa após um período de espera de %[1]d dia, você ainda pode recuperar o nome antigo durante este período de espera.
[admin]
dashboard=Painel
@ -3954,6 +3957,7 @@ variables.deletion.description = Apagar uma variável é permanente e não pode
runs.expire_log_message = Os logs foram apagados pois eram antigos demais.
runs.no_workflows.help_no_write_access = Para aprender sobre as Actions do Forgejo, veja <a target="_blank" rel="noopener noreferrer" href="%s">a documentação</a>.
runs.no_workflows.help_write_access = Não sabe como começar a usar as Actions do Forgejo? Veja o <a target="_blank" rel="noopener noreferrer" href="%s">guia de como começar na documentação do usuário</a> para escrever seu primeiro workflow, depois <a target="_blank" rel="noopener noreferrer" href="%s">configure um runner do Forgejo</a> para executar trabalhos.
variables.not_found = Não foi possível encontrar a variável.
[projects]

View file

@ -0,0 +1,249 @@
[common]
return_to_forgejo = Înapoi la Forgejo
explore = Explorează
page = Pagină
licenses = Licențe
copy_type_unsupported = Acest tip de fișier nu poate fi copiat
sign_in = Autentificare
sign_out = Deconectare
sign_in_with_provider = Autentificare cu %s
sign_in_or = sau
toc = Cuprins
admin_panel = Administrare site
artifacts = Artefacte
concept_user_organization = Organizație
logo = Logo
help = Ajutor
sign_up = Înregistrare
link_account = Conectare cont
register = Înregistrare
template = Șablon
language = Limbă
notifications = Notificări
create_new = Creează…
user_profile_and_more = Profil și setări…
username = Nume de utilizator
email = Adresă de email
password = Parolă
access_token = Token de acces
captcha = CAPTCHA
twofa = Autentificare prin doi factori
webauthn_insert_key = Inserează cheia de securitate
webauthn_press_button = Apasă butonul de pe cheia de securitate…
webauthn_use_twofa = Folosește un cod de verificare de pe telefon
webauthn_error = Cheia de securitate nu a putut fi citită.
webauthn_unsupported_browser = Browserul tău nu are abilități WebAuthn pe moment.
webauthn_error_unable_to_process = Serverul nu a putut procesa cererea.
webauthn_error_duplicated = Cheia de securitate nu este permisă pentru această cerere. Asigură-te că cheia nu este înregistrată deja.
webauthn_error_empty = Trebuie să setezi un nume pentru această cheie.
organization = Organizație
mirror = Oglindă
settings = Setări
your_profile = Profil
your_starred = Favorite
your_settings = Setări
new_migrate.title = Migrare nouă
new_org.title = Organizație nouă
new_migrate.link = Migrare nouă
new_org.link = Organizație nouă
sources = Surse
mirrors = Oglinzi
ok = OK
cancel = Anulare
retry = Reîncearcă
add = Adaugă
edit = Editează
view = Vezi
test = Test
enabled = Activat
disabled = Dezactivat
locked = Blocat
copy = Copiază
copy_generic = Copiază în clipboard
copy_url = Copiază URL
copy_hash = Copiază hash
copy_content = Copiază conținut
copy_success = Copiat!
preview = Previzualizează
loading = Se încarcă…
error = Eroare
go_back = Înapoi
never = Niciodată
rss_feed = Flux RSS
confirm_delete_artifact = Ești sigur că vrei să ștergi artefactul "%s"?
archived = Arhivat
concept_system_global = Global
show_log_seconds = Arată secunde
name = Nume
filter = Filtru
filter.clear = Șterge filtre
filter.is_archived = Arhivat
enable_javascript = Acest site are nevoie de JavaScript.
webauthn_error_unknown = O eroare necunoscută a apărut. Te rog reîncearcă.
re_type = Confirmă parola
webauthn_sign_in = Apasă butonul de pe cheia de securitate. Dacă cheia de securitate nu are un buton, reintrodu-o.
new_mirror = Oglindă nouă
new_project = Proiect nou
remove_label_str = Șterge elementul "%s"
save = Salvează
remove = Șterge
copy_path = Copiază cale
error404 = Pagina pe care încerci să o vizitezi fie <strong>nu există</strong> sau <strong>nu ești autorizat</strong> să o vezi.
filter.not_archived = Nearhivat
activities = Activități
confirm_delete_selected = Ștergi toate elementele selectate?
webauthn_error_insecure = WebAuthn funcționează doar prin conexiuni securizate. Pentru a testa folosind HTTP, poți folosi "localhost" sau "127.0.0.1" ca origine
webauthn_error_timeout = Limita de timp a fost depășită înainte ca cheia ta să poată fi citită. Reîncarcă pagina și reîncearcă.
copy_error = Copiere eșuată
concept_user_individual = Individual
unknown = Necunoscut
home = Acasă
dashboard = Panou de Control
version = Versiune
powered_by = Susținut de %s
active_stopwatch = Monitorizor de timp activ
more_items = Mai multe elemente
[editor]
table_modal.header = Adaugă tabel
table_modal.placeholder.content = Conținut
table_modal.label.rows = Rânduri
table_modal.label.columns = Coloane
buttons.list.ordered.tooltip = Adaugă o listă numerotată
table_modal.placeholder.header = Antet
buttons.italic.tooltip = Adaugă text cursiv
buttons.mention.tooltip = Menționează un utilizator sau o echipă
buttons.new_table.tooltip = Adaugă tabel
buttons.bold.tooltip = Adaugă text aldin
buttons.code.tooltip = Adaugă cod
buttons.quote.tooltip = Citează text
buttons.link.tooltip = Adaugă un link
[filter]
string.asc = A - Z
string.desc = Z - A
[error]
server_internal = Eroare internă a serverului
network_error = Eroare de rețea
[startpage]
install = Ușor de instalat
license = Sursă deschisă
[install]
require_db_desc = Forgejo are nevoie de MySQL, PostgreSQL, SQLite3 sau TiDB (protocol MySQL).
db_title = Setări bază de date
db_type = Tipul bazei de date
user = Nume de utilizator
ssl_mode = SSL
path = Cale
sqlite_helper = Calea fișierului pentru baza de date SQLite3.<br>Introdu o cale absolută dacă rulezi Forgejo ca serviciu.
reinstall_error = Încerci să instalezi într-o bază de date Forgejo care există deja
err_empty_db_path = Calea către baza de date SQLite3 nu poate fi goală.
no_admin_and_disable_registration = Nu poți dezactiva propria înregistrare a utilizatorilor fără un cont de administrator.
err_empty_admin_password = Parola administratorului nu poate fi goală.
err_empty_admin_email = Emailul administratorului nu poate fi gol.
err_admin_name_is_invalid = Numele de utilizator al administratorului este invalid
general_title = Setări generale
ssh_port = Port pentru serverul SSH
ssh_port_helper = Numărul de port care va fi folosit de serverul SSH. Lasă gol pentru a dezactiva serverul SSH.
http_port = Port de ascultare HTTP
http_port_helper = Număr de port care va fi folosit de serverul web Forgejo.
app_url = URL de bază
app_url_helper = Adresa de bază pentru URL-uri de clonare HTTP(S) și notificări prin email.
log_root_path = Cale pentru loguri
log_root_path_helper = Fișiere cu loguri vor fi scrise în acest dosar.
optional_title = Setări opționale
email_title = Setări pentru email
smtp_addr = Host SMTP
smtp_port = Port SMTP
mailer_user = Nume de utilizator SMTP
mailer_password = Parolă SMTP
mail_notify = Pornește notificări prin email
server_service_title = Setări pentru server și servicii terțe
offline_mode.description = Dezactivează rețele de livrare a conținutului (CDN) terțe și oferă toate resursele în mod local.
disable_gravatar = Dezactivează Gravatar
openid_signin = Pornește conectare folosind OpenID
openid_signin.description = Permite utilizatorilor conectarea prin OpenID.
openid_signup = Pornește înregistrarea proprie folosind OpenID
enable_captcha = Pornește CAPTCHA pentru înregistrare
enable_captcha.description = Solicită utilizatorilor să treacă de CAPTCHA pentru a crea conturi.
default_keep_email_private = Ascunde adresa de email în mod implicit
default_allow_create_organization = Permite crearea de organizații în mod implicit
default_allow_create_organization.description = Permite utilizatorilor noi să creeze organizații în mod implicit. Când această opțiune este dezactivată, un administrator va trebui să ofere permisiune pentru crearea de organizații noilor utilizatori.
admin_title = Setări pentru contul de administrator
admin_name = Numele de utilizator al administratorului
admin_password = Parola administratorului
install_btn_confirm = Instalează Forgejo
internal_token_failed = Eroare la generarea tokenului intern: %v
secret_key_failed = Eroare la generarea cheii secrete: %v
save_config_failed = Eroare la salvarea configurației: %v
invalid_admin_setting = Setările pentru contul de administrator sunt invalide: %v
allow_dots_in_usernames = Permite utilizatorilor să folosească puncte în numele de utilizator. Conturile existente nu vor fi afectate.
password_algorithm = Algoritm de hash pentru parole
invalid_password_algorithm = Algoritm de hash pentru parole invalid
title = Configurare inițială
smtp_from = Trimite email ca
openid_signup.description = Permite utilizatorilor să creeze conturi folosind OpenID dacă înregistrarea proprie este pornită.
test_git_failed = Eroare la testarea comenzii „git”: %v
sqlite3_not_available = Această versiune de Forgejo nu este compatibilă cu SQLite3. Te rog descarcă versiunea binară oficială de la %s (nu versiunea „gobuild”).
password = Parolă
reinstall_confirm_message = Reinstalarea cu o bază de date Forgejo care există deja poate cauza probleme multiple. În cele mai multe cazuri, ar trebui să îți folosești „app.ini” existent pentru a rula Forgejo. Dacă știi ce faci, confirmă următoarele:
reinstall_confirm_check_3 = Confirmi că ești absolut sigur că acest Forgejo rulează cu locația app.ini corectă și că ești sigur că trebuie să reinstalezi. Confirmi că ai luat la cunoștință riscurile de mai sus.
admin_email = Adresa de email
docker_helper = Dacă rulezi Forgejo în Docker, mai întâi citește <a target="_blank" rel="noopener noreferrer" href="%s">documentația</a> înainte de a schimba setări.
lfs_path = Cale rădăcină pentru Git LFS
domain_helper = Domeniul sau adresa host pentru acest server.
install = Instalare
db_name = Numele bazei de date
allow_only_external_registration.description = Utilizatorii își vor putea crea conturi noi doar folosind servicii externe configurate.
admin_setting.description = Crearea unui cont de administrator este opțională. Primul utilizator înregistrat va deveni administrator în mod automat.
confirm_password = Confirmă parola
enable_update_checker = Pornește verificarea pentru actualizări
db_schema_helper = Lasă gol pentru baza de date implicită („public”).
smtp_from_invalid = Adresa "Trimite email ca" este invalidă
smtp_from_helper = Adresa de email pe care Forgejo o va utiliza. Introdu o adresă de email simplă sau folosește formatul „"Nume" <email@example.com>”.
disable_registration = Dezactivează înregistrarea proprie
allow_only_external_registration = Permite înregistrare doar prin servicii externe
default_keep_email_private.description = Pornește ascunderea adresei de email pentru utilizatori noi în mod implicit astfel încât această informație să nu fie scursă imediat după înregistrare.
invalid_app_data_path = Calea pentru datele aplicației este invalidă: %v
no_reply_address_helper = Domeniu pentru utilizatorii cu adresă de email ascunsă. De exemplu, utilizatorul „joe” va fi conectat la Git ca „joe@noreply.example.org” dacă domeniul pentru adrese de email ascunse este „noreply.example.org”.
reinstall_confirm_check_1 = Datele criptate folosind SECRET_KEY din app.ini ar putea fi pierdute: s-ar putea ca utilizatorii să nu se mai poată conecta folosing 2FA/OTP și oglinzile ar putea să nu mai funcționeze corect. Bifând această opțiune confirmă că fișierul app.ini curent conține valoarea corectă pentru SECRET_KEY.
config_location_hint = Aceste opțiuni de configurare vor fi salvate în:
err_admin_name_is_reserved = Numele de utilizator al administratorului este invalid, numele de utilizator este rezervat
invalid_db_table = Tabelul „%s” al bazei de date este invalid: %v
err_admin_name_pattern_not_allowed = Numele de utilizator al administratorului este invalid, numele de utilizator se potrivește cu un model rezervat
domain = Domeniul serverului
require_sign_in_view.description = Limitează accesul la conținut către utilizatori conectați. Oaspeții vor putea să viziteze doar paginile de autentificare.
invalid_db_setting = Setările pentru bază de date sunt invalide: %v
no_reply_address = Domeniu pentru adrese de email ascunse
[search]
user_kind = Caută utilizatori...
team_kind = Caută echipe...
code_kind = Caută cod...
project_kind = Caută proiecte...
package_kind = Caută pachete...
org_kind = Caută organizații...
code_search_unavailable = Căutarea de cod nu este disponibilă momentan. Te rog contactează administratorul site-ului.
keyword_search_unavailable = Căutarea după cuvânt cheie nu este disponibilă momentan. Te rog contactează administratorul site-ului.
no_results = Nu a fost găsit niciun rezultat corespunzător.
[aria]
navbar = Bară de navigare
footer = Subsol
footer.software = Despre acest software
footer.links = Link-uri
[heatmap]
contributions_zero = Nicio contribuție
contributions_format = {contributions} pe {day} {month} {year}
contributions_few = contribuții
less = Mai puțin
number_of_contributions_in_the_last_12_months = %s contribuții în ultimele 12 luni
more = Mai mult
contributions_one = contribuție

View file

@ -2873,6 +2873,7 @@ issues.context.menu = Меню комментария
release.summary_card_alt = Карточка со сводкой о выпуске «%s» в репозитории %s
archive.pull.noreview = Этот репозиторий архивирован. Рецензирование запросов слияний невозможно.
editor.commit_email = Эл. почта автора
commits.view_single_diff = Посмотреть изменения в этом файле из этого коммита
[graphs]
component_loading_failed = Не удалось загрузить %s
@ -3967,6 +3968,7 @@ workflow.dispatch.warn_input_limit = Отображаются только пе
runs.expire_log_message = Журнал был удалён из-за старости.
runs.no_workflows.help_write_access = Не знаете, как начать использовать Действия Forgejo? Ознакомьтесь с <a target="_blank" rel="noopener noreferrer" href="%s">руководством по быстрому старту в документации</a> и создайте первый рабочий поток, затем <a target="_blank" rel="noopener noreferrer" href="%s">настройте исполнитель Forgejo</a>, который будет выполнять задачи.
runs.no_workflows.help_no_write_access = Ознакомьтесь с <a target="_blank" rel="noopener noreferrer" href="%s">документацией</a>, чтобы узнать про Действия Forgejo.
variables.not_found = Не удалось найти переменную.
[projects]
type-1.display_name=Индивидуальный проект

View file

@ -101,6 +101,11 @@ concept_user_organization=සංවිධානය
name=නම
filter = පෙරහන
filter.is_archived = සංරක්ෂිත
filter.public = ප්‍රසිද්ධ
filter.private = පෞද්ගලික
[aria]
[heatmap]
@ -1913,6 +1918,8 @@ error.csv.too_large=එය ඉතා විශාල නිසා මෙම ග
error.csv.unexpected=%d පේළියේ සහ %dතීරුවේ අනපේක්ෂිත චරිතයක් අඩංගු බැවින් මෙම ගොනුව විදැහුම්කරණය කළ නොහැක.
error.csv.invalid_field_count=මෙම ගොනුව රේඛාවේ වැරදි ක්ෂේත්ර සංඛ්යාවක් ඇති බැවින් එය විදැහුම්කරණය කළ නොහැක %d.
milestones.filter_sort.name = නම
[graphs]
[org]
@ -2462,6 +2469,9 @@ notices.op=ඔප්.
notices.delete_success=පද්ධති දැන්වීම් මකා දමා ඇත.
config_summary = සාරාංශය
config_settings = සැකසුම්
[action]
create_repo=නිර්මිත ගබඩාව <a href="%s">%s</a>
rename_repo=<code>%[1]s</code> සිට <a href="%[2]s">%[3]s</a>දක්වා නම් කරන ලද ගබඩාව
@ -2554,3 +2564,5 @@ runs.commit=කැප
[git.filemode]
symbolic_link=සංකේතාත්මක සබැඳිය
[search]

View file

@ -142,6 +142,9 @@ name=Meno
value=Hodnota
issues = Problémy
filter.is_archived = Archivované
filter.private = Súkromný
[aria]
navbar=Navigačná lišta
footer=Päta
@ -1370,4 +1373,6 @@ runners.labels=Štítky
[projects]
[git.filemode]
symbolic_link=Symbolický odkaz
symbolic_link=Symbolický odkaz
[search]

View file

@ -342,6 +342,8 @@ app_slogan_helper = Oluşum sloganınızı giriniz. Devre dışı bırakmak içi
enable_update_checker_helper_forgejo = release.forgejo.org adresindeki TXT DNS kayıdı kullanılarak yeni Forgejo sürümleri düzenli olarak kontrol edilecektir.
allow_dots_in_usernames = Kullanıcı isimlerinde noktaya izin ver. Var olan kullanıcıları etkilemez.
smtp_from_invalid = `"E-posta Olarak Gönder" adresi geçersiz`
[home]
uname_holder=Kullanıcı adı veya e-posta adresi
password_holder=Parola
@ -663,6 +665,9 @@ admin_cannot_delete_self = Yöneticiyken kullanıcınızı silemezsiniz. Lütfen
username_error_no_dots = ` sadece alfanumerik karakterler ("0-9","a-z","A-Z"), tire ("-") ve alt tire ("-") içerebilir. Alfanumerik olmayan karakterlerle başlayamaz ve bitemez, ayrıca ardışık alfanumerik olmayan karakterler de kullanılamaz.`
unset_password = Oturum açma kullanıcısı parola belirlemedi.
unsupported_login_type = Oturum açma türü hesap silmeyi desteklemiyor.
[user]
change_avatar=Profil resmini değiştir…
joined_on=%s tarihinde katıldı
@ -2692,7 +2697,37 @@ activity.navbar.contributors = Katılımcılar
contributors.contribution_type.deletions = Çıkarmalar
settings.new_owner_blocked_doer = Yeni sahip sizi engelledi.
open_with_editor = %s ile aç
object_format = Nesne Biçimi
mirror_sync = eşitlendi
stars = Yıldızlar
desc.sha256 = SHA256
vendored = Sağlanmış
generated = Üretilmiş
editor.push_out_of_date = İtme eskimiş.
commits.search_branch = Bu Dal
issues.edit.already_changed = Konuya yapılan değişiklikler kaydedilemiyor. İçerik başka kullanıcı tarafından değiştirilmiş gözüküyor. Diğerlerinin değişikliklerinin üzerine yazmamak için lütfen sayfayı yenileyin ve tekrar düzenlemeye çalışın
pulls.edit.already_changed = Değişiklik isteğine yapılan değişiklikler kaydedilemiyor. İçerik başka kullanıcı tarafından değiştirilmiş gözüküyor. Diğerlerinin değişikliklerinin üzerine yazmamak için lütfen sayfayı yenileyin ve tekrar düzenlemeye çalışın
pulls.nothing_to_compare_have_tag = Seçili dal/etiket aynı.
pulls.fast_forward_only_merge_pull_request = Sadece ileri sarma
comments.edit.already_changed = Yoruma yapılan değişiklikler kaydedilemiyor. İçerik başka kullanıcı tarafından değiştirilmiş gözüküyor. Diğerlerinin değişikliklerinin üzerine yazmamak için lütfen sayfayı yenileyin ve tekrar düzenlemeye çalışın
milestones.filter_sort.name = Ad
activity.navbar.pulse = Eğilim
activity.navbar.code_frequency = Kod Frekansı
activity.navbar.recent_commits = Son İşlemeler
settings.mirror_settings.pushed_repository = İtilmiş depo
settings.ignore_stale_approvals = Eskimiş onayları yoksay
settings.ignore_stale_approvals_desc = Daha eski işlemelere (eski incelemelere) yapılmış olan onayları, Dİ'nin kaç onayı olduğunu belirlerken sayma. Eskimiş incelemeler atıldıysa bu ilgisizdir.
error.broken_git_hook = Bu deponun Git İstemcileri bozuk gibi gözüküyor. Onarmak için lütfen <a target="_blank" rel="noreferrer" href="%s">belgelere</a> bakın, daha sonra durumu yenilemek için bazı işlemeler itin.
[graphs]
component_loading = %s yükleniyor...
component_loading_failed = %s yüklenemedi
component_loading_info = Bu biraz sürebilir…
component_failed_to_load = Beklenmedik bir hata oluştu.
code_frequency.what = kod frekansı
contributors.what = katkılar
recent_commits.what = son işlemeler
[org]
org_name_holder=Organizasyon Adı
@ -3346,6 +3381,23 @@ notices.op=İşlem
notices.delete_success=Sistem bildirimleri silindi.
self_check = Öz Denetim
config_summary = Özet
config_settings = Ayarlar
dashboard.sync_repo_tags = Etiketleri git verisinden veritabanına eşitle
emails.delete = E-postayı Sil
emails.delete_desc = Bu e-posta adresini silmek istediğinizden emin misiniz?
emails.deletion_success = E-posta adresi silindi.
emails.delete_primary_email_error = Ana e-posta adresini silemezsiniz.
config.cache_test = Önbelleği Sına
config.cache_test_failed = Önbelleğin incelenmesi başarısız oldu: %v.
config.cache_test_slow = Önbellek sınaması başarılı, ancak yanıt yavaş: %s.
config.cache_test_succeeded = Önbellek sınaması başarılı, %s sürede bir yanıt alındı.
config.open_with_editor_app_help = Klon menüsü için "Birlikte aç" düzenleyicileri. Boş bırakılırsa, varsayılan kullanılacaktır. Varsayılanı görmek için genişletin.
self_check.no_problem_found = Henüz bir sorun bulunmadı.
self_check.database_collation_mismatch = Veritabanının şu harmanlamayı kullanmasını bekle: %s
self_check.database_inconsistent_collation_columns = Veritabanı %s harmanlamasını kullanıyor, ancak bu sütunlar uyumsuz harmanlamalar kullanıyor. Bu beklenmedik sorunlar oluşturabilir.
[action]
create_repo=depo <a href="%s">%s</a> oluşturuldu
rename_repo=<code>%[1]s</code> olan depo adını <a href="%[2]s">%[3]s</a> buna çevirdi
@ -3586,6 +3638,9 @@ owner.settings.chef.title=Chef Kütüğü
owner.settings.chef.keypair=Anahtar çifti üret
owner.settings.chef.keypair.description=Chef kütüğünde kimlik doğrulaması için bir anahtar çifti gereklidir. Eğer daha önce bir anahtar çifti ürettiyseniz, yeni bir anahtar çifti üretmek eski anahtar çiftini ıskartaya çıkartacaktır.
npm.dependencies.bundle = Paketlenmiş Bağımlılıklar
rpm.repository.multiple_groups = Bu paket birçok grupta mevcut.
[secrets]
secrets=Gizlilikler
description=Gizlilikler belirli işlemlere aktarılacaktır, bunun dışında okunamaz.
@ -3693,6 +3748,10 @@ runs.no_workflows.documentation = Gitea İşlem'i hakkında daha fazla bilgi iç
variables.id_not_exist = %d kimlikli değişken mevcut değil.
runs.no_workflows.quick_start = Gitea İşlem'i nasıl başlatacağınızı bilmiyor musunuz? <a target="_blank" rel="noopener noreferrer" href="%s">Hızlı başlangıç rehberine</a> bakabilirsiniz.
runs.no_job_without_needs = İş akışı en azından bağımlılığı olmayan bir görev içermelidir.
runs.no_job = İş akışı en azından bir görev içermelidir
runs.expire_log_message = Günlükler, çok eski oldukları için temizlendiler.
[projects]
type-1.display_name=Kişisel Proje
type-2.display_name=Depo Projesi
@ -3732,3 +3791,5 @@ keyword_search_unavailable = Anahtar kelime ile arama şu anda kullanıma açık
fuzzy_tooltip = Arama terimine yakın olan eşleşmeleri dahil et
union_tooltip = Boşlukla ayrılmış anahtar kelime eşleşmelerini dahil et
exact_tooltip = Sadece arama terimiyle tam uyuşan sonuçları dahit et.
fuzzy = Bulanık
exact = Tam

View file

@ -2504,6 +2504,8 @@ activity.navbar.code_frequency = Частота кодування
activity.navbar.pulse = Пульс
open_with_editor = Відкрити в %s
commits.view_single_diff = Переглянути зміни до цього файлу, внесені у цьому коміті
pulls.editable = Редаговане
pulls.editable_explanation = Цей запит на злиття дозволяє редагування від розробників. Ви можете зробити свій внесок безпосередньо до нього.
[graphs]
contributors.what = внески
@ -3373,6 +3375,7 @@ status.running = Працює
status.success = Успіх
status.skipped = Пропущено
need_approval_desc = Потрібне схвалення для запуску робочих потоків для запиту на злиття.
variables.not_found = Не вдалося знайти змінну.

View file

@ -369,7 +369,7 @@ show_both_archived_unarchived=显示已存档和未存档的
show_only_archived=只显示已存档的
show_only_unarchived=只显示未存档的
show_private=私有
show_private=私有
show_both_private_public=同时显示公开的和私有的
show_only_private=只显示私有的
show_only_public=只显示公开的
@ -1028,7 +1028,7 @@ delete_account_desc=确实要永久删除此用户帐户吗?
email_notifications.enable=启用邮件通知
email_notifications.onmention=只在被提到时邮件通知
email_notifications.disable=停用邮件通知
email_notifications.submit=邮件通知设置
email_notifications.submit=设置邮件偏好
email_notifications.andyourown=和您自己的通知
visibility=用户可见性
@ -1168,7 +1168,7 @@ transfer.reject_desc=`取消转移到 "%s"`
transfer.no_permission_to_accept=您没有权限接受此转让。
transfer.no_permission_to_reject=您没有权限拒绝此转让。
desc.private=私有
desc.private=私有
desc.public=公开
desc.template=模板
desc.internal=内部
@ -2350,7 +2350,7 @@ settings.event_issue_label_desc=工单标签被添加或移除。
settings.event_issue_milestone=里程碑
settings.event_issue_milestone_desc=里程碑被添加、移除或修改。
settings.event_issue_comment=评论
settings.event_issue_comment_desc=工单评论被创建、编辑或删除
settings.event_issue_comment_desc=工单评论被创建、编辑或删除
settings.event_header_pull_request=合并请求事件
settings.event_pull_request=修改
settings.event_pull_request_desc=合并请求被打开、被关闭、被重新打开或被编辑。
@ -2367,7 +2367,7 @@ settings.event_pull_request_review_desc=合并请求被批准、拒绝或提出
settings.event_pull_request_sync=被同步
settings.event_pull_request_sync_desc=分支自动更新为目标分支。
settings.event_pull_request_review_request=评审请求
settings.event_pull_request_review_request_desc=合并请求评审已请求或已取消
settings.event_pull_request_review_request_desc=合并请求评审被请求或被取消。
settings.event_pull_request_approvals=合并请求批准
settings.event_pull_request_merge=合并请求合并
settings.event_package=软件包
@ -2465,7 +2465,7 @@ settings.dismiss_stale_approvals_desc=当新的提交更改合并请求内容被
settings.ignore_stale_approvals = 忽略过时的批准
settings.ignore_stale_approvals_desc = 不将旧的提交(陈旧的评审)计入已批准的合并请求数量。注:如过期的评审已被取消,则无需设置。
settings.require_signed_commits=需要签名提交
settings.require_signed_commits_desc=拒绝推送未签名或无法验证的提交到分支
settings.require_signed_commits_desc=拒绝推送未签名或无法验证的提交到分支
settings.protect_branch_name_pattern=受保护的分支名称正则
settings.protect_branch_name_pattern_desc=受保护的分支名称正则。语法请参阅<a href="%s">文档</a> 。如main, release/**
settings.protect_patterns=规则
@ -2490,7 +2490,7 @@ settings.default_branch_desc=请选择一个默认的分支用于合并请求和
settings.merge_style_desc=合并方式
settings.default_merge_style_desc=默认合并方式
settings.choose_branch=选择一个分支…
settings.no_protected_branch=没有受保护的分支
settings.no_protected_branch=没有分支受到保护。
settings.edit_protected_branch=编辑
settings.protected_branch_required_rule_name=必须填写规则名称
settings.protected_branch_duplicate_rule_name=这些分支已设有规则
@ -2503,7 +2503,7 @@ settings.tags.protection.allowed.users=允许的账号
settings.tags.protection.allowed.teams=允许的团队
settings.tags.protection.allowed.noone=
settings.tags.protection.create=添加规则
settings.tags.protection.none=没有受保护的Git标签
settings.tags.protection.none=没有Git标签受到保护。
settings.tags.protection.pattern.description=你可以使用单个名称或 glob 模式匹配或正则表达式来匹配多个标签。了解详情请访问 <a target="_blank" rel="noopener" href="%s">受保护Git标签指南</a>。
settings.bot_token=机器人令牌
settings.chat_id=聊天 ID
@ -2651,11 +2651,11 @@ release.deletion=删除发布
release.deletion_desc=删除版本发布只会从 Forgejo 中移除。这不会影响 Git 的标签以及您仓库的内容和历史。是否继续?
release.deletion_success=Release已被删除。
release.deletion_tag_desc=将从仓库中删除此 Git标签。仓库内容和历史记录保持不变。继续吗
release.deletion_tag_success=该 Git标签 被删除
release.deletion_tag_success=该 Git 标签已被删除
release.tag_name_already_exist=使用此标签名称的发布版本已经存在。
release.tag_name_invalid=标签名称无效。
release.tag_name_protected=Git标签名称已受保护。
release.tag_already_exist=此 Git标签 名称已存在
release.tag_already_exist=此 Git 标签已存在
release.downloads=下载附件
release.download_count=下载:%s
release.add_tag_msg=使用发布的标题和内容作为标签消息。
@ -2704,7 +2704,7 @@ tag.create_tag_operation=创建标签
tag.confirm_create_tag=创建标签
tag.create_tag_from=基于"%s"创建新标签
tag.create_success=标签"%s"已存在
tag.create_success=已创建标签“%s”。
topic.manage_topics=管理主题
topic.done=保存
@ -2786,7 +2786,7 @@ release.download_count_one = %s 下载
release.download_count_few = %s 下载
release.system_generated = 此附件是自动生成的。
pulls.ready_for_review = 准备好接受评审了吗?
settings.web_hook_name_sourcehut_builds = SourceHut 构建
settings.web_hook_name_sourcehut_builds = SourceHut Builds
settings.graphql_url = GraphQL URL 链接
settings.sourcehut_builds.access_token_helper = 已授予 JOBS:RW 权限的访问令牌。可在 meta.sr.ht 上生成标准的 <a target="_blank" rel="noopener noreferrer" href="%s">builds.sr.ht 令牌</a>或<a target="_blank" rel="noopener noreferrer" href="%s">带有密匙访问权限的 builds.sr.ht 令牌</a> 。
settings.matrix.access_token_helper = 推荐为此设立专门的 Matrix 账户。访问令牌可从 Element Web 客户端(在隐私/无痕模式选项卡中打开)> 用户菜单(左上角)> 所有设置 > 帮助及关于 > 高级 > 访问令牌(在主服务器 URL 下方)检索。获取完成后,请直接关闭隐私/无痕选项卡(注销会使令牌失效)。
@ -2872,6 +2872,9 @@ release.summary_card_alt = 仓库 %[2]s 中标题为 %[1]s 的版本发布的摘
summary_card_alt = 仓库 %s 的摘要卡片
editor.commit_email = 提交电子邮件
archive.pull.noreview = 此仓库已存档,您无法评审合并请求。
commits.view_single_diff = 查看该提交对本文件的更改
pulls.editable = 可编辑
pulls.editable_explanation = 此合并请求允许维护者进行编辑。你可以直接向其贡献。
[graphs]
component_loading=正在加载 %s…
@ -2907,7 +2910,7 @@ team_unit_disabled=(已禁用)
form.name_reserved=组织名称 '%s' 是被保留的。
form.name_pattern_not_allowed=仓库名称中不允许使用 "%s"。
form.create_org_not_allowed=此账号禁止创建组织
form.create_org_not_allowed=您不能创建组织。
settings=组织设置
settings.options=组织
@ -3007,8 +3010,8 @@ teams.invite.by=邀请人 %s
teams.invite.description=请点击下面的按钮加入团队。
follow_blocked_user = 你无法关注此组织,因为此组织已屏蔽你。
open_dashboard = 打开仪表盘
settings.change_orgname_redirect_prompt.with_cooldown.one = 旧的用户名将在%[1]d天的保护期后对所有人可用您仍可以在此期间重新认领旧的用户名。
settings.change_orgname_redirect_prompt.with_cooldown.few = 旧的用户名将在%[1]d天的保护期后对所有人可用您仍可以在此期间重新认领旧的用户名。
settings.change_orgname_redirect_prompt.with_cooldown.one = 旧的组织名将在%[1]d天的保护期后对所有人可用您仍可以在此期间重新认领旧的名
settings.change_orgname_redirect_prompt.with_cooldown.few = 旧的组织名将在%[1]d天的保护期后对所有人可用您仍可以在此期间重新认领旧名
[admin]
dashboard=管理面板
@ -3198,7 +3201,7 @@ repos.unadopted=未收录仓库
repos.unadopted.no_more=找不到更多未被收录的仓库。
repos.owner=所有者
repos.name=名称
repos.private=私有
repos.private=私有
repos.watches=关注数
repos.stars=点赞数
repos.forks=派生数
@ -3679,7 +3682,7 @@ keywords=关键词
details=详情
details.author=作者
details.project_site=项目站点
details.repository_site=仓库
details.repository_site=仓库
details.documentation_site=文档站点
details.license=许可协议
assets=文件
@ -3799,7 +3802,7 @@ owner.settings.cleanuprules.keep.count=保留最新的
owner.settings.cleanuprules.keep.count.1=每个软件包1个版本
owner.settings.cleanuprules.keep.count.n=每个软件包 %d 个版本
owner.settings.cleanuprules.keep.pattern=保持版本匹配
owner.settings.cleanuprules.keep.pattern.container=容器包的 <code>最新版本</code> 总是会保留。
owner.settings.cleanuprules.keep.pattern.container=容器的<code>latest</code>版本总是会被保留。
owner.settings.cleanuprules.remove.title=与这些规则相匹配的版本将被删除,除非其中存在某个保留它们的规则。
owner.settings.cleanuprules.remove.days=移除旧于天数的版本
owner.settings.cleanuprules.remove.pattern=删除匹配的版本
@ -3955,6 +3958,7 @@ workflow.dispatch.input_required = 需要输入“%s”的值。
runs.expire_log_message = 已清除日志,因为它们太旧了。
runs.no_workflows.help_write_access = 不知道如何上手 Forgejo Actions查看<a target="_blank" rel="noopener noreferrer" href="%s">用户文档的快速上手部分</a>来编写你的第一个工作流,然后<a target="_blank" rel="noopener noreferrer" href="%s">配置一个Forgejo运行器</a>来运行你的任务。
runs.no_workflows.help_no_write_access = 欲了解关于Forgejo Actions的更多信息请参见<a target="_blank" rel="noopener noreferrer" href="%s">文档</a>。
variables.not_found = 找不到变量。
[projects]
type-1.display_name=个人项目

View file

@ -119,6 +119,22 @@ concept_user_individual = 個人
new_project = 新增專案
new_project_column = 新增欄位
filter.public = 公開
remove_all = 移除全部
admin_panel = 網站管理
add_all = 新增全部
remove_label_str = 移除項目「%s」
test = 測試
new_repo.title = 新儲存庫
new_migrate.title = 新遷移
new_org.title = 新組織
new_repo.link = 新儲存庫
new_migrate.link = 新遷移
new_org.link = 新組織
copy_generic = 複製到剪貼簿
copy_url = 複製網址
copy_hash = 複製雜湊值
filter.private = 私有庫
[aria]
footer = 頁尾
@ -777,6 +793,8 @@ settings.branches.update_default_branch = 更新預設分支
milestones.filter_sort.name = 組織名稱
[graphs]
[org]
@ -1062,6 +1080,8 @@ users = 使用者帳戶
defaulthooks = 預設 Webhook
config_settings = 組織設定
[action]
create_repo=建立了儲存庫 <a href="%s">%s</a>
rename_repo=重新命名儲存庫 <code>%[1]s</code> 為 <a href="%[2]s">%[3]s</a>
@ -1132,4 +1152,6 @@ runners.labels = 標籤
[projects]
[git.filemode]
[git.filemode]
[search]

View file

@ -217,7 +217,7 @@ missing_csrf=錯誤的請求:未提供 CSRF 符記
invalid_csrf=錯誤的請求:無效的 CSRF 符記
not_found=找不到目標。
network_error=網路錯誤
report_message = 如果您相信這是一個 Forgejo 的錯誤,請在 <a href="%s" target="_blank">Codeberg</a> 上搜尋相關問題,或在必要時提出一個問題。
report_message = 如果您相信這是一個 Forgejo 的錯誤,請在 <a href="%s" target="_blank">Codeberg</a> 上搜尋相關問題,或在必要時提出一個問題。
server_internal = 伺服器內部錯誤
[startpage]
@ -681,6 +681,7 @@ admin_cannot_delete_self = 當您是管理員時,您不能刪除自己。請
username_error_no_dots = ` 只能包含英數字符("0-9","a-z","A-Z"),破折號("-")和底線("_")。只能以英數字元開頭或結尾,連續的非英數字元也不被允許。`
required_prefix = 輸入文字必須以「%s」開頭
username_claiming_cooldown =使用者名稱無法被認領,因為其冷卻期尚未結束。可以在 %[1]s 後被認領。
email_domain_is_not_allowed = 使用者電子郵件地址 <b>%s</b> 的網域與 EMAIL_DOMAIN_ALLOWLIST 或 EMAIL_DOMAIN_BLOCKLIST 衝突。確保你已正確設定電子郵件地址。
[user]
@ -1058,6 +1059,8 @@ language.description = 這個語言會被儲存至您的帳號,並被用作您
user_block_yourself = 你不能封鎖自己。
pronouns_custom_label = 自訂代名詞
change_username_redirect_prompt.with_cooldown.one = 舊的使用者名稱將在 %[1]d 天的冷卻期後對所有人開放,你仍然可以在冷卻期內重新獲得舊的使用者名稱。
change_username_redirect_prompt.with_cooldown.few = 舊的使用者名稱將在 %[1]d 天的冷卻期後對所有人開放,你仍然可以在冷卻期內重新獲得舊的使用者名稱。
keep_activity_private.description = 你的<a href="%s">公開活動</a>只有你和站點管理員可見。
[repo]
owner=所有者
@ -2269,7 +2272,7 @@ settings.deploy_key_content=內容
settings.key_been_used=具有相同內容的部署金鑰已在使用中。
settings.key_name_used=已有相同名稱的部署金鑰。
settings.add_key_success=已新增部署金鑰「%s」。
settings.deploy_key_deletion=除部署金鑰
settings.deploy_key_deletion=除部署金鑰
settings.deploy_key_deletion_desc=移除部署金鑰將拒絕它存取此儲存庫。是否繼續?
settings.deploy_key_deletion_success=部署金鑰已移除。
settings.branches=分支
@ -2279,7 +2282,7 @@ settings.protected_branch.delete_rule=刪除規則
settings.protected_branch_can_push=允許推送?
settings.protected_branch_can_push_yes=你可以推送
settings.protected_branch_can_push_no=你不能推送
settings.branch_protection=<b>%s</b> 的分支保護
settings.branch_protection=分支「<b>%s</b>」的保護規則
settings.protect_this_branch=啟用分支保護
settings.protect_this_branch_desc=防止刪除分支,並限制 Git 推送與合併到分支。
settings.protect_disable_push=停用推送
@ -2365,7 +2368,7 @@ settings.lfs_findcommits=尋找提交
settings.lfs_lfs_file_no_commits=找不到和此 LFS 檔案關聯的提交
settings.lfs_noattribute=此路徑在預設分支中沒有可鎖定的屬性
settings.lfs_delete=刪除 OID 為 %s 的 LFS 檔案
settings.lfs_delete_warning=刪除 LFS 檔案可能會造成 Checkout 時發生「物件不存在」的錯誤,您確定嗎?
settings.lfs_delete_warning=刪除 LFS 檔案可能會導致簽出時發生「物件不存在」的錯誤。你確定嗎?
settings.lfs_findpointerfiles=尋找指標檔案
settings.lfs_locks=鎖定
settings.lfs_invalid_locking_path=無效的路徑: %s
@ -2377,7 +2380,7 @@ settings.lfs_locks_no_locks=沒有鎖定
settings.lfs_lock_file_no_exist=已鎖定的檔案不存在於預設分支
settings.lfs_force_unlock=強制解鎖
settings.lfs_pointers.found=找到 %d 個 blob 指標 - %d 個已關聯, %d 個未關聯 (%d 個從存放區遺失)
settings.lfs_pointers.sha=Blob 哈希
settings.lfs_pointers.sha=Blob 雜湊
settings.lfs_pointers.oid=OID
settings.lfs_pointers.inRepo=在儲存庫中
settings.lfs_pointers.exists=存在於存放區
@ -2424,7 +2427,7 @@ diff.load=載入差異
diff.generated=自動產生的
diff.vendored=vendored
diff.comment.placeholder=留言
diff.comment.markdown_info=支援 markdown 格式。
diff.comment.markdown_info=支援 Markdown 格式。
diff.comment.add_single_comment=加入單獨的留言
diff.comment.add_review_comment=新增留言
diff.comment.start_review=開始審核
@ -2439,7 +2442,7 @@ diff.review.reject=請求變更
diff.review.self_approve=合併請求的作者不能核可自己的合併請求
diff.committed_by=提交者
diff.protected=受保護
diff.image.side_by_side=
diff.image.side_by_side=
diff.image.swipe=滑動
diff.image.overlay=重疊
diff.has_escaped=這一行有隱藏的 Unicode 字元
@ -2763,12 +2766,101 @@ release.title = 發行標題
settings.protect_patterns = 式樣
mirror_use_ssh.helper = 當你選擇此選項時Forgejo 將透過 Git SSH 鏡像儲存庫並為你建立金鑰對。你必須確保已產生的公鑰已有授權才能推送至目標儲存庫。選擇此選項時,你不能使用基於密碼的授權。
settings.event_pull_request_review_request = 審核請求
settings.protect_new_rule = 建立新的分支保護規則
settings.remove_protected_branch_success = 分支保護規則「%s」已被移除。
release.hide_archive_links_helper = 隱藏此發行自動產生的原始碼封存。例如,如果你正在自行上載。
settings.enforce_on_admins_desc = 儲存庫管理員不能繞過此規則。
release.message = 描述此發行
release.deletion_desc = 刪除發行只會將其從 Forgejo 中移除。它不會影響 Git 標籤、儲存庫的內容或其歷史記錄。繼續?
settings.unarchive.error = 嘗試取消封存儲存庫時發生錯誤。請參閱日誌以了解更多詳細資訊。
release.invalid_external_url = 無效的外部網址:%s
release.add_external_asset = 新增外部資產
release.asset_name = 資產名稱
release.type_external_asset = 外部資產
branch.tag_collision = 無法建立分支「%s」因為儲存庫中已存在同名標籤。
settings.protect_status_check_patterns = 狀態檢查式樣
branch.delete_desc = 刪除分支是永久性的。雖然被刪除的分支在實際被移除之前可能會繼續存在一小段時間,但是大多數情況下它是無法撤銷的。繼續?
release.system_generated = 此附件是自動產生的。
topic.format_prompt = 主題必須以字母或數字開頭,可以包含半形破折號(-)和點(.),最長 35 個字元。字母必須是小寫。
settings.remove_protected_branch_failed = 移除分支保護規則「%s」失敗。
branch.warning_rename_default_branch = 你正在重新命名預設分支。
settings.rename_branch_failed_protected = 無法重新命名分支 %s因為它是受保護的分支。
settings.unarchive.success = 此儲存庫已成功取消封存。
settings.unarchive.text = 取消封存儲存庫將恢復其接收提交和推送,以及新問題和合併請求的能力。
release.hide_archive_links = 隱藏自動產生的封存
settings.protect_no_valid_status_check_patterns = 沒有有效的狀態檢查式樣。
settings.enforce_on_admins = 為儲存庫管理員強制執行此規則
settings.wiki_rename_branch_main_notices_2 = 這將永久重新命名儲存庫 %s 的 Wiki 的內部分支。現有的簽出將需要更新。
settings.discord_icon_url.exceeds_max_length = 圖示網址長度必須小於或等於 2048 個字符
settings.wiki_branch_rename_success = 儲存庫 Wiki 的分支名稱已成功規範化。
commits.view_single_diff = 查看此提交中對此提交的變更
issues.new.assign_to_me = 指派給我
mirror_denied_combination = 不能組合使用公鑰和基於密碼的驗證。
settings.update_settings_no_unit = 儲存庫至少應該允許某種形式的交互。
pulls.edit.already_changed = 無法儲存對合併請求的變更。看起來內容已被另一個使用者變更。請重新整理頁面並嘗試再次編輯以避免覆蓋其變更
settings.add_collaborator_blocked_our = 無法新增協作者,因為儲存庫擁有者已封鎖他們。
issues.edit.already_changed = 無法儲存對問題的變更。看起來內容已被另一個使用者變更。請重新整理頁面並嘗試再次編輯以避免覆蓋其變更
settings.federation_following_repos = 關注儲存庫的網址。以半形分號「;」分隔,沒有空格。
settings.federation_not_enabled = 你的站點上未啟用聯邦。
settings.federation_apapiurl = 此儲存庫的聯邦網址。將其複製並貼上至另一個儲存庫的聯邦設定中作為關注儲存庫的網址。
settings.enter_repo_name = 準確輸入擁有者和儲存庫名稱,如下所示:
settings.wiki_rename_branch_main = 規範化 Wiki 分支名稱
settings.wiki_branch_rename_failure = 無法規範化儲存庫 Wiki 的分支名稱。
settings.confirm_wiki_branch_rename = 重新命名 Wiki 分支
settings.transfer_quota_exceeded = 新擁有者(%s已超出配額。儲存庫尚未轉移。
settings.wiki_rename_branch_main_notices_1 = 此操作<strong>無法</strong>撤銷。
settings.push_mirror_sync_in_progress = 目前正在將變更推送至遠端 %s。
settings.confirmation_string = 確認字串
issues.review.pending.tooltip = 其他使用者目前看不到此留言。要提交你的待處理留言,請選擇頁面頂部的「%s」->「%s/%s/%s」。
pulls.delete_after_merge.head_branch.is_default = 你要刪除的頭分支是預設分支,無法刪除。
pulls.delete_after_merge.head_branch.is_protected = 你要刪除的頭分支是受保護的分支,無法刪除。
pulls.delete_after_merge.head_branch.insufficient_branch = 你沒有權限刪除頭分支。
settings.pull_mirror_sync_in_progress = 目前正在從遠端 %s 拉取變更。
settings.pull_mirror_sync_quota_exceeded = 配額已超出,不拉取變更。
settings.wiki_globally_editable = 允許任何人編輯 Wiki
settings.transfer_abort_success = 轉移儲存庫至 %s 已成功取消。
settings.add_collaborator_blocked_them = 無法新增協作者,因為他們已封鎖儲存庫擁有者。
settings.add_webhook.invalid_path = 路徑不能包含「.」、「..」或空字串。它不能以斜線開頭或結尾。
settings.webhook.test_delivery_desc_disabled = 要使用虛假事件測試此 Webhook請啟動它。
settings.webhook.replay.description_disabled = 要重播此 Webhook請啟動它。
settings.wiki_rename_branch_main_desc = 將 Wiki 內部使用的分支重新命名為「%s」。此變更是永久性的無法撤消。
settings.mirror_settings.push_mirror.copy_public_key = 複製公鑰
settings.default_update_style_desc = 用於更新落後於基礎分支的合併請求的預設更新模式。
summary_card_alt = 儲存庫 %s 的摘要卡
pulls.recently_pushed_new_branches = 你已於 %[2]s 推送分支 <a href="%[3]s"><strong>%[1]s</strong></a>
pulls.sign_in_require = <a href="%s">登入</a>以建立新的合併請求。
issues.num_reviews_one = %d 則審閱
issues.num_reviews_few = %d 則審閱
new_from_template_description = 你可以選擇此站點上現有的儲存庫範本並套用其設定。
auto_init_description = 使用 README 開始 Git 歷史記錄並可選擇新增 License 和 .gitignore 檔案。
issues.reaction.add = 新增反應
issues.reaction.alt_few = %[1]s 對 %[2]s 做出了反應。
issues.reaction.alt_many = %[1]s 和另外 %[2]d 人對 %[3]s 做出了反應。
issues.context.menu = 留言選單
issues.summary_card_alt = 儲存庫 %[2]s 中標題為「%[1]s」的問題摘要卡
release.summary_card_alt = 儲存庫 %[2]s 中名為「%[1]s」的發行摘要卡
error.broken_git_hook = 此儲存庫的 Git 鉤子似乎已損壞。請按照<a target="_blank" rel="noreferrer" href="%s">文件</a>修復它們,然後推送一些提交以重新整理狀態。
issues.reaction.alt_remove = 從留言中移除 %[1]s 的反應。
vendored = 已供應
settings.mirror_settings.docs.doc_link_pull_section = 文件中的「從遠端儲存庫拉取」部分。
settings.event_pull_request_review_request_desc = 合併請求審核請求或審核請求已移除。
settings.protect_status_check_patterns_desc = 輸入模式以指定其他分支在合併到受此規則保護的分支前必須通過的狀態檢查。每行指定一個模式,模式不得為空白。
settings.protect_invalid_status_check_pattern = 狀態檢查模式無效: 「%s」。
settings.ignore_stale_approvals_desc = 不計算在較舊提交上進行的核可(過時的審核)作為合併請求的核可數量。如果過時的審核已經被捨棄,則無關緊要。
settings.tags.protection.pattern.description = 您可以使用單一名稱或 glob 模式或正則表達式來匹配多個標籤。詳情請參閱 <a target="_blank" rel="noopener" href="%s">受保護標籤指南</a>。
settings.thread_id = 線程 ID
settings.archive.text = 封存儲存庫將使其完全變為唯讀。它將從儀表板中隱藏。沒有人(甚至包括您!)將能夠進行新的提交,或打開任何問題或合併請求。
diff.comment.add_line_comment = 新增行評論
[graphs]
component_loading = 載入中 %s…
code_frequency.what = 寫程式頻率
recent_commits.what = 最近的提交
contributors.what = 貢獻
component_loading_info = 這可能需要一點時間…
component_loading_failed = 無法載入 %s
component_failed_to_load = 發生了意外錯誤。
[org]
org_name_holder=組織名稱
@ -2835,17 +2927,17 @@ members.member=普通成員
members.remove=移除
members.remove.detail=確定要從 %[2]s 中刪除 %[1]s 嗎?
members.leave=離開
members.leave.detail=確定要離開 %s 嗎?
members.leave.detail=你確定你要離開組織「%s」嗎?
members.invite_desc=邀請新的用戶加入 %s
members.invite_now=立即邀請
teams.join=加入
teams.leave=離開
teams.leave.detail=確定要離開 %s 嗎?
teams.leave.detail=你確定你要離開團隊「%s」嗎?
teams.can_create_org_repo=建立儲存庫
teams.can_create_org_repo_helper=成員可以在組織中新增儲存庫。建立者將自動取得新儲存庫的管理員權限。
teams.none_access=沒有權限
teams.none_access_helper=成員無法檢視此單元或對其執行其他動作,這對公開儲存庫沒有影響
teams.none_access=無權存取
teams.none_access_helper=「無權存取」選項僅對私人儲存庫有效
teams.general_access=自訂存取
teams.general_access_helper=成員權限將由下列權限表決定。
teams.read_access=讀取
@ -2893,6 +2985,10 @@ open_dashboard = 開啟儀錶板
settings.email = 聯絡電子郵件
form.name_pattern_not_allowed = 組織名稱中不允許使用式樣「%s」。
follow_blocked_user = 你無法關注此組織,因為此組織已封鎖你。
teams.invite.title = 你已被邀請加入組織 <strong>%[2]s</strong> 中的團隊 <strong>%[1]s</strong>。
settings.change_orgname_prompt = 注意:變更組織名稱也會變更你組織的網址並釋放舊名稱。
settings.change_orgname_redirect_prompt.with_cooldown.few = 舊的組織名稱將在 %[1]d 天的冷卻期後對所有人可用,你仍然可以在冷卻期內重新使用舊名稱。
settings.change_orgname_redirect_prompt.with_cooldown.one = 舊的組織名稱將在 %[1]d 天的冷卻期後對所有人可用,您仍然可以在冷卻期內重新使用舊名稱。
[admin]
dashboard=資訊主頁
@ -2982,9 +3078,9 @@ dashboard.delete_old_actions.started=從資料庫刪除所有舊行為的任務
dashboard.update_checker=更新檢查器
dashboard.delete_old_system_notices=從資料庫刪除所有舊系統提示
dashboard.gc_lfs=對 LFS meta objects 進行垃圾回收
dashboard.stop_zombie_tasks=停止殭屍任務
dashboard.stop_endless_tasks=停止永不停止的任務
dashboard.cancel_abandoned_jobs=取消已放棄的作業
dashboard.stop_zombie_tasks=停止殭屍 Actions 任務
dashboard.stop_endless_tasks=停止永不停止的 Actions 任務
dashboard.cancel_abandoned_jobs=取消已放棄的 Actions 作業
users.user_manage_panel=使用者帳號管理
users.new_account=建立使用者帳號
@ -3121,7 +3217,7 @@ auths.search_page_size=頁面大小
auths.filter=使用者篩選器
auths.admin_filter=管理者篩選器
auths.restricted_filter=受限制的篩選器
auths.restricted_filter_helper=留白則不限制任何使用者。使用米字「*」將所有不符合管理員篩選條件的使用者設定為受限。
auths.restricted_filter_helper=留白以不限制任何使用者。使用半形星號「*」以將所有不符合管理員篩選條件的使用者設定為受限。
auths.verify_group_membership=驗證 LDAP 群組成員資格 (篩選器留空以跳過)
auths.group_search_base=群組搜尋的 Base DN
auths.group_attribute_list_users=包含使用者清單的群組屬性
@ -3134,15 +3230,15 @@ auths.smtp_auth=SMTP 驗證類型
auths.smtphost=SMTP 主機地址
auths.smtpport=SMTP 連接埠
auths.allowed_domains=允許的域名
auths.allowed_domains_helper=留白以允許所有域名。以半形逗號「,」分隔多個域名。
auths.skip_tls_verify=略 TLS 驗證
auths.allowed_domains_helper=留白以允許所有域名。以半形逗號,分隔多個域名。
auths.skip_tls_verify= TLS 驗證
auths.force_smtps=強制 SMTPS
auths.force_smtps_helper=SMTPS 總是使用 465 埠。設定此選項以強制 SMTPS 使用其他埠。(除此之外若主機支援的話 STARTTLS 也會使用該埠。)
auths.helo_hostname=HELO 主機名稱
auths.helo_hostname_helper=用 HELO 傳送的主機名稱。留空以傳送目前的主機名稱。
auths.disable_helo=停用 HELO
auths.pam_service_name=PAM 服務名稱
auths.pam_email_domain=PAM 電子信箱域名 (選用)
auths.pam_email_domain=PAM 電子信箱域名(選用)
auths.oauth2_provider=OAuth2 提供者
auths.oauth2_icon_url=圖示 URL
auths.oauth2_clientID=客戶端 ID (金鑰)
@ -3188,11 +3284,11 @@ auths.tip.github=註冊新的 OAuth 應用程式。網址:%s
auths.tip.gitlab=註冊新的應用程式。網址https://gitlab.com/profile/applications
auths.tip.google_plus=從 Google API 控制台取得 OAuth2 使用者端憑證。網址:%s
auths.tip.openid_connect=使用 OpenID 連接探索 URL (<server>/.well-known/openid-configuration) 來指定節點
auths.tip.twitter=建立應用程式並確保有啟用「Allow this application to be used to Sign in with Twitter」。網址%s
auths.tip.discord=註冊新應用程式。網址:%s
auths.tip.twitter=前往 %s建立應用程式並確保啟用了「允許此應用程式用於使用 Twitter 登入」選項
auths.tip.discord=在 %s 上註冊新應用程式
auths.tip.yandex=在 %s 建立新的應用程式。請在「Yandex.Passport API」區塊選擇選擇下列權限「Access to email address」、「Access to user avatar」和「Access to username, first name and surname, gender」
auths.tip.mastodon=輸入您想用來認證的 Mastodon 站點的自訂網址(或使用預設值)
auths.edit=修改認證來源
auths.edit=編輯認證來源
auths.activated=該認證來源已啟用
auths.new_success=已新增認證「%s」。
auths.update_success=已更新認證來源。
@ -3212,10 +3308,10 @@ config.app_name=站點標題
config.app_ver=Forgejo 版本
config.app_url=Forgejo 基底 URL
config.custom_conf=設定檔路徑
config.custom_file_root_path=自訂檔案根目錄
config.custom_file_root_path=自訂檔案根路徑
config.domain=伺服器域名
config.offline_mode=本地模式
config.disable_router_log=關閉路由日誌
config.disable_router_log=停用路由日誌
config.run_user=以使用者名稱執行
config.run_mode=執行模式
config.git_version=Git 版本
@ -3223,7 +3319,7 @@ config.repo_root_path=儲存庫根路徑
config.lfs_root_path=LFS 根路徑
config.log_file_root_path=日誌路徑
config.script_type=腳本類型
config.reverse_auth_user=反向代理認證
config.reverse_auth_user=反向代理認證使用者
config.ssh_config=SSH 設定
config.ssh_enabled=已啟用
@ -3233,7 +3329,7 @@ config.ssh_port=連接埠
config.ssh_listen_port=監聽埠
config.ssh_root_path=根路徑
config.ssh_key_test_path=金鑰測試路徑
config.ssh_keygen_path=金鑰產生 (' ssh-keygen ') 路徑
config.ssh_keygen_path=金鑰產生ssh-keygen路徑
config.ssh_minimum_key_size_check=金鑰最小大小檢查
config.ssh_minimum_key_sizes=金鑰最小大小
@ -3259,13 +3355,13 @@ config.allow_only_external_registration=只允許從外部服務註冊
config.enable_openid_signup=啟用 OpenID 自助註冊
config.enable_openid_signin=啟用 OpenID 登入
config.show_registration_button=顯示註冊按鈕
config.require_sign_in_view=需要登入才能瀏覽頁面
config.require_sign_in_view=需要登入才能瀏覽內容
config.mail_notify=啟用電子郵件通知
config.enable_captcha=啟用驗證碼
config.active_code_lives=用使用者連結有效期
config.active_code_lives=動碼過期時間
config.reset_password_code_lives=帳號復原碼有效時間
config.default_keep_email_private=預設隱藏電子信箱
config.default_allow_create_organization=預設允許新增組織
config.default_allow_create_organization=預設允許建立組織
config.enable_timetracking=啟用時間追蹤
config.default_enable_timetracking=預設啟用時間追蹤
config.default_allow_only_contributors_to_track_time=只讓貢獻者追蹤時間
@ -3372,7 +3468,7 @@ monitor.queue.settings.submit=更新設定
monitor.queue.settings.changed=已更新設定
notices.system_notice_list=系統提示
notices.view_detail_header=查看提示細節
notices.view_detail_header=提示詳情
notices.operations=操作
notices.select_all=全部選取
notices.deselect_all=取消所有選取
@ -3400,7 +3496,7 @@ self_check.no_problem_found = 未發現任何問題。
config.send_test_mail_submit = 寄送
users.details = 使用者詳細資訊
assets = 程式碼資料
dashboard.sync_branch.started = 已開始同步分支
dashboard.sync_branch.started = 分支同步已開始
dashboard.rebuild_issue_indexer = 重建問題索引
repos.lfs_size = LFS 大小
packages.cleanup = 清除過期的資料
@ -3429,8 +3525,31 @@ config.logger_name_fmt = 日誌:%s
monitor.queue.review_add = 審閱/增加 Worker
self_check.database_fix_mysql = 對於 MySQLMariaDB 的使用者你可以使用命令「forgejo doctor convert」來修復排序規則問題或者你也可以手動透過「ALTER ... COLLATE ...」SQL 修復問題。
monitor.duration = 持續時間(秒)
systemhooks.desc = 當某些 Forgejo 事件觸發時Webhook 會自動向伺服器發出 HTTP POST 請求。此處定義的 Webhook 將作用於系統上的所有儲存庫,因此請考慮這可能產生的任何效能影響。更多資訊請參考<a target="_blank" rel="noopener" href="%s">Webhook 指南</a>。
self_check.database_inconsistent_collation_columns = 資料庫正在使用排序規則 %s但是這些欄使用的排序規則不相符。這可能會引起一些意想不到的問題。
users.block.description = 阻止此使用者透過其帳號與此服務互動並禁止登入。
auths.tip.gitlab_new = 在 %s 上註冊新應用程式
config.cache_test_succeeded = 快取測試成功,在 %s 內收到回應。
config.cache_test_failed = 無法探測快取:%v。
self_check.database_collation_case_insensitive = 資料庫正在使用排序規則 %s這是一種不敏感的排序規則。雖然 Forgejo 可以與其配合使用,但是在一些罕見情況下可能會出現無法如預期運作的情況。
config.open_with_editor_app_help = 拓製選單中的「開啟方式」編輯器。如果留空則將使用預設值。展開以查看預設值。
dashboard.sync_repo_tags = 將標籤從 Git 資料同步至資料庫
self_check.database_collation_mismatch = 期望資料庫使用的排序規則:%s
config.allow_dots_in_usernames = 允許使用者在使用者名稱中使用點。不會影響現有帳號。
dashboard.sync_repo_branches = 將缺少的分支從 Git 資料同步至資料庫
defaulthooks.desc = 當某些 Forgejo 事件觸發時Webhook 會自動向伺服器發出 HTTP POST 請求。此處定義的 Webhook 是預設的,將複製至所有新的儲存庫中。更多資訊請參考<a target="_blank" rel="noopener" href="%s">Webhook 指南</a>。
users.local_import.description = 允許從伺服器的本機檔案系統匯入儲存庫。這可能是個安全問題。
config.cache_test_slow = 快取測試成功,但是回應很慢:%s。
users.activated.description = 完成電子郵件驗證。未啟動帳號的擁有者將無法登入,直至電子郵件驗證完成。
auths.tips.oauth2.general.tip = 當註冊新的 OAuth2 驗證時,回呼/重新導向網址應該是:
users.restricted.description = 僅允許與將此使用者新增為合作者的儲存庫和組織進行互動。這會阻止存取此站點上的公共儲存庫。
users.admin.description = 授予此使用者透過網頁介面和 API 提供的所有管理功能的完全存取權。
auths.tip.gitea = 註冊一個新的 OAuth2 應用程式。指南可在 %s 找到
monitor.queue.activeworkers = 活躍工作者
monitor.queue.settings.desc = 集區會根據工作者佇列的阻塞情況動態增長。
[action]
create_repo=建立了儲存庫 <a href="%s">%s</a>
rename_repo=重新命名儲存庫 <code>%[1]s</code> 為 <a href="%[2]s">%[3]s</a>
@ -3454,7 +3573,7 @@ compare_commits=比較 %d 個提交
compare_commits_general=比較提交
mirror_sync_push=從鏡像同步了提交到 <a href="%[1]s">%[4]s</a> 的 <a href="%[2]s">%[3]s</a>
mirror_sync_create=從鏡像同步了新參考 <a href="%[2]s">%[3]s</a> 到 <a href="%[1]s">%[4]s</a>
mirror_sync_delete=從鏡像同步並從 <a href="%[1]s">%[3]s</a> 刪除了參考 <code>%[2]s</code>
mirror_sync_delete=從鏡像同步並從 <a href="%[1]s">%[3]s</a> 刪除了參考 <code>%[2]s</code>
approve_pull_request=`核可了 <a href="%[1]s">%[3]s#%[2]s</a>`
reject_pull_request=`提出了修改建議 <a href="%[1]s">%[3]s#%[2]s</a>`
publish_release=`發布了 <a href="%[1]s">%[3]s</a> 的 <a href="%[2]s"> "%[4]s" </a>`
@ -3524,7 +3643,7 @@ error.unit_not_allowed=您未被允許存取此儲存庫區域。
title=軟體包
desc=管理儲存庫軟體包。
empty=目前還沒有軟體包。
empty.documentation=關於軟體包註冊中心的詳情請參閱<a target="_blank" rel="noopener noreferrer" href="%s">說明文件</a>。
empty.documentation=關於軟體包註冊中心的詳情請參閱<a target="_blank" rel="noopener noreferrer" href="%s">文件</a>。
empty.repo=已經上傳了一個軟體包,但是它不在這裡嗎?造訪<a href="%[1]s">軟體包設定</a>並將其連結到這個儲存庫。
filter.type=類型
filter.type.all=所有
@ -3599,7 +3718,7 @@ npm.install=執行下列命令以使用 npm 安裝此軟體包:
npm.install2=或將它加到 package.json 檔:
npm.dependencies=相依性
npm.dependencies.development=開發相依性
npm.dependencies.peer=Peer 相依性
npm.dependencies.peer=同行相依性
npm.dependencies.optional=選用相依性
npm.details.tag=標籤
pub.install=執行下列命令以使用 Dart 安裝此軟體包:
@ -3665,7 +3784,7 @@ arch.version.description = 描述
arch.version.properties = 版本屬性
arch.version.backup = 備份
arch.version.conflicts = 衝突
npm.dependencies.bundle = 已捆綁的依賴項
npm.dependencies.bundle = 已捆綁相依性
arch.version.provides = 提供
arch.pacman.repo.multi.item = %s 的組態
arch.version.replaces = 取代
@ -3786,7 +3905,7 @@ variables.creation = 新增變數
variables.none = 目前沒有變數。
variables.deletion = 刪除變數
variables.deletion.description = 刪除變數是永久且不可取消的。要繼續嗎?
variables.creation.success = 變數 「%s」已成功被新增
variables.creation.success = 已新增變數 「%s」。
variables.update.failed = 編輯變數失敗。
runs.no_results = 沒有相符的結果。
runs.no_workflows = 目前沒有任何工作流程。
@ -3808,13 +3927,14 @@ workflow.dispatch.warn_input_limit = 僅顯示前 %d 個輸入。
runs.no_job = 工作流程必須包含至少一項作業
runs.expire_log_message = 日誌已被清除,因為它們太舊了。
runs.no_job_without_needs = 工作流程必須包含至少一項沒有依賴性的作業。
runs.no_matching_online_runner_helper = 沒有在線執行器匹配標籤:%s
runs.no_matching_online_runner_helper = 沒有在線執行器匹配標籤:%s
workflow.dispatch.success = 已成功請求工作流程運行。
runs.no_workflows.documentation = 有關 Forgejo Actions 的更多資訊,請參閱<a target="_blank" rel="noopener noreferrer" href="%s">文件</a>。
runners.reset_registration_token = 重置註冊符記
workflow.dispatch.use_from = 使用工作流程自
runs.no_workflows.help_no_write_access = 要了解 Forgejo Actions請參閱<a target="_blank" rel="noopener noreferrer" href="%s">文件</a>。
runs.no_workflows.help_write_access = 不知道如何開始使用 Forgejo Actions查看<a target="_blank" rel="noopener noreferrer" href="%s">使用者文件中的快速入門</a>來編寫你的第一個工作流程,然後<a target="_blank" rel="noopener noreferrer" href="%s">設定 Forgejo Runner</a>來執行你的工作。
variables.not_found = 找不到變數。
[projects]
@ -3861,6 +3981,8 @@ exact_tooltip = 只包含與搜尋詞完全相符的結合
pull_kind = 搜尋拉取…
regexp = 正規表示式
regexp_tooltip = 將搜尋詞解釋為正規表示式
union = 關鍵字
union_tooltip = 包含與任何空格分隔的關鍵字相符的結果
[munits.data]
eib = EiB
@ -3878,3 +4000,8 @@ filepreview.line = %[2]s 中的第 %[1]d 行
[translation_meta]
test = 好的
[repo.permissions]
ext_issues = 存取外部問題追蹤器的連結。權限由外部管理。
ext_wiki = 存取外部 Wiki 的連結。權限由外部管理。

1307
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -23,7 +23,7 @@
"dayjs": "1.11.12",
"dropzone": "6.0.0-beta.2",
"easymde": "2.18.0",
"esbuild-loader": "4.2.2",
"esbuild-loader": "4.3.0",
"escape-goat": "4.0.0",
"fast-glob": "3.3.3",
"htmx.org": "1.9.12",
@ -36,7 +36,7 @@
"monaco-editor": "0.52.2",
"monaco-editor-webpack-plugin": "7.1.0",
"pdfobject": "2.3.0",
"postcss": "8.5.1",
"postcss": "8.5.2",
"postcss-loader": "8.1.1",
"postcss-nesting": "13.0.1",
"pretty-ms": "9.0.0",
@ -54,7 +54,7 @@
"vue-chartjs": "5.3.1",
"vue-loader": "17.4.2",
"vue3-calendar-heatmap": "2.0.5",
"webpack": "5.97.1",
"webpack": "5.98.0",
"webpack-cli": "6.0.1",
"wrap-ansi": "9.0.0"
},
@ -84,8 +84,8 @@
"eslint-plugin-vue": "9.32.0",
"eslint-plugin-vue-scoped-css": "2.9.0",
"eslint-plugin-wc": "2.2.0",
"globals": "15.14.0",
"happy-dom": "16.8.1",
"globals": "15.15.0",
"happy-dom": "17.1.0",
"license-checker-rseidelsohn": "4.4.2",
"markdownlint-cli": "0.44.0",
"postcss-html": "1.8.0",

10
poetry.lock generated
View file

@ -44,12 +44,13 @@ files = [
[[package]]
name = "cssbeautifier"
version = "1.15.1"
version = "1.15.3"
description = "CSS unobfuscator and beautifier."
optional = false
python-versions = "*"
files = [
{file = "cssbeautifier-1.15.1.tar.gz", hash = "sha256:9f7064362aedd559c55eeecf6b6bed65e05f33488dcbe39044f0403c26e1c006"},
{file = "cssbeautifier-1.15.3-py3-none-any.whl", hash = "sha256:0dcaf5ce197743a79b3a160b84ea58fcbd9e3e767c96df1171e428125b16d410"},
{file = "cssbeautifier-1.15.3.tar.gz", hash = "sha256:406b04d09e7d62c0be084fbfa2cba5126fe37359ea0d8d9f7b963a6354fc8303"},
]
[package.dependencies]
@ -114,12 +115,13 @@ files = [
[[package]]
name = "jsbeautifier"
version = "1.15.1"
version = "1.15.3"
description = "JavaScript unobfuscator and beautifier."
optional = false
python-versions = "*"
files = [
{file = "jsbeautifier-1.15.1.tar.gz", hash = "sha256:ebd733b560704c602d744eafc839db60a1ee9326e30a2a80c4adb8718adc1b24"},
{file = "jsbeautifier-1.15.3-py3-none-any.whl", hash = "sha256:b207a15ab7529eee4a35ae7790e9ec4e32a2b5026d51e2d0386c3a65e6ecfc91"},
{file = "jsbeautifier-1.15.3.tar.gz", hash = "sha256:5f1baf3d4ca6a615bb5417ee861b34b77609eeb12875555f8bbfabd9bf2f3457"},
]
[package.dependencies]

View file

@ -70,8 +70,8 @@ func RepositoryInbox(ctx *context.APIContext) {
repository := ctx.Repo.Repository
log.Info("RepositoryInbox: repo: %v", repository)
form := web.GetForm(ctx)
// TODO: Decide between like/undo{like} activity
httpStatus, title, err := federation.ProcessLikeActivity(ctx, form, repository.ID)
if err != nil {
ctx.Error(httpStatus, title, err)

View file

@ -62,6 +62,10 @@ func ListIssueComments(ctx *context.APIContext) {
// "$ref": "#/responses/CommentList"
// "404":
// "$ref": "#/responses/notFound"
// "422":
// "$ref": "#/responses/validationError"
// "500":
// "$ref": "#/responses/internalServerError"
before, since, err := context.GetQueryBeforeSince(ctx.Base)
if err != nil {
@ -70,6 +74,10 @@ func ListIssueComments(ctx *context.APIContext) {
}
issue, err := issues_model.GetIssueByIndex(ctx, ctx.Repo.Repository.ID, ctx.ParamsInt64(":index"))
if err != nil {
if issues_model.IsErrIssueNotExist(err) {
ctx.NotFound("IsErrIssueNotExist", err)
return
}
ctx.Error(http.StatusInternalServerError, "GetRawIssueByIndex", err)
return
}
@ -166,6 +174,10 @@ func ListIssueCommentsAndTimeline(ctx *context.APIContext) {
// "$ref": "#/responses/TimelineList"
// "404":
// "$ref": "#/responses/notFound"
// "422":
// "$ref": "#/responses/validationError"
// "500":
// "$ref": "#/responses/internalServerError"
before, since, err := context.GetQueryBeforeSince(ctx.Base)
if err != nil {
@ -174,6 +186,10 @@ func ListIssueCommentsAndTimeline(ctx *context.APIContext) {
}
issue, err := issues_model.GetIssueByIndex(ctx, ctx.Repo.Repository.ID, ctx.ParamsInt64(":index"))
if err != nil {
if issues_model.IsErrIssueNotExist(err) {
ctx.NotFound("IsErrIssueNotExist", err)
return
}
ctx.Error(http.StatusInternalServerError, "GetRawIssueByIndex", err)
return
}
@ -271,6 +287,10 @@ func ListRepoIssueComments(ctx *context.APIContext) {
// "$ref": "#/responses/CommentList"
// "404":
// "$ref": "#/responses/notFound"
// "422":
// "$ref": "#/responses/validationError"
// "500":
// "$ref": "#/responses/internalServerError"
before, since, err := context.GetQueryBeforeSince(ctx.Base)
if err != nil {
@ -378,9 +398,16 @@ func CreateIssueComment(ctx *context.APIContext) {
// "$ref": "#/responses/notFound"
// "423":
// "$ref": "#/responses/repoArchivedError"
// "500":
// "$ref": "#/responses/internalServerError"
form := web.GetForm(ctx).(*api.CreateIssueCommentOption)
issue, err := issues_model.GetIssueByIndex(ctx, ctx.Repo.Repository.ID, ctx.ParamsInt64(":index"))
if err != nil {
if issues_model.IsErrIssueNotExist(err) {
ctx.NotFound("IsErrIssueNotExist", err)
return
}
ctx.Error(http.StatusInternalServerError, "GetIssueByIndex", err)
return
}
@ -449,6 +476,8 @@ func GetIssueComment(ctx *context.APIContext) {
// "$ref": "#/responses/forbidden"
// "404":
// "$ref": "#/responses/notFound"
// "500":
// "$ref": "#/responses/internalServerError"
comment := ctx.Comment
@ -511,6 +540,9 @@ func EditIssueComment(ctx *context.APIContext) {
// "$ref": "#/responses/notFound"
// "423":
// "$ref": "#/responses/repoArchivedError"
// "500":
// "$ref": "#/responses/internalServerError"
form := web.GetForm(ctx).(*api.EditIssueCommentOption)
editIssueComment(ctx, *form)
}
@ -560,6 +592,8 @@ func EditIssueCommentDeprecated(ctx *context.APIContext) {
// "$ref": "#/responses/forbidden"
// "404":
// "$ref": "#/responses/notFound"
// "500":
// "$ref": "#/responses/internalServerError"
form := web.GetForm(ctx).(*api.EditIssueCommentOption)
editIssueComment(ctx, *form)
@ -626,8 +660,8 @@ func DeleteIssueComment(ctx *context.APIContext) {
// "$ref": "#/responses/empty"
// "403":
// "$ref": "#/responses/forbidden"
// "404":
// "$ref": "#/responses/notFound"
// "500":
// "$ref": "#/responses/internalServerError"
deleteIssueComment(ctx, issues_model.CommentTypeComment)
}
@ -665,8 +699,8 @@ func DeleteIssueCommentDeprecated(ctx *context.APIContext) {
// "$ref": "#/responses/empty"
// "403":
// "$ref": "#/responses/forbidden"
// "404":
// "$ref": "#/responses/notFound"
// "500":
// "$ref": "#/responses/internalServerError"
deleteIssueComment(ctx, issues_model.CommentTypeComment)
}

View file

@ -63,6 +63,7 @@ func UpdateUserSettings(ctx *context.APIContext) {
Theme: optional.FromPtr(form.Theme),
DiffViewStyle: optional.FromPtr(form.DiffViewStyle),
KeepEmailPrivate: optional.FromPtr(form.HideEmail),
KeepPronounsPrivate: optional.FromPtr(form.HidePronouns),
KeepActivityPrivate: optional.FromPtr(form.HideActivity),
EnableRepoUnitHints: optional.FromPtr(form.EnableRepoUnitHints),
}

View file

@ -31,6 +31,7 @@ func AuthShared(ctx *context.Base, sessionStore auth_service.SessionStore, authM
ctx.Data["SignedUserID"] = ar.Doer.ID
ctx.Data["IsAdmin"] = ar.Doer.IsAdmin
} else {
ctx.Data["IsSigned"] = false
ctx.Data["SignedUserID"] = int64(0)
}
return ar, nil

View file

@ -95,10 +95,9 @@ func stripSlashesMiddleware(next http.Handler) http.Handler {
prevWasSlash = chr == '/'
}
if rctx == nil {
req.URL.Path = sanitizedPath.String()
} else {
rctx.RoutePath = sanitizedPath.String()
req.URL.Path = sanitizedPath.String()
if rctx != nil {
rctx.RoutePath = req.URL.Path
}
next.ServeHTTP(resp, req)
})

View file

@ -7,6 +7,9 @@ import (
"net/http/httptest"
"testing"
"code.gitea.io/gitea/modules/web"
chi "github.com/go-chi/chi/v5"
"github.com/stretchr/testify/assert"
)
@ -43,6 +46,11 @@ func TestStripSlashesMiddleware(t *testing.T) {
inputPath: "/user2//repo1/",
expectedPath: "/user2/repo1",
},
{
name: "path with slashes in the beginning",
inputPath: "https://codeberg.org//user2/repo1/",
expectedPath: "/user2/repo1",
},
{
name: "path with slashes and query params",
inputPath: "/repo//migrate?service_type=3",
@ -56,15 +64,22 @@ func TestStripSlashesMiddleware(t *testing.T) {
}
for _, tt := range tests {
testMiddleware := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
r := web.NewRoute()
r.Use(stripSlashesMiddleware)
called := false
r.Get("*", func(w http.ResponseWriter, r *http.Request) {
assert.Equal(t, tt.expectedPath, r.URL.Path)
rctx := chi.RouteContext(r.Context())
assert.Equal(t, tt.expectedPath, rctx.RoutePath)
called = true
})
// pass the test middleware to validate the changes
handlerToTest := stripSlashesMiddleware(testMiddleware)
// create a mock request to use
req := httptest.NewRequest("GET", tt.inputPath, nil)
// call the handler using a mock response recorder
handlerToTest.ServeHTTP(httptest.NewRecorder(), req)
r.ServeHTTP(httptest.NewRecorder(), req)
assert.True(t, called)
}
}

View file

@ -62,7 +62,7 @@ func autoSignIn(ctx *context.Context) (bool, error) {
return false, nil
}
u, err := user_model.VerifyUserAuthorizationToken(ctx, authCookie, auth.LongTermAuthorization, false)
u, _, err := user_model.VerifyUserAuthorizationToken(ctx, authCookie, auth.LongTermAuthorization)
if err != nil {
return false, fmt.Errorf("VerifyUserAuthorizationToken: %w", err)
}
@ -171,6 +171,8 @@ func SignIn(ctx *context.Context) {
context.SetCaptchaData(ctx)
}
ctx.Data["DisablePassword"] = !setting.Service.EnableInternalSignIn
ctx.HTML(http.StatusOK, tplSignIn)
}
@ -190,6 +192,7 @@ func SignInPost(ctx *context.Context) {
ctx.Data["PageIsLogin"] = true
ctx.Data["EnableSSPI"] = auth.IsSSPIEnabled(ctx)
ctx.Data["EnableInternalSignIn"] = setting.Service.EnableInternalSignIn
ctx.Data["DisablePassword"] = !setting.Service.EnableInternalSignIn
// Permission denied if EnableInternalSignIn is false
if !setting.Service.EnableInternalSignIn {
@ -669,7 +672,7 @@ func Activate(ctx *context.Context) {
return
}
user, err := user_model.VerifyUserAuthorizationToken(ctx, code, auth.UserActivation, false)
user, deleteToken, err := user_model.VerifyUserAuthorizationToken(ctx, code, auth.UserActivation)
if err != nil {
ctx.ServerError("VerifyUserAuthorizationToken", err)
return
@ -690,6 +693,11 @@ func Activate(ctx *context.Context) {
return
}
if err := deleteToken(); err != nil {
ctx.ServerError("deleteToken", err)
return
}
handleAccountActivation(ctx, user)
}
@ -738,7 +746,7 @@ func ActivatePost(ctx *context.Context) {
return
}
user, err := user_model.VerifyUserAuthorizationToken(ctx, code, auth.UserActivation, true)
user, deleteToken, err := user_model.VerifyUserAuthorizationToken(ctx, code, auth.UserActivation)
if err != nil {
ctx.ServerError("VerifyUserAuthorizationToken", err)
return
@ -767,6 +775,11 @@ func ActivatePost(ctx *context.Context) {
}
}
if err := deleteToken(); err != nil {
ctx.ServerError("deleteToken", err)
return
}
handleAccountActivation(ctx, user)
}
@ -827,7 +840,7 @@ func ActivateEmail(ctx *context.Context) {
code := ctx.FormString("code")
emailStr := ctx.FormString("email")
u, err := user_model.VerifyUserAuthorizationToken(ctx, code, auth.EmailActivation(emailStr), true)
u, deleteToken, err := user_model.VerifyUserAuthorizationToken(ctx, code, auth.EmailActivation(emailStr))
if err != nil {
ctx.ServerError("VerifyUserAuthorizationToken", err)
return
@ -837,6 +850,11 @@ func ActivateEmail(ctx *context.Context) {
return
}
if err := deleteToken(); err != nil {
ctx.ServerError("deleteToken", err)
return
}
email, err := user_model.GetEmailAddressOfUser(ctx, emailStr, u.ID)
if err != nil {
ctx.ServerError("GetEmailAddressOfUser", err)

View file

@ -44,6 +44,7 @@ func LinkAccount(ctx *context.Context) {
ctx.Data["DisableRegistration"] = setting.Service.DisableRegistration
ctx.Data["AllowOnlyInternalRegistration"] = setting.Service.AllowOnlyInternalRegistration
ctx.Data["ShowRegistrationButton"] = false
ctx.Data["EnableInternalSignIn"] = true
// use this to set the right link into the signIn and signUp templates in the link_account template
ctx.Data["SignInLink"] = setting.AppSubURL + "/user/link_account_signin"
@ -122,6 +123,7 @@ func LinkAccountPostSignIn(ctx *context.Context) {
ctx.Data["CfTurnstileSitekey"] = setting.Service.CfTurnstileSitekey
ctx.Data["DisableRegistration"] = setting.Service.DisableRegistration
ctx.Data["ShowRegistrationButton"] = false
ctx.Data["EnableInternalSignIn"] = true
// use this to set the right link into the signIn and signUp templates in the link_account template
ctx.Data["SignInLink"] = setting.AppSubURL + "/user/link_account_signin"

View file

@ -116,7 +116,7 @@ func commonResetPassword(ctx *context.Context, shouldDeleteToken bool) (*user_mo
}
// Fail early, don't frustrate the user
u, err := user_model.VerifyUserAuthorizationToken(ctx, code, auth.PasswordReset, shouldDeleteToken)
u, deleteToken, err := user_model.VerifyUserAuthorizationToken(ctx, code, auth.PasswordReset)
if err != nil {
ctx.ServerError("VerifyUserAuthorizationToken", err)
return nil, nil
@ -127,6 +127,13 @@ func commonResetPassword(ctx *context.Context, shouldDeleteToken bool) (*user_mo
return nil, nil
}
if shouldDeleteToken {
if err := deleteToken(); err != nil {
ctx.ServerError("deleteToken", err)
return nil, nil
}
}
twofa, err := auth.GetTwoFactorByUID(ctx, u.ID)
if err != nil {
if !auth.IsErrTwoFactorNotEnrolled(err) {

View file

@ -21,7 +21,6 @@ import (
"code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/charset"
"code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/gitgraph"
"code.gitea.io/gitea/modules/gitrepo"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/markup"
@ -32,6 +31,7 @@ import (
"code.gitea.io/gitea/services/forms"
"code.gitea.io/gitea/services/gitdiff"
git_service "code.gitea.io/gitea/services/repository"
"code.gitea.io/gitea/services/repository/gitgraph"
)
const (

View file

@ -106,6 +106,7 @@ func ProfilePost(ctx *context.Context) {
Location: optional.Some(form.Location),
Visibility: optional.Some(form.Visibility),
KeepActivityPrivate: optional.Some(form.KeepActivityPrivate),
KeepPronounsPrivate: optional.Some(form.KeepPronounsPrivate),
}
if err := user_service.UpdateUser(ctx, ctx.Doer, opts); err != nil {
ctx.ServerError("UpdateUser", err)

View file

@ -157,6 +157,17 @@ type swaggerAPIRepoArchivedError struct {
Body APIRepoArchivedError `json:"body"`
}
type APIInternalServerError struct {
APIError
}
// APIInternalServerError is an error that is raised when an internal server error occurs
// swagger:response internalServerError
type swaggerAPIInternalServerError struct {
// in:body
Body APIInternalServerError `json:"body"`
}
// ServerError responds with error message, status is 500
func (ctx *APIContext) ServerError(title string, err error) {
ctx.Error(http.StatusInternalServerError, title, err)

View file

@ -1058,7 +1058,7 @@ func RepoRefByType(refType RepoRefType, ignoreNotExistErr ...bool) func(*Context
if refType == RepoRefLegacy {
// redirect from old URL scheme to new URL scheme
prefix := strings.TrimPrefix(setting.AppSubURL+strings.ToLower(strings.TrimSuffix(ctx.Req.URL.Path, ctx.Params("*"))), strings.ToLower(ctx.Repo.RepoLink))
prefix := strings.TrimPrefix(setting.AppSubURL+strings.ToLower(strings.TrimSuffix(ctx.Req.URL.Path, ctx.PathParamRaw("*"))), strings.ToLower(ctx.Repo.RepoLink))
ctx.Redirect(path.Join(
ctx.Repo.RepoLink,

View file

@ -57,7 +57,7 @@ func toUser(ctx context.Context, user *user_model.User, signed, authed bool) *ap
Created: user.CreatedUnix.AsTime(),
Restricted: user.IsRestricted,
Location: user.Location,
Pronouns: user.Pronouns,
Pronouns: user.GetPronouns(signed),
Website: user.Website,
Description: user.Description,
// counter's
@ -97,6 +97,7 @@ func User2UserSettings(user *user_model.User) api.UserSettings {
Description: user.Description,
Theme: user.Theme,
HideEmail: user.KeepEmailPrivate,
HidePronouns: user.KeepPronounsPrivate,
HideActivity: user.KeepActivityPrivate,
DiffViewStyle: user.DiffViewStyle,
EnableRepoUnitHints: user.EnableRepoUnitHints,

View file

@ -224,6 +224,7 @@ type UpdateProfileForm struct {
Biography string `binding:"MaxSize(255)"`
Visibility structs.VisibleType
KeepActivityPrivate bool
KeepPronounsPrivate bool
}
// Validate validates the fields

View file

@ -40,6 +40,7 @@ type UpdateOptions struct {
SetLastLogin bool
RepoAdminChangeTeamAccess optional.Option[bool]
EnableRepoUnitHints optional.Option[bool]
KeepPronounsPrivate optional.Option[bool]
}
func UpdateUser(ctx context.Context, u *user_model.User, opts *UpdateOptions) error {
@ -97,6 +98,12 @@ func UpdateUser(ctx context.Context, u *user_model.User, opts *UpdateOptions) er
cols = append(cols, "enable_repo_unit_hints")
}
if opts.KeepPronounsPrivate.Has() {
u.KeepPronounsPrivate = opts.KeepPronounsPrivate.Value()
cols = append(cols, "keep_pronouns_private")
}
if opts.AllowGitHook.Has() {
u.AllowGitHook = opts.AllowGitHook.Value()

View file

@ -30,6 +30,8 @@
<td>{{DateUtils.AbsoluteShort .CreatedUnix}}</td>
<td><a href="{{AppSubUrl}}/admin/auths/{{.ID}}">{{svg "octicon-pencil"}}</a></td>
</tr>
{{else}}
<tr><td class="tw-text-center" colspan="7">{{ctx.Locale.Tr "no_results_found"}}</td></tr>
{{end}}
</tbody>
</table>

View file

@ -66,6 +66,8 @@
</div>
</td>
</tr>
{{else}}
<tr><td class="tw-text-center" colspan="6">{{ctx.Locale.Tr "no_results_found"}}</td></tr>
{{end}}
</tbody>
</table>

View file

@ -24,6 +24,8 @@
<td nowrap>{{DateUtils.AbsoluteShort .CreatedUnix}}</td>
<td class="view-detail"><a href="#">{{svg "octicon-note" 16}}</a></td>
</tr>
{{else}}
<tr><td class="tw-text-center" colspan="6">{{ctx.Locale.Tr "no_results_found"}}</td></tr>
{{end}}
</tbody>
{{if .Notices}}

View file

@ -66,6 +66,8 @@
<td>{{DateUtils.AbsoluteShort .CreatedUnix}}</td>
<td><a href="{{.OrganisationLink}}/settings" data-tooltip-content="{{ctx.Locale.Tr "edit"}}">{{svg "octicon-pencil"}}</a></td>
</tr>
{{else}}
<tr><td class="tw-text-center" colspan="7">{{ctx.Locale.Tr "no_results_found"}}</td></tr>
{{end}}
</tbody>
</table>

View file

@ -74,6 +74,8 @@
<td>{{DateUtils.AbsoluteShort .Version.CreatedUnix}}</td>
<td><a class="delete-button" href="" data-url="{{$.Link}}/delete?page={{$.Page.Paginater.Current}}&sort={{$.SortType}}" data-id="{{.Version.ID}}" data-name="{{.Package.Name}}" data-data-version="{{.Version.Version}}">{{svg "octicon-trash"}}</a></td>
</tr>
{{else}}
<tr><td class="tw-text-center" colspan="10">{{ctx.Locale.Tr "no_results_found"}}</td></tr>
{{end}}
</tbody>
</table>

View file

@ -86,6 +86,8 @@
<td>{{DateUtils.AbsoluteShort .CreatedUnix}}</td>
<td><a class="delete-button" href="" data-url="{{$.Link}}/delete?page={{$.Page.Paginater.Current}}&sort={{$.SortType}}" data-id="{{.ID}}" data-name="{{.Name}}">{{svg "octicon-trash"}}</a></td>
</tr>
{{else}}
<tr><td class="tw-text-center" colspan="12">{{ctx.Locale.Tr "no_results_found"}}</td></tr>
{{end}}
</tbody>
</table>

View file

@ -109,6 +109,8 @@
</div>
</td>
</tr>
{{else}}
<tr class="no-results-row"><td class="tw-text-center" colspan="9">{{ctx.Locale.Tr "no_results_found"}}</td></tr>
{{end}}
</tbody>
</table>

View file

@ -95,6 +95,11 @@
</span>
</a>
{{end}}
{{if and .Issue.PullRequest.AllowMaintainerEdit .CanWriteCode}}
<span id="editable-label" data-tooltip-content="{{ctx.Locale.Tr "repo.pulls.editable_explanation"}}" class="ui small label">
{{ctx.Locale.Tr "repo.pulls.editable"}}
</span>
{{end}}
<span id="pull-desc-editor" class="tw-hidden flex-text-block" data-target-update-url="{{$.RepoLink}}/pull/{{.Issue.Index}}/target_branch">
<div class="ui floating filter dropdown">
<div class="ui basic small button tw-mr-0">

View file

@ -72,7 +72,7 @@
<ul class="list">
{{if $hasArchiveLinks}}
<li>
<a class="archive-link tw-flex-1 flex-text-inline tw-font-bold" href="{{$.RepoLink}}/archive/{{$release.TagName | PathEscapeSegments}}.zip" rel="nofollow">
<a class="archive-link tw-flex-1 flex-text-inline tw-font-bold" href="{{$.RepoLink}}/archive/{{$release.TagName | PathEscapeSegments}}.zip" rel="nofollow" type="application/zip">
{{svg "octicon-file-zip" 16 "tw-mr-1"}}{{ctx.Locale.Tr "repo.release.source_code"}} (ZIP)
</a>
<div class="tw-mr-1">
@ -83,7 +83,7 @@
</span>
</li>
<li class="{{if $hasReleaseAttachment}}start-gap{{end}}">
<a class="archive-link tw-flex-1 flex-text-inline tw-font-bold" href="{{$.RepoLink}}/archive/{{$release.TagName | PathEscapeSegments}}.tar.gz" rel="nofollow">
<a class="archive-link tw-flex-1 flex-text-inline tw-font-bold" href="{{$.RepoLink}}/archive/{{$release.TagName | PathEscapeSegments}}.tar.gz" rel="nofollow" type="application/gzip">
{{svg "octicon-file-zip" 16 "tw-mr-1"}}{{ctx.Locale.Tr "repo.release.source_code"}} (TAR.GZ)
</a>
<div class="tw-mr-1">

View file

@ -1 +1 @@
<a class="author text black tw-font-semibold muted"{{if gt .ID 0}} href="{{.HomeLink}}"{{end}}>{{.GetDisplayName}}</a>{{if .IsBot}}<span class="ui basic label tw-p-1">bot</span>{{end}}
<a class="author text black tw-font-semibold muted"{{if gt .ID 0}} href="{{.HomeLink}}"{{end}}>{{.GetDisplayName}}</a>{{if .IsBot}}<span class="ui basic label tw-p-1 tw-align-baseline">bot</span>{{end}}

View file

@ -16,7 +16,7 @@
</div>
<div class="content tw-break-anywhere profile-avatar-name">
{{if .ContextUser.FullName}}<span class="header text center">{{.ContextUser.FullName}}</span>{{end}}
<span class="username text center">{{.ContextUser.Name}}{{if .ContextUser.Pronouns}} · {{.ContextUser.Pronouns}}{{end}} {{if .IsAdmin}}
<span class="username text center">{{.ContextUser.Name}} {{if .ContextUser.GetPronouns .IsSigned}} · {{.ContextUser.GetPronouns .IsSigned}}{{end}} {{if .IsAdmin}}
<a class="muted" href="{{AppSubUrl}}/admin/users/{{.ContextUser.ID}}" data-tooltip-content="{{ctx.Locale.Tr "admin.users.details"}}">
{{svg "octicon-gear" 18}}
</a>

View file

@ -8667,6 +8667,12 @@
},
"404": {
"$ref": "#/responses/notFound"
},
"422": {
"$ref": "#/responses/validationError"
},
"500": {
"$ref": "#/responses/internalServerError"
}
}
}
@ -8720,6 +8726,9 @@
},
"404": {
"$ref": "#/responses/notFound"
},
"500": {
"$ref": "#/responses/internalServerError"
}
}
},
@ -8760,8 +8769,8 @@
"403": {
"$ref": "#/responses/forbidden"
},
"404": {
"$ref": "#/responses/notFound"
"500": {
"$ref": "#/responses/internalServerError"
}
}
},
@ -8823,6 +8832,9 @@
},
"423": {
"$ref": "#/responses/repoArchivedError"
},
"500": {
"$ref": "#/responses/internalServerError"
}
}
}
@ -9959,6 +9971,12 @@
},
"404": {
"$ref": "#/responses/notFound"
},
"422": {
"$ref": "#/responses/validationError"
},
"500": {
"$ref": "#/responses/internalServerError"
}
}
},
@ -10017,6 +10035,9 @@
},
"423": {
"$ref": "#/responses/repoArchivedError"
},
"500": {
"$ref": "#/responses/internalServerError"
}
}
}
@ -10067,8 +10088,8 @@
"403": {
"$ref": "#/responses/forbidden"
},
"404": {
"$ref": "#/responses/notFound"
"500": {
"$ref": "#/responses/internalServerError"
}
}
},
@ -10135,6 +10156,9 @@
},
"404": {
"$ref": "#/responses/notFound"
},
"500": {
"$ref": "#/responses/internalServerError"
}
}
}
@ -11386,6 +11410,12 @@
},
"404": {
"$ref": "#/responses/notFound"
},
"422": {
"$ref": "#/responses/validationError"
},
"500": {
"$ref": "#/responses/internalServerError"
}
}
}
@ -20453,6 +20483,20 @@
},
"x-go-package": "code.gitea.io/gitea/services/context"
},
"APIInternalServerError": {
"type": "object",
"properties": {
"message": {
"type": "string",
"x-go-name": "Message"
},
"url": {
"type": "string",
"x-go-name": "URL"
}
},
"x-go-package": "code.gitea.io/gitea/services/context"
},
"APIInvalidTopicsError": {
"type": "object",
"properties": {
@ -27910,6 +27954,10 @@
"type": "boolean",
"x-go-name": "HideEmail"
},
"hide_pronouns": {
"type": "boolean",
"x-go-name": "HidePronouns"
},
"language": {
"type": "string",
"x-go-name": "Language"
@ -27962,6 +28010,10 @@
"type": "boolean",
"x-go-name": "HideEmail"
},
"hide_pronouns": {
"type": "boolean",
"x-go-name": "HidePronouns"
},
"language": {
"type": "string",
"x-go-name": "Language"
@ -29165,6 +29217,12 @@
"$ref": "#/definitions/APIForbiddenError"
}
},
"internalServerError": {
"description": "APIInternalServerError is an error that is raised when an internal server error occurs",
"schema": {
"$ref": "#/definitions/APIInternalServerError"
}
},
"invalidTopicsError": {
"description": "APIInvalidTopicsError is error format response to invalid topics",
"schema": {

View file

@ -50,6 +50,7 @@
</div>
</div>
{{if not .DisablePassword}}
<div class="ui container fluid">
{{template "user/auth/webauthn_error" .}}
@ -65,3 +66,5 @@
</div>
</div>
</div>
{{end}}

View file

@ -120,6 +120,12 @@
{{ctx.Locale.Tr "settings.keep_activity_private"}}
<span class="help">{{ctx.Locale.Tr "settings.keep_activity_private.description" (printf "/%s?tab=activity" .SignedUser.Name)}}</span>
</label>
<label>
<input name="keep_pronouns_private" type="checkbox" {{if .SignedUser.KeepPronounsPrivate}}checked{{end}}>
{{ctx.Locale.Tr "settings.keep_pronouns_private"}}
<span class="help">{{ctx.Locale.Tr "settings.keep_pronouns_private.description"}}</span>
</label>
</fieldset>
<button class="ui primary button">{{ctx.Locale.Tr "settings.update_profile"}}</button>

View file

@ -0,0 +1,25 @@
// Copyright 2025 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: GPL-3.0-or-later
// @watch start
// templates/repo/issue/view_title.tmpl
// web_src/js/features/repo-issue.js
// @watch end
import {expect} from '@playwright/test';
import {save_visual, test} from './utils_e2e.ts';
test.use({user: 'user2'});
test('PR: title edit', async ({page}) => {
const response = await page.goto('/user2/repo1/pulls/5');
expect(response?.status()).toBe(200);
await expect(page.locator('#editable-label')).toBeVisible();
await save_visual(page);
// Labels AGit and Editable are hidden when title is in edit mode
await page.locator('#issue-title-edit-show').click();
await expect(page.locator('#editable-label')).toBeHidden();
await save_visual(page);
});

View file

@ -43,10 +43,17 @@ test('External Release Attachments', async ({page, isMobile}) => {
// Validate release page and click edit
await expect(page).toHaveURL('/user2/repo2/releases');
await expect(page.locator('.download[open] li')).toHaveCount(3);
await expect(page.locator('.download[open] li:nth-of-type(1)')).toContainText('Source code (ZIP)');
await expect(page.locator('.download[open] li:nth-of-type(1) span[data-tooltip-content]')).toHaveAttribute('data-tooltip-content', 'This attachment is automatically generated.');
await expect(page.locator('.download[open] li:nth-of-type(1) a')).toHaveAttribute('href', '/user2/repo2/archive/2.0.zip');
await expect(page.locator('.download[open] li:nth-of-type(1) a')).toHaveAttribute('type', 'application/zip');
await expect(page.locator('.download[open] li:nth-of-type(2)')).toContainText('Source code (TAR.GZ)');
await expect(page.locator('.download[open] li:nth-of-type(2) span[data-tooltip-content]')).toHaveAttribute('data-tooltip-content', 'This attachment is automatically generated.');
await expect(page.locator('.download[open] li:nth-of-type(2) a')).toHaveAttribute('href', '/user2/repo2/archive/2.0.tar.gz');
await expect(page.locator('.download[open] li:nth-of-type(2) a')).toHaveAttribute('type', 'application/gzip');
await expect(page.locator('.download[open] li:nth-of-type(3)')).toContainText('Test');
await expect(page.locator('.download[open] li:nth-of-type(3) a')).toHaveAttribute('href', 'https://forgejo.org/');
await save_visual(page);

View file

@ -25,6 +25,8 @@ import (
"github.com/stretchr/testify/require"
)
const IssueIDNotExist = 10000
func TestAPIListRepoComments(t *testing.T) {
defer tests.PrepareTestEnv(t)()
@ -89,6 +91,10 @@ func TestAPIListIssueComments(t *testing.T) {
expectedCount := unittest.GetCount(t, &issues_model.Comment{IssueID: issue.ID},
unittest.Cond("type = ?", issues_model.CommentTypeComment))
assert.Len(t, comments, expectedCount)
req = NewRequestf(t, "GET", "/api/v1/repos/%s/%s/issues/%d/comments", repoOwner.Name, repo.Name, IssueIDNotExist).
AddTokenAuth(token)
MakeRequest(t, req, http.StatusNotFound)
}
func TestAPICreateComment(t *testing.T) {
@ -111,6 +117,13 @@ func TestAPICreateComment(t *testing.T) {
DecodeJSON(t, resp, &updatedComment)
assert.EqualValues(t, commentBody, updatedComment.Body)
unittest.AssertExistsAndLoadBean(t, &issues_model.Comment{ID: updatedComment.ID, IssueID: issue.ID, Content: commentBody})
urlStr = fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/comments",
repoOwner.Name, repo.Name, IssueIDNotExist)
req = NewRequestWithValues(t, "POST", urlStr, map[string]string{
"body": commentBody,
}).AddTokenAuth(token)
MakeRequest(t, req, http.StatusNotFound)
}
func TestAPICreateCommentAutoDate(t *testing.T) {
@ -464,4 +477,7 @@ func TestAPIListIssueTimeline(t *testing.T) {
DecodeJSON(t, resp, &comments)
expectedCount := unittest.GetCount(t, &issues_model.Comment{IssueID: issue.ID})
assert.Len(t, comments, expectedCount)
req = NewRequestf(t, "GET", "/api/v1/repos/%s/%s/issues/%d/timeline", repoOwner.Name, repo.Name, IssueIDNotExist)
MakeRequest(t, req, http.StatusNotFound)
}

View file

@ -283,7 +283,7 @@ func TestLDAPUserSyncWithEmptyUsernameAttribute(t *testing.T) {
htmlDoc := NewHTMLParser(t, resp.Body)
tr := htmlDoc.doc.Find("table.table tbody tr")
tr := htmlDoc.doc.Find("table.table tbody tr:not(.no-results-row)")
assert.Equal(t, 0, tr.Length())
}

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