mirror of
https://codeberg.org/forgejo/forgejo
synced 2025-10-20 04:50:51 +02:00
Compare commits
99 commits
Author | SHA1 | Date | |
---|---|---|---|
|
019430c0d5 | ||
|
ea5371e4cf |
||
|
e9ad9855e2 | ||
|
05dcc895d2 | ||
|
88e18dea4a | ||
|
19d920931d | ||
|
c897e40d4f | ||
|
5be039310c | ||
|
b98109ee69 | ||
|
1bc42842ba | ||
|
192018324f | ||
|
48505123c7 | ||
|
8d1cf92e12 | ||
|
3210151955 | ||
|
43664f79b9 | ||
|
5538ab29e3 | ||
|
6636550157 | ||
|
25484228e6 | ||
|
872062313e | ||
|
680339830d | ||
|
e1fed1d862 | ||
|
011acee58c | ||
|
14d6c29438 | ||
|
306fc24036 | ||
|
cd35473212 | ||
|
100ddf45a7 | ||
|
2941adfd11 | ||
|
14a7e6a5ad | ||
|
428edf37fb | ||
|
aca70e89b6 | ||
|
53c4c6bda8 | ||
|
97a27bb096 | ||
|
b4e329ad1c | ||
|
a510b3ecbe | ||
|
079e8f19c1 | ||
|
978ff860e6 | ||
|
e6469c5db0 | ||
|
2d3f44d03b | ||
|
f77d499545 | ||
|
514229544f | ||
|
1ef2c321be | ||
|
3740bcc837 | ||
|
36f108041c | ||
|
51870086bc | ||
|
4214fea8b1 | ||
|
1efd54b94f | ||
|
89a84a51e8 | ||
|
267f314aef | ||
|
bcd0821f3e | ||
|
8b06eb1bea | ||
|
5e5dac84ed | ||
|
ac0d653925 | ||
|
43305dff03 | ||
|
06cb8dfcca | ||
|
927dfb4f50 | ||
|
5dc9f86f09 | ||
|
4819d4a29a | ||
|
9d47719545 | ||
|
816a63ef28 | ||
|
5095cafe49 | ||
|
1d7c366588 | ||
|
c2cd3fb19b | ||
|
0bbef2d581 | ||
|
034af02ed0 | ||
|
592f149441 | ||
|
49b4965e1f | ||
|
edceb0c3d9 | ||
|
3dd9172fd6 | ||
|
48920461a2 | ||
|
8a93a3e59c | ||
|
3de8d7ec01 | ||
|
17f23d48d6 | ||
|
a7c64b3a5c | ||
|
fc726fae9f | ||
|
6e9a2e89e8 | ||
|
18b542f8b1 | ||
|
e730199499 | ||
|
3db3379249 | ||
|
501836df77 | ||
|
eb543dcbdb | ||
|
a1e3bace72 | ||
|
1d838c8d5e | ||
|
d4c9c01f2d | ||
|
36777a3a9e | ||
|
7781c8bae4 | ||
|
d1bb75eea0 | ||
|
1ccd539b6c | ||
|
b2125a774e | ||
|
1a0ceec5e2 | ||
|
164c5ef87f | ||
|
4a6182a3e3 | ||
|
faff8f7c67 | ||
|
5f88d15a63 | ||
|
71d3cb9590 | ||
|
cd0fb3152c | ||
|
a70fa6d8ba | ||
|
d99cecc176 | ||
|
aa648d74ea | ||
|
309ddf6ec7 |
417 changed files with 10110 additions and 3613 deletions
|
@ -28,7 +28,7 @@ jobs:
|
||||||
- uses: https://data.forgejo.org/actions/checkout@v4
|
- uses: https://data.forgejo.org/actions/checkout@v4
|
||||||
|
|
||||||
- id: forgejo
|
- id: forgejo
|
||||||
uses: https://data.forgejo.org/actions/setup-forgejo@v2.0.4
|
uses: https://data.forgejo.org/actions/setup-forgejo@v3.0.1
|
||||||
with:
|
with:
|
||||||
user: root
|
user: root
|
||||||
password: admin1234
|
password: admin1234
|
||||||
|
|
|
@ -164,7 +164,7 @@ jobs:
|
||||||
|
|
||||||
- name: build container & release
|
- name: build container & release
|
||||||
if: ${{ secrets.TOKEN != '' }}
|
if: ${{ secrets.TOKEN != '' }}
|
||||||
uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.3.5
|
uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.4.1
|
||||||
with:
|
with:
|
||||||
forgejo: "${{ env.GITHUB_SERVER_URL }}"
|
forgejo: "${{ env.GITHUB_SERVER_URL }}"
|
||||||
owner: "${{ env.GITHUB_REPOSITORY_OWNER }}"
|
owner: "${{ env.GITHUB_REPOSITORY_OWNER }}"
|
||||||
|
@ -183,7 +183,7 @@ jobs:
|
||||||
|
|
||||||
- name: build rootless container
|
- name: build rootless container
|
||||||
if: ${{ secrets.TOKEN != '' }}
|
if: ${{ secrets.TOKEN != '' }}
|
||||||
uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.3.5
|
uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.4.1
|
||||||
with:
|
with:
|
||||||
forgejo: "${{ env.GITHUB_SERVER_URL }}"
|
forgejo: "${{ env.GITHUB_SERVER_URL }}"
|
||||||
owner: "${{ env.GITHUB_REPOSITORY_OWNER }}"
|
owner: "${{ env.GITHUB_REPOSITORY_OWNER }}"
|
||||||
|
|
|
@ -44,7 +44,7 @@ jobs:
|
||||||
- uses: https://data.forgejo.org/actions/checkout@v4
|
- uses: https://data.forgejo.org/actions/checkout@v4
|
||||||
|
|
||||||
- name: copy & sign
|
- name: copy & sign
|
||||||
uses: https://data.forgejo.org/forgejo/forgejo-build-publish/publish@v5.3.5
|
uses: https://data.forgejo.org/forgejo/forgejo-build-publish/publish@v5.4.1
|
||||||
with:
|
with:
|
||||||
from-forgejo: ${{ vars.FORGEJO }}
|
from-forgejo: ${{ vars.FORGEJO }}
|
||||||
to-forgejo: ${{ vars.FORGEJO }}
|
to-forgejo: ${{ vars.FORGEJO }}
|
||||||
|
@ -80,7 +80,7 @@ jobs:
|
||||||
label: trigger
|
label: trigger
|
||||||
|
|
||||||
- name: upgrade v*.next.forgejo.org
|
- name: upgrade v*.next.forgejo.org
|
||||||
uses: https://data.forgejo.org/infrastructure/next-digest@v1.1.0
|
uses: https://data.forgejo.org/infrastructure/next-digest@v1.2.0
|
||||||
with:
|
with:
|
||||||
url: https://placeholder:${{ secrets.TOKEN_NEXT_DIGEST }}@invisible.forgejo.org/infrastructure/next-digest
|
url: https://placeholder:${{ secrets.TOKEN_NEXT_DIGEST }}@invisible.forgejo.org/infrastructure/next-digest
|
||||||
ref_name: '${{ github.ref_name }}'
|
ref_name: '${{ github.ref_name }}'
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
#
|
#
|
||||||
# Additional integration tests designed to run once a day when
|
# Additional integration tests designed to run once a day when
|
||||||
# `mirror.yml` pushes to https://codeberg.org/forgejo-integration/forgejo
|
# `mirror.yml` pushes to https://codeberg.org/forgejo-integration/forgejo
|
||||||
# and send a notification via email should they fail.
|
# and send a notification via email to the contact email of the
|
||||||
|
# organization should they fail.
|
||||||
#
|
#
|
||||||
# For debug purposes:
|
# For debug purposes:
|
||||||
#
|
#
|
||||||
|
@ -22,6 +23,8 @@ on:
|
||||||
- 'forgejo'
|
- 'forgejo'
|
||||||
- 'v*/forgejo'
|
- 'v*/forgejo'
|
||||||
|
|
||||||
|
enable-email-notifications: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
test-unit:
|
test-unit:
|
||||||
# if: vars.ROLE == 'forgejo-coding'
|
# if: vars.ROLE == 'forgejo-coding'
|
||||||
|
|
|
@ -15,6 +15,7 @@ import (
|
||||||
"forgejo.org/modules/graceful"
|
"forgejo.org/modules/graceful"
|
||||||
"forgejo.org/modules/log"
|
"forgejo.org/modules/log"
|
||||||
"forgejo.org/modules/process"
|
"forgejo.org/modules/process"
|
||||||
|
"forgejo.org/modules/proxy"
|
||||||
"forgejo.org/modules/setting"
|
"forgejo.org/modules/setting"
|
||||||
|
|
||||||
"github.com/caddyserver/certmagic"
|
"github.com/caddyserver/certmagic"
|
||||||
|
@ -76,6 +77,12 @@ func runACME(listenAddr string, m http.Handler) error {
|
||||||
ListenHost: setting.HTTPAddr,
|
ListenHost: setting.HTTPAddr,
|
||||||
AltTLSALPNPort: altTLSALPNPort,
|
AltTLSALPNPort: altTLSALPNPort,
|
||||||
AltHTTPPort: altHTTPPort,
|
AltHTTPPort: altHTTPPort,
|
||||||
|
HTTPProxy: proxy.Proxy(),
|
||||||
|
}
|
||||||
|
|
||||||
|
// Preserve behavior to use Let's encrypt test CA when Let's encrypt is CA.
|
||||||
|
if certmagic.DefaultACME.CA == certmagic.LetsEncryptProductionCA {
|
||||||
|
certmagic.DefaultACME.TestCA = certmagic.LetsEncryptStagingCA
|
||||||
}
|
}
|
||||||
|
|
||||||
magic := certmagic.NewDefault()
|
magic := certmagic.NewDefault()
|
||||||
|
|
4
go.mod
4
go.mod
|
@ -2,7 +2,7 @@ module forgejo.org
|
||||||
|
|
||||||
go 1.24
|
go 1.24
|
||||||
|
|
||||||
toolchain go1.24.4
|
toolchain go1.24.6
|
||||||
|
|
||||||
require (
|
require (
|
||||||
code.forgejo.org/f3/gof3/v3 v3.11.0
|
code.forgejo.org/f3/gof3/v3 v3.11.0
|
||||||
|
@ -91,7 +91,7 @@ require (
|
||||||
github.com/sergi/go-diff v1.4.0
|
github.com/sergi/go-diff v1.4.0
|
||||||
github.com/stretchr/testify v1.10.0
|
github.com/stretchr/testify v1.10.0
|
||||||
github.com/syndtr/goleveldb v1.0.0
|
github.com/syndtr/goleveldb v1.0.0
|
||||||
github.com/ulikunitz/xz v0.5.12
|
github.com/ulikunitz/xz v0.5.15
|
||||||
github.com/urfave/cli/v3 v3.3.3
|
github.com/urfave/cli/v3 v3.3.3
|
||||||
github.com/valyala/fastjson v1.6.4
|
github.com/valyala/fastjson v1.6.4
|
||||||
github.com/yohcop/openid-go v1.0.1
|
github.com/yohcop/openid-go v1.0.1
|
||||||
|
|
4
go.sum
4
go.sum
|
@ -527,8 +527,8 @@ github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww=
|
||||||
github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0=
|
github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0=
|
||||||
github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
|
github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
|
||||||
github.com/ulikunitz/xz v0.5.9/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
|
github.com/ulikunitz/xz v0.5.9/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
|
||||||
github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc=
|
github.com/ulikunitz/xz v0.5.15 h1:9DNdB5s+SgV3bQ2ApL10xRc35ck0DuIX/isZvIk+ubY=
|
||||||
github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
|
github.com/ulikunitz/xz v0.5.15/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
|
||||||
github.com/urfave/cli/v3 v3.3.3 h1:byCBaVdIXuLPIDm5CYZRVG6NvT7tv1ECqdU4YzlEa3I=
|
github.com/urfave/cli/v3 v3.3.3 h1:byCBaVdIXuLPIDm5CYZRVG6NvT7tv1ECqdU4YzlEa3I=
|
||||||
github.com/urfave/cli/v3 v3.3.3/go.mod h1:FJSKtM/9AiiTOJL4fJ6TbMUkxBXn7GO9guZqoZtpYpo=
|
github.com/urfave/cli/v3 v3.3.3/go.mod h1:FJSKtM/9AiiTOJL4fJ6TbMUkxBXn7GO9guZqoZtpYpo=
|
||||||
github.com/valyala/fastjson v1.6.4 h1:uAUNq9Z6ymTgGhcm0UynUAB6tlbakBrz6CQFax3BXVQ=
|
github.com/valyala/fastjson v1.6.4 h1:uAUNq9Z6ymTgGhcm0UynUAB6tlbakBrz6CQFax3BXVQ=
|
||||||
|
|
|
@ -132,6 +132,13 @@ func (opts FindArtifactsOptions) ToConds() builder.Cond {
|
||||||
return cond
|
return cond
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ db.FindOptionsOrder = FindArtifactsOptions{}
|
||||||
|
|
||||||
|
// ToOrders implements db.FindOptionsOrder, to have a stable order
|
||||||
|
func (opts FindArtifactsOptions) ToOrders() string {
|
||||||
|
return "id"
|
||||||
|
}
|
||||||
|
|
||||||
// ActionArtifactMeta is the meta data of an artifact
|
// ActionArtifactMeta is the meta data of an artifact
|
||||||
type ActionArtifactMeta struct {
|
type ActionArtifactMeta struct {
|
||||||
ArtifactName string
|
ArtifactName string
|
||||||
|
|
|
@ -284,16 +284,10 @@ func GetLatestRun(ctx context.Context, repoID int64) (*ActionRun, error) {
|
||||||
return &run, nil
|
return &run, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetRunBefore returns the last run that completed a given timestamp (not inclusive).
|
func GetRunBefore(ctx context.Context, _ *ActionRun) (*ActionRun, error) {
|
||||||
func GetRunBefore(ctx context.Context, repoID int64, timestamp timeutil.TimeStamp) (*ActionRun, error) {
|
// TODO return the most recent run related to the run given in argument
|
||||||
var run ActionRun
|
// see https://codeberg.org/forgejo/user-research/issues/63 for context
|
||||||
has, err := db.GetEngine(ctx).Where("repo_id=? AND stopped IS NOT NULL AND stopped<?", repoID, timestamp).OrderBy("stopped DESC").Limit(1).Get(&run)
|
return nil, nil
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
} else if !has {
|
|
||||||
return nil, fmt.Errorf("run before: %w", util.ErrNotExist)
|
|
||||||
}
|
|
||||||
return &run, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetLatestRunForBranchAndWorkflow(ctx context.Context, repoID int64, branch, workflowFile, event string) (*ActionRun, error) {
|
func GetLatestRunForBranchAndWorkflow(ctx context.Context, repoID int64, branch, workflowFile, event string) (*ActionRun, error) {
|
||||||
|
|
|
@ -5,92 +5,7 @@ package actions
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
|
||||||
|
|
||||||
"forgejo.org/models/db"
|
|
||||||
"forgejo.org/models/unittest"
|
|
||||||
"forgejo.org/modules/timeutil"
|
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
|
||||||
"github.com/stretchr/testify/require"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestGetRunBefore(t *testing.T) {
|
func TestGetRunBefore(t *testing.T) {
|
||||||
require.NoError(t, unittest.PrepareTestDatabase())
|
|
||||||
|
|
||||||
// this repo is part of the test database requiring loading "repository.yml" in main_test.go
|
|
||||||
var repoID int64 = 1
|
|
||||||
|
|
||||||
workflowID := "test_workflow"
|
|
||||||
|
|
||||||
// third completed run
|
|
||||||
time1, err := time.Parse(time.RFC3339, "2024-07-31T15:47:55+08:00")
|
|
||||||
require.NoError(t, err)
|
|
||||||
timeutil.MockSet(time1)
|
|
||||||
run1 := ActionRun{
|
|
||||||
ID: 1,
|
|
||||||
Index: 1,
|
|
||||||
RepoID: repoID,
|
|
||||||
Stopped: timeutil.TimeStampNow(),
|
|
||||||
WorkflowID: workflowID,
|
|
||||||
}
|
|
||||||
|
|
||||||
// fourth completed run
|
|
||||||
time2, err := time.Parse(time.RFC3339, "2024-08-31T15:47:55+08:00")
|
|
||||||
require.NoError(t, err)
|
|
||||||
timeutil.MockSet(time2)
|
|
||||||
run2 := ActionRun{
|
|
||||||
ID: 2,
|
|
||||||
Index: 2,
|
|
||||||
RepoID: repoID,
|
|
||||||
Stopped: timeutil.TimeStampNow(),
|
|
||||||
WorkflowID: workflowID,
|
|
||||||
}
|
|
||||||
|
|
||||||
// second completed run
|
|
||||||
time3, err := time.Parse(time.RFC3339, "2024-07-31T15:47:54+08:00")
|
|
||||||
require.NoError(t, err)
|
|
||||||
timeutil.MockSet(time3)
|
|
||||||
run3 := ActionRun{
|
|
||||||
ID: 3,
|
|
||||||
Index: 3,
|
|
||||||
RepoID: repoID,
|
|
||||||
Stopped: timeutil.TimeStampNow(),
|
|
||||||
WorkflowID: workflowID,
|
|
||||||
}
|
|
||||||
|
|
||||||
// first completed run
|
|
||||||
time4, err := time.Parse(time.RFC3339, "2024-06-30T15:47:54+08:00")
|
|
||||||
require.NoError(t, err)
|
|
||||||
timeutil.MockSet(time4)
|
|
||||||
run4 := ActionRun{
|
|
||||||
ID: 4,
|
|
||||||
Index: 4,
|
|
||||||
RepoID: repoID,
|
|
||||||
Stopped: timeutil.TimeStampNow(),
|
|
||||||
WorkflowID: workflowID,
|
|
||||||
}
|
|
||||||
require.NoError(t, db.Insert(db.DefaultContext, &run1))
|
|
||||||
runBefore, err := GetRunBefore(db.DefaultContext, repoID, run1.Stopped)
|
|
||||||
// there is no run before run1
|
|
||||||
require.Error(t, err)
|
|
||||||
require.Nil(t, runBefore)
|
|
||||||
|
|
||||||
// now there is only run3 before run1
|
|
||||||
require.NoError(t, db.Insert(db.DefaultContext, &run3))
|
|
||||||
runBefore, err = GetRunBefore(db.DefaultContext, repoID, run1.Stopped)
|
|
||||||
require.NoError(t, err)
|
|
||||||
assert.Equal(t, run3.ID, runBefore.ID)
|
|
||||||
|
|
||||||
// there still is only run3 before run1
|
|
||||||
require.NoError(t, db.Insert(db.DefaultContext, &run2))
|
|
||||||
runBefore, err = GetRunBefore(db.DefaultContext, repoID, run1.Stopped)
|
|
||||||
require.NoError(t, err)
|
|
||||||
assert.Equal(t, run3.ID, runBefore.ID)
|
|
||||||
|
|
||||||
// run4 is further away from run1
|
|
||||||
require.NoError(t, db.Insert(db.DefaultContext, &run4))
|
|
||||||
runBefore, err = GetRunBefore(db.DefaultContext, repoID, run1.Stopped)
|
|
||||||
require.NoError(t, err)
|
|
||||||
assert.Equal(t, run3.ID, runBefore.ID)
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -473,8 +473,11 @@ func GetFeeds(ctx context.Context, opts GetFeedsOptions) (ActionList, int64, err
|
||||||
return nil, 0, err
|
return nil, 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sess := db.GetEngine(ctx).Where(cond).
|
||||||
|
Select("`action`.*"). // this line will avoid select other joined table's columns
|
||||||
|
Join("INNER", "repository", "`repository`.id = `action`.repo_id")
|
||||||
|
|
||||||
opts.SetDefaultValues()
|
opts.SetDefaultValues()
|
||||||
sess := db.GetEngine(ctx).Where(cond)
|
|
||||||
sess = db.SetSessionPagination(sess, &opts)
|
sess = db.SetSessionPagination(sess, &opts)
|
||||||
|
|
||||||
actions := make([]*Action, 0, opts.PageSize)
|
actions := make([]*Action, 0, opts.PageSize)
|
||||||
|
|
|
@ -227,6 +227,24 @@ func TestNotifyWatchers(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGetFeedsCorrupted(t *testing.T) {
|
||||||
|
require.NoError(t, unittest.PrepareTestDatabase())
|
||||||
|
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
|
||||||
|
unittest.AssertExistsAndLoadBean(t, &activities_model.Action{
|
||||||
|
ID: 8,
|
||||||
|
RepoID: 1700,
|
||||||
|
})
|
||||||
|
|
||||||
|
actions, count, err := activities_model.GetFeeds(db.DefaultContext, activities_model.GetFeedsOptions{
|
||||||
|
RequestedUser: user,
|
||||||
|
Actor: user,
|
||||||
|
IncludePrivate: true,
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.Empty(t, actions)
|
||||||
|
assert.Equal(t, int64(0), count)
|
||||||
|
}
|
||||||
|
|
||||||
func TestConsistencyUpdateAction(t *testing.T) {
|
func TestConsistencyUpdateAction(t *testing.T) {
|
||||||
if !setting.Database.Type.IsSQLite3() {
|
if !setting.Database.Type.IsSQLite3() {
|
||||||
t.Skip("Test is only for SQLite database.")
|
t.Skip("Test is only for SQLite database.")
|
||||||
|
|
|
@ -141,7 +141,7 @@ func TxContext(parentCtx context.Context) (*Context, Committer, error) {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return newContext(DefaultContext, sess, true), sess, nil
|
return newContext(parentCtx, sess, true), sess, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithTx represents executing database operations on a transaction, if the transaction exist,
|
// WithTx represents executing database operations on a transaction, if the transaction exist,
|
||||||
|
|
|
@ -84,4 +84,16 @@ func TestTxContext(t *testing.T) {
|
||||||
return nil
|
return nil
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
t.Run("Reuses parent context", func(t *testing.T) {
|
||||||
|
type unique struct{}
|
||||||
|
|
||||||
|
ctx := context.WithValue(db.DefaultContext, unique{}, "yes!")
|
||||||
|
assert.False(t, db.InTransaction(ctx))
|
||||||
|
|
||||||
|
require.NoError(t, db.WithTx(ctx, func(ctx context.Context) error {
|
||||||
|
assert.Equal(t, "yes!", ctx.Value(unique{}))
|
||||||
|
return nil
|
||||||
|
}))
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -121,6 +121,7 @@ type ErrInvalidCloneAddr struct {
|
||||||
IsInvalidPath bool
|
IsInvalidPath bool
|
||||||
IsProtocolInvalid bool
|
IsProtocolInvalid bool
|
||||||
IsPermissionDenied bool
|
IsPermissionDenied bool
|
||||||
|
HasCredentials bool
|
||||||
LocalPath bool
|
LocalPath bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -143,6 +144,9 @@ func (err *ErrInvalidCloneAddr) Error() string {
|
||||||
if err.IsURLError {
|
if err.IsURLError {
|
||||||
return fmt.Sprintf("migration/cloning from '%s' is not allowed: the provided url is invalid", err.Host)
|
return fmt.Sprintf("migration/cloning from '%s' is not allowed: the provided url is invalid", err.Host)
|
||||||
}
|
}
|
||||||
|
if err.HasCredentials {
|
||||||
|
return fmt.Sprintf("migration/cloning from '%s' is not allowed: the provided url contains credentials", err.Host)
|
||||||
|
}
|
||||||
|
|
||||||
return fmt.Sprintf("migration/cloning from '%s' is not allowed", err.Host)
|
return fmt.Sprintf("migration/cloning from '%s' is not allowed", err.Host)
|
||||||
}
|
}
|
||||||
|
|
21
models/fixtures/ModerationFeatures/abuse_report.yml
Normal file
21
models/fixtures/ModerationFeatures/abuse_report.yml
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
-
|
||||||
|
id: 1
|
||||||
|
status: 1
|
||||||
|
reporter_id: 2 # @user2
|
||||||
|
content_type: 4 # Comment
|
||||||
|
content_id: 18 # user2/repo2/issues/2#issuecomment-18
|
||||||
|
category: 2 # Spam
|
||||||
|
remarks: The comment I'm reporting is pure SPAM.
|
||||||
|
shadow_copy_id: null
|
||||||
|
created_unix: 1752697980 # 2025-07-16 20:33:00
|
||||||
|
|
||||||
|
-
|
||||||
|
id: 2
|
||||||
|
status: 1 # Open
|
||||||
|
reporter_id: 2 # @user2
|
||||||
|
content_type: 1 # User (users or organizations)
|
||||||
|
content_id: 1002 # @alexsmith
|
||||||
|
category: 2 # Spam
|
||||||
|
remarks: This user just posted a spammy comment on my issue.
|
||||||
|
shadow_copy_id: null
|
||||||
|
created_unix: 1752698010 # 2025-07-16 20:33:30
|
7
models/fixtures/ModerationFeatures/comment.yml
Normal file
7
models/fixtures/ModerationFeatures/comment.yml
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
- # This is a spam comment (abusive content), created for testing moderation functionalities.
|
||||||
|
id: 18
|
||||||
|
type: 0 # Standard comment
|
||||||
|
poster_id: 1002 # @alexsmith
|
||||||
|
issue_id: 7 # user2/repo2#2
|
||||||
|
content: If anyone needs help for promoting their business online using SEO, just contact me (check my profile page).
|
||||||
|
created_unix: 1752697860 # 2025-07-16 20:31:00
|
22
models/fixtures/ModerationFeatures/user.yml
Normal file
22
models/fixtures/ModerationFeatures/user.yml
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
- # This user is a spammer and will create abusive content (for testing moderation functionalities).
|
||||||
|
id: 1002
|
||||||
|
lower_name: alexsmith
|
||||||
|
name: alexsmith
|
||||||
|
full_name: Alex Smith
|
||||||
|
email: alexsmith@example.org
|
||||||
|
keep_email_private: false
|
||||||
|
passwd: passwdSalt:password
|
||||||
|
passwd_hash_algo: dummy
|
||||||
|
type: 0
|
||||||
|
location: '@master@seo.net'
|
||||||
|
website: http://promote-your-business.biz
|
||||||
|
pronouns: SEO
|
||||||
|
salt: passwdSalt
|
||||||
|
description: I can help you promote your business online using SEO.
|
||||||
|
created_unix: 1752697800 # 2025-07-16 20:30:00
|
||||||
|
is_active: true
|
||||||
|
is_admin: false
|
||||||
|
is_restricted: false
|
||||||
|
avatar: avatar-hash-1002
|
||||||
|
avatar_email: alexsmith@example.org
|
||||||
|
use_custom_avatar: false
|
7
models/fixtures/TestActivateUserEmail/email_address.yml
Normal file
7
models/fixtures/TestActivateUserEmail/email_address.yml
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
-
|
||||||
|
id: 1001
|
||||||
|
uid: 1001
|
||||||
|
email: AnotherTestUserWithUpperCaseEmail@otto.splvs.net
|
||||||
|
lower_email: anothertestuserwithuppercaseemail@otto.splvs.net
|
||||||
|
is_activated: false
|
||||||
|
is_primary: true
|
12
models/fixtures/TestActivateUserEmail/user.yml
Normal file
12
models/fixtures/TestActivateUserEmail/user.yml
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
-
|
||||||
|
id: 1001
|
||||||
|
lower_name: user1001
|
||||||
|
name: user1001
|
||||||
|
full_name: User That loves Upper Cases
|
||||||
|
email: AnotherTestUserWithUpperCaseEmail@otto.splvs.net
|
||||||
|
passwd: ZogKvWdyEx:password
|
||||||
|
passwd_hash_algo: dummy
|
||||||
|
avatar: ''
|
||||||
|
avatar_email: anothertestuserwithuppercaseemail@otto.splvs.net
|
||||||
|
login_name: user1
|
||||||
|
created_unix: 1672578000
|
16
models/fixtures/TestAddTeamReviewRequest/issue.yml
Normal file
16
models/fixtures/TestAddTeamReviewRequest/issue.yml
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
-
|
||||||
|
id: 23
|
||||||
|
repo_id: 2
|
||||||
|
index: 3
|
||||||
|
poster_id: 2
|
||||||
|
original_author_id: 0
|
||||||
|
name: protected branch pull
|
||||||
|
content: pull request to a protected branch
|
||||||
|
milestone_id: 0
|
||||||
|
priority: 0
|
||||||
|
is_pull: true
|
||||||
|
is_closed: false
|
||||||
|
num_comments: 0
|
||||||
|
created_unix: 1707270422
|
||||||
|
updated_unix: 1707270422
|
||||||
|
is_locked: false
|
|
@ -0,0 +1,28 @@
|
||||||
|
- id: 1
|
||||||
|
repo_id: 2
|
||||||
|
branch_name: protected-main
|
||||||
|
can_push: false
|
||||||
|
enable_whitelist: true
|
||||||
|
whitelist_user_i_ds: [1]
|
||||||
|
whitelist_team_i_ds: []
|
||||||
|
enable_merge_whitelist: true
|
||||||
|
whitelist_deploy_keys: false
|
||||||
|
merge_whitelist_user_i_ds: [1]
|
||||||
|
merge_whitelist_team_i_ds: []
|
||||||
|
enable_status_check: false
|
||||||
|
status_check_contexts: []
|
||||||
|
enable_approvals_whitelist: true
|
||||||
|
approvals_whitelist_user_i_ds: []
|
||||||
|
approvals_whitelist_team_i_ds: [1]
|
||||||
|
required_approvals: 1
|
||||||
|
block_on_rejected_reviews: true
|
||||||
|
block_on_official_review_requests: true
|
||||||
|
block_on_outdated_branch: true
|
||||||
|
dismiss_stale_approvals: true
|
||||||
|
ignore_stale_approvals: false
|
||||||
|
require_signed_commits: false
|
||||||
|
protected_file_patterns: ""
|
||||||
|
unprotected_file_patterns: ""
|
||||||
|
apply_to_admins: true
|
||||||
|
created_unix: 1752513073
|
||||||
|
updated_unix: 1752513073
|
12
models/fixtures/TestAddTeamReviewRequest/pull_request.yml
Normal file
12
models/fixtures/TestAddTeamReviewRequest/pull_request.yml
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
-
|
||||||
|
id: 11
|
||||||
|
type: 0 # gitea pull request
|
||||||
|
status: 2 # mergeable
|
||||||
|
issue_id: 23
|
||||||
|
index: 3
|
||||||
|
head_repo_id: 2
|
||||||
|
base_repo_id: 2
|
||||||
|
head_branch: feature/protected-branch-pr
|
||||||
|
base_branch: protected-main
|
||||||
|
merge_base: 4a357436d925b5c974181ff12a994538ddc5a269
|
||||||
|
has_merged: false
|
|
@ -59,6 +59,14 @@
|
||||||
created_unix: 1603011540 # grouped with id:7
|
created_unix: 1603011540 # grouped with id:7
|
||||||
|
|
||||||
- id: 8
|
- id: 8
|
||||||
|
user_id: 1
|
||||||
|
op_type: 12 # close issue
|
||||||
|
act_user_id: 1
|
||||||
|
repo_id: 1700 # dangling intentional
|
||||||
|
is_private: false
|
||||||
|
created_unix: 1603011541
|
||||||
|
|
||||||
|
- id: 9
|
||||||
user_id: 34
|
user_id: 34
|
||||||
op_type: 12 # close issue
|
op_type: 12 # close issue
|
||||||
act_user_id: 34
|
act_user_id: 34
|
||||||
|
|
|
@ -186,10 +186,46 @@
|
||||||
type: 8 # milestone
|
type: 8 # milestone
|
||||||
poster_id: 1
|
poster_id: 1
|
||||||
issue_id: 1 # in repo_id 1
|
issue_id: 1 # in repo_id 1
|
||||||
milestone_id: 10 # not exsting milestone
|
milestone_id: 10 # not existing milestone
|
||||||
old_milestone_id: 0
|
old_milestone_id: 0
|
||||||
created_unix: 946685080
|
created_unix: 946685080
|
||||||
|
|
||||||
|
-
|
||||||
|
id: 2004
|
||||||
|
type: 8 # milestone
|
||||||
|
poster_id: 1
|
||||||
|
issue_id: 1 # in repo_id 1
|
||||||
|
milestone_id: 1
|
||||||
|
old_milestone_id: 10 # not existing (ghost) milestone
|
||||||
|
created_unix: 946685085
|
||||||
|
|
||||||
|
-
|
||||||
|
id: 2005
|
||||||
|
type: 8 # milestone
|
||||||
|
poster_id: 1
|
||||||
|
issue_id: 1 # in repo_id 1
|
||||||
|
milestone_id: 10 # not existing (ghost) milestone
|
||||||
|
old_milestone_id: 1
|
||||||
|
created_unix: 946685090
|
||||||
|
|
||||||
|
-
|
||||||
|
id: 2006
|
||||||
|
type: 8 # milestone
|
||||||
|
poster_id: 1
|
||||||
|
issue_id: 1 # in repo_id 1
|
||||||
|
milestone_id: 11 # not existing (ghost) milestone
|
||||||
|
old_milestone_id: 10 # not existing (ghost) milestone
|
||||||
|
created_unix: 946685095
|
||||||
|
|
||||||
|
-
|
||||||
|
id: 2007
|
||||||
|
type: 8 # milestone
|
||||||
|
poster_id: 1
|
||||||
|
issue_id: 1 # in repo_id 1
|
||||||
|
milestone_id: 0
|
||||||
|
old_milestone_id: 11 # not existing (ghost) milestone
|
||||||
|
created_unix: 946685100
|
||||||
|
|
||||||
-
|
-
|
||||||
id: 2010
|
id: 2010
|
||||||
type: 30 # project
|
type: 30 # project
|
||||||
|
|
|
@ -3,3 +3,9 @@
|
||||||
owner_id: 2
|
owner_id: 2
|
||||||
lower_name: oldrepo1
|
lower_name: oldrepo1
|
||||||
redirect_repo_id: 1
|
redirect_repo_id: 1
|
||||||
|
|
||||||
|
-
|
||||||
|
id: 2
|
||||||
|
owner_id: 17
|
||||||
|
lower_name: oldrepo24
|
||||||
|
redirect_repo_id: 24
|
||||||
|
|
|
@ -3,3 +3,15 @@
|
||||||
lower_name: olduser1
|
lower_name: olduser1
|
||||||
redirect_user_id: 1
|
redirect_user_id: 1
|
||||||
created_unix: 1730000000
|
created_unix: 1730000000
|
||||||
|
|
||||||
|
-
|
||||||
|
id: 2
|
||||||
|
lower_name: oldorg22
|
||||||
|
redirect_user_id: 22
|
||||||
|
created_unix: 1730000000
|
||||||
|
|
||||||
|
-
|
||||||
|
id: 3
|
||||||
|
lower_name: oldorg23
|
||||||
|
redirect_user_id: 23
|
||||||
|
created_unix: 1730000000
|
||||||
|
|
|
@ -108,7 +108,9 @@ var migrations = []*Migration{
|
||||||
// v33 -> v34
|
// v33 -> v34
|
||||||
NewMigration("Add `notify-email` column to `action_run` table", AddNotifyEmailToActionRun),
|
NewMigration("Add `notify-email` column to `action_run` table", AddNotifyEmailToActionRun),
|
||||||
// v34 -> v35
|
// v34 -> v35
|
||||||
NewMigration("Add index to `stopped` column in `action_run` table", AddIndexToActionRunStopped),
|
NewMigration("Noop because of https://codeberg.org/forgejo/forgejo/issues/8373", NoopAddIndexToActionRunStopped),
|
||||||
|
// v35 -> v36
|
||||||
|
NewMigration("Fix wiki unit default permission", FixWikiUnitDefaultPermission),
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetCurrentDBVersion returns the current Forgejo database version.
|
// GetCurrentDBVersion returns the current Forgejo database version.
|
||||||
|
|
|
@ -12,6 +12,7 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"forgejo.org/models/db"
|
||||||
"forgejo.org/models/packages"
|
"forgejo.org/models/packages"
|
||||||
"forgejo.org/modules/json"
|
"forgejo.org/modules/json"
|
||||||
"forgejo.org/modules/log"
|
"forgejo.org/modules/log"
|
||||||
|
@ -52,55 +53,50 @@ type mavenPackageResult struct {
|
||||||
// ChangeMavenArtifactConcatenation resolves old dash-concatenated Maven coordinates and regenerates metadata.
|
// ChangeMavenArtifactConcatenation resolves old dash-concatenated Maven coordinates and regenerates metadata.
|
||||||
// Note: runs per-owner in a single transaction; failures roll back all owners.
|
// Note: runs per-owner in a single transaction; failures roll back all owners.
|
||||||
func ChangeMavenArtifactConcatenation(x *xorm.Engine) error {
|
func ChangeMavenArtifactConcatenation(x *xorm.Engine) error {
|
||||||
sess := x.NewSession()
|
return db.WithTx(db.DefaultContext, func(ctx context.Context) error {
|
||||||
defer sess.Close()
|
// get unique owner IDs of Maven packages
|
||||||
|
var ownerIDs []*int64
|
||||||
if err := sess.Begin(); err != nil {
|
if err := db.GetEngine(ctx).
|
||||||
return err
|
Table("package").
|
||||||
}
|
Select("package.owner_id").
|
||||||
|
Where("package.type = 'maven'").
|
||||||
// get unique owner IDs of Maven packages
|
GroupBy("package.owner_id").
|
||||||
var ownerIDs []*int64
|
OrderBy("package.owner_id DESC").
|
||||||
if err := sess.
|
Find(&ownerIDs); err != nil {
|
||||||
Table("package").
|
return err
|
||||||
Select("package.owner_id").
|
|
||||||
Where("package.type = 'maven'").
|
|
||||||
GroupBy("package.owner_id").
|
|
||||||
OrderBy("package.owner_id DESC").
|
|
||||||
Find(&ownerIDs); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, id := range ownerIDs {
|
|
||||||
if err := fixMavenArtifactPerOwner(sess, id); err != nil {
|
|
||||||
log.Error("owner %d migration failed: %v", id, err)
|
|
||||||
return err // rollback all
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return sess.Commit()
|
for _, id := range ownerIDs {
|
||||||
|
if err := fixMavenArtifactPerOwner(ctx, id); err != nil {
|
||||||
|
log.Error("owner %d migration failed: %v", id, err)
|
||||||
|
return err // rollback all
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func fixMavenArtifactPerOwner(sess *xorm.Session, ownerID *int64) error {
|
func fixMavenArtifactPerOwner(ctx context.Context, ownerID *int64) error {
|
||||||
results, err := getMavenPackageResultsToUpdate(sess, ownerID)
|
results, err := getMavenPackageResultsToUpdate(ctx, ownerID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = resolvePackageCollisions(results, sess); err != nil {
|
if err = resolvePackageCollisions(ctx, results); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = processPackageVersions(results, sess); err != nil {
|
if err = processPackageVersions(ctx, results); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return processPackageFiles(results, sess)
|
return processPackageFiles(ctx, results)
|
||||||
}
|
}
|
||||||
|
|
||||||
// processPackageFiles updates Maven package files and versions in the database
|
// processPackageFiles updates Maven package files and versions in the database
|
||||||
// Returns an error if any database or processing operation fails.
|
// Returns an error if any database or processing operation fails.
|
||||||
func processPackageFiles(results []*mavenPackageResult, sess *xorm.Session) error {
|
func processPackageFiles(ctx context.Context, results []*mavenPackageResult) error {
|
||||||
processedVersion := make(map[string][]*mavenPackageResult)
|
processedVersion := make(map[string][]*mavenPackageResult)
|
||||||
|
|
||||||
for _, r := range results {
|
for _, r := range results {
|
||||||
|
@ -113,7 +109,7 @@ func processPackageFiles(results []*mavenPackageResult, sess *xorm.Session) erro
|
||||||
if r.PackageVersion.ID != r.PackageFile.VersionID {
|
if r.PackageVersion.ID != r.PackageFile.VersionID {
|
||||||
pattern := strings.TrimSuffix(r.PackageFile.Name, ".pom") + "%"
|
pattern := strings.TrimSuffix(r.PackageFile.Name, ".pom") + "%"
|
||||||
// Per routers/api/packages/maven/maven.go:338, POM files already have the `IsLead`, so no update needed for this prop
|
// Per routers/api/packages/maven/maven.go:338, POM files already have the `IsLead`, so no update needed for this prop
|
||||||
if _, err := sess.Exec("UPDATE package_file SET version_id = ? WHERE version_id = ? and name like ?", r.PackageVersion.ID, r.PackageFile.VersionID, pattern); err != nil {
|
if _, err := db.GetEngine(ctx).Exec("UPDATE package_file SET version_id = ? WHERE version_id = ? and name like ?", r.PackageVersion.ID, r.PackageFile.VersionID, pattern); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -128,14 +124,14 @@ func processPackageFiles(results []*mavenPackageResult, sess *xorm.Session) erro
|
||||||
|
|
||||||
rs := packageResults[0]
|
rs := packageResults[0]
|
||||||
|
|
||||||
pf, md, err := parseMetadata(sess, rs)
|
pf, md, err := parseMetadata(ctx, rs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if pf != nil && md != nil && md.GroupID == rs.GroupID && md.ArtifactID == rs.ArtifactID {
|
if pf != nil && md != nil && md.GroupID == rs.GroupID && md.ArtifactID == rs.ArtifactID {
|
||||||
if pf.VersionID != rs.PackageFile.VersionID {
|
if pf.VersionID != rs.PackageFile.VersionID {
|
||||||
if _, err := sess.ID(pf.ID).Cols("version_id").Update(pf); err != nil {
|
if _, err := db.GetEngine(ctx).ID(pf.ID).Cols("version_id").Update(pf); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -150,11 +146,9 @@ func processPackageFiles(results []*mavenPackageResult, sess *xorm.Session) erro
|
||||||
|
|
||||||
// parseMetadata retrieves metadata for a Maven package file from the database and decodes it into a Metadata object.
|
// parseMetadata retrieves metadata for a Maven package file from the database and decodes it into a Metadata object.
|
||||||
// Returns the associated PackageFile, Metadata, and any error encountered during processing.
|
// Returns the associated PackageFile, Metadata, and any error encountered during processing.
|
||||||
func parseMetadata(sess *xorm.Session, snapshot *mavenPackageResult) (*packages.PackageFile, *Metadata, error) {
|
func parseMetadata(ctx context.Context, snapshot *mavenPackageResult) (*packages.PackageFile, *Metadata, error) {
|
||||||
ctx := context.Background()
|
|
||||||
|
|
||||||
var pf packages.PackageFile
|
var pf packages.PackageFile
|
||||||
found, err := sess.Table(pf).
|
found, err := db.GetEngine(ctx).Table(pf).
|
||||||
Where("version_id = ?", snapshot.PackageFile.VersionID). // still the old id
|
Where("version_id = ?", snapshot.PackageFile.VersionID). // still the old id
|
||||||
And("lower_name = ?", "maven-metadata.xml").
|
And("lower_name = ?", "maven-metadata.xml").
|
||||||
Get(&pf)
|
Get(&pf)
|
||||||
|
@ -183,7 +177,7 @@ func parseMetadata(sess *xorm.Session, snapshot *mavenPackageResult) (*packages.
|
||||||
|
|
||||||
// processPackageVersions processes Maven package versions by updating metadata or inserting new records as necessary.
|
// processPackageVersions processes Maven package versions by updating metadata or inserting new records as necessary.
|
||||||
// It avoids redundant updates by tracking already processed versions using a map. Returns an error on failure.
|
// It avoids redundant updates by tracking already processed versions using a map. Returns an error on failure.
|
||||||
func processPackageVersions(results []*mavenPackageResult, sess *xorm.Session) error {
|
func processPackageVersions(ctx context.Context, results []*mavenPackageResult) error {
|
||||||
processedVersion := make(map[string]int64)
|
processedVersion := make(map[string]int64)
|
||||||
|
|
||||||
for _, r := range results {
|
for _, r := range results {
|
||||||
|
@ -196,14 +190,14 @@ func processPackageVersions(results []*mavenPackageResult, sess *xorm.Session) e
|
||||||
|
|
||||||
// for non collisions, just update the metadata
|
// for non collisions, just update the metadata
|
||||||
if r.PackageVersion.PackageID == r.Package.ID {
|
if r.PackageVersion.PackageID == r.Package.ID {
|
||||||
if _, err := sess.ID(r.PackageVersion.ID).Cols("metadata_json").Update(r.PackageVersion); err != nil {
|
if _, err := db.GetEngine(ctx).ID(r.PackageVersion.ID).Cols("metadata_json").Update(r.PackageVersion); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
log.Info("Create new maven package version for %s:%s", r.PackageName, r.PackageVersion.Version)
|
log.Info("Create new maven package version for %s:%s", r.PackageName, r.PackageVersion.Version)
|
||||||
r.PackageVersion.ID = 0
|
r.PackageVersion.ID = 0
|
||||||
r.PackageVersion.PackageID = r.Package.ID
|
r.PackageVersion.PackageID = r.Package.ID
|
||||||
if _, err := sess.Insert(r.PackageVersion); err != nil {
|
if _, err := db.GetEngine(ctx).Insert(r.PackageVersion); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -216,10 +210,9 @@ func processPackageVersions(results []*mavenPackageResult, sess *xorm.Session) e
|
||||||
|
|
||||||
// getMavenPackageResultsToUpdate retrieves Maven package results that need updates based on the owner ID.
|
// getMavenPackageResultsToUpdate retrieves Maven package results that need updates based on the owner ID.
|
||||||
// It processes POM metadata, fixes package inconsistencies, and filters corrupted package versions.
|
// It processes POM metadata, fixes package inconsistencies, and filters corrupted package versions.
|
||||||
func getMavenPackageResultsToUpdate(sess *xorm.Session, ownerID *int64) ([]*mavenPackageResult, error) {
|
func getMavenPackageResultsToUpdate(ctx context.Context, ownerID *int64) ([]*mavenPackageResult, error) {
|
||||||
ctx := context.Background()
|
|
||||||
var candidates []*mavenPackageResult
|
var candidates []*mavenPackageResult
|
||||||
if err := sess.
|
if err := db.GetEngine(ctx).
|
||||||
Table("package_file").
|
Table("package_file").
|
||||||
Select("package_file.*, package_version.*, package.*").
|
Select("package_file.*, package_version.*, package.*").
|
||||||
Join("INNER", "package_version", "package_version.id = package_file.version_id").
|
Join("INNER", "package_version", "package_version.id = package_file.version_id").
|
||||||
|
@ -265,7 +258,7 @@ func getMavenPackageResultsToUpdate(sess *xorm.Session, ownerID *int64) ([]*mave
|
||||||
|
|
||||||
// resolvePackageCollisions handles name collisions by keeping the first existing record and inserting new Package records for subsequent collisions.
|
// resolvePackageCollisions handles name collisions by keeping the first existing record and inserting new Package records for subsequent collisions.
|
||||||
// Returns a map from PackageName to its resolved Package.ID.
|
// Returns a map from PackageName to its resolved Package.ID.
|
||||||
func resolvePackageCollisions(results []*mavenPackageResult, sess *xorm.Session) error {
|
func resolvePackageCollisions(ctx context.Context, results []*mavenPackageResult) error {
|
||||||
// Group new names by lowerName
|
// Group new names by lowerName
|
||||||
collisions := make(map[string][]string)
|
collisions := make(map[string][]string)
|
||||||
for _, r := range results {
|
for _, r := range results {
|
||||||
|
@ -292,7 +285,7 @@ func resolvePackageCollisions(results []*mavenPackageResult, sess *xorm.Session)
|
||||||
} else if list[0] == r.PackageName {
|
} else if list[0] == r.PackageName {
|
||||||
pkgIDByName[r.PackageName] = r.Package.ID
|
pkgIDByName[r.PackageName] = r.Package.ID
|
||||||
|
|
||||||
if _, err = sess.ID(r.Package.ID).Cols("name", "lower_name").Update(r.Package); err != nil {
|
if _, err = db.GetEngine(ctx).ID(r.Package.ID).Cols("name", "lower_name").Update(r.Package); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
// create a new entry
|
// create a new entry
|
||||||
|
@ -300,7 +293,7 @@ func resolvePackageCollisions(results []*mavenPackageResult, sess *xorm.Session)
|
||||||
log.Info("Create new maven package for %s", r.Package.Name)
|
log.Info("Create new maven package for %s", r.Package.Name)
|
||||||
|
|
||||||
r.Package.ID = 0
|
r.Package.ID = 0
|
||||||
if _, err = sess.Insert(r.Package); err != nil {
|
if _, err = db.GetEngine(ctx).Insert(r.Package); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,16 +4,10 @@
|
||||||
package forgejo_migrations //nolint:revive
|
package forgejo_migrations //nolint:revive
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"forgejo.org/modules/timeutil"
|
|
||||||
|
|
||||||
"xorm.io/xorm"
|
"xorm.io/xorm"
|
||||||
)
|
)
|
||||||
|
|
||||||
func AddIndexToActionRunStopped(x *xorm.Engine) error {
|
// see https://codeberg.org/forgejo/forgejo/issues/8373
|
||||||
type ActionRun struct {
|
func NoopAddIndexToActionRunStopped(x *xorm.Engine) error {
|
||||||
ID int64
|
return nil
|
||||||
Stopped timeutil.TimeStamp `xorm:"index"`
|
|
||||||
}
|
|
||||||
|
|
||||||
return x.Sync(&ActionRun{})
|
|
||||||
}
|
}
|
||||||
|
|
55
models/forgejo_migrations/v36.go
Normal file
55
models/forgejo_migrations/v36.go
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
// Copyright 2025 The Forgejo Authors. All rights reserved.
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
package forgejo_migrations //nolint:revive
|
||||||
|
|
||||||
|
import (
|
||||||
|
"xorm.io/xorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
func FixWikiUnitDefaultPermission(x *xorm.Engine) error {
|
||||||
|
// Type is Unit's Type
|
||||||
|
type Type int
|
||||||
|
|
||||||
|
// Enumerate all the unit types
|
||||||
|
const (
|
||||||
|
TypeInvalid Type = iota // 0 invalid
|
||||||
|
TypeCode // 1 code
|
||||||
|
TypeIssues // 2 issues
|
||||||
|
TypePullRequests // 3 PRs
|
||||||
|
TypeReleases // 4 Releases
|
||||||
|
TypeWiki // 5 Wiki
|
||||||
|
TypeExternalWiki // 6 ExternalWiki
|
||||||
|
TypeExternalTracker // 7 ExternalTracker
|
||||||
|
TypeProjects // 8 Projects
|
||||||
|
TypePackages // 9 Packages
|
||||||
|
TypeActions // 10 Actions
|
||||||
|
)
|
||||||
|
|
||||||
|
// RepoUnitAccessMode specifies the users access mode to a repo unit
|
||||||
|
type UnitAccessMode int
|
||||||
|
|
||||||
|
const (
|
||||||
|
// UnitAccessModeUnset - no unit mode set
|
||||||
|
UnitAccessModeUnset UnitAccessMode = iota // 0
|
||||||
|
// UnitAccessModeNone no access
|
||||||
|
UnitAccessModeNone // 1
|
||||||
|
// UnitAccessModeRead read access
|
||||||
|
UnitAccessModeRead // 2
|
||||||
|
// UnitAccessModeWrite write access
|
||||||
|
UnitAccessModeWrite // 3
|
||||||
|
)
|
||||||
|
_ = UnitAccessModeNone
|
||||||
|
_ = UnitAccessModeWrite
|
||||||
|
|
||||||
|
type RepoUnit struct {
|
||||||
|
DefaultPermissions UnitAccessMode `xorm:"NOT NULL DEFAULT 0"`
|
||||||
|
}
|
||||||
|
_, err := x.Where("type = ?", TypeWiki).
|
||||||
|
Where("default_permissions = ?", UnitAccessModeRead).
|
||||||
|
Cols("default_permissions").
|
||||||
|
Update(RepoUnit{
|
||||||
|
DefaultPermissions: UnitAccessModeUnset,
|
||||||
|
})
|
||||||
|
return err
|
||||||
|
}
|
|
@ -1156,7 +1156,7 @@ func UpdateComment(ctx context.Context, c *Comment, contentVersion int, doer *us
|
||||||
defer committer.Close()
|
defer committer.Close()
|
||||||
|
|
||||||
// If the comment was reported as abusive, a shadow copy should be created before first update.
|
// If the comment was reported as abusive, a shadow copy should be created before first update.
|
||||||
if err := IfNeededCreateShadowCopyForComment(ctx, c); err != nil {
|
if err := IfNeededCreateShadowCopyForComment(ctx, c, true); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1197,7 +1197,7 @@ func DeleteComment(ctx context.Context, comment *Comment) error {
|
||||||
e := db.GetEngine(ctx)
|
e := db.GetEngine(ctx)
|
||||||
|
|
||||||
// If the comment was reported as abusive, a shadow copy should be created before deletion.
|
// If the comment was reported as abusive, a shadow copy should be created before deletion.
|
||||||
if err := IfNeededCreateShadowCopyForComment(ctx, comment); err != nil {
|
if err := IfNeededCreateShadowCopyForComment(ctx, comment, false); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -101,7 +101,7 @@ func (comments CommentList) loadMilestones(ctx context.Context) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
milestoneMaps := make(map[int64]*Milestone, len(milestoneIDs))
|
milestones := make(map[int64]*Milestone, len(milestoneIDs))
|
||||||
left := len(milestoneIDs)
|
left := len(milestoneIDs)
|
||||||
for left > 0 {
|
for left > 0 {
|
||||||
limit := db.DefaultMaxInSize
|
limit := db.DefaultMaxInSize
|
||||||
|
@ -110,7 +110,7 @@ func (comments CommentList) loadMilestones(ctx context.Context) error {
|
||||||
}
|
}
|
||||||
err := db.GetEngine(ctx).
|
err := db.GetEngine(ctx).
|
||||||
In("id", milestoneIDs[:limit]).
|
In("id", milestoneIDs[:limit]).
|
||||||
Find(&milestoneMaps)
|
Find(&milestones)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -118,8 +118,8 @@ func (comments CommentList) loadMilestones(ctx context.Context) error {
|
||||||
milestoneIDs = milestoneIDs[limit:]
|
milestoneIDs = milestoneIDs[limit:]
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, issue := range comments {
|
for _, comment := range comments {
|
||||||
issue.Milestone = milestoneMaps[issue.MilestoneID]
|
comment.Milestone = milestones[comment.MilestoneID]
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -140,7 +140,7 @@ func (comments CommentList) loadOldMilestones(ctx context.Context) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
milestoneMaps := make(map[int64]*Milestone, len(milestoneIDs))
|
milestones := make(map[int64]*Milestone, len(milestoneIDs))
|
||||||
left := len(milestoneIDs)
|
left := len(milestoneIDs)
|
||||||
for left > 0 {
|
for left > 0 {
|
||||||
limit := db.DefaultMaxInSize
|
limit := db.DefaultMaxInSize
|
||||||
|
@ -149,7 +149,7 @@ func (comments CommentList) loadOldMilestones(ctx context.Context) error {
|
||||||
}
|
}
|
||||||
err := db.GetEngine(ctx).
|
err := db.GetEngine(ctx).
|
||||||
In("id", milestoneIDs[:limit]).
|
In("id", milestoneIDs[:limit]).
|
||||||
Find(&milestoneMaps)
|
Find(&milestones)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -157,8 +157,8 @@ func (comments CommentList) loadOldMilestones(ctx context.Context) error {
|
||||||
milestoneIDs = milestoneIDs[limit:]
|
milestoneIDs = milestoneIDs[limit:]
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, issue := range comments {
|
for _, comment := range comments {
|
||||||
issue.OldMilestone = milestoneMaps[issue.MilestoneID]
|
comment.OldMilestone = milestones[comment.OldMilestoneID]
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -87,13 +87,19 @@ func IfNeededCreateShadowCopyForIssue(ctx context.Context, issue *Issue) error {
|
||||||
// IfNeededCreateShadowCopyForComment checks if for the given comment there are any reports of abusive content submitted
|
// IfNeededCreateShadowCopyForComment checks if for the given comment there are any reports of abusive content submitted
|
||||||
// and if found a shadow copy of relevant comment fields will be stored into DB and linked to the above report(s).
|
// and if found a shadow copy of relevant comment fields will be stored into DB and linked to the above report(s).
|
||||||
// This function should be called before a comment is deleted or updated.
|
// This function should be called before a comment is deleted or updated.
|
||||||
func IfNeededCreateShadowCopyForComment(ctx context.Context, comment *Comment) error {
|
func IfNeededCreateShadowCopyForComment(ctx context.Context, comment *Comment, forUpdates bool) error {
|
||||||
shadowCopyNeeded, err := moderation.IsShadowCopyNeeded(ctx, moderation.ReportedContentTypeComment, comment.ID)
|
shadowCopyNeeded, err := moderation.IsShadowCopyNeeded(ctx, moderation.ReportedContentTypeComment, comment.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if shadowCopyNeeded {
|
if shadowCopyNeeded {
|
||||||
|
if forUpdates {
|
||||||
|
// get the unaltered comment fields (for updates the provided variable is already altered but not yet saved)
|
||||||
|
if comment, err = GetCommentByID(ctx, comment.ID); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
commentData := newCommentData(comment)
|
commentData := newCommentData(comment)
|
||||||
content, err := json.Marshal(commentData)
|
content, err := json.Marshal(commentData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -781,10 +781,6 @@ func AddTeamReviewRequest(ctx context.Context, issue *Issue, reviewer *organizat
|
||||||
official, err := IsOfficialReviewerTeam(ctx, issue, reviewer)
|
official, err := IsOfficialReviewerTeam(ctx, issue, reviewer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("isOfficialReviewerTeam(): %w", err)
|
return nil, fmt.Errorf("isOfficialReviewerTeam(): %w", err)
|
||||||
} else if !official {
|
|
||||||
if official, err = IsOfficialReviewer(ctx, issue, doer); err != nil {
|
|
||||||
return nil, fmt.Errorf("isOfficialReviewer(): %w", err)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if review, err = CreateReview(ctx, CreateReviewOptions{
|
if review, err = CreateReview(ctx, CreateReviewOptions{
|
||||||
|
@ -797,12 +793,6 @@ func AddTeamReviewRequest(ctx context.Context, issue *Issue, reviewer *organizat
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if official {
|
|
||||||
if _, err := db.Exec(ctx, "UPDATE `review` SET official=? WHERE issue_id=? AND reviewer_team_id=?", false, issue.ID, reviewer.ID); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
comment, err := CreateComment(ctx, &CreateCommentOptions{
|
comment, err := CreateComment(ctx, &CreateCommentOptions{
|
||||||
Type: CommentTypeReviewRequest,
|
Type: CommentTypeReviewRequest,
|
||||||
Doer: doer,
|
Doer: doer,
|
||||||
|
|
|
@ -8,6 +8,7 @@ import (
|
||||||
|
|
||||||
"forgejo.org/models/db"
|
"forgejo.org/models/db"
|
||||||
issues_model "forgejo.org/models/issues"
|
issues_model "forgejo.org/models/issues"
|
||||||
|
organization_model "forgejo.org/models/organization"
|
||||||
repo_model "forgejo.org/models/repo"
|
repo_model "forgejo.org/models/repo"
|
||||||
"forgejo.org/models/unittest"
|
"forgejo.org/models/unittest"
|
||||||
user_model "forgejo.org/models/user"
|
user_model "forgejo.org/models/user"
|
||||||
|
@ -319,3 +320,80 @@ func TestAddReviewRequest(t *testing.T) {
|
||||||
require.Error(t, err)
|
require.Error(t, err)
|
||||||
assert.True(t, issues_model.IsErrReviewRequestOnClosedPR(err))
|
assert.True(t, issues_model.IsErrReviewRequestOnClosedPR(err))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestAddTeamReviewRequest(t *testing.T) {
|
||||||
|
defer unittest.OverrideFixtures("models/fixtures/TestAddTeamReviewRequest")()
|
||||||
|
require.NoError(t, unittest.PrepareTestDatabase())
|
||||||
|
|
||||||
|
setupForProtectedBranch := func() (*issues_model.Issue, *user_model.User) {
|
||||||
|
// From override models/fixtures/TestAddTeamReviewRequest/issue.yml; issue #23 is a PR into a protected branch
|
||||||
|
issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 23})
|
||||||
|
require.NoError(t, issue.LoadRepo(db.DefaultContext))
|
||||||
|
doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4})
|
||||||
|
return issue, doer
|
||||||
|
}
|
||||||
|
|
||||||
|
t.Run("Protected branch, not official team", func(t *testing.T) {
|
||||||
|
issue, doer := setupForProtectedBranch()
|
||||||
|
// Team 2 is not part of the whitelist for this protected branch
|
||||||
|
team := unittest.AssertExistsAndLoadBean(t, &organization_model.Team{ID: 2})
|
||||||
|
|
||||||
|
comment, err := issues_model.AddTeamReviewRequest(db.DefaultContext, issue, team, doer)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.NotNil(t, comment)
|
||||||
|
|
||||||
|
review, err := issues_model.GetTeamReviewerByIssueIDAndTeamID(db.DefaultContext, issue.ID, team.ID)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.NotNil(t, review)
|
||||||
|
assert.Equal(t, issues_model.ReviewTypeRequest, review.Type)
|
||||||
|
assert.Equal(t, team.ID, review.ReviewerTeamID)
|
||||||
|
// This review request should not be marked official because it is not a request for a team in the branch
|
||||||
|
// protection rule's whitelist...
|
||||||
|
assert.False(t, review.Official)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("Protected branch, official team", func(t *testing.T) {
|
||||||
|
issue, doer := setupForProtectedBranch()
|
||||||
|
// Team 1 is part of the whitelist for this protected branch
|
||||||
|
team := unittest.AssertExistsAndLoadBean(t, &organization_model.Team{ID: 1})
|
||||||
|
|
||||||
|
comment, err := issues_model.AddTeamReviewRequest(db.DefaultContext, issue, team, doer)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.NotNil(t, comment)
|
||||||
|
|
||||||
|
review, err := issues_model.GetTeamReviewerByIssueIDAndTeamID(db.DefaultContext, issue.ID, team.ID)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.NotNil(t, review)
|
||||||
|
assert.Equal(t, issues_model.ReviewTypeRequest, review.Type)
|
||||||
|
assert.Equal(t, team.ID, review.ReviewerTeamID)
|
||||||
|
// Expected to be considered official because team 1 is in the review whitelist for this protected branch
|
||||||
|
assert.True(t, review.Official)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("Unprotected branch, official team", func(t *testing.T) {
|
||||||
|
// Working on a PR into a branch that is not protected, issue #2
|
||||||
|
issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 2})
|
||||||
|
require.NoError(t, issue.LoadRepo(db.DefaultContext))
|
||||||
|
doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
|
||||||
|
// team is a team that has write perms against the repo
|
||||||
|
team := unittest.AssertExistsAndLoadBean(t, &organization_model.Team{ID: 1})
|
||||||
|
|
||||||
|
comment, err := issues_model.AddTeamReviewRequest(db.DefaultContext, issue, team, doer)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.NotNil(t, comment)
|
||||||
|
|
||||||
|
review, err := issues_model.GetTeamReviewerByIssueIDAndTeamID(db.DefaultContext, issue.ID, team.ID)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.NotNil(t, review)
|
||||||
|
assert.Equal(t, issues_model.ReviewTypeRequest, review.Type)
|
||||||
|
assert.Equal(t, team.ID, review.ReviewerTeamID)
|
||||||
|
// Will not be marked as official because PR #2 there's no branch protection rule that enables whitelist
|
||||||
|
// approvals (verifying logic in `IsOfficialReviewerTeam` indirectly)
|
||||||
|
assert.False(t, review.Official)
|
||||||
|
|
||||||
|
// Adding the same team review request again should be a noop
|
||||||
|
comment, err = issues_model.AddTeamReviewRequest(db.DefaultContext, issue, team, doer)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Nil(t, comment)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
|
@ -100,7 +100,7 @@ type AbuseReport struct {
|
||||||
// The abuse category selected by the reporter.
|
// The abuse category selected by the reporter.
|
||||||
Category AbuseCategoryType `xorm:"INDEX NOT NULL"`
|
Category AbuseCategoryType `xorm:"INDEX NOT NULL"`
|
||||||
// Remarks provided by the reporter.
|
// Remarks provided by the reporter.
|
||||||
Remarks string
|
Remarks string `xorm:"VARCHAR(500)"`
|
||||||
// The ID of the corresponding shadow-copied content when exists; otherwise null.
|
// The ID of the corresponding shadow-copied content when exists; otherwise null.
|
||||||
ShadowCopyID sql.NullInt64 `xorm:"DEFAULT NULL"`
|
ShadowCopyID sql.NullInt64 `xorm:"DEFAULT NULL"`
|
||||||
CreatedUnix timeutil.TimeStamp `xorm:"created NOT NULL"`
|
CreatedUnix timeutil.TimeStamp `xorm:"created NOT NULL"`
|
||||||
|
|
|
@ -17,7 +17,7 @@ import (
|
||||||
|
|
||||||
type AbuseReportShadowCopy struct {
|
type AbuseReportShadowCopy struct {
|
||||||
ID int64 `xorm:"pk autoincr"`
|
ID int64 `xorm:"pk autoincr"`
|
||||||
RawValue string `xorm:"NOT NULL"`
|
RawValue string `xorm:"LONGTEXT NOT NULL"` // A JSON with relevant fields from user, repository, issue or comment table.
|
||||||
CreatedUnix timeutil.TimeStamp `xorm:"created NOT NULL"`
|
CreatedUnix timeutil.TimeStamp `xorm:"created NOT NULL"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -125,7 +125,7 @@ func (pt Type) Name() string {
|
||||||
case TypeRpm:
|
case TypeRpm:
|
||||||
return "RPM"
|
return "RPM"
|
||||||
case TypeAlt:
|
case TypeAlt:
|
||||||
return "Alt"
|
return "ALT"
|
||||||
case TypeRubyGems:
|
case TypeRubyGems:
|
||||||
return "RubyGems"
|
return "RubyGems"
|
||||||
case TypeSwift:
|
case TypeSwift:
|
||||||
|
|
|
@ -14,8 +14,9 @@ import (
|
||||||
|
|
||||||
// ErrRedirectNotExist represents a "RedirectNotExist" kind of error.
|
// ErrRedirectNotExist represents a "RedirectNotExist" kind of error.
|
||||||
type ErrRedirectNotExist struct {
|
type ErrRedirectNotExist struct {
|
||||||
OwnerID int64
|
OwnerID int64
|
||||||
RepoName string
|
RepoName string
|
||||||
|
MissingPermission bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsErrRedirectNotExist check if an error is an ErrRepoRedirectNotExist.
|
// IsErrRedirectNotExist check if an error is an ErrRepoRedirectNotExist.
|
||||||
|
@ -49,8 +50,8 @@ func init() {
|
||||||
db.RegisterModel(new(Redirect))
|
db.RegisterModel(new(Redirect))
|
||||||
}
|
}
|
||||||
|
|
||||||
// LookupRedirect look up if a repository has a redirect name
|
// GetRedirect returns the redirect for a given pair of ownerID and repository name.
|
||||||
func LookupRedirect(ctx context.Context, ownerID int64, repoName string) (int64, error) {
|
func GetRedirect(ctx context.Context, ownerID int64, repoName string) (int64, error) {
|
||||||
repoName = strings.ToLower(repoName)
|
repoName = strings.ToLower(repoName)
|
||||||
redirect := &Redirect{OwnerID: ownerID, LowerName: repoName}
|
redirect := &Redirect{OwnerID: ownerID, LowerName: repoName}
|
||||||
if has, err := db.GetEngine(ctx).Get(redirect); err != nil {
|
if has, err := db.GetEngine(ctx).Get(redirect); err != nil {
|
||||||
|
|
|
@ -10,21 +10,9 @@ import (
|
||||||
repo_model "forgejo.org/models/repo"
|
repo_model "forgejo.org/models/repo"
|
||||||
"forgejo.org/models/unittest"
|
"forgejo.org/models/unittest"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestLookupRedirect(t *testing.T) {
|
|
||||||
require.NoError(t, unittest.PrepareTestDatabase())
|
|
||||||
|
|
||||||
repoID, err := repo_model.LookupRedirect(db.DefaultContext, 2, "oldrepo1")
|
|
||||||
require.NoError(t, err)
|
|
||||||
assert.EqualValues(t, 1, repoID)
|
|
||||||
|
|
||||||
_, err = repo_model.LookupRedirect(db.DefaultContext, unittest.NonexistentID, "doesnotexist")
|
|
||||||
assert.True(t, repo_model.IsErrRedirectNotExist(err))
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestNewRedirect(t *testing.T) {
|
func TestNewRedirect(t *testing.T) {
|
||||||
// redirect to a completely new name
|
// redirect to a completely new name
|
||||||
require.NoError(t, unittest.PrepareTestDatabase())
|
require.NoError(t, unittest.PrepareTestDatabase())
|
||||||
|
|
|
@ -41,27 +41,30 @@ func (err ErrUnitTypeNotExist) Unwrap() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// RepoUnitAccessMode specifies the users access mode to a repo unit
|
// RepoUnitAccessMode specifies the users access mode to a repo unit
|
||||||
|
// Only UnitAccessModeWrite is used by the wiki, to mark it as instance-writable
|
||||||
type UnitAccessMode int
|
type UnitAccessMode int
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// UnitAccessModeUnset - no unit mode set
|
// UnitAccessModeUnset - no unit mode set
|
||||||
UnitAccessModeUnset UnitAccessMode = iota // 0
|
UnitAccessModeUnset UnitAccessMode = iota // 0
|
||||||
|
|
||||||
// UnitAccessModeNone no access
|
// UnitAccessModeNone no access
|
||||||
UnitAccessModeNone // 1
|
// UnitAccessModeNone UnitAccessMode = 1
|
||||||
// UnitAccessModeRead read access
|
// UnitAccessModeRead read access
|
||||||
UnitAccessModeRead // 2
|
// UnitAccessModeRead UnitAccessMode = 2
|
||||||
|
|
||||||
// UnitAccessModeWrite write access
|
// UnitAccessModeWrite write access
|
||||||
UnitAccessModeWrite // 3
|
UnitAccessModeWrite UnitAccessMode = 3
|
||||||
)
|
)
|
||||||
|
|
||||||
func (mode UnitAccessMode) ToAccessMode(modeIfUnset perm.AccessMode) perm.AccessMode {
|
func (mode UnitAccessMode) ToAccessMode(modeIfUnset perm.AccessMode) perm.AccessMode {
|
||||||
switch mode {
|
switch mode {
|
||||||
case UnitAccessModeUnset:
|
case UnitAccessModeUnset:
|
||||||
return modeIfUnset
|
return modeIfUnset
|
||||||
case UnitAccessModeNone:
|
// case UnitAccessModeNone:
|
||||||
return perm.AccessModeNone
|
// return perm.AccessModeNone
|
||||||
case UnitAccessModeRead:
|
// case UnitAccessModeRead:
|
||||||
return perm.AccessModeRead
|
// return perm.AccessModeRead
|
||||||
case UnitAccessModeWrite:
|
case UnitAccessModeWrite:
|
||||||
return perm.AccessModeWrite
|
return perm.AccessModeWrite
|
||||||
default:
|
default:
|
||||||
|
@ -333,5 +336,8 @@ func getUnitsByRepoID(ctx context.Context, repoID int64) (units []*RepoUnit, err
|
||||||
// UpdateRepoUnit updates the provided repo unit
|
// UpdateRepoUnit updates the provided repo unit
|
||||||
func UpdateRepoUnit(ctx context.Context, unit *RepoUnit) error {
|
func UpdateRepoUnit(ctx context.Context, unit *RepoUnit) error {
|
||||||
_, err := db.GetEngine(ctx).ID(unit.ID).Update(unit)
|
_, err := db.GetEngine(ctx).ID(unit.ID).Update(unit)
|
||||||
return err
|
if err != nil {
|
||||||
|
return fmt.Errorf("UpdateRepoUnit: %v", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,8 +34,8 @@ func TestActionsConfig(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRepoUnitAccessMode(t *testing.T) {
|
func TestRepoUnitAccessMode(t *testing.T) {
|
||||||
assert.Equal(t, perm.AccessModeNone, UnitAccessModeNone.ToAccessMode(perm.AccessModeAdmin))
|
// assert.Equal(t, perm.AccessModeNone, UnitAccessModeNone.ToAccessMode(perm.AccessModeAdmin))
|
||||||
assert.Equal(t, perm.AccessModeRead, UnitAccessModeRead.ToAccessMode(perm.AccessModeAdmin))
|
// assert.Equal(t, perm.AccessModeRead, UnitAccessModeRead.ToAccessMode(perm.AccessModeAdmin))
|
||||||
assert.Equal(t, perm.AccessModeWrite, UnitAccessModeWrite.ToAccessMode(perm.AccessModeAdmin))
|
assert.Equal(t, perm.AccessModeWrite, UnitAccessModeWrite.ToAccessMode(perm.AccessModeAdmin))
|
||||||
assert.Equal(t, perm.AccessModeRead, UnitAccessModeUnset.ToAccessMode(perm.AccessModeRead))
|
assert.Equal(t, perm.AccessModeRead, UnitAccessModeUnset.ToAccessMode(perm.AccessModeRead))
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,6 +41,10 @@ func NewMockWebServer(t *testing.T, liveServerBaseURL, testDataDir string, liveM
|
||||||
log.Info("Mock HTTP Server: got request for path %s", r.URL.Path)
|
log.Info("Mock HTTP Server: got request for path %s", r.URL.Path)
|
||||||
// TODO check request method (support POST?)
|
// TODO check request method (support POST?)
|
||||||
fixturePath := fmt.Sprintf("%s/%s_%s", testDataDir, r.Method, url.PathEscape(path))
|
fixturePath := fmt.Sprintf("%s/%s_%s", testDataDir, r.Method, url.PathEscape(path))
|
||||||
|
if strings.Contains(path, "test_repo.git") {
|
||||||
|
// We got a git clone request against our mock server
|
||||||
|
fixturePath = fmt.Sprintf("%s/%s", testDataDir, strings.TrimLeft(r.URL.Path, "/"))
|
||||||
|
}
|
||||||
if liveMode {
|
if liveMode {
|
||||||
liveURL := fmt.Sprintf("%s%s", liveServerBaseURL, path)
|
liveURL := fmt.Sprintf("%s%s", liveServerBaseURL, path)
|
||||||
|
|
||||||
|
|
|
@ -181,3 +181,20 @@ func TestDeletePrimaryEmailAddressOfUser(t *testing.T) {
|
||||||
assert.True(t, user_model.IsErrEmailAddressNotExist(err))
|
assert.True(t, user_model.IsErrEmailAddressNotExist(err))
|
||||||
assert.Nil(t, email)
|
assert.Nil(t, email)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestActivateUserEmail(t *testing.T) {
|
||||||
|
defer unittest.OverrideFixtures("models/fixtures/TestActivateUserEmail")()
|
||||||
|
require.NoError(t, unittest.PrepareTestDatabase())
|
||||||
|
|
||||||
|
t.Run("Activate email", func(t *testing.T) {
|
||||||
|
require.NoError(t, user_model.ActivateUserEmail(t.Context(), 1001, "AnotherTestUserWithUpperCaseEmail@otto.splvs.net", true))
|
||||||
|
|
||||||
|
unittest.AssertExistsAndLoadBean(t, &user_model.EmailAddress{UID: 1001}, "is_activated = true")
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("Deactivate email", func(t *testing.T) {
|
||||||
|
require.NoError(t, user_model.ActivateUserEmail(t.Context(), 1001, "AnotherTestUserWithUpperCaseEmail@otto.splvs.net", false))
|
||||||
|
|
||||||
|
unittest.AssertExistsAndLoadBean(t, &user_model.EmailAddress{UID: 1001}, "is_activated = false")
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
|
@ -73,16 +73,20 @@ var userDataColumnNames = sync.OnceValue(func() []string {
|
||||||
// and if found a shadow copy of relevant user fields will be stored into DB and linked to the above report(s).
|
// and if found a shadow copy of relevant user fields will be stored into DB and linked to the above report(s).
|
||||||
// This function should be called before a user is deleted or updated.
|
// This function should be called before a user is deleted or updated.
|
||||||
//
|
//
|
||||||
|
// In case the User object was already altered before calling this method, just provide the userID and
|
||||||
|
// nil for unalteredUser; when it is decided that a shadow copy should be created and unalteredUser is nil,
|
||||||
|
// the user will be retrieved from DB based on the provided userID.
|
||||||
|
//
|
||||||
// For deletions alteredCols argument must be omitted.
|
// For deletions alteredCols argument must be omitted.
|
||||||
//
|
//
|
||||||
// In case of updates it will first checks whether any of the columns being updated (alteredCols argument)
|
// In case of updates it will first checks whether any of the columns being updated (alteredCols argument)
|
||||||
// is relevant for moderation purposes (i.e. included in the UserData struct).
|
// is relevant for moderation purposes (i.e. included in the UserData struct).
|
||||||
func IfNeededCreateShadowCopyForUser(ctx context.Context, user *User, alteredCols ...string) error {
|
func IfNeededCreateShadowCopyForUser(ctx context.Context, userID int64, unalteredUser *User, alteredCols ...string) error {
|
||||||
// TODO: this can be triggered quite often (e.g. by routers/web/repo/middlewares.go SetDiffViewStyle())
|
// TODO: this can be triggered quite often (e.g. by routers/web/repo/middlewares.go SetDiffViewStyle())
|
||||||
|
|
||||||
shouldCheckIfNeeded := len(alteredCols) == 0 // no columns being updated, therefore a deletion
|
shouldCheckIfNeeded := len(alteredCols) == 0 // no columns being updated, therefore a deletion
|
||||||
if !shouldCheckIfNeeded {
|
if !shouldCheckIfNeeded {
|
||||||
// for updates we need to go further only if certain column are being changed
|
// for updates we need to go further only if certain columns are being changed
|
||||||
for _, colName := range userDataColumnNames() {
|
for _, colName := range userDataColumnNames() {
|
||||||
if shouldCheckIfNeeded = slices.Contains(alteredCols, colName); shouldCheckIfNeeded {
|
if shouldCheckIfNeeded = slices.Contains(alteredCols, colName); shouldCheckIfNeeded {
|
||||||
break
|
break
|
||||||
|
@ -94,18 +98,23 @@ func IfNeededCreateShadowCopyForUser(ctx context.Context, user *User, alteredCol
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
shadowCopyNeeded, err := moderation.IsShadowCopyNeeded(ctx, moderation.ReportedContentTypeUser, user.ID)
|
shadowCopyNeeded, err := moderation.IsShadowCopyNeeded(ctx, moderation.ReportedContentTypeUser, userID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if shadowCopyNeeded {
|
if shadowCopyNeeded {
|
||||||
userData := newUserData(user)
|
if unalteredUser == nil {
|
||||||
|
if unalteredUser, err = GetUserByID(ctx, userID); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
userData := newUserData(unalteredUser)
|
||||||
content, err := json.Marshal(userData)
|
content, err := json.Marshal(userData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return moderation.CreateShadowCopyForUser(ctx, user.ID, string(content))
|
return moderation.CreateShadowCopyForUser(ctx, userID, string(content))
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -40,8 +40,8 @@ func GetUserOpenIDs(ctx context.Context, uid int64) ([]*UserOpenID, error) {
|
||||||
return openids, nil
|
return openids, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// isOpenIDUsed returns true if the openid has been used.
|
// IsOpenIDUsed returns true if the openid has been used.
|
||||||
func isOpenIDUsed(ctx context.Context, uri string) (bool, error) {
|
func IsOpenIDUsed(ctx context.Context, uri string) (bool, error) {
|
||||||
if len(uri) == 0 {
|
if len(uri) == 0 {
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
@ -71,7 +71,7 @@ func (err ErrOpenIDAlreadyUsed) Unwrap() error {
|
||||||
// AddUserOpenID adds an pre-verified/normalized OpenID URI to given user.
|
// AddUserOpenID adds an pre-verified/normalized OpenID URI to given user.
|
||||||
// NOTE: make sure openid.URI is normalized already
|
// NOTE: make sure openid.URI is normalized already
|
||||||
func AddUserOpenID(ctx context.Context, openid *UserOpenID) error {
|
func AddUserOpenID(ctx context.Context, openid *UserOpenID) error {
|
||||||
used, err := isOpenIDUsed(ctx, openid.URI)
|
used, err := IsOpenIDUsed(ctx, openid.URI)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
} else if used {
|
} else if used {
|
||||||
|
|
|
@ -21,7 +21,8 @@ import (
|
||||||
|
|
||||||
// ErrUserRedirectNotExist represents a "UserRedirectNotExist" kind of error.
|
// ErrUserRedirectNotExist represents a "UserRedirectNotExist" kind of error.
|
||||||
type ErrUserRedirectNotExist struct {
|
type ErrUserRedirectNotExist struct {
|
||||||
Name string
|
Name string
|
||||||
|
MissingPermission bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsErrUserRedirectNotExist check if an error is an ErrUserRedirectNotExist.
|
// IsErrUserRedirectNotExist check if an error is an ErrUserRedirectNotExist.
|
||||||
|
@ -81,15 +82,6 @@ func GetUserRedirect(ctx context.Context, userName string) (*Redirect, error) {
|
||||||
return redirect, nil
|
return redirect, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// LookupUserRedirect look up userID if a user has a redirect name
|
|
||||||
func LookupUserRedirect(ctx context.Context, userName string) (int64, error) {
|
|
||||||
redirect, err := GetUserRedirect(ctx, userName)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return redirect.RedirectUserID, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewUserRedirect create a new user redirect
|
// NewUserRedirect create a new user redirect
|
||||||
func NewUserRedirect(ctx context.Context, ID int64, oldUserName, newUserName string) error {
|
func NewUserRedirect(ctx context.Context, ID int64, oldUserName, newUserName string) error {
|
||||||
oldUserName = strings.ToLower(oldUserName)
|
oldUserName = strings.ToLower(oldUserName)
|
||||||
|
|
|
@ -1,26 +0,0 @@
|
||||||
// Copyright 2020 The Gitea Authors. All rights reserved.
|
|
||||||
// SPDX-License-Identifier: MIT
|
|
||||||
|
|
||||||
package user_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"forgejo.org/models/db"
|
|
||||||
"forgejo.org/models/unittest"
|
|
||||||
user_model "forgejo.org/models/user"
|
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
|
||||||
"github.com/stretchr/testify/require"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestLookupUserRedirect(t *testing.T) {
|
|
||||||
require.NoError(t, unittest.PrepareTestDatabase())
|
|
||||||
|
|
||||||
userID, err := user_model.LookupUserRedirect(db.DefaultContext, "olduser1")
|
|
||||||
require.NoError(t, err)
|
|
||||||
assert.EqualValues(t, 1, userID)
|
|
||||||
|
|
||||||
_, err = user_model.LookupUserRedirect(db.DefaultContext, "doesnotexist")
|
|
||||||
assert.True(t, user_model.IsErrUserRedirectNotExist(err))
|
|
||||||
}
|
|
|
@ -182,11 +182,11 @@ func (u *User) BeforeUpdate() {
|
||||||
u.MaxRepoCreation = -1
|
u.MaxRepoCreation = -1
|
||||||
}
|
}
|
||||||
|
|
||||||
// Organization does not need email
|
// Ensure AvatarEmail is set for non-organization users, because organization
|
||||||
u.Email = strings.ToLower(u.Email)
|
// are not required to have a email set.
|
||||||
if !u.IsOrganization() {
|
if !u.IsOrganization() {
|
||||||
if len(u.AvatarEmail) == 0 {
|
if len(u.AvatarEmail) == 0 {
|
||||||
u.AvatarEmail = u.Email
|
u.AvatarEmail = strings.ToLower(u.Email)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -927,7 +927,9 @@ func UpdateUserCols(ctx context.Context, u *User, cols ...string) error {
|
||||||
|
|
||||||
// If the user was reported as abusive and any of the columns being updated is relevant
|
// If the user was reported as abusive and any of the columns being updated is relevant
|
||||||
// for moderation purposes a shadow copy should be created before first update.
|
// for moderation purposes a shadow copy should be created before first update.
|
||||||
if err := IfNeededCreateShadowCopyForUser(ctx, u, cols...); err != nil {
|
// Since u is already altered at this point we are sending nil instead as an argument
|
||||||
|
// so that the unaltered version will be retrieved from DB.
|
||||||
|
if err := IfNeededCreateShadowCopyForUser(ctx, u.ID, nil, cols...); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1161,8 +1163,8 @@ func GetUserByEmail(ctx context.Context, email string) (*User, error) {
|
||||||
|
|
||||||
email = strings.ToLower(email)
|
email = strings.ToLower(email)
|
||||||
// Otherwise, check in alternative list for activated email addresses
|
// Otherwise, check in alternative list for activated email addresses
|
||||||
emailAddress := &EmailAddress{LowerEmail: email, IsActivated: true}
|
emailAddress := &EmailAddress{}
|
||||||
has, err := db.GetEngine(ctx).Get(emailAddress)
|
has, err := db.GetEngine(ctx).Where("lower_email = ? AND is_activated = ?", email, true).Get(emailAddress)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -835,3 +835,25 @@ func TestPronounsPrivacy(t *testing.T) {
|
||||||
assert.Equal(t, "any", user.GetPronouns(true))
|
assert.Equal(t, "any", user.GetPronouns(true))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGetUserByEmail(t *testing.T) {
|
||||||
|
require.NoError(t, unittest.PrepareTestDatabase())
|
||||||
|
|
||||||
|
t.Run("Normal", func(t *testing.T) {
|
||||||
|
u, err := user_model.GetUserByEmail(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.GetUserByEmail(t.Context(), "user11@example.com")
|
||||||
|
require.ErrorIs(t, err, user_model.ErrUserNotExist{Name: "user11@example.com"})
|
||||||
|
assert.Nil(t, u)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("Not primary", func(t *testing.T) {
|
||||||
|
u, err := user_model.GetUserByEmail(t.Context(), "user1-3@example.com")
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.EqualValues(t, 1, u.ID)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
|
@ -56,14 +56,7 @@ func Local(name, base string, sub ...string) *Layer {
|
||||||
panic(fmt.Sprintf("Unable to get absolute path for %q: %v", base, err))
|
panic(fmt.Sprintf("Unable to get absolute path for %q: %v", base, err))
|
||||||
}
|
}
|
||||||
root := util.FilePathJoinAbs(base, sub...)
|
root := util.FilePathJoinAbs(base, sub...)
|
||||||
fsRoot, err := os.OpenRoot(root)
|
return &Layer{name: name, fs: os.DirFS(root), localPath: root}
|
||||||
if err != nil {
|
|
||||||
if errors.Is(err, fs.ErrNotExist) {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
panic(fmt.Sprintf("Unable to open layer %q", err))
|
|
||||||
}
|
|
||||||
return &Layer{name: name, fs: fsRoot.FS(), localPath: root}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bindata returns a new Layer with the given name, it serves files from the given bindata asset.
|
// Bindata returns a new Layer with the given name, it serves files from the given bindata asset.
|
||||||
|
@ -80,7 +73,7 @@ type LayeredFS struct {
|
||||||
|
|
||||||
// Layered returns a new LayeredFS with the given layers. The first layer is the top layer.
|
// Layered returns a new LayeredFS with the given layers. The first layer is the top layer.
|
||||||
func Layered(layers ...*Layer) *LayeredFS {
|
func Layered(layers ...*Layer) *LayeredFS {
|
||||||
return &LayeredFS{layers: slices.DeleteFunc(layers, func(layer *Layer) bool { return layer == nil })}
|
return &LayeredFS{layers: layers}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open opens the named file. The caller is responsible for closing the file.
|
// Open opens the named file. The caller is responsible for closing the file.
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
// Copyright 2023 The Gitea Authors. All rights reserved.
|
// Copyright 2023 The Gitea Authors. All rights reserved.
|
||||||
|
// Copyright 2025 The Forgejo Authors. All rights reserved.
|
||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
package assetfs
|
package assetfs
|
||||||
|
@ -108,3 +109,30 @@ func TestLayered(t *testing.T) {
|
||||||
assert.Equal(t, "l1", assets.GetFileLayerName("f1"))
|
assert.Equal(t, "l1", assets.GetFileLayerName("f1"))
|
||||||
assert.Equal(t, "l2", assets.GetFileLayerName("f2"))
|
assert.Equal(t, "l2", assets.GetFileLayerName("f2"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Allow layers to read symlink outside the layer root.
|
||||||
|
func TestLayeredSymlink(t *testing.T) {
|
||||||
|
dir := t.TempDir()
|
||||||
|
dirl1 := filepath.Join(dir, "l1")
|
||||||
|
require.NoError(t, os.MkdirAll(dirl1, 0o755))
|
||||||
|
|
||||||
|
// Open layer in dir/l1
|
||||||
|
layer := Local("l1", dirl1)
|
||||||
|
|
||||||
|
// Create a file in dir/outside
|
||||||
|
fileContents := []byte("I am outside the layer")
|
||||||
|
require.NoError(t, os.WriteFile(filepath.Join(dir, "outside"), fileContents, 0o600))
|
||||||
|
// Symlink dir/l1/outside to dir/outside
|
||||||
|
require.NoError(t, os.Symlink(filepath.Join(dir, "outside"), filepath.Join(dirl1, "outside")))
|
||||||
|
|
||||||
|
// Open dir/l1/outside.
|
||||||
|
f, err := layer.Open("outside")
|
||||||
|
require.NoError(t, err)
|
||||||
|
defer f.Close()
|
||||||
|
|
||||||
|
// Confirm it contains the output of dir/outside
|
||||||
|
contents, err := io.ReadAll(f)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
assert.Equal(t, fileContents, contents)
|
||||||
|
}
|
||||||
|
|
|
@ -10,8 +10,6 @@ import (
|
||||||
"io"
|
"io"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"forgejo.org/modules/log"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// ParseTreeEntries parses the output of a `git ls-tree -l` command.
|
// ParseTreeEntries parses the output of a `git ls-tree -l` command.
|
||||||
|
@ -55,19 +53,9 @@ func parseTreeEntries(data []byte, ptree *Tree) ([]*TreeEntry, error) {
|
||||||
entry.sized = true
|
entry.sized = true
|
||||||
}
|
}
|
||||||
|
|
||||||
switch string(entryMode) {
|
entry.entryMode, err = parseMode(string(entryMode))
|
||||||
case "100644":
|
if err != nil {
|
||||||
entry.entryMode = EntryModeBlob
|
return nil, err
|
||||||
case "100755":
|
|
||||||
entry.entryMode = EntryModeExec
|
|
||||||
case "120000":
|
|
||||||
entry.entryMode = EntryModeSymlink
|
|
||||||
case "160000":
|
|
||||||
entry.entryMode = EntryModeCommit
|
|
||||||
case "040000", "040755": // git uses 040000 for tree object, but some users may get 040755 for unknown reasons
|
|
||||||
entry.entryMode = EntryModeTree
|
|
||||||
default:
|
|
||||||
return nil, fmt.Errorf("unknown type: %v", string(entryMode))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
entry.ID, err = NewIDFromString(string(entryObjectID))
|
entry.ID, err = NewIDFromString(string(entryObjectID))
|
||||||
|
@ -108,23 +96,10 @@ loop:
|
||||||
sz -= int64(count)
|
sz -= int64(count)
|
||||||
entry := new(TreeEntry)
|
entry := new(TreeEntry)
|
||||||
entry.ptree = ptree
|
entry.ptree = ptree
|
||||||
|
entry.entryMode, err = parseMode(string(mode))
|
||||||
switch string(mode) {
|
if err != nil {
|
||||||
case "100644":
|
return nil, err
|
||||||
entry.entryMode = EntryModeBlob
|
|
||||||
case "100755":
|
|
||||||
entry.entryMode = EntryModeExec
|
|
||||||
case "120000":
|
|
||||||
entry.entryMode = EntryModeSymlink
|
|
||||||
case "160000":
|
|
||||||
entry.entryMode = EntryModeCommit
|
|
||||||
case "40000", "40755": // git uses 40000 for tree object, but some users may get 40755 for unknown reasons
|
|
||||||
entry.entryMode = EntryModeTree
|
|
||||||
default:
|
|
||||||
log.Debug("Unknown mode: %v", string(mode))
|
|
||||||
return nil, fmt.Errorf("unknown mode: %v", string(mode))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
entry.ID = objectFormat.MustID(sha)
|
entry.ID = objectFormat.MustID(sha)
|
||||||
entry.name = string(fname)
|
entry.name = string(fname)
|
||||||
entries = append(entries, entry)
|
entries = append(entries, entry)
|
||||||
|
@ -135,3 +110,31 @@ loop:
|
||||||
|
|
||||||
return entries, nil
|
return entries, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Parse the file mode, we cannot hardcode the modes that we expect for
|
||||||
|
// a variety of reasons (that is not known to us) the permissions bits
|
||||||
|
// of files can vary, usually the result because of tooling that uses Git in
|
||||||
|
// a funny way. So we have to parse the mode as a integer and do bit tricks.
|
||||||
|
func parseMode(modeStr string) (EntryMode, error) {
|
||||||
|
mode, err := strconv.ParseUint(modeStr, 8, 64)
|
||||||
|
if err != nil {
|
||||||
|
return 0, fmt.Errorf("cannot parse mode: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
switch mode & 0o170000 {
|
||||||
|
case 0o040000:
|
||||||
|
return EntryModeTree, nil
|
||||||
|
case 0o120000:
|
||||||
|
return EntryModeSymlink, nil
|
||||||
|
case 0o160000:
|
||||||
|
return EntryModeCommit, nil
|
||||||
|
case 0o100000:
|
||||||
|
// Check for the permission bit on the owner.
|
||||||
|
if mode&0o100 == 0o100 {
|
||||||
|
return EntryModeExec, nil
|
||||||
|
}
|
||||||
|
return EntryModeBlob, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0, fmt.Errorf("unknown mode: %o", mode)
|
||||||
|
}
|
||||||
|
|
|
@ -101,3 +101,38 @@ func TestParseTreeEntriesInvalid(t *testing.T) {
|
||||||
require.Error(t, err)
|
require.Error(t, err)
|
||||||
assert.Empty(t, entries)
|
assert.Empty(t, entries)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestParseMode(t *testing.T) {
|
||||||
|
ok := func(t *testing.T, mode string, entry EntryMode) {
|
||||||
|
t.Helper()
|
||||||
|
actualEntry, err := parseMode(mode)
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.Equal(t, entry, actualEntry)
|
||||||
|
}
|
||||||
|
|
||||||
|
fail := func(t *testing.T, mode string) {
|
||||||
|
t.Helper()
|
||||||
|
entry, err := parseMode(mode)
|
||||||
|
require.Error(t, err)
|
||||||
|
assert.Zero(t, entry)
|
||||||
|
}
|
||||||
|
|
||||||
|
ok(t, "100644", EntryModeBlob)
|
||||||
|
ok(t, "100755", EntryModeExec)
|
||||||
|
ok(t, "100754", EntryModeExec)
|
||||||
|
ok(t, "100700", EntryModeExec)
|
||||||
|
ok(t, "100744", EntryModeExec)
|
||||||
|
ok(t, "120000", EntryModeSymlink)
|
||||||
|
ok(t, "120644", EntryModeSymlink)
|
||||||
|
ok(t, "160000", EntryModeCommit)
|
||||||
|
ok(t, "160644", EntryModeCommit)
|
||||||
|
ok(t, "040000", EntryModeTree)
|
||||||
|
ok(t, "040755", EntryModeTree)
|
||||||
|
ok(t, "040775", EntryModeTree)
|
||||||
|
ok(t, "040754", EntryModeTree)
|
||||||
|
|
||||||
|
fail(t, "not-a-number")
|
||||||
|
fail(t, "000000")
|
||||||
|
fail(t, "400000")
|
||||||
|
fail(t, "111111")
|
||||||
|
}
|
||||||
|
|
|
@ -18,6 +18,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"forgejo.org/modules/log"
|
||||||
"forgejo.org/modules/proxy"
|
"forgejo.org/modules/proxy"
|
||||||
"forgejo.org/modules/setting"
|
"forgejo.org/modules/setting"
|
||||||
"forgejo.org/modules/util"
|
"forgejo.org/modules/util"
|
||||||
|
@ -160,24 +161,89 @@ func CloneWithArgs(ctx context.Context, args TrustedCmdArgs, from, to string, op
|
||||||
if len(opts.Branch) > 0 {
|
if len(opts.Branch) > 0 {
|
||||||
cmd.AddArguments("-b").AddDynamicArguments(opts.Branch)
|
cmd.AddArguments("-b").AddDynamicArguments(opts.Branch)
|
||||||
}
|
}
|
||||||
cmd.AddDashesAndList(from, to)
|
|
||||||
|
|
||||||
if strings.Contains(from, "://") && strings.Contains(from, "@") {
|
envs := os.Environ()
|
||||||
cmd.SetDescription(fmt.Sprintf("clone branch %s from %s to %s (shared: %t, mirror: %t, depth: %d)", opts.Branch, util.SanitizeCredentialURLs(from), to, opts.Shared, opts.Mirror, opts.Depth))
|
parsedFromURL, err := url.Parse(from)
|
||||||
} else {
|
if err == nil {
|
||||||
cmd.SetDescription(fmt.Sprintf("clone branch %s from %s to %s (shared: %t, mirror: %t, depth: %d)", opts.Branch, from, to, opts.Shared, opts.Mirror, opts.Depth))
|
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)
|
||||||
|
|
||||||
if opts.Timeout <= 0 {
|
if opts.Timeout <= 0 {
|
||||||
opts.Timeout = -1
|
opts.Timeout = -1
|
||||||
}
|
}
|
||||||
|
|
||||||
envs := os.Environ()
|
|
||||||
u, err := url.Parse(from)
|
|
||||||
if err == nil {
|
|
||||||
envs = proxy.EnvWithProxy(u)
|
|
||||||
}
|
|
||||||
|
|
||||||
stderr := new(bytes.Buffer)
|
stderr := new(bytes.Buffer)
|
||||||
if err = cmd.Run(&RunOpts{
|
if err = cmd.Run(&RunOpts{
|
||||||
Timeout: opts.Timeout,
|
Timeout: opts.Timeout,
|
||||||
|
|
|
@ -183,6 +183,17 @@ func (repo *Repository) GetDiffShortStat(base, head string) (numFiles, totalAddi
|
||||||
return numFiles, totalAdditions, totalDeletions, err
|
return numFiles, totalAdditions, totalDeletions, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetCommitStat returns the number of files, total additions and total deletions the commit has.
|
||||||
|
func (repo *Repository) GetCommitShortStat(commitID string) (numFiles, totalAdditions, totalDeletions int, err error) {
|
||||||
|
cmd := NewCommand(repo.Ctx, "diff-tree", "--shortstat", "--no-commit-id", "--root").AddDynamicArguments(commitID)
|
||||||
|
stdout, _, err := cmd.RunStdString(&RunOpts{Dir: repo.Path})
|
||||||
|
if err != nil {
|
||||||
|
return 0, 0, 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return parseDiffStat(stdout)
|
||||||
|
}
|
||||||
|
|
||||||
// GetDiffShortStat counts number of changed files, number of additions and deletions
|
// GetDiffShortStat counts number of changed files, number of additions and deletions
|
||||||
func GetDiffShortStat(ctx context.Context, repoPath string, trustedArgs TrustedCmdArgs, dynamicArgs ...string) (numFiles, totalAdditions, totalDeletions int, err error) {
|
func GetDiffShortStat(ctx context.Context, repoPath string, trustedArgs TrustedCmdArgs, dynamicArgs ...string) (numFiles, totalAdditions, totalDeletions int, err error) {
|
||||||
// Now if we call:
|
// Now if we call:
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
// Copyright 2018 The Gitea Authors. All rights reserved.
|
// Copyright 2018 The Gitea Authors. All rights reserved.
|
||||||
|
// Copyright 2025 The Forgejo Authors. All rights reserved.
|
||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
package git
|
package git
|
||||||
|
@ -162,3 +163,83 @@ func TestGetCommitFilesChanged(t *testing.T) {
|
||||||
assert.ElementsMatch(t, tc.files, changedFiles)
|
assert.ElementsMatch(t, tc.files, changedFiles)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGetCommitShortStat(t *testing.T) {
|
||||||
|
t.Run("repo1_bare", func(t *testing.T) {
|
||||||
|
repo, err := openRepositoryWithDefaultContext(filepath.Join(testReposDir, "repo1_bare"))
|
||||||
|
if err != nil {
|
||||||
|
require.NoError(t, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer repo.Close()
|
||||||
|
|
||||||
|
numFiles, totalAddition, totalDeletions, err := repo.GetCommitShortStat("ce064814f4a0d337b333e646ece456cd39fab612")
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.Equal(t, 0, numFiles)
|
||||||
|
assert.Equal(t, 0, totalAddition)
|
||||||
|
assert.Equal(t, 0, totalDeletions)
|
||||||
|
|
||||||
|
numFiles, totalAddition, totalDeletions, err = repo.GetCommitShortStat("feaf4ba6bc635fec442f46ddd4512416ec43c2c2")
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.Equal(t, 0, numFiles)
|
||||||
|
assert.Equal(t, 0, totalAddition)
|
||||||
|
assert.Equal(t, 0, totalDeletions)
|
||||||
|
|
||||||
|
numFiles, totalAddition, totalDeletions, err = repo.GetCommitShortStat("37991dec2c8e592043f47155ce4808d4580f9123")
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.Equal(t, 1, numFiles)
|
||||||
|
assert.Equal(t, 1, totalAddition)
|
||||||
|
assert.Equal(t, 0, totalDeletions)
|
||||||
|
|
||||||
|
numFiles, totalAddition, totalDeletions, err = repo.GetCommitShortStat("6fbd69e9823458e6c4a2fc5c0f6bc022b2f2acd1")
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.Equal(t, 2, numFiles)
|
||||||
|
assert.Equal(t, 2, totalAddition)
|
||||||
|
assert.Equal(t, 0, totalDeletions)
|
||||||
|
|
||||||
|
numFiles, totalAddition, totalDeletions, err = repo.GetCommitShortStat("8006ff9adbf0cb94da7dad9e537e53817f9fa5c0")
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.Equal(t, 2, numFiles)
|
||||||
|
assert.Equal(t, 2, totalAddition)
|
||||||
|
assert.Equal(t, 0, totalDeletions)
|
||||||
|
|
||||||
|
numFiles, totalAddition, totalDeletions, err = repo.GetCommitShortStat("8d92fc957a4d7cfd98bc375f0b7bb189a0d6c9f2")
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.Equal(t, 1, numFiles)
|
||||||
|
assert.Equal(t, 1, totalAddition)
|
||||||
|
assert.Equal(t, 0, totalDeletions)
|
||||||
|
|
||||||
|
numFiles, totalAddition, totalDeletions, err = repo.GetCommitShortStat("95bb4d39648ee7e325106df01a621c530863a653")
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.Equal(t, 1, numFiles)
|
||||||
|
assert.Equal(t, 1, totalAddition)
|
||||||
|
assert.Equal(t, 0, totalDeletions)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("repo6_blame_sha256", func(t *testing.T) {
|
||||||
|
repo, err := openRepositoryWithDefaultContext(filepath.Join(testReposDir, "repo6_blame_sha256"))
|
||||||
|
if err != nil {
|
||||||
|
require.NoError(t, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer repo.Close()
|
||||||
|
|
||||||
|
numFiles, totalAddition, totalDeletions, err := repo.GetCommitShortStat("e2f5660e15159082902960af0ed74fc144921d2b0c80e069361853b3ece29ba3")
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.Equal(t, 1, numFiles)
|
||||||
|
assert.Equal(t, 1, totalAddition)
|
||||||
|
assert.Equal(t, 0, totalDeletions)
|
||||||
|
|
||||||
|
numFiles, totalAddition, totalDeletions, err = repo.GetCommitShortStat("9347b0198cd1f25017579b79d0938fa89dba34ad2514f0dd92f6bc975ed1a2fe")
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.Equal(t, 1, numFiles)
|
||||||
|
assert.Equal(t, 1, totalAddition)
|
||||||
|
assert.Equal(t, 1, totalDeletions)
|
||||||
|
|
||||||
|
numFiles, totalAddition, totalDeletions, err = repo.GetCommitShortStat("ab2b57a4fa476fb2edb74dafa577caf918561abbaa8fba0c8dc63c412e17a7cc")
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.Equal(t, 1, numFiles)
|
||||||
|
assert.Equal(t, 6, totalAddition)
|
||||||
|
assert.Equal(t, 0, totalDeletions)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
|
@ -4,7 +4,15 @@
|
||||||
package git
|
package git
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/base64"
|
||||||
|
"io/fs"
|
||||||
|
"net/http"
|
||||||
|
"net/http/httptest"
|
||||||
|
"net/url"
|
||||||
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
@ -54,3 +62,80 @@ func TestRepoGetDivergingCommits(t *testing.T) {
|
||||||
Behind: 2,
|
Behind: 2,
|
||||||
}, do)
|
}, do)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestCloneCredentials(t *testing.T) {
|
||||||
|
calledWithoutPassword := false
|
||||||
|
askpassFile := ""
|
||||||
|
credentialsFile := ""
|
||||||
|
|
||||||
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
|
||||||
|
if req.URL.Path != "/info/refs" {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get basic authorization.
|
||||||
|
auth, ok := strings.CutPrefix(req.Header.Get("Authorization"), "Basic ")
|
||||||
|
if !ok {
|
||||||
|
w.Header().Set("WWW-Authenticate", `Basic realm="Forgejo"`)
|
||||||
|
http.Error(w, "require credentials", http.StatusUnauthorized)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
rawAuth, err := base64.StdEncoding.DecodeString(auth)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
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.
|
||||||
|
if len(password) == 0 {
|
||||||
|
assert.EqualValues(t, "oauth2", user)
|
||||||
|
calledWithoutPassword = true
|
||||||
|
|
||||||
|
w.Header().Set("WWW-Authenticate", `Basic realm="Forgejo"`)
|
||||||
|
http.Error(w, "require credentials", http.StatusUnauthorized)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.EqualValues(t, "oauth2", user)
|
||||||
|
assert.EqualValues(t, "some_token", password)
|
||||||
|
|
||||||
|
tmpDir := os.TempDir()
|
||||||
|
|
||||||
|
// Verify that the askpass implementation was used.
|
||||||
|
files, err := fs.Glob(os.DirFS(tmpDir), "forgejo-askpass*")
|
||||||
|
require.NoError(t, err)
|
||||||
|
for _, fileName := range files {
|
||||||
|
fileContent, err := os.ReadFile(filepath.Join(tmpDir, fileName))
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
|
||||||
|
serverURL, err := url.Parse(server.URL)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
serverURL.User = url.UserPassword("oauth2", "some_token")
|
||||||
|
|
||||||
|
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)
|
||||||
|
_, err = os.Stat(credentialsFile)
|
||||||
|
require.ErrorIs(t, err, fs.ErrNotExist)
|
||||||
|
}
|
||||||
|
|
|
@ -97,7 +97,7 @@ func HighlightSearchResultCode(filename string, lineNums []int, highlightRanges
|
||||||
conv := hcd.ConvertToPlaceholders(string(hl))
|
conv := hcd.ConvertToPlaceholders(string(hl))
|
||||||
convLines := strings.Split(conv, "\n")
|
convLines := strings.Split(conv, "\n")
|
||||||
|
|
||||||
// each highlightRange is of the form [line number, start pos, end pos]
|
// each highlightRange is of the form [line number, start byte offset, end byte offset]
|
||||||
for _, highlightRange := range highlightRanges {
|
for _, highlightRange := range highlightRanges {
|
||||||
ln, start, end := highlightRange[0], highlightRange[1], highlightRange[2]
|
ln, start, end := highlightRange[0], highlightRange[1], highlightRange[2]
|
||||||
line := convLines[ln]
|
line := convLines[ln]
|
||||||
|
@ -105,15 +105,18 @@ func HighlightSearchResultCode(filename string, lineNums []int, highlightRanges
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sr := strings.NewReader(line)
|
||||||
sb := strings.Builder{}
|
sb := strings.Builder{}
|
||||||
count := -1
|
count := -1
|
||||||
isOpen := false
|
isOpen := false
|
||||||
for _, r := range line {
|
for r, size, err := sr.ReadRune(); err == nil; r, size, err = sr.ReadRune() {
|
||||||
if token, ok := hcd.PlaceholderTokenMap[r];
|
if token, ok := hcd.PlaceholderTokenMap[r];
|
||||||
// token was not found
|
// token was not found
|
||||||
!ok ||
|
!ok {
|
||||||
// token was marked as used
|
count += size
|
||||||
token == "" ||
|
} else if
|
||||||
|
// token was marked as used
|
||||||
|
token == "" ||
|
||||||
// the token is not an valid html tag emitted by chroma
|
// the token is not an valid html tag emitted by chroma
|
||||||
!(len(token) > 6 && (token[0:5] == "<span" || token[0:6] == "</span")) {
|
!(len(token) > 6 && (token[0:5] == "<span" || token[0:6] == "</span")) {
|
||||||
count++
|
count++
|
||||||
|
@ -132,15 +135,15 @@ func HighlightSearchResultCode(filename string, lineNums []int, highlightRanges
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
switch count {
|
switch {
|
||||||
case end:
|
case count >= end:
|
||||||
// if tag is not open, no need to close
|
// if tag is not open, no need to close
|
||||||
if !isOpen {
|
if !isOpen {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
sb.WriteRune(endTag)
|
sb.WriteRune(endTag)
|
||||||
isOpen = false
|
isOpen = false
|
||||||
case start:
|
case count >= start:
|
||||||
// if tag is open, do not open again
|
// if tag is open, do not open again
|
||||||
if isOpen {
|
if isOpen {
|
||||||
break
|
break
|
||||||
|
@ -161,7 +164,7 @@ func HighlightSearchResultCode(filename string, lineNums []int, highlightRanges
|
||||||
highlightedLines := strings.Split(hcd.Recover(conv), "\n")
|
highlightedLines := strings.Split(hcd.Recover(conv), "\n")
|
||||||
// The lineNums outputted by highlight.Code might not match the original lineNums, because "highlight" removes the last `\n`
|
// The lineNums outputted by highlight.Code might not match the original lineNums, because "highlight" removes the last `\n`
|
||||||
lines := make([]ResultLine, min(len(highlightedLines), len(lineNums)))
|
lines := make([]ResultLine, min(len(highlightedLines), len(lineNums)))
|
||||||
for i := 0; i < len(lines); i++ {
|
for i := range len(lines) {
|
||||||
lines[i].Num = lineNums[i]
|
lines[i].Num = lineNums[i]
|
||||||
lines[i].FormattedContent = template.HTML(highlightedLines[i])
|
lines[i].FormattedContent = template.HTML(highlightedLines[i])
|
||||||
}
|
}
|
||||||
|
|
122
modules/indexer/code/search_test.go
Normal file
122
modules/indexer/code/search_test.go
Normal file
|
@ -0,0 +1,122 @@
|
||||||
|
// Copyright 2025 The Forgejo Authors. All rights reserved.
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
package code
|
||||||
|
|
||||||
|
import (
|
||||||
|
"html/template"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestHighlightSearchResultCode(t *testing.T) {
|
||||||
|
opts := []struct {
|
||||||
|
Title string
|
||||||
|
File string
|
||||||
|
Lines []int
|
||||||
|
Range [][3]int
|
||||||
|
Code string
|
||||||
|
Result []template.HTML
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
Title: "One Match Text",
|
||||||
|
File: "test.txt",
|
||||||
|
Range: [][3]int{{1, 5, 9}},
|
||||||
|
Code: "First Line\nMark this only\nThe End",
|
||||||
|
Result: []template.HTML{
|
||||||
|
"First Line",
|
||||||
|
"Mark <span class=\"search-highlight\">this</span> only",
|
||||||
|
"The End",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Title: "Two Match Text",
|
||||||
|
File: "test.txt",
|
||||||
|
Range: [][3]int{
|
||||||
|
{1, 5, 9},
|
||||||
|
{2, 5, 9},
|
||||||
|
},
|
||||||
|
Code: "First Line\nMark this only\nMark this too\nThe End",
|
||||||
|
Result: []template.HTML{
|
||||||
|
"First Line",
|
||||||
|
"Mark <span class=\"search-highlight\">this</span> only",
|
||||||
|
"Mark <span class=\"search-highlight\">this</span> too",
|
||||||
|
"The End",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Title: "Unicode Before",
|
||||||
|
File: "test.txt",
|
||||||
|
Range: [][3]int{{1, 10, 14}},
|
||||||
|
Code: "First Line\nMark 👉 this only\nThe End",
|
||||||
|
Result: []template.HTML{
|
||||||
|
"First Line",
|
||||||
|
"Mark 👉 <span class=\"search-highlight\">this</span> only",
|
||||||
|
"The End",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Title: "Unicode Between",
|
||||||
|
File: "test.txt",
|
||||||
|
Range: [][3]int{{1, 5, 14}},
|
||||||
|
Code: "First Line\nMark this 😊 only\nThe End",
|
||||||
|
Result: []template.HTML{
|
||||||
|
"First Line",
|
||||||
|
"Mark <span class=\"search-highlight\">this 😊</span> only",
|
||||||
|
"The End",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Title: "Unicode Before And Between",
|
||||||
|
File: "test.txt",
|
||||||
|
Range: [][3]int{{1, 10, 19}},
|
||||||
|
Code: "First Line\nMark 👉 this 😊 only\nThe End",
|
||||||
|
Result: []template.HTML{
|
||||||
|
"First Line",
|
||||||
|
"Mark 👉 <span class=\"search-highlight\">this 😊</span> only",
|
||||||
|
"The End",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Title: "Golang",
|
||||||
|
File: "test.go",
|
||||||
|
Range: [][3]int{{1, 14, 23}},
|
||||||
|
Code: "func main() {\n\tfmt.Println(\"mark this\")\n}",
|
||||||
|
Result: []template.HTML{
|
||||||
|
"<span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">(</span><span class=\"p\">)</span> <span class=\"p\">{</span>",
|
||||||
|
"\t<span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">"<span class=\"search-highlight\">mark this</span>"</span><span class=\"p\">)</span>",
|
||||||
|
"<span class=\"p\">}</span>",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Title: "Golang Unicode",
|
||||||
|
File: "test.go",
|
||||||
|
Range: [][3]int{{1, 14, 28}},
|
||||||
|
Code: "func main() {\n\tfmt.Println(\"mark this 😊\")\n}",
|
||||||
|
Result: []template.HTML{
|
||||||
|
"<span class=\"kd\">func</span> <span class=\"nf\">main</span><span class=\"p\">(</span><span class=\"p\">)</span> <span class=\"p\">{</span>",
|
||||||
|
"\t<span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">"<span class=\"search-highlight\">mark this 😊</span>"</span><span class=\"p\">)</span>",
|
||||||
|
"<span class=\"p\">}</span>",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, o := range opts {
|
||||||
|
t.Run(o.Title, func(t *testing.T) {
|
||||||
|
lines := []int{}
|
||||||
|
for i := range strings.Count(strings.TrimSuffix(o.Code, "\n"), "\n") + 1 {
|
||||||
|
lines = append(lines, i+1)
|
||||||
|
}
|
||||||
|
res := HighlightSearchResultCode(o.File, lines, o.Range, o.Code)
|
||||||
|
assert.Len(t, res, len(o.Result))
|
||||||
|
assert.Len(t, res, len(lines))
|
||||||
|
|
||||||
|
for i, r := range res {
|
||||||
|
require.Equal(t, lines[i], r.Num)
|
||||||
|
require.Equal(t, o.Result[i], r.FormattedContent)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
|
@ -156,11 +156,12 @@ func (b *Indexer) Delete(_ context.Context, ids ...int64) error {
|
||||||
func (b *Indexer) Search(ctx context.Context, options *internal.SearchOptions) (*internal.SearchResult, error) {
|
func (b *Indexer) Search(ctx context.Context, options *internal.SearchOptions) (*internal.SearchResult, error) {
|
||||||
var queries []query.Query
|
var queries []query.Query
|
||||||
|
|
||||||
if options.Keyword != "" {
|
tokens, err := options.Tokens()
|
||||||
tokens, err := options.Tokens()
|
if err != nil {
|
||||||
if err != nil {
|
return nil, err
|
||||||
return nil, err
|
}
|
||||||
}
|
|
||||||
|
if len(tokens) > 0 {
|
||||||
q := bleve.NewBooleanQuery()
|
q := bleve.NewBooleanQuery()
|
||||||
for _, token := range tokens {
|
for _, token := range tokens {
|
||||||
innerQ := bleve.NewDisjunctionQuery(
|
innerQ := bleve.NewDisjunctionQuery(
|
||||||
|
|
|
@ -149,12 +149,13 @@ func (b *Indexer) Delete(ctx context.Context, ids ...int64) error {
|
||||||
func (b *Indexer) Search(ctx context.Context, options *internal.SearchOptions) (*internal.SearchResult, error) {
|
func (b *Indexer) Search(ctx context.Context, options *internal.SearchOptions) (*internal.SearchResult, error) {
|
||||||
query := elastic.NewBoolQuery()
|
query := elastic.NewBoolQuery()
|
||||||
|
|
||||||
if options.Keyword != "" {
|
tokens, err := options.Tokens()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(tokens) > 0 {
|
||||||
q := elastic.NewBoolQuery()
|
q := elastic.NewBoolQuery()
|
||||||
tokens, err := options.Tokens()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
for _, token := range tokens {
|
for _, token := range tokens {
|
||||||
innerQ := elastic.NewMultiMatchQuery(token.Term, "content", "comments").FieldWithBoost("title", 2.0).TieBreaker(0.5)
|
innerQ := elastic.NewMultiMatchQuery(token.Term, "content", "comments").FieldWithBoost("title", 2.0).TieBreaker(0.5)
|
||||||
if token.Fuzzy {
|
if token.Fuzzy {
|
||||||
|
|
|
@ -45,12 +45,9 @@ func (t *Tokenizer) next() (tk Token, err error) {
|
||||||
|
|
||||||
// skip all leading white space
|
// skip all leading white space
|
||||||
for {
|
for {
|
||||||
if r, _, err = t.in.ReadRune(); err == nil && r == ' ' {
|
if r, _, err = t.in.ReadRune(); err != nil || r != ' ' {
|
||||||
//nolint:staticcheck,wastedassign // SA4006 the variable is used after the loop
|
break
|
||||||
r, _, err = t.in.ReadRune()
|
|
||||||
continue
|
|
||||||
}
|
}
|
||||||
break
|
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return tk, err
|
return tk, err
|
||||||
|
@ -107,11 +104,17 @@ nextEnd:
|
||||||
|
|
||||||
// Tokenize the keyword
|
// Tokenize the keyword
|
||||||
func (o *SearchOptions) Tokens() (tokens []Token, err error) {
|
func (o *SearchOptions) Tokens() (tokens []Token, err error) {
|
||||||
|
if o.Keyword == "" {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
in := strings.NewReader(o.Keyword)
|
in := strings.NewReader(o.Keyword)
|
||||||
it := Tokenizer{in: in}
|
it := Tokenizer{in: in}
|
||||||
|
|
||||||
for token, err := it.next(); err == nil; token, err = it.next() {
|
for token, err := it.next(); err == nil; token, err = it.next() {
|
||||||
tokens = append(tokens, token)
|
if token.Term != "" {
|
||||||
|
tokens = append(tokens, token)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if err != nil && err != io.EOF {
|
if err != nil && err != io.EOF {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
|
@ -41,6 +41,36 @@ var testOpts = []testIssueQueryStringOpt{
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Keyword: "Hello World",
|
||||||
|
Results: []Token{
|
||||||
|
{
|
||||||
|
Term: "Hello",
|
||||||
|
Fuzzy: true,
|
||||||
|
Kind: BoolOptShould,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Term: "World",
|
||||||
|
Fuzzy: true,
|
||||||
|
Kind: BoolOptShould,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Keyword: " Hello World ",
|
||||||
|
Results: []Token{
|
||||||
|
{
|
||||||
|
Term: "Hello",
|
||||||
|
Fuzzy: true,
|
||||||
|
Kind: BoolOptShould,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Term: "World",
|
||||||
|
Fuzzy: true,
|
||||||
|
Kind: BoolOptShould,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
Keyword: "+Hello +World",
|
Keyword: "+Hello +World",
|
||||||
Results: []Token{
|
Results: []Token{
|
||||||
|
@ -156,6 +186,68 @@ var testOpts = []testIssueQueryStringOpt{
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Keyword: "\\",
|
||||||
|
Results: nil,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Keyword: "\"",
|
||||||
|
Results: nil,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Keyword: "Hello \\",
|
||||||
|
Results: []Token{
|
||||||
|
{
|
||||||
|
Term: "Hello",
|
||||||
|
Fuzzy: true,
|
||||||
|
Kind: BoolOptShould,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Keyword: "\"\"",
|
||||||
|
Results: nil,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Keyword: "\" World \"",
|
||||||
|
Results: []Token{
|
||||||
|
{
|
||||||
|
Term: " World ",
|
||||||
|
Fuzzy: false,
|
||||||
|
Kind: BoolOptShould,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Keyword: "\"\" World \"\"",
|
||||||
|
Results: []Token{
|
||||||
|
{
|
||||||
|
Term: "World",
|
||||||
|
Fuzzy: true,
|
||||||
|
Kind: BoolOptShould,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Keyword: "Best \"Hello World\" Ever",
|
||||||
|
Results: []Token{
|
||||||
|
{
|
||||||
|
Term: "Best",
|
||||||
|
Fuzzy: true,
|
||||||
|
Kind: BoolOptShould,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Term: "Hello World",
|
||||||
|
Fuzzy: false,
|
||||||
|
Kind: BoolOptShould,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Term: "Ever",
|
||||||
|
Fuzzy: true,
|
||||||
|
Kind: BoolOptShould,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestIssueQueryString(t *testing.T) {
|
func TestIssueQueryString(t *testing.T) {
|
||||||
|
|
|
@ -87,14 +87,44 @@ func TestIndexer(t *testing.T, indexer internal.Indexer) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func allResults(t *testing.T, data map[int64]*internal.IndexerData, result *internal.SearchResult) {
|
||||||
|
assert.Len(t, result.Hits, len(data))
|
||||||
|
assert.Equal(t, len(data), int(result.Total))
|
||||||
|
}
|
||||||
|
|
||||||
var cases = []*testIndexerCase{
|
var cases = []*testIndexerCase{
|
||||||
{
|
{
|
||||||
Name: "default",
|
Name: "default",
|
||||||
SearchOptions: &internal.SearchOptions{},
|
SearchOptions: &internal.SearchOptions{},
|
||||||
Expected: func(t *testing.T, data map[int64]*internal.IndexerData, result *internal.SearchResult) {
|
Expected: allResults,
|
||||||
assert.Len(t, result.Hits, len(data))
|
},
|
||||||
assert.Equal(t, len(data), int(result.Total))
|
{
|
||||||
|
Name: "empty keyword",
|
||||||
|
SearchOptions: &internal.SearchOptions{
|
||||||
|
Keyword: "",
|
||||||
},
|
},
|
||||||
|
Expected: allResults,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "whitespace keyword",
|
||||||
|
SearchOptions: &internal.SearchOptions{
|
||||||
|
Keyword: " ",
|
||||||
|
},
|
||||||
|
Expected: allResults,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "dangling slash in keyword",
|
||||||
|
SearchOptions: &internal.SearchOptions{
|
||||||
|
Keyword: "\\",
|
||||||
|
},
|
||||||
|
Expected: allResults,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "dangling quote in keyword",
|
||||||
|
SearchOptions: &internal.SearchOptions{
|
||||||
|
Keyword: "\"",
|
||||||
|
},
|
||||||
|
Expected: allResults,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Name: "empty",
|
Name: "empty",
|
||||||
|
|
|
@ -104,7 +104,7 @@ func TestRender_Images(t *testing.T) {
|
||||||
|
|
||||||
test(
|
test(
|
||||||
"",
|
"",
|
||||||
`<p><a href="`+result+`" target="_blank" rel="nofollow noopener"><img src="`+result+`" alt="`+title+`"/></a></p>`)
|
`<p><a href="`+result+`" target="_blank" rel="nofollow noopener"><img src="`+result+`" alt="`+title+`" loading="lazy"/></a></p>`)
|
||||||
|
|
||||||
test(
|
test(
|
||||||
"[["+title+"|"+url+"]]",
|
"[["+title+"|"+url+"]]",
|
||||||
|
@ -115,7 +115,7 @@ func TestRender_Images(t *testing.T) {
|
||||||
|
|
||||||
test(
|
test(
|
||||||
"",
|
"",
|
||||||
`<p><a href="`+result+`" target="_blank" rel="nofollow noopener"><img src="`+result+`" alt="`+title+`"/></a></p>`)
|
`<p><a href="`+result+`" target="_blank" rel="nofollow noopener"><img src="`+result+`" alt="`+title+`" loading="lazy"/></a></p>`)
|
||||||
|
|
||||||
test(
|
test(
|
||||||
"[["+title+"|"+url+"]]",
|
"[["+title+"|"+url+"]]",
|
||||||
|
@ -412,8 +412,8 @@ func TestRenderSiblingImages_Issue12925(t *testing.T) {
|
||||||
testcase := `
|
testcase := `
|
||||||

|

|
||||||
`
|
`
|
||||||
expected := `<p><a href="/image1" target="_blank" rel="nofollow noopener"><img src="/image1" alt="image1"></a><br>
|
expected := `<p><a href="/image1" target="_blank" rel="nofollow noopener"><img src="/image1" alt="image1" loading="lazy"></a><br>
|
||||||
<a href="/image2" target="_blank" rel="nofollow noopener"><img src="/image2" alt="image2"></a></p>
|
<a href="/image2" target="_blank" rel="nofollow noopener"><img src="/image2" alt="image2" loading="lazy"></a></p>
|
||||||
`
|
`
|
||||||
res, err := markdown.RenderRawString(&markup.RenderContext{Ctx: git.DefaultContext}, testcase)
|
res, err := markdown.RenderRawString(&markup.RenderContext{Ctx: git.DefaultContext}, testcase)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
@ -845,10 +845,10 @@ mail@domain.com
|
||||||
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
||||||
<a href="/src/file.bin" rel="nofollow">local link</a><br/>
|
<a href="/src/file.bin" rel="nofollow">local link</a><br/>
|
||||||
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
||||||
<a href="/image.jpg" target="_blank" rel="nofollow noopener"><img src="/image.jpg" alt="local image"/></a><br/>
|
<a href="/image.jpg" target="_blank" rel="nofollow noopener"><img src="/image.jpg" alt="local image" loading="lazy"/></a><br/>
|
||||||
<a href="/path/file" target="_blank" rel="nofollow noopener"><img src="/path/file" alt="local image"/></a><br/>
|
<a href="/path/file" target="_blank" rel="nofollow noopener"><img src="/path/file" alt="local image" loading="lazy"/></a><br/>
|
||||||
<a href="/path/file" target="_blank" rel="nofollow noopener"><img src="/path/file" alt="local image"/></a><br/>
|
<a href="/path/file" target="_blank" rel="nofollow noopener"><img src="/path/file" alt="local image" loading="lazy"/></a><br/>
|
||||||
<a href="https://example.com/image.jpg" target="_blank" rel="nofollow noopener"><img src="https://example.com/image.jpg" alt="remote image"/></a><br/>
|
<a href="https://example.com/image.jpg" target="_blank" rel="nofollow noopener"><img src="https://example.com/image.jpg" alt="remote image" loading="lazy"/></a><br/>
|
||||||
<a href="/image.jpg" rel="nofollow"><img src="/image.jpg" title="local image" alt=""/></a><br/>
|
<a href="/image.jpg" rel="nofollow"><img src="/image.jpg" title="local image" alt=""/></a><br/>
|
||||||
<a href="https://example.com/image.jpg" rel="nofollow"><img src="https://example.com/image.jpg" title="remote link" alt=""/></a><br/>
|
<a href="https://example.com/image.jpg" rel="nofollow"><img src="https://example.com/image.jpg" title="remote link" alt=""/></a><br/>
|
||||||
<a href="https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash" rel="nofollow">https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash</a><br/>
|
<a href="https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash" rel="nofollow">https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash</a><br/>
|
||||||
|
@ -872,10 +872,10 @@ space</p>
|
||||||
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
||||||
<a href="/wiki/file.bin" rel="nofollow">local link</a><br/>
|
<a href="/wiki/file.bin" rel="nofollow">local link</a><br/>
|
||||||
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
||||||
<a href="/wiki/raw/image.jpg" target="_blank" rel="nofollow noopener"><img src="/wiki/raw/image.jpg" alt="local image"/></a><br/>
|
<a href="/wiki/raw/image.jpg" target="_blank" rel="nofollow noopener"><img src="/wiki/raw/image.jpg" alt="local image" loading="lazy"/></a><br/>
|
||||||
<a href="/wiki/raw/path/file" target="_blank" rel="nofollow noopener"><img src="/wiki/raw/path/file" alt="local image"/></a><br/>
|
<a href="/wiki/raw/path/file" target="_blank" rel="nofollow noopener"><img src="/wiki/raw/path/file" alt="local image" loading="lazy"/></a><br/>
|
||||||
<a href="/wiki/raw/path/file" target="_blank" rel="nofollow noopener"><img src="/wiki/raw/path/file" alt="local image"/></a><br/>
|
<a href="/wiki/raw/path/file" target="_blank" rel="nofollow noopener"><img src="/wiki/raw/path/file" alt="local image" loading="lazy"/></a><br/>
|
||||||
<a href="https://example.com/image.jpg" target="_blank" rel="nofollow noopener"><img src="https://example.com/image.jpg" alt="remote image"/></a><br/>
|
<a href="https://example.com/image.jpg" target="_blank" rel="nofollow noopener"><img src="https://example.com/image.jpg" alt="remote image" loading="lazy"/></a><br/>
|
||||||
<a href="/wiki/raw/image.jpg" rel="nofollow"><img src="/wiki/raw/image.jpg" title="local image" alt=""/></a><br/>
|
<a href="/wiki/raw/image.jpg" rel="nofollow"><img src="/wiki/raw/image.jpg" title="local image" alt=""/></a><br/>
|
||||||
<a href="https://example.com/image.jpg" rel="nofollow"><img src="https://example.com/image.jpg" title="remote link" alt=""/></a><br/>
|
<a href="https://example.com/image.jpg" rel="nofollow"><img src="https://example.com/image.jpg" title="remote link" alt=""/></a><br/>
|
||||||
<a href="https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash" rel="nofollow">https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash</a><br/>
|
<a href="https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash" rel="nofollow">https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash</a><br/>
|
||||||
|
@ -901,10 +901,10 @@ space</p>
|
||||||
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
||||||
<a href="https://gitea.io/src/file.bin" rel="nofollow">local link</a><br/>
|
<a href="https://gitea.io/src/file.bin" rel="nofollow">local link</a><br/>
|
||||||
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
||||||
<a href="https://gitea.io/image.jpg" target="_blank" rel="nofollow noopener"><img src="https://gitea.io/image.jpg" alt="local image"/></a><br/>
|
<a href="https://gitea.io/image.jpg" target="_blank" rel="nofollow noopener"><img src="https://gitea.io/image.jpg" alt="local image" loading="lazy"/></a><br/>
|
||||||
<a href="https://gitea.io/path/file" target="_blank" rel="nofollow noopener"><img src="https://gitea.io/path/file" alt="local image"/></a><br/>
|
<a href="https://gitea.io/path/file" target="_blank" rel="nofollow noopener"><img src="https://gitea.io/path/file" alt="local image" loading="lazy"/></a><br/>
|
||||||
<a href="https://gitea.io/path/file" target="_blank" rel="nofollow noopener"><img src="https://gitea.io/path/file" alt="local image"/></a><br/>
|
<a href="https://gitea.io/path/file" target="_blank" rel="nofollow noopener"><img src="https://gitea.io/path/file" alt="local image" loading="lazy"/></a><br/>
|
||||||
<a href="https://example.com/image.jpg" target="_blank" rel="nofollow noopener"><img src="https://example.com/image.jpg" alt="remote image"/></a><br/>
|
<a href="https://example.com/image.jpg" target="_blank" rel="nofollow noopener"><img src="https://example.com/image.jpg" alt="remote image" loading="lazy"/></a><br/>
|
||||||
<a href="https://gitea.io/image.jpg" rel="nofollow"><img src="https://gitea.io/image.jpg" title="local image" alt=""/></a><br/>
|
<a href="https://gitea.io/image.jpg" rel="nofollow"><img src="https://gitea.io/image.jpg" title="local image" alt=""/></a><br/>
|
||||||
<a href="https://example.com/image.jpg" rel="nofollow"><img src="https://example.com/image.jpg" title="remote link" alt=""/></a><br/>
|
<a href="https://example.com/image.jpg" rel="nofollow"><img src="https://example.com/image.jpg" title="remote link" alt=""/></a><br/>
|
||||||
<a href="https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash" rel="nofollow">https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash</a><br/>
|
<a href="https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash" rel="nofollow">https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash</a><br/>
|
||||||
|
@ -930,10 +930,10 @@ space</p>
|
||||||
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
||||||
<a href="https://gitea.io/wiki/file.bin" rel="nofollow">local link</a><br/>
|
<a href="https://gitea.io/wiki/file.bin" rel="nofollow">local link</a><br/>
|
||||||
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
||||||
<a href="https://gitea.io/wiki/raw/image.jpg" target="_blank" rel="nofollow noopener"><img src="https://gitea.io/wiki/raw/image.jpg" alt="local image"/></a><br/>
|
<a href="https://gitea.io/wiki/raw/image.jpg" target="_blank" rel="nofollow noopener"><img src="https://gitea.io/wiki/raw/image.jpg" alt="local image" loading="lazy"/></a><br/>
|
||||||
<a href="https://gitea.io/wiki/raw/path/file" target="_blank" rel="nofollow noopener"><img src="https://gitea.io/wiki/raw/path/file" alt="local image"/></a><br/>
|
<a href="https://gitea.io/wiki/raw/path/file" target="_blank" rel="nofollow noopener"><img src="https://gitea.io/wiki/raw/path/file" alt="local image" loading="lazy"/></a><br/>
|
||||||
<a href="https://gitea.io/wiki/raw/path/file" target="_blank" rel="nofollow noopener"><img src="https://gitea.io/wiki/raw/path/file" alt="local image"/></a><br/>
|
<a href="https://gitea.io/wiki/raw/path/file" target="_blank" rel="nofollow noopener"><img src="https://gitea.io/wiki/raw/path/file" alt="local image" loading="lazy"/></a><br/>
|
||||||
<a href="https://example.com/image.jpg" target="_blank" rel="nofollow noopener"><img src="https://example.com/image.jpg" alt="remote image"/></a><br/>
|
<a href="https://example.com/image.jpg" target="_blank" rel="nofollow noopener"><img src="https://example.com/image.jpg" alt="remote image" loading="lazy"/></a><br/>
|
||||||
<a href="https://gitea.io/wiki/raw/image.jpg" rel="nofollow"><img src="https://gitea.io/wiki/raw/image.jpg" title="local image" alt=""/></a><br/>
|
<a href="https://gitea.io/wiki/raw/image.jpg" rel="nofollow"><img src="https://gitea.io/wiki/raw/image.jpg" title="local image" alt=""/></a><br/>
|
||||||
<a href="https://example.com/image.jpg" rel="nofollow"><img src="https://example.com/image.jpg" title="remote link" alt=""/></a><br/>
|
<a href="https://example.com/image.jpg" rel="nofollow"><img src="https://example.com/image.jpg" title="remote link" alt=""/></a><br/>
|
||||||
<a href="https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash" rel="nofollow">https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash</a><br/>
|
<a href="https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash" rel="nofollow">https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash</a><br/>
|
||||||
|
@ -959,10 +959,10 @@ space</p>
|
||||||
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
||||||
<a href="/relative/path/src/file.bin" rel="nofollow">local link</a><br/>
|
<a href="/relative/path/src/file.bin" rel="nofollow">local link</a><br/>
|
||||||
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
||||||
<a href="/relative/path/image.jpg" target="_blank" rel="nofollow noopener"><img src="/relative/path/image.jpg" alt="local image"/></a><br/>
|
<a href="/relative/path/image.jpg" target="_blank" rel="nofollow noopener"><img src="/relative/path/image.jpg" alt="local image" loading="lazy"/></a><br/>
|
||||||
<a href="/relative/path/path/file" target="_blank" rel="nofollow noopener"><img src="/relative/path/path/file" alt="local image"/></a><br/>
|
<a href="/relative/path/path/file" target="_blank" rel="nofollow noopener"><img src="/relative/path/path/file" alt="local image" loading="lazy"/></a><br/>
|
||||||
<a href="/relative/path/path/file" target="_blank" rel="nofollow noopener"><img src="/relative/path/path/file" alt="local image"/></a><br/>
|
<a href="/relative/path/path/file" target="_blank" rel="nofollow noopener"><img src="/relative/path/path/file" alt="local image" loading="lazy"/></a><br/>
|
||||||
<a href="https://example.com/image.jpg" target="_blank" rel="nofollow noopener"><img src="https://example.com/image.jpg" alt="remote image"/></a><br/>
|
<a href="https://example.com/image.jpg" target="_blank" rel="nofollow noopener"><img src="https://example.com/image.jpg" alt="remote image" loading="lazy"/></a><br/>
|
||||||
<a href="/relative/path/image.jpg" rel="nofollow"><img src="/relative/path/image.jpg" title="local image" alt=""/></a><br/>
|
<a href="/relative/path/image.jpg" rel="nofollow"><img src="/relative/path/image.jpg" title="local image" alt=""/></a><br/>
|
||||||
<a href="https://example.com/image.jpg" rel="nofollow"><img src="https://example.com/image.jpg" title="remote link" alt=""/></a><br/>
|
<a href="https://example.com/image.jpg" rel="nofollow"><img src="https://example.com/image.jpg" title="remote link" alt=""/></a><br/>
|
||||||
<a href="https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash" rel="nofollow">https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash</a><br/>
|
<a href="https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash" rel="nofollow">https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash</a><br/>
|
||||||
|
@ -988,10 +988,10 @@ space</p>
|
||||||
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
||||||
<a href="/relative/path/wiki/file.bin" rel="nofollow">local link</a><br/>
|
<a href="/relative/path/wiki/file.bin" rel="nofollow">local link</a><br/>
|
||||||
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
||||||
<a href="/relative/path/wiki/raw/image.jpg" target="_blank" rel="nofollow noopener"><img src="/relative/path/wiki/raw/image.jpg" alt="local image"/></a><br/>
|
<a href="/relative/path/wiki/raw/image.jpg" target="_blank" rel="nofollow noopener"><img src="/relative/path/wiki/raw/image.jpg" alt="local image" loading="lazy"/></a><br/>
|
||||||
<a href="/relative/path/wiki/raw/path/file" target="_blank" rel="nofollow noopener"><img src="/relative/path/wiki/raw/path/file" alt="local image"/></a><br/>
|
<a href="/relative/path/wiki/raw/path/file" target="_blank" rel="nofollow noopener"><img src="/relative/path/wiki/raw/path/file" alt="local image" loading="lazy"/></a><br/>
|
||||||
<a href="/relative/path/wiki/raw/path/file" target="_blank" rel="nofollow noopener"><img src="/relative/path/wiki/raw/path/file" alt="local image"/></a><br/>
|
<a href="/relative/path/wiki/raw/path/file" target="_blank" rel="nofollow noopener"><img src="/relative/path/wiki/raw/path/file" alt="local image" loading="lazy"/></a><br/>
|
||||||
<a href="https://example.com/image.jpg" target="_blank" rel="nofollow noopener"><img src="https://example.com/image.jpg" alt="remote image"/></a><br/>
|
<a href="https://example.com/image.jpg" target="_blank" rel="nofollow noopener"><img src="https://example.com/image.jpg" alt="remote image" loading="lazy"/></a><br/>
|
||||||
<a href="/relative/path/wiki/raw/image.jpg" rel="nofollow"><img src="/relative/path/wiki/raw/image.jpg" title="local image" alt=""/></a><br/>
|
<a href="/relative/path/wiki/raw/image.jpg" rel="nofollow"><img src="/relative/path/wiki/raw/image.jpg" title="local image" alt=""/></a><br/>
|
||||||
<a href="https://example.com/image.jpg" rel="nofollow"><img src="https://example.com/image.jpg" title="remote link" alt=""/></a><br/>
|
<a href="https://example.com/image.jpg" rel="nofollow"><img src="https://example.com/image.jpg" title="remote link" alt=""/></a><br/>
|
||||||
<a href="https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash" rel="nofollow">https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash</a><br/>
|
<a href="https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash" rel="nofollow">https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash</a><br/>
|
||||||
|
@ -1018,10 +1018,10 @@ space</p>
|
||||||
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
||||||
<a href="/user/repo/src/branch/main/file.bin" rel="nofollow">local link</a><br/>
|
<a href="/user/repo/src/branch/main/file.bin" rel="nofollow">local link</a><br/>
|
||||||
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
||||||
<a href="/user/repo/media/branch/main/image.jpg" target="_blank" rel="nofollow noopener"><img src="/user/repo/media/branch/main/image.jpg" alt="local image"/></a><br/>
|
<a href="/user/repo/media/branch/main/image.jpg" target="_blank" rel="nofollow noopener"><img src="/user/repo/media/branch/main/image.jpg" alt="local image" loading="lazy"/></a><br/>
|
||||||
<a href="/user/repo/media/branch/main/path/file" target="_blank" rel="nofollow noopener"><img src="/user/repo/media/branch/main/path/file" alt="local image"/></a><br/>
|
<a href="/user/repo/media/branch/main/path/file" target="_blank" rel="nofollow noopener"><img src="/user/repo/media/branch/main/path/file" alt="local image" loading="lazy"/></a><br/>
|
||||||
<a href="/user/repo/media/branch/main/path/file" target="_blank" rel="nofollow noopener"><img src="/user/repo/media/branch/main/path/file" alt="local image"/></a><br/>
|
<a href="/user/repo/media/branch/main/path/file" target="_blank" rel="nofollow noopener"><img src="/user/repo/media/branch/main/path/file" alt="local image" loading="lazy"/></a><br/>
|
||||||
<a href="https://example.com/image.jpg" target="_blank" rel="nofollow noopener"><img src="https://example.com/image.jpg" alt="remote image"/></a><br/>
|
<a href="https://example.com/image.jpg" target="_blank" rel="nofollow noopener"><img src="https://example.com/image.jpg" alt="remote image" loading="lazy"/></a><br/>
|
||||||
<a href="/user/repo/media/branch/main/image.jpg" rel="nofollow"><img src="/user/repo/media/branch/main/image.jpg" title="local image" alt=""/></a><br/>
|
<a href="/user/repo/media/branch/main/image.jpg" rel="nofollow"><img src="/user/repo/media/branch/main/image.jpg" title="local image" alt=""/></a><br/>
|
||||||
<a href="https://example.com/image.jpg" rel="nofollow"><img src="https://example.com/image.jpg" title="remote link" alt=""/></a><br/>
|
<a href="https://example.com/image.jpg" rel="nofollow"><img src="https://example.com/image.jpg" title="remote link" alt=""/></a><br/>
|
||||||
<a href="https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash" rel="nofollow">https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash</a><br/>
|
<a href="https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash" rel="nofollow">https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash</a><br/>
|
||||||
|
@ -1048,10 +1048,10 @@ space</p>
|
||||||
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
||||||
<a href="/relative/path/wiki/file.bin" rel="nofollow">local link</a><br/>
|
<a href="/relative/path/wiki/file.bin" rel="nofollow">local link</a><br/>
|
||||||
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
||||||
<a href="/relative/path/wiki/raw/image.jpg" target="_blank" rel="nofollow noopener"><img src="/relative/path/wiki/raw/image.jpg" alt="local image"/></a><br/>
|
<a href="/relative/path/wiki/raw/image.jpg" target="_blank" rel="nofollow noopener"><img src="/relative/path/wiki/raw/image.jpg" alt="local image" loading="lazy"/></a><br/>
|
||||||
<a href="/relative/path/wiki/raw/path/file" target="_blank" rel="nofollow noopener"><img src="/relative/path/wiki/raw/path/file" alt="local image"/></a><br/>
|
<a href="/relative/path/wiki/raw/path/file" target="_blank" rel="nofollow noopener"><img src="/relative/path/wiki/raw/path/file" alt="local image" loading="lazy"/></a><br/>
|
||||||
<a href="/relative/path/wiki/raw/path/file" target="_blank" rel="nofollow noopener"><img src="/relative/path/wiki/raw/path/file" alt="local image"/></a><br/>
|
<a href="/relative/path/wiki/raw/path/file" target="_blank" rel="nofollow noopener"><img src="/relative/path/wiki/raw/path/file" alt="local image" loading="lazy"/></a><br/>
|
||||||
<a href="https://example.com/image.jpg" target="_blank" rel="nofollow noopener"><img src="https://example.com/image.jpg" alt="remote image"/></a><br/>
|
<a href="https://example.com/image.jpg" target="_blank" rel="nofollow noopener"><img src="https://example.com/image.jpg" alt="remote image" loading="lazy"/></a><br/>
|
||||||
<a href="/relative/path/wiki/raw/image.jpg" rel="nofollow"><img src="/relative/path/wiki/raw/image.jpg" title="local image" alt=""/></a><br/>
|
<a href="/relative/path/wiki/raw/image.jpg" rel="nofollow"><img src="/relative/path/wiki/raw/image.jpg" title="local image" alt=""/></a><br/>
|
||||||
<a href="https://example.com/image.jpg" rel="nofollow"><img src="https://example.com/image.jpg" title="remote link" alt=""/></a><br/>
|
<a href="https://example.com/image.jpg" rel="nofollow"><img src="https://example.com/image.jpg" title="remote link" alt=""/></a><br/>
|
||||||
<a href="https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash" rel="nofollow">https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash</a><br/>
|
<a href="https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash" rel="nofollow">https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash</a><br/>
|
||||||
|
@ -1078,10 +1078,10 @@ space</p>
|
||||||
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
||||||
<a href="/user/repo/src/sub/folder/file.bin" rel="nofollow">local link</a><br/>
|
<a href="/user/repo/src/sub/folder/file.bin" rel="nofollow">local link</a><br/>
|
||||||
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
||||||
<a href="/user/repo/image.jpg" target="_blank" rel="nofollow noopener"><img src="/user/repo/image.jpg" alt="local image"/></a><br/>
|
<a href="/user/repo/image.jpg" target="_blank" rel="nofollow noopener"><img src="/user/repo/image.jpg" alt="local image" loading="lazy"/></a><br/>
|
||||||
<a href="/user/repo/path/file" target="_blank" rel="nofollow noopener"><img src="/user/repo/path/file" alt="local image"/></a><br/>
|
<a href="/user/repo/path/file" target="_blank" rel="nofollow noopener"><img src="/user/repo/path/file" alt="local image" loading="lazy"/></a><br/>
|
||||||
<a href="/user/repo/path/file" target="_blank" rel="nofollow noopener"><img src="/user/repo/path/file" alt="local image"/></a><br/>
|
<a href="/user/repo/path/file" target="_blank" rel="nofollow noopener"><img src="/user/repo/path/file" alt="local image" loading="lazy"/></a><br/>
|
||||||
<a href="https://example.com/image.jpg" target="_blank" rel="nofollow noopener"><img src="https://example.com/image.jpg" alt="remote image"/></a><br/>
|
<a href="https://example.com/image.jpg" target="_blank" rel="nofollow noopener"><img src="https://example.com/image.jpg" alt="remote image" loading="lazy"/></a><br/>
|
||||||
<a href="/user/repo/image.jpg" rel="nofollow"><img src="/user/repo/image.jpg" title="local image" alt=""/></a><br/>
|
<a href="/user/repo/image.jpg" rel="nofollow"><img src="/user/repo/image.jpg" title="local image" alt=""/></a><br/>
|
||||||
<a href="https://example.com/image.jpg" rel="nofollow"><img src="https://example.com/image.jpg" title="remote link" alt=""/></a><br/>
|
<a href="https://example.com/image.jpg" rel="nofollow"><img src="https://example.com/image.jpg" title="remote link" alt=""/></a><br/>
|
||||||
<a href="https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash" rel="nofollow">https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash</a><br/>
|
<a href="https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash" rel="nofollow">https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash</a><br/>
|
||||||
|
@ -1108,10 +1108,10 @@ space</p>
|
||||||
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
||||||
<a href="/relative/path/wiki/file.bin" rel="nofollow">local link</a><br/>
|
<a href="/relative/path/wiki/file.bin" rel="nofollow">local link</a><br/>
|
||||||
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
||||||
<a href="/relative/path/wiki/raw/image.jpg" target="_blank" rel="nofollow noopener"><img src="/relative/path/wiki/raw/image.jpg" alt="local image"/></a><br/>
|
<a href="/relative/path/wiki/raw/image.jpg" target="_blank" rel="nofollow noopener"><img src="/relative/path/wiki/raw/image.jpg" alt="local image" loading="lazy"/></a><br/>
|
||||||
<a href="/relative/path/wiki/raw/path/file" target="_blank" rel="nofollow noopener"><img src="/relative/path/wiki/raw/path/file" alt="local image"/></a><br/>
|
<a href="/relative/path/wiki/raw/path/file" target="_blank" rel="nofollow noopener"><img src="/relative/path/wiki/raw/path/file" alt="local image" loading="lazy"/></a><br/>
|
||||||
<a href="/relative/path/wiki/raw/path/file" target="_blank" rel="nofollow noopener"><img src="/relative/path/wiki/raw/path/file" alt="local image"/></a><br/>
|
<a href="/relative/path/wiki/raw/path/file" target="_blank" rel="nofollow noopener"><img src="/relative/path/wiki/raw/path/file" alt="local image" loading="lazy"/></a><br/>
|
||||||
<a href="https://example.com/image.jpg" target="_blank" rel="nofollow noopener"><img src="https://example.com/image.jpg" alt="remote image"/></a><br/>
|
<a href="https://example.com/image.jpg" target="_blank" rel="nofollow noopener"><img src="https://example.com/image.jpg" alt="remote image" loading="lazy"/></a><br/>
|
||||||
<a href="/relative/path/wiki/raw/image.jpg" rel="nofollow"><img src="/relative/path/wiki/raw/image.jpg" title="local image" alt=""/></a><br/>
|
<a href="/relative/path/wiki/raw/image.jpg" rel="nofollow"><img src="/relative/path/wiki/raw/image.jpg" title="local image" alt=""/></a><br/>
|
||||||
<a href="https://example.com/image.jpg" rel="nofollow"><img src="https://example.com/image.jpg" title="remote link" alt=""/></a><br/>
|
<a href="https://example.com/image.jpg" rel="nofollow"><img src="https://example.com/image.jpg" title="remote link" alt=""/></a><br/>
|
||||||
<a href="https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash" rel="nofollow">https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash</a><br/>
|
<a href="https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash" rel="nofollow">https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash</a><br/>
|
||||||
|
@ -1139,10 +1139,10 @@ space</p>
|
||||||
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
||||||
<a href="/user/repo/src/branch/main/sub/folder/file.bin" rel="nofollow">local link</a><br/>
|
<a href="/user/repo/src/branch/main/sub/folder/file.bin" rel="nofollow">local link</a><br/>
|
||||||
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
||||||
<a href="/user/repo/media/branch/main/sub/folder/image.jpg" target="_blank" rel="nofollow noopener"><img src="/user/repo/media/branch/main/sub/folder/image.jpg" alt="local image"/></a><br/>
|
<a href="/user/repo/media/branch/main/sub/folder/image.jpg" target="_blank" rel="nofollow noopener"><img src="/user/repo/media/branch/main/sub/folder/image.jpg" alt="local image" loading="lazy"/></a><br/>
|
||||||
<a href="/user/repo/media/branch/main/sub/folder/path/file" target="_blank" rel="nofollow noopener"><img src="/user/repo/media/branch/main/sub/folder/path/file" alt="local image"/></a><br/>
|
<a href="/user/repo/media/branch/main/sub/folder/path/file" target="_blank" rel="nofollow noopener"><img src="/user/repo/media/branch/main/sub/folder/path/file" alt="local image" loading="lazy"/></a><br/>
|
||||||
<a href="/user/repo/media/branch/main/sub/folder/path/file" target="_blank" rel="nofollow noopener"><img src="/user/repo/media/branch/main/sub/folder/path/file" alt="local image"/></a><br/>
|
<a href="/user/repo/media/branch/main/sub/folder/path/file" target="_blank" rel="nofollow noopener"><img src="/user/repo/media/branch/main/sub/folder/path/file" alt="local image" loading="lazy"/></a><br/>
|
||||||
<a href="https://example.com/image.jpg" target="_blank" rel="nofollow noopener"><img src="https://example.com/image.jpg" alt="remote image"/></a><br/>
|
<a href="https://example.com/image.jpg" target="_blank" rel="nofollow noopener"><img src="https://example.com/image.jpg" alt="remote image" loading="lazy"/></a><br/>
|
||||||
<a href="/user/repo/media/branch/main/sub/folder/image.jpg" rel="nofollow"><img src="/user/repo/media/branch/main/sub/folder/image.jpg" title="local image" alt=""/></a><br/>
|
<a href="/user/repo/media/branch/main/sub/folder/image.jpg" rel="nofollow"><img src="/user/repo/media/branch/main/sub/folder/image.jpg" title="local image" alt=""/></a><br/>
|
||||||
<a href="https://example.com/image.jpg" rel="nofollow"><img src="https://example.com/image.jpg" title="remote link" alt=""/></a><br/>
|
<a href="https://example.com/image.jpg" rel="nofollow"><img src="https://example.com/image.jpg" title="remote link" alt=""/></a><br/>
|
||||||
<a href="https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash" rel="nofollow">https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash</a><br/>
|
<a href="https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash" rel="nofollow">https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash</a><br/>
|
||||||
|
@ -1170,10 +1170,10 @@ space</p>
|
||||||
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
||||||
<a href="/relative/path/wiki/file.bin" rel="nofollow">local link</a><br/>
|
<a href="/relative/path/wiki/file.bin" rel="nofollow">local link</a><br/>
|
||||||
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
<a href="https://example.com" rel="nofollow">remote link</a><br/>
|
||||||
<a href="/relative/path/wiki/raw/image.jpg" target="_blank" rel="nofollow noopener"><img src="/relative/path/wiki/raw/image.jpg" alt="local image"/></a><br/>
|
<a href="/relative/path/wiki/raw/image.jpg" target="_blank" rel="nofollow noopener"><img src="/relative/path/wiki/raw/image.jpg" alt="local image" loading="lazy"/></a><br/>
|
||||||
<a href="/relative/path/wiki/raw/path/file" target="_blank" rel="nofollow noopener"><img src="/relative/path/wiki/raw/path/file" alt="local image"/></a><br/>
|
<a href="/relative/path/wiki/raw/path/file" target="_blank" rel="nofollow noopener"><img src="/relative/path/wiki/raw/path/file" alt="local image" loading="lazy"/></a><br/>
|
||||||
<a href="/relative/path/wiki/raw/path/file" target="_blank" rel="nofollow noopener"><img src="/relative/path/wiki/raw/path/file" alt="local image"/></a><br/>
|
<a href="/relative/path/wiki/raw/path/file" target="_blank" rel="nofollow noopener"><img src="/relative/path/wiki/raw/path/file" alt="local image" loading="lazy"/></a><br/>
|
||||||
<a href="https://example.com/image.jpg" target="_blank" rel="nofollow noopener"><img src="https://example.com/image.jpg" alt="remote image"/></a><br/>
|
<a href="https://example.com/image.jpg" target="_blank" rel="nofollow noopener"><img src="https://example.com/image.jpg" alt="remote image" loading="lazy"/></a><br/>
|
||||||
<a href="/relative/path/wiki/raw/image.jpg" rel="nofollow"><img src="/relative/path/wiki/raw/image.jpg" title="local image" alt=""/></a><br/>
|
<a href="/relative/path/wiki/raw/image.jpg" rel="nofollow"><img src="/relative/path/wiki/raw/image.jpg" title="local image" alt=""/></a><br/>
|
||||||
<a href="https://example.com/image.jpg" rel="nofollow"><img src="https://example.com/image.jpg" title="remote link" alt=""/></a><br/>
|
<a href="https://example.com/image.jpg" rel="nofollow"><img src="https://example.com/image.jpg" title="remote link" alt=""/></a><br/>
|
||||||
<a href="https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash" rel="nofollow">https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash</a><br/>
|
<a href="https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash" rel="nofollow">https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash</a><br/>
|
||||||
|
|
|
@ -44,6 +44,7 @@ func (g *ASTTransformer) transformImage(ctx *markup.RenderContext, v *ast.Image)
|
||||||
for _, attr := range v.Attributes() {
|
for _, attr := range v.Attributes() {
|
||||||
image.SetAttribute(attr.Name, attr.Value)
|
image.SetAttribute(attr.Name, attr.Value)
|
||||||
}
|
}
|
||||||
|
image.SetAttributeString("loading", []byte("lazy"))
|
||||||
for child := v.FirstChild(); child != nil; {
|
for child := v.FirstChild(); child != nil; {
|
||||||
next := child.NextSibling()
|
next := child.NextSibling()
|
||||||
image.AppendChild(image, child)
|
image.AppendChild(image, child)
|
||||||
|
|
|
@ -108,6 +108,9 @@ func createDefaultPolicy() *bluemonday.Policy {
|
||||||
// Allow classes for emojis
|
// Allow classes for emojis
|
||||||
policy.AllowAttrs("class").Matching(regexp.MustCompile(`^emoji$`)).OnElements("img")
|
policy.AllowAttrs("class").Matching(regexp.MustCompile(`^emoji$`)).OnElements("img")
|
||||||
|
|
||||||
|
// Allow attributes for images
|
||||||
|
policy.AllowAttrs("loading").Matching(regexp.MustCompile(`^lazy$`)).OnElements("img")
|
||||||
|
|
||||||
// Allow icons, emojis, chroma syntax and keyword markup on span
|
// Allow icons, emojis, chroma syntax and keyword markup on span
|
||||||
policy.AllowAttrs("class").Matching(regexp.MustCompile(`^((icon(\s+[\p{L}\p{N}_-]+)+)|(emoji)|(language-math display)|(language-math inline))$|^([a-z][a-z0-9]{0,2})$|^` + keywordClass + `$`)).OnElements("span")
|
policy.AllowAttrs("class").Matching(regexp.MustCompile(`^((icon(\s+[\p{L}\p{N}_-]+)+)|(emoji)|(language-math display)|(language-math inline))$|^([a-z][a-z0-9]{0,2})$|^` + keywordClass + `$`)).OnElements("span")
|
||||||
policy.AllowAttrs("data-alias").Matching(regexp.MustCompile(`^[a-zA-Z0-9-_+]+$`)).OnElements("span")
|
policy.AllowAttrs("data-alias").Matching(regexp.MustCompile(`^[a-zA-Z0-9-_+]+$`)).OnElements("span")
|
||||||
|
|
|
@ -75,6 +75,10 @@ func Test_Sanitizer(t *testing.T) {
|
||||||
// Emoji
|
// Emoji
|
||||||
`<span class="emoji" aria-label="thumbs up" data-alias="+1">THUMBS UP</span>`, `<span class="emoji" aria-label="thumbs up" data-alias="+1">THUMBS UP</span>`,
|
`<span class="emoji" aria-label="thumbs up" data-alias="+1">THUMBS UP</span>`, `<span class="emoji" aria-label="thumbs up" data-alias="+1">THUMBS UP</span>`,
|
||||||
`<span class="emoji" aria-label="thumbs up" data-alias="(+!)">THUMBS UP</span>`, `<span class="emoji" aria-label="thumbs up">THUMBS UP</span>`,
|
`<span class="emoji" aria-label="thumbs up" data-alias="(+!)">THUMBS UP</span>`, `<span class="emoji" aria-label="thumbs up">THUMBS UP</span>`,
|
||||||
|
|
||||||
|
// Images lazy loading
|
||||||
|
`<img src="/image1" alt="image1" loading="lazy">`, `<img src="/image1" alt="image1" loading="lazy">`,
|
||||||
|
`<img src="/image1" alt="image1" loading="eager">`, `<img src="/image1" alt="image1">`,
|
||||||
}
|
}
|
||||||
|
|
||||||
for i := 0; i < len(testCases); i += 2 {
|
for i := 0; i < len(testCases); i += 2 {
|
||||||
|
|
|
@ -46,7 +46,7 @@ var (
|
||||||
// https://www.debian.org/doc/debian-policy/ch-controlfields.html#source
|
// https://www.debian.org/doc/debian-policy/ch-controlfields.html#source
|
||||||
namePattern = regexp.MustCompile(`\A[a-z0-9][a-z0-9+-.]+\z`)
|
namePattern = regexp.MustCompile(`\A[a-z0-9][a-z0-9+-.]+\z`)
|
||||||
// https://www.debian.org/doc/debian-policy/ch-controlfields.html#version
|
// https://www.debian.org/doc/debian-policy/ch-controlfields.html#version
|
||||||
versionPattern = regexp.MustCompile(`\A(?:[0-9]:)?[a-zA-Z0-9.+~]+(?:-[a-zA-Z0-9.+-~]+)?\z`)
|
versionPattern = regexp.MustCompile(`\A(?:[1-9]?[0-9]:)?[a-zA-Z0-9.+~]+(?:-[a-zA-Z0-9.+-~]+)?\z`)
|
||||||
)
|
)
|
||||||
|
|
||||||
type Package struct {
|
type Package struct {
|
||||||
|
|
|
@ -167,6 +167,14 @@ func TestParseControlFile(t *testing.T) {
|
||||||
require.ErrorIs(t, err, ErrInvalidArchitecture)
|
require.ErrorIs(t, err, ErrInvalidArchitecture)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
t.Run("ValidVersionEpoch", func(t *testing.T) {
|
||||||
|
for _, version := range []string{"0:1.2.3-test", "1:1.2.3-test", "9:1.2.3-test", "10:1.2.3-test", "37:1.2.3-test", "99:1.2.3-test"} {
|
||||||
|
p, err := ParseControlFile(buildContent(packageName, version, packageArchitecture))
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.NotNil(t, p)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
t.Run("Valid", func(t *testing.T) {
|
t.Run("Valid", func(t *testing.T) {
|
||||||
content := buildContent(packageName, packageVersion, packageArchitecture)
|
content := buildContent(packageName, packageVersion, packageArchitecture)
|
||||||
full := content.String()
|
full := content.String()
|
||||||
|
|
|
@ -232,9 +232,10 @@ func getEntries(h *rpmutils.RpmHeader, namesTag, versionsTag, flagsTag int, repo
|
||||||
case "alt":
|
case "alt":
|
||||||
for i := range names {
|
for i := range names {
|
||||||
e := &Entry{
|
e := &Entry{
|
||||||
|
Name: names[i],
|
||||||
AltFlags: uint32(flags[i]),
|
AltFlags: uint32(flags[i]),
|
||||||
|
Version: versions[i],
|
||||||
}
|
}
|
||||||
e.Version = versions[i]
|
|
||||||
entries = append(entries, e)
|
entries = append(entries, e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,6 +35,7 @@ var (
|
||||||
PasswordHashAlgo string
|
PasswordHashAlgo string
|
||||||
PasswordCheckPwn bool
|
PasswordCheckPwn bool
|
||||||
SuccessfulTokensCacheSize int
|
SuccessfulTokensCacheSize int
|
||||||
|
DisableQueryAuthToken bool
|
||||||
CSRFCookieName = "_csrf"
|
CSRFCookieName = "_csrf"
|
||||||
CSRFCookieHTTPOnly = true
|
CSRFCookieHTTPOnly = true
|
||||||
)
|
)
|
||||||
|
@ -159,4 +160,14 @@ func loadSecurityFrom(rootCfg ConfigProvider) {
|
||||||
PasswordComplexity = append(PasswordComplexity, name)
|
PasswordComplexity = append(PasswordComplexity, name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sectionHasDisableQueryAuthToken := sec.HasKey("DISABLE_QUERY_AUTH_TOKEN")
|
||||||
|
|
||||||
|
// TODO: default value should be true in future releases
|
||||||
|
DisableQueryAuthToken = sec.Key("DISABLE_QUERY_AUTH_TOKEN").MustBool(false)
|
||||||
|
|
||||||
|
// warn if the setting is set to false explicitly
|
||||||
|
if sectionHasDisableQueryAuthToken && !DisableQueryAuthToken {
|
||||||
|
log.Warn("Enabling Query API Auth tokens is not recommended. DISABLE_QUERY_AUTH_TOKEN will be removed in Forgejo v13.0.0.")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,8 @@ import (
|
||||||
"forgejo.org/modules/json"
|
"forgejo.org/modules/json"
|
||||||
"forgejo.org/modules/log"
|
"forgejo.org/modules/log"
|
||||||
"forgejo.org/modules/util"
|
"forgejo.org/modules/util"
|
||||||
|
|
||||||
|
"github.com/caddyserver/certmagic"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Scheme describes protocol types
|
// Scheme describes protocol types
|
||||||
|
@ -206,7 +208,7 @@ func loadServerFrom(rootCfg ConfigProvider) {
|
||||||
EnableAcme = sec.Key("ENABLE_LETSENCRYPT").MustBool(false)
|
EnableAcme = sec.Key("ENABLE_LETSENCRYPT").MustBool(false)
|
||||||
}
|
}
|
||||||
if EnableAcme {
|
if EnableAcme {
|
||||||
AcmeURL = sec.Key("ACME_URL").MustString("")
|
AcmeURL = sec.Key("ACME_URL").MustString(certmagic.LetsEncryptProductionCA)
|
||||||
AcmeCARoot = sec.Key("ACME_CA_ROOT").MustString("")
|
AcmeCARoot = sec.Key("ACME_CA_ROOT").MustString("")
|
||||||
|
|
||||||
if sec.HasKey("ACME_ACCEPTTOS") {
|
if sec.HasKey("ACME_ACCEPTTOS") {
|
||||||
|
|
|
@ -76,8 +76,13 @@ var getBucketVersioning = func(ctx context.Context, minioClient *minio.Client, b
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var initializationTimeout = 30 * time.Second
|
||||||
|
|
||||||
// NewMinioStorage returns a minio storage
|
// NewMinioStorage returns a minio storage
|
||||||
func NewMinioStorage(ctx context.Context, cfg *setting.Storage) (ObjectStorage, error) {
|
func NewMinioStorage(ctx context.Context, cfg *setting.Storage) (ObjectStorage, error) {
|
||||||
|
initCtx, cancel := context.WithTimeout(ctx, initializationTimeout)
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
config := cfg.MinioConfig
|
config := cfg.MinioConfig
|
||||||
if config.ChecksumAlgorithm != "" && config.ChecksumAlgorithm != "default" && config.ChecksumAlgorithm != "md5" {
|
if config.ChecksumAlgorithm != "" && config.ChecksumAlgorithm != "default" && config.ChecksumAlgorithm != "md5" {
|
||||||
return nil, fmt.Errorf("invalid minio checksum algorithm: %s", config.ChecksumAlgorithm)
|
return nil, fmt.Errorf("invalid minio checksum algorithm: %s", config.ChecksumAlgorithm)
|
||||||
|
@ -112,7 +117,7 @@ func NewMinioStorage(ctx context.Context, cfg *setting.Storage) (ObjectStorage,
|
||||||
// Otherwise even if the request itself fails (403, 404, etc), the code should still continue because the parameters seem "good" enough.
|
// Otherwise even if the request itself fails (403, 404, etc), the code should still continue because the parameters seem "good" enough.
|
||||||
// Keep in mind that GetBucketVersioning requires "owner" to really succeed, so it can't be used to check the existence.
|
// Keep in mind that GetBucketVersioning requires "owner" to really succeed, so it can't be used to check the existence.
|
||||||
// Not using "BucketExists (HeadBucket)" because it doesn't include detailed failure reasons.
|
// Not using "BucketExists (HeadBucket)" because it doesn't include detailed failure reasons.
|
||||||
err = getBucketVersioning(ctx, minioClient, config.Bucket)
|
err = getBucketVersioning(initCtx, minioClient, config.Bucket)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errResp, ok := err.(minio.ErrorResponse)
|
errResp, ok := err.(minio.ErrorResponse)
|
||||||
if !ok {
|
if !ok {
|
||||||
|
@ -125,13 +130,13 @@ func NewMinioStorage(ctx context.Context, cfg *setting.Storage) (ObjectStorage,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check to see if we already own this bucket
|
// Check to see if we already own this bucket
|
||||||
exists, err := minioClient.BucketExists(ctx, config.Bucket)
|
exists, err := minioClient.BucketExists(initCtx, config.Bucket)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, convertMinioErr(err)
|
return nil, convertMinioErr(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !exists {
|
if !exists {
|
||||||
if err := minioClient.MakeBucket(ctx, config.Bucket, minio.MakeBucketOptions{
|
if err := minioClient.MakeBucket(initCtx, config.Bucket, minio.MakeBucketOptions{
|
||||||
Region: config.Location,
|
Region: config.Location,
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
return nil, convertMinioErr(err)
|
return nil, convertMinioErr(err)
|
||||||
|
|
|
@ -9,8 +9,10 @@ import (
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
"os"
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
"forgejo.org/modules/setting"
|
"forgejo.org/modules/setting"
|
||||||
|
"forgejo.org/modules/test"
|
||||||
|
|
||||||
"github.com/minio/minio-go/v7"
|
"github.com/minio/minio-go/v7"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
@ -217,3 +219,41 @@ func TestMinioCredentials(t *testing.T) {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestNewMinioStorageInitializationTimeout(t *testing.T) {
|
||||||
|
defer test.MockVariableValue(&getBucketVersioning, func(ctx context.Context, minioClient *minio.Client, bucket string) error {
|
||||||
|
select {
|
||||||
|
case <-ctx.Done():
|
||||||
|
return ctx.Err()
|
||||||
|
case <-time.After(1 * time.Millisecond):
|
||||||
|
return minio.ErrorResponse{
|
||||||
|
StatusCode: http.StatusBadRequest,
|
||||||
|
Code: "TestError",
|
||||||
|
Message: "Mocked error for testing",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})()
|
||||||
|
|
||||||
|
settings := &setting.Storage{
|
||||||
|
MinioConfig: setting.MinioStorageConfig{
|
||||||
|
Endpoint: "localhost",
|
||||||
|
AccessKeyID: "123456",
|
||||||
|
SecretAccessKey: "12345678",
|
||||||
|
Bucket: "bucket",
|
||||||
|
Location: "us-east-1",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify that we reach `getBucketVersioning` and return the error from our mock.
|
||||||
|
storage, err := NewMinioStorage(t.Context(), settings)
|
||||||
|
require.ErrorContains(t, err, "Mocked error for testing")
|
||||||
|
assert.Nil(t, storage)
|
||||||
|
|
||||||
|
defer test.MockVariableValue(&initializationTimeout, 1*time.Nanosecond)()
|
||||||
|
|
||||||
|
// Now that the timeout is super low, verify that we get a context deadline exceeded error from our mock.
|
||||||
|
storage, err = NewMinioStorage(t.Context(), settings)
|
||||||
|
require.Error(t, err)
|
||||||
|
require.ErrorIs(t, err, context.DeadlineExceeded, "err must be a context deadline exceeded error, but was %v", err)
|
||||||
|
assert.Nil(t, storage)
|
||||||
|
}
|
||||||
|
|
|
@ -22,6 +22,12 @@ type Attachment struct {
|
||||||
Type string `json:"type"`
|
Type string `json:"type"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WebAttachment the generic attachment with mime type
|
||||||
|
type WebAttachment struct {
|
||||||
|
*Attachment
|
||||||
|
MimeType string `json:"mime_type"`
|
||||||
|
}
|
||||||
|
|
||||||
// EditAttachmentOptions options for editing attachments
|
// EditAttachmentOptions options for editing attachments
|
||||||
// swagger:model
|
// swagger:model
|
||||||
type EditAttachmentOptions struct {
|
type EditAttachmentOptions struct {
|
||||||
|
|
|
@ -53,8 +53,7 @@ type CreateHookOption struct {
|
||||||
BranchFilter string `json:"branch_filter" binding:"GlobPattern"`
|
BranchFilter string `json:"branch_filter" binding:"GlobPattern"`
|
||||||
AuthorizationHeader string `json:"authorization_header"`
|
AuthorizationHeader string `json:"authorization_header"`
|
||||||
// default: false
|
// default: false
|
||||||
Active bool `json:"active"`
|
Active bool `json:"active"`
|
||||||
IsSystemWebhook bool `json:"is_system_webhook"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// EditHookOption options when modify one hook
|
// EditHookOption options when modify one hook
|
||||||
|
|
|
@ -192,8 +192,8 @@ func TestRenderMarkdownToHtml(t *testing.T) {
|
||||||
<a href="https://example.com" rel="nofollow">remote link</a>
|
<a href="https://example.com" rel="nofollow">remote link</a>
|
||||||
<a href="/src/file.bin" rel="nofollow">local link</a>
|
<a href="/src/file.bin" rel="nofollow">local link</a>
|
||||||
<a href="https://example.com" rel="nofollow">remote link</a>
|
<a href="https://example.com" rel="nofollow">remote link</a>
|
||||||
<a href="/image.jpg" target="_blank" rel="nofollow noopener"><img src="/image.jpg" alt="local image"/></a>
|
<a href="/image.jpg" target="_blank" rel="nofollow noopener"><img src="/image.jpg" alt="local image" loading="lazy"/></a>
|
||||||
<a href="https://example.com/image.jpg" target="_blank" rel="nofollow noopener"><img src="https://example.com/image.jpg" alt="remote image"/></a>
|
<a href="https://example.com/image.jpg" target="_blank" rel="nofollow noopener"><img src="https://example.com/image.jpg" alt="remote image" loading="lazy"/></a>
|
||||||
<a href="/image.jpg" rel="nofollow"><img src="/image.jpg" title="local image" alt=""/></a>
|
<a href="/image.jpg" rel="nofollow"><img src="/image.jpg" title="local image" alt=""/></a>
|
||||||
<a href="https://example.com/image.jpg" rel="nofollow"><img src="https://example.com/image.jpg" title="remote link" alt=""/></a>
|
<a href="https://example.com/image.jpg" rel="nofollow"><img src="https://example.com/image.jpg" title="remote link" alt=""/></a>
|
||||||
<a href="https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash" rel="nofollow"><code>88fc37a3c0...12fc37a3c0 (hash)</code></a>
|
<a href="https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash" rel="nofollow"><code>88fc37a3c0...12fc37a3c0 (hash)</code></a>
|
||||||
|
|
|
@ -3,7 +3,11 @@
|
||||||
|
|
||||||
package util
|
package util
|
||||||
|
|
||||||
import "testing"
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
func TestShellEscape(t *testing.T) {
|
func TestShellEscape(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
|
@ -79,13 +83,23 @@ func TestShellEscape(t *testing.T) {
|
||||||
"Single quotes don't need to escape except for '...",
|
"Single quotes don't need to escape except for '...",
|
||||||
"~/<gitea> ${gitea} `gitea` (gitea) !gitea! \"gitea\" \\gitea\\ 'gitea'",
|
"~/<gitea> ${gitea} `gitea` (gitea) !gitea! \"gitea\" \\gitea\\ 'gitea'",
|
||||||
"~/'<gitea> ${gitea} `gitea` (gitea) !gitea! \"gitea\" \\gitea\\ '\\''gitea'\\'",
|
"~/'<gitea> ${gitea} `gitea` (gitea) !gitea! \"gitea\" \\gitea\\ '\\''gitea'\\'",
|
||||||
|
}, {
|
||||||
|
"Inline command",
|
||||||
|
"some`echo foo`thing",
|
||||||
|
"\"some\\`echo foo\\`thing\"",
|
||||||
|
}, {
|
||||||
|
"Substitution",
|
||||||
|
`;${HOME}`,
|
||||||
|
`";\${HOME}"`,
|
||||||
|
}, {
|
||||||
|
"ANSI Escape codes (not escaped)",
|
||||||
|
"\033[31;1;4mHello\033[0m",
|
||||||
|
"\"\x1b[31;1;4mHello\x1b[0m\"",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
if got := ShellEscape(tt.toEscape); got != tt.want {
|
assert.Equal(t, tt.want, ShellEscape(tt.toEscape))
|
||||||
t.Errorf("ShellEscape(%q):\nGot: %s\nWanted: %s", tt.toEscape, got, tt.want)
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -95,3 +95,25 @@ func UnsafeBytesToString(b []byte) string {
|
||||||
func UnsafeStringToBytes(s string) []byte {
|
func UnsafeStringToBytes(s string) []byte {
|
||||||
return unsafe.Slice(unsafe.StringData(s), len(s))
|
return unsafe.Slice(unsafe.StringData(s), len(s))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// AsciiEqualFold is taken from Golang, but reimplemented here, since the original is not exposed to public
|
||||||
|
// Taken from: https://cs.opensource.google/go/go/+/refs/tags/go1.24.4:src/net/http/internal/ascii/print.go
|
||||||
|
func ASCIIEqualFold(s, t string) bool {
|
||||||
|
if len(s) != len(t) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
for i := 0; i < len(s); i++ {
|
||||||
|
if ASCIILower(s[i]) != ASCIILower(t[i]) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// AsciiLower returns the ASCII lowercase version of b.
|
||||||
|
func ASCIILower(b byte) byte {
|
||||||
|
if 'A' <= b && b <= 'Z' {
|
||||||
|
return b + ('a' - 'A')
|
||||||
|
}
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
|
@ -45,3 +45,29 @@ func TestToSnakeCase(t *testing.T) {
|
||||||
assert.Equal(t, expected, ToSnakeCase(input))
|
assert.Equal(t, expected, ToSnakeCase(input))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestASCIIEqualFold(t *testing.T) {
|
||||||
|
cases := map[string]struct {
|
||||||
|
First string
|
||||||
|
Second string
|
||||||
|
Expected bool
|
||||||
|
}{
|
||||||
|
"Empty String": {First: "", Second: "", Expected: true},
|
||||||
|
"Single Letter Ident": {First: "h", Second: "h", Expected: true},
|
||||||
|
"Single Letter Equal": {First: "h", Second: "H", Expected: true},
|
||||||
|
"Single Letter Unequal": {First: "h", Second: "g", Expected: false},
|
||||||
|
"Simple Match Ident": {First: "someString", Second: "someString", Expected: true},
|
||||||
|
"Simple Match Equal": {First: "someString", Second: "someSTRIng", Expected: true},
|
||||||
|
"Simple Match Unequal": {First: "someString", Second: "sameString", Expected: false},
|
||||||
|
"Different Length": {First: "abcdef", Second: "abcdefg", Expected: false},
|
||||||
|
"Unicode Kelvin": {First: "ghijklm", Second: "GHIJ\u212ALM", Expected: false},
|
||||||
|
}
|
||||||
|
|
||||||
|
for name := range cases {
|
||||||
|
c := cases[name]
|
||||||
|
t.Run(name, func(t *testing.T) {
|
||||||
|
Actual := ASCIIEqualFold(c.First, c.Second)
|
||||||
|
assert.Equal(t, c.Expected, Actual)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -72,16 +72,23 @@ func validateEmailBasic(email string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func validateEmailDomain(email string) error {
|
func validateEmailDomain(email string) error {
|
||||||
if !IsEmailDomainAllowed(email) {
|
if _, ok := IsEmailDomainAllowed(email); !ok {
|
||||||
return ErrEmailInvalid{email}
|
return ErrEmailInvalid{email}
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func IsEmailDomainAllowed(email string) bool {
|
func IsEmailDomainAllowed(email string) (validEmail, ok bool) {
|
||||||
return isEmailDomainAllowedInternal(
|
// Normalized the address. This strips for example comments which could be
|
||||||
email,
|
// used to smuggle a different domain
|
||||||
|
parsedAddress, err := mail.ParseAddress(email)
|
||||||
|
if err != nil {
|
||||||
|
return false, false
|
||||||
|
}
|
||||||
|
|
||||||
|
return true, isEmailDomainAllowedInternal(
|
||||||
|
parsedAddress.Address,
|
||||||
setting.Service.EmailDomainAllowList,
|
setting.Service.EmailDomainAllowList,
|
||||||
setting.Service.EmailDomainBlockList)
|
setting.Service.EmailDomainBlockList)
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,8 +67,3 @@ func TestEmailAddressValidate(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestEmailDomainAllowList(t *testing.T) {
|
|
||||||
res := IsEmailDomainAllowed("someuser@localhost.localdomain")
|
|
||||||
assert.True(t, res)
|
|
||||||
}
|
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -7,10 +7,20 @@ sign_in = Увайсці
|
||||||
sign_in_or = або
|
sign_in_or = або
|
||||||
sign_out = Выйсці
|
sign_out = Выйсці
|
||||||
sign_up = Зарэгістравацца
|
sign_up = Зарэгістравацца
|
||||||
link_account = Звязаць Уліковы запіс
|
link_account = Звязаць уліковы запіс
|
||||||
register = Рэгістрацыя
|
register = Рэгістрацыя
|
||||||
version = Версія
|
version = Версія
|
||||||
powered_by = Працуе на ℅s
|
powered_by = Працуе на ℅s
|
||||||
page = Старонка
|
page = Старонка
|
||||||
home = Галоўная Старонка
|
home = Галоўная Старонка
|
||||||
sign_in_with_provider = Увайсці з %s
|
sign_in_with_provider = Увайсці з %s
|
||||||
|
template = Шаблон
|
||||||
|
language = Мова
|
||||||
|
notifications = Апавяшчэнні
|
||||||
|
create_new = Стварыць…
|
||||||
|
user_profile_and_more = Профіль і налады…
|
||||||
|
signed_in_as = Увайшоў як
|
||||||
|
enable_javascript = Гэты вэб-сайт патрабуе JavaScript.
|
||||||
|
toc = Змест
|
||||||
|
licenses = Ліцэнзіі
|
||||||
|
return_to_forgejo = Вярнуцца да Forgejo
|
|
@ -142,6 +142,8 @@ webauthn_error = Неуспешно прочитане на вашия ключ
|
||||||
webauthn_unsupported_browser = Вашият браузър в момента не поддържа WebAuthn.
|
webauthn_unsupported_browser = Вашият браузър в момента не поддържа WebAuthn.
|
||||||
webauthn_error_duplicated = Ключът за сигурност не е разрешен за тази заявка. Моля, уверете се, че ключът не е вече регистриран.
|
webauthn_error_duplicated = Ключът за сигурност не е разрешен за тази заявка. Моля, уверете се, че ключът не е вече регистриран.
|
||||||
|
|
||||||
|
tracked_time_summary = Обобщение на проследеното време въз основа на филтрите в списъка със задачи
|
||||||
|
|
||||||
[settings]
|
[settings]
|
||||||
ui = Тема
|
ui = Тема
|
||||||
delete_key = Премахване
|
delete_key = Премахване
|
||||||
|
@ -324,7 +326,7 @@ permissions_list = Разрешения:
|
||||||
edit_oauth2_application = Редактиране на OAuth2 приложение
|
edit_oauth2_application = Редактиране на OAuth2 приложение
|
||||||
remove_oauth2_application = Премахване на OAuth2 приложение
|
remove_oauth2_application = Премахване на OAuth2 приложение
|
||||||
twofa_recovery_tip = Ако загубите устройството си, ще можете да използвате ключ за еднократно възстановяване, за да си върнете достъпа до акаунта.
|
twofa_recovery_tip = Ако загубите устройството си, ще можете да използвате ключ за еднократно възстановяване, за да си върнете достъпа до акаунта.
|
||||||
visibility.private_tooltip = Видим само за членове на организации, в които участвате
|
visibility.private_tooltip = Видим само за участници в организации, в които участвате
|
||||||
quota.applies_to_user = Следните правила за квота се прилагат за вашия акаунт
|
quota.applies_to_user = Следните правила за квота се прилагат за вашия акаунт
|
||||||
quota.rule.no_limit = Неограничена
|
quota.rule.no_limit = Неограничена
|
||||||
hints = Подсказки
|
hints = Подсказки
|
||||||
|
@ -381,6 +383,20 @@ comment_type_group_lock = Състояние на заключване
|
||||||
can_not_add_email_activations_pending = Има чакаща активация, опитайте отново след няколко минути, ако искате да добавите нова ел. поща.
|
can_not_add_email_activations_pending = Има чакаща активация, опитайте отново след няколко минути, ако искате да добавите нова ел. поща.
|
||||||
storage_overview = Преглед на съхранението
|
storage_overview = Преглед на съхранението
|
||||||
|
|
||||||
|
webauthn = Двуфакторно удостоверяване (Ключове за сигурност)
|
||||||
|
quota.sizes.all = Всички
|
||||||
|
quota.sizes.repos.all = Хранилища
|
||||||
|
quota.sizes.repos.public = Публични хранилища
|
||||||
|
quota.sizes.repos.private = Частни хранилища
|
||||||
|
quota.sizes.git.all = Git съдържание
|
||||||
|
quota.sizes.git.lfs = Git LFS
|
||||||
|
quota.sizes.assets.attachments.all = Прикачени файлове
|
||||||
|
quota.sizes.assets.attachments.issues = Прикачени файлове към задачи
|
||||||
|
quota.sizes.assets.attachments.releases = Прикачени файлове към издания
|
||||||
|
quota.sizes.assets.artifacts = Артефакти
|
||||||
|
quota.sizes.assets.packages.all = Пакети
|
||||||
|
quota.sizes.wiki = Уики
|
||||||
|
|
||||||
[packages]
|
[packages]
|
||||||
container.labels.value = Стойност
|
container.labels.value = Стойност
|
||||||
alpine.repository.repositories = Хранилища
|
alpine.repository.repositories = Хранилища
|
||||||
|
@ -439,6 +455,113 @@ arch.version.conflicts = В конфликт
|
||||||
alpine.repository.branches = Клонове
|
alpine.repository.branches = Клонове
|
||||||
arch.pacman.repo.multi.item = Конфигурация за %s
|
arch.pacman.repo.multi.item = Конфигурация за %s
|
||||||
|
|
||||||
|
desc = Управление на пакетите на хранилището.
|
||||||
|
alpine.registry = Настройте този регистър, като добавите URL адреса във вашия файл <code>/etc/apk/repositories</code>:
|
||||||
|
alpine.registry.key = Изтеглете публичния RSA ключ на регистъра в папката <code>/etc/apk/keys/</code>, за да проверите подписа на индекса:
|
||||||
|
alpine.registry.info = Изберете $branch и $repository от списъка по-долу.
|
||||||
|
alpine.install = За да инсталирате пакета, изпълнете следната команда:
|
||||||
|
arch.version.properties = Свойства на версията
|
||||||
|
arch.version.makedepends = Зависимости за изграждането
|
||||||
|
arch.version.checkdepends = Зависимости за проверката
|
||||||
|
chef.registry = Настройте този регистър във вашия файл <code>~/.chef/config.rb</code>:
|
||||||
|
chef.install = За да инсталирате пакета, изпълнете следната команда:
|
||||||
|
composer.registry = Настройте този регистър във вашия файл <code>~/.composer/config.json</code>:
|
||||||
|
composer.install = За да инсталирате пакета с Composer, изпълнете следната команда:
|
||||||
|
composer.dependencies = Зависимости
|
||||||
|
conan.details.repository = Хранилище
|
||||||
|
conan.registry = Настройте този регистър от командния ред:
|
||||||
|
conan.install = За да инсталирате пакета с Conan, изпълнете следната команда:
|
||||||
|
conda.registry = Настройте този регистър като Conda хранилище във вашия файл <code>.condarc</code>:
|
||||||
|
conda.install = За да инсталирате пакета с Conda, изпълнете следната команда:
|
||||||
|
container.pull = Издърпайте образа от командния ред:
|
||||||
|
container.multi_arch = ОС / Архитектура
|
||||||
|
container.layers = Слоеве на образа
|
||||||
|
cran.registry = Настройте този регистър във вашия файл <code>Rprofile.site</code>:
|
||||||
|
cran.install = За да инсталирате пакета, изпълнете следната команда:
|
||||||
|
debian.registry = Настройте този регистър от командния ред:
|
||||||
|
debian.registry.info = Изберете $distribution и $component от списъка по-долу.
|
||||||
|
debian.install = За да инсталирате пакета, изпълнете следната команда:
|
||||||
|
debian.repository = Информация за хранилището
|
||||||
|
debian.repository.distributions = Дистрибуции
|
||||||
|
debian.repository.components = Компоненти
|
||||||
|
debian.repository.architectures = Архитектури
|
||||||
|
helm.registry = Настройте този регистър от командния ред:
|
||||||
|
helm.install = За да инсталирате пакета, изпълнете следната команда:
|
||||||
|
maven.registry = Настройте този регистър във файла на вашия проект <code>pom.xml</code>:
|
||||||
|
maven.install = За да използвате пакета, включете следното в блока <code>dependencies</code> във файла <code>pom.xml</code>:
|
||||||
|
maven.install2 = Изпълнете през командния ред:
|
||||||
|
maven.download = За да изтеглите зависимостта, изпълнете през командния ред:
|
||||||
|
nuget.registry = Настройте този регистър от командния ред:
|
||||||
|
nuget.install = За да инсталирате пакета с NuGet, изпълнете следната команда:
|
||||||
|
nuget.dependency.framework = Целева платформа
|
||||||
|
npm.registry = Настройте този регистър във файла на вашия проект <code>.npmrc</code>:
|
||||||
|
npm.install = За да инсталирате пакета с npm, изпълнете следната команда:
|
||||||
|
npm.install2 = или го добавете във файла package.json:
|
||||||
|
npm.dependencies.optional = Опционални зависимости
|
||||||
|
npm.details.tag = Маркер
|
||||||
|
pub.install = За да инсталирате пакета с Dart, изпълнете следната команда:
|
||||||
|
pypi.requires = Изисква Python
|
||||||
|
pypi.install = За да инсталирате пакета с pip, изпълнете следната команда:
|
||||||
|
rpm.registry = Настройте този регистър от командния ред:
|
||||||
|
rpm.distros.redhat = на дистрибуции, базирани на RedHat
|
||||||
|
rpm.distros.suse = на дистрибуции, базирани на SUSE
|
||||||
|
rpm.install = За да инсталирате пакета, изпълнете следната команда:
|
||||||
|
rpm.repository = Информация за хранилището
|
||||||
|
rpm.repository.architectures = Архитектури
|
||||||
|
rpm.repository.multiple_groups = Този пакет е наличен в няколко групи.
|
||||||
|
alt.registry = Настройте този регистър от командния ред:
|
||||||
|
alt.registry.install = За да инсталирате пакета, изпълнете следната команда:
|
||||||
|
alt.install = Инсталиране на пакет
|
||||||
|
alt.setup = Добавете хранилище към списъка със свързани хранилища (изберете необходимата архитектура вместо „_arch_“):
|
||||||
|
alt.repository = Информация за хранилището
|
||||||
|
alt.repository.architectures = Архитектури
|
||||||
|
alt.repository.multiple_groups = Този пакет е наличен в няколко групи.
|
||||||
|
swift.registry = Настройте този регистър от командния ред:
|
||||||
|
swift.install = Добавете пакета във вашия файл <code>Package.swift</code>:
|
||||||
|
swift.install2 = и изпълнете следната команда:
|
||||||
|
vagrant.install = За да добавите Vagrant box, изпълнете следната команда:
|
||||||
|
settings.link = Свързване на този пакет с хранилище
|
||||||
|
settings.link.description = Ако свържете пакет с хранилище, пакетът се изброява в списъка с пакети на хранилището.
|
||||||
|
settings.link.select = Изберете хранилище
|
||||||
|
settings.link.button = Обновяване на връзката на хранилището
|
||||||
|
settings.link.success = Връзката на хранилището беше успешно обновена.
|
||||||
|
settings.link.error = Неуспешно обновяване на връзката на хранилището.
|
||||||
|
settings.delete.description = Изтриването на пакет е трайно и не може да бъде отменено.
|
||||||
|
settings.delete.notice = На път сте да изтриете %s (%s). Тази операция е необратима, сигурни ли сте?
|
||||||
|
owner.settings.cargo.title = Индекс на регистъра на Cargo
|
||||||
|
owner.settings.cargo.initialize = Инициализиране на индекс
|
||||||
|
owner.settings.cargo.initialize.description = Необходимо е специално Git хранилище за индекс, за да се използва регистърът на Cargo. Използването на тази опция ще (пре)създаде хранилището и ще го конфигурира автоматично.
|
||||||
|
owner.settings.cargo.initialize.error = Неуспешно инициализиране на индекса на Cargo: %v
|
||||||
|
owner.settings.cargo.initialize.success = Индексът на Cargo беше успешно създаден.
|
||||||
|
owner.settings.cargo.rebuild = Преизграждане на индекс
|
||||||
|
owner.settings.cargo.rebuild.description = Преизграждането може да бъде полезно, ако индексът не е синхронизиран със съхранените Cargo пакети.
|
||||||
|
owner.settings.cargo.rebuild.error = Неуспешно преизграждане на индекса на Cargo: %v
|
||||||
|
owner.settings.cargo.rebuild.success = Индексът на Cargo беше успешно преизграден.
|
||||||
|
owner.settings.cargo.rebuild.no_index = Не може да се преизгради, няма инициализиран индекс.
|
||||||
|
owner.settings.cleanuprules.title = Правила за почистване
|
||||||
|
owner.settings.cleanuprules.add = Добавяне на правило за почистване
|
||||||
|
owner.settings.cleanuprules.edit = Редактиране на правилото за почистване
|
||||||
|
owner.settings.cleanuprules.none = Все още няма правила за почистване.
|
||||||
|
owner.settings.cleanuprules.preview = Преглед на правило за почистване
|
||||||
|
owner.settings.cleanuprules.preview.overview = %d пакета са насрочени за премахване.
|
||||||
|
owner.settings.cleanuprules.preview.none = Правилото за почистване не съвпада с нито един пакет.
|
||||||
|
owner.settings.cleanuprules.enabled = Включено
|
||||||
|
owner.settings.cleanuprules.pattern_full_match = Прилагане на шаблона към пълното име на пакета
|
||||||
|
owner.settings.cleanuprules.keep.title = Версиите, които съответстват на тези правила, се запазват, дори ако съответстват на правило за премахване по-долу.
|
||||||
|
owner.settings.cleanuprules.keep.count = Запазване на най-новите
|
||||||
|
owner.settings.cleanuprules.keep.count.1 = 1 версия на пакет
|
||||||
|
owner.settings.cleanuprules.keep.count.n = %d версии на пакет
|
||||||
|
owner.settings.cleanuprules.keep.pattern = Запазване на версии, съответстващи на
|
||||||
|
owner.settings.cleanuprules.keep.pattern.container = Версията <code>latest</code> винаги се запазва за Container пакети.
|
||||||
|
owner.settings.cleanuprules.remove.title = Версиите, които съответстват на тези правила, се премахват, освен ако правило по-горе не казва да се запазят.
|
||||||
|
owner.settings.cleanuprules.remove.days = Премахване на версии, по-стари от
|
||||||
|
owner.settings.cleanuprules.remove.pattern = Премахване на версии, съответстващи на
|
||||||
|
owner.settings.cleanuprules.success.update = Правилото за почистване е обновено.
|
||||||
|
owner.settings.cleanuprules.success.delete = Правилото за почистване е изтрито.
|
||||||
|
owner.settings.chef.title = Регистър на Chef
|
||||||
|
owner.settings.chef.keypair = Генериране на двойка ключове
|
||||||
|
owner.settings.chef.keypair.description = Заявките, изпратени до регистъра на Chef, трябва да бъдат криптографски подписани като средство за удостоверяване. При генериране на двойка ключове, само публичният ключ се съхранява във Forgejo. Частният ключ ви се предоставя, за да се използва с knife. Генерирането на нова двойка ключове ще презапише предишната.
|
||||||
|
|
||||||
[tool]
|
[tool]
|
||||||
hours = %d часа
|
hours = %d часа
|
||||||
now = сега
|
now = сега
|
||||||
|
@ -749,7 +872,7 @@ settings.admin_settings = Администраторски настройки
|
||||||
issues.role.owner = Притежател
|
issues.role.owner = Притежател
|
||||||
settings.transfer.title = Прехвърляне на притежанието
|
settings.transfer.title = Прехвърляне на притежанието
|
||||||
issues.author = Автор
|
issues.author = Автор
|
||||||
issues.closed_at = `затвори тази задача <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.closed_at = `затвори тази задача %s`
|
||||||
settings.collaborator_deletion_desc = Премахването на сътрудник ще отнеме достъпа му до това хранилище. Продължаване?
|
settings.collaborator_deletion_desc = Премахването на сътрудник ще отнеме достъпа му до това хранилище. Продължаване?
|
||||||
commits.message = Съобщение
|
commits.message = Съобщение
|
||||||
issues.due_date_not_set = Няма зададен краен срок.
|
issues.due_date_not_set = Няма зададен краен срок.
|
||||||
|
@ -773,9 +896,9 @@ issues.filter_type.all_issues = Всички задачи
|
||||||
issues.filter_poster_no_select = Всички автори
|
issues.filter_poster_no_select = Всички автори
|
||||||
issues.opened_by = отворена %[1]s от <a href="%[2]s">%[3]s</a>
|
issues.opened_by = отворена %[1]s от <a href="%[2]s">%[3]s</a>
|
||||||
issues.action_open = Отваряне
|
issues.action_open = Отваряне
|
||||||
pulls.closed_at = `затвори тази заявка за сливане <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
pulls.closed_at = `затвори тази заявка за сливане %s`
|
||||||
pulls.reopened_at = `отвори наново тази заявка за сливане <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
pulls.reopened_at = `отвори наново тази заявка за сливане %s`
|
||||||
issues.reopened_at = `отвори наново тази задача <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.reopened_at = `отвори наново тази задача %s`
|
||||||
projects.column.edit = Редактиране на колоната
|
projects.column.edit = Редактиране на колоната
|
||||||
issues.close = Затваряне на задачата
|
issues.close = Затваряне на задачата
|
||||||
issues.ref_reopened_from = `<a href="%[3]s">отвори наново тази задача %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.ref_reopened_from = `<a href="%[3]s">отвори наново тази задача %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||||
|
@ -940,9 +1063,9 @@ editor.no_changes_to_show = Няма промени за показване.
|
||||||
issues.choose.get_started = Първи стъпки
|
issues.choose.get_started = Първи стъпки
|
||||||
issues.change_milestone_at = `промени етапа от <b>%s</b> на <b>%s</b> %s`
|
issues.change_milestone_at = `промени етапа от <b>%s</b> на <b>%s</b> %s`
|
||||||
issues.change_project_at = `промени проекта от <b>%s</b> на <b>%s</b> %s`
|
issues.change_project_at = `промени проекта от <b>%s</b> на <b>%s</b> %s`
|
||||||
issues.self_assign_at = `си само-възложи това %s`
|
issues.self_assign_at = `си самовъзложи това %s`
|
||||||
issues.remove_assignee_at = `е премахнат като изпълнител от <b>%s</b> %s`
|
issues.remove_assignee_at = `е премахнат като изпълнител от <b>%s</b> %s`
|
||||||
issues.remove_self_assignment = `се само-премахна като изпълнител %s`
|
issues.remove_self_assignment = `се самопремахна като изпълнител %s`
|
||||||
issues.add_assignee_at = `му бе възложено това от <b>%s</b> %s`
|
issues.add_assignee_at = `му бе възложено това от <b>%s</b> %s`
|
||||||
pulls.merged_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_fake = от %[2]s бе слята %[1]s
|
||||||
|
@ -1205,7 +1328,7 @@ issues.dependency.cancel = Отказ
|
||||||
issues.dependency.add_error_dep_exists = Зависимостта вече съществува.
|
issues.dependency.add_error_dep_exists = Зависимостта вече съществува.
|
||||||
issues.dependency.add_error_dep_not_exist = Зависимостта не съществува.
|
issues.dependency.add_error_dep_not_exist = Зависимостта не съществува.
|
||||||
issues.remove_ref_at = `премахна препратката <b>%s</b> %s`
|
issues.remove_ref_at = `премахна препратката <b>%s</b> %s`
|
||||||
issues.ref_pull_from = `<a href="%[3]s">спомена тази заявка за сливане %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.ref_pull_from = `<a href="%[2]s">спомена тази заявка за сливане %[3]s</a> %[1]s`
|
||||||
issues.dependency.pr_no_dependencies = Няма зададени зависимости.
|
issues.dependency.pr_no_dependencies = Няма зададени зависимости.
|
||||||
issues.dependency.remove_info = Премахване на тази зависимост
|
issues.dependency.remove_info = Премахване на тази зависимост
|
||||||
issues.dependency.removed_dependency = `премахна зависимостта %s`
|
issues.dependency.removed_dependency = `премахна зависимостта %s`
|
||||||
|
@ -1230,11 +1353,11 @@ issues.dependency.title = Зависимости
|
||||||
issues.dependency.issue_no_dependencies = Няма зададени зависимости.
|
issues.dependency.issue_no_dependencies = Няма зададени зависимости.
|
||||||
issues.dependency.pr_close_blocked = Трябва да затворите всички задачи, блокиращи тази заявка за сливане, преди да можете да я слеете.
|
issues.dependency.pr_close_blocked = Трябва да затворите всички задачи, блокиращи тази заявка за сливане, преди да можете да я слеете.
|
||||||
issues.dependency.pr_close_blocks = Тази заявка за сливане блокира затварянето на следните задачи
|
issues.dependency.pr_close_blocks = Тази заявка за сливане блокира затварянето на следните задачи
|
||||||
issues.ref_issue_from = `<a href="%[3]s">спомена тази задача %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.ref_issue_from = `<a href="%[2]s">спомена тази задача %[3]s</a> %[1]s`
|
||||||
issues.commit_ref_at = `спомена тази задача в подаване <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.commit_ref_at = `спомена тази задача в подаване %s`
|
||||||
issues.add_ref_at = `добави препратка <b>%s</b> %s`
|
issues.add_ref_at = `добави препратка <b>%s</b> %s`
|
||||||
pulls.merged_info_text = Клонът %s вече може да бъде изтрит.
|
pulls.merged_info_text = Клонът %s вече може да бъде изтрит.
|
||||||
pulls.commit_ref_at = `спомена тази заявка за сливане в подаване <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
pulls.commit_ref_at = `спомена тази заявка за сливане в подаване %s`
|
||||||
issues.change_ref_at = `промени препратката от <b><strike>%s</strike></b> на <b>%s</b> %s`
|
issues.change_ref_at = `промени препратката от <b><strike>%s</strike></b> на <b>%s</b> %s`
|
||||||
diff.review.reject = Поискване на промени
|
diff.review.reject = Поискване на промени
|
||||||
diff.bin_not_shown = Двоичният файл не е показан.
|
diff.bin_not_shown = Двоичният файл не е показан.
|
||||||
|
@ -1272,7 +1395,7 @@ issues.review.show_resolved = Показване на решено
|
||||||
issues.review.hide_resolved = Скриване на решено
|
issues.review.hide_resolved = Скриване на решено
|
||||||
issues.review.resolve_conversation = Решаване на обсъждането
|
issues.review.resolve_conversation = Решаване на обсъждането
|
||||||
diff.comment.markdown_info = Поддържа се стилизиране с Маркдаун.
|
diff.comment.markdown_info = Поддържа се стилизиране с Маркдаун.
|
||||||
diff.file_suppressed = Разликите не са показани, защото са твърде много
|
diff.file_suppressed = Разликите във файла са потиснати, защото са твърде много
|
||||||
pulls.reject_count_n = %d поискани промени
|
pulls.reject_count_n = %d поискани промени
|
||||||
settings.pulls.default_allow_edits_from_maintainers = Позволяване на редакции от поддържащите по подразбиране
|
settings.pulls.default_allow_edits_from_maintainers = Позволяване на редакции от поддържащите по подразбиране
|
||||||
fork_branch = Клон за клониране в разклонението
|
fork_branch = Клон за клониране в разклонението
|
||||||
|
@ -1299,9 +1422,9 @@ branch.create_new_branch = Създаване на клон от клон:
|
||||||
pulls.status_checks_show_all = Показване на всички проверки
|
pulls.status_checks_show_all = Показване на всички проверки
|
||||||
size_format = %[1]s: %[2]s; %[3]s: %[4]s
|
size_format = %[1]s: %[2]s; %[3]s: %[4]s
|
||||||
pulls.filter_changes_by_commit = Филтриране по подаване
|
pulls.filter_changes_by_commit = Филтриране по подаване
|
||||||
issues.ref_closing_from = `<a href="%[3]s">спомена тази задача в заявка за сливане %[4]s, която ще я затвори</a>, <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.ref_closing_from = `<a href="%[2]s">спомена тази задача в заявка за сливане %[3]s, която ще я затвори</a>, %[1]s`
|
||||||
issues.ref_from = `от %[1]s`
|
issues.ref_from = `от %[1]s`
|
||||||
issues.ref_reopening_from = `<a href="%[3]s">спомена тази задача в заявка за сливане %[4]s, която ще я отвори наново </a>, <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.ref_reopening_from = `<a href="%[2]s">спомена тази задача в заявка за сливане %[3]s, която ще я отвори наново </a>, %[1]s`
|
||||||
issues.draft_title = Чернова
|
issues.draft_title = Чернова
|
||||||
pulls.reopen_to_merge = Моля, отворете наново тази заявка за сливане, за да извършите сливане.
|
pulls.reopen_to_merge = Моля, отворете наново тази заявка за сливане, за да извършите сливане.
|
||||||
pulls.cant_reopen_deleted_branch = Тази заявка за сливане не може да бъде отворена наново, защото клонът е изтрит.
|
pulls.cant_reopen_deleted_branch = Тази заявка за сливане не може да бъде отворена наново, защото клонът е изтрит.
|
||||||
|
@ -1347,7 +1470,7 @@ settings.default_branch_desc = Изберете стандартен клон з
|
||||||
settings.transfer.button = Прехвърляне на притежанието
|
settings.transfer.button = Прехвърляне на притежанието
|
||||||
settings.transfer.modal.title = Прехвърляне на притежанието
|
settings.transfer.modal.title = Прехвърляне на притежанието
|
||||||
ambiguous_runes_line = `Този ред съдържа двусмислени Уникод знаци`
|
ambiguous_runes_line = `Този ред съдържа двусмислени Уникод знаци`
|
||||||
ambiguous_character = `%[1]c [U+%04[1]X] може да бъде объркан с %[2]c [U+%04[2]X]`
|
ambiguous_character = `%[1]c [U+%04[1]X] може да бъде объркан със %[2]c [U+%04[2]X]`
|
||||||
invisible_runes_header = `Този файл съдържа невидими Уникод знаци`
|
invisible_runes_header = `Този файл съдържа невидими Уникод знаци`
|
||||||
issues.all_title = Общо
|
issues.all_title = Общо
|
||||||
issues.new.assign_to_me = Възлагане на мен
|
issues.new.assign_to_me = Възлагане на мен
|
||||||
|
@ -1446,7 +1569,7 @@ generated_from = генерирано от
|
||||||
clear_ref = `Изчистване на текущата препратка`
|
clear_ref = `Изчистване на текущата препратка`
|
||||||
file_follow = Последване на символната връзка
|
file_follow = Последване на символната връзка
|
||||||
commitstatus.failure = Неуспех
|
commitstatus.failure = Неуспех
|
||||||
issues.filter_label_exclude = `Използвайте <code>alt</code> + <code>click/enter</code>, за да изключите етикети`
|
issues.filter_label_exclude = Използвайте <kbd>Alt</kbd> + <kbd>Click</kbd>, за да изключите етикети
|
||||||
migrate.migrating_failed = Мигрирането от <b>%s</b> е неуспешно.
|
migrate.migrating_failed = Мигрирането от <b>%s</b> е неуспешно.
|
||||||
migrate.migrating_issues = Мигриране на задачи
|
migrate.migrating_issues = Мигриране на задачи
|
||||||
mirror_from = огледално на
|
mirror_from = огледално на
|
||||||
|
@ -1576,6 +1699,178 @@ issues.force_push_compare = Сравняване
|
||||||
pulls.status_checking = Някои проверки са в очакване
|
pulls.status_checking = Някои проверки са в очакване
|
||||||
pulls.nothing_to_compare = Тези клонове са равни. Не е нужно да създавате заявка за сливане.
|
pulls.nothing_to_compare = Тези клонове са равни. Не е нужно да създавате заявка за сливане.
|
||||||
|
|
||||||
|
rss.must_be_on_branch = Трябва да сте на клон, за да имате RSS емисия.
|
||||||
|
admin.manage_flags = Управление на флаговете
|
||||||
|
admin.enabled_flags = Флагове, включени за хранилището:
|
||||||
|
admin.update_flags = Обновяване на флаговете
|
||||||
|
admin.failed_to_replace_flags = Неуспешна замяна на флаговете на хранилището
|
||||||
|
admin.flags_replaced = Флаговете на хранилището са заменени
|
||||||
|
fork_to_different_account = Разклоняване в друг акаунт
|
||||||
|
mirror_interval = Интервал на огледалото (валидни единици за време са „h“, „m“, „s“). 0 за изключване на периодичната синхронизация. (Минимален интервал: %s)
|
||||||
|
mirror_interval_invalid = Интервалът на огледалото не е валиден.
|
||||||
|
mirror_use_ssh.text = Използване на SSH удостоверяване
|
||||||
|
mirror_use_ssh.helper = Forgejo ще създаде огледало на хранилището чрез Git през SSH и ще генерира двойка ключове за вас, когато изберете тази опция. Трябва да се уверите, че генерираният публичен ключ е упълномощен да изтласква към целевото хранилище. Не можете да използвате удостоверяване, базирано на парола, когато избирате това.
|
||||||
|
mirror_use_ssh.not_available = SSH удостоверяването не е налично.
|
||||||
|
mirror_denied_combination = Не може да се използва удостоверяване с публичен ключ и парола едновременно.
|
||||||
|
mirror_sync_on_commit = Синхронизиране при изтласкване на подавания
|
||||||
|
mirror_address_desc = Поставете всички необходими данни за удостоверяване в секцията „Упълномощаване“.
|
||||||
|
mirror_address_url_invalid = Предоставеният URL е невалиден. Трябва да екранирате правилно всички компоненти на URL адреса.
|
||||||
|
mirror_address_protocol_invalid = Предоставеният URL е невалиден. Само http(s):// или git:// адреси могат да се използват за огледални хранилища.
|
||||||
|
mirror_lfs = Съхранение на големи файлове (LFS)
|
||||||
|
mirror_password_help = Променете потребителското име, за да изтриете запазена парола.
|
||||||
|
unit_disabled = Администраторът на сайта е изключил тази секция на хранилището.
|
||||||
|
summary_card_alt = Карта с обобщение на хранилище %s
|
||||||
|
template.items = Елементи на шаблона
|
||||||
|
template.git_content = Git съдържание (стандартен клон)
|
||||||
|
template.git_hooks = Git куки
|
||||||
|
template.git_hooks_tooltip = В момента не можете да променяте или премахвате Git куки, след като са добавени. Изберете това само ако се доверявате на шаблонното хранилище.
|
||||||
|
template.one_item = Трябва да изберете поне един елемент от шаблона
|
||||||
|
template.invalid = Трябва да изберете шаблонно хранилище
|
||||||
|
migrate.cancel_migrating_title = Отказ от миграцията
|
||||||
|
migrate.cancel_migrating_confirm = Искате ли да откажете тази миграция?
|
||||||
|
invisible_runes_description = `Този файл съдържа невидими Уникод знаци, които са неразличими за хората, но могат да бъдат обработени по различен начин от компютър. Ако смятате, че това е умишлено, можете спокойно да пренебрегнете това предупреждение. Използвайте бутона „Екраниране“, за да ги разкриете.`
|
||||||
|
ambiguous_runes_header = `Този файл съдържа двусмислени Уникод знаци`
|
||||||
|
ambiguous_runes_description = `Този файл съдържа Уникод знаци, които могат да бъдат объркани с други знаци. Ако смятате, че това е умишлено, можете спокойно да пренебрегнете това предупреждение. Използвайте бутона „Екраниране“, за да ги разкриете.`
|
||||||
|
file_copy_permalink = Копиране на постоянна връзка
|
||||||
|
view_git_blame = Преглед на git blame
|
||||||
|
video_not_supported_in_browser = Вашият браузър не поддържа HTML5 тага „video“.
|
||||||
|
audio_not_supported_in_browser = Вашият браузър не поддържа HTML5 тага „audio“.
|
||||||
|
stored_lfs = Съхранено с Git LFS
|
||||||
|
commit_graph.select = Изберете клонове
|
||||||
|
editor.cannot_edit_lfs_files = LFS файлове не могат да се редактират в уеб интерфейса.
|
||||||
|
editor.filename_help = Добавете директория, като въведете името ѝ, последвано от наклонена черта („/“). Премахнете директория, като натиснете backspace в началото на полето за въвеждане.
|
||||||
|
editor.commit_signed_changes = Подаване на подписани промени
|
||||||
|
editor.require_signed_commit = Клонът изисква подписано подаване
|
||||||
|
editor.commit_email = Ел. поща на подаването
|
||||||
|
commits.desc = Разглеждане на историята на промените в програмния код.
|
||||||
|
commits.search.tooltip = Можете да добавите префикс към ключовите думи с „author:“, „committer:“, „after:“ или „before:“, напр. „revert author:Alice before:2019-01-13“.
|
||||||
|
commits.signed_by = Подписано от
|
||||||
|
commits.signed_by_untrusted_user = Подписано от недоверен потребител
|
||||||
|
commits.signed_by_untrusted_user_unmatched = Подписано от недоверен потребител, който не съвпада с подаващия
|
||||||
|
commits.ssh_key_fingerprint = Отпечатък на SSH ключ
|
||||||
|
commits.view_single_diff = Преглед на промените в този файл, въведени в това подаване
|
||||||
|
commit.revert = Връщане
|
||||||
|
commit.revert-header = Връщане: %s
|
||||||
|
commit.revert-content = Изберете клон, върху който да се върне:
|
||||||
|
issues.desc = Организирайте доклади за грешки, задачи и етапи.
|
||||||
|
issues.choose.ignore_invalid_templates = Невалидните шаблони са игнорирани
|
||||||
|
issues.choose.invalid_config = Конфигурацията на задачите съдържа грешки:
|
||||||
|
issues.filter_type.all_pull_requests = Всички заявки за сливане
|
||||||
|
issues.role.member_helper = Този потребител е участник в организацията, притежаваща това хранилище.
|
||||||
|
issues.lock.unknown_reason = Не може да се заключи задача с неизвестна причина.
|
||||||
|
issues.lock_duplicate = Задача не може да бъде заключена два пъти.
|
||||||
|
issues.unlock_error = Не може да се отключи задача, която не е заключена.
|
||||||
|
issues.lock.notice_1 = - Други потребители не могат да добавят нови коментари към тази задача.
|
||||||
|
issues.lock.notice_2 = - Вие и други сътрудници с достъп до това хранилище все още можете да оставяте коментари, които другите да виждат.
|
||||||
|
issues.lock.notice_3 = - Винаги можете да отключите тази задача отново в бъдеще.
|
||||||
|
issues.unlock.notice_1 = - Всеки ще може отново да коментира тази задача.
|
||||||
|
issues.unlock.notice_2 = - Винаги можете да заключите тази задача отново в бъдеще.
|
||||||
|
issues.lock.title = Заключване на обсъждането по тази задача.
|
||||||
|
issues.unlock.title = Отключване на обсъждането по тази задача.
|
||||||
|
issues.comment_on_locked = Не можете да коментирате заключена задача.
|
||||||
|
issues.delete.text = Наистина ли искате да изтриете тази задача? (Това ще премахне трайно цялото съдържание. Помислете дали вместо това да не я затворите, ако възнамерявате да я запазите архивирана)
|
||||||
|
issues.cancel_tracking_history = `отмени проследяването на времето %s`
|
||||||
|
issues.add_time_sum_to_small = Не е въведено време.
|
||||||
|
issues.due_date_form = гггг-мм-дд
|
||||||
|
issues.due_date_invalid = Крайният срок е невалиден или извън обхвата. Моля, използвайте формата „гггг-мм-дд“.
|
||||||
|
issues.dependency.no_permission_1 = Нямате разрешение да прочетете %d зависимост
|
||||||
|
issues.dependency.no_permission_n = Нямате разрешение да прочетете %d зависимости
|
||||||
|
issues.dependency.no_permission.can_remove = Нямате разрешение да прочетете тази зависимост, но можете да я премахнете
|
||||||
|
issues.dependency.issue_batch_close_blocked = Не могат да бъдат затворени групово избраните задачи, защото задача #%d все още има отворени зависимости
|
||||||
|
issues.dependency.blocked_by_short = Зависи от
|
||||||
|
issues.dependency.setting = Включване на зависимости за задачи и заявки за сливане
|
||||||
|
issues.dependency.add_error_same_issue = Не можете да направите задача зависима от самата нея.
|
||||||
|
issues.dependency.add_error_dep_issue_not_exist = Зависимата задача не съществува.
|
||||||
|
issues.dependency.add_error_cannot_create_circular = Не можете да създадете зависимост с две задачи, които се блокират взаимно.
|
||||||
|
issues.dependency.add_error_dep_not_same_repo = И двете задачи трябва да са в едно и също хранилище.
|
||||||
|
issues.review.self.rejection = Не можете да поискате промени в собствената си заявка за сливане.
|
||||||
|
issues.review.dismissed = отхвърли рецензията на %s %s
|
||||||
|
issues.review.content.empty = Трябва да оставите коментар, посочващ исканите промени.
|
||||||
|
issues.review.add_review_requests = поиска рецензии от %[1]s %[2]s
|
||||||
|
issues.review.remove_review_request = премахна заявката за рецензия за %[1]s %[2]s
|
||||||
|
issues.review.remove_review_requests = премахна заявките за рецензия за %[1]s %[2]s
|
||||||
|
issues.review.remove_review_request_self = отказа да рецензира %s
|
||||||
|
issues.review.pending.tooltip = Този коментар в момента не е видим за други потребители. За да изпратите изчакващите си коментари, изберете „%s“ -> „%s/%s/%s“ в горната част на страницата.
|
||||||
|
issues.review.outdated = Остарял
|
||||||
|
issues.review.outdated_description = Съдържанието е променено, след като е направен този коментар
|
||||||
|
issues.review.show_outdated = Показване на остарели
|
||||||
|
issues.review.hide_outdated = Скриване на остарели
|
||||||
|
issues.content_history.options = Опции
|
||||||
|
issues.blocked_by_user = Не можете да създавате задачи в това хранилище, защото сте блокирани от притежателя на хранилището.
|
||||||
|
comment.blocked_by_user = Коментирането не е възможно, защото сте блокирани от притежателя на хранилището или от автора.
|
||||||
|
issues.reopen.blocked_by_user = Не можете да отворите наново тази задача, защото сте блокирани от притежателя на хранилището или от автора на тази задача.
|
||||||
|
compare.compare_base = основа
|
||||||
|
compare.compare_head = сравняване
|
||||||
|
pulls.desc = Включване на заявки за сливане и рецензии на код.
|
||||||
|
pulls.view = Преглед на заявката за сливане
|
||||||
|
pulls.allow_edits_from_maintainers_desc = Потребители с право на запис в основния клон могат също да изтласкват към този клон
|
||||||
|
pulls.allow_edits_from_maintainers_err = Обновяването е неуспешно
|
||||||
|
pulls.has_changed_since_last_review = Променено след последната ви рецензия
|
||||||
|
pulls.switch_comparison_type = Превключване на типа сравнение
|
||||||
|
pulls.filter_branch = Филтриране на клон
|
||||||
|
pulls.review_only_possible_for_full_diff = Рецензирането е възможно само при преглед на пълните разлики
|
||||||
|
pulls.wrong_commit_id = ID на подаването трябва да бъде ID на подаване в целевия клон
|
||||||
|
pulls.blocked_by_user = Не можете да създадете заявка за сливане в това хранилище, защото сте блокирани от притежателя на хранилището.
|
||||||
|
pulls.no_merge_desc = Тази заявка за сливане не може да бъде слята, защото всички опции за сливане в хранилището са изключени.
|
||||||
|
pulls.no_merge_helper = Включете опциите за сливане в настройките на хранилището или слейте заявката за сливане ръчно.
|
||||||
|
pulls.no_merge_wip = Тази заявка за сливане не може да бъде слята, защото е отбелязана като в процес на работа.
|
||||||
|
pulls.squash_merge_pull_request = Създаване на сплескано подаване
|
||||||
|
pulls.merge_manually = Ръчно слята
|
||||||
|
pulls.merge_commit_id = ID на подаването със сливане
|
||||||
|
pulls.require_signed_wont_sign = Клонът изисква подписани подавания, но това сливане няма да бъде подписано
|
||||||
|
pulls.merge_conflict = Сливането е неуспешно: Възникна конфликт по време на сливането. Подсказка: Опитайте различна стратегия
|
||||||
|
pulls.merge_conflict_summary = Съобщение за грешка
|
||||||
|
pulls.rebase_conflict_summary = Съобщение за грешка
|
||||||
|
pulls.has_merged = Неуспешно: Заявката за сливане е слята, не можете да слеете отново или да промените целевия клон.
|
||||||
|
pulls.push_rejected = Изтласкването е неуспешно: Изтласкването е отхвърлено. Прегледайте Git куките за това хранилище.
|
||||||
|
pulls.push_rejected_no_message = Изтласкването е неуспешно: Изтласкването е отхвърлено, но няма отдалечено съобщение. Прегледайте Git куките за това хранилище
|
||||||
|
pulls.update_not_allowed = Нямате разрешение да обновявате клона
|
||||||
|
pulls.outdated_with_base_branch = Този клон е остарял спрямо основния клон
|
||||||
|
pulls.cmd_instruction_merge_warning = <b>Предупреждение:</b> Настройката „Автоматично откриване на ръчно сливане“ не е включена за това хранилище, ще трябва да отбележите тази заявка за сливане като ръчно слята след това.
|
||||||
|
pulls.editable_explanation = Тази заявка за сливане позволява редакции от поддържащите. Можете да допринесете директно към нея.
|
||||||
|
pulls.auto_merge_button_when_succeed = (Когато проверките са успешни)
|
||||||
|
pulls.auto_merge_when_succeed = Автоматично сливане, когато всички проверки са успешни
|
||||||
|
pulls.auto_merge_newly_scheduled = Заявката за сливане е насрочена за сливане, когато всички проверки са успешни.
|
||||||
|
pulls.auto_merge_has_pending_schedule = %[1]s насрочи тази заявка за сливане за автоматично сливане, когато всички проверки са успешни %[2]s.
|
||||||
|
pulls.auto_merge_cancel_schedule = Отмяна на автоматичното сливане
|
||||||
|
pulls.auto_merge_not_scheduled = Тази заявка за сливане не е насрочена за автоматично сливане.
|
||||||
|
pulls.auto_merge_canceled_schedule = Автоматичното сливане е отменено за тази заявка за сливане.
|
||||||
|
pulls.auto_merge_newly_scheduled_comment = `насрочи тази заявка за сливане за автоматично сливане, когато всички проверки са успешни %[1]s`
|
||||||
|
pulls.auto_merge_canceled_schedule_comment = `отмени автоматичното сливане на тази заявка за сливане, когато всички проверки са успешни %[1]s`
|
||||||
|
pulls.delete.title = Да се изтрие ли тази заявка за сливане?
|
||||||
|
pulls.delete.text = Наистина ли искате да изтриете тази заявка за сливане? (Това ще премахне трайно цялото съдържание. Помислете дали вместо това да не я затворите, ако възнамерявате да я запазите архивирана)
|
||||||
|
diff.data_not_available = Съдържанието на разликите не е налично
|
||||||
|
diff.bin = ДВОИЧЕН
|
||||||
|
diff.file_suppressed_line_too_long = Разликите във файла са потиснати, защото един или повече редове са твърде дълги
|
||||||
|
diff.too_many_files = Някои файлове не бяха показани, защото твърде много файлове имат промени в тези разлики
|
||||||
|
diff.show_more = Показване на още
|
||||||
|
diff.generated = генериран
|
||||||
|
diff.comment.add_line_comment = Добавяне на коментар към ред
|
||||||
|
diff.comment.add_review_comment = Добавяне на коментар
|
||||||
|
diff.review.self_reject = Авторите на заявки за сливане не могат да поискват промени в собствените си заявки
|
||||||
|
diff.review.self_approve = Авторите на заявки за сливане не могат да одобряват собствените си заявки
|
||||||
|
diff.image.side_by_side = Едно до друго
|
||||||
|
diff.image.swipe = Плъзгане
|
||||||
|
diff.image.overlay = Наслагване
|
||||||
|
diff.has_escaped = Този ред има скрити Уникод знаци
|
||||||
|
release.tag_name_protected = Името на маркера е защитено.
|
||||||
|
release.add_tag_msg = Използване на заглавието и съдържанието на изданието като съобщение на маркера.
|
||||||
|
release.hide_archive_links = Скриване на автоматично генерираните архиви
|
||||||
|
release.hide_archive_links_helper = Скрийте автоматично генерираните архиви с програмен код за това издание. Например, ако качвате свои собствени.
|
||||||
|
release.asset_external_url = Външен URL адрес
|
||||||
|
release.summary_card_alt = Карта с обобщение на издание със заглавие „%s“ в хранилище %s
|
||||||
|
branch.protected_deletion_failed = Клонът „%s“ е защитен. Не може да бъде изтрит.
|
||||||
|
branch.default_deletion_failed = Клонът „%s“ е стандартният клон. Не може да бъде изтрит.
|
||||||
|
branch.included_desc = Този клон е част от стандартния клон
|
||||||
|
branch.included = Включен
|
||||||
|
branch.warning_rename_default_branch = Преименувате стандартния клон.
|
||||||
|
topic.count_prompt = Не можете да изберете повече от 25 теми
|
||||||
|
find_file.no_matching = Не е намерен съвпадащ файл
|
||||||
|
error.csv.too_large = Не може да се визуализира този файл, защото е твърде голям.
|
||||||
|
error.csv.unexpected = Не може да се визуализира този файл, защото съдържа неочакван знак на ред %d и колона %d.
|
||||||
|
error.csv.invalid_field_count = Не може да се визуализира този файл, защото има грешен брой полета на ред %d.
|
||||||
|
error.broken_git_hook = Git куките на това хранилище изглеждат повредени. Моля, последвайте <a target="_blank" rel="noreferrer" href="%s">документацията</a>, за да ги поправите, след което изтласкайте подавания, за да обновите статуса.
|
||||||
|
|
||||||
[modal]
|
[modal]
|
||||||
confirm = Потвърждаване
|
confirm = Потвърждаване
|
||||||
no = Не
|
no = Не
|
||||||
|
@ -1663,18 +1958,18 @@ follow_blocked_user = Не можете да следвате тази орга
|
||||||
settings.delete_prompt = Организацията ще бъде премахната завинаги. Това <strong>НЕ МОЖЕ</strong> да бъде отменено!
|
settings.delete_prompt = Организацията ще бъде премахната завинаги. Това <strong>НЕ МОЖЕ</strong> да бъде отменено!
|
||||||
settings.labels_desc = Добавете етикети, които могат да се използват за задачи за <strong>всички хранилища</strong> в тази организация.
|
settings.labels_desc = Добавете етикети, които могат да се използват за задачи за <strong>всички хранилища</strong> в тази организация.
|
||||||
teams.none_access = Без достъп
|
teams.none_access = Без достъп
|
||||||
teams.members.none = Няма членове в този екип.
|
teams.members.none = Няма участници в този екип.
|
||||||
repo_updated = Обновено %s
|
repo_updated = Обновено %s
|
||||||
teams.delete_team_success = Екипът е изтрит.
|
teams.delete_team_success = Екипът е изтрит.
|
||||||
teams.search_repo_placeholder = Потърсете хранилище…
|
teams.search_repo_placeholder = Потърсете хранилище…
|
||||||
teams.delete_team_title = Изтриване на екипа
|
teams.delete_team_title = Изтриване на екипа
|
||||||
teams.add_team_member = Добавяне на член на екипа
|
teams.add_team_member = Добавяне на участник в екипа
|
||||||
teams.read_access_helper = Членовете могат да преглеждат и клонират хранилищата на екипа.
|
teams.read_access_helper = Членовете могат да преглеждат и клонират хранилищата на екипа.
|
||||||
teams.invite.description = Моля, щракнете върху бутона по-долу, за да се присъедините към екипа.
|
teams.invite.description = Моля, щракнете върху бутона по-долу, за да се присъедините към екипа.
|
||||||
teams.invite.title = Поканени сте да се присъедините към екип <strong>%s</strong> в организация <strong>%s</strong>.
|
teams.invite.title = Поканени сте да се присъедините към екип <strong>%s</strong> в организация <strong>%s</strong>.
|
||||||
team_permission_desc = Разрешение
|
team_permission_desc = Разрешение
|
||||||
members.public_helper = Да е скрит
|
members.public_helper = Да е скрит
|
||||||
teams.members = Членове на екипа
|
teams.members = Участници в екипа
|
||||||
teams.delete_team = Изтриване на екипа
|
teams.delete_team = Изтриване на екипа
|
||||||
members.owner = Притежател
|
members.owner = Притежател
|
||||||
members.member_role = Роля на участника:
|
members.member_role = Роля на участника:
|
||||||
|
@ -1685,6 +1980,38 @@ settings.delete_org_desc = Тази организация ще бъде изт
|
||||||
open_dashboard = Отваряне на таблото
|
open_dashboard = Отваряне на таблото
|
||||||
settings.change_orgname_prompt = Бележка: Промяната на името на организацията ще промени и URL адреса на вашата организация и ще освободи старото име.
|
settings.change_orgname_prompt = Бележка: Промяната на името на организацията ще промени и URL адреса на вашата организация и ще освободи старото име.
|
||||||
|
|
||||||
|
team_access_desc = Достъп до хранилище
|
||||||
|
team_unit_desc = Разрешаване на достъп до секции на хранилището
|
||||||
|
team_unit_disabled = (Изключено)
|
||||||
|
form.name_reserved = Името на организацията „%s“ е резервирано.
|
||||||
|
form.name_pattern_not_allowed = Шаблонът „%s“ не е разрешен в име на организация.
|
||||||
|
form.create_org_not_allowed = Нямате разрешение да създавате организация.
|
||||||
|
settings.update_setting_success = Настройките на организацията са обновени.
|
||||||
|
settings.change_orgname_redirect_prompt = Старото име ще се пренасочва, докато не бъде взето.
|
||||||
|
settings.change_orgname_redirect_prompt.with_cooldown.one = Старото име на организацията ще бъде достъпно за всички след период на изчакване от %[1]d ден. Все още можете да си върнете старото име по време на периода на изчакване.
|
||||||
|
settings.change_orgname_redirect_prompt.with_cooldown.few = Старото име на организацията ще бъде достъпно за всички след период на изчакване от %[1]d дни. Все още можете да си върнете старото име по време на периода на изчакване.
|
||||||
|
settings.update_avatar_success = Профилната снимка на организацията е обновена.
|
||||||
|
settings.hooks_desc = Добавете уеб-куки, които ще се задействат за <strong>всички хранилища</strong> в тази организация.
|
||||||
|
members.membership_visibility = Видимост на участничеството:
|
||||||
|
members.public = Видим
|
||||||
|
members.private = Скрит
|
||||||
|
members.invite_desc = Добавяне на нов участник към %s:
|
||||||
|
members.invite_now = Поканване сега
|
||||||
|
teams.admin_access = Администраторски достъп
|
||||||
|
teams.invite_team_member = Поканване в %s
|
||||||
|
teams.invite_team_member.list = Чакащи покани
|
||||||
|
teams.delete_team_desc = Изтриването на екип отнема достъпа до хранилището от неговите участници. Продължаване?
|
||||||
|
teams.remove_all_repos_desc = Това ще премахне всички хранилища от екипа.
|
||||||
|
teams.add_all_repos_title = Добавяне на всички хранилища
|
||||||
|
teams.add_all_repos_desc = Това ще добави всички хранилища на организацията към екипа.
|
||||||
|
teams.add_nonexistent_repo = Хранилището, което се опитвате да добавите, не съществува, моля, първо го създайте.
|
||||||
|
teams.add_duplicate_users = Потребителят вече е участник в екипа.
|
||||||
|
teams.repos.none = Няма хранилища, до които този екип да има достъп.
|
||||||
|
teams.specific_repositories = Конкретни хранилища
|
||||||
|
teams.specific_repositories_helper = Участниците ще имат достъп само до хранилища, изрично добавени към екипа. Избирането на това <strong>няма</strong> автоматично да премахне хранилища, вече добавени с <i>Всички хранилища</i>.
|
||||||
|
teams.all_repositories_helper = Екипът има достъп до всички хранилища. Избирането на това ще <strong>добави всички съществуващи</strong> хранилища към екипа.
|
||||||
|
teams.invite.by = Поканен от %s
|
||||||
|
|
||||||
[install]
|
[install]
|
||||||
admin_password = Парола
|
admin_password = Парола
|
||||||
user = Потребителско име
|
user = Потребителско име
|
||||||
|
@ -1978,14 +2305,14 @@ Pronouns = Местоимения
|
||||||
Biography = Биография
|
Biography = Биография
|
||||||
Website = Уебсайт
|
Website = Уебсайт
|
||||||
Location = Местоположение
|
Location = Местоположение
|
||||||
cannot_add_org_to_team = Организация не може да бъде добавена като член на екип.
|
cannot_add_org_to_team = Организация не може да бъде добавена като участник в екип.
|
||||||
auth_failed = Неуспешно удостоверяване: %v
|
auth_failed = Неуспешно удостоверяване: %v
|
||||||
team_no_units_error = Разрешете достъп до поне една секция на хранилището.
|
team_no_units_error = Разрешете достъп до поне една секция на хранилището.
|
||||||
password_uppercase_one = Поне един голям знак
|
password_uppercase_one = Поне един голям знак
|
||||||
CommitSummary = Обобщение на подаването
|
CommitSummary = Обобщение на подаването
|
||||||
username_error = ` може да съдържа само буквено-цифрови знаци („0-9“, „a-z“, „A-Z“), тире („-“), долна черта („_“) и точка („.“). Не може да започва или завършва с не-буквено-цифрови знаци, като също така са забранени и последователни не-буквено-цифрови знаци.`
|
username_error = ` може да съдържа само буквено-цифрови знаци („0-9“, „a-z“, „A-Z“), тире („-“), долна черта („_“) и точка („.“). Не може да започва или завършва с не-буквено-цифрови знаци, като също така са забранени и последователни не-буквено-цифрови знаци.`
|
||||||
username_error_no_dots = ` може да съдържа само буквено-цифрови знаци („0-9“, „a-z“, „A-Z“), тире („-“) и долна черта („_“). Не може да започва или завършва с не-буквено-цифрови знаци, като също така са забранени и последователни не-буквено-цифрови знаци.`
|
username_error_no_dots = ` може да съдържа само буквено-цифрови знаци („0-9“, „a-z“, „A-Z“), тире („-“) и долна черта („_“). Не може да започва или завършва с не-буквено-цифрови знаци, като също така са забранени и последователни не-буквено-цифрови знаци.`
|
||||||
duplicate_invite_to_team = Потребителят вече е поканен като член на екипа.
|
duplicate_invite_to_team = Потребителят вече е поканен като участник в екипа.
|
||||||
must_use_public_key = Ключът, който предоставихте, е частен ключ. Моля, не качвайте частния си ключ никъде. Вместо това използвайте публичния си ключ.
|
must_use_public_key = Ключът, който предоставихте, е частен ключ. Моля, не качвайте частния си ключ никъде. Вместо това използвайте публичния си ключ.
|
||||||
org_still_own_packages = Тази организация все още притежава един или повече пакети, първо ги изтрийте.
|
org_still_own_packages = Тази организация все още притежава един или повече пакети, първо ги изтрийте.
|
||||||
admin_cannot_delete_self = Не можете да изтриете себе си, когато сте администратор. Моля, първо премахнете администраторските си привилегии.
|
admin_cannot_delete_self = Не можете да изтриете себе си, когато сте администратор. Моля, първо премахнете администраторските си привилегии.
|
||||||
|
@ -2006,7 +2333,7 @@ enterred_invalid_repo_name = Името на хранилището, което
|
||||||
enterred_invalid_org_name = Името на организацията, което въведохте, е неправилно.
|
enterred_invalid_org_name = Името на организацията, което въведохте, е неправилно.
|
||||||
enterred_invalid_password = Паролата, която въведохте, е неправилна.
|
enterred_invalid_password = Паролата, която въведохте, е неправилна.
|
||||||
organization_leave_success = Успешно напуснахте организацията %s.
|
organization_leave_success = Успешно напуснахте организацията %s.
|
||||||
still_has_org = Вашият акаунт е член на една или повече организации, първо ги напуснете.
|
still_has_org = Вашият акаунт е участник в една или повече организации, първо ги напуснете.
|
||||||
org_still_own_repo = Тази организация все още притежава едно или повече хранилища, първо ги изтрийте или прехвърлете.
|
org_still_own_repo = Тази организация все още притежава едно или повече хранилища, първо ги изтрийте или прехвърлете.
|
||||||
target_branch_not_exist = Целевият клон не съществува.
|
target_branch_not_exist = Целевият клон не съществува.
|
||||||
glob_pattern_error = ` glob шаблонът е невалиден: %s.`
|
glob_pattern_error = ` glob шаблонът е невалиден: %s.`
|
||||||
|
@ -2017,6 +2344,18 @@ AdminEmail = Администраторски адрес за ел. поща
|
||||||
email_domain_is_not_allowed = Домейнът на адреса за ел. поща на потребителя <b>%s</b> е в конфликт с EMAIL_DOMAIN_ALLOWLIST или EMAIL_DOMAIN_BLOCKLIST. Уверете се, че сте въвели правилно адреса за ел. поща.
|
email_domain_is_not_allowed = Домейнът на адреса за ел. поща на потребителя <b>%s</b> е в конфликт с EMAIL_DOMAIN_ALLOWLIST или EMAIL_DOMAIN_BLOCKLIST. Уверете се, че сте въвели правилно адреса за ел. поща.
|
||||||
email_been_used = Адресът за ел. поща вече се използва.
|
email_been_used = Адресът за ел. поща вече се използва.
|
||||||
|
|
||||||
|
NewBranchName = Име на новия клон
|
||||||
|
git_ref_name_error = ` трябва да е правилно форматирано име на Git препратка.`
|
||||||
|
regex_pattern_error = ` шаблонът на регулярния израз е невалиден: %s.`
|
||||||
|
repository_files_already_exist = Вече съществуват файлове за това хранилище. Свържете се със системния администратор.
|
||||||
|
repository_files_already_exist.delete = Вече съществуват файлове за това хранилище. Трябва да ги изтриете.
|
||||||
|
enterred_invalid_owner_name = Името на новия притежател не е валидно.
|
||||||
|
last_org_owner = Не можете да премахнете последния потребител от екипа на „притежателите“. Трябва да има поне един притежател за организация.
|
||||||
|
invalid_ssh_key = Не може да се потвърди вашият SSH ключ: %s
|
||||||
|
invalid_gpg_key = Не може да се потвърди вашият GPG ключ: %s
|
||||||
|
unable_verify_ssh_key = Не може да се потвърди SSH ключът, проверете го отново за грешки.
|
||||||
|
required_prefix = Въведеният текст трябва да започва с „%s“
|
||||||
|
|
||||||
[action]
|
[action]
|
||||||
close_issue = `затвори задача <a href="%[1]s">%[3]s#%[2]s</a>`
|
close_issue = `затвори задача <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||||
rename_repo = преименува хранилище от <code>%[1]s</code> на <a href="%[2]s">%[3]s</a>
|
rename_repo = преименува хранилище от <code>%[1]s</code> на <a href="%[2]s">%[3]s</a>
|
||||||
|
@ -2045,6 +2384,12 @@ compare_branch = Сравняване
|
||||||
compare_commits_general = Сравняване на подавания
|
compare_commits_general = Сравняване на подавания
|
||||||
compare_commits = Сравнете %d подавания
|
compare_commits = Сравнете %d подавания
|
||||||
|
|
||||||
|
transfer_repo = прехвърли хранилище <code>%s</code> към <a href="%s">%s</a>
|
||||||
|
mirror_sync_push = синхронизира подавания към <a href="%[2]s">%[3]s</a> на <a href="%[1]s">%[4]s</a> от огледало
|
||||||
|
mirror_sync_create = синхронизира нова препратка <a href="%[2]s">%[3]s</a> към <a href="%[1]s">%[4]s</a> от огледало
|
||||||
|
mirror_sync_delete = синхронизира и изтри препратка <code>%[2]s</code> на <a href="%[1]s">%[3]s</a> от огледало
|
||||||
|
review_dismissed = `отхвърли рецензия от <b>%[4]s</b> за <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||||
|
|
||||||
[auth]
|
[auth]
|
||||||
tab_openid = OpenID
|
tab_openid = OpenID
|
||||||
openid_connect_submit = Свързване
|
openid_connect_submit = Свързване
|
||||||
|
@ -2178,6 +2523,15 @@ variables.not_found = Променливата не е открита.
|
||||||
variables.id_not_exist = Променлива с идентификатор %d не съществува.
|
variables.id_not_exist = Променлива с идентификатор %d не съществува.
|
||||||
runners.owner_type = Тип
|
runners.owner_type = Тип
|
||||||
|
|
||||||
|
unit.desc = Управление на интегрирани CI/CD pipelines с Forgejo Actions.
|
||||||
|
status.unknown = Неизвестно
|
||||||
|
status.waiting = Изчаква се
|
||||||
|
status.running = Изпълнява се
|
||||||
|
status.success = Успешно
|
||||||
|
status.failure = Неуспешно
|
||||||
|
status.cancelled = Отменено
|
||||||
|
status.skipped = Пропуснато
|
||||||
|
|
||||||
[heatmap]
|
[heatmap]
|
||||||
less = По-малко
|
less = По-малко
|
||||||
number_of_contributions_in_the_last_12_months = %s приноса през последните 12 месеца
|
number_of_contributions_in_the_last_12_months = %s приноса през последните 12 месеца
|
||||||
|
@ -2258,3 +2612,32 @@ eib = ЕиБ
|
||||||
|
|
||||||
[translation_meta]
|
[translation_meta]
|
||||||
test = окей
|
test = окей
|
||||||
|
|
||||||
|
[repo.permissions]
|
||||||
|
code.read = <b>Четене:</b> Достъп и клониране на кода на хранилището.
|
||||||
|
code.write = <b>Писане:</b> Изтласкване към хранилището, създаване на клонове и маркери.
|
||||||
|
issues.read = <b>Четене:</b> Четене и създаване на задачи и коментари.
|
||||||
|
issues.write = <b>Писане:</b> Затваряне на задачи и управление на метаданни като етикети, етапи, изпълнители, крайни срокове и зависимости.
|
||||||
|
pulls.read = <b>Четене:</b> Четене и създаване на заявки за сливане.
|
||||||
|
pulls.write = <b>Писане:</b> Затваряне на заявки за сливане и управление на метаданни като етикети, етапи, изпълнители, крайни срокове и зависимости.
|
||||||
|
releases.read = <b>Четене:</b> Преглед и изтегляне на издания.
|
||||||
|
wiki.read = <b>Четене:</b> Четене на интегрираното уики и неговата история.
|
||||||
|
wiki.write = <b>Писане:</b> Създаване, обновяване и изтриване на страници в интегрираното уики.
|
||||||
|
projects.read = <b>Четене:</b> Достъп до проектните табла на хранилището.
|
||||||
|
projects.write = <b>Писане:</b> Създаване и редактиране на проекти и колони.
|
||||||
|
|
||||||
|
[gpg]
|
||||||
|
default_key = Подписано с ключ по подразбиране
|
||||||
|
error.extract_sign = Неуспешно извличане на подпис
|
||||||
|
error.generate_hash = Неуспешно генериране на хеш на подаването
|
||||||
|
error.no_committer_account = Няма акаунт, свързан с адреса за ел. поща на подаващия
|
||||||
|
error.no_gpg_keys_found = Не е намерен известен ключ за този подпис в базата данни
|
||||||
|
error.not_signed_commit = Не е подписано подаване
|
||||||
|
error.failed_retrieval_gpg_keys = Неуспешно извличане на ключ, свързан с акаунта на подаващия
|
||||||
|
error.probable_bad_signature = ВНИМАНИЕ! Въпреки че има ключ с това ID в базата данни, той не потвърждава това подаване! Това подаване е ПОДОЗРИТЕЛНО.
|
||||||
|
error.probable_bad_default_signature = ВНИМАНИЕ! Въпреки че ключът по подразбиране има това ID, той не потвърждава това подаване! Това подаване е ПОДОЗРИТЕЛНО.
|
||||||
|
|
||||||
|
[units]
|
||||||
|
unit = Елемент
|
||||||
|
error.no_unit_allowed_repo = Нямате разрешение за достъп до никоя секция на това хранилище.
|
||||||
|
error.unit_not_allowed = Нямате разрешение за достъп до тази секция на хранилището.
|
||||||
|
|
|
@ -153,26 +153,26 @@ fuzzy = Difusa
|
||||||
search = Cerca...
|
search = Cerca...
|
||||||
type_tooltip = Tipus de cerca
|
type_tooltip = Tipus de cerca
|
||||||
fuzzy_tooltip = Inclou resultats que s'assemblen al terme de la cerca
|
fuzzy_tooltip = Inclou resultats que s'assemblen al terme de la cerca
|
||||||
repo_kind = Cerca repos...
|
repo_kind = Cerca repos…
|
||||||
user_kind = Cerca usuaris...
|
user_kind = Cerca usuaris…
|
||||||
code_search_unavailable = La cerca de codi no està disponible actualment. Si us plau concteu amb l'administrador del lloc.
|
code_search_unavailable = La cerca de codi no està disponible actualment. Si us plau concteu amb l'administrador del lloc.
|
||||||
code_search_by_git_grep = Els resultats actuals de la cerca de codi són proporcionats per "git grep". Podríen haver-hi millors resultats si l'administrador del lloc habilita l'indexador de codi.
|
code_search_by_git_grep = Els resultats actuals de la cerca de codi són proporcionats per "git grep". Podríen haver-hi millors resultats si l'administrador del lloc habilita l'indexador de codi.
|
||||||
package_kind = Cerca paquets...
|
package_kind = Cerca paquets…
|
||||||
project_kind = Cerca projectes...
|
project_kind = Cerca projectes…
|
||||||
branch_kind = Cerca branques...
|
branch_kind = Cerca branques…
|
||||||
commit_kind = Cerca commits...
|
commit_kind = Cerca commits…
|
||||||
runner_kind = Cerca executors...
|
runner_kind = Cerca executors…
|
||||||
no_results = Cap resultat coincident trobat.
|
no_results = Cap resultat coincident trobat.
|
||||||
keyword_search_unavailable = La cerca per paraula clau no està disponible ara mateix. Si us plau contacteu amb l'administrador del lloc.
|
keyword_search_unavailable = La cerca per paraula clau no està disponible ara mateix. Si us plau contacteu amb l'administrador del lloc.
|
||||||
union = Paraules clau
|
union = Paraules clau
|
||||||
union_tooltip = Inclou resultats que encaixen amb qualsevol paraula clau separada per espais
|
union_tooltip = Inclou resultats que encaixen amb qualsevol paraula clau separada per espais
|
||||||
org_kind = Cerca organitzacions...
|
org_kind = Cerca organitzacions…
|
||||||
team_kind = Cerca teams...
|
team_kind = Cerca teams…
|
||||||
code_kind = Cerca codi...
|
code_kind = Cerca codi…
|
||||||
pull_kind = Cerca "pulls"...
|
pull_kind = Cerca "pulls"…
|
||||||
exact = Exacte
|
exact = Exacte
|
||||||
exact_tooltip = Inclou només resultats que són exactament el terme de cerca
|
exact_tooltip = Inclou només resultats que són exactament el terme de cerca
|
||||||
issue_kind = Cerca problemes...
|
issue_kind = Cerca problemes…
|
||||||
regexp = RegExp
|
regexp = RegExp
|
||||||
regexp_tooltip = Interpreta el terme de cerca com una expressió regular
|
regexp_tooltip = Interpreta el terme de cerca com una expressió regular
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@ link_account=Propojit účet
|
||||||
register=Registrace
|
register=Registrace
|
||||||
version=Verze
|
version=Verze
|
||||||
powered_by=Běží na %s
|
powered_by=Běží na %s
|
||||||
page=Strana
|
page=Stránka
|
||||||
template=Šablona
|
template=Šablona
|
||||||
language=Jazyk
|
language=Jazyk
|
||||||
notifications=Oznámení
|
notifications=Oznámení
|
||||||
|
@ -724,7 +724,7 @@ following_one = %d sledovaný
|
||||||
followers.title.one = Sledující
|
followers.title.one = Sledující
|
||||||
followers.title.few = Sledující
|
followers.title.few = Sledující
|
||||||
following.title.one = Sleduje
|
following.title.one = Sleduje
|
||||||
following.title.few = Sleudje
|
following.title.few = Sleduje
|
||||||
public_activity.visibility_hint.self_private = Vaše aktivita je viditelná pouze vám a správcům instance. <a href="%s">Nastavení</a>.
|
public_activity.visibility_hint.self_private = Vaše aktivita je viditelná pouze vám a správcům instance. <a href="%s">Nastavení</a>.
|
||||||
public_activity.visibility_hint.admin_private = Tato aktivita je pro vás viditelná, protože jste administrátor, ale uživatel chce, aby zůstala soukromá.
|
public_activity.visibility_hint.admin_private = Tato aktivita je pro vás viditelná, protože jste administrátor, ale uživatel chce, aby zůstala soukromá.
|
||||||
public_activity.visibility_hint.self_public = Vaše aktivita je viditelná všem, mimo interakcí v soukromých prostorech. <a href="%s">Nastavení</a>.
|
public_activity.visibility_hint.self_public = Vaše aktivita je viditelná všem, mimo interakcí v soukromých prostorech. <a href="%s">Nastavení</a>.
|
||||||
|
@ -1063,7 +1063,7 @@ language.localization_project = Pomozte nám s překladem Forgejo do vašeho jaz
|
||||||
user_block_yourself = Nemůžete zablokovat sami sebe.
|
user_block_yourself = Nemůžete zablokovat sami sebe.
|
||||||
pronouns_custom_label = Vlastní zájmena
|
pronouns_custom_label = Vlastní zájmena
|
||||||
change_username_redirect_prompt.with_cooldown.few = Staré uživatelské jméno bude dostupné ostatním po %[1]d dnech. Do té doby budete moci své staré uživatelské jméno znovu získat.
|
change_username_redirect_prompt.with_cooldown.few = Staré uživatelské jméno bude dostupné ostatním po %[1]d dnech. Do té doby budete moci své staré uživatelské jméno znovu získat.
|
||||||
change_username_redirect_prompt.with_cooldown.one = Staré uživatelské jméno bude dostupné ostatním po %[1]d dni. Do té doby budete moci své staré uživatelské jméno znovu získat.
|
change_username_redirect_prompt.with_cooldown.one = Staré uživatelské jméno bude dostupné ostatním po %[1]d dnu. Do té doby budete moci své staré uživatelské jméno znovu získat.
|
||||||
keep_pronouns_private = Zobrazovat zájmena pouze přihlášeným uživatelům
|
keep_pronouns_private = Zobrazovat zájmena pouze přihlášeným uživatelům
|
||||||
keep_pronouns_private.description = Toto nastavení skryje vaše zájmena před návštěvníky, kteří nejsou přihlášeni.
|
keep_pronouns_private.description = Toto nastavení skryje vaše zájmena před návštěvníky, kteří nejsou přihlášeni.
|
||||||
quota = Kvóta
|
quota = Kvóta
|
||||||
|
@ -1091,6 +1091,8 @@ regenerate_token = Resetovat
|
||||||
access_token_regeneration = Znovu vygenerovat přístupový token
|
access_token_regeneration = Znovu vygenerovat přístupový token
|
||||||
access_token_regeneration_desc = Opětovným vygenerováním tokenu znemožníte přístup k vašemu účtu aplikacím, které jej používají. Tato akce je nevratná. Chcete pokračovat?
|
access_token_regeneration_desc = Opětovným vygenerováním tokenu znemožníte přístup k vašemu účtu aplikacím, které jej používají. Tato akce je nevratná. Chcete pokračovat?
|
||||||
|
|
||||||
|
ssh_token_help_ssh_agent = nebo, pokud používáte agenta SSH (s nastavenou proměnnou SSH_AUTH_SOCK):
|
||||||
|
|
||||||
[repo]
|
[repo]
|
||||||
new_repo_helper=Repozitář obsahuje všechny soubory projektu, včetně historie revizí. Už jej hostujete jinde? <a href="%s">Migrovat repozitář</a>.
|
new_repo_helper=Repozitář obsahuje všechny soubory projektu, včetně historie revizí. Už jej hostujete jinde? <a href="%s">Migrovat repozitář</a>.
|
||||||
owner=Vlastník
|
owner=Vlastník
|
||||||
|
@ -1556,7 +1558,7 @@ issues.label_templates.info=Zatím nebyly vytvořeny žádné štítky. Vytvořt
|
||||||
issues.label_templates.helper=Vyberte přednastavené značky
|
issues.label_templates.helper=Vyberte přednastavené značky
|
||||||
issues.label_templates.use=Použít přednastavené štítky
|
issues.label_templates.use=Použít přednastavené štítky
|
||||||
issues.label_templates.fail_to_load_file=Nepodařilo se načíst soubor šablony popisku „%s“: %v
|
issues.label_templates.fail_to_load_file=Nepodařilo se načíst soubor šablony popisku „%s“: %v
|
||||||
issues.add_label=přidal/a %s štítek %s
|
issues.add_label=přidal/a štítek %s %s
|
||||||
issues.add_labels=přidal/a %s štítky %s
|
issues.add_labels=přidal/a %s štítky %s
|
||||||
issues.remove_label=odstranil/a %s štítek %s
|
issues.remove_label=odstranil/a %s štítek %s
|
||||||
issues.remove_labels=odstranil/a %s štítky %s
|
issues.remove_labels=odstranil/a %s štítky %s
|
||||||
|
@ -1579,7 +1581,7 @@ issues.remove_ref_at=`odstranil/a referenci <b>%s</b> %s`
|
||||||
issues.add_ref_at=`přidal/a referenci <b>%s</b> %s`
|
issues.add_ref_at=`přidal/a referenci <b>%s</b> %s`
|
||||||
issues.delete_branch_at=`odstranil/a větev <b>%s</b> %s`
|
issues.delete_branch_at=`odstranil/a větev <b>%s</b> %s`
|
||||||
issues.filter_label=Štítek
|
issues.filter_label=Štítek
|
||||||
issues.filter_label_exclude=`Chcete-li vyloučit štítky, použijte <code>alt</code> + <code>click/enter</code>`
|
issues.filter_label_exclude=Chcete-li vyloučit štítky, použijte <kbd>Alt</kbd> + <kbd>kliknutí</kbd>
|
||||||
issues.filter_label_no_select=Všechny štítky
|
issues.filter_label_no_select=Všechny štítky
|
||||||
issues.filter_label_select_no_label=Bez štítku
|
issues.filter_label_select_no_label=Bez štítku
|
||||||
issues.filter_milestone=Milník
|
issues.filter_milestone=Milník
|
||||||
|
@ -1633,13 +1635,13 @@ issues.opened_by_fake=otevřeno %[1]s uživatelem %[2]s
|
||||||
issues.closed_by_fake=od %[2]s byl uzavřen %[1]s
|
issues.closed_by_fake=od %[2]s byl uzavřen %[1]s
|
||||||
issues.previous=Předchozí
|
issues.previous=Předchozí
|
||||||
issues.next=Další
|
issues.next=Další
|
||||||
issues.open_title=Otevřeno
|
issues.open_title=Otevřené
|
||||||
issues.closed_title=Uzavřeno
|
issues.closed_title=Uzavřené
|
||||||
issues.draft_title=Koncept
|
issues.draft_title=Koncept
|
||||||
issues.num_comments_1=%d komentář
|
issues.num_comments_1=%d komentář
|
||||||
issues.num_comments=%d komentářů
|
issues.num_comments=%d komentářů
|
||||||
issues.commented_at=`okomentoval/a <a href="#%s">%s</a>`
|
issues.commented_at=`okomentoval/a <a href="#%s">%s</a>`
|
||||||
issues.delete_comment_confirm=Jste si jist, že chcete smazat tento komentář?
|
issues.delete_comment_confirm=Opravdu chcete smazat tento komentář?
|
||||||
issues.context.copy_link=Kopírovat odkaz
|
issues.context.copy_link=Kopírovat odkaz
|
||||||
issues.context.quote_reply=Citovat odpověď
|
issues.context.quote_reply=Citovat odpověď
|
||||||
issues.context.reference_issue=Odkázat v novém problému
|
issues.context.reference_issue=Odkázat v novém problému
|
||||||
|
@ -1653,13 +1655,13 @@ issues.close_comment_issue=Zavřít s komentářem
|
||||||
issues.reopen_issue=Znovu otevřít
|
issues.reopen_issue=Znovu otevřít
|
||||||
issues.reopen_comment_issue=Znovu otevřít s komentářem
|
issues.reopen_comment_issue=Znovu otevřít s komentářem
|
||||||
issues.create_comment=Komentovat
|
issues.create_comment=Komentovat
|
||||||
issues.closed_at=`uzavřel/a tento problém <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.closed_at=`uzavřel/a tento problém %s`
|
||||||
issues.reopened_at=`znovu otevřel/a tento problém <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.reopened_at=`znovu otevřel/a tento problém %s`
|
||||||
issues.commit_ref_at=`odkázal/a na tento problém z revize <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.commit_ref_at=`odkázal/a na tento problém z revize %s`
|
||||||
issues.ref_issue_from=`<a href="%[3]s">odkázal/a na tento problém %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.ref_issue_from=`<a href="%[2]s">odkázal/a na tento problém %[3]s</a> %[1]s`
|
||||||
issues.ref_pull_from=`<a href="%[3]s">odkázal/a na tuto žádost o sloučení %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.ref_pull_from=`<a href="%[2]s">odkázal/a na tuto žádost o sloučení %[3]s</a> %[1]s`
|
||||||
issues.ref_closing_from=`<a href="%[3]s">odkazoval/a na tento problém ze žádosti o sloučení %[4]s, která jej uzavře</a>, <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.ref_closing_from=`<a href="%[2]s">odkázal/a na tento problém ze žádosti o sloučení %[3]s, která jej uzavře</a>, %[1]s`
|
||||||
issues.ref_reopening_from=`<a href="%[3]s">odkazoval/a na tento problém ze žádosti o sloučení %[4]s, která jej znovu otevře</a>, <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.ref_reopening_from=`<a href="%[2]s">odkázal/a na tento problém ze žádosti o sloučení %[3]s, která jej znovu otevře</a>, %[1]s`
|
||||||
issues.ref_closed_from=`<a href="%[3]s">uzavřel/a tento problém %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.ref_closed_from=`<a href="%[3]s">uzavřel/a tento problém %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||||
issues.ref_reopened_from=`<a href="%[3]s">znovu otevřel/a tento problém %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.ref_reopened_from=`<a href="%[3]s">znovu otevřel/a tento problém %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||||
issues.ref_from=`z %[1]s`
|
issues.ref_from=`z %[1]s`
|
||||||
|
@ -1763,7 +1765,7 @@ issues.error_modifying_due_date=Změna termínu dokončení selhala.
|
||||||
issues.error_removing_due_date=Odstranění termínu dokončení selhalo.
|
issues.error_removing_due_date=Odstranění termínu dokončení selhalo.
|
||||||
issues.push_commit_1=přidal/a %d revizi %s
|
issues.push_commit_1=přidal/a %d revizi %s
|
||||||
issues.push_commits_n=přidal/a %d revize %s
|
issues.push_commits_n=přidal/a %d revize %s
|
||||||
issues.force_push_codes=`vynucené nahrání %[1]s od <a class="%[7]s" href="%[3]s"><code>%[2]s</code></a> do <a class="%[7]s" href="%[5]s"><code>%[4]s</code></a> %[6]s`
|
issues.force_push_codes=`vynutil/a nahrání %[1]s od <a class="%[7]s" href="%[3]s"><code>%[2]s</code></a> do <a class="%[7]s" href="%[5]s"><code>%[4]s</code></a> %[6]s`
|
||||||
issues.force_push_compare=Porovnat
|
issues.force_push_compare=Porovnat
|
||||||
issues.due_date_form=rrrr-mm-dd
|
issues.due_date_form=rrrr-mm-dd
|
||||||
issues.due_date_form_add=Přidat termín dokončení
|
issues.due_date_form_add=Přidat termín dokončení
|
||||||
|
@ -1813,7 +1815,7 @@ issues.review.approve=schválil/a tyto změny %s
|
||||||
issues.review.comment=posoudil/a %s
|
issues.review.comment=posoudil/a %s
|
||||||
issues.review.dismissed=zamítl/a posouzení uživatele %s %s
|
issues.review.dismissed=zamítl/a posouzení uživatele %s %s
|
||||||
issues.review.dismissed_label=Zamítnuto
|
issues.review.dismissed_label=Zamítnuto
|
||||||
issues.review.left_comment=zanechal komentář
|
issues.review.left_comment=zanechal/a komentář
|
||||||
issues.review.content.empty=Je potřeba zanechat poznámku s uvedením požadované změny (požadovaných změn).
|
issues.review.content.empty=Je potřeba zanechat poznámku s uvedením požadované změny (požadovaných změn).
|
||||||
issues.review.reject=požádal/a o změny %s
|
issues.review.reject=požádal/a o změny %s
|
||||||
issues.review.wait=byl/a požádán/a o posouzení %s
|
issues.review.wait=byl/a požádán/a o posouzení %s
|
||||||
|
@ -1966,8 +1968,8 @@ pulls.update_branch_success=Aktualizace větve byla úspěšná
|
||||||
pulls.update_not_allowed=Nemáte oprávnění aktualizovat větev
|
pulls.update_not_allowed=Nemáte oprávnění aktualizovat větev
|
||||||
pulls.outdated_with_base_branch=Tato větev je zastaralá oproti základní větvi
|
pulls.outdated_with_base_branch=Tato větev je zastaralá oproti základní větvi
|
||||||
pulls.close=Zavřít žádost o sloučení
|
pulls.close=Zavřít žádost o sloučení
|
||||||
pulls.closed_at=`uzavřel/a tuto žádost o sloučení <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
pulls.closed_at=`uzavřel/a tuto žádost o sloučení %s`
|
||||||
pulls.reopened_at=`znovu otevřel/a tuto žádost o sloučení <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
pulls.reopened_at=`znovu otevřel/a tuto žádost o sloučení %s`
|
||||||
pulls.cmd_instruction_hint=Zobrazit instrukce příkazové řádky
|
pulls.cmd_instruction_hint=Zobrazit instrukce příkazové řádky
|
||||||
pulls.cmd_instruction_checkout_desc=Z vašeho repositáře projektu se podívejte na novou větev a vyzkoušejte změny.
|
pulls.cmd_instruction_checkout_desc=Z vašeho repositáře projektu se podívejte na novou větev a vyzkoušejte změny.
|
||||||
pulls.cmd_instruction_merge_title=Sloučit
|
pulls.cmd_instruction_merge_title=Sloučit
|
||||||
|
@ -2758,7 +2760,7 @@ settings.mirror_settings.docs.disabled_push_mirror.pull_mirror_warning = Tuto ak
|
||||||
settings.new_owner_blocked_doer = Nový majitel vás zablokoval.
|
settings.new_owner_blocked_doer = Nový majitel vás zablokoval.
|
||||||
settings.mirror_settings.pushed_repository = Odeslaný repozitář
|
settings.mirror_settings.pushed_repository = Odeslaný repozitář
|
||||||
settings.add_collaborator_blocked_our = Nepodařilo se přidat spolupracovníka, jelikož byl zablokován majitelem repozitáře.
|
settings.add_collaborator_blocked_our = Nepodařilo se přidat spolupracovníka, jelikož byl zablokován majitelem repozitáře.
|
||||||
pulls.commit_ref_at = `se odkázal/a na tuto žádost o sloučení z revize <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
pulls.commit_ref_at = `odkázal/a na tuto žádost o sloučení z revize %s`
|
||||||
settings.wiki_rename_branch_main = Normalizovat název větve wiki
|
settings.wiki_rename_branch_main = Normalizovat název větve wiki
|
||||||
settings.wiki_rename_branch_main_desc = Přejmenovat větev interně používanou pro wiki na „%s“. Tato změna je trvalá a nelze ji vrátit.
|
settings.wiki_rename_branch_main_desc = Přejmenovat větev interně používanou pro wiki na „%s“. Tato změna je trvalá a nelze ji vrátit.
|
||||||
pulls.fast_forward_only_merge_pull_request = Pouze zrychlené
|
pulls.fast_forward_only_merge_pull_request = Pouze zrychlené
|
||||||
|
@ -3058,7 +3060,7 @@ teams.invite.by=Pozvání od %s
|
||||||
teams.invite.description=Pro připojení k týmu klikněte na tlačítko níže.
|
teams.invite.description=Pro připojení k týmu klikněte na tlačítko níže.
|
||||||
follow_blocked_user = Tuto organizaci nemůžete sledovat, protože jste v ní zablokováni.
|
follow_blocked_user = Tuto organizaci nemůžete sledovat, protože jste v ní zablokováni.
|
||||||
open_dashboard = Otevřít nástěnku
|
open_dashboard = Otevřít nástěnku
|
||||||
settings.change_orgname_redirect_prompt.with_cooldown.one = Starý název organizace bude dostupný ostatním po %[1]d dni. Do té doby budete moci staré jméno znovu získat.
|
settings.change_orgname_redirect_prompt.with_cooldown.one = Starý název organizace bude dostupný ostatním po %[1]d dnu. Do té doby budete moci staré jméno znovu získat.
|
||||||
settings.change_orgname_redirect_prompt.with_cooldown.few = Starý název organizace bude dostupný ostatním po %[1]d dnech. Do té doby budete moci starý název znovu získat.
|
settings.change_orgname_redirect_prompt.with_cooldown.few = Starý název organizace bude dostupný ostatním po %[1]d dnech. Do té doby budete moci starý název znovu získat.
|
||||||
|
|
||||||
[admin]
|
[admin]
|
||||||
|
@ -3991,7 +3993,7 @@ variables.update.success=Proměnná byla upravena.
|
||||||
runners.none = Nejsou dostupné žádné runnery
|
runners.none = Nejsou dostupné žádné runnery
|
||||||
runs.workflow = Workflow
|
runs.workflow = Workflow
|
||||||
runners = Runnery
|
runners = Runnery
|
||||||
runs.pushed_by = pushnuto uživatelem
|
runs.pushed_by = pushnuta uživatelem
|
||||||
need_approval_desc = Potřebovat schválení pro spouštění workflowů pro žádosti o sloučení forků.
|
need_approval_desc = Potřebovat schválení pro spouštění workflowů pro žádosti o sloučení forků.
|
||||||
runners.runner_manage_panel = Správa runnerů
|
runners.runner_manage_panel = Správa runnerů
|
||||||
runs.no_job_without_needs = Workflow musí obsahovat alespoň jednu práci bez závislostí.
|
runs.no_job_without_needs = Workflow musí obsahovat alespoň jednu práci bez závislostí.
|
||||||
|
|
|
@ -1,6 +1,3 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[common]
|
[common]
|
||||||
home = Hjem
|
home = Hjem
|
||||||
dashboard = Instrumentpanel
|
dashboard = Instrumentpanel
|
||||||
|
@ -978,8 +975,8 @@ delete_with_all_comments = Din konto er yngre end %s. For at undgå spøgelsesko
|
||||||
delete_account_title = Slet brugerkonto
|
delete_account_title = Slet brugerkonto
|
||||||
user_block_yourself = Du kan ikke blokere dig selv.
|
user_block_yourself = Du kan ikke blokere dig selv.
|
||||||
pronouns_custom_label = Brugerdefinerede stedord
|
pronouns_custom_label = Brugerdefinerede stedord
|
||||||
change_username_redirect_prompt.with_cooldown.one = Det gamle brugernavn vil være tilgængeligt for alle efter en nedkølingsperiode på %[1]d dag, du kan stadig kræve det gamle brugernavn tilbage i nedkølingsperioden.
|
change_username_redirect_prompt.with_cooldown.one = Det gamle brugernavn vil være tilgængeligt for alle efter en nedkølingsperiode på %[1]d dag, år. Du kan stadig kræve det gamle brugernavn tilbage i nedkølingsperioden.
|
||||||
change_username_redirect_prompt.with_cooldown.few = Det gamle brugernavn vil være tilgængeligt for alle efter en nedkølingsperiode på %[1]d dage, du kan stadig kræve det gamle brugernavn tilbage i nedkølingsperioden.
|
change_username_redirect_prompt.with_cooldown.few = Det gamle brugernavn vil være tilgængeligt for alle efter en nedkølingsperiode på %[1]d dage, år. Du kan stadig kræve det gamle brugernavn tilbage i nedkølingsperioden.
|
||||||
keep_pronouns_private = Vis kun stedord til godkendte brugere
|
keep_pronouns_private = Vis kun stedord til godkendte brugere
|
||||||
keep_pronouns_private.description = Dette vil skjule dine stedord for besøgende, der ikke er logget ind.
|
keep_pronouns_private.description = Dette vil skjule dine stedord for besøgende, der ikke er logget ind.
|
||||||
quota.applies_to_user = Følgende kvoteregler gælder for din konto
|
quota.applies_to_user = Følgende kvoteregler gælder for din konto
|
||||||
|
@ -1520,15 +1517,15 @@ issues.add_labels = tilføjede %s etiketterne %s
|
||||||
issues.add_remove_labels = tilføjede %s og fjernede %s etiketter %s
|
issues.add_remove_labels = tilføjede %s og fjernede %s etiketter %s
|
||||||
issues.add_milestone_at = `føjede dette til <b>%s</b> milepælen %s`
|
issues.add_milestone_at = `føjede dette til <b>%s</b> milepælen %s`
|
||||||
issues.add_project_at = `føjede dette til <b>%s</b>- projektet %s`
|
issues.add_project_at = `føjede dette til <b>%s</b>- projektet %s`
|
||||||
issues.ref_reopening_from = `<a href="%[3]s">henviste til dette problem fra en pull-anmodning %[4]s, der vil genåbne den</a>, <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.ref_reopening_from = `<a href="%[2]s">henviste til dette problem fra en pull-anmodning %[3]s, der vil genåbne det</a>, %[1]s`
|
||||||
issues.ref_closed_from = `<a href="%[3]s">lukkede dette problem %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2 ]s</a>`
|
issues.ref_closed_from = `<a href="%[3]s">lukkede dette problem %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2 ]s</a>`
|
||||||
issues.ref_reopened_from = `<a href="%[3]s">genåbnede dette problem %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2 ]s</a>`
|
issues.ref_reopened_from = `<a href="%[3]s">genåbnede dette problem %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2 ]s</a>`
|
||||||
issues.ref_from = `fra %[1]s`
|
issues.ref_from = `fra %[1]s`
|
||||||
issues.author = Forfatter
|
issues.author = Forfatter
|
||||||
issues.commit_ref_at = `henviste til dette problem fra en commit <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.commit_ref_at = `henviste til dette problem fra en commit %s`
|
||||||
issues.ref_issue_from = `<a href="%[3]s">henviste til dette problem %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2 ]s</a>`
|
issues.ref_issue_from = `<a href="%[2]s">henviste til dette problem %[3]s</a> %[1]s`
|
||||||
issues.ref_pull_from = `<a href="%[3]s">henviste til denne pull-anmodning %[4]s</a> <a id="%[1]s" href="#%[1]s">%[ 2]s</a>`
|
issues.ref_pull_from = `<a href="%[2]s">henviste til denne pull-anmodning %[3]s</a> %[1]s`
|
||||||
issues.ref_closing_from = `<a href="%[3]s">henviste til dette problem fra en pull-anmodning %[4]s, der vil lukke det</a>, <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.ref_closing_from = `<a href="%[2]s">henviste til dette problem fra en pull-anmodning %[3]s, der vil lukke det</a>, %[1]s`
|
||||||
issues.author.tooltip.issue = Denne bruger er forfatteren til dette problem.
|
issues.author.tooltip.issue = Denne bruger er forfatteren til dette problem.
|
||||||
issues.author.tooltip.pr = Denne bruger er forfatteren af denne pull-anmodning.
|
issues.author.tooltip.pr = Denne bruger er forfatteren af denne pull-anmodning.
|
||||||
issues.role.owner = Ejer
|
issues.role.owner = Ejer
|
||||||
|
@ -1564,8 +1561,8 @@ issues.reaction.alt_add = Tilføj %[1]s reaktion til kommentar.
|
||||||
issues.context.menu = Kommentar menu
|
issues.context.menu = Kommentar menu
|
||||||
issues.reopen_comment_issue = Genåbner med kommentar
|
issues.reopen_comment_issue = Genåbner med kommentar
|
||||||
issues.create_comment = Kommentar
|
issues.create_comment = Kommentar
|
||||||
issues.closed_at = `lukkede dette problem <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.closed_at = `lukkede dette problem %s`
|
||||||
issues.reopened_at = `genåbnede dette problem <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.reopened_at = `genåbnede dette problem %s`
|
||||||
issues.remove_label = fjernede %s etiketten %s
|
issues.remove_label = fjernede %s etiketten %s
|
||||||
issues.remove_labels = fjernede %s etiketterne %s
|
issues.remove_labels = fjernede %s etiketterne %s
|
||||||
issues.change_project_at = `modificerede projektet fra <b>%s</b> til <b>%s</b> %s`
|
issues.change_project_at = `modificerede projektet fra <b>%s</b> til <b>%s</b> %s`
|
||||||
|
@ -1582,7 +1579,7 @@ issues.change_ref_at = `ændret reference fra <b><strike>%s</strike></b> til <b>
|
||||||
issues.remove_ref_at = `fjernet reference <b>%s</b> %s`
|
issues.remove_ref_at = `fjernet reference <b>%s</b> %s`
|
||||||
issues.add_ref_at = `tilføjet reference <b>%s</b> %s`
|
issues.add_ref_at = `tilføjet reference <b>%s</b> %s`
|
||||||
issues.delete_branch_at = `slettet gren <b>%s</b> %s`
|
issues.delete_branch_at = `slettet gren <b>%s</b> %s`
|
||||||
issues.filter_label_exclude = `Brug <code>alt</code> + <code>klik/enter</code> for at ekskludere etiketter`
|
issues.filter_label_exclude = Brug <kbd>Alt</kbd> + <kbd>klik</kbd> for at ekskludere etiketter
|
||||||
issues.filter_milestone = Milepæl
|
issues.filter_milestone = Milepæl
|
||||||
issues.filter_milestone_all = Alle milepæle
|
issues.filter_milestone_all = Alle milepæle
|
||||||
issues.filter_milestone_none = Ingen milepæle
|
issues.filter_milestone_none = Ingen milepæle
|
||||||
|
@ -1911,10 +1908,10 @@ pulls.editable_explanation = Denne pull-anmodning tillader redigeringer fra vedl
|
||||||
pulls.auto_merge_button_when_succeed = (Når kontroller lykkes)
|
pulls.auto_merge_button_when_succeed = (Når kontroller lykkes)
|
||||||
pulls.status_checks_requested = Påkrævet
|
pulls.status_checks_requested = Påkrævet
|
||||||
pulls.close = Luk pull anmodning
|
pulls.close = Luk pull anmodning
|
||||||
pulls.commit_ref_at = `henviste til denne pull-anmodning fra en commit <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
pulls.commit_ref_at = `henviste til denne pull-anmodning fra en commit %s`
|
||||||
pulls.cmd_instruction_hint = Se instruktionerne på kommandolinjen
|
pulls.cmd_instruction_hint = Se instruktionerne på kommandolinjen
|
||||||
pulls.reopened_at = `genåbnede denne pull-anmodning <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
pulls.reopened_at = `genåbnede denne pull-anmodning %s`
|
||||||
pulls.closed_at = `lukkede denne pull-anmodning <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
pulls.closed_at = `lukkede denne pull-anmodning %s`
|
||||||
pulls.cmd_instruction_checkout_desc = Fra dit projektdepot, tjek en ny gren og test ændringerne.
|
pulls.cmd_instruction_checkout_desc = Fra dit projektdepot, tjek en ny gren og test ændringerne.
|
||||||
pulls.editable = Redigerbar
|
pulls.editable = Redigerbar
|
||||||
pulls.made_using_agit = AGit
|
pulls.made_using_agit = AGit
|
||||||
|
@ -2833,8 +2830,8 @@ team_permission_desc = Tilladelse
|
||||||
members.member = Medlem
|
members.member = Medlem
|
||||||
settings.change_orgname_prompt = Bemærk: Ændring af organisationens navn vil også ændre din organisations URL og frigøre det gamle navn.
|
settings.change_orgname_prompt = Bemærk: Ændring af organisationens navn vil også ændre din organisations URL og frigøre det gamle navn.
|
||||||
settings.change_orgname_redirect_prompt = Det gamle navn vil omdirigere, indtil det gøres krav på.
|
settings.change_orgname_redirect_prompt = Det gamle navn vil omdirigere, indtil det gøres krav på.
|
||||||
settings.change_orgname_redirect_prompt.with_cooldown.one = Det gamle organisationsnavn vil være tilgængeligt for alle efter en nedkølingsperiode på %[1]d dag, du kan stadig kræve det gamle navn tilbage i nedkølingsperioden.
|
settings.change_orgname_redirect_prompt.with_cooldown.one = Det gamle organisationsnavn vil være tilgængeligt for alle efter en nedkølingsperiode på %[1]d dag, år. Du kan stadig kræve det gamle navn tilbage i nedkølingsperioden.
|
||||||
settings.change_orgname_redirect_prompt.with_cooldown.few = Det gamle organisationsnavn vil være tilgængeligt for alle efter en nedkølingsperiode på %[1]d dage, du kan stadig kræve det gamle navn tilbage i .
|
settings.change_orgname_redirect_prompt.with_cooldown.few = Det gamle organisationsnavn vil være tilgængeligt for alle efter en nedkølingsperiode på %[1]d dage, år. Du kan stadig kræve det gamle navn tilbage i.
|
||||||
settings.update_avatar_success = Organisationens avatar er blevet opdateret.
|
settings.update_avatar_success = Organisationens avatar er blevet opdateret.
|
||||||
members.public_helper = Gør skjult
|
members.public_helper = Gør skjult
|
||||||
members.private = Skjult
|
members.private = Skjult
|
||||||
|
|
|
@ -251,12 +251,12 @@ db_schema_helper=Leer lassen, um den Datenbank-Standardwert („public“) zu ve
|
||||||
ssl_mode=SSL
|
ssl_mode=SSL
|
||||||
path=Pfad
|
path=Pfad
|
||||||
sqlite_helper=Dateipfad zur SQLite3-Datenbank.<br>Gib einen absoluten Pfad an, wenn Forgejo als Service gestartet wird.
|
sqlite_helper=Dateipfad zur SQLite3-Datenbank.<br>Gib einen absoluten Pfad an, wenn Forgejo als Service gestartet wird.
|
||||||
reinstall_error=Du versuchst, in eine bereits existierende Forgejo Datenbank zu installieren
|
reinstall_error=Du versuchst, in eine bereits existierende Forgejo-Datenbank zu installieren
|
||||||
reinstall_confirm_message=Eine Neuinstallation mit einer bestehenden Forgejo-Datenbank kann mehrere Probleme verursachen. In den meisten Fällen solltest du deine vorhandene „app.ini“ verwenden, um Forgejo auszuführen. Wenn du weißt, was du tust, bestätige die folgenden Angaben:
|
reinstall_confirm_message=Eine Neuinstallation mit einer bestehenden Forgejo-Datenbank kann mehrere Probleme verursachen. In den meisten Fällen solltest du deine vorhandene „app.ini“ verwenden, um Forgejo auszuführen. Wenn du weißt, was du tust, bestätige die folgenden Angaben:
|
||||||
reinstall_confirm_check_1=Die von der SECRET_KEY in app.ini verschlüsselten Daten können verloren gehen: Benutzer können sich unter Umständen nicht mit 2FA/OTP einloggen und Spiegel könnten nicht mehr richtig funktionieren. Mit der Ankreuzung dieses Kästchens bestätigst du, dass die aktuelle app.ini-Datei den korrekten SECRET_KEY enthält.
|
reinstall_confirm_check_1=Die von der SECRET_KEY in app.ini verschlüsselten Daten können verloren gehen: Benutzer können sich unter Umständen nicht mit 2FA/OTP einloggen und Spiegel könnten nicht mehr richtig funktionieren. Mit der Ankreuzung dieses Kästchens bestätigst du, dass die aktuelle app.ini-Datei den korrekten SECRET_KEY enthält.
|
||||||
reinstall_confirm_check_2=Die Repositorys und Einstellungen müssen eventuell neu synchronisiert werden. Durch das Ankreuzen dieses Kästchens bestätigst du, dass du die Hooks für die Repositorys und die authorized_keys-Datei manuell neu synchronisierst. Du bestätigst, dass du sicherstellst, dass die Repository- und Spiegeleinstellungen korrekt sind.
|
reinstall_confirm_check_2=Die Repositorys und Einstellungen müssen eventuell neu synchronisiert werden. Durch das Ankreuzen dieses Kästchens bestätigst du, dass du die Hooks für die Repositorys und die authorized_keys-Datei manuell neu synchronisierst. Du bestätigst, dass du sicherstellst, dass die Repository- und Spiegeleinstellungen korrekt sind.
|
||||||
reinstall_confirm_check_3=Du bestätigst, dass du absolut sicher bist, dass diese Forgejo mit der richtigen app.ini läuft, und du sicher bist, dass du neu installieren musst. Du bestätigst, dass du die oben genannten Risiken anerkennst.
|
reinstall_confirm_check_3=Du bestätigst, dass du absolut sicher bist, dass diese Forgejo mit der richtigen app.ini läuft, und du sicher bist, dass du neu installieren musst. Du bestätigst, dass du die oben genannten Risiken anerkennst.
|
||||||
err_empty_db_path=Der SQLite3 Datenbankpfad darf nicht leer sein.
|
err_empty_db_path=Der SQLite3-Datenbankpfad darf nicht leer sein.
|
||||||
no_admin_and_disable_registration=Du kannst Selbst-Registrierungen nicht deaktivieren, ohne ein Administratorkonto zu erstellen.
|
no_admin_and_disable_registration=Du kannst Selbst-Registrierungen nicht deaktivieren, ohne ein Administratorkonto zu erstellen.
|
||||||
err_empty_admin_password=Das Administrator-Passwort darf nicht leer sein.
|
err_empty_admin_password=Das Administrator-Passwort darf nicht leer sein.
|
||||||
err_empty_admin_email=Die Administrator-E-Mail darf nicht leer sein.
|
err_empty_admin_email=Die Administrator-E-Mail darf nicht leer sein.
|
||||||
|
@ -463,7 +463,7 @@ openid_register_title=Neues Konto einrichten
|
||||||
openid_register_desc=Die gewählte OpenID-URI ist unbekannt. Ordne sie hier einem neuen Account zu.
|
openid_register_desc=Die gewählte OpenID-URI ist unbekannt. Ordne sie hier einem neuen Account zu.
|
||||||
openid_signin_desc=Gib deine OpenID-URI ein, zum Beispiel alice.openid.example.org oder https://openid.example.org/alice.
|
openid_signin_desc=Gib deine OpenID-URI ein, zum Beispiel alice.openid.example.org oder https://openid.example.org/alice.
|
||||||
disable_forgot_password_mail=Die Kontowiederherstellung ist deaktiviert, da keine E-Mail eingerichtet ist. Bitte kontaktiere den zuständigen Administrator.
|
disable_forgot_password_mail=Die Kontowiederherstellung ist deaktiviert, da keine E-Mail eingerichtet ist. Bitte kontaktiere den zuständigen Administrator.
|
||||||
disable_forgot_password_mail_admin=Die Kontowiederherstellung ist nur verfügbar, wenn eine E-Mail eingerichtet wurde. Bitte richte eine E-Mail Adresse ein, um die Kontowiederherstellung freizuschalten.
|
disable_forgot_password_mail_admin=Die Kontowiederherstellung ist nur verfügbar, wenn eine E-Mail eingerichtet wurde. Bitte richte eine E-Mail-Adresse ein, um die Kontowiederherstellung freizuschalten.
|
||||||
email_domain_blacklisted=Du kannst dich nicht mit deiner E-Mail-Adresse registrieren.
|
email_domain_blacklisted=Du kannst dich nicht mit deiner E-Mail-Adresse registrieren.
|
||||||
authorize_application=Anwendung autorisieren
|
authorize_application=Anwendung autorisieren
|
||||||
authorize_redirect_notice=Du wirst zu %s weitergeleitet, wenn du diese Anwendung autorisierst.
|
authorize_redirect_notice=Du wirst zu %s weitergeleitet, wenn du diese Anwendung autorisierst.
|
||||||
|
@ -530,8 +530,8 @@ issue.action.merge=<b>@%[1]s</b> hat #%[2]d in %[3]s zusammengeführt.
|
||||||
issue.action.approve=<b>@%[1]s</b> hat diesen Pull-Request genehmigt.
|
issue.action.approve=<b>@%[1]s</b> hat diesen Pull-Request genehmigt.
|
||||||
issue.action.reject=<b>@%[1]s</b> hat Änderungen auf diesem Pull-Request angefordert.
|
issue.action.reject=<b>@%[1]s</b> hat Änderungen auf diesem Pull-Request angefordert.
|
||||||
issue.action.review=<b>@%[1]s</b> hat diesen Pull-Request kommentiert.
|
issue.action.review=<b>@%[1]s</b> hat diesen Pull-Request kommentiert.
|
||||||
issue.action.review_dismissed=<b>@%[1]s</b> hat das letzte Review von %[2]s für diesen Pull-Request verworfen.
|
issue.action.review_dismissed=<b>@%[1]s</b> hat die letzte Sichtung von %[2]s für diesen Pull-Request verworfen.
|
||||||
issue.action.ready_for_review=<b>@%[1]s</b> hat diesen Pull-Request zum Review freigegeben.
|
issue.action.ready_for_review=<b>@%[1]s</b> hat diesen Pull-Request für die Sichtung freigegeben.
|
||||||
issue.action.new=<b>@%[1]s</b> hat #%[2]d geöffnet.
|
issue.action.new=<b>@%[1]s</b> hat #%[2]d geöffnet.
|
||||||
issue.in_tree_path=In %s:
|
issue.in_tree_path=In %s:
|
||||||
|
|
||||||
|
@ -540,8 +540,8 @@ release.new.text=<b>@%[1]s</b> hat %[2]s in %[3]s released
|
||||||
release.title=Titel: %s
|
release.title=Titel: %s
|
||||||
release.note=Anmerkung:
|
release.note=Anmerkung:
|
||||||
release.downloads=Downloads:
|
release.downloads=Downloads:
|
||||||
release.download.zip=Quellcode (ZIP Datei)
|
release.download.zip=Quellcode (ZIP)
|
||||||
release.download.targz=Quellcode (TAR.GZ Datei)
|
release.download.targz=Quellcode (TAR.GZ)
|
||||||
|
|
||||||
repo.transfer.subject_to=%s möchte „%s“ an %s übertragen
|
repo.transfer.subject_to=%s möchte „%s“ an %s übertragen
|
||||||
repo.transfer.subject_to_you=%s möchte dir „%s“ übertragen
|
repo.transfer.subject_to_you=%s möchte dir „%s“ übertragen
|
||||||
|
@ -633,7 +633,7 @@ repository_files_already_exist=Dateien für dieses Repository sind bereits vorha
|
||||||
repository_files_already_exist.adopt=Dateien für dieses Repository existieren bereits und können nur übernommen werden.
|
repository_files_already_exist.adopt=Dateien für dieses Repository existieren bereits und können nur übernommen werden.
|
||||||
repository_files_already_exist.delete=Dateien für dieses Repository sind bereits vorhanden. Du must sie löschen.
|
repository_files_already_exist.delete=Dateien für dieses Repository sind bereits vorhanden. Du must sie löschen.
|
||||||
repository_files_already_exist.adopt_or_delete=Dateien für dieses Repository existieren bereits. Du musst sie entweder übernehmen oder löschen.
|
repository_files_already_exist.adopt_or_delete=Dateien für dieses Repository existieren bereits. Du musst sie entweder übernehmen oder löschen.
|
||||||
visit_rate_limit=Das Rate-Limit bei der Gegenseite wurde erreicht.
|
visit_rate_limit=Die Ratenbegrenzung bei der Gegenseite wurde erreicht.
|
||||||
2fa_auth_required=Die Gegenseite benötigt Zweifaktorauthentifikation.
|
2fa_auth_required=Die Gegenseite benötigt Zweifaktorauthentifikation.
|
||||||
org_name_been_taken=Der Organisationsname ist bereits vergeben.
|
org_name_been_taken=Der Organisationsname ist bereits vergeben.
|
||||||
team_name_been_taken=Der Teamname ist bereits vergeben.
|
team_name_been_taken=Der Teamname ist bereits vergeben.
|
||||||
|
@ -750,9 +750,9 @@ twofa=Zwei-Faktor-Authentifizierung (TOTP)
|
||||||
account_link=Verknüpfte Benutzerkonten
|
account_link=Verknüpfte Benutzerkonten
|
||||||
organization=Organisationen
|
organization=Organisationen
|
||||||
uid=UID
|
uid=UID
|
||||||
webauthn=Hardware-Sicherheitsschlüssel
|
webauthn=Zwei-Faktor-Authentifizierung (Sicherheitsschlüssel)
|
||||||
|
|
||||||
public_profile=Öffentliches Profil
|
public_profile=Öffentliches profil
|
||||||
biography_placeholder=Erzähle anderen ein wenig über dich selbst! (Markdown wird unterstützt)
|
biography_placeholder=Erzähle anderen ein wenig über dich selbst! (Markdown wird unterstützt)
|
||||||
location_placeholder=Teile deinen ungefähren Standort mit anderen
|
location_placeholder=Teile deinen ungefähren Standort mit anderen
|
||||||
profile_desc=Über dich
|
profile_desc=Über dich
|
||||||
|
@ -787,7 +787,7 @@ comment_type_group_time_tracking=Zeiterfassung
|
||||||
comment_type_group_deadline=Frist
|
comment_type_group_deadline=Frist
|
||||||
comment_type_group_dependency=Abhängigkeit
|
comment_type_group_dependency=Abhängigkeit
|
||||||
comment_type_group_lock=Sperrstatus
|
comment_type_group_lock=Sperrstatus
|
||||||
comment_type_group_review_request=Angeforderte Reviews
|
comment_type_group_review_request=Angeforderte Sichtungen
|
||||||
comment_type_group_pull_request_push=Hinzugefügte Commits
|
comment_type_group_pull_request_push=Hinzugefügte Commits
|
||||||
comment_type_group_project=Projekt
|
comment_type_group_project=Projekt
|
||||||
comment_type_group_issue_ref=Issue-Referenz
|
comment_type_group_issue_ref=Issue-Referenz
|
||||||
|
@ -873,7 +873,7 @@ gpg_key_matched_identities_long=Die eingebetteten Identitäten in diesem Schlüs
|
||||||
gpg_key_verified=Verifizierter Schlüssel
|
gpg_key_verified=Verifizierter Schlüssel
|
||||||
gpg_key_verified_long=Der Schlüssel wurde mit einem Token verifiziert. Er kann verwendet werden, um Commits zu verifizieren, die mit irgendeiner für diesen Nutzer aktivierten E-Mail-Adresse und irgendeiner Identität dieses Schlüssels übereinstimmen.
|
gpg_key_verified_long=Der Schlüssel wurde mit einem Token verifiziert. Er kann verwendet werden, um Commits zu verifizieren, die mit irgendeiner für diesen Nutzer aktivierten E-Mail-Adresse und irgendeiner Identität dieses Schlüssels übereinstimmen.
|
||||||
gpg_key_verify=Verifizieren
|
gpg_key_verify=Verifizieren
|
||||||
gpg_invalid_token_signature=Der GPG-Key, die Signatur, und das Token stimmen nicht überein, oder das Token ist veraltet.
|
gpg_invalid_token_signature=Der GPG-Key, die Signatur und das Token stimmen nicht überein, oder das Token ist veraltet.
|
||||||
gpg_token_required=Du musst eine Signatur für das folgende Token angeben
|
gpg_token_required=Du musst eine Signatur für das folgende Token angeben
|
||||||
gpg_token=Token
|
gpg_token=Token
|
||||||
gpg_token_help=Du kannst eine Signatur wie folgt generieren:
|
gpg_token_help=Du kannst eine Signatur wie folgt generieren:
|
||||||
|
@ -885,9 +885,9 @@ ssh_key_verified=Verifizierter Schlüssel
|
||||||
ssh_key_verified_long=Der Schlüssel wurde mit einem Token verifiziert. Er kann verwendet werden, um Commits zu verifizieren, die mit irgendeiner für diesen Nutzer aktivierten E-Mail-Adresse und irgendeiner Identität dieses Schlüssels übereinstimmen.
|
ssh_key_verified_long=Der Schlüssel wurde mit einem Token verifiziert. Er kann verwendet werden, um Commits zu verifizieren, die mit irgendeiner für diesen Nutzer aktivierten E-Mail-Adresse und irgendeiner Identität dieses Schlüssels übereinstimmen.
|
||||||
ssh_key_verify=Verifizieren
|
ssh_key_verify=Verifizieren
|
||||||
ssh_invalid_token_signature=Der gegebene SSH-Schlüssel, Signatur oder Token stimmen nicht überein oder der Token ist veraltet.
|
ssh_invalid_token_signature=Der gegebene SSH-Schlüssel, Signatur oder Token stimmen nicht überein oder der Token ist veraltet.
|
||||||
ssh_token_required=Du musst eine Signatur für den Token unten angeben
|
ssh_token_required=Sie müssen eine Signatur für das Token unten angeben
|
||||||
ssh_token=Token
|
ssh_token=Token
|
||||||
ssh_token_help=Du kannst eine Signatur wie folgt generieren:
|
ssh_token_help=Sie können eine Signatur wie folgt generieren:
|
||||||
ssh_token_signature=SSH-Textsignatur (armored signature)
|
ssh_token_signature=SSH-Textsignatur (armored signature)
|
||||||
key_signature_ssh_placeholder=Beginnt mit „-----BEGIN SSH SIGNATURE-----“
|
key_signature_ssh_placeholder=Beginnt mit „-----BEGIN SSH SIGNATURE-----“
|
||||||
verify_ssh_key_success=SSH-Key „%s“ wurde verifiziert.
|
verify_ssh_key_success=SSH-Key „%s“ wurde verifiziert.
|
||||||
|
@ -902,10 +902,10 @@ add_principal_success=Die SSH-Zertifikatsidentität „%s“ wurde hinzugefügt.
|
||||||
delete_key=Entfernen
|
delete_key=Entfernen
|
||||||
ssh_key_deletion=SSH-Schlüssel entfernen
|
ssh_key_deletion=SSH-Schlüssel entfernen
|
||||||
gpg_key_deletion=GPG-Schlüssel entfernen
|
gpg_key_deletion=GPG-Schlüssel entfernen
|
||||||
ssh_principal_deletion=SSH-Zertifik-Identität entfernen
|
ssh_principal_deletion=SSH-Zertifikats-Principal entfernen
|
||||||
ssh_key_deletion_desc=Wenn du einen SSH-Key entfernst, hast du mit diesem Key keinen Zugriff mehr. Fortfahren?
|
ssh_key_deletion_desc=Wenn du einen SSH-Key entfernst, hast du mit diesem Key keinen Zugriff mehr. Fortfahren?
|
||||||
gpg_key_deletion_desc=Wenn du einen GPG-Schlüssel entfernst, können damit unterschriebene Commits nicht mehr verifiziert werden. Fortfahren?
|
gpg_key_deletion_desc=Wenn du einen GPG-Schlüssel entfernst, können damit unterschriebene Commits nicht mehr verifiziert werden. Fortfahren?
|
||||||
ssh_principal_deletion_desc=Das Entfernen einer SSH-Zertifikat-Identität entzieht den Zugriff auf dein Konto. Fortfahren?
|
ssh_principal_deletion_desc=Das Entfernen eines SSH-Zertifikats-Principals entzieht den Zugriff auf dein Konto. Fortfahren?
|
||||||
ssh_key_deletion_success=Der SSH-Schlüssel wurde entfernt.
|
ssh_key_deletion_success=Der SSH-Schlüssel wurde entfernt.
|
||||||
gpg_key_deletion_success=Der GPG-Schlüssel wurde entfernt.
|
gpg_key_deletion_success=Der GPG-Schlüssel wurde entfernt.
|
||||||
ssh_principal_deletion_success=Die Identität wurde entfernt.
|
ssh_principal_deletion_success=Die Identität wurde entfernt.
|
||||||
|
@ -931,7 +931,7 @@ unbind_success=Das soziale Konto wurde erfolgreich entfernt.
|
||||||
|
|
||||||
manage_access_token=Zugriffstokens
|
manage_access_token=Zugriffstokens
|
||||||
generate_new_token=Neuen Token erzeugen
|
generate_new_token=Neuen Token erzeugen
|
||||||
tokens_desc=Diese Tokens gewähren vollen Zugriff auf dein Konto via die Forgejo-API.
|
tokens_desc=Diese Tokens gewähren vollen Zugriff auf dein Konto mit der Forgejo-API.
|
||||||
token_name=Token-Name
|
token_name=Token-Name
|
||||||
generate_token=Token generieren
|
generate_token=Token generieren
|
||||||
generate_token_success=Ein neuer Token wurde generiert. Kopiere diesen jetzt, da er nicht erneut angezeigt wird.
|
generate_token_success=Ein neuer Token wurde generiert. Kopiere diesen jetzt, da er nicht erneut angezeigt wird.
|
||||||
|
@ -970,8 +970,8 @@ save_application=Speichern
|
||||||
oauth2_client_id=Client-ID
|
oauth2_client_id=Client-ID
|
||||||
oauth2_client_secret=Client-Geheimnis
|
oauth2_client_secret=Client-Geheimnis
|
||||||
oauth2_regenerate_secret=Geheimnis neu generieren
|
oauth2_regenerate_secret=Geheimnis neu generieren
|
||||||
oauth2_regenerate_secret_hint=Secret verloren?
|
oauth2_regenerate_secret_hint=Geheimnis verloren?
|
||||||
oauth2_client_secret_hint=Das Secret wird nach dem Verlassen oder Aktualisieren dieser Seite nicht mehr angezeigt. Bitte stelle sicher, dass du es gespeichert hast.
|
oauth2_client_secret_hint=Das Geheimnis wird nach dem Verlassen oder Aktualisieren dieser Seite nicht mehr angezeigt. Bitte stelle sicher, dass du es gespeichert hast.
|
||||||
oauth2_application_edit=Bearbeiten
|
oauth2_application_edit=Bearbeiten
|
||||||
oauth2_application_create_description=OAuth2-Anwendungen geben deiner Drittanwendung Zugriff auf Benutzeraccounts dieser Forgejo-Instanz.
|
oauth2_application_create_description=OAuth2-Anwendungen geben deiner Drittanwendung Zugriff auf Benutzeraccounts dieser Forgejo-Instanz.
|
||||||
oauth2_application_remove_description=Das Entfernen einer OAuth2-Anwendung hat zur Folge, dass diese nicht mehr auf autorisierte Benutzeraccounts auf dieser Instanz zugreifen kann. Möchtest Du fortfahren?
|
oauth2_application_remove_description=Das Entfernen einer OAuth2-Anwendung hat zur Folge, dass diese nicht mehr auf autorisierte Benutzeraccounts auf dieser Instanz zugreifen kann. Möchtest Du fortfahren?
|
||||||
|
@ -996,11 +996,11 @@ twofa_disable_desc=Wenn du die Zwei-Faktor-Authentifizierung deaktivierst, wird
|
||||||
regenerate_scratch_token_desc=Wenn du deinen Wiederherstellungsschlüssel verlegst oder es bereits benutzt hast, kannst du es hier zurücksetzen.
|
regenerate_scratch_token_desc=Wenn du deinen Wiederherstellungsschlüssel verlegst oder es bereits benutzt hast, kannst du es hier zurücksetzen.
|
||||||
twofa_disabled=Zwei-Faktor-Authentifizierung wurde deaktiviert.
|
twofa_disabled=Zwei-Faktor-Authentifizierung wurde deaktiviert.
|
||||||
scan_this_image=Scanne diese Grafik mit deiner Authentifizierungs-App:
|
scan_this_image=Scanne diese Grafik mit deiner Authentifizierungs-App:
|
||||||
or_enter_secret=Oder gib das Secret ein: %s
|
or_enter_secret=Oder gib das Geheimnis ein: %s
|
||||||
then_enter_passcode=Und gib dann die angezeigte PIN der Anwendung ein:
|
then_enter_passcode=Und gib dann die angezeigte PIN der Anwendung ein:
|
||||||
passcode_invalid=Die PIN ist falsch. Probiere es erneut.
|
passcode_invalid=Die PIN ist falsch. Probiere es erneut.
|
||||||
twofa_enrolled=Die Zwei-Faktor-Authentifizierung wurde für dein Konto aktiviert. Bewahre deinen einmalig verwendbaren Wiederherstellungsschlüssel (%s) an einem sicheren Ort auf, da er nicht wieder angezeigt werden wird.
|
twofa_enrolled=Die Zwei-Faktor-Authentifizierung wurde für dein Konto aktiviert. Bewahre deinen einmalig verwendbaren Wiederherstellungsschlüssel (%s) an einem sicheren Ort auf, da er nicht wieder angezeigt werden wird.
|
||||||
twofa_failed_get_secret=Fehler beim Abrufen des Secrets.
|
twofa_failed_get_secret=Fehler beim Abrufen des Geheimnisses.
|
||||||
|
|
||||||
webauthn_desc=Sicherheitsschlüssel sind Geräte, die kryptografische Schlüssel beeinhalten. Diese können für die Zwei-Faktor-Authentifizierung verwendet werden. Der Sicherheitsschlüssel muss den Standard „<a rel="noreferrer" target="_blank" href="%s">WebAuthn</a>“ unterstützen.
|
webauthn_desc=Sicherheitsschlüssel sind Geräte, die kryptografische Schlüssel beeinhalten. Diese können für die Zwei-Faktor-Authentifizierung verwendet werden. Der Sicherheitsschlüssel muss den Standard „<a rel="noreferrer" target="_blank" href="%s">WebAuthn</a>“ unterstützen.
|
||||||
webauthn_register_key=Sicherheitsschlüssel hinzufügen
|
webauthn_register_key=Sicherheitsschlüssel hinzufügen
|
||||||
|
@ -1093,6 +1093,8 @@ access_token_regeneration = Zugangstoken regenerieren
|
||||||
access_token_regeneration_desc = Einen Token zu regenerieren, wird den Zugriff auf deinen Account von Anwendungen, die ihn nutzen, zurückziehen. Dies kann nicht rückgängig gemacht werden. Fortsetzen?
|
access_token_regeneration_desc = Einen Token zu regenerieren, wird den Zugriff auf deinen Account von Anwendungen, die ihn nutzen, zurückziehen. Dies kann nicht rückgängig gemacht werden. Fortsetzen?
|
||||||
regenerate_token = Regenerieren
|
regenerate_token = Regenerieren
|
||||||
|
|
||||||
|
ssh_token_help_ssh_agent = , oder, falls Sie einen SSH-Agenten benutzen (mit der Variable SSH_AUTH_SOCK gesetzt):
|
||||||
|
|
||||||
[repo]
|
[repo]
|
||||||
owner=Besitzer
|
owner=Besitzer
|
||||||
owner_helper=Einige Organisationen könnten in der Dropdown-Liste nicht angezeigt werden, da die Anzahl an Repositorys begrenzt ist.
|
owner_helper=Einige Organisationen könnten in der Dropdown-Liste nicht angezeigt werden, da die Anzahl an Repositorys begrenzt ist.
|
||||||
|
@ -1185,9 +1187,9 @@ blame.ignore_revs=Revisionen in <a href="%s">.git-blame-ignore-revs</a> werden i
|
||||||
blame.ignore_revs.failed=Fehler beim Ignorieren der Revisionen in <a href="%s">.git-blame-ignore-revs</a>.
|
blame.ignore_revs.failed=Fehler beim Ignorieren der Revisionen in <a href="%s">.git-blame-ignore-revs</a>.
|
||||||
author_search_tooltip=Zeigt maximal 30 Benutzer
|
author_search_tooltip=Zeigt maximal 30 Benutzer
|
||||||
|
|
||||||
tree_path_not_found_commit=Pfad %[1]s existiert nicht in Commit%[2]s
|
tree_path_not_found_commit=Pfad %[1]s existiert nicht im Commit %[2]s
|
||||||
tree_path_not_found_branch=Pfad %[1]s existiert nicht in Branch %[2]s
|
tree_path_not_found_branch=Pfad %[1]s existiert nicht im Branch %[2]s
|
||||||
tree_path_not_found_tag=Pfad %[1]s existiert nicht in Tag %[2]s
|
tree_path_not_found_tag=Pfad %[1]s existiert nicht im Tag %[2]s
|
||||||
|
|
||||||
transfer.accept=Übertragung akzeptieren
|
transfer.accept=Übertragung akzeptieren
|
||||||
transfer.accept_desc=Übertragung nach „%s“
|
transfer.accept_desc=Übertragung nach „%s“
|
||||||
|
@ -1248,7 +1250,7 @@ migrate.clone_local_path=oder ein lokaler Serverpfad
|
||||||
migrate.permission_denied=Du hast keine Berechtigung zum Importieren lokaler Repositorys.
|
migrate.permission_denied=Du hast keine Berechtigung zum Importieren lokaler Repositorys.
|
||||||
migrate.permission_denied_blocked=Du kannst von keinen nicht erlaubten Hosts importieren. Bitte fragen deinen Administrator, die Einstellungen ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS zu überprüfen.
|
migrate.permission_denied_blocked=Du kannst von keinen nicht erlaubten Hosts importieren. Bitte fragen deinen Administrator, die Einstellungen ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS zu überprüfen.
|
||||||
migrate.invalid_local_path=Der lokale Pfad ist ungültig. Er existiert nicht oder ist kein Verzeichnis.
|
migrate.invalid_local_path=Der lokale Pfad ist ungültig. Er existiert nicht oder ist kein Verzeichnis.
|
||||||
migrate.invalid_lfs_endpoint=Ungültiger LFS Endpunkt.
|
migrate.invalid_lfs_endpoint=Der LFS-Endpunkt ist nicht gültig.
|
||||||
migrate.failed=Fehler bei der Migration: %v
|
migrate.failed=Fehler bei der Migration: %v
|
||||||
migrate.migrate_items_options=Zugangs-Token wird benötigt, um zusätzliche Elemente zu migrieren
|
migrate.migrate_items_options=Zugangs-Token wird benötigt, um zusätzliche Elemente zu migrieren
|
||||||
migrated_from=Migriert von <a href="%[1]s">%[2]s</a>
|
migrated_from=Migriert von <a href="%[1]s">%[2]s</a>
|
||||||
|
@ -1324,7 +1326,7 @@ commit=Commit
|
||||||
release=Release
|
release=Release
|
||||||
releases=Releases
|
releases=Releases
|
||||||
tag=Tag
|
tag=Tag
|
||||||
released_this=hat released
|
released_this=hat releast
|
||||||
tagged_this=hat getaggt
|
tagged_this=hat getaggt
|
||||||
file.title=%s an %s
|
file.title=%s an %s
|
||||||
file_raw=Originalformat
|
file_raw=Originalformat
|
||||||
|
@ -1448,7 +1450,7 @@ commits.older=Älter
|
||||||
commits.newer=Neuer
|
commits.newer=Neuer
|
||||||
commits.signed_by=Signiert von
|
commits.signed_by=Signiert von
|
||||||
commits.signed_by_untrusted_user=Signiert von nicht vertrauenswürdigen Benutzern
|
commits.signed_by_untrusted_user=Signiert von nicht vertrauenswürdigen Benutzern
|
||||||
commits.signed_by_untrusted_user_unmatched=Signiert von nicht vertrauenswürdigen Benutzern, der nicht mit dem Committer übereinstimmt
|
commits.signed_by_untrusted_user_unmatched=Von einem nicht vertrauenswürdigen Benutzer, der nicht auf den Committer passt, signiert
|
||||||
commits.gpg_key_id=GPG-Schlüssel-ID
|
commits.gpg_key_id=GPG-Schlüssel-ID
|
||||||
commits.ssh_key_fingerprint=SSH-Schlüssel-Fingerabdruck
|
commits.ssh_key_fingerprint=SSH-Schlüssel-Fingerabdruck
|
||||||
commits.view_path=An diesem Punkt im Verlauf anzeigen
|
commits.view_path=An diesem Punkt im Verlauf anzeigen
|
||||||
|
@ -1459,7 +1461,7 @@ commit.revert-header=Setze zurück: %s
|
||||||
commit.revert-content=Branch auswählen, der zurückgesetzt werden soll:
|
commit.revert-content=Branch auswählen, der zurückgesetzt werden soll:
|
||||||
commit.cherry-pick=Cherry-Pick
|
commit.cherry-pick=Cherry-Pick
|
||||||
commit.cherry-pick-header=Cherry-Picke: %s
|
commit.cherry-pick-header=Cherry-Picke: %s
|
||||||
commit.cherry-pick-content=Branch auswählen, auf dem Cherry-Picked werden soll:
|
commit.cherry-pick-content=Branch auswählen, zu dem das Ergebnis des Cherry-Picks angewendet werden soll:
|
||||||
|
|
||||||
commitstatus.error=Fehler
|
commitstatus.error=Fehler
|
||||||
commitstatus.failure=Fehler
|
commitstatus.failure=Fehler
|
||||||
|
@ -1515,7 +1517,7 @@ issues.filter_assignees=Verantwortliche filtern
|
||||||
issues.filter_milestones=Meilenstein filtern
|
issues.filter_milestones=Meilenstein filtern
|
||||||
issues.filter_projects=Projekt filtern
|
issues.filter_projects=Projekt filtern
|
||||||
issues.filter_labels=Label filtern
|
issues.filter_labels=Label filtern
|
||||||
issues.filter_reviewers=Reviewer filtern
|
issues.filter_reviewers=Prüfer filtern
|
||||||
issues.new=Neues Issue
|
issues.new=Neues Issue
|
||||||
issues.new.title_empty=Der Titel kann nicht leer sein
|
issues.new.title_empty=Der Titel kann nicht leer sein
|
||||||
issues.new.labels=Labels
|
issues.new.labels=Labels
|
||||||
|
@ -1535,7 +1537,7 @@ issues.new.closed_milestone=Geschlossene Meilensteine
|
||||||
issues.new.assignees=Zuständige
|
issues.new.assignees=Zuständige
|
||||||
issues.new.clear_assignees=Zuständige entfernen
|
issues.new.clear_assignees=Zuständige entfernen
|
||||||
issues.new.no_assignees=Niemand zuständig
|
issues.new.no_assignees=Niemand zuständig
|
||||||
issues.new.no_reviewers=Keine Reviewer
|
issues.new.no_reviewers=Keine Prüfer
|
||||||
issues.choose.get_started=Los geht's
|
issues.choose.get_started=Los geht's
|
||||||
issues.choose.open_external_link=Öffnen
|
issues.choose.open_external_link=Öffnen
|
||||||
issues.choose.blank=Standard
|
issues.choose.blank=Standard
|
||||||
|
@ -1577,7 +1579,7 @@ issues.remove_ref_at=`hat die Referenz <b>%s</b> %s entfernt`
|
||||||
issues.add_ref_at=`hat die Referenz <b>%s</b> %s hinzugefügt`
|
issues.add_ref_at=`hat die Referenz <b>%s</b> %s hinzugefügt`
|
||||||
issues.delete_branch_at=`löschte den Branch <b>%s</b> %s`
|
issues.delete_branch_at=`löschte den Branch <b>%s</b> %s`
|
||||||
issues.filter_label=Label
|
issues.filter_label=Label
|
||||||
issues.filter_label_exclude=`<code>Alt</code> + <code>Klick/Enter</code> verwenden, um Labels auszuschließen`
|
issues.filter_label_exclude=`Verwende <kbd>Alt</kbd> + <kbd>Klick/Enter</kbd>, um Labels auszuschließen`
|
||||||
issues.filter_label_no_select=Alle Labels
|
issues.filter_label_no_select=Alle Labels
|
||||||
issues.filter_label_select_no_label=Kein Label
|
issues.filter_label_select_no_label=Kein Label
|
||||||
issues.filter_milestone=Meilenstein
|
issues.filter_milestone=Meilenstein
|
||||||
|
@ -1598,8 +1600,8 @@ issues.filter_type.all_issues=Alle Issues
|
||||||
issues.filter_type.assigned_to_you=Dir zugewiesen
|
issues.filter_type.assigned_to_you=Dir zugewiesen
|
||||||
issues.filter_type.created_by_you=Von dir erstellt
|
issues.filter_type.created_by_you=Von dir erstellt
|
||||||
issues.filter_type.mentioning_you=Hat dich erwähnt
|
issues.filter_type.mentioning_you=Hat dich erwähnt
|
||||||
issues.filter_type.review_requested=Review angefordert
|
issues.filter_type.review_requested=Sichtung angefordert
|
||||||
issues.filter_type.reviewed_by_you=Von dir gereviewt
|
issues.filter_type.reviewed_by_you=Von dir überprüft
|
||||||
issues.filter_sort=Sortieren
|
issues.filter_sort=Sortieren
|
||||||
issues.filter_sort.latest=Neueste
|
issues.filter_sort.latest=Neueste
|
||||||
issues.filter_sort.oldest=Älteste
|
issues.filter_sort.oldest=Älteste
|
||||||
|
@ -1621,8 +1623,8 @@ issues.action_milestone=Meilenstein
|
||||||
issues.action_milestone_no_select=Kein Meilenstein
|
issues.action_milestone_no_select=Kein Meilenstein
|
||||||
issues.action_assignee=Zuständig
|
issues.action_assignee=Zuständig
|
||||||
issues.action_assignee_no_select=Niemand zuständig
|
issues.action_assignee_no_select=Niemand zuständig
|
||||||
issues.action_check=Auswählen/Auswahl aufheben
|
issues.action_check=Auswählen / Auswahl aufheben
|
||||||
issues.action_check_all=Alles auswählen/Auswahl aufheben
|
issues.action_check_all=Alles auswählen / Auswahl aufheben
|
||||||
issues.opened_by=%[1]s von <a href="%[2]s">%[3]s</a> geöffnet
|
issues.opened_by=%[1]s von <a href="%[2]s">%[3]s</a> geöffnet
|
||||||
pulls.merged_by=von <a href="%[2]s">%[3]s</a> wurde %[1]s zusammengeführt
|
pulls.merged_by=von <a href="%[2]s">%[3]s</a> wurde %[1]s zusammengeführt
|
||||||
pulls.merged_by_fake=von %[2]s %[1]s zusammengeführt
|
pulls.merged_by_fake=von %[2]s %[1]s zusammengeführt
|
||||||
|
@ -1651,13 +1653,13 @@ issues.close_comment_issue=Mit Kommentar schließen
|
||||||
issues.reopen_issue=Wieder öffnen
|
issues.reopen_issue=Wieder öffnen
|
||||||
issues.reopen_comment_issue=Mit Kommentar wieder öffnen
|
issues.reopen_comment_issue=Mit Kommentar wieder öffnen
|
||||||
issues.create_comment=Kommentieren
|
issues.create_comment=Kommentieren
|
||||||
issues.closed_at=`hat diesen Issue <a id="%[1]s" href="#%[1]s">%[2]s</a> geschlossen`
|
issues.closed_at=`hat dieses Issue %s geschlossen`
|
||||||
issues.reopened_at=`hat dieses Issue <a id="%[1]s" href="#%[1]s">%[2]s</a> wieder geöffnet`
|
issues.reopened_at=`hat dieses Issue %s wieder geöffnet`
|
||||||
issues.commit_ref_at=`hat dieses Issue <a id="%[1]s" href="#%[1]s">%[2]s</a> aus einem Commit referenziert`
|
issues.commit_ref_at=`hat dieses Issue %s aus einem Commit referenziert`
|
||||||
issues.ref_issue_from=`<a href="%[3]s">hat</a> <a id="%[1]s" href="#%[1]s">%[2]s</a> <a href="%[3]s">auf dieses Issue verwiesen %[4]s</a>`
|
issues.ref_issue_from=`<a href="%[2]s">auf dieses Issue verwiesen %[3]s</a> %[1]s`
|
||||||
issues.ref_pull_from=`<a href="%[3]s">hat</a> <a id="%[1]s" href="#%[1]s">%[2]s</a> <a href="%[3]s">auf diesen Pull-Request verwiesen %[4]s</a>`
|
issues.ref_pull_from=`<a href="%[2]s">referenzierte diesen Pull-Request %[3]s</a> %[1]s`
|
||||||
issues.ref_closing_from=`<a href="%[3]s">hat</a> <a id="%[1]s" href="#%[1]s">%[2]s</a> <a href="%[3]s">in einem Pull-Request %[4]s auf dieses Issue verwiesen, welcher es schließen wird</a>`
|
issues.ref_closing_from=`<a href="%[2]s">referenzierte dieses Issue aus einem Pull-Request %[3]s der es schließen wird</a>, %[1]s`
|
||||||
issues.ref_reopening_from=`<a href="%[3]s">hat</a> <a id="%[1]s" href="#%[1]s">%[2]s</a> <a href="%[3]s"> in einem Pull-Request %[4]s auf dieses Issue verwiesen, welcher es erneut öffnen wird</a>`
|
issues.ref_reopening_from=`<a href="%[2]s">referenzierte dieses Issue aus einem Pull-Request %[3]s der es wieder öffnen wird</a>, %[1]s`
|
||||||
issues.ref_closed_from=`<a href="%[3]s">hat dieses Issue %[4]s geschlossen</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.ref_closed_from=`<a href="%[3]s">hat dieses Issue %[4]s geschlossen</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||||
issues.ref_reopened_from=`<a href="%[3]s">hat dieses Issue %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a> wieder geöffnet`
|
issues.ref_reopened_from=`<a href="%[3]s">hat dieses Issue %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a> wieder geöffnet`
|
||||||
issues.ref_from=`von %[1]s`
|
issues.ref_from=`von %[1]s`
|
||||||
|
@ -1673,12 +1675,12 @@ issues.role.first_time_contributor=Erstmaliger Mitwirkender
|
||||||
issues.role.first_time_contributor_helper=Dies ist der erste Beitrag dieses Benutzers zum Repository.
|
issues.role.first_time_contributor_helper=Dies ist der erste Beitrag dieses Benutzers zum Repository.
|
||||||
issues.role.contributor=Mitwirkender
|
issues.role.contributor=Mitwirkender
|
||||||
issues.role.contributor_helper=Dieser Benutzer hat schon zuvor zu dem Repository beigetragen.
|
issues.role.contributor_helper=Dieser Benutzer hat schon zuvor zu dem Repository beigetragen.
|
||||||
issues.re_request_review=Review erneut anfordern
|
issues.re_request_review=Sichtung erneut anfordern
|
||||||
issues.is_stale=Seit diesem Review gab es Änderungen an diesem PR
|
issues.is_stale=Seit dieser Sichtung gab es Änderungen an diesem PR
|
||||||
issues.remove_request_review=Review-Anfrage entfernen
|
issues.remove_request_review=Sichtungsanfrage entfernen
|
||||||
issues.remove_request_review_block=Review-Anfrage kann nicht entfernt werden
|
issues.remove_request_review_block=Sichtungsanfrage kann nicht entfernt werden
|
||||||
issues.dismiss_review=Review verwerfen
|
issues.dismiss_review=Sichtung verwerfen
|
||||||
issues.dismiss_review_warning=Bist du dir sicher, dass du dieses Review verwerfen willst?
|
issues.dismiss_review_warning=Bist du dir sicher, dass du diese Sichtung verwerfen willst?
|
||||||
issues.sign_in_require_desc=<a href="%s">Anmelden</a>, um an der Diskussion teilzunehmen.
|
issues.sign_in_require_desc=<a href="%s">Anmelden</a>, um an der Diskussion teilzunehmen.
|
||||||
issues.edit=Bearbeiten
|
issues.edit=Bearbeiten
|
||||||
issues.cancel=Abbrechen
|
issues.cancel=Abbrechen
|
||||||
|
@ -1809,20 +1811,20 @@ issues.dependency.add_error_dep_not_same_repo=Beide Issues müssen sich im selbe
|
||||||
issues.review.self.approval=Du kannst nicht dein eigenen Pull-Request genehmigen.
|
issues.review.self.approval=Du kannst nicht dein eigenen Pull-Request genehmigen.
|
||||||
issues.review.self.rejection=Du kannst keine Änderungen an deinem eigenen Pull-Request anfragen.
|
issues.review.self.rejection=Du kannst keine Änderungen an deinem eigenen Pull-Request anfragen.
|
||||||
issues.review.approve=hat die Änderungen %s genehmigt
|
issues.review.approve=hat die Änderungen %s genehmigt
|
||||||
issues.review.comment=hat %s gereviewt
|
issues.review.comment=hat %s überprüft
|
||||||
issues.review.dismissed=verwarf %ss Review %s
|
issues.review.dismissed=verwarf %ss Review %s
|
||||||
issues.review.dismissed_label=Verworfen
|
issues.review.dismissed_label=Verworfen
|
||||||
issues.review.left_comment=hat einen Kommentar hinterlassen
|
issues.review.left_comment=hat einen Kommentar hinterlassen
|
||||||
issues.review.content.empty=Du musst einen Kommentar hinterlassen, der die gewünschte(n) Änderung(en) beschreibt.
|
issues.review.content.empty=Du musst einen Kommentar hinterlassen, der die gewünschte(n) Änderung(en) beschreibt.
|
||||||
issues.review.reject=hat %s Änderungen angefragt
|
issues.review.reject=hat %s Änderungen angefragt
|
||||||
issues.review.wait=wurde für ein Review %s angefragt
|
issues.review.wait=wurde für eine Sichtung von %s angefragt
|
||||||
issues.review.add_review_request=hat ein Review von %[1]s %[2]s angefragt
|
issues.review.add_review_request=hat eine Sichtung von %[1]s %[2]s angefragt
|
||||||
issues.review.remove_review_request=hat die Aufforderung zum Review an %[1]s %[2]s entfernt
|
issues.review.remove_review_request=hat die Sichtungsanfrage an %[1]s %[2]s entfernt
|
||||||
issues.review.remove_review_request_self=hat das Review verweigert %s
|
issues.review.remove_review_request_self=hat die Sichtung %s verweigert
|
||||||
issues.review.pending=Ausstehend
|
issues.review.pending=Ausstehend
|
||||||
issues.review.pending.tooltip=Dieser Kommentar ist derzeit nicht für andere Benutzer sichtbar. Um deine ausstehenden Kommentare einzureichen, wähle „%s“ -> „%s/%s/%s“ oben auf der Seite.
|
issues.review.pending.tooltip=Dieser Kommentar ist derzeit nicht für andere Benutzer sichtbar. Um deine ausstehenden Kommentare einzureichen, wähle „%s“ -> „%s/%s/%s“ oben auf der Seite.
|
||||||
issues.review.review=Review
|
issues.review.review=Review
|
||||||
issues.review.reviewers=Reviewer
|
issues.review.reviewers=Prüfer
|
||||||
issues.review.outdated=Veraltet
|
issues.review.outdated=Veraltet
|
||||||
issues.review.outdated_description=Der Inhalt hat sich geändert, seit dieser Kommentar abgegeben wurde
|
issues.review.outdated_description=Der Inhalt hat sich geändert, seit dieser Kommentar abgegeben wurde
|
||||||
issues.review.option.show_outdated_comments=Veraltete Kommentare anzeigen
|
issues.review.option.show_outdated_comments=Veraltete Kommentare anzeigen
|
||||||
|
@ -1833,7 +1835,7 @@ issues.review.show_resolved=Erledigte anzeigen
|
||||||
issues.review.hide_resolved=Erledigte ausblenden
|
issues.review.hide_resolved=Erledigte ausblenden
|
||||||
issues.review.resolve_conversation=Diskussion als „erledigt“ markieren
|
issues.review.resolve_conversation=Diskussion als „erledigt“ markieren
|
||||||
issues.review.un_resolve_conversation=Diskussion als „nicht erledigt“ markieren
|
issues.review.un_resolve_conversation=Diskussion als „nicht erledigt“ markieren
|
||||||
issues.review.resolved_by=markierte diese Unterhaltung als gelöst
|
issues.review.resolved_by=markierte diese Unterhaltung als „erledigt“
|
||||||
issues.assignee.error=Aufgrund eines unerwarteten Fehlers konnten nicht alle Zuständigen hinzugefügt werden.
|
issues.assignee.error=Aufgrund eines unerwarteten Fehlers konnten nicht alle Zuständigen hinzugefügt werden.
|
||||||
issues.reference_issue.body=Beschreibung
|
issues.reference_issue.body=Beschreibung
|
||||||
issues.content_history.deleted=gelöscht
|
issues.content_history.deleted=gelöscht
|
||||||
|
@ -1847,7 +1849,7 @@ issues.reference_link=Referenz: %s
|
||||||
compare.compare_base=Basis
|
compare.compare_base=Basis
|
||||||
compare.compare_head=vergleichen
|
compare.compare_head=vergleichen
|
||||||
|
|
||||||
pulls.desc=Pull-Requests und Code-Reviews aktivieren.
|
pulls.desc=Pull-Requests und Code-Sichtungen aktivieren.
|
||||||
pulls.new=Neuer Pull-Request
|
pulls.new=Neuer Pull-Request
|
||||||
pulls.view=Pull-Request ansehen
|
pulls.view=Pull-Request ansehen
|
||||||
pulls.compare_changes=Neuer Pull-Request
|
pulls.compare_changes=Neuer Pull-Request
|
||||||
|
@ -1856,7 +1858,7 @@ pulls.allow_edits_from_maintainers_desc=Nutzer mit Schreibzugriff auf den Basisb
|
||||||
pulls.allow_edits_from_maintainers_err=Aktualisieren fehlgeschlagen
|
pulls.allow_edits_from_maintainers_err=Aktualisieren fehlgeschlagen
|
||||||
pulls.compare_changes_desc=Wähle den Zielbranch, in das zusammengeführt werden soll, und den Quellbranch, von dem gepullt werden soll, aus.
|
pulls.compare_changes_desc=Wähle den Zielbranch, in das zusammengeführt werden soll, und den Quellbranch, von dem gepullt werden soll, aus.
|
||||||
pulls.has_viewed_file=Gesehen
|
pulls.has_viewed_file=Gesehen
|
||||||
pulls.has_changed_since_last_review=Seit deinem letzten Review geändert
|
pulls.has_changed_since_last_review=Seit deiner letzten Sichtung geändert
|
||||||
pulls.viewed_files_label=%[1]d / %[2]d Dateien betrachtet
|
pulls.viewed_files_label=%[1]d / %[2]d Dateien betrachtet
|
||||||
pulls.expand_files=Alle Dateien ausklappen
|
pulls.expand_files=Alle Dateien ausklappen
|
||||||
pulls.collapse_files=Alle Dateien einklappen
|
pulls.collapse_files=Alle Dateien einklappen
|
||||||
|
@ -1867,11 +1869,11 @@ pulls.switch_head_and_base=Head und Base vertauschen
|
||||||
pulls.filter_branch=Branch filtern
|
pulls.filter_branch=Branch filtern
|
||||||
pulls.no_results=Keine Ergebnisse verfügbar.
|
pulls.no_results=Keine Ergebnisse verfügbar.
|
||||||
pulls.show_all_commits=Alle Commits anzeigen
|
pulls.show_all_commits=Alle Commits anzeigen
|
||||||
pulls.show_changes_since_your_last_review=Zeige Änderungen seit deinem letzten Review
|
pulls.show_changes_since_your_last_review=Zeige Änderungen seit deiner letzten Sichtung
|
||||||
pulls.showing_only_single_commit=Nur Änderungen aus Commit %[1]s werden angezeigt
|
pulls.showing_only_single_commit=Nur Änderungen aus Commit %[1]s werden angezeigt
|
||||||
pulls.showing_specified_commit_range=Zeige nur die Änderungen zwischen %[1]s..%[2]s
|
pulls.showing_specified_commit_range=Zeige nur die Änderungen zwischen %[1]s..%[2]s
|
||||||
pulls.select_commit_hold_shift_for_range=Commit auswählen. Halte Shift + klicke, um eine Reihe auszuwählen
|
pulls.select_commit_hold_shift_for_range=Commit auswählen. Halte Shift + klicke, um eine Reihe auszuwählen
|
||||||
pulls.review_only_possible_for_full_diff=Ein Review ist nur möglich, wenn das vollständige Diff angezeigt wird
|
pulls.review_only_possible_for_full_diff=Eine Sichtung ist nur möglich, wenn der vollständige Diff angezeigt wird
|
||||||
pulls.filter_changes_by_commit=Nach Commit filtern
|
pulls.filter_changes_by_commit=Nach Commit filtern
|
||||||
pulls.nothing_to_compare=Diese Branches sind identisch. Es muss kein Pull-Request erstellt werden.
|
pulls.nothing_to_compare=Diese Branches sind identisch. Es muss kein Pull-Request erstellt werden.
|
||||||
pulls.nothing_to_compare_and_allow_empty_pr=Diese Branches sind gleich. Der Pull-Request wird leer sein.
|
pulls.nothing_to_compare_and_allow_empty_pr=Diese Branches sind gleich. Der Pull-Request wird leer sein.
|
||||||
|
@ -1905,8 +1907,8 @@ pulls.required_status_check_failed=Einige erforderliche Prüfungen waren nicht e
|
||||||
pulls.required_status_check_missing=Einige erforderliche Prüfungen fehlen.
|
pulls.required_status_check_missing=Einige erforderliche Prüfungen fehlen.
|
||||||
pulls.required_status_check_administrator=Als Administrator kannst du diesen Pull-Request weiterhin zusammenführen.
|
pulls.required_status_check_administrator=Als Administrator kannst du diesen Pull-Request weiterhin zusammenführen.
|
||||||
pulls.blocked_by_approvals=Dieser Pull-Request hat noch nicht genügend Genehmigungen. %d von %d Genehmigungen erteilt.
|
pulls.blocked_by_approvals=Dieser Pull-Request hat noch nicht genügend Genehmigungen. %d von %d Genehmigungen erteilt.
|
||||||
pulls.blocked_by_rejection=Dieser Pull-Request hat Änderungen, die von einem offiziellen Reviewer angefragt wurden.
|
pulls.blocked_by_rejection=Dieser Pull-Request hat Änderungen, die von einem offiziellen Prüfer angefragt wurden.
|
||||||
pulls.blocked_by_official_review_requests=Dieser Pull-Request ist blockiert, weil ihm die Genehmigung von einem oder mehreren offiziellen Reviewern fehlt.
|
pulls.blocked_by_official_review_requests=Dieser Pull-Request ist blockiert, weil ihm die Genehmigung von einem oder mehreren offiziellen Prüfern fehlt.
|
||||||
pulls.blocked_by_outdated_branch=Dieser Pull-Request ist blockiert, da er veraltet ist.
|
pulls.blocked_by_outdated_branch=Dieser Pull-Request ist blockiert, da er veraltet ist.
|
||||||
pulls.blocked_by_changed_protected_files_1=Dieser Pull-Request ist blockiert, weil er eine geschützte Datei ändert:
|
pulls.blocked_by_changed_protected_files_1=Dieser Pull-Request ist blockiert, weil er eine geschützte Datei ändert:
|
||||||
pulls.blocked_by_changed_protected_files_n=Dieser Pull-Request ist blockiert, weil er geschützte Dateien ändert:
|
pulls.blocked_by_changed_protected_files_n=Dieser Pull-Request ist blockiert, weil er geschützte Dateien ändert:
|
||||||
|
@ -1919,14 +1921,14 @@ pulls.approve_count_1=%d Genehmigung
|
||||||
pulls.approve_count_n=%d Genehmigungen
|
pulls.approve_count_n=%d Genehmigungen
|
||||||
pulls.reject_count_1=%d Änderungsanfrage
|
pulls.reject_count_1=%d Änderungsanfrage
|
||||||
pulls.reject_count_n=%d Änderungsanfragen
|
pulls.reject_count_n=%d Änderungsanfragen
|
||||||
pulls.waiting_count_1=%d wartendes Review
|
pulls.waiting_count_1=%d wartende Sichtung
|
||||||
pulls.waiting_count_n=%d wartende Reviews
|
pulls.waiting_count_n=%d wartende Sichtungen
|
||||||
pulls.wrong_commit_id=die Commit-ID muss eine Commit-ID auf dem Zielbranch sein
|
pulls.wrong_commit_id=die Commit-ID muss eine Commit-ID auf dem Zielbranch sein
|
||||||
|
|
||||||
pulls.no_merge_desc=Dieser Pull-Request kann nicht zusammengeführt werden, da alle Repository-Merge-Optionen deaktiviert sind.
|
pulls.no_merge_desc=Dieser Pull-Request kann nicht zusammengeführt werden, da alle Repository-Merge-Optionen deaktiviert sind.
|
||||||
pulls.no_merge_helper=Aktiviere Mergeoptionen in den Repositoryeinstellungen oder führe den Pull-Request manuell zusammen.
|
pulls.no_merge_helper=Aktiviere Mergeoptionen in den Repositoryeinstellungen oder führe den Pull-Request manuell zusammen.
|
||||||
pulls.no_merge_wip=Dieser Pull-Request kann nicht zusammengeführt werden, da er als „Work in Progress“ (in Bearbeitung) markiert ist.
|
pulls.no_merge_wip=Dieser Pull-Request kann nicht zusammengeführt werden, da er als „Work in Progress“ (in Bearbeitung) markiert ist.
|
||||||
pulls.no_merge_not_ready=Dieser Pull-Request kann nicht zusammengeführt werden, überprüfe den Reviewstatus und die Statusprüfungen.
|
pulls.no_merge_not_ready=Dieser Pull-Request kann nicht zusammengeführt werden, überprüfe den Sichtungsstatus und die Statusprüfungen.
|
||||||
pulls.no_merge_access=Du bist nicht berechtigt, diesen Pull-Request zusammenzuführen.
|
pulls.no_merge_access=Du bist nicht berechtigt, diesen Pull-Request zusammenzuführen.
|
||||||
pulls.merge_pull_request=Merge-Commit erstellen
|
pulls.merge_pull_request=Merge-Commit erstellen
|
||||||
pulls.rebase_merge_pull_request=Rebasen und dann fast-forwarden
|
pulls.rebase_merge_pull_request=Rebasen und dann fast-forwarden
|
||||||
|
@ -1962,8 +1964,8 @@ pulls.update_branch_success=Branch-Aktualisierung erfolgreich
|
||||||
pulls.update_not_allowed=Du hast keine Berechtigung, den Branch zu updaten
|
pulls.update_not_allowed=Du hast keine Berechtigung, den Branch zu updaten
|
||||||
pulls.outdated_with_base_branch=Dieser Branch enthält nicht die neusten Commits des Basis-Branches
|
pulls.outdated_with_base_branch=Dieser Branch enthält nicht die neusten Commits des Basis-Branches
|
||||||
pulls.close=Pull-Request schließen
|
pulls.close=Pull-Request schließen
|
||||||
pulls.closed_at=`hat diesen Pull-Request <a id="%[1]s" href="#%[1]s">%[2]s</a> geschlossen`
|
pulls.closed_at=`hat diesen Pull-Request %s geschlossen`
|
||||||
pulls.reopened_at=`hat diesen Pull-Request <a id="%[1]s" href="#%[1]s">%[2]s</a> wieder geöffnet`
|
pulls.reopened_at=`hat diesen Pull-Request %s wieder geöffnet`
|
||||||
pulls.clear_merge_message=Merge-Nachricht löschen
|
pulls.clear_merge_message=Merge-Nachricht löschen
|
||||||
pulls.clear_merge_message_hint=Das Löschen der Merge-Nachricht wird nur den Inhalt der Commit-Nachricht entfernen und generierte Git-Trailer wie „Co-Authored-By …“ erhalten.
|
pulls.clear_merge_message_hint=Das Löschen der Merge-Nachricht wird nur den Inhalt der Commit-Nachricht entfernen und generierte Git-Trailer wie „Co-Authored-By …“ erhalten.
|
||||||
|
|
||||||
|
@ -2202,7 +2204,7 @@ settings.tracker_issue_style.numeric=Numerisch
|
||||||
settings.tracker_issue_style.alphanumeric=Alphanumerisch
|
settings.tracker_issue_style.alphanumeric=Alphanumerisch
|
||||||
settings.tracker_issue_style.regexp=Regulärer Ausdruck
|
settings.tracker_issue_style.regexp=Regulärer Ausdruck
|
||||||
settings.tracker_issue_style.regexp_pattern=Regulärer Ausdruck
|
settings.tracker_issue_style.regexp_pattern=Regulärer Ausdruck
|
||||||
settings.tracker_issue_style.regexp_pattern_desc=Die erste gecapturte Gruppe wird statt <code>{index}</code> verwendet.
|
settings.tracker_issue_style.regexp_pattern_desc=Die erste gefundene Gruppe wird statt <code>{index}</code> verwendet.
|
||||||
settings.tracker_url_format_desc=Du kannst die Platzhalter <code>{user}</code>, <code>{repo}</code>, <code>{index}</code> für den Benutzernamen, den Namen des Repositorys und die Issue-Nummer verwenden.
|
settings.tracker_url_format_desc=Du kannst die Platzhalter <code>{user}</code>, <code>{repo}</code>, <code>{index}</code> für den Benutzernamen, den Namen des Repositorys und die Issue-Nummer verwenden.
|
||||||
settings.enable_timetracker=Zeiterfassung aktivieren
|
settings.enable_timetracker=Zeiterfassung aktivieren
|
||||||
settings.allow_only_contributors_to_track_time=Nur Mitarbeitern erlauben, die Zeiterfassung zu nutzen
|
settings.allow_only_contributors_to_track_time=Nur Mitarbeitern erlauben, die Zeiterfassung zu nutzen
|
||||||
|
@ -2261,14 +2263,14 @@ settings.trust_model.collaborator=Mitarbeiter
|
||||||
settings.trust_model.collaborator.long=Mitarbeiter: Vertraue Signaturen von Mitarbeitern
|
settings.trust_model.collaborator.long=Mitarbeiter: Vertraue Signaturen von Mitarbeitern
|
||||||
settings.trust_model.collaborator.desc=Gültige Signaturen von Mitarbeitern dieses Projekts werden als „vertrauenswürdig“ markiert (egal, ob sie mit dem Committer übereinstimmen oder nicht). Andernfalls werden gültige Signaturen als „nicht vertrauenswürdig“ markiert, falls die Signatur zum Committer passt, ansonsten werden sie als „nicht übereinstimmend“ markiert.
|
settings.trust_model.collaborator.desc=Gültige Signaturen von Mitarbeitern dieses Projekts werden als „vertrauenswürdig“ markiert (egal, ob sie mit dem Committer übereinstimmen oder nicht). Andernfalls werden gültige Signaturen als „nicht vertrauenswürdig“ markiert, falls die Signatur zum Committer passt, ansonsten werden sie als „nicht übereinstimmend“ markiert.
|
||||||
settings.trust_model.committer=Committer
|
settings.trust_model.committer=Committer
|
||||||
settings.trust_model.committer.long=Committer: Vertraue Signaturen, die zu Committern passen (Dies stimmt mit GitHub überein und zwingt signierte Commits von Forgejo dazu, Forgejo als Committer zu haben)
|
settings.trust_model.committer.long=Committer: Vertraue Signaturen, die zu Committern passen (dies stimmt mit GitHub überein und zwingt signierte Commits von Forgejo dazu, Forgejo als Committer zu haben)
|
||||||
settings.trust_model.committer.desc=Gültige Signaturen werden nur dann als „vertrauenswürdig“ gekennzeichnet, wenn sie mit ihrem Committer übereinstimmen. Ansonsten werden sie als „nicht übereinstimmend“ markiert. Das führt dazu, dass Forgejo auf signierten Commits, bei denen der echte Committer als „Co-authored-by:“ oder „Co-committed-by:“ in der Beschreibung eingetragen wurde, als Committer gilt. Der Forgejo-Standard-Key muss zu einem Benutzer in der Datenbank passen.
|
settings.trust_model.committer.desc=Gültige Signaturen werden nur dann als „vertrauenswürdig“ gekennzeichnet, wenn sie mit ihrem Committer übereinstimmen. Ansonsten werden sie als „nicht übereinstimmend“ markiert. Das führt dazu, dass Forgejo auf signierten Commits, bei denen der echte Committer als „Co-authored-by:“ oder „Co-committed-by:“ in der Beschreibung eingetragen wurde, als Committer gilt. Der Forgejo-Standard-Key muss zu einem Benutzer in der Datenbank passen.
|
||||||
settings.trust_model.collaboratorcommitter=Mitarbeiter+Committer
|
settings.trust_model.collaboratorcommitter=Mitarbeiter+Committer
|
||||||
settings.trust_model.collaboratorcommitter.long=Mitarbeiter+Committer: Signaturen der Mitarbeiter vertrauen die mit dem Committer übereinstimmen
|
settings.trust_model.collaboratorcommitter.long=Mitarbeiter+Committer: Signaturen der Mitarbeiter vertrauen die mit dem Committer übereinstimmen
|
||||||
settings.trust_model.collaboratorcommitter.desc=Gültige Signaturen von Mitarbeitern dieses Projekts werden als „vertrauenswürdig“ markiert, wenn sie mit dem Committer übereinstimmen. Andernfalls werden gültige Signaturen als „nicht vertrauenswürdig“ markiert, wenn die Signatur mit dem Committer übereinstimmt. Ansonsten werden sie als „nicht übereinstimmend“ markiert. Dies zwingt Forgejo, als Committer bei signierten Commits mit dem echten Committer als „Co-Authored-By:“ und „Co-Committed-By:“ im Commit zu markieren. Der Standard-Forgejo-Schlüssel muss mit einem Benutzer in der Datenbank übereinstimmen.
|
settings.trust_model.collaboratorcommitter.desc=Gültige Signaturen von Mitarbeitern dieses Projekts werden als „vertrauenswürdig“ markiert, wenn sie mit dem Committer übereinstimmen. Andernfalls werden gültige Signaturen als „nicht vertrauenswürdig“ markiert, wenn die Signatur mit dem Committer übereinstimmt. Ansonsten werden sie als „nicht übereinstimmend“ markiert. Dies zwingt Forgejo, als Committer bei signierten Commits mit dem echten Committer als „Co-Authored-By:“ und „Co-Committed-By:“ im Commit zu markieren. Der Standard-Forgejo-Schlüssel muss mit einem Benutzer in der Datenbank übereinstimmen.
|
||||||
settings.wiki_delete=Wiki-Daten löschen
|
settings.wiki_delete=Wiki-Daten löschen
|
||||||
settings.wiki_delete_desc=Das Löschen von Wiki-Daten kann nicht rückgängig gemacht werden. Bitte sei vorsichtig.
|
settings.wiki_delete_desc=Das Löschen von Wiki-Daten kann nicht rückgängig gemacht werden. Bitte sei vorsichtig.
|
||||||
settings.wiki_delete_notices_1=– Dies löscht und deaktiviert das Wiki für %s.
|
settings.wiki_delete_notices_1=– Dies wird das Repository-Wiki für %s dauerhaft löschen und deaktivieren.
|
||||||
settings.confirm_wiki_delete=Wiki-Daten löschen
|
settings.confirm_wiki_delete=Wiki-Daten löschen
|
||||||
settings.wiki_deletion_success=Repository-Wiki-Daten wurden gelöscht.
|
settings.wiki_deletion_success=Repository-Wiki-Daten wurden gelöscht.
|
||||||
settings.delete=Dieses Repository löschen
|
settings.delete=Dieses Repository löschen
|
||||||
|
@ -2327,7 +2329,7 @@ settings.add_webhook_desc=Forgejo sendet eine <code>POST</code>-Anfrage mit fest
|
||||||
settings.payload_url=Ziel-URL
|
settings.payload_url=Ziel-URL
|
||||||
settings.http_method=HTTP-Methode
|
settings.http_method=HTTP-Methode
|
||||||
settings.content_type=POST-Content-Type
|
settings.content_type=POST-Content-Type
|
||||||
settings.secret=Secret
|
settings.secret=Geheimnis
|
||||||
settings.slack_username=Benutzername
|
settings.slack_username=Benutzername
|
||||||
settings.slack_icon_url=Icon-URL
|
settings.slack_icon_url=Icon-URL
|
||||||
settings.slack_color=Farbe
|
settings.slack_color=Farbe
|
||||||
|
@ -2374,12 +2376,12 @@ settings.event_pull_request_milestone=Meilensteine
|
||||||
settings.event_pull_request_milestone_desc=Meilenstein hinzugefügt, entfernt oder bearbeitet.
|
settings.event_pull_request_milestone_desc=Meilenstein hinzugefügt, entfernt oder bearbeitet.
|
||||||
settings.event_pull_request_comment=Kommentare
|
settings.event_pull_request_comment=Kommentare
|
||||||
settings.event_pull_request_comment_desc=Pull-Request-Kommentar angelegt, geändert oder gelöscht.
|
settings.event_pull_request_comment_desc=Pull-Request-Kommentar angelegt, geändert oder gelöscht.
|
||||||
settings.event_pull_request_review=Reviews
|
settings.event_pull_request_review=Sichtungen
|
||||||
settings.event_pull_request_review_desc=Pull-Request genehmigt, abgelehnt oder Review-Kommentare hinterlassen.
|
settings.event_pull_request_review_desc=Pull-Request genehmigt, abgelehnt oder Sichtungskommentare hinterlassen.
|
||||||
settings.event_pull_request_sync=Synchronisiert
|
settings.event_pull_request_sync=Synchronisiert
|
||||||
settings.event_pull_request_sync_desc=Branch automatisch mit Zielbranch aktualisiert.
|
settings.event_pull_request_sync_desc=Branch automatisch mit Zielbranch aktualisiert.
|
||||||
settings.event_pull_request_review_request=Review-Anfragen
|
settings.event_pull_request_review_request=Sichtungsanfragen
|
||||||
settings.event_pull_request_review_request_desc=Überprüfung des Pull-Requests angefragt oder die Anfrage entfernt.
|
settings.event_pull_request_review_request_desc=Pull-Request-Sichtung angefragt oder Sichtungsanfrage entfernt.
|
||||||
settings.event_pull_request_approvals=Genehmigungen zum Pull-Request
|
settings.event_pull_request_approvals=Genehmigungen zum Pull-Request
|
||||||
settings.event_pull_request_merge=Pull-Request-Merge
|
settings.event_pull_request_merge=Pull-Request-Merge
|
||||||
settings.event_package=Paket
|
settings.event_package=Paket
|
||||||
|
@ -2467,11 +2469,11 @@ settings.protect_status_check_matched=Übereinstimmung
|
||||||
settings.protect_invalid_status_check_pattern=Ungültiges Statusprüfungspattern: „%s“.
|
settings.protect_invalid_status_check_pattern=Ungültiges Statusprüfungspattern: „%s“.
|
||||||
settings.protect_no_valid_status_check_patterns=Keine gültigen Statuscheck-Muster.
|
settings.protect_no_valid_status_check_patterns=Keine gültigen Statuscheck-Muster.
|
||||||
settings.protect_required_approvals=Erforderliche Genehmigungen
|
settings.protect_required_approvals=Erforderliche Genehmigungen
|
||||||
settings.protect_required_approvals_desc=Erlaube das Zusammenführen des Pull-Requests nur mit genügend positiven Reviews.
|
settings.protect_required_approvals_desc=Erlaube das Zusammenführen des Pull-Requests nur mit genügend positiven Sichtungen.
|
||||||
settings.protect_approvals_whitelist_enabled=Genehmigungen auf Benutzer oder Teams auf der Positivliste beschränken
|
settings.protect_approvals_whitelist_enabled=Genehmigungen auf Benutzer oder Teams auf der Positivliste beschränken
|
||||||
settings.protect_approvals_whitelist_enabled_desc=Nur Reviews von Benutzern oder Teams auf der Positivliste zählen zu den erforderlichen Genehmigungen. Existiert keine Positivliste, so zählen Reviews von jedem mit Schreibzugriff zu den erforderlichen Genehmigungen.
|
settings.protect_approvals_whitelist_enabled_desc=Nur Sichtungen von Benutzern oder Teams auf der Positivliste zählen zu den erforderlichen Genehmigungen. Existiert keine Positivliste, so zählen Sichtungen von jedem mit Schreibzugriff zu den erforderlichen Genehmigungen.
|
||||||
settings.protect_approvals_whitelist_users=Nutzer, die reviewen dürfen
|
settings.protect_approvals_whitelist_users=Autorisierte Prüfer
|
||||||
settings.protect_approvals_whitelist_teams=Teams, die reviewen dürfen
|
settings.protect_approvals_whitelist_teams=Teams, autorisiert zum Prüfen
|
||||||
settings.dismiss_stale_approvals=Entferne alte Genehmigungen
|
settings.dismiss_stale_approvals=Entferne alte Genehmigungen
|
||||||
settings.dismiss_stale_approvals_desc=Wenn neue Commits gepusht werden, die den Inhalt des Pull-Requests ändern, werden alte Genehmigungen entfernt.
|
settings.dismiss_stale_approvals_desc=Wenn neue Commits gepusht werden, die den Inhalt des Pull-Requests ändern, werden alte Genehmigungen entfernt.
|
||||||
settings.require_signed_commits=Signierte Commits erforderlich
|
settings.require_signed_commits=Signierte Commits erforderlich
|
||||||
|
@ -2489,10 +2491,10 @@ settings.remove_protected_branch_success=Branchschutzregel „%s“ wurde entfer
|
||||||
settings.remove_protected_branch_failed=Entfernen der Branchschutzregel „%s“ fehlgeschlagen.
|
settings.remove_protected_branch_failed=Entfernen der Branchschutzregel „%s“ fehlgeschlagen.
|
||||||
settings.protected_branch_deletion=Branch-Schutz löschen
|
settings.protected_branch_deletion=Branch-Schutz löschen
|
||||||
settings.protected_branch_deletion_desc=Wenn du den Branch-Schutz deaktivierst, können alle Nutzer mit Schreibrechten auf den Branch pushen. Fortfahren?
|
settings.protected_branch_deletion_desc=Wenn du den Branch-Schutz deaktivierst, können alle Nutzer mit Schreibrechten auf den Branch pushen. Fortfahren?
|
||||||
settings.block_rejected_reviews=Zusammenführung bei abgelehnten Reviews blockieren
|
settings.block_rejected_reviews=Zusammenführung bei abgelehnten Sichtungen blockieren
|
||||||
settings.block_rejected_reviews_desc=Merge ist nicht möglich, wenn Änderungen durch offizielle Reviewer angefragt werden, auch wenn genügend Genehmigungen existieren.
|
settings.block_rejected_reviews_desc=Merge ist nicht möglich, wenn Änderungen durch offizielle Prüfer angefragt werden, auch wenn genügend Genehmigungen existieren.
|
||||||
settings.block_on_official_review_requests=Merge bei offiziellen Review-Anfragen blockieren
|
settings.block_on_official_review_requests=Merge bei offiziellen Sichtungsanfragen blockieren
|
||||||
settings.block_on_official_review_requests_desc=Merge ist nicht möglich, wenn offizielle Review-Anfrangen vorliegen, selbst wenn genügend Genehmigungen existieren.
|
settings.block_on_official_review_requests_desc=Merge ist nicht möglich, wenn offizielle Sichtungsanfrangen vorliegen, selbst wenn genügend Genehmigungen existieren.
|
||||||
settings.block_outdated_branch=Merge blockieren, wenn der Pull-Request veraltet ist
|
settings.block_outdated_branch=Merge blockieren, wenn der Pull-Request veraltet ist
|
||||||
settings.block_outdated_branch_desc=Merge ist nicht möglich, wenn der Head-Branch hinter dem Basis-Branch ist.
|
settings.block_outdated_branch_desc=Merge ist nicht möglich, wenn der Head-Branch hinter dem Basis-Branch ist.
|
||||||
settings.default_branch_desc=Wähle einen Standardbranch für Pull-Requests und Code-Commits:
|
settings.default_branch_desc=Wähle einen Standardbranch für Pull-Requests und Code-Commits:
|
||||||
|
@ -2539,7 +2541,7 @@ settings.lfs_filelist=LFS-Dateien, die in diesem Repository gespeichert sind
|
||||||
settings.lfs_no_lfs_files=In diesem Repository sind keine LFS-Dateien gespeichert
|
settings.lfs_no_lfs_files=In diesem Repository sind keine LFS-Dateien gespeichert
|
||||||
settings.lfs_findcommits=Commits finden
|
settings.lfs_findcommits=Commits finden
|
||||||
settings.lfs_lfs_file_no_commits=Keine Commits für diese LFS-Datei gefunden
|
settings.lfs_lfs_file_no_commits=Keine Commits für diese LFS-Datei gefunden
|
||||||
settings.lfs_noattribute=Dieser Pfad hat nicht das sperrbare Attribut im Standard-Branch
|
settings.lfs_noattribute=Dieser Pfad hat nicht das „lockable“-Attribut im Standard-Branch
|
||||||
settings.lfs_delete=LFS-Datei mit OID %s löschen
|
settings.lfs_delete=LFS-Datei mit OID %s löschen
|
||||||
settings.lfs_delete_warning=Das Löschen einer LFS-Datei kann dazu führen, dass „Objekt existiert nicht“-Fehler beim Checkout auftreten. Bist du sicher?
|
settings.lfs_delete_warning=Das Löschen einer LFS-Datei kann dazu führen, dass „Objekt existiert nicht“-Fehler beim Checkout auftreten. Bist du sicher?
|
||||||
settings.lfs_findpointerfiles=Pointer-Dateien finden
|
settings.lfs_findpointerfiles=Pointer-Dateien finden
|
||||||
|
@ -2580,8 +2582,8 @@ diff.show_unified_view=Gesamtansicht
|
||||||
diff.whitespace_button=Leerzeichen
|
diff.whitespace_button=Leerzeichen
|
||||||
diff.whitespace_show_everything=Alle Änderungen anzeigen
|
diff.whitespace_show_everything=Alle Änderungen anzeigen
|
||||||
diff.whitespace_ignore_all_whitespace=Ignoriere Leerzeichen beim Zeilen vergleichen
|
diff.whitespace_ignore_all_whitespace=Ignoriere Leerzeichen beim Zeilen vergleichen
|
||||||
diff.whitespace_ignore_amount_changes=Ignoriere whitespace-Änderungen
|
diff.whitespace_ignore_amount_changes=Änderungen in der Anzahl der Leerzeichen und ähnlichen Zeichen ignorieren
|
||||||
diff.whitespace_ignore_at_eol=Ignoriere EOL-whitespace-Änderungen
|
diff.whitespace_ignore_at_eol=Änderungen an den Leerzeichen und ähnlichen Zeichen am Zeilenende ignorieren
|
||||||
diff.stats_desc=<strong> %d geänderte Dateien</strong> mit <strong>%d neuen</strong> und <strong>%d gelöschten</strong> Zeilen
|
diff.stats_desc=<strong> %d geänderte Dateien</strong> mit <strong>%d neuen</strong> und <strong>%d gelöschten</strong> Zeilen
|
||||||
diff.stats_desc_file=%d Änderungen: %d Ergänzungen und %d Löschungen
|
diff.stats_desc_file=%d Änderungen: %d Ergänzungen und %d Löschungen
|
||||||
diff.bin=BIN
|
diff.bin=BIN
|
||||||
|
@ -2604,11 +2606,11 @@ diff.comment.placeholder=Kommentieren
|
||||||
diff.comment.markdown_info=Styling mit Markdown wird unterstützt.
|
diff.comment.markdown_info=Styling mit Markdown wird unterstützt.
|
||||||
diff.comment.add_single_comment=Einzelnen Kommentar hinzufügen
|
diff.comment.add_single_comment=Einzelnen Kommentar hinzufügen
|
||||||
diff.comment.add_review_comment=Kommentar hinzufügen
|
diff.comment.add_review_comment=Kommentar hinzufügen
|
||||||
diff.comment.start_review=Review starten
|
diff.comment.start_review=Sichtung starten
|
||||||
diff.comment.reply=Antworten
|
diff.comment.reply=Antworten
|
||||||
diff.review=Review abschließen
|
diff.review=Sichtung abschließen
|
||||||
diff.review.header=Review einreichen
|
diff.review.header=Sichtung einreichen
|
||||||
diff.review.placeholder=Kommentar zum Review
|
diff.review.placeholder=Kommentar zur Sichtung
|
||||||
diff.review.comment=Kommentieren
|
diff.review.comment=Kommentieren
|
||||||
diff.review.approve=Genehmigen
|
diff.review.approve=Genehmigen
|
||||||
diff.review.self_reject=Pull-Request-Autoren können keine Änderungen an ihren eigenen Pull-Request anfordern
|
diff.review.self_reject=Pull-Request-Autoren können keine Änderungen an ihren eigenen Pull-Request anfordern
|
||||||
|
@ -2656,7 +2658,7 @@ release.edit_release=Release aktualisieren
|
||||||
release.delete_release=Release löschen
|
release.delete_release=Release löschen
|
||||||
release.delete_tag=Tag löschen
|
release.delete_tag=Tag löschen
|
||||||
release.deletion=Release löschen
|
release.deletion=Release löschen
|
||||||
release.deletion_desc=Beim Entfernen wird ein Release nur von Forgejo gelöscht. Es betrifft weder den Git-Tag, noch den Inhalt des Repos oder seinen Änderungsverlauf. Fortfahren?
|
release.deletion_desc=Beim Entfernen wird ein Release nur von Forgejo gelöscht. Es betrifft weder den Git-Tag noch den Inhalt des Repos oder seinen Änderungsverlauf. Fortfahren?
|
||||||
release.deletion_success=Das Release wurde gelöscht.
|
release.deletion_success=Das Release wurde gelöscht.
|
||||||
release.deletion_tag_desc=Löscht dieses Tag aus dem Projektarchiv. Repository-Inhalt und Verlauf bleiben unverändert. Fortfahren?
|
release.deletion_tag_desc=Löscht dieses Tag aus dem Projektarchiv. Repository-Inhalt und Verlauf bleiben unverändert. Fortfahren?
|
||||||
release.deletion_tag_success=Der Tag wurde gelöscht.
|
release.deletion_tag_success=Der Tag wurde gelöscht.
|
||||||
|
@ -2666,7 +2668,7 @@ release.tag_name_protected=Der Tag-Name ist geschützt.
|
||||||
release.tag_already_exist=Dieser Tag-Name existiert bereits.
|
release.tag_already_exist=Dieser Tag-Name existiert bereits.
|
||||||
release.downloads=Downloads
|
release.downloads=Downloads
|
||||||
release.download_count=Downloads: %s
|
release.download_count=Downloads: %s
|
||||||
release.add_tag_msg=Titel und Beschreibung des Releases als Tag Nachricht verwenden.
|
release.add_tag_msg=Titel und Beschreibung des Releases als Tag-Nachricht verwenden.
|
||||||
release.add_tag=Tag erstellen
|
release.add_tag=Tag erstellen
|
||||||
release.releases_for=Releases für %s
|
release.releases_for=Releases für %s
|
||||||
release.tags_for=Tags für %s
|
release.tags_for=Tags für %s
|
||||||
|
@ -2766,8 +2768,8 @@ wiki.cancel = Abbrechen
|
||||||
settings.wiki_globally_editable = Allen erlauben, das Wiki zu bearbeiten
|
settings.wiki_globally_editable = Allen erlauben, das Wiki zu bearbeiten
|
||||||
settings.protect_branch_name_pattern_desc = Geschützte Branch-Namens-Patterns. Siehe <a href="%s">die Dokumentation</a> für Pattern-Syntax. Beispiele: main, release/**
|
settings.protect_branch_name_pattern_desc = Geschützte Branch-Namens-Patterns. Siehe <a href="%s">die Dokumentation</a> für Pattern-Syntax. Beispiele: main, release/**
|
||||||
settings.ignore_stale_approvals = Abgestandene Genehmigungen ignorieren
|
settings.ignore_stale_approvals = Abgestandene Genehmigungen ignorieren
|
||||||
settings.ignore_stale_approvals_desc = Genehmigungen, welche für ältere Commits gemacht wurden (abgestandene Reviews), nicht in die Gesamtzahl der Genehmigung des PRs mitzählen. Irrelevant, falls abgestandene Reviews bereits verworfen werden.
|
settings.ignore_stale_approvals_desc = Genehmigungen, welche für ältere Commits gemacht wurden (abgestandene Sichtungen), nicht in die Gesamtzahl der Genehmigung des PRs mitzählen. Irrelevant, falls abgestandene Sichtungen bereits verworfen werden.
|
||||||
pulls.commit_ref_at = `hat sich auf diesen Pull-Request von einem Commit <a id="%[1]s" href="#%[1]s">%[2]s</a> bezogen`
|
pulls.commit_ref_at = `referenzierte diesen Pull-Request aus einem Commit %s`
|
||||||
pulls.fast_forward_only_merge_pull_request = Nur Fast-forward
|
pulls.fast_forward_only_merge_pull_request = Nur Fast-forward
|
||||||
pulls.cmd_instruction_checkout_desc = Checke einen neuen Branch aus deinem Projekt-Repository aus und teste die Änderungen.
|
pulls.cmd_instruction_checkout_desc = Checke einen neuen Branch aus deinem Projekt-Repository aus und teste die Änderungen.
|
||||||
pulls.cmd_instruction_merge_title = Zusammenführen
|
pulls.cmd_instruction_merge_title = Zusammenführen
|
||||||
|
@ -2782,7 +2784,7 @@ activity.navbar.contributors = Mitwirkende
|
||||||
contributors.contribution_type.deletions = Löschungen
|
contributors.contribution_type.deletions = Löschungen
|
||||||
contributors.contribution_type.additions = Einfügungen
|
contributors.contribution_type.additions = Einfügungen
|
||||||
contributors.contribution_type.filter_label = Art des Beitrags:
|
contributors.contribution_type.filter_label = Art des Beitrags:
|
||||||
vendored = Vendored
|
vendored = Gevendort
|
||||||
activity.navbar.pulse = Puls
|
activity.navbar.pulse = Puls
|
||||||
pulls.made_using_agit = AGit
|
pulls.made_using_agit = AGit
|
||||||
settings.confirmation_string = Bestätigungsstring
|
settings.confirmation_string = Bestätigungsstring
|
||||||
|
@ -2795,7 +2797,7 @@ pulls.merged_title_desc_one = hat %[1]d Commit von <code>%[2]s</code> nach <code
|
||||||
pulls.title_desc_one = möchte %[1]d Commit von <code>%[2]s</code> nach <code id="%[4]s">%[3]s</code> zusammenführen
|
pulls.title_desc_one = möchte %[1]d Commit von <code>%[2]s</code> nach <code id="%[4]s">%[3]s</code> zusammenführen
|
||||||
open_with_editor = Öffnen mit %s
|
open_with_editor = Öffnen mit %s
|
||||||
commits.search_branch = Dieser Branch
|
commits.search_branch = Dieser Branch
|
||||||
pulls.ready_for_review = Bereit zum Review?
|
pulls.ready_for_review = Bereit zur Sichtung?
|
||||||
settings.rename_branch_failed_protected = Branch %s kann nicht umbenannt werden, weil er ein geschützter Branch ist.
|
settings.rename_branch_failed_protected = Branch %s kann nicht umbenannt werden, weil er ein geschützter Branch ist.
|
||||||
editor.commit_id_not_matching = Die Datei wurde geändert, während du sie bearbeitet hast. Committe in einen neuen Branch, dann führe einen Merge durch.
|
editor.commit_id_not_matching = Die Datei wurde geändert, während du sie bearbeitet hast. Committe in einen neuen Branch, dann führe einen Merge durch.
|
||||||
editor.push_out_of_date = Der Push scheint veraltet zu sein.
|
editor.push_out_of_date = Der Push scheint veraltet zu sein.
|
||||||
|
@ -2824,7 +2826,7 @@ settings.sourcehut_builds.secrets_helper = Dem Job zugriff auf die Build-Geheimn
|
||||||
settings.web_hook_name_sourcehut_builds = SourceHut-Builds
|
settings.web_hook_name_sourcehut_builds = SourceHut-Builds
|
||||||
settings.graphql_url = GraphQL-URL
|
settings.graphql_url = GraphQL-URL
|
||||||
settings.matrix.room_id_helper = Die Raum-ID kann über den Element-Webclient ermittelt werden: Raumeinstellungen > erweitert > interne Raum-ID. Beispielsweise %s.
|
settings.matrix.room_id_helper = Die Raum-ID kann über den Element-Webclient ermittelt werden: Raumeinstellungen > erweitert > interne Raum-ID. Beispielsweise %s.
|
||||||
settings.sourcehut_builds.access_token_helper = Zugangstoken, der die JOBS:RW-Freigabe hat. Generiere auf meta.sr.ht einen <a target="_blank" rel="noopener noreferrer" href="%s">builds.sr.ht-Token</a> oder einen <a target="_blank" rel="noopener noreferrer" href="%s">builds.sr.ht-Token mit Zugriff auf die Secrets</a>.
|
settings.sourcehut_builds.access_token_helper = Zugangstoken, der die JOBS:RW-Freigabe hat. Generiere auf meta.sr.ht einen <a target="_blank" rel="noopener noreferrer" href="%s">builds.sr.ht-Token</a> oder einen <a target="_blank" rel="noopener noreferrer" href="%s">builds.sr.ht-Token mit Zugriff auf die Geheimnisse</a>.
|
||||||
settings.matrix.access_token_helper = Es wird empfohlen, hierfür ein dediziertes Matrix-Konto anzulegen. Der Zugangstoken kann in einem Inkognito-Tab über den Element-Webclient geholt werden: Benutzermenü (oben links) > alle Einstellungen > Hilfe & Info > erweitert > Zugriffstoken (direkt unter der Heim-Server-URL). Schließe dann den Inkognito-Tab (Abmelden würde den Token ungültig machen).
|
settings.matrix.access_token_helper = Es wird empfohlen, hierfür ein dediziertes Matrix-Konto anzulegen. Der Zugangstoken kann in einem Inkognito-Tab über den Element-Webclient geholt werden: Benutzermenü (oben links) > alle Einstellungen > Hilfe & Info > erweitert > Zugriffstoken (direkt unter der Heim-Server-URL). Schließe dann den Inkognito-Tab (Abmelden würde den Token ungültig machen).
|
||||||
release.hide_archive_links = Automatisch generierte Archive verstecken
|
release.hide_archive_links = Automatisch generierte Archive verstecken
|
||||||
release.hide_archive_links_helper = Verstecke automatisch generierte Quellcodearchive für diesen Release. Zum Beispiel, wenn du deine eigenen hochlädst.
|
release.hide_archive_links_helper = Verstecke automatisch generierte Quellcodearchive für diesen Release. Zum Beispiel, wenn du deine eigenen hochlädst.
|
||||||
|
@ -2873,9 +2875,9 @@ mirror_use_ssh.not_available = SSH-Authentifizierung ist nicht verfügbar.
|
||||||
issues.new.assign_to_me = Mir selbst zuweisen
|
issues.new.assign_to_me = Mir selbst zuweisen
|
||||||
issues.all_title = Alle
|
issues.all_title = Alle
|
||||||
settings.discord_icon_url.exceeds_max_length = Die Icon-URL darf eine Länge von 2048 Zeichen nicht überschreiten
|
settings.discord_icon_url.exceeds_max_length = Die Icon-URL darf eine Länge von 2048 Zeichen nicht überschreiten
|
||||||
issues.review.add_review_requests = hat Reviews von %[1]s %[2]s angefragt
|
issues.review.add_review_requests = hat Sichtungen von %[1]s %[2]s angefragt
|
||||||
issues.review.remove_review_requests = hat Aufforderungen zum Review an %[1]s %[2]s entfernt
|
issues.review.remove_review_requests = hat die Sichtungsanfragen an %[1]s %[2]s entfernt
|
||||||
issues.review.add_remove_review_requests = hat Reviews von %[1]s angefragt und hat die Aufforderungen zum Review an %[2]s %[3]s entfernt
|
issues.review.add_remove_review_requests = hat Sichtungen von %[1]s angefragt und die Sichtungsanfragen an %[2]s %[3]s entfernt
|
||||||
pulls.delete_after_merge.head_branch.is_default = Der Head-Branch, den du löschen willst, ist der Standardbranch und kann nicht gelöscht werden.
|
pulls.delete_after_merge.head_branch.is_default = Der Head-Branch, den du löschen willst, ist der Standardbranch und kann nicht gelöscht werden.
|
||||||
pulls.delete_after_merge.head_branch.is_protected = Der Head-Branch, den du löschen willst, ist ein geschützter Branch und kann nicht gelöscht werden.
|
pulls.delete_after_merge.head_branch.is_protected = Der Head-Branch, den du löschen willst, ist ein geschützter Branch und kann nicht gelöscht werden.
|
||||||
pulls.delete_after_merge.head_branch.insufficient_branch = Du hast keine Erlaubnis, den Head-Branch zu löschen.
|
pulls.delete_after_merge.head_branch.insufficient_branch = Du hast keine Erlaubnis, den Head-Branch zu löschen.
|
||||||
|
@ -2883,9 +2885,9 @@ issues.filter_sort.relevance = Relevanz
|
||||||
diff.git-notes.add = Anmerkung hinzufügen
|
diff.git-notes.add = Anmerkung hinzufügen
|
||||||
diff.git-notes.remove-header = Anmerkung entfernen
|
diff.git-notes.remove-header = Anmerkung entfernen
|
||||||
diff.git-notes.remove-body = Diese Anmerkung wird entfernt.
|
diff.git-notes.remove-body = Diese Anmerkung wird entfernt.
|
||||||
issues.num_reviews_one = %d Review
|
issues.num_reviews_one = %d Sichtung
|
||||||
issues.summary_card_alt = Zusammenfassung eines Issues mit dem Titel „%s“ im Repository %s
|
issues.summary_card_alt = Zusammenfassung eines Issues mit dem Titel „%s“ im Repository %s
|
||||||
issues.num_reviews_few = %d Reviews
|
issues.num_reviews_few = %d Sichtungen
|
||||||
editor.add_tmpl.filename = Dateiname
|
editor.add_tmpl.filename = Dateiname
|
||||||
settings.default_update_style_desc = Standard-Aktualisierungsart um Pull-Requests zu aktualisieren, die hinter dem Base-Branch sind.
|
settings.default_update_style_desc = Standard-Aktualisierungsart um Pull-Requests zu aktualisieren, die hinter dem Base-Branch sind.
|
||||||
new_advanced = Erweiterte Einstellungen
|
new_advanced = Erweiterte Einstellungen
|
||||||
|
@ -2902,7 +2904,7 @@ issues.reaction.alt_add = Füge %[1]s Reaktion zum Kommentar hinzu.
|
||||||
issues.reaction.alt_remove = Entferne %[1]s Reaktion von diesem Kommentar.
|
issues.reaction.alt_remove = Entferne %[1]s Reaktion von diesem Kommentar.
|
||||||
summary_card_alt = Zusammenfassungskarte des Repositorys %s
|
summary_card_alt = Zusammenfassungskarte des Repositorys %s
|
||||||
release.summary_card_alt = Übersichtskarte eines Releases mit dem Titel „%s“ im Repository %s
|
release.summary_card_alt = Übersichtskarte eines Releases mit dem Titel „%s“ im Repository %s
|
||||||
archive.pull.noreview = Dieses Repository ist archiviert. Pull-Requests können nicht gereviewt werden.
|
archive.pull.noreview = Dieses Repository ist archiviert. Pull-Requests können nicht überprüft werden.
|
||||||
editor.commit_email = Commit-E-Mail
|
editor.commit_email = Commit-E-Mail
|
||||||
commits.view_single_diff = Änderungen an dieser Datei, die in diesem Commit eingeführt wurden, betrachten
|
commits.view_single_diff = Änderungen an dieser Datei, die in diesem Commit eingeführt wurden, betrachten
|
||||||
pulls.editable = Bearbeitbar
|
pulls.editable = Bearbeitbar
|
||||||
|
@ -2922,7 +2924,7 @@ settings.event_action_success_desc = Action-Run war erfolgreich.
|
||||||
settings.event_action_failure = Fehlschlag
|
settings.event_action_failure = Fehlschlag
|
||||||
settings.event_action_success = Erfolg
|
settings.event_action_success = Erfolg
|
||||||
settings.event_header_action = Action-Run-Ereignisse
|
settings.event_header_action = Action-Run-Ereignisse
|
||||||
settings.event_action_recover_desc = Action-Run war erfolgreich, nachdem der letzte Action-Run im selben Arbeitsablauf fehlgeschlagen ist.
|
settings.event_action_recover_desc = Action-Run war erfolgreich, nachdem der letzte Action-Run im selben Workflow fehlgeschlagen ist.
|
||||||
settings.event_action_recover = Wiederherstellen
|
settings.event_action_recover = Wiederherstellen
|
||||||
issues.filter_type.all_pull_requests = Alle Pull-Requests
|
issues.filter_type.all_pull_requests = Alle Pull-Requests
|
||||||
|
|
||||||
|
@ -3061,8 +3063,8 @@ teams.invite.by=Von %s eingeladen
|
||||||
teams.invite.description=Bitte klicke auf die folgende Schaltfläche, um dem Team beizutreten.
|
teams.invite.description=Bitte klicke auf die folgende Schaltfläche, um dem Team beizutreten.
|
||||||
follow_blocked_user = Du kannst dieser Organisation nicht folgen, weil diese Organisation dich blockiert hat.
|
follow_blocked_user = Du kannst dieser Organisation nicht folgen, weil diese Organisation dich blockiert hat.
|
||||||
open_dashboard = Übersicht öffnen
|
open_dashboard = Übersicht öffnen
|
||||||
settings.change_orgname_redirect_prompt.with_cooldown.one = Der alte Organisationsname ist nach einer Abkühldauer von einem Tag wieder für alle verfügbar. Du kannst den alten Namen während dieser Abkühldauer erneut beanspruchen.
|
settings.change_orgname_redirect_prompt.with_cooldown.one = Der alte Organisationsname ist nach einer Schutzzeit von einem Tag wieder für alle verfügbar. Du kannst den alten Namen während dieser Schutzzeit erneut beanspruchen.
|
||||||
settings.change_orgname_redirect_prompt.with_cooldown.few = Der alte Organisationsname ist nach einer Abkühldauer von %[1]d Tagen wieder für alle verfügbar. Du kannst den alten Namen während dieser Abkühldauer erneut beanspruchen.
|
settings.change_orgname_redirect_prompt.with_cooldown.few = Der alte Organisationsname ist nach einer Schutzzeit von %[1]d Tagen wieder für alle verfügbar. Du kannst den alten Namen während dieser Schutzzeit erneut beanspruchen.
|
||||||
|
|
||||||
[admin]
|
[admin]
|
||||||
dashboard=Übersicht
|
dashboard=Übersicht
|
||||||
|
@ -3116,7 +3118,7 @@ dashboard.repo_health_check=Healthchecks für alle Repositorys ausführen
|
||||||
dashboard.check_repo_stats=Überprüfe alle Repository-Statistiken
|
dashboard.check_repo_stats=Überprüfe alle Repository-Statistiken
|
||||||
dashboard.archive_cleanup=Alte Repository-Archive löschen
|
dashboard.archive_cleanup=Alte Repository-Archive löschen
|
||||||
dashboard.deleted_branches_cleanup=Gelöschte Branches bereinigen
|
dashboard.deleted_branches_cleanup=Gelöschte Branches bereinigen
|
||||||
dashboard.update_migration_poster_id=Migration Poster-IDs updaten
|
dashboard.update_migration_poster_id=Migrations-Poster-IDs aktualisieren
|
||||||
dashboard.git_gc_repos=Garbage-Collection für alle Repositorys ausführen
|
dashboard.git_gc_repos=Garbage-Collection für alle Repositorys ausführen
|
||||||
dashboard.resync_all_sshkeys=Die Datei „.ssh/authorized_keys“ mit Forgejo-SSH-Schlüsseln aktualisieren.
|
dashboard.resync_all_sshkeys=Die Datei „.ssh/authorized_keys“ mit Forgejo-SSH-Schlüsseln aktualisieren.
|
||||||
dashboard.resync_all_sshprincipals=Aktualisiere die Datei „.ssh/authorized_principals“ mit Forgejo-SSH-Principals.
|
dashboard.resync_all_sshprincipals=Aktualisiere die Datei „.ssh/authorized_principals“ mit Forgejo-SSH-Principals.
|
||||||
|
@ -3159,7 +3161,7 @@ dashboard.delete_old_actions=Alle alten Aktivitäten aus der Datenbank löschen
|
||||||
dashboard.delete_old_actions.started=Löschen aller alten Aktivitäten aus der Datenbank gestartet.
|
dashboard.delete_old_actions.started=Löschen aller alten Aktivitäten aus der Datenbank gestartet.
|
||||||
dashboard.update_checker=Update-Checker
|
dashboard.update_checker=Update-Checker
|
||||||
dashboard.delete_old_system_notices=Alle alten Systemmeldungen aus der Datenbank löschen
|
dashboard.delete_old_system_notices=Alle alten Systemmeldungen aus der Datenbank löschen
|
||||||
dashboard.gc_lfs=Garbage-Collection für LFS Meta-Objekte ausführen
|
dashboard.gc_lfs=Garbage-Collection für LFS-Meta-Objekte ausführen
|
||||||
dashboard.stop_zombie_tasks=Zombie-Actions-Aufgaben stoppen
|
dashboard.stop_zombie_tasks=Zombie-Actions-Aufgaben stoppen
|
||||||
dashboard.stop_endless_tasks=Endlose Actions-Aufgaben stoppen
|
dashboard.stop_endless_tasks=Endlose Actions-Aufgaben stoppen
|
||||||
dashboard.cancel_abandoned_jobs=Aufgegebene Actions-Jobs abbrechen
|
dashboard.cancel_abandoned_jobs=Aufgegebene Actions-Jobs abbrechen
|
||||||
|
@ -3335,7 +3337,7 @@ auths.pam_email_domain=PAM-E-Mail-Domain (optional)
|
||||||
auths.oauth2_provider=OAuth2-Anbieter
|
auths.oauth2_provider=OAuth2-Anbieter
|
||||||
auths.oauth2_icon_url=Symbol-URL
|
auths.oauth2_icon_url=Symbol-URL
|
||||||
auths.oauth2_clientID=Client-ID (Schlüssel)
|
auths.oauth2_clientID=Client-ID (Schlüssel)
|
||||||
auths.oauth2_clientSecret=Client-Secret
|
auths.oauth2_clientSecret=Client-Geheimnis
|
||||||
auths.openIdConnectAutoDiscoveryURL=OpenID-Connect-Auto-Discovery-URL
|
auths.openIdConnectAutoDiscoveryURL=OpenID-Connect-Auto-Discovery-URL
|
||||||
auths.oauth2_use_custom_url=Benutzerdefinierte URLs anstelle von Standard-URLs verwenden
|
auths.oauth2_use_custom_url=Benutzerdefinierte URLs anstelle von Standard-URLs verwenden
|
||||||
auths.oauth2_tokenURL=Token-URL
|
auths.oauth2_tokenURL=Token-URL
|
||||||
|
@ -3343,14 +3345,14 @@ auths.oauth2_authURL=Authorisierungs-URL
|
||||||
auths.oauth2_profileURL=Profil-URL
|
auths.oauth2_profileURL=Profil-URL
|
||||||
auths.oauth2_emailURL=E-Mail-URL
|
auths.oauth2_emailURL=E-Mail-URL
|
||||||
auths.skip_local_two_fa=Lokale 2FA überspringen
|
auths.skip_local_two_fa=Lokale 2FA überspringen
|
||||||
auths.skip_local_two_fa_helper=Leer lassen bedeutet, dass lokale User die 2FA immer noch bestehen müssen, um sich anzumelden
|
auths.skip_local_two_fa_helper=Das Leerlassen bedeutet, dass lokale User die 2FA immer noch bestehen müssen, um sich anzumelden
|
||||||
auths.oauth2_tenant=Inhaber
|
auths.oauth2_tenant=Inhaber
|
||||||
auths.oauth2_scopes=Zusätzliche Bereiche
|
auths.oauth2_scopes=Zusätzliche Bereiche
|
||||||
auths.oauth2_required_claim_name=Benötigter Claim-Name
|
auths.oauth2_required_claim_name=Benötigter Claim-Name
|
||||||
auths.oauth2_required_claim_name_helper=Setze diesen Namen, damit Nutzer aus dieser Quelle sich nur anmelden dürfen, wenn sie einen Claim mit diesem Namen besitzen
|
auths.oauth2_required_claim_name_helper=Setze diesen Namen, damit Nutzer aus dieser Quelle sich nur anmelden dürfen, wenn sie einen Claim mit diesem Namen besitzen
|
||||||
auths.oauth2_required_claim_value=Benötigter Claim-Wert
|
auths.oauth2_required_claim_value=Benötigter Claim-Wert
|
||||||
auths.oauth2_required_claim_value_helper=Setze diesen Wert, damit Nutzer aus dieser Quelle sich nur anmelden dürfen, wenn sie einen Claim mit diesem Namen und Wert besitzen
|
auths.oauth2_required_claim_value_helper=Setze diesen Wert, damit Nutzer aus dieser Quelle sich nur anmelden dürfen, wenn sie einen Claim mit diesem Namen und Wert besitzen
|
||||||
auths.oauth2_group_claim_name=Claim-Name, der Gruppennamen für diese Quelle angibt. (Optional)
|
auths.oauth2_group_claim_name=Claim-Name, der Gruppennamen für diese Quelle angibt (optional).
|
||||||
auths.oauth2_admin_group=Gruppen-Claim-Wert für Administratoren (optional – erfordert Claim-Namen oben).
|
auths.oauth2_admin_group=Gruppen-Claim-Wert für Administratoren (optional – erfordert Claim-Namen oben).
|
||||||
auths.oauth2_restricted_group=Gruppen-Claim-Wert für eingeschränkte User. (Optional – erfordert Claim-Namen oben)
|
auths.oauth2_restricted_group=Gruppen-Claim-Wert für eingeschränkte User. (Optional – erfordert Claim-Namen oben)
|
||||||
auths.oauth2_map_group_to_team=Gruppen aus OAuth-Claims den Organisationsteams zuordnen (optional – oben muss der Name des Claims angegeben werden).
|
auths.oauth2_map_group_to_team=Gruppen aus OAuth-Claims den Organisationsteams zuordnen (optional – oben muss der Name des Claims angegeben werden).
|
||||||
|
@ -3395,7 +3397,7 @@ auths.still_in_used=Diese Authentifizierungsquelle wird noch verwendet. Bearbeit
|
||||||
auths.deletion_success=Die Authentifizierungsquelle „%s“ wurde gelöscht.
|
auths.deletion_success=Die Authentifizierungsquelle „%s“ wurde gelöscht.
|
||||||
auths.login_source_exist=Die Authentifizierungsquelle „%s“ existiert bereits.
|
auths.login_source_exist=Die Authentifizierungsquelle „%s“ existiert bereits.
|
||||||
auths.login_source_of_type_exist=Eine Authentifizierungart dieses Typs existiert bereits.
|
auths.login_source_of_type_exist=Eine Authentifizierungart dieses Typs existiert bereits.
|
||||||
auths.unable_to_initialize_openid=OpenID Connect Provider konnte nicht initialisiert werden: %s
|
auths.unable_to_initialize_openid=Provider für OpenID Connect konnte nicht initialisiert werden: %s
|
||||||
auths.invalid_openIdConnectAutoDiscoveryURL=Ungültige Auto-Discovery-URL (dies muss eine gültige URL sein, die mit http:// oder https:// beginnt)
|
auths.invalid_openIdConnectAutoDiscoveryURL=Ungültige Auto-Discovery-URL (dies muss eine gültige URL sein, die mit http:// oder https:// beginnt)
|
||||||
|
|
||||||
config.server_config=Serverkonfiguration
|
config.server_config=Serverkonfiguration
|
||||||
|
@ -3526,7 +3528,7 @@ config.git_pull_timeout=Zeitlimit für Pull
|
||||||
config.git_gc_timeout=Zeitlimit für GC
|
config.git_gc_timeout=Zeitlimit für GC
|
||||||
|
|
||||||
config.log_config=Protokollierungs-Konfiguration
|
config.log_config=Protokollierungs-Konfiguration
|
||||||
config.logger_name_fmt=Logger: %s
|
config.logger_name_fmt=Protokollierer: %s
|
||||||
config.disabled_logger=Deaktiviert
|
config.disabled_logger=Deaktiviert
|
||||||
config.access_log_mode=Zugriffsprotokoll-Modus
|
config.access_log_mode=Zugriffsprotokoll-Modus
|
||||||
config.access_log_template=Zugriffsprotokoll-Vorlage
|
config.access_log_template=Zugriffsprotokoll-Vorlage
|
||||||
|
@ -3650,7 +3652,7 @@ mirror_sync_delete=hat die Referenz des Spiegels <code>%[2]s</code> in <a href="
|
||||||
approve_pull_request=`hat <a href="%[1]s">%[3]s#%[2]s</a> genehmigt`
|
approve_pull_request=`hat <a href="%[1]s">%[3]s#%[2]s</a> genehmigt`
|
||||||
reject_pull_request=`schlug Änderungen für <a href="%[1]s">%[3]s#%[2]s</a> vor`
|
reject_pull_request=`schlug Änderungen für <a href="%[1]s">%[3]s#%[2]s</a> vor`
|
||||||
publish_release=`veröffentlichte Release <a href="%[2]s">%[4]s</a> in <a href="%[1]s">%[3]s</a>`
|
publish_release=`veröffentlichte Release <a href="%[2]s">%[4]s</a> in <a href="%[1]s">%[3]s</a>`
|
||||||
review_dismissed=`verwarf das Review von <b>%[4]s</b> in <a href="%[1]s">%[3]s#%[2]s</a>`
|
review_dismissed=`verwarf die Sichtung von <b>%[4]s</b> in <a href="%[1]s">%[3]s#%[2]s</a>`
|
||||||
review_dismissed_reason=Grund:
|
review_dismissed_reason=Grund:
|
||||||
create_branch=legte den Branch <a href="%[2]s">%[3]s</a> in <a href="%[1]s">%[4]s</a> an
|
create_branch=legte den Branch <a href="%[2]s">%[3]s</a> in <a href="%[1]s">%[4]s</a> an
|
||||||
starred_repo=favorisierte <a href="%[1]s">%[2]s</a>
|
starred_repo=favorisierte <a href="%[1]s">%[2]s</a>
|
||||||
|
@ -3765,9 +3767,9 @@ conda.registry=Richte diese Registry als Conda-Repository in deiner <code>.conda
|
||||||
conda.install=Um das Paket mit Conda zu installieren, führe den folgenden Befehl aus:
|
conda.install=Um das Paket mit Conda zu installieren, führe den folgenden Befehl aus:
|
||||||
container.details.type=Abbildtyp
|
container.details.type=Abbildtyp
|
||||||
container.details.platform=Plattform
|
container.details.platform=Plattform
|
||||||
container.pull=Downloade das Container-Image aus der Kommandozeile:
|
container.pull=Lade das Container-Image von der Kommandozeile aus herunter:
|
||||||
container.digest=Prüfsumme
|
container.digest=Prüfsumme
|
||||||
container.multi_arch=Betriebsystem / Architektur
|
container.multi_arch=Betriebsystem/Architektur
|
||||||
container.layers=Abbildebenen
|
container.layers=Abbildebenen
|
||||||
container.labels=Labels
|
container.labels=Labels
|
||||||
container.labels.key=Schlüssel
|
container.labels.key=Schlüssel
|
||||||
|
@ -3781,7 +3783,7 @@ debian.repository=Repository-Informationen
|
||||||
debian.repository.distributions=Distributionen
|
debian.repository.distributions=Distributionen
|
||||||
debian.repository.components=Komponenten
|
debian.repository.components=Komponenten
|
||||||
debian.repository.architectures=Architekturen
|
debian.repository.architectures=Architekturen
|
||||||
generic.download=Downloade das Paket aus der Kommandozeile:
|
generic.download=Lade das Paket mit der Kommandozeile herunter:
|
||||||
go.install=Installiere das Paket über die Kommandozeile:
|
go.install=Installiere das Paket über die Kommandozeile:
|
||||||
helm.registry=Diese Paketverwaltung über die Kommandozeile einrichten:
|
helm.registry=Diese Paketverwaltung über die Kommandozeile einrichten:
|
||||||
helm.install=Nutze folgenden Befehl, um das Paket zu installieren:
|
helm.install=Nutze folgenden Befehl, um das Paket zu installieren:
|
||||||
|
@ -3813,10 +3815,10 @@ rubygems.install=Um das Paket mit gem zu installieren, führe den folgenden Befe
|
||||||
rubygems.install2=oder füg es zum Gemfile hinzu:
|
rubygems.install2=oder füg es zum Gemfile hinzu:
|
||||||
rubygems.dependencies.runtime=Laufzeitabhängigkeiten
|
rubygems.dependencies.runtime=Laufzeitabhängigkeiten
|
||||||
rubygems.dependencies.development=Entwicklungsabhängigkeiten
|
rubygems.dependencies.development=Entwicklungsabhängigkeiten
|
||||||
rubygems.required.ruby=Benötigt Ruby Version
|
rubygems.required.ruby=Benötigt Ruby-Version
|
||||||
rubygems.required.rubygems=Benötigt RubyGem Version
|
rubygems.required.rubygems=Benötigt RubyGem-Version
|
||||||
swift.registry=Diese Registry über die Kommandozeile einrichten:
|
swift.registry=Diese Registry über die Kommandozeile einrichten:
|
||||||
swift.install=Füge das Paket deiner <code>Package.swift</code> Datei hinzu:
|
swift.install=Füge das Paket deiner <code>Package.swift</code>-Datei hinzu:
|
||||||
swift.install2=und führe den folgenden Befehl aus:
|
swift.install2=und führe den folgenden Befehl aus:
|
||||||
vagrant.install=Um eine Vagrant-Box hinzuzufügen, führe den folgenden Befehl aus:
|
vagrant.install=Um eine Vagrant-Box hinzuzufügen, führe den folgenden Befehl aus:
|
||||||
settings.link=Dieses Paket einem Repository zuweisen
|
settings.link=Dieses Paket einem Repository zuweisen
|
||||||
|
@ -3892,19 +3894,19 @@ alt.repository.architectures = Architekturen
|
||||||
alt.repository.multiple_groups = Dieses Paket ist in verschiedenen Gruppen verfügbar.
|
alt.repository.multiple_groups = Dieses Paket ist in verschiedenen Gruppen verfügbar.
|
||||||
|
|
||||||
[secrets]
|
[secrets]
|
||||||
secrets=Secrets
|
secrets=Geheimnisse
|
||||||
description=Secrets werden an bestimmte Aktionen weitergegeben und können nicht anderweitig ausgelesen werden.
|
description=Geheimnisse werden an bestimmte Aktionen weitergegeben und können nicht anderweitig ausgelesen werden.
|
||||||
none=Noch keine Secrets vorhanden.
|
none=Noch keine Geheimnisse vorhanden.
|
||||||
creation=Secret hinzufügen
|
creation=Geheimnis hinzufügen
|
||||||
creation.name_placeholder=Groß-/Kleinschreibung wird ignoriert, nur alphanumerische Zeichen oder Unterstriche, darf nicht mit GITEA_ oder GITHUB_ beginnen
|
creation.name_placeholder=Groß-/Kleinschreibung wird ignoriert, nur alphanumerische Zeichen oder Unterstriche, darf nicht mit GITEA_ oder GITHUB_ beginnen
|
||||||
creation.value_placeholder=Beliebigen Inhalt eingeben. Leerzeichen am Anfang und Ende werden weggelassen.
|
creation.value_placeholder=Beliebigen Inhalt eingeben. Leerzeichen am Anfang und Ende werden weggelassen.
|
||||||
creation.success=Das Secret „%s“ wurde hinzugefügt.
|
creation.success=Das Geheimnis „%s“ wurde hinzugefügt.
|
||||||
creation.failed=Secret konnte nicht hinzugefügt werden.
|
creation.failed=Geheimnis konnte nicht hinzugefügt werden.
|
||||||
deletion=Secret entfernen
|
deletion=Geheimnis entfernen
|
||||||
deletion.description=Das Entfernen eines Secrets kann nicht rückgängig gemacht werden. Fortfahren?
|
deletion.description=Das Entfernen eines Geheimnisses kann nicht rückgängig gemacht werden. Fortfahren?
|
||||||
deletion.success=Das Secret wurde entfernt.
|
deletion.success=Das Geheimnis wurde entfernt.
|
||||||
deletion.failed=Secret konnte nicht entfernt werden.
|
deletion.failed=Geheimnis konnte nicht entfernt werden.
|
||||||
management=Secrets verwalten
|
management=Geheimnisse verwalten
|
||||||
|
|
||||||
[actions]
|
[actions]
|
||||||
actions=Actions
|
actions=Actions
|
||||||
|
|
|
@ -1626,13 +1626,13 @@ issues.close_comment_issue=Αποστολή σχολίου και κλείσιμ
|
||||||
issues.reopen_issue=Ανοίξτε ξανά
|
issues.reopen_issue=Ανοίξτε ξανά
|
||||||
issues.reopen_comment_issue=Αποστολή σχολίου και επανάνοιγμα ζητήματος
|
issues.reopen_comment_issue=Αποστολή σχολίου και επανάνοιγμα ζητήματος
|
||||||
issues.create_comment=Προσθήκη Σχολίου
|
issues.create_comment=Προσθήκη Σχολίου
|
||||||
issues.closed_at=`αυτό το ζήτημα έκλεισε <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.closed_at=`αυτό το ζήτημα έκλεισε %s`
|
||||||
issues.reopened_at=`ξανά άνοιξε αυτό το ζήτημα <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.reopened_at=`ξανά άνοιξε αυτό το ζήτημα %s`
|
||||||
issues.commit_ref_at=`αναφορά σε αυτό το ζήτημα από την παραπομπή <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.commit_ref_at=`αναφορά σε αυτό το ζήτημα από την παραπομπή %s`
|
||||||
issues.ref_issue_from=`<a href="%[3]s">αναφέρθηκε σε αυτό το ζήτημα %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.ref_issue_from=`<a href="%[2]s">αναφέρθηκε σε αυτό το ζήτημα %[3]s</a> %[1]s`
|
||||||
issues.ref_pull_from=`<a href="%[3]s">αναφέρθηκε σε αυτό το pull request %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.ref_pull_from=`<a href="%[2]s">αναφέρθηκε σε αυτό το pull request %[3]s</a> %[1]s`
|
||||||
issues.ref_closing_from=`<a href="%[3]s">ανέφερε αυτό το ζήτημα σε ένα pull request %[4]s που στοχεύει να κλείσει το ζήτημα</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.ref_closing_from=`<a href="%[2]s">ανέφερε αυτό το ζήτημα σε ένα pull request %[3]s που στοχεύει να κλείσει το ζήτημα</a> %[1]s`
|
||||||
issues.ref_reopening_from=`<a href="%[3]s">αναφέρθηκε σε αυτό το ζήτημα σε ένα pull request %[4]s που θα ξαναανοίξει αυτό το ζήτημα</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.ref_reopening_from=`<a href="%[2]s">αναφέρθηκε σε αυτό το ζήτημα σε ένα pull request %[3]s που θα ξαναανοίξει αυτό το ζήτημα</a> %[1]s`
|
||||||
issues.ref_closed_from=`<a href="%[3]s">έκλεισε αυτό το ζήτημα %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.ref_closed_from=`<a href="%[3]s">έκλεισε αυτό το ζήτημα %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||||
issues.ref_reopened_from=`<a href="%[3]s">άνοιξε ξανά αυτό το ζήτημα %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.ref_reopened_from=`<a href="%[3]s">άνοιξε ξανά αυτό το ζήτημα %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||||
issues.ref_from=`από %[1]s`
|
issues.ref_from=`από %[1]s`
|
||||||
|
@ -1939,8 +1939,8 @@ pulls.update_branch_success=Η ενημέρωση του κλάδου ήταν
|
||||||
pulls.update_not_allowed=Δεν επιτρέπεται να ενημερώσετε τον κλάδο
|
pulls.update_not_allowed=Δεν επιτρέπεται να ενημερώσετε τον κλάδο
|
||||||
pulls.outdated_with_base_branch=Αυτός ο κλάδος δεν είναι ενημερωμένος με τον βασικό κλάδο
|
pulls.outdated_with_base_branch=Αυτός ο κλάδος δεν είναι ενημερωμένος με τον βασικό κλάδο
|
||||||
pulls.close=Κλείσιμο pull request
|
pulls.close=Κλείσιμο pull request
|
||||||
pulls.closed_at=`έκλεισε αυτό το pull request <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
pulls.closed_at=`έκλεισε αυτό το pull request %s`
|
||||||
pulls.reopened_at=`άνοιξε ξανά αυτό το pull request <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
pulls.reopened_at=`άνοιξε ξανά αυτό το pull request %s`
|
||||||
pulls.cmd_instruction_hint=Προβολή οδηγιών γραμμής εντολών
|
pulls.cmd_instruction_hint=Προβολή οδηγιών γραμμής εντολών
|
||||||
pulls.cmd_instruction_checkout_title=Έλεγχος
|
pulls.cmd_instruction_checkout_title=Έλεγχος
|
||||||
pulls.cmd_instruction_checkout_desc=Από το repository του έργου σας, ελέγξτε έναν νέο κλάδο και δοκιμάστε τις αλλαγές.
|
pulls.cmd_instruction_checkout_desc=Από το repository του έργου σας, ελέγξτε έναν νέο κλάδο και δοκιμάστε τις αλλαγές.
|
||||||
|
@ -2720,7 +2720,7 @@ settings.new_owner_blocked_doer = Ο νέος κάτοχος του αποθετ
|
||||||
settings.enter_repo_name = Γράψτε το όνομα του κατόχου και του αποθετηρίου ακριβώς όπως το βλέπετε:
|
settings.enter_repo_name = Γράψτε το όνομα του κατόχου και του αποθετηρίου ακριβώς όπως το βλέπετε:
|
||||||
settings.confirmation_string = Κείμενο επιβεβαίωσης
|
settings.confirmation_string = Κείμενο επιβεβαίωσης
|
||||||
settings.units.overview = Επισκόπηση
|
settings.units.overview = Επισκόπηση
|
||||||
pulls.commit_ref_at = `ανέφερε το pull request στο commit <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
pulls.commit_ref_at = `ανέφερε το pull request στο commit %s`
|
||||||
contributors.contribution_type.filter_label = Είδος συνεισφοράς:
|
contributors.contribution_type.filter_label = Είδος συνεισφοράς:
|
||||||
settings.wiki_rename_branch_main_notices_1 = Αυτή η ενέργεια <strong>ΔΕΝ</strong> αναιρείται.
|
settings.wiki_rename_branch_main_notices_1 = Αυτή η ενέργεια <strong>ΔΕΝ</strong> αναιρείται.
|
||||||
activity.navbar.contributors = Συνεισφέροντες
|
activity.navbar.contributors = Συνεισφέροντες
|
||||||
|
@ -3939,12 +3939,12 @@ submodule=Υπομονάδα
|
||||||
[search]
|
[search]
|
||||||
code_search_unavailable = Η αναζήτηση κώδικα δεν είναι επί του παρόντος διαθέσιμη. Παρακαλώ επικοινωνήστε με τον διαχειριστή σας.
|
code_search_unavailable = Η αναζήτηση κώδικα δεν είναι επί του παρόντος διαθέσιμη. Παρακαλώ επικοινωνήστε με τον διαχειριστή σας.
|
||||||
keyword_search_unavailable = Η αναζήτηση με την χρήση λέξεων-κλειδιών δεν είναι επί του παρόντος διαθέσιμη. Παρακαλώ επικοινωνήστε με τον διαχειριστή σας.
|
keyword_search_unavailable = Η αναζήτηση με την χρήση λέξεων-κλειδιών δεν είναι επί του παρόντος διαθέσιμη. Παρακαλώ επικοινωνήστε με τον διαχειριστή σας.
|
||||||
runner_kind = Αναζήτηση runner...
|
runner_kind = Αναζήτηση runner…
|
||||||
code_search_by_git_grep = Για την αναζήτηση κώδικα, χρησιμοποιείται η εντολή «git grep». Ίσως να παρουσιαστούν καλύτερα αποτελέσματα, αν ο διαχειριστής σας ενεργοποιήσει ένα ευρετήριο για αποθετήρια («Repository Indexer»).
|
code_search_by_git_grep = Για την αναζήτηση κώδικα, χρησιμοποιείται η εντολή «git grep». Ίσως να παρουσιαστούν καλύτερα αποτελέσματα, αν ο διαχειριστής σας ενεργοποιήσει ένα ευρετήριο για αποθετήρια («Repository Indexer»).
|
||||||
package_kind = Αναζήτηση πακέτων…
|
package_kind = Αναζήτηση πακέτων…
|
||||||
project_kind = Αναζήτηση έργων...
|
project_kind = Αναζήτηση έργων…
|
||||||
branch_kind = Αναζήτηση κλάδων…
|
branch_kind = Αναζήτηση κλάδων…
|
||||||
commit_kind = Αναζήτηση commit...
|
commit_kind = Αναζήτηση commit…
|
||||||
no_results = Δεν βρέθηκαν κατάλληλα αποτελέσματα.
|
no_results = Δεν βρέθηκαν κατάλληλα αποτελέσματα.
|
||||||
search = Αναζήτηση…
|
search = Αναζήτηση…
|
||||||
type_tooltip = Είδος αναζήτησης
|
type_tooltip = Είδος αναζήτησης
|
||||||
|
@ -3958,8 +3958,8 @@ org_kind = Αναζήτηση οργανισμών…
|
||||||
team_kind = Αναζήτηση ομαδών…
|
team_kind = Αναζήτηση ομαδών…
|
||||||
code_kind = Αναζήτηση κώδικα…
|
code_kind = Αναζήτηση κώδικα…
|
||||||
exact_tooltip = Να συμπεριληφθούν μόνο αποτελέσματα που ταιριάζουν με τον όρο αναζήτησης
|
exact_tooltip = Να συμπεριληφθούν μόνο αποτελέσματα που ταιριάζουν με τον όρο αναζήτησης
|
||||||
issue_kind = Αναζήτηση ζητημάτων...
|
issue_kind = Αναζήτηση ζητημάτων…
|
||||||
pull_kind = Αναζήτηση pull...
|
pull_kind = Αναζήτηση pull…
|
||||||
exact = Ακριβής
|
exact = Ακριβής
|
||||||
milestone_kind = Αναζήτηση ορόσημων...
|
milestone_kind = Αναζήτηση ορόσημων...
|
||||||
union = Ένωση
|
union = Ένωση
|
||||||
|
|
|
@ -895,6 +895,7 @@ ssh_invalid_token_signature = The provided SSH key, signature or token do not ma
|
||||||
ssh_token_required = You must provide a signature for the below token
|
ssh_token_required = You must provide a signature for the below token
|
||||||
ssh_token = Token
|
ssh_token = Token
|
||||||
ssh_token_help = You can generate a signature using:
|
ssh_token_help = You can generate a signature using:
|
||||||
|
ssh_token_help_ssh_agent = or, if you're using an SSH agent (with the SSH_AUTH_SOCK variable set):
|
||||||
ssh_token_signature = Armored SSH signature
|
ssh_token_signature = Armored SSH signature
|
||||||
key_signature_ssh_placeholder = Begins with "-----BEGIN SSH SIGNATURE-----"
|
key_signature_ssh_placeholder = Begins with "-----BEGIN SSH SIGNATURE-----"
|
||||||
verify_ssh_key_success = SSH key "%s" has been verified.
|
verify_ssh_key_success = SSH key "%s" has been verified.
|
||||||
|
|
|
@ -630,7 +630,7 @@ account = Konto
|
||||||
ssh_gpg_keys = SSH / GPG-ŝlosiloj
|
ssh_gpg_keys = SSH / GPG-ŝlosiloj
|
||||||
twofa_disable = Malaktivigi duoblan aŭtentikigon
|
twofa_disable = Malaktivigi duoblan aŭtentikigon
|
||||||
twofa_enroll = Ŝalti duoblan aŭtentikigon
|
twofa_enroll = Ŝalti duoblan aŭtentikigon
|
||||||
orgs = Mastrumi organizaĵojn
|
orgs = Organizaĵoj
|
||||||
blocked_users = Blokitaj uzantoj
|
blocked_users = Blokitaj uzantoj
|
||||||
profile = Profilo
|
profile = Profilo
|
||||||
ui = Haŭto
|
ui = Haŭto
|
||||||
|
@ -686,7 +686,7 @@ verify_ssh_key_success = SSH-ŝlosilo «%s» jam konfirmiĝis.
|
||||||
edit_oauth2_application = Redakti OAuth2-programon
|
edit_oauth2_application = Redakti OAuth2-programon
|
||||||
gpg_key_deletion = Forigi GPG-ŝlosilon
|
gpg_key_deletion = Forigi GPG-ŝlosilon
|
||||||
gpg_key_matched_identities = Akordaj identecoj:
|
gpg_key_matched_identities = Akordaj identecoj:
|
||||||
manage_themes = Elekti implicitan haŭton
|
manage_themes = Defaŭlta temo
|
||||||
ssh_key_deletion = Forigi SSH-ŝlosilon
|
ssh_key_deletion = Forigi SSH-ŝlosilon
|
||||||
key_state_desc = Ĉi tiu ŝlosilo uziĝis dum la pasintaj 7 tagoj
|
key_state_desc = Ĉi tiu ŝlosilo uziĝis dum la pasintaj 7 tagoj
|
||||||
valid_forever = Validos dumĉiame
|
valid_forever = Validos dumĉiame
|
||||||
|
@ -700,7 +700,7 @@ primary = Ĉefa
|
||||||
ssh_disabled = SSH malaktivigita
|
ssh_disabled = SSH malaktivigita
|
||||||
update_avatar_success = Via profilbildo konserviĝis.
|
update_avatar_success = Via profilbildo konserviĝis.
|
||||||
keep_email_private = Kaŝi retpoŝtadreson
|
keep_email_private = Kaŝi retpoŝtadreson
|
||||||
manage_openid = Mastrumi OpenID-adresojn
|
manage_openid = OpenID-adresoj
|
||||||
delete_current_avatar = Forigi nunan profilbildon
|
delete_current_avatar = Forigi nunan profilbildon
|
||||||
email_preference_set_success = Retpoŝta prefero konserviĝis sukcese.
|
email_preference_set_success = Retpoŝta prefero konserviĝis sukcese.
|
||||||
permissions_access_all = Ĉiu (publika, privata, kaj limigita)
|
permissions_access_all = Ĉiu (publika, privata, kaj limigita)
|
||||||
|
@ -884,9 +884,9 @@ commit_kind = Serĉi enmetojn…
|
||||||
no_results = Ne trovis kongruantajn rezultojn.
|
no_results = Ne trovis kongruantajn rezultojn.
|
||||||
exact = Ĝusta
|
exact = Ĝusta
|
||||||
exact_tooltip = Inkluzivas nur rezultojn kongruantajn kun la ĝustaj serĉoterminoj
|
exact_tooltip = Inkluzivas nur rezultojn kongruantajn kun la ĝustaj serĉoterminoj
|
||||||
issue_kind = Serĉi erarojn...
|
issue_kind = Serĉi erarojn…
|
||||||
regexp_tooltip = Interpretas la serĉoterminoj kiel regulesprimo
|
regexp_tooltip = Interpretas la serĉoterminoj kiel regulesprimo
|
||||||
fuzzy = Svaga
|
fuzzy = Svaga
|
||||||
branch_kind = Serĉi disbranĉigojn…
|
branch_kind = Serĉi disbranĉigojn…
|
||||||
runner_kind = Serĉi rulantojn...
|
runner_kind = Serĉi rulantojn…
|
||||||
pull_kind = Serĉi tirpetojn...
|
pull_kind = Serĉi tirpetojn…
|
|
@ -740,7 +740,7 @@ avatar=Avatar
|
||||||
ssh_gpg_keys=Claves SSH / GPG
|
ssh_gpg_keys=Claves SSH / GPG
|
||||||
social=Redes sociales
|
social=Redes sociales
|
||||||
applications=Aplicaciones
|
applications=Aplicaciones
|
||||||
orgs=Administrar organizaciones
|
orgs=Organizaciones
|
||||||
repos=Repositorios
|
repos=Repositorios
|
||||||
delete=Eliminar cuenta
|
delete=Eliminar cuenta
|
||||||
twofa=Autenticación de dos factores (TOTP)
|
twofa=Autenticación de dos factores (TOTP)
|
||||||
|
@ -1075,8 +1075,8 @@ keep_pronouns_private = Mostrar pronombres solo a personas autenticadas
|
||||||
storage_overview = Resumen del almacenamiento
|
storage_overview = Resumen del almacenamiento
|
||||||
quota.sizes.assets.artifacts = Artefactos
|
quota.sizes.assets.artifacts = Artefactos
|
||||||
quota.sizes.assets.attachments.releases = Archivos adjuntos del lanzamiento
|
quota.sizes.assets.attachments.releases = Archivos adjuntos del lanzamiento
|
||||||
change_username_redirect_prompt.with_cooldown.few = El antiguo nombre de usuario estará disponible para todos después un periodo de tiempo de espera de %[1]d días, aún puedes reclamar el antiguo nombre de usuario durante el periodo de tiempo de espera.
|
change_username_redirect_prompt.with_cooldown.few = El antiguo nombre de usuario estará disponible para todos después un periodo de tiempo de espera de %[1]d días. Aún puedes reclamar el antiguo nombre de usuario durante el periodo de tiempo de espera.
|
||||||
change_username_redirect_prompt.with_cooldown.one = El antiguo nombre de usuario estará disponible para todos después un periodo de tiempo de espera de %[1]d día, aún puedes reclamar el antiguo nombre de usuario durante el periodo de tiempo de espera.
|
change_username_redirect_prompt.with_cooldown.one = El antiguo nombre de usuario estará disponible para todos después un periodo de tiempo de espera de %[1]d día. Aún puedes reclamar el antiguo nombre de usuario durante el periodo de tiempo de espera.
|
||||||
quota.rule.exceeded = Excedido
|
quota.rule.exceeded = Excedido
|
||||||
quota.rule.no_limit = Ilimitado
|
quota.rule.no_limit = Ilimitado
|
||||||
quota.sizes.assets.all = Activos
|
quota.sizes.assets.all = Activos
|
||||||
|
@ -1574,7 +1574,7 @@ issues.remove_ref_at=`eliminó la referencia <b>%s</b> %s`
|
||||||
issues.add_ref_at=`añadió la referencia <b>%s</b> %s`
|
issues.add_ref_at=`añadió la referencia <b>%s</b> %s`
|
||||||
issues.delete_branch_at=`eliminó la rama <b>%s</b> %s`
|
issues.delete_branch_at=`eliminó la rama <b>%s</b> %s`
|
||||||
issues.filter_label=Etiqueta
|
issues.filter_label=Etiqueta
|
||||||
issues.filter_label_exclude=`Usa <code>alt</code> + <code>clic/enter</code> para excluir etiquetas`
|
issues.filter_label_exclude=Usa <kbd>Alt</kbd> + <kbd>Click</kbd> para excluir etiquetas
|
||||||
issues.filter_label_no_select=Todas las etiquetas
|
issues.filter_label_no_select=Todas las etiquetas
|
||||||
issues.filter_label_select_no_label=Sin etiqueta
|
issues.filter_label_select_no_label=Sin etiqueta
|
||||||
issues.filter_milestone=Hito
|
issues.filter_milestone=Hito
|
||||||
|
@ -1648,13 +1648,13 @@ issues.close_comment_issue=Cerrar con comentario
|
||||||
issues.reopen_issue=Reabrir
|
issues.reopen_issue=Reabrir
|
||||||
issues.reopen_comment_issue=Reabrir con comentario
|
issues.reopen_comment_issue=Reabrir con comentario
|
||||||
issues.create_comment=Comentar
|
issues.create_comment=Comentar
|
||||||
issues.closed_at=`cerró esta incidencia <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.closed_at=`cerró esta incidencia %s`
|
||||||
issues.reopened_at=`reabrió esta incidencia <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.reopened_at=`reabrió esta incidencia %s`
|
||||||
issues.commit_ref_at=`referenció esta incidencia en un commit <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.commit_ref_at=`referenció esta incidencia en un commit %s`
|
||||||
issues.ref_issue_from=`<a href="%[3]s">referenció esta incidencia %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.ref_issue_from=`<a href="%[2]s">referenció esta incidencia %[3]s</a> %[1]s`
|
||||||
issues.ref_pull_from=`<a href="%[3]s">referenció este pull request %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.ref_pull_from=`<a href="%[2]s">referenció este pull request %[3]s</a> %[1]s`
|
||||||
issues.ref_closing_from=`<a href="%[3]s">hizo referencia a esta incidencia desde un pull request %[4]s que lo cerrará</a> , <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.ref_closing_from=`<a href="%[2]s">hizo referencia a esta incidencia desde un pull request %[3]s que lo cerrará</a> , %[1]s`
|
||||||
issues.ref_reopening_from=`<a href="%[3]s">hizo referencia a esta incidencia desde un pull request %[4]s que lo reabrirá</a>, <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.ref_reopening_from=`<a href="%[2]s">hizo referencia a esta incidencia desde un pull request %[3]s que lo reabrirá</a>, %[1]s`
|
||||||
issues.ref_closed_from=`<a href="%[3]s">cerró esta incidencia %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.ref_closed_from=`<a href="%[3]s">cerró esta incidencia %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||||
issues.ref_reopened_from=`<a href="%[3]s">reabrió esta incidencia %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.ref_reopened_from=`<a href="%[3]s">reabrió esta incidencia %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||||
issues.ref_from=`de %[1]s`
|
issues.ref_from=`de %[1]s`
|
||||||
|
@ -1959,8 +1959,8 @@ pulls.update_branch_success=La actualización de la rama ha finalizado correctam
|
||||||
pulls.update_not_allowed=No tiene permisos para actualizar esta rama
|
pulls.update_not_allowed=No tiene permisos para actualizar esta rama
|
||||||
pulls.outdated_with_base_branch=Esta rama está desactualizada con la rama base
|
pulls.outdated_with_base_branch=Esta rama está desactualizada con la rama base
|
||||||
pulls.close=Cerrar pull request
|
pulls.close=Cerrar pull request
|
||||||
pulls.closed_at=`cerró este pull request <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
pulls.closed_at=`cerró este pull request %s`
|
||||||
pulls.reopened_at=`reabrió este pull request <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
pulls.reopened_at=`reabrió este pull request %s`
|
||||||
pulls.clear_merge_message=Borrar mensaje de fusión
|
pulls.clear_merge_message=Borrar mensaje de fusión
|
||||||
pulls.clear_merge_message_hint=Limpiar el mensaje de fusión solo eliminará el contenido del mensaje de commit y mantendrá frases generadas como "Co-Autorizado por …".
|
pulls.clear_merge_message_hint=Limpiar el mensaje de fusión solo eliminará el contenido del mensaje de commit y mantendrá frases generadas como "Co-Autorizado por …".
|
||||||
|
|
||||||
|
@ -2789,7 +2789,7 @@ pulls.status_checks_hide_all = Ocultar todas las verificaciones
|
||||||
settings.federation_not_enabled = La federación no está habilitada en tu instancia.
|
settings.federation_not_enabled = La federación no está habilitada en tu instancia.
|
||||||
wiki.search = Buscar en wiki
|
wiki.search = Buscar en wiki
|
||||||
pulls.status_checks_show_all = Mostrar todas las verificaciones
|
pulls.status_checks_show_all = Mostrar todas las verificaciones
|
||||||
pulls.commit_ref_at = `hizo referencia a este pull request desde un commit <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
pulls.commit_ref_at = `hizo referencia a este pull request desde un commit %s`
|
||||||
pulls.cmd_instruction_merge_title = Fusionar
|
pulls.cmd_instruction_merge_title = Fusionar
|
||||||
contributors.contribution_type.deletions = Eliminaciones
|
contributors.contribution_type.deletions = Eliminaciones
|
||||||
contributors.contribution_type.filter_label = Tipo de contribución:
|
contributors.contribution_type.filter_label = Tipo de contribución:
|
||||||
|
@ -2888,6 +2888,9 @@ summary_card_alt = Tarjeta de resumen del repositorio %s
|
||||||
settings.pull_mirror_sync_quota_exceeded = Cuota excedida, no se empujan los cambios.
|
settings.pull_mirror_sync_quota_exceeded = Cuota excedida, no se empujan los cambios.
|
||||||
archive.nocomment = No es posible hacer comentarios porque el repositorio está archivado.
|
archive.nocomment = No es posible hacer comentarios porque el repositorio está archivado.
|
||||||
|
|
||||||
|
sync_fork.branch_behind_one = Esta rama esta %[1]d cambios detrás de %[2]s
|
||||||
|
sync_fork.branch_behind_few = Esta rama está %[1]d confirmaciones detrás de %[2]s
|
||||||
|
|
||||||
[graphs]
|
[graphs]
|
||||||
component_loading = Cargando %s…
|
component_loading = Cargando %s…
|
||||||
component_loading_failed = No se pudo cargar %s
|
component_loading_failed = No se pudo cargar %s
|
||||||
|
|
|
@ -1,67 +1,67 @@
|
||||||
[common]
|
[common]
|
||||||
tracked_time_summary = Kokkuvõte jälgitavast ajast, mis põhineb probleemide nimekirja filtritel
|
tracked_time_summary = Kokkuvõte jälgitavast ajast, mis põhineb probleemide nimekirja filtritel
|
||||||
your_settings = Seaded
|
your_settings = Seadistused
|
||||||
home = Avaleht
|
home = Avaleht
|
||||||
dashboard = Armatuurlaud
|
dashboard = Töölaud
|
||||||
explore = Uurige
|
explore = Uuri
|
||||||
help = Abi
|
help = Abiteave
|
||||||
logo = Logo
|
logo = Logo
|
||||||
sign_in = Logi sisse
|
sign_in = Logi sisse
|
||||||
sign_in_with_provider = Logi sisse koos %s
|
sign_in_with_provider = Logi sisse kasutajakontoga: %s
|
||||||
sign_in_or = või
|
sign_in_or = või
|
||||||
sign_out = Registreeru välja
|
sign_out = Logi välja
|
||||||
sign_up = Registreeru
|
sign_up = Registreeru
|
||||||
link_account = Lingi konto
|
link_account = Lingi väline kasutajakonto
|
||||||
register = Registreeru
|
register = Registreeru
|
||||||
version = Versioon
|
version = Versioon
|
||||||
page = Lehekülg
|
page = Lehekülg
|
||||||
template = Mall
|
template = Mall
|
||||||
language = Keel
|
language = Keel
|
||||||
notifications = Teated
|
notifications = Teavitused
|
||||||
active_stopwatch = Aktiivne aja jälgimine
|
active_stopwatch = Aktiivne aja jälgimine
|
||||||
create_new = Loo…
|
create_new = Loo…
|
||||||
user_profile_and_more = Profiil ja seaded…
|
user_profile_and_more = Profiil ja seadistused…
|
||||||
signed_in_as = Sisselogitud kui
|
signed_in_as = Sisselogitud kui
|
||||||
enable_javascript = See veebileht nõuab JavaScripti.
|
enable_javascript = See veebileht eeldab JavaScripti kasutamise lubamist.
|
||||||
toc = Sisukord
|
toc = Sisukord
|
||||||
licenses = Litsentsid
|
licenses = Litsentsid
|
||||||
username = Kasutajanimi
|
username = Kasutajanimi
|
||||||
webauthn_error_unable_to_process = Server ei saanud teie taotlust töödelda.
|
webauthn_error_unable_to_process = Server ei saanud sinu päringut töödelda.
|
||||||
webauthn_error_duplicated = Turvalisuse võti ei ole selle taotluse puhul lubatud. Palun veenduge, et võti ei ole juba registreeritud.
|
webauthn_error_duplicated = Turvavõti ei ole selle päringu puhul lubatud. Palun veendu, et võti ei ole juba registreeritud.
|
||||||
return_to_forgejo = Tagasi Forgejo'sse
|
return_to_forgejo = Tagasi Forgejo'sse
|
||||||
toggle_menu = Lülitage menüü
|
toggle_menu = Lülita menüü sisse/välja
|
||||||
more_items = Rohkem esemeid
|
more_items = Rohkem objekte
|
||||||
email = E-posti aadress
|
email = E-posti aadress
|
||||||
password = Parool
|
password = Salasõna
|
||||||
access_token = Juurdepääsutähis
|
access_token = Tunnusluba
|
||||||
re_type = Kinnita parool
|
re_type = Kinnita salasõna
|
||||||
twofa = Kahefaktoriline autentimine
|
twofa = Kahefaktoriline autentimine
|
||||||
twofa_scratch = Kahefaktoriline kriipsukood
|
twofa_scratch = Kahefaktoriline kriipsukood
|
||||||
passcode = Passkood
|
passcode = Salakood
|
||||||
webauthn_insert_key = Sisestage oma turvavõti
|
webauthn_insert_key = Sisesta oma turvavõti
|
||||||
webauthn_sign_in = Vajutage turvavõtme nuppu. Kui teie turvavõtmel ei ole nuppu, sisestage see uuesti.
|
webauthn_sign_in = Vajuta turvavõtme nuppu. Kui sinu turvavõtmel ei ole nuppu, sisesta see uuesti.
|
||||||
webauthn_press_button = Palun vajutage turvavõtme nuppu…
|
webauthn_press_button = Palun vajuta turvavõtme nuppu…
|
||||||
webauthn_use_twofa = Kasutage oma telefonist kahefaktorilist koodi
|
webauthn_use_twofa = Sisesta oma telefonist kahefaktorilise autentimise kood
|
||||||
webauthn_error = Teie turvavõti ei saanud lugeda.
|
webauthn_error = Sinu turvavõtit ei saanud lugeda.
|
||||||
webauthn_unsupported_browser = Teie brauser ei toeta praegu WebAuthn.
|
webauthn_unsupported_browser = Sinu veebibrauser ei toeta praegu WebAuthn-liidestust.
|
||||||
webauthn_error_unknown = Tekkis tundmatu viga. Palun proovige uuesti.
|
webauthn_error_unknown = Tekkis tundmatu viga. Palun proovi uuesti.
|
||||||
webauthn_error_insecure = WebAuthn toetab ainult turvalisi ühendusi. HTTP kaudu testimiseks võite kasutada päritolu "localhost" või "127.0.0.1"
|
webauthn_error_insecure = WebAuthn toetab ainult turvalisi ühendusi. HTTP kaudu testimiseks võid kasutada lähteaadressina „localhost“ või „127.0.0.1“
|
||||||
webauthn_error_empty = Sellele võtmele tuleb määrata nimi.
|
webauthn_error_empty = Palun lisa sellele võtmele täisnimi.
|
||||||
webauthn_error_timeout = Ajakatkestus saavutati enne võtme lugemist. Palun laadige see lehekülg uuesti ja proovige uuesti.
|
webauthn_error_timeout = Päring aegus enne võtme lugemist. Palun laadi see lehekülg uuesti ja proovi uuesti.
|
||||||
repository = Hoidla
|
repository = Hoidla
|
||||||
organization = Organisatsioon
|
organization = Organisatsioon
|
||||||
new_fork = Uus hoidla haru
|
new_fork = Uus lähekoodihoidla haru
|
||||||
new_project = Uus projekt
|
new_project = Uus projekt
|
||||||
new_project_column = Uus veerg
|
new_project_column = Uus veerg
|
||||||
admin_panel = Saidi administreerimine
|
admin_panel = Saidi haldus
|
||||||
settings = Seaded
|
settings = Seadistused
|
||||||
your_profile = Profiil
|
your_profile = Profiil
|
||||||
your_starred = Tähistatud tärniga
|
your_starred = Tähistatud tärniga
|
||||||
new_repo.title = Uus hoidla
|
new_repo.title = Uus lähtekoodi hoidla
|
||||||
new_migrate.title = Uus sisseränne
|
new_migrate.title = Uus kolimine
|
||||||
new_org.title = Uus organisatsioon
|
new_org.title = Uus organisatsioon
|
||||||
new_repo.link = Uus hoidla
|
new_repo.link = Uus lähtekoodi hoidla
|
||||||
new_migrate.link = Uus sisseränne
|
new_migrate.link = Uus kolimine
|
||||||
new_org.link = Uus organisatsioon
|
new_org.link = Uus organisatsioon
|
||||||
all = Kõik
|
all = Kõik
|
||||||
sources = Allikad
|
sources = Allikad
|
||||||
|
@ -69,10 +69,10 @@ mirror = Peegelpilt
|
||||||
mirrors = Peegelpildid
|
mirrors = Peegelpildid
|
||||||
forks = Harud
|
forks = Harud
|
||||||
activities = Tegevused
|
activities = Tegevused
|
||||||
pull_requests = Tõmbepäringud
|
pull_requests = Päringud koodi mestimiseks
|
||||||
issues = Probleemid
|
issues = Veahaldus
|
||||||
milestones = Verstapostid
|
milestones = Verstapostid
|
||||||
ok = OK
|
ok = Sobib
|
||||||
cancel = Tühista
|
cancel = Tühista
|
||||||
retry = Proovi uuesti
|
retry = Proovi uuesti
|
||||||
rerun = Käivita uuesti
|
rerun = Käivita uuesti
|
||||||
|
@ -81,120 +81,139 @@ add = Lisa
|
||||||
add_all = Lisa kõik
|
add_all = Lisa kõik
|
||||||
remove = Eemalda
|
remove = Eemalda
|
||||||
remove_all = Eemalda kõik
|
remove_all = Eemalda kõik
|
||||||
remove_label_str = Eemalda ühik "%s"
|
remove_label_str = Eemalda „%s“ objekt
|
||||||
edit = Redigeeri
|
edit = Muuda
|
||||||
view = Vaata
|
view = Vaata
|
||||||
test = Test
|
test = Testi
|
||||||
enabled = Võimaldatud
|
enabled = Kasutusel
|
||||||
disabled = Välja lülitatud
|
disabled = Pole kasutusel
|
||||||
locked = Lukkus
|
locked = Lukustatud
|
||||||
copy = Kopeeri
|
copy = Kopeeri
|
||||||
copy_url = Kopeeri URL
|
copy_url = Kopeeri võrguaadress
|
||||||
copy_hash = Kooperi hash
|
copy_hash = Kopeeri räsi
|
||||||
copy_content = Kopeeri sisu
|
copy_content = Kopeeri sisu
|
||||||
copy_branch = Kopeeri haru nimi
|
copy_branch = Kopeeri haru nimi
|
||||||
copy_success = Kopeeritud!
|
copy_success = Kopeeritud!
|
||||||
copy_error = Kopeerimine ebaõnnestus
|
copy_error = Kopeerimine ei õnnestunud
|
||||||
copy_type_unsupported = Seda failitüüpi ei saa kopeerida
|
copy_type_unsupported = Seda failitüüpi ei saa kopeerida
|
||||||
write = Kirjuta
|
write = Kirjuta
|
||||||
preview = Eelvaade
|
preview = Eelvaade
|
||||||
loading = Laadimine…
|
loading = Laadin…
|
||||||
error = Viga
|
error = Viga
|
||||||
error404 = Lehekülge, millele te üritate jõuda, kas <strong>ei ole olemas</strong> või <strong>teil ei ole õigust</strong> seda vaadata.
|
error404 = Lehekülge, millele sa üritad jõuda, kas <strong>ei ole olemas</strong>, <strong>ta on eemaldatud</strong> või <strong>sul ei ole õigust</strong> seda vaadata.
|
||||||
error413 = Sa oled oma kvoodi ammendanud.
|
error413 = Sa oled oma kvoodi ammendanud.
|
||||||
go_back = Mine tagasi
|
go_back = Mine tagasi
|
||||||
invalid_data = Kehtetud andmed: %v
|
invalid_data = Vigased andmed: %v
|
||||||
never = Mitte kunagi
|
never = Mitte kunagi
|
||||||
unknown = Teadmata
|
unknown = Teadmata
|
||||||
rss_feed = RSS infovoog
|
rss_feed = RSS-voog
|
||||||
confirm_delete_artifact = Kas oled kindel et soovite artefakti "%s" kustutada?
|
confirm_delete_artifact = Kas oled kindel et soovid „%s“ artefakti kustutada?
|
||||||
pin =
|
pin =Tõsta esile
|
||||||
artifacts = Artefaktid
|
artifacts = Artefaktid
|
||||||
archived = Arhiveeritud
|
archived = Arhiveeritud
|
||||||
concept_system_global = Ülemaailmne
|
concept_system_global = Üldine
|
||||||
concept_user_individual = Individuaalne
|
concept_user_individual = Individuaalne
|
||||||
concept_code_repository = Hoidla
|
concept_code_repository = Lähtekoodi hoidla
|
||||||
concept_user_organization = Organisatsioon
|
concept_user_organization = Organisatsioon
|
||||||
show_timestamps = Näita ajatemplid
|
show_timestamps = Näita ajatempleid
|
||||||
show_log_seconds = Näita sekundit
|
show_log_seconds = Näita sekundeid
|
||||||
download_logs = Logide allalaadimine
|
download_logs = Laadi logid alla
|
||||||
name = Nimi
|
name = Nimi
|
||||||
value = Väärtus
|
value = Väärtus
|
||||||
filter = Filter
|
filter = Filter
|
||||||
filter.clear = Tühjendage filtrid
|
filter.clear = Tühjenda filtrid
|
||||||
filter.is_archived = Arhiveeritud
|
filter.is_archived = Arhiveeritud
|
||||||
filter.not_archived = Mitte arhiveeritud
|
filter.not_archived = Arhiveerimata
|
||||||
filter.is_fork = Harud
|
filter.is_fork = Koodiharud
|
||||||
filter.not_fork = Mitte harud
|
filter.not_fork = Pole koodiharud
|
||||||
filter.is_mirror = Peegelpiltid
|
filter.is_mirror = Peegelpildid
|
||||||
filter.not_mirror = Mitte peegelpiltid
|
filter.not_mirror = Pole peegelpilte
|
||||||
filter.is_template = Mallid
|
filter.is_template = Mallid
|
||||||
filter.not_template = Mitte Mallid
|
filter.not_template = Pole mallid
|
||||||
filter.public = Avalik
|
filter.public = Avalik
|
||||||
filter.private = Privaatne
|
filter.private = Privaatne
|
||||||
rerun_all = Käivita uuesti kõik tööd
|
rerun_all = Käivita uuesti kõik tööd
|
||||||
new_mirror = Uus peegelpilt
|
new_mirror = Uus peegelpilt
|
||||||
copy_generic = Kopeeri lõikelauale
|
copy_generic = Kopeeri lõikelauale
|
||||||
confirm_delete_selected = Kinnitage et kustutada kõik valitud elemendid?
|
confirm_delete_selected = Kas kinnitad kõikide valitud objektide kustutamise?
|
||||||
show_full_screen = Näita täisekraanil
|
show_full_screen = Näita täisekraanivaates
|
||||||
|
|
||||||
|
powered_by = Siin on kasutusel %s
|
||||||
|
captcha = Robotilõks
|
||||||
|
copy_path = Kopeeri asukoht
|
||||||
|
unpin = Lõpeta esiletõstmine
|
||||||
|
|
||||||
[search]
|
[search]
|
||||||
search = Otsi...
|
search = Otsi…
|
||||||
fuzzy = Hägus
|
fuzzy = Hägus
|
||||||
fuzzy_tooltip = Lisage tulemused mis vastavad ka otsingu terminile
|
fuzzy_tooltip = Lisa tulemused mis lähedalt vastavad otsingusõnale
|
||||||
union = Märksõnad
|
union = Märksõnad
|
||||||
exact = Täpne
|
exact = Täpne
|
||||||
exact_tooltip = Sisaldab ainult tulemusi mis vastavad täpsele otsingusõnale
|
exact_tooltip = Sisaldab ainult tulemusi, mis vastavad täpsele otsingusõnale
|
||||||
repo_kind = Otsi hoidlad...
|
repo_kind = Otsi lähtekoodihoidlad…
|
||||||
user_kind = Otsi kasutajaid...
|
user_kind = Otsi kasutajaid…
|
||||||
org_kind = Otsi organisatsioone...
|
org_kind = Otsi organisatsioone…
|
||||||
team_kind = Otsi meeskonnad...
|
team_kind = Otsi tiime…
|
||||||
code_kind = Otsi koodi...
|
code_kind = Otsi koodi…
|
||||||
code_search_by_git_grep = Praeguse koodi otsingu tulemused annab "git grep". Paremaid tulemusi võib saada, kui saidi administraator lubab koodi indekseerija.
|
code_search_by_git_grep = Praeguse koodi otsingu tulemused annab "git grep". Paremaid tulemusi võib saada, kui saidi administraator lubab koodi indekseerija.
|
||||||
package_kind = Otsi pakette...
|
package_kind = Otsi pakette…
|
||||||
project_kind = Otsi projekte...
|
project_kind = Otsi projekte…
|
||||||
branch_kind = Otsi harusid...
|
branch_kind = Otsi harusid…
|
||||||
commit_kind = Otsi kommiteid...
|
commit_kind = Otsi kommiteid…
|
||||||
runner_kind = Otsi jooksjaid...
|
runner_kind = Otsi jooksjaid…
|
||||||
no_results = Sobivaid tulemusi ei leitud.
|
no_results = Sobivaid tulemusi ei leitud.
|
||||||
issue_kind = Otsi probleeme...
|
issue_kind = Otsi probleeme…
|
||||||
milestone_kind = Otsi verstapostid...
|
milestone_kind = Otsi verstapostid...
|
||||||
type_tooltip = Otsingu tüüp
|
type_tooltip = Otsingu tüüp
|
||||||
code_search_unavailable = Koodide otsing ei ole praegu saadaval. Palun võtke ühendust saidi administraatoriga.
|
code_search_unavailable = Koodiotsing ei ole praegu saadaval. Palun võta ühendust saidi administraatoriga.
|
||||||
union_tooltip = Sisaldab tulemused mis vastavad mis tahes tühikutega eraldatud võtmesõnadele
|
union_tooltip = Kaasa tulemusi, mis vastavad mis tahes tühikutega eraldatud märksõnadele
|
||||||
keyword_search_unavailable = Otsing märksõna järgi ei ole praegu saadaval. Palun võtke ühendust saidi administraatoriga.
|
keyword_search_unavailable = Otsing märksõna järgi ei ole praegu saadaval. Palun võtke ühendust saidi haldajaga.
|
||||||
pull_kind = Otsi tõmbepäringuid...
|
pull_kind = Otsi tõmbepäringuid…
|
||||||
|
|
||||||
[aria]
|
[aria]
|
||||||
navbar = Navigatsiooniriba
|
navbar = Navigatsiooniriba
|
||||||
footer.software = Selle tarkvara kohta
|
footer.software = Teave selle tarkvara kohta
|
||||||
footer.links = Lingid
|
footer.links = Lingid
|
||||||
|
|
||||||
|
footer = Jalus
|
||||||
|
|
||||||
[heatmap]
|
[heatmap]
|
||||||
number_of_contributions_in_the_last_12_months = %s panused viimase 12 kuu jooksul
|
number_of_contributions_in_the_last_12_months = %s kaastööd viimase 12 kuu jooksul
|
||||||
contributions_zero = Panused ei ole
|
contributions_zero = Kaastöid ei ole
|
||||||
contributions_format = {contributions} {day} {month}, {year}
|
contributions_format = {contributions} {day} {month}, {year}
|
||||||
contributions_few = panused
|
contributions_few = kaastööd
|
||||||
less = Vähem
|
less = Vähem
|
||||||
more = Rohkem
|
more = Rohkem
|
||||||
contributions_one = panus
|
contributions_one = kaastöö
|
||||||
|
|
||||||
[editor]
|
[editor]
|
||||||
buttons.heading.tooltip = Lisa pealkiri
|
buttons.heading.tooltip = Lisa pealkiri
|
||||||
buttons.italic.tooltip = Lisa kursiivne tekst
|
buttons.italic.tooltip = Lisa kaldkirjas tekst
|
||||||
buttons.quote.tooltip = Tsitaadi tekst
|
buttons.quote.tooltip = Tsiteeri teksti
|
||||||
buttons.code.tooltip = Lisa kood
|
buttons.code.tooltip = Lisa kood
|
||||||
buttons.link.tooltip = Lisa link
|
buttons.link.tooltip = Lisa link
|
||||||
buttons.list.ordered.tooltip = Lisa nummerdatud nimekiri
|
buttons.list.ordered.tooltip = Lisa nummerdatud nimekiri
|
||||||
buttons.list.unordered.tooltip = Lisa nimekiri
|
buttons.list.unordered.tooltip = Lisa nimekiri
|
||||||
buttons.list.task.tooltip = Lisa ülesannete nimekiri
|
buttons.list.task.tooltip = Lisa ülesannete nimekiri
|
||||||
buttons.ref.tooltip = Viide probleemile või tõmbepäringule
|
buttons.ref.tooltip = Viide probleemile või mestimispäringule
|
||||||
buttons.switch_to_legacy.tooltip = Kasutage selle asemel pärandredaktorit
|
buttons.switch_to_legacy.tooltip = Selle asemel kasuta pärandredaktorit
|
||||||
buttons.enable_monospace_font = Võimalda püsisammkiri
|
buttons.enable_monospace_font = Kasuta püsisammkirja
|
||||||
buttons.disable_monospace_font = Lülita välja püsisammkiri
|
buttons.disable_monospace_font = Lülita püsisammkiri välja
|
||||||
buttons.indent.tooltip = Pesa esemed ühe taseme võrra
|
buttons.indent.tooltip = Liiguta objekte ühe taseme võrra
|
||||||
buttons.bold.tooltip = Lisa rasvane tekst
|
buttons.bold.tooltip = Lisa paks tekst
|
||||||
buttons.mention.tooltip = Mainige kasutajat või meeskonda
|
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
|
||||||
|
table_modal.header = Lisa tabel
|
||||||
|
table_modal.placeholder.header = Päis
|
||||||
|
table_modal.placeholder.content = Sisu
|
||||||
|
table_modal.label.rows = Read
|
||||||
|
table_modal.label.columns = Veerud
|
||||||
|
link_modal.header = Lisa link
|
||||||
|
link_modal.url = Võrguaadress
|
||||||
|
link_modal.description = Kirjeldus
|
||||||
|
link_modal.paste_reminder = Soovitus: kui link on uba lõikelaual olemas, siis võis ta otse lisada ja link luuakse automaatselt.
|
||||||
|
|
||||||
[filter]
|
[filter]
|
||||||
string.asc = A - Z
|
string.asc = A - Z
|
||||||
|
@ -205,114 +224,179 @@ occurred = Tekkis viga
|
||||||
invalid_csrf = Halb taotlus: vigane CSRF token
|
invalid_csrf = Halb taotlus: vigane CSRF token
|
||||||
not_found = Sihtmärki ei leitud.
|
not_found = Sihtmärki ei leitud.
|
||||||
network_error = Võrguviga
|
network_error = Võrguviga
|
||||||
server_internal = Sisemine serveri viga
|
server_internal = Serveri sisemine viga
|
||||||
report_message = Kui usute et tegemist on Forgejo veaga siis otsige probleeme <a href="%s" target="_blank">Codebergist</a> või avage vajadusel uus probleem.
|
report_message = Kui usud, et tegemist on Forgejo veaga, siis otsige sarnaseid vigu <a href="%s" target="_blank">Codebergist</a> või vajadusel koosta uus veakirjeldus.
|
||||||
|
|
||||||
[startpage]
|
[startpage]
|
||||||
app_desc = Valutu, isehostitatud Git'i teenus
|
app_desc = Muretu Git'i teenus sinu omas serveris
|
||||||
install = Lihtne paigaldada
|
install = Lihtne paigaldada
|
||||||
platform = Platvormiülene
|
platform = Platvormiülene
|
||||||
platform_desc = Forgejo on kinnitust leidnud et töötab nii libre operatsioonisüsteemides nagu Linux ja FreeBSD, kui ka erinevatel protsessorarhitektuuridel. Valige see mis teile meeldib!
|
platform_desc = On kinnitust leidnud, et Forgejo töötab nii avatud operatsioonisüsteemides nagu Linux ja FreeBSD, kui ka erinevatel protsessorarhitektuuridel. Vali see mis sulle meeldib!
|
||||||
lightweight = Kergekaaluline
|
lightweight = Kergekaaluline
|
||||||
lightweight_desc = Forgejo on väikeste miinimumnõuetega ja seda saab kasutada odaval Raspberry Pi'l. Säästa oma masina energiat!
|
lightweight_desc = Forgejo on väikeste miinimumnõuetega ja seda saad kasutada odaval Raspberry Pi'l. Säästa oma masina energiat!
|
||||||
license = Avatud lähtekood
|
license = Avatud lähtekood
|
||||||
install_desc = Lihtsalt <a target="_blank" rel="noopener noreferrer" href="%[1]s">käivitage oma platvormi binaarsüsteem</a>, tarnige see koos <a target="_blank" rel="noopener noreferrer" href="%[2]s">Dockeriga</a>, või saada see <a target="_blank" rel="noopener noreferrer" href="%[3]s">pakendatud</a>.
|
install_desc = Lihtsalt <a target="_blank" rel="noopener noreferrer" href="%[1]s">käivita rakenduse fail oma platvormil</a>, pane ta tööle <a target="_blank" rel="noopener noreferrer" href="%[2]s">Dockeriga</a> või laadi ta <a target="_blank" rel="noopener noreferrer" href="%[3]s">pakendatuna</a>.
|
||||||
license_desc = Mine võta <a target="_blank" rel="noopener noreferrer" href="%[1]s">Forgejo</a>! Liitu meiega andes <a target="_blank" rel="noopener noreferrer" href="%[2]s">oma panuse</a> et muuta see projekt veelgi paremaks. Ärge häbenege olla kaasaaitaja!
|
license_desc = Laadi <a target="_blank" rel="noopener noreferrer" href="%[1]s">Forgejo</a> alla! Liitu meiega andes <a target="_blank" rel="noopener noreferrer" href="%[2]s">oma panuse</a>, et muuta see projekt veelgi paremaks. Ära pelga osalemist!
|
||||||
|
|
||||||
[install]
|
[install]
|
||||||
install = Paigaldamine
|
install = Paigaldamine
|
||||||
title = Esialgne konfiguratsioon
|
title = Esialgne konfiguratsioon
|
||||||
docker_helper = Kui käivitate Forgejo't Dockeri sees, lugege <a target="_blank" rel="noopener noreferrer" href="%s">dokumentatsiooni</a> enne seadete muutmine.
|
docker_helper = Kui käivitad Forgejo't Dockeris, loe enne seadistuste muutmist <a target="_blank" rel="noopener noreferrer" href="%s">dokumentatsiooni</a>.
|
||||||
require_db_desc = Forgejo vajab MySQL, PostgreSQL, SQLite3 või TiDB (MySQL protokoll).
|
require_db_desc = Forgejo vajab tööks ühte järgnevast andmebaasidest: MySQL, PostgreSQL, SQLite3 või TiDB (MySQL protokoll).
|
||||||
db_title = Andmebaasi seaded
|
db_title = Andmebaasi seadistused
|
||||||
db_type = Andmebaasi tüüp
|
db_type = Andmebaasi tüüp
|
||||||
host = Vastuvõtja
|
host = Server
|
||||||
user = Kasutajanimi
|
user = Kasutajanimi
|
||||||
password = Parool
|
password = Salasõna
|
||||||
db_name = Andmebaasi nimi
|
db_name = Andmebaasi nimi
|
||||||
db_schema = Skeem
|
db_schema = Andmeskeem
|
||||||
db_schema_helper = Jäta tühjaks andmebaasi vaikimisi ("avalik").
|
db_schema_helper = Vaikimisi valiku kasutamiseks jäta tühjaks („public“).
|
||||||
ssl_mode = SSL
|
ssl_mode = SSL
|
||||||
path = Tee
|
path = Asukoht
|
||||||
sqlite_helper = SQLite3 andmebaasi failitee.<br>Sisestage absoluutne tee, kui käivitate Forgejo't teenusena.
|
sqlite_helper = SQLite3 andmebaasi aukoht.<br>Kui käivitad Forgejo'd teenusena, siis sisesta absoluutne asukoht.
|
||||||
reinstall_error = Sa üritad installeerida olemasolevasse Forgejo andmebaasi
|
reinstall_error = Sa üritad paigaldada olemasolevasse Forgejo andmebaasi
|
||||||
reinstall_confirm_message = Olemasoleva Forgejo andmebaasi uuesti paigaldamine võib põhjustada mitmeid probleeme. Enamasti peaksite Forgejo käivitamiseks kasutama olemasolevat "app.ini". Kui te teate, mida teete, kinnitage järgmist:
|
reinstall_confirm_message = Olemasoleva Forgejo andmebaasi uuesti paigaldamine võib põhjustada mitmeid probleeme. Enamasti peaksid Forgejo käivitamiseks kasutama olemasolevat „app.ini“. Kui te tead, mida teed, kinnita järgmist:
|
||||||
reinstall_confirm_check_1 = Andmed, mis on krüpteeritud SECRET_KEY'ga app.ini's, võivad kaduda: kasutajad ei pruugi saada 2FA/OTP-ga sisse logima ja peegelpiltid ei pruugi õigesti toimida. Selle kasti märkimisega kinnitate, et praegune app.ini fail sisaldab õiget SECRET_KEY'd.
|
reinstall_confirm_check_1 = Andmed, mis on krüpteeritud SECRET_KEY'ga app.ini's, võivad kaduda: kasutajad ei pruugi saada sisselogimisel kaasutada 2FA/OTP võimalusi ja peegelpildid ei pruugi õigesti toimida. Selle kasti märkimisega kinnitad, et praegune app.ini fail sisaldab õiget SECRET_KEY'd.
|
||||||
reinstall_confirm_check_3 = Te kinnitate, et olete täiesti kindel, et see Forgejo töötab õiges app.ini asukohas ja et olete kindel, et peate uuesti installima. Te kinnitate, et tunnistate ülaltoodud riske.
|
reinstall_confirm_check_3 = Sa kinnitad, et oled täiesti kindel, et see Forgejo töötab õiges app.ini asukohas ja et oled kindel, et pead uuesti paigaldama. Sa kinnitad, et oled teadlik ülaltoodud riskidest.
|
||||||
err_empty_db_path = SQLite3 andmebaasi tee ei saa olla tühi.
|
err_empty_db_path = SQLite3 andmebaasi asukoht ei saa olla tühi.
|
||||||
no_admin_and_disable_registration = Kasutajate iseregistreerimist ei saa keelata ilma administraatori kontot loomata.
|
no_admin_and_disable_registration = Kasutajate iseregistreerimist ei saa keelata ilma peakasutaja kontot loomata.
|
||||||
err_empty_admin_password = Administraatori parool ei saa olla tühi.
|
err_empty_admin_password = Peakasutaja salasõna ei saa olla tühi.
|
||||||
err_empty_admin_email = Administraatori e-posti aadress ei saa olla tühi.
|
err_empty_admin_email = Peakasutaja e-posti aadress ei saa olla tühi.
|
||||||
err_admin_name_is_reserved = Administraatori kasutajanimi on kehtetu, kasutajanimi on reserveeritud
|
err_admin_name_is_reserved = Peakasutaja kasutajanimi on vigane, kasutajanimi on reserveeritud
|
||||||
err_admin_name_pattern_not_allowed = Administraatori kasutajanimi on kehtetu, kasutajanimi vastab reserveeritud mustrile
|
err_admin_name_pattern_not_allowed = Peakasutaja kasutajanimi on vigane, kasutajanimi vastab reserveeritud mustrile
|
||||||
err_admin_name_is_invalid = Administraatori kasutajanimi on kehtetu
|
err_admin_name_is_invalid = Peakasutaja kasutajanimi on vigane
|
||||||
general_title = Üldised seaded
|
general_title = Üldised seadistused
|
||||||
app_name = Instantsi pealkiri
|
app_name = Serveri nimi või pealkiri
|
||||||
app_name_helper = Sisestage siia oma instantsi nimi. See kuvatakse igal leheküljel.
|
app_name_helper = Sisestage siia oma serveri või teenuse nimi. See kuvatakse igal leheküljel.
|
||||||
app_slogan = Instantse loosung
|
app_slogan = Serveri tunnuslause
|
||||||
repo_path = Hoidla juurte tee
|
repo_path = Hoidla juurkausta asukoht
|
||||||
lfs_path = Git LFS'i juurte tee
|
lfs_path = Git LFS'i juurkausta asukoht
|
||||||
lfs_path_helper = Failid jälgitatud Git LFS'ist salvestatakse sellesse kaustale. Jätke tühjaks et välja lülitada.
|
lfs_path_helper = Git LFS'ist jälgitud failid salvestatakse siia kausta. Kui jätad tühjaks, siis pole see võimalus kasutusel.
|
||||||
run_user = Kasutaja kellena käivitada
|
run_user = Kasutaja kellena käivitada
|
||||||
run_user_helper = Operatsioonisüsteemi kasutajanimi, mille all Forgejo töötab. Pange tähele, et sellel kasutajal peab olema juurdepääs hoidlate juurte teele.
|
run_user_helper = Operatsioonisüsteemi kasutajanimi, kellena Forgejo töötab. Pane tähele, et sellel kasutajal peab olema juurdepääs hoidlate juurkaustale.
|
||||||
domain = Serveri domeen
|
domain = Serveri domeen
|
||||||
domain_helper = Serveri domeen või hostiaadress.
|
domain_helper = Serveri domeen või hosti aadress.
|
||||||
ssh_port = SSH-serveri port
|
ssh_port = SSH-serveri port
|
||||||
ssh_port_helper = Pordi number, mida SSH-server kasutab. Jätke tühjaks et välja lülitada SSH-serveri.
|
ssh_port_helper = Pordi number, mida SSH-server kasutab. SSH-serveri väljalülitamiseks jäta tühjaks.
|
||||||
http_port = HTTP-kuulamise port
|
http_port = Serveri HTTP port
|
||||||
http_port_helper = Pordi number, mida Forgejo veebiserver kasutab.
|
http_port_helper = Pordi number, mida Forgejo veebiserver kasutab.
|
||||||
app_url = Baasi URL
|
app_url = Juur-võrguaadress
|
||||||
app_url_helper = Baasaadress HTTP(S) kloonimise URL-ide ja e-posti teadete jaoks.
|
app_url_helper = Lähteaadress HTTP(S) kloonimise võrguaadresside ja e-posti teadete jaoks.
|
||||||
log_root_path = Logi tee
|
log_root_path = Logi asukoht
|
||||||
log_root_path_helper = Logifailid kirjutatakse sellesse kaustale.
|
log_root_path_helper = Logifailid kirjutatakse siia kausta.
|
||||||
optional_title = Vabatahtlikud seaded
|
optional_title = Täiendavad seadistused
|
||||||
email_title = E-posti seaded
|
email_title = E-posti seadistused
|
||||||
smtp_addr = SMTP vastuvõtja
|
smtp_addr = SMTP server
|
||||||
smtp_port = SMTP port
|
smtp_port = SMTP port
|
||||||
smtp_from = Saada e-kirjad nagu
|
smtp_from = Saada e-kirjad nagu
|
||||||
smtp_from_invalid = "Saada e-kirjad nagu" aadress on kehtetu
|
smtp_from_invalid = „Saada e-kirjad nagu“ aadress on vigane
|
||||||
smtp_from_helper = E-posti aadress, mida Forgejo kasutab. Sisestage tavaline e-posti aadress või kasutage formaati "Nimi" <email@example.com>.
|
smtp_from_helper = E-posti aadress, mida Forgejo kasutab. Sisesta tavaline e-posti aadress või kasutage vormingut "Nimi" <email@example.com>.
|
||||||
mailer_user = SMTP kasutajanimi
|
mailer_user = SMTP kasutajanimi
|
||||||
mailer_password = SMTP parool
|
mailer_password = SMTP salasõna
|
||||||
register_confirm = Registreerimiseks on vaja e-posti kinnitust
|
register_confirm = Registreerimiseks on vaja e-posti kinnitamist
|
||||||
mail_notify = Lubage e-posti teated
|
mail_notify = Kasuta teavitamist e-posti teel
|
||||||
server_service_title = Serveri ja kolmanda osapoole teenuste seaded
|
server_service_title = Serveri ja kolmanda osapoole teenuste seadistused
|
||||||
offline_mode = Lülita sisse lokaalse režiimi
|
offline_mode = Lülita sisse lokaalne režiim
|
||||||
disable_gravatar = Lülita välja Gravatar
|
disable_gravatar = Lülita Gravatar välja
|
||||||
federated_avatar_lookup = Lülita sisse föderaalsed avatarid
|
federated_avatar_lookup = Kaasuta födereeritud tunnuspilte
|
||||||
federated_avatar_lookup.description = Otsige avatare kasutades Libravatar'i.
|
federated_avatar_lookup.description = Otsi tunnuspilte Libravatari teenusest.
|
||||||
disable_registration = Lülita välja iseregistreerimine
|
disable_registration = Lülita välja iseregistreerimine
|
||||||
allow_only_external_registration = Luba registreerimine ainult väliste teenuste kaudu
|
allow_only_external_registration = Luba registreerimine ainult väliste teenuste kaudu
|
||||||
allow_only_external_registration.description = Kasutajad saavad uusi kontosid luua ainult seadistatud väliste teenuste abil.
|
allow_only_external_registration.description = Kasutajad saavad uusi kontosid luua ainult seadistatud väliste teenuste abil.
|
||||||
openid_signin = Lülita sisse OpenID sisselogimise
|
openid_signin = Kasuta OpenID abil sisselogimist
|
||||||
openid_signin.description = Luba kasutajatel OpenID kaudu sisse logida.
|
openid_signin.description = Luba kasutajatel OpenID abil sisse logida.
|
||||||
openid_signup = Lülita sisse OpenID iseregistreerimine
|
openid_signup = Kasuta OpenID abil iseregistreerimist
|
||||||
enable_captcha = Lülita sisse registreerimise CAPTCHA
|
enable_captcha = Kasuta registreerimisel robotilõksu
|
||||||
enable_captcha.description = Nõudke kasutajatelt CAPTCHA läbimist kontode loomiseks.
|
enable_captcha.description = Eelda, et kasutajad lahendavad registreerimisel robotilõksu ülesande.
|
||||||
require_sign_in_view = Nõua sisselogimist et vaadata instantsi sisu
|
require_sign_in_view = Serveri sisu vaatamiseks eelda sisselogimist
|
||||||
default_keep_email_private = Peida e-posti aadressid vaikimisi
|
default_keep_email_private = Vaikimisi peida e-posti aadressid
|
||||||
default_keep_email_private.description = Lülita sisse uute kasutajate e-posti aadressi varjamine vaikimisi, et see teave ei lekiks kohe pärast registreerimist.
|
default_keep_email_private.description = Lülita sisse uute kasutajate e-posti aadresside vaikimisi varjamine - see väldib vastava teabe lekkimist kohe pärast registreerimist.
|
||||||
default_allow_create_organization = Lubada organisatsioonide loomine vaikimisi
|
default_allow_create_organization = Vaikimisi luba organisatsioonide loomine
|
||||||
default_enable_timetracking = Aja jälgimise sisselülitamine vaikimisi
|
default_enable_timetracking = Vaikimisi lülita sisse aja jälgimine
|
||||||
default_enable_timetracking.description = Lubage uute repositooriumide jaoks vaikimisi aja jälgimise funktsiooni kasutamine.
|
default_enable_timetracking.description = Vaikimisi luba uute lähtekoodihoidlate jaoks aja jälgimise funktsiooni kasutamise.
|
||||||
admin_title = Administraatori konto seaded
|
admin_title = Peakasutaja konto seaded
|
||||||
admin_setting.description = Administraatori konto loomine on vabatahtlik. Esimesest registreeritud kasutajast saab automaatselt administraator.
|
admin_setting.description = Peakasutaja konto loomine on vabatahtlik. Esimesest registreeritud kasutajast saab automaatselt peakasutaja.
|
||||||
admin_name = Administraatori kasutajanimi
|
admin_name = Peakasutaja kasutajanimi
|
||||||
admin_password = Parool
|
admin_password = Salasõna
|
||||||
confirm_password = Parooli kinnitamine
|
confirm_password = Kinnita salasõna
|
||||||
admin_email = E-posti aadress
|
admin_email = E-posti aadress
|
||||||
config_location_hint = Need konfiguratsioonivalikud salvestatakse sees:
|
config_location_hint = Need konfiguratsioonivalikud salvestatakse siin:
|
||||||
install_btn_confirm = Paigalda Forgejo
|
install_btn_confirm = Paigalda Forgejo
|
||||||
test_git_failed = Ei saanud testida käsku "git": %v
|
test_git_failed = Ei saanud testida käsku „git“: %v
|
||||||
invalid_db_setting = Andmebaasi seaded on vigased: %v
|
invalid_db_setting = Andmebaasi seadistused on vigased: %v
|
||||||
invalid_db_table = Andmebaasi tabel "%s" on vigane: %v
|
invalid_db_table = Andmebaasi tabel „%s“ on vigane: %v
|
||||||
allow_dots_in_usernames = Luba kasutajatel kasutada oma kasutajanimedes punkte. Ei mõjuta olemasolevaid kontosid.
|
allow_dots_in_usernames = Luba kasutajatel kasutada oma kasutajanimedes punkte. Ei mõjuta olemasolevaid kontosid.
|
||||||
default_allow_create_organization.description = Lubage uutel kasutajatel vaikimisi luua organisatsioone. Kui see valik on välja lülitatud, peab administraator andma uutele kasutajatele organisatsioonide loomise loa.
|
default_allow_create_organization.description = Luba uutel kasutajatel vaikimisi luua organisatsioone. Kui see valik on välja lülitatud, peab peakasutaja andma uutele kasutajatele organisatsioonide loomise loa.
|
||||||
disable_gravatar.description = Lülita välja Gravatari või muude kolmandate osapoolte avatariallikate kasutamine. Kasutajate avatarite jaoks kasutatakse vaikimisi pilte, kui nad ei lae oma avatari üles.
|
disable_gravatar.description = Lülita välja Gravatari või muude kolmandate osapoolte tunnuspiltide allikate kasutamine. Kasutajate tunnuspiltidena kasutatakse vaikimisi pilte, kui nad enda oma ei laadi üles.
|
||||||
openid_signup.description = Luba kasutajatel luua kontosid OpenID kaudu, kui iseregistreerimine on sisse lülitatud.
|
openid_signup.description = Kui iseregistreerimine on kasutusel, luba kasutajatel luua kontosid OpenID abil.
|
||||||
require_sign_in_view.description = Piirake sisule juurdepääsu sisselogitud kasutajatele. Külalised saavad külastada ainult autentimislehti.
|
require_sign_in_view.description = Piira juurdepääsu vaid sisselogitud kasutajatega. Külalised saavad külastada ainult autentimislehti.
|
||||||
reinstall_confirm_check_2 = Hoidlad ja seadeid võib olla vaja uuesti sünkroniseerida. Selle kasti märkimisega kinnitate, et sünkroniseerite hoidlate ja authorized_keys'i faili konksud käsitsi uuesti. Te kinnitate, et tagate, et hoidlate ja peegelpilti seaded on õiged.
|
reinstall_confirm_check_2 = Hoidlad ja seadistused võivad uuesti vajada sünkroniseerimist. Selle kasti märkimisega kinnitad, et sünkroniseerid hoidlate ja authorized_keys'i faili haagid käsitsi uuesti. Sa kinnitad, et tagad, et hoidlate ja peegelpiltide seadistused on õiged.
|
||||||
app_slogan_helper = Sisestage siia oma loosung. Jätke tühjaks, et välja lülitada.
|
app_slogan_helper = Sisesta siia oma serveri tunnuslause. Kui jätad tühjaks, siis pole tunnuslause kasutusel.
|
||||||
repo_path_helper = Kauged Git-hoidlad salvestatakse sellesse kaustale.
|
repo_path_helper = Kaugseadmete Git-hoidlad salvestatakse siia kausta.
|
||||||
sqlite3_not_available = See Forgejo versioon ei toeta SQLite3. Palun laadige alla ametlik binaarversioon %s (mitte "gobuild"i versioon).
|
sqlite3_not_available = See Forgejo versioon ei toeta SQLite3 andmebaasi. Palun laadi alla ametlik binaarversioon %s (mitte „gobuild“-versioon).
|
||||||
offline_mode.description = Lülitage kolmandate osapoolte sisu edastamise võrgud välja ja teenindage kõiki ressursse lokaalselt.
|
offline_mode.description = Lülitage kolmandate osapoolte sisuedastusvõrgud välja ja jaga kõiki ressursse kohalikust serverist.
|
||||||
|
password_algorithm = Salasõna räsialgoritm
|
||||||
|
invalid_password_algorithm = Vigane salasõna räsialgoritm
|
||||||
|
|
||||||
|
[auth]
|
||||||
|
forgot_password_title = Ununenud salasõna
|
||||||
|
forgot_password = Kas salasõna ununes?
|
||||||
|
must_change_password = Muuda oma salasõna
|
||||||
|
allow_password_change = Eelda, et kasutajad muudavad oma salasõna (soovitatav)
|
||||||
|
|
||||||
|
[mail]
|
||||||
|
password_change.subject = Sinu salasõna on muutunud
|
||||||
|
password_change.text_1 = Sinu kasutajakonto salasõna on just muutunud.
|
||||||
|
totp_disabled.text_1 = Lisaautentimine ehk ajapõhise salasõna (TOTP) kasutamine on sinu kasutajakontol just välja lülitatud.
|
||||||
|
|
||||||
|
[form]
|
||||||
|
Password = Salasõna
|
||||||
|
Retype = Korda salasõna
|
||||||
|
password_not_match = Salasõnad ei klapi.
|
||||||
|
username_password_incorrect = Kassutajanimi või salasõna pole õige.
|
||||||
|
|
||||||
|
[settings]
|
||||||
|
update_password = Muuda salasõna
|
||||||
|
old_password = Senine salasõna
|
||||||
|
new_password = Uus salasõna
|
||||||
|
retype_new_password = Korda uut salasõna
|
||||||
|
password_incorrect = Senine salasõna pole õige.
|
||||||
|
change_password_success = Sina salasõna on nüüd muudetud. Edaspidi kasuta sisselogimiseks seda uut salasõna.
|
||||||
|
|
||||||
|
[repo]
|
||||||
|
mirror_interval_invalid = Peegelpildi välp pole korrektne.
|
||||||
|
mirror_public_key = Avalik SSH-võti
|
||||||
|
mirror_use_ssh.text = Kasuta SSH-autentimist
|
||||||
|
mirror_sync = sünkroonis
|
||||||
|
mirror_sync_on_commit = Sünkrooni sissekannete tegemisel
|
||||||
|
mirror_address = Klooni võrguaadressilt
|
||||||
|
mirror_password_placeholder = (Muutmata)
|
||||||
|
mirror_password_blank_placeholder = (Seadistamata)
|
||||||
|
mirror_password_help = Salvestatud salasõna kustutamiseks muuda kasutajanime.
|
||||||
|
commits.search_branch = See haru
|
||||||
|
commits.search_all = Kõik harud
|
||||||
|
commits.author = Autor
|
||||||
|
commits.message = Sõnum
|
||||||
|
commits.browse_further = Sirvi edasi
|
||||||
|
commits.renamed_from = Nimi muudetud, vana nimi oli „%s“
|
||||||
|
commits.date = Kuupäev
|
||||||
|
commits.older = Vanemad
|
||||||
|
commits.newer = Uuemad
|
||||||
|
commitstatus.error = Viga
|
||||||
|
commitstatus.failure = Tõrge
|
||||||
|
commitstatus.pending = Ootel
|
||||||
|
commitstatus.success = Valmis
|
||||||
|
ext_issues = Välised vead
|
||||||
|
projects = Projektid
|
||||||
|
|
||||||
|
[admin]
|
||||||
|
users.password_helper = Kui sa ei taha salasõna muuta, siis jäta väli tühjaks.
|
||||||
|
auths.bind_password = Seo salasõna
|
||||||
|
config.reset_password_code_lives = Taastekoodi aegumine
|
||||||
|
|
||||||
|
[actions]
|
||||||
|
variables = Muutujad
|
||||||
|
variables.management = Halda muutujaid
|
||||||
|
variables.creation = Lisa muutuja
|
||||||
|
variables.none = Muutujaid veel pole.
|
||||||
|
variables.deletion = Eemalda muutuja
|
|
@ -301,7 +301,7 @@ federated_avatar_lookup=فعال سازی آواتار مشترک
|
||||||
federated_avatar_lookup.description=پیدا کردن آواتار با استفاده از Libravatar.
|
federated_avatar_lookup.description=پیدا کردن آواتار با استفاده از Libravatar.
|
||||||
disable_registration=غیرفعالکردن خود ثبت نامی
|
disable_registration=غیرفعالکردن خود ثبت نامی
|
||||||
disable_registration.description=غیرفعال کردن ثبت نام کاربر. تنها مدیر ها قادر خواهند بود حساب کاربری جدید اضافه کنند.
|
disable_registration.description=غیرفعال کردن ثبت نام کاربر. تنها مدیر ها قادر خواهند بود حساب کاربری جدید اضافه کنند.
|
||||||
allow_only_external_registration.description=اجازه ثبت نام فقط از طریق خدمات خارجی
|
allow_only_external_registration.description=اجازه ثبت نام فقط از طریق خدمات خارجی.
|
||||||
openid_signin=فعالسازی ورود با OpenID
|
openid_signin=فعالسازی ورود با OpenID
|
||||||
openid_signin.description=فعالسازی ورود کاربر با OpenID.
|
openid_signin.description=فعالسازی ورود کاربر با OpenID.
|
||||||
openid_signup=فعالسازی ثبت نام با OpenID
|
openid_signup=فعالسازی ثبت نام با OpenID
|
||||||
|
@ -608,7 +608,7 @@ avatar=آواتار
|
||||||
ssh_gpg_keys=کلیدهای SSH / GPG
|
ssh_gpg_keys=کلیدهای SSH / GPG
|
||||||
social=حساب های اجتماعی
|
social=حساب های اجتماعی
|
||||||
applications=برنامهها
|
applications=برنامهها
|
||||||
orgs=مدیریت سازمانها
|
orgs=سازمانها
|
||||||
repos=مخازن
|
repos=مخازن
|
||||||
delete=حذف حساب کاربری
|
delete=حذف حساب کاربری
|
||||||
twofa=احراز هویت دوگانه
|
twofa=احراز هویت دوگانه
|
||||||
|
@ -653,8 +653,8 @@ password_change_disabled=کاربران غیر محلی نمیتوانند گذ
|
||||||
|
|
||||||
emails=نشانیهای ایمیل
|
emails=نشانیهای ایمیل
|
||||||
manage_emails=مدیریت نشانیهای ایمیل
|
manage_emails=مدیریت نشانیهای ایمیل
|
||||||
manage_themes=تم پیش فرض را انتخاب کنید
|
manage_themes=تم پیش فرض
|
||||||
manage_openid=مدیریت نشانیهای OpenID
|
manage_openid=آدرسهای OpenID
|
||||||
theme_desc=این پوشته پیش فرض شما در سراسر سایت می باشد.
|
theme_desc=این پوشته پیش فرض شما در سراسر سایت می باشد.
|
||||||
primary=اصلی
|
primary=اصلی
|
||||||
activated=فعال شده
|
activated=فعال شده
|
||||||
|
@ -1250,13 +1250,13 @@ issues.close_comment_issue=ثبت دیدگاه و بستن
|
||||||
issues.reopen_issue=بازگشایی
|
issues.reopen_issue=بازگشایی
|
||||||
issues.reopen_comment_issue=ثبت دیدگاه و بازگشایی
|
issues.reopen_comment_issue=ثبت دیدگاه و بازگشایی
|
||||||
issues.create_comment=دیدگاه
|
issues.create_comment=دیدگاه
|
||||||
issues.closed_at=`<a id="%[1]s" href="#%[1]s">%[2]s</a> این موضوع را بست`
|
issues.closed_at=`%s این موضوع را بست`
|
||||||
issues.reopened_at=`<a id="%[1]s" href="#%[1]s">%[2]s</a> این موضوع را دوباره باز کرد`
|
issues.reopened_at=`%s این موضوع را دوباره باز کرد`
|
||||||
issues.commit_ref_at=`ارجاع این مسئله به کامیت <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.commit_ref_at=`ارجاع این مسئله به کامیت %s`
|
||||||
issues.ref_issue_from=`<a href="%[3]s"> ارجاعات این مسائله %[4]</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.ref_issue_from=`<a href="%[2]s"> ارجاعات این مسائله %[3]</a> %[1]s`
|
||||||
issues.ref_pull_from=`<a href="%[3]s"> ارجاعات این تقاضای ادغام %[4]</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.ref_pull_from=`<a href="%[2]s"> ارجاعات این تقاضای ادغام %[4]</a> %[1]s`
|
||||||
issues.ref_closing_from=`<a href="%[3]s"> ارجاعات این تقاضای واکشی %[4]</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.ref_closing_from=`<a href="%[2]s"> ارجاعات این تقاضای واکشی %[4]</a> %[1]s`
|
||||||
issues.ref_reopening_from=`<a href="%[3]s"> تقاضای واکشی ارجاع شده %[4] که مسائله بازگشایی خواهد کرد</a> <a id="%[1]s" href="#%[1]s">%[2] </a>`
|
issues.ref_reopening_from=`<a href="%[2]s"> تقاضای واکشی ارجاع شده %[3]sکه مسائله بازگشایی خواهد کرد</a> <a id="%[1]s" href="#%[1]s">%[2] </a>`
|
||||||
issues.ref_closed_from=`<a href="%[3]s"> بسته شده این مسائله %[4]</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.ref_closed_from=`<a href="%[3]s"> بسته شده این مسائله %[4]</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||||
issues.ref_reopened_from=`<a href="%[3]s"> بازگشایی این مسائله %[4]</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.ref_reopened_from=`<a href="%[3]s"> بازگشایی این مسائله %[4]</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||||
issues.ref_from=`از %[1]`
|
issues.ref_from=`از %[1]`
|
||||||
|
@ -1493,8 +1493,8 @@ pulls.update_branch_rebase=بروزآوری شاخه با بازسازی مجد
|
||||||
pulls.update_branch_success=شاخه به موفقیت بروز شد
|
pulls.update_branch_success=شاخه به موفقیت بروز شد
|
||||||
pulls.update_not_allowed=شما اجازه بروزرسانی شاخه را ندارید
|
pulls.update_not_allowed=شما اجازه بروزرسانی شاخه را ندارید
|
||||||
pulls.outdated_with_base_branch=این شاخه با شاخه پایه منسوخ شده است
|
pulls.outdated_with_base_branch=این شاخه با شاخه پایه منسوخ شده است
|
||||||
pulls.closed_at=`این درخواست pull بسته شده <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
pulls.closed_at=`این درخواست pull بسته شده %s`
|
||||||
pulls.reopened_at=`این درخواست pull را بازگشایی کرد <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
pulls.reopened_at=`این درخواست pull را بازگشایی کرد %s`
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -2762,27 +2762,27 @@ directory = پوشه
|
||||||
|
|
||||||
[search]
|
[search]
|
||||||
type_tooltip = جستجو گونه
|
type_tooltip = جستجو گونه
|
||||||
search = جستجو...
|
search = جستجو…
|
||||||
fuzzy = درهم
|
fuzzy = درهم
|
||||||
fuzzy_tooltip = پیامدهایی را درج کنید که دقیقا با عبارت جستجو همخوانی داشته باشند
|
fuzzy_tooltip = پیامدهایی را درج کنید که دقیقا با عبارت جستجو همخوانی داشته باشند
|
||||||
regexp = عبارات باقاعده
|
regexp = عبارات باقاعده
|
||||||
pull_kind = جستجو واکشیها...
|
pull_kind = جستجو واکشیها…
|
||||||
no_results = نتیجه درخوری یافت نشد.
|
no_results = نتیجه درخوری یافت نشد.
|
||||||
runner_kind = جستجو دوندهها...
|
runner_kind = جستجو دوندهها…
|
||||||
keyword_search_unavailable = جستجو کلیدواژه اکنون در درسترس نیست. لطفا با مدیر سایت در میان بگذارید.
|
keyword_search_unavailable = جستجو کلیدواژه اکنون در درسترس نیست. لطفا با مدیر سایت در میان بگذارید.
|
||||||
repo_kind = جستجو مخازن...
|
repo_kind = جستجو مخازن…
|
||||||
regexp_tooltip = اصطلاح جستجو شده را با عبارات باقاعده تفسیر کن
|
regexp_tooltip = اصطلاح جستجو شده را با عبارات باقاعده تفسیر کن
|
||||||
user_kind = جستجو کاربران...
|
user_kind = جستجو کاربران…
|
||||||
org_kind = جستجو سازمانها...
|
org_kind = جستجو سازمانها…
|
||||||
team_kind = جستجو گروهها...
|
team_kind = جستجو گروهها…
|
||||||
package_kind = جستجو بستهها...
|
package_kind = جستجو بستهها…
|
||||||
project_kind = جستجو پروژهها...
|
project_kind = جستجو پروژهها…
|
||||||
code_search_unavailable = جستجوی کد اکنون در دسترس نیست. لطفا با مدیر سایت درمیان بگذارید.
|
code_search_unavailable = جستجوی کد اکنون در دسترس نیست. لطفا با مدیر سایت درمیان بگذارید.
|
||||||
code_kind = جستجو کدها...
|
code_kind = جستجو کدها…
|
||||||
union = بهم پیوستگی
|
union = بهم پیوستگی
|
||||||
union_tooltip = نتایجی را در بر بگیر که با هر یک از کلیدواژههای جدا شده از فضایخالی مطابقت دارد
|
union_tooltip = نتایجی را در بر بگیر که با هر یک از کلیدواژههای جدا شده از فضایخالی مطابقت دارد
|
||||||
branch_kind = جستجو شاخهها...
|
branch_kind = جستجو شاخهها…
|
||||||
commit_kind = جستجو سپردهها...
|
commit_kind = جستجو سپردهها…
|
||||||
issue_kind = جستجو مشکلات...
|
issue_kind = جستجو مشکلات…
|
||||||
exact = مو به مو
|
exact = مو به مو
|
||||||
exact_tooltip = نتایجی را در بر بگیر که مو به مو با اصطلاح جستجو شده یکی باشد
|
exact_tooltip = نتایجی را در بر بگیر که مو به مو با اصطلاح جستجو شده یکی باشد
|
||||||
|
|
|
@ -669,6 +669,13 @@ username_claiming_cooldown = Käyttäjänimeä ei voi ottaa käyttöön, koska s
|
||||||
email_domain_is_not_allowed = Käyttäjän sähköpostiosoitteen <b>%s</b> verkkotunnus on ristiriidassa EMAIL_DOMAIN_ALLOWLIST:in tai EMAIL_DOMAIN_BLOCKLIST:in kanssa. Varmista, että olen asettanut sähköpostiosoitteen oikein.
|
email_domain_is_not_allowed = Käyttäjän sähköpostiosoitteen <b>%s</b> verkkotunnus on ristiriidassa EMAIL_DOMAIN_ALLOWLIST:in tai EMAIL_DOMAIN_BLOCKLIST:in kanssa. Varmista, että olen asettanut sähköpostiosoitteen oikein.
|
||||||
|
|
||||||
|
|
||||||
|
invalid_group_team_map_error = ` kuvaus ei ole kelvollinen: %s`
|
||||||
|
visit_rate_limit = Etävierailujen pyyntörajoitukset.
|
||||||
|
2fa_auth_required = Etävierailu vaati kaksivaiheisen todennuksen.
|
||||||
|
unset_password = Kirjautuneen käyttäjän salasanaa ei ole asetettu.
|
||||||
|
unsupported_login_type = Tällä kirjautumistavalla ei voi poistaa tunnusta.
|
||||||
|
invalid_ssh_principal = Väärä toimija: %s
|
||||||
|
|
||||||
[user]
|
[user]
|
||||||
change_avatar=Vaihda profiilikuvasi…
|
change_avatar=Vaihda profiilikuvasi…
|
||||||
repositories=Tietovarastot
|
repositories=Tietovarastot
|
||||||
|
@ -1038,6 +1045,9 @@ then_enter_passcode = Kirjoita sovelluksessa näkyvä pääsykoodi:
|
||||||
gpg_key_matched_identities_long = Tähän avaimeen upotetut identiteetit vastaavat tämän käyttäjän seuraavia aktivoituja sähköpostiosoitteita. Kommitit, jotka vastaavat näitä sähköpostiosoitteita, voidaan vahvistaa tällä avaimella.
|
gpg_key_matched_identities_long = Tähän avaimeen upotetut identiteetit vastaavat tämän käyttäjän seuraavia aktivoituja sähköpostiosoitteita. Kommitit, jotka vastaavat näitä sähköpostiosoitteita, voidaan vahvistaa tällä avaimella.
|
||||||
twofa_failed_get_secret = Salaisuuden saaminen epäonnistui.
|
twofa_failed_get_secret = Salaisuuden saaminen epäonnistui.
|
||||||
|
|
||||||
|
uid = UID
|
||||||
|
hidden_comment_types.ref_tooltip = Kommentit missä tähän ongelmaan viitattiin toisesta ongelmasta/kommitista/…
|
||||||
|
|
||||||
[repo]
|
[repo]
|
||||||
owner=Omistaja
|
owner=Omistaja
|
||||||
owner_helper=Jotkin organisaatiot eivät välttämättä näy pudotusvalikossa, koska tietovarastojen enimmäismäärää on rajoitettu.
|
owner_helper=Jotkin organisaatiot eivät välttämättä näy pudotusvalikossa, koska tietovarastojen enimmäismäärää on rajoitettu.
|
||||||
|
@ -1293,9 +1303,9 @@ issues.close_comment_issue=Kommentoi ja sulje
|
||||||
issues.reopen_issue=Avaa uudelleen
|
issues.reopen_issue=Avaa uudelleen
|
||||||
issues.reopen_comment_issue=Kommentoi ja avaa uudelleen
|
issues.reopen_comment_issue=Kommentoi ja avaa uudelleen
|
||||||
issues.create_comment=Kommentoi
|
issues.create_comment=Kommentoi
|
||||||
issues.closed_at=`sulki tämän ongelman <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.closed_at=`sulki tämän ongelman %s`
|
||||||
issues.reopened_at=`uudelleenavasi tämän ongelman <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.reopened_at=`uudelleenavasi tämän ongelman %s`
|
||||||
issues.commit_ref_at=`viittasi tähän ongelmaan kommitissa <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.commit_ref_at=`viittasi tähän ongelmaan kommitissa %s`
|
||||||
issues.author=Tekijä
|
issues.author=Tekijä
|
||||||
issues.role.owner=Omistaja
|
issues.role.owner=Omistaja
|
||||||
issues.role.member=Jäsen
|
issues.role.member=Jäsen
|
||||||
|
@ -2185,7 +2195,7 @@ settings.confirmation_string = Vahvistusteksti
|
||||||
settings.delete_notices_2 = - Tämä toiminto poistaa pysyvästi tietovaraston <strong>%s</strong> mukaan lukien koodin, ongelmat, kommentit, wikidatan ja avustaja-asetukset.
|
settings.delete_notices_2 = - Tämä toiminto poistaa pysyvästi tietovaraston <strong>%s</strong> mukaan lukien koodin, ongelmat, kommentit, wikidatan ja avustaja-asetukset.
|
||||||
issues.filter_assginee_no_select = Kaikki käsittelijät
|
issues.filter_assginee_no_select = Kaikki käsittelijät
|
||||||
issues.new.assign_to_me = Osoita itselle
|
issues.new.assign_to_me = Osoita itselle
|
||||||
pulls.closed_at = `sulki tämän vetopyynnön <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
pulls.closed_at = `sulki tämän vetopyynnön %s`
|
||||||
tree_path_not_found_branch = Polkua %[1]s ei ole olemassa haarassa %[2]s
|
tree_path_not_found_branch = Polkua %[1]s ei ole olemassa haarassa %[2]s
|
||||||
transfer.no_permission_to_reject = Sinulla ei ole oikeutta hylätä tätä siirtoa.
|
transfer.no_permission_to_reject = Sinulla ei ole oikeutta hylätä tätä siirtoa.
|
||||||
generate_repo = Luo tietovarasto
|
generate_repo = Luo tietovarasto
|
||||||
|
@ -2199,8 +2209,8 @@ issues.new.no_reviewers = Ei katselmoijia
|
||||||
issues.add_label = lisäsi nimilapun %s %s
|
issues.add_label = lisäsi nimilapun %s %s
|
||||||
issues.due_date_added = lisäsi eräpäivän %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.review.add_review_request = pyysi katselmointia käyttäjältä %[1]s %[2]s
|
||||||
issues.ref_pull_from = `<a href="%[3]s">viittasi tähän vetopyyntöön %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
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 <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
pulls.commit_ref_at = `viittasi tähän vetopyyntöön kommitista %s`
|
||||||
issues.review.comment = katselmoi %s
|
issues.review.comment = katselmoi %s
|
||||||
issues.add_labels = lisäsi nimilaput %s %s
|
issues.add_labels = lisäsi nimilaput %s %s
|
||||||
issues.review.add_review_requests = pyysi katselmointeja käyttäjiltä %[1]s %[2]s
|
issues.review.add_review_requests = pyysi katselmointeja käyttäjiltä %[1]s %[2]s
|
||||||
|
@ -2255,14 +2265,14 @@ pulls.cmd_instruction_merge_warning = <b>Varoitus:</b> Asetusta ”Tunnista manu
|
||||||
pulls.cmd_instruction_merge_desc = Yhdistä muutokset ja päivitä Forgejossa.
|
pulls.cmd_instruction_merge_desc = Yhdistä muutokset ja päivitä Forgejossa.
|
||||||
pulls.cannot_auto_merge_desc = Tätä vetopyyntöä ei voida yhdistää automaattisesti ristiriitojen vuoksi.
|
pulls.cannot_auto_merge_desc = Tätä vetopyyntöä ei voida yhdistää automaattisesti ristiriitojen vuoksi.
|
||||||
adopt_preexisting_success = Omaksuttu tiedostot ja luotu tietovarasto lähteestä %s
|
adopt_preexisting_success = Omaksuttu tiedostot ja luotu tietovarasto lähteestä %s
|
||||||
issues.comment_manually_pull_merged_at = manuaalisesti yhdistetty kommitti %[1]s %[2]s tietovarastoon %[3]s
|
issues.comment_manually_pull_merged_at = manuaalisesti yhdisti kommitin %[1]s %[2]s tietovarastoon %[3]s
|
||||||
pulls.cmd_instruction_merge_title = Yhdistä
|
pulls.cmd_instruction_merge_title = Yhdistä
|
||||||
pulls.has_merged = Epäonnistui: vetopyyntö on yhdistetty, joten et voi yhdistää uudelleen tai muuttaa kohdehaaraa.
|
pulls.has_merged = Epäonnistui: vetopyyntö on yhdistetty, joten et voi yhdistää uudelleen tai muuttaa kohdehaaraa.
|
||||||
pulls.cmd_instruction_checkout_title = Uloskuittaus
|
pulls.cmd_instruction_checkout_title = Uloskuittaus
|
||||||
pulls.cmd_instruction_checkout_desc = Kuittaa ulos uusi haara projektitietovarastostasi ja testaa muutokset.
|
pulls.cmd_instruction_checkout_desc = Kuittaa ulos uusi haara projektitietovarastostasi ja testaa muutokset.
|
||||||
pulls.clear_merge_message_hint = Yhdistämisviestin tyhjentäminen poistaa vain kommittiviestin sisällön ja säilyttää luodut git-trailerit, kuten "Co-Authored-By…".
|
pulls.clear_merge_message_hint = Yhdistämisviestin tyhjentäminen poistaa vain kommittiviestin sisällön ja säilyttää luodut git-trailerit, kuten "Co-Authored-By…".
|
||||||
settings.protect_check_status_contexts_desc = Vaadi tilatarkistusten läpäisy ennen yhdistämistä. Kun käytössä, kommitit on ensin työnnettävä toiseen haaraan ja sitten yhdistettävä tai työnnettävä suoraan tätä sääntöä vastaavaan haaraan tilantarkistuksen jälkeen. Jos konteksteja ei löydy, viimeisen kommitin on oltava onnistunut kontekstista riippumatta.
|
settings.protect_check_status_contexts_desc = Vaadi tilatarkistusten läpäisy ennen yhdistämistä. Kun käytössä, kommitit on ensin työnnettävä toiseen haaraan ja sitten yhdistettävä tai työnnettävä suoraan tätä sääntöä vastaavaan haaraan tilantarkistuksen jälkeen. Jos konteksteja ei löydy, viimeisen kommitin on oltava onnistunut kontekstista riippumatta.
|
||||||
issues.comment_pull_merged_at = yhdistetty kommitti %[1]s %[2]s tietovarastoon %[3]s
|
issues.comment_pull_merged_at = yhdisti kommitin %[1]s %[2]s haaraan %[3]s
|
||||||
settings.pulls.enable_autodetect_manual_merge = Ota Tunnista manuaalinen yhdistäminen automaattisesti -asetus käyttöön (Huomaa: joissakin erityistapauksissa voi esiintyä virhearviointeja)
|
settings.pulls.enable_autodetect_manual_merge = Ota Tunnista manuaalinen yhdistäminen automaattisesti -asetus käyttöön (Huomaa: joissakin erityistapauksissa voi esiintyä virhearviointeja)
|
||||||
pulls.no_merge_desc = Tätä vetopyyntöä ei voida yhdistää, koska kaikki tietovaraston yhdistämisvaihtoehdot ovat poistettu käytöstä.
|
pulls.no_merge_desc = Tätä vetopyyntöä ei voida yhdistää, koska kaikki tietovaraston yhdistämisvaihtoehdot ovat poistettu käytöstä.
|
||||||
pulls.no_merge_not_ready = Tämä vetopyyntö ei ole valmis yhdistettäväksi. Tarkista katselmoinnin tila ja tilantarkistukset.
|
pulls.no_merge_not_ready = Tämä vetopyyntö ei ole valmis yhdistettäväksi. Tarkista katselmoinnin tila ja tilantarkistukset.
|
||||||
|
@ -2381,7 +2391,7 @@ 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.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_warning = Jotkin tarkistukset raportoivat varoituksia
|
||||||
pulls.status_checks_error = Jotkin tarkistukset raportoivat virheitä
|
pulls.status_checks_error = Jotkin tarkistukset raportoivat virheitä
|
||||||
pulls.reopened_at = `avasi uudelleen tämän vetopyynnön <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
pulls.reopened_at = `avasi uudelleen tämän vetopyynnön %s`
|
||||||
pulls.auto_merge_when_succeed = Yhdistä automaatisesti kun kaikki tarkistukset onnistuvat
|
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 tarkistaessa voiko kommitin allekirjoittaa.
|
||||||
signing.wont_sign.twofa = Sinulla tulee olla kaksivaiheinen todennus käytössä, jotta kommitit voi allekirjoittaa.
|
signing.wont_sign.twofa = Sinulla tulee olla kaksivaiheinen todennus käytössä, jotta kommitit voi allekirjoittaa.
|
||||||
|
|
|
@ -365,7 +365,7 @@ table_modal.label.columns = Mga Column
|
||||||
link_modal.header = Magdagdag ng link
|
link_modal.header = Magdagdag ng link
|
||||||
link_modal.url = Url
|
link_modal.url = Url
|
||||||
link_modal.description = Deskripsyon
|
link_modal.description = Deskripsyon
|
||||||
link_modal.paste_reminder = Pahiwatig: Kapag may URL sa clipboard, maari mong direktang i-paste sa editor para gumawa ng link.
|
link_modal.paste_reminder = Pahiwatig: Kapag may URL sa clipboard, maaari mong direktang i-paste sa editor para gumawa ng link.
|
||||||
|
|
||||||
[filter]
|
[filter]
|
||||||
string.asc = A - Z
|
string.asc = A - Z
|
||||||
|
@ -432,7 +432,7 @@ openid_connect_desc = Ang piniling OpenID URI ay hindi alam. Iugnay iyan sa bago
|
||||||
invalid_code = Ang iyong confirmation code ay hindi wasto o nag-expire na.
|
invalid_code = Ang iyong confirmation code ay hindi wasto o nag-expire na.
|
||||||
oauth_signin_title = Mag-sign in para pahintulutan ang naka-link na account
|
oauth_signin_title = Mag-sign in para pahintulutan ang naka-link na account
|
||||||
invalid_code_forgot_password = Ang iyong confirmation code ay hindi wasto o nag-expire na. Mag-click <a href="%s">dito</a> para magsimula ng bagong session.
|
invalid_code_forgot_password = Ang iyong confirmation code ay hindi wasto o nag-expire na. Mag-click <a href="%s">dito</a> para magsimula ng bagong session.
|
||||||
confirmation_mail_sent_prompt = Ang isang bagong email na pang-kumpirma ay ipinadala sa <b>%s</b>. Para kumpletuhin ang proseso ng pagrehistro, pakisuri ang iyong inbox at sundan ang ibinigay na link sa loob ng %s. Kung mali ang email, maari kang mag-log in, at humingi ng isa pang email pang-kumpirma na ipapadala sa ibang address.
|
confirmation_mail_sent_prompt = Ang isang bagong email na pang-kumpirma ay ipinadala sa <b>%s</b>. Para kumpletuhin ang proseso ng pagrehistro, pakisuri ang iyong inbox at sundan ang ibinigay na link sa loob ng %s. Kung mali ang email, maaari kang mag-log in, at humingi ng isa pang email pang-kumpirma na ipapadala sa ibang address.
|
||||||
invalid_password = Ang iyong password ay hindi tugma sa password na ginamit para gawin ang account.
|
invalid_password = Ang iyong password ay hindi tugma sa password na ginamit para gawin ang account.
|
||||||
twofa_scratch_used = Ginamit mo na ang scratch code. Na-redirect ka sa two-factor settings page para tanggalin ang device enrollment o mag-generate ng bagong scratch code.
|
twofa_scratch_used = Ginamit mo na ang scratch code. Na-redirect ka sa two-factor settings page para tanggalin ang device enrollment o mag-generate ng bagong scratch code.
|
||||||
manual_activation_only = Makipag-ugnayan sa tagapangangasiwa ng site para kumpletuhin ang pagrehistro.
|
manual_activation_only = Makipag-ugnayan sa tagapangangasiwa ng site para kumpletuhin ang pagrehistro.
|
||||||
|
@ -484,7 +484,7 @@ admin.new_user.text = Mangyaring <a href="%s">mag-click dito</a> para ipamahala
|
||||||
register_notify = Maligayang Pagdating sa %s
|
register_notify = Maligayang Pagdating sa %s
|
||||||
register_notify.title = %[1]s, maligayang pagdating sa %[2]s
|
register_notify.title = %[1]s, maligayang pagdating sa %[2]s
|
||||||
register_notify.text_1 = ito ang iyong registration confirmation email para sa %s!
|
register_notify.text_1 = ito ang iyong registration confirmation email para sa %s!
|
||||||
register_notify.text_2 = Maari kang mag-sign in sa iyong account gamit ng iyong username: %s
|
register_notify.text_2 = Maaari kang mag-sign in sa iyong account gamit ng iyong username: %s
|
||||||
reset_password = I-recover ang iyong account
|
reset_password = I-recover ang iyong account
|
||||||
reset_password.title = %s, nagkaroon kami ng hiling para i-recover ang iyong account
|
reset_password.title = %s, nagkaroon kami ng hiling para i-recover ang iyong account
|
||||||
reset_password.text = Kung ikaw ito, paki-click ang sumusunod na link para i-recover ang iyong account sa loob ng <b>%s</b>:
|
reset_password.text = Kung ikaw ito, paki-click ang sumusunod na link para i-recover ang iyong account sa loob ng <b>%s</b>:
|
||||||
|
@ -535,7 +535,7 @@ totp_disabled.text_1 = Ngayon lang na-disable ang Time-based one-time password (
|
||||||
totp_disabled.no_2fa = Wala nang mga ibang paraan ng 2FA ang naka-configure, nangangahulugan na hindi na kailangang mag-log in sa iyong account gamit ang 2FA.
|
totp_disabled.no_2fa = Wala nang mga ibang paraan ng 2FA ang naka-configure, nangangahulugan na hindi na kailangang mag-log in sa iyong account gamit ang 2FA.
|
||||||
removed_security_key.subject = May tinanggal na security key
|
removed_security_key.subject = May tinanggal na security key
|
||||||
removed_security_key.text_1 = Tinanggal ngayon lang ang security key na "%[1]s" sa iyong account.
|
removed_security_key.text_1 = Tinanggal ngayon lang ang security key na "%[1]s" sa iyong account.
|
||||||
account_security_caution.text_1 = Kung ikaw ito, maari mong ligtas na huwag pansinin ang mail na ito.
|
account_security_caution.text_1 = Kung ikaw ito, maaari mong ligtas na huwag pansinin ang mail na ito.
|
||||||
account_security_caution.text_2 = Kung hindi ito ikaw, nakompromiso ang iyong account. Mangyaring makipag-ugnayan sa mga tagapangasiwa ng site na ito.
|
account_security_caution.text_2 = Kung hindi ito ikaw, nakompromiso ang iyong account. Mangyaring makipag-ugnayan sa mga tagapangasiwa ng site na ito.
|
||||||
totp_enrolled.subject = Nag-activate ka ng TOTP bilang paraan ng 2FA
|
totp_enrolled.subject = Nag-activate ka ng TOTP bilang paraan ng 2FA
|
||||||
totp_enrolled.text_1.has_webauthn = Na-enable mo lang ang TOTP para sa iyong account. Nangangahulugan ito na para sa lahat ng mga hinaharap na pag-login sa iyong account, kailangan mong gumamit ng TOTP bilang paraan ng 2FA o gamitin ang iyong mga security key.
|
totp_enrolled.text_1.has_webauthn = Na-enable mo lang ang TOTP para sa iyong account. Nangangahulugan ito na para sa lahat ng mga hinaharap na pag-login sa iyong account, kailangan mong gumamit ng TOTP bilang paraan ng 2FA o gamitin ang iyong mga security key.
|
||||||
|
@ -644,7 +644,7 @@ AccessToken = Token ng pag-access
|
||||||
Biography = Byograpya
|
Biography = Byograpya
|
||||||
Location = Lokasyon
|
Location = Lokasyon
|
||||||
visit_rate_limit = Natugunan ang limitasyon sa rate ng malayuang pagbisita.
|
visit_rate_limit = Natugunan ang limitasyon sa rate ng malayuang pagbisita.
|
||||||
username_claiming_cooldown = Hindi ma-claim ang username na ito, dahil hindi pa tapos ang panahon ng cooldown. Maari itong i-claim sa %[1]s.
|
username_claiming_cooldown = Hindi ma-claim ang username na ito, dahil hindi pa tapos ang panahon ng cooldown. Maaari itong i-claim sa %[1]s.
|
||||||
email_domain_is_not_allowed = Sumasalungat ang domain ng email address ng user <b>%s</b> sa EMAIL_DOMAIN_ALLOWLIST o EMAIL_DOMAIN_BLOCKLIST. Siguraduhing natakda mo ang email address nang tama.
|
email_domain_is_not_allowed = Sumasalungat ang domain ng email address ng user <b>%s</b> sa EMAIL_DOMAIN_ALLOWLIST o EMAIL_DOMAIN_BLOCKLIST. Siguraduhing natakda mo ang email address nang tama.
|
||||||
|
|
||||||
[user]
|
[user]
|
||||||
|
@ -685,7 +685,7 @@ followers.title.few = Mga tagasunod
|
||||||
following.title.one = Sinusundan
|
following.title.one = Sinusundan
|
||||||
followers.title.one = Tagasunod
|
followers.title.one = Tagasunod
|
||||||
public_activity.visibility_hint.self_public = Nakikita ng lahat ang iyong aktibidad, maliban sa mga interaksyon sa pribadong espasyo. <a href="%s">I-configure</a>.
|
public_activity.visibility_hint.self_public = Nakikita ng lahat ang iyong aktibidad, maliban sa mga interaksyon sa pribadong espasyo. <a href="%s">I-configure</a>.
|
||||||
public_activity.visibility_hint.admin_public = Nakikita ng lahat ang aktibidad na ito, ngunit bilang tagapangasiwa maari mo ring makita ang mga interaksyon sa mga pribadong espasyo.
|
public_activity.visibility_hint.admin_public = Nakikita ng lahat ang aktibidad na ito, ngunit bilang tagapangasiwa maaari mo ring makita ang mga interaksyon sa mga pribadong espasyo.
|
||||||
public_activity.visibility_hint.self_private = Nakikita mo lang at mga tagapangasiwa ng instansya ang iyong aktibidad. <a href="%s">I-configure</a>.
|
public_activity.visibility_hint.self_private = Nakikita mo lang at mga tagapangasiwa ng instansya ang iyong aktibidad. <a href="%s">I-configure</a>.
|
||||||
public_activity.visibility_hint.admin_private = Nakikita mo ang aktibidad na ito dahil isa kang tagapangasiwa, ngunit gusto ng user na panatilihin itong pribado.
|
public_activity.visibility_hint.admin_private = Nakikita mo ang aktibidad na ito dahil isa kang tagapangasiwa, ngunit gusto ng user na panatilihin itong pribado.
|
||||||
public_activity.visibility_hint.self_private_profile = Ikaw lang at ang mga tagapangasiwa ng instansya ang makakakita ng iyong aktibidad dahil pribado ang iyong profile. <a href="%s">I-configure</a>.
|
public_activity.visibility_hint.self_private_profile = Ikaw lang at ang mga tagapangasiwa ng instansya ang makakakita ng iyong aktibidad dahil pribado ang iyong profile. <a href="%s">I-configure</a>.
|
||||||
|
@ -699,7 +699,7 @@ security = Seguridad
|
||||||
avatar = Avatar
|
avatar = Avatar
|
||||||
ssh_gpg_keys = Mga SSH / GPG key
|
ssh_gpg_keys = Mga SSH / GPG key
|
||||||
applications = Mga Aplikasyon
|
applications = Mga Aplikasyon
|
||||||
orgs = Ipamahala ang mga organisasyon
|
orgs = Mga organisasyon
|
||||||
repos = Mga Repositoryo
|
repos = Mga Repositoryo
|
||||||
delete = Burahin ang account
|
delete = Burahin ang account
|
||||||
twofa = Authentikasyong two-factor (TOTP)
|
twofa = Authentikasyong two-factor (TOTP)
|
||||||
|
@ -707,7 +707,7 @@ account_link = Mga naka-link na account
|
||||||
uid = UID
|
uid = UID
|
||||||
webauthn = Authentikasyong two-factor (Mga security key)
|
webauthn = Authentikasyong two-factor (Mga security key)
|
||||||
blocked_users = Mga hinarang na user
|
blocked_users = Mga hinarang na user
|
||||||
public_profile = Pampublikong Profile
|
public_profile = Pampublikong profile
|
||||||
location_placeholder = Ibahagi ang iyong tinatayang lokasyon sa iba
|
location_placeholder = Ibahagi ang iyong tinatayang lokasyon sa iba
|
||||||
password_username_disabled = Ang mga di-lokal na gumagamit ay hindi pinapayagan na baguhin ang kanilang username. Mangyaring makipag-ugnayan sa iyong tagapangasiwa ng site para sa higit pang mga detalye.
|
password_username_disabled = Ang mga di-lokal na gumagamit ay hindi pinapayagan na baguhin ang kanilang username. Mangyaring makipag-ugnayan sa iyong tagapangasiwa ng site para sa higit pang mga detalye.
|
||||||
full_name = Buong pangalan
|
full_name = Buong pangalan
|
||||||
|
@ -842,7 +842,7 @@ gpg_key_verify = I-verify
|
||||||
gpg_invalid_token_signature = Ang ibinigay na GPG key, signature, at token ay hindi tumutugma o luma.
|
gpg_invalid_token_signature = Ang ibinigay na GPG key, signature, at token ay hindi tumutugma o luma.
|
||||||
gpg_token_required = Kailangan mong magbigay ng signature para sa token sa ibaba
|
gpg_token_required = Kailangan mong magbigay ng signature para sa token sa ibaba
|
||||||
gpg_token = Token
|
gpg_token = Token
|
||||||
gpg_token_help = Maari kang mag-generate ng signature gamit ng:
|
gpg_token_help = Maaari kang mag-generate ng signature gamit ng:
|
||||||
gpg_token_signature = Naka-armor na GPG signature
|
gpg_token_signature = Naka-armor na GPG signature
|
||||||
key_signature_gpg_placeholder = Nagsisimula sa "-----BEGIN PGP SIGNATURE-----"
|
key_signature_gpg_placeholder = Nagsisimula sa "-----BEGIN PGP SIGNATURE-----"
|
||||||
verify_gpg_key_success = Na-verify na ang GPG key na "%s".
|
verify_gpg_key_success = Na-verify na ang GPG key na "%s".
|
||||||
|
@ -851,7 +851,7 @@ ssh_key_verify = I-verify
|
||||||
ssh_invalid_token_signature = Ang ibinigay na SSH key, signature, o token ay hindi tumutugma o luma.
|
ssh_invalid_token_signature = Ang ibinigay na SSH key, signature, o token ay hindi tumutugma o luma.
|
||||||
ssh_token_required = Kailangan mong magbigay ng signature para sa token sa ibaba
|
ssh_token_required = Kailangan mong magbigay ng signature para sa token sa ibaba
|
||||||
ssh_token = Token
|
ssh_token = Token
|
||||||
ssh_token_help = Maari kang mag-generate ng signature gamit ng:
|
ssh_token_help = Maaari kang mag-generate ng signature gamit ng:
|
||||||
ssh_token_signature = Naka-armor na SSH signature
|
ssh_token_signature = Naka-armor na SSH signature
|
||||||
key_signature_ssh_placeholder = Nagsisimula sa "-----BEGIN SSH SIGNATURE-----"
|
key_signature_ssh_placeholder = Nagsisimula sa "-----BEGIN SSH SIGNATURE-----"
|
||||||
verify_ssh_key_success = Na-verify na ang SSH key na "%s".
|
verify_ssh_key_success = Na-verify na ang SSH key na "%s".
|
||||||
|
@ -912,10 +912,10 @@ create_oauth2_application_success = Matagumpay kang gumawa ang bagong OAuth2 app
|
||||||
oauth2_confidential_client = Kumpidensyal na kliyente. Piliin para sa mga app na pinapatilihing kumpidensyal ang sikreto, tulad ng mga web app. Huwag piliin para sa mga web app kasama ang mga desktop at mobile app.
|
oauth2_confidential_client = Kumpidensyal na kliyente. Piliin para sa mga app na pinapatilihing kumpidensyal ang sikreto, tulad ng mga web app. Huwag piliin para sa mga web app kasama ang mga desktop at mobile app.
|
||||||
twofa_desc = Para protektahin ang iyong account laban sa pagnanakaw ng password, pwede mo gamitin ang iyong smartphone o ibang device para sa pagtanggap ng time-based one-time password ("TOTP").
|
twofa_desc = Para protektahin ang iyong account laban sa pagnanakaw ng password, pwede mo gamitin ang iyong smartphone o ibang device para sa pagtanggap ng time-based one-time password ("TOTP").
|
||||||
twofa_scratch_token_regenerated = Ang iyong isang-beses na paggamit na recovery key ngayon ay %s. Ilagay ito sa ligtas na lugar, dahil hindi na ito ipapakita muli.
|
twofa_scratch_token_regenerated = Ang iyong isang-beses na paggamit na recovery key ngayon ay %s. Ilagay ito sa ligtas na lugar, dahil hindi na ito ipapakita muli.
|
||||||
regenerate_scratch_token_desc = Kapag nawala mo ang iyong recovery key o ginamit mo na oara mag-sign in, maari mong i-reset dito.
|
regenerate_scratch_token_desc = Kapag nawala mo ang iyong recovery key o ginamit mo na oara mag-sign in, maaari mong i-reset dito.
|
||||||
twofa_disable_desc = Ang pag-disable ng authentikasyong two-factor ay gagawing hindi gaanong ligtas ang iyong account. Magpatuloy?
|
twofa_disable_desc = Ang pag-disable ng authentikasyong two-factor ay gagawing hindi gaanong ligtas ang iyong account. Magpatuloy?
|
||||||
twofa_enrolled = Matagumpay na na-enroll ang iyong account. Ilagay ang iyong isang-beses na paggamit na recovery key (%s) sa isang ligtas na lugar, dahil hindi na ito ipapakita muli.
|
twofa_enrolled = Matagumpay na na-enroll ang iyong account. Ilagay ang iyong isang-beses na paggamit na recovery key (%s) sa isang ligtas na lugar, dahil hindi na ito ipapakita muli.
|
||||||
webauthn_desc = Ang mga security key ay isang hardware device na naglalaman ng mga cryptographic key. Maari silang gamitin para sa authentikasyong two-factor. Ang mga security key ay dapat suportahan ang <a rel="noreferrer" target="_blank" href="%s">WebAuthn Authenticator</a> na standard.
|
webauthn_desc = Ang mga security key ay isang hardware device na naglalaman ng mga cryptographic key. Maaari silang gamitin para sa authentikasyong two-factor. Ang mga security key ay dapat suportahan ang <a rel="noreferrer" target="_blank" href="%s">WebAuthn Authenticator</a> na standard.
|
||||||
remove_oauth2_application = Tanggalin ang OAuth2 Application
|
remove_oauth2_application = Tanggalin ang OAuth2 Application
|
||||||
remove_oauth2_application_desc = Ang pagtanggal ng OAuth2 application ay babawiin ang access sa lahat ng mga naka-sign na access token. Magpatuloy?
|
remove_oauth2_application_desc = Ang pagtanggal ng OAuth2 application ay babawiin ang access sa lahat ng mga naka-sign na access token. Magpatuloy?
|
||||||
remove_oauth2_application_success = Binura na ang application.
|
remove_oauth2_application_success = Binura na ang application.
|
||||||
|
@ -931,13 +931,13 @@ oauth2_regenerate_secret = I-regenerate ang sikreto
|
||||||
oauth2_regenerate_secret_hint = Nawala mo ang iyong sikreto?
|
oauth2_regenerate_secret_hint = Nawala mo ang iyong sikreto?
|
||||||
oauth2_client_secret_hint = Ang sikreto ay hindi ipapakita muli pagkatapos umalis ka o i-refresh ang page na ito. Mangyaring siguraduhin na na-save mo iyan.
|
oauth2_client_secret_hint = Ang sikreto ay hindi ipapakita muli pagkatapos umalis ka o i-refresh ang page na ito. Mangyaring siguraduhin na na-save mo iyan.
|
||||||
oauth2_application_edit = I-edit
|
oauth2_application_edit = I-edit
|
||||||
twofa_recovery_tip = Kapag mawala mo ang iyong device, maari kang gumamit ng isang isang-beses na paggamit na recovery key para makakuha muli ng access sa iyong account.
|
twofa_recovery_tip = Kapag mawala mo ang iyong device, maaari kang gumamit ng isang isang-beses na paggamit na recovery key para makakuha muli ng access sa iyong account.
|
||||||
twofa_is_enrolled = Ang iyong account ay kasalukuyang <strong>naka-enroll</strong> sa autentikasyong two-factor.
|
twofa_is_enrolled = Ang iyong account ay kasalukuyang <strong>naka-enroll</strong> sa autentikasyong two-factor.
|
||||||
twofa_not_enrolled = Kasalukuyang hindi naka-enroll ang iyong account sa authentikasyong two-factor.
|
twofa_not_enrolled = Kasalukuyang hindi naka-enroll ang iyong account sa authentikasyong two-factor.
|
||||||
twofa_disable = I-disable ang authentikasyong two-factor
|
twofa_disable = I-disable ang authentikasyong two-factor
|
||||||
twofa_scratch_token_regenerate = I-regenerate ang isang-beses na paggamit na recovery key
|
twofa_scratch_token_regenerate = I-regenerate ang isang-beses na paggamit na recovery key
|
||||||
twofa_enroll = Mag-enroll sa authentikasyong two-factor
|
twofa_enroll = Mag-enroll sa authentikasyong two-factor
|
||||||
twofa_disable_note = Maari mong i-disable ang authentikasyong two-factor kapag kinakailangan.
|
twofa_disable_note = Maaari mong i-disable ang authentikasyong two-factor kapag kinakailangan.
|
||||||
twofa_disabled = Na-disable na ang authentikasyong two-factor.
|
twofa_disabled = Na-disable na ang authentikasyong two-factor.
|
||||||
scan_this_image = I-scan ang image na ito gamit ng iyong aplikasyong pang-authentikasyon:
|
scan_this_image = I-scan ang image na ito gamit ng iyong aplikasyong pang-authentikasyon:
|
||||||
or_enter_secret = O ilagay ang sikreto: %s
|
or_enter_secret = O ilagay ang sikreto: %s
|
||||||
|
@ -1005,8 +1005,8 @@ language.description = Mase-save ang wika sa iyong account at gagamitin bilang d
|
||||||
language.localization_project = Tulungan kaming isalin ang Forgejo sa iyong wika! <a href="%s">Matuto pa</a>.
|
language.localization_project = Tulungan kaming isalin ang Forgejo sa iyong wika! <a href="%s">Matuto pa</a>.
|
||||||
pronouns_custom_label = Mga pasadyang pronoun
|
pronouns_custom_label = Mga pasadyang pronoun
|
||||||
user_block_yourself = Hindi mo maaaring harangan ang sarili mo.
|
user_block_yourself = Hindi mo maaaring harangan ang sarili mo.
|
||||||
change_username_redirect_prompt.with_cooldown.one = Magiging available ang lumang username sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw, maari mo pa ring ma-claim muli ang lumang username sa panahon ng panahon ng cooldown.
|
change_username_redirect_prompt.with_cooldown.one = Magiging available ang lumang username sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw. Maaari mo pa ring ma-claim muli ang lumang username sa panahon ng panahon ng cooldown.
|
||||||
change_username_redirect_prompt.with_cooldown.few = Magiging available ang lumang username sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw, maari mo pa ring ma-claim muli ang lumang username sa panahon ng panahon ng cooldown.
|
change_username_redirect_prompt.with_cooldown.few = Magiging available ang lumang username sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw. Maaari mo pa ring ma-claim muli ang lumang username sa panahon ng panahon ng cooldown.
|
||||||
keep_pronouns_private = Ipakita lang ang mga panghalip sa mga naka-authenticate na user
|
keep_pronouns_private = Ipakita lang ang mga panghalip sa mga naka-authenticate na user
|
||||||
keep_pronouns_private.description = Itatago nito ang iyong mga panghalip mula sa mga bisita na hindi naka-log in.
|
keep_pronouns_private.description = Itatago nito ang iyong mga panghalip mula sa mga bisita na hindi naka-log in.
|
||||||
quota.applies_to_user = Nag-aapply ang mga sumusunod na panuntunan ng quota sa iyong account
|
quota.applies_to_user = Nag-aapply ang mga sumusunod na panuntunan ng quota sa iyong account
|
||||||
|
@ -1034,6 +1034,8 @@ regenerate_token = I-regenerate
|
||||||
access_token_regeneration_desc = Ang pag-regenerate ng token ay babawiin ang access sa iyong account para sa mga application na gumagamit nito. Hindi ito mababawi. Magpatuloy?
|
access_token_regeneration_desc = Ang pag-regenerate ng token ay babawiin ang access sa iyong account para sa mga application na gumagamit nito. Hindi ito mababawi. Magpatuloy?
|
||||||
regenerate_token_success = Na-generate muli ang token. Ang mga application na gumagamit nito ay hindi na maa-access ang iyong account at dapat ma-update gamit ang bagong token.
|
regenerate_token_success = Na-generate muli ang token. Ang mga application na gumagamit nito ay hindi na maa-access ang iyong account at dapat ma-update gamit ang bagong token.
|
||||||
|
|
||||||
|
ssh_token_help_ssh_agent = o, kung gumagamit ka ng SSH agent (na nakatakda ang variable na SSH_AUTH_SOCK):
|
||||||
|
|
||||||
[repo]
|
[repo]
|
||||||
template_description = Ang mga template na repositoryo ay pinapayagan ang mga gumagamit na mag-generate ng mga bagong repositoryo na may magkatulad na istraktura ng direktoryo, mga file, at opsyonal na mga setting.
|
template_description = Ang mga template na repositoryo ay pinapayagan ang mga gumagamit na mag-generate ng mga bagong repositoryo na may magkatulad na istraktura ng direktoryo, mga file, at opsyonal na mga setting.
|
||||||
clone_helper = Kailangan ng tulong sa pagpili? Bisitahin ang <a target="_blank" rel="noopener noreferrer" href="%s">Tulong</a>.
|
clone_helper = Kailangan ng tulong sa pagpili? Bisitahin ang <a target="_blank" rel="noopener noreferrer" href="%s">Tulong</a>.
|
||||||
|
@ -1071,7 +1073,7 @@ readme_helper_desc = Ito ang lugar kung saan makakasulat ka ng kumpletong deskri
|
||||||
trust_model_helper_collaborator_committer = Katulong+Committer: I-trust ang mga signature batay sa mga katulong na tumutugma sa committer
|
trust_model_helper_collaborator_committer = Katulong+Committer: I-trust ang mga signature batay sa mga katulong na tumutugma sa committer
|
||||||
mirror_interval = Interval ng mirror (ang mga wastong unit ng oras ay "h", "m", "s"). 0 para i-disable ang periodic sync. (Pinakamababang interval: %s)
|
mirror_interval = Interval ng mirror (ang mga wastong unit ng oras ay "h", "m", "s"). 0 para i-disable ang periodic sync. (Pinakamababang interval: %s)
|
||||||
transfer.reject_desc = Kanselahin ang pag-transfer mula sa "%s"
|
transfer.reject_desc = Kanselahin ang pag-transfer mula sa "%s"
|
||||||
mirror_lfs_endpoint_desc = Ang sync ay susubukang gamitin ang clone url upang <a target="_blank" rel="noopener noreferrer" href="%s">matukoy ang LFS server</a>. Maari ka rin tumukoy ng isang custom na endpoint kapag ang LFS data ng repositoryo ay nilalagay sa ibang lugar.
|
mirror_lfs_endpoint_desc = Ang sync ay susubukang gamitin ang clone url upang <a target="_blank" rel="noopener noreferrer" href="%s">matukoy ang LFS server</a>. Maaari ka rin tumukoy ng isang custom na endpoint kapag ang LFS data ng repositoryo ay nilalagay sa ibang lugar.
|
||||||
adopt_search = Ilagay ang username para maghanap ng mga unadopted na repositoryo… (iwanang walang laman para hanapin lahat)
|
adopt_search = Ilagay ang username para maghanap ng mga unadopted na repositoryo… (iwanang walang laman para hanapin lahat)
|
||||||
object_format = Format ng object
|
object_format = Format ng object
|
||||||
readme_helper = Pumili ng README file template
|
readme_helper = Pumili ng README file template
|
||||||
|
@ -1164,8 +1166,8 @@ tree_path_not_found_commit = Hindi umiiral ang path na %[1]s sa commit %[2]s
|
||||||
tree_path_not_found_branch = Hindi umiiral ang daanang %[1]s sa branch %[2]s
|
tree_path_not_found_branch = Hindi umiiral ang daanang %[1]s sa branch %[2]s
|
||||||
migrate_items_pullrequests = Mga hiling sa paghila
|
migrate_items_pullrequests = Mga hiling sa paghila
|
||||||
archive.pull.nocomment = Naka-archive ang repositoryong ito. Hindi ka makakakomento sa mga pull request.
|
archive.pull.nocomment = Naka-archive ang repositoryong ito. Hindi ka makakakomento sa mga pull request.
|
||||||
archive.title = Naka-archive ang repositoryong ito. Maari mong itignan ang mga file at i-clone ito, pero hindi ka makakagawa ng anumang pagbabago sa estado ito, tulad ng pagtulak at paggawa ng mga isyu, pull request o mga komento.
|
archive.title = Naka-archive ang repositoryong ito. Maaari mong itignan ang mga file at i-clone ito, pero hindi ka makakagawa ng anumang pagbabago sa estado ito, tulad ng pagtulak at paggawa ng mga isyu, pull request o mga komento.
|
||||||
archive.title_date = Naka-archive ang repositoryo na ito noong %s. Maari mong itignan ang mga file at i-clone ito, pero hindi ka makakagawa ng anumang pagbabago sa estado nito, tulad ng pagtulak o paggawa ng mga bagong isyu, mga pull request, o komento.
|
archive.title_date = Naka-archive ang repositoryo na ito noong %s. Maaari mong itignan ang mga file at i-clone ito, pero hindi ka makakagawa ng anumang pagbabago sa estado nito, tulad ng pagtulak o paggawa ng mga bagong isyu, mga pull request, o komento.
|
||||||
pulls = Mga hiling sa paghila
|
pulls = Mga hiling sa paghila
|
||||||
activity.merged_prs_count_n = Mga naisamang hiling sa paghila
|
activity.merged_prs_count_n = Mga naisamang hiling sa paghila
|
||||||
wiki.last_updated = Huling binago %s
|
wiki.last_updated = Huling binago %s
|
||||||
|
@ -1183,7 +1185,7 @@ issues.action_open = Buksan
|
||||||
issues.closed_title = Sarado
|
issues.closed_title = Sarado
|
||||||
issues.reopen_issue = Buksang muli
|
issues.reopen_issue = Buksang muli
|
||||||
pulls.merged = Naisama na
|
pulls.merged = Naisama na
|
||||||
pulls.merged_info_text = Maari nang burahin ang branch %s.
|
pulls.merged_info_text = Maaari nang burahin ang branch %s.
|
||||||
milestones.update_ago = Binago %s
|
milestones.update_ago = Binago %s
|
||||||
activity.closed_issue_label = Sarado
|
activity.closed_issue_label = Sarado
|
||||||
activity.merged_prs_label = Naisama
|
activity.merged_prs_label = Naisama
|
||||||
|
@ -1205,7 +1207,7 @@ migrate.clone_address_desc = Ang HTTP(S) o Git "clone" URL ng umiiral na reposit
|
||||||
need_auth = Awtorisasyon
|
need_auth = Awtorisasyon
|
||||||
migrate.github_token_desc = Maaari kang maglagay ng isa o higit pang mga token na hinihiwalay ng kuwit dito upang gawing mas-mabilis ang pagmigrate dahil sa rate limit ng GitHub API. BABALA: Ang pagabuso ng feature na ito ay maaaring maglabag sa patakaran ng tagapagbigay ng serbisyo at maaaring magdulot ng pag-block ng account.
|
migrate.github_token_desc = Maaari kang maglagay ng isa o higit pang mga token na hinihiwalay ng kuwit dito upang gawing mas-mabilis ang pagmigrate dahil sa rate limit ng GitHub API. BABALA: Ang pagabuso ng feature na ito ay maaaring maglabag sa patakaran ng tagapagbigay ng serbisyo at maaaring magdulot ng pag-block ng account.
|
||||||
template.invalid = Kailangang pumili ng kahit isang template na repositoryo
|
template.invalid = Kailangang pumili ng kahit isang template na repositoryo
|
||||||
migrate_options_lfs_endpoint.description = Susubukan ng migration na gamitin ang iyong Git remote upang <a target="_blank" rel="noopener noreferrer" href="%s">matukoy ang LFS server</a>. Maari mong magtiyak ng custom na endpoint kapag ang LFS data ng repositoryo ay nakalagay sa ibang lugar.
|
migrate_options_lfs_endpoint.description = Susubukan ng migration na gamitin ang iyong Git remote upang <a target="_blank" rel="noopener noreferrer" href="%s">matukoy ang LFS server</a>. Maaari mong magtiyak ng custom na endpoint kapag ang LFS data ng repositoryo ay nakalagay sa ibang lugar.
|
||||||
blame.ignore_revs.failed = Nabigong hindi pansinin ang mga rebisyon sa <a href="%s">.git-blame-ignore-revs</a>.
|
blame.ignore_revs.failed = Nabigong hindi pansinin ang mga rebisyon sa <a href="%s">.git-blame-ignore-revs</a>.
|
||||||
tree_path_not_found_tag = Hindi umiiral ang path na %[1]s sa tag %[2]s
|
tree_path_not_found_tag = Hindi umiiral ang path na %[1]s sa tag %[2]s
|
||||||
form.reach_limit_of_creation_n = Naabot na ng may-ari ang limitasyon na %d mga repositoryo.
|
form.reach_limit_of_creation_n = Naabot na ng may-ari ang limitasyon na %d mga repositoryo.
|
||||||
|
@ -1471,10 +1473,10 @@ activity.new_issue_label = Nabuksan
|
||||||
activity.merged_prs_count_1 = Naisamang hiling sa paghila
|
activity.merged_prs_count_1 = Naisamang hiling sa paghila
|
||||||
activity.opened_prs_count_1 = Inimungkahing hiling sa paghila
|
activity.opened_prs_count_1 = Inimungkahing hiling sa paghila
|
||||||
activity.opened_prs_label = Inimungkahi
|
activity.opened_prs_label = Inimungkahi
|
||||||
pulls.reopened_at = `nabuksang muli ang hiling sa paghatak na <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
pulls.reopened_at = `binuksan muli ang hiling sa paghila %s`
|
||||||
issues.opened_by_fake = binuksan ang %[1]s ni/ng %[2]s
|
issues.opened_by_fake = binuksan ang %[1]s ni/ng %[2]s
|
||||||
pulls.reopen_failed.base_branch = Hindi mabuksang muli ang hiling sa paghatak na ito dahil hindi na umiiral ang base branch.
|
pulls.reopen_failed.base_branch = Hindi mabuksang muli ang hiling sa paghatak na ito dahil hindi na umiiral ang base branch.
|
||||||
issues.reopened_at = `binuksang muli ang isyung ito <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.reopened_at = `binuksang muli ang isyung ito %s`
|
||||||
pulls.reopen_failed.head_branch = Hindi mabubuksan muli ang hiling sa paghila, dahil hindi na umiiral ang head branch.
|
pulls.reopen_failed.head_branch = Hindi mabubuksan muli ang hiling sa paghila, dahil hindi na umiiral ang head branch.
|
||||||
settings.event_pull_request_desc = Binuksan, sinara, muling binuksan, o binago ang hiling sa paghatak.
|
settings.event_pull_request_desc = Binuksan, sinara, muling binuksan, o binago ang hiling sa paghatak.
|
||||||
activity.opened_prs_count_n = Mga inimungkahing hiling sa paghila
|
activity.opened_prs_count_n = Mga inimungkahing hiling sa paghila
|
||||||
|
@ -1500,7 +1502,7 @@ issues.content_history.created = ginawa
|
||||||
editor.patching = Pina-patch:
|
editor.patching = Pina-patch:
|
||||||
editor.fail_to_apply_patch = Hindi malapat ang patch na "%s"
|
editor.fail_to_apply_patch = Hindi malapat ang patch na "%s"
|
||||||
settings.danger_zone = Mapanganib na lugar
|
settings.danger_zone = Mapanganib na lugar
|
||||||
issues.closed_at = `isinara ang isyung ito <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.closed_at = `isinara ang isyung ito %s`
|
||||||
settings.collaboration.admin = Tagapangasiwa
|
settings.collaboration.admin = Tagapangasiwa
|
||||||
settings.admin_settings = Mga setting ng tagapangasiwa
|
settings.admin_settings = Mga setting ng tagapangasiwa
|
||||||
issues.start_tracking_history = `sinimulan ang trabaho %s`
|
issues.start_tracking_history = `sinimulan ang trabaho %s`
|
||||||
|
@ -1627,7 +1629,7 @@ projects.column.edit_title = Pangalan
|
||||||
projects.column.new_title = Pangalan
|
projects.column.new_title = Pangalan
|
||||||
projects.card_type.desc = Mga preview ng card
|
projects.card_type.desc = Mga preview ng card
|
||||||
commits.desc = I-browse ang history ng pagbabago ng source code.
|
commits.desc = I-browse ang history ng pagbabago ng source code.
|
||||||
commits.search.tooltip = Maari kang mag-prefix ng mga keyword gamit ang "author:", "committer:", "after:", o "before:", hal. "revert author:Nijika before:2022-10-09".
|
commits.search.tooltip = Maaari kang mag-prefix ng mga keyword gamit ang "author:", "committer:", "after:", o "before:", hal. "revert author:Nijika before:2022-10-09".
|
||||||
issues.force_push_codes = `puwersahang itinulak ang %[1]s mula <a class="%[7]s" href="%[3]s"><code>%[2]s</code></a> sa <a class="%[7]s" href="%[5]s"><code>%[4]s</code></a> %[6]s`
|
issues.force_push_codes = `puwersahang itinulak ang %[1]s mula <a class="%[7]s" href="%[3]s"><code>%[2]s</code></a> sa <a class="%[7]s" href="%[5]s"><code>%[4]s</code></a> %[6]s`
|
||||||
issues.push_commit_1 = idinagdag ang %d commit %s
|
issues.push_commit_1 = idinagdag ang %d commit %s
|
||||||
issues.push_commits_n = idinagdag ang %d mga commit %s
|
issues.push_commits_n = idinagdag ang %d mga commit %s
|
||||||
|
@ -1707,7 +1709,7 @@ issues.action_milestone = Milestone
|
||||||
issues.action_milestone_no_select = Walang milestone
|
issues.action_milestone_no_select = Walang milestone
|
||||||
issues.delete_branch_at = `binura ang branch na <b>%s</b> %s`
|
issues.delete_branch_at = `binura ang branch na <b>%s</b> %s`
|
||||||
issues.filter_label = Label
|
issues.filter_label = Label
|
||||||
issues.filter_label_exclude = `Gamitin ang <code>alt</code> + <code>click/enter</code> para hindi isama ang mga label`
|
issues.filter_label_exclude = `Gamitin ang <kbd>Alt</kbd> + <kbd>Click</kbd> para hindi isama ang mga label`
|
||||||
issues.filter_label_no_select = Lahat ng mga label
|
issues.filter_label_no_select = Lahat ng mga label
|
||||||
issues.filter_milestone_closed = Mga nakasarang milestone
|
issues.filter_milestone_closed = Mga nakasarang milestone
|
||||||
issues.filter_assignee = Mangangasiwa
|
issues.filter_assignee = Mangangasiwa
|
||||||
|
@ -1771,7 +1773,7 @@ issues.lock = I-lock ang usapan
|
||||||
issues.unlock = I-unlock ang usapan
|
issues.unlock = I-unlock ang usapan
|
||||||
issues.unlock_comment = na-unlock ang usapang ito %s
|
issues.unlock_comment = na-unlock ang usapang ito %s
|
||||||
issues.unlock.notice_1 = - Makakakomento muli ang lahat ng mga tao sa isyung ito.
|
issues.unlock.notice_1 = - Makakakomento muli ang lahat ng mga tao sa isyung ito.
|
||||||
issues.unlock.notice_2 = - Maari mong i-lock muli ang isyung ito sa hinaharap.
|
issues.unlock.notice_2 = - Maaari mong i-lock muli ang isyung ito sa hinaharap.
|
||||||
issues.comment_on_locked = Hindi ka makakakomento sa naka-lock na isyu.
|
issues.comment_on_locked = Hindi ka makakakomento sa naka-lock na isyu.
|
||||||
issues.closed_by_fake = ni/ng %[2]s ay isinara %[1]s
|
issues.closed_by_fake = ni/ng %[2]s ay isinara %[1]s
|
||||||
issues.comment_manually_pull_merged_at = manwal na isinama ang commit %[1]s sa %[2]s %[3]s
|
issues.comment_manually_pull_merged_at = manwal na isinama ang commit %[1]s sa %[2]s %[3]s
|
||||||
|
@ -1787,10 +1789,10 @@ issues.label_archive_tooltip = Ang mga naka-archive na label ay hindi isasama bi
|
||||||
issues.is_stale = May mga pagbabago sa PR na ito mula sa pagsuri na ito
|
issues.is_stale = May mga pagbabago sa PR na ito mula sa pagsuri na ito
|
||||||
issues.role.first_time_contributor = Unang-beses na contributor
|
issues.role.first_time_contributor = Unang-beses na contributor
|
||||||
issues.lock.notice_1 = - Hindi makakadagdag ng mga bagong komento ang mga ibang user sa isyu na ito.
|
issues.lock.notice_1 = - Hindi makakadagdag ng mga bagong komento ang mga ibang user sa isyu na ito.
|
||||||
issues.lock.notice_3 = - Maari mong i-unlock muli ang isyung ito sa hinaharap.
|
issues.lock.notice_3 = - Maaari mong i-unlock muli ang isyung ito sa hinaharap.
|
||||||
issues.label_deletion_desc = Ang pagbura ng label ay tatanggalin ito sa lahat ng mga isyu. Magpatuloy?
|
issues.label_deletion_desc = Ang pagbura ng label ay tatanggalin ito sa lahat ng mga isyu. Magpatuloy?
|
||||||
issues.commit_ref_at = `isinangguni ang isyu na ito mula sa commit <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.commit_ref_at = `isinangguni ang isyu na ito mula sa commit %s`
|
||||||
issues.ref_issue_from = `<a href="%[3]s">isinangguni ang isyu na ito sa %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.ref_issue_from = `<a href="%[2]s">isinangguni ang isyu na ito sa %[3]s</a> %[1]s`
|
||||||
issues.num_participants_one = %d kasali
|
issues.num_participants_one = %d kasali
|
||||||
issues.attachment.download = `I-click para i-download ang "%s" `
|
issues.attachment.download = `I-click para i-download ang "%s" `
|
||||||
issues.num_participants_few = %d mga kasali
|
issues.num_participants_few = %d mga kasali
|
||||||
|
@ -1815,10 +1817,10 @@ issues.sign_in_require_desc = <a href="%s">Mag-sign in</a> upang sumali sa usapa
|
||||||
issues.num_comments = %d mga komento
|
issues.num_comments = %d mga komento
|
||||||
issues.role.contributor_helper = Nakaraang nag-commit ang user na ito sa repositoryo na ito.
|
issues.role.contributor_helper = Nakaraang nag-commit ang user na ito sa repositoryo na ito.
|
||||||
issues.comment_pull_merged_at = isinama ang commit %[1]s sa %[2]s %[3]s
|
issues.comment_pull_merged_at = isinama ang commit %[1]s sa %[2]s %[3]s
|
||||||
pulls.commit_ref_at = `isinangguni ang hiling sa paghila mula sa isang commit <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
pulls.commit_ref_at = `isinangguni ang hiling sa paghila mula sa isang commit %s`
|
||||||
wiki.last_commit_info = Binago ni %s ang pahinang ito %s
|
wiki.last_commit_info = Binago ni %s ang pahinang ito %s
|
||||||
issues.content_history.edited = binago
|
issues.content_history.edited = binago
|
||||||
issues.ref_pull_from = `<a href="%[3]s">isinangguni ang hiling sa paghila na ito %[4]s </a><a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.ref_pull_from = `<a href="%[2]s">isinangguni ang hiling sa paghila na ito %[3]s</a> %[1]s`
|
||||||
pulls.merged_title_desc_few = isinali ang %[1]d mga commit mula sa <code>%[2]s</code> patungong <code>%[3]s</code> %[4]s
|
pulls.merged_title_desc_few = isinali ang %[1]d mga commit mula sa <code>%[2]s</code> patungong <code>%[3]s</code> %[4]s
|
||||||
settings.org_not_allowed_to_be_collaborator = Hindi maaaring idagdag ang mga organisasyon bilang tagatulong.
|
settings.org_not_allowed_to_be_collaborator = Hindi maaaring idagdag ang mga organisasyon bilang tagatulong.
|
||||||
settings.add_collaborator_success = Naidagdag ang tagatulong.
|
settings.add_collaborator_success = Naidagdag ang tagatulong.
|
||||||
|
@ -1828,7 +1830,7 @@ pulls.create = Gumawa ng hiling sa paghila
|
||||||
issues.dependency.pr_close_blocked = Kailangan mong isara ang lahat ng mga isyu na humaharang sa hiling sa paghila na ito bago mo ito isama.
|
issues.dependency.pr_close_blocked = Kailangan mong isara ang lahat ng mga isyu na humaharang sa hiling sa paghila na ito bago mo ito isama.
|
||||||
pulls.delete.title = Burahin ang hiling sa paghila na ito?
|
pulls.delete.title = Burahin ang hiling sa paghila na ito?
|
||||||
issues.dependency.pr_closing_blockedby = Hinarang ng mga sumusunod na isyu mula sa pagsara ng hiling sa paghila na ito
|
issues.dependency.pr_closing_blockedby = Hinarang ng mga sumusunod na isyu mula sa pagsara ng hiling sa paghila na ito
|
||||||
pulls.closed_at = `isinara ang hiling sa paghila na <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
pulls.closed_at = `isinara ang hiling sa paghila na ito %s`
|
||||||
pulls.close = Isara ang hiling sa paghila
|
pulls.close = Isara ang hiling sa paghila
|
||||||
pulls.cmd_instruction_hint = Tingnan ang mga panuto para sa command line
|
pulls.cmd_instruction_hint = Tingnan ang mga panuto para sa command line
|
||||||
project = Mga proyekto
|
project = Mga proyekto
|
||||||
|
@ -1836,8 +1838,8 @@ issues.content_history.deleted = binura
|
||||||
pulls.no_results = Walang mga nahanap na resulta.
|
pulls.no_results = Walang mga nahanap na resulta.
|
||||||
pulls.closed = Sarado ang hiling sa paghila
|
pulls.closed = Sarado ang hiling sa paghila
|
||||||
pulls.is_closed = Naisara na ang hiling sa paghila.
|
pulls.is_closed = Naisara na ang hiling sa paghila.
|
||||||
issues.ref_closing_from = `<a href="%[3]s">nagsangguni ang isyu mula sa hiling sa paghila %[4]s na magsasara sa isyu</a>, <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.ref_closing_from = `<a href="%[2]s">nagsangguni ang isyu mula sa hiling sa paghila %[3]s na magsasara sa isyu</a>, %[1]s`
|
||||||
issues.ref_reopening_from = `<a href="%[3]s">nagsangguni ang isyu na ito mula sa hiling sa paghila %[4]s na muling bubukas</a>, <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.ref_reopening_from = `<a href="%[2]s">nagsangguni ang isyu na ito mula sa hiling sa paghila %[3]s na muling bubukas nito</a>, %[1]s`
|
||||||
issues.ref_closed_from = `<a href="%[3]s">isinara ang isyung ito %[4]s</a><a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
issues.ref_closed_from = `<a href="%[3]s">isinara ang isyung ito %[4]s</a><a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||||
issues.review.wait = hiniling sa pagsuri %s
|
issues.review.wait = hiniling sa pagsuri %s
|
||||||
issues.review.reject = hinihiling ang mga pagbago %s
|
issues.review.reject = hinihiling ang mga pagbago %s
|
||||||
|
@ -2015,14 +2017,14 @@ wiki.cancel = Kanselahin
|
||||||
settings.collaboration.undefined = Hindi Natukoy
|
settings.collaboration.undefined = Hindi Natukoy
|
||||||
settings.federation_settings = Mga Setting ng Federation
|
settings.federation_settings = Mga Setting ng Federation
|
||||||
settings = Mga Setting
|
settings = Mga Setting
|
||||||
settings.desc = Ang mga setting ang lugar kung saan maari mong ipamahala ang mga setting para sa repositoryo
|
settings.desc = Ang mga setting ang lugar kung saan maaari mong ipamahala ang mga setting para sa repositoryo
|
||||||
pulls.collapse_files = I-collapse ang lahat ng mga file
|
pulls.collapse_files = I-collapse ang lahat ng mga file
|
||||||
pulls.add_prefix = Magdagdag ng <strong>%s</strong> na prefix
|
pulls.add_prefix = Magdagdag ng <strong>%s</strong> na prefix
|
||||||
pulls.still_in_progress = Ginagawa pa?
|
pulls.still_in_progress = Ginagawa pa?
|
||||||
activity.title.prs_1 = %d hiling sa paghila
|
activity.title.prs_1 = %d hiling sa paghila
|
||||||
activity.active_issues_count_n = <strong>%d</strong> mga aktibong isyu
|
activity.active_issues_count_n = <strong>%d</strong> mga aktibong isyu
|
||||||
pulls.required_status_check_missing = Nawawala ang ilang mga kinakailangang pagsusuri.
|
pulls.required_status_check_missing = Nawawala ang ilang mga kinakailangang pagsusuri.
|
||||||
pulls.required_status_check_administrator = Bilang tagapangasiwa, maari mo pa ring isama ang hiling sa paghila na ito.
|
pulls.required_status_check_administrator = Bilang tagapangasiwa, maaari mo pa ring isama ang hiling sa paghila na ito.
|
||||||
pulls.blocked_by_approvals = Wala pang sapat na pag-apruba ang hiling sa paghila na ito. %d ng %d na pag-apruba ang ibinigay.
|
pulls.blocked_by_approvals = Wala pang sapat na pag-apruba ang hiling sa paghila na ito. %d ng %d na pag-apruba ang ibinigay.
|
||||||
settings.options = Repositoryo
|
settings.options = Repositoryo
|
||||||
wiki.back_to_wiki = Bumalik sa pahina ng wiki
|
wiki.back_to_wiki = Bumalik sa pahina ng wiki
|
||||||
|
@ -2110,7 +2112,7 @@ settings.actions_desc = I-enable ang mga kasamang CI/CD pipeline gamit ang Forge
|
||||||
settings.admin_indexer_commit_sha = Huling na-index na commit
|
settings.admin_indexer_commit_sha = Huling na-index na commit
|
||||||
settings.admin_indexer_unindexed = Hindi naka-index
|
settings.admin_indexer_unindexed = Hindi naka-index
|
||||||
settings.transfer_notices_3 = - Kung pribado ang repositoryo at ilipat sa isang indibidwal na user, ang aksyon na ito ay sinisigurado na ang user ay may pahintulot na basahin (at palitan ang mga pahintulot kung kailangan).
|
settings.transfer_notices_3 = - Kung pribado ang repositoryo at ilipat sa isang indibidwal na user, ang aksyon na ito ay sinisigurado na ang user ay may pahintulot na basahin (at palitan ang mga pahintulot kung kailangan).
|
||||||
settings.convert_desc = Maari mong i-convert ang repositoryo na ito sa regular na repositoryo. Hindi ito mababawi.
|
settings.convert_desc = Maaari mong i-convert ang repositoryo na ito sa regular na repositoryo. Hindi ito mababawi.
|
||||||
settings.transfer.button = Ilipat ang pagmamay-ari
|
settings.transfer.button = Ilipat ang pagmamay-ari
|
||||||
settings.signing_settings = Mga setting sa pagpapatunay ng pag-sign
|
settings.signing_settings = Mga setting sa pagpapatunay ng pag-sign
|
||||||
settings.admin_enable_close_issues_via_commit_in_any_branch = Isara ang isyu sa pamamagitan ng commit na ginawa sa hindi default na branch
|
settings.admin_enable_close_issues_via_commit_in_any_branch = Isara ang isyu sa pamamagitan ng commit na ginawa sa hindi default na branch
|
||||||
|
@ -2137,7 +2139,7 @@ settings.deploy_key_deletion = Tanggalin ang deploy key
|
||||||
settings.protect_enable_push = I-enable ang pagtulak
|
settings.protect_enable_push = I-enable ang pagtulak
|
||||||
settings.discord_icon_url.exceeds_max_length = Kailangang bababa o equal sa 2048 characters ang URL ng icon
|
settings.discord_icon_url.exceeds_max_length = Kailangang bababa o equal sa 2048 characters ang URL ng icon
|
||||||
settings.protected_branch.save_rule = I-save ang rule
|
settings.protected_branch.save_rule = I-save ang rule
|
||||||
settings.mirror_settings.docs.can_still_use = Bagama't na hindi ka makakabago ng mga umiiral na mirror o gumawa ng bago, maari mo pa rin gamitin ang iyong umiiral na mirror.
|
settings.mirror_settings.docs.can_still_use = Bagama't na hindi ka makakabago ng mga umiiral na mirror o gumawa ng bago, maaari mo pa rin gamitin ang iyong umiiral na mirror.
|
||||||
settings.slack_color = Kulay
|
settings.slack_color = Kulay
|
||||||
settings.discord_icon_url = URL ng icon
|
settings.discord_icon_url = URL ng icon
|
||||||
settings.convert_fork_confirm = I-convert ang repositoryo
|
settings.convert_fork_confirm = I-convert ang repositoryo
|
||||||
|
@ -2254,7 +2256,7 @@ settings.pulls.allow_rebase_update = I-enable ang pag-update ng hiling sa paghil
|
||||||
settings.admin_enable_health_check = I-enable ang pagsusuri ng kalusugan ng repositoryo (git fsck)
|
settings.admin_enable_health_check = I-enable ang pagsusuri ng kalusugan ng repositoryo (git fsck)
|
||||||
settings.new_owner_has_same_repo = Ang bagong may-ari ay may repositoryo na may katulad na pangalan. Mangyaring pumili ng ibang pangalan.
|
settings.new_owner_has_same_repo = Ang bagong may-ari ay may repositoryo na may katulad na pangalan. Mangyaring pumili ng ibang pangalan.
|
||||||
settings.convert = I-convert sa regular na repositoryo
|
settings.convert = I-convert sa regular na repositoryo
|
||||||
settings.convert_fork_desc = Maari mong i-convert ang fork na ito bilang regular na repositoryo. Hindi ito mababawi.
|
settings.convert_fork_desc = Maaari mong i-convert ang fork na ito bilang regular na repositoryo. Hindi ito mababawi.
|
||||||
settings.convert_fork_notices_1 = Ang operasyon na ito ay ico-convert ang fork bilang regular na repositoryo at hindi mababawi.
|
settings.convert_fork_notices_1 = Ang operasyon na ito ay ico-convert ang fork bilang regular na repositoryo at hindi mababawi.
|
||||||
settings.transfer_abort_invalid = Hindi mo makakansela ang isang hindi umiiral na paglipat ng repositoryo.
|
settings.transfer_abort_invalid = Hindi mo makakansela ang isang hindi umiiral na paglipat ng repositoryo.
|
||||||
settings.transfer_quota_exceeded = Ang bagong may-ari (%s) ay lumalagpas sa quota. Hindi nailipat ang repositoryo.
|
settings.transfer_quota_exceeded = Ang bagong may-ari (%s) ay lumalagpas sa quota. Hindi nailipat ang repositoryo.
|
||||||
|
@ -2290,8 +2292,8 @@ settings.webhook.headers = Mga header
|
||||||
settings.webhook.payload = Nilalaman
|
settings.webhook.payload = Nilalaman
|
||||||
settings.webhook.body = Katawan
|
settings.webhook.body = Katawan
|
||||||
settings.webhook.replay.description = I-replay ang webhook na ito.
|
settings.webhook.replay.description = I-replay ang webhook na ito.
|
||||||
settings.webhook.delivery.success = May nadagdag na event sa delivery queue. Maari magtagal ng ilang segundo bago makita sa delivery history.
|
settings.webhook.delivery.success = May nadagdag na event sa delivery queue. Maaari magtagal ng ilang segundo bago makita sa delivery history.
|
||||||
settings.githooks_desc = Pinapagana ng Git ang mga Git hook. Maari mong baguhin ang mga hook file sa ibaba para mag-set up ng mga custom na operasyon.
|
settings.githooks_desc = Pinapagana ng Git ang mga Git hook. Maaari mong baguhin ang mga hook file sa ibaba para mag-set up ng mga custom na operasyon.
|
||||||
settings.githook_name = Pangalan ng hook
|
settings.githook_name = Pangalan ng hook
|
||||||
settings.githook_content = Nilalaman ng hook
|
settings.githook_content = Nilalaman ng hook
|
||||||
settings.update_githook = I-update ang hook
|
settings.update_githook = I-update ang hook
|
||||||
|
@ -2362,7 +2364,7 @@ settings.mirror_settings.docs.pull_mirror_instructions = Para mag-set up ng pull
|
||||||
milestones.invalid_due_date_format = Kailangang "yyyy-mm-dd" na format ang takdang petsa.
|
milestones.invalid_due_date_format = Kailangang "yyyy-mm-dd" na format ang takdang petsa.
|
||||||
signing.wont_sign.nokey = Walang key ang instansya na ito para i-sign ang commit na ito.
|
signing.wont_sign.nokey = Walang key ang instansya na ito para i-sign ang commit na ito.
|
||||||
activity.title.releases_1 = %d paglabas
|
activity.title.releases_1 = %d paglabas
|
||||||
settings.mirror_settings.docs.more_information_if_disabled = Maari kang matuto pa tungkol sa mga push at pull na mirror dito:
|
settings.mirror_settings.docs.more_information_if_disabled = Maaari kang matuto pa tungkol sa mga push at pull na mirror dito:
|
||||||
settings.branches.switch_default_branch = Magpalit ng default branch
|
settings.branches.switch_default_branch = Magpalit ng default branch
|
||||||
settings.convert_notices_1 = Ang operasyon na ito ay ico-covert ang mirror sa regular na repositoryo at hindi mababawi.
|
settings.convert_notices_1 = Ang operasyon na ito ay ico-covert ang mirror sa regular na repositoryo at hindi mababawi.
|
||||||
settings.convert_fork_succeed = Na-convert na ang fork sa regular na repositoryo.
|
settings.convert_fork_succeed = Na-convert na ang fork sa regular na repositoryo.
|
||||||
|
@ -2732,7 +2734,7 @@ settings.protect_protected_file_patterns = Mga pattern ng nakaprotektang file (h
|
||||||
settings.update_protect_branch_success = Binago na ang branch protection rule na "%s".
|
settings.update_protect_branch_success = Binago na ang branch protection rule na "%s".
|
||||||
settings.remove_protected_branch_success = Tinanggal ang branch protection rule na "%s".
|
settings.remove_protected_branch_success = Tinanggal ang branch protection rule na "%s".
|
||||||
settings.tags.protection.pattern = Pattern ng tag
|
settings.tags.protection.pattern = Pattern ng tag
|
||||||
settings.tags.protection.pattern.description = Maari kang gumamit ng iisang pangalan o glob pattern o regular expression para magtugma ng maraming tag. Magbasa pa sa <a target="_blank" rel="noopener" href="%s">guide ng mga nakaprotektang tag</a>.
|
settings.tags.protection.pattern.description = Maaari kang gumamit ng iisang pangalan o glob pattern o regular expression para magtugma ng maraming tag. Magbasa pa sa <a target="_blank" rel="noopener" href="%s">guide ng mga nakaprotektang tag</a>.
|
||||||
settings.thread_id = ID ng thread
|
settings.thread_id = ID ng thread
|
||||||
settings.matrix.room_id = ID ng room
|
settings.matrix.room_id = ID ng room
|
||||||
diff.has_escaped = May mga nakatagong Unicode character ang linya na ito
|
diff.has_escaped = May mga nakatagong Unicode character ang linya na ito
|
||||||
|
@ -2746,7 +2748,7 @@ diff.bin = BIN
|
||||||
settings.default_update_style_desc = Ang default na istilio na gagamitin sa pag-update ng mga hiling sa paghila na nalilipas sa base branch.
|
settings.default_update_style_desc = Ang default na istilio na gagamitin sa pag-update ng mga hiling sa paghila na nalilipas sa base branch.
|
||||||
pulls.sign_in_require = <a href="%s">Mag-sign in</a> para gumawa ng bagong hiling sa paghila.
|
pulls.sign_in_require = <a href="%s">Mag-sign in</a> para gumawa ng bagong hiling sa paghila.
|
||||||
new_from_template = Gumamit ng template
|
new_from_template = Gumamit ng template
|
||||||
new_from_template_description = Maari kang pumili ng umiiral na repository template sa instansya na ito at i-apply ang mga setting nito.
|
new_from_template_description = Maaari kang pumili ng umiiral na repository template sa instansya na ito at i-apply ang mga setting nito.
|
||||||
new_advanced = Mga advanced na setting
|
new_advanced = Mga advanced na setting
|
||||||
new_advanced_expand = I-click para i-expand
|
new_advanced_expand = I-click para i-expand
|
||||||
auto_init_description = Simulan ang kasaysayan ng Git gamit ang README at opsyonal na magdagdag ng mga lisensya at .gitignore na file.
|
auto_init_description = Simulan ang kasaysayan ng Git gamit ang README at opsyonal na magdagdag ng mga lisensya at .gitignore na file.
|
||||||
|
@ -2780,6 +2782,7 @@ settings.event_action_recover = I-recover
|
||||||
settings.event_action_success = Matagumpay
|
settings.event_action_success = Matagumpay
|
||||||
settings.event_action_success_desc = Matagumpay na natapos ang Action Run.
|
settings.event_action_success_desc = Matagumpay na natapos ang Action Run.
|
||||||
settings.event_action_recover_desc = Matagumpay na natapos ang Action Run pagkatapos na nabigo ang huling Action Run sa katulad na workflow.
|
settings.event_action_recover_desc = Matagumpay na natapos ang Action Run pagkatapos na nabigo ang huling Action Run sa katulad na workflow.
|
||||||
|
issues.filter_type.all_pull_requests = Lahat ng mga hiling sa paghila
|
||||||
|
|
||||||
[search]
|
[search]
|
||||||
commit_kind = Maghanap ng mga commit…
|
commit_kind = Maghanap ng mga commit…
|
||||||
|
@ -3205,7 +3208,7 @@ self_check.database_collation_mismatch = Inaasahan ang database na gamitin ang c
|
||||||
auths.oauth2_admin_group = Group claim value para sa mga tagapangasiwa. (Opsyonal - kinakailangan ang claim name sa itaas)
|
auths.oauth2_admin_group = Group claim value para sa mga tagapangasiwa. (Opsyonal - kinakailangan ang claim name sa itaas)
|
||||||
auths.tip.facebook = Magrehistro ng bagong application sa %s at idagdag ang produktong "Facebook Login"
|
auths.tip.facebook = Magrehistro ng bagong application sa %s at idagdag ang produktong "Facebook Login"
|
||||||
users.restricted.description = Payagan lamang ang interaksyon sa mga repositoryo at organisasyon kung saan ang user ay dinagdag bilang tagatulong. Iniiwasan nito ang pag-access sa publikong repositoryo sa instansya na ito.
|
users.restricted.description = Payagan lamang ang interaksyon sa mga repositoryo at organisasyon kung saan ang user ay dinagdag bilang tagatulong. Iniiwasan nito ang pag-access sa publikong repositoryo sa instansya na ito.
|
||||||
users.local_import.description = Payagan ang pag-import ng mga repositoryo mula sa local file system ng user. Maari itong maging isyu sa seguridad.
|
users.local_import.description = Payagan ang pag-import ng mga repositoryo mula sa local file system ng user. Maaari itong maging isyu sa seguridad.
|
||||||
emails.delete = Burahin ang Email
|
emails.delete = Burahin ang Email
|
||||||
emails.deletion_success = Binura na ang email address.
|
emails.deletion_success = Binura na ang email address.
|
||||||
auths.oauth2_required_claim_value = Kinakailangan na claim value
|
auths.oauth2_required_claim_value = Kinakailangan na claim value
|
||||||
|
@ -3450,8 +3453,8 @@ teams.owners_permission_desc = Ang mga owner ay may punong access sa <strong>lah
|
||||||
teams.add_nonexistent_repo = Hindi pa umiiral ang repositoryo na sinusubukan mong idagdag. Mangyaring gawin iyan muna.
|
teams.add_nonexistent_repo = Hindi pa umiiral ang repositoryo na sinusubukan mong idagdag. Mangyaring gawin iyan muna.
|
||||||
teams.all_repositories = Lahat ng mga repositoryo
|
teams.all_repositories = Lahat ng mga repositoryo
|
||||||
teams.all_repositories_helper = Ang koponan ay may access sa lahat ng mga repositoryo. Ang pagpili nito ay <strong>idadagdag ang lahat ng mga umiiral</strong> na repositoryo sa koponan.
|
teams.all_repositories_helper = Ang koponan ay may access sa lahat ng mga repositoryo. Ang pagpili nito ay <strong>idadagdag ang lahat ng mga umiiral</strong> na repositoryo sa koponan.
|
||||||
settings.change_orgname_redirect_prompt.with_cooldown.few = Magiging available ang lumang pangalan ng organisasyon sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw, maari mo pa ring ma-claim muli ang lumang pangalan sa panahon ng cooldown.
|
settings.change_orgname_redirect_prompt.with_cooldown.few = Magiging available ang lumang pangalan ng organisasyon sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw. Maaari mo pa ring ma-claim muli ang lumang pangalan sa panahon ng cooldown.
|
||||||
settings.change_orgname_redirect_prompt.with_cooldown.one = Magiging available ang lumang pangalan ng organisasyon sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw, maari mo pa ring ma-claim muli ang lumang pangalan ng panahon ng cooldown.
|
settings.change_orgname_redirect_prompt.with_cooldown.one = Magiging available ang lumang pangalan ng organisasyon sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw. Maaari mo pa ring ma-claim muli ang lumang pangalan ng panahon ng cooldown.
|
||||||
|
|
||||||
|
|
||||||
[packages]
|
[packages]
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue