mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2026-01-17 07:23:05 +00:00
Compare commits
85 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3d92c96a94 | ||
|
|
a0f2289bb4 | ||
|
|
4508a047f9 | ||
|
|
a5b4503e2b | ||
|
|
f42870ceda | ||
|
|
4944f1db2a | ||
|
|
df370dd0be | ||
|
|
1da28e9207 | ||
|
|
c385564539 | ||
|
|
f1fe6cb6f5 | ||
|
|
777416e3cc | ||
|
|
2bbb6cc4e6 | ||
|
|
0479ef3447 | ||
|
|
a060a7f05a | ||
|
|
908d949e49 | ||
|
|
b68368d57c | ||
|
|
e538f05acc | ||
|
|
b5e91db9c9 | ||
|
|
841f77f3f1 | ||
|
|
fdb56d5944 | ||
|
|
3e27c75454 | ||
|
|
11a5ff15bf | ||
|
|
5f757d9e83 | ||
|
|
aaf7960a77 | ||
|
|
29ed531701 | ||
|
|
f50878b073 | ||
|
|
1b13b4dc25 | ||
|
|
1a9985596b | ||
|
|
9a39398948 | ||
|
|
c6575b06e2 | ||
|
|
bb58a801c3 | ||
|
|
94d67437bd | ||
|
|
287feb3e5a | ||
|
|
8645c12d62 | ||
|
|
6df07ecd5c | ||
|
|
32fbe0dd2e | ||
|
|
dfdcbaf194 | ||
|
|
f1a497d3c1 | ||
|
|
8ac5410a62 | ||
|
|
cb0845cd3e | ||
|
|
a50968d0de | ||
|
|
3bc1ae21ac | ||
|
|
b8448e7cde | ||
|
|
fc14793f7d | ||
|
|
fa1a2ba669 | ||
|
|
afbf1efe02 | ||
|
|
449b5bf10e | ||
|
|
8885844e72 | ||
|
|
a2068a47ce | ||
|
|
2c26525a9a | ||
|
|
6e26d31473 | ||
|
|
6e60d538bd | ||
|
|
2022feee7d | ||
|
|
494d5625e2 | ||
|
|
c7f2d7394b | ||
|
|
76afa21433 | ||
|
|
d7e08cfb8c | ||
|
|
714b88f8b2 | ||
|
|
d59c49ec52 | ||
|
|
48914b9465 | ||
|
|
f7603e7356 | ||
|
|
0fda75e08e | ||
|
|
08f37b5771 | ||
|
|
b1b99d5c70 | ||
|
|
5a622f7640 | ||
|
|
4dbd9c7261 | ||
|
|
9ff712ee6a | ||
|
|
01f0dbde9e | ||
|
|
83e7ff3ba2 | ||
|
|
72a38d19ac | ||
|
|
72faa337d0 | ||
|
|
65189bdb3e | ||
|
|
d6d4033a19 | ||
|
|
80fcbf165c | ||
|
|
2d3d5048d6 | ||
|
|
029a493779 | ||
|
|
877726a2bf | ||
|
|
6755ff1631 | ||
|
|
72abb7079b | ||
|
|
7a3fcbabf2 | ||
|
|
a674198198 | ||
|
|
d0b820039d | ||
|
|
d452207e50 | ||
|
|
010366d641 | ||
|
|
391f9a2f2c |
251 changed files with 21326 additions and 1983 deletions
|
|
@ -49,6 +49,7 @@ forgejo.org/models/repo
|
|||
WatchRepoMode
|
||||
|
||||
forgejo.org/models/user
|
||||
IsErrUserWrongType
|
||||
IsErrExternalLoginUserAlreadyExist
|
||||
IsErrExternalLoginUserNotExist
|
||||
NewFederatedUser
|
||||
|
|
|
|||
|
|
@ -2,6 +2,9 @@
|
|||
|
||||
set -ex
|
||||
|
||||
# WARNING: Changes to the behaviour of this file should be backported to all active releases, as it is used in
|
||||
# `build-release.yml` from release branches.
|
||||
|
||||
end_to_end=$1
|
||||
end_to_end_pr=$2
|
||||
forgejo=$3
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ runs:
|
|||
apt-get update -qq
|
||||
apt-get -q install -y -qq curl ca-certificates
|
||||
|
||||
curl -sS -o /tmp/git-man.deb http://archive.ubuntu.com/ubuntu/pool/main/g/git/git-man_2.34.1-1ubuntu1_all.deb
|
||||
curl -sS -o /tmp/git-man.deb https://archive.ubuntu.com/ubuntu/pool/main/g/git/git-man_2.34.1-1ubuntu1_all.deb
|
||||
curl -sS -o /tmp/git.deb https://archive.ubuntu.com/ubuntu/pool/main/g/git/git_2.34.1-1ubuntu1_amd64.deb
|
||||
curl -sS -o /tmp/git-lfs.deb https://archive.ubuntu.com/ubuntu/pool/universe/g/git-lfs/git-lfs_3.0.2-1_amd64.deb
|
||||
|
||||
|
|
|
|||
|
|
@ -206,7 +206,7 @@ jobs:
|
|||
origin-url: ${{ env.GITHUB_SERVER_URL }}
|
||||
origin-repo: ${{ github.repository }}
|
||||
origin-token: ${{ secrets.CASCADE_ORIGIN_TOKEN }}
|
||||
origin-ref: refs/heads/forgejo
|
||||
origin-ref: ${{ github.ref }}
|
||||
destination-url: https://code.forgejo.org
|
||||
destination-fork-repo: ${{ vars.CASCADE_DESTINATION_DOER }}/end-to-end
|
||||
destination-repo: forgejo/end-to-end
|
||||
|
|
|
|||
|
|
@ -233,6 +233,7 @@ jobs:
|
|||
options: --tmpfs /bitnami/minio/data
|
||||
ldap:
|
||||
image: data.forgejo.org/oci/forgejo-test-openldap:1
|
||||
options: --memory 500M
|
||||
pgsql:
|
||||
image: data.forgejo.org/oci/bitnami/postgresql:16
|
||||
env:
|
||||
|
|
|
|||
1
.node-version
Normal file
1
.node-version
Normal file
|
|
@ -0,0 +1 @@
|
|||
22.21.1
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
FROM --platform=$BUILDPLATFORM data.forgejo.org/oci/xx AS xx
|
||||
|
||||
FROM --platform=$BUILDPLATFORM data.forgejo.org/oci/golang:1.24-alpine3.22 AS build-env
|
||||
FROM --platform=$BUILDPLATFORM data.forgejo.org/oci/golang:1.25-alpine3.22 AS build-env
|
||||
|
||||
ARG GOPROXY
|
||||
ENV GOPROXY=${GOPROXY:-https://proxy.golang.org,direct}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
FROM --platform=$BUILDPLATFORM data.forgejo.org/oci/xx AS xx
|
||||
|
||||
FROM --platform=$BUILDPLATFORM data.forgejo.org/oci/golang:1.24-alpine3.22 AS build-env
|
||||
FROM --platform=$BUILDPLATFORM data.forgejo.org/oci/golang:1.25-alpine3.22 AS build-env
|
||||
|
||||
ARG GOPROXY
|
||||
ENV GOPROXY=${GOPROXY:-https://proxy.golang.org,direct}
|
||||
|
|
|
|||
4
Makefile
4
Makefile
|
|
@ -41,7 +41,7 @@ EDITORCONFIG_CHECKER_PACKAGE ?= github.com/editorconfig-checker/editorconfig-che
|
|||
GOFUMPT_PACKAGE ?= mvdan.cc/gofumpt@v0.8.0 # renovate: datasource=go
|
||||
GOLANGCI_LINT_PACKAGE ?= github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.3.1 # renovate: datasource=go
|
||||
GXZ_PACKAGE ?= github.com/ulikunitz/xz/cmd/gxz@v0.5.15 # renovate: datasource=go
|
||||
SWAGGER_PACKAGE ?= github.com/go-swagger/go-swagger/cmd/swagger@v0.31.0 # renovate: datasource=go
|
||||
SWAGGER_PACKAGE ?= github.com/go-swagger/go-swagger/cmd/swagger@v0.33.1 # renovate: datasource=go
|
||||
XGO_PACKAGE ?= src.techknowlogick.com/xgo@latest
|
||||
GO_LICENSES_PACKAGE ?= github.com/google/go-licenses@v1.6.0 # renovate: datasource=go
|
||||
GOVULNCHECK_PACKAGE ?= golang.org/x/vuln/cmd/govulncheck@v1 # renovate: datasource=go
|
||||
|
|
@ -514,7 +514,7 @@ lint-disposable-emails-fix:
|
|||
|
||||
.PHONY: security-check
|
||||
security-check:
|
||||
go run $(GOVULNCHECK_PACKAGE) -show color ./...
|
||||
$(GO) run $(GOVULNCHECK_PACKAGE) -show color ./...
|
||||
|
||||
###
|
||||
# Development and testing targets
|
||||
|
|
|
|||
55
assets/go-licenses.json
generated
55
assets/go-licenses.json
generated
File diff suppressed because one or more lines are too long
|
|
@ -6,6 +6,8 @@ package cmd
|
|||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"image"
|
||||
"io"
|
||||
golog "log"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
|
@ -15,11 +17,15 @@ import (
|
|||
"forgejo.org/models/db"
|
||||
"forgejo.org/models/migrations"
|
||||
migrate_base "forgejo.org/models/migrations/base"
|
||||
repo_model "forgejo.org/models/repo"
|
||||
user_model "forgejo.org/models/user"
|
||||
"forgejo.org/modules/container"
|
||||
"forgejo.org/modules/log"
|
||||
"forgejo.org/modules/setting"
|
||||
"forgejo.org/modules/storage"
|
||||
"forgejo.org/services/doctor"
|
||||
|
||||
exif_terminator "code.superseriousbusiness.org/exif-terminator"
|
||||
"github.com/urfave/cli/v3"
|
||||
)
|
||||
|
||||
|
|
@ -34,6 +40,7 @@ func cmdDoctor() *cli.Command {
|
|||
cmdDoctorCheck(),
|
||||
cmdRecreateTable(),
|
||||
cmdDoctorConvert(),
|
||||
cmdAvatarStripExif(),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
|
@ -98,6 +105,14 @@ You should back-up your database before doing this and ensure that your database
|
|||
}
|
||||
}
|
||||
|
||||
func cmdAvatarStripExif() *cli.Command {
|
||||
return &cli.Command{
|
||||
Name: "avatar-strip-exif",
|
||||
Usage: "Strip EXIF metadata from all images in the avatar storage",
|
||||
Action: runAvatarStripExif,
|
||||
}
|
||||
}
|
||||
|
||||
func runRecreateTable(stdCtx context.Context, ctx *cli.Command) error {
|
||||
stdCtx, cancel := installSignals(stdCtx)
|
||||
defer cancel()
|
||||
|
|
@ -230,3 +245,78 @@ func runDoctorCheck(stdCtx context.Context, ctx *cli.Command) error {
|
|||
}
|
||||
return doctor.RunChecks(stdCtx, colorize, ctx.Bool("fix"), checks)
|
||||
}
|
||||
|
||||
func runAvatarStripExif(ctx context.Context, c *cli.Command) error {
|
||||
ctx, cancel := installSignals(ctx)
|
||||
defer cancel()
|
||||
|
||||
if err := initDB(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := storage.Init(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
type HasCustomAvatarRelativePath interface {
|
||||
CustomAvatarRelativePath() string
|
||||
}
|
||||
|
||||
doExifStrip := func(obj HasCustomAvatarRelativePath, name string, target_storage storage.ObjectStorage) error {
|
||||
if obj.CustomAvatarRelativePath() == "" {
|
||||
return nil
|
||||
}
|
||||
|
||||
log.Info("Stripping avatar for %s...", name)
|
||||
|
||||
avatarFile, err := target_storage.Open(obj.CustomAvatarRelativePath())
|
||||
if err != nil {
|
||||
return fmt.Errorf("storage.Avatars.Open: %w", err)
|
||||
}
|
||||
_, imgType, err := image.DecodeConfig(avatarFile)
|
||||
if err != nil {
|
||||
return fmt.Errorf("image.DecodeConfig: %w", err)
|
||||
}
|
||||
|
||||
// reset io.Reader for exif termination scan
|
||||
_, err = avatarFile.Seek(0, io.SeekStart)
|
||||
if err != nil {
|
||||
return fmt.Errorf("avatarFile.Seek: %w", err)
|
||||
}
|
||||
|
||||
cleanedData, err := exif_terminator.Terminate(avatarFile, imgType)
|
||||
if err != nil && strings.Contains(err.Error(), "cannot be processed") {
|
||||
// expected error for an image type that isn't supported by exif_terminator
|
||||
log.Info("... image type %s is not supported by exif_terminator, skipping.", imgType)
|
||||
return nil
|
||||
} else if err != nil {
|
||||
return fmt.Errorf("error cleaning exif data: %w", err)
|
||||
}
|
||||
|
||||
if err := storage.SaveFrom(target_storage, obj.CustomAvatarRelativePath(), func(w io.Writer) error {
|
||||
_, err := io.Copy(w, cleanedData)
|
||||
return err
|
||||
}); err != nil {
|
||||
return fmt.Errorf("Failed to create dir %s: %w", obj.CustomAvatarRelativePath(), err)
|
||||
}
|
||||
|
||||
log.Info("... completed %s.", name)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
err := db.Iterate(ctx, nil, func(ctx context.Context, user *user_model.User) error {
|
||||
return doExifStrip(user, fmt.Sprintf("user %s", user.Name), storage.Avatars)
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = db.Iterate(ctx, nil, func(ctx context.Context, repo *repo_model.Repository) error {
|
||||
return doExifStrip(repo, fmt.Sprintf("repo %s", repo.Name), storage.RepoAvatars)
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
|
|
|||
|
|
@ -237,7 +237,7 @@ Forgejo or set your environment appropriately.`, "")
|
|||
continue
|
||||
}
|
||||
|
||||
fields := bytes.Fields(scanner.Bytes())
|
||||
fields := bytes.Split(scanner.Bytes(), []byte(" "))
|
||||
if len(fields) != 3 {
|
||||
continue
|
||||
}
|
||||
|
|
@ -397,7 +397,7 @@ Forgejo or set your environment appropriately.`, "")
|
|||
continue
|
||||
}
|
||||
|
||||
fields := bytes.Fields(scanner.Bytes())
|
||||
fields := bytes.Split(scanner.Bytes(), []byte(" "))
|
||||
if len(fields) != 3 {
|
||||
continue
|
||||
}
|
||||
|
|
|
|||
133
cmd/hook_test.go
133
cmd/hook_test.go
|
|
@ -14,6 +14,9 @@ import (
|
|||
"testing"
|
||||
"time"
|
||||
|
||||
"forgejo.org/modules/git"
|
||||
"forgejo.org/modules/json"
|
||||
"forgejo.org/modules/private"
|
||||
"forgejo.org/modules/setting"
|
||||
"forgejo.org/modules/test"
|
||||
|
||||
|
|
@ -162,6 +165,136 @@ func TestDelayWriter(t *testing.T) {
|
|||
})
|
||||
}
|
||||
|
||||
func TestRunHookPrePostReceive(t *testing.T) {
|
||||
// Setup the environment.
|
||||
defer test.MockVariableValue(&setting.InternalToken, "Random")()
|
||||
defer test.MockVariableValue(&setting.InstallLock, true)()
|
||||
defer test.MockVariableValue(&setting.Git.VerbosePush, true)()
|
||||
t.Setenv("SSH_ORIGINAL_COMMAND", "true")
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
inputLine string
|
||||
oldCommitID string
|
||||
newCommitID string
|
||||
refFullName string
|
||||
}{
|
||||
{
|
||||
name: "base case",
|
||||
inputLine: "00000000000000000000 00000000000000000001 refs/head/main\n",
|
||||
oldCommitID: "00000000000000000000",
|
||||
newCommitID: "00000000000000000001",
|
||||
refFullName: "refs/head/main",
|
||||
},
|
||||
{
|
||||
name: "nbsp case",
|
||||
inputLine: "00000000000000000000 00000000000000000001 refs/head/ma\u00A0in\n",
|
||||
oldCommitID: "00000000000000000000",
|
||||
newCommitID: "00000000000000000001",
|
||||
refFullName: "refs/head/ma\u00A0in",
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
// Setup the Stdin.
|
||||
f, err := os.OpenFile(t.TempDir()+"/stdin", os.O_RDWR|os.O_CREATE|os.O_EXCL, 0o666)
|
||||
require.NoError(t, err)
|
||||
_, err = f.Write([]byte(tt.inputLine))
|
||||
require.NoError(t, err)
|
||||
_, err = f.Seek(0, 0)
|
||||
require.NoError(t, err)
|
||||
defer test.MockVariableValue(os.Stdin, *f)()
|
||||
|
||||
// Setup the server that processes the hooks.
|
||||
var serverError error
|
||||
var hookOpts *private.HookOptions
|
||||
|
||||
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
body, err := io.ReadAll(r.Body)
|
||||
if err != nil {
|
||||
serverError = err
|
||||
w.WriteHeader(500)
|
||||
return
|
||||
}
|
||||
|
||||
err = json.Unmarshal(body, &hookOpts)
|
||||
if err != nil {
|
||||
serverError = err
|
||||
w.WriteHeader(500)
|
||||
return
|
||||
}
|
||||
|
||||
w.WriteHeader(200)
|
||||
|
||||
resp := &private.HookPostReceiveResult{}
|
||||
bytes, err := json.Marshal(resp)
|
||||
if err != nil {
|
||||
serverError = err
|
||||
return
|
||||
}
|
||||
|
||||
_, err = w.Write(bytes)
|
||||
if err != nil {
|
||||
serverError = err
|
||||
return
|
||||
}
|
||||
}))
|
||||
defer ts.Close()
|
||||
defer test.MockVariableValue(&setting.LocalURL, ts.URL+"/")()
|
||||
|
||||
t.Run("pre-receive", func(t *testing.T) {
|
||||
app := cli.Command{}
|
||||
app.Commands = []*cli.Command{subcmdHookPreReceive()}
|
||||
|
||||
finish := captureOutput(t, os.Stdout)
|
||||
err = app.Run(t.Context(), []string{"./forgejo", "pre-receive"})
|
||||
require.NoError(t, err)
|
||||
out := finish()
|
||||
require.Empty(t, out)
|
||||
|
||||
require.NoError(t, serverError)
|
||||
require.NotNil(t, hookOpts)
|
||||
|
||||
require.Len(t, hookOpts.OldCommitIDs, 1)
|
||||
assert.Equal(t, tt.oldCommitID, hookOpts.OldCommitIDs[0])
|
||||
require.Len(t, hookOpts.NewCommitIDs, 1)
|
||||
assert.Equal(t, tt.newCommitID, hookOpts.NewCommitIDs[0])
|
||||
require.Len(t, hookOpts.RefFullNames, 1)
|
||||
assert.Equal(t, git.RefName(tt.refFullName), hookOpts.RefFullNames[0])
|
||||
})
|
||||
|
||||
// seek stdin back to beginning
|
||||
_, err = f.Seek(0, 0)
|
||||
require.NoError(t, err)
|
||||
// reset state from prev test
|
||||
serverError = nil
|
||||
hookOpts = nil
|
||||
|
||||
t.Run("post-receive", func(t *testing.T) {
|
||||
app := cli.Command{}
|
||||
app.Commands = []*cli.Command{subcmdHookPostReceive()}
|
||||
|
||||
finish := captureOutput(t, os.Stdout)
|
||||
err = app.Run(t.Context(), []string{"./forgejo", "post-receive"})
|
||||
require.NoError(t, err)
|
||||
out := finish()
|
||||
require.Empty(t, out)
|
||||
|
||||
require.NoError(t, serverError)
|
||||
require.NotNil(t, hookOpts)
|
||||
|
||||
require.Len(t, hookOpts.OldCommitIDs, 1)
|
||||
assert.Equal(t, tt.oldCommitID, hookOpts.OldCommitIDs[0])
|
||||
require.Len(t, hookOpts.NewCommitIDs, 1)
|
||||
assert.Equal(t, tt.newCommitID, hookOpts.NewCommitIDs[0])
|
||||
require.Len(t, hookOpts.RefFullNames, 1)
|
||||
assert.Equal(t, git.RefName(tt.refFullName), hookOpts.RefFullNames[0])
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestRunHookUpdate(t *testing.T) {
|
||||
app := cli.Command{}
|
||||
app.Commands = []*cli.Command{subcmdHookUpdate()}
|
||||
|
|
|
|||
32
go.mod
32
go.mod
|
|
@ -1,8 +1,8 @@
|
|||
module forgejo.org
|
||||
|
||||
go 1.24.0
|
||||
go 1.25.0
|
||||
|
||||
toolchain go1.24.7
|
||||
toolchain go1.25.5
|
||||
|
||||
require (
|
||||
code.forgejo.org/f3/gof3/v3 v3.11.0
|
||||
|
|
@ -10,13 +10,15 @@ require (
|
|||
code.forgejo.org/forgejo/go-rpmutils v1.0.0
|
||||
code.forgejo.org/forgejo/levelqueue v1.0.0
|
||||
code.forgejo.org/forgejo/reply v1.0.2
|
||||
code.forgejo.org/forgejo/runner/v11 v11.1.1
|
||||
code.forgejo.org/forgejo/runner/v11 v11.1.2
|
||||
code.forgejo.org/go-chi/binding v1.0.1
|
||||
code.forgejo.org/go-chi/cache v1.0.1
|
||||
code.forgejo.org/go-chi/captcha v1.0.2
|
||||
code.forgejo.org/go-chi/session v1.0.2
|
||||
code.gitea.io/actions-proto-go v0.4.0
|
||||
code.gitea.io/sdk/gitea v0.21.0
|
||||
code.superseriousbusiness.org/exif-terminator v0.11.0
|
||||
code.superseriousbusiness.org/go-jpeg-image-structure/v2 v2.3.0
|
||||
codeberg.org/gusted/mcaptcha v0.0.0-20220723083913-4f3072e1d570
|
||||
connectrpc.com/connect v1.18.1
|
||||
github.com/42wim/httpsig v1.2.3
|
||||
|
|
@ -34,6 +36,7 @@ require (
|
|||
github.com/djherbis/buffer v1.2.0
|
||||
github.com/djherbis/nio/v3 v3.0.1
|
||||
github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707
|
||||
github.com/dsoprea/go-exif/v3 v3.0.0-20210625224831-a6301f85c82b
|
||||
github.com/dustin/go-humanize v1.0.1
|
||||
github.com/editorconfig/editorconfig-core-go/v2 v2.6.3
|
||||
github.com/emersion/go-imap v1.2.1
|
||||
|
|
@ -99,13 +102,13 @@ require (
|
|||
gitlab.com/gitlab-org/api/client-go v0.130.1
|
||||
go.uber.org/mock v0.6.0
|
||||
go.yaml.in/yaml/v3 v3.0.4
|
||||
golang.org/x/crypto v0.42.0
|
||||
golang.org/x/crypto v0.45.0
|
||||
golang.org/x/image v0.31.0
|
||||
golang.org/x/net v0.44.0
|
||||
golang.org/x/net v0.47.0
|
||||
golang.org/x/oauth2 v0.31.0
|
||||
golang.org/x/sync v0.17.0
|
||||
golang.org/x/sys v0.36.0
|
||||
golang.org/x/text v0.29.0
|
||||
golang.org/x/sync v0.18.0
|
||||
golang.org/x/sys v0.38.0
|
||||
golang.org/x/text v0.31.0
|
||||
google.golang.org/protobuf v1.36.9
|
||||
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
|
||||
gopkg.in/ini.v1 v1.67.0
|
||||
|
|
@ -116,6 +119,7 @@ require (
|
|||
|
||||
require (
|
||||
cloud.google.com/go/compute/metadata v0.6.0 // indirect
|
||||
code.superseriousbusiness.org/go-png-image-structure/v2 v2.3.0 // indirect
|
||||
dario.cat/mergo v1.0.2 // indirect
|
||||
filippo.io/edwards25519 v1.1.0 // indirect
|
||||
git.sr.ht/~mariusor/go-xsd-duration v0.0.0-20220703122237-02e73435a078 // indirect
|
||||
|
|
@ -160,6 +164,10 @@ require (
|
|||
github.com/davidmz/go-pageant v1.0.2 // indirect
|
||||
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
|
||||
github.com/dlclark/regexp2 v1.11.5 // indirect
|
||||
github.com/dsoprea/go-iptc v0.0.0-20200609062250-162ae6b44feb // indirect
|
||||
github.com/dsoprea/go-logging v0.0.0-20200710184922-b02d349568dd // indirect
|
||||
github.com/dsoprea/go-photoshop-info-format v0.0.0-20200609050348-3db9b63b202c // indirect
|
||||
github.com/dsoprea/go-utility/v2 v2.0.0-20200717064901-2fccff4aa15e // indirect
|
||||
github.com/emersion/go-sasl v0.0.0-20231106173351-e73c9f7bad43 // indirect
|
||||
github.com/emirpasic/gods v1.18.1 // indirect
|
||||
github.com/fatih/color v1.18.0 // indirect
|
||||
|
|
@ -167,6 +175,7 @@ require (
|
|||
github.com/go-ap/errors v0.0.0-20231003111023-183eef4b31b7 // indirect
|
||||
github.com/go-asn1-ber/asn1-ber v1.5.5 // indirect
|
||||
github.com/go-enry/go-oniguruma v1.2.1 // indirect
|
||||
github.com/go-errors/errors v1.1.1 // indirect
|
||||
github.com/go-fed/httpsig v1.1.0 // indirect
|
||||
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
|
||||
github.com/go-git/go-billy/v5 v5.6.2 // indirect
|
||||
|
|
@ -176,8 +185,10 @@ require (
|
|||
github.com/go-openapi/jsonreference v0.21.0 // indirect
|
||||
github.com/go-openapi/swag v0.23.1 // indirect
|
||||
github.com/go-webauthn/x v0.1.25 // indirect
|
||||
github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b // indirect
|
||||
github.com/goccy/go-json v0.10.5 // indirect
|
||||
github.com/golang-jwt/jwt/v4 v4.5.2 // indirect
|
||||
github.com/golang/geo v0.0.0-20200319012246-673a6f80352d // indirect
|
||||
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect
|
||||
github.com/golang/protobuf v1.5.4 // indirect
|
||||
github.com/golang/snappy v0.0.4 // indirect
|
||||
|
|
@ -244,11 +255,12 @@ require (
|
|||
go.uber.org/zap v1.27.0 // indirect
|
||||
go.uber.org/zap/exp v0.3.0 // indirect
|
||||
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
|
||||
golang.org/x/mod v0.27.0 // indirect
|
||||
golang.org/x/mod v0.29.0 // indirect
|
||||
golang.org/x/time v0.13.0 // indirect
|
||||
golang.org/x/tools v0.36.0 // indirect
|
||||
golang.org/x/tools v0.38.0 // indirect
|
||||
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
|
||||
gopkg.in/warnings.v0 v0.1.2 // indirect
|
||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
)
|
||||
|
||||
|
|
|
|||
74
go.sum
74
go.sum
|
|
@ -28,8 +28,8 @@ code.forgejo.org/forgejo/levelqueue v1.0.0 h1:9krYpU6BM+j/1Ntj6m+VCAIu0UNnne1/Uf
|
|||
code.forgejo.org/forgejo/levelqueue v1.0.0/go.mod h1:fmG6zhVuqim2rxSFOoasgXO8V2W/k9U31VVYqLIRLhQ=
|
||||
code.forgejo.org/forgejo/reply v1.0.2 h1:dMhQCHV6/O3L5CLWNTol+dNzDAuyCK88z4J/lCdgFuQ=
|
||||
code.forgejo.org/forgejo/reply v1.0.2/go.mod h1:RyZUfzQLc+fuLIGjTSQWDAJWPiL4WtKXB/FifT5fM7U=
|
||||
code.forgejo.org/forgejo/runner/v11 v11.1.1 h1:CoSfxBOLKLMJZq5VhKd5ZIUc3tCf04iyFx926s+zaMA=
|
||||
code.forgejo.org/forgejo/runner/v11 v11.1.1/go.mod h1:9f0D2EG7uabL+cv71SWHKrGgo2vmLpvko0QLmtn3RDE=
|
||||
code.forgejo.org/forgejo/runner/v11 v11.1.2 h1:jM5YsNmScH11VJEwmvsTUiqGjAqtiUzBhQ65BIo8ZOs=
|
||||
code.forgejo.org/forgejo/runner/v11 v11.1.2/go.mod h1:9f0D2EG7uabL+cv71SWHKrGgo2vmLpvko0QLmtn3RDE=
|
||||
code.forgejo.org/forgejo/ssh v0.0.0-20241211213324-5fc306ca0616 h1:kEZL84+02jY9RxXM4zHBWZ3Fml0B09cmP1LGkDsCfIA=
|
||||
code.forgejo.org/forgejo/ssh v0.0.0-20241211213324-5fc306ca0616/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8=
|
||||
code.forgejo.org/go-chi/binding v1.0.1 h1:coKNI+X1NzRN7X85LlrpvBRqk0TXpJ+ja28vusQWEuY=
|
||||
|
|
@ -46,6 +46,12 @@ code.gitea.io/actions-proto-go v0.4.0 h1:OsPBPhodXuQnsspG1sQ4eRE1PeoZyofd7+i73zC
|
|||
code.gitea.io/actions-proto-go v0.4.0/go.mod h1:mn7Wkqz6JbnTOHQpot3yDeHx+O5C9EGhMEE+htvHBas=
|
||||
code.gitea.io/sdk/gitea v0.21.0 h1:69n6oz6kEVHRo1+APQQyizkhrZrLsTLXey9142pfkD4=
|
||||
code.gitea.io/sdk/gitea v0.21.0/go.mod h1:tnBjVhuKJCn8ibdyyhvUyxrR1Ca2KHEoTWoukNhXQPA=
|
||||
code.superseriousbusiness.org/exif-terminator v0.11.0 h1:Hof0MCcsa+1fS17gf86fTTZ8AQnMY9h9kzcc+2C6mVg=
|
||||
code.superseriousbusiness.org/exif-terminator v0.11.0/go.mod h1:9sutT1axa/kSdlPLlRFjCNKmyo/KNx8eX3XZvWBlAEY=
|
||||
code.superseriousbusiness.org/go-jpeg-image-structure/v2 v2.3.0 h1:r9uq8StaSHYKJ8DklR9Xy+E9c40G1Z8yj5TRGi8L6+4=
|
||||
code.superseriousbusiness.org/go-jpeg-image-structure/v2 v2.3.0/go.mod h1:IK1OlR6APjVB3E9tuYGvf0qXMrwP+TrzcHS5rf4wffQ=
|
||||
code.superseriousbusiness.org/go-png-image-structure/v2 v2.3.0 h1:I512jiIeXDC4//2BeSPrRM2ZS4wpBKUaPeTPxakMNGA=
|
||||
code.superseriousbusiness.org/go-png-image-structure/v2 v2.3.0/go.mod h1:SNHomXNW88o1pFfLHpD4KsCZLfcr4z5dm+xcX5SV10A=
|
||||
codeberg.org/gusted/mcaptcha v0.0.0-20220723083913-4f3072e1d570 h1:TXbikPqa7YRtfU9vS6QJBg77pUvbEb6StRdZO8t1bEY=
|
||||
codeberg.org/gusted/mcaptcha v0.0.0-20220723083913-4f3072e1d570/go.mod h1:IIAjsijsd8q1isWX8MACefDEgTQslQ4stk2AeeTt3kM=
|
||||
connectrpc.com/connect v1.18.1 h1:PAg7CjSAGvscaf6YZKUefjoih5Z/qYkyaTrBW8xvYPw=
|
||||
|
|
@ -209,6 +215,22 @@ github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cn
|
|||
github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707 h1:2tV76y6Q9BB+NEBasnqvs7e49aEBFI8ejC89PSnWH+4=
|
||||
github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707/go.mod h1:qssHWj60/X5sZFNxpG4HBPDHVqxNm4DfnCKgrbZOT+s=
|
||||
github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY=
|
||||
github.com/dsoprea/go-exif/v2 v2.0.0-20200321225314-640175a69fe4/go.mod h1:Lm2lMM2zx8p4a34ZemkaUV95AnMl4ZvLbCUbwOvLC2E=
|
||||
github.com/dsoprea/go-exif/v3 v3.0.0-20200717053412-08f1b6708903/go.mod h1:0nsO1ce0mh5czxGeLo4+OCZ/C6Eo6ZlMWsz7rH/Gxv8=
|
||||
github.com/dsoprea/go-exif/v3 v3.0.0-20210428042052-dca55bf8ca15/go.mod h1:cg5SNYKHMmzxsr9X6ZeLh/nfBRHHp5PngtEPcujONtk=
|
||||
github.com/dsoprea/go-exif/v3 v3.0.0-20210625224831-a6301f85c82b h1:NgNuLvW/gAFKU30ULWW0gtkCt56JfB7FrZ2zyo0wT8I=
|
||||
github.com/dsoprea/go-exif/v3 v3.0.0-20210625224831-a6301f85c82b/go.mod h1:cg5SNYKHMmzxsr9X6ZeLh/nfBRHHp5PngtEPcujONtk=
|
||||
github.com/dsoprea/go-iptc v0.0.0-20200609062250-162ae6b44feb h1:gwjJjUr6FY7zAWVEueFPrcRHhd9+IK81TcItbqw2du4=
|
||||
github.com/dsoprea/go-iptc v0.0.0-20200609062250-162ae6b44feb/go.mod h1:kYIdx9N9NaOyD7U6D+YtExN7QhRm+5kq7//yOsRXQtM=
|
||||
github.com/dsoprea/go-logging v0.0.0-20190624164917-c4f10aab7696/go.mod h1:Nm/x2ZUNRW6Fe5C3LxdY1PyZY5wmDv/s5dkPJ/VB3iA=
|
||||
github.com/dsoprea/go-logging v0.0.0-20200517223158-a10564966e9d/go.mod h1:7I+3Pe2o/YSU88W0hWlm9S22W7XI1JFNJ86U0zPKMf8=
|
||||
github.com/dsoprea/go-logging v0.0.0-20200710184922-b02d349568dd h1:l+vLbuxptsC6VQyQsfD7NnEC8BZuFpz45PgY+pH8YTg=
|
||||
github.com/dsoprea/go-logging v0.0.0-20200710184922-b02d349568dd/go.mod h1:7I+3Pe2o/YSU88W0hWlm9S22W7XI1JFNJ86U0zPKMf8=
|
||||
github.com/dsoprea/go-photoshop-info-format v0.0.0-20200609050348-3db9b63b202c h1:7j5aWACOzROpr+dvMtu8GnI97g9ShLWD72XIELMgn+c=
|
||||
github.com/dsoprea/go-photoshop-info-format v0.0.0-20200609050348-3db9b63b202c/go.mod h1:pqKB+ijp27cEcrHxhXVgUUMlSDRuGJJp1E+20Lj5H0E=
|
||||
github.com/dsoprea/go-utility v0.0.0-20200711062821-fab8125e9bdf/go.mod h1:95+K3z2L0mqsVYd6yveIv1lmtT3tcQQ3dVakPySffW8=
|
||||
github.com/dsoprea/go-utility/v2 v2.0.0-20200717064901-2fccff4aa15e h1:IxIbA7VbCNrwumIYjDoMOdf4KOSkMC6NJE4s8oRbE7E=
|
||||
github.com/dsoprea/go-utility/v2 v2.0.0-20200717064901-2fccff4aa15e/go.mod h1:uAzdkPTub5Y9yQwXe8W4m2XuP0tK4a9Q/dantD0+uaU=
|
||||
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
|
||||
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
|
||||
github.com/editorconfig/editorconfig-core-go/v2 v2.6.3 h1:XVUp6qW3BIkmM3/1EkrHpa6bL56APOynfXcZEmIgOhs=
|
||||
|
|
@ -258,6 +280,10 @@ github.com/go-enry/go-enry/v2 v2.9.2 h1:giOQAtCgBX08kosrX818DCQJTCNtKwoPBGu0qb6n
|
|||
github.com/go-enry/go-enry/v2 v2.9.2/go.mod h1:9yrj4ES1YrbNb1Wb7/PWYr2bpaCXUGRt0uafN0ISyG8=
|
||||
github.com/go-enry/go-oniguruma v1.2.1 h1:k8aAMuJfMrqm/56SG2lV9Cfti6tC4x8673aHCcBk+eo=
|
||||
github.com/go-enry/go-oniguruma v1.2.1/go.mod h1:bWDhYP+S6xZQgiRL7wlTScFYBe023B6ilRZbCAD5Hf4=
|
||||
github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
|
||||
github.com/go-errors/errors v1.0.2/go.mod h1:psDX2osz5VnTOnFWbDeWwS7yejl+uV3FEWEp4lssFEs=
|
||||
github.com/go-errors/errors v1.1.1 h1:ljK/pL5ltg3qoN+OtN6yCv9HWSfMwxSx90GJCZQxYNg=
|
||||
github.com/go-errors/errors v1.1.1/go.mod h1:psDX2osz5VnTOnFWbDeWwS7yejl+uV3FEWEp4lssFEs=
|
||||
github.com/go-fed/httpsig v1.1.0 h1:9M+hb0jkEICD8/cAiNqEB66R87tTINszBRTjwjQzWcI=
|
||||
github.com/go-fed/httpsig v1.1.0/go.mod h1:RCMrTZvN1bJYtofsG4rd5NaO5obxQ5xBkdiS7xsT7bM=
|
||||
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI=
|
||||
|
|
@ -291,6 +317,8 @@ github.com/go-webauthn/webauthn v0.14.0 h1:ZLNPUgPcDlAeoxe+5umWG/tEeCoQIDr7gE2Zx
|
|||
github.com/go-webauthn/webauthn v0.14.0/go.mod h1:QZzPFH3LJ48u5uEPAu+8/nWJImoLBWM7iAH/kSVSo6k=
|
||||
github.com/go-webauthn/x v0.1.25 h1:g/0noooIGcz/yCVqebcFgNnGIgBlJIccS+LYAa+0Z88=
|
||||
github.com/go-webauthn/x v0.1.25/go.mod h1:ieblaPY1/BVCV0oQTsA/VAo08/TWayQuJuo5Q+XxmTY=
|
||||
github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b h1:khEcpUM4yFcxg4/FHQWkvVRmgijNXRfzkIDHh23ggEo=
|
||||
github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM=
|
||||
github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
|
||||
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
|
||||
github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM=
|
||||
|
|
@ -308,6 +336,9 @@ github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9v
|
|||
github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE=
|
||||
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
|
||||
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
|
||||
github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI=
|
||||
github.com/golang/geo v0.0.0-20200319012246-673a6f80352d h1:C/hKUcHT483btRbeGkrRjJz+Zbcj8audldIi9tRJDCc=
|
||||
github.com/golang/geo v0.0.0-20200319012246-673a6f80352d/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI=
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
|
|
@ -404,6 +435,7 @@ github.com/inbucket/html2text v0.9.0 h1:ULJmVcBEMAcmLE+/rN815KG1Fx6+a4HhbUxiDiN+
|
|||
github.com/inbucket/html2text v0.9.0/go.mod h1:QDaumzl+/OzlSVbNohhmg+yAy5pKjUjzCKW2BMvztKE=
|
||||
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
|
||||
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
|
||||
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
||||
github.com/jhillyerd/enmime/v2 v2.2.0 h1:Pe35MB96eZK5Q0XjlvPftOgWypQpd1gcbfJKAt7rsB8=
|
||||
github.com/jhillyerd/enmime/v2 v2.2.0/go.mod h1:SOBXlCemjhiV2DvHhAKnJiWrtJGS/Ffuw4Iy7NjBTaI=
|
||||
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
|
||||
|
|
@ -669,8 +701,8 @@ golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliY
|
|||
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
|
||||
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
|
||||
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
|
||||
golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI=
|
||||
golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8=
|
||||
golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q=
|
||||
golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||
|
|
@ -706,8 +738,8 @@ golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
|||
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||
golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||
golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ=
|
||||
golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc=
|
||||
golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA=
|
||||
golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w=
|
||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
|
|
@ -722,7 +754,11 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL
|
|||
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200320220750-118fecf932d8/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
|
|
@ -734,8 +770,8 @@ golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
|
|||
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
|
||||
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
|
||||
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
|
||||
golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I=
|
||||
golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY=
|
||||
golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
|
||||
golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
|
|
@ -756,8 +792,8 @@ golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
|
|||
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug=
|
||||
golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
|
||||
golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I=
|
||||
golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
|
||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
|
|
@ -793,8 +829,8 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|||
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k=
|
||||
golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
||||
golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
|
||||
golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
||||
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
|
|
@ -804,8 +840,8 @@ golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
|
|||
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
|
||||
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
|
||||
golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
|
||||
golang.org/x/term v0.35.0 h1:bZBVKBudEyhRcajGcNc3jIfWPqV4y/Kt2XcoigOWtDQ=
|
||||
golang.org/x/term v0.35.0/go.mod h1:TPGtkTLesOwf2DE8CgVYiZinHAOuy5AYUYT1lENIZnA=
|
||||
golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU=
|
||||
golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254=
|
||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
|
|
@ -819,8 +855,8 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
|||
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
|
||||
golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk=
|
||||
golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4=
|
||||
golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM=
|
||||
golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM=
|
||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.13.0 h1:eUlYslOIt32DgYD6utsuUeHs4d7AsEYLuIAdg7FlYgI=
|
||||
|
|
@ -854,8 +890,8 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc
|
|||
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
||||
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
|
||||
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
|
||||
golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg=
|
||||
golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s=
|
||||
golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ=
|
||||
golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
|
|
@ -921,8 +957,10 @@ gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRN
|
|||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
|
|
|
|||
|
|
@ -25,6 +25,18 @@ import (
|
|||
"xorm.io/builder"
|
||||
)
|
||||
|
||||
type ConcurrencyMode int
|
||||
|
||||
const (
|
||||
// Don't enforce concurrency control. Note that you won't find `UnlimitedConcurrency` implemented directly in the
|
||||
// code; setting it on an `ActionRun` prevents the other limiting behaviors.
|
||||
UnlimitedConcurrency ConcurrencyMode = iota
|
||||
// Queue behind other jobs with the same concurrency group -- to be supported in Forgejo v14
|
||||
QueueBehind
|
||||
// Cancel other jobs with the same concurrency group
|
||||
CancelInProgress
|
||||
)
|
||||
|
||||
// ActionRun represents a run of a workflow file
|
||||
type ActionRun struct {
|
||||
ID int64
|
||||
|
|
@ -56,6 +68,10 @@ type ActionRun struct {
|
|||
Created timeutil.TimeStamp `xorm:"created"`
|
||||
Updated timeutil.TimeStamp `xorm:"updated"`
|
||||
NotifyEmail bool
|
||||
|
||||
ConcurrencyType ConcurrencyMode `xorm:"-"` // Forgejo v13 note: this is a persisted field in v14+
|
||||
|
||||
PreExecutionError string `xorm:"LONGTEXT"` // used to report errors that blocked execution of a workflow
|
||||
}
|
||||
|
||||
func init() {
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ import (
|
|||
// ActionTask represents a distribution of job
|
||||
type ActionTask struct {
|
||||
ID int64
|
||||
JobID int64
|
||||
JobID int64 `xorm:"index"`
|
||||
Job *ActionRunJob `xorm:"-"`
|
||||
Steps []*ActionTaskStep `xorm:"-"`
|
||||
Attempt int64
|
||||
|
|
|
|||
|
|
@ -111,7 +111,13 @@ func GPGKeyToEntity(ctx context.Context, k *GPGKey) (*openpgp.Entity, error) {
|
|||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return keys[0], err
|
||||
|
||||
for _, key := range keys {
|
||||
if key.PrimaryKey.KeyIdString() == k.KeyID {
|
||||
return key, nil
|
||||
}
|
||||
}
|
||||
return nil, fmt.Errorf("key with %s id not found", k.KeyID)
|
||||
}
|
||||
|
||||
// parseSubGPGKey parse a sub Key
|
||||
|
|
|
|||
|
|
@ -74,7 +74,7 @@ func GetEngine(ctx context.Context) Engine {
|
|||
if e := getEngine(ctx); e != nil {
|
||||
return e
|
||||
}
|
||||
return x.Context(ctx)
|
||||
return DefaultContext.(Engined).Engine().Context(ctx)
|
||||
}
|
||||
|
||||
// getEngine will get a db Engine from this context or return nil
|
||||
|
|
|
|||
|
|
@ -96,9 +96,15 @@ func init() {
|
|||
}
|
||||
}
|
||||
|
||||
type xormEngineInterface interface {
|
||||
xorm.EngineInterface
|
||||
SetDefaultContext(context.Context)
|
||||
SetConnMaxIdleTime(time.Duration)
|
||||
}
|
||||
|
||||
// newXORMEngineGroup creates an xorm.EngineGroup (with one master and one or more slaves).
|
||||
// It assumes you have separate master and slave DSNs defined via the settings package.
|
||||
func newXORMEngineGroup() (Engine, error) {
|
||||
func newXORMEngineGroup() (xormEngineInterface, error) {
|
||||
// Retrieve master DSN from settings.
|
||||
masterConnStr, err := setting.DBMasterConnStr()
|
||||
if err != nil {
|
||||
|
|
@ -125,6 +131,9 @@ func newXORMEngineGroup() (Engine, error) {
|
|||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to load slave DSNs: %w", err)
|
||||
}
|
||||
if len(slaveConnStrs) == 0 {
|
||||
return masterEngine, nil
|
||||
}
|
||||
|
||||
var slaveEngines []*xorm.Engine
|
||||
// Iterate over all slave DSNs and create engines
|
||||
|
|
@ -147,16 +156,7 @@ func newXORMEngineGroup() (Engine, error) {
|
|||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create engine group: %w", err)
|
||||
}
|
||||
return engineGroupWrapper{group}, nil
|
||||
}
|
||||
|
||||
type engineGroupWrapper struct {
|
||||
*xorm.EngineGroup
|
||||
}
|
||||
|
||||
func (w engineGroupWrapper) AddHook(hook contexts.Hook) bool {
|
||||
w.EngineGroup.AddHook(hook)
|
||||
return true
|
||||
return group, nil
|
||||
}
|
||||
|
||||
// SyncAllTables sync the schemas of all tables
|
||||
|
|
@ -169,46 +169,40 @@ func SyncAllTables() error {
|
|||
|
||||
// InitEngine initializes the xorm EngineGroup and sets it as db.DefaultContext
|
||||
func InitEngine(ctx context.Context) error {
|
||||
xormEngine, err := newXORMEngineGroup()
|
||||
eng, err := newXORMEngineGroup()
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to connect to database: %w", err)
|
||||
}
|
||||
// Try to cast to the concrete type to access diagnostic methods
|
||||
if eng, ok := xormEngine.(engineGroupWrapper); ok {
|
||||
eng.SetMapper(names.GonicMapper{})
|
||||
// WARNING: for serv command, MUST remove the output to os.Stdout,
|
||||
// so use a log file instead of printing to stdout.
|
||||
eng.SetLogger(NewXORMLogger(setting.Database.LogSQL))
|
||||
eng.ShowSQL(setting.Database.LogSQL)
|
||||
eng.SetMaxOpenConns(setting.Database.MaxOpenConns)
|
||||
eng.SetMaxIdleConns(setting.Database.MaxIdleConns)
|
||||
eng.SetConnMaxLifetime(setting.Database.ConnMaxLifetime)
|
||||
eng.SetConnMaxIdleTime(setting.Database.ConnMaxIdleTime)
|
||||
eng.SetDefaultContext(ctx)
|
||||
eng.SetMapper(names.GonicMapper{})
|
||||
// WARNING: for serv command, MUST remove the output to os.Stdout,
|
||||
// so use a log file instead of printing to stdout.
|
||||
eng.SetLogger(NewXORMLogger(setting.Database.LogSQL))
|
||||
eng.ShowSQL(setting.Database.LogSQL)
|
||||
eng.SetMaxOpenConns(setting.Database.MaxOpenConns)
|
||||
eng.SetMaxIdleConns(setting.Database.MaxIdleConns)
|
||||
eng.SetConnMaxLifetime(setting.Database.ConnMaxLifetime)
|
||||
eng.SetConnMaxIdleTime(setting.Database.ConnMaxIdleTime)
|
||||
eng.SetDefaultContext(ctx)
|
||||
|
||||
if setting.Database.SlowQueryThreshold > 0 {
|
||||
eng.AddHook(&SlowQueryHook{
|
||||
Threshold: setting.Database.SlowQueryThreshold,
|
||||
Logger: log.GetLogger("xorm"),
|
||||
})
|
||||
}
|
||||
|
||||
errorLogger := log.GetLogger("xorm")
|
||||
if setting.IsInTesting {
|
||||
errorLogger = log.GetLogger(log.DEFAULT)
|
||||
}
|
||||
|
||||
eng.AddHook(&ErrorQueryHook{
|
||||
Logger: errorLogger,
|
||||
if setting.Database.SlowQueryThreshold > 0 {
|
||||
eng.AddHook(&SlowQueryHook{
|
||||
Threshold: setting.Database.SlowQueryThreshold,
|
||||
Logger: log.GetLogger("xorm"),
|
||||
})
|
||||
|
||||
eng.AddHook(&TracingHook{})
|
||||
|
||||
SetDefaultEngine(ctx, eng)
|
||||
} else {
|
||||
// Fallback: if type assertion fails, set default engine without extended diagnostics
|
||||
SetDefaultEngine(ctx, xormEngine)
|
||||
}
|
||||
|
||||
errorLogger := log.GetLogger("xorm")
|
||||
if setting.IsInTesting {
|
||||
errorLogger = log.GetLogger(log.DEFAULT)
|
||||
}
|
||||
|
||||
eng.AddHook(&ErrorQueryHook{
|
||||
Logger: errorLogger,
|
||||
})
|
||||
|
||||
eng.AddHook(&TracingHook{})
|
||||
|
||||
SetDefaultEngine(ctx, eng)
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
@ -363,8 +357,7 @@ func SetLogSQL(ctx context.Context, on bool) {
|
|||
|
||||
if sess, ok := ctxEngine.(*xorm.Session); ok {
|
||||
sess.Engine().ShowSQL(on)
|
||||
} else if wrapper, ok := ctxEngine.(engineGroupWrapper); ok {
|
||||
// Handle engineGroupWrapper directly
|
||||
} else if wrapper, ok := ctxEngine.(xormEngineInterface); ok {
|
||||
wrapper.ShowSQL(on)
|
||||
} else if masterEngine, err := GetMasterEngine(ctxEngine); err == nil {
|
||||
masterEngine.ShowSQL(on)
|
||||
|
|
|
|||
|
|
@ -5,39 +5,82 @@ package db
|
|||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"reflect"
|
||||
|
||||
"forgejo.org/modules/setting"
|
||||
|
||||
"xorm.io/builder"
|
||||
)
|
||||
|
||||
// Iterate iterate all the Bean object
|
||||
// Iterate iterate all the Bean object. The table being iterated must have a single-column primary key.
|
||||
func Iterate[Bean any](ctx context.Context, cond builder.Cond, f func(ctx context.Context, bean *Bean) error) error {
|
||||
var start int
|
||||
var dummy Bean
|
||||
batchSize := setting.Database.IterateBufferSize
|
||||
sess := GetEngine(ctx)
|
||||
|
||||
table, err := TableInfo(&dummy)
|
||||
if err != nil {
|
||||
return fmt.Errorf("unable to fetch table info for bean %v: %w", dummy, err)
|
||||
}
|
||||
if len(table.PrimaryKeys) != 1 {
|
||||
return fmt.Errorf("iterate only supported on a table with 1 primary key field, but table %s had %d", table.Name, len(table.PrimaryKeys))
|
||||
}
|
||||
|
||||
pkDbName := table.PrimaryKeys[0]
|
||||
var pkStructFieldName string
|
||||
|
||||
for _, c := range table.Columns() {
|
||||
if c.Name == pkDbName {
|
||||
pkStructFieldName = c.FieldName
|
||||
break
|
||||
}
|
||||
}
|
||||
if pkStructFieldName == "" {
|
||||
return fmt.Errorf("iterate unable to identify struct field for primary key %s", pkDbName)
|
||||
}
|
||||
|
||||
var lastPK any
|
||||
|
||||
for {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
return ctx.Err()
|
||||
default:
|
||||
beans := make([]*Bean, 0, batchSize)
|
||||
|
||||
sess := GetEngine(ctx)
|
||||
sess = sess.OrderBy(pkDbName)
|
||||
if cond != nil {
|
||||
sess = sess.Where(cond)
|
||||
}
|
||||
if err := sess.Limit(batchSize, start).Find(&beans); err != nil {
|
||||
if lastPK != nil {
|
||||
sess = sess.Where(builder.Gt{pkDbName: lastPK})
|
||||
}
|
||||
|
||||
if err := sess.Limit(batchSize).Find(&beans); err != nil {
|
||||
return err
|
||||
}
|
||||
if len(beans) == 0 {
|
||||
return nil
|
||||
}
|
||||
start += len(beans)
|
||||
|
||||
for _, bean := range beans {
|
||||
if err := f(ctx, bean); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
lastBean := beans[len(beans)-1]
|
||||
lastPK = extractFieldValue(lastBean, pkStructFieldName)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func extractFieldValue(bean any, fieldName string) any {
|
||||
v := reflect.ValueOf(bean)
|
||||
if v.Kind() == reflect.Ptr {
|
||||
v = v.Elem()
|
||||
}
|
||||
field := v.FieldByName(fieldName)
|
||||
return field.Interface()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,42 +5,113 @@ package db_test
|
|||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"slices"
|
||||
"testing"
|
||||
|
||||
"forgejo.org/models/db"
|
||||
repo_model "forgejo.org/models/repo"
|
||||
"forgejo.org/models/unittest"
|
||||
"forgejo.org/modules/setting"
|
||||
"forgejo.org/modules/test"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"xorm.io/builder"
|
||||
)
|
||||
|
||||
func TestIterate(t *testing.T) {
|
||||
require.NoError(t, unittest.PrepareTestDatabase())
|
||||
xe, err := unittest.GetXORMEngine()
|
||||
require.NoError(t, err)
|
||||
require.NoError(t, xe.Sync(&repo_model.RepoUnit{}))
|
||||
db.SetLogSQL(t.Context(), true)
|
||||
defer test.MockVariableValue(&setting.Database.IterateBufferSize, 50)()
|
||||
|
||||
cnt, err := db.GetEngine(db.DefaultContext).Count(&repo_model.RepoUnit{})
|
||||
require.NoError(t, err)
|
||||
t.Run("No Modifications", func(t *testing.T) {
|
||||
require.NoError(t, unittest.PrepareTestDatabase())
|
||||
xe, err := unittest.GetXORMEngine()
|
||||
require.NoError(t, err)
|
||||
require.NoError(t, xe.Sync(&repo_model.RepoUnit{}))
|
||||
|
||||
var repoUnitCnt int
|
||||
err = db.Iterate(db.DefaultContext, nil, func(ctx context.Context, repo *repo_model.RepoUnit) error {
|
||||
repoUnitCnt++
|
||||
return nil
|
||||
// Fetch all the repo unit IDs...
|
||||
var remainingRepoIDs []int64
|
||||
db.GetEngine(t.Context()).Table(&repo_model.RepoUnit{}).Cols("id").Find(&remainingRepoIDs)
|
||||
|
||||
// Ensure that every repo unit ID is found when doing iterate:
|
||||
err = db.Iterate(t.Context(), nil, func(ctx context.Context, repo *repo_model.RepoUnit) error {
|
||||
remainingRepoIDs = slices.DeleteFunc(remainingRepoIDs, func(n int64) bool {
|
||||
return repo.ID == n
|
||||
})
|
||||
return nil
|
||||
})
|
||||
require.NoError(t, err)
|
||||
assert.Empty(t, remainingRepoIDs)
|
||||
})
|
||||
require.NoError(t, err)
|
||||
assert.EqualValues(t, cnt, repoUnitCnt)
|
||||
|
||||
err = db.Iterate(db.DefaultContext, nil, func(ctx context.Context, repoUnit *repo_model.RepoUnit) error {
|
||||
has, err := db.ExistByID[repo_model.RepoUnit](ctx, repoUnit.ID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if !has {
|
||||
return db.ErrNotExist{Resource: "repo_unit", ID: repoUnit.ID}
|
||||
}
|
||||
return nil
|
||||
t.Run("Concurrent Delete", func(t *testing.T) {
|
||||
require.NoError(t, unittest.PrepareTestDatabase())
|
||||
xe, err := unittest.GetXORMEngine()
|
||||
require.NoError(t, err)
|
||||
require.NoError(t, xe.Sync(&repo_model.RepoUnit{}))
|
||||
|
||||
// Fetch all the repo unit IDs...
|
||||
var remainingRepoIDs []int64
|
||||
db.GetEngine(t.Context()).Table(&repo_model.RepoUnit{}).Cols("id").Find(&remainingRepoIDs)
|
||||
|
||||
// Ensure that every repo unit ID is found, even if someone else performs a DELETE on the table while we're
|
||||
// iterating. In real-world usage the deleted record may or may not be returned, but the important
|
||||
// subject-under-test is that no *other* record is skipped.
|
||||
didDelete := false
|
||||
err = db.Iterate(t.Context(), nil, func(ctx context.Context, repo *repo_model.RepoUnit) error {
|
||||
// While on page 2 (assuming ID ordering, 50 record buffer size)...
|
||||
if repo.ID == 51 {
|
||||
// Delete a record that would have been on page 1.
|
||||
affected, err := db.GetEngine(t.Context()).ID(25).Delete(&repo_model.RepoUnit{})
|
||||
if err != nil {
|
||||
return err
|
||||
} else if affected != 1 {
|
||||
return fmt.Errorf("expected to delete 1 record, but affected %d records", affected)
|
||||
}
|
||||
didDelete = true
|
||||
}
|
||||
remainingRepoIDs = slices.DeleteFunc(remainingRepoIDs, func(n int64) bool {
|
||||
return repo.ID == n
|
||||
})
|
||||
return nil
|
||||
})
|
||||
require.NoError(t, err)
|
||||
assert.True(t, didDelete, "didDelete")
|
||||
assert.Empty(t, remainingRepoIDs)
|
||||
})
|
||||
|
||||
t.Run("Verify cond applied", func(t *testing.T) {
|
||||
require.NoError(t, unittest.PrepareTestDatabase())
|
||||
xe, err := unittest.GetXORMEngine()
|
||||
require.NoError(t, err)
|
||||
require.NoError(t, xe.Sync(&repo_model.RepoUnit{}))
|
||||
|
||||
// Fetch all the repo unit IDs...
|
||||
var remainingRepoIDs []int64
|
||||
db.GetEngine(t.Context()).Table(&repo_model.RepoUnit{}).Cols("id").Find(&remainingRepoIDs)
|
||||
|
||||
// Remove those that we're not expecting to find based upon `Iterate`'s condition. We'll trim the front few
|
||||
// records and last few records, which will confirm that cond is applied on all pages.
|
||||
remainingRepoIDs = slices.DeleteFunc(remainingRepoIDs, func(n int64) bool {
|
||||
return n <= 15 || n > 1000
|
||||
})
|
||||
err = db.Iterate(t.Context(), builder.Gt{"id": 15}.And(builder.Lt{"id": 1000}), func(ctx context.Context, repo *repo_model.RepoUnit) error {
|
||||
removedRecord := false
|
||||
// Remove the record from remainingRepoIDs, but track to make sure we did actually remove a record
|
||||
remainingRepoIDs = slices.DeleteFunc(remainingRepoIDs, func(n int64) bool {
|
||||
if repo.ID == n {
|
||||
removedRecord = true
|
||||
return true
|
||||
}
|
||||
return false
|
||||
})
|
||||
if !removedRecord {
|
||||
return fmt.Errorf("unable to find record in remainingRepoIDs for repo %d, indicating a cond application failure", repo.ID)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
require.NoError(t, err)
|
||||
assert.Empty(t, remainingRepoIDs)
|
||||
})
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
|
|
|||
24
models/fixtures/TestParseCommitWithSSHSignature/gpg_key.yml
Normal file
24
models/fixtures/TestParseCommitWithSSHSignature/gpg_key.yml
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
-
|
||||
id: 7
|
||||
owner_id: 2
|
||||
key_id: C21381CD63F609EE
|
||||
primary_key_id:
|
||||
content: xsBNBGjmzbQBCADPn1Cl1LibN3K7+9A+If/RjDdTfFVbGk7A8pEDpkgzkmbIcMsi+WvPypbnoTJWyc4E5rsj7MYU6NKK3HADFX4rI6h/732xLmK/R+ekeT8wv+XKO1ncTtm/YITC5qRl84xeYfg4DuGGikhCc8xj8ZKWrx5r1ekISidyvNDJrrcHFToqlqGX74w9mRSSQJm1RayX+5nDph7qOpV8ZCpZT2LS00BYkYO62OHl2Ecm+qWiLyyA4iDR4DVSR9qyLzlXdEI2qQXf28zLV4YPaHckNWdRnaqlr/Mlbd+rbZt/49IBDgXPc+EGo6OXYmZls7pyPSCyirz/ObIyM/9t0JIh8rFrABEBAAE=
|
||||
verified: true
|
||||
can_sign: true
|
||||
can_encrypt_comms: true
|
||||
can_encrypt_storage: true
|
||||
can_certify: true
|
||||
emails: "[{\"ID\":8,\"UID\":1,\"Email\":\"user2+signingkey@example.com\",\"LowerEmail\":\"user2+signingkey@example.com\",\"IsActivated\":true,\"IsPrimary\":false}]"
|
||||
|
||||
-
|
||||
id: 8
|
||||
owner_id: 2
|
||||
key_id: 9836974DF1195913
|
||||
primary_key_id: C21381CD63F609EE
|
||||
content: zsBNBGjmzbQBCADUa4mDg7owJwoBGi85flwoNw/QOvZew2LSZh7++dt+ClKcxryDpkAF4jmPsmKZEjhYfe4QE53E6jlYXRhprISONuR7gYPvvgCrvmEQKoh6o/tOlv0I4Ngix3SkE44u/CpFEVOrmFHBUvjgRHreOhwL3eyUao3PVte4kyAmvzZuGCmFFr7e0D48EGVbSLTGGj/GtHArnWPbs96S6qjXU/4qSvHsmNbGousgbovxXF/AxqIzyjvXheNEEQzUPjainDlOi3Z9BPJXr7T3ytt3slp48teKEXAC/uGVvFICwGN3WRCG8XsVwIQLUE23xclVdVqdzkO4Jr1D+Gtg95fYC2PvABEBAAE=
|
||||
verified: false
|
||||
can_sign: true
|
||||
can_encrypt_comms: true
|
||||
can_encrypt_storage: true
|
||||
can_certify: true
|
||||
37
models/fixtures/TestTwoFactorWithPasswordChange/user.yml
Normal file
37
models/fixtures/TestTwoFactorWithPasswordChange/user.yml
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
-
|
||||
id: 2001
|
||||
lower_name: user2001
|
||||
name: user2001
|
||||
full_name: "user2001"
|
||||
email: user2001@example.com
|
||||
keep_email_private: false
|
||||
email_notifications_preference: onmention
|
||||
passwd: ZogKvWdyEx:password
|
||||
passwd_hash_algo: dummy
|
||||
must_change_password: true
|
||||
login_source: 0
|
||||
login_name: user2001
|
||||
type: 0
|
||||
salt: ZogKvWdyEx
|
||||
max_repo_creation: -1
|
||||
is_active: true
|
||||
is_admin: false
|
||||
is_restricted: false
|
||||
allow_git_hook: false
|
||||
allow_import_local: false
|
||||
allow_create_organization: true
|
||||
prohibit_login: false
|
||||
avatar: ""
|
||||
avatar_email: user2001@example.com
|
||||
use_custom_avatar: true
|
||||
num_followers: 0
|
||||
num_following: 0
|
||||
num_stars: 0
|
||||
num_repos: 0
|
||||
num_teams: 0
|
||||
num_members: 0
|
||||
visibility: 0
|
||||
repo_admin_change_team_access: false
|
||||
theme: ""
|
||||
keep_activity_private: false
|
||||
created_unix: 1759086716
|
||||
|
|
@ -46,6 +46,7 @@
|
|||
email: user2@example.com
|
||||
keep_email_private: true
|
||||
keep_pronouns_private: true
|
||||
pronouns: he/him
|
||||
email_notifications_preference: enabled
|
||||
passwd: ZogKvWdyEx:password
|
||||
passwd_hash_algo: dummy
|
||||
|
|
|
|||
|
|
@ -119,6 +119,9 @@ var migrations = []*Migration{
|
|||
NewMigration("Migrate `data` column of `secret` table to store keying material", MigrateActionSecretsToKeying),
|
||||
// v39 -> v40
|
||||
NewMigration("Add index for release sha1", AddIndexForReleaseSha1),
|
||||
// NOTE: v42 -> v43 -- effectively backported into Forgejo v13 as part of backporting
|
||||
// https://codeberg.org/forgejo/forgejo/pulls/9530, but the migration was omitted to avoid future upgrade conflicts.
|
||||
// The migration will effectively occur automatically via table `Sync` on DB engine initialization.
|
||||
}
|
||||
|
||||
// GetCurrentDBVersion returns the current Forgejo database version.
|
||||
|
|
@ -171,19 +174,29 @@ func Migrate(x *xorm.Engine) error {
|
|||
return fmt.Errorf("sync: %w", err)
|
||||
}
|
||||
|
||||
currentVersion := &ForgejoVersion{ID: 1}
|
||||
has, err := x.Get(currentVersion)
|
||||
if err != nil {
|
||||
return fmt.Errorf("get: %w", err)
|
||||
} else if !has {
|
||||
// If the version record does not exist we think
|
||||
// it is a fresh installation and we can skip all migrations.
|
||||
currentVersion.ID = 0
|
||||
currentVersion.Version = ExpectedVersion()
|
||||
|
||||
if _, err = x.InsertOne(currentVersion); err != nil {
|
||||
var versionRecords []*ForgejoVersion
|
||||
if err := x.Find(&versionRecords); err != nil {
|
||||
return fmt.Errorf("find: %w", err)
|
||||
}
|
||||
if len(versionRecords) == 0 {
|
||||
// If the version record does not exist we think it is a fresh installation and we can skip all migrations;
|
||||
// engine init calls `SyncAllTables` which will create the fresh database.
|
||||
upToDate := &ForgejoVersion{ID: 1, Version: ExpectedVersion()}
|
||||
if _, err := x.InsertOne(upToDate); err != nil {
|
||||
return fmt.Errorf("insert: %w", err)
|
||||
}
|
||||
// continue with the migration routine, but nothing will be applied; this allows transition into the newer
|
||||
// forgejo_migration library and for it to be configured and populated.
|
||||
versionRecords = []*ForgejoVersion{upToDate}
|
||||
} else if len(versionRecords) > 1 {
|
||||
return fmt.Errorf(
|
||||
"corrupt migrations: Forgejo database has unexpected records in the table `forgejo_version`; a single record is expected w/ ID=1, but %d records were found",
|
||||
len(versionRecords))
|
||||
}
|
||||
currentVersion := versionRecords[0]
|
||||
if currentVersion.ID != 1 {
|
||||
return fmt.Errorf(
|
||||
"corrupt migrations: Forgejo database has corrupted records in the table `forgejo_version`; a single record with ID=1 is expected, but a record with ID=%d was found instead", currentVersion.ID)
|
||||
}
|
||||
|
||||
v := currentVersion.Version
|
||||
|
|
@ -202,7 +215,7 @@ func Migrate(x *xorm.Engine) error {
|
|||
|
||||
// Some migration tasks depend on the git command
|
||||
if git.DefaultContext == nil {
|
||||
if err = git.InitSimple(context.Background()); err != nil {
|
||||
if err := git.InitSimple(context.Background()); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
|
@ -212,11 +225,11 @@ func Migrate(x *xorm.Engine) error {
|
|||
log.Info("Migration[%d]: %s", v+int64(i), m.description)
|
||||
// Reset the mapper between each migration - migrations are not supposed to depend on each other
|
||||
x.SetMapper(names.GonicMapper{})
|
||||
if err = m.migrate(x); err != nil {
|
||||
if err := m.migrate(x); err != nil {
|
||||
return fmt.Errorf("migration[%d]: %s failed: %w", v+int64(i), m.description, err)
|
||||
}
|
||||
currentVersion.Version = v + int64(i) + 1
|
||||
if _, err = x.ID(1).Update(currentVersion); err != nil {
|
||||
if _, err := x.ID(1).Update(currentVersion); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ import (
|
|||
|
||||
migration_tests "forgejo.org/models/migrations/test"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
|
|
@ -37,3 +38,38 @@ func TestEnsureUpToDate(t *testing.T) {
|
|||
err = EnsureUpToDate(x)
|
||||
require.Error(t, err)
|
||||
}
|
||||
|
||||
func TestMigrateFreshDB(t *testing.T) {
|
||||
x, deferable := migration_tests.PrepareTestEnv(t, 0, new(ForgejoVersion))
|
||||
defer deferable()
|
||||
require.NotNil(t, x)
|
||||
|
||||
err := Migrate(x)
|
||||
require.NoError(t, err)
|
||||
|
||||
var versionRecords []*ForgejoVersion
|
||||
err = x.Find(&versionRecords)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, versionRecords, 1)
|
||||
v := versionRecords[0]
|
||||
assert.EqualValues(t, 1, v.ID)
|
||||
assert.EqualValues(t, 40, v.Version)
|
||||
}
|
||||
|
||||
func TestMigrateFailWithCorruption(t *testing.T) {
|
||||
x, deferable := migration_tests.PrepareTestEnv(t, 0, new(ForgejoVersion))
|
||||
defer deferable()
|
||||
require.NotNil(t, x)
|
||||
|
||||
// ID != 1
|
||||
_, err := x.InsertOne(&ForgejoVersion{ID: 100, Version: 100})
|
||||
require.NoError(t, err)
|
||||
err = Migrate(x)
|
||||
require.ErrorContains(t, err, "corrupted records in the table `forgejo_version`")
|
||||
|
||||
// Two versions...
|
||||
_, err = x.InsertOne(&ForgejoVersion{ID: 1, Version: 1000})
|
||||
require.NoError(t, err)
|
||||
err = Migrate(x)
|
||||
require.ErrorContains(t, err, "unexpected records in the table `forgejo_version`")
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
package forgejo_migrations
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/xml"
|
||||
"fmt"
|
||||
"regexp"
|
||||
|
|
@ -19,7 +20,6 @@ import (
|
|||
"forgejo.org/modules/packages/maven"
|
||||
packages_service "forgejo.org/services/packages"
|
||||
|
||||
"golang.org/x/net/context"
|
||||
"xorm.io/xorm"
|
||||
)
|
||||
|
||||
|
|
|
|||
14
models/migrations/main_test.go
Normal file
14
models/migrations/main_test.go
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
// Copyright 2023 The Forgejo Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package migrations
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
migration_tests "forgejo.org/models/migrations/test"
|
||||
)
|
||||
|
||||
func TestMain(m *testing.M) {
|
||||
migration_tests.MainTest(m)
|
||||
}
|
||||
|
|
@ -449,27 +449,38 @@ func Migrate(x *xorm.Engine) error {
|
|||
}
|
||||
|
||||
var previousVersion int64
|
||||
currentVersion := &Version{ID: 1}
|
||||
has, err := x.Get(currentVersion)
|
||||
if err != nil {
|
||||
return fmt.Errorf("get: %w", err)
|
||||
} else if !has {
|
||||
// If the version record does not exist, it is a fresh installation, and we can skip all migrations.
|
||||
// XORM model framework will create all tables when initializing.
|
||||
currentVersion.ID = 0
|
||||
currentVersion.Version = maxDBVer
|
||||
if _, err = x.InsertOne(currentVersion); err != nil {
|
||||
var versionRecords []*Version
|
||||
if err := x.Find(&versionRecords); err != nil {
|
||||
return fmt.Errorf("find: %w", err)
|
||||
}
|
||||
if len(versionRecords) == 0 {
|
||||
// If the version record does not exist we think it is a fresh installation and we can skip all migrations;
|
||||
// engine init calls `SyncAllTables` which will create the fresh database.
|
||||
upToDate := &Version{ID: 1, Version: maxDBVer}
|
||||
if _, err := x.InsertOne(upToDate); err != nil {
|
||||
return fmt.Errorf("insert: %w", err)
|
||||
}
|
||||
// continue with the migration routine, but nothing will be applied; this allows transition into the newer
|
||||
// forgejo library and for it to be configured and populated.
|
||||
versionRecords = []*Version{upToDate}
|
||||
} else if len(versionRecords) > 1 {
|
||||
return fmt.Errorf(
|
||||
"corrupt migrations: Forgejo database has unexpected records in the table `version`; a single record is expected w/ ID=1, but %d records were found",
|
||||
len(versionRecords))
|
||||
} else {
|
||||
previousVersion = currentVersion.Version
|
||||
previousVersion = versionRecords[0].Version
|
||||
}
|
||||
currentVersion := versionRecords[0]
|
||||
if currentVersion.ID != 1 {
|
||||
return fmt.Errorf(
|
||||
"corrupt migrations: Forgejo database has corrupted records in the table `version`; a single record with ID=1 is expected, but a record with ID=%d was found instead", currentVersion.ID)
|
||||
}
|
||||
|
||||
curDBVer := currentVersion.Version
|
||||
// Outdated Forgejo database version is not supported
|
||||
if curDBVer < minDBVersion {
|
||||
log.Fatal(`Forgejo no longer supports auto-migration from your previously installed version.
|
||||
Please try upgrading to a lower version first (suggested v1.6.4), then upgrade to this version.`)
|
||||
Please try upgrading to a lower version first (suggested v1.6.4), then upgrade to this version.`)
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
@ -486,7 +497,7 @@ Please try upgrading to a lower version first (suggested v1.6.4), then upgrade t
|
|||
|
||||
// Some migration tasks depend on the git command
|
||||
if git.DefaultContext == nil {
|
||||
if err = git.InitSimple(context.Background()); err != nil {
|
||||
if err := git.InitSimple(context.Background()); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
|
@ -500,11 +511,11 @@ Please try upgrading to a lower version first (suggested v1.6.4), then upgrade t
|
|||
log.Info("Migration[%d]: %s", m.idNumber, m.description)
|
||||
// Reset the mapper between each migration - migrations are not supposed to depend on each other
|
||||
x.SetMapper(names.GonicMapper{})
|
||||
if err = m.Migrate(x); err != nil {
|
||||
if err := m.Migrate(x); err != nil {
|
||||
return fmt.Errorf("migration[%d]: %s failed: %w", m.idNumber, m.description, err)
|
||||
}
|
||||
currentVersion.Version = migrationIDNumberToDBVersion(m.idNumber)
|
||||
if _, err = x.ID(1).Update(currentVersion); err != nil {
|
||||
if _, err := x.ID(1).Update(currentVersion); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,9 +6,11 @@ package migrations
|
|||
import (
|
||||
"testing"
|
||||
|
||||
migration_tests "forgejo.org/models/migrations/test"
|
||||
"forgejo.org/modules/test"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestMigrations(t *testing.T) {
|
||||
|
|
@ -25,3 +27,38 @@ func TestMigrations(t *testing.T) {
|
|||
assert.Equal(t, []*migration{{idNumber: 71}}, getPendingMigrations(71, preparedMigrations))
|
||||
assert.Equal(t, []*migration{}, getPendingMigrations(72, preparedMigrations))
|
||||
}
|
||||
|
||||
func TestMigrateFreshDB(t *testing.T) {
|
||||
x, deferable := migration_tests.PrepareTestEnv(t, 0, new(Version))
|
||||
defer deferable()
|
||||
require.NotNil(t, x)
|
||||
|
||||
err := Migrate(x)
|
||||
require.NoError(t, err)
|
||||
|
||||
var versionRecords []*Version
|
||||
err = x.Find(&versionRecords)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, versionRecords, 1)
|
||||
v := versionRecords[0]
|
||||
assert.EqualValues(t, 1, v.ID)
|
||||
assert.EqualValues(t, 305, v.Version)
|
||||
}
|
||||
|
||||
func TestMigrateFailWithCorruption(t *testing.T) {
|
||||
x, deferable := migration_tests.PrepareTestEnv(t, 0, new(Version))
|
||||
defer deferable()
|
||||
require.NotNil(t, x)
|
||||
|
||||
// ID != 1
|
||||
_, err := x.InsertOne(&Version{ID: 100, Version: 100})
|
||||
require.NoError(t, err)
|
||||
err = Migrate(x)
|
||||
require.ErrorContains(t, err, "corrupted records in the table `version`")
|
||||
|
||||
// Two versions...
|
||||
_, err = x.InsertOne(&Version{ID: 1, Version: 1000})
|
||||
require.NoError(t, err)
|
||||
err = Migrate(x)
|
||||
require.ErrorContains(t, err, "unexpected records in the table `version`")
|
||||
}
|
||||
|
|
|
|||
|
|
@ -510,6 +510,13 @@ func ChangeOrgUserStatus(ctx context.Context, orgID, uid int64, public bool) err
|
|||
|
||||
// AddOrgUser adds new user to given organization.
|
||||
func AddOrgUser(ctx context.Context, orgID, uid int64) error {
|
||||
isUser, err := user_model.IsUserByID(ctx, uid)
|
||||
if err != nil {
|
||||
return err
|
||||
} else if !isUser {
|
||||
return user_model.ErrUserWrongType{UID: uid}
|
||||
}
|
||||
|
||||
isAlreadyMember, err := IsOrganizationMember(ctx, orgID, uid)
|
||||
if err != nil || isAlreadyMember {
|
||||
return err
|
||||
|
|
|
|||
|
|
@ -142,6 +142,15 @@ func TestAddOrgUser(t *testing.T) {
|
|||
org = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: orgID})
|
||||
assert.Equal(t, expectedNumMembers, org.NumMembers)
|
||||
}
|
||||
testFailure := func(orgID, userID int64, isPublic bool) {
|
||||
org := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: orgID})
|
||||
expectedNumMembers := org.NumMembers
|
||||
require.ErrorIs(t, organization.AddOrgUser(db.DefaultContext, orgID, userID), user_model.ErrUserWrongType{UID: userID})
|
||||
ou := &organization.OrgUser{OrgID: orgID, UID: userID}
|
||||
unittest.AssertNotExistsBean(t, ou)
|
||||
org = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: orgID})
|
||||
assert.Equal(t, expectedNumMembers, org.NumMembers)
|
||||
}
|
||||
|
||||
setting.Service.DefaultOrgMemberVisible = false
|
||||
testSuccess(3, 5, false)
|
||||
|
|
@ -149,7 +158,7 @@ func TestAddOrgUser(t *testing.T) {
|
|||
testSuccess(6, 2, false)
|
||||
|
||||
setting.Service.DefaultOrgMemberVisible = true
|
||||
testSuccess(6, 3, true)
|
||||
testFailure(6, 3, true)
|
||||
|
||||
unittest.CheckConsistencyFor(t, &user_model.User{}, &organization.Team{})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -50,6 +50,25 @@ func (err ErrUserNotExist) Unwrap() error {
|
|||
return util.ErrNotExist
|
||||
}
|
||||
|
||||
// ErrUserWrongType is returned if the user is of the wrong type (i.e. is an org when a user was expected)
|
||||
type ErrUserWrongType struct {
|
||||
UID int64
|
||||
}
|
||||
|
||||
func IsErrUserWrongType(err error) bool {
|
||||
_, ok := err.(ErrUserNotExist)
|
||||
return ok
|
||||
}
|
||||
|
||||
func (err ErrUserWrongType) Error() string {
|
||||
return fmt.Sprintf("user is the wrong user type [uid: %d]", err.UID)
|
||||
}
|
||||
|
||||
// Unwrap unwraps this error as a ErrNotExist error
|
||||
func (err ErrUserWrongType) Unwrap() error {
|
||||
return util.ErrInvalidArgument
|
||||
}
|
||||
|
||||
// ErrUserProhibitLogin represents a "ErrUserProhibitLogin" kind of error.
|
||||
type ErrUserProhibitLogin struct {
|
||||
UID int64
|
||||
|
|
|
|||
|
|
@ -35,3 +35,40 @@
|
|||
repo_admin_change_team_access: false
|
||||
theme: ""
|
||||
keep_activity_private: false
|
||||
|
||||
-
|
||||
id: 1042
|
||||
lower_name: bot01
|
||||
name: bot01
|
||||
full_name: Bot01
|
||||
email: bot01@example.com
|
||||
keep_email_private: false
|
||||
email_notifications_preference: onmention
|
||||
passwd: ZogKvWdyEx:password
|
||||
passwd_hash_algo: dummy
|
||||
must_change_password: false
|
||||
login_source: 0
|
||||
login_name: bot01
|
||||
type: 4
|
||||
salt: ZogKvWdyEx
|
||||
max_repo_creation: -1
|
||||
is_active: true
|
||||
is_admin: false
|
||||
is_restricted: false
|
||||
allow_git_hook: false
|
||||
allow_import_local: false
|
||||
allow_create_organization: true
|
||||
prohibit_login: true
|
||||
avatar: ""
|
||||
avatar_email: avatarbot01@example.com
|
||||
use_custom_avatar: false
|
||||
num_followers: 0
|
||||
num_following: 0
|
||||
num_stars: 0
|
||||
num_repos: 0
|
||||
num_teams: 0
|
||||
num_members: 0
|
||||
visibility: 0
|
||||
repo_admin_change_team_access: false
|
||||
theme: ""
|
||||
keep_activity_private: false
|
||||
|
|
|
|||
|
|
@ -236,7 +236,7 @@ func GetAllAdmins(ctx context.Context) ([]*User, error) {
|
|||
|
||||
// MustHaveTwoFactor returns true if the user is a individual and requires 2fa
|
||||
func (u *User) MustHaveTwoFactor() bool {
|
||||
if !u.IsIndividual() || setting.GlobalTwoFactorRequirement.IsNone() {
|
||||
if u.IsActions() || !u.IsIndividual() || setting.GlobalTwoFactorRequirement.IsNone() {
|
||||
return false
|
||||
}
|
||||
|
||||
|
|
@ -461,6 +461,15 @@ func (u *User) IsUser() bool {
|
|||
return u.Type == UserTypeIndividual || u.Type == UserTypeBot
|
||||
}
|
||||
|
||||
// Returns true if the given user ID belongs to an actual user, not an organization
|
||||
func IsUserByID(ctx context.Context, uid int64) (bool, error) {
|
||||
return db.GetEngine(ctx).
|
||||
Where("id=?", uid).
|
||||
In("type", UserTypeIndividual, UserTypeBot).
|
||||
Table("user").
|
||||
Exist()
|
||||
}
|
||||
|
||||
// IsBot returns whether or not the user is of type bot
|
||||
func (u *User) IsBot() bool {
|
||||
return u.Type == UserTypeBot
|
||||
|
|
@ -1194,7 +1203,9 @@ func ValidateCommitsWithEmails(ctx context.Context, oldCommits []*git.Commit) []
|
|||
return newCommits
|
||||
}
|
||||
|
||||
// GetUserByEmail returns the user object by given e-mail if exists.
|
||||
// GetUserByEmail returns the user associated with the email, if it exists
|
||||
// and is activated. If the email is a no-reply address, then the user
|
||||
// associated with that no-reply address is returned.
|
||||
func GetUserByEmail(ctx context.Context, email string) (*User, error) {
|
||||
if len(email) == 0 {
|
||||
return nil, ErrUserNotExist{Name: email}
|
||||
|
|
@ -1227,6 +1238,26 @@ func GetUserByEmail(ctx context.Context, email string) (*User, error) {
|
|||
return nil, ErrUserNotExist{Name: email}
|
||||
}
|
||||
|
||||
// GetUserByEmailSimple returns the user associated with the email, if it exists.
|
||||
//
|
||||
// NOTE: You likely should use `GetUserByEmail`, which handles the no-reply
|
||||
// address and only uses activated emails to get the user.
|
||||
func GetUserByEmailSimple(ctx context.Context, email string) (*User, error) {
|
||||
if len(email) == 0 {
|
||||
return nil, ErrUserNotExist{Name: email}
|
||||
}
|
||||
|
||||
emailAddress := &EmailAddress{}
|
||||
has, err := db.GetEngine(ctx).Where("lower_email = ?", strings.ToLower(email)).Get(emailAddress)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
} else if !has {
|
||||
return nil, ErrUserNotExist{Name: email}
|
||||
}
|
||||
|
||||
return GetUserByID(ctx, emailAddress.UID)
|
||||
}
|
||||
|
||||
// GetUser checks if a user already exists
|
||||
func GetUser(ctx context.Context, user *User) (bool, error) {
|
||||
return db.GetEngine(ctx).Get(user)
|
||||
|
|
|
|||
|
|
@ -645,6 +645,7 @@ func TestMustHaveTwoFactor(t *testing.T) {
|
|||
org := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 17})
|
||||
restrictedUser := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 29})
|
||||
ghostUser := user_model.NewGhostUser()
|
||||
actionsUser := user_model.NewActionsUser()
|
||||
|
||||
t.Run("NoneTwoFactorRequirement", func(t *testing.T) {
|
||||
// this should be the default, so don't have to set the variable
|
||||
|
|
@ -653,6 +654,7 @@ func TestMustHaveTwoFactor(t *testing.T) {
|
|||
assert.False(t, restrictedUser.MustHaveTwoFactor())
|
||||
assert.False(t, org.MustHaveTwoFactor())
|
||||
assert.False(t, ghostUser.MustHaveTwoFactor())
|
||||
assert.False(t, actionsUser.MustHaveTwoFactor())
|
||||
})
|
||||
|
||||
t.Run("AllTwoFactorRequirement", func(t *testing.T) {
|
||||
|
|
@ -663,6 +665,7 @@ func TestMustHaveTwoFactor(t *testing.T) {
|
|||
assert.True(t, restrictedUser.MustHaveTwoFactor())
|
||||
assert.False(t, org.MustHaveTwoFactor())
|
||||
assert.True(t, ghostUser.MustHaveTwoFactor())
|
||||
assert.False(t, actionsUser.MustHaveTwoFactor())
|
||||
})
|
||||
|
||||
t.Run("AdminTwoFactorRequirement", func(t *testing.T) {
|
||||
|
|
@ -673,6 +676,7 @@ func TestMustHaveTwoFactor(t *testing.T) {
|
|||
assert.False(t, restrictedUser.MustHaveTwoFactor())
|
||||
assert.False(t, org.MustHaveTwoFactor())
|
||||
assert.False(t, ghostUser.MustHaveTwoFactor())
|
||||
assert.False(t, actionsUser.MustHaveTwoFactor())
|
||||
})
|
||||
}
|
||||
|
||||
|
|
@ -696,6 +700,7 @@ func TestIsAccessAllowed(t *testing.T) {
|
|||
restrictedUser := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 29})
|
||||
prohibitLoginUser := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 37})
|
||||
ghostUser := user_model.NewGhostUser()
|
||||
actionsUser := user_model.NewActionsUser()
|
||||
|
||||
// users with enabled WebAuthn
|
||||
normalWebAuthnUser := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 32})
|
||||
|
|
@ -711,6 +716,7 @@ func TestIsAccessAllowed(t *testing.T) {
|
|||
runTest(t, restrictedUser, false, true)
|
||||
runTest(t, prohibitLoginUser, false, false)
|
||||
runTest(t, ghostUser, false, false)
|
||||
runTest(t, actionsUser, false, true)
|
||||
})
|
||||
|
||||
t.Run("enabled 2fa", func(t *testing.T) {
|
||||
|
|
@ -736,6 +742,7 @@ func TestIsAccessAllowed(t *testing.T) {
|
|||
runTest(t, restrictedUser, false, false)
|
||||
runTest(t, prohibitLoginUser, false, false)
|
||||
runTest(t, ghostUser, false, false)
|
||||
runTest(t, actionsUser, false, true)
|
||||
})
|
||||
|
||||
t.Run("enabled 2fa", func(t *testing.T) {
|
||||
|
|
@ -761,6 +768,7 @@ func TestIsAccessAllowed(t *testing.T) {
|
|||
runTest(t, restrictedUser, false, true)
|
||||
runTest(t, prohibitLoginUser, false, false)
|
||||
runTest(t, ghostUser, false, false)
|
||||
runTest(t, actionsUser, false, true)
|
||||
})
|
||||
|
||||
t.Run("enabled 2fa", func(t *testing.T) {
|
||||
|
|
@ -999,6 +1007,7 @@ func TestPronounsPrivacy(t *testing.T) {
|
|||
|
||||
func TestGetUserByEmail(t *testing.T) {
|
||||
require.NoError(t, unittest.PrepareTestDatabase())
|
||||
defer test.MockVariableValue(&setting.Service.NoReplyAddress, "noreply.example.org")()
|
||||
|
||||
t.Run("Normal", func(t *testing.T) {
|
||||
u, err := user_model.GetUserByEmail(t.Context(), "user2@example.com")
|
||||
|
|
@ -1017,4 +1026,50 @@ func TestGetUserByEmail(t *testing.T) {
|
|||
require.NoError(t, err)
|
||||
assert.EqualValues(t, 1, u.ID)
|
||||
})
|
||||
|
||||
t.Run("No-reply", func(t *testing.T) {
|
||||
u, err := user_model.GetUserByEmail(t.Context(), "user1@noreply.example.org")
|
||||
require.NoError(t, err)
|
||||
assert.EqualValues(t, 1, u.ID)
|
||||
})
|
||||
}
|
||||
|
||||
func TestGetUserByEmailSimple(t *testing.T) {
|
||||
require.NoError(t, unittest.PrepareTestDatabase())
|
||||
defer test.MockVariableValue(&setting.Service.NoReplyAddress, "noreply.example.org")()
|
||||
|
||||
t.Run("Normal", func(t *testing.T) {
|
||||
u, err := user_model.GetUserByEmailSimple(t.Context(), "user2@example.com")
|
||||
require.NoError(t, err)
|
||||
assert.EqualValues(t, 2, u.ID)
|
||||
})
|
||||
|
||||
t.Run("Not activated", func(t *testing.T) {
|
||||
u, err := user_model.GetUserByEmailSimple(t.Context(), "user11@example.com")
|
||||
require.NoError(t, err)
|
||||
assert.EqualValues(t, 11, u.ID)
|
||||
})
|
||||
|
||||
t.Run("No-reply", func(t *testing.T) {
|
||||
u, err := user_model.GetUserByEmailSimple(t.Context(), "user1@noreply.example.org")
|
||||
require.ErrorIs(t, err, user_model.ErrUserNotExist{Name: "user1@noreply.example.org"})
|
||||
assert.Nil(t, u)
|
||||
})
|
||||
}
|
||||
|
||||
func TestIsUserConsistency(t *testing.T) {
|
||||
defer unittest.OverrideFixtures("models/user/fixtures/")()
|
||||
require.NoError(t, unittest.PrepareTestDatabase())
|
||||
|
||||
test := func(userID int64) {
|
||||
user, err := user_model.GetUserByID(t.Context(), userID)
|
||||
require.NoError(t, err)
|
||||
isUser, err := user_model.IsUserByID(t.Context(), userID)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, user.IsUser(), isUser)
|
||||
}
|
||||
|
||||
test(1)
|
||||
test(1041)
|
||||
test(1042)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,9 +21,10 @@ import (
|
|||
)
|
||||
|
||||
type DetectedWorkflow struct {
|
||||
EntryName string
|
||||
TriggerEvent *jobparser.Event
|
||||
Content []byte
|
||||
EntryName string
|
||||
TriggerEvent *jobparser.Event
|
||||
Content []byte
|
||||
EventDetectionError error
|
||||
}
|
||||
|
||||
func init() {
|
||||
|
|
@ -127,7 +128,8 @@ func DetectWorkflows(
|
|||
TriggerEvent: &jobparser.Event{
|
||||
Name: triggedEvent.Event(),
|
||||
},
|
||||
Content: content,
|
||||
Content: content,
|
||||
EventDetectionError: err,
|
||||
}
|
||||
workflows = append(workflows, dwf)
|
||||
continue
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ import (
|
|||
"image"
|
||||
"image/color"
|
||||
"image/png"
|
||||
"io"
|
||||
|
||||
_ "image/gif" // for processing gif images
|
||||
_ "image/jpeg" // for processing jpeg images
|
||||
|
|
@ -17,6 +18,7 @@ import (
|
|||
"forgejo.org/modules/avatar/identicon"
|
||||
"forgejo.org/modules/setting"
|
||||
|
||||
exif_terminator "code.superseriousbusiness.org/exif-terminator"
|
||||
"golang.org/x/image/draw"
|
||||
|
||||
_ "golang.org/x/image/webp" // for processing webp images
|
||||
|
|
@ -66,15 +68,29 @@ func processAvatarImage(data []byte, maxOriginSize int64) ([]byte, error) {
|
|||
return nil, fmt.Errorf("image height is too large: %d > %d", imgCfg.Height, setting.Avatar.MaxHeight)
|
||||
}
|
||||
|
||||
var cleanedBytes []byte
|
||||
if imgType != "gif" { // "gif" is the only imgType supported above, but not supported by exif_terminator
|
||||
cleanedData, err := exif_terminator.Terminate(bytes.NewReader(data), imgType)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error cleaning exif data: %w", err)
|
||||
}
|
||||
cleanedBytes, err = io.ReadAll(cleanedData)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error reading cleaned data: %w", err)
|
||||
}
|
||||
} else { // gif
|
||||
cleanedBytes = data
|
||||
}
|
||||
|
||||
// If the origin is small enough, just use it, then APNG could be supported,
|
||||
// otherwise, if the image is processed later, APNG loses animation.
|
||||
// And one more thing, webp is not fully supported, for animated webp, image.DecodeConfig works but Decode fails.
|
||||
// So for animated webp, if the uploaded file is smaller than maxOriginSize, it will be used, if it's larger, there will be an error.
|
||||
if len(data) < int(maxOriginSize) {
|
||||
return data, nil
|
||||
return cleanedBytes, nil
|
||||
}
|
||||
|
||||
img, _, err := image.Decode(bytes.NewReader(data))
|
||||
img, _, err := image.Decode(bytes.NewReader(cleanedBytes))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("image.Decode: %w", err)
|
||||
}
|
||||
|
|
@ -94,7 +110,7 @@ func processAvatarImage(data []byte, maxOriginSize int64) ([]byte, error) {
|
|||
|
||||
// usually the png compression is not good enough, use the original image (no cropping/resizing) if the origin is smaller
|
||||
if len(data) <= len(resized) {
|
||||
return data, nil
|
||||
return cleanedBytes, nil
|
||||
}
|
||||
|
||||
return resized, nil
|
||||
|
|
|
|||
|
|
@ -11,7 +11,10 @@ import (
|
|||
"testing"
|
||||
|
||||
"forgejo.org/modules/setting"
|
||||
"forgejo.org/modules/test"
|
||||
|
||||
jpegstructure "code.superseriousbusiness.org/go-jpeg-image-structure/v2"
|
||||
"github.com/dsoprea/go-exif/v3"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
|
@ -30,8 +33,8 @@ func Test_RandomImage(t *testing.T) {
|
|||
}
|
||||
|
||||
func Test_ProcessAvatarPNG(t *testing.T) {
|
||||
setting.Avatar.MaxWidth = 4096
|
||||
setting.Avatar.MaxHeight = 4096
|
||||
defer test.MockVariableValue(&setting.Avatar.MaxWidth, 4096)()
|
||||
defer test.MockVariableValue(&setting.Avatar.MaxHeight, 4096)()
|
||||
|
||||
data, err := os.ReadFile("testdata/avatar.png")
|
||||
require.NoError(t, err)
|
||||
|
|
@ -41,8 +44,8 @@ func Test_ProcessAvatarPNG(t *testing.T) {
|
|||
}
|
||||
|
||||
func Test_ProcessAvatarJPEG(t *testing.T) {
|
||||
setting.Avatar.MaxWidth = 4096
|
||||
setting.Avatar.MaxHeight = 4096
|
||||
defer test.MockVariableValue(&setting.Avatar.MaxWidth, 4096)()
|
||||
defer test.MockVariableValue(&setting.Avatar.MaxHeight, 4096)()
|
||||
|
||||
data, err := os.ReadFile("testdata/avatar.jpeg")
|
||||
require.NoError(t, err)
|
||||
|
|
@ -51,17 +54,28 @@ func Test_ProcessAvatarJPEG(t *testing.T) {
|
|||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
func Test_ProcessAvatarGIF(t *testing.T) {
|
||||
defer test.MockVariableValue(&setting.Avatar.MaxWidth, 4096)()
|
||||
defer test.MockVariableValue(&setting.Avatar.MaxHeight, 4096)()
|
||||
|
||||
data, err := os.ReadFile("testdata/avatar.gif")
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = processAvatarImage(data, 262144)
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
func Test_ProcessAvatarInvalidData(t *testing.T) {
|
||||
setting.Avatar.MaxWidth = 5
|
||||
setting.Avatar.MaxHeight = 5
|
||||
defer test.MockVariableValue(&setting.Avatar.MaxWidth, 5)()
|
||||
defer test.MockVariableValue(&setting.Avatar.MaxHeight, 5)()
|
||||
|
||||
_, err := processAvatarImage([]byte{}, 12800)
|
||||
assert.EqualError(t, err, "image.DecodeConfig: image: unknown format")
|
||||
}
|
||||
|
||||
func Test_ProcessAvatarInvalidImageSize(t *testing.T) {
|
||||
setting.Avatar.MaxWidth = 5
|
||||
setting.Avatar.MaxHeight = 5
|
||||
defer test.MockVariableValue(&setting.Avatar.MaxWidth, 5)()
|
||||
defer test.MockVariableValue(&setting.Avatar.MaxHeight, 5)()
|
||||
|
||||
data, err := os.ReadFile("testdata/avatar.png")
|
||||
require.NoError(t, err)
|
||||
|
|
@ -71,8 +85,8 @@ func Test_ProcessAvatarInvalidImageSize(t *testing.T) {
|
|||
}
|
||||
|
||||
func Test_ProcessAvatarImage(t *testing.T) {
|
||||
setting.Avatar.MaxWidth = 4096
|
||||
setting.Avatar.MaxHeight = 4096
|
||||
defer test.MockVariableValue(&setting.Avatar.MaxWidth, 4096)()
|
||||
defer test.MockVariableValue(&setting.Avatar.MaxHeight, 4096)()
|
||||
scaledSize := DefaultAvatarSize * setting.Avatar.RenderedSizeFactor
|
||||
|
||||
newImgData := func(size int, optHeight ...int) []byte {
|
||||
|
|
@ -135,3 +149,40 @@ func Test_ProcessAvatarImage(t *testing.T) {
|
|||
_, err = processAvatarImage(origin, 262144)
|
||||
require.ErrorContains(t, err, "image width is too large: 10 > 5")
|
||||
}
|
||||
|
||||
func safeExifJpeg(t *testing.T, jpeg []byte) {
|
||||
t.Helper()
|
||||
|
||||
parser := jpegstructure.NewJpegMediaParser()
|
||||
mediaContext, err := parser.ParseBytes(jpeg)
|
||||
require.NoError(t, err)
|
||||
|
||||
sl := mediaContext.(*jpegstructure.SegmentList)
|
||||
|
||||
rootIfd, _, err := sl.Exif()
|
||||
require.NoError(t, err)
|
||||
err = rootIfd.EnumerateTagsRecursively(func(ifd *exif.Ifd, ite *exif.IfdTagEntry) error {
|
||||
assert.Equal(t, "Orientation", ite.TagName(), "only Orientation EXIF tag expected")
|
||||
return nil
|
||||
})
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
func Test_ProcessAvatarExif(t *testing.T) {
|
||||
t.Run("greater than max origin size", func(t *testing.T) {
|
||||
data, err := os.ReadFile("testdata/exif.jpg")
|
||||
require.NoError(t, err)
|
||||
|
||||
processedData, err := processAvatarImage(data, 12800)
|
||||
require.NoError(t, err)
|
||||
safeExifJpeg(t, processedData)
|
||||
})
|
||||
t.Run("smaller than max origin size", func(t *testing.T) {
|
||||
data, err := os.ReadFile("testdata/exif.jpg")
|
||||
require.NoError(t, err)
|
||||
|
||||
processedData, err := processAvatarImage(data, 128000)
|
||||
require.NoError(t, err)
|
||||
safeExifJpeg(t, processedData)
|
||||
})
|
||||
}
|
||||
|
|
|
|||
BIN
modules/avatar/testdata/avatar.gif
vendored
Normal file
BIN
modules/avatar/testdata/avatar.gif
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 70 B |
BIN
modules/avatar/testdata/exif.jpg
vendored
Normal file
BIN
modules/avatar/testdata/exif.jpg
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 16 KiB |
|
|
@ -133,7 +133,55 @@ func CloneWithArgs(ctx context.Context, args TrustedCmdArgs, from, to string, op
|
|||
return err
|
||||
}
|
||||
|
||||
cmd := NewCommandContextNoGlobals(ctx, args...).AddArguments("clone")
|
||||
cmd := NewCommandContextNoGlobals(ctx, args...)
|
||||
|
||||
envs := os.Environ()
|
||||
parsedFromURL, err := url.Parse(from)
|
||||
if err == nil {
|
||||
envs = proxy.EnvWithProxy(parsedFromURL)
|
||||
}
|
||||
|
||||
fromURL := from
|
||||
sanitizedFrom := from
|
||||
|
||||
// If the clone URL has credentials, build a credential file for usage by git-credential-store
|
||||
// to prevent credential leak in the process list.
|
||||
// https://git-scm.com/docs/git-credential-store#_storage_format
|
||||
// credential.helper adjustment must be set before the git subcommand
|
||||
if strings.Contains(from, "://") && strings.Contains(from, "@") {
|
||||
sanitizedFrom = util.SanitizeCredentialURLs(from)
|
||||
if parsedFromURL != nil {
|
||||
credentialsFile, err := os.CreateTemp("", "forgejo-clone-credentials-")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
credentialsPath := credentialsFile.Name()
|
||||
|
||||
defer func() {
|
||||
_ = credentialsFile.Close()
|
||||
if err := util.Remove(credentialsPath); err != nil {
|
||||
log.Warn("Unable to remove temporary file %q: %v", credentialsPath, err)
|
||||
}
|
||||
}()
|
||||
_, err = credentialsFile.Write([]byte(parsedFromURL.String()))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = credentialsFile.Close()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
cmd.AddArguments("-c").AddDynamicArguments("credential.helper=store --file=" + credentialsPath)
|
||||
|
||||
// remove the password from the URL argument
|
||||
parsedFromURL.User = url.User(parsedFromURL.User.Username())
|
||||
fromURL = parsedFromURL.String()
|
||||
}
|
||||
}
|
||||
|
||||
cmd.AddArguments("clone")
|
||||
|
||||
if opts.SkipTLSVerify {
|
||||
cmd.AddArguments("-c", "http.sslVerify=false")
|
||||
}
|
||||
|
|
@ -162,81 +210,6 @@ func CloneWithArgs(ctx context.Context, args TrustedCmdArgs, from, to string, op
|
|||
cmd.AddArguments("-b").AddDynamicArguments(opts.Branch)
|
||||
}
|
||||
|
||||
envs := os.Environ()
|
||||
parsedFromURL, err := url.Parse(from)
|
||||
if err == nil {
|
||||
envs = proxy.EnvWithProxy(parsedFromURL)
|
||||
}
|
||||
|
||||
fromURL := from
|
||||
sanitizedFrom := from
|
||||
|
||||
// If the clone URL has credentials, sanitize it and store the credentials in
|
||||
// a temporary file that git will access.
|
||||
if strings.Contains(from, "://") && strings.Contains(from, "@") {
|
||||
sanitizedFrom = util.SanitizeCredentialURLs(from)
|
||||
if parsedFromURL != nil {
|
||||
if pwd, has := parsedFromURL.User.Password(); has {
|
||||
parsedFromURL.User = url.User(parsedFromURL.User.Username())
|
||||
fromURL = parsedFromURL.String()
|
||||
|
||||
credentialsFile, err := os.CreateTemp(os.TempDir(), "forgejo-clone-credentials")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
credentialsPath := credentialsFile.Name()
|
||||
|
||||
defer func() {
|
||||
_ = credentialsFile.Close()
|
||||
if err := util.Remove(credentialsPath); err != nil {
|
||||
log.Warn("Unable to remove temporary file %q: %v", credentialsPath, err)
|
||||
}
|
||||
}()
|
||||
|
||||
// Make it read-write.
|
||||
if err := credentialsFile.Chmod(0o600); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Write the password.
|
||||
if _, err := fmt.Fprint(credentialsFile, pwd); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
askpassFile, err := os.CreateTemp(os.TempDir(), "forgejo-askpass")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
askpassPath := askpassFile.Name()
|
||||
|
||||
defer func() {
|
||||
_ = askpassFile.Close()
|
||||
if err := util.Remove(askpassPath); err != nil {
|
||||
log.Warn("Unable to remove temporary file %q: %v", askpassPath, err)
|
||||
}
|
||||
}()
|
||||
|
||||
// Make it executable.
|
||||
if err := askpassFile.Chmod(0o700); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Write the password script.
|
||||
if _, err := fmt.Fprintf(askpassFile, "exec cat %s", credentialsPath); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Close it, so that Git can use it and no busy errors arise.
|
||||
_ = askpassFile.Close()
|
||||
_ = credentialsFile.Close()
|
||||
|
||||
// Use environments to specify that git should ask for credentials, this
|
||||
// takes precedences over anything else https://git-scm.com/docs/gitcredentials#_requesting_credentials.
|
||||
envs = append(envs, "GIT_ASKPASS="+askpassPath)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
cmd.SetDescription(fmt.Sprintf("clone branch %s from %s to %s (shared: %t, mirror: %t, depth: %d)", opts.Branch, sanitizedFrom, to, opts.Shared, opts.Mirror, opts.Depth))
|
||||
cmd.AddDashesAndList(fromURL, to)
|
||||
|
||||
|
|
|
|||
|
|
@ -7,6 +7,8 @@ import (
|
|||
"errors"
|
||||
"fmt"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var (
|
||||
|
|
@ -17,7 +19,7 @@ var (
|
|||
)
|
||||
|
||||
// LineBlame returns the latest commit at the given line
|
||||
func (repo *Repository) LineBlame(revision, file string, line uint64) (*Commit, error) {
|
||||
func (repo *Repository) LineBlame(revision, file string, line uint64) (*Commit, uint64, error) {
|
||||
res, _, gitErr := NewCommand(repo.Ctx, "blame").
|
||||
AddOptionFormat("-L %d,%d", line, line).
|
||||
AddOptionValues("-p", revision).
|
||||
|
|
@ -26,24 +28,40 @@ func (repo *Repository) LineBlame(revision, file string, line uint64) (*Commit,
|
|||
stdErr := gitErr.Stderr()
|
||||
|
||||
if stdErr == fmt.Sprintf("fatal: no such path %s in %s\n", file, revision) {
|
||||
return nil, ErrBlameFileDoesNotExist
|
||||
return nil, 0, ErrBlameFileDoesNotExist
|
||||
}
|
||||
if notEnoughLinesRe.MatchString(stdErr) {
|
||||
return nil, ErrBlameFileNotEnoughLines
|
||||
return nil, 0, ErrBlameFileNotEnoughLines
|
||||
}
|
||||
|
||||
return nil, gitErr
|
||||
return nil, 0, gitErr
|
||||
}
|
||||
|
||||
objectFormat, err := repo.GetObjectFormat()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return nil, 0, err
|
||||
}
|
||||
|
||||
objectIDLen := objectFormat.FullLength()
|
||||
if len(res) < objectIDLen {
|
||||
return nil, fmt.Errorf("output of blame is invalid, cannot contain commit ID: %s", res)
|
||||
|
||||
if len(res) < objectIDLen+1 {
|
||||
return nil, 0, fmt.Errorf("output of blame is invalid, cannot contain commit ID: %s", res)
|
||||
}
|
||||
|
||||
return repo.GetCommit(res[:objectIDLen])
|
||||
commit, err := repo.GetCommit(res[:objectIDLen])
|
||||
if err != nil {
|
||||
return nil, 0, fmt.Errorf("GetCommit: %w", err)
|
||||
}
|
||||
|
||||
endIdxOriginalLineNo := strings.IndexRune(res[objectIDLen+1:], ' ')
|
||||
if endIdxOriginalLineNo == -1 {
|
||||
return nil, 0, fmt.Errorf("output of blame is invalid, cannot contain original line number: %s", res)
|
||||
}
|
||||
|
||||
originalLineNo, err := strconv.ParseUint(res[objectIDLen+1:objectIDLen+1+endIdxOriginalLineNo], 10, 64)
|
||||
if err != nil {
|
||||
return nil, 0, fmt.Errorf("strconv.ParseUint: %w", err)
|
||||
}
|
||||
|
||||
return commit, originalLineNo, nil
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,6 +4,9 @@
|
|||
package git
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"os"
|
||||
"path"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
|
||||
|
|
@ -17,17 +20,20 @@ func TestLineBlame(t *testing.T) {
|
|||
require.NoError(t, err)
|
||||
defer repo.Close()
|
||||
|
||||
commit, err := repo.LineBlame("HEAD", "foo/link_short", 1)
|
||||
commit, lineno, err := repo.LineBlame("HEAD", "foo/link_short", 1)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, "37991dec2c8e592043f47155ce4808d4580f9123", commit.ID.String())
|
||||
assert.EqualValues(t, 1, lineno)
|
||||
|
||||
commit, err = repo.LineBlame("HEAD", "foo/link_short", 512)
|
||||
commit, lineno, err = repo.LineBlame("HEAD", "foo/link_short", 512)
|
||||
require.ErrorIs(t, err, ErrBlameFileNotEnoughLines)
|
||||
assert.Nil(t, commit)
|
||||
assert.Zero(t, lineno)
|
||||
|
||||
commit, err = repo.LineBlame("HEAD", "non-existent/path", 512)
|
||||
commit, lineno, err = repo.LineBlame("HEAD", "non-existent/path", 512)
|
||||
require.ErrorIs(t, err, ErrBlameFileDoesNotExist)
|
||||
assert.Nil(t, commit)
|
||||
assert.Zero(t, lineno)
|
||||
})
|
||||
|
||||
t.Run("SHA256", func(t *testing.T) {
|
||||
|
|
@ -37,16 +43,68 @@ func TestLineBlame(t *testing.T) {
|
|||
require.NoError(t, err)
|
||||
defer repo.Close()
|
||||
|
||||
commit, err := repo.LineBlame("HEAD", "foo/link_short", 1)
|
||||
commit, lineno, err := repo.LineBlame("HEAD", "foo/link_short", 1)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, "6aae864a3d1d0d6a5be0cc64028c1e7021e2632b031fd8eb82afc5a283d1c3d1", commit.ID.String())
|
||||
assert.EqualValues(t, 1, lineno)
|
||||
|
||||
commit, err = repo.LineBlame("HEAD", "foo/link_short", 512)
|
||||
commit, lineno, err = repo.LineBlame("HEAD", "foo/link_short", 512)
|
||||
require.ErrorIs(t, err, ErrBlameFileNotEnoughLines)
|
||||
assert.Nil(t, commit)
|
||||
assert.Zero(t, lineno)
|
||||
|
||||
commit, err = repo.LineBlame("HEAD", "non-existent/path", 512)
|
||||
commit, lineno, err = repo.LineBlame("HEAD", "non-existent/path", 512)
|
||||
require.ErrorIs(t, err, ErrBlameFileDoesNotExist)
|
||||
assert.Nil(t, commit)
|
||||
assert.Zero(t, lineno)
|
||||
})
|
||||
|
||||
t.Run("Moved line", func(t *testing.T) {
|
||||
test := func(t *testing.T, objectFormatName string) {
|
||||
t.Helper()
|
||||
tmpDir := t.TempDir()
|
||||
|
||||
require.NoError(t, InitRepository(t.Context(), tmpDir, false, objectFormatName))
|
||||
|
||||
gitRepo, err := OpenRepository(t.Context(), tmpDir)
|
||||
require.NoError(t, err)
|
||||
defer gitRepo.Close()
|
||||
|
||||
require.NoError(t, os.WriteFile(path.Join(tmpDir, "ANSWER"), []byte("abba\n"), 0o666))
|
||||
require.NoError(t, AddChanges(tmpDir, true))
|
||||
require.NoError(t, CommitChanges(tmpDir, CommitChangesOptions{Message: "Favourite singer of everyone who follows a automata course"}))
|
||||
|
||||
firstCommit, err := gitRepo.GetRefCommitID("HEAD")
|
||||
require.NoError(t, err)
|
||||
|
||||
require.NoError(t, os.WriteFile(path.Join(tmpDir, "ANSWER"), append(bytes.Repeat([]byte("baba\n"), 9), []byte("abba\n")...), 0o666))
|
||||
require.NoError(t, AddChanges(tmpDir, true))
|
||||
require.NoError(t, CommitChanges(tmpDir, CommitChangesOptions{Message: "Now there's several of them"}))
|
||||
|
||||
secondCommit, err := gitRepo.GetRefCommitID("HEAD")
|
||||
require.NoError(t, err)
|
||||
|
||||
commit, lineno, err := gitRepo.LineBlame("HEAD", "ANSWER", 10)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, firstCommit, commit.ID.String())
|
||||
assert.EqualValues(t, 1, lineno)
|
||||
|
||||
for i := range uint64(9) {
|
||||
commit, lineno, err = gitRepo.LineBlame("HEAD", "ANSWER", i+1)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, secondCommit, commit.ID.String())
|
||||
assert.Equal(t, i+1, lineno)
|
||||
}
|
||||
}
|
||||
|
||||
t.Run("SHA1", func(t *testing.T) {
|
||||
test(t, Sha1ObjectFormat.Name())
|
||||
})
|
||||
|
||||
t.Run("SHA256", func(t *testing.T) {
|
||||
skipIfSHA256NotSupported(t)
|
||||
|
||||
test(t, Sha256ObjectFormat.Name())
|
||||
})
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -65,7 +65,6 @@ func TestRepoGetDivergingCommits(t *testing.T) {
|
|||
|
||||
func TestCloneCredentials(t *testing.T) {
|
||||
calledWithoutPassword := false
|
||||
askpassFile := ""
|
||||
credentialsFile := ""
|
||||
|
||||
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
|
||||
|
|
@ -87,8 +86,7 @@ func TestCloneCredentials(t *testing.T) {
|
|||
user, password, ok := bytes.Cut(rawAuth, []byte{':'})
|
||||
assert.True(t, ok)
|
||||
|
||||
// First time around Git tries without password (that's specified in the clone URL).
|
||||
// It demonstrates it doesn't immediately uses askpass.
|
||||
// First time around Git must try without password (password was removed from the clone URL to not appear as argument).
|
||||
if len(password) == 0 {
|
||||
assert.EqualValues(t, "oauth2", user)
|
||||
calledWithoutPassword = true
|
||||
|
|
@ -103,22 +101,15 @@ func TestCloneCredentials(t *testing.T) {
|
|||
|
||||
tmpDir := os.TempDir()
|
||||
|
||||
// Verify that the askpass implementation was used.
|
||||
files, err := fs.Glob(os.DirFS(tmpDir), "forgejo-askpass*")
|
||||
// Verify that the credential store was used.
|
||||
files, err := fs.Glob(os.DirFS(tmpDir), "forgejo-clone-credentials-*")
|
||||
require.NoError(t, err)
|
||||
for _, fileName := range files {
|
||||
fileContent, err := os.ReadFile(filepath.Join(tmpDir, fileName))
|
||||
credentialsFile = filepath.Join(tmpDir, fileName)
|
||||
fileContent, err := os.ReadFile(credentialsFile)
|
||||
require.NoError(t, err)
|
||||
|
||||
credentialsPath, ok := bytes.CutPrefix(fileContent, []byte(`exec cat `))
|
||||
assert.True(t, ok)
|
||||
|
||||
fileContent, err = os.ReadFile(string(credentialsPath))
|
||||
require.NoError(t, err)
|
||||
assert.EqualValues(t, "some_token", fileContent)
|
||||
|
||||
askpassFile = filepath.Join(tmpDir, fileName)
|
||||
credentialsFile = string(credentialsPath)
|
||||
assert.True(t, bytes.Contains(fileContent, []byte(`http`)), string(fileContent))
|
||||
}
|
||||
}))
|
||||
|
||||
|
|
@ -130,12 +121,9 @@ func TestCloneCredentials(t *testing.T) {
|
|||
require.NoError(t, Clone(t.Context(), serverURL.String(), t.TempDir(), CloneRepoOptions{}))
|
||||
|
||||
assert.True(t, calledWithoutPassword)
|
||||
assert.NotEmpty(t, askpassFile)
|
||||
assert.NotEmpty(t, credentialsFile)
|
||||
|
||||
// Check that the helper files are gone.
|
||||
_, err = os.Stat(askpassFile)
|
||||
require.ErrorIs(t, err, fs.ErrNotExist)
|
||||
// Check that the credential file is gone.
|
||||
_, err = os.Stat(credentialsFile)
|
||||
require.ErrorIs(t, err, fs.ErrNotExist)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,12 +29,12 @@ func TestParseGitURLs(t *testing.T) {
|
|||
},
|
||||
},
|
||||
{
|
||||
kase: "git@[fe80:14fc:cec5:c174:d88%2510]:go-gitea/gitea.git",
|
||||
kase: "git@[fe80::14fc:cec5:c174:d88%2510]:go-gitea/gitea.git",
|
||||
expected: &GitURL{
|
||||
URL: &url.URL{
|
||||
Scheme: "ssh",
|
||||
User: url.User("git"),
|
||||
Host: "[fe80:14fc:cec5:c174:d88%10]",
|
||||
Host: "[fe80::14fc:cec5:c174:d88%10]",
|
||||
Path: "go-gitea/gitea.git",
|
||||
},
|
||||
extraMark: 1,
|
||||
|
|
@ -132,11 +132,11 @@ func TestParseGitURLs(t *testing.T) {
|
|||
},
|
||||
},
|
||||
{
|
||||
kase: "https://[fe80:14fc:cec5:c174:d88%2510]:20/go-gitea/gitea.git",
|
||||
kase: "https://[fe80::14fc:cec5:c174:d88%2510]:20/go-gitea/gitea.git",
|
||||
expected: &GitURL{
|
||||
URL: &url.URL{
|
||||
Scheme: "https",
|
||||
Host: "[fe80:14fc:cec5:c174:d88%10]:20",
|
||||
Host: "[fe80::14fc:cec5:c174:d88%10]:20",
|
||||
Path: "/go-gitea/gitea.git",
|
||||
},
|
||||
extraMark: 0,
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@ import (
|
|||
"forgejo.org/modules/process"
|
||||
"forgejo.org/modules/queue"
|
||||
"forgejo.org/modules/setting"
|
||||
"forgejo.org/modules/util"
|
||||
)
|
||||
|
||||
var (
|
||||
|
|
@ -171,12 +172,12 @@ func Init() {
|
|||
log.Fatal("PID: %d Unable to initialize the bleve Repository Indexer at path: %s Error: %v", os.Getpid(), setting.Indexer.RepoPath, err)
|
||||
}
|
||||
case "elasticsearch":
|
||||
log.Info("PID: %d Initializing Repository Indexer at: %s", os.Getpid(), setting.Indexer.RepoConnStr)
|
||||
log.Info("PID: %d Initializing Repository Indexer at: %s", os.Getpid(), util.SanitizeCredentialURLs(setting.Indexer.RepoConnStr))
|
||||
defer func() {
|
||||
if err := recover(); err != nil {
|
||||
log.Error("PANIC whilst initializing repository indexer: %v\nStacktrace: %s", err, log.Stack(2))
|
||||
log.Error("The indexer files are likely corrupted and may need to be deleted")
|
||||
log.Error("You can completely remove the \"%s\" index to make Forgejo recreate the indexes", setting.Indexer.RepoConnStr)
|
||||
log.Error("You can completely remove the \"%s\" index to make Forgejo recreate the indexes", util.SanitizeCredentialURLs(setting.Indexer.RepoConnStr))
|
||||
}
|
||||
}()
|
||||
|
||||
|
|
@ -186,7 +187,7 @@ func Init() {
|
|||
cancel()
|
||||
(*globalIndexer.Load()).Close()
|
||||
close(waitChannel)
|
||||
log.Fatal("PID: %d Unable to initialize the elasticsearch Repository Indexer connstr: %s Error: %v", os.Getpid(), setting.Indexer.RepoConnStr, err)
|
||||
log.Fatal("PID: %d Unable to initialize the elasticsearch Repository Indexer connstr: %s Error: %v", os.Getpid(), util.SanitizeCredentialURLs(setting.Indexer.RepoConnStr), err)
|
||||
}
|
||||
|
||||
default:
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@ import (
|
|||
"forgejo.org/modules/process"
|
||||
"forgejo.org/modules/queue"
|
||||
"forgejo.org/modules/setting"
|
||||
"forgejo.org/modules/util"
|
||||
)
|
||||
|
||||
// IndexerMetadata is used to send data to the queue, so it contains only the ids.
|
||||
|
|
@ -100,7 +101,7 @@ func InitIssueIndexer(syncReindex bool) {
|
|||
issueIndexer = elasticsearch.NewIndexer(setting.Indexer.IssueConnStr, setting.Indexer.IssueIndexerName)
|
||||
existed, err = issueIndexer.Init(ctx)
|
||||
if err != nil {
|
||||
log.Fatal("Unable to issueIndexer.Init with connection %s Error: %v", setting.Indexer.IssueConnStr, err)
|
||||
log.Fatal("Unable to issueIndexer.Init with connection %s Error: %v", util.SanitizeCredentialURLs(setting.Indexer.IssueConnStr), err)
|
||||
}
|
||||
case "db":
|
||||
issueIndexer = db.NewIndexer()
|
||||
|
|
@ -108,7 +109,7 @@ func InitIssueIndexer(syncReindex bool) {
|
|||
issueIndexer = meilisearch.NewIndexer(setting.Indexer.IssueConnStr, setting.Indexer.IssueConnAuth, setting.Indexer.IssueIndexerName)
|
||||
existed, err = issueIndexer.Init(ctx)
|
||||
if err != nil {
|
||||
log.Fatal("Unable to issueIndexer.Init with connection %s Error: %v", setting.Indexer.IssueConnStr, err)
|
||||
log.Fatal("Unable to issueIndexer.Init with connection %s Error: %v", util.SanitizeCredentialURLs(setting.Indexer.IssueConnStr), err)
|
||||
}
|
||||
default:
|
||||
log.Fatal("Unknown issue indexer type: %s", setting.Indexer.IssueType)
|
||||
|
|
|
|||
|
|
@ -55,10 +55,13 @@ var (
|
|||
shortLinkPattern = regexp.MustCompile(`\[\[(.*?)\]\](\w*)`)
|
||||
|
||||
// anyHashPattern splits url containing SHA into parts
|
||||
anyHashPattern = regexp.MustCompile(`https?://(?:(?:\S+/){3,4}(?:commit|tree|blob)/)([0-9a-f]{7,64})(/[-+~_%.a-zA-Z0-9/]+)?(\?[-+~_%\.a-zA-Z0-9=&]+)?(#[-+~_%.a-zA-Z0-9]+)?`)
|
||||
anyHashPattern = regexp.MustCompile(`https?://[^\s/]+/(\S+/(?:commit|tree|blob))/([0-9a-f]{7,64})(/[-+~_%.a-zA-Z0-9/]+)?(\?[-+~_%\.a-zA-Z0-9=&]+)?(#[-+~_%.a-zA-Z0-9]+)?`)
|
||||
|
||||
// comparePattern matches "http://domain/org/repo/compare/COMMIT1...COMMIT2#hash"
|
||||
comparePattern = regexp.MustCompile(`https?://(?:\S+/){4,5}([0-9a-f]{7,64})(\.\.\.?)([0-9a-f]{7,64})?(#[-+~_%.a-zA-Z0-9]+)?`)
|
||||
comparePattern = regexp.MustCompile(`https?://[^\s/]+/(?:\S+/)?([^\s/]+/[^\s/]+)/compare/([0-9a-f]{7,64})(\.\.\.?)([0-9a-f]{7,64})?(\?[-+~_%\.a-zA-Z0-9=&/]+)?(#[-+~_%.a-zA-Z0-9]+)?`)
|
||||
|
||||
// pullReviewCommitPattern matches "https://domain.tld/<subpath...>/<owner>/<repo>/pulls/<id>/commits/<sha>"
|
||||
pullReviewCommitPattern = regexp.MustCompile(`https?://[^\s/]+/(?:\S+/)?([^\s/]+/[^\s/]+)/pulls/(\d+)/commits/([0-9a-f]{7,64})(#[-+~_%.a-zA-Z0-9]+)?`)
|
||||
|
||||
validLinksPattern = regexp.MustCompile(`^[a-z][\w-]+://`)
|
||||
|
||||
|
|
@ -147,6 +150,7 @@ func (p *postProcessError) Error() string {
|
|||
type processor func(ctx *RenderContext, node *html.Node)
|
||||
|
||||
var defaultProcessors = []processor{
|
||||
pullReviewCommitPatternProcessor,
|
||||
fullIssuePatternProcessor,
|
||||
comparePatternProcessor,
|
||||
filePreviewPatternProcessor,
|
||||
|
|
@ -177,6 +181,7 @@ func PostProcess(
|
|||
}
|
||||
|
||||
var commitMessageProcessors = []processor{
|
||||
pullReviewCommitPatternProcessor,
|
||||
fullIssuePatternProcessor,
|
||||
comparePatternProcessor,
|
||||
fullHashPatternProcessor,
|
||||
|
|
@ -209,6 +214,7 @@ func RenderCommitMessage(
|
|||
}
|
||||
|
||||
var commitMessageSubjectProcessors = []processor{
|
||||
pullReviewCommitPatternProcessor,
|
||||
fullIssuePatternProcessor,
|
||||
comparePatternProcessor,
|
||||
fullHashPatternProcessor,
|
||||
|
|
@ -796,6 +802,64 @@ func shortLinkProcessor(ctx *RenderContext, node *html.Node) {
|
|||
}
|
||||
}
|
||||
|
||||
// pullReviewCommitPatternProcessor creates links to pull review commits.
|
||||
func pullReviewCommitPatternProcessor(ctx *RenderContext, node *html.Node) {
|
||||
next := node.NextSibling
|
||||
for node != nil && node != next {
|
||||
m := pullReviewCommitPattern.FindStringSubmatchIndex(node.Data)
|
||||
if m == nil {
|
||||
return
|
||||
}
|
||||
|
||||
urlFull := node.Data[m[0]:m[1]]
|
||||
repoSlug := node.Data[m[2]:m[3]]
|
||||
id := node.Data[m[4]:m[5]]
|
||||
sha := base.ShortSha(node.Data[m[6]:m[7]])
|
||||
|
||||
// Create an `<a>` node with a text of
|
||||
// `!123 (commit <code>abcdef1234</code>)`
|
||||
aNode := &html.Node{
|
||||
Type: html.ElementNode,
|
||||
Data: atom.A.String(),
|
||||
Attr: []html.Attribute{{Key: "href", Val: urlFull}, {Key: "class", Val: "commit"}},
|
||||
}
|
||||
|
||||
text := "!" + id + " (commit "
|
||||
|
||||
baseURLEnd := strings.Index(urlFull, repoSlug) + len(repoSlug)
|
||||
if len(ctx.Links.Base) > 0 && !strings.HasPrefix(ctx.Links.Base, urlFull[:baseURLEnd]) {
|
||||
text = repoSlug + "@" + text
|
||||
}
|
||||
|
||||
aNode.AppendChild(&html.Node{
|
||||
Type: html.TextNode,
|
||||
Data: text,
|
||||
})
|
||||
|
||||
textNode := &html.Node{
|
||||
Type: html.TextNode,
|
||||
Data: sha,
|
||||
}
|
||||
|
||||
codeNode := &html.Node{
|
||||
Type: html.ElementNode,
|
||||
Data: atom.Code.String(),
|
||||
Attr: []html.Attribute{{Key: "class", Val: "nohighlight"}},
|
||||
}
|
||||
|
||||
codeNode.AppendChild(textNode)
|
||||
aNode.AppendChild(codeNode)
|
||||
|
||||
aNode.AppendChild(&html.Node{
|
||||
Type: html.TextNode,
|
||||
Data: ")",
|
||||
})
|
||||
|
||||
replaceContent(node, m[0], m[1], aNode)
|
||||
node = node.NextSibling.NextSibling
|
||||
}
|
||||
}
|
||||
|
||||
func fullIssuePatternProcessor(ctx *RenderContext, node *html.Node) {
|
||||
if ctx.Metas == nil {
|
||||
return
|
||||
|
|
@ -952,7 +1016,7 @@ func commitCrossReferencePatternProcessor(ctx *RenderContext, node *html.Node) {
|
|||
}
|
||||
}
|
||||
|
||||
// fullHashPatternProcessor renders SHA containing URLs
|
||||
// fullHashPatternProcessor renders URLs that contain a SHA
|
||||
func fullHashPatternProcessor(ctx *RenderContext, node *html.Node) {
|
||||
if ctx.Metas == nil {
|
||||
return
|
||||
|
|
@ -966,37 +1030,103 @@ func fullHashPatternProcessor(ctx *RenderContext, node *html.Node) {
|
|||
}
|
||||
|
||||
urlFull := node.Data[m[0]:m[1]]
|
||||
text := base.ShortSha(node.Data[m[2]:m[3]])
|
||||
|
||||
// 3rd capture group matches a optional path
|
||||
subpath := ""
|
||||
if m[5] > 0 {
|
||||
subpath = node.Data[m[4]:m[5]]
|
||||
// In most cases, the URL will look like this:
|
||||
// `https://domain.tld/<owner>/<repo>/<path>/<sha>`.
|
||||
// The amount of components in `<path>` is variable, but that alone is doable with regexp.
|
||||
//
|
||||
// However, Forgejo also allows being hosted on a sub path, i.e.
|
||||
// `https://domain.tld/<sub>/<owner>/<repo>/<path>/<sha>`.
|
||||
// And this sub path can also have any amount of components. But fishing out a section
|
||||
// between two variable length matches is not something regular grammars are capable of.
|
||||
//
|
||||
// Instead, the regexp extracts the entire path section before the SHA
|
||||
// (i.e. `<sub>/<owner>/<repo>/<path>`), and we find the components we need by counting.
|
||||
// `<sub>` is unknown, but the possible values for `<path>` are defined by us
|
||||
// (see `router/web/web.go`). So we count from the back.
|
||||
subPath := node.Data[m[2]:m[3]]
|
||||
|
||||
components := strings.Split(subPath, "/")
|
||||
componentCount := len(components)
|
||||
|
||||
// In most cases, the `<owner>` component is right at the start of the path.
|
||||
ownerIndex := 0
|
||||
|
||||
// But if there are more than three components, this could be `<sub>` or an app route
|
||||
// with two components. Or both.
|
||||
if componentCount > 3 {
|
||||
// As mentioned, we count from the back. We decrement for the `<repo>` component, and the one
|
||||
// component from the app route that's guaranteed to be there.
|
||||
// We also adjust this to be an array index, so we subtract one more.
|
||||
ownerIndex = componentCount - 3
|
||||
|
||||
// We then check for known app routes that use two components.
|
||||
// Currently, this checks for:
|
||||
// - `src/commit`
|
||||
// - `commits/commit`
|
||||
//
|
||||
// This does have one scenario where we cannot figure things out reliably:
|
||||
// If there is a sub path, and the repository is named like one of the known app routes
|
||||
// (e.g. `src`), we cannot distinguish between the repo and the app route.
|
||||
// We assume that naming a repository like that is uncommon, and prioritize the case where its
|
||||
// part of the app route.
|
||||
if components[componentCount-1] == "commit" &&
|
||||
(components[componentCount-2] == "src" || components[componentCount-2] == "commits") {
|
||||
ownerIndex--
|
||||
}
|
||||
}
|
||||
|
||||
repoSlug := components[ownerIndex] + "/" + components[ownerIndex+1]
|
||||
|
||||
text := base.ShortSha(node.Data[m[4]:m[5]])
|
||||
|
||||
// We need to figure out the base of the provided URL, which is up to and including the
|
||||
// `<owner>/<repo>` slug.
|
||||
// With that we can determine if it matches the current repo, or if the slug should be shown.
|
||||
baseURLEnd := strings.Index(urlFull, repoSlug) + len(repoSlug)
|
||||
if len(ctx.Links.Base) > 0 && !strings.HasPrefix(ctx.Links.Base, urlFull[:baseURLEnd]) {
|
||||
text = repoSlug + "@" + text
|
||||
}
|
||||
|
||||
// 3rd capture group matches an optional file path after the SHA
|
||||
filePath := ""
|
||||
if m[7] > 0 {
|
||||
filePath = node.Data[m[6]:m[7]]
|
||||
}
|
||||
|
||||
// 5th capture group matches a optional url hash
|
||||
hash := ""
|
||||
if m[9] > 0 {
|
||||
hash = node.Data[m[8]:m[9]][1:]
|
||||
if m[11] > 0 {
|
||||
hash = node.Data[m[10]:m[11]][1:]
|
||||
|
||||
// Truncate long diff IDs
|
||||
if len(hash) > 15 && strings.HasPrefix(hash, "diff-") {
|
||||
hash = hash[:15]
|
||||
}
|
||||
}
|
||||
|
||||
start := m[0]
|
||||
end := m[1]
|
||||
|
||||
// If url ends in '.', it's very likely that it is not part of the
|
||||
// actual url but used to finish a sentence.
|
||||
// If the URL ends in '.', it's very likely that it is not part of the
|
||||
// actual URL but used to finish a sentence.
|
||||
if strings.HasSuffix(urlFull, ".") {
|
||||
end--
|
||||
urlFull = urlFull[:len(urlFull)-1]
|
||||
if hash != "" {
|
||||
hash = hash[:len(hash)-1]
|
||||
} else if subpath != "" {
|
||||
subpath = subpath[:len(subpath)-1]
|
||||
} else if filePath != "" {
|
||||
filePath = filePath[:len(filePath)-1]
|
||||
}
|
||||
}
|
||||
|
||||
if subpath != "" {
|
||||
text += subpath
|
||||
if filePath != "" {
|
||||
decoded, err := url.QueryUnescape(filePath)
|
||||
if err != nil {
|
||||
text += decoded
|
||||
} else {
|
||||
text += filePath
|
||||
}
|
||||
}
|
||||
|
||||
if hash != "" {
|
||||
|
|
@ -1019,41 +1149,71 @@ func comparePatternProcessor(ctx *RenderContext, node *html.Node) {
|
|||
return
|
||||
}
|
||||
|
||||
// Ensure that every group (m[0]...m[7]) has a match
|
||||
for i := 0; i < 8; i++ {
|
||||
// Ensure that every group (m[0]...m[9]) has a match
|
||||
for i := 0; i < 10; i++ {
|
||||
if m[i] == -1 {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
urlFull := node.Data[m[0]:m[1]]
|
||||
text1 := base.ShortSha(node.Data[m[2]:m[3]])
|
||||
textDots := base.ShortSha(node.Data[m[4]:m[5]])
|
||||
text2 := base.ShortSha(node.Data[m[6]:m[7]])
|
||||
repoSlug := node.Data[m[2]:m[3]]
|
||||
text1 := base.ShortSha(node.Data[m[4]:m[5]])
|
||||
textDots := base.ShortSha(node.Data[m[6]:m[7]])
|
||||
text2 := base.ShortSha(node.Data[m[8]:m[9]])
|
||||
|
||||
query := ""
|
||||
if m[11] > 0 {
|
||||
query = node.Data[m[10]:m[11]][1:]
|
||||
}
|
||||
|
||||
hash := ""
|
||||
if m[9] > 0 {
|
||||
hash = node.Data[m[8]:m[9]][1:]
|
||||
if m[13] > 0 {
|
||||
hash = node.Data[m[12]:m[13]][1:]
|
||||
}
|
||||
|
||||
start := m[0]
|
||||
end := m[1]
|
||||
|
||||
// If url ends in '.', it's very likely that it is not part of the
|
||||
// actual url but used to finish a sentence.
|
||||
// If the URL ends in '.', it's very likely that it is not part of the
|
||||
// actual URL but used to finish a sentence.
|
||||
if strings.HasSuffix(urlFull, ".") {
|
||||
end--
|
||||
urlFull = urlFull[:len(urlFull)-1]
|
||||
if hash != "" {
|
||||
hash = hash[:len(hash)-1]
|
||||
} else if query != "" {
|
||||
query = query[:len(query)-1]
|
||||
} else if text2 != "" {
|
||||
text2 = text2[:len(text2)-1]
|
||||
}
|
||||
}
|
||||
|
||||
text := text1 + textDots + text2
|
||||
|
||||
baseURLEnd := strings.Index(urlFull, repoSlug) + len(repoSlug)
|
||||
if len(ctx.Links.Base) > 0 && !strings.HasPrefix(ctx.Links.Base, urlFull[:baseURLEnd]) {
|
||||
text = repoSlug + "@" + text
|
||||
}
|
||||
|
||||
extra := ""
|
||||
if query != "" {
|
||||
query, err := url.ParseQuery(query)
|
||||
if err == nil && query.Has("files") {
|
||||
extra = query.Get("files")
|
||||
}
|
||||
}
|
||||
|
||||
if hash != "" {
|
||||
text += " (" + hash + ")"
|
||||
if extra != "" {
|
||||
extra += "#"
|
||||
}
|
||||
|
||||
extra += hash
|
||||
}
|
||||
|
||||
if extra != "" {
|
||||
text += " (" + extra + ")"
|
||||
}
|
||||
replaceContent(node, start, end, createCodeLink(urlFull, text, "compare"))
|
||||
node = node.NextSibling.NextSibling
|
||||
|
|
@ -1094,7 +1254,7 @@ func filePreviewPatternProcessor(ctx *RenderContext, node *html.Node) {
|
|||
// Specialized version of replaceContent, so the parent paragraph element is not destroyed from our div
|
||||
before := node.Data[:(preview.start - offset)]
|
||||
after := node.Data[(preview.end - offset):]
|
||||
afterNode := &html.Node{
|
||||
afterTextNode := &html.Node{
|
||||
Type: html.TextNode,
|
||||
Data: after,
|
||||
}
|
||||
|
|
@ -1103,22 +1263,20 @@ func filePreviewPatternProcessor(ctx *RenderContext, node *html.Node) {
|
|||
case "div", "li", "td", "th", "details":
|
||||
nextSibling := node.NextSibling
|
||||
node.Parent.InsertBefore(previewNode, nextSibling)
|
||||
node.Parent.InsertBefore(afterNode, nextSibling)
|
||||
node.Parent.InsertBefore(afterTextNode, nextSibling)
|
||||
case "p", "span", "em", "strong":
|
||||
nextSibling := node.Parent.NextSibling
|
||||
node.Parent.Parent.InsertBefore(previewNode, nextSibling)
|
||||
afterPNode := &html.Node{
|
||||
nextParentSibling := node.Parent.NextSibling
|
||||
node.Parent.Parent.InsertBefore(previewNode, nextParentSibling)
|
||||
afterNode := &html.Node{
|
||||
Type: html.ElementNode,
|
||||
Data: node.Parent.Data,
|
||||
Attr: node.Parent.Attr,
|
||||
}
|
||||
afterPNode.AppendChild(afterNode)
|
||||
node.Parent.Parent.InsertBefore(afterPNode, nextSibling)
|
||||
siblingNode := node.NextSibling
|
||||
if siblingNode != nil {
|
||||
node.NextSibling = nil
|
||||
siblingNode.PrevSibling = nil
|
||||
afterPNode.AppendChild(siblingNode)
|
||||
afterNode.AppendChild(afterTextNode)
|
||||
node.Parent.Parent.InsertBefore(afterNode, nextParentSibling)
|
||||
for sibling := node.NextSibling; sibling != nil; sibling = node.NextSibling {
|
||||
sibling.Parent.RemoveChild(sibling)
|
||||
afterNode.AppendChild(sibling)
|
||||
}
|
||||
default:
|
||||
matched = false
|
||||
|
|
@ -1126,7 +1284,7 @@ func filePreviewPatternProcessor(ctx *RenderContext, node *html.Node) {
|
|||
if matched {
|
||||
offset = preview.end
|
||||
node.Data = before
|
||||
node = afterNode
|
||||
node = afterTextNode
|
||||
}
|
||||
}
|
||||
node = node.NextSibling
|
||||
|
|
|
|||
|
|
@ -303,12 +303,12 @@ func testRenderIssueIndexPattern(t *testing.T, input, expected string, ctx *Rend
|
|||
func TestRender_AutoLink(t *testing.T) {
|
||||
setting.AppURL = TestAppURL
|
||||
|
||||
test := func(input, expected string) {
|
||||
test := func(input, expected, base string) {
|
||||
var buffer strings.Builder
|
||||
err := PostProcess(&RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
Links: Links{
|
||||
Base: TestRepoURL,
|
||||
Base: base,
|
||||
},
|
||||
Metas: localMetas,
|
||||
}, strings.NewReader(input), &buffer)
|
||||
|
|
@ -319,7 +319,7 @@ func TestRender_AutoLink(t *testing.T) {
|
|||
err = PostProcess(&RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
Links: Links{
|
||||
Base: TestRepoURL,
|
||||
Base: base,
|
||||
},
|
||||
Metas: localMetas,
|
||||
IsWiki: true,
|
||||
|
|
@ -328,19 +328,87 @@ func TestRender_AutoLink(t *testing.T) {
|
|||
assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(buffer.String()))
|
||||
}
|
||||
|
||||
// render valid issue URLs
|
||||
test(util.URLJoin(TestRepoURL, "issues", "3333"),
|
||||
numericIssueLink(util.URLJoin(TestRepoURL, "issues"), "ref-issue", 3333, "#"))
|
||||
t.Run("Issue", func(t *testing.T) {
|
||||
// render valid issue URLs
|
||||
test(util.URLJoin(TestRepoURL, "issues", "3333"),
|
||||
numericIssueLink(util.URLJoin(TestRepoURL, "issues"), "ref-issue", 3333, "#"),
|
||||
TestRepoURL)
|
||||
})
|
||||
|
||||
// render valid commit URLs
|
||||
tmp := util.URLJoin(TestRepoURL, "commit", "d8a994ef243349f321568f9e36d5c3f444b99cae")
|
||||
test(tmp, "<a href=\""+tmp+"\" class=\"commit\"><code class=\"nohighlight\">d8a994ef24</code></a>")
|
||||
tmp += "#diff-2"
|
||||
test(tmp, "<a href=\""+tmp+"\" class=\"commit\"><code class=\"nohighlight\">d8a994ef24 (diff-2)</code></a>")
|
||||
t.Run("Commit", func(t *testing.T) {
|
||||
// render valid commit URLs
|
||||
tmp := util.URLJoin(TestRepoURL, "commit", "d8a994ef243349f321568f9e36d5c3f444b99cae")
|
||||
test(tmp, "<a href=\""+tmp+"\" class=\"commit\"><code class=\"nohighlight\">d8a994ef24</code></a>", TestRepoURL)
|
||||
test(tmp, "<a href=\""+tmp+"\" class=\"commit\"><code class=\"nohighlight\">"+TestOrgRepo+"@d8a994ef24</code></a>", "https://localhost/forgejo/forgejo")
|
||||
test(
|
||||
tmp+"#diff-2",
|
||||
"<a href=\""+tmp+"#diff-2\" class=\"commit\"><code class=\"nohighlight\">d8a994ef24 (diff-2)</code></a>",
|
||||
TestRepoURL,
|
||||
)
|
||||
test(
|
||||
tmp+"#diff-953bb4f01b7c77fa18f0cd54211255051e647dbc",
|
||||
"<a href=\""+tmp+"#diff-953bb4f01b7c77fa18f0cd54211255051e647dbc\" class=\"commit\"><code class=\"nohighlight\">d8a994ef24 (diff-953bb4f01b)</code></a>",
|
||||
TestRepoURL,
|
||||
)
|
||||
|
||||
// render other commit URLs
|
||||
tmp = "https://external-link.gitea.io/go-gitea/gitea/commit/d8a994ef243349f321568f9e36d5c3f444b99cae#diff-2"
|
||||
test(tmp, "<a href=\""+tmp+"\" class=\"commit\"><code class=\"nohighlight\">d8a994ef24 (diff-2)</code></a>")
|
||||
// render other commit URLs
|
||||
tmp = "https://external-link.gitea.io/go-gitea/gitea/commit/d8a994ef243349f321568f9e36d5c3f444b99cae#diff-2"
|
||||
test(tmp, "<a href=\""+tmp+"\" class=\"commit\"><code class=\"nohighlight\">d8a994ef24 (diff-2)</code></a>", "https://external-link.gitea.io/go-gitea/gitea")
|
||||
test(tmp, "<a href=\""+tmp+"\" class=\"commit\"><code class=\"nohighlight\">go-gitea/gitea@d8a994ef24 (diff-2)</code></a>", TestRepoURL)
|
||||
|
||||
tmp = "http://localhost:3000/gogits/gogs/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20"
|
||||
test(tmp, "<a href=\""+tmp+"\" class=\"commit\"><code class=\"nohighlight\">190d949293</code></a>", "http://localhost:3000/gogits/gogs")
|
||||
test(tmp, "<a href=\""+tmp+"\" class=\"commit\"><code class=\"nohighlight\">gogits/gogs@190d949293</code></a>", "https://external-link.gitea.io/go-gitea/gitea")
|
||||
|
||||
tmp = "http://localhost:3000/sub/gogits/gogs/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20"
|
||||
test(tmp, "<a href=\""+tmp+"\" class=\"commit\"><code class=\"nohighlight\">190d949293</code></a>", "http://localhost:3000/sub/gogits/gogs")
|
||||
test(tmp, "<a href=\""+tmp+"\" class=\"commit\"><code class=\"nohighlight\">gogits/gogs@190d949293</code></a>", "http://localhost:3000/gogits/gogs")
|
||||
test(tmp, "<a href=\""+tmp+"\" class=\"commit\"><code class=\"nohighlight\">gogits/gogs@190d949293</code></a>", "https://external-link.gitea.io/go-gitea/gitea")
|
||||
|
||||
tmp = "http://localhost:3000/sub1/sub2/sub3/gogits/gogs/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20"
|
||||
test(tmp, "<a href=\""+tmp+"\" class=\"commit\"><code class=\"nohighlight\">190d949293</code></a>", "http://localhost:3000/sub1/sub2/sub3/gogits/gogs")
|
||||
test(tmp, "<a href=\""+tmp+"\" class=\"commit\"><code class=\"nohighlight\">gogits/gogs@190d949293</code></a>", "http://localhost:3000/sub1/gogits/gogs")
|
||||
test(tmp, "<a href=\""+tmp+"\" class=\"commit\"><code class=\"nohighlight\">gogits/gogs@190d949293</code></a>", "https://external-link.gitea.io/go-gitea/gitea")
|
||||
|
||||
// if the repository happens to be named like one of the known app routes (e.g. `src`),
|
||||
// we can parse the URL correctly, if there is no sub path
|
||||
tmp = "http://localhost:3000/gogits/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20"
|
||||
test(tmp, "<a href=\""+tmp+"\" class=\"commit\"><code class=\"nohighlight\">gogits/src@190d949293</code></a>", TestRepoURL)
|
||||
tmp = "http://localhost:3000/gogits/src/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20"
|
||||
test(tmp, "<a href=\""+tmp+"\" class=\"commit\"><code class=\"nohighlight\">gogits/src@190d949293</code></a>", TestRepoURL)
|
||||
// but if there is a sub path, we cannot reliably distinguish the repo name from the app route
|
||||
tmp = "http://localhost:3000/sub/gogits/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20"
|
||||
test(tmp, "<a href=\""+tmp+"\" class=\"commit\"><code class=\"nohighlight\">sub/gogits@190d949293</code></a>", TestRepoURL)
|
||||
})
|
||||
|
||||
t.Run("Compare", func(t *testing.T) {
|
||||
tmp := util.URLJoin(TestRepoURL, "compare", "d8a994ef243349f321568f9e36d5c3f444b99cae..190d9492934af498c3f669d6a2431dc5459e5b20")
|
||||
test(tmp, "<a href=\""+tmp+"\" class=\"compare\"><code class=\"nohighlight\">d8a994ef24..190d949293</code></a>", TestRepoURL)
|
||||
test(tmp, "<a href=\""+tmp+"\" class=\"compare\"><code class=\"nohighlight\">"+TestOrgRepo+"@d8a994ef24..190d949293</code></a>", "https://localhost/forgejo/forgejo")
|
||||
|
||||
tmp = "http://localhost:3000/sub/gogits/gogs/compare/190d9492934af498c3f669d6a2431dc5459e5b20..d8a994ef243349f321568f9e36d5c3f444b99cae"
|
||||
test(tmp, "<a href=\""+tmp+"\" class=\"compare\"><code class=\"nohighlight\">190d949293..d8a994ef24</code></a>", "http://localhost:3000/sub/gogits/gogs")
|
||||
test(tmp, "<a href=\""+tmp+"\" class=\"compare\"><code class=\"nohighlight\">gogits/gogs@190d949293..d8a994ef24</code></a>", "http://localhost:3000/gogits/gogs")
|
||||
test(tmp, "<a href=\""+tmp+"\" class=\"compare\"><code class=\"nohighlight\">gogits/gogs@190d949293..d8a994ef24</code></a>", "https://external-link.gitea.io/go-gitea/gitea")
|
||||
|
||||
tmp = "http://localhost:3000/sub1/sub2/sub3/gogits/gogs/compare/190d9492934af498c3f669d6a2431dc5459e5b20..d8a994ef243349f321568f9e36d5c3f444b99cae"
|
||||
test(tmp, "<a href=\""+tmp+"\" class=\"compare\"><code class=\"nohighlight\">190d949293..d8a994ef24</code></a>", "http://localhost:3000/sub1/sub2/sub3/gogits/gogs")
|
||||
test(tmp, "<a href=\""+tmp+"\" class=\"compare\"><code class=\"nohighlight\">gogits/gogs@190d949293..d8a994ef24</code></a>", "http://localhost:3000/sub1/gogits/gogs")
|
||||
test(tmp, "<a href=\""+tmp+"\" class=\"compare\"><code class=\"nohighlight\">gogits/gogs@190d949293..d8a994ef24</code></a>", "https://external-link.gitea.io/go-gitea/gitea")
|
||||
|
||||
tmp = "https://codeberg.org/forgejo/forgejo/compare/8bbac4c679bea930c74849c355a60ed3c52f8eb5...e2278e5a38187a1dc84dc41d583ec8b44e7257c1?files=options/locale/locale_fi-FI.ini"
|
||||
test(tmp, "<a href=\""+tmp+"\" class=\"compare\"><code class=\"nohighlight\">8bbac4c679...e2278e5a38 (options/locale/locale_fi-FI.ini)</code></a>", "https://codeberg.org/forgejo/forgejo")
|
||||
test(tmp, "<a href=\""+tmp+"\" class=\"compare\"><code class=\"nohighlight\">forgejo/forgejo@8bbac4c679...e2278e5a38 (options/locale/locale_fi-FI.ini)</code></a>", TestRepoURL)
|
||||
test(tmp+".", "<a href=\""+tmp+"\" class=\"compare\"><code class=\"nohighlight\">forgejo/forgejo@8bbac4c679...e2278e5a38 (options/locale/locale_fi-FI.ini)</code></a>.", TestRepoURL)
|
||||
|
||||
tmp = "https://codeberg.org/forgejo/forgejo/compare/8bbac4c679bea930c74849c355a60ed3c52f8eb5...e2278e5a38187a1dc84dc41d583ec8b44e7257c1?files=options/locale/locale_fi-FI.ini#L2"
|
||||
test(tmp, "<a href=\""+tmp+"\" class=\"compare\"><code class=\"nohighlight\">8bbac4c679...e2278e5a38 (options/locale/locale_fi-FI.ini#L2)</code></a>", "https://codeberg.org/forgejo/forgejo")
|
||||
})
|
||||
|
||||
t.Run("Invalid URLs", func(t *testing.T) {
|
||||
tmp := "https://local host/gogits/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20"
|
||||
test(tmp, "<a href=\"https://local\" class=\"link\">https://local</a> host/gogits/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20", TestRepoURL)
|
||||
})
|
||||
}
|
||||
|
||||
func TestRender_IssueIndexPatternRef(t *testing.T) {
|
||||
|
|
@ -429,45 +497,79 @@ func TestRegExp_hashCurrentPattern(t *testing.T) {
|
|||
func TestRegExp_anySHA1Pattern(t *testing.T) {
|
||||
testCases := map[string][]string{
|
||||
"https://github.com/jquery/jquery/blob/a644101ed04d0beacea864ce805e0c4f86ba1cd1/test/unit/event.js#L2703": {
|
||||
"jquery/jquery/blob",
|
||||
"a644101ed04d0beacea864ce805e0c4f86ba1cd1",
|
||||
"/test/unit/event.js",
|
||||
"",
|
||||
"#L2703",
|
||||
},
|
||||
"https://github.com/jquery/jquery/blob/a644101ed04d0beacea864ce805e0c4f86ba1cd1/test/unit/event.js": {
|
||||
"jquery/jquery/blob",
|
||||
"a644101ed04d0beacea864ce805e0c4f86ba1cd1",
|
||||
"/test/unit/event.js",
|
||||
"",
|
||||
"",
|
||||
},
|
||||
"https://github.com/jquery/jquery/commit/0705be475092aede1eddae01319ec931fb9c65fc": {
|
||||
"jquery/jquery/commit",
|
||||
"0705be475092aede1eddae01319ec931fb9c65fc",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
},
|
||||
"https://github.com/jquery/jquery/tree/0705be475092aede1eddae01319ec931fb9c65fc/src": {
|
||||
"jquery/jquery/tree",
|
||||
"0705be475092aede1eddae01319ec931fb9c65fc",
|
||||
"/src",
|
||||
"",
|
||||
"",
|
||||
},
|
||||
"https://try.gogs.io/gogs/gogs/commit/d8a994ef243349f321568f9e36d5c3f444b99cae#diff-2": {
|
||||
"gogs/gogs/commit",
|
||||
"d8a994ef243349f321568f9e36d5c3f444b99cae",
|
||||
"",
|
||||
"",
|
||||
"#diff-2",
|
||||
},
|
||||
"https://codeberg.org/forgejo/forgejo/src/commit/949ab9a5c4cac742f84ae5a9fa186f8d6eb2cdc0/RELEASE-NOTES.md?display=source&w=1#L7-L9": {
|
||||
"forgejo/forgejo/src/commit",
|
||||
"949ab9a5c4cac742f84ae5a9fa186f8d6eb2cdc0",
|
||||
"/RELEASE-NOTES.md",
|
||||
"?display=source&w=1",
|
||||
"#L7-L9",
|
||||
},
|
||||
"http://localhost:3000/gogits/gogs/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20/path/to/file.go#L2-L3": {
|
||||
"gogits/gogs/src/commit",
|
||||
"190d9492934af498c3f669d6a2431dc5459e5b20",
|
||||
"/path/to/file.go",
|
||||
"",
|
||||
"#L2-L3",
|
||||
},
|
||||
"http://localhost:3000/sub/gogits/gogs/commit/190d9492934af498c3f669d6a2431dc5459e5b20/path/to/file.go#L2-L3": {
|
||||
"sub/gogits/gogs/commit",
|
||||
"190d9492934af498c3f669d6a2431dc5459e5b20",
|
||||
"/path/to/file.go",
|
||||
"",
|
||||
"#L2-L3",
|
||||
},
|
||||
"http://localhost:3000/sub/gogits/gogs/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20/path/to/file.go#L2-L3": {
|
||||
"sub/gogits/gogs/src/commit",
|
||||
"190d9492934af498c3f669d6a2431dc5459e5b20",
|
||||
"/path/to/file.go",
|
||||
"",
|
||||
"#L2-L3",
|
||||
},
|
||||
"http://localhost:3000/sub1/sub2/sub3/gogits/gogs/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20/path/to/file.go#L2-L3": {
|
||||
"sub1/sub2/sub3/gogits/gogs/src/commit",
|
||||
"190d9492934af498c3f669d6a2431dc5459e5b20",
|
||||
"/path/to/file.go",
|
||||
"",
|
||||
"#L2-L3",
|
||||
},
|
||||
}
|
||||
|
||||
for k, v := range testCases {
|
||||
assert.Equal(t, anyHashPattern.FindStringSubmatch(k)[1:], v)
|
||||
assert.Equal(t, v, anyHashPattern.FindStringSubmatch(k)[1:])
|
||||
}
|
||||
|
||||
for _, v := range []string{"https://codeberg.org/forgejo/forgejo/attachments/774421a1-b0ae-4501-8fba-983874b76811"} {
|
||||
|
|
|
|||
|
|
@ -241,6 +241,45 @@ func TestRender_links(t *testing.T) {
|
|||
markup.CustomLinkURLSchemes(setting.Markdown.CustomURLSchemes)
|
||||
}
|
||||
|
||||
func TestRender_PullReviewCommitLink(t *testing.T) {
|
||||
setting.AppURL = markup.TestAppURL
|
||||
|
||||
sha := "190d9492934af498c3f669d6a2431dc5459e5b20"
|
||||
prCommitLink := util.URLJoin(markup.TestRepoURL, "pulls", "1", "commits", sha)
|
||||
|
||||
test := func(input, expected, base string) {
|
||||
buffer, err := markup.RenderString(&markup.RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
RelativePath: ".md",
|
||||
Links: markup.Links{
|
||||
AbsolutePrefix: true,
|
||||
Base: base,
|
||||
},
|
||||
Metas: localMetas,
|
||||
}, input)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(buffer))
|
||||
}
|
||||
|
||||
test(prCommitLink, `<p><a href="`+prCommitLink+`" rel="nofollow">!1 (commit <code>`+sha[0:10]+`</code>)</a></p>`, markup.TestRepoURL)
|
||||
|
||||
prCommitLink = util.URLJoin(markup.TestAppURL, "sub1", "sub2", markup.TestOrgRepo, "pulls", "1", "commits", sha)
|
||||
test(
|
||||
prCommitLink,
|
||||
`<p><a href="`+prCommitLink+`" rel="nofollow">!1 (commit <code>`+sha[0:10]+`</code>)</a></p>`,
|
||||
util.URLJoin(markup.TestAppURL, "sub1", "sub2", markup.TestOrgRepo),
|
||||
)
|
||||
test(
|
||||
prCommitLink,
|
||||
`<p><a href="`+prCommitLink+`" rel="nofollow">`+markup.TestOrgRepo+`@!1 (commit <code>`+sha[0:10]+`</code>)</a></p>`,
|
||||
markup.TestRepoURL,
|
||||
)
|
||||
|
||||
prCommitLink = "https://codeberg.org/forgejo/forgejo/pulls/7979/commits/4d968c08e0a8d24bd2f3fb2a3a48b37e6d84a327#diff-7649acfa98a9ee3faf0d28b488bbff428317fc72"
|
||||
test(prCommitLink, `<p><a href="`+prCommitLink+`" rel="nofollow">!7979 (commit <code>4d968c08e0</code>)</a></p>`, "https://codeberg.org/forgejo/forgejo")
|
||||
test(prCommitLink, `<p><a href="`+prCommitLink+`" rel="nofollow">forgejo/forgejo@!7979 (commit <code>4d968c08e0</code>)</a></p>`, markup.TestRepoURL)
|
||||
}
|
||||
|
||||
func TestRender_email(t *testing.T) {
|
||||
setting.AppURL = markup.TestAppURL
|
||||
|
||||
|
|
@ -686,6 +725,9 @@ func TestIssue18471(t *testing.T) {
|
|||
err := markup.PostProcess(&markup.RenderContext{
|
||||
Ctx: git.DefaultContext,
|
||||
Metas: localMetas,
|
||||
Links: markup.Links{
|
||||
Base: "http://domain/org/repo",
|
||||
},
|
||||
}, strings.NewReader(data), &res)
|
||||
|
||||
require.NoError(t, err)
|
||||
|
|
@ -723,6 +765,9 @@ func TestRender_FilePreview(t *testing.T) {
|
|||
Ctx: git.DefaultContext,
|
||||
RelativePath: ".md",
|
||||
Metas: metas,
|
||||
Links: markup.Links{
|
||||
Base: markup.TestRepoURL,
|
||||
},
|
||||
}, input)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(buffer))
|
||||
|
|
@ -835,7 +880,7 @@ func TestRender_FilePreview(t *testing.T) {
|
|||
|
||||
testRender(
|
||||
urlWithSub,
|
||||
`<p><a href="http://localhost:3000/sub/gogits/gogs/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20/path/to/file.go#L2-L3" rel="nofollow"><code>190d949293/path/to/file.go (L2-L3)</code></a></p>`,
|
||||
`<p><a href="http://localhost:3000/sub/gogits/gogs/src/commit/190d9492934af498c3f669d6a2431dc5459e5b20/path/to/file.go#L2-L3" rel="nofollow"><code>gogits/gogs@190d949293/path/to/file.go (L2-L3)</code></a></p>`,
|
||||
localMetas,
|
||||
)
|
||||
|
||||
|
|
@ -1253,4 +1298,20 @@ func TestRender_FilePreview(t *testing.T) {
|
|||
localMetas,
|
||||
)
|
||||
})
|
||||
|
||||
t.Run("file previews followed by new line", func(t *testing.T) {
|
||||
testRender(
|
||||
commitFileURLFirstLine+"\nand\n"+commitFileURLFirstLine,
|
||||
"<p></p>"+filePreviewBox+"<p><br/>\nand<br/>\n</p>"+filePreviewBox+"<p></p>",
|
||||
localMetas,
|
||||
)
|
||||
})
|
||||
|
||||
t.Run("file previews followed by new line in div", func(t *testing.T) {
|
||||
testRender(
|
||||
"<div>"+commitFileURLFirstLine+"\nand\n"+commitFileURLFirstLine+"</div>",
|
||||
"<div>"+filePreviewBox+"\nand\n"+filePreviewBox+"</div>",
|
||||
localMetas,
|
||||
)
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@ import (
|
|||
"forgejo.org/modules/git"
|
||||
"forgejo.org/modules/setting"
|
||||
"forgejo.org/modules/util"
|
||||
"forgejo.org/modules/util/donotpanic"
|
||||
|
||||
"github.com/yuin/goldmark/ast"
|
||||
)
|
||||
|
|
@ -267,6 +268,15 @@ sandbox="allow-scripts"
|
|||
return err
|
||||
}
|
||||
|
||||
func postProcessOrCopy(ctx *RenderContext, renderer Renderer, reader io.Reader, writer io.Writer) (err error) {
|
||||
if r, ok := renderer.(PostProcessRenderer); ok && r.NeedPostProcess() {
|
||||
err = PostProcess(ctx, reader, writer)
|
||||
} else {
|
||||
_, err = io.Copy(writer, reader)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func render(ctx *RenderContext, renderer Renderer, input io.Reader, output io.Writer) error {
|
||||
var wg sync.WaitGroup
|
||||
var err error
|
||||
|
|
@ -293,7 +303,7 @@ func render(ctx *RenderContext, renderer Renderer, input io.Reader, output io.Wr
|
|||
|
||||
wg.Add(1)
|
||||
go func() {
|
||||
err = SanitizeReader(pr2, renderer.Name(), output)
|
||||
err = donotpanic.SafeFuncWithError(func() error { return SanitizeReader(pr2, renderer.Name(), output) })
|
||||
_ = pr2.Close()
|
||||
wg.Done()
|
||||
}()
|
||||
|
|
@ -303,11 +313,7 @@ func render(ctx *RenderContext, renderer Renderer, input io.Reader, output io.Wr
|
|||
|
||||
wg.Add(1)
|
||||
go func() {
|
||||
if r, ok := renderer.(PostProcessRenderer); ok && r.NeedPostProcess() {
|
||||
err = PostProcess(ctx, pr, pw2)
|
||||
} else {
|
||||
_, err = io.Copy(pw2, pr)
|
||||
}
|
||||
err = donotpanic.SafeFuncWithError(func() error { return postProcessOrCopy(ctx, renderer, pr, pw2) })
|
||||
_ = pr.Close()
|
||||
_ = pw2.Close()
|
||||
wg.Done()
|
||||
|
|
@ -320,7 +326,7 @@ func render(ctx *RenderContext, renderer Renderer, input io.Reader, output io.Wr
|
|||
if r, ok := renderer.(ExternalRenderer); ok && r.DisplayInIFrame() {
|
||||
// Append a short script to the iframe's contents, which will communicate the scroll height of the embedded document via postMessage, either once loaded (in case the containing page loads first) in response to a postMessage from external.js, in case the iframe loads first
|
||||
// We use '*' as a target origin for postMessage, because can be certain we are embedded on the same domain, due to X-Frame-Options configured elsewhere. (Plus, the offsetHeight of an embedded document is likely not sensitive data anyway.)
|
||||
_, _ = pw.Write([]byte("<script>{let postHeight = () => {window.parent.postMessage({frameHeight: document.documentElement.offsetHeight}, '*')}; window.addEventListener('load', postHeight); window.addEventListener('message', (event) => {if (event.source === window.parent && event.data.requestOffsetHeight) postHeight()});}</script>"))
|
||||
_, _ = pw.Write([]byte("<script>{let postHeight = () => {window.parent.postMessage({frameHeight: document.documentElement.offsetHeight || document.documentElement.scrollHeight}, '*')}; window.addEventListener('load', postHeight); window.addEventListener('message', (event) => {if (event.source === window.parent && event.data.requestOffsetHeight) postHeight()});}</script>"))
|
||||
}
|
||||
_ = pw.Close()
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,49 @@
|
|||
// Copyright 2017 The Gitea Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
// Copyright 2025 The Forgejo Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
package markup_test
|
||||
package markup
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"forgejo.org/modules/test"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
type failReader struct{}
|
||||
|
||||
func (*failReader) Read(p []byte) (n int, err error) {
|
||||
return 0, errors.New("FAIL")
|
||||
}
|
||||
|
||||
func TestRender_postProcessOrCopy(t *testing.T) {
|
||||
renderContext := &RenderContext{Ctx: t.Context()}
|
||||
|
||||
t.Run("CopyOK", func(t *testing.T) {
|
||||
input := "SOMETHING"
|
||||
output := &bytes.Buffer{}
|
||||
require.NoError(t, postProcessOrCopy(renderContext, nil, strings.NewReader(input), output))
|
||||
assert.Equal(t, input, output.String())
|
||||
})
|
||||
|
||||
renderer := GetRendererByType("markdown")
|
||||
|
||||
t.Run("PostProcessOK", func(t *testing.T) {
|
||||
input := "SOMETHING"
|
||||
output := &bytes.Buffer{}
|
||||
defer test.MockVariableValue(&defaultProcessors, []processor{})()
|
||||
require.NoError(t, postProcessOrCopy(renderContext, renderer, strings.NewReader(input), output))
|
||||
assert.Equal(t, input, output.String())
|
||||
})
|
||||
|
||||
t.Run("PostProcessError", func(t *testing.T) {
|
||||
input := &failReader{}
|
||||
defer test.MockVariableValue(&defaultProcessors, []processor{})()
|
||||
assert.ErrorContains(t, postProcessOrCopy(renderContext, renderer, input, &bytes.Buffer{}), "FAIL")
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -164,6 +164,7 @@ func PushUpdateAddTag(ctx context.Context, repo *repo_model.Repository, gitRepo
|
|||
NumCommits: commitsCount,
|
||||
CreatedUnix: timeutil.TimeStamp(createdAt.Unix()),
|
||||
IsTag: true,
|
||||
Note: tag.Message,
|
||||
}
|
||||
if author != nil {
|
||||
rel.PublisherID = author.ID
|
||||
|
|
|
|||
|
|
@ -1,14 +1,20 @@
|
|||
// Copyright 2024 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2025 The Forgejo Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package repository
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path"
|
||||
"testing"
|
||||
|
||||
repo_model "forgejo.org/models/repo"
|
||||
"forgejo.org/models/unittest"
|
||||
"forgejo.org/modules/git"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func Test_calcSync(t *testing.T) {
|
||||
|
|
@ -74,3 +80,56 @@ func Test_calcSync(t *testing.T) {
|
|||
assert.Equal(t, *gitTags[1], *updates[0], "updates equal")
|
||||
}
|
||||
}
|
||||
|
||||
func TestSyncReleasesWithTags(t *testing.T) {
|
||||
require.NoError(t, unittest.PrepareTestDatabase())
|
||||
|
||||
// Can be any repository that doesn't have the git tag releases.
|
||||
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
|
||||
|
||||
t.Run("SHA1", func(t *testing.T) {
|
||||
tmpDir := t.TempDir()
|
||||
|
||||
require.NoError(t, git.InitRepository(t.Context(), tmpDir, false, git.Sha1ObjectFormat.Name()))
|
||||
gitRepo, err := git.OpenRepository(t.Context(), tmpDir)
|
||||
require.NoError(t, err)
|
||||
defer gitRepo.Close()
|
||||
|
||||
require.NoError(t, os.WriteFile(path.Join(tmpDir, "README.md"), []byte("testing the testing"), 0o666))
|
||||
require.NoError(t, git.AddChanges(tmpDir, true))
|
||||
require.NoError(t, git.CommitChanges(tmpDir, git.CommitChangesOptions{Message: "Add README"}))
|
||||
require.NoError(t, gitRepo.CreateAnnotatedTag("v1.0.0", "First release \\o/", "HEAD"))
|
||||
|
||||
require.NoError(t, SyncReleasesWithTags(t.Context(), repo, gitRepo))
|
||||
|
||||
release := unittest.AssertExistsAndLoadBean(t, &repo_model.Release{RepoID: repo.ID, TagName: "v1.0.0"})
|
||||
assert.Equal(t, "First release \\o/\n", release.Note)
|
||||
assert.True(t, release.IsTag)
|
||||
assert.EqualValues(t, 1, release.NumCommits)
|
||||
})
|
||||
|
||||
t.Run("SHA256", func(t *testing.T) {
|
||||
if !git.SupportHashSha256 {
|
||||
t.Skip("skipping because installed Git version doesn't support SHA256")
|
||||
}
|
||||
|
||||
tmpDir := t.TempDir()
|
||||
|
||||
require.NoError(t, git.InitRepository(t.Context(), tmpDir, false, git.Sha256ObjectFormat.Name()))
|
||||
gitRepo, err := git.OpenRepository(t.Context(), tmpDir)
|
||||
require.NoError(t, err)
|
||||
defer gitRepo.Close()
|
||||
|
||||
require.NoError(t, os.WriteFile(path.Join(tmpDir, "README.md"), []byte("testing the testing"), 0o666))
|
||||
require.NoError(t, git.AddChanges(tmpDir, true))
|
||||
require.NoError(t, git.CommitChanges(tmpDir, git.CommitChangesOptions{Message: "Add README"}))
|
||||
require.NoError(t, gitRepo.CreateAnnotatedTag("v2.0.0", "Second release \\o/", "HEAD"))
|
||||
|
||||
require.NoError(t, SyncReleasesWithTags(t.Context(), repo, gitRepo))
|
||||
|
||||
release := unittest.AssertExistsAndLoadBean(t, &repo_model.Release{RepoID: repo.ID, TagName: "v2.0.0"})
|
||||
assert.Equal(t, "Second release \\o/\n", release.Note)
|
||||
assert.True(t, release.IsTag)
|
||||
assert.EqualValues(t, 1, release.NumCommits)
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,8 +14,6 @@ import (
|
|||
"strings"
|
||||
"time"
|
||||
|
||||
"forgejo.org/modules/log"
|
||||
|
||||
"xorm.io/xorm"
|
||||
)
|
||||
|
||||
|
|
@ -157,15 +155,6 @@ func DBSlaveConnStrs() ([]string, error) {
|
|||
dsns = append(dsns, dsn)
|
||||
}
|
||||
}
|
||||
// Fall back to master if no slave DSN was provided.
|
||||
if len(dsns) == 0 {
|
||||
master, err := DBMasterConnStr()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
log.Debug("Database: No dedicated replica host defined; falling back to primary DSN for replica connections")
|
||||
dsns = append(dsns, master)
|
||||
}
|
||||
return dsns, nil
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -52,3 +52,9 @@ func MockProtect[T any](p *T) (reset func()) {
|
|||
func SleepTillNextSecond() {
|
||||
time.Sleep(time.Second - time.Since(time.Now().Truncate(time.Second)))
|
||||
}
|
||||
|
||||
// When this is called, sleep until the truncated unix time to a minute was
|
||||
// increased by one.
|
||||
func SleepTillNextMinute() {
|
||||
time.Sleep(time.Minute - time.Since(time.Now().Truncate(time.Minute)))
|
||||
}
|
||||
|
|
|
|||
28
modules/util/donotpanic/donotpanic.go
Normal file
28
modules/util/donotpanic/donotpanic.go
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
// Copyright 2025 The Forgejo Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
package donotpanic
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"forgejo.org/modules/log"
|
||||
)
|
||||
|
||||
type FuncWithError func() error
|
||||
|
||||
func SafeFuncWithError(fun FuncWithError) (err error) {
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
log.Error("PANIC recovered: %v\nStacktrace: %s", r, log.Stack(2))
|
||||
rErr, ok := r.(error)
|
||||
if ok {
|
||||
err = fmt.Errorf("PANIC recover with error: %w", rErr)
|
||||
} else {
|
||||
err = fmt.Errorf("PANIC recover: %v", r)
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
return fun()
|
||||
}
|
||||
28
modules/util/donotpanic/donotpanic_test.go
Normal file
28
modules/util/donotpanic/donotpanic_test.go
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
// Copyright 2025 The Forgejo Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
package donotpanic
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestDoNotPanic_SafeFuncWithError(t *testing.T) {
|
||||
t.Run("OK", func(t *testing.T) {
|
||||
assert.NoError(t, SafeFuncWithError(func() error { return nil }))
|
||||
})
|
||||
|
||||
t.Run("PanickString", func(t *testing.T) {
|
||||
errorMessage := "ERROR MESSAGE"
|
||||
assert.ErrorContains(t, SafeFuncWithError(func() error { panic(errorMessage) }), fmt.Sprintf("recover: %s", errorMessage))
|
||||
})
|
||||
|
||||
t.Run("PanickError", func(t *testing.T) {
|
||||
errorMessage := "ERROR MESSAGE"
|
||||
assert.ErrorContains(t, SafeFuncWithError(func() error { panic(errors.New(errorMessage)) }), fmt.Sprintf("recover with error: %s", errorMessage))
|
||||
})
|
||||
}
|
||||
|
|
@ -88,7 +88,7 @@ func (r *Route) wrapMiddlewareAndHandler(h []any) ([]func(http.Handler) http.Han
|
|||
}
|
||||
}
|
||||
for _, m := range h {
|
||||
if h != nil {
|
||||
if m != nil {
|
||||
handlerProviders = append(handlerProviders, toHandlerProvider(m))
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,4 +23,6 @@ signed_in_as = Увайшоў як
|
|||
enable_javascript = Гэты вэб-сайт патрабуе JavaScript.
|
||||
toc = Змест
|
||||
licenses = Ліцэнзіі
|
||||
return_to_forgejo = Вярнуцца да Forgejo
|
||||
return_to_forgejo = Вярнуцца да Forgejo
|
||||
active_stopwatch = Актыўны трэкер часу
|
||||
tracked_time_summary = Абагульненне падлічанага часу на аснове фільтраў спісу праблем
|
||||
|
|
@ -1887,7 +1887,7 @@ org_full_name_holder = Пълно име на организацията
|
|||
teams = Екипи
|
||||
lower_members = участници
|
||||
lower_repositories = хранилища
|
||||
settings.repoadminchangeteam = Админ. на хранилището да може да добавя и премахва достъп за екипи
|
||||
settings.repoadminchangeteam = Админ. на хранилище да може да добавя и премахва достъп за екипи
|
||||
settings.email = Ел. поща за връзка
|
||||
settings.delete_account = Изтриване на тази организация
|
||||
settings.delete_org_title = Изтриване на организацията
|
||||
|
|
@ -1954,6 +1954,9 @@ settings.change_orgname_redirect_prompt.with_cooldown.one = Старото им
|
|||
teams.add_nonexistent_repo = Хранилището, което се опитвате да добавите, не съществува, моля, първо го създайте.
|
||||
teams.invite.by = Поканен от %s
|
||||
|
||||
teams.can_create_org_repo_helper = Участниците могат да създават нови хранилища в организацията. Създателят ще получи администраторски достъп до новото хранилище.
|
||||
teams.owners_permission_desc = Притежателите имат пълен достъп до <strong>всички хранилища</strong> и имат <strong>администраторски достъп</strong> до организацията.
|
||||
|
||||
[install]
|
||||
admin_password = Парола
|
||||
user = Потребителско име
|
||||
|
|
@ -2068,7 +2071,7 @@ projects = Проекти
|
|||
code = Код
|
||||
overview = Обзор
|
||||
watched = Наблюдавани хранилища
|
||||
unfollow = Прекратяване на следването
|
||||
unfollow = Отследване
|
||||
block = Блокиране
|
||||
settings = Потребителски настройки
|
||||
starred = Отбелязани хранилища
|
||||
|
|
|
|||
|
|
@ -484,13 +484,13 @@ team_invite.subject = %[1]s us convida a unir-vos a l'organització %[2]s
|
|||
release.title = Títol: %s
|
||||
release.downloads = Baixades:
|
||||
release.download.zip = Codi font (ZIP)
|
||||
repo.transfer.subject_to_you = %s us vol transferir el repositori "%s"
|
||||
repo.transfer.subject_to_you = %s us vol transferir el repositori «%s»
|
||||
repo.collaborator.added.subject = %s us ha afegit a %s com a col·laborador
|
||||
repo.collaborator.added.text = Us han afegit com a col·laborador al repositori:
|
||||
issue_assigned.issue = @%[1]s us ha assignat l'incidència %[2]s del repositori %[3]s.
|
||||
issue.x_mentioned_you = <b>@%s</b> us ha mencionat:
|
||||
issue.action.new = <b>@%[1]s</b> ha creat #%[2]d.
|
||||
repo.transfer.subject_to = %s vol transferir el repositori "%s" a %s
|
||||
repo.transfer.subject_to = %s vol transferir el repositori «%s» a %s
|
||||
repo.transfer.to_you = tu
|
||||
register_notify.text_3 = Si algú altre us ha fet aquest compte, necessitareu <a href="%s">configurar la vostra contrasenya</a> abans.
|
||||
password_change.subject = S'ha canviat la vostra contrasenya
|
||||
|
|
@ -508,6 +508,28 @@ issue.action.approve = <b>@%[1]s</b> ha aprovat aquesta sol·licitud d'extracci
|
|||
issue.action.reject = <b>@%[1]s</b> ha sol·licitat canvis en aquesta sol·licitud d'extracció.
|
||||
register_notify.text_2 = Podeu iniciar sessió al vostre compte fent servir el vostre nom d'usuari: %s
|
||||
|
||||
register_notify.text_1 = aquest és el vostre correu electrònic de confirmació pel registre de %s!
|
||||
password_change.text_1 = S'acaba de canviar la contrasenya pel vostre compte.
|
||||
issue.action.review = <b>@%[1]s</b> ha deixat un comentari a la vostra sol·licitud d'extracció.
|
||||
issue.action.review_dismissed = <b>@%[1]s</b> ha rebutjat l'última revisió de %[2]s per aquesta sol·licitud d'extracció.
|
||||
|
||||
reset_password = Recupereu el vostre compte
|
||||
reset_password.text = Si heu sigut vós, cliqueu el següent enllaç per recuperar el vostre compte abans de <b>%s</b>:
|
||||
primary_mail_change.text_1 = S'ha canviat la vostra adreça de correu electrònic principal a %[1]s. Això vol dir que aquesta adreça de correu electrònic no rebrà més notificacions de correu pel vostre compte.
|
||||
totp_disabled.text_1 = S'han desactivat les contrasenyes d'un sol ús basades en el temps (TOTP) pel vostre compte.
|
||||
totp_disabled.no_2fa = Ja no hi ha altres mètodes d'autenticació de doble factor configurats, per la qual cosa ja no és necessari iniciar sessió al vostre compte mitjançat autenticació de doble factor.
|
||||
removed_security_key.no_2fa = Ja no hi ha altres mètodes d'autenticació de doble factor configurats, per la qual cosa ja no és necessari iniciar sessió al vostre compte mitjançat autenticació de doble factor.
|
||||
totp_enrolled.text_1.has_webauthn = Heu habilitat el TOTP per al vostre compte. Això vol dir que, per a totes les futures connexions al vostre compte, podreu utilitzar el TOTP com a mètode d'autenticació en dos passos (2FA) o bé utilitzar qualsevol de les vostres claus de seguretat.
|
||||
issue.action.force_push = <b>%[1]s</b> ha realitzat un «force push» de <b>%[2]s</b> des de %[3]s fins a %[4]s.
|
||||
issue.action.push_1 = <b>@%[1]s</b> ha pujat $[3]d commit a %[2]s
|
||||
issue.action.push_n = <b>@%[1]s</b> ha pujat $[3]d commits a %[2]s
|
||||
issue.action.ready_for_review = <b>@%[1]s</b> ha marcat aquesta «pull request» com a preparada per a la revisió.
|
||||
issue.in_tree_path = A %s:
|
||||
release.new.text = <b>@%[1]s</b> ha publicat %[2]s a %[3]s
|
||||
release.note = Nota:
|
||||
|
||||
release.new.subject = %s a %s publicat
|
||||
|
||||
[modal]
|
||||
yes = Sí
|
||||
no = No
|
||||
|
|
@ -580,6 +602,32 @@ min_size_error = ` ha de contenir %s caràcters com a mínim.`
|
|||
max_size_error = ` ha de contenir %s caràcters com a màxim.`
|
||||
email_domain_is_not_allowed = El domini de l'adreça de correu electrònic <b>%s</b> de l'usuari entra en conflicte amb EMAIL_DOMAIN_ALLOWLIST o EMAIL_DOMAIN_BLOCKLIST. Assegureu-vos d'haver introduït l'adreça de correu electrònic correctament.
|
||||
|
||||
Website = Lloc web
|
||||
Location = Ubicació
|
||||
|
||||
AdminEmail = Correu electrònic de l'administrador
|
||||
AccessToken = Testimoni d'accés
|
||||
CommitSummary = Resum del commit
|
||||
CommitMessage = Missatge del commit
|
||||
CommitChoice = Selecció de commit
|
||||
TreeName = Camí del fitxer
|
||||
alpha_dash_error = ` hauria de contenir només caràcters alfanumèrics, guions ("-") i barres baixes ("_").`
|
||||
alpha_dash_dot_error = ` hauria de contenir només caràcters alfanumèrics, guions ("-"), barres baixes ("_") i punts (".").`
|
||||
regex_pattern_error = ` el patró d'expressió regular no és vàlid: %s.`
|
||||
required_prefix = L'entrada ha de començar amb "%s"
|
||||
|
||||
PayloadUrl = URL de càrrega útil
|
||||
git_ref_name_error = ` ha de ser un nom correcte de referència de Git.`
|
||||
size_error = ` ha de tenir una mida de %s.`
|
||||
include_error = ` ha de contenir la subcadena «%s».`
|
||||
glob_pattern_error = ` el patró glob no és vàlid: %s.`
|
||||
|
||||
username_error = ` només pot contenir caràcters alfanumèrics ("0-9","a-z","A-Z"), guió ("-"), barra baixa ("_") i punt ("."). No pot començar ni acabar amb caràcters no alfanumèrics, i els caràcters no alfanumèrics consecutius també estan prohibits.`
|
||||
username_error_no_dots = ` només pot contenir caràcters alfanumèrics ("0-9","a-z","A-Z"), guió ("-") i barra baixa ("_"). No pot començar ni acabar amb caràcters no alfanumèrics, i els caràcters no alfanumèrics consecutius tampoc estan permesos.`
|
||||
invalid_group_team_map_error = ` el mapatge no és vàlid: %s`
|
||||
username_claiming_cooldown = El nom d'usuari no es pot reservar degut a que el seu període de refredament encara no ha acabat. Es podrà fer servir en %[1]s.
|
||||
repository_force_private = S'ha activat "Forçar privat": els repositoris privats no es poden fer públics.
|
||||
|
||||
[settings]
|
||||
pronouns = Pronoms
|
||||
change_username_prompt = Nota: canviar el vostre nom d'usuari també canvia l'URL del vostre compte.
|
||||
|
|
@ -737,7 +785,115 @@ generate_token = Generar el testimoni
|
|||
generate_token_success = S'ha generat el vostre nou testimoni. Copieu-lo ara, ja que no es tornarà a mostrar.
|
||||
generate_token_name_duplicate = Ja s'ha usat <strong>%s</strong> com a nom d'aplicació. Si us plau, useu-ne un de nou.
|
||||
delete_token = Eliminar
|
||||
access_token_deletion =
|
||||
access_token_deletion =
|
||||
|
||||
biography_placeholder = Explica una mica sobre tu als altres! (Compatible amb Markdown)
|
||||
delete_email = Eliminar
|
||||
add_new_email = Afegir una adreça de correu electrònic
|
||||
add_new_openid = Afegir una nova URI d'OpenID
|
||||
add_email = Afegir una adreça de correu electrònic
|
||||
add_openid = Afegir una URI d'OpenID
|
||||
keep_email_private = Oculta l'adreça de correu electrònic
|
||||
delete_key = Eliminar
|
||||
added_on = Afegit el %s
|
||||
last_used = Usat per últim cop el
|
||||
can_read_info = Llegir
|
||||
can_write_info = Escriure
|
||||
show_openid = Mostrar al perfil
|
||||
hide_openid = Ocultar del perfil
|
||||
ssh_disabled = SSH està deshabilitat
|
||||
access_token_deletion_desc = Eliminar un testimoni revocarà l'accés al vostre compte de les aplicacions que l'estiguin fent servir. Aquesta acció no es pot desfer. Voleu continuar?
|
||||
delete_token_success = S'ha eliminat el testimoni. Les aplicacions que l'estiguin fent servir ja no tenen accés al vostre compte.
|
||||
regenerate_token = Regenerar
|
||||
access_token_regeneration = Regenerar un testimoni d'accés
|
||||
access_token_regeneration_desc = Regenerar un testimoni revocarà l'accés al vostre compte de les aplicacions que l'estiguin fent servir. Aquesta acció no es pot desfer. Voleu continuar?
|
||||
regenerate_token_success = S'ha regenerat el testimoni. Les aplicacions que el fan servir ja no tenen accés al vostre compte i s'han actualitzar al nou testimoni.
|
||||
permissions_public_only = Només públic
|
||||
permissions_access_all = Tot (públic, privat i limitat)
|
||||
select_permissions = Selecció de permisos
|
||||
permission_no_access = Sense accés
|
||||
permission_read = Lectura
|
||||
permission_write = Lectura i escriptura
|
||||
at_least_one_permission = Heu de seleccionar un permís com a mínim per crear un testimoni
|
||||
permissions_list = Permisos:
|
||||
manage_oauth2_applications = Gestionar aplicacions OAuth2
|
||||
edit_oauth2_application = Modificar aplicació OAuth2
|
||||
remove_oauth2_application = Eliminar aplicació OAuth2
|
||||
remove_oauth2_application_success = S'ha eliminat l'aplicació.
|
||||
create_oauth2_application = Crear una nova aplicació OAuth2
|
||||
create_oauth2_application_button = Crear aplicació
|
||||
create_oauth2_application_success = Heu creat amb èxit una nova aplicació OAuth2.
|
||||
update_oauth2_application_success = Heu actualitzat amb èxit l'aplicació OAuth2.
|
||||
oauth2_application_name = Nom de l'aplicació
|
||||
oauth2_redirect_uris = URIs de redirecció. Si us plau, poseu cada URI en una línia nova.
|
||||
save_application = Guardar
|
||||
oauth2_client_id = ID del client
|
||||
oauth2_client_secret = Secret del client
|
||||
oauth2_regenerate_secret = Regenerar secret
|
||||
oauth2_regenerate_secret_hint = Heu perdut el vostre secret?
|
||||
oauth2_application_edit = Edita
|
||||
authorized_oauth2_applications = Aplicacions OAuth2 autoritzades
|
||||
authorized_oauth2_applications_description = Heu permès accés al vostre compte personal de Forgejo a aquestes aplicacions de tercers. Si us plau, revoqueu l'accés de les aplicacions que ja no feu servir.
|
||||
revoke_key = Revocar
|
||||
revoke_oauth2_grant = Revocar l'accés
|
||||
revoke_oauth2_grant_description = Revocar l'accés d'aquesta aplicació de tercers impedirà que accedeixi a la vostra informació. N'esteu segurs?
|
||||
revoke_oauth2_grant_success = L'accés s'ha revocat amb èxit.
|
||||
twofa_desc = Per protegir el vostre compte del robatori de contrasenyes, podeu fer servir un telèfon intel·ligent o un altre dispositiu per rebre contrasenyes d'un sol ús basades en el temps ("TOTP").
|
||||
twofa_recovery_tip = Si perdeu el vostre dispositiu, podreu fer servir una clau de recuperació d'un sol ús per recuperar l'accés al vostre compte.
|
||||
twofa_disable = Desactivar l'autenticació de doble factor
|
||||
twofa_scratch_token_regenerate = Regenerar la clau de recuperació d'un sol ús
|
||||
twofa_scratch_token_regenerated = La vostra clau de recuperació d'un sol ús ara és %s. Emmagatzemeu-la en un lloc segur, ja que no es tornarà a mostrar.
|
||||
twofa_disable_note = L'autenticació de doble factor es pot desactivar si és necessari.
|
||||
twofa_disable_desc = Desactivar l'autenticació de doble factor farà que el vostre compte sigui menys segur. Voleu continuar?
|
||||
regenerate_scratch_token_desc = Si heu perdur la vostra clau de recuperació o ja l'heu fet servir per iniciar sessió, la podeu reiniciar aquí.
|
||||
twofa_disabled = S'ha desactivat l'autenticació de doble factor.
|
||||
scan_this_image = Escanegeu aquesta imatge amb la vostra aplicació d'autenticació:
|
||||
or_enter_secret = O introduïu el secret: %s
|
||||
then_enter_passcode = I introduïu el codi d'accés que es mostra a l'aplicació:
|
||||
passcode_invalid = El codi d'accés és incorrecte. Intenteu-ho de nou.
|
||||
twofa_failed_get_secret = No s'ha pogut obtenir el secret.
|
||||
webauthn_desc = Les claus de seguretat són dispositius que contenen claus criptogràfiques. Es poden fer servir per l'autenticació de doble factor. Les claus de seguretat han de ser compatibles amb l'estàndard <a rel="noreferrer" target="_blank" href="%s">WebAuthn Authenticator</a>.
|
||||
webauthn_register_key = Afegir una clau de seguretat
|
||||
webauthn_nickname = Sobrenom
|
||||
webauthn_delete_key_desc = Si elimineu una clau de seguretat no la podreu fer servir per iniciar sessió. Voleu continuar?
|
||||
webauthn_key_loss_warning = Si perdeu les vostres claus de seguretat, perdreu també l'accés al vostre compte.
|
||||
manage_account_links = Comptes vinculats
|
||||
manage_account_links_desc = Aquests comptes externs estan vinculats al vostre compte de Forgejo.
|
||||
link_account = Vincular un compte
|
||||
remove_account_link_desc = Eliminar un compte vinculat revocarà el seu accés al vostre compte de Forgejo. Voleu continuar?
|
||||
remove_account_link_success = S'ha eliminat el compte vinculat.
|
||||
orgs_none = No sou membres de cap organització.
|
||||
repos_none = No sou propietaris de cap repositori.
|
||||
blocked_users_none = No hi ha cap usuari bloquejat.
|
||||
delete_account = Eliminar el vostre compte
|
||||
delete_prompt = Aquest acció eliminarà permanentment el vostre compte. Aquesta acció <strong>no</strong> es pot desfer.
|
||||
confirm_delete_account = Confirmar l'eliminació
|
||||
delete_account_title = Eliminar el compte d'usuari
|
||||
delete_account_desc = Esteu segurs de voler eliminar permanentment aquest compte d'usuari?
|
||||
email_notifications.enable = Activar les notificacions per correu electrònic
|
||||
email_notifications.disable = Desactivar les notificacions per correu electrònic
|
||||
visibility.public_tooltip = Visible per a tothom
|
||||
visibility.limited_tooltip = Visible només pels usuaris que hagin iniciat sessió
|
||||
visibility.private_tooltip = Visible només pels membres de les organitzacions a les quals us hàgiu unit
|
||||
user_unblock_success = S'ha desbloquejat l'usuari amb èxit.
|
||||
user_block_success = S'ha bloquejat l'usuari amb èxit.
|
||||
quota.sizes.repos.all = Repositoris
|
||||
quota.sizes.repos.public = Repositoris públics
|
||||
quota.sizes.repos.private = Repositoris privats
|
||||
quota.sizes.git.all = Contingut de Git
|
||||
quota.sizes.git.lfs = Git LFS
|
||||
quota.sizes.assets.attachments.all = Fitxers adjunts
|
||||
quota.sizes.assets.attachments.issues = Fitxers adjunts a incidències
|
||||
quota.sizes.assets.artifacts = Artefactes
|
||||
quota.sizes.assets.packages.all = Paquets
|
||||
|
||||
enable_custom_avatar = Usa un avatar personalitzat
|
||||
|
||||
comment_type_group_assignee = Assignat
|
||||
primary = Principal
|
||||
visibility.public = Públic
|
||||
visibility.limited = Limitat
|
||||
visibility.private = Privat
|
||||
|
||||
[repo]
|
||||
settings.basic_settings = Configuració bàsica
|
||||
|
|
@ -823,7 +979,7 @@ settings.slack_channel = Canal
|
|||
settings.web_hook_name_forgejo = Forgejo
|
||||
settings.web_hook_name_gitea = Gitea
|
||||
settings.web_hook_name_slack = Slack
|
||||
settings.web_hook_name_telegram = Discord
|
||||
settings.web_hook_name_telegram = Telegram
|
||||
settings.web_hook_name_matrix = Matrix
|
||||
settings.sourcehut_builds.secrets = Secrets
|
||||
settings.deploy_key_content = Contingut
|
||||
|
|
@ -914,6 +1070,510 @@ language_other = Altres
|
|||
delete_preexisting_label = Eliminar
|
||||
issues.filter_milestone_all = Totes les fites
|
||||
|
||||
mirror_sync = sincronitzat
|
||||
mirror_password_placeholder = (Sense canvis)
|
||||
mirror_password_blank_placeholder = (No establert)
|
||||
stargazers = Admiradors
|
||||
stars = Estrelles
|
||||
desc.private = Privat
|
||||
desc.template = Plantilla
|
||||
desc.internal = Intern
|
||||
desc.archived = Arxivat
|
||||
desc.sha256 = SHA256
|
||||
template.webhooks = Webhooks
|
||||
template.topics = Temes
|
||||
template.avatar = Avatar
|
||||
need_auth = Autorització
|
||||
migrate_items_wiki = Wiki
|
||||
migrate_items_milestones = Fites
|
||||
migrate_items_labels = Etiquetes
|
||||
migrate_items_issues = Problemes
|
||||
migrate_items_releases = Publicacions
|
||||
watch = Segueix
|
||||
unwatch = Deixa de seguir
|
||||
star = Estrella
|
||||
unstar = Treu l'estrella
|
||||
fork = Bifurca
|
||||
code = Codi
|
||||
branches = Branques
|
||||
tags = Etiquetes
|
||||
issues = Problemes
|
||||
packages = Paquets
|
||||
actions = Accions
|
||||
releases = Publicacions
|
||||
labels = Etiquetes
|
||||
milestones = Fites
|
||||
org_labels_desc_manage = gestionar
|
||||
file_raw = Original
|
||||
file_history = Historial
|
||||
file_permalink = Enllaç permanent
|
||||
generated = Generat
|
||||
commit_graph.monochrome = Mono
|
||||
commit_graph.color = Color
|
||||
line = línia
|
||||
lines = línies
|
||||
from_comment = (comentari)
|
||||
editor.or = o
|
||||
editor.cancel_lower = Cancel·la
|
||||
editor.cancel = Cancel·la
|
||||
commits.commits = Commits
|
||||
commits.author = Autor
|
||||
commits.message = Missatge
|
||||
commits.date = Data
|
||||
commit.operations = Operacions
|
||||
commit.revert = Reverteix
|
||||
commitstatus.error = Error
|
||||
commitstatus.failure = Fallada
|
||||
commitstatus.pending = Pendent
|
||||
commitstatus.success = Èxit
|
||||
projects = Projectes
|
||||
projects.description_placeholder = Descripció
|
||||
projects.title = Títol
|
||||
projects.type.none = Cap
|
||||
projects.template.desc = Plantilla
|
||||
projects.column.edit_title = Nom
|
||||
projects.column.new_title = Nom
|
||||
projects.column.color = Color
|
||||
projects.open = Obre
|
||||
projects.close = Tanca
|
||||
issues.new.assignees = Assignats
|
||||
issues.choose.open_external_link = Obre
|
||||
issues.choose.blank = Predeterminat
|
||||
issues.deleted_milestone = `(suprimit)`
|
||||
issues.deleted_project = `(suprimit)`
|
||||
issues.filter_label = Etiqueta
|
||||
issues.filter_milestone = Fita
|
||||
issues.filter_project = Projecte
|
||||
issues.filter_assignee = Assignat
|
||||
issues.filter_poster = Autor
|
||||
issues.filter_type = Tipus
|
||||
issues.filter_sort = Ordenació
|
||||
issues.filter_sort.latest = Més recents
|
||||
issues.filter_sort.oldest = Més antics
|
||||
issues.action_open = Obre
|
||||
issues.action_close = Tanca
|
||||
issues.action_label = Etiqueta
|
||||
issues.action_milestone = Fita
|
||||
issues.action_assignee = Assignat
|
||||
issues.action_check = Marca/Desmarca
|
||||
issues.previous = Anterior
|
||||
issues.next = Següent
|
||||
issues.open_title = Oberts
|
||||
issues.closed_title = Tancats
|
||||
issues.draft_title = Esborrany
|
||||
issues.context.edit = Edita
|
||||
issues.context.delete = Suprimeix
|
||||
issues.reopen_issue = Reobre
|
||||
issues.create_comment = Comenta
|
||||
issues.author = Autor
|
||||
issues.role.owner = Propietari
|
||||
issues.role.member = Membre
|
||||
issues.role.collaborator = Col·laborador
|
||||
issues.role.contributor = Contribuïdor
|
||||
issues.edit = Edita
|
||||
issues.cancel = Cancel·la
|
||||
issues.save = Desa
|
||||
issues.label_title = Nom
|
||||
issues.label_description = Descripció
|
||||
issues.label_color = Color
|
||||
issues.label_exclusive = Exclusiu
|
||||
issues.label_edit = Edita
|
||||
issues.label_delete = Suprimeix
|
||||
issues.label.filter_sort.alphabetically = Alfabèticament
|
||||
issues.subscribe = Subscriu-me
|
||||
issues.unsubscribe = Cancel·la la subscripció
|
||||
issues.lock_confirm = Bloqueja
|
||||
issues.unlock_confirm = Desbloqueja
|
||||
issues.delete = Suprimeix
|
||||
issues.cancel_tracking = Descarta
|
||||
issues.add_time_cancel = Cancel·la
|
||||
issues.add_time_hours = Hores
|
||||
issues.add_time_minutes = Minuts
|
||||
issues.force_push_compare = Compara
|
||||
issues.due_date_form = aaaa-mm-dd
|
||||
issues.due_date_form_edit = Edita
|
||||
issues.due_date_form_remove = Elimina
|
||||
issues.due_date_overdue = Endarrerit
|
||||
issues.dependency.title = Dependències
|
||||
issues.dependency.cancel = Cancel·la
|
||||
issues.dependency.remove = Elimina
|
||||
issues.review.dismissed_label = Descartat
|
||||
issues.review.pending = Pendent
|
||||
issues.review.reviewers = Revisors
|
||||
issues.review.outdated = Obsolet
|
||||
issues.reference_issue.body = Cos
|
||||
issues.content_history.edited = editat
|
||||
issues.content_history.created = creat
|
||||
issues.content_history.options = Opcions
|
||||
compare.compare_base = base
|
||||
compare.compare_head = compara
|
||||
pulls.has_viewed_file = Vist
|
||||
pulls.tab_conversation = Conversa
|
||||
pulls.tab_commits = Commits
|
||||
pulls.merged = Fusionat
|
||||
pulls.status_checks_requested = Requerit
|
||||
pulls.status_checks_details = Detalls
|
||||
pulls.cmd_instruction_merge_title = Fusiona
|
||||
pulls.made_using_agit = AGit
|
||||
pull.deleted_branch = (eliminat):%s
|
||||
milestones.open = Obre
|
||||
milestones.close = Tanca
|
||||
milestones.title = Títol
|
||||
milestones.desc = Descripció
|
||||
milestones.clear = Neteja
|
||||
milestones.cancel = Cancel·la
|
||||
wiki = Wiki
|
||||
wiki.page = Pàgina
|
||||
wiki.new_page = Pàgina
|
||||
wiki.cancel = Cancel·la
|
||||
wiki.edit_page_button = Edita
|
||||
wiki.pages = Pàgines
|
||||
activity = Activitat
|
||||
activity.navbar.contributors = Contribuïdors
|
||||
activity.period.filter_label = Període:
|
||||
activity.overview = Visió general
|
||||
activity.merged_prs_label = Fusionat
|
||||
activity.opened_prs_label = Proposat
|
||||
activity.closed_issue_label = Tancat
|
||||
activity.new_issue_label = Obert
|
||||
activity.unresolved_conv_label = Obre
|
||||
activity.published_release_label = Publicació
|
||||
activity.git_stats_and_deletions = i
|
||||
contributors.contribution_type.commits = Commits
|
||||
settings.collaboration.write = Escriptura
|
||||
settings.collaboration.read = Lectura
|
||||
settings.collaboration.undefined = Indefinit
|
||||
settings.hooks = Webhooks
|
||||
settings.mirror_settings.direction = Direcció
|
||||
settings.mirror_settings.direction.push = Puja
|
||||
settings.units.units = Unitats
|
||||
settings.units.overview = Visió general
|
||||
settings.trust_model.committer =Confirmador
|
||||
settings.delete_collaborator = Elimina
|
||||
settings.webhook.response = Resposta
|
||||
settings.webhook.headers = Capçaleres
|
||||
settings.webhook.payload = Contingut
|
||||
settings.webhook.body = Cos
|
||||
settings.event_delete = Suprimeix
|
||||
settings.event_fork = Bifurca
|
||||
settings.event_wiki = Wiki
|
||||
settings.event_push = Puja
|
||||
settings.event_repository = Repositori
|
||||
settings.event_issue_assign = Assignació
|
||||
settings.event_pull_request_assign = Assignació
|
||||
settings.event_pull_request_review = Revisions
|
||||
settings.event_pull_request_sync = Sincronitzat
|
||||
|
||||
mirror_prune = Poda
|
||||
pulls = Sol·licituds d'extracció
|
||||
project = Projectes
|
||||
org_labels_desc = Etiquetes de nivell d'organització que es poden usar amb <strong>tots els repositoris</strong> dins d'aquesta organització
|
||||
released_this = ha publicat això
|
||||
file_view_source = Veure la font
|
||||
file_too_large = El fitxer és massa gran per ser mostrat.
|
||||
invisible_runes_header = `Aquest fitxer conté caràcters Unicode invisibles`
|
||||
invisible_runes_description = `Aquest fitxer conté caràcters Unicode invisibles que són indistingibles pels humans però que un ordinador pot processar de manera diferent. Si creieu que això és intencional, podeu ignorar aquest avís. Useu el botó Esc per revelar-los.`
|
||||
ambiguous_runes_header = `Aquest fitxer conté caràcters Unicode ambigus`
|
||||
ambiguous_runes_description = `Aquest fitxer conté caràcters Unicode que es poden confondre amb d'altres. Si creieu que això és intencional, podeu ignorar aquest avís. Useu el botó Esc per revelar-los.`
|
||||
invisible_runes_line = `Aquesta línia conté caràcters Unicode invisibles`
|
||||
ambiguous_runes_line = `Aquesta línia conté caràcters Unicode ambigus`
|
||||
ambiguous_character = `%[1]c [U+%04[1]X] es pot confondre amb %[2]c [U+%04[2]X]`
|
||||
file_copy_permalink = Copiar l'enllaç permanent
|
||||
video_not_supported_in_browser = El vostre navegador no suporta l'etiqueta d'HTML5 "video".
|
||||
audio_not_supported_in_browser = El vostre navegador no suporta l'etiqueta d'HTML5 "audio".
|
||||
stored_lfs = Emmagatzemat amb Git LFS
|
||||
symbolic_link = Enllaç simbòlic
|
||||
executable_file = Fitxer executable
|
||||
commit_graph.select = Seleccionar branques
|
||||
commit_graph.hide_pr_refs = Amaga les sol·licituds d'extracció
|
||||
commit.contained_in_default_branch = Aquest commit és part de la branca predeterminada
|
||||
commit.load_referencing_branches_and_tags = Carrega les branques i les etiquetes referenciades en aquest commit
|
||||
blame = Culpa
|
||||
download_file = Descarregar el fitxer
|
||||
normal_view = Vista normal
|
||||
no_eol.tooltip = Aquest fitxer no conté un caràcter de final de línia.
|
||||
editor.add_file = Afegir un fitxer
|
||||
editor.new_file = Nou fitxer
|
||||
editor.upload_file = Pujar un fitxer
|
||||
editor.edit_file = Editar el fitxer
|
||||
editor.preview_changes = Previsualitzar els canvis
|
||||
editor.cannot_edit_lfs_files = Els fitxers LFS no es poden editar mitjançant la interfície web.
|
||||
editor.cannot_edit_non_text_files = Els fitxers binaris no es poden editar mitjançant la interfície web.
|
||||
editor.edit_this_file = Editar el fitxer
|
||||
editor.this_file_locked = El fitxer està bloquejat
|
||||
editor.must_be_on_a_branch = Heu de ser en una branca per fer o proposar canvis en aquest fitxer.
|
||||
editor.fork_before_edit = Heu de bifurcar aquest repositori per fer o proposar canvis en aquest fitxer.
|
||||
editor.delete_this_file = Eliminar el fitxer
|
||||
editor.must_have_write_access = Heu de tenir accés d'escriptura per fer o proposar canvis en aquest fitxer.
|
||||
editor.file_delete_success = S'ha eliminat el fitxer "%s".
|
||||
editor.name_your_file = Anomeneu el vostre fitxer…
|
||||
editor.filename_help = Afegiu un directori escrivint el seu nom seguit d'una barra inclinada ("/"). Elimineu un directori prement la tecla de retrocés al principi del camp d'entrada.
|
||||
editor.add_tmpl = Afegir "<%s>"
|
||||
editor.add = Afegir %s
|
||||
editor.delete = Eliminar %s
|
||||
editor.fail_to_apply_patch = No s'ha pogut aplicar el pedaç "%s"
|
||||
editor.new_patch = Pedaç nou
|
||||
editor.commit_message_desc = Afegiu una descripció ampliada opcional…
|
||||
editor.create_new_branch = Crear una <strong>nova branca</strong> per aquest commit i iniciar una sol·licitud d'extracció.
|
||||
editor.create_new_branch_np = Crear una <strong>nova branca</strong> per aquest commit.
|
||||
editor.new_branch_name_desc = Nom de la branca nova…
|
||||
editor.filename_is_invalid = El nom del fitxer és incorrecte: "%s".
|
||||
editor.branch_does_not_exist = La branca "%s" no existeix en aquest repositori.
|
||||
editor.branch_already_exists = La branca "%s" ja existeix en aquest repositori.
|
||||
editor.directory_is_a_file = El nom del directori "%s" ja està en ús en aquest repositori.
|
||||
editor.file_is_a_symlink = `"%s" és un enllaç simbòlic. Els enllaços simbòlics no es poden editar mitjançant l'editor web`
|
||||
editor.filename_is_a_directory = El nom de fitxer "%s" ja està en us per un directori d'aquest repositori.
|
||||
editor.file_editing_no_longer_exists = El fitxer que està sent editat, "%s", ja no existeix en aquest repositori.
|
||||
editor.file_deleting_no_longer_exists = El fitxer que s'està eliminant, "%s", ja no existeix en aquest repositori.
|
||||
editor.no_changes_to_show = No hi ha canvis per mostrar.
|
||||
editor.fail_to_update_file = No s'ha pogut modificar/crear el fitxer "%s".
|
||||
editor.fail_to_update_file_summary = Missatge d'error:
|
||||
editor.push_rejected_summary = Missatge de rebuig complet:
|
||||
editor.add_subdir = Afegir un directori…
|
||||
editor.unable_to_upload_files = No s'han pogut pujar fitxers a "%s" degut a aquest error: %v
|
||||
editor.upload_file_is_locked = El fitxer "%s" està bloquejat per %s.
|
||||
editor.upload_files_to_dir = Pujar fitxers a "%s"
|
||||
commits.nothing_to_compare = Aquestes branques són iguals.
|
||||
commits.search.tooltip = Podeu prefixar les paraules clau amb "author:", "committer:", "after:", o "before:". Per exemple: "revert author:Alice before:2019-01-13".
|
||||
commits.search_branch = Aquesta branca
|
||||
commits.search_all = Totes les branques
|
||||
commits.browse_further = Navega més enllà
|
||||
commits.signed_by = Signat per
|
||||
commits.gpg_key_id = ID de la clau GPG
|
||||
commits.ssh_key_fingerprint = Empremta de la clau SSH
|
||||
ext_issues = Incidències externes
|
||||
projects.description = Descripció (opcional)
|
||||
projects.create = Crear un projecte
|
||||
projects.new = Nou projecte
|
||||
projects.create_success = S'ha creat el projecte "%s".
|
||||
projects.deletion = Eliminar el projecte
|
||||
projects.deletion_desc = Si s'elimina un projecte, s'eliminarà de totes les incidències relacionades. Voleu continuar?
|
||||
projects.deletion_success = S'ha eliminat el projecte.
|
||||
projects.edit = Editar el projecte
|
||||
projects.modify = Editar el projecte
|
||||
projects.edit_success = S'ha actualitzat el projecte "%s".
|
||||
projects.template.desc_helper = Seleccioneu una plantilla de projecte per començar
|
||||
projects.column.edit = Editar la columna
|
||||
projects.column.new_submit = Crear una columna
|
||||
projects.column.new = Nova columna
|
||||
projects.column.delete = Eliminar la columna
|
||||
projects.card_type.images_and_text = Imatges i text
|
||||
projects.card_type.text_only = Només text
|
||||
issues.filter_no_results = Cap resultat
|
||||
issues.filter_no_results_placeholder = Proveu a ajustar els filtres de cerca.
|
||||
issues.new.clear_labels = Netejar les etiquetes
|
||||
issues.new.clear_projects = Netejar els projectes
|
||||
issues.new.no_projects = Cap projecte
|
||||
issues.new.no_items = Cap element
|
||||
issues.new.clear_milestone = Netejar les fites
|
||||
issues.choose.ignore_invalid_templates = S'han ignorat les plantilles invàlides
|
||||
issues.action_milestone_no_select = Cap fita
|
||||
issues.action_check_all = Marca/Desmarca tots els elements
|
||||
issues.opened_by = oberta %[1]s per <a href="%[2]s">%[3]s</a>
|
||||
issues.opened_by_fake = oberta %[1]s per %[2]s
|
||||
issues.closed_by_fake = per %[2]s ha sigut tancada %[1]s
|
||||
issues.all_title = Totes
|
||||
issues.num_comments_1 = %d comentari
|
||||
issues.num_comments = %d comentaris
|
||||
issues.num_reviews_one = %d revisió
|
||||
issues.num_reviews_few = %d revisions
|
||||
issues.commented_at = `ha comentat <a href="#%s">%s</a>`
|
||||
issues.delete_comment_confirm = Esteu segurs que voleu eliminar aquest comentari?
|
||||
issues.reaction.add = Afegir una reacció
|
||||
issues.reaction.alt_few = %[1]s ha reaccionat %[2]s.
|
||||
issues.reaction.alt_many = %[1]s i %[2]d més han reaccionat %[3]s.
|
||||
issues.reaction.alt_remove = Eliminar %[1]s reacció del comentari.
|
||||
issues.reaction.alt_add = Afegir %[1]s reacció al comentari.
|
||||
issues.context.copy_link = Copiar l'enllaç
|
||||
issues.context.quote_reply =
|
||||
issues.context.reference_issue = Referenciar-la en una nova incidència
|
||||
issues.no_content = No s'ha proporcionat cap descripció.
|
||||
issues.close = Tancar la incidència
|
||||
issues.close_comment_issue = Tancar amb un comentari
|
||||
issues.reopen_comment_issue = Reobrir amb un comentari
|
||||
issues.closed_at = `ha tancat aquesta incidència &s`
|
||||
issues.reopened_at = `ha reobert aquesta incidència %s`
|
||||
issues.ref_issue_from = `<a href="%[2]s">ha fet referència a aquesta incidència %[3]s</a>%[1]s`
|
||||
issues.ref_pull_from = `<a href="%[2]s">ha fet referència a aquesta sol·licitud d'extracció %[3]s</a>%[1]s`
|
||||
issues.ref_closing_from = `<a href="%[2]s">ha fet referència a aquesta incidència en una sol·licitud d'extracció %[3]s que la tancarà</a>, %[1]s`
|
||||
issues.ref_reopening_from = `<a href="%[2]s">ha fet referència a aquesta incidència en una sol·licitud d'extracció %[3]s que la reobrirà</a>, %[1]s`
|
||||
issues.author.tooltip.issue = Aquest usuari és l'autor d'aquesta incidència.
|
||||
issues.author.tooltip.pr = Aquest usuari és l'autor d'aquesta sol·licitud d'extracció.
|
||||
issues.role.owner_helper = Aquest usuari és el propietari d'aquest repositori.
|
||||
issues.role.member_helper = Aquest usuari és membre de la organització a la qual pertany aquest repositori.
|
||||
issues.role.collaborator_helper = S'ha convidat aquest usuari a col·laborar al repositori.
|
||||
issues.role.first_time_contributor = Col·laborador per primera vegada
|
||||
issues.role.first_time_contributor_helper = Aquesta és la primera contribució d'aquest usuari al repositori.
|
||||
issues.re_request_review = Tornar a demanar-ne una revisió
|
||||
issues.remove_request_review = Eliminar la sol·licitud de revisió
|
||||
issues.remove_request_review_block = No es pot eliminar la sol·licitud de revisió
|
||||
issues.dismiss_review = Descartar la revisió
|
||||
issues.dismiss_review_warning = Esteu segurs de voler descartar aquesta revisió?
|
||||
issues.sign_in_require_desc = <a href="%s">Inicieu la sessió</a> per unir-vos a aquesta conversa.
|
||||
issues.label_archive = Arxivar l'etiqueta
|
||||
issues.label_archived_filter = Mostra les etiquetes arxivades
|
||||
issues.label_archive_tooltip = Les etiquetes arxivades s'exclouen per defecte dels suggeriments quan es cerca per etiqueta.
|
||||
issues.label_count = %s etiquetes
|
||||
issues.label_open_issues = %d incidències/sol·licituds d'extracció obertes
|
||||
issues.label_modify = Editar l'etiqueta
|
||||
issues.label_deletion = Eliminar l'etiqueta
|
||||
issues.label_deletion_desc = Eliminar una etiqueta l'eliminarà de totes les incidències. Voleu continuar?
|
||||
issues.label_deletion_success = S'ha eliminat l'etiqueta.
|
||||
issues.attachment.open_tab = `Feu click per veure "%s" en una nova pestanya`
|
||||
issues.max_pinned = No podeu fixar més incidències
|
||||
issues.lock = Bloquejar la conversa
|
||||
issues.unlock = Desbloquejar la conversa
|
||||
issues.lock.unknown_reason = No es pot bloquejar una incidència amb una causa desconeguda.
|
||||
issues.lock_duplicate = No es pot bloquejar una incidència dues vegades.
|
||||
issues.unlock_error = No es pot desbloquejar una incidència que no està bloquejada.
|
||||
issues.unlock_comment = ha desbloquejat aquesta conversa %s
|
||||
issues.lock.notice_1 = - Els altres usuaris no podran deixar més comentaris en aquesta incidència.
|
||||
issues.lock.notice_2 = - Vos i altres col·laboradors amb accés a aquest repositori encara podeu deixar comentaris que els altres poden veure.
|
||||
issues.lock.notice_3 = - Sempre podeu desbloquejar aquesta incidència una altra vegada més endavant.
|
||||
issues.unlock.notice_1 = - Tothom podrà tornar a deixar comentaris en aquesta incidència.
|
||||
issues.unlock.notice_2 = - Sempre podeu bloquejar aquesta incidència una altra vegada més endavant.
|
||||
issues.comment_on_locked = No es pot deixar un comentari en una incidència bloquejada.
|
||||
issues.delete.title = Eliminar aquesta incidència?
|
||||
issues.delete.text = Esteu segurs de voler eliminar aquesta incidència? (Tot el contingut s'eliminarà permanentment. Considereu tancar-la si voleu mantenir-la arxivada)
|
||||
issues.dependency.blocks_short = Bloqueja
|
||||
pulls.new = Nova sol·licitud d'extracció
|
||||
pulls.view = Veure la sol·licitud d'extracció
|
||||
pulls.compare_changes = Nova sol·licitud d'extracció
|
||||
pulls.sign_in_require = <a href="%s">Inicieu sessió</a> per crear una nova sol·licitud d'extracció.
|
||||
pulls.allow_edits_from_maintainers_desc = Els usuaris amb accés d'escriptura a la branca base també poden pujar canvis a aquesta branca
|
||||
pulls.allow_edits_from_maintainers_err = No s'ha pogut actualitzar
|
||||
pulls.has_changed_since_last_review = Ha canviat des de la vostra última revisió
|
||||
pulls.expand_files = Expandir tots els fitxers
|
||||
pulls.collapse_files = Col·lapsar tots els fitxers
|
||||
pulls.compare_base = fusionar a
|
||||
pulls.compare_compare = extreure de
|
||||
pulls.no_results = No s'ha trobat cap resultat.
|
||||
pulls.show_changes_since_your_last_review = Mostrar els canvis des de la vostra última revisió
|
||||
pulls.nothing_to_compare = Aquestes branques són iguals. No cal crear cap sol·licitud d'extracció.
|
||||
pulls.nothing_to_compare_have_tag = Les branques/etiquetes seleccionades són iguals.
|
||||
pulls.nothing_to_compare_and_allow_empty_pr = Aquestes branques són iguals. La sol·licitud d'extracció estarà buida.
|
||||
pulls.has_pull_request = `Ja existeix una sol·licitud d'extracció entre aquestes branques: <a href="%[1]s">%[2]s#%[3]d</a>`
|
||||
pulls.create = Crear una sol·licitud d'extracció
|
||||
pulls.change_target_branch_at = `ha canviat la branca de destí de <b>%s</b> a <b>%s</b> %s`
|
||||
pulls.reopen_to_merge = Si us plau, reobriu aquesta sol·licitud d'extracció per dur a terme una fusió.
|
||||
pulls.cant_reopen_deleted_branch = Aquesta sol·licitud d'extracció no es pot reobrir perquè la branca s'ha eliminat.
|
||||
pulls.merged_success = S'ha fusionat i tancat correctament la sol·licitud d'extracció
|
||||
pulls.closed = S'ha tancat la sol·licitud d'extracció
|
||||
pulls.manually_merged = S'ha fusionat manualment
|
||||
pulls.merged_info_text = Ja es pot eliminar la branca %s.
|
||||
pulls.is_closed = S'ha tancat la sol·licitud d'extracció.
|
||||
pulls.cannot_merge_work_in_progress = Aquesta sol·licitud d'extracció està marcada com a treball en curs.
|
||||
pulls.files_conflicted = Aquesta sol·licitud d'extracció té canvis que entren en conflicte amb la branca de destí.
|
||||
pulls.is_ancestor = Aquesta branca ja està inclosa a la branca de destí. No hi ha res per fusionar.
|
||||
pulls.blocked_by_approvals = Aquesta sol·licitud d'extracció encara no té prou aprovacions. %d de %d aprovacions concedides.
|
||||
pulls.blocked_by_rejection = Aquesta sol·licitud d'extracció té canvis sol·licitats per un revisor oficial.
|
||||
pulls.blocked_by_official_review_requests = Aquesta sol·licitud d'extracció està bloquejada perquè li manquen aprovacions d'un o més revisors oficials.
|
||||
pulls.blocked_by_outdated_branch = Aquesta sol·licitud d'extracció està bloquejada perquè està desactualitzada.
|
||||
pulls.blocked_by_changed_protected_files_1 = Aquesta sol·licitud d'extracció està bloquejada perquè modifica un fitxer protegit:
|
||||
pulls.blocked_by_changed_protected_files_n = Aquesta sol·licitud d'extracció està bloquejada perquè modifica fitxers protegits:
|
||||
pulls.can_auto_merge_desc = Aquesta sol·licitud d'extracció es pot fusionar automàticament.
|
||||
pulls.cannot_auto_merge_desc = Aquesta sol·licitud d'extracció no es pot fusionar automàticament degut a conflictes.
|
||||
pulls.cannot_auto_merge_helper = Fusioneu manualment per resoldre els conflictes.
|
||||
pulls.approve_count_1 = %d aprovació
|
||||
pulls.approve_count_n = %s aprovacions
|
||||
pulls.blocked_by_user = No podeu crear una sol·licitud d'extracció en aquest repositori perquè el seu propietari us ha bloquejat.
|
||||
pulls.no_merge_desc = Aquesta sol·licitud d'extracció no es pot fusionar perquè totes les opcions de fusió del repositori estan deshabilitades.
|
||||
pulls.no_merge_helper = Habiliteu les opcions de fusió a la configuració del repositori o feu la fusió de la sol·licitud d'extracció manualment.
|
||||
pulls.no_merge_wip = Aquesta sol·licitud d'extracció no es pot fusionar perquè està marcada com a treball en curs.
|
||||
pulls.no_merge_access = No esteu autoritzats per fusionar aquesta sol·licitud d'extracció.
|
||||
pulls.merge_manually = Fusionada manualment
|
||||
pulls.invalid_merge_option = No podeu fer servir aquesta opció de fusió per aquesta sol·licitud d'extracció.
|
||||
pulls.merge_conflict = La fusió ha fallat: hi ha hagut un conflicte durant la fusió. Consell: proveu una estratègia diferent
|
||||
pulls.merge_conflict_summary = Missatge d'error
|
||||
pulls.rebase_conflict_summary = Missatge d'error
|
||||
signing.wont_sign.approved = La fusió no es signarà perquè la sol·licitud d'extracció no està aprovada.
|
||||
signing.wont_sign.not_signed_in = No heu iniciat sessió.
|
||||
ext_wiki = Wiki externa
|
||||
wiki.welcome = Benvingut/da a la wiki.
|
||||
wiki.welcome_desc = La wiki us permet escriure i compartir documentació amb els col·laboradors.
|
||||
wiki.page_title = Títol de la pàgina
|
||||
wiki.page_content = Contingut de la pàgina
|
||||
wiki.default_commit_message = Escriviu una nota sobre l'edició d'aquesta pàgina (opcional).
|
||||
wiki.save_page = Guardar la pàgina
|
||||
wiki.last_commit_info = %s ha editat aquesta pàgina %s
|
||||
wiki.new_page_button = Nova pàgina
|
||||
wiki.delete_page_button = Eliminar la pàgina
|
||||
wiki.delete_page_notice_1 = L'eliminació de la pàgina "%s" de la wiki no es pot desfer. Voleu continuar?
|
||||
wiki.page_already_exists = Ja existeix una pàgina de la wiki amb aquest mateix nom.
|
||||
wiki.original_git_entry_tooltip = Veure el fitxer Git original en comptes d'usar un enllaç amigable.
|
||||
wiki.no_search_results = Cap resultat
|
||||
activity.period.daily = 1 dia
|
||||
activity.period.halfweekly = 3 dies
|
||||
activity.period.weekly = 1 setmana
|
||||
activity.period.monthly = 1 mes
|
||||
activity.period.quarterly = 3 mesos
|
||||
activity.period.semiyearly = 6 mesos
|
||||
activity.period.yearly = 1 any
|
||||
activity.merged_prs_count_1 = Sol·licitud d'extracció fusionada
|
||||
activity.merged_prs_count_n = Sol·licituds d'extracció fusionades
|
||||
activity.opened_prs_count_1 = Sol·licitud d'extracció proposada
|
||||
activity.opened_prs_count_n = Sol·licituds d'extracció proposades
|
||||
activity.title.user_1 = %d usuari
|
||||
activity.title.user_n = %d usuaris
|
||||
activity.title.prs_1 = %d sol·licitud d'extracció
|
||||
activity.title.prs_n = %s sol·licituds d'extracció
|
||||
activity.title.prs_merged_by = %s fusionat per %s
|
||||
activity.title.prs_opened_by = %s proposada per %s
|
||||
activity.closed_issues_count_1 = Incidència tancada
|
||||
activity.closed_issues_count_n = Incidències tancades
|
||||
activity.title.issues_1 = %s incidència
|
||||
activity.title.issues_n = %s incidències
|
||||
activity.title.issues_closed_from = %s tancades per %s
|
||||
activity.title.issues_created_by = %s creades per %s
|
||||
activity.new_issues_count_1 = Nova incidència
|
||||
activity.new_issues_count_n = Noves incidències
|
||||
activity.title.unresolved_conv_1 = %s conversa sense resoldre
|
||||
activity.title.unresolved_conv_n = %s converses sense resoldre
|
||||
activity.unresolved_conv_desc = Aquestes incidències i sol·licituds d'extracció recentment modificades no han sigut resoltes encara.
|
||||
activity.title.releases_1 = %d entrega
|
||||
activity.title.releases_n = %d entregues
|
||||
activity.title.releases_published_by = %s publicada per %s
|
||||
activity.published_tag_label = Etiqueta
|
||||
activity.git_stats_author_1 = %d autor
|
||||
activity.git_stats_author_n = %d autors
|
||||
activity.git_stats_pushed_1 = ha pujat
|
||||
activity.git_stats_pushed_n = han pujat
|
||||
activity.git_stats_file_1 = %d fitxer
|
||||
activity.git_stats_file_n = %d fitxers
|
||||
activity.git_stats_files_changed_1 = ha canviat
|
||||
activity.git_stats_files_changed_n = han canviat
|
||||
activity.git_stats_additions = i hi ha hagut
|
||||
activity.git_stats_addition_1 = %d addició
|
||||
activity.git_stats_addition_n = %d addicions
|
||||
activity.git_stats_deletion_1 = %d eliminació
|
||||
activity.git_stats_deletion_n = %d eliminacions
|
||||
settings.mirror_settings.docs = Configureu el vostre repositori per sincronitzar automàticament commits, etiquetes i branques amb un altre repositori.
|
||||
settings.trust_model.collaboratorcommitter = Col·laborador+Confirmador
|
||||
settings.event_pull_request_enforcement = Aplicació
|
||||
settings.event_package = Paquet
|
||||
settings.active = Actiu
|
||||
settings.slack_token = Testimoni
|
||||
settings.web_hook_name_gogs = Gogs
|
||||
settings.web_hook_name_discord = Discord
|
||||
settings.web_hook_name_dingtalk = DingTalk
|
||||
settings.web_hook_name_feishu_only = Feishu
|
||||
settings.web_hook_name_packagist = Packagist
|
||||
settings.protect_status_check_matched = Coincideix
|
||||
settings.protect_patterns = Patrons
|
||||
settings.edit_protected_branch = Edita
|
||||
settings.tags = Etiquetes
|
||||
settings.tags.protection.allowed = Permès
|
||||
settings.lfs = LFS
|
||||
settings.lfs_pointers.oid = OID
|
||||
diff.commit = commit
|
||||
diff.whitespace_button = Espai blanc
|
||||
diff.bin = BIN
|
||||
diff.file_before = Abans
|
||||
diff.file_after = Després
|
||||
diff.file_image_width = Amplada
|
||||
diff.file_image_height = Alçada
|
||||
diff.file_byte_size = Mida
|
||||
|
||||
[user]
|
||||
unblock = Desbloquejar
|
||||
followers_one = %d seguidor
|
||||
|
|
@ -951,4 +1611,83 @@ public_activity.visibility_hint.self_public = La vostra activitat és visible pe
|
|||
public_activity.visibility_hint.admin_public = Aquesta activitat és visible per tothom, però com a administrador també podeu veure interaccions en espais privats.
|
||||
public_activity.visibility_hint.self_private = La vostra activitat és visible només per vós i pels administradors de la instància. <a href="%s">Configurar</a>.
|
||||
public_activity.visibility_hint.admin_private = Aquesta activitat és visible per vós perquè sou un administrador, però l'usuari vol que romangui privada.
|
||||
public_activity.visibility_hint.self_private_profile = La vostra activitat és visible només per vós i pels administradors de la instància perquè el vostre perfil és privat. <a href="%s">Configurar</a>.
|
||||
public_activity.visibility_hint.self_private_profile = La vostra activitat és visible només per vós i pels administradors de la instància perquè el vostre perfil és privat. <a href="%s">Configurar</a>.
|
||||
change_avatar = Canvieu el vostre avatar…
|
||||
joined_on = S'ha unit el %s
|
||||
|
||||
[org]
|
||||
settings = Configuració
|
||||
settings.options = Organització
|
||||
settings.email = Correu electrònic de contacte
|
||||
settings.website = Lloc web
|
||||
settings.location = Ubicació
|
||||
settings.permission = Permisos
|
||||
settings.visibility = Visibilitat
|
||||
settings.visibility.public = Públic
|
||||
settings.visibility.limited = Limitat (visible només als usuaris amb sessió iniciada)
|
||||
settings.visibility.limited_shortname = Limitat
|
||||
settings.visibility.private = Privat (visible només pels membres de l'organització)
|
||||
settings.visibility.private_shortname = Privat
|
||||
settings.update_settings = Actualitza la configuració
|
||||
settings.update_setting_success = S'ha actualitzat la configuració de l'organització.
|
||||
settings.change_orgname_redirect_prompt = El nom antic redirigirà fins que sigui reclamat.
|
||||
settings.update_avatar_success = S'ha actualitzat l'avatar de l'organització.
|
||||
settings.delete = Eliminar la organtizació
|
||||
settings.delete_account = Eliminar aquesta organització
|
||||
settings.delete_prompt = L'organització s'eliminarà permanentment. Aquesta acció <strong>NO</strong> es pot desfer!
|
||||
settings.confirm_delete_account = Confirmar-ne l'eliminació
|
||||
settings.delete_org_title = Eliminar l'organització
|
||||
settings.delete_org_desc = Aquesta organització s'eliminarà permanentment. Voleu continuar?
|
||||
settings.labels_desc = Afegiu etiquetes que poden ser usades a totes les incidències de <strong>tots els repositoris</strong> d'aquesta organització.
|
||||
members.private = Ocult
|
||||
members.member_role = Funció del membre:
|
||||
members.owner = Propietari
|
||||
members.member = Membre
|
||||
members.remove = Eliminar
|
||||
members.remove.detail = Eliminar %[1]s de %[2]s?
|
||||
members.leave.detail = Esteu segurs de voler marxar de l'organització "%s"?
|
||||
teams.join = Unir-s'hi
|
||||
teams.leave = Marxar
|
||||
teams.leave.detail = Esteu segurs de voler marxar de l'equip "%s"?
|
||||
teams.can_create_org_repo = Crear repositoris
|
||||
teams.can_create_org_repo_helper = Els membres poden crear nous repositoris a l'organització. El creador tindrà accés d'administrador al nou repositori.
|
||||
teams.none_access = Sense accés
|
||||
teams.none_access_helper = L'opció de "sense accés" té efecte només en repositoris privats.
|
||||
teams.general_access = Accés personalitzat
|
||||
teams.general_access_helper = Els permisos dels membres es determinaran segons la taula de permisos següent.
|
||||
teams.read_access = Lectura
|
||||
teams.write_access = Escriptura
|
||||
teams.admin_access = Accés d'administrador
|
||||
teams.no_desc = Aquest equip no té cap descripció
|
||||
teams.settings = Configuració
|
||||
teams.owners_permission_desc = Els propietaris tenen accés complet a <strong>tots els repositoris</strong> i tenen <strong>accés d'administrador</strong> a l'organització.
|
||||
teams.update_settings = Actualitza la configuració
|
||||
teams.delete_team = Eliminar l'equip
|
||||
teams.add_team_member = Afegir un membre a l'equip
|
||||
teams.invite_team_member = Convidar a %s
|
||||
teams.invite_team_member.list = Invitacions pendents
|
||||
teams.delete_team_title = Eliminar l'equip
|
||||
|
||||
[admin]
|
||||
dashboard.cron.finished = Cron: %[1]s ha finalitzat
|
||||
dashboard.delete_inactive_accounts = Suprimir tots els comptes no activats
|
||||
dashboard.delete_inactive_accounts.started = S'ha iniciat la tasca per suprimir tots els comptes no activats.
|
||||
dashboard.delete_repo_archives = Suprimir tots els arxius dels repositoris (ZIP, TAR.GZ, etc.)
|
||||
dashboard.delete_repo_archives.started = S'ha iniciat la tasca per suprimir tots els arxius dels repositoris.
|
||||
dashboard.delete_missing_repos = Suprimir tots els repositoris que no tinguin els fitxers de Git
|
||||
dashboard.delete_missing_repos.started = S'ha iniciat la tasca per suprimir tots els repositoris que no tinguin els fitxers de Git.
|
||||
dashboard.update_mirrors = Actualitzar les rèpliques
|
||||
dashboard.archive_cleanup = Suprimir els arxius de repositori antics
|
||||
|
||||
dashboard.memory_allocate_times = Assignacions de memòria
|
||||
|
||||
[git.filemode]
|
||||
executable_file = Fitxer executable
|
||||
symbolic_link = Enllaç simbòlic
|
||||
submodule = Submòdul
|
||||
|
||||
[markup]
|
||||
filepreview.truncated = La vista prèvia s'ha truncat
|
||||
|
||||
[translation_meta]
|
||||
test = Aquest és un text de prova. No es mostra a l'interfície d'usuari de Forgejo, però s'utilitza amb finalitats de prova. Pots introduir "d'acord" per a estalviar temps (o alguna frase divertida al teu gust) i arribar a la dolça fita del 100% :)
|
||||
|
|
@ -3683,7 +3683,7 @@ owner.settings.cleanuprules.keep.count=Zachovat nejnovější
|
|||
owner.settings.cleanuprules.keep.count.1=1 verze na balíček
|
||||
owner.settings.cleanuprules.keep.count.n=%d verzí na balíček
|
||||
owner.settings.cleanuprules.keep.pattern=Ponechat odpovídající verze
|
||||
owner.settings.cleanuprules.keep.pattern.container=U balíčků Container je vždy zachována <code>nejnovější</code> verze.
|
||||
owner.settings.cleanuprules.keep.pattern.container=U balíčků Container je vždy zachována <code>nejnovější</code> verze.
|
||||
owner.settings.cleanuprules.remove.title=Verze, které odpovídají těmto pravidlům, jsou odstraněny, pokud výše uvedené pravidlo neukládá jejich zachování.
|
||||
owner.settings.cleanuprules.remove.days=Odstranit verze starší než
|
||||
owner.settings.cleanuprules.remove.pattern=Odstranit odpovídající verze
|
||||
|
|
@ -3691,7 +3691,7 @@ owner.settings.cleanuprules.success.update=Pravidlo pro čištění bylo aktuali
|
|||
owner.settings.cleanuprules.success.delete=Pravidlo pro čištění bylo odstraněno.
|
||||
owner.settings.chef.title=Registr Chef
|
||||
owner.settings.chef.keypair=Generovat pár klíčů
|
||||
owner.settings.chef.keypair.description=Žádosti odeslané do registru Chef musí být kryptograficky podepsané jako způsob ověření. Při generování páru klíčů je ve službě Forgejo uložen pouze veřejný klíč. Soukromý klíč je poskytnut vám, abyste jej mohli použít s programem knife. Vygenerováním nového páru klíčů přepíšete ten předchozí.
|
||||
owner.settings.chef.keypair.description=Žádosti odeslané do registru Chef musí být kryptograficky podepsané jako způsob ověření. Při generování páru klíčů je ve službě Forgejo uložen pouze veřejný klíč. Soukromý klíč je poskytnut vám, abyste jej mohli použít s programem knife. Vygenerováním nového páru klíčů přepíšete ten předchozí.
|
||||
owner.settings.cargo.rebuild.description = Opětovné sestavení může být užitečné, pokud není index synchronizován s uloženými balíčky Cargo.
|
||||
owner.settings.cargo.rebuild.no_index = Opětovné vytvoření selhalo, nebyl inicializován žádný index.
|
||||
npm.dependencies.bundle = Přidružené závislosti
|
||||
|
|
@ -3726,7 +3726,7 @@ secrets=Tajné klíče
|
|||
description=Tejné klíče budou předány určitým akcím a nelze je přečíst jinak.
|
||||
none=Zatím zde nejsou žádné tajné klíče.
|
||||
creation=Přidat tajný klíč
|
||||
creation.name_placeholder=nerozlišovat velká a malá písmena, pouze alfanumerické znaky nebo podtržítka, nemohou začínat na GITEA_ nebo GITHUB_
|
||||
creation.name_placeholder=nerozlišovat velká a malá písmena, pouze alfanumerické znaky nebo podtržítka, nemohou začínat na GITEA_ nebo GITHUB_
|
||||
creation.value_placeholder=Vložte jakýkoliv obsah. Mezery na začátku a konci budou vynechány.
|
||||
creation.success=Tajný klíč „%s“ byl přidán.
|
||||
creation.failed=Nepodařilo se přidat tajný klíč.
|
||||
|
|
|
|||
|
|
@ -776,7 +776,7 @@ activate_email=Aktivierung senden
|
|||
activations_pending=Aktivierung ausstehend
|
||||
can_not_add_email_activations_pending=Es gibt eine ausstehende Aktivierung, versuche es in ein paar Minuten erneut, wenn du eine neue E-Mail hinzufügen möchtest.
|
||||
delete_email=Löschen
|
||||
email_deletion=E-Mail-Adresse löschen
|
||||
email_deletion=E-Mail-Adresse entfernen
|
||||
email_deletion_desc=Diese E-Mail-Adresse und die damit verbundenen Informationen werden von deinem Konto entfernt. Git-Commits von dieser E-Mail-Addresse bleiben unverändert. Fortfahren?
|
||||
email_deletion_success=Die E-Mail-Adresse wurde entfernt.
|
||||
theme_update_success=Deine Theme-Auswahl wurde gespeichert.
|
||||
|
|
@ -1653,8 +1653,8 @@ issues.add_time=Zeit manuell hinzufügen
|
|||
issues.del_time=Diese Zeiterfassung löschen
|
||||
issues.add_time_short=Zeit hinzufügen
|
||||
issues.add_time_cancel=Abbrechen
|
||||
issues.add_time_history=`hat %s den Zeitaufwand hinzugefügt`
|
||||
issues.del_time_history=`hat %s den Zeitaufwand gelöscht`
|
||||
issues.add_time_history=`hat den Zeitaufwand von %s hinzugefügt`
|
||||
issues.del_time_history=`hat den Zeitaufwand von %s gelöscht`
|
||||
issues.add_time_hours=Stunden
|
||||
issues.add_time_minutes=Minuten
|
||||
issues.add_time_sum_to_small=Es wurde keine Zeit eingegeben.
|
||||
|
|
@ -3523,7 +3523,7 @@ mark_as_read=Als gelesen markieren
|
|||
mark_as_unread=Als ungelesen markieren
|
||||
mark_all_as_read=Alle als gelesen markieren
|
||||
subscriptions=Abonnements
|
||||
watching=Gefolgt
|
||||
watching=Beobachtet
|
||||
no_subscriptions=Keine Abonnements
|
||||
|
||||
[gpg]
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ webauthn_error_unable_to_process=Ο διακομιστής δεν μπόρεσε
|
|||
webauthn_error_duplicated=Το κλειδί ασφαλείας δεν επιτρέπεται για αυτό το αίτημα. Βεβαιωθείτε ότι το κλειδί δεν έχει ήδη καταχωρηθεί.
|
||||
webauthn_error_empty=Πρέπει να ορίσετε ένα όνομα για αυτό το κλειδί.
|
||||
webauthn_error_timeout=Το χρονικό όριο έφτασε πριν το κλειδί να διαβαστεί. Παρακαλώ ανανεώστε τη σελίδα και προσπαθήστε ξανά.
|
||||
repository=Repository
|
||||
repository=Αποθετήριο
|
||||
organization=Οργανισμός
|
||||
mirror=Αντίγραφο
|
||||
new_mirror=Νέο είδωλο
|
||||
|
|
@ -122,7 +122,7 @@ archived=Αρχειοθετήθηκε
|
|||
|
||||
concept_system_global=Γενικό
|
||||
concept_user_individual=Ατομικό
|
||||
concept_code_repository=Repository
|
||||
concept_code_repository=Αποθετήριο
|
||||
concept_user_organization=Οργανισμός
|
||||
|
||||
show_timestamps=Εμφάνιση χρονοσημάνσεων
|
||||
|
|
@ -153,11 +153,11 @@ invalid_data = Τα δεδομένα δεν είναι έγκυρα: %v
|
|||
test = Τεστ
|
||||
copy_generic = Αντιγραφή στο πρόχειρο
|
||||
error413 = Έχετε εξαντλήσει τους διαθέσιμους πόρους σας.
|
||||
new_repo.link = Νέο repository
|
||||
new_repo.link = Νέο αποθετήριο
|
||||
new_migrate.link = Νέα μεταφορά
|
||||
new_org.link = Νέος οργανισμός
|
||||
new_migrate.title = Νέα μεταφορά
|
||||
new_repo.title = Νέο repository
|
||||
new_repo.title = Νέο αποθετήριο
|
||||
new_org.title = Νέος οργανισμός
|
||||
copy_path = Αντιγραφή τοποθεσίας
|
||||
|
||||
|
|
@ -2028,8 +2028,8 @@ activity.git_stats_deletion_n=%d διαγραφές
|
|||
contributors.contribution_type.commits=Υποβολές
|
||||
|
||||
settings=Ρυθμίσεις
|
||||
settings.desc=Στις Ρυθμίσεις μπορείτε να διαχειριστείτε τις ρυθμίσεις για το repository
|
||||
settings.options=Repository
|
||||
settings.desc=Στις Ρυθμίσεις μπορείτε να διαχειριστείτε τις ρυθμίσεις για το αποθετήριο
|
||||
settings.options=Αποθετήριο
|
||||
settings.collaboration=Συνεργάτες
|
||||
settings.collaboration.admin=Διαχειριστής
|
||||
settings.collaboration.write=Εγγραφή
|
||||
|
|
@ -2235,9 +2235,9 @@ settings.event_wiki_desc=Η σελίδα Wiki δημιουργήθηκε, μετ
|
|||
settings.event_release=Κυκλοφορία
|
||||
settings.event_release_desc=Η έκδοση δημοσιεύτηκε, ενημερώθηκε ή διαγράφηκε από ένα αποθετήριο.
|
||||
settings.event_push=Push
|
||||
settings.event_push_desc=Git push σε ένα repository.
|
||||
settings.event_repository=Repository
|
||||
settings.event_repository_desc=Το repository δημιουργήθηκε ή διαγράφηκε.
|
||||
settings.event_push_desc=Git push σε ένα αποθετήριο.
|
||||
settings.event_repository=Αποθετήριο
|
||||
settings.event_repository_desc=Το αποθετήριο δημιουργήθηκε ή διαγράφηκε.
|
||||
settings.event_header_issue=Συμβάντα ζητημάτων
|
||||
settings.event_issues=Τροποιποίηση
|
||||
settings.event_issues_desc=Το ζήτημα άνοιξε, έκλεισε, ανοίχθηκε εκ νέου ή επεξεργάστηκε.
|
||||
|
|
@ -2305,7 +2305,7 @@ settings.packagist_api_token=Διακριτικό API
|
|||
settings.packagist_package_url=URL πακέτων Packagist
|
||||
settings.deploy_keys=Κλειδιά διάθεσης
|
||||
settings.add_deploy_key=Προσθήκη κλειδιού διάθεσης
|
||||
settings.deploy_key_desc=Τα κλειδιά διάθεσης έχουν πρόσβαση μόνο-ανάγνωσης στο repository.
|
||||
settings.deploy_key_desc=Τα κλειδιά διάθεσης μπορούν να έχουν πρόσβαση μόνο-ανάγνωσης ή μόνο-εγγραφής στο αποθετήριο.
|
||||
settings.is_writable=Ενεργοποίηση πρόσβασης εγγραφής
|
||||
settings.is_writable_info=Επιτρέψτε σε αυτό το κλειδί διάθεσης να <strong>ωθήσει</strong> στο repository.
|
||||
settings.no_deploy_keys=Δεν υπάρχουν ακόμα κλειδιά διάθεσης.
|
||||
|
|
@ -3108,7 +3108,7 @@ packages.creator=Δημιουργός
|
|||
packages.name=Όνομα
|
||||
packages.version=Έκδοση
|
||||
packages.type=Τύπος
|
||||
packages.repository=Repository
|
||||
packages.repository=Αποθετήριο
|
||||
packages.size=Μέγεθος
|
||||
packages.published=Δημοσιευμένα
|
||||
|
||||
|
|
@ -3415,7 +3415,7 @@ notices.inverse_selection=Αντιστροφή επιλογής
|
|||
notices.delete_selected=Διαγραφή επιλεγμένων
|
||||
notices.delete_all=Διαγραφή όλων των ειδοποιήσεων
|
||||
notices.type=Τύπος
|
||||
notices.type_1=Repository
|
||||
notices.type_1=Αποθετήριο
|
||||
notices.type_2=Εργασία
|
||||
notices.desc=Περιγραφή
|
||||
notices.op=Λειτ.
|
||||
|
|
@ -3454,7 +3454,7 @@ monitor.duration = Διάρκεια (δ)
|
|||
|
||||
[action]
|
||||
create_repo=δημιούργησε το αποθετήριο <a href="%s">%s</a>
|
||||
rename_repo=μετονόμασε το repository από <code>%[1]s</code> σε <a href="%[2]s">%[3]s</a>
|
||||
rename_repo=μετονόμασε το αποθετήριο από <code>%[1]s</code> σε <a href="%[2]s">%[3]s</a>
|
||||
commit_repo=ώθησε στο <a href="%[2]s">%[3]s</a> του <a href="%[1]s">%[4]s</a>
|
||||
create_issue=`άνοιξε το ζήτημα <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||
close_issue=`έκλεισε το ζήτημα <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||
|
|
@ -3466,7 +3466,7 @@ comment_issue=`άφησε σχόλιο στο ζήτημα <a href="%[1]s">%[3]s
|
|||
comment_pull=`σχολίασε στο pull request <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||
merge_pull_request=`συγχώνευσε το pull request <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||
auto_merge_pull_request=`αυτόματη συγχώνευση του pull request <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||
transfer_repo=μετέφερε το repository <code>%s</code> σε <a href="%s">%s</a>
|
||||
transfer_repo=μετέφερε το αποθετήριο <code>%s</code> σε <a href="%s">%s</a>
|
||||
push_tag=ώθησε την ετικέτα <a href="%[2]s">%[3]s</a> σε <a href="%[1]s">%[4]s</a>
|
||||
delete_tag=διέγραψε την ετικέτα %[2]s από <a href="%[1]s">%[3]s</a>
|
||||
delete_branch=διέγραψε το κλάδο <code>%[2]s</code> από <a href="%[1]s">%[3]s</a>
|
||||
|
|
@ -3765,7 +3765,7 @@ runners.task_list=Πρόσφατες εργασίες στον εκτελεστ
|
|||
runners.task_list.no_tasks=Δεν υπάρχει καμία εργασία ακόμα.
|
||||
runners.task_list.run=Εκτέλεση
|
||||
runners.task_list.status=Κατάσταση
|
||||
runners.task_list.repository=Repository
|
||||
runners.task_list.repository=Αποθετήριο
|
||||
runners.task_list.commit=Υποβολή
|
||||
runners.task_list.done_at=Έτοιμο στις
|
||||
runners.edit_runner=Επεξεργασία Εκτελεστή
|
||||
|
|
|
|||
|
|
@ -1579,6 +1579,7 @@ issues.filter_poster = Author
|
|||
issues.filter_poster_no_select = All authors
|
||||
issues.filter_type = Type
|
||||
issues.filter_type.all_pull_requests = All pull requests
|
||||
issues.filter_type.all_issues = All issues
|
||||
issues.filter_type.assigned_to_you = Assigned to you
|
||||
issues.filter_type.created_by_you = Created by you
|
||||
issues.filter_type.mentioning_you = Mentioning you
|
||||
|
|
|
|||
|
|
@ -98,7 +98,7 @@ ok = Bone
|
|||
download_logs = Elsuti protokolojn
|
||||
unknown = Nekonata
|
||||
issues = Eraroj
|
||||
error404 = Aŭ tiu ĉi paĝo <strong>ne ekzistas</strong>, <strong>estis forigita</strong> aŭ <strong>vi ne rajtas</strong> vidi ĝin.
|
||||
error404 = Aŭ tiu ĉi paĝo <strong>ne ekzistas</strong>, <strong>estas forigita</strong> aŭ <strong>vi ne rajtas</strong> vidi ĝin.
|
||||
retry = Reprovi
|
||||
activities = Aktivecoj
|
||||
confirm_delete_selected = Konfirmi forigon de ĉiu elektito?
|
||||
|
|
@ -142,9 +142,11 @@ new_org.link = Novan organizaĵon
|
|||
error413 = Vi plenkonsumis vian kvoton.
|
||||
twofa_scratch = Sukuranta kodo por duobla aŭtentikigo
|
||||
|
||||
copy_path = Kopii dosiervojon
|
||||
|
||||
[editor]
|
||||
buttons.list.ordered.tooltip = Aldoni nombran liston
|
||||
buttons.bold.tooltip = Aldoni grasan tekston
|
||||
buttons.bold.tooltip = Aldoni grasan tekston (Ctrl+B / ⌘B)
|
||||
buttons.quote.tooltip = Citi tekston
|
||||
buttons.code.tooltip = Aldoni kodtekston
|
||||
buttons.list.unordered.tooltip = Aldoni punktan liston
|
||||
|
|
@ -154,7 +156,7 @@ buttons.ref.tooltip = Citi eraron aŭ tirpeton
|
|||
buttons.list.task.tooltip = Aldoni liston de taskoj
|
||||
buttons.enable_monospace_font = Ŝalti egallarĝan signoformaron
|
||||
buttons.mention.tooltip = Mencii uzanton aŭ grupon
|
||||
buttons.italic.tooltip = Aldoni oblikvan tekston
|
||||
buttons.italic.tooltip = Aldoni oblikvan tekston (Ctrl+I / ⌘I)
|
||||
buttons.link.tooltip = Aldoni ligilon
|
||||
buttons.disable_monospace_font = Malsalti egallarĝan signoformaron
|
||||
buttons.indent.tooltip = Krommarĝeni erojn je unu nivelo
|
||||
|
|
@ -167,6 +169,10 @@ table_modal.label.rows = Horizontaloj
|
|||
table_modal.label.columns = Vertikaloj
|
||||
link_modal.description = Priskribo
|
||||
|
||||
link_modal.header = Aldoni ligilon
|
||||
link_modal.url = Url
|
||||
link_modal.paste_reminder = Aludo: kun URL en via tondujo, vi povas alglui senpere al la redaktilo por krei ligilon.
|
||||
|
||||
[aria]
|
||||
navbar = Esplora breto
|
||||
footer.software = Pri ĉi tiu programaro
|
||||
|
|
@ -203,6 +209,8 @@ lightweight_desc = Forgejo ne penigos vian servilon, kaj eĉ ruleblas je Raspber
|
|||
platform = Plursistema
|
||||
license_desc = Ek, prenu <a target="_blank" rel="noopener noreferrer" href="%[1]s">Forgejon</a>! Aliĝu kaj <a target="_blank" rel="noopener noreferrer" href="%[2]s">helpu</a> nin plibonigi la projekton. Ne timu kontribui!
|
||||
|
||||
platform_desc = Forgejo estas konfirmita ruli sur liberaj operaciumoj kiel Linukso kaj FreeBSD, kaj malsamaj arkitekturprocesoroj. Elektu tion, kion vi preferas.
|
||||
|
||||
[install]
|
||||
title = Komenca agordado
|
||||
install = Instalado
|
||||
|
|
@ -311,7 +319,7 @@ enable_update_checker = Aktivigi novversian kontrolanton
|
|||
password_algorithm = Pasvorthaketiga algoritmo
|
||||
env_config_keys = Mediagordoj
|
||||
invalid_password_algorithm = Malvalida pasvorthakeita algoritmo
|
||||
password_algorithm_helper = Agordas la pasvorthaketigan algoritmon. Algoritmoj havas malsamajn postulojn kaj efikecojn. La algoritmo argon2 sufiĉe sekuras, sed postulas multan memoron kaj eble ne taŭgas por nepotencaj serviloj.
|
||||
password_algorithm_helper = Agordu la pasvorthaketigan algoritmon. Algoritmoj havas malsamajn postulojn kaj efikecojn. La algoritmo argon2 sufiĉe sekuras, sed postulas multan memoron kaj eble ne taŭgas por nepotencaj serviloj.
|
||||
internal_token_failed = Malsukcesis krei internan ĵetonon: %v
|
||||
smtp_from_invalid = La «Sendu retleterojn kiel» adreso malvalidas
|
||||
allow_only_external_registration = Permesi registriĝon nur per fremdaj servoj
|
||||
|
|
@ -398,7 +406,7 @@ openid_register_title = Krei novan konton
|
|||
email_domain_blacklisted = Vi ne povas registriĝi per via retpoŝtadreso.
|
||||
verify = Konfirmi
|
||||
oauth_signup_submit = Finfari konton
|
||||
prohibit_login_desc = Via konto estas suspendita kaj ne povas interagi kun la instanco. Bonvolu kontakti vian retejestron por regajni aliron.
|
||||
prohibit_login_desc = Via konto estas suspendita kaj ne povas interagi kun la instanco. Bonvolu kontakti la retejestron por regajni aliron.
|
||||
openid_connect_desc = La elektita OpenID URI estas nekonata. Ligu ĝin al nova konto ĉi tie.
|
||||
oauth.signin.error = Eraris traktante aprobpeton. Se plu eraros, bonvolu kunparoli la retejestron.
|
||||
invalid_code = Via konfirmkodo malvalidas aŭ eksdatiĝis.
|
||||
|
|
@ -428,7 +436,7 @@ hint_login = Ĉu vi jam havas konton? <a href="%s">Salutu nun!</a>
|
|||
hint_register = Ĉu vi bezonas konton? <a href="%s">Reĝistriĝi nun.</a>
|
||||
sign_up_button = Reĝistriĝi nun.
|
||||
sign_in_openid = Daŭrigi kun OpenID
|
||||
back_to_sign_in = Reen en la saluton
|
||||
back_to_sign_in = Reen en la ensaluton
|
||||
use_onetime_code = Uzi unufojan kodon
|
||||
|
||||
[mail]
|
||||
|
|
@ -484,7 +492,7 @@ password_change.text_1 = La pasvorto de via konto ĵus ŝanĝiĝis.
|
|||
primary_mail_change.subject = Via ĉefa retpoŝtadreso ŝanĝiĝis
|
||||
totp_disabled.text_1 = La tempobazita unufoja pasvorto (TOTP) en via konto ĵus malaktiviĝis.
|
||||
admin.new_user.text = Bonvolu <a href="%s">klaki ĉi tie</a> por konduki ĉi tiun uzanton el la administranta agordilo.
|
||||
removed_security_key.subject = Sekureca ŝlosilo estas forigita
|
||||
removed_security_key.subject = Sekurŝlosilo estas forigita
|
||||
removed_security_key.text_1 = La sekureca ŝlosilo "%[1]s" ĵus estas forigita de via konton.
|
||||
totp_enrolled.text_1.has_webauthn = Vi ĵus aktivigis TOTP-n por via konto. Tio volas diri ke por ĉiuj venontaj salutoj al via konto, vi povus uzi TOTP-n kiel 2FA metodo aŭ ajnan sekurecan ŝlosilon.
|
||||
totp_enrolled.text_1.no_webauthn = Vi ĵus aktivigis TOTP-n por via konto. Tio volas diri ke por ĉiuj venontaj salutoj al via konto, vi devos uzi TOTP-n kiel 2FA metodo.
|
||||
|
|
@ -492,6 +500,13 @@ removed_security_key.no_2fa = Ne estas aliaj 2FA agorditaj metodoj, tio estas ke
|
|||
totp_disabled.no_2fa = Ne estas plu aliaj 2FA agorditaj metodoj, tio estas ke ne plus necesas uzi 2FA-n por saluti.
|
||||
account_security_caution.text_1 = Se tio estis vi, vi povas sekure ignori ĉi tiun retmesaĝon.
|
||||
|
||||
account_security_caution.text_2 = Se ne estis vi, via konto estas kompromitata. Bonvolu kontakti la administrantojn de la retpaĝaro.
|
||||
totp_enrolled.subject = Vi aktivigis TOTP-n kiel 2FA metodo
|
||||
issue_assigned.pull = @%[1]s asignis al vi la tirpeton %[2]s en la deponejo %[3]s.
|
||||
issue_assigned.issue = @%[1]s asignis al vi ĉi tiun eraron %[2]s en la deponejo %[3]s.
|
||||
issue.action.review_dismissed = <b>@%[1]s</b> maldungis la lastan revizion de %[2]s por ĉi tiu tirpeto.
|
||||
repo.transfer.subject_to_you = %s volas reposedigi la deponejon "%s" al vi
|
||||
|
||||
[form]
|
||||
TeamName = Gruponomo
|
||||
RepoName = Deponejonomo
|
||||
|
|
@ -560,6 +575,16 @@ last_org_owner = Vi ne povas forigi la lastan uzanton de la «posendantoj» grup
|
|||
still_has_org = "Via konto anas de almenaŭ unu organizaĵoj, forlasu ilin unue."
|
||||
invalid_ssh_key = Ne povis konfirmi vian SSH-ŝlosilon: %s
|
||||
|
||||
FullName = Plena nomo
|
||||
Description = Priskribo
|
||||
Pronouns = Pronomoj
|
||||
Biography = Biografio
|
||||
Website = Retpaĝaro
|
||||
Location = Kieo
|
||||
To = Branĉonomo
|
||||
AccessToken = Atingoĵetono
|
||||
required_prefix = La enigaĵo devas komenciĝi per "%s"
|
||||
|
||||
[modal]
|
||||
confirm = Konfirmi
|
||||
no = Ne
|
||||
|
|
@ -728,6 +753,91 @@ permission_write = Lega kaj Skriba
|
|||
key_content = Enhavo
|
||||
key_signature_gpg_placeholder = Komenciĝas per «-----BEGIN PGP SIGNATURE-----»
|
||||
|
||||
storage_overview = Stokada superrigardo
|
||||
quota = Kvoto
|
||||
pronouns = Pronomoj
|
||||
pronouns_unspecified = Nespecifitaj
|
||||
change_username_redirect_prompt.with_cooldown.one = La malnova uzantnomo disponeblos al ĉiuj post atendoperiodo de %[1]d tago. Vi povas ankoraŭ reakiri la malnovan uzantnomon dum ĉi tiu periodo.
|
||||
change_username_redirect_prompt.with_cooldown.few = La malnova uzantnomo disponeblos al ĉiuj post atendoperiodo de %[1]d tagoj. Vi povas ankoraŭ reakiri la malnovan uzantnomon dum ĉi tiu periodo.
|
||||
language.title = Defaŭlta lingvo
|
||||
language.description = Ĉi tiu lingvo estos konservota en via konto kaj estos uzota kiel defaŭlta post kiam vi ensalutos.
|
||||
language.localization_project = Helpu nin traduki Forgejo-n en via lingvo! <a href="%s">Lerni plu</a>.
|
||||
hints = Sugestoj
|
||||
update_hints = Ĝisdatigi la sugestojn
|
||||
update_hints_success = La sugestoj ĝisdatiĝis.
|
||||
hidden_comment_types.ref_tooltip = Komentoj, kie ĉi tiu eraro estas referencita de alia eraro/enmeto/…
|
||||
comment_type_group_reference = Referenco
|
||||
comment_type_group_milestone = Celo
|
||||
comment_type_group_assignee = Asignito
|
||||
comment_type_group_lock = Rigli staton
|
||||
comment_type_group_review_request = Revizia peto
|
||||
comment_type_group_issue_ref = Referenco de la eraro
|
||||
keep_activity_private = Kaŝi la aktivecon de la profilpaĝo
|
||||
keep_activity_private.description = Via <a href="%s">publika aktiveco</a> nur videblos al vi kaj la instancaj administrantoj.
|
||||
enable_custom_avatar = Uzi propran profilbildon
|
||||
change_password = Ŝanĝi pasvorton
|
||||
keep_pronouns_private = Montri pronomojn nur al la aŭtentikigitaj uzantoj
|
||||
keep_pronouns_private.description = Tio maskos viajn pronomojn kontraŭ neaŭtentikigitaj vizitantoj.
|
||||
add_new_principal =
|
||||
gpg_token_required = Vi devas disponigi signaturon por la malsupran ĵetono
|
||||
gpg_token = Ĵetono
|
||||
gpg_token_help = Vi povas generi signaturon uzante:
|
||||
ssh_token_required = Vi devas disponigi signaturon for la malsupran ĵetono
|
||||
ssh_token = Ĵetono
|
||||
ssh_token_help = Vi povas generi signaturon uzante:
|
||||
no_activity = Neniu ĵusa aktiveco
|
||||
token_state_desc = Ĉi tiu ĵetono estis uzata dum la 7 lastaj tagoj
|
||||
manage_access_token = Atingoĵetonoj
|
||||
generate_new_token = Generi novan ĵetonon
|
||||
token_name = Ĵetono-nomo
|
||||
generate_token = Generi ĵetonon
|
||||
generate_token_success = Via nova ĵetono estas generita. Kopiu ĝin nun, ĉar ĝi ne estos montrata ree.
|
||||
access_token_deletion = Forigi atingoĵetonon
|
||||
delete_token_success = La ĵetono estas forigita. Aplikaĵoj uzantaj ĝin ne atingos plu vian konton.
|
||||
regenerate_token = Regeneri
|
||||
access_token_regeneration = Regeneri atingoĵetonon
|
||||
at_least_one_permission = Vi devas selekti almenaŭ unu permeson por krei ĵetonon
|
||||
remove_oauth2_application = Forigi OAuth2-aplikaĵon
|
||||
remove_oauth2_application_success = La aplikaĵo estas forigita.
|
||||
create_oauth2_application = Krei novan OAuth2-aplikaĵon
|
||||
create_oauth2_application_button = Krei aplikaĵon
|
||||
create_oauth2_application_success = Vi sukcese kreis novan OAuth2 aplikaĵon.
|
||||
update_oauth2_application_success = Vi sukcese ĝisdatigis la OAuth2 aplikaĵon.
|
||||
oauth2_application_name = Aplikaĵonomo
|
||||
save_application = Konservi
|
||||
oauth2_client_id = Klienta ID
|
||||
oauth2_client_secret = Klienta sekreto
|
||||
oauth2_regenerate_secret = Regeneri sekreton
|
||||
oauth2_regenerate_secret_hint = Ĉu vi perdis vian sekreton?
|
||||
oauth2_application_edit = Redakti
|
||||
authorized_oauth2_applications = Permesitaj OAuth2-aplikaĵoj
|
||||
visibility = Uzanta videbleco
|
||||
visibility.public = Publika
|
||||
visibility.public_tooltip = Videbla al ĉiuj
|
||||
visibility.limited = Limigata
|
||||
visibility.limited_tooltip = Videbla nur al ensalutitaj uzantoj
|
||||
visibility.private = Privata
|
||||
visibility.private_tooltip = Videbla nur al membroj de organizaĵoj, kiujn vi aliĝis
|
||||
blocked_since = Blokata ekde %s
|
||||
user_unblock_success = La uzanto sukcese estas malblokita.
|
||||
user_block_success = La uzanto sukcese estas blokita.
|
||||
user_block_yourself = Vi ne povas bloki vin mem.
|
||||
quota.applies_to_user = La sekvantaj kvotaj reguloj aplikiĝas al via konto
|
||||
quota.applies_to_org = La sekvantaj kvotaj reguloj aplikiĝas al ĉi tiu organizaĵo
|
||||
quota.rule.exceeded = Superita
|
||||
quota.sizes.all = Ĉio
|
||||
quota.sizes.repos.all = Deponejoj
|
||||
quota.sizes.repos.public = Publikaj deponejoj
|
||||
quota.sizes.repos.private = Privataj deponejoj
|
||||
quota.sizes.git.all = Git-enhavo
|
||||
quota.sizes.git.lfs = Git LFS
|
||||
quota.sizes.assets.attachments.all = Kunsendaĵoj
|
||||
quota.sizes.assets.attachments.issues = Kunsendaĵoj de eraro
|
||||
quota.sizes.assets.attachments.releases = Kunsendaĵoj de eldono
|
||||
quota.sizes.assets.artifacts = Artfaritaĵoj
|
||||
quota.sizes.assets.packages.all = Pakaĵoj
|
||||
quota.sizes.wiki = Vikio
|
||||
|
||||
[user]
|
||||
form.name_reserved = La uzantonomo «%s» estas protektita.
|
||||
joined_on = Aliĝis je %s
|
||||
|
|
@ -756,6 +866,22 @@ block_user = Bloki uzanton
|
|||
change_avatar = Ŝanĝi vian profilbildon…
|
||||
|
||||
|
||||
activity = Publika aktiveco
|
||||
followers.title.one = Sekvanto
|
||||
followers.title.few = Sekvantoj
|
||||
following.title.one = Sekvata
|
||||
following.title.few = Sekvataj
|
||||
followers_one = %d sekvanto
|
||||
following_one = %d sekvataj
|
||||
overview = Superrigardo
|
||||
disabled_public_activity = Ĉi tiu uzanto malaktivigis la publikan videblecon de sia aktiveco.
|
||||
public_activity.visibility_hint.self_public = Via aktiveco videblas al ĉiuj, escepte de interagoj en privataj spacoj. <a href="%s">Agordi</a>.
|
||||
public_activity.visibility_hint.admin_public = Ĉi tiu aktiveco videblas al ĉiuj, sed kiel administranto vi povas ankaŭ vidi interagojn en privataj spacoj.
|
||||
public_activity.visibility_hint.self_private = Via aktiveco nur videblas al vi kaj la instancaj administrantoj. <a href="%s">Agordi</a>.
|
||||
public_activity.visibility_hint.admin_private = Ĉi tiu aktiveco videblas al vi ĉar vi estas administranto, sed la uzanto volas ke ĝi restu privata.
|
||||
public_activity.visibility_hint.self_private_profile = Via aktiveco nur videblas al vi kaj la instancaj administrantoj, ĉar via profilo estas privata. <a href="%s">Agordi</a>.
|
||||
form.name_pattern_not_allowed = La ŝablono "%s" ne estas permesata en uzantnomo.
|
||||
|
||||
[repo]
|
||||
editor.add_file = Aldoni dosieron
|
||||
settings.tags = Etikedoj
|
||||
|
|
@ -803,6 +929,8 @@ settings.archive.text = Arĥivigi la deponejon igus ĝin sole legebla. Ĝi kaŝi
|
|||
migrate_items_releases = Eldonoj
|
||||
commits.commits = Enmetoj
|
||||
|
||||
rss.must_be_on_branch = Vi devas esti en branĉo por havi RSS-fluon.
|
||||
|
||||
[org]
|
||||
code = Fontkodo
|
||||
settings = Agordoj
|
||||
|
|
@ -837,4 +965,27 @@ regexp_tooltip = Interpretas la serĉoterminoj kiel regulesprimo
|
|||
fuzzy = Svaga
|
||||
branch_kind = Serĉi disbranĉigojn…
|
||||
runner_kind = Serĉi rulantojn…
|
||||
pull_kind = Serĉi tirpetojn…
|
||||
pull_kind = Serĉi tirpetojn…
|
||||
|
||||
[actions]
|
||||
variables.creation.success = La variablo "%s" estas aldonita.
|
||||
variables.update.failed = Ne eblas redakti la variablon.
|
||||
variables.update.success = La variablo estas redaktita.
|
||||
|
||||
[projects]
|
||||
deleted.display_name = Forigita projekto
|
||||
type-1.display_name = Persona projekto
|
||||
type-2.display_name = Deponejoprojekto
|
||||
|
||||
[git.filemode]
|
||||
changed_filemode = %[1]s → %[2]s
|
||||
directory = Dosierujo
|
||||
normal_file = Normala dosiero
|
||||
executable_file = Rulebla dosiero
|
||||
symbolic_link = Simbola ligilo
|
||||
submodule = Submodulo
|
||||
|
||||
[markup]
|
||||
filepreview.line = Linio %[1]d en %[2]s
|
||||
filepreview.lines = Linioj %[1]d ĝis %[2]d en %[3]s
|
||||
filepreview.truncated = La superrigardo estas mallongigita
|
||||
|
|
@ -124,8 +124,8 @@ filter = Filter
|
|||
filter.clear = Tühjenda filtrid
|
||||
filter.is_archived = Arhiveeritud
|
||||
filter.not_archived = Arhiveerimata
|
||||
filter.is_fork = Koodiharud
|
||||
filter.not_fork = Pole koodiharud
|
||||
filter.is_fork =
|
||||
filter.not_fork =
|
||||
filter.is_mirror = Peegelpildid
|
||||
filter.not_mirror = Pole peegelpilte
|
||||
filter.is_template = Mallid
|
||||
|
|
@ -186,7 +186,7 @@ contributions_one = kaastöö
|
|||
|
||||
[editor]
|
||||
buttons.heading.tooltip = Lisa pealkiri
|
||||
buttons.italic.tooltip = Lisa kaldkirjas tekst
|
||||
buttons.italic.tooltip = Lisa kaldkirjas tekst (Ctrl+I / ⌘I)
|
||||
buttons.quote.tooltip = Tsiteeri teksti
|
||||
buttons.code.tooltip = Lisa kood
|
||||
buttons.link.tooltip = Lisa link
|
||||
|
|
@ -198,7 +198,7 @@ buttons.switch_to_legacy.tooltip = Selle asemel kasuta pärandredaktorit
|
|||
buttons.enable_monospace_font = Kasuta püsisammkirja
|
||||
buttons.disable_monospace_font = Lülita püsisammkiri välja
|
||||
buttons.indent.tooltip = Liiguta objekte ühe taseme võrra
|
||||
buttons.bold.tooltip = Lisa paks tekst
|
||||
buttons.bold.tooltip = Lisa paks tekst (Ctrl+B / ⌘B)
|
||||
buttons.mention.tooltip = Maini kasutajat või tiimi
|
||||
buttons.unindent.tooltip = Võta tagasi objektide liigutamine ühe taseme võrra
|
||||
buttons.new_table.tooltip = Lisa tabel
|
||||
|
|
@ -352,6 +352,9 @@ Password = Salasõna
|
|||
username_password_incorrect = Kassutajanimi või salasõna pole õige.
|
||||
required_prefix = Sisendi alguses peab olema „&s“
|
||||
|
||||
To = Haru nimi
|
||||
NewBranchName = Haru uus nimi
|
||||
|
||||
[settings]
|
||||
retype_new_password = Korda uut salasõna
|
||||
password_incorrect = Senine salasõna pole õige.
|
||||
|
|
@ -360,6 +363,8 @@ update_password = Muuda salasõna
|
|||
old_password = Senine salasõna
|
||||
new_password = Uus salasõna
|
||||
|
||||
comment_type_group_branch = Koodiharu
|
||||
|
||||
[repo]
|
||||
mirror_sync_on_commit = Sünkrooni sissekannete tegemisel
|
||||
mirror_interval_invalid = Peegelpildi välp pole korrektne.
|
||||
|
|
@ -371,7 +376,7 @@ mirror_password_help = Salvestatud salasõna kustutamiseks muuda kasutajanime.
|
|||
mirror_address = Klooni võrguaadressilt
|
||||
mirror_password_blank_placeholder = (Seadistamata)
|
||||
commits.message = Sõnum
|
||||
commits.search_all = Kõik harud
|
||||
commits.search_all = Kõik koodiharud
|
||||
commits.author = Autor
|
||||
commits.browse_further = Sirvi edasi
|
||||
commits.renamed_from = Nimi muudetud, vana nimi oli „%s“
|
||||
|
|
@ -379,7 +384,7 @@ commits.date = Kuupäev
|
|||
commits.older = Vanemad
|
||||
commits.newer = Uuemad
|
||||
commitstatus.error = Viga
|
||||
commits.search_branch = See haru
|
||||
commits.search_branch = See koodiharu
|
||||
projects = Projektid
|
||||
commitstatus.failure = Tõrge
|
||||
commitstatus.pending = Ootel
|
||||
|
|
@ -390,6 +395,32 @@ issues.choose.get_started = Alustame
|
|||
issues.start_tracking_short = Käivita taimer
|
||||
issues.filter_sort.feweststars = Kõike vähem tärne
|
||||
|
||||
rss.must_be_on_branch = RSS-voo jaoks pead asuma koodiharus.
|
||||
all_branches = Kõik koodiharud
|
||||
default_branch = Vaikimisi koodiharu
|
||||
default_branch_label = vaikimisi
|
||||
code.desc = Ligipääs lähtekoodile, failidele, sissekannetele ja koodiharudele.
|
||||
filter_branch_and_tag = Filtreeri koodiharu või sildi alusel
|
||||
branches = Koodiharud
|
||||
n_branch_one = %s koodiharu
|
||||
n_branch_few = %s koodiharu
|
||||
commit_graph.select = Vali koodiharud
|
||||
commit.contained_in_default_branch = See sissekanne on vaikimisi koodiharu osa
|
||||
editor.new_branch_name_desc = Koodiharu uus nimi…
|
||||
commits.nothing_to_compare = Need koodiharud on võrdsed.
|
||||
issues.no_ref = Ühtegi koodiharu/silti pole määratud
|
||||
pulls.merged_info_text = Koodiharu %s võid nüüd kustutada.
|
||||
pulls.update_branch_success = Koodiharu uuendamine õnnestus
|
||||
pulls.update_not_allowed = Sul pole õigust koodiharu uuendada
|
||||
pull.deleted_branch = (kustutatud):%s
|
||||
settings.branches.update_default_branch = Uuenda vaikimisi koodiharu
|
||||
settings.branches.add_new_rule = Lisa uus reegel
|
||||
settings.event_create_desc = Koodiharu või silt on loodud.
|
||||
settings.event_delete_desc = Koodiharu või silt on kustutatud.
|
||||
settings.branches = Kooduharud
|
||||
settings.protected_branch.save_rule = Salvesta reegel
|
||||
settings.protected_branch.delete_rule = Kustuta reegel
|
||||
|
||||
[actions]
|
||||
variables = Muutujad
|
||||
variables.deletion = Eemalda muutuja
|
||||
|
|
|
|||
|
|
@ -1 +1,142 @@
|
|||
[common]
|
||||
home = Etxea
|
||||
dashboard = Aginte-taula
|
||||
explore = Esploratu
|
||||
help = Laguntza
|
||||
logo = Logoa
|
||||
sign_in = Hasi saioa
|
||||
sign_in_with_provider = Hasi saioa %s-ekin
|
||||
sign_in_or = Edo
|
||||
sign_out = Saioa itxi
|
||||
sign_up = Erregistratu
|
||||
link_account = Lotu kontua
|
||||
register = Erregistratu
|
||||
version = Bertsioa
|
||||
powered_by = %s-k bultzatuta
|
||||
page = Orria
|
||||
notifications = Jakinarazpenak
|
||||
create_new = Sortu…
|
||||
user_profile_and_more = Profila eta ezarpenak…
|
||||
signed_in_as = Erabilitako saio-izena
|
||||
enable_javascript = Web-orrialde honek JavaScript behar du.
|
||||
toc = Edukien taula
|
||||
licenses = Lizentziak
|
||||
return_to_forgejo = Itzuli Forgejora
|
||||
toggle_menu = Menua ezkutatu/erakutsi
|
||||
more_items = Item gehiago
|
||||
username = Erabiltzailea
|
||||
email = Email helbidea
|
||||
password = Pasahitza
|
||||
access_token = Sarbide-tokena
|
||||
re_type = Berretsi pasahitza
|
||||
captcha = CAPTCHA
|
||||
twofa = Bi faktoreko autentifikazioa
|
||||
twofa_scratch = Bi faktoreko marradura-kodea
|
||||
passcode = Pasakodea
|
||||
webauthn_insert_key = Sartu zure segurtasun-gakoa
|
||||
webauthn_sign_in = Sakatu botoia zure segurtasun-gakoan. Zure segurtasun-gakoak ez badu botoirik, sartu berriro.
|
||||
webauthn_press_button = Mesedez, sakatu botoia zure segurtasun-gakoan…
|
||||
webauthn_use_twofa = Erabili zure telefonoko bi faktoreko kodea
|
||||
webauthn_error = Ezin izan da irakurri zure segurtasun-gakoa.
|
||||
webauthn_unsupported_browser = Zure nabigatzaileak ez du WebAuthn onartzen.
|
||||
webauthn_error_unknown = Akats ezezagun bat gertatu da. Mesedez, saiatu berriro.
|
||||
webauthn_error_insecure = WebAuthnek konexio seguruak baino ez ditu onartzen. HTTP bidez probatzeko, "localhost" edo "127.0.0.1" jatorria erabil daiteke
|
||||
webauthn_error_unable_to_process = Zerbitzariak ezin izan du zure eskaera prozesatu.
|
||||
webauthn_error_duplicated = Segurtasun-gakorik ez da onartzen eskaera honetarako. Mesedez, ziurtatu giltza ea dagoela erregistratuta.
|
||||
webauthn_error_empty = Gako honetarako izen bat jarri behar duzu.
|
||||
webauthn_error_timeout = Zure gakoa irakurri aurretik denbora-muga gainditu da. Kargatu berriro orrialde hau eta saiatu berriro.
|
||||
repository = Biltegia
|
||||
new_fork = Biltegi-adar berria
|
||||
new_project_column = Zutabe berria
|
||||
admin_panel = Lekuaren kudeaketa
|
||||
settings = Ezarpenak
|
||||
your_profile = Profila
|
||||
your_starred = Izardunak
|
||||
your_settings = Ezarpenak
|
||||
new_repo.title = Biltegi berria
|
||||
new_migrate.title = Migrazio berria
|
||||
new_org.title = Erakunde berria
|
||||
new_repo.link = Biltegi berria
|
||||
new_migrate.link = Migrazio berria
|
||||
new_org.link = Erakunde berria
|
||||
all = Dena
|
||||
sources = Iturriak
|
||||
mirrors = Ispiluak
|
||||
collaborative = Elkarlanean
|
||||
forks = Adarrak
|
||||
activities = Jarduerak
|
||||
issues = Arazoak
|
||||
milestones = Mugarriak
|
||||
ok = Ados
|
||||
cancel = Utzi
|
||||
retry = Saiatu berriro
|
||||
rerun = Berriz exekutatu
|
||||
rerun_all = Berriz exekutatu lan guztiak
|
||||
save = Gorde
|
||||
add = Gehitu
|
||||
add_all = Gehitu guztiak
|
||||
remove = Kendu
|
||||
remove_all = Kendu guztiak
|
||||
remove_label_str = Kendu "%s" itema
|
||||
edit = Editatu
|
||||
view = Ikusi
|
||||
enabled = Gaituta
|
||||
disabled = Ezgaituta
|
||||
locked = Blokeatuta
|
||||
copy = Kopiatu
|
||||
copy_url = Kopiatu URLa
|
||||
copy_hash = Kopiatu hasha
|
||||
copy_path = Kopiatu bidea
|
||||
copy_content = Kopiatu edukia
|
||||
copy_branch = Kopiatu adarraren izena
|
||||
copy_success = Kopiatuta!
|
||||
copy_error = Kopiatzeak huts egin du
|
||||
copy_type_unsupported = Ezin da kopiatu artxibo mota hau
|
||||
write = Idatzi
|
||||
preview = Aurreikusi
|
||||
loading = Kargatzen…
|
||||
error = Akatsa
|
||||
error404 = Ikusi nahi duzun orria <strong>ez da existitzen</strong>, <strong>ezabatu egin da</strong> edo <strong>ez duzu baimenik</strong> ikusteko.
|
||||
error413 = Kuota agortu duzu.
|
||||
go_back = Joan Atzera
|
||||
invalid_data = Datu baliogabeak: %v
|
||||
never = Inoiz ez
|
||||
unknown = Ezezaguna
|
||||
rss_feed = RSS jarioa
|
||||
pin = Finkatu
|
||||
unpin = Kendu
|
||||
artifacts = Artefaktuak
|
||||
confirm_delete_artifact = Ziur zaude ezabatu nahi duzula "%s" artefaktua?
|
||||
archived = Artxibatuta
|
||||
concept_system_global = Globala
|
||||
concept_user_individual = Banakakoa
|
||||
concept_code_repository = Biltegia
|
||||
concept_user_organization = Erakundea
|
||||
show_timestamps = Erakutsi denbora-zigiluak
|
||||
show_log_seconds = Erakutsi segundoak
|
||||
show_full_screen = Pantaila osoa erakutsi
|
||||
download_logs = Deskargatu logak
|
||||
confirm_delete_selected = Baieztatzen duzu aukeratutako itemak ezabatu nahi dituzula?
|
||||
name = Izena
|
||||
value = Balioa
|
||||
filter = Filtroa
|
||||
filter.clear = Kendu filtroak
|
||||
filter.is_archived = Artxibatuta
|
||||
filter.not_archived = Ez artxibatuta
|
||||
filter.is_fork = Adarrak
|
||||
filter.not_fork = Adarrik ez
|
||||
filter.is_mirror = Ispiluak
|
||||
filter.not_mirror = Ispilurik ez
|
||||
filter.is_template = Txantiloiak
|
||||
filter.not_template = Txantiloirik ez
|
||||
filter.public = Publikoa
|
||||
filter.private = Pribatua
|
||||
|
||||
[search]
|
||||
search = Bilatu…
|
||||
type_tooltip = Bilatzeko modua
|
||||
repo_kind = Bilatu biltegiak…
|
||||
user_kind = Bilatu erabiltzaileak…
|
||||
org_kind = Bilatu erakundeak…
|
||||
team_kind = Bilatu taldeak…
|
||||
code_kind = Bilatu kodea…
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ webauthn_use_twofa=Käytä kaksivaihesta todennusta puhelimestasi
|
|||
webauthn_error=Turva-avainta ei voitu lukea.
|
||||
webauthn_unsupported_browser=Selaimesi ei tällä hetkellä tue WebAuthnia.
|
||||
webauthn_error_unknown=Tuntematon virhe. Yritä uudelleen.
|
||||
webauthn_error_insecure=WebAuthn tukee vain suojattuja yhteyksiä. Testatessa HTTP-yhteydellä voit käyttää osoitetta "localhost" tai "127.0.0.1"
|
||||
webauthn_error_insecure=WebAuthn tukee vain turvallisia yhteyksiä. Testaamista varten HTTP-välityksellä voit käyttää alkuperää "localhost" tai "127.0.0.1"
|
||||
webauthn_error_unable_to_process=Palvelin ei pystynyt käsittelemään pyyntöä.
|
||||
webauthn_error_duplicated=Turva-avainta ei ole sallittu tässä pyynnössä. Varmista, ettei avainta ole jo rekisteröity.
|
||||
webauthn_error_empty=Sinun täytyy asettaa nimi tälle avaimelle.
|
||||
|
|
@ -848,7 +848,7 @@ twofa_enroll=Ota kaksivaiheinen todennus käyttöön
|
|||
twofa_disabled=Kaksivaiheinen todennus on otettu pois käytöstä.
|
||||
scan_this_image=Skannaa tämä kuva todennussovelluksellasi:
|
||||
or_enter_secret=Tai kirjoita salainen avain: %s
|
||||
twofa_enrolled=Tiliisi on otettu käyttöön kaksivaiheinen todennus. Ota kertakäyttöinen palautusavain (%s) talteen turvalliseen paikkaan, sillä se näytetään vain kerran!
|
||||
twofa_enrolled=Tilisi on otettu mukaan onnistuneesti. Säilytä kertakäyttöistä palautusavainta (%s) turvallisessa paikassa, sillä sitä ei enää näytetä.
|
||||
|
||||
webauthn_nickname=Nimimerkki
|
||||
|
||||
|
|
@ -963,7 +963,7 @@ quota.sizes.assets.attachments.all = Liitteet
|
|||
quota.applies_to_user = Seuraavia kiintiösääntöjä sovelletaan tiliisi
|
||||
user_block_yourself = Et voi estää itseäsi.
|
||||
quota = Kiintiö
|
||||
storage_overview = Tallennustilan yleisnäkymä
|
||||
storage_overview = Tallennustilan yhteenveto
|
||||
quota.applies_to_org = Seuraavia kiintiösääntöjä sovelletaan tähän organisaatioon
|
||||
quota.rule.exceeded = Ylitetty
|
||||
quota.rule.no_limit = Rajoittamaton
|
||||
|
|
@ -1013,6 +1013,8 @@ ssh_principal_deletion_success = Prinsipaali on poistettu.
|
|||
principal_state_desc = Tätä prinsipaalia on käytetty viimeisen seitsemän päivän aikana
|
||||
regenerate_token_success = Poletti on luotu uudelleen. Sovellukset, jotka käyttivät polettia, eivät enää pääse tilillesi. Kyseiset sovellukset tulee päivittää uudella poletilla.
|
||||
|
||||
quota.sizes.assets.all = Resurssit
|
||||
|
||||
[repo]
|
||||
owner=Omistaja
|
||||
owner_helper=Jotkin organisaatiot eivät välttämättä näy pudotusvalikossa, koska tietovarastojen enimmäismäärää on rajoitettu.
|
||||
|
|
@ -1072,7 +1074,7 @@ migrate_items_pullrequests=Vetopyynnöt
|
|||
migrate_items_releases=Julkaisut
|
||||
migrate_repo=Suorita tietovaraston migraatio
|
||||
migrate.clone_address=Migraatio/kloonaus URL-osoitteesta
|
||||
migrate.github_token_desc=Voit laittaa yhden tai useamman pääsypoletin pilkulla erotellen tähän nopeuttaaksesi migraatiota GitHubin rajapinnan tahtirajojen takia. VAROITUS: Tämän ominaisuuden väärinkäyttö voi rikkoa palveluntarjoajan ehtoja ja johtaa tilin estämiseen.
|
||||
migrate.github_token_desc=Voit lisätä tähän yhden tai useamman tunnuksen pilkuilla erotettuna nopeuttaaksesi migraatiota kiertämällä GitHub API:n nopeusrajoituksen. Varoitus: Tämän ominaisuuden väärinkäyttö voi rikkoa palveluntarjoajan käytäntöä ja johtaa tiliesi sulkemiseen.
|
||||
migrate.permission_denied=Paikallisten tietovarastojen tuominen ei ole sallittua.
|
||||
migrate.failed=Migraatio epäonnistui: %v
|
||||
migrate.migrate_items_options=Lisäkohteiden migraatiota varten vaaditaan pääsypoletti
|
||||
|
|
@ -1081,7 +1083,7 @@ migrate.migrating_failed=Migraatio lähteestä <b>%s</b> epäonnistui.
|
|||
migrate.migrating_git=Suoritetaan Git-datan migraatiota
|
||||
|
||||
mirror_from=peili kohteelle
|
||||
forked_from=forkattu lähteestä
|
||||
forked_from=forkattu tietovarastosta
|
||||
unwatch=Lopeta tarkkailu
|
||||
watch=Tarkkaile
|
||||
unstar=Poista tähti
|
||||
|
|
@ -1117,7 +1119,7 @@ file_permalink=Pysyväislinkki
|
|||
|
||||
video_not_supported_in_browser=Selaimesi ei tue HTML5:n video-tagia.
|
||||
audio_not_supported_in_browser=Selaimesi ei tue HTML5:n audio-tagia.
|
||||
blame=Blame
|
||||
blame=Syyllistynyt
|
||||
download_file=Lataa tiedosto
|
||||
normal_view=Normaali näkymä
|
||||
line=rivi
|
||||
|
|
@ -1180,7 +1182,7 @@ projects.open=Avaa
|
|||
projects.close=Sulje
|
||||
|
||||
issues.desc=Ongelmien, tehtävien ja merkkipaalujen hallinta.
|
||||
issues.filter_assignees=Suodata käyttäjiä
|
||||
issues.filter_assignees=Suodata vastuuhenkilö
|
||||
issues.filter_milestones=Suodata merkkipaalu
|
||||
issues.new=Uusi ongelma
|
||||
issues.new.labels=Nimilaput
|
||||
|
|
@ -1215,7 +1217,7 @@ issues.self_assign_at=`itse otti tämän käsittelyyn %s`
|
|||
issues.change_title_at=`muutti otsikon <b><strike>%s</strike></b> otsikoksi <b>%s</b> %s`
|
||||
issues.delete_branch_at=`poisti haaran <b>%s</b> %s`
|
||||
issues.filter_label=Nimilappu
|
||||
issues.filter_label_exclude=`Käytä <code>alt</code> + <code>napsautus/rivinvaihto</code> poissulkeaksesi nimilappuja`
|
||||
issues.filter_label_exclude=Käytä <kbd>Alt</kbd> + <kbd>Click</kbd>-näppäinyhdistelmää nimiöiden poissulkemiseksi
|
||||
issues.filter_label_no_select=Kaikki nimilaput
|
||||
issues.filter_milestone=Merkkipaalu
|
||||
issues.filter_project=Projekti
|
||||
|
|
@ -1264,9 +1266,9 @@ issues.close_comment_issue=Kommentoi ja sulje
|
|||
issues.reopen_issue=Avaa uudelleen
|
||||
issues.reopen_comment_issue=Kommentoi ja avaa uudelleen
|
||||
issues.create_comment=Kommentoi
|
||||
issues.closed_at=`sulki tämän ongelman %s`
|
||||
issues.reopened_at=`uudelleenavasi tämän ongelman %s`
|
||||
issues.commit_ref_at=`viittasi tähän ongelmaan kommitissa %s`
|
||||
issues.closed_at=`sulki tämän tukipyynnön %s`
|
||||
issues.reopened_at=`avasi tämän tukipyynnön uudelleen %s`
|
||||
issues.commit_ref_at=`viittasi tähän tukipyyntöön sitoumuksesta %s`
|
||||
issues.author=Tekijä
|
||||
issues.role.owner=Omistaja
|
||||
issues.role.member=Jäsen
|
||||
|
|
@ -1547,7 +1549,7 @@ settings.web_hook_name_larksuite_only =Lark Suite
|
|||
settings.web_hook_name_packagist=Packagist
|
||||
settings.deploy_keys=Toimitusavaimet
|
||||
settings.add_deploy_key=Lisää toimitusavain
|
||||
settings.deploy_key_desc=Toimitusavaimilla on pelkkä lukuoikeus tietovarastoon.
|
||||
settings.deploy_key_desc=Käyttöönottoavaimilla voi olla vain luku- tai luku-kirjoitusoikeudet tietovarastoon.
|
||||
settings.is_writable_info=Salli tämän toimitusavaimen <strong>työntää</strong> tietovarastoon.
|
||||
settings.no_deploy_keys=Toimitusavaimia ei ole käytössä vielä.
|
||||
settings.title=Otsikko
|
||||
|
|
@ -1586,7 +1588,7 @@ settings.archive.header=Arkistoi tämä tietovarasto
|
|||
settings.archive.tagsettings_unavailable=Tagi-asetukset eivät ole käytettävissä arkistoiduissa tietovarastoissa.
|
||||
settings.lfs=LFS
|
||||
settings.lfs_filelist=Tähän tietovarastoon tallennetut LFS-tiedostot
|
||||
settings.lfs_no_lfs_files=LFS-tiedostoja ei ole tallennettu tähän tietovarastoon.
|
||||
settings.lfs_no_lfs_files=Tähän tietovarastoon ei ole tallennettu LFS-tiedostoja
|
||||
settings.lfs_findcommits=Etsi kommitteja
|
||||
settings.lfs_lfs_file_no_commits=Tälle LFS-tiedostolle ei löytynyt kommitteja
|
||||
settings.lfs_noattribute=Tällä polulla ei ole lukittavaa attribuuttia oletushaarassa
|
||||
|
|
@ -2148,7 +2150,7 @@ issues.add_label = lisäsi nimilapun %s %s
|
|||
issues.due_date_added = lisäsi eräpäivän %s %s
|
||||
issues.review.add_review_request = pyysi katselmointia käyttäjältä %[1]s %[2]s
|
||||
issues.ref_pull_from = `<a href="%[2]s">viittasi tähän vetopyyntöön %[3]s</a> %[1]s`
|
||||
pulls.commit_ref_at = `viittasi tähän vetopyyntöön kommitista %s`
|
||||
pulls.commit_ref_at = `viittasi tähän vetopyyntöön sitoumuksesta %s`
|
||||
issues.review.comment = katselmoi %s
|
||||
issues.add_labels = lisäsi nimilaput %s %s
|
||||
issues.review.add_review_requests = pyysi katselmointeja käyttäjiltä %[1]s %[2]s
|
||||
|
|
@ -2329,9 +2331,9 @@ wiki.page_name_desc = Kirjoita tämän wikisivun nimi. Joitain erikoisnimiä ova
|
|||
pulls.blocked_by_changed_protected_files_1 = Tämä vetopyyntö sisältää suojatun tiedoston ja on siksi estetty:
|
||||
pulls.status_checks_warning = Jotkin tarkistukset raportoivat varoituksia
|
||||
pulls.status_checks_error = Jotkin tarkistukset raportoivat virheitä
|
||||
pulls.reopened_at = `avasi uudelleen tämän vetopyynnön %s`
|
||||
pulls.reopened_at = `avasi tämän vetopyynnön uudelleen %s`
|
||||
pulls.auto_merge_when_succeed = Yhdistä automaatisesti kun kaikki tarkistukset onnistuvat
|
||||
signing.wont_sign.error = Tapahtui virhe tarkistaessa voiko kommitin allekirjoittaa.
|
||||
signing.wont_sign.error = Tapahtui virhe tarkistettaessa, voiko sitoumus allekirjoittaa.
|
||||
signing.wont_sign.twofa = Sinulla tulee olla kaksivaiheinen todennus käytössä, jotta kommitit voi allekirjoittaa.
|
||||
pulls.data_broken = Tämä vetopyyntö on rikki johtuen puuttuvasta forkkitiedosta.
|
||||
pulls.files_conflicted = Tämä vetopyyntö sisältää muutoksia, jotka ovat ristiriidassa kohdehaaran kanssa.
|
||||
|
|
@ -2545,6 +2547,21 @@ settings.protected_branch_required_rule_name = Vaadittu säännön nimi
|
|||
|
||||
|
||||
|
||||
issues.pin_comment = kiinnitti tämän %s
|
||||
issues.unpin_comment = poist tämän kiinnityksen %s
|
||||
issues.review.content.empty = Sinun täytyy jättää kommentti, joka kuvaa pyydettyjä muutoksia.
|
||||
comment.blocked_by_user = Kommentointi ei ole mahdollista, koska tietovaraston omistaja tai tekijä on estänyt sinut.
|
||||
pulls.nothing_to_compare_have_tag = Valitut haarat/tagit ovat yhtäläiset.
|
||||
|
||||
ambiguous_runes_header = `Tämä tiedosto sisältää tulkinnanvaraisia Unicode-merkkejä`
|
||||
ambiguous_runes_line = `Tällä rivillä on tulkinnanvaraisia Unicode-merkkejä`
|
||||
ambiguous_character = `%[1]c [U+%04[1]X] on mahdollista sekoittaa merkkiin %[2]c [U+%04[2]X]`
|
||||
commitstatus.failure = Epäonnistui
|
||||
commitstatus.success = Onnistui
|
||||
projects.deletion_desc = Projektin poistaminen poistaa sen kaikilta siihen liittyviltä ongelmilta. Jatketaanko?
|
||||
issues.lock.unknown_reason = Ongelmaa ei voi lukita tuntemattomalla syyllä.
|
||||
issues.unlock_error = Ongelmaa, jota ei ole lukittu, ei voi avata lukituksesta.
|
||||
|
||||
[graphs]
|
||||
component_loading_info = Tämä saattaa kestää hetken…
|
||||
component_failed_to_load = Odottamaton virhe.
|
||||
|
|
@ -3051,7 +3068,7 @@ auths.attribute_username_placeholder = Jätä tyhjäksi käyttääksesi Forgejo:
|
|||
auths.oauth2_authURL = Valtuutuksen URL-osoite
|
||||
auths.new_success = Todennus "%s" on lisätty.
|
||||
users.still_own_repo = Tämä käyttäjä omistaa yhden tai useamman tietovaraston. Poista tai siirrä nämä tietovarastot ensin.
|
||||
dashboard.cleanup_hook_task_table = Siivoa hook_task-taulu
|
||||
dashboard.cleanup_hook_task_table = Siivoa koukku -_tehtävätaulukko
|
||||
dashboard.delete_old_actions = Poista kaikki vanhat aktiviteetit tietokannasta
|
||||
auths.attribute_mail = Sähköpostiosoitteen attribuutti
|
||||
auths.attribute_ssh_public_key = Julkisen SSH-avaimen attribuutti
|
||||
|
|
@ -3119,7 +3136,7 @@ dashboard.resync_all_sshprincipals = Päivitä ".ssh/authorized_principals"-tied
|
|||
create_repo=loi tietovaraston <a href="%s">%s</a>
|
||||
rename_repo=asetti tietovaraston <code>%[1]s</code> uudeksi nimeksi <a href="%[2]s">%[3]s</a>
|
||||
transfer_repo=siirsi tietovaraston <code>%s</code> käyttäjälle <a href="%s">%s</a>
|
||||
push_tag=työnsi tagin <a href="%[2]s">%[3]s</a> kohteeseen <a href="%[1]s">%[4]s</a>
|
||||
push_tag=työnsi tagin <a href="%[2]s">%[3]s</a> tietovarastoon <a href="%[1]s">%[4]s</a>
|
||||
delete_tag=poisti tagin %[2]s kohteesta <a href="%[1]s">%[3]s</a>
|
||||
compare_commits_general=Vertaa kommitteja
|
||||
create_branch=loi haaran <a href="%[2]s">%[3]s</a> tietovarastossa <a href="%[1]s">%[4]s</a>
|
||||
|
|
@ -3143,6 +3160,8 @@ approve_pull_request = `hyväksyi <a href="%[1]s">%[3]s#%[2]s</a>`
|
|||
starred_repo = lisäsi tähden tietovarastolle <a href="%[1]s">%[2]s</a>
|
||||
reject_pull_request = `ehdotti muutoksia kohteeseen <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||
|
||||
publish_release = `julkaisi <a href="%[2]s">%[4]s</a> tietovarastossa <a href="%[1]s">%[3]s</a>`
|
||||
|
||||
[tool]
|
||||
now=nyt
|
||||
1s=1 sekunti
|
||||
|
|
@ -3233,7 +3252,7 @@ helm.install = Asenna paketti komennolla:
|
|||
owner.settings.chef.keypair = Luo avainpari
|
||||
settings.delete.error = Paketin poistaminen epäonnistui.
|
||||
requirements = Vaatimukset
|
||||
published_by_in = Julkaistu %[1]s, julkaisija <a href="%[2]s">%[3]s</a> projektissa <a href="%[4]s"><strong>%[5]s</strong></a>
|
||||
published_by_in = Julkaistu %[1]s, julkaisija <a href="%[2]s">%[3]s</a> tietovarastossa <a href="%[4]s"><strong>%[5]s</strong></a>
|
||||
pypi.requires = Vaatii Pythonin
|
||||
alpine.install = Asenna paketti seuraavalla komennolla:
|
||||
debian.repository.components = Komponentit
|
||||
|
|
@ -3356,6 +3375,8 @@ conda.registry = Määritä tämä rekisteri Conda-tietovarastoksi <code>.condar
|
|||
container.labels = Nimilaput
|
||||
settings.link.description = Jos linkität paketin tietovarastoon, paketti listataan tietovaraston pakettilistalla.
|
||||
|
||||
assets = Resurssit
|
||||
|
||||
[secrets]
|
||||
creation.failed = Salaisuuden lisääminen epäonnistui.
|
||||
deletion = Poista salaisuus
|
||||
|
|
@ -3523,4 +3544,4 @@ wiki.write = <b>Kirjoita:</b> Luo, päivitä ja poista integroidun wikin sivuja.
|
|||
filepreview.truncated = Esikatselu on typistetty
|
||||
|
||||
[translation_meta]
|
||||
test = This is a test string. It is not displayed in Forgejo UI but is used for testing purposes. Feel free to enter "ok" to save time (or a fun fact of your choice) to hit that sweet 100% completion mark :) :) :)
|
||||
test = Tämä on testimerkkijono. Sitä ei näytetä Forgejo-käyttöliittymässä, mutta sitä käytetään testaustarkoituksiin. Voit vapaasti kirjoittaa "selvä" säästääksesi aikaa (tai käyttää hauskaa faktaa) ja saavuttaaksesi sen makean 100 %:n valmistumisrajan :)
|
||||
|
|
@ -3916,4 +3916,4 @@ issues.write = <b>Écrire :</b> Fermer des tickets et gérer les métadonnées t
|
|||
pulls.read = <b>Lire :</b> Lire et créer des demandes de tirage.
|
||||
|
||||
[translation_meta]
|
||||
test = Ceci est une chaîne de test. Elle n'est pas affichée dans Forgejo même mais est utilisée à des fins de test. N'hésitez pas à entrer 'ok' pour gagner du temps (ou un fait amusant de votre choix) pour atteindre ce difficile 100 % de complétion. :-)
|
||||
test = Ceci est une chaîne de test. Elle n'est pas affichée dans Forgejo même mais est utilisée à des fins de test. N'hésitez pas à entrer 'ok' pour gagner du temps (ou un fait amusant de votre choix) pour atteindre ce difficile 100 % de complétion. :-
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ logo = Logo
|
|||
sign_in = Iniciar sesión
|
||||
sign_in_with_provider = Iniciar Sesión con %s
|
||||
sign_in_or = ou
|
||||
sign_out = Pechar Sesión
|
||||
sign_out = Pechar sesión
|
||||
sign_up = Rexistrarse
|
||||
link_account = Vincular conta
|
||||
register = Rexistro
|
||||
|
|
@ -44,7 +44,7 @@ repository = Repositorio
|
|||
organization = Organización
|
||||
mirror = Espello
|
||||
new_mirror = Novo Espello
|
||||
new_fork = Nova Bifurcación do Repositorio
|
||||
new_fork = Nova bifurcación do repositorio
|
||||
new_project = Novo proxecto
|
||||
new_project_column = Nova columna
|
||||
admin_panel = Administración da páxina
|
||||
|
|
|
|||
|
|
@ -139,6 +139,10 @@ confirm_delete_artifact = למחוק את הארטיפקט "%s"?
|
|||
toggle_menu = הצגת\הסתרת תפריט
|
||||
re_type = סיסמה (שוב)
|
||||
|
||||
tracked_time_summary = סיכום זמן מעקב בהתבסס על מסננים של רשימת סוגיות
|
||||
webauthn_use_twofa = השתמש בקוד אימות דו־שלבי מהטלפון שלך
|
||||
error413 = מיצית את ההגבלה שלך.
|
||||
|
||||
[search]
|
||||
search = חיפוש...
|
||||
type_tooltip = סוג חיפוש
|
||||
|
|
@ -466,7 +470,7 @@ uploaded_avatar_not_a_image = הקובץ שהועלה לא תמונה.
|
|||
|
||||
[repo]
|
||||
new_advanced = הגדרות מתקדמות
|
||||
new_advanced_expand =
|
||||
new_advanced_expand =
|
||||
owner = בעלים
|
||||
repo_name = שם הקרפיף
|
||||
repo_name_helper = שמות קרפיפים טובים הם זכירים, קצרים וייחודיים.
|
||||
|
|
|
|||
|
|
@ -224,4 +224,99 @@ confirm_password = पासवर्ड पक्का करें
|
|||
admin_email = ईमेल एड्रेस
|
||||
config_location_hint = ये सञ्चालन के तरीके यहाँ सेव होंगे :
|
||||
install_btn_confirm = इनस्टॉल फॉरगेजो
|
||||
test_git_failed = git कमांड टेस्ट नहीं हुई: %v
|
||||
test_git_failed = git कमांड टेस्ट नहीं हुई: %v
|
||||
sqlite3_not_available = इस फॉरगेजो के वर्शन में SQLite३ नहीं है। कृपया डाउनलोड करें बाइनरी वर्शन यहाँ से %s (“gobuild” वर्शन नहीं करें)।
|
||||
invalid_db_setting = ये डेटाबेस सेटिंग्स मान्य नहीं हैं %v
|
||||
invalid_db_table = डेटाबेस टेबल “%s” मान्य नहीं: %v
|
||||
invalid_repo_path = इस रिपॉजिटरी की मूल पथ मान्य नहीं है: %v
|
||||
invalid_app_data_path = एप्प की डाटा पथ अमान्य है: %v
|
||||
run_user_not_match = “यूजर को ऐसे चलाएं” उसरनाम अभी का उसरनाम नहीं है: %s -> %s
|
||||
internal_token_failed = अंदरूनी टोकन बना नहीं पाए: %v
|
||||
secret_key_failed = गुप्त चाभी बना नहीं पाए: %v
|
||||
save_config_failed = संरूपण को सेव नहीं कर पाए: %v
|
||||
enable_update_checker_helper_forgejo = ये समय-समय पर चेक करेगा फॉरगेजो वर्शन नया है की नहीं TXT DNS रिकॉर्ड से यहाँ release.forgejo.org।
|
||||
invalid_admin_setting = प्रशासक अकाउंट सेटिंग अमान्य है: %v
|
||||
invalid_log_root_path = लॉग का रास्ता अमान्य है: %v
|
||||
no_reply_address = गुप्त ईमेल डोमेन
|
||||
no_reply_address_helper = डोमेन का नाम उसेर्स के गुप्त ईमेल पते से हैं। जैसे की, जब यूजर “जोई” लॉग करेगा Git पे “जोई@noreply.example.org” अगर गुप्त ईमेल पता पड़ा है “noreply.example.org”।
|
||||
password_algorithm = पासवर्ड का हैश कलन विधि (algorithm)
|
||||
invalid_password_algorithm = अमान्य पासवर्ड का हैश कलन विधि (algorithm)
|
||||
password_algorithm_helper = पासवर्ड हैश अल्गोरिथम सेट करें। अल्गोरिथ्म्स की अलग-अलग ज़रूरतें और मज़बूतियाँ हैं। आर्गन2 अल्गोरिथम मज़बूत है पर मेमोरी ज़्यादा लेता है और छोटे सिस्टम्स के लिए सही नहीं होता।
|
||||
enable_update_checker = अपडेट चेकर चालू करें
|
||||
env_config_keys = पर्यावरण संरूपण
|
||||
env_config_keys_prompt = पर्यावरण वेरिएबल्स को संरूपण फाइल पर भी लागू किया जायेगा:
|
||||
|
||||
[home]
|
||||
uname_holder = उसरनाम या ईमेल एड्रेस
|
||||
switch_dashboard_context = डैशबोर्ड का सन्दर्भ बदलें
|
||||
my_repos = रेपोसिटोरिएस
|
||||
my_orgs = संस्थाएं
|
||||
view_home = व्यू: %s
|
||||
filter = बाकी फिल्टर्स
|
||||
filter_by_team_repositories = फ़िल्टर करें टीम रेपोसिट्रीज़ से
|
||||
feed_of = फीड इसकी "%s"
|
||||
show_archived = संग्रहीत
|
||||
show_both_archived_unarchived = संग्रहीत और असंग्रहीत देखिए
|
||||
show_only_archived = सिर्फ संग्रहीत देखिए
|
||||
show_only_unarchived = सिर्फ असंग्रहीत देखिए
|
||||
show_private = निजी
|
||||
show_both_private_public = निजी और सार्वजनिक देखिए
|
||||
show_only_private = सिर्फ निजी देखिए
|
||||
show_only_public = सिर्फ सार्वजनिक देखिए
|
||||
issues.in_your_repos = आपकी रेपोसिटोरिस में
|
||||
|
||||
[explore]
|
||||
repos = रेपोसिटोरिस
|
||||
users = उसेर्स
|
||||
stars_one = %d सितारा
|
||||
stars_few = %d सितारे
|
||||
forks_one = %d फोर्क
|
||||
forks_few = %d फोर्कस
|
||||
organizations = संस्थाएं
|
||||
go_to = जाएं इधर
|
||||
code = कोड
|
||||
code_last_indexed_at = आखरी संस्थापित %s
|
||||
relevant_repositories_tooltip = रेपोसिटोरिस जो की फोर्क्स या जिनका शीर्षक नहीं है, आइकॉन नहीं और विश्लेषण नहीं गुप्त हैं।
|
||||
relevant_repositories = सिर्फ इस काम की रेपोस्टिरिस दिखाई जा रहीं हैं. <a href="%s">बिना फ़िल्टर के रिजल्ट दिखाएं</a>।
|
||||
|
||||
[auth]
|
||||
create_new_account = अकाउंट रजिस्टर करें
|
||||
disable_register_prompt = रजिस्ट्रेशन खुला नहीं। कृपया साइट प्रशासक से बात करें।
|
||||
disable_register_mail = ईमेल से रजिस्ट्रेशन पक्का करना बंद हैं अभी।
|
||||
manual_activation_only = अपने साइट प्रशासक बात करें एक्टिवेशन पूरा करने के लिए।
|
||||
remember_me = इस डिवाइस को याद रखें
|
||||
forgot_password_title = पासवर्ड भूल गए
|
||||
forgot_password = पासवर्ड भूल गए?
|
||||
hint_login = पहले से अकाउंट है? <a href="%s">अभी सिग्न इन करें!</a>
|
||||
hint_register = अकाउंट चाहिए? <a href="%s">रजिस्टर करें</a>
|
||||
sign_up_button = अभी रजिस्टर करें।
|
||||
sign_up_successful = अकाउंट बन गया है। स्वागत!
|
||||
back_to_sign_in = sign in में फिर से जाएं
|
||||
sign_in_openid = OpenID के साथ आगे बढ़ें
|
||||
|
||||
[mail]
|
||||
link_not_working_do_paste = क्या कड़ी चल नहीं पाई? उसे कॉपी करके URL बार में जोड़ें।
|
||||
hi_user_x = नमस्ते <b>%s</b>,
|
||||
activate_account = कृपया अपना खाता चालू करें
|
||||
activate_account.text_1 = नमस्ते <b>%[1]s</b>, संपादित करने के लिए शुक्रिया यहां %[2]s!
|
||||
activate_account.text_2 = कृपया यहां की कड़ी को क्लिक करें अपने अकाउंट को चालू करने के लिए <b>%s</b>:
|
||||
activate_email = अपना ईमेल एड्रेस पुख्ता करें
|
||||
activate_email.text = कृपया इस कड़ी को क्लिक करें अपना अकाउंट पुख्ता करने के लिए <b>%s</b>:
|
||||
admin.new_user.subject = नया यूजर %s अभी sign up हुआ
|
||||
admin.new_user.user_info = यूजर की जानकारी
|
||||
admin.new_user.text = कृपया <a href="%s"> क्लिक करें यहाँ </a> अपने यूजर को प्रशासक पैनल से चलाने के लिए।
|
||||
register_notify = स्वागत है %s
|
||||
register_notify.text_1 = ये आपका रजिस्टर्ड ईमेल पुख्ता करने के लिए है %s!
|
||||
register_notify.text_2 = आप अपने अकाउंट में हस्ताक्षर कर सकते हैं इस उसर-नाम के साथ: %s
|
||||
register_notify.text_3 = अगर किसी और ने आपका अकाउंट बनाया है, तो आपको चाहिए <a href="%s"> पासवर्ड संरक्षित करें </a> पहले।
|
||||
reset_password = अपना अकाउंट निकाल पाएं
|
||||
reset_password.text = अगर ये आप थे, कृपया इस कड़ी को क्लिक करें अपने अकाउंट को फिर से चालू करने को <b>%s</b>:
|
||||
password_change.subject = आपका पासवर्ड बदला गया
|
||||
password_change.text_1 = आपके अकाउंट का पासवर्ड बदला गया है।
|
||||
primary_mail_change.subject = आपका प्राथमिक ईमेल बदला गया है
|
||||
primary_mail_change.text_1 = आपका प्राथमिक ईमेल बदला गया है इससे %[1]s. यानी इस ईमेल एड्रेस से आप ईमेल अधिसूचना प्राप्त नहीं कर पाएंगे।
|
||||
totp_disabled.subject = टीओटीपी रोक दिया गया
|
||||
totp_disabled.text_1 = समय निर्धारित एक बार के पासवर्ड (टीओटीपी) आपके अकाउंट पर रोक दिया गया।
|
||||
totp_disabled.no_2fa = और कोई 2FA के तरीके संचालित नहीं हैं, यानी आपके अकाउंट पर 2FA से लॉगिन की ज़रुरत नहीं होगी।
|
||||
removed_security_key.subject = सुरक्षक चाभी हटाई गई
|
||||
removed_security_key.text_1 = सुरक्षक चाभी "%[1]s" अभी-अभी आपके अकाउंट से हटाई गई।
|
||||
|
|
@ -7,7 +7,7 @@ sign_in=Masuk
|
|||
sign_in_or=atau
|
||||
sign_out=Keluar
|
||||
sign_up=Daftar
|
||||
link_account=Tautan Akun
|
||||
link_account=Tautkan Akun
|
||||
register=Daftar
|
||||
version=Versi
|
||||
powered_by=Diberdayakan oleh %s
|
||||
|
|
@ -133,6 +133,10 @@ filter.not_archived = Tidak Diarsipkan
|
|||
filter.public = Publik
|
||||
filter.private = Pribadi
|
||||
|
||||
logo = Logo
|
||||
sign_in_with_provider = Masuk menggunakan %s
|
||||
active_stopwatch = Pelacak Waktu Aktif
|
||||
|
||||
[aria]
|
||||
navbar = Bar Navigasi
|
||||
footer = Footer
|
||||
|
|
|
|||
7
options/locale/locale_isv.ini
Normal file
7
options/locale/locale_isv.ini
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
[common]
|
||||
home = Dom
|
||||
dashboard = Tablo
|
||||
explore = Razvědati
|
||||
help = Pomoč
|
||||
logo = Logo
|
||||
sign_in = Vhoditi
|
||||
|
|
@ -786,7 +786,7 @@ add_key=Aggiungi chiave
|
|||
ssh_desc=Queste chiavi SSH pubbliche sono associate al tuo profilo. Le corrispondenti chiavi private consentono l'accesso completo ai tuoi progetti. Le chiavi SSH che sono state verificate possono essere usate per verificare commit Git firmati tramite SSH.
|
||||
principal_desc=Queste entità di certificato SSH sono associate al tuo profilo e forniscono l'accesso completo ai tuoi repositori.
|
||||
gpg_desc=Queste chiavi GPG pubbliche sono associate con il tuo profilo e sono usate per verificare i tuoi commit. Proteggi le tue chiavi private perché permettono di firmare i commit con la tua identità.
|
||||
ssh_helper=<strong> Hai bisogno di aiuto?</strong> Dài un'occhiata alla guida per<a href="%s">creare le tue chiavi SSH </a> o risolvere quei <a href="%s"> problemi comuni </a> in cui potresti imbatterti utilizzando SSH.
|
||||
ssh_helper=<strong> Hai bisogno di aiuto?</strong> Dai un'occhiata alla guida per <a href="%s">creare le tue chiavi SSH </a> o risolvere quei <a href="%s"> problemi comuni </a> in cui potresti imbatterti utilizzando SSH.
|
||||
gpg_helper=<strong>Hai bisogno di aiuto?</strong> Dai un'occhiata alla guida di GitHub <a href="%s">riguardo il GPG</a>.
|
||||
key_content_ssh_placeholder=Inizia con "ssh-ed25519", "ssh-rsa", "ecdsa-sha2-nistp256", "ecdsa-sha2-nistp384", "ecdsa-sha2-nistp521", "sk-ecdsa-sha2-nistp256@openssh.com", o "sk-ssh-ed25519@openssh.com"
|
||||
key_content_gpg_placeholder=Inizia con "-----BEGIN PGP PUBLIC KEY BLOCK-----"
|
||||
|
|
@ -948,12 +948,12 @@ profile_desc = Su di te
|
|||
email_desc = Il tuo indirizzo email principale sarà usato per inviarti notifiche, ripristino di password e, se non è stato nascosto, per le operazioni Git effettuate da web.
|
||||
add_email_confirmation_sent = Una email di conferma è stata inviata a "%s". Verifica la posta in arrivo entro %s per confermare il tuo indirizzo email.
|
||||
hidden_comment_types_description = I tipi di commenti spuntati qui non saranno mostrati nelle pagine delle segnalazioni. Per esempio, spuntare "Etichetta" rimuove tutti i commenti "<utente> ha aggiunto/rimosso <etichetta>".
|
||||
hidden_comment_types.ref_tooltip = Commenti in cui questa issue è stata citata da un altra issue/commit/…
|
||||
hidden_comment_types.ref_tooltip = Commenti in cui questa segnalazione è stata citata da un'altra segnalazione/commit/…
|
||||
verify_ssh_key_success = La chiave SSH "%s" è stata verificata.
|
||||
valid_until_date = Valido fino a %s
|
||||
ssh_signonly = SSH è attualmente disabilitato quindi queste chiavi sono usate solo per la firma di verifica dei commit.
|
||||
permission_write = Leggi e scrivi
|
||||
access_token_desc = I permessi token selezionati limitano l'autorizzazione solo alle corrispondenti vie <a href="%[1]s" target="_blank">API</a>. Leggi la <a href="%[2]s" target="_blank">documentazione</a> per ulteriori informazioni.
|
||||
access_token_desc = I permessi token selezionati limitano l'autorizzazione solo alle rotte <a href="%[1]s" target="_blank">API</a> corrispondenti. Leggi la <a href="%[2]s" target="_blank">documentazione</a> per ulteriori informazioni.
|
||||
create_oauth2_application_success = Hai correttamente creato una nuova applicazione OAuth2.
|
||||
update_oauth2_application_success = Hai correttamente aggiornato l'applicazione OAuth2.
|
||||
oauth2_redirect_uris = URI per la reindirizzazione. Usa una nuova riga per ogni URI.
|
||||
|
|
@ -981,7 +981,7 @@ oauth2_client_secret_hint = Il segreto non verrà mostrato nuovamente dopo che l
|
|||
oauth2_application_remove_description = Rimuovere un'applicazione OAuth2 le impedirà di accedere a profili utenti autorizzati su questa istanza. Continuare?
|
||||
oauth2_application_locked = Forgejo preregistra alcune applicazioni OAuth2 all'avvio, se abilitato nella configurazione. Per prevenire comportamenti imprevisti, queste non possono essere né modificate né rimosse. Fai riferimento alla documentazione di OAuth2 per ulteriori informazioni.
|
||||
hooks.desc = Aggiungi richiami HTTP che saranno innescati per <strong>tutti i progetti</strong> che possiedi.
|
||||
repos_none = Non possiedi alcun progetto.
|
||||
repos_none = Non possiedi alcun repositorio.
|
||||
blocked_users_none = Non ci sono utenti bloccati.
|
||||
keep_email_private_popup = Questo nasconderà il tuo indirizzo e-mail nel tuo profilo, nelle richieste di modifica e quando modifichi un file usando l'interfaccia web. I commit inoltrati non saranno modificati. Usa %s nei commit per associarli al tuo profilo.
|
||||
verify_gpg_key_success = La chiave GPG "%s" è stata verificata.
|
||||
|
|
@ -1147,7 +1147,7 @@ migrate_items_releases=Rilasci
|
|||
migrate_repo=Migra repositorio
|
||||
migrate.clone_address=Migra / Clona da URL
|
||||
migrate.clone_address_desc=URL HTTP(S) o Git "clone" di un repositorio esistente
|
||||
migrate.github_token_desc=È possibile mettere uno o più token con virgola separati qui per rendere la migrazione più veloce a causa del limite di velocità API GitHub. ATTENZIONE: L'abuso di questa funzione potrebbe violare la politica del fornitore di servizi e portare al blocco dell'account.
|
||||
migrate.github_token_desc=È possibile mettere uno o più token con virgola separati qui per rendere la migrazione più veloce a causa del limite di richieste alle API GitHub. ATTENZIONE: L'abuso di questa funzione potrebbe violare la politica del fornitore di servizi e portare al blocco dell'utenza.
|
||||
migrate.clone_local_path=o un percorso del server locale
|
||||
migrate.permission_denied=Non è consentito importare repositori locali.
|
||||
migrate.permission_denied_blocked=Non è possibile importare da host non consentiti, si prega di chiedere all'amministratore di controllare ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS impostazioni.
|
||||
|
|
@ -1698,9 +1698,9 @@ pulls.rebase_conflict_summary=Messaggio di errore
|
|||
pulls.unrelated_histories=Unione fallita: gli Head del ramo da unire e la base non condividono una storia cronologica in comune. Suggerimento: prova una strategia diversa
|
||||
pulls.merge_out_of_date=Unione fallita: Durante la generazione del merge, la base è stata aggiornata. Suggerimento: Riprova.
|
||||
pulls.head_out_of_date=Unione non riuscita: durante la generazione della fusione, la testa è stata aggiornata. Suggerimento: Riprova.
|
||||
pulls.push_rejected=Immissione respinta. Rivedi gli hooks Git per questo progetto.
|
||||
pulls.push_rejected=Immissione respinta. Rivedi gli hooks Git per questo repositorio.
|
||||
pulls.push_rejected_summary=Messaggio Di Rifiuto Completo
|
||||
pulls.push_rejected_no_message=Immissione respinta: nessun messaggio remoto. Controlla gli hooks di Git per questo progetto
|
||||
pulls.push_rejected_no_message=Immissione respinta: nessun messaggio remoto. Controlla gli hooks di Git per questo repositorio
|
||||
pulls.open_unmerged_pull_exists=`Non è possibile riaprire questa pull request perché ne esiste un'altra (#%d) con proprietà identiche.`
|
||||
pulls.status_checking=Alcuni controlli sono in sospeso
|
||||
pulls.status_checks_success=Tutti i controlli sono stati effettuati con successo
|
||||
|
|
@ -1959,14 +1959,14 @@ settings.wiki_delete_desc=L'eliminazione dei dati della wiki del repository è p
|
|||
settings.wiki_delete_notices_1=-Questa operazione eliminerà permanentemente e disabiliterà la wiki repository per %s.
|
||||
settings.confirm_wiki_delete=Elimina dati wiki
|
||||
settings.wiki_deletion_success=I dati della repository wiki sono stati eliminati.
|
||||
settings.delete=Elimina questo progetto
|
||||
settings.delete=Elimina questo repositorio
|
||||
settings.delete_desc=L'eliminazione di un repository è un'operazione permanente e non può essere annullata.
|
||||
settings.delete_notices_1=-Questa operazione <strong>NON PUÒ</strong> essere annullata.
|
||||
settings.delete_notices_2=-Questa operazione eliminerà definitivamente il repositorio <strong>%s</strong>, inclusi codice, segnalazioni commenti, dati della wiki e impostazioni collaboranti.
|
||||
settings.delete_notices_fork_1=-I fork di questo repository diventeranno indipendenti dopo la cancellazione.
|
||||
settings.deletion_success=Il repository è stato eliminato.
|
||||
settings.update_settings_success=Le impostazioni del repository sono state aggiornate.
|
||||
settings.confirm_delete=Elimina progetto
|
||||
settings.confirm_delete=Elimina repositorio
|
||||
settings.add_collaborator=Aggiungi collaborante
|
||||
settings.add_collaborator_success=Lə collaborante è statə aggiuntə.
|
||||
settings.add_collaborator_inactive_user=Non posso aggiungere un*utente inattivə come collaborante.
|
||||
|
|
@ -2019,7 +2019,7 @@ settings.event_desc=Innesco su:
|
|||
settings.event_push_only=Immetti eventi
|
||||
settings.event_send_everything=Tutti gli eventi
|
||||
settings.event_choose=Eventi personalizzati…
|
||||
settings.event_header_repository=Eventi del progetto
|
||||
settings.event_header_repository=Eventi del repositorio
|
||||
settings.event_create=Crea
|
||||
settings.event_create_desc=Ramo o tag creato.
|
||||
settings.event_delete=Elimina
|
||||
|
|
@ -2094,7 +2094,7 @@ settings.packagist_api_token=API token
|
|||
settings.packagist_package_url=Url pacchetto pacchetti
|
||||
settings.deploy_keys=Chiavi di distribuzione
|
||||
settings.add_deploy_key=Aggiungi chiave di distribuzione
|
||||
settings.deploy_key_desc=Le deploy key possiedono l'accesso solamente alla lettura di un repository.
|
||||
settings.deploy_key_desc=Le chiavi di distribuzione possono avere l'accesso in sola lettura o in lettura e scrittura al repositorio.
|
||||
settings.is_writable=Abilita accesso scrittura
|
||||
settings.is_writable_info=Permetti a questa deploy key di <strong>pushare</strong> nella repository.
|
||||
settings.no_deploy_keys=Non sono ancora presenti deploy key.
|
||||
|
|
@ -2162,8 +2162,8 @@ settings.chat_id=ID chat
|
|||
settings.matrix.homeserver_url=URL Homeserver
|
||||
settings.matrix.room_id=ID della stanza
|
||||
settings.matrix.message_type=Tipo di messaggio
|
||||
settings.archive.button=Archivia progetto
|
||||
settings.archive.header=Archivia questo progetto
|
||||
settings.archive.button=Archivia repositorio
|
||||
settings.archive.header=Archivia questo repositorio
|
||||
settings.archive.success=Il repo è stato archiviato con successo.
|
||||
settings.archive.error=Si è verificato un errore durante il tentativo di archiviare il repo. Vedi il log per maggiori dettagli.
|
||||
settings.archive.error_ismirror=Non puoi archiviare un mirror repo.
|
||||
|
|
@ -2257,9 +2257,9 @@ releases.desc=Tenere traccia di versioni e download del progetto.
|
|||
release.releases=Rilasci
|
||||
release.detail=Dettagli rilascio
|
||||
release.tags=Etichette
|
||||
release.new_release=Nuovo Rilascio
|
||||
release.new_release=Nuovo rilascio
|
||||
release.draft=Bozza
|
||||
release.prerelease=Pre-Rilascio
|
||||
release.prerelease=Pre-rilascio
|
||||
release.stable=Stabile
|
||||
release.compare=Confronta
|
||||
release.edit=modifica
|
||||
|
|
@ -2274,8 +2274,8 @@ release.tag_helper=Scegli un tag esistente o crea un nuovo tag.
|
|||
release.prerelease_desc=Contrassegna come pre-release
|
||||
release.prerelease_helper=Contrassegna questa release come inadatta per l'uso di produzione.
|
||||
release.cancel=Annulla
|
||||
release.publish=Pubblica Rilascio
|
||||
release.save_draft=Salva Bozza
|
||||
release.publish=Pubblica rilascio
|
||||
release.save_draft=Salva bozza
|
||||
release.edit_release=Aggiorna release
|
||||
release.delete_release=Elimina release
|
||||
release.delete_tag=Elimina tag
|
||||
|
|
@ -2412,10 +2412,10 @@ editor.new_branch_name = Dài un nome al nuovo ramo per questo commit
|
|||
editor.branch_already_exists = C'è gia un ramo "%s" nel repositorio.
|
||||
editor.directory_is_a_file = Il nome cartella "%s" è già usato come nome file in questo repositorio.
|
||||
editor.file_is_a_symlink = `"%s" è un collegamento simbolico. I collegamenti simbolici non possono essere modificati nell'editor web`
|
||||
editor.filename_is_a_directory = Il nome file "%s" è già usato come nome cartella in questo progetto.
|
||||
editor.file_editing_no_longer_exists = Il file in modifica, "%s", non esiste più in questo progetto.
|
||||
editor.file_deleting_no_longer_exists = Il file in eliminazione, "%s", non esiste più in questo progetto.
|
||||
editor.file_already_exists = Un file chiamato "%s" esiste già in questo progetto.
|
||||
editor.filename_is_a_directory = Il nome file "%s" è già usato come nome cartella in questo repositorio.
|
||||
editor.file_editing_no_longer_exists = Il file in modifica, "%s", non esiste più in questo repositorio.
|
||||
editor.file_deleting_no_longer_exists = Il file in eliminazione, "%s", non esiste più in questo repositorio.
|
||||
editor.file_already_exists = Un file chiamato "%s" esiste già in questo repositorio.
|
||||
editor.fail_to_update_file = Impossibile aggiornare/creare il file "%s".
|
||||
editor.upload_file_is_locked = Il file "%s" è bloccato da %s.
|
||||
editor.cannot_commit_to_protected_branch = Non si possono fare commit sul ramo protetto "%s".
|
||||
|
|
@ -2462,8 +2462,8 @@ activity.navbar.pulse = Battito
|
|||
activity.navbar.code_frequency = Frequenza del codice
|
||||
activity.navbar.recent_commits = Commit recenti
|
||||
contributors.contribution_type.filter_label = Tipi di contributo:
|
||||
settings.mirror_settings.docs.disabled_push_mirror.instructions = Imposta il tuo progetto in modo che prelevi commit, etichette e rami da un'altra repo.
|
||||
settings.mirror_settings.docs.no_new_mirrors = Il tuo progetto sta specchiando i cambiamenti a/da un altro progetto. Tieni a mente che non puoi creare nuovi specchi al momento.
|
||||
settings.mirror_settings.docs.disabled_push_mirror.instructions = Imposta il tuo progetto in modo che prelevi commit, etichette e rami da un'altro repositorio.
|
||||
settings.mirror_settings.docs.no_new_mirrors = Il tuo repositorio sta specchiando i cambiamenti a/da un altro repositorio. Tieni a mente che non puoi creare nuovi specchi al momento.
|
||||
settings.mirror_settings.docs.can_still_use = Nonostante tu non possa modificare specchi esistenti o crearne di nuovi puoi comunque il tuo specchio esistente.
|
||||
settings.mirror_settings.docs.pull_mirror_instructions = Per impostare uno specchio di prelievo consulta:
|
||||
settings.mirror_settings.docs.doc_link_title = Come specchio progetti?
|
||||
|
|
@ -2492,18 +2492,18 @@ branch.rename_branch_to = Rinomina "%s" come:
|
|||
branch.new_branch_from = Crea nuovo ramo da "%s"
|
||||
tag.create_tag_from = Crea nuova etichetta da "%s"
|
||||
tag.create_success = L'etichetta "%s" è stata creata.
|
||||
settings.unarchive.button = Disarchivia progetto
|
||||
settings.unarchive.button = Disarchivia repositorio
|
||||
release.tags_for = Etichette per %s
|
||||
branch.delete = Elimina ramo "%s"
|
||||
issues.role.first_time_contributor_helper = Questa non è il primo contributo di questo utente al progetto.
|
||||
issues.role.contributor_helper = Questo utente ha precedentemente fatto commit al progetto.
|
||||
issues.role.first_time_contributor_helper = Questo non è il primo contributo di questo utente al repositorio.
|
||||
issues.role.contributor_helper = Questo utente ha precedentemente fatto commit in questo repositorio.
|
||||
pulls.blocked_by_official_review_requests = Questa richiesta di modifica è bloccata perché manca l'approvazione di unə o più revisorɜ ufficiali.
|
||||
pulls.blocked_by_changed_protected_files_1 = Questa richiesta di modifica è bloccata perché tocca un file protetto:
|
||||
pulls.blocked_by_changed_protected_files_n = Questa richiesta di modifica è bloccata perché tocca file protetti:
|
||||
pulls.has_merged = Errore: la richiesta di modifica è stata fusa, non puoi fonderla di nuovo o cambiarne il ramo di destinazione.
|
||||
milestones.filter_sort.latest_due_date = Scadenza più lontana
|
||||
settings.mirror_settings.docs = Imposta il tuo repo in modo che sincronizzi automaticamente commit, tag e rami con un altro repo.
|
||||
settings.mirror_settings.docs.disabled_pull_mirror.instructions = Imposta il tuo progetto in modo che immetta commit, etichette e rami in un altro progetto automaticamente. Gli specchi di prelievo sono stati disabilitati dall'amministratore del sito.
|
||||
settings.mirror_settings.docs.disabled_pull_mirror.instructions = Imposta il tuo progetto in modo che immetta commit, etichette e rami in un altro repositorio automaticamente. Gli specchi di prelievo sono stati disabilitati dall'amministratore del sito.
|
||||
settings.mirror_settings.docs.disabled_push_mirror.info = Gli specchi di immissione sono stati disabilitati dall'amministratore del sito.
|
||||
settings.mirror_settings.docs.more_information_if_disabled = Puoi scoprire di più riguardo specchi di prelievo e di immissione qui:
|
||||
commits.view_path = Vista a questo punto nella cronologia
|
||||
|
|
@ -2511,7 +2511,7 @@ issues.action_check_all = Seleziona/deseleziona tutti gli elementi
|
|||
issues.num_comments_1 = %d commento
|
||||
issues.no_content = Descrizione non fornita.
|
||||
issues.unpin_issue = Sblocca segnalazione
|
||||
new_repo_helper = Un repositorio contiene tutti i file, inclusa la cronologia delle revisioni. Ne hai già uno altrove? <a href="%s">Migra il progetto</a>.
|
||||
new_repo_helper = Un repositorio contiene tutti i file, inclusa la cronologia delle revisioni. Ne hai già uno altrove? <a href="%s">Migra il repositorio</a>.
|
||||
projects.card_type.images_and_text = Immagini e testo
|
||||
object_format_helper = Formato oggetti del repositorio. Non può essere cambiato in seguito. SHA1 è il più compatibile.
|
||||
editor.file_delete_success = Il file "%s" è stato eliminato.
|
||||
|
|
@ -2521,7 +2521,7 @@ commits.renamed_from = Rinomina da %s
|
|||
invisible_runes_description = `Questo file contiene caratteri Unicode invisibili che sono indistinguibili agli umani ma potrebbero essere processati diversamente da un computer. Se pensi che questo sia intenzionale puoi tranquillamente ignorare questo avviso. Usa il tasto Escape per rivelarli.`
|
||||
issues.filter_type.reviewed_by_you = Revisionati da te
|
||||
projects.edit_success = Il progetto "%s" è stato aggiornato.
|
||||
issues.role.collaborator_helper = Quest*utente è statə invitatə a collaborare al progetto.
|
||||
issues.role.collaborator_helper = Quest*utente è statə invitatə a collaborare al repositorio.
|
||||
pulls.commit_ref_at = `ha fatto riferimento a questa richiesta di modifica da un commit %s`
|
||||
settings.thread_id = ID della discussione
|
||||
release.title = Titolo del rilascio
|
||||
|
|
@ -2544,7 +2544,7 @@ issues.choose.ignore_invalid_templates = I modelli non validi sono stati ignorat
|
|||
issues.choose.invalid_templates = trovati %v modello/i non valido/i
|
||||
issues.choose.invalid_config = La configurazione della segnalazione contiene errori:
|
||||
issues.label_templates.fail_to_load_file = Impossibile caricare file di modello etichetta "%s": %v
|
||||
issues.role.member_helper = questo utente è un membro dell'organizzazione che possiede questo progetto.
|
||||
issues.role.member_helper = Questo utente è un membro dell'organizzazione che possiede questo repositorio.
|
||||
issues.review.pending.tooltip = Questo commento non è attualmente visibile ad altri utenti. Per inviare il tuo commento in attesa selezione "%s" -> "%s/%s/%s" in cima alla pagina.
|
||||
pulls.blocked_by_approvals = Questa richiesta di modifica non ha ancora un numero di approvazioni sufficienti. %d di %d approvazioni concesse.
|
||||
pulls.blocked_by_rejection = Un revisore ufficiale ha richiesto dei cambiamenti su questa richiesta di modifica.
|
||||
|
|
@ -2563,14 +2563,14 @@ settings.mirror_settings.push_mirror.edit_sync_time = Modifica intervallo di sin
|
|||
settings.units.units = Sezioni del repositorio
|
||||
settings.units.add_more = Aggiungi ancora...
|
||||
settings.wiki_globally_editable = Consenti a tutti di modificare la wiki
|
||||
settings.pull_mirror_sync_in_progress = Prelevando cambiamenti dal progetto remoto %s.
|
||||
settings.push_mirror_sync_in_progress = Immettendo cambiamenti al progetto remoto %s.
|
||||
settings.pull_mirror_sync_in_progress = Prelevando cambiamenti dal repositorio remoto %s.
|
||||
settings.push_mirror_sync_in_progress = Immettendo cambiamenti al repositorio remoto %s.
|
||||
settings.update_mirror_settings = Aggiorna impostazioni dello specchio
|
||||
settings.branches.switch_default_branch = Passa al ramo predefinito
|
||||
settings.branches.add_new_rule = Aggiungi una nuova regola
|
||||
settings.actions_desc = Abilita azioni del progetto
|
||||
settings.actions_desc = Abilita pipeline CI/CD integrate con Forgejo Actions
|
||||
settings.new_owner_blocked_doer = Il nuovo proprietario ti ha bloccato.
|
||||
settings.update_settings_no_unit = Ili progetto dovrebbe consentire almeno qualche tipo di interazione.
|
||||
settings.update_settings_no_unit = Il repositorio dovrebbe consentire almeno qualche tipo di interazione.
|
||||
settings.add_collaborator_owner = Non si può aggiungere unə proprietariə come collaborante.
|
||||
branch.delete_desc = L'eliminazione di un ramo è definitiva. Nonostante il ramo eliminato potrebbe continuare ad esistere per un breve periodo di tempo prima di essere realmente eliminato, l'eliminazione NON PUÒ essere annullata in molti casi. Continuare?
|
||||
editor.invalid_commit_mail = Email invalida per creare un commit.
|
||||
|
|
@ -2596,10 +2596,10 @@ branch.create_from = da "%s"
|
|||
branch.create_success = Il ramo "%s" è stato creato.
|
||||
branch.download = Scarica il ramo "%s"
|
||||
branch.rename = Rinomina il ramo "%s"
|
||||
issues.blocked_by_user = Non puoi creare una segnalazione su questo progetto perché sei bloccato dal proprietario.
|
||||
settings.archive.text = Archiviare il progetto lo renderà unicamente di sola lettura. Sarà nascosto nel pannello di controllo. Nessuno (neanche tu!) potrai fare nuovi commit, o aprire segnalazioni o richieste di modifica.
|
||||
settings.unarchive.header = Disarchivia questo progetto
|
||||
settings.archive.mirrors_unavailable = Gli specchi non sono disponibile se il progetto è archiviato.
|
||||
issues.blocked_by_user = Non puoi creare una segnalazione su questo repositorio perché sei bloccato dal proprietario.
|
||||
settings.archive.text = Archiviare il repositorio lo renderà unicamente di sola lettura. Sarà nascosto nel pannello di controllo. Nessuno (neanche tu!) potrà fare nuovi commit, o aprire segnalazioni o richieste di modifica.
|
||||
settings.unarchive.header = Disarchivia questo repositorio
|
||||
settings.archive.mirrors_unavailable = Gli specchi non sono disponibili se il repositorio è archiviato.
|
||||
issues.role.owner_helper = Questo utente è il proprietariə di questo progetto.
|
||||
issues.label_exclusive_warning = Ogni etichetta in conflitto in un ambito sarà rimossa durante la modifica di un'etichetta di una segnalazione o di una richiesta di modifica.
|
||||
pulls.show_changes_since_your_last_review = Mostra cambiamenti dalla tua ultima revisione
|
||||
|
|
@ -2609,9 +2609,9 @@ settings.pulls.default_allow_edits_from_maintainers = Consenti modifica dai manu
|
|||
settings.trust_model.committer.desc = Firme valide saranno etichettate "fidata" se corrispondo all'autore del commit, altrimenti saranno etichettate "non corrisponde". Questo costringe Forgejo ad esse l'autore dei commit firmati, con il vero autore etichettato con le sequenze Co-authored-by: e Co-commited-by: nel commit. La chiave predefinita di Forgejo deve corrispondere ad un utente nella base di dati.
|
||||
signing.wont_sign.pubkey = Il commit non verrà firmato perché non hai una chiave pubblica associata al tuo profilo.
|
||||
settings.releases_desc = Abilita rilasci nel repositorio
|
||||
settings.unarchive.text = Disarchiviare il progetto ripristinerà la sua abilità di ricevere commit e immissioni, oltre che nuove segnalazioni e richieste di modifica.
|
||||
settings.unarchive.success = Il progetto è stato disarchiviato correttamente.
|
||||
settings.unarchive.error = Si è verificato un errore durante la disarchiviazione del progetto. Vedi il log per ulteriori dettagli.
|
||||
settings.unarchive.text = Disarchiviare il repositorio ripristinerà la sua abilità di ricevere commit e immissioni, oltre che nuove segnalazioni e richieste di modifica.
|
||||
settings.unarchive.success = Il repositorio è stato disarchiviato correttamente.
|
||||
settings.unarchive.error = Si è verificato un errore durante la disarchiviazione del repositorio. Vedi il log per ulteriori dettagli.
|
||||
release.title_empty = Il titolo non può essere vuoto.
|
||||
release.releases_for = Rilasci per %s
|
||||
diff.comment.add_line_comment = Aggiungi riga commento
|
||||
|
|
@ -2620,7 +2620,7 @@ diff.hide_file_tree = Nascondi albero dei file
|
|||
tag.ahead.target = a %s da questa etichetta
|
||||
release.tag_helper_new = Nuovo tag. Questo tag sarà creato dalla destinazione.
|
||||
release.tag_helper_existing = Tag esistente.
|
||||
release.deletion_desc = La rimozione di un rilascio lo rimuove solo da Forgejo. Non influenza il tag Git, i contenuti del tuo progetto o la sua cronologia. Continuare?
|
||||
release.deletion_desc = La rimozione di un rilascio lo rimuove soltanto da Forgejo. Non influenza il tag Git, i contenuti del tuo repositorio o la sua cronologia. Continuare?
|
||||
branch.already_exists = Esiste già un ramo chiamato "%s".
|
||||
settings.merge_style_desc = Modalità di fusione
|
||||
settings.remove_protected_branch_failed = Impossibile rimuovere la regola di protezione del ramo "%s".
|
||||
|
|
@ -2688,8 +2688,8 @@ project = Progetti
|
|||
issues.edit.already_changed = Impossibile salvare le modifiche alla segnalazione. Sembra che il contenuto sia già stato modificato da un*altrə utente. Aggiornare la pagina e provare a modificare nuovamente per evitare di sovrascrivere le modifiche
|
||||
subscribe.pull.guest.tooltip = Accedi per iscriverti a questa richiesta di modifica.
|
||||
subscribe.issue.guest.tooltip = Accedere per seguire questa segnalazione.
|
||||
n_release_one = rilascio %s
|
||||
n_release_few = rilasci %s
|
||||
n_release_one = %s rilascio
|
||||
n_release_few = %s rilasci
|
||||
issues.author.tooltip.pr = Quest'utente è l'autorə di questa richiesta di modifica.
|
||||
release.hide_archive_links = Nascondi automaticamente gli archivi generati
|
||||
settings.federation_settings = Impostazioni di federazione
|
||||
|
|
@ -2843,9 +2843,9 @@ settings.labels_desc=Aggiungi i webhooks che verranno attivati per <strong>tutti
|
|||
|
||||
members.membership_visibility=Visibilità appartenenza:
|
||||
members.public=Visibile
|
||||
members.public_helper=nascondi
|
||||
members.public_helper=Nascondi
|
||||
members.private=Nascosto
|
||||
members.private_helper=rendi visibile
|
||||
members.private_helper=Rendi visibile
|
||||
members.member_role=Ruolo del membro:
|
||||
members.owner=Proprietario
|
||||
members.member=Membro
|
||||
|
|
@ -2898,7 +2898,7 @@ form.name_pattern_not_allowed = La sequenza "%s" non è consentita nel nome di u
|
|||
settings.change_orgname_prompt = Nota: cambiare il nome dell'organizzazione cambierà anche l'URL dell'organizzazione e libererà il vecchio nome.
|
||||
teams.invite_team_member = Invita in %s
|
||||
teams.invite_team_member.list = Inviti in sospeso
|
||||
teams.add_nonexistent_repo = Il progetto che stai cercando di aggiungere non esiste, crealo prima.
|
||||
teams.add_nonexistent_repo = Il repositorio che stai cercando di aggiungere non esiste, crealo prima.
|
||||
teams.invite.title = Sei stato invitato ad unirti alla squadra <strong>%s</strong> nell'organizzazione <strong>%s</strong>.
|
||||
teams.invite.by = Invitato da %s
|
||||
teams.invite.description = Clicca il tasto sotto per entrare nella squadra.
|
||||
|
|
@ -3023,7 +3023,7 @@ users.prohibit_login=Disattiva accesso
|
|||
users.is_admin=È amministratore
|
||||
users.is_restricted=È limitato
|
||||
users.allow_git_hook=Può creare hook Git
|
||||
users.allow_git_hook_tooltip=Gli hook Git sono eseguiti come l'utente OS che esegue Forgejo e avrà lo stesso livello di accesso host. Di conseguenza, gli utenti con questo speciale privilegio hook Git, possono accedere e modificare tutti i repository Forgejo e il database utilizzato da Forgejo. Di conseguenza sono anche in grado di ottenere privilegi di amministratore Forgejo.
|
||||
users.allow_git_hook_tooltip=Gli hook Git sono eseguiti come l'utente OS che esegue Forgejo e avrà lo stesso livello di accesso host. Di conseguenza, gli utenti con questo speciale privilegio hook Git, possono accedere e modificare tutti i repositori Forgejo e il database utilizzato da Forgejo. Di conseguenza sono anche in grado di ottenere privilegi di amministratore Forgejo.
|
||||
users.allow_import_local=Può importare progetti locali
|
||||
users.allow_create_organization=Può creare organizzazioni
|
||||
users.update_profile=Aggiorna profilo utente
|
||||
|
|
@ -3068,7 +3068,7 @@ orgs.new_orga=Nuova organizzazione
|
|||
|
||||
repos.repo_manage_panel=Gestisci progetti
|
||||
repos.unadopted=Progetti non adottati
|
||||
repos.unadopted.no_more=Nessun repository non adottato trovato
|
||||
repos.unadopted.no_more=Nessun repositorio non adottato trovato.
|
||||
repos.owner=Proprietario
|
||||
repos.name=Nome
|
||||
repos.private=Privati
|
||||
|
|
@ -3205,7 +3205,7 @@ config.disable_router_log=Disattivare log del router
|
|||
config.run_user=Nome utente con cui eseguire
|
||||
config.run_mode=Modalità di esecuzione
|
||||
config.git_version=Versione Git
|
||||
config.repo_root_path=Percorso radice del progetto
|
||||
config.repo_root_path=Percorso radice del repositorio
|
||||
config.lfs_root_path=Percorso radice LFS
|
||||
config.log_file_root_path=Percorso dei log
|
||||
config.script_type=Tipo di script
|
||||
|
|
@ -3622,8 +3622,8 @@ rubygems.required.rubygems=Richiede la versione RubyGem
|
|||
swift.registry=Configura questo registro dalla riga di comando:
|
||||
settings.link=Collega questo pacchetto a un repository
|
||||
settings.link.description=Se si collega un pacchetto a un repository, il pacchetto è elencato nell'elenco dei pacchetti del repository.
|
||||
settings.link.select=Seleziona Repository
|
||||
settings.link.button=Aggiorna Collegamento Repository
|
||||
settings.link.select=Seleziona repositorio
|
||||
settings.link.button=Aggiorna collegamento repositorio
|
||||
settings.link.success=Il link del repository è stato aggiornato correttamente.
|
||||
settings.link.error=Impossibile aggiornare il link del repository.
|
||||
settings.delete=Elimina pacchetto
|
||||
|
|
@ -3640,26 +3640,26 @@ alpine.repository.architectures = Architetture
|
|||
debian.repository.distributions = Distribuzioni
|
||||
empty.documentation = Per ulteriori informazioni sul registro dei pacchetti vedi <a target="_blank" rel="noopener noreferrer" href="%s">la documentazione</a>.
|
||||
registry.documentation = Per ulteriori informazioni sul registro %s vedi <a target="_blank" rel="noopener noreferrer" href="%s">la documentazione</a>.
|
||||
details.repository_site = Sito del progetto
|
||||
details.repository_site = Sito del repositorio
|
||||
details.documentation_site = Sito della documentazione
|
||||
alpine.registry = Imposta questo registro aggiungendo l'URL nel tuo file <code>/etc/apk/repositories</code>:
|
||||
alpine.registry.key = Scarica la chiave RSA pubblica del registro nella cartella <code>/etc/apk/keys/</code> per verificare la firma dell'indice:
|
||||
alpine.repository = Informazioni sul progetto
|
||||
alpine.repository = Informazioni sul repositorio
|
||||
cargo.registry = Imposta il registro nel file di configurazione di Cargo (per esempio <code>~/.cargo/config.toml</code>):
|
||||
chef.registry = Imposta questo registro nel tuo file <code>~/.chef/config.rb</code>:
|
||||
conda.registry = Imposta questo registro come un progetto Conda nel tuo file <code>.condarc</code>:
|
||||
conda.registry = Imposta questo registro come un repositorio Conda nel tuo file <code>.condarc</code>:
|
||||
conda.install = Per installare il pacchetto usando conda, esegui il comando seguente:
|
||||
debian.registry.info = Scegli $distribuzione e $componente dalla lista sotto.
|
||||
debian.repository = Informazioni sul progetto
|
||||
debian.repository = Informazioni sul repositorio
|
||||
go.install = Installa il pacchetto dalla riga di comando:
|
||||
rpm.distros.suse = sulle distribuzioni basate su SUSE
|
||||
rpm.repository = Informazioni sul progetto
|
||||
rpm.repository = Informazioni sul repositorio
|
||||
swift.install = Aggiungi il pacchetto nel tuo file <code>Package.swift</code>:
|
||||
swift.install2 = ed esegui il comando seguente:
|
||||
vagrant.install = Per aggiungere una scatola Vagrant esegui il comando seguente:
|
||||
owner.settings.cargo.initialize = Inizializza indice
|
||||
rpm.distros.redhat = sulle distribuzione basate su RedHat
|
||||
alpine.registry.info = scegli $ramo e $progetto dalla lista sotto.
|
||||
alpine.registry.info = scegli $ramo e $repositorio dalla lista sotto.
|
||||
cargo.install = Per installare il pacchetto usando Cargo esegui il comando seguente:
|
||||
cran.registry = Imposta questo registro nel tuo file <code>Rprofile.site</code>:
|
||||
rpm.repository.multiple_groups = Questo pacchetto è disponibile in molteplici gruppi.
|
||||
|
|
@ -3689,7 +3689,7 @@ owner.settings.cleanuprules.title = Gestisci regole di pulizia
|
|||
owner.settings.cargo.rebuild.success = L'indice di Cargo è stato ricostruito correttamente.
|
||||
owner.settings.cargo.rebuild.error = Impossibile ricostruire l'indice di Cargo: %v
|
||||
owner.settings.cleanuprules.keep.title = Le versioni che soddisfano queste regole sono mantenute, anche se soddisfano una regola di rimozione sotto.
|
||||
owner.settings.cargo.initialize.description = Uno speciale progetto Git di indice è necessario per usare il registro di Cargo. usare questa opzione (ri-)creerà il progetto e lo configurerà automaticamente.
|
||||
owner.settings.cargo.initialize.description = Per utilizzare il registro Cargo è necessario un repositorio Git con un indice speciale. Utilizzando questa opzione, il repositorio verrà (ri)creato e configurato automaticamente.
|
||||
owner.settings.chef.keypair.description = Per autenticarsi al registro Chef è necessaria una coppia di chiavi. Se hai già generato una coppia di chiavi la generazione di una nuova coppia scarterà la vecchia.
|
||||
owner.settings.cargo.initialize.success = L'indice di Cargo è stato creato correttamente.
|
||||
owner.settings.cargo.rebuild.no_index = Impossibile ricostruire, nessun indice è inizializzato.
|
||||
|
|
@ -3792,7 +3792,7 @@ runners.update_runner_failed = Impossibile aggiornare l'esecutore
|
|||
runners.update_runner_success = Esecutore aggiornato correttamente
|
||||
runners.update_runner = Aggiorna cambiamenti
|
||||
runners.edit_runner = Modifica esecutore
|
||||
runners.task_list.done_at = Fatto a
|
||||
runners.task_list.done_at = Eseguito
|
||||
runners.task_list.no_tasks = Non c'è ancora nessuna attività.
|
||||
runners.last_online = Ultima volta online
|
||||
runners.new_notice = Come avviare un esecutore
|
||||
|
|
|
|||
|
|
@ -105,7 +105,7 @@ preview=プレビュー
|
|||
loading=読み込み中…
|
||||
|
||||
error=エラー
|
||||
error404=アクセスしようとしたページは<strong>存在しない</strong>か、閲覧が<strong>許可されていません</strong>。
|
||||
error404=アクセスしようとしたページは<strong>存在しない</strong>か<strong>削除された</strong>か、あるいは閲覧が<strong>許可されていません</strong>。
|
||||
go_back=戻る
|
||||
|
||||
never=無し
|
||||
|
|
@ -179,8 +179,8 @@ contributions_format = {month} {day}, {year} に {contributions}
|
|||
|
||||
[editor]
|
||||
buttons.heading.tooltip=見出し追加
|
||||
buttons.bold.tooltip=太字追加
|
||||
buttons.italic.tooltip=イタリック体追加
|
||||
buttons.bold.tooltip=太字追加 (Ctrl+B / ⌘B)
|
||||
buttons.italic.tooltip=イタリック体追加 (Ctrl+I / ⌘I)
|
||||
buttons.quote.tooltip=引用
|
||||
buttons.code.tooltip=コード追加
|
||||
buttons.link.tooltip=リンク追加
|
||||
|
|
@ -3733,7 +3733,7 @@ submodule=サブモジュール
|
|||
|
||||
|
||||
[search]
|
||||
search = 検索...
|
||||
search = 検索…
|
||||
type_tooltip = 検索タイプ
|
||||
org_kind = 組織を検索…
|
||||
code_kind = コードを検索…
|
||||
|
|
@ -3759,6 +3759,8 @@ regexp_tooltip = 検索語句を正規表現として解釈する
|
|||
regexp = 正規表現
|
||||
|
||||
|
||||
union = フレーズ一致
|
||||
|
||||
[munits.data]
|
||||
pib = PiB
|
||||
tib = TiB
|
||||
|
|
|
|||
|
|
@ -1,6 +1,3 @@
|
|||
|
||||
|
||||
|
||||
[common]
|
||||
home = Agejdan
|
||||
username = Isem n useqdac
|
||||
|
|
@ -43,7 +40,7 @@ captcha = CAPČA
|
|||
passcode = Angal n wadduf
|
||||
settings = Iɣewwaren
|
||||
your_profile = Amaɣnu
|
||||
your_settings = Iɣewwaren
|
||||
your_settings = Tawila
|
||||
activities = Irmad
|
||||
ok = Ih
|
||||
view = Wali
|
||||
|
|
@ -56,6 +53,19 @@ concept_system_global = Amatu
|
|||
concept_user_organization = Tuddsa
|
||||
filter = Imsizdeg
|
||||
|
||||
your_starred = S yitran
|
||||
new_repo.title = Akufi amaynut
|
||||
new_repo.link = Akufi amaynut
|
||||
issues = Uguren
|
||||
preview = Taskant
|
||||
loading = Aɛebbi…
|
||||
|
||||
sign_in = Qqen
|
||||
sign_out = Senser tuqqna
|
||||
link_account = Qqen amiḍan
|
||||
email = Tansa imayl
|
||||
access_token = Ajuṭu n unekcum
|
||||
|
||||
[user]
|
||||
code = Tangalt
|
||||
repositories = Ikufan
|
||||
|
|
@ -69,9 +79,20 @@ following.title.one = Yeṭṭafaṛ
|
|||
following.title.few = Yeṭṭafaṛ
|
||||
unfollow = Ur ṭṭafar ara
|
||||
|
||||
overview = Tamuɣli s umata
|
||||
|
||||
[org]
|
||||
code = Tanglat
|
||||
|
||||
org_desc = Aglam
|
||||
team_desc = Aglam
|
||||
|
||||
lower_repositories = Ikufan
|
||||
settings.options = Tuddsa
|
||||
settings.website = Asmel web
|
||||
members.remove = Kkes
|
||||
teams.settings = Iɣewwaren
|
||||
|
||||
[repo]
|
||||
release.source_code = Tangalt taɣbalut
|
||||
settings.slack_username = Isem n useqdac
|
||||
|
|
@ -125,6 +146,127 @@ projects.title = Azwel
|
|||
projects.type.none = Ula yiwen
|
||||
projects.template.desc = Tamudemt
|
||||
|
||||
repo_name = Isem n ukufi
|
||||
repo_size = Tiddi n ukufi
|
||||
create_repo = Snulfu-d akufi
|
||||
mirror_sync = yemtawa
|
||||
migrate_items_issues = Uguren
|
||||
star = Rnu-yas itri
|
||||
no_desc = Ur yesɛi ara aglam
|
||||
branches = Tiṣeḍwa
|
||||
issues = Uguren
|
||||
projects.description = Aglam (d afrayan)
|
||||
projects.column.edit_title = Isem
|
||||
projects.column.new_title = Isem
|
||||
projects.column.color = Ini
|
||||
projects.open = Ldi
|
||||
projects.close = Mdel
|
||||
issues.new.labels = Tibzimin
|
||||
issues.new.projects = Isenfaren
|
||||
issues.choose.open_external_link = Ldi
|
||||
issues.choose.blank = Amezwer
|
||||
issues.new_label_desc_placeholder = Aglam
|
||||
issues.filter_label = Tabzimt
|
||||
issues.filter_project = Asenfar
|
||||
issues.filter_poster = Ameskar
|
||||
issues.filter_type = Tawsit
|
||||
issues.filter_sort = Semyizwer
|
||||
issues.action_open = Ldi
|
||||
issues.action_close = Mdel
|
||||
issues.action_label = Tabzimt
|
||||
issues.previous = Uzwir
|
||||
issues.next = Uḍfir
|
||||
issues.all_title = Akk
|
||||
issues.draft_title = Arewway
|
||||
issues.context.edit = Ẓreg
|
||||
issues.context.delete = Kkes
|
||||
issues.reopen_issue = Ales tulya
|
||||
issues.create_comment = Awennit
|
||||
issues.author = Ameskar
|
||||
issues.role.owner = Bab-is
|
||||
issues.role.member = Aɛeggal
|
||||
issues.role.contributor = Amɛiwen
|
||||
issues.edit = Ẓreg
|
||||
issues.cancel = Semmet
|
||||
issues.save = Sekles
|
||||
issues.label_title = Isem
|
||||
issues.label_description = Aglam
|
||||
issues.label_color = Ini
|
||||
issues.label_edit = Ẓreg
|
||||
issues.label_delete = Kkes
|
||||
issues.label.filter_sort.alphabetically = S ugemmay
|
||||
issues.delete = Kkes
|
||||
issues.add_time_cancel = Semmet
|
||||
issues.add_time_hours = Isragen
|
||||
issues.due_date_form = yyyy-mm-dd
|
||||
issues.due_date_form_edit = Ẓreg
|
||||
issues.dependency.cancel = Semmet
|
||||
issues.content_history.options = Tixtiṛiyin
|
||||
pulls.made_using_agit = AGit
|
||||
milestones.open = Ldi
|
||||
milestones.close = Mdel
|
||||
milestones.title = Azwel
|
||||
milestones.desc = Aglam
|
||||
milestones.clear = Sfeḍ
|
||||
milestones.cancel = Semmet
|
||||
milestones.filter_sort.name = Isem
|
||||
wiki = Awiki
|
||||
wiki.page = Asebter
|
||||
wiki.new_page = Asebter
|
||||
wiki.cancel = Semmet
|
||||
wiki.edit_page_button = Ẓreg
|
||||
wiki.pages = Isebtar
|
||||
activity = Armud
|
||||
activity.navbar.contributors = Iwiziwen
|
||||
activity.overview = Tamuɣli s umata
|
||||
settings.delete = Kkes akufi-a
|
||||
settings.confirm_delete = Kkes akufi
|
||||
settings.slack_color = Ini
|
||||
|
||||
all_branches = Akk tiseḍwa
|
||||
editor.add_file = Rnu afaylu
|
||||
editor.new_file = Afaylu amaynut
|
||||
editor.upload_file = Sali afaylu
|
||||
editor.edit_file = Ẓreg afaylu
|
||||
editor.edit_this_file = Ẓreg afaylu
|
||||
editor.delete_this_file = Kkes afaylu
|
||||
commits.search_branch = Taseṭṭa-a
|
||||
commits.search_all = Akk tiseḍwa
|
||||
issues.filter_project_all = Akk isenfaren
|
||||
issues.due_date_form_remove = Kkes
|
||||
issues.dependency.remove = Kkes
|
||||
pulls.filter_branch = Sizdeg taseṭṭa
|
||||
activity.period.daily = 1 n wass
|
||||
activity.period.halfweekly = 3 n wussan
|
||||
activity.period.weekly = 1 n umalas
|
||||
activity.period.monthly = 1 n wayyur
|
||||
activity.period.quarterly = 3 n wayyuren
|
||||
activity.period.semiyearly = 6 n wayyuren
|
||||
activity.period.yearly = 1 n useggas
|
||||
activity.git_stats_on_default_branch = Ɣef %s,
|
||||
settings.site = Asmel web
|
||||
settings.delete_collaborator = Kkes
|
||||
settings.webhook.payload = Agbur
|
||||
settings.event_issue_comment = Iwenniten
|
||||
settings.event_pull_request_comment = Iwenniten
|
||||
settings.web_hook_name_gitea = Gitea
|
||||
settings.web_hook_name_forgejo = Forgejo
|
||||
settings.web_hook_name_gogs = Gogs
|
||||
settings.web_hook_name_slack = Slack
|
||||
settings.web_hook_name_discord = Discord
|
||||
settings.web_hook_name_dingtalk = DingTalk
|
||||
settings.web_hook_name_telegram = Telegram
|
||||
settings.web_hook_name_matrix = Matrix
|
||||
settings.web_hook_name_feishu_only = Feishu
|
||||
settings.web_hook_name_packagist = Packagist
|
||||
settings.title = Azwel
|
||||
settings.deploy_key_content = Agbur
|
||||
settings.branches = Tiṣeḍwa
|
||||
settings.edit_protected_branch = Ẓreg
|
||||
release.edit = Ẓreg
|
||||
release.cancel = Semmet
|
||||
release.downloads = Isidar
|
||||
|
||||
[install]
|
||||
admin_password = Awal n uɛeddi
|
||||
password = Awal n uɛeddi
|
||||
|
|
@ -135,6 +277,8 @@ db_schema = Azenziɣ
|
|||
ssl_mode = SSL
|
||||
path = Abrid
|
||||
|
||||
db_name = Isem n taffa n yisefka
|
||||
|
||||
[admin]
|
||||
notices.type_1 = Akufi
|
||||
packages.repository = Akufi
|
||||
|
|
@ -142,6 +286,26 @@ config.db_user = Isem n useqdac
|
|||
users.name = Isem n useqdac
|
||||
emails.filter_sort.name = Isem n useqdac
|
||||
|
||||
orgs.name = Isem
|
||||
repos.name = Isem
|
||||
packages.name = Isem
|
||||
auths.name = Isem
|
||||
config.db_name = Isem
|
||||
config.mailer_name = Isem
|
||||
monitor.name = Isem
|
||||
monitor.queue.name = Isem
|
||||
notices.desc = Aglam
|
||||
|
||||
dashboard = Tafelwit n usenqed
|
||||
organizations = Tuddsiwin
|
||||
repositories = Ikufan
|
||||
config = Tawila
|
||||
config_summary = Agzul
|
||||
config_settings = Iɣewwaren
|
||||
dashboard.statistic = Agzul
|
||||
users.2fa = 2FA
|
||||
config.db_ssl_mode = SSL
|
||||
|
||||
[search]
|
||||
code_kind = Nadi tangalt…
|
||||
search = Nadi…
|
||||
|
|
@ -160,11 +324,19 @@ table_modal.label.columns = Tigejda
|
|||
link_modal.url = Url
|
||||
link_modal.description = Aglam
|
||||
|
||||
table_modal.placeholder.header = Aqeṛṛu
|
||||
table_modal.label.rows = Izirigen
|
||||
|
||||
buttons.new_table.tooltip = Rnu tafelwit
|
||||
table_modal.header = Rnu tafelwit
|
||||
|
||||
[explore]
|
||||
code = Tanglat
|
||||
repos = Ikufan
|
||||
users = Iseqdacen
|
||||
|
||||
organizations = Tuddsiwin
|
||||
|
||||
[form]
|
||||
UserName = Isem n useqdac
|
||||
Password = Awal n uɛeddi
|
||||
|
|
@ -174,6 +346,12 @@ Content = Agbur
|
|||
Biography = Tameddurt
|
||||
Location = Asun
|
||||
|
||||
RepoName = Isem n ukufi
|
||||
TeamName = Isem n terbaɛt
|
||||
|
||||
Email = Tansa imayl
|
||||
Retype = Sentem awal n uɛeddi
|
||||
|
||||
[aria]
|
||||
footer.links = Iseɣwan
|
||||
footer = Aḍar n usebter
|
||||
|
|
@ -184,14 +362,20 @@ more = Ugar
|
|||
[startpage]
|
||||
lightweight = D afessas
|
||||
|
||||
license = Aɣbalu yeldin
|
||||
|
||||
[home]
|
||||
my_repos = Ikufan
|
||||
show_private = Uslig
|
||||
|
||||
my_orgs = Tuddsiwin
|
||||
|
||||
[auth]
|
||||
openid_connect_submit = Tuqqna
|
||||
verify = Senqed
|
||||
|
||||
login_userpass = Qqen
|
||||
|
||||
[modal]
|
||||
yes = Ih
|
||||
no = Uhu
|
||||
|
|
@ -234,4 +418,43 @@ quota.sizes.all = Akk
|
|||
quota.sizes.repos.all = Ikufan
|
||||
quota.sizes.assets.attachments.all = Imeddayen
|
||||
quota.sizes.assets.packages.all = Ikemmusen
|
||||
quota.sizes.wiki = Wiki
|
||||
quota.sizes.wiki = Wiki
|
||||
appearance = Udem
|
||||
avatar = Avataṛ
|
||||
orgs = Tuddsiwin
|
||||
organization = Tuddsiwin
|
||||
quota = Amur
|
||||
location = Asun
|
||||
comment_type_group_reference = Tamsisɣelt
|
||||
visibility.private = Uslig
|
||||
quota.rule.no_limit = War talast
|
||||
quota.sizes.assets.all = Igburen
|
||||
|
||||
update_language = Beddel tutlayt
|
||||
language.title = Tutlayt tamezwarut
|
||||
delete_email = Kkes
|
||||
|
||||
[packages]
|
||||
alpine.repository.branches = Tiṣeḍwa
|
||||
alpine.repository.repositories = Ikufan
|
||||
arch.version.description = Aglam
|
||||
settings.link.select = Fren akufi
|
||||
|
||||
alpine.repository.architectures = Tisegda
|
||||
container.images.title = Tugniwin
|
||||
container.details.platform = Tiɣerɣert
|
||||
debian.repository.architectures = Tisegda
|
||||
rpm.repository.architectures = Tisegda
|
||||
alt.repository.architectures = Tisegda
|
||||
|
||||
[actions]
|
||||
runners.name = Isem
|
||||
runners.description = Aglam
|
||||
|
||||
runners.task_list.repository = Akufi
|
||||
|
||||
[projects]
|
||||
type-2.display_name = Asenfar n ukufi
|
||||
|
||||
[error]
|
||||
network_error = Tuccḍa deg uẓeṭṭa
|
||||
7
options/locale/locale_la.ini
Normal file
7
options/locale/locale_la.ini
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
[common]
|
||||
home = Domus
|
||||
dashboard = Tabula
|
||||
explore = Explora
|
||||
help = Auxilium
|
||||
logo = Logotipus
|
||||
sign_in = Intra
|
||||
|
|
@ -1249,7 +1249,7 @@ file_history=Vēsture
|
|||
file_view_source=Skatīt avotu
|
||||
file_view_rendered=Skatīt atveidojumu
|
||||
file_view_raw=Apskatīt neapstrādātu
|
||||
file_permalink=Patstāvīgā saite
|
||||
file_permalink=Pastāvīgā saite
|
||||
file_too_large=Datne ir pārāk liela, lai to parādītu.
|
||||
invisible_runes_header=Šī datne satur neredzamas unikoda rakstzīmes
|
||||
invisible_runes_description=`Šī datne satur neredzamas unikoda rakstzīmes, kas ir neatšķiramas cilvēkiem, bet dators tās var apstrādāt atšķirīgi. Ja šķiet, ka tas ir ar nolūku, šo brīdinājumu var droši neņemt vērā. Jāizmanto atsoļa taustiņš (Esc), lai atklātu tās.`
|
||||
|
|
@ -1921,7 +1921,7 @@ milestones.filter_sort.least_issues=Vismazāk pieteikumu
|
|||
|
||||
signing.will_sign=Šis iesūtījums tiks parakstīts ar atslēgu "%s".
|
||||
signing.wont_sign.error=Atgadījās kļūda pārbaudot, vai iesūtījums var tikt parakstīts.
|
||||
signing.wont_sign.nokey=Nav pieejamas atslēgas, ar ko parakstīt šo iesūtījumu.
|
||||
signing.wont_sign.nokey=Šajā serverī nav atslēgas, ar ko parakstīt šo iesūtījumu.
|
||||
signing.wont_sign.never=Iesūtījumi nekad netiek parakstīti.
|
||||
signing.wont_sign.always=Iesūtījumi vienmēr tiek parakstīti.
|
||||
signing.wont_sign.pubkey=Iesūtījums netiks parakstīts, jo kontam nav piesaistīta publiska atslēga.
|
||||
|
|
@ -2307,7 +2307,7 @@ settings.packagist_api_token=API pilnvara
|
|||
settings.packagist_package_url=Packagist pakotnes URL
|
||||
settings.deploy_keys=Izvietošanas atslēgas
|
||||
settings.add_deploy_key=Pievienot izvietošanas atslēgu
|
||||
settings.deploy_key_desc=Izvietošanas atslēgām ir lasīšanas piekļuve glabātavai.
|
||||
settings.deploy_key_desc=Izvietošanas atslēgām var būt tikai lasīšanas vai lasīšanas un rakstīšanas piekļuve glabātavai.
|
||||
settings.is_writable=Iespējot rakstīšanas piekļuvi
|
||||
settings.is_writable_info=Atļaut šai izvietošanas atslēgai <strong>aizgādāt</strong> uz glabātavu.
|
||||
settings.no_deploy_keys=Pagaidām nav nevienas izvietošanas atslēgas.
|
||||
|
|
@ -2364,7 +2364,7 @@ settings.protect_protected_file_patterns=Aizsargāto datņu paraugs (vairākus a
|
|||
settings.protect_protected_file_patterns_desc=Aizsargātās datnes nav ļauts tiešā veidā mainīt, pat ja lietotājam šajā zarā ir tiesības pievienot, labot vai izdzēst datnes. Vairākus paraugus var atdalīt ar semikolu (";"). Paraugu pieraksts ir skatāms <a href="%[1]s">%[2]s</a> dokumentācijā. Piemēri: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||
settings.protect_unprotected_file_patterns=Neaizsargāto datņu paraugs (vairākus atdala ar semikolu ";")
|
||||
settings.protect_unprotected_file_patterns_desc=Neaizsargātās datnes, kuras ir ļauts izmainīt tiešā veidā, apejot aizgādāšanas ierobežojumu, ja lietotājam ir rakstīšanas piekļuve. Vairāki paraugi ir atdalāmi ar semikolu (";"). Paraugu pierakstu skatīt <a href="%[1]s">%[2]s</a> dokumentācijā. Piemēri: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
|
||||
settings.update_protect_branch_success=Zara aizsargāšanas kārtula "%s" tika atjaunināta.
|
||||
settings.update_protect_branch_success=Zara aizsargāšanas kārtula “%s” tika atjaunināta.
|
||||
settings.remove_protected_branch_success=Zara aizsargāšanas kārtula "%s" tika noņemta.
|
||||
settings.remove_protected_branch_failed=Zara aizsargāšanas kārtulas "%s" noņemšana neizdevās.
|
||||
settings.protected_branch_deletion=Izdzēst zara aizsargāšanu
|
||||
|
|
|
|||
|
|
@ -179,9 +179,54 @@ oauth_signup_tab = Registrer ny konto
|
|||
oauth_signup_title = Fullfør ny konto
|
||||
oauth_signup_submit = Fullfør konto
|
||||
|
||||
create_new_account = Registrer konto
|
||||
disable_register_prompt = Registrering er skrudd av. Kontakt din nettside adminstrator.
|
||||
disable_register_mail = E-post bekreftning for registrering er skrudd av.
|
||||
manual_activation_only = Kontakt din nettside administrator for å gjøre aktiveringen ferdig.
|
||||
remember_me = Husk denne enheten
|
||||
forgot_password_title = Glemt passord
|
||||
forgot_password = Glemt passordet?
|
||||
hint_login = Har allerede en konto? <a href="%s">Logg inn nå!</a>
|
||||
hint_register = Trenger en konto? <a href="%s">Registrer nå.</a>
|
||||
sign_up_successful = Kontoen er dannet. Velkommen!
|
||||
confirmation_mail_sent_prompt = En bekreftnings e-post har blitt sent til <b>%s</b>. For å gjøre ferdig registreringen, sjekk din e-post innboks og gå på linken i løpet av de neste %s. Hvis e-posten er feil, kan du logge deg inn og forespørre en ny e-post som kan bli sendt til et annet adresse.
|
||||
must_change_password = Oppdater passordet ditt
|
||||
allow_password_change = Påby brukeren å endre passordet (anbefalt)
|
||||
reset_password_mail_sent_prompt = En bekreftnings e-post har blitt sendt til <b>%s</b>. For å gjøre ferdig kontogjenopprettingen, følg linken som blei sendt på din innboks i løpet av de neste %s.
|
||||
active_your_account = Aktiver din konto
|
||||
account_activated = Kontoen har blitt aktivert
|
||||
prohibit_login = Kontoen er utestengt
|
||||
prohibit_login_desc = Din konto har blitt utestengt fra å delta med instansen. Kontakt instans administratoren for å få tilbake tilgang.
|
||||
resent_limit_prompt = Du har nylig allerede forespurt en aktiverings e-post. Vent minst 3 minutter og prøv igjen.
|
||||
has_unconfirmed_mail = Hei %s, du har en ubekreftet e-post adresse (<b>%s</b>). Hvis du har ikke fått en bekreftnings e-post eller trenger å få en ny tilsendt, trykk på knappen under.
|
||||
change_unconfirmed_email_summary = Bekreftning av ndring av e-post adressen er tilsendt.
|
||||
change_unconfirmed_email = Hvis du har oppgitt feil e-post adresse gjennom registreringen, kan du endre den under, og en ny e-post vil bli sendt på den nye adressen istendenfor.
|
||||
resend_mail = Trykk her for å få aktiverings e-posten tilsendt på nytt
|
||||
send_reset_mail = Send gjenopprettings e-post
|
||||
reset_password = Kontogjenoppretting
|
||||
invalid_code = Din bekreftningskode er ugyldig eller har utløpt.
|
||||
invalid_code_forgot_password = Din bekreftningskode er ugyldig eller har utløpt. Trykk <a href="%s">her</a> for å starte ny økt.
|
||||
|
||||
[home]
|
||||
uname_holder = Brukernavn eller e-postadresse
|
||||
|
||||
switch_dashboard_context = Bytt dashboard miljø
|
||||
my_repos = Repositorier
|
||||
my_orgs = Organisasjoner
|
||||
view_home = Vis %s
|
||||
filter = Andre filtre
|
||||
filter_by_team_repositories = Filtrer etter team-repositorier
|
||||
feed_of = Feed av "%s"
|
||||
show_archived = Arkivert
|
||||
show_both_archived_unarchived = Viser både arkiverte og ikke arkiverte
|
||||
show_only_archived = Viser kun arkiverte
|
||||
show_only_unarchived = Vis kun ikke arkiverte
|
||||
show_private = Privat
|
||||
show_both_private_public = Vis både offentlige og private
|
||||
show_only_private = Vis kun private
|
||||
show_only_public = Vis kun offentlige
|
||||
issues.in_your_repos = I dine repositorier
|
||||
|
||||
[heatmap]
|
||||
contributions_zero = Ingen bidrag
|
||||
number_of_contributions_in_the_last_12_months = %s bidrag de siste 12 månedene
|
||||
|
|
@ -193,8 +238,8 @@ more = Mer
|
|||
|
||||
[editor]
|
||||
buttons.heading.tooltip = Legg til overskrift
|
||||
buttons.bold.tooltip = Legg til uthevet tekst
|
||||
buttons.italic.tooltip = Legg til kursiv text
|
||||
buttons.bold.tooltip = Legg til uthevet tekst (Ctrl+B / ⌘B)
|
||||
buttons.italic.tooltip = Legg til kursiv text (Ctrl+I / ⌘I)
|
||||
buttons.list.unordered.tooltip = Legg til punktliste
|
||||
buttons.list.ordered.tooltip = Legg til nummerert liste
|
||||
buttons.link.tooltip = Legg til link
|
||||
|
|
@ -255,6 +300,102 @@ sqlite_helper = Sti til SQLite3-databasen.<br>Bruk absolutt filsti dersom Forgej
|
|||
reinstall_error = Du prøver å installere i en eksisterende Forgejo-database
|
||||
reinstall_confirm_message = Å installere på nytt med en eksisterende Forgejo-database kan føre til problemer. I de fleste tilfeller bør du bruke din eksisterende "app.ini" for å kjøre Forgejo. Hvis du vet hva du gjør, og vil fortsette, bekreft følgende:
|
||||
|
||||
reinstall_confirm_check_1 = Data kryptert av SECRET_KEY i app.ini-filen kan mistes: brukere vil ikke ha mulighet til å logge inn med 2FA/OTP og mirrorene vil kanskje ikke fungere korrekt. Etter det å ha markert boksen bekrefter du at nåværende app.ini-filen har den korrekte SECRET_KEY.
|
||||
reinstall_confirm_check_2 = Repositoriene og innstillingene kan trenge en re-synkronisering. Ved å markere denne boksen bekrefter du at du vil re-synkronisere hookene til repositoriene og authorized_keys filen manuelt. Du bekrefter at du vil sjekke at repositorie- og speilinnstilingene er korrekte.
|
||||
reinstall_confirm_check_3 = Du bekrefter at du er absolutt sikker på at Forgejo kjører med den korrekte app.ini lokasjonen og at du er sikker på at du må gjøre en re-install. Du bekrefter at du forstår risikoene nevnt ovenfor.
|
||||
err_empty_db_path = Filplasseringen til SQLite3 database kan ikke være tom.
|
||||
no_admin_and_disable_registration = Du kan ikke skru av bruker selv-registrering uten å ha laget en administrator konto.
|
||||
err_empty_admin_password = Administratorpassordet kan ikke være tomt.
|
||||
err_empty_admin_email = Administrator-e-posten kan ikke være tom.
|
||||
err_admin_name_is_reserved = Administrator brukernavn utilgjengelig, brukernavn reservert
|
||||
err_admin_name_pattern_not_allowed = Administrator brukernavnet er utilgjengelig, brukernavnet passer til det reserverte brukernavnmønsteret
|
||||
err_admin_name_is_invalid = Administrator brukernavnet er utilgjengelig
|
||||
general_title = Generelle innstillinger
|
||||
app_name = Instans tittel
|
||||
app_name_helper = Skriv inn navnet på instansen din. Den vil bli vist på alle sider.
|
||||
app_slogan = Instans motto
|
||||
app_slogan_helper = Skriv inn instans mottoen her. La den være tom om du vil skru av instans motto.
|
||||
repo_path = Repositorie root filplassering
|
||||
repo_path_helper = Fjerntilgjenelige Git repositorie vil være lagret på denne filplasseringen.
|
||||
lfs_path = Git LFS root filplassering
|
||||
lfs_path_helper = Filer kontrollert av Git LFS vil være lagret på denne filplasseringen. La være tomt om du vil skru den av.
|
||||
run_user = Kjøre bruker som
|
||||
run_user_helper = Operativsystemets brukernavn som Forgejo kjører som. Merk at brukeren må ha tilgang til repositoriens root filplassering.
|
||||
domain = Server domene
|
||||
domain_helper = Domene eller host adresse til serveren.
|
||||
ssh_port = SSH server port
|
||||
ssh_port_helper = Port nummer som blir brukt av SSH serveren. La være tomt om du vil skru av SSH server.
|
||||
http_port = HTTP listen port
|
||||
http_port_helper = Port nummer som vil bli brukt av Forgejo web server.
|
||||
app_url = Hoved-URL
|
||||
app_url_helper = Hovedadresse for HTTP(S) klone-URLer og e-post varslinger.
|
||||
log_root_path = Logg filplassering
|
||||
log_root_path_helper = Loggfiler blir lagret i denne mappen.
|
||||
optional_title = Valgfrie innstillinger
|
||||
email_title = E-post innstilinger
|
||||
smtp_addr = SMTP host
|
||||
smtp_port = SMTP port
|
||||
smtp_from = Send e-post som
|
||||
smtp_from_invalid = "Send e-post som" adresse er ugyldig
|
||||
smtp_from_helper = E-post adresse Forgejo skal bruke. Skriv inn vanlig e-post adresse eller bruke "Navn" <email@example.com> format.
|
||||
mailer_user = SMTP brukernavn
|
||||
mailer_password = SMTP passord
|
||||
register_confirm = Påby e-post bekreftning for å registrere
|
||||
mail_notify = Skru på e-post varslinger
|
||||
server_service_title = Server og tredje-parts tjeneste innstillinger
|
||||
offline_mode = Skru på lokalmodus
|
||||
offline_mode.description = Skru av tredje-parts innholdsleveringsnettverk og servere alle resursene lokalt.
|
||||
disable_gravatar = Skru av Gravatar
|
||||
disable_gravatar.description = Skru av bruken av Gravatar eller andre tredje-parts avatar-kilder. Default bilder vil blir brukt for brukeravatarer utenom om de opplaster eget avatar til instansen.
|
||||
federated_avatar_lookup = Skru på federative avatarer
|
||||
federated_avatar_lookup.description = Søk opp avatarer med Libravatar.
|
||||
disable_registration = Skru av selv-registrering
|
||||
disable_registration.description = Kun instans-adiministratorer kan skape nye brukerkontoer. Det er sterkt anbefalt å ha den skrudd på, med mindre du har tenkt å host-e en offentlig instans for alle og er klar til å ta i mot store mengder av spamkontoer.
|
||||
allow_only_external_registration = Tillatt registrering kun via eksterne tjenester
|
||||
allow_only_external_registration.description = Brukere kan kun lage nye brukerkontroer ved å bruke konfigurerte eksterene tjenester.
|
||||
openid_signin = Skru på OpenID pålogging
|
||||
openid_signin.description = Tilatter bruker å logge inn via OpenID.
|
||||
openid_signup = Skru på OpenID selv-registrering
|
||||
openid_signup.description = Tillater brukere å danne nye kontroer via OpenID hvis selv-registrering er skrudd på.
|
||||
enable_captcha = Skru på CAPTCHA-registrerting
|
||||
enable_captcha.description = Påby brukere å gjennomgå CAPTCHA for å danne nye kontoer.
|
||||
require_sign_in_view = Påby pålogging for å se instans-innhold
|
||||
require_sign_in_view.description = Limiterer innholdstilgang til kun pålogget brukere. Gjester vil kun ha tilgang til å besøke påloggingsidene.
|
||||
default_keep_email_private = Gjem e-post adresser på default
|
||||
default_keep_email_private.description = Skru på e-post adresser gjemming for nye bruker på default sånn at informasjon ikke er lekket rett etter registrering.
|
||||
default_allow_create_organization = Tilatt skaping av organisasjoner på default
|
||||
default_allow_create_organization.description = Tilatt nye bruker å danne organisasjoner på default. Når denne innstillingen er skrudd av, må en admin gi tillatelse til nye brukere om de vil danne organiasjoner.
|
||||
default_enable_timetracking = Skru på tids-tracking på default
|
||||
default_enable_timetracking.description = Tilatt bruken av tids-tracking funksjonen for nye repositorier på default.
|
||||
admin_title = Administrator brukertinnstillinger
|
||||
admin_setting.description = Å lage en administratorbruker er helt valgfritt. Den første registrerte brukeren blir automatisk en administrator.
|
||||
admin_name = Administrator brukernavn
|
||||
admin_password = Passord
|
||||
confirm_password = Bekreft passordet
|
||||
admin_email = E-post adresse
|
||||
config_location_hint = Disse innstillingene vil blir lagret i:
|
||||
install_btn_confirm = Installer Forgejo
|
||||
test_git_failed = Kunne ikke teste "git" kommandoen: %v
|
||||
sqlite3_not_available = Denne Forgejo-versjonen støtter ikke SQLite3. Last ned den offisielle programversjonen fra %s (ikke velg "gobuild"-versjonen).
|
||||
invalid_db_setting = Database instillingene er ugyldige: %v
|
||||
invalid_db_table = Database tabellen "%s" er ugyldig: %v
|
||||
invalid_repo_path = Repositorie root filplasseringen er ugyldig: %v
|
||||
invalid_app_data_path = Appdata filplassering er ugyldig: %v
|
||||
run_user_not_match = Brukernavnet i "Kjører bruker som" er ikke det nåværende brukernavnet: %s -> %s
|
||||
internal_token_failed = Feilet å generere intern-toke: %v
|
||||
save_config_failed = Feilet å lagre innstillingene: %v
|
||||
enable_update_checker_helper_forgejo = Den vil periodisk sjekke for nye Forgejo-versjoner ved å sjekke en TXT DNS-record på release.forgejo.org.
|
||||
invalid_admin_setting = Administrator konto innstilling er ugyldig: %v
|
||||
invalid_log_root_path = Loggfilplasseringen er ugyldig: %v
|
||||
no_reply_address = Gjemmet e-post domene
|
||||
no_reply_address_helper = Domenenavn for bruker med en gjemt e-post adresse. For eksempel, vil brukeren "joe" være logget inn på Git som "joe@noreply.example.org" om den gjemmet e-post domenen er satt på "noreply.example.org".
|
||||
password_algorithm = Passord hash-algoritme
|
||||
invalid_password_algorithm = Ugyldig passord hash-algoritme
|
||||
password_algorithm_helper = Sett passord hashings-algoritme. Algoritmene har ulike krav og styrker. argon2-algoritmen er nokså sikker men bruker mye minne og kan være upassende for små datasystemer.
|
||||
enable_update_checker = Skru på oppdaterings-sjekking
|
||||
env_config_keys = Miljøkonfigurering
|
||||
env_config_keys_prompt = Følgende miljøvariabler vil være satt på konfigureringsfil:
|
||||
|
||||
[startpage]
|
||||
install = Enkel å installere
|
||||
platform = Plattformuavhengig
|
||||
|
|
@ -264,4 +405,14 @@ app_desc = En enkel Git-tjeneste du kan drifte selv
|
|||
lightweight = Lettvekt
|
||||
license = Åpen kildekode
|
||||
platform_desc = Forgejo fungerer på frie operativsystemer som Linux og FreeBSD, og støtter flere CPU-arkitekturer. Velg den plattformen du foretrekker!
|
||||
license_desc = Last ned <a target="_blank" rel="noopener noreferrer" href="%[1]s">Forgejo</a>! Bli med ved å <a target="_blank" rel="noopener noreferrer" href="%[2]s">bidra</a> for å gjøre prosjektet enda bedre. Ikke vær redd for å bli en bidragsyter!
|
||||
license_desc = Last ned <a target="_blank" rel="noopener noreferrer" href="%[1]s">Forgejo</a>! Bli med ved å <a target="_blank" rel="noopener noreferrer" href="%[2]s">bidra</a> for å gjøre prosjektet enda bedre. Ikke vær redd for å bli en bidragsyter!
|
||||
|
||||
[explore]
|
||||
repos = Repositorier
|
||||
users = Brukere
|
||||
organizations = Organisasjoner
|
||||
go_to = Gå til
|
||||
code = Kode
|
||||
code_last_indexed_at = Sist indeksert %s
|
||||
relevant_repositories_tooltip = Repositorier som er forker eller har ingen tema, ingen ikon, og ingen beskrivelse er gjemt.
|
||||
relevant_repositories = Kun relevante repositorier er vist, <a href="%s">vis ufiltrerte resultater</a>.
|
||||
|
|
@ -178,7 +178,7 @@ contributions_format = {contributions} op {month} {day}, {year}
|
|||
|
||||
[editor]
|
||||
buttons.heading.tooltip = Koptekst toevoegen
|
||||
buttons.bold.tooltip = Vetgedrukte tekst toevoegen
|
||||
buttons.bold.tooltip = Vetgedrukte tekst toevoegen (Ctrl+B / ⌘B)
|
||||
buttons.quote.tooltip = Tekst citeren
|
||||
buttons.code.tooltip = Code toevoegen
|
||||
buttons.link.tooltip = Link toevoegen
|
||||
|
|
@ -188,7 +188,7 @@ buttons.mention.tooltip = Vermeld een gebruiker of team
|
|||
buttons.ref.tooltip = Verwijs naar een issue of pull verzoek
|
||||
buttons.switch_to_legacy.tooltip = Gebruik in plaats daarvan de oude editor
|
||||
buttons.enable_monospace_font = Lettertype monospace inschakelen
|
||||
buttons.italic.tooltip = Schuingedrukte tekst toevoegen
|
||||
buttons.italic.tooltip = Schuingedrukte tekst toevoegen (Ctrl+I / ⌘I)
|
||||
buttons.list.task.tooltip = Een lijst met taken toevoegen
|
||||
buttons.disable_monospace_font = Lettertype monospace uitschakelen
|
||||
buttons.indent.tooltip = Items één niveau lager plaatsen
|
||||
|
|
@ -2035,7 +2035,7 @@ settings.packagist_api_token=API token
|
|||
settings.packagist_package_url=Packagist pakket URL
|
||||
settings.deploy_keys=Deploy sleutels
|
||||
settings.add_deploy_key=Deploy sleutel toevoegen
|
||||
settings.deploy_key_desc=Deploy keys hebben alleen-lezen pull-toegang tot de repository.
|
||||
settings.deploy_key_desc=Deploy sleutels kunnen alleen-lezen of alleen-lezen-schrijftoegang hebben tot de repository.
|
||||
settings.is_writable=Schrijftoegang inschakelen
|
||||
settings.is_writable_info=Sta deze deploy toets toe om te <strong>pushen</strong> naar de repository.
|
||||
settings.no_deploy_keys=Er zijn nog geen deploy sleutels.
|
||||
|
|
@ -2656,7 +2656,7 @@ n_branch_one = %s branch
|
|||
n_branch_few = %s branches
|
||||
n_tag_one = %s tag
|
||||
n_tag_few = %s tags
|
||||
n_commit_one = %d commit
|
||||
n_commit_one = %s commit
|
||||
issues.num_participants_one = %d deelnemer
|
||||
size_format = %[1]s: %[2]s, %[3]s: %[4]s
|
||||
settings.enforce_on_admins = Handhaaf deze regel voor repository admins
|
||||
|
|
|
|||
|
|
@ -91,7 +91,7 @@ preview=Podgląd
|
|||
loading=Ładowanie…
|
||||
|
||||
error=Błąd
|
||||
error404=Strona, do której próbujesz dotrzeć <strong>nie istnieje</strong> lub <strong>nie jesteś autoryzowany</strong> aby go zobaczyć.
|
||||
error404=Strona, do której próbujesz dotrzeć <strong>nie istnieje</strong>, <strong>została usunięta</strong> albo <strong>nie jesteś autoryzowany</strong> aby jej zobaczyć.
|
||||
|
||||
never=Nigdy
|
||||
|
||||
|
|
@ -178,8 +178,8 @@ contributions_few = kontrybucji
|
|||
|
||||
[editor]
|
||||
buttons.heading.tooltip = Dodaj nagłówek
|
||||
buttons.bold.tooltip = Dodaj pogrubiony tekst
|
||||
buttons.italic.tooltip = Dodaj pochyły tekst
|
||||
buttons.bold.tooltip = Dodaj pogrubiony tekst (Ctrl+B / ⌘B)
|
||||
buttons.italic.tooltip = Dodaj pochyły tekst (Ctrl+I / ⌘I)
|
||||
buttons.quote.tooltip = Zacytuj tekst
|
||||
buttons.code.tooltip = Dodaj kod
|
||||
buttons.link.tooltip = Dodaj odnośnik
|
||||
|
|
@ -200,6 +200,10 @@ table_modal.label.rows = Wiersze
|
|||
table_modal.label.columns = Kolumny
|
||||
buttons.unindent.tooltip = Usuń jeden poziom zagnieżdżenia
|
||||
|
||||
link_modal.header = Dodaj link
|
||||
link_modal.url = Url
|
||||
link_modal.description = Opis
|
||||
|
||||
[filter]
|
||||
string.asc = A - Z
|
||||
string.desc = Z - A
|
||||
|
|
@ -3808,7 +3812,7 @@ normal_file = Zwykły plik
|
|||
|
||||
|
||||
[search]
|
||||
search = Wyszukaj...
|
||||
search = Wyszukaj…
|
||||
type_tooltip = Typ wyszukiwania
|
||||
fuzzy = Przybliżone
|
||||
package_kind = Wyszukaj pakiety…
|
||||
|
|
|
|||
|
|
@ -147,7 +147,7 @@ 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_fork = Não são forks
|
||||
filter.not_mirror = Sem espelhos
|
||||
filter.not_template = Sem modelos
|
||||
copy_generic = Copiar para a área de transferência
|
||||
|
|
@ -222,7 +222,7 @@ platform=Multi-plataforma
|
|||
lightweight=Leve e rápido
|
||||
lightweight_desc=Forgejo utiliza poucos recursos e consegue mesmo rodar no barato Raspberry Pi. Economize energia elétrica da sua máquina!
|
||||
license=Código aberto
|
||||
license_desc=Está tudo no <a target="_blank" rel="noopener noreferrer" href="%[1]s">Forgejo</a>! Contribua e torne este projeto ainda melhor. Não tenha vergonha de contribuir!
|
||||
license_desc=Está tudo no <a target="_blank" rel="noopener noreferrer" href="%[1]s">Forgejo</a>! Junte-se a nós e <a target="_blank" rel="noopener noreferrer" href="%[2]s">contribua</a> para tornar este projeto ainda melhor. Não tenha vergonha de contribuir!
|
||||
install_desc = Apenas <a target="_blank" rel="noopener noreferrer" href="%[1]s">rode o binário</a> para a sua plataforma, execute-o com <a target="_blank" rel="noopener noreferrer" href="%[2]s">Docker</a>, ou obtenha-o <a target="_blank" rel="noopener noreferrer" href="%[3]s">empacotado</a>.
|
||||
platform_desc = Forgejo roda em sistemas operacionais livres, como Linux e FreeBSD, assim como em diferentes arquiteturas de processador. Escolha o seu sistema preferido!
|
||||
|
||||
|
|
@ -528,7 +528,7 @@ totp_disabled.subject = A autenticação em dois fatores foi desabilitada
|
|||
removed_security_key.subject = Uma chave de segurança foi removida
|
||||
removed_security_key.text_1 = A chave de segurança "%[1]s" foi removida de sua conta.
|
||||
account_security_caution.text_1 = Caso tenha sido você, este e-mail pode ser ignorado.
|
||||
totp_enrolled.subject = Você ativou TOTP como método 2FA
|
||||
totp_enrolled.subject = Você ativou TOTP como método de autenticação em dois fatores
|
||||
totp_disabled.text_1 = A senha de uso único baseada em tempo (TOTP) na sua conta foi desativada.
|
||||
totp_disabled.no_2fa = Já não existem mais outros métodos de autenticação em dois fatores (2FA) configurados, ou seja, não é mais necessário acessar sua conta com 2FA.
|
||||
removed_security_key.no_2fa = Já não existem mais outros métodos de autenticação em dois fatores (2FA) configurados, ou seja, não é mais necessário acessar sua conta com 2FA.
|
||||
|
|
@ -644,7 +644,7 @@ email_domain_is_not_allowed = O domínio do endereço de email da conta <b>%s</b
|
|||
|
||||
|
||||
[user]
|
||||
change_avatar=Altere seu avatar...
|
||||
change_avatar=Altere seu avatar…
|
||||
joined_on=Inscreveu-se em %s
|
||||
repositories=Repositórios
|
||||
activity=Atividade pública
|
||||
|
|
@ -681,7 +681,7 @@ following.title.one = seguindo
|
|||
followers.title.one = seguidor
|
||||
followers.title.few = seguidores
|
||||
public_activity.visibility_hint.self_private = Sua atividade está visível apenas para você e para os administradores da instância. <a href="%s">Configurar</a>.
|
||||
public_activity.visibility_hint.self_public = Sua atividade está visível para todos, exceto interações em espaços privados. <a href="%s">Configurar</a>.
|
||||
public_activity.visibility_hint.self_public = Sua atividade está visível para todos, exceto as interações em espaços privados. <a href="%s">Clique para configurar</a>.
|
||||
public_activity.visibility_hint.admin_public = Sua atividade está visível para todos, mas como um administrador você também pode ver interações em espaços privados.
|
||||
public_activity.visibility_hint.admin_private = Essa atividade está visível para você porque você é um administrador, mas o usuário dejesa que ela seja mantida em privado.
|
||||
public_activity.visibility_hint.self_private_profile = Sua atividade só é visível para você e para os administradores do servidor porque seu perfil é privado. <a href="%s">Configurar</a>.
|
||||
|
|
@ -992,7 +992,7 @@ 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 = Exibir uma sugestão para "Habilitar mais" em repositórios que não possuem todas as unidades disponíveis habilitadas.
|
||||
update_hints = Dicas de atualização
|
||||
update_hints = Atualizar dicas
|
||||
update_hints_success = As dicas foram atualizadas.
|
||||
keep_activity_private.description = A sua <a href="%s">atividade pública</a> estará visível apenas para si e para os administradores do servidor.
|
||||
language.localization_project = Ajude-nos a traduzir Forgejo para o seu idioma! <a href="%s">Mais informações</a>.
|
||||
|
|
@ -1303,14 +1303,14 @@ editor.patch=Aplicar correção
|
|||
editor.patching=Corrigindo:
|
||||
editor.fail_to_apply_patch=`Não foi possível aplicar a correção "%s"`
|
||||
editor.new_patch=Novo patch
|
||||
editor.commit_message_desc=Adicione uma descrição detalhada (opcional)...
|
||||
editor.commit_message_desc=Adicione uma descrição detalhada (opcional)…
|
||||
editor.signoff_desc=Adicione um assinado-por-committer no final do log do commit.
|
||||
editor.commit_directly_to_this_branch=Commit diretamente no branch <strong class="%[2]s">%[1]s</strong>.
|
||||
editor.create_new_branch=Crie um <strong>novo branch</strong> para este commit e crie um pull request.
|
||||
editor.create_new_branch_np=Crie um <strong>novo branch</strong> para este commit.
|
||||
editor.propose_file_change=Propor alteração de arquivo
|
||||
editor.new_branch_name=Nome do novo branch para este commit
|
||||
editor.new_branch_name_desc=Novo nome do branch...
|
||||
editor.new_branch_name_desc=Nome do novo ramo…
|
||||
editor.cancel=Cancelar
|
||||
editor.filename_cannot_be_empty=Nome do arquivo não pode ser em branco.
|
||||
editor.filename_is_invalid=O nome do arquivo é inválido: "%s".
|
||||
|
|
@ -1331,7 +1331,7 @@ editor.fail_to_update_file_summary=Mensagem de erro:
|
|||
editor.push_rejected_no_message=A alteração foi rejeitada pelo servidor sem uma mensagem. Por favor, verifique os Git hooks .
|
||||
editor.push_rejected=A alteração foi rejeitada pelo servidor. Por favor, verifique os Git hooks .
|
||||
editor.push_rejected_summary=Mensagem completa de rejeição:
|
||||
editor.add_subdir=Adicionar um subdiretório...
|
||||
editor.add_subdir=Adicionar uma pasta…
|
||||
editor.unable_to_upload_files=Ocorreu um erro ao enviar arquivos para "%s": %v
|
||||
editor.upload_file_is_locked=Arquivo "%s" está bloqueado por %s.
|
||||
editor.upload_files_to_dir=`Enviar arquivos para "%s"`
|
||||
|
|
@ -1523,7 +1523,7 @@ issues.action_assignee_no_select=Sem responsável
|
|||
issues.action_check=Marcar/Desmarcar
|
||||
issues.action_check_all=Marcar/Desmarcar todos os itens
|
||||
issues.opened_by=aberto por <a href="%[2]s">%[3]s</a> %[1]s
|
||||
pulls.merged_by=por <a href="%[2]s">%[3]s</a> foi aplicado em %[1]s
|
||||
pulls.merged_by=por <a href="%[2]s">%[3]s</a> foi aplicado %[1]s
|
||||
pulls.merged_by_fake=por %[2]s foi aplicado %[1]s
|
||||
issues.closed_by=por <a href="%[2]s">%[3]s</a> foi fechada %[1]s
|
||||
issues.opened_by_fake=%[1]s abertas por %[2]s
|
||||
|
|
@ -2258,7 +2258,7 @@ settings.packagist_api_token=Token de API
|
|||
settings.packagist_package_url=URL do pacote do Packagist
|
||||
settings.deploy_keys=Chaves de deploy
|
||||
settings.add_deploy_key=Adicionar chave de deploy
|
||||
settings.deploy_key_desc=As chaves de deploy possuem somente acesso de leitura (pull) ao repositório.
|
||||
settings.deploy_key_desc=As chaves de deploy podem ter acesso ao repositório somente para leitura ou para leitura e escrita.
|
||||
settings.is_writable=Habilitar acesso de escrita
|
||||
settings.is_writable_info=Permitir que esta chave de deploy faça <strong>push</strong> para o repositório.
|
||||
settings.no_deploy_keys=Não há nenhuma chave de deploy ainda.
|
||||
|
|
@ -2321,7 +2321,7 @@ settings.block_outdated_branch_desc=O merge não será possível quando o branch
|
|||
settings.default_branch_desc=Selecione um branch padrão para pull requests e commits de código:
|
||||
settings.merge_style_desc=Estilos de merge
|
||||
settings.default_merge_style_desc=Estilo de merge padrão
|
||||
settings.choose_branch=Escolha um branch...
|
||||
settings.choose_branch=Escolha um ramo…
|
||||
settings.no_protected_branch=Não há branches protegidos.
|
||||
settings.edit_protected_branch=Editar
|
||||
settings.protected_branch_required_rule_name=Nome da regra é obrigatório
|
||||
|
|
@ -2663,7 +2663,7 @@ mirror_use_ssh.helper = Forgejo irá espelhar o repositório via Git através de
|
|||
mirror_denied_combination = Não é possível combinar o uso de chave pública e autenticação baseada em senha.
|
||||
mirror_public_key = Chave SSH pública
|
||||
mirror_use_ssh.text = Usar autenticação por SSH
|
||||
mirror_use_ssh.not_available = A autenticação via SSH não está disponível.
|
||||
mirror_use_ssh.not_available = A autenticação SSH não está disponível.
|
||||
settings.push_mirror_sync_in_progress = Fazendo push das mudanças para o remoto %s nesse momento.
|
||||
settings.federation_apapiurl = URL de federação deste repositório. Copie e cole isso nas Configurações de Federação de outro repositório como uma URL de um Repositório Seguidor.
|
||||
pulls.agit_explanation = Criado usando o fluxo de trabalho AGit. AGit permite que contribuidores proponham mudanças usando "git push" sem criar um fork ou novo branch.
|
||||
|
|
@ -2768,8 +2768,8 @@ issues.filter_no_results_placeholder = Tente ajustar seus filtros de pesquisa.
|
|||
archive.nocomment = Não é possível comentar pois o repositório foi arquivado.
|
||||
migrate.repo_desc_helper = Deixe em branco para importar a descrição existente
|
||||
comment.blocked_by_user = Não é possível comentar pois você foi bloqueado pelo dono ou autor do repositório.
|
||||
sync_fork.branch_behind_few = Este branch está %[1]d commits atrás de %[2]s
|
||||
sync_fork.branch_behind_one = Este branch está %[1]d commit atrás de %[2]s
|
||||
sync_fork.branch_behind_few = Este ramo está %[1]d commits atrás de %[2]s
|
||||
sync_fork.branch_behind_one = Esta branch está %[1]d commit atrás de %[2]s
|
||||
sync_fork.button = Sincronizar
|
||||
settings.event_header_action = Eventos de execução de Actions
|
||||
settings.event_action_failure = Falha
|
||||
|
|
@ -3001,9 +3001,9 @@ dashboard.delete_old_actions.started=A exclusão de todas as atividades antigas
|
|||
dashboard.update_checker=Verificador de atualização
|
||||
dashboard.delete_old_system_notices=Excluir todos os avisos de sistema antigos do banco de dados
|
||||
dashboard.gc_lfs=Coletar lixos dos meta-objetos LFS
|
||||
dashboard.stop_zombie_tasks=Parar tarefas de actions zumbi
|
||||
dashboard.stop_endless_tasks=Parar tarefas infinitas de actions
|
||||
dashboard.cancel_abandoned_jobs=Cancelar trabalhos abandonados de actions
|
||||
dashboard.stop_zombie_tasks=Parar tarefas de Actions zumbis
|
||||
dashboard.stop_endless_tasks=Parar tarefas de Actions intermináveis
|
||||
dashboard.cancel_abandoned_jobs=Cancelar trabalhos abandonados de Actions
|
||||
|
||||
users.user_manage_panel=Gerenciar contas de usuário
|
||||
users.new_account=Criar conta de usuário
|
||||
|
|
@ -3406,7 +3406,7 @@ notices.delete_success=Os avisos do sistema foram excluídos.
|
|||
identity_access = Identidade e acesso
|
||||
settings = Configurações de administrador
|
||||
users.bot = Robô
|
||||
dashboard.start_schedule_tasks = Iniciar tarefas de actions programadas
|
||||
dashboard.start_schedule_tasks = Iniciar tarefas de Actions programadas
|
||||
users.reserved = Reservado
|
||||
emails.change_email_text = Tem certeza de que deseja atualizar este endereço de e-mail?
|
||||
self_check = Autoverificação
|
||||
|
|
@ -3817,7 +3817,7 @@ variables.id_not_exist = A variável com o ID %d não existe.
|
|||
variables.deletion.failed = Falha ao remover a variável.
|
||||
variables.creation.failed = Falha ao adicionar a variável.
|
||||
runs.no_results = Nenhum resultado.
|
||||
variables.description = As variáveis serão passadas para certas ações e não poderão ser lidas de outra forma.
|
||||
variables.description = As variáveis serão passadas para certas Actions e não poderão ser lidas de outra forma.
|
||||
workflow.dispatch.trigger_found = Este workflow tem um disparador de evento <c>workflow_dispatch</c>.
|
||||
workflow.dispatch.run = Executar workflow
|
||||
runs.no_runs = O workflow ainda não foi executado.
|
||||
|
|
|
|||
|
|
@ -2319,7 +2319,7 @@ settings.packagist_api_token=Código da API
|
|||
settings.packagist_package_url=URL do pacote Packagist
|
||||
settings.deploy_keys=Chaves de instalação
|
||||
settings.add_deploy_key=Adicionar chave de instalação
|
||||
settings.deploy_key_desc=Chaves de instalação têm acesso para puxar do repositório apenas em modo de leitura.
|
||||
settings.deploy_key_desc=Chaves de instalação podem ter acesso ao repositório apenas para leitura ou de leitura e escrita.
|
||||
settings.is_writable=Habilitar acesso de escrita
|
||||
settings.is_writable_info=Permitir a esta chave de instalação <strong>enviar</strong> para o repositório.
|
||||
settings.no_deploy_keys=Ainda não existem quaisquer chaves de instalação.
|
||||
|
|
|
|||
|
|
@ -275,6 +275,11 @@ require_sign_in_view.description = Limitează accesul la conținut către utiliz
|
|||
invalid_db_setting = Setările pentru bază de date sunt invalide: %v
|
||||
no_reply_address = Domeniu pentru adrese de email ascunse
|
||||
|
||||
host = Gazdă
|
||||
app_name_helper = Introdu numele instanței aici. Va fi afișat pe fiecare pagină.
|
||||
app_slogan = Sloganul instanței
|
||||
app_slogan_helper = Introdu sloganul instanței aici. Lasă gol pentru a dezactiva.
|
||||
|
||||
[search]
|
||||
user_kind = Căutați utilizatori…
|
||||
team_kind = Căutați echipe…
|
||||
|
|
|
|||
|
|
@ -80,7 +80,7 @@ rerun_all=Перезапустить все задания
|
|||
save=Сохранить
|
||||
add=Добавить
|
||||
add_all=Включить все
|
||||
remove=Исключить
|
||||
remove=Удалить
|
||||
remove_all=Исключить все
|
||||
remove_label_str=Удалить элемент «%s»
|
||||
edit=Изменить
|
||||
|
|
@ -1092,7 +1092,7 @@ mirror_password_placeholder=(Неизменный)
|
|||
mirror_password_blank_placeholder=(Отменено)
|
||||
mirror_password_help=Смените имя пользователя для удаления пароля.
|
||||
watchers=Наблюдатели
|
||||
stargazers=Звездочеты
|
||||
stargazers=Добавившие в избранное
|
||||
stars_remove_warning=Данное действие удалит все звёзды из этого репозитория.
|
||||
forks=Ответвления
|
||||
reactions_more=и ещё %d
|
||||
|
|
@ -2271,7 +2271,7 @@ settings.packagist_api_token=Токен API
|
|||
settings.packagist_package_url=Ссылка на пакет Packagist
|
||||
settings.deploy_keys=Ключи развёртывания
|
||||
settings.add_deploy_key=Добавить ключ развёртывания
|
||||
settings.deploy_key_desc=Ключи развёртывания предоставляют доступ к репозиторию только для чтения.
|
||||
settings.deploy_key_desc=Ключи развёртывания дают доступ к просмотру репозитория и опционально к отправке изменений.
|
||||
settings.is_writable=Разрешить запись
|
||||
settings.is_writable_info=Может ли этот ключ быть использован для выполнения <strong>push</strong> в репозиторий? Ключи развёртывания всегда имеют доступ на pull.
|
||||
settings.no_deploy_keys=Вы не добавляли ключи развёртывания.
|
||||
|
|
|
|||
|
|
@ -3,20 +3,20 @@ home=Почетна
|
|||
dashboard=Контролни панел
|
||||
explore=Преглед
|
||||
help=Помоћ
|
||||
sign_in=Пријавите Се
|
||||
sign_in=Пријави се
|
||||
sign_out=Одјава
|
||||
register=Регистрација
|
||||
register=Региструј се
|
||||
version=Верзија
|
||||
page=Страница
|
||||
template=Шаблон
|
||||
language=Језик
|
||||
signed_in_as=Пријављени сте као
|
||||
signed_in_as=Пријављен си као
|
||||
|
||||
username=Корисничко име
|
||||
password=Лозинка
|
||||
|
||||
|
||||
repository=Спремиште
|
||||
repository=Репозиторијум
|
||||
organization=Организација
|
||||
mirror=Огледало
|
||||
new_mirror=Ново огледало
|
||||
|
|
@ -24,60 +24,81 @@ settings=Подешавања
|
|||
|
||||
|
||||
activities=Активности
|
||||
pull_requests=Захтеви за спајање
|
||||
pull_requests=Pull requesti
|
||||
issues=Дискусије
|
||||
|
||||
cancel=Откажи
|
||||
cancel=Прекини
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
logo = Лого
|
||||
sign_in_with_provider = Пријавите се уз %s
|
||||
sign_in_or = или
|
||||
sign_up = Региструјте се
|
||||
link_account = Повежите рачун
|
||||
powered_by = Успостављено са %s
|
||||
notifications = Обавештења
|
||||
passcode = ПИН ко̑д
|
||||
webauthn_insert_key = Прикључите Ваш физички сигурносни кључ
|
||||
webauthn_sign_in = Притисните дугме на Вашем сигурносном кључу. Уколико Ваш кључ нема дугме, искључите и поново укључите га.
|
||||
webauthn_press_button = Молимо притисните дугме на Вашем сигурносном кључу…
|
||||
webauthn_use_twofa = Користите дво-факторски ко̑д са вашег мобитела
|
||||
webauthn_error = Сигурносни кључ се не да исчитати.
|
||||
webauthn_unsupported_browser = Ваш веб-прегледач тренутно не подржава "WebAuthn".
|
||||
webauthn_error_unknown = Непозната грешка се догодила. Молимо Вас да покушате поново.
|
||||
webauthn_error_insecure = "WebAuthn" једино подржава сигурне везе. За тестирање путем ХТТП, можете корисити извор "localhost" или "127.0.0.1"
|
||||
webauthn_error_unable_to_process = Сервер не може обрадити Ваш захтев.
|
||||
webauthn_error_duplicated = Сигурносни кључ није дозвољен за овај захтев. Уверите се да кључ није већ регистрован.
|
||||
webauthn_error_empty = Морате унети име за овај кључ.
|
||||
webauthn_error_timeout = Захтев је истекао пре што је очитавање Вашег кључа успео. Молимо Вас да актуализирате ову веб-страницу и покушате поново.
|
||||
|
||||
[error]
|
||||
|
||||
[startpage]
|
||||
|
||||
[install]
|
||||
install=Инсталација
|
||||
db_title=Подешавања базе
|
||||
db_title=Подешавање базе података
|
||||
db_type=Тип базе података
|
||||
host=Хост
|
||||
host=Сервер
|
||||
password=Лозинка
|
||||
db_name=Име базе података
|
||||
path=Пут
|
||||
path=Пут (path)
|
||||
|
||||
repo_path=Пут до корена спремишта
|
||||
repo_path=Пут до корена репозиторијума
|
||||
log_root_path=Пут до журнала
|
||||
|
||||
optional_title=Напредна подешавања
|
||||
optional_title=Даљна подешавања
|
||||
admin_password=Лозинка
|
||||
confirm_password=Потврдите лозинку
|
||||
install_btn_confirm=Успостави Forgejo
|
||||
confirm_password=Потврди лозинку
|
||||
install_btn_confirm=Инсталирај Forgejo
|
||||
test_git_failed=Команда 'git' није успела: %v
|
||||
|
||||
[home]
|
||||
switch_dashboard_context=Пребаците контекст контролној панели
|
||||
my_orgs=Моје организације
|
||||
switch_dashboard_context=Пребаци контекст контролног панела
|
||||
my_orgs=Организације
|
||||
view_home=Прикажи %s
|
||||
|
||||
|
||||
|
||||
issues.in_your_repos=У вашим спремиштима
|
||||
issues.in_your_repos=У вашим Репозиторијумима
|
||||
|
||||
[explore]
|
||||
repos=Спремишта
|
||||
repos=Репозиторијуми
|
||||
users=Корисници
|
||||
|
||||
[auth]
|
||||
active_your_account=Активирајте ваш налог
|
||||
has_unconfirmed_mail=Здраво, %s! Имате непотврђену адресу е-поште (<b>%s</b>). Ако вам није стигло писмо са потврдом или морате да пошаљете нову поруку, притисните на пратеће дугме.
|
||||
resend_mail=Кликните овде да поново пошаљете писмо
|
||||
active_your_account=Активирајте Ваш кориснички рачун
|
||||
has_unconfirmed_mail=Здраво, %s! Имате непотврђену имејл адресу (<b>%s</b>). Ако Вам није стигло писмо са потврдом или морате да пошаљете нову поруку, притисните пратеће дугме.
|
||||
resend_mail=Кликни овде да поново пошаљеш писмо
|
||||
|
||||
[mail]
|
||||
activate_account=Молимо вас активирајте ваш налог
|
||||
activate_account=Молимо активирајте Ваш кориснички рачун
|
||||
|
||||
activate_email=Потврдите вашу адресу е-поште
|
||||
activate_email=Потврди твоју адресу е-поште
|
||||
|
||||
|
||||
|
||||
|
|
@ -93,44 +114,113 @@ no=Не
|
|||
|
||||
[form]
|
||||
UserName=Корисничко име
|
||||
RepoName=Име спремишта
|
||||
Email=Адреса ел. поште
|
||||
RepoName=Име репозиторијума
|
||||
Email=Имејл адреса
|
||||
Password=Лозинка
|
||||
PayloadUrl=URL адреса за слање
|
||||
TeamName=Име тима
|
||||
AuthName=Ауторизацијско име
|
||||
AdminEmail=Адреса е-поште администратора
|
||||
AuthName=Назив ауторизације
|
||||
AdminEmail=Имејл адреса администратора
|
||||
|
||||
NewBranchName=Име нове гране
|
||||
CommitSummary=Опис за ревизију
|
||||
CommitMessage=Ревизни текст
|
||||
CommitSummary=Опис ревизије
|
||||
CommitMessage=Текст ревизије
|
||||
CommitChoice=Избор ревизије
|
||||
TreeName=Пут до датотеке
|
||||
Content=Садржај
|
||||
|
||||
|
||||
require_error=` не може бити празно.`
|
||||
require_error=` не сме бити празно.`
|
||||
size_error=` мора бити величине %s.`
|
||||
min_size_error=` мора да садржи најмање %s карактера.`
|
||||
max_size_error=` мора да садржи највише %s карактера.`
|
||||
email_error=` није важећа адреса е-поште.`
|
||||
min_size_error=` мора да садржи најмање %s знакова.`
|
||||
max_size_error=` мора да садржи највише %s знакова.`
|
||||
email_error=` није важећа имејл адреса.`
|
||||
url_error=` није исправна URL адреса.`
|
||||
include_error=` мора да садржи текст '%s'.`
|
||||
unknown_error=Непозната грешка:
|
||||
|
||||
|
||||
auth_failed=Грешка идентитета: %v
|
||||
auth_failed=Грешка аутентикације: %v
|
||||
|
||||
|
||||
target_branch_not_exist=Ова грана не постоји.
|
||||
target_branch_not_exist=Циљна грана не постоји.
|
||||
|
||||
Biography = Биографија
|
||||
Website = Веб-сајт
|
||||
Location = Место
|
||||
Retype = Потврди лозинку
|
||||
To = Име гране
|
||||
alpha_dash_error = ` сме само да садржи слова, бројки, црта ("-") и доњих црта ("_"). `
|
||||
alpha_dash_dot_error = ` сме само да садржи слова, бројки, црта ("-"), доњих црта ("_") као и тачки ("."). `
|
||||
username_error = ` сме само да садржи слова, бројки, црта ("-") и доњих црта ("_") као и тачки ("."). Не сме да почне или заврши са другим знаком од слоба или бројке, и те друге знакове не смеју бити један за другим. `
|
||||
username_error_no_dots = ` сме само да садржи слова, бројки, црта ("-") и доњих црта ("_"). Не сме да почне или заврши са другим знаком од слоба или бројке, и те друге знакове не смеју бити један за другим. `
|
||||
captcha_incorrect = CAPTCHA ко̑д је погрешан.
|
||||
password_not_match = Лозинке нису једнаке.
|
||||
lang_select_error = Изабери језик са листе.
|
||||
username_been_taken = Корисничко име је већ заузето.
|
||||
username_change_not_local_user = Корисници који нису локални не смеју да мењају корисничко име.
|
||||
username_claiming_cooldown = Корисничко име не може се изабрати јер је у заштићеном периоду. Оно стоји на располагању од/за %[1]s.
|
||||
repo_name_been_taken = Име репозиторијума је већ заузето.
|
||||
org_name_been_taken = Име организације је већ заузето.
|
||||
team_name_been_taken = Име тима је већ заузето.
|
||||
team_no_units_error = Тим мора имати приступ барем једној секцији репозиторијума.
|
||||
email_been_used = Та имејл адреса се већ користи.
|
||||
email_invalid = Та имејл адреса је неважећа.
|
||||
email_domain_is_not_allowed = Домена имејл адресе корисника <b>%s</b> је у сукобу са EMAIL_DOMAIN_ALLOWLIST или EMAIL_DOMAIN_BLOCKLIST. Провери да ли је имејл адреса исправна.
|
||||
openid_been_used = ОпенИД адреса "%s" се већ користи.
|
||||
username_password_incorrect = Корисничко име или лозинка је неисправна.
|
||||
password_complexity = Лозинка није у складу са захтевима комплексности:
|
||||
password_lowercase_one = Најмање једно мало слово
|
||||
password_uppercase_one = Најмање једно велико слово
|
||||
password_digit_one = Најмање једна бројка
|
||||
password_special_one = Најмање један посебан знак (пунктуација, заграде, наводници, итд.)
|
||||
enterred_invalid_repo_name = Име репозиторијума је неважећ.
|
||||
enterred_invalid_org_name = Име организације је неважећ.
|
||||
enterred_invalid_owner_name = Ново име власника је неважећ.
|
||||
enterred_invalid_password = Уписана лозинка је неважећа.
|
||||
unset_password = Корисник нема спремљену лозинку.
|
||||
unsupported_login_type = Начин пријаве не подржава брисанје корисничког рачуна.
|
||||
user_not_exist = Корисник не постоји.
|
||||
team_not_exist = Тим не постоји.
|
||||
last_org_owner = Не може се избрисати задњи корисник из тима власника. Мора бити најмање један власник у организацији.
|
||||
cannot_add_org_to_team = Организација не може бити члан у тимовима.
|
||||
duplicate_invite_to_team = Корисник је већ позван да буде члан тима.
|
||||
organization_leave_success = Излазак из организације %s је био успешан.
|
||||
invalid_ssh_key = Твој ССХ кључ се не да проверити: %s
|
||||
invalid_gpg_key = Твој ГПГ кључ се не да проверити: %s
|
||||
must_use_public_key = Наведен кључ је приватни кључ. Молимо Вас да не преносите било где на интернет свој приватан кључ. Користите јаван кљил за те сврхе.
|
||||
unable_verify_ssh_key = Неможемо потврдити ССХ кључ, проверите га да нема грешки.
|
||||
still_own_repo = Ваш кориснички рачун је власник једног или више репозиторијума, прво их обришите или предајте другом кориснику.
|
||||
still_has_org = Ваш кориснички рачун је члан једне или више организација, молимо прво да из њих изађете.
|
||||
still_own_packages = Ваш кориснички рачун је власник једног или више пакета, молимо прво да их обришете.
|
||||
org_still_own_repo = Та организација је власник једног или више репозиторијума, молимо прво да их обришете.
|
||||
org_still_own_packages = Та организација је власник једног или више пакета, молимо прво да их обришете.
|
||||
admin_cannot_delete_self = Не можеш самог себе избрисати док си администратор. Молимо прво да укинеш своја администраторска права.
|
||||
|
||||
[user]
|
||||
repositories=Спремишта
|
||||
activity=Активности
|
||||
repositories=Репозиторијуми
|
||||
activity=Јавне активности
|
||||
follow=Прати
|
||||
unfollow=Престани да пратиш
|
||||
unfollow=Престани пратити
|
||||
|
||||
|
||||
change_avatar = Измени слику профила…
|
||||
joined_on = Приступео/ла %s
|
||||
followers.title.one = Пратилац
|
||||
followers.title.few = Пратиоци
|
||||
following.title.one = Прати
|
||||
following.title.few = Прате
|
||||
followers_one = %d пратилац
|
||||
followers_few = %d пратиоца
|
||||
following_one = %d пратим
|
||||
following_few = %d пратим
|
||||
block_user = Блокирај корисника
|
||||
block_user.detail = Молимо обратите пажњу да блокирати корисника има даљњих последица, као на пример:
|
||||
block_user.detail_1 = Престаћете пратити и нећете више моћи пратити један другога.
|
||||
block_user.detail_2 = Тај корисник неће моћи интерагирати са репозиторијумима које Ви поседујете, као и са задатцима и коментарима које сте ви написали.
|
||||
block_user.detail_3 = Нећете моћи додати један другога као сарадника у репозиторијумима.
|
||||
follow_blocked_user = Не можете пратити овог корисника јер сте блокирали тог корисника или је тај корисник Вас блокирао.
|
||||
|
||||
[settings]
|
||||
profile=Профил
|
||||
password=Лозинка
|
||||
|
|
@ -147,15 +237,15 @@ cancel=Откажи
|
|||
|
||||
enable_custom_avatar=Укључи ваш аватар
|
||||
choose_new_avatar=Изаберите нови аватар
|
||||
delete_current_avatar=Обришите тренутни аватар
|
||||
delete_current_avatar=Обришите тренутну слику профила
|
||||
|
||||
old_password=Тренутна лозинка
|
||||
new_password=Нова лозинка
|
||||
|
||||
email_desc=Ваша главна адреса ће се користити за обавештења и других операција.
|
||||
email_desc=Ваша главна адреса ће се користити за обавештења, подршку код изгубљене лозинке као и, уколико није сакривено, Гит операције путем веба.
|
||||
primary=Главно
|
||||
|
||||
manage_ssh_keys=Управљање SSH кључева
|
||||
manage_ssh_keys=Управљање ССХ кључева
|
||||
add_key=Додај кључ
|
||||
key_name=Име кључа
|
||||
key_content=Садржај
|
||||
|
|
@ -172,25 +262,25 @@ delete_token=Уклони
|
|||
|
||||
|
||||
|
||||
delete_account=Уклоните ваш налог
|
||||
delete_account=Уклоните ваш рачун
|
||||
confirm_delete_account=Потврдите брисање
|
||||
|
||||
|
||||
|
||||
[repo]
|
||||
owner=Власник
|
||||
repo_name=Име спремишта
|
||||
repo_name=Име репозиторијума
|
||||
visibility=Видљивост
|
||||
fork_repo=Креирај огранак спремишта
|
||||
fork_repo=Креирај огранак репозиторијума
|
||||
fork_from=Огранак од
|
||||
repo_desc=Опис
|
||||
repo_lang=Језик
|
||||
license=Лиценца
|
||||
create_repo=Ново спремиште
|
||||
create_repo=Створи нов репозиторијум
|
||||
default_branch=Главна грана
|
||||
mirror_prune=Очисти
|
||||
watchers=Посматрачи
|
||||
stargazers=Пратиоци
|
||||
stargazers=Фаворисано од
|
||||
forks=Огранци
|
||||
|
||||
|
||||
|
|
@ -198,8 +288,8 @@ forks=Огранци
|
|||
|
||||
|
||||
|
||||
migrate_repo=Мигрирајте спремиште
|
||||
migrate.permission_denied=Немате права на увезете локално спремиште.
|
||||
migrate_repo=Мигрирајте репозиторијум
|
||||
migrate.permission_denied=Немате права да импортирате локалан репозиторијум.
|
||||
migrate.failed=Миграција није успела: %v
|
||||
|
||||
mirror_from=огледало од
|
||||
|
|
@ -212,7 +302,7 @@ fork=Креирај огранак
|
|||
|
||||
no_desc=Нема описа
|
||||
quick_guide=Кратак водич
|
||||
clone_this_repo=Клонирај спремиште
|
||||
clone_this_repo=Клонирај репозиторијум
|
||||
|
||||
code=Код
|
||||
branch=Грана
|
||||
|
|
@ -242,12 +332,12 @@ editor.delete=Уклони '%s'
|
|||
editor.commit_directly_to_this_branch=Изврши комит директно на <strong class="%[2]s">%[1]s</strong> грану.
|
||||
editor.create_new_branch=Креирај <strong>нову грану</strong> за овај комит и поднеси захтев за спајање.
|
||||
editor.cancel=Откажи
|
||||
editor.branch_already_exists=Грана '%s' већ постоји за ово спремиште.
|
||||
editor.branch_already_exists=Грана '%s' већ постоји за овај репозиторијум.
|
||||
editor.no_changes_to_show=Нема никаквих промена.
|
||||
editor.unable_to_upload_files=Учитање датотеке '%s' није успело са грешкном: %v
|
||||
editor.upload_files_to_dir=Пошаљи датотеке на '%s'
|
||||
|
||||
commits.commits=Комити
|
||||
commits.commits=Ревизије
|
||||
commits.author=Аутор
|
||||
commits.message=Порука
|
||||
commits.date=Датум
|
||||
|
|
@ -292,12 +382,12 @@ issues.next=Следеће
|
|||
issues.open_title=Отворено
|
||||
issues.closed_title=Затворено
|
||||
issues.num_comments=%d коментара
|
||||
issues.commented_at=`коментирира <a href="#%s">%s</a>`
|
||||
issues.commented_at=`је коментирио/ла <a href="#%s">%s</a>`
|
||||
issues.delete_comment_confirm=Да ли желите да избришете овај коментар?
|
||||
issues.no_content=Још нема садржаја.
|
||||
issues.reopen_issue=Поново отвори
|
||||
issues.create_comment=Коментирај
|
||||
issues.commit_ref_at=`поменуо овај задатак у комит %s`
|
||||
issues.create_comment=Коментирајте
|
||||
issues.commit_ref_at=`поменуо овај задатак у ревизији %s`
|
||||
issues.sign_in_require_desc=<a href="%s">Пријавите се</a> да се прикључе у овом разговору.
|
||||
issues.edit=Уреди
|
||||
issues.cancel=Откажи
|
||||
|
|
@ -317,7 +407,7 @@ pulls.filter_branch=Филтер по грани
|
|||
pulls.no_results=Нема резултата.
|
||||
pulls.create=Поднеси захтев за спајање
|
||||
pulls.tab_conversation=Дискусија
|
||||
pulls.tab_commits=Комити
|
||||
pulls.tab_commits=Ревизије
|
||||
pulls.merged=Спојено
|
||||
pulls.can_auto_merge_desc=Овај захтев за спајање може бити обављен аутоматски.
|
||||
|
||||
|
|
@ -364,17 +454,17 @@ settings.tracker_url_format=Спољни формат везе система з
|
|||
settings.tracker_issue_style.numeric=Нумерично
|
||||
settings.tracker_issue_style.alphanumeric=Алфанумерично
|
||||
settings.danger_zone=Опасна зона
|
||||
settings.new_owner_has_same_repo=Нови власник већ има спремиште по истим називом. Молимо вас изаберите друго име.
|
||||
settings.new_owner_has_same_repo=Нови власник већ има репозиторијум под истим именом. Молимо Вас да изаберете друго име.
|
||||
settings.transfer_owner=Нови власник
|
||||
settings.delete=Уклони ово спремиште
|
||||
settings.delete_notices_1=- Ова операција <strong>НЕЋЕ МОЧИ</strong> бити укинута.
|
||||
settings.delete=Уклони овај репозиторијум
|
||||
settings.delete_notices_1=- Ова операција <strong>НЕ МОЖЕ СЕ</strong> накнадно повући.
|
||||
settings.add_webhook=Додај Webhook
|
||||
settings.webhook.test_delivery=Провери испоруку
|
||||
settings.webhook.request=Захтев
|
||||
settings.webhook.response=Одговор
|
||||
settings.webhook.headers=Наслови
|
||||
settings.webhook.body=Тело
|
||||
settings.githook_edit_desc=Aко Webhook није активан, примерни садржај ће бити представљен. Ако оставите празно, Webhook ће бити онемогућен.
|
||||
settings.githook_edit_desc=Aко "Webhook" није активан, примерни садржај ће бити представљен. Ако оставите празно, Webhook ће бити онемогућен.
|
||||
settings.githook_name=Име Hook-а
|
||||
settings.githook_content=Садржај Hook-а
|
||||
settings.update_githook=Ажурирај Hook
|
||||
|
|
@ -382,7 +472,7 @@ settings.secret=Тајна
|
|||
settings.slack_username=Корисничко име
|
||||
settings.slack_icon_url=URL адреса иконице
|
||||
settings.event_create=Креирај
|
||||
settings.event_pull_request=Захтев за спајање
|
||||
settings.event_pull_request=Измене
|
||||
settings.update_webhook=Ажурирај Webhook
|
||||
settings.recent_deliveries=Недавне испоруке
|
||||
settings.hook_type=Тип Hook-а
|
||||
|
|
@ -429,7 +519,7 @@ create_org=Створи Организацију
|
|||
repo_updated=Ажурирано
|
||||
teams=Тимови
|
||||
lower_members=чланови
|
||||
lower_repositories=спремишта
|
||||
lower_repositories=репозиторијуми
|
||||
org_desc=Опис
|
||||
team_name=Име тима
|
||||
team_desc=Опис
|
||||
|
|
@ -461,14 +551,14 @@ teams.no_desc=Овај тим нема описа
|
|||
teams.settings=Подешавања
|
||||
teams.members=Чланови тима
|
||||
teams.update_settings=Примени промене
|
||||
teams.add_team_member=Додај члан тиму
|
||||
teams.add_team_member=Додајте члан тиму
|
||||
teams.repositories=Тимска спремишта
|
||||
teams.add_nonexistent_repo=Овакво спремиште не постоји, молим вас прво да га направите.
|
||||
teams.add_nonexistent_repo=Овакав репозиторијум не постоји, молимо Вас прво да га направите.
|
||||
|
||||
[admin]
|
||||
dashboard=Контролни панел
|
||||
organizations=Организације
|
||||
repositories=Спремишта
|
||||
repositories=Репозиторијуми
|
||||
config=Подешавања
|
||||
notices=Системска обавештења
|
||||
monitor=Праћење
|
||||
|
|
@ -487,7 +577,7 @@ dashboard.memory_obtained=Коришћена меморија
|
|||
dashboard.pointer_lookup_times=Захтева показивача
|
||||
dashboard.current_heap_usage=Тренутна употреба динамичке меморије
|
||||
dashboard.heap_memory_obtained=Слободно динамичке меморије
|
||||
dashboard.heap_memory_idle=Неактиво динамичке меморије
|
||||
dashboard.heap_memory_idle=Некориштена динамичка меморија
|
||||
dashboard.heap_memory_in_use=Динамичка меморија у употреби
|
||||
dashboard.heap_memory_released=Ослобођено динамичке меморије
|
||||
dashboard.heap_objects=Објекти динамичке меморије
|
||||
|
|
@ -497,7 +587,7 @@ dashboard.mspan_structures_usage=Употреба структуре MSpan
|
|||
dashboard.mspan_structures_obtained=Добијено структуре MSpan
|
||||
dashboard.mcache_structures_usage=Употреба структурa MCache
|
||||
dashboard.mcache_structures_obtained=Добијено структурa MCache
|
||||
dashboard.profiling_bucket_hash_table_obtained=Хеш-таблеа постигнуто за Profiling Bucket
|
||||
dashboard.profiling_bucket_hash_table_obtained=Хеш-табела постигнуто за Profiling Bucket
|
||||
dashboard.gc_metadata_obtained=Добијених метаподатака cакупљању смећа
|
||||
dashboard.other_system_allocation_obtained=Добијено друга системска меморија
|
||||
dashboard.next_gc_recycle=Следећа рециклажа cакупљању смећа
|
||||
|
|
@ -508,7 +598,7 @@ dashboard.gc_times=Времена cакупљању смећа
|
|||
|
||||
users.activated=Активиран
|
||||
users.admin=Администратор
|
||||
users.repos=Спремишта
|
||||
users.repos=репоси
|
||||
users.created=Креирано
|
||||
users.edit=Уреди
|
||||
users.auth_source=Извор аутентикације
|
||||
|
|
@ -530,9 +620,9 @@ auths.name=Име
|
|||
auths.type=Тип
|
||||
auths.enabled=Омогућено
|
||||
auths.updated=Ажурирано
|
||||
auths.auth_type=Врста провере аутентичности
|
||||
auths.auth_name=Име провере аутентичности
|
||||
auths.security_protocol=Протокол безбедности
|
||||
auths.auth_type=Врста аутентикације
|
||||
auths.auth_name=Назив аутентикације
|
||||
auths.security_protocol=Сигурносни протокол
|
||||
auths.domain=Домен
|
||||
auths.host=Хост
|
||||
auths.port=Порт
|
||||
|
|
@ -552,19 +642,19 @@ auths.tips=Савети
|
|||
config.server_config=Конфигурација сервера
|
||||
config.disable_router_log=Онемогући журнал рутера
|
||||
config.run_mode=Режим извршавања
|
||||
config.repo_root_path=Пут до корена спремишта
|
||||
config.repo_root_path=Пут до корена репозиторијума
|
||||
config.script_type=Врста скрипта
|
||||
config.reverse_auth_user=Корисничко име при обрнуту аутентикацију
|
||||
config.reverse_auth_user=Корисничко име за обрнуту аутентикацију (reverse proxy)
|
||||
|
||||
config.ssh_config=SSH конфигурација
|
||||
config.ssh_enabled=Омогућено
|
||||
config.ssh_config=ССХ конфигурација
|
||||
config.ssh_enabled=Активирано
|
||||
config.ssh_port=Порт
|
||||
config.ssh_listen_port=Порт за слушање
|
||||
config.ssh_root_path=Основни пут
|
||||
config.ssh_key_test_path=Пут до кључу
|
||||
config.ssh_keygen_path=Пут до генератор кључева ('ssh-keygen')
|
||||
config.ssh_minimum_key_size_check=Минимална величина провера кључа
|
||||
config.ssh_minimum_key_sizes=Минимална величина кључева
|
||||
config.ssh_key_test_path=Пут до кључа
|
||||
config.ssh_keygen_path=Пут до генератора кључева ('ssh-keygen')
|
||||
config.ssh_minimum_key_size_check=Провера минималне величине кључа
|
||||
config.ssh_minimum_key_sizes=Минимална величина кључа
|
||||
|
||||
|
||||
config.db_config=Конфигурација базе података
|
||||
|
|
@ -575,7 +665,7 @@ config.db_path=Пут
|
|||
|
||||
config.service_config=Подешавања сервиса
|
||||
config.show_registration_button=Прикажи дугме за регистрацију
|
||||
config.active_code_lives=Дужина живота активних кодова
|
||||
config.active_code_lives=Дужина трајанја активацијског кода
|
||||
|
||||
config.webhook_config=Подешавања Webhook
|
||||
config.queue_length=Дужина реда
|
||||
|
|
@ -608,10 +698,10 @@ config.enable_federated_avatar=Омогући Federated Avatars
|
|||
|
||||
config.git_config=Git конфигурација
|
||||
config.git_disable_diff_highlight=Онемогући бојење синтаксе када гледате разлике
|
||||
config.git_max_diff_lines=Максималан број различитих редова (у датотеци)
|
||||
config.git_max_diff_line_characters=Максималан број различитих карактера (у реду)
|
||||
config.git_max_diff_lines=Максималан број редова с разликама по фајлу
|
||||
config.git_max_diff_line_characters=Максималан број карактера с разликама по реду
|
||||
config.git_max_diff_files=Максималан број измењених датотека (приказаних)
|
||||
config.git_gc_args=Аргументи на cакупљање смећа
|
||||
config.git_gc_args=Аргументи cкупљања смећа (GC)
|
||||
config.git_migrate_timeout=Време до отказања миграције
|
||||
config.git_mirror_timeout=Време до отазање синхронизацији огледала
|
||||
config.git_clone_timeout=Време до отказивања клонирањем
|
||||
|
|
@ -638,14 +728,14 @@ notices.inverse_selection=Обрна селекција
|
|||
notices.delete_selected=Избриши изабране
|
||||
notices.delete_all=Уклони сва обавештења
|
||||
notices.type=Тип
|
||||
notices.type_1=Спремиште
|
||||
notices.type_1=Репозиторијум
|
||||
notices.desc=Опис
|
||||
notices.op=Oп.
|
||||
|
||||
[action]
|
||||
create_repo=креира спремиште <a href="%s">%s</a>
|
||||
rename_repo=преимензје спремиште од <code>%[1]s</code> на <a href="%[2]s">%[3]s</a>
|
||||
transfer_repo=преноси спремиште <code>%s</code> на <a href="%s">%s</a>
|
||||
create_repo=је креирао/ла репозиторијум <a href="%s">%s</a>
|
||||
rename_repo=преименовао/ла је репозиторијум од <code>%[1]s</code> на <a href="%[2]s">%[3]s</a>
|
||||
transfer_repo=пренео је репозиторијум <code>%s</code> на <a href="%s">%s</a>
|
||||
|
||||
[tool]
|
||||
now=сада
|
||||
|
|
|
|||
|
|
@ -182,8 +182,8 @@ buttons.quote.tooltip = Citera text
|
|||
buttons.code.tooltip = Lägg till kod
|
||||
buttons.link.tooltip = Lägg till en länk
|
||||
buttons.heading.tooltip = Lägg till rubrik
|
||||
buttons.bold.tooltip = Lägg till fetstilt text
|
||||
buttons.italic.tooltip = Lägg till kursiv text
|
||||
buttons.bold.tooltip = Lägg till fetstilt text (CTRL+B / ⌘B)
|
||||
buttons.italic.tooltip = Lägg till kursiv text (CTRL+I / ⌘I)
|
||||
buttons.list.unordered.tooltip = Lägg till en punktlista
|
||||
buttons.list.ordered.tooltip = Lägg till en numrerad lista
|
||||
buttons.list.task.tooltip = Lägg till en lista med sysslor
|
||||
|
|
@ -203,6 +203,8 @@ buttons.disable_monospace_font = Avaktivera jämnbrett typsnitt
|
|||
link_modal.paste_reminder = Tips: Med ett URL i ditt klippbord, kan du klistra in direkt i textredigeraren för att skapa en länk.
|
||||
buttons.enable_monospace_font = Aktivera jämnbrett typsnitt
|
||||
|
||||
buttons.indent.tooltip = Inplacera föremål med en nivå
|
||||
|
||||
[filter]
|
||||
string.asc = A - Ö
|
||||
string.desc = Ö - A
|
||||
|
|
@ -321,7 +323,7 @@ app_slogan_helper = Skriv in din slogan här. Lämna tom för att stänga av.
|
|||
domain = Serverdomän
|
||||
domain_helper = Domän eller värdadress för servern.
|
||||
reinstall_error = Du försöker att installera i en existerande Forgejo-databas
|
||||
password_algorithm_helper = Ställ in hashalgoritmen för lösenord. Algoritmer har olika krav och styrka. Argon2-algoritmen är ganska säker men använder mycket minne och kan vara olämplig för små system.
|
||||
password_algorithm_helper = Ställ in hashalgoritmen för lösenord. Algoritmer har olika krav och styrkor. Argon2-algoritmen är ganska säker men använder mycket minne och kan vara olämplig för små system.
|
||||
config_location_hint = Dessa konfigurationsinställningar kommer att sparas i:
|
||||
invalid_db_table = Databastabellen "%s" är ogiltig: %v
|
||||
secret_key_failed = Misslyckades att generera hemlig nyckel: %v
|
||||
|
|
@ -335,6 +337,13 @@ invalid_password_algorithm = Ogiltig hashalgoritm för lösenord
|
|||
env_config_keys_prompt = Följande miljövariabler kommer också att tillämpas på din konfigurationsfil:
|
||||
smtp_from_invalid = "Skicka E-post som" adressen är ogiltig
|
||||
|
||||
reinstall_confirm_check_1 = Data krypterad av HEMLIG_NYCKEL i app.ini kan gå förlorad: användare kommer kanske inte att kunna logga in med 2FA/OTP & speglar funkar kanske inte korrekt. Genom att kryssa i rutan godkänner du att den nuvarande app.ini innehåller korrekta HEMLIG_NYCKEL.
|
||||
|
||||
reinstall_confirm_check_2 = Kodkatalogerna och inställningarna kan behövas omsynkroniseras. Genom att kryssa i rutan bekräftar du att du kommer omsynkronisera hakarna för kodkatalogerna och befogade_nycklar filen manuellt. Du bekräfar att du säkerställer att kodkatalogen och spegel inställningarna är korrekt.
|
||||
|
||||
run_user_helper = Operativsystemets användarnamn som Forgejo körs som. Notera att denna användare måste ha tillgång till utvecklingskatalogens rotsökväg.
|
||||
enable_update_checker_helper_forgejo = Den kommer periodiskt kolla efter nya Forgejo-versionser genom att kolla ett TXT-DNS-record på release.forgejo.org.
|
||||
|
||||
[home]
|
||||
uname_holder=Användarnamn eller e-postadress
|
||||
switch_dashboard_context=Växla visad instrumentpanel
|
||||
|
|
@ -356,6 +365,8 @@ show_only_public=Visar endast publika
|
|||
issues.in_your_repos=I dina utvecklingskataloger
|
||||
filter_by_team_repositories = Filtrera efter lagutvecklingskataloger
|
||||
|
||||
feed_of = Flöde av "%s"
|
||||
|
||||
[explore]
|
||||
repos=Utvecklingskataloger
|
||||
users=Användare
|
||||
|
|
@ -367,6 +378,8 @@ go_to = Gå till
|
|||
relevant_repositories = Endast relevanta utvecklingskataloger visas, <a href="%s">visa ofiltrerade resultat</a>.
|
||||
stars_few = %d stjärnor
|
||||
|
||||
relevant_repositories_tooltip = Utvecklingskataloger som är gafflingar eller inte har ämne, ikon, och beskrivning är dolda.
|
||||
|
||||
[auth]
|
||||
create_new_account=Registrera konto
|
||||
disable_register_prompt=Registrering inaktiverad. Vänligen kontakta din sidadministratör.
|
||||
|
|
@ -433,6 +446,9 @@ password_pwned = Lösenordet du valde finns på en <a target="_blank" rel="noope
|
|||
sign_up_button = Registrera dig.
|
||||
sign_up_successful = Kontot skapades. Välkommen!
|
||||
|
||||
change_unconfirmed_email = Om du har fått fel e-post-adress under registrering kan du ändra den nedan och ett konfirmationsmejl kommer skickas till den nya e-posten istället.
|
||||
unauthorized_credentials = Inloggningsuppgifterna är felaktiga eller har gått ut. Försök kommandot igen eller se %s för mer information
|
||||
|
||||
[mail]
|
||||
activate_account=Vänligen aktivera ditt konto
|
||||
|
||||
|
|
@ -493,12 +509,16 @@ repo.transfer.subject_to_you = %s vill överföra förrådet ”%s” till dig
|
|||
|
||||
|
||||
|
||||
release.title = Titel: %s
|
||||
|
||||
[modal]
|
||||
yes=Ja
|
||||
no=Nej
|
||||
cancel=Avbryt
|
||||
modify=Uppdatera
|
||||
|
||||
confirm = Bekräfta
|
||||
|
||||
[form]
|
||||
UserName=Användarnamn
|
||||
RepoName=Utvecklingskatalogens namn
|
||||
|
|
@ -572,6 +592,13 @@ still_has_org = Ditt konto är medlem i en eller flera organisationer. Lämna de
|
|||
still_own_packages = Ditt konto har ett eller flera paket, ta bort dem först.
|
||||
|
||||
|
||||
FullName = Fullständigt namn
|
||||
Description = Beskrivning
|
||||
Biography = Biografi
|
||||
Website = Webbplats
|
||||
Location = Plats
|
||||
To = Grennamn
|
||||
|
||||
[user]
|
||||
change_avatar=Byt din avatar…
|
||||
repositories=Utvecklingskataloger
|
||||
|
|
@ -594,6 +621,14 @@ settings = Användarinställningar
|
|||
block = Blockera
|
||||
|
||||
|
||||
followers.title.one = Följare
|
||||
followers.title.few = Följare
|
||||
following.title.one = Följer
|
||||
following.title.few = Följer
|
||||
followers_one = %d följare
|
||||
following_one = %d följer
|
||||
block_user = Blockera användare
|
||||
|
||||
[settings]
|
||||
profile=Profil
|
||||
account=Konto
|
||||
|
|
@ -650,7 +685,7 @@ activate_email=Skicka aktivering
|
|||
activations_pending=Väntar på aktivering
|
||||
delete_email=Ta Bort
|
||||
email_deletion=Ta bort e-postadress
|
||||
email_deletion_desc=Mejladressen och relaterad information kommer tas bort från ditt konto. Git-commits med denna mejladress förblir oförändrade. Vill du fortsätta?
|
||||
email_deletion_desc=Denna mejladress och relaterad information kommer tas bort från ditt konto. Git-commits med denna mejladress förblir oförändrade. Vill du fortsätta?
|
||||
email_deletion_success=Mejladressen har tagits bort.
|
||||
theme_update_success=Ditt tema ändrades.
|
||||
theme_update_error=Det valda temat finns inte.
|
||||
|
|
@ -790,6 +825,24 @@ permission_write = Läs och skriv
|
|||
user_block_yourself = Du kan inte blockera dig själv.
|
||||
gpg_token_help = Du kan skapa en signatur med hjälp av:
|
||||
|
||||
appearance = Utseende
|
||||
blocked_users = Blockerade användare
|
||||
profile_desc = Om dig
|
||||
update_language = Ändra språk
|
||||
language.title = Standardspråk
|
||||
hints = Tips
|
||||
update_hints = Uppdatera tips
|
||||
comment_type_group_reference = Referens
|
||||
comment_type_group_label = Etikett
|
||||
comment_type_group_milestone = Milstolpe
|
||||
comment_type_group_branch = Gren
|
||||
comment_type_group_dependency = Beroende
|
||||
comment_type_group_project = Projekt
|
||||
webauthn_nickname = Smeknamn
|
||||
quota.sizes.all = Alla
|
||||
quota.sizes.assets.packages.all = Paket
|
||||
quota.sizes.wiki = Wiki
|
||||
|
||||
[repo]
|
||||
owner=Ägare
|
||||
repo_name=Utvecklingskatalogens namn
|
||||
|
|
@ -822,7 +875,7 @@ license_helper_desc=En licens styr vad andra kan och inte kan göra med din kod.
|
|||
readme=README
|
||||
readme_helper=Välj en mall för README-filen
|
||||
readme_helper_desc=Här kan du skriva en fullständig beskrivning för ditt projekt.
|
||||
auto_init=Initiera utvecklingskatalog (Lägger till .gitignore, License and README)
|
||||
auto_init=Initiera utvecklingskatalog
|
||||
create_repo=Skapa utvecklingskatalog
|
||||
default_branch=Standardgren
|
||||
default_branch_helper=Den förvalda grenen är bas-gren för pull requests och kod-commits.
|
||||
|
|
@ -866,7 +919,7 @@ migrate_items_wiki=Wiki
|
|||
migrate_items_milestones=Milstenar
|
||||
migrate_items_labels=Etiketter
|
||||
migrate_items_issues=Ärenden
|
||||
migrate_items_pullrequests=Pull Requester
|
||||
migrate_items_pullrequests=Pull-förfrågningar
|
||||
migrate_items_merge_requests=Begäran om sammanslagning
|
||||
migrate_items_releases=Releaser
|
||||
migrate_repo=Migrera utvecklingskatalog
|
||||
|
|
@ -966,7 +1019,7 @@ editor.propose_file_change=Föreslå filändring
|
|||
editor.new_branch_name_desc=Nytt branchnamn…
|
||||
editor.cancel=Avbryt
|
||||
editor.filename_cannot_be_empty=Filnamnet kan inte vara tomt.
|
||||
editor.file_changed_while_editing=Filens innehåll har ändrats sedan du påbörjade din ändring.<a target="_blank" rel="noopener noreferrer" href="%s">Klicka här</a> för att se ändringarna eller <strong>commita ändringarna igen</strong> för att skriva över dem.
|
||||
editor.file_changed_while_editing=Filens innehåll har ändrats sedan du öppnade filen.<a target="_blank" rel="noopener noreferrer" href="%s">Klicka här</a> för att se ändringarna eller <strong>commita ändringarna igen</strong> för att skriva över dem.
|
||||
editor.commit_empty_file_header=Committa en tom fil
|
||||
editor.commit_empty_file_text=Filen du vill committa är tom. Vill du fortsätta?
|
||||
editor.no_changes_to_show=Det finns inga ändringar att visa.
|
||||
|
|
@ -1062,7 +1115,7 @@ issues.remove_self_assignment=`tog bort sin tilldelning %s`
|
|||
issues.change_title_at='ändrade titeln från <b><strike>%s</strike></b> till <b>%s</b> %s'
|
||||
issues.delete_branch_at='tog bort grenen <b>%s</b> %s'
|
||||
issues.filter_label=Etikett
|
||||
issues.filter_label_exclude=`Använd <code>alt</code> + <code>klicka/enter</code> för att exkludera etiketter`
|
||||
issues.filter_label_exclude=Använd <kbd>Alt</kbd> + <kbd>klicka/enter</kbd> för att exkludera etiketter
|
||||
issues.filter_label_no_select=Alla etiketter
|
||||
issues.filter_milestone=Milsten
|
||||
issues.filter_project_none=Inget projekt
|
||||
|
|
@ -1700,7 +1753,106 @@ open_with_editor = Öppna med %s
|
|||
|
||||
|
||||
|
||||
admin.manage_flags = Hantera flaggor
|
||||
admin.update_flags = Uppdatera flaggor
|
||||
object_format = Objektformat
|
||||
default_branch_label = standard
|
||||
stars = Stjärnor
|
||||
transfer.accept = Acceptera överföring
|
||||
desc.sha256 = SHA256
|
||||
find_tag = Hitta tagg
|
||||
project = Projekt
|
||||
packages = Paket
|
||||
file_view_source = Visa källa
|
||||
file_copy_permalink = Kopiera permalänk
|
||||
commit_graph.select = Välj grenar
|
||||
commit_graph.color = Färg
|
||||
download_file = Ladda ner fil
|
||||
from_comment = (kommentar)
|
||||
editor.add_file = Lägg till fil
|
||||
editor.add_tmpl.filename = filnamn
|
||||
editor.add = Lägg till %s
|
||||
editor.update = Uppdatera %s
|
||||
editor.delete = Ta bort %s
|
||||
commits.search_branch = Denna gren
|
||||
commitstatus.error = Fel
|
||||
projects.column.edit = Redigera kolumn
|
||||
projects.column.new_submit = Skapa kolumn
|
||||
projects.column.new = Ny kolumn
|
||||
projects.column.delete = Ta bort kolumn
|
||||
projects.column.color = Färg
|
||||
projects.card_type.text_only = Endast text
|
||||
issues.filter_label_select_no_label = Inget etikett
|
||||
issues.filter_project = Projekt
|
||||
issues.filter_project_all = Alla projekt
|
||||
issues.filter_sort.relevance = Relevans
|
||||
issues.all_title = Alla
|
||||
issues.label_archive = Arkivera etikett
|
||||
issues.content_history.edited = redigerad
|
||||
issues.content_history.created = skapad
|
||||
compare.compare_head = jämför
|
||||
pulls.has_viewed_file = Visad
|
||||
pulls.merge_conflict_summary = Felmeddelande
|
||||
pulls.rebase_conflict_summary = Felmeddelande
|
||||
pulls.status_checks_details = Detaljer
|
||||
pulls.editable = Redigerbar
|
||||
milestones.filter_sort.name = Namn
|
||||
ext_wiki = Extern Wiki
|
||||
wiki.page_title = Sidtitel
|
||||
wiki.page_content = Sidinnehåll
|
||||
wiki.cancel = Avbryt
|
||||
wiki.search = Sök wiki
|
||||
wiki.no_search_results = Inga resultat
|
||||
activity.navbar.pulse = Puls
|
||||
activity.navbar.code_frequency = Kodfrekvens
|
||||
activity.published_tag_label = Tagg
|
||||
settings.mirror_settings.direction = Riktning
|
||||
settings.mirror_settings.last_update = Senaste uppdatering
|
||||
settings.mirror_settings.push_mirror.none_ssh = Ingen
|
||||
settings.units.overview = Översikt
|
||||
settings.units.add_more = Aktivera fler
|
||||
settings.transfer.button = Överför ägarskap
|
||||
settings.transfer.modal.title = Överför ägarskap
|
||||
settings.transfer_abort = Avbryt överföring
|
||||
settings.add_team = Lägg till team
|
||||
settings.slack_color = Färg
|
||||
settings.event_issue_label = Etikett
|
||||
settings.event_issue_milestone = Målstolpe
|
||||
settings.event_pull_request_label = Etikett
|
||||
settings.event_pull_request_milestone = Målstolpar
|
||||
settings.event_pull_request_comment = Kommentarer
|
||||
settings.event_package = Paket
|
||||
settings.graphql_url = GraphQL-URL
|
||||
settings.web_hook_name_slack = Slack
|
||||
settings.web_hook_name_discord = Discord
|
||||
settings.web_hook_name_telegram = Telegram
|
||||
settings.packagist_api_token = API-token
|
||||
settings.sourcehut_builds.secrets = Hemligheter
|
||||
settings.protected_branch.save_rule = Spara regel
|
||||
settings.protected_branch.delete_rule = Ta bort regel
|
||||
settings.protect_patterns = Mönster
|
||||
settings.tags = Taggar
|
||||
settings.tags.protection.allowed.users = Tillåtna användare
|
||||
settings.tags.protection.allowed.teams = Tillåtna team
|
||||
settings.tags.protection.allowed.noone = Ingen
|
||||
settings.tags.protection.create = Lägg till regel
|
||||
settings.thread_id = Tråd-ID
|
||||
settings.rename_branch = Döp om gren
|
||||
diff.show_more = Visa mer
|
||||
release.tags = Taggar
|
||||
release.tag_helper_existing = Existerande tagg.
|
||||
release.delete_tag = Ta bort tagg
|
||||
release.add_tag = Skapa tagg
|
||||
release.asset_external_url = Extern URL
|
||||
branch.create_from = från "%s"
|
||||
branch.confirm_create_branch = Skapa gren
|
||||
branch.create_branch_operation = Skapa gren
|
||||
tag.create_tag_operation = Skapa tagg
|
||||
tag.confirm_create_tag = Skapa tagg
|
||||
|
||||
[graphs]
|
||||
component_loading = Laddar %s…
|
||||
code_frequency.what = kodfrekvens
|
||||
|
||||
[org]
|
||||
org_name_holder=Organisationsnamn
|
||||
|
|
@ -1796,6 +1948,13 @@ teams.specific_repositories_helper=Medlemmar kommer endast ha tillgång till utv
|
|||
teams.all_repositories=Alla utvecklingskataloger
|
||||
teams.all_repositories_helper=Teamet har tillgång till alla utvecklingskataloger. När du väljer detta komma <strong>alla nuvarande utvecklingskataloger</strong> läggas till i teamet.
|
||||
|
||||
code = Kod
|
||||
settings.visibility.limited_shortname = Begränsad
|
||||
teams.none_access = Ingen åtkomst
|
||||
teams.general_access = Anpassad åtkomst
|
||||
teams.write_access = Skriv
|
||||
teams.invite_team_member.list = Väntande inbjudningar
|
||||
|
||||
[admin]
|
||||
dashboard=Instrumentpanel
|
||||
users=Användarkonton
|
||||
|
|
@ -2133,6 +2292,29 @@ users.is_restricted = Begränsat konto
|
|||
self_check.database_inconsistent_collation_columns = Databasen använder kollateringen %s, men dessa kolumner använder felanpassade kollateringar. Det kan komma att orsaka oväntade problem.
|
||||
|
||||
|
||||
hooks = Webhooks
|
||||
integrations = Integrationer
|
||||
config_settings = Inställningar
|
||||
settings = Admininställningar
|
||||
users.list_status_filter.menu_text = Filter
|
||||
users.list_status_filter.not_admin = Inte admin
|
||||
users.list_status_filter.not_prohibit_login = Tillåt inloggning
|
||||
users.details = Användardetaljer
|
||||
emails.updated = E-post uppdaterad
|
||||
packages.package_manage_panel = Hantera paket
|
||||
packages.creator = Skapare
|
||||
packages.version = Version
|
||||
auths.force_smtps = Tvinga SMTPS
|
||||
auths.oauth2_icon_url = Ikon-URL
|
||||
auths.tips.gmail_settings = Gmail-inställningar:
|
||||
config.domain = Serverdomän
|
||||
config.lfs_config = LFS-konfiguration
|
||||
config.mailer_protocol = Protokoll
|
||||
config.send_test_mail_submit = Skicka
|
||||
monitor.stats = Statistik
|
||||
monitor.last_execution_result = Resultat
|
||||
monitor.queue.settings.remove_all_items = Ta bort alla
|
||||
|
||||
[action]
|
||||
create_repo=skapade utvecklingskatalog <a href="%s"> %s</a>
|
||||
rename_repo=döpte om utvecklingskalatogen från <code>%[1]s</code> till <a href="%[2]s">%[3]s</a>
|
||||
|
|
@ -2148,6 +2330,8 @@ create_branch = skapade grenen <a href="%[2]s">%[3]s</a> i <a href="%[1]s">%[4]s
|
|||
starred_repo = stjärnmärkte <a href="%[1]s">%[2]s</a>
|
||||
watched_repo = började följa <a href="%[1]s">%[2]s</a>
|
||||
|
||||
review_dismissed_reason = Orsak:
|
||||
|
||||
[tool]
|
||||
now=nu
|
||||
future=framtiden
|
||||
|
|
@ -2185,6 +2369,9 @@ mark_as_read=Markera som läst
|
|||
mark_as_unread=Markera som oläst
|
||||
mark_all_as_read=Markera alla som lästa
|
||||
|
||||
subscriptions = Prenumerationer
|
||||
no_subscriptions = Inga prenumerationer
|
||||
|
||||
[gpg]
|
||||
default_key=Signerad med standard nyckeln
|
||||
error.extract_sign=Det gick inte att extrahera signatur
|
||||
|
|
@ -2207,7 +2394,44 @@ alpine.repository.repositories=Utvecklingskataloger
|
|||
conan.details.repository=Utvecklingskatalog
|
||||
owner.settings.cleanuprules.enabled=Aktiv
|
||||
|
||||
title = Paket
|
||||
filter.type.all = Alla
|
||||
installation = Installation
|
||||
requirements = Krav
|
||||
dependencies = Beroenden
|
||||
details = Detaljer
|
||||
details.license = Licens
|
||||
versions = Versioner
|
||||
versions.view_all = Visa alla
|
||||
dependency.id = ID
|
||||
dependency.version = Version
|
||||
alpine.repository.architectures = Arkitekturer
|
||||
arch.version.description = Beskrivning
|
||||
arch.version.groups = Grupp
|
||||
arch.version.conflicts = Konflikter
|
||||
arch.version.replaces = Ersätter
|
||||
composer.dependencies = Beroenden
|
||||
container.images.title = Bilder
|
||||
container.details.type = Bildtyp
|
||||
container.details.platform = Plattform
|
||||
container.layers = Bildlager
|
||||
container.labels = Etiketter
|
||||
container.labels.key = Nyckel
|
||||
container.labels.value = Värde
|
||||
debian.repository.components = Komponenter
|
||||
debian.repository.architectures = Arkitekturer
|
||||
npm.dependencies = Beroenden
|
||||
npm.details.tag = Tagg
|
||||
pypi.requires = Kräver Python
|
||||
rpm.repository.architectures = Arkitekturer
|
||||
alt.repository.architectures = Arkitekturer
|
||||
settings.delete = Ta bort paket
|
||||
|
||||
[secrets]
|
||||
secrets = Hemligheter
|
||||
creation = Lägg till hemlighet
|
||||
deletion = Ta bort hemlighet
|
||||
management = Hantera hemligheter
|
||||
|
||||
[actions]
|
||||
runners.name=Namn
|
||||
|
|
@ -2223,13 +2447,34 @@ runs.commit=Commit
|
|||
|
||||
|
||||
|
||||
status.unknown = Okänd
|
||||
status.waiting = Väntar
|
||||
runners.status = Status
|
||||
runners.id = ID
|
||||
runners.labels = Etiketter
|
||||
runners.task_list.status = Status
|
||||
runners.update_runner = Uppdatera ändringar
|
||||
runners.status.unspecified = Okänd
|
||||
runners.status.offline = Offline
|
||||
runners.version = Version
|
||||
runs.status = Status
|
||||
variables = Variabler
|
||||
variables.management = Hantera variabler
|
||||
variables.creation = Lägg till variabel
|
||||
variables.deletion = Ta bort variabel
|
||||
variables.edit = Redigera variabel
|
||||
|
||||
[projects]
|
||||
type-1.display_name = Individuellt projekt
|
||||
|
||||
[git.filemode]
|
||||
symbolic_link=Symbolisk länk
|
||||
|
||||
|
||||
|
||||
normal_file = Normal fil
|
||||
submodule = Submodul
|
||||
|
||||
[search]
|
||||
exact = Exakt
|
||||
exact_tooltip = Inkludera bara resultat som exakt matchar söktermen
|
||||
|
|
@ -2247,7 +2492,7 @@ team_kind = Sök team…
|
|||
org_kind = Sök organisationer…
|
||||
issue_kind = Sök ärenden…
|
||||
regexp_tooltip = Tolka söktermen som ett reguljärt uttryck
|
||||
code_search_unavailable = Kodsökning är för närvarande inte tillgänglig. Vänligen kontakta webbplatsadministratören.
|
||||
code_search_unavailable = Kodsökning är för närvarande inte tillgängligt. Vänligen kontakta webbplatsadministratören.
|
||||
fuzzy_tooltip = Inkludera resultat som är närliggande till söktermen
|
||||
no_results = Inga matchande resultat hittades.
|
||||
fuzzy = Ungefärlig
|
||||
|
|
@ -2259,4 +2504,13 @@ keyword_search_unavailable = Sökning på nyckelord är för närvarande inte ti
|
|||
|
||||
|
||||
[translation_meta]
|
||||
test = Det här är en teststräng. Den visas inte i Forgejo UI men används vid testtillfälle. Vänligen skriv in "ok" för att spara tid (eller en intressant fakta du själv väljer) för att nå upp till 100% komplett :)
|
||||
test = Det här är en teststräng. Den visas inte i Forgejo UI men används vid testtillfälle. Vänligen skriv in "ok" för att spara tid (eller en intressant fakta du själv väljer) för att nå upp till 100% komplett :)
|
||||
|
||||
[munits.data]
|
||||
b = B
|
||||
kib = KiB
|
||||
mib = MiB
|
||||
gib = GiB
|
||||
tib = TiB
|
||||
pib = PiB
|
||||
eib = EiB
|
||||
3684
options/locale/locale_ta.ini
Normal file
3684
options/locale/locale_ta.ini
Normal file
File diff suppressed because it is too large
Load diff
3684
options/locale/locale_th.ini
Normal file
3684
options/locale/locale_th.ini
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -4,12 +4,12 @@ dashboard=Pano
|
|||
explore=Keşfet
|
||||
help=Yardım
|
||||
logo=Logo
|
||||
sign_in=Giriş Yap
|
||||
sign_in=Oturum aç
|
||||
sign_in_with_provider=%s ile oturum aç
|
||||
sign_in_or=veya
|
||||
sign_out=Çıkış Yap
|
||||
sign_out=Çıkış yap
|
||||
sign_up=Kaydol
|
||||
link_account=Bağlantı hesabı
|
||||
link_account=Hesap bağla
|
||||
register=Üye Ol
|
||||
version=Sürüm
|
||||
powered_by=%s tarafından desteklenen
|
||||
|
|
@ -17,7 +17,7 @@ page=Sayfa
|
|||
template=Şablon
|
||||
language=Dil
|
||||
notifications=Bildirimler
|
||||
active_stopwatch=Etkin Zaman Takipçisi
|
||||
active_stopwatch=Etkin zaman takipçisi
|
||||
tracked_time_summary=Konu listesi süzgeçlerine dayanan takip edilen zamanın özeti
|
||||
create_new=Oluştur…
|
||||
user_profile_and_more=Profil ve ayarlar…
|
||||
|
|
@ -30,7 +30,7 @@ return_to_forgejo=Forgejo'ya Dön
|
|||
username=Kullanıcı Adı
|
||||
email=E-posta adresi
|
||||
password=Parola
|
||||
access_token=Erişim Kodu
|
||||
access_token=Erişim jetonu
|
||||
re_type=Parolayı doğrula
|
||||
captcha=CAPTCHA
|
||||
twofa=İki aşamalı doğrulama
|
||||
|
|
@ -53,7 +53,7 @@ repository=Depo
|
|||
organization=Organizasyon
|
||||
mirror=Yansı
|
||||
new_mirror=Yeni yansıma
|
||||
new_fork=Yeni Depo Çatalı
|
||||
new_fork=Yeni depo çatalı
|
||||
new_project=Yeni proje
|
||||
new_project_column=Yeni sütun
|
||||
admin_panel=Site yönetimi
|
||||
|
|
@ -69,7 +69,7 @@ collaborative=İşbirlikçi
|
|||
forks=Çatallar
|
||||
|
||||
activities=Etkinlikler
|
||||
pull_requests=Değişiklik istekleri
|
||||
pull_requests=Birleştirme istekleri
|
||||
issues=Konular
|
||||
milestones=Kilometre Taşları
|
||||
|
||||
|
|
@ -83,7 +83,7 @@ add=Ekle
|
|||
add_all=Tümünü ekle
|
||||
remove=Kaldır
|
||||
remove_all=Tümünü kaldır
|
||||
remove_label_str=`"%s" öğesini kaldır`
|
||||
remove_label_str="%s" öğesini kaldır
|
||||
edit=Düzenle
|
||||
view=Görüntüle
|
||||
|
||||
|
|
@ -111,7 +111,7 @@ go_back=Geri Git
|
|||
never=Asla
|
||||
unknown=Bilinmiyor
|
||||
|
||||
rss_feed=RSS yayını
|
||||
rss_feed=RSS akışı
|
||||
|
||||
pin=Sabitle
|
||||
unpin=Sabitlemeyi kaldır
|
||||
|
|
@ -135,9 +135,9 @@ confirm_delete_selected=Tüm seçili öğeleri gerçekten silmek istiyor musunuz
|
|||
name=İsim
|
||||
value=Değer
|
||||
copy_generic = Panoya kopyala
|
||||
filter = Filtrele
|
||||
filter = Süzgeç
|
||||
filter.not_archived = Arşivlenmemiş
|
||||
filter.clear = Filtreleri Temizle
|
||||
filter.clear = Süzgeçleri temizle
|
||||
filter.is_archived = Arşivlenmiş
|
||||
filter.is_mirror = Yansılar
|
||||
filter.is_fork = Çatallar
|
||||
|
|
@ -155,11 +155,11 @@ new_org.title = Yeni organizasyon
|
|||
new_repo.link = Yeni depo
|
||||
new_org.link = Yeni organizasyon
|
||||
error413 = Kotanızı doldurdunuz.
|
||||
toggle_menu = Menüyü aç-kapa
|
||||
new_migrate.title = Yeni göç
|
||||
new_migrate.link = Yeni göç
|
||||
toggle_menu = Menüyü aç-kapat
|
||||
new_migrate.title = Taşıma
|
||||
new_migrate.link = Taşıma
|
||||
copy_path = Dizini kopyala
|
||||
confirm_delete_artifact = "%s" adlı öğeyi silmek istediğinizden emin misiniz?
|
||||
confirm_delete_artifact = "%s" yapısını silmek istediğinize emin misiniz?
|
||||
|
||||
[aria]
|
||||
navbar=Gezinti çubuğu
|
||||
|
|
@ -178,8 +178,8 @@ contributions_format = {day} {month} {year} tarihinde {contributions} katkı
|
|||
|
||||
[editor]
|
||||
buttons.heading.tooltip=Başlık ekle
|
||||
buttons.bold.tooltip=Kalın metin ekle
|
||||
buttons.italic.tooltip=Eğik metin ekle
|
||||
buttons.bold.tooltip=Kalın metin ekle (Ctrl+B / ⌘B)
|
||||
buttons.italic.tooltip=Eğik metin ekle (Ctrl+I / ⌘I)
|
||||
buttons.quote.tooltip=Metni alıntıla
|
||||
buttons.code.tooltip=Kod ekle
|
||||
buttons.link.tooltip=Bağlantı ekle
|
||||
|
|
@ -228,7 +228,7 @@ platform_desc = Forgejo'nun Linux ve FreeBSD gibi özgür işletim sistemlerinde
|
|||
|
||||
[install]
|
||||
install=Kurulum
|
||||
title=Başlangıç Yapılandırması
|
||||
title=Başlangıç yapılandırması
|
||||
docker_helper=Eğer Forgejo'yı Docker içerisinde çalıştırıyorsanız, lütfen herhangi bir değişiklik yapmadan önce <a target="_blank" rel="noopener noreferrer" href="%s">belgeleri</a> okuyun.
|
||||
require_db_desc=Forgejo MySQL, PostgreSQL, SQLite3 veya TiDB (MySQL protokolü) gerektirir.
|
||||
db_title=Veritabanı ayarları
|
||||
|
|
@ -256,52 +256,52 @@ err_admin_name_pattern_not_allowed=Yönetici kullanıcı adı geçersiz, kullan
|
|||
err_admin_name_is_invalid=Yönetici kullanıcı adı geçersiz
|
||||
|
||||
general_title=Genel ayarlar
|
||||
app_name=Site Başlığı
|
||||
app_name_helper=Şirket adınızı buraya girebilirsiniz.
|
||||
app_name=Oluşum başlığı
|
||||
app_name_helper=Buraya örnek adınızı girin. Her sayfada görüntülenecektir.
|
||||
repo_path=Depo kök dizini
|
||||
repo_path_helper=Tüm uzak Git depoları bu dizine kaydedilecektir.
|
||||
lfs_path=Git LFS kök dizini
|
||||
lfs_path_helper=Git LFS tarafından izlenen dosyalar bu dizinde saklanacaktır. LFS'yi devre dışı bırakmak için boş bırakın.
|
||||
run_user=Şu Kullanıcı Olarak Çalıştır
|
||||
run_user=Çalıştıracak olan kullanıcı
|
||||
run_user_helper=Forgejo'nin çalışacağı işletim sistemi kullanıcı adı. Bu kullanıcının depo kök yoluna erişiminin olması gerektiğini unutmayın.
|
||||
domain=Sunucu alan adı
|
||||
domain_helper=Sunucu için alan adı veya ana bilgisayar adresi.
|
||||
ssh_port=SSH Sunucu Portu
|
||||
ssh_port_helper=SSH sunucusunun dinleyeceği port numarası. Etkisizleştimek için boş bırakın.
|
||||
http_port=Forgejo HTTP Dinleme Portu
|
||||
http_port_helper=Forgejo'nın web sunucusunun dinleyeceği port numarası.
|
||||
app_url=Forgejo Kök URL
|
||||
ssh_port=SSH sunucu portu
|
||||
ssh_port_helper=SSH sunucusunun dinleyeceği port numarası. SSH sunucusunu devre dışı bırakmak için boş bırakın.
|
||||
http_port=HTTP dinleme portu
|
||||
http_port_helper=Forgejo web sunucusunun kullanacağı port numarası.
|
||||
app_url=Taban URL
|
||||
app_url_helper=HTTP(S) kopyalama URL'leri ve e-posta bildirimleri için temel adres.
|
||||
log_root_path=Günlük Dosyaları Yolu
|
||||
log_root_path=Kayıt dizini
|
||||
log_root_path_helper=Günlük dosyaları bu dizine kaydedilecektir.
|
||||
|
||||
optional_title=İsteğe Bağlı Ayarlar
|
||||
optional_title=İsteğe bağlı ayarlar
|
||||
email_title=E-posta ayarları
|
||||
smtp_addr=SMTP sunucusu
|
||||
smtp_port=SMTP portu
|
||||
smtp_from=E-posta Gönderen
|
||||
smtp_from=E-posta gönderen
|
||||
smtp_from_helper=Forgejo'nın kullanacağı e-posta adresi. Yalın bir e-posta adresi girin veya "İsim" <eposta@ornek.com> biçimini kullanın.
|
||||
mailer_user=SMTP kullanıcı adı
|
||||
mailer_password=SMTP parolası
|
||||
register_confirm=Kayıt için E-posta Doğrulaması Gereksin
|
||||
register_confirm=Kayıt olmak için e-posta doğrulaması gereksin
|
||||
mail_notify=E-Posta bildirimlerini etkinleştir
|
||||
server_service_title=Sunucu ve Diğer Servis Ayarları
|
||||
offline_mode=Yerel Kipi Etkinleştir
|
||||
offline_mode.description=Üçüncü parti içerik teslim ağlarını etkisizleştirin ve bütün kaynakları yerelden sunun.
|
||||
server_service_title=Sunucu ve üçüncü parti servis ayarları
|
||||
offline_mode=Yerel modu etkinleştir
|
||||
offline_mode.description=Üçüncü parti içerik teslim ağlarını devre dışı bırak ve bütün kaynakları yerelden sun.
|
||||
disable_gravatar=Gravatar'ı Devre Dışı Bırak
|
||||
disable_gravatar.description=Gravatar ve diğer üçüncü parti profil resmi kaynaklarını kullanma. Kullanıcı bir profil resmi yüklemediği zaman varsayılan bir resim kullanılacaktır.
|
||||
federated_avatar_lookup=Birleştirilmiş Avatarları Etkinleştir
|
||||
federated_avatar_lookup=Birleştirilmiş profil resimlerini etkinleştir
|
||||
federated_avatar_lookup.description=Libravatar kullanarak federe profil resmi aramasını etkinleştirin.
|
||||
disable_registration=Kendi Kendine Kaydolmayı Devre Dışı Bırak
|
||||
disable_registration.description=Kullanıcının kendi kendine kaydolmasını devre dışı bırak. Yalnızca yöneticiler yeni hesaplar oluşturabilecek.
|
||||
disable_registration=Kullanıcı kaydını devre dışı bırak
|
||||
disable_registration.description=Sadece oluşum yöneticileri yeni kullanıcı hesapları oluşturabilecek. Herkese açık bir oluşum oluşturup yüksek miktarda spam hesapla uğraşmaya hazır değilseniz kayıt olmanın kapatılması şiddetle önerilir.
|
||||
allow_only_external_registration.description=Sadece belirlenen dış hizmetler aracılığıyla kullanıcı kaydına izin ver.
|
||||
openid_signin=OpenID Oturum Açmayı Etkinleştir
|
||||
openid_signin.description=OpenID ile kullanıcı girişini etkinleştir.
|
||||
openid_signup=OpenID ile Kendi Kendine Kaydı Etkinleştir
|
||||
openid_signup.description=OpenID Tabanlı Kendi Kendi Kullanıcı Kaydını Etkinleştir.
|
||||
openid_signup=OpenID ile kayıt olmayı etkinleştir
|
||||
openid_signup.description=Eğer kayıt olma açık ise kullanıcılara OpenID ile hesap oluşturma seçeneği sunar.
|
||||
enable_captcha=CAPTCHA kaydını etkinleştir
|
||||
enable_captcha.description=Kullanıcının kendi kendine kaydolması için captcha doğrulaması gereksin.
|
||||
require_sign_in_view=Sayfaları Görüntülemek için Giriş Yapmak Gereksin
|
||||
enable_captcha.description=Hesap oluşturmak için CAPTCHA'yı zorunlu tut.
|
||||
require_sign_in_view=Oluşum içeriğini görüntülemek için giriş yapmayı zorunlu kıl
|
||||
require_sign_in_view.description=Sayfa erişimini giriş yapmış kullanıcılarla sınırlandır. Ziyaretçiler sadece oturum açma ve kayıt sayfalarını görecektir.
|
||||
admin_setting.description=Bir yönetici hesabı açmak isteğe bağlıdır. İlk kayıt olan kullanıcı kendiliğinden yönetici olacaktır.
|
||||
admin_title=Yönetici hesabı ayarları
|
||||
|
|
@ -310,13 +310,13 @@ admin_password=Parola
|
|||
confirm_password=Parolayı doğrula
|
||||
admin_email=E-posta adresi
|
||||
install_btn_confirm=Forgejo'u Kur
|
||||
test_git_failed='git' komut testi başarısız: %v
|
||||
sqlite3_not_available=Bu Gieta sürümü SQLite3 desteklemiyor. Lütfen %s adresinden resmi çalışır sürümü ('gobuild' sürümünü değil) indirin.
|
||||
test_git_failed="git" komutu test edilemedi: %v
|
||||
sqlite3_not_available=Bu Forgejo sürümü SQLite3'ü desteklemiyor. Lütfen resmi sürümü %s adresinden indirin ("gobuild" versiyonunu değil).
|
||||
invalid_db_setting=Veritabanı ayarları geçersiz: %v
|
||||
invalid_db_table=`"%s" veritabanı tablosu geçersiz: %v`
|
||||
invalid_repo_path=Depo kök dizini geçersiz: %v
|
||||
invalid_app_data_path=Uygulama veri yolu geçersiz: %v
|
||||
run_user_not_match='Birlikte çalıştır' kullanıcı adı şimdiki kullanıcı adından farklıdır: %s -> %s
|
||||
run_user_not_match="Çalıştıracak olan kullanıcı" şu anki kullanıcı adı değil: %s -> %s
|
||||
internal_token_failed=Dahili belirteç oluşturulamadı: %v
|
||||
secret_key_failed=Gizli anahtar oluşturulamadı: %v
|
||||
save_config_failed=%v Yapılandırması kaydedilirken hata oluştu
|
||||
|
|
@ -324,15 +324,15 @@ invalid_admin_setting=Yönetici hesap ayarları geçersiz: %v
|
|||
invalid_log_root_path=Log dosya yolu geçersiz: %v
|
||||
default_keep_email_private=E-posta adreslerini varsayılan olarak gizle
|
||||
default_keep_email_private.description=Kayıt olunduktan hemen sonra bilgi sızıntısı olmaması için yeni kullanıcı hesaplarının e-posta adreslerini varsayılan olarak gizle.
|
||||
default_allow_create_organization=Varsayılan Olarak Organizasyon Oluşturmaya İzin Ver
|
||||
default_allow_create_organization.description=Varsayılan olarak yeni kullanıcı hesaplarının organizasyon oluşturmasına izin ver.
|
||||
default_enable_timetracking=Varsayılan Olarak Zaman Takibini Etkinleştir
|
||||
default_enable_timetracking.description=Yeni depolar için zaman takibini varsayılan olarak etkinleştir.
|
||||
no_reply_address=Gizlenecek E-Posta Alan Adı
|
||||
no_reply_address_helper=Gizlenmiş e-posta adresine sahip kullanıcılar için alan adı. Örneğin 'ali' kullanıcı adı, gizlenmiş e-postalar için alan adı 'yanityok.ornek.org' olarak ayarlandığında Git günlüğüne 'ali@yanityok.ornek.org' olarak kaydedilecektir.
|
||||
password_algorithm=Parola Hash Algoritması
|
||||
default_allow_create_organization=Organizasyonların oluşturulmasına varsayılan olarak izin ver
|
||||
default_allow_create_organization.description=Yeni kullanıcıların organizasyon olmasına varsayılan olarak izin ver. Bu ayar kapatıldığında yeni kullanıcıların organizasyon açabilmeleri için bir yöneticiden izin almış olmaları gerekmektedir.
|
||||
default_enable_timetracking=Zaman takibini varsayılan olarak etkinleştir
|
||||
default_enable_timetracking.description=Yeni depolar için zaman takibi özelliğini varsayılan olarak etkinleştir.
|
||||
no_reply_address=Gizli e-posta alan adı
|
||||
no_reply_address_helper=Gizli e-posta adresine sahip kullanıcılar için alan adı. Örneğin "ali" kullanıcı adı, bu alan adı "yanityok.ornek.org" olarak ayarlandığında Git kayıtlarında "ali@yanityok.ornek.org" olarak gözükecektir.
|
||||
password_algorithm=Şifre hash algoritması
|
||||
invalid_password_algorithm=Hatalı parola hash algoritması
|
||||
password_algorithm_helper=Parola hash algoritmasını ayarlayın. Algoritmalar değişen gereksinimlere ve güce sahiptirler. argon2 algoritması iyi özelliklere sahip olmasına rağmen fazla miktarda bellek kullanır ve küçük sistemler için uygun olmayabilir.
|
||||
password_algorithm_helper=Şifre hashleme algoritmasını ayarlayın. Her algoritma farklı gereksinimlere ve güce sahip. Argon2 algoritması gayet güçlü ancak yüksek miktarda bellek tüketmekte ve küçük sistemler için uygun olmayabilir.
|
||||
enable_update_checker=Güncelleme denetleyicisini etkinleştir
|
||||
env_config_keys=Ortam Yapılandırma
|
||||
env_config_keys_prompt=Aşağıdaki ortam değişkenleri de yapılandırma dosyanıza eklenecektir:
|
||||
|
|
@ -347,11 +347,11 @@ config_location_hint = Bu yapılandırma seçenekleri şuraya kaydedilecek:
|
|||
|
||||
[home]
|
||||
uname_holder=Kullanıcı adı veya e-posta adresi
|
||||
switch_dashboard_context=Panoya Geçiş Yap
|
||||
switch_dashboard_context=Pano bağlamını değiştir
|
||||
my_repos=Depolar
|
||||
my_orgs=Organizasyonlarım
|
||||
my_orgs=Organizasyonlar
|
||||
view_home=%s Görüntüle
|
||||
filter=Diğer Süzgeçler
|
||||
filter=Diğer süzgeçler
|
||||
filter_by_team_repositories=Takım depolarına göre süz
|
||||
feed_of=`"%s" beslemesi`
|
||||
|
||||
|
|
@ -455,6 +455,8 @@ hint_login = Mevcut hesabın var mı? <a href="%s">Hemen giriş yap!</a>
|
|||
use_onetime_code = Tek kullanımlık kod kullan
|
||||
change_unconfirmed_email = Kayıt sırasında yanlış e-posta adresi verdiyseniz, aşağıdan değiştirebilirsiniz; yeni adresinize bir onay mesajı gönderilecektir.
|
||||
|
||||
unauthorized_credentials = Kimlik bilgileri yanlış veya sona ermiş. Komutunuzu tekrar deneyin veya daha fazla bilgi için %s ziyaret edin
|
||||
|
||||
[mail]
|
||||
view_it_on=%s üzerinde görüntüle
|
||||
reply=veya doğrudan bu e-postayı yanıtlayın
|
||||
|
|
@ -529,6 +531,13 @@ admin.new_user.user_info = Kullanıcı bilgisi
|
|||
admin.new_user.text = Lütfen bu kullanıcıyı admin panelinden yönetmek için <a href="%s">buraya tıklayın</a>.
|
||||
password_change.text_1 = Hesabınızın parolası değişti.
|
||||
|
||||
primary_mail_change.text_1 = Hesabınızın ana e-posta adresi, %[1]s olarak değiştirildi. Bundan dolayı bu e-posta adresi hesabınızla alakalı e-posta bildirimlerini almayacak.
|
||||
totp_disabled.no_2fa = Artık herhangi bir iki aşamalı giriş yönteminiz ayarlanmış bulunmamakta, yani hesabınıza giriş yaparken iki aşamalı giriş yapmanıza gerek kalmamıştır.
|
||||
removed_security_key.no_2fa = Artık herhangi bir iki aşamalı giriş yönteminiz ayarlanmış bulunmamakta, yani hesabınıza giriş yaparken iki aşamalı giriş yapmanıza gerek kalmamıştır.
|
||||
totp_enrolled.subject = TOTP, 2 aşamalı giriş yöntemi olarak aktifleştirildi
|
||||
totp_enrolled.text_1.no_webauthn = TOTP'yi hesabınız için aktifleştirdiniz. Bundan dolayı gelecekte hesabınıza giriş yaparken 2 aşamalı giriş yöntemi olarak TOTP kullanmanız gerekecek.
|
||||
totp_enrolled.text_1.has_webauthn = TOTP'yi hesabınız için aktifleştirdiniz. Bu sayede gelecekte hesabınıza giriş yaparken 2 aşamalı giriş yöntemi olarak güvenlik anahtarlarınızın yanında TOTP'yi de kullanabilirsiniz.
|
||||
|
||||
[modal]
|
||||
yes=Evet
|
||||
no=Hayır
|
||||
|
|
@ -637,6 +646,8 @@ unset_password = Oturum açma kullanıcısı parola belirlemedi.
|
|||
unsupported_login_type = Oturum açma türü hesap silmeyi desteklemiyor.
|
||||
email_domain_is_not_allowed = Kullanıcı e-posta adresi <b>%s</b> alan adı EMAIL_DOMAIN_ALLOWLIST veya EMAIL_DOMAIN_BLOCKLIST ile çelişiyor. Lütfen işleminizin beklendiğinden emin olun.
|
||||
|
||||
username_claiming_cooldown = Bu kullanıcı adı hala korunma döneminde olduğundan bu kullanıcı adını alamazsınız. Ancak %[1]s tarihinde bu kullanıcı adını edinebilirsiniz.
|
||||
|
||||
[user]
|
||||
change_avatar=Profil resmini değiştir…
|
||||
joined_on=%s tarihinde katıldı
|
||||
|
|
@ -644,7 +655,7 @@ repositories=Depolar
|
|||
activity=Genel Aktivite
|
||||
followers_few=%d takipçiler
|
||||
starred=Yıldızlanmış depolar
|
||||
watched=İzlenen Depolar
|
||||
watched=İzlenen depolar
|
||||
code=Kod
|
||||
projects=Projeler
|
||||
overview=Genel Bakış
|
||||
|
|
@ -655,7 +666,7 @@ user_bio=Biyografi
|
|||
disabled_public_activity=Bu kullanıcı, etkinliğin herkese görünür olmasını devre dışı bıraktı.
|
||||
email_visibility.limited=E-posta adresiniz giriş yapmış tüm kullanıcılar tarafından görünür
|
||||
show_on_map=Bu yeri harita üzerinde göster
|
||||
settings=Kullanıcı Ayarları
|
||||
settings=Kullanıcı ayarları
|
||||
|
||||
form.name_reserved=`"%s" kullanıcı adı rezerve edilmiş.`
|
||||
form.name_pattern_not_allowed=Kullanıcı adında "%s" deseni kullanılamaz.
|
||||
|
|
@ -678,6 +689,9 @@ block_user.detail_2 = Bu kullanıcı sahip olduğunuz depolar, açtığınız so
|
|||
block_user.detail_1 = Birbirinizden takipten çıkacak ve birbirinizi takip edemeyeceksiniz.
|
||||
block_user.detail = Bu kullanıcıyı engellediğinizde:
|
||||
|
||||
block_user.detail_3 = Birbirinizi depo işbirlikçileri olarak ekleyemeyeceksiniz.
|
||||
public_activity.visibility_hint.self_private_profile = Profilin gizli olduğundan etkinliğin sadece sana ve oluşum yöneticilerine görünür. <a href="%s">Ayarla</a>.
|
||||
|
||||
[settings]
|
||||
profile=Profil
|
||||
account=Hesap
|
||||
|
|
@ -685,18 +699,18 @@ appearance=Görünüm
|
|||
password=Parola
|
||||
security=Güvenlik
|
||||
avatar=Avatar
|
||||
ssh_gpg_keys=SSH / GPG Anahtarları
|
||||
ssh_gpg_keys=SSH / GPG anahtarları
|
||||
applications=Uygulamalar
|
||||
orgs=Kuruluşlar
|
||||
repos=Depolar
|
||||
delete=Hesabı sil
|
||||
twofa=İki aşamalı doğrulama
|
||||
twofa=İki aşamalı doğrulama (TOTP)
|
||||
organization=Organizasyonlar
|
||||
uid=UID
|
||||
webauthn=Güvenlik Anahtarları
|
||||
|
||||
public_profile=Herkese açık profil
|
||||
biography_placeholder=Bize kendiniz hakkında birşeyler söyleyin! (Markdown kullanabilirsiniz)
|
||||
biography_placeholder=Diğerlerine kendiniz hakkında birşeyler söyleyin! (Markdown destekleniyor)
|
||||
location_placeholder=Yaklaşık konumunuzu başkalarıyla paylaşın
|
||||
profile_desc=Profilinizin başkalarına nasıl gösterildiğini yönetin. Ana e-posta adresiniz bildirimler, parola kurtarma ve web tabanlı Git işlemleri için kullanılacaktır.
|
||||
password_username_disabled=Yerel olmayan kullanıcılara kullanıcı adlarını değiştirme izni verilmemiştir. Daha fazla bilgi edinmek için lütfen site yöneticisi ile iletişime geçiniz.
|
||||
|
|
@ -705,7 +719,7 @@ website=Web Sitesi
|
|||
location=Konum
|
||||
update_theme=Temayı Güncelle
|
||||
update_profile=Profili Güncelle
|
||||
update_language=Dili Güncelle
|
||||
update_language=Dili değiştir
|
||||
update_language_not_found=`"%s" dili mevcut değil.`
|
||||
update_language_success=Dil güncellendi.
|
||||
update_profile_success=Profil resminiz güncellendi.
|
||||
|
|
@ -784,7 +798,7 @@ add_email_confirmation_sent=`"%s" adresine bir doğrulama e-postası gönderildi
|
|||
add_email_success=Yeni e-posta adresi eklendi.
|
||||
email_preference_set_success=E-posta tercihi başarıyla ayarlandı.
|
||||
add_openid_success=Yeni OpenID adresi eklendi.
|
||||
keep_email_private=E-posta Adresini Gizle
|
||||
keep_email_private=E-posta adresini gizle
|
||||
keep_email_private_popup=Bu, e-posta adresinizi profilde, değişiklik isteği yaptığınızda veya web arayüzünde dosya düzenlediğinizde gizleyecektir. İtilen işlemeler değişmeyecektir.
|
||||
openid_desc=OpenID, kimlik doğrulama işlemini harici bir sağlayıcıya devretmenize olanak sağlar.
|
||||
|
||||
|
|
@ -983,6 +997,44 @@ hints = İpuçları
|
|||
language.description = Bu dil giriş yaptığınızda varsayılan dil olarak kullanılmak üzere hesabınıza kaydedilecektir.
|
||||
keep_activity_private.description = Şu anki <a href="%s">halka açık aktiviteniz</a> sadece size ve oluşum yöneticilerine açık olacaktır.
|
||||
|
||||
storage_overview = Depolamaya genel bakış
|
||||
quota = Kota
|
||||
change_username_redirect_prompt.with_cooldown.one = Eski kullanıcı adı %[1]d günlük korunma döneminin ardından herkes tarafından kullanılabilir hale gelecek. Korunma dönemi süresince eski kullanıcı adını tekrar alabilirsin.
|
||||
change_username_redirect_prompt.with_cooldown.few = Eski kullanıcı adı %[1]d günlük korunma döneminin ardından herkes tarafından kullanılabilir hale gelecek. Korunma dönemi süresince eski kullanıcı adını tekrar alabilirsin.
|
||||
language.localization_project = Forgejo'yu kendi lisanında çevirmemize yardımcı ol! <a href="%s">Daha fazla bilgi edin</a>.
|
||||
additional_repo_units_hint = Ek depo birimlerini etkinleştirmeyi öner
|
||||
additional_repo_units_hint_description = Tüm birimleri etkinleştirmemiş depolar için "Dahasını etkinleştir" ipucunu göster.
|
||||
update_hints = İpuçlarını güncelle
|
||||
update_hints_success = İpuçları güncellendi.
|
||||
keep_pronouns_private = Zamirleri sadece giriş yapan kullanıcılara göster
|
||||
keep_pronouns_private.description = Bu giriş yapmamış ziyaretçilerden zamirleri gizleyecektir.
|
||||
ssh_token_help_ssh_agent = veya bir SSH agent kullanıyorsanız (SSH_AUTH_SOCK değişkeni ayarlanmış olarak):
|
||||
regenerate_token = Yeniden oluştur
|
||||
access_token_regeneration = Erişim jetonunu tekrar oluştur
|
||||
access_token_regeneration_desc = Bir jetonu yeniden oluşturmak, o jetonu kullanan uygulamaların hesabınıza erişimini kesecektir. Bu işlem geri alınamaz. Devam edilsin mi?
|
||||
regenerate_token_success = Jeton yeniden oluşturuldu. Jetonu kullanan uygulamaların artık hesabınıza erişimi kesilmiştir ve yeni jeton ile güncellenmeleri gerekmektedir.
|
||||
blocked_users_none = Engellenmiş kullanıcı yok.
|
||||
blocked_since = %s tarihinden beri engellenmiş
|
||||
user_block_yourself = Kendini engelleyemezsin.
|
||||
quota.applies_to_user = Aşağıdaki kota kuralları hesabınızda geçerlidir
|
||||
quota.applies_to_org = Aşağıdaki kota kuralları bu organizasyonda geçerlidir
|
||||
quota.rule.exceeded = Aşıldı
|
||||
quota.rule.exceeded.helper = Bu kural için nesnelerin toplam boyutu kotayı aştı.
|
||||
quota.rule.no_limit = Sınırsız
|
||||
quota.sizes.all = Tümü
|
||||
quota.sizes.repos.all = Depolar
|
||||
quota.sizes.repos.public = Herkese açık depolar
|
||||
quota.sizes.repos.private = Gizli depolar
|
||||
quota.sizes.git.all = Git içeriği
|
||||
quota.sizes.git.lfs = Git LFS
|
||||
quota.sizes.assets.all = Varlıklar
|
||||
quota.sizes.assets.attachments.all = Ekler
|
||||
quota.sizes.assets.attachments.issues = Sorun ekleri
|
||||
quota.sizes.assets.attachments.releases = Sürüm ekleri
|
||||
quota.sizes.assets.artifacts = Yapılar
|
||||
quota.sizes.assets.packages.all = Paketler
|
||||
quota.sizes.wiki = Viki
|
||||
|
||||
[repo]
|
||||
new_repo_helper=Bir depo, sürüm geçmişi dahil tüm proje dosyalarını içerir. Zaten başka bir yerde mi barındırıyorsunuz? <a href="%s">Depoyu taşıyın.</a>
|
||||
owner=Sahibi
|
||||
|
|
@ -1074,9 +1126,9 @@ tree_path_not_found.commit=%[1]s yolu, %[2]s işlemesinde mevcut değil
|
|||
tree_path_not_found.branch=%[1]s yolu, %[2]s dalında mevcut değil
|
||||
tree_path_not_found.tag=%[1]s yolu, %[2]s etiketinde mevcut değil
|
||||
|
||||
transfer.accept=Aktarımı Kabul Et
|
||||
transfer.accept=Aktarımı kabul Et
|
||||
transfer.accept_desc=`"%s" tarafına aktar`
|
||||
transfer.reject=Aktarımı Reddet
|
||||
transfer.reject=Aktarımı reddet
|
||||
transfer.reject_desc=`"%s" tarafına aktarımı iptal et`
|
||||
transfer.no_permission_to_accept=Bu aktarımı kabul etme izniniz yok.
|
||||
transfer.no_permission_to_reject=Bu aktarımı reddetme izniniz yok.
|
||||
|
|
@ -1087,41 +1139,41 @@ desc.template=Şablon
|
|||
desc.internal=Dahili
|
||||
desc.archived=Arşivlenmiş
|
||||
|
||||
template.items=Şablon Öğeleri
|
||||
template.git_content=Git İçeriği (Varsayılan Dal)
|
||||
template.git_hooks=Git İstemcileri
|
||||
template.git_hooks_tooltip=Eklendikten sonra Git İstemcilerini değiştirmek veya kaldırmak mümkün değildir. Bunu yalnızca şablon deposuna güveniyorsanız seçin.
|
||||
template.items=Şablon öğeleri
|
||||
template.git_content=Git içeriği (Varsayılan dal)
|
||||
template.git_hooks=Git kancaları
|
||||
template.git_hooks_tooltip=Şu anda bir kere eklendikten sonra Git kancalarını düzenleyemez veya kaldıramazsın. Bunu yalnızca şablon deposuna güveniyorsanız seçin.
|
||||
template.webhooks=Web İstemcileri
|
||||
template.topics=Konular
|
||||
template.avatar=Profil Resmi
|
||||
template.issue_labels=Konu Etiketleri
|
||||
template.issue_labels=Sorun etiketleri
|
||||
template.one_item=En az bir şablon öğesi seçmelisiniz
|
||||
template.invalid=Bir şablon deposu seçmelisiniz
|
||||
|
||||
archive.title=Bu depo arşivlendi. Dosyaları görüntüleyebilir ve klonlayabilirsiniz ama işleme gönderemez veya konu veya değişiklik isteği açamazsınız.
|
||||
archive.title_date=Bu depo %s tarihinde arşivlendi. Dosyaları görüntüleyebilir ve klonlayabilirsiniz ama işleme gönderemez veya konu veya değişiklik isteği açamazsınız.
|
||||
archive.title=Bu depo arşivlendi. Dosyaları görüntüleyip klonlayabilirsiniz ancak katkılar gönderemez, yeni sorun ve birleştirme isteği oluşturamaz veya yorum yapamazsınız yani durumunu değiştiremezsiniz.
|
||||
archive.title_date=Bu depo %s tarihinde arşivlendi. Dosyaları görüntüleyip klonlayabilirsiniz ancak katkılar gönderemez, yeni sorun ve birleştirme isteği oluşturamaz veya yorum yapamazsınız yani durumunu değiştiremezsiniz.
|
||||
form.reach_limit_of_creation_1=Zaten %d depo limitinize ulaştınız.
|
||||
form.reach_limit_of_creation_n=Zaten %d depo limitinize ulaştınız.
|
||||
form.name_reserved=Depo adı "%s" rezerve edilmiş.
|
||||
form.name_pattern_not_allowed=Depo adında "%s" deseni kullanılamaz.
|
||||
|
||||
need_auth=Yetkilendirme
|
||||
migrate_options=Göç seçenekleri
|
||||
migrate_options=Taşıma ayarları
|
||||
migrate_options_mirror_helper=Bu depo bir yansı olacaktır
|
||||
migrate_options_lfs=LFS dosyalarını taşı
|
||||
migrate_options_lfs_endpoint.label=LFS Uç Noktası
|
||||
migrate_options_lfs_endpoint.label=LFS uç noktası
|
||||
migrate_options_lfs_endpoint.description=Taşıma, <a target="_blank" rel="noopener noreferrer" href="%s"> LFS sunucusunu belirlemek</a> için Git uzak sunucusunu kullanmaya çalışacak. Eğer LFS veri deposu başka yerdeyse özel bir uç nokta da belirtebilirsiniz.
|
||||
migrate_options_lfs_endpoint.description.local=Yerel bir sunucu yolu da destekleniyor.
|
||||
migrate_options_lfs_endpoint.placeholder=Boş bırakılırsa, uç nokta klon URL'sinden türetilecektir
|
||||
migrate_items=Göç öğeleri
|
||||
migrate_items=Taşıma öğeleri
|
||||
migrate_items_wiki=Wiki
|
||||
migrate_items_milestones=Kilometre Taşları
|
||||
migrate_items_labels=Etiketler
|
||||
migrate_items_issues=Konular
|
||||
migrate_items_pullrequests=Değişiklik İstekleri
|
||||
migrate_items_merge_requests=Birleştirme İstekleri
|
||||
migrate_items_pullrequests=Birleştirme istekleri
|
||||
migrate_items_merge_requests=Birleştirme istekleri
|
||||
migrate_items_releases=Sürümler
|
||||
migrate_repo=Depoyu Göç Ettir
|
||||
migrate_repo=Depoyu taşı
|
||||
migrate.clone_address=URL'den Taşı / Klonla
|
||||
migrate.clone_address_desc=Varolan bir deponun HTTP(S) veya Git 'klonlama' URL'si
|
||||
migrate.github_token_desc=GitHub API hız sınırı nedeniyle göçü hızlandırmak için buraya virgülle ayrılmış bir veya daha fazla erişm anahtarı koyabilirsiniz. UYARI: Bu özelliğin kötüye kullanılması, hizmet sağlayıcının politikasını ihlal edebilir ve hesabın engellenmesine yol açabilir.
|
||||
|
|
@ -1140,7 +1192,7 @@ migrate.migrating_failed=<b>%s</b> konumundan taşıma başarısız oldu.
|
|||
migrate.migrating_failed.error=Göç yapılamadı: %s
|
||||
migrate.migrating_failed_no_addr=Göç başarısız oldu.
|
||||
migrate.migrating_git=Git Verilerini Taşıma
|
||||
migrate.migrating_topics=Konuları Taşıma
|
||||
migrate.migrating_topics=Konuları taşıma
|
||||
migrate.migrating_milestones=Kilometre Taşlarını Taşıma
|
||||
migrate.migrating_labels=Etiketleri Taşıma
|
||||
migrate.migrating_releases=Sürümleri Taşıma
|
||||
|
|
@ -1162,10 +1214,10 @@ unstar=Yıldızı Kaldır
|
|||
star=Yıldızla
|
||||
fork=Çatalla
|
||||
download_archive=Depoyu İndir
|
||||
more_operations=Daha Fazla İşlem
|
||||
more_operations=Diğer işlemler
|
||||
|
||||
no_desc=Açıklama Yok
|
||||
quick_guide=Hızlı Başlangıç Kılavuzu
|
||||
no_desc=Açıklama yok
|
||||
quick_guide=Hızlı başlangıç kılavuzu
|
||||
clone_this_repo=Bu depoyu klonla
|
||||
cite_this_repo=Bu depoya atıf ver
|
||||
create_new_repo_command=Komut satırında yeni bir depo oluşturuluyor
|
||||
|
|
@ -1224,7 +1276,7 @@ symbolic_link=Sembolik Bağlantı
|
|||
executable_file=Çalıştırılabilir Dosya
|
||||
commit_graph=İşleme Grafiği
|
||||
commit_graph.select=Dalları seç
|
||||
commit_graph.hide_pr_refs=Değişiklik İsteklerini Gizle
|
||||
commit_graph.hide_pr_refs=Değişiklik isteklerini gizle
|
||||
commit_graph.monochrome=Siyah Beyaz
|
||||
commit_graph.color=Renk
|
||||
commit.contained_in=Bu işleme şunda yer alıyor:
|
||||
|
|
@ -1670,10 +1722,10 @@ issues.review.dismissed=%s incelemesini %s reddetti
|
|||
issues.review.dismissed_label=Reddedildi
|
||||
issues.review.left_comment=bir yorum yaptı
|
||||
issues.review.content.empty=İstenen değişiklik(ler)i belirten bir yorum bırakmanız gerekir.
|
||||
issues.review.reject=%s değişiklik istedi
|
||||
issues.review.reject=%s değişiklik talep etti
|
||||
issues.review.wait=için %s inceleme isteği
|
||||
issues.review.add_review_request=%s tarafından %s inceleme istedi
|
||||
issues.review.remove_review_request=%s %s için inceleme isteği kaldırıldı
|
||||
issues.review.add_review_request=%[2]s, %[1]s tarafından incelenmesi talep etti
|
||||
issues.review.remove_review_request=%[2]s, %[1]s tarafından incelenme talebini kaldırdı
|
||||
issues.review.remove_review_request_self=%s incelemeyi reddetti
|
||||
issues.review.pending=Beklemede
|
||||
issues.review.pending.tooltip=Bu yorum başkaları tarafından görünmüyor. Bekleyen yorumlarınızı göndermek için, sayfanın üstünde "%s" -> "%s/%s/%s" seçin.
|
||||
|
|
@ -2447,7 +2499,7 @@ diff.review.reject=Değişiklik iste
|
|||
diff.review.self_approve=Değişiklik isteği sahipleri kendi değişiklik isteklerini onaylayamazlar
|
||||
diff.committed_by=işlemeyi yapan:
|
||||
diff.protected=Korumalı
|
||||
diff.image.side_by_side=Yan Yana
|
||||
diff.image.side_by_side=Yan yana
|
||||
diff.image.swipe=Kaydır
|
||||
diff.image.overlay=Arayüz
|
||||
diff.has_escaped=Bu satırda gizli evrensel kod karakterler var
|
||||
|
|
@ -2616,6 +2668,55 @@ issues.filter_no_results_placeholder = Arama filtrelerini değiştirmeyi deneyin
|
|||
issues.filter_no_results = Sonuç yok
|
||||
issues.num_participants_one = %d katılımcı
|
||||
|
||||
new_from_template = Bir şablon kullan
|
||||
new_from_template_description = Bu oluşumda bulunan bir depo şablonunu seçip ayarlarını uygulayabilirsiniz.
|
||||
new_advanced = Gelişmiş ayarlar
|
||||
new_advanced_expand = Genişletmek için tıklayın
|
||||
size_format = %[1]s: %[2]s; %[3]s: %[4]s
|
||||
object_format_helper = Deponun nesne biçimi. Sonradan değiştirilemez. SHA1 en uyumlu olanıdır.
|
||||
auto_init_description = Git geçmişini bir README dosyası ve isteğe bağlı olarak License ve .gitignore dosyalarıyla başlat.
|
||||
summary_card_alt = %s deposunun özet kartı
|
||||
archive.nocomment = Depo arşivlenmiş olduğu için yorum yapılamıyor.
|
||||
archive.pull.noreview = Bu depo arşivlenmiş. Birleştirme isteklerini inceleyemezsin.
|
||||
sync_fork.branch_behind_one = Bu dal, %[2]s dalından %[1]d katkı geride
|
||||
sync_fork.branch_behind_few = Bu dal, %[2]s dalından %[1]d katkı geride
|
||||
sync_fork.button = Senkronize et
|
||||
form.string_too_long = Verilen dize %d karakterden uzun.
|
||||
migrate.repo_desc_helper = Var olan açıklamayı içe aktarmak için boş bırakınız
|
||||
subscribe.issue.guest.tooltip = Bu soruna abone olmak için oturum açın.
|
||||
subscribe.pull.guest.tooltip = Bu birleştirme isteğine abone olmak için oturum açın.
|
||||
project = Projeler
|
||||
n_commit_one = %s katkı
|
||||
n_tag_one = %s etiket
|
||||
n_release_one = %s sürüm
|
||||
n_release_few = %s sürüm
|
||||
file_follow = Sembolik bağlantıyı takip et
|
||||
no_eol.text = EOL bulunamadı
|
||||
no_eol.tooltip = Bu dosya, en sonunda satır sonu karakterini içermiyor.
|
||||
editor.invalid_commit_mail = Katkı oluşturmak için geçersiz e-posta.
|
||||
editor.commit_id_not_matching = Siz bu dosyayı düzenlerken dosya değiştirildi. Yeni bir dalda katkı yap ve sonra birleştir.
|
||||
editor.commit_email = Katkı e-postası
|
||||
commits.view_single_diff = Bu dosyaya bu katkıda gelen değişiklikleri görüntüle
|
||||
issues.new.assign_to_me = Kendime ata
|
||||
issues.filter_type.all_pull_requests = Tüm birleştirme istekleri
|
||||
issues.filter_sort.relevance = Alakalılık
|
||||
issues.all_title = Tümü
|
||||
issues.num_reviews_one = %d inceleme
|
||||
issues.num_reviews_few = %d inceleme
|
||||
issues.reaction.add = Tepki ekle
|
||||
issues.reaction.alt_few = %[1]s, %[2]s ile tepki verdi.
|
||||
issues.reaction.alt_many = %[1]s ve %[2]d dahası %[3]s ile tepki verdiler.
|
||||
issues.reaction.alt_remove = %[1]s tepkisini yorumdan kaldır.
|
||||
issues.reaction.alt_add = %[1]s tepkisini yoruma ekle.
|
||||
issues.context.menu = Yorum menüsü
|
||||
issues.author.tooltip.issue = Bu kullanıcı, bu sorunun sahibi.
|
||||
issues.author.tooltip.pr = Bu kullanıcı, bu birleştirme isteğinin sahibi.
|
||||
issues.archived_label_description = (Arşivlenmiş) %s
|
||||
issues.review.add_review_requests = %[2]s, %[1]s tarafından incelenmesi talep etti
|
||||
issues.review.remove_review_requests = %[2]s, %[1]s tarafından incelenme talebini kaldırdı
|
||||
release.hide_archive_links = Otomatik oluşturulmuş arşivleri gizle
|
||||
release.hide_archive_links_helper = Bu sürüm için otomatik oluşturulmuş kaynak kodu arşivlerini gizle. Örneğin, kendi kaynak dosyalarınızı yüklemek isterseniz.
|
||||
|
||||
[graphs]
|
||||
component_loading = %s yükleniyor...
|
||||
component_loading_failed = %s yüklenemedi
|
||||
|
|
@ -3043,7 +3144,7 @@ auths.tip.google_plus=OAuth2 istemci kimlik bilgilerini %s adresindeki Google AP
|
|||
auths.tip.openid_connect=Bitiş noktalarını belirlemek için OpenID Connect Discovery URL'sini kullanın (<server>/.well-known/openid-configuration)
|
||||
auths.tip.twitter=%s adresine gidin, bir uygulama oluşturun ve “Bu uygulamanın Twitter ile oturum açmak için kullanılmasına izin ver” seçeneğinin etkin olduğundan emin olun
|
||||
auths.tip.discord=%s adresinde yeni bir uygulama kaydedin
|
||||
auths.tip.gitea=Yeni bir OAuth2 uygulaması kaydedin. Rehber %s adresinde bulunabilir
|
||||
auths.tip.gitea=Yeni bir OAuth2 uygulaması kaydet. Rehber %s adresinde bulunabilir
|
||||
auths.tip.yandex=`%s adresinde yeni bir uygulama oluşturun. "Yandex.Passport API'sı" bölümünden aşağıdaki izinleri seçin: "E-posta adresine erişim", "Kullanıcı avatarına erişim" ve "Kullanıcı adına, ad ve soyadına, cinsiyete erişim"`
|
||||
auths.tip.mastodon=Kimlik doğrulaması yapmak istediğiniz mastodon örneği için özel bir örnek URL girin (veya varsayılan olanı kullanın)
|
||||
auths.edit=Kimlik Doğrulama Kaynağı Düzenle
|
||||
|
|
@ -3119,7 +3220,7 @@ config.mail_notify=E-Posta Bildirimlerini Etkinleştir
|
|||
config.enable_captcha=CAPTCHA'yı Etkinleştir
|
||||
config.active_code_lives=Kod Yaşamlarını Aktifleştir
|
||||
config.reset_password_code_lives=Hesap Kodunun Sona Erme Zamanını Kurtar
|
||||
config.default_keep_email_private=E-posta Adreslerini Varsayılan Olarak Gizle
|
||||
config.default_keep_email_private=E-posta adreslerini varsayılan olarak gizle
|
||||
config.default_allow_create_organization=Varsayılan Olarak Organizasyonların Oluşturulmasına İzin Ver
|
||||
config.enable_timetracking=Zaman İzlemeyi Etkinleştir
|
||||
config.default_enable_timetracking=Varsayılan Olarak Zaman İzlemeyi Etkinleştir
|
||||
|
|
@ -3657,10 +3758,10 @@ pull_kind = Birleştirme isteklerini ara…
|
|||
keyword_search_unavailable = Anahtar kelime ile arama şu anda kullanıma açık değildir. Lütfen site yöneticisi ile iletişime geçin.
|
||||
fuzzy_tooltip = Arama terimine yakın olan eşleşmeleri dahil et
|
||||
union_tooltip = Boşlukla ayrılmış anahtar kelime eşleşmelerini dahil et
|
||||
exact_tooltip = Sadece arama terimiyle tam uyuşan sonuçları dahit et.
|
||||
exact_tooltip = Sadece arama terimiyle tam uyuşan sonuçları dahil et
|
||||
fuzzy = Bulanık
|
||||
exact = Tam
|
||||
regexp = Düzenliİfade
|
||||
regexp = RegExp
|
||||
regexp_tooltip = Arama terimini düzenli ifade olarak yorumla
|
||||
union = Anahtar sözcük
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -140,6 +140,10 @@ view = Xem
|
|||
test = Thử
|
||||
more_items = Thêm
|
||||
|
||||
active_stopwatch = Theo dõi thời gian hoạt động
|
||||
tracked_time_summary = Tóm tắt thời gian theo dõi dựa vào bộ lọc danh sách vấn đề
|
||||
artifacts = Các đầu ra
|
||||
|
||||
[search]
|
||||
search = Tìm kiếm…
|
||||
type_tooltip = Kiểu tìm
|
||||
|
|
@ -164,6 +168,8 @@ issue_kind = Tìm vấn đề…
|
|||
keyword_search_unavailable = Tìm kiếm bằng từ khoá hiện không khả dụng. Vui lòng liên hệ quản trị viên trang mạng.
|
||||
pull_kind = Tìm lượt kéo…
|
||||
|
||||
commit_kind = Tìm kiếm thay đổi…
|
||||
|
||||
[aria]
|
||||
navbar = Thanh điều hướng
|
||||
footer = Chân trang
|
||||
|
|
@ -178,6 +184,8 @@ contributions_few = đóng góp
|
|||
less = Bớt
|
||||
more = Thêm
|
||||
|
||||
contributions_format = {contributions} trong {day} {month}, {year}
|
||||
|
||||
[editor]
|
||||
buttons.heading.tooltip = Thêm đề mục
|
||||
buttons.bold.tooltip = Tô đậm (Ctrl+B / ⌘B)
|
||||
|
|
@ -204,6 +212,9 @@ link_modal.description = Mô tả
|
|||
link_modal.paste_reminder = Gợi ý: Với một URL trong bảng tạm, bạn có thể dán trực tiếp vào trình soạn thảo để tạo liên kết.
|
||||
buttons.ref.tooltip = Đề cập một vấn đề hoặc yêu cầu kéo
|
||||
|
||||
buttons.enable_monospace_font = Bật phông chữ đơn cách
|
||||
buttons.disable_monospace_font = Tắt phông chữ đơn cách
|
||||
|
||||
[error]
|
||||
occurred = Đã xảy ra lỗi
|
||||
report_message = Nếu bạn tin đây là lỗi Forgejo, vui lòng tìm vấn đề trên <a href="%s" target="_blank">Codeberg</a> hoặc mở vấn đề mới nếu cần thiết.
|
||||
|
|
@ -221,6 +232,8 @@ license = Mã nguồn mở
|
|||
license_desc = Hãy cài đặt <a target="_blank" rel="noopener noreferrer" href="%[1]s">Forgejo</a>! Tham gia với chúng tôi bằng cách <a target="_blank" rel="noopener noreferrer" href="%[2]s">đóng góp</a> để kiến dự án này trở nên tốt đẹp hơn nữa. Đừng ngại trở thành người đóng góp!
|
||||
install_desc = Chỉ cần <a target="_blank" rel="noopener noreferrer" href="%[1]s">chạy tệp chương trình</a> dành cho nền tảng của bạn, cài vào <a target="_blank" rel="noopener noreferrer" href="%[2]s">Docker</a>, hay cài đặt bằng <a target="_blank" rel="noopener noreferrer" href="%[3]s">gói</a>.
|
||||
|
||||
app_desc = Một giải pháp Git dễ chạy và dễ dùng
|
||||
|
||||
[install]
|
||||
install = Cài đặt
|
||||
title = Thiết lập ban đầu
|
||||
|
|
@ -299,7 +312,7 @@ default_keep_email_private = Ẩn địa chỉ thư điện tử theo mặc đ
|
|||
default_keep_email_private.description = Bật ẩn địa chỉ thư điện tử cho người dùng mới theo mặt định để khiến thông tin này không bị lộ ngay sau khi đăng kí.
|
||||
default_allow_create_organization = Cho phép tạo tổ chức theo mặc định
|
||||
default_allow_create_organization.description = Cho phép người dùng mới tạo tổ chức theo mặc định. Khi tuỳ chọn này bị vô hiệu hoá, quản trị viên sẽ phải cấp quyền tạo tổ chức cho người dùng mới.
|
||||
default_enable_timetracking =
|
||||
default_enable_timetracking =Bật theo dõi thời gian theo mặc định
|
||||
admin_title = Cài đặt tài khoản quản trị viên
|
||||
admin_setting.description = Việc tạo tài khoản quản trị viên là không bắt buộc. Người dùng đăng kí đầu tiên sẽ tự động trở thành quản trị viên.
|
||||
admin_name = Tên người dùng quản trị viên
|
||||
|
|
@ -330,6 +343,13 @@ sqlite3_not_available = Phiên bản Forgejo này không hỗ trợ SQLite3. Vui
|
|||
reinstall_confirm_check_1 = Dữ liệu được mã hoá bằng SECRET_KEY trong app.ini có thể bị mất: người dùng có thể không đăng nhập được bằng 2FA/OTP & các bản sao có thể không hoạt động đúng cách. Bằng cách đánh dấu vào ô này bạn xác nhận rằng tệp app.ini hiện tại có SECRET_KEY đúng.
|
||||
secret_key_failed = Tạo mã bí mật thất bại: %v
|
||||
|
||||
db_schema = Khung
|
||||
reinstall_confirm_check_2 = Các kho mã và cài đặt có thể sẽ được đồng bộ lại. Sau khi đánh dấu ô này, bạn xác nhận rằng sẽ thủ công đồng bộ các hooks cho các kho mã và tệp tin authorized_keys. Bạn xác nhận sẽ bảo đảm các cài đặt giữa kho mã và bản sao (mirror) khớp nhau.
|
||||
lfs_path_helper = Các tệp theo dõi bởi Git LFS sẽ được lưu vào thư mục này. Để mục trống để vô hiệu hóa.
|
||||
federated_avatar_lookup = Bật ảnh đại diện liên kết (federated avatars)
|
||||
default_enable_timetracking.description = Mặc định cho phép các kho mã sau này sử dụng tính năng theo dõi thời gian.
|
||||
internal_token_failed = Lỗi khi tạo mã xác thực nội bộ: %v
|
||||
|
||||
[home]
|
||||
uname_holder = Tên người dùng hoặc địa chỉ thư điện tử
|
||||
switch_dashboard_context = Chuyển bối cảnh bảng điều khiển
|
||||
|
|
@ -348,6 +368,8 @@ show_only_private = Chỉ hiện riêng tư
|
|||
show_only_public = Chỉ hiện công khai
|
||||
issues.in_your_repos = Trong các kho mã của bạn
|
||||
|
||||
feed_of = Cập nhật mới từ "%s"
|
||||
|
||||
[explore]
|
||||
repos = Kho mã
|
||||
users = Người dùng
|
||||
|
|
@ -436,6 +458,8 @@ use_scratch_code = Dùng mã xác thực hai lớp dự phòng
|
|||
twofa_passcode_incorrect = Mã xác thực hai lớp của bạn chưa đúng. Nếu bạn đã để sai thiết bị, dùng mã xác thực hai lớp dự phòng của bạn để đăng nhập.
|
||||
twofa_scratch_token_incorrect = Mã xác thực hai lớp dự phòng của bạn chưa đúng.
|
||||
|
||||
twofa_scratch_used = Bạn đã dùng mã xác thực dự phòng. Bạn được chuyển tới trang cài đặt xác thực hai lớp để bạn có thể bỏ đăng ký thiết bị hoặc tạo mới mã xác thực dự phòng.
|
||||
|
||||
[mail]
|
||||
view_it_on = Xem trên %s
|
||||
reply = hoặc trả lời trực tiếp thư này
|
||||
|
|
@ -502,6 +526,9 @@ issue.action.force_push = <b>%[1]s</b> đã ép đẩy <b>%[2]s</b> từ %[3]s
|
|||
issue.action.approve = <b>@%[2]s</b> đã phê duyệt yêu cầu kéo này.
|
||||
issue.action.reject = <b>@%[1]s</b> đã yêu cầu thay đổi đến yêu cầu kéo này.
|
||||
|
||||
issue.action.push_1 = <b>@%[1]s</b> đã đẩy %[3]d thay đổi tới %[2]s
|
||||
issue.action.push_n = <b>@%[1]s</b> đã đẩy nhiều %[3]d thay đổi tới %[2]s
|
||||
|
||||
[modal]
|
||||
yes = Có
|
||||
no = Không
|
||||
|
|
@ -594,6 +621,15 @@ required_prefix = Đầu vào phải bắt đầu bằng "%s"
|
|||
glob_pattern_error = ` mẫu glob không hợp lệ: %s.`
|
||||
AccessToken = Mã truy cập
|
||||
|
||||
PayloadUrl = URL nhận dữ liệu
|
||||
CommitSummary = Tóm tắt thay đổi
|
||||
CommitMessage = Thông tin thay đổi
|
||||
CommitChoice = Lựa chọn thay đổi
|
||||
git_ref_name_error = ` phải là tên tham chiếu Git đúng định dạng. `
|
||||
invalid_group_team_map_error = ` ánh xạ sai: %s `
|
||||
invalid_ssh_principal = Sai chủ thể: %s
|
||||
must_use_public_key = Khóa bạn vừa nhập là khóa bí mật. Hãy chắc chắn không được đăng tải khóa bí mật lên bất cứ đâu. Thay vào đó hãy dùng khóa công khai của bạn.
|
||||
|
||||
[user]
|
||||
change_avatar = Đổi ảnh hồ sơ…
|
||||
joined_on = Đã tham gia từ %s
|
||||
|
|
@ -684,7 +720,7 @@ update_hints = Cập nhật các gợi ý
|
|||
update_hints_success = Đã cập nhật các gợi ý.
|
||||
hidden_comment_types = Loại bình luận bị ẩn
|
||||
hidden_comment_types_description = Các loại bình luận được chọn ở đây sẽ không hiện trên các trang vấn đề. Ví dụ: Chọn "Nhãn" thì sẽ loại bỏ tất cả các bình luận "<user> đã thêm/bỏ <label>".
|
||||
hidden_comment_types.ref_tooltip =
|
||||
hidden_comment_types.ref_tooltip =
|
||||
hidden_comment_types.issue_ref_tooltip = Các bình luận mà người dùng đổi nhánh/nhãn gắn với vấn đề
|
||||
comment_type_group_reference = Đề cập
|
||||
comment_type_group_label = Nhãn
|
||||
|
|
@ -732,7 +768,7 @@ activations_pending = Đang chờ kích hoạt
|
|||
can_not_add_email_activations_pending = Có một lượt kích hoạt đang chờ, thử lại trong vài phút, nếu bạn muốn thêm một thư điện tử mới.
|
||||
delete_email = Gỡ
|
||||
email_deletion = Gỡ địa chỉ thư điện tử
|
||||
email_deletion_desc =
|
||||
email_deletion_desc =Địa chỉ email và các thông tin liên quan sẽ được xóa khỏi tài khoản của bạn. Các bản ghi Git từ địa chỉ này vẫn giữ nguyên. Tiếp tục?
|
||||
email_deletion_success = Đã gỡ địa chỉ thư điện tử.
|
||||
theme_update_success = Đã cập nhật chủ đề của bạn.
|
||||
theme_update_error = Chủ đề đã chọn không tồn tại.
|
||||
|
|
@ -760,7 +796,7 @@ key_content_gpg_placeholder = Bắt đầu bằng "-----BEGIN PGP PUBLIC KEY BLO
|
|||
ssh_key_been_used = Mã SSH này đã được thêm vào máy chủ rồi.
|
||||
ssh_key_name_used = Một mã SSH cùng tên đã tồn tại trong tài khoản của bạn.
|
||||
gpg_key_id_used = Một mã GPG công khai cùng ID đã tồn tại.
|
||||
gpg_no_key_email_found =
|
||||
gpg_no_key_email_found =
|
||||
gpg_key_matched_identities = Các danh tính khớp:
|
||||
gpg_key_verify = Xác thực
|
||||
gpg_token_help = Bạn có thể tạo chữ kí bằng:
|
||||
|
|
@ -781,7 +817,7 @@ delete_key = Gỡ
|
|||
ssh_key_deletion = Gỡ mã SSH
|
||||
gpg_key_deletion = Gỡ mã GPG
|
||||
ssh_key_deletion_desc = Việc gỡ mã SSH sẽ tước quyền truy cập của nó đến tài khoản của bạn. Tiếp tục?
|
||||
gpg_key_deletion_desc =
|
||||
gpg_key_deletion_desc =
|
||||
ssh_key_deletion_success = Đã gỡ mã SSH.
|
||||
gpg_key_deletion_success = Đã gỡ mã GPG.
|
||||
added_on = Đã được thêm từ %s
|
||||
|
|
@ -898,6 +934,15 @@ manage_access_token = Mã truy cập
|
|||
access_token_deletion = Xoá mã truy cập
|
||||
access_token_regeneration = Tái tạo mã truy cập
|
||||
|
||||
quota = Hạn mức
|
||||
comment_type_group_time_tracking = Theo dõi thời gian
|
||||
comment_type_group_dependency = Mô-đun
|
||||
comment_type_group_pull_request_push = Bản ghi đã thêm
|
||||
manage_ssh_principals = Quản lý danh sách chứng chỉ SSH
|
||||
add_key = Thêm khóa
|
||||
ssh_desc = Các khóa SSH công khai này sẽ liên kết với tài khoản của bạn. Các khóa riêng tư tương ứng cho phép truy cập đầy đủ vào kho mã của bạn. Những khóa SSH đã xác minh có thể dùng để xác nhận các bản ghi Git được ký bởi SSH.
|
||||
principal_desc = Những chứng chỉ SSH này được liên kết với tài khoản của bạn và được phép truy cập toàn diện vào các kho mã của bạn.
|
||||
|
||||
[repo]
|
||||
admin.manage_flags = Quản lí nhãn
|
||||
admin.enabled_flags = Nhãn được bật cho kho mã:
|
||||
|
|
@ -1470,4 +1515,11 @@ filter.container.untagged = Không được gắn nhãn
|
|||
npm.details.tag = Nhãn
|
||||
|
||||
[actions]
|
||||
runs.pushed_by = đẩy bởi
|
||||
runs.pushed_by = đẩy bởi
|
||||
|
||||
[filter]
|
||||
string.asc = A - Z
|
||||
string.desc = Z - A
|
||||
|
||||
[translation_meta]
|
||||
test = Đây là đoạn chữ kiểm thử. Nó sẽ không hiển thị trên giao diện của Forgejo nhưng sẽ được dùng vào các mục đích kiểm thử. Hãy thoải mái ấn "ok" để tiết kiệm thời gian để lấy cái mốc hoàn thành 100% ấy (1 điều vui nhỏ) :)
|
||||
|
|
@ -21,7 +21,7 @@ active_stopwatch=活跃时间跟踪器
|
|||
tracked_time_summary=议题列表过滤器的跟踪时间摘要
|
||||
create_new=创建…
|
||||
user_profile_and_more=个人信息与设置…
|
||||
signed_in_as=已登录用户
|
||||
signed_in_as=已登录
|
||||
enable_javascript=此网站需要 JavaScript。
|
||||
toc=目录
|
||||
licenses=许可证
|
||||
|
|
@ -173,8 +173,8 @@ contributions_zero=没有贡献
|
|||
less=较少
|
||||
more=较多
|
||||
contributions_format = {year}年{month}{day}日有{contributions}
|
||||
contributions_few = 贡献
|
||||
contributions_one = 贡献
|
||||
contributions_few = 项贡献
|
||||
contributions_one = 项贡献
|
||||
|
||||
[editor]
|
||||
buttons.heading.tooltip=添加标题
|
||||
|
|
@ -328,7 +328,7 @@ default_allow_create_organization=默认情况下允许创建组织
|
|||
default_allow_create_organization.description=默认允许新用户创建组织。禁用此选项时,管理员必须向新用户授予创建组织的权限。
|
||||
default_enable_timetracking=默认情况下启用时间跟踪
|
||||
default_enable_timetracking.description=默认允许新仓库使用时间跟踪功能。
|
||||
no_reply_address=隐藏电子邮件
|
||||
no_reply_address=隐藏的电子邮件域名
|
||||
no_reply_address_helper=用于设置隐藏电子邮件地址的用户使用的电子邮件域名。例如,如果用于隐藏电子邮件地址的域名设为“noreply.example.org”,则用户名 “joe” 在 Git 中将以 “joe@noreply.example.org” 表示。
|
||||
password_algorithm=密码哈希算法
|
||||
invalid_password_algorithm=无效的密码哈希算法
|
||||
|
|
@ -445,8 +445,8 @@ password_pwned=此密码出现在 <a target="_blank" rel="noopener noreferrer" h
|
|||
password_pwned_err=无法完成对 HaveIBeenPwned 的请求
|
||||
last_admin=您不能删除最后一个管理员。必须至少保留一个管理员。
|
||||
change_unconfirmed_email = 如果您在注册时提供了错误的邮箱地址,您可以在下方修改,激活邮件会发送到修改后的邮箱地址。
|
||||
change_unconfirmed_email_summary = 修改用来接收激活邮件的邮箱地址。
|
||||
change_unconfirmed_email_error = 无法修改邮箱地址:%v
|
||||
change_unconfirmed_email_summary = 更改接收激活邮件的电子邮件地址。
|
||||
change_unconfirmed_email_error = 无法更改电子邮件地址:%v
|
||||
hint_login = 已经有账户了吗?<a href="%s">立即登录!</a>
|
||||
back_to_sign_in = 返回登录
|
||||
sign_in_openid = 继续使用 OpenID
|
||||
|
|
@ -616,7 +616,7 @@ invalid_ssh_key=无法验证您的 SSH 密钥:%s
|
|||
invalid_gpg_key=无法验证您的 GPG 密钥:%s
|
||||
invalid_ssh_principal=无效的规则:%s
|
||||
must_use_public_key=您提供的密钥是私钥。不要在任何地方上传您的私钥,请改用您的公钥。
|
||||
unable_verify_ssh_key=无法验证 SSH 密钥,请仔细检查是否有错误。
|
||||
unable_verify_ssh_key=无法验证 SSH 公钥,请仔细检查是否有错误。
|
||||
auth_failed=授权验证失败:%v
|
||||
|
||||
still_own_repo=此帐户仍拥有至少一个仓库,您需要先删除或转移它们。
|
||||
|
|
@ -692,7 +692,7 @@ appearance=外观
|
|||
password=修改密码
|
||||
security=安全
|
||||
avatar=头像设置
|
||||
ssh_gpg_keys=SSH / GPG 密钥
|
||||
ssh_gpg_keys=SSH / GPG 公钥
|
||||
applications=应用
|
||||
orgs=组织
|
||||
repos=仓库列表
|
||||
|
|
@ -762,7 +762,7 @@ password_incorrect=当前密码不正确。
|
|||
change_password_success=您的密码已更新。从现在开始请使用您的新密码登录。
|
||||
password_change_disabled=非本地帐户不能通过 Forgejo 的 web 界面更改密码。
|
||||
|
||||
manage_emails=管理邮箱地址
|
||||
manage_emails=管理电子邮件地址
|
||||
manage_themes=默认主题
|
||||
manage_openid=OpenID 地址
|
||||
email_desc=您的主要电子邮件地址将用于通知、密码恢复,基于网页界面的Git操作(只要它不是设置为隐藏的)。
|
||||
|
|
@ -783,31 +783,31 @@ theme_update_error=所选主题不存在。
|
|||
openid_deletion=移除 OpenID 地址
|
||||
openid_deletion_desc=删除此 OpenID 地址将会阻止你使用它进行登录。你确定要继续吗?
|
||||
openid_deletion_success=OpenID地址已被移除。
|
||||
add_new_email=添加邮箱地址
|
||||
add_new_email=添加电子邮件地址
|
||||
add_new_openid=添加新的 OpenID URI
|
||||
add_email=增加电子邮件地址
|
||||
add_email=添加电子邮件地址
|
||||
add_openid=添加 OpenID URI
|
||||
add_email_confirmation_sent=确认邮件已发送至“%s”。请检查您的收件箱并在接下来的 %s 内点击提供的链接以确认您的电子邮件地址。
|
||||
add_email_success=新的电子邮件地址已添加。
|
||||
email_preference_set_success=电子邮件首选项已成功设置。
|
||||
add_openid_success=新的 OpenID 地址已添加。
|
||||
keep_email_private=隐藏邮箱地址
|
||||
keep_email_private=隐藏电子邮件地址
|
||||
keep_email_private_popup=您的邮件地址不会在个人资料中显示,也不会成为通过网页界面提交的默认地址,例如文件上传、编辑和合并提交。相反,可以使用特殊地址 %s 将提交链接到您的账号。此选项不会影响现有提交。
|
||||
openid_desc=OpenID 让你可以将认证转发到外部服务。
|
||||
|
||||
manage_ssh_keys=管理 SSH 密钥
|
||||
manage_ssh_keys=管理 SSH 公钥
|
||||
manage_ssh_principals=管理SSH证书规则
|
||||
manage_gpg_keys=管理 GPG 密钥
|
||||
add_key=增加密钥
|
||||
ssh_desc=这些 SSH 公钥已经关联到你的账号。相应的私钥拥有完全操作你的仓库的权限,且已验证的 SSH 密钥可以用于验证 SSH 签名的 Git 提交。
|
||||
ssh_desc=这些 SSH 公钥已经关联到你的账号。相应的私钥拥有完全操作你的仓库的权限,且已验证的 SSH 密钥可以验证 SSH 签名的 Git 提交。
|
||||
principal_desc=这些SSH证书规则已关联到你的账号将允许完全访问你的所有仓库。
|
||||
gpg_desc=这些 GPG 公钥已经关联到你的账号,并用于验证您的提交。请妥善保管你的私钥,因为这些私钥可以用于以你的身份签名提交。
|
||||
ssh_helper=<strong>需要帮助?</strong> 请查看有关 <a href="%s">如何生成 SSH 密钥</a> 或 <a href="%s">常见 SSH 问题</a> 寻找答案。
|
||||
gpg_desc=这些 GPG 公钥已经关联到你的账号,并用于验证您的提交。请妥善保管你的私钥,因为这些私钥可以以你的身份签名提交。
|
||||
ssh_helper=<strong>需要帮助?</strong>请查看<a href="%s">如何生成 SSH 密钥</a>或<a href="%s">常见 SSH 问题</a>寻找答案。
|
||||
gpg_helper=<strong>需要帮助吗?</strong>建议看一看 GitHub 的 <a href="%s">关于GPG</a> 的指导。
|
||||
key_content_ssh_placeholder=以“ssh-ed25519”、“ssh-rsa”、“ecdsa-sha2-nistp256”、“ecdsa-sha2-nistp384”、“ecdsa-sha2-nistp521”、“sk-ecdsa-sha2-nistp256@openssh.com” 或 “sk-ssh-ed25519@openssh.com” 开头
|
||||
key_content_gpg_placeholder=以 “-----BEGIN PGP PUBLIC KEY BLOCK-----” 开头
|
||||
add_new_principal=添加规则
|
||||
ssh_key_been_used=此 SSH 密钥已添加到服务器。
|
||||
ssh_key_been_used=此 SSH 公钥已被添加到此服务器。
|
||||
ssh_key_name_used=使用相同名称的SSH公钥已存在。
|
||||
ssh_principal_been_used=此规则已经加入到了服务器。
|
||||
gpg_key_id_used=具有相同 ID 的 GPG 公钥已存在。
|
||||
|
|
@ -824,32 +824,32 @@ gpg_token_help=您可以使用以下方式生成签名:
|
|||
gpg_token_signature=GPG 增强签名
|
||||
key_signature_gpg_placeholder=以 “-----BEGIN PGP SIGNATURE-----” 开头
|
||||
verify_gpg_key_success=GPG 密钥 %s 已被验证。
|
||||
ssh_key_verified=已验证的密钥
|
||||
ssh_key_verified_long=密钥已经用令牌进行了验证,并且可以用来验证匹配此用户任何已激活电子邮件地址的提交。
|
||||
ssh_key_verified=已验证的公钥
|
||||
ssh_key_verified_long=公钥已由令牌进行了验证,并且可以用来验证匹配此用户任何已激活电子邮件地址的提交。
|
||||
ssh_key_verify=验证
|
||||
ssh_invalid_token_signature=提供的 SSH 密钥、签名或令牌不匹配或令牌已过期。
|
||||
ssh_invalid_token_signature=提供的 SSH 公钥、签名或令牌不匹配或令牌已过期。
|
||||
ssh_token_required=您必须为下面的令牌提供签名
|
||||
ssh_token=令牌
|
||||
ssh_token_help=您可以使用以下方式生成签名:
|
||||
ssh_token_signature=增强 SSH 签名
|
||||
key_signature_ssh_placeholder=以 “-----BEGIN SSH SIGNATURE -----” 开头
|
||||
verify_ssh_key_success=SSH 密钥 %s 已被验证。
|
||||
verify_ssh_key_success=SSH 公钥 %s 已通过验证。
|
||||
subkeys=子项
|
||||
key_id=键ID
|
||||
key_name=密钥名称
|
||||
key_content=密钥内容
|
||||
principal_content=内容
|
||||
add_key_success=SSH 密钥 %s 添加成功。
|
||||
add_key_success=SSH 公钥 %s 已被成功添加。
|
||||
add_gpg_key_success=GPG 密钥 %s 添加成功。
|
||||
add_principal_success=SSH证书规则 %s 添加成功。
|
||||
delete_key=删除
|
||||
ssh_key_deletion=删除 SSH 密钥
|
||||
ssh_key_deletion=删除 SSH 公钥
|
||||
gpg_key_deletion=删除 GPG 密钥
|
||||
ssh_principal_deletion=删除 SSH 证书规则
|
||||
ssh_key_deletion_desc=删除 SSH 公钥将取消对应的私钥对您的 Forgejo 帐户的访问权限。继续?
|
||||
gpg_key_deletion_desc=删除 GPG 公钥将无法认知使用对应私钥签名的提交,继续?
|
||||
ssh_principal_deletion_desc=删除此 SSH 证书规则将取消它对您的账户的访问权限。继续?
|
||||
ssh_key_deletion_success=SSH 密钥已被删除。
|
||||
ssh_key_deletion_success=SSH 公钥已被删除。
|
||||
gpg_key_deletion_success=GPG 密钥已被删除。
|
||||
ssh_principal_deletion_success=此规则删除成功。
|
||||
added_on=添加于 %s
|
||||
|
|
@ -865,8 +865,8 @@ principal_state_desc=7 天内使用过该规则
|
|||
show_openid=在个人信息上显示
|
||||
hide_openid=在个人信息上隐藏
|
||||
ssh_disabled=SSH 已禁用
|
||||
ssh_signonly=SSH 目前已禁用,因此这些密钥仅用于提交签名验证。
|
||||
ssh_externally_managed=此 SSH 密钥是由外部管理的
|
||||
ssh_signonly=SSH 目前已被禁用,因此这些公钥仅用于验证提交签名。
|
||||
ssh_externally_managed=此 SSH 公钥是由外部服务所管理的
|
||||
manage_access_token=访问令牌
|
||||
generate_new_token=生成新的令牌
|
||||
tokens_desc=这些令牌拥有通过 Forgejo API 对您的帐户的访问权限。
|
||||
|
|
@ -939,7 +939,7 @@ passcode_invalid=密码不正确。再试一次。
|
|||
twofa_enrolled=你的账号已经启用了两步验证。请保存初始令牌(%s)到一个安全的地方,此令牌仅当前显示一次。
|
||||
twofa_failed_get_secret=获取 secret 失败。
|
||||
|
||||
webauthn_desc=安全密钥是包含加密密钥的硬件设备。它们可以用于双因素身份验证。安全密钥必须支持 <a rel="noreferrer" target="_blank" href="%s">WebAuthn 身份验证器</a> 标准。
|
||||
webauthn_desc=安全密钥是包含加密密钥的硬件设备。它们可以用于双因素身份验证。安全密钥必须支持 <a rel="noreferrer" target="_blank" href="%s">WebAuthn 身份验证器</a>标准。
|
||||
webauthn_register_key=添加安全密钥
|
||||
webauthn_nickname=昵称
|
||||
webauthn_delete_key=移除安全密钥
|
||||
|
|
@ -1086,7 +1086,7 @@ mirror_sync = 已同步
|
|||
mirror_sync_on_commit=推送提交时同步
|
||||
mirror_address=从 URL 克隆
|
||||
mirror_address_desc=在授权框中输入必要的凭据。
|
||||
mirror_address_url_invalid=URL无效。请检查所输入URL的所有部分是否被正确地转译。
|
||||
mirror_address_url_invalid=URL无效。请检查所输入URL的所有部分是否被正确地转义。
|
||||
mirror_address_protocol_invalid=提供的URL无效。只能使用http(s)://或git://地址进行镜像操作。
|
||||
mirror_lfs=大文件存储(LFS)
|
||||
mirror_lfs_desc=镜像 LFS 数据。
|
||||
|
|
@ -1246,7 +1246,7 @@ tag=Git标签
|
|||
released_this=发布
|
||||
file.title=%s 位于 %s
|
||||
file_raw=原始文件
|
||||
file_history=文件历史
|
||||
file_history=历史
|
||||
file_view_source=源码模式
|
||||
file_view_rendered=渲染模式
|
||||
file_view_raw=查看原始文件
|
||||
|
|
@ -1260,8 +1260,8 @@ invisible_runes_line=`此行含有不可见的 unicode 字符`
|
|||
ambiguous_runes_line=`此行有模棱两可的 unicode 字符`
|
||||
ambiguous_character=`%[1]c [U+%04[1]X] 容易和 %[2]c [U+%04[2]X] 混淆`
|
||||
|
||||
escape_control_characters=Escape
|
||||
unescape_control_characters=Unescape
|
||||
escape_control_characters=转义
|
||||
unescape_control_characters=反转义
|
||||
file_copy_permalink=复制固定链接
|
||||
view_git_blame=查看 Git Blame
|
||||
video_not_supported_in_browser=您的浏览器不支持 HTML5 “video” 标签。
|
||||
|
|
@ -1489,11 +1489,11 @@ issues.change_ref_at=`将引用从 <b><strike>%s</strike></b> 更改为了 <b>%s
|
|||
issues.remove_ref_at=`删除了引用 <b>%s</b> %s`
|
||||
issues.add_ref_at=`添加了引用 <b>%s</b> %s`
|
||||
issues.delete_branch_at=`于 %[2]s 删除了分支 <b>%[1]s</b>`
|
||||
issues.filter_label=标签筛选
|
||||
issues.filter_label=标签
|
||||
issues.filter_label_exclude=使用 <kbd>Alt</kbd> + <kbd>单击</kbd> 排除标签
|
||||
issues.filter_label_no_select=所有标签
|
||||
issues.filter_label_select_no_label=无标签
|
||||
issues.filter_milestone=里程碑筛选
|
||||
issues.filter_milestone=里程碑
|
||||
issues.filter_milestone_all=所有里程碑
|
||||
issues.filter_milestone_none=无里程碑
|
||||
issues.filter_milestone_open=进行中的里程碑
|
||||
|
|
@ -1501,12 +1501,12 @@ issues.filter_milestone_closed=已关闭的里程碑
|
|||
issues.filter_project=项目
|
||||
issues.filter_project_all=所有项目
|
||||
issues.filter_project_none=暂无项目
|
||||
issues.filter_assignee=指派人筛选
|
||||
issues.filter_assignee=指派人
|
||||
issues.filter_assginee_no_select=所有指派成员
|
||||
issues.filter_assginee_no_assignee=未指派
|
||||
issues.filter_poster=作者
|
||||
issues.filter_poster_no_select=所有作者
|
||||
issues.filter_type=类型筛选
|
||||
issues.filter_type=类型
|
||||
issues.filter_type.all_issues=所有议题
|
||||
issues.filter_type.assigned_to_you=指派给您的
|
||||
issues.filter_type.created_by_you=由您创建的
|
||||
|
|
@ -1536,8 +1536,8 @@ issues.action_assignee_no_select=未指派
|
|||
issues.action_check=选中/取消选中
|
||||
issues.action_check_all=选中/取消选中所有项目
|
||||
issues.opened_by=由 <a href="%[2]s">%[3]s</a> 于 %[1]s创建
|
||||
pulls.merged_by=由 <a href="%[2]s">%[3]s</a> 创建,被合并于 %[1]s
|
||||
pulls.merged_by_fake=由 %[2]s 创建,被合并于 %[1]s
|
||||
pulls.merged_by=由 <a href="%[2]s">%[3]s</a> 创建,合并于 %[1]s
|
||||
pulls.merged_by_fake=由 %[2]s 创建,合并于 %[1]s
|
||||
issues.closed_by=由 <a href="%[2]s">%[3]s</a> 创建,被关闭于 %[1]s
|
||||
issues.opened_by_fake=由 %[2]s 于 %[1]s 打开
|
||||
issues.closed_by_fake=由 %[2]s 创建,被关闭于 %[1]s
|
||||
|
|
@ -1670,7 +1670,7 @@ issues.push_commit_1=于 %[2]s 推送了 %[1]d 个提交
|
|||
issues.push_commits_n=于 %[2]s 推送了 %[1]d 个提交
|
||||
issues.force_push_codes=`于 %[6]s 强制推送 %[1]s,从 <a class="%[7]s" href="%[3]s"><code>%[2]s</code></a> %[8]s,至 <a class="%[7]s" href="%[5]s"><code>%[4]s</code></a> %[9]s`
|
||||
issues.force_push_compare=比较
|
||||
issues.due_date_form=yyyy-mm-dd
|
||||
issues.due_date_form=yyyy年mm月dd日
|
||||
issues.due_date_form_edit=编辑
|
||||
issues.due_date_form_remove=删除
|
||||
issues.due_date_not_set=未设置到期时间。
|
||||
|
|
@ -1818,8 +1818,8 @@ pulls.approve_count_1=%d 项批准
|
|||
pulls.approve_count_n=%d 项批准
|
||||
pulls.reject_count_1=%d 变更请求
|
||||
pulls.reject_count_n=%d 变更请求
|
||||
pulls.waiting_count_1=%d 个正在等待评审
|
||||
pulls.waiting_count_n=%d 个正在等待评审
|
||||
pulls.waiting_count_1=正等待 %d 人评审
|
||||
pulls.waiting_count_n=正等待 %d 人评审
|
||||
pulls.wrong_commit_id=提交 ID 必须是目标分支上的提交的 ID
|
||||
|
||||
pulls.no_merge_desc=由于未启用合并选项,此合并请求无法被合并。
|
||||
|
|
@ -1848,7 +1848,7 @@ pulls.push_rejected=合并失败:推送被拒绝。请查看此仓库的 Git
|
|||
pulls.push_rejected_summary=详细拒绝信息
|
||||
pulls.push_rejected_no_message=推送失败:此推送被拒绝但未提供其他信息。请检查此仓库的 Git 钩子
|
||||
pulls.open_unmerged_pull_exists=`您不能执行重新打开操作, 因为已经存在相同的合并请求(#%d)。`
|
||||
pulls.status_checking=一些检测仍在等待运行
|
||||
pulls.status_checking=仍在等待一些检测
|
||||
pulls.status_checks_success=所有检测均成功
|
||||
pulls.status_checks_warning=一些检测报告了警告
|
||||
pulls.status_checks_failure=一些检测失败了
|
||||
|
|
@ -2315,7 +2315,7 @@ settings.packagist_api_token=API 令牌
|
|||
settings.packagist_package_url=Packagist 软件包 URL
|
||||
settings.deploy_keys=部署密钥
|
||||
settings.add_deploy_key=添加部署密钥
|
||||
settings.deploy_key_desc=部署密钥具有对仓库的只读拉取权限。
|
||||
settings.deploy_key_desc=部署密钥对仓库可具有只读或读写访问权限。
|
||||
settings.is_writable=启用写权限
|
||||
settings.is_writable_info=允许此部署密钥 <strong>推送</strong> 提交到仓库。
|
||||
settings.no_deploy_keys=没有部署密钥。
|
||||
|
|
@ -2718,7 +2718,7 @@ activity.commit = 提交活动
|
|||
pulls.cmd_instruction_merge_warning = <b>警告:</b>未启用此仓库的“自动检测手动合并”设置,您之后必须将此合并请求标记为手动合并。
|
||||
settings.protect_new_rule = 创建新的分支保护规则
|
||||
mirror_denied_combination = 不能同时使用公钥和基于密码的验证。
|
||||
mirror_public_key = 公共 SSH 密钥
|
||||
mirror_public_key = 公共 SSH 公钥
|
||||
mirror_use_ssh.text = 使用 SSH 验证
|
||||
mirror_use_ssh.helper = 选择此选项后,Forgejo 将通过 SSH 以 Git 方式镜像仓库,并为您创建一个密钥对。您必须确保已授权生成的公钥推送到目标仓库。选择此选项时,不能使用基于密码的授权。
|
||||
settings.mirror_settings.push_mirror.copy_public_key = 复制公钥
|
||||
|
|
@ -2783,9 +2783,9 @@ tree_path_not_found.branch = 路径 %[1]s 在分支 %[2]s 中不存在
|
|||
tree_path_not_found.tag = 路径 %[1]s 在标签 %[2]s 中不存在
|
||||
|
||||
[graphs]
|
||||
component_loading=正在加载 %s…
|
||||
component_loading_failed=无法加载 %s
|
||||
component_loading_info=这可能需要一点…
|
||||
component_loading=正在加载%s…
|
||||
component_loading_failed=无法加载%s
|
||||
component_loading_info=这可能需要一点时间…
|
||||
component_failed_to_load=意外的错误发生了。
|
||||
contributors.what=贡献
|
||||
recent_commits.what = 近期提交
|
||||
|
|
@ -2924,7 +2924,7 @@ integrations=集成
|
|||
authentication=认证源
|
||||
emails=用户邮件
|
||||
config=应用配置
|
||||
notices=系统提示
|
||||
notices=系统通知
|
||||
monitor=监控面板
|
||||
first_page=首页
|
||||
last_page=末页
|
||||
|
|
@ -3072,7 +3072,7 @@ users.list_status_filter.is_prohibit_login=禁止登录
|
|||
users.list_status_filter.not_prohibit_login=允许登录
|
||||
users.list_status_filter.is_2fa_enabled=已启用 2FA
|
||||
users.list_status_filter.not_2fa_enabled=未启用 2FA
|
||||
users.details=用户详细信息
|
||||
users.details=用户详情
|
||||
|
||||
emails.email_manage_panel=管理用户邮件地址
|
||||
emails.primary=主要的
|
||||
|
|
@ -3298,7 +3298,7 @@ config.enable_timetracking=启用时间跟踪
|
|||
config.default_enable_timetracking=默认情况下启用时间跟踪
|
||||
config.allow_dots_in_usernames = 允许用户在用户名中使用英文句号。不影响已有的帐户。
|
||||
config.default_allow_only_contributors_to_track_time=仅允许成员跟踪时间
|
||||
config.no_reply_address=隐藏电子邮件域名
|
||||
config.no_reply_address=隐藏的电子邮件域名
|
||||
config.default_visibility_organization=新组织的默认可见性
|
||||
config.default_enable_dependencies=默认情况下启用议题依赖
|
||||
|
||||
|
|
@ -3320,7 +3320,7 @@ config.mailer_sendmail_path=Sendmail 路径
|
|||
config.mailer_sendmail_args=Sendmail 的额外参数
|
||||
config.mailer_sendmail_timeout=Sendmail 超时
|
||||
config.mailer_use_dummy=Dummy
|
||||
config.test_email_placeholder=电子邮址(例如,test@example.com)
|
||||
config.test_email_placeholder=电子邮址(例如:test@example.com)
|
||||
config.send_test_mail=发送测试邮件
|
||||
config.send_test_mail_submit=发送
|
||||
config.test_mail_failed=发送测试邮件至 "%s" 时失败:%v
|
||||
|
|
@ -3411,8 +3411,8 @@ monitor.queue.settings.changed=设置已更新
|
|||
monitor.queue.settings.remove_all_items=移除全部
|
||||
monitor.queue.settings.remove_all_items_done=队列中的所有项目已被移除。
|
||||
|
||||
notices.system_notice_list=系统提示管理
|
||||
notices.view_detail_header=查看提示详情
|
||||
notices.system_notice_list=系统通知
|
||||
notices.view_detail_header=通知详情
|
||||
notices.operations=操作
|
||||
notices.select_all=选中全部
|
||||
notices.deselect_all=取消全选
|
||||
|
|
@ -3879,7 +3879,7 @@ issue_kind = 搜索议题…
|
|||
pull_kind = 搜索合并请求…
|
||||
exact_tooltip = 仅包含与搜索词精确匹配的结果
|
||||
union_tooltip = 包括与以空格分隔的关键字中任意一个相匹配的结果
|
||||
union = 关键字
|
||||
union = 交集
|
||||
regexp = 正则表达式
|
||||
regexp_tooltip = 将搜索内容解释为正则表达式
|
||||
|
||||
|
|
|
|||
|
|
@ -4,5 +4,122 @@
|
|||
"home.welcome.activity_hint": "У вашай стужцы пакуль што нічога няма. Вашыя дзеяньні ды падзеі з рэпазыторыяў зьявяцца тут.",
|
||||
"home.explore_repos": "Агляд рэпазыторыяў",
|
||||
"home.explore_users": "Агляд карыстальнікаў",
|
||||
"home.explore_orgs": "Агляд арганізацый"
|
||||
"home.explore_orgs": "Агляд арганізацый",
|
||||
"stars.list.none": "Ніхто не пазначыў гэты рэпазіторый зоркай.",
|
||||
"watch.list.none": "Ніхто не назірае за гэтым рэпазіторыем.",
|
||||
"followers.incoming.list.self.none": "Ніхто не падпісаўся на ваш профіль.",
|
||||
"followers.incoming.list.none": "Ніхто не падпісаўся на гэтага карыстальніка.",
|
||||
"followers.outgoing.list.self.none": "Вы нікога не спягледзіце.",
|
||||
"followers.outgoing.list.none": "%s не падпісаны на каго-небудзь.",
|
||||
"relativetime.now": "зараз",
|
||||
"relativetime.future": "у будучыні",
|
||||
"relativetime.1day": "учора",
|
||||
"relativetime.2days": "два дні таму",
|
||||
"relativetime.1week": "на мінулай тыдні",
|
||||
"relativetime.2weeks": "два тыдні таму",
|
||||
"relativetime.1month": "у мінулым месяцы",
|
||||
"relativetime.2months": "два месяцы таму",
|
||||
"relativetime.1year": "у мінулым годзе",
|
||||
"relativetime.2years": "два гады таму",
|
||||
"repo.pulls.already_merged": "Зліццё не ўдалося: гэты запыт на зліццё ўжо быў зліты.",
|
||||
"repo.form.cannot_create": "Усе прасторы, у якіх вы можаце ствараць рэпазітарыі, дасягнулі ліміту рэпазітараў.",
|
||||
"migrate.form.error.url_credentials": "URL утрымлівае ўліковыя запісы, увядзіце іх адпаведна ў палях імя карыстальніка і пароля",
|
||||
"migrate.github.description": "Міграцыя дадзеных з github.com або сервера GitHub Enterprise.",
|
||||
"migrate.git.description": "Міграцыя рэпазітарыя толькі з любога Git-сервісу.",
|
||||
"migrate.gitea.description": "Міграцыя дадзеных з gitea.com або іншых экземпляраў Gitea.",
|
||||
"migrate.gitlab.description": "Міграцыя дадзеных з gitlab.com або іншых экземпляраў GitLab.",
|
||||
"migrate.gogs.description": "Міграцыя дадзеных з notabug.org або іншых экземпляраў Gogs.",
|
||||
"migrate.onedev.description": "Міграцыя дадзеных з code.onedev.io або іншых экземпляраў OneDev.",
|
||||
"migrate.gitbucket.description": "Міграцыя дадзеных з экземпляраў GitBucket.",
|
||||
"migrate.codebase.description": "Міграцыя дадзеных з codebasehq.com.",
|
||||
"migrate.forgejo.description": "Міграцыя дадзеных з codeberg.org або іншых экземпляраў Forgejo.",
|
||||
"repo.issue_indexer.title": "Індэксатар праблем",
|
||||
"search.milestone_kind": "Пошук мільгамаў…",
|
||||
"repo.settings.push_mirror.branch_filter.label": "Фільтр галін (неабавязкова)",
|
||||
"repo.settings.push_mirror.branch_filter.description": "Галіны, якія трэба адлюстраваць. Пакіньце пустым, каб адлюстраваць усе галіны. Глядзіце <a href=\"%[1]s\">%[2]s дакументацыю</a> для сінтаксісу. Прыклады: <code>main, release/*</code>",
|
||||
"incorrect_root_url": "Гэты экземпляр Forgejo настаўлены на службу на \"%s\". Зараз вы пераглядаеце Forgejo праз іншы URL, што можа прывесці да збояў у частках прыкладання. Кананічны URL кантралюецца адміністратарамі Forgejo праз наладу ROOT_URL у файле app.ini.",
|
||||
"themes.names.forgejo-auto": "Forgejo (падаўжыць сістэмную тэму)",
|
||||
"themes.names.forgejo-light": "Forgejo светлая",
|
||||
"themes.names.forgejo-dark": "Forgejo цёмная",
|
||||
"error.not_found.title": "Старонка не знойдзена",
|
||||
"warning.repository.out_of_sync": "Прадстаўленне гэтага рэпазіторыя ў базе дадзеных не сінхронізавана. Калі гэта папярэджанне застаецца пасля пуша каміта ў гэты рэпазіторый, звяжыцеся з адміністратарам.",
|
||||
"alert.asset_load_failed": "Не ўдалося загрузіць файлы рэсурсаў з {path}. Калі ласка, пераканайцеся, што файлы рэсурсаў даступныя.",
|
||||
"alert.range_error": " павінна быць лікам паміж %[1]s і %[2]s.",
|
||||
"install.invalid_lfs_path": "Немагчыма стварыць корань LFS па указаным шляху: %[1]s",
|
||||
"profile.actions.tooltip": "Больш дзеянняў",
|
||||
"profile.edit.link": "Рэдагаваць профіль",
|
||||
"feed.atom.link": "Канал Atom",
|
||||
"keys.ssh.link": "SSH-ключы",
|
||||
"keys.gpg.link": "GPG-ключы",
|
||||
"admin.config.moderation_config": "Наладкі мадэрацыі",
|
||||
"admin.moderation.moderation_reports": "Спісы мадэрацыі",
|
||||
"admin.moderation.reports": "Спісы",
|
||||
"admin.moderation.no_open_reports": "На цяперашні момант адкрытых спісаў няма.",
|
||||
"admin.moderation.deleted_content_ref": "Паведамлены змест тыпу %[1]v і ідэнтыфікатара %[2]d больш не існуе",
|
||||
"moderation.report_abuse": "Паведаміць аб злым ужыванні",
|
||||
"moderation.report_content": "Паведаміць аб змесце",
|
||||
"moderation.report_abuse_form.header": "Паведаміць аб злым ужыванні адміністратару",
|
||||
"moderation.report_abuse_form.details": "Гэтая форма павінна выкарыстоўвацца для паведамлення пра карыстальнікаў, якія ствараюць спам-профілі, рэпазітарыі, праблемы, каментары або паводзяцца няўжыткова.",
|
||||
"moderation.report_abuse_form.invalid": "Няправільныя аргументы",
|
||||
"moderation.report_abuse_form.already_reported": "Вы ўжо паведамілі пра гэты змест",
|
||||
"moderation.abuse_category": "Катэгорыя",
|
||||
"moderation.abuse_category.placeholder": "Выберыце катэгорыю",
|
||||
"moderation.abuse_category.spam": "Спам",
|
||||
"moderation.abuse_category.illegal_content": "Незаконны змест",
|
||||
"moderation.abuse_category.other_violations": "Іншыя парушэнні правіл платформы",
|
||||
"moderation.report_remarks": "Заўвагі",
|
||||
"moderation.report_remarks.placeholder": "Калі ласка, падрабязна апішыце злаўжыванне, якое вы паведамляеце.",
|
||||
"moderation.submit_report": "Адправіць паведамленне",
|
||||
"moderation.reporting_failed": "Немагчыма адправіць новае паведамленне аб злаўжыванні: %v",
|
||||
"moderation.reported_thank_you": "Дзякуем за ваша паведамленне. Адміністрацыя была апавешчана.",
|
||||
"mail.actions.successful_run_after_failure_subject": "Працэс %[1]s адноўлены ў рэпазіторы %[2]s",
|
||||
"mail.actions.not_successful_run_subject": "Працэс %[1]s не ўдалося ў рэпазіторы %[2]s",
|
||||
"mail.actions.successful_run_after_failure": "Працэс %[1]s адноўлены ў рэпазіторы %[2]s",
|
||||
"mail.actions.not_successful_run": "Працэс %[1]s не ўдалося ў рэпазіторы %[2]s",
|
||||
"mail.actions.run_info_cur_status": "Стан гэтага запуску: %[1]s (толькі што абноўлена з %[2]s)",
|
||||
"mail.actions.run_info_previous_status": "Стан папярэдняга запуску: %[1]s",
|
||||
"mail.actions.run_info_sha": "Каміт: %[1]s",
|
||||
"mail.actions.run_info_trigger": "Запушчана таму што: %[1]s кіраўніком: %[2]s",
|
||||
"repo.diff.commit.next-short": "Наступны",
|
||||
"repo.diff.commit.previous-short": "Папярэдні",
|
||||
"discussion.locked": "Гэта абмеркаванне заблакавана. Каментаванне абмежавана ўдзельнікамі.",
|
||||
"discussion.sidebar.reference": "Спасылка",
|
||||
"editor.textarea.tab_hint": "Радок ужо ўцягнуты. Націсніце <kbd>Tab</kbd> яшчэ раз або <kbd>Escape</kbd>, каб выйсці з рэдактара.",
|
||||
"editor.textarea.shift_tab_hint": "Няма ўцягвання на гэтым радку. Націсніце <kbd>Shift</kbd> + <kbd>Tab</kbd> яшчэ раз або <kbd>Escape</kbd>, каб выйсці з рэдактара.",
|
||||
"admin.auths.allow_username_change": "Дазволіць змяненне імя карыстальніка",
|
||||
"admin.auths.allow_username_change.description": "Дазволіць карыстальнікам змяняць імя карыстальніка ў наладах профілю",
|
||||
"admin.dashboard.cleanup_offline_runners": "Ачысціць афлайн-выканальнікі",
|
||||
"admin.dashboard.remove_resolved_reports": "Выдаліць вырашаныя справаздачы",
|
||||
"admin.config.security": "Налады бяспекі",
|
||||
"admin.config.global_2fa_requirement.title": "Глабальны патрабаванне двухфактарнай аўтэнтыфікацыі",
|
||||
"admin.config.global_2fa_requirement.none": "Не",
|
||||
"admin.config.global_2fa_requirement.all": "Усе карыстальнікі",
|
||||
"admin.config.global_2fa_requirement.admin": "Адміністратары",
|
||||
"settings.visibility.description": "Відавочнасць профілю ўплывае на магчымасць іншых атрымаць доступ да вашых непрыватных рэпазіторыяў. <a href=\"%s\" target=\"_blank\">Даведацца больш</a>.",
|
||||
"settings.twofa_unroll_unavailable": "Для вашага акаўнта патрабуецца двухфактарная аўтэнтыфікацыя і яна не можа быць адключаная.",
|
||||
"settings.twofa_reenroll": "Паўторна ўключыць двухфактарную аўтэнтыфікацыю",
|
||||
"settings.twofa_reenroll.description": "Паўторна ўключыць вашу двухфактарную аўтэнтыфікацыю",
|
||||
"settings.must_enable_2fa": "Гэты экземпляр Forgejo патрабуе, каб карыстальнікі ўключылі двухфактарную аўтэнтыфікацыю, перш чым яны змогуць атрымаць доступ да сваіх уліковых запісаў.",
|
||||
"error.must_enable_2fa": "Гэты экземпляр Forgejo патрабуе, каб карыстальнікі ўключылі двухфактарную аўтэнтыфікацыю, перш чым яны змогуць атрымаць доступ да сваіх уліковых запісаў. Уключыце яе там: %s",
|
||||
"avatar.constraints_hint": "Кастамны аватар не павінен перавышаць памер %[1]s ці быць большым за %[2]dх%[3]d пікселяў",
|
||||
"user.ghost.tooltip": "Гэты карыстальнік быў выдалены ці не можа быць знайдзены.",
|
||||
"og.repo.summary_card.alt_description": "Зводная картка рэпазіторыя %[1]s, апісаная як: %[2]s",
|
||||
"repo.commit.load_tags_failed": "Не ўдалося загрузіць тэгі з-за ўнутранай памылкі",
|
||||
"compare.branches.title": "Параўнаць галінкі",
|
||||
"migrate.pagure.description": "Міграцыя дадзеных з pagure.io ці іншых экземпляраў Pagure.",
|
||||
"migrate.pagure.incorrect_url": "Пададзены няправільны URL-адрас крынічнага рэпазіторыя",
|
||||
"migrate.pagure.project_url": "URL-адрас праекта Pagure",
|
||||
"migrate.pagure.project_example": "URL-адрас праекта Pagure, напр. https://pagure.io/pagure",
|
||||
"migrate.pagure.token_label": "Токен API Pagure",
|
||||
"migrate.pagure.private_issues.summary": "Прыватныя праблемы (неабавязкова)",
|
||||
"migrate.pagure.private_issues.description": "Гэтая магчымасць прызначана для стварэння другога рэпазіторыя, які ўтрымлівае толькі прыватныя праблемы з вашага праекта Pagure, для архівацыі. Спачатку выканайце звычайную міграцыю (без токена), каб імпартаваць усё публічнае змест. Потым, калі ў вас ёсць прыватныя праблемы, якія трэба захаваць, стварыце асобны рэпазіторый, выкарыстоўваючы гэтую опцыю токена, каб архіваваць гэтыя прыватныя праблемы.",
|
||||
"migrate.pagure.private_issues.warning": "Пераканайцеся, што ўсталюйце бачнасць рэпазіторыя вышэй у стан «Прыватны», калі вы выкарыстоўваеце ключ API для імпарту прыватных праблем. Гэта папярэджае выпадковыя раскрыцці прыватнага зместу ў публічным рэпазіторыі.",
|
||||
"migrate.pagure.token.placeholder": "Толькі для стварэння архіва прыватных праблем",
|
||||
"actions.runs.run_attempt_label": "Спроба запуску #%[1]s (%[2]s)",
|
||||
"actions.runs.viewing_out_of_date_run": "Вы пераглядаеце застарэлы запуск гэтай задачы, які быў выкананы %[1]s.",
|
||||
"actions.runs.view_most_recent_run": "Праглядзець апошні запуск",
|
||||
"actions.workflow.job_parsing_error": "Немагчыма разабраць заданні ў працэсе: %v",
|
||||
"actions.workflow.event_detection_error": "Немагчыма разабраць падтрымліваемыя падзеі ў працэсе: %v",
|
||||
"actions.workflow.pre_execution_error": "Працэс не быў выкананы з-за памылкі, якая заблакавала спробу выканання.",
|
||||
"meta.last_line": "Слава вялікай бульбе! Лукашэнка, гары ў адку! Kiss"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -74,7 +74,7 @@
|
|||
"keys.ssh.link": "Claus SSH",
|
||||
"keys.gpg.link": "Claus GPG",
|
||||
"admin.config.moderation_config": "Configuració de la moderació",
|
||||
"admin.moderation.reports": "Informes",
|
||||
"admin.moderation.reports": "Denúncies",
|
||||
"admin.moderation.moderation_reports": "Informes de moderació",
|
||||
"admin.moderation.no_open_reports": "No hi ha cap denúncia oberta.",
|
||||
"moderation.report_abuse": "Denunciar abús",
|
||||
|
|
@ -133,7 +133,7 @@
|
|||
"admin.config.global_2fa_requirement.admin": "Administradors",
|
||||
"settings.visibility.description": "La visibilitat del perfil afecta la capacitat dels altres per accedir als vostres repositoris no privats. <a href=\"%s\" target=\"_blank\">Saber-ne més</a>.",
|
||||
"settings.twofa_unroll_unavailable": "El vostre compte requereix l'autenticació de doble factor i no es pot desactivar.",
|
||||
"settings.twofa_reenroll.description": "Torneu-vos a inscriure a l'autenticació de doble factor",
|
||||
"settings.twofa_reenroll.description": "Torneu-vos a inscriure a la vostra autenticació de doble factor",
|
||||
"settings.must_enable_2fa": "Aquesta instància de Forgejo requereix que els usuaris habilitin l'autenticació de doble factor abans de poder accedir als seus comptes.",
|
||||
"error.must_enable_2fa": "Aquesta instància de Forgejo requereix que els usuaris habilitin l'autenticació de doble factor abans de poder accedir als seus comptes. Habiliteu-la a: %s",
|
||||
"avatar.constraints_hint": "Els avatars personalitzats no poden pesar més de %[1]s ni tenir una dimensió superior a %[2]dx%[3]d píxels",
|
||||
|
|
@ -143,7 +143,24 @@
|
|||
"migrate.pagure.incorrect_url": "S'ha proporcionat una URL del repositori font incorrecta",
|
||||
"migrate.pagure.project_url": "URL del projecte de Pagure",
|
||||
"migrate.pagure.project_example": "L'URL del projecte de pagure, per exemple: https://pagure.io/pagure",
|
||||
"migrate.pagure.token_label": "Testimoni",
|
||||
"migrate.pagure.token_label": "Testimoni de l'API de Pagure",
|
||||
"migrate.pagure.token_body_a": "Proporcioneu un testimoni d'API de Pagure amb accés a les incidències privades per crear un repositori que contingui només les incidències privades",
|
||||
"meta.last_line": "Molt estudiar anglès i vinga a fer espíquings i ràitings i tal... I què passa amb el català? Eh?! Me'l noto una mica oxidat! També és important."
|
||||
"meta.last_line": "Molt estudiar anglès i vinga a fer espíquings i ràitings i tal... I què passa amb el català? Eh?! Me'l noto una mica oxidat! També és important.",
|
||||
"relativetime.future": "en el futur",
|
||||
"admin.dashboard.cleanup_offline_runners": "Neteja els executors fora de línia",
|
||||
"settings.twofa_reenroll": "Torneu-vos a inscriure a l'autenticació de doble factor",
|
||||
"user.ghost.tooltip": "Aquest usuari ha sigut eliminat, o no es pot trobar.",
|
||||
"migrate.pagure.private_issues.summary": "Incidències privades (opcional)",
|
||||
"migrate.pagure.private_issues.description": "Aquesta funció està pensada per crear un segon repositori amb només les incidències privades del vostre projecte de Pragure amb la finalitat d'arxivar-lo. Primer, feu una migració normal (sense cap testimoni) per importar tot el contingut públic. Després, si teniu incidències privades que voleu preservar, creeu un repositori separat emprant aquesta opció de testimoni per arxivar-les.",
|
||||
"migrate.pagure.private_issues.warning": "Assegureu-vos de configurar la visibilitat del repositori com a privada si esteu usant la clau API per importar incidències privades. Això evitarà exposar accidentalment el contingut privat en un repositori públic.",
|
||||
"migrate.pagure.token.placeholder": "Només per crear un arxiu d'incidències privades",
|
||||
"actions.runs.run_attempt_label": "Intent d'execució #%[1]s (%[2]s)",
|
||||
"actions.runs.viewing_out_of_date_run": "Esteu veient una execució desactualitzada d'aquesta tasca que va ser executada %[1]s.",
|
||||
"actions.runs.view_most_recent_run": "Veure l'execució més recent",
|
||||
"actions.workflow.job_parsing_error": "No s'han pogut analitzar les tasques al flux de treball: %v",
|
||||
"actions.workflow.pre_execution_error": "No s'ha executat el flux de treball degut a un error que ha bloquejat l'intent d'execució.",
|
||||
"stars.list.none": "Ningú ha marcat aquest repositori com a favorit.",
|
||||
"mail.actions.run_info_trigger": "Activat per: %[1]s per: %[2]s",
|
||||
"og.repo.summary_card.alt_description": "La targeta de resum del repositori %[1]s, descrita com a: %[2]s",
|
||||
"actions.workflow.event_detection_error": "No s'han pogut analitzar els esdeveniments compatibles al flux de treball: %v"
|
||||
}
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue