diff --git a/.changelog.yml b/.changelog.yml deleted file mode 100644 index bfdee0c0ca..0000000000 --- a/.changelog.yml +++ /dev/null @@ -1,57 +0,0 @@ -# The full repository name -repo: go-gitea/gitea - -# Service type (gitea or github) -service: github - -# Base URL for Gitea instance if using gitea service type (optional) -# Default: https://gitea.com -base-url: - -# Changelog groups and which labeled PRs to add to each group -groups: - - - name: BREAKING - labels: - - pr/breaking - - - name: SECURITY - labels: - - topic/security - - - name: FEATURES - labels: - - type/feature - - - name: API - labels: - - modifies/api - - - name: ENHANCEMENTS - labels: - - type/enhancement - - type/refactoring - - topic/ui - - - name: BUGFIXES - labels: - - type/bug - - - name: TESTING - labels: - - type/testing - - - name: BUILD - labels: - - topic/build - - topic/code-linting - - - name: DOCS - labels: - - type/docs - - - name: MISC - default: true - -# regex indicating which labels to skip for the changelog -skip-labels: skip-changelog|backport\/.+ diff --git a/.forgejo/testdata/build-release/Dockerfile b/.forgejo/testdata/build-release/Dockerfile index f798448261..4ef67d34e0 100644 --- a/.forgejo/testdata/build-release/Dockerfile +++ b/.forgejo/testdata/build-release/Dockerfile @@ -1,4 +1,4 @@ -FROM code.forgejo.org/oci/alpine:3.19 +FROM code.forgejo.org/oci/alpine:3.20 ARG RELEASE_VERSION=unkown LABEL maintainer="contact@forgejo.org" \ org.opencontainers.image.version="${RELEASE_VERSION}" diff --git a/.forgejo/workflows/testing.yml b/.forgejo/workflows/testing.yml index 79c695e277..3e265e7099 100644 --- a/.forgejo/workflows/testing.yml +++ b/.forgejo/workflows/testing.yml @@ -54,7 +54,7 @@ jobs: MINIO_ROOT_USER: 123456 MINIO_ROOT_PASSWORD: 12345678 redis: - image: redis:7.2.4 + image: redis:7.2 steps: - uses: https://code.forgejo.org/actions/checkout@v3 - uses: https://code.forgejo.org/actions/setup-go@v4 diff --git a/Dockerfile b/Dockerfile index 3c455a5411..73f8baed9a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ FROM --platform=$BUILDPLATFORM docker.io/tonistiigi/xx AS xx -FROM --platform=$BUILDPLATFORM docker.io/library/golang:1.22-alpine3.19 as build-env +FROM --platform=$BUILDPLATFORM code.forgejo.org/oci/golang:1.22-alpine3.19 as build-env ARG GOPROXY ENV GOPROXY ${GOPROXY:-direct} @@ -51,7 +51,7 @@ RUN chmod 755 /tmp/local/usr/bin/entrypoint \ /go/src/code.gitea.io/gitea/environment-to-ini RUN chmod 644 /go/src/code.gitea.io/gitea/contrib/autocompletion/bash_autocomplete -FROM docker.io/library/alpine:3.19 +FROM code.forgejo.org/oci/golang:1.22-alpine3.19 ARG RELEASE_VERSION LABEL maintainer="contact@forgejo.org" \ org.opencontainers.image.authors="Forgejo" \ diff --git a/Dockerfile.rootless b/Dockerfile.rootless index 6d1503f034..91a83c9fa2 100644 --- a/Dockerfile.rootless +++ b/Dockerfile.rootless @@ -1,6 +1,6 @@ FROM --platform=$BUILDPLATFORM docker.io/tonistiigi/xx AS xx -FROM --platform=$BUILDPLATFORM docker.io/library/golang:1.22-alpine3.19 as build-env +FROM --platform=$BUILDPLATFORM code.forgejo.org/oci/golang:1.22-alpine3.19 as build-env ARG GOPROXY ENV GOPROXY ${GOPROXY:-direct} @@ -49,7 +49,7 @@ RUN chmod 755 /tmp/local/usr/local/bin/docker-entrypoint.sh \ /go/src/code.gitea.io/gitea/environment-to-ini RUN chmod 644 /go/src/code.gitea.io/gitea/contrib/autocompletion/bash_autocomplete -FROM docker.io/library/alpine:3.19 +FROM code.forgejo.org/oci/golang:1.22-alpine3.19 LABEL maintainer="contact@forgejo.org" \ org.opencontainers.image.authors="Forgejo" \ org.opencontainers.image.url="https://forgejo.org" \ diff --git a/Makefile b/Makefile index 18999a6069..d6838a7adf 100644 --- a/Makefile +++ b/Makefile @@ -29,7 +29,7 @@ XGO_VERSION := go-1.21.x AIR_PACKAGE ?= github.com/cosmtrek/air@v1 # renovate: datasource=go EDITORCONFIG_CHECKER_PACKAGE ?= github.com/editorconfig-checker/editorconfig-checker/v2/cmd/editorconfig-checker@2.8.0 # renovate: datasource=go GOFUMPT_PACKAGE ?= mvdan.cc/gofumpt@v0.6.0 # renovate: datasource=go -GOLANGCI_LINT_PACKAGE ?= github.com/golangci/golangci-lint/cmd/golangci-lint@v1.58.1 # renovate: datasource=go +GOLANGCI_LINT_PACKAGE ?= github.com/golangci/golangci-lint/cmd/golangci-lint@v1.58.2 # renovate: datasource=go GXZ_PACKAGE ?= github.com/ulikunitz/xz/cmd/gxz@v0.5.11 # renovate: datasource=go MISSPELL_PACKAGE ?= github.com/golangci/misspell/cmd/misspell@v0.5.1 # renovate: datasource=go SWAGGER_PACKAGE ?= github.com/go-swagger/go-swagger/cmd/swagger@v0.31.0 # renovate: datasource=go diff --git a/cmd/migrate_storage.go b/cmd/migrate_storage.go index 357416fc33..1a8a37543d 100644 --- a/cmd/migrate_storage.go +++ b/cmd/migrate_storage.go @@ -34,7 +34,7 @@ var CmdMigrateStorage = &cli.Command{ Name: "type", Aliases: []string{"t"}, Value: "", - Usage: "Type of stored files to copy. Allowed types: 'attachments', 'lfs', 'avatars', 'repo-avatars', 'repo-archivers', 'packages', 'actions-log', 'actions-artifacts", + Usage: "Type of stored files to copy. Allowed types: 'attachments', 'lfs', 'avatars', 'repo-avatars', 'repo-archivers', 'packages', 'actions-log', 'actions-artifacts'", }, &cli.StringFlag{ Name: "storage", diff --git a/custom/conf/app.example.ini b/custom/conf/app.example.ini index 1d00c38816..0aa8a1324b 100644 --- a/custom/conf/app.example.ini +++ b/custom/conf/app.example.ini @@ -2046,6 +2046,17 @@ LEVEL = Info ;; or only create new users if UPDATE_EXISTING is set to false ;UPDATE_EXISTING = true +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Cleanup expired actions assets +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;[cron.cleanup_actions] +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;ENABLED = true +;RUN_AT_START = true +;SCHEDULE = @midnight + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Clean-up deleted branches diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000000..0b2278f080 --- /dev/null +++ b/flake.lock @@ -0,0 +1,61 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1710146030, + "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1715534503, + "narHash": "sha256-5ZSVkFadZbFP1THataCaSf0JH2cAH3S29hU9rrxTEqk=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "2057814051972fa1453ddfb0d98badbea9b83c06", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000000..c6e915e9db --- /dev/null +++ b/flake.nix @@ -0,0 +1,37 @@ +{ + inputs = { + nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + }; + outputs = + { nixpkgs, flake-utils, ... }: + flake-utils.lib.eachDefaultSystem ( + system: + let + pkgs = nixpkgs.legacyPackages.${system}; + in + { + devShells.default = pkgs.mkShell { + buildInputs = with pkgs; [ + # generic + git + git-lfs + gnumake + gnused + gnutar + gzip + + # frontend + nodejs_20 + + # linting + python312 + poetry + + # backend + go_1_22 + ]; + }; + } + ); +} diff --git a/models/fixtures/hook_task.yml b/models/fixtures/hook_task.yml index d573406b36..fc0e03bca1 100644 --- a/models/fixtures/hook_task.yml +++ b/models/fixtures/hook_task.yml @@ -35,3 +35,9 @@ "X-Head": "42" } } + +- + id: 4 + hook_id: 3 + uuid: uuid4 + is_delivered: false diff --git a/models/issues/review.go b/models/issues/review.go index 3c6934b060..ca6fd6035b 100644 --- a/models/issues/review.go +++ b/models/issues/review.go @@ -155,14 +155,14 @@ func (r *Review) LoadCodeComments(ctx context.Context) (err error) { if r.CodeComments != nil { return err } - if err = r.loadIssue(ctx); err != nil { + if err = r.LoadIssue(ctx); err != nil { return err } r.CodeComments, err = fetchCodeCommentsByReview(ctx, r.Issue, nil, r, false) return err } -func (r *Review) loadIssue(ctx context.Context) (err error) { +func (r *Review) LoadIssue(ctx context.Context) (err error) { if r.Issue != nil { return err } @@ -199,7 +199,7 @@ func (r *Review) LoadReviewerTeam(ctx context.Context) (err error) { // LoadAttributes loads all attributes except CodeComments func (r *Review) LoadAttributes(ctx context.Context) (err error) { - if err = r.loadIssue(ctx); err != nil { + if err = r.LoadIssue(ctx); err != nil { return err } if err = r.LoadCodeComments(ctx); err != nil { diff --git a/models/unit/unit.go b/models/unit/unit.go index e37adf995e..8b4d0caa4c 100644 --- a/models/unit/unit.go +++ b/models/unit/unit.go @@ -7,6 +7,7 @@ import ( "errors" "fmt" "strings" + "sync/atomic" "code.gitea.io/gitea/models/perm" "code.gitea.io/gitea/modules/container" @@ -106,14 +107,27 @@ var ( TypeExternalTracker, } - // DisabledRepoUnits contains the units that have been globally disabled - DisabledRepoUnits = []Type{} + disabledRepoUnitsAtomic atomic.Pointer[[]Type] // the units that have been globally disabled // AllowedRepoUnitGroups contains the units that have been globally enabled, // with mutually exclusive units grouped together. AllowedRepoUnitGroups = [][]Type{} ) +// DisabledRepoUnitsGet returns the globally disabled units, it is a quick patch to fix data-race during testing. +// Because the queue worker might read when a test is mocking the value. FIXME: refactor to a clear solution later. +func DisabledRepoUnitsGet() []Type { + v := disabledRepoUnitsAtomic.Load() + if v == nil { + return nil + } + return *v +} + +func DisabledRepoUnitsSet(v []Type) { + disabledRepoUnitsAtomic.Store(&v) +} + // Get valid set of default repository units from settings func validateDefaultRepoUnits(defaultUnits, settingDefaultUnits []Type) []Type { units := defaultUnits @@ -131,7 +145,7 @@ func validateDefaultRepoUnits(defaultUnits, settingDefaultUnits []Type) []Type { } // Remove disabled units - for _, disabledUnit := range DisabledRepoUnits { + for _, disabledUnit := range DisabledRepoUnitsGet() { for i, unit := range units { if unit == disabledUnit { units = append(units[:i], units[i+1:]...) @@ -144,11 +158,11 @@ func validateDefaultRepoUnits(defaultUnits, settingDefaultUnits []Type) []Type { // LoadUnitConfig load units from settings func LoadUnitConfig() error { - var invalidKeys []string - DisabledRepoUnits, invalidKeys = FindUnitTypes(setting.Repository.DisabledRepoUnits...) + disabledRepoUnits, invalidKeys := FindUnitTypes(setting.Repository.DisabledRepoUnits...) if len(invalidKeys) > 0 { log.Warn("Invalid keys in disabled repo units: %s", strings.Join(invalidKeys, ", ")) } + DisabledRepoUnitsSet(disabledRepoUnits) setDefaultRepoUnits, invalidKeys := FindUnitTypes(setting.Repository.DefaultRepoUnits...) if len(invalidKeys) > 0 { @@ -210,7 +224,7 @@ func LoadUnitConfig() error { // UnitGlobalDisabled checks if unit type is global disabled func (u Type) UnitGlobalDisabled() bool { - for _, ud := range DisabledRepoUnits { + for _, ud := range DisabledRepoUnitsGet() { if u == ud { return true } diff --git a/models/unit/unit_test.go b/models/unit/unit_test.go index d80d8b118d..7bf6326145 100644 --- a/models/unit/unit_test.go +++ b/models/unit/unit_test.go @@ -14,10 +14,10 @@ import ( func TestLoadUnitConfig(t *testing.T) { t.Run("regular", func(t *testing.T) { defer func(disabledRepoUnits, defaultRepoUnits, defaultForkRepoUnits []Type) { - DisabledRepoUnits = disabledRepoUnits + DisabledRepoUnitsSet(disabledRepoUnits) DefaultRepoUnits = defaultRepoUnits DefaultForkRepoUnits = defaultForkRepoUnits - }(DisabledRepoUnits, DefaultRepoUnits, DefaultForkRepoUnits) + }(DisabledRepoUnitsGet(), DefaultRepoUnits, DefaultForkRepoUnits) defer func(disabledRepoUnits, defaultRepoUnits, defaultForkRepoUnits []string) { setting.Repository.DisabledRepoUnits = disabledRepoUnits setting.Repository.DefaultRepoUnits = defaultRepoUnits @@ -28,16 +28,16 @@ func TestLoadUnitConfig(t *testing.T) { setting.Repository.DefaultRepoUnits = []string{"repo.code", "repo.releases", "repo.issues", "repo.pulls"} setting.Repository.DefaultForkRepoUnits = []string{"repo.releases"} assert.NoError(t, LoadUnitConfig()) - assert.Equal(t, []Type{TypeIssues}, DisabledRepoUnits) + assert.Equal(t, []Type{TypeIssues}, DisabledRepoUnitsGet()) assert.Equal(t, []Type{TypeCode, TypeReleases, TypePullRequests}, DefaultRepoUnits) assert.Equal(t, []Type{TypeReleases}, DefaultForkRepoUnits) }) t.Run("invalid", func(t *testing.T) { defer func(disabledRepoUnits, defaultRepoUnits, defaultForkRepoUnits []Type) { - DisabledRepoUnits = disabledRepoUnits + DisabledRepoUnitsSet(disabledRepoUnits) DefaultRepoUnits = defaultRepoUnits DefaultForkRepoUnits = defaultForkRepoUnits - }(DisabledRepoUnits, DefaultRepoUnits, DefaultForkRepoUnits) + }(DisabledRepoUnitsGet(), DefaultRepoUnits, DefaultForkRepoUnits) defer func(disabledRepoUnits, defaultRepoUnits, defaultForkRepoUnits []string) { setting.Repository.DisabledRepoUnits = disabledRepoUnits setting.Repository.DefaultRepoUnits = defaultRepoUnits @@ -48,16 +48,16 @@ func TestLoadUnitConfig(t *testing.T) { setting.Repository.DefaultRepoUnits = []string{"repo.code", "invalid.2", "repo.releases", "repo.issues", "repo.pulls"} setting.Repository.DefaultForkRepoUnits = []string{"invalid.3", "repo.releases"} assert.NoError(t, LoadUnitConfig()) - assert.Equal(t, []Type{TypeIssues}, DisabledRepoUnits) + assert.Equal(t, []Type{TypeIssues}, DisabledRepoUnitsGet()) assert.Equal(t, []Type{TypeCode, TypeReleases, TypePullRequests}, DefaultRepoUnits) assert.Equal(t, []Type{TypeReleases}, DefaultForkRepoUnits) }) t.Run("duplicate", func(t *testing.T) { defer func(disabledRepoUnits, defaultRepoUnits, defaultForkRepoUnits []Type) { - DisabledRepoUnits = disabledRepoUnits + DisabledRepoUnitsSet(disabledRepoUnits) DefaultRepoUnits = defaultRepoUnits DefaultForkRepoUnits = defaultForkRepoUnits - }(DisabledRepoUnits, DefaultRepoUnits, DefaultForkRepoUnits) + }(DisabledRepoUnitsGet(), DefaultRepoUnits, DefaultForkRepoUnits) defer func(disabledRepoUnits, defaultRepoUnits, defaultForkRepoUnits []string) { setting.Repository.DisabledRepoUnits = disabledRepoUnits setting.Repository.DefaultRepoUnits = defaultRepoUnits @@ -68,16 +68,16 @@ func TestLoadUnitConfig(t *testing.T) { setting.Repository.DefaultRepoUnits = []string{"repo.code", "repo.releases", "repo.issues", "repo.pulls", "repo.code"} setting.Repository.DefaultForkRepoUnits = []string{"repo.releases", "repo.releases"} assert.NoError(t, LoadUnitConfig()) - assert.Equal(t, []Type{TypeIssues}, DisabledRepoUnits) + assert.Equal(t, []Type{TypeIssues}, DisabledRepoUnitsGet()) assert.Equal(t, []Type{TypeCode, TypeReleases, TypePullRequests}, DefaultRepoUnits) assert.Equal(t, []Type{TypeReleases}, DefaultForkRepoUnits) }) t.Run("empty_default", func(t *testing.T) { defer func(disabledRepoUnits, defaultRepoUnits, defaultForkRepoUnits []Type) { - DisabledRepoUnits = disabledRepoUnits + DisabledRepoUnitsSet(disabledRepoUnits) DefaultRepoUnits = defaultRepoUnits DefaultForkRepoUnits = defaultForkRepoUnits - }(DisabledRepoUnits, DefaultRepoUnits, DefaultForkRepoUnits) + }(DisabledRepoUnitsGet(), DefaultRepoUnits, DefaultForkRepoUnits) defer func(disabledRepoUnits, defaultRepoUnits, defaultForkRepoUnits []string) { setting.Repository.DisabledRepoUnits = disabledRepoUnits setting.Repository.DefaultRepoUnits = defaultRepoUnits @@ -88,7 +88,7 @@ func TestLoadUnitConfig(t *testing.T) { setting.Repository.DefaultRepoUnits = []string{} setting.Repository.DefaultForkRepoUnits = []string{"repo.releases", "repo.releases"} assert.NoError(t, LoadUnitConfig()) - assert.Equal(t, []Type{TypeIssues}, DisabledRepoUnits) + assert.Equal(t, []Type{TypeIssues}, DisabledRepoUnitsGet()) assert.ElementsMatch(t, []Type{TypeCode, TypePullRequests, TypeReleases, TypeWiki, TypePackages, TypeProjects, TypeActions}, DefaultRepoUnits) assert.Equal(t, []Type{TypeReleases}, DefaultForkRepoUnits) }) diff --git a/models/user/email_address.go b/models/user/email_address.go index 85824fcdcb..18bf6d0b89 100644 --- a/models/user/email_address.go +++ b/models/user/email_address.go @@ -10,6 +10,7 @@ import ( "net/mail" "regexp" "strings" + "time" "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/modules/base" @@ -362,14 +363,12 @@ func MakeEmailPrimary(ctx context.Context, email *EmailAddress) error { // VerifyActiveEmailCode verifies active email code when active account func VerifyActiveEmailCode(ctx context.Context, code, email string) *EmailAddress { - minutes := setting.Service.ActiveCodeLives - if user := GetVerifyUser(ctx, code); user != nil { // time limit code prefix := code[:base.TimeLimitCodeLength] data := fmt.Sprintf("%d%s%s%s%s", user.ID, email, user.LowerName, user.Passwd, user.Rands) - if base.VerifyTimeLimitCode(data, minutes, prefix) { + if base.VerifyTimeLimitCode(time.Now(), data, setting.Service.ActiveCodeLives, prefix) { emailAddress := &EmailAddress{UID: user.ID, Email: email} if has, _ := db.GetEngine(ctx).Get(emailAddress); has { return emailAddress diff --git a/models/user/user.go b/models/user/user.go index 5844189e17..58808c71b9 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -321,7 +321,7 @@ func (u *User) OrganisationLink() string { func (u *User) GenerateEmailActivateCode(email string) string { code := base.CreateTimeLimitCode( fmt.Sprintf("%d%s%s%s%s", u.ID, email, u.LowerName, u.Passwd, u.Rands), - setting.Service.ActiveCodeLives, nil) + setting.Service.ActiveCodeLives, time.Now(), nil) // Add tail hex username code += hex.EncodeToString([]byte(u.LowerName)) @@ -818,14 +818,11 @@ func GetVerifyUser(ctx context.Context, code string) (user *User) { // VerifyUserActiveCode verifies active code when active account func VerifyUserActiveCode(ctx context.Context, code string) (user *User) { - minutes := setting.Service.ActiveCodeLives - if user = GetVerifyUser(ctx, code); user != nil { // time limit code prefix := code[:base.TimeLimitCodeLength] data := fmt.Sprintf("%d%s%s%s%s", user.ID, user.Email, user.LowerName, user.Passwd, user.Rands) - - if base.VerifyTimeLimitCode(data, minutes, prefix) { + if base.VerifyTimeLimitCode(time.Now(), data, setting.Service.ActiveCodeLives, prefix) { return user } } diff --git a/modules/base/tool.go b/modules/base/tool.go index e4c3fb1818..c4c0ec2dfc 100644 --- a/modules/base/tool.go +++ b/modules/base/tool.go @@ -4,12 +4,15 @@ package base import ( + "crypto/hmac" "crypto/sha1" "crypto/sha256" + "crypto/subtle" "encoding/base64" "encoding/hex" "errors" "fmt" + "hash" "os" "path/filepath" "runtime" @@ -25,13 +28,6 @@ import ( "github.com/dustin/go-humanize" ) -// EncodeSha1 string to sha1 hex value. -func EncodeSha1(str string) string { - h := sha1.New() - _, _ = h.Write([]byte(str)) - return hex.EncodeToString(h.Sum(nil)) -} - // EncodeSha256 string to sha256 hex value. func EncodeSha256(str string) string { h := sha256.New() @@ -62,63 +58,62 @@ func BasicAuthDecode(encoded string) (string, string, error) { } // VerifyTimeLimitCode verify time limit code -func VerifyTimeLimitCode(data string, minutes int, code string) bool { +func VerifyTimeLimitCode(now time.Time, data string, minutes int, code string) bool { if len(code) <= 18 { return false } - // split code - start := code[:12] - lives := code[12:18] - if d, err := strconv.ParseInt(lives, 10, 0); err == nil { - minutes = int(d) - } + startTimeStr := code[:12] + aliveTimeStr := code[12:18] + aliveTime, _ := strconv.Atoi(aliveTimeStr) // no need to check err, if anything wrong, the following code check will fail soon - // right active code - retCode := CreateTimeLimitCode(data, minutes, start) - if retCode == code && minutes > 0 { - // check time is expired or not - before, _ := time.ParseInLocation("200601021504", start, time.Local) - now := time.Now() - if before.Add(time.Minute*time.Duration(minutes)).Unix() > now.Unix() { - return true + // check code + retCode := CreateTimeLimitCode(data, aliveTime, startTimeStr, nil) + if subtle.ConstantTimeCompare([]byte(retCode), []byte(code)) != 1 { + retCode = CreateTimeLimitCode(data, aliveTime, startTimeStr, sha1.New()) // TODO: this is only for the support of legacy codes, remove this in/after 1.23 + if subtle.ConstantTimeCompare([]byte(retCode), []byte(code)) != 1 { + return false } } - return false + // check time is expired or not: startTime <= now && now < startTime + minutes + startTime, _ := time.ParseInLocation("200601021504", startTimeStr, time.Local) + return (startTime.Before(now) || startTime.Equal(now)) && now.Before(startTime.Add(time.Minute*time.Duration(minutes))) } // TimeLimitCodeLength default value for time limit code const TimeLimitCodeLength = 12 + 6 + 40 -// CreateTimeLimitCode create a time limit code -// code format: 12 length date time string + 6 minutes string + 40 sha1 encoded string -func CreateTimeLimitCode(data string, minutes int, startInf any) string { - format := "200601021504" +// CreateTimeLimitCode create a time-limited code. +// Format: 12 length date time string + 6 minutes string (not used) + 40 hash string, some other code depends on this fixed length +// If h is nil, then use the default hmac hash. +func CreateTimeLimitCode[T time.Time | string](data string, minutes int, startTimeGeneric T, h hash.Hash) string { + const format = "200601021504" - var start, end time.Time - var startStr, endStr string - - if startInf == nil { - // Use now time create code - start = time.Now() - startStr = start.Format(format) + var start time.Time + var startTimeAny any = startTimeGeneric + if t, ok := startTimeAny.(time.Time); ok { + start = t } else { - // use start string create code - startStr = startInf.(string) - start, _ = time.ParseInLocation(format, startStr, time.Local) - startStr = start.Format(format) + var err error + start, err = time.ParseInLocation(format, startTimeAny.(string), time.Local) + if err != nil { + return "" // return an invalid code because the "parse" failed + } } + startStr := start.Format(format) + end := start.Add(time.Minute * time.Duration(minutes)) - end = start.Add(time.Minute * time.Duration(minutes)) - endStr = end.Format(format) - - // create sha1 encode string - sh := sha1.New() - _, _ = sh.Write([]byte(fmt.Sprintf("%s%s%s%s%d", data, hex.EncodeToString(setting.GetGeneralTokenSigningSecret()), startStr, endStr, minutes))) - encoded := hex.EncodeToString(sh.Sum(nil)) + if h == nil { + h = hmac.New(sha1.New, setting.GetGeneralTokenSigningSecret()) + } + _, _ = fmt.Fprintf(h, "%s%s%s%s%d", data, hex.EncodeToString(setting.GetGeneralTokenSigningSecret()), startStr, end.Format(format), minutes) + encoded := hex.EncodeToString(h.Sum(nil)) code := fmt.Sprintf("%s%06d%s", startStr, minutes, encoded) + if len(code) != TimeLimitCodeLength { + panic("there is a hard requirement for the length of time-limited code") // it shouldn't happen + } return code } diff --git a/modules/base/tool_test.go b/modules/base/tool_test.go index f21b89c74c..62de7229ac 100644 --- a/modules/base/tool_test.go +++ b/modules/base/tool_test.go @@ -4,20 +4,18 @@ package base import ( + "crypto/sha1" + "fmt" "os" "testing" "time" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/test" + "github.com/stretchr/testify/assert" ) -func TestEncodeSha1(t *testing.T) { - assert.Equal(t, - "8843d7f92416211de9ebb963ff4ce28125932878", - EncodeSha1("foobar"), - ) -} - func TestEncodeSha256(t *testing.T) { assert.Equal(t, "c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2", @@ -46,43 +44,54 @@ func TestBasicAuthDecode(t *testing.T) { } func TestVerifyTimeLimitCode(t *testing.T) { - tc := []struct { - data string - minutes int - code string - valid bool - }{{ - data: "data", - minutes: 2, - code: testCreateTimeLimitCode(t, "data", 2), - valid: true, - }, { - data: "abc123-ß", - minutes: 1, - code: testCreateTimeLimitCode(t, "abc123-ß", 1), - valid: true, - }, { - data: "data", - minutes: 2, - code: "2021012723240000005928251dac409d2c33a6eb82c63410aaad569bed", - valid: false, - }} - for _, test := range tc { - actualValid := VerifyTimeLimitCode(test.data, test.minutes, test.code) - assert.Equal(t, test.valid, actualValid, "data: '%s' code: '%s' should be valid: %t", test.data, test.code, test.valid) + defer test.MockVariableValue(&setting.InstallLock, true)() + initGeneralSecret := func(secret string) { + setting.InstallLock = true + setting.CfgProvider, _ = setting.NewConfigProviderFromData(fmt.Sprintf(` +[oauth2] +JWT_SECRET = %s +`, secret)) + setting.LoadCommonSettings() } -} -func testCreateTimeLimitCode(t *testing.T, data string, m int) string { - result0 := CreateTimeLimitCode(data, m, nil) - result1 := CreateTimeLimitCode(data, m, time.Now().Format("200601021504")) - result2 := CreateTimeLimitCode(data, m, time.Unix(time.Now().Unix()+int64(time.Minute)*int64(m), 0).Format("200601021504")) + initGeneralSecret("KZb_QLUd4fYVyxetjxC4eZkrBgWM2SndOOWDNtgUUko") + now := time.Now() - assert.Equal(t, result0, result1) - assert.NotEqual(t, result0, result2) + t.Run("TestGenericParameter", func(t *testing.T) { + time2000 := time.Date(2000, 1, 2, 3, 4, 5, 0, time.Local) + assert.Equal(t, "2000010203040000026fa5221b2731b7cf80b1b506f5e39e38c115fee5", CreateTimeLimitCode("test-sha1", 2, time2000, sha1.New())) + assert.Equal(t, "2000010203040000026fa5221b2731b7cf80b1b506f5e39e38c115fee5", CreateTimeLimitCode("test-sha1", 2, "200001020304", sha1.New())) + assert.Equal(t, "2000010203040000024842227a2f87041ff82025199c0187410a9297bf", CreateTimeLimitCode("test-hmac", 2, time2000, nil)) + assert.Equal(t, "2000010203040000024842227a2f87041ff82025199c0187410a9297bf", CreateTimeLimitCode("test-hmac", 2, "200001020304", nil)) + }) - assert.True(t, len(result0) != 0) - return result0 + t.Run("TestInvalidCode", func(t *testing.T) { + assert.False(t, VerifyTimeLimitCode(now, "data", 2, "")) + assert.False(t, VerifyTimeLimitCode(now, "data", 2, "invalid code")) + }) + + t.Run("TestCreateAndVerify", func(t *testing.T) { + code := CreateTimeLimitCode("data", 2, now, nil) + assert.False(t, VerifyTimeLimitCode(now.Add(-time.Minute), "data", 2, code)) // not started yet + assert.True(t, VerifyTimeLimitCode(now, "data", 2, code)) + assert.True(t, VerifyTimeLimitCode(now.Add(time.Minute), "data", 2, code)) + assert.False(t, VerifyTimeLimitCode(now.Add(time.Minute), "DATA", 2, code)) // invalid data + assert.False(t, VerifyTimeLimitCode(now.Add(2*time.Minute), "data", 2, code)) // expired + }) + + t.Run("TestDifferentSecret", func(t *testing.T) { + // use another secret to ensure the code is invalid for different secret + verifyDataCode := func(c string) bool { + return VerifyTimeLimitCode(now, "data", 2, c) + } + code1 := CreateTimeLimitCode("data", 2, now, sha1.New()) + code2 := CreateTimeLimitCode("data", 2, now, nil) + assert.True(t, verifyDataCode(code1)) + assert.True(t, verifyDataCode(code2)) + initGeneralSecret("000_QLUd4fYVyxetjxC4eZkrBgWM2SndOOWDNtgUUko") + assert.False(t, verifyDataCode(code1)) + assert.False(t, verifyDataCode(code2)) + }) } func TestFileSize(t *testing.T) { diff --git a/modules/git/object_id.go b/modules/git/object_id.go index 26736bb766..ecbc1587d4 100644 --- a/modules/git/object_id.go +++ b/modules/git/object_id.go @@ -80,7 +80,7 @@ func NewIDFromString(hexHash string) (ObjectID, error) { } // IsEmptyCommitID checks if an hexadecimal string represents an empty commit according to git (only '0'). -// If objectFormat is not nil, the length will be checked as well (otherwise the lenght must match the sha1 or sha256 length). +// If objectFormat is not nil, the length will be checked as well (otherwise the length must match the sha1 or sha256 length). func IsEmptyCommitID(commitID string, objectFormat ObjectFormat) bool { if commitID == "" { return true diff --git a/modules/git/utils.go b/modules/git/utils.go index 0d67412707..53211c6451 100644 --- a/modules/git/utils.go +++ b/modules/git/utils.go @@ -4,6 +4,8 @@ package git import ( + "crypto/sha1" + "encoding/hex" "fmt" "io" "os" @@ -128,3 +130,9 @@ func (l *LimitedReaderCloser) Read(p []byte) (n int, err error) { func (l *LimitedReaderCloser) Close() error { return l.C.Close() } + +func HashFilePathForWebUI(s string) string { + h := sha1.New() + _, _ = h.Write([]byte(s)) + return hex.EncodeToString(h.Sum(nil)) +} diff --git a/modules/git/utils_test.go b/modules/git/utils_test.go index 876a22924c..a3c2b7f8eb 100644 --- a/modules/git/utils_test.go +++ b/modules/git/utils_test.go @@ -3,7 +3,11 @@ package git -import "testing" +import ( + "testing" + + "github.com/stretchr/testify/assert" +) // This file contains utility functions that are used across multiple tests, // but not in production code. @@ -13,3 +17,10 @@ func skipIfSHA256NotSupported(t *testing.T) { t.Skip("skipping because installed Git version doesn't support SHA256") } } + +func TestHashFilePathForWebUI(t *testing.T) { + assert.Equal(t, + "8843d7f92416211de9ebb963ff4ce28125932878", + HashFilePathForWebUI("foobar"), + ) +} diff --git a/modules/issue/template/template.go b/modules/issue/template/template.go index 3be48b9edc..cf5fcf28e5 100644 --- a/modules/issue/template/template.go +++ b/modules/issue/template/template.go @@ -91,6 +91,9 @@ func validateYaml(template *api.IssueTemplate) error { if err := validateOptions(field, idx); err != nil { return err } + if err := validateDropdownDefault(position, field.Attributes); err != nil { + return err + } case api.IssueFormFieldTypeCheckboxes: if err := validateStringItem(position, field.Attributes, false, "description"); err != nil { return err @@ -249,6 +252,28 @@ func validateBoolItem(position errorPosition, m map[string]any, names ...string) return nil } +func validateDropdownDefault(position errorPosition, attributes map[string]any) error { + v, ok := attributes["default"] + if !ok { + return nil + } + defaultValue, ok := v.(int) + if !ok { + return position.Errorf("'default' should be an int") + } + + options, ok := attributes["options"].([]any) + if !ok { + // should not happen + return position.Errorf("'options' is required and should be a array") + } + if defaultValue < 0 || defaultValue >= len(options) { + return position.Errorf("the value of 'default' is out of range") + } + + return nil +} + type errorPosition string func (p errorPosition) Errorf(format string, a ...any) error { diff --git a/modules/issue/template/template_test.go b/modules/issue/template/template_test.go index e24b962d61..481058754d 100644 --- a/modules/issue/template/template_test.go +++ b/modules/issue/template/template_test.go @@ -355,6 +355,96 @@ body: `, wantErr: "body[0](checkboxes), option[1]: can not require a hidden checkbox", }, + { + name: "dropdown default is not an integer", + content: ` +name: "test" +about: "this is about" +body: + - type: dropdown + id: "1" + attributes: + label: Label of dropdown + description: Description of dropdown + multiple: true + options: + - Option 1 of dropdown + - Option 2 of dropdown + - Option 3 of dropdown + default: "def" + validations: + required: true +`, + wantErr: "body[0](dropdown): 'default' should be an int", + }, + { + name: "dropdown default is out of range", + content: ` +name: "test" +about: "this is about" +body: + - type: dropdown + id: "1" + attributes: + label: Label of dropdown + description: Description of dropdown + multiple: true + options: + - Option 1 of dropdown + - Option 2 of dropdown + - Option 3 of dropdown + default: 3 + validations: + required: true +`, + wantErr: "body[0](dropdown): the value of 'default' is out of range", + }, + { + name: "dropdown without default is valid", + content: ` +name: "test" +about: "this is about" +body: + - type: dropdown + id: "1" + attributes: + label: Label of dropdown + description: Description of dropdown + multiple: true + options: + - Option 1 of dropdown + - Option 2 of dropdown + - Option 3 of dropdown + validations: + required: true +`, + want: &api.IssueTemplate{ + Name: "test", + About: "this is about", + Fields: []*api.IssueFormField{ + { + Type: "dropdown", + ID: "1", + Attributes: map[string]any{ + "label": "Label of dropdown", + "description": "Description of dropdown", + "multiple": true, + "options": []any{ + "Option 1 of dropdown", + "Option 2 of dropdown", + "Option 3 of dropdown", + }, + }, + Validations: map[string]any{ + "required": true, + }, + Visible: []api.IssueFormFieldVisible{api.IssueFormFieldVisibleForm, api.IssueFormFieldVisibleContent}, + }, + }, + FileName: "test.yaml", + }, + wantErr: "", + }, { name: "valid", content: ` @@ -399,6 +489,7 @@ body: - Option 1 of dropdown - Option 2 of dropdown - Option 3 of dropdown + default: 1 validations: required: true - type: checkboxes @@ -475,6 +566,7 @@ body: "Option 2 of dropdown", "Option 3 of dropdown", }, + "default": 1, }, Validations: map[string]any{ "required": true, diff --git a/modules/setting/admin.go b/modules/setting/admin.go index 07b8ef0899..eed3aa22cf 100644 --- a/modules/setting/admin.go +++ b/modules/setting/admin.go @@ -20,6 +20,7 @@ func loadAdminFrom(rootCfg ConfigProvider) { sec := rootCfg.Section("admin") Admin.DisableRegularOrgCreation = sec.Key("DISABLE_REGULAR_ORG_CREATION").MustBool(false) Admin.DefaultEmailNotification = sec.Key("DEFAULT_EMAIL_NOTIFICATIONS").MustString("enabled") + Admin.SendNotificationEmailOnNewUser = sec.Key("SEND_NOTIFICATION_EMAIL_ON_NEW_USER").MustBool(false) Admin.UserDisabledFeatures = container.SetOf(sec.Key("USER_DISABLED_FEATURES").Strings(",")...) Admin.ExternalUserDisableFeatures = container.SetOf(sec.Key("EXTERNAL_USER_DISABLE_FEATURES").Strings(",")...) } diff --git a/modules/setting/admin_test.go b/modules/setting/admin_test.go new file mode 100644 index 0000000000..c0b4dfff69 --- /dev/null +++ b/modules/setting/admin_test.go @@ -0,0 +1,32 @@ +// Copyright The Forgejo Authors. +// SPDX-License-Identifier: MIT + +package setting + +import ( + "testing" + + "code.gitea.io/gitea/modules/container" + + "github.com/stretchr/testify/assert" +) + +func Test_loadAdminFrom(t *testing.T) { + iniStr := ` + [admin] + DISABLE_REGULAR_ORG_CREATION = true + DEFAULT_EMAIL_NOTIFICATIONS = z + SEND_NOTIFICATION_EMAIL_ON_NEW_USER = true + USER_DISABLED_FEATURES = a,b + EXTERNAL_USER_DISABLE_FEATURES = x,y + ` + cfg, err := NewConfigProviderFromData(iniStr) + assert.NoError(t, err) + loadAdminFrom(cfg) + + assert.EqualValues(t, true, Admin.DisableRegularOrgCreation) + assert.EqualValues(t, "z", Admin.DefaultEmailNotification) + assert.EqualValues(t, true, Admin.SendNotificationEmailOnNewUser) + assert.EqualValues(t, container.SetOf("a", "b"), Admin.UserDisabledFeatures) + assert.EqualValues(t, container.SetOf("x", "y"), Admin.ExternalUserDisableFeatures) +} diff --git a/options/license/3D-Slicer-1.0 b/options/license/3D-Slicer-1.0 new file mode 100644 index 0000000000..38bd5230c6 --- /dev/null +++ b/options/license/3D-Slicer-1.0 @@ -0,0 +1,190 @@ +3D Slicer Contribution and Software License Agreement ("Agreement") +Version 1.0 (December 20, 2005) + +This Agreement covers contributions to and downloads from the 3D +Slicer project ("Slicer") maintained by The Brigham and Women's +Hospital, Inc. ("Brigham"). Part A of this Agreement applies to +contributions of software and/or data to Slicer (including making +revisions of or additions to code and/or data already in Slicer). Part +B of this Agreement applies to downloads of software and/or data from +Slicer. Part C of this Agreement applies to all transactions with +Slicer. If you distribute Software (as defined below) downloaded from +Slicer, all of the paragraphs of Part B of this Agreement must be +included with and apply to such Software. + +Your contribution of software and/or data to Slicer (including prior +to the date of the first publication of this Agreement, each a +"Contribution") and/or downloading, copying, modifying, displaying, +distributing or use of any software and/or data from Slicer +(collectively, the "Software") constitutes acceptance of all of the +terms and conditions of this Agreement. If you do not agree to such +terms and conditions, you have no right to contribute your +Contribution, or to download, copy, modify, display, distribute or use +the Software. + +PART A. CONTRIBUTION AGREEMENT - License to Brigham with Right to +Sublicense ("Contribution Agreement"). + +1. As used in this Contribution Agreement, "you" means the individual + contributing the Contribution to Slicer and the institution or + entity which employs or is otherwise affiliated with such + individual in connection with such Contribution. + +2. This Contribution Agreement applies to all Contributions made to + Slicer, including without limitation Contributions made prior to + the date of first publication of this Agreement. If at any time you + make a Contribution to Slicer, you represent that (i) you are + legally authorized and entitled to make such Contribution and to + grant all licenses granted in this Contribution Agreement with + respect to such Contribution; (ii) if your Contribution includes + any patient data, all such data is de-identified in accordance with + U.S. confidentiality and security laws and requirements, including + but not limited to the Health Insurance Portability and + Accountability Act (HIPAA) and its regulations, and your disclosure + of such data for the purposes contemplated by this Agreement is + properly authorized and in compliance with all applicable laws and + regulations; and (iii) you have preserved in the Contribution all + applicable attributions, copyright notices and licenses for any + third party software or data included in the Contribution. + +3. Except for the licenses granted in this Agreement, you reserve all + right, title and interest in your Contribution. + +4. You hereby grant to Brigham, with the right to sublicense, a + perpetual, worldwide, non-exclusive, no charge, royalty-free, + irrevocable license to use, reproduce, make derivative works of, + display and distribute the Contribution. If your Contribution is + protected by patent, you hereby grant to Brigham, with the right to + sublicense, a perpetual, worldwide, non-exclusive, no-charge, + royalty-free, irrevocable license under your interest in patent + rights covering the Contribution, to make, have made, use, sell and + otherwise transfer your Contribution, alone or in combination with + any other code. + +5. You acknowledge and agree that Brigham may incorporate your + Contribution into Slicer and may make Slicer available to members + of the public on an open source basis under terms substantially in + accordance with the Software License set forth in Part B of this + Agreement. You further acknowledge and agree that Brigham shall + have no liability arising in connection with claims resulting from + your breach of any of the terms of this Agreement. + +6. YOU WARRANT THAT TO THE BEST OF YOUR KNOWLEDGE YOUR CONTRIBUTION + DOES NOT CONTAIN ANY CODE THAT REQUIRES OR PRESCRIBES AN "OPEN + SOURCE LICENSE" FOR DERIVATIVE WORKS (by way of non-limiting + example, the GNU General Public License or other so-called + "reciprocal" license that requires any derived work to be licensed + under the GNU General Public License or other "open source + license"). + +PART B. DOWNLOADING AGREEMENT - License from Brigham with Right to +Sublicense ("Software License"). + +1. As used in this Software License, "you" means the individual + downloading and/or using, reproducing, modifying, displaying and/or + distributing the Software and the institution or entity which + employs or is otherwise affiliated with such individual in + connection therewith. The Brigham and Women's Hospital, + Inc. ("Brigham") hereby grants you, with right to sublicense, with + respect to Brigham's rights in the software, and data, if any, + which is the subject of this Software License (collectively, the + "Software"), a royalty-free, non-exclusive license to use, + reproduce, make derivative works of, display and distribute the + Software, provided that: + +(a) you accept and adhere to all of the terms and conditions of this +Software License; + +(b) in connection with any copy of or sublicense of all or any portion +of the Software, all of the terms and conditions in this Software +License shall appear in and shall apply to such copy and such +sublicense, including without limitation all source and executable +forms and on any user documentation, prefaced with the following +words: "All or portions of this licensed product (such portions are +the "Software") have been obtained under license from The Brigham and +Women's Hospital, Inc. and are subject to the following terms and +conditions:" + +(c) you preserve and maintain all applicable attributions, copyright +notices and licenses included in or applicable to the Software; + +(d) modified versions of the Software must be clearly identified and +marked as such, and must not be misrepresented as being the original +Software; and + +(e) you consider making, but are under no obligation to make, the +source code of any of your modifications to the Software freely +available to others on an open source basis. + +2. The license granted in this Software License includes without + limitation the right to (i) incorporate the Software into + proprietary programs (subject to any restrictions applicable to + such programs), (ii) add your own copyright statement to your + modifications of the Software, and (iii) provide additional or + different license terms and conditions in your sublicenses of + modifications of the Software; provided that in each case your use, + reproduction or distribution of such modifications otherwise + complies with the conditions stated in this Software License. + +3. This Software License does not grant any rights with respect to + third party software, except those rights that Brigham has been + authorized by a third party to grant to you, and accordingly you + are solely responsible for (i) obtaining any permissions from third + parties that you need to use, reproduce, make derivative works of, + display and distribute the Software, and (ii) informing your + sublicensees, including without limitation your end-users, of their + obligations to secure any such required permissions. + +4. The Software has been designed for research purposes only and has + not been reviewed or approved by the Food and Drug Administration + or by any other agency. YOU ACKNOWLEDGE AND AGREE THAT CLINICAL + APPLICATIONS ARE NEITHER RECOMMENDED NOR ADVISED. Any + commercialization of the Software is at the sole risk of the party + or parties engaged in such commercialization. You further agree to + use, reproduce, make derivative works of, display and distribute + the Software in compliance with all applicable governmental laws, + regulations and orders, including without limitation those relating + to export and import control. + +5. The Software is provided "AS IS" and neither Brigham nor any + contributor to the software (each a "Contributor") shall have any + obligation to provide maintenance, support, updates, enhancements + or modifications thereto. BRIGHAM AND ALL CONTRIBUTORS SPECIFICALLY + DISCLAIM ALL EXPRESS AND IMPLIED WARRANTIES OF ANY KIND INCLUDING, + BUT NOT LIMITED TO, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR + A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + BRIGHAM OR ANY CONTRIBUTOR BE LIABLE TO ANY PARTY FOR DIRECT, + INDIRECT, SPECIAL, INCIDENTAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY ARISING IN ANY WAY + RELATED TO THE SOFTWARE, EVEN IF BRIGHAM OR ANY CONTRIBUTOR HAS + BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. TO THE MAXIMUM + EXTENT NOT PROHIBITED BY LAW OR REGULATION, YOU FURTHER ASSUME ALL + LIABILITY FOR YOUR USE, REPRODUCTION, MAKING OF DERIVATIVE WORKS, + DISPLAY, LICENSE OR DISTRIBUTION OF THE SOFTWARE AND AGREE TO + INDEMNIFY AND HOLD HARMLESS BRIGHAM AND ALL CONTRIBUTORS FROM AND + AGAINST ANY AND ALL CLAIMS, SUITS, ACTIONS, DEMANDS AND JUDGMENTS + ARISING THEREFROM. + +6. None of the names, logos or trademarks of Brigham or any of + Brigham's affiliates or any of the Contributors, or any funding + agency, may be used to endorse or promote products produced in + whole or in part by operation of the Software or derived from or + based on the Software without specific prior written permission + from the applicable party. + +7. Any use, reproduction or distribution of the Software which is not + in accordance with this Software License shall automatically revoke + all rights granted to you under this Software License and render + Paragraphs 1 and 2 of this Software License null and void. + +8. This Software License does not grant any rights in or to any + intellectual property owned by Brigham or any Contributor except + those rights expressly granted hereunder. + +PART C. MISCELLANEOUS + +This Agreement shall be governed by and construed in accordance with +the laws of The Commonwealth of Massachusetts without regard to +principles of conflicts of law. This Agreement shall supercede and +replace any license terms that you may have agreed to previously with +respect to Slicer. diff --git a/options/license/Asterisk-linking-protocols-exception b/options/license/Asterisk-linking-protocols-exception new file mode 100644 index 0000000000..6705829f47 --- /dev/null +++ b/options/license/Asterisk-linking-protocols-exception @@ -0,0 +1,13 @@ +Specific permission is also granted to link Asterisk with OpenSSL, OpenH323 +UniMRCP, and/or the UW IMAP Toolkit and distribute the resulting binary files. + +In addition, Asterisk implements several management/control protocols. +This includes the Asterisk Manager Interface (AMI), the Asterisk Gateway +Interface (AGI), and the Asterisk REST Interface (ARI). It is our belief +that applications using these protocols to manage or control an Asterisk +instance do not have to be licensed under the GPL or a compatible license, +as we believe these protocols do not create a 'derivative work' as referred +to in the GPL. However, should any court or other judiciary body find that +these protocols do fall under the terms of the GPL, then we hereby grant you a +license to use these protocols in combination with Asterisk in external +applications licensed under any license you wish. diff --git a/options/license/HPND-Intel b/options/license/HPND-Intel new file mode 100644 index 0000000000..98f0ceb4fd --- /dev/null +++ b/options/license/HPND-Intel @@ -0,0 +1,25 @@ +Copyright (c) 1993 Intel Corporation + +Intel hereby grants you permission to copy, modify, and distribute this +software and its documentation. Intel grants this permission provided +that the above copyright notice appears in all copies and that both the +copyright notice and this permission notice appear in supporting +documentation. In addition, Intel grants this permission provided that +you prominently mark as "not part of the original" any modifications +made to this software or documentation, and that the name of Intel +Corporation not be used in advertising or publicity pertaining to +distribution of the software or the documentation without specific, +written prior permission. + +Intel Corporation provides this AS IS, WITHOUT ANY WARRANTY, EXPRESS OR +IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY +OR FITNESS FOR A PARTICULAR PURPOSE. Intel makes no guarantee or +representations regarding the use of, or the results of the use of, +the software and documentation in terms of correctness, accuracy, +reliability, currentness, or otherwise; and you rely on the software, +documentation and results solely at your own risk. + +IN NO EVENT SHALL INTEL BE LIABLE FOR ANY LOSS OF USE, LOSS OF BUSINESS, +LOSS OF PROFITS, INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES +OF ANY KIND. IN NO EVENT SHALL INTEL'S TOTAL LIABILITY EXCEED THE SUM +PAID TO INTEL FOR THE PRODUCT LICENSED HEREUNDER. diff --git a/options/license/HPND-export-US-acknowledgement b/options/license/HPND-export-US-acknowledgement new file mode 100644 index 0000000000..645df4c9aa --- /dev/null +++ b/options/license/HPND-export-US-acknowledgement @@ -0,0 +1,22 @@ +Copyright (C) 1994 by the University of Southern California + + EXPORT OF THIS SOFTWARE from the United States of America may + require a specific license from the United States Government. It + is the responsibility of any person or organization + contemplating export to obtain such a license before exporting. + +WITHIN THAT CONSTRAINT, permission to copy, modify, and distribute +this software and its documentation in source and binary forms is +hereby granted, provided that any documentation or other materials +related to such distribution or use acknowledge that the software +was developed by the University of Southern California. + +DISCLAIMER OF WARRANTY. THIS SOFTWARE IS PROVIDED "AS IS". The +University of Southern California MAKES NO REPRESENTATIONS OR +WARRANTIES, EXPRESS OR IMPLIED. By way of example, but not +limitation, the University of Southern California MAKES NO +REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY +PARTICULAR PURPOSE. The University of Southern California shall not +be held liable for any liability nor for any direct, indirect, or +consequential damages with respect to any claim by the user or +distributor of the ksu software. diff --git a/options/license/NCBI-PD b/options/license/NCBI-PD new file mode 100644 index 0000000000..d838cf36b9 --- /dev/null +++ b/options/license/NCBI-PD @@ -0,0 +1,19 @@ +PUBLIC DOMAIN NOTICE +National Center for Biotechnology Information + +This software is a "United States Government Work" under the terms of the +United States Copyright Act. It was written as part of the authors' +official duties as United States Government employees and thus cannot +be copyrighted. This software is freely available to the public for +use. The National Library of Medicine and the U.S. Government have not +placed any restriction on its use or reproduction. + +Although all reasonable efforts have been taken to ensure the accuracy +and reliability of the software and data, the NLM and the U.S. +Government do not and cannot warrant the performance or results that +may be obtained by using this software or data. The NLM and the U.S. +Government disclaim all warranties, express or implied, including +warranties of performance, merchantability or fitness for any +particular purpose. + +Please cite the author in any work or product based on this material. diff --git a/options/locale/locale_bg.ini b/options/locale/locale_bg.ini index dd6058d183..4e03808c38 100644 --- a/options/locale/locale_bg.ini +++ b/options/locale/locale_bg.ini @@ -1132,6 +1132,8 @@ pulls.cant_reopen_deleted_branch = Тази заявка за сливане н pulls.status_checks_hide_all = Скриване на всички проверки pulls.status_checks_failure = Някои проверки са неуспешни issues.review.add_review_request = поиска рецензия от %s %s +wiki.no_search_results = Няма резултати +wiki.search = Търсене в уикито [modal] confirm = Потвърждаване @@ -1474,7 +1476,7 @@ watched_repo = започна да наблюдава %[2]s delete_tag = изтри маркера %[2]s от %[3]s delete_branch = изтри клона %[2]s от %[3]s create_branch = създаде клон %[3]s на %[4]s -publish_release = `публикува издание "%[4]s" на %[3]s` +publish_release = `публикува издание %[4]s на %[3]s` push_tag = изтласка маркер %[3]s към %[4]s approve_pull_request = `одобри %[3]s#%[2]s` reject_pull_request = `предложи промени за %[3]s#%[2]s` diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini index 100d02fb12..76737a89d5 100644 --- a/options/locale/locale_cs-CZ.ini +++ b/options/locale/locale_cs-CZ.ini @@ -2757,6 +2757,8 @@ release.hide_archive_links = Skrýt automaticky generované archivy release.hide_archive_links_helper = Pro toto vydání skrýt automaticky generované archivy zdrojového kódu. Užitečné například pokud nahráváte své vlastní. settings.transfer.button = Převést vlastnictví settings.transfer.modal.title = Převést vlastnictví +wiki.search = Hledat na wiki +wiki.no_search_results = Žádné výsledky [graphs] component_loading_info = Tohle může chvíli trvat… @@ -3471,7 +3473,7 @@ mirror_sync_create=synchronizoval/a novou referenci %[3]s do mirror_sync_delete=synchronizoval/a a smazal/a referenci %[2]s v %[3]s ze zrcadla approve_pull_request=`schválil/a %[3]s#%[2]s` reject_pull_request=`navrhl/a změny pro %[3]s#%[2]s` -publish_release=`vydal/a "%[4]s" v %[3]s` +publish_release=`vydal/a %[4]s v %[3]s` review_dismissed=`zamítl/a posouzení z %[4]s pro %[3]s#%[2]s` review_dismissed_reason=Důvod: create_branch=vytvořil/a větev %[3]s v %[4]s diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index 01178d23d2..59eb11240d 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -2746,6 +2746,8 @@ release.hide_archive_links = Automatisch generierte Archive verstecken release.hide_archive_links_helper = Verstecke automatisch generierte Quellcodearchive für diesen Release. Zum Beispiel, wenn du deine eigenen hochlädst. settings.transfer.button = Besitz übertragen settings.transfer.modal.title = Besitz übertragen +wiki.no_search_results = Keine Ergebnisse +wiki.search = Wiki durchsuchen [graphs] @@ -3444,7 +3446,7 @@ mirror_sync_create=neue Referenz %[3]s bei % mirror_sync_delete=hat die Referenz des Spiegels %[2]s in %[3]s synchronisiert und gelöscht approve_pull_request=`hat %[3]s#%[2]s genehmigt` reject_pull_request=`schlug Änderungen für %[3]s#%[2]s vor` -publish_release=`veröffentlichte Release „%[4]s“ in %[3]s` +publish_release=`veröffentlichte Release %[4]s in %[3]s` review_dismissed=`verwarf das Review von %[4]s in %[3]s#%[2]s` review_dismissed_reason=Grund: create_branch=legte den Branch %[3]s in %[4]s an diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index e0b6c7b981..ff501d8004 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -351,15 +351,15 @@ env_config_keys = Environment Configuration env_config_keys_prompt = The following environment variables will also be applied to your configuration file: [home] -uname_holder = Username or Email address +uname_holder = Username or email address password_holder = Password -switch_dashboard_context = Switch Dashboard Context +switch_dashboard_context = Switch dashboard context my_repos = Repositories my_orgs = Organizations show_more_repos = Show more repositories… -collaborative_repos = Collaborative Repositories +collaborative_repos = Collaborative repositories view_home = View %s -filter = Other Filters +filter = Other filters filter_by_team_repositories = Filter by team repositories feed_of = Feed of "%s" @@ -390,7 +390,7 @@ relevant_repositories_tooltip = Repositories that are forks or that have no topi relevant_repositories = Only relevant repositories are being shown, show unfiltered results. [auth] -create_new_account = Register Account +create_new_account = Register account register_helper_msg = Already have an account? Sign in now! social_register_helper_msg = Already have an account? Link it now! disable_register_prompt = Registration is disabled. Please contact your site administrator. @@ -398,7 +398,7 @@ disable_register_mail = Email confirmation for registration is disabled. manual_activation_only = Contact your site administrator to complete activation. remember_me = Remember this device remember_me.compromised = The login token is not valid anymore which may indicate a compromised account. Please check your account for unusual activities. -forgot_password_title= Forgot Password +forgot_password_title= Forgot password forgot_password = Forgot password? sign_up_now = Need an account? Register now. sign_up_successful = Account was successfully created. Welcome! @@ -406,7 +406,7 @@ confirmation_mail_sent_prompt = A new confirmation email has been sent to %s< must_change_password = Update your password allow_password_change = Require user to change password (recommended) reset_password_mail_sent_prompt = A confirmation email has been sent to %s. Please check your inbox within the next %s to complete the account recovery process. -active_your_account = Activate Your Account +active_your_account = Activate your account account_activated = Account has been activated prohibit_login = Signing in is prohibited prohibit_login_desc = Your account is prohibited from signing in, please contact your site administrator. @@ -417,8 +417,8 @@ change_unconfirmed_email = If you have given the wrong email address during regi change_unconfirmed_email_error = Unable to change the email address: %v resend_mail = Click here to resend your activation email email_not_associate = The email address is not associated with any account. -send_reset_mail = Send Account Recovery Email -reset_password = Account Recovery +send_reset_mail = Send recovery email +reset_password = Account recovery invalid_code = Your confirmation code is invalid or has expired. invalid_code_forgot_password = Your confirmation code is invalid or has expired. Click here to start a new session. invalid_password = Your password does not match the password that was used to create the account. @@ -436,12 +436,12 @@ login_userpass = Sign In tab_signin = Sign In tab_signup = Sign Up tab_openid = OpenID -oauth_signup_tab = Register New Account -oauth_signup_title = Complete New Account -oauth_signup_submit = Complete Account +oauth_signup_tab = Register new account +oauth_signup_title = Complete new account +oauth_signup_submit = Complete account oauth_signin_tab = Link to an existing account oauth_signin_title = Sign in to authorize linked account -oauth_signin_submit = Link Account +oauth_signin_submit = Link account oauth.signin.error = There was an error processing the authorization request. If this error persists, please contact the site administrator. oauth.signin.error.access_denied = The authorization request was denied. oauth.signin.error.temporarily_unavailable = Authorization failed because the authentication server is temporarily unavailable. Please try again later. @@ -1607,7 +1607,7 @@ issues.role.collaborator_helper = This user has been invited to collaborate on t issues.role.first_time_contributor = First-time contributor issues.role.first_time_contributor_helper = This is the first contribution of this user to the repository. issues.role.contributor = Contributor -issues.role.contributor_helper = This user has previously committed to the repository. +issues.role.contributor_helper = This user has previously committed in this repository. issues.re_request_review=Re-request review issues.is_stale = There have been changes to this PR since this review issues.remove_request_review=Remove review request @@ -1890,9 +1890,9 @@ pulls.unrelated_histories = Merge failed: The merge head and base do not share a pulls.merge_out_of_date = Merge failed: Whilst generating the merge, the base was updated. Hint: Try again. pulls.head_out_of_date = Merge failed: Whilst generating the merge, the head was updated. Hint: Try again. pulls.has_merged = Failed: The pull request has been merged, you cannot merge again or change the target branch. -pulls.push_rejected = Push Failed: The push was rejected. Review the Git hooks for this repository. +pulls.push_rejected = Push failed: The push was rejected. Review the Git hooks for this repository. pulls.push_rejected_summary = Full rejection message -pulls.push_rejected_no_message = Push Failed: The push was rejected but there was no remote message. Review the Git hooks for this repository +pulls.push_rejected_no_message = Push failed: The push was rejected but there was no remote message. Review the Git hooks for this repository pulls.open_unmerged_pull_exists = `You cannot perform a reopen operation because there is a pending pull request (#%d) with identical properties.` pulls.status_checking = Some checks are pending pulls.status_checks_success = All checks were successful @@ -2035,8 +2035,8 @@ activity.period.quarterly = 3 months activity.period.semiyearly = 6 months activity.period.yearly = 1 year activity.overview = Overview -activity.active_prs_count_1 = %d Active pull request -activity.active_prs_count_n = %d Active pull requests +activity.active_prs_count_1 = %d active pull request +activity.active_prs_count_n = %d active pull requests activity.merged_prs_count_1 = Merged pull request activity.merged_prs_count_n = Merged pull requests activity.opened_prs_count_1 = Proposed pull request diff --git a/options/locale/locale_fil.ini b/options/locale/locale_fil.ini index 0df2569d14..5f67d0e7cf 100644 --- a/options/locale/locale_fil.ini +++ b/options/locale/locale_fil.ini @@ -463,7 +463,7 @@ reset_password.text = Kung ikaw ito, paki-click ang sumusunod na link para i-rec register_success = Matagumpay ang pag-rehistro issue_assigned.issue = Itinalaga ka ni @%[1]s sa isyu na %[2]s sa repositoryo na %[3]s. issue.x_mentioned_you = Binanggit ka ni %s: -issue.action.force_push = Na-force push ni %[1]s ang %[2]s mula %[3]s sa %[4]s. +issue.action.force_push = Na-force push ni/ng %[1]s ang %[2]s mula %[3]s sa %[4]s. issue.action.push_n = Nag-push si @%[1]s ng %[3]d (mga) commit sa %[2]s issue.action.close = Sinara ni @%[1]s ang #%[2]d. issue.action.reopen = Binuksan muli ni @%[1]s ang #%[2]d. @@ -1084,7 +1084,7 @@ file.title = %s sa %s file_view_raw = Tingnan ng raw editor.new_file = Bagong file editor.edit_file = Baguhin ang file -commit_graph.hide_pr_refs = Itago ang mga hiling sa paghatak +commit_graph.hide_pr_refs = Itago ang mga hiling sa paghila editor.or = o editor.cancel_lower = kanselahin issues.filter_sort.latest = Pinakabago @@ -1375,7 +1375,7 @@ issues.create = Gumawa ng isyu commits.gpg_key_id = ID ng susi ng GPG editor.no_changes_to_show = Walang maipapakitang pagbabago. editor.name_your_file = Ipangalan ang iyong file… -pulls.new = Bagong hiling sa paghatak +pulls.new = Bagong hiling sa paghila issues.ref_reopened_from = `binuksang muli ang isyung %[4]s %[2]s` settings.event_issues_desc = Binuksan, sinara, muling binuksan, o binago ang isyu. activity.new_issue_label = Nabuksan @@ -1539,6 +1539,12 @@ projects.column.new_title = Pangalan projects.card_type.desc = Mga preview ng card commits.desc = I-browse ang history ng pagbabago ng source code. commits.search.tooltip = Maari kang mag-prefix ng mga keyword gamit ang "author:", "committer:", "after:", o "before:", hal. "revert author:Nijika before:2022-10-09". +issues.force_push_codes = `puwersahang itinulak ang %[1]s mula %[2]s sa %[4]s %[6]s` +issues.push_commit_1 = idinagdag ang %d [commit] %s +issues.push_commits_n = idinagdag ang %d mga [commit] %s +issues.new.no_reviewers = Walang mga tagasuri +pulls.title_desc_one = nais na isama ang %[1]d [commit] mula %[2]s hanggang %[3]s +pulls.title_desc_few = nais na isama ang %[1]d mga [commit] mula %[2]s hanggang %[3]s [search] commit_kind = Maghanap ng mga commit... @@ -1915,6 +1921,8 @@ create_branch = ginawa ang branch na %[3]s sa %s starred_repo = na-star ang %[2]s watched_repo = ay sinimulang panoorin ang %[2]s +compare_commits_general = Ikumpara ang mga [commit] +compare_commits = Ikumpara ang %d mga [commit] [tool] 1m = 1 minuto diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index d00caafb7f..90b4742a87 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -770,11 +770,11 @@ primary=Principale activated=Activé requires_activation=Nécessite une activation primary_email=Faire de cette adresse votre adresse principale -activate_email=Envoyer l’activation +activate_email=Envoyer un courriel d'activation activations_pending=Activations en attente can_not_add_email_activations_pending=Il y a une activation en attente, réessayez dans quelques minutes si vous souhaitez ajouter un nouvel e-mail. delete_email=Exclure -email_deletion=Supprimer l'adresse e-mail +email_deletion=Supprimer l'adresse email email_deletion_desc=L’adresse e-mail et les informations associées seront retirées de votre compte. Les révisions Git effectuées par cette adresse resteront inchangées. Continuer ? email_deletion_success=L'adresse e-mail a été supprimée. theme_update_success=Votre thème a été mis à jour. @@ -866,7 +866,7 @@ token_state_desc=Ce jeton a été utilisé au cours des 7 derniers jours principal_state_desc=Ce Principal a été utilisé au cours des 7 derniers jours show_openid=Afficher sur le profil hide_openid=Masquer du profil -ssh_disabled=SSH désactivé +ssh_disabled=SSH est désactivé ssh_signonly=SSH étant désactivé, ces clés ne servent qu'à vérifier la signature des révisions. ssh_externally_managed=Cette clé SSH est gérée de manière externe pour cet utilisateur manage_social=Gérer les réseaux sociaux associés @@ -1335,10 +1335,10 @@ editor.commit_empty_file_header=Réviser un fichier vide editor.commit_empty_file_text=Le fichier que vous allez réviser est vide. Continuer ? editor.no_changes_to_show=Il n’y a aucune modification à afficher. editor.fail_to_update_file=Impossible de mettre à jour/créer le fichier "%s". -editor.fail_to_update_file_summary=Message d'erreur : +editor.fail_to_update_file_summary=Message d'erreur : editor.push_rejected_no_message=La modification a été rejetée par le serveur sans message. Veuillez vérifier les Git hooks. editor.push_rejected=La modification a été rejetée par le serveur. Veuillez vérifier vos Git hooks. -editor.push_rejected_summary=Message de rejet complet : +editor.push_rejected_summary=Message de rejet complet : editor.add_subdir=Ajouter un dossier… editor.unable_to_upload_files=Impossible d'envoyer le fichier "%s" : %v editor.upload_file_is_locked=Le fichier "%s" est verrouillé par %s. @@ -1855,13 +1855,13 @@ pulls.merge_commit_id=L'ID de la révision de fusion pulls.require_signed_wont_sign=La branche nécessite des révisions signées mais cette fusion ne sera pas signée pulls.invalid_merge_option=Vous ne pouvez pas utiliser cette option de fusion pour cette demande. -pulls.merge_conflict=Échec de la fusion : il y a eu un conflit lors de la fusion. Indice : Essayez une autre stratégie +pulls.merge_conflict=Fusion échouée : il y a eu un conflit lors de la fusion. Indice : Essayez une stratégie différente pulls.merge_conflict_summary=Message d'erreur -pulls.rebase_conflict=Fusion échouée : il y a eu un conflit lors du rebasage de la révision %[1]s. Astuce : Essayez une stratégie différente +pulls.rebase_conflict=Fusion échouée : il y a eu un conflit lors du rebasage de la révision %[1]s. Indice : Essayez une stratégie différente pulls.rebase_conflict_summary=Message d'erreur -pulls.unrelated_histories=Échec de la fusion : La tête de fusion et la base ne partagent pas d'historique commun. Indice : Essayez une stratégie différente -pulls.merge_out_of_date=Échec de la fusion : La base a été mise à jour en cours de fusion. Indice : Réessayez. -pulls.head_out_of_date=Échec de la fusion : L’en-tête a été mis à jour pendant la fusion. Conseil : réessayez. +pulls.unrelated_histories=Fusion échouée : La tête de fusion et la base ne partagent pas d'historique commun. Indice : Essayez une stratégie différente +pulls.merge_out_of_date=Fusion échouée : La base a été mise à jour en cours de fusion. Indice : Réessayez. +pulls.head_out_of_date=Fusion échouée : L’en-tête a été mis à jour pendant la fusion. Indice : réessayez. pulls.has_merged=Échec : La demande d’ajout est déjà fusionnée, vous ne pouvez plus la fusionner, ni modifier sa branche cible. pulls.push_rejected=Échec du push : la soumission a été rejetée. Revoyez les Git hook pour ce dépôt. pulls.push_rejected_summary=Message de rejet complet @@ -2412,9 +2412,9 @@ settings.protect_branch_name_pattern=Motif de nom de branche protégé settings.protect_branch_name_pattern_desc=Motifs de nom de branche protégé. Consultez la documentation pour la syntaxe du motif. Exemples : main, release/** settings.protect_patterns=Motifs settings.protect_protected_file_patterns=Liste des fichiers et motifs protégés (séparés par un point virgule ";") : -settings.protect_protected_file_patterns_desc=Les fichiers protégés ne peuvent être modifiés, même si l'utilisateur a le droit d'ajouter, éditer ou supprimer des fichiers dans cette branche. Plusieurs motifs peuvent être séparés par un point-virgule ( ;). Voir la documentation de github.com/gobwas/glob pour la syntaxe des motifs. Exemples : .forgejo/workflows/test.yml, /docs/**/*.txt. +settings.protect_protected_file_patterns_desc=Les fichiers protégés ne peuvent être modifiés, même si l'utilisateur a le droit d'ajouter, éditer ou supprimer des fichiers dans cette branche. Plusieurs motifs peuvent être séparés par un point-virgule (";"). Veuillez voir github.com/gobwas/glob la documentation pour la syntaxe des motifs. Exemples : .drone.yml, /docs/**/*.txt. settings.protect_unprotected_file_patterns=Liste des fichiers et motifs exclus (séparés par un point virgule ";") : -settings.protect_unprotected_file_patterns_desc=Les fichiers non-protégés qui peuvent être modifiés si l'utilisateur a le droit d'écriture, prenant le pas sur les restrictions de push. Plusieurs motifs peuvent être séparés par un point-virgule ( ;). Voir la documentation de github.com/gobwas/glob pour la syntaxe des motifs. Exemples : .forgejo/workflows/test.yml, /docs/**/*.txt. +settings.protect_unprotected_file_patterns_desc=Les fichiers non-protégés qui peuvent être modifiés si l'utilisateur a le droit d'écriture, prenant le pas sur les restrictions de push. Plusieurs motifs peuvent être séparés par un point-virgule (";"). Veuillez voir github.com/gobwas/glob la documentation pour la syntaxe des motifs. Exemples : .drone.yml, /docs/**/*.txt. settings.add_protected_branch=Activer la protection settings.delete_protected_branch=Désactiver la protection settings.update_protect_branch_success=La règle de protection de branche "%s" a été mise à jour. @@ -2526,8 +2526,8 @@ diff.file_after=Après diff.file_image_width=Largeur diff.file_image_height=Hauteur diff.file_byte_size=Taille -diff.file_suppressed=Diff de fichier supprimé car celui-ci est trop grand -diff.file_suppressed_line_too_long=Diff de fichier supprimé car une ou plusieurs lignes sont trop longues +diff.file_suppressed=Le diff du fichier est caché, car celui-ci est trop grand +diff.file_suppressed_line_too_long=Le diff du fichier est caché, car une ou plusieurs lignes sont trop longues diff.too_many_files=Certains fichiers ne sont pas affichés car ce diff contient trop de modifications diff.show_more=Voir plus diff.load=Voir la diff @@ -2756,6 +2756,8 @@ release.hide_archive_links = Masquer les archives générées automatiquement release.hide_archive_links_helper = Masquer les archives de code source générées automatiquement pour cette publication. Par exemple, si vous téléchargez vos propres archives. settings.transfer.button = Changer de propriétaire settings.transfer.modal.title = Changer de propriétaire +wiki.search = Recherche dans le wiki +wiki.no_search_results = Pas de résultats [graphs] component_loading=Chargement de %s… @@ -3467,7 +3469,7 @@ mirror_sync_create=a synchronisé la nouvelle référence %[3]s< mirror_sync_delete=a synchronisé puis supprimé la nouvelle référence %[2]s vers %[3]s depuis le miroir approve_pull_request=`a approuvé %[3]s#%[2]s` reject_pull_request=`a suggérés des changements pour %[3]s#%[2]s` -publish_release=`a publié "%[4]s" dans %[3]s` +publish_release=`a publié %[4]s dans %[3]s` review_dismissed=`a révoqué l’évaluation de %[4]s dans %[3]s#%[2]s` review_dismissed_reason=Raison : create_branch=a créé la branche %[3]s dans %[4]s diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini index f4e1bcd663..1f4e0f6d7c 100644 --- a/options/locale/locale_ja-JP.ini +++ b/options/locale/locale_ja-JP.ini @@ -146,7 +146,7 @@ filter.is_archived = アーカイブ filter.not_archived = アーカイブされていない filter.is_fork = フォーク filter.is_mirror = ミラー -filter.not_mirror = ミラーされていない +filter.not_mirror = ミラーではない filter.is_template = テンプレート filter = フィルター filter.not_fork = フォークされていない @@ -171,8 +171,8 @@ contributions_zero=貢献なし less=少 more=多 contributions_one = 貢献 -contributions_few = 貢献たち -contributions_format = {month} {day}, {year} に {contributions} 件の貢献 +contributions_few = 貢献 +contributions_format = {month} {day}, {year} に {contributions} [editor] buttons.heading.tooltip=見出し追加 @@ -647,7 +647,7 @@ joined_on=%sに登録 repositories=リポジトリ activity=公開アクティビティ followers_few=%d フォロワー -starred=スターを付けたリポジトリたち +starred=スターを付けたリポジトリ watched=ウォッチ中のリポジトリ code=コード projects=プロジェクト @@ -2648,7 +2648,7 @@ find_file.no_matching=一致するファイルが見つかりません error.csv.too_large=このファイルは大きすぎるため表示できません。 error.csv.unexpected=このファイルは %d 行目の %d 文字目に予期しない文字が含まれているため表示できません。 error.csv.invalid_field_count=このファイルは %d 行目のフィールドの数が正しくないため表示できません。 -admin.enabled_flags = このリポジトリで有効になっているフラグたち: +admin.enabled_flags = このリポジトリで有効になっているフラグ: clone_in_vscodium = VSCodiumでcloneする desc.sha256 = SHA256 wiki.cancel = キャンセル @@ -2737,7 +2737,7 @@ component_loading_failed = %s を読み込めませんでした component_loading_info = 少し時間がかかるかもしれません… component_failed_to_load = 予期しないエラーが発生しました。 code_frequency.what = コード頻度 -contributors.what = 貢献たち +contributors.what = 貢献 recent_commits.what = 最近のコミット [org] diff --git a/options/locale/locale_ko-KR.ini b/options/locale/locale_ko-KR.ini index f8a9a17ba7..9aa7ce14e1 100644 --- a/options/locale/locale_ko-KR.ini +++ b/options/locale/locale_ko-KR.ini @@ -15,7 +15,7 @@ page=페이지 template=템플릿 language=언어 notifications=알림 -create_new=생성하기 +create_new=새로 만들기… user_profile_and_more=프로파일 및 설정… signed_in_as=다음 사용자로 로그인됨 @@ -100,8 +100,8 @@ remove_label_str = "%s" 항목 제거 disabled = 비활성화됨 locked = 잠김 filter = 필터 -filter.not_fork = 포크되지 않음 -filter.is_mirror = 미러됨 +filter.not_fork = 포크가 아님 +filter.is_mirror = 미러 webauthn_press_button = 보안 키의 버튼을 누르세요… toggle_menu = 토글 메뉴 webauthn_error = 보안 키를 읽을 수 없습니다. @@ -146,13 +146,16 @@ confirm_delete_selected = 선택된 모든 항목을 삭제하시겠습니까? value = 값 filter.is_archived = 보관됨 filter.not_archived = 보관되지 않음 -filter.is_fork = 포크됨 -filter.not_mirror = 미러되지 않음 +filter.is_fork = 포크 +filter.not_mirror = 미러가 아님 filter.is_template =템플릿 filter.clear = 필터 지우기 ok = 확인 confirm_delete_artifact = 정말 artifact "%s"를 삭제하실건가요? artifacts = Artifacts +filter.public = 공개 +filter.private = 비공개 +filter.not_template = 템플릿이 아님 [aria] navbar = 네비게이션 바 @@ -204,18 +207,18 @@ err_admin_name_is_reserved=관리자 사용자 이름이 올바르지 않습니 err_admin_name_is_invalid=관리자 사용자 이름이 올바르지 않습니다 general_title=기본설정 -app_name=사이트 제목 +app_name=인스턴스 제목 app_name_helper=회사이름을 넣으세요. repo_path=저장소 최상위 경로 repo_path_helper=Git 원격 저장소는 이 디렉터리에 저장 됩니다. lfs_path=Git LFS 루트 경로 lfs_path_helper=Git LFS에 저장된 파일들은 이 디렉토리에 저장됩니다. LFS를 사용하지 않는다면 빈칸으로 남겨주세요. -run_user=실행 사용자명 +run_user=다음 사용자로 실행 ssh_port=SSH 서버 포트 -ssh_port_helper=SSH 서버가 실행되고 있는 포트를 입력하세요. 비워둘 경우 SSH를 사용하지 않습니다. -http_port=Forgejo HTTP 수신 포트 +ssh_port_helper=SSH 서버를 실행할 포트를 입력하세요. 비워둘 경우 SSH를 사용하지 않습니다. +http_port=HTTP 수신 포트 http_port_helper=Forgejo 웹서버가 수신할 포트 번호입니다. -app_url=Forgejo 기본 URL +app_url=기본 URL app_url_helper=HTTP(S) clone URL 및 이메일 알림 기본 주소입니다. log_root_path=로그 경로 log_root_path_helper=로그파일은 이 디렉토리에 저장됩니다. @@ -235,17 +238,17 @@ offline_mode=로컬 모드 켜기 offline_mode_popup=타사 콘텐츠 전송 네트워크를 사용하지 않도록 설정하고 모든 리소스를 로컬로 제공하십시오. disable_gravatar=Gravatar 사용안함 disable_gravatar_popup=Gravatar 및 타사 아바타 소스를 사용하지 않도록 설정합니다. 사용자가 로컬로 아바타를 업로드하지 않는 한 기본 아바타가 사용됩니다. -federated_avatar_lookup=아바타 연동 사용여부 +federated_avatar_lookup=탈중앙화 아바타 사용 federated_avatar_lookup_popup=libravatar 기반 오픈소스 연합 아바타 조회를 허용합니다. disable_registration=사용자 등록 비활성화 disable_registration_popup=사용자가 직접 등록할 수 없게 합니다. 관리자만이 추가할 수 있습니다. -allow_only_external_registration_popup=외부 서비스를 통한 등록을 허용여부 +allow_only_external_registration_popup=외부 서비스를 통한 등록을 허용 openid_signin=OpenID 로그인 사용 openid_signin_popup=OpenID 를 이용한 로그인을 허용합니다. -openid_signup=OpenID 가입 가능여부 +openid_signup=OpenID 가입 허용 openid_signup_popup=OpenID를 통한 가입을 허용합니다. enable_captcha_popup=사용자 등록시 캡차를 요구합니다. -require_sign_in_view=페이지를 보기 위해 로그인 하기 +require_sign_in_view=인스턴스의 콘텐츠를 볼때 로그인 요구 admin_setting_desc=관리자 계정을 만드는 것은 선택사항입니다. 첫번째로 등록된 사용자는 자동적으로 관리자로 지정됩니다. admin_title=관리자 계정 설정 admin_name=관리자 이름 @@ -257,7 +260,7 @@ test_git_failed='git' 명령 테스트 실패: %v sqlite3_not_available=해당 버전에서는 SQLite3를 지원하지 않습니다. %s에서 공식 버전을 다운로드해주세요. ('gobuild' 버전이 아닙니다). invalid_db_setting=데이터베이스 설정이 올바르지 않습니다: %v invalid_repo_path=저장소(레파지토리) 의 경로가 올바르지 않습니다: %v -run_user_not_match=실행 사용자명이 현재 사용자명과 다릅니다.: %s -> %s +run_user_not_match=실행 사용자명이 현재 사용자명과 다릅니다: %s -> %s save_config_failed=설정을 저장할 수 없습니다: %v invalid_admin_setting=관리자 계정 설정이 올바르지 않습니다: %v invalid_log_root_path=로그(Log) 의 경로가 올바르지 않습니다: %v @@ -267,15 +270,15 @@ default_allow_create_organization=조직 생성 허용을 기본값으로 설정 default_allow_create_organization_popup=신규 사용자 생성시 조직 생성을 기본값으로 설정합니다. default_enable_timetracking=시간 추적 사용을 기본값으로 설정 default_enable_timetracking_popup=신규 레포지토리에 대한 시간 추적 사용을 기본값으로 설정합니다. -no_reply_address=숨김처리된 이메일 도메인 -no_reply_address_helper=숨겨진 이메일을 가진 사용자에게 적용될 이메일 도메인입니다. 예를 들어, 사용자 'joe'의 숨겨진 이메일 도메인이 'noreply.example.org'로 설정되어 있으면 'joe@noreply.example.org'로 로그인 됩니다. +no_reply_address=가려진 이메일 도메인 +no_reply_address_helper=가려진 이메일을 가진 사용자에게 적용될 이메일 도메인입니다. 예를 들어, 사용자 'joe'의 가려잔 이메일 도메인이 'noreply.example.org'로 설정되어 있으면 'joe@noreply.example.org'로 처리 됩니다. [home] uname_holder=사용자 이름 또는 이메일 주소 password_holder=비밀번호 switch_dashboard_context=대시보드 컨텍스트 바꾸기 my_repos=저장소 -show_more_repos=더 많은 저장소 보기 +show_more_repos=더 많은 저장소 보기… collaborative_repos=협업 저장소 my_orgs=내 조직 my_mirrors=내 미러 저장소들 @@ -313,7 +316,7 @@ allow_password_change=사용자에게 비밀번호 변경을 요청 (권장됨) reset_password_mail_sent_prompt=확인 메일이 %s로 전송되었습니다. 받은 편지함으로 도착한 메일을 %s 안에 확인해서 비밀번호 찾기 절차를 완료하십시오. active_your_account=계정 활성화 account_activated=계정이 활성화 되었습니다 -prohibit_login=로그인이 금지됨 +prohibit_login= resent_limit_prompt=활성화를 위한 이메일을 이미 전송했습니다. 3분 내로 이메일을 받지 못한 경우 재시도해주세요. has_unconfirmed_mail=안녕하세요 %s, 이메일 주소(%s)가 확인되지 않았습니다. 확인 메일을 받으시지 못하겼거나 새로운 확인 메일이 필요하다면, 아래 버튼을 클릭해 재발송하실 수 있습니다. resend_mail=여기를 눌러 확인 메일 재전송 @@ -355,11 +358,12 @@ activate_account=계정을 활성화하세요 activate_email=이메일 주소 확인 -register_notify=Forgejo에 오신것을 환영합니다! +register_notify=Forgejo에 오신것을 환영합니다 reset_password=계정 복구 register_success=등록 완료 +issue.action.close = @%[1]s님이 #%[2]d를 닫았습니다. @@ -432,7 +436,7 @@ target_branch_not_exist=대상 브랜치가 존재하지 않습니다. [user] -change_avatar=아바타 변경 +change_avatar=아바타 변경… repositories=저장소 activity=공개 활동 followers_few=%d 팔로워 @@ -443,6 +447,7 @@ follow=추적하기 unfollow=추적해제 user_bio=소개 projects = 프로젝트 +watched = 주시중인 저장소 [settings] @@ -497,9 +502,9 @@ manage_emails=이메일 주소 관리 manage_themes=기본 테마 선택 manage_openid=OpenID 주소 관리 theme_desc=이 테마가 사이트 전체 기본 테마가 됩니다. -primary=기본 +primary=대표 activated=활성화됨 -primary_email=프라이머리로 만들기 +primary_email=대표로 만들기 delete_email=삭제 email_deletion=이메일 주소 삭제 email_deletion_desc=계정의 이메일 주소와 관련된 정보가 삭제됩니다. 이메일 주소로 이미 커밋된 내용들은 바뀌지 않고 남아있게 됩니다. 계속 진행하시겠습니까? @@ -617,6 +622,8 @@ email_notifications.enable=이메일 알림 켜기 email_notifications.disable=이메일 알림 끄기 visibility.private=비공개 +change_password = 비밀번호 변경 +email_desc = 당신의 대표 이메일 주소는 알림, 비밀번호 재설정과 웹에서의 Git 작동에 사용되며 가려지지 않습니다. [repo] owner=소유자 @@ -681,8 +688,8 @@ mirror_from=의 미러 forked_from=원본 프로젝트 fork_from_self=자신의 저장소를 포크 할 수 없습니다. fork_guest_user=로그인하고 Fork 이 창고. -unwatch=보지않기 -watch=보기 +unwatch=주시 중단 +watch=주시 unstar=좋아요 취소 star=좋아요 fork=포크 @@ -775,7 +782,7 @@ issues.new.milestone=마일스톤 issues.new.no_milestone=마일스톤 없음 issues.new.clear_milestone=마일스톤 초기화 issues.new.open_milestone=마일스톤 생성 -issues.new.closed_milestone=마일스톤 닫기 +issues.new.closed_milestone=닫힌 마일스톤 issues.new.assignees=담당자 issues.new.clear_assignees=담당자 초기화 issues.new.no_assignees=담당자 없음 @@ -982,7 +989,7 @@ wiki.create_first_page=첫 페이지 작성 wiki.page=페이지 wiki.filter_page=페이지 필터링 wiki.new_page=페이지 -wiki.default_commit_message=이 페이지 수정에 대한 메모를 작성하세요.(선택사항) +wiki.default_commit_message=이 페이지 수정에 대한 메모를 작성하세요 (선택). wiki.save_page=페이지 저장하기 wiki.last_commit_info=%s이(가) %s에 이 페이지를 수정함 wiki.edit_page_button=수정하기 @@ -1166,8 +1173,8 @@ settings.deploy_key_deletion_success=배포키가 삭제되었습니다. settings.branches=브랜치 settings.protected_branch=브랜치 보호 settings.protected_branch_can_push=푸시를 허용하시겠습니까? -settings.protected_branch_can_push_yes=푸시할 수 있습니다. -settings.protected_branch_can_push_no=푸시할 수 없습니다. +settings.protected_branch_can_push_yes=푸시할 수 있음 +settings.protected_branch_can_push_no=푸시할 수 없음 settings.branch_protection='%s' 브랜치 보호 settings.protect_this_branch=브랜치 보호 활성화 settings.protect_disable_push=푸시 끄기 @@ -1180,7 +1187,7 @@ settings.protect_approvals_whitelist_users=화이트리스트된 리뷰어: settings.add_protected_branch=보호 활성화 settings.delete_protected_branch=보호 비활성화 settings.protected_branch_deletion=브랜치 보호 비활성화 -settings.choose_branch=브랜치 선택... +settings.choose_branch=브랜치 선택… settings.no_protected_branch=보호된 브랜치가 없습니다. settings.edit_protected_branch=편집 settings.archive.button=아카이브 저장소 @@ -1199,7 +1206,7 @@ diff.stats_desc=%d개의 변경된 파일%d개의 diff.bin=BIN diff.view_file=파일 보기 diff.file_byte_size=크기 -diff.file_suppressed=파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다. +diff.file_suppressed=파일 크기가 너무 커 변경을 표시할 수 없음 diff.comment.placeholder=댓글 남기기 diff.comment.add_single_comment=간단한 설명 추가 diff.comment.add_review_comment=댓글 추가 @@ -1236,13 +1243,13 @@ branch.name=브랜치명 branch.delete_head=삭제 branch.delete_html=브랜치 삭제 branch.create_branch=%s 브랜치 생성 -branch.deleted_by=%s 에 의해 삭제되었습니다. +branch.deleted_by=%s 에 의해 삭제되었음 topic.manage_topics=토픽 관리 topic.done=완료 -topic.count_prompt=25개 이상의 토픽을 선택하실 수 없습니다. +topic.count_prompt=25개 이상의 토픽을 선택하실 수 없음 settings.trust_model.collaboratorcommitter.desc = 이 저장소의 협업자가 작성한 유효한 서명이 커미터와 일치하는 경우 "신뢰할 수 있음"으로 표시됩니다. 협업자가 아니되 유효한 서명이 커미터와 일치하면 "신뢰할 수 없음"으로 표시되고 그렇지 않으면 "일치하지 않음"으로 표시됩니다. 커밋에 Co-Authored-By: 또는 Co-Committed-By: 트레일러로 표시된 실제 커미터와 함께 서명된 커밋이 있다면 Forgejo가 커미터로 표시됩니다. 기본 Forgejo 키는 데이터베이스의 사용자와 일치해야 합니다. settings.matrix.access_token_helper = 이 작업을 위한 개별적인 Matrix 계정을 만드는것이 권장됩니다. 엑세스 토큰은 Element 웹 클라이언트(개인정보 보호 브라우징 권장) > 유저 메뉴(좌상단) > All settings > Help & About > Advanced > Access Token (홈서버 주소 바로 아래) 에서 찾을 수 있습니다. 로그아웃시 토큰이 만료됨을 주의하시고, 창을 닫아주세요. settings.trust_model.collaboratorcommitter = 협업자+커미터 @@ -1274,6 +1281,14 @@ pulls.approve_count_1 = %d명의 승인 pulls.blocked_by_approvals = 이 풀 리퀘스트는 충분히 승인되지 않았습니다. %d/%d 승인됨. settings.event_pull_request_approvals = 풀 리퀘스트 승인 pulls.blocked_by_official_review_requests = 이 풀 리퀘스트는 공식 검토자에 의한 승인이 부족하여 차단되었습니다. +watch_guest_user = 이 저장소를 주시하려면 로그인 해야합니다. +issues.closed_by_fake = %[2]s님이 %[1]s에 닫음 +issues.new.closed_projects = 닫힌 프로젝트 +pulls.merged_by_fake = %[2]s님이 %[1]s에 머지함 +issues.closed_by = %[3]s님이 %[1]s에 닫음 +issues.closed_at = `%[2]s`에 이 이슈를 닫음 +issues.filter_milestone_closed = 닫힌 마일스톤 +issues.opened_by_fake = %[2]s님이 %[1]s에 열음 @@ -1307,7 +1322,7 @@ settings.update_settings=설정 업데이트 settings.update_setting_success=조직 설정이 변경되었습니다. settings.update_avatar_success=조직의 아바타가 갱신되었습니다. settings.delete=조직 삭제 -settings.delete_account=이 조직을 삭제합니다. +settings.delete_account=이 조직을 삭제하기 settings.confirm_delete_account=삭제 승인 settings.delete_org_title=조직 삭제 settings.delete_org_desc=이 조직이 영구히 삭제됩니다. 계속 하시겠습니까? @@ -1330,7 +1345,7 @@ teams.join=가입 teams.leave=탈퇴 teams.read_access=읽음 teams.admin_access=관리자 액세스 -teams.no_desc=이 팀은 설명이 없습니다. +teams.no_desc=이 팀은 설명이 없음 teams.settings=설정 teams.members=팀 구성원 teams.update_settings=설정 업데이트 @@ -1402,7 +1417,7 @@ users.admin=관리자 users.repos=저장소 users.created=작성일 users.last_login=마지막 로그인 -users.never_login=로그인 한 적이 없습니다. +users.never_login=로그인 한 적이 없음 users.send_register_notify=사용자 등록 알림 전송 users.edit=수정하기 users.auth_source=인증 소스 @@ -1412,7 +1427,7 @@ users.password_helper=비밀번호를 비워두시면 변경하지 않고 유지 users.update_profile_success=사용자 계정이 갱신되었습니다. users.edit_account=사용자 계정 편집 users.max_repo_creation_desc=(-1을 입력하면 전역 설정된 기본 제한을 따릅니다.) -users.is_activated=사용자 계정이 활성화 되었습니다. +users.is_activated=사용자 계정이 활성화 되었음 users.prohibit_login=로그인 비활성화 users.is_admin=관리자 users.allow_git_hook=Git 훅 생성 허용 @@ -1496,7 +1511,7 @@ auths.tips=도움말 auths.tips.oauth2.general=OAuth2 인증 auths.tip.oauth2_provider=OAuth2 프로바이더 auths.edit=인증 소스 편집 -auths.activated=인증 소스가 활성화 되었습니다. +auths.activated=인증 소스가 활성화 되었음 auths.update_success=인증 소스가 갱신되었습니다. auths.update=인증 소스 갱신 auths.delete=인증 소스 삭제 @@ -1556,7 +1571,7 @@ config.default_allow_create_organization=기본적으로 조직 생성을 허용 config.enable_timetracking=타임 트래킹 활성화 config.default_enable_timetracking=기본 타임 트래킹 활성화 config.default_allow_only_contributors_to_track_time=기여자 트랙 타임만 -config.no_reply_address=답변 받지 않을 이메일 주소 +config.no_reply_address=가려진 이메일 도메인 config.default_enable_dependencies=기본적으로 이슈 종속성을 활성화 config.webhook_config=웹훅 설정 @@ -1639,14 +1654,15 @@ notices.desc=설명 notices.op=일. notices.delete_success=시스템 알림이 삭제되었습니다. users.allow_git_hook_tooltip = Git 훅은 Forgejo가 실행중인 OS 유저로 실행되며 같은 수준의 권한을 갖습니다. 결과적으로, Git 훅 사용권한이 있는 사용자는 Forgejo에서 사용하는 데이터베이스를 포함한 모든 저장소에 접근하거나 수정할 수 있습니다. 궁극적으로 이러한 사용자들은 Forgejo의 관리자 권한을 획득할 수 있습니다. +emails.primary = 대표 [action] create_repo=저장소를 만들었습니다. %s -rename_repo=%[1]s에서에서 %[3]s으로 저장소 이름을 바꾸었습니다. -transfer_repo=%s에서 %s로 저장소가 전송되었습니다. +rename_repo=저장소 이름을 %[1]s에서에서 %[3]s으로 변경함 +transfer_repo=저장소가 %s에서 %s로 이동됨 compare_commits=%d 커밋들 비교 -watched_repo = %[2]s에대한 감시를 시작합니다 +watched_repo = %[2]s에대한 주시를 시작함 [tool] now=현재 @@ -1685,12 +1701,12 @@ mark_as_unread=읽지 않음으로 표시 mark_all_as_read=모두 읽음으로 표시 subscriptions = 구독된 알림 no_subscriptions = 알림이 없음 -watching = 감시 +watching = 주시중 [gpg] error.extract_sign=서명 추출에 실패 error.generate_hash=커밋의 해시 생성에 실패 -error.not_signed_commit=서명되지 않은 커밋입니다. +error.not_signed_commit=서명되지 않은 커밋 [units] error.no_unit_allowed_repo=이 저장소의 어떤 섹션에도 접근할 수 없습니다. diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index d8bb0908db..ec24ab7a38 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -146,10 +146,18 @@ filter = Filtro filter.clear = Limpar filtros filter.is_archived = Arquivado filter.public = Público -filter.is_template = Modelo +filter.is_template = Modelos filter.private = Privado invalid_data = Dados inválidos: %v more_items = Mais itens +filter.is_fork = Forks +filter.is_mirror = Espelhos +toggle_menu = Alternar menu +filter.not_archived = Não arquivado +filter.not_fork = Sem forks +filter.not_mirror = Sem espelhos +filter.not_template = Sem modelos +copy_generic = Copiar para área de transferência [aria] navbar=Barra de navegação @@ -296,7 +304,7 @@ invalid_db_setting=Configuração de banco de dados está inválida: %v invalid_db_table=A tabela "%s" do banco de dados é inválida: %v invalid_repo_path=A raiz do repositório está inválida: %v invalid_app_data_path=O caminho dos dados do aplicativo é inválido: %v -run_user_not_match=O nome de usuário 'Executar como' não é o nome de usuário atual: %s -> %s +run_user_not_match= internal_token_failed=Falha ao gerar o token interno: %v secret_key_failed=Falha ao gerar a chave secreta: %v save_config_failed=Falha ao salvar a configuração: %v @@ -306,10 +314,10 @@ default_keep_email_private=Ocultar endereços de e-mail por padrão default_keep_email_private_popup=Ocultar endereços de e-mail de novas contas de usuário por padrão. default_allow_create_organization=Permitir a criação de organizações default_allow_create_organization_popup=Permitir que novas contas de usuários criem organizações por padrão. -default_enable_timetracking=Habilitar o Cronômetro por Padrão +default_enable_timetracking=Habilitar o cronômetro por padrão default_enable_timetracking_popup=Habilitar o cronômetro para novos repositórios por padrão. no_reply_address=Domínio de e-mail oculto -no_reply_address_helper=Nome de domínio para usuários com um endereço de e-mail oculto. Por exemplo, o nome de usuário 'joe' será registrado no Git como 'joe@noreply.example.org' se o domínio de e-mail oculto estiver definido como 'noreply.example.org'. +no_reply_address_helper=Nome de domínio para usuários com endereço de e-mail oculto. Por exemplo, o nome de usuário "joe" será registrado no Git como "joe@noreply.example.org" se o domínio de e-mail oculto estiver definido como "noreply.example.org". password_algorithm=Algoritmo de hash de senhas invalid_password_algorithm=Algoritmo de hash de senha inválido password_algorithm_helper=Escolha o algoritmo de hash para as senhas. Diferentes algoritmos têm requerimentos e forças diversos. O algoritmo argon2 é bastante seguro, mas usa muita memória e pode ser inapropriado para sistemas com menos recursos. @@ -318,6 +326,8 @@ env_config_keys=Configuração do ambiente env_config_keys_prompt=As seguintes variáveis de ambiente também serão aplicadas ao seu arquivo de configuração: allow_dots_in_usernames = Permitir pontos em nomes de usuário. Esta opção não afeta contas já existentes. enable_update_checker_helper_forgejo = Confere periodicamente um registro TXT de DNS em release.forgejo.org para verificar se há uma nova versão do Forgejo disponível. +smtp_from_invalid = O endereço "Enviar e-mail como" é inválido +config_location_hint = Essas opções de configuração serão salvas em: [home] uname_holder=Usuário ou e-mail @@ -369,6 +379,8 @@ relevant_repositories_tooltip=Repositórios que são forks ou que não possuem t relevant_repositories=Apenas repositórios relevantes estão sendo mostrados, mostrar resultados não filtrados. stars_one = %d estrela stars_few = %d estrelas +forks_one = %d fork +forks_few = %d forks [auth] create_new_account=Cadastrar conta @@ -388,7 +400,7 @@ allow_password_change=Exigir que o usuário redefina a senha (recomendado) reset_password_mail_sent_prompt=Um e-mail de confirmação foi enviado para %s. Por favor, verifique sua caixa de entrada dentro do(s) próximo(s) %s para concluir o processo de recuperação de conta. active_your_account=Ativar sua conta account_activated=Conta foi ativada -prohibit_login=Acesso proibido +prohibit_login=É proibido fazer login prohibit_login_desc=Sua conta está proibida de fazer login, entre em contato com o administrador do site. resent_limit_prompt=Você já solicitou recentemente um e-mail de ativação. Por favor, aguarde 3 minutos e tente novamente. has_unconfirmed_mail=Oi %s, você possui um endereço de e-mail não confirmado (%s). Se você não recebeu um e-mail de confirmação ou precisa reenviar um novo, clique no botão abaixo. @@ -414,8 +426,8 @@ tab_openid=OpenID oauth_signup_tab=Cadastrar nova conta oauth_signup_title=Completar Nova Conta oauth_signup_submit=Completar conta -oauth_signin_tab=Vincular à uma conta existente -oauth_signin_title=Acesse com uma conta vinculada +oauth_signin_tab=Vincular a uma conta existente +oauth_signin_title=Faça login para autorizar a conta vinculada oauth_signin_submit=Vincular conta oauth.signin.error=Ocorreu um erro durante o processamento do pedido de autorização. Se este erro persistir, contate o administrador. oauth.signin.error.access_denied=O pedido de autorização foi negado. @@ -445,6 +457,7 @@ last_admin = Não é possível remover o último administrador. Deve haver ao me change_unconfirmed_email = Se você colocou o endereço de e-mail errado durante o cadastro, você pode alterá-lo abaixo, e uma confirmação será enviada para o novo endereço. remember_me.compromised = O token de login foi invalidado, o que pode indicar que a sua conta foi comprometida. Verifique se não há atividades suspeitas em sua conta. tab_signin = Iniciar sessão +tab_signup = Inscrever-se [mail] view_it_on=Veja em %s @@ -546,8 +559,8 @@ SSPISeparatorReplacement=Separador SSPIDefaultLanguage=Idioma padrão require_error=` não pode estar em branco.` -alpha_dash_error=` deve conter somente alfanumérico, caracteres de traço ('-') e sublinhado ('_').` -alpha_dash_dot_error=` deve conter somente alfanumérico, caracteres de traço ('-'), sublinhado ('_') e ponto ('. ') .` +alpha_dash_error=`deve conter apenas caracteres alfanuméricos, traço ("-") e sublinhado ("_").` +alpha_dash_dot_error=`deve conter apenas caracteres alfanuméricos, traço ("-"), sublinhado ("_") e ponto (".").` git_ref_name_error=` deve ser um nome de referência Git válido.` size_error=`deve ser do tamanho %s.` min_size_error=` deve conter pelo menos %s caracteres.` @@ -593,7 +606,7 @@ enterred_invalid_owner_name=O nome do novo proprietário não é válido. enterred_invalid_password=A senha que você digitou está incorreta. user_not_exist=O usuário não existe. team_not_exist=A equipe não existe. -last_org_owner=Você não pode remover o último usuário do time 'proprietários'. Deve haver pelo menos um proprietário em uma organização. +last_org_owner=Você não pode remover o último usuário da equipe de “proprietários”. Deve haver pelo menos um proprietário para uma organização. cannot_add_org_to_team=Uma organização não pode ser adicionada como membro de uma equipe. duplicate_invite_to_team=O usuário já foi convidado para se juntar da equipe. organization_leave_success=Você saiu da organização %s com sucesso. @@ -606,15 +619,25 @@ unable_verify_ssh_key=Não foi possível validar a chave SSH. Certifique-se de q auth_failed=Autenticação falhou: %v still_own_repo=A sua conta possui um ou mais repositórios. Exclua ou transfira-os antes de excluir a conta. -still_has_org=Sua conta é um membro de uma ou mais organizações, deixe-as primeiro. +still_has_org=Sua conta é membro de uma ou mais organizações, saia delas primeiro. still_own_packages=Sua conta possui um ou mais pacotes, exclua-os primeiro. -org_still_own_repo=Esta organização ainda possui repositórios, exclua ou transfira-os primeiro. -org_still_own_packages=Esta organização ainda possui pacotes, exclua-os primeiro. +org_still_own_repo=Esta organização ainda possui um ou mais repositórios. Exclua-os ou transfira-os primeiro. +org_still_own_packages=Esta organização ainda possui um ou mais pacotes. Exclua-os primeiro. target_branch_not_exist=O branch de destino não existe. username_error_no_dots = ` pode conter apenas caracteres alfanuméricos ("0-9, "a-z", "A-Z"), hífens ("-") e traços inferiores ("_"). Não é permitido conter caracteres não alfanuméricos no início ou fim. Caracteres não alfanuméricos consecutivos também não são permitidos.` admin_cannot_delete_self = Você não pode excluir a si mesmo quando você é um administrador. Por favor, remova suas permissões de administrador primeiro. AccessToken = Token de acesso +To = Nome do Branch +Website = Site +Pronouns = Pronomes +Biography = Biografia +Location = Localização +unsupported_login_type = O tipo de login não é compatível para excluir conta. +required_prefix = A entrada deve começar com "%s" +FullName = Nome completo +Description = Descrição +unset_password = O usuário de login não definiu a senha. [user] @@ -649,6 +672,7 @@ follow_blocked_user = Você não pode seguir este usuário, pois você o bloqueo block_user.detail_3 = Este usuário não poderá adicionar-lhe como colaborador e você também não poderá adicioná-lo como colaborador. block_user.detail = Por favor, entenda que se você bloquear este usuário, outras ações serão tomadas. Tais como: followers_one = %d seguidor +following_one = %d seguindo [settings] profile=Perfil @@ -660,7 +684,7 @@ avatar=Avatar ssh_gpg_keys=Chaves SSH / GPG social=Contas sociais applications=Aplicativos -orgs=Gerenciar organizações +orgs=Organizações repos=Repositórios delete=Excluir conta twofa=Autenticação de dois fatores @@ -703,7 +727,7 @@ comment_type_group_branch=Branch comment_type_group_time_tracking=Contagem de tempo comment_type_group_deadline=Prazo final comment_type_group_dependency=Dependência -comment_type_group_lock=Status de Bloqueio +comment_type_group_lock=Status de bloqueio comment_type_group_review_request=Revisar solicitação comment_type_group_pull_request_push=Commits adicionados comment_type_group_project=Projeto @@ -713,11 +737,11 @@ privacy=Privacidade keep_activity_private=Ocultar atividade da página de perfil keep_activity_private_popup=A sua atividade estará visível apenas para você e os admnistradores -lookup_avatar_by_mail=Procurar o avatar do endereço de e-mail -federated_avatar_lookup=Busca de avatar federativo +lookup_avatar_by_mail=Pesquisar avatar por endereço de e-mail +federated_avatar_lookup=Pesquisa de avatar federado enable_custom_avatar=Usar avatar personalizado choose_new_avatar=Escolha um novo avatar -update_avatar=Atualizar o avatar +update_avatar=Atualizar avatar delete_current_avatar=Excluir avatar atual uploaded_avatar_not_a_image=O arquivo enviado não é uma imagem. uploaded_avatar_is_too_big=O tamanho do arquivo enviado (%d KiB) excede o tamanho máximo permitido (%d KiB). @@ -734,15 +758,15 @@ password_change_disabled=Contas não-locais não podem alterar sua senha atravé emails=Endereços de e-mail manage_emails=Gerenciar endereços de e-mail -manage_themes=Selecione o tema padrão -manage_openid=Gerenciar endereços OpenID +manage_themes=Tema Padrão +manage_openid=Endereços OpenID email_desc=Seu endereço de e-mail principal será usado para notificações, recuperação de senha e, desde que não esteja oculto, para operações do Git baseadas na Web. theme_desc=Este será o seu tema padrão em todo o site. primary=Principal activated=Ativado requires_activation=Requer ativação -primary_email=Tornar Principal -activate_email=Enviar Ativação +primary_email=Tornar primário +activate_email=Enviar ativação activations_pending=Ativações pendentes can_not_add_email_activations_pending=Há uma ativação pendente, tente novamente em alguns minutos se quiser adicionar um novo e-mail. delete_email=Remover @@ -770,16 +794,16 @@ manage_ssh_keys=Gerenciar chaves SSH manage_ssh_principals=Gerenciar Nomes Principais do certificado SSH manage_gpg_keys=Gerenciar chaves GPG add_key=Adicionar chave -ssh_desc=Estas chaves SSH públicas estão associados a sua conta. Chaves privadas correspondentes permitam acesso completo a seus repositórios. +ssh_desc=Essas chaves SSH públicas estão associadas à sua conta. As chaves privadas correspondentes permitem acesso total aos seus repositórios. As chaves SSH que foram verificadas podem ser usadas para verificar commits do Git assinados por SSH. principal_desc=Estes nomes principais do certificado SSH estão associados à sua conta e permitem acesso total aos seus repositórios. -gpg_desc=Essas chaves GPG públicas estão associadas à sua conta. Mantenha suas chaves privadas seguras, pois elas permitem que os commits sejam verificados. +gpg_desc=Essas chaves GPG públicas são associadas à sua conta e usadas para verificar seus commits. Mantenha suas chaves privadas seguras, pois elas permitem assinar commits com sua identidade. ssh_helper=Precisa de ajuda? Dê uma olhada no guia do GitHub para criar suas próprias chaves SSH ou resolver problemas comuns que você pode ter usando SSH. gpg_helper=Precisa de ajuda? Dê uma olhada no guia do GitHub sobre GPG. add_new_key=Adicionar chave SSH add_new_gpg_key=Adicionar chave GPG key_content_ssh_placeholder=Começa com "ssh-ed25519", "ssh-rsa", "ecdsa-sha2-nistp256", "ecdsa-sha2-nistp384", "ecdsa-sha2-nistp521", "sk-ecdsa-sha2-nistp256@openssh.com" ou "sk-ssh-ed25519@openssh.com" key_content_gpg_placeholder=Começa com "-----BEGIN PGP PUBLIC KEY BLOCK-----" -add_new_principal=Adicionar Nome Principal +add_new_principal=Adicionar principal ssh_key_been_used=Esta chave SSH já foi adicionada ao servidor. ssh_key_name_used=Uma chave SSH com o mesmo nome já existe em sua conta. ssh_principal_been_used=Este nome principal já foi adicionada ao servidor. @@ -838,7 +862,7 @@ token_state_desc=Este token tem sido utilizado nos últimos 7 dias principal_state_desc=Este nome principal foi utilizado nos últimos 7 dias show_openid=Mostrar no perfil hide_openid=Ocultar no perfil -ssh_disabled=SSH desabilitado +ssh_disabled=SSH está desativado ssh_signonly=O SSH está desativado no momento, portanto, essas chaves são usadas apenas para verificação de assinatura de confirmação. ssh_externally_managed=Esta chave SSH para este usuário é gerenciada externamente manage_social=Gerenciar contas sociais associadas @@ -846,7 +870,7 @@ social_desc=Essas contas sociais podem ser usadas para fazer login em sua conta. unbind=Desvincular unbind_success=A conta social foi removida com sucesso. -manage_access_token=Gerenciar tokens de acesso +manage_access_token=Tokens de acesso generate_new_token=Gerar novo token tokens_desc=Esses tokens concedem acesso à sua conta usando a API do Forgejo. token_name=Nome do token @@ -880,12 +904,12 @@ create_oauth2_application_button=Criar aplicativo create_oauth2_application_success=Você criou um aplicativo OAuth2 com sucesso. update_oauth2_application_success=Você atualizou o aplicativo OAuth2 com sucesso. oauth2_application_name=Nome do aplicativo -oauth2_confidential_client=Cliente Confidencial. Selecione para aplicativos que mantêm a confidencialidade do segredo, como aplicativos web. Não selecione para aplicativos nativos, incluindo aplicativos desktop e celulares. +oauth2_confidential_client=Cliente confidencial. Selecione para aplicativos que mantêm o segredo confidencial, como aplicativos da web. Não selecione aplicativos nativos, incluindo aplicativos de desktop e móveis. oauth2_redirect_uris=URIs de redirecionamento. Por favor use uma nova linha para cada URI. save_application=Salvar oauth2_client_id=Client ID -oauth2_client_secret=Client Secret -oauth2_regenerate_secret=Gerar novamente o Client Secret +oauth2_client_secret=Segredo do cliente +oauth2_regenerate_secret=Regenerar segredo oauth2_regenerate_secret_hint=Perdeu seu Client Secret? oauth2_client_secret_hint=O segredo não será exibido novamente depois que você sair ou atualizar esta página. Certifique-se de que você o salvou. oauth2_application_edit=Editar @@ -967,6 +991,15 @@ blocked_users_none = Nenhum usuário bloqueado. access_token_desc = As permissões selecionadas para o token limitam o acesso apenas às rotas da API correspondentes. Veja a documentação para mais informações. webauthn_alternative_tip = Você talvez queira configurar um método adicional de autenticação. change_password = Alterar senha +hints = Dicas +pronouns = Pronomes +pronouns_custom = Personalizado +pronouns_unspecified = Não especificado +language.title = Idioma padrão +additional_repo_units_hint = Sugira habilitar unidades de repositório adicionais +additional_repo_units_hint_description = Exiba um botão "Adicionar mais unidades..." para repositórios que não possuem todas as unidades disponíveis habilitadas. +update_hints = Dicas de atualização +update_hints_success = As dicas foram atualizadas. [repo] owner=Proprietário @@ -1126,7 +1159,7 @@ migrate.migrating=Migrando a partir de %s ... migrate.migrating_failed=Migração a partir de %s falhou. migrate.migrating_failed.error=Falha ao migrar: %s migrate.migrating_failed_no_addr=A migração falhou. -migrate.github.description=Migrar dados de github.com ou de outras instâncias do GitHub. +migrate.github.description=Migre dados do servidor github.com ou GitHub Enterprise. migrate.git.description=Migrar um repositório somente de qualquer serviço Git. migrate.gitlab.description=Migrar dados de gitlab.com ou de outras instâncias do GitLab. migrate.gitea.description=Migrar dados de gitea.com ou de outras instâncias do Gitea/Forgejo. @@ -2602,6 +2635,8 @@ settings.units.units = Funcionalidades vendored = Externo issues.num_participants_one = %d participante issues.archived_label_description = (arquivada) %s +n_branch_few = %s branches +stars = Favoritos [graphs] @@ -3615,4 +3650,9 @@ fuzzy_tooltip = Inclui resultados que se aproximam dos termos de busca match = Correspondente match_tooltip = Inclui apenas os resultados que correspondem exatamente aos termos de busca repo_kind = Buscar repositórios... -type_tooltip = Tipo de busca \ No newline at end of file +type_tooltip = Tipo de busca +code_search_by_git_grep = Os resultados atuais da pesquisa de código são fornecidos por "git grep". Pode haver melhores resultados se o administrador do site ativar o indexador de código. +branch_kind = Pesquisar branches… +commit_kind = Pesquisar commits… +runner_kind = Pesquisar runners... +code_search_unavailable = A pesquisa de código não está disponível no momento. Entre em contato com o administrador do site. \ No newline at end of file diff --git a/options/locale/locale_pt-PT.ini b/options/locale/locale_pt-PT.ini index 8f781fe85f..ca3009157a 100644 --- a/options/locale/locale_pt-PT.ini +++ b/options/locale/locale_pt-PT.ini @@ -142,19 +142,19 @@ confirm_delete_selected=Confirma a exclusão de todos os itens marcados? name=Nome value=Valor -filter.is_fork = Derivado -filter.is_mirror = Replicado -filter.is_template = Modelo +filter.is_fork = Derivações +filter.is_mirror = Réplicas +filter.is_template = Modelos filter.public = Público filter.not_archived = Não arquivado filter.private = Privado -filter.not_fork = Não derivado -filter.not_mirror = Não replicado +filter.not_fork = Não derivações +filter.not_mirror = Não réplicas more_items = Mais itens invalid_data = Dados inválidos: %v filter.clear = Retirar filtros filter.is_archived = Arquivado -filter.not_template = Não modelo +filter.not_template = Não modelos toggle_menu = Comutar menu filter = Filtro copy_generic = Copiar para a área de transferência @@ -556,7 +556,7 @@ TreeName=Localização do ficheiro Content=Conteúdo SSPISeparatorReplacement=Separador -SSPIDefaultLanguage=Idioma predefinido +SSPIDefaultLanguage=Idioma padrão require_error=` não pode estar em branco.` alpha_dash_error=` deve conter apenas caracteres alfanuméricos, hífen ("-") e sublinhado ("_").` @@ -685,7 +685,7 @@ avatar=Avatar ssh_gpg_keys=Chaves SSH / GPG social=Contas sociais applications=Aplicações -orgs=Gerir organizações +orgs=Organizações repos=Repositórios delete=Eliminar a conta twofa=Autenticação em dois passos (TOTP) @@ -759,8 +759,8 @@ password_change_disabled=Os utilizadores não-locais não podem alterar a sua se emails=Endereços de email manage_emails=Gerir endereços de email -manage_themes=Escolher o tema padrão -manage_openid=Gerir endereços OpenID +manage_themes=Tema padrão +manage_openid=Endereços OpenID email_desc=O seu endereço de email principal irá ser usado para notificações, recuperação de senha e, desde que não esteja oculto, operações Git baseados na web. theme_desc=Este será o seu tema padrão em todo o sítio. primary=Principal @@ -804,7 +804,7 @@ add_new_key=Adicionar chave SSH add_new_gpg_key=Adicionar chave GPG key_content_ssh_placeholder=Começa com "ssh-ed25519", "ssh-rsa", "ecdsa-sha2-nistp256", "ecdsa-sha2-nistp384", "ecdsa-sha2-nistp521", "sk-ecdsa-sha2-nistp256@openssh.com", ou "sk-ssh-ed25519@openssh.com" key_content_gpg_placeholder=Começa com "-----BEGIN PGP PUBLIC KEY BLOCK-----" -add_new_principal=Adicional Protagonista +add_new_principal=Adicionar protagonista ssh_key_been_used=Esta chave SSH já tinha sido adicionada ao servidor. ssh_key_name_used=Já existe uma chave SSH com o mesmo nome na sua conta. ssh_principal_been_used=Este protagonista já tinha sido adicionado ao servidor. @@ -871,7 +871,7 @@ social_desc=Estas contas sociais podem ser usadas para iniciar sessão na sua co unbind=Desvincular unbind_success=A conta social foi removida com sucesso. -manage_access_token=Gerir códigos de acesso +manage_access_token=Códigos de acesso generate_new_token=Gerar um novo código tokens_desc=Esses códigos concedem acesso à sua conta usando a API do Forgejo. token_name=Nome do código @@ -953,7 +953,7 @@ webauthn_delete_key_desc=Se remover uma chave de segurança, deixará de poder u webauthn_key_loss_warning=Se perder as suas chaves de segurança, perderá acesso à sua conta. webauthn_alternative_tip=Poderá querer configurar um método de autenticação adicional. -manage_account_links=Gerir contas vinculadas +manage_account_links=Contas vinculadas manage_account_links_desc=Estas contas externas estão vinculadas à sua conta do Forgejo. account_links_not_available=Neste momento não existem contas externas vinculadas à sua conta do Forgejo. link_account=Vincular conta @@ -986,7 +986,7 @@ visibility.limited=Limitada visibility.limited_tooltip=Visível apenas para utilizadores autenticados visibility.private=Privada visibility.private_tooltip=Visível apenas para membros das organizações a que se associou -additional_repo_units_hint = Encorajar a habilitação de unidades do repositório adicionais +additional_repo_units_hint = Sugere a habilitação de unidades do repositório adicionais update_hints = Modificar sugestões change_password = Modificar a senha pronouns = Pronomes @@ -1000,6 +1000,7 @@ additional_repo_units_hint_description = Mostrar um botão "Adicionar mais unida update_hints_success = As sugestões foram modificadas. blocked_users_none = Não há utilizadores bloqueados. user_unblock_success = O utilizador foi desbloqueado com sucesso. +language.title = Idioma predefinido [repo] new_repo_helper=Um repositório contém todos os ficheiros do trabalho, incluindo o histórico das revisões. Já tem um hospedado noutro sítio? Migre o repositório. @@ -1171,7 +1172,7 @@ migrate.migrating=Migrando a partir de %s ... migrate.migrating_failed=A migração de %s falhou. migrate.migrating_failed.error=Falhou a migração: %s migrate.migrating_failed_no_addr=A migração falhou. -migrate.github.description=Migrar dados de github.com ou de outras instâncias do GitHub. +migrate.github.description=Migrar dados do github.com ou do GitHub Enterprise server. migrate.git.description=Migrar um repositório somente de qualquer serviço Git. migrate.gitlab.description=Migrar dados de gitlab.com ou de outras instâncias do GitLab. migrate.gitea.description=Migrar dados de gitea.com ou de outras instâncias do Gitea/Forgejo. @@ -1258,9 +1259,9 @@ ambiguous_character=`%[1]c [U+%04[1]X] pode confundir-se com %[2]c [U+%04[2]X]` escape_control_characters=Revelar unescape_control_characters=Esconder file_copy_permalink=Copiar ligação permanente -view_git_blame=Ver Git Blame -video_not_supported_in_browser=O seu navegador não suporta a etiqueta 'video' do HTML5. -audio_not_supported_in_browser=O seu navegador não suporta a etiqueta 'audio' do HTML5. +view_git_blame=Ver git blame +video_not_supported_in_browser=O seu navegador não suporta a etiqueta "video" do HTML5. +audio_not_supported_in_browser=O seu navegador não suporta a etiqueta "audio" do HTML5. stored_lfs=Armazenado com Git LFS symbolic_link=Ligação simbólica executable_file=Ficheiro executável @@ -1296,12 +1297,12 @@ editor.delete_this_file=Eliminar ficheiro editor.must_have_write_access=Tem que ter permissões de escrita para fazer ou propor modificações neste ficheiro. editor.file_delete_success=O ficheiro "%s" foi eliminado. editor.name_your_file=Nomeie o seu ficheiro… -editor.filename_help=Adicione uma pasta escrevendo o nome dessa pasta seguido de uma barra('/'). Remova uma pasta carregando na tecla de apagar ('←') no início do campo. +editor.filename_help=Adicione uma pasta escrevendo o nome dessa pasta seguido de uma barra("/"). Remova uma pasta carregando na tecla de apagar ("←") no início do campo. editor.or=ou editor.cancel_lower=Cancelar editor.commit_signed_changes=Cometer modificações assinadas editor.commit_changes=Cometer modificações -editor.add_tmpl=Adicionar '' +editor.add_tmpl=Adicionar "" editor.add=Adicionar %s editor.update=Modificar %s editor.delete=Eliminar %s @@ -1327,7 +1328,7 @@ editor.file_is_a_symlink=`"%s" é uma ligação simbólica. Ligações simbólic editor.filename_is_a_directory=O nome de ficheiro "%s" já está a ser usado como um nome de pasta neste repositório. editor.file_editing_no_longer_exists=O ficheiro que está a ser editado, "%s", já não existe neste repositório. editor.file_deleting_no_longer_exists=O ficheiro que está a ser eliminado, "%s", já não existe neste repositório. -editor.file_changed_while_editing=O conteúdo do ficheiro mudou desde que começou a editar. Clique aqui para ver as modificações ou clique em Cometer novamente para escrever por cima. +editor.file_changed_while_editing=O conteúdo do ficheiro mudou desde que começou a editar. Clique aqui para ver as modificações ou clique em Cometer modificações novamente para escrever por cima. editor.file_already_exists=Já existe um ficheiro com o nome "%s" neste repositório. editor.commit_empty_file_header=Cometer um ficheiro vazio editor.commit_empty_file_text=O ficheiro que está prestes a cometer está vazio. Quer continuar? @@ -1398,12 +1399,12 @@ projects.deletion_desc=Eliminar um planeamento remove-o de todas as questões re projects.deletion_success=O planeamento foi eliminado. projects.edit=Editar planeamentos projects.edit_subheader=Planeamentos organizam questões e acompanham o progresso. -projects.modify=Modificar planeamento +projects.modify=Editar planeamento projects.edit_success=O planeamento "%s" foi modificado. projects.type.none=Nenhum projects.type.basic_kanban=Kanban básico projects.type.bug_triage=Triagem de erros -projects.template.desc=Modelo de planeamento +projects.template.desc=Modelo projects.template.desc_helper=Escolha um modelo de planeamento para começar projects.type.uncategorized=Sem categoria projects.column.edit=Editar coluna @@ -1416,7 +1417,7 @@ projects.column.set_default_desc=Definir esta coluna como a predefinida para que projects.column.unset_default=Deixar de ser a predefinida projects.column.unset_default_desc=Faz com que esta coluna deixe de ser a predefinida projects.column.delete=Eliminar coluna -projects.column.deletion_desc=Eliminar uma coluna de um planeamento faz com que todas as questões que nela constam sejam movidas para a coluna 'Sem categoria'. Continuar? +projects.column.deletion_desc=Eliminar uma coluna de um planeamento faz com que todas as questões que nela constam sejam movidas para a coluna padrão. Continuar? projects.column.color=Colorido projects.open=Abrir projects.close=Fechar @@ -1434,7 +1435,7 @@ issues.filter_reviewers=Filtrar revisor issues.new=Questão nova issues.new.title_empty=O título não pode estar vazio issues.new.labels=Rótulos -issues.new.no_label=Sem rótulo +issues.new.no_label=Sem rótulos issues.new.clear_labels=Retirar rótulos issues.new.projects=Planeamentos issues.new.clear_projects=Limpar planeamentos @@ -1464,10 +1465,10 @@ issues.new_label=Novo rótulo issues.new_label_placeholder=Nome do rótulo issues.new_label_desc_placeholder=Descrição issues.create_label=Criar rótulo -issues.label_templates.title=Carregar um conjunto predefinido de rótulos -issues.label_templates.info=Ainda não existem rótulos. Crie um rótulo com 'Novo rótulo' ou use um conjunto de rótulos predefinido: -issues.label_templates.helper=Escolha um conjunto de rótulos -issues.label_templates.use=Usar conjunto de rótulos +issues.label_templates.title=Carregar uma predefinição de rótulos +issues.label_templates.info=Ainda não existem rótulos. Crie um rótulo com "Novo rótulo" ou use uma predefinição de rótulos: +issues.label_templates.helper=Escolha uma predefinição de rótulos +issues.label_templates.use=Usar predefinição de rótulos issues.label_templates.fail_to_load_file=Falhou ao carregar o ficheiro modelo de rótulos "%s": %v issues.add_label=adicionou o rótulo %s %s issues.add_labels=adicionou os rótulos %s %s @@ -1602,7 +1603,7 @@ issues.label_title=Nome do rótulo issues.label_description=Descrição do rótulo issues.label_color=Cor do rótulo issues.label_exclusive=Exclusivo -issues.label_archive=Rótulo de arquivo +issues.label_archive=Arquivar rótulo issues.label_archived_filter=Mostrar rótulos arquivados issues.label_archive_tooltip=Os rótulos arquivados são, por norma, excluídos das sugestões ao pesquisar por rótulo. issues.label_exclusive_desc=Nomeie o rótulo âmbito/item para torná-lo mutuamente exclusivo com outros rótulos do âmbito/. @@ -1672,7 +1673,7 @@ issues.add_time_sum_to_small=Não foi inserido qualquer tempo. issues.time_spent_total=Total de tempo gasto issues.time_spent_from_all_authors=`Total de tempo gasto: %s` issues.due_date=Data de vencimento -issues.invalid_due_date_format=O formato da data de vencimento tem que ser 'aaaa-mm-dd'. +issues.invalid_due_date_format=O formato da data de vencimento tem que ser "aaaa-mm-dd". issues.error_modifying_due_date=Falhou a modificação da data de vencimento. issues.error_removing_due_date=Falhou a remoção da data de vencimento. issues.push_commit_1=adicionou %d cometimento %s @@ -1689,7 +1690,7 @@ issues.due_date_added=adicionou a data de vencimento %s %s issues.due_date_modified=modificou a data de vencimento de %[2]s para %[1]s %[3]s issues.due_date_remove=removeu a data de vencimento %s %s issues.due_date_overdue=Em atraso -issues.due_date_invalid=A data de vencimento é inválida ou está fora do intervalo permitido. Por favor, use o formato 'aaaa-mm-dd'. +issues.due_date_invalid=A data de vencimento é inválida ou está fora do intervalo permitido. Por favor, use o formato "aaaa-mm-dd". issues.dependency.title=Dependências issues.dependency.issue_no_dependencies=Não estão definidas dependências. issues.dependency.pr_no_dependencies=Não estão definidas dependências. @@ -1862,9 +1863,9 @@ pulls.unrelated_histories=A integração falhou: O topo da integração e a base pulls.merge_out_of_date=Falhou a integração: Enquanto estava a gerar a integração, a base foi modificada. Dica: Tente de novo. pulls.head_out_of_date=Falhou a integração: Enquanto estava a gerar a integração, o topo foi modificado. Dica: Tente de novo. pulls.has_merged=Falhou: A integração constante do pedido foi executada, não pode integrar novamente nem modificar o ramo alvo. -pulls.push_rejected=A integração falhou: O envio foi rejeitado. Reveja os Automatismos do Git neste repositório. +pulls.push_rejected=A integração falhou: O envio foi rejeitado. Reveja os automatismos do Git neste repositório. pulls.push_rejected_summary=Mensagem completa de rejeição -pulls.push_rejected_no_message=A integração falhou: O envio foi rejeitado mas não houve qualquer mensagem remota.
Reveja os Automatismos do Git para este repositório +pulls.push_rejected_no_message=A integração falhou: O envio foi rejeitado mas não houve qualquer mensagem remota.
Reveja os automatismos do Git para este repositório pulls.open_unmerged_pull_exists=`Não pode executar uma operação de reabertura porque há um pedido de integração pendente (#%d) com propriedades idênticas.` pulls.status_checking=Algumas verificações estão pendentes pulls.status_checks_success=Todas as verificações foram bem sucedidas @@ -1923,7 +1924,7 @@ milestones.title=Título milestones.desc=Descrição milestones.due_date=Data de vencimento (opcional) milestones.clear=Limpar -milestones.invalid_due_date_format=O formato da data de vencimento tem que ser 'aaaa-mm-dd'. +milestones.invalid_due_date_format=O formato da data de vencimento tem que ser "aaaa-mm-dd". milestones.create_success=A etapa "%s" foi criada. milestones.edit=Editar etapa milestones.edit_subheader=As etapas organizam as questões e acompanham o progresso. @@ -1942,7 +1943,7 @@ milestones.filter_sort.least_issues=Menos questões signing.will_sign=Este cometimento irá ser assinado com a chave "%s". signing.wont_sign.error=Ocorreu um erro enquanto estava a ser verificado se o cometimento poderia ser assinado. -signing.wont_sign.nokey=Não existe qualquer chave disponível para assinar este cometimento. +signing.wont_sign.nokey=Esta instância não tem qualquer chave com que se possa assinar este cometimento. signing.wont_sign.never=Os cometimentos nunca são assinados. signing.wont_sign.always=Os cometimentos são sempre assinados. signing.wont_sign.pubkey=O cometimento não será assinado porque não tem uma chave pública associada à sua conta. @@ -1973,7 +1974,7 @@ wiki.last_commit_info=%s editou esta página %s wiki.edit_page_button=Editar wiki.new_page_button=Nova página wiki.file_revision=Revisão da página -wiki.wiki_page_revisions=Revisões da página wiki +wiki.wiki_page_revisions=Revisões da página wiki.back_to_wiki=Voltar à página wiki wiki.delete_page_button=Eliminar página wiki.delete_page_notice_1=Eliminar a página wiki "%s" é uma operação irreversível. Quer continuar? @@ -1981,7 +1982,7 @@ wiki.page_already_exists=Já existe uma página wiki com o mesmo nome. wiki.reserved_page=O nome de página wiki "%s" está reservado. wiki.pages=Páginas wiki.last_updated=Última modificação em %s -wiki.page_name_desc=Insira um nome para esta página Wiki. Alguns dos nomes especiais são: 'Home', '_Sidebar' e '_Footer'. +wiki.page_name_desc=Insira um nome para esta página Wiki. Alguns dos nomes especiais são: "Home", "_Sidebar" e "_Footer". wiki.original_git_entry_tooltip=Ver o ficheiro Git original, ao invés de usar uma ligação amigável. activity=Trabalho @@ -1998,22 +1999,22 @@ activity.period.yearly=1 ano activity.overview=Panorama geral activity.active_prs_count_1=%d pedido de integração vigente activity.active_prs_count_n=%d pedidos de integração vigentes -activity.merged_prs_count_1=pedido de integração executado -activity.merged_prs_count_n=pedidos de integração executados -activity.opened_prs_count_1=pedido de integração proposto -activity.opened_prs_count_n=pedidos de integração propostos +activity.merged_prs_count_1=Pedido de integração executado +activity.merged_prs_count_n=Pedidos de integração executados +activity.opened_prs_count_1=Pedido de integração proposto +activity.opened_prs_count_n=Pedidos de integração propostos activity.title.user_1=%d utilizador activity.title.user_n=%d utilizadores activity.title.prs_1=%d pedido de integração -activity.title.prs_n=%d Pedidos de integração +activity.title.prs_n=%d pedidos de integração activity.title.prs_merged_by=%s executado(s) por %s activity.title.prs_opened_by=%s proposto por %s activity.merged_prs_label=Integrado activity.opened_prs_label=Proposto activity.active_issues_count_1=%d questão vigente activity.active_issues_count_n=%d questões vigentes -activity.closed_issues_count_1=questão encerrada -activity.closed_issues_count_n=questões encerradas +activity.closed_issues_count_1=Questão encerrada +activity.closed_issues_count_n=Questões encerradas activity.title.issues_1=%d questão activity.title.issues_n=%d questões activity.title.issues_closed_from=%s resolvida(s) de %s @@ -2146,12 +2147,12 @@ settings.pulls.default_allow_edits_from_maintainers=Permitir, por norma, que os settings.releases_desc=Habilitar lançamentos no repositório settings.packages_desc=Habilitar o registo de pacotes do repositório settings.projects_desc=Habilitar planeamentos no repositório -settings.actions_desc=Habilitar operações no repositório (Forgejo Actions) +settings.actions_desc=Habilitar sequências CI/CD integradas com Forgejo Actions settings.admin_settings=Configurações do administrador settings.admin_enable_health_check=Habilitar verificações de integridade (git fsck) no repositório settings.admin_code_indexer=Indexador de código-fonte settings.admin_stats_indexer=Indexador de estatísticas de código-fonte -settings.admin_indexer_commit_sha=Último SHA indexado +settings.admin_indexer_commit_sha=Último cometimento indexado settings.admin_indexer_unindexed=Não indexado settings.reindex_button=Adicionar à fila de reindexação settings.reindex_requested=Reindexação solicitada @@ -2551,7 +2552,7 @@ diff.review.reject=Solicitar modificações diff.review.self_approve=Autores de pedidos de integração não podem aprovar o seu próprio pedido de integração diff.committed_by=cometido por diff.protected=Protegido -diff.image.side_by_side=Lado a Lado +diff.image.side_by_side=Lado a lado diff.image.swipe=Deslizar diff.image.overlay=Sobrepor diff.has_escaped=Esta linha tem caracteres unicode escondidos @@ -2602,7 +2603,7 @@ release.tag_already_exist=Este nome de etiqueta já existe. release.downloads=Descargas release.download_count=Descargas: %s release.add_tag_msg=Usar o título e o conteúdo do lançamento como mensagem da etiqueta. -release.add_tag=Criar apenas a etiqueta +release.add_tag=Criar etiqueta release.releases_for=Lançamentos para %s release.tags_for=Etiquetas para %s @@ -2684,7 +2685,7 @@ n_tag_one = %s etiqueta n_tag_few = %s etiquetas migrate.forgejo.description = Migrar dados de codeberg.org ou de outras instâncias Forgejo. n_commit_one = %s cometimento -editor.commit_id_not_matching = O ID de cometimento não corresponde ao que estava a editar. Cometa para um ramo novo e depois integre. +editor.commit_id_not_matching = O ficheiro foi modificado enquanto o estava a editar. Cometa para um ramo novo e depois integre. commits.search_branch = Este ramo pulls.title_desc_one = quer integrar %[1]d cometimento do ramo %[2]s no ramo %[3]s pulls.reopen_failed.base_branch = O pedido de integração não pode ser reaberto porque o ramo base já não existe. @@ -2735,6 +2736,10 @@ settings.sourcehut_builds.secrets_helper = Dar, ao trabalho, acesso aos segredos settings.sourcehut_builds.access_token_helper = Código de acesso que tem a permissão JOBS:RW. Gera um código builds.sr.ht ou um código builds.sr.ht com acesso aos segredos em meta.sr.ht. release.hide_archive_links = Esconder arquivos gerados automaticamente release.hide_archive_links_helper = Esconder arquivos de código-fonte gerados automaticamente para este lançamento. Por exemplo, se estiver a carregar o seu próprio. +wiki.no_search_results = Sem resultados +settings.transfer.button = Transferir propriedade +settings.transfer.modal.title = Transferir propriedade +wiki.search = Pesquisar wiki [graphs] component_loading=A carregar %s... @@ -2804,9 +2809,9 @@ settings.labels_desc=Adicionar rótulos que possam ser usados em questões para members.membership_visibility=Visibilidade da filiação: members.public=Visível -members.public_helper=tornar oculto +members.public_helper=Tornar oculto members.private=Oculto -members.private_helper=tornar visível +members.private_helper=Tornar visível members.member_role=Função do membro: members.owner=Proprietário(a) members.member=Membro @@ -2964,8 +2969,8 @@ dashboard.total_gc_time=Pausa total da recolha de lixo dashboard.total_gc_pause=Pausa total da recolha de lixo dashboard.last_gc_pause=Última pausa da recolha de lixo dashboard.gc_times=N.º de recolhas de lixo -dashboard.delete_old_actions=Eliminar todas as operações antigas da base de dados -dashboard.delete_old_actions.started=Foi iniciado o processo de eliminação de todas as operações antigas da base de dados. +dashboard.delete_old_actions=Eliminar todos os trabalhos antigos da base de dados +dashboard.delete_old_actions.started=Foi iniciado o processo de eliminação de todos os trabalhos antigos da base de dados. dashboard.update_checker=Verificador de novas versões dashboard.delete_old_system_notices=Eliminar todas as notificações do sistema antigas da base de dados dashboard.gc_lfs=Recolher lixo dos meta-elementos LFS @@ -2992,7 +2997,7 @@ users.repos=Repos. users.created=Criada users.last_login=Último acesso users.never_login=Nunca acedeu -users.send_register_notify=Enviar notificação de registo de utilizador +users.send_register_notify=Notificar sobre o registo via email users.new_success=A conta de utilizador "%s" foi criada. users.edit=Editar users.auth_source=Fonte de autenticação @@ -3440,7 +3445,7 @@ mirror_sync_create=sincronizou a nova referência %[3]s para mirror_sync_delete=sincronizou e eliminou a referência %[2]s em %[3]s da réplica approve_pull_request=`aprovou %[3]s#%[2]s` reject_pull_request=`sugeriu modificações para %[3]s#%[2]s` -publish_release=`lançou "%[4]s" em %[3]s` +publish_release=`lançou %[4]s em %[3]s` review_dismissed=`descartou a revisão de %[4]s para %[3]s#%[2]s` review_dismissed_reason=Motivo: create_branch=criou o ramo %[3]s em %[4]s @@ -3631,7 +3636,7 @@ owner.settings.cargo.rebuild=Reconstruir índice owner.settings.cargo.rebuild.description=Reconstruir pode ser útil se o índice não estiver sincronizado com os pacotes de Cargo armazenados. owner.settings.cargo.rebuild.error=Falhou ao reconstruir o índice do Cargo: %v owner.settings.cargo.rebuild.success=O índice do Cargo foi reconstruído com sucesso. -owner.settings.cleanuprules.title=Gerir regras de limpeza +owner.settings.cleanuprules.title=Regras de limpeza owner.settings.cleanuprules.add=Adicionar regra de limpeza owner.settings.cleanuprules.edit=Editar regra de limpeza owner.settings.cleanuprules.none=Ainda não há quaisquer regras de limpeza. @@ -3675,7 +3680,7 @@ management=Gerir segredos [actions] actions=Operações -unit.desc=Gerir operações +unit.desc=Gerir sequências CI/CD integradas com Forgejo Actions status.unknown=Desconhecido status.waiting=Aguardando diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index 7b53e0234d..c7aaa8f074 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -1881,7 +1881,7 @@ pull.deleted_branch=(удалена):%s milestones.new=Новый этап milestones.closed=Закрыт %s -milestones.update_ago=Обновлено %s +milestones.update_ago=Обновлён %s milestones.no_due_date=Срок не указан milestones.open=Открыть milestones.close=Закрыть @@ -2741,6 +2741,8 @@ release.hide_archive_links = Скрыть автоматически генер release.hide_archive_links_helper = Скрыть автоматически добавляемые архивы исходного кода для этого релиза. Например, если вы загружаете свои архивы. settings.transfer.button = Передать репозиторий settings.transfer.modal.title = Передача репозитория +wiki.search = Искать в вики +wiki.no_search_results = Нет результатов [graphs] @@ -2749,7 +2751,7 @@ org_name_holder=Название организации org_full_name_holder=Полное название org_name_helper=Лучшие названия организаций коротки и запоминаемы. create_org=Создать организацию -repo_updated=Обновлено %s +repo_updated=Обновлён %s members=Участники teams=Команды code=Код @@ -3439,7 +3441,7 @@ mirror_sync_create=синхронизировал(а) новую ссылку %[2]s на %[3]s из зеркала approve_pull_request=`одобрен %[3]s#%[2]s` reject_pull_request=`предложил(а) изменения для %[3]s#%[2]s` -publish_release=`выпустил(а) "%[4]s" в %[3]s` +publish_release=`выпустил(а) %[4]s в %[3]s` review_dismissed=`отклонён отзыв от %[4]s для %[3]s#%[2]s` review_dismissed_reason=Причина: create_branch=создана ветка %[3]s в %[4]s diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index 6eecc38674..8e01f2a138 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -656,7 +656,7 @@ following_few=%d 关注中 follow=关注 unfollow=取消关注 user_bio=简历 -disabled_public_activity=该用户已隐藏活动记录。 +disabled_public_activity=该用户已隐藏公开活动记录。 email_visibility.limited=所有已认证用户均可看到您的电子邮件地址 email_visibility.private=只有你本人和管理员可以看到你的电子邮件地址 show_on_map=在地图上显示这个位置 @@ -2752,6 +2752,8 @@ release.hide_archive_links_helper = 为此版本发布隐藏自动生成的源 release.hide_archive_links = 隐藏自动生成的存档 settings.transfer.modal.title = 转移所有权 settings.transfer.button = 转移所有权 +wiki.search = 搜索百科 +wiki.no_search_results = 无结果 [graphs] component_loading=正在加载 %s... diff --git a/options/locale/locale_zh-TW.ini b/options/locale/locale_zh-TW.ini index f52c5e6879..44cb81bc76 100644 --- a/options/locale/locale_zh-TW.ini +++ b/options/locale/locale_zh-TW.ini @@ -55,7 +55,7 @@ mirror=鏡像 new_repo=新增儲存庫 new_migrate=遷移外部儲存庫 new_mirror=新增鏡像 -new_fork=新增儲存庫 Fork +new_fork=建立新的儲存庫分叉 new_org=新增組織 new_project=新增專案 new_project_column=新增欄位 @@ -71,7 +71,7 @@ all=所有 sources=來源 mirrors=鏡像 collaborative=協作 -forks=Fork +forks=分叉 activities=動態 pull_requests=合併請求 @@ -166,7 +166,7 @@ footer.software=關於軟體 footer.links=連結 [heatmap] -number_of_contributions_in_the_last_12_months=過去十二個月內有 %s 個貢獻 +number_of_contributions_in_the_last_12_months=過去十二個月內有 %s 項貢獻 contributions_zero=沒有貢獻 less=少 more=多 @@ -236,11 +236,11 @@ reinstall_confirm_check_1=您可能會遺失以 app.ini 中 SECRET_KEY 所加密 reinstall_confirm_check_2=儲存庫和設定可能需要重新同步。核取此方塊代表您確認您將會手動重新同步儲存庫的 Hook 和 SSH authorized_keys 檔案。您確認您會確保儲存庫和鏡像設定正確。 reinstall_confirm_check_3=您確認您絕對肯定此 Forgejo 在正確的 app.ini 位置上執行,而且您確定您必須重新安裝。您確認您瞭解上述風險。 err_empty_db_path=SQLite3 資料庫路徑不可以為空。 -no_admin_and_disable_registration=您不能夠在未建立管理員使用者的情況下禁止註冊。 +no_admin_and_disable_registration=您不能夠在未建立管理員帳號的情況下禁止自助註冊。 err_empty_admin_password=管理員密碼不能為空。 err_empty_admin_email=管理員信箱不能為空。 err_admin_name_is_reserved=無效的管理員帳號名稱,帳號名稱已被保留 -err_admin_name_pattern_not_allowed=無效的管理員帳號名稱,該帳號符合保留規則 +err_admin_name_pattern_not_allowed=無效的管理員帳號名稱,該帳號符合被保留式樣 err_admin_name_is_invalid=無效的管理員帳號名稱 general_title=一般設定 @@ -277,8 +277,8 @@ offline_mode=啟用本地模式 offline_mode_popup=停用其他服務並在本地提供所有資源。 disable_gravatar=停用 Gravatar disable_gravatar_popup=停用 Gravatar 和第三方大頭貼服務。若使用者在未本地上傳大頭貼,將使用預設的大頭貼。 -federated_avatar_lookup=啟用 Federated 大頭貼 -federated_avatar_lookup_popup=啟用 Libravatar 提供的 Federated Avatar 查詢服務。 +federated_avatar_lookup=啟用聯邦式大頭貼 +federated_avatar_lookup_popup=啟用 Libravatar 提供的聯邦式大頭貼查詢服務。 disable_registration=停用自助註冊 disable_registration_popup=禁止使用者自助註冊,只有管理員可以新增帳號。 allow_only_external_registration_popup=只允許從外部服務註冊 @@ -288,7 +288,7 @@ openid_signup=啟用 OpenID 自助註冊 openid_signup_popup=啟用使用 OpenID 的自助註冊。 enable_captcha=啟用註冊驗證碼 enable_captcha_popup=要求在用戶註冊時輸入驗證碼。 -require_sign_in_view=需要登入才能瀏覽頁面 +require_sign_in_view=需要登入才能瀏覽站點內容 require_sign_in_view_popup=僅有已登入的使用者能存取頁面。訪客只會看到登入和註冊頁面。 admin_setting_desc=您不需要建立管理員帳號。 第一個註冊的使用者將自動成為管理員。 admin_title=管理員帳號設定 @@ -297,7 +297,7 @@ admin_password=密碼 confirm_password=確認密碼 admin_email=電子信箱 install_btn_confirm=安裝 Forgejo -test_git_failed=無法測試「git」指令:%v +test_git_failed=無法測試「git」命令:%v sqlite3_not_available=這個 Forgejo 版本不支援 SQLite3,請從 %s 下載官方的預先編譯版本 (不是 「gobuild」 版本)。 invalid_db_setting=資料庫設定無效: %v invalid_db_table=資料表「%s」無效:%v @@ -310,9 +310,9 @@ save_config_failed=儲存設定失敗:%v invalid_admin_setting=管理員帳號設定無效:%v invalid_log_root_path=日誌根目錄設定無效:%v default_keep_email_private=預設隱藏電子信箱 -default_keep_email_private_popup=預設隱藏新使用者的電子信箱。 +default_keep_email_private_popup=預設隱藏新使用者帳號的電子信箱。 default_allow_create_organization=預設允許建立組織 -default_allow_create_organization_popup=預設允許新使用者建立組織。 +default_allow_create_organization_popup=預設允許新使用者帳號建立組織。 default_enable_timetracking=預設啟用時間追蹤 default_enable_timetracking_popup=預設啟用新存儲庫的時間追蹤。 no_reply_address=隱藏電子信箱域名 @@ -326,13 +326,13 @@ env_config_keys_prompt = 以下的環境變數也會被套用於您的設定檔 env_config_keys = 環境設定 smtp_from_invalid = 郵件寄件人的地址無效 config_location_hint = 這些設定將被儲存在: -allow_dots_in_usernames = 允許使用者在使用者名稱中使用英文句點。不影響現有帳戶。 +allow_dots_in_usernames = 允許使用者在使用者名稱中使用英文句點。不影響既有帳號。 enable_update_checker_helper_forgejo = 透過檢查 release.forgejo.org 的 DNS TXT 記錄來定期檢查新的 Forgejo 版本。 [home] uname_holder=帳號或電子信箱 password_holder=密碼 -switch_dashboard_context=切換資訊主頁帳戶 +switch_dashboard_context=切換資訊主頁帳號 my_repos=儲存庫 show_more_repos=顯示更多儲存庫… collaborative_repos=參與協作的儲存庫 @@ -374,73 +374,73 @@ org_no_results=沒有找到符合的組織。 code_no_results=找不到符合您關鍵字的原始碼。 code_search_results=「%s」的搜尋結果 code_last_indexed_at=最後索引 %s -relevant_repositories_tooltip=已隱藏缺少主題、圖示、說明、Fork 的儲存庫。 +relevant_repositories_tooltip=已隱藏缺少主題、圖示、說明、或是是分叉的儲存庫。 relevant_repositories=只顯示相關的儲存庫,顯示未篩選的結果。 stars_few = %d 顆星星 stars_one = %d 顆星星 -forks_one = %d 個 fork -forks_few = %d 個 fork +forks_one = %d 個分叉 +forks_few = %d 個分叉 go_to = 前往 [auth] -create_new_account=註冊帳戶 -register_helper_msg=已經有帳戶了?立即登入! -social_register_helper_msg=已經有帳戶了?立即連結! +create_new_account=註冊帳號 +register_helper_msg=已經有帳號了?馬上登入! +social_register_helper_msg=已經有帳號了?馬上連結! disable_register_prompt=註冊功能已停用。 請聯繫您的網站管理員。 disable_register_mail=已停用註冊確認電子郵件。 manual_activation_only=請聯絡您的網站管理員以完成啟用程序。 -remember_me=記得這個裝置 +remember_me=記住這台裝置 forgot_password_title=忘記密碼 forgot_password=忘記密碼? -sign_up_now=還沒有帳戶?馬上註冊。 -confirmation_mail_sent_prompt=新的確認信已發送至 %s。請在 %s內檢查您的收件匣並完成註冊作業。 +sign_up_now=還沒有帳號?馬上註冊。 +confirmation_mail_sent_prompt=已寄送新的確認信至 %s。請在 %s 內檢查您的收件匣並完成註冊手續。如果該 email 不正確,您可以在登入後再請求一封新的確認信到另一個地址。 must_change_password=更新您的密碼 -allow_password_change=要求使用者更改密碼 (推薦) -reset_password_mail_sent_prompt=確認信已發送至 %s。請在 %s內檢查您的收件匣並完成帳戶救援作業。 -active_your_account=啟用您的帳戶 -account_activated=帳戶已啟用 -prohibit_login=禁止登入 -resent_limit_prompt=抱歉,您請求發送驗證電子郵件太過頻繁,請等待 3 分鐘後再試一次。 -has_unconfirmed_mail=%s 您好,您有一封發送至( %s) 但未被確認的郵件。如果您未收到啟用郵件,或需要重新發送,請單擊下方的按鈕。 -resend_mail=單擊此處重新發送確認郵件 -email_not_associate=此電子信箱未與任何帳戶連結。 -send_reset_mail=發送帳戶救援信 -reset_password=帳戶救援 +allow_password_change=要求使用者更改密碼(建議) +reset_password_mail_sent_prompt=已發送確認信至 %s。請在 %s 內檢查您的收件匣並完成帳號復原手續。 +active_your_account=啟用您的帳號 +account_activated=帳號已啟用 +prohibit_login=已被禁止登入 +resent_limit_prompt=您剛剛已經請求發送驗證電子郵件,請等待 3 分鐘後再試一次。 +has_unconfirmed_mail=%s 您好,您有一個尚未被確認的信箱地址(%s)。如果您還沒收到確認信或需要一封新的,請點擊下方的按鈕。 +resend_mail=點擊此處來重新發送確認郵件 +email_not_associate=此電子信箱未與任何帳號連結。 +send_reset_mail=發送帳號復原信 +reset_password=帳號復原 invalid_code=您的確認代碼無效或已過期。 -invalid_password=您的密碼和用來建立帳戶的不符。 -reset_password_helper=帳戶救援 -password_too_short=密碼長度不能少於 %d 個字。 -non_local_account=非本地帳戶無法透過 Forgejo 的網頁介面更改密碼。 +invalid_password=您的密碼和用來建立帳號的不符。 +reset_password_helper=帳號復原 +password_too_short=密碼長度不能少於 %d 個英數字母。 +non_local_account=非本地帳號無法透過 Forgejo 的網頁介面更改其密碼。 verify=驗證 scratch_code=備用驗證碼 use_scratch_code=使用備用驗證碼 -twofa_scratch_used=您已經用掉了備用驗證碼。您已被轉址到兩步驟驗證設定頁面以便移除您的註冊設備或重新產生新的備用驗證碼。 +twofa_scratch_used=您已經用掉了您的備用驗證碼。您已被轉址到兩步驟驗證設定頁面以便移除您的註冊設備或重新產生新的備用驗證碼。 twofa_passcode_incorrect=您的驗證碼不正確。如果您遺失設備,請使用您的備用驗證碼登入。 twofa_scratch_token_incorrect=您的備用驗證碼不正確。 login_userpass=登入 tab_openid=OpenID -oauth_signup_tab=註冊新帳戶 -oauth_signup_title=完成新帳戶 -oauth_signup_submit=完成帳戶 -oauth_signin_tab=連結到現有帳戶 -oauth_signin_title=登入以授權連結帳戶 -oauth_signin_submit=連結帳戶 +oauth_signup_tab=註冊新帳號 +oauth_signup_title=完成新帳號 +oauth_signup_submit=完成帳號 +oauth_signin_tab=連結至既有帳號 +oauth_signin_title=登入以授權連結帳號 +oauth_signin_submit=連結帳號 oauth.signin.error=處理授權請求時發生錯誤。如果這個問題持續發生,請聯絡網站管理員。 oauth.signin.error.access_denied=授權請求被拒絕。 oauth.signin.error.temporarily_unavailable=授權失敗,因為認證伺服器暫時無法使用。請稍後再試。 openid_connect_submit=連接 -openid_connect_title=連接到現有帳戶 -openid_connect_desc=所選的 OpenID URI 未知。在這裡連結一個新帳戶。 -openid_register_title=建立新帳戶 -openid_register_desc=所選的 OpenID URI 未知。在這裡連結一個新帳戶。 -disable_forgot_password_mail=由於未設定電子郵件功能,帳戶救援功能已被停用。請與網站管理員聯絡。 -disable_forgot_password_mail_admin=帳戶救援功能需要設定電子郵件功能才能使用。請設定電子郵件功能以啟用帳戶救援功能。 +openid_connect_title=連接至既有帳號 +openid_connect_desc=所選的 OpenID URI 未知。在這裡連結一個新帳號。 +openid_register_title=建立新帳號 +openid_register_desc=所選的 OpenID URI 是未知的。在這裡連結一個新帳號。 +disable_forgot_password_mail=由於未設定電子郵件功能,帳號復原功能已被停用。請與網站管理員聯絡。 +disable_forgot_password_mail_admin=帳號復原功能需要設定電子郵件功能才能使用。請設定電子郵件功能以啟用帳號復原。 email_domain_blacklisted=您無法使用您的電子信箱註冊帳號。 authorize_application=授權應用程式 authorize_redirect_notice=如果您授權此應用程式,您將會被重新導向至 %s。 authorize_application_created_by=此應用程式是由 %s 建立的。 -authorize_application_description=如果您允許,它將能夠讀取和修改您的所有帳戶資訊,包括私有儲存庫和組織。 -authorize_title=授權「%s」存取您的帳戶? +authorize_application_description=如果您允許,它將能夠讀取和修改您的所有帳號資訊,包括私有儲存庫和組織。 +authorize_title=授權「%s」存取您的帳號? authorization_failed=授權失效 sspi_auth_failed=SSPI 認證失敗 password_pwned_err=無法完成對 HaveIBeenPwned 的請求 @@ -452,7 +452,7 @@ tab_signup = 註冊 last_admin = 您無法刪除最後一個管理員。必須至少有一個管理員。 prohibit_login_desc = 您的帳號被禁止登入,請連絡網站管理員。 sign_up_successful = 已成功建立帳號。歡迎! -invalid_code_forgot_password = 您的確認代碼無效或是已過期。點擊這裡來開始一個新的 session。 +invalid_code_forgot_password = 您的確認代碼無效或已過期。點擊這裡來開始一個新的連線階段。 reset_password_wrong_user = 您以 %s 登入,但是帳號復原連結是給 %s 的 password_pwned = 該密碼出現在先前資料洩露的被盜密碼清單中。請用一個不同的密碼再試一次,並考慮在其他地方也更換此密碼。 authorization_failed_desc = 因為偵測到無效請求,授權失敗。請連絡您嘗試授權的應用的維護者。 @@ -465,23 +465,23 @@ reply=或是直接回覆此電子郵件 link_not_working_do_paste=無法開啟?試試複製超連結到瀏覽器貼上。 hi_user_x=%s 您好, -activate_account=請啟用您的帳戶 +activate_account=請啟用您的帳號 activate_account.title=%s,請啟用您的帳戶 activate_account.text_1=%[1]s 您好,感謝您註冊 %[2]s! -activate_account.text_2=請在 %s內點擊下列連結以啟用您的帳戶: +activate_account.text_2=請在%s內點擊下列連結以啟用您的帳號: activate_email=請驗證您的電子信箱 -activate_email.text=請在 %s內點擊下列連結以驗證您的電子信箱: +activate_email.text=請在%s內點擊下列連結以驗證您的電子信箱: register_notify=歡迎來到 Forgejo register_notify.title=%[1]s,歡迎來到 %[2]s register_notify.text_1=這是您在 %s 的註冊確認信! -register_notify.text_2=您現在可以用帳號 %s 登入。 +register_notify.text_2=您現在可以使用您的使用者名稱登入:%s register_notify.text_3=如果其他人為您建立了此帳號,請先設定您的密碼。 -reset_password=救援您的帳戶 +reset_password=復原您的帳號 reset_password.title=%s,我們收到了您的帳號恢復請求 -reset_password.text=如果是您做出的請求,請在 %s內點擊下列連結以救援您的帳戶: +reset_password.text=如果是您做出的請求,請在%s 內點擊下列連結以復原您的帳號: register_success=註冊成功 @@ -520,7 +520,7 @@ repo.collaborator.added.subject=%s 把您加入到 %s repo.collaborator.added.text=您已被新增為儲存庫的協作者: team_invite.subject=%[1]s 邀請您加入組織 %[2]s -team_invite.text_1=%[1]s 邀請您加入組織 %[3]s 中的 %[2]s 團隊 +team_invite.text_1=%[1]s 邀請您加入組織 %[3]s 中的 %[2]s 團隊。 team_invite.text_2=請點擊下方連結加入團隊: team_invite.text_3=備註: 這是寄給 %[1]s 的邀請。若您未預期收到此邀請,請忽略此郵件。 activate_email.title = %s,請驗證你的信箱地址 @@ -568,8 +568,8 @@ max_size_error=` 長度最大為 %s 個字元。` email_error=` 是無效的電子信箱。` url_error=`「%s」是無效的 URL。` include_error=` 必須包含子字串「%s」。` -glob_pattern_error=` glob 比對模式無效:%s.` -regex_pattern_error=` 正規表示式模式無效:%s.` +glob_pattern_error=` glob 比對式樣無效:%s.` +regex_pattern_error=` 正規表示式式樣無效:%s.` username_error=`只能包含英文字母數字 ('0-9'、'a-z'、'A-Z')、破折號 ('-')、底線 ('_')、句點 ('.'),不能以非英文字母數字開頭或結尾,也不允許連續的非英文字母數字。` invalid_group_team_map_error=` 對應無效:%s` unknown_error=未知錯誤: @@ -601,11 +601,11 @@ password_digit_one=至少要有一個數字 password_special_one=至少要有一個特殊字元(標點符號,括號,引號等) enterred_invalid_repo_name=您輸入的儲存庫名稱不正確。 enterred_invalid_org_name=您輸入的組織名稱不正確。 -enterred_invalid_owner_name=新的擁有者名稱無效。 +enterred_invalid_owner_name=新的所有者名稱無效。 enterred_invalid_password=您輸入的密碼不正確。 user_not_exist=該用戶名不存在。 team_not_exist=團隊不存在。 -last_org_owner=你不能從「所有者」團隊中刪除最後一個使用者。每個組織中至少要有一個擁有者。 +last_org_owner=你不能從「所有者」團隊中刪除最後一個使用者。每個組織中至少要有一個所有者。 cannot_add_org_to_team=組織不能被新增為團隊成員。 duplicate_invite_to_team=該使用者已經被邀請為團隊成員。 organization_leave_success=您已成功離開組織 %s。 @@ -617,15 +617,15 @@ must_use_public_key=您提供的金鑰是私有金鑰,請勿上傳您的私有 unable_verify_ssh_key=無法驗證 SSH 金鑰,請再次檢查是否有錯誤。 auth_failed=授權認證失敗:%v -still_own_repo=您的帳戶擁有一個以上的儲存庫,請先刪除或轉移它們。 -still_has_org=您的帳戶是一個或多個組織的成員,請先離開它們。 -still_own_packages=您的帳戶擁有一個以上的套件,請先刪除它們。 +still_own_repo=您的帳號擁有至少一個儲存庫,請先刪除或轉移它們。 +still_has_org=您的帳號是至少一個組織的成員,請先離開它們。 +still_own_packages=您的帳號擁有至少一個軟體包,請先刪除它們。 org_still_own_repo=此組織仍然擁有一個以上的儲存庫,請先刪除或轉移它們。 -org_still_own_packages=此組織仍然擁有一個以上的套件,請先刪除它們。 +org_still_own_packages=此組織仍然擁有至少一個軟體包,請先刪除它們。 target_branch_not_exist=目標分支不存在。 unset_password = 此使用者尚未設置密碼。 -unsupported_login_type = 該帳號的登入方式使它無法被刪除。 +unsupported_login_type = 該帳號的登入類型使它無法被刪除。 To = 分支名稱 FullName = 全名 Description = 說明 @@ -654,12 +654,12 @@ following_few=%d 追蹤中 follow=追蹤 unfollow=取消追蹤 user_bio=個人簡介 -disabled_public_activity=這個使用者已對外隱藏動態。 -email_visibility.limited=所有已驗證的使用者都可以看到您的電子信箱地址 +disabled_public_activity=這個使用者已隱藏公開動態。 +email_visibility.limited=所有已驗證身分的使用者都可以看到您的電子信箱地址 email_visibility.private=只有您和系統管理員可以看到您的電子信箱地址 form.name_reserved=「%s」是保留的帳號。 -form.name_pattern_not_allowed=帳號不可包含字元「%s」。 +form.name_pattern_not_allowed=帳號名稱內不可包含「%s」式樣。 form.name_chars_not_allowed=使用者名稱「%s」包含無效字元。 joined_on = 在 %s 註冊 show_on_map = 在地圖上顯示這個地點 @@ -677,19 +677,19 @@ block_user.detail = 請注意,封鎖此使用者將會導致以下結果。例 [settings] profile=個人資料 -account=帳戶 +account=帳號 appearance=外觀 password=修改密碼 security=安全性 avatar=大頭貼 ssh_gpg_keys=SSH / GPG 金鑰 -social=社群帳戶 +social=社群帳號 applications=應用程式 -orgs=管理組織 +orgs=組織 repos=儲存庫 -delete=刪除帳戶 +delete=刪除帳號 twofa=兩步驟驗證 (TOTP) -account_link=已連結帳號 +account_link=連結的帳號 organization=組織 webauthn=兩步驟驗證(安全金鑰) @@ -726,10 +726,10 @@ comment_type_group_project=專案 comment_type_group_issue_ref=問題參考 saved_successfully=您的設定已成功儲存。 privacy=隱私 -keep_activity_private_popup=讓動態只有你和管理員看得到 +keep_activity_private_popup=讓動態只有你和站點管理員看得到 lookup_avatar_by_mail=以電子信箱查詢大頭貼 -federated_avatar_lookup=Federated 大頭貼查詢 +federated_avatar_lookup=聯邦式大頭貼查詢 enable_custom_avatar=使用自訂大頭貼 choose_new_avatar=選擇新的大頭貼 update_avatar=更新大頭貼 @@ -744,27 +744,27 @@ new_password=新的密碼 retype_new_password=確認新密碼 password_incorrect=輸入的密碼不正確。 change_password_success=您的密碼已更新。 從現在起使用您的新密碼登入。 -password_change_disabled=非本地帳戶無法透過 Forgejo 的網頁介面更改密碼。 +password_change_disabled=非本地帳號無法透過 Forgejo 的網頁介面更改密碼。 emails=電子信箱 manage_emails=管理電子信箱 -manage_themes=選擇預設佈景主題 -manage_openid=管理 OpenID 地址 +manage_themes=預設佈景主題 +manage_openid=OpenID 地址 theme_desc=這將是您在整個網站上的預設佈景主題。 primary=主要 activated=已啟用 requires_activation=需要啟動 primary_email=設為主要 -activate_email=寄出啟用信 +activate_email=寄送啟用信 activations_pending=等待啟用中 delete_email=移除 email_deletion=移除電子信箱 -email_deletion_desc=電子信箱和相關資訊將從您的帳戶中刪除,由此電子信箱所提交的 Git 將保持不變,是否繼續? +email_deletion_desc=您的帳號中的電子信箱和相關資訊將被刪除,使用此電子信箱的 Git 提交將保持不變。要繼續嗎? email_deletion_success=該電子信箱已被刪除。 theme_update_success=已更新佈景主題。 theme_update_error=選取的佈景主題不存在。 openid_deletion=移除 OpenID 位址 -openid_deletion_desc=從您的帳戶刪除此 OpenID 位址將會無法使用它進行登入。是否繼續? +openid_deletion_desc=從您的帳號刪除此 OpenID 位址後,您將會無法透過它登入。要繼續嗎? openid_deletion_success=該 OpenID 已被刪除。 add_new_email=新增電子信箱 add_new_openid=新增 OpenID URI @@ -780,9 +780,9 @@ manage_ssh_keys=管理 SSH 金鑰 manage_ssh_principals=管理 SSH 認證主體 manage_gpg_keys=管理 GPG 金鑰 add_key=新增金鑰 -ssh_desc=這些 SSH 公鑰已連結至您的帳戶。持有相對應的私鑰將擁有完全控制你的儲存庫的權限。可以使用已驗證的 SSH 金鑰校驗 SSH 簽署的提交。 -principal_desc=這些 SSH 認證主體已關聯到您的帳戶並擁有完全存取您的儲存庫的權限。 -gpg_desc=這些 GPG 公鑰已經連結到您的帳戶,並被用於校驗您的提交。因為它們能用您的身分簽署提交,請妥善保管您的私鑰。 +ssh_desc=這些 SSH 公鑰已連結至您的帳號。持有相對應的私鑰將擁有完全控制你的儲存庫的權限。可以使用已驗證的 SSH 金鑰校驗 SSH 簽署的提交。 +principal_desc=這些 SSH 認證主體已連結至您的帳號並擁有完全存取您儲存庫的權限。 +gpg_desc=這些 GPG 公鑰已經連結到您的帳號,並被用於校驗您的提交。因為它們能用您的身分簽署提交,請妥善保管您的私鑰。 ssh_helper=需要協助嗎?建議可看看 GitHub 的文件以建立您的 SSH 金鑰或解決您使用 SSH 時碰到的常見問題。 gpg_helper=需要協助嗎?建議可看看 GitHub 的 about GPG 文件。 add_new_key=新增 SSH 金鑰 @@ -791,10 +791,10 @@ key_content_ssh_placeholder=以 「ssh-ed25519」、「ssh-rsa」、「ecdsa-sha key_content_gpg_placeholder=以 「-----BEGIN PGP PUBLIC KEY BLOCK-----」 開頭 add_new_principal=新增主體 ssh_key_been_used=此 SSH 金鑰早已加入本伺服器。 -ssh_key_name_used=已有相同名稱的 SSH 金鑰存在於您的帳戶。 +ssh_key_name_used=您的帳號已有相同名稱的 SSH 金鑰。 ssh_principal_been_used=此主體早已加入本伺服器。 gpg_key_id_used=已存在具有相同 ID 的 GPG 金鑰。 -gpg_no_key_email_found=此 GPG 金鑰不符合任何已關聯到您帳戶且已啟用的電子信箱。若您簽署該符記,您仍然可以新增它。 +gpg_no_key_email_found=此 GPG 金鑰不符合任何已連結至您帳號之已啟用的電子信箱。若您簽署該符記,您仍然可以新增它。 gpg_key_matched_identities=符合的身分: gpg_key_matched_identities_long=此金鑰中嵌入的身分符合此使用者已啟用的電子信箱。此金鑰可用來驗證符合此信箱的提交。 gpg_key_verified=已驗證的金鑰 @@ -830,9 +830,9 @@ delete_key=移除 ssh_key_deletion=移除 SSH 金鑰 gpg_key_deletion=移除 GPG 金鑰 ssh_principal_deletion=移除 SSH 認證主體 -ssh_key_deletion_desc=刪除 SSH 金鑰將撤銷其對您帳戶的存取權限。是否繼續? +ssh_key_deletion_desc=刪除 SSH 金鑰將撤銷其對您帳號的存取權限。要繼續嗎? gpg_key_deletion_desc=刪除 GPG 金鑰將取消驗證由其簽署的提交。是否繼續? -ssh_principal_deletion_desc=移除 SSH 認證主體將撤銷其對您帳戶的存取權限。是否繼續? +ssh_principal_deletion_desc=移除 SSH 認證主體將撤銷其對您帳號的存取權限。要繼續嗎? ssh_key_deletion_success=SSH 金鑰已被移除。 gpg_key_deletion_success=GPG 金鑰已被移除。 ssh_principal_deletion_success=已移除主體。 @@ -848,12 +848,12 @@ show_openid=在個人資料顯示 hide_openid=從個人資料隱藏 ssh_disabled=已停用 SSH ssh_externally_managed=此 SSH 金鑰由此使用者的外部服務所管理 -manage_social=管理關聯的社群帳戶 +manage_social=管理與其連結的社群帳號 unbind=解除連結 manage_access_token=管理存取符記 generate_new_token=產生新的符記 -tokens_desc=這些符記透過 Forgejo API 獲得存取您帳戶的權限。 +tokens_desc=這些符記透過 Forgejo API 獲得存取您帳號的權限。 token_name=符記名稱 generate_token=產生符記 generate_token_success=已經產生新的符記。請立刻複製它,因為它將不會被再次顯示。 @@ -862,14 +862,14 @@ delete_token=刪除 access_token_deletion=刪除存取符記 access_token_deletion_cancel_action=取消 access_token_deletion_confirm_action=刪除 -access_token_deletion_desc=刪除符記後,使用此符記的應用程式將無法再存取您的帳戶。您將無法取消此操作。要繼續嗎? -delete_token_success=已刪除符記。使用此符記的應用程式無法再存取您的帳戶。 +access_token_deletion_desc=刪除符記後,使用此符記的應用程式將無法再存取您的帳號。您將無法取消此操作。要繼續嗎? +delete_token_success=已刪除符記。使用此符記的應用程式無法再存取您的帳號。 permission_no_access=沒有存取權 permission_read=讀取 manage_oauth2_applications=管理 OAuth2 應用程式 edit_oauth2_application=編輯 OAuth2 應用程式 -oauth2_applications_desc=OAuth2 應用程式讓您的第三方應用程式安全地驗證此 Forgejo 中的使用者。 +oauth2_applications_desc=OAuth2 應用程式讓您的第三方應用程式安全地驗證此 Forgejo 站點中的使用者。 remove_oauth2_application=刪除 OAuth2 應用程式 remove_oauth2_application_desc=刪除 OAuth2 應用程式將會撤銷所有已簽署的存取符記之存取權。是否繼續? remove_oauth2_application_success=已刪除應用程式。 @@ -883,28 +883,28 @@ oauth2_client_secret=客戶端密鑰 oauth2_regenerate_secret=重新產生密鑰 oauth2_regenerate_secret_hint=遺失您的密鑰? oauth2_application_edit=編輯 -oauth2_application_create_description=OAuth2 應用程式讓您的第三方應用程式可以存取此 Forgejo 上的帳戶。 +oauth2_application_create_description=OAuth2 應用程式讓您的第三方應用程式可以存取此 Forgejo 站點上的帳號。 authorized_oauth2_applications=已授權的 OAuth2 應用程式 revoke_key=撤銷 revoke_oauth2_grant=撤銷存取權 revoke_oauth2_grant_description=撤銷此第三方應用程式的存取權,此應用程式就無法再存取您的資料?您確定嗎? -twofa_desc=兩步驟驗證可以增強您的帳戶安全性。 -twofa_is_enrolled=您的帳戶已經啟用兩步驟驗證。 -twofa_not_enrolled=您的帳戶目前尚未啟用兩步驟驗證。 +twofa_desc=兩步驟驗證可以增強您帳號的安全性。 +twofa_is_enrolled=已為您的帳號啟用兩步驟驗證。 +twofa_not_enrolled=您的帳號目前尚未啟用兩步驟驗證。 twofa_disable=停用兩步驟驗證 -twofa_scratch_token_regenerate=重新產生備用驗證碼 +twofa_scratch_token_regenerate=重新產生一次性復原金鑰 twofa_enroll=啟用兩步驟驗證 twofa_disable_note=如有需要,您可以停用兩步驟驗證。 -twofa_disable_desc=關閉兩步驟驗證會使您的帳戶安全性降低,是否繼續? +twofa_disable_desc=關閉兩步驟驗證會低使您帳號的安全性,要繼續嗎? regenerate_scratch_token_desc=如果您遺失了備用驗證碼或已經使用它登入,您可以在此重新設定。 twofa_disabled=兩步驟驗證已經被關閉。 scan_this_image=使用您的授權應用程式來掃瞄圖片: or_enter_secret=或者輸入密碼: %s then_enter_passcode=然後輸入應用程式中顯示的驗證碼: passcode_invalid=無效的驗證碼,請重試。 -twofa_enrolled=您的帳戶已經啟用了兩步驟驗證。請將備用驗證碼 (%s) 保存到安全的地方,它只會被顯示一次。 +twofa_enrolled=您的帳號已經啟用了兩步驟驗證。請將備用驗證碼(%s)保存到安全的地方,它只會被顯示一次。 twofa_failed_get_secret=取得密鑰 (Secret) 失敗。 webauthn_desc=安全金鑰是包含加密密鑰的硬體設備,它們可以用於兩步驟驗證。安全金鑰必須支援 WebAuthn Authenticator 標準。 @@ -913,35 +913,35 @@ webauthn_nickname=暱稱 webauthn_delete_key=移除安全金鑰 webauthn_delete_key_desc=如果您移除安全金鑰,將不能再使用它登入。是否繼續? -manage_account_links=管理已連結的帳戶 -manage_account_links_desc=這些外部帳戶已連結到您的 Forgejo 帳戶。 -account_links_not_available=目前沒有外部帳戶連結到您的 Forgejo 帳戶。 -link_account=連結帳戶 -remove_account_link=刪除已連結的帳戶 -remove_account_link_desc=刪除連結帳戶將撤銷其對 Forgejo 帳戶的存取權限。是否繼續? -remove_account_link_success=已移除連結的帳戶。 +manage_account_links=連結的帳號 +manage_account_links_desc=這些外部帳號已連結至您的 Forgejo 帳號。 +account_links_not_available=目前沒有外部帳號連結到您的 Forgejo 帳號。 +link_account=連結帳號 +remove_account_link=刪除連結的帳號 +remove_account_link_desc=移除連結帳號將撤銷其對 Forgejo 帳號的存取權限。是否繼續? +remove_account_link_success=已移除連結的帳號。 orgs_none=您尚未成為任一組織的成員。 -delete_account=刪除您的帳戶 -delete_prompt=此動作將永久刪除您的使用者帳戶,而且無法復原。 -delete_with_all_comments=因為您的帳戶年齡小於 %s,為了避免幽靈留言,所有問題及合併請求的留言都會隨帳戶一同被刪除。 -confirm_delete_account=確認刪除帳戶 -delete_account_title=刪除使用者帳戶 -delete_account_desc=您確定要永久刪除此帳戶嗎? +delete_account=刪除您的帳號 +delete_prompt=此動作將永久刪除您的使用者帳號,而且無法復原。 +delete_with_all_comments=因為您的帳號年齡小於 %s,為了避免幽靈留言,所有問題及合併請求的留言都會隨帳號一同被刪除。 +confirm_delete_account=確認刪除 +delete_account_title=刪除使用者帳號 +delete_account_desc=您確定要永久刪除此帳號嗎? -email_notifications.enable=啟用郵件通知 -email_notifications.onmention=只在被提到時傳送郵件通知 -email_notifications.disable=關閉郵件通知 -email_notifications.submit=套用郵件偏好設定 +email_notifications.enable=啟用電子郵件通知 +email_notifications.onmention=只在被提及時傳送電子郵件通知 +email_notifications.disable=關閉電子郵件通知 +email_notifications.submit=套用電子郵件偏好設定 email_notifications.andyourown=和您自己的通知 visibility=使用者瀏覽權限 visibility.public=公開 visibility.public_tooltip=所有人都可以看到 visibility.limited=受限 -visibility.private=私人 +visibility.private=私有 blocked_users_none = 您沒有封鎖任何使用者 。 blocked_users = 封鎖的使用者 hints = 提示 @@ -969,11 +969,11 @@ valid_until_date = 至 %s 有效 social_desc = 這些社群帳號可以被用來登入您的帳號。請確保您認得每一個。 unbind_success = 已成功移除該社群帳號。 create_oauth2_application_success = 您已成功建立一個新的 OAuth2 應用程式。 -change_username_prompt = 註:更新您的使用者名稱將改變您的帳號 URL。 +change_username_prompt = 註:更改您的使用者名稱也會更改您的帳號 URL。 change_username_redirect_prompt = 舊的使用者名稱在其他使用者認領之前將會轉址到新的使用者名稱。 visibility.limited_tooltip = 只有已登入的使用者能看見 visibility.private_tooltip = 只有您加入的組織之成員能看見 -keep_email_private_popup = 這將在您的個人資料頁面、合併請求或網頁檔案編輯器中隱藏您的電子信箱地址。已推送的提交不會被更改。在提交中使用 %s 來將其連結至您的帳戶。 +keep_email_private_popup = 這將在您的個人資料頁面、合併請求或網頁檔案編輯器中隱藏您的電子信箱地址。已推送的提交不會被修改。在提交中使用 %s 來將其連結至您的帳號。 ssh_signonly = 因為目前 SSH 已被停用,這個金鑰只被用來校驗提交簽署。 email_desc = 您的主要電子信箱將被用於通知、密碼復原、網頁 Git 操作(如果您的信箱不是隱藏的)。 pronouns_custom = 自訂 @@ -984,9 +984,22 @@ pronouns = 代名詞 update_oauth2_application_success = 您已成功更新該 OAuth2 應用程式。 oauth2_redirect_uris = 轉址 URI。每個 URI 應各佔一行。 pronouns_unspecified = 未指定 +repos_none = 您沒有任何儲存庫。 +hooks.desc = 新增會被您所有儲存庫觸發的 Webhook。 +blocked_since = 自 %s 封鎖 +language.title = 預設語言 +revoke_oauth2_grant_success = 已成功撒銷存取權。 +oauth2_application_remove_description = 移除 OAuth2 應用程式將會使其無法存取此站點上已授權的帳號。要繼續嗎? +additional_repo_units_hint = 建議啟用額外的儲存庫功能 +twofa_recovery_tip = 如果您弄丟了您的裝置,您可以使用一次性復原金鑰來重新存取您的帳號。 +twofa_scratch_token_regenerated = 您的一次性復原金鑰是:%s。它不會再次被顯示,請將其保存在一個安全的地方。 +webauthn_key_loss_warning = 如果您弄丟了您的安全金鑰,您將無法存取您的帳號。 +user_unblock_success = 已成功解除對此使用者的封鎖。 +webauthn_alternative_tip = 您可能想新增一個額外的驗證方法。 +user_block_success = 已成功封鎖此使用者。 [repo] -owner=擁有者 +owner=所有者 owner_helper=組織可能因為儲存庫數量上限而未列入此選單。 repo_name=儲存庫名稱 repo_name_helper=好的儲存庫名稱通常是簡短的、好記的、且獨特的。 @@ -996,15 +1009,15 @@ template_select=選擇範本。 template_helper=將儲存庫設為範本 template_description=儲存庫範本讓使用者可新增相同目錄結構、檔案以及設定的儲存庫。 visibility=瀏覽權限 -visibility_description=只有組織擁有者或有權限的組織成員才能看到。 -visibility_helper_forced=您的網站管理員強制新的存儲庫必需設定為私有。 -visibility_fork_helper=(修改本值將會影響所有 fork 儲存庫的能見度) +visibility_description=只有組織所有者或有權限的組織成員才能看到。 +visibility_helper_forced=您的網站管理員迫使新的存儲庫必需設定為私有。 +visibility_fork_helper=(修改本值將會影響所有分叉儲存庫的瀏覽權限) clone_helper=需要有關 Clone 的協助嗎?查看幫助 。 -fork_repo=Fork 儲存庫 -fork_from=Fork 自 -already_forked=您已經 fork 過 %s -fork_to_different_account=Fork 到其他帳戶 -fork_visibility_helper=無法更改 fork 儲存庫的瀏覽權限。 +fork_repo=分叉儲存庫 +fork_from=分叉自 +already_forked=您已經分叉過 %s +fork_to_different_account=分叉至其他帳號 +fork_visibility_helper=無法更改分叉儲存庫的瀏覽權限。 use_template=使用此範本 clone_in_vsc=在 VS Code 中 Clone download_zip=下載 ZIP @@ -1018,7 +1031,7 @@ repo_lang=儲存庫語言 repo_gitignore_helper=選擇 .gitignore 範本。 repo_gitignore_helper_desc=從常見語言範本清單中挑選忽略追蹤的檔案。預設情況下各種語言建置工具產生的特殊檔案都包含在 .gitignore 中。 issue_labels=問題標籤 -issue_labels_helper=選擇問題標籤集 +issue_labels_helper=選擇問題標籤集。 license=授權條款 license_helper=請選擇授權條款檔案。 license_helper_desc=授權條款定義了他人使用您原始碼的允許和禁止事項。不確定哪個適用於您的專案?查看選擇授權條款。 @@ -1051,7 +1064,7 @@ mirror_password_blank_placeholder=(未設定) mirror_password_help=修改帳號以清除已儲存的密碼。 watchers=關注者 stargazers=占星術師 -forks=Fork +forks=分叉 reactions_more=和其他 %d 個 unit_disabled=網站管理員已經停用這個儲存庫區域。 language_other=其他 @@ -1093,8 +1106,8 @@ template.invalid=必須選擇一個儲存庫範本 archive.issue.nocomment=此存儲庫已封存,您不能在問題上留言。 archive.pull.nocomment=此存儲庫已封存,您不能在合併請求上留言。 -form.reach_limit_of_creation_1=您已經達到了您儲存庫的數量上限 (%d 個)。 -form.reach_limit_of_creation_n=您已經達到了您儲存庫的數量上限 (%d 個)。 +form.reach_limit_of_creation_1=您已經達到了您儲存庫的數量上限(%d 個)。 +form.reach_limit_of_creation_n=您已經達到了您儲存庫的數量上限(%d 個)。 form.name_reserved=「%s」是保留的儲存庫名稱。 need_auth=授權 @@ -1116,10 +1129,10 @@ migrate_items_releases=版本發布 migrate_repo=遷移儲存庫 migrate.clone_address=從 URL 遷移 / Clone migrate.clone_address_desc=現有儲存庫的 HTTP(S) 或 Git 「clone」 URL -migrate.github_token_desc=由於 GitHub API 的速率限制,您可在此輸入一個或多個由半形逗號「,」分隔的符記來加快遷移速度。警告:濫用此功能可能會違反該服務提供者的政策並導致帳戶被封鎖。 +migrate.github_token_desc=由於 GitHub API 的速率限制,您可在此輸入一個或多個由半形逗號「,」分隔的符記來加快遷移速度。警告:濫用此功能可能會違反該服務提供者的政策並導致帳號被封鎖。 migrate.clone_local_path=或者是本地端伺服器路徑 migrate.permission_denied=您並沒有導入本地儲存庫的權限。 -migrate.permission_denied_blocked=您無法從未允許的主機匯入,請聯絡管理員檢查以下設定值 ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS +migrate.permission_denied_blocked=您無法從未允許的主機匯入,請聯絡管理員檢查以下設定值 ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS。 migrate.invalid_local_path=無效的本地路徑。它不存在或不是一個資料夾。 migrate.invalid_lfs_endpoint=該 LFS 端點無效。 migrate.failed=遷移失敗:%v @@ -1132,12 +1145,12 @@ migrate.migrating_failed=從 %s 遷移失敗。 migrate.migrating_failed_no_addr=遷移失敗。 migrate.github.description=從 github.com 或 GitHub Enterprise 伺服器遷移資料。 migrate.git.description=從任何 Git 服務遷移儲存庫。 -migrate.gitlab.description=從 gitlab.com 或其他 GitLab 執行個體遷移資料。 -migrate.gitea.description=從 gitea.com 或其他 Gitea/Forgejo 執行個體遷移資料。 -migrate.gogs.description=從 notabug.org 或其他 Gogs 執行個體遷移資料。 -migrate.onedev.description=從 code.onedev.io 或其他 OneDev 執行個體遷移資料。 +migrate.gitlab.description=從 gitlab.com 或其他 GitLab 站點遷移資料。 +migrate.gitea.description=從 gitea.com 或其他 Gitea 站點遷移資料。 +migrate.gogs.description=從 notabug.org 或其他 Gogs 站點遷移資料。 +migrate.onedev.description=從 code.onedev.io 或其他 OneDev 站點遷移資料。 migrate.codebase.description=從 codebasehq.com 遷移資料。 -migrate.gitbucket.description=從 GitBucket 執行個體遷移資料。 +migrate.gitbucket.description=從 GitBucket 站點遷移資料。 migrate.migrating_git=正在遷移 Git 資料 migrate.migrating_topics=正在遷移主題 migrate.migrating_milestones=正在遷移里程碑 @@ -1147,10 +1160,10 @@ migrate.migrating_issues=正在遷移問題 migrate.migrating_pulls=正在遷移合併請求 mirror_from=鏡像自 -forked_from=fork 自 +forked_from=分叉自 generated_from=產生自 -fork_from_self=您無法 fork 已經擁有的儲存庫。 -fork_guest_user=登入並 fork 這個儲存庫。 +fork_from_self=您無法分叉您擁有的儲存庫。 +fork_guest_user=登入並分叉這個儲存庫。 watch_guest_user=登入以查看此儲存庫。 star_guest_user=登入以為此儲存庫加上星號。 unwatch=取消關注 @@ -1168,7 +1181,7 @@ cite_this_repo=引用此儲存庫 create_new_repo_command=從命令列建立新儲存庫 push_exist_repo=從命令列推送已存在的儲存庫 empty_message=此儲存庫未包含任何內容。 -broken_message=無法讀取此儲存庫底層的 Git 資料。請聯絡此 Forgejo 執行個體的管理員或刪除此儲存庫。 +broken_message=無法讀取此儲存庫中的 Git 資料。請聯絡此 Forgejo 站點的管理員或刪除此儲存庫。 code=程式碼 code.desc=存取原始碼、檔案、提交和分支。 @@ -1200,7 +1213,7 @@ file.title=%s 於 %s file_raw=原始文件 file_history=歷史記錄 file_view_source=檢視原始碼 -file_view_rendered=檢視渲染版本 +file_view_rendered=檢視算繪版本 file_view_raw=查看原始文件 file_permalink=永久連結 file_too_large=檔案太大,無法顯示。 @@ -1238,7 +1251,7 @@ editor.cannot_edit_non_text_files=網站介面不能編輯二進位檔案。 editor.edit_this_file=編輯檔案 editor.this_file_locked=檔案已被鎖定 editor.must_be_on_a_branch=你必須在一個分支或提出對此檔的更改。 -editor.fork_before_edit=如果你想要對這個檔案進行或提出修改,請先 fork 這個儲存庫。 +editor.fork_before_edit=如果你想要對這個檔案進行或提出修改,請先分叉這個儲存庫。 editor.delete_this_file=刪除檔案 editor.must_have_write_access=您必須擁有寫入權限才能對此檔案進行修改或提出變更。 editor.file_delete_success=已刪除文件「%s」。 @@ -1252,11 +1265,11 @@ editor.add_tmpl=新增「」 editor.add=新增 %s editor.update=更新 %s editor.delete=刪除 %s -editor.patch=套用 Patch +editor.patch=套用補丁 editor.patching=正在 Patch: editor.fail_to_apply_patch=無法套用 Patch「%s」 -editor.new_patch=新增 Patch -editor.commit_message_desc=(選用) 加入詳細說明... +editor.new_patch=新增補丁 +editor.commit_message_desc=(選填)加入詳細說明… editor.signoff_desc=在提交訊息底部加入提交者的「Signed-off-by」資訊。 editor.commit_directly_to_this_branch=直接提交到 %s 分支。 editor.create_new_branch=為此提交建立新分支並提出合併請求。 @@ -1269,16 +1282,16 @@ editor.filename_cannot_be_empty=檔案名稱不能為空。 editor.filename_is_invalid=檔名無效:「%s」。 editor.branch_does_not_exist=此儲存庫沒有名為「%s」的分支。 editor.branch_already_exists=此儲存庫已有名為「%s」的分支。 -editor.file_changed_while_editing=檔案內容在您編輯的途中已被變更。按一下此處查看更動的地方或再次提交以覆蓋這些變更。 +editor.file_changed_while_editing=檔案內容在您編輯時已被變更。按一下此處查看被更動的地方或再次提交以覆蓋這些變更。 editor.file_already_exists=此儲存庫已有名為「%s」的檔案。 editor.commit_empty_file_header=提交空白檔案 editor.commit_empty_file_text=你準備提交的檔案是空白的,是否繼續? editor.no_changes_to_show=沒有可以顯示的變更。 editor.fail_to_update_file=更新/建立檔案「%s」失敗。 -editor.fail_to_update_file_summary=錯誤訊息: -editor.push_rejected_no_message=該變更被伺服器拒絕但未提供其他資訊。請檢查 Git Hook。 +editor.fail_to_update_file_summary=錯誤訊息: +editor.push_rejected_no_message=該變更被伺服器拒絕,它未提供其他資訊。請檢查 Git Hook。 editor.push_rejected=該變更被伺服器拒絕。請檢查 Git Hook。 -editor.push_rejected_summary=完整的拒絕訊息: +editor.push_rejected_summary=完整的拒絕訊息: editor.add_subdir=加入目錄… editor.unable_to_upload_files=上傳檔案到「%s」時失敗,錯誤訊息: %v editor.upload_file_is_locked=檔案「%s」已被 %s 鎖定。 @@ -1339,13 +1352,13 @@ projects.deletion_desc=刪除專案會從所有相關的問題移除它。是否 projects.deletion_success=專案已被刪除。 projects.edit=編輯專案 projects.edit_subheader=專案可用來組織問題和追蹤進度。 -projects.modify=更新專案 +projects.modify=編輯專案 projects.edit_success=已更新專案「%s」。 projects.type.none=無 projects.type.basic_kanban=基本看板 -projects.type.bug_triage=Bug 檢傷分類 +projects.type.bug_triage=Bug 分類 projects.template.desc=範本 -projects.template.desc_helper=選擇專案範本以開始 +projects.template.desc_helper=請選擇專案範本來開始 projects.type.uncategorized=未分類 projects.column.edit=編輯欄位 projects.column.edit_title=名稱 @@ -1382,7 +1395,7 @@ issues.new.open_projects=開放中的專案 issues.new.closed_projects=已關閉的專案 issues.new.no_items=沒有項目 issues.new.milestone=里程碑 -issues.new.no_milestone=未選擇里程碑 +issues.new.no_milestone=沒有里程碑 issues.new.clear_milestone=清除已選取里程碑 issues.new.open_milestone=開放中的里程碑 issues.new.closed_milestone=已關閉的里程碑 @@ -1403,8 +1416,8 @@ issues.new_label=新增標籤 issues.new_label_placeholder=標籤名稱 issues.new_label_desc_placeholder=描述 issues.create_label=建立標籤 -issues.label_templates.title=載入一組預定義的標籤 -issues.label_templates.info=沒有任何標籤。點擊「新增標籤」按鈕或使用預定義的標籤集: +issues.label_templates.title=載入一組預設的標籤組 +issues.label_templates.info=沒有任何標籤。點擊「新增標籤」按鈕或使用預設的標籤組: issues.label_templates.helper=選擇一個標籤集 issues.label_templates.use=使用標籤集 issues.label_templates.fail_to_load_file=載入標籤範本檔「%s」失敗:%v @@ -1461,8 +1474,8 @@ issues.filter_sort.nearduedate=截止日期由近到遠 issues.filter_sort.farduedate=截止日期由遠到近 issues.filter_sort.moststars=最多星號 issues.filter_sort.feweststars=最少星號 -issues.filter_sort.mostforks=最多 fork -issues.filter_sort.fewestforks=最少 fork +issues.filter_sort.mostforks=最多分叉 +issues.filter_sort.fewestforks=最少分叉 issues.action_open=開放 issues.action_close=關閉 issues.action_label=標籤 @@ -1507,7 +1520,7 @@ issues.ref_closed_from=`關閉了這個問題 %[4]s 重新開放了這個問題 %[4]s %[2]s` issues.ref_from=`自 %[1]s` issues.author=作者 -issues.role.owner=擁有者 +issues.role.owner=所有者 issues.role.member=普通成員 issues.re_request_review=再次請求審核 issues.is_stale=經過此審核以後,此合併請求有被修改 @@ -1612,7 +1625,7 @@ issues.dependency.pr_no_dependencies=未設定先決條件。 issues.dependency.no_permission_1=您沒有權限讀取 %d 個先決條件 issues.dependency.no_permission_n=您沒有權限讀取 %d 個先決條件 issues.dependency.no_permission.can_remove=您沒有權限讀取此先決條件,但可以移除此先決條件 -issues.dependency.add=加入先決條件... +issues.dependency.add=加入先決條件… issues.dependency.cancel=取消 issues.dependency.remove=移除 issues.dependency.remove_info=移除此先決條件 @@ -1691,7 +1704,7 @@ pulls.compare_compare=拉取自 pulls.switch_comparison_type=切換比較類型 pulls.switch_head_and_base=切換 head 和 base pulls.filter_branch=過濾分支 -pulls.no_results=未找到結果 +pulls.no_results=沒有找到結果。 pulls.nothing_to_compare=這些分支的內容相同,無需建立合併請求。 pulls.nothing_to_compare_and_allow_empty_pr=這些分支的內容相同,此合併請求將會是空白的。 pulls.has_pull_request=`已有介於這些分支間的合併請求:%[2]s#%[3]d` @@ -1712,7 +1725,7 @@ pulls.cannot_merge_work_in_progress=此合併請求被標記為還在進行中 ( pulls.still_in_progress=還在進行中嗎? pulls.add_prefix=加入 %s 前綴 pulls.remove_prefix=移除 %s 前綴 -pulls.data_broken=此合併請求已損毀,因為遺失 Fork 資訊。 +pulls.data_broken=因為遺失分叉資訊,此合併請求已損毀。 pulls.files_conflicted=此合併請求有變更和目標分支衝突。 pulls.is_checking=正在進行合併衝突檢查,請稍後再試。 pulls.is_ancestor=這個分支已經合併到目標分支上。沒有可以合併的內容。 @@ -1744,7 +1757,7 @@ pulls.rebase_merge_commit_pull_request=Rebase 後建立合併提交 pulls.squash_merge_pull_request=建立 Squash 提交 pulls.merge_manually=手動合併 pulls.merge_commit_id=合併提交 ID -pulls.require_signed_wont_sign=該分支需要經簽署的提交,但此合併將不會被簽署。 +pulls.require_signed_wont_sign=該分支需要經簽署的提交,但此合併將不會被簽署 pulls.invalid_merge_option=您無法對此合併請求使用這個合併選項。 pulls.merge_conflict=合併失敗:合併時發生衝突。 提示:請嘗試不同的策略 @@ -1756,7 +1769,7 @@ pulls.merge_out_of_date=合併失敗:產生合併時,基底已被更新。 pulls.head_out_of_date=合併失敗:產生合併時,head 已被更新。提示:再試一次。 pulls.push_rejected=合併失敗:此推送被拒絕。請檢查此儲存庫的 Git Hook。 pulls.push_rejected_summary=完整的拒絕訊息 -pulls.push_rejected_no_message=合併失敗:此推送被拒絕但未提供其他資訊。
請檢查此儲存庫的 Git Hook。 +pulls.push_rejected_no_message=合併失敗:此推送被拒絕但未提供其他資訊。請檢查此儲存庫的 Git Hook pulls.open_unmerged_pull_exists=`您不能重新開放,因為目前有相同的合併請求 (#%d) 正在進行中。` pulls.status_checking=還在進行一些檢查 pulls.status_checks_success=已通過所有檢查 @@ -1799,7 +1812,7 @@ milestones.update_ago=已更新 %s milestones.no_due_date=暫無截止日期 milestones.open=開啟 milestones.close=關閉 -milestones.completeness=%d%% 完成 +milestones.completeness=%d%% 已完成 milestones.create=建立里程碑 milestones.title=標題 milestones.desc=描述 @@ -1814,7 +1827,7 @@ milestones.modify=更新里程碑 milestones.edit_success=已更新里程碑「%s」。 milestones.deletion=刪除里程碑 milestones.deletion_desc=刪除里程碑會從所有相關的問題移除它。是否繼續? -milestones.deletion_success=里程碑已刪除 +milestones.deletion_success=該里程碑已被刪除。 milestones.filter_sort.least_complete=完成度由低到高 milestones.filter_sort.most_complete=完成度由高到低 milestones.filter_sort.most_issues=問題由多到少 @@ -1825,8 +1838,8 @@ ext_wiki=存取外部 Wiki ext_wiki.desc=連結外部 Wiki。 wiki=Wiki -wiki.welcome=歡迎使用 Wiki! -wiki.welcome_desc=Wiki 允許你撰寫和與協作者分享文件 +wiki.welcome=歡迎使用 Wiki。 +wiki.welcome_desc=Wiki 允許你撰寫且與協作者分享文件。 wiki.desc=撰寫與和協作者分享文件。 wiki.create_first_page=建立第一個頁面 wiki.page=頁面 @@ -1894,7 +1907,7 @@ activity.title.releases_1=%d 個版本 activity.title.releases_n=%d 個版本 activity.title.releases_published_by=%[2]s發布了 %[1]s activity.published_release_label=已發布 -activity.no_git_activity=期間內沒有任何提交動態 +activity.no_git_activity=在此期間內沒有任何提交動態。 activity.git_stats_exclude_merges=不計合併, activity.git_stats_author_1=%d 位作者 activity.git_stats_author_n=%d 位作者 @@ -1936,7 +1949,7 @@ settings.collaboration=協作者 settings.collaboration.admin=管理員 settings.collaboration.write=可寫權限 settings.collaboration.read=可讀權限 -settings.collaboration.owner=擁有者 +settings.collaboration.owner=所有者 settings.collaboration.undefined=未定義 settings.hooks=Webhook settings.githooks=Git Hook @@ -1975,7 +1988,7 @@ settings.tracker_issue_style=外部問題追蹤器的編號格式 settings.tracker_issue_style.numeric=數字 settings.tracker_issue_style.alphanumeric=字母及數字 settings.tracker_issue_style.regexp=正規表示式 -settings.tracker_issue_style.regexp_pattern=正規表示式模式 +settings.tracker_issue_style.regexp_pattern=正規表示式式樣 settings.tracker_issue_style.regexp_pattern_desc=第一個捕捉到的群組會用來取代 {index}。 settings.tracker_url_format_desc=使用占位符 {user}, {repo}{index} 代表帳號、儲存庫名稱和問題編號。 settings.enable_timetracker=啟用時間追蹤 @@ -1987,7 +2000,7 @@ settings.pulls.allow_rebase_update=啟用透過 Rebase 更新合併請求分支 settings.pulls.default_delete_branch_after_merge=預設在合併後刪除合併請求分支 settings.pulls.default_allow_edits_from_maintainers=預設允許維護者進行編輯 settings.releases_desc=啟用儲存庫版本發佈 -settings.packages_desc=啟用儲存庫套件註冊中心 +settings.packages_desc=啟用儲存庫軟體註冊中心 settings.projects_desc=啟用儲存庫專案 settings.actions_desc=啟用儲存庫 Actions settings.admin_settings=管理員設定 @@ -2000,18 +2013,18 @@ settings.reindex_button=加入到重新索引佇列 settings.reindex_requested=已請求重新索引 settings.admin_enable_close_issues_via_commit_in_any_branch=可以從非預設分支的提交訊息關閉問題 settings.danger_zone=危險操作區 -settings.new_owner_has_same_repo=新的儲存庫擁有者已經存在同名儲存庫! +settings.new_owner_has_same_repo=新的儲存庫所有者已經有一個同名的儲存庫。請另擇一個名字。 settings.convert=轉換為普通儲存庫 settings.convert_desc=您可以將此鏡像轉成普通儲存庫。此動作不可還原。 settings.convert_notices_1=此操作會將此鏡像轉換成普通儲存庫且不可還原。 settings.convert_confirm=轉換儲存庫 settings.convert_succeed=鏡像儲存庫已成功轉換為一般儲存庫。 -settings.convert_fork=轉換成普通儲存庫 -settings.convert_fork_desc=您可以將此 fork 轉換成普通儲存庫。此動作不可還原。 -settings.convert_fork_notices_1=此操作會將此 fork 轉換成普通儲存庫且不可還原。 +settings.convert_fork=轉換成一般儲存庫 +settings.convert_fork_desc=您可以將此分叉轉換成一般儲存庫。這個操作無法被取消。 +settings.convert_fork_notices_1=此操作將不可取消得將此分叉轉換成一般儲存庫。 settings.convert_fork_confirm=轉換儲存庫 -settings.convert_fork_succeed=此 fork 已轉換成普通儲存庫。 -settings.transfer.title=轉移儲存庫所有權 +settings.convert_fork_succeed=此分叉已被轉換成一般儲存庫。 +settings.transfer.title=轉移所有權 settings.transfer.rejected=儲存庫轉移被拒絕。 settings.transfer.success=儲存庫已成功轉移。 settings.transfer_abort=取消轉移 @@ -2022,7 +2035,7 @@ settings.transfer_in_progress=目前正在進行轉移。如果您想要將此 settings.transfer_notices_1=- 如果將此儲存庫轉移給個別使用者,您將會失去此儲存庫的存取權。 settings.transfer_notices_2=- 如果將此儲存庫轉移到您(共同)擁有的組織,您將能繼續保有此儲存庫的存取權。 settings.transfer_notices_3=- 如果此儲存庫為私有儲存庫且將轉移給個別使用者,此動作確保該使用者至少擁有讀取權限 (必要時將會修改權限)。 -settings.transfer_owner=新擁有者 +settings.transfer_owner=新的所有者 settings.transfer_perform=進行轉移 settings.transfer_started=此儲存庫已被標記為待轉移且正在等待「%s」的確認 settings.transfer_succeed=已轉移儲存庫。 @@ -2048,14 +2061,14 @@ settings.delete=刪除本儲存庫 settings.delete_desc=刪除儲存庫是永久的且不可還原。 settings.delete_notices_1=- 此動作不可還原。 settings.delete_notices_2=- 此操作將永久刪除 %s 儲存庫,包括程式碼、問題、留言、Wiki 資料和協作者設定。 -settings.delete_notices_fork_1=- 在此儲存庫刪除後,它的 fork 將會變成獨立儲存庫。 +settings.delete_notices_fork_1=- 在刪除此儲存庫後,它的所有分叉將會各自變成獨立儲存庫。 settings.deletion_success=這個儲存庫已被刪除。 settings.update_settings_success=已更新儲存庫的設定。 settings.confirm_delete=刪除儲存庫 settings.add_collaborator=增加協作者 -settings.add_collaborator_success=成功增加協作者! +settings.add_collaborator_success=成功增加協作者。 settings.add_collaborator_inactive_user=無法將未啟用的使用者加入為協作者。 -settings.add_collaborator_owner=無法將擁有者加入為協作者。 +settings.add_collaborator_owner=無法將所有者加入為協作者。 settings.add_collaborator_duplicate=此協作者早已被加入此儲存庫。 settings.delete_collaborator=移除 settings.collaborator_deletion=移除協作者 @@ -2063,14 +2076,14 @@ settings.collaborator_deletion_desc=移除協作者將拒絕他存取此儲存 settings.remove_collaborator_success=已移除協作者。 settings.search_user_placeholder=搜尋使用者... settings.org_not_allowed_to_be_collaborator=不可加入組織為協作者。 -settings.change_team_access_not_allowed=只有組織擁有者可修改團隊的儲存庫存取權限 +settings.change_team_access_not_allowed=只有組織所有者可修改團隊的儲存庫存取權限 settings.team_not_in_organization=團隊和儲存庫不在相同的組織內 settings.teams=團隊 settings.add_team=增加團隊 settings.add_team_duplicate=團隊已擁有該儲存庫 settings.add_team_success=團隊現在可存取該儲存庫了。 settings.search_team=搜尋團隊... -settings.change_team_permission_tip=團隊權限可於團隊設定頁面修改,不能針對儲存庫分別調整。 +settings.change_team_permission_tip=團隊權限只能於團隊設定頁面修改,不能針對儲存庫分別調整 settings.delete_team_tip=此團隊可存取所有儲存庫,無法移除 settings.remove_team_success=已移除團隊存取儲存庫的權限。 settings.add_webhook=建立 Webhook @@ -2106,14 +2119,14 @@ settings.discord_icon_url=圖示 URL settings.event_desc=觸發條件: settings.event_push_only=推送事件 settings.event_send_everything=所有事件 -settings.event_choose=自訂事件... +settings.event_choose=自訂事件… settings.event_header_repository=儲存庫事件 settings.event_create=建立 settings.event_create_desc=建立分支或標籤。 settings.event_delete=刪除 settings.event_delete_desc=刪除分支或標籤。 -settings.event_fork=Fork -settings.event_fork_desc=儲存庫已被 fork。 +settings.event_fork=分叉 +settings.event_fork_desc=儲存庫已被分叉。 settings.event_wiki=Wiki settings.event_wiki_desc=建立、重新命名、編輯、刪除 Wiki 頁面。 settings.event_release=版本發布 @@ -2148,15 +2161,15 @@ settings.event_pull_request_review=合併請求審核 settings.event_pull_request_review_desc=核准、退回或提出審核留言。 settings.event_pull_request_sync=合併請求同步 settings.event_pull_request_sync_desc=合併請求同步。 -settings.event_package=套件 -settings.event_package_desc=套件已在儲存庫中建立或刪除。 +settings.event_package=軟體包 +settings.event_package_desc=已在儲存庫中建立或刪除軟體包。 settings.branch_filter=分支篩選 -settings.branch_filter_desc=推送、建立分支、刪除分支事件的白名單,請使用 glob 比對模式。如果留白或輸入*,所有分支的事件都會被回報。語法參見 github.com/gobwas/glob。範例:master, {master,release*}。 +settings.branch_filter_desc=推送、建立分支、刪除分支事件的白名單,請使用 glob 比對式樣。如果留白或輸入*,所有分支的事件都會被回報。語法參見 github.com/gobwas/glob。範例:master, {master,release*}。 settings.authorization_header=Authorization 標頭 settings.authorization_header_desc=存在時將將包含此 Authorization 標頭在請求中。例: %s。 settings.active=啟用 settings.active_helper=觸發事件的資訊將會被送到此 Webhook URL。 -settings.add_hook_success=Webhook 新增成功! +settings.add_hook_success=Webhook 新增成功。 settings.update_webhook=更新 Webhook settings.update_hook_success=已成功更新 Webhook 。 settings.delete_webhook=移除 Webhook @@ -2182,7 +2195,7 @@ settings.web_hook_name_wechatwork=WeCom (Wechat Work) settings.web_hook_name_packagist=Packagist settings.packagist_username=Packagist 帳號 settings.packagist_api_token=API 符記 -settings.packagist_package_url=Packagist 套件 URL +settings.packagist_package_url=Packagist 軟體包 URL settings.deploy_keys=部署金鑰 settings.add_deploy_key=新增部署金鑰 settings.deploy_key_desc=部署金鑰具有唯讀權限,可拉取此儲存庫。 @@ -2212,7 +2225,7 @@ settings.protect_disable_push_desc=不允許推送到此分支。 settings.protect_enable_push=啟用推送 settings.protect_enable_push_desc=任何擁有寫入權限的使用者將可推送至該分支(但不可使用force push)。 settings.protect_enable_merge=啟用合併 -settings.protect_enable_merge_desc=任何有寫入權限的人都可將合併請求合併到此分支 +settings.protect_enable_merge_desc=任何有寫入權限的人都可將合併請求合併到此分支。 settings.protect_whitelist_committers=使用白名單控管推送 settings.protect_whitelist_committers_desc=僅允許白名單內的使用者或團隊推送至該分支(但不可使用force push)。 settings.protect_whitelist_deploy_keys=將擁有寫入權限的部署金鑰加入白名單。 @@ -2237,9 +2250,9 @@ settings.dismiss_stale_approvals=捨棄過時的核可 settings.dismiss_stale_approvals_desc=當新的提交有修改到合併請求的內容,並被推送到此分支時,將捨棄舊的核可。 settings.require_signed_commits=僅接受經簽署的提交 settings.require_signed_commits_desc=拒絕未經簽署或未經驗證的提交推送到此分支。 -settings.protect_branch_name_pattern=受保護的分支名稱模式 -settings.protect_protected_file_patterns=受保護的檔案模式 (以分號區隔「;」): -settings.protect_protected_file_patterns_desc=即便使用者有權限新增、修改、刪除此分支的檔案,仍不允許直接修改受保護的檔案。可以用半形分號「;」分隔多個模式。請於 github.com/gobwas/glob 文件查看模式格式。範例: .drone.yml, /docs/**/*.txt。 +settings.protect_branch_name_pattern=受保護的分支名稱式樣 +settings.protect_protected_file_patterns=受保護的檔案式樣 (以分號區隔「;」): +settings.protect_protected_file_patterns_desc=即便使用者有權限新增、修改、刪除此分支的檔案,仍不允許直接修改受保護的檔案。可以用半形分號「;」分隔多個式樣。請於 github.com/gobwas/glob 文件查看模式格式。範例: .drone.yml, /docs/**/*.txt。 settings.protect_unprotected_file_patterns=未受保護的檔案模式 (以分號區隔「;」): settings.protect_unprotected_file_patterns_desc=當使用者有寫入權限時,可繞過推送限制,直接修改未受保護的檔案。可以用半形分號「;」分隔多個模式。請於 github.com/gobwas/glob 文件查看模式格式。範例: .drone.yml, /docs/**/*.txt。 settings.add_protected_branch=啟用保護 @@ -2255,7 +2268,7 @@ settings.block_outdated_branch_desc=當 head 分支落後於基礎分支時不 settings.default_branch_desc=請選擇用來提交程式碼和合併請求的預設分支: settings.merge_style_desc=合併方式 settings.default_merge_style_desc=預設合併方式 -settings.choose_branch=選擇一個分支... +settings.choose_branch=選擇一個分支… settings.no_protected_branch=沒有受保護的分支。 settings.edit_protected_branch=編輯 settings.protected_branch_required_rule_name=必須填寫規則名稱 @@ -2277,7 +2290,7 @@ settings.matrix.room_id=聊天室 ID settings.matrix.message_type=訊息類型 settings.archive.button=封存儲存庫 settings.archive.header=封存本儲存庫 -settings.archive.success=此儲存庫已被封存 +settings.archive.success=此儲存庫已被封存。 settings.archive.error=嘗試封存儲存庫時發生錯誤。查看日誌檔以獲得更多資訊。 settings.archive.error_ismirror=無法封存鏡像儲存庫。 settings.archive.branchsettings_unavailable=已封存的儲存庫無法使用分支設定。 @@ -2341,14 +2354,14 @@ diff.file_after=之後 diff.file_image_width=寬度 diff.file_image_height=高度 diff.file_byte_size=大小 -diff.file_suppressed=檔案差異因為檔案過大而無法顯示 +diff.file_suppressed=檔案差異因為檔案過大而被隱藏 diff.file_suppressed_line_too_long=檔案差異因為一行或多行太長而無法顯示 diff.too_many_files=本差異變更的檔案數量過多導致部分檔案未顯示 diff.show_more=顯示更多 diff.load=載入差異 diff.generated=generated diff.vendored=vendored -diff.comment.placeholder=留言... +diff.comment.placeholder=留言 diff.comment.markdown_info=支援 markdown 格式。 diff.comment.add_single_comment=加入單獨的留言 diff.comment.add_review_comment=新增留言 @@ -2463,8 +2476,8 @@ find_file.no_matching=找不到符合的檔案 error.csv.too_large=無法渲染此檔案,因為它太大了。 error.csv.unexpected=無法渲染此檔案,因為它包含了未預期的字元,於第 %d 行第 %d 列。 error.csv.invalid_field_count=無法渲染此檔案,因為它第 %d 行的欄位數量有誤。 -fork_no_valid_owners = 因為此儲存庫沒有有效的所有者,它無法被 fork。 -fork_branch = 要複製到 fork 的分支 +fork_no_valid_owners = 因為此儲存庫沒有有效的所有者,它無法被分叉。 +fork_branch = 要複製到分叉的分支 commit.load_referencing_branches_and_tags = 載入引用這個提交的分支和標籤 mirror_sync = 已同步 commit.contained_in_default_branch = 這個提交是預設分支的一部分 @@ -2487,7 +2500,7 @@ object_format_helper = 儲存庫的物件格式。一旦設定便無法更改。 stars_remove_warning = 這將會移除此儲存庫的所有星星。 transfer.no_permission_to_reject = 您沒有權限拒絕這項轉讓。 desc.sha256 = SHA256 -form.name_pattern_not_allowed = 您無法在儲存庫的名字中使用「%s」格式。 +form.name_pattern_not_allowed = 您無法在儲存庫的名字中使用「%s」式樣。 admin.manage_flags = 管理旗標 visibility_helper = 將儲存庫設為私有 mirror_address_url_invalid = URL 無效。您必須正確的跳脫(escape)該 URL 的每個部份。 @@ -2503,13 +2516,45 @@ commit.contained_in = 這個提交存在於: settings.archive.mirrors_unavailable = 不能鏡像已封存的儲存庫。 settings.mirror_settings.push_mirror.edit_sync_time = 編輯鏡像同步週期 settings.update_protect_branch_success = 已成功更新分支保護規則「%s」。 +editor.filename_is_a_directory = 在這個儲存庫中,已有一個目錄使用了檔案「%s」的名稱。 +editor.file_editing_no_longer_exists = 正在編輯的檔案「%s」已不存在於儲存庫。 +editor.file_deleting_no_longer_exists = 正在刪除的檔案「%s」已不存在於儲存庫。 +editor.directory_is_a_file = 在這個儲存庫中,已有一個檔案使用了目錄「%s」的名稱。 +generated = 自動生成的 +object_format = 物件格式 +open_with_editor = 用 %s 打開 +stars = 星星 +n_tag_few = %s 個標籤 +migrate_options_lfs_endpoint.placeholder = +signing.wont_sign.nokey = 這個站點沒有可以用來簽署的金鑰。 +n_branch_few = %s 條分支 +n_tag_one = %s 個標籤 +settings.transfer.button = 轉移所有權 +settings.transfer.modal.title = 轉移所有權 +commits.view_path = 在歷史中檢視這個時間點 +n_commit_one = %s 個提交 +n_commit_few = %s 個提交 +n_branch_one = %s 條分支 +commits.search_branch = 此分支 +commits.browse_further = 進一步瀏覽 +commits.renamed_from = 自 %s 重新命名 +issues.filter_milestone_none = 沒有里程碑 +issues.num_comments_1 = %s 則留言 +issues.no_content = 沒有提供敘述。 +settings.new_owner_blocked_doer = 新的所有者已封鎖您。 +new_repo_helper = 一個儲存庫包含專案的所有檔案和它們的修訂歷史。在別處已經有儲存庫了嗎?遷移儲存庫。 +editor.commit_id_not_matching = 在您編輯檔案的同時,該檔案被改變了。請提交到一條新的分支然後合併。 +issues.role.owner_helper = 此使用者是這個儲存庫的所有者。 +issues.filter_milestone_all = 所有里程碑 +issues.author_helper = 此使用者是作者。 +pulls.blocked_by_approvals = 此合併請求還沒有足夠的核可。已有 %d 個,總共需要 %d 個核可。 [graphs] [org] org_name_holder=組織名稱 org_full_name_holder=組織全名 -org_name_helper=組織名稱應該要簡短且方便記憶 +org_name_helper=組織名稱應該要簡短且好記。 create_org=建立組織 repo_updated=於 %s 更新 members=成員 @@ -2522,7 +2567,7 @@ create_team=建立新的團隊 org_desc=描述 team_name=團隊名稱 team_desc=描述 -team_name_helper=團隊名稱應該要簡短且方便記憶 +team_name_helper=團隊名稱應該要簡短且好記。 team_desc_helper=描述團隊的目的或角色。 team_access_desc=儲存庫存取權 team_permission_desc=權限 @@ -2541,9 +2586,9 @@ settings.permission=權限 settings.repoadminchangeteam=儲存庫管理者可增加與移除團隊權限 settings.visibility=瀏覽權限 settings.visibility.public=公開 -settings.visibility.limited=受限 (只有已驗證的使用者才可以看到) +settings.visibility.limited=受限(只有已驗證的使用者才可以看到) settings.visibility.limited_shortname=受限 -settings.visibility.private=私有 (只有組織成員才能看到) +settings.visibility.private=私有(只有組織成員才能看到) settings.visibility.private_shortname=私有 settings.update_settings=更新設定 @@ -2560,13 +2605,13 @@ settings.hooks_desc=此組織下的所有存儲庫都會觸發 settings.labels_desc=在此處新增的標籤可用於此組織下的所有儲存庫。 -members.membership_visibility=成員能見度: +members.membership_visibility=成員瀏覽權限: members.public=可見 members.public_helper=隱藏 members.private=隱藏 members.private_helper=顯示 members.member_role=成員角色: -members.owner=擁有者 +members.owner=所有者 members.member=普通成員 members.remove=移除 members.remove.detail=確定要從 %[2]s 中刪除 %[1]s 嗎? @@ -2592,7 +2637,7 @@ teams.admin_access=管理員權限 teams.admin_access_helper=成員可以拉取、推送和新增協作者到團隊儲存庫中。 teams.no_desc=該團隊暫無描述 teams.settings=設定 -teams.owners_permission_desc=擁有者對 所有儲存庫 具有完整權限,且對組織具有 管理員權限。 +teams.owners_permission_desc=所有者對 所有儲存庫 具有完整權限,且對組織具有 管理員權限。 teams.members=團隊成員 teams.update_settings=更新設定 teams.delete_team=刪除團隊 @@ -2628,7 +2673,7 @@ teams.invite.description=請點擊下方按鈕加入團隊。 [admin] dashboard=資訊主頁 -users=使用者帳戶 +users=使用者帳號 organizations=組織 repositories=儲存庫 hooks=Webhook @@ -2659,13 +2704,13 @@ dashboard.cron.started=已開始的 Cron: %[1]s dashboard.cron.process=Cron: %[1]s dashboard.cron.error=Cron 中的錯誤: %s: %[3]s dashboard.cron.finished=Cron: %[1]s 已完成 -dashboard.delete_inactive_accounts=刪除所有未啟用帳戶 -dashboard.delete_inactive_accounts.started=刪除所有未啟用帳戶的任務已啟動。 +dashboard.delete_inactive_accounts=刪除所有未啟用帳號 +dashboard.delete_inactive_accounts.started=刪除所有未啟用帳號的任務已啟動。 dashboard.delete_repo_archives=刪除所有儲存庫存檔 (ZIP、TAR.GZ 等) dashboard.delete_repo_archives.started=刪除所有儲存庫存檔的任務已啟動。 dashboard.delete_missing_repos=刪除所有遺失 Git 檔案的儲存庫 dashboard.delete_missing_repos.started=刪除所有遺失 Git 檔案的儲存庫的任務已啟動。 -dashboard.delete_generated_repository_avatars=刪除產生的儲存庫大頭貼 +dashboard.delete_generated_repository_avatars=刪除自動產生的儲存庫大頭貼 dashboard.update_mirrors=更新鏡像 dashboard.repo_health_check=對所有儲存庫進行健康檢查 dashboard.check_repo_stats=檢查所有儲存庫的統計資料 @@ -2679,7 +2724,7 @@ dashboard.resync_all_hooks=重新同步所有儲存庫的 pre-receive、update dashboard.reinit_missing_repos=重新初始化所有記錄存在但遺失的 Git 儲存庫 dashboard.sync_external_users=同步外部使用者資料 dashboard.cleanup_hook_task_table=清理 hook_task 資料表 -dashboard.cleanup_packages=清理已過期的套件 +dashboard.cleanup_packages=清理已過期的軟體包 dashboard.server_uptime=伺服器運作時間 dashboard.current_goroutine=目前的 Goroutines 數量 dashboard.current_memory_usage=目前記憶體使用量 @@ -2716,10 +2761,10 @@ dashboard.delete_old_system_notices=從資料庫刪除所有舊系統提示 dashboard.gc_lfs=對 LFS meta objects 進行垃圾回收 dashboard.stop_zombie_tasks=停止殭屍任務 dashboard.stop_endless_tasks=停止永不停止的任務 -dashboard.cancel_abandoned_jobs=取消已放棄的工作 +dashboard.cancel_abandoned_jobs=取消已放棄的作業 -users.user_manage_panel=使用者帳戶管理 -users.new_account=建立使用者帳戶 +users.user_manage_panel=使用者帳號管理 +users.new_account=建立使用者帳號 users.name=帳號 users.full_name=全名 users.activated=已啟用 @@ -2731,17 +2776,17 @@ users.created=建立時間 users.last_login=上次登入 users.never_login=從未登入 users.send_register_notify=寄送使用者註冊通知 -users.new_success=已建立新帳戶「%s」。 +users.new_success=已建立新帳號「%s」。 users.edit=編輯 users.auth_source=認證來源 users.local=本地 users.auth_login_name=認證登入名稱 users.password_helper=密碼留空則不修改。 -users.update_profile_success=已更新使用者帳戶。 -users.edit_account=編輯使用者帳戶 +users.update_profile_success=已更新使用者帳號。 +users.edit_account=編輯使用者帳號 users.max_repo_creation=最大儲存庫數量 users.max_repo_creation_desc=(設定 -1 使用全域預設限制) -users.is_activated=使用者帳戶已啟用 +users.is_activated=使用者帳號已啟用 users.prohibit_login=禁止登入 users.is_admin=是管理員 users.is_restricted=受限制的 @@ -2749,15 +2794,15 @@ users.allow_git_hook=可以建立 Git Hook users.allow_git_hook_tooltip=Git Hook 將以和 Forgejo 相同的作業系統使用者執行,並擁有同等的主機存取權限。因此擁有此特殊 Git Hook 權限的使用者可存取和修改所有的 Forgejo 儲存庫和 Forgejo 的資料庫。他們甚至能取得 Forgejo 的管理員權限。 users.allow_import_local=可以匯入本地儲存庫 users.allow_create_organization=可以建立組織 -users.update_profile=更新使用者帳戶 -users.delete_account=刪除使用者帳戶 +users.update_profile=更新使用者帳號 +users.delete_account=刪除使用者帳號 users.cannot_delete_self=您無法刪除您自己 users.still_own_repo=這個使用者還擁有一個或更多的儲存庫。請先刪除或是轉移這些儲存庫。 users.still_has_org=此使用者是組織的成員。請先將他從組織中移除。 users.purge=清除使用者 -users.purge_help=強制刪除使用者和他擁有的所有儲存庫、組織、套件,所有留言也會被刪除。 -users.still_own_packages=此使用者仍然擁有一個以上的套件,請先刪除這些套件。 -users.deletion_success=使用者帳戶已被刪除。 +users.purge_help=強制刪除使用者和其所擁有的所有儲存庫、組織和軟體包。他所有的留言和問題也會被刪除。 +users.still_own_packages=此使用者仍然擁有至少一個軟體包,請先刪除這些軟體包。 +users.deletion_success=已刪除該使用者帳號。 users.reset_2fa=重設兩步驟驗證 users.list_status_filter.menu_text=篩選 users.list_status_filter.reset=重設 @@ -2781,7 +2826,7 @@ emails.filter_sort.name=使用者名稱 emails.filter_sort.name_reverse=使用者名稱(倒序) emails.updated=信箱已更新 emails.not_updated=電子信箱更新失敗: %v -emails.duplicate_active=此信箱已被其他使用者使用 +emails.duplicate_active=此信箱已被其他使用者使用。 emails.change_email_header=更新電子信箱屬性 orgs.org_manage_panel=組織管理 @@ -2793,7 +2838,7 @@ orgs.new_orga=新增組織 repos.repo_manage_panel=儲存庫管理 repos.unadopted=未接管的儲存庫 repos.unadopted.no_more=找不到其他未接管的儲存庫 -repos.owner=擁有者 +repos.owner=所有者 repos.name=名稱 repos.private=私有 repos.watches=關注數 @@ -2802,10 +2847,10 @@ repos.forks=Fork 數 repos.issues=問題數 repos.size=大小 -packages.package_manage_panel=套件管理 +packages.package_manage_panel=軟體包管理 packages.total_size=總大小: %s packages.unreferenced_size=未參考大小: %s -packages.owner=擁有者 +packages.owner=所有者 packages.creator=建立者 packages.name=名稱 packages.version=版本 @@ -2847,7 +2892,7 @@ auths.attribute_mail=電子郵件屬性 auths.attribute_ssh_public_key=SSH 公鑰屬性 auths.attribute_avatar=大頭貼屬性 auths.attributes_in_bind=從 Bind DN 中取得屬性資訊 -auths.allow_deactivate_all=允許在搜尋結果為空白時停用所有使用者帳戶 +auths.allow_deactivate_all=允許在搜尋結果為空白時停用所有使用者帳號 auths.use_paged_search=使用分頁查詢 auths.search_page_size=頁面大小 auths.filter=使用者篩選器 @@ -2859,7 +2904,7 @@ auths.group_search_base=群組搜尋的 Base DN auths.group_attribute_list_users=包含使用者清單的群組屬性 auths.user_attribute_in_group=群組中列出的使用者屬性 auths.map_group_to_team=對應 LDAP 群組到組織團隊 (欄位留空以跳過) -auths.map_group_to_team_removal=如果使用者不屬於相對應的 LDAP 群組,將使用者從已同步的團隊移除。 +auths.map_group_to_team_removal=如果使用者不屬於相對應的 LDAP 群組,將使用者從已同步的團隊移除 auths.enable_ldap_groups=啟用 LDAP 群組 auths.ms_ad_sa=MS AD 搜尋屬性 auths.smtp_auth=SMTP 驗證類型 @@ -2900,11 +2945,11 @@ auths.oauth2_map_group_to_team=將已 Claim 的群組對應到組織團隊。( auths.oauth2_map_group_to_team_removal=如果使用者不屬於相對應的群組,將使用者從已同步的團隊移除。 auths.enable_auto_register=允許授權用戶自動註冊 auths.sspi_auto_create_users=自動建立使用者 -auths.sspi_auto_create_users_helper=允許 SSPI 認證方法於使用者首次登入時自動建立新帳戶 +auths.sspi_auto_create_users_helper=允許 SSPI 認證方法於使用者首次登入時自動建立新帳號 auths.sspi_auto_activate_users=自動啟用使用者 auths.sspi_auto_activate_users_helper=允許 SSPI 認證方法自動啟用新使用者 auths.sspi_strip_domain_names=從帳號中移除域名 -auths.sspi_strip_domain_names_helper=勾選後,將從登入名稱中移除域名 (例如:「DOMAIN\user」和「user@example.org」都會變成「user」) +auths.sspi_strip_domain_names_helper=勾選後,將從登入名稱中移除域名(例如:「DOMAIN\user」和「user@example.org」都會變成「user」)。 auths.sspi_separator_replacement=用來替換 \, / 和 @ 的分隔符號 auths.sspi_separator_replacement_helper=用來替換下級登入名稱分隔符號的字元 (例如:「DOMAIN\user」中的「\」) 和使用者主體名稱 (例如:「user@example.org」中的「@」)。 auths.sspi_default_language=使用者預設語言 @@ -2912,8 +2957,8 @@ auths.sspi_default_language_helper=SSPI 認證方法自動建立之使用者的 auths.tips=幫助提示 auths.tips.oauth2.general=OAuth2 認證 auths.tip.oauth2_provider=OAuth2 提供者 -auths.tip.bitbucket=註冊新的 OAuth 客戶端並加入權限「Account - Read」。網址:https://bitbucket.org/account/user//oauth-consumers/new -auths.tip.nextcloud=在您的執行個體中,於選單「設定 -> 安全性 -> OAuth 2.0 客戶端」註冊新的 OAuth 客戶端 +auths.tip.bitbucket=註冊新的 OAuth 用戶端並加入權限「Account - Read」。網址:https://bitbucket.org/account/user//oauth-consumers/new +auths.tip.nextcloud=在您的站點上,於選單「設定 -> 安全性 -> OAuth 2.0 客戶端」註冊新的 OAuth 客戶端 auths.tip.dropbox=建立新的 App。網址:https://www.dropbox.com/developers/apps auths.tip.facebook=註冊新的應用程式並新增產品「Facebook 登入」。網址:https://developers.facebook.com/apps auths.tip.github=註冊新的 OAuth 應用程式。網址:https://github.com/settings/applications/new @@ -2922,8 +2967,8 @@ auths.tip.google_plus=從 Google API 控制台取得 OAuth2 用戶端憑證。 auths.tip.openid_connect=使用 OpenID 連接探索 URL (/.well-known/openid-configuration) 來指定節點 auths.tip.twitter=建立應用程式並確保有啟用「Allow this application to be used to Sign in with Twitter」。網址:https://dev.twitter.com/apps auths.tip.discord=註冊新的應用程式。網址:https://discordapp.com/developers/applications/me -auths.tip.yandex=建立新的應用程式,從「Yandex.Passport API」區塊選擇「Access to email address」、「Access to user avatar」和「Access to username, first name and surname, gender」。網址:https://oauth.yandex.com/client/new -auths.tip.mastodon=輸入您欲認證的 Mastodon 執行個體的自訂網址 (或使用預設值) +auths.tip.yandex=在 https://oauth.yandex.com/client/new 建立新的應用程式。請在「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.activated=該認證來源已啟用 auths.new_success=已新增認證「%s」。 @@ -2940,7 +2985,7 @@ auths.unable_to_initialize_openid=無法初始化 OpenID 連接提供者: %s auths.invalid_openIdConnectAutoDiscoveryURL=自動探索 URL 無效(它必須是以 http:// 或 https:// 開頭的有效 URL) config.server_config=伺服器設定 -config.app_name=網站標題 +config.app_name=站點標題 config.app_ver=Forgejo 版本 config.app_url=Forgejo 基底 URL config.custom_conf=設定檔路徑 @@ -2995,14 +3040,14 @@ config.require_sign_in_view=需要登入才能瀏覽頁面 config.mail_notify=啟用郵件通知 config.enable_captcha=啟用驗證碼 config.active_code_lives=啟用用戶連結有效期 -config.reset_password_code_lives=帳戶救援碼有效時間 +config.reset_password_code_lives=帳號復原碼有效時間 config.default_keep_email_private=預設隱藏電子信箱 config.default_allow_create_organization=預設允許新增組織 config.enable_timetracking=啟用時間追蹤 config.default_enable_timetracking=預設啟用時間追蹤 config.default_allow_only_contributors_to_track_time=只讓貢獻者追蹤時間 config.no_reply_address=隱藏電子信箱域名 -config.default_visibility_organization=新組織的預設能見度 +config.default_visibility_organization=新組織的預設瀏覽權限 config.default_enable_dependencies=預設啟用問題的先決條件 config.webhook_config=Webhook 設定 @@ -3046,10 +3091,10 @@ config.session_life_time=Session 生命週期 config.https_only=僅限 HTTPS config.cookie_life_time=Cookie 生命週期 -config.picture_config=圖片和大頭貼設定 +config.picture_config=圖片和大頭貼組態 config.picture_service=圖片服務 config.disable_gravatar=停用 Gravatar -config.enable_federated_avatar=啟用 Federated 大頭貼 +config.enable_federated_avatar=啟用聯邦式大頭貼 config.git_config=Git 設定 config.git_disable_diff_highlight=停用比較語法高亮 @@ -3197,16 +3242,16 @@ raw_minutes=分鐘 [dropzone] default_message=拖放檔案或是點擊此處上傳。 -invalid_input_type=您無法上傳此類型的檔案 -file_too_big=檔案大小({{filesize}} MB) 超過了最大允許大小({{maxFilesize}} MB) +invalid_input_type=您無法上傳此類型的檔案。 +file_too_big=檔案大小({{filesize}} MB)超過了最大允許大小({{maxFilesize}} MB)。 remove_file=移除文件 [notification] notifications=通知 unread=未讀 read=已讀 -no_unread=沒有未讀通知 -no_read=沒有已讀通知 +no_unread=沒有未讀通知。 +no_read=沒有已讀通知。 pin=固定通知 mark_as_read=標記為已讀 mark_as_unread=標記為未讀 @@ -3219,24 +3264,24 @@ no_subscriptions=沒有訂閱 default_key=使用預設金鑰簽署 error.extract_sign=無法提取簽署 error.generate_hash=無法產生提交的雜湊值 -error.no_committer_account=提交者的電子信箱沒有連結到任何帳戶 +error.no_committer_account=提交者的電子信箱沒有連結到任何帳號 error.no_gpg_keys_found=資料庫中找不到此簽署所對應的金鑰 error.not_signed_commit=未簽署的提交 -error.failed_retrieval_gpg_keys=找不到任何與該提交者帳戶相關的金鑰 +error.failed_retrieval_gpg_keys=找不到任何與該提交者帳號相關的金鑰 error.probable_bad_signature=警告!雖然資料庫中有此 ID 的金鑰,但此提交未通過它的驗證!此提交是有疑慮的。 error.probable_bad_default_signature=警告!雖然預設金鑰擁有此 ID,但此提交未通過它的驗證!此提交是有疑慮的。 [units] unit=單元 error.no_unit_allowed_repo=您未被允許存取此儲存庫的任何區域。 -error.unit_not_allowed=您未被允許訪問此儲存庫區域 +error.unit_not_allowed=您未被允許存取此儲存庫區域。 [packages] -title=套件 -desc=管理儲存庫套件。 -empty=目前還沒有套件。 -empty.documentation=關於套件註冊中心的詳情請參閱說明文件。 -empty.repo=已經上傳了一個套件,但是沒有顯示在這裡嗎?打開套件設定並將其連結到這個儲存庫。 +title=軟體包 +desc=管理儲存庫軟體包。 +empty=目前還沒有軟體包。 +empty.documentation=關於軟體包註冊中心的詳情請參閱說明文件。 +empty.repo=已經上傳了一個軟體包,但是它不在這裡嗎?造訪軟體包設定並將其連結到這個儲存庫。 filter.type=類型 filter.type.all=所有 filter.no_result=沒有篩選結果。 @@ -3245,7 +3290,7 @@ filter.container.untagged=未加標籤 published_by=發布於 %[1]s 由 %[3]s published_by_in=發布於 %[1]s 由 %[3]s%[5]s installation=安裝 -about=關於此套件 +about=關於此軟體包 requirements=需求 dependencies=相依性 keywords=關鍵字 @@ -3262,85 +3307,85 @@ dependency.id=ID dependency.version=版本 alpine.registry=在您的 /etc/apk/repositories 檔加入下列 URL 以設定此註冊中心: alpine.registry.key=下載註冊中心的公開 RSA 金鑰到 /etc/apk/keys/ 資料夾來驗證索引簽署: -alpine.registry.info=從下列清單選擇 $branch 和 $repository -alpine.install=執行下列命令安裝此套件: +alpine.registry.info=從下列清單選擇 $branch 和 $repository。 +alpine.install=執行下列命令安裝此軟體包: alpine.repository=儲存庫資訊 alpine.repository.branches=分支 alpine.repository.repositories=儲存庫 alpine.repository.architectures=架構 cargo.registry=在 Cargo 組態檔設定此註冊中心 (例如: ~/.cargo/config.toml): -cargo.install=執行下列命令以使用 Cargo 安裝此套件: +cargo.install=執行下列命令以使用 Cargo 安裝此軟體包: chef.registry=在您的 ~/.chef/config.rb 檔設定此註冊中心: -chef.install=執行下列命令安裝此套件: +chef.install=執行下列命令以安裝此軟體包: composer.registry=在您的 ~/.composer/config.json 檔設定此註冊中心: -composer.install=執行下列命令以使用 Composer 安裝此套件: +composer.install=執行下列命令以使用 Composer 安裝此軟體包: composer.dependencies=相依性 composer.dependencies.development=開發相依性 conan.details.repository=儲存庫 conan.registry=透過下列命令設定此註冊中心: -conan.install=執行下列命令以使用 Conan 安裝此套件: +conan.install=執行下列命令以使用 Conan 安裝此軟體包: conda.registry=在您的 .condarc 檔設定此註冊中心為 Conda 存儲庫: -conda.install=執行下列命令以使用 Conda 安裝此套件: +conda.install=執行下列命令以使用 Conda 安裝此軟體包: container.details.type=映像檔類型 container.details.platform=平台 -container.pull=透過下列命令拉取映像檔: +container.pull=透過下列命令拉取映像檔: container.digest=摘要: container.multi_arch=作業系統 / 架構 container.layers=映像檔 Layers container.labels=標籤 container.labels.key=鍵 container.labels.value=值 -cran.install=執行下列命令安裝此套件: +cran.install=執行下列命令以安裝此軟體包: debian.registry=透過下列命令設定此註冊中心: -debian.install=執行下列命令安裝此套件: +debian.install=執行下列命令以安裝此軟體包: debian.repository=儲存庫資訊 debian.repository.architectures=架構 -generic.download=透過下列命令下載套件: +generic.download=使用命令列下載軟體包: helm.registry=透過下列命令設定此註冊中心: -helm.install=執行下列命令安裝此套件: +helm.install=執行下列命令安裝以此軟體包: maven.registry=在您專案的 pom.xml 檔設定此註冊中心: -maven.install=若要使用此套件,請在您 pom.xml 檔的 dependencies 段落加入下列內容: +maven.install=若要使用此軟體包,請在您 pom.xml 檔的 dependencies 段落加入下列內容: maven.install2=透過下列命令執行: -maven.download=透過下列命令下載相依性: -nuget.registry=透過下列命令設定此註冊中心: -nuget.install=執行下列命令以使用 NuGet 安裝此套件: +maven.download=透過下列命令下載相依性: +nuget.registry=透過下列命令設定此註冊中心: +nuget.install=執行下列命令以使用 NuGet 安裝此軟體包: nuget.dependency.framework=目標框架 npm.registry=在您專案的 .npmrc 檔設定此註冊中心: -npm.install=執行下列命令以使用 npm 安裝此套件: -npm.install2=或將它加到 package.json 檔: +npm.install=執行下列命令以使用 npm 安裝此軟體包: +npm.install2=或將它加到 package.json 檔: npm.dependencies=相依性 npm.dependencies.development=開發相依性 npm.dependencies.peer=Peer 相依性 npm.dependencies.optional=選用相依性 npm.details.tag=標籤 -pub.install=執行下列命令以使用 Dart 安裝此套件: +pub.install=執行下列命令以使用 Dart 安裝此軟體包: pypi.requires=需要 Python -pypi.install=執行下列命令以使用 pip 安裝此套件: +pypi.install=執行下列命令以使用 pip 安裝此軟體包: rpm.registry=透過下列命令設定此註冊中心: -rpm.install=執行下列命令安裝此套件: +rpm.install=執行下列命令以安裝此軟體包: rpm.repository=儲存庫資訊 rpm.repository.architectures=架構 -rubygems.install=執行下列命令以使用 gem 安裝此套件: +rubygems.install=執行下列命令以使用 gem 安裝此軟體包: rubygems.install2=或將它加到 Gemfile: rubygems.dependencies.runtime=執行階段相依性 rubygems.dependencies.development=開發相依性 rubygems.required.ruby=需要的 Ruby 版本 rubygems.required.rubygems=需要的 RubyGem 版本 swift.registry=透過下列命令設定此註冊中心: -swift.install=將此套件加入您的 Package.swift 檔: -swift.install2=並執行下列命令: +swift.install=將此軟體包加入您的 Package.swift 檔: +swift.install2=並執行下列命令: vagrant.install=執行下列命令以新增 Vagrant box: -settings.link=連結此套件到儲存庫 -settings.link.description=如果您將套件連結到儲存庫,該套件會顯示在儲存庫的套件清單。 +settings.link=連結此軟體包至儲存庫 +settings.link.description=如果您將軟體包連結至儲存庫,該軟體包會顯示在儲存庫的軟體包清單。 settings.link.select=選擇儲存庫 settings.link.button=更新儲存庫連結 settings.link.success=儲存庫連結更新成功。 settings.link.error=儲存庫連結更新失敗。 -settings.delete=刪除套件 -settings.delete.description=刪除套件是永久且不可還原的。 +settings.delete=刪除軟體包 +settings.delete.description=刪除軟體包是永久且不可還原的。 settings.delete.notice=您正要刪除 %s (%s),此動作是無法還原的,您確定嗎? -settings.delete.success=已刪除該套件。 -settings.delete.error=刪除套件失敗。 +settings.delete.success=已刪除該軟體包。 +settings.delete.error=軟體包刪除失敗。 owner.settings.cargo.title=Cargo Registry 索引 owner.settings.cargo.initialize=初始化索引 owner.settings.cargo.initialize.error=初始化 Cargo 索引失敗: %v @@ -3352,16 +3397,16 @@ owner.settings.cleanuprules.title=管理清理規則 owner.settings.cleanuprules.add=加入清理規則 owner.settings.cleanuprules.edit=編輯清理規則 owner.settings.cleanuprules.preview=預覽清理規則 -owner.settings.cleanuprules.preview.overview=已排定要移除 %d 個套件。 -owner.settings.cleanuprules.preview.none=清理規則不符合任何套件。 +owner.settings.cleanuprules.preview.overview=已排程移除 %d 個軟體包。 +owner.settings.cleanuprules.preview.none=清理規則不符合任何軟體包。 owner.settings.cleanuprules.enabled=已啟用 -owner.settings.cleanuprules.pattern_full_match=將比對規則套用到完整的套件名稱 +owner.settings.cleanuprules.pattern_full_match=將比對式樣套用到完整的軟體包名稱 owner.settings.cleanuprules.keep.title=符合這些規則的版本即使符合下面的刪除規則也會被保留。 owner.settings.cleanuprules.keep.count=保留最新的 -owner.settings.cleanuprules.keep.count.1=每個套件 1 個版本 -owner.settings.cleanuprules.keep.count.n=每個套件 %d 個版本 +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=Container 套件的最新版本總是會保留。 +owner.settings.cleanuprules.keep.pattern.container=總是保留 Container 軟體包的最新版本。 owner.settings.cleanuprules.remove.title=符合這些規則的版本將被移除,除非前述的規則要求保留它們。 owner.settings.cleanuprules.remove.days=移除早於天數的版本 owner.settings.cleanuprules.remove.pattern=移除版本的比對規則 @@ -3370,7 +3415,7 @@ owner.settings.cleanuprules.success.delete=已刪除清理規則。 owner.settings.chef.title=Chef Registry owner.settings.chef.keypair=產生密鑰組 debian.repository.components = 元件 -go.install = 從指令列安裝套件: +go.install = 使用命令列安裝軟體包: owner.settings.cleanuprules.none = 目前沒有任何清理規則。 [secrets] @@ -3378,7 +3423,7 @@ secrets=Secret description=Secret 會被傳給特定的 Action,其他情況無法讀取。 none=還沒有 Secret。 creation=加入 Secret -creation.name_placeholder=不區分大小寫,只能包含英文字母、數字、底線 ('_'),不能以 GITEA_ 或 GITHUB_ 開頭。 +creation.name_placeholder=不區分大小寫,只能包含英文字母、數字、底線 ('_'),不能以 GITEA_ 或 GITHUB_ 開頭 creation.value_placeholder=輸入任何內容,頭尾的空白都會被忽略。 creation.success=已新增 Secret「%s」。 creation.failed=加入 Secret 失敗。 @@ -3446,7 +3491,7 @@ workflow.disable_success=已成功停用工作流程「%s」。 workflow.enable=啟用工作流程 workflow.enable_success=已成功啟用工作流程「%s」。 -need_approval_desc=來自 Fork 儲存庫的合併請求需要核可才能執行工作流程。 +need_approval_desc=需要核可才能執行來自分叉儲存庫的合併請求工作流程。 variables.edit = 編輯變數 variables = 變數 variables.management = 變數管理 diff --git a/package-lock.json b/package-lock.json index 2ce271fe0c..dcfb6f75c9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "@citation-js/plugin-software-formats": "0.6.1", "@github/markdown-toolbar-element": "2.2.3", "@github/relative-time-element": "4.4.0", - "@github/text-expander-element": "2.6.1", + "@github/text-expander-element": "2.7.0", "@mcaptcha/vanilla-glue": "0.1.0-alpha-3", "@primer/octicons": "19.9.0", "add-asset-webpack-plugin": "2.0.1", @@ -41,7 +41,7 @@ "pdfobject": "2.3.0", "postcss": "8.4.38", "postcss-loader": "8.1.1", - "postcss-nesting": "12.1.4", + "postcss-nesting": "12.1.5", "pretty-ms": "9.0.0", "sortablejs": "1.15.2", "swagger-ui-dist": "5.17.12", @@ -86,15 +86,15 @@ "eslint-plugin-vue": "9.26.0", "eslint-plugin-vue-scoped-css": "2.8.0", "eslint-plugin-wc": "2.1.0", - "happy-dom": "14.11.0", - "markdownlint-cli": "0.40.0", + "happy-dom": "14.11.2", + "markdownlint-cli": "0.41.0", "postcss-html": "1.7.0", "stylelint": "16.5.0", "stylelint-declaration-block-no-ignored-properties": "2.8.0", "stylelint-declaration-strict-value": "1.10.4", "stylelint-value-no-unknown-custom-properties": "6.0.1", "svgo": "3.2.0", - "updates": "16.0.1", + "updates": "16.1.1", "vite-string-plugin": "1.3.1", "vitest": "1.6.0" }, @@ -1003,11 +1003,13 @@ "integrity": "sha512-CrI6oAecoahG7PF5dsgjdvlF5kCtusVMjg810EULD81TvnDsP+k/FRi/ClFubWLgBo4EGpr2EfvmumtqQFo7ow==" }, "node_modules/@github/text-expander-element": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@github/text-expander-element/-/text-expander-element-2.6.1.tgz", - "integrity": "sha512-i6krPGXJRABfKXut0WArFd365Je4PT0MljtDoXUoCOEp+lGrmdosDMxmO0EfOYc97jBn+Hd2XO1mMsuI5+fwmQ==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@github/text-expander-element/-/text-expander-element-2.7.0.tgz", + "integrity": "sha512-zeo7l2L91o6yuGHJfA1Xtpg6UgDuZGq0WCgplDwd+54pVIsNzwsynIo6oTjE03cCtqLQpdYRe1wSQxyKYZOoGw==", + "license": "MIT", "dependencies": { - "@github/combobox-nav": "^2.0.2" + "@github/combobox-nav": "^2.0.2", + "dom-input-range": "^1.1.3" } }, "node_modules/@humanwhocodes/config-array": { @@ -4810,6 +4812,15 @@ "node": ">=6.0.0" } }, + "node_modules/dom-input-range": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/dom-input-range/-/dom-input-range-1.1.5.tgz", + "integrity": "sha512-ITURvugfDoy8Wk8JC6NoI4dKyLPR4qbFnXJ+V+qVpQtTmDgT8HZjH2iNUIMiEU1kkdWEMLgDxYTSXJnPz9aeiA==", + "license": "MIT", + "workspaces": [ + "demos" + ] + }, "node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", @@ -6776,10 +6787,11 @@ } }, "node_modules/happy-dom": { - "version": "14.11.0", - "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-14.11.0.tgz", - "integrity": "sha512-vu25dY7YJqLuTG/3ADC0FZRRF0yNBp3q2K0YTN08opXdZi8V/YzIJDNJWFiCnDIuyc+RrCIE093+H5fa9Trlxg==", + "version": "14.11.2", + "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-14.11.2.tgz", + "integrity": "sha512-KUrwcT2GAVIGkFev287ude3n0BGGK3BWGltlVEPE8osMbDRU4zwKfcg6jUO7HkX1tAUU+kKt2g+LycmCH0Zwsg==", "dev": true, + "license": "MIT", "dependencies": { "entities": "^4.5.0", "webidl-conversions": "^7.0.0", @@ -8246,14 +8258,15 @@ } }, "node_modules/markdownlint-cli": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.40.0.tgz", - "integrity": "sha512-JXhI3dRQcaqwiFYpPz6VJ7aKYheD53GmTz9y4D/d0F1MbZDGOp9pqKlbOfUX/pHP/iAoeiE4wYRmk8/kjLakxA==", + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.41.0.tgz", + "integrity": "sha512-kp29tKrMKdn+xonfefjp3a/MsNzAd9c5ke0ydMEI9PR98bOjzglYN4nfMSaIs69msUf1DNkgevAIAPtK2SeX0Q==", "dev": true, + "license": "MIT", "dependencies": { - "commander": "~12.0.0", + "commander": "~12.1.0", "get-stdin": "~9.0.0", - "glob": "~10.3.12", + "glob": "~10.4.1", "ignore": "~5.3.1", "js-yaml": "^4.1.0", "jsonc-parser": "~3.2.1", @@ -8261,7 +8274,7 @@ "markdownlint": "~0.34.0", "minimatch": "~9.0.4", "run-con": "~1.3.2", - "toml": "~3.0.0" + "smol-toml": "~1.2.0" }, "bin": { "markdownlint": "markdownlint.js" @@ -8271,41 +8284,63 @@ } }, "node_modules/markdownlint-cli/node_modules/commander": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.0.0.tgz", - "integrity": "sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/markdownlint-cli/node_modules/glob": { - "version": "10.3.12", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", - "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", + "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.10.2" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/markdownlint-cli/node_modules/jackspeak": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.1.2.tgz", + "integrity": "sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/markdownlint-cli/node_modules/jsonc-parser": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/markdownlint-micromark": { "version": "0.1.9", @@ -8955,9 +8990,10 @@ } }, "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } @@ -9472,15 +9508,16 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-scurry": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", - "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -9870,9 +9907,9 @@ } }, "node_modules/postcss-nesting": { - "version": "12.1.4", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-12.1.4.tgz", - "integrity": "sha512-CcHOq94K137E+U4Ommu7pexcpp0Tjm24zl4UcqWs1oSLAr5cLI+jLrqQ5h/bdjhMX6cMbzunyustVNnvrzF8Zg==", + "version": "12.1.5", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-12.1.5.tgz", + "integrity": "sha512-N1NgI1PDCiAGWPTYrwqm8wpjv0bgDmkYHH72pNsqTCv9CObxjxftdYu6AKtGN+pnJa7FQjMm3v4sp8QJbFsYdQ==", "funding": [ { "type": "github", @@ -9883,10 +9920,11 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "@csstools/selector-resolve-nested": "^1.1.0", "@csstools/selector-specificity": "^3.1.1", - "postcss-selector-parser": "^6.0.13" + "postcss-selector-parser": "^6.1.0" }, "engines": { "node": "^14 || ^16 || >=18" @@ -9944,9 +9982,10 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", - "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", + "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", + "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -10810,6 +10849,17 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, + "node_modules/smol-toml": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.2.0.tgz", + "integrity": "sha512-KObxdQANC/xje3OoatMbSwQf2XAvJ0RbK+4nmQRszFNZptbNRnMWqbLF/zb4sMi9xJ6HNyhWXeuZ9zC/I/XY7w==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18", + "pnpm": ">= 9" + } + }, "node_modules/solid-js": { "version": "1.8.16", "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.8.16.tgz", @@ -11831,12 +11881,6 @@ "resolved": "https://registry.npmjs.org/toastify-js/-/toastify-js-1.12.0.tgz", "integrity": "sha512-HeMHCO9yLPvP9k0apGSdPUWrUbLnxUKNFzgUoZp1PHCLploIX/4DSQ7V8H25ef+h4iO9n0he7ImfcndnN6nDrQ==" }, - "node_modules/toml": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", - "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==", - "dev": true - }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -12115,10 +12159,11 @@ } }, "node_modules/updates": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/updates/-/updates-16.0.1.tgz", - "integrity": "sha512-If3NQKzGcA3aVgz2VyOXqQ+4uqYjPUPqh2PeZPtD+OKT4CTmxRYqoyFO+T3nwfccy4SiWy5AabWrBXXhVQ89Aw==", + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/updates/-/updates-16.1.1.tgz", + "integrity": "sha512-h0Qtbmd9RCi6+99D5o7ACq4h7GxdYjeHFlxd4s0iO3lUOUDo1VnOsbNNIyjHpieVEctaEm/zoEjVggCgAcO/vg==", "dev": true, + "license": "BSD-2-Clause", "bin": { "updates": "dist/updates.js" }, diff --git a/package.json b/package.json index b8b37fefde..cd89ca3c5f 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "@citation-js/plugin-software-formats": "0.6.1", "@github/markdown-toolbar-element": "2.2.3", "@github/relative-time-element": "4.4.0", - "@github/text-expander-element": "2.6.1", + "@github/text-expander-element": "2.7.0", "@mcaptcha/vanilla-glue": "0.1.0-alpha-3", "@primer/octicons": "19.9.0", "add-asset-webpack-plugin": "2.0.1", @@ -40,7 +40,7 @@ "pdfobject": "2.3.0", "postcss": "8.4.38", "postcss-loader": "8.1.1", - "postcss-nesting": "12.1.4", + "postcss-nesting": "12.1.5", "pretty-ms": "9.0.0", "sortablejs": "1.15.2", "swagger-ui-dist": "5.17.12", @@ -85,15 +85,15 @@ "eslint-plugin-vue": "9.26.0", "eslint-plugin-vue-scoped-css": "2.8.0", "eslint-plugin-wc": "2.1.0", - "happy-dom": "14.11.0", - "markdownlint-cli": "0.40.0", + "happy-dom": "14.11.2", + "markdownlint-cli": "0.41.0", "postcss-html": "1.7.0", "stylelint": "16.5.0", "stylelint-declaration-block-no-ignored-properties": "2.8.0", "stylelint-declaration-strict-value": "1.10.4", "stylelint-value-no-unknown-custom-properties": "6.0.1", "svgo": "3.2.0", - "updates": "16.0.1", + "updates": "16.1.1", "vite-string-plugin": "1.3.1", "vitest": "1.6.0" }, diff --git a/poetry.lock b/poetry.lock index 277775e50c..88a12b6a69 100644 --- a/poetry.lock +++ b/poetry.lock @@ -16,13 +16,13 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} [[package]] name = "codespell" -version = "2.2.6" +version = "2.3.0" description = "Codespell" optional = false python-versions = ">=3.8" files = [ - {file = "codespell-2.2.6-py3-none-any.whl", hash = "sha256:9ee9a3e5df0990604013ac2a9f22fa8e57669c827124a2e961fe8a1da4cacc07"}, - {file = "codespell-2.2.6.tar.gz", hash = "sha256:a8c65d8eb3faa03deabab6b3bbe798bea72e1799c7e9e955d57eca4096abcff9"}, + {file = "codespell-2.3.0-py3-none-any.whl", hash = "sha256:a9c7cef2501c9cfede2110fd6d4e5e62296920efe9abfb84648df866e47f58d1"}, + {file = "codespell-2.3.0.tar.gz", hash = "sha256:360c7d10f75e65f67bad720af7007e1060a5d395670ec11a7ed1fed9dd17471f"}, ] [package.extras] diff --git a/release-notes/8.0.0/feat/3870.md b/release-notes/8.0.0/feat/3870.md new file mode 100644 index 0000000000..497ba19c5d --- /dev/null +++ b/release-notes/8.0.0/feat/3870.md @@ -0,0 +1 @@ +Use CSS-native pattern for image diff background, add dark theme support diff --git a/release-notes/8.0.0/fix/3904.md b/release-notes/8.0.0/fix/3904.md new file mode 100644 index 0000000000..f1a934081b --- /dev/null +++ b/release-notes/8.0.0/fix/3904.md @@ -0,0 +1 @@ +- a v7.0.0 regression causing `[admin].SEND_NOTIFICATION_EMAIL_ON_NEW_USER=true` to always be ignored. diff --git a/release-notes/8.0.0/fix/3935.md b/release-notes/8.0.0/fix/3935.md new file mode 100644 index 0000000000..73ba10a6dc --- /dev/null +++ b/release-notes/8.0.0/fix/3935.md @@ -0,0 +1 @@ +- Fixed an issue where migrated activities (such as reviews) were mapped to the user who initiated the migration rather than the Ghost user, if the external user could not be mapped to a local one. This mapping mismatch led to internal server errors in some cases (forgejo/forgejo#3860). diff --git a/release-notes/8.0.0/perf/3865.md b/release-notes/8.0.0/perf/3865.md new file mode 100644 index 0000000000..88860c7154 --- /dev/null +++ b/release-notes/8.0.0/perf/3865.md @@ -0,0 +1 @@ +Attempt to speed up user deletion when using mariadb 10 (the subquery took advantage of the available index starting with mariadb 11). diff --git a/routers/api/v1/repo/migrate.go b/routers/api/v1/repo/migrate.go index f246b08c0a..14c8c01f4e 100644 --- a/routers/api/v1/repo/migrate.go +++ b/routers/api/v1/repo/migrate.go @@ -175,7 +175,7 @@ func Migrate(ctx *context.APIContext) { Description: opts.Description, OriginalURL: form.CloneAddr, GitServiceType: gitServiceType, - IsPrivate: opts.Private, + IsPrivate: opts.Private || setting.Repository.ForcePrivate, IsMirror: opts.Mirror, Status: repo_model.RepositoryBeingMigrated, }) diff --git a/routers/api/v1/repo/repo.go b/routers/api/v1/repo/repo.go index 08bc86eed8..7c0289d4a0 100644 --- a/routers/api/v1/repo/repo.go +++ b/routers/api/v1/repo/repo.go @@ -252,7 +252,7 @@ func CreateUserRepo(ctx *context.APIContext, owner *user_model.User, opt api.Cre Gitignores: opt.Gitignores, License: opt.License, Readme: opt.Readme, - IsPrivate: opt.Private, + IsPrivate: opt.Private || setting.Repository.ForcePrivate, AutoInit: opt.AutoInit, DefaultBranch: opt.DefaultBranch, TrustModel: repo_model.ToTrustModel(opt.TrustModel), @@ -364,7 +364,7 @@ func Generate(ctx *context.APIContext) { Name: form.Name, DefaultBranch: form.DefaultBranch, Description: form.Description, - Private: form.Private, + Private: form.Private || setting.Repository.ForcePrivate, GitContent: form.GitContent, Topics: form.Topics, GitHooks: form.GitHooks, diff --git a/routers/web/auth/oauth.go b/routers/web/auth/oauth.go index 61c580cae3..72473701de 100644 --- a/routers/web/auth/oauth.go +++ b/routers/web/auth/oauth.go @@ -542,20 +542,45 @@ func GrantApplicationOAuth(ctx *context.Context) { ctx.Error(http.StatusBadRequest) return } + + if !form.Granted { + handleAuthorizeError(ctx, AuthorizeError{ + State: form.State, + ErrorDescription: "the request is denied", + ErrorCode: ErrorCodeAccessDenied, + }, form.RedirectURI) + return + } + app, err := auth.GetOAuth2ApplicationByClientID(ctx, form.ClientID) if err != nil { ctx.ServerError("GetOAuth2ApplicationByClientID", err) return } - grant, err := app.CreateGrant(ctx, ctx.Doer.ID, form.Scope) + grant, err := app.GetGrantByUserID(ctx, ctx.Doer.ID) if err != nil { + handleServerError(ctx, form.State, form.RedirectURI) + return + } + if grant == nil { + grant, err = app.CreateGrant(ctx, ctx.Doer.ID, form.Scope) + if err != nil { + handleAuthorizeError(ctx, AuthorizeError{ + State: form.State, + ErrorDescription: "cannot create grant for user", + ErrorCode: ErrorCodeServerError, + }, form.RedirectURI) + return + } + } else if grant.Scope != form.Scope { handleAuthorizeError(ctx, AuthorizeError{ State: form.State, - ErrorDescription: "cannot create grant for user", + ErrorDescription: "a grant exists with different scope", ErrorCode: ErrorCodeServerError, }, form.RedirectURI) return } + if len(form.Nonce) > 0 { err := grant.SetNonce(ctx, form.Nonce) if err != nil { diff --git a/routers/web/repo/compare.go b/routers/web/repo/compare.go index 2a9f60891e..088e5150f6 100644 --- a/routers/web/repo/compare.go +++ b/routers/web/repo/compare.go @@ -931,7 +931,7 @@ func ExcerptBlob(ctx *context.Context) { } } ctx.Data["section"] = section - ctx.Data["FileNameHash"] = base.EncodeSha1(filePath) + ctx.Data["FileNameHash"] = git.HashFilePathForWebUI(filePath) ctx.Data["AfterCommitID"] = commitID ctx.Data["Anchor"] = anchor ctx.HTML(http.StatusOK, tplBlobExcerpt) diff --git a/routers/web/repo/repo.go b/routers/web/repo/repo.go index abd68630a4..1d599c5cfb 100644 --- a/routers/web/repo/repo.go +++ b/routers/web/repo/repo.go @@ -248,7 +248,7 @@ func CreatePost(ctx *context.Context) { opts := repo_service.GenerateRepoOptions{ Name: form.RepoName, Description: form.Description, - Private: form.Private, + Private: form.Private || setting.Repository.ForcePrivate, GitContent: form.GitContent, Topics: form.Topics, GitHooks: form.GitHooks, diff --git a/routers/web/web.go b/routers/web/web.go index 0ab25fd7e3..a65994c246 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -57,6 +57,8 @@ import ( "github.com/prometheus/client_golang/prometheus" ) +var GzipMinSize = gzhttp.DefaultMinSize + // optionsCorsHandler return a http handler which sets CORS options if enabled by config, it blocks non-CORS OPTIONS requests. func optionsCorsHandler() func(next http.Handler) http.Handler { var corsHandler func(next http.Handler) http.Handler @@ -242,7 +244,7 @@ func Routes() *web.Route { var mid []any if setting.EnableGzip { - wrapper, err := gzhttp.NewWrapper(gzhttp.RandomJitter(32, 0, false)) + wrapper, err := gzhttp.NewWrapper(gzhttp.RandomJitter(32, 0, false), gzhttp.MinSize(GzipMinSize)) if err != nil { log.Fatal("gzhttp.NewWrapper failed: %v", err) } diff --git a/services/automerge/automerge.go b/services/automerge/automerge.go index bd1317c7f4..10f3c28d56 100644 --- a/services/automerge/automerge.go +++ b/services/automerge/automerge.go @@ -22,6 +22,7 @@ import ( "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/process" "code.gitea.io/gitea/modules/queue" + notify_service "code.gitea.io/gitea/services/notify" pull_service "code.gitea.io/gitea/services/pull" ) @@ -30,6 +31,8 @@ var prAutoMergeQueue *queue.WorkerPoolQueue[string] // Init runs the task queue to that handles auto merges func Init() error { + notify_service.RegisterNotifier(NewNotifier()) + prAutoMergeQueue = queue.CreateUniqueQueue(graceful.GetManager().ShutdownContext(), "pr_auto_merge", handler) if prAutoMergeQueue == nil { return fmt.Errorf("unable to create pr_auto_merge queue") @@ -47,7 +50,7 @@ func handler(items ...string) []string { log.Error("could not parse data from pr_auto_merge queue (%v): %v", s, err) continue } - handlePull(id, sha) + handlePullRequestAutoMerge(id, sha) } return nil } @@ -62,16 +65,6 @@ func addToQueue(pr *issues_model.PullRequest, sha string) { // ScheduleAutoMerge if schedule is false and no error, pull can be merged directly func ScheduleAutoMerge(ctx context.Context, doer *user_model.User, pull *issues_model.PullRequest, style repo_model.MergeStyle, message string) (scheduled bool, err error) { err = db.WithTx(ctx, func(ctx context.Context) error { - lastCommitStatus, err := pull_service.GetPullRequestCommitStatusState(ctx, pull) - if err != nil { - return err - } - - // we don't need to schedule - if lastCommitStatus.IsSuccess() { - return nil - } - if err := pull_model.ScheduleAutoMerge(ctx, doer, pull.ID, style, message); err != nil { return err } @@ -95,8 +88,8 @@ func RemoveScheduledAutoMerge(ctx context.Context, doer *user_model.User, pull * }) } -// MergeScheduledPullRequest merges a previously scheduled pull request when all checks succeeded -func MergeScheduledPullRequest(ctx context.Context, sha string, repo *repo_model.Repository) error { +// StartPRCheckAndAutoMergeBySHA start an automerge check and auto merge task for all pull requests of repository and SHA +func StartPRCheckAndAutoMergeBySHA(ctx context.Context, sha string, repo *repo_model.Repository) error { pulls, err := getPullRequestsByHeadSHA(ctx, sha, repo, func(pr *issues_model.PullRequest) bool { return !pr.HasMerged && pr.CanAutoMerge() }) @@ -111,6 +104,32 @@ func MergeScheduledPullRequest(ctx context.Context, sha string, repo *repo_model return nil } +// StartPRCheckAndAutoMerge start an automerge check and auto merge task for a pull request +func StartPRCheckAndAutoMerge(ctx context.Context, pull *issues_model.PullRequest) { + if pull == nil || pull.HasMerged || !pull.CanAutoMerge() { + return + } + + if err := pull.LoadBaseRepo(ctx); err != nil { + log.Error("LoadBaseRepo: %v", err) + return + } + + gitRepo, err := gitrepo.OpenRepository(ctx, pull.BaseRepo) + if err != nil { + log.Error("OpenRepository: %v", err) + return + } + defer gitRepo.Close() + commitID, err := gitRepo.GetRefCommitID(pull.GetGitRefName()) + if err != nil { + log.Error("GetRefCommitID: %v", err) + return + } + + addToQueue(pull, commitID) +} + func getPullRequestsByHeadSHA(ctx context.Context, sha string, repo *repo_model.Repository, filter func(*issues_model.PullRequest) bool) (map[int64]*issues_model.PullRequest, error) { gitRepo, err := gitrepo.OpenRepository(ctx, repo) if err != nil { @@ -161,7 +180,8 @@ func getPullRequestsByHeadSHA(ctx context.Context, sha string, repo *repo_model. return pulls, nil } -func handlePull(pullID int64, sha string) { +// handlePullRequestAutoMerge merge the pull request if all checks are successful +func handlePullRequestAutoMerge(pullID int64, sha string) { ctx, _, finished := process.GetManager().AddContext(graceful.GetManager().HammerContext(), fmt.Sprintf("Handle AutoMerge of PR[%d] with sha[%s]", pullID, sha)) defer finished() @@ -182,24 +202,50 @@ func handlePull(pullID int64, sha string) { return } + if err = pr.LoadBaseRepo(ctx); err != nil { + log.Error("%-v LoadBaseRepo: %v", pr, err) + return + } + + // check the sha is the same as pull request head commit id + baseGitRepo, err := gitrepo.OpenRepository(ctx, pr.BaseRepo) + if err != nil { + log.Error("OpenRepository: %v", err) + return + } + defer baseGitRepo.Close() + + headCommitID, err := baseGitRepo.GetRefCommitID(pr.GetGitRefName()) + if err != nil { + log.Error("GetRefCommitID: %v", err) + return + } + if headCommitID != sha { + log.Warn("Head commit id of auto merge %-v does not match sha [%s], it may means the head branch has been updated. Just ignore this request because a new request expected in the queue", pr, sha) + return + } + // Get all checks for this pr // We get the latest sha commit hash again to handle the case where the check of a previous push // did not succeed or was not finished yet. - if err = pr.LoadHeadRepo(ctx); err != nil { log.Error("%-v LoadHeadRepo: %v", pr, err) return } - headGitRepo, err := gitrepo.OpenRepository(ctx, pr.HeadRepo) - if err != nil { - log.Error("OpenRepository %-v: %v", pr.HeadRepo, err) - return + var headGitRepo *git.Repository + if pr.BaseRepoID == pr.HeadRepoID { + headGitRepo = baseGitRepo + } else { + headGitRepo, err = gitrepo.OpenRepository(ctx, pr.HeadRepo) + if err != nil { + log.Error("OpenRepository %-v: %v", pr.HeadRepo, err) + return + } + defer headGitRepo.Close() } - defer headGitRepo.Close() headBranchExist := headGitRepo.IsBranchExist(pr.HeadBranch) - if pr.HeadRepo == nil || !headBranchExist { log.Warn("Head branch of auto merge %-v does not exist [HeadRepoID: %d, Branch: %s]", pr, pr.HeadRepoID, pr.HeadBranch) return @@ -238,25 +284,11 @@ func handlePull(pullID int64, sha string) { return } - var baseGitRepo *git.Repository - if pr.BaseRepoID == pr.HeadRepoID { - baseGitRepo = headGitRepo - } else { - if err = pr.LoadBaseRepo(ctx); err != nil { - log.Error("%-v LoadBaseRepo: %v", pr, err) - return - } - - baseGitRepo, err = gitrepo.OpenRepository(ctx, pr.BaseRepo) - if err != nil { - log.Error("OpenRepository %-v: %v", pr.BaseRepo, err) - return - } - defer baseGitRepo.Close() - } - if err := pull_service.Merge(ctx, pr, doer, baseGitRepo, scheduledPRM.MergeStyle, "", scheduledPRM.Message, true); err != nil { log.Error("pull_service.Merge: %v", err) + // FIXME: if merge failed, we should display some error message to the pull request page. + // The resolution is add a new column on automerge table named `error_message` to store the error message and displayed + // on the pull request page. But this should not be finished in a bug fix PR which will be backport to release branch. return } } diff --git a/services/automerge/notify.go b/services/automerge/notify.go new file mode 100644 index 0000000000..cb078214f6 --- /dev/null +++ b/services/automerge/notify.go @@ -0,0 +1,46 @@ +// Copyright 2024 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package automerge + +import ( + "context" + + issues_model "code.gitea.io/gitea/models/issues" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/log" + notify_service "code.gitea.io/gitea/services/notify" +) + +type automergeNotifier struct { + notify_service.NullNotifier +} + +var _ notify_service.Notifier = &automergeNotifier{} + +// NewNotifier create a new automergeNotifier notifier +func NewNotifier() notify_service.Notifier { + return &automergeNotifier{} +} + +func (n *automergeNotifier) PullRequestReview(ctx context.Context, pr *issues_model.PullRequest, review *issues_model.Review, comment *issues_model.Comment, mentions []*user_model.User) { + // as a missing / blocking reviews could have blocked a pending automerge let's recheck + if review.Type == issues_model.ReviewTypeApprove { + if err := StartPRCheckAndAutoMergeBySHA(ctx, review.CommitID, pr.BaseRepo); err != nil { + log.Error("StartPullRequestAutoMergeCheckBySHA: %v", err) + } + } +} + +func (n *automergeNotifier) PullReviewDismiss(ctx context.Context, doer *user_model.User, review *issues_model.Review, comment *issues_model.Comment) { + if err := review.LoadIssue(ctx); err != nil { + log.Error("LoadIssue: %v", err) + return + } + if err := review.Issue.LoadPullRequest(ctx); err != nil { + log.Error("LoadPullRequest: %v", err) + return + } + // as reviews could have blocked a pending automerge let's recheck + StartPRCheckAndAutoMerge(ctx, review.Issue.PullRequest) +} diff --git a/services/forms/user_form.go b/services/forms/user_form.go index 4e603a3115..0b7bea4638 100644 --- a/services/forms/user_form.go +++ b/services/forms/user_form.go @@ -162,6 +162,7 @@ func (f *AuthorizationForm) Validate(req *http.Request, errs binding.Errors) bin // GrantApplicationForm form for authorizing oauth2 clients type GrantApplicationForm struct { ClientID string `binding:"Required"` + Granted bool RedirectURI string State string Scope string diff --git a/services/gitdiff/gitdiff.go b/services/gitdiff/gitdiff.go index d9dbeedee5..c4430339e2 100644 --- a/services/gitdiff/gitdiff.go +++ b/services/gitdiff/gitdiff.go @@ -23,7 +23,6 @@ import ( pull_model "code.gitea.io/gitea/models/pull" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/analyze" - "code.gitea.io/gitea/modules/base" "code.gitea.io/gitea/modules/charset" "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/highlight" @@ -742,7 +741,7 @@ parsingLoop: diffLineTypeBuffers[DiffLineAdd] = new(bytes.Buffer) diffLineTypeBuffers[DiffLineDel] = new(bytes.Buffer) for _, f := range diff.Files { - f.NameHash = base.EncodeSha1(f.Name) + f.NameHash = git.HashFilePathForWebUI(f.Name) for _, buffer := range diffLineTypeBuffers { buffer.Reset() diff --git a/services/mailer/mail.go b/services/mailer/mail.go index b04925881d..d86607295a 100644 --- a/services/mailer/mail.go +++ b/services/mailer/mail.go @@ -403,7 +403,7 @@ func generateAdditionalHeaders(ctx *mailCommentContext, reason string, recipient // https://datatracker.ietf.org/doc/html/rfc2369 "List-Archive": fmt.Sprintf("<%s>", repo.HTMLURL()), - "X-Mailer": "Gitea", + "X-Mailer": "Forgejo", "X-Gitea-Reason": reason, "X-Gitea-Sender": ctx.Doer.Name, "X-Gitea-Recipient": recipient.Name, @@ -415,8 +415,8 @@ func generateAdditionalHeaders(ctx *mailCommentContext, reason string, recipient "X-Gitea-Issue-Link": ctx.Issue.HTMLURL(), "X-Forgejo-Reason": reason, - "X-Forgejo-Sender": ctx.Doer.DisplayName(), - "X-Forgejo-Recipient": recipient.DisplayName(), + "X-Forgejo-Sender": ctx.Doer.Name, + "X-Forgejo-Recipient": recipient.Name, "X-Forgejo-Recipient-Address": recipient.Email, "X-Forgejo-Repository": repo.Name, "X-Forgejo-Repository-Path": repo.FullName(), diff --git a/services/mailer/mail_test.go b/services/mailer/mail_test.go index ed972dbb99..8fa45fd593 100644 --- a/services/mailer/mail_test.go +++ b/services/mailer/mail_test.go @@ -360,6 +360,7 @@ func TestGenerateAdditionalHeaders(t *testing.T) { expected := map[string]string{ "List-ID": "user2/repo1 ", "List-Archive": "", + "X-Mailer": "Forgejo", "X-Gitea-Reason": "dummy-reason", "X-Gitea-Sender": "user2", "X-Gitea-Recipient": "test", @@ -369,6 +370,8 @@ func TestGenerateAdditionalHeaders(t *testing.T) { "X-Gitea-Repository-Link": "https://try.gitea.io/user2/repo1", "X-Gitea-Issue-ID": "1", "X-Gitea-Issue-Link": "https://try.gitea.io/user2/repo1/issues/1", + "X-Forgejo-Sender": "user2", + "X-Forgejo-Recipient": "test", } for key, value := range expected { diff --git a/services/migrations/gitea_uploader.go b/services/migrations/gitea_uploader.go index 1704b2330e..3ba4ca203b 100644 --- a/services/migrations/gitea_uploader.go +++ b/services/migrations/gitea_uploader.go @@ -107,7 +107,7 @@ func (g *GiteaLocalUploader) CreateRepo(repo *base.Repository, opts base.Migrate Description: repo.Description, OriginalURL: repo.OriginalURL, GitServiceType: opts.GitServiceType, - IsPrivate: opts.Private, + IsPrivate: opts.Private || setting.Repository.ForcePrivate, IsMirror: opts.Mirror, Status: repo_model.RepositoryBeingMigrated, }) @@ -996,7 +996,7 @@ func (g *GiteaLocalUploader) remapUser(source user_model.ExternalUserMigrated, t if userID > 0 { return target.RemapExternalUser("", 0, userID) } - return target.RemapExternalUser(source.GetExternalName(), source.GetExternalID(), g.doer.ID) + return target.RemapExternalUser(source.GetExternalName(), source.GetExternalID(), user_model.GhostUserID) } func (g *GiteaLocalUploader) remapLocalUser(source user_model.ExternalUserMigrated) (int64, error) { diff --git a/services/migrations/gitea_uploader_test.go b/services/migrations/gitea_uploader_test.go index e98582f31a..35da8290c8 100644 --- a/services/migrations/gitea_uploader_test.go +++ b/services/migrations/gitea_uploader_test.go @@ -145,24 +145,24 @@ func TestGiteaUploadRemapLocalUser(t *testing.T) { // // The externalID does not match any existing user, everything - // belongs to the doer + // belongs to the Ghost user // target := repo_model.Release{} uploader.userMap = make(map[int64]int64) err := uploader.remapUser(&source, &target) assert.NoError(t, err) - assert.EqualValues(t, doer.ID, target.GetUserID()) + assert.EqualValues(t, user_model.GhostUserID, target.GetUserID()) // // The externalID matches a known user but the name does not match, - // everything belongs to the doer + // everything belongs to the Ghost user // source.PublisherID = user.ID target = repo_model.Release{} uploader.userMap = make(map[int64]int64) err = uploader.remapUser(&source, &target) assert.NoError(t, err) - assert.EqualValues(t, doer.ID, target.GetUserID()) + assert.EqualValues(t, user_model.GhostUserID, target.GetUserID()) // // The externalID and externalName match an existing user, everything @@ -195,13 +195,13 @@ func TestGiteaUploadRemapExternalUser(t *testing.T) { // // When there is no user linked to the external ID, the migrated data is authored - // by the doer + // by the Ghost user // uploader.userMap = make(map[int64]int64) target := repo_model.Release{} err := uploader.remapUser(&source, &target) assert.NoError(t, err) - assert.EqualValues(t, doer.ID, target.GetUserID()) + assert.EqualValues(t, user_model.GhostUserID, target.GetUserID()) // // Link the external ID to an existing user diff --git a/services/repository/commitstatus/commitstatus.go b/services/repository/commitstatus/commitstatus.go index f0f8450b03..5c630201d2 100644 --- a/services/repository/commitstatus/commitstatus.go +++ b/services/repository/commitstatus/commitstatus.go @@ -117,7 +117,7 @@ func CreateCommitStatus(ctx context.Context, repo *repo_model.Repository, creato } if status.State.IsSuccess() { - if err := automerge.MergeScheduledPullRequest(ctx, sha, repo); err != nil { + if err := automerge.StartPRCheckAndAutoMergeBySHA(ctx, sha, repo); err != nil { return fmt.Errorf("MergeScheduledPullRequest[repo_id: %d, user_id: %d, sha: %s]: %w", repo.ID, creator.ID, sha, err) } } diff --git a/services/repository/delete.go b/services/repository/delete.go index 21d9ebcf0b..6e84194750 100644 --- a/services/repository/delete.go +++ b/services/repository/delete.go @@ -26,6 +26,7 @@ import ( actions_module "code.gitea.io/gitea/modules/actions" "code.gitea.io/gitea/modules/lfs" "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/storage" "xorm.io/builder" @@ -125,9 +126,25 @@ func DeleteRepositoryDirectly(ctx context.Context, doer *user_model.User, repoID return err } - if _, err := db.GetEngine(ctx).In("hook_id", builder.Select("id").From("webhook").Where(builder.Eq{"webhook.repo_id": repo.ID})). - Delete(&webhook.HookTask{}); err != nil { - return err + if setting.Database.Type.IsMySQL() { + // mariadb:10 does not use the hook_task KEY when using IN. + // https://codeberg.org/forgejo/forgejo/issues/3678 + // + // Version 11 does support it, but is not available in debian yet. + // Version 11.4 LTS is not available yet (stable should be released mid 2024 https://mariadb.org/mariadb/all-releases/) + + // Sqlite does not support the DELETE *** FROM *** syntax + // https://stackoverflow.com/q/24511153/3207406 + + // in the meantime, use a dedicated query for mysql... + if _, err := db.Exec(ctx, "DELETE `hook_task` FROM `hook_task` INNER JOIN `webhook` ON `webhook`.id = `hook_task`.hook_id WHERE `webhook`.repo_id = ?", repo.ID); err != nil { + return err + } + } else { + if _, err := db.GetEngine(ctx).In("hook_id", builder.Select("id").From("webhook").Where(builder.Eq{"webhook.repo_id": repo.ID})). + Delete(&webhook.HookTask{}); err != nil { + return err + } } if err := db.DeleteBeans(ctx, diff --git a/services/repository/repository.go b/services/repository/repository.go index 742d93dd2e..116e24151b 100644 --- a/services/repository/repository.go +++ b/services/repository/repository.go @@ -91,7 +91,7 @@ func PushCreateRepo(ctx context.Context, authUser, owner *user_model.User, repoN repo, err := CreateRepository(ctx, authUser, owner, CreateRepoOptions{ Name: repoName, - IsPrivate: setting.Repository.DefaultPushCreatePrivate, + IsPrivate: setting.Repository.DefaultPushCreatePrivate || setting.Repository.ForcePrivate, }) if err != nil { return nil, err diff --git a/services/task/task.go b/services/task/task.go index e15cab7b3c..c90ee91270 100644 --- a/services/task/task.go +++ b/services/task/task.go @@ -107,7 +107,7 @@ func CreateMigrateTask(ctx context.Context, doer, u *user_model.User, opts base. Description: opts.Description, OriginalURL: opts.OriginalURL, GitServiceType: opts.GitServiceType, - IsPrivate: opts.Private, + IsPrivate: opts.Private || setting.Repository.ForcePrivate, IsMirror: opts.Mirror, Status: repo_model.RepositoryBeingMigrated, }) diff --git a/services/webhook/default.go b/services/webhook/default.go index ea877698c8..089ff8bae3 100644 --- a/services/webhook/default.go +++ b/services/webhook/default.go @@ -77,7 +77,7 @@ func (defaultHandler) NewRequest(ctx context.Context, w *webhook_model.Webhook, // see https://codeberg.org/codeberg/community/issues/1556 payloadContent, err = substituteRefShortName(payloadContent) if err != nil { - return nil, nil, fmt.Errorf("could not substiture ref: %w", err) + return nil, nil, fmt.Errorf("could not substitute ref: %w", err) } } diff --git a/tailwind.config.js b/tailwind.config.js index d49e9d7a1c..94dfdbced4 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -66,7 +66,7 @@ export default { 'xl': '12px', '2xl': '16px', '3xl': '24px', - 'full': 'var(--border-radius-circle)', // 50% + 'full': 'var(--border-radius-full)', }, fontFamily: { sans: 'var(--fonts-regular)', diff --git a/templates/repo/branch/list.tmpl b/templates/repo/branch/list.tmpl index 18ec95df24..6a0b726b67 100644 --- a/templates/repo/branch/list.tmpl +++ b/templates/repo/branch/list.tmpl @@ -87,7 +87,7 @@ {{if .DBBranch.IsDeleted}}
- {{.DBBranch.Name}} + {{.DBBranch.Name}}

{{ctx.Locale.Tr "repo.branch.deleted_by" .DBBranch.DeletedBy.Name}} {{TimeSinceUnix .DBBranch.DeletedUnix ctx.Locale}}

diff --git a/templates/repo/branch_dropdown.tmpl b/templates/repo/branch_dropdown.tmpl index 707f670e97..dcb1792485 100644 --- a/templates/repo/branch_dropdown.tmpl +++ b/templates/repo/branch_dropdown.tmpl @@ -71,7 +71,7 @@ {{/* show dummy elements before Vue componment is mounted, this code must match the code in BranchTagSelector.vue */}}